diff --git a/1_Three.js.zip b/1_Three.js.zip deleted file mode 100644 index b91f0c0e0ac54ba117254c389274e127272a92a0..0000000000000000000000000000000000000000 Binary files a/1_Three.js.zip and /dev/null differ diff --git a/1_Three.js/1_Scene and Camera/main.js b/1_Three.js/1_Scene and Camera/main.js new file mode 100755 index 0000000000000000000000000000000000000000..0cdede3dd08c0a6d7f6cdb8d3ef555ab662bf708 --- /dev/null +++ b/1_Three.js/1_Scene and Camera/main.js @@ -0,0 +1,71 @@ +function init() { + var scene = new THREE.Scene(); + + //////////2//////////// + // var box = getBox(1, 1, 1); + // box.position.y = box.geometry.parameters.height/2; + // scene.add(box); + ////////////////////// + + //////////3//////////// + // var plane = getPlane(4); + // plane.rotation.x = Math.PI/2; + // scene.add(plane); + ////////////////////// + + var camera = new THREE.PerspectiveCamera( + 45, + window.innerWidth/window.innerHeight, + 1, + 1000 + ); + + //////////1//////////// + // camera.position.x = 1; + // camera.position.y = 2; + // camera.position.z = 5; + ////////////////////// + + camera.lookAt(new THREE.Vector3(0, 0, 0)); + + var renderer = new THREE.WebGLRenderer(); + renderer.setSize(window.innerWidth, window.innerHeight); + document.getElementById('webgl').appendChild(renderer.domElement); + renderer.render( + scene, + camera + ); +} + +//////////2//////////// +// function getBox(w, h, d) { +// var geometry = new THREE.BoxGeometry(w, h, d); +// var material = new THREE.MeshBasicMaterial({ +// color: 0x00ff00 +// }); +// var mesh = new THREE.Mesh( +// geometry, +// material +// ); + +// return mesh; +// } +////////////////////// + +/////////3///////////// +// function getPlane(size) { +// var geometry = new THREE.PlaneGeometry(size, size); +// var material = new THREE.MeshBasicMaterial({ +// color: 0xff0000, +// side: THREE.DoubleSide +// }); +// var mesh = new THREE.Mesh( +// geometry, +// material +// ); + +// return mesh; +// } +////////////////////// + +init(); \ No newline at end of file diff --git a/1_Three.js/2_Primitives and Transforms/main.js b/1_Three.js/2_Primitives and Transforms/main.js new file mode 100755 index 0000000000000000000000000000000000000000..fdb202e2c5952af52e46958151d40fd6e86879fa --- /dev/null +++ b/1_Three.js/2_Primitives and Transforms/main.js @@ -0,0 +1,99 @@ +function init() { + var scene = new THREE.Scene(); + + var box = getBox(1, 1, 1); + var plane = getPlane(4); + + //////////////2/////////////// + //plane.name = 'plane-1'; + ///////////////////////////// + + box.position.y = box.geometry.parameters.height/2; + plane.rotation.x = Math.PI/2; + //plane.position.y = 1; + + scene.add(box); + scene.add(plane); + + var camera = new THREE.PerspectiveCamera( + 45, + window.innerWidth/window.innerHeight, + 1, + 1000 + ); + + camera.position.x = 1; + camera.position.y = 2; + camera.position.z = 5; + + camera.lookAt(new THREE.Vector3(0, 0, 0)); + + var renderer = new THREE.WebGLRenderer(); + renderer.setSize(window.innerWidth, window.innerHeight); + document.getElementById('webgl').appendChild(renderer.domElement); + + + //////////////1/////////////// + renderer.render( + scene, + camera + ); + //update(renderer, scene, camera); + /////////////////////////////// + + return scene; +} + +function getBox(w, h, d) { + var geometry = new THREE.BoxGeometry(w, h, d); + var material = new THREE.MeshBasicMaterial({ + color: 0x00ff00 + }); + var mesh = new THREE.Mesh( + geometry, + material + ); + + return mesh; +} + +function getPlane(size) { + var geometry = new THREE.PlaneGeometry(size, size); + var material = new THREE.MeshBasicMaterial({ + color: 0xff0000, + side: THREE.DoubleSide + }); + var mesh = new THREE.Mesh( + geometry, + material + ); + + return mesh; +} + +//////////////1/////////////// +function update(renderer, scene, camera) { + renderer.render( + scene, + camera + ); + + //////////////2/////////////// + // var plane = scene.getObjectByName('plane-1'); + // plane.rotation.y += 0.001; + // plane.rotation.z += 0.001; + ////////////////////////////// + + //////////////3/////////////// + // scene.traverse(function(child) { + // child.scale.x += 0.001; + // }) + ////////////////////////////// + + requestAnimationFrame(function() { + update(renderer, scene, camera); + }) +} +//////////////1/////////////// + +var scene = init(); \ No newline at end of file diff --git a/1_Three.js/3_Controls/main.js b/1_Three.js/3_Controls/main.js new file mode 100755 index 0000000000000000000000000000000000000000..ca746d2b5b5469f71353a5c5c6a2670f40439e9d --- /dev/null +++ b/1_Three.js/3_Controls/main.js @@ -0,0 +1,110 @@ +function init() { + var scene = new THREE.Scene(); + + var box = getBox(1, 1, 1); + var plane = getPlane(4); + + plane.name = 'plane-1'; + + box.position.y = box.geometry.parameters.height/2; + box.position.z = -box.geometry.parameters.height/2; + plane.rotation.x = Math.PI/2; + plane.position.y = 1; + + plane.add(box); + scene.add(plane); + + ///////////////////1///////////// + // var gui = new dat.GUI(); + // gui.add(box.scale, 'x', 0, 5); + // gui.add(box.scale, 'y', 0, 5); + ////////////////////////////////// + + var camera = new THREE.PerspectiveCamera( + 45, + window.innerWidth/window.innerHeight, + 1, + 1000 + ); + + camera.position.x = 1; + camera.position.y = 2; + camera.position.z = 5; + + camera.lookAt(new THREE.Vector3(0, 0, 0)); + + var renderer = new THREE.WebGLRenderer(); + renderer.setSize(window.innerWidth, window.innerHeight); + document.getElementById('webgl').appendChild(renderer.domElement); + + ///////////////////2///////////// + //var controls = new THREE.OrbitControls(camera, renderer.domElement); + //update(renderer, scene, camera, controls); + update(renderer, scene, camera); + ///////////////////////////////////// + + return scene; +} + +function getBox(w, h, d) { + var geometry = new THREE.BoxGeometry(w, h, d); + var material = new THREE.MeshBasicMaterial({ + color: 0x00ff00 + }); + var mesh = new THREE.Mesh( + geometry, + material + ); + + return mesh; +} + +function getPlane(size) { + var geometry = new THREE.PlaneGeometry(size, size); + var material = new THREE.MeshBasicMaterial({ + color: 0xff0000, + side: THREE.DoubleSide + }); + var mesh = new THREE.Mesh( + geometry, + material + ); + + return mesh; +} + +function update(renderer, scene, camera) { + renderer.render( + scene, + camera + ); + + var plane = scene.getObjectByName('plane-1'); + plane.rotation.y += 0.001; + plane.rotation.z += 0.001; + + + requestAnimationFrame(function() { + update(renderer, scene, camera); + }) +} + + +////////////////////////////2////////////////////////////// +// function update(renderer, scene, camera, controls) { +// renderer.render( +// scene, +// camera +// ); + +// var plane = scene.getObjectByName('plane-1'); +// plane.rotation.y += 0.001; +// plane.rotation.z += 0.001; + +// requestAnimationFrame(function() { +// update(renderer, scene, camera, controls); +// }) +// } +//////////////////////////////////////////////// + +var scene = init(); \ No newline at end of file diff --git a/1_Three.js/4_Material and Light/1_main.js b/1_Three.js/4_Material and Light/1_main.js new file mode 100755 index 0000000000000000000000000000000000000000..28add6d7cafdeac5c694bcdd555cd4c8161880d7 --- /dev/null +++ b/1_Three.js/4_Material and Light/1_main.js @@ -0,0 +1,136 @@ +function init() { + var scene = new THREE.Scene(); + var gui = new dat.GUI(); + + + var box = getBox(1, 1, 1); + var plane = getPlane(20); + + + var sphere = getSphere(0.05); + + plane.name = 'plane-1'; + + box.position.y = box.geometry.parameters.height/2; + plane.rotation.x = Math.PI/2; + + /////////////2/////////////// + // var pointLight = getPointLight(1); + // pointLight.position.y = 2; + // pointLight.intensity = 2; + // pointLight.add(sphere); + // scene.add(pointLight); + + // gui.add(pointLight, 'intensity', 0, 10); + // gui.add(pointLight.position, 'y', 0, 5); + //////////////////////////// + + scene.add(box); + scene.add(plane); + + + var camera = new THREE.PerspectiveCamera( + 45, + window.innerWidth/window.innerHeight, + 1, + 1000 + ); + + camera.position.x = 1; + camera.position.y = 2; + camera.position.z = 5; + + camera.lookAt(new THREE.Vector3(0, 0, 0)); + + var renderer = new THREE.WebGLRenderer(); + + //////////////////////////// + renderer.shadowMap.enabled = true; + //////////////////////////// + + renderer.setSize(window.innerWidth, window.innerHeight); + renderer.setClearColor('rgb(120, 120, 120)'); + document.getElementById('webgl').appendChild(renderer.domElement); + + var controls = new THREE.OrbitControls(camera, renderer.domElement); + + update(renderer, scene, camera, controls); + + return scene; +} + +function getBox(w, h, d) { + var geometry = new THREE.BoxGeometry(w, h, d); + /////////////1/////////////// + var material = new THREE.MeshPhongMaterial({ + color: 'rgb(120, 120, 120)' + }); + //////////////////////////// + var mesh = new THREE.Mesh( + geometry, + material + ); + ////////////3//////////////// + //mesh.castShadow = true; + //////////////////////////// + + return mesh; +} + +function getPlane(size) { + var geometry = new THREE.PlaneGeometry(size, size); + ////////////1//////////////// + var material = new THREE.MeshPhongMaterial({ + color: 'rgb(120, 120, 120)', + side: THREE.DoubleSide + }); + //////////////////////////// + var mesh = new THREE.Mesh( + geometry, + material + ); + + /////////////3/////////////// + //mesh.receiveShadow = true; + //////////////////////////// + + return mesh; +} + +function getSphere(size) { + var geometry = new THREE.SphereGeometry(size, 24, 24); + var material = new THREE.MeshBasicMaterial({ + color: 'rgb(255, 255, 255)' + }); + var mesh = new THREE.Mesh( + geometry, + material + ); + + return mesh; +} + +//////////////2////////////// +function getPointLight(intensity) { + var light = new THREE.PointLight(0xffffff, intensity); + light.castShadow = true; + + return light; +} +//////////////////////////// + + +function update(renderer, scene, camera, controls) { + renderer.render( + scene, + camera + ); + + controls.update(); + + requestAnimationFrame(function() { + update(renderer, scene, camera, controls); + }) +} + +var scene = init(); \ No newline at end of file diff --git a/1_Three.js/4_Material and Light/2_main.js b/1_Three.js/4_Material and Light/2_main.js new file mode 100755 index 0000000000000000000000000000000000000000..b90b7e3fee6e2652674b6830f3f3a8c0babab9d8 --- /dev/null +++ b/1_Three.js/4_Material and Light/2_main.js @@ -0,0 +1,206 @@ +function init() { + var scene = new THREE.Scene(); + var gui = new dat.GUI(); + + + var plane = getPlane(30); + + var sphere = getSphere(0.05); + var boxGrid = getBoxGrid(10, 1.5); + + + plane.name = 'plane-1'; + plane.rotation.x = Math.PI/2; + + scene.add(plane); + scene.add(boxGrid); + + ////////////////1///////////////////// + var sphere = getSphere(0.05); + var pointLight = getPointLight(1); + pointLight.position.y = 2; + pointLight.intensity = 2; + pointLight.add(sphere); + scene.add(pointLight); + gui.add(pointLight, 'intensity', 0, 10); + gui.add(pointLight.position, 'y', 0, 5); + ///////////////////////////////////// + + // ///////////////2////////////////////// + // var directionalLight = getDirectionalLight(1); + // var helper = new THREE.CameraHelper(directionalLight.shadow.camera); + // scene.add(helper); + // directionalLight.position.y = 4; + // directionalLight.intensity = 2; + // directionalLight.add(sphere); + // scene.add(directionalLight); + + // gui.add(directionalLight, 'intensity', 0, 10); + // gui.add(directionalLight.position, 'x', 0, 20); + // gui.add(directionalLight.position, 'y', 0, 20); + // gui.add(directionalLight.position, 'z', 0, 20); + // //////////////////////////////////////// + + + // /////////////3//////////////// + // var spotLight = getSpotLight(1); + // spotLight.position.y = 4; + // spotLight.intensity = 2; + // scene.add(spotLight); + // gui.add(spotLight, 'intensity', 0, 10); + // gui.add(spotLight.position, 'x', 0, 20); + // gui.add(spotLight.position, 'y', 0, 20); + // gui.add(spotLight.position, 'z', 0, 20); + // gui.add(spotLight, 'penumbra', 0, 1); + // /////////////////////////////////////// + + // ////////////4////////////// + // var ambientLight= getAmbientLight(5.0); + // scene.add(ambientLight); + // //////////////////////// + + var camera = new THREE.PerspectiveCamera( + 45, + window.innerWidth/window.innerHeight, + 1, + 1000 + ); + + camera.position.x = 1; + camera.position.y = 2; + camera.position.z = 5; + + camera.lookAt(new THREE.Vector3(0, 0, 0)); + + var renderer = new THREE.WebGLRenderer(); + renderer.shadowMap.enabled = true; + renderer.setSize(window.innerWidth, window.innerHeight); + renderer.setClearColor('rgb(120, 120, 120)'); + document.getElementById('webgl').appendChild(renderer.domElement); + + var controls = new THREE.OrbitControls(camera, renderer.domElement); + + update(renderer, scene, camera, controls); + + return scene; +} + +function getBox(w, h, d) { + var geometry = new THREE.BoxGeometry(w, h, d); + var material = new THREE.MeshPhongMaterial({ + color: 'rgb(120, 120, 120)' + }); + var mesh = new THREE.Mesh( + geometry, + material + ); + mesh.castShadow = true; + + return mesh; +} + + +////////////////1///////////////////// +function getBoxGrid(amount, separationMultiplier) { + var group = new THREE.Group(); + + for (var i=0; i<amount; i++) { + var obj = getBox(1, 1, 1); + obj.position.x = i * separationMultiplier; + obj.position.y = obj.geometry.parameters.height/2; + group.add(obj); + for (var j=1; j<amount; j++) { + var obj = getBox(1, 1, 1); + obj.position.x = i * separationMultiplier; + obj.position.y = obj.geometry.parameters.height/2; + obj.position.z = j * separationMultiplier; + group.add(obj); + } + } + + group.position.x = -(separationMultiplier * (amount-1))/2; + group.position.z = -(separationMultiplier * (amount-1))/2; + + return group; +} +////////////////////////////////////// + + +function getPlane(size) { + var geometry = new THREE.PlaneGeometry(size, size); + var material = new THREE.MeshPhongMaterial({ + color: 'rgb(120, 120, 120)', + side: THREE.DoubleSide + }); + var mesh = new THREE.Mesh( + geometry, + material + ); + mesh.receiveShadow = true; + + return mesh; +} + +function getSphere(size) { + var geometry = new THREE.SphereGeometry(size, 24, 24); + var material = new THREE.MeshBasicMaterial({ + color: 'rgb(255, 255, 255)' + }); + var mesh = new THREE.Mesh( + geometry, + material + ); + + return mesh; +} + +function getPointLight(intensity) { + var light = new THREE.PointLight(0xffffff, intensity); + light.castShadow = true; + + return light; +} + +function getAmbientLight(intensity) { + var light = new THREE.AmbientLight('rgb(10,30,50)', intensity); + + return light; +} + +function getSpotLight(intensity) { + var light = new THREE.SpotLight(0xffffff, intensity); + light.castShadow = true; + + light.shadow.bias = 0.001; + light.shadow.mapSize.width = 2048; + light.shadow.mapSize.height = 2048; + + return light; +} + +function getDirectionalLight(intensity) { + var light = new THREE.DirectionalLight(0xffffff, intensity); + light.castShadow = true; + + light.shadow.camera.left = -10; + light.shadow.camera.bottom = -10; + light.shadow.camera.right = 10; + light.shadow.camera.top = 10; + + return light; +} + +function update(renderer, scene, camera, controls) { + renderer.render( + scene, + camera + ); + + controls.update(); + + requestAnimationFrame(function() { + update(renderer, scene, camera, controls); + }) +} + +var scene = init(); \ No newline at end of file diff --git a/1_Three.js/4_Material and Light/3_main.js b/1_Three.js/4_Material and Light/3_main.js new file mode 100755 index 0000000000000000000000000000000000000000..d39bf2558b86c261d3bb17e644145f7adcf21f2b --- /dev/null +++ b/1_Three.js/4_Material and Light/3_main.js @@ -0,0 +1,220 @@ +var GEO_TYPES = [ + 'box', + 'cone', + 'cylinder', + 'octahedron', + 'sphere', + 'tetrahedron', + 'torus', + 'torusKnot' +]; + +function init() { + var scene = new THREE.Scene(); + var clock = new THREE.Clock(); + + // initialize objects + var objMaterial = getMaterial('standard', 'rgb(255, 255, 255)'); + + var geoTypes = GEO_TYPES; + + geoTypes.forEach(function(type) { + var geo = getGeometry(type, 5, objMaterial); + scene.add(geo); + }); + + var lightLeft = getSpotLight(1, 'rgb(255, 220, 180)'); + var lightRight = getSpotLight(1, 'rgb(255, 220, 180)'); + var lightBottom = getPointLight(0.33, 'rgb(255, 220, 150)'); + + lightLeft.position.x = -5; + lightLeft.position.y = 2; + lightLeft.position.z = -4; + + lightRight.position.x = 5; + lightRight.position.y = 2; + lightRight.position.z = -4; + + lightBottom.position.x = 0; + lightBottom.position.y = 10; + lightBottom.position.z = 0; + + // load the environment map + var path = '/assets/cubemap/'; + var format = '.jpg'; + var fileNames = ['px', 'nx', 'py', 'ny', 'pz', 'nz']; + + var reflectionCube = new THREE.CubeTextureLoader().load(fileNames.map(function(fileName) { + return path + fileName + format; + })); + scene.background = reflectionCube; + + // manipulate materials + var loader = new THREE.TextureLoader(); + objMaterial.roughnessMap = loader.load('./assets/textures/scratch.jpg'); + objMaterial.bumpMap = loader.load('./assets/textures/scratch.jpg'); + objMaterial.bumpScale = 0.01; + objMaterial.envMap = reflectionCube; + + objMaterial.roughness = 0.5; + objMaterial.metalness = 0.7; + + var maps = ['bumpMap', 'roughnessMap']; + maps.forEach(function(map) { + var texture = objMaterial[map]; + texture.wrapS = THREE.RepeatWrapping; + texture.wrapT = THREE.RepeatWrapping; + texture.repeat.set(1, 1); + }); + + // add other objects to the scene + scene.add(lightLeft); + scene.add(lightRight); + scene.add(lightBottom); + + // camera + var cameraGroup = new THREE.Group(); + var camera = new THREE.PerspectiveCamera( + 45, // field of view + window.innerWidth / window.innerHeight, // aspect ratio + 1, // near clipping plane + 1000 // far clipping plane + ); + camera.position.z = 20; + camera.position.x = 0; + camera.position.y = 5; + camera.lookAt(new THREE.Vector3(0, 0, 0)); + cameraGroup.add(camera); + cameraGroup.name = 'sceneCameraGroup'; + scene.add(cameraGroup); + + // renderer + var renderer = new THREE.WebGLRenderer(); + renderer.setSize(window.innerWidth, window.innerHeight); + renderer.shadowMap.enabled = true; + renderer.shadowMap.type = THREE.PCFSoftShadowMap; + // renderer.setClearColor (0xff0000, 1); + document.getElementById('webgl').appendChild(renderer.domElement); + update(renderer, scene, camera, clock); + + return scene; +} + +function getGeometry(type, size, material) { + var geometry; + var segmentMultiplier = 1; + + switch (type) { + case 'box': + geometry = new THREE.BoxGeometry(size, size, size); + break; + case 'cone': + geometry = new THREE.ConeGeometry(size, size, 256*segmentMultiplier); + break; + case 'cylinder': + geometry = new THREE.CylinderGeometry(size, size, size, 32*segmentMultiplier); + break; + case 'octahedron': + geometry = new THREE.OctahedronGeometry(size); + break; + case 'sphere': + geometry = new THREE.SphereGeometry(size, 32*segmentMultiplier, 32*segmentMultiplier); + break; + case 'tetrahedron': + geometry = new THREE.TetrahedronGeometry(size); + break; + case 'torus': + geometry = new THREE.TorusGeometry(size/2, size/4, 16*segmentMultiplier, 100*segmentMultiplier); + break; + case 'torusKnot': + geometry = new THREE.TorusKnotGeometry(size/2, size/6, 256*segmentMultiplier, 100*segmentMultiplier); + break; + default: + break; + } + + var obj = new THREE.Mesh(geometry, material); + obj.castShadow = true; + obj.name = type; + + return obj; +} + +function getMaterial(type, color) { + var selectedMaterial; + var materialOptions = { + color: color === undefined ? 'rgb(255, 255, 255)' : color, + }; + + switch (type) { + case 'basic': + selectedMaterial = new THREE.MeshBasicMaterial(materialOptions); + break; + case 'lambert': + selectedMaterial = new THREE.MeshLambertMaterial(materialOptions); + break; + case 'phong': + selectedMaterial = new THREE.MeshPhongMaterial(materialOptions); + break; + case 'standard': + selectedMaterial = new THREE.MeshStandardMaterial(materialOptions); + break; + default: + selectedMaterial = new THREE.MeshBasicMaterial(materialOptions); + break; + } + + return selectedMaterial; +} + +function getPointLight(intensity, color) { + var light = new THREE.PointLight(color, intensity); + light.castShadow = true; + + return light; +} + +function getSpotLight(intensity, color) { + color = color === undefined ? 'rgb(255, 255, 255)' : color; + var light = new THREE.SpotLight(color, intensity); + light.castShadow = true; + light.penumbra = 0.5; + + //Set up shadow properties for the light + light.shadow.mapSize.width = 1024; // default: 512 + light.shadow.mapSize.height = 1024; // default: 512 + light.shadow.camera.near = 0.1; // default + light.shadow.camera.far = 500 // default + light.shadow.camera.fov = 30 // default + light.shadow.bias = 0.001; + + return light; +} + +function update(renderer, scene, camera, clock) { + // rotate camera around the origin + var sceneCameraGroup = scene.getObjectByName('sceneCameraGroup'); + if (sceneCameraGroup) { + sceneCameraGroup.rotation.y += 0.005; + } + + // switch between objects + var geoTypes = GEO_TYPES; + + var currentIndex = Math.floor((clock.getElapsedTime() / 4) % geoTypes.length); + geoTypes.forEach(function(geo, index) { + var currentObj = scene.getObjectByName(geo); + if (index === currentIndex) { + currentObj.visible = true; + } else { + currentObj.visible = false; + } + }) + + renderer.render(scene, camera); + requestAnimationFrame(function() { + update(renderer, scene, camera, clock); + }); +} + +var scene = init(); diff --git a/1_Three.js/5_Mesh Manipulation and Data/1_main.js b/1_Three.js/5_Mesh Manipulation and Data/1_main.js new file mode 100755 index 0000000000000000000000000000000000000000..ae695a0fec0e51f6a151a301904deb44e8ab1bcf --- /dev/null +++ b/1_Three.js/5_Mesh Manipulation and Data/1_main.js @@ -0,0 +1,187 @@ +function init() { + var scene = new THREE.Scene(); + var gui = new dat.GUI(); + ////////////////////////// + var clock = new THREE.Clock(); + ////////////////////////// + + var plane = getPlane(30); + var directionalLight = getDirectionalLight(1); + var sphere = getSphere(0.05); + var boxGrid = getBoxGrid(10, 1.5); + + plane.name = 'plane-1'; + boxGrid.name = 'boxGrid'; + + plane.rotation.x = Math.PI/2; + directionalLight.position.x = 13; + directionalLight.position.y = 10; + directionalLight.position.z = 10; + directionalLight.intensity = 2; + + scene.add(plane); + directionalLight.add(sphere); + scene.add(directionalLight); + scene.add(boxGrid); + + gui.add(directionalLight, 'intensity', 0, 10); + gui.add(directionalLight.position, 'x', 0, 20); + gui.add(directionalLight.position, 'y', 0, 20); + gui.add(directionalLight.position, 'z', 0, 20); + + var camera = new THREE.PerspectiveCamera( + 45, + window.innerWidth/window.innerHeight, + 1, + 1000 + ); + + camera.position.x = 10; + camera.position.y = 18; + camera.position.z = -18; + + camera.lookAt(new THREE.Vector3(0, 0, 0)); + + var renderer = new THREE.WebGLRenderer(); + renderer.shadowMap.enabled = true; + renderer.setSize(window.innerWidth, window.innerHeight); + renderer.setClearColor('rgb(120, 120, 120)'); + document.getElementById('webgl').appendChild(renderer.domElement); + + var controls = new THREE.OrbitControls(camera, renderer.domElement); + + update(renderer, scene, camera, controls, clock); + + return scene; +} + +function getBox(w, h, d) { + var geometry = new THREE.BoxGeometry(w, h, d); + var material = new THREE.MeshPhongMaterial({ + color: 'rgb(120, 120, 120)' + }); + var mesh = new THREE.Mesh( + geometry, + material + ); + mesh.castShadow = true; + + return mesh; +} + +function getBoxGrid(amount, separationMultiplier) { + var group = new THREE.Group(); + + for (var i=0; i<amount; i++) { + var obj = getBox(1, 1, 1); + obj.position.x = i * separationMultiplier; + obj.position.y = obj.geometry.parameters.height/2; + group.add(obj); + for (var j=1; j<amount; j++) { + var obj = getBox(1, 1, 1); + obj.position.x = i * separationMultiplier; + obj.position.y = obj.geometry.parameters.height/2; + obj.position.z = j * separationMultiplier; + group.add(obj); + } + } + + group.position.x = -(separationMultiplier * (amount-1))/2; + group.position.z = -(separationMultiplier * (amount-1))/2; + + return group; +} + +function getPlane(size) { + var geometry = new THREE.PlaneGeometry(size, size); + var material = new THREE.MeshPhongMaterial({ + color: 'rgb(120, 120, 120)', + side: THREE.DoubleSide + }); + var mesh = new THREE.Mesh( + geometry, + material + ); + mesh.receiveShadow = true; + + return mesh; +} + +function getSphere(size) { + var geometry = new THREE.SphereGeometry(size, 24, 24); + var material = new THREE.MeshBasicMaterial({ + color: 'rgb(255, 255, 255)' + }); + var mesh = new THREE.Mesh( + geometry, + material + ); + + return mesh; +} + +function getPointLight(intensity) { + var light = new THREE.PointLight(0xffffff, intensity); + light.castShadow = true; + + return light; +} + +function getSpotLight(intensity) { + var light = new THREE.SpotLight(0xffffff, intensity); + light.castShadow = true; + + light.shadow.bias = 0.001; + light.shadow.mapSize.width = 2048; + light.shadow.mapSize.height = 2048; + + return light; +} + +function getDirectionalLight(intensity) { + var light = new THREE.DirectionalLight(0xffffff, intensity); + light.castShadow = true; + + light.shadow.camera.left = -10; + light.shadow.camera.bottom = -10; + light.shadow.camera.right = 10; + light.shadow.camera.top = 10; + + return light; +} + +function update(renderer, scene, camera, controls, clock) { + renderer.render( + scene, + camera + ); + + controls.update(); + + //////////////1//////////// + // var timeElapsed = clock.getElapsedTime(); + + // var boxGrid = scene.getObjectByName('boxGrid'); + + // boxGrid.children.forEach(function(child) { + // child.scale.y = Math.sin(timeElapsed * 5 ); + // //////////////2//////////// + // // child.scale.y = (Math.sin(timeElapsed * 5 ) + 1) / 2 + 0.001; + // ////////////// //////////// + // child.position.y = child.scale.y/2; + // }); + //////////////1//////////// + + //////////////3//////////// + // boxGrid.children.forEach(function(child, index) { + // child.scale.y = (Math.sin(timeElapsed * 5 + index) + 1) / 2 + 0.001; + // child.position.y = child.scale.y/2; + // }); + ////////////////////////// + + requestAnimationFrame(function() { + update(renderer, scene, camera, controls, clock); + }) +} + +var scene = init(); \ No newline at end of file diff --git a/1_Three.js/5_Mesh Manipulation and Data/2_main.js b/1_Three.js/5_Mesh Manipulation and Data/2_main.js new file mode 100755 index 0000000000000000000000000000000000000000..cdfdbbb64c5422a7e45a53e7a98ec5c8c9b55170 --- /dev/null +++ b/1_Three.js/5_Mesh Manipulation and Data/2_main.js @@ -0,0 +1,117 @@ +function init() { + var scene = new THREE.Scene(); + var clock = new THREE.Clock(); + + // initialize objects + var planeMaterial = getMaterial('basic', 'rgb(255, 255, 255)'); + var plane = getPlane(planeMaterial, 30, 60); + plane.name = 'plane-1'; + + // manipulate objects + plane.rotation.x = Math.PI/2; + plane.rotation.z = Math.PI/4; + + // add objects to the scene + //////////////1/////////////////// + var sphere = getSphere(planeMaterial,5,24); + scene.add(sphere); + ////////////////////////////////// + + //////////////2/////////////////// + // scene.add(plane); + ////////////////////////////////// + + // camera + var camera = new THREE.PerspectiveCamera( + 45, // field of view + window.innerWidth / window.innerHeight, // aspect ratio + 1, // near clipping plane + 1000 // far clipping plane + ); + camera.position.z = 20; + camera.position.x = 0; + camera.position.y = 5; + camera.lookAt(new THREE.Vector3(0, 0, 0)); + + // renderer + var renderer = new THREE.WebGLRenderer(); + renderer.setSize(window.innerWidth, window.innerHeight); + renderer.shadowMap.enabled = true; + document.getElementById('webgl').appendChild(renderer.domElement); + + var controls = new THREE.OrbitControls( camera, renderer.domElement ); + + update(renderer, scene, camera, controls, clock); + + return scene; +} + +function getPlane(material, size, segments) { + var geometry = new THREE.PlaneGeometry(size, size, segments, segments); + material.side = THREE.DoubleSide; + var obj = new THREE.Mesh(geometry, material); + obj.receiveShadow = true; + obj.castShadow = true; + + return obj; +} + +function getSphere(material,size,res) { + var geometry = new THREE.SphereGeometry(size, res, res); + var mesh = new THREE.Mesh( + geometry, + material + ); + + return mesh; +} + +function getMaterial(type, color) { + var selectedMaterial; + var materialOptions = { + color: color === undefined ? 'rgb(255, 255, 255)' : color, + wireframe: true, + }; + + switch (type) { + case 'basic': + selectedMaterial = new THREE.MeshBasicMaterial(materialOptions); + break; + case 'lambert': + selectedMaterial = new THREE.MeshLambertMaterial(materialOptions); + break; + case 'phong': + selectedMaterial = new THREE.MeshPhongMaterial(materialOptions); + break; + case 'standard': + selectedMaterial = new THREE.MeshStandardMaterial(materialOptions); + break; + default: + selectedMaterial = new THREE.MeshBasicMaterial(materialOptions); + break; + } + + return selectedMaterial; +} + +function update(renderer, scene, camera, controls, clock) { + controls.update(); + + var elapsedTime = clock.getElapsedTime(); + + //////////////2/////////////////// + // var plane = scene.getObjectByName('plane-1'); + // var planeGeo = plane.geometry; + // planeGeo.vertices.forEach(function(vertex, index) { + // vertex.z += Math.sin(elapsedTime + index * 0.1) * 0.005; + // }); + // planeGeo.verticesNeedUpdate = true; + ////////////////////////////////// + + renderer.render(scene, camera); + requestAnimationFrame(function() { + update(renderer, scene, camera, controls, clock); + }); +} + +var scene = init(); diff --git a/1_Three.js/6_AR/custom-patterns.html b/1_Three.js/6_AR/custom-patterns.html new file mode 100755 index 0000000000000000000000000000000000000000..c7b02da31ece6c19a0f082739ff0894b0a60fdb5 --- /dev/null +++ b/1_Three.js/6_AR/custom-patterns.html @@ -0,0 +1,157 @@ +<!DOCTYPE html> +<head> + <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0"> + <title>Hello, AR Cubes!</title> + <!-- include three.js library --> + <script src='js/three.js'></script> + <!-- include jsartookit --> + <script src="jsartoolkit5/artoolkit.min.js"></script> + <script src="jsartoolkit5/artoolkit.api.js"></script> + <!-- include threex.artoolkit --> + <script src="threex/threex-artoolkitsource.js"></script> + <script src="threex/threex-artoolkitcontext.js"></script> + <script src="threex/threex-arbasecontrols.js"></script> + <script src="threex/threex-armarkercontrols.js"></script> +</head> + +<body style='margin : 0px; overflow: hidden; font-family: Monospace;'> + +<!-- + Example created by Lee Stemkoski: https://github.com/stemkoski + Based on the AR.js library and examples created by Jerome Etienne: https://github.com/jeromeetienne/AR.js/ +--> + +<script> + +var scene, camera, renderer, clock, deltaTime, totalTime; + +var arToolkitSource, arToolkitContext; + +var markerRoot1, markerRoot2; + +var mesh1; + +initialize(); +animate(); + +function initialize() +{ + scene = new THREE.Scene(); + + let ambientLight = new THREE.AmbientLight( 0xcccccc, 0.5 ); + scene.add( ambientLight ); + + camera = new THREE.Camera(); + scene.add(camera); + + renderer = new THREE.WebGLRenderer({ + antialias : true, + alpha: true + }); + renderer.setClearColor(new THREE.Color('lightgrey'), 0) + renderer.setSize( 640, 480 ); + renderer.domElement.style.position = 'absolute' + renderer.domElement.style.top = '0px' + renderer.domElement.style.left = '0px' + document.body.appendChild( renderer.domElement ); + + clock = new THREE.Clock(); + deltaTime = 0; + totalTime = 0; + + //////////////////////////////////////////////////////////// + // setup arToolkitSource + //////////////////////////////////////////////////////////// + + arToolkitSource = new THREEx.ArToolkitSource({ + sourceType : 'webcam', + }); + + function onResize() + { + arToolkitSource.onResize() + arToolkitSource.copySizeTo(renderer.domElement) + if ( arToolkitContext.arController !== null ) + { + arToolkitSource.copySizeTo(arToolkitContext.arController.canvas) + } + } + + arToolkitSource.init(function onReady(){ + onResize() + }); + + // handle resize event + window.addEventListener('resize', function(){ + onResize() + }); + + //////////////////////////////////////////////////////////// + // setup arToolkitContext + //////////////////////////////////////////////////////////// + + // create atToolkitContext + arToolkitContext = new THREEx.ArToolkitContext({ + cameraParametersUrl: 'data/camera_para.dat', + detectionMode: 'mono' + }); + + // copy projection matrix to camera when initialization complete + arToolkitContext.init( function onCompleted(){ + camera.projectionMatrix.copy( arToolkitContext.getProjectionMatrix() ); + }); + + //////////////////////////////////////////////////////////// + // setup markerRoots + //////////////////////////////////////////////////////////// + + let loader = new THREE.TextureLoader(); + let texture = loader.load( 'images/border.png' ); + + let patternArray = ["letterA", "letterB", "letterC", "letterD", "letterF", "kanji", "hiro"]; + let colorArray = [0xff0000, 0xff8800, 0xffff00, 0x00cc00, 0x0000ff, 0xcc00ff, 0xcccccc]; + for (let i = 0; i < 7; i++) + { + let markerRoot = new THREE.Group(); + scene.add(markerRoot); + let markerControls = new THREEx.ArMarkerControls(arToolkitContext, markerRoot, { + type : 'pattern', patternUrl : "data/" + patternArray[i] + ".patt", + }); + + let mesh = new THREE.Mesh( + new THREE.CubeGeometry(1.25,1.25,1.25), + new THREE.MeshBasicMaterial({color:colorArray[i], map:texture, transparent:true, opacity:0.5}) + ); + mesh.position.y = 1.25/2; + markerRoot.add( mesh ); + } +} + + +function update() +{ + // update artoolkit on every frame + if ( arToolkitSource.ready !== false ) + arToolkitContext.update( arToolkitSource.domElement ); +} + + +function render() +{ + renderer.render( scene, camera ); +} + + +function animate() +{ + requestAnimationFrame(animate); + deltaTime = clock.getDelta(); + totalTime += deltaTime; + update(); + render(); +} + +</script> + +</body> +</html> \ No newline at end of file diff --git a/1_Three.js/6_AR/data/camera_para.dat b/1_Three.js/6_AR/data/camera_para.dat new file mode 100755 index 0000000000000000000000000000000000000000..67102ed20b19768d6cb9d3df802da1ae3a9bae42 Binary files /dev/null and b/1_Three.js/6_AR/data/camera_para.dat differ diff --git a/1_Three.js/6_AR/data/hiro.patt b/1_Three.js/6_AR/data/hiro.patt new file mode 100755 index 0000000000000000000000000000000000000000..7f78e3c1255212979e05781aabb6ca1a245b11ab --- /dev/null +++ b/1_Three.js/6_AR/data/hiro.patt @@ -0,0 +1,196 @@ + 234 235 240 233 240 234 240 235 240 237 240 238 240 240 240 232 + 229 240 240 240 240 240 240 240 240 240 240 240 240 240 240 228 + 227 240 240 240 240 240 240 240 240 240 240 240 240 240 240 239 + 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 + 236 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 + 234 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 + 236 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 + 231 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 + 229 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 + 225 149 240 240 186 216 225 174 240 240 240 237 238 240 240 240 + 150 107 238 231 75 208 115 147 238 228 223 226 237 180 226 240 + 150 62 181 213 62 187 113 169 197 72 29 237 120 50 53 207 + 149 63 47 78 53 184 113 101 142 5 150 150 45 217 186 83 + 121 84 220 222 58 180 121 92 128 109 237 124 155 232 161 64 + 149 71 240 240 76 210 98 109 122 108 240 129 51 119 161 155 + 149 186 240 240 98 219 135 152 207 191 236 227 152 77 175 209 + 235 235 240 233 240 234 240 235 240 236 240 238 240 240 240 240 + 229 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 + 227 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 + 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 + 236 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 + 234 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 + 236 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 + 232 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 + 229 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 + 225 156 240 240 186 216 225 186 240 240 240 240 240 240 240 240 + 150 117 240 231 72 206 115 162 240 232 223 237 240 180 226 240 + 150 74 187 213 51 184 103 168 197 78 29 237 120 50 53 216 + 144 77 51 74 61 184 106 101 142 5 150 152 52 217 186 85 + 117 89 219 219 65 184 121 92 128 100 236 125 156 240 170 73 + 148 71 240 240 76 210 109 109 121 99 240 137 51 120 166 164 + 140 186 240 240 98 220 150 156 207 192 236 230 152 77 176 212 + 234 235 240 233 240 234 240 235 240 236 240 238 240 240 240 233 + 229 240 240 240 240 240 240 240 240 240 240 240 240 240 240 239 + 227 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 + 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 + 234 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 + 232 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 + 235 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 + 232 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 + 228 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 + 225 156 240 240 182 212 225 180 240 240 240 240 240 240 240 240 + 150 116 238 228 66 205 115 151 238 236 225 240 240 180 226 240 + 156 84 186 211 47 184 109 170 200 92 30 240 120 50 53 216 + 147 83 51 73 50 184 106 110 148 17 151 150 45 217 186 85 + 127 98 219 219 58 179 109 101 128 107 237 125 155 240 163 72 + 155 86 240 240 76 201 85 108 121 95 232 137 51 118 153 155 + 149 189 240 240 98 220 141 154 206 178 235 230 152 77 175 209 + + 232 228 239 240 240 240 240 240 240 240 240 207 83 64 155 209 + 240 240 240 240 240 240 240 240 240 240 226 53 186 161 161 175 + 240 240 240 240 240 240 240 240 240 240 180 50 217 232 119 77 + 240 240 240 240 240 240 240 240 240 238 237 120 45 155 51 152 + 238 240 240 240 240 240 240 240 240 237 226 237 150 124 129 227 + 240 240 240 240 240 240 240 240 240 240 223 29 150 237 240 236 + 237 240 240 240 240 240 240 240 240 240 228 72 5 109 108 191 + 240 240 240 240 240 240 240 240 240 240 238 197 142 128 122 207 + 235 240 240 240 240 240 240 240 240 174 147 169 101 92 109 152 + 240 240 240 240 240 240 240 240 240 225 115 113 113 121 98 135 + 234 240 240 240 240 240 240 240 240 216 208 187 184 180 210 219 + 240 240 240 240 240 240 240 240 240 186 75 62 53 58 76 98 + 233 240 240 240 240 240 240 240 240 240 231 213 78 222 240 240 + 240 240 240 240 240 240 240 240 240 240 238 181 47 220 240 240 + 235 240 240 240 240 240 240 240 240 149 107 62 63 84 71 186 + 234 229 227 240 236 234 236 231 229 225 150 150 149 121 149 149 + 240 240 240 240 240 240 240 240 240 240 240 216 85 73 164 212 + 240 240 240 240 240 240 240 240 240 240 226 53 186 170 166 176 + 240 240 240 240 240 240 240 240 240 240 180 50 217 240 120 77 + 240 240 240 240 240 240 240 240 240 240 240 120 52 156 51 152 + 238 240 240 240 240 240 240 240 240 240 237 237 152 125 137 230 + 240 240 240 240 240 240 240 240 240 240 223 29 150 236 240 236 + 236 240 240 240 240 240 240 240 240 240 232 78 5 100 99 192 + 240 240 240 240 240 240 240 240 240 240 240 197 142 128 121 207 + 235 240 240 240 240 240 240 240 240 186 162 168 101 92 109 156 + 240 240 240 240 240 240 240 240 240 225 115 103 106 121 109 150 + 234 240 240 240 240 240 240 240 240 216 206 184 184 184 210 220 + 240 240 240 240 240 240 240 240 240 186 72 51 61 65 76 98 + 233 240 240 240 240 240 240 240 240 240 231 213 74 219 240 240 + 240 240 240 240 240 240 240 240 240 240 240 187 51 219 240 240 + 235 240 240 240 240 240 240 240 240 156 117 74 77 89 71 186 + 235 229 227 240 236 234 236 232 229 225 150 150 144 117 148 140 + 233 239 240 240 240 240 240 240 240 240 240 216 85 72 155 209 + 240 240 240 240 240 240 240 240 240 240 226 53 186 163 153 175 + 240 240 240 240 240 240 240 240 240 240 180 50 217 240 118 77 + 240 240 240 240 240 240 240 240 240 240 240 120 45 155 51 152 + 238 240 240 240 240 240 240 240 240 240 240 240 150 125 137 230 + 240 240 240 240 240 240 240 240 240 240 225 30 151 237 232 235 + 236 240 240 240 240 240 240 240 240 240 236 92 17 107 95 178 + 240 240 240 240 240 240 240 240 240 240 238 200 148 128 121 206 + 235 240 240 240 240 240 240 240 240 180 151 170 110 101 108 154 + 240 240 240 240 240 240 240 240 240 225 115 109 106 109 85 141 + 234 240 240 240 240 240 240 240 240 212 205 184 184 179 201 220 + 240 240 240 240 240 240 240 240 240 182 66 47 50 58 76 98 + 233 240 240 240 240 240 240 240 240 240 228 211 73 219 240 240 + 240 240 240 240 240 240 240 240 240 240 238 186 51 219 240 240 + 235 240 240 240 240 240 240 240 240 156 116 84 83 98 86 189 + 234 229 227 240 234 232 235 232 228 225 150 156 147 127 155 149 + + 209 175 77 152 227 236 191 207 152 135 219 98 240 240 186 149 + 155 161 119 51 129 240 108 122 109 98 210 76 240 240 71 149 + 64 161 232 155 124 237 109 128 92 121 180 58 222 220 84 121 + 83 186 217 45 150 150 5 142 101 113 184 53 78 47 63 149 + 207 53 50 120 237 29 72 197 169 113 187 62 213 181 62 150 + 240 226 180 237 226 223 228 238 147 115 208 75 231 238 107 150 + 240 240 240 238 237 240 240 240 174 225 216 186 240 240 149 225 + 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 229 + 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 231 + 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 236 + 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 234 + 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 236 + 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 + 239 240 240 240 240 240 240 240 240 240 240 240 240 240 240 227 + 228 240 240 240 240 240 240 240 240 240 240 240 240 240 240 229 + 232 240 240 240 238 240 237 240 235 240 234 240 233 240 235 234 + 212 176 77 152 230 236 192 207 156 150 220 98 240 240 186 140 + 164 166 120 51 137 240 99 121 109 109 210 76 240 240 71 148 + 73 170 240 156 125 236 100 128 92 121 184 65 219 219 89 117 + 85 186 217 52 152 150 5 142 101 106 184 61 74 51 77 144 + 216 53 50 120 237 29 78 197 168 103 184 51 213 187 74 150 + 240 226 180 240 237 223 232 240 162 115 206 72 231 240 117 150 + 240 240 240 240 240 240 240 240 186 225 216 186 240 240 156 225 + 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 229 + 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 232 + 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 236 + 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 234 + 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 236 + 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 + 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 227 + 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 229 + 240 240 240 240 238 240 236 240 235 240 234 240 233 240 235 235 + 209 175 77 152 230 235 178 206 154 141 220 98 240 240 189 149 + 155 153 118 51 137 232 95 121 108 85 201 76 240 240 86 155 + 72 163 240 155 125 237 107 128 101 109 179 58 219 219 98 127 + 85 186 217 45 150 151 17 148 110 106 184 50 73 51 83 147 + 216 53 50 120 240 30 92 200 170 109 184 47 211 186 84 156 + 240 226 180 240 240 225 236 238 151 115 205 66 228 238 116 150 + 240 240 240 240 240 240 240 240 180 225 212 182 240 240 156 225 + 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 228 + 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 232 + 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 235 + 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 232 + 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 234 + 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 + 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 227 + 239 240 240 240 240 240 240 240 240 240 240 240 240 240 240 229 + 233 240 240 240 238 240 236 240 235 240 234 240 233 240 235 234 + + 149 149 121 149 150 150 225 229 231 236 234 236 240 227 229 234 + 186 71 84 63 62 107 149 240 240 240 240 240 240 240 240 235 + 240 240 220 47 181 238 240 240 240 240 240 240 240 240 240 240 + 240 240 222 78 213 231 240 240 240 240 240 240 240 240 240 233 + 98 76 58 53 62 75 186 240 240 240 240 240 240 240 240 240 + 219 210 180 184 187 208 216 240 240 240 240 240 240 240 240 234 + 135 98 121 113 113 115 225 240 240 240 240 240 240 240 240 240 + 152 109 92 101 169 147 174 240 240 240 240 240 240 240 240 235 + 207 122 128 142 197 238 240 240 240 240 240 240 240 240 240 240 + 191 108 109 5 72 228 240 240 240 240 240 240 240 240 240 237 + 236 240 237 150 29 223 240 240 240 240 240 240 240 240 240 240 + 227 129 124 150 237 226 237 240 240 240 240 240 240 240 240 238 + 152 51 155 45 120 237 238 240 240 240 240 240 240 240 240 240 + 77 119 232 217 50 180 240 240 240 240 240 240 240 240 240 240 + 175 161 161 186 53 226 240 240 240 240 240 240 240 240 240 240 + 209 155 64 83 207 240 240 240 240 240 240 240 240 239 228 232 + 140 148 117 144 150 150 225 229 232 236 234 236 240 227 229 235 + 186 71 89 77 74 117 156 240 240 240 240 240 240 240 240 235 + 240 240 219 51 187 240 240 240 240 240 240 240 240 240 240 240 + 240 240 219 74 213 231 240 240 240 240 240 240 240 240 240 233 + 98 76 65 61 51 72 186 240 240 240 240 240 240 240 240 240 + 220 210 184 184 184 206 216 240 240 240 240 240 240 240 240 234 + 150 109 121 106 103 115 225 240 240 240 240 240 240 240 240 240 + 156 109 92 101 168 162 186 240 240 240 240 240 240 240 240 235 + 207 121 128 142 197 240 240 240 240 240 240 240 240 240 240 240 + 192 99 100 5 78 232 240 240 240 240 240 240 240 240 240 236 + 236 240 236 150 29 223 240 240 240 240 240 240 240 240 240 240 + 230 137 125 152 237 237 240 240 240 240 240 240 240 240 240 238 + 152 51 156 52 120 240 240 240 240 240 240 240 240 240 240 240 + 77 120 240 217 50 180 240 240 240 240 240 240 240 240 240 240 + 176 166 170 186 53 226 240 240 240 240 240 240 240 240 240 240 + 212 164 73 85 216 240 240 240 240 240 240 240 240 240 240 240 + 149 155 127 147 156 150 225 228 232 235 232 234 240 227 229 234 + 189 86 98 83 84 116 156 240 240 240 240 240 240 240 240 235 + 240 240 219 51 186 238 240 240 240 240 240 240 240 240 240 240 + 240 240 219 73 211 228 240 240 240 240 240 240 240 240 240 233 + 98 76 58 50 47 66 182 240 240 240 240 240 240 240 240 240 + 220 201 179 184 184 205 212 240 240 240 240 240 240 240 240 234 + 141 85 109 106 109 115 225 240 240 240 240 240 240 240 240 240 + 154 108 101 110 170 151 180 240 240 240 240 240 240 240 240 235 + 206 121 128 148 200 238 240 240 240 240 240 240 240 240 240 240 + 178 95 107 17 92 236 240 240 240 240 240 240 240 240 240 236 + 235 232 237 151 30 225 240 240 240 240 240 240 240 240 240 240 + 230 137 125 150 240 240 240 240 240 240 240 240 240 240 240 238 + 152 51 155 45 120 240 240 240 240 240 240 240 240 240 240 240 + 77 118 240 217 50 180 240 240 240 240 240 240 240 240 240 240 + 175 153 163 186 53 226 240 240 240 240 240 240 240 240 240 240 + 209 155 72 85 216 240 240 240 240 240 240 240 240 240 239 233 + diff --git a/1_Three.js/6_AR/data/kanji.patt b/1_Three.js/6_AR/data/kanji.patt new file mode 100755 index 0000000000000000000000000000000000000000..87d32bb51e3144f6b63a41cf47df9eb901dd1a1b --- /dev/null +++ b/1_Three.js/6_AR/data/kanji.patt @@ -0,0 +1,196 @@ + 214 225 240 225 214 240 216 204 214 227 181 192 198 192 181 192 + 240 240 240 240 240 240 225 232 240 240 240 240 240 240 240 236 + 240 240 240 240 240 240 75 128 220 240 240 240 240 240 240 240 + 240 240 240 240 240 240 106 53 240 240 240 240 240 240 240 237 + 240 240 240 240 240 238 118 31 240 240 240 240 240 240 240 234 + 240 240 240 240 240 240 74 49 207 240 240 240 240 240 240 240 + 240 240 240 240 240 240 53 54 177 240 240 240 240 240 240 240 + 240 240 240 240 240 240 64 31 130 240 240 240 240 240 240 219 + 240 240 240 240 240 180 37 57 78 228 240 240 240 240 240 240 + 240 240 240 240 240 118 62 157 36 185 240 240 240 240 240 231 + 240 240 240 240 240 82 65 225 67 80 230 240 240 240 240 217 + 240 240 240 225 53 76 225 240 156 62 158 240 240 240 240 226 + 240 240 199 61 9 111 235 240 240 104 58 174 228 240 240 240 + 240 142 64 26 92 227 240 240 240 229 93 64 170 226 238 216 + 90 26 12 156 240 240 240 240 240 240 204 95 30 117 192 200 + 156 16 195 233 235 240 236 240 238 239 240 186 93 53 120 237 + 214 226 240 225 212 240 216 204 212 226 181 192 198 192 185 194 + 240 240 240 240 240 240 227 232 240 240 240 240 240 240 240 238 + 240 240 240 240 240 240 95 138 225 240 240 240 240 240 240 240 + 240 240 240 240 240 240 108 59 240 240 240 240 240 240 240 237 + 240 240 240 240 240 238 118 31 240 240 240 240 240 240 240 234 + 240 240 240 240 240 240 83 47 207 240 240 240 240 240 240 240 + 240 240 240 240 240 240 56 49 177 240 240 240 240 240 240 240 + 240 240 240 240 240 240 73 41 130 240 240 240 240 240 240 222 + 240 240 240 240 240 185 46 49 86 230 240 240 240 240 240 240 + 240 240 240 240 240 118 58 165 45 192 240 240 240 240 240 234 + 240 240 240 240 240 91 63 222 74 82 240 240 240 240 240 222 + 240 240 240 226 66 86 225 240 158 63 162 240 240 240 240 228 + 240 240 202 76 11 103 235 240 234 91 49 174 228 240 240 240 + 240 142 68 16 91 226 240 240 240 228 96 74 178 233 239 222 + 90 26 4 150 240 240 240 240 240 240 213 109 46 133 204 213 + 156 14 195 234 236 240 237 240 239 240 240 192 106 57 125 238 + 214 226 240 225 212 240 216 204 214 227 181 192 198 192 184 192 + 240 240 240 240 240 240 226 232 240 240 240 240 240 240 240 236 + 240 240 240 240 240 240 85 134 220 240 240 240 240 240 240 240 + 240 240 240 240 240 240 107 58 240 240 240 240 240 240 240 237 + 240 240 240 240 240 238 118 32 240 240 240 240 240 240 240 234 + 240 240 240 240 240 240 87 60 210 240 240 240 240 240 240 240 + 240 240 240 240 240 240 58 58 178 240 240 240 240 240 240 240 + 240 240 240 240 240 240 73 31 130 240 240 240 240 240 240 219 + 240 240 240 240 240 185 46 59 86 228 240 240 240 240 240 240 + 240 240 240 240 240 118 62 168 41 186 240 240 240 240 240 231 + 240 240 240 240 240 90 65 225 60 92 235 240 240 240 240 219 + 240 240 240 225 53 82 225 240 146 63 163 240 240 240 240 228 + 240 240 198 61 5 103 235 240 234 102 58 175 232 240 240 240 + 240 134 54 13 91 226 240 240 240 229 96 68 188 238 239 222 + 90 15 3 150 240 240 240 240 240 240 213 105 48 134 204 213 + 156 14 195 233 236 240 237 240 239 239 240 192 106 57 125 238 + + 192 236 240 237 234 240 240 219 240 231 217 226 240 216 200 237 + 181 240 240 240 240 240 240 240 240 240 240 240 240 238 192 120 + 192 240 240 240 240 240 240 240 240 240 240 240 240 226 117 53 + 198 240 240 240 240 240 240 240 240 240 240 240 228 170 30 93 + 192 240 240 240 240 240 240 240 240 240 240 240 174 64 95 186 + 181 240 240 240 240 240 240 240 240 240 230 158 58 93 204 240 + 227 240 240 240 240 240 240 240 228 185 80 62 104 229 240 239 + 214 240 220 240 240 207 177 130 78 36 67 156 240 240 240 238 + 204 232 128 53 31 49 54 31 57 157 225 240 240 240 240 240 + 216 225 75 106 118 74 53 64 37 62 65 225 235 240 240 236 + 240 240 240 240 238 240 240 240 180 118 82 76 111 227 240 240 + 214 240 240 240 240 240 240 240 240 240 240 53 9 92 240 235 + 225 240 240 240 240 240 240 240 240 240 240 225 61 26 156 233 + 240 240 240 240 240 240 240 240 240 240 240 240 199 64 12 195 + 225 240 240 240 240 240 240 240 240 240 240 240 240 142 26 16 + 214 240 240 240 240 240 240 240 240 240 240 240 240 240 90 156 + 194 238 240 237 234 240 240 222 240 234 222 228 240 222 213 238 + 185 240 240 240 240 240 240 240 240 240 240 240 240 239 204 125 + 192 240 240 240 240 240 240 240 240 240 240 240 240 233 133 57 + 198 240 240 240 240 240 240 240 240 240 240 240 228 178 46 106 + 192 240 240 240 240 240 240 240 240 240 240 240 174 74 109 192 + 181 240 240 240 240 240 240 240 240 240 240 162 49 96 213 240 + 226 240 240 240 240 240 240 240 230 192 82 63 91 228 240 240 + 212 240 225 240 240 207 177 130 86 45 74 158 234 240 240 239 + 204 232 138 59 31 47 49 41 49 165 222 240 240 240 240 240 + 216 227 95 108 118 83 56 73 46 58 63 225 235 240 240 237 + 240 240 240 240 238 240 240 240 185 118 91 86 103 226 240 240 + 212 240 240 240 240 240 240 240 240 240 240 66 11 91 240 236 + 225 240 240 240 240 240 240 240 240 240 240 226 76 16 150 234 + 240 240 240 240 240 240 240 240 240 240 240 240 202 68 4 195 + 226 240 240 240 240 240 240 240 240 240 240 240 240 142 26 14 + 214 240 240 240 240 240 240 240 240 240 240 240 240 240 90 156 + 192 236 240 237 234 240 240 219 240 231 219 228 240 222 213 238 + 184 240 240 240 240 240 240 240 240 240 240 240 240 239 204 125 + 192 240 240 240 240 240 240 240 240 240 240 240 240 238 134 57 + 198 240 240 240 240 240 240 240 240 240 240 240 232 188 48 106 + 192 240 240 240 240 240 240 240 240 240 240 240 175 68 105 192 + 181 240 240 240 240 240 240 240 240 240 235 163 58 96 213 240 + 227 240 240 240 240 240 240 240 228 186 92 63 102 229 240 239 + 214 240 220 240 240 210 178 130 86 41 60 146 234 240 240 239 + 204 232 134 58 32 60 58 31 59 168 225 240 240 240 240 240 + 216 226 85 107 118 87 58 73 46 62 65 225 235 240 240 237 + 240 240 240 240 238 240 240 240 185 118 90 82 103 226 240 240 + 212 240 240 240 240 240 240 240 240 240 240 53 5 91 240 236 + 225 240 240 240 240 240 240 240 240 240 240 225 61 13 150 233 + 240 240 240 240 240 240 240 240 240 240 240 240 198 54 3 195 + 226 240 240 240 240 240 240 240 240 240 240 240 240 134 15 14 + 214 240 240 240 240 240 240 240 240 240 240 240 240 240 90 156 + + 237 120 53 93 186 240 239 238 240 236 240 235 233 195 16 156 + 200 192 117 30 95 204 240 240 240 240 240 240 156 12 26 90 + 216 238 226 170 64 93 229 240 240 240 227 92 26 64 142 240 + 240 240 240 228 174 58 104 240 240 235 111 9 61 199 240 240 + 226 240 240 240 240 158 62 156 240 225 76 53 225 240 240 240 + 217 240 240 240 240 230 80 67 225 65 82 240 240 240 240 240 + 231 240 240 240 240 240 185 36 157 62 118 240 240 240 240 240 + 240 240 240 240 240 240 228 78 57 37 180 240 240 240 240 240 + 219 240 240 240 240 240 240 130 31 64 240 240 240 240 240 240 + 240 240 240 240 240 240 240 177 54 53 240 240 240 240 240 240 + 240 240 240 240 240 240 240 207 49 74 240 240 240 240 240 240 + 234 240 240 240 240 240 240 240 31 118 238 240 240 240 240 240 + 237 240 240 240 240 240 240 240 53 106 240 240 240 240 240 240 + 240 240 240 240 240 240 240 220 128 75 240 240 240 240 240 240 + 236 240 240 240 240 240 240 240 232 225 240 240 240 240 240 240 + 192 181 192 198 192 181 227 214 204 216 240 214 225 240 225 214 + 238 125 57 106 192 240 240 239 240 237 240 236 234 195 14 156 + 213 204 133 46 109 213 240 240 240 240 240 240 150 4 26 90 + 222 239 233 178 74 96 228 240 240 240 226 91 16 68 142 240 + 240 240 240 228 174 49 91 234 240 235 103 11 76 202 240 240 + 228 240 240 240 240 162 63 158 240 225 86 66 226 240 240 240 + 222 240 240 240 240 240 82 74 222 63 91 240 240 240 240 240 + 234 240 240 240 240 240 192 45 165 58 118 240 240 240 240 240 + 240 240 240 240 240 240 230 86 49 46 185 240 240 240 240 240 + 222 240 240 240 240 240 240 130 41 73 240 240 240 240 240 240 + 240 240 240 240 240 240 240 177 49 56 240 240 240 240 240 240 + 240 240 240 240 240 240 240 207 47 83 240 240 240 240 240 240 + 234 240 240 240 240 240 240 240 31 118 238 240 240 240 240 240 + 237 240 240 240 240 240 240 240 59 108 240 240 240 240 240 240 + 240 240 240 240 240 240 240 225 138 95 240 240 240 240 240 240 + 238 240 240 240 240 240 240 240 232 227 240 240 240 240 240 240 + 194 185 192 198 192 181 226 212 204 216 240 212 225 240 226 214 + 238 125 57 106 192 240 239 239 240 237 240 236 233 195 14 156 + 213 204 134 48 105 213 240 240 240 240 240 240 150 3 15 90 + 222 239 238 188 68 96 229 240 240 240 226 91 13 54 134 240 + 240 240 240 232 175 58 102 234 240 235 103 5 61 198 240 240 + 228 240 240 240 240 163 63 146 240 225 82 53 225 240 240 240 + 219 240 240 240 240 235 92 60 225 65 90 240 240 240 240 240 + 231 240 240 240 240 240 186 41 168 62 118 240 240 240 240 240 + 240 240 240 240 240 240 228 86 59 46 185 240 240 240 240 240 + 219 240 240 240 240 240 240 130 31 73 240 240 240 240 240 240 + 240 240 240 240 240 240 240 178 58 58 240 240 240 240 240 240 + 240 240 240 240 240 240 240 210 60 87 240 240 240 240 240 240 + 234 240 240 240 240 240 240 240 32 118 238 240 240 240 240 240 + 237 240 240 240 240 240 240 240 58 107 240 240 240 240 240 240 + 240 240 240 240 240 240 240 220 134 85 240 240 240 240 240 240 + 236 240 240 240 240 240 240 240 232 226 240 240 240 240 240 240 + 192 184 192 198 192 181 227 214 204 216 240 212 225 240 226 214 + + 156 90 240 240 240 240 240 240 240 240 240 240 240 240 240 214 + 16 26 142 240 240 240 240 240 240 240 240 240 240 240 240 225 + 195 12 64 199 240 240 240 240 240 240 240 240 240 240 240 240 + 233 156 26 61 225 240 240 240 240 240 240 240 240 240 240 225 + 235 240 92 9 53 240 240 240 240 240 240 240 240 240 240 214 + 240 240 227 111 76 82 118 180 240 240 240 238 240 240 240 240 + 236 240 240 235 225 65 62 37 64 53 74 118 106 75 225 216 + 240 240 240 240 240 225 157 57 31 54 49 31 53 128 232 204 + 238 240 240 240 156 67 36 78 130 177 207 240 240 220 240 214 + 239 240 229 104 62 80 185 228 240 240 240 240 240 240 240 227 + 240 204 93 58 158 230 240 240 240 240 240 240 240 240 240 181 + 186 95 64 174 240 240 240 240 240 240 240 240 240 240 240 192 + 93 30 170 228 240 240 240 240 240 240 240 240 240 240 240 198 + 53 117 226 240 240 240 240 240 240 240 240 240 240 240 240 192 + 120 192 238 240 240 240 240 240 240 240 240 240 240 240 240 181 + 237 200 216 240 226 217 231 240 219 240 240 234 237 240 236 192 + 156 90 240 240 240 240 240 240 240 240 240 240 240 240 240 214 + 14 26 142 240 240 240 240 240 240 240 240 240 240 240 240 226 + 195 4 68 202 240 240 240 240 240 240 240 240 240 240 240 240 + 234 150 16 76 226 240 240 240 240 240 240 240 240 240 240 225 + 236 240 91 11 66 240 240 240 240 240 240 240 240 240 240 212 + 240 240 226 103 86 91 118 185 240 240 240 238 240 240 240 240 + 237 240 240 235 225 63 58 46 73 56 83 118 108 95 227 216 + 240 240 240 240 240 222 165 49 41 49 47 31 59 138 232 204 + 239 240 240 234 158 74 45 86 130 177 207 240 240 225 240 212 + 240 240 228 91 63 82 192 230 240 240 240 240 240 240 240 226 + 240 213 96 49 162 240 240 240 240 240 240 240 240 240 240 181 + 192 109 74 174 240 240 240 240 240 240 240 240 240 240 240 192 + 106 46 178 228 240 240 240 240 240 240 240 240 240 240 240 198 + 57 133 233 240 240 240 240 240 240 240 240 240 240 240 240 192 + 125 204 239 240 240 240 240 240 240 240 240 240 240 240 240 185 + 238 213 222 240 228 222 234 240 222 240 240 234 237 240 238 194 + 156 90 240 240 240 240 240 240 240 240 240 240 240 240 240 214 + 14 15 134 240 240 240 240 240 240 240 240 240 240 240 240 226 + 195 3 54 198 240 240 240 240 240 240 240 240 240 240 240 240 + 233 150 13 61 225 240 240 240 240 240 240 240 240 240 240 225 + 236 240 91 5 53 240 240 240 240 240 240 240 240 240 240 212 + 240 240 226 103 82 90 118 185 240 240 240 238 240 240 240 240 + 237 240 240 235 225 65 62 46 73 58 87 118 107 85 226 216 + 240 240 240 240 240 225 168 59 31 58 60 32 58 134 232 204 + 239 240 240 234 146 60 41 86 130 178 210 240 240 220 240 214 + 239 240 229 102 63 92 186 228 240 240 240 240 240 240 240 227 + 240 213 96 58 163 235 240 240 240 240 240 240 240 240 240 181 + 192 105 68 175 240 240 240 240 240 240 240 240 240 240 240 192 + 106 48 188 232 240 240 240 240 240 240 240 240 240 240 240 198 + 57 134 238 240 240 240 240 240 240 240 240 240 240 240 240 192 + 125 204 239 240 240 240 240 240 240 240 240 240 240 240 240 184 + 238 213 222 240 228 219 231 240 219 240 240 234 237 240 236 192 + diff --git a/1_Three.js/6_AR/data/letterA.patt b/1_Three.js/6_AR/data/letterA.patt new file mode 100755 index 0000000000000000000000000000000000000000..7c4499c1342696fefff5474ea30211a243a3adc8 --- /dev/null +++ b/1_Three.js/6_AR/data/letterA.patt @@ -0,0 +1,195 @@ +255 255 255 255 255 255 255 255 254 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 231 16 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 0 0 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 0 0 100 255 255 255 255 255 255 +255 255 255 255 255 255 28 0 0 0 255 255 255 255 255 255 +255 255 255 255 255 255 0 0 0 0 221 255 255 255 255 255 +255 255 255 255 255 72 180 0 0 0 1 255 255 255 255 255 +255 255 255 255 255 0 255 225 0 0 0 254 255 255 255 255 +255 255 255 255 165 89 255 255 0 0 0 12 255 255 255 255 +255 255 255 255 0 255 255 255 121 0 0 0 255 255 255 255 +255 255 255 246 0 0 0 0 0 0 0 0 65 255 255 255 +255 255 255 6 255 255 255 255 255 53 0 0 0 255 255 255 +255 255 252 0 255 255 255 255 255 255 0 0 0 186 255 255 +255 255 0 126 255 255 255 255 255 255 2 0 0 0 255 255 +251 5 0 0 108 252 255 255 254 184 0 0 0 0 5 239 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 253 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 244 0 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 0 0 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 0 0 79 255 255 255 255 255 255 +255 255 255 255 255 255 59 0 0 0 255 255 255 255 255 255 +255 255 255 255 255 255 0 0 0 0 189 255 255 255 255 255 +255 255 255 255 255 140 139 0 0 0 0 255 255 255 255 255 +255 255 255 255 255 0 255 239 0 0 0 239 255 255 255 255 +255 255 255 255 203 40 255 255 0 0 0 0 255 255 255 255 +255 255 255 255 0 254 255 255 177 0 0 0 255 255 255 255 +255 255 255 254 0 0 0 0 0 0 0 0 33 255 255 255 +255 255 255 15 255 255 255 255 255 94 0 0 0 255 255 255 +255 255 255 0 255 255 255 255 255 255 0 0 0 156 255 255 +255 255 0 67 255 255 255 255 255 255 8 0 0 0 255 255 +252 12 0 0 70 249 255 255 255 193 0 0 0 0 4 227 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 252 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 252 0 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 0 0 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 0 0 55 255 255 255 255 255 255 +255 255 255 255 255 255 78 0 0 0 255 255 255 255 255 255 +255 255 255 255 255 255 0 0 0 0 142 255 255 255 255 255 +255 255 255 255 255 191 114 0 0 0 0 255 255 255 255 255 +255 255 255 255 255 0 255 249 0 0 0 212 255 255 255 255 +255 255 255 255 234 13 255 255 0 0 0 0 255 255 255 255 +255 255 255 255 0 252 255 255 217 0 0 0 255 255 255 255 +255 255 255 254 0 0 0 0 0 0 0 0 24 255 255 255 +255 255 255 27 241 255 255 255 255 128 0 0 0 255 255 255 +255 255 255 0 255 255 255 255 255 255 0 0 0 110 255 255 +255 255 25 0 255 255 255 255 255 255 13 0 0 0 255 255 +254 16 0 0 63 240 255 255 255 202 0 0 0 0 2 218 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 + +255 255 255 255 255 255 255 255 255 255 255 255 255 255 239 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 5 255 +255 255 255 255 255 255 255 255 255 255 255 255 186 0 0 255 +255 255 255 255 255 255 255 255 255 255 65 0 0 0 0 255 +255 255 255 255 255 255 255 254 12 0 0 0 0 0 0 255 +255 255 255 255 255 221 1 0 0 0 0 0 0 2 0 255 +255 255 255 100 0 0 0 0 0 0 0 53 255 255 184 255 +254 16 0 0 0 0 0 0 0 121 0 255 255 255 254 255 +255 231 0 0 0 0 0 225 255 255 0 255 255 255 255 255 +255 255 255 255 28 0 180 255 255 255 0 255 255 255 255 255 +255 255 255 255 255 255 72 0 89 255 0 255 255 255 252 255 +255 255 255 255 255 255 255 255 165 0 0 255 255 255 108 255 +255 255 255 255 255 255 255 255 255 255 246 6 0 126 0 255 +255 255 255 255 255 255 255 255 255 255 255 255 252 0 0 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 5 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 251 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 227 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 4 255 +255 255 255 255 255 255 255 255 255 255 255 255 156 0 0 255 +255 255 255 255 255 255 255 255 255 255 33 0 0 0 0 255 +255 255 255 255 255 255 255 239 0 0 0 0 0 0 0 255 +255 255 255 255 255 189 0 0 0 0 0 0 0 8 0 255 +255 255 255 79 0 0 0 0 0 0 0 94 255 255 193 255 +253 0 0 0 0 0 0 0 0 177 0 255 255 255 255 255 +255 244 0 0 0 0 0 239 255 255 0 255 255 255 255 255 +255 255 255 255 59 0 139 255 255 255 0 255 255 255 255 255 +255 255 255 255 255 255 140 0 40 254 0 255 255 255 249 255 +255 255 255 255 255 255 255 255 203 0 0 255 255 255 70 255 +255 255 255 255 255 255 255 255 255 255 254 15 0 67 0 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 0 0 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 12 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 252 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 218 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 2 255 +255 255 255 255 255 255 255 255 255 255 255 255 110 0 0 255 +255 255 255 255 255 255 255 255 255 255 24 0 0 0 0 255 +255 255 255 255 255 255 255 212 0 0 0 0 0 0 0 255 +255 255 255 255 255 142 0 0 0 0 0 0 0 13 0 255 +255 255 255 55 0 0 0 0 0 0 0 128 255 255 202 255 +252 0 0 0 0 0 0 0 0 217 0 255 255 255 255 255 +255 252 0 0 0 0 0 249 255 255 0 255 255 255 255 255 +255 255 255 255 78 0 114 255 255 255 0 255 255 255 255 255 +255 255 255 255 255 255 191 0 13 252 0 255 255 255 240 255 +255 255 255 255 255 255 255 255 234 0 0 241 255 255 63 255 +255 255 255 255 255 255 255 255 255 255 254 27 0 0 0 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 25 0 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 16 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 254 255 + +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +239 5 0 0 0 0 184 254 255 255 252 108 0 0 5 251 +255 255 0 0 0 2 255 255 255 255 255 255 126 0 255 255 +255 255 186 0 0 0 255 255 255 255 255 255 0 252 255 255 +255 255 255 0 0 0 53 255 255 255 255 255 6 255 255 255 +255 255 255 65 0 0 0 0 0 0 0 0 246 255 255 255 +255 255 255 255 0 0 0 121 255 255 255 0 255 255 255 255 +255 255 255 255 12 0 0 0 255 255 89 165 255 255 255 255 +255 255 255 255 254 0 0 0 225 255 0 255 255 255 255 255 +255 255 255 255 255 1 0 0 0 180 72 255 255 255 255 255 +255 255 255 255 255 221 0 0 0 0 255 255 255 255 255 255 +255 255 255 255 255 255 0 0 0 28 255 255 255 255 255 255 +255 255 255 255 255 255 100 0 0 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 0 0 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 16 231 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 254 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +227 4 0 0 0 0 193 255 255 255 249 70 0 0 12 252 +255 255 0 0 0 8 255 255 255 255 255 255 67 0 255 255 +255 255 156 0 0 0 255 255 255 255 255 255 0 255 255 255 +255 255 255 0 0 0 94 255 255 255 255 255 15 255 255 255 +255 255 255 33 0 0 0 0 0 0 0 0 254 255 255 255 +255 255 255 255 0 0 0 177 255 255 254 0 255 255 255 255 +255 255 255 255 0 0 0 0 255 255 40 203 255 255 255 255 +255 255 255 255 239 0 0 0 239 255 0 255 255 255 255 255 +255 255 255 255 255 0 0 0 0 139 140 255 255 255 255 255 +255 255 255 255 255 189 0 0 0 0 255 255 255 255 255 255 +255 255 255 255 255 255 0 0 0 59 255 255 255 255 255 255 +255 255 255 255 255 255 79 0 0 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 0 0 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 0 244 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 253 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +218 2 0 0 0 0 202 255 255 255 240 63 0 0 16 254 +255 255 0 0 0 13 255 255 255 255 255 255 0 25 255 255 +255 255 110 0 0 0 255 255 255 255 255 255 0 255 255 255 +255 255 255 0 0 0 128 255 255 255 255 241 27 255 255 255 +255 255 255 24 0 0 0 0 0 0 0 0 254 255 255 255 +255 255 255 255 0 0 0 217 255 255 252 0 255 255 255 255 +255 255 255 255 0 0 0 0 255 255 13 234 255 255 255 255 +255 255 255 255 212 0 0 0 249 255 0 255 255 255 255 255 +255 255 255 255 255 0 0 0 0 114 191 255 255 255 255 255 +255 255 255 255 255 142 0 0 0 0 255 255 255 255 255 255 +255 255 255 255 255 255 0 0 0 78 255 255 255 255 255 255 +255 255 255 255 255 255 55 0 0 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 0 0 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 0 252 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 252 255 255 255 255 255 255 255 255 + +255 251 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 5 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 0 0 252 255 255 255 255 255 255 255 255 255 255 255 255 +255 0 126 0 6 246 255 255 255 255 255 255 255 255 255 255 +255 108 255 255 255 0 0 165 255 255 255 255 255 255 255 255 +255 252 255 255 255 0 255 89 0 72 255 255 255 255 255 255 +255 255 255 255 255 0 255 255 255 180 0 28 255 255 255 255 +255 255 255 255 255 0 255 255 225 0 0 0 0 0 231 255 +255 254 255 255 255 0 121 0 0 0 0 0 0 0 16 254 +255 184 255 255 53 0 0 0 0 0 0 0 100 255 255 255 +255 0 2 0 0 0 0 0 0 1 221 255 255 255 255 255 +255 0 0 0 0 0 0 12 254 255 255 255 255 255 255 255 +255 0 0 0 0 65 255 255 255 255 255 255 255 255 255 255 +255 0 0 186 255 255 255 255 255 255 255 255 255 255 255 255 +255 5 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 239 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 252 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 12 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 0 67 0 15 254 255 255 255 255 255 255 255 255 255 255 +255 70 255 255 255 0 0 203 255 255 255 255 255 255 255 255 +255 249 255 255 255 0 254 40 0 140 255 255 255 255 255 255 +255 255 255 255 255 0 255 255 255 139 0 59 255 255 255 255 +255 255 255 255 255 0 255 255 239 0 0 0 0 0 244 255 +255 255 255 255 255 0 177 0 0 0 0 0 0 0 0 253 +255 193 255 255 94 0 0 0 0 0 0 0 79 255 255 255 +255 0 8 0 0 0 0 0 0 0 189 255 255 255 255 255 +255 0 0 0 0 0 0 0 239 255 255 255 255 255 255 255 +255 0 0 0 0 33 255 255 255 255 255 255 255 255 255 255 +255 0 0 156 255 255 255 255 255 255 255 255 255 255 255 255 +255 4 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 227 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 16 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 0 25 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 0 0 0 27 254 255 255 255 255 255 255 255 255 255 255 +255 63 255 255 241 0 0 234 255 255 255 255 255 255 255 255 +255 240 255 255 255 0 252 13 0 191 255 255 255 255 255 255 +255 255 255 255 255 0 255 255 255 114 0 78 255 255 255 255 +255 255 255 255 255 0 255 255 249 0 0 0 0 0 252 255 +255 255 255 255 255 0 217 0 0 0 0 0 0 0 0 252 +255 202 255 255 128 0 0 0 0 0 0 0 55 255 255 255 +255 0 13 0 0 0 0 0 0 0 142 255 255 255 255 255 +255 0 0 0 0 0 0 0 212 255 255 255 255 255 255 255 +255 0 0 0 0 24 255 255 255 255 255 255 255 255 255 255 +255 0 0 110 255 255 255 255 255 255 255 255 255 255 255 255 +255 2 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 218 255 255 255 255 255 255 255 255 255 255 255 255 255 255 diff --git a/1_Three.js/6_AR/data/letterB.patt b/1_Three.js/6_AR/data/letterB.patt new file mode 100755 index 0000000000000000000000000000000000000000..618870ebd101eb6dd3121a7d859b4ab0280c1333 --- /dev/null +++ b/1_Three.js/6_AR/data/letterB.patt @@ -0,0 +1,195 @@ +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 159 159 159 159 159 159 159 167 217 255 255 255 255 255 +255 255 255 138 0 0 0 225 140 0 0 0 6 255 255 255 +255 255 255 254 0 0 0 255 255 255 0 0 0 25 255 255 +255 255 255 254 0 0 0 255 255 255 143 0 0 0 255 255 +255 255 255 254 0 0 0 255 255 255 161 0 0 0 255 255 +255 255 255 254 0 0 0 255 255 255 0 0 0 18 255 255 +255 255 255 254 0 0 0 255 238 9 0 0 128 255 255 255 +255 255 255 254 0 0 0 48 0 0 0 0 172 255 255 255 +255 255 255 254 0 0 0 255 255 255 0 0 0 0 255 255 +255 255 255 254 0 0 0 255 255 255 255 0 0 0 80 255 +255 255 255 254 0 0 0 255 255 255 255 0 0 0 20 255 +255 255 255 254 0 0 0 255 255 255 255 0 0 0 29 255 +255 255 255 254 0 0 0 255 255 255 106 0 0 0 255 255 +255 255 255 144 0 0 0 100 240 21 0 0 0 251 255 255 +255 255 114 114 114 114 114 114 114 120 210 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 159 159 159 159 159 159 159 162 214 255 255 255 255 255 +255 255 255 180 0 0 0 225 149 0 0 0 0 255 255 255 +255 255 255 254 0 0 0 255 255 255 1 0 0 2 255 255 +255 255 255 255 0 0 0 255 255 255 191 0 0 0 255 255 +255 255 255 255 0 0 0 255 255 255 206 0 0 0 255 255 +255 255 255 255 0 0 0 255 255 255 11 0 0 10 255 255 +255 255 255 255 0 0 0 255 245 16 0 0 102 255 255 255 +255 255 255 255 0 0 0 48 0 0 0 0 153 255 255 255 +255 255 255 255 0 0 0 255 255 255 1 0 0 0 255 255 +255 255 255 255 0 0 0 255 255 255 255 0 0 0 27 255 +255 255 255 255 0 0 0 255 255 255 255 0 0 0 8 255 +255 255 255 255 0 0 0 255 255 255 255 0 0 0 24 255 +255 255 255 254 0 0 0 255 255 255 144 0 0 0 254 255 +255 255 255 183 0 0 0 48 242 24 0 0 0 247 255 255 +255 255 114 114 114 114 114 114 114 120 204 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 159 159 159 159 159 159 159 163 211 255 255 255 255 255 +255 255 255 210 0 0 0 228 160 1 0 0 0 255 255 255 +255 255 255 255 0 0 0 254 255 255 9 0 0 0 255 255 +255 255 255 255 0 0 0 254 255 255 229 0 0 0 255 255 +255 255 255 255 0 0 0 254 255 255 240 0 0 0 255 255 +255 255 255 255 0 0 0 254 255 255 22 0 0 2 255 255 +255 255 255 255 0 0 0 255 247 21 0 0 74 255 255 255 +255 255 255 255 0 0 0 47 0 0 0 0 147 255 255 255 +255 255 255 255 0 0 0 254 255 255 11 0 0 0 255 255 +255 255 255 255 0 0 0 254 255 255 255 0 0 0 23 255 +255 255 255 255 0 0 0 254 255 255 255 0 0 0 0 255 +255 255 255 255 0 0 0 254 255 255 255 0 0 0 16 255 +255 255 255 255 0 0 0 254 255 255 186 0 0 0 254 255 +255 255 255 220 0 0 0 41 245 26 0 0 0 239 255 255 +255 255 114 114 114 114 114 114 114 120 199 255 255 255 255 255 + +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 80 20 29 255 255 255 +255 255 255 25 0 0 18 255 255 0 0 0 0 0 251 255 +255 255 6 0 0 0 0 128 172 0 0 0 0 0 0 255 +255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 255 +255 217 0 0 143 161 0 0 0 0 255 255 255 106 0 210 +255 167 0 255 255 255 255 9 0 255 255 255 255 255 21 120 +255 159 140 255 255 255 255 238 0 255 255 255 255 255 240 114 +255 159 225 255 255 255 255 255 48 255 255 255 255 255 100 114 +255 159 0 0 0 0 0 0 0 0 0 0 0 0 0 114 +255 159 0 0 0 0 0 0 0 0 0 0 0 0 0 114 +255 159 0 0 0 0 0 0 0 0 0 0 0 0 0 114 +255 159 138 254 254 254 254 254 254 254 254 254 254 254 144 114 +255 159 255 255 255 255 255 255 255 255 255 255 255 255 255 114 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 27 8 24 254 255 255 +255 255 255 2 0 0 10 255 255 0 0 0 0 0 247 255 +255 255 0 0 0 0 0 102 153 0 0 0 0 0 0 255 +255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 255 +255 214 0 1 191 206 11 0 0 1 255 255 255 144 0 204 +255 162 0 255 255 255 255 16 0 255 255 255 255 255 24 120 +255 159 149 255 255 255 255 245 0 255 255 255 255 255 242 114 +255 159 225 255 255 255 255 255 48 255 255 255 255 255 48 114 +255 159 0 0 0 0 0 0 0 0 0 0 0 0 0 114 +255 159 0 0 0 0 0 0 0 0 0 0 0 0 0 114 +255 159 0 0 0 0 0 0 0 0 0 0 0 0 0 114 +255 159 180 254 255 255 255 255 255 255 255 255 255 254 183 114 +255 159 255 255 255 255 255 255 255 255 255 255 255 255 255 114 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 23 0 16 254 255 255 +255 255 255 0 0 0 2 255 255 0 0 0 0 0 239 255 +255 255 0 0 0 0 0 74 147 0 0 0 0 0 0 255 +255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 255 +255 211 0 9 229 240 22 0 0 11 255 255 255 186 0 199 +255 163 1 255 255 255 255 21 0 255 255 255 255 255 26 120 +255 159 160 255 255 255 255 247 0 255 255 255 255 255 245 114 +255 159 228 254 254 254 254 255 47 254 254 254 254 254 41 114 +255 159 0 0 0 0 0 0 0 0 0 0 0 0 0 114 +255 159 0 0 0 0 0 0 0 0 0 0 0 0 0 114 +255 159 0 0 0 0 0 0 0 0 0 0 0 0 0 114 +255 159 210 255 255 255 255 255 255 255 255 255 255 255 220 114 +255 159 255 255 255 255 255 255 255 255 255 255 255 255 255 114 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 + +255 255 255 255 255 210 120 114 114 114 114 114 114 114 255 255 +255 255 251 0 0 0 21 240 100 0 0 0 144 255 255 255 +255 255 0 0 0 106 255 255 255 0 0 0 254 255 255 255 +255 29 0 0 0 255 255 255 255 0 0 0 254 255 255 255 +255 20 0 0 0 255 255 255 255 0 0 0 254 255 255 255 +255 80 0 0 0 255 255 255 255 0 0 0 254 255 255 255 +255 255 0 0 0 0 255 255 255 0 0 0 254 255 255 255 +255 255 255 172 0 0 0 0 48 0 0 0 254 255 255 255 +255 255 255 128 0 0 9 238 255 0 0 0 254 255 255 255 +255 255 18 0 0 0 255 255 255 0 0 0 254 255 255 255 +255 255 0 0 0 161 255 255 255 0 0 0 254 255 255 255 +255 255 0 0 0 143 255 255 255 0 0 0 254 255 255 255 +255 255 25 0 0 0 255 255 255 0 0 0 254 255 255 255 +255 255 255 6 0 0 0 140 225 0 0 0 138 255 255 255 +255 255 255 255 255 217 167 159 159 159 159 159 159 159 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 204 120 114 114 114 114 114 114 114 255 255 +255 255 247 0 0 0 24 242 48 0 0 0 183 255 255 255 +255 254 0 0 0 144 255 255 255 0 0 0 254 255 255 255 +255 24 0 0 0 255 255 255 255 0 0 0 255 255 255 255 +255 8 0 0 0 255 255 255 255 0 0 0 255 255 255 255 +255 27 0 0 0 255 255 255 255 0 0 0 255 255 255 255 +255 255 0 0 0 1 255 255 255 0 0 0 255 255 255 255 +255 255 255 153 0 0 0 0 48 0 0 0 255 255 255 255 +255 255 255 102 0 0 16 245 255 0 0 0 255 255 255 255 +255 255 10 0 0 11 255 255 255 0 0 0 255 255 255 255 +255 255 0 0 0 206 255 255 255 0 0 0 255 255 255 255 +255 255 0 0 0 191 255 255 255 0 0 0 255 255 255 255 +255 255 2 0 0 1 255 255 255 0 0 0 254 255 255 255 +255 255 255 0 0 0 0 149 225 0 0 0 180 255 255 255 +255 255 255 255 255 214 162 159 159 159 159 159 159 159 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 199 120 114 114 114 114 114 114 114 255 255 +255 255 239 0 0 0 26 245 41 0 0 0 220 255 255 255 +255 254 0 0 0 186 255 255 254 0 0 0 255 255 255 255 +255 16 0 0 0 255 255 255 254 0 0 0 255 255 255 255 +255 0 0 0 0 255 255 255 254 0 0 0 255 255 255 255 +255 23 0 0 0 255 255 255 254 0 0 0 255 255 255 255 +255 255 0 0 0 11 255 255 254 0 0 0 255 255 255 255 +255 255 255 147 0 0 0 0 47 0 0 0 255 255 255 255 +255 255 255 74 0 0 21 247 255 0 0 0 255 255 255 255 +255 255 2 0 0 22 255 255 254 0 0 0 255 255 255 255 +255 255 0 0 0 240 255 255 254 0 0 0 255 255 255 255 +255 255 0 0 0 229 255 255 254 0 0 0 255 255 255 255 +255 255 0 0 0 9 255 255 254 0 0 0 255 255 255 255 +255 255 255 0 0 0 1 160 228 0 0 0 210 255 255 255 +255 255 255 255 255 211 163 159 159 159 159 159 159 159 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 + +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +114 255 255 255 255 255 255 255 255 255 255 255 255 255 159 255 +114 144 254 254 254 254 254 254 254 254 254 254 254 138 159 255 +114 0 0 0 0 0 0 0 0 0 0 0 0 0 159 255 +114 0 0 0 0 0 0 0 0 0 0 0 0 0 159 255 +114 0 0 0 0 0 0 0 0 0 0 0 0 0 159 255 +114 100 255 255 255 255 255 48 255 255 255 255 255 225 159 255 +114 240 255 255 255 255 255 0 238 255 255 255 255 140 159 255 +120 21 255 255 255 255 255 0 9 255 255 255 255 0 167 255 +210 0 106 255 255 255 0 0 0 0 161 143 0 0 217 255 +255 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 +255 0 0 0 0 0 0 172 128 0 0 0 0 6 255 255 +255 251 0 0 0 0 0 255 255 18 0 0 25 255 255 255 +255 255 255 29 20 80 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +114 255 255 255 255 255 255 255 255 255 255 255 255 255 159 255 +114 183 254 255 255 255 255 255 255 255 255 255 254 180 159 255 +114 0 0 0 0 0 0 0 0 0 0 0 0 0 159 255 +114 0 0 0 0 0 0 0 0 0 0 0 0 0 159 255 +114 0 0 0 0 0 0 0 0 0 0 0 0 0 159 255 +114 48 255 255 255 255 255 48 255 255 255 255 255 225 159 255 +114 242 255 255 255 255 255 0 245 255 255 255 255 149 159 255 +120 24 255 255 255 255 255 0 16 255 255 255 255 0 162 255 +204 0 144 255 255 255 1 0 0 11 206 191 1 0 214 255 +255 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 +255 0 0 0 0 0 0 153 102 0 0 0 0 0 255 255 +255 247 0 0 0 0 0 255 255 10 0 0 2 255 255 255 +255 255 254 24 8 27 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +114 255 255 255 255 255 255 255 255 255 255 255 255 255 159 255 +114 220 255 255 255 255 255 255 255 255 255 255 255 210 159 255 +114 0 0 0 0 0 0 0 0 0 0 0 0 0 159 255 +114 0 0 0 0 0 0 0 0 0 0 0 0 0 159 255 +114 0 0 0 0 0 0 0 0 0 0 0 0 0 159 255 +114 41 254 254 254 254 254 47 255 254 254 254 254 228 159 255 +114 245 255 255 255 255 255 0 247 255 255 255 255 160 159 255 +120 26 255 255 255 255 255 0 21 255 255 255 255 1 163 255 +199 0 186 255 255 255 11 0 0 22 240 229 9 0 211 255 +255 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 +255 0 0 0 0 0 0 147 74 0 0 0 0 0 255 255 +255 239 0 0 0 0 0 255 255 2 0 0 0 255 255 255 +255 255 254 16 0 23 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 diff --git a/1_Three.js/6_AR/data/letterC.patt b/1_Three.js/6_AR/data/letterC.patt new file mode 100755 index 0000000000000000000000000000000000000000..94231295bd9102d2440b13a343e05dbab3e3cfe5 --- /dev/null +++ b/1_Three.js/6_AR/data/letterC.patt @@ -0,0 +1,195 @@ +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 204 0 0 0 0 0 239 255 32 255 255 +255 255 255 251 0 0 0 219 255 255 238 0 0 0 255 255 +255 255 231 0 0 0 255 255 255 255 255 255 4 0 255 255 +255 255 0 0 0 251 255 255 255 255 255 255 255 0 255 255 +255 53 0 0 0 255 255 255 255 255 255 255 255 25 255 255 +255 0 0 0 39 255 255 255 255 255 255 255 255 255 255 255 +255 0 0 0 110 255 255 255 255 255 255 255 255 255 255 255 +254 0 0 0 108 255 255 255 255 255 255 255 255 255 255 255 +255 0 0 0 46 255 255 255 255 255 255 255 255 255 255 255 +255 0 0 0 16 255 255 255 255 255 255 255 255 255 255 255 +255 15 0 0 0 255 255 255 255 255 255 255 255 255 255 255 +255 255 0 0 0 195 255 255 255 255 255 255 255 0 255 255 +255 255 237 0 0 0 254 255 255 255 255 255 0 164 255 255 +255 255 255 254 9 0 0 4 147 128 4 0 245 255 255 255 +255 255 255 255 255 255 209 137 128 165 252 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 213 0 0 0 0 0 234 255 57 255 255 +255 255 255 255 0 0 0 211 255 255 243 0 0 0 255 255 +255 255 246 0 0 0 255 255 255 255 255 255 9 0 255 255 +255 255 0 0 0 240 255 255 255 255 255 255 255 0 255 255 +255 96 0 0 0 255 255 255 255 255 255 255 255 66 255 255 +255 0 0 0 31 255 255 255 255 255 255 255 255 255 255 255 +255 0 0 0 42 255 255 255 255 255 255 255 255 255 255 255 +255 0 0 0 41 255 255 255 255 255 255 255 255 255 255 255 +255 0 0 0 38 255 255 255 255 255 255 255 255 255 255 255 +255 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 +255 74 0 0 0 255 255 255 255 255 255 255 255 255 255 255 +255 255 0 0 0 175 255 255 255 255 255 255 255 0 255 255 +255 255 250 0 0 0 245 255 255 255 255 255 0 136 255 255 +255 255 255 254 12 0 0 3 142 134 4 0 240 255 255 255 +255 255 255 255 255 255 214 140 128 162 249 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 219 0 0 0 0 0 228 255 91 255 255 +255 255 255 255 0 0 0 202 255 255 248 0 0 0 255 255 +255 255 252 0 0 0 255 255 255 255 255 255 48 0 255 255 +255 255 0 0 0 224 255 255 255 255 255 255 255 0 255 255 +255 130 0 0 0 255 255 255 255 255 255 255 255 95 255 255 +255 0 0 0 20 255 255 255 255 255 255 255 255 255 255 255 +255 0 0 0 35 255 255 255 255 255 255 255 255 255 255 255 +255 0 0 0 35 255 255 255 255 255 255 255 255 255 255 255 +255 0 0 0 27 255 255 255 255 255 255 255 255 255 255 255 +255 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 +255 114 0 0 0 255 255 255 255 255 255 255 255 255 255 255 +255 255 0 0 0 134 255 255 255 255 255 255 255 2 255 255 +255 255 252 0 0 0 232 255 255 255 255 255 0 101 255 255 +255 255 255 255 16 0 0 2 136 140 5 0 228 255 255 255 +255 255 255 255 255 255 219 144 129 159 245 255 255 255 255 255 + +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 32 0 0 0 25 255 255 255 255 255 255 0 164 255 255 +255 255 0 4 255 255 255 255 255 255 255 255 255 0 245 255 +255 239 0 255 255 255 255 255 255 255 255 255 255 255 0 255 +255 0 238 255 255 255 255 255 255 255 255 255 255 255 4 252 +255 0 255 255 255 255 255 255 255 255 255 255 255 255 128 165 +255 0 255 255 255 255 255 255 255 255 255 255 255 255 147 128 +255 0 219 255 255 255 255 255 255 255 255 255 255 255 4 137 +255 0 0 255 255 255 255 255 255 255 255 255 255 254 0 209 +255 204 0 0 251 255 255 255 255 255 255 255 195 0 0 255 +255 255 0 0 0 0 39 110 108 46 16 0 0 0 9 255 +255 255 251 0 0 0 0 0 0 0 0 0 0 0 254 255 +255 255 255 231 0 0 0 0 0 0 0 0 0 237 255 255 +255 255 255 255 255 53 0 0 0 0 0 15 255 255 255 255 +255 255 255 255 255 255 255 255 254 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 57 0 0 0 66 255 255 255 255 255 255 0 136 255 255 +255 255 0 9 255 255 255 255 255 255 255 255 255 0 240 255 +255 234 0 255 255 255 255 255 255 255 255 255 255 255 0 255 +255 0 243 255 255 255 255 255 255 255 255 255 255 255 4 249 +255 0 255 255 255 255 255 255 255 255 255 255 255 255 134 162 +255 0 255 255 255 255 255 255 255 255 255 255 255 255 142 128 +255 0 211 255 255 255 255 255 255 255 255 255 255 255 3 140 +255 0 0 255 255 255 255 255 255 255 255 255 255 245 0 214 +255 213 0 0 240 255 255 255 255 255 255 255 175 0 0 255 +255 255 0 0 0 0 31 42 41 38 0 0 0 0 12 255 +255 255 255 0 0 0 0 0 0 0 0 0 0 0 254 255 +255 255 255 246 0 0 0 0 0 0 0 0 0 250 255 255 +255 255 255 255 255 96 0 0 0 0 0 74 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 91 0 0 0 95 255 255 255 255 255 255 2 101 255 255 +255 255 0 48 255 255 255 255 255 255 255 255 255 0 228 255 +255 228 0 255 255 255 255 255 255 255 255 255 255 255 0 255 +255 0 248 255 255 255 255 255 255 255 255 255 255 255 5 245 +255 0 255 255 255 255 255 255 255 255 255 255 255 255 140 159 +255 0 255 255 255 255 255 255 255 255 255 255 255 255 136 129 +255 0 202 255 255 255 255 255 255 255 255 255 255 255 2 144 +255 0 0 255 255 255 255 255 255 255 255 255 255 232 0 219 +255 219 0 0 224 255 255 255 255 255 255 255 134 0 0 255 +255 255 0 0 0 0 20 35 35 27 0 0 0 0 16 255 +255 255 255 0 0 0 0 0 0 0 0 0 0 0 255 255 +255 255 255 252 0 0 0 0 0 0 0 0 0 252 255 255 +255 255 255 255 255 130 0 0 0 0 0 114 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 + +255 255 255 255 255 252 165 128 137 209 255 255 255 255 255 255 +255 255 255 245 0 4 128 147 4 0 0 9 254 255 255 255 +255 255 164 0 255 255 255 255 255 254 0 0 0 237 255 255 +255 255 0 255 255 255 255 255 255 255 195 0 0 0 255 255 +255 255 255 255 255 255 255 255 255 255 255 0 0 0 15 255 +255 255 255 255 255 255 255 255 255 255 255 16 0 0 0 255 +255 255 255 255 255 255 255 255 255 255 255 46 0 0 0 255 +255 255 255 255 255 255 255 255 255 255 255 108 0 0 0 254 +255 255 255 255 255 255 255 255 255 255 255 110 0 0 0 255 +255 255 255 255 255 255 255 255 255 255 255 39 0 0 0 255 +255 255 25 255 255 255 255 255 255 255 255 0 0 0 53 255 +255 255 0 255 255 255 255 255 255 255 251 0 0 0 255 255 +255 255 0 4 255 255 255 255 255 255 0 0 0 231 255 255 +255 255 0 0 0 238 255 255 219 0 0 0 251 255 255 255 +255 255 32 255 239 0 0 0 0 0 204 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 249 162 128 140 214 255 255 255 255 255 255 +255 255 255 240 0 4 134 142 3 0 0 12 254 255 255 255 +255 255 136 0 255 255 255 255 255 245 0 0 0 250 255 255 +255 255 0 255 255 255 255 255 255 255 175 0 0 0 255 255 +255 255 255 255 255 255 255 255 255 255 255 0 0 0 74 255 +255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 255 +255 255 255 255 255 255 255 255 255 255 255 38 0 0 0 255 +255 255 255 255 255 255 255 255 255 255 255 41 0 0 0 255 +255 255 255 255 255 255 255 255 255 255 255 42 0 0 0 255 +255 255 255 255 255 255 255 255 255 255 255 31 0 0 0 255 +255 255 66 255 255 255 255 255 255 255 255 0 0 0 96 255 +255 255 0 255 255 255 255 255 255 255 240 0 0 0 255 255 +255 255 0 9 255 255 255 255 255 255 0 0 0 246 255 255 +255 255 0 0 0 243 255 255 211 0 0 0 255 255 255 255 +255 255 57 255 234 0 0 0 0 0 213 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 245 159 129 144 219 255 255 255 255 255 255 +255 255 255 228 0 5 140 136 2 0 0 16 255 255 255 255 +255 255 101 0 255 255 255 255 255 232 0 0 0 252 255 255 +255 255 2 255 255 255 255 255 255 255 134 0 0 0 255 255 +255 255 255 255 255 255 255 255 255 255 255 0 0 0 114 255 +255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 255 +255 255 255 255 255 255 255 255 255 255 255 27 0 0 0 255 +255 255 255 255 255 255 255 255 255 255 255 35 0 0 0 255 +255 255 255 255 255 255 255 255 255 255 255 35 0 0 0 255 +255 255 255 255 255 255 255 255 255 255 255 20 0 0 0 255 +255 255 95 255 255 255 255 255 255 255 255 0 0 0 130 255 +255 255 0 255 255 255 255 255 255 255 224 0 0 0 255 255 +255 255 0 48 255 255 255 255 255 255 0 0 0 252 255 255 +255 255 0 0 0 248 255 255 202 0 0 0 255 255 255 255 +255 255 91 255 228 0 0 0 0 0 219 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 + +255 255 255 255 255 255 255 254 255 255 255 255 255 255 255 255 +255 255 255 255 15 0 0 0 0 0 53 255 255 255 255 255 +255 255 237 0 0 0 0 0 0 0 0 0 231 255 255 255 +255 254 0 0 0 0 0 0 0 0 0 0 0 251 255 255 +255 9 0 0 0 16 46 108 110 39 0 0 0 0 255 255 +255 0 0 195 255 255 255 255 255 255 255 251 0 0 204 255 +209 0 254 255 255 255 255 255 255 255 255 255 255 0 0 255 +137 4 255 255 255 255 255 255 255 255 255 255 255 219 0 255 +128 147 255 255 255 255 255 255 255 255 255 255 255 255 0 255 +165 128 255 255 255 255 255 255 255 255 255 255 255 255 0 255 +252 4 255 255 255 255 255 255 255 255 255 255 255 238 0 255 +255 0 255 255 255 255 255 255 255 255 255 255 255 0 239 255 +255 245 0 255 255 255 255 255 255 255 255 255 4 0 255 255 +255 255 164 0 255 255 255 255 255 255 25 0 0 0 32 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 74 0 0 0 0 0 96 255 255 255 255 255 +255 255 250 0 0 0 0 0 0 0 0 0 246 255 255 255 +255 254 0 0 0 0 0 0 0 0 0 0 0 255 255 255 +255 12 0 0 0 0 38 41 42 31 0 0 0 0 255 255 +255 0 0 175 255 255 255 255 255 255 255 240 0 0 213 255 +214 0 245 255 255 255 255 255 255 255 255 255 255 0 0 255 +140 3 255 255 255 255 255 255 255 255 255 255 255 211 0 255 +128 142 255 255 255 255 255 255 255 255 255 255 255 255 0 255 +162 134 255 255 255 255 255 255 255 255 255 255 255 255 0 255 +249 4 255 255 255 255 255 255 255 255 255 255 255 243 0 255 +255 0 255 255 255 255 255 255 255 255 255 255 255 0 234 255 +255 240 0 255 255 255 255 255 255 255 255 255 9 0 255 255 +255 255 136 0 255 255 255 255 255 255 66 0 0 0 57 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 114 0 0 0 0 0 130 255 255 255 255 255 +255 255 252 0 0 0 0 0 0 0 0 0 252 255 255 255 +255 255 0 0 0 0 0 0 0 0 0 0 0 255 255 255 +255 16 0 0 0 0 27 35 35 20 0 0 0 0 255 255 +255 0 0 134 255 255 255 255 255 255 255 224 0 0 219 255 +219 0 232 255 255 255 255 255 255 255 255 255 255 0 0 255 +144 2 255 255 255 255 255 255 255 255 255 255 255 202 0 255 +129 136 255 255 255 255 255 255 255 255 255 255 255 255 0 255 +159 140 255 255 255 255 255 255 255 255 255 255 255 255 0 255 +245 5 255 255 255 255 255 255 255 255 255 255 255 248 0 255 +255 0 255 255 255 255 255 255 255 255 255 255 255 0 228 255 +255 228 0 255 255 255 255 255 255 255 255 255 48 0 255 255 +255 255 101 2 255 255 255 255 255 255 95 0 0 0 91 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 diff --git a/1_Three.js/6_AR/data/letterD.patt b/1_Three.js/6_AR/data/letterD.patt new file mode 100755 index 0000000000000000000000000000000000000000..35aae3ef2114648737fed3516df3b218e96f391f --- /dev/null +++ b/1_Three.js/6_AR/data/letterD.patt @@ -0,0 +1,195 @@ +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 86 86 86 86 86 86 86 141 233 255 255 255 255 255 255 +255 255 252 0 0 0 222 228 50 0 0 0 255 255 255 255 +255 255 255 0 0 0 223 255 255 251 0 0 0 255 255 255 +255 255 255 0 0 0 223 255 255 255 101 0 0 0 255 255 +255 255 255 0 0 0 223 255 255 255 255 0 0 0 215 255 +255 255 255 0 0 0 223 255 255 255 255 0 0 0 0 255 +255 255 255 0 0 0 223 255 255 255 255 0 0 0 0 255 +255 255 255 0 0 0 223 255 255 255 255 0 0 0 0 255 +255 255 255 0 0 0 223 255 255 255 255 0 0 0 0 255 +255 255 255 0 0 0 223 255 255 255 255 0 0 0 2 255 +255 255 255 0 0 0 223 255 255 255 255 0 0 0 234 255 +255 255 255 0 0 0 223 255 255 255 144 0 0 1 255 255 +255 255 255 0 0 0 223 255 255 255 0 0 0 255 255 255 +255 255 224 0 0 0 0 157 63 0 0 82 255 255 255 255 +255 231 231 231 231 231 231 231 239 254 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 86 86 86 86 86 86 86 133 226 255 255 255 255 255 255 +255 255 254 0 0 0 188 232 53 0 0 0 255 255 255 255 +255 255 255 0 0 0 192 255 255 255 0 0 0 254 255 255 +255 255 255 0 0 0 192 255 255 255 146 0 0 0 255 255 +255 255 255 0 0 0 192 255 255 255 255 0 0 0 187 255 +255 255 255 0 0 0 192 255 255 255 255 0 0 0 0 255 +255 255 255 0 0 0 192 255 255 255 255 0 0 0 0 255 +255 255 255 0 0 0 192 255 255 255 255 10 0 0 0 255 +255 255 255 0 0 0 192 255 255 255 255 0 0 0 0 255 +255 255 255 0 0 0 192 255 255 255 255 0 0 0 0 255 +255 255 255 0 0 0 192 255 255 255 255 0 0 0 215 255 +255 255 255 0 0 0 192 255 255 255 181 0 0 0 255 255 +255 255 255 0 0 0 192 255 255 255 0 0 0 255 255 255 +255 255 237 0 0 0 0 160 75 0 0 77 255 255 255 255 +255 231 231 231 231 231 231 231 238 253 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 84 86 86 86 86 86 86 130 223 255 255 255 255 255 255 +255 255 255 0 0 0 155 233 59 0 0 0 254 255 255 255 +255 255 255 0 0 0 160 255 255 255 0 0 0 254 255 255 +255 255 255 0 0 0 160 255 255 255 184 0 0 0 255 255 +255 255 255 0 0 0 160 255 255 255 255 0 0 0 157 255 +255 255 255 0 0 0 160 255 255 255 255 0 0 0 0 255 +255 255 255 0 0 0 160 255 255 255 255 13 0 0 0 255 +255 255 255 0 0 0 160 255 255 255 255 23 0 0 0 255 +255 255 255 0 0 0 160 255 255 255 255 13 0 0 0 255 +255 255 255 0 0 0 160 255 255 255 255 0 0 0 0 255 +255 255 255 0 0 0 160 255 255 255 255 0 0 0 192 255 +255 255 255 0 0 0 160 255 255 255 211 0 0 0 255 255 +255 255 255 0 0 0 160 255 255 255 0 0 0 255 255 255 +255 255 250 0 0 0 0 160 91 0 0 68 255 255 255 255 +255 230 231 231 231 231 231 231 238 252 255 255 255 255 255 255 + +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 215 0 0 0 0 2 234 255 255 255 255 +255 255 255 255 0 0 0 0 0 0 0 0 1 255 255 255 +255 255 255 0 0 0 0 0 0 0 0 0 0 0 255 255 +255 255 0 0 0 0 0 0 0 0 0 0 0 0 82 255 +255 255 0 0 101 255 255 255 255 255 255 255 144 0 0 255 +255 233 0 251 255 255 255 255 255 255 255 255 255 255 0 254 +255 141 50 255 255 255 255 255 255 255 255 255 255 255 63 239 +255 86 228 255 255 255 255 255 255 255 255 255 255 255 157 231 +255 86 222 223 223 223 223 223 223 223 223 223 223 223 0 231 +255 86 0 0 0 0 0 0 0 0 0 0 0 0 0 231 +255 86 0 0 0 0 0 0 0 0 0 0 0 0 0 231 +255 86 0 0 0 0 0 0 0 0 0 0 0 0 0 231 +255 86 252 255 255 255 255 255 255 255 255 255 255 255 224 231 +255 86 255 255 255 255 255 255 255 255 255 255 255 255 255 231 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 187 0 0 0 0 0 215 255 255 255 255 +255 255 255 254 0 0 0 0 0 0 0 0 0 255 255 255 +255 255 255 0 0 0 0 0 0 0 0 0 0 0 255 255 +255 255 0 0 0 0 0 0 10 0 0 0 0 0 77 255 +255 255 0 0 146 255 255 255 255 255 255 255 181 0 0 255 +255 226 0 255 255 255 255 255 255 255 255 255 255 255 0 253 +255 133 53 255 255 255 255 255 255 255 255 255 255 255 75 238 +255 86 232 255 255 255 255 255 255 255 255 255 255 255 160 231 +255 86 188 192 192 192 192 192 192 192 192 192 192 192 0 231 +255 86 0 0 0 0 0 0 0 0 0 0 0 0 0 231 +255 86 0 0 0 0 0 0 0 0 0 0 0 0 0 231 +255 86 0 0 0 0 0 0 0 0 0 0 0 0 0 231 +255 86 254 255 255 255 255 255 255 255 255 255 255 255 237 231 +255 86 255 255 255 255 255 255 255 255 255 255 255 255 255 231 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 157 0 0 0 0 0 192 255 255 255 255 +255 255 255 254 0 0 0 0 0 0 0 0 0 255 255 255 +255 255 254 0 0 0 0 0 0 0 0 0 0 0 255 255 +255 255 0 0 0 0 0 13 23 13 0 0 0 0 68 255 +255 255 0 0 184 255 255 255 255 255 255 255 211 0 0 255 +255 223 0 255 255 255 255 255 255 255 255 255 255 255 0 252 +255 130 59 255 255 255 255 255 255 255 255 255 255 255 91 238 +255 86 233 255 255 255 255 255 255 255 255 255 255 255 160 231 +255 86 155 160 160 160 160 160 160 160 160 160 160 160 0 231 +255 86 0 0 0 0 0 0 0 0 0 0 0 0 0 231 +255 86 0 0 0 0 0 0 0 0 0 0 0 0 0 231 +255 86 0 0 0 0 0 0 0 0 0 0 0 0 0 231 +255 86 255 255 255 255 255 255 255 255 255 255 255 255 250 231 +255 84 255 255 255 255 255 255 255 255 255 255 255 255 255 230 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 + +255 255 255 255 255 255 254 239 231 231 231 231 231 231 231 255 +255 255 255 255 82 0 0 63 157 0 0 0 0 224 255 255 +255 255 255 0 0 0 255 255 255 223 0 0 0 255 255 255 +255 255 1 0 0 144 255 255 255 223 0 0 0 255 255 255 +255 234 0 0 0 255 255 255 255 223 0 0 0 255 255 255 +255 2 0 0 0 255 255 255 255 223 0 0 0 255 255 255 +255 0 0 0 0 255 255 255 255 223 0 0 0 255 255 255 +255 0 0 0 0 255 255 255 255 223 0 0 0 255 255 255 +255 0 0 0 0 255 255 255 255 223 0 0 0 255 255 255 +255 0 0 0 0 255 255 255 255 223 0 0 0 255 255 255 +255 215 0 0 0 255 255 255 255 223 0 0 0 255 255 255 +255 255 0 0 0 101 255 255 255 223 0 0 0 255 255 255 +255 255 255 0 0 0 251 255 255 223 0 0 0 255 255 255 +255 255 255 255 0 0 0 50 228 222 0 0 0 252 255 255 +255 255 255 255 255 255 233 141 86 86 86 86 86 86 86 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 253 238 231 231 231 231 231 231 231 255 +255 255 255 255 77 0 0 75 160 0 0 0 0 237 255 255 +255 255 255 0 0 0 255 255 255 192 0 0 0 255 255 255 +255 255 0 0 0 181 255 255 255 192 0 0 0 255 255 255 +255 215 0 0 0 255 255 255 255 192 0 0 0 255 255 255 +255 0 0 0 0 255 255 255 255 192 0 0 0 255 255 255 +255 0 0 0 0 255 255 255 255 192 0 0 0 255 255 255 +255 0 0 0 10 255 255 255 255 192 0 0 0 255 255 255 +255 0 0 0 0 255 255 255 255 192 0 0 0 255 255 255 +255 0 0 0 0 255 255 255 255 192 0 0 0 255 255 255 +255 187 0 0 0 255 255 255 255 192 0 0 0 255 255 255 +255 255 0 0 0 146 255 255 255 192 0 0 0 255 255 255 +255 255 254 0 0 0 255 255 255 192 0 0 0 255 255 255 +255 255 255 255 0 0 0 53 232 188 0 0 0 254 255 255 +255 255 255 255 255 255 226 133 86 86 86 86 86 86 86 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 252 238 231 231 231 231 231 231 230 255 +255 255 255 255 68 0 0 91 160 0 0 0 0 250 255 255 +255 255 255 0 0 0 255 255 255 160 0 0 0 255 255 255 +255 255 0 0 0 211 255 255 255 160 0 0 0 255 255 255 +255 192 0 0 0 255 255 255 255 160 0 0 0 255 255 255 +255 0 0 0 0 255 255 255 255 160 0 0 0 255 255 255 +255 0 0 0 13 255 255 255 255 160 0 0 0 255 255 255 +255 0 0 0 23 255 255 255 255 160 0 0 0 255 255 255 +255 0 0 0 13 255 255 255 255 160 0 0 0 255 255 255 +255 0 0 0 0 255 255 255 255 160 0 0 0 255 255 255 +255 157 0 0 0 255 255 255 255 160 0 0 0 255 255 255 +255 255 0 0 0 184 255 255 255 160 0 0 0 255 255 255 +255 255 254 0 0 0 255 255 255 160 0 0 0 255 255 255 +255 255 255 254 0 0 0 59 233 155 0 0 0 255 255 255 +255 255 255 255 255 255 223 130 86 86 86 86 86 86 84 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 + +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +231 255 255 255 255 255 255 255 255 255 255 255 255 255 86 255 +231 224 255 255 255 255 255 255 255 255 255 255 255 252 86 255 +231 0 0 0 0 0 0 0 0 0 0 0 0 0 86 255 +231 0 0 0 0 0 0 0 0 0 0 0 0 0 86 255 +231 0 0 0 0 0 0 0 0 0 0 0 0 0 86 255 +231 0 223 223 223 223 223 223 223 223 223 223 223 222 86 255 +231 157 255 255 255 255 255 255 255 255 255 255 255 228 86 255 +239 63 255 255 255 255 255 255 255 255 255 255 255 50 141 255 +254 0 255 255 255 255 255 255 255 255 255 255 251 0 233 255 +255 0 0 144 255 255 255 255 255 255 255 101 0 0 255 255 +255 82 0 0 0 0 0 0 0 0 0 0 0 0 255 255 +255 255 0 0 0 0 0 0 0 0 0 0 0 255 255 255 +255 255 255 1 0 0 0 0 0 0 0 0 255 255 255 255 +255 255 255 255 234 2 0 0 0 0 215 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +231 255 255 255 255 255 255 255 255 255 255 255 255 255 86 255 +231 237 255 255 255 255 255 255 255 255 255 255 255 254 86 255 +231 0 0 0 0 0 0 0 0 0 0 0 0 0 86 255 +231 0 0 0 0 0 0 0 0 0 0 0 0 0 86 255 +231 0 0 0 0 0 0 0 0 0 0 0 0 0 86 255 +231 0 192 192 192 192 192 192 192 192 192 192 192 188 86 255 +231 160 255 255 255 255 255 255 255 255 255 255 255 232 86 255 +238 75 255 255 255 255 255 255 255 255 255 255 255 53 133 255 +253 0 255 255 255 255 255 255 255 255 255 255 255 0 226 255 +255 0 0 181 255 255 255 255 255 255 255 146 0 0 255 255 +255 77 0 0 0 0 0 10 0 0 0 0 0 0 255 255 +255 255 0 0 0 0 0 0 0 0 0 0 0 255 255 255 +255 255 255 0 0 0 0 0 0 0 0 0 254 255 255 255 +255 255 255 255 215 0 0 0 0 0 187 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +230 255 255 255 255 255 255 255 255 255 255 255 255 255 84 255 +231 250 255 255 255 255 255 255 255 255 255 255 255 255 86 255 +231 0 0 0 0 0 0 0 0 0 0 0 0 0 86 255 +231 0 0 0 0 0 0 0 0 0 0 0 0 0 86 255 +231 0 0 0 0 0 0 0 0 0 0 0 0 0 86 255 +231 0 160 160 160 160 160 160 160 160 160 160 160 155 86 255 +231 160 255 255 255 255 255 255 255 255 255 255 255 233 86 255 +238 91 255 255 255 255 255 255 255 255 255 255 255 59 130 255 +252 0 255 255 255 255 255 255 255 255 255 255 255 0 223 255 +255 0 0 211 255 255 255 255 255 255 255 184 0 0 255 255 +255 68 0 0 0 0 13 23 13 0 0 0 0 0 255 255 +255 255 0 0 0 0 0 0 0 0 0 0 0 254 255 255 +255 255 255 0 0 0 0 0 0 0 0 0 254 255 255 255 +255 255 255 255 192 0 0 0 0 0 157 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 diff --git a/1_Three.js/6_AR/data/letterF.patt b/1_Three.js/6_AR/data/letterF.patt new file mode 100755 index 0000000000000000000000000000000000000000..e9af06b35eacdd9c0ccb75be896a27a827f32f54 --- /dev/null +++ b/1_Three.js/6_AR/data/letterF.patt @@ -0,0 +1,195 @@ +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 253 3 0 0 0 24 24 22 7 0 0 172 255 255 +255 255 255 210 0 0 0 255 255 255 255 255 0 172 255 255 +255 255 255 233 0 0 0 255 255 255 255 255 240 172 255 255 +255 255 255 233 0 0 0 255 255 255 28 255 255 168 255 255 +255 255 255 233 0 0 0 255 255 255 0 255 255 255 255 255 +255 255 255 233 0 0 0 255 255 76 0 255 255 255 255 255 +255 255 255 233 0 0 0 0 0 0 0 255 255 255 255 255 +255 255 255 233 0 0 0 255 255 0 0 255 255 255 255 255 +255 255 255 233 0 0 0 255 255 255 0 255 255 255 255 255 +255 255 255 233 0 0 0 255 255 255 5 255 255 255 255 255 +255 255 255 233 0 0 0 255 255 255 255 255 255 255 255 255 +255 255 255 234 0 0 0 255 255 255 255 255 255 255 255 255 +255 255 255 96 0 0 0 253 255 255 255 255 255 255 255 255 +255 247 48 48 48 48 48 48 48 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 254 5 0 0 0 25 24 22 8 0 0 124 255 255 +255 255 255 242 0 0 0 255 255 255 255 255 0 124 255 255 +255 255 255 255 0 0 0 255 255 255 255 255 251 124 255 255 +255 255 255 255 0 0 0 255 255 255 47 255 255 127 255 255 +255 255 255 255 0 0 0 255 255 255 0 255 255 255 255 255 +255 255 255 255 0 0 0 255 255 113 0 255 255 255 255 255 +255 255 255 255 0 0 0 0 0 0 0 255 255 255 255 255 +255 255 255 255 0 0 0 255 255 0 0 255 255 255 255 255 +255 255 255 255 0 0 0 255 255 255 0 255 255 255 255 255 +255 255 255 255 0 0 0 255 255 255 27 255 255 255 255 255 +255 255 255 255 0 0 0 255 255 255 255 255 255 255 255 255 +255 255 255 255 0 0 0 255 255 255 255 255 255 255 255 255 +255 255 255 131 0 0 0 249 255 255 255 255 255 255 255 255 +255 255 48 48 48 48 48 48 48 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 254 44 0 0 0 24 24 22 9 0 0 104 255 255 +255 255 255 255 0 0 0 255 255 255 255 255 0 104 255 255 +255 255 255 255 0 0 0 255 255 255 255 255 253 104 255 255 +255 255 255 255 0 0 0 255 255 255 59 255 255 105 255 255 +255 255 255 255 0 0 0 255 255 255 0 255 255 255 255 255 +255 255 255 255 0 0 0 255 255 144 0 255 255 255 255 255 +255 255 255 255 0 0 0 0 0 0 0 255 255 255 255 255 +255 255 255 255 0 0 0 255 255 29 0 255 255 255 255 255 +255 255 255 255 0 0 0 255 255 255 0 255 255 255 255 255 +255 255 255 255 0 0 0 255 255 255 47 255 255 255 255 255 +255 255 255 255 0 0 0 255 255 255 255 255 255 255 255 255 +255 255 255 255 0 0 0 255 255 255 255 255 255 255 255 255 +255 255 255 155 0 0 0 238 255 255 255 255 255 255 255 255 +255 255 48 48 48 48 48 48 48 255 255 255 255 255 255 255 + +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 172 172 172 168 255 255 255 255 255 255 255 255 255 255 +255 255 0 0 240 255 255 255 255 255 255 255 255 255 255 255 +255 255 0 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 7 255 255 28 0 0 0 0 0 5 255 255 255 255 +255 255 22 255 255 255 255 76 0 0 255 255 255 255 255 255 +255 255 24 255 255 255 255 255 0 255 255 255 255 255 255 48 +255 255 24 255 255 255 255 255 0 255 255 255 255 255 253 48 +255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 48 +255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 48 +255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 48 +255 255 3 210 233 233 233 233 233 233 233 233 233 234 96 48 +255 255 253 255 255 255 255 255 255 255 255 255 255 255 255 48 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 247 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 124 124 124 127 255 255 255 255 255 255 255 255 255 255 +255 255 0 0 251 255 255 255 255 255 255 255 255 255 255 255 +255 255 0 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 8 255 255 47 0 0 0 0 0 27 255 255 255 255 +255 255 22 255 255 255 255 113 0 0 255 255 255 255 255 255 +255 255 24 255 255 255 255 255 0 255 255 255 255 255 255 48 +255 255 25 255 255 255 255 255 0 255 255 255 255 255 249 48 +255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 48 +255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 48 +255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 48 +255 255 5 242 255 255 255 255 255 255 255 255 255 255 131 48 +255 255 254 255 255 255 255 255 255 255 255 255 255 255 255 48 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 104 104 104 105 255 255 255 255 255 255 255 255 255 255 +255 255 0 0 253 255 255 255 255 255 255 255 255 255 255 255 +255 255 0 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 9 255 255 59 0 0 0 0 0 47 255 255 255 255 +255 255 22 255 255 255 255 144 0 29 255 255 255 255 255 255 +255 255 24 255 255 255 255 255 0 255 255 255 255 255 255 48 +255 255 24 255 255 255 255 255 0 255 255 255 255 255 238 48 +255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 48 +255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 48 +255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 48 +255 255 44 255 255 255 255 255 255 255 255 255 255 255 155 48 +255 255 254 255 255 255 255 255 255 255 255 255 255 255 255 48 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 + +255 255 255 255 255 255 255 48 48 48 48 48 48 48 247 255 +255 255 255 255 255 255 255 255 253 0 0 0 96 255 255 255 +255 255 255 255 255 255 255 255 255 0 0 0 234 255 255 255 +255 255 255 255 255 255 255 255 255 0 0 0 233 255 255 255 +255 255 255 255 255 5 255 255 255 0 0 0 233 255 255 255 +255 255 255 255 255 0 255 255 255 0 0 0 233 255 255 255 +255 255 255 255 255 0 0 255 255 0 0 0 233 255 255 255 +255 255 255 255 255 0 0 0 0 0 0 0 233 255 255 255 +255 255 255 255 255 0 76 255 255 0 0 0 233 255 255 255 +255 255 255 255 255 0 255 255 255 0 0 0 233 255 255 255 +255 255 168 255 255 28 255 255 255 0 0 0 233 255 255 255 +255 255 172 240 255 255 255 255 255 0 0 0 233 255 255 255 +255 255 172 0 255 255 255 255 255 0 0 0 210 255 255 255 +255 255 172 0 0 7 22 24 24 0 0 0 3 253 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 48 48 48 48 48 48 48 255 255 +255 255 255 255 255 255 255 255 249 0 0 0 131 255 255 255 +255 255 255 255 255 255 255 255 255 0 0 0 255 255 255 255 +255 255 255 255 255 255 255 255 255 0 0 0 255 255 255 255 +255 255 255 255 255 27 255 255 255 0 0 0 255 255 255 255 +255 255 255 255 255 0 255 255 255 0 0 0 255 255 255 255 +255 255 255 255 255 0 0 255 255 0 0 0 255 255 255 255 +255 255 255 255 255 0 0 0 0 0 0 0 255 255 255 255 +255 255 255 255 255 0 113 255 255 0 0 0 255 255 255 255 +255 255 255 255 255 0 255 255 255 0 0 0 255 255 255 255 +255 255 127 255 255 47 255 255 255 0 0 0 255 255 255 255 +255 255 124 251 255 255 255 255 255 0 0 0 255 255 255 255 +255 255 124 0 255 255 255 255 255 0 0 0 242 255 255 255 +255 255 124 0 0 8 22 24 25 0 0 0 5 254 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 48 48 48 48 48 48 48 255 255 +255 255 255 255 255 255 255 255 238 0 0 0 155 255 255 255 +255 255 255 255 255 255 255 255 255 0 0 0 255 255 255 255 +255 255 255 255 255 255 255 255 255 0 0 0 255 255 255 255 +255 255 255 255 255 47 255 255 255 0 0 0 255 255 255 255 +255 255 255 255 255 0 255 255 255 0 0 0 255 255 255 255 +255 255 255 255 255 0 29 255 255 0 0 0 255 255 255 255 +255 255 255 255 255 0 0 0 0 0 0 0 255 255 255 255 +255 255 255 255 255 0 144 255 255 0 0 0 255 255 255 255 +255 255 255 255 255 0 255 255 255 0 0 0 255 255 255 255 +255 255 105 255 255 59 255 255 255 0 0 0 255 255 255 255 +255 255 104 253 255 255 255 255 255 0 0 0 255 255 255 255 +255 255 104 0 255 255 255 255 255 0 0 0 255 255 255 255 +255 255 104 0 0 9 22 24 24 0 0 0 44 254 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 + +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +247 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 + 48 255 255 255 255 255 255 255 255 255 255 255 255 253 255 255 + 48 96 234 233 233 233 233 233 233 233 233 233 210 3 255 255 + 48 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 + 48 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 + 48 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 + 48 253 255 255 255 255 255 0 255 255 255 255 255 24 255 255 + 48 255 255 255 255 255 255 0 255 255 255 255 255 24 255 255 +255 255 255 255 255 255 0 0 76 255 255 255 255 22 255 255 +255 255 255 255 5 0 0 0 0 0 28 255 255 7 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 0 255 255 +255 255 255 255 255 255 255 255 255 255 255 240 0 0 255 255 +255 255 255 255 255 255 255 255 255 255 168 172 172 172 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 + 48 255 255 255 255 255 255 255 255 255 255 255 255 254 255 255 + 48 131 255 255 255 255 255 255 255 255 255 255 242 5 255 255 + 48 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 + 48 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 + 48 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 + 48 249 255 255 255 255 255 0 255 255 255 255 255 25 255 255 + 48 255 255 255 255 255 255 0 255 255 255 255 255 24 255 255 +255 255 255 255 255 255 0 0 113 255 255 255 255 22 255 255 +255 255 255 255 27 0 0 0 0 0 47 255 255 8 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 0 255 255 +255 255 255 255 255 255 255 255 255 255 255 251 0 0 255 255 +255 255 255 255 255 255 255 255 255 255 127 124 124 124 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 + 48 255 255 255 255 255 255 255 255 255 255 255 255 254 255 255 + 48 155 255 255 255 255 255 255 255 255 255 255 255 44 255 255 + 48 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 + 48 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 + 48 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 + 48 238 255 255 255 255 255 0 255 255 255 255 255 24 255 255 + 48 255 255 255 255 255 255 0 255 255 255 255 255 24 255 255 +255 255 255 255 255 255 29 0 144 255 255 255 255 22 255 255 +255 255 255 255 47 0 0 0 0 0 59 255 255 9 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 0 255 255 +255 255 255 255 255 255 255 255 255 255 255 253 0 0 255 255 +255 255 255 255 255 255 255 255 255 255 105 104 104 104 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 diff --git a/1_Three.js/6_AR/data/letterG.patt b/1_Three.js/6_AR/data/letterG.patt new file mode 100755 index 0000000000000000000000000000000000000000..98affa20d47a4311b0212590952a54270c040163 --- /dev/null +++ b/1_Three.js/6_AR/data/letterG.patt @@ -0,0 +1,195 @@ +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 132 65 58 81 219 255 255 226 255 255 +255 255 255 255 0 0 0 199 254 251 33 0 0 0 255 255 +255 255 247 0 0 0 255 255 255 255 255 251 0 0 255 255 +255 255 0 0 0 255 255 255 255 255 255 255 248 0 255 255 +255 2 0 0 11 255 255 255 255 255 255 255 255 32 255 255 +255 0 0 0 129 255 255 255 255 255 255 255 255 254 255 255 +231 0 0 0 247 255 255 255 255 255 255 255 255 255 255 255 +174 0 0 0 254 255 255 255 255 255 255 255 255 255 255 255 +175 0 0 0 253 255 255 255 255 252 252 252 252 252 252 252 +253 0 0 0 228 255 255 255 255 255 19 0 0 0 84 253 +255 0 0 0 52 255 255 255 255 255 253 0 0 0 255 255 +255 134 0 0 0 255 255 255 255 255 253 0 0 0 255 255 +255 255 3 0 0 219 255 255 255 255 253 0 0 0 255 255 +255 255 255 68 0 0 180 255 255 255 252 0 0 0 255 255 +255 255 255 255 255 78 0 0 0 0 0 9 203 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 154 67 58 79 208 255 255 249 255 255 +255 255 255 255 0 0 0 184 254 253 37 0 0 0 254 255 +255 255 250 0 0 0 255 255 255 255 255 254 0 0 254 255 +255 255 0 0 0 254 255 255 255 255 255 255 252 0 254 255 +255 5 0 0 0 255 255 255 255 255 255 255 255 51 254 255 +255 0 0 0 55 255 255 255 255 255 255 255 255 255 255 255 +253 0 0 0 218 255 255 255 255 255 255 255 255 255 255 255 +219 0 0 0 247 255 255 255 255 255 255 255 255 255 255 255 +221 0 0 0 242 255 255 255 255 252 252 252 252 252 252 252 +254 0 0 0 186 255 255 255 255 255 22 0 0 0 50 253 +255 0 0 0 44 255 255 255 255 255 254 0 0 0 254 255 +255 170 0 0 0 255 255 255 255 255 254 0 0 0 254 255 +255 255 4 0 0 193 255 255 255 255 254 0 0 0 254 255 +255 255 255 84 0 0 154 255 255 255 253 0 0 0 254 255 +255 255 255 255 255 92 0 0 0 0 0 0 197 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 165 70 58 77 200 255 255 255 254 255 +255 255 255 255 0 0 0 162 254 253 48 0 0 0 254 255 +255 255 253 0 0 0 255 255 255 255 255 255 0 0 254 255 +255 255 0 0 0 251 255 255 255 255 255 255 254 0 254 255 +255 73 0 0 0 255 255 255 255 255 255 255 255 66 254 255 +255 0 0 0 47 255 255 255 255 255 255 255 255 255 255 255 +254 0 0 0 176 255 255 255 255 255 255 255 255 255 255 255 +246 0 0 0 219 255 255 255 255 255 255 255 255 255 255 255 +247 0 0 0 209 255 255 255 255 251 252 252 252 252 252 252 +255 0 0 0 139 255 255 255 255 255 102 0 0 0 39 252 +255 0 0 0 30 255 255 255 255 255 254 0 0 0 254 255 +255 204 0 0 0 255 255 255 255 255 254 0 0 0 254 255 +255 255 36 0 0 160 255 255 255 255 254 0 0 0 254 255 +255 255 255 99 0 0 124 255 255 255 255 0 0 0 254 255 +255 255 255 255 255 108 0 0 0 0 0 0 181 255 255 255 + +255 255 255 255 255 255 255 255 255 252 253 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 252 84 255 255 255 255 255 +255 226 0 0 0 32 254 255 255 252 0 0 0 0 0 255 +255 255 0 0 248 255 255 255 255 252 0 0 0 0 0 203 +255 255 0 251 255 255 255 255 255 252 0 0 0 0 0 9 +255 219 33 255 255 255 255 255 255 252 19 253 253 253 252 0 +255 81 251 255 255 255 255 255 255 252 255 255 255 255 255 0 +255 58 254 255 255 255 255 255 255 255 255 255 255 255 255 0 +255 65 199 255 255 255 255 255 255 255 255 255 255 255 255 0 +255 132 0 255 255 255 255 255 255 255 255 255 255 255 180 0 +255 255 0 0 255 255 255 255 255 255 255 255 255 219 0 78 +255 255 0 0 0 11 129 247 254 253 228 52 0 0 0 255 +255 255 255 0 0 0 0 0 0 0 0 0 0 0 68 255 +255 255 255 247 0 0 0 0 0 0 0 0 0 3 255 255 +255 255 255 255 255 2 0 0 0 0 0 0 134 255 255 255 +255 255 255 255 255 255 255 231 174 175 253 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 252 253 255 255 255 255 255 +255 255 254 254 254 254 255 255 255 252 50 254 254 254 254 255 +255 249 0 0 0 51 255 255 255 252 0 0 0 0 0 255 +255 255 0 0 252 255 255 255 255 252 0 0 0 0 0 197 +255 255 0 254 255 255 255 255 255 252 0 0 0 0 0 0 +255 208 37 255 255 255 255 255 255 252 22 254 254 254 253 0 +255 79 253 255 255 255 255 255 255 252 255 255 255 255 255 0 +255 58 254 255 255 255 255 255 255 255 255 255 255 255 255 0 +255 67 184 255 255 255 255 255 255 255 255 255 255 255 255 0 +255 154 0 255 255 255 255 255 255 255 255 255 255 255 154 0 +255 255 0 0 254 255 255 255 255 255 255 255 255 193 0 92 +255 255 0 0 0 0 55 218 247 242 186 44 0 0 0 255 +255 255 255 0 0 0 0 0 0 0 0 0 0 0 84 255 +255 255 255 250 0 0 0 0 0 0 0 0 0 4 255 255 +255 255 255 255 255 5 0 0 0 0 0 0 170 255 255 255 +255 255 255 255 255 255 255 253 219 221 254 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 252 252 255 255 255 255 255 +255 254 254 254 254 254 255 255 255 252 39 254 254 254 254 255 +255 255 0 0 0 66 255 255 255 252 0 0 0 0 0 255 +255 255 0 0 254 255 255 255 255 252 0 0 0 0 0 181 +255 255 0 255 255 255 255 255 255 252 0 0 0 0 0 0 +255 200 48 255 255 255 255 255 255 252 102 254 254 254 255 0 +255 77 253 255 255 255 255 255 255 251 255 255 255 255 255 0 +255 58 254 255 255 255 255 255 255 255 255 255 255 255 255 0 +255 70 162 255 255 255 255 255 255 255 255 255 255 255 255 0 +255 165 0 255 255 255 255 255 255 255 255 255 255 255 124 0 +255 255 0 0 251 255 255 255 255 255 255 255 255 160 0 108 +255 255 0 0 0 0 47 176 219 209 139 30 0 0 0 255 +255 255 255 0 0 0 0 0 0 0 0 0 0 0 99 255 +255 255 255 253 0 0 0 0 0 0 0 0 0 36 255 255 +255 255 255 255 255 73 0 0 0 0 0 0 204 255 255 255 +255 255 255 255 255 255 255 254 246 247 255 255 255 255 255 255 + +255 255 255 203 9 0 0 0 0 0 78 255 255 255 255 255 +255 255 0 0 0 252 255 255 255 180 0 0 68 255 255 255 +255 255 0 0 0 253 255 255 255 255 219 0 0 3 255 255 +255 255 0 0 0 253 255 255 255 255 255 0 0 0 134 255 +255 255 0 0 0 253 255 255 255 255 255 52 0 0 0 255 +253 84 0 0 0 19 255 255 255 255 255 228 0 0 0 253 +252 252 252 252 252 252 252 255 255 255 255 253 0 0 0 175 +255 255 255 255 255 255 255 255 255 255 255 254 0 0 0 174 +255 255 255 255 255 255 255 255 255 255 255 247 0 0 0 231 +255 255 254 255 255 255 255 255 255 255 255 129 0 0 0 255 +255 255 32 255 255 255 255 255 255 255 255 11 0 0 2 255 +255 255 0 248 255 255 255 255 255 255 255 0 0 0 255 255 +255 255 0 0 251 255 255 255 255 255 0 0 0 247 255 255 +255 255 0 0 0 33 251 254 199 0 0 0 255 255 255 255 +255 255 226 255 255 219 81 58 65 132 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 197 0 0 0 0 0 0 92 255 255 255 255 255 +255 254 0 0 0 253 255 255 255 154 0 0 84 255 255 255 +255 254 0 0 0 254 255 255 255 255 193 0 0 4 255 255 +255 254 0 0 0 254 255 255 255 255 255 0 0 0 170 255 +255 254 0 0 0 254 255 255 255 255 255 44 0 0 0 255 +253 50 0 0 0 22 255 255 255 255 255 186 0 0 0 254 +252 252 252 252 252 252 252 255 255 255 255 242 0 0 0 221 +255 255 255 255 255 255 255 255 255 255 255 247 0 0 0 219 +255 255 255 255 255 255 255 255 255 255 255 218 0 0 0 253 +255 255 255 255 255 255 255 255 255 255 255 55 0 0 0 255 +255 254 51 255 255 255 255 255 255 255 255 0 0 0 5 255 +255 254 0 252 255 255 255 255 255 255 254 0 0 0 255 255 +255 254 0 0 254 255 255 255 255 255 0 0 0 250 255 255 +255 254 0 0 0 37 253 254 184 0 0 0 255 255 255 255 +255 255 249 255 255 208 79 58 67 154 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 181 0 0 0 0 0 0 108 255 255 255 255 255 +255 254 0 0 0 255 255 255 255 124 0 0 99 255 255 255 +255 254 0 0 0 254 255 255 255 255 160 0 0 36 255 255 +255 254 0 0 0 254 255 255 255 255 255 0 0 0 204 255 +255 254 0 0 0 254 255 255 255 255 255 30 0 0 0 255 +252 39 0 0 0 102 255 255 255 255 255 139 0 0 0 255 +252 252 252 252 252 252 251 255 255 255 255 209 0 0 0 247 +255 255 255 255 255 255 255 255 255 255 255 219 0 0 0 246 +255 255 255 255 255 255 255 255 255 255 255 176 0 0 0 254 +255 255 255 255 255 255 255 255 255 255 255 47 0 0 0 255 +255 254 66 255 255 255 255 255 255 255 255 0 0 0 73 255 +255 254 0 254 255 255 255 255 255 255 251 0 0 0 255 255 +255 254 0 0 255 255 255 255 255 255 0 0 0 253 255 255 +255 254 0 0 0 48 253 254 162 0 0 0 255 255 255 255 +255 254 255 255 255 200 77 58 70 165 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 + +255 255 255 255 255 253 175 174 231 255 255 255 255 255 255 255 +255 255 255 134 0 0 0 0 0 0 2 255 255 255 255 255 +255 255 3 0 0 0 0 0 0 0 0 0 247 255 255 255 +255 68 0 0 0 0 0 0 0 0 0 0 0 255 255 255 +255 0 0 0 52 228 253 254 247 129 11 0 0 0 255 255 + 78 0 219 255 255 255 255 255 255 255 255 255 0 0 255 255 + 0 180 255 255 255 255 255 255 255 255 255 255 255 0 132 255 + 0 255 255 255 255 255 255 255 255 255 255 255 255 199 65 255 + 0 255 255 255 255 255 255 255 255 255 255 255 255 254 58 255 + 0 255 255 255 255 255 252 255 255 255 255 255 255 251 81 255 + 0 252 253 253 253 19 252 255 255 255 255 255 255 33 219 255 + 9 0 0 0 0 0 252 255 255 255 255 255 251 0 255 255 +203 0 0 0 0 0 252 255 255 255 255 248 0 0 255 255 +255 0 0 0 0 0 252 255 255 254 32 0 0 0 226 255 +255 255 255 255 255 84 252 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 253 252 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 254 221 219 253 255 255 255 255 255 255 255 +255 255 255 170 0 0 0 0 0 0 5 255 255 255 255 255 +255 255 4 0 0 0 0 0 0 0 0 0 250 255 255 255 +255 84 0 0 0 0 0 0 0 0 0 0 0 255 255 255 +255 0 0 0 44 186 242 247 218 55 0 0 0 0 255 255 + 92 0 193 255 255 255 255 255 255 255 255 254 0 0 255 255 + 0 154 255 255 255 255 255 255 255 255 255 255 255 0 154 255 + 0 255 255 255 255 255 255 255 255 255 255 255 255 184 67 255 + 0 255 255 255 255 255 255 255 255 255 255 255 255 254 58 255 + 0 255 255 255 255 255 252 255 255 255 255 255 255 253 79 255 + 0 253 254 254 254 22 252 255 255 255 255 255 255 37 208 255 + 0 0 0 0 0 0 252 255 255 255 255 255 254 0 255 255 +197 0 0 0 0 0 252 255 255 255 255 252 0 0 255 255 +255 0 0 0 0 0 252 255 255 255 51 0 0 0 249 255 +255 254 254 254 254 50 252 255 255 255 254 254 254 254 255 255 +255 255 255 255 255 253 252 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 247 246 254 255 255 255 255 255 255 255 +255 255 255 204 0 0 0 0 0 0 73 255 255 255 255 255 +255 255 36 0 0 0 0 0 0 0 0 0 253 255 255 255 +255 99 0 0 0 0 0 0 0 0 0 0 0 255 255 255 +255 0 0 0 30 139 209 219 176 47 0 0 0 0 255 255 +108 0 160 255 255 255 255 255 255 255 255 251 0 0 255 255 + 0 124 255 255 255 255 255 255 255 255 255 255 255 0 165 255 + 0 255 255 255 255 255 255 255 255 255 255 255 255 162 70 255 + 0 255 255 255 255 255 255 255 255 255 255 255 255 254 58 255 + 0 255 255 255 255 255 251 255 255 255 255 255 255 253 77 255 + 0 255 254 254 254 102 252 255 255 255 255 255 255 48 200 255 + 0 0 0 0 0 0 252 255 255 255 255 255 255 0 255 255 +181 0 0 0 0 0 252 255 255 255 255 254 0 0 255 255 +255 0 0 0 0 0 252 255 255 255 66 0 0 0 255 255 +255 254 254 254 254 39 252 255 255 255 254 254 254 254 254 255 +255 255 255 255 255 252 252 255 255 255 255 255 255 255 255 255 diff --git a/1_Three.js/6_AR/hello-cube.html b/1_Three.js/6_AR/hello-cube.html new file mode 100755 index 0000000000000000000000000000000000000000..51a32c2f2d4a2f41be4deefac4ac6ca46bf1a055 --- /dev/null +++ b/1_Three.js/6_AR/hello-cube.html @@ -0,0 +1,155 @@ +<!DOCTYPE html> +<head> + <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0"> + <title>Hello, AR Cube!</title> + <!-- include three.js library --> + <script src='js/three.js'></script> + <!-- include jsartookit --> + <script src="jsartoolkit5/artoolkit.min.js"></script> + <script src="jsartoolkit5/artoolkit.api.js"></script> + <!-- include threex.artoolkit --> + <script src="threex/threex-artoolkitsource.js"></script> + <script src="threex/threex-artoolkitcontext.js"></script> + <script src="threex/threex-arbasecontrols.js"></script> + <script src="threex/threex-armarkercontrols.js"></script> +</head> + +<body style='margin : 0px; overflow: hidden; font-family: Monospace;'> + +<!-- + Example created by Lee Stemkoski: https://github.com/stemkoski + Based on the AR.js library and examples created by Jerome Etienne: https://github.com/jeromeetienne/AR.js/ +--> + +<script> + +var scene, camera, renderer, clock, deltaTime, totalTime; + +var arToolkitSource, arToolkitContext; + +var markerRoot1, markerRoot2; + +var mesh1; + +initialize(); +animate(); + +function initialize() +{ + scene = new THREE.Scene(); + + let ambientLight = new THREE.AmbientLight( 0xcccccc, 0.5 ); + scene.add( ambientLight ); + + camera = new THREE.Camera(); + scene.add(camera); + + renderer = new THREE.WebGLRenderer({ + antialias : true, + alpha: true + }); + renderer.setClearColor(new THREE.Color('lightgrey'), 0) + renderer.setSize( 640, 480 ); + renderer.domElement.style.position = 'absolute' + renderer.domElement.style.top = '0px' + renderer.domElement.style.left = '0px' + document.body.appendChild( renderer.domElement ); + + clock = new THREE.Clock(); + deltaTime = 0; + totalTime = 0; + + //////////////////////////////////////////////////////////// + // setup arToolkitSource + //////////////////////////////////////////////////////////// + + arToolkitSource = new THREEx.ArToolkitSource({ + sourceType : 'webcam', + }); + + function onResize() + { + arToolkitSource.onResize() + arToolkitSource.copySizeTo(renderer.domElement) + if ( arToolkitContext.arController !== null ) + { + arToolkitSource.copySizeTo(arToolkitContext.arController.canvas) + } + } + + arToolkitSource.init(function onReady(){ + onResize() + }); + + // handle resize event + window.addEventListener('resize', function(){ + onResize() + }); + + //////////////////////////////////////////////////////////// + // setup arToolkitContext + //////////////////////////////////////////////////////////// + + // create atToolkitContext + arToolkitContext = new THREEx.ArToolkitContext({ + cameraParametersUrl: 'data/camera_para.dat', + detectionMode: 'mono' + }); + + // copy projection matrix to camera when initialization complete + arToolkitContext.init( function onCompleted(){ + camera.projectionMatrix.copy( arToolkitContext.getProjectionMatrix() ); + }); + + //////////////////////////////////////////////////////////// + // setup markerRoots + //////////////////////////////////////////////////////////// + + // build markerControls + markerRoot1 = new THREE.Group(); + scene.add(markerRoot1); + let markerControls1 = new THREEx.ArMarkerControls(arToolkitContext, markerRoot1, { + type: 'pattern', patternUrl: "data/hiro.patt", + }) + + let geometry1 = new THREE.CubeGeometry(1,1,1); + let material1 = new THREE.MeshNormalMaterial({ + transparent: true, + opacity: 0.5, + side: THREE.DoubleSide + }); + + mesh1 = new THREE.Mesh( geometry1, material1 ); + mesh1.position.y = 0.5; + + markerRoot1.add( mesh1 ); +} + + +function update() +{ + // update artoolkit on every frame + if ( arToolkitSource.ready !== false ) + arToolkitContext.update( arToolkitSource.domElement ); +} + + +function render() +{ + renderer.render( scene, camera ); +} + + +function animate() +{ + requestAnimationFrame(animate); + deltaTime = clock.getDelta(); + totalTime += deltaTime; + update(); + render(); +} + +</script> + +</body> +</html> \ No newline at end of file diff --git a/1_Three.js/6_AR/images/arrow-curved.png b/1_Three.js/6_AR/images/arrow-curved.png new file mode 100755 index 0000000000000000000000000000000000000000..fdead02ab8a4a09ad477b5b5f0507081332c3369 Binary files /dev/null and b/1_Three.js/6_AR/images/arrow-curved.png differ diff --git a/1_Three.js/6_AR/images/arrow-double.png b/1_Three.js/6_AR/images/arrow-double.png new file mode 100755 index 0000000000000000000000000000000000000000..c9730c66f1efa8494248df91e8058fb5f05d34eb Binary files /dev/null and b/1_Three.js/6_AR/images/arrow-double.png differ diff --git a/1_Three.js/6_AR/images/arrow-single.png b/1_Three.js/6_AR/images/arrow-single.png new file mode 100755 index 0000000000000000000000000000000000000000..c6ef9ba269e29f6888686ab5ca135a28405f89ec Binary files /dev/null and b/1_Three.js/6_AR/images/arrow-single.png differ diff --git a/1_Three.js/6_AR/images/basketball-gray.png b/1_Three.js/6_AR/images/basketball-gray.png new file mode 100755 index 0000000000000000000000000000000000000000..c64bf502e9e6098bccccf5bc3563e69af74e8568 Binary files /dev/null and b/1_Three.js/6_AR/images/basketball-gray.png differ diff --git a/1_Three.js/6_AR/images/basketball.png b/1_Three.js/6_AR/images/basketball.png new file mode 100755 index 0000000000000000000000000000000000000000..db6902bfea6df47be5a0391851d2bfcd521338f3 Binary files /dev/null and b/1_Three.js/6_AR/images/basketball.png differ diff --git a/1_Three.js/6_AR/images/beach/negx.jpg b/1_Three.js/6_AR/images/beach/negx.jpg new file mode 100755 index 0000000000000000000000000000000000000000..f000a738cae4bfefb0f83661fce49f6b0be9aea7 Binary files /dev/null and b/1_Three.js/6_AR/images/beach/negx.jpg differ diff --git a/1_Three.js/6_AR/images/beach/negy.jpg b/1_Three.js/6_AR/images/beach/negy.jpg new file mode 100755 index 0000000000000000000000000000000000000000..ec49b6491d29fea35d443d8eb8508b5b6d7e3ffe Binary files /dev/null and b/1_Three.js/6_AR/images/beach/negy.jpg differ diff --git a/1_Three.js/6_AR/images/beach/negz.jpg b/1_Three.js/6_AR/images/beach/negz.jpg new file mode 100755 index 0000000000000000000000000000000000000000..1ab763154ee9fc80c4ecf92b4ffff2dfffce68f7 Binary files /dev/null and b/1_Three.js/6_AR/images/beach/negz.jpg differ diff --git a/1_Three.js/6_AR/images/beach/posx.jpg b/1_Three.js/6_AR/images/beach/posx.jpg new file mode 100755 index 0000000000000000000000000000000000000000..5381a98ff873faf7cd8fd5490de2ce15beb22793 Binary files /dev/null and b/1_Three.js/6_AR/images/beach/posx.jpg differ diff --git a/1_Three.js/6_AR/images/beach/posy.jpg b/1_Three.js/6_AR/images/beach/posy.jpg new file mode 100755 index 0000000000000000000000000000000000000000..e91c614b6c69f8dd73e7c34b780f91998212af07 Binary files /dev/null and b/1_Three.js/6_AR/images/beach/posy.jpg differ diff --git a/1_Three.js/6_AR/images/beach/posz.jpg b/1_Three.js/6_AR/images/beach/posz.jpg new file mode 100755 index 0000000000000000000000000000000000000000..6f7510c1413b6953b77e30344ec81e979808946e Binary files /dev/null and b/1_Three.js/6_AR/images/beach/posz.jpg differ diff --git a/1_Three.js/6_AR/images/beach/readme.txt b/1_Three.js/6_AR/images/beach/readme.txt new file mode 100755 index 0000000000000000000000000000000000000000..8b404c2736a266c27de41a7d4383493fcf91c8f9 --- /dev/null +++ b/1_Three.js/6_AR/images/beach/readme.txt @@ -0,0 +1,13 @@ +Author +====== + +This is the work of Emil Persson, aka Humus. +http://www.humus.name + + + +License +======= + +This work is licensed under a Creative Commons Attribution 3.0 Unported License. +http://creativecommons.org/licenses/by/3.0/ diff --git a/1_Three.js/6_AR/images/border.png b/1_Three.js/6_AR/images/border.png new file mode 100755 index 0000000000000000000000000000000000000000..467589af4028c2424601209378d2a3f26d2e6826 Binary files /dev/null and b/1_Three.js/6_AR/images/border.png differ diff --git a/1_Three.js/6_AR/images/chemistry/border.png b/1_Three.js/6_AR/images/chemistry/border.png new file mode 100755 index 0000000000000000000000000000000000000000..467589af4028c2424601209378d2a3f26d2e6826 Binary files /dev/null and b/1_Three.js/6_AR/images/chemistry/border.png differ diff --git a/1_Three.js/6_AR/images/chemistry/card-C.png b/1_Three.js/6_AR/images/chemistry/card-C.png new file mode 100755 index 0000000000000000000000000000000000000000..0bde23ea8572efb126f63175263f88db0fb8f1db Binary files /dev/null and b/1_Three.js/6_AR/images/chemistry/card-C.png differ diff --git a/1_Three.js/6_AR/images/chemistry/card-Cl.png b/1_Three.js/6_AR/images/chemistry/card-Cl.png new file mode 100755 index 0000000000000000000000000000000000000000..a82003859926489f47e9cb169a7239ffafa2d724 Binary files /dev/null and b/1_Three.js/6_AR/images/chemistry/card-Cl.png differ diff --git a/1_Three.js/6_AR/images/chemistry/card-H.png b/1_Three.js/6_AR/images/chemistry/card-H.png new file mode 100755 index 0000000000000000000000000000000000000000..276b8e18e925e138eacbdbc55497a898a22d4ff5 Binary files /dev/null and b/1_Three.js/6_AR/images/chemistry/card-H.png differ diff --git a/1_Three.js/6_AR/images/chemistry/card-N.png b/1_Three.js/6_AR/images/chemistry/card-N.png new file mode 100755 index 0000000000000000000000000000000000000000..ba29d8a36dbc6f6f3a7822ac4bc2218313322534 Binary files /dev/null and b/1_Three.js/6_AR/images/chemistry/card-N.png differ diff --git a/1_Three.js/6_AR/images/chemistry/card-Na.png b/1_Three.js/6_AR/images/chemistry/card-Na.png new file mode 100755 index 0000000000000000000000000000000000000000..620fe7565f42be17024de04a43297a83b5fb8031 Binary files /dev/null and b/1_Three.js/6_AR/images/chemistry/card-Na.png differ diff --git a/1_Three.js/6_AR/images/chemistry/card-O.png b/1_Three.js/6_AR/images/chemistry/card-O.png new file mode 100755 index 0000000000000000000000000000000000000000..d5f8b4b7269c627bc9e1c55d26d77836a079064d Binary files /dev/null and b/1_Three.js/6_AR/images/chemistry/card-O.png differ diff --git a/1_Three.js/6_AR/images/chemistry/card-Si.png b/1_Three.js/6_AR/images/chemistry/card-Si.png new file mode 100755 index 0000000000000000000000000000000000000000..b76acb2f6d871faf2569e496d0c9d1a170404c9d Binary files /dev/null and b/1_Three.js/6_AR/images/chemistry/card-Si.png differ diff --git a/1_Three.js/6_AR/images/chemistry/card-template-GIMP.xcf b/1_Three.js/6_AR/images/chemistry/card-template-GIMP.xcf new file mode 100755 index 0000000000000000000000000000000000000000..d414c450c5bb6527cf05dcfe158037536ab6bbb7 Binary files /dev/null and b/1_Three.js/6_AR/images/chemistry/card-template-GIMP.xcf differ diff --git a/1_Three.js/6_AR/images/chemistry/label-C.png b/1_Three.js/6_AR/images/chemistry/label-C.png new file mode 100755 index 0000000000000000000000000000000000000000..3d75f0a7e386216b1033ecf132f71457bf5a7b32 Binary files /dev/null and b/1_Three.js/6_AR/images/chemistry/label-C.png differ diff --git a/1_Three.js/6_AR/images/chemistry/label-H.png b/1_Three.js/6_AR/images/chemistry/label-H.png new file mode 100755 index 0000000000000000000000000000000000000000..f47146fe7e15c8cc6cb5818645d1d1ea0ee407d7 Binary files /dev/null and b/1_Three.js/6_AR/images/chemistry/label-H.png differ diff --git a/1_Three.js/6_AR/images/chemistry/label-N.png b/1_Three.js/6_AR/images/chemistry/label-N.png new file mode 100755 index 0000000000000000000000000000000000000000..339a8b6e6914ba9c404de3ae5ed44a090055db5d Binary files /dev/null and b/1_Three.js/6_AR/images/chemistry/label-N.png differ diff --git a/1_Three.js/6_AR/images/chemistry/label-O.png b/1_Three.js/6_AR/images/chemistry/label-O.png new file mode 100755 index 0000000000000000000000000000000000000000..1795a1b4b6d09e246e40cbf459adc40923c92f09 Binary files /dev/null and b/1_Three.js/6_AR/images/chemistry/label-O.png differ diff --git a/1_Three.js/6_AR/images/chemistry/label-template-GIMP.xcf b/1_Three.js/6_AR/images/chemistry/label-template-GIMP.xcf new file mode 100755 index 0000000000000000000000000000000000000000..ca3fd389215658dfe28ec8e86743d4b911a40b56 Binary files /dev/null and b/1_Three.js/6_AR/images/chemistry/label-template-GIMP.xcf differ diff --git a/1_Three.js/6_AR/images/chemistry/shadow-0.png b/1_Three.js/6_AR/images/chemistry/shadow-0.png new file mode 100755 index 0000000000000000000000000000000000000000..8a5e5a869caf11ff89b5d06d32c72c0d421102be Binary files /dev/null and b/1_Three.js/6_AR/images/chemistry/shadow-0.png differ diff --git a/1_Three.js/6_AR/images/chemistry/shadow-1.png b/1_Three.js/6_AR/images/chemistry/shadow-1.png new file mode 100755 index 0000000000000000000000000000000000000000..661e6ff22e0a2cbadce6d87a533ee75421d344a8 Binary files /dev/null and b/1_Three.js/6_AR/images/chemistry/shadow-1.png differ diff --git a/1_Three.js/6_AR/images/chemistry/shadow-2.png b/1_Three.js/6_AR/images/chemistry/shadow-2.png new file mode 100755 index 0000000000000000000000000000000000000000..8f1f434559b598b9d0fe087181c69faff115259c Binary files /dev/null and b/1_Three.js/6_AR/images/chemistry/shadow-2.png differ diff --git a/1_Three.js/6_AR/images/chemistry/shadow-3.png b/1_Three.js/6_AR/images/chemistry/shadow-3.png new file mode 100755 index 0000000000000000000000000000000000000000..f85f67d54b939f657cc4adf87902149d47e20688 Binary files /dev/null and b/1_Three.js/6_AR/images/chemistry/shadow-3.png differ diff --git a/1_Three.js/6_AR/images/chemistry/shadow-4.png b/1_Three.js/6_AR/images/chemistry/shadow-4.png new file mode 100755 index 0000000000000000000000000000000000000000..f17fd3c6591d18d358d8fae6e2c99ae166b04e98 Binary files /dev/null and b/1_Three.js/6_AR/images/chemistry/shadow-4.png differ diff --git a/1_Three.js/6_AR/images/chemistry/shadow-5.png b/1_Three.js/6_AR/images/chemistry/shadow-5.png new file mode 100755 index 0000000000000000000000000000000000000000..4cba24a64ab700d23fde5a421bab8a69cfb6604c Binary files /dev/null and b/1_Three.js/6_AR/images/chemistry/shadow-5.png differ diff --git a/1_Three.js/6_AR/images/chemistry/shadow-6.png b/1_Three.js/6_AR/images/chemistry/shadow-6.png new file mode 100755 index 0000000000000000000000000000000000000000..84aafba71ed783f021919c3f960d5e2513c88c78 Binary files /dev/null and b/1_Three.js/6_AR/images/chemistry/shadow-6.png differ diff --git a/1_Three.js/6_AR/images/chemistry/shadow-7.png b/1_Three.js/6_AR/images/chemistry/shadow-7.png new file mode 100755 index 0000000000000000000000000000000000000000..f94d60bed2e541421cf2a1cd00f9b64dfd9240c2 Binary files /dev/null and b/1_Three.js/6_AR/images/chemistry/shadow-7.png differ diff --git a/1_Three.js/6_AR/images/chemistry/shadow-8.png b/1_Three.js/6_AR/images/chemistry/shadow-8.png new file mode 100755 index 0000000000000000000000000000000000000000..385a6016eac9df8fcc62578a23652bd83b4236e3 Binary files /dev/null and b/1_Three.js/6_AR/images/chemistry/shadow-8.png differ diff --git a/1_Three.js/6_AR/images/church/negx.jpg b/1_Three.js/6_AR/images/church/negx.jpg new file mode 100755 index 0000000000000000000000000000000000000000..2072f1d1a35069fb8901a78db99a871bcbfd4d35 Binary files /dev/null and b/1_Three.js/6_AR/images/church/negx.jpg differ diff --git a/1_Three.js/6_AR/images/church/negy.jpg b/1_Three.js/6_AR/images/church/negy.jpg new file mode 100755 index 0000000000000000000000000000000000000000..aa9a91d4790c69aff67e6022775c8a848d5c23a4 Binary files /dev/null and b/1_Three.js/6_AR/images/church/negy.jpg differ diff --git a/1_Three.js/6_AR/images/church/negz.jpg b/1_Three.js/6_AR/images/church/negz.jpg new file mode 100755 index 0000000000000000000000000000000000000000..9c487c989d8cb1daf66be4e478beb4137c42a15c Binary files /dev/null and b/1_Three.js/6_AR/images/church/negz.jpg differ diff --git a/1_Three.js/6_AR/images/church/posx.jpg b/1_Three.js/6_AR/images/church/posx.jpg new file mode 100755 index 0000000000000000000000000000000000000000..e1110c4e5d8dfcbbe00ce0ec3eb37db4847844ed Binary files /dev/null and b/1_Three.js/6_AR/images/church/posx.jpg differ diff --git a/1_Three.js/6_AR/images/church/posy.jpg b/1_Three.js/6_AR/images/church/posy.jpg new file mode 100755 index 0000000000000000000000000000000000000000..42a586115530d8f66b382a40b5befa20106ff40a Binary files /dev/null and b/1_Three.js/6_AR/images/church/posy.jpg differ diff --git a/1_Three.js/6_AR/images/church/posz.jpg b/1_Three.js/6_AR/images/church/posz.jpg new file mode 100755 index 0000000000000000000000000000000000000000..13d2dfe153572fc6eb39597d69823e2f3f333df5 Binary files /dev/null and b/1_Three.js/6_AR/images/church/posz.jpg differ diff --git a/1_Three.js/6_AR/images/church/readme.txt b/1_Three.js/6_AR/images/church/readme.txt new file mode 100755 index 0000000000000000000000000000000000000000..8b404c2736a266c27de41a7d4383493fcf91c8f9 --- /dev/null +++ b/1_Three.js/6_AR/images/church/readme.txt @@ -0,0 +1,13 @@ +Author +====== + +This is the work of Emil Persson, aka Humus. +http://www.humus.name + + + +License +======= + +This work is licensed under a Creative Commons Attribution 3.0 Unported License. +http://creativecommons.org/licenses/by/3.0/ diff --git a/1_Three.js/6_AR/images/color-grid.png b/1_Three.js/6_AR/images/color-grid.png new file mode 100755 index 0000000000000000000000000000000000000000..ee51faa16f1ae7d56fcc6e4ee6a0ab762a796e3d Binary files /dev/null and b/1_Three.js/6_AR/images/color-grid.png differ diff --git a/1_Three.js/6_AR/images/demo/basic-scene.png b/1_Three.js/6_AR/images/demo/basic-scene.png new file mode 100755 index 0000000000000000000000000000000000000000..3b6cb12a297c0c84c8d4e88304e0c7fdf64abaef Binary files /dev/null and b/1_Three.js/6_AR/images/demo/basic-scene.png differ diff --git a/1_Three.js/6_AR/images/demo/camera-movement.png b/1_Three.js/6_AR/images/demo/camera-movement.png new file mode 100755 index 0000000000000000000000000000000000000000..97aa5f6adb2ee723cb4f71c5e653d3bac14ac55e Binary files /dev/null and b/1_Three.js/6_AR/images/demo/camera-movement.png differ diff --git a/1_Three.js/6_AR/images/demo/clipping-planes.png b/1_Three.js/6_AR/images/demo/clipping-planes.png new file mode 100755 index 0000000000000000000000000000000000000000..e11e23cd9495842ab08c006d83878cf9871672ff Binary files /dev/null and b/1_Three.js/6_AR/images/demo/clipping-planes.png differ diff --git a/1_Three.js/6_AR/images/demo/custom-patterns.png b/1_Three.js/6_AR/images/demo/custom-patterns.png new file mode 100755 index 0000000000000000000000000000000000000000..f3cc68d87cc19d6bd8c6783f5f12d2e1db8c3d93 Binary files /dev/null and b/1_Three.js/6_AR/images/demo/custom-patterns.png differ diff --git a/1_Three.js/6_AR/images/demo/globe-multi-marker-large.png b/1_Three.js/6_AR/images/demo/globe-multi-marker-large.png new file mode 100755 index 0000000000000000000000000000000000000000..6923720c92367faa67ef68d8e4674071ae5891a0 Binary files /dev/null and b/1_Three.js/6_AR/images/demo/globe-multi-marker-large.png differ diff --git a/1_Three.js/6_AR/images/demo/globe-multi-marker.png b/1_Three.js/6_AR/images/demo/globe-multi-marker.png new file mode 100755 index 0000000000000000000000000000000000000000..5e37433df19dc5e53c05ca660c8750515ca9a481 Binary files /dev/null and b/1_Three.js/6_AR/images/demo/globe-multi-marker.png differ diff --git a/1_Three.js/6_AR/images/demo/globe.png b/1_Three.js/6_AR/images/demo/globe.png new file mode 100755 index 0000000000000000000000000000000000000000..86cf234bb7708fb85add74c7f40844e0bd154012 Binary files /dev/null and b/1_Three.js/6_AR/images/demo/globe.png differ diff --git a/1_Three.js/6_AR/images/demo/hello-cube.png b/1_Three.js/6_AR/images/demo/hello-cube.png new file mode 100755 index 0000000000000000000000000000000000000000..81d37920289413bfd2de928b7172ba9e65210d61 Binary files /dev/null and b/1_Three.js/6_AR/images/demo/hello-cube.png differ diff --git a/1_Three.js/6_AR/images/demo/hole-box.png b/1_Three.js/6_AR/images/demo/hole-box.png new file mode 100755 index 0000000000000000000000000000000000000000..b623f41c8afd312b803b2d352fc436e396381036 Binary files /dev/null and b/1_Three.js/6_AR/images/demo/hole-box.png differ diff --git a/1_Three.js/6_AR/images/demo/hole-ring.png b/1_Three.js/6_AR/images/demo/hole-ring.png new file mode 100755 index 0000000000000000000000000000000000000000..29427f1543b0b00558d31c7716d42c7e325bde13 Binary files /dev/null and b/1_Three.js/6_AR/images/demo/hole-ring.png differ diff --git a/1_Three.js/6_AR/images/demo/magic-cube.png b/1_Three.js/6_AR/images/demo/magic-cube.png new file mode 100755 index 0000000000000000000000000000000000000000..6df21c72d1cdeb3012d98cb314bec1875fdd3fc5 Binary files /dev/null and b/1_Three.js/6_AR/images/demo/magic-cube.png differ diff --git a/1_Three.js/6_AR/images/demo/mesh-movement.png b/1_Three.js/6_AR/images/demo/mesh-movement.png new file mode 100755 index 0000000000000000000000000000000000000000..06925c1a60ef7701fd82961065021a8c653099fe Binary files /dev/null and b/1_Three.js/6_AR/images/demo/mesh-movement.png differ diff --git a/1_Three.js/6_AR/images/demo/model.png b/1_Three.js/6_AR/images/demo/model.png new file mode 100755 index 0000000000000000000000000000000000000000..d02e93cac299af134c225e8e4c8df219fdd913db Binary files /dev/null and b/1_Three.js/6_AR/images/demo/model.png differ diff --git a/1_Three.js/6_AR/images/demo/parabolic-path.png b/1_Three.js/6_AR/images/demo/parabolic-path.png new file mode 100755 index 0000000000000000000000000000000000000000..cb05638565a9f1854d434ade6fad38fdf418e4af Binary files /dev/null and b/1_Three.js/6_AR/images/demo/parabolic-path.png differ diff --git a/1_Three.js/6_AR/images/demo/portal-half-keyboard-test.png b/1_Three.js/6_AR/images/demo/portal-half-keyboard-test.png new file mode 100755 index 0000000000000000000000000000000000000000..1ad16bcea65ee822542282e29ddbe1367e568980 Binary files /dev/null and b/1_Three.js/6_AR/images/demo/portal-half-keyboard-test.png differ diff --git a/1_Three.js/6_AR/images/demo/portal-view-AR-large.png b/1_Three.js/6_AR/images/demo/portal-view-AR-large.png new file mode 100755 index 0000000000000000000000000000000000000000..a4be3023b61476d09f89bc3107bbd65f5a905ca2 Binary files /dev/null and b/1_Three.js/6_AR/images/demo/portal-view-AR-large.png differ diff --git a/1_Three.js/6_AR/images/demo/portal-view-AR.png b/1_Three.js/6_AR/images/demo/portal-view-AR.png new file mode 100755 index 0000000000000000000000000000000000000000..0be5ec3136e6041a0b3522d9a6e6056f4d340b87 Binary files /dev/null and b/1_Three.js/6_AR/images/demo/portal-view-AR.png differ diff --git a/1_Three.js/6_AR/images/demo/portal-view-large.png b/1_Three.js/6_AR/images/demo/portal-view-large.png new file mode 100755 index 0000000000000000000000000000000000000000..02140d39183f3fc36c035723fd22b93835521d87 Binary files /dev/null and b/1_Three.js/6_AR/images/demo/portal-view-large.png differ diff --git a/1_Three.js/6_AR/images/demo/portal-view.png b/1_Three.js/6_AR/images/demo/portal-view.png new file mode 100755 index 0000000000000000000000000000000000000000..3080983cb20e0e2fbaf51370cb0cb093e5d65b34 Binary files /dev/null and b/1_Three.js/6_AR/images/demo/portal-view.png differ diff --git a/1_Three.js/6_AR/images/demo/refraction.png b/1_Three.js/6_AR/images/demo/refraction.png new file mode 100755 index 0000000000000000000000000000000000000000..c9fbc24810735a1978125d0dcadf378cb8f130e1 Binary files /dev/null and b/1_Three.js/6_AR/images/demo/refraction.png differ diff --git a/1_Three.js/6_AR/images/demo/shader.png b/1_Three.js/6_AR/images/demo/shader.png new file mode 100755 index 0000000000000000000000000000000000000000..44e73c6a21e5abe681a860da91b01ee8cb94bc28 Binary files /dev/null and b/1_Three.js/6_AR/images/demo/shader.png differ diff --git a/1_Three.js/6_AR/images/demo/shadow-balls.png b/1_Three.js/6_AR/images/demo/shadow-balls.png new file mode 100755 index 0000000000000000000000000000000000000000..79299c79ba63438943c6c1c31ed014931ea68a5d Binary files /dev/null and b/1_Three.js/6_AR/images/demo/shadow-balls.png differ diff --git a/1_Three.js/6_AR/images/demo/shadow.png b/1_Three.js/6_AR/images/demo/shadow.png new file mode 100755 index 0000000000000000000000000000000000000000..b28082b15e24b8f38127d733764449824b545a13 Binary files /dev/null and b/1_Three.js/6_AR/images/demo/shadow.png differ diff --git a/1_Three.js/6_AR/images/demo/stencil-test.png b/1_Three.js/6_AR/images/demo/stencil-test.png new file mode 100755 index 0000000000000000000000000000000000000000..6db2878ee031ab1939f226467eb1b049f147e830 Binary files /dev/null and b/1_Three.js/6_AR/images/demo/stencil-test.png differ diff --git a/1_Three.js/6_AR/images/demo/texture.png b/1_Three.js/6_AR/images/demo/texture.png new file mode 100755 index 0000000000000000000000000000000000000000..d3c3b8d233df51007d23c5a0e2fc06106b021b77 Binary files /dev/null and b/1_Three.js/6_AR/images/demo/texture.png differ diff --git a/1_Three.js/6_AR/images/demo/video.png b/1_Three.js/6_AR/images/demo/video.png new file mode 100755 index 0000000000000000000000000000000000000000..13d0b17b375985d9e712556230be770a51b13336 Binary files /dev/null and b/1_Three.js/6_AR/images/demo/video.png differ diff --git a/1_Three.js/6_AR/images/demo/water-effect-AR.png b/1_Three.js/6_AR/images/demo/water-effect-AR.png new file mode 100755 index 0000000000000000000000000000000000000000..7b3855e6f411cd80b4c75e9cb38bd91acda4d568 Binary files /dev/null and b/1_Three.js/6_AR/images/demo/water-effect-AR.png differ diff --git a/1_Three.js/6_AR/images/demo/water-effect.png b/1_Three.js/6_AR/images/demo/water-effect.png new file mode 100755 index 0000000000000000000000000000000000000000..e87bb00cc77486b0ad0df8bbfa8d16c8e26efefc Binary files /dev/null and b/1_Three.js/6_AR/images/demo/water-effect.png differ diff --git a/1_Three.js/6_AR/images/earth-sphere.jpg b/1_Three.js/6_AR/images/earth-sphere.jpg new file mode 100755 index 0000000000000000000000000000000000000000..86322257e709a060628d1a2cbe613745168485e9 Binary files /dev/null and b/1_Three.js/6_AR/images/earth-sphere.jpg differ diff --git a/1_Three.js/6_AR/images/earth.jpg b/1_Three.js/6_AR/images/earth.jpg new file mode 100755 index 0000000000000000000000000000000000000000..05f26ee4e3d954987edc0034bc8323de3e9c28e6 Binary files /dev/null and b/1_Three.js/6_AR/images/earth.jpg differ diff --git a/1_Three.js/6_AR/images/field-sphere.jpg b/1_Three.js/6_AR/images/field-sphere.jpg new file mode 100755 index 0000000000000000000000000000000000000000..982e3ee0a9f89173879d0e89957f272acde5e726 Binary files /dev/null and b/1_Three.js/6_AR/images/field-sphere.jpg differ diff --git a/1_Three.js/6_AR/images/glow.png b/1_Three.js/6_AR/images/glow.png new file mode 100755 index 0000000000000000000000000000000000000000..6d67646e492f5a0d55b9ef953262f7585b8adfa8 Binary files /dev/null and b/1_Three.js/6_AR/images/glow.png differ diff --git a/1_Three.js/6_AR/images/key-blank.png b/1_Three.js/6_AR/images/key-blank.png new file mode 100755 index 0000000000000000000000000000000000000000..0daafbab2cfcd10b3ed3fba74e66b2677fcf386a Binary files /dev/null and b/1_Three.js/6_AR/images/key-blank.png differ diff --git a/1_Three.js/6_AR/images/mountain/negx.jpg b/1_Three.js/6_AR/images/mountain/negx.jpg new file mode 100755 index 0000000000000000000000000000000000000000..d3bdd2b536839f6be0b7a890880f42afd0afa89c Binary files /dev/null and b/1_Three.js/6_AR/images/mountain/negx.jpg differ diff --git a/1_Three.js/6_AR/images/mountain/negy.jpg b/1_Three.js/6_AR/images/mountain/negy.jpg new file mode 100755 index 0000000000000000000000000000000000000000..319c96637f6ad8b1d7ac392540f942b463825784 Binary files /dev/null and b/1_Three.js/6_AR/images/mountain/negy.jpg differ diff --git a/1_Three.js/6_AR/images/mountain/negz.jpg b/1_Three.js/6_AR/images/mountain/negz.jpg new file mode 100755 index 0000000000000000000000000000000000000000..85b6dd20f6433c41003c5576c50390cc1d48d37c Binary files /dev/null and b/1_Three.js/6_AR/images/mountain/negz.jpg differ diff --git a/1_Three.js/6_AR/images/mountain/posx.jpg b/1_Three.js/6_AR/images/mountain/posx.jpg new file mode 100755 index 0000000000000000000000000000000000000000..0e96b5ce8c660a544dbf7ba51204fa67442f78a0 Binary files /dev/null and b/1_Three.js/6_AR/images/mountain/posx.jpg differ diff --git a/1_Three.js/6_AR/images/mountain/posy.jpg b/1_Three.js/6_AR/images/mountain/posy.jpg new file mode 100755 index 0000000000000000000000000000000000000000..f4d5975b97805c0273f63560e270f7735815435c Binary files /dev/null and b/1_Three.js/6_AR/images/mountain/posy.jpg differ diff --git a/1_Three.js/6_AR/images/mountain/posz.jpg b/1_Three.js/6_AR/images/mountain/posz.jpg new file mode 100755 index 0000000000000000000000000000000000000000..1bff1d071ffc91e206bf202ae7f0a04e0afd9add Binary files /dev/null and b/1_Three.js/6_AR/images/mountain/posz.jpg differ diff --git a/1_Three.js/6_AR/images/mountain/readme.txt b/1_Three.js/6_AR/images/mountain/readme.txt new file mode 100755 index 0000000000000000000000000000000000000000..8b404c2736a266c27de41a7d4383493fcf91c8f9 --- /dev/null +++ b/1_Three.js/6_AR/images/mountain/readme.txt @@ -0,0 +1,13 @@ +Author +====== + +This is the work of Emil Persson, aka Humus. +http://www.humus.name + + + +License +======= + +This work is licensed under a Creative Commons Attribution 3.0 Unported License. +http://creativecommons.org/licenses/by/3.0/ diff --git a/1_Three.js/6_AR/images/movement-controls.png b/1_Three.js/6_AR/images/movement-controls.png new file mode 100755 index 0000000000000000000000000000000000000000..fe356c28b54de033c73267561ebd0325f1163341 Binary files /dev/null and b/1_Three.js/6_AR/images/movement-controls.png differ diff --git a/1_Three.js/6_AR/images/noise.jpg b/1_Three.js/6_AR/images/noise.jpg new file mode 100755 index 0000000000000000000000000000000000000000..5593cb31f3692afaf2bcd25569402958f9792f72 Binary files /dev/null and b/1_Three.js/6_AR/images/noise.jpg differ diff --git a/1_Three.js/6_AR/images/pixels.png b/1_Three.js/6_AR/images/pixels.png new file mode 100755 index 0000000000000000000000000000000000000000..7c3eb621d5005308b21782b855d801a950e3049f Binary files /dev/null and b/1_Three.js/6_AR/images/pixels.png differ diff --git a/1_Three.js/6_AR/images/sand.jpg b/1_Three.js/6_AR/images/sand.jpg new file mode 100755 index 0000000000000000000000000000000000000000..774d16ac7aa09906c3291a9869d83861574fc3fa Binary files /dev/null and b/1_Three.js/6_AR/images/sand.jpg differ diff --git a/1_Three.js/6_AR/images/scene-sphere-outside.jpg b/1_Three.js/6_AR/images/scene-sphere-outside.jpg new file mode 100755 index 0000000000000000000000000000000000000000..c94e5a9f137fe62f1f69b728690877896e8d48b3 Binary files /dev/null and b/1_Three.js/6_AR/images/scene-sphere-outside.jpg differ diff --git a/1_Three.js/6_AR/images/scene-sphere-room.jpg b/1_Three.js/6_AR/images/scene-sphere-room.jpg new file mode 100755 index 0000000000000000000000000000000000000000..ddfe13f7e2eee5a11401be6023c78aecea773fc8 Binary files /dev/null and b/1_Three.js/6_AR/images/scene-sphere-room.jpg differ diff --git a/1_Three.js/6_AR/images/sphere-colored.png b/1_Three.js/6_AR/images/sphere-colored.png new file mode 100755 index 0000000000000000000000000000000000000000..bc8d936e9724b4acd866a5c0459c2181a7c4b44b Binary files /dev/null and b/1_Three.js/6_AR/images/sphere-colored.png differ diff --git a/1_Three.js/6_AR/images/sphere-pos-neg.png b/1_Three.js/6_AR/images/sphere-pos-neg.png new file mode 100755 index 0000000000000000000000000000000000000000..ffb94fc5ef43e286855bdb5bfe081ffab1acd922 Binary files /dev/null and b/1_Three.js/6_AR/images/sphere-pos-neg.png differ diff --git a/1_Three.js/6_AR/images/tiles.jpg b/1_Three.js/6_AR/images/tiles.jpg new file mode 100755 index 0000000000000000000000000000000000000000..26b76bdafed9cc5469011bbf6d06e64532a6d398 Binary files /dev/null and b/1_Three.js/6_AR/images/tiles.jpg differ diff --git a/1_Three.js/6_AR/images/water-2.jpg b/1_Three.js/6_AR/images/water-2.jpg new file mode 100755 index 0000000000000000000000000000000000000000..33f6781443c53dd8b2df3344dd28c7a91ab7dcb9 Binary files /dev/null and b/1_Three.js/6_AR/images/water-2.jpg differ diff --git a/1_Three.js/6_AR/images/water.jpg b/1_Three.js/6_AR/images/water.jpg new file mode 100755 index 0000000000000000000000000000000000000000..c9c74cab40654db9fb57d13f9af990056f91d592 Binary files /dev/null and b/1_Three.js/6_AR/images/water.jpg differ diff --git a/1_Three.js/6_AR/images/xneg.png b/1_Three.js/6_AR/images/xneg.png new file mode 100755 index 0000000000000000000000000000000000000000..953a772688b639d4fe6dbca89bb43b69c86cb30c Binary files /dev/null and b/1_Three.js/6_AR/images/xneg.png differ diff --git a/1_Three.js/6_AR/images/xpos.png b/1_Three.js/6_AR/images/xpos.png new file mode 100755 index 0000000000000000000000000000000000000000..5556fc5aca4eaeaecd5070c70662027db7a4cc0c Binary files /dev/null and b/1_Three.js/6_AR/images/xpos.png differ diff --git a/1_Three.js/6_AR/images/yneg.png b/1_Three.js/6_AR/images/yneg.png new file mode 100755 index 0000000000000000000000000000000000000000..8849d5a487ea639150b0efafe705ce1c6e941a20 Binary files /dev/null and b/1_Three.js/6_AR/images/yneg.png differ diff --git a/1_Three.js/6_AR/images/ypos.png b/1_Three.js/6_AR/images/ypos.png new file mode 100755 index 0000000000000000000000000000000000000000..e27e227801dd298dc8d5f2864daa02b73a990dc2 Binary files /dev/null and b/1_Three.js/6_AR/images/ypos.png differ diff --git a/1_Three.js/6_AR/images/zneg.png b/1_Three.js/6_AR/images/zneg.png new file mode 100755 index 0000000000000000000000000000000000000000..793ddca521f11688577121c44f86eccb7f0cb7c2 Binary files /dev/null and b/1_Three.js/6_AR/images/zneg.png differ diff --git a/1_Three.js/6_AR/images/zpos.png b/1_Three.js/6_AR/images/zpos.png new file mode 100755 index 0000000000000000000000000000000000000000..3212744505707be7b25b7e60f65c2dd6497adb5b Binary files /dev/null and b/1_Three.js/6_AR/images/zpos.png differ diff --git a/1_Three.js/6_AR/js/LoaderSupport.js b/1_Three.js/6_AR/js/LoaderSupport.js new file mode 100755 index 0000000000000000000000000000000000000000..6eb9552785ec0c4a922ebcda0fc9766ef2d3b189 --- /dev/null +++ b/1_Three.js/6_AR/js/LoaderSupport.js @@ -0,0 +1,1496 @@ +/** + * @author Kai Salmen / https://kaisalmen.de + * Development repository: https://github.com/kaisalmen/WWOBJLoader + */ + +'use strict'; + +if ( THREE.LoaderSupport === undefined ) { THREE.LoaderSupport = {} } + +/** + * Validation functions. + * @class + */ +THREE.LoaderSupport.Validator = { + /** + * If given input is null or undefined, false is returned otherwise true. + * + * @param input Can be anything + * @returns {boolean} + */ + isValid: function( input ) { + return ( input !== null && input !== undefined ); + }, + /** + * If given input is null or undefined, the defaultValue is returned otherwise the given input. + * + * @param input Can be anything + * @param defaultValue Can be anything + * @returns {*} + */ + verifyInput: function( input, defaultValue ) { + return ( input === null || input === undefined ) ? defaultValue : input; + } +}; + + +/** + * Callbacks utilized by loaders and builders. + * @class + */ +THREE.LoaderSupport.Callbacks = (function () { + + var Validator = THREE.LoaderSupport.Validator; + + function Callbacks() { + this.onProgress = null; + this.onMeshAlter = null; + this.onLoad = null; + this.onLoadMaterials = null; + } + + /** + * Register callback function that is invoked by internal function "announceProgress" to print feedback. + * @memberOf THREE.LoaderSupport.Callbacks + * + * @param {callback} callbackOnProgress Callback function for described functionality + */ + Callbacks.prototype.setCallbackOnProgress = function ( callbackOnProgress ) { + this.onProgress = Validator.verifyInput( callbackOnProgress, this.onProgress ); + }; + + /** + * Register callback function that is called every time a mesh was loaded. + * Use {@link THREE.LoaderSupport.LoadedMeshUserOverride} for alteration instructions (geometry, material or disregard mesh). + * @memberOf THREE.LoaderSupport.Callbacks + * + * @param {callback} callbackOnMeshAlter Callback function for described functionality + */ + Callbacks.prototype.setCallbackOnMeshAlter = function ( callbackOnMeshAlter ) { + this.onMeshAlter = Validator.verifyInput( callbackOnMeshAlter, this.onMeshAlter ); + }; + + /** + * Register callback function that is called once loading of the complete OBJ file is completed. + * @memberOf THREE.LoaderSupport.Callbacks + * + * @param {callback} callbackOnLoad Callback function for described functionality + */ + Callbacks.prototype.setCallbackOnLoad = function ( callbackOnLoad ) { + this.onLoad = Validator.verifyInput( callbackOnLoad, this.onLoad ); + }; + + /** + * Register callback function that is called when materials have been loaded. + * @memberOf THREE.LoaderSupport.Callbacks + * + * @param {callback} callbackOnLoadMaterials Callback function for described functionality + */ + Callbacks.prototype.setCallbackOnLoadMaterials = function ( callbackOnLoadMaterials ) { + this.onLoadMaterials = Validator.verifyInput( callbackOnLoadMaterials, this.onLoadMaterials ); + }; + + return Callbacks; +})(); + + +/** + * Object to return by callback onMeshAlter. Used to disregard a certain mesh or to return one to many meshes. + * @class + * + * @param {boolean} disregardMesh=false Tell implementation to completely disregard this mesh + * @param {boolean} disregardMesh=false Tell implementation that mesh(es) have been altered or added + */ +THREE.LoaderSupport.LoadedMeshUserOverride = (function () { + + function LoadedMeshUserOverride( disregardMesh, alteredMesh ) { + this.disregardMesh = disregardMesh === true; + this.alteredMesh = alteredMesh === true; + this.meshes = []; + } + + /** + * Add a mesh created within callback. + * + * @memberOf THREE.OBJLoader2.LoadedMeshUserOverride + * + * @param {THREE.Mesh} mesh + */ + LoadedMeshUserOverride.prototype.addMesh = function ( mesh ) { + this.meshes.push( mesh ); + this.alteredMesh = true; + }; + + /** + * Answers if mesh shall be disregarded completely. + * + * @returns {boolean} + */ + LoadedMeshUserOverride.prototype.isDisregardMesh = function () { + return this.disregardMesh; + }; + + /** + * Answers if new mesh(es) were created. + * + * @returns {boolean} + */ + LoadedMeshUserOverride.prototype.providesAlteredMeshes = function () { + return this.alteredMesh; + }; + + return LoadedMeshUserOverride; +})(); + + +/** + * A resource description used by {@link THREE.LoaderSupport.PrepData} and others. + * @class + * + * @param {string} url URL to the file + * @param {string} extension The file extension (type) + */ +THREE.LoaderSupport.ResourceDescriptor = (function () { + + var Validator = THREE.LoaderSupport.Validator; + + function ResourceDescriptor( url, extension ) { + var urlParts = url.split( '/' ); + + if ( urlParts.length < 2 ) { + + this.path = null; + this.name = url; + this.url = url; + + } else { + + this.path = Validator.verifyInput( urlParts.slice( 0, urlParts.length - 1).join( '/' ) + '/', null ); + this.name = Validator.verifyInput( urlParts[ urlParts.length - 1 ], null ); + this.url = url; + + } + this.extension = Validator.verifyInput( extension, "default" ); + this.extension = this.extension.trim(); + this.content = null; + } + + /** + * Set the content of this resource + * @memberOf THREE.LoaderSupport.ResourceDescriptor + * + * @param {Object} content The file content as arraybuffer or text + */ + ResourceDescriptor.prototype.setContent = function ( content ) { + this.content = Validator.verifyInput( content, null ); + }; + + return ResourceDescriptor; +})(); + + +/** + * Configuration instructions to be used by run method. + * @class + */ +THREE.LoaderSupport.PrepData = (function () { + + var Validator = THREE.LoaderSupport.Validator; + + function PrepData( modelName ) { + this.logging = { + enabled: true, + debug: false + }; + this.modelName = Validator.verifyInput( modelName, '' ); + this.resources = []; + this.callbacks = new THREE.LoaderSupport.Callbacks(); + } + + /** + * Enable or disable logging in general (except warn and error), plus enable or disable debug logging. + * @memberOf THREE.LoaderSupport.PrepData + * + * @param {boolean} enabled True or false. + * @param {boolean} debug True or false. + */ + PrepData.prototype.setLogging = function ( enabled, debug ) { + this.logging.enabled = enabled === true; + this.logging.debug = debug === true; + }; + + /** + * Returns all callbacks as {@link THREE.LoaderSupport.Callbacks} + * @memberOf THREE.LoaderSupport.PrepData + * + * @returns {THREE.LoaderSupport.Callbacks} + */ + PrepData.prototype.getCallbacks = function () { + return this.callbacks; + }; + + /** + * Add a resource description. + * @memberOf THREE.LoaderSupport.PrepData + * + * @param {THREE.LoaderSupport.ResourceDescriptor} Adds a {@link THREE.LoaderSupport.ResourceDescriptor} + */ + PrepData.prototype.addResource = function ( resource ) { + this.resources.push( resource ); + }; + + /** + * Clones this object and returns it afterwards. Callbacks and resources are not cloned deep (references!). + * @memberOf THREE.LoaderSupport.PrepData + * + * @returns {@link THREE.LoaderSupport.PrepData} + */ + PrepData.prototype.clone = function () { + var clone = new THREE.LoaderSupport.PrepData( this.modelName ); + clone.logging.enabled = this.logging.enabled; + clone.logging.debug = this.logging.debug; + clone.resources = this.resources; + clone.callbacks = this.callbacks; + + var property, value; + for ( property in this ) { + + value = this[ property ]; + if ( ! clone.hasOwnProperty( property ) && typeof this[ property ] !== 'function' ) { + + clone[ property ] = value; + + } + } + + return clone; + }; + + + /** + * Identify files or content of interest from an Array of {@link THREE.LoaderSupport.ResourceDescriptor}. + * @memberOf THREE.LoaderSupport.PrepData + * + * @param {THREE.LoaderSupport.ResourceDescriptor[]} resources Array of {@link THREE.LoaderSupport.ResourceDescriptor} + * @param Object fileDesc Object describing which resources are of interest (ext, type (string or UInt8Array) and ignore (boolean)) + * @returns {{}} Object with each "ext" and the corresponding {@link THREE.LoaderSupport.ResourceDescriptor} + */ + PrepData.prototype.checkResourceDescriptorFiles = function ( resources, fileDesc ) { + var resource, triple, i, found; + var result = {}; + + for ( var index in resources ) { + + resource = resources[ index ]; + found = false; + if ( ! Validator.isValid( resource.name ) ) continue; + if ( Validator.isValid( resource.content ) ) { + + for ( i = 0; i < fileDesc.length && !found; i++ ) { + + triple = fileDesc[ i ]; + if ( resource.extension.toLowerCase() === triple.ext.toLowerCase() ) { + + if ( triple.ignore ) { + + found = true; + + } else if ( triple.type === "ArrayBuffer" ) { + + // fast-fail on bad type + if ( ! ( resource.content instanceof ArrayBuffer || resource.content instanceof Uint8Array ) ) throw 'Provided content is not of type ArrayBuffer! Aborting...'; + result[ triple.ext ] = resource; + found = true; + + } else if ( triple.type === "String" ) { + + if ( ! ( typeof( resource.content ) === 'string' || resource.content instanceof String) ) throw 'Provided content is not of type String! Aborting...'; + result[ triple.ext ] = resource; + found = true; + + } + + } + + } + if ( !found ) throw 'Unidentified resource "' + resource.name + '": ' + resource.url; + + } else { + + // fast-fail on bad type + if ( ! ( typeof( resource.name ) === 'string' || resource.name instanceof String ) ) throw 'Provided file is not properly defined! Aborting...'; + for ( i = 0; i < fileDesc.length && !found; i++ ) { + + triple = fileDesc[ i ]; + if ( resource.extension.toLowerCase() === triple.ext.toLowerCase() ) { + + if ( ! triple.ignore ) result[ triple.ext ] = resource; + found = true; + + } + + } + if ( !found ) throw 'Unidentified resource "' + resource.name + '": ' + resource.url; + + } + } + + return result; + }; + + return PrepData; +})(); + +/** + * Builds one or many THREE.Mesh from one raw set of Arraybuffers, materialGroup descriptions and further parameters. + * Supports vertex, vertexColor, normal, uv and index buffers. + * @class + */ +THREE.LoaderSupport.MeshBuilder = (function () { + + var LOADER_MESH_BUILDER_VERSION = '1.2.0'; + + var Validator = THREE.LoaderSupport.Validator; + + function MeshBuilder() { + console.info( 'Using THREE.LoaderSupport.MeshBuilder version: ' + LOADER_MESH_BUILDER_VERSION ); + this.logging = { + enabled: true, + debug: false + }; + + this.callbacks = new THREE.LoaderSupport.Callbacks(); + this.materials = []; + } + + /** + * Enable or disable logging in general (except warn and error), plus enable or disable debug logging. + * @memberOf THREE.LoaderSupport.MeshBuilder + * + * @param {boolean} enabled True or false. + * @param {boolean} debug True or false. + */ + MeshBuilder.prototype.setLogging = function ( enabled, debug ) { + this.logging.enabled = enabled === true; + this.logging.debug = debug === true; + }; + + /** + * Initializes the MeshBuilder (currently only default material initialisation). + * @memberOf THREE.LoaderSupport.MeshBuilder + * + */ + MeshBuilder.prototype.init = function () { + var defaultMaterial = new THREE.MeshStandardMaterial( { color: 0xDCF1FF } ); + defaultMaterial.name = 'defaultMaterial'; + + var defaultVertexColorMaterial = new THREE.MeshStandardMaterial( { color: 0xDCF1FF } ); + defaultVertexColorMaterial.name = 'defaultVertexColorMaterial'; + defaultVertexColorMaterial.vertexColors = THREE.VertexColors; + + var defaultLineMaterial = new THREE.LineBasicMaterial(); + defaultLineMaterial.name = 'defaultLineMaterial'; + + var defaultPointMaterial = new THREE.PointsMaterial( { size: 1 } ); + defaultPointMaterial.name = 'defaultPointMaterial'; + + var runtimeMaterials = {}; + runtimeMaterials[ defaultMaterial.name ] = defaultMaterial; + runtimeMaterials[ defaultVertexColorMaterial.name ] = defaultVertexColorMaterial; + runtimeMaterials[ defaultLineMaterial.name ] = defaultLineMaterial; + runtimeMaterials[ defaultPointMaterial.name ] = defaultPointMaterial; + + this.updateMaterials( + { + cmd: 'materialData', + materials: { + materialCloneInstructions: null, + serializedMaterials: null, + runtimeMaterials: runtimeMaterials + } + } + ); + }; + + /** + * Set materials loaded by any supplier of an Array of {@link THREE.Material}. + * @memberOf THREE.LoaderSupport.MeshBuilder + * + * @param {THREE.Material[]} materials Array of {@link THREE.Material} + */ + MeshBuilder.prototype.setMaterials = function ( materials ) { + var payload = { + cmd: 'materialData', + materials: { + materialCloneInstructions: null, + serializedMaterials: null, + runtimeMaterials: Validator.isValid( this.callbacks.onLoadMaterials ) ? this.callbacks.onLoadMaterials( materials ) : materials + } + }; + this.updateMaterials( payload ); + }; + + MeshBuilder.prototype._setCallbacks = function ( callbacks ) { + if ( Validator.isValid( callbacks.onProgress ) ) this.callbacks.setCallbackOnProgress( callbacks.onProgress ); + if ( Validator.isValid( callbacks.onMeshAlter ) ) this.callbacks.setCallbackOnMeshAlter( callbacks.onMeshAlter ); + if ( Validator.isValid( callbacks.onLoad ) ) this.callbacks.setCallbackOnLoad( callbacks.onLoad ); + if ( Validator.isValid( callbacks.onLoadMaterials ) ) this.callbacks.setCallbackOnLoadMaterials( callbacks.onLoadMaterials ); + }; + + /** + * Delegates processing of the payload (mesh building or material update) to the corresponding functions (BW-compatibility). + * @memberOf THREE.LoaderSupport.MeshBuilder + * + * @param {Object} payload Raw Mesh or Material descriptions. + * @returns {THREE.Mesh[]} mesh Array of {@link THREE.Mesh} or null in case of material update + */ + MeshBuilder.prototype.processPayload = function ( payload ) { + if ( payload.cmd === 'meshData' ) { + + return this.buildMeshes( payload ); + + } else if ( payload.cmd === 'materialData' ) { + + this.updateMaterials( payload ); + return null; + + } + }; + + /** + * Builds one or multiple meshes from the data described in the payload (buffers, params, material info). + * @memberOf THREE.LoaderSupport.MeshBuilder + * + * @param {Object} meshPayload Raw mesh description (buffers, params, materials) used to build one to many meshes. + * @returns {THREE.Mesh[]} mesh Array of {@link THREE.Mesh} + */ + MeshBuilder.prototype.buildMeshes = function ( meshPayload ) { + var meshName = meshPayload.params.meshName; + + var bufferGeometry = new THREE.BufferGeometry(); + bufferGeometry.addAttribute( 'position', new THREE.BufferAttribute( new Float32Array( meshPayload.buffers.vertices ), 3 ) ); + if ( Validator.isValid( meshPayload.buffers.indices ) ) { + + bufferGeometry.setIndex( new THREE.BufferAttribute( new Uint32Array( meshPayload.buffers.indices ), 1 )); + + } + var haveVertexColors = Validator.isValid( meshPayload.buffers.colors ); + if ( haveVertexColors ) { + + bufferGeometry.addAttribute( 'color', new THREE.BufferAttribute( new Float32Array( meshPayload.buffers.colors ), 3 ) ); + + } + if ( Validator.isValid( meshPayload.buffers.normals ) ) { + + bufferGeometry.addAttribute( 'normal', new THREE.BufferAttribute( new Float32Array( meshPayload.buffers.normals ), 3 ) ); + + } else { + + bufferGeometry.computeVertexNormals(); + + } + if ( Validator.isValid( meshPayload.buffers.uvs ) ) { + + bufferGeometry.addAttribute( 'uv', new THREE.BufferAttribute( new Float32Array( meshPayload.buffers.uvs ), 2 ) ); + + } + + var material, materialName, key; + var materialNames = meshPayload.materials.materialNames; + var createMultiMaterial = meshPayload.materials.multiMaterial; + var multiMaterials = []; + for ( key in materialNames ) { + + materialName = materialNames[ key ]; + material = this.materials[ materialName ]; + if ( createMultiMaterial ) multiMaterials.push( material ); + + } + if ( createMultiMaterial ) { + + material = multiMaterials; + var materialGroups = meshPayload.materials.materialGroups; + var materialGroup; + for ( key in materialGroups ) { + + materialGroup = materialGroups[ key ]; + bufferGeometry.addGroup( materialGroup.start, materialGroup.count, materialGroup.index ); + + } + + } + + var meshes = []; + var mesh; + var callbackOnMeshAlter = this.callbacks.onMeshAlter; + var callbackOnMeshAlterResult; + var useOrgMesh = true; + var geometryType = Validator.verifyInput( meshPayload.geometryType, 0 ); + if ( Validator.isValid( callbackOnMeshAlter ) ) { + + callbackOnMeshAlterResult = callbackOnMeshAlter( + { + detail: { + meshName: meshName, + bufferGeometry: bufferGeometry, + material: material, + geometryType: geometryType + } + } + ); + if ( Validator.isValid( callbackOnMeshAlterResult ) ) { + + if ( ! callbackOnMeshAlterResult.isDisregardMesh() && callbackOnMeshAlterResult.providesAlteredMeshes() ) { + + for ( var i in callbackOnMeshAlterResult.meshes ) { + + meshes.push( callbackOnMeshAlterResult.meshes[ i ] ); + + } + + } + useOrgMesh = false; + + } + + } + if ( useOrgMesh ) { + + if ( meshPayload.computeBoundingSphere ) bufferGeometry.computeBoundingSphere(); + if ( geometryType === 0 ) { + + mesh = new THREE.Mesh( bufferGeometry, material ); + + } else if ( geometryType === 1) { + + mesh = new THREE.LineSegments( bufferGeometry, material ); + + } else { + + mesh = new THREE.Points( bufferGeometry, material ); + + } + mesh.name = meshName; + meshes.push( mesh ); + + } + + var progressMessage; + if ( Validator.isValid( meshes ) && meshes.length > 0 ) { + + var meshNames = []; + for ( var i in meshes ) { + + mesh = meshes[ i ]; + meshNames[ i ] = mesh.name; + + } + progressMessage = 'Adding mesh(es) (' + meshNames.length + ': ' + meshNames + ') from input mesh: ' + meshName; + progressMessage += ' (' + ( meshPayload.progress.numericalValue * 100 ).toFixed( 2 ) + '%)'; + + } else { + + progressMessage = 'Not adding mesh: ' + meshName; + progressMessage += ' (' + ( meshPayload.progress.numericalValue * 100 ).toFixed( 2 ) + '%)'; + + } + var callbackOnProgress = this.callbacks.onProgress; + if ( Validator.isValid( callbackOnProgress ) ) { + + var event = new CustomEvent( 'MeshBuilderEvent', { + detail: { + type: 'progress', + modelName: meshPayload.params.meshName, + text: progressMessage, + numericalValue: meshPayload.progress.numericalValue + } + } ); + callbackOnProgress( event ); + + } + + return meshes; + }; + + /** + * Updates the materials with contained material objects (sync) or from alteration instructions (async). + * @memberOf THREE.LoaderSupport.MeshBuilder + * + * @param {Object} materialPayload Material update instructions + */ + MeshBuilder.prototype.updateMaterials = function ( materialPayload ) { + var material, materialName; + var materialCloneInstructions = materialPayload.materials.materialCloneInstructions; + if ( Validator.isValid( materialCloneInstructions ) ) { + + var materialNameOrg = materialCloneInstructions.materialNameOrg; + var materialOrg = this.materials[ materialNameOrg ]; + + if ( Validator.isValid( materialNameOrg ) ) { + + material = materialOrg.clone(); + + materialName = materialCloneInstructions.materialName; + material.name = materialName; + + var materialProperties = materialCloneInstructions.materialProperties; + for ( var key in materialProperties ) { + + if ( material.hasOwnProperty( key ) && materialProperties.hasOwnProperty( key ) ) material[ key ] = materialProperties[ key ]; + + } + this.materials[ materialName ] = material; + + } else { + + console.warn( 'Requested material "' + materialNameOrg + '" is not available!' ); + + } + } + + var materials = materialPayload.materials.serializedMaterials; + if ( Validator.isValid( materials ) && Object.keys( materials ).length > 0 ) { + + var loader = new THREE.MaterialLoader(); + var materialJson; + for ( materialName in materials ) { + + materialJson = materials[ materialName ]; + if ( Validator.isValid( materialJson ) ) { + + material = loader.parse( materialJson ); + if ( this.logging.enabled ) console.info( 'De-serialized material with name "' + materialName + '" will be added.' ); + this.materials[ materialName ] = material; + } + + } + + } + + materials = materialPayload.materials.runtimeMaterials; + if ( Validator.isValid( materials ) && Object.keys( materials ).length > 0 ) { + + for ( materialName in materials ) { + + material = materials[ materialName ]; + if ( this.logging.enabled ) console.info( 'Material with name "' + materialName + '" will be added.' ); + this.materials[ materialName ] = material; + + } + + } + }; + + /** + * Returns the mapping object of material name and corresponding jsonified material. + * + * @returns {Object} Map of Materials in JSON representation + */ + MeshBuilder.prototype.getMaterialsJSON = function () { + var materialsJSON = {}; + var material; + for ( var materialName in this.materials ) { + + material = this.materials[ materialName ]; + materialsJSON[ materialName ] = material.toJSON(); + } + + return materialsJSON; + }; + + /** + * Returns the mapping object of material name and corresponding material. + * + * @returns {Object} Map of {@link THREE.Material} + */ + MeshBuilder.prototype.getMaterials = function () { + return this.materials; + }; + + return MeshBuilder; +})(); + +/** + * Default implementation of the WorkerRunner responsible for creation and configuration of the parser within the worker. + * + * @class + */ +THREE.LoaderSupport.WorkerRunnerRefImpl = (function () { + + function WorkerRunnerRefImpl() { + var scope = this; + var scopedRunner = function( event ) { + scope.processMessage( event.data ); + }; + self.addEventListener( 'message', scopedRunner, false ); + } + + /** + * Applies values from parameter object via set functions or via direct assignment. + * @memberOf THREE.LoaderSupport.WorkerRunnerRefImpl + * + * @param {Object} parser The parser instance + * @param {Object} params The parameter object + */ + WorkerRunnerRefImpl.prototype.applyProperties = function ( parser, params ) { + var property, funcName, values; + for ( property in params ) { + funcName = 'set' + property.substring( 0, 1 ).toLocaleUpperCase() + property.substring( 1 ); + values = params[ property ]; + + if ( typeof parser[ funcName ] === 'function' ) { + + parser[ funcName ]( values ); + + } else if ( parser.hasOwnProperty( property ) ) { + + parser[ property ] = values; + + } + } + }; + + /** + * Configures the Parser implementation according the supplied configuration object. + * @memberOf THREE.LoaderSupport.WorkerRunnerRefImpl + * + * @param {Object} payload Raw mesh description (buffers, params, materials) used to build one to many meshes. + */ + WorkerRunnerRefImpl.prototype.processMessage = function ( payload ) { + if ( payload.cmd === 'run' ) { + + var callbacks = { + callbackMeshBuilder: function ( payload ) { + self.postMessage( payload ); + }, + callbackProgress: function ( text ) { + if ( payload.logging.enabled && payload.logging.debug ) console.debug( 'WorkerRunner: progress: ' + text ); + } + }; + + // Parser is expected to be named as such + var parser = new Parser(); + if ( typeof parser[ 'setLogging' ] === 'function' ) parser.setLogging( payload.logging.enabled, payload.logging.debug ); + this.applyProperties( parser, payload.params ); + this.applyProperties( parser, payload.materials ); + this.applyProperties( parser, callbacks ); + parser.workerScope = self; + parser.parse( payload.data.input, payload.data.options ); + + if ( payload.logging.enabled ) console.log( 'WorkerRunner: Run complete!' ); + + callbacks.callbackMeshBuilder( { + cmd: 'complete', + msg: 'WorkerRunner completed run.' + } ); + + } else { + + console.error( 'WorkerRunner: Received unknown command: ' + payload.cmd ); + + } + }; + + return WorkerRunnerRefImpl; +})(); + +/** + * This class provides means to transform existing parser code into a web worker. It defines a simple communication protocol + * which allows to configure the worker and receive raw mesh data during execution. + * @class + */ +THREE.LoaderSupport.WorkerSupport = (function () { + + var WORKER_SUPPORT_VERSION = '2.2.0'; + + var Validator = THREE.LoaderSupport.Validator; + + var LoaderWorker = (function () { + + function LoaderWorker() { + this._reset(); + } + + LoaderWorker.prototype._reset = function () { + this.logging = { + enabled: true, + debug: false + }; + this.worker = null; + this.runnerImplName = null; + this.callbacks = { + meshBuilder: null, + onLoad: null + }; + this.terminateRequested = false; + this.queuedMessage = null; + this.started = false; + this.forceCopy = false; + }; + + LoaderWorker.prototype.setLogging = function ( enabled, debug ) { + this.logging.enabled = enabled === true; + this.logging.debug = debug === true; + }; + + LoaderWorker.prototype.setForceCopy = function ( forceCopy ) { + this.forceCopy = forceCopy === true; + }; + + LoaderWorker.prototype.initWorker = function ( code, runnerImplName ) { + this.runnerImplName = runnerImplName; + var blob = new Blob( [ code ], { type: 'application/javascript' } ); + this.worker = new Worker( window.URL.createObjectURL( blob ) ); + this.worker.onmessage = this._receiveWorkerMessage; + + // set referemce to this, then processing in worker scope within "_receiveWorkerMessage" can access members + this.worker.runtimeRef = this; + + // process stored queuedMessage + this._postMessage(); + }; + + /** + * Executed in worker scope + */ + LoaderWorker.prototype._receiveWorkerMessage = function ( e ) { + var payload = e.data; + switch ( payload.cmd ) { + case 'meshData': + case 'materialData': + case 'imageData': + this.runtimeRef.callbacks.meshBuilder( payload ); + break; + + case 'complete': + this.runtimeRef.queuedMessage = null; + this.started = false; + this.runtimeRef.callbacks.onLoad( payload.msg ); + + if ( this.runtimeRef.terminateRequested ) { + + if ( this.runtimeRef.logging.enabled ) console.info( 'WorkerSupport [' + this.runtimeRef.runnerImplName + ']: Run is complete. Terminating application on request!' ); + this.runtimeRef._terminate(); + + } + break; + + case 'error': + console.error( 'WorkerSupport [' + this.runtimeRef.runnerImplName + ']: Reported error: ' + payload.msg ); + this.runtimeRef.queuedMessage = null; + this.started = false; + this.runtimeRef.callbacks.onLoad( payload.msg ); + + if ( this.runtimeRef.terminateRequested ) { + + if ( this.runtimeRef.logging.enabled ) console.info( 'WorkerSupport [' + this.runtimeRef.runnerImplName + ']: Run reported error. Terminating application on request!' ); + this.runtimeRef._terminate(); + + } + break; + + default: + console.error( 'WorkerSupport [' + this.runtimeRef.runnerImplName + ']: Received unknown command: ' + payload.cmd ); + break; + + } + }; + + LoaderWorker.prototype.setCallbacks = function ( meshBuilder, onLoad ) { + this.callbacks.meshBuilder = Validator.verifyInput( meshBuilder, this.callbacks.meshBuilder ); + this.callbacks.onLoad = Validator.verifyInput( onLoad, this.callbacks.onLoad ); + }; + + LoaderWorker.prototype.run = function( payload ) { + if ( Validator.isValid( this.queuedMessage ) ) { + + console.warn( 'Already processing message. Rejecting new run instruction' ); + return; + + } else { + + this.queuedMessage = payload; + this.started = true; + + } + if ( ! Validator.isValid( this.callbacks.meshBuilder ) ) throw 'Unable to run as no "MeshBuilder" callback is set.'; + if ( ! Validator.isValid( this.callbacks.onLoad ) ) throw 'Unable to run as no "onLoad" callback is set.'; + if ( payload.cmd !== 'run' ) payload.cmd = 'run'; + if ( Validator.isValid( payload.logging ) ) { + + payload.logging.enabled = payload.logging.enabled === true; + payload.logging.debug = payload.logging.debug === true; + + } else { + + payload.logging = { + enabled: true, + debug: false + } + + } + this._postMessage(); + }; + + LoaderWorker.prototype._postMessage = function () { + if ( Validator.isValid( this.queuedMessage ) && Validator.isValid( this.worker ) ) { + + if ( this.queuedMessage.data.input instanceof ArrayBuffer ) { + + var content; + if ( this.forceCopy ) { + + content = this.queuedMessage.data.input.slice( 0 ); + + } else { + + content = this.queuedMessage.data.input; + + } + this.worker.postMessage( this.queuedMessage, [ content ] ); + + } else { + + this.worker.postMessage( this.queuedMessage ); + + } + + } + }; + + LoaderWorker.prototype.setTerminateRequested = function ( terminateRequested ) { + this.terminateRequested = terminateRequested === true; + if ( this.terminateRequested && Validator.isValid( this.worker ) && ! Validator.isValid( this.queuedMessage ) && this.started ) { + + if ( this.logging.enabled ) console.info( 'Worker is terminated immediately as it is not running!' ); + this._terminate(); + + } + }; + + LoaderWorker.prototype._terminate = function () { + this.worker.terminate(); + this._reset(); + }; + + return LoaderWorker; + + })(); + + function WorkerSupport() { + console.info( 'Using THREE.LoaderSupport.WorkerSupport version: ' + WORKER_SUPPORT_VERSION ); + this.logging = { + enabled: true, + debug: false + }; + + // check worker support first + if ( window.Worker === undefined ) throw "This browser does not support web workers!"; + if ( window.Blob === undefined ) throw "This browser does not support Blob!"; + if ( typeof window.URL.createObjectURL !== 'function' ) throw "This browser does not support Object creation from URL!"; + + this.loaderWorker = new LoaderWorker(); + } + + /** + * Enable or disable logging in general (except warn and error), plus enable or disable debug logging. + * @memberOf THREE.LoaderSupport.WorkerSupport + * + * @param {boolean} enabled True or false. + * @param {boolean} debug True or false. + */ + WorkerSupport.prototype.setLogging = function ( enabled, debug ) { + this.logging.enabled = enabled === true; + this.logging.debug = debug === true; + this.loaderWorker.setLogging( this.logging.enabled, this.logging.debug ); + }; + + /** + * Forces all ArrayBuffers to be transferred to worker to be copied. + * @memberOf THREE.LoaderSupport.WorkerSupport + * + * @param {boolean} forceWorkerDataCopy True or false. + */ + WorkerSupport.prototype.setForceWorkerDataCopy = function ( forceWorkerDataCopy ) { + this.loaderWorker.setForceCopy( forceWorkerDataCopy ); + }; + + /** + * Validate the status of worker code and the derived worker. + * @memberOf THREE.LoaderSupport.WorkerSupport + * + * @param {Function} functionCodeBuilder Function that is invoked with funcBuildObject and funcBuildSingleton that allows stringification of objects and singletons. + * @param {String} parserName Name of the Parser object + * @param {String[]} libLocations URL of libraries that shall be added to worker code relative to libPath + * @param {String} libPath Base path used for loading libraries + * @param {THREE.LoaderSupport.WorkerRunnerRefImpl} runnerImpl The default worker parser wrapper implementation (communication and execution). An extended class could be passed here. + */ + WorkerSupport.prototype.validate = function ( functionCodeBuilder, parserName, libLocations, libPath, runnerImpl ) { + if ( Validator.isValid( this.loaderWorker.worker ) ) return; + + if ( this.logging.enabled ) { + + console.info( 'WorkerSupport: Building worker code...' ); + console.time( 'buildWebWorkerCode' ); + + } + if ( Validator.isValid( runnerImpl ) ) { + + if ( this.logging.enabled ) console.info( 'WorkerSupport: Using "' + runnerImpl.name + '" as Runner class for worker.' ); + + } else { + + runnerImpl = THREE.LoaderSupport.WorkerRunnerRefImpl; + if ( this.logging.enabled ) console.info( 'WorkerSupport: Using DEFAULT "THREE.LoaderSupport.WorkerRunnerRefImpl" as Runner class for worker.' ); + + } + + var userWorkerCode = functionCodeBuilder( buildObject, buildSingleton ); + userWorkerCode += 'var Parser = '+ parserName + ';\n\n'; + userWorkerCode += buildSingleton( runnerImpl.name, runnerImpl ); + userWorkerCode += 'new ' + runnerImpl.name + '();\n\n'; + + var scope = this; + if ( Validator.isValid( libLocations ) && libLocations.length > 0 ) { + + var libsContent = ''; + var loadAllLibraries = function ( path, locations ) { + if ( locations.length === 0 ) { + + scope.loaderWorker.initWorker( libsContent + userWorkerCode, runnerImpl.name ); + if ( scope.logging.enabled ) console.timeEnd( 'buildWebWorkerCode' ); + + } else { + + var loadedLib = function ( contentAsString ) { + libsContent += contentAsString; + loadAllLibraries( path, locations ); + }; + + var fileLoader = new THREE.FileLoader(); + fileLoader.setPath( path ); + fileLoader.setResponseType( 'text' ); + fileLoader.load( locations[ 0 ], loadedLib ); + locations.shift(); + + } + }; + loadAllLibraries( libPath, libLocations ); + + } else { + + this.loaderWorker.initWorker( userWorkerCode, runnerImpl.name ); + if ( this.logging.enabled ) console.timeEnd( 'buildWebWorkerCode' ); + + } + }; + + /** + * Specify functions that should be build when new raw mesh data becomes available and when the parser is finished. + * @memberOf THREE.LoaderSupport.WorkerSupport + * + * @param {Function} meshBuilder The mesh builder function. Default is {@link THREE.LoaderSupport.MeshBuilder}. + * @param {Function} onLoad The function that is called when parsing is complete. + */ + WorkerSupport.prototype.setCallbacks = function ( meshBuilder, onLoad ) { + this.loaderWorker.setCallbacks( meshBuilder, onLoad ); + }; + + /** + * Runs the parser with the provided configuration. + * @memberOf THREE.LoaderSupport.WorkerSupport + * + * @param {Object} payload Raw mesh description (buffers, params, materials) used to build one to many meshes. + */ + WorkerSupport.prototype.run = function ( payload ) { + this.loaderWorker.run( payload ); + }; + + /** + * Request termination of worker once parser is finished. + * @memberOf THREE.LoaderSupport.WorkerSupport + * + * @param {boolean} terminateRequested True or false. + */ + WorkerSupport.prototype.setTerminateRequested = function ( terminateRequested ) { + this.loaderWorker.setTerminateRequested( terminateRequested ); + }; + + var buildObject = function ( fullName, object ) { + var objectString = fullName + ' = {\n'; + var part; + for ( var name in object ) { + + part = object[ name ]; + if ( typeof( part ) === 'string' || part instanceof String ) { + + part = part.replace( '\n', '\\n' ); + part = part.replace( '\r', '\\r' ); + objectString += '\t' + name + ': "' + part + '",\n'; + + } else if ( part instanceof Array ) { + + objectString += '\t' + name + ': [' + part + '],\n'; + + } else if ( Number.isInteger( part ) ) { + + objectString += '\t' + name + ': ' + part + ',\n'; + + } else if ( typeof part === 'function' ) { + + objectString += '\t' + name + ': ' + part + ',\n'; + + } + + } + objectString += '}\n\n'; + + return objectString; + }; + + var buildSingleton = function ( fullName, object, internalName, basePrototypeName, ignoreFunctions ) { + var objectString = ''; + var objectName = ( Validator.isValid( internalName ) ) ? internalName : object.name; + + var funcString, objectPart, constructorString; + ignoreFunctions = Validator.verifyInput( ignoreFunctions, [] ); + for ( var name in object.prototype ) { + + objectPart = object.prototype[ name ]; + if ( name === 'constructor' ) { + + funcString = objectPart.toString(); + funcString = funcString.replace( 'function', '' ); + constructorString = '\tfunction ' + objectName + funcString + ';\n\n'; + + } else if ( typeof objectPart === 'function' ) { + + if ( ignoreFunctions.indexOf( name ) < 0 ) { + + funcString = objectPart.toString(); + objectString += '\t' + objectName + '.prototype.' + name + ' = ' + funcString + ';\n\n'; + + } + + } + + } + objectString += '\treturn ' + objectName + ';\n'; + objectString += '})();\n\n'; + + var inheritanceBlock = ''; + if ( Validator.isValid( basePrototypeName ) ) { + + inheritanceBlock += '\n'; + inheritanceBlock += objectName + '.prototype = Object.create( ' + basePrototypeName + '.prototype );\n'; + inheritanceBlock += objectName + '.constructor = ' + objectName + ';\n'; + inheritanceBlock += '\n'; + } + if ( ! Validator.isValid( constructorString ) ) { + + constructorString = fullName + ' = (function () {\n\n'; + constructorString += inheritanceBlock + '\t' + object.prototype.constructor.toString() + '\n\n'; + objectString = constructorString + objectString; + + } else { + + objectString = fullName + ' = (function () {\n\n' + inheritanceBlock + constructorString + objectString; + + } + + return objectString; + }; + + return WorkerSupport; + +})(); + +/** + * Orchestrate loading of multiple OBJ files/data from an instruction queue with a configurable amount of workers (1-16). + * Workflow: + * prepareWorkers + * enqueueForRun + * processQueue + * tearDown (to force stop) + * + * @class + * + * @param {string} classDef Class definition to be used for construction + */ +THREE.LoaderSupport.WorkerDirector = (function () { + + var LOADER_WORKER_DIRECTOR_VERSION = '2.2.0'; + + var Validator = THREE.LoaderSupport.Validator; + + var MAX_WEB_WORKER = 16; + var MAX_QUEUE_SIZE = 8192; + + function WorkerDirector( classDef ) { + console.info( 'Using THREE.LoaderSupport.WorkerDirector version: ' + LOADER_WORKER_DIRECTOR_VERSION ); + this.logging = { + enabled: true, + debug: false + }; + + this.maxQueueSize = MAX_QUEUE_SIZE ; + this.maxWebWorkers = MAX_WEB_WORKER; + this.crossOrigin = null; + + if ( ! Validator.isValid( classDef ) ) throw 'Provided invalid classDef: ' + classDef; + + this.workerDescription = { + classDef: classDef, + globalCallbacks: {}, + workerSupports: {}, + forceWorkerDataCopy: true + }; + this.objectsCompleted = 0; + this.instructionQueue = []; + this.instructionQueuePointer = 0; + + this.callbackOnFinishedProcessing = null; + } + + /** + * Enable or disable logging in general (except warn and error), plus enable or disable debug logging. + * @memberOf THREE.LoaderSupport.WorkerDirector + * + * @param {boolean} enabled True or false. + * @param {boolean} debug True or false. + */ + WorkerDirector.prototype.setLogging = function ( enabled, debug ) { + this.logging.enabled = enabled === true; + this.logging.debug = debug === true; + }; + + /** + * Returns the maximum length of the instruction queue. + * @memberOf THREE.LoaderSupport.WorkerDirector + * + * @returns {number} + */ + WorkerDirector.prototype.getMaxQueueSize = function () { + return this.maxQueueSize; + }; + + /** + * Returns the maximum number of workers. + * @memberOf THREE.LoaderSupport.WorkerDirector + * + * @returns {number} + */ + WorkerDirector.prototype.getMaxWebWorkers = function () { + return this.maxWebWorkers; + }; + + /** + * Sets the CORS string to be used. + * @memberOf THREE.LoaderSupport.WorkerDirector + * + * @param {string} crossOrigin CORS value + */ + WorkerDirector.prototype.setCrossOrigin = function ( crossOrigin ) { + this.crossOrigin = crossOrigin; + }; + + /** + * Forces all ArrayBuffers to be transferred to worker to be copied. + * @memberOf THREE.LoaderSupport.WorkerDirector + * + * @param {boolean} forceWorkerDataCopy True or false. + */ + WorkerDirector.prototype.setForceWorkerDataCopy = function ( forceWorkerDataCopy ) { + this.workerDescription.forceWorkerDataCopy = forceWorkerDataCopy === true; + }; + + /** + * Create or destroy workers according limits. Set the name and register callbacks for dynamically created web workers. + * @memberOf THREE.LoaderSupport.WorkerDirector + * + * @param {THREE.OBJLoader2.WWOBJLoader2.PrepDataCallbacks} globalCallbacks Register global callbacks used by all web workers + * @param {number} maxQueueSize Set the maximum size of the instruction queue (1-1024) + * @param {number} maxWebWorkers Set the maximum amount of workers (1-16) + */ + WorkerDirector.prototype.prepareWorkers = function ( globalCallbacks, maxQueueSize, maxWebWorkers ) { + if ( Validator.isValid( globalCallbacks ) ) this.workerDescription.globalCallbacks = globalCallbacks; + this.maxQueueSize = Math.min( maxQueueSize, MAX_QUEUE_SIZE ); + this.maxWebWorkers = Math.min( maxWebWorkers, MAX_WEB_WORKER ); + this.maxWebWorkers = Math.min( this.maxWebWorkers, this.maxQueueSize ); + this.objectsCompleted = 0; + this.instructionQueue = []; + this.instructionQueuePointer = 0; + + for ( var instanceNo = 0; instanceNo < this.maxWebWorkers; instanceNo++ ) { + + var workerSupport = new THREE.LoaderSupport.WorkerSupport(); + workerSupport.setLogging( this.logging.enabled, this.logging.debug ); + workerSupport.setForceWorkerDataCopy( this.workerDescription.forceWorkerDataCopy ); + this.workerDescription.workerSupports[ instanceNo ] = { + instanceNo: instanceNo, + inUse: false, + terminateRequested: false, + workerSupport: workerSupport, + loader: null + }; + + } + }; + + /** + * Store run instructions in internal instructionQueue. + * @memberOf THREE.LoaderSupport.WorkerDirector + * + * @param {THREE.LoaderSupport.PrepData} prepData + */ + WorkerDirector.prototype.enqueueForRun = function ( prepData ) { + if ( this.instructionQueue.length < this.maxQueueSize ) { + this.instructionQueue.push( prepData ); + } + }; + + /** + * Returns if any workers are running. + * + * @memberOf THREE.LoaderSupport.WorkerDirector + * @returns {boolean} + */ + WorkerDirector.prototype.isRunning = function () { + var wsKeys = Object.keys( this.workerDescription.workerSupports ); + return ( ( this.instructionQueue.length > 0 && this.instructionQueuePointer < this.instructionQueue.length ) || wsKeys.length > 0 ); + }; + + /** + * Process the instructionQueue until it is depleted. + * @memberOf THREE.LoaderSupport.WorkerDirector + */ + WorkerDirector.prototype.processQueue = function () { + var prepData, supportDesc; + for ( var instanceNo in this.workerDescription.workerSupports ) { + + supportDesc = this.workerDescription.workerSupports[ instanceNo ]; + if ( ! supportDesc.inUse ) { + + if ( this.instructionQueuePointer < this.instructionQueue.length ) { + + prepData = this.instructionQueue[ this.instructionQueuePointer ]; + this._kickWorkerRun( prepData, supportDesc ); + this.instructionQueuePointer++; + + } else { + + this._deregister( supportDesc ); + + } + + } + + } + + if ( ! this.isRunning() && this.callbackOnFinishedProcessing !== null ) { + + this.callbackOnFinishedProcessing(); + this.callbackOnFinishedProcessing = null; + + } + }; + + WorkerDirector.prototype._kickWorkerRun = function( prepData, supportDesc ) { + supportDesc.inUse = true; + supportDesc.workerSupport.setTerminateRequested( supportDesc.terminateRequested ); + + if ( this.logging.enabled ) console.info( '\nAssigning next item from queue to worker (queue length: ' + this.instructionQueue.length + ')\n\n' ); + + var scope = this; + var prepDataCallbacks = prepData.getCallbacks(); + var globalCallbacks = this.workerDescription.globalCallbacks; + var wrapperOnLoad = function ( event ) { + if ( Validator.isValid( globalCallbacks.onLoad ) ) globalCallbacks.onLoad( event ); + if ( Validator.isValid( prepDataCallbacks.onLoad ) ) prepDataCallbacks.onLoad( event ); + scope.objectsCompleted++; + supportDesc.inUse = false; + + scope.processQueue(); + }; + + var wrapperOnProgress = function ( event ) { + if ( Validator.isValid( globalCallbacks.onProgress ) ) globalCallbacks.onProgress( event ); + if ( Validator.isValid( prepDataCallbacks.onProgress ) ) prepDataCallbacks.onProgress( event ); + }; + + var wrapperOnMeshAlter = function ( event ) { + if ( Validator.isValid( globalCallbacks.onMeshAlter ) ) globalCallbacks.onMeshAlter( event ); + if ( Validator.isValid( prepDataCallbacks.onMeshAlter ) ) prepDataCallbacks.onMeshAlter( event ); + }; + + supportDesc.loader = this._buildLoader( supportDesc.instanceNo ); + + var updatedCallbacks = new THREE.LoaderSupport.Callbacks(); + updatedCallbacks.setCallbackOnLoad( wrapperOnLoad ); + updatedCallbacks.setCallbackOnProgress( wrapperOnProgress ); + updatedCallbacks.setCallbackOnMeshAlter( wrapperOnMeshAlter ); + prepData.callbacks = updatedCallbacks; + + supportDesc.loader.run( prepData, supportDesc.workerSupport ); + }; + + WorkerDirector.prototype._buildLoader = function ( instanceNo ) { + var classDef = this.workerDescription.classDef; + var loader = Object.create( classDef.prototype ); + classDef.call( loader, THREE.DefaultLoadingManager ); + + // verify that all required functions are implemented + if ( ! loader.hasOwnProperty( 'instanceNo' ) ) throw classDef.name + ' has no property "instanceNo".'; + loader.instanceNo = instanceNo; + + if ( ! loader.hasOwnProperty( 'workerSupport' ) ) { + + throw classDef.name + ' has no property "workerSupport".'; + + } + if ( typeof loader.run !== 'function' ) throw classDef.name + ' has no function "run".'; + if ( ! loader.hasOwnProperty( 'callbacks' ) || ! Validator.isValid( loader.callbacks ) ) { + + console.warn( classDef.name + ' has an invalid property "callbacks". Will change to "THREE.LoaderSupport.Callbacks"' ); + loader.callbacks = new THREE.LoaderSupport.Callbacks(); + + } + + return loader; + }; + + WorkerDirector.prototype._deregister = function ( supportDesc ) { + if ( Validator.isValid( supportDesc ) ) { + + supportDesc.workerSupport.setTerminateRequested( true ); + if ( this.logging.enabled ) console.info( 'Requested termination of worker #' + supportDesc.instanceNo + '.' ); + + var loaderCallbacks = supportDesc.loader.callbacks; + if ( Validator.isValid( loaderCallbacks.onProgress ) ) loaderCallbacks.onProgress( { detail: { text: '' } } ); + delete this.workerDescription.workerSupports[ supportDesc.instanceNo ]; + + } + }; + + /** + * Terminate all workers. + * @memberOf THREE.LoaderSupport.WorkerDirector + * + * @param {callback} callbackOnFinishedProcessing Function called once all workers finished processing. + */ + WorkerDirector.prototype.tearDown = function ( callbackOnFinishedProcessing ) { + if ( this.logging.enabled ) console.info( 'WorkerDirector received the deregister call. Terminating all workers!' ); + + this.instructionQueuePointer = this.instructionQueue.length; + this.callbackOnFinishedProcessing = Validator.verifyInput( callbackOnFinishedProcessing, null ); + + for ( var name in this.workerDescription.workerSupports ) { + + this.workerDescription.workerSupports[ name ].terminateRequested = true; + + } + }; + + return WorkerDirector; + +})(); diff --git a/1_Three.js/6_AR/js/MTLLoader.js b/1_Three.js/6_AR/js/MTLLoader.js new file mode 100755 index 0000000000000000000000000000000000000000..41d9578420e4abcfc3a6afbaef825441489e1b7d --- /dev/null +++ b/1_Three.js/6_AR/js/MTLLoader.js @@ -0,0 +1,559 @@ +/** + * Loads a Wavefront .mtl file specifying materials + * + * @author angelxuanchang + */ + +THREE.MTLLoader = function ( manager ) { + + this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager; + +}; + +THREE.MTLLoader.prototype = { + + constructor: THREE.MTLLoader, + + /** + * Loads and parses a MTL asset from a URL. + * + * @param {String} url - URL to the MTL file. + * @param {Function} [onLoad] - Callback invoked with the loaded object. + * @param {Function} [onProgress] - Callback for download progress. + * @param {Function} [onError] - Callback for download errors. + * + * @see setPath setTexturePath + * + * @note In order for relative texture references to resolve correctly + * you must call setPath and/or setTexturePath explicitly prior to load. + */ + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var loader = new THREE.FileLoader( this.manager ); + loader.setPath( this.path ); + loader.load( url, function ( text ) { + + onLoad( scope.parse( text ) ); + + }, onProgress, onError ); + + }, + + /** + * Set base path for resolving references. + * If set this path will be prepended to each loaded and found reference. + * + * @see setTexturePath + * @param {String} path + * @return {THREE.MTLLoader} + * + * @example + * mtlLoader.setPath( 'assets/obj/' ); + * mtlLoader.load( 'my.mtl', ... ); + */ + setPath: function ( path ) { + + this.path = path; + return this; + + }, + + /** + * Set base path for resolving texture references. + * If set this path will be prepended found texture reference. + * If not set and setPath is, it will be used as texture base path. + * + * @see setPath + * @param {String} path + * @return {THREE.MTLLoader} + * + * @example + * mtlLoader.setPath( 'assets/obj/' ); + * mtlLoader.setTexturePath( 'assets/textures/' ); + * mtlLoader.load( 'my.mtl', ... ); + */ + setTexturePath: function ( path ) { + + this.texturePath = path; + return this; + + }, + + setBaseUrl: function ( path ) { + + console.warn( 'THREE.MTLLoader: .setBaseUrl() is deprecated. Use .setTexturePath( path ) for texture path or .setPath( path ) for general base path instead.' ); + + return this.setTexturePath( path ); + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + return this; + + }, + + setMaterialOptions: function ( value ) { + + this.materialOptions = value; + return this; + + }, + + /** + * Parses a MTL file. + * + * @param {String} text - Content of MTL file + * @return {THREE.MTLLoader.MaterialCreator} + * + * @see setPath setTexturePath + * + * @note In order for relative texture references to resolve correctly + * you must call setPath and/or setTexturePath explicitly prior to parse. + */ + parse: function ( text ) { + + var lines = text.split( '\n' ); + var info = {}; + var delimiter_pattern = /\s+/; + var materialsInfo = {}; + + for ( var i = 0; i < lines.length; i ++ ) { + + var line = lines[ i ]; + line = line.trim(); + + if ( line.length === 0 || line.charAt( 0 ) === '#' ) { + + // Blank line or comment ignore + continue; + + } + + var pos = line.indexOf( ' ' ); + + var key = ( pos >= 0 ) ? line.substring( 0, pos ) : line; + key = key.toLowerCase(); + + var value = ( pos >= 0 ) ? line.substring( pos + 1 ) : ''; + value = value.trim(); + + if ( key === 'newmtl' ) { + + // New material + + info = { name: value }; + materialsInfo[ value ] = info; + + } else if ( info ) { + + if ( key === 'ka' || key === 'kd' || key === 'ks' ) { + + var ss = value.split( delimiter_pattern, 3 ); + info[ key ] = [ parseFloat( ss[ 0 ] ), parseFloat( ss[ 1 ] ), parseFloat( ss[ 2 ] ) ]; + + } else { + + info[ key ] = value; + + } + + } + + } + + var materialCreator = new THREE.MTLLoader.MaterialCreator( this.texturePath || this.path, this.materialOptions ); + materialCreator.setCrossOrigin( this.crossOrigin ); + materialCreator.setManager( this.manager ); + materialCreator.setMaterials( materialsInfo ); + return materialCreator; + + } + +}; + +/** + * Create a new THREE-MTLLoader.MaterialCreator + * @param baseUrl - Url relative to which textures are loaded + * @param options - Set of options on how to construct the materials + * side: Which side to apply the material + * THREE.FrontSide (default), THREE.BackSide, THREE.DoubleSide + * wrap: What type of wrapping to apply for textures + * THREE.RepeatWrapping (default), THREE.ClampToEdgeWrapping, THREE.MirroredRepeatWrapping + * normalizeRGB: RGBs need to be normalized to 0-1 from 0-255 + * Default: false, assumed to be already normalized + * ignoreZeroRGBs: Ignore values of RGBs (Ka,Kd,Ks) that are all 0's + * Default: false + * @constructor + */ + +THREE.MTLLoader.MaterialCreator = function ( baseUrl, options ) { + + this.baseUrl = baseUrl || ''; + this.options = options; + this.materialsInfo = {}; + this.materials = {}; + this.materialsArray = []; + this.nameLookup = {}; + + this.side = ( this.options && this.options.side ) ? this.options.side : THREE.FrontSide; + this.wrap = ( this.options && this.options.wrap ) ? this.options.wrap : THREE.RepeatWrapping; + +}; + +THREE.MTLLoader.MaterialCreator.prototype = { + + constructor: THREE.MTLLoader.MaterialCreator, + + crossOrigin: 'Anonymous', + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + + }, + + setManager: function ( value ) { + + this.manager = value; + + }, + + setMaterials: function ( materialsInfo ) { + + this.materialsInfo = this.convert( materialsInfo ); + this.materials = {}; + this.materialsArray = []; + this.nameLookup = {}; + + }, + + convert: function ( materialsInfo ) { + + if ( ! this.options ) return materialsInfo; + + var converted = {}; + + for ( var mn in materialsInfo ) { + + // Convert materials info into normalized form based on options + + var mat = materialsInfo[ mn ]; + + var covmat = {}; + + converted[ mn ] = covmat; + + for ( var prop in mat ) { + + var save = true; + var value = mat[ prop ]; + var lprop = prop.toLowerCase(); + + switch ( lprop ) { + + case 'kd': + case 'ka': + case 'ks': + + // Diffuse color (color under white light) using RGB values + + if ( this.options && this.options.normalizeRGB ) { + + value = [ value[ 0 ] / 255, value[ 1 ] / 255, value[ 2 ] / 255 ]; + + } + + if ( this.options && this.options.ignoreZeroRGBs ) { + + if ( value[ 0 ] === 0 && value[ 1 ] === 0 && value[ 2 ] === 0 ) { + + // ignore + + save = false; + + } + + } + + break; + + default: + + break; + + } + + if ( save ) { + + covmat[ lprop ] = value; + + } + + } + + } + + return converted; + + }, + + preload: function () { + + for ( var mn in this.materialsInfo ) { + + this.create( mn ); + + } + + }, + + getIndex: function ( materialName ) { + + return this.nameLookup[ materialName ]; + + }, + + getAsArray: function () { + + var index = 0; + + for ( var mn in this.materialsInfo ) { + + this.materialsArray[ index ] = this.create( mn ); + this.nameLookup[ mn ] = index; + index ++; + + } + + return this.materialsArray; + + }, + + create: function ( materialName ) { + + if ( this.materials[ materialName ] === undefined ) { + + this.createMaterial_( materialName ); + + } + + return this.materials[ materialName ]; + + }, + + createMaterial_: function ( materialName ) { + + // Create material + + var scope = this; + var mat = this.materialsInfo[ materialName ]; + var params = { + + name: materialName, + side: this.side + + }; + + function resolveURL( baseUrl, url ) { + + if ( typeof url !== 'string' || url === '' ) + return ''; + + // Absolute URL + if ( /^https?:\/\//i.test( url ) ) return url; + + return baseUrl + url; + + } + + function setMapForType( mapType, value ) { + + if ( params[ mapType ] ) return; // Keep the first encountered texture + + var texParams = scope.getTextureParams( value, params ); + var map = scope.loadTexture( resolveURL( scope.baseUrl, texParams.url ) ); + + map.repeat.copy( texParams.scale ); + map.offset.copy( texParams.offset ); + + map.wrapS = scope.wrap; + map.wrapT = scope.wrap; + + params[ mapType ] = map; + + } + + for ( var prop in mat ) { + + var value = mat[ prop ]; + var n; + + if ( value === '' ) continue; + + switch ( prop.toLowerCase() ) { + + // Ns is material specular exponent + + case 'kd': + + // Diffuse color (color under white light) using RGB values + + params.color = new THREE.Color().fromArray( value ); + + break; + + case 'ks': + + // Specular color (color when light is reflected from shiny surface) using RGB values + params.specular = new THREE.Color().fromArray( value ); + + break; + + case 'map_kd': + + // Diffuse texture map + + setMapForType( "map", value ); + + break; + + case 'map_ks': + + // Specular map + + setMapForType( "specularMap", value ); + + break; + + case 'norm': + + setMapForType( "normalMap", value ); + + break; + + case 'map_bump': + case 'bump': + + // Bump texture map + + setMapForType( "bumpMap", value ); + + break; + + case 'ns': + + // The specular exponent (defines the focus of the specular highlight) + // A high exponent results in a tight, concentrated highlight. Ns values normally range from 0 to 1000. + + params.shininess = parseFloat( value ); + + break; + + case 'd': + n = parseFloat( value ); + + if ( n < 1 ) { + + params.opacity = n; + params.transparent = true; + + } + + break; + + case 'tr': + n = parseFloat( value ); + + if ( this.options && this.options.invertTrProperty ) n = 1 - n; + + if ( n > 0 ) { + + params.opacity = 1 - n; + params.transparent = true; + + } + + break; + + default: + break; + + } + + } + + this.materials[ materialName ] = new THREE.MeshPhongMaterial( params ); + return this.materials[ materialName ]; + + }, + + getTextureParams: function ( value, matParams ) { + + var texParams = { + + scale: new THREE.Vector2( 1, 1 ), + offset: new THREE.Vector2( 0, 0 ) + + }; + + var items = value.split( /\s+/ ); + var pos; + + pos = items.indexOf( '-bm' ); + + if ( pos >= 0 ) { + + matParams.bumpScale = parseFloat( items[ pos + 1 ] ); + items.splice( pos, 2 ); + + } + + pos = items.indexOf( '-s' ); + + if ( pos >= 0 ) { + + texParams.scale.set( parseFloat( items[ pos + 1 ] ), parseFloat( items[ pos + 2 ] ) ); + items.splice( pos, 4 ); // we expect 3 parameters here! + + } + + pos = items.indexOf( '-o' ); + + if ( pos >= 0 ) { + + texParams.offset.set( parseFloat( items[ pos + 1 ] ), parseFloat( items[ pos + 2 ] ) ); + items.splice( pos, 4 ); // we expect 3 parameters here! + + } + + texParams.url = items.join( ' ' ).trim(); + return texParams; + + }, + + loadTexture: function ( url, mapping, onLoad, onProgress, onError ) { + + var texture; + var loader = THREE.Loader.Handlers.get( url ); + var manager = ( this.manager !== undefined ) ? this.manager : THREE.DefaultLoadingManager; + + if ( loader === null ) { + + loader = new THREE.TextureLoader( manager ); + + } + + if ( loader.setCrossOrigin ) loader.setCrossOrigin( this.crossOrigin ); + texture = loader.load( url, onLoad, onProgress, onError ); + + if ( mapping !== undefined ) texture.mapping = mapping; + + return texture; + + } + +}; diff --git a/1_Three.js/6_AR/js/OBJLoader.js b/1_Three.js/6_AR/js/OBJLoader.js new file mode 100755 index 0000000000000000000000000000000000000000..15b1f90bf8933fa151842d5fd03d7d141fedd5f2 --- /dev/null +++ b/1_Three.js/6_AR/js/OBJLoader.js @@ -0,0 +1,793 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.OBJLoader = ( function () { + + // o object_name | g group_name + var object_pattern = /^[og]\s*(.+)?/; + // mtllib file_reference + var material_library_pattern = /^mtllib /; + // usemtl material_name + var material_use_pattern = /^usemtl /; + + function ParserState() { + + var state = { + objects: [], + object: {}, + + vertices: [], + normals: [], + colors: [], + uvs: [], + + materialLibraries: [], + + startObject: function ( name, fromDeclaration ) { + + // If the current object (initial from reset) is not from a g/o declaration in the parsed + // file. We need to use it for the first parsed g/o to keep things in sync. + if ( this.object && this.object.fromDeclaration === false ) { + + this.object.name = name; + this.object.fromDeclaration = ( fromDeclaration !== false ); + return; + + } + + var previousMaterial = ( this.object && typeof this.object.currentMaterial === 'function' ? this.object.currentMaterial() : undefined ); + + if ( this.object && typeof this.object._finalize === 'function' ) { + + this.object._finalize( true ); + + } + + this.object = { + name: name || '', + fromDeclaration: ( fromDeclaration !== false ), + + geometry: { + vertices: [], + normals: [], + colors: [], + uvs: [] + }, + materials: [], + smooth: true, + + startMaterial: function ( name, libraries ) { + + var previous = this._finalize( false ); + + // New usemtl declaration overwrites an inherited material, except if faces were declared + // after the material, then it must be preserved for proper MultiMaterial continuation. + if ( previous && ( previous.inherited || previous.groupCount <= 0 ) ) { + + this.materials.splice( previous.index, 1 ); + + } + + var material = { + index: this.materials.length, + name: name || '', + mtllib: ( Array.isArray( libraries ) && libraries.length > 0 ? libraries[ libraries.length - 1 ] : '' ), + smooth: ( previous !== undefined ? previous.smooth : this.smooth ), + groupStart: ( previous !== undefined ? previous.groupEnd : 0 ), + groupEnd: - 1, + groupCount: - 1, + inherited: false, + + clone: function ( index ) { + + var cloned = { + index: ( typeof index === 'number' ? index : this.index ), + name: this.name, + mtllib: this.mtllib, + smooth: this.smooth, + groupStart: 0, + groupEnd: - 1, + groupCount: - 1, + inherited: false + }; + cloned.clone = this.clone.bind( cloned ); + return cloned; + + } + }; + + this.materials.push( material ); + + return material; + + }, + + currentMaterial: function () { + + if ( this.materials.length > 0 ) { + + return this.materials[ this.materials.length - 1 ]; + + } + + return undefined; + + }, + + _finalize: function ( end ) { + + var lastMultiMaterial = this.currentMaterial(); + if ( lastMultiMaterial && lastMultiMaterial.groupEnd === - 1 ) { + + lastMultiMaterial.groupEnd = this.geometry.vertices.length / 3; + lastMultiMaterial.groupCount = lastMultiMaterial.groupEnd - lastMultiMaterial.groupStart; + lastMultiMaterial.inherited = false; + + } + + // Ignore objects tail materials if no face declarations followed them before a new o/g started. + if ( end && this.materials.length > 1 ) { + + for ( var mi = this.materials.length - 1; mi >= 0; mi -- ) { + + if ( this.materials[ mi ].groupCount <= 0 ) { + + this.materials.splice( mi, 1 ); + + } + + } + + } + + // Guarantee at least one empty material, this makes the creation later more straight forward. + if ( end && this.materials.length === 0 ) { + + this.materials.push( { + name: '', + smooth: this.smooth + } ); + + } + + return lastMultiMaterial; + + } + }; + + // Inherit previous objects material. + // Spec tells us that a declared material must be set to all objects until a new material is declared. + // If a usemtl declaration is encountered while this new object is being parsed, it will + // overwrite the inherited material. Exception being that there was already face declarations + // to the inherited material, then it will be preserved for proper MultiMaterial continuation. + + if ( previousMaterial && previousMaterial.name && typeof previousMaterial.clone === 'function' ) { + + var declared = previousMaterial.clone( 0 ); + declared.inherited = true; + this.object.materials.push( declared ); + + } + + this.objects.push( this.object ); + + }, + + finalize: function () { + + if ( this.object && typeof this.object._finalize === 'function' ) { + + this.object._finalize( true ); + + } + + }, + + parseVertexIndex: function ( value, len ) { + + var index = parseInt( value, 10 ); + return ( index >= 0 ? index - 1 : index + len / 3 ) * 3; + + }, + + parseNormalIndex: function ( value, len ) { + + var index = parseInt( value, 10 ); + return ( index >= 0 ? index - 1 : index + len / 3 ) * 3; + + }, + + parseUVIndex: function ( value, len ) { + + var index = parseInt( value, 10 ); + return ( index >= 0 ? index - 1 : index + len / 2 ) * 2; + + }, + + addVertex: function ( a, b, c ) { + + var src = this.vertices; + var dst = this.object.geometry.vertices; + + dst.push( src[ a + 0 ], src[ a + 1 ], src[ a + 2 ] ); + dst.push( src[ b + 0 ], src[ b + 1 ], src[ b + 2 ] ); + dst.push( src[ c + 0 ], src[ c + 1 ], src[ c + 2 ] ); + + }, + + addVertexPoint: function ( a ) { + + var src = this.vertices; + var dst = this.object.geometry.vertices; + + dst.push( src[ a + 0 ], src[ a + 1 ], src[ a + 2 ] ); + + }, + + addVertexLine: function ( a ) { + + var src = this.vertices; + var dst = this.object.geometry.vertices; + + dst.push( src[ a + 0 ], src[ a + 1 ], src[ a + 2 ] ); + + }, + + addNormal: function ( a, b, c ) { + + var src = this.normals; + var dst = this.object.geometry.normals; + + dst.push( src[ a + 0 ], src[ a + 1 ], src[ a + 2 ] ); + dst.push( src[ b + 0 ], src[ b + 1 ], src[ b + 2 ] ); + dst.push( src[ c + 0 ], src[ c + 1 ], src[ c + 2 ] ); + + }, + + addColor: function ( a, b, c ) { + + var src = this.colors; + var dst = this.object.geometry.colors; + + dst.push( src[ a + 0 ], src[ a + 1 ], src[ a + 2 ] ); + dst.push( src[ b + 0 ], src[ b + 1 ], src[ b + 2 ] ); + dst.push( src[ c + 0 ], src[ c + 1 ], src[ c + 2 ] ); + + }, + + addUV: function ( a, b, c ) { + + var src = this.uvs; + var dst = this.object.geometry.uvs; + + dst.push( src[ a + 0 ], src[ a + 1 ] ); + dst.push( src[ b + 0 ], src[ b + 1 ] ); + dst.push( src[ c + 0 ], src[ c + 1 ] ); + + }, + + addUVLine: function ( a ) { + + var src = this.uvs; + var dst = this.object.geometry.uvs; + + dst.push( src[ a + 0 ], src[ a + 1 ] ); + + }, + + addFace: function ( a, b, c, ua, ub, uc, na, nb, nc ) { + + var vLen = this.vertices.length; + + var ia = this.parseVertexIndex( a, vLen ); + var ib = this.parseVertexIndex( b, vLen ); + var ic = this.parseVertexIndex( c, vLen ); + + this.addVertex( ia, ib, ic ); + + if ( ua !== undefined && ua !== '' ) { + + var uvLen = this.uvs.length; + ia = this.parseUVIndex( ua, uvLen ); + ib = this.parseUVIndex( ub, uvLen ); + ic = this.parseUVIndex( uc, uvLen ); + this.addUV( ia, ib, ic ); + + } + + if ( na !== undefined && na !== '' ) { + + // Normals are many times the same. If so, skip function call and parseInt. + var nLen = this.normals.length; + ia = this.parseNormalIndex( na, nLen ); + + ib = na === nb ? ia : this.parseNormalIndex( nb, nLen ); + ic = na === nc ? ia : this.parseNormalIndex( nc, nLen ); + + this.addNormal( ia, ib, ic ); + + } + + if ( this.colors.length > 0 ) { + + this.addColor( ia, ib, ic ); + + } + + }, + + addPointGeometry: function ( vertices ) { + + this.object.geometry.type = 'Points'; + + var vLen = this.vertices.length; + + for ( var vi = 0, l = vertices.length; vi < l; vi ++ ) { + + this.addVertexPoint( this.parseVertexIndex( vertices[ vi ], vLen ) ); + + } + + }, + + addLineGeometry: function ( vertices, uvs ) { + + this.object.geometry.type = 'Line'; + + var vLen = this.vertices.length; + var uvLen = this.uvs.length; + + for ( var vi = 0, l = vertices.length; vi < l; vi ++ ) { + + this.addVertexLine( this.parseVertexIndex( vertices[ vi ], vLen ) ); + + } + + for ( var uvi = 0, l = uvs.length; uvi < l; uvi ++ ) { + + this.addUVLine( this.parseUVIndex( uvs[ uvi ], uvLen ) ); + + } + + } + + }; + + state.startObject( '', false ); + + return state; + + } + + // + + function OBJLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager; + + this.materials = null; + + } + + OBJLoader.prototype = { + + constructor: OBJLoader, + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var loader = new THREE.FileLoader( scope.manager ); + loader.setPath( this.path ); + loader.load( url, function ( text ) { + + onLoad( scope.parse( text ) ); + + }, onProgress, onError ); + + }, + + setPath: function ( value ) { + + this.path = value; + + return this; + + }, + + setMaterials: function ( materials ) { + + this.materials = materials; + + return this; + + }, + + parse: function ( text ) { + + console.time( 'OBJLoader' ); + + var state = new ParserState(); + + if ( text.indexOf( '\r\n' ) !== - 1 ) { + + // This is faster than String.split with regex that splits on both + text = text.replace( /\r\n/g, '\n' ); + + } + + if ( text.indexOf( '\\\n' ) !== - 1 ) { + + // join lines separated by a line continuation character (\) + text = text.replace( /\\\n/g, '' ); + + } + + var lines = text.split( '\n' ); + var line = '', lineFirstChar = ''; + var lineLength = 0; + var result = []; + + // Faster to just trim left side of the line. Use if available. + var trimLeft = ( typeof ''.trimLeft === 'function' ); + + for ( var i = 0, l = lines.length; i < l; i ++ ) { + + line = lines[ i ]; + + line = trimLeft ? line.trimLeft() : line.trim(); + + lineLength = line.length; + + if ( lineLength === 0 ) continue; + + lineFirstChar = line.charAt( 0 ); + + // @todo invoke passed in handler if any + if ( lineFirstChar === '#' ) continue; + + if ( lineFirstChar === 'v' ) { + + var data = line.split( /\s+/ ); + + switch ( data[ 0 ] ) { + + case 'v': + state.vertices.push( + parseFloat( data[ 1 ] ), + parseFloat( data[ 2 ] ), + parseFloat( data[ 3 ] ) + ); + if ( data.length === 8 ) { + + state.colors.push( + parseFloat( data[ 4 ] ), + parseFloat( data[ 5 ] ), + parseFloat( data[ 6 ] ) + + ); + + } + break; + case 'vn': + state.normals.push( + parseFloat( data[ 1 ] ), + parseFloat( data[ 2 ] ), + parseFloat( data[ 3 ] ) + ); + break; + case 'vt': + state.uvs.push( + parseFloat( data[ 1 ] ), + parseFloat( data[ 2 ] ) + ); + break; + + } + + } else if ( lineFirstChar === 'f' ) { + + var lineData = line.substr( 1 ).trim(); + var vertexData = lineData.split( /\s+/ ); + var faceVertices = []; + + // Parse the face vertex data into an easy to work with format + + for ( var j = 0, jl = vertexData.length; j < jl; j ++ ) { + + var vertex = vertexData[ j ]; + + if ( vertex.length > 0 ) { + + var vertexParts = vertex.split( '/' ); + faceVertices.push( vertexParts ); + + } + + } + + // Draw an edge between the first vertex and all subsequent vertices to form an n-gon + + var v1 = faceVertices[ 0 ]; + + for ( var j = 1, jl = faceVertices.length - 1; j < jl; j ++ ) { + + var v2 = faceVertices[ j ]; + var v3 = faceVertices[ j + 1 ]; + + state.addFace( + v1[ 0 ], v2[ 0 ], v3[ 0 ], + v1[ 1 ], v2[ 1 ], v3[ 1 ], + v1[ 2 ], v2[ 2 ], v3[ 2 ] + ); + + } + + } else if ( lineFirstChar === 'l' ) { + + var lineParts = line.substring( 1 ).trim().split( " " ); + var lineVertices = [], lineUVs = []; + + if ( line.indexOf( "/" ) === - 1 ) { + + lineVertices = lineParts; + + } else { + + for ( var li = 0, llen = lineParts.length; li < llen; li ++ ) { + + var parts = lineParts[ li ].split( "/" ); + + if ( parts[ 0 ] !== "" ) lineVertices.push( parts[ 0 ] ); + if ( parts[ 1 ] !== "" ) lineUVs.push( parts[ 1 ] ); + + } + + } + state.addLineGeometry( lineVertices, lineUVs ); + + } else if ( lineFirstChar === 'p' ) { + + var lineData = line.substr( 1 ).trim(); + var pointData = lineData.split( " " ); + + state.addPointGeometry( pointData ); + + } else if ( ( result = object_pattern.exec( line ) ) !== null ) { + + // o object_name + // or + // g group_name + + // WORKAROUND: https://bugs.chromium.org/p/v8/issues/detail?id=2869 + // var name = result[ 0 ].substr( 1 ).trim(); + var name = ( " " + result[ 0 ].substr( 1 ).trim() ).substr( 1 ); + + state.startObject( name ); + + } else if ( material_use_pattern.test( line ) ) { + + // material + + state.object.startMaterial( line.substring( 7 ).trim(), state.materialLibraries ); + + } else if ( material_library_pattern.test( line ) ) { + + // mtl file + + state.materialLibraries.push( line.substring( 7 ).trim() ); + + } else if ( lineFirstChar === 's' ) { + + result = line.split( ' ' ); + + // smooth shading + + // @todo Handle files that have varying smooth values for a set of faces inside one geometry, + // but does not define a usemtl for each face set. + // This should be detected and a dummy material created (later MultiMaterial and geometry groups). + // This requires some care to not create extra material on each smooth value for "normal" obj files. + // where explicit usemtl defines geometry groups. + // Example asset: examples/models/obj/cerberus/Cerberus.obj + + /* + * http://paulbourke.net/dataformats/obj/ + * or + * http://www.cs.utah.edu/~boulos/cs3505/obj_spec.pdf + * + * From chapter "Grouping" Syntax explanation "s group_number": + * "group_number is the smoothing group number. To turn off smoothing groups, use a value of 0 or off. + * Polygonal elements use group numbers to put elements in different smoothing groups. For free-form + * surfaces, smoothing groups are either turned on or off; there is no difference between values greater + * than 0." + */ + if ( result.length > 1 ) { + + var value = result[ 1 ].trim().toLowerCase(); + state.object.smooth = ( value !== '0' && value !== 'off' ); + + } else { + + // ZBrush can produce "s" lines #11707 + state.object.smooth = true; + + } + var material = state.object.currentMaterial(); + if ( material ) material.smooth = state.object.smooth; + + } else { + + // Handle null terminated files without exception + if ( line === '\0' ) continue; + + throw new Error( 'THREE.OBJLoader: Unexpected line: "' + line + '"' ); + + } + + } + + state.finalize(); + + var container = new THREE.Group(); + container.materialLibraries = [].concat( state.materialLibraries ); + + for ( var i = 0, l = state.objects.length; i < l; i ++ ) { + + var object = state.objects[ i ]; + var geometry = object.geometry; + var materials = object.materials; + var isLine = ( geometry.type === 'Line' ); + var isPoints = ( geometry.type === 'Points' ); + var hasVertexColors = false; + + // Skip o/g line declarations that did not follow with any faces + if ( geometry.vertices.length === 0 ) continue; + + var buffergeometry = new THREE.BufferGeometry(); + + buffergeometry.addAttribute( 'position', new THREE.Float32BufferAttribute( geometry.vertices, 3 ) ); + + if ( geometry.normals.length > 0 ) { + + buffergeometry.addAttribute( 'normal', new THREE.Float32BufferAttribute( geometry.normals, 3 ) ); + + } else { + + buffergeometry.computeVertexNormals(); + + } + + if ( geometry.colors.length > 0 ) { + + hasVertexColors = true; + buffergeometry.addAttribute( 'color', new THREE.Float32BufferAttribute( geometry.colors, 3 ) ); + + } + + if ( geometry.uvs.length > 0 ) { + + buffergeometry.addAttribute( 'uv', new THREE.Float32BufferAttribute( geometry.uvs, 2 ) ); + + } + + // Create materials + + var createdMaterials = []; + + for ( var mi = 0, miLen = materials.length; mi < miLen; mi ++ ) { + + var sourceMaterial = materials[ mi ]; + var material = undefined; + + if ( this.materials !== null ) { + + material = this.materials.create( sourceMaterial.name ); + + // mtl etc. loaders probably can't create line materials correctly, copy properties to a line material. + if ( isLine && material && ! ( material instanceof THREE.LineBasicMaterial ) ) { + + var materialLine = new THREE.LineBasicMaterial(); + materialLine.copy( material ); + materialLine.lights = false; // TOFIX + material = materialLine; + + } else if ( isPoints && material && ! ( material instanceof THREE.PointsMaterial ) ) { + + var materialPoints = new THREE.PointsMaterial( { size: 10, sizeAttenuation: false } ); + materialLine.copy( material ); + material = materialPoints; + + } + + } + + if ( ! material ) { + + if ( isLine ) { + + material = new THREE.LineBasicMaterial(); + + } else if ( isPoints ) { + + material = new THREE.PointsMaterial( { size: 1, sizeAttenuation: false } ); + + } else { + + material = new THREE.MeshPhongMaterial(); + + } + + material.name = sourceMaterial.name; + + } + + material.flatShading = sourceMaterial.smooth ? false : true; + material.vertexColors = hasVertexColors ? THREE.VertexColors : THREE.NoColors; + + createdMaterials.push( material ); + + } + + // Create mesh + + var mesh; + + if ( createdMaterials.length > 1 ) { + + for ( var mi = 0, miLen = materials.length; mi < miLen; mi ++ ) { + + var sourceMaterial = materials[ mi ]; + buffergeometry.addGroup( sourceMaterial.groupStart, sourceMaterial.groupCount, mi ); + + } + + if ( isLine ) { + + mesh = new THREE.LineSegments( buffergeometry, createdMaterials ); + + } else if ( isPoints ) { + + mesh = new THREE.Points( buffergeometry, createdMaterials ); + + } else { + + mesh = new THREE.Mesh( buffergeometry, createdMaterials ); + + } + + } else { + + if ( isLine ) { + + mesh = new THREE.LineSegments( buffergeometry, createdMaterials[ 0 ] ); + + } else if ( isPoints ) { + + mesh = new THREE.Points( buffergeometry, createdMaterials[ 0 ] ); + + } else { + + mesh = new THREE.Mesh( buffergeometry, createdMaterials[ 0 ] ); + + } + + } + + mesh.name = object.name; + + container.add( mesh ); + + } + + console.timeEnd( 'OBJLoader' ); + + return container; + + } + + }; + + return OBJLoader; + +} )(); diff --git a/1_Three.js/6_AR/js/ar.js b/1_Three.js/6_AR/js/ar.js new file mode 100755 index 0000000000000000000000000000000000000000..d5218ed1bf2cc4c1bd0550eccbc872c0dce869e2 --- /dev/null +++ b/1_Three.js/6_AR/js/ar.js @@ -0,0 +1,8199 @@ + +((function(){"use strict";var ARController=(function(width,height,camera){var id;var w=width,h=height;this.orientation="landscape";this.listeners={};if(typeof width!=="number"){var image=width;camera=height;w=image.videoWidth||image.width;h=image.videoHeight||image.height;this.image=image}this.defaultMarkerWidth=1;this.patternMarkers={};this.barcodeMarkers={};this.transform_mat=new Float32Array(16);this.canvas=document.createElement("canvas");this.canvas.width=w;this.canvas.height=h;this.ctx=this.canvas.getContext("2d");this.videoWidth=w;this.videoHeight=h;if(typeof camera==="string"){var self=this;this.cameraParam=new ARCameraParam(camera,(function(){self._initialize()}),(function(err){console.error("ARController: Failed to load ARCameraParam",err)}))}else{this.cameraParam=camera;this._initialize()}});ARController.prototype.dispose=(function(){artoolkit.teardown(this.id);for(var t in this){this[t]=null}});ARController.prototype.process=(function(image){this.detectMarker(image);var markerNum=this.getMarkerNum();var k,o;for(k in this.patternMarkers){o=this.patternMarkers[k];o.inPrevious=o.inCurrent;o.inCurrent=false}for(k in this.barcodeMarkers){o=this.barcodeMarkers[k];o.inPrevious=o.inCurrent;o.inCurrent=false}for(var i=0;i<markerNum;i++){var markerInfo=this.getMarker(i);var markerType=artoolkit.UNKNOWN_MARKER;var visible=this.trackPatternMarkerId(-1);if(markerInfo.idPatt>-1&&(markerInfo.id===markerInfo.idPatt||markerInfo.idMatrix===-1)){visible=this.trackPatternMarkerId(markerInfo.idPatt);markerType=artoolkit.PATTERN_MARKER;if(markerInfo.dir!==markerInfo.dirPatt){this.setMarkerInfoDir(i,markerInfo.dirPatt)}}else if(markerInfo.idMatrix>-1){visible=this.trackBarcodeMarkerId(markerInfo.idMatrix);markerType=artoolkit.BARCODE_MARKER;if(markerInfo.dir!==markerInfo.dirMatrix){this.setMarkerInfoDir(i,markerInfo.dirMatrix)}}if(markerType!==artoolkit.UNKNOWN_MARKER&&visible.inPrevious){this.getTransMatSquareCont(i,visible.markerWidth,visible.matrix,visible.matrix)}else{this.getTransMatSquare(i,visible.markerWidth,visible.matrix)}visible.inCurrent=true;this.transMatToGLMat(visible.matrix,this.transform_mat);this.dispatchEvent({name:"getMarker",target:this,data:{index:i,type:markerType,marker:markerInfo,matrix:this.transform_mat}})}var multiMarkerCount=this.getMultiMarkerCount();for(var i=0;i<multiMarkerCount;i++){var subMarkerCount=this.getMultiMarkerPatternCount(i);var visible=false;artoolkit.getTransMatMultiSquareRobust(this.id,i);this.transMatToGLMat(this.marker_transform_mat,this.transform_mat);for(var j=0;j<subMarkerCount;j++){var multiEachMarkerInfo=this.getMultiEachMarker(i,j);if(multiEachMarkerInfo.visible>=0){visible=true;this.dispatchEvent({name:"getMultiMarker",target:this,data:{multiMarkerId:i,matrix:this.transform_mat}});break}}if(visible){for(var j=0;j<subMarkerCount;j++){var multiEachMarkerInfo=this.getMultiEachMarker(i,j);this.transMatToGLMat(this.marker_transform_mat,this.transform_mat);this.dispatchEvent({name:"getMultiMarkerSub",target:this,data:{multiMarkerId:i,markerIndex:j,marker:multiEachMarkerInfo,matrix:this.transform_mat}})}}}if(this._bwpointer){this.debugDraw()}});ARController.prototype.trackPatternMarkerId=(function(id,markerWidth){var obj=this.patternMarkers[id];if(!obj){this.patternMarkers[id]=obj={inPrevious:false,inCurrent:false,matrix:new Float32Array(12),markerWidth:markerWidth||this.defaultMarkerWidth}}if(markerWidth){obj.markerWidth=markerWidth}return obj});ARController.prototype.trackBarcodeMarkerId=(function(id,markerWidth){var obj=this.barcodeMarkers[id];if(!obj){this.barcodeMarkers[id]=obj={inPrevious:false,inCurrent:false,matrix:new Float32Array(12),markerWidth:markerWidth||this.defaultMarkerWidth}}if(markerWidth){obj.markerWidth=markerWidth}return obj});ARController.prototype.getMultiMarkerCount=(function(){return artoolkit.getMultiMarkerCount(this.id)});ARController.prototype.getMultiMarkerPatternCount=(function(multiMarkerId){return artoolkit.getMultiMarkerNum(this.id,multiMarkerId)});ARController.prototype.addEventListener=(function(name,callback){if(!this.listeners[name]){this.listeners[name]=[]}this.listeners[name].push(callback)});ARController.prototype.removeEventListener=(function(name,callback){if(this.listeners[name]){var index=this.listeners[name].indexOf(callback);if(index>-1){this.listeners[name].splice(index,1)}}});ARController.prototype.dispatchEvent=(function(event){var listeners=this.listeners[event.name];if(listeners){for(var i=0;i<listeners.length;i++){listeners[i].call(this,event)}}});ARController.prototype.debugSetup=(function(){document.body.appendChild(this.canvas);this.setDebugMode(1);this._bwpointer=this.getProcessingImage()});ARController.prototype.loadMarker=(function(markerURL,onSuccess,onError){return artoolkit.addMarker(this.id,markerURL,onSuccess,onError)});ARController.prototype.loadMultiMarker=(function(markerURL,onSuccess,onError){return artoolkit.addMultiMarker(this.id,markerURL,onSuccess,onError)});ARController.prototype.getTransMatSquare=(function(markerIndex,markerWidth,dst){artoolkit.getTransMatSquare(this.id,markerIndex,markerWidth);dst.set(this.marker_transform_mat);return dst});ARController.prototype.getTransMatSquareCont=(function(markerIndex,markerWidth,previousMarkerTransform,dst){this.marker_transform_mat.set(previousMarkerTransform);artoolkit.getTransMatSquareCont(this.id,markerIndex,markerWidth);dst.set(this.marker_transform_mat);return dst});ARController.prototype.getTransMatMultiSquare=(function(multiMarkerId,dst){artoolkit.getTransMatMultiSquare(this.id,multiMarkerId);dst.set(this.marker_transform_mat);return dst});ARController.prototype.getTransMatMultiSquareRobust=(function(multiMarkerId,dst){artoolkit.getTransMatMultiSquare(this.id,multiMarkerId);dst.set(this.marker_transform_mat);return dst});ARController.prototype.transMatToGLMat=(function(transMat,glMat,scale){glMat[0+0*4]=transMat[0];glMat[0+1*4]=transMat[1];glMat[0+2*4]=transMat[2];glMat[0+3*4]=transMat[3];glMat[1+0*4]=transMat[4];glMat[1+1*4]=transMat[5];glMat[1+2*4]=transMat[6];glMat[1+3*4]=transMat[7];glMat[2+0*4]=transMat[8];glMat[2+1*4]=transMat[9];glMat[2+2*4]=transMat[10];glMat[2+3*4]=transMat[11];glMat[3+0*4]=0;glMat[3+1*4]=0;glMat[3+2*4]=0;glMat[3+3*4]=1;if(scale!=undefined&&scale!==0){glMat[12]*=scale;glMat[13]*=scale;glMat[14]*=scale}return glMat});ARController.prototype.detectMarker=(function(image){if(this._copyImageToHeap(image)){return artoolkit.detectMarker(this.id)}return-99});ARController.prototype.getMarkerNum=(function(){return artoolkit.getMarkerNum(this.id)});ARController.prototype.getMarker=(function(markerIndex){if(0===artoolkit.getMarker(this.id,markerIndex)){return artoolkit.markerInfo}});ARController.prototype.setMarkerInfoVertex=(function(markerIndex,vertexData){for(var i=0;i<vertexData.length;i++){this.marker_transform_mat[i*2+0]=vertexData[i][0];this.marker_transform_mat[i*2+1]=vertexData[i][1]}return artoolkit.setMarkerInfoVertex(this.id,markerIndex)});ARController.prototype.cloneMarkerInfo=(function(markerInfo){return JSON.parse(JSON.stringify(markerInfo))});ARController.prototype.getMultiEachMarker=(function(multiMarkerId,markerIndex){if(0===artoolkit.getMultiEachMarker(this.id,multiMarkerId,markerIndex)){return artoolkit.multiEachMarkerInfo}});ARController.prototype.getTransformationMatrix=(function(){return this.transform_mat});ARController.prototype.getCameraMatrix=(function(){return this.camera_mat});ARController.prototype.getMarkerTransformationMatrix=(function(){return this.marker_transform_mat});ARController.prototype.setDebugMode=(function(mode){return artoolkit.setDebugMode(this.id,mode)});ARController.prototype.getDebugMode=(function(){return artoolkit.getDebugMode(this.id)});ARController.prototype.getProcessingImage=(function(){return artoolkit.getProcessingImage(this.id)});ARController.prototype.setLogLevel=(function(mode){return artoolkit.setLogLevel(mode)});ARController.prototype.getLogLevel=(function(){return artoolkit.getLogLevel()});ARController.prototype.setMarkerInfoDir=(function(markerIndex,dir){return artoolkit.setMarkerInfoDir(this.id,markerIndex,dir)});ARController.prototype.setProjectionNearPlane=(function(value){return artoolkit.setProjectionNearPlane(this.id,value)});ARController.prototype.getProjectionNearPlane=(function(){return artoolkit.getProjectionNearPlane(this.id)});ARController.prototype.setProjectionFarPlane=(function(value){return artoolkit.setProjectionFarPlane(this.id,value)});ARController.prototype.getProjectionFarPlane=(function(){return artoolkit.getProjectionFarPlane(this.id)});ARController.prototype.setThresholdMode=(function(mode){return artoolkit.setThresholdMode(this.id,mode)});ARController.prototype.getThresholdMode=(function(){return artoolkit.getThresholdMode(this.id)});ARController.prototype.setThreshold=(function(threshold){return artoolkit.setThreshold(this.id,threshold)});ARController.prototype.getThreshold=(function(){return artoolkit.getThreshold(this.id)});ARController.prototype.setPatternDetectionMode=(function(value){return artoolkit.setPatternDetectionMode(this.id,value)});ARController.prototype.getPatternDetectionMode=(function(){return artoolkit.getPatternDetectionMode(this.id)});ARController.prototype.setMatrixCodeType=(function(value){return artoolkit.setMatrixCodeType(this.id,value)});ARController.prototype.getMatrixCodeType=(function(){return artoolkit.getMatrixCodeType(this.id)});ARController.prototype.setLabelingMode=(function(value){return artoolkit.setLabelingMode(this.id,value)});ARController.prototype.getLabelingMode=(function(){return artoolkit.getLabelingMode(this.id)});ARController.prototype.setPattRatio=(function(value){return artoolkit.setPattRatio(this.id,value)});ARController.prototype.getPattRatio=(function(){return artoolkit.getPattRatio(this.id)});ARController.prototype.setImageProcMode=(function(value){return artoolkit.setImageProcMode(this.id,value)});ARController.prototype.getImageProcMode=(function(){return artoolkit.getImageProcMode(this.id)});ARController.prototype.debugDraw=(function(){var debugBuffer=new Uint8ClampedArray(Module.HEAPU8.buffer,this._bwpointer,this.framesize);var id=new ImageData(debugBuffer,this.canvas.width,this.canvas.height);this.ctx.putImageData(id,0,0);var marker_num=this.getMarkerNum();for(var i=0;i<marker_num;i++){this._debugMarker(this.getMarker(i))}});ARController.prototype._initialize=(function(){this.id=artoolkit.setup(this.canvas.width,this.canvas.height,this.cameraParam.id);var params=artoolkit.frameMalloc;this.framepointer=params.framepointer;this.framesize=params.framesize;this.dataHeap=new Uint8Array(Module.HEAPU8.buffer,this.framepointer,this.framesize);this.camera_mat=new Float64Array(Module.HEAPU8.buffer,params.camera,16);this.marker_transform_mat=new Float64Array(Module.HEAPU8.buffer,params.transform,12);this.setProjectionNearPlane(.1);this.setProjectionFarPlane(1e3);var self=this;setTimeout((function(){if(self.onload){self.onload()}self.dispatchEvent({name:"load",target:self})}),1)});ARController.prototype._copyImageToHeap=(function(image){if(!image){image=this.image}this.ctx.save();if(this.orientation==="portrait"){this.ctx.translate(this.canvas.width,0);this.ctx.rotate(Math.PI/2);this.ctx.drawImage(image,0,0,this.canvas.height,this.canvas.width)}else{this.ctx.drawImage(image,0,0,this.canvas.width,this.canvas.height)}this.ctx.restore();var imageData=this.ctx.getImageData(0,0,this.canvas.width,this.canvas.height);var data=imageData.data;if(this.dataHeap){this.dataHeap.set(data);return true}return false});ARController.prototype._debugMarker=(function(marker){var vertex,pos;vertex=marker.vertex;var ctx=this.ctx;ctx.strokeStyle="red";ctx.beginPath();ctx.moveTo(vertex[0][0],vertex[0][1]);ctx.lineTo(vertex[1][0],vertex[1][1]);ctx.stroke();ctx.beginPath();ctx.moveTo(vertex[2][0],vertex[2][1]);ctx.lineTo(vertex[3][0],vertex[3][1]);ctx.stroke();ctx.strokeStyle="green";ctx.beginPath();ctx.lineTo(vertex[1][0],vertex[1][1]);ctx.lineTo(vertex[2][0],vertex[2][1]);ctx.stroke();ctx.beginPath();ctx.moveTo(vertex[3][0],vertex[3][1]);ctx.lineTo(vertex[0][0],vertex[0][1]);ctx.stroke();pos=marker.pos;ctx.beginPath();ctx.arc(pos[0],pos[1],8,0,Math.PI*2);ctx.fillStyle="red";ctx.fill()});ARController.getUserMedia=(function(configuration){var facing=configuration.facingMode||"environment";var onSuccess=configuration.onSuccess;var onError=configuration.onError||(function(err){console.error("ARController.getUserMedia",err)});var video=document.createElement("video");var initProgress=(function(){if(this.videoWidth!==0){onSuccess(video)}});var readyToPlay=false;var eventNames=["touchstart","touchend","touchmove","touchcancel","click","mousedown","mouseup","mousemove","keydown","keyup","keypress","scroll"];var play=(function(ev){if(readyToPlay){video.play();if(!video.paused){eventNames.forEach((function(eventName){window.removeEventListener(eventName,play,true)}))}}});eventNames.forEach((function(eventName){window.addEventListener(eventName,play,true)}));var success=(function(stream){video.addEventListener("loadedmetadata",initProgress,false);video.src=window.URL.createObjectURL(stream);readyToPlay=true;play()});var constraints={};var mediaDevicesConstraints={};if(configuration.width){mediaDevicesConstraints.width=configuration.width;if(typeof configuration.width==="object"){if(configuration.width.max){constraints.maxWidth=configuration.width.max}if(configuration.width.min){constraints.minWidth=configuration.width.max}}else{constraints.maxWidth=configuration.width}}if(configuration.height){mediaDevicesConstraints.height=configuration.height;if(typeof configuration.height==="object"){if(configuration.height.max){constraints.maxHeight=configuration.height.max}if(configuration.height.min){constraints.minHeight=configuration.height.max}}else{constraints.maxHeight=configuration.height}}mediaDevicesConstraints.facingMode=facing;navigator.getUserMedia=navigator.getUserMedia||navigator.webkitGetUserMedia||navigator.mozGetUserMedia||navigator.msGetUserMedia;var hdConstraints={audio:false,video:{mandatory:constraints}};if(false){if(navigator.mediaDevices){navigator.mediaDevices.getUserMedia({audio:false,video:mediaDevicesConstraints}).then(success,onError)}else{MediaStreamTrack.getSources((function(sources){var facingDir=mediaDevicesConstraints.facingMode;if(facing&&facing.exact){facingDir=facing.exact}for(var i=0;i<sources.length;i++){if(sources[i].kind==="video"&&sources[i].facing===facingDir){hdConstraints.video.mandatory.sourceId=sources[i].id;break}}if(facing&&facing.exact&&!hdConstraints.video.mandatory.sourceId){onError("Failed to get camera facing the wanted direction")}else{if(navigator.getUserMedia){navigator.getUserMedia(hdConstraints,success,onError)}else{onError("navigator.getUserMedia is not supported on your browser")}}}))}}else{if(navigator.getUserMedia){navigator.getUserMedia(hdConstraints,success,onError)}else{onError("navigator.getUserMedia is not supported on your browser")}}return video});ARController.getUserMediaARController=(function(configuration){var obj={};for(var i in configuration){obj[i]=configuration[i]}var onSuccess=configuration.onSuccess;var cameraParamURL=configuration.cameraParam;obj.onSuccess=(function(){new ARCameraParam(cameraParamURL,(function(){var arCameraParam=this;var maxSize=configuration.maxARVideoSize||Math.max(video.videoWidth,video.videoHeight);var f=maxSize/Math.max(video.videoWidth,video.videoHeight);var w=f*video.videoWidth;var h=f*video.videoHeight;if(video.videoWidth<video.videoHeight){var tmp=w;w=h;h=tmp}var arController=new ARController(w,h,arCameraParam);arController.image=video;if(video.videoWidth<video.videoHeight){arController.orientation="portrait";arController.videoWidth=video.videoHeight;arController.videoHeight=video.videoWidth}else{arController.orientation="landscape";arController.videoWidth=video.videoWidth;arController.videoHeight=video.videoHeight}onSuccess(arController,arCameraParam)}),(function(err){console.error("ARController: Failed to load ARCameraParam",err)}))});var video=this.getUserMedia(obj);return video});var ARCameraParam=(function(src,onload,onerror){this.id=-1;this._src="";this.complete=false;this.onload=onload;this.onerror=onerror;if(src){this.load(src)}});ARCameraParam.prototype.load=(function(src){if(this._src!==""){throw"ARCameraParam: Trying to load camera parameters twice."}this._src=src;if(src){var self=this;artoolkit.loadCamera(src,(function(id){self.id=id;self.complete=true;self.onload()}),(function(err){self.onerror(err)}))}});Object.defineProperty(ARCameraParam.prototype,"src",{set:(function(src){this.load(src)}),get:(function(){return this._src})});ARCameraParam.prototype.dispose=(function(){if(this.id!==-1){artoolkit.deleteCamera(this.id)}this.id=-1;this._src="";this.complete=false});var artoolkit={UNKNOWN_MARKER:-1,PATTERN_MARKER:0,BARCODE_MARKER:1,loadCamera:loadCamera,addMarker:addMarker,addMultiMarker:addMultiMarker};var FUNCTIONS=["setup","teardown","setLogLevel","getLogLevel","setDebugMode","getDebugMode","getProcessingImage","setMarkerInfoDir","setMarkerInfoVertex","getTransMatSquare","getTransMatSquareCont","getTransMatMultiSquare","getTransMatMultiSquareRobust","getMultiMarkerNum","getMultiMarkerCount","detectMarker","getMarkerNum","getMarker","getMultiEachMarker","setProjectionNearPlane","getProjectionNearPlane","setProjectionFarPlane","getProjectionFarPlane","setThresholdMode","getThresholdMode","setThreshold","getThreshold","setPatternDetectionMode","getPatternDetectionMode","setMatrixCodeType","getMatrixCodeType","setLabelingMode","getLabelingMode","setPattRatio","getPattRatio","setImageProcMode","getImageProcMode"];function runWhenLoaded(){FUNCTIONS.forEach((function(n){artoolkit[n]=Module[n]}));for(var m in Module){if(m.match(/^AR/))artoolkit[m]=Module[m]}}var marker_count=0;function addMarker(arId,url,callback){var filename="/marker_"+marker_count++;ajax(url,filename,(function(){var id=Module._addMarker(arId,filename);if(callback)callback(id)}))}function bytesToString(array){return String.fromCharCode.apply(String,array)}function parseMultiFile(bytes){var str=bytesToString(bytes);var lines=str.split("\n");var files=[];var state=0;var markers=0;lines.forEach((function(line){line=line.trim();if(!line||line.startsWith("#"))return;switch(state){case 0:markers=+line;state=1;return;case 1:if(!line.match(/^\d+$/)){files.push(line)};case 2:case 3:case 4:state++;return;case 5:state=1;return}}));return files}var multi_marker_count=0;function addMultiMarker(arId,url,callback){var filename="/multi_marker_"+multi_marker_count++;ajax(url,filename,(function(bytes){var files=parseMultiFile(bytes);function ok(){var markerID=Module._addMultiMarker(arId,filename);var markerNum=Module.getMultiMarkerNum(arId,markerID);if(callback)callback(markerID,markerNum)}if(!files.length)return ok();var path=url.split("/").slice(0,-1).join("/");files=files.map((function(file){return[path+"/"+file,file]}));ajaxDependencies(files,ok)}))}var camera_count=0;function loadCamera(url,callback){var filename="/camera_param_"+camera_count++;var writeCallback=(function(){var id=Module._loadCamera(filename);if(callback)callback(id)});if(typeof url==="object"){writeByteArrayToFS(filename,url,writeCallback)}else if(url.indexOf("\n")>-1){writeStringToFS(filename,url,writeCallback)}else{ajax(url,filename,writeCallback)}}function writeStringToFS(target,string,callback){var byteArray=new Uint8Array(string.length);for(var i=0;i<byteArray.length;i++){byteArray[i]=string.charCodeAt(i)&255}writeByteArrayToFS(target,byteArray,callback)}function writeByteArrayToFS(target,byteArray,callback){FS.writeFile(target,byteArray,{encoding:"binary"});callback(byteArray)}function ajax(url,target,callback){var oReq=new XMLHttpRequest;oReq.open("GET",url,true);oReq.responseType="arraybuffer";oReq.onload=(function(oEvent){var arrayBuffer=oReq.response;var byteArray=new Uint8Array(arrayBuffer);writeByteArrayToFS(target,byteArray,callback)});oReq.send()}function ajaxDependencies(files,callback){var next=files.pop();if(next){ajax(next[0],next[1],(function(){ajaxDependencies(files,callback)}))}else{callback()}}window.artoolkit=artoolkit;window.ARController=ARController;window.ARCameraParam=ARCameraParam;if(window.Module){runWhenLoaded()}else{window.Module={onRuntimeInitialized:(function(){runWhenLoaded()})}}}))();var Module;if(!Module)Module=(typeof Module!=="undefined"?Module:null)||{};var moduleOverrides={};for(var key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var ENVIRONMENT_IS_WEB=typeof window==="object";var ENVIRONMENT_IS_WORKER=typeof importScripts==="function";var ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof require==="function"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;var ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;if(ENVIRONMENT_IS_NODE){if(!Module["print"])Module["print"]=function print(x){process["stdout"].write(x+"\n")};if(!Module["printErr"])Module["printErr"]=function printErr(x){process["stderr"].write(x+"\n")};var nodeFS=require("fs");var nodePath=require("path");Module["read"]=function read(filename,binary){filename=nodePath["normalize"](filename);var ret=nodeFS["readFileSync"](filename);if(!ret&&filename!=nodePath["resolve"](filename)){filename=path.join(__dirname,"..","src",filename);ret=nodeFS["readFileSync"](filename)}if(ret&&!binary)ret=ret.toString();return ret};Module["readBinary"]=function readBinary(filename){var ret=Module["read"](filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};Module["load"]=function load(f){globalEval(read(f))};if(!Module["thisProgram"]){if(process["argv"].length>1){Module["thisProgram"]=process["argv"][1].replace(/\\/g,"/")}else{Module["thisProgram"]="unknown-program"}}Module["arguments"]=process["argv"].slice(2);if(typeof module!=="undefined"){module["exports"]=Module}process["on"]("uncaughtException",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));Module["inspect"]=(function(){return"[Emscripten Module object]"})}else if(ENVIRONMENT_IS_SHELL){if(!Module["print"])Module["print"]=print;if(typeof printErr!="undefined")Module["printErr"]=printErr;if(typeof read!="undefined"){Module["read"]=read}else{Module["read"]=function read(){throw"no read() available (jsc?)"}}Module["readBinary"]=function readBinary(f){if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}var data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){Module["arguments"]=scriptArgs}else if(typeof arguments!="undefined"){Module["arguments"]=arguments}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){Module["read"]=function read(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(typeof arguments!="undefined"){Module["arguments"]=arguments}if(typeof console!=="undefined"){if(!Module["print"])Module["print"]=function print(x){console.log(x)};if(!Module["printErr"])Module["printErr"]=function printErr(x){console.log(x)}}else{var TRY_USE_DUMP=false;if(!Module["print"])Module["print"]=TRY_USE_DUMP&&typeof dump!=="undefined"?(function(x){dump(x)}):(function(x){})}if(ENVIRONMENT_IS_WORKER){Module["load"]=importScripts}if(typeof Module["setWindowTitle"]==="undefined"){Module["setWindowTitle"]=(function(title){document.title=title})}}else{throw"Unknown runtime environment. Where are we?"}function globalEval(x){eval.call(null,x)}if(!Module["load"]&&Module["read"]){Module["load"]=function load(f){globalEval(Module["read"](f))}}if(!Module["print"]){Module["print"]=(function(){})}if(!Module["printErr"]){Module["printErr"]=Module["print"]}if(!Module["arguments"]){Module["arguments"]=[]}if(!Module["thisProgram"]){Module["thisProgram"]="./this.program"}Module.print=Module["print"];Module.printErr=Module["printErr"];Module["preRun"]=[];Module["postRun"]=[];for(var key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}var Runtime={setTempRet0:(function(value){tempRet0=value}),getTempRet0:(function(){return tempRet0}),stackSave:(function(){return STACKTOP}),stackRestore:(function(stackTop){STACKTOP=stackTop}),getNativeTypeSize:(function(type){switch(type){case"i1":case"i8":return 1;case"i16":return 2;case"i32":return 4;case"i64":return 8;case"float":return 4;case"double":return 8;default:{if(type[type.length-1]==="*"){return Runtime.QUANTUM_SIZE}else if(type[0]==="i"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}),getNativeFieldSize:(function(type){return Math.max(Runtime.getNativeTypeSize(type),Runtime.QUANTUM_SIZE)}),STACK_ALIGN:16,prepVararg:(function(ptr,type){if(type==="double"||type==="i64"){if(ptr&7){assert((ptr&7)===4);ptr+=4}}else{assert((ptr&3)===0)}return ptr}),getAlignSize:(function(type,size,vararg){if(!vararg&&(type=="i64"||type=="double"))return 8;if(!type)return Math.min(size,8);return Math.min(size||(type?Runtime.getNativeFieldSize(type):0),Runtime.QUANTUM_SIZE)}),dynCall:(function(sig,ptr,args){if(args&&args.length){if(!args.splice)args=Array.prototype.slice.call(args);args.splice(0,0,ptr);return Module["dynCall_"+sig].apply(null,args)}else{return Module["dynCall_"+sig].call(null,ptr)}}),functionPointers:[],addFunction:(function(func){for(var i=0;i<Runtime.functionPointers.length;i++){if(!Runtime.functionPointers[i]){Runtime.functionPointers[i]=func;return 2*(1+i)}}throw"Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS."}),removeFunction:(function(index){Runtime.functionPointers[(index-2)/2]=null}),warnOnce:(function(text){if(!Runtime.warnOnce.shown)Runtime.warnOnce.shown={};if(!Runtime.warnOnce.shown[text]){Runtime.warnOnce.shown[text]=1;Module.printErr(text)}}),funcWrappers:{},getFuncWrapper:(function(func,sig){assert(sig);if(!Runtime.funcWrappers[sig]){Runtime.funcWrappers[sig]={}}var sigCache=Runtime.funcWrappers[sig];if(!sigCache[func]){sigCache[func]=function dynCall_wrapper(){return Runtime.dynCall(sig,func,arguments)}}return sigCache[func]}),getCompilerSetting:(function(name){throw"You must build with -s RETAIN_COMPILER_SETTINGS=1 for Runtime.getCompilerSetting or emscripten_get_compiler_setting to work"}),stackAlloc:(function(size){var ret=STACKTOP;STACKTOP=STACKTOP+size|0;STACKTOP=STACKTOP+15&-16;return ret}),staticAlloc:(function(size){var ret=STATICTOP;STATICTOP=STATICTOP+size|0;STATICTOP=STATICTOP+15&-16;return ret}),dynamicAlloc:(function(size){var ret=DYNAMICTOP;DYNAMICTOP=DYNAMICTOP+size|0;DYNAMICTOP=DYNAMICTOP+15&-16;if(DYNAMICTOP>=TOTAL_MEMORY){var success=enlargeMemory();if(!success){DYNAMICTOP=ret;return 0}}return ret}),alignMemory:(function(size,quantum){var ret=size=Math.ceil(size/(quantum?quantum:16))*(quantum?quantum:16);return ret}),makeBigInt:(function(low,high,unsigned){var ret=unsigned?+(low>>>0)+ +(high>>>0)*+4294967296:+(low>>>0)+ +(high|0)*+4294967296;return ret}),GLOBAL_BASE:8,QUANTUM_SIZE:4,__dummy__:0};Module["Runtime"]=Runtime;var __THREW__=0;var ABORT=false;var EXITSTATUS=0;var undef=0;var tempValue,tempInt,tempBigInt,tempInt2,tempBigInt2,tempPair,tempBigIntI,tempBigIntR,tempBigIntS,tempBigIntP,tempBigIntD,tempDouble,tempFloat;var tempI64,tempI64b;var tempRet0,tempRet1,tempRet2,tempRet3,tempRet4,tempRet5,tempRet6,tempRet7,tempRet8,tempRet9;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}var globalScope=this;function getCFunc(ident){var func=Module["_"+ident];if(!func){try{func=eval("_"+ident)}catch(e){}}assert(func,"Cannot call unknown function "+ident+" (perhaps LLVM optimizations or closure removed it?)");return func}var cwrap,ccall;((function(){var JSfuncs={"stackSave":(function(){Runtime.stackSave()}),"stackRestore":(function(){Runtime.stackRestore()}),"arrayToC":(function(arr){var ret=Runtime.stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}),"stringToC":(function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){ret=Runtime.stackAlloc((str.length<<2)+1);writeStringToMemory(str,ret)}return ret})};var toC={"string":JSfuncs["stringToC"],"array":JSfuncs["arrayToC"]};ccall=function ccallFunc(ident,returnType,argTypes,args,opts){var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i<args.length;i++){var converter=toC[argTypes[i]];if(converter){if(stack===0)stack=Runtime.stackSave();cArgs[i]=converter(args[i])}else{cArgs[i]=args[i]}}}var ret=func.apply(null,cArgs);if(returnType==="string")ret=Pointer_stringify(ret);if(stack!==0){if(opts&&opts.async){EmterpreterAsync.asyncFinalizers.push((function(){Runtime.stackRestore(stack)}));return}Runtime.stackRestore(stack)}return ret};var sourceRegex=/^function\s*\(([^)]*)\)\s*{\s*([^*]*?)[\s;]*(?:return\s*(.*?)[;\s]*)?}$/;function parseJSFunc(jsfunc){var parsed=jsfunc.toString().match(sourceRegex).slice(1);return{arguments:parsed[0],body:parsed[1],returnValue:parsed[2]}}var JSsource={};for(var fun in JSfuncs){if(JSfuncs.hasOwnProperty(fun)){JSsource[fun]=parseJSFunc(JSfuncs[fun])}}cwrap=function cwrap(ident,returnType,argTypes){argTypes=argTypes||[];var cfunc=getCFunc(ident);var numericArgs=argTypes.every((function(type){return type==="number"}));var numericRet=returnType!=="string";if(numericRet&&numericArgs){return cfunc}var argNames=argTypes.map((function(x,i){return"$"+i}));var funcstr="(function("+argNames.join(",")+") {";var nargs=argTypes.length;if(!numericArgs){funcstr+="var stack = "+JSsource["stackSave"].body+";";for(var i=0;i<nargs;i++){var arg=argNames[i],type=argTypes[i];if(type==="number")continue;var convertCode=JSsource[type+"ToC"];funcstr+="var "+convertCode.arguments+" = "+arg+";";funcstr+=convertCode.body+";";funcstr+=arg+"="+convertCode.returnValue+";"}}var cfuncname=parseJSFunc((function(){return cfunc})).returnValue;funcstr+="var ret = "+cfuncname+"("+argNames.join(",")+");";if(!numericRet){var strgfy=parseJSFunc((function(){return Pointer_stringify})).returnValue;funcstr+="ret = "+strgfy+"(ret);"}if(!numericArgs){funcstr+=JSsource["stackRestore"].body.replace("()","(stack)")+";"}funcstr+="return ret})";return eval(funcstr)}}))();Module["ccall"]=ccall;Module["cwrap"]=cwrap;function setValue(ptr,value,type,noSafe){type=type||"i8";if(type.charAt(type.length-1)==="*")type="i32";switch(type){case"i1":HEAP8[ptr>>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=+1?tempDouble>+0?(Math_min(+Math_floor(tempDouble/+4294967296),+4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/+4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;default:abort("invalid type for setValue: "+type)}}Module["setValue"]=setValue;function getValue(ptr,type,noSafe){type=type||"i8";if(type.charAt(type.length-1)==="*")type="i32";switch(type){case"i1":return HEAP8[ptr>>0];case"i8":return HEAP8[ptr>>0];case"i16":return HEAP16[ptr>>1];case"i32":return HEAP32[ptr>>2];case"i64":return HEAP32[ptr>>2];case"float":return HEAPF32[ptr>>2];case"double":return HEAPF64[ptr>>3];default:abort("invalid type for setValue: "+type)}return null}Module["getValue"]=getValue;var ALLOC_NORMAL=0;var ALLOC_STACK=1;var ALLOC_STATIC=2;var ALLOC_DYNAMIC=3;var ALLOC_NONE=4;Module["ALLOC_NORMAL"]=ALLOC_NORMAL;Module["ALLOC_STACK"]=ALLOC_STACK;Module["ALLOC_STATIC"]=ALLOC_STATIC;Module["ALLOC_DYNAMIC"]=ALLOC_DYNAMIC;Module["ALLOC_NONE"]=ALLOC_NONE;function allocate(slab,types,allocator,ptr){var zeroinit,size;if(typeof slab==="number"){zeroinit=true;size=slab}else{zeroinit=false;size=slab.length}var singleType=typeof types==="string"?types:null;var ret;if(allocator==ALLOC_NONE){ret=ptr}else{ret=[_malloc,Runtime.stackAlloc,Runtime.staticAlloc,Runtime.dynamicAlloc][allocator===undefined?ALLOC_STATIC:allocator](Math.max(size,singleType?1:types.length))}if(zeroinit){var ptr=ret,stop;assert((ret&3)==0);stop=ret+(size&~3);for(;ptr<stop;ptr+=4){HEAP32[ptr>>2]=0}stop=ret+size;while(ptr<stop){HEAP8[ptr++>>0]=0}return ret}if(singleType==="i8"){if(slab.subarray||slab.slice){HEAPU8.set(slab,ret)}else{HEAPU8.set(new Uint8Array(slab),ret)}return ret}var i=0,type,typeSize,previousType;while(i<size){var curr=slab[i];if(typeof curr==="function"){curr=Runtime.getFunctionIndex(curr)}type=singleType||types[i];if(type===0){i++;continue}if(type=="i64")type="i32";setValue(ret+i,curr,type);if(previousType!==type){typeSize=Runtime.getNativeTypeSize(type);previousType=type}i+=typeSize}return ret}Module["allocate"]=allocate;function getMemory(size){if(!staticSealed)return Runtime.staticAlloc(size);if(typeof _sbrk!=="undefined"&&!_sbrk.called||!runtimeInitialized)return Runtime.dynamicAlloc(size);return _malloc(size)}Module["getMemory"]=getMemory;function Pointer_stringify(ptr,length){if(length===0||!ptr)return"";var hasUtf=0;var t;var i=0;while(1){t=HEAPU8[ptr+i>>0];hasUtf|=t;if(t==0&&!length)break;i++;if(length&&i==length)break}if(!length)length=i;var ret="";if(hasUtf<128){var MAX_CHUNK=1024;var curr;while(length>0){curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,MAX_CHUNK)));ret=ret?ret+curr:curr;ptr+=MAX_CHUNK;length-=MAX_CHUNK}return ret}return Module["UTF8ToString"](ptr)}Module["Pointer_stringify"]=Pointer_stringify;function AsciiToString(ptr){var str="";while(1){var ch=HEAP8[ptr++>>0];if(!ch)return str;str+=String.fromCharCode(ch)}}Module["AsciiToString"]=AsciiToString;function stringToAscii(str,outPtr){return writeAsciiToMemory(str,outPtr,false)}Module["stringToAscii"]=stringToAscii;function UTF8ArrayToString(u8Array,idx){var u0,u1,u2,u3,u4,u5;var str="";while(1){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){u0=(u0&3)<<24|u1<<18|u2<<12|u3<<6|u4}else{u5=u8Array[idx++]&63;u0=(u0&1)<<30|u1<<24|u2<<18|u3<<12|u4<<6|u5}}}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}Module["UTF8ArrayToString"]=UTF8ArrayToString;function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}Module["UTF8ToString"]=UTF8ToString;function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}Module["stringToUTF8Array"]=stringToUTF8Array;function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}Module["stringToUTF8"]=stringToUTF8;function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else if(u<=2047){len+=2}else if(u<=65535){len+=3}else if(u<=2097151){len+=4}else if(u<=67108863){len+=5}else{len+=6}}return len}Module["lengthBytesUTF8"]=lengthBytesUTF8;function UTF16ToString(ptr){var i=0;var str="";while(1){var codeUnit=HEAP16[ptr+i*2>>1];if(codeUnit==0)return str;++i;str+=String.fromCharCode(codeUnit)}}Module["UTF16ToString"]=UTF16ToString;function stringToUTF16(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<2)return 0;maxBytesToWrite-=2;var startPtr=outPtr;var numCharsToWrite=maxBytesToWrite<str.length*2?maxBytesToWrite/2:str.length;for(var i=0;i<numCharsToWrite;++i){var codeUnit=str.charCodeAt(i);HEAP16[outPtr>>1]=codeUnit;outPtr+=2}HEAP16[outPtr>>1]=0;return outPtr-startPtr}Module["stringToUTF16"]=stringToUTF16;function lengthBytesUTF16(str){return str.length*2}Module["lengthBytesUTF16"]=lengthBytesUTF16;function UTF32ToString(ptr){var i=0;var str="";while(1){var utf32=HEAP32[ptr+i*4>>2];if(utf32==0)return str;++i;if(utf32>=65536){var ch=utf32-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}else{str+=String.fromCharCode(utf32)}}}Module["UTF32ToString"]=UTF32ToString;function stringToUTF32(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<4)return 0;var startPtr=outPtr;var endPtr=startPtr+maxBytesToWrite-4;for(var i=0;i<str.length;++i){var codeUnit=str.charCodeAt(i);if(codeUnit>=55296&&codeUnit<=57343){var trailSurrogate=str.charCodeAt(++i);codeUnit=65536+((codeUnit&1023)<<10)|trailSurrogate&1023}HEAP32[outPtr>>2]=codeUnit;outPtr+=4;if(outPtr+4>endPtr)break}HEAP32[outPtr>>2]=0;return outPtr-startPtr}Module["stringToUTF32"]=stringToUTF32;function lengthBytesUTF32(str){var len=0;for(var i=0;i<str.length;++i){var codeUnit=str.charCodeAt(i);if(codeUnit>=55296&&codeUnit<=57343)++i;len+=4}return len}Module["lengthBytesUTF32"]=lengthBytesUTF32;function demangle(func){var hasLibcxxabi=!!Module["___cxa_demangle"];if(hasLibcxxabi){try{var buf=_malloc(func.length);writeStringToMemory(func.substr(1),buf);var status=_malloc(4);var ret=Module["___cxa_demangle"](buf,0,0,status);if(getValue(status,"i32")===0&&ret){return Pointer_stringify(ret)}}catch(e){}finally{if(buf)_free(buf);if(status)_free(status);if(ret)_free(ret)}}var i=3;var basicTypes={"v":"void","b":"bool","c":"char","s":"short","i":"int","l":"long","f":"float","d":"double","w":"wchar_t","a":"signed char","h":"unsigned char","t":"unsigned short","j":"unsigned int","m":"unsigned long","x":"long long","y":"unsigned long long","z":"..."};var subs=[];var first=true;function dump(x){if(x)Module.print(x);Module.print(func);var pre="";for(var a=0;a<i;a++)pre+=" ";Module.print(pre+"^")}function parseNested(){i++;if(func[i]==="K")i++;var parts=[];while(func[i]!=="E"){if(func[i]==="S"){i++;var next=func.indexOf("_",i);var num=func.substring(i,next)||0;parts.push(subs[num]||"?");i=next+1;continue}if(func[i]==="C"){parts.push(parts[parts.length-1]);i+=2;continue}var size=parseInt(func.substr(i));var pre=size.toString().length;if(!size||!pre){i--;break}var curr=func.substr(i+pre,size);parts.push(curr);subs.push(curr);i+=pre+size}i++;return parts}function parse(rawList,limit,allowVoid){limit=limit||Infinity;var ret="",list=[];function flushList(){return"("+list.join(", ")+")"}var name;if(func[i]==="N"){name=parseNested().join("::");limit--;if(limit===0)return rawList?[name]:name}else{if(func[i]==="K"||first&&func[i]==="L")i++;var size=parseInt(func.substr(i));if(size){var pre=size.toString().length;name=func.substr(i+pre,size);i+=pre+size}}first=false;if(func[i]==="I"){i++;var iList=parse(true);var iRet=parse(true,1,true);ret+=iRet[0]+" "+name+"<"+iList.join(", ")+">"}else{ret=name}paramLoop:while(i<func.length&&limit-->0){var c=func[i++];if(c in basicTypes){list.push(basicTypes[c])}else{switch(c){case"P":list.push(parse(true,1,true)[0]+"*");break;case"R":list.push(parse(true,1,true)[0]+"&");break;case"L":{i++;var end=func.indexOf("E",i);var size=end-i;list.push(func.substr(i,size));i+=size+2;break};case"A":{var size=parseInt(func.substr(i));i+=size.toString().length;if(func[i]!=="_")throw"?";i++;list.push(parse(true,1,true)[0]+" ["+size+"]");break};case"E":break paramLoop;default:ret+="?"+c;break paramLoop}}}if(!allowVoid&&list.length===1&&list[0]==="void")list=[];if(rawList){if(ret){list.push(ret+"?")}return list}else{return ret+flushList()}}var parsed=func;try{if(func=="Object._main"||func=="_main"){return"main()"}if(typeof func==="number")func=Pointer_stringify(func);if(func[0]!=="_")return func;if(func[1]!=="_")return func;if(func[2]!=="Z")return func;switch(func[3]){case"n":return"operator new()";case"d":return"operator delete()"}parsed=parse()}catch(e){parsed+="?"}if(parsed.indexOf("?")>=0&&!hasLibcxxabi){Runtime.warnOnce("warning: a problem occurred in builtin C++ name demangling; build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling")}return parsed}function demangleAll(text){return text.replace(/__Z[\w\d_]+/g,(function(x){var y=demangle(x);return x===y?x:x+" ["+y+"]"}))}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error(0)}catch(e){err=e}if(!err.stack){return"(no stack trace available)"}}return err.stack.toString()}function stackTrace(){return demangleAll(jsStackTrace())}Module["stackTrace"]=stackTrace;var PAGE_SIZE=4096;function alignMemoryPage(x){if(x%4096>0){x+=4096-x%4096}return x}var HEAP;var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;var STATIC_BASE=0,STATICTOP=0,staticSealed=false;var STACK_BASE=0,STACKTOP=0,STACK_MAX=0;var DYNAMIC_BASE=0,DYNAMICTOP=0;function abortOnCannotGrowMemory(){abort("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value "+TOTAL_MEMORY+", (2) compile with -s ALLOW_MEMORY_GROWTH=1 which adjusts the size at runtime but prevents some optimizations, (3) set Module.TOTAL_MEMORY to a higher value before the program runs, or if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 ")}function enlargeMemory(){abortOnCannotGrowMemory()}var TOTAL_STACK=Module["TOTAL_STACK"]||5242880;var TOTAL_MEMORY=Module["TOTAL_MEMORY"]||268435456;var totalMemory=64*1024;while(totalMemory<TOTAL_MEMORY||totalMemory<2*TOTAL_STACK){if(totalMemory<16*1024*1024){totalMemory*=2}else{totalMemory+=16*1024*1024}}if(totalMemory!==TOTAL_MEMORY){TOTAL_MEMORY=totalMemory}assert(typeof Int32Array!=="undefined"&&typeof Float64Array!=="undefined"&&!!(new Int32Array(1))["subarray"]&&!!(new Int32Array(1))["set"],"JS engine does not provide full typed array support");var buffer;buffer=new ArrayBuffer(TOTAL_MEMORY);HEAP8=new Int8Array(buffer);HEAP16=new Int16Array(buffer);HEAP32=new Int32Array(buffer);HEAPU8=new Uint8Array(buffer);HEAPU16=new Uint16Array(buffer);HEAPU32=new Uint32Array(buffer);HEAPF32=new Float32Array(buffer);HEAPF64=new Float64Array(buffer);HEAP32[0]=255;assert(HEAPU8[0]===255&&HEAPU8[3]===0,"Typed arrays 2 must be run on a little-endian system");Module["HEAP"]=HEAP;Module["buffer"]=buffer;Module["HEAP8"]=HEAP8;Module["HEAP16"]=HEAP16;Module["HEAP32"]=HEAP32;Module["HEAPU8"]=HEAPU8;Module["HEAPU16"]=HEAPU16;Module["HEAPU32"]=HEAPU32;Module["HEAPF32"]=HEAPF32;Module["HEAPF64"]=HEAPF64;function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback();continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){Runtime.dynCall("v",func)}else{Runtime.dynCall("vi",func,[callback.arg])}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}Module["addOnPreRun"]=addOnPreRun;function addOnInit(cb){__ATINIT__.unshift(cb)}Module["addOnInit"]=addOnInit;function addOnPreMain(cb){__ATMAIN__.unshift(cb)}Module["addOnPreMain"]=addOnPreMain;function addOnExit(cb){__ATEXIT__.unshift(cb)}Module["addOnExit"]=addOnExit;function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}Module["addOnPostRun"]=addOnPostRun;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}Module["intArrayFromString"]=intArrayFromString;function intArrayToString(array){var ret=[];for(var i=0;i<array.length;i++){var chr=array[i];if(chr>255){chr&=255}ret.push(String.fromCharCode(chr))}return ret.join("")}Module["intArrayToString"]=intArrayToString;function writeStringToMemory(string,buffer,dontAddNull){var array=intArrayFromString(string,dontAddNull);var i=0;while(i<array.length){var chr=array[i];HEAP8[buffer+i>>0]=chr;i=i+1}}Module["writeStringToMemory"]=writeStringToMemory;function writeArrayToMemory(array,buffer){for(var i=0;i<array.length;i++){HEAP8[buffer++>>0]=array[i]}}Module["writeArrayToMemory"]=writeArrayToMemory;function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i<str.length;++i){HEAP8[buffer++>>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}Module["writeAsciiToMemory"]=writeAsciiToMemory;function unSign(value,bits,ignore){if(value>=0){return value}return bits<=32?2*Math.abs(1<<bits-1)+value:Math.pow(2,bits)+value}function reSign(value,bits,ignore){if(value<=0){return value}var half=bits<=32?Math.abs(1<<bits-1):Math.pow(2,bits-1);if(value>=half&&(bits<=32||value>half)){value=-2*half+value}return value}if(!Math["imul"]||Math["imul"](4294967295,5)!==-5)Math["imul"]=function imul(a,b){var ah=a>>>16;var al=a&65535;var bh=b>>>16;var bl=b&65535;return al*bl+(ah*bl+al*bh<<16)|0};Math.imul=Math["imul"];if(!Math["clz32"])Math["clz32"]=(function(x){x=x>>>0;for(var i=0;i<32;i++){if(x&1<<31-i)return i}return 32});Math.clz32=Math["clz32"];var Math_abs=Math.abs;var Math_cos=Math.cos;var Math_sin=Math.sin;var Math_tan=Math.tan;var Math_acos=Math.acos;var Math_asin=Math.asin;var Math_atan=Math.atan;var Math_atan2=Math.atan2;var Math_exp=Math.exp;var Math_log=Math.log;var Math_sqrt=Math.sqrt;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_pow=Math.pow;var Math_imul=Math.imul;var Math_fround=Math.fround;var Math_min=Math.min;var Math_clz32=Math.clz32;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}Module["addRunDependency"]=addRunDependency;function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["removeRunDependency"]=removeRunDependency;Module["preloadedImages"]={};Module["preloadedAudios"]={};var memoryInitializer=null;var ASM_CONSTS=[(function($0,$1,$2,$3){{if(!artoolkit["multiEachMarkerInfo"]){artoolkit["multiEachMarkerInfo"]={}}var multiEachMarker=artoolkit["multiEachMarkerInfo"];multiEachMarker["visible"]=$0;multiEachMarker["pattId"]=$1;multiEachMarker["pattType"]=$2;multiEachMarker["width"]=$3}}),(function($0,$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){{var $a=arguments;var i=12;if(!artoolkit["markerInfo"]){artoolkit["markerInfo"]={pos:[0,0],line:[[0,0,0],[0,0,0],[0,0,0],[0,0,0]],vertex:[[0,0],[0,0],[0,0],[0,0]]}}var markerInfo=artoolkit["markerInfo"];markerInfo["area"]=$0;markerInfo["id"]=$1;markerInfo["idPatt"]=$2;markerInfo["idMatrix"]=$3;markerInfo["dir"]=$4;markerInfo["dirPatt"]=$5;markerInfo["dirMatrix"]=$6;markerInfo["cf"]=$7;markerInfo["cfPatt"]=$8;markerInfo["cfMatrix"]=$9;markerInfo["pos"][0]=$10;markerInfo["pos"][1]=$11;markerInfo["line"][0][0]=$a[i++];markerInfo["line"][0][1]=$a[i++];markerInfo["line"][0][2]=$a[i++];markerInfo["line"][1][0]=$a[i++];markerInfo["line"][1][1]=$a[i++];markerInfo["line"][1][2]=$a[i++];markerInfo["line"][2][0]=$a[i++];markerInfo["line"][2][1]=$a[i++];markerInfo["line"][2][2]=$a[i++];markerInfo["line"][3][0]=$a[i++];markerInfo["line"][3][1]=$a[i++];markerInfo["line"][3][2]=$a[i++];markerInfo["vertex"][0][0]=$a[i++];markerInfo["vertex"][0][1]=$a[i++];markerInfo["vertex"][1][0]=$a[i++];markerInfo["vertex"][1][1]=$a[i++];markerInfo["vertex"][2][0]=$a[i++];markerInfo["vertex"][2][1]=$a[i++];markerInfo["vertex"][3][0]=$a[i++];markerInfo["vertex"][3][1]=$a[i++];markerInfo["errorCorrected"]=$a[i++]}}),(function($0,$1,$2,$3,$4){{if(!artoolkit["frameMalloc"]){artoolkit["frameMalloc"]={}}var frameMalloc=artoolkit["frameMalloc"];frameMalloc["framepointer"]=$1;frameMalloc["framesize"]=$2;frameMalloc["camera"]=$3;frameMalloc["transform"]=$4}})];function _emscripten_asm_const_33(code,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32){return ASM_CONSTS[code](a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32)}function _emscripten_asm_const_4(code,a0,a1,a2,a3){return ASM_CONSTS[code](a0,a1,a2,a3)}function _emscripten_asm_const_5(code,a0,a1,a2,a3,a4){return ASM_CONSTS[code](a0,a1,a2,a3,a4)}STATIC_BASE=8;STATICTOP=STATIC_BASE+16496;__ATINIT__.push({func:(function(){__GLOBAL__sub_I_ARToolKitJS_cpp()})},{func:(function(){__GLOBAL__sub_I_bind_cpp()})});allocate([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,9,0,0,53,42,0,0,0,0,0,0,1,0,0,0,128,1,0,0,0,0,0,0,228,8,0,0,116,42,0,0,52,9,0,0,136,47,0,0,0,0,0,0,1,0,0,0,128,1,0,0,0,0,0,0,52,9,0,0,73,47,0,0,0,0,0,0,1,0,0,0,128,1,0,0,0,0,0,0,228,8,0,0,54,47,0,0,228,8,0,0,23,47,0,0,228,8,0,0,62,46,0,0,228,8,0,0,31,46,0,0,228,8,0,0,0,46,0,0,228,8,0,0,225,45,0,0,228,8,0,0,194,45,0,0,228,8,0,0,93,46,0,0,228,8,0,0,124,46,0,0,228,8,0,0,155,46,0,0,228,8,0,0,186,46,0,0,228,8,0,0,217,46,0,0,228,8,0,0,248,46,0,0,12,9,0,0,199,47,0,0,48,2,0,0,0,0,0,0,228,8,0,0,212,47,0,0,228,8,0,0,225,47,0,0,12,9,0,0,238,47,0,0,56,2,0,0,0,0,0,0,12,9,0,0,15,48,0,0,64,2,0,0,0,0,0,0,12,9,0,0,49,48,0,0,64,2,0,0,0,0,0,0,200,8,0,0,89,48,0,0,200,8,0,0,91,48,0,0,200,8,0,0,93,48,0,0,200,8,0,0,95,48,0,0,200,8,0,0,97,48,0,0,200,8,0,0,99,48,0,0,200,8,0,0,101,48,0,0,200,8,0,0,103,48,0,0,200,8,0,0,105,48,0,0,200,8,0,0,107,48,0,0,200,8,0,0,109,48,0,0,200,8,0,0,111,48,0,0,200,8,0,0,113,48,0,0,12,9,0,0,115,48,0,0,80,2,0,0,0,0,0,0,12,9,0,0,152,48,0,0,80,2,0,0,0,0,0,0,255,15,0,0,6,16,0,0,18,16,0,0,28,16,0,0,255,255,255,255,255,255,255,255,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,1,0,0,0,2,0,0,0,4,0,0,0,8,0,0,0,3,0,0,0,6,0,0,0,12,0,0,0,11,0,0,0,5,0,0,0,10,0,0,0,7,0,0,0,14,0,0,0,15,0,0,0,13,0,0,0,9,0,0,0,1,0,0,0,2,0,0,0,4,0,0,0,8,0,0,0,16,0,0,0,32,0,0,0,64,0,0,0,3,0,0,0,6,0,0,0,12,0,0,0,24,0,0,0,48,0,0,0,96,0,0,0,67,0,0,0,5,0,0,0,10,0,0,0,20,0,0,0,40,0,0,0,80,0,0,0,35,0,0,0,70,0,0,0,15,0,0,0,30,0,0,0,60,0,0,0,120,0,0,0,115,0,0,0,101,0,0,0,73,0,0,0,17,0,0,0,34,0,0,0,68,0,0,0,11,0,0,0,22,0,0,0,44,0,0,0,88,0,0,0,51,0,0,0,102,0,0,0,79,0,0,0,29,0,0,0,58,0,0,0,116,0,0,0,107,0,0,0,85,0,0,0,41,0,0,0,82,0,0,0,39,0,0,0,78,0,0,0,31,0,0,0,62,0,0,0,124,0,0,0,123,0,0,0,117,0,0,0,105,0,0,0,81,0,0,0,33,0,0,0,66,0,0,0,7,0,0,0,14,0,0,0,28,0,0,0,56,0,0,0,112,0,0,0,99,0,0,0,69,0,0,0,9,0,0,0,18,0,0,0,36,0,0,0,72,0,0,0,19,0,0,0,38,0,0,0,76,0,0,0,27,0,0,0,54,0,0,0,108,0,0,0,91,0,0,0,53,0,0,0,106,0,0,0,87,0,0,0,45,0,0,0,90,0,0,0,55,0,0,0,110,0,0,0,95,0,0,0,61,0,0,0,122,0,0,0,119,0,0,0,109,0,0,0,89,0,0,0,49,0,0,0,98,0,0,0,71,0,0,0,13,0,0,0,26,0,0,0,52,0,0,0,104,0,0,0,83,0,0,0,37,0,0,0,74,0,0,0,23,0,0,0,46,0,0,0,92,0,0,0,59,0,0,0,118,0,0,0,111,0,0,0,93,0,0,0,57,0,0,0,114,0,0,0,103,0,0,0,77,0,0,0,25,0,0,0,50,0,0,0,100,0,0,0,75,0,0,0,21,0,0,0,42,0,0,0,84,0,0,0,43,0,0,0,86,0,0,0,47,0,0,0,94,0,0,0,63,0,0,0,126,0,0,0,127,0,0,0,125,0,0,0,121,0,0,0,113,0,0,0,97,0,0,0,65,0,0,0,255,255,255,255,0,0,0,0,1,0,0,0,4,0,0,0,2,0,0,0,8,0,0,0,5,0,0,0,10,0,0,0,3,0,0,0,14,0,0,0,9,0,0,0,7,0,0,0,6,0,0,0,13,0,0,0,11,0,0,0,12,0,0,0,255,255,255,255,0,0,0,0,1,0,0,0,7,0,0,0,2,0,0,0,14,0,0,0,8,0,0,0,56,0,0,0,3,0,0,0,63,0,0,0,15,0,0,0,31,0,0,0,9,0,0,0,90,0,0,0,57,0,0,0,21,0,0,0,4,0,0,0,28,0,0,0,64,0,0,0,67,0,0,0,16,0,0,0,112,0,0,0,32,0,0,0,97,0,0,0,10,0,0,0,108,0,0,0,91,0,0,0,70,0,0,0,58,0,0,0,38,0,0,0,22,0,0,0,47,0,0,0,5,0,0,0,54,0,0,0,29,0,0,0,19,0,0,0,65,0,0,0,95,0,0,0,68,0,0,0,45,0,0,0,17,0,0,0,43,0,0,0,113,0,0,0,115,0,0,0,33,0,0,0,77,0,0,0,98,0,0,0,117,0,0,0,11,0,0,0,87,0,0,0,109,0,0,0,35,0,0,0,92,0,0,0,74,0,0,0,71,0,0,0,79,0,0,0,59,0,0,0,104,0,0,0,39,0,0,0,100,0,0,0,23,0,0,0,82,0,0,0,48,0,0,0,119,0,0,0,6,0,0,0,126,0,0,0,55,0,0,0,13,0,0,0,30,0,0,0,62,0,0,0,20,0,0,0,89,0,0,0,66,0,0,0,27,0,0,0,96,0,0,0,111,0,0,0,69,0,0,0,107,0,0,0,46,0,0,0,37,0,0,0,18,0,0,0,53,0,0,0,44,0,0,0,94,0,0,0,114,0,0,0,42,0,0,0,116,0,0,0,76,0,0,0,34,0,0,0,86,0,0,0,78,0,0,0,73,0,0,0,99,0,0,0,103,0,0,0,118,0,0,0,81,0,0,0,12,0,0,0,125,0,0,0,88,0,0,0,61,0,0,0,110,0,0,0,26,0,0,0,36,0,0,0,106,0,0,0,93,0,0,0,52,0,0,0,75,0,0,0,41,0,0,0,72,0,0,0,85,0,0,0,80,0,0,0,102,0,0,0,60,0,0,0,124,0,0,0,105,0,0,0,25,0,0,0,40,0,0,0,51,0,0,0,101,0,0,0,84,0,0,0,24,0,0,0,123,0,0,0,83,0,0,0,50,0,0,0,49,0,0,0,122,0,0,0,120,0,0,0,121,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,136,0,0,0,5,0,0,0,144,0,0,0,6,0,0,0,152,0,0,0,9,0,0,0,176,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,253,255,255,255,254,255,255,255,0,0,0,0,112,2,0,0,168,2,0,0,200,2,0,0,112,2,0,0,168,2,0,0,168,2,0,0,208,2,0,0,168,2,0,0,112,2,0,0,168,2,0,0,208,2,0,0,168,2,0,0,112,2,0,0,168,2,0,0,168,2,0,0,104,1,0,0,168,2,0,0,168,2,0,0,168,2,0,0,168,2,0,0,168,2,0,0,104,1,0,0,168,2,0,0,168,2,0,0,168,2,0,0,168,2,0,0,168,2,0,0,168,2,0,0,0,0,0,0,32,2,0,0,1,0,0,0,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,96,2,0,0,3,0,0,0,4,0,0,0,5,0,0,0,6,0,0,0,1,0,0,0,0,0,0,0,80,2,0,0,3,0,0,0,7,0,0,0,5,0,0,0,6,0,0,0,2,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,216,2,0,0,3,0,0,0,8,0,0,0,5,0,0,0,6,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,232,2,0,0,3,0,0,0,9,0,0,0,5,0,0,0,6,0,0,0,2,0,0,0,3,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,192,3,0,0,192,4,0,0,192,5,0,0,192,6,0,0,192,7,0,0,192,8,0,0,192,9,0,0,192,10,0,0,192,11,0,0,192,12,0,0,192,13,0,0,192,14,0,0,192,15,0,0,192,16,0,0,192,17,0,0,192,18,0,0,192,19,0,0,192,20,0,0,192,21,0,0,192,22,0,0,192,23,0,0,192,24,0,0,192,25,0,0,192,26,0,0,192,27,0,0,192,28,0,0,192,29,0,0,192,30,0,0,192,31,0,0,192,0,0,0,179,1,0,0,195,2,0,0,195,3,0,0,195,4,0,0,195,5,0,0,195,6,0,0,195,7,0,0,195,8,0,0,195,9,0,0,195,10,0,0,195,11,0,0,195,12,0,0,195,13,0,0,211,14,0,0,195,15,0,0,195,0,0,12,187,1,0,12,195,2,0,12,195,3,0,12,195,4,0,12,211,240,10,0,0,96,11,0,0,0,0,0,0,10,0,0,0,100,0,0,0,232,3,0,0,16,39,0,0,160,134,1,0,64,66,15,0,128,150,152,0,0,225,245,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,5,0,0,0,81,62,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,5,0,0,0,73,58,0,0,0,4,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,5,0,0,0,7,0,0,0,11,0,0,0,13,0,0,0,17,0,0,0,19,0,0,0,23,0,0,0,29,0,0,0,31,0,0,0,37,0,0,0,41,0,0,0,43,0,0,0,47,0,0,0,53,0,0,0,59,0,0,0,61,0,0,0,67,0,0,0,71,0,0,0,73,0,0,0,79,0,0,0,83,0,0,0,89,0,0,0,97,0,0,0,101,0,0,0,103,0,0,0,107,0,0,0,109,0,0,0,113,0,0,0,127,0,0,0,131,0,0,0,137,0,0,0,139,0,0,0,149,0,0,0,151,0,0,0,157,0,0,0,163,0,0,0,167,0,0,0,173,0,0,0,179,0,0,0,181,0,0,0,191,0,0,0,193,0,0,0,197,0,0,0,199,0,0,0,211,0,0,0,1,0,0,0,11,0,0,0,13,0,0,0,17,0,0,0,19,0,0,0,23,0,0,0,29,0,0,0,31,0,0,0,37,0,0,0,41,0,0,0,43,0,0,0,47,0,0,0,53,0,0,0,59,0,0,0,61,0,0,0,67,0,0,0,71,0,0,0,73,0,0,0,79,0,0,0,83,0,0,0,89,0,0,0,97,0,0,0,101,0,0,0,103,0,0,0,107,0,0,0,109,0,0,0,113,0,0,0,121,0,0,0,127,0,0,0,131,0,0,0,137,0,0,0,139,0,0,0,143,0,0,0,149,0,0,0,151,0,0,0,157,0,0,0,163,0,0,0,167,0,0,0,169,0,0,0,173,0,0,0,179,0,0,0,181,0,0,0,187,0,0,0,191,0,0,0,193,0,0,0,197,0,0,0,199,0,0,0,209,0,0,0,69,114,114,111,114,58,32,108,97,98,101,108,105,110,103,32,119,111,114,107,32,111,118,101,114,102,108,111,119,46,10,0,69,114,114,111,114,58,32,85,110,115,117,112,112,111,114,116,101,100,32,112,105,120,101,108,32,102,111,114,109,97,116,32,40,37,100,41,32,114,101,113,117,101,115,116,101,100,46,10,0,85,110,107,110,111,119,110,32,111,114,32,117,110,115,117,112,112,111,114,116,101,100,32,108,97,98,101,108,105,110,103,32,116,104,114,101,115,104,111,108,100,32,109,111,100,101,32,114,101,113,117,101,115,116,101,100,46,32,83,101,116,32,116,111,32,109,97,110,117,97,108,46,10,0,76,97,98,101,108,105,110,103,32,116,104,114,101,115,104,111,108,100,32,109,111,100,101,32,115,101,116,32,116,111,32,37,115,46,10,0,77,65,78,85,65,76,0,65,85,84,79,95,77,69,68,73,65,78,0,65,85,84,79,95,79,84,83,85,0,65,85,84,79,95,65,68,65,80,84,73,86,69,65,85,84,79,95,66,82,65,67,75,69,84,73,78,71,0,65,117,116,111,32,116,104,114,101,115,104,111,108,100,32,40,98,114,97,99,107,101,116,41,32,109,97,114,107,101,114,32,99,111,117,110,116,115,32,45,91,37,51,100,58,32,37,51,100,93,32,91,37,51,100,58,32,37,51,100,93,32,91,37,51,100,58,32,37,51,100,93,43,46,10,0,65,117,116,111,32,116,104,114,101,115,104,111,108,100,32,40,98,114,97,99,107,101,116,41,32,97,100,106,117,115,116,101,100,32,116,104,114,101,115,104,111,108,100,32,116,111,32,37,100,46,10,0,109,101,100,105,97,110,0,79,116,115,117,0,65,117,116,111,32,116,104,114,101,115,104,111,108,100,32,40,37,115,41,32,97,100,106,117,115,116,101,100,32,116,104,114,101,115,104,111,108,100,32,116,111,32,37,100,46,10,0,63,63,63,32,49,10,0,63,63,63,32,50,10,0,63,63,63,32,51,10,0,69,114,114,111,114,58,32,85,110,115,117,112,112,111,114,116,101,100,32,112,105,120,101,108,32,102,111,114,109,97,116,32,112,97,115,115,101,100,32,116,111,32,97,114,73,109,97,103,101,80,114,111,99,72,105,115,116,40,41,46,10,0,0,0,0,1,0,1,1,1,0,2,4,255,255,5,3,1,0,2,255,6,7,255,3,1,2,2,3,2,3,2,3,3,0,255,4,6,7,5,255,1,4,5,4,4,5,5,4,5,7,6,6,6,7,7,7,6,255,2,4,6,7,5,3,255,0,1,1,1,1,1,1,0,1,1,1,0,0,1,1,1,1,1,0,1,1,0,1,1,1,0,1,1,1,1,0,1,1,0,1,1,1,1,0,1,1,1,0,1,1,0,1,1,1,1,1,0,0,1,1,1,0,1,1,1,1,1,1,0,0,255,255,3,255,5,6,255,255,9,10,255,12,255,255,15,255,17,18,255,20,255,255,23,24,255,255,27,255,29,30,255,255,1,2,255,4,255,255,7,8,255,255,11,255,13,14,255,16,255,255,19,255,21,22,255,255,25,26,255,28,255,255,31,69,114,114,111,114,58,32,117,110,115,117,112,112,111,114,116,101,100,32,112,105,120,101,108,32,102,111,114,109,97,116,46,10,0,69,114,114,111,114,58,32,78,85,76,76,32,112,97,116,116,72,97,110,100,108,101,46,10,0,69,114,114,111,114,58,32,99,97,110,39,116,32,108,111,97,100,32,112,97,116,116,101,114,110,32,102,114,111,109,32,78,85,76,76,32,98,117,102,102,101,114,46,10,0,69,114,114,111,114,58,32,111,117,116,32,111,102,32,109,101,109,111,114,121,46,10,0,32,9,10,13,0,80,97,116,116,101,114,110,32,68,97,116,97,32,114,101,97,100,32,101,114,114,111,114,33,33,10,0,69,114,114,111,114,32,111,112,101,110,105,110,103,32,112,97,116,116,101,114,110,32,102,105,108,101,32,39,37,115,39,32,102,111,114,32,114,101,97,100,105,110,103,46,10,0,69,114,114,111,114,32,114,101,97,100,105,110,103,32,112,97,116,116,101,114,110,32,102,105,108,101,32,39,37,115,39,46,10,0,114,98,0,69,114,114,111,114,32,40,37,100,41,58,32,117,110,97,98,108,101,32,116,111,32,111,112,101,110,32,99,97,109,101,114,97,32,112,97,114,97,109,101,116,101,114,115,32,102,105,108,101,32,34,37,115,34,32,102,111,114,32,114,101,97,100,105,110,103,46,10,0,69,114,114,111,114,32,40,37,100,41,58,32,117,110,97,98,108,101,32,116,111,32,100,101,116,101,114,109,105,110,101,32,102,105,108,101,32,108,101,110,103,116,104,46,0,69,114,114,111,114,58,32,115,117,112,112,108,105,101,100,32,102,105,108,101,32,100,111,101,115,32,110,111,116,32,97,112,112,101,97,114,32,116,111,32,98,101,32,97,110,32,65,82,84,111,111,108,75,105,116,32,99,97,109,101,114,97,32,112,97,114,97,109,101,116,101,114,32,102,105,108,101,46,10,0,69,114,114,111,114,32,40,37,100,41,58,32,117,110,97,98,108,101,32,116,111,32,114,101,97,100,32,102,114,111,109,32,102,105,108,101,46,0,69,114,114,111,114,58,32,105,99,112,71,101,116,74,95,85,95,88,99,0,69,114,114,111,114,58,32,109,97,108,108,111,99,10,0,69,114,114,111,114,32,49,58,32,105,99,112,71,101,116,73,110,105,116,88,119,50,88,99,10,0,69,114,114,111,114,32,50,58,32,105,99,112,71,101,116,73,110,105,116,88,119,50,88,99,10,0,69,114,114,111,114,32,51,58,32,105,99,112,71,101,116,73,110,105,116,88,119,50,88,99,10,0,69,114,114,111,114,32,52,58,32,105,99,112,71,101,116,73,110,105,116,88,119,50,88,99,10,0,69,114,114,111,114,32,53,58,32,105,99,112,71,101,116,73,110,105,116,88,119,50,88,99,10,0,69,114,114,111,114,32,54,58,32,105,99,112,71,101,116,73,110,105,116,88,119,50,88,99,10,0,69,114,114,111,114,32,55,58,32,105,99,112,71,101,116,73,110,105,116,88,119,50,88,99,10,0,114,0,69,114,114,111,114,58,32,117,110,97,98,108,101,32,116,111,32,111,112,101,110,32,109,117,108,116,105,109,97,114,107,101,114,32,99,111,110,102,105,103,32,102,105,108,101,32,39,37,115,39,46,10,0,37,115,37,115,10,0,0,37,100,0,69,114,114,111,114,32,112,114,111,99,101,115,115,105,110,103,32,109,117,108,116,105,109,97,114,107,101,114,32,99,111,110,102,105,103,32,102,105,108,101,32,39,37,115,39,58,32,70,105,114,115,116,32,108,105,110,101,32,109,117,115,116,32,98,101,32,110,117,109,98,101,114,32,111,102,32,109,97,114,107,101,114,32,99,111,110,102,105,103,115,32,116,111,32,114,101,97,100,46,10,0,79,117,116,32,111,102,32,109,101,109,111,114,121,33,33,10,0,37,108,108,117,37,99,0,69,114,114,111,114,32,112,114,111,99,101,115,115,105,110,103,32,109,117,108,116,105,109,97,114,107,101,114,32,99,111,110,102,105,103,32,102,105,108,101,32,39,37,115,39,58,32,112,97,116,116,101,114,110,32,39,37,115,39,32,115,112,101,99,105,102,105,101,100,32,105,110,32,109,117,108,116,105,109,97,114,107,101,114,32,99,111,110,102,105,103,117,114,97,116,105,111,110,32,119,104,105,108,101,32,105,110,32,98,97,114,99,111,100,101,45,111,110,108,121,32,109,111,100,101,46,10,0,69,114,114,111,114,32,112,114,111,99,101,115,115,105,110,103,32,109,117,108,116,105,109,97,114,107,101,114,32,99,111,110,102,105,103,32,102,105,108,101,32,39,37,115,39,58,32,85,110,97,98,108,101,32,116,111,32,100,101,116,101,114,109,105,110,101,32,100,105,114,101,99,116,111,114,121,32,110,97,109,101,46,10,0,69,114,114,111,114,32,112,114,111,99,101,115,115,105,110,103,32,109,117,108,116,105,109,97,114,107,101,114,32,99,111,110,102,105,103,32,102,105,108,101,32,39,37,115,39,58,32,85,110,97,98,108,101,32,116,111,32,108,111,97,100,32,112,97,116,116,101,114,110,32,39,37,115,39,46,10,0,37,108,102,0,69,114,114,111,114,32,112,114,111,99,101,115,115,105,110,103,32,109,117,108,116,105,109,97,114,107,101,114,32,99,111,110,102,105,103,32,102,105,108,101,32,39,37,115,39,44,32,109,97,114,107,101,114,32,100,101,102,105,110,105,116,105,111,110,32,37,51,100,58,32,70,105,114,115,116,32,108,105,110,101,32,109,117,115,116,32,98,101,32,112,97,116,116,101,114,110,32,119,105,100,116,104,46,10,0,37,108,102,32,37,108,102,32,37,108,102,32,37,108,102,0,37,102,32,37,102,0,69,114,114,111,114,32,112,114,111,99,101,115,115,105,110,103,32,109,117,108,116,105,109,97,114,107,101,114,32,99,111,110,102,105,103,32,102,105,108,101,32,39,37,115,39,44,32,109,97,114,107,101,114,32,100,101,102,105,110,105,116,105,111,110,32,37,51,100,58,32,76,105,110,101,115,32,50,32,45,32,52,32,109,117,115,116,32,98,101,32,109,97,114,107,101,114,32,116,114,97,110,115,102,111,114,109,46,10,0,97,114,103,108,67,97,109,101,114,97,70,114,117,115,116,117,109,40,41,58,32,97,114,80,97,114,97,109,68,101,99,111,109,112,77,97,116,40,41,32,105,110,100,105,99,97,116,101,100,32,112,97,114,97,109,101,116,101,114,32,101,114,114,111,114,46,10,0,108,111,97,100,67,97,109,101,114,97,40,41,58,32,69,114,114,111,114,32,108,111,97,100,105,110,103,32,112,97,114,97,109,101,116,101,114,32,102,105,108,101,32,37,115,32,102,111,114,32,99,97,109,101,114,97,46,10,0,42,42,42,32,67,97,109,101,114,97,32,80,97,114,97,109,101,116,101,114,32,114,101,115,105,122,101,100,32,102,114,111,109,32,37,100,44,32,37,100,46,32,42,42,42,10,0,115,101,116,67,97,109,101,114,97,40,41,58,32,69,114,114,111,114,58,32,97,114,80,97,114,97,109,76,84,67,114,101,97,116,101,46,10,0,115,101,116,67,97,109,101,114,97,40,41,58,32,69,114,114,111,114,58,32,97,114,67,114,101,97,116,101,72,97,110,100,108,101,46,10,0,115,101,116,67,97,109,101,114,97,40,41,58,32,69,114,114,111,114,32,99,114,101,97,116,105,110,103,32,51,68,32,104,97,110,100,108,101,0,108,111,97,100,77,97,114,107,101,114,40,41,58,32,69,114,114,111,114,32,108,111,97,100,105,110,103,32,112,97,116,116,101,114,110,32,102,105,108,101,32,37,115,46,10,0,65,82,84,111,111,108,75,105,116,74,83,40,41,58,32,85,110,97,98,108,101,32,116,111,32,115,101,116,32,117,112,32,65,82,32,109,97,114,107,101,114,46,10,0,99,111,110,102,105,103,32,100,97,116,97,32,108,111,97,100,32,101,114,114,111,114,32,33,33,10,0,65,82,84,111,111,108,75,105,116,74,83,40,41,58,32,85,110,97,98,108,101,32,116,111,32,115,101,116,32,117,112,32,65,82,32,109,117,108,116,105,109,97,114,107,101,114,46,10,0,80,97,116,116,101,114,110,32,100,101,116,101,99,116,105,111,110,32,109,111,100,101,32,115,101,116,32,116,111,32,37,100,46,10,0,80,97,116,116,101,114,110,32,114,97,116,105,111,32,115,105,122,101,32,115,101,116,32,116,111,32,37,102,46,10,0,76,97,98,101,108,105,110,103,32,109,111,100,101,32,115,101,116,32,116,111,32,37,100,10,0,84,104,114,101,115,104,111,108,100,32,115,101,116,32,116,111,32,37,100,10,0,84,104,114,101,115,104,111,108,100,32,109,111,100,101,32,115,101,116,32,116,111,32,37,100,10,0,111,110,46,0,111,102,102,46,0,68,101,98,117,103,32,109,111,100,101,32,115,101,116,32,116,111,32,37,115,10,0,73,109,97,103,101,32,112,114,111,99,46,32,109,111,100,101,32,115,101,116,32,116,111,32,37,100,46,10,0,123,32,105,102,32,40,33,97,114,116,111,111,108,107,105,116,91,34,109,117,108,116,105,69,97,99,104,77,97,114,107,101,114,73,110,102,111,34,93,41,32,123,32,97,114,116,111,111,108,107,105,116,91,34,109,117,108,116,105,69,97,99,104,77,97,114,107,101,114,73,110,102,111,34,93,32,61,32,40,123,125,41,59,32,125,32,118,97,114,32,109,117,108,116,105,69,97,99,104,77,97,114,107,101,114,32,61,32,97,114,116,111,111,108,107,105,116,91,34,109,117,108,116,105,69,97,99,104,77,97,114,107,101,114,73,110,102,111,34,93,59,32,109,117,108,116,105,69,97,99,104,77,97,114,107,101,114,91,39,118,105,115,105,98,108,101,39,93,32,61,32,36,48,59,32,109,117,108,116,105,69,97,99,104,77,97,114,107,101,114,91,39,112,97,116,116,73,100,39,93,32,61,32,36,49,59,32,109,117,108,116,105,69,97,99,104,77,97,114,107,101,114,91,39,112,97,116,116,84,121,112,101,39,93,32,61,32,36,50,59,32,109,117,108,116,105,69,97,99,104,77,97,114,107,101,114,91,39,119,105,100,116,104,39,93,32,61,32,36,51,59,32,125,0,123,32,118,97,114,32,36,97,32,61,32,97,114,103,117,109,101,110,116,115,59,32,118,97,114,32,105,32,61,32,49,50,59,32,105,102,32,40,33,97,114,116,111,111,108,107,105,116,91,34,109,97,114,107,101,114,73,110,102,111,34,93,41,32,123,32,97,114,116,111,111,108,107,105,116,91,34,109,97,114,107,101,114,73,110,102,111,34,93,32,61,32,40,123,32,112,111,115,58,32,91,48,44,48,93,44,32,108,105,110,101,58,32,91,91,48,44,48,44,48,93,44,32,91,48,44,48,44,48,93,44,32,91,48,44,48,44,48,93,44,32,91,48,44,48,44,48,93,93,44,32,118,101,114,116,101,120,58,32,91,91,48,44,48,93,44,32,91,48,44,48,93,44,32,91,48,44,48,93,44,32,91,48,44,48,93,93,32,125,41,59,32,125,32,118,97,114,32,109,97,114,107,101,114,73,110,102,111,32,61,32,97,114,116,111,111,108,107,105,116,91,34,109,97,114,107,101,114,73,110,102,111,34,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,97,114,101,97,34,93,32,61,32,36,48,59,32,109,97,114,107,101,114,73,110,102,111,91,34,105,100,34,93,32,61,32,36,49,59,32,109,97,114,107,101,114,73,110,102,111,91,34,105,100,80,97,116,116,34,93,32,61,32,36,50,59,32,109,97,114,107,101,114,73,110,102,111,91,34,105,100,77,97,116,114,105,120,34,93,32,61,32,36,51,59,32,109,97,114,107,101,114,73,110,102,111,91,34,100,105,114,34,93,32,61,32,36,52,59,32,109,97,114,107,101,114,73,110,102,111,91,34,100,105,114,80,97,116,116,34,93,32,61,32,36,53,59,32,109,97,114,107,101,114,73,110,102,111,91,34,100,105,114,77,97,116,114,105,120,34,93,32,61,32,36,54,59,32,109,97,114,107,101,114,73,110,102,111,91,34,99,102,34,93,32,61,32,36,55,59,32,109,97,114,107,101,114,73,110,102,111,91,34,99,102,80,97,116,116,34,93,32,61,32,36,56,59,32,109,97,114,107,101,114,73,110,102,111,91,34,99,102,77,97,116,114,105,120,34,93,32,61,32,36,57,59,32,109,97,114,107,101,114,73,110,102,111,91,34,112,111,115,34,93,91,48,93,32,61,32,36,49,48,59,32,109,97,114,107,101,114,73,110,102,111,91,34,112,111,115,34,93,91,49,93,32,61,32,36,49,49,59,32,109,97,114,107,101,114,73,110,102,111,91,34,108,105,110,101,34,93,91,48,93,91,48,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,108,105,110,101,34,93,91,48,93,91,49,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,108,105,110,101,34,93,91,48,93,91,50,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,108,105,110,101,34,93,91,49,93,91,48,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,108,105,110,101,34,93,91,49,93,91,49,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,108,105,110,101,34,93,91,49,93,91,50,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,108,105,110,101,34,93,91,50,93,91,48,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,108,105,110,101,34,93,91,50,93,91,49,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,108,105,110,101,34,93,91,50,93,91,50,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,108,105,110,101,34,93,91,51,93,91,48,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,108,105,110,101,34,93,91,51,93,91,49,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,108,105,110,101,34,93,91,51,93,91,50,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,118,101,114,116,101,120,34,93,91,48,93,91,48,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,118,101,114,116,101,120,34,93,91,48,93,91,49,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,118,101,114,116,101,120,34,93,91,49,93,91,48,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,118,101,114,116,101,120,34,93,91,49,93,91,49,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,118,101,114,116,101,120,34,93,91,50,93,91,48,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,118,101,114,116,101,120,34,93,91,50,93,91,49,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,118,101,114,116,101,120,34,93,91,51,93,91,48,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,118,101,114,116,101,120,34,93,91,51,93,91,49,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,101,114,114,111,114,67,111,114,114,101,99,116,101,100,34,93,32,61,32,36,97,91,105,43,43,93,59,32,125,0,115,101,116,117,112,40,41,58,32,69,114,114,111,114,58,32,97,114,80,97,116,116,67,114,101,97,116,101,72,97,110,100,108,101,46,10,0,65,108,108,111,99,97,116,101,100,32,118,105,100,101,111,70,114,97,109,101,83,105,122,101,32,37,100,10,0,123,32,105,102,32,40,33,97,114,116,111,111,108,107,105,116,91,34,102,114,97,109,101,77,97,108,108,111,99,34,93,41,32,123,32,97,114,116,111,111,108,107,105,116,91,34,102,114,97,109,101,77,97,108,108,111,99,34,93,32,61,32,40,123,125,41,59,32,125,32,118,97,114,32,102,114,97,109,101,77,97,108,108,111,99,32,61,32,97,114,116,111,111,108,107,105,116,91,34,102,114,97,109,101,77,97,108,108,111,99,34,93,59,32,102,114,97,109,101,77,97,108,108,111,99,91,34,102,114,97,109,101,112,111,105,110,116,101,114,34,93,32,61,32,36,49,59,32,102,114,97,109,101,77,97,108,108,111,99,91,34,102,114,97,109,101,115,105,122,101,34,93,32,61,32,36,50,59,32,102,114,97,109,101,77,97,108,108,111,99,91,34,99,97,109,101,114,97,34,93,32,61,32,36,51,59,32,102,114,97,109,101,77,97,108,108,111,99,91,34,116,114,97,110,115,102,111,114,109,34,93,32,61,32,36,52,59,32,125,0,115,101,116,117,112,0,116,101,97,114,100,111,119,110,0,95,97,100,100,77,97,114,107,101,114,0,95,97,100,100,77,117,108,116,105,77,97,114,107,101,114,0,103,101,116,77,117,108,116,105,77,97,114,107,101,114,78,117,109,0,103,101,116,77,117,108,116,105,77,97,114,107,101,114,67,111,117,110,116,0,95,108,111,97,100,67,97,109,101,114,97,0,115,101,116,77,97,114,107,101,114,73,110,102,111,68,105,114,0,115,101,116,77,97,114,107,101,114,73,110,102,111,86,101,114,116,101,120,0,103,101,116,84,114,97,110,115,77,97,116,83,113,117,97,114,101,0,103,101,116,84,114,97,110,115,77,97,116,83,113,117,97,114,101,67,111,110,116,0,103,101,116,84,114,97,110,115,77,97,116,77,117,108,116,105,83,113,117,97,114,101,0,103,101,116,84,114,97,110,115,77,97,116,77,117,108,116,105,83,113,117,97,114,101,82,111,98,117,115,116,0,100,101,116,101,99,116,77,97,114,107,101,114,0,103,101,116,77,97,114,107,101,114,78,117,109,0,103,101,116,77,117,108,116,105,69,97,99,104,77,97,114,107,101,114,0,103,101,116,77,97,114,107,101,114,0,115,101,116,68,101,98,117,103,77,111,100,101,0,103,101,116,68,101,98,117,103,77,111,100,101,0,103,101,116,80,114,111,99,101,115,115,105,110,103,73,109,97,103,101,0,115,101,116,76,111,103,76,101,118,101,108,0,103,101,116,76,111,103,76,101,118,101,108,0,115,101,116,80,114,111,106,101,99,116,105,111,110,78,101,97,114,80,108,97,110,101,0,103,101,116,80,114,111,106,101,99,116,105,111,110,78,101,97,114,80,108,97,110,101,0,115,101,116,80,114,111,106,101,99,116,105,111,110,70,97,114,80,108,97,110,101,0,103,101,116,80,114,111,106,101,99,116,105,111,110,70,97,114,80,108,97,110,101,0,115,101,116,84,104,114,101,115,104,111,108,100,77,111,100,101,0,103,101,116,84,104,114,101,115,104,111,108,100,77,111,100,101,0,115,101,116,84,104,114,101,115,104,111,108,100,0,103,101,116,84,104,114,101,115,104,111,108,100,0,115,101,116,80,97,116,116,101,114,110,68,101,116,101,99,116,105,111,110,77,111,100,101,0,103,101,116,80,97,116,116,101,114,110,68,101,116,101,99,116,105,111,110,77,111,100,101,0,115,101,116,80,97,116,116,82,97,116,105,111,0,103,101,116,80,97,116,116,82,97,116,105,111,0,115,101,116,77,97,116,114,105,120,67,111,100,101,84,121,112,101,0,103,101,116,77,97,116,114,105,120,67,111,100,101,84,121,112,101,0,115,101,116,76,97,98,101,108,105,110,103,77,111,100,101,0,103,101,116,76,97,98,101,108,105,110,103,77,111,100,101,0,115,101,116,73,109,97,103,101,80,114,111,99,77,111,100,101,0,103,101,116,73,109,97,103,101,80,114,111,99,77,111,100,101,0,69,82,82,79,82,95,65,82,67,79,78,84,82,79,76,76,69,82,95,78,79,84,95,70,79,85,78,68,0,69,82,82,79,82,95,77,85,76,84,73,77,65,82,75,69,82,95,78,79,84,95,70,79,85,78,68,0,69,82,82,79,82,95,77,65,82,75,69,82,95,73,78,68,69,88,95,79,85,84,95,79,70,95,66,79,85,78,68,83,0,65,82,95,68,69,66,85,71,95,68,73,83,65,66,76,69,0,65,82,95,68,69,66,85,71,95,69,78,65,66,76,69,0,65,82,95,68,69,70,65,85,76,84,95,68,69,66,85,71,95,77,79,68,69,0,65,82,95,76,65,66,69,76,73,78,71,95,87,72,73,84,69,95,82,69,71,73,79,78,0,65,82,95,76,65,66,69,76,73,78,71,95,66,76,65,67,75,95,82,69,71,73,79,78,0,65,82,95,68,69,70,65,85,76,84,95,76,65,66,69,76,73,78,71,95,77,79,68,69,0,65,82,95,68,69,70,65,85,76,84,95,76,65,66,69,76,73,78,71,95,84,72,82,69,83,72,0,65,82,95,73,77,65,71,69,95,80,82,79,67,95,70,82,65,77,69,95,73,77,65,71,69,0,65,82,95,73,77,65,71,69,95,80,82,79,67,95,70,73,69,76,68,95,73,77,65,71,69,0,65,82,95,68,69,70,65,85,76,84,95,73,77,65,71,69,95,80,82,79,67,95,77,79,68,69,0,65,82,95,84,69,77,80,76,65,84,69,95,77,65,84,67,72,73,78,71,95,67,79,76,79,82,0,65,82,95,84,69,77,80,76,65,84,69,95,77,65,84,67,72,73,78,71,95,77,79,78,79,0,65,82,95,77,65,84,82,73,88,95,67,79,68,69,95,68,69,84,69,67,84,73,79,78,0,65,82,95,84,69,77,80,76,65,84,69,95,77,65,84,67,72,73,78,71,95,67,79,76,79,82,95,65,78,68,95,77,65,84,82,73,88,0,65,82,95,84,69,77,80,76,65,84,69,95,77,65,84,67,72,73,78,71,95,77,79,78,79,95,65,78,68,95,77,65,84,82,73,88,0,65,82,95,68,69,70,65,85,76,84,95,80,65,84,84,69,82,78,95,68,69,84,69,67,84,73,79,78,95,77,79,68,69,0,65,82,95,85,83,69,95,84,82,65,67,75,73,78,71,95,72,73,83,84,79,82,89,0,65,82,95,78,79,85,83,69,95,84,82,65,67,75,73,78,71,95,72,73,83,84,79,82,89,0,65,82,95,85,83,69,95,84,82,65,67,75,73,78,71,95,72,73,83,84,79,82,89,95,86,50,0,65,82,95,68,69,70,65,85,76,84,95,77,65,82,75,69,82,95,69,88,84,82,65,67,84,73,79,78,95,77,79,68,69,0,65,82,95,77,65,88,95,76,79,79,80,95,67,79,85,78,84,0,65,82,95,76,79,79,80,95,66,82,69,65,75,95,84,72,82,69,83,72,0,65,82,95,76,79,71,95,76,69,86,69,76,95,68,69,66,85,71,0,65,82,95,76,79,71,95,76,69,86,69,76,95,73,78,70,79,0,65,82,95,76,79,71,95,76,69,86,69,76,95,87,65,82,78,0,65,82,95,76,79,71,95,76,69,86,69,76,95,69,82,82,79,82,0,65,82,95,76,79,71,95,76,69,86,69,76,95,82,69,76,95,73,78,70,79,0,65,82,95,77,65,84,82,73,88,95,67,79,68,69,95,51,120,51,0,65,82,95,77,65,84,82,73,88,95,67,79,68,69,95,51,120,51,95,72,65,77,77,73,78,71,54,51,0,65,82,95,77,65,84,82,73,88,95,67,79,68,69,95,51,120,51,95,80,65,82,73,84,89,54,53,0,65,82,95,77,65,84,82,73,88,95,67,79,68,69,95,52,120,52,0,65,82,95,77,65,84,82,73,88,95,67,79,68,69,95,52,120,52,95,66,67,72,95,49,51,95,57,95,51,0,65,82,95,77,65,84,82,73,88,95,67,79,68,69,95,52,120,52,95,66,67,72,95,49,51,95,53,95,53,0,65,82,95,76,65,66,69,76,73,78,71,95,84,72,82,69,83,72,95,77,79,68,69,95,77,65,78,85,65,76,0,65,82,95,76,65,66,69,76,73,78,71,95,84,72,82,69,83,72,95,77,79,68,69,95,65,85,84,79,95,77,69,68,73,65,78,0,65,82,95,76,65],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE);allocate([66,69,76,73,78,71,95,84,72,82,69,83,72,95,77,79,68,69,95,65,85,84,79,95,79,84,83,85,0,65,82,95,76,65,66,69,76,73,78,71,95,84,72,82,69,83,72,95,77,79,68,69,95,65,85,84,79,95,65,68,65,80,84,73,86,69,0,65,82,95,77,65,82,75,69,82,95,73,78,70,79,95,67,85,84,79,70,70,95,80,72,65,83,69,95,78,79,78,69,0,65,82,95,77,65,82,75,69,82,95,73,78,70,79,95,67,85,84,79,70,70,95,80,72,65,83,69,95,80,65,84,84,69,82,78,95,69,88,84,82,65,67,84,73,79,78,0,65,82,95,77,65,82,75,69,82,95,73,78,70,79,95,67,85,84,79,70,70,95,80,72,65,83,69,95,77,65,84,67,72,95,71,69,78,69,82,73,67,0,65,82,95,77,65,82,75,69,82,95,73,78,70,79,95,67,85,84,79,70,70,95,80,72,65,83,69,95,77,65,84,67,72,95,67,79,78,84,82,65,83,84,0,65,82,95,77,65,82,75,69,82,95,73,78,70,79,95,67,85,84,79,70,70,95,80,72,65,83,69,95,77,65,84,67,72,95,66,65,82,67,79,68,69,95,78,79,84,95,70,79,85,78,68,0,65,82,95,77,65,82,75,69,82,95,73,78,70,79,95,67,85,84,79,70,70,95,80,72,65,83,69,95,77,65,84,67,72,95,66,65,82,67,79,68,69,95,69,68,67,95,70,65,73,76,0,65,82,95,77,65,82,75,69,82,95,73,78,70,79,95,67,85,84,79,70,70,95,80,72,65,83,69,95,77,65,84,67,72,95,67,79,78,70,73,68,69,78,67,69,0,65,82,95,77,65,82,75,69,82,95,73,78,70,79,95,67,85,84,79,70,70,95,80,72,65,83,69,95,80,79,83,69,95,69,82,82,79,82,0,65,82,95,77,65,82,75,69,82,95,73,78,70,79,95,67,85,84,79,70,70,95,80,72,65,83,69,95,80,79,83,69,95,69,82,82,79,82,95,77,85,76,84,73,0,65,82,95,77,65,82,75,69,82,95,73,78,70,79,95,67,85,84,79,70,70,95,80,72,65,83,69,95,72,69,85,82,73,83,84,73,67,95,84,82,79,85,66,76,69,83,79,77,69,95,77,65,84,82,73,88,95,67,79,68,69,83,0,118,105,105,102,0,118,105,105,105,0,100,105,105,0,118,105,105,100,0,105,105,0,118,105,105,0,105,105,105,0,78,83,116,51,95,95,49,49,50,98,97,115,105,99,95,115,116,114,105,110,103,73,99,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,99,69,69,78,83,95,57,97,108,108,111,99,97,116,111,114,73,99,69,69,69,69,0,78,83,116,51,95,95,49,50,49,95,95,98,97,115,105,99,95,115,116,114,105,110,103,95,99,111,109,109,111,110,73,76,98,49,69,69,69,0,105,105,105,105,0,105,105,105,105,105,0,118,111,105,100,0,98,111,111,108,0,99,104,97,114,0,115,105,103,110,101,100,32,99,104,97,114,0,117,110,115,105,103,110,101,100,32,99,104,97,114,0,115,104,111,114,116,0,117,110,115,105,103,110,101,100,32,115,104,111,114,116,0,105,110,116,0,117,110,115,105,103,110,101,100,32,105,110,116,0,108,111,110,103,0,117,110,115,105,103,110,101,100,32,108,111,110,103,0,102,108,111,97,116,0,100,111,117,98,108,101,0,115,116,100,58,58,115,116,114,105,110,103,0,115,116,100,58,58,98,97,115,105,99,95,115,116,114,105,110,103,60,117,110,115,105,103,110,101,100,32,99,104,97,114,62,0,115,116,100,58,58,119,115,116,114,105,110,103,0,101,109,115,99,114,105,112,116,101,110,58,58,118,97,108,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,99,104,97,114,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,115,105,103,110,101,100,32,99,104,97,114,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,117,110,115,105,103,110,101,100,32,99,104,97,114,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,115,104,111,114,116,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,117,110,115,105,103,110,101,100,32,115,104,111,114,116,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,105,110,116,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,117,110,115,105,103,110,101,100,32,105,110,116,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,108,111,110,103,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,117,110,115,105,103,110,101,100,32,108,111,110,103,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,105,110,116,56,95,116,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,117,105,110,116,56,95,116,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,105,110,116,49,54,95,116,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,117,105,110,116,49,54,95,116,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,105,110,116,51,50,95,116,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,117,105,110,116,51,50,95,116,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,102,108,111,97,116,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,100,111,117,98,108,101,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,108,111,110,103,32,100,111,117,98,108,101,62,0,78,49,48,101,109,115,99,114,105,112,116,101,110,49,49,109,101,109,111,114,121,95,118,105,101,119,73,101,69,69,0,78,49,48,101,109,115,99,114,105,112,116,101,110,49,49,109,101,109,111,114,121,95,118,105,101,119,73,100,69,69,0,78,49,48,101,109,115,99,114,105,112,116,101,110,49,49,109,101,109,111,114,121,95,118,105,101,119,73,102,69,69,0,78,49,48,101,109,115,99,114,105,112,116,101,110,49,49,109,101,109,111,114,121,95,118,105,101,119,73,109,69,69,0,78,49,48,101,109,115,99,114,105,112,116,101,110,49,49,109,101,109,111,114,121,95,118,105,101,119,73,108,69,69,0,78,49,48,101,109,115,99,114,105,112,116,101,110,49,49,109,101,109,111,114,121,95,118,105,101,119,73,106,69,69,0,78,49,48,101,109,115,99,114,105,112,116,101,110,49,49,109,101,109,111,114,121,95,118,105,101,119,73,105,69,69,0,78,49,48,101,109,115,99,114,105,112,116,101,110,49,49,109,101,109,111,114,121,95,118,105,101,119,73,116,69,69,0,78,49,48,101,109,115,99,114,105,112,116,101,110,49,49,109,101,109,111,114,121,95,118,105,101,119,73,115,69,69,0,78,49,48,101,109,115,99,114,105,112,116,101,110,49,49,109,101,109,111,114,121,95,118,105,101,119,73,104,69,69,0,78,49,48,101,109,115,99,114,105,112,116,101,110,49,49,109,101,109,111,114,121,95,118,105,101,119,73,97,69,69,0,78,49,48,101,109,115,99,114,105,112,116,101,110,49,49,109,101,109,111,114,121,95,118,105,101,119,73,99,69,69,0,78,49,48,101,109,115,99,114,105,112,116,101,110,51,118,97,108,69,0,78,83,116,51,95,95,49,49,50,98,97,115,105,99,95,115,116,114,105,110,103,73,119,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,119,69,69,78,83,95,57,97,108,108,111,99,97,116,111,114,73,119,69,69,69,69,0,78,83,116,51,95,95,49,49,50,98,97,115,105,99,95,115,116,114,105,110,103,73,104,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,104,69,69,78,83,95,57,97,108,108,111,99,97,116,111,114,73,104,69,69,69,69,0,83,116,57,98,97,100,95,97,108,108,111,99,0,83,116,57,101,120,99,101,112,116,105,111,110,0,83,116,57,116,121,112,101,95,105,110,102,111,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,54,95,95,115,104,105,109,95,116,121,112,101,95,105,110,102,111,69,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,55,95,95,99,108,97,115,115,95,116,121,112,101,95,105,110,102,111,69,0,78,49,48,95,95,99,120,120,97,98,105,118,49,50,51,95,95,102,117,110,100,97,109,101,110,116,97,108,95,116,121,112,101,95,105,110,102,111,69,0,118,0,98,0,99,0,104,0,97,0,115,0,116,0,105,0,106,0,108,0,109,0,102,0,100,0,78,49,48,95,95,99,120,120,97,98,105,118,49,50,48,95,95,115,105,95,99,108,97,115,115,95,116,121,112,101,95,105,110,102,111,69,0,78,49,48,95,95,99,120,120,97,98,105,118,49,50,49,95,95,118,109,105,95,99,108,97,115,115,95,116,121,112,101,95,105,110,102,111,69,0,33,34,118,101,99,116,111,114,32,108,101,110,103,116,104,95,101,114,114,111,114,34,0,47,85,115,101,114,115,47,106,101,114,111,109,101,101,116,105,101,110,110,101,47,119,111,114,107,47,101,109,115,100,107,95,112,111,114,116,97,98,108,101,47,101,109,115,99,114,105,112,116,101,110,47,49,46,51,53,46,48,47,115,121,115,116,101,109,47,105,110,99,108,117,100,101,47,108,105,98,99,120,120,47,118,101,99,116,111,114,0,95,95,116,104,114,111,119,95,108,101,110,103,116,104,95,101,114,114,111,114,0,115,116,100,58,58,98,97,100,95,97,108,108,111,99,0,33,34,98,97,115,105,99,95,115,116,114,105,110,103,32,108,101,110,103,116,104,95,101,114,114,111,114,34,0,47,85,115,101,114,115,47,106,101,114,111,109,101,101,116,105,101,110,110,101,47,119,111,114,107,47,101,109,115,100,107,95,112,111,114,116,97,98,108,101,47,101,109,115,99,114,105,112,116,101,110,47,49,46,51,53,46,48,47,115,121,115,116,101,109,47,105,110,99,108,117,100,101,47,108,105,98,99,120,120,47,115,116,114,105,110,103,0,84,33,34,25,13,1,2,3,17,75,28,12,16,4,11,29,18,30,39,104,110,111,112,113,98,32,5,6,15,19,20,21,26,8,22,7,40,36,23,24,9,10,14,27,31,37,35,131,130,125,38,42,43,60,61,62,63,67,71,74,77,88,89,90,91,92,93,94,95,96,97,99,100,101,102,103,105,106,107,108,114,115,116,121,122,123,124,0,73,108,108,101,103,97,108,32,98,121,116,101,32,115,101,113,117,101,110,99,101,0,68,111,109,97,105,110,32,101,114,114,111,114,0,82,101,115,117,108,116,32,110,111,116,32,114,101,112,114,101,115,101,110,116,97,98,108,101,0,78,111,116,32,97,32,116,116,121,0,80,101,114,109,105,115,115,105,111,110,32,100,101,110,105,101,100,0,79,112,101,114,97,116,105,111,110,32,110,111,116,32,112,101,114,109,105,116,116,101,100,0,78,111,32,115,117,99,104,32,102,105,108,101,32,111,114,32,100,105,114,101,99,116,111,114,121,0,78,111,32,115,117,99,104,32,112,114,111,99,101,115,115,0,70,105,108,101,32,101,120,105,115,116,115,0,86,97,108,117,101,32,116,111,111,32,108,97,114,103,101,32,102,111,114,32,100,97,116,97,32,116,121,112,101,0,78,111,32,115,112,97,99,101,32,108,101,102,116,32,111,110,32,100,101,118,105,99,101,0,79,117,116,32,111,102,32,109,101,109,111,114,121,0,82,101,115,111,117,114,99,101,32,98,117,115,121,0,73,110,116,101,114,114,117,112,116,101,100,32,115,121,115,116,101,109,32,99,97,108,108,0,82,101,115,111,117,114,99,101,32,116,101,109,112,111,114,97,114,105,108,121,32,117,110,97,118,97,105,108,97,98,108,101,0,73,110,118,97,108,105,100,32,115,101,101,107,0,67,114,111,115,115,45,100,101,118,105,99,101,32,108,105,110,107,0,82,101,97,100,45,111,110,108,121,32,102,105,108,101,32,115,121,115,116,101,109,0,68,105,114,101,99,116,111,114,121,32,110,111,116,32,101,109,112,116,121,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,112,101,101,114,0,79,112,101,114,97,116,105,111,110,32,116,105,109,101,100,32,111,117,116,0,67,111,110,110,101,99,116,105,111,110,32,114,101,102,117,115,101,100,0,72,111,115,116,32,105,115,32,100,111,119,110,0,72,111,115,116,32,105,115,32,117,110,114,101,97,99,104,97,98,108,101,0,65,100,100,114,101,115,115,32,105,110,32,117,115,101,0,66,114,111,107,101,110,32,112,105,112,101,0,73,47,79,32,101,114,114,111,114,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,32,111,114,32,97,100,100,114,101,115,115,0,66,108,111,99,107,32,100,101,118,105,99,101,32,114,101,113,117,105,114,101,100,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,0,78,111,116,32,97,32,100,105,114,101,99,116,111,114,121,0,73,115,32,97,32,100,105,114,101,99,116,111,114,121,0,84,101,120,116,32,102,105,108,101,32,98,117,115,121,0,69,120,101,99,32,102,111,114,109,97,116,32,101,114,114,111,114,0,73,110,118,97,108,105,100,32,97,114,103,117,109,101,110,116,0,65,114,103,117,109,101,110,116,32,108,105,115,116,32,116,111,111,32,108,111,110,103,0,83,121,109,98,111,108,105,99,32,108,105,110,107,32,108,111,111,112,0,70,105,108,101,110,97,109,101,32,116,111,111,32,108,111,110,103,0,84,111,111,32,109,97,110,121,32,111,112,101,110,32,102,105,108,101,115,32,105,110,32,115,121,115,116,101,109,0,78,111,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,115,32,97,118,97,105,108,97,98,108,101,0,66,97,100,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,0,78,111,32,99,104,105,108,100,32,112,114,111,99,101,115,115,0,66,97,100,32,97,100,100,114,101,115,115,0,70,105,108,101,32,116,111,111,32,108,97,114,103,101,0,84,111,111,32,109,97,110,121,32,108,105,110,107,115,0,78,111,32,108,111,99,107,115,32,97,118,97,105,108,97,98,108,101,0,82,101,115,111,117,114,99,101,32,100,101,97,100,108,111,99,107,32,119,111,117,108,100,32,111,99,99,117,114,0,83,116,97,116,101,32,110,111,116,32,114,101,99,111,118,101,114,97,98,108,101,0,80,114,101,118,105,111,117,115,32,111,119,110,101,114,32,100,105,101,100,0,79,112,101,114,97,116,105,111,110,32,99,97,110,99,101,108,101,100,0,70,117,110,99,116,105,111,110,32,110,111,116,32,105,109,112,108,101,109,101,110,116,101,100,0,78,111,32,109,101,115,115,97,103,101,32,111,102,32,100,101,115,105,114,101,100,32,116,121,112,101,0,73,100,101,110,116,105,102,105,101,114,32,114,101,109,111,118,101,100,0,68,101,118,105,99,101,32,110,111,116,32,97,32,115,116,114,101,97,109,0,78,111,32,100,97,116,97,32,97,118,97,105,108,97,98,108,101,0,68,101,118,105,99,101,32,116,105,109,101,111,117,116,0,79,117,116,32,111,102,32,115,116,114,101,97,109,115,32,114,101,115,111,117,114,99,101,115,0,76,105,110,107,32,104,97,115,32,98,101,101,110,32,115,101,118,101,114,101,100,0,80,114,111,116,111,99,111,108,32,101,114,114,111,114,0,66,97,100,32,109,101,115,115,97,103,101,0,70,105,108,101,32,100,101,115,99,114,105,112,116,111,114,32,105,110,32,98,97,100,32,115,116,97,116,101,0,78,111,116,32,97,32,115,111,99,107,101,116,0,68,101,115,116,105,110,97,116,105,111,110,32,97,100,100,114,101,115,115,32,114,101,113,117,105,114,101,100,0,77,101,115,115,97,103,101,32,116,111,111,32,108,97,114,103,101,0,80,114,111,116,111,99,111,108,32,119,114,111,110,103,32,116,121,112,101,32,102,111,114,32,115,111,99,107,101,116,0,80,114,111,116,111,99,111,108,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,80,114,111,116,111,99,111,108,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,83,111,99,107,101,116,32,116,121,112,101,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,78,111,116,32,115,117,112,112,111,114,116,101,100,0,80,114,111,116,111,99,111,108,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,65,100,100,114,101,115,115,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,98,121,32,112,114,111,116,111,99,111,108,0,65,100,100,114,101,115,115,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,78,101,116,119,111,114,107,32,105,115,32,100,111,119,110,0,78,101,116,119,111,114,107,32,117,110,114,101,97,99,104,97,98,108,101,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,110,101,116,119,111,114,107,0,67,111,110,110,101,99,116,105,111,110,32,97,98,111,114,116,101,100,0,78,111,32,98,117,102,102,101,114,32,115,112,97,99,101,32,97,118,97,105,108,97,98,108,101,0,83,111,99,107,101,116,32,105,115,32,99,111,110,110,101,99,116,101,100,0,83,111,99,107,101,116,32,110,111,116,32,99,111,110,110,101,99,116,101,100,0,67,97,110,110,111,116,32,115,101,110,100,32,97,102,116,101,114,32,115,111,99,107,101,116,32,115,104,117,116,100,111,119,110,0,79,112,101,114,97,116,105,111,110,32,97,108,114,101,97,100,121,32,105,110,32,112,114,111,103,114,101,115,115,0,79,112,101,114,97,116,105,111,110,32,105,110,32,112,114,111,103,114,101,115,115,0,83,116,97,108,101,32,102,105,108,101,32,104,97,110,100,108,101,0,82,101,109,111,116,101,32,73,47,79,32,101,114,114,111,114,0,81,117,111,116,97,32,101,120,99,101,101,100,101,100,0,78,111,32,109,101,100,105,117,109,32,102,111,117,110,100,0,87,114,111,110,103,32,109,101,100,105,117,109,32,116,121,112,101,0,78,111,32,101,114,114,111,114,32,105,110,102,111,114,109,97,116,105,111,110,0,0,105,110,102,105,110,105,116,121,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,1,2,3,4,5,6,7,8,9,255,255,255,255,255,255,255,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,255,255,255,255,255,255,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,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,1,2,4,7,3,6,5,0,114,119,97],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+10240);allocate([17,0,10,0,17,17,17,0,0,0,0,5,0,0,0,0,0,0,9,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,15,10,17,17,17,3,10,7,0,1,19,9,11,11,0,0,9,6,11,0,0,11,0,6,17,0,0,0,17,17,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,10,10,17,17,17,0,10,0,0,2,0,9,11,0,0,0,9,0,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,4,13,0,0,0,0,9,14,0,0,0,0,0,14,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,15,0,0,0,0,9,16,0,0,0,0,0,16,0,0,16,0,0,18,0,0,0,18,18,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,18,18,18,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,0,0,0,0,9,11,0,0,0,0,0,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70,45,43,32,32,32,48,88,48,120,0,40,110,117,108,108,41,0,45,48,88,43,48,88,32,48,88,45,48,120,43,48,120,32,48,120,0,105,110,102,0,73,78,70,0,110,97,110,0,78,65,78,0,46,0],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+15945);var tempDoublePtr=Runtime.alignMemory(allocate(12,"i8",ALLOC_STATIC),8);assert(tempDoublePtr%8==0);function copyTempFloat(ptr){HEAP8[tempDoublePtr]=HEAP8[ptr];HEAP8[tempDoublePtr+1]=HEAP8[ptr+1];HEAP8[tempDoublePtr+2]=HEAP8[ptr+2];HEAP8[tempDoublePtr+3]=HEAP8[ptr+3]}function copyTempDouble(ptr){HEAP8[tempDoublePtr]=HEAP8[ptr];HEAP8[tempDoublePtr+1]=HEAP8[ptr+1];HEAP8[tempDoublePtr+2]=HEAP8[ptr+2];HEAP8[tempDoublePtr+3]=HEAP8[ptr+3];HEAP8[tempDoublePtr+4]=HEAP8[ptr+4];HEAP8[tempDoublePtr+5]=HEAP8[ptr+5];HEAP8[tempDoublePtr+6]=HEAP8[ptr+6];HEAP8[tempDoublePtr+7]=HEAP8[ptr+7]}function _atexit(func,arg){__ATEXIT__.unshift({func:func,arg:arg})}function ___cxa_atexit(){return _atexit.apply(null,arguments)}Module["_i64Subtract"]=_i64Subtract;function ___assert_fail(condition,filename,line,func){ABORT=true;throw"Assertion failed: "+Pointer_stringify(condition)+", at: "+[filename?Pointer_stringify(filename):"unknown filename",line,func?Pointer_stringify(func):"unknown function"]+" at "+stackTrace()}function embind_init_charCodes(){var codes=new Array(256);for(var i=0;i<256;++i){codes[i]=String.fromCharCode(i)}embind_charCodes=codes}var embind_charCodes=undefined;function readLatin1String(ptr){var ret="";var c=ptr;while(HEAPU8[c]){ret+=embind_charCodes[HEAPU8[c++]]}return ret}var awaitingDependencies={};var registeredTypes={};var typeDependencies={};var char_0=48;var char_9=57;function makeLegalFunctionName(name){if(undefined===name){return"_unknown"}name=name.replace(/[^a-zA-Z0-9_]/g,"$");var f=name.charCodeAt(0);if(f>=char_0&&f<=char_9){return"_"+name}else{return name}}function createNamedFunction(name,body){name=makeLegalFunctionName(name);return(new Function("body","return function "+name+"() {\n"+' "use strict";'+" return body.apply(this, arguments);\n"+"};\n"))(body)}function extendError(baseErrorType,errorName){var errorClass=createNamedFunction(errorName,(function(message){this.name=errorName;this.message=message;var stack=(new Error(message)).stack;if(stack!==undefined){this.stack=this.toString()+"\n"+stack.replace(/^Error(:[^\n]*)?\n/,"")}}));errorClass.prototype=Object.create(baseErrorType.prototype);errorClass.prototype.constructor=errorClass;errorClass.prototype.toString=(function(){if(this.message===undefined){return this.name}else{return this.name+": "+this.message}});return errorClass}var BindingError=undefined;function throwBindingError(message){throw new BindingError(message)}var InternalError=undefined;function throwInternalError(message){throw new InternalError(message)}function whenDependentTypesAreResolved(myTypes,dependentTypes,getTypeConverters){myTypes.forEach((function(type){typeDependencies[type]=dependentTypes}));function onComplete(typeConverters){var myTypeConverters=getTypeConverters(typeConverters);if(myTypeConverters.length!==myTypes.length){throwInternalError("Mismatched type converter count")}for(var i=0;i<myTypes.length;++i){registerType(myTypes[i],myTypeConverters[i])}}var typeConverters=new Array(dependentTypes.length);var unregisteredTypes=[];var registered=0;dependentTypes.forEach((function(dt,i){if(registeredTypes.hasOwnProperty(dt)){typeConverters[i]=registeredTypes[dt]}else{unregisteredTypes.push(dt);if(!awaitingDependencies.hasOwnProperty(dt)){awaitingDependencies[dt]=[]}awaitingDependencies[dt].push((function(){typeConverters[i]=registeredTypes[dt];++registered;if(registered===unregisteredTypes.length){onComplete(typeConverters)}}))}}));if(0===unregisteredTypes.length){onComplete(typeConverters)}}function registerType(rawType,registeredInstance,options){options=options||{};if(!("argPackAdvance"in registeredInstance)){throw new TypeError("registerType registeredInstance requires argPackAdvance")}var name=registeredInstance.name;if(!rawType){throwBindingError('type "'+name+'" must have a positive integer typeid pointer')}if(registeredTypes.hasOwnProperty(rawType)){if(options.ignoreDuplicateRegistrations){return}else{throwBindingError("Cannot register type '"+name+"' twice")}}registeredTypes[rawType]=registeredInstance;delete typeDependencies[rawType];if(awaitingDependencies.hasOwnProperty(rawType)){var callbacks=awaitingDependencies[rawType];delete awaitingDependencies[rawType];callbacks.forEach((function(cb){cb()}))}}function __embind_register_void(rawType,name){name=readLatin1String(name);registerType(rawType,{isVoid:true,name:name,"argPackAdvance":0,"fromWireType":(function(){return undefined}),"toWireType":(function(destructors,o){return undefined})})}function __ZSt18uncaught_exceptionv(){return!!__ZSt18uncaught_exceptionv.uncaught_exception}var EXCEPTIONS={last:0,caught:[],infos:{},deAdjust:(function(adjusted){if(!adjusted||EXCEPTIONS.infos[adjusted])return adjusted;for(var ptr in EXCEPTIONS.infos){var info=EXCEPTIONS.infos[ptr];if(info.adjusted===adjusted){return ptr}}return adjusted}),addRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];info.refcount++}),decRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];assert(info.refcount>0);info.refcount--;if(info.refcount===0){if(info.destructor){Runtime.dynCall("vi",info.destructor,[ptr])}delete EXCEPTIONS.infos[ptr];___cxa_free_exception(ptr)}}),clearRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];info.refcount=0})};function ___resumeException(ptr){if(!EXCEPTIONS.last){EXCEPTIONS.last=ptr}EXCEPTIONS.clearRef(EXCEPTIONS.deAdjust(ptr));throw ptr+" - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch."}function ___cxa_find_matching_catch(){var thrown=EXCEPTIONS.last;if(!thrown){return(asm["setTempRet0"](0),0)|0}var info=EXCEPTIONS.infos[thrown];var throwntype=info.type;if(!throwntype){return(asm["setTempRet0"](0),thrown)|0}var typeArray=Array.prototype.slice.call(arguments);var pointer=Module["___cxa_is_pointer_type"](throwntype);if(!___cxa_find_matching_catch.buffer)___cxa_find_matching_catch.buffer=_malloc(4);HEAP32[___cxa_find_matching_catch.buffer>>2]=thrown;thrown=___cxa_find_matching_catch.buffer;for(var i=0;i<typeArray.length;i++){if(typeArray[i]&&Module["___cxa_can_catch"](typeArray[i],throwntype,thrown)){thrown=HEAP32[thrown>>2];info.adjusted=thrown;return(asm["setTempRet0"](typeArray[i]),thrown)|0}}thrown=HEAP32[thrown>>2];return(asm["setTempRet0"](throwntype),thrown)|0}function ___cxa_throw(ptr,type,destructor){EXCEPTIONS.infos[ptr]={ptr:ptr,adjusted:ptr,type:type,destructor:destructor,refcount:0};EXCEPTIONS.last=ptr;if(!("uncaught_exception"in __ZSt18uncaught_exceptionv)){__ZSt18uncaught_exceptionv.uncaught_exception=1}else{__ZSt18uncaught_exceptionv.uncaught_exception++}throw ptr+" - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch."}Module["_memset"]=_memset;var _BDtoILow=true;function getShiftFromSize(size){switch(size){case 1:return 0;case 2:return 1;case 4:return 2;case 8:return 3;default:throw new TypeError("Unknown type size: "+size)}}function __embind_register_bool(rawType,name,size,trueValue,falseValue){var shift=getShiftFromSize(size);name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":(function(wt){return!!wt}),"toWireType":(function(destructors,o){return o?trueValue:falseValue}),"argPackAdvance":8,"readValueFromPointer":(function(pointer){var heap;if(size===1){heap=HEAP8}else if(size===2){heap=HEAP16}else if(size===4){heap=HEAP32}else{throw new TypeError("Unknown boolean type size: "+name)}return this["fromWireType"](heap[pointer>>shift])}),destructorFunction:null})}Module["_bitshift64Shl"]=_bitshift64Shl;function _abort(){Module["abort"]()}function _free(){}Module["_free"]=_free;function _malloc(bytes){var ptr=Runtime.dynamicAlloc(bytes+8);return ptr+8&4294967288}Module["_malloc"]=_malloc;function simpleReadValueFromPointer(pointer){return this["fromWireType"](HEAPU32[pointer>>2])}function __embind_register_std_string(rawType,name){name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":(function(value){var length=HEAPU32[value>>2];var a=new Array(length);for(var i=0;i<length;++i){a[i]=String.fromCharCode(HEAPU8[value+4+i])}_free(value);return a.join("")}),"toWireType":(function(destructors,value){if(value instanceof ArrayBuffer){value=new Uint8Array(value)}function getTAElement(ta,index){return ta[index]}function getStringElement(string,index){return string.charCodeAt(index)}var getElement;if(value instanceof Uint8Array){getElement=getTAElement}else if(value instanceof Int8Array){getElement=getTAElement}else if(typeof value==="string"){getElement=getStringElement}else{throwBindingError("Cannot pass non-string to std::string")}var length=value.length;var ptr=_malloc(4+length);HEAPU32[ptr>>2]=length;for(var i=0;i<length;++i){var charCode=getElement(value,i);if(charCode>255){_free(ptr);throwBindingError("String has UTF-16 code units that do not fit in 8 bits")}HEAPU8[ptr+4+i]=charCode}if(destructors!==null){destructors.push(_free,ptr)}return ptr}),"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:(function(ptr){_free(ptr)})})}function __embind_register_std_wstring(rawType,charSize,name){name=readLatin1String(name);var getHeap,shift;if(charSize===2){getHeap=(function(){return HEAPU16});shift=1}else if(charSize===4){getHeap=(function(){return HEAPU32});shift=2}registerType(rawType,{name:name,"fromWireType":(function(value){var HEAP=getHeap();var length=HEAPU32[value>>2];var a=new Array(length);var start=value+4>>shift;for(var i=0;i<length;++i){a[i]=String.fromCharCode(HEAP[start+i])}_free(value);return a.join("")}),"toWireType":(function(destructors,value){var HEAP=getHeap();var length=value.length;var ptr=_malloc(4+length*charSize);HEAPU32[ptr>>2]=length;var start=ptr+4>>shift;for(var i=0;i<length;++i){HEAP[start+i]=value.charCodeAt(i)}if(destructors!==null){destructors.push(_free,ptr)}return ptr}),"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:(function(ptr){_free(ptr)})})}function ___lock(){}function ___unlock(){}var _emscripten_asm_const_int=true;Module["_i64Add"]=_i64Add;var _fabs=Math_abs;var _sqrt=Math_sqrt;function _embind_repr(v){if(v===null){return"null"}var t=typeof v;if(t==="object"||t==="array"||t==="function"){return v.toString()}else{return""+v}}function integerReadValueFromPointer(name,shift,signed){switch(shift){case 0:return signed?function readS8FromPointer(pointer){return HEAP8[pointer]}:function readU8FromPointer(pointer){return HEAPU8[pointer]};case 1:return signed?function readS16FromPointer(pointer){return HEAP16[pointer>>1]}:function readU16FromPointer(pointer){return HEAPU16[pointer>>1]};case 2:return signed?function readS32FromPointer(pointer){return HEAP32[pointer>>2]}:function readU32FromPointer(pointer){return HEAPU32[pointer>>2]};default:throw new TypeError("Unknown integer type: "+name)}}function __embind_register_integer(primitiveType,name,size,minRange,maxRange){name=readLatin1String(name);if(maxRange===-1){maxRange=4294967295}var shift=getShiftFromSize(size);var fromWireType=(function(value){return value});if(minRange===0){var bitshift=32-8*size;fromWireType=(function(value){return value<<bitshift>>>bitshift})}registerType(primitiveType,{name:name,"fromWireType":fromWireType,"toWireType":(function(destructors,value){if(typeof value!=="number"&&typeof value!=="boolean"){throw new TypeError('Cannot convert "'+_embind_repr(value)+'" to '+this.name)}if(value<minRange||value>maxRange){throw new TypeError('Passing a number "'+_embind_repr(value)+'" from JS side to C/C++ side to an argument of type "'+name+'", which is outside the valid range ['+minRange+", "+maxRange+"]!")}return value|0}),"argPackAdvance":8,"readValueFromPointer":integerReadValueFromPointer(name,shift,minRange!==0),destructorFunction:null})}var emval_free_list=[];var emval_handle_array=[{},{value:undefined},{value:null},{value:true},{value:false}];function __emval_decref(handle){if(handle>4&&0===--emval_handle_array[handle].refcount){emval_handle_array[handle]=undefined;emval_free_list.push(handle)}}function count_emval_handles(){var count=0;for(var i=5;i<emval_handle_array.length;++i){if(emval_handle_array[i]!==undefined){++count}}return count}function get_first_emval(){for(var i=5;i<emval_handle_array.length;++i){if(emval_handle_array[i]!==undefined){return emval_handle_array[i]}}return null}function init_emval(){Module["count_emval_handles"]=count_emval_handles;Module["get_first_emval"]=get_first_emval}function __emval_register(value){switch(value){case undefined:{return 1};case null:{return 2};case true:{return 3};case false:{return 4};default:{var handle=emval_free_list.length?emval_free_list.pop():emval_handle_array.length;emval_handle_array[handle]={refcount:1,value:value};return handle}}}function __embind_register_emval(rawType,name){name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":(function(handle){var rv=emval_handle_array[handle].value;__emval_decref(handle);return rv}),"toWireType":(function(destructors,value){return __emval_register(value)}),"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:null})}function ___cxa_allocate_exception(size){return _malloc(size)}var _sin=Math_sin;function ___setErrNo(value){if(Module["___errno_location"])HEAP32[Module["___errno_location"]()>>2]=value;return value}var ERRNO_CODES={EPERM:1,ENOENT:2,ESRCH:3,EINTR:4,EIO:5,ENXIO:6,E2BIG:7,ENOEXEC:8,EBADF:9,ECHILD:10,EAGAIN:11,EWOULDBLOCK:11,ENOMEM:12,EACCES:13,EFAULT:14,ENOTBLK:15,EBUSY:16,EEXIST:17,EXDEV:18,ENODEV:19,ENOTDIR:20,EISDIR:21,EINVAL:22,ENFILE:23,EMFILE:24,ENOTTY:25,ETXTBSY:26,EFBIG:27,ENOSPC:28,ESPIPE:29,EROFS:30,EMLINK:31,EPIPE:32,EDOM:33,ERANGE:34,ENOMSG:42,EIDRM:43,ECHRNG:44,EL2NSYNC:45,EL3HLT:46,EL3RST:47,ELNRNG:48,EUNATCH:49,ENOCSI:50,EL2HLT:51,EDEADLK:35,ENOLCK:37,EBADE:52,EBADR:53,EXFULL:54,ENOANO:55,EBADRQC:56,EBADSLT:57,EDEADLOCK:35,EBFONT:59,ENOSTR:60,ENODATA:61,ETIME:62,ENOSR:63,ENONET:64,ENOPKG:65,EREMOTE:66,ENOLINK:67,EADV:68,ESRMNT:69,ECOMM:70,EPROTO:71,EMULTIHOP:72,EDOTDOT:73,EBADMSG:74,ENOTUNIQ:76,EBADFD:77,EREMCHG:78,ELIBACC:79,ELIBBAD:80,ELIBSCN:81,ELIBMAX:82,ELIBEXEC:83,ENOSYS:38,ENOTEMPTY:39,ENAMETOOLONG:36,ELOOP:40,EOPNOTSUPP:95,EPFNOSUPPORT:96,ECONNRESET:104,ENOBUFS:105,EAFNOSUPPORT:97,EPROTOTYPE:91,ENOTSOCK:88,ENOPROTOOPT:92,ESHUTDOWN:108,ECONNREFUSED:111,EADDRINUSE:98,ECONNABORTED:103,ENETUNREACH:101,ENETDOWN:100,ETIMEDOUT:110,EHOSTDOWN:112,EHOSTUNREACH:113,EINPROGRESS:115,EALREADY:114,EDESTADDRREQ:89,EMSGSIZE:90,EPROTONOSUPPORT:93,ESOCKTNOSUPPORT:94,EADDRNOTAVAIL:99,ENETRESET:102,EISCONN:106,ENOTCONN:107,ETOOMANYREFS:109,EUSERS:87,EDQUOT:122,ESTALE:116,ENOTSUP:95,ENOMEDIUM:123,EILSEQ:84,EOVERFLOW:75,ECANCELED:125,ENOTRECOVERABLE:131,EOWNERDEAD:130,ESTRPIPE:86};function _sysconf(name){switch(name){case 30:return PAGE_SIZE;case 85:return totalMemory/PAGE_SIZE;case 132:case 133:case 12:case 137:case 138:case 15:case 235:case 16:case 17:case 18:case 19:case 20:case 149:case 13:case 10:case 236:case 153:case 9:case 21:case 22:case 159:case 154:case 14:case 77:case 78:case 139:case 80:case 81:case 82:case 68:case 67:case 164:case 11:case 29:case 47:case 48:case 95:case 52:case 51:case 46:return 200809;case 79:return 0;case 27:case 246:case 127:case 128:case 23:case 24:case 160:case 161:case 181:case 182:case 242:case 183:case 184:case 243:case 244:case 245:case 165:case 178:case 179:case 49:case 50:case 168:case 169:case 175:case 170:case 171:case 172:case 97:case 76:case 32:case 173:case 35:return-1;case 176:case 177:case 7:case 155:case 8:case 157:case 125:case 126:case 92:case 93:case 129:case 130:case 131:case 94:case 91:return 1;case 74:case 60:case 69:case 70:case 4:return 1024;case 31:case 42:case 72:return 32;case 87:case 26:case 33:return 2147483647;case 34:case 1:return 47839;case 38:case 36:return 99;case 43:case 37:return 2048;case 0:return 2097152;case 3:return 65536;case 28:return 32768;case 44:return 32767;case 75:return 16384;case 39:return 1e3;case 89:return 700;case 71:return 256;case 40:return 255;case 2:return 100;case 180:return 64;case 25:return 20;case 5:return 16;case 6:return 6;case 73:return 4;case 84:{if(typeof navigator==="object")return navigator["hardwareConcurrency"]||1;return 1}}___setErrNo(ERRNO_CODES.EINVAL);return-1}Module["_bitshift64Lshr"]=_bitshift64Lshr;function __exit(status){Module["exit"](status)}function _exit(status){__exit(status)}var _llvm_ctlz_i32=true;function floatReadValueFromPointer(name,shift){switch(shift){case 2:return(function(pointer){return this["fromWireType"](HEAPF32[pointer>>2])});case 3:return(function(pointer){return this["fromWireType"](HEAPF64[pointer>>3])});default:throw new TypeError("Unknown float type: "+name)}}function __embind_register_float(rawType,name,size){var shift=getShiftFromSize(size);name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":(function(value){return value}),"toWireType":(function(destructors,value){if(typeof value!=="number"&&typeof value!=="boolean"){throw new TypeError('Cannot convert "'+_embind_repr(value)+'" to '+this.name)}return value}),"argPackAdvance":8,"readValueFromPointer":floatReadValueFromPointer(name,shift),destructorFunction:null})}var _BDtoIHigh=true;function _pthread_cleanup_push(routine,arg){__ATEXIT__.push((function(){Runtime.dynCall("vi",routine,[arg])}));_pthread_cleanup_push.level=__ATEXIT__.length}function new_(constructor,argumentList){if(!(constructor instanceof Function)){throw new TypeError("new_ called with constructor type "+typeof constructor+" which is not a function")}var dummy=createNamedFunction(constructor.name||"unknownFunctionName",(function(){}));dummy.prototype=constructor.prototype;var obj=new dummy;var r=constructor.apply(obj,argumentList);return r instanceof Object?r:obj}function runDestructors(destructors){while(destructors.length){var ptr=destructors.pop();var del=destructors.pop();del(ptr)}}function craftInvokerFunction(humanName,argTypes,classType,cppInvokerFunc,cppTargetFunc){var argCount=argTypes.length;if(argCount<2){throwBindingError("argTypes array size mismatch! Must at least get return value and 'this' types!")}var isClassMethodFunc=argTypes[1]!==null&&classType!==null;var argsList="";var argsListWired="";for(var i=0;i<argCount-2;++i){argsList+=(i!==0?", ":"")+"arg"+i;argsListWired+=(i!==0?", ":"")+"arg"+i+"Wired"}var invokerFnBody="return function "+makeLegalFunctionName(humanName)+"("+argsList+") {\n"+"if (arguments.length !== "+(argCount-2)+") {\n"+"throwBindingError('function "+humanName+" called with ' + arguments.length + ' arguments, expected "+(argCount-2)+" args!');\n"+"}\n";var needsDestructorStack=false;for(var i=1;i<argTypes.length;++i){if(argTypes[i]!==null&&argTypes[i].destructorFunction===undefined){needsDestructorStack=true;break}}if(needsDestructorStack){invokerFnBody+="var destructors = [];\n"}var dtorStack=needsDestructorStack?"destructors":"null";var args1=["throwBindingError","invoker","fn","runDestructors","retType","classParam"];var args2=[throwBindingError,cppInvokerFunc,cppTargetFunc,runDestructors,argTypes[0],argTypes[1]];if(isClassMethodFunc){invokerFnBody+="var thisWired = classParam.toWireType("+dtorStack+", this);\n"}for(var i=0;i<argCount-2;++i){invokerFnBody+="var arg"+i+"Wired = argType"+i+".toWireType("+dtorStack+", arg"+i+"); // "+argTypes[i+2].name+"\n";args1.push("argType"+i);args2.push(argTypes[i+2])}if(isClassMethodFunc){argsListWired="thisWired"+(argsListWired.length>0?", ":"")+argsListWired}var returns=argTypes[0].name!=="void";invokerFnBody+=(returns?"var rv = ":"")+"invoker(fn"+(argsListWired.length>0?", ":"")+argsListWired+");\n";if(needsDestructorStack){invokerFnBody+="runDestructors(destructors);\n"}else{for(var i=isClassMethodFunc?1:2;i<argTypes.length;++i){var paramName=i===1?"thisWired":"arg"+(i-2)+"Wired";if(argTypes[i].destructorFunction!==null){invokerFnBody+=paramName+"_dtor("+paramName+"); // "+argTypes[i].name+"\n";args1.push(paramName+"_dtor");args2.push(argTypes[i].destructorFunction)}}}if(returns){invokerFnBody+="var ret = retType.fromWireType(rv);\n"+"return ret;\n"}else{}invokerFnBody+="}\n";args1.push(invokerFnBody);var invokerFunction=new_(Function,args1).apply(null,args2);return invokerFunction}function ensureOverloadTable(proto,methodName,humanName){if(undefined===proto[methodName].overloadTable){var prevFunc=proto[methodName];proto[methodName]=(function(){if(!proto[methodName].overloadTable.hasOwnProperty(arguments.length)){throwBindingError("Function '"+humanName+"' called with an invalid number of arguments ("+arguments.length+") - expects one of ("+proto[methodName].overloadTable+")!")}return proto[methodName].overloadTable[arguments.length].apply(this,arguments)});proto[methodName].overloadTable=[];proto[methodName].overloadTable[prevFunc.argCount]=prevFunc}}function exposePublicSymbol(name,value,numArguments){if(Module.hasOwnProperty(name)){if(undefined===numArguments||undefined!==Module[name].overloadTable&&undefined!==Module[name].overloadTable[numArguments]){throwBindingError("Cannot register public name '"+name+"' twice")}ensureOverloadTable(Module,name,name);if(Module.hasOwnProperty(numArguments)){throwBindingError("Cannot register multiple overloads of a function with the same number of arguments ("+numArguments+")!")}Module[name].overloadTable[numArguments]=value}else{Module[name]=value;if(undefined!==numArguments){Module[name].numArguments=numArguments}}}function heap32VectorToArray(count,firstElement){var array=[];for(var i=0;i<count;i++){array.push(HEAP32[(firstElement>>2)+i])}return array}function replacePublicSymbol(name,value,numArguments){if(!Module.hasOwnProperty(name)){throwInternalError("Replacing nonexistant public symbol")}if(undefined!==Module[name].overloadTable&&undefined!==numArguments){Module[name].overloadTable[numArguments]=value}else{Module[name]=value}}function requireFunction(signature,rawFunction){signature=readLatin1String(signature);function makeDynCaller(dynCall){var args=[];for(var i=1;i<signature.length;++i){args.push("a"+i)}var name="dynCall_"+signature+"_"+rawFunction;var body="return function "+name+"("+args.join(", ")+") {\n";body+=" return dynCall(rawFunction"+(args.length?", ":"")+args.join(", ")+");\n";body+="};\n";return(new Function("dynCall","rawFunction",body))(dynCall,rawFunction)}var fp;if(Module["FUNCTION_TABLE_"+signature]!==undefined){fp=Module["FUNCTION_TABLE_"+signature][rawFunction]}else if(typeof FUNCTION_TABLE!=="undefined"){fp=FUNCTION_TABLE[rawFunction]}else{var dc=asm["dynCall_"+signature];if(dc===undefined){dc=asm["dynCall_"+signature.replace(/f/g,"d")];if(dc===undefined){throwBindingError("No dynCall invoker for signature: "+signature)}}fp=makeDynCaller(dc)}if(typeof fp!=="function"){throwBindingError("unknown function pointer with signature "+signature+": "+rawFunction)}return fp}var UnboundTypeError=undefined;function getTypeName(type){var ptr=___getTypeName(type);var rv=readLatin1String(ptr);_free(ptr);return rv}function throwUnboundTypeError(message,types){var unboundTypes=[];var seen={};function visit(type){if(seen[type]){return}if(registeredTypes[type]){return}if(typeDependencies[type]){typeDependencies[type].forEach(visit);return}unboundTypes.push(type);seen[type]=true}types.forEach(visit);throw new UnboundTypeError(message+": "+unboundTypes.map(getTypeName).join([", "]))}function __embind_register_function(name,argCount,rawArgTypesAddr,signature,rawInvoker,fn){var argTypes=heap32VectorToArray(argCount,rawArgTypesAddr);name=readLatin1String(name);rawInvoker=requireFunction(signature,rawInvoker);exposePublicSymbol(name,(function(){throwUnboundTypeError("Cannot call "+name+" due to unbound types",argTypes)}),argCount-1);whenDependentTypesAreResolved([],argTypes,(function(argTypes){var invokerArgsArray=[argTypes[0],null].concat(argTypes.slice(1));replacePublicSymbol(name,craftInvokerFunction(name,invokerArgsArray,null,rawInvoker,fn),argCount-1);return[]}))}function __embind_register_constant(name,type,value){name=readLatin1String(name);whenDependentTypesAreResolved([],[type],(function(type){type=type[0];Module[name]=type["fromWireType"](value);return[]}))}function _pthread_cleanup_pop(){assert(_pthread_cleanup_push.level==__ATEXIT__.length,"cannot pop if something else added meanwhile!");__ATEXIT__.pop();_pthread_cleanup_push.level=__ATEXIT__.length}var ERRNO_MESSAGES={0:"Success",1:"Not super-user",2:"No such file or directory",3:"No such process",4:"Interrupted system call",5:"I/O error",6:"No such device or address",7:"Arg list too long",8:"Exec format error",9:"Bad file number",10:"No children",11:"No more processes",12:"Not enough core",13:"Permission denied",14:"Bad address",15:"Block device required",16:"Mount device busy",17:"File exists",18:"Cross-device link",19:"No such device",20:"Not a directory",21:"Is a directory",22:"Invalid argument",23:"Too many open files in system",24:"Too many open files",25:"Not a typewriter",26:"Text file busy",27:"File too large",28:"No space left on device",29:"Illegal seek",30:"Read only file system",31:"Too many links",32:"Broken pipe",33:"Math arg out of domain of func",34:"Math result not representable",35:"File locking deadlock error",36:"File or path name too long",37:"No record locks available",38:"Function not implemented",39:"Directory not empty",40:"Too many symbolic links",42:"No message of desired type",43:"Identifier removed",44:"Channel number out of range",45:"Level 2 not synchronized",46:"Level 3 halted",47:"Level 3 reset",48:"Link number out of range",49:"Protocol driver not attached",50:"No CSI structure available",51:"Level 2 halted",52:"Invalid exchange",53:"Invalid request descriptor",54:"Exchange full",55:"No anode",56:"Invalid request code",57:"Invalid slot",59:"Bad font file fmt",60:"Device not a stream",61:"No data (for no delay io)",62:"Timer expired",63:"Out of streams resources",64:"Machine is not on the network",65:"Package not installed",66:"The object is remote",67:"The link has been severed",68:"Advertise error",69:"Srmount error",70:"Communication error on send",71:"Protocol error",72:"Multihop attempted",73:"Cross mount point (not really error)",74:"Trying to read unreadable message",75:"Value too large for defined data type",76:"Given log. name not unique",77:"f.d. invalid for this operation",78:"Remote address changed",79:"Can access a needed shared lib",80:"Accessing a corrupted shared lib",81:".lib section in a.out corrupted",82:"Attempting to link in too many libs",83:"Attempting to exec a shared library",84:"Illegal byte sequence",86:"Streams pipe error",87:"Too many users",88:"Socket operation on non-socket",89:"Destination address required",90:"Message too long",91:"Protocol wrong type for socket",92:"Protocol not available",93:"Unknown protocol",94:"Socket type not supported",95:"Not supported",96:"Protocol family not supported",97:"Address family not supported by protocol family",98:"Address already in use",99:"Address not available",100:"Network interface is not configured",101:"Network is unreachable",102:"Connection reset by network",103:"Connection aborted",104:"Connection reset by peer",105:"No buffer space available",106:"Socket is already connected",107:"Socket is not connected",108:"Can't send after socket shutdown",109:"Too many references",110:"Connection timed out",111:"Connection refused",112:"Host is down",113:"Host is unreachable",114:"Socket already connected",115:"Connection already in progress",116:"Stale file handle",122:"Quota exceeded",123:"No medium (in tape drive)",125:"Operation canceled",130:"Previous owner died",131:"State not recoverable"};var PATH={splitPath:(function(filename){var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)}),normalizeArray:(function(parts,allowAboveRoot){var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up--;up){parts.unshift("..")}}return parts}),normalize:(function(path){var isAbsolute=path.charAt(0)==="/",trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter((function(p){return!!p})),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path}),dirname:(function(path){var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir}),basename:(function(path){if(path==="/")return"/";var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)}),extname:(function(path){return PATH.splitPath(path)[3]}),join:(function(){var paths=Array.prototype.slice.call(arguments,0);return PATH.normalize(paths.join("/"))}),join2:(function(l,r){return PATH.normalize(l+"/"+r)}),resolve:(function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:FS.cwd();if(typeof path!=="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=path.charAt(0)==="/"}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter((function(p){return!!p})),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."}),relative:(function(from,to){from=PATH.resolve(from).substr(1);to=PATH.resolve(to).substr(1);function trim(arr){var start=0;for(;start<arr.length;start++){if(arr[start]!=="")break}var end=arr.length-1;for(;end>=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i<length;i++){if(fromParts[i]!==toParts[i]){samePartsLength=i;break}}var outputParts=[];for(var i=samePartsLength;i<fromParts.length;i++){outputParts.push("..")}outputParts=outputParts.concat(toParts.slice(samePartsLength));return outputParts.join("/")})};var TTY={ttys:[],init:(function(){}),shutdown:(function(){}),register:(function(dev,ops){TTY.ttys[dev]={input:[],output:[],ops:ops};FS.registerDevice(dev,TTY.stream_ops)}),stream_ops:{open:(function(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.ErrnoError(ERRNO_CODES.ENODEV)}stream.tty=tty;stream.seekable=false}),close:(function(stream){stream.tty.ops.flush(stream.tty)}),flush:(function(stream){stream.tty.ops.flush(stream.tty)}),read:(function(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char){throw new FS.ErrnoError(ERRNO_CODES.ENXIO)}var bytesRead=0;for(var i=0;i<length;i++){var result;try{result=stream.tty.ops.get_char(stream.tty)}catch(e){throw new FS.ErrnoError(ERRNO_CODES.EIO)}if(result===undefined&&bytesRead===0){throw new FS.ErrnoError(ERRNO_CODES.EAGAIN)}if(result===null||result===undefined)break;bytesRead++;buffer[offset+i]=result}if(bytesRead){stream.node.timestamp=Date.now()}return bytesRead}),write:(function(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.put_char){throw new FS.ErrnoError(ERRNO_CODES.ENXIO)}for(var i=0;i<length;i++){try{stream.tty.ops.put_char(stream.tty,buffer[offset+i])}catch(e){throw new FS.ErrnoError(ERRNO_CODES.EIO)}}if(length){stream.node.timestamp=Date.now()}return i})},default_tty_ops:{get_char:(function(tty){if(!tty.input.length){var result=null;if(ENVIRONMENT_IS_NODE){var BUFSIZE=256;var buf=new Buffer(BUFSIZE);var bytesRead=0;var fd=process.stdin.fd;var usingDevice=false;try{fd=fs.openSync("/dev/stdin","r");usingDevice=true}catch(e){}bytesRead=fs.readSync(fd,buf,0,BUFSIZE,null);if(usingDevice){fs.closeSync(fd)}if(bytesRead>0){result=buf.slice(0,bytesRead).toString("utf-8")}else{result=null}}else if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else if(typeof readline=="function"){result=readline();if(result!==null){result+="\n"}}if(!result){return null}tty.input=intArrayFromString(result,true)}return tty.input.shift()}),put_char:(function(tty,val){if(val===null||val===10){Module["print"](UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}}),flush:(function(tty){if(tty.output&&tty.output.length>0){Module["print"](UTF8ArrayToString(tty.output,0));tty.output=[]}})},default_tty1_ops:{put_char:(function(tty,val){if(val===null||val===10){Module["printErr"](UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}}),flush:(function(tty){if(tty.output&&tty.output.length>0){Module["printErr"](UTF8ArrayToString(tty.output,0));tty.output=[]}})}};var MEMFS={ops_table:null,mount:(function(mount){return MEMFS.createNode(null,"/",16384|511,0)}),createNode:(function(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(!MEMFS.ops_table){MEMFS.ops_table={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}}}var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.timestamp=Date.now();if(parent){parent.contents[name]=node}return node}),getFileDataAsRegularArray:(function(node){if(node.contents&&node.contents.subarray){var arr=[];for(var i=0;i<node.usedBytes;++i)arr.push(node.contents[i]);return arr}return node.contents}),getFileDataAsTypedArray:(function(node){if(!node.contents)return new Uint8Array;if(node.contents.subarray)return node.contents.subarray(0,node.usedBytes);return new Uint8Array(node.contents)}),expandFileStorage:(function(node,newCapacity){if(node.contents&&node.contents.subarray&&newCapacity>node.contents.length){node.contents=MEMFS.getFileDataAsRegularArray(node);node.usedBytes=node.contents.length}if(!node.contents||node.contents.subarray){var prevCapacity=node.contents?node.contents.buffer.byteLength:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity<CAPACITY_DOUBLING_MAX?2:1.125)|0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0);return}if(!node.contents&&newCapacity>0)node.contents=[];while(node.contents.length<newCapacity)node.contents.push(0)}),resizeFileStorage:(function(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0;return}if(!node.contents||node.contents.subarray){var oldContents=node.contents;node.contents=new Uint8Array(new ArrayBuffer(newSize));if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize;return}if(!node.contents)node.contents=[];if(node.contents.length>newSize)node.contents.length=newSize;else while(node.contents.length<newSize)node.contents.push(0);node.usedBytes=newSize}),node_ops:{getattr:(function(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.timestamp);attr.mtime=new Date(node.timestamp);attr.ctime=new Date(node.timestamp);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr}),setattr:(function(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}}),lookup:(function(parent,name){throw FS.genericErrors[ERRNO_CODES.ENOENT]}),mknod:(function(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)}),rename:(function(old_node,new_dir,new_name){if(FS.isDir(old_node.mode)){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){for(var i in new_node.contents){throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY)}}}delete old_node.parent.contents[old_node.name];old_node.name=new_name;new_dir.contents[new_name]=old_node;old_node.parent=new_dir}),unlink:(function(parent,name){delete parent.contents[name]}),rmdir:(function(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY)}delete parent.contents[name]}),readdir:(function(node){var entries=[".",".."];for(var key in node.contents){if(!node.contents.hasOwnProperty(key)){continue}entries.push(key)}return entries}),symlink:(function(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node}),readlink:(function(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}return node.link})},stream_ops:{read:(function(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);assert(size>=0);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i<size;i++)buffer[offset+i]=contents[position+i]}return size}),write:(function(stream,buffer,offset,length,position,canOwn){if(!length)return 0;var node=stream.node;node.timestamp=Date.now();if(buffer.subarray&&(!node.contents||node.contents.subarray)){if(canOwn){node.contents=buffer.subarray(offset,offset+length);node.usedBytes=length;return length}else if(node.usedBytes===0&&position===0){node.contents=new Uint8Array(buffer.subarray(offset,offset+length));node.usedBytes=length;return length}else if(position+length<=node.usedBytes){node.contents.set(buffer.subarray(offset,offset+length),position);return length}}MEMFS.expandFileStorage(node,position+length);if(node.contents.subarray&&buffer.subarray)node.contents.set(buffer.subarray(offset,offset+length),position);else{for(var i=0;i<length;i++){node.contents[position+i]=buffer[offset+i]}}node.usedBytes=Math.max(node.usedBytes,position+length);return length}),llseek:(function(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){position+=stream.node.usedBytes}}if(position<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}return position}),allocate:(function(stream,offset,length){MEMFS.expandFileStorage(stream.node,offset+length);stream.node.usedBytes=Math.max(stream.node.usedBytes,offset+length)}),mmap:(function(stream,buffer,offset,length,position,prot,flags){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(ERRNO_CODES.ENODEV)}var ptr;var allocated;var contents=stream.node.contents;if(!(flags&2)&&(contents.buffer===buffer||contents.buffer===buffer.buffer)){allocated=false;ptr=contents.byteOffset}else{if(position>0||position+length<stream.node.usedBytes){if(contents.subarray){contents=contents.subarray(position,position+length)}else{contents=Array.prototype.slice.call(contents,position,position+length)}}allocated=true;ptr=_malloc(length);if(!ptr){throw new FS.ErrnoError(ERRNO_CODES.ENOMEM)}buffer.set(contents,ptr)}return{ptr:ptr,allocated:allocated}}),msync:(function(stream,buffer,offset,length,mmapFlags){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(ERRNO_CODES.ENODEV)}if(mmapFlags&2){return 0}var bytesWritten=MEMFS.stream_ops.write(stream,buffer,0,length,offset,false);return 0})}};var IDBFS={dbs:{},indexedDB:(function(){if(typeof indexedDB!=="undefined")return indexedDB;var ret=null;if(typeof window==="object")ret=window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB;assert(ret,"IDBFS used, but indexedDB not supported");return ret}),DB_VERSION:21,DB_STORE_NAME:"FILE_DATA",mount:(function(mount){return MEMFS.mount.apply(null,arguments)}),syncfs:(function(mount,populate,callback){IDBFS.getLocalSet(mount,(function(err,local){if(err)return callback(err);IDBFS.getRemoteSet(mount,(function(err,remote){if(err)return callback(err);var src=populate?remote:local;var dst=populate?local:remote;IDBFS.reconcile(src,dst,callback)}))}))}),getDB:(function(name,callback){var db=IDBFS.dbs[name];if(db){return callback(null,db)}var req;try{req=IDBFS.indexedDB().open(name,IDBFS.DB_VERSION)}catch(e){return callback(e)}req.onupgradeneeded=(function(e){var db=e.target.result;var transaction=e.target.transaction;var fileStore;if(db.objectStoreNames.contains(IDBFS.DB_STORE_NAME)){fileStore=transaction.objectStore(IDBFS.DB_STORE_NAME)}else{fileStore=db.createObjectStore(IDBFS.DB_STORE_NAME)}if(!fileStore.indexNames.contains("timestamp")){fileStore.createIndex("timestamp","timestamp",{unique:false})}});req.onsuccess=(function(){db=req.result;IDBFS.dbs[name]=db;callback(null,db)});req.onerror=(function(e){callback(this.error);e.preventDefault()})}),getLocalSet:(function(mount,callback){var entries={};function isRealDir(p){return p!=="."&&p!==".."}function toAbsolute(root){return(function(p){return PATH.join2(root,p)})}var check=FS.readdir(mount.mountpoint).filter(isRealDir).map(toAbsolute(mount.mountpoint));while(check.length){var path=check.pop();var stat;try{stat=FS.stat(path)}catch(e){return callback(e)}if(FS.isDir(stat.mode)){check.push.apply(check,FS.readdir(path).filter(isRealDir).map(toAbsolute(path)))}entries[path]={timestamp:stat.mtime}}return callback(null,{type:"local",entries:entries})}),getRemoteSet:(function(mount,callback){var entries={};IDBFS.getDB(mount.mountpoint,(function(err,db){if(err)return callback(err);var transaction=db.transaction([IDBFS.DB_STORE_NAME],"readonly");transaction.onerror=(function(e){callback(this.error);e.preventDefault()});var store=transaction.objectStore(IDBFS.DB_STORE_NAME);var index=store.index("timestamp");index.openKeyCursor().onsuccess=(function(event){var cursor=event.target.result;if(!cursor){return callback(null,{type:"remote",db:db,entries:entries})}entries[cursor.primaryKey]={timestamp:cursor.key};cursor.continue()})}))}),loadLocalEntry:(function(path,callback){var stat,node;try{var lookup=FS.lookupPath(path);node=lookup.node;stat=FS.stat(path)}catch(e){return callback(e)}if(FS.isDir(stat.mode)){return callback(null,{timestamp:stat.mtime,mode:stat.mode})}else if(FS.isFile(stat.mode)){node.contents=MEMFS.getFileDataAsTypedArray(node);return callback(null,{timestamp:stat.mtime,mode:stat.mode,contents:node.contents})}else{return callback(new Error("node type not supported"))}}),storeLocalEntry:(function(path,entry,callback){try{if(FS.isDir(entry.mode)){FS.mkdir(path,entry.mode)}else if(FS.isFile(entry.mode)){FS.writeFile(path,entry.contents,{encoding:"binary",canOwn:true})}else{return callback(new Error("node type not supported"))}FS.chmod(path,entry.mode);FS.utime(path,entry.timestamp,entry.timestamp)}catch(e){return callback(e)}callback(null)}),removeLocalEntry:(function(path,callback){try{var lookup=FS.lookupPath(path);var stat=FS.stat(path);if(FS.isDir(stat.mode)){FS.rmdir(path)}else if(FS.isFile(stat.mode)){FS.unlink(path)}}catch(e){return callback(e)}callback(null)}),loadRemoteEntry:(function(store,path,callback){var req=store.get(path);req.onsuccess=(function(event){callback(null,event.target.result)});req.onerror=(function(e){callback(this.error);e.preventDefault()})}),storeRemoteEntry:(function(store,path,entry,callback){var req=store.put(entry,path);req.onsuccess=(function(){callback(null)});req.onerror=(function(e){callback(this.error);e.preventDefault()})}),removeRemoteEntry:(function(store,path,callback){var req=store.delete(path);req.onsuccess=(function(){callback(null)});req.onerror=(function(e){callback(this.error);e.preventDefault()})}),reconcile:(function(src,dst,callback){var total=0;var create=[];Object.keys(src.entries).forEach((function(key){var e=src.entries[key];var e2=dst.entries[key];if(!e2||e.timestamp>e2.timestamp){create.push(key);total++}}));var remove=[];Object.keys(dst.entries).forEach((function(key){var e=dst.entries[key];var e2=src.entries[key];if(!e2){remove.push(key);total++}}));if(!total){return callback(null)}var errored=false;var completed=0;var db=src.type==="remote"?src.db:dst.db;var transaction=db.transaction([IDBFS.DB_STORE_NAME],"readwrite");var store=transaction.objectStore(IDBFS.DB_STORE_NAME);function done(err){if(err){if(!done.errored){done.errored=true;return callback(err)}return}if(++completed>=total){return callback(null)}}transaction.onerror=(function(e){done(this.error);e.preventDefault()});create.sort().forEach((function(path){if(dst.type==="local"){IDBFS.loadRemoteEntry(store,path,(function(err,entry){if(err)return done(err);IDBFS.storeLocalEntry(path,entry,done)}))}else{IDBFS.loadLocalEntry(path,(function(err,entry){if(err)return done(err);IDBFS.storeRemoteEntry(store,path,entry,done)}))}}));remove.sort().reverse().forEach((function(path){if(dst.type==="local"){IDBFS.removeLocalEntry(path,done)}else{IDBFS.removeRemoteEntry(store,path,done)}}))})};var NODEFS={isWindows:false,staticInit:(function(){NODEFS.isWindows=!!process.platform.match(/^win/)}),mount:(function(mount){assert(ENVIRONMENT_IS_NODE);return NODEFS.createNode(null,"/",NODEFS.getMode(mount.opts.root),0)}),createNode:(function(parent,name,mode,dev){if(!FS.isDir(mode)&&!FS.isFile(mode)&&!FS.isLink(mode)){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var node=FS.createNode(parent,name,mode);node.node_ops=NODEFS.node_ops;node.stream_ops=NODEFS.stream_ops;return node}),getMode:(function(path){var stat;try{stat=fs.lstatSync(path);if(NODEFS.isWindows){stat.mode=stat.mode|(stat.mode&146)>>1}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}return stat.mode}),realPath:(function(node){var parts=[];while(node.parent!==node){parts.push(node.name);node=node.parent}parts.push(node.mount.opts.root);parts.reverse();return PATH.join.apply(null,parts)}),flagsToPermissionStringMap:{0:"r",1:"r+",2:"r+",64:"r",65:"r+",66:"r+",129:"rx+",193:"rx+",514:"w+",577:"w",578:"w+",705:"wx",706:"wx+",1024:"a",1025:"a",1026:"a+",1089:"a",1090:"a+",1153:"ax",1154:"ax+",1217:"ax",1218:"ax+",4096:"rs",4098:"rs+"},flagsToPermissionString:(function(flags){flags&=~32768;if(flags in NODEFS.flagsToPermissionStringMap){return NODEFS.flagsToPermissionStringMap[flags]}else{throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}}),node_ops:{getattr:(function(node){var path=NODEFS.realPath(node);var stat;try{stat=fs.lstatSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}if(NODEFS.isWindows&&!stat.blksize){stat.blksize=4096}if(NODEFS.isWindows&&!stat.blocks){stat.blocks=(stat.size+stat.blksize-1)/stat.blksize|0}return{dev:stat.dev,ino:stat.ino,mode:stat.mode,nlink:stat.nlink,uid:stat.uid,gid:stat.gid,rdev:stat.rdev,size:stat.size,atime:stat.atime,mtime:stat.mtime,ctime:stat.ctime,blksize:stat.blksize,blocks:stat.blocks}}),setattr:(function(node,attr){var path=NODEFS.realPath(node);try{if(attr.mode!==undefined){fs.chmodSync(path,attr.mode);node.mode=attr.mode}if(attr.timestamp!==undefined){var date=new Date(attr.timestamp);fs.utimesSync(path,date,date)}if(attr.size!==undefined){fs.truncateSync(path,attr.size)}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),lookup:(function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);var mode=NODEFS.getMode(path);return NODEFS.createNode(parent,name,mode)}),mknod:(function(parent,name,mode,dev){var node=NODEFS.createNode(parent,name,mode,dev);var path=NODEFS.realPath(node);try{if(FS.isDir(node.mode)){fs.mkdirSync(path,node.mode)}else{fs.writeFileSync(path,"",{mode:node.mode})}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}return node}),rename:(function(oldNode,newDir,newName){var oldPath=NODEFS.realPath(oldNode);var newPath=PATH.join2(NODEFS.realPath(newDir),newName);try{fs.renameSync(oldPath,newPath)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),unlink:(function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);try{fs.unlinkSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),rmdir:(function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);try{fs.rmdirSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),readdir:(function(node){var path=NODEFS.realPath(node);try{return fs.readdirSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),symlink:(function(parent,newName,oldPath){var newPath=PATH.join2(NODEFS.realPath(parent),newName);try{fs.symlinkSync(oldPath,newPath)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),readlink:(function(node){var path=NODEFS.realPath(node);try{path=fs.readlinkSync(path);path=NODEJS_PATH.relative(NODEJS_PATH.resolve(node.mount.opts.root),path);return path}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}})},stream_ops:{open:(function(stream){var path=NODEFS.realPath(stream.node);try{if(FS.isFile(stream.node.mode)){stream.nfd=fs.openSync(path,NODEFS.flagsToPermissionString(stream.flags))}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),close:(function(stream){try{if(FS.isFile(stream.node.mode)&&stream.nfd){fs.closeSync(stream.nfd)}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),read:(function(stream,buffer,offset,length,position){if(length===0)return 0;var nbuffer=new Buffer(length);var res;try{res=fs.readSync(stream.nfd,nbuffer,0,length,position)}catch(e){throw new FS.ErrnoError(ERRNO_CODES[e.code])}if(res>0){for(var i=0;i<res;i++){buffer[offset+i]=nbuffer[i]}}return res}),write:(function(stream,buffer,offset,length,position){var nbuffer=new Buffer(buffer.subarray(offset,offset+length));var res;try{res=fs.writeSync(stream.nfd,nbuffer,0,length,position)}catch(e){throw new FS.ErrnoError(ERRNO_CODES[e.code])}return res}),llseek:(function(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){try{var stat=fs.fstatSync(stream.nfd);position+=stat.size}catch(e){throw new FS.ErrnoError(ERRNO_CODES[e.code])}}}if(position<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}return position})}};var WORKERFS={DIR_MODE:16895,FILE_MODE:33279,reader:null,mount:(function(mount){assert(ENVIRONMENT_IS_WORKER);if(!WORKERFS.reader)WORKERFS.reader=new FileReaderSync;var root=WORKERFS.createNode(null,"/",WORKERFS.DIR_MODE,0);var createdParents={};function ensureParent(path){var parts=path.split("/");var parent=root;for(var i=0;i<parts.length-1;i++){var curr=parts.slice(0,i+1).join("/");if(!createdParents[curr]){createdParents[curr]=WORKERFS.createNode(parent,curr,WORKERFS.DIR_MODE,0)}parent=createdParents[curr]}return parent}function base(path){var parts=path.split("/");return parts[parts.length-1]}Array.prototype.forEach.call(mount.opts["files"]||[],(function(file){WORKERFS.createNode(ensureParent(file.name),base(file.name),WORKERFS.FILE_MODE,0,file,file.lastModifiedDate)}));(mount.opts["blobs"]||[]).forEach((function(obj){WORKERFS.createNode(ensureParent(obj["name"]),base(obj["name"]),WORKERFS.FILE_MODE,0,obj["data"])}));(mount.opts["packages"]||[]).forEach((function(pack){pack["metadata"].files.forEach((function(file){var name=file.filename.substr(1);WORKERFS.createNode(ensureParent(name),base(name),WORKERFS.FILE_MODE,0,pack["blob"].slice(file.start,file.end))}))}));return root}),createNode:(function(parent,name,mode,dev,contents,mtime){var node=FS.createNode(parent,name,mode);node.mode=mode;node.node_ops=WORKERFS.node_ops;node.stream_ops=WORKERFS.stream_ops;node.timestamp=(mtime||new Date).getTime();assert(WORKERFS.FILE_MODE!==WORKERFS.DIR_MODE);if(mode===WORKERFS.FILE_MODE){node.size=contents.size;node.contents=contents}else{node.size=4096;node.contents={}}if(parent){parent.contents[name]=node}return node}),node_ops:{getattr:(function(node){return{dev:1,ino:undefined,mode:node.mode,nlink:1,uid:0,gid:0,rdev:undefined,size:node.size,atime:new Date(node.timestamp),mtime:new Date(node.timestamp),ctime:new Date(node.timestamp),blksize:4096,blocks:Math.ceil(node.size/4096)}}),setattr:(function(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}}),lookup:(function(parent,name){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}),mknod:(function(parent,name,mode,dev){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}),rename:(function(oldNode,newDir,newName){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}),unlink:(function(parent,name){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}),rmdir:(function(parent,name){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}),readdir:(function(node){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}),symlink:(function(parent,newName,oldPath){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}),readlink:(function(node){throw new FS.ErrnoError(ERRNO_CODES.EPERM)})},stream_ops:{read:(function(stream,buffer,offset,length,position){if(position>=stream.node.size)return 0;var chunk=stream.node.contents.slice(position,position+length);var ab=WORKERFS.reader.readAsArrayBuffer(chunk);buffer.set(new Uint8Array(ab),offset);return chunk.size}),write:(function(stream,buffer,offset,length,position){throw new FS.ErrnoError(ERRNO_CODES.EIO)}),llseek:(function(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){position+=stream.node.size}}if(position<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}return position})}};var _stdin=allocate(1,"i32*",ALLOC_STATIC);var _stdout=allocate(1,"i32*",ALLOC_STATIC);var _stderr=allocate(1,"i32*",ALLOC_STATIC);var FS={root:null,mounts:[],devices:[null],streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,trackingDelegate:{},tracking:{openFlags:{READ:1,WRITE:2}},ErrnoError:null,genericErrors:{},filesystems:null,handleFSError:(function(e){if(!(e instanceof FS.ErrnoError))throw e+" : "+stackTrace();return ___setErrNo(e.errno)}),lookupPath:(function(path,opts){path=PATH.resolve(FS.cwd(),path);opts=opts||{};if(!path)return{path:"",node:null};var defaults={follow_mount:true,recurse_count:0};for(var key in defaults){if(opts[key]===undefined){opts[key]=defaults[key]}}if(opts.recurse_count>8){throw new FS.ErrnoError(ERRNO_CODES.ELOOP)}var parts=PATH.normalizeArray(path.split("/").filter((function(p){return!!p})),false);var current=FS.root;var current_path="/";for(var i=0;i<parts.length;i++){var islast=i===parts.length-1;if(islast&&opts.parent){break}current=FS.lookupNode(current,parts[i]);current_path=PATH.join2(current_path,parts[i]);if(FS.isMountpoint(current)){if(!islast||islast&&opts.follow_mount){current=current.mounted.root}}if(!islast||opts.follow){var count=0;while(FS.isLink(current.mode)){var link=FS.readlink(current_path);current_path=PATH.resolve(PATH.dirname(current_path),link);var lookup=FS.lookupPath(current_path,{recurse_count:opts.recurse_count});current=lookup.node;if(count++>40){throw new FS.ErrnoError(ERRNO_CODES.ELOOP)}}}}return{path:current_path,node:current}}),getPath:(function(node){var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?mount+"/"+path:mount+path}path=path?node.name+"/"+path:node.name;node=node.parent}}),hashName:(function(parentid,name){var hash=0;for(var i=0;i<name.length;i++){hash=(hash<<5)-hash+name.charCodeAt(i)|0}return(parentid+hash>>>0)%FS.nameTable.length}),hashAddNode:(function(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node}),hashRemoveNode:(function(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}}),lookupNode:(function(parent,name){var err=FS.mayLookup(parent);if(err){throw new FS.ErrnoError(err,parent)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)}),createNode:(function(parent,name,mode,rdev){if(!FS.FSNode){FS.FSNode=(function(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev});FS.FSNode.prototype={};var readMode=292|73;var writeMode=146;Object.defineProperties(FS.FSNode.prototype,{read:{get:(function(){return(this.mode&readMode)===readMode}),set:(function(val){val?this.mode|=readMode:this.mode&=~readMode})},write:{get:(function(){return(this.mode&writeMode)===writeMode}),set:(function(val){val?this.mode|=writeMode:this.mode&=~writeMode})},isFolder:{get:(function(){return FS.isDir(this.mode)})},isDevice:{get:(function(){return FS.isChrdev(this.mode)})}})}var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node}),destroyNode:(function(node){FS.hashRemoveNode(node)}),isRoot:(function(node){return node===node.parent}),isMountpoint:(function(node){return!!node.mounted}),isFile:(function(mode){return(mode&61440)===32768}),isDir:(function(mode){return(mode&61440)===16384}),isLink:(function(mode){return(mode&61440)===40960}),isChrdev:(function(mode){return(mode&61440)===8192}),isBlkdev:(function(mode){return(mode&61440)===24576}),isFIFO:(function(mode){return(mode&61440)===4096}),isSocket:(function(mode){return(mode&49152)===49152}),flagModes:{"r":0,"rs":1052672,"r+":2,"w":577,"wx":705,"xw":705,"w+":578,"wx+":706,"xw+":706,"a":1089,"ax":1217,"xa":1217,"a+":1090,"ax+":1218,"xa+":1218},modeStringToFlags:(function(str){var flags=FS.flagModes[str];if(typeof flags==="undefined"){throw new Error("Unknown file open mode: "+str)}return flags}),flagsToPermissionString:(function(flag){var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms}),nodePermissions:(function(node,perms){if(FS.ignorePermissions){return 0}if(perms.indexOf("r")!==-1&&!(node.mode&292)){return ERRNO_CODES.EACCES}else if(perms.indexOf("w")!==-1&&!(node.mode&146)){return ERRNO_CODES.EACCES}else if(perms.indexOf("x")!==-1&&!(node.mode&73)){return ERRNO_CODES.EACCES}return 0}),mayLookup:(function(dir){var err=FS.nodePermissions(dir,"x");if(err)return err;if(!dir.node_ops.lookup)return ERRNO_CODES.EACCES;return 0}),mayCreate:(function(dir,name){try{var node=FS.lookupNode(dir,name);return ERRNO_CODES.EEXIST}catch(e){}return FS.nodePermissions(dir,"wx")}),mayDelete:(function(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var err=FS.nodePermissions(dir,"wx");if(err){return err}if(isdir){if(!FS.isDir(node.mode)){return ERRNO_CODES.ENOTDIR}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return ERRNO_CODES.EBUSY}}else{if(FS.isDir(node.mode)){return ERRNO_CODES.EISDIR}}return 0}),mayOpen:(function(node,flags){if(!node){return ERRNO_CODES.ENOENT}if(FS.isLink(node.mode)){return ERRNO_CODES.ELOOP}else if(FS.isDir(node.mode)){if((flags&2097155)!==0||flags&512){return ERRNO_CODES.EISDIR}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))}),MAX_OPEN_FDS:4096,nextfd:(function(fd_start,fd_end){fd_start=fd_start||0;fd_end=fd_end||FS.MAX_OPEN_FDS;for(var fd=fd_start;fd<=fd_end;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(ERRNO_CODES.EMFILE)}),getStream:(function(fd){return FS.streams[fd]}),createStream:(function(stream,fd_start,fd_end){if(!FS.FSStream){FS.FSStream=(function(){});FS.FSStream.prototype={};Object.defineProperties(FS.FSStream.prototype,{object:{get:(function(){return this.node}),set:(function(val){this.node=val})},isRead:{get:(function(){return(this.flags&2097155)!==1})},isWrite:{get:(function(){return(this.flags&2097155)!==0})},isAppend:{get:(function(){return this.flags&1024})}})}var newStream=new FS.FSStream;for(var p in stream){newStream[p]=stream[p]}stream=newStream;var fd=FS.nextfd(fd_start,fd_end);stream.fd=fd;FS.streams[fd]=stream;return stream}),closeStream:(function(fd){FS.streams[fd]=null}),chrdev_stream_ops:{open:(function(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;if(stream.stream_ops.open){stream.stream_ops.open(stream)}}),llseek:(function(){throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)})},major:(function(dev){return dev>>8}),minor:(function(dev){return dev&255}),makedev:(function(ma,mi){return ma<<8|mi}),registerDevice:(function(dev,ops){FS.devices[dev]={stream_ops:ops}}),getDevice:(function(dev){return FS.devices[dev]}),getMounts:(function(mount){var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push.apply(check,m.mounts)}return mounts}),syncfs:(function(populate,callback){if(typeof populate==="function"){callback=populate;populate=false}var mounts=FS.getMounts(FS.root.mount);var completed=0;function done(err){if(err){if(!done.errored){done.errored=true;return callback(err)}return}if(++completed>=mounts.length){callback(null)}}mounts.forEach((function(mount){if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)}))}),mount:(function(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot}),unmount:(function(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach((function(hash){var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.indexOf(current.mount)!==-1){FS.destroyNode(current)}current=next}}));node.mounted=null;var idx=node.mount.mounts.indexOf(mount);assert(idx!==-1);node.mount.mounts.splice(idx,1)}),lookup:(function(parent,name){return parent.node_ops.lookup(parent,name)}),mknod:(function(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var err=FS.mayCreate(parent,name);if(err){throw new FS.ErrnoError(err)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}return parent.node_ops.mknod(parent,name,mode,dev)}),create:(function(path,mode){mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)}),mkdir:(function(path,mode){mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)}),mkdev:(function(path,mode,dev){if(typeof dev==="undefined"){dev=mode;mode=438}mode|=8192;return FS.mknod(path,mode,dev)}),symlink:(function(oldpath,newpath){if(!PATH.resolve(oldpath)){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}var lookup=FS.lookupPath(newpath,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}var newname=PATH.basename(newpath);var err=FS.mayCreate(parent,newname);if(err){throw new FS.ErrnoError(err)}if(!parent.node_ops.symlink){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}return parent.node_ops.symlink(parent,newname,oldpath)}),rename:(function(old_path,new_path){var old_dirname=PATH.dirname(old_path);var new_dirname=PATH.dirname(new_path);var old_name=PATH.basename(old_path);var new_name=PATH.basename(new_path);var lookup,old_dir,new_dir;try{lookup=FS.lookupPath(old_path,{parent:true});old_dir=lookup.node;lookup=FS.lookupPath(new_path,{parent:true});new_dir=lookup.node}catch(e){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}if(!old_dir||!new_dir)throw new FS.ErrnoError(ERRNO_CODES.ENOENT);if(old_dir.mount!==new_dir.mount){throw new FS.ErrnoError(ERRNO_CODES.EXDEV)}var old_node=FS.lookupNode(old_dir,old_name);var relative=PATH.relative(old_path,new_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}relative=PATH.relative(new_path,old_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY)}var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(old_node===new_node){return}var isdir=FS.isDir(old_node.mode);var err=FS.mayDelete(old_dir,old_name,isdir);if(err){throw new FS.ErrnoError(err)}err=new_node?FS.mayDelete(new_dir,new_name,isdir):FS.mayCreate(new_dir,new_name);if(err){throw new FS.ErrnoError(err)}if(!old_dir.node_ops.rename){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(FS.isMountpoint(old_node)||new_node&&FS.isMountpoint(new_node)){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}if(new_dir!==old_dir){err=FS.nodePermissions(old_dir,"w");if(err){throw new FS.ErrnoError(err)}}try{if(FS.trackingDelegate["willMovePath"]){FS.trackingDelegate["willMovePath"](old_path,new_path)}}catch(e){console.log("FS.trackingDelegate['willMovePath']('"+old_path+"', '"+new_path+"') threw an exception: "+e.message)}FS.hashRemoveNode(old_node);try{old_dir.node_ops.rename(old_node,new_dir,new_name)}catch(e){throw e}finally{FS.hashAddNode(old_node)}try{if(FS.trackingDelegate["onMovePath"])FS.trackingDelegate["onMovePath"](old_path,new_path)}catch(e){console.log("FS.trackingDelegate['onMovePath']('"+old_path+"', '"+new_path+"') threw an exception: "+e.message)}}),rmdir:(function(path){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var err=FS.mayDelete(parent,name,true);if(err){throw new FS.ErrnoError(err)}if(!parent.node_ops.rmdir){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}try{if(FS.trackingDelegate["willDeletePath"]){FS.trackingDelegate["willDeletePath"](path)}}catch(e){console.log("FS.trackingDelegate['willDeletePath']('"+path+"') threw an exception: "+e.message)}parent.node_ops.rmdir(parent,name);FS.destroyNode(node);try{if(FS.trackingDelegate["onDeletePath"])FS.trackingDelegate["onDeletePath"](path)}catch(e){console.log("FS.trackingDelegate['onDeletePath']('"+path+"') threw an exception: "+e.message)}}),readdir:(function(path){var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;if(!node.node_ops.readdir){throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)}return node.node_ops.readdir(node)}),unlink:(function(path){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var err=FS.mayDelete(parent,name,false);if(err){if(err===ERRNO_CODES.EISDIR)err=ERRNO_CODES.EPERM;throw new FS.ErrnoError(err)}if(!parent.node_ops.unlink){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}try{if(FS.trackingDelegate["willDeletePath"]){FS.trackingDelegate["willDeletePath"](path)}}catch(e){console.log("FS.trackingDelegate['willDeletePath']('"+path+"') threw an exception: "+e.message)}parent.node_ops.unlink(parent,name);FS.destroyNode(node);try{if(FS.trackingDelegate["onDeletePath"])FS.trackingDelegate["onDeletePath"](path)}catch(e){console.log("FS.trackingDelegate['onDeletePath']('"+path+"') threw an exception: "+e.message)}}),readlink:(function(path){var lookup=FS.lookupPath(path);var link=lookup.node;if(!link){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}if(!link.node_ops.readlink){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}return PATH.resolve(FS.getPath(link.parent),link.node_ops.readlink(link))}),stat:(function(path,dontFollow){var lookup=FS.lookupPath(path,{follow:!dontFollow});var node=lookup.node;if(!node){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}if(!node.node_ops.getattr){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}return node.node_ops.getattr(node)}),lstat:(function(path){return FS.stat(path,true)}),chmod:(function(path,mode,dontFollow){var node;if(typeof path==="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}node.node_ops.setattr(node,{mode:mode&4095|node.mode&~4095,timestamp:Date.now()})}),lchmod:(function(path,mode){FS.chmod(path,mode,true)}),fchmod:(function(fd,mode){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}FS.chmod(stream.node,mode)}),chown:(function(path,uid,gid,dontFollow){var node;if(typeof path==="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}node.node_ops.setattr(node,{timestamp:Date.now()})}),lchown:(function(path,uid,gid){FS.chown(path,uid,gid,true)}),fchown:(function(fd,uid,gid){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}FS.chown(stream.node,uid,gid)}),truncate:(function(path,len){if(len<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var node;if(typeof path==="string"){var lookup=FS.lookupPath(path,{follow:true});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(FS.isDir(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.EISDIR)}if(!FS.isFile(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var err=FS.nodePermissions(node,"w");if(err){throw new FS.ErrnoError(err)}node.node_ops.setattr(node,{size:len,timestamp:Date.now()})}),ftruncate:(function(fd,len){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}FS.truncate(stream.node,len)}),utime:(function(path,atime,mtime){var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;node.node_ops.setattr(node,{timestamp:Math.max(atime,mtime)})}),open:(function(path,flags,mode,fd_start,fd_end){if(path===""){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}flags=typeof flags==="string"?FS.modeStringToFlags(flags):flags;mode=typeof mode==="undefined"?438:mode;if(flags&64){mode=mode&4095|32768}else{mode=0}var node;if(typeof path==="object"){node=path}else{path=PATH.normalize(path);try{var lookup=FS.lookupPath(path,{follow:!(flags&131072)});node=lookup.node}catch(e){}}var created=false;if(flags&64){if(node){if(flags&128){throw new FS.ErrnoError(ERRNO_CODES.EEXIST)}}else{node=FS.mknod(path,mode,0);created=true}}if(!node){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}if(FS.isChrdev(node.mode)){flags&=~512}if(flags&65536&&!FS.isDir(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)}if(!created){var err=FS.mayOpen(node,flags);if(err){throw new FS.ErrnoError(err)}}if(flags&512){FS.truncate(node,0)}flags&=~(128|512);var stream=FS.createStream({node:node,path:FS.getPath(node),flags:flags,seekable:true,position:0,stream_ops:node.stream_ops,ungotten:[],error:false},fd_start,fd_end);if(stream.stream_ops.open){stream.stream_ops.open(stream)}if(Module["logReadFiles"]&&!(flags&1)){if(!FS.readFiles)FS.readFiles={};if(!(path in FS.readFiles)){FS.readFiles[path]=1;Module["printErr"]("read file: "+path)}}try{if(FS.trackingDelegate["onOpenFile"]){var trackingFlags=0;if((flags&2097155)!==1){trackingFlags|=FS.tracking.openFlags.READ}if((flags&2097155)!==0){trackingFlags|=FS.tracking.openFlags.WRITE}FS.trackingDelegate["onOpenFile"](path,trackingFlags)}}catch(e){console.log("FS.trackingDelegate['onOpenFile']('"+path+"', flags) threw an exception: "+e.message)}return stream}),close:(function(stream){if(stream.getdents)stream.getdents=null;try{if(stream.stream_ops.close){stream.stream_ops.close(stream)}}catch(e){throw e}finally{FS.closeStream(stream.fd)}}),llseek:(function(stream,offset,whence){if(!stream.seekable||!stream.stream_ops.llseek){throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)}stream.position=stream.stream_ops.llseek(stream,offset,whence);stream.ungotten=[];return stream.position}),read:(function(stream,buffer,offset,length,position){if(length<0||position<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(ERRNO_CODES.EISDIR)}if(!stream.stream_ops.read){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var seeking=true;if(typeof position==="undefined"){position=stream.position;seeking=false}else if(!stream.seekable){throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)}var bytesRead=stream.stream_ops.read(stream,buffer,offset,length,position);if(!seeking)stream.position+=bytesRead;return bytesRead}),write:(function(stream,buffer,offset,length,position,canOwn){if(length<0||position<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(ERRNO_CODES.EISDIR)}if(!stream.stream_ops.write){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}if(stream.flags&1024){FS.llseek(stream,0,2)}var seeking=true;if(typeof position==="undefined"){position=stream.position;seeking=false}else if(!stream.seekable){throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)}var bytesWritten=stream.stream_ops.write(stream,buffer,offset,length,position,canOwn);if(!seeking)stream.position+=bytesWritten;try{if(stream.path&&FS.trackingDelegate["onWriteToFile"])FS.trackingDelegate["onWriteToFile"](stream.path)}catch(e){console.log("FS.trackingDelegate['onWriteToFile']('"+path+"') threw an exception: "+e.message)}return bytesWritten}),allocate:(function(stream,offset,length){if(offset<0||length<=0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}if(!FS.isFile(stream.node.mode)&&!FS.isDir(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.ENODEV)}if(!stream.stream_ops.allocate){throw new FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP)}stream.stream_ops.allocate(stream,offset,length)}),mmap:(function(stream,buffer,offset,length,position,prot,flags){if((stream.flags&2097155)===1){throw new FS.ErrnoError(ERRNO_CODES.EACCES)}if(!stream.stream_ops.mmap){throw new FS.ErrnoError(ERRNO_CODES.ENODEV)}return stream.stream_ops.mmap(stream,buffer,offset,length,position,prot,flags)}),msync:(function(stream,buffer,offset,length,mmapFlags){if(!stream||!stream.stream_ops.msync){return 0}return stream.stream_ops.msync(stream,buffer,offset,length,mmapFlags)}),munmap:(function(stream){return 0}),ioctl:(function(stream,cmd,arg){if(!stream.stream_ops.ioctl){throw new FS.ErrnoError(ERRNO_CODES.ENOTTY)}return stream.stream_ops.ioctl(stream,cmd,arg)}),readFile:(function(path,opts){opts=opts||{};opts.flags=opts.flags||"r";opts.encoding=opts.encoding||"binary";if(opts.encoding!=="utf8"&&opts.encoding!=="binary"){throw new Error('Invalid encoding type "'+opts.encoding+'"')}var ret;var stream=FS.open(path,opts.flags);var stat=FS.stat(path);var length=stat.size;var buf=new Uint8Array(length);FS.read(stream,buf,0,length,0);if(opts.encoding==="utf8"){ret=UTF8ArrayToString(buf,0)}else if(opts.encoding==="binary"){ret=buf}FS.close(stream);return ret}),writeFile:(function(path,data,opts){opts=opts||{};opts.flags=opts.flags||"w";opts.encoding=opts.encoding||"utf8";if(opts.encoding!=="utf8"&&opts.encoding!=="binary"){throw new Error('Invalid encoding type "'+opts.encoding+'"')}var stream=FS.open(path,opts.flags,opts.mode);if(opts.encoding==="utf8"){var buf=new Uint8Array(lengthBytesUTF8(data)+1);var actualNumBytes=stringToUTF8Array(data,buf,0,buf.length);FS.write(stream,buf,0,actualNumBytes,0,opts.canOwn)}else if(opts.encoding==="binary"){FS.write(stream,data,0,data.length,0,opts.canOwn)}FS.close(stream)}),cwd:(function(){return FS.currentPath}),chdir:(function(path){var lookup=FS.lookupPath(path,{follow:true});if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)}var err=FS.nodePermissions(lookup.node,"x");if(err){throw new FS.ErrnoError(err)}FS.currentPath=lookup.path}),createDefaultDirectories:(function(){FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("/home/web_user")}),createDefaultDevices:(function(){FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3),{read:(function(){return 0}),write:(function(stream,buffer,offset,length,pos){return length})});FS.mkdev("/dev/null",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev("/dev/tty",FS.makedev(5,0));FS.mkdev("/dev/tty1",FS.makedev(6,0));var random_device;if(typeof crypto!=="undefined"){var randomBuffer=new Uint8Array(1);random_device=(function(){crypto.getRandomValues(randomBuffer);return randomBuffer[0]})}else if(ENVIRONMENT_IS_NODE){random_device=(function(){return require("crypto").randomBytes(1)[0]})}else{random_device=(function(){return Math.random()*256|0})}FS.createDevice("/dev","random",random_device);FS.createDevice("/dev","urandom",random_device);FS.mkdir("/dev/shm");FS.mkdir("/dev/shm/tmp")}),createSpecialDirectories:(function(){FS.mkdir("/proc");FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd");FS.mount({mount:(function(){var node=FS.createNode("/proc/self","fd",16384|511,73);node.node_ops={lookup:(function(parent,name){var fd=+name;var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(ERRNO_CODES.EBADF);var ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:(function(){return stream.path})}};ret.parent=ret;return ret})};return node})},{},"/proc/self/fd")}),createStandardStreams:(function(){if(Module["stdin"]){FS.createDevice("/dev","stdin",Module["stdin"])}else{FS.symlink("/dev/tty","/dev/stdin")}if(Module["stdout"]){FS.createDevice("/dev","stdout",null,Module["stdout"])}else{FS.symlink("/dev/tty","/dev/stdout")}if(Module["stderr"]){FS.createDevice("/dev","stderr",null,Module["stderr"])}else{FS.symlink("/dev/tty1","/dev/stderr")}var stdin=FS.open("/dev/stdin","r");assert(stdin.fd===0,"invalid handle for stdin ("+stdin.fd+")");var stdout=FS.open("/dev/stdout","w");assert(stdout.fd===1,"invalid handle for stdout ("+stdout.fd+")");var stderr=FS.open("/dev/stderr","w");assert(stderr.fd===2,"invalid handle for stderr ("+stderr.fd+")")}),ensureErrnoError:(function(){if(FS.ErrnoError)return;FS.ErrnoError=function ErrnoError(errno,node){this.node=node;this.setErrno=(function(errno){this.errno=errno;for(var key in ERRNO_CODES){if(ERRNO_CODES[key]===errno){this.code=key;break}}});this.setErrno(errno);this.message=ERRNO_MESSAGES[errno]};FS.ErrnoError.prototype=new Error;FS.ErrnoError.prototype.constructor=FS.ErrnoError;[ERRNO_CODES.ENOENT].forEach((function(code){FS.genericErrors[code]=new FS.ErrnoError(code);FS.genericErrors[code].stack="<generic error, no stack>"}))}),staticInit:(function(){FS.ensureErrnoError();FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={"MEMFS":MEMFS,"IDBFS":IDBFS,"NODEFS":NODEFS,"WORKERFS":WORKERFS}}),init:(function(input,output,error){assert(!FS.init.initialized,"FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)");FS.init.initialized=true;FS.ensureErrnoError();Module["stdin"]=input||Module["stdin"];Module["stdout"]=output||Module["stdout"];Module["stderr"]=error||Module["stderr"];FS.createStandardStreams()}),quit:(function(){FS.init.initialized=false;var fflush=Module["_fflush"];if(fflush)fflush(0);for(var i=0;i<FS.streams.length;i++){var stream=FS.streams[i];if(!stream){continue}FS.close(stream)}}),getMode:(function(canRead,canWrite){var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode}),joinPath:(function(parts,forceRelative){var path=PATH.join.apply(null,parts);if(forceRelative&&path[0]=="/")path=path.substr(1);return path}),absolutePath:(function(relative,base){return PATH.resolve(base,relative)}),standardizePath:(function(path){return PATH.normalize(path)}),findObject:(function(path,dontResolveLastLink){var ret=FS.analyzePath(path,dontResolveLastLink);if(ret.exists){return ret.object}else{___setErrNo(ret.error);return null}}),analyzePath:(function(path,dontResolveLastLink){try{var lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});path=lookup.path}catch(e){}var ret={isRoot:false,exists:false,error:0,name:null,path:null,object:null,parentExists:false,parentPath:null,parentObject:null};try{var lookup=FS.lookupPath(path,{parent:true});ret.parentExists=true;ret.parentPath=lookup.path;ret.parentObject=lookup.node;ret.name=PATH.basename(path);lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});ret.exists=true;ret.path=lookup.path;ret.object=lookup.node;ret.name=lookup.node.name;ret.isRoot=lookup.path==="/"}catch(e){ret.error=e.errno}return ret}),createFolder:(function(parent,name,canRead,canWrite){var path=PATH.join2(typeof parent==="string"?parent:FS.getPath(parent),name);var mode=FS.getMode(canRead,canWrite);return FS.mkdir(path,mode)}),createPath:(function(parent,path,canRead,canWrite){parent=typeof parent==="string"?parent:FS.getPath(parent);var parts=path.split("/").reverse();while(parts.length){var part=parts.pop();if(!part)continue;var current=PATH.join2(parent,part);try{FS.mkdir(current)}catch(e){}parent=current}return current}),createFile:(function(parent,name,properties,canRead,canWrite){var path=PATH.join2(typeof parent==="string"?parent:FS.getPath(parent),name);var mode=FS.getMode(canRead,canWrite);return FS.create(path,mode)}),createDataFile:(function(parent,name,data,canRead,canWrite,canOwn){var path=name?PATH.join2(typeof parent==="string"?parent:FS.getPath(parent),name):parent;var mode=FS.getMode(canRead,canWrite);var node=FS.create(path,mode);if(data){if(typeof data==="string"){var arr=new Array(data.length);for(var i=0,len=data.length;i<len;++i)arr[i]=data.charCodeAt(i);data=arr}FS.chmod(node,mode|146);var stream=FS.open(node,"w");FS.write(stream,data,0,data.length,0,canOwn);FS.close(stream);FS.chmod(node,mode)}return node}),createDevice:(function(parent,name,input,output){var path=PATH.join2(typeof parent==="string"?parent:FS.getPath(parent),name);var mode=FS.getMode(!!input,!!output);if(!FS.createDevice.major)FS.createDevice.major=64;var dev=FS.makedev(FS.createDevice.major++,0);FS.registerDevice(dev,{open:(function(stream){stream.seekable=false}),close:(function(stream){if(output&&output.buffer&&output.buffer.length){output(10)}}),read:(function(stream,buffer,offset,length,pos){var bytesRead=0;for(var i=0;i<length;i++){var result;try{result=input()}catch(e){throw new FS.ErrnoError(ERRNO_CODES.EIO)}if(result===undefined&&bytesRead===0){throw new FS.ErrnoError(ERRNO_CODES.EAGAIN)}if(result===null||result===undefined)break;bytesRead++;buffer[offset+i]=result}if(bytesRead){stream.node.timestamp=Date.now()}return bytesRead}),write:(function(stream,buffer,offset,length,pos){for(var i=0;i<length;i++){try{output(buffer[offset+i])}catch(e){throw new FS.ErrnoError(ERRNO_CODES.EIO)}}if(length){stream.node.timestamp=Date.now()}return i})});return FS.mkdev(path,mode,dev)}),createLink:(function(parent,name,target,canRead,canWrite){var path=PATH.join2(typeof parent==="string"?parent:FS.getPath(parent),name);return FS.symlink(target,path)}),forceLoadFile:(function(obj){if(obj.isDevice||obj.isFolder||obj.link||obj.contents)return true;var success=true;if(typeof XMLHttpRequest!=="undefined"){throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.")}else if(Module["read"]){try{obj.contents=intArrayFromString(Module["read"](obj.url),true);obj.usedBytes=obj.contents.length}catch(e){success=false}}else{throw new Error("Cannot load without read() or XMLHttpRequest.")}if(!success)___setErrNo(ERRNO_CODES.EIO);return success}),createLazyFile:(function(parent,name,url,canRead,canWrite){function LazyUint8Array(){this.lengthKnown=false;this.chunks=[]}LazyUint8Array.prototype.get=function LazyUint8Array_get(idx){if(idx>this.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]};LazyUint8Array.prototype.setDataGetter=function LazyUint8Array_setDataGetter(getter){this.getter=getter};LazyUint8Array.prototype.cacheLength=function LazyUint8Array_cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(function(from,to){if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);if(typeof Uint8Array!="undefined")xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}else{return intArrayFromString(xhr.responseText||"",true)}});var lazyArray=this;lazyArray.setDataGetter((function(chunkNum){var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]==="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]==="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]}));this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true};if(typeof XMLHttpRequest!=="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;Object.defineProperty(lazyArray,"length",{get:(function(){if(!this.lengthKnown){this.cacheLength()}return this._length})});Object.defineProperty(lazyArray,"chunkSize",{get:(function(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize})});var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperty(node,"usedBytes",{get:(function(){return this.contents.length})});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach((function(key){var fn=node.stream_ops[key];stream_ops[key]=function forceLoadLazyFile(){if(!FS.forceLoadFile(node)){throw new FS.ErrnoError(ERRNO_CODES.EIO)}return fn.apply(null,arguments)}}));stream_ops.read=function stream_ops_read(stream,buffer,offset,length,position){if(!FS.forceLoadFile(node)){throw new FS.ErrnoError(ERRNO_CODES.EIO)}var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);assert(size>=0);if(contents.slice){for(var i=0;i<size;i++){buffer[offset+i]=contents[position+i]}}else{for(var i=0;i<size;i++){buffer[offset+i]=contents.get(position+i)}}return size};node.stream_ops=stream_ops;return node}),createPreloadedFile:(function(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish){Browser.init();var fullname=name?PATH.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency("cp "+fullname);function processData(byteArray){function finish(byteArray){if(preFinish)preFinish();if(!dontCreateFile){FS.createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}if(onload)onload();removeRunDependency(dep)}var handled=false;Module["preloadPlugins"].forEach((function(plugin){if(handled)return;if(plugin["canHandle"](fullname)){plugin["handle"](byteArray,fullname,finish,(function(){if(onerror)onerror();removeRunDependency(dep)}));handled=true}}));if(!handled)finish(byteArray)}addRunDependency(dep);if(typeof url=="string"){Browser.asyncLoad(url,(function(byteArray){processData(byteArray)}),onerror)}else{processData(url)}}),indexedDB:(function(){return window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB}),DB_NAME:(function(){return"EM_FS_"+window.location.pathname}),DB_VERSION:20,DB_STORE_NAME:"FILE_DATA",saveFilesToDB:(function(paths,onload,onerror){onload=onload||(function(){});onerror=onerror||(function(){});var indexedDB=FS.indexedDB();try{var openRequest=indexedDB.open(FS.DB_NAME(),FS.DB_VERSION)}catch(e){return onerror(e)}openRequest.onupgradeneeded=function openRequest_onupgradeneeded(){console.log("creating db");var db=openRequest.result;db.createObjectStore(FS.DB_STORE_NAME)};openRequest.onsuccess=function openRequest_onsuccess(){var db=openRequest.result;var transaction=db.transaction([FS.DB_STORE_NAME],"readwrite");var files=transaction.objectStore(FS.DB_STORE_NAME);var ok=0,fail=0,total=paths.length;function finish(){if(fail==0)onload();else onerror()}paths.forEach((function(path){var putRequest=files.put(FS.analyzePath(path).object.contents,path);putRequest.onsuccess=function putRequest_onsuccess(){ok++;if(ok+fail==total)finish()};putRequest.onerror=function putRequest_onerror(){fail++;if(ok+fail==total)finish()}}));transaction.onerror=onerror};openRequest.onerror=onerror}),loadFilesFromDB:(function(paths,onload,onerror){onload=onload||(function(){});onerror=onerror||(function(){});var indexedDB=FS.indexedDB();try{var openRequest=indexedDB.open(FS.DB_NAME(),FS.DB_VERSION)}catch(e){return onerror(e)}openRequest.onupgradeneeded=onerror;openRequest.onsuccess=function openRequest_onsuccess(){var db=openRequest.result;try{var transaction=db.transaction([FS.DB_STORE_NAME],"readonly")}catch(e){onerror(e);return}var files=transaction.objectStore(FS.DB_STORE_NAME);var ok=0,fail=0,total=paths.length;function finish(){if(fail==0)onload();else onerror()}paths.forEach((function(path){var getRequest=files.get(path);getRequest.onsuccess=function getRequest_onsuccess(){if(FS.analyzePath(path).exists){FS.unlink(path)}FS.createDataFile(PATH.dirname(path),PATH.basename(path),getRequest.result,true,true,true);ok++;if(ok+fail==total)finish()};getRequest.onerror=function getRequest_onerror(){fail++;if(ok+fail==total)finish()}}));transaction.onerror=onerror};openRequest.onerror=onerror})};var SYSCALLS={DEFAULT_POLLMASK:5,mappings:{},umask:511,calculateAt:(function(dirfd,path){if(path[0]!=="/"){var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=FS.getStream(dirfd);if(!dirstream)throw new FS.ErrnoError(ERRNO_CODES.EBADF);dir=dirstream.path}path=PATH.join2(dir,path)}return path}),doStat:(function(func,path,buf){try{var stat=func(path)}catch(e){if(e&&e.node&&PATH.normalize(path)!==PATH.normalize(FS.getPath(e.node))){return-ERRNO_CODES.ENOTDIR}throw e}HEAP32[buf>>2]=stat.dev;HEAP32[buf+4>>2]=0;HEAP32[buf+8>>2]=stat.ino;HEAP32[buf+12>>2]=stat.mode;HEAP32[buf+16>>2]=stat.nlink;HEAP32[buf+20>>2]=stat.uid;HEAP32[buf+24>>2]=stat.gid;HEAP32[buf+28>>2]=stat.rdev;HEAP32[buf+32>>2]=0;HEAP32[buf+36>>2]=stat.size;HEAP32[buf+40>>2]=4096;HEAP32[buf+44>>2]=stat.blocks;HEAP32[buf+48>>2]=stat.atime.getTime()/1e3|0;HEAP32[buf+52>>2]=0;HEAP32[buf+56>>2]=stat.mtime.getTime()/1e3|0;HEAP32[buf+60>>2]=0;HEAP32[buf+64>>2]=stat.ctime.getTime()/1e3|0;HEAP32[buf+68>>2]=0;HEAP32[buf+72>>2]=stat.ino;return 0}),doMsync:(function(addr,stream,len,flags){var buffer=new Uint8Array(HEAPU8.subarray(addr,addr+len));FS.msync(stream,buffer,0,len,flags)}),doMkdir:(function(path,mode){path=PATH.normalize(path);if(path[path.length-1]==="/")path=path.substr(0,path.length-1);FS.mkdir(path,mode,0);return 0}),doMknod:(function(path,mode,dev){switch(mode&61440){case 32768:case 8192:case 24576:case 4096:case 49152:break;default:return-ERRNO_CODES.EINVAL}FS.mknod(path,mode,dev);return 0}),doReadlink:(function(path,buf,bufsize){if(bufsize<=0)return-ERRNO_CODES.EINVAL;var ret=FS.readlink(path);ret=ret.slice(0,Math.max(0,bufsize));writeStringToMemory(ret,buf,true);return ret.length}),doAccess:(function(path,amode){if(amode&~7){return-ERRNO_CODES.EINVAL}var node;var lookup=FS.lookupPath(path,{follow:true});node=lookup.node;var perms="";if(amode&4)perms+="r";if(amode&2)perms+="w";if(amode&1)perms+="x";if(perms&&FS.nodePermissions(node,perms)){return-ERRNO_CODES.EACCES}return 0}),doDup:(function(path,flags,suggestFD){var suggest=FS.getStream(suggestFD);if(suggest)FS.close(suggest);return FS.open(path,flags,0,suggestFD,suggestFD).fd}),doReadv:(function(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i<iovcnt;i++){var ptr=HEAP32[iov+i*8>>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr<len)break}return ret}),doWritev:(function(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i<iovcnt;i++){var ptr=HEAP32[iov+i*8>>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr}return ret}),varargs:0,get:(function(varargs){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret}),getStr:(function(){var ret=Pointer_stringify(SYSCALLS.get());return ret}),getStreamFromFD:(function(){var stream=FS.getStream(SYSCALLS.get());if(!stream)throw new FS.ErrnoError(ERRNO_CODES.EBADF);return stream}),getSocketFromFD:(function(){var socket=SOCKFS.getSocket(SYSCALLS.get());if(!socket)throw new FS.ErrnoError(ERRNO_CODES.EBADF);return socket}),getSocketAddress:(function(allowNull){var addrp=SYSCALLS.get(),addrlen=SYSCALLS.get();if(allowNull&&addrp===0)return null;var info=__read_sockaddr(addrp,addrlen);if(info.errno)throw new FS.ErrnoError(info.errno);info.addr=DNS.lookup_addr(info.addr)||info.addr;return info}),get64:(function(){var low=SYSCALLS.get(),high=SYSCALLS.get();if(low>=0)assert(high===0);else assert(high===-1);return low}),getZero:(function(){assert(SYSCALLS.get()===0)})};function ___syscall5(which,varargs){SYSCALLS.varargs=varargs;try{var pathname=SYSCALLS.getStr(),flags=SYSCALLS.get(),mode=SYSCALLS.get();var stream=FS.open(pathname,flags,mode);return stream.fd}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return dest}Module["_memcpy"]=_memcpy;function ___syscall6(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD();FS.close(stream);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}var _cos=Math_cos;function _sbrk(bytes){var self=_sbrk;if(!self.called){DYNAMICTOP=alignMemoryPage(DYNAMICTOP);self.called=true;assert(Runtime.dynamicAlloc);self.alloc=Runtime.dynamicAlloc;Runtime.dynamicAlloc=(function(){abort("cannot dynamically allocate, sbrk now has control")})}var ret=DYNAMICTOP;if(bytes!=0){var success=self.alloc(bytes);if(!success)return-1>>>0}return ret}var _BItoD=true;function ___syscall54(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),op=SYSCALLS.get();switch(op){case 21505:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return 0};case 21506:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return 0};case 21519:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;var argp=SYSCALLS.get();HEAP32[argp>>2]=0;return 0};case 21520:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return-ERRNO_CODES.EINVAL};case 21531:{var argp=SYSCALLS.get();return FS.ioctl(stream,op,argp)};default:abort("bad ioctl syscall "+op)}}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}var _ceilf=Math_ceil;function __embind_register_memory_view(rawType,dataTypeIndex,name){var typeMapping=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array];var TA=typeMapping[dataTypeIndex];function decodeMemoryView(handle){handle=handle>>2;var heap=HEAPU32;var size=heap[handle];var data=heap[handle+1];return new TA(heap["buffer"],data,size)}name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":decodeMemoryView,"argPackAdvance":8,"readValueFromPointer":decodeMemoryView},{ignoreDuplicateRegistrations:true})}function _time(ptr){var ret=Date.now()/1e3|0;if(ptr){HEAP32[ptr>>2]=ret}return ret}function _pthread_self(){return 0}function ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();var offset=offset_low;assert(offset_high===0);FS.llseek(stream,offset,whence);HEAP32[result>>2]=stream.position;if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall146(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();return SYSCALLS.doWritev(stream,iov,iovcnt)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall221(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),cmd=SYSCALLS.get();switch(cmd){case 0:{var arg=SYSCALLS.get();if(arg<0){return-ERRNO_CODES.EINVAL}var newStream;newStream=FS.open(stream.path,stream.flags,0,arg);return newStream.fd};case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=SYSCALLS.get();stream.flags|=arg;return 0};case 12:case 12:{var arg=SYSCALLS.get();var offset=0;HEAP16[arg+offset>>1]=2;return 0};case 13:case 14:case 13:case 14:return 0;case 16:case 8:return-ERRNO_CODES.EINVAL;case 9:___setErrNo(ERRNO_CODES.EINVAL);return-1;default:{return-ERRNO_CODES.EINVAL}}}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall145(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();return SYSCALLS.doReadv(stream,iov,iovcnt)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}var ___dso_handle=allocate(1,"i32*",ALLOC_STATIC);embind_init_charCodes();BindingError=Module["BindingError"]=extendError(Error,"BindingError");InternalError=Module["InternalError"]=extendError(Error,"InternalError");init_emval();UnboundTypeError=Module["UnboundTypeError"]=extendError(Error,"UnboundTypeError");FS.staticInit();__ATINIT__.unshift((function(){if(!Module["noFSInit"]&&!FS.init.initialized)FS.init()}));__ATMAIN__.push((function(){FS.ignorePermissions=false}));__ATEXIT__.push((function(){FS.quit()}));Module["FS_createFolder"]=FS.createFolder;Module["FS_createPath"]=FS.createPath;Module["FS_createDataFile"]=FS.createDataFile;Module["FS_createPreloadedFile"]=FS.createPreloadedFile;Module["FS_createLazyFile"]=FS.createLazyFile;Module["FS_createLink"]=FS.createLink;Module["FS_createDevice"]=FS.createDevice;Module["FS_unlink"]=FS.unlink;__ATINIT__.unshift((function(){TTY.init()}));__ATEXIT__.push((function(){TTY.shutdown()}));if(ENVIRONMENT_IS_NODE){var fs=require("fs");var NODEJS_PATH=require("path");NODEFS.staticInit()}STACK_BASE=STACKTOP=Runtime.alignMemory(STATICTOP);staticSealed=true;STACK_MAX=STACK_BASE+TOTAL_STACK;DYNAMIC_BASE=DYNAMICTOP=Runtime.alignMemory(STACK_MAX);assert(DYNAMIC_BASE<TOTAL_MEMORY,"TOTAL_MEMORY not big enough for stack");var cttz_i8=allocate([8,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0],"i8",ALLOC_DYNAMIC);function invoke_iiii(index,a1,a2,a3){try{return Module["dynCall_iiii"](index,a1,a2,a3)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;asm["setThrew"](1,0)}}function invoke_viiiii(index,a1,a2,a3,a4,a5){try{Module["dynCall_viiiii"](index,a1,a2,a3,a4,a5)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;asm["setThrew"](1,0)}}function invoke_dii(index,a1,a2){try{return Module["dynCall_dii"](index,a1,a2)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;asm["setThrew"](1,0)}}function invoke_vid(index,a1,a2){try{Module["dynCall_vid"](index,a1,a2)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;asm["setThrew"](1,0)}}function invoke_di(index,a1){try{return Module["dynCall_di"](index,a1)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;asm["setThrew"](1,0)}}function invoke_i(index){try{return Module["dynCall_i"](index)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;asm["setThrew"](1,0)}}function invoke_vi(index,a1){try{Module["dynCall_vi"](index,a1)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;asm["setThrew"](1,0)}}function invoke_vii(index,a1,a2){try{Module["dynCall_vii"](index,a1,a2)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;asm["setThrew"](1,0)}}function invoke_ii(index,a1){try{return Module["dynCall_ii"](index,a1)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;asm["setThrew"](1,0)}}function invoke_viii(index,a1,a2,a3){try{Module["dynCall_viii"](index,a1,a2,a3)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;asm["setThrew"](1,0)}}function invoke_v(index){try{Module["dynCall_v"](index)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;asm["setThrew"](1,0)}}function invoke_viid(index,a1,a2,a3){try{Module["dynCall_viid"](index,a1,a2,a3)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;asm["setThrew"](1,0)}}function invoke_iiiii(index,a1,a2,a3,a4){try{return Module["dynCall_iiiii"](index,a1,a2,a3,a4)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;asm["setThrew"](1,0)}}function invoke_viiiiii(index,a1,a2,a3,a4,a5,a6){try{Module["dynCall_viiiiii"](index,a1,a2,a3,a4,a5,a6)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;asm["setThrew"](1,0)}}function invoke_iii(index,a1,a2){try{return Module["dynCall_iii"](index,a1,a2)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;asm["setThrew"](1,0)}}function invoke_viiii(index,a1,a2,a3,a4){try{Module["dynCall_viiii"](index,a1,a2,a3,a4)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;asm["setThrew"](1,0)}}Module.asmGlobalArg={"Math":Math,"Int8Array":Int8Array,"Int16Array":Int16Array,"Int32Array":Int32Array,"Uint8Array":Uint8Array,"Uint16Array":Uint16Array,"Uint32Array":Uint32Array,"Float32Array":Float32Array,"Float64Array":Float64Array,"NaN":NaN,"Infinity":Infinity};Module.asmLibraryArg={"abort":abort,"assert":assert,"invoke_iiii":invoke_iiii,"invoke_viiiii":invoke_viiiii,"invoke_dii":invoke_dii,"invoke_vid":invoke_vid,"invoke_di":invoke_di,"invoke_i":invoke_i,"invoke_vi":invoke_vi,"invoke_vii":invoke_vii,"invoke_ii":invoke_ii,"invoke_viii":invoke_viii,"invoke_v":invoke_v,"invoke_viid":invoke_viid,"invoke_iiiii":invoke_iiiii,"invoke_viiiiii":invoke_viiiiii,"invoke_iii":invoke_iii,"invoke_viiii":invoke_viiii,"_fabs":_fabs,"___syscall221":___syscall221,"_sin":_sin,"floatReadValueFromPointer":floatReadValueFromPointer,"simpleReadValueFromPointer":simpleReadValueFromPointer,"integerReadValueFromPointer":integerReadValueFromPointer,"__embind_register_memory_view":__embind_register_memory_view,"throwInternalError":throwInternalError,"get_first_emval":get_first_emval,"_abort":_abort,"count_emval_handles":count_emval_handles,"_pthread_cleanup_push":_pthread_cleanup_push,"__embind_register_integer":__embind_register_integer,"extendError":extendError,"___assert_fail":___assert_fail,"init_emval":init_emval,"__embind_register_void":__embind_register_void,"___cxa_find_matching_catch":___cxa_find_matching_catch,"_ceilf":_ceilf,"getShiftFromSize":getShiftFromSize,"__embind_register_function":__embind_register_function,"embind_init_charCodes":embind_init_charCodes,"_emscripten_asm_const_33":_emscripten_asm_const_33,"throwBindingError":throwBindingError,"___setErrNo":___setErrNo,"__emval_register":__emval_register,"_sbrk":_sbrk,"readLatin1String":readLatin1String,"___cxa_allocate_exception":___cxa_allocate_exception,"_emscripten_memcpy_big":_emscripten_memcpy_big,"__embind_register_bool":__embind_register_bool,"___resumeException":___resumeException,"__ZSt18uncaught_exceptionv":__ZSt18uncaught_exceptionv,"_sysconf":_sysconf,"_embind_repr":_embind_repr,"__embind_register_std_wstring":__embind_register_std_wstring,"createNamedFunction":createNamedFunction,"__embind_register_emval":__embind_register_emval,"_cos":_cos,"throwUnboundTypeError":throwUnboundTypeError,"_pthread_self":_pthread_self,"craftInvokerFunction":craftInvokerFunction,"__emval_decref":__emval_decref,"_sqrt":_sqrt,"__embind_register_float":__embind_register_float,"makeLegalFunctionName":makeLegalFunctionName,"___syscall54":___syscall54,"___unlock":___unlock,"heap32VectorToArray":heap32VectorToArray,"_pthread_cleanup_pop":_pthread_cleanup_pop,"whenDependentTypesAreResolved":whenDependentTypesAreResolved,"_exit":_exit,"__embind_register_std_string":__embind_register_std_string,"new_":new_,"___cxa_atexit":___cxa_atexit,"registerType":registerType,"___cxa_throw":___cxa_throw,"__exit":__exit,"___lock":___lock,"___syscall6":___syscall6,"___syscall5":___syscall5,"ensureOverloadTable":ensureOverloadTable,"__embind_register_constant":__embind_register_constant,"_time":_time,"requireFunction":requireFunction,"runDestructors":runDestructors,"getTypeName":getTypeName,"_atexit":_atexit,"___syscall140":___syscall140,"exposePublicSymbol":exposePublicSymbol,"_emscripten_asm_const_5":_emscripten_asm_const_5,"_emscripten_asm_const_4":_emscripten_asm_const_4,"replacePublicSymbol":replacePublicSymbol,"___syscall145":___syscall145,"___syscall146":___syscall146,"STACKTOP":STACKTOP,"STACK_MAX":STACK_MAX,"tempDoublePtr":tempDoublePtr,"ABORT":ABORT,"cttz_i8":cttz_i8,"___dso_handle":___dso_handle};// EMSCRIPTEN_START_ASM +var asm=(function(global,env,buffer) { +"use asm";var a=new global.Int8Array(buffer);var b=new global.Int16Array(buffer);var c=new global.Int32Array(buffer);var d=new global.Uint8Array(buffer);var e=new global.Uint16Array(buffer);var f=new global.Uint32Array(buffer);var g=new global.Float32Array(buffer);var h=new global.Float64Array(buffer);var i=env.STACKTOP|0;var j=env.STACK_MAX|0;var k=env.tempDoublePtr|0;var l=env.ABORT|0;var m=env.cttz_i8|0;var n=env.___dso_handle|0;var o=0;var p=0;var q=0;var r=0;var s=global.NaN,t=global.Infinity;var u=0,v=0,w=0,x=0,y=0.0,z=0,A=0,B=0,C=0.0;var D=0;var E=0;var F=0;var G=0;var H=0;var I=0;var J=0;var K=0;var L=0;var M=0;var N=global.Math.floor;var O=global.Math.abs;var P=global.Math.sqrt;var Q=global.Math.pow;var R=global.Math.cos;var S=global.Math.sin;var T=global.Math.tan;var U=global.Math.acos;var V=global.Math.asin;var W=global.Math.atan;var X=global.Math.atan2;var Y=global.Math.exp;var Z=global.Math.log;var _=global.Math.ceil;var $=global.Math.imul;var aa=global.Math.min;var ba=global.Math.clz32;var ca=env.abort;var da=env.assert;var ea=env.invoke_iiii;var fa=env.invoke_viiiii;var ga=env.invoke_dii;var ha=env.invoke_vid;var ia=env.invoke_di;var ja=env.invoke_i;var ka=env.invoke_vi;var la=env.invoke_vii;var ma=env.invoke_ii;var na=env.invoke_viii;var oa=env.invoke_v;var pa=env.invoke_viid;var qa=env.invoke_iiiii;var ra=env.invoke_viiiiii;var sa=env.invoke_iii;var ta=env.invoke_viiii;var ua=env._fabs;var va=env.___syscall221;var wa=env._sin;var xa=env.floatReadValueFromPointer;var ya=env.simpleReadValueFromPointer;var za=env.integerReadValueFromPointer;var Aa=env.__embind_register_memory_view;var Ba=env.throwInternalError;var Ca=env.get_first_emval;var Da=env._abort;var Ea=env.count_emval_handles;var Fa=env._pthread_cleanup_push;var Ga=env.__embind_register_integer;var Ha=env.extendError;var Ia=env.___assert_fail;var Ja=env.init_emval;var Ka=env.__embind_register_void;var La=env.___cxa_find_matching_catch;var Ma=env._ceilf;var Na=env.getShiftFromSize;var Oa=env.__embind_register_function;var Pa=env.embind_init_charCodes;var Qa=env._emscripten_asm_const_33;var Ra=env.throwBindingError;var Sa=env.___setErrNo;var Ta=env.__emval_register;var Ua=env._sbrk;var Va=env.readLatin1String;var Wa=env.___cxa_allocate_exception;var Xa=env._emscripten_memcpy_big;var Ya=env.__embind_register_bool;var Za=env.___resumeException;var _a=env.__ZSt18uncaught_exceptionv;var $a=env._sysconf;var ab=env._embind_repr;var bb=env.__embind_register_std_wstring;var cb=env.createNamedFunction;var db=env.__embind_register_emval;var eb=env._cos;var fb=env.throwUnboundTypeError;var gb=env._pthread_self;var hb=env.craftInvokerFunction;var ib=env.__emval_decref;var jb=env._sqrt;var kb=env.__embind_register_float;var lb=env.makeLegalFunctionName;var mb=env.___syscall54;var nb=env.___unlock;var ob=env.heap32VectorToArray;var pb=env._pthread_cleanup_pop;var qb=env.whenDependentTypesAreResolved;var rb=env._exit;var sb=env.__embind_register_std_string;var tb=env.new_;var ub=env.___cxa_atexit;var vb=env.registerType;var wb=env.___cxa_throw;var xb=env.__exit;var yb=env.___lock;var zb=env.___syscall6;var Ab=env.___syscall5;var Bb=env.ensureOverloadTable;var Cb=env.__embind_register_constant;var Db=env._time;var Eb=env.requireFunction;var Fb=env.runDestructors;var Gb=env.getTypeName;var Hb=env._atexit;var Ib=env.___syscall140;var Jb=env.exposePublicSymbol;var Kb=env._emscripten_asm_const_5;var Lb=env._emscripten_asm_const_4;var Mb=env.replacePublicSymbol;var Nb=env.___syscall145;var Ob=env.___syscall146;var Pb=0.0; +// EMSCRIPTEN_START_FUNCS +function dd(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;F=i;i=i+16|0;B=F;D=(f|0)/2|0;E=(g|0)/2|0;o=c[k>>2]|0;A=E+-1|0;if((f|0)>1){l=0;m=o;n=o+(($(A,D)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(D|0))break;else{m=m+2|0;n=n+2|0}}}z=D+-1|0;if((g|0)>1){l=0;m=o;n=o+(z<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(E|0))break;else{m=m+(D<<1)|0;n=n+(D<<1)|0}}}n=k+1179664|0;m=D+1|0;w=0-D|0;u=1-D|0;v=~D;t=f+4|0;a:do if((A|0)>1){x=(z|0)>1;l=(c[k+4>>2]|0)+m|0;y=1;g=e+((f<<1)+2)|0;e=o+(m<<1)|0;m=0;b:while(1){if(x){s=1;r=g;q=m;while(1){do if((d[r>>0]|0|0)>(j|0)){b[e>>1]=0;a[l>>0]=0;m=q}else{a[l>>0]=-1;m=b[e+(w<<1)>>1]|0;if(m<<16>>16>0){b[e>>1]=m;m=(m<<16>>16)*7|0;p=k+1310736+(m+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=k+1310736+(m+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=k+1310736+(m+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+y;c[k+1310736+(m+-1<<2)>>2]=y;m=q;break}f=b[e+(u<<1)>>1]|0;o=f<<16>>16;m=b[e+(v<<1)>>1]|0;p=m<<16>>16;g=m<<16>>16>0;if(f<<16>>16<=0){if(g){b[e>>1]=m;m=p*7|0;g=k+1310736+(m+-7<<2)|0;c[g>>2]=(c[g>>2]|0)+1;g=k+1310736+(m+-6<<2)|0;c[g>>2]=(c[g>>2]|0)+s;g=k+1310736+(m+-5<<2)|0;c[g>>2]=(c[g>>2]|0)+y;g=k+1310736+(m+-3<<2)|0;if((c[g>>2]|0)<(s|0))c[g>>2]=s;c[k+1310736+(m+-1<<2)>>2]=y;m=q;break}m=b[e+-2>>1]|0;if(m<<16>>16>0){b[e>>1]=m;m=(m<<16>>16)*7|0;p=k+1310736+(m+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=k+1310736+(m+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=k+1310736+(m+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+y;m=k+1310736+(m+-3<<2)|0;if((c[m>>2]|0)>=(s|0)){m=q;break}c[m>>2]=s;m=q;break}else{m=q+1|0;if((q|0)>32767)break b;b[e>>1]=m;c[k+1179664+(q<<2)>>2]=m<<16>>16;q=q*7|0;c[k+1310736+(q<<2)>>2]=1;c[k+1310736+(q+1<<2)>>2]=s;c[k+1310736+(q+2<<2)>>2]=y;c[k+1310736+(q+3<<2)>>2]=s;c[k+1310736+(q+4<<2)>>2]=s;c[k+1310736+(q+5<<2)>>2]=y;c[k+1310736+(q+6<<2)>>2]=y;break}}if(g){m=c[k+1179664+(o+-1<<2)>>2]|0;o=c[k+1179664+(p+-1<<2)>>2]|0;if((m|0)>(o|0)){b[e>>1]=o;if((q|0)>0){g=0;f=n;while(1){if((c[f>>2]|0)==(m|0))c[f>>2]=o;g=g+1|0;if((g|0)>=(q|0)){m=o;break}else f=f+4|0}}else m=o}else{b[e>>1]=m;if((m|0)<(o|0)&(q|0)>0){g=0;f=n;while(1){if((c[f>>2]|0)==(o|0))c[f>>2]=m;g=g+1|0;if((g|0)>=(q|0))break;else f=f+4|0}}}m=(m<<16>>16)*7|0;p=k+1310736+(m+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=k+1310736+(m+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=k+1310736+(m+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+y;c[k+1310736+(m+-1<<2)>>2]=y;m=q;break}g=b[e+-2>>1]|0;if(g<<16>>16<=0){b[e>>1]=f;m=o*7|0;g=k+1310736+(m+-7<<2)|0;c[g>>2]=(c[g>>2]|0)+1;g=k+1310736+(m+-6<<2)|0;c[g>>2]=(c[g>>2]|0)+s;g=k+1310736+(m+-5<<2)|0;c[g>>2]=(c[g>>2]|0)+y;g=k+1310736+(m+-4<<2)|0;if((c[g>>2]|0)>(s|0))c[g>>2]=s;c[k+1310736+(m+-1<<2)>>2]=y;m=q;break}m=c[k+1179664+(o+-1<<2)>>2]|0;o=c[k+1179664+((g<<16>>16)+-1<<2)>>2]|0;if((m|0)>(o|0)){b[e>>1]=o;if((q|0)>0){g=0;f=n;while(1){if((c[f>>2]|0)==(m|0))c[f>>2]=o;g=g+1|0;if((g|0)>=(q|0)){m=o;break}else f=f+4|0}}else m=o}else{b[e>>1]=m;if((m|0)<(o|0)&(q|0)>0){g=0;f=n;while(1){if((c[f>>2]|0)==(o|0))c[f>>2]=m;g=g+1|0;if((g|0)>=(q|0))break;else f=f+4|0}}}m=(m<<16>>16)*7|0;p=k+1310736+(m+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=k+1310736+(m+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;m=k+1310736+(m+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+y;m=q}while(0);s=s+1|0;g=r+2|0;e=e+2|0;l=l+1|0;if((s|0)>=(z|0))break;else{r=g;q=m}}}y=y+1|0;if((y|0)>=(A|0)){o=m;C=52;break a}else{l=l+2|0;g=g+t|0;e=e+4|0}}Me(3,3904,B);l=-1}else{o=0;C=52}while(0);if((C|0)==52){e=k+12|0;if((o|0)<1)m=1;else{g=1;m=1;while(1){l=c[n>>2]|0;if((l|0)==(g|0)){l=m;m=m+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[n>>2]=l;if((g|0)<(o|0)){g=g+1|0;n=n+4|0}else break}}f=k+8|0;l=m+-1|0;c[f>>2]=l;if(l){ek(e|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((m|0)>1){l=0;do{C=l<<2;c[k+131084+(C<<2)>>2]=D;c[k+131084+((C|1)<<2)>>2]=0;c[k+131084+((C|2)<<2)>>2]=E;c[k+131084+((C|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[f>>2]|0))}if((o|0)>0){e=0;do{n=(c[k+1179664+(e<<2)>>2]|0)+-1|0;g=e*7|0;l=k+12+(n<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(g<<2)>>2]|0);l=n<<1;m=k+655376+(l<<3)|0;h[m>>3]=+h[m>>3]+ +(c[k+1310736+(g+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(g+2<<2)>>2]|0);n=n<<2;l=k+131084+(n<<2)|0;m=c[k+1310736+(g+3<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;l=k+131084+((n|1)<<2)|0;m=c[k+1310736+(g+4<<2)>>2]|0;if((c[l>>2]|0)<(m|0))c[l>>2]=m;l=k+131084+((n|2)<<2)|0;m=c[k+1310736+(g+5<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;m=k+131084+((n|3)<<2)|0;l=c[k+1310736+(g+6<<2)>>2]|0;if((c[m>>2]|0)<(l|0))c[m>>2]=l;e=e+1|0}while((e|0)<(o|0))}if((c[f>>2]|0)>0){l=0;do{D=k+12+(l<<2)|0;E=l<<1;C=k+655376+(E<<3)|0;h[C>>3]=+h[C>>3]/+(c[D>>2]|0);E=k+655376+((E|1)<<3)|0;h[E>>3]=+h[E>>3]/+(c[D>>2]|0);l=l+1|0}while((l|0)<(c[f>>2]|0));l=0}else l=0}else l=0}i=F;return l|0}function ed(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;F=i;i=i+16|0;B=F;D=(f|0)/2|0;E=(g|0)/2|0;o=c[k>>2]|0;A=E+-1|0;if((f|0)>1){l=0;m=o;n=o+(($(A,D)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(D|0))break;else{m=m+2|0;n=n+2|0}}}z=D+-1|0;if((g|0)>1){l=0;m=o;n=o+(z<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(E|0))break;else{m=m+(D<<1)|0;n=n+(D<<1)|0}}}n=k+1179664|0;m=D+1|0;w=0-D|0;u=1-D|0;v=~D;t=(f<<1)+8|0;a:do if((A|0)>1){x=(z|0)>1;l=(c[k+4>>2]|0)+m|0;y=1;g=e+((f<<2)+4)|0;e=o+(m<<1)|0;m=0;b:while(1){if(x){s=1;r=g;q=m;while(1){do if((d[r+1>>0]|0|0)>(j|0)){b[e>>1]=0;a[l>>0]=0;m=q}else{a[l>>0]=-1;m=b[e+(w<<1)>>1]|0;if(m<<16>>16>0){b[e>>1]=m;m=(m<<16>>16)*7|0;p=k+1310736+(m+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=k+1310736+(m+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=k+1310736+(m+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+y;c[k+1310736+(m+-1<<2)>>2]=y;m=q;break}f=b[e+(u<<1)>>1]|0;o=f<<16>>16;m=b[e+(v<<1)>>1]|0;p=m<<16>>16;g=m<<16>>16>0;if(f<<16>>16<=0){if(g){b[e>>1]=m;m=p*7|0;g=k+1310736+(m+-7<<2)|0;c[g>>2]=(c[g>>2]|0)+1;g=k+1310736+(m+-6<<2)|0;c[g>>2]=(c[g>>2]|0)+s;g=k+1310736+(m+-5<<2)|0;c[g>>2]=(c[g>>2]|0)+y;g=k+1310736+(m+-3<<2)|0;if((c[g>>2]|0)<(s|0))c[g>>2]=s;c[k+1310736+(m+-1<<2)>>2]=y;m=q;break}m=b[e+-2>>1]|0;if(m<<16>>16>0){b[e>>1]=m;m=(m<<16>>16)*7|0;p=k+1310736+(m+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=k+1310736+(m+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=k+1310736+(m+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+y;m=k+1310736+(m+-3<<2)|0;if((c[m>>2]|0)>=(s|0)){m=q;break}c[m>>2]=s;m=q;break}else{m=q+1|0;if((q|0)>32767)break b;b[e>>1]=m;c[k+1179664+(q<<2)>>2]=m<<16>>16;q=q*7|0;c[k+1310736+(q<<2)>>2]=1;c[k+1310736+(q+1<<2)>>2]=s;c[k+1310736+(q+2<<2)>>2]=y;c[k+1310736+(q+3<<2)>>2]=s;c[k+1310736+(q+4<<2)>>2]=s;c[k+1310736+(q+5<<2)>>2]=y;c[k+1310736+(q+6<<2)>>2]=y;break}}if(g){m=c[k+1179664+(o+-1<<2)>>2]|0;o=c[k+1179664+(p+-1<<2)>>2]|0;if((m|0)>(o|0)){b[e>>1]=o;if((q|0)>0){g=0;f=n;while(1){if((c[f>>2]|0)==(m|0))c[f>>2]=o;g=g+1|0;if((g|0)>=(q|0)){m=o;break}else f=f+4|0}}else m=o}else{b[e>>1]=m;if((m|0)<(o|0)&(q|0)>0){g=0;f=n;while(1){if((c[f>>2]|0)==(o|0))c[f>>2]=m;g=g+1|0;if((g|0)>=(q|0))break;else f=f+4|0}}}m=(m<<16>>16)*7|0;p=k+1310736+(m+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=k+1310736+(m+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=k+1310736+(m+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+y;c[k+1310736+(m+-1<<2)>>2]=y;m=q;break}g=b[e+-2>>1]|0;if(g<<16>>16<=0){b[e>>1]=f;m=o*7|0;g=k+1310736+(m+-7<<2)|0;c[g>>2]=(c[g>>2]|0)+1;g=k+1310736+(m+-6<<2)|0;c[g>>2]=(c[g>>2]|0)+s;g=k+1310736+(m+-5<<2)|0;c[g>>2]=(c[g>>2]|0)+y;g=k+1310736+(m+-4<<2)|0;if((c[g>>2]|0)>(s|0))c[g>>2]=s;c[k+1310736+(m+-1<<2)>>2]=y;m=q;break}m=c[k+1179664+(o+-1<<2)>>2]|0;o=c[k+1179664+((g<<16>>16)+-1<<2)>>2]|0;if((m|0)>(o|0)){b[e>>1]=o;if((q|0)>0){g=0;f=n;while(1){if((c[f>>2]|0)==(m|0))c[f>>2]=o;g=g+1|0;if((g|0)>=(q|0)){m=o;break}else f=f+4|0}}else m=o}else{b[e>>1]=m;if((m|0)<(o|0)&(q|0)>0){g=0;f=n;while(1){if((c[f>>2]|0)==(o|0))c[f>>2]=m;g=g+1|0;if((g|0)>=(q|0))break;else f=f+4|0}}}m=(m<<16>>16)*7|0;p=k+1310736+(m+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=k+1310736+(m+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;m=k+1310736+(m+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+y;m=q}while(0);s=s+1|0;g=r+4|0;e=e+2|0;l=l+1|0;if((s|0)>=(z|0))break;else{r=g;q=m}}}y=y+1|0;if((y|0)>=(A|0)){o=m;C=52;break a}else{l=l+2|0;g=g+t|0;e=e+4|0}}Me(3,3904,B);l=-1}else{o=0;C=52}while(0);if((C|0)==52){e=k+12|0;if((o|0)<1)m=1;else{g=1;m=1;while(1){l=c[n>>2]|0;if((l|0)==(g|0)){l=m;m=m+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[n>>2]=l;if((g|0)<(o|0)){g=g+1|0;n=n+4|0}else break}}f=k+8|0;l=m+-1|0;c[f>>2]=l;if(l){ek(e|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((m|0)>1){l=0;do{C=l<<2;c[k+131084+(C<<2)>>2]=D;c[k+131084+((C|1)<<2)>>2]=0;c[k+131084+((C|2)<<2)>>2]=E;c[k+131084+((C|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[f>>2]|0))}if((o|0)>0){e=0;do{n=(c[k+1179664+(e<<2)>>2]|0)+-1|0;g=e*7|0;l=k+12+(n<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(g<<2)>>2]|0);l=n<<1;m=k+655376+(l<<3)|0;h[m>>3]=+h[m>>3]+ +(c[k+1310736+(g+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(g+2<<2)>>2]|0);n=n<<2;l=k+131084+(n<<2)|0;m=c[k+1310736+(g+3<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;l=k+131084+((n|1)<<2)|0;m=c[k+1310736+(g+4<<2)>>2]|0;if((c[l>>2]|0)<(m|0))c[l>>2]=m;l=k+131084+((n|2)<<2)|0;m=c[k+1310736+(g+5<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;m=k+131084+((n|3)<<2)|0;l=c[k+1310736+(g+6<<2)>>2]|0;if((c[m>>2]|0)<(l|0))c[m>>2]=l;e=e+1|0}while((e|0)<(o|0))}if((c[f>>2]|0)>0){l=0;do{D=k+12+(l<<2)|0;E=l<<1;C=k+655376+(E<<3)|0;h[C>>3]=+h[C>>3]/+(c[D>>2]|0);E=k+655376+((E|1)<<3)|0;h[E>>3]=+h[E>>3]/+(c[D>>2]|0);l=l+1|0}while((l|0)<(c[f>>2]|0));l=0}else l=0}else l=0}i=F;return l|0}function fd(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;F=i;i=i+16|0;B=F;D=(f|0)/2|0;E=(g|0)/2|0;o=c[k>>2]|0;A=E+-1|0;if((f|0)>1){l=0;m=o;n=o+(($(A,D)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(D|0))break;else{m=m+2|0;n=n+2|0}}}z=D+-1|0;if((g|0)>1){l=0;m=o;n=o+(z<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(E|0))break;else{m=m+(D<<1)|0;n=n+(D<<1)|0}}}n=k+1179664|0;m=D+1|0;w=0-D|0;u=1-D|0;v=~D;t=(f<<1)+8|0;a:do if((A|0)>1){x=(z|0)>1;l=(c[k+4>>2]|0)+m|0;y=1;g=e+((f<<2)+4)|0;e=o+(m<<1)|0;m=0;b:while(1){if(x){s=1;r=g;q=m;while(1){do if((d[r>>0]|0|0)>(j|0)){b[e>>1]=0;a[l>>0]=0;m=q}else{a[l>>0]=-1;m=b[e+(w<<1)>>1]|0;if(m<<16>>16>0){b[e>>1]=m;m=(m<<16>>16)*7|0;p=k+1310736+(m+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=k+1310736+(m+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=k+1310736+(m+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+y;c[k+1310736+(m+-1<<2)>>2]=y;m=q;break}f=b[e+(u<<1)>>1]|0;o=f<<16>>16;m=b[e+(v<<1)>>1]|0;p=m<<16>>16;g=m<<16>>16>0;if(f<<16>>16<=0){if(g){b[e>>1]=m;m=p*7|0;g=k+1310736+(m+-7<<2)|0;c[g>>2]=(c[g>>2]|0)+1;g=k+1310736+(m+-6<<2)|0;c[g>>2]=(c[g>>2]|0)+s;g=k+1310736+(m+-5<<2)|0;c[g>>2]=(c[g>>2]|0)+y;g=k+1310736+(m+-3<<2)|0;if((c[g>>2]|0)<(s|0))c[g>>2]=s;c[k+1310736+(m+-1<<2)>>2]=y;m=q;break}m=b[e+-2>>1]|0;if(m<<16>>16>0){b[e>>1]=m;m=(m<<16>>16)*7|0;p=k+1310736+(m+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=k+1310736+(m+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=k+1310736+(m+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+y;m=k+1310736+(m+-3<<2)|0;if((c[m>>2]|0)>=(s|0)){m=q;break}c[m>>2]=s;m=q;break}else{m=q+1|0;if((q|0)>32767)break b;b[e>>1]=m;c[k+1179664+(q<<2)>>2]=m<<16>>16;q=q*7|0;c[k+1310736+(q<<2)>>2]=1;c[k+1310736+(q+1<<2)>>2]=s;c[k+1310736+(q+2<<2)>>2]=y;c[k+1310736+(q+3<<2)>>2]=s;c[k+1310736+(q+4<<2)>>2]=s;c[k+1310736+(q+5<<2)>>2]=y;c[k+1310736+(q+6<<2)>>2]=y;break}}if(g){m=c[k+1179664+(o+-1<<2)>>2]|0;o=c[k+1179664+(p+-1<<2)>>2]|0;if((m|0)>(o|0)){b[e>>1]=o;if((q|0)>0){g=0;f=n;while(1){if((c[f>>2]|0)==(m|0))c[f>>2]=o;g=g+1|0;if((g|0)>=(q|0)){m=o;break}else f=f+4|0}}else m=o}else{b[e>>1]=m;if((m|0)<(o|0)&(q|0)>0){g=0;f=n;while(1){if((c[f>>2]|0)==(o|0))c[f>>2]=m;g=g+1|0;if((g|0)>=(q|0))break;else f=f+4|0}}}m=(m<<16>>16)*7|0;p=k+1310736+(m+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=k+1310736+(m+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=k+1310736+(m+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+y;c[k+1310736+(m+-1<<2)>>2]=y;m=q;break}g=b[e+-2>>1]|0;if(g<<16>>16<=0){b[e>>1]=f;m=o*7|0;g=k+1310736+(m+-7<<2)|0;c[g>>2]=(c[g>>2]|0)+1;g=k+1310736+(m+-6<<2)|0;c[g>>2]=(c[g>>2]|0)+s;g=k+1310736+(m+-5<<2)|0;c[g>>2]=(c[g>>2]|0)+y;g=k+1310736+(m+-4<<2)|0;if((c[g>>2]|0)>(s|0))c[g>>2]=s;c[k+1310736+(m+-1<<2)>>2]=y;m=q;break}m=c[k+1179664+(o+-1<<2)>>2]|0;o=c[k+1179664+((g<<16>>16)+-1<<2)>>2]|0;if((m|0)>(o|0)){b[e>>1]=o;if((q|0)>0){g=0;f=n;while(1){if((c[f>>2]|0)==(m|0))c[f>>2]=o;g=g+1|0;if((g|0)>=(q|0)){m=o;break}else f=f+4|0}}else m=o}else{b[e>>1]=m;if((m|0)<(o|0)&(q|0)>0){g=0;f=n;while(1){if((c[f>>2]|0)==(o|0))c[f>>2]=m;g=g+1|0;if((g|0)>=(q|0))break;else f=f+4|0}}}m=(m<<16>>16)*7|0;p=k+1310736+(m+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=k+1310736+(m+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;m=k+1310736+(m+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+y;m=q}while(0);s=s+1|0;g=r+4|0;e=e+2|0;l=l+1|0;if((s|0)>=(z|0))break;else{r=g;q=m}}}y=y+1|0;if((y|0)>=(A|0)){o=m;C=52;break a}else{l=l+2|0;g=g+t|0;e=e+4|0}}Me(3,3904,B);l=-1}else{o=0;C=52}while(0);if((C|0)==52){e=k+12|0;if((o|0)<1)m=1;else{g=1;m=1;while(1){l=c[n>>2]|0;if((l|0)==(g|0)){l=m;m=m+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[n>>2]=l;if((g|0)<(o|0)){g=g+1|0;n=n+4|0}else break}}f=k+8|0;l=m+-1|0;c[f>>2]=l;if(l){ek(e|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((m|0)>1){l=0;do{C=l<<2;c[k+131084+(C<<2)>>2]=D;c[k+131084+((C|1)<<2)>>2]=0;c[k+131084+((C|2)<<2)>>2]=E;c[k+131084+((C|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[f>>2]|0))}if((o|0)>0){e=0;do{n=(c[k+1179664+(e<<2)>>2]|0)+-1|0;g=e*7|0;l=k+12+(n<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(g<<2)>>2]|0);l=n<<1;m=k+655376+(l<<3)|0;h[m>>3]=+h[m>>3]+ +(c[k+1310736+(g+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(g+2<<2)>>2]|0);n=n<<2;l=k+131084+(n<<2)|0;m=c[k+1310736+(g+3<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;l=k+131084+((n|1)<<2)|0;m=c[k+1310736+(g+4<<2)>>2]|0;if((c[l>>2]|0)<(m|0))c[l>>2]=m;l=k+131084+((n|2)<<2)|0;m=c[k+1310736+(g+5<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;m=k+131084+((n|3)<<2)|0;l=c[k+1310736+(g+6<<2)>>2]|0;if((c[m>>2]|0)<(l|0))c[m>>2]=l;e=e+1|0}while((e|0)<(o|0))}if((c[f>>2]|0)>0){l=0;do{D=k+12+(l<<2)|0;E=l<<1;C=k+655376+(E<<3)|0;h[C>>3]=+h[C>>3]/+(c[D>>2]|0);E=k+655376+((E|1)<<3)|0;h[E>>3]=+h[E>>3]/+(c[D>>2]|0);l=l+1|0}while((l|0)<(c[f>>2]|0));l=0}else l=0}else l=0}i=F;return l|0}function gd(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;E=i;i=i+16|0;C=E;p=c[k>>2]|0;B=g+-1|0;if((f|0)>0){l=0;m=p;n=p+(($(B,f)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(f|0))break;else{m=m+2|0;n=n+2|0}}}A=j*3|0;z=f+-1|0;if((g|0)>0){l=0;j=p;m=p+(z<<1)|0;while(1){b[m>>1]=0;b[j>>1]=0;l=l+1|0;if((l|0)>=(g|0))break;else{j=j+(f<<1)|0;m=m+(f<<1)|0}}}m=k+1179664|0;l=f+1|0;w=0-f|0;u=1-f|0;v=~f;a:do if((B|0)>1){x=(z|0)>1;o=(c[k+4>>2]|0)+l|0;y=1;n=e+(l*3|0)|0;e=p+(l<<1)|0;j=0;b:while(1){if(x){l=o;t=1;s=n;r=j;while(1){do if(((d[s+1>>0]|0)+(d[s>>0]|0)+(d[s+2>>0]|0)|0)>(A|0)){b[e>>1]=0;a[l>>0]=0;j=r}else{a[l>>0]=-1;j=b[e+(w<<1)>>1]|0;if(j<<16>>16>0){b[e>>1]=j;j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}o=b[e+(u<<1)>>1]|0;p=o<<16>>16;j=b[e+(v<<1)>>1]|0;q=j<<16>>16;n=j<<16>>16>0;if(o<<16>>16<=0){if(n){b[e>>1]=j;j=q*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+t;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+y;n=k+1310736+(j+-3<<2)|0;if((c[n>>2]|0)<(t|0))c[n>>2]=t;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}j=b[e+-2>>1]|0;if(j<<16>>16>0){b[e>>1]=j;j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;j=k+1310736+(j+-3<<2)|0;if((c[j>>2]|0)>=(t|0)){j=r;break}c[j>>2]=t;j=r;break}else{j=r+1|0;if((r|0)>32767)break b;b[e>>1]=j;c[k+1179664+(r<<2)>>2]=j<<16>>16;r=r*7|0;c[k+1310736+(r<<2)>>2]=1;c[k+1310736+(r+1<<2)>>2]=t;c[k+1310736+(r+2<<2)>>2]=y;c[k+1310736+(r+3<<2)>>2]=t;c[k+1310736+(r+4<<2)>>2]=t;c[k+1310736+(r+5<<2)>>2]=y;c[k+1310736+(r+6<<2)>>2]=y;break}}if(n){j=c[k+1179664+(p+-1<<2)>>2]|0;p=c[k+1179664+(q+-1<<2)>>2]|0;if((j|0)>(p|0)){b[e>>1]=p;if((r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(j|0))c[o>>2]=p;n=n+1|0;if((n|0)>=(r|0)){j=p;break}else o=o+4|0}}else j=p}else{b[e>>1]=j;if((j|0)<(p|0)&(r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(p|0))c[o>>2]=j;n=n+1|0;if((n|0)>=(r|0))break;else o=o+4|0}}}j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}n=b[e+-2>>1]|0;if(n<<16>>16<=0){b[e>>1]=o;j=p*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+t;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+y;n=k+1310736+(j+-4<<2)|0;if((c[n>>2]|0)>(t|0))c[n>>2]=t;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}j=c[k+1179664+(p+-1<<2)>>2]|0;p=c[k+1179664+((n<<16>>16)+-1<<2)>>2]|0;if((j|0)>(p|0)){b[e>>1]=p;if((r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(j|0))c[o>>2]=p;n=n+1|0;if((n|0)>=(r|0)){j=p;break}else o=o+4|0}}else j=p}else{b[e>>1]=j;if((j|0)<(p|0)&(r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(p|0))c[o>>2]=j;n=n+1|0;if((n|0)>=(r|0))break;else o=o+4|0}}}j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;j=k+1310736+(j+-5<<2)|0;c[j>>2]=(c[j>>2]|0)+y;j=r}while(0);t=t+1|0;n=s+3|0;e=e+2|0;l=l+1|0;if((t|0)>=(z|0))break;else{s=n;r=j}}}else l=o;y=y+1|0;if((y|0)>=(B|0)){p=j;D=52;break a}else{o=l+2|0;n=n+6|0;e=e+4|0}}Me(3,3904,C);l=-1}else{p=0;D=52}while(0);if((D|0)==52){e=k+12|0;if((p|0)<1)j=1;else{n=1;j=1;while(1){l=c[m>>2]|0;if((l|0)==(n|0)){l=j;j=j+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[m>>2]=l;if((n|0)<(p|0)){n=n+1|0;m=m+4|0}else break}}o=k+8|0;l=j+-1|0;c[o>>2]=l;if(l){ek(e|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((j|0)>1){l=0;do{D=l<<2;c[k+131084+(D<<2)>>2]=f;c[k+131084+((D|1)<<2)>>2]=0;c[k+131084+((D|2)<<2)>>2]=g;c[k+131084+((D|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[o>>2]|0))}if((p|0)>0){e=0;do{m=(c[k+1179664+(e<<2)>>2]|0)+-1|0;n=e*7|0;l=k+12+(m<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(n<<2)>>2]|0);l=m<<1;j=k+655376+(l<<3)|0;h[j>>3]=+h[j>>3]+ +(c[k+1310736+(n+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(n+2<<2)>>2]|0);m=m<<2;l=k+131084+(m<<2)|0;j=c[k+1310736+(n+3<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;l=k+131084+((m|1)<<2)|0;j=c[k+1310736+(n+4<<2)>>2]|0;if((c[l>>2]|0)<(j|0))c[l>>2]=j;l=k+131084+((m|2)<<2)|0;j=c[k+1310736+(n+5<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;j=k+131084+((m|3)<<2)|0;l=c[k+1310736+(n+6<<2)>>2]|0;if((c[j>>2]|0)<(l|0))c[j>>2]=l;e=e+1|0}while((e|0)<(p|0))}if((c[o>>2]|0)>0){l=0;do{f=k+12+(l<<2)|0;g=l<<1;D=k+655376+(g<<3)|0;h[D>>3]=+h[D>>3]/+(c[f>>2]|0);g=k+655376+((g|1)<<3)|0;h[g>>3]=+h[g>>3]/+(c[f>>2]|0);l=l+1|0}while((l|0)<(c[o>>2]|0));l=0}else l=0}else l=0}i=E;return l|0}function hd(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;E=i;i=i+16|0;C=E;p=c[k>>2]|0;B=g+-1|0;if((f|0)>0){l=0;m=p;n=p+(($(B,f)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(f|0))break;else{m=m+2|0;n=n+2|0}}}A=j*3|0;z=f+-1|0;if((g|0)>0){l=0;j=p;m=p+(z<<1)|0;while(1){b[m>>1]=0;b[j>>1]=0;l=l+1|0;if((l|0)>=(g|0))break;else{j=j+(f<<1)|0;m=m+(f<<1)|0}}}m=k+1179664|0;l=f+1|0;w=0-f|0;u=1-f|0;v=~f;a:do if((B|0)>1){x=(z|0)>1;o=(c[k+4>>2]|0)+l|0;y=1;n=e+(l<<1)|0;e=p+(l<<1)|0;j=0;b:while(1){if(x){l=o;t=1;s=n;r=j;while(1){p=d[s>>0]|0;q=d[s+1>>0]|0;do if(((p&248)+10+(p<<5&224)+(q>>>3&28)+(q<<3&248)|0)>(A|0)){b[e>>1]=0;a[l>>0]=0;j=r}else{a[l>>0]=-1;j=b[e+(w<<1)>>1]|0;if(j<<16>>16>0){b[e>>1]=j;j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}o=b[e+(u<<1)>>1]|0;p=o<<16>>16;j=b[e+(v<<1)>>1]|0;q=j<<16>>16;n=j<<16>>16>0;if(o<<16>>16<=0){if(n){b[e>>1]=j;j=q*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+t;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+y;n=k+1310736+(j+-3<<2)|0;if((c[n>>2]|0)<(t|0))c[n>>2]=t;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}j=b[e+-2>>1]|0;if(j<<16>>16>0){b[e>>1]=j;j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;j=k+1310736+(j+-3<<2)|0;if((c[j>>2]|0)>=(t|0)){j=r;break}c[j>>2]=t;j=r;break}else{j=r+1|0;if((r|0)>32767)break b;b[e>>1]=j;c[k+1179664+(r<<2)>>2]=j<<16>>16;r=r*7|0;c[k+1310736+(r<<2)>>2]=1;c[k+1310736+(r+1<<2)>>2]=t;c[k+1310736+(r+2<<2)>>2]=y;c[k+1310736+(r+3<<2)>>2]=t;c[k+1310736+(r+4<<2)>>2]=t;c[k+1310736+(r+5<<2)>>2]=y;c[k+1310736+(r+6<<2)>>2]=y;break}}if(n){j=c[k+1179664+(p+-1<<2)>>2]|0;p=c[k+1179664+(q+-1<<2)>>2]|0;if((j|0)>(p|0)){b[e>>1]=p;if((r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(j|0))c[o>>2]=p;n=n+1|0;if((n|0)>=(r|0)){j=p;break}else o=o+4|0}}else j=p}else{b[e>>1]=j;if((j|0)<(p|0)&(r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(p|0))c[o>>2]=j;n=n+1|0;if((n|0)>=(r|0))break;else o=o+4|0}}}j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}n=b[e+-2>>1]|0;if(n<<16>>16<=0){b[e>>1]=o;j=p*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+t;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+y;n=k+1310736+(j+-4<<2)|0;if((c[n>>2]|0)>(t|0))c[n>>2]=t;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}j=c[k+1179664+(p+-1<<2)>>2]|0;p=c[k+1179664+((n<<16>>16)+-1<<2)>>2]|0;if((j|0)>(p|0)){b[e>>1]=p;if((r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(j|0))c[o>>2]=p;n=n+1|0;if((n|0)>=(r|0)){j=p;break}else o=o+4|0}}else j=p}else{b[e>>1]=j;if((j|0)<(p|0)&(r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(p|0))c[o>>2]=j;n=n+1|0;if((n|0)>=(r|0))break;else o=o+4|0}}}j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;j=k+1310736+(j+-5<<2)|0;c[j>>2]=(c[j>>2]|0)+y;j=r}while(0);t=t+1|0;n=s+2|0;e=e+2|0;l=l+1|0;if((t|0)>=(z|0))break;else{s=n;r=j}}}else l=o;y=y+1|0;if((y|0)>=(B|0)){p=j;D=52;break a}else{o=l+2|0;n=n+4|0;e=e+4|0}}Me(3,3904,C);l=-1}else{p=0;D=52}while(0);if((D|0)==52){e=k+12|0;if((p|0)<1)j=1;else{n=1;j=1;while(1){l=c[m>>2]|0;if((l|0)==(n|0)){l=j;j=j+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[m>>2]=l;if((n|0)<(p|0)){n=n+1|0;m=m+4|0}else break}}o=k+8|0;l=j+-1|0;c[o>>2]=l;if(l){ek(e|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((j|0)>1){l=0;do{D=l<<2;c[k+131084+(D<<2)>>2]=f;c[k+131084+((D|1)<<2)>>2]=0;c[k+131084+((D|2)<<2)>>2]=g;c[k+131084+((D|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[o>>2]|0))}if((p|0)>0){e=0;do{m=(c[k+1179664+(e<<2)>>2]|0)+-1|0;n=e*7|0;l=k+12+(m<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(n<<2)>>2]|0);l=m<<1;j=k+655376+(l<<3)|0;h[j>>3]=+h[j>>3]+ +(c[k+1310736+(n+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(n+2<<2)>>2]|0);m=m<<2;l=k+131084+(m<<2)|0;j=c[k+1310736+(n+3<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;l=k+131084+((m|1)<<2)|0;j=c[k+1310736+(n+4<<2)>>2]|0;if((c[l>>2]|0)<(j|0))c[l>>2]=j;l=k+131084+((m|2)<<2)|0;j=c[k+1310736+(n+5<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;j=k+131084+((m|3)<<2)|0;l=c[k+1310736+(n+6<<2)>>2]|0;if((c[j>>2]|0)<(l|0))c[j>>2]=l;e=e+1|0}while((e|0)<(p|0))}if((c[o>>2]|0)>0){l=0;do{f=k+12+(l<<2)|0;g=l<<1;D=k+655376+(g<<3)|0;h[D>>3]=+h[D>>3]/+(c[f>>2]|0);g=k+655376+((g|1)<<3)|0;h[g>>3]=+h[g>>3]/+(c[f>>2]|0);l=l+1|0}while((l|0)<(c[o>>2]|0));l=0}else l=0}else l=0}i=E;return l|0}function id(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;E=i;i=i+16|0;C=E;p=c[k>>2]|0;B=g+-1|0;if((f|0)>0){l=0;m=p;n=p+(($(B,f)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(f|0))break;else{m=m+2|0;n=n+2|0}}}A=j*3|0;z=f+-1|0;if((g|0)>0){l=0;j=p;m=p+(z<<1)|0;while(1){b[m>>1]=0;b[j>>1]=0;l=l+1|0;if((l|0)>=(g|0))break;else{j=j+(f<<1)|0;m=m+(f<<1)|0}}}m=k+1179664|0;l=f+1|0;w=0-f|0;u=1-f|0;v=~f;a:do if((B|0)>1){x=(z|0)>1;o=(c[k+4>>2]|0)+l|0;y=1;n=e+(l<<2)|0;e=p+(l<<1)|0;j=0;b:while(1){if(x){l=o;t=1;s=n;r=j;while(1){do if(((d[s+1>>0]|0)+(d[s>>0]|0)+(d[s+2>>0]|0)|0)>(A|0)){b[e>>1]=0;a[l>>0]=0;j=r}else{a[l>>0]=-1;j=b[e+(w<<1)>>1]|0;if(j<<16>>16>0){b[e>>1]=j;j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}o=b[e+(u<<1)>>1]|0;p=o<<16>>16;j=b[e+(v<<1)>>1]|0;q=j<<16>>16;n=j<<16>>16>0;if(o<<16>>16<=0){if(n){b[e>>1]=j;j=q*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+t;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+y;n=k+1310736+(j+-3<<2)|0;if((c[n>>2]|0)<(t|0))c[n>>2]=t;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}j=b[e+-2>>1]|0;if(j<<16>>16>0){b[e>>1]=j;j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;j=k+1310736+(j+-3<<2)|0;if((c[j>>2]|0)>=(t|0)){j=r;break}c[j>>2]=t;j=r;break}else{j=r+1|0;if((r|0)>32767)break b;b[e>>1]=j;c[k+1179664+(r<<2)>>2]=j<<16>>16;r=r*7|0;c[k+1310736+(r<<2)>>2]=1;c[k+1310736+(r+1<<2)>>2]=t;c[k+1310736+(r+2<<2)>>2]=y;c[k+1310736+(r+3<<2)>>2]=t;c[k+1310736+(r+4<<2)>>2]=t;c[k+1310736+(r+5<<2)>>2]=y;c[k+1310736+(r+6<<2)>>2]=y;break}}if(n){j=c[k+1179664+(p+-1<<2)>>2]|0;p=c[k+1179664+(q+-1<<2)>>2]|0;if((j|0)>(p|0)){b[e>>1]=p;if((r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(j|0))c[o>>2]=p;n=n+1|0;if((n|0)>=(r|0)){j=p;break}else o=o+4|0}}else j=p}else{b[e>>1]=j;if((j|0)<(p|0)&(r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(p|0))c[o>>2]=j;n=n+1|0;if((n|0)>=(r|0))break;else o=o+4|0}}}j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}n=b[e+-2>>1]|0;if(n<<16>>16<=0){b[e>>1]=o;j=p*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+t;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+y;n=k+1310736+(j+-4<<2)|0;if((c[n>>2]|0)>(t|0))c[n>>2]=t;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}j=c[k+1179664+(p+-1<<2)>>2]|0;p=c[k+1179664+((n<<16>>16)+-1<<2)>>2]|0;if((j|0)>(p|0)){b[e>>1]=p;if((r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(j|0))c[o>>2]=p;n=n+1|0;if((n|0)>=(r|0)){j=p;break}else o=o+4|0}}else j=p}else{b[e>>1]=j;if((j|0)<(p|0)&(r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(p|0))c[o>>2]=j;n=n+1|0;if((n|0)>=(r|0))break;else o=o+4|0}}}j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;j=k+1310736+(j+-5<<2)|0;c[j>>2]=(c[j>>2]|0)+y;j=r}while(0);t=t+1|0;n=s+4|0;e=e+2|0;l=l+1|0;if((t|0)>=(z|0))break;else{s=n;r=j}}}else l=o;y=y+1|0;if((y|0)>=(B|0)){p=j;D=52;break a}else{o=l+2|0;n=n+8|0;e=e+4|0}}Me(3,3904,C);l=-1}else{p=0;D=52}while(0);if((D|0)==52){e=k+12|0;if((p|0)<1)j=1;else{n=1;j=1;while(1){l=c[m>>2]|0;if((l|0)==(n|0)){l=j;j=j+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[m>>2]=l;if((n|0)<(p|0)){n=n+1|0;m=m+4|0}else break}}o=k+8|0;l=j+-1|0;c[o>>2]=l;if(l){ek(e|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((j|0)>1){l=0;do{D=l<<2;c[k+131084+(D<<2)>>2]=f;c[k+131084+((D|1)<<2)>>2]=0;c[k+131084+((D|2)<<2)>>2]=g;c[k+131084+((D|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[o>>2]|0))}if((p|0)>0){e=0;do{m=(c[k+1179664+(e<<2)>>2]|0)+-1|0;n=e*7|0;l=k+12+(m<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(n<<2)>>2]|0);l=m<<1;j=k+655376+(l<<3)|0;h[j>>3]=+h[j>>3]+ +(c[k+1310736+(n+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(n+2<<2)>>2]|0);m=m<<2;l=k+131084+(m<<2)|0;j=c[k+1310736+(n+3<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;l=k+131084+((m|1)<<2)|0;j=c[k+1310736+(n+4<<2)>>2]|0;if((c[l>>2]|0)<(j|0))c[l>>2]=j;l=k+131084+((m|2)<<2)|0;j=c[k+1310736+(n+5<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;j=k+131084+((m|3)<<2)|0;l=c[k+1310736+(n+6<<2)>>2]|0;if((c[j>>2]|0)<(l|0))c[j>>2]=l;e=e+1|0}while((e|0)<(p|0))}if((c[o>>2]|0)>0){l=0;do{f=k+12+(l<<2)|0;g=l<<1;D=k+655376+(g<<3)|0;h[D>>3]=+h[D>>3]/+(c[f>>2]|0);g=k+655376+((g|1)<<3)|0;h[g>>3]=+h[g>>3]/+(c[f>>2]|0);l=l+1|0}while((l|0)<(c[o>>2]|0));l=0}else l=0}else l=0}i=E;return l|0}function jd(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;E=i;i=i+16|0;C=E;p=c[k>>2]|0;B=g+-1|0;if((f|0)>0){l=0;m=p;n=p+(($(B,f)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(f|0))break;else{m=m+2|0;n=n+2|0}}}A=j*3|0;z=f+-1|0;if((g|0)>0){l=0;j=p;m=p+(z<<1)|0;while(1){b[m>>1]=0;b[j>>1]=0;l=l+1|0;if((l|0)>=(g|0))break;else{j=j+(f<<1)|0;m=m+(f<<1)|0}}}m=k+1179664|0;l=f+1|0;w=0-f|0;u=1-f|0;v=~f;a:do if((B|0)>1){x=(z|0)>1;o=(c[k+4>>2]|0)+l|0;y=1;n=e+(l<<1)|0;e=p+(l<<1)|0;j=0;b:while(1){if(x){l=o;t=1;s=n;r=j;while(1){q=d[s>>0]|0;do if(((q&240)+24+(q<<4&240)+((d[s+1>>0]|0)&240)|0)>(A|0)){b[e>>1]=0;a[l>>0]=0;j=r}else{a[l>>0]=-1;j=b[e+(w<<1)>>1]|0;if(j<<16>>16>0){b[e>>1]=j;j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}o=b[e+(u<<1)>>1]|0;p=o<<16>>16;j=b[e+(v<<1)>>1]|0;q=j<<16>>16;n=j<<16>>16>0;if(o<<16>>16<=0){if(n){b[e>>1]=j;j=q*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+t;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+y;n=k+1310736+(j+-3<<2)|0;if((c[n>>2]|0)<(t|0))c[n>>2]=t;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}j=b[e+-2>>1]|0;if(j<<16>>16>0){b[e>>1]=j;j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;j=k+1310736+(j+-3<<2)|0;if((c[j>>2]|0)>=(t|0)){j=r;break}c[j>>2]=t;j=r;break}else{j=r+1|0;if((r|0)>32767)break b;b[e>>1]=j;c[k+1179664+(r<<2)>>2]=j<<16>>16;r=r*7|0;c[k+1310736+(r<<2)>>2]=1;c[k+1310736+(r+1<<2)>>2]=t;c[k+1310736+(r+2<<2)>>2]=y;c[k+1310736+(r+3<<2)>>2]=t;c[k+1310736+(r+4<<2)>>2]=t;c[k+1310736+(r+5<<2)>>2]=y;c[k+1310736+(r+6<<2)>>2]=y;break}}if(n){j=c[k+1179664+(p+-1<<2)>>2]|0;p=c[k+1179664+(q+-1<<2)>>2]|0;if((j|0)>(p|0)){b[e>>1]=p;if((r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(j|0))c[o>>2]=p;n=n+1|0;if((n|0)>=(r|0)){j=p;break}else o=o+4|0}}else j=p}else{b[e>>1]=j;if((j|0)<(p|0)&(r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(p|0))c[o>>2]=j;n=n+1|0;if((n|0)>=(r|0))break;else o=o+4|0}}}j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}n=b[e+-2>>1]|0;if(n<<16>>16<=0){b[e>>1]=o;j=p*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+t;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+y;n=k+1310736+(j+-4<<2)|0;if((c[n>>2]|0)>(t|0))c[n>>2]=t;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}j=c[k+1179664+(p+-1<<2)>>2]|0;p=c[k+1179664+((n<<16>>16)+-1<<2)>>2]|0;if((j|0)>(p|0)){b[e>>1]=p;if((r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(j|0))c[o>>2]=p;n=n+1|0;if((n|0)>=(r|0)){j=p;break}else o=o+4|0}}else j=p}else{b[e>>1]=j;if((j|0)<(p|0)&(r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(p|0))c[o>>2]=j;n=n+1|0;if((n|0)>=(r|0))break;else o=o+4|0}}}j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;j=k+1310736+(j+-5<<2)|0;c[j>>2]=(c[j>>2]|0)+y;j=r}while(0);t=t+1|0;n=s+2|0;e=e+2|0;l=l+1|0;if((t|0)>=(z|0))break;else{s=n;r=j}}}else l=o;y=y+1|0;if((y|0)>=(B|0)){p=j;D=52;break a}else{o=l+2|0;n=n+4|0;e=e+4|0}}Me(3,3904,C);l=-1}else{p=0;D=52}while(0);if((D|0)==52){e=k+12|0;if((p|0)<1)j=1;else{n=1;j=1;while(1){l=c[m>>2]|0;if((l|0)==(n|0)){l=j;j=j+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[m>>2]=l;if((n|0)<(p|0)){n=n+1|0;m=m+4|0}else break}}o=k+8|0;l=j+-1|0;c[o>>2]=l;if(l){ek(e|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((j|0)>1){l=0;do{D=l<<2;c[k+131084+(D<<2)>>2]=f;c[k+131084+((D|1)<<2)>>2]=0;c[k+131084+((D|2)<<2)>>2]=g;c[k+131084+((D|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[o>>2]|0))}if((p|0)>0){e=0;do{m=(c[k+1179664+(e<<2)>>2]|0)+-1|0;n=e*7|0;l=k+12+(m<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(n<<2)>>2]|0);l=m<<1;j=k+655376+(l<<3)|0;h[j>>3]=+h[j>>3]+ +(c[k+1310736+(n+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(n+2<<2)>>2]|0);m=m<<2;l=k+131084+(m<<2)|0;j=c[k+1310736+(n+3<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;l=k+131084+((m|1)<<2)|0;j=c[k+1310736+(n+4<<2)>>2]|0;if((c[l>>2]|0)<(j|0))c[l>>2]=j;l=k+131084+((m|2)<<2)|0;j=c[k+1310736+(n+5<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;j=k+131084+((m|3)<<2)|0;l=c[k+1310736+(n+6<<2)>>2]|0;if((c[j>>2]|0)<(l|0))c[j>>2]=l;e=e+1|0}while((e|0)<(p|0))}if((c[o>>2]|0)>0){l=0;do{f=k+12+(l<<2)|0;g=l<<1;D=k+655376+(g<<3)|0;h[D>>3]=+h[D>>3]/+(c[f>>2]|0);g=k+655376+((g|1)<<3)|0;h[g>>3]=+h[g>>3]/+(c[f>>2]|0);l=l+1|0}while((l|0)<(c[o>>2]|0));l=0}else l=0}else l=0}i=E;return l|0}function kd(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;E=i;i=i+16|0;C=E;p=c[k>>2]|0;B=g+-1|0;if((f|0)>0){l=0;m=p;n=p+(($(B,f)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(f|0))break;else{m=m+2|0;n=n+2|0}}}A=j*3|0;z=f+-1|0;if((g|0)>0){l=0;j=p;m=p+(z<<1)|0;while(1){b[m>>1]=0;b[j>>1]=0;l=l+1|0;if((l|0)>=(g|0))break;else{j=j+(f<<1)|0;m=m+(f<<1)|0}}}m=k+1179664|0;l=f+1|0;w=0-f|0;u=1-f|0;v=~f;a:do if((B|0)>1){x=(z|0)>1;o=(c[k+4>>2]|0)+l|0;y=1;n=e+(l<<1)|0;e=p+(l<<1)|0;j=0;b:while(1){if(x){l=o;t=1;s=n;r=j;while(1){p=d[s>>0]|0;q=d[s+1>>0]|0;do if(((p&248)+12+(p<<5&224)+(q>>>3&24)+(q<<2&248)|0)>(A|0)){b[e>>1]=0;a[l>>0]=0;j=r}else{a[l>>0]=-1;j=b[e+(w<<1)>>1]|0;if(j<<16>>16>0){b[e>>1]=j;j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}o=b[e+(u<<1)>>1]|0;p=o<<16>>16;j=b[e+(v<<1)>>1]|0;q=j<<16>>16;n=j<<16>>16>0;if(o<<16>>16<=0){if(n){b[e>>1]=j;j=q*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+t;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+y;n=k+1310736+(j+-3<<2)|0;if((c[n>>2]|0)<(t|0))c[n>>2]=t;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}j=b[e+-2>>1]|0;if(j<<16>>16>0){b[e>>1]=j;j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;j=k+1310736+(j+-3<<2)|0;if((c[j>>2]|0)>=(t|0)){j=r;break}c[j>>2]=t;j=r;break}else{j=r+1|0;if((r|0)>32767)break b;b[e>>1]=j;c[k+1179664+(r<<2)>>2]=j<<16>>16;r=r*7|0;c[k+1310736+(r<<2)>>2]=1;c[k+1310736+(r+1<<2)>>2]=t;c[k+1310736+(r+2<<2)>>2]=y;c[k+1310736+(r+3<<2)>>2]=t;c[k+1310736+(r+4<<2)>>2]=t;c[k+1310736+(r+5<<2)>>2]=y;c[k+1310736+(r+6<<2)>>2]=y;break}}if(n){j=c[k+1179664+(p+-1<<2)>>2]|0;p=c[k+1179664+(q+-1<<2)>>2]|0;if((j|0)>(p|0)){b[e>>1]=p;if((r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(j|0))c[o>>2]=p;n=n+1|0;if((n|0)>=(r|0)){j=p;break}else o=o+4|0}}else j=p}else{b[e>>1]=j;if((j|0)<(p|0)&(r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(p|0))c[o>>2]=j;n=n+1|0;if((n|0)>=(r|0))break;else o=o+4|0}}}j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}n=b[e+-2>>1]|0;if(n<<16>>16<=0){b[e>>1]=o;j=p*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+t;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+y;n=k+1310736+(j+-4<<2)|0;if((c[n>>2]|0)>(t|0))c[n>>2]=t;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}j=c[k+1179664+(p+-1<<2)>>2]|0;p=c[k+1179664+((n<<16>>16)+-1<<2)>>2]|0;if((j|0)>(p|0)){b[e>>1]=p;if((r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(j|0))c[o>>2]=p;n=n+1|0;if((n|0)>=(r|0)){j=p;break}else o=o+4|0}}else j=p}else{b[e>>1]=j;if((j|0)<(p|0)&(r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(p|0))c[o>>2]=j;n=n+1|0;if((n|0)>=(r|0))break;else o=o+4|0}}}j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;j=k+1310736+(j+-5<<2)|0;c[j>>2]=(c[j>>2]|0)+y;j=r}while(0);t=t+1|0;n=s+2|0;e=e+2|0;l=l+1|0;if((t|0)>=(z|0))break;else{s=n;r=j}}}else l=o;y=y+1|0;if((y|0)>=(B|0)){p=j;D=52;break a}else{o=l+2|0;n=n+4|0;e=e+4|0}}Me(3,3904,C);l=-1}else{p=0;D=52}while(0);if((D|0)==52){e=k+12|0;if((p|0)<1)j=1;else{n=1;j=1;while(1){l=c[m>>2]|0;if((l|0)==(n|0)){l=j;j=j+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[m>>2]=l;if((n|0)<(p|0)){n=n+1|0;m=m+4|0}else break}}o=k+8|0;l=j+-1|0;c[o>>2]=l;if(l){ek(e|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((j|0)>1){l=0;do{D=l<<2;c[k+131084+(D<<2)>>2]=f;c[k+131084+((D|1)<<2)>>2]=0;c[k+131084+((D|2)<<2)>>2]=g;c[k+131084+((D|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[o>>2]|0))}if((p|0)>0){e=0;do{m=(c[k+1179664+(e<<2)>>2]|0)+-1|0;n=e*7|0;l=k+12+(m<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(n<<2)>>2]|0);l=m<<1;j=k+655376+(l<<3)|0;h[j>>3]=+h[j>>3]+ +(c[k+1310736+(n+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(n+2<<2)>>2]|0);m=m<<2;l=k+131084+(m<<2)|0;j=c[k+1310736+(n+3<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;l=k+131084+((m|1)<<2)|0;j=c[k+1310736+(n+4<<2)>>2]|0;if((c[l>>2]|0)<(j|0))c[l>>2]=j;l=k+131084+((m|2)<<2)|0;j=c[k+1310736+(n+5<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;j=k+131084+((m|3)<<2)|0;l=c[k+1310736+(n+6<<2)>>2]|0;if((c[j>>2]|0)<(l|0))c[j>>2]=l;e=e+1|0}while((e|0)<(p|0))}if((c[o>>2]|0)>0){l=0;do{f=k+12+(l<<2)|0;g=l<<1;D=k+655376+(g<<3)|0;h[D>>3]=+h[D>>3]/+(c[f>>2]|0);g=k+655376+((g|1)<<3)|0;h[g>>3]=+h[g>>3]/+(c[f>>2]|0);l=l+1|0}while((l|0)<(c[o>>2]|0));l=0}else l=0}else l=0}i=E;return l|0}function ld(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;E=i;i=i+16|0;C=E;p=c[k>>2]|0;B=g+-1|0;if((f|0)>0){l=0;m=p;n=p+(($(B,f)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(f|0))break;else{m=m+2|0;n=n+2|0}}}A=j*3|0;z=f+-1|0;if((g|0)>0){l=0;j=p;m=p+(z<<1)|0;while(1){b[m>>1]=0;b[j>>1]=0;l=l+1|0;if((l|0)>=(g|0))break;else{j=j+(f<<1)|0;m=m+(f<<1)|0}}}m=k+1179664|0;l=f+1|0;w=0-f|0;u=1-f|0;v=~f;a:do if((B|0)>1){x=(z|0)>1;o=(c[k+4>>2]|0)+l|0;y=1;n=e+(l<<2)|0;e=p+(l<<1)|0;j=0;b:while(1){if(x){l=o;t=1;s=n;r=j;while(1){do if(((d[s+2>>0]|0)+(d[s+1>>0]|0)+(d[s+3>>0]|0)|0)>(A|0)){b[e>>1]=0;a[l>>0]=0;j=r}else{a[l>>0]=-1;j=b[e+(w<<1)>>1]|0;if(j<<16>>16>0){b[e>>1]=j;j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}o=b[e+(u<<1)>>1]|0;p=o<<16>>16;j=b[e+(v<<1)>>1]|0;q=j<<16>>16;n=j<<16>>16>0;if(o<<16>>16<=0){if(n){b[e>>1]=j;j=q*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+t;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+y;n=k+1310736+(j+-3<<2)|0;if((c[n>>2]|0)<(t|0))c[n>>2]=t;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}j=b[e+-2>>1]|0;if(j<<16>>16>0){b[e>>1]=j;j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;j=k+1310736+(j+-3<<2)|0;if((c[j>>2]|0)>=(t|0)){j=r;break}c[j>>2]=t;j=r;break}else{j=r+1|0;if((r|0)>32767)break b;b[e>>1]=j;c[k+1179664+(r<<2)>>2]=j<<16>>16;r=r*7|0;c[k+1310736+(r<<2)>>2]=1;c[k+1310736+(r+1<<2)>>2]=t;c[k+1310736+(r+2<<2)>>2]=y;c[k+1310736+(r+3<<2)>>2]=t;c[k+1310736+(r+4<<2)>>2]=t;c[k+1310736+(r+5<<2)>>2]=y;c[k+1310736+(r+6<<2)>>2]=y;break}}if(n){j=c[k+1179664+(p+-1<<2)>>2]|0;p=c[k+1179664+(q+-1<<2)>>2]|0;if((j|0)>(p|0)){b[e>>1]=p;if((r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(j|0))c[o>>2]=p;n=n+1|0;if((n|0)>=(r|0)){j=p;break}else o=o+4|0}}else j=p}else{b[e>>1]=j;if((j|0)<(p|0)&(r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(p|0))c[o>>2]=j;n=n+1|0;if((n|0)>=(r|0))break;else o=o+4|0}}}j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}n=b[e+-2>>1]|0;if(n<<16>>16<=0){b[e>>1]=o;j=p*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+t;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+y;n=k+1310736+(j+-4<<2)|0;if((c[n>>2]|0)>(t|0))c[n>>2]=t;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}j=c[k+1179664+(p+-1<<2)>>2]|0;p=c[k+1179664+((n<<16>>16)+-1<<2)>>2]|0;if((j|0)>(p|0)){b[e>>1]=p;if((r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(j|0))c[o>>2]=p;n=n+1|0;if((n|0)>=(r|0)){j=p;break}else o=o+4|0}}else j=p}else{b[e>>1]=j;if((j|0)<(p|0)&(r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(p|0))c[o>>2]=j;n=n+1|0;if((n|0)>=(r|0))break;else o=o+4|0}}}j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;j=k+1310736+(j+-5<<2)|0;c[j>>2]=(c[j>>2]|0)+y;j=r}while(0);t=t+1|0;n=s+4|0;e=e+2|0;l=l+1|0;if((t|0)>=(z|0))break;else{s=n;r=j}}}else l=o;y=y+1|0;if((y|0)>=(B|0)){p=j;D=52;break a}else{o=l+2|0;n=n+8|0;e=e+4|0}}Me(3,3904,C);l=-1}else{p=0;D=52}while(0);if((D|0)==52){e=k+12|0;if((p|0)<1)j=1;else{n=1;j=1;while(1){l=c[m>>2]|0;if((l|0)==(n|0)){l=j;j=j+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[m>>2]=l;if((n|0)<(p|0)){n=n+1|0;m=m+4|0}else break}}o=k+8|0;l=j+-1|0;c[o>>2]=l;if(l){ek(e|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((j|0)>1){l=0;do{D=l<<2;c[k+131084+(D<<2)>>2]=f;c[k+131084+((D|1)<<2)>>2]=0;c[k+131084+((D|2)<<2)>>2]=g;c[k+131084+((D|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[o>>2]|0))}if((p|0)>0){e=0;do{m=(c[k+1179664+(e<<2)>>2]|0)+-1|0;n=e*7|0;l=k+12+(m<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(n<<2)>>2]|0);l=m<<1;j=k+655376+(l<<3)|0;h[j>>3]=+h[j>>3]+ +(c[k+1310736+(n+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(n+2<<2)>>2]|0);m=m<<2;l=k+131084+(m<<2)|0;j=c[k+1310736+(n+3<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;l=k+131084+((m|1)<<2)|0;j=c[k+1310736+(n+4<<2)>>2]|0;if((c[l>>2]|0)<(j|0))c[l>>2]=j;l=k+131084+((m|2)<<2)|0;j=c[k+1310736+(n+5<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;j=k+131084+((m|3)<<2)|0;l=c[k+1310736+(n+6<<2)>>2]|0;if((c[j>>2]|0)<(l|0))c[j>>2]=l;e=e+1|0}while((e|0)<(p|0))}if((c[o>>2]|0)>0){l=0;do{f=k+12+(l<<2)|0;g=l<<1;D=k+655376+(g<<3)|0;h[D>>3]=+h[D>>3]/+(c[f>>2]|0);g=k+655376+((g|1)<<3)|0;h[g>>3]=+h[g>>3]/+(c[f>>2]|0);l=l+1|0}while((l|0)<(c[o>>2]|0));l=0}else l=0}else l=0}i=E;return l|0}function md(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;E=i;i=i+16|0;C=E;o=c[k>>2]|0;B=g+-1|0;if((f|0)>0){l=0;m=o;n=o+(($(B,f)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(f|0))break;else{m=m+2|0;n=n+2|0}}}A=f+-1|0;if((g|0)>0){l=0;m=o;n=o+(A<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(g|0))break;else{m=m+(f<<1)|0;n=n+(f<<1)|0}}}n=k+1179664|0;l=f+1|0;x=0-f|0;v=1-f|0;w=~f;a:do if((B|0)>1){y=(A|0)>1;p=(c[k+4>>2]|0)+l|0;z=1;e=e+l|0;o=o+(l<<1)|0;m=0;b:while(1){if(y){l=p;u=1;t=e;s=m;while(1){do if((d[t>>0]|0|0)>(j|0)){b[o>>1]=0;a[l>>0]=0;m=s}else{a[l>>0]=-1;m=b[o+(x<<1)>>1]|0;if(m<<16>>16>0){b[o>>1]=m;m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}p=b[o+(v<<1)>>1]|0;q=p<<16>>16;m=b[o+(w<<1)>>1]|0;r=m<<16>>16;e=m<<16>>16>0;if(p<<16>>16<=0){if(e){b[o>>1]=m;m=r*7|0;e=k+1310736+(m+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=k+1310736+(m+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+u;e=k+1310736+(m+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+z;e=k+1310736+(m+-3<<2)|0;if((c[e>>2]|0)<(u|0))c[e>>2]=u;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}m=b[o+-2>>1]|0;if(m<<16>>16>0){b[o>>1]=m;m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;m=k+1310736+(m+-3<<2)|0;if((c[m>>2]|0)>=(u|0)){m=s;break}c[m>>2]=u;m=s;break}else{m=s+1|0;if((s|0)>32767)break b;b[o>>1]=m;c[k+1179664+(s<<2)>>2]=m<<16>>16;s=s*7|0;c[k+1310736+(s<<2)>>2]=1;c[k+1310736+(s+1<<2)>>2]=u;c[k+1310736+(s+2<<2)>>2]=z;c[k+1310736+(s+3<<2)>>2]=u;c[k+1310736+(s+4<<2)>>2]=u;c[k+1310736+(s+5<<2)>>2]=z;c[k+1310736+(s+6<<2)>>2]=z;break}}if(e){m=c[k+1179664+(q+-1<<2)>>2]|0;q=c[k+1179664+(r+-1<<2)>>2]|0;if((m|0)>(q|0)){b[o>>1]=q;if((s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(m|0))c[p>>2]=q;e=e+1|0;if((e|0)>=(s|0)){m=q;break}else p=p+4|0}}else m=q}else{b[o>>1]=m;if((m|0)<(q|0)&(s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(q|0))c[p>>2]=m;e=e+1|0;if((e|0)>=(s|0))break;else p=p+4|0}}}m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}e=b[o+-2>>1]|0;if(e<<16>>16<=0){b[o>>1]=p;m=q*7|0;e=k+1310736+(m+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=k+1310736+(m+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+u;e=k+1310736+(m+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+z;e=k+1310736+(m+-4<<2)|0;if((c[e>>2]|0)>(u|0))c[e>>2]=u;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}m=c[k+1179664+(q+-1<<2)>>2]|0;q=c[k+1179664+((e<<16>>16)+-1<<2)>>2]|0;if((m|0)>(q|0)){b[o>>1]=q;if((s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(m|0))c[p>>2]=q;e=e+1|0;if((e|0)>=(s|0)){m=q;break}else p=p+4|0}}else m=q}else{b[o>>1]=m;if((m|0)<(q|0)&(s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(q|0))c[p>>2]=m;e=e+1|0;if((e|0)>=(s|0))break;else p=p+4|0}}}m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;m=k+1310736+(m+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+z;m=s}while(0);u=u+1|0;e=t+1|0;o=o+2|0;l=l+1|0;if((u|0)>=(A|0))break;else{t=e;s=m}}}else l=p;z=z+1|0;if((z|0)>=(B|0)){q=m;D=52;break a}else{p=l+2|0;e=e+2|0;o=o+4|0}}Me(3,3904,C);l=-1}else{q=0;D=52}while(0);if((D|0)==52){o=k+12|0;if((q|0)<1)m=1;else{e=1;m=1;while(1){l=c[n>>2]|0;if((l|0)==(e|0)){l=m;m=m+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[n>>2]=l;if((e|0)<(q|0)){e=e+1|0;n=n+4|0}else break}}p=k+8|0;l=m+-1|0;c[p>>2]=l;if(l){ek(o|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((m|0)>1){l=0;do{D=l<<2;c[k+131084+(D<<2)>>2]=f;c[k+131084+((D|1)<<2)>>2]=0;c[k+131084+((D|2)<<2)>>2]=g;c[k+131084+((D|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[p>>2]|0))}if((q|0)>0){o=0;do{n=(c[k+1179664+(o<<2)>>2]|0)+-1|0;e=o*7|0;l=k+12+(n<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(e<<2)>>2]|0);l=n<<1;m=k+655376+(l<<3)|0;h[m>>3]=+h[m>>3]+ +(c[k+1310736+(e+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(e+2<<2)>>2]|0);n=n<<2;l=k+131084+(n<<2)|0;m=c[k+1310736+(e+3<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;l=k+131084+((n|1)<<2)|0;m=c[k+1310736+(e+4<<2)>>2]|0;if((c[l>>2]|0)<(m|0))c[l>>2]=m;l=k+131084+((n|2)<<2)|0;m=c[k+1310736+(e+5<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;m=k+131084+((n|3)<<2)|0;l=c[k+1310736+(e+6<<2)>>2]|0;if((c[m>>2]|0)<(l|0))c[m>>2]=l;o=o+1|0}while((o|0)<(q|0))}if((c[p>>2]|0)>0){l=0;do{f=k+12+(l<<2)|0;g=l<<1;D=k+655376+(g<<3)|0;h[D>>3]=+h[D>>3]/+(c[f>>2]|0);g=k+655376+((g|1)<<3)|0;h[g>>3]=+h[g>>3]/+(c[f>>2]|0);l=l+1|0}while((l|0)<(c[p>>2]|0));l=0}else l=0}else l=0}i=E;return l|0}function nd(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;E=i;i=i+16|0;C=E;o=c[k>>2]|0;B=g+-1|0;if((f|0)>0){l=0;m=o;n=o+(($(B,f)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(f|0))break;else{m=m+2|0;n=n+2|0}}}A=f+-1|0;if((g|0)>0){l=0;m=o;n=o+(A<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(g|0))break;else{m=m+(f<<1)|0;n=n+(f<<1)|0}}}n=k+1179664|0;l=f+1|0;x=0-f|0;v=1-f|0;w=~f;a:do if((B|0)>1){y=(A|0)>1;p=(c[k+4>>2]|0)+l|0;z=1;e=e+(l<<1)|0;o=o+(l<<1)|0;m=0;b:while(1){if(y){l=p;u=1;t=e;s=m;while(1){do if((d[t+1>>0]|0|0)>(j|0)){b[o>>1]=0;a[l>>0]=0;m=s}else{a[l>>0]=-1;m=b[o+(x<<1)>>1]|0;if(m<<16>>16>0){b[o>>1]=m;m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}p=b[o+(v<<1)>>1]|0;q=p<<16>>16;m=b[o+(w<<1)>>1]|0;r=m<<16>>16;e=m<<16>>16>0;if(p<<16>>16<=0){if(e){b[o>>1]=m;m=r*7|0;e=k+1310736+(m+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=k+1310736+(m+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+u;e=k+1310736+(m+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+z;e=k+1310736+(m+-3<<2)|0;if((c[e>>2]|0)<(u|0))c[e>>2]=u;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}m=b[o+-2>>1]|0;if(m<<16>>16>0){b[o>>1]=m;m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;m=k+1310736+(m+-3<<2)|0;if((c[m>>2]|0)>=(u|0)){m=s;break}c[m>>2]=u;m=s;break}else{m=s+1|0;if((s|0)>32767)break b;b[o>>1]=m;c[k+1179664+(s<<2)>>2]=m<<16>>16;s=s*7|0;c[k+1310736+(s<<2)>>2]=1;c[k+1310736+(s+1<<2)>>2]=u;c[k+1310736+(s+2<<2)>>2]=z;c[k+1310736+(s+3<<2)>>2]=u;c[k+1310736+(s+4<<2)>>2]=u;c[k+1310736+(s+5<<2)>>2]=z;c[k+1310736+(s+6<<2)>>2]=z;break}}if(e){m=c[k+1179664+(q+-1<<2)>>2]|0;q=c[k+1179664+(r+-1<<2)>>2]|0;if((m|0)>(q|0)){b[o>>1]=q;if((s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(m|0))c[p>>2]=q;e=e+1|0;if((e|0)>=(s|0)){m=q;break}else p=p+4|0}}else m=q}else{b[o>>1]=m;if((m|0)<(q|0)&(s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(q|0))c[p>>2]=m;e=e+1|0;if((e|0)>=(s|0))break;else p=p+4|0}}}m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}e=b[o+-2>>1]|0;if(e<<16>>16<=0){b[o>>1]=p;m=q*7|0;e=k+1310736+(m+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=k+1310736+(m+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+u;e=k+1310736+(m+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+z;e=k+1310736+(m+-4<<2)|0;if((c[e>>2]|0)>(u|0))c[e>>2]=u;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}m=c[k+1179664+(q+-1<<2)>>2]|0;q=c[k+1179664+((e<<16>>16)+-1<<2)>>2]|0;if((m|0)>(q|0)){b[o>>1]=q;if((s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(m|0))c[p>>2]=q;e=e+1|0;if((e|0)>=(s|0)){m=q;break}else p=p+4|0}}else m=q}else{b[o>>1]=m;if((m|0)<(q|0)&(s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(q|0))c[p>>2]=m;e=e+1|0;if((e|0)>=(s|0))break;else p=p+4|0}}}m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;m=k+1310736+(m+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+z;m=s}while(0);u=u+1|0;e=t+2|0;o=o+2|0;l=l+1|0;if((u|0)>=(A|0))break;else{t=e;s=m}}}else l=p;z=z+1|0;if((z|0)>=(B|0)){q=m;D=52;break a}else{p=l+2|0;e=e+4|0;o=o+4|0}}Me(3,3904,C);l=-1}else{q=0;D=52}while(0);if((D|0)==52){o=k+12|0;if((q|0)<1)m=1;else{e=1;m=1;while(1){l=c[n>>2]|0;if((l|0)==(e|0)){l=m;m=m+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[n>>2]=l;if((e|0)<(q|0)){e=e+1|0;n=n+4|0}else break}}p=k+8|0;l=m+-1|0;c[p>>2]=l;if(l){ek(o|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((m|0)>1){l=0;do{D=l<<2;c[k+131084+(D<<2)>>2]=f;c[k+131084+((D|1)<<2)>>2]=0;c[k+131084+((D|2)<<2)>>2]=g;c[k+131084+((D|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[p>>2]|0))}if((q|0)>0){o=0;do{n=(c[k+1179664+(o<<2)>>2]|0)+-1|0;e=o*7|0;l=k+12+(n<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(e<<2)>>2]|0);l=n<<1;m=k+655376+(l<<3)|0;h[m>>3]=+h[m>>3]+ +(c[k+1310736+(e+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(e+2<<2)>>2]|0);n=n<<2;l=k+131084+(n<<2)|0;m=c[k+1310736+(e+3<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;l=k+131084+((n|1)<<2)|0;m=c[k+1310736+(e+4<<2)>>2]|0;if((c[l>>2]|0)<(m|0))c[l>>2]=m;l=k+131084+((n|2)<<2)|0;m=c[k+1310736+(e+5<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;m=k+131084+((n|3)<<2)|0;l=c[k+1310736+(e+6<<2)>>2]|0;if((c[m>>2]|0)<(l|0))c[m>>2]=l;o=o+1|0}while((o|0)<(q|0))}if((c[p>>2]|0)>0){l=0;do{f=k+12+(l<<2)|0;g=l<<1;D=k+655376+(g<<3)|0;h[D>>3]=+h[D>>3]/+(c[f>>2]|0);g=k+655376+((g|1)<<3)|0;h[g>>3]=+h[g>>3]/+(c[f>>2]|0);l=l+1|0}while((l|0)<(c[p>>2]|0));l=0}else l=0}else l=0}i=E;return l|0}function od(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;E=i;i=i+16|0;C=E;o=c[k>>2]|0;B=g+-1|0;if((f|0)>0){l=0;m=o;n=o+(($(B,f)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(f|0))break;else{m=m+2|0;n=n+2|0}}}A=f+-1|0;if((g|0)>0){l=0;m=o;n=o+(A<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(g|0))break;else{m=m+(f<<1)|0;n=n+(f<<1)|0}}}n=k+1179664|0;l=f+1|0;x=0-f|0;v=1-f|0;w=~f;a:do if((B|0)>1){y=(A|0)>1;p=(c[k+4>>2]|0)+l|0;z=1;e=e+(l<<1)|0;o=o+(l<<1)|0;m=0;b:while(1){if(y){l=p;u=1;t=e;s=m;while(1){do if((d[t>>0]|0|0)>(j|0)){b[o>>1]=0;a[l>>0]=0;m=s}else{a[l>>0]=-1;m=b[o+(x<<1)>>1]|0;if(m<<16>>16>0){b[o>>1]=m;m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}p=b[o+(v<<1)>>1]|0;q=p<<16>>16;m=b[o+(w<<1)>>1]|0;r=m<<16>>16;e=m<<16>>16>0;if(p<<16>>16<=0){if(e){b[o>>1]=m;m=r*7|0;e=k+1310736+(m+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=k+1310736+(m+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+u;e=k+1310736+(m+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+z;e=k+1310736+(m+-3<<2)|0;if((c[e>>2]|0)<(u|0))c[e>>2]=u;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}m=b[o+-2>>1]|0;if(m<<16>>16>0){b[o>>1]=m;m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;m=k+1310736+(m+-3<<2)|0;if((c[m>>2]|0)>=(u|0)){m=s;break}c[m>>2]=u;m=s;break}else{m=s+1|0;if((s|0)>32767)break b;b[o>>1]=m;c[k+1179664+(s<<2)>>2]=m<<16>>16;s=s*7|0;c[k+1310736+(s<<2)>>2]=1;c[k+1310736+(s+1<<2)>>2]=u;c[k+1310736+(s+2<<2)>>2]=z;c[k+1310736+(s+3<<2)>>2]=u;c[k+1310736+(s+4<<2)>>2]=u;c[k+1310736+(s+5<<2)>>2]=z;c[k+1310736+(s+6<<2)>>2]=z;break}}if(e){m=c[k+1179664+(q+-1<<2)>>2]|0;q=c[k+1179664+(r+-1<<2)>>2]|0;if((m|0)>(q|0)){b[o>>1]=q;if((s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(m|0))c[p>>2]=q;e=e+1|0;if((e|0)>=(s|0)){m=q;break}else p=p+4|0}}else m=q}else{b[o>>1]=m;if((m|0)<(q|0)&(s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(q|0))c[p>>2]=m;e=e+1|0;if((e|0)>=(s|0))break;else p=p+4|0}}}m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}e=b[o+-2>>1]|0;if(e<<16>>16<=0){b[o>>1]=p;m=q*7|0;e=k+1310736+(m+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=k+1310736+(m+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+u;e=k+1310736+(m+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+z;e=k+1310736+(m+-4<<2)|0;if((c[e>>2]|0)>(u|0))c[e>>2]=u;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}m=c[k+1179664+(q+-1<<2)>>2]|0;q=c[k+1179664+((e<<16>>16)+-1<<2)>>2]|0;if((m|0)>(q|0)){b[o>>1]=q;if((s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(m|0))c[p>>2]=q;e=e+1|0;if((e|0)>=(s|0)){m=q;break}else p=p+4|0}}else m=q}else{b[o>>1]=m;if((m|0)<(q|0)&(s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(q|0))c[p>>2]=m;e=e+1|0;if((e|0)>=(s|0))break;else p=p+4|0}}}m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;m=k+1310736+(m+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+z;m=s}while(0);u=u+1|0;e=t+2|0;o=o+2|0;l=l+1|0;if((u|0)>=(A|0))break;else{t=e;s=m}}}else l=p;z=z+1|0;if((z|0)>=(B|0)){q=m;D=52;break a}else{p=l+2|0;e=e+4|0;o=o+4|0}}Me(3,3904,C);l=-1}else{q=0;D=52}while(0);if((D|0)==52){o=k+12|0;if((q|0)<1)m=1;else{e=1;m=1;while(1){l=c[n>>2]|0;if((l|0)==(e|0)){l=m;m=m+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[n>>2]=l;if((e|0)<(q|0)){e=e+1|0;n=n+4|0}else break}}p=k+8|0;l=m+-1|0;c[p>>2]=l;if(l){ek(o|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((m|0)>1){l=0;do{D=l<<2;c[k+131084+(D<<2)>>2]=f;c[k+131084+((D|1)<<2)>>2]=0;c[k+131084+((D|2)<<2)>>2]=g;c[k+131084+((D|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[p>>2]|0))}if((q|0)>0){o=0;do{n=(c[k+1179664+(o<<2)>>2]|0)+-1|0;e=o*7|0;l=k+12+(n<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(e<<2)>>2]|0);l=n<<1;m=k+655376+(l<<3)|0;h[m>>3]=+h[m>>3]+ +(c[k+1310736+(e+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(e+2<<2)>>2]|0);n=n<<2;l=k+131084+(n<<2)|0;m=c[k+1310736+(e+3<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;l=k+131084+((n|1)<<2)|0;m=c[k+1310736+(e+4<<2)>>2]|0;if((c[l>>2]|0)<(m|0))c[l>>2]=m;l=k+131084+((n|2)<<2)|0;m=c[k+1310736+(e+5<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;m=k+131084+((n|3)<<2)|0;l=c[k+1310736+(e+6<<2)>>2]|0;if((c[m>>2]|0)<(l|0))c[m>>2]=l;o=o+1|0}while((o|0)<(q|0))}if((c[p>>2]|0)>0){l=0;do{f=k+12+(l<<2)|0;g=l<<1;D=k+655376+(g<<3)|0;h[D>>3]=+h[D>>3]/+(c[f>>2]|0);g=k+655376+((g|1)<<3)|0;h[g>>3]=+h[g>>3]/+(c[f>>2]|0);l=l+1|0}while((l|0)<(c[p>>2]|0));l=0}else l=0}else l=0}i=E;return l|0}function pd(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;E=i;i=i+16|0;C=E;o=c[k>>2]|0;B=g+-1|0;if((f|0)>0){l=0;m=o;n=o+(($(B,f)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(f|0))break;else{m=m+2|0;n=n+2|0}}}A=f+-1|0;if((g|0)>0){l=0;m=o;n=o+(A<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(g|0))break;else{m=m+(f<<1)|0;n=n+(f<<1)|0}}}n=k+1179664|0;m=f+1|0;x=0-f|0;v=1-f|0;w=~f;a:do if((B|0)>1){y=(A|0)>1;l=(c[k+4>>2]|0)+m|0;z=1;e=e+m|0;o=o+(m<<1)|0;j=j+m|0;m=0;b:while(1){if(y){u=1;t=e;s=m;while(1){do if((d[t>>0]|0)>(d[j>>0]|0)){b[o>>1]=0;a[l>>0]=0;m=s}else{a[l>>0]=-1;m=b[o+(x<<1)>>1]|0;if(m<<16>>16>0){b[o>>1]=m;m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}p=b[o+(v<<1)>>1]|0;q=p<<16>>16;m=b[o+(w<<1)>>1]|0;r=m<<16>>16;e=m<<16>>16>0;if(p<<16>>16<=0){if(e){b[o>>1]=m;m=r*7|0;e=k+1310736+(m+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=k+1310736+(m+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+u;e=k+1310736+(m+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+z;e=k+1310736+(m+-3<<2)|0;if((c[e>>2]|0)<(u|0))c[e>>2]=u;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}m=b[o+-2>>1]|0;if(m<<16>>16>0){b[o>>1]=m;m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;m=k+1310736+(m+-3<<2)|0;if((c[m>>2]|0)>=(u|0)){m=s;break}c[m>>2]=u;m=s;break}else{m=s+1|0;if((s|0)>32767)break b;b[o>>1]=m;c[k+1179664+(s<<2)>>2]=m<<16>>16;s=s*7|0;c[k+1310736+(s<<2)>>2]=1;c[k+1310736+(s+1<<2)>>2]=u;c[k+1310736+(s+2<<2)>>2]=z;c[k+1310736+(s+3<<2)>>2]=u;c[k+1310736+(s+4<<2)>>2]=u;c[k+1310736+(s+5<<2)>>2]=z;c[k+1310736+(s+6<<2)>>2]=z;break}}if(e){m=c[k+1179664+(q+-1<<2)>>2]|0;q=c[k+1179664+(r+-1<<2)>>2]|0;if((m|0)>(q|0)){b[o>>1]=q;if((s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(m|0))c[p>>2]=q;e=e+1|0;if((e|0)>=(s|0)){m=q;break}else p=p+4|0}}else m=q}else{b[o>>1]=m;if((m|0)<(q|0)&(s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(q|0))c[p>>2]=m;e=e+1|0;if((e|0)>=(s|0))break;else p=p+4|0}}}m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}e=b[o+-2>>1]|0;if(e<<16>>16<=0){b[o>>1]=p;m=q*7|0;e=k+1310736+(m+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=k+1310736+(m+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+u;e=k+1310736+(m+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+z;e=k+1310736+(m+-4<<2)|0;if((c[e>>2]|0)>(u|0))c[e>>2]=u;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}m=c[k+1179664+(q+-1<<2)>>2]|0;q=c[k+1179664+((e<<16>>16)+-1<<2)>>2]|0;if((m|0)>(q|0)){b[o>>1]=q;if((s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(m|0))c[p>>2]=q;e=e+1|0;if((e|0)>=(s|0)){m=q;break}else p=p+4|0}}else m=q}else{b[o>>1]=m;if((m|0)<(q|0)&(s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(q|0))c[p>>2]=m;e=e+1|0;if((e|0)>=(s|0))break;else p=p+4|0}}}m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;m=k+1310736+(m+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+z;m=s}while(0);u=u+1|0;e=t+1|0;j=j+1|0;o=o+2|0;l=l+1|0;if((u|0)>=(A|0))break;else{t=e;s=m}}}z=z+1|0;if((z|0)>=(B|0)){p=m;D=52;break a}else{l=l+2|0;e=e+2|0;o=o+4|0;j=j+2|0}}Me(3,3904,C);l=-1}else{p=0;D=52}while(0);if((D|0)==52){o=k+12|0;if((p|0)<1)m=1;else{e=1;m=1;while(1){l=c[n>>2]|0;if((l|0)==(e|0)){l=m;m=m+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[n>>2]=l;if((e|0)<(p|0)){e=e+1|0;n=n+4|0}else break}}j=k+8|0;l=m+-1|0;c[j>>2]=l;if(l){ek(o|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((m|0)>1){l=0;do{D=l<<2;c[k+131084+(D<<2)>>2]=f;c[k+131084+((D|1)<<2)>>2]=0;c[k+131084+((D|2)<<2)>>2]=g;c[k+131084+((D|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[j>>2]|0))}if((p|0)>0){o=0;do{n=(c[k+1179664+(o<<2)>>2]|0)+-1|0;e=o*7|0;l=k+12+(n<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(e<<2)>>2]|0);l=n<<1;m=k+655376+(l<<3)|0;h[m>>3]=+h[m>>3]+ +(c[k+1310736+(e+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(e+2<<2)>>2]|0);n=n<<2;l=k+131084+(n<<2)|0;m=c[k+1310736+(e+3<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;l=k+131084+((n|1)<<2)|0;m=c[k+1310736+(e+4<<2)>>2]|0;if((c[l>>2]|0)<(m|0))c[l>>2]=m;l=k+131084+((n|2)<<2)|0;m=c[k+1310736+(e+5<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;m=k+131084+((n|3)<<2)|0;l=c[k+1310736+(e+6<<2)>>2]|0;if((c[m>>2]|0)<(l|0))c[m>>2]=l;o=o+1|0}while((o|0)<(p|0))}if((c[j>>2]|0)>0){l=0;do{f=k+12+(l<<2)|0;g=l<<1;D=k+655376+(g<<3)|0;h[D>>3]=+h[D>>3]/+(c[f>>2]|0);g=k+655376+((g|1)<<3)|0;h[g>>3]=+h[g>>3]/+(c[f>>2]|0);l=l+1|0}while((l|0)<(c[j>>2]|0));l=0}else l=0}else l=0}i=E;return l|0}function qd(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;F=i;i=i+16|0;B=F;D=(f|0)/2|0;E=(g|0)/2|0;o=c[k>>2]|0;A=E+-1|0;if((f|0)>1){l=0;m=o;n=o+(($(A,D)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(D|0))break;else{m=m+2|0;n=n+2|0}}}y=j*3|0;z=D+-1|0;if((g|0)>1){l=0;j=o;m=o+(z<<1)|0;while(1){b[m>>1]=0;b[j>>1]=0;l=l+1|0;if((l|0)>=(E|0))break;else{j=j+(D<<1)|0;m=m+(D<<1)|0}}}m=k+1179664|0;j=D+1|0;v=0-D|0;t=1-D|0;u=~D;s=(f*3|0)+12|0;a:do if((A|0)>1){w=(z|0)>1;l=(c[k+4>>2]|0)+j|0;x=1;n=e+((f*6|0)+6)|0;g=o+(j<<1)|0;j=0;b:while(1){if(w){r=1;q=n;p=j;while(1){do if(((d[q+1>>0]|0)+(d[q>>0]|0)+(d[q+2>>0]|0)|0)>(y|0)){a[l>>0]=-1;j=b[g+(v<<1)>>1]|0;if(j<<16>>16>0){b[g>>1]=j;j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}e=b[g+(t<<1)>>1]|0;f=e<<16>>16;j=b[g+(u<<1)>>1]|0;o=j<<16>>16;n=j<<16>>16>0;if(e<<16>>16<=0){if(n){b[g>>1]=j;j=o*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+r;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+x;n=k+1310736+(j+-3<<2)|0;if((c[n>>2]|0)<(r|0))c[n>>2]=r;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}j=b[g+-2>>1]|0;if(j<<16>>16>0){b[g>>1]=j;j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;j=k+1310736+(j+-3<<2)|0;if((c[j>>2]|0)>=(r|0)){j=p;break}c[j>>2]=r;j=p;break}else{j=p+1|0;if((p|0)>32767)break b;b[g>>1]=j;c[k+1179664+(p<<2)>>2]=j<<16>>16;p=p*7|0;c[k+1310736+(p<<2)>>2]=1;c[k+1310736+(p+1<<2)>>2]=r;c[k+1310736+(p+2<<2)>>2]=x;c[k+1310736+(p+3<<2)>>2]=r;c[k+1310736+(p+4<<2)>>2]=r;c[k+1310736+(p+5<<2)>>2]=x;c[k+1310736+(p+6<<2)>>2]=x;break}}if(n){j=c[k+1179664+(f+-1<<2)>>2]|0;f=c[k+1179664+(o+-1<<2)>>2]|0;if((j|0)>(f|0)){b[g>>1]=f;if((p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(j|0))c[e>>2]=f;n=n+1|0;if((n|0)>=(p|0)){j=f;break}else e=e+4|0}}else j=f}else{b[g>>1]=j;if((j|0)<(f|0)&(p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(f|0))c[e>>2]=j;n=n+1|0;if((n|0)>=(p|0))break;else e=e+4|0}}}j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}n=b[g+-2>>1]|0;if(n<<16>>16<=0){b[g>>1]=e;j=f*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+r;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+x;n=k+1310736+(j+-4<<2)|0;if((c[n>>2]|0)>(r|0))c[n>>2]=r;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}j=c[k+1179664+(f+-1<<2)>>2]|0;f=c[k+1179664+((n<<16>>16)+-1<<2)>>2]|0;if((j|0)>(f|0)){b[g>>1]=f;if((p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(j|0))c[e>>2]=f;n=n+1|0;if((n|0)>=(p|0)){j=f;break}else e=e+4|0}}else j=f}else{b[g>>1]=j;if((j|0)<(f|0)&(p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(f|0))c[e>>2]=j;n=n+1|0;if((n|0)>=(p|0))break;else e=e+4|0}}}j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;j=k+1310736+(j+-5<<2)|0;c[j>>2]=(c[j>>2]|0)+x;j=p}else{b[g>>1]=0;a[l>>0]=0;j=p}while(0);r=r+1|0;n=q+6|0;g=g+2|0;l=l+1|0;if((r|0)>=(z|0))break;else{q=n;p=j}}}x=x+1|0;if((x|0)>=(A|0)){f=j;C=52;break a}else{l=l+2|0;n=n+s|0;g=g+4|0}}Me(3,3904,B);l=-1}else{f=0;C=52}while(0);if((C|0)==52){g=k+12|0;if((f|0)<1)j=1;else{n=1;j=1;while(1){l=c[m>>2]|0;if((l|0)==(n|0)){l=j;j=j+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[m>>2]=l;if((n|0)<(f|0)){n=n+1|0;m=m+4|0}else break}}e=k+8|0;l=j+-1|0;c[e>>2]=l;if(l){ek(g|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((j|0)>1){l=0;do{C=l<<2;c[k+131084+(C<<2)>>2]=D;c[k+131084+((C|1)<<2)>>2]=0;c[k+131084+((C|2)<<2)>>2]=E;c[k+131084+((C|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[e>>2]|0))}if((f|0)>0){g=0;do{m=(c[k+1179664+(g<<2)>>2]|0)+-1|0;n=g*7|0;l=k+12+(m<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(n<<2)>>2]|0);l=m<<1;j=k+655376+(l<<3)|0;h[j>>3]=+h[j>>3]+ +(c[k+1310736+(n+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(n+2<<2)>>2]|0);m=m<<2;l=k+131084+(m<<2)|0;j=c[k+1310736+(n+3<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;l=k+131084+((m|1)<<2)|0;j=c[k+1310736+(n+4<<2)>>2]|0;if((c[l>>2]|0)<(j|0))c[l>>2]=j;l=k+131084+((m|2)<<2)|0;j=c[k+1310736+(n+5<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;j=k+131084+((m|3)<<2)|0;l=c[k+1310736+(n+6<<2)>>2]|0;if((c[j>>2]|0)<(l|0))c[j>>2]=l;g=g+1|0}while((g|0)<(f|0))}if((c[e>>2]|0)>0){l=0;do{D=k+12+(l<<2)|0;E=l<<1;C=k+655376+(E<<3)|0;h[C>>3]=+h[C>>3]/+(c[D>>2]|0);E=k+655376+((E|1)<<3)|0;h[E>>3]=+h[E>>3]/+(c[D>>2]|0);l=l+1|0}while((l|0)<(c[e>>2]|0));l=0}else l=0}else l=0}i=F;return l|0}function rd(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;F=i;i=i+16|0;B=F;D=(f|0)/2|0;E=(g|0)/2|0;o=c[k>>2]|0;A=E+-1|0;if((f|0)>1){l=0;m=o;n=o+(($(A,D)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(D|0))break;else{m=m+2|0;n=n+2|0}}}y=j*3|0;z=D+-1|0;if((g|0)>1){l=0;j=o;m=o+(z<<1)|0;while(1){b[m>>1]=0;b[j>>1]=0;l=l+1|0;if((l|0)>=(E|0))break;else{j=j+(D<<1)|0;m=m+(D<<1)|0}}}m=k+1179664|0;j=D+1|0;v=0-D|0;t=1-D|0;u=~D;s=(f<<1)+8|0;a:do if((A|0)>1){w=(z|0)>1;l=(c[k+4>>2]|0)+j|0;x=1;n=e+((f<<2)+4)|0;g=o+(j<<1)|0;j=0;b:while(1){if(w){r=1;q=n;p=j;while(1){f=d[q>>0]|0;o=d[q+1>>0]|0;do if(((f&248)+10+(f<<5&224)+(o>>>3&28)+(o<<3&248)|0)>(y|0)){a[l>>0]=-1;j=b[g+(v<<1)>>1]|0;if(j<<16>>16>0){b[g>>1]=j;j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}e=b[g+(t<<1)>>1]|0;f=e<<16>>16;j=b[g+(u<<1)>>1]|0;o=j<<16>>16;n=j<<16>>16>0;if(e<<16>>16<=0){if(n){b[g>>1]=j;j=o*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+r;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+x;n=k+1310736+(j+-3<<2)|0;if((c[n>>2]|0)<(r|0))c[n>>2]=r;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}j=b[g+-2>>1]|0;if(j<<16>>16>0){b[g>>1]=j;j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;j=k+1310736+(j+-3<<2)|0;if((c[j>>2]|0)>=(r|0)){j=p;break}c[j>>2]=r;j=p;break}else{j=p+1|0;if((p|0)>32767)break b;b[g>>1]=j;c[k+1179664+(p<<2)>>2]=j<<16>>16;p=p*7|0;c[k+1310736+(p<<2)>>2]=1;c[k+1310736+(p+1<<2)>>2]=r;c[k+1310736+(p+2<<2)>>2]=x;c[k+1310736+(p+3<<2)>>2]=r;c[k+1310736+(p+4<<2)>>2]=r;c[k+1310736+(p+5<<2)>>2]=x;c[k+1310736+(p+6<<2)>>2]=x;break}}if(n){j=c[k+1179664+(f+-1<<2)>>2]|0;f=c[k+1179664+(o+-1<<2)>>2]|0;if((j|0)>(f|0)){b[g>>1]=f;if((p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(j|0))c[e>>2]=f;n=n+1|0;if((n|0)>=(p|0)){j=f;break}else e=e+4|0}}else j=f}else{b[g>>1]=j;if((j|0)<(f|0)&(p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(f|0))c[e>>2]=j;n=n+1|0;if((n|0)>=(p|0))break;else e=e+4|0}}}j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}n=b[g+-2>>1]|0;if(n<<16>>16<=0){b[g>>1]=e;j=f*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+r;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+x;n=k+1310736+(j+-4<<2)|0;if((c[n>>2]|0)>(r|0))c[n>>2]=r;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}j=c[k+1179664+(f+-1<<2)>>2]|0;f=c[k+1179664+((n<<16>>16)+-1<<2)>>2]|0;if((j|0)>(f|0)){b[g>>1]=f;if((p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(j|0))c[e>>2]=f;n=n+1|0;if((n|0)>=(p|0)){j=f;break}else e=e+4|0}}else j=f}else{b[g>>1]=j;if((j|0)<(f|0)&(p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(f|0))c[e>>2]=j;n=n+1|0;if((n|0)>=(p|0))break;else e=e+4|0}}}j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;j=k+1310736+(j+-5<<2)|0;c[j>>2]=(c[j>>2]|0)+x;j=p}else{b[g>>1]=0;a[l>>0]=0;j=p}while(0);r=r+1|0;n=q+4|0;g=g+2|0;l=l+1|0;if((r|0)>=(z|0))break;else{q=n;p=j}}}x=x+1|0;if((x|0)>=(A|0)){f=j;C=52;break a}else{l=l+2|0;n=n+s|0;g=g+4|0}}Me(3,3904,B);l=-1}else{f=0;C=52}while(0);if((C|0)==52){g=k+12|0;if((f|0)<1)j=1;else{n=1;j=1;while(1){l=c[m>>2]|0;if((l|0)==(n|0)){l=j;j=j+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[m>>2]=l;if((n|0)<(f|0)){n=n+1|0;m=m+4|0}else break}}e=k+8|0;l=j+-1|0;c[e>>2]=l;if(l){ek(g|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((j|0)>1){l=0;do{C=l<<2;c[k+131084+(C<<2)>>2]=D;c[k+131084+((C|1)<<2)>>2]=0;c[k+131084+((C|2)<<2)>>2]=E;c[k+131084+((C|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[e>>2]|0))}if((f|0)>0){g=0;do{m=(c[k+1179664+(g<<2)>>2]|0)+-1|0;n=g*7|0;l=k+12+(m<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(n<<2)>>2]|0);l=m<<1;j=k+655376+(l<<3)|0;h[j>>3]=+h[j>>3]+ +(c[k+1310736+(n+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(n+2<<2)>>2]|0);m=m<<2;l=k+131084+(m<<2)|0;j=c[k+1310736+(n+3<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;l=k+131084+((m|1)<<2)|0;j=c[k+1310736+(n+4<<2)>>2]|0;if((c[l>>2]|0)<(j|0))c[l>>2]=j;l=k+131084+((m|2)<<2)|0;j=c[k+1310736+(n+5<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;j=k+131084+((m|3)<<2)|0;l=c[k+1310736+(n+6<<2)>>2]|0;if((c[j>>2]|0)<(l|0))c[j>>2]=l;g=g+1|0}while((g|0)<(f|0))}if((c[e>>2]|0)>0){l=0;do{D=k+12+(l<<2)|0;E=l<<1;C=k+655376+(E<<3)|0;h[C>>3]=+h[C>>3]/+(c[D>>2]|0);E=k+655376+((E|1)<<3)|0;h[E>>3]=+h[E>>3]/+(c[D>>2]|0);l=l+1|0}while((l|0)<(c[e>>2]|0));l=0}else l=0}else l=0}i=F;return l|0}function sd(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;F=i;i=i+16|0;B=F;D=(f|0)/2|0;E=(g|0)/2|0;o=c[k>>2]|0;A=E+-1|0;if((f|0)>1){l=0;m=o;n=o+(($(A,D)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(D|0))break;else{m=m+2|0;n=n+2|0}}}y=j*3|0;z=D+-1|0;if((g|0)>1){l=0;j=o;m=o+(z<<1)|0;while(1){b[m>>1]=0;b[j>>1]=0;l=l+1|0;if((l|0)>=(E|0))break;else{j=j+(D<<1)|0;m=m+(D<<1)|0}}}m=k+1179664|0;j=D+1|0;v=0-D|0;t=1-D|0;u=~D;s=(f<<2)+16|0;a:do if((A|0)>1){w=(z|0)>1;l=(c[k+4>>2]|0)+j|0;x=1;n=e+((f<<3)+8)|0;g=o+(j<<1)|0;j=0;b:while(1){if(w){r=1;q=n;p=j;while(1){do if(((d[q+1>>0]|0)+(d[q>>0]|0)+(d[q+2>>0]|0)|0)>(y|0)){a[l>>0]=-1;j=b[g+(v<<1)>>1]|0;if(j<<16>>16>0){b[g>>1]=j;j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}e=b[g+(t<<1)>>1]|0;f=e<<16>>16;j=b[g+(u<<1)>>1]|0;o=j<<16>>16;n=j<<16>>16>0;if(e<<16>>16<=0){if(n){b[g>>1]=j;j=o*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+r;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+x;n=k+1310736+(j+-3<<2)|0;if((c[n>>2]|0)<(r|0))c[n>>2]=r;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}j=b[g+-2>>1]|0;if(j<<16>>16>0){b[g>>1]=j;j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;j=k+1310736+(j+-3<<2)|0;if((c[j>>2]|0)>=(r|0)){j=p;break}c[j>>2]=r;j=p;break}else{j=p+1|0;if((p|0)>32767)break b;b[g>>1]=j;c[k+1179664+(p<<2)>>2]=j<<16>>16;p=p*7|0;c[k+1310736+(p<<2)>>2]=1;c[k+1310736+(p+1<<2)>>2]=r;c[k+1310736+(p+2<<2)>>2]=x;c[k+1310736+(p+3<<2)>>2]=r;c[k+1310736+(p+4<<2)>>2]=r;c[k+1310736+(p+5<<2)>>2]=x;c[k+1310736+(p+6<<2)>>2]=x;break}}if(n){j=c[k+1179664+(f+-1<<2)>>2]|0;f=c[k+1179664+(o+-1<<2)>>2]|0;if((j|0)>(f|0)){b[g>>1]=f;if((p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(j|0))c[e>>2]=f;n=n+1|0;if((n|0)>=(p|0)){j=f;break}else e=e+4|0}}else j=f}else{b[g>>1]=j;if((j|0)<(f|0)&(p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(f|0))c[e>>2]=j;n=n+1|0;if((n|0)>=(p|0))break;else e=e+4|0}}}j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}n=b[g+-2>>1]|0;if(n<<16>>16<=0){b[g>>1]=e;j=f*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+r;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+x;n=k+1310736+(j+-4<<2)|0;if((c[n>>2]|0)>(r|0))c[n>>2]=r;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}j=c[k+1179664+(f+-1<<2)>>2]|0;f=c[k+1179664+((n<<16>>16)+-1<<2)>>2]|0;if((j|0)>(f|0)){b[g>>1]=f;if((p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(j|0))c[e>>2]=f;n=n+1|0;if((n|0)>=(p|0)){j=f;break}else e=e+4|0}}else j=f}else{b[g>>1]=j;if((j|0)<(f|0)&(p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(f|0))c[e>>2]=j;n=n+1|0;if((n|0)>=(p|0))break;else e=e+4|0}}}j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;j=k+1310736+(j+-5<<2)|0;c[j>>2]=(c[j>>2]|0)+x;j=p}else{b[g>>1]=0;a[l>>0]=0;j=p}while(0);r=r+1|0;n=q+8|0;g=g+2|0;l=l+1|0;if((r|0)>=(z|0))break;else{q=n;p=j}}}x=x+1|0;if((x|0)>=(A|0)){f=j;C=52;break a}else{l=l+2|0;n=n+s|0;g=g+4|0}}Me(3,3904,B);l=-1}else{f=0;C=52}while(0);if((C|0)==52){g=k+12|0;if((f|0)<1)j=1;else{n=1;j=1;while(1){l=c[m>>2]|0;if((l|0)==(n|0)){l=j;j=j+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[m>>2]=l;if((n|0)<(f|0)){n=n+1|0;m=m+4|0}else break}}e=k+8|0;l=j+-1|0;c[e>>2]=l;if(l){ek(g|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((j|0)>1){l=0;do{C=l<<2;c[k+131084+(C<<2)>>2]=D;c[k+131084+((C|1)<<2)>>2]=0;c[k+131084+((C|2)<<2)>>2]=E;c[k+131084+((C|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[e>>2]|0))}if((f|0)>0){g=0;do{m=(c[k+1179664+(g<<2)>>2]|0)+-1|0;n=g*7|0;l=k+12+(m<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(n<<2)>>2]|0);l=m<<1;j=k+655376+(l<<3)|0;h[j>>3]=+h[j>>3]+ +(c[k+1310736+(n+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(n+2<<2)>>2]|0);m=m<<2;l=k+131084+(m<<2)|0;j=c[k+1310736+(n+3<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;l=k+131084+((m|1)<<2)|0;j=c[k+1310736+(n+4<<2)>>2]|0;if((c[l>>2]|0)<(j|0))c[l>>2]=j;l=k+131084+((m|2)<<2)|0;j=c[k+1310736+(n+5<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;j=k+131084+((m|3)<<2)|0;l=c[k+1310736+(n+6<<2)>>2]|0;if((c[j>>2]|0)<(l|0))c[j>>2]=l;g=g+1|0}while((g|0)<(f|0))}if((c[e>>2]|0)>0){l=0;do{D=k+12+(l<<2)|0;E=l<<1;C=k+655376+(E<<3)|0;h[C>>3]=+h[C>>3]/+(c[D>>2]|0);E=k+655376+((E|1)<<3)|0;h[E>>3]=+h[E>>3]/+(c[D>>2]|0);l=l+1|0}while((l|0)<(c[e>>2]|0));l=0}else l=0}else l=0}i=F;return l|0}function td(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;F=i;i=i+16|0;B=F;D=(f|0)/2|0;E=(g|0)/2|0;o=c[k>>2]|0;A=E+-1|0;if((f|0)>1){l=0;m=o;n=o+(($(A,D)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(D|0))break;else{m=m+2|0;n=n+2|0}}}y=j*3|0;z=D+-1|0;if((g|0)>1){l=0;j=o;m=o+(z<<1)|0;while(1){b[m>>1]=0;b[j>>1]=0;l=l+1|0;if((l|0)>=(E|0))break;else{j=j+(D<<1)|0;m=m+(D<<1)|0}}}m=k+1179664|0;j=D+1|0;v=0-D|0;t=1-D|0;u=~D;s=(f<<1)+8|0;a:do if((A|0)>1){w=(z|0)>1;l=(c[k+4>>2]|0)+j|0;x=1;n=e+((f<<2)+4)|0;g=o+(j<<1)|0;j=0;b:while(1){if(w){r=1;q=n;p=j;while(1){o=d[q>>0]|0;do if(((o&240)+24+(o<<4&240)+((d[q+1>>0]|0)&240)|0)>(y|0)){a[l>>0]=-1;j=b[g+(v<<1)>>1]|0;if(j<<16>>16>0){b[g>>1]=j;j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}e=b[g+(t<<1)>>1]|0;f=e<<16>>16;j=b[g+(u<<1)>>1]|0;o=j<<16>>16;n=j<<16>>16>0;if(e<<16>>16<=0){if(n){b[g>>1]=j;j=o*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+r;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+x;n=k+1310736+(j+-3<<2)|0;if((c[n>>2]|0)<(r|0))c[n>>2]=r;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}j=b[g+-2>>1]|0;if(j<<16>>16>0){b[g>>1]=j;j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;j=k+1310736+(j+-3<<2)|0;if((c[j>>2]|0)>=(r|0)){j=p;break}c[j>>2]=r;j=p;break}else{j=p+1|0;if((p|0)>32767)break b;b[g>>1]=j;c[k+1179664+(p<<2)>>2]=j<<16>>16;p=p*7|0;c[k+1310736+(p<<2)>>2]=1;c[k+1310736+(p+1<<2)>>2]=r;c[k+1310736+(p+2<<2)>>2]=x;c[k+1310736+(p+3<<2)>>2]=r;c[k+1310736+(p+4<<2)>>2]=r;c[k+1310736+(p+5<<2)>>2]=x;c[k+1310736+(p+6<<2)>>2]=x;break}}if(n){j=c[k+1179664+(f+-1<<2)>>2]|0;f=c[k+1179664+(o+-1<<2)>>2]|0;if((j|0)>(f|0)){b[g>>1]=f;if((p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(j|0))c[e>>2]=f;n=n+1|0;if((n|0)>=(p|0)){j=f;break}else e=e+4|0}}else j=f}else{b[g>>1]=j;if((j|0)<(f|0)&(p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(f|0))c[e>>2]=j;n=n+1|0;if((n|0)>=(p|0))break;else e=e+4|0}}}j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}n=b[g+-2>>1]|0;if(n<<16>>16<=0){b[g>>1]=e;j=f*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+r;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+x;n=k+1310736+(j+-4<<2)|0;if((c[n>>2]|0)>(r|0))c[n>>2]=r;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}j=c[k+1179664+(f+-1<<2)>>2]|0;f=c[k+1179664+((n<<16>>16)+-1<<2)>>2]|0;if((j|0)>(f|0)){b[g>>1]=f;if((p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(j|0))c[e>>2]=f;n=n+1|0;if((n|0)>=(p|0)){j=f;break}else e=e+4|0}}else j=f}else{b[g>>1]=j;if((j|0)<(f|0)&(p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(f|0))c[e>>2]=j;n=n+1|0;if((n|0)>=(p|0))break;else e=e+4|0}}}j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;j=k+1310736+(j+-5<<2)|0;c[j>>2]=(c[j>>2]|0)+x;j=p}else{b[g>>1]=0;a[l>>0]=0;j=p}while(0);r=r+1|0;n=q+4|0;g=g+2|0;l=l+1|0;if((r|0)>=(z|0))break;else{q=n;p=j}}}x=x+1|0;if((x|0)>=(A|0)){f=j;C=52;break a}else{l=l+2|0;n=n+s|0;g=g+4|0}}Me(3,3904,B);l=-1}else{f=0;C=52}while(0);if((C|0)==52){g=k+12|0;if((f|0)<1)j=1;else{n=1;j=1;while(1){l=c[m>>2]|0;if((l|0)==(n|0)){l=j;j=j+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[m>>2]=l;if((n|0)<(f|0)){n=n+1|0;m=m+4|0}else break}}e=k+8|0;l=j+-1|0;c[e>>2]=l;if(l){ek(g|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((j|0)>1){l=0;do{C=l<<2;c[k+131084+(C<<2)>>2]=D;c[k+131084+((C|1)<<2)>>2]=0;c[k+131084+((C|2)<<2)>>2]=E;c[k+131084+((C|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[e>>2]|0))}if((f|0)>0){g=0;do{m=(c[k+1179664+(g<<2)>>2]|0)+-1|0;n=g*7|0;l=k+12+(m<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(n<<2)>>2]|0);l=m<<1;j=k+655376+(l<<3)|0;h[j>>3]=+h[j>>3]+ +(c[k+1310736+(n+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(n+2<<2)>>2]|0);m=m<<2;l=k+131084+(m<<2)|0;j=c[k+1310736+(n+3<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;l=k+131084+((m|1)<<2)|0;j=c[k+1310736+(n+4<<2)>>2]|0;if((c[l>>2]|0)<(j|0))c[l>>2]=j;l=k+131084+((m|2)<<2)|0;j=c[k+1310736+(n+5<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;j=k+131084+((m|3)<<2)|0;l=c[k+1310736+(n+6<<2)>>2]|0;if((c[j>>2]|0)<(l|0))c[j>>2]=l;g=g+1|0}while((g|0)<(f|0))}if((c[e>>2]|0)>0){l=0;do{D=k+12+(l<<2)|0;E=l<<1;C=k+655376+(E<<3)|0;h[C>>3]=+h[C>>3]/+(c[D>>2]|0);E=k+655376+((E|1)<<3)|0;h[E>>3]=+h[E>>3]/+(c[D>>2]|0);l=l+1|0}while((l|0)<(c[e>>2]|0));l=0}else l=0}else l=0}i=F;return l|0}function ud(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;F=i;i=i+16|0;B=F;D=(f|0)/2|0;E=(g|0)/2|0;o=c[k>>2]|0;A=E+-1|0;if((f|0)>1){l=0;m=o;n=o+(($(A,D)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(D|0))break;else{m=m+2|0;n=n+2|0}}}y=j*3|0;z=D+-1|0;if((g|0)>1){l=0;j=o;m=o+(z<<1)|0;while(1){b[m>>1]=0;b[j>>1]=0;l=l+1|0;if((l|0)>=(E|0))break;else{j=j+(D<<1)|0;m=m+(D<<1)|0}}}m=k+1179664|0;j=D+1|0;v=0-D|0;t=1-D|0;u=~D;s=(f<<1)+8|0;a:do if((A|0)>1){w=(z|0)>1;l=(c[k+4>>2]|0)+j|0;x=1;n=e+((f<<2)+4)|0;g=o+(j<<1)|0;j=0;b:while(1){if(w){r=1;q=n;p=j;while(1){f=d[q>>0]|0;o=d[q+1>>0]|0;do if(((f&248)+12+(f<<5&224)+(o>>>3&24)+(o<<2&248)|0)>(y|0)){a[l>>0]=-1;j=b[g+(v<<1)>>1]|0;if(j<<16>>16>0){b[g>>1]=j;j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}e=b[g+(t<<1)>>1]|0;f=e<<16>>16;j=b[g+(u<<1)>>1]|0;o=j<<16>>16;n=j<<16>>16>0;if(e<<16>>16<=0){if(n){b[g>>1]=j;j=o*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+r;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+x;n=k+1310736+(j+-3<<2)|0;if((c[n>>2]|0)<(r|0))c[n>>2]=r;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}j=b[g+-2>>1]|0;if(j<<16>>16>0){b[g>>1]=j;j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;j=k+1310736+(j+-3<<2)|0;if((c[j>>2]|0)>=(r|0)){j=p;break}c[j>>2]=r;j=p;break}else{j=p+1|0;if((p|0)>32767)break b;b[g>>1]=j;c[k+1179664+(p<<2)>>2]=j<<16>>16;p=p*7|0;c[k+1310736+(p<<2)>>2]=1;c[k+1310736+(p+1<<2)>>2]=r;c[k+1310736+(p+2<<2)>>2]=x;c[k+1310736+(p+3<<2)>>2]=r;c[k+1310736+(p+4<<2)>>2]=r;c[k+1310736+(p+5<<2)>>2]=x;c[k+1310736+(p+6<<2)>>2]=x;break}}if(n){j=c[k+1179664+(f+-1<<2)>>2]|0;f=c[k+1179664+(o+-1<<2)>>2]|0;if((j|0)>(f|0)){b[g>>1]=f;if((p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(j|0))c[e>>2]=f;n=n+1|0;if((n|0)>=(p|0)){j=f;break}else e=e+4|0}}else j=f}else{b[g>>1]=j;if((j|0)<(f|0)&(p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(f|0))c[e>>2]=j;n=n+1|0;if((n|0)>=(p|0))break;else e=e+4|0}}}j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}n=b[g+-2>>1]|0;if(n<<16>>16<=0){b[g>>1]=e;j=f*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+r;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+x;n=k+1310736+(j+-4<<2)|0;if((c[n>>2]|0)>(r|0))c[n>>2]=r;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}j=c[k+1179664+(f+-1<<2)>>2]|0;f=c[k+1179664+((n<<16>>16)+-1<<2)>>2]|0;if((j|0)>(f|0)){b[g>>1]=f;if((p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(j|0))c[e>>2]=f;n=n+1|0;if((n|0)>=(p|0)){j=f;break}else e=e+4|0}}else j=f}else{b[g>>1]=j;if((j|0)<(f|0)&(p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(f|0))c[e>>2]=j;n=n+1|0;if((n|0)>=(p|0))break;else e=e+4|0}}}j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;j=k+1310736+(j+-5<<2)|0;c[j>>2]=(c[j>>2]|0)+x;j=p}else{b[g>>1]=0;a[l>>0]=0;j=p}while(0);r=r+1|0;n=q+4|0;g=g+2|0;l=l+1|0;if((r|0)>=(z|0))break;else{q=n;p=j}}}x=x+1|0;if((x|0)>=(A|0)){f=j;C=52;break a}else{l=l+2|0;n=n+s|0;g=g+4|0}}Me(3,3904,B);l=-1}else{f=0;C=52}while(0);if((C|0)==52){g=k+12|0;if((f|0)<1)j=1;else{n=1;j=1;while(1){l=c[m>>2]|0;if((l|0)==(n|0)){l=j;j=j+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[m>>2]=l;if((n|0)<(f|0)){n=n+1|0;m=m+4|0}else break}}e=k+8|0;l=j+-1|0;c[e>>2]=l;if(l){ek(g|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((j|0)>1){l=0;do{C=l<<2;c[k+131084+(C<<2)>>2]=D;c[k+131084+((C|1)<<2)>>2]=0;c[k+131084+((C|2)<<2)>>2]=E;c[k+131084+((C|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[e>>2]|0))}if((f|0)>0){g=0;do{m=(c[k+1179664+(g<<2)>>2]|0)+-1|0;n=g*7|0;l=k+12+(m<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(n<<2)>>2]|0);l=m<<1;j=k+655376+(l<<3)|0;h[j>>3]=+h[j>>3]+ +(c[k+1310736+(n+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(n+2<<2)>>2]|0);m=m<<2;l=k+131084+(m<<2)|0;j=c[k+1310736+(n+3<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;l=k+131084+((m|1)<<2)|0;j=c[k+1310736+(n+4<<2)>>2]|0;if((c[l>>2]|0)<(j|0))c[l>>2]=j;l=k+131084+((m|2)<<2)|0;j=c[k+1310736+(n+5<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;j=k+131084+((m|3)<<2)|0;l=c[k+1310736+(n+6<<2)>>2]|0;if((c[j>>2]|0)<(l|0))c[j>>2]=l;g=g+1|0}while((g|0)<(f|0))}if((c[e>>2]|0)>0){l=0;do{D=k+12+(l<<2)|0;E=l<<1;C=k+655376+(E<<3)|0;h[C>>3]=+h[C>>3]/+(c[D>>2]|0);E=k+655376+((E|1)<<3)|0;h[E>>3]=+h[E>>3]/+(c[D>>2]|0);l=l+1|0}while((l|0)<(c[e>>2]|0));l=0}else l=0}else l=0}i=F;return l|0}function vd(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;F=i;i=i+16|0;B=F;D=(f|0)/2|0;E=(g|0)/2|0;o=c[k>>2]|0;A=E+-1|0;if((f|0)>1){l=0;m=o;n=o+(($(A,D)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(D|0))break;else{m=m+2|0;n=n+2|0}}}y=j*3|0;z=D+-1|0;if((g|0)>1){l=0;j=o;m=o+(z<<1)|0;while(1){b[m>>1]=0;b[j>>1]=0;l=l+1|0;if((l|0)>=(E|0))break;else{j=j+(D<<1)|0;m=m+(D<<1)|0}}}m=k+1179664|0;j=D+1|0;v=0-D|0;t=1-D|0;u=~D;s=(f<<2)+16|0;a:do if((A|0)>1){w=(z|0)>1;l=(c[k+4>>2]|0)+j|0;x=1;n=e+((f<<3)+8)|0;g=o+(j<<1)|0;j=0;b:while(1){if(w){r=1;q=n;p=j;while(1){do if(((d[q+2>>0]|0)+(d[q+1>>0]|0)+(d[q+3>>0]|0)|0)>(y|0)){a[l>>0]=-1;j=b[g+(v<<1)>>1]|0;if(j<<16>>16>0){b[g>>1]=j;j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}e=b[g+(t<<1)>>1]|0;f=e<<16>>16;j=b[g+(u<<1)>>1]|0;o=j<<16>>16;n=j<<16>>16>0;if(e<<16>>16<=0){if(n){b[g>>1]=j;j=o*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+r;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+x;n=k+1310736+(j+-3<<2)|0;if((c[n>>2]|0)<(r|0))c[n>>2]=r;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}j=b[g+-2>>1]|0;if(j<<16>>16>0){b[g>>1]=j;j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;j=k+1310736+(j+-3<<2)|0;if((c[j>>2]|0)>=(r|0)){j=p;break}c[j>>2]=r;j=p;break}else{j=p+1|0;if((p|0)>32767)break b;b[g>>1]=j;c[k+1179664+(p<<2)>>2]=j<<16>>16;p=p*7|0;c[k+1310736+(p<<2)>>2]=1;c[k+1310736+(p+1<<2)>>2]=r;c[k+1310736+(p+2<<2)>>2]=x;c[k+1310736+(p+3<<2)>>2]=r;c[k+1310736+(p+4<<2)>>2]=r;c[k+1310736+(p+5<<2)>>2]=x;c[k+1310736+(p+6<<2)>>2]=x;break}}if(n){j=c[k+1179664+(f+-1<<2)>>2]|0;f=c[k+1179664+(o+-1<<2)>>2]|0;if((j|0)>(f|0)){b[g>>1]=f;if((p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(j|0))c[e>>2]=f;n=n+1|0;if((n|0)>=(p|0)){j=f;break}else e=e+4|0}}else j=f}else{b[g>>1]=j;if((j|0)<(f|0)&(p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(f|0))c[e>>2]=j;n=n+1|0;if((n|0)>=(p|0))break;else e=e+4|0}}}j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}n=b[g+-2>>1]|0;if(n<<16>>16<=0){b[g>>1]=e;j=f*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+r;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+x;n=k+1310736+(j+-4<<2)|0;if((c[n>>2]|0)>(r|0))c[n>>2]=r;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}j=c[k+1179664+(f+-1<<2)>>2]|0;f=c[k+1179664+((n<<16>>16)+-1<<2)>>2]|0;if((j|0)>(f|0)){b[g>>1]=f;if((p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(j|0))c[e>>2]=f;n=n+1|0;if((n|0)>=(p|0)){j=f;break}else e=e+4|0}}else j=f}else{b[g>>1]=j;if((j|0)<(f|0)&(p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(f|0))c[e>>2]=j;n=n+1|0;if((n|0)>=(p|0))break;else e=e+4|0}}}j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;j=k+1310736+(j+-5<<2)|0;c[j>>2]=(c[j>>2]|0)+x;j=p}else{b[g>>1]=0;a[l>>0]=0;j=p}while(0);r=r+1|0;n=q+8|0;g=g+2|0;l=l+1|0;if((r|0)>=(z|0))break;else{q=n;p=j}}}x=x+1|0;if((x|0)>=(A|0)){f=j;C=52;break a}else{l=l+2|0;n=n+s|0;g=g+4|0}}Me(3,3904,B);l=-1}else{f=0;C=52}while(0);if((C|0)==52){g=k+12|0;if((f|0)<1)j=1;else{n=1;j=1;while(1){l=c[m>>2]|0;if((l|0)==(n|0)){l=j;j=j+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[m>>2]=l;if((n|0)<(f|0)){n=n+1|0;m=m+4|0}else break}}e=k+8|0;l=j+-1|0;c[e>>2]=l;if(l){ek(g|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((j|0)>1){l=0;do{C=l<<2;c[k+131084+(C<<2)>>2]=D;c[k+131084+((C|1)<<2)>>2]=0;c[k+131084+((C|2)<<2)>>2]=E;c[k+131084+((C|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[e>>2]|0))}if((f|0)>0){g=0;do{m=(c[k+1179664+(g<<2)>>2]|0)+-1|0;n=g*7|0;l=k+12+(m<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(n<<2)>>2]|0);l=m<<1;j=k+655376+(l<<3)|0;h[j>>3]=+h[j>>3]+ +(c[k+1310736+(n+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(n+2<<2)>>2]|0);m=m<<2;l=k+131084+(m<<2)|0;j=c[k+1310736+(n+3<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;l=k+131084+((m|1)<<2)|0;j=c[k+1310736+(n+4<<2)>>2]|0;if((c[l>>2]|0)<(j|0))c[l>>2]=j;l=k+131084+((m|2)<<2)|0;j=c[k+1310736+(n+5<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;j=k+131084+((m|3)<<2)|0;l=c[k+1310736+(n+6<<2)>>2]|0;if((c[j>>2]|0)<(l|0))c[j>>2]=l;g=g+1|0}while((g|0)<(f|0))}if((c[e>>2]|0)>0){l=0;do{D=k+12+(l<<2)|0;E=l<<1;C=k+655376+(E<<3)|0;h[C>>3]=+h[C>>3]/+(c[D>>2]|0);E=k+655376+((E|1)<<3)|0;h[E>>3]=+h[E>>3]/+(c[D>>2]|0);l=l+1|0}while((l|0)<(c[e>>2]|0));l=0}else l=0}else l=0}i=F;return l|0}function wd(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;F=i;i=i+16|0;B=F;D=(f|0)/2|0;E=(g|0)/2|0;o=c[k>>2]|0;A=E+-1|0;if((f|0)>1){l=0;m=o;n=o+(($(A,D)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(D|0))break;else{m=m+2|0;n=n+2|0}}}z=D+-1|0;if((g|0)>1){l=0;m=o;n=o+(z<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(E|0))break;else{m=m+(D<<1)|0;n=n+(D<<1)|0}}}n=k+1179664|0;m=D+1|0;w=0-D|0;u=1-D|0;v=~D;t=f+4|0;a:do if((A|0)>1){x=(z|0)>1;l=(c[k+4>>2]|0)+m|0;y=1;g=e+((f<<1)+2)|0;e=o+(m<<1)|0;m=0;b:while(1){if(x){s=1;r=g;q=m;while(1){do if((d[r>>0]|0|0)>(j|0)){a[l>>0]=-1;m=b[e+(w<<1)>>1]|0;if(m<<16>>16>0){b[e>>1]=m;m=(m<<16>>16)*7|0;p=k+1310736+(m+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=k+1310736+(m+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=k+1310736+(m+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+y;c[k+1310736+(m+-1<<2)>>2]=y;m=q;break}f=b[e+(u<<1)>>1]|0;o=f<<16>>16;m=b[e+(v<<1)>>1]|0;p=m<<16>>16;g=m<<16>>16>0;if(f<<16>>16<=0){if(g){b[e>>1]=m;m=p*7|0;g=k+1310736+(m+-7<<2)|0;c[g>>2]=(c[g>>2]|0)+1;g=k+1310736+(m+-6<<2)|0;c[g>>2]=(c[g>>2]|0)+s;g=k+1310736+(m+-5<<2)|0;c[g>>2]=(c[g>>2]|0)+y;g=k+1310736+(m+-3<<2)|0;if((c[g>>2]|0)<(s|0))c[g>>2]=s;c[k+1310736+(m+-1<<2)>>2]=y;m=q;break}m=b[e+-2>>1]|0;if(m<<16>>16>0){b[e>>1]=m;m=(m<<16>>16)*7|0;p=k+1310736+(m+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=k+1310736+(m+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=k+1310736+(m+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+y;m=k+1310736+(m+-3<<2)|0;if((c[m>>2]|0)>=(s|0)){m=q;break}c[m>>2]=s;m=q;break}else{m=q+1|0;if((q|0)>32767)break b;b[e>>1]=m;c[k+1179664+(q<<2)>>2]=m<<16>>16;q=q*7|0;c[k+1310736+(q<<2)>>2]=1;c[k+1310736+(q+1<<2)>>2]=s;c[k+1310736+(q+2<<2)>>2]=y;c[k+1310736+(q+3<<2)>>2]=s;c[k+1310736+(q+4<<2)>>2]=s;c[k+1310736+(q+5<<2)>>2]=y;c[k+1310736+(q+6<<2)>>2]=y;break}}if(g){m=c[k+1179664+(o+-1<<2)>>2]|0;o=c[k+1179664+(p+-1<<2)>>2]|0;if((m|0)>(o|0)){b[e>>1]=o;if((q|0)>0){g=0;f=n;while(1){if((c[f>>2]|0)==(m|0))c[f>>2]=o;g=g+1|0;if((g|0)>=(q|0)){m=o;break}else f=f+4|0}}else m=o}else{b[e>>1]=m;if((m|0)<(o|0)&(q|0)>0){g=0;f=n;while(1){if((c[f>>2]|0)==(o|0))c[f>>2]=m;g=g+1|0;if((g|0)>=(q|0))break;else f=f+4|0}}}m=(m<<16>>16)*7|0;p=k+1310736+(m+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=k+1310736+(m+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=k+1310736+(m+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+y;c[k+1310736+(m+-1<<2)>>2]=y;m=q;break}g=b[e+-2>>1]|0;if(g<<16>>16<=0){b[e>>1]=f;m=o*7|0;g=k+1310736+(m+-7<<2)|0;c[g>>2]=(c[g>>2]|0)+1;g=k+1310736+(m+-6<<2)|0;c[g>>2]=(c[g>>2]|0)+s;g=k+1310736+(m+-5<<2)|0;c[g>>2]=(c[g>>2]|0)+y;g=k+1310736+(m+-4<<2)|0;if((c[g>>2]|0)>(s|0))c[g>>2]=s;c[k+1310736+(m+-1<<2)>>2]=y;m=q;break}m=c[k+1179664+(o+-1<<2)>>2]|0;o=c[k+1179664+((g<<16>>16)+-1<<2)>>2]|0;if((m|0)>(o|0)){b[e>>1]=o;if((q|0)>0){g=0;f=n;while(1){if((c[f>>2]|0)==(m|0))c[f>>2]=o;g=g+1|0;if((g|0)>=(q|0)){m=o;break}else f=f+4|0}}else m=o}else{b[e>>1]=m;if((m|0)<(o|0)&(q|0)>0){g=0;f=n;while(1){if((c[f>>2]|0)==(o|0))c[f>>2]=m;g=g+1|0;if((g|0)>=(q|0))break;else f=f+4|0}}}m=(m<<16>>16)*7|0;p=k+1310736+(m+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=k+1310736+(m+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;m=k+1310736+(m+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+y;m=q}else{b[e>>1]=0;a[l>>0]=0;m=q}while(0);s=s+1|0;g=r+2|0;e=e+2|0;l=l+1|0;if((s|0)>=(z|0))break;else{r=g;q=m}}}y=y+1|0;if((y|0)>=(A|0)){o=m;C=52;break a}else{l=l+2|0;g=g+t|0;e=e+4|0}}Me(3,3904,B);l=-1}else{o=0;C=52}while(0);if((C|0)==52){e=k+12|0;if((o|0)<1)m=1;else{g=1;m=1;while(1){l=c[n>>2]|0;if((l|0)==(g|0)){l=m;m=m+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[n>>2]=l;if((g|0)<(o|0)){g=g+1|0;n=n+4|0}else break}}f=k+8|0;l=m+-1|0;c[f>>2]=l;if(l){ek(e|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((m|0)>1){l=0;do{C=l<<2;c[k+131084+(C<<2)>>2]=D;c[k+131084+((C|1)<<2)>>2]=0;c[k+131084+((C|2)<<2)>>2]=E;c[k+131084+((C|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[f>>2]|0))}if((o|0)>0){e=0;do{n=(c[k+1179664+(e<<2)>>2]|0)+-1|0;g=e*7|0;l=k+12+(n<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(g<<2)>>2]|0);l=n<<1;m=k+655376+(l<<3)|0;h[m>>3]=+h[m>>3]+ +(c[k+1310736+(g+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(g+2<<2)>>2]|0);n=n<<2;l=k+131084+(n<<2)|0;m=c[k+1310736+(g+3<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;l=k+131084+((n|1)<<2)|0;m=c[k+1310736+(g+4<<2)>>2]|0;if((c[l>>2]|0)<(m|0))c[l>>2]=m;l=k+131084+((n|2)<<2)|0;m=c[k+1310736+(g+5<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;m=k+131084+((n|3)<<2)|0;l=c[k+1310736+(g+6<<2)>>2]|0;if((c[m>>2]|0)<(l|0))c[m>>2]=l;e=e+1|0}while((e|0)<(o|0))}if((c[f>>2]|0)>0){l=0;do{D=k+12+(l<<2)|0;E=l<<1;C=k+655376+(E<<3)|0;h[C>>3]=+h[C>>3]/+(c[D>>2]|0);E=k+655376+((E|1)<<3)|0;h[E>>3]=+h[E>>3]/+(c[D>>2]|0);l=l+1|0}while((l|0)<(c[f>>2]|0));l=0}else l=0}else l=0}i=F;return l|0}function xd(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;F=i;i=i+16|0;B=F;D=(f|0)/2|0;E=(g|0)/2|0;o=c[k>>2]|0;A=E+-1|0;if((f|0)>1){l=0;m=o;n=o+(($(A,D)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(D|0))break;else{m=m+2|0;n=n+2|0}}}z=D+-1|0;if((g|0)>1){l=0;m=o;n=o+(z<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(E|0))break;else{m=m+(D<<1)|0;n=n+(D<<1)|0}}}n=k+1179664|0;m=D+1|0;w=0-D|0;u=1-D|0;v=~D;t=(f<<1)+8|0;a:do if((A|0)>1){x=(z|0)>1;l=(c[k+4>>2]|0)+m|0;y=1;g=e+((f<<2)+4)|0;e=o+(m<<1)|0;m=0;b:while(1){if(x){s=1;r=g;q=m;while(1){do if((d[r+1>>0]|0|0)>(j|0)){a[l>>0]=-1;m=b[e+(w<<1)>>1]|0;if(m<<16>>16>0){b[e>>1]=m;m=(m<<16>>16)*7|0;p=k+1310736+(m+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=k+1310736+(m+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=k+1310736+(m+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+y;c[k+1310736+(m+-1<<2)>>2]=y;m=q;break}f=b[e+(u<<1)>>1]|0;o=f<<16>>16;m=b[e+(v<<1)>>1]|0;p=m<<16>>16;g=m<<16>>16>0;if(f<<16>>16<=0){if(g){b[e>>1]=m;m=p*7|0;g=k+1310736+(m+-7<<2)|0;c[g>>2]=(c[g>>2]|0)+1;g=k+1310736+(m+-6<<2)|0;c[g>>2]=(c[g>>2]|0)+s;g=k+1310736+(m+-5<<2)|0;c[g>>2]=(c[g>>2]|0)+y;g=k+1310736+(m+-3<<2)|0;if((c[g>>2]|0)<(s|0))c[g>>2]=s;c[k+1310736+(m+-1<<2)>>2]=y;m=q;break}m=b[e+-2>>1]|0;if(m<<16>>16>0){b[e>>1]=m;m=(m<<16>>16)*7|0;p=k+1310736+(m+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=k+1310736+(m+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=k+1310736+(m+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+y;m=k+1310736+(m+-3<<2)|0;if((c[m>>2]|0)>=(s|0)){m=q;break}c[m>>2]=s;m=q;break}else{m=q+1|0;if((q|0)>32767)break b;b[e>>1]=m;c[k+1179664+(q<<2)>>2]=m<<16>>16;q=q*7|0;c[k+1310736+(q<<2)>>2]=1;c[k+1310736+(q+1<<2)>>2]=s;c[k+1310736+(q+2<<2)>>2]=y;c[k+1310736+(q+3<<2)>>2]=s;c[k+1310736+(q+4<<2)>>2]=s;c[k+1310736+(q+5<<2)>>2]=y;c[k+1310736+(q+6<<2)>>2]=y;break}}if(g){m=c[k+1179664+(o+-1<<2)>>2]|0;o=c[k+1179664+(p+-1<<2)>>2]|0;if((m|0)>(o|0)){b[e>>1]=o;if((q|0)>0){g=0;f=n;while(1){if((c[f>>2]|0)==(m|0))c[f>>2]=o;g=g+1|0;if((g|0)>=(q|0)){m=o;break}else f=f+4|0}}else m=o}else{b[e>>1]=m;if((m|0)<(o|0)&(q|0)>0){g=0;f=n;while(1){if((c[f>>2]|0)==(o|0))c[f>>2]=m;g=g+1|0;if((g|0)>=(q|0))break;else f=f+4|0}}}m=(m<<16>>16)*7|0;p=k+1310736+(m+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=k+1310736+(m+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=k+1310736+(m+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+y;c[k+1310736+(m+-1<<2)>>2]=y;m=q;break}g=b[e+-2>>1]|0;if(g<<16>>16<=0){b[e>>1]=f;m=o*7|0;g=k+1310736+(m+-7<<2)|0;c[g>>2]=(c[g>>2]|0)+1;g=k+1310736+(m+-6<<2)|0;c[g>>2]=(c[g>>2]|0)+s;g=k+1310736+(m+-5<<2)|0;c[g>>2]=(c[g>>2]|0)+y;g=k+1310736+(m+-4<<2)|0;if((c[g>>2]|0)>(s|0))c[g>>2]=s;c[k+1310736+(m+-1<<2)>>2]=y;m=q;break}m=c[k+1179664+(o+-1<<2)>>2]|0;o=c[k+1179664+((g<<16>>16)+-1<<2)>>2]|0;if((m|0)>(o|0)){b[e>>1]=o;if((q|0)>0){g=0;f=n;while(1){if((c[f>>2]|0)==(m|0))c[f>>2]=o;g=g+1|0;if((g|0)>=(q|0)){m=o;break}else f=f+4|0}}else m=o}else{b[e>>1]=m;if((m|0)<(o|0)&(q|0)>0){g=0;f=n;while(1){if((c[f>>2]|0)==(o|0))c[f>>2]=m;g=g+1|0;if((g|0)>=(q|0))break;else f=f+4|0}}}m=(m<<16>>16)*7|0;p=k+1310736+(m+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=k+1310736+(m+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;m=k+1310736+(m+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+y;m=q}else{b[e>>1]=0;a[l>>0]=0;m=q}while(0);s=s+1|0;g=r+4|0;e=e+2|0;l=l+1|0;if((s|0)>=(z|0))break;else{r=g;q=m}}}y=y+1|0;if((y|0)>=(A|0)){o=m;C=52;break a}else{l=l+2|0;g=g+t|0;e=e+4|0}}Me(3,3904,B);l=-1}else{o=0;C=52}while(0);if((C|0)==52){e=k+12|0;if((o|0)<1)m=1;else{g=1;m=1;while(1){l=c[n>>2]|0;if((l|0)==(g|0)){l=m;m=m+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[n>>2]=l;if((g|0)<(o|0)){g=g+1|0;n=n+4|0}else break}}f=k+8|0;l=m+-1|0;c[f>>2]=l;if(l){ek(e|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((m|0)>1){l=0;do{C=l<<2;c[k+131084+(C<<2)>>2]=D;c[k+131084+((C|1)<<2)>>2]=0;c[k+131084+((C|2)<<2)>>2]=E;c[k+131084+((C|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[f>>2]|0))}if((o|0)>0){e=0;do{n=(c[k+1179664+(e<<2)>>2]|0)+-1|0;g=e*7|0;l=k+12+(n<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(g<<2)>>2]|0);l=n<<1;m=k+655376+(l<<3)|0;h[m>>3]=+h[m>>3]+ +(c[k+1310736+(g+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(g+2<<2)>>2]|0);n=n<<2;l=k+131084+(n<<2)|0;m=c[k+1310736+(g+3<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;l=k+131084+((n|1)<<2)|0;m=c[k+1310736+(g+4<<2)>>2]|0;if((c[l>>2]|0)<(m|0))c[l>>2]=m;l=k+131084+((n|2)<<2)|0;m=c[k+1310736+(g+5<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;m=k+131084+((n|3)<<2)|0;l=c[k+1310736+(g+6<<2)>>2]|0;if((c[m>>2]|0)<(l|0))c[m>>2]=l;e=e+1|0}while((e|0)<(o|0))}if((c[f>>2]|0)>0){l=0;do{D=k+12+(l<<2)|0;E=l<<1;C=k+655376+(E<<3)|0;h[C>>3]=+h[C>>3]/+(c[D>>2]|0);E=k+655376+((E|1)<<3)|0;h[E>>3]=+h[E>>3]/+(c[D>>2]|0);l=l+1|0}while((l|0)<(c[f>>2]|0));l=0}else l=0}else l=0}i=F;return l|0}function yd(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;F=i;i=i+16|0;B=F;D=(f|0)/2|0;E=(g|0)/2|0;o=c[k>>2]|0;A=E+-1|0;if((f|0)>1){l=0;m=o;n=o+(($(A,D)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(D|0))break;else{m=m+2|0;n=n+2|0}}}z=D+-1|0;if((g|0)>1){l=0;m=o;n=o+(z<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(E|0))break;else{m=m+(D<<1)|0;n=n+(D<<1)|0}}}n=k+1179664|0;m=D+1|0;w=0-D|0;u=1-D|0;v=~D;t=(f<<1)+8|0;a:do if((A|0)>1){x=(z|0)>1;l=(c[k+4>>2]|0)+m|0;y=1;g=e+((f<<2)+4)|0;e=o+(m<<1)|0;m=0;b:while(1){if(x){s=1;r=g;q=m;while(1){do if((d[r>>0]|0|0)>(j|0)){a[l>>0]=-1;m=b[e+(w<<1)>>1]|0;if(m<<16>>16>0){b[e>>1]=m;m=(m<<16>>16)*7|0;p=k+1310736+(m+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=k+1310736+(m+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=k+1310736+(m+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+y;c[k+1310736+(m+-1<<2)>>2]=y;m=q;break}f=b[e+(u<<1)>>1]|0;o=f<<16>>16;m=b[e+(v<<1)>>1]|0;p=m<<16>>16;g=m<<16>>16>0;if(f<<16>>16<=0){if(g){b[e>>1]=m;m=p*7|0;g=k+1310736+(m+-7<<2)|0;c[g>>2]=(c[g>>2]|0)+1;g=k+1310736+(m+-6<<2)|0;c[g>>2]=(c[g>>2]|0)+s;g=k+1310736+(m+-5<<2)|0;c[g>>2]=(c[g>>2]|0)+y;g=k+1310736+(m+-3<<2)|0;if((c[g>>2]|0)<(s|0))c[g>>2]=s;c[k+1310736+(m+-1<<2)>>2]=y;m=q;break}m=b[e+-2>>1]|0;if(m<<16>>16>0){b[e>>1]=m;m=(m<<16>>16)*7|0;p=k+1310736+(m+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=k+1310736+(m+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=k+1310736+(m+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+y;m=k+1310736+(m+-3<<2)|0;if((c[m>>2]|0)>=(s|0)){m=q;break}c[m>>2]=s;m=q;break}else{m=q+1|0;if((q|0)>32767)break b;b[e>>1]=m;c[k+1179664+(q<<2)>>2]=m<<16>>16;q=q*7|0;c[k+1310736+(q<<2)>>2]=1;c[k+1310736+(q+1<<2)>>2]=s;c[k+1310736+(q+2<<2)>>2]=y;c[k+1310736+(q+3<<2)>>2]=s;c[k+1310736+(q+4<<2)>>2]=s;c[k+1310736+(q+5<<2)>>2]=y;c[k+1310736+(q+6<<2)>>2]=y;break}}if(g){m=c[k+1179664+(o+-1<<2)>>2]|0;o=c[k+1179664+(p+-1<<2)>>2]|0;if((m|0)>(o|0)){b[e>>1]=o;if((q|0)>0){g=0;f=n;while(1){if((c[f>>2]|0)==(m|0))c[f>>2]=o;g=g+1|0;if((g|0)>=(q|0)){m=o;break}else f=f+4|0}}else m=o}else{b[e>>1]=m;if((m|0)<(o|0)&(q|0)>0){g=0;f=n;while(1){if((c[f>>2]|0)==(o|0))c[f>>2]=m;g=g+1|0;if((g|0)>=(q|0))break;else f=f+4|0}}}m=(m<<16>>16)*7|0;p=k+1310736+(m+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=k+1310736+(m+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=k+1310736+(m+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+y;c[k+1310736+(m+-1<<2)>>2]=y;m=q;break}g=b[e+-2>>1]|0;if(g<<16>>16<=0){b[e>>1]=f;m=o*7|0;g=k+1310736+(m+-7<<2)|0;c[g>>2]=(c[g>>2]|0)+1;g=k+1310736+(m+-6<<2)|0;c[g>>2]=(c[g>>2]|0)+s;g=k+1310736+(m+-5<<2)|0;c[g>>2]=(c[g>>2]|0)+y;g=k+1310736+(m+-4<<2)|0;if((c[g>>2]|0)>(s|0))c[g>>2]=s;c[k+1310736+(m+-1<<2)>>2]=y;m=q;break}m=c[k+1179664+(o+-1<<2)>>2]|0;o=c[k+1179664+((g<<16>>16)+-1<<2)>>2]|0;if((m|0)>(o|0)){b[e>>1]=o;if((q|0)>0){g=0;f=n;while(1){if((c[f>>2]|0)==(m|0))c[f>>2]=o;g=g+1|0;if((g|0)>=(q|0)){m=o;break}else f=f+4|0}}else m=o}else{b[e>>1]=m;if((m|0)<(o|0)&(q|0)>0){g=0;f=n;while(1){if((c[f>>2]|0)==(o|0))c[f>>2]=m;g=g+1|0;if((g|0)>=(q|0))break;else f=f+4|0}}}m=(m<<16>>16)*7|0;p=k+1310736+(m+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=k+1310736+(m+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;m=k+1310736+(m+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+y;m=q}else{b[e>>1]=0;a[l>>0]=0;m=q}while(0);s=s+1|0;g=r+4|0;e=e+2|0;l=l+1|0;if((s|0)>=(z|0))break;else{r=g;q=m}}}y=y+1|0;if((y|0)>=(A|0)){o=m;C=52;break a}else{l=l+2|0;g=g+t|0;e=e+4|0}}Me(3,3904,B);l=-1}else{o=0;C=52}while(0);if((C|0)==52){e=k+12|0;if((o|0)<1)m=1;else{g=1;m=1;while(1){l=c[n>>2]|0;if((l|0)==(g|0)){l=m;m=m+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[n>>2]=l;if((g|0)<(o|0)){g=g+1|0;n=n+4|0}else break}}f=k+8|0;l=m+-1|0;c[f>>2]=l;if(l){ek(e|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((m|0)>1){l=0;do{C=l<<2;c[k+131084+(C<<2)>>2]=D;c[k+131084+((C|1)<<2)>>2]=0;c[k+131084+((C|2)<<2)>>2]=E;c[k+131084+((C|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[f>>2]|0))}if((o|0)>0){e=0;do{n=(c[k+1179664+(e<<2)>>2]|0)+-1|0;g=e*7|0;l=k+12+(n<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(g<<2)>>2]|0);l=n<<1;m=k+655376+(l<<3)|0;h[m>>3]=+h[m>>3]+ +(c[k+1310736+(g+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(g+2<<2)>>2]|0);n=n<<2;l=k+131084+(n<<2)|0;m=c[k+1310736+(g+3<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;l=k+131084+((n|1)<<2)|0;m=c[k+1310736+(g+4<<2)>>2]|0;if((c[l>>2]|0)<(m|0))c[l>>2]=m;l=k+131084+((n|2)<<2)|0;m=c[k+1310736+(g+5<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;m=k+131084+((n|3)<<2)|0;l=c[k+1310736+(g+6<<2)>>2]|0;if((c[m>>2]|0)<(l|0))c[m>>2]=l;e=e+1|0}while((e|0)<(o|0))}if((c[f>>2]|0)>0){l=0;do{D=k+12+(l<<2)|0;E=l<<1;C=k+655376+(E<<3)|0;h[C>>3]=+h[C>>3]/+(c[D>>2]|0);E=k+655376+((E|1)<<3)|0;h[E>>3]=+h[E>>3]/+(c[D>>2]|0);l=l+1|0}while((l|0)<(c[f>>2]|0));l=0}else l=0}else l=0}i=F;return l|0} +function ec(a){a=a|0;var b=0;b=i;i=i+a|0;i=i+15&-16;return b|0}function fc(){return i|0}function gc(a){a=a|0;i=a}function hc(a,b){a=a|0;b=b|0;i=a;j=b}function ic(a,b){a=a|0;b=b|0;if(!o){o=a;p=b}}function jc(b){b=b|0;a[k>>0]=a[b>>0];a[k+1>>0]=a[b+1>>0];a[k+2>>0]=a[b+2>>0];a[k+3>>0]=a[b+3>>0]}function kc(b){b=b|0;a[k>>0]=a[b>>0];a[k+1>>0]=a[b+1>>0];a[k+2>>0]=a[b+2>>0];a[k+3>>0]=a[b+3>>0];a[k+4>>0]=a[b+4>>0];a[k+5>>0]=a[b+5>>0];a[k+6>>0]=a[b+6>>0];a[k+7>>0]=a[b+7>>0]}function lc(a){a=a|0;D=a}function mc(){return D|0}function nc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;D=i;i=i+16|0;z=D;B=(e|0)/2|0;C=(f|0)/2|0;n=c[j>>2]|0;y=C+-1|0;if((e|0)>1){k=0;l=n;m=n+(($(y,B)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(B|0))break;else{l=l+2|0;m=m+2|0}}}w=g*3|0;x=B+-1|0;if((f|0)>1){k=0;g=n;l=n+(x<<1)|0;while(1){b[l>>1]=0;b[g>>1]=0;k=k+1|0;if((k|0)>=(C|0))break;else{g=g+(B<<1)|0;l=l+(B<<1)|0}}}l=j+1179664|0;t=0-B|0;r=1-B|0;s=~B;q=(e*3|0)+12|0;a:do if((y|0)>1){u=(x|0)>1;v=1;g=a+((e*6|0)+6)|0;m=n+(B+1<<1)|0;k=0;b:while(1){if(u){p=1;o=m;n=k;while(1){do if(((d[g+1>>0]|0)+(d[g>>0]|0)+(d[g+2>>0]|0)|0)>(w|0)){b[o>>1]=0;k=n}else{k=b[o+(t<<1)>>1]|0;if(k<<16>>16>0){b[o>>1]=k;k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}f=b[o+(r<<1)>>1]|0;a=f<<16>>16;k=b[o+(s<<1)>>1]|0;e=k<<16>>16;m=k<<16>>16>0;if(f<<16>>16<=0){if(m){b[o>>1]=k;k=e*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+p;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+v;m=j+1310736+(k+-3<<2)|0;if((c[m>>2]|0)<(p|0))c[m>>2]=p;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}k=b[o+-2>>1]|0;if(k<<16>>16>0){b[o>>1]=k;k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(p|0)){k=n;break}c[k>>2]=p;k=n;break}else{k=n+1|0;if((n|0)>32767)break b;b[o>>1]=k;c[j+1179664+(n<<2)>>2]=k<<16>>16;n=n*7|0;c[j+1310736+(n<<2)>>2]=1;c[j+1310736+(n+1<<2)>>2]=p;c[j+1310736+(n+2<<2)>>2]=v;c[j+1310736+(n+3<<2)>>2]=p;c[j+1310736+(n+4<<2)>>2]=p;c[j+1310736+(n+5<<2)>>2]=v;c[j+1310736+(n+6<<2)>>2]=v;break}}if(m){k=c[j+1179664+(a+-1<<2)>>2]|0;a=c[j+1179664+(e+-1<<2)>>2]|0;if((k|0)>(a|0)){b[o>>1]=a;if((n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(k|0))c[f>>2]=a;m=m+1|0;if((m|0)>=(n|0)){k=a;break}else f=f+4|0}}else k=a}else{b[o>>1]=k;if((k|0)<(a|0)&(n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(a|0))c[f>>2]=k;m=m+1|0;if((m|0)>=(n|0))break;else f=f+4|0}}}k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}m=b[o+-2>>1]|0;if(m<<16>>16<=0){b[o>>1]=f;k=a*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+p;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+v;m=j+1310736+(k+-4<<2)|0;if((c[m>>2]|0)>(p|0))c[m>>2]=p;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}k=c[j+1179664+(a+-1<<2)>>2]|0;a=c[j+1179664+((m<<16>>16)+-1<<2)>>2]|0;if((k|0)>(a|0)){b[o>>1]=a;if((n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(k|0))c[f>>2]=a;m=m+1|0;if((m|0)>=(n|0)){k=a;break}else f=f+4|0}}else k=a}else{b[o>>1]=k;if((k|0)<(a|0)&(n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(a|0))c[f>>2]=k;m=m+1|0;if((m|0)>=(n|0))break;else f=f+4|0}}}k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+v;k=n}while(0);p=p+1|0;g=g+6|0;m=o+2|0;if((p|0)>=(x|0))break;else{o=m;n=k}}}v=v+1|0;if((v|0)>=(y|0)){e=k;A=52;break a}else{g=g+q|0;m=m+4|0}}Me(3,3904,z);k=-1}else{e=0;A=52}while(0);if((A|0)==52){f=j+12|0;if((e|0)<1)g=1;else{m=1;g=1;while(1){k=c[l>>2]|0;if((k|0)==(m|0)){k=g;g=g+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[l>>2]=k;if((m|0)<(e|0)){m=m+1|0;l=l+4|0}else break}}a=j+8|0;k=g+-1|0;c[a>>2]=k;if(k){ek(f|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((g|0)>1){k=0;do{A=k<<2;c[j+131084+(A<<2)>>2]=B;c[j+131084+((A|1)<<2)>>2]=0;c[j+131084+((A|2)<<2)>>2]=C;c[j+131084+((A|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[a>>2]|0))}if((e|0)>0){f=0;do{l=(c[j+1179664+(f<<2)>>2]|0)+-1|0;m=f*7|0;k=j+12+(l<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(m<<2)>>2]|0);k=l<<1;g=j+655376+(k<<3)|0;h[g>>3]=+h[g>>3]+ +(c[j+1310736+(m+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(m+2<<2)>>2]|0);l=l<<2;k=j+131084+(l<<2)|0;g=c[j+1310736+(m+3<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;k=j+131084+((l|1)<<2)|0;g=c[j+1310736+(m+4<<2)>>2]|0;if((c[k>>2]|0)<(g|0))c[k>>2]=g;k=j+131084+((l|2)<<2)|0;g=c[j+1310736+(m+5<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;g=j+131084+((l|3)<<2)|0;k=c[j+1310736+(m+6<<2)>>2]|0;if((c[g>>2]|0)<(k|0))c[g>>2]=k;f=f+1|0}while((f|0)<(e|0))}if((c[a>>2]|0)>0){k=0;do{B=j+12+(k<<2)|0;C=k<<1;A=j+655376+(C<<3)|0;h[A>>3]=+h[A>>3]/+(c[B>>2]|0);C=j+655376+((C|1)<<3)|0;h[C>>3]=+h[C>>3]/+(c[B>>2]|0);k=k+1|0}while((k|0)<(c[a>>2]|0));k=0}else k=0}else k=0}i=D;return k|0}function oc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;D=i;i=i+16|0;z=D;B=(e|0)/2|0;C=(f|0)/2|0;n=c[j>>2]|0;y=C+-1|0;if((e|0)>1){k=0;l=n;m=n+(($(y,B)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(B|0))break;else{l=l+2|0;m=m+2|0}}}w=g*3|0;x=B+-1|0;if((f|0)>1){k=0;g=n;l=n+(x<<1)|0;while(1){b[l>>1]=0;b[g>>1]=0;k=k+1|0;if((k|0)>=(C|0))break;else{g=g+(B<<1)|0;l=l+(B<<1)|0}}}l=j+1179664|0;t=0-B|0;r=1-B|0;s=~B;q=(e<<1)+8|0;a:do if((y|0)>1){u=(x|0)>1;v=1;g=a+((e<<2)+4)|0;m=n+(B+1<<1)|0;k=0;b:while(1){if(u){p=1;o=m;n=k;while(1){a=d[g>>0]|0;e=d[g+1>>0]|0;do if(((a&248)+10+(a<<5&224)+(e>>>3&28)+(e<<3&248)|0)>(w|0)){b[o>>1]=0;k=n}else{k=b[o+(t<<1)>>1]|0;if(k<<16>>16>0){b[o>>1]=k;k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}f=b[o+(r<<1)>>1]|0;a=f<<16>>16;k=b[o+(s<<1)>>1]|0;e=k<<16>>16;m=k<<16>>16>0;if(f<<16>>16<=0){if(m){b[o>>1]=k;k=e*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+p;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+v;m=j+1310736+(k+-3<<2)|0;if((c[m>>2]|0)<(p|0))c[m>>2]=p;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}k=b[o+-2>>1]|0;if(k<<16>>16>0){b[o>>1]=k;k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(p|0)){k=n;break}c[k>>2]=p;k=n;break}else{k=n+1|0;if((n|0)>32767)break b;b[o>>1]=k;c[j+1179664+(n<<2)>>2]=k<<16>>16;n=n*7|0;c[j+1310736+(n<<2)>>2]=1;c[j+1310736+(n+1<<2)>>2]=p;c[j+1310736+(n+2<<2)>>2]=v;c[j+1310736+(n+3<<2)>>2]=p;c[j+1310736+(n+4<<2)>>2]=p;c[j+1310736+(n+5<<2)>>2]=v;c[j+1310736+(n+6<<2)>>2]=v;break}}if(m){k=c[j+1179664+(a+-1<<2)>>2]|0;a=c[j+1179664+(e+-1<<2)>>2]|0;if((k|0)>(a|0)){b[o>>1]=a;if((n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(k|0))c[f>>2]=a;m=m+1|0;if((m|0)>=(n|0)){k=a;break}else f=f+4|0}}else k=a}else{b[o>>1]=k;if((k|0)<(a|0)&(n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(a|0))c[f>>2]=k;m=m+1|0;if((m|0)>=(n|0))break;else f=f+4|0}}}k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}m=b[o+-2>>1]|0;if(m<<16>>16<=0){b[o>>1]=f;k=a*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+p;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+v;m=j+1310736+(k+-4<<2)|0;if((c[m>>2]|0)>(p|0))c[m>>2]=p;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}k=c[j+1179664+(a+-1<<2)>>2]|0;a=c[j+1179664+((m<<16>>16)+-1<<2)>>2]|0;if((k|0)>(a|0)){b[o>>1]=a;if((n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(k|0))c[f>>2]=a;m=m+1|0;if((m|0)>=(n|0)){k=a;break}else f=f+4|0}}else k=a}else{b[o>>1]=k;if((k|0)<(a|0)&(n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(a|0))c[f>>2]=k;m=m+1|0;if((m|0)>=(n|0))break;else f=f+4|0}}}k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+v;k=n}while(0);p=p+1|0;g=g+4|0;m=o+2|0;if((p|0)>=(x|0))break;else{o=m;n=k}}}v=v+1|0;if((v|0)>=(y|0)){e=k;A=52;break a}else{g=g+q|0;m=m+4|0}}Me(3,3904,z);k=-1}else{e=0;A=52}while(0);if((A|0)==52){f=j+12|0;if((e|0)<1)g=1;else{m=1;g=1;while(1){k=c[l>>2]|0;if((k|0)==(m|0)){k=g;g=g+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[l>>2]=k;if((m|0)<(e|0)){m=m+1|0;l=l+4|0}else break}}a=j+8|0;k=g+-1|0;c[a>>2]=k;if(k){ek(f|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((g|0)>1){k=0;do{A=k<<2;c[j+131084+(A<<2)>>2]=B;c[j+131084+((A|1)<<2)>>2]=0;c[j+131084+((A|2)<<2)>>2]=C;c[j+131084+((A|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[a>>2]|0))}if((e|0)>0){f=0;do{l=(c[j+1179664+(f<<2)>>2]|0)+-1|0;m=f*7|0;k=j+12+(l<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(m<<2)>>2]|0);k=l<<1;g=j+655376+(k<<3)|0;h[g>>3]=+h[g>>3]+ +(c[j+1310736+(m+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(m+2<<2)>>2]|0);l=l<<2;k=j+131084+(l<<2)|0;g=c[j+1310736+(m+3<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;k=j+131084+((l|1)<<2)|0;g=c[j+1310736+(m+4<<2)>>2]|0;if((c[k>>2]|0)<(g|0))c[k>>2]=g;k=j+131084+((l|2)<<2)|0;g=c[j+1310736+(m+5<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;g=j+131084+((l|3)<<2)|0;k=c[j+1310736+(m+6<<2)>>2]|0;if((c[g>>2]|0)<(k|0))c[g>>2]=k;f=f+1|0}while((f|0)<(e|0))}if((c[a>>2]|0)>0){k=0;do{B=j+12+(k<<2)|0;C=k<<1;A=j+655376+(C<<3)|0;h[A>>3]=+h[A>>3]/+(c[B>>2]|0);C=j+655376+((C|1)<<3)|0;h[C>>3]=+h[C>>3]/+(c[B>>2]|0);k=k+1|0}while((k|0)<(c[a>>2]|0));k=0}else k=0}else k=0}i=D;return k|0}function pc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;D=i;i=i+16|0;z=D;B=(e|0)/2|0;C=(f|0)/2|0;n=c[j>>2]|0;y=C+-1|0;if((e|0)>1){k=0;l=n;m=n+(($(y,B)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(B|0))break;else{l=l+2|0;m=m+2|0}}}w=g*3|0;x=B+-1|0;if((f|0)>1){k=0;g=n;l=n+(x<<1)|0;while(1){b[l>>1]=0;b[g>>1]=0;k=k+1|0;if((k|0)>=(C|0))break;else{g=g+(B<<1)|0;l=l+(B<<1)|0}}}l=j+1179664|0;t=0-B|0;r=1-B|0;s=~B;q=(e<<2)+16|0;a:do if((y|0)>1){u=(x|0)>1;v=1;g=a+((e<<3)+8)|0;m=n+(B+1<<1)|0;k=0;b:while(1){if(u){p=1;o=m;n=k;while(1){do if(((d[g+1>>0]|0)+(d[g>>0]|0)+(d[g+2>>0]|0)|0)>(w|0)){b[o>>1]=0;k=n}else{k=b[o+(t<<1)>>1]|0;if(k<<16>>16>0){b[o>>1]=k;k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}f=b[o+(r<<1)>>1]|0;a=f<<16>>16;k=b[o+(s<<1)>>1]|0;e=k<<16>>16;m=k<<16>>16>0;if(f<<16>>16<=0){if(m){b[o>>1]=k;k=e*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+p;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+v;m=j+1310736+(k+-3<<2)|0;if((c[m>>2]|0)<(p|0))c[m>>2]=p;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}k=b[o+-2>>1]|0;if(k<<16>>16>0){b[o>>1]=k;k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(p|0)){k=n;break}c[k>>2]=p;k=n;break}else{k=n+1|0;if((n|0)>32767)break b;b[o>>1]=k;c[j+1179664+(n<<2)>>2]=k<<16>>16;n=n*7|0;c[j+1310736+(n<<2)>>2]=1;c[j+1310736+(n+1<<2)>>2]=p;c[j+1310736+(n+2<<2)>>2]=v;c[j+1310736+(n+3<<2)>>2]=p;c[j+1310736+(n+4<<2)>>2]=p;c[j+1310736+(n+5<<2)>>2]=v;c[j+1310736+(n+6<<2)>>2]=v;break}}if(m){k=c[j+1179664+(a+-1<<2)>>2]|0;a=c[j+1179664+(e+-1<<2)>>2]|0;if((k|0)>(a|0)){b[o>>1]=a;if((n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(k|0))c[f>>2]=a;m=m+1|0;if((m|0)>=(n|0)){k=a;break}else f=f+4|0}}else k=a}else{b[o>>1]=k;if((k|0)<(a|0)&(n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(a|0))c[f>>2]=k;m=m+1|0;if((m|0)>=(n|0))break;else f=f+4|0}}}k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}m=b[o+-2>>1]|0;if(m<<16>>16<=0){b[o>>1]=f;k=a*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+p;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+v;m=j+1310736+(k+-4<<2)|0;if((c[m>>2]|0)>(p|0))c[m>>2]=p;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}k=c[j+1179664+(a+-1<<2)>>2]|0;a=c[j+1179664+((m<<16>>16)+-1<<2)>>2]|0;if((k|0)>(a|0)){b[o>>1]=a;if((n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(k|0))c[f>>2]=a;m=m+1|0;if((m|0)>=(n|0)){k=a;break}else f=f+4|0}}else k=a}else{b[o>>1]=k;if((k|0)<(a|0)&(n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(a|0))c[f>>2]=k;m=m+1|0;if((m|0)>=(n|0))break;else f=f+4|0}}}k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+v;k=n}while(0);p=p+1|0;g=g+8|0;m=o+2|0;if((p|0)>=(x|0))break;else{o=m;n=k}}}v=v+1|0;if((v|0)>=(y|0)){e=k;A=52;break a}else{g=g+q|0;m=m+4|0}}Me(3,3904,z);k=-1}else{e=0;A=52}while(0);if((A|0)==52){f=j+12|0;if((e|0)<1)g=1;else{m=1;g=1;while(1){k=c[l>>2]|0;if((k|0)==(m|0)){k=g;g=g+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[l>>2]=k;if((m|0)<(e|0)){m=m+1|0;l=l+4|0}else break}}a=j+8|0;k=g+-1|0;c[a>>2]=k;if(k){ek(f|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((g|0)>1){k=0;do{A=k<<2;c[j+131084+(A<<2)>>2]=B;c[j+131084+((A|1)<<2)>>2]=0;c[j+131084+((A|2)<<2)>>2]=C;c[j+131084+((A|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[a>>2]|0))}if((e|0)>0){f=0;do{l=(c[j+1179664+(f<<2)>>2]|0)+-1|0;m=f*7|0;k=j+12+(l<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(m<<2)>>2]|0);k=l<<1;g=j+655376+(k<<3)|0;h[g>>3]=+h[g>>3]+ +(c[j+1310736+(m+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(m+2<<2)>>2]|0);l=l<<2;k=j+131084+(l<<2)|0;g=c[j+1310736+(m+3<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;k=j+131084+((l|1)<<2)|0;g=c[j+1310736+(m+4<<2)>>2]|0;if((c[k>>2]|0)<(g|0))c[k>>2]=g;k=j+131084+((l|2)<<2)|0;g=c[j+1310736+(m+5<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;g=j+131084+((l|3)<<2)|0;k=c[j+1310736+(m+6<<2)>>2]|0;if((c[g>>2]|0)<(k|0))c[g>>2]=k;f=f+1|0}while((f|0)<(e|0))}if((c[a>>2]|0)>0){k=0;do{B=j+12+(k<<2)|0;C=k<<1;A=j+655376+(C<<3)|0;h[A>>3]=+h[A>>3]/+(c[B>>2]|0);C=j+655376+((C|1)<<3)|0;h[C>>3]=+h[C>>3]/+(c[B>>2]|0);k=k+1|0}while((k|0)<(c[a>>2]|0));k=0}else k=0}else k=0}i=D;return k|0}function qc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;D=i;i=i+16|0;z=D;B=(e|0)/2|0;C=(f|0)/2|0;n=c[j>>2]|0;y=C+-1|0;if((e|0)>1){k=0;l=n;m=n+(($(y,B)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(B|0))break;else{l=l+2|0;m=m+2|0}}}w=g*3|0;x=B+-1|0;if((f|0)>1){k=0;g=n;l=n+(x<<1)|0;while(1){b[l>>1]=0;b[g>>1]=0;k=k+1|0;if((k|0)>=(C|0))break;else{g=g+(B<<1)|0;l=l+(B<<1)|0}}}l=j+1179664|0;t=0-B|0;r=1-B|0;s=~B;q=(e<<1)+8|0;a:do if((y|0)>1){u=(x|0)>1;v=1;g=a+((e<<2)+4)|0;m=n+(B+1<<1)|0;k=0;b:while(1){if(u){p=1;o=m;n=k;while(1){e=d[g>>0]|0;do if(((e&240)+24+(e<<4&240)+((d[g+1>>0]|0)&240)|0)>(w|0)){b[o>>1]=0;k=n}else{k=b[o+(t<<1)>>1]|0;if(k<<16>>16>0){b[o>>1]=k;k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}f=b[o+(r<<1)>>1]|0;a=f<<16>>16;k=b[o+(s<<1)>>1]|0;e=k<<16>>16;m=k<<16>>16>0;if(f<<16>>16<=0){if(m){b[o>>1]=k;k=e*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+p;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+v;m=j+1310736+(k+-3<<2)|0;if((c[m>>2]|0)<(p|0))c[m>>2]=p;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}k=b[o+-2>>1]|0;if(k<<16>>16>0){b[o>>1]=k;k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(p|0)){k=n;break}c[k>>2]=p;k=n;break}else{k=n+1|0;if((n|0)>32767)break b;b[o>>1]=k;c[j+1179664+(n<<2)>>2]=k<<16>>16;n=n*7|0;c[j+1310736+(n<<2)>>2]=1;c[j+1310736+(n+1<<2)>>2]=p;c[j+1310736+(n+2<<2)>>2]=v;c[j+1310736+(n+3<<2)>>2]=p;c[j+1310736+(n+4<<2)>>2]=p;c[j+1310736+(n+5<<2)>>2]=v;c[j+1310736+(n+6<<2)>>2]=v;break}}if(m){k=c[j+1179664+(a+-1<<2)>>2]|0;a=c[j+1179664+(e+-1<<2)>>2]|0;if((k|0)>(a|0)){b[o>>1]=a;if((n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(k|0))c[f>>2]=a;m=m+1|0;if((m|0)>=(n|0)){k=a;break}else f=f+4|0}}else k=a}else{b[o>>1]=k;if((k|0)<(a|0)&(n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(a|0))c[f>>2]=k;m=m+1|0;if((m|0)>=(n|0))break;else f=f+4|0}}}k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}m=b[o+-2>>1]|0;if(m<<16>>16<=0){b[o>>1]=f;k=a*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+p;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+v;m=j+1310736+(k+-4<<2)|0;if((c[m>>2]|0)>(p|0))c[m>>2]=p;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}k=c[j+1179664+(a+-1<<2)>>2]|0;a=c[j+1179664+((m<<16>>16)+-1<<2)>>2]|0;if((k|0)>(a|0)){b[o>>1]=a;if((n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(k|0))c[f>>2]=a;m=m+1|0;if((m|0)>=(n|0)){k=a;break}else f=f+4|0}}else k=a}else{b[o>>1]=k;if((k|0)<(a|0)&(n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(a|0))c[f>>2]=k;m=m+1|0;if((m|0)>=(n|0))break;else f=f+4|0}}}k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+v;k=n}while(0);p=p+1|0;g=g+4|0;m=o+2|0;if((p|0)>=(x|0))break;else{o=m;n=k}}}v=v+1|0;if((v|0)>=(y|0)){e=k;A=52;break a}else{g=g+q|0;m=m+4|0}}Me(3,3904,z);k=-1}else{e=0;A=52}while(0);if((A|0)==52){f=j+12|0;if((e|0)<1)g=1;else{m=1;g=1;while(1){k=c[l>>2]|0;if((k|0)==(m|0)){k=g;g=g+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[l>>2]=k;if((m|0)<(e|0)){m=m+1|0;l=l+4|0}else break}}a=j+8|0;k=g+-1|0;c[a>>2]=k;if(k){ek(f|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((g|0)>1){k=0;do{A=k<<2;c[j+131084+(A<<2)>>2]=B;c[j+131084+((A|1)<<2)>>2]=0;c[j+131084+((A|2)<<2)>>2]=C;c[j+131084+((A|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[a>>2]|0))}if((e|0)>0){f=0;do{l=(c[j+1179664+(f<<2)>>2]|0)+-1|0;m=f*7|0;k=j+12+(l<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(m<<2)>>2]|0);k=l<<1;g=j+655376+(k<<3)|0;h[g>>3]=+h[g>>3]+ +(c[j+1310736+(m+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(m+2<<2)>>2]|0);l=l<<2;k=j+131084+(l<<2)|0;g=c[j+1310736+(m+3<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;k=j+131084+((l|1)<<2)|0;g=c[j+1310736+(m+4<<2)>>2]|0;if((c[k>>2]|0)<(g|0))c[k>>2]=g;k=j+131084+((l|2)<<2)|0;g=c[j+1310736+(m+5<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;g=j+131084+((l|3)<<2)|0;k=c[j+1310736+(m+6<<2)>>2]|0;if((c[g>>2]|0)<(k|0))c[g>>2]=k;f=f+1|0}while((f|0)<(e|0))}if((c[a>>2]|0)>0){k=0;do{B=j+12+(k<<2)|0;C=k<<1;A=j+655376+(C<<3)|0;h[A>>3]=+h[A>>3]/+(c[B>>2]|0);C=j+655376+((C|1)<<3)|0;h[C>>3]=+h[C>>3]/+(c[B>>2]|0);k=k+1|0}while((k|0)<(c[a>>2]|0));k=0}else k=0}else k=0}i=D;return k|0}function rc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;D=i;i=i+16|0;z=D;B=(e|0)/2|0;C=(f|0)/2|0;n=c[j>>2]|0;y=C+-1|0;if((e|0)>1){k=0;l=n;m=n+(($(y,B)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(B|0))break;else{l=l+2|0;m=m+2|0}}}w=g*3|0;x=B+-1|0;if((f|0)>1){k=0;g=n;l=n+(x<<1)|0;while(1){b[l>>1]=0;b[g>>1]=0;k=k+1|0;if((k|0)>=(C|0))break;else{g=g+(B<<1)|0;l=l+(B<<1)|0}}}l=j+1179664|0;t=0-B|0;r=1-B|0;s=~B;q=(e<<1)+8|0;a:do if((y|0)>1){u=(x|0)>1;v=1;g=a+((e<<2)+4)|0;m=n+(B+1<<1)|0;k=0;b:while(1){if(u){p=1;o=m;n=k;while(1){a=d[g>>0]|0;e=d[g+1>>0]|0;do if(((a&248)+12+(a<<5&224)+(e>>>3&24)+(e<<2&248)|0)>(w|0)){b[o>>1]=0;k=n}else{k=b[o+(t<<1)>>1]|0;if(k<<16>>16>0){b[o>>1]=k;k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}f=b[o+(r<<1)>>1]|0;a=f<<16>>16;k=b[o+(s<<1)>>1]|0;e=k<<16>>16;m=k<<16>>16>0;if(f<<16>>16<=0){if(m){b[o>>1]=k;k=e*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+p;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+v;m=j+1310736+(k+-3<<2)|0;if((c[m>>2]|0)<(p|0))c[m>>2]=p;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}k=b[o+-2>>1]|0;if(k<<16>>16>0){b[o>>1]=k;k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(p|0)){k=n;break}c[k>>2]=p;k=n;break}else{k=n+1|0;if((n|0)>32767)break b;b[o>>1]=k;c[j+1179664+(n<<2)>>2]=k<<16>>16;n=n*7|0;c[j+1310736+(n<<2)>>2]=1;c[j+1310736+(n+1<<2)>>2]=p;c[j+1310736+(n+2<<2)>>2]=v;c[j+1310736+(n+3<<2)>>2]=p;c[j+1310736+(n+4<<2)>>2]=p;c[j+1310736+(n+5<<2)>>2]=v;c[j+1310736+(n+6<<2)>>2]=v;break}}if(m){k=c[j+1179664+(a+-1<<2)>>2]|0;a=c[j+1179664+(e+-1<<2)>>2]|0;if((k|0)>(a|0)){b[o>>1]=a;if((n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(k|0))c[f>>2]=a;m=m+1|0;if((m|0)>=(n|0)){k=a;break}else f=f+4|0}}else k=a}else{b[o>>1]=k;if((k|0)<(a|0)&(n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(a|0))c[f>>2]=k;m=m+1|0;if((m|0)>=(n|0))break;else f=f+4|0}}}k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}m=b[o+-2>>1]|0;if(m<<16>>16<=0){b[o>>1]=f;k=a*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+p;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+v;m=j+1310736+(k+-4<<2)|0;if((c[m>>2]|0)>(p|0))c[m>>2]=p;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}k=c[j+1179664+(a+-1<<2)>>2]|0;a=c[j+1179664+((m<<16>>16)+-1<<2)>>2]|0;if((k|0)>(a|0)){b[o>>1]=a;if((n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(k|0))c[f>>2]=a;m=m+1|0;if((m|0)>=(n|0)){k=a;break}else f=f+4|0}}else k=a}else{b[o>>1]=k;if((k|0)<(a|0)&(n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(a|0))c[f>>2]=k;m=m+1|0;if((m|0)>=(n|0))break;else f=f+4|0}}}k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+v;k=n}while(0);p=p+1|0;g=g+4|0;m=o+2|0;if((p|0)>=(x|0))break;else{o=m;n=k}}}v=v+1|0;if((v|0)>=(y|0)){e=k;A=52;break a}else{g=g+q|0;m=m+4|0}}Me(3,3904,z);k=-1}else{e=0;A=52}while(0);if((A|0)==52){f=j+12|0;if((e|0)<1)g=1;else{m=1;g=1;while(1){k=c[l>>2]|0;if((k|0)==(m|0)){k=g;g=g+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[l>>2]=k;if((m|0)<(e|0)){m=m+1|0;l=l+4|0}else break}}a=j+8|0;k=g+-1|0;c[a>>2]=k;if(k){ek(f|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((g|0)>1){k=0;do{A=k<<2;c[j+131084+(A<<2)>>2]=B;c[j+131084+((A|1)<<2)>>2]=0;c[j+131084+((A|2)<<2)>>2]=C;c[j+131084+((A|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[a>>2]|0))}if((e|0)>0){f=0;do{l=(c[j+1179664+(f<<2)>>2]|0)+-1|0;m=f*7|0;k=j+12+(l<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(m<<2)>>2]|0);k=l<<1;g=j+655376+(k<<3)|0;h[g>>3]=+h[g>>3]+ +(c[j+1310736+(m+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(m+2<<2)>>2]|0);l=l<<2;k=j+131084+(l<<2)|0;g=c[j+1310736+(m+3<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;k=j+131084+((l|1)<<2)|0;g=c[j+1310736+(m+4<<2)>>2]|0;if((c[k>>2]|0)<(g|0))c[k>>2]=g;k=j+131084+((l|2)<<2)|0;g=c[j+1310736+(m+5<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;g=j+131084+((l|3)<<2)|0;k=c[j+1310736+(m+6<<2)>>2]|0;if((c[g>>2]|0)<(k|0))c[g>>2]=k;f=f+1|0}while((f|0)<(e|0))}if((c[a>>2]|0)>0){k=0;do{B=j+12+(k<<2)|0;C=k<<1;A=j+655376+(C<<3)|0;h[A>>3]=+h[A>>3]/+(c[B>>2]|0);C=j+655376+((C|1)<<3)|0;h[C>>3]=+h[C>>3]/+(c[B>>2]|0);k=k+1|0}while((k|0)<(c[a>>2]|0));k=0}else k=0}else k=0}i=D;return k|0}function sc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;D=i;i=i+16|0;z=D;B=(e|0)/2|0;C=(f|0)/2|0;n=c[j>>2]|0;y=C+-1|0;if((e|0)>1){k=0;l=n;m=n+(($(y,B)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(B|0))break;else{l=l+2|0;m=m+2|0}}}w=g*3|0;x=B+-1|0;if((f|0)>1){k=0;g=n;l=n+(x<<1)|0;while(1){b[l>>1]=0;b[g>>1]=0;k=k+1|0;if((k|0)>=(C|0))break;else{g=g+(B<<1)|0;l=l+(B<<1)|0}}}l=j+1179664|0;t=0-B|0;r=1-B|0;s=~B;q=(e<<2)+16|0;a:do if((y|0)>1){u=(x|0)>1;v=1;g=a+((e<<3)+8)|0;m=n+(B+1<<1)|0;k=0;b:while(1){if(u){p=1;o=m;n=k;while(1){do if(((d[g+2>>0]|0)+(d[g+1>>0]|0)+(d[g+3>>0]|0)|0)>(w|0)){b[o>>1]=0;k=n}else{k=b[o+(t<<1)>>1]|0;if(k<<16>>16>0){b[o>>1]=k;k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}f=b[o+(r<<1)>>1]|0;a=f<<16>>16;k=b[o+(s<<1)>>1]|0;e=k<<16>>16;m=k<<16>>16>0;if(f<<16>>16<=0){if(m){b[o>>1]=k;k=e*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+p;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+v;m=j+1310736+(k+-3<<2)|0;if((c[m>>2]|0)<(p|0))c[m>>2]=p;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}k=b[o+-2>>1]|0;if(k<<16>>16>0){b[o>>1]=k;k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(p|0)){k=n;break}c[k>>2]=p;k=n;break}else{k=n+1|0;if((n|0)>32767)break b;b[o>>1]=k;c[j+1179664+(n<<2)>>2]=k<<16>>16;n=n*7|0;c[j+1310736+(n<<2)>>2]=1;c[j+1310736+(n+1<<2)>>2]=p;c[j+1310736+(n+2<<2)>>2]=v;c[j+1310736+(n+3<<2)>>2]=p;c[j+1310736+(n+4<<2)>>2]=p;c[j+1310736+(n+5<<2)>>2]=v;c[j+1310736+(n+6<<2)>>2]=v;break}}if(m){k=c[j+1179664+(a+-1<<2)>>2]|0;a=c[j+1179664+(e+-1<<2)>>2]|0;if((k|0)>(a|0)){b[o>>1]=a;if((n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(k|0))c[f>>2]=a;m=m+1|0;if((m|0)>=(n|0)){k=a;break}else f=f+4|0}}else k=a}else{b[o>>1]=k;if((k|0)<(a|0)&(n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(a|0))c[f>>2]=k;m=m+1|0;if((m|0)>=(n|0))break;else f=f+4|0}}}k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}m=b[o+-2>>1]|0;if(m<<16>>16<=0){b[o>>1]=f;k=a*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+p;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+v;m=j+1310736+(k+-4<<2)|0;if((c[m>>2]|0)>(p|0))c[m>>2]=p;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}k=c[j+1179664+(a+-1<<2)>>2]|0;a=c[j+1179664+((m<<16>>16)+-1<<2)>>2]|0;if((k|0)>(a|0)){b[o>>1]=a;if((n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(k|0))c[f>>2]=a;m=m+1|0;if((m|0)>=(n|0)){k=a;break}else f=f+4|0}}else k=a}else{b[o>>1]=k;if((k|0)<(a|0)&(n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(a|0))c[f>>2]=k;m=m+1|0;if((m|0)>=(n|0))break;else f=f+4|0}}}k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+v;k=n}while(0);p=p+1|0;g=g+8|0;m=o+2|0;if((p|0)>=(x|0))break;else{o=m;n=k}}}v=v+1|0;if((v|0)>=(y|0)){e=k;A=52;break a}else{g=g+q|0;m=m+4|0}}Me(3,3904,z);k=-1}else{e=0;A=52}while(0);if((A|0)==52){f=j+12|0;if((e|0)<1)g=1;else{m=1;g=1;while(1){k=c[l>>2]|0;if((k|0)==(m|0)){k=g;g=g+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[l>>2]=k;if((m|0)<(e|0)){m=m+1|0;l=l+4|0}else break}}a=j+8|0;k=g+-1|0;c[a>>2]=k;if(k){ek(f|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((g|0)>1){k=0;do{A=k<<2;c[j+131084+(A<<2)>>2]=B;c[j+131084+((A|1)<<2)>>2]=0;c[j+131084+((A|2)<<2)>>2]=C;c[j+131084+((A|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[a>>2]|0))}if((e|0)>0){f=0;do{l=(c[j+1179664+(f<<2)>>2]|0)+-1|0;m=f*7|0;k=j+12+(l<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(m<<2)>>2]|0);k=l<<1;g=j+655376+(k<<3)|0;h[g>>3]=+h[g>>3]+ +(c[j+1310736+(m+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(m+2<<2)>>2]|0);l=l<<2;k=j+131084+(l<<2)|0;g=c[j+1310736+(m+3<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;k=j+131084+((l|1)<<2)|0;g=c[j+1310736+(m+4<<2)>>2]|0;if((c[k>>2]|0)<(g|0))c[k>>2]=g;k=j+131084+((l|2)<<2)|0;g=c[j+1310736+(m+5<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;g=j+131084+((l|3)<<2)|0;k=c[j+1310736+(m+6<<2)>>2]|0;if((c[g>>2]|0)<(k|0))c[g>>2]=k;f=f+1|0}while((f|0)<(e|0))}if((c[a>>2]|0)>0){k=0;do{B=j+12+(k<<2)|0;C=k<<1;A=j+655376+(C<<3)|0;h[A>>3]=+h[A>>3]/+(c[B>>2]|0);C=j+655376+((C|1)<<3)|0;h[C>>3]=+h[C>>3]/+(c[B>>2]|0);k=k+1|0}while((k|0)<(c[a>>2]|0));k=0}else k=0}else k=0}i=D;return k|0}function tc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;D=i;i=i+16|0;z=D;B=(e|0)/2|0;C=(f|0)/2|0;n=c[j>>2]|0;y=C+-1|0;if((e|0)>1){k=0;l=n;m=n+(($(y,B)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(B|0))break;else{l=l+2|0;m=m+2|0}}}x=B+-1|0;if((f|0)>1){k=0;l=n;m=n+(x<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(C|0))break;else{l=l+(B<<1)|0;m=m+(B<<1)|0}}}m=j+1179664|0;u=0-B|0;s=1-B|0;t=~B;r=e+4|0;a:do if((y|0)>1){v=(x|0)>1;w=1;l=a+((e<<1)+2)|0;f=n+(B+1<<1)|0;k=0;b:while(1){if(v){q=1;p=f;o=k;while(1){do if((d[l>>0]|0|0)>(g|0)){b[p>>1]=0;k=o}else{k=b[p+(u<<1)>>1]|0;if(k<<16>>16>0){b[p>>1]=k;k=(k<<16>>16)*7|0;n=j+1310736+(k+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=j+1310736+(k+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+q;n=j+1310736+(k+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=o;break}a=b[p+(s<<1)>>1]|0;e=a<<16>>16;k=b[p+(t<<1)>>1]|0;n=k<<16>>16;f=k<<16>>16>0;if(a<<16>>16<=0){if(f){b[p>>1]=k;k=n*7|0;f=j+1310736+(k+-7<<2)|0;c[f>>2]=(c[f>>2]|0)+1;f=j+1310736+(k+-6<<2)|0;c[f>>2]=(c[f>>2]|0)+q;f=j+1310736+(k+-5<<2)|0;c[f>>2]=(c[f>>2]|0)+w;f=j+1310736+(k+-3<<2)|0;if((c[f>>2]|0)<(q|0))c[f>>2]=q;c[j+1310736+(k+-1<<2)>>2]=w;k=o;break}k=b[p+-2>>1]|0;if(k<<16>>16>0){b[p>>1]=k;k=(k<<16>>16)*7|0;n=j+1310736+(k+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=j+1310736+(k+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+q;n=j+1310736+(k+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+w;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(q|0)){k=o;break}c[k>>2]=q;k=o;break}else{k=o+1|0;if((o|0)>32767)break b;b[p>>1]=k;c[j+1179664+(o<<2)>>2]=k<<16>>16;o=o*7|0;c[j+1310736+(o<<2)>>2]=1;c[j+1310736+(o+1<<2)>>2]=q;c[j+1310736+(o+2<<2)>>2]=w;c[j+1310736+(o+3<<2)>>2]=q;c[j+1310736+(o+4<<2)>>2]=q;c[j+1310736+(o+5<<2)>>2]=w;c[j+1310736+(o+6<<2)>>2]=w;break}}if(f){k=c[j+1179664+(e+-1<<2)>>2]|0;e=c[j+1179664+(n+-1<<2)>>2]|0;if((k|0)>(e|0)){b[p>>1]=e;if((o|0)>0){f=0;a=m;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=e;f=f+1|0;if((f|0)>=(o|0)){k=e;break}else a=a+4|0}}else k=e}else{b[p>>1]=k;if((k|0)<(e|0)&(o|0)>0){f=0;a=m;while(1){if((c[a>>2]|0)==(e|0))c[a>>2]=k;f=f+1|0;if((f|0)>=(o|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;n=j+1310736+(k+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=j+1310736+(k+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+q;n=j+1310736+(k+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=o;break}f=b[p+-2>>1]|0;if(f<<16>>16<=0){b[p>>1]=a;k=e*7|0;f=j+1310736+(k+-7<<2)|0;c[f>>2]=(c[f>>2]|0)+1;f=j+1310736+(k+-6<<2)|0;c[f>>2]=(c[f>>2]|0)+q;f=j+1310736+(k+-5<<2)|0;c[f>>2]=(c[f>>2]|0)+w;f=j+1310736+(k+-4<<2)|0;if((c[f>>2]|0)>(q|0))c[f>>2]=q;c[j+1310736+(k+-1<<2)>>2]=w;k=o;break}k=c[j+1179664+(e+-1<<2)>>2]|0;e=c[j+1179664+((f<<16>>16)+-1<<2)>>2]|0;if((k|0)>(e|0)){b[p>>1]=e;if((o|0)>0){f=0;a=m;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=e;f=f+1|0;if((f|0)>=(o|0)){k=e;break}else a=a+4|0}}else k=e}else{b[p>>1]=k;if((k|0)<(e|0)&(o|0)>0){f=0;a=m;while(1){if((c[a>>2]|0)==(e|0))c[a>>2]=k;f=f+1|0;if((f|0)>=(o|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;n=j+1310736+(k+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=j+1310736+(k+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+q;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+w;k=o}while(0);q=q+1|0;l=l+2|0;f=p+2|0;if((q|0)>=(x|0))break;else{p=f;o=k}}}w=w+1|0;if((w|0)>=(y|0)){n=k;A=52;break a}else{l=l+r|0;f=f+4|0}}Me(3,3904,z);k=-1}else{n=0;A=52}while(0);if((A|0)==52){a=j+12|0;if((n|0)<1)l=1;else{f=1;l=1;while(1){k=c[m>>2]|0;if((k|0)==(f|0)){k=l;l=l+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[m>>2]=k;if((f|0)<(n|0)){f=f+1|0;m=m+4|0}else break}}e=j+8|0;k=l+-1|0;c[e>>2]=k;if(k){ek(a|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((l|0)>1){k=0;do{A=k<<2;c[j+131084+(A<<2)>>2]=B;c[j+131084+((A|1)<<2)>>2]=0;c[j+131084+((A|2)<<2)>>2]=C;c[j+131084+((A|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[e>>2]|0))}if((n|0)>0){a=0;do{m=(c[j+1179664+(a<<2)>>2]|0)+-1|0;f=a*7|0;k=j+12+(m<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(f<<2)>>2]|0);k=m<<1;l=j+655376+(k<<3)|0;h[l>>3]=+h[l>>3]+ +(c[j+1310736+(f+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(f+2<<2)>>2]|0);m=m<<2;k=j+131084+(m<<2)|0;l=c[j+1310736+(f+3<<2)>>2]|0;if((c[k>>2]|0)>(l|0))c[k>>2]=l;k=j+131084+((m|1)<<2)|0;l=c[j+1310736+(f+4<<2)>>2]|0;if((c[k>>2]|0)<(l|0))c[k>>2]=l;k=j+131084+((m|2)<<2)|0;l=c[j+1310736+(f+5<<2)>>2]|0;if((c[k>>2]|0)>(l|0))c[k>>2]=l;l=j+131084+((m|3)<<2)|0;k=c[j+1310736+(f+6<<2)>>2]|0;if((c[l>>2]|0)<(k|0))c[l>>2]=k;a=a+1|0}while((a|0)<(n|0))}if((c[e>>2]|0)>0){k=0;do{B=j+12+(k<<2)|0;C=k<<1;A=j+655376+(C<<3)|0;h[A>>3]=+h[A>>3]/+(c[B>>2]|0);C=j+655376+((C|1)<<3)|0;h[C>>3]=+h[C>>3]/+(c[B>>2]|0);k=k+1|0}while((k|0)<(c[e>>2]|0));k=0}else k=0}else k=0}i=D;return k|0}function uc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;D=i;i=i+16|0;z=D;B=(e|0)/2|0;C=(f|0)/2|0;n=c[j>>2]|0;y=C+-1|0;if((e|0)>1){k=0;l=n;m=n+(($(y,B)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(B|0))break;else{l=l+2|0;m=m+2|0}}}x=B+-1|0;if((f|0)>1){k=0;l=n;m=n+(x<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(C|0))break;else{l=l+(B<<1)|0;m=m+(B<<1)|0}}}m=j+1179664|0;u=0-B|0;s=1-B|0;t=~B;r=(e<<1)+8|0;a:do if((y|0)>1){v=(x|0)>1;w=1;l=a+((e<<2)+4)|0;f=n+(B+1<<1)|0;k=0;b:while(1){if(v){q=1;p=f;o=k;while(1){do if((d[l+1>>0]|0|0)>(g|0)){b[p>>1]=0;k=o}else{k=b[p+(u<<1)>>1]|0;if(k<<16>>16>0){b[p>>1]=k;k=(k<<16>>16)*7|0;n=j+1310736+(k+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=j+1310736+(k+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+q;n=j+1310736+(k+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=o;break}a=b[p+(s<<1)>>1]|0;e=a<<16>>16;k=b[p+(t<<1)>>1]|0;n=k<<16>>16;f=k<<16>>16>0;if(a<<16>>16<=0){if(f){b[p>>1]=k;k=n*7|0;f=j+1310736+(k+-7<<2)|0;c[f>>2]=(c[f>>2]|0)+1;f=j+1310736+(k+-6<<2)|0;c[f>>2]=(c[f>>2]|0)+q;f=j+1310736+(k+-5<<2)|0;c[f>>2]=(c[f>>2]|0)+w;f=j+1310736+(k+-3<<2)|0;if((c[f>>2]|0)<(q|0))c[f>>2]=q;c[j+1310736+(k+-1<<2)>>2]=w;k=o;break}k=b[p+-2>>1]|0;if(k<<16>>16>0){b[p>>1]=k;k=(k<<16>>16)*7|0;n=j+1310736+(k+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=j+1310736+(k+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+q;n=j+1310736+(k+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+w;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(q|0)){k=o;break}c[k>>2]=q;k=o;break}else{k=o+1|0;if((o|0)>32767)break b;b[p>>1]=k;c[j+1179664+(o<<2)>>2]=k<<16>>16;o=o*7|0;c[j+1310736+(o<<2)>>2]=1;c[j+1310736+(o+1<<2)>>2]=q;c[j+1310736+(o+2<<2)>>2]=w;c[j+1310736+(o+3<<2)>>2]=q;c[j+1310736+(o+4<<2)>>2]=q;c[j+1310736+(o+5<<2)>>2]=w;c[j+1310736+(o+6<<2)>>2]=w;break}}if(f){k=c[j+1179664+(e+-1<<2)>>2]|0;e=c[j+1179664+(n+-1<<2)>>2]|0;if((k|0)>(e|0)){b[p>>1]=e;if((o|0)>0){f=0;a=m;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=e;f=f+1|0;if((f|0)>=(o|0)){k=e;break}else a=a+4|0}}else k=e}else{b[p>>1]=k;if((k|0)<(e|0)&(o|0)>0){f=0;a=m;while(1){if((c[a>>2]|0)==(e|0))c[a>>2]=k;f=f+1|0;if((f|0)>=(o|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;n=j+1310736+(k+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=j+1310736+(k+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+q;n=j+1310736+(k+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=o;break}f=b[p+-2>>1]|0;if(f<<16>>16<=0){b[p>>1]=a;k=e*7|0;f=j+1310736+(k+-7<<2)|0;c[f>>2]=(c[f>>2]|0)+1;f=j+1310736+(k+-6<<2)|0;c[f>>2]=(c[f>>2]|0)+q;f=j+1310736+(k+-5<<2)|0;c[f>>2]=(c[f>>2]|0)+w;f=j+1310736+(k+-4<<2)|0;if((c[f>>2]|0)>(q|0))c[f>>2]=q;c[j+1310736+(k+-1<<2)>>2]=w;k=o;break}k=c[j+1179664+(e+-1<<2)>>2]|0;e=c[j+1179664+((f<<16>>16)+-1<<2)>>2]|0;if((k|0)>(e|0)){b[p>>1]=e;if((o|0)>0){f=0;a=m;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=e;f=f+1|0;if((f|0)>=(o|0)){k=e;break}else a=a+4|0}}else k=e}else{b[p>>1]=k;if((k|0)<(e|0)&(o|0)>0){f=0;a=m;while(1){if((c[a>>2]|0)==(e|0))c[a>>2]=k;f=f+1|0;if((f|0)>=(o|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;n=j+1310736+(k+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=j+1310736+(k+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+q;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+w;k=o}while(0);q=q+1|0;l=l+4|0;f=p+2|0;if((q|0)>=(x|0))break;else{p=f;o=k}}}w=w+1|0;if((w|0)>=(y|0)){n=k;A=52;break a}else{l=l+r|0;f=f+4|0}}Me(3,3904,z);k=-1}else{n=0;A=52}while(0);if((A|0)==52){a=j+12|0;if((n|0)<1)l=1;else{f=1;l=1;while(1){k=c[m>>2]|0;if((k|0)==(f|0)){k=l;l=l+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[m>>2]=k;if((f|0)<(n|0)){f=f+1|0;m=m+4|0}else break}}e=j+8|0;k=l+-1|0;c[e>>2]=k;if(k){ek(a|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((l|0)>1){k=0;do{A=k<<2;c[j+131084+(A<<2)>>2]=B;c[j+131084+((A|1)<<2)>>2]=0;c[j+131084+((A|2)<<2)>>2]=C;c[j+131084+((A|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[e>>2]|0))}if((n|0)>0){a=0;do{m=(c[j+1179664+(a<<2)>>2]|0)+-1|0;f=a*7|0;k=j+12+(m<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(f<<2)>>2]|0);k=m<<1;l=j+655376+(k<<3)|0;h[l>>3]=+h[l>>3]+ +(c[j+1310736+(f+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(f+2<<2)>>2]|0);m=m<<2;k=j+131084+(m<<2)|0;l=c[j+1310736+(f+3<<2)>>2]|0;if((c[k>>2]|0)>(l|0))c[k>>2]=l;k=j+131084+((m|1)<<2)|0;l=c[j+1310736+(f+4<<2)>>2]|0;if((c[k>>2]|0)<(l|0))c[k>>2]=l;k=j+131084+((m|2)<<2)|0;l=c[j+1310736+(f+5<<2)>>2]|0;if((c[k>>2]|0)>(l|0))c[k>>2]=l;l=j+131084+((m|3)<<2)|0;k=c[j+1310736+(f+6<<2)>>2]|0;if((c[l>>2]|0)<(k|0))c[l>>2]=k;a=a+1|0}while((a|0)<(n|0))}if((c[e>>2]|0)>0){k=0;do{B=j+12+(k<<2)|0;C=k<<1;A=j+655376+(C<<3)|0;h[A>>3]=+h[A>>3]/+(c[B>>2]|0);C=j+655376+((C|1)<<3)|0;h[C>>3]=+h[C>>3]/+(c[B>>2]|0);k=k+1|0}while((k|0)<(c[e>>2]|0));k=0}else k=0}else k=0}i=D;return k|0}function vc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;D=i;i=i+16|0;z=D;B=(e|0)/2|0;C=(f|0)/2|0;n=c[j>>2]|0;y=C+-1|0;if((e|0)>1){k=0;l=n;m=n+(($(y,B)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(B|0))break;else{l=l+2|0;m=m+2|0}}}x=B+-1|0;if((f|0)>1){k=0;l=n;m=n+(x<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(C|0))break;else{l=l+(B<<1)|0;m=m+(B<<1)|0}}}m=j+1179664|0;u=0-B|0;s=1-B|0;t=~B;r=(e<<1)+8|0;a:do if((y|0)>1){v=(x|0)>1;w=1;l=a+((e<<2)+4)|0;f=n+(B+1<<1)|0;k=0;b:while(1){if(v){q=1;p=f;o=k;while(1){do if((d[l>>0]|0|0)>(g|0)){b[p>>1]=0;k=o}else{k=b[p+(u<<1)>>1]|0;if(k<<16>>16>0){b[p>>1]=k;k=(k<<16>>16)*7|0;n=j+1310736+(k+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=j+1310736+(k+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+q;n=j+1310736+(k+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=o;break}a=b[p+(s<<1)>>1]|0;e=a<<16>>16;k=b[p+(t<<1)>>1]|0;n=k<<16>>16;f=k<<16>>16>0;if(a<<16>>16<=0){if(f){b[p>>1]=k;k=n*7|0;f=j+1310736+(k+-7<<2)|0;c[f>>2]=(c[f>>2]|0)+1;f=j+1310736+(k+-6<<2)|0;c[f>>2]=(c[f>>2]|0)+q;f=j+1310736+(k+-5<<2)|0;c[f>>2]=(c[f>>2]|0)+w;f=j+1310736+(k+-3<<2)|0;if((c[f>>2]|0)<(q|0))c[f>>2]=q;c[j+1310736+(k+-1<<2)>>2]=w;k=o;break}k=b[p+-2>>1]|0;if(k<<16>>16>0){b[p>>1]=k;k=(k<<16>>16)*7|0;n=j+1310736+(k+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=j+1310736+(k+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+q;n=j+1310736+(k+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+w;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(q|0)){k=o;break}c[k>>2]=q;k=o;break}else{k=o+1|0;if((o|0)>32767)break b;b[p>>1]=k;c[j+1179664+(o<<2)>>2]=k<<16>>16;o=o*7|0;c[j+1310736+(o<<2)>>2]=1;c[j+1310736+(o+1<<2)>>2]=q;c[j+1310736+(o+2<<2)>>2]=w;c[j+1310736+(o+3<<2)>>2]=q;c[j+1310736+(o+4<<2)>>2]=q;c[j+1310736+(o+5<<2)>>2]=w;c[j+1310736+(o+6<<2)>>2]=w;break}}if(f){k=c[j+1179664+(e+-1<<2)>>2]|0;e=c[j+1179664+(n+-1<<2)>>2]|0;if((k|0)>(e|0)){b[p>>1]=e;if((o|0)>0){f=0;a=m;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=e;f=f+1|0;if((f|0)>=(o|0)){k=e;break}else a=a+4|0}}else k=e}else{b[p>>1]=k;if((k|0)<(e|0)&(o|0)>0){f=0;a=m;while(1){if((c[a>>2]|0)==(e|0))c[a>>2]=k;f=f+1|0;if((f|0)>=(o|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;n=j+1310736+(k+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=j+1310736+(k+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+q;n=j+1310736+(k+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=o;break}f=b[p+-2>>1]|0;if(f<<16>>16<=0){b[p>>1]=a;k=e*7|0;f=j+1310736+(k+-7<<2)|0;c[f>>2]=(c[f>>2]|0)+1;f=j+1310736+(k+-6<<2)|0;c[f>>2]=(c[f>>2]|0)+q;f=j+1310736+(k+-5<<2)|0;c[f>>2]=(c[f>>2]|0)+w;f=j+1310736+(k+-4<<2)|0;if((c[f>>2]|0)>(q|0))c[f>>2]=q;c[j+1310736+(k+-1<<2)>>2]=w;k=o;break}k=c[j+1179664+(e+-1<<2)>>2]|0;e=c[j+1179664+((f<<16>>16)+-1<<2)>>2]|0;if((k|0)>(e|0)){b[p>>1]=e;if((o|0)>0){f=0;a=m;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=e;f=f+1|0;if((f|0)>=(o|0)){k=e;break}else a=a+4|0}}else k=e}else{b[p>>1]=k;if((k|0)<(e|0)&(o|0)>0){f=0;a=m;while(1){if((c[a>>2]|0)==(e|0))c[a>>2]=k;f=f+1|0;if((f|0)>=(o|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;n=j+1310736+(k+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=j+1310736+(k+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+q;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+w;k=o}while(0);q=q+1|0;l=l+4|0;f=p+2|0;if((q|0)>=(x|0))break;else{p=f;o=k}}}w=w+1|0;if((w|0)>=(y|0)){n=k;A=52;break a}else{l=l+r|0;f=f+4|0}}Me(3,3904,z);k=-1}else{n=0;A=52}while(0);if((A|0)==52){a=j+12|0;if((n|0)<1)l=1;else{f=1;l=1;while(1){k=c[m>>2]|0;if((k|0)==(f|0)){k=l;l=l+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[m>>2]=k;if((f|0)<(n|0)){f=f+1|0;m=m+4|0}else break}}e=j+8|0;k=l+-1|0;c[e>>2]=k;if(k){ek(a|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((l|0)>1){k=0;do{A=k<<2;c[j+131084+(A<<2)>>2]=B;c[j+131084+((A|1)<<2)>>2]=0;c[j+131084+((A|2)<<2)>>2]=C;c[j+131084+((A|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[e>>2]|0))}if((n|0)>0){a=0;do{m=(c[j+1179664+(a<<2)>>2]|0)+-1|0;f=a*7|0;k=j+12+(m<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(f<<2)>>2]|0);k=m<<1;l=j+655376+(k<<3)|0;h[l>>3]=+h[l>>3]+ +(c[j+1310736+(f+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(f+2<<2)>>2]|0);m=m<<2;k=j+131084+(m<<2)|0;l=c[j+1310736+(f+3<<2)>>2]|0;if((c[k>>2]|0)>(l|0))c[k>>2]=l;k=j+131084+((m|1)<<2)|0;l=c[j+1310736+(f+4<<2)>>2]|0;if((c[k>>2]|0)<(l|0))c[k>>2]=l;k=j+131084+((m|2)<<2)|0;l=c[j+1310736+(f+5<<2)>>2]|0;if((c[k>>2]|0)>(l|0))c[k>>2]=l;l=j+131084+((m|3)<<2)|0;k=c[j+1310736+(f+6<<2)>>2]|0;if((c[l>>2]|0)<(k|0))c[l>>2]=k;a=a+1|0}while((a|0)<(n|0))}if((c[e>>2]|0)>0){k=0;do{B=j+12+(k<<2)|0;C=k<<1;A=j+655376+(C<<3)|0;h[A>>3]=+h[A>>3]/+(c[B>>2]|0);C=j+655376+((C|1)<<3)|0;h[C>>3]=+h[C>>3]/+(c[B>>2]|0);k=k+1|0}while((k|0)<(c[e>>2]|0));k=0}else k=0}else k=0}i=D;return k|0}function wc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=i;i=i+16|0;A=C;n=c[j>>2]|0;z=f+-1|0;if((e|0)>0){k=0;l=n;m=n+(($(z,e)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(e|0))break;else{l=l+2|0;m=m+2|0}}}y=g*3|0;x=e+-1|0;if((f|0)>0){k=0;g=n;l=n+(x<<1)|0;while(1){b[l>>1]=0;b[g>>1]=0;k=k+1|0;if((k|0)>=(f|0))break;else{g=g+(e<<1)|0;l=l+(e<<1)|0}}}l=j+1179664|0;k=e+1|0;u=0-e|0;s=1-e|0;t=~e;a:do if((z|0)>1){v=(x|0)>1;w=1;g=a+(k*3|0)|0;m=n+(k<<1)|0;k=0;b:while(1){if(v){r=1;q=m;p=k;while(1){do if(((d[g+1>>0]|0)+(d[g>>0]|0)+(d[g+2>>0]|0)|0)>(y|0)){b[q>>1]=0;k=p}else{k=b[q+(u<<1)>>1]|0;if(k<<16>>16>0){b[q>>1]=k;k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}a=b[q+(s<<1)>>1]|0;n=a<<16>>16;k=b[q+(t<<1)>>1]|0;o=k<<16>>16;m=k<<16>>16>0;if(a<<16>>16<=0){if(m){b[q>>1]=k;k=o*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+r;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+w;m=j+1310736+(k+-3<<2)|0;if((c[m>>2]|0)<(r|0))c[m>>2]=r;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}k=b[q+-2>>1]|0;if(k<<16>>16>0){b[q>>1]=k;k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(r|0)){k=p;break}c[k>>2]=r;k=p;break}else{k=p+1|0;if((p|0)>32767)break b;b[q>>1]=k;c[j+1179664+(p<<2)>>2]=k<<16>>16;p=p*7|0;c[j+1310736+(p<<2)>>2]=1;c[j+1310736+(p+1<<2)>>2]=r;c[j+1310736+(p+2<<2)>>2]=w;c[j+1310736+(p+3<<2)>>2]=r;c[j+1310736+(p+4<<2)>>2]=r;c[j+1310736+(p+5<<2)>>2]=w;c[j+1310736+(p+6<<2)>>2]=w;break}}if(m){k=c[j+1179664+(n+-1<<2)>>2]|0;n=c[j+1179664+(o+-1<<2)>>2]|0;if((k|0)>(n|0)){b[q>>1]=n;if((p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=n;m=m+1|0;if((m|0)>=(p|0)){k=n;break}else a=a+4|0}}else k=n}else{b[q>>1]=k;if((k|0)<(n|0)&(p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(n|0))c[a>>2]=k;m=m+1|0;if((m|0)>=(p|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}m=b[q+-2>>1]|0;if(m<<16>>16<=0){b[q>>1]=a;k=n*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+r;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+w;m=j+1310736+(k+-4<<2)|0;if((c[m>>2]|0)>(r|0))c[m>>2]=r;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}k=c[j+1179664+(n+-1<<2)>>2]|0;n=c[j+1179664+((m<<16>>16)+-1<<2)>>2]|0;if((k|0)>(n|0)){b[q>>1]=n;if((p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=n;m=m+1|0;if((m|0)>=(p|0)){k=n;break}else a=a+4|0}}else k=n}else{b[q>>1]=k;if((k|0)<(n|0)&(p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(n|0))c[a>>2]=k;m=m+1|0;if((m|0)>=(p|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+w;k=p}while(0);r=r+1|0;g=g+3|0;m=q+2|0;if((r|0)>=(x|0))break;else{q=m;p=k}}}w=w+1|0;if((w|0)>=(z|0)){o=k;B=52;break a}else{g=g+6|0;m=m+4|0}}Me(3,3904,A);k=-1}else{o=0;B=52}while(0);if((B|0)==52){a=j+12|0;if((o|0)<1)g=1;else{m=1;g=1;while(1){k=c[l>>2]|0;if((k|0)==(m|0)){k=g;g=g+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[l>>2]=k;if((m|0)<(o|0)){m=m+1|0;l=l+4|0}else break}}n=j+8|0;k=g+-1|0;c[n>>2]=k;if(k){ek(a|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((g|0)>1){k=0;do{B=k<<2;c[j+131084+(B<<2)>>2]=e;c[j+131084+((B|1)<<2)>>2]=0;c[j+131084+((B|2)<<2)>>2]=f;c[j+131084+((B|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[n>>2]|0))}if((o|0)>0){a=0;do{l=(c[j+1179664+(a<<2)>>2]|0)+-1|0;m=a*7|0;k=j+12+(l<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(m<<2)>>2]|0);k=l<<1;g=j+655376+(k<<3)|0;h[g>>3]=+h[g>>3]+ +(c[j+1310736+(m+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(m+2<<2)>>2]|0);l=l<<2;k=j+131084+(l<<2)|0;g=c[j+1310736+(m+3<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;k=j+131084+((l|1)<<2)|0;g=c[j+1310736+(m+4<<2)>>2]|0;if((c[k>>2]|0)<(g|0))c[k>>2]=g;k=j+131084+((l|2)<<2)|0;g=c[j+1310736+(m+5<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;g=j+131084+((l|3)<<2)|0;k=c[j+1310736+(m+6<<2)>>2]|0;if((c[g>>2]|0)<(k|0))c[g>>2]=k;a=a+1|0}while((a|0)<(o|0))}if((c[n>>2]|0)>0){k=0;do{e=j+12+(k<<2)|0;f=k<<1;B=j+655376+(f<<3)|0;h[B>>3]=+h[B>>3]/+(c[e>>2]|0);f=j+655376+((f|1)<<3)|0;h[f>>3]=+h[f>>3]/+(c[e>>2]|0);k=k+1|0}while((k|0)<(c[n>>2]|0));k=0}else k=0}else k=0}i=C;return k|0}function xc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=i;i=i+16|0;A=C;n=c[j>>2]|0;z=f+-1|0;if((e|0)>0){k=0;l=n;m=n+(($(z,e)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(e|0))break;else{l=l+2|0;m=m+2|0}}}y=g*3|0;x=e+-1|0;if((f|0)>0){k=0;g=n;l=n+(x<<1)|0;while(1){b[l>>1]=0;b[g>>1]=0;k=k+1|0;if((k|0)>=(f|0))break;else{g=g+(e<<1)|0;l=l+(e<<1)|0}}}l=j+1179664|0;k=e+1|0;u=0-e|0;s=1-e|0;t=~e;a:do if((z|0)>1){v=(x|0)>1;w=1;g=a+(k<<1)|0;m=n+(k<<1)|0;k=0;b:while(1){if(v){r=1;q=m;p=k;while(1){n=d[g>>0]|0;o=d[g+1>>0]|0;do if(((n&248)+10+(n<<5&224)+(o>>>3&28)+(o<<3&248)|0)>(y|0)){b[q>>1]=0;k=p}else{k=b[q+(u<<1)>>1]|0;if(k<<16>>16>0){b[q>>1]=k;k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}a=b[q+(s<<1)>>1]|0;n=a<<16>>16;k=b[q+(t<<1)>>1]|0;o=k<<16>>16;m=k<<16>>16>0;if(a<<16>>16<=0){if(m){b[q>>1]=k;k=o*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+r;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+w;m=j+1310736+(k+-3<<2)|0;if((c[m>>2]|0)<(r|0))c[m>>2]=r;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}k=b[q+-2>>1]|0;if(k<<16>>16>0){b[q>>1]=k;k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(r|0)){k=p;break}c[k>>2]=r;k=p;break}else{k=p+1|0;if((p|0)>32767)break b;b[q>>1]=k;c[j+1179664+(p<<2)>>2]=k<<16>>16;p=p*7|0;c[j+1310736+(p<<2)>>2]=1;c[j+1310736+(p+1<<2)>>2]=r;c[j+1310736+(p+2<<2)>>2]=w;c[j+1310736+(p+3<<2)>>2]=r;c[j+1310736+(p+4<<2)>>2]=r;c[j+1310736+(p+5<<2)>>2]=w;c[j+1310736+(p+6<<2)>>2]=w;break}}if(m){k=c[j+1179664+(n+-1<<2)>>2]|0;n=c[j+1179664+(o+-1<<2)>>2]|0;if((k|0)>(n|0)){b[q>>1]=n;if((p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=n;m=m+1|0;if((m|0)>=(p|0)){k=n;break}else a=a+4|0}}else k=n}else{b[q>>1]=k;if((k|0)<(n|0)&(p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(n|0))c[a>>2]=k;m=m+1|0;if((m|0)>=(p|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}m=b[q+-2>>1]|0;if(m<<16>>16<=0){b[q>>1]=a;k=n*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+r;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+w;m=j+1310736+(k+-4<<2)|0;if((c[m>>2]|0)>(r|0))c[m>>2]=r;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}k=c[j+1179664+(n+-1<<2)>>2]|0;n=c[j+1179664+((m<<16>>16)+-1<<2)>>2]|0;if((k|0)>(n|0)){b[q>>1]=n;if((p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=n;m=m+1|0;if((m|0)>=(p|0)){k=n;break}else a=a+4|0}}else k=n}else{b[q>>1]=k;if((k|0)<(n|0)&(p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(n|0))c[a>>2]=k;m=m+1|0;if((m|0)>=(p|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+w;k=p}while(0);r=r+1|0;g=g+2|0;m=q+2|0;if((r|0)>=(x|0))break;else{q=m;p=k}}}w=w+1|0;if((w|0)>=(z|0)){o=k;B=52;break a}else{g=g+4|0;m=m+4|0}}Me(3,3904,A);k=-1}else{o=0;B=52}while(0);if((B|0)==52){a=j+12|0;if((o|0)<1)g=1;else{m=1;g=1;while(1){k=c[l>>2]|0;if((k|0)==(m|0)){k=g;g=g+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[l>>2]=k;if((m|0)<(o|0)){m=m+1|0;l=l+4|0}else break}}n=j+8|0;k=g+-1|0;c[n>>2]=k;if(k){ek(a|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((g|0)>1){k=0;do{B=k<<2;c[j+131084+(B<<2)>>2]=e;c[j+131084+((B|1)<<2)>>2]=0;c[j+131084+((B|2)<<2)>>2]=f;c[j+131084+((B|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[n>>2]|0))}if((o|0)>0){a=0;do{l=(c[j+1179664+(a<<2)>>2]|0)+-1|0;m=a*7|0;k=j+12+(l<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(m<<2)>>2]|0);k=l<<1;g=j+655376+(k<<3)|0;h[g>>3]=+h[g>>3]+ +(c[j+1310736+(m+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(m+2<<2)>>2]|0);l=l<<2;k=j+131084+(l<<2)|0;g=c[j+1310736+(m+3<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;k=j+131084+((l|1)<<2)|0;g=c[j+1310736+(m+4<<2)>>2]|0;if((c[k>>2]|0)<(g|0))c[k>>2]=g;k=j+131084+((l|2)<<2)|0;g=c[j+1310736+(m+5<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;g=j+131084+((l|3)<<2)|0;k=c[j+1310736+(m+6<<2)>>2]|0;if((c[g>>2]|0)<(k|0))c[g>>2]=k;a=a+1|0}while((a|0)<(o|0))}if((c[n>>2]|0)>0){k=0;do{e=j+12+(k<<2)|0;f=k<<1;B=j+655376+(f<<3)|0;h[B>>3]=+h[B>>3]/+(c[e>>2]|0);f=j+655376+((f|1)<<3)|0;h[f>>3]=+h[f>>3]/+(c[e>>2]|0);k=k+1|0}while((k|0)<(c[n>>2]|0));k=0}else k=0}else k=0}i=C;return k|0}function yc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=i;i=i+16|0;A=C;n=c[j>>2]|0;z=f+-1|0;if((e|0)>0){k=0;l=n;m=n+(($(z,e)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(e|0))break;else{l=l+2|0;m=m+2|0}}}y=g*3|0;x=e+-1|0;if((f|0)>0){k=0;g=n;l=n+(x<<1)|0;while(1){b[l>>1]=0;b[g>>1]=0;k=k+1|0;if((k|0)>=(f|0))break;else{g=g+(e<<1)|0;l=l+(e<<1)|0}}}l=j+1179664|0;k=e+1|0;u=0-e|0;s=1-e|0;t=~e;a:do if((z|0)>1){v=(x|0)>1;w=1;g=a+(k<<2)|0;m=n+(k<<1)|0;k=0;b:while(1){if(v){r=1;q=m;p=k;while(1){do if(((d[g+1>>0]|0)+(d[g>>0]|0)+(d[g+2>>0]|0)|0)>(y|0)){b[q>>1]=0;k=p}else{k=b[q+(u<<1)>>1]|0;if(k<<16>>16>0){b[q>>1]=k;k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}a=b[q+(s<<1)>>1]|0;n=a<<16>>16;k=b[q+(t<<1)>>1]|0;o=k<<16>>16;m=k<<16>>16>0;if(a<<16>>16<=0){if(m){b[q>>1]=k;k=o*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+r;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+w;m=j+1310736+(k+-3<<2)|0;if((c[m>>2]|0)<(r|0))c[m>>2]=r;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}k=b[q+-2>>1]|0;if(k<<16>>16>0){b[q>>1]=k;k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(r|0)){k=p;break}c[k>>2]=r;k=p;break}else{k=p+1|0;if((p|0)>32767)break b;b[q>>1]=k;c[j+1179664+(p<<2)>>2]=k<<16>>16;p=p*7|0;c[j+1310736+(p<<2)>>2]=1;c[j+1310736+(p+1<<2)>>2]=r;c[j+1310736+(p+2<<2)>>2]=w;c[j+1310736+(p+3<<2)>>2]=r;c[j+1310736+(p+4<<2)>>2]=r;c[j+1310736+(p+5<<2)>>2]=w;c[j+1310736+(p+6<<2)>>2]=w;break}}if(m){k=c[j+1179664+(n+-1<<2)>>2]|0;n=c[j+1179664+(o+-1<<2)>>2]|0;if((k|0)>(n|0)){b[q>>1]=n;if((p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=n;m=m+1|0;if((m|0)>=(p|0)){k=n;break}else a=a+4|0}}else k=n}else{b[q>>1]=k;if((k|0)<(n|0)&(p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(n|0))c[a>>2]=k;m=m+1|0;if((m|0)>=(p|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}m=b[q+-2>>1]|0;if(m<<16>>16<=0){b[q>>1]=a;k=n*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+r;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+w;m=j+1310736+(k+-4<<2)|0;if((c[m>>2]|0)>(r|0))c[m>>2]=r;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}k=c[j+1179664+(n+-1<<2)>>2]|0;n=c[j+1179664+((m<<16>>16)+-1<<2)>>2]|0;if((k|0)>(n|0)){b[q>>1]=n;if((p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=n;m=m+1|0;if((m|0)>=(p|0)){k=n;break}else a=a+4|0}}else k=n}else{b[q>>1]=k;if((k|0)<(n|0)&(p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(n|0))c[a>>2]=k;m=m+1|0;if((m|0)>=(p|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+w;k=p}while(0);r=r+1|0;g=g+4|0;m=q+2|0;if((r|0)>=(x|0))break;else{q=m;p=k}}}w=w+1|0;if((w|0)>=(z|0)){o=k;B=52;break a}else{g=g+8|0;m=m+4|0}}Me(3,3904,A);k=-1}else{o=0;B=52}while(0);if((B|0)==52){a=j+12|0;if((o|0)<1)g=1;else{m=1;g=1;while(1){k=c[l>>2]|0;if((k|0)==(m|0)){k=g;g=g+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[l>>2]=k;if((m|0)<(o|0)){m=m+1|0;l=l+4|0}else break}}n=j+8|0;k=g+-1|0;c[n>>2]=k;if(k){ek(a|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((g|0)>1){k=0;do{B=k<<2;c[j+131084+(B<<2)>>2]=e;c[j+131084+((B|1)<<2)>>2]=0;c[j+131084+((B|2)<<2)>>2]=f;c[j+131084+((B|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[n>>2]|0))}if((o|0)>0){a=0;do{l=(c[j+1179664+(a<<2)>>2]|0)+-1|0;m=a*7|0;k=j+12+(l<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(m<<2)>>2]|0);k=l<<1;g=j+655376+(k<<3)|0;h[g>>3]=+h[g>>3]+ +(c[j+1310736+(m+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(m+2<<2)>>2]|0);l=l<<2;k=j+131084+(l<<2)|0;g=c[j+1310736+(m+3<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;k=j+131084+((l|1)<<2)|0;g=c[j+1310736+(m+4<<2)>>2]|0;if((c[k>>2]|0)<(g|0))c[k>>2]=g;k=j+131084+((l|2)<<2)|0;g=c[j+1310736+(m+5<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;g=j+131084+((l|3)<<2)|0;k=c[j+1310736+(m+6<<2)>>2]|0;if((c[g>>2]|0)<(k|0))c[g>>2]=k;a=a+1|0}while((a|0)<(o|0))}if((c[n>>2]|0)>0){k=0;do{e=j+12+(k<<2)|0;f=k<<1;B=j+655376+(f<<3)|0;h[B>>3]=+h[B>>3]/+(c[e>>2]|0);f=j+655376+((f|1)<<3)|0;h[f>>3]=+h[f>>3]/+(c[e>>2]|0);k=k+1|0}while((k|0)<(c[n>>2]|0));k=0}else k=0}else k=0}i=C;return k|0}function zc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=i;i=i+16|0;A=C;n=c[j>>2]|0;z=f+-1|0;if((e|0)>0){k=0;l=n;m=n+(($(z,e)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(e|0))break;else{l=l+2|0;m=m+2|0}}}y=g*3|0;x=e+-1|0;if((f|0)>0){k=0;g=n;l=n+(x<<1)|0;while(1){b[l>>1]=0;b[g>>1]=0;k=k+1|0;if((k|0)>=(f|0))break;else{g=g+(e<<1)|0;l=l+(e<<1)|0}}}l=j+1179664|0;k=e+1|0;u=0-e|0;s=1-e|0;t=~e;a:do if((z|0)>1){v=(x|0)>1;w=1;g=a+(k<<1)|0;m=n+(k<<1)|0;k=0;b:while(1){if(v){r=1;q=m;p=k;while(1){o=d[g>>0]|0;do if(((o&240)+24+(o<<4&240)+((d[g+1>>0]|0)&240)|0)>(y|0)){b[q>>1]=0;k=p}else{k=b[q+(u<<1)>>1]|0;if(k<<16>>16>0){b[q>>1]=k;k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}a=b[q+(s<<1)>>1]|0;n=a<<16>>16;k=b[q+(t<<1)>>1]|0;o=k<<16>>16;m=k<<16>>16>0;if(a<<16>>16<=0){if(m){b[q>>1]=k;k=o*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+r;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+w;m=j+1310736+(k+-3<<2)|0;if((c[m>>2]|0)<(r|0))c[m>>2]=r;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}k=b[q+-2>>1]|0;if(k<<16>>16>0){b[q>>1]=k;k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(r|0)){k=p;break}c[k>>2]=r;k=p;break}else{k=p+1|0;if((p|0)>32767)break b;b[q>>1]=k;c[j+1179664+(p<<2)>>2]=k<<16>>16;p=p*7|0;c[j+1310736+(p<<2)>>2]=1;c[j+1310736+(p+1<<2)>>2]=r;c[j+1310736+(p+2<<2)>>2]=w;c[j+1310736+(p+3<<2)>>2]=r;c[j+1310736+(p+4<<2)>>2]=r;c[j+1310736+(p+5<<2)>>2]=w;c[j+1310736+(p+6<<2)>>2]=w;break}}if(m){k=c[j+1179664+(n+-1<<2)>>2]|0;n=c[j+1179664+(o+-1<<2)>>2]|0;if((k|0)>(n|0)){b[q>>1]=n;if((p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=n;m=m+1|0;if((m|0)>=(p|0)){k=n;break}else a=a+4|0}}else k=n}else{b[q>>1]=k;if((k|0)<(n|0)&(p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(n|0))c[a>>2]=k;m=m+1|0;if((m|0)>=(p|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}m=b[q+-2>>1]|0;if(m<<16>>16<=0){b[q>>1]=a;k=n*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+r;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+w;m=j+1310736+(k+-4<<2)|0;if((c[m>>2]|0)>(r|0))c[m>>2]=r;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}k=c[j+1179664+(n+-1<<2)>>2]|0;n=c[j+1179664+((m<<16>>16)+-1<<2)>>2]|0;if((k|0)>(n|0)){b[q>>1]=n;if((p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=n;m=m+1|0;if((m|0)>=(p|0)){k=n;break}else a=a+4|0}}else k=n}else{b[q>>1]=k;if((k|0)<(n|0)&(p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(n|0))c[a>>2]=k;m=m+1|0;if((m|0)>=(p|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+w;k=p}while(0);r=r+1|0;g=g+2|0;m=q+2|0;if((r|0)>=(x|0))break;else{q=m;p=k}}}w=w+1|0;if((w|0)>=(z|0)){o=k;B=52;break a}else{g=g+4|0;m=m+4|0}}Me(3,3904,A);k=-1}else{o=0;B=52}while(0);if((B|0)==52){a=j+12|0;if((o|0)<1)g=1;else{m=1;g=1;while(1){k=c[l>>2]|0;if((k|0)==(m|0)){k=g;g=g+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[l>>2]=k;if((m|0)<(o|0)){m=m+1|0;l=l+4|0}else break}}n=j+8|0;k=g+-1|0;c[n>>2]=k;if(k){ek(a|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((g|0)>1){k=0;do{B=k<<2;c[j+131084+(B<<2)>>2]=e;c[j+131084+((B|1)<<2)>>2]=0;c[j+131084+((B|2)<<2)>>2]=f;c[j+131084+((B|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[n>>2]|0))}if((o|0)>0){a=0;do{l=(c[j+1179664+(a<<2)>>2]|0)+-1|0;m=a*7|0;k=j+12+(l<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(m<<2)>>2]|0);k=l<<1;g=j+655376+(k<<3)|0;h[g>>3]=+h[g>>3]+ +(c[j+1310736+(m+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(m+2<<2)>>2]|0);l=l<<2;k=j+131084+(l<<2)|0;g=c[j+1310736+(m+3<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;k=j+131084+((l|1)<<2)|0;g=c[j+1310736+(m+4<<2)>>2]|0;if((c[k>>2]|0)<(g|0))c[k>>2]=g;k=j+131084+((l|2)<<2)|0;g=c[j+1310736+(m+5<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;g=j+131084+((l|3)<<2)|0;k=c[j+1310736+(m+6<<2)>>2]|0;if((c[g>>2]|0)<(k|0))c[g>>2]=k;a=a+1|0}while((a|0)<(o|0))}if((c[n>>2]|0)>0){k=0;do{e=j+12+(k<<2)|0;f=k<<1;B=j+655376+(f<<3)|0;h[B>>3]=+h[B>>3]/+(c[e>>2]|0);f=j+655376+((f|1)<<3)|0;h[f>>3]=+h[f>>3]/+(c[e>>2]|0);k=k+1|0}while((k|0)<(c[n>>2]|0));k=0}else k=0}else k=0}i=C;return k|0}function Ac(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=i;i=i+16|0;A=C;n=c[j>>2]|0;z=f+-1|0;if((e|0)>0){k=0;l=n;m=n+(($(z,e)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(e|0))break;else{l=l+2|0;m=m+2|0}}}y=g*3|0;x=e+-1|0;if((f|0)>0){k=0;g=n;l=n+(x<<1)|0;while(1){b[l>>1]=0;b[g>>1]=0;k=k+1|0;if((k|0)>=(f|0))break;else{g=g+(e<<1)|0;l=l+(e<<1)|0}}}l=j+1179664|0;k=e+1|0;u=0-e|0;s=1-e|0;t=~e;a:do if((z|0)>1){v=(x|0)>1;w=1;g=a+(k<<1)|0;m=n+(k<<1)|0;k=0;b:while(1){if(v){r=1;q=m;p=k;while(1){n=d[g>>0]|0;o=d[g+1>>0]|0;do if(((n&248)+12+(n<<5&224)+(o>>>3&24)+(o<<2&248)|0)>(y|0)){b[q>>1]=0;k=p}else{k=b[q+(u<<1)>>1]|0;if(k<<16>>16>0){b[q>>1]=k;k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}a=b[q+(s<<1)>>1]|0;n=a<<16>>16;k=b[q+(t<<1)>>1]|0;o=k<<16>>16;m=k<<16>>16>0;if(a<<16>>16<=0){if(m){b[q>>1]=k;k=o*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+r;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+w;m=j+1310736+(k+-3<<2)|0;if((c[m>>2]|0)<(r|0))c[m>>2]=r;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}k=b[q+-2>>1]|0;if(k<<16>>16>0){b[q>>1]=k;k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(r|0)){k=p;break}c[k>>2]=r;k=p;break}else{k=p+1|0;if((p|0)>32767)break b;b[q>>1]=k;c[j+1179664+(p<<2)>>2]=k<<16>>16;p=p*7|0;c[j+1310736+(p<<2)>>2]=1;c[j+1310736+(p+1<<2)>>2]=r;c[j+1310736+(p+2<<2)>>2]=w;c[j+1310736+(p+3<<2)>>2]=r;c[j+1310736+(p+4<<2)>>2]=r;c[j+1310736+(p+5<<2)>>2]=w;c[j+1310736+(p+6<<2)>>2]=w;break}}if(m){k=c[j+1179664+(n+-1<<2)>>2]|0;n=c[j+1179664+(o+-1<<2)>>2]|0;if((k|0)>(n|0)){b[q>>1]=n;if((p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=n;m=m+1|0;if((m|0)>=(p|0)){k=n;break}else a=a+4|0}}else k=n}else{b[q>>1]=k;if((k|0)<(n|0)&(p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(n|0))c[a>>2]=k;m=m+1|0;if((m|0)>=(p|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}m=b[q+-2>>1]|0;if(m<<16>>16<=0){b[q>>1]=a;k=n*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+r;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+w;m=j+1310736+(k+-4<<2)|0;if((c[m>>2]|0)>(r|0))c[m>>2]=r;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}k=c[j+1179664+(n+-1<<2)>>2]|0;n=c[j+1179664+((m<<16>>16)+-1<<2)>>2]|0;if((k|0)>(n|0)){b[q>>1]=n;if((p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=n;m=m+1|0;if((m|0)>=(p|0)){k=n;break}else a=a+4|0}}else k=n}else{b[q>>1]=k;if((k|0)<(n|0)&(p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(n|0))c[a>>2]=k;m=m+1|0;if((m|0)>=(p|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+w;k=p}while(0);r=r+1|0;g=g+2|0;m=q+2|0;if((r|0)>=(x|0))break;else{q=m;p=k}}}w=w+1|0;if((w|0)>=(z|0)){o=k;B=52;break a}else{g=g+4|0;m=m+4|0}}Me(3,3904,A);k=-1}else{o=0;B=52}while(0);if((B|0)==52){a=j+12|0;if((o|0)<1)g=1;else{m=1;g=1;while(1){k=c[l>>2]|0;if((k|0)==(m|0)){k=g;g=g+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[l>>2]=k;if((m|0)<(o|0)){m=m+1|0;l=l+4|0}else break}}n=j+8|0;k=g+-1|0;c[n>>2]=k;if(k){ek(a|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((g|0)>1){k=0;do{B=k<<2;c[j+131084+(B<<2)>>2]=e;c[j+131084+((B|1)<<2)>>2]=0;c[j+131084+((B|2)<<2)>>2]=f;c[j+131084+((B|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[n>>2]|0))}if((o|0)>0){a=0;do{l=(c[j+1179664+(a<<2)>>2]|0)+-1|0;m=a*7|0;k=j+12+(l<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(m<<2)>>2]|0);k=l<<1;g=j+655376+(k<<3)|0;h[g>>3]=+h[g>>3]+ +(c[j+1310736+(m+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(m+2<<2)>>2]|0);l=l<<2;k=j+131084+(l<<2)|0;g=c[j+1310736+(m+3<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;k=j+131084+((l|1)<<2)|0;g=c[j+1310736+(m+4<<2)>>2]|0;if((c[k>>2]|0)<(g|0))c[k>>2]=g;k=j+131084+((l|2)<<2)|0;g=c[j+1310736+(m+5<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;g=j+131084+((l|3)<<2)|0;k=c[j+1310736+(m+6<<2)>>2]|0;if((c[g>>2]|0)<(k|0))c[g>>2]=k;a=a+1|0}while((a|0)<(o|0))}if((c[n>>2]|0)>0){k=0;do{e=j+12+(k<<2)|0;f=k<<1;B=j+655376+(f<<3)|0;h[B>>3]=+h[B>>3]/+(c[e>>2]|0);f=j+655376+((f|1)<<3)|0;h[f>>3]=+h[f>>3]/+(c[e>>2]|0);k=k+1|0}while((k|0)<(c[n>>2]|0));k=0}else k=0}else k=0}i=C;return k|0}function Bc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=i;i=i+16|0;A=C;n=c[j>>2]|0;z=f+-1|0;if((e|0)>0){k=0;l=n;m=n+(($(z,e)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(e|0))break;else{l=l+2|0;m=m+2|0}}}y=g*3|0;x=e+-1|0;if((f|0)>0){k=0;g=n;l=n+(x<<1)|0;while(1){b[l>>1]=0;b[g>>1]=0;k=k+1|0;if((k|0)>=(f|0))break;else{g=g+(e<<1)|0;l=l+(e<<1)|0}}}l=j+1179664|0;k=e+1|0;u=0-e|0;s=1-e|0;t=~e;a:do if((z|0)>1){v=(x|0)>1;w=1;g=a+(k<<2)|0;m=n+(k<<1)|0;k=0;b:while(1){if(v){r=1;q=m;p=k;while(1){do if(((d[g+2>>0]|0)+(d[g+1>>0]|0)+(d[g+3>>0]|0)|0)>(y|0)){b[q>>1]=0;k=p}else{k=b[q+(u<<1)>>1]|0;if(k<<16>>16>0){b[q>>1]=k;k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}a=b[q+(s<<1)>>1]|0;n=a<<16>>16;k=b[q+(t<<1)>>1]|0;o=k<<16>>16;m=k<<16>>16>0;if(a<<16>>16<=0){if(m){b[q>>1]=k;k=o*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+r;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+w;m=j+1310736+(k+-3<<2)|0;if((c[m>>2]|0)<(r|0))c[m>>2]=r;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}k=b[q+-2>>1]|0;if(k<<16>>16>0){b[q>>1]=k;k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(r|0)){k=p;break}c[k>>2]=r;k=p;break}else{k=p+1|0;if((p|0)>32767)break b;b[q>>1]=k;c[j+1179664+(p<<2)>>2]=k<<16>>16;p=p*7|0;c[j+1310736+(p<<2)>>2]=1;c[j+1310736+(p+1<<2)>>2]=r;c[j+1310736+(p+2<<2)>>2]=w;c[j+1310736+(p+3<<2)>>2]=r;c[j+1310736+(p+4<<2)>>2]=r;c[j+1310736+(p+5<<2)>>2]=w;c[j+1310736+(p+6<<2)>>2]=w;break}}if(m){k=c[j+1179664+(n+-1<<2)>>2]|0;n=c[j+1179664+(o+-1<<2)>>2]|0;if((k|0)>(n|0)){b[q>>1]=n;if((p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=n;m=m+1|0;if((m|0)>=(p|0)){k=n;break}else a=a+4|0}}else k=n}else{b[q>>1]=k;if((k|0)<(n|0)&(p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(n|0))c[a>>2]=k;m=m+1|0;if((m|0)>=(p|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}m=b[q+-2>>1]|0;if(m<<16>>16<=0){b[q>>1]=a;k=n*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+r;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+w;m=j+1310736+(k+-4<<2)|0;if((c[m>>2]|0)>(r|0))c[m>>2]=r;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}k=c[j+1179664+(n+-1<<2)>>2]|0;n=c[j+1179664+((m<<16>>16)+-1<<2)>>2]|0;if((k|0)>(n|0)){b[q>>1]=n;if((p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=n;m=m+1|0;if((m|0)>=(p|0)){k=n;break}else a=a+4|0}}else k=n}else{b[q>>1]=k;if((k|0)<(n|0)&(p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(n|0))c[a>>2]=k;m=m+1|0;if((m|0)>=(p|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+w;k=p}while(0);r=r+1|0;g=g+4|0;m=q+2|0;if((r|0)>=(x|0))break;else{q=m;p=k}}}w=w+1|0;if((w|0)>=(z|0)){o=k;B=52;break a}else{g=g+8|0;m=m+4|0}}Me(3,3904,A);k=-1}else{o=0;B=52}while(0);if((B|0)==52){a=j+12|0;if((o|0)<1)g=1;else{m=1;g=1;while(1){k=c[l>>2]|0;if((k|0)==(m|0)){k=g;g=g+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[l>>2]=k;if((m|0)<(o|0)){m=m+1|0;l=l+4|0}else break}}n=j+8|0;k=g+-1|0;c[n>>2]=k;if(k){ek(a|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((g|0)>1){k=0;do{B=k<<2;c[j+131084+(B<<2)>>2]=e;c[j+131084+((B|1)<<2)>>2]=0;c[j+131084+((B|2)<<2)>>2]=f;c[j+131084+((B|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[n>>2]|0))}if((o|0)>0){a=0;do{l=(c[j+1179664+(a<<2)>>2]|0)+-1|0;m=a*7|0;k=j+12+(l<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(m<<2)>>2]|0);k=l<<1;g=j+655376+(k<<3)|0;h[g>>3]=+h[g>>3]+ +(c[j+1310736+(m+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(m+2<<2)>>2]|0);l=l<<2;k=j+131084+(l<<2)|0;g=c[j+1310736+(m+3<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;k=j+131084+((l|1)<<2)|0;g=c[j+1310736+(m+4<<2)>>2]|0;if((c[k>>2]|0)<(g|0))c[k>>2]=g;k=j+131084+((l|2)<<2)|0;g=c[j+1310736+(m+5<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;g=j+131084+((l|3)<<2)|0;k=c[j+1310736+(m+6<<2)>>2]|0;if((c[g>>2]|0)<(k|0))c[g>>2]=k;a=a+1|0}while((a|0)<(o|0))}if((c[n>>2]|0)>0){k=0;do{e=j+12+(k<<2)|0;f=k<<1;B=j+655376+(f<<3)|0;h[B>>3]=+h[B>>3]/+(c[e>>2]|0);f=j+655376+((f|1)<<3)|0;h[f>>3]=+h[f>>3]/+(c[e>>2]|0);k=k+1|0}while((k|0)<(c[n>>2]|0));k=0}else k=0}else k=0}i=C;return k|0}function Cc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=i;i=i+16|0;A=C;n=c[j>>2]|0;z=f+-1|0;if((e|0)>0){k=0;l=n;m=n+(($(z,e)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(e|0))break;else{l=l+2|0;m=m+2|0}}}y=e+-1|0;if((f|0)>0){k=0;l=n;m=n+(y<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(f|0))break;else{l=l+(e<<1)|0;m=m+(e<<1)|0}}}m=j+1179664|0;k=e+1|0;v=0-e|0;t=1-e|0;u=~e;a:do if((z|0)>1){w=(y|0)>1;x=1;l=a+k|0;a=n+(k<<1)|0;k=0;b:while(1){if(w){s=1;r=a;q=k;while(1){do if((d[l>>0]|0|0)>(g|0)){b[r>>1]=0;k=q}else{k=b[r+(v<<1)>>1]|0;if(k<<16>>16>0){b[r>>1]=k;k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=j+1310736+(k+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+x;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}n=b[r+(t<<1)>>1]|0;o=n<<16>>16;k=b[r+(u<<1)>>1]|0;p=k<<16>>16;a=k<<16>>16>0;if(n<<16>>16<=0){if(a){b[r>>1]=k;k=p*7|0;a=j+1310736+(k+-7<<2)|0;c[a>>2]=(c[a>>2]|0)+1;a=j+1310736+(k+-6<<2)|0;c[a>>2]=(c[a>>2]|0)+s;a=j+1310736+(k+-5<<2)|0;c[a>>2]=(c[a>>2]|0)+x;a=j+1310736+(k+-3<<2)|0;if((c[a>>2]|0)<(s|0))c[a>>2]=s;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}k=b[r+-2>>1]|0;if(k<<16>>16>0){b[r>>1]=k;k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=j+1310736+(k+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+x;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(s|0)){k=q;break}c[k>>2]=s;k=q;break}else{k=q+1|0;if((q|0)>32767)break b;b[r>>1]=k;c[j+1179664+(q<<2)>>2]=k<<16>>16;q=q*7|0;c[j+1310736+(q<<2)>>2]=1;c[j+1310736+(q+1<<2)>>2]=s;c[j+1310736+(q+2<<2)>>2]=x;c[j+1310736+(q+3<<2)>>2]=s;c[j+1310736+(q+4<<2)>>2]=s;c[j+1310736+(q+5<<2)>>2]=x;c[j+1310736+(q+6<<2)>>2]=x;break}}if(a){k=c[j+1179664+(o+-1<<2)>>2]|0;o=c[j+1179664+(p+-1<<2)>>2]|0;if((k|0)>(o|0)){b[r>>1]=o;if((q|0)>0){a=0;n=m;while(1){if((c[n>>2]|0)==(k|0))c[n>>2]=o;a=a+1|0;if((a|0)>=(q|0)){k=o;break}else n=n+4|0}}else k=o}else{b[r>>1]=k;if((k|0)<(o|0)&(q|0)>0){a=0;n=m;while(1){if((c[n>>2]|0)==(o|0))c[n>>2]=k;a=a+1|0;if((a|0)>=(q|0))break;else n=n+4|0}}}k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=j+1310736+(k+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+x;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}k=b[r+-2>>1]|0;if(k<<16>>16<=0){b[r>>1]=n;k=o*7|0;a=j+1310736+(k+-7<<2)|0;c[a>>2]=(c[a>>2]|0)+1;a=j+1310736+(k+-6<<2)|0;c[a>>2]=(c[a>>2]|0)+s;a=j+1310736+(k+-5<<2)|0;c[a>>2]=(c[a>>2]|0)+x;a=j+1310736+(k+-4<<2)|0;if((c[a>>2]|0)>(s|0))c[a>>2]=s;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}o=c[j+1179664+(o+-1<<2)>>2]|0;k=c[j+1179664+((k<<16>>16)+-1<<2)>>2]|0;if((o|0)>(k|0)){b[r>>1]=k;if((q|0)>0){a=0;n=m;while(1){if((c[n>>2]|0)==(o|0))c[n>>2]=k;a=a+1|0;if((a|0)>=(q|0))break;else n=n+4|0}}}else{b[r>>1]=o;if((o|0)<(k|0)&(q|0)>0){a=0;n=m;while(1){if((c[n>>2]|0)==(k|0))c[n>>2]=o;a=a+1|0;if((a|0)>=(q|0)){k=o;break}else n=n+4|0}}else k=o}k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+x;k=q}while(0);s=s+1|0;l=l+1|0;a=r+2|0;if((s|0)>=(y|0))break;else{r=a;q=k}}}x=x+1|0;if((x|0)>=(z|0)){p=k;B=52;break a}else{l=l+2|0;a=a+4|0}}Me(3,3904,A);k=-1}else{p=0;B=52}while(0);if((B|0)==52){n=j+12|0;if((p|0)<1)l=1;else{a=1;l=1;while(1){k=c[m>>2]|0;if((k|0)==(a|0)){k=l;l=l+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[m>>2]=k;if((a|0)<(p|0)){a=a+1|0;m=m+4|0}else break}}o=j+8|0;k=l+-1|0;c[o>>2]=k;if(k){ek(n|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((l|0)>1){k=0;do{B=k<<2;c[j+131084+(B<<2)>>2]=e;c[j+131084+((B|1)<<2)>>2]=0;c[j+131084+((B|2)<<2)>>2]=f;c[j+131084+((B|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[o>>2]|0))}if((p|0)>0){n=0;do{m=(c[j+1179664+(n<<2)>>2]|0)+-1|0;a=n*7|0;k=j+12+(m<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(a<<2)>>2]|0);k=m<<1;l=j+655376+(k<<3)|0;h[l>>3]=+h[l>>3]+ +(c[j+1310736+(a+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(a+2<<2)>>2]|0);m=m<<2;k=j+131084+(m<<2)|0;l=c[j+1310736+(a+3<<2)>>2]|0;if((c[k>>2]|0)>(l|0))c[k>>2]=l;k=j+131084+((m|1)<<2)|0;l=c[j+1310736+(a+4<<2)>>2]|0;if((c[k>>2]|0)<(l|0))c[k>>2]=l;k=j+131084+((m|2)<<2)|0;l=c[j+1310736+(a+5<<2)>>2]|0;if((c[k>>2]|0)>(l|0))c[k>>2]=l;l=j+131084+((m|3)<<2)|0;k=c[j+1310736+(a+6<<2)>>2]|0;if((c[l>>2]|0)<(k|0))c[l>>2]=k;n=n+1|0}while((n|0)<(p|0))}if((c[o>>2]|0)>0){k=0;do{e=j+12+(k<<2)|0;f=k<<1;B=j+655376+(f<<3)|0;h[B>>3]=+h[B>>3]/+(c[e>>2]|0);f=j+655376+((f|1)<<3)|0;h[f>>3]=+h[f>>3]/+(c[e>>2]|0);k=k+1|0}while((k|0)<(c[o>>2]|0));k=0}else k=0}else k=0}i=C;return k|0}function Dc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=i;i=i+16|0;A=C;n=c[j>>2]|0;z=f+-1|0;if((e|0)>0){k=0;l=n;m=n+(($(z,e)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(e|0))break;else{l=l+2|0;m=m+2|0}}}y=e+-1|0;if((f|0)>0){k=0;l=n;m=n+(y<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(f|0))break;else{l=l+(e<<1)|0;m=m+(e<<1)|0}}}m=j+1179664|0;k=e+1|0;v=0-e|0;t=1-e|0;u=~e;a:do if((z|0)>1){w=(y|0)>1;x=1;l=a+(k<<1)|0;a=n+(k<<1)|0;k=0;b:while(1){if(w){s=1;r=a;q=k;while(1){do if((d[l+1>>0]|0|0)>(g|0)){b[r>>1]=0;k=q}else{k=b[r+(v<<1)>>1]|0;if(k<<16>>16>0){b[r>>1]=k;k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=j+1310736+(k+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+x;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}n=b[r+(t<<1)>>1]|0;o=n<<16>>16;k=b[r+(u<<1)>>1]|0;p=k<<16>>16;a=k<<16>>16>0;if(n<<16>>16<=0){if(a){b[r>>1]=k;k=p*7|0;a=j+1310736+(k+-7<<2)|0;c[a>>2]=(c[a>>2]|0)+1;a=j+1310736+(k+-6<<2)|0;c[a>>2]=(c[a>>2]|0)+s;a=j+1310736+(k+-5<<2)|0;c[a>>2]=(c[a>>2]|0)+x;a=j+1310736+(k+-3<<2)|0;if((c[a>>2]|0)<(s|0))c[a>>2]=s;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}k=b[r+-2>>1]|0;if(k<<16>>16>0){b[r>>1]=k;k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=j+1310736+(k+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+x;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(s|0)){k=q;break}c[k>>2]=s;k=q;break}else{k=q+1|0;if((q|0)>32767)break b;b[r>>1]=k;c[j+1179664+(q<<2)>>2]=k<<16>>16;q=q*7|0;c[j+1310736+(q<<2)>>2]=1;c[j+1310736+(q+1<<2)>>2]=s;c[j+1310736+(q+2<<2)>>2]=x;c[j+1310736+(q+3<<2)>>2]=s;c[j+1310736+(q+4<<2)>>2]=s;c[j+1310736+(q+5<<2)>>2]=x;c[j+1310736+(q+6<<2)>>2]=x;break}}if(a){k=c[j+1179664+(o+-1<<2)>>2]|0;o=c[j+1179664+(p+-1<<2)>>2]|0;if((k|0)>(o|0)){b[r>>1]=o;if((q|0)>0){a=0;n=m;while(1){if((c[n>>2]|0)==(k|0))c[n>>2]=o;a=a+1|0;if((a|0)>=(q|0)){k=o;break}else n=n+4|0}}else k=o}else{b[r>>1]=k;if((k|0)<(o|0)&(q|0)>0){a=0;n=m;while(1){if((c[n>>2]|0)==(o|0))c[n>>2]=k;a=a+1|0;if((a|0)>=(q|0))break;else n=n+4|0}}}k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=j+1310736+(k+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+x;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}a=b[r+-2>>1]|0;if(a<<16>>16<=0){b[r>>1]=n;k=o*7|0;a=j+1310736+(k+-7<<2)|0;c[a>>2]=(c[a>>2]|0)+1;a=j+1310736+(k+-6<<2)|0;c[a>>2]=(c[a>>2]|0)+s;a=j+1310736+(k+-5<<2)|0;c[a>>2]=(c[a>>2]|0)+x;a=j+1310736+(k+-4<<2)|0;if((c[a>>2]|0)>(s|0))c[a>>2]=s;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}k=c[j+1179664+(o+-1<<2)>>2]|0;o=c[j+1179664+((a<<16>>16)+-1<<2)>>2]|0;if((k|0)>(o|0)){b[r>>1]=o;if((q|0)>0){a=0;n=m;while(1){if((c[n>>2]|0)==(k|0))c[n>>2]=o;a=a+1|0;if((a|0)>=(q|0)){k=o;break}else n=n+4|0}}else k=o}else{b[r>>1]=k;if((k|0)<(o|0)&(q|0)>0){a=0;n=m;while(1){if((c[n>>2]|0)==(o|0))c[n>>2]=k;a=a+1|0;if((a|0)>=(q|0))break;else n=n+4|0}}}k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+x;k=q}while(0);s=s+1|0;l=l+2|0;a=r+2|0;if((s|0)>=(y|0))break;else{r=a;q=k}}}x=x+1|0;if((x|0)>=(z|0)){p=k;B=52;break a}else{l=l+4|0;a=a+4|0}}Me(3,3904,A);k=-1}else{p=0;B=52}while(0);if((B|0)==52){n=j+12|0;if((p|0)<1)l=1;else{a=1;l=1;while(1){k=c[m>>2]|0;if((k|0)==(a|0)){k=l;l=l+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[m>>2]=k;if((a|0)<(p|0)){a=a+1|0;m=m+4|0}else break}}o=j+8|0;k=l+-1|0;c[o>>2]=k;if(k){ek(n|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((l|0)>1){k=0;do{B=k<<2;c[j+131084+(B<<2)>>2]=e;c[j+131084+((B|1)<<2)>>2]=0;c[j+131084+((B|2)<<2)>>2]=f;c[j+131084+((B|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[o>>2]|0))}if((p|0)>0){n=0;do{m=(c[j+1179664+(n<<2)>>2]|0)+-1|0;a=n*7|0;k=j+12+(m<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(a<<2)>>2]|0);k=m<<1;l=j+655376+(k<<3)|0;h[l>>3]=+h[l>>3]+ +(c[j+1310736+(a+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(a+2<<2)>>2]|0);m=m<<2;k=j+131084+(m<<2)|0;l=c[j+1310736+(a+3<<2)>>2]|0;if((c[k>>2]|0)>(l|0))c[k>>2]=l;k=j+131084+((m|1)<<2)|0;l=c[j+1310736+(a+4<<2)>>2]|0;if((c[k>>2]|0)<(l|0))c[k>>2]=l;k=j+131084+((m|2)<<2)|0;l=c[j+1310736+(a+5<<2)>>2]|0;if((c[k>>2]|0)>(l|0))c[k>>2]=l;l=j+131084+((m|3)<<2)|0;k=c[j+1310736+(a+6<<2)>>2]|0;if((c[l>>2]|0)<(k|0))c[l>>2]=k;n=n+1|0}while((n|0)<(p|0))}if((c[o>>2]|0)>0){k=0;do{e=j+12+(k<<2)|0;f=k<<1;B=j+655376+(f<<3)|0;h[B>>3]=+h[B>>3]/+(c[e>>2]|0);f=j+655376+((f|1)<<3)|0;h[f>>3]=+h[f>>3]/+(c[e>>2]|0);k=k+1|0}while((k|0)<(c[o>>2]|0));k=0}else k=0}else k=0}i=C;return k|0}function Ec(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=i;i=i+16|0;A=C;n=c[j>>2]|0;z=f+-1|0;if((e|0)>0){k=0;l=n;m=n+(($(z,e)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(e|0))break;else{l=l+2|0;m=m+2|0}}}y=e+-1|0;if((f|0)>0){k=0;l=n;m=n+(y<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(f|0))break;else{l=l+(e<<1)|0;m=m+(e<<1)|0}}}m=j+1179664|0;k=e+1|0;v=0-e|0;t=1-e|0;u=~e;a:do if((z|0)>1){w=(y|0)>1;x=1;l=a+(k<<1)|0;a=n+(k<<1)|0;k=0;b:while(1){if(w){s=1;r=a;q=k;while(1){do if((d[l>>0]|0|0)>(g|0)){b[r>>1]=0;k=q}else{k=b[r+(v<<1)>>1]|0;if(k<<16>>16>0){b[r>>1]=k;k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=j+1310736+(k+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+x;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}n=b[r+(t<<1)>>1]|0;o=n<<16>>16;k=b[r+(u<<1)>>1]|0;p=k<<16>>16;a=k<<16>>16>0;if(n<<16>>16<=0){if(a){b[r>>1]=k;k=p*7|0;a=j+1310736+(k+-7<<2)|0;c[a>>2]=(c[a>>2]|0)+1;a=j+1310736+(k+-6<<2)|0;c[a>>2]=(c[a>>2]|0)+s;a=j+1310736+(k+-5<<2)|0;c[a>>2]=(c[a>>2]|0)+x;a=j+1310736+(k+-3<<2)|0;if((c[a>>2]|0)<(s|0))c[a>>2]=s;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}k=b[r+-2>>1]|0;if(k<<16>>16>0){b[r>>1]=k;k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=j+1310736+(k+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+x;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(s|0)){k=q;break}c[k>>2]=s;k=q;break}else{k=q+1|0;if((q|0)>32767)break b;b[r>>1]=k;c[j+1179664+(q<<2)>>2]=k<<16>>16;q=q*7|0;c[j+1310736+(q<<2)>>2]=1;c[j+1310736+(q+1<<2)>>2]=s;c[j+1310736+(q+2<<2)>>2]=x;c[j+1310736+(q+3<<2)>>2]=s;c[j+1310736+(q+4<<2)>>2]=s;c[j+1310736+(q+5<<2)>>2]=x;c[j+1310736+(q+6<<2)>>2]=x;break}}if(a){k=c[j+1179664+(o+-1<<2)>>2]|0;o=c[j+1179664+(p+-1<<2)>>2]|0;if((k|0)>(o|0)){b[r>>1]=o;if((q|0)>0){a=0;n=m;while(1){if((c[n>>2]|0)==(k|0))c[n>>2]=o;a=a+1|0;if((a|0)>=(q|0)){k=o;break}else n=n+4|0}}else k=o}else{b[r>>1]=k;if((k|0)<(o|0)&(q|0)>0){a=0;n=m;while(1){if((c[n>>2]|0)==(o|0))c[n>>2]=k;a=a+1|0;if((a|0)>=(q|0))break;else n=n+4|0}}}k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=j+1310736+(k+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+x;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}k=b[r+-2>>1]|0;if(k<<16>>16<=0){b[r>>1]=n;k=o*7|0;a=j+1310736+(k+-7<<2)|0;c[a>>2]=(c[a>>2]|0)+1;a=j+1310736+(k+-6<<2)|0;c[a>>2]=(c[a>>2]|0)+s;a=j+1310736+(k+-5<<2)|0;c[a>>2]=(c[a>>2]|0)+x;a=j+1310736+(k+-4<<2)|0;if((c[a>>2]|0)>(s|0))c[a>>2]=s;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}o=c[j+1179664+(o+-1<<2)>>2]|0;k=c[j+1179664+((k<<16>>16)+-1<<2)>>2]|0;if((o|0)>(k|0)){b[r>>1]=k;if((q|0)>0){a=0;n=m;while(1){if((c[n>>2]|0)==(o|0))c[n>>2]=k;a=a+1|0;if((a|0)>=(q|0))break;else n=n+4|0}}}else{b[r>>1]=o;if((o|0)<(k|0)&(q|0)>0){a=0;n=m;while(1){if((c[n>>2]|0)==(k|0))c[n>>2]=o;a=a+1|0;if((a|0)>=(q|0)){k=o;break}else n=n+4|0}}else k=o}k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+x;k=q}while(0);s=s+1|0;l=l+2|0;a=r+2|0;if((s|0)>=(y|0))break;else{r=a;q=k}}}x=x+1|0;if((x|0)>=(z|0)){p=k;B=52;break a}else{l=l+4|0;a=a+4|0}}Me(3,3904,A);k=-1}else{p=0;B=52}while(0);if((B|0)==52){n=j+12|0;if((p|0)<1)l=1;else{a=1;l=1;while(1){k=c[m>>2]|0;if((k|0)==(a|0)){k=l;l=l+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[m>>2]=k;if((a|0)<(p|0)){a=a+1|0;m=m+4|0}else break}}o=j+8|0;k=l+-1|0;c[o>>2]=k;if(k){ek(n|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((l|0)>1){k=0;do{B=k<<2;c[j+131084+(B<<2)>>2]=e;c[j+131084+((B|1)<<2)>>2]=0;c[j+131084+((B|2)<<2)>>2]=f;c[j+131084+((B|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[o>>2]|0))}if((p|0)>0){n=0;do{m=(c[j+1179664+(n<<2)>>2]|0)+-1|0;a=n*7|0;k=j+12+(m<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(a<<2)>>2]|0);k=m<<1;l=j+655376+(k<<3)|0;h[l>>3]=+h[l>>3]+ +(c[j+1310736+(a+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(a+2<<2)>>2]|0);m=m<<2;k=j+131084+(m<<2)|0;l=c[j+1310736+(a+3<<2)>>2]|0;if((c[k>>2]|0)>(l|0))c[k>>2]=l;k=j+131084+((m|1)<<2)|0;l=c[j+1310736+(a+4<<2)>>2]|0;if((c[k>>2]|0)<(l|0))c[k>>2]=l;k=j+131084+((m|2)<<2)|0;l=c[j+1310736+(a+5<<2)>>2]|0;if((c[k>>2]|0)>(l|0))c[k>>2]=l;l=j+131084+((m|3)<<2)|0;k=c[j+1310736+(a+6<<2)>>2]|0;if((c[l>>2]|0)<(k|0))c[l>>2]=k;n=n+1|0}while((n|0)<(p|0))}if((c[o>>2]|0)>0){k=0;do{e=j+12+(k<<2)|0;f=k<<1;B=j+655376+(f<<3)|0;h[B>>3]=+h[B>>3]/+(c[e>>2]|0);f=j+655376+((f|1)<<3)|0;h[f>>3]=+h[f>>3]/+(c[e>>2]|0);k=k+1|0}while((k|0)<(c[o>>2]|0));k=0}else k=0}else k=0}i=C;return k|0}function Fc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=i;i=i+16|0;A=C;n=c[j>>2]|0;z=f+-1|0;if((e|0)>0){k=0;l=n;m=n+(($(z,e)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(e|0))break;else{l=l+2|0;m=m+2|0}}}y=e+-1|0;if((f|0)>0){k=0;l=n;m=n+(y<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(f|0))break;else{l=l+(e<<1)|0;m=m+(e<<1)|0}}}m=j+1179664|0;k=e+1|0;v=0-e|0;t=1-e|0;u=~e;a:do if((z|0)>1){w=(y|0)>1;x=1;l=a+k|0;a=n+(k<<1)|0;n=g+k|0;k=0;b:while(1){if(w){s=1;r=l;q=k;while(1){do if((d[r>>0]|0)>(d[n>>0]|0)){b[a>>1]=0;k=q}else{k=b[a+(v<<1)>>1]|0;if(k<<16>>16>0){b[a>>1]=k;k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=j+1310736+(k+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+x;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}g=b[a+(t<<1)>>1]|0;o=g<<16>>16;k=b[a+(u<<1)>>1]|0;p=k<<16>>16;l=k<<16>>16>0;if(g<<16>>16<=0){if(l){b[a>>1]=k;k=p*7|0;l=j+1310736+(k+-7<<2)|0;c[l>>2]=(c[l>>2]|0)+1;l=j+1310736+(k+-6<<2)|0;c[l>>2]=(c[l>>2]|0)+s;l=j+1310736+(k+-5<<2)|0;c[l>>2]=(c[l>>2]|0)+x;l=j+1310736+(k+-3<<2)|0;if((c[l>>2]|0)<(s|0))c[l>>2]=s;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}k=b[a+-2>>1]|0;if(k<<16>>16>0){b[a>>1]=k;k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=j+1310736+(k+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+x;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(s|0)){k=q;break}c[k>>2]=s;k=q;break}else{k=q+1|0;if((q|0)>32767)break b;b[a>>1]=k;c[j+1179664+(q<<2)>>2]=k<<16>>16;q=q*7|0;c[j+1310736+(q<<2)>>2]=1;c[j+1310736+(q+1<<2)>>2]=s;c[j+1310736+(q+2<<2)>>2]=x;c[j+1310736+(q+3<<2)>>2]=s;c[j+1310736+(q+4<<2)>>2]=s;c[j+1310736+(q+5<<2)>>2]=x;c[j+1310736+(q+6<<2)>>2]=x;break}}if(l){k=c[j+1179664+(o+-1<<2)>>2]|0;o=c[j+1179664+(p+-1<<2)>>2]|0;if((k|0)>(o|0)){b[a>>1]=o;if((q|0)>0){l=0;g=m;while(1){if((c[g>>2]|0)==(k|0))c[g>>2]=o;l=l+1|0;if((l|0)>=(q|0)){k=o;break}else g=g+4|0}}else k=o}else{b[a>>1]=k;if((k|0)<(o|0)&(q|0)>0){l=0;g=m;while(1){if((c[g>>2]|0)==(o|0))c[g>>2]=k;l=l+1|0;if((l|0)>=(q|0))break;else g=g+4|0}}}k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=j+1310736+(k+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+x;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}k=b[a+-2>>1]|0;if(k<<16>>16<=0){b[a>>1]=g;k=o*7|0;l=j+1310736+(k+-7<<2)|0;c[l>>2]=(c[l>>2]|0)+1;l=j+1310736+(k+-6<<2)|0;c[l>>2]=(c[l>>2]|0)+s;l=j+1310736+(k+-5<<2)|0;c[l>>2]=(c[l>>2]|0)+x;l=j+1310736+(k+-4<<2)|0;if((c[l>>2]|0)>(s|0))c[l>>2]=s;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}o=c[j+1179664+(o+-1<<2)>>2]|0;k=c[j+1179664+((k<<16>>16)+-1<<2)>>2]|0;if((o|0)>(k|0)){b[a>>1]=k;if((q|0)>0){l=0;g=m;while(1){if((c[g>>2]|0)==(o|0))c[g>>2]=k;l=l+1|0;if((l|0)>=(q|0))break;else g=g+4|0}}}else{b[a>>1]=o;if((o|0)<(k|0)&(q|0)>0){l=0;g=m;while(1){if((c[g>>2]|0)==(k|0))c[g>>2]=o;l=l+1|0;if((l|0)>=(q|0)){k=o;break}else g=g+4|0}}else k=o}k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+x;k=q}while(0);s=s+1|0;l=r+1|0;n=n+1|0;a=a+2|0;if((s|0)>=(y|0))break;else{r=l;q=k}}}x=x+1|0;if((x|0)>=(z|0)){o=k;B=52;break a}else{l=l+2|0;a=a+4|0;n=n+2|0}}Me(3,3904,A);k=-1}else{o=0;B=52}while(0);if((B|0)==52){n=j+12|0;if((o|0)<1)l=1;else{a=1;l=1;while(1){k=c[m>>2]|0;if((k|0)==(a|0)){k=l;l=l+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[m>>2]=k;if((a|0)<(o|0)){a=a+1|0;m=m+4|0}else break}}g=j+8|0;k=l+-1|0;c[g>>2]=k;if(k){ek(n|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((l|0)>1){k=0;do{B=k<<2;c[j+131084+(B<<2)>>2]=e;c[j+131084+((B|1)<<2)>>2]=0;c[j+131084+((B|2)<<2)>>2]=f;c[j+131084+((B|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[g>>2]|0))}if((o|0)>0){n=0;do{m=(c[j+1179664+(n<<2)>>2]|0)+-1|0;a=n*7|0;k=j+12+(m<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(a<<2)>>2]|0);k=m<<1;l=j+655376+(k<<3)|0;h[l>>3]=+h[l>>3]+ +(c[j+1310736+(a+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(a+2<<2)>>2]|0);m=m<<2;k=j+131084+(m<<2)|0;l=c[j+1310736+(a+3<<2)>>2]|0;if((c[k>>2]|0)>(l|0))c[k>>2]=l;k=j+131084+((m|1)<<2)|0;l=c[j+1310736+(a+4<<2)>>2]|0;if((c[k>>2]|0)<(l|0))c[k>>2]=l;k=j+131084+((m|2)<<2)|0;l=c[j+1310736+(a+5<<2)>>2]|0;if((c[k>>2]|0)>(l|0))c[k>>2]=l;l=j+131084+((m|3)<<2)|0;k=c[j+1310736+(a+6<<2)>>2]|0;if((c[l>>2]|0)<(k|0))c[l>>2]=k;n=n+1|0}while((n|0)<(o|0))}if((c[g>>2]|0)>0){k=0;do{e=j+12+(k<<2)|0;f=k<<1;B=j+655376+(f<<3)|0;h[B>>3]=+h[B>>3]/+(c[e>>2]|0);f=j+655376+((f|1)<<3)|0;h[f>>3]=+h[f>>3]/+(c[e>>2]|0);k=k+1|0}while((k|0)<(c[g>>2]|0));k=0}else k=0}else k=0}i=C;return k|0}function Gc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;D=i;i=i+16|0;z=D;B=(e|0)/2|0;C=(f|0)/2|0;n=c[j>>2]|0;y=C+-1|0;if((e|0)>1){k=0;l=n;m=n+(($(y,B)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(B|0))break;else{l=l+2|0;m=m+2|0}}}w=g*3|0;x=B+-1|0;if((f|0)>1){k=0;g=n;l=n+(x<<1)|0;while(1){b[l>>1]=0;b[g>>1]=0;k=k+1|0;if((k|0)>=(C|0))break;else{g=g+(B<<1)|0;l=l+(B<<1)|0}}}l=j+1179664|0;t=0-B|0;r=1-B|0;s=~B;q=(e*3|0)+12|0;a:do if((y|0)>1){u=(x|0)>1;v=1;g=a+((e*6|0)+6)|0;m=n+(B+1<<1)|0;k=0;b:while(1){if(u){p=1;o=m;n=k;while(1){do if(((d[g+1>>0]|0)+(d[g>>0]|0)+(d[g+2>>0]|0)|0)>(w|0)){k=b[o+(t<<1)>>1]|0;if(k<<16>>16>0){b[o>>1]=k;k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}f=b[o+(r<<1)>>1]|0;a=f<<16>>16;k=b[o+(s<<1)>>1]|0;e=k<<16>>16;m=k<<16>>16>0;if(f<<16>>16<=0){if(m){b[o>>1]=k;k=e*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+p;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+v;m=j+1310736+(k+-3<<2)|0;if((c[m>>2]|0)<(p|0))c[m>>2]=p;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}k=b[o+-2>>1]|0;if(k<<16>>16>0){b[o>>1]=k;k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(p|0)){k=n;break}c[k>>2]=p;k=n;break}else{k=n+1|0;if((n|0)>32767)break b;b[o>>1]=k;c[j+1179664+(n<<2)>>2]=k<<16>>16;n=n*7|0;c[j+1310736+(n<<2)>>2]=1;c[j+1310736+(n+1<<2)>>2]=p;c[j+1310736+(n+2<<2)>>2]=v;c[j+1310736+(n+3<<2)>>2]=p;c[j+1310736+(n+4<<2)>>2]=p;c[j+1310736+(n+5<<2)>>2]=v;c[j+1310736+(n+6<<2)>>2]=v;break}}if(m){k=c[j+1179664+(a+-1<<2)>>2]|0;a=c[j+1179664+(e+-1<<2)>>2]|0;if((k|0)>(a|0)){b[o>>1]=a;if((n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(k|0))c[f>>2]=a;m=m+1|0;if((m|0)>=(n|0)){k=a;break}else f=f+4|0}}else k=a}else{b[o>>1]=k;if((k|0)<(a|0)&(n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(a|0))c[f>>2]=k;m=m+1|0;if((m|0)>=(n|0))break;else f=f+4|0}}}k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}m=b[o+-2>>1]|0;if(m<<16>>16<=0){b[o>>1]=f;k=a*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+p;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+v;m=j+1310736+(k+-4<<2)|0;if((c[m>>2]|0)>(p|0))c[m>>2]=p;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}k=c[j+1179664+(a+-1<<2)>>2]|0;a=c[j+1179664+((m<<16>>16)+-1<<2)>>2]|0;if((k|0)>(a|0)){b[o>>1]=a;if((n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(k|0))c[f>>2]=a;m=m+1|0;if((m|0)>=(n|0)){k=a;break}else f=f+4|0}}else k=a}else{b[o>>1]=k;if((k|0)<(a|0)&(n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(a|0))c[f>>2]=k;m=m+1|0;if((m|0)>=(n|0))break;else f=f+4|0}}}k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+v;k=n}else{b[o>>1]=0;k=n}while(0);p=p+1|0;g=g+6|0;m=o+2|0;if((p|0)>=(x|0))break;else{o=m;n=k}}}v=v+1|0;if((v|0)>=(y|0)){e=k;A=52;break a}else{g=g+q|0;m=m+4|0}}Me(3,3904,z);k=-1}else{e=0;A=52}while(0);if((A|0)==52){f=j+12|0;if((e|0)<1)g=1;else{m=1;g=1;while(1){k=c[l>>2]|0;if((k|0)==(m|0)){k=g;g=g+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[l>>2]=k;if((m|0)<(e|0)){m=m+1|0;l=l+4|0}else break}}a=j+8|0;k=g+-1|0;c[a>>2]=k;if(k){ek(f|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((g|0)>1){k=0;do{A=k<<2;c[j+131084+(A<<2)>>2]=B;c[j+131084+((A|1)<<2)>>2]=0;c[j+131084+((A|2)<<2)>>2]=C;c[j+131084+((A|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[a>>2]|0))}if((e|0)>0){f=0;do{l=(c[j+1179664+(f<<2)>>2]|0)+-1|0;m=f*7|0;k=j+12+(l<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(m<<2)>>2]|0);k=l<<1;g=j+655376+(k<<3)|0;h[g>>3]=+h[g>>3]+ +(c[j+1310736+(m+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(m+2<<2)>>2]|0);l=l<<2;k=j+131084+(l<<2)|0;g=c[j+1310736+(m+3<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;k=j+131084+((l|1)<<2)|0;g=c[j+1310736+(m+4<<2)>>2]|0;if((c[k>>2]|0)<(g|0))c[k>>2]=g;k=j+131084+((l|2)<<2)|0;g=c[j+1310736+(m+5<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;g=j+131084+((l|3)<<2)|0;k=c[j+1310736+(m+6<<2)>>2]|0;if((c[g>>2]|0)<(k|0))c[g>>2]=k;f=f+1|0}while((f|0)<(e|0))}if((c[a>>2]|0)>0){k=0;do{B=j+12+(k<<2)|0;C=k<<1;A=j+655376+(C<<3)|0;h[A>>3]=+h[A>>3]/+(c[B>>2]|0);C=j+655376+((C|1)<<3)|0;h[C>>3]=+h[C>>3]/+(c[B>>2]|0);k=k+1|0}while((k|0)<(c[a>>2]|0));k=0}else k=0}else k=0}i=D;return k|0}function Hc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;D=i;i=i+16|0;z=D;B=(e|0)/2|0;C=(f|0)/2|0;n=c[j>>2]|0;y=C+-1|0;if((e|0)>1){k=0;l=n;m=n+(($(y,B)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(B|0))break;else{l=l+2|0;m=m+2|0}}}w=g*3|0;x=B+-1|0;if((f|0)>1){k=0;g=n;l=n+(x<<1)|0;while(1){b[l>>1]=0;b[g>>1]=0;k=k+1|0;if((k|0)>=(C|0))break;else{g=g+(B<<1)|0;l=l+(B<<1)|0}}}l=j+1179664|0;t=0-B|0;r=1-B|0;s=~B;q=(e<<1)+8|0;a:do if((y|0)>1){u=(x|0)>1;v=1;g=a+((e<<2)+4)|0;m=n+(B+1<<1)|0;k=0;b:while(1){if(u){p=1;o=m;n=k;while(1){a=d[g>>0]|0;e=d[g+1>>0]|0;do if(((a&248)+10+(a<<5&224)+(e>>>3&28)+(e<<3&248)|0)>(w|0)){k=b[o+(t<<1)>>1]|0;if(k<<16>>16>0){b[o>>1]=k;k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}f=b[o+(r<<1)>>1]|0;a=f<<16>>16;k=b[o+(s<<1)>>1]|0;e=k<<16>>16;m=k<<16>>16>0;if(f<<16>>16<=0){if(m){b[o>>1]=k;k=e*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+p;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+v;m=j+1310736+(k+-3<<2)|0;if((c[m>>2]|0)<(p|0))c[m>>2]=p;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}k=b[o+-2>>1]|0;if(k<<16>>16>0){b[o>>1]=k;k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(p|0)){k=n;break}c[k>>2]=p;k=n;break}else{k=n+1|0;if((n|0)>32767)break b;b[o>>1]=k;c[j+1179664+(n<<2)>>2]=k<<16>>16;n=n*7|0;c[j+1310736+(n<<2)>>2]=1;c[j+1310736+(n+1<<2)>>2]=p;c[j+1310736+(n+2<<2)>>2]=v;c[j+1310736+(n+3<<2)>>2]=p;c[j+1310736+(n+4<<2)>>2]=p;c[j+1310736+(n+5<<2)>>2]=v;c[j+1310736+(n+6<<2)>>2]=v;break}}if(m){k=c[j+1179664+(a+-1<<2)>>2]|0;a=c[j+1179664+(e+-1<<2)>>2]|0;if((k|0)>(a|0)){b[o>>1]=a;if((n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(k|0))c[f>>2]=a;m=m+1|0;if((m|0)>=(n|0)){k=a;break}else f=f+4|0}}else k=a}else{b[o>>1]=k;if((k|0)<(a|0)&(n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(a|0))c[f>>2]=k;m=m+1|0;if((m|0)>=(n|0))break;else f=f+4|0}}}k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}m=b[o+-2>>1]|0;if(m<<16>>16<=0){b[o>>1]=f;k=a*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+p;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+v;m=j+1310736+(k+-4<<2)|0;if((c[m>>2]|0)>(p|0))c[m>>2]=p;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}k=c[j+1179664+(a+-1<<2)>>2]|0;a=c[j+1179664+((m<<16>>16)+-1<<2)>>2]|0;if((k|0)>(a|0)){b[o>>1]=a;if((n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(k|0))c[f>>2]=a;m=m+1|0;if((m|0)>=(n|0)){k=a;break}else f=f+4|0}}else k=a}else{b[o>>1]=k;if((k|0)<(a|0)&(n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(a|0))c[f>>2]=k;m=m+1|0;if((m|0)>=(n|0))break;else f=f+4|0}}}k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+v;k=n}else{b[o>>1]=0;k=n}while(0);p=p+1|0;g=g+4|0;m=o+2|0;if((p|0)>=(x|0))break;else{o=m;n=k}}}v=v+1|0;if((v|0)>=(y|0)){e=k;A=52;break a}else{g=g+q|0;m=m+4|0}}Me(3,3904,z);k=-1}else{e=0;A=52}while(0);if((A|0)==52){f=j+12|0;if((e|0)<1)g=1;else{m=1;g=1;while(1){k=c[l>>2]|0;if((k|0)==(m|0)){k=g;g=g+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[l>>2]=k;if((m|0)<(e|0)){m=m+1|0;l=l+4|0}else break}}a=j+8|0;k=g+-1|0;c[a>>2]=k;if(k){ek(f|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((g|0)>1){k=0;do{A=k<<2;c[j+131084+(A<<2)>>2]=B;c[j+131084+((A|1)<<2)>>2]=0;c[j+131084+((A|2)<<2)>>2]=C;c[j+131084+((A|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[a>>2]|0))}if((e|0)>0){f=0;do{l=(c[j+1179664+(f<<2)>>2]|0)+-1|0;m=f*7|0;k=j+12+(l<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(m<<2)>>2]|0);k=l<<1;g=j+655376+(k<<3)|0;h[g>>3]=+h[g>>3]+ +(c[j+1310736+(m+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(m+2<<2)>>2]|0);l=l<<2;k=j+131084+(l<<2)|0;g=c[j+1310736+(m+3<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;k=j+131084+((l|1)<<2)|0;g=c[j+1310736+(m+4<<2)>>2]|0;if((c[k>>2]|0)<(g|0))c[k>>2]=g;k=j+131084+((l|2)<<2)|0;g=c[j+1310736+(m+5<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;g=j+131084+((l|3)<<2)|0;k=c[j+1310736+(m+6<<2)>>2]|0;if((c[g>>2]|0)<(k|0))c[g>>2]=k;f=f+1|0}while((f|0)<(e|0))}if((c[a>>2]|0)>0){k=0;do{B=j+12+(k<<2)|0;C=k<<1;A=j+655376+(C<<3)|0;h[A>>3]=+h[A>>3]/+(c[B>>2]|0);C=j+655376+((C|1)<<3)|0;h[C>>3]=+h[C>>3]/+(c[B>>2]|0);k=k+1|0}while((k|0)<(c[a>>2]|0));k=0}else k=0}else k=0}i=D;return k|0}function Ic(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;D=i;i=i+16|0;z=D;B=(e|0)/2|0;C=(f|0)/2|0;n=c[j>>2]|0;y=C+-1|0;if((e|0)>1){k=0;l=n;m=n+(($(y,B)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(B|0))break;else{l=l+2|0;m=m+2|0}}}w=g*3|0;x=B+-1|0;if((f|0)>1){k=0;g=n;l=n+(x<<1)|0;while(1){b[l>>1]=0;b[g>>1]=0;k=k+1|0;if((k|0)>=(C|0))break;else{g=g+(B<<1)|0;l=l+(B<<1)|0}}}l=j+1179664|0;t=0-B|0;r=1-B|0;s=~B;q=(e<<2)+16|0;a:do if((y|0)>1){u=(x|0)>1;v=1;g=a+((e<<3)+8)|0;m=n+(B+1<<1)|0;k=0;b:while(1){if(u){p=1;o=m;n=k;while(1){do if(((d[g+1>>0]|0)+(d[g>>0]|0)+(d[g+2>>0]|0)|0)>(w|0)){k=b[o+(t<<1)>>1]|0;if(k<<16>>16>0){b[o>>1]=k;k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}f=b[o+(r<<1)>>1]|0;a=f<<16>>16;k=b[o+(s<<1)>>1]|0;e=k<<16>>16;m=k<<16>>16>0;if(f<<16>>16<=0){if(m){b[o>>1]=k;k=e*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+p;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+v;m=j+1310736+(k+-3<<2)|0;if((c[m>>2]|0)<(p|0))c[m>>2]=p;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}k=b[o+-2>>1]|0;if(k<<16>>16>0){b[o>>1]=k;k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(p|0)){k=n;break}c[k>>2]=p;k=n;break}else{k=n+1|0;if((n|0)>32767)break b;b[o>>1]=k;c[j+1179664+(n<<2)>>2]=k<<16>>16;n=n*7|0;c[j+1310736+(n<<2)>>2]=1;c[j+1310736+(n+1<<2)>>2]=p;c[j+1310736+(n+2<<2)>>2]=v;c[j+1310736+(n+3<<2)>>2]=p;c[j+1310736+(n+4<<2)>>2]=p;c[j+1310736+(n+5<<2)>>2]=v;c[j+1310736+(n+6<<2)>>2]=v;break}}if(m){k=c[j+1179664+(a+-1<<2)>>2]|0;a=c[j+1179664+(e+-1<<2)>>2]|0;if((k|0)>(a|0)){b[o>>1]=a;if((n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(k|0))c[f>>2]=a;m=m+1|0;if((m|0)>=(n|0)){k=a;break}else f=f+4|0}}else k=a}else{b[o>>1]=k;if((k|0)<(a|0)&(n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(a|0))c[f>>2]=k;m=m+1|0;if((m|0)>=(n|0))break;else f=f+4|0}}}k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}m=b[o+-2>>1]|0;if(m<<16>>16<=0){b[o>>1]=f;k=a*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+p;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+v;m=j+1310736+(k+-4<<2)|0;if((c[m>>2]|0)>(p|0))c[m>>2]=p;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}k=c[j+1179664+(a+-1<<2)>>2]|0;a=c[j+1179664+((m<<16>>16)+-1<<2)>>2]|0;if((k|0)>(a|0)){b[o>>1]=a;if((n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(k|0))c[f>>2]=a;m=m+1|0;if((m|0)>=(n|0)){k=a;break}else f=f+4|0}}else k=a}else{b[o>>1]=k;if((k|0)<(a|0)&(n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(a|0))c[f>>2]=k;m=m+1|0;if((m|0)>=(n|0))break;else f=f+4|0}}}k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+v;k=n}else{b[o>>1]=0;k=n}while(0);p=p+1|0;g=g+8|0;m=o+2|0;if((p|0)>=(x|0))break;else{o=m;n=k}}}v=v+1|0;if((v|0)>=(y|0)){e=k;A=52;break a}else{g=g+q|0;m=m+4|0}}Me(3,3904,z);k=-1}else{e=0;A=52}while(0);if((A|0)==52){f=j+12|0;if((e|0)<1)g=1;else{m=1;g=1;while(1){k=c[l>>2]|0;if((k|0)==(m|0)){k=g;g=g+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[l>>2]=k;if((m|0)<(e|0)){m=m+1|0;l=l+4|0}else break}}a=j+8|0;k=g+-1|0;c[a>>2]=k;if(k){ek(f|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((g|0)>1){k=0;do{A=k<<2;c[j+131084+(A<<2)>>2]=B;c[j+131084+((A|1)<<2)>>2]=0;c[j+131084+((A|2)<<2)>>2]=C;c[j+131084+((A|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[a>>2]|0))}if((e|0)>0){f=0;do{l=(c[j+1179664+(f<<2)>>2]|0)+-1|0;m=f*7|0;k=j+12+(l<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(m<<2)>>2]|0);k=l<<1;g=j+655376+(k<<3)|0;h[g>>3]=+h[g>>3]+ +(c[j+1310736+(m+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(m+2<<2)>>2]|0);l=l<<2;k=j+131084+(l<<2)|0;g=c[j+1310736+(m+3<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;k=j+131084+((l|1)<<2)|0;g=c[j+1310736+(m+4<<2)>>2]|0;if((c[k>>2]|0)<(g|0))c[k>>2]=g;k=j+131084+((l|2)<<2)|0;g=c[j+1310736+(m+5<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;g=j+131084+((l|3)<<2)|0;k=c[j+1310736+(m+6<<2)>>2]|0;if((c[g>>2]|0)<(k|0))c[g>>2]=k;f=f+1|0}while((f|0)<(e|0))}if((c[a>>2]|0)>0){k=0;do{B=j+12+(k<<2)|0;C=k<<1;A=j+655376+(C<<3)|0;h[A>>3]=+h[A>>3]/+(c[B>>2]|0);C=j+655376+((C|1)<<3)|0;h[C>>3]=+h[C>>3]/+(c[B>>2]|0);k=k+1|0}while((k|0)<(c[a>>2]|0));k=0}else k=0}else k=0}i=D;return k|0} +function Jc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;D=i;i=i+16|0;z=D;B=(e|0)/2|0;C=(f|0)/2|0;n=c[j>>2]|0;y=C+-1|0;if((e|0)>1){k=0;l=n;m=n+(($(y,B)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(B|0))break;else{l=l+2|0;m=m+2|0}}}w=g*3|0;x=B+-1|0;if((f|0)>1){k=0;g=n;l=n+(x<<1)|0;while(1){b[l>>1]=0;b[g>>1]=0;k=k+1|0;if((k|0)>=(C|0))break;else{g=g+(B<<1)|0;l=l+(B<<1)|0}}}l=j+1179664|0;t=0-B|0;r=1-B|0;s=~B;q=(e<<1)+8|0;a:do if((y|0)>1){u=(x|0)>1;v=1;g=a+((e<<2)+4)|0;m=n+(B+1<<1)|0;k=0;b:while(1){if(u){p=1;o=m;n=k;while(1){e=d[g>>0]|0;do if(((e&240)+24+(e<<4&240)+((d[g+1>>0]|0)&240)|0)>(w|0)){k=b[o+(t<<1)>>1]|0;if(k<<16>>16>0){b[o>>1]=k;k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}f=b[o+(r<<1)>>1]|0;a=f<<16>>16;k=b[o+(s<<1)>>1]|0;e=k<<16>>16;m=k<<16>>16>0;if(f<<16>>16<=0){if(m){b[o>>1]=k;k=e*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+p;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+v;m=j+1310736+(k+-3<<2)|0;if((c[m>>2]|0)<(p|0))c[m>>2]=p;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}k=b[o+-2>>1]|0;if(k<<16>>16>0){b[o>>1]=k;k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(p|0)){k=n;break}c[k>>2]=p;k=n;break}else{k=n+1|0;if((n|0)>32767)break b;b[o>>1]=k;c[j+1179664+(n<<2)>>2]=k<<16>>16;n=n*7|0;c[j+1310736+(n<<2)>>2]=1;c[j+1310736+(n+1<<2)>>2]=p;c[j+1310736+(n+2<<2)>>2]=v;c[j+1310736+(n+3<<2)>>2]=p;c[j+1310736+(n+4<<2)>>2]=p;c[j+1310736+(n+5<<2)>>2]=v;c[j+1310736+(n+6<<2)>>2]=v;break}}if(m){k=c[j+1179664+(a+-1<<2)>>2]|0;a=c[j+1179664+(e+-1<<2)>>2]|0;if((k|0)>(a|0)){b[o>>1]=a;if((n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(k|0))c[f>>2]=a;m=m+1|0;if((m|0)>=(n|0)){k=a;break}else f=f+4|0}}else k=a}else{b[o>>1]=k;if((k|0)<(a|0)&(n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(a|0))c[f>>2]=k;m=m+1|0;if((m|0)>=(n|0))break;else f=f+4|0}}}k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}m=b[o+-2>>1]|0;if(m<<16>>16<=0){b[o>>1]=f;k=a*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+p;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+v;m=j+1310736+(k+-4<<2)|0;if((c[m>>2]|0)>(p|0))c[m>>2]=p;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}k=c[j+1179664+(a+-1<<2)>>2]|0;a=c[j+1179664+((m<<16>>16)+-1<<2)>>2]|0;if((k|0)>(a|0)){b[o>>1]=a;if((n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(k|0))c[f>>2]=a;m=m+1|0;if((m|0)>=(n|0)){k=a;break}else f=f+4|0}}else k=a}else{b[o>>1]=k;if((k|0)<(a|0)&(n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(a|0))c[f>>2]=k;m=m+1|0;if((m|0)>=(n|0))break;else f=f+4|0}}}k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+v;k=n}else{b[o>>1]=0;k=n}while(0);p=p+1|0;g=g+4|0;m=o+2|0;if((p|0)>=(x|0))break;else{o=m;n=k}}}v=v+1|0;if((v|0)>=(y|0)){e=k;A=52;break a}else{g=g+q|0;m=m+4|0}}Me(3,3904,z);k=-1}else{e=0;A=52}while(0);if((A|0)==52){f=j+12|0;if((e|0)<1)g=1;else{m=1;g=1;while(1){k=c[l>>2]|0;if((k|0)==(m|0)){k=g;g=g+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[l>>2]=k;if((m|0)<(e|0)){m=m+1|0;l=l+4|0}else break}}a=j+8|0;k=g+-1|0;c[a>>2]=k;if(k){ek(f|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((g|0)>1){k=0;do{A=k<<2;c[j+131084+(A<<2)>>2]=B;c[j+131084+((A|1)<<2)>>2]=0;c[j+131084+((A|2)<<2)>>2]=C;c[j+131084+((A|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[a>>2]|0))}if((e|0)>0){f=0;do{l=(c[j+1179664+(f<<2)>>2]|0)+-1|0;m=f*7|0;k=j+12+(l<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(m<<2)>>2]|0);k=l<<1;g=j+655376+(k<<3)|0;h[g>>3]=+h[g>>3]+ +(c[j+1310736+(m+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(m+2<<2)>>2]|0);l=l<<2;k=j+131084+(l<<2)|0;g=c[j+1310736+(m+3<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;k=j+131084+((l|1)<<2)|0;g=c[j+1310736+(m+4<<2)>>2]|0;if((c[k>>2]|0)<(g|0))c[k>>2]=g;k=j+131084+((l|2)<<2)|0;g=c[j+1310736+(m+5<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;g=j+131084+((l|3)<<2)|0;k=c[j+1310736+(m+6<<2)>>2]|0;if((c[g>>2]|0)<(k|0))c[g>>2]=k;f=f+1|0}while((f|0)<(e|0))}if((c[a>>2]|0)>0){k=0;do{B=j+12+(k<<2)|0;C=k<<1;A=j+655376+(C<<3)|0;h[A>>3]=+h[A>>3]/+(c[B>>2]|0);C=j+655376+((C|1)<<3)|0;h[C>>3]=+h[C>>3]/+(c[B>>2]|0);k=k+1|0}while((k|0)<(c[a>>2]|0));k=0}else k=0}else k=0}i=D;return k|0}function Kc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;D=i;i=i+16|0;z=D;B=(e|0)/2|0;C=(f|0)/2|0;n=c[j>>2]|0;y=C+-1|0;if((e|0)>1){k=0;l=n;m=n+(($(y,B)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(B|0))break;else{l=l+2|0;m=m+2|0}}}w=g*3|0;x=B+-1|0;if((f|0)>1){k=0;g=n;l=n+(x<<1)|0;while(1){b[l>>1]=0;b[g>>1]=0;k=k+1|0;if((k|0)>=(C|0))break;else{g=g+(B<<1)|0;l=l+(B<<1)|0}}}l=j+1179664|0;t=0-B|0;r=1-B|0;s=~B;q=(e<<1)+8|0;a:do if((y|0)>1){u=(x|0)>1;v=1;g=a+((e<<2)+4)|0;m=n+(B+1<<1)|0;k=0;b:while(1){if(u){p=1;o=m;n=k;while(1){a=d[g>>0]|0;e=d[g+1>>0]|0;do if(((a&248)+12+(a<<5&224)+(e>>>3&24)+(e<<2&248)|0)>(w|0)){k=b[o+(t<<1)>>1]|0;if(k<<16>>16>0){b[o>>1]=k;k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}f=b[o+(r<<1)>>1]|0;a=f<<16>>16;k=b[o+(s<<1)>>1]|0;e=k<<16>>16;m=k<<16>>16>0;if(f<<16>>16<=0){if(m){b[o>>1]=k;k=e*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+p;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+v;m=j+1310736+(k+-3<<2)|0;if((c[m>>2]|0)<(p|0))c[m>>2]=p;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}k=b[o+-2>>1]|0;if(k<<16>>16>0){b[o>>1]=k;k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(p|0)){k=n;break}c[k>>2]=p;k=n;break}else{k=n+1|0;if((n|0)>32767)break b;b[o>>1]=k;c[j+1179664+(n<<2)>>2]=k<<16>>16;n=n*7|0;c[j+1310736+(n<<2)>>2]=1;c[j+1310736+(n+1<<2)>>2]=p;c[j+1310736+(n+2<<2)>>2]=v;c[j+1310736+(n+3<<2)>>2]=p;c[j+1310736+(n+4<<2)>>2]=p;c[j+1310736+(n+5<<2)>>2]=v;c[j+1310736+(n+6<<2)>>2]=v;break}}if(m){k=c[j+1179664+(a+-1<<2)>>2]|0;a=c[j+1179664+(e+-1<<2)>>2]|0;if((k|0)>(a|0)){b[o>>1]=a;if((n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(k|0))c[f>>2]=a;m=m+1|0;if((m|0)>=(n|0)){k=a;break}else f=f+4|0}}else k=a}else{b[o>>1]=k;if((k|0)<(a|0)&(n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(a|0))c[f>>2]=k;m=m+1|0;if((m|0)>=(n|0))break;else f=f+4|0}}}k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}m=b[o+-2>>1]|0;if(m<<16>>16<=0){b[o>>1]=f;k=a*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+p;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+v;m=j+1310736+(k+-4<<2)|0;if((c[m>>2]|0)>(p|0))c[m>>2]=p;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}k=c[j+1179664+(a+-1<<2)>>2]|0;a=c[j+1179664+((m<<16>>16)+-1<<2)>>2]|0;if((k|0)>(a|0)){b[o>>1]=a;if((n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(k|0))c[f>>2]=a;m=m+1|0;if((m|0)>=(n|0)){k=a;break}else f=f+4|0}}else k=a}else{b[o>>1]=k;if((k|0)<(a|0)&(n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(a|0))c[f>>2]=k;m=m+1|0;if((m|0)>=(n|0))break;else f=f+4|0}}}k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+v;k=n}else{b[o>>1]=0;k=n}while(0);p=p+1|0;g=g+4|0;m=o+2|0;if((p|0)>=(x|0))break;else{o=m;n=k}}}v=v+1|0;if((v|0)>=(y|0)){e=k;A=52;break a}else{g=g+q|0;m=m+4|0}}Me(3,3904,z);k=-1}else{e=0;A=52}while(0);if((A|0)==52){f=j+12|0;if((e|0)<1)g=1;else{m=1;g=1;while(1){k=c[l>>2]|0;if((k|0)==(m|0)){k=g;g=g+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[l>>2]=k;if((m|0)<(e|0)){m=m+1|0;l=l+4|0}else break}}a=j+8|0;k=g+-1|0;c[a>>2]=k;if(k){ek(f|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((g|0)>1){k=0;do{A=k<<2;c[j+131084+(A<<2)>>2]=B;c[j+131084+((A|1)<<2)>>2]=0;c[j+131084+((A|2)<<2)>>2]=C;c[j+131084+((A|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[a>>2]|0))}if((e|0)>0){f=0;do{l=(c[j+1179664+(f<<2)>>2]|0)+-1|0;m=f*7|0;k=j+12+(l<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(m<<2)>>2]|0);k=l<<1;g=j+655376+(k<<3)|0;h[g>>3]=+h[g>>3]+ +(c[j+1310736+(m+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(m+2<<2)>>2]|0);l=l<<2;k=j+131084+(l<<2)|0;g=c[j+1310736+(m+3<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;k=j+131084+((l|1)<<2)|0;g=c[j+1310736+(m+4<<2)>>2]|0;if((c[k>>2]|0)<(g|0))c[k>>2]=g;k=j+131084+((l|2)<<2)|0;g=c[j+1310736+(m+5<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;g=j+131084+((l|3)<<2)|0;k=c[j+1310736+(m+6<<2)>>2]|0;if((c[g>>2]|0)<(k|0))c[g>>2]=k;f=f+1|0}while((f|0)<(e|0))}if((c[a>>2]|0)>0){k=0;do{B=j+12+(k<<2)|0;C=k<<1;A=j+655376+(C<<3)|0;h[A>>3]=+h[A>>3]/+(c[B>>2]|0);C=j+655376+((C|1)<<3)|0;h[C>>3]=+h[C>>3]/+(c[B>>2]|0);k=k+1|0}while((k|0)<(c[a>>2]|0));k=0}else k=0}else k=0}i=D;return k|0}function Lc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;D=i;i=i+16|0;z=D;B=(e|0)/2|0;C=(f|0)/2|0;n=c[j>>2]|0;y=C+-1|0;if((e|0)>1){k=0;l=n;m=n+(($(y,B)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(B|0))break;else{l=l+2|0;m=m+2|0}}}w=g*3|0;x=B+-1|0;if((f|0)>1){k=0;g=n;l=n+(x<<1)|0;while(1){b[l>>1]=0;b[g>>1]=0;k=k+1|0;if((k|0)>=(C|0))break;else{g=g+(B<<1)|0;l=l+(B<<1)|0}}}l=j+1179664|0;t=0-B|0;r=1-B|0;s=~B;q=(e<<2)+16|0;a:do if((y|0)>1){u=(x|0)>1;v=1;g=a+((e<<3)+8)|0;m=n+(B+1<<1)|0;k=0;b:while(1){if(u){p=1;o=m;n=k;while(1){do if(((d[g+2>>0]|0)+(d[g+1>>0]|0)+(d[g+3>>0]|0)|0)>(w|0)){k=b[o+(t<<1)>>1]|0;if(k<<16>>16>0){b[o>>1]=k;k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}f=b[o+(r<<1)>>1]|0;a=f<<16>>16;k=b[o+(s<<1)>>1]|0;e=k<<16>>16;m=k<<16>>16>0;if(f<<16>>16<=0){if(m){b[o>>1]=k;k=e*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+p;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+v;m=j+1310736+(k+-3<<2)|0;if((c[m>>2]|0)<(p|0))c[m>>2]=p;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}k=b[o+-2>>1]|0;if(k<<16>>16>0){b[o>>1]=k;k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(p|0)){k=n;break}c[k>>2]=p;k=n;break}else{k=n+1|0;if((n|0)>32767)break b;b[o>>1]=k;c[j+1179664+(n<<2)>>2]=k<<16>>16;n=n*7|0;c[j+1310736+(n<<2)>>2]=1;c[j+1310736+(n+1<<2)>>2]=p;c[j+1310736+(n+2<<2)>>2]=v;c[j+1310736+(n+3<<2)>>2]=p;c[j+1310736+(n+4<<2)>>2]=p;c[j+1310736+(n+5<<2)>>2]=v;c[j+1310736+(n+6<<2)>>2]=v;break}}if(m){k=c[j+1179664+(a+-1<<2)>>2]|0;a=c[j+1179664+(e+-1<<2)>>2]|0;if((k|0)>(a|0)){b[o>>1]=a;if((n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(k|0))c[f>>2]=a;m=m+1|0;if((m|0)>=(n|0)){k=a;break}else f=f+4|0}}else k=a}else{b[o>>1]=k;if((k|0)<(a|0)&(n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(a|0))c[f>>2]=k;m=m+1|0;if((m|0)>=(n|0))break;else f=f+4|0}}}k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}m=b[o+-2>>1]|0;if(m<<16>>16<=0){b[o>>1]=f;k=a*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+p;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+v;m=j+1310736+(k+-4<<2)|0;if((c[m>>2]|0)>(p|0))c[m>>2]=p;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}k=c[j+1179664+(a+-1<<2)>>2]|0;a=c[j+1179664+((m<<16>>16)+-1<<2)>>2]|0;if((k|0)>(a|0)){b[o>>1]=a;if((n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(k|0))c[f>>2]=a;m=m+1|0;if((m|0)>=(n|0)){k=a;break}else f=f+4|0}}else k=a}else{b[o>>1]=k;if((k|0)<(a|0)&(n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(a|0))c[f>>2]=k;m=m+1|0;if((m|0)>=(n|0))break;else f=f+4|0}}}k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+v;k=n}else{b[o>>1]=0;k=n}while(0);p=p+1|0;g=g+8|0;m=o+2|0;if((p|0)>=(x|0))break;else{o=m;n=k}}}v=v+1|0;if((v|0)>=(y|0)){e=k;A=52;break a}else{g=g+q|0;m=m+4|0}}Me(3,3904,z);k=-1}else{e=0;A=52}while(0);if((A|0)==52){f=j+12|0;if((e|0)<1)g=1;else{m=1;g=1;while(1){k=c[l>>2]|0;if((k|0)==(m|0)){k=g;g=g+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[l>>2]=k;if((m|0)<(e|0)){m=m+1|0;l=l+4|0}else break}}a=j+8|0;k=g+-1|0;c[a>>2]=k;if(k){ek(f|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((g|0)>1){k=0;do{A=k<<2;c[j+131084+(A<<2)>>2]=B;c[j+131084+((A|1)<<2)>>2]=0;c[j+131084+((A|2)<<2)>>2]=C;c[j+131084+((A|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[a>>2]|0))}if((e|0)>0){f=0;do{l=(c[j+1179664+(f<<2)>>2]|0)+-1|0;m=f*7|0;k=j+12+(l<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(m<<2)>>2]|0);k=l<<1;g=j+655376+(k<<3)|0;h[g>>3]=+h[g>>3]+ +(c[j+1310736+(m+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(m+2<<2)>>2]|0);l=l<<2;k=j+131084+(l<<2)|0;g=c[j+1310736+(m+3<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;k=j+131084+((l|1)<<2)|0;g=c[j+1310736+(m+4<<2)>>2]|0;if((c[k>>2]|0)<(g|0))c[k>>2]=g;k=j+131084+((l|2)<<2)|0;g=c[j+1310736+(m+5<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;g=j+131084+((l|3)<<2)|0;k=c[j+1310736+(m+6<<2)>>2]|0;if((c[g>>2]|0)<(k|0))c[g>>2]=k;f=f+1|0}while((f|0)<(e|0))}if((c[a>>2]|0)>0){k=0;do{B=j+12+(k<<2)|0;C=k<<1;A=j+655376+(C<<3)|0;h[A>>3]=+h[A>>3]/+(c[B>>2]|0);C=j+655376+((C|1)<<3)|0;h[C>>3]=+h[C>>3]/+(c[B>>2]|0);k=k+1|0}while((k|0)<(c[a>>2]|0));k=0}else k=0}else k=0}i=D;return k|0}function Mc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;D=i;i=i+16|0;z=D;B=(e|0)/2|0;C=(f|0)/2|0;n=c[j>>2]|0;y=C+-1|0;if((e|0)>1){k=0;l=n;m=n+(($(y,B)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(B|0))break;else{l=l+2|0;m=m+2|0}}}x=B+-1|0;if((f|0)>1){k=0;l=n;m=n+(x<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(C|0))break;else{l=l+(B<<1)|0;m=m+(B<<1)|0}}}m=j+1179664|0;u=0-B|0;s=1-B|0;t=~B;r=e+4|0;a:do if((y|0)>1){v=(x|0)>1;w=1;l=a+((e<<1)+2)|0;f=n+(B+1<<1)|0;k=0;b:while(1){if(v){q=1;p=f;o=k;while(1){do if((d[l>>0]|0|0)>(g|0)){k=b[p+(u<<1)>>1]|0;if(k<<16>>16>0){b[p>>1]=k;k=(k<<16>>16)*7|0;n=j+1310736+(k+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=j+1310736+(k+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+q;n=j+1310736+(k+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=o;break}a=b[p+(s<<1)>>1]|0;e=a<<16>>16;k=b[p+(t<<1)>>1]|0;n=k<<16>>16;f=k<<16>>16>0;if(a<<16>>16<=0){if(f){b[p>>1]=k;k=n*7|0;f=j+1310736+(k+-7<<2)|0;c[f>>2]=(c[f>>2]|0)+1;f=j+1310736+(k+-6<<2)|0;c[f>>2]=(c[f>>2]|0)+q;f=j+1310736+(k+-5<<2)|0;c[f>>2]=(c[f>>2]|0)+w;f=j+1310736+(k+-3<<2)|0;if((c[f>>2]|0)<(q|0))c[f>>2]=q;c[j+1310736+(k+-1<<2)>>2]=w;k=o;break}k=b[p+-2>>1]|0;if(k<<16>>16>0){b[p>>1]=k;k=(k<<16>>16)*7|0;n=j+1310736+(k+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=j+1310736+(k+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+q;n=j+1310736+(k+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+w;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(q|0)){k=o;break}c[k>>2]=q;k=o;break}else{k=o+1|0;if((o|0)>32767)break b;b[p>>1]=k;c[j+1179664+(o<<2)>>2]=k<<16>>16;o=o*7|0;c[j+1310736+(o<<2)>>2]=1;c[j+1310736+(o+1<<2)>>2]=q;c[j+1310736+(o+2<<2)>>2]=w;c[j+1310736+(o+3<<2)>>2]=q;c[j+1310736+(o+4<<2)>>2]=q;c[j+1310736+(o+5<<2)>>2]=w;c[j+1310736+(o+6<<2)>>2]=w;break}}if(f){k=c[j+1179664+(e+-1<<2)>>2]|0;e=c[j+1179664+(n+-1<<2)>>2]|0;if((k|0)>(e|0)){b[p>>1]=e;if((o|0)>0){f=0;a=m;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=e;f=f+1|0;if((f|0)>=(o|0)){k=e;break}else a=a+4|0}}else k=e}else{b[p>>1]=k;if((k|0)<(e|0)&(o|0)>0){f=0;a=m;while(1){if((c[a>>2]|0)==(e|0))c[a>>2]=k;f=f+1|0;if((f|0)>=(o|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;n=j+1310736+(k+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=j+1310736+(k+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+q;n=j+1310736+(k+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=o;break}f=b[p+-2>>1]|0;if(f<<16>>16<=0){b[p>>1]=a;k=e*7|0;f=j+1310736+(k+-7<<2)|0;c[f>>2]=(c[f>>2]|0)+1;f=j+1310736+(k+-6<<2)|0;c[f>>2]=(c[f>>2]|0)+q;f=j+1310736+(k+-5<<2)|0;c[f>>2]=(c[f>>2]|0)+w;f=j+1310736+(k+-4<<2)|0;if((c[f>>2]|0)>(q|0))c[f>>2]=q;c[j+1310736+(k+-1<<2)>>2]=w;k=o;break}k=c[j+1179664+(e+-1<<2)>>2]|0;e=c[j+1179664+((f<<16>>16)+-1<<2)>>2]|0;if((k|0)>(e|0)){b[p>>1]=e;if((o|0)>0){f=0;a=m;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=e;f=f+1|0;if((f|0)>=(o|0)){k=e;break}else a=a+4|0}}else k=e}else{b[p>>1]=k;if((k|0)<(e|0)&(o|0)>0){f=0;a=m;while(1){if((c[a>>2]|0)==(e|0))c[a>>2]=k;f=f+1|0;if((f|0)>=(o|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;n=j+1310736+(k+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=j+1310736+(k+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+q;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+w;k=o}else{b[p>>1]=0;k=o}while(0);q=q+1|0;l=l+2|0;f=p+2|0;if((q|0)>=(x|0))break;else{p=f;o=k}}}w=w+1|0;if((w|0)>=(y|0)){n=k;A=52;break a}else{l=l+r|0;f=f+4|0}}Me(3,3904,z);k=-1}else{n=0;A=52}while(0);if((A|0)==52){a=j+12|0;if((n|0)<1)l=1;else{f=1;l=1;while(1){k=c[m>>2]|0;if((k|0)==(f|0)){k=l;l=l+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[m>>2]=k;if((f|0)<(n|0)){f=f+1|0;m=m+4|0}else break}}e=j+8|0;k=l+-1|0;c[e>>2]=k;if(k){ek(a|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((l|0)>1){k=0;do{A=k<<2;c[j+131084+(A<<2)>>2]=B;c[j+131084+((A|1)<<2)>>2]=0;c[j+131084+((A|2)<<2)>>2]=C;c[j+131084+((A|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[e>>2]|0))}if((n|0)>0){a=0;do{m=(c[j+1179664+(a<<2)>>2]|0)+-1|0;f=a*7|0;k=j+12+(m<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(f<<2)>>2]|0);k=m<<1;l=j+655376+(k<<3)|0;h[l>>3]=+h[l>>3]+ +(c[j+1310736+(f+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(f+2<<2)>>2]|0);m=m<<2;k=j+131084+(m<<2)|0;l=c[j+1310736+(f+3<<2)>>2]|0;if((c[k>>2]|0)>(l|0))c[k>>2]=l;k=j+131084+((m|1)<<2)|0;l=c[j+1310736+(f+4<<2)>>2]|0;if((c[k>>2]|0)<(l|0))c[k>>2]=l;k=j+131084+((m|2)<<2)|0;l=c[j+1310736+(f+5<<2)>>2]|0;if((c[k>>2]|0)>(l|0))c[k>>2]=l;l=j+131084+((m|3)<<2)|0;k=c[j+1310736+(f+6<<2)>>2]|0;if((c[l>>2]|0)<(k|0))c[l>>2]=k;a=a+1|0}while((a|0)<(n|0))}if((c[e>>2]|0)>0){k=0;do{B=j+12+(k<<2)|0;C=k<<1;A=j+655376+(C<<3)|0;h[A>>3]=+h[A>>3]/+(c[B>>2]|0);C=j+655376+((C|1)<<3)|0;h[C>>3]=+h[C>>3]/+(c[B>>2]|0);k=k+1|0}while((k|0)<(c[e>>2]|0));k=0}else k=0}else k=0}i=D;return k|0}function Nc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;D=i;i=i+16|0;z=D;B=(e|0)/2|0;C=(f|0)/2|0;n=c[j>>2]|0;y=C+-1|0;if((e|0)>1){k=0;l=n;m=n+(($(y,B)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(B|0))break;else{l=l+2|0;m=m+2|0}}}x=B+-1|0;if((f|0)>1){k=0;l=n;m=n+(x<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(C|0))break;else{l=l+(B<<1)|0;m=m+(B<<1)|0}}}m=j+1179664|0;u=0-B|0;s=1-B|0;t=~B;r=(e<<1)+8|0;a:do if((y|0)>1){v=(x|0)>1;w=1;l=a+((e<<2)+4)|0;f=n+(B+1<<1)|0;k=0;b:while(1){if(v){q=1;p=f;o=k;while(1){do if((d[l+1>>0]|0|0)>(g|0)){k=b[p+(u<<1)>>1]|0;if(k<<16>>16>0){b[p>>1]=k;k=(k<<16>>16)*7|0;n=j+1310736+(k+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=j+1310736+(k+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+q;n=j+1310736+(k+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=o;break}a=b[p+(s<<1)>>1]|0;e=a<<16>>16;k=b[p+(t<<1)>>1]|0;n=k<<16>>16;f=k<<16>>16>0;if(a<<16>>16<=0){if(f){b[p>>1]=k;k=n*7|0;f=j+1310736+(k+-7<<2)|0;c[f>>2]=(c[f>>2]|0)+1;f=j+1310736+(k+-6<<2)|0;c[f>>2]=(c[f>>2]|0)+q;f=j+1310736+(k+-5<<2)|0;c[f>>2]=(c[f>>2]|0)+w;f=j+1310736+(k+-3<<2)|0;if((c[f>>2]|0)<(q|0))c[f>>2]=q;c[j+1310736+(k+-1<<2)>>2]=w;k=o;break}k=b[p+-2>>1]|0;if(k<<16>>16>0){b[p>>1]=k;k=(k<<16>>16)*7|0;n=j+1310736+(k+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=j+1310736+(k+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+q;n=j+1310736+(k+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+w;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(q|0)){k=o;break}c[k>>2]=q;k=o;break}else{k=o+1|0;if((o|0)>32767)break b;b[p>>1]=k;c[j+1179664+(o<<2)>>2]=k<<16>>16;o=o*7|0;c[j+1310736+(o<<2)>>2]=1;c[j+1310736+(o+1<<2)>>2]=q;c[j+1310736+(o+2<<2)>>2]=w;c[j+1310736+(o+3<<2)>>2]=q;c[j+1310736+(o+4<<2)>>2]=q;c[j+1310736+(o+5<<2)>>2]=w;c[j+1310736+(o+6<<2)>>2]=w;break}}if(f){k=c[j+1179664+(e+-1<<2)>>2]|0;e=c[j+1179664+(n+-1<<2)>>2]|0;if((k|0)>(e|0)){b[p>>1]=e;if((o|0)>0){f=0;a=m;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=e;f=f+1|0;if((f|0)>=(o|0)){k=e;break}else a=a+4|0}}else k=e}else{b[p>>1]=k;if((k|0)<(e|0)&(o|0)>0){f=0;a=m;while(1){if((c[a>>2]|0)==(e|0))c[a>>2]=k;f=f+1|0;if((f|0)>=(o|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;n=j+1310736+(k+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=j+1310736+(k+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+q;n=j+1310736+(k+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=o;break}f=b[p+-2>>1]|0;if(f<<16>>16<=0){b[p>>1]=a;k=e*7|0;f=j+1310736+(k+-7<<2)|0;c[f>>2]=(c[f>>2]|0)+1;f=j+1310736+(k+-6<<2)|0;c[f>>2]=(c[f>>2]|0)+q;f=j+1310736+(k+-5<<2)|0;c[f>>2]=(c[f>>2]|0)+w;f=j+1310736+(k+-4<<2)|0;if((c[f>>2]|0)>(q|0))c[f>>2]=q;c[j+1310736+(k+-1<<2)>>2]=w;k=o;break}k=c[j+1179664+(e+-1<<2)>>2]|0;e=c[j+1179664+((f<<16>>16)+-1<<2)>>2]|0;if((k|0)>(e|0)){b[p>>1]=e;if((o|0)>0){f=0;a=m;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=e;f=f+1|0;if((f|0)>=(o|0)){k=e;break}else a=a+4|0}}else k=e}else{b[p>>1]=k;if((k|0)<(e|0)&(o|0)>0){f=0;a=m;while(1){if((c[a>>2]|0)==(e|0))c[a>>2]=k;f=f+1|0;if((f|0)>=(o|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;n=j+1310736+(k+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=j+1310736+(k+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+q;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+w;k=o}else{b[p>>1]=0;k=o}while(0);q=q+1|0;l=l+4|0;f=p+2|0;if((q|0)>=(x|0))break;else{p=f;o=k}}}w=w+1|0;if((w|0)>=(y|0)){n=k;A=52;break a}else{l=l+r|0;f=f+4|0}}Me(3,3904,z);k=-1}else{n=0;A=52}while(0);if((A|0)==52){a=j+12|0;if((n|0)<1)l=1;else{f=1;l=1;while(1){k=c[m>>2]|0;if((k|0)==(f|0)){k=l;l=l+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[m>>2]=k;if((f|0)<(n|0)){f=f+1|0;m=m+4|0}else break}}e=j+8|0;k=l+-1|0;c[e>>2]=k;if(k){ek(a|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((l|0)>1){k=0;do{A=k<<2;c[j+131084+(A<<2)>>2]=B;c[j+131084+((A|1)<<2)>>2]=0;c[j+131084+((A|2)<<2)>>2]=C;c[j+131084+((A|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[e>>2]|0))}if((n|0)>0){a=0;do{m=(c[j+1179664+(a<<2)>>2]|0)+-1|0;f=a*7|0;k=j+12+(m<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(f<<2)>>2]|0);k=m<<1;l=j+655376+(k<<3)|0;h[l>>3]=+h[l>>3]+ +(c[j+1310736+(f+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(f+2<<2)>>2]|0);m=m<<2;k=j+131084+(m<<2)|0;l=c[j+1310736+(f+3<<2)>>2]|0;if((c[k>>2]|0)>(l|0))c[k>>2]=l;k=j+131084+((m|1)<<2)|0;l=c[j+1310736+(f+4<<2)>>2]|0;if((c[k>>2]|0)<(l|0))c[k>>2]=l;k=j+131084+((m|2)<<2)|0;l=c[j+1310736+(f+5<<2)>>2]|0;if((c[k>>2]|0)>(l|0))c[k>>2]=l;l=j+131084+((m|3)<<2)|0;k=c[j+1310736+(f+6<<2)>>2]|0;if((c[l>>2]|0)<(k|0))c[l>>2]=k;a=a+1|0}while((a|0)<(n|0))}if((c[e>>2]|0)>0){k=0;do{B=j+12+(k<<2)|0;C=k<<1;A=j+655376+(C<<3)|0;h[A>>3]=+h[A>>3]/+(c[B>>2]|0);C=j+655376+((C|1)<<3)|0;h[C>>3]=+h[C>>3]/+(c[B>>2]|0);k=k+1|0}while((k|0)<(c[e>>2]|0));k=0}else k=0}else k=0}i=D;return k|0}function Oc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;D=i;i=i+16|0;z=D;B=(e|0)/2|0;C=(f|0)/2|0;n=c[j>>2]|0;y=C+-1|0;if((e|0)>1){k=0;l=n;m=n+(($(y,B)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(B|0))break;else{l=l+2|0;m=m+2|0}}}x=B+-1|0;if((f|0)>1){k=0;l=n;m=n+(x<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(C|0))break;else{l=l+(B<<1)|0;m=m+(B<<1)|0}}}m=j+1179664|0;u=0-B|0;s=1-B|0;t=~B;r=(e<<1)+8|0;a:do if((y|0)>1){v=(x|0)>1;w=1;l=a+((e<<2)+4)|0;f=n+(B+1<<1)|0;k=0;b:while(1){if(v){q=1;p=f;o=k;while(1){do if((d[l>>0]|0|0)>(g|0)){k=b[p+(u<<1)>>1]|0;if(k<<16>>16>0){b[p>>1]=k;k=(k<<16>>16)*7|0;n=j+1310736+(k+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=j+1310736+(k+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+q;n=j+1310736+(k+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=o;break}a=b[p+(s<<1)>>1]|0;e=a<<16>>16;k=b[p+(t<<1)>>1]|0;n=k<<16>>16;f=k<<16>>16>0;if(a<<16>>16<=0){if(f){b[p>>1]=k;k=n*7|0;f=j+1310736+(k+-7<<2)|0;c[f>>2]=(c[f>>2]|0)+1;f=j+1310736+(k+-6<<2)|0;c[f>>2]=(c[f>>2]|0)+q;f=j+1310736+(k+-5<<2)|0;c[f>>2]=(c[f>>2]|0)+w;f=j+1310736+(k+-3<<2)|0;if((c[f>>2]|0)<(q|0))c[f>>2]=q;c[j+1310736+(k+-1<<2)>>2]=w;k=o;break}k=b[p+-2>>1]|0;if(k<<16>>16>0){b[p>>1]=k;k=(k<<16>>16)*7|0;n=j+1310736+(k+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=j+1310736+(k+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+q;n=j+1310736+(k+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+w;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(q|0)){k=o;break}c[k>>2]=q;k=o;break}else{k=o+1|0;if((o|0)>32767)break b;b[p>>1]=k;c[j+1179664+(o<<2)>>2]=k<<16>>16;o=o*7|0;c[j+1310736+(o<<2)>>2]=1;c[j+1310736+(o+1<<2)>>2]=q;c[j+1310736+(o+2<<2)>>2]=w;c[j+1310736+(o+3<<2)>>2]=q;c[j+1310736+(o+4<<2)>>2]=q;c[j+1310736+(o+5<<2)>>2]=w;c[j+1310736+(o+6<<2)>>2]=w;break}}if(f){k=c[j+1179664+(e+-1<<2)>>2]|0;e=c[j+1179664+(n+-1<<2)>>2]|0;if((k|0)>(e|0)){b[p>>1]=e;if((o|0)>0){f=0;a=m;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=e;f=f+1|0;if((f|0)>=(o|0)){k=e;break}else a=a+4|0}}else k=e}else{b[p>>1]=k;if((k|0)<(e|0)&(o|0)>0){f=0;a=m;while(1){if((c[a>>2]|0)==(e|0))c[a>>2]=k;f=f+1|0;if((f|0)>=(o|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;n=j+1310736+(k+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=j+1310736+(k+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+q;n=j+1310736+(k+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=o;break}f=b[p+-2>>1]|0;if(f<<16>>16<=0){b[p>>1]=a;k=e*7|0;f=j+1310736+(k+-7<<2)|0;c[f>>2]=(c[f>>2]|0)+1;f=j+1310736+(k+-6<<2)|0;c[f>>2]=(c[f>>2]|0)+q;f=j+1310736+(k+-5<<2)|0;c[f>>2]=(c[f>>2]|0)+w;f=j+1310736+(k+-4<<2)|0;if((c[f>>2]|0)>(q|0))c[f>>2]=q;c[j+1310736+(k+-1<<2)>>2]=w;k=o;break}k=c[j+1179664+(e+-1<<2)>>2]|0;e=c[j+1179664+((f<<16>>16)+-1<<2)>>2]|0;if((k|0)>(e|0)){b[p>>1]=e;if((o|0)>0){f=0;a=m;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=e;f=f+1|0;if((f|0)>=(o|0)){k=e;break}else a=a+4|0}}else k=e}else{b[p>>1]=k;if((k|0)<(e|0)&(o|0)>0){f=0;a=m;while(1){if((c[a>>2]|0)==(e|0))c[a>>2]=k;f=f+1|0;if((f|0)>=(o|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;n=j+1310736+(k+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=j+1310736+(k+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+q;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+w;k=o}else{b[p>>1]=0;k=o}while(0);q=q+1|0;l=l+4|0;f=p+2|0;if((q|0)>=(x|0))break;else{p=f;o=k}}}w=w+1|0;if((w|0)>=(y|0)){n=k;A=52;break a}else{l=l+r|0;f=f+4|0}}Me(3,3904,z);k=-1}else{n=0;A=52}while(0);if((A|0)==52){a=j+12|0;if((n|0)<1)l=1;else{f=1;l=1;while(1){k=c[m>>2]|0;if((k|0)==(f|0)){k=l;l=l+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[m>>2]=k;if((f|0)<(n|0)){f=f+1|0;m=m+4|0}else break}}e=j+8|0;k=l+-1|0;c[e>>2]=k;if(k){ek(a|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((l|0)>1){k=0;do{A=k<<2;c[j+131084+(A<<2)>>2]=B;c[j+131084+((A|1)<<2)>>2]=0;c[j+131084+((A|2)<<2)>>2]=C;c[j+131084+((A|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[e>>2]|0))}if((n|0)>0){a=0;do{m=(c[j+1179664+(a<<2)>>2]|0)+-1|0;f=a*7|0;k=j+12+(m<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(f<<2)>>2]|0);k=m<<1;l=j+655376+(k<<3)|0;h[l>>3]=+h[l>>3]+ +(c[j+1310736+(f+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(f+2<<2)>>2]|0);m=m<<2;k=j+131084+(m<<2)|0;l=c[j+1310736+(f+3<<2)>>2]|0;if((c[k>>2]|0)>(l|0))c[k>>2]=l;k=j+131084+((m|1)<<2)|0;l=c[j+1310736+(f+4<<2)>>2]|0;if((c[k>>2]|0)<(l|0))c[k>>2]=l;k=j+131084+((m|2)<<2)|0;l=c[j+1310736+(f+5<<2)>>2]|0;if((c[k>>2]|0)>(l|0))c[k>>2]=l;l=j+131084+((m|3)<<2)|0;k=c[j+1310736+(f+6<<2)>>2]|0;if((c[l>>2]|0)<(k|0))c[l>>2]=k;a=a+1|0}while((a|0)<(n|0))}if((c[e>>2]|0)>0){k=0;do{B=j+12+(k<<2)|0;C=k<<1;A=j+655376+(C<<3)|0;h[A>>3]=+h[A>>3]/+(c[B>>2]|0);C=j+655376+((C|1)<<3)|0;h[C>>3]=+h[C>>3]/+(c[B>>2]|0);k=k+1|0}while((k|0)<(c[e>>2]|0));k=0}else k=0}else k=0}i=D;return k|0}function Pc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=i;i=i+16|0;A=C;n=c[j>>2]|0;z=f+-1|0;if((e|0)>0){k=0;l=n;m=n+(($(z,e)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(e|0))break;else{l=l+2|0;m=m+2|0}}}y=g*3|0;x=e+-1|0;if((f|0)>0){k=0;g=n;l=n+(x<<1)|0;while(1){b[l>>1]=0;b[g>>1]=0;k=k+1|0;if((k|0)>=(f|0))break;else{g=g+(e<<1)|0;l=l+(e<<1)|0}}}l=j+1179664|0;k=e+1|0;u=0-e|0;s=1-e|0;t=~e;a:do if((z|0)>1){v=(x|0)>1;w=1;g=a+(k*3|0)|0;m=n+(k<<1)|0;k=0;b:while(1){if(v){r=1;q=m;p=k;while(1){do if(((d[g+1>>0]|0)+(d[g>>0]|0)+(d[g+2>>0]|0)|0)>(y|0)){k=b[q+(u<<1)>>1]|0;if(k<<16>>16>0){b[q>>1]=k;k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}a=b[q+(s<<1)>>1]|0;n=a<<16>>16;k=b[q+(t<<1)>>1]|0;o=k<<16>>16;m=k<<16>>16>0;if(a<<16>>16<=0){if(m){b[q>>1]=k;k=o*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+r;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+w;m=j+1310736+(k+-3<<2)|0;if((c[m>>2]|0)<(r|0))c[m>>2]=r;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}k=b[q+-2>>1]|0;if(k<<16>>16>0){b[q>>1]=k;k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(r|0)){k=p;break}c[k>>2]=r;k=p;break}else{k=p+1|0;if((p|0)>32767)break b;b[q>>1]=k;c[j+1179664+(p<<2)>>2]=k<<16>>16;p=p*7|0;c[j+1310736+(p<<2)>>2]=1;c[j+1310736+(p+1<<2)>>2]=r;c[j+1310736+(p+2<<2)>>2]=w;c[j+1310736+(p+3<<2)>>2]=r;c[j+1310736+(p+4<<2)>>2]=r;c[j+1310736+(p+5<<2)>>2]=w;c[j+1310736+(p+6<<2)>>2]=w;break}}if(m){k=c[j+1179664+(n+-1<<2)>>2]|0;n=c[j+1179664+(o+-1<<2)>>2]|0;if((k|0)>(n|0)){b[q>>1]=n;if((p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=n;m=m+1|0;if((m|0)>=(p|0)){k=n;break}else a=a+4|0}}else k=n}else{b[q>>1]=k;if((k|0)<(n|0)&(p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(n|0))c[a>>2]=k;m=m+1|0;if((m|0)>=(p|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}m=b[q+-2>>1]|0;if(m<<16>>16<=0){b[q>>1]=a;k=n*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+r;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+w;m=j+1310736+(k+-4<<2)|0;if((c[m>>2]|0)>(r|0))c[m>>2]=r;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}k=c[j+1179664+(n+-1<<2)>>2]|0;n=c[j+1179664+((m<<16>>16)+-1<<2)>>2]|0;if((k|0)>(n|0)){b[q>>1]=n;if((p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=n;m=m+1|0;if((m|0)>=(p|0)){k=n;break}else a=a+4|0}}else k=n}else{b[q>>1]=k;if((k|0)<(n|0)&(p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(n|0))c[a>>2]=k;m=m+1|0;if((m|0)>=(p|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+w;k=p}else{b[q>>1]=0;k=p}while(0);r=r+1|0;g=g+3|0;m=q+2|0;if((r|0)>=(x|0))break;else{q=m;p=k}}}w=w+1|0;if((w|0)>=(z|0)){o=k;B=52;break a}else{g=g+6|0;m=m+4|0}}Me(3,3904,A);k=-1}else{o=0;B=52}while(0);if((B|0)==52){a=j+12|0;if((o|0)<1)g=1;else{m=1;g=1;while(1){k=c[l>>2]|0;if((k|0)==(m|0)){k=g;g=g+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[l>>2]=k;if((m|0)<(o|0)){m=m+1|0;l=l+4|0}else break}}n=j+8|0;k=g+-1|0;c[n>>2]=k;if(k){ek(a|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((g|0)>1){k=0;do{B=k<<2;c[j+131084+(B<<2)>>2]=e;c[j+131084+((B|1)<<2)>>2]=0;c[j+131084+((B|2)<<2)>>2]=f;c[j+131084+((B|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[n>>2]|0))}if((o|0)>0){a=0;do{l=(c[j+1179664+(a<<2)>>2]|0)+-1|0;m=a*7|0;k=j+12+(l<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(m<<2)>>2]|0);k=l<<1;g=j+655376+(k<<3)|0;h[g>>3]=+h[g>>3]+ +(c[j+1310736+(m+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(m+2<<2)>>2]|0);l=l<<2;k=j+131084+(l<<2)|0;g=c[j+1310736+(m+3<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;k=j+131084+((l|1)<<2)|0;g=c[j+1310736+(m+4<<2)>>2]|0;if((c[k>>2]|0)<(g|0))c[k>>2]=g;k=j+131084+((l|2)<<2)|0;g=c[j+1310736+(m+5<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;g=j+131084+((l|3)<<2)|0;k=c[j+1310736+(m+6<<2)>>2]|0;if((c[g>>2]|0)<(k|0))c[g>>2]=k;a=a+1|0}while((a|0)<(o|0))}if((c[n>>2]|0)>0){k=0;do{e=j+12+(k<<2)|0;f=k<<1;B=j+655376+(f<<3)|0;h[B>>3]=+h[B>>3]/+(c[e>>2]|0);f=j+655376+((f|1)<<3)|0;h[f>>3]=+h[f>>3]/+(c[e>>2]|0);k=k+1|0}while((k|0)<(c[n>>2]|0));k=0}else k=0}else k=0}i=C;return k|0}function Qc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=i;i=i+16|0;A=C;n=c[j>>2]|0;z=f+-1|0;if((e|0)>0){k=0;l=n;m=n+(($(z,e)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(e|0))break;else{l=l+2|0;m=m+2|0}}}y=g*3|0;x=e+-1|0;if((f|0)>0){k=0;g=n;l=n+(x<<1)|0;while(1){b[l>>1]=0;b[g>>1]=0;k=k+1|0;if((k|0)>=(f|0))break;else{g=g+(e<<1)|0;l=l+(e<<1)|0}}}l=j+1179664|0;k=e+1|0;u=0-e|0;s=1-e|0;t=~e;a:do if((z|0)>1){v=(x|0)>1;w=1;g=a+(k<<1)|0;m=n+(k<<1)|0;k=0;b:while(1){if(v){r=1;q=m;p=k;while(1){n=d[g>>0]|0;o=d[g+1>>0]|0;do if(((n&248)+10+(n<<5&224)+(o>>>3&28)+(o<<3&248)|0)>(y|0)){k=b[q+(u<<1)>>1]|0;if(k<<16>>16>0){b[q>>1]=k;k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}a=b[q+(s<<1)>>1]|0;n=a<<16>>16;k=b[q+(t<<1)>>1]|0;o=k<<16>>16;m=k<<16>>16>0;if(a<<16>>16<=0){if(m){b[q>>1]=k;k=o*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+r;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+w;m=j+1310736+(k+-3<<2)|0;if((c[m>>2]|0)<(r|0))c[m>>2]=r;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}k=b[q+-2>>1]|0;if(k<<16>>16>0){b[q>>1]=k;k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(r|0)){k=p;break}c[k>>2]=r;k=p;break}else{k=p+1|0;if((p|0)>32767)break b;b[q>>1]=k;c[j+1179664+(p<<2)>>2]=k<<16>>16;p=p*7|0;c[j+1310736+(p<<2)>>2]=1;c[j+1310736+(p+1<<2)>>2]=r;c[j+1310736+(p+2<<2)>>2]=w;c[j+1310736+(p+3<<2)>>2]=r;c[j+1310736+(p+4<<2)>>2]=r;c[j+1310736+(p+5<<2)>>2]=w;c[j+1310736+(p+6<<2)>>2]=w;break}}if(m){k=c[j+1179664+(n+-1<<2)>>2]|0;n=c[j+1179664+(o+-1<<2)>>2]|0;if((k|0)>(n|0)){b[q>>1]=n;if((p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=n;m=m+1|0;if((m|0)>=(p|0)){k=n;break}else a=a+4|0}}else k=n}else{b[q>>1]=k;if((k|0)<(n|0)&(p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(n|0))c[a>>2]=k;m=m+1|0;if((m|0)>=(p|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}m=b[q+-2>>1]|0;if(m<<16>>16<=0){b[q>>1]=a;k=n*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+r;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+w;m=j+1310736+(k+-4<<2)|0;if((c[m>>2]|0)>(r|0))c[m>>2]=r;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}k=c[j+1179664+(n+-1<<2)>>2]|0;n=c[j+1179664+((m<<16>>16)+-1<<2)>>2]|0;if((k|0)>(n|0)){b[q>>1]=n;if((p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=n;m=m+1|0;if((m|0)>=(p|0)){k=n;break}else a=a+4|0}}else k=n}else{b[q>>1]=k;if((k|0)<(n|0)&(p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(n|0))c[a>>2]=k;m=m+1|0;if((m|0)>=(p|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+w;k=p}else{b[q>>1]=0;k=p}while(0);r=r+1|0;g=g+2|0;m=q+2|0;if((r|0)>=(x|0))break;else{q=m;p=k}}}w=w+1|0;if((w|0)>=(z|0)){o=k;B=52;break a}else{g=g+4|0;m=m+4|0}}Me(3,3904,A);k=-1}else{o=0;B=52}while(0);if((B|0)==52){a=j+12|0;if((o|0)<1)g=1;else{m=1;g=1;while(1){k=c[l>>2]|0;if((k|0)==(m|0)){k=g;g=g+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[l>>2]=k;if((m|0)<(o|0)){m=m+1|0;l=l+4|0}else break}}n=j+8|0;k=g+-1|0;c[n>>2]=k;if(k){ek(a|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((g|0)>1){k=0;do{B=k<<2;c[j+131084+(B<<2)>>2]=e;c[j+131084+((B|1)<<2)>>2]=0;c[j+131084+((B|2)<<2)>>2]=f;c[j+131084+((B|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[n>>2]|0))}if((o|0)>0){a=0;do{l=(c[j+1179664+(a<<2)>>2]|0)+-1|0;m=a*7|0;k=j+12+(l<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(m<<2)>>2]|0);k=l<<1;g=j+655376+(k<<3)|0;h[g>>3]=+h[g>>3]+ +(c[j+1310736+(m+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(m+2<<2)>>2]|0);l=l<<2;k=j+131084+(l<<2)|0;g=c[j+1310736+(m+3<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;k=j+131084+((l|1)<<2)|0;g=c[j+1310736+(m+4<<2)>>2]|0;if((c[k>>2]|0)<(g|0))c[k>>2]=g;k=j+131084+((l|2)<<2)|0;g=c[j+1310736+(m+5<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;g=j+131084+((l|3)<<2)|0;k=c[j+1310736+(m+6<<2)>>2]|0;if((c[g>>2]|0)<(k|0))c[g>>2]=k;a=a+1|0}while((a|0)<(o|0))}if((c[n>>2]|0)>0){k=0;do{e=j+12+(k<<2)|0;f=k<<1;B=j+655376+(f<<3)|0;h[B>>3]=+h[B>>3]/+(c[e>>2]|0);f=j+655376+((f|1)<<3)|0;h[f>>3]=+h[f>>3]/+(c[e>>2]|0);k=k+1|0}while((k|0)<(c[n>>2]|0));k=0}else k=0}else k=0}i=C;return k|0}function Rc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=i;i=i+16|0;A=C;n=c[j>>2]|0;z=f+-1|0;if((e|0)>0){k=0;l=n;m=n+(($(z,e)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(e|0))break;else{l=l+2|0;m=m+2|0}}}y=g*3|0;x=e+-1|0;if((f|0)>0){k=0;g=n;l=n+(x<<1)|0;while(1){b[l>>1]=0;b[g>>1]=0;k=k+1|0;if((k|0)>=(f|0))break;else{g=g+(e<<1)|0;l=l+(e<<1)|0}}}l=j+1179664|0;k=e+1|0;u=0-e|0;s=1-e|0;t=~e;a:do if((z|0)>1){v=(x|0)>1;w=1;g=a+(k<<2)|0;m=n+(k<<1)|0;k=0;b:while(1){if(v){r=1;q=m;p=k;while(1){do if(((d[g+1>>0]|0)+(d[g>>0]|0)+(d[g+2>>0]|0)|0)>(y|0)){k=b[q+(u<<1)>>1]|0;if(k<<16>>16>0){b[q>>1]=k;k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}a=b[q+(s<<1)>>1]|0;n=a<<16>>16;k=b[q+(t<<1)>>1]|0;o=k<<16>>16;m=k<<16>>16>0;if(a<<16>>16<=0){if(m){b[q>>1]=k;k=o*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+r;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+w;m=j+1310736+(k+-3<<2)|0;if((c[m>>2]|0)<(r|0))c[m>>2]=r;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}k=b[q+-2>>1]|0;if(k<<16>>16>0){b[q>>1]=k;k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(r|0)){k=p;break}c[k>>2]=r;k=p;break}else{k=p+1|0;if((p|0)>32767)break b;b[q>>1]=k;c[j+1179664+(p<<2)>>2]=k<<16>>16;p=p*7|0;c[j+1310736+(p<<2)>>2]=1;c[j+1310736+(p+1<<2)>>2]=r;c[j+1310736+(p+2<<2)>>2]=w;c[j+1310736+(p+3<<2)>>2]=r;c[j+1310736+(p+4<<2)>>2]=r;c[j+1310736+(p+5<<2)>>2]=w;c[j+1310736+(p+6<<2)>>2]=w;break}}if(m){k=c[j+1179664+(n+-1<<2)>>2]|0;n=c[j+1179664+(o+-1<<2)>>2]|0;if((k|0)>(n|0)){b[q>>1]=n;if((p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=n;m=m+1|0;if((m|0)>=(p|0)){k=n;break}else a=a+4|0}}else k=n}else{b[q>>1]=k;if((k|0)<(n|0)&(p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(n|0))c[a>>2]=k;m=m+1|0;if((m|0)>=(p|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}m=b[q+-2>>1]|0;if(m<<16>>16<=0){b[q>>1]=a;k=n*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+r;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+w;m=j+1310736+(k+-4<<2)|0;if((c[m>>2]|0)>(r|0))c[m>>2]=r;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}k=c[j+1179664+(n+-1<<2)>>2]|0;n=c[j+1179664+((m<<16>>16)+-1<<2)>>2]|0;if((k|0)>(n|0)){b[q>>1]=n;if((p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=n;m=m+1|0;if((m|0)>=(p|0)){k=n;break}else a=a+4|0}}else k=n}else{b[q>>1]=k;if((k|0)<(n|0)&(p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(n|0))c[a>>2]=k;m=m+1|0;if((m|0)>=(p|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+w;k=p}else{b[q>>1]=0;k=p}while(0);r=r+1|0;g=g+4|0;m=q+2|0;if((r|0)>=(x|0))break;else{q=m;p=k}}}w=w+1|0;if((w|0)>=(z|0)){o=k;B=52;break a}else{g=g+8|0;m=m+4|0}}Me(3,3904,A);k=-1}else{o=0;B=52}while(0);if((B|0)==52){a=j+12|0;if((o|0)<1)g=1;else{m=1;g=1;while(1){k=c[l>>2]|0;if((k|0)==(m|0)){k=g;g=g+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[l>>2]=k;if((m|0)<(o|0)){m=m+1|0;l=l+4|0}else break}}n=j+8|0;k=g+-1|0;c[n>>2]=k;if(k){ek(a|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((g|0)>1){k=0;do{B=k<<2;c[j+131084+(B<<2)>>2]=e;c[j+131084+((B|1)<<2)>>2]=0;c[j+131084+((B|2)<<2)>>2]=f;c[j+131084+((B|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[n>>2]|0))}if((o|0)>0){a=0;do{l=(c[j+1179664+(a<<2)>>2]|0)+-1|0;m=a*7|0;k=j+12+(l<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(m<<2)>>2]|0);k=l<<1;g=j+655376+(k<<3)|0;h[g>>3]=+h[g>>3]+ +(c[j+1310736+(m+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(m+2<<2)>>2]|0);l=l<<2;k=j+131084+(l<<2)|0;g=c[j+1310736+(m+3<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;k=j+131084+((l|1)<<2)|0;g=c[j+1310736+(m+4<<2)>>2]|0;if((c[k>>2]|0)<(g|0))c[k>>2]=g;k=j+131084+((l|2)<<2)|0;g=c[j+1310736+(m+5<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;g=j+131084+((l|3)<<2)|0;k=c[j+1310736+(m+6<<2)>>2]|0;if((c[g>>2]|0)<(k|0))c[g>>2]=k;a=a+1|0}while((a|0)<(o|0))}if((c[n>>2]|0)>0){k=0;do{e=j+12+(k<<2)|0;f=k<<1;B=j+655376+(f<<3)|0;h[B>>3]=+h[B>>3]/+(c[e>>2]|0);f=j+655376+((f|1)<<3)|0;h[f>>3]=+h[f>>3]/+(c[e>>2]|0);k=k+1|0}while((k|0)<(c[n>>2]|0));k=0}else k=0}else k=0}i=C;return k|0}function Sc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=i;i=i+16|0;A=C;n=c[j>>2]|0;z=f+-1|0;if((e|0)>0){k=0;l=n;m=n+(($(z,e)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(e|0))break;else{l=l+2|0;m=m+2|0}}}y=g*3|0;x=e+-1|0;if((f|0)>0){k=0;g=n;l=n+(x<<1)|0;while(1){b[l>>1]=0;b[g>>1]=0;k=k+1|0;if((k|0)>=(f|0))break;else{g=g+(e<<1)|0;l=l+(e<<1)|0}}}l=j+1179664|0;k=e+1|0;u=0-e|0;s=1-e|0;t=~e;a:do if((z|0)>1){v=(x|0)>1;w=1;g=a+(k<<1)|0;m=n+(k<<1)|0;k=0;b:while(1){if(v){r=1;q=m;p=k;while(1){o=d[g>>0]|0;do if(((o&240)+24+(o<<4&240)+((d[g+1>>0]|0)&240)|0)>(y|0)){k=b[q+(u<<1)>>1]|0;if(k<<16>>16>0){b[q>>1]=k;k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}a=b[q+(s<<1)>>1]|0;n=a<<16>>16;k=b[q+(t<<1)>>1]|0;o=k<<16>>16;m=k<<16>>16>0;if(a<<16>>16<=0){if(m){b[q>>1]=k;k=o*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+r;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+w;m=j+1310736+(k+-3<<2)|0;if((c[m>>2]|0)<(r|0))c[m>>2]=r;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}k=b[q+-2>>1]|0;if(k<<16>>16>0){b[q>>1]=k;k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(r|0)){k=p;break}c[k>>2]=r;k=p;break}else{k=p+1|0;if((p|0)>32767)break b;b[q>>1]=k;c[j+1179664+(p<<2)>>2]=k<<16>>16;p=p*7|0;c[j+1310736+(p<<2)>>2]=1;c[j+1310736+(p+1<<2)>>2]=r;c[j+1310736+(p+2<<2)>>2]=w;c[j+1310736+(p+3<<2)>>2]=r;c[j+1310736+(p+4<<2)>>2]=r;c[j+1310736+(p+5<<2)>>2]=w;c[j+1310736+(p+6<<2)>>2]=w;break}}if(m){k=c[j+1179664+(n+-1<<2)>>2]|0;n=c[j+1179664+(o+-1<<2)>>2]|0;if((k|0)>(n|0)){b[q>>1]=n;if((p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=n;m=m+1|0;if((m|0)>=(p|0)){k=n;break}else a=a+4|0}}else k=n}else{b[q>>1]=k;if((k|0)<(n|0)&(p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(n|0))c[a>>2]=k;m=m+1|0;if((m|0)>=(p|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}m=b[q+-2>>1]|0;if(m<<16>>16<=0){b[q>>1]=a;k=n*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+r;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+w;m=j+1310736+(k+-4<<2)|0;if((c[m>>2]|0)>(r|0))c[m>>2]=r;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}k=c[j+1179664+(n+-1<<2)>>2]|0;n=c[j+1179664+((m<<16>>16)+-1<<2)>>2]|0;if((k|0)>(n|0)){b[q>>1]=n;if((p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=n;m=m+1|0;if((m|0)>=(p|0)){k=n;break}else a=a+4|0}}else k=n}else{b[q>>1]=k;if((k|0)<(n|0)&(p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(n|0))c[a>>2]=k;m=m+1|0;if((m|0)>=(p|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+w;k=p}else{b[q>>1]=0;k=p}while(0);r=r+1|0;g=g+2|0;m=q+2|0;if((r|0)>=(x|0))break;else{q=m;p=k}}}w=w+1|0;if((w|0)>=(z|0)){o=k;B=52;break a}else{g=g+4|0;m=m+4|0}}Me(3,3904,A);k=-1}else{o=0;B=52}while(0);if((B|0)==52){a=j+12|0;if((o|0)<1)g=1;else{m=1;g=1;while(1){k=c[l>>2]|0;if((k|0)==(m|0)){k=g;g=g+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[l>>2]=k;if((m|0)<(o|0)){m=m+1|0;l=l+4|0}else break}}n=j+8|0;k=g+-1|0;c[n>>2]=k;if(k){ek(a|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((g|0)>1){k=0;do{B=k<<2;c[j+131084+(B<<2)>>2]=e;c[j+131084+((B|1)<<2)>>2]=0;c[j+131084+((B|2)<<2)>>2]=f;c[j+131084+((B|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[n>>2]|0))}if((o|0)>0){a=0;do{l=(c[j+1179664+(a<<2)>>2]|0)+-1|0;m=a*7|0;k=j+12+(l<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(m<<2)>>2]|0);k=l<<1;g=j+655376+(k<<3)|0;h[g>>3]=+h[g>>3]+ +(c[j+1310736+(m+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(m+2<<2)>>2]|0);l=l<<2;k=j+131084+(l<<2)|0;g=c[j+1310736+(m+3<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;k=j+131084+((l|1)<<2)|0;g=c[j+1310736+(m+4<<2)>>2]|0;if((c[k>>2]|0)<(g|0))c[k>>2]=g;k=j+131084+((l|2)<<2)|0;g=c[j+1310736+(m+5<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;g=j+131084+((l|3)<<2)|0;k=c[j+1310736+(m+6<<2)>>2]|0;if((c[g>>2]|0)<(k|0))c[g>>2]=k;a=a+1|0}while((a|0)<(o|0))}if((c[n>>2]|0)>0){k=0;do{e=j+12+(k<<2)|0;f=k<<1;B=j+655376+(f<<3)|0;h[B>>3]=+h[B>>3]/+(c[e>>2]|0);f=j+655376+((f|1)<<3)|0;h[f>>3]=+h[f>>3]/+(c[e>>2]|0);k=k+1|0}while((k|0)<(c[n>>2]|0));k=0}else k=0}else k=0}i=C;return k|0}function Tc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=i;i=i+16|0;A=C;n=c[j>>2]|0;z=f+-1|0;if((e|0)>0){k=0;l=n;m=n+(($(z,e)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(e|0))break;else{l=l+2|0;m=m+2|0}}}y=g*3|0;x=e+-1|0;if((f|0)>0){k=0;g=n;l=n+(x<<1)|0;while(1){b[l>>1]=0;b[g>>1]=0;k=k+1|0;if((k|0)>=(f|0))break;else{g=g+(e<<1)|0;l=l+(e<<1)|0}}}l=j+1179664|0;k=e+1|0;u=0-e|0;s=1-e|0;t=~e;a:do if((z|0)>1){v=(x|0)>1;w=1;g=a+(k<<1)|0;m=n+(k<<1)|0;k=0;b:while(1){if(v){r=1;q=m;p=k;while(1){n=d[g>>0]|0;o=d[g+1>>0]|0;do if(((n&248)+12+(n<<5&224)+(o>>>3&24)+(o<<2&248)|0)>(y|0)){k=b[q+(u<<1)>>1]|0;if(k<<16>>16>0){b[q>>1]=k;k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}a=b[q+(s<<1)>>1]|0;n=a<<16>>16;k=b[q+(t<<1)>>1]|0;o=k<<16>>16;m=k<<16>>16>0;if(a<<16>>16<=0){if(m){b[q>>1]=k;k=o*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+r;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+w;m=j+1310736+(k+-3<<2)|0;if((c[m>>2]|0)<(r|0))c[m>>2]=r;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}k=b[q+-2>>1]|0;if(k<<16>>16>0){b[q>>1]=k;k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(r|0)){k=p;break}c[k>>2]=r;k=p;break}else{k=p+1|0;if((p|0)>32767)break b;b[q>>1]=k;c[j+1179664+(p<<2)>>2]=k<<16>>16;p=p*7|0;c[j+1310736+(p<<2)>>2]=1;c[j+1310736+(p+1<<2)>>2]=r;c[j+1310736+(p+2<<2)>>2]=w;c[j+1310736+(p+3<<2)>>2]=r;c[j+1310736+(p+4<<2)>>2]=r;c[j+1310736+(p+5<<2)>>2]=w;c[j+1310736+(p+6<<2)>>2]=w;break}}if(m){k=c[j+1179664+(n+-1<<2)>>2]|0;n=c[j+1179664+(o+-1<<2)>>2]|0;if((k|0)>(n|0)){b[q>>1]=n;if((p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=n;m=m+1|0;if((m|0)>=(p|0)){k=n;break}else a=a+4|0}}else k=n}else{b[q>>1]=k;if((k|0)<(n|0)&(p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(n|0))c[a>>2]=k;m=m+1|0;if((m|0)>=(p|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}m=b[q+-2>>1]|0;if(m<<16>>16<=0){b[q>>1]=a;k=n*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+r;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+w;m=j+1310736+(k+-4<<2)|0;if((c[m>>2]|0)>(r|0))c[m>>2]=r;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}k=c[j+1179664+(n+-1<<2)>>2]|0;n=c[j+1179664+((m<<16>>16)+-1<<2)>>2]|0;if((k|0)>(n|0)){b[q>>1]=n;if((p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=n;m=m+1|0;if((m|0)>=(p|0)){k=n;break}else a=a+4|0}}else k=n}else{b[q>>1]=k;if((k|0)<(n|0)&(p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(n|0))c[a>>2]=k;m=m+1|0;if((m|0)>=(p|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+w;k=p}else{b[q>>1]=0;k=p}while(0);r=r+1|0;g=g+2|0;m=q+2|0;if((r|0)>=(x|0))break;else{q=m;p=k}}}w=w+1|0;if((w|0)>=(z|0)){o=k;B=52;break a}else{g=g+4|0;m=m+4|0}}Me(3,3904,A);k=-1}else{o=0;B=52}while(0);if((B|0)==52){a=j+12|0;if((o|0)<1)g=1;else{m=1;g=1;while(1){k=c[l>>2]|0;if((k|0)==(m|0)){k=g;g=g+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[l>>2]=k;if((m|0)<(o|0)){m=m+1|0;l=l+4|0}else break}}n=j+8|0;k=g+-1|0;c[n>>2]=k;if(k){ek(a|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((g|0)>1){k=0;do{B=k<<2;c[j+131084+(B<<2)>>2]=e;c[j+131084+((B|1)<<2)>>2]=0;c[j+131084+((B|2)<<2)>>2]=f;c[j+131084+((B|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[n>>2]|0))}if((o|0)>0){a=0;do{l=(c[j+1179664+(a<<2)>>2]|0)+-1|0;m=a*7|0;k=j+12+(l<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(m<<2)>>2]|0);k=l<<1;g=j+655376+(k<<3)|0;h[g>>3]=+h[g>>3]+ +(c[j+1310736+(m+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(m+2<<2)>>2]|0);l=l<<2;k=j+131084+(l<<2)|0;g=c[j+1310736+(m+3<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;k=j+131084+((l|1)<<2)|0;g=c[j+1310736+(m+4<<2)>>2]|0;if((c[k>>2]|0)<(g|0))c[k>>2]=g;k=j+131084+((l|2)<<2)|0;g=c[j+1310736+(m+5<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;g=j+131084+((l|3)<<2)|0;k=c[j+1310736+(m+6<<2)>>2]|0;if((c[g>>2]|0)<(k|0))c[g>>2]=k;a=a+1|0}while((a|0)<(o|0))}if((c[n>>2]|0)>0){k=0;do{e=j+12+(k<<2)|0;f=k<<1;B=j+655376+(f<<3)|0;h[B>>3]=+h[B>>3]/+(c[e>>2]|0);f=j+655376+((f|1)<<3)|0;h[f>>3]=+h[f>>3]/+(c[e>>2]|0);k=k+1|0}while((k|0)<(c[n>>2]|0));k=0}else k=0}else k=0}i=C;return k|0}function Uc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=i;i=i+16|0;A=C;n=c[j>>2]|0;z=f+-1|0;if((e|0)>0){k=0;l=n;m=n+(($(z,e)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(e|0))break;else{l=l+2|0;m=m+2|0}}}y=g*3|0;x=e+-1|0;if((f|0)>0){k=0;g=n;l=n+(x<<1)|0;while(1){b[l>>1]=0;b[g>>1]=0;k=k+1|0;if((k|0)>=(f|0))break;else{g=g+(e<<1)|0;l=l+(e<<1)|0}}}l=j+1179664|0;k=e+1|0;u=0-e|0;s=1-e|0;t=~e;a:do if((z|0)>1){v=(x|0)>1;w=1;g=a+(k<<2)|0;m=n+(k<<1)|0;k=0;b:while(1){if(v){r=1;q=m;p=k;while(1){do if(((d[g+2>>0]|0)+(d[g+1>>0]|0)+(d[g+3>>0]|0)|0)>(y|0)){k=b[q+(u<<1)>>1]|0;if(k<<16>>16>0){b[q>>1]=k;k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}a=b[q+(s<<1)>>1]|0;n=a<<16>>16;k=b[q+(t<<1)>>1]|0;o=k<<16>>16;m=k<<16>>16>0;if(a<<16>>16<=0){if(m){b[q>>1]=k;k=o*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+r;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+w;m=j+1310736+(k+-3<<2)|0;if((c[m>>2]|0)<(r|0))c[m>>2]=r;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}k=b[q+-2>>1]|0;if(k<<16>>16>0){b[q>>1]=k;k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(r|0)){k=p;break}c[k>>2]=r;k=p;break}else{k=p+1|0;if((p|0)>32767)break b;b[q>>1]=k;c[j+1179664+(p<<2)>>2]=k<<16>>16;p=p*7|0;c[j+1310736+(p<<2)>>2]=1;c[j+1310736+(p+1<<2)>>2]=r;c[j+1310736+(p+2<<2)>>2]=w;c[j+1310736+(p+3<<2)>>2]=r;c[j+1310736+(p+4<<2)>>2]=r;c[j+1310736+(p+5<<2)>>2]=w;c[j+1310736+(p+6<<2)>>2]=w;break}}if(m){k=c[j+1179664+(n+-1<<2)>>2]|0;n=c[j+1179664+(o+-1<<2)>>2]|0;if((k|0)>(n|0)){b[q>>1]=n;if((p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=n;m=m+1|0;if((m|0)>=(p|0)){k=n;break}else a=a+4|0}}else k=n}else{b[q>>1]=k;if((k|0)<(n|0)&(p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(n|0))c[a>>2]=k;m=m+1|0;if((m|0)>=(p|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}m=b[q+-2>>1]|0;if(m<<16>>16<=0){b[q>>1]=a;k=n*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+r;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+w;m=j+1310736+(k+-4<<2)|0;if((c[m>>2]|0)>(r|0))c[m>>2]=r;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}k=c[j+1179664+(n+-1<<2)>>2]|0;n=c[j+1179664+((m<<16>>16)+-1<<2)>>2]|0;if((k|0)>(n|0)){b[q>>1]=n;if((p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=n;m=m+1|0;if((m|0)>=(p|0)){k=n;break}else a=a+4|0}}else k=n}else{b[q>>1]=k;if((k|0)<(n|0)&(p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(n|0))c[a>>2]=k;m=m+1|0;if((m|0)>=(p|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+w;k=p}else{b[q>>1]=0;k=p}while(0);r=r+1|0;g=g+4|0;m=q+2|0;if((r|0)>=(x|0))break;else{q=m;p=k}}}w=w+1|0;if((w|0)>=(z|0)){o=k;B=52;break a}else{g=g+8|0;m=m+4|0}}Me(3,3904,A);k=-1}else{o=0;B=52}while(0);if((B|0)==52){a=j+12|0;if((o|0)<1)g=1;else{m=1;g=1;while(1){k=c[l>>2]|0;if((k|0)==(m|0)){k=g;g=g+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[l>>2]=k;if((m|0)<(o|0)){m=m+1|0;l=l+4|0}else break}}n=j+8|0;k=g+-1|0;c[n>>2]=k;if(k){ek(a|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((g|0)>1){k=0;do{B=k<<2;c[j+131084+(B<<2)>>2]=e;c[j+131084+((B|1)<<2)>>2]=0;c[j+131084+((B|2)<<2)>>2]=f;c[j+131084+((B|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[n>>2]|0))}if((o|0)>0){a=0;do{l=(c[j+1179664+(a<<2)>>2]|0)+-1|0;m=a*7|0;k=j+12+(l<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(m<<2)>>2]|0);k=l<<1;g=j+655376+(k<<3)|0;h[g>>3]=+h[g>>3]+ +(c[j+1310736+(m+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(m+2<<2)>>2]|0);l=l<<2;k=j+131084+(l<<2)|0;g=c[j+1310736+(m+3<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;k=j+131084+((l|1)<<2)|0;g=c[j+1310736+(m+4<<2)>>2]|0;if((c[k>>2]|0)<(g|0))c[k>>2]=g;k=j+131084+((l|2)<<2)|0;g=c[j+1310736+(m+5<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;g=j+131084+((l|3)<<2)|0;k=c[j+1310736+(m+6<<2)>>2]|0;if((c[g>>2]|0)<(k|0))c[g>>2]=k;a=a+1|0}while((a|0)<(o|0))}if((c[n>>2]|0)>0){k=0;do{e=j+12+(k<<2)|0;f=k<<1;B=j+655376+(f<<3)|0;h[B>>3]=+h[B>>3]/+(c[e>>2]|0);f=j+655376+((f|1)<<3)|0;h[f>>3]=+h[f>>3]/+(c[e>>2]|0);k=k+1|0}while((k|0)<(c[n>>2]|0));k=0}else k=0}else k=0}i=C;return k|0}function Vc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=i;i=i+16|0;A=C;n=c[j>>2]|0;z=f+-1|0;if((e|0)>0){k=0;l=n;m=n+(($(z,e)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(e|0))break;else{l=l+2|0;m=m+2|0}}}y=e+-1|0;if((f|0)>0){k=0;l=n;m=n+(y<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(f|0))break;else{l=l+(e<<1)|0;m=m+(e<<1)|0}}}m=j+1179664|0;k=e+1|0;v=0-e|0;t=1-e|0;u=~e;a:do if((z|0)>1){w=(y|0)>1;x=1;l=a+k|0;a=n+(k<<1)|0;k=0;b:while(1){if(w){s=1;r=a;q=k;while(1){do if((d[l>>0]|0|0)>(g|0)){k=b[r+(v<<1)>>1]|0;if(k<<16>>16>0){b[r>>1]=k;k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=j+1310736+(k+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+x;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}n=b[r+(t<<1)>>1]|0;o=n<<16>>16;k=b[r+(u<<1)>>1]|0;p=k<<16>>16;a=k<<16>>16>0;if(n<<16>>16<=0){if(a){b[r>>1]=k;k=p*7|0;a=j+1310736+(k+-7<<2)|0;c[a>>2]=(c[a>>2]|0)+1;a=j+1310736+(k+-6<<2)|0;c[a>>2]=(c[a>>2]|0)+s;a=j+1310736+(k+-5<<2)|0;c[a>>2]=(c[a>>2]|0)+x;a=j+1310736+(k+-3<<2)|0;if((c[a>>2]|0)<(s|0))c[a>>2]=s;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}k=b[r+-2>>1]|0;if(k<<16>>16>0){b[r>>1]=k;k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=j+1310736+(k+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+x;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(s|0)){k=q;break}c[k>>2]=s;k=q;break}else{k=q+1|0;if((q|0)>32767)break b;b[r>>1]=k;c[j+1179664+(q<<2)>>2]=k<<16>>16;q=q*7|0;c[j+1310736+(q<<2)>>2]=1;c[j+1310736+(q+1<<2)>>2]=s;c[j+1310736+(q+2<<2)>>2]=x;c[j+1310736+(q+3<<2)>>2]=s;c[j+1310736+(q+4<<2)>>2]=s;c[j+1310736+(q+5<<2)>>2]=x;c[j+1310736+(q+6<<2)>>2]=x;break}}if(a){k=c[j+1179664+(o+-1<<2)>>2]|0;o=c[j+1179664+(p+-1<<2)>>2]|0;if((k|0)>(o|0)){b[r>>1]=o;if((q|0)>0){a=0;n=m;while(1){if((c[n>>2]|0)==(k|0))c[n>>2]=o;a=a+1|0;if((a|0)>=(q|0)){k=o;break}else n=n+4|0}}else k=o}else{b[r>>1]=k;if((k|0)<(o|0)&(q|0)>0){a=0;n=m;while(1){if((c[n>>2]|0)==(o|0))c[n>>2]=k;a=a+1|0;if((a|0)>=(q|0))break;else n=n+4|0}}}k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=j+1310736+(k+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+x;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}k=b[r+-2>>1]|0;if(k<<16>>16<=0){b[r>>1]=n;k=o*7|0;a=j+1310736+(k+-7<<2)|0;c[a>>2]=(c[a>>2]|0)+1;a=j+1310736+(k+-6<<2)|0;c[a>>2]=(c[a>>2]|0)+s;a=j+1310736+(k+-5<<2)|0;c[a>>2]=(c[a>>2]|0)+x;a=j+1310736+(k+-4<<2)|0;if((c[a>>2]|0)>(s|0))c[a>>2]=s;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}o=c[j+1179664+(o+-1<<2)>>2]|0;k=c[j+1179664+((k<<16>>16)+-1<<2)>>2]|0;if((o|0)>(k|0)){b[r>>1]=k;if((q|0)>0){a=0;n=m;while(1){if((c[n>>2]|0)==(o|0))c[n>>2]=k;a=a+1|0;if((a|0)>=(q|0))break;else n=n+4|0}}}else{b[r>>1]=o;if((o|0)<(k|0)&(q|0)>0){a=0;n=m;while(1){if((c[n>>2]|0)==(k|0))c[n>>2]=o;a=a+1|0;if((a|0)>=(q|0)){k=o;break}else n=n+4|0}}else k=o}k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+x;k=q}else{b[r>>1]=0;k=q}while(0);s=s+1|0;l=l+1|0;a=r+2|0;if((s|0)>=(y|0))break;else{r=a;q=k}}}x=x+1|0;if((x|0)>=(z|0)){p=k;B=52;break a}else{l=l+2|0;a=a+4|0}}Me(3,3904,A);k=-1}else{p=0;B=52}while(0);if((B|0)==52){n=j+12|0;if((p|0)<1)l=1;else{a=1;l=1;while(1){k=c[m>>2]|0;if((k|0)==(a|0)){k=l;l=l+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[m>>2]=k;if((a|0)<(p|0)){a=a+1|0;m=m+4|0}else break}}o=j+8|0;k=l+-1|0;c[o>>2]=k;if(k){ek(n|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((l|0)>1){k=0;do{B=k<<2;c[j+131084+(B<<2)>>2]=e;c[j+131084+((B|1)<<2)>>2]=0;c[j+131084+((B|2)<<2)>>2]=f;c[j+131084+((B|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[o>>2]|0))}if((p|0)>0){n=0;do{m=(c[j+1179664+(n<<2)>>2]|0)+-1|0;a=n*7|0;k=j+12+(m<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(a<<2)>>2]|0);k=m<<1;l=j+655376+(k<<3)|0;h[l>>3]=+h[l>>3]+ +(c[j+1310736+(a+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(a+2<<2)>>2]|0);m=m<<2;k=j+131084+(m<<2)|0;l=c[j+1310736+(a+3<<2)>>2]|0;if((c[k>>2]|0)>(l|0))c[k>>2]=l;k=j+131084+((m|1)<<2)|0;l=c[j+1310736+(a+4<<2)>>2]|0;if((c[k>>2]|0)<(l|0))c[k>>2]=l;k=j+131084+((m|2)<<2)|0;l=c[j+1310736+(a+5<<2)>>2]|0;if((c[k>>2]|0)>(l|0))c[k>>2]=l;l=j+131084+((m|3)<<2)|0;k=c[j+1310736+(a+6<<2)>>2]|0;if((c[l>>2]|0)<(k|0))c[l>>2]=k;n=n+1|0}while((n|0)<(p|0))}if((c[o>>2]|0)>0){k=0;do{e=j+12+(k<<2)|0;f=k<<1;B=j+655376+(f<<3)|0;h[B>>3]=+h[B>>3]/+(c[e>>2]|0);f=j+655376+((f|1)<<3)|0;h[f>>3]=+h[f>>3]/+(c[e>>2]|0);k=k+1|0}while((k|0)<(c[o>>2]|0));k=0}else k=0}else k=0}i=C;return k|0}function Wc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=i;i=i+16|0;A=C;n=c[j>>2]|0;z=f+-1|0;if((e|0)>0){k=0;l=n;m=n+(($(z,e)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(e|0))break;else{l=l+2|0;m=m+2|0}}}y=e+-1|0;if((f|0)>0){k=0;l=n;m=n+(y<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(f|0))break;else{l=l+(e<<1)|0;m=m+(e<<1)|0}}}m=j+1179664|0;k=e+1|0;v=0-e|0;t=1-e|0;u=~e;a:do if((z|0)>1){w=(y|0)>1;x=1;l=a+(k<<1)|0;a=n+(k<<1)|0;k=0;b:while(1){if(w){s=1;r=a;q=k;while(1){do if((d[l+1>>0]|0|0)>(g|0)){k=b[r+(v<<1)>>1]|0;if(k<<16>>16>0){b[r>>1]=k;k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=j+1310736+(k+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+x;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}n=b[r+(t<<1)>>1]|0;o=n<<16>>16;k=b[r+(u<<1)>>1]|0;p=k<<16>>16;a=k<<16>>16>0;if(n<<16>>16<=0){if(a){b[r>>1]=k;k=p*7|0;a=j+1310736+(k+-7<<2)|0;c[a>>2]=(c[a>>2]|0)+1;a=j+1310736+(k+-6<<2)|0;c[a>>2]=(c[a>>2]|0)+s;a=j+1310736+(k+-5<<2)|0;c[a>>2]=(c[a>>2]|0)+x;a=j+1310736+(k+-3<<2)|0;if((c[a>>2]|0)<(s|0))c[a>>2]=s;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}k=b[r+-2>>1]|0;if(k<<16>>16>0){b[r>>1]=k;k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=j+1310736+(k+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+x;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(s|0)){k=q;break}c[k>>2]=s;k=q;break}else{k=q+1|0;if((q|0)>32767)break b;b[r>>1]=k;c[j+1179664+(q<<2)>>2]=k<<16>>16;q=q*7|0;c[j+1310736+(q<<2)>>2]=1;c[j+1310736+(q+1<<2)>>2]=s;c[j+1310736+(q+2<<2)>>2]=x;c[j+1310736+(q+3<<2)>>2]=s;c[j+1310736+(q+4<<2)>>2]=s;c[j+1310736+(q+5<<2)>>2]=x;c[j+1310736+(q+6<<2)>>2]=x;break}}if(a){k=c[j+1179664+(o+-1<<2)>>2]|0;o=c[j+1179664+(p+-1<<2)>>2]|0;if((k|0)>(o|0)){b[r>>1]=o;if((q|0)>0){a=0;n=m;while(1){if((c[n>>2]|0)==(k|0))c[n>>2]=o;a=a+1|0;if((a|0)>=(q|0)){k=o;break}else n=n+4|0}}else k=o}else{b[r>>1]=k;if((k|0)<(o|0)&(q|0)>0){a=0;n=m;while(1){if((c[n>>2]|0)==(o|0))c[n>>2]=k;a=a+1|0;if((a|0)>=(q|0))break;else n=n+4|0}}}k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=j+1310736+(k+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+x;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}a=b[r+-2>>1]|0;if(a<<16>>16<=0){b[r>>1]=n;k=o*7|0;a=j+1310736+(k+-7<<2)|0;c[a>>2]=(c[a>>2]|0)+1;a=j+1310736+(k+-6<<2)|0;c[a>>2]=(c[a>>2]|0)+s;a=j+1310736+(k+-5<<2)|0;c[a>>2]=(c[a>>2]|0)+x;a=j+1310736+(k+-4<<2)|0;if((c[a>>2]|0)>(s|0))c[a>>2]=s;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}k=c[j+1179664+(o+-1<<2)>>2]|0;o=c[j+1179664+((a<<16>>16)+-1<<2)>>2]|0;if((k|0)>(o|0)){b[r>>1]=o;if((q|0)>0){a=0;n=m;while(1){if((c[n>>2]|0)==(k|0))c[n>>2]=o;a=a+1|0;if((a|0)>=(q|0)){k=o;break}else n=n+4|0}}else k=o}else{b[r>>1]=k;if((k|0)<(o|0)&(q|0)>0){a=0;n=m;while(1){if((c[n>>2]|0)==(o|0))c[n>>2]=k;a=a+1|0;if((a|0)>=(q|0))break;else n=n+4|0}}}k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+x;k=q}else{b[r>>1]=0;k=q}while(0);s=s+1|0;l=l+2|0;a=r+2|0;if((s|0)>=(y|0))break;else{r=a;q=k}}}x=x+1|0;if((x|0)>=(z|0)){p=k;B=52;break a}else{l=l+4|0;a=a+4|0}}Me(3,3904,A);k=-1}else{p=0;B=52}while(0);if((B|0)==52){n=j+12|0;if((p|0)<1)l=1;else{a=1;l=1;while(1){k=c[m>>2]|0;if((k|0)==(a|0)){k=l;l=l+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[m>>2]=k;if((a|0)<(p|0)){a=a+1|0;m=m+4|0}else break}}o=j+8|0;k=l+-1|0;c[o>>2]=k;if(k){ek(n|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((l|0)>1){k=0;do{B=k<<2;c[j+131084+(B<<2)>>2]=e;c[j+131084+((B|1)<<2)>>2]=0;c[j+131084+((B|2)<<2)>>2]=f;c[j+131084+((B|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[o>>2]|0))}if((p|0)>0){n=0;do{m=(c[j+1179664+(n<<2)>>2]|0)+-1|0;a=n*7|0;k=j+12+(m<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(a<<2)>>2]|0);k=m<<1;l=j+655376+(k<<3)|0;h[l>>3]=+h[l>>3]+ +(c[j+1310736+(a+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(a+2<<2)>>2]|0);m=m<<2;k=j+131084+(m<<2)|0;l=c[j+1310736+(a+3<<2)>>2]|0;if((c[k>>2]|0)>(l|0))c[k>>2]=l;k=j+131084+((m|1)<<2)|0;l=c[j+1310736+(a+4<<2)>>2]|0;if((c[k>>2]|0)<(l|0))c[k>>2]=l;k=j+131084+((m|2)<<2)|0;l=c[j+1310736+(a+5<<2)>>2]|0;if((c[k>>2]|0)>(l|0))c[k>>2]=l;l=j+131084+((m|3)<<2)|0;k=c[j+1310736+(a+6<<2)>>2]|0;if((c[l>>2]|0)<(k|0))c[l>>2]=k;n=n+1|0}while((n|0)<(p|0))}if((c[o>>2]|0)>0){k=0;do{e=j+12+(k<<2)|0;f=k<<1;B=j+655376+(f<<3)|0;h[B>>3]=+h[B>>3]/+(c[e>>2]|0);f=j+655376+((f|1)<<3)|0;h[f>>3]=+h[f>>3]/+(c[e>>2]|0);k=k+1|0}while((k|0)<(c[o>>2]|0));k=0}else k=0}else k=0}i=C;return k|0}function Xc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=i;i=i+16|0;A=C;n=c[j>>2]|0;z=f+-1|0;if((e|0)>0){k=0;l=n;m=n+(($(z,e)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(e|0))break;else{l=l+2|0;m=m+2|0}}}y=e+-1|0;if((f|0)>0){k=0;l=n;m=n+(y<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(f|0))break;else{l=l+(e<<1)|0;m=m+(e<<1)|0}}}m=j+1179664|0;k=e+1|0;v=0-e|0;t=1-e|0;u=~e;a:do if((z|0)>1){w=(y|0)>1;x=1;l=a+(k<<1)|0;a=n+(k<<1)|0;k=0;b:while(1){if(w){s=1;r=a;q=k;while(1){do if((d[l>>0]|0|0)>(g|0)){k=b[r+(v<<1)>>1]|0;if(k<<16>>16>0){b[r>>1]=k;k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=j+1310736+(k+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+x;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}n=b[r+(t<<1)>>1]|0;o=n<<16>>16;k=b[r+(u<<1)>>1]|0;p=k<<16>>16;a=k<<16>>16>0;if(n<<16>>16<=0){if(a){b[r>>1]=k;k=p*7|0;a=j+1310736+(k+-7<<2)|0;c[a>>2]=(c[a>>2]|0)+1;a=j+1310736+(k+-6<<2)|0;c[a>>2]=(c[a>>2]|0)+s;a=j+1310736+(k+-5<<2)|0;c[a>>2]=(c[a>>2]|0)+x;a=j+1310736+(k+-3<<2)|0;if((c[a>>2]|0)<(s|0))c[a>>2]=s;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}k=b[r+-2>>1]|0;if(k<<16>>16>0){b[r>>1]=k;k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=j+1310736+(k+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+x;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(s|0)){k=q;break}c[k>>2]=s;k=q;break}else{k=q+1|0;if((q|0)>32767)break b;b[r>>1]=k;c[j+1179664+(q<<2)>>2]=k<<16>>16;q=q*7|0;c[j+1310736+(q<<2)>>2]=1;c[j+1310736+(q+1<<2)>>2]=s;c[j+1310736+(q+2<<2)>>2]=x;c[j+1310736+(q+3<<2)>>2]=s;c[j+1310736+(q+4<<2)>>2]=s;c[j+1310736+(q+5<<2)>>2]=x;c[j+1310736+(q+6<<2)>>2]=x;break}}if(a){k=c[j+1179664+(o+-1<<2)>>2]|0;o=c[j+1179664+(p+-1<<2)>>2]|0;if((k|0)>(o|0)){b[r>>1]=o;if((q|0)>0){a=0;n=m;while(1){if((c[n>>2]|0)==(k|0))c[n>>2]=o;a=a+1|0;if((a|0)>=(q|0)){k=o;break}else n=n+4|0}}else k=o}else{b[r>>1]=k;if((k|0)<(o|0)&(q|0)>0){a=0;n=m;while(1){if((c[n>>2]|0)==(o|0))c[n>>2]=k;a=a+1|0;if((a|0)>=(q|0))break;else n=n+4|0}}}k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=j+1310736+(k+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+x;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}k=b[r+-2>>1]|0;if(k<<16>>16<=0){b[r>>1]=n;k=o*7|0;a=j+1310736+(k+-7<<2)|0;c[a>>2]=(c[a>>2]|0)+1;a=j+1310736+(k+-6<<2)|0;c[a>>2]=(c[a>>2]|0)+s;a=j+1310736+(k+-5<<2)|0;c[a>>2]=(c[a>>2]|0)+x;a=j+1310736+(k+-4<<2)|0;if((c[a>>2]|0)>(s|0))c[a>>2]=s;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}o=c[j+1179664+(o+-1<<2)>>2]|0;k=c[j+1179664+((k<<16>>16)+-1<<2)>>2]|0;if((o|0)>(k|0)){b[r>>1]=k;if((q|0)>0){a=0;n=m;while(1){if((c[n>>2]|0)==(o|0))c[n>>2]=k;a=a+1|0;if((a|0)>=(q|0))break;else n=n+4|0}}}else{b[r>>1]=o;if((o|0)<(k|0)&(q|0)>0){a=0;n=m;while(1){if((c[n>>2]|0)==(k|0))c[n>>2]=o;a=a+1|0;if((a|0)>=(q|0)){k=o;break}else n=n+4|0}}else k=o}k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+x;k=q}else{b[r>>1]=0;k=q}while(0);s=s+1|0;l=l+2|0;a=r+2|0;if((s|0)>=(y|0))break;else{r=a;q=k}}}x=x+1|0;if((x|0)>=(z|0)){p=k;B=52;break a}else{l=l+4|0;a=a+4|0}}Me(3,3904,A);k=-1}else{p=0;B=52}while(0);if((B|0)==52){n=j+12|0;if((p|0)<1)l=1;else{a=1;l=1;while(1){k=c[m>>2]|0;if((k|0)==(a|0)){k=l;l=l+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[m>>2]=k;if((a|0)<(p|0)){a=a+1|0;m=m+4|0}else break}}o=j+8|0;k=l+-1|0;c[o>>2]=k;if(k){ek(n|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((l|0)>1){k=0;do{B=k<<2;c[j+131084+(B<<2)>>2]=e;c[j+131084+((B|1)<<2)>>2]=0;c[j+131084+((B|2)<<2)>>2]=f;c[j+131084+((B|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[o>>2]|0))}if((p|0)>0){n=0;do{m=(c[j+1179664+(n<<2)>>2]|0)+-1|0;a=n*7|0;k=j+12+(m<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(a<<2)>>2]|0);k=m<<1;l=j+655376+(k<<3)|0;h[l>>3]=+h[l>>3]+ +(c[j+1310736+(a+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(a+2<<2)>>2]|0);m=m<<2;k=j+131084+(m<<2)|0;l=c[j+1310736+(a+3<<2)>>2]|0;if((c[k>>2]|0)>(l|0))c[k>>2]=l;k=j+131084+((m|1)<<2)|0;l=c[j+1310736+(a+4<<2)>>2]|0;if((c[k>>2]|0)<(l|0))c[k>>2]=l;k=j+131084+((m|2)<<2)|0;l=c[j+1310736+(a+5<<2)>>2]|0;if((c[k>>2]|0)>(l|0))c[k>>2]=l;l=j+131084+((m|3)<<2)|0;k=c[j+1310736+(a+6<<2)>>2]|0;if((c[l>>2]|0)<(k|0))c[l>>2]=k;n=n+1|0}while((n|0)<(p|0))}if((c[o>>2]|0)>0){k=0;do{e=j+12+(k<<2)|0;f=k<<1;B=j+655376+(f<<3)|0;h[B>>3]=+h[B>>3]/+(c[e>>2]|0);f=j+655376+((f|1)<<3)|0;h[f>>3]=+h[f>>3]/+(c[e>>2]|0);k=k+1|0}while((k|0)<(c[o>>2]|0));k=0}else k=0}else k=0}i=C;return k|0}function Yc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=i;i=i+16|0;A=C;n=c[j>>2]|0;z=f+-1|0;if((e|0)>0){k=0;l=n;m=n+(($(z,e)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(e|0))break;else{l=l+2|0;m=m+2|0}}}y=e+-1|0;if((f|0)>0){k=0;l=n;m=n+(y<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(f|0))break;else{l=l+(e<<1)|0;m=m+(e<<1)|0}}}m=j+1179664|0;k=e+1|0;v=0-e|0;t=1-e|0;u=~e;a:do if((z|0)>1){w=(y|0)>1;x=1;l=a+k|0;a=n+(k<<1)|0;n=g+k|0;k=0;b:while(1){if(w){s=1;r=l;q=k;while(1){do if((d[r>>0]|0)>(d[n>>0]|0)){k=b[a+(v<<1)>>1]|0;if(k<<16>>16>0){b[a>>1]=k;k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=j+1310736+(k+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+x;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}g=b[a+(t<<1)>>1]|0;o=g<<16>>16;k=b[a+(u<<1)>>1]|0;p=k<<16>>16;l=k<<16>>16>0;if(g<<16>>16<=0){if(l){b[a>>1]=k;k=p*7|0;l=j+1310736+(k+-7<<2)|0;c[l>>2]=(c[l>>2]|0)+1;l=j+1310736+(k+-6<<2)|0;c[l>>2]=(c[l>>2]|0)+s;l=j+1310736+(k+-5<<2)|0;c[l>>2]=(c[l>>2]|0)+x;l=j+1310736+(k+-3<<2)|0;if((c[l>>2]|0)<(s|0))c[l>>2]=s;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}k=b[a+-2>>1]|0;if(k<<16>>16>0){b[a>>1]=k;k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=j+1310736+(k+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+x;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(s|0)){k=q;break}c[k>>2]=s;k=q;break}else{k=q+1|0;if((q|0)>32767)break b;b[a>>1]=k;c[j+1179664+(q<<2)>>2]=k<<16>>16;q=q*7|0;c[j+1310736+(q<<2)>>2]=1;c[j+1310736+(q+1<<2)>>2]=s;c[j+1310736+(q+2<<2)>>2]=x;c[j+1310736+(q+3<<2)>>2]=s;c[j+1310736+(q+4<<2)>>2]=s;c[j+1310736+(q+5<<2)>>2]=x;c[j+1310736+(q+6<<2)>>2]=x;break}}if(l){k=c[j+1179664+(o+-1<<2)>>2]|0;o=c[j+1179664+(p+-1<<2)>>2]|0;if((k|0)>(o|0)){b[a>>1]=o;if((q|0)>0){l=0;g=m;while(1){if((c[g>>2]|0)==(k|0))c[g>>2]=o;l=l+1|0;if((l|0)>=(q|0)){k=o;break}else g=g+4|0}}else k=o}else{b[a>>1]=k;if((k|0)<(o|0)&(q|0)>0){l=0;g=m;while(1){if((c[g>>2]|0)==(o|0))c[g>>2]=k;l=l+1|0;if((l|0)>=(q|0))break;else g=g+4|0}}}k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=j+1310736+(k+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+x;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}k=b[a+-2>>1]|0;if(k<<16>>16<=0){b[a>>1]=g;k=o*7|0;l=j+1310736+(k+-7<<2)|0;c[l>>2]=(c[l>>2]|0)+1;l=j+1310736+(k+-6<<2)|0;c[l>>2]=(c[l>>2]|0)+s;l=j+1310736+(k+-5<<2)|0;c[l>>2]=(c[l>>2]|0)+x;l=j+1310736+(k+-4<<2)|0;if((c[l>>2]|0)>(s|0))c[l>>2]=s;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}o=c[j+1179664+(o+-1<<2)>>2]|0;k=c[j+1179664+((k<<16>>16)+-1<<2)>>2]|0;if((o|0)>(k|0)){b[a>>1]=k;if((q|0)>0){l=0;g=m;while(1){if((c[g>>2]|0)==(o|0))c[g>>2]=k;l=l+1|0;if((l|0)>=(q|0))break;else g=g+4|0}}}else{b[a>>1]=o;if((o|0)<(k|0)&(q|0)>0){l=0;g=m;while(1){if((c[g>>2]|0)==(k|0))c[g>>2]=o;l=l+1|0;if((l|0)>=(q|0)){k=o;break}else g=g+4|0}}else k=o}k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+x;k=q}else{b[a>>1]=0;k=q}while(0);s=s+1|0;l=r+1|0;n=n+1|0;a=a+2|0;if((s|0)>=(y|0))break;else{r=l;q=k}}}x=x+1|0;if((x|0)>=(z|0)){o=k;B=52;break a}else{l=l+2|0;a=a+4|0;n=n+2|0}}Me(3,3904,A);k=-1}else{o=0;B=52}while(0);if((B|0)==52){n=j+12|0;if((o|0)<1)l=1;else{a=1;l=1;while(1){k=c[m>>2]|0;if((k|0)==(a|0)){k=l;l=l+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[m>>2]=k;if((a|0)<(o|0)){a=a+1|0;m=m+4|0}else break}}g=j+8|0;k=l+-1|0;c[g>>2]=k;if(k){ek(n|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((l|0)>1){k=0;do{B=k<<2;c[j+131084+(B<<2)>>2]=e;c[j+131084+((B|1)<<2)>>2]=0;c[j+131084+((B|2)<<2)>>2]=f;c[j+131084+((B|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[g>>2]|0))}if((o|0)>0){n=0;do{m=(c[j+1179664+(n<<2)>>2]|0)+-1|0;a=n*7|0;k=j+12+(m<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(a<<2)>>2]|0);k=m<<1;l=j+655376+(k<<3)|0;h[l>>3]=+h[l>>3]+ +(c[j+1310736+(a+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(a+2<<2)>>2]|0);m=m<<2;k=j+131084+(m<<2)|0;l=c[j+1310736+(a+3<<2)>>2]|0;if((c[k>>2]|0)>(l|0))c[k>>2]=l;k=j+131084+((m|1)<<2)|0;l=c[j+1310736+(a+4<<2)>>2]|0;if((c[k>>2]|0)<(l|0))c[k>>2]=l;k=j+131084+((m|2)<<2)|0;l=c[j+1310736+(a+5<<2)>>2]|0;if((c[k>>2]|0)>(l|0))c[k>>2]=l;l=j+131084+((m|3)<<2)|0;k=c[j+1310736+(a+6<<2)>>2]|0;if((c[l>>2]|0)<(k|0))c[l>>2]=k;n=n+1|0}while((n|0)<(o|0))}if((c[g>>2]|0)>0){k=0;do{e=j+12+(k<<2)|0;f=k<<1;B=j+655376+(f<<3)|0;h[B>>3]=+h[B>>3]/+(c[e>>2]|0);f=j+655376+((f|1)<<3)|0;h[f>>3]=+h[f>>3]/+(c[e>>2]|0);k=k+1|0}while((k|0)<(c[g>>2]|0));k=0}else k=0}else k=0}i=C;return k|0}function Zc(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;F=i;i=i+16|0;B=F;D=(f|0)/2|0;E=(g|0)/2|0;o=c[k>>2]|0;A=E+-1|0;if((f|0)>1){l=0;m=o;n=o+(($(A,D)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(D|0))break;else{m=m+2|0;n=n+2|0}}}y=j*3|0;z=D+-1|0;if((g|0)>1){l=0;j=o;m=o+(z<<1)|0;while(1){b[m>>1]=0;b[j>>1]=0;l=l+1|0;if((l|0)>=(E|0))break;else{j=j+(D<<1)|0;m=m+(D<<1)|0}}}m=k+1179664|0;j=D+1|0;v=0-D|0;t=1-D|0;u=~D;s=(f*3|0)+12|0;a:do if((A|0)>1){w=(z|0)>1;l=(c[k+4>>2]|0)+j|0;x=1;n=e+((f*6|0)+6)|0;g=o+(j<<1)|0;j=0;b:while(1){if(w){r=1;q=n;p=j;while(1){do if(((d[q+1>>0]|0)+(d[q>>0]|0)+(d[q+2>>0]|0)|0)>(y|0)){b[g>>1]=0;a[l>>0]=0;j=p}else{a[l>>0]=-1;j=b[g+(v<<1)>>1]|0;if(j<<16>>16>0){b[g>>1]=j;j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}e=b[g+(t<<1)>>1]|0;f=e<<16>>16;j=b[g+(u<<1)>>1]|0;o=j<<16>>16;n=j<<16>>16>0;if(e<<16>>16<=0){if(n){b[g>>1]=j;j=o*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+r;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+x;n=k+1310736+(j+-3<<2)|0;if((c[n>>2]|0)<(r|0))c[n>>2]=r;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}j=b[g+-2>>1]|0;if(j<<16>>16>0){b[g>>1]=j;j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;j=k+1310736+(j+-3<<2)|0;if((c[j>>2]|0)>=(r|0)){j=p;break}c[j>>2]=r;j=p;break}else{j=p+1|0;if((p|0)>32767)break b;b[g>>1]=j;c[k+1179664+(p<<2)>>2]=j<<16>>16;p=p*7|0;c[k+1310736+(p<<2)>>2]=1;c[k+1310736+(p+1<<2)>>2]=r;c[k+1310736+(p+2<<2)>>2]=x;c[k+1310736+(p+3<<2)>>2]=r;c[k+1310736+(p+4<<2)>>2]=r;c[k+1310736+(p+5<<2)>>2]=x;c[k+1310736+(p+6<<2)>>2]=x;break}}if(n){j=c[k+1179664+(f+-1<<2)>>2]|0;f=c[k+1179664+(o+-1<<2)>>2]|0;if((j|0)>(f|0)){b[g>>1]=f;if((p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(j|0))c[e>>2]=f;n=n+1|0;if((n|0)>=(p|0)){j=f;break}else e=e+4|0}}else j=f}else{b[g>>1]=j;if((j|0)<(f|0)&(p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(f|0))c[e>>2]=j;n=n+1|0;if((n|0)>=(p|0))break;else e=e+4|0}}}j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}n=b[g+-2>>1]|0;if(n<<16>>16<=0){b[g>>1]=e;j=f*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+r;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+x;n=k+1310736+(j+-4<<2)|0;if((c[n>>2]|0)>(r|0))c[n>>2]=r;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}j=c[k+1179664+(f+-1<<2)>>2]|0;f=c[k+1179664+((n<<16>>16)+-1<<2)>>2]|0;if((j|0)>(f|0)){b[g>>1]=f;if((p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(j|0))c[e>>2]=f;n=n+1|0;if((n|0)>=(p|0)){j=f;break}else e=e+4|0}}else j=f}else{b[g>>1]=j;if((j|0)<(f|0)&(p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(f|0))c[e>>2]=j;n=n+1|0;if((n|0)>=(p|0))break;else e=e+4|0}}}j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;j=k+1310736+(j+-5<<2)|0;c[j>>2]=(c[j>>2]|0)+x;j=p}while(0);r=r+1|0;n=q+6|0;g=g+2|0;l=l+1|0;if((r|0)>=(z|0))break;else{q=n;p=j}}}x=x+1|0;if((x|0)>=(A|0)){f=j;C=52;break a}else{l=l+2|0;n=n+s|0;g=g+4|0}}Me(3,3904,B);l=-1}else{f=0;C=52}while(0);if((C|0)==52){g=k+12|0;if((f|0)<1)j=1;else{n=1;j=1;while(1){l=c[m>>2]|0;if((l|0)==(n|0)){l=j;j=j+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[m>>2]=l;if((n|0)<(f|0)){n=n+1|0;m=m+4|0}else break}}e=k+8|0;l=j+-1|0;c[e>>2]=l;if(l){ek(g|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((j|0)>1){l=0;do{C=l<<2;c[k+131084+(C<<2)>>2]=D;c[k+131084+((C|1)<<2)>>2]=0;c[k+131084+((C|2)<<2)>>2]=E;c[k+131084+((C|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[e>>2]|0))}if((f|0)>0){g=0;do{m=(c[k+1179664+(g<<2)>>2]|0)+-1|0;n=g*7|0;l=k+12+(m<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(n<<2)>>2]|0);l=m<<1;j=k+655376+(l<<3)|0;h[j>>3]=+h[j>>3]+ +(c[k+1310736+(n+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(n+2<<2)>>2]|0);m=m<<2;l=k+131084+(m<<2)|0;j=c[k+1310736+(n+3<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;l=k+131084+((m|1)<<2)|0;j=c[k+1310736+(n+4<<2)>>2]|0;if((c[l>>2]|0)<(j|0))c[l>>2]=j;l=k+131084+((m|2)<<2)|0;j=c[k+1310736+(n+5<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;j=k+131084+((m|3)<<2)|0;l=c[k+1310736+(n+6<<2)>>2]|0;if((c[j>>2]|0)<(l|0))c[j>>2]=l;g=g+1|0}while((g|0)<(f|0))}if((c[e>>2]|0)>0){l=0;do{D=k+12+(l<<2)|0;E=l<<1;C=k+655376+(E<<3)|0;h[C>>3]=+h[C>>3]/+(c[D>>2]|0);E=k+655376+((E|1)<<3)|0;h[E>>3]=+h[E>>3]/+(c[D>>2]|0);l=l+1|0}while((l|0)<(c[e>>2]|0));l=0}else l=0}else l=0}i=F;return l|0}function _c(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;F=i;i=i+16|0;B=F;D=(f|0)/2|0;E=(g|0)/2|0;o=c[k>>2]|0;A=E+-1|0;if((f|0)>1){l=0;m=o;n=o+(($(A,D)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(D|0))break;else{m=m+2|0;n=n+2|0}}}y=j*3|0;z=D+-1|0;if((g|0)>1){l=0;j=o;m=o+(z<<1)|0;while(1){b[m>>1]=0;b[j>>1]=0;l=l+1|0;if((l|0)>=(E|0))break;else{j=j+(D<<1)|0;m=m+(D<<1)|0}}}m=k+1179664|0;j=D+1|0;v=0-D|0;t=1-D|0;u=~D;s=(f<<1)+8|0;a:do if((A|0)>1){w=(z|0)>1;l=(c[k+4>>2]|0)+j|0;x=1;n=e+((f<<2)+4)|0;g=o+(j<<1)|0;j=0;b:while(1){if(w){r=1;q=n;p=j;while(1){f=d[q>>0]|0;o=d[q+1>>0]|0;do if(((f&248)+10+(f<<5&224)+(o>>>3&28)+(o<<3&248)|0)>(y|0)){b[g>>1]=0;a[l>>0]=0;j=p}else{a[l>>0]=-1;j=b[g+(v<<1)>>1]|0;if(j<<16>>16>0){b[g>>1]=j;j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}e=b[g+(t<<1)>>1]|0;f=e<<16>>16;j=b[g+(u<<1)>>1]|0;o=j<<16>>16;n=j<<16>>16>0;if(e<<16>>16<=0){if(n){b[g>>1]=j;j=o*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+r;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+x;n=k+1310736+(j+-3<<2)|0;if((c[n>>2]|0)<(r|0))c[n>>2]=r;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}j=b[g+-2>>1]|0;if(j<<16>>16>0){b[g>>1]=j;j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;j=k+1310736+(j+-3<<2)|0;if((c[j>>2]|0)>=(r|0)){j=p;break}c[j>>2]=r;j=p;break}else{j=p+1|0;if((p|0)>32767)break b;b[g>>1]=j;c[k+1179664+(p<<2)>>2]=j<<16>>16;p=p*7|0;c[k+1310736+(p<<2)>>2]=1;c[k+1310736+(p+1<<2)>>2]=r;c[k+1310736+(p+2<<2)>>2]=x;c[k+1310736+(p+3<<2)>>2]=r;c[k+1310736+(p+4<<2)>>2]=r;c[k+1310736+(p+5<<2)>>2]=x;c[k+1310736+(p+6<<2)>>2]=x;break}}if(n){j=c[k+1179664+(f+-1<<2)>>2]|0;f=c[k+1179664+(o+-1<<2)>>2]|0;if((j|0)>(f|0)){b[g>>1]=f;if((p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(j|0))c[e>>2]=f;n=n+1|0;if((n|0)>=(p|0)){j=f;break}else e=e+4|0}}else j=f}else{b[g>>1]=j;if((j|0)<(f|0)&(p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(f|0))c[e>>2]=j;n=n+1|0;if((n|0)>=(p|0))break;else e=e+4|0}}}j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}n=b[g+-2>>1]|0;if(n<<16>>16<=0){b[g>>1]=e;j=f*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+r;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+x;n=k+1310736+(j+-4<<2)|0;if((c[n>>2]|0)>(r|0))c[n>>2]=r;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}j=c[k+1179664+(f+-1<<2)>>2]|0;f=c[k+1179664+((n<<16>>16)+-1<<2)>>2]|0;if((j|0)>(f|0)){b[g>>1]=f;if((p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(j|0))c[e>>2]=f;n=n+1|0;if((n|0)>=(p|0)){j=f;break}else e=e+4|0}}else j=f}else{b[g>>1]=j;if((j|0)<(f|0)&(p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(f|0))c[e>>2]=j;n=n+1|0;if((n|0)>=(p|0))break;else e=e+4|0}}}j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;j=k+1310736+(j+-5<<2)|0;c[j>>2]=(c[j>>2]|0)+x;j=p}while(0);r=r+1|0;n=q+4|0;g=g+2|0;l=l+1|0;if((r|0)>=(z|0))break;else{q=n;p=j}}}x=x+1|0;if((x|0)>=(A|0)){f=j;C=52;break a}else{l=l+2|0;n=n+s|0;g=g+4|0}}Me(3,3904,B);l=-1}else{f=0;C=52}while(0);if((C|0)==52){g=k+12|0;if((f|0)<1)j=1;else{n=1;j=1;while(1){l=c[m>>2]|0;if((l|0)==(n|0)){l=j;j=j+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[m>>2]=l;if((n|0)<(f|0)){n=n+1|0;m=m+4|0}else break}}e=k+8|0;l=j+-1|0;c[e>>2]=l;if(l){ek(g|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((j|0)>1){l=0;do{C=l<<2;c[k+131084+(C<<2)>>2]=D;c[k+131084+((C|1)<<2)>>2]=0;c[k+131084+((C|2)<<2)>>2]=E;c[k+131084+((C|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[e>>2]|0))}if((f|0)>0){g=0;do{m=(c[k+1179664+(g<<2)>>2]|0)+-1|0;n=g*7|0;l=k+12+(m<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(n<<2)>>2]|0);l=m<<1;j=k+655376+(l<<3)|0;h[j>>3]=+h[j>>3]+ +(c[k+1310736+(n+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(n+2<<2)>>2]|0);m=m<<2;l=k+131084+(m<<2)|0;j=c[k+1310736+(n+3<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;l=k+131084+((m|1)<<2)|0;j=c[k+1310736+(n+4<<2)>>2]|0;if((c[l>>2]|0)<(j|0))c[l>>2]=j;l=k+131084+((m|2)<<2)|0;j=c[k+1310736+(n+5<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;j=k+131084+((m|3)<<2)|0;l=c[k+1310736+(n+6<<2)>>2]|0;if((c[j>>2]|0)<(l|0))c[j>>2]=l;g=g+1|0}while((g|0)<(f|0))}if((c[e>>2]|0)>0){l=0;do{D=k+12+(l<<2)|0;E=l<<1;C=k+655376+(E<<3)|0;h[C>>3]=+h[C>>3]/+(c[D>>2]|0);E=k+655376+((E|1)<<3)|0;h[E>>3]=+h[E>>3]/+(c[D>>2]|0);l=l+1|0}while((l|0)<(c[e>>2]|0));l=0}else l=0}else l=0}i=F;return l|0}function $c(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;F=i;i=i+16|0;B=F;D=(f|0)/2|0;E=(g|0)/2|0;o=c[k>>2]|0;A=E+-1|0;if((f|0)>1){l=0;m=o;n=o+(($(A,D)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(D|0))break;else{m=m+2|0;n=n+2|0}}}y=j*3|0;z=D+-1|0;if((g|0)>1){l=0;j=o;m=o+(z<<1)|0;while(1){b[m>>1]=0;b[j>>1]=0;l=l+1|0;if((l|0)>=(E|0))break;else{j=j+(D<<1)|0;m=m+(D<<1)|0}}}m=k+1179664|0;j=D+1|0;v=0-D|0;t=1-D|0;u=~D;s=(f<<2)+16|0;a:do if((A|0)>1){w=(z|0)>1;l=(c[k+4>>2]|0)+j|0;x=1;n=e+((f<<3)+8)|0;g=o+(j<<1)|0;j=0;b:while(1){if(w){r=1;q=n;p=j;while(1){do if(((d[q+1>>0]|0)+(d[q>>0]|0)+(d[q+2>>0]|0)|0)>(y|0)){b[g>>1]=0;a[l>>0]=0;j=p}else{a[l>>0]=-1;j=b[g+(v<<1)>>1]|0;if(j<<16>>16>0){b[g>>1]=j;j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}e=b[g+(t<<1)>>1]|0;f=e<<16>>16;j=b[g+(u<<1)>>1]|0;o=j<<16>>16;n=j<<16>>16>0;if(e<<16>>16<=0){if(n){b[g>>1]=j;j=o*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+r;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+x;n=k+1310736+(j+-3<<2)|0;if((c[n>>2]|0)<(r|0))c[n>>2]=r;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}j=b[g+-2>>1]|0;if(j<<16>>16>0){b[g>>1]=j;j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;j=k+1310736+(j+-3<<2)|0;if((c[j>>2]|0)>=(r|0)){j=p;break}c[j>>2]=r;j=p;break}else{j=p+1|0;if((p|0)>32767)break b;b[g>>1]=j;c[k+1179664+(p<<2)>>2]=j<<16>>16;p=p*7|0;c[k+1310736+(p<<2)>>2]=1;c[k+1310736+(p+1<<2)>>2]=r;c[k+1310736+(p+2<<2)>>2]=x;c[k+1310736+(p+3<<2)>>2]=r;c[k+1310736+(p+4<<2)>>2]=r;c[k+1310736+(p+5<<2)>>2]=x;c[k+1310736+(p+6<<2)>>2]=x;break}}if(n){j=c[k+1179664+(f+-1<<2)>>2]|0;f=c[k+1179664+(o+-1<<2)>>2]|0;if((j|0)>(f|0)){b[g>>1]=f;if((p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(j|0))c[e>>2]=f;n=n+1|0;if((n|0)>=(p|0)){j=f;break}else e=e+4|0}}else j=f}else{b[g>>1]=j;if((j|0)<(f|0)&(p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(f|0))c[e>>2]=j;n=n+1|0;if((n|0)>=(p|0))break;else e=e+4|0}}}j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}n=b[g+-2>>1]|0;if(n<<16>>16<=0){b[g>>1]=e;j=f*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+r;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+x;n=k+1310736+(j+-4<<2)|0;if((c[n>>2]|0)>(r|0))c[n>>2]=r;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}j=c[k+1179664+(f+-1<<2)>>2]|0;f=c[k+1179664+((n<<16>>16)+-1<<2)>>2]|0;if((j|0)>(f|0)){b[g>>1]=f;if((p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(j|0))c[e>>2]=f;n=n+1|0;if((n|0)>=(p|0)){j=f;break}else e=e+4|0}}else j=f}else{b[g>>1]=j;if((j|0)<(f|0)&(p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(f|0))c[e>>2]=j;n=n+1|0;if((n|0)>=(p|0))break;else e=e+4|0}}}j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;j=k+1310736+(j+-5<<2)|0;c[j>>2]=(c[j>>2]|0)+x;j=p}while(0);r=r+1|0;n=q+8|0;g=g+2|0;l=l+1|0;if((r|0)>=(z|0))break;else{q=n;p=j}}}x=x+1|0;if((x|0)>=(A|0)){f=j;C=52;break a}else{l=l+2|0;n=n+s|0;g=g+4|0}}Me(3,3904,B);l=-1}else{f=0;C=52}while(0);if((C|0)==52){g=k+12|0;if((f|0)<1)j=1;else{n=1;j=1;while(1){l=c[m>>2]|0;if((l|0)==(n|0)){l=j;j=j+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[m>>2]=l;if((n|0)<(f|0)){n=n+1|0;m=m+4|0}else break}}e=k+8|0;l=j+-1|0;c[e>>2]=l;if(l){ek(g|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((j|0)>1){l=0;do{C=l<<2;c[k+131084+(C<<2)>>2]=D;c[k+131084+((C|1)<<2)>>2]=0;c[k+131084+((C|2)<<2)>>2]=E;c[k+131084+((C|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[e>>2]|0))}if((f|0)>0){g=0;do{m=(c[k+1179664+(g<<2)>>2]|0)+-1|0;n=g*7|0;l=k+12+(m<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(n<<2)>>2]|0);l=m<<1;j=k+655376+(l<<3)|0;h[j>>3]=+h[j>>3]+ +(c[k+1310736+(n+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(n+2<<2)>>2]|0);m=m<<2;l=k+131084+(m<<2)|0;j=c[k+1310736+(n+3<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;l=k+131084+((m|1)<<2)|0;j=c[k+1310736+(n+4<<2)>>2]|0;if((c[l>>2]|0)<(j|0))c[l>>2]=j;l=k+131084+((m|2)<<2)|0;j=c[k+1310736+(n+5<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;j=k+131084+((m|3)<<2)|0;l=c[k+1310736+(n+6<<2)>>2]|0;if((c[j>>2]|0)<(l|0))c[j>>2]=l;g=g+1|0}while((g|0)<(f|0))}if((c[e>>2]|0)>0){l=0;do{D=k+12+(l<<2)|0;E=l<<1;C=k+655376+(E<<3)|0;h[C>>3]=+h[C>>3]/+(c[D>>2]|0);E=k+655376+((E|1)<<3)|0;h[E>>3]=+h[E>>3]/+(c[D>>2]|0);l=l+1|0}while((l|0)<(c[e>>2]|0));l=0}else l=0}else l=0}i=F;return l|0}function ad(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;F=i;i=i+16|0;B=F;D=(f|0)/2|0;E=(g|0)/2|0;o=c[k>>2]|0;A=E+-1|0;if((f|0)>1){l=0;m=o;n=o+(($(A,D)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(D|0))break;else{m=m+2|0;n=n+2|0}}}y=j*3|0;z=D+-1|0;if((g|0)>1){l=0;j=o;m=o+(z<<1)|0;while(1){b[m>>1]=0;b[j>>1]=0;l=l+1|0;if((l|0)>=(E|0))break;else{j=j+(D<<1)|0;m=m+(D<<1)|0}}}m=k+1179664|0;j=D+1|0;v=0-D|0;t=1-D|0;u=~D;s=(f<<1)+8|0;a:do if((A|0)>1){w=(z|0)>1;l=(c[k+4>>2]|0)+j|0;x=1;n=e+((f<<2)+4)|0;g=o+(j<<1)|0;j=0;b:while(1){if(w){r=1;q=n;p=j;while(1){o=d[q>>0]|0;do if(((o&240)+24+(o<<4&240)+((d[q+1>>0]|0)&240)|0)>(y|0)){b[g>>1]=0;a[l>>0]=0;j=p}else{a[l>>0]=-1;j=b[g+(v<<1)>>1]|0;if(j<<16>>16>0){b[g>>1]=j;j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}e=b[g+(t<<1)>>1]|0;f=e<<16>>16;j=b[g+(u<<1)>>1]|0;o=j<<16>>16;n=j<<16>>16>0;if(e<<16>>16<=0){if(n){b[g>>1]=j;j=o*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+r;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+x;n=k+1310736+(j+-3<<2)|0;if((c[n>>2]|0)<(r|0))c[n>>2]=r;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}j=b[g+-2>>1]|0;if(j<<16>>16>0){b[g>>1]=j;j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;j=k+1310736+(j+-3<<2)|0;if((c[j>>2]|0)>=(r|0)){j=p;break}c[j>>2]=r;j=p;break}else{j=p+1|0;if((p|0)>32767)break b;b[g>>1]=j;c[k+1179664+(p<<2)>>2]=j<<16>>16;p=p*7|0;c[k+1310736+(p<<2)>>2]=1;c[k+1310736+(p+1<<2)>>2]=r;c[k+1310736+(p+2<<2)>>2]=x;c[k+1310736+(p+3<<2)>>2]=r;c[k+1310736+(p+4<<2)>>2]=r;c[k+1310736+(p+5<<2)>>2]=x;c[k+1310736+(p+6<<2)>>2]=x;break}}if(n){j=c[k+1179664+(f+-1<<2)>>2]|0;f=c[k+1179664+(o+-1<<2)>>2]|0;if((j|0)>(f|0)){b[g>>1]=f;if((p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(j|0))c[e>>2]=f;n=n+1|0;if((n|0)>=(p|0)){j=f;break}else e=e+4|0}}else j=f}else{b[g>>1]=j;if((j|0)<(f|0)&(p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(f|0))c[e>>2]=j;n=n+1|0;if((n|0)>=(p|0))break;else e=e+4|0}}}j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}n=b[g+-2>>1]|0;if(n<<16>>16<=0){b[g>>1]=e;j=f*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+r;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+x;n=k+1310736+(j+-4<<2)|0;if((c[n>>2]|0)>(r|0))c[n>>2]=r;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}j=c[k+1179664+(f+-1<<2)>>2]|0;f=c[k+1179664+((n<<16>>16)+-1<<2)>>2]|0;if((j|0)>(f|0)){b[g>>1]=f;if((p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(j|0))c[e>>2]=f;n=n+1|0;if((n|0)>=(p|0)){j=f;break}else e=e+4|0}}else j=f}else{b[g>>1]=j;if((j|0)<(f|0)&(p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(f|0))c[e>>2]=j;n=n+1|0;if((n|0)>=(p|0))break;else e=e+4|0}}}j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;j=k+1310736+(j+-5<<2)|0;c[j>>2]=(c[j>>2]|0)+x;j=p}while(0);r=r+1|0;n=q+4|0;g=g+2|0;l=l+1|0;if((r|0)>=(z|0))break;else{q=n;p=j}}}x=x+1|0;if((x|0)>=(A|0)){f=j;C=52;break a}else{l=l+2|0;n=n+s|0;g=g+4|0}}Me(3,3904,B);l=-1}else{f=0;C=52}while(0);if((C|0)==52){g=k+12|0;if((f|0)<1)j=1;else{n=1;j=1;while(1){l=c[m>>2]|0;if((l|0)==(n|0)){l=j;j=j+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[m>>2]=l;if((n|0)<(f|0)){n=n+1|0;m=m+4|0}else break}}e=k+8|0;l=j+-1|0;c[e>>2]=l;if(l){ek(g|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((j|0)>1){l=0;do{C=l<<2;c[k+131084+(C<<2)>>2]=D;c[k+131084+((C|1)<<2)>>2]=0;c[k+131084+((C|2)<<2)>>2]=E;c[k+131084+((C|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[e>>2]|0))}if((f|0)>0){g=0;do{m=(c[k+1179664+(g<<2)>>2]|0)+-1|0;n=g*7|0;l=k+12+(m<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(n<<2)>>2]|0);l=m<<1;j=k+655376+(l<<3)|0;h[j>>3]=+h[j>>3]+ +(c[k+1310736+(n+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(n+2<<2)>>2]|0);m=m<<2;l=k+131084+(m<<2)|0;j=c[k+1310736+(n+3<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;l=k+131084+((m|1)<<2)|0;j=c[k+1310736+(n+4<<2)>>2]|0;if((c[l>>2]|0)<(j|0))c[l>>2]=j;l=k+131084+((m|2)<<2)|0;j=c[k+1310736+(n+5<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;j=k+131084+((m|3)<<2)|0;l=c[k+1310736+(n+6<<2)>>2]|0;if((c[j>>2]|0)<(l|0))c[j>>2]=l;g=g+1|0}while((g|0)<(f|0))}if((c[e>>2]|0)>0){l=0;do{D=k+12+(l<<2)|0;E=l<<1;C=k+655376+(E<<3)|0;h[C>>3]=+h[C>>3]/+(c[D>>2]|0);E=k+655376+((E|1)<<3)|0;h[E>>3]=+h[E>>3]/+(c[D>>2]|0);l=l+1|0}while((l|0)<(c[e>>2]|0));l=0}else l=0}else l=0}i=F;return l|0}function bd(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;F=i;i=i+16|0;B=F;D=(f|0)/2|0;E=(g|0)/2|0;o=c[k>>2]|0;A=E+-1|0;if((f|0)>1){l=0;m=o;n=o+(($(A,D)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(D|0))break;else{m=m+2|0;n=n+2|0}}}y=j*3|0;z=D+-1|0;if((g|0)>1){l=0;j=o;m=o+(z<<1)|0;while(1){b[m>>1]=0;b[j>>1]=0;l=l+1|0;if((l|0)>=(E|0))break;else{j=j+(D<<1)|0;m=m+(D<<1)|0}}}m=k+1179664|0;j=D+1|0;v=0-D|0;t=1-D|0;u=~D;s=(f<<1)+8|0;a:do if((A|0)>1){w=(z|0)>1;l=(c[k+4>>2]|0)+j|0;x=1;n=e+((f<<2)+4)|0;g=o+(j<<1)|0;j=0;b:while(1){if(w){r=1;q=n;p=j;while(1){f=d[q>>0]|0;o=d[q+1>>0]|0;do if(((f&248)+12+(f<<5&224)+(o>>>3&24)+(o<<2&248)|0)>(y|0)){b[g>>1]=0;a[l>>0]=0;j=p}else{a[l>>0]=-1;j=b[g+(v<<1)>>1]|0;if(j<<16>>16>0){b[g>>1]=j;j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}e=b[g+(t<<1)>>1]|0;f=e<<16>>16;j=b[g+(u<<1)>>1]|0;o=j<<16>>16;n=j<<16>>16>0;if(e<<16>>16<=0){if(n){b[g>>1]=j;j=o*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+r;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+x;n=k+1310736+(j+-3<<2)|0;if((c[n>>2]|0)<(r|0))c[n>>2]=r;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}j=b[g+-2>>1]|0;if(j<<16>>16>0){b[g>>1]=j;j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;j=k+1310736+(j+-3<<2)|0;if((c[j>>2]|0)>=(r|0)){j=p;break}c[j>>2]=r;j=p;break}else{j=p+1|0;if((p|0)>32767)break b;b[g>>1]=j;c[k+1179664+(p<<2)>>2]=j<<16>>16;p=p*7|0;c[k+1310736+(p<<2)>>2]=1;c[k+1310736+(p+1<<2)>>2]=r;c[k+1310736+(p+2<<2)>>2]=x;c[k+1310736+(p+3<<2)>>2]=r;c[k+1310736+(p+4<<2)>>2]=r;c[k+1310736+(p+5<<2)>>2]=x;c[k+1310736+(p+6<<2)>>2]=x;break}}if(n){j=c[k+1179664+(f+-1<<2)>>2]|0;f=c[k+1179664+(o+-1<<2)>>2]|0;if((j|0)>(f|0)){b[g>>1]=f;if((p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(j|0))c[e>>2]=f;n=n+1|0;if((n|0)>=(p|0)){j=f;break}else e=e+4|0}}else j=f}else{b[g>>1]=j;if((j|0)<(f|0)&(p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(f|0))c[e>>2]=j;n=n+1|0;if((n|0)>=(p|0))break;else e=e+4|0}}}j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}n=b[g+-2>>1]|0;if(n<<16>>16<=0){b[g>>1]=e;j=f*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+r;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+x;n=k+1310736+(j+-4<<2)|0;if((c[n>>2]|0)>(r|0))c[n>>2]=r;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}j=c[k+1179664+(f+-1<<2)>>2]|0;f=c[k+1179664+((n<<16>>16)+-1<<2)>>2]|0;if((j|0)>(f|0)){b[g>>1]=f;if((p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(j|0))c[e>>2]=f;n=n+1|0;if((n|0)>=(p|0)){j=f;break}else e=e+4|0}}else j=f}else{b[g>>1]=j;if((j|0)<(f|0)&(p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(f|0))c[e>>2]=j;n=n+1|0;if((n|0)>=(p|0))break;else e=e+4|0}}}j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;j=k+1310736+(j+-5<<2)|0;c[j>>2]=(c[j>>2]|0)+x;j=p}while(0);r=r+1|0;n=q+4|0;g=g+2|0;l=l+1|0;if((r|0)>=(z|0))break;else{q=n;p=j}}}x=x+1|0;if((x|0)>=(A|0)){f=j;C=52;break a}else{l=l+2|0;n=n+s|0;g=g+4|0}}Me(3,3904,B);l=-1}else{f=0;C=52}while(0);if((C|0)==52){g=k+12|0;if((f|0)<1)j=1;else{n=1;j=1;while(1){l=c[m>>2]|0;if((l|0)==(n|0)){l=j;j=j+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[m>>2]=l;if((n|0)<(f|0)){n=n+1|0;m=m+4|0}else break}}e=k+8|0;l=j+-1|0;c[e>>2]=l;if(l){ek(g|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((j|0)>1){l=0;do{C=l<<2;c[k+131084+(C<<2)>>2]=D;c[k+131084+((C|1)<<2)>>2]=0;c[k+131084+((C|2)<<2)>>2]=E;c[k+131084+((C|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[e>>2]|0))}if((f|0)>0){g=0;do{m=(c[k+1179664+(g<<2)>>2]|0)+-1|0;n=g*7|0;l=k+12+(m<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(n<<2)>>2]|0);l=m<<1;j=k+655376+(l<<3)|0;h[j>>3]=+h[j>>3]+ +(c[k+1310736+(n+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(n+2<<2)>>2]|0);m=m<<2;l=k+131084+(m<<2)|0;j=c[k+1310736+(n+3<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;l=k+131084+((m|1)<<2)|0;j=c[k+1310736+(n+4<<2)>>2]|0;if((c[l>>2]|0)<(j|0))c[l>>2]=j;l=k+131084+((m|2)<<2)|0;j=c[k+1310736+(n+5<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;j=k+131084+((m|3)<<2)|0;l=c[k+1310736+(n+6<<2)>>2]|0;if((c[j>>2]|0)<(l|0))c[j>>2]=l;g=g+1|0}while((g|0)<(f|0))}if((c[e>>2]|0)>0){l=0;do{D=k+12+(l<<2)|0;E=l<<1;C=k+655376+(E<<3)|0;h[C>>3]=+h[C>>3]/+(c[D>>2]|0);E=k+655376+((E|1)<<3)|0;h[E>>3]=+h[E>>3]/+(c[D>>2]|0);l=l+1|0}while((l|0)<(c[e>>2]|0));l=0}else l=0}else l=0}i=F;return l|0}function cd(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;F=i;i=i+16|0;B=F;D=(f|0)/2|0;E=(g|0)/2|0;o=c[k>>2]|0;A=E+-1|0;if((f|0)>1){l=0;m=o;n=o+(($(A,D)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(D|0))break;else{m=m+2|0;n=n+2|0}}}y=j*3|0;z=D+-1|0;if((g|0)>1){l=0;j=o;m=o+(z<<1)|0;while(1){b[m>>1]=0;b[j>>1]=0;l=l+1|0;if((l|0)>=(E|0))break;else{j=j+(D<<1)|0;m=m+(D<<1)|0}}}m=k+1179664|0;j=D+1|0;v=0-D|0;t=1-D|0;u=~D;s=(f<<2)+16|0;a:do if((A|0)>1){w=(z|0)>1;l=(c[k+4>>2]|0)+j|0;x=1;n=e+((f<<3)+8)|0;g=o+(j<<1)|0;j=0;b:while(1){if(w){r=1;q=n;p=j;while(1){do if(((d[q+2>>0]|0)+(d[q+1>>0]|0)+(d[q+3>>0]|0)|0)>(y|0)){b[g>>1]=0;a[l>>0]=0;j=p}else{a[l>>0]=-1;j=b[g+(v<<1)>>1]|0;if(j<<16>>16>0){b[g>>1]=j;j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}e=b[g+(t<<1)>>1]|0;f=e<<16>>16;j=b[g+(u<<1)>>1]|0;o=j<<16>>16;n=j<<16>>16>0;if(e<<16>>16<=0){if(n){b[g>>1]=j;j=o*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+r;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+x;n=k+1310736+(j+-3<<2)|0;if((c[n>>2]|0)<(r|0))c[n>>2]=r;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}j=b[g+-2>>1]|0;if(j<<16>>16>0){b[g>>1]=j;j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;j=k+1310736+(j+-3<<2)|0;if((c[j>>2]|0)>=(r|0)){j=p;break}c[j>>2]=r;j=p;break}else{j=p+1|0;if((p|0)>32767)break b;b[g>>1]=j;c[k+1179664+(p<<2)>>2]=j<<16>>16;p=p*7|0;c[k+1310736+(p<<2)>>2]=1;c[k+1310736+(p+1<<2)>>2]=r;c[k+1310736+(p+2<<2)>>2]=x;c[k+1310736+(p+3<<2)>>2]=r;c[k+1310736+(p+4<<2)>>2]=r;c[k+1310736+(p+5<<2)>>2]=x;c[k+1310736+(p+6<<2)>>2]=x;break}}if(n){j=c[k+1179664+(f+-1<<2)>>2]|0;f=c[k+1179664+(o+-1<<2)>>2]|0;if((j|0)>(f|0)){b[g>>1]=f;if((p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(j|0))c[e>>2]=f;n=n+1|0;if((n|0)>=(p|0)){j=f;break}else e=e+4|0}}else j=f}else{b[g>>1]=j;if((j|0)<(f|0)&(p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(f|0))c[e>>2]=j;n=n+1|0;if((n|0)>=(p|0))break;else e=e+4|0}}}j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}n=b[g+-2>>1]|0;if(n<<16>>16<=0){b[g>>1]=e;j=f*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+r;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+x;n=k+1310736+(j+-4<<2)|0;if((c[n>>2]|0)>(r|0))c[n>>2]=r;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}j=c[k+1179664+(f+-1<<2)>>2]|0;f=c[k+1179664+((n<<16>>16)+-1<<2)>>2]|0;if((j|0)>(f|0)){b[g>>1]=f;if((p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(j|0))c[e>>2]=f;n=n+1|0;if((n|0)>=(p|0)){j=f;break}else e=e+4|0}}else j=f}else{b[g>>1]=j;if((j|0)<(f|0)&(p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(f|0))c[e>>2]=j;n=n+1|0;if((n|0)>=(p|0))break;else e=e+4|0}}}j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;j=k+1310736+(j+-5<<2)|0;c[j>>2]=(c[j>>2]|0)+x;j=p}while(0);r=r+1|0;n=q+8|0;g=g+2|0;l=l+1|0;if((r|0)>=(z|0))break;else{q=n;p=j}}}x=x+1|0;if((x|0)>=(A|0)){f=j;C=52;break a}else{l=l+2|0;n=n+s|0;g=g+4|0}}Me(3,3904,B);l=-1}else{f=0;C=52}while(0);if((C|0)==52){g=k+12|0;if((f|0)<1)j=1;else{n=1;j=1;while(1){l=c[m>>2]|0;if((l|0)==(n|0)){l=j;j=j+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[m>>2]=l;if((n|0)<(f|0)){n=n+1|0;m=m+4|0}else break}}e=k+8|0;l=j+-1|0;c[e>>2]=l;if(l){ek(g|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((j|0)>1){l=0;do{C=l<<2;c[k+131084+(C<<2)>>2]=D;c[k+131084+((C|1)<<2)>>2]=0;c[k+131084+((C|2)<<2)>>2]=E;c[k+131084+((C|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[e>>2]|0))}if((f|0)>0){g=0;do{m=(c[k+1179664+(g<<2)>>2]|0)+-1|0;n=g*7|0;l=k+12+(m<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(n<<2)>>2]|0);l=m<<1;j=k+655376+(l<<3)|0;h[j>>3]=+h[j>>3]+ +(c[k+1310736+(n+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(n+2<<2)>>2]|0);m=m<<2;l=k+131084+(m<<2)|0;j=c[k+1310736+(n+3<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;l=k+131084+((m|1)<<2)|0;j=c[k+1310736+(n+4<<2)>>2]|0;if((c[l>>2]|0)<(j|0))c[l>>2]=j;l=k+131084+((m|2)<<2)|0;j=c[k+1310736+(n+5<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;j=k+131084+((m|3)<<2)|0;l=c[k+1310736+(n+6<<2)>>2]|0;if((c[j>>2]|0)<(l|0))c[j>>2]=l;g=g+1|0}while((g|0)<(f|0))}if((c[e>>2]|0)>0){l=0;do{D=k+12+(l<<2)|0;E=l<<1;C=k+655376+(E<<3)|0;h[C>>3]=+h[C>>3]/+(c[D>>2]|0);E=k+655376+((E|1)<<3)|0;h[E>>3]=+h[E>>3]/+(c[D>>2]|0);l=l+1|0}while((l|0)<(c[e>>2]|0));l=0}else l=0}else l=0}i=F;return l|0} +function sh(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;if((b|0)!=1){if(b+-1&b)b=_j(b)|0}else b=2;f=c[a+4>>2]|0;if(b>>>0<=f>>>0){if(b>>>0<f>>>0){if(f>>>0>2)e=(f+-1&f|0)==0;else e=0;d=~~+_(+(+((c[a+12>>2]|0)>>>0)/+g[a+16>>2]))>>>0;if(e)d=1<<32-(ba(d+-1|0)|0);else d=_j(d)|0;b=b>>>0<d>>>0?d:b;if(b>>>0<f>>>0)th(a,b)}}else th(a,b);return}function th(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;e=a+4|0;a:do if(b){m=Kh(b<<2)|0;d=c[a>>2]|0;c[a>>2]=m;if(d)Lh(d);c[e>>2]=b;if(b){d=0;do{c[(c[a>>2]|0)+(d<<2)>>2]=0;d=d+1|0}while((d|0)!=(b|0))}e=a+8|0;f=c[e>>2]|0;if(f){d=c[f+4>>2]|0;l=b+-1|0;m=(l&b|0)==0;if(m)h=d&l;else h=(d>>>0)%(b>>>0)|0;c[(c[a>>2]|0)+(h<<2)>>2]=e;d=c[f>>2]|0;if(d){g=f;e=f;while(1){k=e;b:while(1){while(1){e=c[d+4>>2]|0;if(m)j=e&l;else j=(e>>>0)%(b>>>0)|0;if((j|0)==(h|0)){e=d;break}e=(c[a>>2]|0)+(j<<2)|0;if(!(c[e>>2]|0)){h=j;f=d;break b}i=d+8|0;e=d;while(1){f=c[e>>2]|0;if(!f)break;if((c[i>>2]|0)==(c[f+8>>2]|0))e=f;else break}c[g>>2]=f;c[e>>2]=c[c[(c[a>>2]|0)+(j<<2)>>2]>>2];c[c[(c[a>>2]|0)+(j<<2)>>2]>>2]=d;d=c[k>>2]|0;if(!d)break a}d=c[e>>2]|0;if(!d)break a;else{g=e;k=e}}c[e>>2]=g;d=c[f>>2]|0;if(!d)break;else{g=f;e=f}}}}}else{d=c[a>>2]|0;c[a>>2]=0;if(d)Lh(d);c[e>>2]=0}while(0);return}function uh(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;g=i;i=i+32|0;h=g+16|0;f=g+4|0;j=g;d=c[d>>2]|0;e=c[d>>2]|0;c[j>>2]=d;c[h>>2]=c[j>>2];vh(f,b,h);d=c[f>>2]|0;c[f>>2]=0;if(d){if(a[f+8>>0]|0)Fg(d+264|0);Lh(d)}i=g;return e|0}function vh(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;o=c[e>>2]|0;l=c[d+4>>2]|0;e=c[o+4>>2]|0;m=l+-1|0;n=(m&l|0)==0;if(n)k=m&e;else k=(e>>>0)%(l>>>0)|0;g=(c[d>>2]|0)+(k<<2)|0;f=c[g>>2]|0;while(1){e=c[f>>2]|0;if((e|0)==(o|0)){j=f;break}else f=e}i=d+8|0;if((j|0)!=(i|0)){e=c[j+4>>2]|0;if(n)e=e&m;else e=(e>>>0)%(l>>>0)|0;if((e|0)==(k|0))g=o;else h=12}else h=12;do if((h|0)==12){e=c[o>>2]|0;if(e){e=c[e+4>>2]|0;if(n)e=e&m;else e=(e>>>0)%(l>>>0)|0;if((e|0)==(k|0)){g=o;break}}c[g>>2]=0;g=o}while(0);f=c[g>>2]|0;e=f;if(f){f=c[f+4>>2]|0;if(n)f=f&m;else f=(f>>>0)%(l>>>0)|0;if((f|0)!=(k|0)){c[(c[d>>2]|0)+(f<<2)>>2]=j;e=c[o>>2]|0}}c[j>>2]=e;c[g>>2]=0;d=d+12|0;c[d>>2]=(c[d>>2]|0)+-1;c[b>>2]=o;c[b+4>>2]=i;a[b+8>>0]=1;return}function wh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=Kh(408)|0;c[e+8>>2]=c[d>>2];ek(e+16|0,0,392)|0;h[e+248>>3]=.0001;h[e+256>>3]=1.0e3;d=e+264|0;c[d>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[a>>2]=e;a=a+4|0;c[a>>2]=b+8;c[a+4>>2]=257;return}function xh(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0.0,k=0.0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;m=c[e+8>>2]|0;s=e+4|0;c[s>>2]=m;r=d+4|0;l=c[r>>2]|0;q=(l|0)==0;a:do if(!q){n=l+-1|0;o=(n&l|0)==0;if(o)h=n&m;else h=(m>>>0)%(l>>>0)|0;f=c[(c[d>>2]|0)+(h<<2)>>2]|0;if(!f)p=12;else while(1){i=c[f>>2]|0;if(!i){p=12;break a}f=c[i+4>>2]|0;if(o)f=f&n;else f=(f>>>0)%(l>>>0)|0;if((f|0)!=(h|0)){p=12;break a}if((c[i+8>>2]|0)==(m|0)){f=0;e=i;break}else f=i}}else{h=0;p=12}while(0);if((p|0)==12){m=d+12|0;j=+(((c[m>>2]|0)+1|0)>>>0);k=+g[d+16>>2];do if(q|j>+(l>>>0)*k){if(l>>>0>2)f=(l+-1&l|0)==0;else f=0;i=(f&1|l<<1)^1;f=~~+_(+(j/k))>>>0;yh(d,i>>>0<f>>>0?f:i);i=c[r>>2]|0;f=c[s>>2]|0;h=i+-1|0;if(!(h&i)){l=i;h=h&f;break}else{l=i;h=(f>>>0)%(i>>>0)|0;break}}while(0);f=c[(c[d>>2]|0)+(h<<2)>>2]|0;if(!f){f=d+8|0;c[e>>2]=c[f>>2];c[f>>2]=e;c[(c[d>>2]|0)+(h<<2)>>2]=f;f=c[e>>2]|0;if(f){f=c[f+4>>2]|0;h=l+-1|0;if(!(h&l))f=f&h;else f=(f>>>0)%(l>>>0)|0;c[(c[d>>2]|0)+(f<<2)>>2]=e}}else{c[e>>2]=c[f>>2];c[f>>2]=e}c[m>>2]=(c[m>>2]|0)+1;f=1}c[b>>2]=e;a[b+4>>0]=f;return}function yh(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;if((b|0)!=1){if(b+-1&b)b=_j(b)|0}else b=2;f=c[a+4>>2]|0;if(b>>>0<=f>>>0){if(b>>>0<f>>>0){if(f>>>0>2)e=(f+-1&f|0)==0;else e=0;d=~~+_(+(+((c[a+12>>2]|0)>>>0)/+g[a+16>>2]))>>>0;if(e)d=1<<32-(ba(d+-1|0)|0);else d=_j(d)|0;b=b>>>0<d>>>0?d:b;if(b>>>0<f>>>0)zh(a,b)}}else zh(a,b);return}function zh(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;e=a+4|0;a:do if(b){m=Kh(b<<2)|0;d=c[a>>2]|0;c[a>>2]=m;if(d)Lh(d);c[e>>2]=b;if(b){d=0;do{c[(c[a>>2]|0)+(d<<2)>>2]=0;d=d+1|0}while((d|0)!=(b|0))}e=a+8|0;f=c[e>>2]|0;if(f){d=c[f+4>>2]|0;l=b+-1|0;m=(l&b|0)==0;if(m)h=d&l;else h=(d>>>0)%(b>>>0)|0;c[(c[a>>2]|0)+(h<<2)>>2]=e;d=c[f>>2]|0;if(d){g=f;e=f;while(1){k=e;b:while(1){while(1){e=c[d+4>>2]|0;if(m)j=e&l;else j=(e>>>0)%(b>>>0)|0;if((j|0)==(h|0)){e=d;break}e=(c[a>>2]|0)+(j<<2)|0;if(!(c[e>>2]|0)){h=j;f=d;break b}i=d+8|0;e=d;while(1){f=c[e>>2]|0;if(!f)break;if((c[i>>2]|0)==(c[f+8>>2]|0))e=f;else break}c[g>>2]=f;c[e>>2]=c[c[(c[a>>2]|0)+(j<<2)>>2]>>2];c[c[(c[a>>2]|0)+(j<<2)>>2]>>2]=d;d=c[k>>2]|0;if(!d)break a}d=c[e>>2]|0;if(!d)break a;else{g=e;k=e}}c[e>>2]=g;d=c[f>>2]|0;if(!d)break;else{g=f;e=f}}}}}else{d=c[a>>2]|0;c[a>>2]=0;if(d)Lh(d);c[e>>2]=0}while(0);return}function Ah(a){a=a|0;return Aj(c[a+4>>2]|0)|0}function Bh(a){a=a|0;Ka(624,10917);Ya(632,10922,1,1,0);Ga(640,10927,1,-128,127);Ga(656,10932,1,-128,127);Ga(648,10944,1,0,255);Ga(664,10958,2,-32768,32767);Ga(672,10964,2,0,65535);Ga(680,10979,4,-2147483648,2147483647);Ga(688,10983,4,0,-1);Ga(696,10996,4,-2147483648,2147483647);Ga(704,11001,4,0,-1);kb(712,11015,4);kb(720,11021,8);sb(360,11028);sb(392,11040);bb(416,4,11073);db(440,11086);Aa(448,0,11102);Dh(11132);Eh(11169);Fh(11208);Gh(11239);Hh(11279);Ih(11308);Aa(456,4,11346);Aa(464,5,11376);Dh(11415);Eh(11447);Fh(11480);Gh(11513);Hh(11547);Ih(11580);Aa(472,6,11614);Aa(480,7,11645);Aa(488,7,11677);return}function Ch(){Bh(0);return}function Dh(a){a=a|0;Aa(536,0,a|0);return}function Eh(a){a=a|0;Aa(528,1,a|0);return}function Fh(a){a=a|0;Aa(520,2,a|0);return}function Gh(a){a=a|0;Aa(512,3,a|0);return}function Hh(a){a=a|0;Aa(504,4,a|0);return}function Ih(a){a=a|0;Aa(496,5,a|0);return}function Jh(a){a=a|0;Ia(12478,12501,303,12589)}function Kh(a){a=a|0;var b=0;b=(a|0)==0?1:a;a=Uj(b)|0;a:do if(!a){while(1){a=Ph()|0;if(!a)break;_b[a&0]();a=Uj(b)|0;if(a)break a}b=Wa(4)|0;c[b>>2]=2224;wb(b|0,544,1)}while(0);return a|0}function Lh(a){a=a|0;Vj(a);return}function Mh(a){a=a|0;return}function Nh(a){a=a|0;Lh(a);return}function Oh(a){a=a|0;return 12610}function Ph(){var a=0;a=c[559]|0;c[559]=a+0;return a|0}function Qh(a){a=a|0;return}function Rh(a){a=a|0;return}function Sh(a){a=a|0;return}function Th(a){a=a|0;return}function Uh(a){a=a|0;return}function Vh(a){a=a|0;Lh(a);return}function Wh(a){a=a|0;Lh(a);return}function Xh(a){a=a|0;Lh(a);return}function Yh(a){a=a|0;Lh(a);return}function Zh(a,b,c){a=a|0;b=b|0;c=c|0;return (a|0)==(b|0)|0}function _h(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;h=i;i=i+64|0;g=h;if((a|0)!=(b|0))if((b|0)!=0?(f=ei(b,576,592,0)|0,(f|0)!=0):0){b=g;e=b+56|0;do{c[b>>2]=0;b=b+4|0}while((b|0)<(e|0));c[g>>2]=f;c[g+8>>2]=a;c[g+12>>2]=-1;c[g+48>>2]=1;dc[c[(c[f>>2]|0)+28>>2]&3](f,g,c[d>>2]|0,1);if((c[g+24>>2]|0)==1){c[d>>2]=c[g+16>>2];b=1}else b=0}else b=0;else b=1;i=h;return b|0}function $h(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0;b=d+16|0;g=c[b>>2]|0;do if(g){if((g|0)!=(e|0)){f=d+36|0;c[f>>2]=(c[f>>2]|0)+1;c[d+24>>2]=2;a[d+54>>0]=1;break}b=d+24|0;if((c[b>>2]|0)==2)c[b>>2]=f}else{c[b>>2]=e;c[d+24>>2]=f;c[d+36>>2]=1}while(0);return}function ai(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;if((a|0)==(c[b+8>>2]|0))$h(0,b,d,e);return}function bi(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;if((a|0)==(c[b+8>>2]|0))$h(0,b,d,e);else{a=c[a+8>>2]|0;dc[c[(c[a>>2]|0)+28>>2]&3](a,b,d,e)}return}function ci(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;g=c[a+4>>2]|0;f=g>>8;if(g&1)f=c[(c[d>>2]|0)+f>>2]|0;a=c[a>>2]|0;dc[c[(c[a>>2]|0)+28>>2]&3](a,b,d+f|0,(g&2|0)!=0?e:2);return}function di(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;a:do if((b|0)!=(c[d+8>>2]|0)){h=c[b+12>>2]|0;g=b+16+(h<<3)|0;ci(b+16|0,d,e,f);if((h|0)>1){h=d+54|0;b=b+24|0;do{ci(b,d,e,f);if(a[h>>0]|0)break a;b=b+8|0}while(b>>>0<g>>>0)}}else $h(0,d,e,f);while(0);return}function ei(d,e,f,g){d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;r=i;i=i+64|0;q=r;p=c[d>>2]|0;o=d+(c[p+-8>>2]|0)|0;p=c[p+-4>>2]|0;c[q>>2]=f;c[q+4>>2]=d;c[q+8>>2]=e;c[q+12>>2]=g;g=q+16|0;d=q+20|0;e=q+24|0;h=q+28|0;j=q+32|0;k=q+40|0;l=(p|0)==(f|0);m=g;n=m+36|0;do{c[m>>2]=0;m=m+4|0}while((m|0)<(n|0));b[g+36>>1]=0;a[g+38>>0]=0;a:do if(l){c[q+48>>2]=1;bc[c[(c[f>>2]|0)+20>>2]&3](f,q,o,o,1,0);g=(c[e>>2]|0)==1?o:0}else{Rb[c[(c[p>>2]|0)+24>>2]&3](p,q,o,1,0);switch(c[q+36>>2]|0){case 0:{g=(c[k>>2]|0)==1&(c[h>>2]|0)==1&(c[j>>2]|0)==1?c[d>>2]|0:0;break a}case 1:break;default:{g=0;break a}}if((c[e>>2]|0)!=1?!((c[k>>2]|0)==0&(c[h>>2]|0)==1&(c[j>>2]|0)==1):0){g=0;break}g=c[g>>2]|0}while(0);i=r;return g|0}function fi(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;a[d+53>>0]=1;do if((c[d+4>>2]|0)==(f|0)){a[d+52>>0]=1;f=d+16|0;b=c[f>>2]|0;if(!b){c[f>>2]=e;c[d+24>>2]=g;c[d+36>>2]=1;if(!((g|0)==1?(c[d+48>>2]|0)==1:0))break;a[d+54>>0]=1;break}if((b|0)!=(e|0)){g=d+36|0;c[g>>2]=(c[g>>2]|0)+1;a[d+54>>0]=1;break}b=d+24|0;f=c[b>>2]|0;if((f|0)==2){c[b>>2]=g;f=g}if((f|0)==1?(c[d+48>>2]|0)==1:0)a[d+54>>0]=1}while(0);return}function gi(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;a:do if((b|0)==(c[d+8>>2]|0)){if((c[d+4>>2]|0)==(e|0)?(h=d+28|0,(c[h>>2]|0)!=1):0)c[h>>2]=f}else{if((b|0)!=(c[d>>2]|0)){q=c[b+12>>2]|0;j=b+16+(q<<3)|0;ii(b+16|0,d,e,f,g);h=b+24|0;if((q|0)<=1)break;i=c[b+8>>2]|0;if((i&2|0)==0?(k=d+36|0,(c[k>>2]|0)!=1):0){if(!(i&1)){i=d+54|0;while(1){if(a[i>>0]|0)break a;if((c[k>>2]|0)==1)break a;ii(h,d,e,f,g);h=h+8|0;if(h>>>0>=j>>>0)break a}}i=d+24|0;b=d+54|0;while(1){if(a[b>>0]|0)break a;if((c[k>>2]|0)==1?(c[i>>2]|0)==1:0)break a;ii(h,d,e,f,g);h=h+8|0;if(h>>>0>=j>>>0)break a}}i=d+54|0;while(1){if(a[i>>0]|0)break a;ii(h,d,e,f,g);h=h+8|0;if(h>>>0>=j>>>0)break a}}if((c[d+16>>2]|0)!=(e|0)?(p=d+20|0,(c[p>>2]|0)!=(e|0)):0){c[d+32>>2]=f;m=d+44|0;if((c[m>>2]|0)==4)break;i=c[b+12>>2]|0;j=b+16+(i<<3)|0;k=d+52|0;f=d+53|0;n=d+54|0;l=b+8|0;o=d+24|0;b:do if((i|0)>0){i=0;h=0;b=b+16|0;while(1){a[k>>0]=0;a[f>>0]=0;hi(b,d,e,e,1,g);if(a[n>>0]|0){q=20;break b}do if(a[f>>0]|0){if(!(a[k>>0]|0))if(!(c[l>>2]&1)){h=1;q=20;break b}else{h=1;break}if((c[o>>2]|0)==1)break b;if(!(c[l>>2]&2))break b;else{i=1;h=1}}while(0);b=b+8|0;if(b>>>0>=j>>>0){q=20;break}}}else{i=0;h=0;q=20}while(0);do if((q|0)==20){if((!i?(c[p>>2]=e,e=d+40|0,c[e>>2]=(c[e>>2]|0)+1,(c[d+36>>2]|0)==1):0)?(c[o>>2]|0)==2:0){a[n>>0]=1;if(h)break}else q=24;if((q|0)==24?h:0)break;c[m>>2]=4;break a}while(0);c[m>>2]=3;break}if((f|0)==1)c[d+32>>2]=1}while(0);return}function hi(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0;i=c[a+4>>2]|0;h=i>>8;if(i&1)h=c[(c[e>>2]|0)+h>>2]|0;a=c[a>>2]|0;bc[c[(c[a>>2]|0)+20>>2]&3](a,b,d,e+h|0,(i&2|0)!=0?f:2,g);return}function ii(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;h=c[a+4>>2]|0;g=h>>8;if(h&1)g=c[(c[d>>2]|0)+g>>2]|0;a=c[a>>2]|0;Rb[c[(c[a>>2]|0)+24>>2]&3](a,b,d+g|0,(h&2|0)!=0?e:2,f);return}function ji(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0;a:do if((b|0)==(c[d+8>>2]|0)){if((c[d+4>>2]|0)==(e|0)?(h=d+28|0,(c[h>>2]|0)!=1):0)c[h>>2]=f}else{if((b|0)!=(c[d>>2]|0)){j=c[b+8>>2]|0;Rb[c[(c[j>>2]|0)+24>>2]&3](j,d,e,f,g);break}if((c[d+16>>2]|0)!=(e|0)?(i=d+20|0,(c[i>>2]|0)!=(e|0)):0){c[d+32>>2]=f;f=d+44|0;if((c[f>>2]|0)==4)break;h=d+52|0;a[h>>0]=0;k=d+53|0;a[k>>0]=0;b=c[b+8>>2]|0;bc[c[(c[b>>2]|0)+20>>2]&3](b,d,e,e,1,g);if(a[k>>0]|0){if(!(a[h>>0]|0)){h=1;j=13}}else{h=0;j=13}do if((j|0)==13){c[i>>2]=e;k=d+40|0;c[k>>2]=(c[k>>2]|0)+1;if((c[d+36>>2]|0)==1?(c[d+24>>2]|0)==2:0){a[d+54>>0]=1;if(h)break}else j=16;if((j|0)==16?h:0)break;c[f>>2]=4;break a}while(0);c[f>>2]=3;break}if((f|0)==1)c[d+32>>2]=1}while(0);return}function ki(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0;do if((b|0)==(c[d+8>>2]|0)){if((c[d+4>>2]|0)==(e|0)?(i=d+28|0,(c[i>>2]|0)!=1):0)c[i>>2]=f}else if((b|0)==(c[d>>2]|0)){if((c[d+16>>2]|0)!=(e|0)?(h=d+20|0,(c[h>>2]|0)!=(e|0)):0){c[d+32>>2]=f;c[h>>2]=e;g=d+40|0;c[g>>2]=(c[g>>2]|0)+1;if((c[d+36>>2]|0)==1?(c[d+24>>2]|0)==2:0)a[d+54>>0]=1;c[d+44>>2]=4;break}if((f|0)==1)c[d+32>>2]=1}while(0);return}function li(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;if((b|0)==(c[d+8>>2]|0))fi(0,d,e,f,g);else{m=d+52|0;n=a[m>>0]|0;o=d+53|0;p=a[o>>0]|0;l=c[b+12>>2]|0;i=b+16+(l<<3)|0;a[m>>0]=0;a[o>>0]=0;hi(b+16|0,d,e,f,g,h);a:do if((l|0)>1){j=d+24|0;k=b+8|0;l=d+54|0;b=b+24|0;do{if(a[l>>0]|0)break a;if(!(a[m>>0]|0)){if((a[o>>0]|0)!=0?(c[k>>2]&1|0)==0:0)break a}else{if((c[j>>2]|0)==1)break a;if(!(c[k>>2]&2))break a}a[m>>0]=0;a[o>>0]=0;hi(b,d,e,f,g,h);b=b+8|0}while(b>>>0<i>>>0)}while(0);a[m>>0]=n;a[o>>0]=p}return}function mi(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;if((a|0)==(c[b+8>>2]|0))fi(0,b,d,e,f);else{a=c[a+8>>2]|0;bc[c[(c[a>>2]|0)+20>>2]&3](a,b,d,e,f,g)}return}function ni(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;if((a|0)==(c[b+8>>2]|0))fi(0,b,d,e,f);return}function oi(a){a=a|0;Ia(12625,12654,1164,12589)}function pi(a){a=a|0;return ((a|0)==32|(a+-9|0)>>>0<5)&1|0}function qi(){var a=0;if(!(c[597]|0))a=2644;else a=c[(gb()|0)+60>>2]|0;return a|0}function ri(b){b=b|0;var c=0,e=0;c=0;while(1){if((d[12742+c>>0]|0)==(b|0)){e=2;break}c=c+1|0;if((c|0)==87){c=87;b=12830;e=5;break}}if((e|0)==2)if(!c)b=12830;else{b=12830;e=5}if((e|0)==5)while(1){e=b;while(1){b=e+1|0;if(!(a[e>>0]|0))break;else e=b}c=c+-1|0;if(!c)break;else e=5}return b|0}function si(b,e,f){b=b|0;e=e|0;f=f|0;var g=0.0,h=0,j=0.0,k=0,l=0,m=0.0,n=0,o=0,p=0,q=0.0,r=0.0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0.0;L=i;i=i+512|0;H=L;switch(e|0){case 0:{K=24;J=-149;A=4;break}case 1:{K=53;J=-1074;A=4;break}case 2:{K=53;J=-1074;A=4;break}default:g=0.0}a:do if((A|0)==4){E=b+4|0;C=b+100|0;do{e=c[E>>2]|0;if(e>>>0<(c[C>>2]|0)>>>0){c[E>>2]=e+1;e=d[e>>0]|0}else e=vi(b)|0}while((pi(e)|0)!=0);b:do switch(e|0){case 43:case 45:{h=1-(((e|0)==45&1)<<1)|0;e=c[E>>2]|0;if(e>>>0<(c[C>>2]|0)>>>0){c[E>>2]=e+1;e=d[e>>0]|0;I=h;break b}else{e=vi(b)|0;I=h;break b}}default:I=1}while(0);h=e;e=0;do{if((h|32|0)!=(a[14634+e>>0]|0))break;do if(e>>>0<7){h=c[E>>2]|0;if(h>>>0<(c[C>>2]|0)>>>0){c[E>>2]=h+1;h=d[h>>0]|0;break}else{h=vi(b)|0;break}}while(0);e=e+1|0}while(e>>>0<8);c:do switch(e|0){case 8:break;case 3:{A=23;break}default:{k=(f|0)!=0;if(k&e>>>0>3)if((e|0)==8)break c;else{A=23;break c}d:do if(!e){e=0;do{if((h|32|0)!=(a[16477+e>>0]|0))break d;do if(e>>>0<2){h=c[E>>2]|0;if(h>>>0<(c[C>>2]|0)>>>0){c[E>>2]=h+1;h=d[h>>0]|0;break}else{h=vi(b)|0;break}}while(0);e=e+1|0}while(e>>>0<3)}while(0);switch(e|0){case 3:{e=c[E>>2]|0;if(e>>>0<(c[C>>2]|0)>>>0){c[E>>2]=e+1;e=d[e>>0]|0}else e=vi(b)|0;if((e|0)==40)e=1;else{if(!(c[C>>2]|0)){g=s;break a}c[E>>2]=(c[E>>2]|0)+-1;g=s;break a}while(1){h=c[E>>2]|0;if(h>>>0<(c[C>>2]|0)>>>0){c[E>>2]=h+1;h=d[h>>0]|0}else h=vi(b)|0;if(!((h+-48|0)>>>0<10|(h+-65|0)>>>0<26)?!((h|0)==95|(h+-97|0)>>>0<26):0)break;e=e+1|0}if((h|0)==41){g=s;break a}h=(c[C>>2]|0)==0;if(!h)c[E>>2]=(c[E>>2]|0)+-1;if(!k){c[(qi()|0)>>2]=22;ui(b,0);g=0.0;break a}if(!e){g=s;break a}while(1){e=e+-1|0;if(!h)c[E>>2]=(c[E>>2]|0)+-1;if(!e){g=s;break a}}}case 0:{do if((h|0)==48){e=c[E>>2]|0;if(e>>>0<(c[C>>2]|0)>>>0){c[E>>2]=e+1;e=d[e>>0]|0}else e=vi(b)|0;if((e|32|0)!=120){if(!(c[C>>2]|0)){e=48;break}c[E>>2]=(c[E>>2]|0)+-1;e=48;break}e=c[E>>2]|0;if(e>>>0<(c[C>>2]|0)>>>0){c[E>>2]=e+1;e=d[e>>0]|0;k=0}else{e=vi(b)|0;k=0}e:while(1){switch(e|0){case 46:{A=74;break e}case 48:break;default:{y=0;l=0;x=0;h=0;n=k;o=0;w=0;m=1.0;k=0;g=0.0;break e}}e=c[E>>2]|0;if(e>>>0<(c[C>>2]|0)>>>0){c[E>>2]=e+1;e=d[e>>0]|0;k=1;continue}else{e=vi(b)|0;k=1;continue}}if((A|0)==74){e=c[E>>2]|0;if(e>>>0<(c[C>>2]|0)>>>0){c[E>>2]=e+1;e=d[e>>0]|0}else e=vi(b)|0;if((e|0)==48){k=0;h=0;do{e=c[E>>2]|0;if(e>>>0<(c[C>>2]|0)>>>0){c[E>>2]=e+1;e=d[e>>0]|0}else e=vi(b)|0;k=gk(k|0,h|0,-1,-1)|0;h=D}while((e|0)==48);y=0;l=0;x=k;n=1;o=1;w=0;m=1.0;k=0;g=0.0}else{y=0;l=0;x=0;h=0;n=k;o=1;w=0;m=1.0;k=0;g=0.0}}while(1){u=e+-48|0;p=e|32;if(u>>>0>=10){v=(e|0)==46;if(!(v|(p+-97|0)>>>0<6)){p=x;u=y;break}if(v)if(!o){v=l;h=y;u=y;o=1;p=w;j=m}else{p=x;u=y;e=46;break}else A=86}else A=86;if((A|0)==86){A=0;e=(e|0)>57?p+-87|0:u;do if(!((y|0)<0|(y|0)==0&l>>>0<8)){if((y|0)<0|(y|0)==0&l>>>0<14){r=m*.0625;p=w;j=r;g=g+r*+(e|0);break}if((w|0)!=0|(e|0)==0){p=w;j=m}else{p=1;j=m;g=g+m*.5}}else{p=w;j=m;k=e+(k<<4)|0}while(0);l=gk(l|0,y|0,1,0)|0;v=x;u=D;n=1}e=c[E>>2]|0;if(e>>>0<(c[C>>2]|0)>>>0){c[E>>2]=e+1;y=u;x=v;e=d[e>>0]|0;w=p;m=j;continue}else{y=u;x=v;e=vi(b)|0;w=p;m=j;continue}}if(!n){e=(c[C>>2]|0)==0;if(!e)c[E>>2]=(c[E>>2]|0)+-1;if(f){if(!e?(z=c[E>>2]|0,c[E>>2]=z+-1,(o|0)!=0):0)c[E>>2]=z+-2}else ui(b,0);g=+(I|0)*0.0;break a}n=(o|0)==0;o=n?l:p;n=n?u:h;if((u|0)<0|(u|0)==0&l>>>0<8){h=u;do{k=k<<4;l=gk(l|0,h|0,1,0)|0;h=D}while((h|0)<0|(h|0)==0&l>>>0<8)}if((e|32|0)==112){h=Hj(b,f)|0;e=D;if((h|0)==0&(e|0)==-2147483648){if(!f){ui(b,0);g=0.0;break a}if(!(c[C>>2]|0)){h=0;e=0}else{c[E>>2]=(c[E>>2]|0)+-1;h=0;e=0}}}else if(!(c[C>>2]|0)){h=0;e=0}else{c[E>>2]=(c[E>>2]|0)+-1;h=0;e=0}H=fk(o|0,n|0,2)|0;H=gk(H|0,D|0,-32,-1)|0;e=gk(H|0,D|0,h|0,e|0)|0;h=D;if(!k){g=+(I|0)*0.0;break a}if((h|0)>0|(h|0)==0&e>>>0>(0-J|0)>>>0){c[(qi()|0)>>2]=34;g=+(I|0)*1797693134862315708145274.0e284*1797693134862315708145274.0e284;break a}H=J+-106|0;G=((H|0)<0)<<31>>31;if((h|0)<(G|0)|(h|0)==(G|0)&e>>>0<H>>>0){c[(qi()|0)>>2]=34;g=+(I|0)*2.2250738585072014e-308*2.2250738585072014e-308;break a}if((k|0)>-1){do{G=!(g>=.5);H=G&1|k<<1;k=H^1;g=g+(G?g:g+-1.0);e=gk(e|0,h|0,-1,-1)|0;h=D}while((H|0)>-1);l=e;m=g}else{l=e;m=g}e=dk(32,0,J|0,((J|0)<0)<<31>>31|0)|0;e=gk(l|0,h|0,e|0,D|0)|0;J=D;if(0>(J|0)|0==(J|0)&K>>>0>e>>>0)if((e|0)<0){e=0;A=127}else A=125;else{e=K;A=125}if((A|0)==125)if((e|0)<53)A=127;else{h=e;j=+(I|0);g=0.0}if((A|0)==127){g=+(I|0);h=e;j=g;g=+yi(+Di(1.0,84-e|0),g)}K=(k&1|0)==0&(m!=0.0&(h|0)<32);g=j*(K?0.0:m)+(g+j*+(((K&1)+k|0)>>>0))-g;if(!(g!=0.0))c[(qi()|0)>>2]=34;g=+Ei(g,l);break a}else e=h;while(0);F=J+K|0;G=0-F|0;k=0;f:while(1){switch(e|0){case 46:{A=138;break f}case 48:break;default:{h=0;p=0;o=0;break f}}e=c[E>>2]|0;if(e>>>0<(c[C>>2]|0)>>>0){c[E>>2]=e+1;e=d[e>>0]|0;k=1;continue}else{e=vi(b)|0;k=1;continue}}if((A|0)==138){e=c[E>>2]|0;if(e>>>0<(c[C>>2]|0)>>>0){c[E>>2]=e+1;e=d[e>>0]|0}else e=vi(b)|0;if((e|0)==48){h=0;e=0;while(1){h=gk(h|0,e|0,-1,-1)|0;k=D;e=c[E>>2]|0;if(e>>>0<(c[C>>2]|0)>>>0){c[E>>2]=e+1;e=d[e>>0]|0}else e=vi(b)|0;if((e|0)==48)e=k;else{p=k;k=1;o=1;break}}}else{h=0;p=0;o=1}}c[H>>2]=0;n=e+-48|0;l=(e|0)==46;g:do if(l|n>>>0<10){B=H+496|0;y=0;v=0;w=l;A=p;u=k;z=o;k=0;l=0;o=0;h:while(1){do if(w)if(!z){h=y;p=v;z=1}else{p=A;e=y;n=v;break h}else{w=gk(y|0,v|0,1,0)|0;v=D;x=(e|0)!=48;if((l|0)>=125){if(!x){p=A;y=w;break}c[B>>2]=c[B>>2]|1;p=A;y=w;break}p=H+(l<<2)|0;if(k)n=e+-48+((c[p>>2]|0)*10|0)|0;c[p>>2]=n;k=k+1|0;n=(k|0)==9;p=A;y=w;u=1;k=n?0:k;l=(n&1)+l|0;o=x?w:o}while(0);e=c[E>>2]|0;if(e>>>0<(c[C>>2]|0)>>>0){c[E>>2]=e+1;e=d[e>>0]|0}else e=vi(b)|0;n=e+-48|0;w=(e|0)==46;if(!(w|n>>>0<10)){n=z;A=161;break g}else A=p}u=(u|0)!=0;A=169}else{y=0;v=0;u=k;n=o;k=0;l=0;o=0;A=161}while(0);do if((A|0)==161){B=(n|0)==0;h=B?y:h;p=B?v:p;u=(u|0)!=0;if(!((e|32|0)==101&u))if((e|0)>-1){e=y;n=v;A=169;break}else{e=y;n=v;A=171;break}n=Hj(b,f)|0;e=D;if((n|0)==0&(e|0)==-2147483648){if(!f){ui(b,0);g=0.0;break}if(!(c[C>>2]|0)){n=0;e=0}else{c[E>>2]=(c[E>>2]|0)+-1;n=0;e=0}}h=gk(n|0,e|0,h|0,p|0)|0;u=y;p=D;n=v;A=173}while(0);if((A|0)==169)if(c[C>>2]|0){c[E>>2]=(c[E>>2]|0)+-1;if(u){u=e;A=173}else A=172}else A=171;if((A|0)==171)if(u){u=e;A=173}else A=172;do if((A|0)==172){c[(qi()|0)>>2]=22;ui(b,0);g=0.0}else if((A|0)==173){e=c[H>>2]|0;if(!e){g=+(I|0)*0.0;break}if(((n|0)<0|(n|0)==0&u>>>0<10)&((h|0)==(u|0)&(p|0)==(n|0))?K>>>0>30|(e>>>K|0)==0:0){g=+(I|0)*+(e>>>0);break}b=(J|0)/-2|0;E=((b|0)<0)<<31>>31;if((p|0)>(E|0)|(p|0)==(E|0)&h>>>0>b>>>0){c[(qi()|0)>>2]=34;g=+(I|0)*1797693134862315708145274.0e284*1797693134862315708145274.0e284;break}b=J+-106|0;E=((b|0)<0)<<31>>31;if((p|0)<(E|0)|(p|0)==(E|0)&h>>>0<b>>>0){c[(qi()|0)>>2]=34;g=+(I|0)*2.2250738585072014e-308*2.2250738585072014e-308;break}if(k){if((k|0)<9){n=H+(l<<2)|0;e=c[n>>2]|0;do{e=e*10|0;k=k+1|0}while((k|0)!=9);c[n>>2]=e}l=l+1|0}if((o|0)<9?(o|0)<=(h|0)&(h|0)<18:0){if((h|0)==9){g=+(I|0)*+((c[H>>2]|0)>>>0);break}if((h|0)<9){g=+(I|0)*+((c[H>>2]|0)>>>0)/+(c[2648+(8-h<<2)>>2]|0);break}b=K+27+($(h,-3)|0)|0;e=c[H>>2]|0;if((b|0)>30|(e>>>b|0)==0){g=+(I|0)*+(e>>>0)*+(c[2648+(h+-10<<2)>>2]|0);break}}e=(h|0)%9|0;if(!e){k=0;e=0}else{u=(h|0)>-1?e:e+9|0;n=c[2648+(8-u<<2)>>2]|0;if(l){o=1e9/(n|0)|0;k=0;e=0;p=0;do{C=H+(p<<2)|0;E=c[C>>2]|0;b=((E>>>0)/(n>>>0)|0)+e|0;c[C>>2]=b;e=$((E>>>0)%(n>>>0)|0,o)|0;b=(p|0)==(k|0)&(b|0)==0;p=p+1|0;h=b?h+-9|0:h;k=b?p&127:k}while((p|0)!=(l|0));if(e){c[H+(l<<2)>>2]=e;l=l+1|0}}else{k=0;l=0}e=0;h=9-u+h|0}i:while(1){v=(h|0)<18;w=(h|0)==18;x=H+(k<<2)|0;do{if(!v){if(!w)break i;if((c[x>>2]|0)>>>0>=9007199){h=18;break i}}n=0;o=l+127|0;while(1){u=o&127;p=H+(u<<2)|0;o=fk(c[p>>2]|0,0,29)|0;o=gk(o|0,D|0,n|0,0)|0;n=D;if(n>>>0>0|(n|0)==0&o>>>0>1e9){b=pk(o|0,n|0,1e9,0)|0;o=qk(o|0,n|0,1e9,0)|0;n=b}else n=0;c[p>>2]=o;b=(u|0)==(k|0);l=(u|0)!=(l+127&127|0)|b?l:(o|0)==0?u:l;if(b)break;else o=u+-1|0}e=e+-29|0}while((n|0)==0);k=k+127&127;if((k|0)==(l|0)){b=l+127&127;l=H+((l+126&127)<<2)|0;c[l>>2]=c[l>>2]|c[H+(b<<2)>>2];l=b}c[H+(k<<2)>>2]=n;h=h+9|0}j:while(1){y=l+1&127;x=H+((l+127&127)<<2)|0;while(1){v=(h|0)==18;w=(h|0)>27?9:1;u=v^1;while(1){o=k&127;p=(o|0)==(l|0);do if(!p){n=c[H+(o<<2)>>2]|0;if(n>>>0<9007199){A=219;break}if(n>>>0>9007199)break;n=k+1&127;if((n|0)==(l|0)){A=219;break}n=c[H+(n<<2)>>2]|0;if(n>>>0<254740991){A=219;break}if(!(n>>>0>254740991|u)){h=o;break j}}else A=219;while(0);if((A|0)==219?(A=0,v):0){A=220;break j}e=e+w|0;if((k|0)==(l|0))k=l;else break}u=(1<<w)+-1|0;v=1e9>>>w;o=k;n=0;p=k;while(1){E=H+(p<<2)|0;b=c[E>>2]|0;k=(b>>>w)+n|0;c[E>>2]=k;n=$(b&u,v)|0;k=(p|0)==(o|0)&(k|0)==0;p=p+1&127;h=k?h+-9|0:h;k=k?p:o;if((p|0)==(l|0))break;else o=k}if(!n)continue;if((y|0)!=(k|0))break;c[x>>2]=c[x>>2]|1}c[H+(l<<2)>>2]=n;l=y}if((A|0)==220)if(p){c[H+(y+-1<<2)>>2]=0;h=l;l=y}else h=o;g=+((c[H+(h<<2)>>2]|0)>>>0);h=k+1&127;if((h|0)==(l|0)){l=k+2&127;c[H+(l+-1<<2)>>2]=0}r=+(I|0);j=r*(g*1.0e9+ +((c[H+(h<<2)>>2]|0)>>>0));v=e+53|0;p=v-J|0;u=(p|0)<(K|0);h=u&1;o=u?((p|0)<0?0:p):K;if((o|0)<53){M=+yi(+Di(1.0,105-o|0),j);m=+Ai(j,+Di(1.0,53-o|0));q=M;g=m;m=M+(j-m)}else{q=0.0;g=0.0;m=j}n=k+2&127;do if((n|0)==(l|0))j=g;else{n=c[H+(n<<2)>>2]|0;do if(n>>>0>=5e8){if(n>>>0>5e8){g=r*.75+g;break}if((k+3&127|0)==(l|0)){g=r*.5+g;break}else{g=r*.75+g;break}}else{if((n|0)==0?(k+3&127|0)==(l|0):0)break;g=r*.25+g}while(0);if((53-o|0)<=1){j=g;break}if(+Ai(g,1.0)!=0.0){j=g;break}j=g+1.0}while(0);g=m+j-q;do if((v&2147483647|0)>(-2-F|0)){if(+O(+g)>=9007199254740992.0){h=u&(o|0)==(p|0)?0:h;e=e+1|0;g=g*.5}if((e+50|0)<=(G|0)?!(j!=0.0&(h|0)!=0):0)break;c[(qi()|0)>>2]=34}while(0);g=+Ei(g,e)}while(0);break a}default:{if(c[C>>2]|0)c[E>>2]=(c[E>>2]|0)+-1;c[(qi()|0)>>2]=22;ui(b,0);g=0.0;break a}}}}while(0);if((A|0)==23){h=(c[C>>2]|0)==0;if(!h)c[E>>2]=(c[E>>2]|0)+-1;if((f|0)!=0&e>>>0>3)do{if(!h)c[E>>2]=(c[E>>2]|0)+-1;e=e+-1|0}while(e>>>0>3)}g=+(I|0)*t}while(0);i=L;return +g}function ti(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;a:do if(e>>>0>36){c[(qi()|0)>>2]=22;h=0;g=0}else{r=b+4|0;q=b+100|0;do{i=c[r>>2]|0;if(i>>>0<(c[q>>2]|0)>>>0){c[r>>2]=i+1;i=d[i>>0]|0}else i=vi(b)|0}while((pi(i)|0)!=0);b:do switch(i|0){case 43:case 45:{j=((i|0)==45)<<31>>31;i=c[r>>2]|0;if(i>>>0<(c[q>>2]|0)>>>0){c[r>>2]=i+1;i=d[i>>0]|0;p=j;break b}else{i=vi(b)|0;p=j;break b}}default:p=0}while(0);j=(e|0)==0;do if((e&-17|0)==0&(i|0)==48){i=c[r>>2]|0;if(i>>>0<(c[q>>2]|0)>>>0){c[r>>2]=i+1;i=d[i>>0]|0}else i=vi(b)|0;if((i|32|0)!=120)if(j){e=8;n=46;break}else{n=32;break}e=c[r>>2]|0;if(e>>>0<(c[q>>2]|0)>>>0){c[r>>2]=e+1;i=d[e>>0]|0}else i=vi(b)|0;if((d[14643+(i+1)>>0]|0)>15){g=(c[q>>2]|0)==0;if(!g)c[r>>2]=(c[r>>2]|0)+-1;if(!f){ui(b,0);h=0;g=0;break a}if(g){h=0;g=0;break a}c[r>>2]=(c[r>>2]|0)+-1;h=0;g=0;break a}else{e=16;n=46}}else{e=j?10:e;if((d[14643+(i+1)>>0]|0)>>>0<e>>>0)n=32;else{if(c[q>>2]|0)c[r>>2]=(c[r>>2]|0)+-1;ui(b,0);c[(qi()|0)>>2]=22;h=0;g=0;break a}}while(0);if((n|0)==32)if((e|0)==10){e=i+-48|0;if(e>>>0<10){i=0;while(1){j=(i*10|0)+e|0;e=c[r>>2]|0;if(e>>>0<(c[q>>2]|0)>>>0){c[r>>2]=e+1;i=d[e>>0]|0}else i=vi(b)|0;e=i+-48|0;if(!(e>>>0<10&j>>>0<429496729)){e=j;break}else i=j}j=0}else{e=0;j=0}f=i+-48|0;if(f>>>0<10){while(1){k=ok(e|0,j|0,10,0)|0;l=D;m=((f|0)<0)<<31>>31;o=~m;if(l>>>0>o>>>0|(l|0)==(o|0)&k>>>0>~f>>>0){k=e;break}e=gk(k|0,l|0,f|0,m|0)|0;j=D;i=c[r>>2]|0;if(i>>>0<(c[q>>2]|0)>>>0){c[r>>2]=i+1;i=d[i>>0]|0}else i=vi(b)|0;f=i+-48|0;if(!(f>>>0<10&(j>>>0<429496729|(j|0)==429496729&e>>>0<2576980378))){k=e;break}}if(f>>>0>9){i=k;e=p}else{e=10;n=72}}else{i=e;e=p}}else n=46;c:do if((n|0)==46){if(!(e+-1&e)){n=a[14900+((e*23|0)>>>5&7)>>0]|0;j=a[14643+(i+1)>>0]|0;f=j&255;if(f>>>0<e>>>0){i=0;while(1){k=f|i<<n;i=c[r>>2]|0;if(i>>>0<(c[q>>2]|0)>>>0){c[r>>2]=i+1;i=d[i>>0]|0}else i=vi(b)|0;j=a[14643+(i+1)>>0]|0;f=j&255;if(!(k>>>0<134217728&f>>>0<e>>>0))break;else i=k}f=0}else{f=0;k=0}l=hk(-1,-1,n|0)|0;m=D;if((j&255)>>>0>=e>>>0|(f>>>0>m>>>0|(f|0)==(m|0)&k>>>0>l>>>0)){j=f;n=72;break}else i=f;while(1){k=fk(k|0,i|0,n|0)|0;f=D;k=j&255|k;i=c[r>>2]|0;if(i>>>0<(c[q>>2]|0)>>>0){c[r>>2]=i+1;i=d[i>>0]|0}else i=vi(b)|0;j=a[14643+(i+1)>>0]|0;if((j&255)>>>0>=e>>>0|(f>>>0>m>>>0|(f|0)==(m|0)&k>>>0>l>>>0)){j=f;n=72;break c}else i=f}}j=a[14643+(i+1)>>0]|0;f=j&255;if(f>>>0<e>>>0){i=0;while(1){k=f+($(i,e)|0)|0;i=c[r>>2]|0;if(i>>>0<(c[q>>2]|0)>>>0){c[r>>2]=i+1;i=d[i>>0]|0}else i=vi(b)|0;j=a[14643+(i+1)>>0]|0;f=j&255;if(!(k>>>0<119304647&f>>>0<e>>>0))break;else i=k}f=0}else{k=0;f=0}if((j&255)>>>0<e>>>0){n=pk(-1,-1,e|0,0)|0;o=D;m=f;while(1){if(m>>>0>o>>>0|(m|0)==(o|0)&k>>>0>n>>>0){j=m;n=72;break c}f=ok(k|0,m|0,e|0,0)|0;l=D;j=j&255;if(l>>>0>4294967295|(l|0)==-1&f>>>0>~j>>>0){j=m;n=72;break c}k=gk(j|0,0,f|0,l|0)|0;f=D;i=c[r>>2]|0;if(i>>>0<(c[q>>2]|0)>>>0){c[r>>2]=i+1;i=d[i>>0]|0}else i=vi(b)|0;j=a[14643+(i+1)>>0]|0;if((j&255)>>>0>=e>>>0){j=f;n=72;break}else m=f}}else{j=f;n=72}}while(0);if((n|0)==72)if((d[14643+(i+1)>>0]|0)>>>0<e>>>0){do{i=c[r>>2]|0;if(i>>>0<(c[q>>2]|0)>>>0){c[r>>2]=i+1;i=d[i>>0]|0}else i=vi(b)|0}while((d[14643+(i+1)>>0]|0)>>>0<e>>>0);c[(qi()|0)>>2]=34;j=h;i=g;e=(g&1|0)==0&0==0?p:0}else{i=k;e=p}if(c[q>>2]|0)c[r>>2]=(c[r>>2]|0)+-1;if(!(j>>>0<h>>>0|(j|0)==(h|0)&i>>>0<g>>>0)){if(!((g&1|0)!=0|0!=0|(e|0)!=0)){c[(qi()|0)>>2]=34;g=gk(g|0,h|0,-1,-1)|0;h=D;break}if(j>>>0>h>>>0|(j|0)==(h|0)&i>>>0>g>>>0){c[(qi()|0)>>2]=34;break}}g=((e|0)<0)<<31>>31;g=dk(i^e|0,j^g|0,e|0,g|0)|0;h=D}while(0);D=h;return g|0}function ui(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;c[a+104>>2]=b;d=c[a+4>>2]|0;e=c[a+8>>2]|0;f=e-d|0;c[a+108>>2]=f;if((b|0)!=0&(f|0)>(b|0))c[a+100>>2]=d+b;else c[a+100>>2]=e;return}function vi(b){b=b|0;var e=0,f=0,g=0,h=0,i=0,j=0;f=b+104|0;i=c[f>>2]|0;if((i|0)!=0?(c[b+108>>2]|0)>=(i|0):0)j=4;else{e=Vi(b)|0;if((e|0)>=0){h=c[f>>2]|0;f=b+8|0;if(h){g=c[f>>2]|0;i=c[b+4>>2]|0;f=g;h=h-(c[b+108>>2]|0)+-1|0;if((f-i|0)>(h|0))c[b+100>>2]=i+h;else j=9}else{g=c[f>>2]|0;f=g;j=9}if((j|0)==9)c[b+100>>2]=f;f=c[b+4>>2]|0;if(g){b=b+108|0;c[b>>2]=g+1-f+(c[b>>2]|0)}f=f+-1|0;if((d[f>>0]|0|0)!=(e|0))a[f>>0]=e}else j=4}if((j|0)==4){c[b+100>>2]=0;e=-1}return e|0}function wi(a){a=a|0;if(a>>>0>4294963200){c[(qi()|0)>>2]=0-a;a=-1}return a|0}function xi(a,b){a=+a;b=+b;var d=0,e=0;h[k>>3]=a;e=c[k>>2]|0;d=c[k+4>>2]|0;h[k>>3]=b;d=c[k+4>>2]&-2147483648|d&2147483647;c[k>>2]=e;c[k+4>>2]=d;return +(+h[k>>3])}function yi(a,b){a=+a;b=+b;return +(+xi(a,b))}function zi(a,b){a=+a;b=+b;var d=0,e=0,f=0,g=0,i=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0;h[k>>3]=a;d=c[k>>2]|0;m=c[k+4>>2]|0;h[k>>3]=b;n=c[k>>2]|0;o=c[k+4>>2]|0;e=hk(d|0,m|0,52)|0;e=e&2047;j=hk(n|0,o|0,52)|0;j=j&2047;p=m&-2147483648;i=fk(n|0,o|0,1)|0;l=D;a:do if(!((i|0)==0&(l|0)==0)?(g=o&2147483647,!(g>>>0>2146435072|(g|0)==2146435072&n>>>0>0|(e|0)==2047)):0){f=fk(d|0,m|0,1)|0;g=D;if(!(g>>>0>l>>>0|(g|0)==(l|0)&f>>>0>i>>>0))return +((f|0)==(i|0)&(g|0)==(l|0)?a*0.0:a);if(!e){e=fk(d|0,m|0,12)|0;f=D;if((f|0)>-1|(f|0)==-1&e>>>0>4294967295){g=e;e=0;do{e=e+-1|0;g=fk(g|0,f|0,1)|0;f=D}while((f|0)>-1|(f|0)==-1&g>>>0>4294967295)}else e=0;d=fk(d|0,m|0,1-e|0)|0;f=D}else f=m&1048575|1048576;if(!j){g=fk(n|0,o|0,12)|0;i=D;if((i|0)>-1|(i|0)==-1&g>>>0>4294967295){j=0;do{j=j+-1|0;g=fk(g|0,i|0,1)|0;i=D}while((i|0)>-1|(i|0)==-1&g>>>0>4294967295)}else j=0;n=fk(n|0,o|0,1-j|0)|0;m=D}else m=o&1048575|1048576;l=dk(d|0,f|0,n|0,m|0)|0;i=D;g=(i|0)>-1|(i|0)==-1&l>>>0>4294967295;b:do if((e|0)>(j|0)){while(1){if(g)if((d|0)==(n|0)&(f|0)==(m|0))break;else{d=l;f=i}d=fk(d|0,f|0,1)|0;f=D;e=e+-1|0;l=dk(d|0,f|0,n|0,m|0)|0;i=D;g=(i|0)>-1|(i|0)==-1&l>>>0>4294967295;if((e|0)<=(j|0))break b}b=a*0.0;break a}while(0);if(g)if((d|0)==(n|0)&(f|0)==(m|0)){b=a*0.0;break}else{f=i;d=l}if(f>>>0<1048576|(f|0)==1048576&d>>>0<0)do{d=fk(d|0,f|0,1)|0;f=D;e=e+-1|0}while(f>>>0<1048576|(f|0)==1048576&d>>>0<0);if((e|0)>0){o=gk(d|0,f|0,0,-1048576)|0;d=D;e=fk(e|0,0,52)|0;d=d|D;e=o|e}else{e=hk(d|0,f|0,1-e|0)|0;d=D}c[k>>2]=e;c[k+4>>2]=d|p;b=+h[k>>3]}else q=3;while(0);if((q|0)==3){b=a*b;b=b/b}return +b}function Ai(a,b){a=+a;b=+b;return +(+zi(a,b))}function Bi(a,b){a=+a;b=b|0;var d=0,e=0,f=0;h[k>>3]=a;d=c[k>>2]|0;e=c[k+4>>2]|0;f=hk(d|0,e|0,52)|0;f=f&2047;switch(f|0){case 0:{if(a!=0.0){a=+Bi(a*18446744073709551616.0,b);d=(c[b>>2]|0)+-64|0}else d=0;c[b>>2]=d;break}case 2047:break;default:{c[b>>2]=f+-1022;c[k>>2]=d;c[k+4>>2]=e&-2146435073|1071644672;a=+h[k>>3]}}return +a}function Ci(a,b){a=+a;b=b|0;return +(+Bi(a,b))}function Di(a,b){a=+a;b=b|0;var d=0;if((b|0)>1023){a=a*8988465674311579538646525.0e283;d=b+-1023|0;if((d|0)>1023){d=b+-2046|0;d=(d|0)>1023?1023:d;a=a*8988465674311579538646525.0e283}}else if((b|0)<-1022){a=a*2.2250738585072014e-308;d=b+1022|0;if((d|0)<-1022){d=b+2044|0;d=(d|0)<-1022?-1022:d;a=a*2.2250738585072014e-308}}else d=b;d=fk(d+1023|0,0,52)|0;b=D;c[k>>2]=d;c[k+4>>2]=b;return +(a*+h[k>>3])}function Ei(a,b){a=+a;b=b|0;return +(+Di(a,b))}function Fi(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0;l=i;i=i+16|0;g=l;j=(f|0)==0?2680:f;f=c[j>>2]|0;a:do if(!d)if(!f)f=0;else k=15;else{h=(b|0)==0?g:b;if(!e)f=-2;else{if(!f){f=a[d>>0]|0;g=f&255;if(f<<24>>24>-1){c[h>>2]=g;f=f<<24>>24!=0&1;break}f=g+-194|0;if(f>>>0>50){k=15;break}f=c[2432+(f<<2)>>2]|0;g=e+-1|0;if(g){d=d+1|0;k=9}}else{g=e;k=9}b:do if((k|0)==9){b=a[d>>0]|0;m=(b&255)>>>3;if((m+-16|m+(f>>26))>>>0>7){k=15;break a}while(1){d=d+1|0;f=(b&255)+-128|f<<6;g=g+-1|0;if((f|0)>=0)break;if(!g)break b;b=a[d>>0]|0;if((b&-64)<<24>>24!=-128){k=15;break a}}c[j>>2]=0;c[h>>2]=f;f=e-g|0;break a}while(0);c[j>>2]=f;f=-2}}while(0);if((k|0)==15){c[j>>2]=0;c[(qi()|0)>>2]=84;f=-1}i=l;return f|0}function Gi(a){a=a|0;if(!a)a=1;else a=(c[a>>2]|0)==0;return a&1|0}function Hi(b,d,e){b=b|0;d=d|0;e=e|0;do if(b){if(d>>>0<128){a[b>>0]=d;b=1;break}if(d>>>0<2048){a[b>>0]=d>>>6|192;a[b+1>>0]=d&63|128;b=2;break}if(d>>>0<55296|(d&-8192|0)==57344){a[b>>0]=d>>>12|224;a[b+1>>0]=d>>>6&63|128;a[b+2>>0]=d&63|128;b=3;break}if((d+-65536|0)>>>0<1048576){a[b>>0]=d>>>18|240;a[b+1>>0]=d>>>12&63|128;a[b+2>>0]=d>>>6&63|128;a[b+3>>0]=d&63|128;b=4;break}else{c[(qi()|0)>>2]=84;b=-1;break}}else b=1;while(0);return b|0}function Ii(a,b){a=a|0;b=b|0;if(!a)a=0;else a=Hi(a,b,0)|0;return a|0}function Ji(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;o=i;i=i+112|0;n=o+40|0;l=o+24|0;k=o+16|0;g=o;m=o+52|0;f=a[d>>0]|0;if(sj(14909,f<<24>>24,4)|0){e=Uj(1144)|0;if(!e)e=0;else{h=e;j=h+112|0;do{c[h>>2]=0;h=h+4|0}while((h|0)<(j|0));if(!(wj(d,43)|0))c[e>>2]=f<<24>>24==114?8:4;if(wj(d,101)|0){c[g>>2]=b;c[g+4>>2]=2;c[g+8>>2]=1;va(221,g|0)|0;f=a[d>>0]|0}if(f<<24>>24==97){c[k>>2]=b;c[k+4>>2]=3;f=va(221,k|0)|0;if(!(f&1024)){c[l>>2]=b;c[l+4>>2]=4;c[l+8>>2]=f|1024;va(221,l|0)|0}d=c[e>>2]|128;c[e>>2]=d}else d=c[e>>2]|0;c[e+60>>2]=b;c[e+44>>2]=e+120;c[e+48>>2]=1024;f=e+75|0;a[f>>0]=-1;if((d&8|0)==0?(c[n>>2]=b,c[n+4>>2]=21505,c[n+8>>2]=m,(mb(54,n|0)|0)==0):0)a[f>>0]=10;c[e+32>>2]=14;c[e+36>>2]=4;c[e+40>>2]=5;c[e+12>>2]=2;if(!(c[598]|0))c[e+76>>2]=-1;yb(2416);f=c[603]|0;c[e+56>>2]=f;if(f)c[f+52>>2]=e;c[603]=e;nb(2416)}}else{c[(qi()|0)>>2]=22;e=0}i=o;return e|0}function Ki(b){b=b|0;var c=0,d=0,e=0;d=(wj(b,43)|0)==0;c=a[b>>0]|0;d=d?c<<24>>24!=114&1:2;e=(wj(b,120)|0)==0;d=e?d:d|128;b=(wj(b,101)|0)==0;b=b?d:d|524288;b=c<<24>>24==114?b:b|64;b=c<<24>>24==119?b|512:b;return (c<<24>>24==97?b|1024:b)|0}function Li(a){a=a|0;return 0}function Mi(a){a=a|0;return}function Ni(a){a=a|0;var b=0,d=0;b=i;i=i+16|0;d=b;c[d>>2]=c[a+60>>2];a=wi(zb(6,d|0)|0)|0;i=b;return a|0}function Oi(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;m=i;i=i+48|0;h=m+16|0;g=m;f=m+32|0;c[f>>2]=d;j=f+4|0;l=b+48|0;n=c[l>>2]|0;c[j>>2]=e-((n|0)!=0&1);k=b+44|0;c[f+8>>2]=c[k>>2];c[f+12>>2]=n;if(!(c[597]|0)){c[h>>2]=c[b+60>>2];c[h+4>>2]=f;c[h+8>>2]=2;f=wi(Nb(145,h|0)|0)|0}else{Fa(13,b|0);c[g>>2]=c[b+60>>2];c[g+4>>2]=f;c[g+8>>2]=2;f=wi(Nb(145,g|0)|0)|0;pb(0)}if((f|0)>=1){j=c[j>>2]|0;if(f>>>0>j>>>0){h=c[k>>2]|0;g=b+4|0;c[g>>2]=h;c[b+8>>2]=h+(f-j);if(!(c[l>>2]|0))f=e;else{c[g>>2]=h+1;a[d+(e+-1)>>0]=a[h>>0]|0;f=e}}}else{c[b>>2]=c[b>>2]|f&48^16;c[b+8>>2]=0;c[b+4>>2]=0}i=m;return f|0}function Pi(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;f=i;i=i+32|0;g=f;e=f+20|0;c[g>>2]=c[a+60>>2];c[g+4>>2]=0;c[g+8>>2]=b;c[g+12>>2]=e;c[g+16>>2]=d;if((wi(Ib(140,g|0)|0)|0)<0){c[e>>2]=-1;a=-1}else a=c[e>>2]|0;i=f;return a|0}function Qi(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;q=i;i=i+48|0;n=q+16|0;m=q;e=q+32|0;o=a+28|0;f=c[o>>2]|0;c[e>>2]=f;p=a+20|0;f=(c[p>>2]|0)-f|0;c[e+4>>2]=f;c[e+8>>2]=b;c[e+12>>2]=d;k=a+60|0;l=a+44|0;b=2;f=f+d|0;while(1){if(!(c[597]|0)){c[n>>2]=c[k>>2];c[n+4>>2]=e;c[n+8>>2]=b;h=wi(Ob(146,n|0)|0)|0}else{Fa(14,a|0);c[m>>2]=c[k>>2];c[m+4>>2]=e;c[m+8>>2]=b;h=wi(Ob(146,m|0)|0)|0;pb(0)}if((f|0)==(h|0)){f=6;break}if((h|0)<0){f=8;break}f=f-h|0;g=c[e+4>>2]|0;if(h>>>0<=g>>>0)if((b|0)==2){c[o>>2]=(c[o>>2]|0)+h;j=g;b=2}else j=g;else{j=c[l>>2]|0;c[o>>2]=j;c[p>>2]=j;j=c[e+12>>2]|0;h=h-g|0;e=e+8|0;b=b+-1|0}c[e>>2]=(c[e>>2]|0)+h;c[e+4>>2]=j-h}if((f|0)==6){n=c[l>>2]|0;c[a+16>>2]=n+(c[a+48>>2]|0);a=n;c[o>>2]=a;c[p>>2]=a}else if((f|0)==8){c[a+16>>2]=0;c[o>>2]=0;c[p>>2]=0;c[a>>2]=c[a>>2]|32;if((b|0)==2)d=0;else d=d-(c[e+4>>2]|0)|0}i=q;return d|0}function Ri(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0;g=i;i=i+80|0;f=g;c[b+36>>2]=4;if((c[b>>2]&64|0)==0?(c[f>>2]=c[b+60>>2],c[f+4>>2]=21505,c[f+8>>2]=g+12,(mb(54,f|0)|0)!=0):0)a[b+75>>0]=-1;f=Qi(b,d,e)|0;i=g;return f|0}function Si(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=a+84|0;g=c[e>>2]|0;h=d+256|0;f=sj(g,0,h)|0;f=(f|0)==0?h:f-g|0;d=f>>>0<d>>>0?f:d;ik(b|0,g|0,d|0)|0;c[a+4>>2]=g+d;b=g+f|0;c[a+8>>2]=b;c[e>>2]=b;return d|0}function Ti(b){b=b|0;var d=0,e=0;d=b+74|0;e=a[d>>0]|0;a[d>>0]=e+255|e;d=b+20|0;e=b+44|0;if((c[d>>2]|0)>>>0>(c[e>>2]|0)>>>0)Qb[c[b+36>>2]&15](b,0,0)|0;c[b+16>>2]=0;c[b+28>>2]=0;c[d>>2]=0;d=c[b>>2]|0;if(d&20)if(!(d&4))d=-1;else{c[b>>2]=d|32;d=-1}else{d=c[e>>2]|0;c[b+8>>2]=d;c[b+4>>2]=d;d=0}return d|0}function Ui(b){b=b|0;var d=0,e=0;d=b+74|0;e=a[d>>0]|0;a[d>>0]=e+255|e;d=c[b>>2]|0;if(!(d&8)){c[b+8>>2]=0;c[b+4>>2]=0;d=c[b+44>>2]|0;c[b+28>>2]=d;c[b+20>>2]=d;c[b+16>>2]=d+(c[b+48>>2]|0);d=0}else{c[b>>2]=d|32;d=-1}return d|0}function Vi(a){a=a|0;var b=0,e=0;e=i;i=i+16|0;b=e;if((c[a+8>>2]|0)==0?(Ti(a)|0)!=0:0)b=-1;else if((Qb[c[a+32>>2]&15](a,b,1)|0)==1)b=d[b>>0]|0;else b=-1;i=e;return b|0}function Wi(a){a=a|0;var b=0,d=0,e=0;e=(c[a>>2]&1|0)!=0;if(!e){yb(2416);d=c[a+52>>2]|0;b=a+56|0;if(d)c[d+56>>2]=c[b>>2];b=c[b>>2]|0;if(b)c[b+52>>2]=d;if((c[603]|0)==(a|0))c[603]=b;nb(2416)}b=Yi(a)|0;b=Yb[c[a+12>>2]&31](a)|0|b;d=c[a+92>>2]|0;if(d)Vj(d);if(!e)Vj(a);return b|0}function Xi(a){a=a|0;var b=0;if((c[a+76>>2]|0)>-1){b=(Li(a)|0)==0;a=(c[a>>2]|0)>>>5&1}else a=(c[a>>2]|0)>>>5&1;return a|0}function Yi(a){a=a|0;var b=0,d=0;do if(a){if((c[a+76>>2]|0)<=-1){b=Kj(a)|0;break}d=(Li(a)|0)==0;b=Kj(a)|0;if(!d)Mi(a)}else{if(!(c[660]|0))b=0;else b=Yi(c[660]|0)|0;yb(2416);a=c[603]|0;if(a)do{if((c[a+76>>2]|0)>-1)d=Li(a)|0;else d=0;if((c[a+20>>2]|0)>>>0>(c[a+28>>2]|0)>>>0)b=Kj(a)|0|b;if(d)Mi(a);a=c[a+56>>2]|0}while((a|0)!=0);nb(2416)}while(0);return b|0}function Zi(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;if((c[f+76>>2]|0)>-1)o=Li(f)|0;else o=0;g=e+-1|0;if((e|0)<2){p=f+74|0;n=a[p>>0]|0;a[p>>0]=n+255|n;if(o)Mi(f);if(!g)a[b>>0]=0;else b=0}else{a:do if(g){m=f+4|0;n=f+8|0;h=b;while(1){i=c[m>>2]|0;q=i;k=(c[n>>2]|0)-q|0;j=sj(i,10,k)|0;r=(j|0)==0;j=r?k:1-q+j|0;q=j>>>0<g>>>0;j=q?j:g;ik(h|0,i|0,j|0)|0;i=c[m>>2]|0;k=i+j|0;c[m>>2]=k;e=h+j|0;l=g-j|0;if(!(r&q)){p=18;break a}if(k>>>0<(c[n>>2]|0)>>>0){j=j+1|0;c[m>>2]=i+j;i=d[k>>0]|0}else{g=Vi(f)|0;if((g|0)<0)break;j=j+1|0;i=g}g=l+-1|0;h=h+j|0;a[e>>0]=i;if(!((g|0)!=0&(i&255|0)!=10)){e=h;p=18;break a}}if((e|0)!=(b|0)?(c[f>>2]&16|0)!=0:0)p=18;else b=0}else{e=b;p=18}while(0);if((p|0)==18)if(!b)b=0;else a[e>>0]=0;if(o)Mi(f)}return b|0}function _i(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;g=i;i=i+32|0;f=g+16|0;e=g;if(sj(14909,a[d>>0]|0,4)|0){h=Ki(d)|0|32768;c[e>>2]=b;c[e+4>>2]=h;c[e+8>>2]=438;e=wi(Ab(5,e|0)|0)|0;if((e|0)>=0){b=Ji(e,d)|0;if(!b){c[f>>2]=e;zb(6,f|0)|0;b=0}}else b=0}else{c[(qi()|0)>>2]=22;b=0}i=g;return b|0}function $i(a,b){a=a|0;b=b|0;return (ij(a,Bj(a)|0,1,b)|0)+-1|0}function aj(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0;j=$(e,d)|0;if((c[f+76>>2]|0)>-1)k=Li(f)|0;else k=0;g=f+74|0;h=a[g>>0]|0;a[g>>0]=h+255|h;g=f+4|0;h=c[g>>2]|0;i=(c[f+8>>2]|0)-h|0;if((i|0)>0){i=i>>>0<j>>>0?i:j;ik(b|0,h|0,i|0)|0;c[g>>2]=h+i;b=b+i|0;g=j-i|0}else g=j;a:do if(!g)l=13;else{i=f+32|0;h=g;while(1){if(Ti(f)|0){e=h;break}g=Qb[c[i>>2]&15](f,b,h)|0;if((g+1|0)>>>0<2){e=h;break}if((h|0)==(g|0)){l=13;break a}else{b=b+g|0;h=h-g|0}}if(k)Mi(f);e=((j-e|0)>>>0)/(d>>>0)|0}while(0);if((l|0)==13)if(k)Mi(f);return e|0}function bj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;if((d|0)==1)b=b-(c[a+8>>2]|0)+(c[a+4>>2]|0)|0;f=a+20|0;e=a+28|0;if((c[f>>2]|0)>>>0>(c[e>>2]|0)>>>0?(Qb[c[a+36>>2]&15](a,0,0)|0,(c[f>>2]|0)==0):0)b=-1;else{c[a+16>>2]=0;c[e>>2]=0;c[f>>2]=0;if((Qb[c[a+40>>2]&15](a,b,d)|0)<0)b=-1;else{c[a+8>>2]=0;c[a+4>>2]=0;c[a>>2]=c[a>>2]&-17;b=0}}return b|0}function cj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;if((c[a+76>>2]|0)>-1){e=(Li(a)|0)==0;b=bj(a,b,d)|0;if(!e)Mi(a)}else b=bj(a,b,d)|0;return b|0}function dj(a,b,c){a=a|0;b=b|0;c=c|0;return cj(a,b,c)|0}function ej(a){a=a|0;var b=0;if(!(c[a>>2]&128))b=1;else b=(c[a+20>>2]|0)>>>0>(c[a+28>>2]|0)>>>0?2:1;b=Qb[c[a+40>>2]&15](a,0,b)|0;if((b|0)>=0)b=b-(c[a+8>>2]|0)+(c[a+4>>2]|0)+(c[a+20>>2]|0)-(c[a+28>>2]|0)|0;return b|0}function fj(a){a=a|0;var b=0;if((c[a+76>>2]|0)>-1){b=(Li(a)|0)==0;a=ej(a)|0}else a=ej(a)|0;return a|0}function gj(a){a=a|0;return fj(a)|0}function hj(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=e+16|0;g=c[f>>2]|0;if(!g)if(!(Ui(e)|0)){g=c[f>>2]|0;h=4}else f=0;else h=4;a:do if((h|0)==4){i=e+20|0;h=c[i>>2]|0;if((g-h|0)>>>0<d>>>0){f=Qb[c[e+36>>2]&15](e,b,d)|0;break}b:do if((a[e+75>>0]|0)>-1){f=d;while(1){if(!f){g=h;f=0;break b}g=f+-1|0;if((a[b+g>>0]|0)==10)break;else f=g}if((Qb[c[e+36>>2]&15](e,b,f)|0)>>>0<f>>>0)break a;d=d-f|0;b=b+f|0;g=c[i>>2]|0}else{g=h;f=0}while(0);ik(g|0,b|0,d|0)|0;c[i>>2]=(c[i>>2]|0)+d;f=f+d|0}while(0);return f|0}function ij(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=$(d,b)|0;if((c[e+76>>2]|0)>-1){g=(Li(e)|0)==0;a=hj(a,f,e)|0;if(!g)Mi(e)}else a=hj(a,f,e)|0;if((a|0)!=(f|0))d=(a>>>0)/(b>>>0)|0;return d|0}function jj(a){a=a|0;var b=0;if((c[a+76>>2]|0)>-1){b=(Li(a)|0)==0;bj(a,0,0)|0;c[a>>2]=c[a>>2]&-33;if(!b)Mi(a)}else{bj(a,0,0)|0;c[a>>2]=c[a>>2]&-33}return}function kj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;i=i+16|0;f=e;c[f>>2]=d;d=pj(a,b,f)|0;i=e;return d|0}function lj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;j=i;i=i+16|0;e=j;f=Uj(240)|0;do if(f){c[e>>2]=c[d>>2];e=oj(f,240,b,e)|0;if(e>>>0<240){b=Xj(f,e+1|0)|0;c[a>>2]=(b|0)!=0?b:f;break}Vj(f);if((e|0)>=0?(h=e+1|0,g=Uj(h)|0,c[a>>2]=g,(g|0)!=0):0)e=oj(g,h,b,d)|0;else e=-1}else e=-1;while(0);i=j;return e|0}function mj(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;s=i;i=i+224|0;o=s+80|0;r=s+96|0;q=s;p=s+136|0;f=r;g=f+40|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(g|0));c[o>>2]=c[e>>2];if((Lj(0,d,o,q,r)|0)<0)e=-1;else{if((c[b+76>>2]|0)>-1)m=Li(b)|0;else m=0;e=c[b>>2]|0;n=e&32;if((a[b+74>>0]|0)<1)c[b>>2]=e&-33;e=b+48|0;if(!(c[e>>2]|0)){g=b+44|0;h=c[g>>2]|0;c[g>>2]=p;j=b+28|0;c[j>>2]=p;k=b+20|0;c[k>>2]=p;c[e>>2]=80;l=b+16|0;c[l>>2]=p+80;f=Lj(b,d,o,q,r)|0;if(h){Qb[c[b+36>>2]&15](b,0,0)|0;f=(c[k>>2]|0)==0?-1:f;c[g>>2]=h;c[e>>2]=0;c[l>>2]=0;c[j>>2]=0;c[k>>2]=0}}else f=Lj(b,d,o,q,r)|0;e=c[b>>2]|0;c[b>>2]=e|n;if(m)Mi(b);e=(e&32|0)==0?f:-1}i=s;return e|0}function nj(e,f,j){e=e|0;f=f|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0;P=i;i=i+304|0;H=P+16|0;J=P+8|0;I=P+33|0;K=P;y=P+32|0;if((c[e+76>>2]|0)>-1)O=Li(e)|0;else O=0;k=a[f>>0]|0;a:do if(k<<24>>24){L=e+4|0;M=e+100|0;G=e+108|0;z=e+8|0;A=I+10|0;B=I+33|0;C=J+4|0;E=I+46|0;F=I+94|0;m=k;k=0;n=f;s=0;l=0;f=0;b:while(1){c:do if(!(pi(m&255)|0)){m=(a[n>>0]|0)==37;d:do if(m){q=n+1|0;o=a[q>>0]|0;e:do switch(o<<24>>24){case 37:break d;case 42:{x=0;o=n+2|0;break}default:{o=(o&255)+-48|0;if(o>>>0<10?(a[n+2>>0]|0)==36:0){c[H>>2]=c[j>>2];while(1){x=(c[H>>2]|0)+(4-1)&~(4-1);m=c[x>>2]|0;c[H>>2]=x+4;if(o>>>0>1)o=o+-1|0;else break}x=m;o=n+3|0;break e}o=(c[j>>2]|0)+(4-1)&~(4-1);x=c[o>>2]|0;c[j>>2]=o+4;o=q}}while(0);m=a[o>>0]|0;n=m&255;if((n+-48|0)>>>0<10){m=0;while(1){q=(m*10|0)+-48+n|0;o=o+1|0;m=a[o>>0]|0;n=m&255;if((n+-48|0)>>>0>=10)break;else m=q}}else q=0;if(m<<24>>24==109){o=o+1|0;r=a[o>>0]|0;m=(x|0)!=0&1;l=0;f=0}else{r=m;m=0}n=o+1|0;switch(r&255|0){case 104:{w=(a[n>>0]|0)==104;n=w?o+2|0:n;o=w?-2:-1;break}case 108:{w=(a[n>>0]|0)==108;n=w?o+2|0:n;o=w?3:1;break}case 106:{o=3;break}case 116:case 122:{o=1;break}case 76:{o=2;break}case 110:case 112:case 67:case 83:case 91:case 99:case 115:case 88:case 71:case 70:case 69:case 65:case 103:case 102:case 101:case 97:case 120:case 117:case 111:case 105:case 100:{n=o;o=0;break}default:{N=152;break b}}r=d[n>>0]|0;t=(r&47|0)==3;r=t?r|32:r;t=t?1:o;switch(r|0){case 99:{w=s;v=(q|0)<1?1:q;break}case 91:{w=s;v=q;break}case 110:{if(!x){o=s;break c}switch(t|0){case -2:{a[x>>0]=s;o=s;break c}case -1:{b[x>>1]=s;o=s;break c}case 0:{c[x>>2]=s;o=s;break c}case 1:{c[x>>2]=s;o=s;break c}case 3:{o=x;c[o>>2]=s;c[o+4>>2]=((s|0)<0)<<31>>31;o=s;break c}default:{o=s;break c}}}default:{ui(e,0);do{o=c[L>>2]|0;if(o>>>0<(c[M>>2]|0)>>>0){c[L>>2]=o+1;o=d[o>>0]|0}else o=vi(e)|0}while((pi(o)|0)!=0);o=c[L>>2]|0;if(c[M>>2]|0){o=o+-1|0;c[L>>2]=o}w=(c[G>>2]|0)+s+o-(c[z>>2]|0)|0;v=q}}ui(e,v);o=c[L>>2]|0;q=c[M>>2]|0;if(o>>>0<q>>>0)c[L>>2]=o+1;else{if((vi(e)|0)<0){N=152;break b}q=c[M>>2]|0}if(q)c[L>>2]=(c[L>>2]|0)+-1;f:do switch(r|0){case 91:case 99:case 115:{u=(r|0)==99;g:do if((r&239|0)==99){ek(I|0,-1,257)|0;a[I>>0]=0;if((r|0)==115){a[B>>0]=0;a[A>>0]=0;a[A+1>>0]=0;a[A+2>>0]=0;a[A+3>>0]=0;a[A+4>>0]=0}}else{Q=n+1|0;s=(a[Q>>0]|0)==94;o=s&1;r=s?Q:n;n=s?n+2|0:Q;ek(I|0,s&1|0,257)|0;a[I>>0]=0;switch(a[n>>0]|0){case 45:{s=(o^1)&255;a[E>>0]=s;n=r+2|0;break}case 93:{s=(o^1)&255;a[F>>0]=s;n=r+2|0;break}default:s=(o^1)&255}while(1){o=a[n>>0]|0;h:do switch(o<<24>>24){case 0:{N=152;break b}case 93:break g;case 45:{r=n+1|0;o=a[r>>0]|0;switch(o<<24>>24){case 93:case 0:{o=45;break h}default:{}}n=a[n+-1>>0]|0;if((n&255)<(o&255)){n=n&255;do{n=n+1|0;a[I+n>>0]=s;o=a[r>>0]|0}while((n|0)<(o&255|0));n=r}else n=r;break}default:{}}while(0);a[I+((o&255)+1)>>0]=s;n=n+1|0}}while(0);r=u?v+1|0:31;s=(t|0)==1;t=(m|0)!=0;i:do if(s){if(t){f=Uj(r<<2)|0;if(!f){l=0;N=152;break b}}else f=x;c[J>>2]=0;c[C>>2]=0;l=0;j:while(1){q=(f|0)==0;do{k:while(1){o=c[L>>2]|0;if(o>>>0<(c[M>>2]|0)>>>0){c[L>>2]=o+1;o=d[o>>0]|0}else o=vi(e)|0;if(!(a[I+(o+1)>>0]|0))break j;a[y>>0]=o;switch(Fi(K,y,1,J)|0){case -1:{l=0;N=152;break b}case -2:break;default:break k}}if(!q){c[f+(l<<2)>>2]=c[K>>2];l=l+1|0}}while(!(t&(l|0)==(r|0)));l=r<<1|1;o=Xj(f,l<<2)|0;if(!o){l=0;N=152;break b}Q=r;r=l;f=o;l=Q}if(!(Gi(J)|0)){l=0;N=152;break b}else{q=l;l=0}}else{if(t){l=Uj(r)|0;if(!l){l=0;f=0;N=152;break b}else o=0;while(1){do{f=c[L>>2]|0;if(f>>>0<(c[M>>2]|0)>>>0){c[L>>2]=f+1;f=d[f>>0]|0}else f=vi(e)|0;if(!(a[I+(f+1)>>0]|0)){q=o;f=0;break i}a[l+o>>0]=f;o=o+1|0}while((o|0)!=(r|0));f=r<<1|1;o=Xj(l,f)|0;if(!o){f=0;N=152;break b}else{Q=r;r=f;l=o;o=Q}}}if(!x){l=q;while(1){f=c[L>>2]|0;if(f>>>0<l>>>0){c[L>>2]=f+1;f=d[f>>0]|0}else f=vi(e)|0;if(!(a[I+(f+1)>>0]|0)){q=0;l=0;f=0;break i}l=c[M>>2]|0}}else{l=0;while(1){f=c[L>>2]|0;if(f>>>0<q>>>0){c[L>>2]=f+1;f=d[f>>0]|0}else f=vi(e)|0;if(!(a[I+(f+1)>>0]|0)){q=l;l=x;f=0;break i}a[x+l>>0]=f;q=c[M>>2]|0;l=l+1|0}}}while(0);o=c[L>>2]|0;if(c[M>>2]|0){o=o+-1|0;c[L>>2]=o}o=o-(c[z>>2]|0)+(c[G>>2]|0)|0;if(!o)break b;if(!((o|0)==(v|0)|u^1))break b;do if(t)if(s){c[x>>2]=f;break}else{c[x>>2]=l;break}while(0);if(!u){if(f)c[f+(q<<2)>>2]=0;if(!l){l=0;break f}a[l+q>>0]=0}break}case 120:case 88:case 112:{o=16;N=134;break}case 111:{o=8;N=134;break}case 117:case 100:{o=10;N=134;break}case 105:{o=0;N=134;break}case 71:case 103:case 70:case 102:case 69:case 101:case 65:case 97:{p=+si(e,t,0);if((c[G>>2]|0)==((c[z>>2]|0)-(c[L>>2]|0)|0))break b;if(x)switch(t|0){case 0:{g[x>>2]=p;break f}case 1:{h[x>>3]=p;break f}case 2:{h[x>>3]=p;break f}default:break f}break}default:{}}while(0);l:do if((N|0)==134){N=0;o=ti(e,o,0,-1,-1)|0;if((c[G>>2]|0)==((c[z>>2]|0)-(c[L>>2]|0)|0))break b;if((x|0)!=0&(r|0)==112){c[x>>2]=o;break}if(x)switch(t|0){case -2:{a[x>>0]=o;break l}case -1:{b[x>>1]=o;break l}case 0:{c[x>>2]=o;break l}case 1:{c[x>>2]=o;break l}case 3:{Q=x;c[Q>>2]=o;c[Q+4>>2]=D;break l}default:break l}}while(0);k=((x|0)!=0&1)+k|0;o=(c[G>>2]|0)+w+(c[L>>2]|0)-(c[z>>2]|0)|0;break c}while(0);n=n+(m&1)|0;ui(e,0);m=c[L>>2]|0;if(m>>>0<(c[M>>2]|0)>>>0){c[L>>2]=m+1;m=d[m>>0]|0}else m=vi(e)|0;if((m|0)!=(d[n>>0]|0)){N=21;break b}o=s+1|0}else{while(1){m=n+1|0;if(!(pi(d[m>>0]|0)|0))break;else n=m}ui(e,0);do{m=c[L>>2]|0;if(m>>>0<(c[M>>2]|0)>>>0){c[L>>2]=m+1;m=d[m>>0]|0}else m=vi(e)|0}while((pi(m)|0)!=0);m=c[L>>2]|0;if(c[M>>2]|0){m=m+-1|0;c[L>>2]=m}o=(c[G>>2]|0)+s+m-(c[z>>2]|0)|0}while(0);n=n+1|0;m=a[n>>0]|0;if(!(m<<24>>24))break a;else s=o}if((N|0)==21){if(c[M>>2]|0)c[L>>2]=(c[L>>2]|0)+-1;if((k|0)!=0|(m|0)>-1)break;else{k=0;N=153}}else if((N|0)==152)if(!k){k=m;N=153}if((N|0)==153){m=k;k=-1}if(m){Vj(l);Vj(f)}}else k=0;while(0);if(O)Mi(e);i=P;return k|0}function oj(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0;n=i;i=i+128|0;g=n+112|0;m=n;h=m;j=2684;k=h+112|0;do{c[h>>2]=c[j>>2];h=h+4|0;j=j+4|0}while((h|0)<(k|0));if((d+-1|0)>>>0>2147483646)if(!d){d=1;l=4}else{c[(qi()|0)>>2]=75;d=-1}else{g=b;l=4}if((l|0)==4){l=-2-g|0;l=d>>>0>l>>>0?l:d;c[m+48>>2]=l;b=m+20|0;c[b>>2]=g;c[m+44>>2]=g;d=g+l|0;g=m+16|0;c[g>>2]=d;c[m+28>>2]=d;d=mj(m,e,f)|0;if(l){e=c[b>>2]|0;a[e+(((e|0)==(c[g>>2]|0))<<31>>31)>>0]=0}}i=n;return d|0}function pj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;g=i;i=i+112|0;e=g;f=e;h=f+112|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(h|0));c[e+32>>2]=15;c[e+44>>2]=a;c[e+76>>2]=-1;c[e+84>>2]=a;h=nj(e,b,d)|0;i=g;return h|0}function qj(b){b=b|0;var c=0,d=0,e=0,f=0;while(1){c=b+1|0;if(!(pi(a[b>>0]|0)|0))break;else b=c}d=a[b>>0]|0;switch(d<<24>>24|0){case 45:{e=1;f=5;break}case 43:{e=0;f=5;break}default:e=0}if((f|0)==5){b=c;d=a[c>>0]|0}c=(d<<24>>24)+-48|0;if(c>>>0<10){d=b;b=0;do{d=d+1|0;b=(b*10|0)-c|0;c=(a[d>>0]|0)+-48|0}while(c>>>0<10)}else b=0;return ((e|0)!=0?b:0-b|0)|0}function rj(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;r=i;i=i+208|0;o=r+8|0;p=r;f=$(d,b)|0;n=p;c[n>>2]=1;c[n+4>>2]=0;if(f){j=f-d|0;c[o+4>>2]=d;c[o>>2]=d;g=d;b=d;h=2;while(1){b=b+d+g|0;c[o+(h<<2)>>2]=b;if(b>>>0<f>>>0){n=g;g=b;h=h+1|0;b=n}else break}n=0-d|0;k=a+j|0;m=p+4|0;if((j|0)>0){j=k;f=1;h=1;while(1){do if((f&3|0)==3){Nj(a,d,e,h,o);l=c[m>>2]|0;b=l<<30|(c[p>>2]|0)>>>2;c[p>>2]=b;c[m>>2]=l>>>2;h=h+2|0}else{b=h+-1|0;if((c[o+(b<<2)>>2]|0)>>>0<(j-a|0)>>>0)Nj(a,d,e,h,o);else Oj(a,d,e,p,h,0,o);if((h|0)==1){b=c[p>>2]|0;c[m>>2]=b>>>31|c[m>>2]<<1;b=b<<1;c[p>>2]=b;h=0;break}if(b>>>0>31){f=c[p>>2]|0;c[m>>2]=f;c[p>>2]=0;b=h+-33|0;g=0}else{f=c[m>>2]|0;g=c[p>>2]|0}c[m>>2]=g>>>(32-b|0)|f<<b;b=g<<b;c[p>>2]=b;h=1}while(0);f=b|1;c[p>>2]=f;b=a+d|0;if(b>>>0>=k>>>0){f=b;break}else a=b}}else{f=a;h=1}Oj(f,d,e,p,h,0,o);l=p+4|0;b=c[p>>2]|0;if(!((h|0)==1&(b|0)==1&(c[l>>2]|0)==0)){g=f;while(1){if((h|0)<2){f=b+-1|0;do if(f){if(!(f&1)){j=f;f=0;do{f=f+1|0;j=j>>>1}while((j&1|0)==0);if(!f)q=24}else q=24;if((q|0)==24){q=0;k=c[m>>2]|0;if(!k){f=64;q=30;break}if(!(k&1)){j=k;f=0}else{a=0;j=k;f=0;break}while(1){a=f+1|0;j=j>>>1;if(j&1){j=a;break}else f=a}if(!j){a=0;j=k;f=0;break}else f=f+33|0}if(f>>>0>31)q=30;else{a=f;j=c[m>>2]|0}}else{f=32;q=30}while(0);if((q|0)==30){q=0;b=c[m>>2]|0;c[p>>2]=b;c[m>>2]=0;a=f+-32|0;j=0}c[p>>2]=j<<32-a|b>>>a;c[m>>2]=j>>>a;g=g+n|0;f=f+h|0}else{a=b>>>30;k=a|c[m>>2]<<2;f=h+-2|0;c[p>>2]=(b<<1&2147483646|a<<31)^3;c[m>>2]=k>>>1;Oj(g+(0-((c[o+(f<<2)>>2]|0)+d))|0,d,e,p,h+-1|0,1,o);k=c[p>>2]|0;c[m>>2]=k>>>31|c[m>>2]<<1;c[p>>2]=k<<1|1;g=g+n|0;Oj(g,d,e,p,f,1,o)}b=c[p>>2]|0;if((f|0)==1&(b|0)==1&(c[l>>2]|0)==0)break;else h=f}}}i=r;return}function sj(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;h=d&255;f=(e|0)!=0;a:do if(f&(b&3|0)!=0){g=d&255;while(1){if((a[b>>0]|0)==g<<24>>24){i=6;break a}b=b+1|0;e=e+-1|0;f=(e|0)!=0;if(!(f&(b&3|0)!=0)){i=5;break}}}else i=5;while(0);if((i|0)==5)if(f)i=6;else e=0;b:do if((i|0)==6){g=d&255;if((a[b>>0]|0)!=g<<24>>24){f=$(h,16843009)|0;c:do if(e>>>0>3)while(1){h=c[b>>2]^f;if((h&-2139062144^-2139062144)&h+-16843009)break;b=b+4|0;e=e+-4|0;if(e>>>0<=3){i=11;break c}}else i=11;while(0);if((i|0)==11)if(!e){e=0;break}while(1){if((a[b>>0]|0)==g<<24>>24)break b;b=b+1|0;e=e+-1|0;if(!e){e=0;break}}}}while(0);return ((e|0)!=0?b:0)|0}function tj(b,c,d){b=b|0;c=c|0;d=d|0;var e=0;e=c&255;do{if(!d){c=0;break}d=d+-1|0;c=b+d|0}while((a[c>>0]|0)!=e<<24>>24);return c|0}function uj(b,d){b=b|0;d=d|0;var e=0,f=0;e=d;a:do if(!((e^b)&3)){if(e&3)do{e=a[d>>0]|0;a[b>>0]=e;if(!(e<<24>>24))break a;d=d+1|0;b=b+1|0}while((d&3|0)!=0);e=c[d>>2]|0;if(!((e&-2139062144^-2139062144)&e+-16843009)){f=b;while(1){d=d+4|0;b=f+4|0;c[f>>2]=e;e=c[d>>2]|0;if((e&-2139062144^-2139062144)&e+-16843009)break;else f=b}}f=8}else f=8;while(0);if((f|0)==8){f=a[d>>0]|0;a[b>>0]=f;if(f<<24>>24)do{d=d+1|0;b=b+1|0;f=a[d>>0]|0;a[b>>0]=f}while(f<<24>>24!=0)}return b|0}function vj(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;g=d;do if(!((g^b)&3)){f=(e|0)!=0;a:do if(f&(g&3|0)!=0)while(1){g=a[d>>0]|0;a[b>>0]=g;if(!(g<<24>>24))break a;e=e+-1|0;d=d+1|0;b=b+1|0;f=(e|0)!=0;if(!(f&(d&3|0)!=0)){h=5;break}}else h=5;while(0);if((h|0)==5)if(!f){e=0;break}if(a[d>>0]|0){b:do if(e>>>0>3)do{f=c[d>>2]|0;if((f&-2139062144^-2139062144)&f+-16843009)break b;c[b>>2]=f;e=e+-4|0;d=d+4|0;b=b+4|0}while(e>>>0>3);while(0);h=11}}else h=11;while(0);c:do if((h|0)==11)if(!e)e=0;else while(1){h=a[d>>0]|0;a[b>>0]=h;if(!(h<<24>>24))break c;e=e+-1|0;b=b+1|0;if(!e){e=0;break}else d=d+1|0}while(0);ek(b|0,0,e|0)|0;return b|0}function wj(b,c){b=b|0;c=c|0;b=xj(b,c)|0;return ((a[b>>0]|0)==(c&255)<<24>>24?b:0)|0}function xj(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;f=d&255;a:do if(!f)b=b+(Bj(b)|0)|0;else{if(b&3){e=d&255;do{g=a[b>>0]|0;if(g<<24>>24==0?1:g<<24>>24==e<<24>>24)break a;b=b+1|0}while((b&3|0)!=0)}f=$(f,16843009)|0;e=c[b>>2]|0;b:do if(!((e&-2139062144^-2139062144)&e+-16843009))do{g=e^f;if((g&-2139062144^-2139062144)&g+-16843009)break b;b=b+4|0;e=c[b>>2]|0}while(((e&-2139062144^-2139062144)&e+-16843009|0)==0);while(0);e=d&255;while(1){g=a[b>>0]|0;if(g<<24>>24==0?1:g<<24>>24==e<<24>>24)break;else b=b+1|0}}while(0);return b|0}function yj(a,b){a=a|0;b=b|0;uj(a,b)|0;return a|0}function zj(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;g=i;i=i+32|0;f=g;e=a[d>>0]|0;if(e<<24>>24!=0?(a[d+1>>0]|0)!=0:0){c[f>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[f+16>>2]=0;c[f+20>>2]=0;c[f+24>>2]=0;c[f+28>>2]=0;do{h=f+(((e&255)>>>5&255)<<2)|0;c[h>>2]=c[h>>2]|1<<(e&31);d=d+1|0;e=a[d>>0]|0}while(e<<24>>24!=0);d=a[b>>0]|0;a:do if(!(d<<24>>24))e=b;else{e=b;do{if(c[f+(((d&255)>>>5&255)<<2)>>2]&1<<(d&31))break a;e=e+1|0;d=a[e>>0]|0}while(d<<24>>24!=0)}while(0);e=e-b|0}else e=(xj(b,e<<24>>24)|0)-b|0;i=g;return e|0}function Aj(a){a=a|0;var b=0,c=0;c=(Bj(a)|0)+1|0;b=Uj(c)|0;if(!b)b=0;else ik(b|0,a|0,c|0)|0;return b|0}function Bj(b){b=b|0;var d=0,e=0,f=0;f=b;a:do if(!(f&3))e=4;else{d=b;b=f;while(1){if(!(a[d>>0]|0))break a;d=d+1|0;b=d;if(!(b&3)){b=d;e=4;break}}}while(0);if((e|0)==4){while(1){d=c[b>>2]|0;if(!((d&-2139062144^-2139062144)&d+-16843009))b=b+4|0;else break}if((d&255)<<24>>24)do b=b+1|0;while((a[b>>0]|0)!=0)}return b-f|0}function Cj(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;e=b+(Bj(b)|0)|0;a:do if(d)while(1){f=a[c>>0]|0;if(!(f<<24>>24))break a;d=d+-1|0;g=e+1|0;a[e>>0]=f;if(!d){e=g;break}else{c=c+1|0;e=g}}while(0);a[e>>0]=0;return b|0}function Dj(a,b,c){a=a|0;b=b|0;c=c|0;vj(a,b,c)|0;return a|0}function Ej(a,b){a=a|0;b=b|0;return tj(a,b,(Bj(a)|0)+1|0)|0}function Fj(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;h=i;i=i+32|0;g=h;c[g>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;c[g+12>>2]=0;c[g+16>>2]=0;c[g+20>>2]=0;c[g+24>>2]=0;c[g+28>>2]=0;f=a[d>>0]|0;do if(!(f<<24>>24))d=0;else{if(!(a[d+1>>0]|0)){d=b;while(1)if((a[d>>0]|0)==f<<24>>24)d=d+1|0;else break;d=d-b|0;break}else{e=d;d=f}do{f=g+(((d&255)>>>5&255)<<2)|0;c[f>>2]=c[f>>2]|1<<(d&31);e=e+1|0;d=a[e>>0]|0}while(d<<24>>24!=0);e=a[b>>0]|0;a:do if(!(e<<24>>24))d=b;else{d=b;do{if(!(c[g+(((e&255)>>>5&255)<<2)>>2]&1<<(e&31)))break a;d=d+1|0;e=a[d>>0]|0}while(e<<24>>24!=0)}while(0);d=d-b|0}while(0);i=h;return d|0}function Gj(b,d){b=b|0;d=d|0;var e=0,f=0;if(!b){b=c[699]|0;if(!b)b=0;else{f=b;e=3}}else{f=b;e=3}do if((e|0)==3){e=Fj(f,d)|0;b=f+e|0;if(!(a[b>>0]|0)){c[699]=0;b=0;break}e=(zj(b,d)|0)+e|0;d=f+e|0;c[699]=d;if(!(a[d>>0]|0)){c[699]=0;break}else{c[699]=f+(e+1);a[d>>0]=0;break}}while(0);return b|0}function Hj(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,i=0,j=0;i=a+4|0;e=c[i>>2]|0;j=a+100|0;if(e>>>0<(c[j>>2]|0)>>>0){c[i>>2]=e+1;e=d[e>>0]|0}else e=vi(a)|0;switch(e|0){case 43:case 45:{f=(e|0)==45&1;e=c[i>>2]|0;if(e>>>0<(c[j>>2]|0)>>>0){c[i>>2]=e+1;e=d[e>>0]|0}else e=vi(a)|0;if((b|0)!=0&(e+-48|0)>>>0>9?(c[j>>2]|0)!=0:0){c[i>>2]=(c[i>>2]|0)+-1;h=f}else h=f;break}default:h=0}if((e+-48|0)>>>0>9)if(!(c[j>>2]|0)){f=-2147483648;e=0}else{c[i>>2]=(c[i>>2]|0)+-1;f=-2147483648;e=0}else{f=0;do{f=e+-48+(f*10|0)|0;e=c[i>>2]|0;if(e>>>0<(c[j>>2]|0)>>>0){c[i>>2]=e+1;e=d[e>>0]|0}else e=vi(a)|0}while((e+-48|0)>>>0<10&(f|0)<214748364);b=((f|0)<0)<<31>>31;if((e+-48|0)>>>0<10){do{b=ok(f|0,b|0,10,0)|0;f=D;e=gk(e|0,((e|0)<0)<<31>>31|0,-48,-1)|0;f=gk(e|0,D|0,b|0,f|0)|0;b=D;e=c[i>>2]|0;if(e>>>0<(c[j>>2]|0)>>>0){c[i>>2]=e+1;e=d[e>>0]|0}else e=vi(a)|0}while((e+-48|0)>>>0<10&((b|0)<21474836|(b|0)==21474836&f>>>0<2061584302));g=f}else g=f;if((e+-48|0)>>>0<10)do{e=c[i>>2]|0;if(e>>>0<(c[j>>2]|0)>>>0){c[i>>2]=e+1;e=d[e>>0]|0}else e=vi(a)|0}while((e+-48|0)>>>0<10);if(c[j>>2]|0)c[i>>2]=(c[i>>2]|0)+-1;a=(h|0)!=0;e=dk(0,0,g|0,b|0)|0;f=a?D:b;e=a?e:g}D=f;return e|0}function Ij(a){a=a|0;if(!(c[a+68>>2]|0))Mi(a);return}function Jj(a){a=a|0;if(!(c[a+68>>2]|0))Mi(a);return}function Kj(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=a+20|0;g=a+28|0;if((c[b>>2]|0)>>>0>(c[g>>2]|0)>>>0?(Qb[c[a+36>>2]&15](a,0,0)|0,(c[b>>2]|0)==0):0)b=-1;else{h=a+4|0;d=c[h>>2]|0;e=a+8|0;f=c[e>>2]|0;if(d>>>0<f>>>0)Qb[c[a+40>>2]&15](a,d-f|0,1)|0;c[a+16>>2]=0;c[g>>2]=0;c[b>>2]=0;c[e>>2]=0;c[h>>2]=0;b=0}return b|0}function Lj(e,f,g,j,l){e=e|0;f=f|0;g=g|0;j=j|0;l=l|0;var m=0,n=0,o=0,p=0,q=0.0,r=0,s=0,t=0,u=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0;ha=i;i=i+624|0;ca=ha+24|0;ea=ha+16|0;da=ha+588|0;Y=ha+576|0;ba=ha;V=ha+536|0;ga=ha+8|0;fa=ha+528|0;M=(e|0)!=0;N=V+40|0;U=N;V=V+39|0;W=ga+4|0;X=Y+12|0;Y=Y+11|0;Z=da;_=X;aa=_-Z|0;O=-2-Z|0;P=_+2|0;Q=ca+288|0;R=da+9|0;S=R;T=da+8|0;m=0;w=f;n=0;f=0;a:while(1){do if((m|0)>-1)if((n|0)>(2147483647-m|0)){c[(qi()|0)>>2]=75;m=-1;break}else{m=n+m|0;break}while(0);n=a[w>>0]|0;if(!(n<<24>>24)){L=245;break}else o=w;b:while(1){switch(n<<24>>24){case 37:{n=o;L=9;break b}case 0:{n=o;break b}default:{}}K=o+1|0;n=a[K>>0]|0;o=K}c:do if((L|0)==9)while(1){L=0;if((a[n+1>>0]|0)!=37)break c;o=o+1|0;n=n+2|0;if((a[n>>0]|0)==37)L=9;else break}while(0);y=o-w|0;if(M?(c[e>>2]&32|0)==0:0)hj(w,y,e)|0;if((o|0)!=(w|0)){w=n;n=y;continue}r=n+1|0;o=a[r>>0]|0;p=(o<<24>>24)+-48|0;if(p>>>0<10){K=(a[n+2>>0]|0)==36;r=K?n+3|0:r;o=a[r>>0]|0;u=K?p:-1;f=K?1:f}else u=-1;n=o<<24>>24;d:do if((n&-32|0)==32){p=0;while(1){if(!(1<<n+-32&75913)){s=p;n=r;break d}p=1<<(o<<24>>24)+-32|p;r=r+1|0;o=a[r>>0]|0;n=o<<24>>24;if((n&-32|0)!=32){s=p;n=r;break}}}else{s=0;n=r}while(0);do if(o<<24>>24==42){p=n+1|0;o=(a[p>>0]|0)+-48|0;if(o>>>0<10?(a[n+2>>0]|0)==36:0){c[l+(o<<2)>>2]=10;f=1;n=n+3|0;o=c[j+((a[p>>0]|0)+-48<<3)>>2]|0}else{if(f){m=-1;break a}if(!M){x=s;n=p;f=0;K=0;break}f=(c[g>>2]|0)+(4-1)&~(4-1);o=c[f>>2]|0;c[g>>2]=f+4;f=0;n=p}if((o|0)<0){x=s|8192;K=0-o|0}else{x=s;K=o}}else{p=(o<<24>>24)+-48|0;if(p>>>0<10){o=0;do{o=(o*10|0)+p|0;n=n+1|0;p=(a[n>>0]|0)+-48|0}while(p>>>0<10);if((o|0)<0){m=-1;break a}else{x=s;K=o}}else{x=s;K=0}}while(0);e:do if((a[n>>0]|0)==46){p=n+1|0;o=a[p>>0]|0;if(o<<24>>24!=42){r=(o<<24>>24)+-48|0;if(r>>>0<10){n=p;o=0}else{n=p;r=0;break}while(1){o=(o*10|0)+r|0;n=n+1|0;r=(a[n>>0]|0)+-48|0;if(r>>>0>=10){r=o;break e}}}p=n+2|0;o=(a[p>>0]|0)+-48|0;if(o>>>0<10?(a[n+3>>0]|0)==36:0){c[l+(o<<2)>>2]=10;n=n+4|0;r=c[j+((a[p>>0]|0)+-48<<3)>>2]|0;break}if(f){m=-1;break a}if(M){n=(c[g>>2]|0)+(4-1)&~(4-1);r=c[n>>2]|0;c[g>>2]=n+4;n=p}else{n=p;r=0}}else r=-1;while(0);t=0;while(1){o=(a[n>>0]|0)+-65|0;if(o>>>0>57){m=-1;break a}p=n+1|0;o=a[15953+(t*58|0)+o>>0]|0;s=o&255;if((s+-1|0)>>>0<8){n=p;t=s}else{J=p;break}}if(!(o<<24>>24)){m=-1;break}p=(u|0)>-1;do if(o<<24>>24==19)if(p){m=-1;break a}else L=52;else{if(p){c[l+(u<<2)>>2]=s;H=j+(u<<3)|0;I=c[H+4>>2]|0;L=ba;c[L>>2]=c[H>>2];c[L+4>>2]=I;L=52;break}if(!M){m=0;break a}Rj(ba,s,g)}while(0);if((L|0)==52?(L=0,!M):0){w=J;n=y;continue}u=a[n>>0]|0;u=(t|0)!=0&(u&15|0)==3?u&-33:u;p=x&-65537;I=(x&8192|0)==0?x:p;f:do switch(u|0){case 110:switch(t|0){case 0:{c[c[ba>>2]>>2]=m;w=J;n=y;continue a}case 1:{c[c[ba>>2]>>2]=m;w=J;n=y;continue a}case 2:{w=c[ba>>2]|0;c[w>>2]=m;c[w+4>>2]=((m|0)<0)<<31>>31;w=J;n=y;continue a}case 3:{b[c[ba>>2]>>1]=m;w=J;n=y;continue a}case 4:{a[c[ba>>2]>>0]=m;w=J;n=y;continue a}case 6:{c[c[ba>>2]>>2]=m;w=J;n=y;continue a}case 7:{w=c[ba>>2]|0;c[w>>2]=m;c[w+4>>2]=((m|0)<0)<<31>>31;w=J;n=y;continue a}default:{w=J;n=y;continue a}}case 112:{t=I|8;r=r>>>0>8?r:8;u=120;L=64;break}case 88:case 120:{t=I;L=64;break}case 111:{p=ba;o=c[p>>2]|0;p=c[p+4>>2]|0;if((o|0)==0&(p|0)==0)n=N;else{n=N;do{n=n+-1|0;a[n>>0]=o&7|48;o=hk(o|0,p|0,3)|0;p=D}while(!((o|0)==0&(p|0)==0))}if(!(I&8)){o=I;t=0;s=16433;L=77}else{t=U-n+1|0;o=I;r=(r|0)<(t|0)?t:r;t=0;s=16433;L=77}break}case 105:case 100:{o=ba;n=c[o>>2]|0;o=c[o+4>>2]|0;if((o|0)<0){n=dk(0,0,n|0,o|0)|0;o=D;p=ba;c[p>>2]=n;c[p+4>>2]=o;p=1;s=16433;L=76;break f}if(!(I&2048)){s=I&1;p=s;s=(s|0)==0?16433:16435;L=76}else{p=1;s=16434;L=76}break}case 117:{o=ba;n=c[o>>2]|0;o=c[o+4>>2]|0;p=0;s=16433;L=76;break}case 99:{a[V>>0]=c[ba>>2];w=V;o=1;t=0;u=16433;n=N;break}case 109:{n=ri(c[(qi()|0)>>2]|0)|0;L=82;break}case 115:{n=c[ba>>2]|0;n=(n|0)!=0?n:16443;L=82;break}case 67:{c[ga>>2]=c[ba>>2];c[W>>2]=0;c[ba>>2]=ga;r=-1;L=86;break}case 83:{if(!r){Tj(e,32,K,0,I);n=0;L=98}else L=86;break}case 65:case 71:case 70:case 69:case 97:case 103:case 102:case 101:{q=+h[ba>>3];c[ea>>2]=0;h[k>>3]=q;if((c[k+4>>2]|0)>=0)if(!(I&2048)){H=I&1;G=H;H=(H|0)==0?16451:16456}else{G=1;H=16453}else{q=-q;G=1;H=16450}h[k>>3]=q;F=c[k+4>>2]&2146435072;do if(F>>>0<2146435072|(F|0)==2146435072&0<0){v=+Ci(q,ea)*2.0;o=v!=0.0;if(o)c[ea>>2]=(c[ea>>2]|0)+-1;C=u|32;if((C|0)==97){w=u&32;y=(w|0)==0?H:H+9|0;x=G|2;n=12-r|0;do if(!(r>>>0>11|(n|0)==0)){q=8.0;do{n=n+-1|0;q=q*16.0}while((n|0)!=0);if((a[y>>0]|0)==45){q=-(q+(-v-q));break}else{q=v+q-q;break}}else q=v;while(0);o=c[ea>>2]|0;n=(o|0)<0?0-o|0:o;n=Sj(n,((n|0)<0)<<31>>31,X)|0;if((n|0)==(X|0)){a[Y>>0]=48;n=Y}a[n+-1>>0]=(o>>31&2)+43;t=n+-2|0;a[t>>0]=u+15;s=(r|0)<1;p=(I&8|0)==0;o=da;while(1){H=~~q;n=o+1|0;a[o>>0]=d[16417+H>>0]|w;q=(q-+(H|0))*16.0;do if((n-Z|0)==1){if(p&(s&q==0.0))break;a[n>>0]=46;n=o+2|0}while(0);if(!(q!=0.0))break;else o=n}r=(r|0)!=0&(O+n|0)<(r|0)?P+r-t|0:aa-t+n|0;p=r+x|0;Tj(e,32,K,p,I);if(!(c[e>>2]&32))hj(y,x,e)|0;Tj(e,48,K,p,I^65536);n=n-Z|0;if(!(c[e>>2]&32))hj(da,n,e)|0;o=_-t|0;Tj(e,48,r-(n+o)|0,0,0);if(!(c[e>>2]&32))hj(t,o,e)|0;Tj(e,32,K,p,I^8192);n=(p|0)<(K|0)?K:p;break}n=(r|0)<0?6:r;if(o){o=(c[ea>>2]|0)+-28|0;c[ea>>2]=o;q=v*268435456.0}else{q=v;o=c[ea>>2]|0}F=(o|0)<0?ca:Q;E=F;o=F;do{B=~~q>>>0;c[o>>2]=B;o=o+4|0;q=(q-+(B>>>0))*1.0e9}while(q!=0.0);p=o;o=c[ea>>2]|0;if((o|0)>0){s=F;while(1){t=(o|0)>29?29:o;r=p+-4|0;do if(r>>>0<s>>>0)r=s;else{o=0;do{B=fk(c[r>>2]|0,0,t|0)|0;B=gk(B|0,D|0,o|0,0)|0;o=D;A=qk(B|0,o|0,1e9,0)|0;c[r>>2]=A;o=pk(B|0,o|0,1e9,0)|0;r=r+-4|0}while(r>>>0>=s>>>0);if(!o){r=s;break}r=s+-4|0;c[r>>2]=o}while(0);while(1){if(p>>>0<=r>>>0)break;o=p+-4|0;if(!(c[o>>2]|0))p=o;else break}o=(c[ea>>2]|0)-t|0;c[ea>>2]=o;if((o|0)>0)s=r;else break}}else r=F;if((o|0)<0){y=((n+25|0)/9|0)+1|0;z=(C|0)==102;w=r;while(1){x=0-o|0;x=(x|0)>9?9:x;do if(w>>>0<p>>>0){o=(1<<x)+-1|0;s=1e9>>>x;r=0;t=w;do{B=c[t>>2]|0;c[t>>2]=(B>>>x)+r;r=$(B&o,s)|0;t=t+4|0}while(t>>>0<p>>>0);o=(c[w>>2]|0)==0?w+4|0:w;if(!r){r=o;break}c[p>>2]=r;r=o;p=p+4|0}else r=(c[w>>2]|0)==0?w+4|0:w;while(0);o=z?F:r;p=(p-o>>2|0)>(y|0)?o+(y<<2)|0:p;o=(c[ea>>2]|0)+x|0;c[ea>>2]=o;if((o|0)>=0){w=r;break}else w=r}}else w=r;do if(w>>>0<p>>>0){o=(E-w>>2)*9|0;s=c[w>>2]|0;if(s>>>0<10)break;else r=10;do{r=r*10|0;o=o+1|0}while(s>>>0>=r>>>0)}else o=0;while(0);A=(C|0)==103;B=(n|0)!=0;r=n-((C|0)!=102?o:0)+((B&A)<<31>>31)|0;if((r|0)<(((p-E>>2)*9|0)+-9|0)){t=r+9216|0;z=(t|0)/9|0;r=F+(z+-1023<<2)|0;t=((t|0)%9|0)+1|0;if((t|0)<9){s=10;do{s=s*10|0;t=t+1|0}while((t|0)!=9)}else s=10;x=c[r>>2]|0;y=(x>>>0)%(s>>>0)|0;if((y|0)==0?(F+(z+-1022<<2)|0)==(p|0):0)s=w;else L=163;do if((L|0)==163){L=0;v=(((x>>>0)/(s>>>0)|0)&1|0)==0?9007199254740992.0:9007199254740994.0;t=(s|0)/2|0;do if(y>>>0<t>>>0)q=.5;else{if((y|0)==(t|0)?(F+(z+-1022<<2)|0)==(p|0):0){q=1.0;break}q=1.5}while(0);do if(G){if((a[H>>0]|0)!=45)break;v=-v;q=-q}while(0);t=x-y|0;c[r>>2]=t;if(!(v+q!=v)){s=w;break}C=t+s|0;c[r>>2]=C;if(C>>>0>999999999){o=w;while(1){s=r+-4|0;c[r>>2]=0;if(s>>>0<o>>>0){o=o+-4|0;c[o>>2]=0}C=(c[s>>2]|0)+1|0;c[s>>2]=C;if(C>>>0>999999999)r=s;else{w=o;r=s;break}}}o=(E-w>>2)*9|0;t=c[w>>2]|0;if(t>>>0<10){s=w;break}else s=10;do{s=s*10|0;o=o+1|0}while(t>>>0>=s>>>0);s=w}while(0);C=r+4|0;w=s;p=p>>>0>C>>>0?C:p}y=0-o|0;while(1){if(p>>>0<=w>>>0){z=0;C=p;break}r=p+-4|0;if(!(c[r>>2]|0))p=r;else{z=1;C=p;break}}do if(A){n=(B&1^1)+n|0;if((n|0)>(o|0)&(o|0)>-5){u=u+-1|0;n=n+-1-o|0}else{u=u+-2|0;n=n+-1|0}p=I&8;if(p)break;do if(z){p=c[C+-4>>2]|0;if(!p){r=9;break}if(!((p>>>0)%10|0)){s=10;r=0}else{r=0;break}do{s=s*10|0;r=r+1|0}while(((p>>>0)%(s>>>0)|0|0)==0)}else r=9;while(0);p=((C-E>>2)*9|0)+-9|0;if((u|32|0)==102){p=p-r|0;p=(p|0)<0?0:p;n=(n|0)<(p|0)?n:p;p=0;break}else{p=p+o-r|0;p=(p|0)<0?0:p;n=(n|0)<(p|0)?n:p;p=0;break}}else p=I&8;while(0);x=n|p;s=(x|0)!=0&1;t=(u|32|0)==102;if(t){o=(o|0)>0?o:0;u=0}else{r=(o|0)<0?y:o;r=Sj(r,((r|0)<0)<<31>>31,X)|0;if((_-r|0)<2)do{r=r+-1|0;a[r>>0]=48}while((_-r|0)<2);a[r+-1>>0]=(o>>31&2)+43;E=r+-2|0;a[E>>0]=u;o=_-E|0;u=E}y=G+1+n+s+o|0;Tj(e,32,K,y,I);if(!(c[e>>2]&32))hj(H,G,e)|0;Tj(e,48,K,y,I^65536);do if(t){r=w>>>0>F>>>0?F:w;o=r;do{p=Sj(c[o>>2]|0,0,R)|0;do if((o|0)==(r|0)){if((p|0)!=(R|0))break;a[T>>0]=48;p=T}else{if(p>>>0<=da>>>0)break;do{p=p+-1|0;a[p>>0]=48}while(p>>>0>da>>>0)}while(0);if(!(c[e>>2]&32))hj(p,S-p|0,e)|0;o=o+4|0}while(o>>>0<=F>>>0);do if(x){if(c[e>>2]&32)break;hj(16485,1,e)|0}while(0);if((n|0)>0&o>>>0<C>>>0){p=o;while(1){o=Sj(c[p>>2]|0,0,R)|0;if(o>>>0>da>>>0)do{o=o+-1|0;a[o>>0]=48}while(o>>>0>da>>>0);if(!(c[e>>2]&32))hj(o,(n|0)>9?9:n,e)|0;p=p+4|0;o=n+-9|0;if(!((n|0)>9&p>>>0<C>>>0)){n=o;break}else n=o}}Tj(e,48,n+9|0,9,0)}else{t=z?C:w+4|0;if((n|0)>-1){s=(p|0)==0;r=w;do{o=Sj(c[r>>2]|0,0,R)|0;if((o|0)==(R|0)){a[T>>0]=48;o=T}do if((r|0)==(w|0)){p=o+1|0;if(!(c[e>>2]&32))hj(o,1,e)|0;if(s&(n|0)<1){o=p;break}if(c[e>>2]&32){o=p;break}hj(16485,1,e)|0;o=p}else{if(o>>>0<=da>>>0)break;do{o=o+-1|0;a[o>>0]=48}while(o>>>0>da>>>0)}while(0);p=S-o|0;if(!(c[e>>2]&32))hj(o,(n|0)>(p|0)?p:n,e)|0;n=n-p|0;r=r+4|0}while(r>>>0<t>>>0&(n|0)>-1)}Tj(e,48,n+18|0,18,0);if(c[e>>2]&32)break;hj(u,_-u|0,e)|0}while(0);Tj(e,32,K,y,I^8192);n=(y|0)<(K|0)?K:y}else{t=(u&32|0)!=0;s=q!=q|0.0!=0.0;o=s?0:G;r=o+3|0;Tj(e,32,K,r,p);n=c[e>>2]|0;if(!(n&32)){hj(H,o,e)|0;n=c[e>>2]|0}if(!(n&32))hj(s?(t?16477:16481):t?16469:16473,3,e)|0;Tj(e,32,K,r,I^8192);n=(r|0)<(K|0)?K:r}while(0);w=J;continue a}default:{p=I;o=r;t=0;u=16433;n=N}}while(0);g:do if((L|0)==64){p=ba;o=c[p>>2]|0;p=c[p+4>>2]|0;s=u&32;if(!((o|0)==0&(p|0)==0)){n=N;do{n=n+-1|0;a[n>>0]=d[16417+(o&15)>>0]|s;o=hk(o|0,p|0,4)|0;p=D}while(!((o|0)==0&(p|0)==0));L=ba;if((t&8|0)==0|(c[L>>2]|0)==0&(c[L+4>>2]|0)==0){o=t;t=0;s=16433;L=77}else{o=t;t=2;s=16433+(u>>4)|0;L=77}}else{n=N;o=t;t=0;s=16433;L=77}}else if((L|0)==76){n=Sj(n,o,N)|0;o=I;t=p;L=77}else if((L|0)==82){L=0;I=sj(n,0,r)|0;H=(I|0)==0;w=n;o=H?r:I-n|0;t=0;u=16433;n=H?n+r|0:I}else if((L|0)==86){L=0;o=0;n=0;s=c[ba>>2]|0;while(1){p=c[s>>2]|0;if(!p)break;n=Ii(fa,p)|0;if((n|0)<0|n>>>0>(r-o|0)>>>0)break;o=n+o|0;if(r>>>0>o>>>0)s=s+4|0;else break}if((n|0)<0){m=-1;break a}Tj(e,32,K,o,I);if(!o){n=0;L=98}else{p=0;r=c[ba>>2]|0;while(1){n=c[r>>2]|0;if(!n){n=o;L=98;break g}n=Ii(fa,n)|0;p=n+p|0;if((p|0)>(o|0)){n=o;L=98;break g}if(!(c[e>>2]&32))hj(fa,n,e)|0;if(p>>>0>=o>>>0){n=o;L=98;break}else r=r+4|0}}}while(0);if((L|0)==98){L=0;Tj(e,32,K,n,I^8192);w=J;n=(K|0)>(n|0)?K:n;continue}if((L|0)==77){L=0;p=(r|0)>-1?o&-65537:o;o=ba;o=(c[o>>2]|0)!=0|(c[o+4>>2]|0)!=0;if((r|0)!=0|o){o=(o&1^1)+(U-n)|0;w=n;o=(r|0)>(o|0)?r:o;u=s;n=N}else{w=N;o=0;u=s;n=N}}s=n-w|0;o=(o|0)<(s|0)?s:o;r=t+o|0;n=(K|0)<(r|0)?r:K;Tj(e,32,n,r,p);if(!(c[e>>2]&32))hj(u,t,e)|0;Tj(e,48,n,r,p^65536);Tj(e,48,o,s,0);if(!(c[e>>2]&32))hj(w,s,e)|0;Tj(e,32,n,r,p^8192);w=J}h:do if((L|0)==245)if(!e)if(f){m=1;while(1){f=c[l+(m<<2)>>2]|0;if(!f)break;Rj(j+(m<<3)|0,f,g);m=m+1|0;if((m|0)>=10){m=1;break h}}if((m|0)<10)while(1){if(c[l+(m<<2)>>2]|0){m=-1;break h}m=m+1|0;if((m|0)>=10){m=1;break}}else m=1}else m=0;while(0);i=ha;return m|0}function Mj(a,b,c){a=a|0;b=b|0;c=c|0;return Si(a,b,c)|0}function Nj(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;p=i;i=i+240|0;o=p;c[o>>2]=a;a:do if((e|0)>1){n=0-b|0;g=e;h=a;k=a;l=1;while(1){a=h+n|0;m=g+-2|0;j=h+(0-((c[f+(m<<2)>>2]|0)+b))|0;if((cc[d&15](k,j)|0)>-1?(cc[d&15](k,a)|0)>-1:0){e=l;break a}e=l+1|0;h=o+(l<<2)|0;if((cc[d&15](j,a)|0)>-1){c[h>>2]=j;a=j;g=g+-1|0}else{c[h>>2]=a;g=m}if((g|0)<=1)break a;h=a;k=c[o>>2]|0;l=e}}else e=1;while(0);Pj(b,o,e);i=p;return}function Oj(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;r=i;i=i+240|0;p=r;k=c[e>>2]|0;e=c[e+4>>2]|0;c[p>>2]=a;o=0-b|0;a:do if((e|0)!=0|(k|0)!=1?(j=a+(0-(c[h+(f<<2)>>2]|0))|0,(cc[d&15](j,a)|0)>=1):0){g=(g|0)==0;n=j;l=k;m=e;j=1;while(1){if(g&(f|0)>1){e=c[h+(f+-2<<2)>>2]|0;if((cc[d&15](a+o|0,n)|0)>-1){g=f;e=j;q=20;break a}if((cc[d&15](a+(0-(e+b))|0,n)|0)>-1){g=f;e=j;q=20;break a}}e=j+1|0;c[p+(j<<2)>>2]=n;g=l+-1|0;do if(g){if(!(g&1)){a=g;g=0;do{g=g+1|0;a=a>>>1}while((a&1|0)==0);if(!g)q=11}else q=11;if((q|0)==11){q=0;if(!m){g=64;q=16;break}if(!(m&1)){a=m;g=0}else{k=0;a=l;j=m;g=0;break}while(1){j=g+1|0;a=a>>>1;if(a&1){a=j;break}else g=j}if(!a){k=0;a=l;j=m;g=0;break}else g=g+33|0}if(g>>>0>31)q=16;else{k=g;a=l;j=m}}else{g=32;q=16}while(0);if((q|0)==16){q=0;k=g+-32|0;a=m;j=0}l=j<<32-k|a>>>k;m=j>>>k;g=g+f|0;if(!((m|0)!=0|(l|0)!=1)){a=n;q=20;break a}a=n+(0-(c[h+(g<<2)>>2]|0))|0;if((cc[d&15](a,c[p>>2]|0)|0)<1){a=n;f=g;g=0;q=19;break}else{k=n;f=g;g=1;n=a;j=e;a=k}}}else{e=1;q=19}while(0);if((q|0)==19?(g|0)==0:0){g=f;q=20}if((q|0)==20){Pj(b,p,e);Nj(a,b,d,g,h)}i=r;return}function Pj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;h=i;i=i+256|0;e=h;a:do if((d|0)>=2?(g=b+(d<<2)|0,c[g>>2]=e,(a|0)!=0):0)while(1){f=a>>>0>256?256:a;ik(e|0,c[b>>2]|0,f|0)|0;e=0;do{j=b+(e<<2)|0;e=e+1|0;ik(c[j>>2]|0,c[b+(e<<2)>>2]|0,f|0)|0;c[j>>2]=(c[j>>2]|0)+f}while((e|0)!=(d|0));if((a|0)==(f|0))break a;a=a-f|0;e=c[g>>2]|0}while(0);i=h;return}function Qj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=a+20|0;f=c[e>>2]|0;a=(c[a+16>>2]|0)-f|0;a=a>>>0>d>>>0?d:a;ik(f|0,b|0,a|0)|0;c[e>>2]=(c[e>>2]|0)+a;return d|0}function Rj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0;a:do if(b>>>0<=20)do switch(b|0){case 9:{e=(c[d>>2]|0)+(4-1)&~(4-1);b=c[e>>2]|0;c[d>>2]=e+4;c[a>>2]=b;break a}case 10:{e=(c[d>>2]|0)+(4-1)&~(4-1);b=c[e>>2]|0;c[d>>2]=e+4;e=a;c[e>>2]=b;c[e+4>>2]=((b|0)<0)<<31>>31;break a}case 11:{e=(c[d>>2]|0)+(4-1)&~(4-1);b=c[e>>2]|0;c[d>>2]=e+4;e=a;c[e>>2]=b;c[e+4>>2]=0;break a}case 12:{e=(c[d>>2]|0)+(8-1)&~(8-1);b=e;f=c[b>>2]|0;b=c[b+4>>2]|0;c[d>>2]=e+8;e=a;c[e>>2]=f;c[e+4>>2]=b;break a}case 13:{f=(c[d>>2]|0)+(4-1)&~(4-1);e=c[f>>2]|0;c[d>>2]=f+4;e=(e&65535)<<16>>16;f=a;c[f>>2]=e;c[f+4>>2]=((e|0)<0)<<31>>31;break a}case 14:{f=(c[d>>2]|0)+(4-1)&~(4-1);e=c[f>>2]|0;c[d>>2]=f+4;f=a;c[f>>2]=e&65535;c[f+4>>2]=0;break a}case 15:{f=(c[d>>2]|0)+(4-1)&~(4-1);e=c[f>>2]|0;c[d>>2]=f+4;e=(e&255)<<24>>24;f=a;c[f>>2]=e;c[f+4>>2]=((e|0)<0)<<31>>31;break a}case 16:{f=(c[d>>2]|0)+(4-1)&~(4-1);e=c[f>>2]|0;c[d>>2]=f+4;f=a;c[f>>2]=e&255;c[f+4>>2]=0;break a}case 17:{f=(c[d>>2]|0)+(8-1)&~(8-1);g=+h[f>>3];c[d>>2]=f+8;h[a>>3]=g;break a}case 18:{f=(c[d>>2]|0)+(8-1)&~(8-1);g=+h[f>>3];c[d>>2]=f+8;h[a>>3]=g;break a}default:break a}while(0);while(0);return}function Sj(b,c,d){b=b|0;c=c|0;d=d|0;var e=0;if(c>>>0>0|(c|0)==0&b>>>0>4294967295)while(1){e=qk(b|0,c|0,10,0)|0;d=d+-1|0;a[d>>0]=e|48;e=pk(b|0,c|0,10,0)|0;if(c>>>0>9|(c|0)==9&b>>>0>4294967295){b=e;c=D}else{b=e;break}}if(b)while(1){d=d+-1|0;a[d>>0]=(b>>>0)%10|0|48;if(b>>>0<10)break;else b=(b>>>0)/10|0}return d|0}function Tj(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0;j=i;i=i+256|0;h=j;do if((d|0)>(e|0)&(f&73728|0)==0){f=d-e|0;ek(h|0,b|0,(f>>>0>256?256:f)|0)|0;b=c[a>>2]|0;g=(b&32|0)==0;if(f>>>0>255){e=d-e|0;do{if(g){hj(h,256,a)|0;b=c[a>>2]|0}f=f+-256|0;g=(b&32|0)==0}while(f>>>0>255);if(g)f=e&255;else break}else if(!g)break;hj(h,f,a)|0}while(0);i=j;return}function Uj(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0;do if(a>>>0<245){o=a>>>0<11?16:a+11&-8;a=o>>>3;i=c[756]|0;d=i>>>a;if(d&3){a=(d&1^1)+a|0;e=a<<1;d=3064+(e<<2)|0;e=3064+(e+2<<2)|0;f=c[e>>2]|0;g=f+8|0;h=c[g>>2]|0;do if((d|0)!=(h|0)){if(h>>>0<(c[760]|0)>>>0)Da();b=h+12|0;if((c[b>>2]|0)==(f|0)){c[b>>2]=d;c[e>>2]=h;break}else Da()}else c[756]=i&~(1<<a);while(0);M=a<<3;c[f+4>>2]=M|3;M=f+(M|4)|0;c[M>>2]=c[M>>2]|1;M=g;return M|0}h=c[758]|0;if(o>>>0>h>>>0){if(d){e=2<<a;e=d<<a&(e|0-e);e=(e&0-e)+-1|0;j=e>>>12&16;e=e>>>j;f=e>>>5&8;e=e>>>f;g=e>>>2&4;e=e>>>g;d=e>>>1&2;e=e>>>d;a=e>>>1&1;a=(f|j|g|d|a)+(e>>>a)|0;e=a<<1;d=3064+(e<<2)|0;e=3064+(e+2<<2)|0;g=c[e>>2]|0;j=g+8|0;f=c[j>>2]|0;do if((d|0)!=(f|0)){if(f>>>0<(c[760]|0)>>>0)Da();b=f+12|0;if((c[b>>2]|0)==(g|0)){c[b>>2]=d;c[e>>2]=f;k=c[758]|0;break}else Da()}else{c[756]=i&~(1<<a);k=h}while(0);M=a<<3;h=M-o|0;c[g+4>>2]=o|3;i=g+o|0;c[g+(o|4)>>2]=h|1;c[g+M>>2]=h;if(k){f=c[761]|0;d=k>>>3;b=d<<1;e=3064+(b<<2)|0;a=c[756]|0;d=1<<d;if(a&d){a=3064+(b+2<<2)|0;b=c[a>>2]|0;if(b>>>0<(c[760]|0)>>>0)Da();else{l=a;m=b}}else{c[756]=a|d;l=3064+(b+2<<2)|0;m=e}c[l>>2]=f;c[m+12>>2]=f;c[f+8>>2]=m;c[f+12>>2]=e}c[758]=h;c[761]=i;M=j;return M|0}a=c[757]|0;if(a){d=(a&0-a)+-1|0;L=d>>>12&16;d=d>>>L;K=d>>>5&8;d=d>>>K;M=d>>>2&4;d=d>>>M;a=d>>>1&2;d=d>>>a;e=d>>>1&1;e=c[3328+((K|L|M|a|e)+(d>>>e)<<2)>>2]|0;d=(c[e+4>>2]&-8)-o|0;a=e;while(1){b=c[a+16>>2]|0;if(!b){b=c[a+20>>2]|0;if(!b){j=d;break}}a=(c[b+4>>2]&-8)-o|0;M=a>>>0<d>>>0;d=M?a:d;a=b;e=M?b:e}g=c[760]|0;if(e>>>0<g>>>0)Da();i=e+o|0;if(e>>>0>=i>>>0)Da();h=c[e+24>>2]|0;d=c[e+12>>2]|0;do if((d|0)==(e|0)){a=e+20|0;b=c[a>>2]|0;if(!b){a=e+16|0;b=c[a>>2]|0;if(!b){n=0;break}}while(1){d=b+20|0;f=c[d>>2]|0;if(f){b=f;a=d;continue}d=b+16|0;f=c[d>>2]|0;if(!f)break;else{b=f;a=d}}if(a>>>0<g>>>0)Da();else{c[a>>2]=0;n=b;break}}else{f=c[e+8>>2]|0;if(f>>>0<g>>>0)Da();b=f+12|0;if((c[b>>2]|0)!=(e|0))Da();a=d+8|0;if((c[a>>2]|0)==(e|0)){c[b>>2]=d;c[a>>2]=f;n=d;break}else Da()}while(0);do if(h){b=c[e+28>>2]|0;a=3328+(b<<2)|0;if((e|0)==(c[a>>2]|0)){c[a>>2]=n;if(!n){c[757]=c[757]&~(1<<b);break}}else{if(h>>>0<(c[760]|0)>>>0)Da();b=h+16|0;if((c[b>>2]|0)==(e|0))c[b>>2]=n;else c[h+20>>2]=n;if(!n)break}a=c[760]|0;if(n>>>0<a>>>0)Da();c[n+24>>2]=h;b=c[e+16>>2]|0;do if(b)if(b>>>0<a>>>0)Da();else{c[n+16>>2]=b;c[b+24>>2]=n;break}while(0);b=c[e+20>>2]|0;if(b)if(b>>>0<(c[760]|0)>>>0)Da();else{c[n+20>>2]=b;c[b+24>>2]=n;break}}while(0);if(j>>>0<16){M=j+o|0;c[e+4>>2]=M|3;M=e+(M+4)|0;c[M>>2]=c[M>>2]|1}else{c[e+4>>2]=o|3;c[e+(o|4)>>2]=j|1;c[e+(j+o)>>2]=j;b=c[758]|0;if(b){g=c[761]|0;d=b>>>3;b=d<<1;f=3064+(b<<2)|0;a=c[756]|0;d=1<<d;if(a&d){b=3064+(b+2<<2)|0;a=c[b>>2]|0;if(a>>>0<(c[760]|0)>>>0)Da();else{p=b;q=a}}else{c[756]=a|d;p=3064+(b+2<<2)|0;q=f}c[p>>2]=g;c[q+12>>2]=g;c[g+8>>2]=q;c[g+12>>2]=f}c[758]=j;c[761]=i}M=e+8|0;return M|0}else q=o}else q=o}else if(a>>>0<=4294967231){a=a+11|0;m=a&-8;l=c[757]|0;if(l){d=0-m|0;a=a>>>8;if(a)if(m>>>0>16777215)k=31;else{q=(a+1048320|0)>>>16&8;v=a<<q;p=(v+520192|0)>>>16&4;v=v<<p;k=(v+245760|0)>>>16&2;k=14-(p|q|k)+(v<<k>>>15)|0;k=m>>>(k+7|0)&1|k<<1}else k=0;a=c[3328+(k<<2)>>2]|0;a:do if(!a){f=0;a=0;v=86}else{h=d;f=0;i=m<<((k|0)==31?0:25-(k>>>1)|0);j=a;a=0;while(1){g=c[j+4>>2]&-8;d=g-m|0;if(d>>>0<h>>>0)if((g|0)==(m|0)){g=j;a=j;v=90;break a}else a=j;else d=h;v=c[j+20>>2]|0;j=c[j+16+(i>>>31<<2)>>2]|0;f=(v|0)==0|(v|0)==(j|0)?f:v;if(!j){v=86;break}else{h=d;i=i<<1}}}while(0);if((v|0)==86){if((f|0)==0&(a|0)==0){a=2<<k;a=l&(a|0-a);if(!a){q=m;break}a=(a&0-a)+-1|0;n=a>>>12&16;a=a>>>n;l=a>>>5&8;a=a>>>l;p=a>>>2&4;a=a>>>p;q=a>>>1&2;a=a>>>q;f=a>>>1&1;f=c[3328+((l|n|p|q|f)+(a>>>f)<<2)>>2]|0;a=0}if(!f){i=d;j=a}else{g=f;v=90}}if((v|0)==90)while(1){v=0;q=(c[g+4>>2]&-8)-m|0;f=q>>>0<d>>>0;d=f?q:d;a=f?g:a;f=c[g+16>>2]|0;if(f){g=f;v=90;continue}g=c[g+20>>2]|0;if(!g){i=d;j=a;break}else v=90}if((j|0)!=0?i>>>0<((c[758]|0)-m|0)>>>0:0){f=c[760]|0;if(j>>>0<f>>>0)Da();h=j+m|0;if(j>>>0>=h>>>0)Da();g=c[j+24>>2]|0;d=c[j+12>>2]|0;do if((d|0)==(j|0)){a=j+20|0;b=c[a>>2]|0;if(!b){a=j+16|0;b=c[a>>2]|0;if(!b){o=0;break}}while(1){d=b+20|0;e=c[d>>2]|0;if(e){b=e;a=d;continue}d=b+16|0;e=c[d>>2]|0;if(!e)break;else{b=e;a=d}}if(a>>>0<f>>>0)Da();else{c[a>>2]=0;o=b;break}}else{e=c[j+8>>2]|0;if(e>>>0<f>>>0)Da();b=e+12|0;if((c[b>>2]|0)!=(j|0))Da();a=d+8|0;if((c[a>>2]|0)==(j|0)){c[b>>2]=d;c[a>>2]=e;o=d;break}else Da()}while(0);do if(g){b=c[j+28>>2]|0;a=3328+(b<<2)|0;if((j|0)==(c[a>>2]|0)){c[a>>2]=o;if(!o){c[757]=c[757]&~(1<<b);break}}else{if(g>>>0<(c[760]|0)>>>0)Da();b=g+16|0;if((c[b>>2]|0)==(j|0))c[b>>2]=o;else c[g+20>>2]=o;if(!o)break}a=c[760]|0;if(o>>>0<a>>>0)Da();c[o+24>>2]=g;b=c[j+16>>2]|0;do if(b)if(b>>>0<a>>>0)Da();else{c[o+16>>2]=b;c[b+24>>2]=o;break}while(0);b=c[j+20>>2]|0;if(b)if(b>>>0<(c[760]|0)>>>0)Da();else{c[o+20>>2]=b;c[b+24>>2]=o;break}}while(0);b:do if(i>>>0>=16){c[j+4>>2]=m|3;c[j+(m|4)>>2]=i|1;c[j+(i+m)>>2]=i;b=i>>>3;if(i>>>0<256){a=b<<1;e=3064+(a<<2)|0;d=c[756]|0;b=1<<b;if(d&b){b=3064+(a+2<<2)|0;a=c[b>>2]|0;if(a>>>0<(c[760]|0)>>>0)Da();else{s=b;t=a}}else{c[756]=d|b;s=3064+(a+2<<2)|0;t=e}c[s>>2]=h;c[t+12>>2]=h;c[j+(m+8)>>2]=t;c[j+(m+12)>>2]=e;break}b=i>>>8;if(b)if(i>>>0>16777215)e=31;else{L=(b+1048320|0)>>>16&8;M=b<<L;K=(M+520192|0)>>>16&4;M=M<<K;e=(M+245760|0)>>>16&2;e=14-(K|L|e)+(M<<e>>>15)|0;e=i>>>(e+7|0)&1|e<<1}else e=0;b=3328+(e<<2)|0;c[j+(m+28)>>2]=e;c[j+(m+20)>>2]=0;c[j+(m+16)>>2]=0;a=c[757]|0;d=1<<e;if(!(a&d)){c[757]=a|d;c[b>>2]=h;c[j+(m+24)>>2]=b;c[j+(m+12)>>2]=h;c[j+(m+8)>>2]=h;break}b=c[b>>2]|0;c:do if((c[b+4>>2]&-8|0)!=(i|0)){e=i<<((e|0)==31?0:25-(e>>>1)|0);while(1){a=b+16+(e>>>31<<2)|0;d=c[a>>2]|0;if(!d)break;if((c[d+4>>2]&-8|0)==(i|0)){y=d;break c}else{e=e<<1;b=d}}if(a>>>0<(c[760]|0)>>>0)Da();else{c[a>>2]=h;c[j+(m+24)>>2]=b;c[j+(m+12)>>2]=h;c[j+(m+8)>>2]=h;break b}}else y=b;while(0);b=y+8|0;a=c[b>>2]|0;M=c[760]|0;if(a>>>0>=M>>>0&y>>>0>=M>>>0){c[a+12>>2]=h;c[b>>2]=h;c[j+(m+8)>>2]=a;c[j+(m+12)>>2]=y;c[j+(m+24)>>2]=0;break}else Da()}else{M=i+m|0;c[j+4>>2]=M|3;M=j+(M+4)|0;c[M>>2]=c[M>>2]|1}while(0);M=j+8|0;return M|0}else q=m}else q=m}else q=-1;while(0);d=c[758]|0;if(d>>>0>=q>>>0){b=d-q|0;a=c[761]|0;if(b>>>0>15){c[761]=a+q;c[758]=b;c[a+(q+4)>>2]=b|1;c[a+d>>2]=b;c[a+4>>2]=q|3}else{c[758]=0;c[761]=0;c[a+4>>2]=d|3;M=a+(d+4)|0;c[M>>2]=c[M>>2]|1}M=a+8|0;return M|0}a=c[759]|0;if(a>>>0>q>>>0){L=a-q|0;c[759]=L;M=c[762]|0;c[762]=M+q;c[M+(q+4)>>2]=L|1;c[M+4>>2]=q|3;M=M+8|0;return M|0}do if(!(c[874]|0)){a=$a(30)|0;if(!(a+-1&a)){c[876]=a;c[875]=a;c[877]=-1;c[878]=-1;c[879]=0;c[867]=0;c[874]=(Db(0)|0)&-16^1431655768;break}else Da()}while(0);j=q+48|0;i=c[876]|0;k=q+47|0;h=i+k|0;i=0-i|0;l=h&i;if(l>>>0<=q>>>0){M=0;return M|0}a=c[866]|0;if((a|0)!=0?(t=c[864]|0,y=t+l|0,y>>>0<=t>>>0|y>>>0>a>>>0):0){M=0;return M|0}d:do if(!(c[867]&4)){a=c[762]|0;e:do if(a){f=3472;while(1){d=c[f>>2]|0;if(d>>>0<=a>>>0?(r=f+4|0,(d+(c[r>>2]|0)|0)>>>0>a>>>0):0){g=f;a=r;break}f=c[f+8>>2]|0;if(!f){v=174;break e}}d=h-(c[759]|0)&i;if(d>>>0<2147483647){f=Ua(d|0)|0;y=(f|0)==((c[g>>2]|0)+(c[a>>2]|0)|0);a=y?d:0;if(y){if((f|0)!=(-1|0)){w=f;p=a;v=194;break d}}else v=184}else a=0}else v=174;while(0);do if((v|0)==174){g=Ua(0)|0;if((g|0)!=(-1|0)){a=g;d=c[875]|0;f=d+-1|0;if(!(f&a))d=l;else d=l-a+(f+a&0-d)|0;a=c[864]|0;f=a+d|0;if(d>>>0>q>>>0&d>>>0<2147483647){y=c[866]|0;if((y|0)!=0?f>>>0<=a>>>0|f>>>0>y>>>0:0){a=0;break}f=Ua(d|0)|0;y=(f|0)==(g|0);a=y?d:0;if(y){w=g;p=a;v=194;break d}else v=184}else a=0}else a=0}while(0);f:do if((v|0)==184){g=0-d|0;do if(j>>>0>d>>>0&(d>>>0<2147483647&(f|0)!=(-1|0))?(u=c[876]|0,u=k-d+u&0-u,u>>>0<2147483647):0)if((Ua(u|0)|0)==(-1|0)){Ua(g|0)|0;break f}else{d=u+d|0;break}while(0);if((f|0)!=(-1|0)){w=f;p=d;v=194;break d}}while(0);c[867]=c[867]|4;v=191}else{a=0;v=191}while(0);if((((v|0)==191?l>>>0<2147483647:0)?(w=Ua(l|0)|0,x=Ua(0)|0,w>>>0<x>>>0&((w|0)!=(-1|0)&(x|0)!=(-1|0))):0)?(z=x-w|0,A=z>>>0>(q+40|0)>>>0,A):0){p=A?z:a;v=194}if((v|0)==194){a=(c[864]|0)+p|0;c[864]=a;if(a>>>0>(c[865]|0)>>>0)c[865]=a;h=c[762]|0;g:do if(h){g=3472;do{a=c[g>>2]|0;d=g+4|0;f=c[d>>2]|0;if((w|0)==(a+f|0)){B=a;C=d;D=f;E=g;v=204;break}g=c[g+8>>2]|0}while((g|0)!=0);if(((v|0)==204?(c[E+12>>2]&8|0)==0:0)?h>>>0<w>>>0&h>>>0>=B>>>0:0){c[C>>2]=D+p;M=(c[759]|0)+p|0;L=h+8|0;L=(L&7|0)==0?0:0-L&7;K=M-L|0;c[762]=h+L;c[759]=K;c[h+(L+4)>>2]=K|1;c[h+(M+4)>>2]=40;c[763]=c[878];break}a=c[760]|0;if(w>>>0<a>>>0){c[760]=w;a=w}d=w+p|0;g=3472;while(1){if((c[g>>2]|0)==(d|0)){f=g;d=g;v=212;break}g=c[g+8>>2]|0;if(!g){d=3472;break}}if((v|0)==212)if(!(c[d+12>>2]&8)){c[f>>2]=w;n=d+4|0;c[n>>2]=(c[n>>2]|0)+p;n=w+8|0;n=(n&7|0)==0?0:0-n&7;k=w+(p+8)|0;k=(k&7|0)==0?0:0-k&7;b=w+(k+p)|0;m=n+q|0;o=w+m|0;l=b-(w+n)-q|0;c[w+(n+4)>>2]=q|3;h:do if((b|0)!=(h|0)){if((b|0)==(c[761]|0)){M=(c[758]|0)+l|0;c[758]=M;c[761]=o;c[w+(m+4)>>2]=M|1;c[w+(M+m)>>2]=M;break}i=p+4|0;d=c[w+(i+k)>>2]|0;if((d&3|0)==1){j=d&-8;g=d>>>3;i:do if(d>>>0>=256){h=c[w+((k|24)+p)>>2]|0;e=c[w+(p+12+k)>>2]|0;do if((e|0)==(b|0)){f=k|16;e=w+(i+f)|0;d=c[e>>2]|0;if(!d){e=w+(f+p)|0;d=c[e>>2]|0;if(!d){J=0;break}}while(1){f=d+20|0;g=c[f>>2]|0;if(g){d=g;e=f;continue}f=d+16|0;g=c[f>>2]|0;if(!g)break;else{d=g;e=f}}if(e>>>0<a>>>0)Da();else{c[e>>2]=0;J=d;break}}else{f=c[w+((k|8)+p)>>2]|0;if(f>>>0<a>>>0)Da();a=f+12|0;if((c[a>>2]|0)!=(b|0))Da();d=e+8|0;if((c[d>>2]|0)==(b|0)){c[a>>2]=e;c[d>>2]=f;J=e;break}else Da()}while(0);if(!h)break;a=c[w+(p+28+k)>>2]|0;d=3328+(a<<2)|0;do if((b|0)!=(c[d>>2]|0)){if(h>>>0<(c[760]|0)>>>0)Da();a=h+16|0;if((c[a>>2]|0)==(b|0))c[a>>2]=J;else c[h+20>>2]=J;if(!J)break i}else{c[d>>2]=J;if(J)break;c[757]=c[757]&~(1<<a);break i}while(0);d=c[760]|0;if(J>>>0<d>>>0)Da();c[J+24>>2]=h;b=k|16;a=c[w+(b+p)>>2]|0;do if(a)if(a>>>0<d>>>0)Da();else{c[J+16>>2]=a;c[a+24>>2]=J;break}while(0);b=c[w+(i+b)>>2]|0;if(!b)break;if(b>>>0<(c[760]|0)>>>0)Da();else{c[J+20>>2]=b;c[b+24>>2]=J;break}}else{e=c[w+((k|8)+p)>>2]|0;f=c[w+(p+12+k)>>2]|0;d=3064+(g<<1<<2)|0;do if((e|0)!=(d|0)){if(e>>>0<a>>>0)Da();if((c[e+12>>2]|0)==(b|0))break;Da()}while(0);if((f|0)==(e|0)){c[756]=c[756]&~(1<<g);break}do if((f|0)==(d|0))F=f+8|0;else{if(f>>>0<a>>>0)Da();a=f+8|0;if((c[a>>2]|0)==(b|0)){F=a;break}Da()}while(0);c[e+12>>2]=f;c[F>>2]=e}while(0);b=w+((j|k)+p)|0;f=j+l|0}else f=l;b=b+4|0;c[b>>2]=c[b>>2]&-2;c[w+(m+4)>>2]=f|1;c[w+(f+m)>>2]=f;b=f>>>3;if(f>>>0<256){a=b<<1;e=3064+(a<<2)|0;d=c[756]|0;b=1<<b;do if(!(d&b)){c[756]=d|b;K=3064+(a+2<<2)|0;L=e}else{b=3064+(a+2<<2)|0;a=c[b>>2]|0;if(a>>>0>=(c[760]|0)>>>0){K=b;L=a;break}Da()}while(0);c[K>>2]=o;c[L+12>>2]=o;c[w+(m+8)>>2]=L;c[w+(m+12)>>2]=e;break}b=f>>>8;do if(!b)e=0;else{if(f>>>0>16777215){e=31;break}K=(b+1048320|0)>>>16&8;L=b<<K;J=(L+520192|0)>>>16&4;L=L<<J;e=(L+245760|0)>>>16&2;e=14-(J|K|e)+(L<<e>>>15)|0;e=f>>>(e+7|0)&1|e<<1}while(0);b=3328+(e<<2)|0;c[w+(m+28)>>2]=e;c[w+(m+20)>>2]=0;c[w+(m+16)>>2]=0;a=c[757]|0;d=1<<e;if(!(a&d)){c[757]=a|d;c[b>>2]=o;c[w+(m+24)>>2]=b;c[w+(m+12)>>2]=o;c[w+(m+8)>>2]=o;break}b=c[b>>2]|0;j:do if((c[b+4>>2]&-8|0)!=(f|0)){e=f<<((e|0)==31?0:25-(e>>>1)|0);while(1){a=b+16+(e>>>31<<2)|0;d=c[a>>2]|0;if(!d)break;if((c[d+4>>2]&-8|0)==(f|0)){M=d;break j}else{e=e<<1;b=d}}if(a>>>0<(c[760]|0)>>>0)Da();else{c[a>>2]=o;c[w+(m+24)>>2]=b;c[w+(m+12)>>2]=o;c[w+(m+8)>>2]=o;break h}}else M=b;while(0);b=M+8|0;a=c[b>>2]|0;L=c[760]|0;if(a>>>0>=L>>>0&M>>>0>=L>>>0){c[a+12>>2]=o;c[b>>2]=o;c[w+(m+8)>>2]=a;c[w+(m+12)>>2]=M;c[w+(m+24)>>2]=0;break}else Da()}else{M=(c[759]|0)+l|0;c[759]=M;c[762]=o;c[w+(m+4)>>2]=M|1}while(0);M=w+(n|8)|0;return M|0}else d=3472;while(1){a=c[d>>2]|0;if(a>>>0<=h>>>0?(b=c[d+4>>2]|0,e=a+b|0,e>>>0>h>>>0):0)break;d=c[d+8>>2]|0}f=a+(b+-39)|0;a=a+(b+-47+((f&7|0)==0?0:0-f&7))|0;f=h+16|0;a=a>>>0<f>>>0?h:a;b=a+8|0;d=w+8|0;d=(d&7|0)==0?0:0-d&7;M=p+-40-d|0;c[762]=w+d;c[759]=M;c[w+(d+4)>>2]=M|1;c[w+(p+-36)>>2]=40;c[763]=c[878];d=a+4|0;c[d>>2]=27;c[b>>2]=c[868];c[b+4>>2]=c[869];c[b+8>>2]=c[870];c[b+12>>2]=c[871];c[868]=w;c[869]=p;c[871]=0;c[870]=b;b=a+28|0;c[b>>2]=7;if((a+32|0)>>>0<e>>>0)do{M=b;b=b+4|0;c[b>>2]=7}while((M+8|0)>>>0<e>>>0);if((a|0)!=(h|0)){g=a-h|0;c[d>>2]=c[d>>2]&-2;c[h+4>>2]=g|1;c[a>>2]=g;b=g>>>3;if(g>>>0<256){a=b<<1;e=3064+(a<<2)|0;d=c[756]|0;b=1<<b;if(d&b){b=3064+(a+2<<2)|0;a=c[b>>2]|0;if(a>>>0<(c[760]|0)>>>0)Da();else{G=b;H=a}}else{c[756]=d|b;G=3064+(a+2<<2)|0;H=e}c[G>>2]=h;c[H+12>>2]=h;c[h+8>>2]=H;c[h+12>>2]=e;break}b=g>>>8;if(b)if(g>>>0>16777215)e=31;else{L=(b+1048320|0)>>>16&8;M=b<<L;K=(M+520192|0)>>>16&4;M=M<<K;e=(M+245760|0)>>>16&2;e=14-(K|L|e)+(M<<e>>>15)|0;e=g>>>(e+7|0)&1|e<<1}else e=0;d=3328+(e<<2)|0;c[h+28>>2]=e;c[h+20>>2]=0;c[f>>2]=0;b=c[757]|0;a=1<<e;if(!(b&a)){c[757]=b|a;c[d>>2]=h;c[h+24>>2]=d;c[h+12>>2]=h;c[h+8>>2]=h;break}b=c[d>>2]|0;k:do if((c[b+4>>2]&-8|0)!=(g|0)){e=g<<((e|0)==31?0:25-(e>>>1)|0);while(1){a=b+16+(e>>>31<<2)|0;d=c[a>>2]|0;if(!d)break;if((c[d+4>>2]&-8|0)==(g|0)){I=d;break k}else{e=e<<1;b=d}}if(a>>>0<(c[760]|0)>>>0)Da();else{c[a>>2]=h;c[h+24>>2]=b;c[h+12>>2]=h;c[h+8>>2]=h;break g}}else I=b;while(0);b=I+8|0;a=c[b>>2]|0;M=c[760]|0;if(a>>>0>=M>>>0&I>>>0>=M>>>0){c[a+12>>2]=h;c[b>>2]=h;c[h+8>>2]=a;c[h+12>>2]=I;c[h+24>>2]=0;break}else Da()}}else{M=c[760]|0;if((M|0)==0|w>>>0<M>>>0)c[760]=w;c[868]=w;c[869]=p;c[871]=0;c[765]=c[874];c[764]=-1;b=0;do{M=b<<1;L=3064+(M<<2)|0;c[3064+(M+3<<2)>>2]=L;c[3064+(M+2<<2)>>2]=L;b=b+1|0}while((b|0)!=32);M=w+8|0;M=(M&7|0)==0?0:0-M&7;L=p+-40-M|0;c[762]=w+M;c[759]=L;c[w+(M+4)>>2]=L|1;c[w+(p+-36)>>2]=40;c[763]=c[878]}while(0);b=c[759]|0;if(b>>>0>q>>>0){L=b-q|0;c[759]=L;M=c[762]|0;c[762]=M+q;c[M+(q+4)>>2]=L|1;c[M+4>>2]=q|3;M=M+8|0;return M|0}}c[(qi()|0)>>2]=12;M=0;return M|0}function Vj(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;if(!a)return;b=a+-8|0;i=c[760]|0;if(b>>>0<i>>>0)Da();d=c[a+-4>>2]|0;e=d&3;if((e|0)==1)Da();o=d&-8;q=a+(o+-8)|0;do if(!(d&1)){b=c[b>>2]|0;if(!e)return;j=-8-b|0;l=a+j|0;m=b+o|0;if(l>>>0<i>>>0)Da();if((l|0)==(c[761]|0)){b=a+(o+-4)|0;d=c[b>>2]|0;if((d&3|0)!=3){u=l;g=m;break}c[758]=m;c[b>>2]=d&-2;c[a+(j+4)>>2]=m|1;c[q>>2]=m;return}f=b>>>3;if(b>>>0<256){e=c[a+(j+8)>>2]|0;d=c[a+(j+12)>>2]|0;b=3064+(f<<1<<2)|0;if((e|0)!=(b|0)){if(e>>>0<i>>>0)Da();if((c[e+12>>2]|0)!=(l|0))Da()}if((d|0)==(e|0)){c[756]=c[756]&~(1<<f);u=l;g=m;break}if((d|0)!=(b|0)){if(d>>>0<i>>>0)Da();b=d+8|0;if((c[b>>2]|0)==(l|0))h=b;else Da()}else h=d+8|0;c[e+12>>2]=d;c[h>>2]=e;u=l;g=m;break}h=c[a+(j+24)>>2]|0;e=c[a+(j+12)>>2]|0;do if((e|0)==(l|0)){d=a+(j+20)|0;b=c[d>>2]|0;if(!b){d=a+(j+16)|0;b=c[d>>2]|0;if(!b){k=0;break}}while(1){e=b+20|0;f=c[e>>2]|0;if(f){b=f;d=e;continue}e=b+16|0;f=c[e>>2]|0;if(!f)break;else{b=f;d=e}}if(d>>>0<i>>>0)Da();else{c[d>>2]=0;k=b;break}}else{f=c[a+(j+8)>>2]|0;if(f>>>0<i>>>0)Da();b=f+12|0;if((c[b>>2]|0)!=(l|0))Da();d=e+8|0;if((c[d>>2]|0)==(l|0)){c[b>>2]=e;c[d>>2]=f;k=e;break}else Da()}while(0);if(h){b=c[a+(j+28)>>2]|0;d=3328+(b<<2)|0;if((l|0)==(c[d>>2]|0)){c[d>>2]=k;if(!k){c[757]=c[757]&~(1<<b);u=l;g=m;break}}else{if(h>>>0<(c[760]|0)>>>0)Da();b=h+16|0;if((c[b>>2]|0)==(l|0))c[b>>2]=k;else c[h+20>>2]=k;if(!k){u=l;g=m;break}}d=c[760]|0;if(k>>>0<d>>>0)Da();c[k+24>>2]=h;b=c[a+(j+16)>>2]|0;do if(b)if(b>>>0<d>>>0)Da();else{c[k+16>>2]=b;c[b+24>>2]=k;break}while(0);b=c[a+(j+20)>>2]|0;if(b)if(b>>>0<(c[760]|0)>>>0)Da();else{c[k+20>>2]=b;c[b+24>>2]=k;u=l;g=m;break}else{u=l;g=m}}else{u=l;g=m}}else{u=b;g=o}while(0);if(u>>>0>=q>>>0)Da();b=a+(o+-4)|0;d=c[b>>2]|0;if(!(d&1))Da();if(!(d&2)){if((q|0)==(c[762]|0)){t=(c[759]|0)+g|0;c[759]=t;c[762]=u;c[u+4>>2]=t|1;if((u|0)!=(c[761]|0))return;c[761]=0;c[758]=0;return}if((q|0)==(c[761]|0)){t=(c[758]|0)+g|0;c[758]=t;c[761]=u;c[u+4>>2]=t|1;c[u+t>>2]=t;return}g=(d&-8)+g|0;f=d>>>3;do if(d>>>0>=256){h=c[a+(o+16)>>2]|0;b=c[a+(o|4)>>2]|0;do if((b|0)==(q|0)){d=a+(o+12)|0;b=c[d>>2]|0;if(!b){d=a+(o+8)|0;b=c[d>>2]|0;if(!b){p=0;break}}while(1){e=b+20|0;f=c[e>>2]|0;if(f){b=f;d=e;continue}e=b+16|0;f=c[e>>2]|0;if(!f)break;else{b=f;d=e}}if(d>>>0<(c[760]|0)>>>0)Da();else{c[d>>2]=0;p=b;break}}else{d=c[a+o>>2]|0;if(d>>>0<(c[760]|0)>>>0)Da();e=d+12|0;if((c[e>>2]|0)!=(q|0))Da();f=b+8|0;if((c[f>>2]|0)==(q|0)){c[e>>2]=b;c[f>>2]=d;p=b;break}else Da()}while(0);if(h){b=c[a+(o+20)>>2]|0;d=3328+(b<<2)|0;if((q|0)==(c[d>>2]|0)){c[d>>2]=p;if(!p){c[757]=c[757]&~(1<<b);break}}else{if(h>>>0<(c[760]|0)>>>0)Da();b=h+16|0;if((c[b>>2]|0)==(q|0))c[b>>2]=p;else c[h+20>>2]=p;if(!p)break}d=c[760]|0;if(p>>>0<d>>>0)Da();c[p+24>>2]=h;b=c[a+(o+8)>>2]|0;do if(b)if(b>>>0<d>>>0)Da();else{c[p+16>>2]=b;c[b+24>>2]=p;break}while(0);b=c[a+(o+12)>>2]|0;if(b)if(b>>>0<(c[760]|0)>>>0)Da();else{c[p+20>>2]=b;c[b+24>>2]=p;break}}}else{e=c[a+o>>2]|0;d=c[a+(o|4)>>2]|0;b=3064+(f<<1<<2)|0;if((e|0)!=(b|0)){if(e>>>0<(c[760]|0)>>>0)Da();if((c[e+12>>2]|0)!=(q|0))Da()}if((d|0)==(e|0)){c[756]=c[756]&~(1<<f);break}if((d|0)!=(b|0)){if(d>>>0<(c[760]|0)>>>0)Da();b=d+8|0;if((c[b>>2]|0)==(q|0))n=b;else Da()}else n=d+8|0;c[e+12>>2]=d;c[n>>2]=e}while(0);c[u+4>>2]=g|1;c[u+g>>2]=g;if((u|0)==(c[761]|0)){c[758]=g;return}}else{c[b>>2]=d&-2;c[u+4>>2]=g|1;c[u+g>>2]=g}b=g>>>3;if(g>>>0<256){d=b<<1;f=3064+(d<<2)|0;e=c[756]|0;b=1<<b;if(e&b){b=3064+(d+2<<2)|0;d=c[b>>2]|0;if(d>>>0<(c[760]|0)>>>0)Da();else{r=b;s=d}}else{c[756]=e|b;r=3064+(d+2<<2)|0;s=f}c[r>>2]=u;c[s+12>>2]=u;c[u+8>>2]=s;c[u+12>>2]=f;return}b=g>>>8;if(b)if(g>>>0>16777215)f=31;else{r=(b+1048320|0)>>>16&8;s=b<<r;q=(s+520192|0)>>>16&4;s=s<<q;f=(s+245760|0)>>>16&2;f=14-(q|r|f)+(s<<f>>>15)|0;f=g>>>(f+7|0)&1|f<<1}else f=0;b=3328+(f<<2)|0;c[u+28>>2]=f;c[u+20>>2]=0;c[u+16>>2]=0;d=c[757]|0;e=1<<f;a:do if(d&e){b=c[b>>2]|0;b:do if((c[b+4>>2]&-8|0)!=(g|0)){f=g<<((f|0)==31?0:25-(f>>>1)|0);while(1){d=b+16+(f>>>31<<2)|0;e=c[d>>2]|0;if(!e)break;if((c[e+4>>2]&-8|0)==(g|0)){t=e;break b}else{f=f<<1;b=e}}if(d>>>0<(c[760]|0)>>>0)Da();else{c[d>>2]=u;c[u+24>>2]=b;c[u+12>>2]=u;c[u+8>>2]=u;break a}}else t=b;while(0);b=t+8|0;d=c[b>>2]|0;s=c[760]|0;if(d>>>0>=s>>>0&t>>>0>=s>>>0){c[d+12>>2]=u;c[b>>2]=u;c[u+8>>2]=d;c[u+12>>2]=t;c[u+24>>2]=0;break}else Da()}else{c[757]=d|e;c[b>>2]=u;c[u+24>>2]=b;c[u+12>>2]=u;c[u+8>>2]=u}while(0);u=(c[764]|0)+-1|0;c[764]=u;if(!u)b=3480;else return;while(1){b=c[b>>2]|0;if(!b)break;else b=b+8|0}c[764]=-1;return}function Wj(a,b){a=a|0;b=b|0;var d=0;if(a){d=$(b,a)|0;if((b|a)>>>0>65535)d=((d>>>0)/(a>>>0)|0|0)==(b|0)?d:-1}else d=0;b=Uj(d)|0;if(!b)return b|0;if(!(c[b+-4>>2]&3))return b|0;ek(b|0,0,d|0)|0;return b|0}function Xj(a,b){a=a|0;b=b|0;var d=0,e=0;if(!a){a=Uj(b)|0;return a|0}if(b>>>0>4294967231){c[(qi()|0)>>2]=12;a=0;return a|0}d=Yj(a+-8|0,b>>>0<11?16:b+11&-8)|0;if(d){a=d+8|0;return a|0}d=Uj(b)|0;if(!d){a=0;return a|0}e=c[a+-4>>2]|0;e=(e&-8)-((e&3|0)==0?8:4)|0;ik(d|0,a|0,(e>>>0<b>>>0?e:b)|0)|0;Vj(a);a=d;return a|0}function Yj(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;o=a+4|0;p=c[o>>2]|0;j=p&-8;l=a+j|0;i=c[760]|0;d=p&3;if(!((d|0)!=1&a>>>0>=i>>>0&a>>>0<l>>>0))Da();e=a+(j|4)|0;f=c[e>>2]|0;if(!(f&1))Da();if(!d){if(b>>>0<256){a=0;return a|0}if(j>>>0>=(b+4|0)>>>0?(j-b|0)>>>0<=c[876]<<1>>>0:0)return a|0;a=0;return a|0}if(j>>>0>=b>>>0){d=j-b|0;if(d>>>0<=15)return a|0;c[o>>2]=p&1|b|2;c[a+(b+4)>>2]=d|3;c[e>>2]=c[e>>2]|1;Zj(a+b|0,d);return a|0}if((l|0)==(c[762]|0)){d=(c[759]|0)+j|0;if(d>>>0<=b>>>0){a=0;return a|0}n=d-b|0;c[o>>2]=p&1|b|2;c[a+(b+4)>>2]=n|1;c[762]=a+b;c[759]=n;return a|0}if((l|0)==(c[761]|0)){e=(c[758]|0)+j|0;if(e>>>0<b>>>0){a=0;return a|0}d=e-b|0;if(d>>>0>15){c[o>>2]=p&1|b|2;c[a+(b+4)>>2]=d|1;c[a+e>>2]=d;e=a+(e+4)|0;c[e>>2]=c[e>>2]&-2;e=a+b|0}else{c[o>>2]=p&1|e|2;e=a+(e+4)|0;c[e>>2]=c[e>>2]|1;e=0;d=0}c[758]=d;c[761]=e;return a|0}if(f&2){a=0;return a|0}m=(f&-8)+j|0;if(m>>>0<b>>>0){a=0;return a|0}n=m-b|0;g=f>>>3;do if(f>>>0>=256){h=c[a+(j+24)>>2]|0;g=c[a+(j+12)>>2]|0;do if((g|0)==(l|0)){e=a+(j+20)|0;d=c[e>>2]|0;if(!d){e=a+(j+16)|0;d=c[e>>2]|0;if(!d){k=0;break}}while(1){f=d+20|0;g=c[f>>2]|0;if(g){d=g;e=f;continue}f=d+16|0;g=c[f>>2]|0;if(!g)break;else{d=g;e=f}}if(e>>>0<i>>>0)Da();else{c[e>>2]=0;k=d;break}}else{f=c[a+(j+8)>>2]|0;if(f>>>0<i>>>0)Da();d=f+12|0;if((c[d>>2]|0)!=(l|0))Da();e=g+8|0;if((c[e>>2]|0)==(l|0)){c[d>>2]=g;c[e>>2]=f;k=g;break}else Da()}while(0);if(h){d=c[a+(j+28)>>2]|0;e=3328+(d<<2)|0;if((l|0)==(c[e>>2]|0)){c[e>>2]=k;if(!k){c[757]=c[757]&~(1<<d);break}}else{if(h>>>0<(c[760]|0)>>>0)Da();d=h+16|0;if((c[d>>2]|0)==(l|0))c[d>>2]=k;else c[h+20>>2]=k;if(!k)break}e=c[760]|0;if(k>>>0<e>>>0)Da();c[k+24>>2]=h;d=c[a+(j+16)>>2]|0;do if(d)if(d>>>0<e>>>0)Da();else{c[k+16>>2]=d;c[d+24>>2]=k;break}while(0);d=c[a+(j+20)>>2]|0;if(d)if(d>>>0<(c[760]|0)>>>0)Da();else{c[k+20>>2]=d;c[d+24>>2]=k;break}}}else{f=c[a+(j+8)>>2]|0;e=c[a+(j+12)>>2]|0;d=3064+(g<<1<<2)|0;if((f|0)!=(d|0)){if(f>>>0<i>>>0)Da();if((c[f+12>>2]|0)!=(l|0))Da()}if((e|0)==(f|0)){c[756]=c[756]&~(1<<g);break}if((e|0)!=(d|0)){if(e>>>0<i>>>0)Da();d=e+8|0;if((c[d>>2]|0)==(l|0))h=d;else Da()}else h=e+8|0;c[f+12>>2]=e;c[h>>2]=f}while(0);if(n>>>0<16){c[o>>2]=m|p&1|2;b=a+(m|4)|0;c[b>>2]=c[b>>2]|1;return a|0}else{c[o>>2]=p&1|b|2;c[a+(b+4)>>2]=n|3;p=a+(m|4)|0;c[p>>2]=c[p>>2]|1;Zj(a+b|0,n);return a|0}return 0}function Zj(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;q=a+b|0;d=c[a+4>>2]|0;do if(!(d&1)){k=c[a>>2]|0;if(!(d&3))return;n=a+(0-k)|0;m=k+b|0;j=c[760]|0;if(n>>>0<j>>>0)Da();if((n|0)==(c[761]|0)){e=a+(b+4)|0;d=c[e>>2]|0;if((d&3|0)!=3){t=n;h=m;break}c[758]=m;c[e>>2]=d&-2;c[a+(4-k)>>2]=m|1;c[q>>2]=m;return}g=k>>>3;if(k>>>0<256){f=c[a+(8-k)>>2]|0;e=c[a+(12-k)>>2]|0;d=3064+(g<<1<<2)|0;if((f|0)!=(d|0)){if(f>>>0<j>>>0)Da();if((c[f+12>>2]|0)!=(n|0))Da()}if((e|0)==(f|0)){c[756]=c[756]&~(1<<g);t=n;h=m;break}if((e|0)!=(d|0)){if(e>>>0<j>>>0)Da();d=e+8|0;if((c[d>>2]|0)==(n|0))i=d;else Da()}else i=e+8|0;c[f+12>>2]=e;c[i>>2]=f;t=n;h=m;break}i=c[a+(24-k)>>2]|0;f=c[a+(12-k)>>2]|0;do if((f|0)==(n|0)){f=16-k|0;e=a+(f+4)|0;d=c[e>>2]|0;if(!d){e=a+f|0;d=c[e>>2]|0;if(!d){l=0;break}}while(1){f=d+20|0;g=c[f>>2]|0;if(g){d=g;e=f;continue}f=d+16|0;g=c[f>>2]|0;if(!g)break;else{d=g;e=f}}if(e>>>0<j>>>0)Da();else{c[e>>2]=0;l=d;break}}else{g=c[a+(8-k)>>2]|0;if(g>>>0<j>>>0)Da();d=g+12|0;if((c[d>>2]|0)!=(n|0))Da();e=f+8|0;if((c[e>>2]|0)==(n|0)){c[d>>2]=f;c[e>>2]=g;l=f;break}else Da()}while(0);if(i){d=c[a+(28-k)>>2]|0;e=3328+(d<<2)|0;if((n|0)==(c[e>>2]|0)){c[e>>2]=l;if(!l){c[757]=c[757]&~(1<<d);t=n;h=m;break}}else{if(i>>>0<(c[760]|0)>>>0)Da();d=i+16|0;if((c[d>>2]|0)==(n|0))c[d>>2]=l;else c[i+20>>2]=l;if(!l){t=n;h=m;break}}f=c[760]|0;if(l>>>0<f>>>0)Da();c[l+24>>2]=i;d=16-k|0;e=c[a+d>>2]|0;do if(e)if(e>>>0<f>>>0)Da();else{c[l+16>>2]=e;c[e+24>>2]=l;break}while(0);d=c[a+(d+4)>>2]|0;if(d)if(d>>>0<(c[760]|0)>>>0)Da();else{c[l+20>>2]=d;c[d+24>>2]=l;t=n;h=m;break}else{t=n;h=m}}else{t=n;h=m}}else{t=a;h=b}while(0);j=c[760]|0;if(q>>>0<j>>>0)Da();d=a+(b+4)|0;e=c[d>>2]|0;if(!(e&2)){if((q|0)==(c[762]|0)){s=(c[759]|0)+h|0;c[759]=s;c[762]=t;c[t+4>>2]=s|1;if((t|0)!=(c[761]|0))return;c[761]=0;c[758]=0;return}if((q|0)==(c[761]|0)){s=(c[758]|0)+h|0;c[758]=s;c[761]=t;c[t+4>>2]=s|1;c[t+s>>2]=s;return}h=(e&-8)+h|0;g=e>>>3;do if(e>>>0>=256){i=c[a+(b+24)>>2]|0;f=c[a+(b+12)>>2]|0;do if((f|0)==(q|0)){e=a+(b+20)|0;d=c[e>>2]|0;if(!d){e=a+(b+16)|0;d=c[e>>2]|0;if(!d){p=0;break}}while(1){f=d+20|0;g=c[f>>2]|0;if(g){d=g;e=f;continue}f=d+16|0;g=c[f>>2]|0;if(!g)break;else{d=g;e=f}}if(e>>>0<j>>>0)Da();else{c[e>>2]=0;p=d;break}}else{g=c[a+(b+8)>>2]|0;if(g>>>0<j>>>0)Da();d=g+12|0;if((c[d>>2]|0)!=(q|0))Da();e=f+8|0;if((c[e>>2]|0)==(q|0)){c[d>>2]=f;c[e>>2]=g;p=f;break}else Da()}while(0);if(i){d=c[a+(b+28)>>2]|0;e=3328+(d<<2)|0;if((q|0)==(c[e>>2]|0)){c[e>>2]=p;if(!p){c[757]=c[757]&~(1<<d);break}}else{if(i>>>0<(c[760]|0)>>>0)Da();d=i+16|0;if((c[d>>2]|0)==(q|0))c[d>>2]=p;else c[i+20>>2]=p;if(!p)break}e=c[760]|0;if(p>>>0<e>>>0)Da();c[p+24>>2]=i;d=c[a+(b+16)>>2]|0;do if(d)if(d>>>0<e>>>0)Da();else{c[p+16>>2]=d;c[d+24>>2]=p;break}while(0);d=c[a+(b+20)>>2]|0;if(d)if(d>>>0<(c[760]|0)>>>0)Da();else{c[p+20>>2]=d;c[d+24>>2]=p;break}}}else{f=c[a+(b+8)>>2]|0;e=c[a+(b+12)>>2]|0;d=3064+(g<<1<<2)|0;if((f|0)!=(d|0)){if(f>>>0<j>>>0)Da();if((c[f+12>>2]|0)!=(q|0))Da()}if((e|0)==(f|0)){c[756]=c[756]&~(1<<g);break}if((e|0)!=(d|0)){if(e>>>0<j>>>0)Da();d=e+8|0;if((c[d>>2]|0)==(q|0))o=d;else Da()}else o=e+8|0;c[f+12>>2]=e;c[o>>2]=f}while(0);c[t+4>>2]=h|1;c[t+h>>2]=h;if((t|0)==(c[761]|0)){c[758]=h;return}}else{c[d>>2]=e&-2;c[t+4>>2]=h|1;c[t+h>>2]=h}d=h>>>3;if(h>>>0<256){e=d<<1;g=3064+(e<<2)|0;f=c[756]|0;d=1<<d;if(f&d){d=3064+(e+2<<2)|0;e=c[d>>2]|0;if(e>>>0<(c[760]|0)>>>0)Da();else{r=d;s=e}}else{c[756]=f|d;r=3064+(e+2<<2)|0;s=g}c[r>>2]=t;c[s+12>>2]=t;c[t+8>>2]=s;c[t+12>>2]=g;return}d=h>>>8;if(d)if(h>>>0>16777215)g=31;else{r=(d+1048320|0)>>>16&8;s=d<<r;q=(s+520192|0)>>>16&4;s=s<<q;g=(s+245760|0)>>>16&2;g=14-(q|r|g)+(s<<g>>>15)|0;g=h>>>(g+7|0)&1|g<<1}else g=0;d=3328+(g<<2)|0;c[t+28>>2]=g;c[t+20>>2]=0;c[t+16>>2]=0;e=c[757]|0;f=1<<g;if(!(e&f)){c[757]=e|f;c[d>>2]=t;c[t+24>>2]=d;c[t+12>>2]=t;c[t+8>>2]=t;return}d=c[d>>2]|0;a:do if((c[d+4>>2]&-8|0)!=(h|0)){g=h<<((g|0)==31?0:25-(g>>>1)|0);while(1){e=d+16+(g>>>31<<2)|0;f=c[e>>2]|0;if(!f)break;if((c[f+4>>2]&-8|0)==(h|0)){d=f;break a}else{g=g<<1;d=f}}if(e>>>0<(c[760]|0)>>>0)Da();c[e>>2]=t;c[t+24>>2]=d;c[t+12>>2]=t;c[t+8>>2]=t;return}while(0);e=d+8|0;f=c[e>>2]|0;s=c[760]|0;if(!(f>>>0>=s>>>0&d>>>0>=s>>>0))Da();c[f+12>>2]=t;c[e>>2]=t;c[t+8>>2]=f;c[t+12>>2]=d;c[t+24>>2]=0;return} +function Ee(b,e,f,j,k,l,m,n,o,p,q,r){b=b|0;e=e|0;f=f|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;p=p|0;q=+q;r=r|0;var s=0,t=0,u=0.0,v=0.0,w=0,x=0,y=0.0,z=0.0,A=0.0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0.0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0,Z=0;T=i;i=i+240|0;x=T+224|0;w=T+216|0;C=T+208|0;B=T+200|0;s=T+136|0;N=T+72|0;P=T;Q=T+232|0;R=T+228|0;h[s>>3]=100.0;h[s+8>>3]=100.0;h[s+16>>3]=110.0;h[s+24>>3]=100.0;h[s+32>>3]=110.0;h[s+40>>3]=110.0;h[s+48>>3]=100.0;h[s+56>>3]=110.0;h[N>>3]=+h[p>>3];h[N+8>>3]=+h[p+8>>3];h[N+16>>3]=+h[p+16>>3];h[N+24>>3]=+h[p+24>>3];h[N+32>>3]=+h[p+32>>3];h[N+40>>3]=+h[p+40>>3];h[N+48>>3]=+h[p+48>>3];h[N+56>>3]=+h[p+56>>3];He(s,N,P);A=+h[N>>3];V=+h[N+16>>3];y=A-V;J=+h[N+8>>3];U=+h[N+24>>3];u=J-U;s=~~(y*y+u*u);u=+h[N+32>>3];y=+h[N+48>>3];X=u-y;v=+h[N+40>>3];z=+h[N+56>>3];W=v-z;N=~~(X*X+W*W);u=V-u;v=U-v;t=~~(u*u+v*v);A=y-A;J=z-J;O=~~(A*A+J*J);s=~~(+(((N|0)>(s|0)?N:s)|0)*q*q);t=~~(+(((O|0)>(t|0)?O:t)|0)*q*q);if(!b){p=f;while(1)if((p|0)<(j|0)&($(p,p)|0)<(s|0))p=p<<1;else break;s=f;while(1)if((s|0)<(j|0)&($(s,s)|0)<(t|0))s=s<<1;else break}else{p=f;while(1)if((p|0)<(j|0)&($(p<<2,p)|0)<(s|0))p=p<<1;else break;s=f;while(1)if((s|0)<(j|0)&($(s<<2,s)|0)<(t|0))s=s<<1;else break}O=(p|0)>(j|0)?j:p;M=(s|0)>(j|0)?j:s;L=(O|0)/(f|0)|0;K=(M|0)/(f|0)|0;u=(1.0-q)*.5*10.0;J=q*10.0;N=$(f,f)|0;a:do if(!e){I=N*3|0;p=Wj(I,4)|0;if(!p){Me(3,5472,B);rb(1)}do switch(n|0){case 0:{y=u+100.0;z=+(M|0);A=+(O|0);B=P+48|0;C=P+56|0;n=P+64|0;D=P+8|0;E=P+16|0;F=P+24|0;G=P+32|0;H=P+40|0;j=(b|0)==1;if((M|0)>0){e=(O|0)>0;x=0;do{v=y+J*(+(x|0)+.5)/z;if(e){w=0;do{u=y+J*(+(w|0)+.5)/A;q=+h[n>>3]+(+h[B>>3]*u+v*+h[C>>3]);if(q==0.0){S=278;break a}X=(+h[E>>3]+(u*+h[P>>3]+v*+h[D>>3]))/q;g[Q>>2]=X;u=(+h[H>>3]+(u*+h[F>>3]+v*+h[G>>3]))/q;g[R>>2]=u;lf(o,X,u,Q,R)|0;u=+g[Q>>2];if(j){s=((~~(u+1.0)|0)/2|0)<<1;t=((~~(+g[R>>2]+1.0)|0)/2|0)<<1}else{s=~~(u+.5);t=~~(+g[R>>2]+.5)}if((s|0)>-1?(t|0)<(m|0)&((t|0)>-1&(s|0)<(l|0)):0){t=(($(t,l)|0)+s|0)*3|0;b=(($((x|0)/(K|0)|0,f)|0)+((w|0)/(L|0)|0)|0)*3|0;s=p+(b<<2)|0;c[s>>2]=(c[s>>2]|0)+(d[k+(t+2)>>0]|0);s=p+(b+1<<2)|0;c[s>>2]=(c[s>>2]|0)+(d[k+(t+1)>>0]|0);b=p+(b+2<<2)|0;c[b>>2]=(c[b>>2]|0)+(d[k+t>>0]|0)}w=w+1|0}while((w|0)<(O|0))}x=x+1|0}while((x|0)<(M|0))}break}case 1:{y=u+100.0;z=+(M|0);A=+(O|0);B=P+48|0;C=P+56|0;n=P+64|0;D=P+8|0;E=P+16|0;F=P+24|0;G=P+32|0;H=P+40|0;j=(b|0)==1;if((M|0)>0){e=(O|0)>0;x=0;do{v=y+J*(+(x|0)+.5)/z;if(e){w=0;do{u=y+J*(+(w|0)+.5)/A;q=+h[n>>3]+(+h[B>>3]*u+v*+h[C>>3]);if(q==0.0){S=278;break a}X=(+h[E>>3]+(u*+h[P>>3]+v*+h[D>>3]))/q;g[Q>>2]=X;u=(+h[H>>3]+(u*+h[F>>3]+v*+h[G>>3]))/q;g[R>>2]=u;lf(o,X,u,Q,R)|0;u=+g[Q>>2];if(j){s=((~~(u+1.0)|0)/2|0)<<1;t=((~~(+g[R>>2]+1.0)|0)/2|0)<<1}else{s=~~(u+.5);t=~~(+g[R>>2]+.5)}if((s|0)>-1?(t|0)<(m|0)&((t|0)>-1&(s|0)<(l|0)):0){t=(($(t,l)|0)+s|0)*3|0;b=(($((x|0)/(K|0)|0,f)|0)+((w|0)/(L|0)|0)|0)*3|0;s=p+(b<<2)|0;c[s>>2]=(c[s>>2]|0)+(d[k+t>>0]|0);s=p+(b+1<<2)|0;c[s>>2]=(c[s>>2]|0)+(d[k+(t+1)>>0]|0);b=p+(b+2<<2)|0;c[b>>2]=(c[b>>2]|0)+(d[k+(t+2)>>0]|0)}w=w+1|0}while((w|0)<(O|0))}x=x+1|0}while((x|0)<(M|0))}break}case 2:{y=u+100.0;z=+(M|0);A=+(O|0);B=P+48|0;C=P+56|0;n=P+64|0;D=P+8|0;E=P+16|0;F=P+24|0;G=P+32|0;H=P+40|0;j=(b|0)==1;if((M|0)>0){e=(O|0)>0;x=0;do{v=y+J*(+(x|0)+.5)/z;if(e){w=0;do{u=y+J*(+(w|0)+.5)/A;q=+h[n>>3]+(+h[B>>3]*u+v*+h[C>>3]);if(q==0.0){S=278;break a}X=(+h[E>>3]+(u*+h[P>>3]+v*+h[D>>3]))/q;g[Q>>2]=X;u=(+h[H>>3]+(u*+h[F>>3]+v*+h[G>>3]))/q;g[R>>2]=u;lf(o,X,u,Q,R)|0;u=+g[Q>>2];if(j){s=((~~(u+1.0)|0)/2|0)<<1;t=((~~(+g[R>>2]+1.0)|0)/2|0)<<1}else{s=~~(u+.5);t=~~(+g[R>>2]+.5)}if((s|0)>-1?(t|0)<(m|0)&((t|0)>-1&(s|0)<(l|0)):0){t=($(t,l)|0)+s<<2;b=(($((x|0)/(K|0)|0,f)|0)+((w|0)/(L|0)|0)|0)*3|0;s=p+(b<<2)|0;c[s>>2]=(c[s>>2]|0)+(d[k+(t|2)>>0]|0);s=p+(b+1<<2)|0;c[s>>2]=(c[s>>2]|0)+(d[k+(t|1)>>0]|0);b=p+(b+2<<2)|0;c[b>>2]=(c[b>>2]|0)+(d[k+t>>0]|0)}w=w+1|0}while((w|0)<(O|0))}x=x+1|0}while((x|0)<(M|0))}break}case 3:{y=u+100.0;z=+(M|0);A=+(O|0);B=P+48|0;C=P+56|0;n=P+64|0;D=P+8|0;E=P+16|0;F=P+24|0;G=P+32|0;H=P+40|0;j=(b|0)==1;if((M|0)>0){e=(O|0)>0;x=0;do{v=y+J*(+(x|0)+.5)/z;if(e){w=0;do{u=y+J*(+(w|0)+.5)/A;q=+h[n>>3]+(+h[B>>3]*u+v*+h[C>>3]);if(q==0.0){S=278;break a}X=(+h[E>>3]+(u*+h[P>>3]+v*+h[D>>3]))/q;g[Q>>2]=X;u=(+h[H>>3]+(u*+h[F>>3]+v*+h[G>>3]))/q;g[R>>2]=u;lf(o,X,u,Q,R)|0;u=+g[Q>>2];if(j){s=((~~(u+1.0)|0)/2|0)<<1;t=((~~(+g[R>>2]+1.0)|0)/2|0)<<1}else{s=~~(u+.5);t=~~(+g[R>>2]+.5)}if((s|0)>-1?(t|0)<(m|0)&((t|0)>-1&(s|0)<(l|0)):0){t=($(t,l)|0)+s<<2;b=(($((x|0)/(K|0)|0,f)|0)+((w|0)/(L|0)|0)|0)*3|0;s=p+(b<<2)|0;c[s>>2]=(c[s>>2]|0)+(d[k+t>>0]|0);s=p+(b+1<<2)|0;c[s>>2]=(c[s>>2]|0)+(d[k+(t|1)>>0]|0);b=p+(b+2<<2)|0;c[b>>2]=(c[b>>2]|0)+(d[k+(t|2)>>0]|0)}w=w+1|0}while((w|0)<(O|0))}x=x+1|0}while((x|0)<(M|0))}break}case 4:{y=u+100.0;z=+(M|0);A=+(O|0);B=P+48|0;C=P+56|0;n=P+64|0;D=P+8|0;E=P+16|0;F=P+24|0;G=P+32|0;H=P+40|0;j=(b|0)==1;if((M|0)>0){e=(O|0)>0;x=0;do{v=y+J*(+(x|0)+.5)/z;if(e){w=0;do{u=y+J*(+(w|0)+.5)/A;q=+h[n>>3]+(+h[B>>3]*u+v*+h[C>>3]);if(q==0.0){S=278;break a}X=(+h[E>>3]+(u*+h[P>>3]+v*+h[D>>3]))/q;g[Q>>2]=X;u=(+h[H>>3]+(u*+h[F>>3]+v*+h[G>>3]))/q;g[R>>2]=u;lf(o,X,u,Q,R)|0;u=+g[Q>>2];if(j){s=((~~(u+1.0)|0)/2|0)<<1;t=((~~(+g[R>>2]+1.0)|0)/2|0)<<1}else{s=~~(u+.5);t=~~(+g[R>>2]+.5)}if((s|0)>-1?(t|0)<(m|0)&((t|0)>-1&(s|0)<(l|0)):0){t=($(t,l)|0)+s<<2;b=(($((x|0)/(K|0)|0,f)|0)+((w|0)/(L|0)|0)|0)*3|0;s=p+(b<<2)|0;c[s>>2]=(c[s>>2]|0)+(d[k+(t|1)>>0]|0);s=p+(b+1<<2)|0;c[s>>2]=(c[s>>2]|0)+(d[k+(t|2)>>0]|0);b=p+(b+2<<2)|0;c[b>>2]=(c[b>>2]|0)+(d[k+(t|3)>>0]|0)}w=w+1|0}while((w|0)<(O|0))}x=x+1|0}while((x|0)<(M|0))}break}case 5:case 12:case 13:case 14:{y=u+100.0;z=+(M|0);A=+(O|0);B=P+48|0;C=P+56|0;n=P+64|0;D=P+8|0;E=P+16|0;F=P+24|0;G=P+32|0;H=P+40|0;j=(b|0)==1;if((M|0)>0){e=(O|0)>0;x=0;do{v=y+J*(+(x|0)+.5)/z;if(e){w=0;do{u=y+J*(+(w|0)+.5)/A;q=+h[n>>3]+(+h[B>>3]*u+v*+h[C>>3]);if(q==0.0){S=278;break a}X=(+h[E>>3]+(u*+h[P>>3]+v*+h[D>>3]))/q;g[Q>>2]=X;u=(+h[H>>3]+(u*+h[F>>3]+v*+h[G>>3]))/q;g[R>>2]=u;lf(o,X,u,Q,R)|0;u=+g[Q>>2];if(j){s=((~~(u+1.0)|0)/2|0)<<1;t=((~~(+g[R>>2]+1.0)|0)/2|0)<<1}else{s=~~(u+.5);t=~~(+g[R>>2]+.5)}if((s|0)>-1?(t|0)<(m|0)&((t|0)>-1&(s|0)<(l|0)):0){t=d[k+(($(t,l)|0)+s)>>0]|0;b=(($((x|0)/(K|0)|0,f)|0)+((w|0)/(L|0)|0)|0)*3|0;s=p+(b<<2)|0;c[s>>2]=(c[s>>2]|0)+t;s=p+(b+1<<2)|0;c[s>>2]=(c[s>>2]|0)+t;b=p+(b+2<<2)|0;c[b>>2]=(c[b>>2]|0)+t}w=w+1|0}while((w|0)<(O|0))}x=x+1|0}while((x|0)<(M|0))}break}case 6:{y=u+100.0;z=+(M|0);A=+(O|0);B=P+48|0;C=P+56|0;n=P+64|0;D=P+8|0;E=P+16|0;F=P+24|0;G=P+32|0;H=P+40|0;j=(b|0)==1;if((M|0)>0){e=(O|0)>0;x=0;do{v=y+J*(+(x|0)+.5)/z;if(e){w=0;do{u=y+J*(+(w|0)+.5)/A;q=+h[n>>3]+(+h[B>>3]*u+v*+h[C>>3]);if(q==0.0){S=278;break a}X=(+h[E>>3]+(u*+h[P>>3]+v*+h[D>>3]))/q;g[Q>>2]=X;u=(+h[H>>3]+(u*+h[F>>3]+v*+h[G>>3]))/q;g[R>>2]=u;lf(o,X,u,Q,R)|0;u=+g[Q>>2];if(j){s=((~~(u+1.0)|0)/2|0)<<1;t=((~~(+g[R>>2]+1.0)|0)/2|0)<<1}else{s=~~(u+.5);t=~~(+g[R>>2]+.5)}if((s|0)>-1?(t|0)<(m|0)&((t|0)>-1&(s|0)<(l|0)):0){t=($(t,l)|0)+s<<2;b=(($((x|0)/(K|0)|0,f)|0)+((w|0)/(L|0)|0)|0)*3|0;s=p+(b<<2)|0;c[s>>2]=(c[s>>2]|0)+(d[k+(t|3)>>0]|0);s=p+(b+1<<2)|0;c[s>>2]=(c[s>>2]|0)+(d[k+(t|2)>>0]|0);b=p+(b+2<<2)|0;c[b>>2]=(c[b>>2]|0)+(d[k+(t|1)>>0]|0)}w=w+1|0}while((w|0)<(O|0))}x=x+1|0}while((x|0)<(M|0))}break}case 7:{y=u+100.0;z=+(M|0);A=+(O|0);B=P+48|0;C=P+56|0;n=P+64|0;D=P+8|0;E=P+16|0;F=P+24|0;G=P+32|0;H=P+40|0;j=(b|0)==1;if((M|0)>0){e=(O|0)>0;x=0;do{v=y+J*(+(x|0)+.5)/z;if(e){w=0;do{u=y+J*(+(w|0)+.5)/A;q=+h[n>>3]+(+h[B>>3]*u+v*+h[C>>3]);if(q==0.0){S=278;break a}X=(+h[E>>3]+(u*+h[P>>3]+v*+h[D>>3]))/q;g[Q>>2]=X;u=(+h[H>>3]+(u*+h[F>>3]+v*+h[G>>3]))/q;g[R>>2]=u;lf(o,X,u,Q,R)|0;u=+g[Q>>2];if(j){s=((~~(u+1.0)|0)/2|0)<<1;t=((~~(+g[R>>2]+1.0)|0)/2|0)<<1}else{s=~~(u+.5);t=~~(+g[R>>2]+.5)}if((s|0)>-1?(t|0)<(m|0)&((t|0)>-1&(s|0)<(l|0)):0){Z=$(t,l)|0;Y=(s&65534)+Z<<1;V=+((d[k+Y>>0]|0)+-128|0);X=+((d[k+(Y+2)>>0]|0)+-128|0);W=+((d[k+(Z+s<<1|1)>>0]|0)+-16|0)*298.0820007324219;Z=~~(V*516.4110107421875+W)>>8;Y=~~(W-V*100.29100036621094-X*208.1199951171875)>>8;t=~~(W+X*408.5830078125)>>8;Z=(Z|0)>0?Z:0;b=(($((x|0)/(K|0)|0,f)|0)+((w|0)/(L|0)|0)|0)*3|0;s=p+(b<<2)|0;c[s>>2]=((Z|0)<255?Z:255)+(c[s>>2]|0);Y=(Y|0)>0?Y:0;s=p+(b+1<<2)|0;c[s>>2]=((Y|0)<255?Y:255)+(c[s>>2]|0);t=(t|0)>0?t:0;b=p+(b+2<<2)|0;c[b>>2]=((t|0)<255?t:255)+(c[b>>2]|0)}w=w+1|0}while((w|0)<(O|0))}x=x+1|0}while((x|0)<(M|0))}break}case 8:{y=u+100.0;z=+(M|0);A=+(O|0);B=P+48|0;C=P+56|0;n=P+64|0;D=P+8|0;E=P+16|0;F=P+24|0;G=P+32|0;H=P+40|0;j=(b|0)==1;if((M|0)>0){e=(O|0)>0;x=0;do{v=y+J*(+(x|0)+.5)/z;if(e){w=0;do{u=y+J*(+(w|0)+.5)/A;q=+h[n>>3]+(+h[B>>3]*u+v*+h[C>>3]);if(q==0.0){S=278;break a}X=(+h[E>>3]+(u*+h[P>>3]+v*+h[D>>3]))/q;g[Q>>2]=X;u=(+h[H>>3]+(u*+h[F>>3]+v*+h[G>>3]))/q;g[R>>2]=u;lf(o,X,u,Q,R)|0;u=+g[Q>>2];if(j){s=((~~(u+1.0)|0)/2|0)<<1;t=((~~(+g[R>>2]+1.0)|0)/2|0)<<1}else{s=~~(u+.5);t=~~(+g[R>>2]+.5)}if((s|0)>-1?(t|0)<(m|0)&((t|0)>-1&(s|0)<(l|0)):0){t=$(t,l)|0;Y=(s&65534)+t<<1;V=+((d[k+(Y|1)>>0]|0)+-128|0);X=+((d[k+(Y+3)>>0]|0)+-128|0);W=+((d[k+(t+s<<1)>>0]|0)+-16|0)*298.0820007324219;s=~~(W+V*516.4110107421875)>>8;t=~~(W-V*100.29100036621094-X*208.1199951171875)>>8;Y=~~(W+X*408.5830078125)>>8;s=(s|0)>0?s:0;Z=(($((x|0)/(K|0)|0,f)|0)+((w|0)/(L|0)|0)|0)*3|0;b=p+(Z<<2)|0;c[b>>2]=((s|0)<255?s:255)+(c[b>>2]|0);t=(t|0)>0?t:0;b=p+(Z+1<<2)|0;c[b>>2]=((t|0)<255?t:255)+(c[b>>2]|0);Y=(Y|0)>0?Y:0;Z=p+(Z+2<<2)|0;c[Z>>2]=((Y|0)<255?Y:255)+(c[Z>>2]|0)}w=w+1|0}while((w|0)<(O|0))}x=x+1|0}while((x|0)<(M|0))}break}case 9:{y=u+100.0;z=+(M|0);A=+(O|0);B=P+48|0;C=P+56|0;n=P+64|0;D=P+8|0;E=P+16|0;F=P+24|0;G=P+32|0;H=P+40|0;j=(b|0)==1;if((M|0)>0){e=(O|0)>0;x=0;do{v=y+J*(+(x|0)+.5)/z;if(e){w=0;do{u=y+J*(+(w|0)+.5)/A;q=+h[n>>3]+(+h[B>>3]*u+v*+h[C>>3]);if(q==0.0){S=278;break a}X=(+h[E>>3]+(u*+h[P>>3]+v*+h[D>>3]))/q;g[Q>>2]=X;u=(+h[H>>3]+(u*+h[F>>3]+v*+h[G>>3]))/q;g[R>>2]=u;lf(o,X,u,Q,R)|0;u=+g[Q>>2];if(j){s=((~~(u+1.0)|0)/2|0)<<1;t=((~~(+g[R>>2]+1.0)|0)/2|0)<<1}else{s=~~(u+.5);t=~~(+g[R>>2]+.5)}if((s|0)>-1?(t|0)<(m|0)&((t|0)>-1&(s|0)<(l|0)):0){Y=($(t,l)|0)+s<<1;t=d[k+(Y|1)>>0]|0;Z=(($((x|0)/(K|0)|0,f)|0)+((w|0)/(L|0)|0)|0)*3|0;b=p+(Z<<2)|0;c[b>>2]=(t<<3&248|4)+(c[b>>2]|0);Y=d[k+Y>>0]|0;b=p+(Z+1<<2)|0;c[b>>2]=(Y<<5&224|t>>>3&28|2)+(c[b>>2]|0);Z=p+(Z+2<<2)|0;c[Z>>2]=(Y&248|4)+(c[Z>>2]|0)}w=w+1|0}while((w|0)<(O|0))}x=x+1|0}while((x|0)<(M|0))}break}case 10:{y=u+100.0;z=+(M|0);A=+(O|0);B=P+48|0;C=P+56|0;n=P+64|0;D=P+8|0;E=P+16|0;F=P+24|0;G=P+32|0;H=P+40|0;j=(b|0)==1;if((M|0)>0){e=(O|0)>0;x=0;do{v=y+J*(+(x|0)+.5)/z;if(e){w=0;do{u=y+J*(+(w|0)+.5)/A;q=+h[n>>3]+(+h[B>>3]*u+v*+h[C>>3]);if(q==0.0){S=278;break a}X=(+h[E>>3]+(u*+h[P>>3]+v*+h[D>>3]))/q;g[Q>>2]=X;u=(+h[H>>3]+(u*+h[F>>3]+v*+h[G>>3]))/q;g[R>>2]=u;lf(o,X,u,Q,R)|0;u=+g[Q>>2];if(j){s=((~~(u+1.0)|0)/2|0)<<1;t=((~~(+g[R>>2]+1.0)|0)/2|0)<<1}else{s=~~(u+.5);t=~~(+g[R>>2]+.5)}if((s|0)>-1?(t|0)<(m|0)&((t|0)>-1&(s|0)<(l|0)):0){Y=($(t,l)|0)+s<<1;t=d[k+(Y|1)>>0]|0;Z=(($((x|0)/(K|0)|0,f)|0)+((w|0)/(L|0)|0)|0)*3|0;b=p+(Z<<2)|0;c[b>>2]=(t<<2&248|4)+(c[b>>2]|0);Y=d[k+Y>>0]|0;b=p+(Z+1<<2)|0;c[b>>2]=(Y<<5&224|t>>>3&24|4)+(c[b>>2]|0);Z=p+(Z+2<<2)|0;c[Z>>2]=(Y&248|4)+(c[Z>>2]|0)}w=w+1|0}while((w|0)<(O|0))}x=x+1|0}while((x|0)<(M|0))}break}case 11:{y=u+100.0;z=+(M|0);A=+(O|0);B=P+48|0;C=P+56|0;n=P+64|0;D=P+8|0;E=P+16|0;F=P+24|0;G=P+32|0;H=P+40|0;j=(b|0)==1;if((M|0)>0){e=(O|0)>0;x=0;do{v=y+J*(+(x|0)+.5)/z;if(e){w=0;do{u=y+J*(+(w|0)+.5)/A;q=+h[n>>3]+(+h[B>>3]*u+v*+h[C>>3]);if(q==0.0){S=278;break a}X=(+h[E>>3]+(u*+h[P>>3]+v*+h[D>>3]))/q;g[Q>>2]=X;u=(+h[H>>3]+(u*+h[F>>3]+v*+h[G>>3]))/q;g[R>>2]=u;lf(o,X,u,Q,R)|0;u=+g[Q>>2];if(j){s=((~~(u+1.0)|0)/2|0)<<1;t=((~~(+g[R>>2]+1.0)|0)/2|0)<<1}else{s=~~(u+.5);t=~~(+g[R>>2]+.5)}if((s|0)>-1?(t|0)<(m|0)&((t|0)>-1&(s|0)<(l|0)):0){Y=($(t,l)|0)+s<<1;Z=(($((x|0)/(K|0)|0,f)|0)+((w|0)/(L|0)|0)|0)*3|0;b=p+(Z<<2)|0;c[b>>2]=(c[b>>2]|0)+((d[k+(Y|1)>>0]|0)&240|8);Y=d[k+Y>>0]|0;b=p+(Z+1<<2)|0;c[b>>2]=(Y<<4&240|8)+(c[b>>2]|0);Z=p+(Z+2<<2)|0;c[Z>>2]=(Y&240|8)+(c[Z>>2]|0)}w=w+1|0}while((w|0)<(O|0))}x=x+1|0}while((x|0)<(M|0))}break}default:{Me(3,4615,C);S=278;break a}}while(0);t=$(K,L)|0;if(N){s=0;do{a[r+s>>0]=((c[p+(s<<2)>>2]|0)>>>0)/(t>>>0)|0;s=s+1|0}while((s|0)<(I|0))}Vj(p);p=0}else{p=Wj(N,4)|0;if(!p){Me(3,5472,w);rb(1)}b:do if(n>>>0<2){y=u+100.0;z=+(M|0);A=+(O|0);B=P+48|0;C=P+56|0;n=P+64|0;D=P+8|0;E=P+16|0;F=P+24|0;G=P+32|0;H=P+40|0;j=(b|0)==1;if((M|0)>0){e=(O|0)>0;x=0;do{v=y+J*(+(x|0)+.5)/z;if(e){w=0;do{u=y+J*(+(w|0)+.5)/A;q=+h[n>>3]+(+h[B>>3]*u+v*+h[C>>3]);if(q==0.0){S=278;break a}X=(+h[E>>3]+(u*+h[P>>3]+v*+h[D>>3]))/q;g[Q>>2]=X;u=(+h[H>>3]+(u*+h[F>>3]+v*+h[G>>3]))/q;g[R>>2]=u;lf(o,X,u,Q,R)|0;u=+g[Q>>2];if(j){s=((~~(u+1.0)|0)/2|0)<<1;t=((~~(+g[R>>2]+1.0)|0)/2|0)<<1}else{s=~~(u+.5);t=~~(+g[R>>2]+.5)}if((s|0)>-1?(t|0)<(m|0)&((t|0)>-1&(s|0)<(l|0)):0){Y=(($(t,l)|0)+s|0)*3|0;Z=p+(($((x|0)/(K|0)|0,f)|0)+((w|0)/(L|0)|0)<<2)|0;c[Z>>2]=(c[Z>>2]|0)+((((d[k+(Y+1)>>0]|0)+(d[k+Y>>0]|0)+(d[k+(Y+2)>>0]|0)|0)>>>0)/3|0)}w=w+1|0}while((w|0)<(O|0))}x=x+1|0}while((x|0)<(M|0))}}else{if((n&-2|0)==2){y=u+100.0;z=+(M|0);A=+(O|0);B=P+48|0;C=P+56|0;n=P+64|0;D=P+8|0;E=P+16|0;F=P+24|0;G=P+32|0;H=P+40|0;j=(b|0)==1;if((M|0)<=0)break;e=(O|0)>0;x=0;while(1){v=y+J*(+(x|0)+.5)/z;if(e){w=0;do{u=y+J*(+(w|0)+.5)/A;q=+h[n>>3]+(+h[B>>3]*u+v*+h[C>>3]);if(q==0.0){S=278;break a}X=(+h[E>>3]+(u*+h[P>>3]+v*+h[D>>3]))/q;g[Q>>2]=X;u=(+h[H>>3]+(u*+h[F>>3]+v*+h[G>>3]))/q;g[R>>2]=u;lf(o,X,u,Q,R)|0;u=+g[Q>>2];if(j){s=((~~(u+1.0)|0)/2|0)<<1;t=((~~(+g[R>>2]+1.0)|0)/2|0)<<1}else{s=~~(u+.5);t=~~(+g[R>>2]+.5)}if((s|0)>-1?(t|0)<(m|0)&((t|0)>-1&(s|0)<(l|0)):0){Y=($(t,l)|0)+s<<2;Z=p+(($((x|0)/(K|0)|0,f)|0)+((w|0)/(L|0)|0)<<2)|0;c[Z>>2]=(c[Z>>2]|0)+((((d[k+(Y|1)>>0]|0)+(d[k+Y>>0]|0)+(d[k+(Y|2)>>0]|0)|0)>>>0)/3|0)}w=w+1|0}while((w|0)<(O|0))}x=x+1|0;if((x|0)>=(M|0))break b}}if((n&-3|0)==4){y=u+100.0;z=+(M|0);A=+(O|0);B=P+48|0;C=P+56|0;n=P+64|0;D=P+8|0;E=P+16|0;F=P+24|0;G=P+32|0;H=P+40|0;j=(b|0)==1;if((M|0)<=0)break;e=(O|0)>0;x=0;while(1){v=y+J*(+(x|0)+.5)/z;if(e){w=0;do{u=y+J*(+(w|0)+.5)/A;q=+h[n>>3]+(+h[B>>3]*u+v*+h[C>>3]);if(q==0.0){S=278;break a}X=(+h[E>>3]+(u*+h[P>>3]+v*+h[D>>3]))/q;g[Q>>2]=X;u=(+h[H>>3]+(u*+h[F>>3]+v*+h[G>>3]))/q;g[R>>2]=u;lf(o,X,u,Q,R)|0;u=+g[Q>>2];if(j){s=((~~(u+1.0)|0)/2|0)<<1;t=((~~(+g[R>>2]+1.0)|0)/2|0)<<1}else{s=~~(u+.5);t=~~(+g[R>>2]+.5)}if((s|0)>-1?(t|0)<(m|0)&((t|0)>-1&(s|0)<(l|0)):0){Y=($(t,l)|0)+s<<2;Z=p+(($((x|0)/(K|0)|0,f)|0)+((w|0)/(L|0)|0)<<2)|0;c[Z>>2]=(c[Z>>2]|0)+((((d[k+(Y|2)>>0]|0)+(d[k+(Y|1)>>0]|0)+(d[k+(Y|3)>>0]|0)|0)>>>0)/3|0)}w=w+1|0}while((w|0)<(O|0))}x=x+1|0;if((x|0)>=(M|0))break b}}switch(n|0){case 5:case 12:case 13:case 14:{y=u+100.0;z=+(M|0);A=+(O|0);B=P+48|0;C=P+56|0;n=P+64|0;D=P+8|0;E=P+16|0;F=P+24|0;G=P+32|0;H=P+40|0;j=(b|0)==1;if((M|0)<=0)break b;e=(O|0)>0;x=0;do{v=y+J*(+(x|0)+.5)/z;if(e){w=0;do{u=y+J*(+(w|0)+.5)/A;q=+h[n>>3]+(+h[B>>3]*u+v*+h[C>>3]);if(q==0.0){S=278;break a}X=(+h[E>>3]+(u*+h[P>>3]+v*+h[D>>3]))/q;g[Q>>2]=X;u=(+h[H>>3]+(u*+h[F>>3]+v*+h[G>>3]))/q;g[R>>2]=u;lf(o,X,u,Q,R)|0;u=+g[Q>>2];if(j){s=((~~(u+1.0)|0)/2|0)<<1;t=((~~(+g[R>>2]+1.0)|0)/2|0)<<1}else{s=~~(u+.5);t=~~(+g[R>>2]+.5)}if((s|0)>-1?(t|0)<(m|0)&((t|0)>-1&(s|0)<(l|0)):0){Y=d[k+(($(t,l)|0)+s)>>0]|0;Z=p+(($((x|0)/(K|0)|0,f)|0)+((w|0)/(L|0)|0)<<2)|0;c[Z>>2]=(c[Z>>2]|0)+Y}w=w+1|0}while((w|0)<(O|0))}x=x+1|0}while((x|0)<(M|0));break}case 7:{y=u+100.0;z=+(M|0);A=+(O|0);B=P+48|0;C=P+56|0;n=P+64|0;D=P+8|0;E=P+16|0;F=P+24|0;G=P+32|0;H=P+40|0;j=(b|0)==1;if((M|0)<=0)break b;e=(O|0)>0;x=0;do{v=y+J*(+(x|0)+.5)/z;if(e){w=0;do{u=y+J*(+(w|0)+.5)/A;q=+h[n>>3]+(+h[B>>3]*u+v*+h[C>>3]);if(q==0.0){S=278;break a}X=(+h[E>>3]+(u*+h[P>>3]+v*+h[D>>3]))/q;g[Q>>2]=X;u=(+h[H>>3]+(u*+h[F>>3]+v*+h[G>>3]))/q;g[R>>2]=u;lf(o,X,u,Q,R)|0;u=+g[Q>>2];if(j){s=((~~(u+1.0)|0)/2|0)<<1;t=((~~(+g[R>>2]+1.0)|0)/2|0)<<1}else{s=~~(u+.5);t=~~(+g[R>>2]+.5)}if((s|0)>-1?(t|0)<(m|0)&((t|0)>-1&(s|0)<(l|0)):0){Y=d[k+(($(t,l)|0)+s<<1|1)>>0]|0;Z=p+(($((x|0)/(K|0)|0,f)|0)+((w|0)/(L|0)|0)<<2)|0;c[Z>>2]=(c[Z>>2]|0)+Y}w=w+1|0}while((w|0)<(O|0))}x=x+1|0}while((x|0)<(M|0));break}case 8:{y=u+100.0;z=+(M|0);A=+(O|0);B=P+48|0;C=P+56|0;n=P+64|0;D=P+8|0;E=P+16|0;F=P+24|0;G=P+32|0;H=P+40|0;j=(b|0)==1;if((M|0)<=0)break b;e=(O|0)>0;x=0;do{v=y+J*(+(x|0)+.5)/z;if(e){w=0;do{u=y+J*(+(w|0)+.5)/A;q=+h[n>>3]+(+h[B>>3]*u+v*+h[C>>3]);if(q==0.0){S=278;break a}X=(+h[E>>3]+(u*+h[P>>3]+v*+h[D>>3]))/q;g[Q>>2]=X;u=(+h[H>>3]+(u*+h[F>>3]+v*+h[G>>3]))/q;g[R>>2]=u;lf(o,X,u,Q,R)|0;u=+g[Q>>2];if(j){s=((~~(u+1.0)|0)/2|0)<<1;t=((~~(+g[R>>2]+1.0)|0)/2|0)<<1}else{s=~~(u+.5);t=~~(+g[R>>2]+.5)}if((s|0)>-1?(t|0)<(m|0)&((t|0)>-1&(s|0)<(l|0)):0){Y=d[k+(($(t,l)|0)+s<<1)>>0]|0;Z=p+(($((x|0)/(K|0)|0,f)|0)+((w|0)/(L|0)|0)<<2)|0;c[Z>>2]=(c[Z>>2]|0)+Y}w=w+1|0}while((w|0)<(O|0))}x=x+1|0}while((x|0)<(M|0));break}case 9:{y=u+100.0;z=+(M|0);A=+(O|0);B=P+48|0;C=P+56|0;n=P+64|0;D=P+8|0;E=P+16|0;F=P+24|0;G=P+32|0;H=P+40|0;j=(b|0)==1;if((M|0)<=0)break b;e=(O|0)>0;x=0;do{v=y+J*(+(x|0)+.5)/z;if(e){w=0;do{u=y+J*(+(w|0)+.5)/A;q=+h[n>>3]+(+h[B>>3]*u+v*+h[C>>3]);if(q==0.0){S=278;break a}X=(+h[E>>3]+(u*+h[P>>3]+v*+h[D>>3]))/q;g[Q>>2]=X;u=(+h[H>>3]+(u*+h[F>>3]+v*+h[G>>3]))/q;g[R>>2]=u;lf(o,X,u,Q,R)|0;u=+g[Q>>2];if(j){s=((~~(u+1.0)|0)/2|0)<<1;t=((~~(+g[R>>2]+1.0)|0)/2|0)<<1}else{s=~~(u+.5);t=~~(+g[R>>2]+.5)}if((s|0)>-1?(t|0)<(m|0)&((t|0)>-1&(s|0)<(l|0)):0){Y=($(t,l)|0)+s<<1;I=d[k+Y>>0]|0;Y=d[k+(Y|1)>>0]|0;Z=p+(($((x|0)/(K|0)|0,f)|0)+((w|0)/(L|0)|0)<<2)|0;c[Z>>2]=(c[Z>>2]|0)+((((Y<<3&248|4)+(I&248|4)+(I<<5&224|Y>>>3&28|2)|0)>>>0)/3|0)}w=w+1|0}while((w|0)<(O|0))}x=x+1|0}while((x|0)<(M|0));break}case 10:{y=u+100.0;z=+(M|0);A=+(O|0);B=P+48|0;C=P+56|0;n=P+64|0;D=P+8|0;E=P+16|0;F=P+24|0;G=P+32|0;H=P+40|0;j=(b|0)==1;if((M|0)<=0)break b;e=(O|0)>0;x=0;do{v=y+J*(+(x|0)+.5)/z;if(e){w=0;do{u=y+J*(+(w|0)+.5)/A;q=+h[n>>3]+(+h[B>>3]*u+v*+h[C>>3]);if(q==0.0){S=278;break a}X=(+h[E>>3]+(u*+h[P>>3]+v*+h[D>>3]))/q;g[Q>>2]=X;u=(+h[H>>3]+(u*+h[F>>3]+v*+h[G>>3]))/q;g[R>>2]=u;lf(o,X,u,Q,R)|0;u=+g[Q>>2];if(j){s=((~~(u+1.0)|0)/2|0)<<1;t=((~~(+g[R>>2]+1.0)|0)/2|0)<<1}else{s=~~(u+.5);t=~~(+g[R>>2]+.5)}if((s|0)>-1?(t|0)<(m|0)&((t|0)>-1&(s|0)<(l|0)):0){Y=($(t,l)|0)+s<<1;I=d[k+Y>>0]|0;Y=d[k+(Y|1)>>0]|0;Z=p+(($((x|0)/(K|0)|0,f)|0)+((w|0)/(L|0)|0)<<2)|0;c[Z>>2]=(c[Z>>2]|0)+((((Y<<2&248|4)+(I&248|4)+(I<<5&224|Y>>>3&24|4)|0)>>>0)/3|0)}w=w+1|0}while((w|0)<(O|0))}x=x+1|0}while((x|0)<(M|0));break}case 11:{y=u+100.0;z=+(M|0);A=+(O|0);B=P+48|0;C=P+56|0;n=P+64|0;D=P+8|0;E=P+16|0;F=P+24|0;G=P+32|0;H=P+40|0;j=(b|0)==1;if((M|0)<=0)break b;e=(O|0)>0;x=0;do{v=y+J*(+(x|0)+.5)/z;if(e){w=0;do{u=y+J*(+(w|0)+.5)/A;q=+h[n>>3]+(+h[B>>3]*u+v*+h[C>>3]);if(q==0.0){S=278;break a}X=(+h[E>>3]+(u*+h[P>>3]+v*+h[D>>3]))/q;g[Q>>2]=X;u=(+h[H>>3]+(u*+h[F>>3]+v*+h[G>>3]))/q;g[R>>2]=u;lf(o,X,u,Q,R)|0;u=+g[Q>>2];if(j){s=((~~(u+1.0)|0)/2|0)<<1;t=((~~(+g[R>>2]+1.0)|0)/2|0)<<1}else{s=~~(u+.5);t=~~(+g[R>>2]+.5)}if((s|0)>-1?(t|0)<(m|0)&((t|0)>-1&(s|0)<(l|0)):0){Y=($(t,l)|0)+s<<1;I=d[k+Y>>0]|0;Z=p+(($((x|0)/(K|0)|0,f)|0)+((w|0)/(L|0)|0)<<2)|0;c[Z>>2]=(c[Z>>2]|0)+((((I<<4&240|8)+(I&240|8)+((d[k+(Y|1)>>0]|0)&240|8)|0)>>>0)/3|0)}w=w+1|0}while((w|0)<(O|0))}x=x+1|0}while((x|0)<(M|0));break}default:{Me(3,4615,x);S=278;break a}}}while(0);s=$(K,L)|0;if(N){t=0;do{a[r+t>>0]=((c[p+(t<<2)>>2]|0)>>>0)/(s>>>0)|0;t=t+1|0}while((t|0)<(N|0))}Vj(p);p=0}while(0);if((S|0)==278){Vj(p);p=-1}i=T;return p|0}function Fe(b,e,f,g,j,k,l){b=b|0;e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;v=i;i=i+32|0;p=v+24|0;o=v+8|0;u=v;a:do if((e+-3|0)>>>0>5){c[f>>2]=-1;c[g>>2]=0;h[j>>3]=-1.0;m=-1}else{c[o>>2]=0;t=e+-1|0;c[o+4>>2]=$(t,e)|0;r=$(e,e)|0;c[o+8>>2]=r+-1;c[o+12>>2]=t;n=a[b+(c[o>>2]|0)>>0]|0;m=(n&255)>0?n:0;n=(n&255)<255?n:-1;s=a[b+(c[o+4>>2]|0)>>0]|0;m=(s&255)>(m&255)?s:m;n=(s&255)<(n&255)?s:n;s=a[b+(c[o+8>>2]|0)>>0]|0;m=(s&255)>(m&255)?s:m;n=(s&255)<(n&255)?s:n;s=a[b+(c[o+12>>2]|0)>>0]|0;m=((s&255)>(m&255)?s:m)&255;n=((s&255)<(n&255)?s:n)&255;if((m-n|0)<30){c[f>>2]=-1;c[g>>2]=0;h[j>>3]=-1.0;m=-2;break}q=(m+n|0)>>>1;a[p>>0]=(d[b+(c[o>>2]|0)>>0]|0)>>>0<q>>>0&1;a[p+1>>0]=(d[b+(c[o+4>>2]|0)>>0]|0)>>>0<q>>>0&1;a[p+2>>0]=(d[b+(c[o+8>>2]|0)>>0]|0)>>>0<q>>>0&1;a[p+3>>0]=(d[b+(c[o+12>>2]|0)>>0]|0)>>>0<q>>>0&1;n=0;while(1){m=n+1|0;if(((a[p+n>>0]|0)==1?(a[p+((m|0)%4|0)>>0]|0)==1:0)?(a[p+((n+2|0)%4|0)>>0]|0)==0:0){m=n;n=10;break}if((m|0)<4)n=m;else{n=12;break}}if((n|0)==10)c[g>>2]=m;else if((n|0)==12?(m|0)==4:0){c[f>>2]=-1;c[g>>2]=0;h[j>>3]=-1.0;m=-3;break}if(!r)s=255;else{m=255;n=0;do{s=b+n|0;p=d[s>>0]|0;o=p-q|0;o=(o|0)<0?0-o|0:o;m=(o|0)<(m|0)?o:m;a[s>>0]=p>>>0<q>>>0&1;n=n+1|0}while((n|0)<(r|0));s=m}switch(c[g>>2]|0){case 0:{if((e|0)>0){r=(e|0)==0;n=0;m=0;g=0;do{p=(g|0)==(t|0);q=$(g,e)|0;if(!r){o=0;do{if((o|g|0)!=0?!(p&((o|0)==0|(o|0)==(t|0))):0){n=fk(n|0,m|0,1)|0;n=(a[b+(o+q)>>0]|0)!=0|n;m=D}o=o+1|0}while((o|0)!=(e|0))}g=g+1|0}while((g|0)<(e|0))}else{n=0;m=0}break}case 1:{if((e|0)>0){r=(e|0)>0;n=0;m=0;g=0;do{p=(g|0)==0;q=(g|0)==(t|0);if(r){o=t;while(1){w=(o|0)==(t|0);if(!(p&w)?!(q&(w|(o|0)==0)):0){n=fk(n|0,m|0,1)|0;n=(a[b+(($(o,e)|0)+g)>>0]|0)!=0|n;m=D}if((o|0)>0)o=o+-1|0;else break}}g=g+1|0}while((g|0)<(e|0))}else{n=0;m=0}break}case 2:{if((e|0)>0){r=(e|0)>0;n=0;m=0;g=t;while(1){q=(g|0)==(t|0)|(g|0)==0;p=$(g,e)|0;if(r){o=t;while(1){if(!(q&(o|0)==(t|0)|(o|g|0)==0)){n=fk(n|0,m|0,1)|0;n=(a[b+(o+p)>>0]|0)!=0|n;m=D}if((o|0)>0)o=o+-1|0;else break}}if((g|0)>0)g=g+-1|0;else break}}else{n=0;m=0}break}case 3:{if((e|0)>0){r=(e|0)>0;n=0;m=0;g=t;while(1){p=(g|0)==(t|0);q=(g|0)==0;if(r){o=0;do{if(!(p&(o|0)==0|(o|g|0)==0|q&(o|0)==(t|0))){n=fk(n|0,m|0,1)|0;n=(a[b+(($(o,e)|0)+g)>>0]|0)!=0|n;m=D}o=o+1|0}while((o|0)<(e|0))}if((g|0)>0)g=g+-1|0;else break}}else{n=0;m=0}break}default:{n=0;m=0}}h[j>>3]=(s|0)>30?1.0:+(s|0)/30.0;switch(k|0){case 259:{w=a[4551+n>>0]|0;k=w<<24>>24;l=u;c[l>>2]=k;c[l+4>>2]=((k|0)<0)<<31>>31;if(w<<24>>24<0){c[f>>2]=-1;h[j>>3]=-1.0;m=-4;break a}break}case 515:{m=a[4423+n>>0]|0;k=m<<24>>24;w=u;c[w>>2]=k;c[w+4>>2]=((k|0)<0)<<31>>31;if(l)c[l>>2]=d[4487+n>>0];if(m<<24>>24<0){c[f>>2]=-1;h[j>>3]=-1.0;m=-4;break a}break}case 772:case 1028:{m=Ie(k,n,m,0,u)|0;if((m|0)<0){c[f>>2]=-1;h[j>>3]=-1.0;m=-4;break a}if((l|0)!=0&(m|0)>0)c[l>>2]=m;break}default:{w=u;c[w>>2]=n;c[w+4>>2]=m}}c[f>>2]=c[u>>2];m=0}while(0);i=v;return m|0}function Ge(a,b,e,f,g,j,k){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0,A=0,B=0,C=0,D=0.0;C=i;i=i+16|0;l=C+8|0;n=C;a:do if(!a){c[g>>2]=0;c[j>>2]=0;h[k>>3]=-1.0;b=-1}else switch(b|0){case 0:{o=$(f,f)|0;z=o*3|0;A=Uj(o*12|0)|0;if(!A){Me(3,5472,n);rb(1)}if(!o)b=0;else{b=0;l=0;do{b=((d[e+l>>0]|0)^255)+b|0;l=l+1|0}while((l|0)<(z|0))}l=(b|0)/(z|0)|0;if(!o)m=0.0;else{n=0;b=0;do{x=((d[e+n>>0]|0)^255)-l|0;c[A+(n<<2)>>2]=x;b=($(x,x)|0)+b|0;n=n+1|0}while((n|0)<(z|0));m=+(b|0)}y=+P(+m);if(y/(+(f|0)*1.7320508)<15.0){c[g>>2]=0;c[j>>2]=0;h[k>>3]=-1.0;Vj(A);b=-2;break a}v=c[a>>2]|0;w=a+12|0;x=a+16|0;if((v|0)>0){u=c[a+8>>2]|0;s=(o|0)==0;n=-1;t=0;m=0.0;l=-1;b=-1;do{b:while(1){n=n+1|0;switch(c[u+(n<<2)>>2]|0){case 0:break;case 2:break b;default:{B=17;break b}}}if((B|0)==17){B=0;p=n<<2;q=c[x>>2]|0;r=0;do{a=r+p|0;if(s)o=0;else{e=c[(c[w>>2]|0)+(a<<2)>>2]|0;f=0;o=0;do{o=($(c[e+(f<<2)>>2]|0,c[A+(f<<2)>>2]|0)|0)+o|0;f=f+1|0}while((f|0)<(z|0))}D=+(o|0)/+h[q+(a<<3)>>3]/y;a=D>m;l=a?r:l;b=a?n:b;m=a?D:m;r=r+1|0}while((r|0)!=4)}t=t+1|0}while((t|0)<(v|0))}else{m=0.0;l=-1;b=-1}c[j>>2]=l;c[g>>2]=b;h[k>>3]=m;Vj(A);b=0;break a}case 1:{z=$(f,f)|0;A=Uj(z<<2)|0;if(!A){Me(3,5472,l);rb(1)}if(!z)b=0;else{b=0;l=0;do{b=((d[e+l>>0]|0)^255)+b|0;l=l+1|0}while((l|0)<(z|0))}l=(b|0)/(z|0)|0;if(!z)m=0.0;else{n=0;b=0;do{x=((d[e+n>>0]|0)^255)-l|0;c[A+(n<<2)>>2]=x;b=($(x,x)|0)+b|0;n=n+1|0}while((n|0)<(z|0));m=+(b|0)}y=+P(+m);if(y/+(f|0)<15.0){c[g>>2]=0;c[j>>2]=0;h[k>>3]=-1.0;Vj(A);b=-2;break a}v=c[a>>2]|0;w=a+20|0;x=a+24|0;if((v|0)>0){s=c[a+8>>2]|0;t=(z|0)==0;n=-1;u=0;m=0.0;l=-1;b=-1;do{c:while(1){n=n+1|0;switch(c[s+(n<<2)>>2]|0){case 0:break;case 2:break c;default:{B=37;break c}}}if((B|0)==37){B=0;p=n<<2;q=c[x>>2]|0;r=0;do{a=r+p|0;if(t)o=0;else{e=c[(c[w>>2]|0)+(a<<2)>>2]|0;f=0;o=0;do{o=($(c[e+(f<<2)>>2]|0,c[A+(f<<2)>>2]|0)|0)+o|0;f=f+1|0}while((f|0)<(z|0))}D=+(o|0)/+h[q+(a<<3)>>3]/y;a=D>m;l=a?r:l;b=a?n:b;m=a?D:m;r=r+1|0}while((r|0)!=4)}u=u+1|0}while((u|0)<(v|0))}else{m=0.0;l=-1;b=-1}c[j>>2]=l;c[g>>2]=b;h[k>>3]=m;Vj(A);b=0;break a}default:{b=-1;break a}}while(0);i=C;return b|0}function He(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=Re(8,8)|0;f=Re(8,1)|0;g=Re(8,1)|0;i=c[e>>2]|0;j=c[f>>2]|0;k=0;do{p=a+(k<<4)|0;l=k<<4;h[i+(l<<3)>>3]=+h[p>>3];o=a+(k<<4)+8|0;h[i+((l|1)<<3)>>3]=+h[o>>3];h[i+((l|2)<<3)>>3]=1.0;h[i+((l|3)<<3)>>3]=0.0;h[i+((l|4)<<3)>>3]=0.0;h[i+((l|5)<<3)>>3]=0.0;n=b+(k<<4)|0;h[i+((l|6)<<3)>>3]=-(+h[p>>3]*+h[n>>3]);h[i+((l|7)<<3)>>3]=-(+h[o>>3]*+h[n>>3]);h[i+((l|8)<<3)>>3]=0.0;h[i+((l|9)<<3)>>3]=0.0;h[i+((l|10)<<3)>>3]=0.0;h[i+((l|11)<<3)>>3]=+h[p>>3];h[i+((l|12)<<3)>>3]=+h[o>>3];h[i+((l|13)<<3)>>3]=1.0;m=b+(k<<4)+8|0;h[i+((l|14)<<3)>>3]=-(+h[p>>3]*+h[m>>3]);h[i+((l|15)<<3)>>3]=-(+h[o>>3]*+h[m>>3]);l=k<<1;h[j+(l<<3)>>3]=+h[n>>3];h[j+((l|1)<<3)>>3]=+h[m>>3];k=k+1|0}while((k|0)!=4);_e(e)|0;Xe(g,e,f)|0;p=c[g>>2]|0;h[d>>3]=+h[p>>3];h[d+8>>3]=+h[p+8>>3];h[d+16>>3]=+h[p+16>>3];p=c[g>>2]|0;h[d+24>>3]=+h[p+24>>3];h[d+32>>3]=+h[p+32>>3];h[d+40>>3]=+h[p+40>>3];p=c[g>>2]|0;h[d+48>>3]=+h[p+48>>3];h[d+56>>3]=+h[p+56>>3];h[d+64>>3]=1.0;We(e)|0;We(f)|0;We(g)|0;return}function Ie(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0,I=0;I=i;i=i+2320|0;k=I+2304|0;y=I+864|0;u=I+784|0;H=I+704|0;w=I+624|0;v=I+548|0;G=I+40|0;E=I;switch(b|0){case 772:{g=9;j=1;l=3;break}case 1028:{g=5;j=2;l=3;break}case 2830:{A=900;s=1472;C=64;F=120;z=127;B=g;j=9;l=6;break}default:f=-1}if((l|0)==3){b=0;while(1){a[k+b>>0]=e&1;e=hk(e|0,f|0,1)|0;b=b+1|0;if((b|0)==13)break;else f=D}A=840;s=1408;C=g;F=13;z=15;B=k;l=6}do if((l|0)==6){r=j<<1;k=1;f=0;while(1){g=v+(k<<2)|0;c[g>>2]=0;b=0;e=0;do{if(a[B+e>>0]|0){b=b^c[A+((($(e,k)|0)%(z|0)|0)<<2)>>2];c[g>>2]=b}e=e+1|0}while((e|0)<(F|0));f=(b|0)==0?f:1;c[g>>2]=c[s+(b<<2)>>2];if((k|0)<(r|0))k=k+1|0;else break}x=(f|0)!=0;if(x){c[u>>2]=0;f=c[v+4>>2]|0;c[u+4>>2]=f;c[y>>2]=0;c[y+72>>2]=1;if((r|0)>1){b=1;do{c[y+(b<<2)>>2]=-1;c[y+72+(b<<2)>>2]=0;b=b+1|0}while((b|0)<(r|0))}c[H>>2]=0;c[H+4>>2]=0;c[w>>2]=-1;c[w+4>>2]=0;p=0;q=0;while(1){g=q;q=q+1|0;o=u+(q<<2)|0;if((f|0)==-1){k=g+2|0;c[H+(k<<2)>>2]=p;if((p|0)<0)n=p;else{f=0;while(1){o=y+(q*72|0)+(f<<2)|0;n=c[o>>2]|0;c[y+(k*72|0)+(f<<2)>>2]=n;c[o>>2]=c[s+(n<<2)>>2];if((f|0)<(p|0))f=f+1|0;else{n=p;break}}}}else{b=g;while(1){f=(b|0)>0;if(f&(c[u+(b<<2)>>2]|0)==-1)b=b+-1|0;else break}if(f){e=b;do{f=e;e=e+-1|0;if((c[u+(e<<2)>>2]|0)!=-1)b=(c[w+(b<<2)>>2]|0)<(c[w+(e<<2)>>2]|0)?e:b}while((f|0)>1)}e=H+(b<<2)|0;m=q-b|0;n=m+(c[e>>2]|0)|0;k=g+2|0;n=(p|0)>(n|0)?p:n;c[H+(k<<2)>>2]=n;f=0;do{c[y+(k*72|0)+(f<<2)>>2]=0;f=f+1|0}while((f|0)<(r|0));f=c[e>>2]|0;e=u+(b<<2)|0;if((f|0)>=0){l=0;while(1){g=c[y+(b*72|0)+(l<<2)>>2]|0;if((g|0)!=-1)c[y+(k*72|0)+(m+l<<2)>>2]=c[A+(((g+z+(c[o>>2]|0)-(c[e>>2]|0)|0)%(z|0)|0)<<2)>>2];if((l|0)<(f|0))l=l+1|0;else break}}if((p|0)>=0){f=0;while(1){o=y+(q*72|0)+(f<<2)|0;m=c[o>>2]|0;l=y+(k*72|0)+(f<<2)|0;c[l>>2]=c[l>>2]^m;c[o>>2]=c[s+(m<<2)>>2];if((f|0)<(p|0))f=f+1|0;else break}}}c[w+(k<<2)>>2]=q-n;if((q|0)>=(r|0))break;f=c[v+(k<<2)>>2]|0;if((f|0)==-1)f=0;else f=c[A+(f<<2)>>2]|0;g=u+(k<<2)|0;c[g>>2]=f;if((n|0)>=1){e=1;while(1){b=c[v+(k-e<<2)>>2]|0;if((b|0)!=-1?(t=c[y+(k*72|0)+(e<<2)>>2]|0,(t|0)!=0):0){f=f^c[A+((((c[s+(t<<2)>>2]|0)+b|0)%(z|0)|0)<<2)>>2];c[g>>2]=f}if((e|0)<(n|0))e=e+1|0;else break}}f=c[s+(f<<2)>>2]|0;c[g>>2]=f;if((n|0)>(j|0))break;else p=n}if((n|0)>(j|0)){f=-1;break}if((n|0)>=0){f=0;while(1){w=y+(k*72|0)+(f<<2)|0;c[w>>2]=c[s+(c[w>>2]<<2)>>2];if((f|0)<(n|0))f=f+1|0;else break}}if((n|0)>=1){f=1;while(1){c[E+(f<<2)>>2]=c[y+(k*72|0)+(f<<2)>>2];if((f|0)<(n|0))f=f+1|0;else break}}l=(n|0)<1;f=0;m=1;do{if(l)b=1;else{j=1;b=1;while(1){e=E+(j<<2)|0;g=c[e>>2]|0;if((g|0)!=-1){y=(g+j|0)%(z|0)|0;c[e>>2]=y;b=c[A+(y<<2)>>2]^b}if((j|0)<(n|0))j=j+1|0;else break}}if(!b){c[G+(f<<2)>>2]=z-m;f=f+1|0}m=m+1|0}while((z|0)>=(m|0));if((f|0)!=(n|0)){f=-1;break}if((n|0)>0){f=0;do{E=B+(c[G+(f<<2)>>2]|0)|0;a[E>>0]=d[E>>0]^1;f=f+1|0}while((f|0)<(n|0))}}else k=0;b=h;c[b>>2]=0;c[b+4>>2]=0;b=1;e=0;g=0;j=0;f=F-C|0;while(1){G=ok(d[B+f>>0]|0,0,b|0,e|0)|0;g=gk(G|0,D|0,g|0,j|0)|0;j=D;G=h;c[G>>2]=g;c[G+4>>2]=j;b=fk(b|0,e|0,1)|0;f=f+1|0;if((f|0)>=(F|0))break;else e=D}if(x)f=c[H+(k<<2)>>2]|0;else f=0}while(0);i=I;return f|0}function Je(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0.0;A=i;i=i+32|0;z=A+24|0;g=A+16|0;d=A+8|0;do if(a){if(!b){Me(3,4674,d);d=-1;break}y=a+8|0;f=c[a+4>>2]|0;a:do if((f|0)>0){e=c[y>>2]|0;d=0;do{if(!(c[e+(d<<2)>>2]|0))break a;d=d+1|0}while((d|0)<(f|0))}else d=0;while(0);if((d|0)!=(f|0)){x=Aj(b)|0;if(!x){Me(3,4719,g);d=-1;break}r=a+28|0;s=d<<2;t=a+12|0;u=a+20|0;v=a+16|0;w=a+24|0;f=Gj(x,4742)|0;e=0;b:while(1){q=e+s|0;p=0;b=0;do{n=(p|0)==0;o=(p|0)==2;g=c[r>>2]|0;if((g|0)>0){m=0;do{if((g|0)>0){l=0;do{if(!f){e=17;break b}g=qj(f)|0;f=Gj(0,4742)|0;g=255-g|0;k=((($(c[r>>2]|0,m)|0)+l|0)*3|0)+p|0;c[(c[(c[t>>2]|0)+(q<<2)>>2]|0)+(k<<2)>>2]=g;k=($(c[r>>2]|0,m)|0)+l|0;j=c[(c[u>>2]|0)+(q<<2)>>2]|0;k=j+(k<<2)|0;if(!n){c[k>>2]=(c[k>>2]|0)+g;if(o){k=j+(($(c[r>>2]|0,m)|0)+l<<2)|0;c[k>>2]=(c[k>>2]|0)/3|0}}else c[k>>2]=g;b=g+b|0;l=l+1|0;g=c[r>>2]|0}while((l|0)<(g|0))}m=m+1|0}while((m|0)<(g|0))}p=p+1|0}while((p|0)<3);g=c[r>>2]|0;l=(b|0)/($(g*3|0,g)|0)|0;if(($(g*3|0,g)|0)>0){j=c[(c[t>>2]|0)+(q<<2)>>2]|0;k=0;b=0;do{p=j+(k<<2)|0;g=(c[p>>2]|0)-l|0;c[p>>2]=g;b=($(g,g)|0)+b|0;k=k+1|0;g=c[r>>2]|0}while((k|0)<($(g*3|0,g)|0))}else b=0;B=+P(+(+(b|0)));h[(c[v>>2]|0)+(q<<3)>>3]=B==0.0?1.0e-07:B;if(!($(g,g)|0))b=0;else{g=c[(c[u>>2]|0)+(q<<2)>>2]|0;j=0;b=0;do{o=g+(j<<2)|0;p=(c[o>>2]|0)-l|0;c[o>>2]=p;b=($(p,p)|0)+b|0;j=j+1|0;p=c[r>>2]|0}while((j|0)<($(p,p)|0))}B=+P(+(+(b|0)));h[(c[w>>2]|0)+(q<<3)>>3]=B==0.0?1.0e-07:B;e=e+1|0;if((e|0)>=4){e=32;break}}if((e|0)==17){Me(3,4747,z);Vj(x);d=-1;break}else if((e|0)==32){Vj(x);c[(c[y>>2]|0)+(d<<2)>>2]=1;c[a>>2]=(c[a>>2]|0)+1;break}}else d=-1}else{Me(3,4649,A);d=-1}while(0);i=A;return d|0}function Ke(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;k=i;i=i+32|0;j=k+16|0;h=k+8|0;e=k;g=_i(d,4854)|0;do if(g){dj(g,0,2)|0;e=gj(g)|0;dj(g,0,0)|0;f=Uj(e+1|0)|0;if(!f){Me(3,5472,h);Wi(g)|0;e=-1;break}h=aj(f,e,1,g)|0;Wi(g)|0;if(!h){c[j>>2]=d;Me(3,4820,j);Vj(f);e=-1;break}else{a[f+e>>0]=0;e=Je(b,f)|0;Vj(f);break}}else{c[e>>2]=d;Me(3,4774,e);e=-1}while(0);i=k;return e|0}function Le(a,b){a=a|0;b=b|0;b=(c[a+8>>2]|0)+(b<<2)|0;if(!(c[b>>2]|0))b=-1;else{c[b>>2]=0;c[a>>2]=(c[a>>2]|0)+-1;b=1}return b|0}function Me(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;j=i;i=i+32|0;h=j+16|0;f=j;c[h>>2]=0;if(((d|0)!=0&(c[496]|0)<=(b|0)?(a[d>>0]|0)!=0:0)?(c[f>>2]=e,g=lj(h,d,f)|0,(g|0)>-1):0){f=c[497]|0;do if(f){if(!(c[498]|0)){Wb[f&15](c[h>>2]|0);break}e=gb()|0;b=c[500]|0;if((e|0)==(c[499]|0)){if((b|0)>0){Wb[f&15](c[502]|0);c[500]=0;f=c[497]|0}Wb[f&15](c[h>>2]|0);break}f=c[501]|0;if((b|0)<(f|0)){d=(c[502]|0)+b|0;if((g|0)<(-3-b+f|0)){yj(d,c[h>>2]|0)|0;c[500]=(c[500]|0)+g;break}else{a[d>>0]=46;a[d+1>>0]=46;a[d+2>>0]=46;a[d+3>>0]=0;c[500]=c[501];break}}}else $i(c[h>>2]|0,c[659]|0)|0;while(0);Vj(c[h>>2]|0)}i=j;return}function Ne(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,i=0;i=0;do{d=a+(i<<5)|0;e=a+(i<<5)+8|0;f=a+(i<<5)+16|0;g=0;do{h[c+(i<<5)+(g<<3)>>3]=+h[d>>3]*+h[b+(g<<3)>>3]+ +h[e>>3]*+h[b+32+(g<<3)>>3]+ +h[f>>3]*+h[b+64+(g<<3)>>3];g=g+1|0}while((g|0)!=4);g=c+(i<<5)+24|0;h[g>>3]=+h[a+(i<<5)+24>>3]+ +h[g>>3];i=i+1|0}while((i|0)!=3);return 0}function Oe(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0;j=Re(4,4)|0;d=c[j>>2]|0;e=c[j>>2]|0;f=c[j>>2]|0;g=c[j>>2]|0;i=0;do{k=i<<2;h[d+(k<<3)>>3]=+h[a+(i<<5)>>3];h[e+(1+k<<3)>>3]=+h[a+(i<<5)+8>>3];h[f+(2+k<<3)>>3]=+h[a+(i<<5)+16>>3];h[g+(3+k<<3)>>3]=+h[a+(i<<5)+24>>3];i=i+1|0}while((i|0)!=3);d=c[j>>2]|0;e=d+96|0;c[e>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;c[e+16>>2]=0;c[e+20>>2]=0;h[d+120>>3]=1.0;_e(j)|0;d=c[j>>2]|0;e=c[j>>2]|0;f=c[j>>2]|0;g=c[j>>2]|0;i=0;do{k=i<<2;h[b+(i<<5)>>3]=+h[d+(k<<3)>>3];h[b+(i<<5)+8>>3]=+h[e+(1+k<<3)>>3];h[b+(i<<5)+16>>3]=+h[f+(2+k<<3)>>3];h[b+(i<<5)+24>>3]=+h[g+(3+k<<3)>>3];i=i+1|0}while((i|0)!=3);We(j)|0;return 0}function Pe(a){a=a|0;switch(a|0){case 1:case 0:{a=3;break}case 6:case 4:case 3:case 2:{a=4;break}case 14:case 13:case 12:case 5:{a=1;break}case 11:case 10:case 9:case 8:case 7:{a=2;break}default:a=0}return a|0}function Qe(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;var f=0;do if((b|0)!=0&(c|0)!=0&(d|0)!=0){f=Ej(c,47)|0;if(!f){a[b>>0]=0;break}f=f+((e|0)!=0&1)-c|0;if((f+1|0)>>>0<=d>>>0){Dj(b,c,f)|0;a[b+f>>0]=0}else b=0}else b=0;while(0);return b|0}function Re(a,b){a=a|0;b=b|0;var d=0,e=0;d=Uj(12)|0;do if(d){e=Uj($(a<<3,b)|0)|0;c[d>>2]=e;if(!e){Vj(d);d=0;break}else{c[d+4>>2]=a;c[d+8>>2]=b;break}}else d=0;while(0);return d|0}function Se(a){a=a|0;var b=0;b=Re(c[a+4>>2]|0,c[a+8>>2]|0)|0;if(b){if((Ve(b,a)|0)<0){We(b)|0;b=0}}else b=0;return b|0}function Te(a,b){a=a|0;b=b|0;var d=0;d=Re(c[a+4>>2]|0,c[b+8>>2]|0)|0;if(d){if((Xe(d,a,b)|0)<0){We(d)|0;d=0}}else d=0;return d|0}function Ue(a){a=a|0;var b=0;b=Re(c[a+8>>2]|0,c[a+4>>2]|0)|0;if(b){if(($e(b,a)|0)<0){We(b)|0;b=0}}else b=0;return b|0}function Ve(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0;d=c[a+4>>2]|0;if((d|0)==(c[b+4>>2]|0)?(j=c[a+8>>2]|0,(j|0)==(c[b+8>>2]|0)):0)if((d|0)>0){e=(j|0)>0;l=0;do{f=$(j,l)|0;if(e){g=c[b>>2]|0;i=c[a>>2]|0;k=0;do{m=f+k|0;h[i+(m<<3)>>3]=+h[g+(m<<3)>>3];k=k+1|0}while((k|0)<(j|0))}l=l+1|0}while((l|0)<(d|0));d=0}else d=0;else d=-1;return d|0}function We(a){a=a|0;if(a){Vj(c[a>>2]|0);Vj(a)}return 0}function Xe(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;n=c[b+8>>2]|0;if(((n|0)==(c[d+4>>2]|0)?(r=c[a+4>>2]|0,(r|0)==(c[b+4>>2]|0)):0)?(o=c[a+8>>2]|0,(o|0)==(c[d+8>>2]|0)):0){s=(o|0)>0?o:0;if((r|0)>0){p=(o|0)>0;q=(n|0)>0;k=c[a>>2]|0;m=0;while(1){a=$(n,m)|0;if(p){f=0;l=k;while(1){h[l>>3]=0.0;if(q){e=0.0;g=0;i=(c[b>>2]|0)+(a<<3)|0;j=(c[d>>2]|0)+(f<<3)|0;while(1){e=e+ +h[i>>3]*+h[j>>3];h[l>>3]=e;g=g+1|0;if((g|0)>=(n|0))break;else{i=i+8|0;j=j+(o<<3)|0}}}f=f+1|0;if((f|0)>=(o|0))break;else l=l+8|0}}m=m+1|0;if((m|0)>=(r|0)){a=0;break}else k=k+(s<<3)|0}}else a=0}else a=-1;return a|0}function Ye(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0.0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0,t=0,u=0;q=c[a+4>>2]|0;s=c[a+8>>2]|0;f=(q|0)<(s|0)?q:s;a:do if(((((!((q|0)<2|(s|0)<2)?(c[b+8>>2]|0)==(s|0):0)?(c[b+4>>2]|0)==(f|0):0)?(t=d+4|0,(c[t>>2]|0)==(f|0)):0)?(g=e+4|0,(c[g>>2]|0)==(s|0)):0)?(u=Se(a)|0,(u|0)!=0):0){r=+P(+(+(q|0)));o=c[u+4>>2]|0;p=c[u+8>>2]|0;if(!((o|0)<1|(p|0)<1)?(c[g>>2]|0)==(p|0):0){if(p){f=c[e>>2]|0;a=0;do{h[f+(a<<3)>>3]=0.0;a=a+1|0}while((a|0)!=(p|0))}n=c[u>>2]|0;if(o){f=(p|0)==0;a=0;j=n;while(1){if(!f){g=0;k=j;l=c[e>>2]|0;while(1){h[l>>3]=+h[k>>3]+ +h[l>>3];g=g+1|0;if((g|0)==(p|0))break;else{k=k+8|0;l=l+8|0}}}a=a+1|0;if((a|0)==(o|0))break;else j=j+(p<<3)|0}}i=+(o|0);if(p){f=c[e>>2]|0;a=0;do{m=f+(a<<3)|0;h[m>>3]=+h[m>>3]/i;a=a+1|0}while((a|0)!=(p|0))}l=(p|0)>0?p:0;if((o|0)>0){f=(p|0)>0;a=0;j=n;while(1){if(f){g=0;k=j;m=c[e>>2]|0;while(1){h[k>>3]=+h[k>>3]-+h[m>>3];g=g+1|0;if((g|0)>=(p|0))break;else{k=k+8|0;m=m+8|0}}}a=a+1|0;if((a|0)>=(o|0))break;else j=j+(l<<3)|0}}f=$(s,q)|0;if((f|0)>0){a=0;do{e=n+(a<<3)|0;h[e>>3]=+h[e>>3]/r;a=a+1|0}while((a|0)<(f|0))}f=Ze(u,b,d)|0;We(u)|0;j=c[t>>2]|0;if((j|0)>0){a=c[d>>2]|0;g=0;i=0.0;do{i=i+ +h[a+(g<<3)>>3];g=g+1|0}while((g|0)<(j|0))}else i=0.0;if((j|0)<=0)break;a=c[d>>2]|0;g=0;while(1){d=a+(g<<3)|0;h[d>>3]=+h[d>>3]/i;g=g+1|0;if((g|0)>=(j|0))break a}}We(u)|0;f=-1}else f=-1;while(0);return f|0}function Ze(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0.0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0,s=0,t=0,u=0.0,v=0.0,w=0,x=0.0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,Q=0,R=0,S=0,T=0,U=0,V=0.0,W=0.0,X=0.0,Y=0,Z=0;U=i;i=i+16|0;w=U;F=a+4|0;I=c[F>>2]|0;J=a+8|0;K=c[J>>2]|0;S=(K|0)<(I|0)?K:I;a:do if(((!((I|0)<2|(K|0)<2)?(R=b+8|0,(c[R>>2]|0)==(K|0)):0)?(L=b+4|0,(c[L>>2]|0)==(S|0)):0)?(M=d+4|0,(c[M>>2]|0)==(S|0)):0){T=Re(S,S)|0;N=T+4|0;if((c[N>>2]|0)==(S|0)?(Q=T+8|0,(c[Q>>2]|0)==(S|0)):0){G=(I|0)<(K|0);s=c[F>>2]|0;t=c[J>>2]|0;if(G){if((S|0)!=(s|0)){We(T)|0;e=-1;break}g=c[T>>2]|0;if((S|0)>0){m=(S|0)==0;j=(t|0)>0;n=0;r=g;while(1){l=$(n,t)|0;if(!m){p=0;s=r;while(1){if((p|0)>=(n|0)){e=c[a>>2]|0;h[s>>3]=0.0;if(j){k=0.0;o=e+(l<<3)|0;e=e+(($(p,t)|0)<<3)|0;f=0;while(1){k=k+ +h[o>>3]*+h[e>>3];h[s>>3]=k;f=f+1|0;if((f|0)>=(t|0))break;else{o=o+8|0;e=e+8|0}}}}else h[s>>3]=+h[g+(($(p,S)|0)+n<<3)>>3];p=p+1|0;if((p|0)==(S|0))break;else s=s+8|0}}n=n+1|0;if((n|0)>=(S|0))break;else r=r+(S<<3)|0}}}else{if((S|0)!=(t|0)){We(T)|0;e=-1;break}g=c[T>>2]|0;if((S|0)>0){l=(S|0)==0;j=(s|0)>0;m=0;p=g;while(1){if(!l){o=0;r=p;while(1){if((o|0)>=(m|0)){e=c[a>>2]|0;h[r>>3]=0.0;if(j){k=0.0;n=e+(m<<3)|0;e=e+(o<<3)|0;f=0;while(1){k=k+ +h[n>>3]*+h[e>>3];h[r>>3]=k;f=f+1|0;if((f|0)>=(s|0))break;else{n=n+(S<<3)|0;e=e+(S<<3)|0}}}}else h[r>>3]=+h[g+(($(o,S)|0)+m<<3)>>3];o=o+1|0;if((o|0)==(S|0))break;else r=r+8|0}}m=m+1|0;if((m|0)>=(S|0))break;else p=p+(S<<3)|0}}}do if(((S|0)>=2?(c[M>>2]|0)==(S|0):0)?(H=nf(S)|0,(H|0)!=0):0){E=S+-1|0;c[w+4>>2]=E;c[w>>2]=(c[H>>2]|0)+8;if((rf(T,d,w)|0)<0){of(H)|0;break}B=c[H>>2]|0;h[B>>3]=0.0;if((E|0)>0){C=(S|0)==0;D=E;do{f=D;while(1){if((f|0)<=0)break;v=+O(+(+h[B+(f<<3)>>3]));e=f+-1|0;A=c[d>>2]|0;x=+O(+(+h[A+(e<<3)>>3]));if(v>(x+ +O(+(+h[A+(f<<3)>>3])))*1.0e-06)f=e;else break}y=D;D=D+-1|0;b:do if((f|0)!=(y|0)){o=B+(y<<3)|0;p=B+(f+1<<3)|0;r=(f|0)<(y|0);z=0;do{if((z|0)>99)break b;z=z+1|0;s=c[d>>2]|0;t=s+(D<<3)|0;w=s+(y<<3)|0;k=+h[w>>3];q=(+h[t>>3]-k)*.5;u=+h[o>>3];u=u*u;v=+P(+(u+q*q));if(r){A=f;q=+h[s+(f<<3)>>3]-k+u/(q+(q<0.0?-v:v));u=+h[p>>3];while(1){k=+O(+q);do if(!(k>=+O(+u))){v=-q/u;x=1.0/+P(+(v*v+1.0));v=v*x}else{if(!(k>1.0e-16)){v=1.0;x=0.0;break}k=-u/q;x=1.0/+P(+(k*k+1.0));v=x;x=k*x}while(0);j=s+(A<<3)|0;X=+h[j>>3];n=A;A=A+1|0;l=s+(A<<3)|0;W=+h[l>>3];k=X-W;m=B+(A<<3)|0;V=x*(x*k+v*2.0*+h[m>>3]);h[j>>3]=X-V;h[l>>3]=W+V;if((n|0)>(f|0)){l=B+(n<<3)|0;h[l>>3]=v*+h[l>>3]-u*x}X=+h[m>>3];h[m>>3]=X+x*(v*k-x*2.0*X);j=$(n,S)|0;l=$(A,S)|0;if(C)k=u;else{e=c[T>>2]|0;g=0;do{Z=e+(g+j<<3)|0;q=+h[Z>>3];Y=e+(g+l<<3)|0;k=+h[Y>>3];h[Z>>3]=v*q-x*k;h[Y>>3]=x*q+v*k;g=g+1|0}while((g|0)!=(S|0))}if((n|0)<(D|0)){q=+h[m>>3];Z=B+(n+2<<3)|0;k=+h[Z>>3];h[Z>>3]=v*k;k=-(x*k)}if((A|0)>=(y|0))break;else u=k}}W=+O(+(+h[o>>3]));X=+O(+(+h[t>>3]))}while(W>(X+ +O(+(+h[w>>3])))*1.0e-06)}while(0)}while((y|0)>1)}if(E){l=c[d>>2]|0;m=c[T>>2]|0;n=(S|0)==0;o=0;do{g=l+(o<<3)|0;q=+h[g>>3];j=o;o=o+1|0;if((o|0)<(S|0)){e=j;f=o;k=q;do{X=+h[l+(f<<3)>>3];Z=X>k;k=Z?X:k;e=Z?f:e;f=f+1|0}while((f|0)<(S|0))}else{e=j;k=q}h[l+(e<<3)>>3]=q;h[g>>3]=k;if(!n){g=0;f=m+(($(e,S)|0)<<3)|0;e=m+(($(j,S)|0)<<3)|0;while(1){X=+h[f>>3];h[f>>3]=+h[e>>3];h[e>>3]=X;g=g+1|0;if((g|0)==(S|0))break;else{f=f+8|0;e=e+8|0}}}}while((o|0)!=(E|0))}of(H)|0;c:do if(!G){g=c[b>>2]|0;p=(I|0)>(K|0)?K:I;d:do if((S|0)>0){m=c[d>>2]|0;n=(p|0)==0;e=0;o=c[T>>2]|0;do{if(+h[m+(e<<3)>>3]<1.0e-16)break d;if(!n){f=0;j=o;l=g;while(1){h[l>>3]=+h[j>>3];f=f+1|0;if((f|0)==(p|0))break;else{j=j+8|0;l=l+8|0}}}o=o+(p<<3)|0;g=g+(p<<3)|0;e=e+1|0}while((e|0)<(S|0))}else e=0;while(0);n=(p|0)>0?p:0;if((e|0)<(S|0)){l=c[d>>2]|0;m=(S|0)>0;while(1){h[l+(e<<3)>>3]=0.0;if(m){f=0;j=g;while(1){h[j>>3]=0.0;f=f+1|0;if((f|0)>=(S|0))break;else j=j+8|0}}e=e+1|0;if((e|0)>=(S|0))break;else g=g+(n<<3)|0}}}else{w=c[F>>2]|0;t=c[J>>2]|0;do if(!((w|0)<1|(t|0)<1)){if((c[N>>2]|0)!=(w|0))break;if((c[Q>>2]|0)!=(w|0))break;if((c[L>>2]|0)!=(w|0))break;if((c[R>>2]|0)!=(t|0))break;if((c[M>>2]|0)!=(w|0))break;f=c[b>>2]|0;e:do if((w|0)>0){p=c[d>>2]|0;s=(t|0)==0;r=(w|0)==0;e=0;do{k=+h[p+(e<<3)>>3];if(k<1.0e-16)break e;q=1.0/+P(+(+O(+k)));m=$(e,w)|0;if(!s){n=0;o=f;while(1){if(r)k=0.0;else{g=0;j=(c[T>>2]|0)+(m<<3)|0;l=(c[a>>2]|0)+(n<<3)|0;k=0.0;while(1){k=k+ +h[j>>3]*+h[l>>3];g=g+1|0;if((g|0)==(w|0))break;else{j=j+8|0;l=l+(t<<3)|0}}}h[o>>3]=q*k;n=n+1|0;if((n|0)==(t|0))break;else o=o+8|0}}f=f+(t<<3)|0;e=e+1|0}while((e|0)<(w|0))}else e=0;while(0);n=(t|0)>0?t:0;if((e|0)>=(w|0))break c;l=c[d>>2]|0;m=(t|0)>0;g=f;while(1){h[l+(e<<3)>>3]=0.0;if(m){f=0;j=g;while(1){h[j>>3]=0.0;f=f+1|0;if((f|0)>=(t|0))break;else j=j+8|0}}e=e+1|0;if((e|0)>=(w|0))break c;else g=g+(n<<3)|0}}while(0);We(T)|0;e=-1;break a}while(0);We(T)|0;e=0;break a}while(0);We(T)|0;e=-1;break}We(T)|0;e=-1}else e=-1;while(0);i=U;return e|0}function _e(a){a=a|0;var b=0,d=0,e=0,f=0.0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0.0,x=0;v=i;i=i+2e3|0;u=v;b=c[a>>2]|0;t=c[a+4>>2]|0;a:do if((t|0)<=500){switch(t|0){case 0:{b=0;break a}case 1:{h[b>>3]=1.0/+h[b>>3];break a}default:{}}if((t|0)>0){a=0;do{c[u+(a<<2)>>2]=a;a=a+1|0}while((a|0)<(t|0))}s=b+(t+-1<<3)|0;if((t|0)>0){m=(t|0)==0;p=(t|0)==1;o=(t|0)==0;n=(t|0)==1;q=s;a=0;r=0;while(1){l=b+(($(r,t)|0)<<3)|0;if((r|0)<(t|0)){e=r;f=0.0;d=l;while(1){w=+O(+(+h[d>>3]));k=f<w;a=k?e:a;f=k?w:f;e=e+1|0;if((e|0)>=(t|0))break;else d=d+(t<<3)|0}}else f=0.0;if(f<=1.0e-10){b=0;break a}g=u+(a<<2)|0;j=c[g>>2]|0;k=u+(r<<2)|0;c[g>>2]=c[k>>2];c[k>>2]=j;if(!m){d=0;e=b+(($(a,t)|0)<<3)|0;g=l;while(1){w=+h[e>>3];h[e>>3]=+h[g>>3];h[g>>3]=w;d=d+1|0;if((d|0)==(t|0))break;else{e=e+8|0;g=g+8|0}}}f=+h[l>>3];if(!p){d=1;e=l;do{k=e;e=e+8|0;h[k>>3]=+h[e>>3]/f;d=d+1|0}while((d|0)!=(t|0))}h[q>>3]=1.0/f;if(!o){g=0;j=s;while(1){if((g|0)!=(r|0)){d=b+(($(g,t)|0)<<3)|0;f=+h[d>>3];if(!n){k=1;e=l;while(1){x=d;d=d+8|0;h[x>>3]=+h[d>>3]-f*+h[e>>3];k=k+1|0;if((k|0)==(t|0))break;else e=e+8|0}}h[j>>3]=-(f*+h[q>>3])}g=g+1|0;if((g|0)==(t|0))break;else j=j+(t<<3)|0}}r=r+1|0;if((r|0)>=(t|0))break;else q=q+(t<<3)|0}}if((t|0)>0){g=(t|0)>0;j=0;do{a=u+(j<<2)|0;b:do if((j|0)<(t|0)){d=j;do{if((c[a>>2]|0)==(j|0))break b;d=d+1|0;a=u+(d<<2)|0}while((d|0)<(t|0))}else d=j;while(0);c[a>>2]=c[u+(j<<2)>>2];if(g){e=0;a=b+(d<<3)|0;d=b+(j<<3)|0;while(1){w=+h[a>>3];h[a>>3]=+h[d>>3];h[d>>3]=w;e=e+1|0;if((e|0)>=(t|0))break;else{a=a+(t<<3)|0;d=d+(t<<3)|0}}}j=j+1|0}while((j|0)<(t|0))}}else b=0;while(0);i=v;return ((b|0)==0)<<31>>31|0}function $e(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,l=0;i=c[a+4>>2]|0;if((i|0)==(c[b+8>>2]|0)?(k=c[a+8>>2]|0,(k|0)==(c[b+4>>2]|0)):0){l=(k|0)>0?k:0;if((i|0)>0){j=(k|0)>0;e=c[a>>2]|0;g=0;while(1){if(j){a=0;d=(c[b>>2]|0)+(g<<3)|0;f=e;while(1){h[f>>3]=+h[d>>3];a=a+1|0;if((a|0)>=(k|0))break;else{d=d+(i<<3)|0;f=f+8|0}}}g=g+1|0;if((g|0)>=(i|0)){a=0;break}else e=e+(l<<3)|0}}else a=0}else a=-1;return a|0}function af(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,g=0.0,i=0;f=+(b|0)/+(c[a>>2]|0);g=+(d|0)/+(c[a+4>>2]|0);c[e>>2]=b;c[e+4>>2]=d;b=0;do{h[e+8+(b<<3)>>3]=f*+h[a+8+(b<<3)>>3];h[e+40+(b<<3)>>3]=g*+h[a+40+(b<<3)>>3];h[e+72+(b<<3)>>3]=+h[a+72+(b<<3)>>3];b=b+1|0}while((b|0)!=4);b=c[a+176>>2]|0;switch(b|0){case 4:{h[e+104>>3]=+h[a+104>>3];h[e+112>>3]=+h[a+112>>3];h[e+120>>3]=+h[a+120>>3];h[e+128>>3]=+h[a+128>>3];h[e+136>>3]=f*+h[a+136>>3];h[e+144>>3]=g*+h[a+144>>3];h[e+152>>3]=f*+h[a+152>>3];h[e+160>>3]=g*+h[a+160>>3];h[e+168>>3]=+h[a+168>>3];i=8;break}case 3:{h[e+104>>3]=f*+h[a+104>>3];h[e+112>>3]=g*+h[a+112>>3];h[e+120>>3]=+h[a+120>>3];h[e+128>>3]=+h[a+128>>3];h[e+136>>3]=+h[a+136>>3]/(f*g);h[e+144>>3]=+h[a+144>>3]/(g*(f*f*g));i=8;break}case 2:{h[e+104>>3]=f*+h[a+104>>3];h[e+112>>3]=g*+h[a+112>>3];h[e+120>>3]=+h[a+120>>3];h[e+128>>3]=+h[a+128>>3]/(f*g);h[e+136>>3]=+h[a+136>>3]/(g*(f*f*g));i=8;break}case 1:{h[e+104>>3]=f*+h[a+104>>3];h[e+112>>3]=g*+h[a+112>>3];h[e+120>>3]=+h[a+120>>3];h[e+128>>3]=+h[a+128>>3]/(f*g);i=8;break}default:b=-1}if((i|0)==8){c[e+176>>2]=b;b=0}return b|0}function bf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0.0,j=0,k=0.0,l=0,m=0,n=0,o=0.0,p=0.0,q=0,r=0,s=0.0,t=0,u=0,v=0,w=0,x=0.0;f=i;i=i+96|0;e=f;if(!(+h[a+88>>3]>=0.0)){d=0;do{h[e+(d<<5)>>3]=-+h[a+(d<<5)>>3];h[e+(d<<5)+8>>3]=-+h[a+(d<<5)+8>>3];h[e+(d<<5)+16>>3]=-+h[a+(d<<5)+16>>3];h[e+(d<<5)+24>>3]=-+h[a+(d<<5)+24>>3];d=d+1|0}while((d|0)!=3)}else{d=0;do{h[e+(d<<5)>>3]=+h[a+(d<<5)>>3];h[e+(d<<5)+8>>3]=+h[a+(d<<5)+8>>3];h[e+(d<<5)+16>>3]=+h[a+(d<<5)+16>>3];h[e+(d<<5)+24>>3]=+h[a+(d<<5)+24>>3];d=d+1|0}while((d|0)!=3)}h[b>>3]=0.0;h[b+8>>3]=0.0;h[b+16>>3]=0.0;h[b+24>>3]=0.0;h[b+32>>3]=0.0;h[b+40>>3]=0.0;h[b+48>>3]=0.0;h[b+56>>3]=0.0;h[b+64>>3]=0.0;h[b+72>>3]=0.0;h[b+80>>3]=0.0;h[b+88>>3]=0.0;g=+h[e+64>>3];o=+h[e+72>>3];p=+h[e+80>>3];x=+P(+(g*g+o*o+p*p));a=b+80|0;h[a>>3]=x;x=g/x;v=c+64|0;h[v>>3]=x;o=o/+h[a>>3];t=c+72|0;h[t>>3]=o;p=p/+h[a>>3];q=c+80|0;h[q>>3]=p;n=c+88|0;h[n>>3]=+h[e+88>>3]/+h[a>>3];g=+h[e+32>>3];k=+h[e+40>>3];s=+h[e+48>>3];p=x*g+o*k+p*s;m=b+48|0;h[m>>3]=p;g=g-p*+h[v>>3];k=k-p*+h[t>>3];p=s-p*+h[q>>3];s=+P(+(g*g+k*k+p*p));l=b+40|0;h[l>>3]=s;w=c+32|0;h[w>>3]=g/s;u=c+40|0;h[u>>3]=k/+h[l>>3];r=c+48|0;h[r>>3]=p/+h[l>>3];p=+h[e>>3];k=+h[e+8>>3];s=+h[e+16>>3];g=+h[v>>3]*p+ +h[t>>3]*k+ +h[q>>3]*s;d=b+16|0;h[d>>3]=g;o=+h[w>>3]*p+ +h[u>>3]*k+ +h[r>>3]*s;j=b+8|0;h[j>>3]=o;p=p-o*+h[w>>3]-g*+h[v>>3];k=k-o*+h[u>>3]-g*+h[t>>3];g=s-o*+h[r>>3]-g*+h[q>>3];o=+P(+(p*p+k*k+g*g));h[b>>3]=o;h[c>>3]=p/o;h[c+8>>3]=k/+h[b>>3];h[c+16>>3]=g/+h[b>>3];g=+h[n>>3];k=(+h[e+56>>3]-+h[m>>3]*g)/+h[l>>3];h[c+56>>3]=k;h[c+24>>3]=(+h[e+24>>3]-k*+h[j>>3]-+h[d>>3]*g)/+h[b>>3];d=0;do{w=b+(d<<5)|0;h[w>>3]=+h[w>>3]/+h[a>>3];w=b+(d<<5)+8|0;h[w>>3]=+h[w>>3]/+h[a>>3];w=b+(d<<5)+16|0;h[w>>3]=+h[w>>3]/+h[a>>3];d=d+1|0}while((d|0)!=3);i=f;return 0}function cf(a,b,c,d,e,f){a=a|0;b=+b;c=+c;d=d|0;e=e|0;f=f|0;var g=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0;switch(f|0){case 4:{q=+h[a>>3];r=+h[a+8>>3];s=+h[a+16>>3];t=+h[a+24>>3];y=+h[a+32>>3];v=+h[a+40>>3];w=+h[a+48>>3];x=+h[a+56>>3];u=+h[a+64>>3];p=(b-w)/y;j=(c-x)/v;c=p*p;i=j*j;k=s*2.0;l=t*6.0;m=t*2.0;n=s*6.0;a:do if(i!=0.0|c!=0.0){f=1;g=p;b=j;while(1){C=i+c;B=q*C+1.0+C*(r*C);z=c*3.0;A=i*z;g=g-(t*(C+c*2.0)+(b*(k*g)+g*B)-p)/(l*g+(k*b+(q*(i+z)+1.0+r*(i*i+(c*(c*5.0)+A)))));z=m*g;b=b-(s*(i*2.0+C)+b*B+b*z-j)/(n*b+(q*(c+i*3.0)+1.0+r*(i*(i*5.0)+(c*c+A)))+z);if((f|0)==4)break a;c=g*g;i=b*b;if(!(i!=0.0|c!=0.0)){g=0.0;b=0.0;break}else f=f+1|0}}else{g=0.0;b=0.0}while(0);h[d>>3]=w+y*g/u;h[e>>3]=x+v*b/u;f=0;break}case 3:{p=+h[a>>3];g=(b-p)/+h[a+24>>3];o=a+8|0;b=c-+h[o>>3];j=+h[a+32>>3]/1.0e8;k=+h[a+40>>3]/1.0e8/1.0e5;c=g*g+b*b;l=+P(+c);m=j*3.0;n=k*5.0;b:do if(l!=0.0){f=1;i=l;while(1){C=i-(i*(1.0-j*c-c*(k*c))-l)/(1.0-m*c-c*(n*c));g=g*C/i;b=b*C/i;if((f|0)==3)break b;c=g*g+b*b;i=+P(+c);if(!(i!=0.0)){g=0.0;b=0.0;break}else f=f+1|0}}else{g=0.0;b=0.0}while(0);f=a+16|0;h[d>>3]=g/+h[f>>3]+p;h[e>>3]=b/+h[f>>3]+ +h[o>>3];f=0;break}case 2:{p=+h[a>>3];g=b-p;o=a+8|0;b=c-+h[o>>3];j=+h[a+24>>3]/1.0e8;k=+h[a+32>>3]/1.0e8/1.0e5;c=g*g+b*b;l=+P(+c);m=j*3.0;n=k*5.0;c:do if(l!=0.0){f=1;i=l;while(1){C=i-(i*(1.0-j*c-c*(k*c))-l)/(1.0-m*c-c*(n*c));g=g*C/i;b=b*C/i;if((f|0)==3)break c;c=g*g+b*b;i=+P(+c);if(!(i!=0.0)){g=0.0;b=0.0;break}else f=f+1|0}}else{g=0.0;b=0.0}while(0);f=a+16|0;h[d>>3]=g/+h[f>>3]+p;h[e>>3]=b/+h[f>>3]+ +h[o>>3];f=0;break}case 1:{m=+h[a>>3];g=b-m;o=a+8|0;b=c-+h[o>>3];j=+h[a+24>>3]/1.0e8;c=g*g+b*b;k=+P(+c);l=j*3.0;d:do if(k!=0.0){f=1;i=k;while(1){C=i-(i*(1.0-j*c)-k)/(1.0-l*c);g=g*C/i;b=b*C/i;if((f|0)==3)break d;c=g*g+b*b;i=+P(+c);if(!(i!=0.0)){g=0.0;b=0.0;break}else f=f+1|0}}else{g=0.0;b=0.0}while(0);f=a+16|0;h[d>>3]=g/+h[f>>3]+m;h[e>>3]=b/+h[f>>3]+ +h[o>>3];f=0;break}default:f=-1}return f|0}function df(a,b,c,d,e,f){a=a|0;b=+b;c=+c;d=d|0;e=e|0;f=f|0;var g=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0;switch(f|0){case 4:{j=+h[a+16>>3];k=+h[a+24>>3];n=+h[a+32>>3];l=+h[a+40>>3];o=+h[a+48>>3];m=+h[a+56>>3];i=+h[a+64>>3];b=(b-o)*i/n;i=(c-m)*i/l;g=b*b+i*i;c=+h[a>>3]*g+1.0+g*(+h[a+8>>3]*g);h[d>>3]=o+n*(k*(b*(b*2.0)+g)+(j*2.0*b*i+b*c));h[e>>3]=m+l*(k*2.0*b*i+(j*(g+i*(i*2.0))+i*c));f=0;break}case 3:{i=+h[a>>3];o=+h[a+16>>3];g=(b-i)*o;f=a+8|0;b=o*(c-+h[f>>3]);if(g==0.0&b==0.0){h[d>>3]=i;b=+h[f>>3]}else{o=g*g+b*b;o=1.0-o*(+h[a+32>>3]/1.0e8)-o*(o*(+h[a+40>>3]/1.0e8/1.0e5));h[d>>3]=i+ +h[a+24>>3]*(g*o);b=+h[f>>3]+b*o}h[e>>3]=b;f=0;break}case 2:{i=+h[a>>3];o=+h[a+16>>3];g=(b-i)*o;f=a+8|0;b=o*(c-+h[f>>3]);if(g==0.0&b==0.0){h[d>>3]=i;b=+h[f>>3]}else{o=g*g+b*b;o=1.0-o*(+h[a+24>>3]/1.0e8)-o*(o*(+h[a+32>>3]/1.0e8/1.0e5));h[d>>3]=i+g*o;b=+h[f>>3]+b*o}h[e>>3]=b;f=0;break}case 1:{i=+h[a>>3];o=+h[a+16>>3];g=(b-i)*o;f=a+8|0;b=o*(c-+h[f>>3]);if(g==0.0&b==0.0){h[d>>3]=i;b=+h[f>>3]}else{o=1.0-(g*g+b*b)*(+h[a+24>>3]/1.0e8);h[d>>3]=i+g*o;b=+h[f>>3]+b*o}h[e>>3]=b;f=0;break}default:f=-1}return f|0}function ef(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0;s=i;i=i+256|0;n=s+232|0;m=s+224|0;l=s+216|0;k=s+208|0;j=s+200|0;g=s+192|0;f=s+184|0;p=s+240|0;q=s;do if((a|0)!=0&(b|0)>0&(d|0)!=0){r=_i(a,4854)|0;if(!r){r=qi()|0;c[f>>2]=c[r>>2];c[f+4>>2]=a;Me(3,4857,f);a=ri(c[r>>2]|0)|0;c[g>>2]=5367;c[g+4>>2]=a;Me(3,5361,g);a=-1;break}dj(r,0,2)|0;a:do if(!(Xi(r)|0)){g=gj(r)|0;jj(r);a=0;do{if((a|0)>=4){o=9;break}f=c[2012+(a<<3)+4>>2]|0;a=a+1|0}while(((g|0)%(f|0)|0|0)!=0);do if((o|0)==9)if((a|0)==4){Me(3,4971,l);a=-1;break a}else{f=c[2012+(0<<3)+4>>2]|0;a=0;break}while(0);if((aj(q,f,1,r)|0)!=1){a=qi()|0;c[m>>2]=c[a>>2];Me(3,5051,m);a=ri(c[a>>2]|0)|0;c[n>>2]=5367;c[n+4>>2]=a;Me(3,5361,n);a=-1;break}l=q+176|0;c[l>>2]=a;ff(q);m=(a|0)==1;n=q+120|0;if(m){t=+h[n>>3];k=q+128|0;h[n>>3]=+h[k>>3];h[k>>3]=t}else k=q+128|0;ik(d|0,q|0,184)|0;c[p>>2]=e;f=d+176|0;if((b|0)>1){j=1;while(1){e=(c[p>>2]|0)+(4-1)&~(4-1);g=c[e>>2]|0;c[p>>2]=e+4;c[g+176>>2]=c[f>>2];if((aj(q,c[2012+((c[f>>2]|0)+-1<<3)+4>>2]|0,1,r)|0)!=1){a=-1;break a}c[l>>2]=a;ff(q);if(m){t=+h[n>>3];h[n>>3]=+h[k>>3];h[k>>3]=t}ik(g|0,q|0,184)|0;j=j+1|0;if((j|0)>=(b|0)){a=0;break}}}else a=0}else{a=qi()|0;c[j>>2]=c[a>>2];Me(3,4926,j);a=ri(c[a>>2]|0)|0;c[k>>2]=5367;c[k+4>>2]=a;Me(3,5361,k);a=-1}while(0);Wi(r)|0}else a=-1;while(0);i=s;return a|0}function ff(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;g=i;i=i+192|0;f=g;hf(a,f);hf(a+4|0,f+4|0);b=0;do{gf(a+8+(b<<5)|0,f+8+(b<<5)|0);gf(a+8+(b<<5)+8|0,f+8+(b<<5)+8|0);gf(a+8+(b<<5)+16|0,f+8+(b<<5)+16|0);gf(a+8+(b<<5)+24|0,f+8+(b<<5)+24|0);b=b+1|0}while((b|0)!=3);d=a+176|0;e=0;do{gf(a+104+(e<<3)|0,f+104+(e<<3)|0);e=e+1|0;b=c[d>>2]|0}while((e|0)<(c[2012+(b+-1<<3)>>2]|0));c[f+176>>2]=b;ik(a|0,f|0,184)|0;i=g;return}function gf(b,c){b=b|0;c=c|0;a[c>>0]=a[b+7>>0]|0;a[c+1>>0]=a[b+6>>0]|0;a[c+2>>0]=a[b+5>>0]|0;a[c+3>>0]=a[b+4>>0]|0;a[c+4>>0]=a[b+3>>0]|0;a[c+5>>0]=a[b+2>>0]|0;a[c+6>>0]=a[b+1>>0]|0;a[c+7>>0]=a[b>>0]|0;return}function hf(b,c){b=b|0;c=c|0;a[c>>0]=a[b+3>>0]|0;a[c+1>>0]=a[b+2>>0]|0;a[c+2>>0]=a[b+1>>0]|0;a[c+3>>0]=a[b>>0]|0;return}function jf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0;x=i;i=i+64|0;t=x+24|0;u=x+16|0;v=x+8|0;w=x;q=Uj(208)|0;if(!q){Me(3,5472,x+32|0);rb(1)}ik(q|0,a|0,184)|0;s=b<<1;r=(c[a>>2]|0)+s|0;c[q+192>>2]=r;s=(c[a+4>>2]|0)+s|0;c[q+196>>2]=s;c[q+200>>2]=b;c[q+204>>2]=b;d=$(r<<3,s)|0;e=Uj(d)|0;c[q+184>>2]=e;if(!e){Me(3,5472,x+40|0);rb(1)}d=Uj(d)|0;c[q+188>>2]=d;if(!d){Me(3,5472,x+48|0);rb(1)}p=a+104|0;m=c[a+176>>2]|0;n=(r|0)>0?r<<1:0;if((s|0)>0){o=(r|0)>0;l=0;while(1){f=+(l-b|0);if(o){a=0;j=e;k=d;while(1){y=+(a-b|0);df(p,y,f,v,w,m)|0;g[j>>2]=+h[v>>3];g[j+4>>2]=+h[w>>3];cf(p,y,f,t,u,m)|0;g[k>>2]=+h[t>>3];g[k+4>>2]=+h[u>>3];a=a+1|0;if((a|0)>=(r|0))break;else{j=j+8|0;k=k+8|0}}}d=d+(n<<2)|0;l=l+1|0;if((l|0)>=(s|0))break;else e=e+(n<<2)|0}}i=x;return q|0}function kf(a){a=a|0;var b=0;if((a|0)!=0?(b=c[a>>2]|0,(b|0)!=0):0){Vj(c[b+184>>2]|0);Vj(c[(c[a>>2]|0)+188>>2]|0);Vj(c[a>>2]|0);c[a>>2]=0;b=0}else b=-1;return b|0}function lf(a,b,d,e,f){a=a|0;b=+b;d=+d;e=e|0;f=f|0;var g=0,h=0,i=0;h=(c[a+16>>2]|0)+~~(b+.5)|0;g=(c[a+20>>2]|0)+~~(d+.5)|0;if(((h|0)>=0?(i=c[a+8>>2]|0,!((g|0)<0|(h|0)>=(i|0))):0)?(g|0)<(c[a+12>>2]|0):0){a=c[a>>2]|0;g=($(i,g)|0)+h<<1;c[e>>2]=c[a+(g<<2)>>2];c[f>>2]=c[a+((g|1)<<2)>>2];g=0}else g=-1;return g|0}function mf(a,b,d,e,f){a=a|0;b=+b;d=+d;e=e|0;f=f|0;var g=0,h=0,i=0;h=(c[a+16>>2]|0)+~~(b+.5)|0;g=(c[a+20>>2]|0)+~~(d+.5)|0;if(((h|0)>=0?(i=c[a+8>>2]|0,!((g|0)<0|(h|0)>=(i|0))):0)?(g|0)<(c[a+12>>2]|0):0){a=c[a+4>>2]|0;g=($(i,g)|0)+h<<1;c[e>>2]=c[a+(g<<2)>>2];c[f>>2]=c[a+((g|1)<<2)>>2];g=0}else g=-1;return g|0}function nf(a){a=a|0;var b=0,d=0;b=Uj(8)|0;do if(b){d=Uj(a<<3)|0;c[b>>2]=d;if(!d){Vj(b);b=0;break}else{c[b+4>>2]=a;break}}else b=0;while(0);return b|0}function of(a){a=a|0;Vj(c[a>>2]|0);Vj(a);return 0}function pf(a){a=a|0;var b=0.0,d=0,e=0.0,f=0,g=0;b=+P(+(+qf(a,a)));if(b!=0.0){f=c[a>>2]|0;e=+h[f>>3];b=e<0.0?-b:b;e=e+b;h[f>>3]=e;e=1.0/+P(+(e*b));a=c[a+4>>2]|0;if((a|0)>0){d=0;do{g=f+(d<<3)|0;h[g>>3]=e*+h[g>>3];d=d+1|0}while((d|0)<(a|0))}}return +-b}function qf(a,b){a=a|0;b=b|0;var d=0.0,e=0,f=0;f=c[a+4>>2]|0;if((f|0)!=(c[b+4>>2]|0))rb(0);if((f|0)>0){e=c[a>>2]|0;a=c[b>>2]|0;b=0;d=0.0;do{d=d+ +h[e+(b<<3)>>3]*+h[a+(b<<3)>>3];b=b+1|0}while((b|0)<(f|0))}else d=0.0;return +d}function rf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,j=0.0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;E=i;i=i+16|0;C=E+8|0;D=E;w=c[a+8>>2]|0;if(((w|0)==(c[a+4>>2]|0)?(w|0)==(c[b+4>>2]|0):0)?(w|0)==((c[d+4>>2]|0)+1|0):0){z=w+-2|0;A=C+4|0;B=D+4|0;if((w|0)>2){s=w+-1|0;t=0;do{o=$(t,w)|0;p=c[a>>2]|0;h[(c[b>>2]|0)+(t<<3)>>3]=+h[p+(o+t<<3)>>3];k=w-t+-1|0;c[A>>2]=k;u=t;t=t+1|0;l=p+(o+t<<3)|0;c[C>>2]=l;r=+pf(C);h[(c[d>>2]|0)+(u<<3)>>3]=r;if(!(r==0.0)){if((t|0)<(w|0)){m=c[b>>2]|0;n=t;do{if((t|0)<(n|0)){e=c[a>>2]|0;f=t;j=0.0;do{r=+h[e+(($(f,w)|0)+n<<3)>>3];j=j+r*+h[p+(f+o<<3)>>3];f=f+1|0}while((f|0)<(n|0))}else j=0.0;e=$(n,w)|0;if((n|0)<(w|0)){f=c[a>>2]|0;g=n;do{j=j+ +h[f+(g+e<<3)>>3]*+h[p+(g+o<<3)>>3];g=g+1|0}while((g|0)<(w|0))}h[m+(n<<3)>>3]=j;n=n+1|0}while((n|0)<(w|0))}c[B>>2]=k;c[A>>2]=k;c[C>>2]=l;c[D>>2]=(c[b>>2]|0)+(t<<3);j=+qf(C,D)*.5;if((s|0)>(u|0)){e=c[b>>2]|0;k=s;do{q=+h[p+(k+o<<3)>>3];f=e+(k<<3)|0;r=+h[f>>3]-j*q;h[f>>3]=r;f=$(k,w)|0;if((k|0)<(w|0)){g=c[a>>2]|0;l=k;do{n=g+(l+f<<3)|0;h[n>>3]=+h[n>>3]-(q*+h[e+(l<<3)>>3]+r*+h[p+(l+o<<3)>>3]);l=l+1|0}while((l|0)<(w|0))}k=k+-1|0}while((k|0)>(u|0))}}}while((t|0)<(z|0))}if((w|0)<=1){if((w|0)>0){f=0;g=c[a>>2]|0;e=c[b>>2]|0;v=27}}else{v=$(z,w)|0;g=c[a>>2]|0;e=c[b>>2]|0;h[e+(z<<3)>>3]=+h[g+(v+z<<3)>>3];f=w+-1|0;h[(c[d>>2]|0)+(z<<3)>>3]=+h[g+(f+v<<3)>>3];v=27}if((v|0)==27)h[e+(f<<3)>>3]=+h[g+(($(f,w)|0)+f<<3)>>3];if((w|0)>0){m=(w|0)>0;p=w;do{d=p;p=p+-1|0;n=$(p,w)|0;o=c[a>>2]|0;if((d|0)<=(z|0)?(x=w-p+-1|0,y=o+(n+d<<3)|0,(d|0)<(w|0)):0){e=(d|0)<(w|0);k=d;do{c[B>>2]=x;c[A>>2]=x;c[C>>2]=y;f=$(k,w)|0;c[D>>2]=(c[a>>2]|0)+(f+d<<3);j=+qf(C,D);if(e){g=c[a>>2]|0;l=d;do{v=g+(l+f<<3)|0;h[v>>3]=+h[v>>3]-j*+h[o+(l+n<<3)>>3];l=l+1|0}while((l|0)<(w|0))}k=k+1|0}while((k|0)<(w|0))}if(m){e=0;do{h[o+(e+n<<3)>>3]=0.0;e=e+1|0}while((e|0)<(w|0))}h[o+(n+p<<3)>>3]=1.0}while((d|0)>1);e=0}else e=0}else e=-1;i=E;return e|0}function sf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0,g=0.0,i=0.0;f=+h[c>>3];g=+h[c+8>>3];e=+h[c+16>>3];d=+h[b+88>>3]+(f*+h[b+64>>3]+g*+h[b+72>>3]+e*+h[b+80>>3]);if(d==0.0)c=-1;else{i=+h[b+56>>3]+(f*+h[b+32>>3]+g*+h[b+40>>3]+e*+h[b+48>>3]);h[a>>3]=(+h[b+24>>3]+(f*+h[b>>3]+g*+h[b+8>>3]+e*+h[b+16>>3]))/d;h[a+8>>3]=i/d;c=0}return c|0}function tf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,g=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0;B=i;i=i+1072|0;y=B+1056|0;x=B+768|0;w=B+192|0;A=B+48|0;z=B;K=+h[d>>3];F=+h[e>>3];s=K*F;J=+h[d+8>>3];t=e+8|0;E=+h[t>>3];v=J*E;j=+h[d+16>>3];G=+h[e+16>>3];l=j*G;m=+h[d+24>>3];I=+h[d+32>>3];H=+h[d+40>>3];n=E*H;k=+h[d+48>>3];o=G*k;p=+h[d+56>>3];D=+h[d+64>>3];C=+h[d+72>>3];q=E*C;f=+h[d+80>>3];r=G*f;g=+h[d+88>>3];h[x>>3]=s;h[x+8>>3]=K*E;h[x+16>>3]=K*G;h[x+24>>3]=F*J;h[x+32>>3]=v;h[x+40>>3]=G*J;h[x+48>>3]=F*j;h[x+56>>3]=E*j;h[x+64>>3]=l;h[x+72>>3]=K;h[x+80>>3]=J;h[x+88>>3]=j;j=F*I;h[x+96>>3]=j;h[x+104>>3]=E*I;h[x+112>>3]=G*I;h[x+120>>3]=F*H;h[x+128>>3]=n;h[x+136>>3]=G*H;h[x+144>>3]=F*k;h[x+152>>3]=E*k;h[x+160>>3]=o;h[x+168>>3]=I;h[x+176>>3]=H;h[x+184>>3]=k;k=D*F;h[x+192>>3]=k;h[x+200>>3]=E*D;h[x+208>>3]=G*D;h[x+216>>3]=F*C;E=+h[t>>3];h[x+224>>3]=C*E;h[x+232>>3]=G*C;h[x+240>>3]=F*f;h[x+248>>3]=E*f;h[x+256>>3]=r;h[x+264>>3]=D;h[x+272>>3]=C;h[x+280>>3]=f;e=w+64|0;d=w;t=d+64|0;do{c[d>>2]=0;d=d+4|0}while((d|0)<(t|0));h[e>>3]=-1.0;e=w+72|0;c[e>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;c[e+16>>2]=0;c[e+20>>2]=0;c[e+24>>2]=0;c[e+28>>2]=0;h[w+104>>3]=1.0;e=w+160|0;d=w+112|0;t=d+48|0;do{c[d>>2]=0;d=d+4|0}while((d|0)<(t|0));h[e>>3]=1.0;e=w+240|0;d=w+168|0;t=d+72|0;do{c[d>>2]=0;d=d+4|0}while((d|0)<(t|0));h[e>>3]=-1.0;e=w+296|0;d=w+248|0;t=d+48|0;do{c[d>>2]=0;d=d+4|0}while((d|0)<(t|0));h[e>>3]=-1.0;e=w+304|0;c[e>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;c[e+16>>2]=0;c[e+20>>2]=0;c[e+24>>2]=0;c[e+28>>2]=0;h[w+336>>3]=1.0;e=w+456|0;d=w+344|0;t=d+112|0;do{c[d>>2]=0;d=d+4|0}while((d|0)<(t|0));h[e>>3]=1.0;e=w+512|0;d=w+464|0;t=d+48|0;do{c[d>>2]=0;d=d+4|0}while((d|0)<(t|0));h[e>>3]=1.0;e=w+568|0;d=w+520|0;t=d+48|0;do{c[d>>2]=0;d=d+4|0}while((d|0)<(t|0));h[e>>3]=1.0;u=0;do{t=0;do{d=A+(u*48|0)+(t<<3)|0;h[d>>3]=0.0;f=0.0;e=0;do{f=f+ +h[x+(u*96|0)+(e<<3)>>3]*+h[w+(e*48|0)+(t<<3)>>3];e=e+1|0}while((e|0)!=12);h[d>>3]=f;t=t+1|0}while((t|0)!=6);u=u+1|0}while((u|0)!=3);J=m+(s+v+l);K=p+(j+n+o);f=g+(k+q+r);g=+h[b>>3];j=+h[b+8>>3];k=+h[b+16>>3];l=+h[b+24>>3]+(J*g+K*j+f*k);m=+h[b+32>>3];n=+h[b+40>>3];o=+h[b+48>>3];p=+h[b+56>>3]+(J*m+K*n+f*o);q=+h[b+64>>3];r=+h[b+72>>3];s=+h[b+80>>3];f=+h[b+88>>3]+(J*q+K*r+f*s);if(f==0.0){Me(3,5089,y);e=-1}else{K=f*f;h[z>>3]=(g*f-l*q)/K;h[z+8>>3]=(f*j-l*r)/K;h[z+16>>3]=(f*k-l*s)/K;h[z+24>>3]=(f*m-p*q)/K;h[z+32>>3]=(f*n-p*r)/K;h[z+40>>3]=(f*o-p*s)/K;d=0;do{f=+h[z+(d*24|0)>>3];g=+h[z+(d*24|0)+8>>3];j=+h[z+(d*24|0)+16>>3];e=0;do{y=a+(d*48|0)+(e<<3)|0;h[y>>3]=0.0;K=f*+h[A+(e<<3)>>3]+0.0;h[y>>3]=K;K=K+g*+h[A+48+(e<<3)>>3];h[y>>3]=K;h[y>>3]=K+j*+h[A+96+(e<<3)>>3];e=e+1|0}while((e|0)!=6);d=d+1|0}while((d|0)!=2);e=0}i=B;return e|0}function uf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;j=i;i=i+48|0;h=j+24|0;g=j+12|0;f=j;c[h+4>>2]=6;c[h+8>>2]=1;c[h>>2]=a;c[g+4>>2]=e;c[g+8>>2]=1;c[g>>2]=b;c[f+4>>2]=e;c[f+8>>2]=6;c[f>>2]=d;b=Ue(f)|0;do if(b){a=Te(b,f)|0;if(!a){We(b)|0;d=-1;break}d=Te(b,g)|0;if(!d){We(b)|0;We(a)|0;d=-1;break}if((_e(a)|0)<0){We(b)|0;We(a)|0;We(d)|0;d=-1;break}else{Xe(h,a,d)|0;We(b)|0;We(a)|0;We(d)|0;d=0;break}}else d=-1;while(0);i=j;return d|0}function vf(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0.0,f=0,g=0.0,j=0.0,k=0.0,l=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0;n=i;i=i+192|0;l=n+96|0;m=n;g=+h[b>>3];k=+h[b+8>>3];d=+h[b+16>>3];c=g*g+k*k+d*d;if(c==0.0){j=0.0;e=0.0;d=1.0;c=0.0}else{c=+P(+c);j=c;e=d/c;d=g/c;c=k/c}u=+h[b+24>>3];r=+h[b+32>>3];k=+h[b+40>>3];o=+R(+j);g=1.0-o;j=+S(+j);h[l>>3]=o+d*d*g;t=c*d*g;s=e*j;h[l+8>>3]=t-s;q=d*e*g;p=c*j;h[l+16>>3]=q+p;h[l+24>>3]=u;h[l+32>>3]=t+s;h[l+40>>3]=o+c*c*g;c=c*e*g;j=d*j;h[l+48>>3]=c-j;h[l+56>>3]=r;h[l+64>>3]=q-p;h[l+72>>3]=c+j;h[l+80>>3]=o+e*e*g;h[l+88>>3]=k;f=0;do{c=+h[a+(f<<5)>>3];d=+h[a+(f<<5)+8>>3];e=+h[a+(f<<5)+16>>3];b=0;do{h[m+(f<<5)+(b<<3)>>3]=c*+h[l+(b<<3)>>3]+d*+h[l+32+(b<<3)>>3]+e*+h[l+64+(b<<3)>>3];b=b+1|0}while((b|0)!=4);b=m+(f<<5)+24|0;h[b>>3]=+h[a+(f<<5)+24>>3]+ +h[b>>3];f=f+1|0}while((f|0)!=3);b=0;do{h[a+(b<<5)>>3]=+h[m+(b<<5)>>3];h[a+(b<<5)+8>>3]=+h[m+(b<<5)+8>>3];h[a+(b<<5)+16>>3]=+h[m+(b<<5)+16>>3];h[a+(b<<5)+24>>3]=+h[m+(b<<5)+24>>3];b=b+1|0}while((b|0)!=3);i=n;return 0}function wf(a){a=a|0;var b=0,d=0;b=Uj(136)|0;if(!b)b=0;else{d=0;do{h[b+(d<<5)>>3]=+h[a+(d<<5)>>3];h[b+(d<<5)+8>>3]=+h[a+(d<<5)+8>>3];h[b+(d<<5)+16>>3]=+h[a+(d<<5)+16>>3];h[b+(d<<5)+24>>3]=+h[a+(d<<5)+24>>3];d=d+1|0}while((d|0)!=3);c[b+96>>2]=10;h[b+104>>3]=.10000000149011612;h[b+112>>3]=.9900000095367432;h[b+120>>3]=4.0;h[b+128>>3]=.5}return b|0}function xf(a){a=a|0;var b=0;b=c[a>>2]|0;if(!b)b=-1;else{Vj(b);c[a>>2]=0;b=0}return b|0}function yf(a,b){a=a|0;b=+b;if(!a)a=-1;else{h[a+128>>3]=b;a=0}return a|0}function zf(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0.0,k=0,l=0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0.0,A=0.0;y=i;i=i+176|0;l=y+168|0;k=y+160|0;u=y+48|0;w=y+64|0;v=y;s=b+8|0;g=c[s>>2]|0;do if((g|0)>=3){x=Uj(g*96|0)|0;if(!x){Me(3,5109,k);g=-1;break}t=Uj(g<<4)|0;if(!t){Me(3,5109,l);Vj(x);g=-1;break}else g=0;do{h[e+(g<<5)>>3]=+h[d+(g<<5)>>3];h[e+(g<<5)+8>>3]=+h[d+(g<<5)+8>>3];h[e+(g<<5)+16>>3]=+h[d+(g<<5)+16>>3];h[e+(g<<5)+24>>3]=+h[d+(g<<5)+24>>3];g=g+1|0}while((g|0)!=3);q=b+4|0;l=u+8|0;d=a+104|0;n=a+120|0;o=a+112|0;p=a+96|0;m=0.0;r=0;a:while(1){Ne(a,e,w)|0;g=c[s>>2]|0;if((g|0)>0){j=0.0;k=0;do{if((sf(u,w,(c[q>>2]|0)+(k*24|0)|0)|0)<0){k=10;break a}g=c[b>>2]|0;A=+h[g+(k<<4)>>3]-+h[u>>3];z=+h[g+(k<<4)+8>>3]-+h[l>>3];j=j+(A*A+z*z);g=k<<1;h[t+(g<<3)>>3]=A;h[t+((g|1)<<3)>>3]=z;k=k+1|0;g=c[s>>2]|0}while((k|0)<(g|0))}else j=0.0;j=j/+(g|0);if(j<+h[d>>3]){k=24;break}if(((r|0)>0?j<+h[n>>3]:0)?j/m>+h[o>>3]:0){k=24;break}if((r|0)==(c[p>>2]|0)){k=24;break}if((g|0)>0){k=0;do{if((tf(x+(k*12<<3)|0,a,e,(c[q>>2]|0)+(k*24|0)|0)|0)<0){k=20;break a}k=k+1|0;g=c[s>>2]|0}while((k|0)<(g|0))}if((uf(v,t,x,g<<1)|0)<0){k=22;break}vf(e,v)|0;m=j;r=r+1|0}if((k|0)==10){Af(x,t);g=-1;break}else if((k|0)==20){Af(x,t);g=-1;break}else if((k|0)==22){Af(x,t);g=-1;break}else if((k|0)==24){h[f>>3]=j;Vj(x);Vj(t);g=0;break}}else g=-1;while(0);i=y;return g|0}function Af(a,b){a=a|0;b=b|0;Vj(a);Vj(b);return}function Bf(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0.0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;G=i;i=i+192|0;n=G+184|0;m=G+176|0;l=G+168|0;g=G+160|0;B=G+48|0;D=G+64|0;C=G;A=b+8|0;k=c[A>>2]|0;do if((k|0)>=4){o=~~(+(k|0)*+h[a+128>>3])+-1|0;o=(o|0)<3?3:o;F=Uj(k*96|0)|0;if(!F){Me(3,5109,g);g=-1;break}E=Uj(k<<4)|0;if(!E){Me(3,5109,l);Vj(F);g=-1;break}g=k<<3;z=Uj(g)|0;if(!z){Me(3,5109,m);Vj(F);Vj(E);g=-1;break}y=Uj(g)|0;if(!y){Me(3,5109,n);Vj(F);Vj(E);Vj(z);g=-1;break}else g=0;do{h[e+(g<<5)>>3]=+h[d+(g<<5)>>3];h[e+(g<<5)+8>>3]=+h[d+(g<<5)+8>>3];h[e+(g<<5)+16>>3]=+h[d+(g<<5)+16>>3];h[e+(g<<5)+24>>3]=+h[d+(g<<5)+24>>3];g=g+1|0}while((g|0)!=3);w=b+4|0;x=B+8|0;n=y+(o<<3)|0;d=a+104|0;o=a+120|0;t=a+112|0;u=a+96|0;r=0.0;v=0;a:while(1){Ne(a,e,D)|0;g=c[A>>2]|0;if((g|0)>0){k=0;do{if((sf(B,D,(c[w>>2]|0)+(k*24|0)|0)|0)<0){k=14;break a}g=c[b>>2]|0;q=+h[g+(k<<4)>>3]-+h[B>>3];s=+h[g+(k<<4)+8>>3]-+h[x>>3];g=k<<1;h[E+(g<<3)>>3]=q;h[E+((g|1)<<3)>>3]=s;s=q*q+s*s;h[y+(k<<3)>>3]=s;h[z+(k<<3)>>3]=s;k=k+1|0;g=c[A>>2]|0}while((k|0)<(g|0))}rj(y,g,8,1);s=+h[n>>3]*4.0;s=s<16.0?16.0:s;k=c[A>>2]|0;q=s/6.0;if((k|0)>0){j=0.0;g=0;do{p=+h[y+(g<<3)>>3];if(p>s)p=q;else{p=1.0-p/s;p=q*(1.0-p*(p*p))}j=j+p;g=g+1|0}while((g|0)<(k|0))}else j=0.0;j=j/+(k|0);if(j<+h[d>>3]){k=36;break}if(((v|0)>0?j<+h[o>>3]:0)?j/r>+h[t>>3]:0){k=36;break}if((v|0)==(c[u>>2]|0)){k=36;break}if((k|0)>0){m=0;g=0;do{p=+h[z+(m<<3)>>3];if(p<=s){k=g*6|0;l=F+(k<<3)|0;if((tf(l,a,e,(c[w>>2]|0)+(m*24|0)|0)|0)<0){k=28;break a}r=1.0-p/s;r=r*r;h[l>>3]=+h[l>>3]*r;l=F+((k|1)<<3)|0;h[l>>3]=+h[l>>3]*r;l=F+(k+2<<3)|0;h[l>>3]=r*+h[l>>3];l=F+(k+3<<3)|0;h[l>>3]=r*+h[l>>3];l=F+(k+4<<3)|0;h[l>>3]=r*+h[l>>3];l=F+(k+5<<3)|0;h[l>>3]=r*+h[l>>3];l=F+(k+6<<3)|0;h[l>>3]=r*+h[l>>3];l=F+(k+7<<3)|0;h[l>>3]=r*+h[l>>3];l=F+(k+8<<3)|0;h[l>>3]=r*+h[l>>3];l=F+(k+9<<3)|0;h[l>>3]=r*+h[l>>3];l=F+(k+10<<3)|0;h[l>>3]=r*+h[l>>3];k=F+(k+11<<3)|0;h[k>>3]=r*+h[k>>3];k=m<<1;h[E+(g<<3)>>3]=r*+h[E+(k<<3)>>3];h[E+(g+1<<3)>>3]=r*+h[E+((k|1)<<3)>>3];k=c[A>>2]|0;g=g+2|0}m=m+1|0}while((m|0)<(k|0))}else g=0;if((g|0)<6){k=32;break}if((uf(C,E,F,g)|0)<0){k=34;break}vf(e,C)|0;r=j;v=v+1|0}if((k|0)==14){Cf(F,E,z,y);g=-1;break}else if((k|0)==28){Cf(F,E,z,y);g=-1;break}else if((k|0)==32){Cf(F,E,z,y);g=-1;break}else if((k|0)==34){Cf(F,E,z,y);g=-1;break}else if((k|0)==36){h[f>>3]=j;Vj(F);Vj(E);Vj(z);Vj(y);g=0;break}}else g=-1;while(0);i=G;return g|0}function Cf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Vj(a);Vj(b);Vj(c);Vj(d);return}function Df(a,b){a=a|0;b=b|0;var c=0.0;c=+h[a>>3]-+h[b>>3];return (c<0.0?-1:c>0.0&1)|0}function Ef(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0.0,k=0.0,l=0,m=0.0,n=0.0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0,v=0.0,w=0,x=0,y=0,z=0,A=0.0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0,V=0,W=0,X=0,Y=0,Z=0;U=i;i=i+64|0;D=U+48|0;z=U+40|0;y=U+32|0;x=U+24|0;u=U+16|0;o=U+8|0;l=U;a:do if((e|0)>=4){g=0;while(1){if((g|0)>=(e|0))break;if(+h[d+(g*24|0)+16>>3]!=0.0){g=-1;break a}else g=g+1|0}if((((((((!(+h[a>>3]==0.0)?!(+h[a+32>>3]!=0.0):0)?(B=a+40|0,!(+h[B>>3]==0.0)):0)?!(+h[a+64>>3]!=0.0):0)?!(+h[a+72>>3]!=0.0):0)?!(+h[a+80>>3]!=1.0):0)?!(+h[a+24>>3]!=0.0):0)?!(+h[a+56>>3]!=0.0):0)?!(+h[a+88>>3]!=0.0):0){g=e<<1;C=Re(g,8)|0;if(!C){Me(3,5124,l);g=-1;break}w=Re(g,1)|0;if(!w){We(C)|0;Me(3,5150,o);g=-1;break}if(e){g=c[C>>2]|0;l=c[w>>2]|0;o=0;do{Z=d+(o*24|0)|0;V=o<<4;h[g+(V<<3)>>3]=+h[Z>>3];Y=d+(o*24|0)+8|0;h[g+((V|1)<<3)>>3]=+h[Y>>3];h[g+((V|2)<<3)>>3]=1.0;h[g+((V|3)<<3)>>3]=0.0;h[g+((V|4)<<3)>>3]=0.0;h[g+((V|5)<<3)>>3]=0.0;X=b+(o<<4)|0;h[g+((V|6)<<3)>>3]=-(+h[Z>>3]*+h[X>>3]);h[g+((V|7)<<3)>>3]=-(+h[Y>>3]*+h[X>>3]);h[g+((V|8)<<3)>>3]=0.0;h[g+((V|9)<<3)>>3]=0.0;h[g+((V|10)<<3)>>3]=0.0;h[g+((V|11)<<3)>>3]=+h[Z>>3];h[g+((V|12)<<3)>>3]=+h[Y>>3];h[g+((V|13)<<3)>>3]=1.0;W=b+(o<<4)+8|0;h[g+((V|14)<<3)>>3]=-(+h[Z>>3]*+h[W>>3]);h[g+((V|15)<<3)>>3]=-(+h[Y>>3]*+h[W>>3]);V=o<<1;h[l+(V<<3)>>3]=+h[X>>3];h[l+((V|1)<<3)>>3]=+h[W>>3];o=o+1|0}while((o|0)!=(e|0))}e=Ue(C)|0;if(!e){We(C)|0;We(w)|0;Me(3,5176,u);g=-1;break}o=Te(e,C)|0;if(!o){We(C)|0;We(w)|0;We(e)|0;Me(3,5202,x);g=-1;break}l=Te(e,w)|0;if(!l){We(C)|0;We(w)|0;We(e)|0;We(o)|0;Me(3,5228,y);g=-1;break}if((_e(o)|0)<0){We(C)|0;We(w)|0;We(e)|0;We(o)|0;We(l)|0;Me(3,5254,z);g=-1;break}g=Te(o,l)|0;if(!g){We(C)|0;We(w)|0;We(e)|0;We(o)|0;We(l)|0;Me(3,5280,D);g=-1;break}Z=c[g>>2]|0;p=+h[Z+48>>3];S=+h[a+48>>3];t=+h[B>>3];j=(+h[Z+24>>3]-p*S)/t;s=+h[a+16>>3];T=+h[a+8>>3];r=+h[a>>3];q=(+h[Z>>3]-p*s-j*T)/r;k=+h[Z+56>>3];m=(+h[Z+32>>3]-S*k)/t;n=(+h[Z+8>>3]-s*k-T*m)/r;t=(+h[Z+40>>3]-S)/t;r=(+h[Z+16>>3]-s-T*t)/r;We(C)|0;We(w)|0;We(e)|0;We(o)|0;We(l)|0;We(g)|0;T=+P(+(p*p+(j*j+q*q)));s=+P(+(k*k+(m*m+n*n)));q=q/T;j=j/T;p=p/T;n=n/s;m=m/s;k=k/s;s=(T+s)*.5;r=r/s;T=1.0/s;if(T<0.0){O=-j;k=-k;m=-m;p=-p;n=-n;Q=-q;S=-r;R=-T}else{O=j;Q=q;S=r;R=t/s}j=k*O-m*p;q=n*p-k*Q;r=m*Q-n*O;s=+P(+(r*r+(j*j+q*q)));do if(!(s==0.0)){t=j/s;q=q/s;j=r/s;N=k*p+(m*O+n*Q);N=N<0.0?-N:N;N=(+P(+(N+1.0))+ +P(+(1.0-N)))*.5;if(Q*q-O*t!=0.0){g=0;E=Q;v=O;F=p;I=t;H=q}else{Z=Q*j-p*t!=0.0;g=Z?1:2;E=Z?Q:p;v=Z?p:O;F=Z?O:Q;I=Z?t:j;H=Z?j:q;j=Z?q:t}r=E*H;s=v*I;q=r-s;if(q==0.0){q=O;j=Q;break}G=(v*j-F*H)/q;A=N*H/q;r=s-r;q=(E*j-F*I)/r;r=N*I/r;s=G*G+q*q+1.0;t=G*A+q*r;v=t*t-s*(A*A+r*r+-1.0);if(v<0.0){q=O;j=Q;break}M=+P(+v);L=(M-t)/s;F=A+G*L;K=r+q*L;M=(-t-M)/s;G=A+G*M;r=r+q*M;Z=(g|0)==1;q=Z?H:j;s=Z?j:H;J=Z?L:K;L=Z?K:L;K=Z?M:r;H=Z?r:M;Z=(g|0)==2&(Z^1);r=Z?I:q;q=Z?q:I;M=Z?L:F;L=Z?F:L;j=Z?H:G;I=Z?G:H;if(n*s-m*q!=0.0){g=0;E=n;v=m;F=k;H=q;A=s}else{Z=n*r-k*q!=0.0;g=Z?1:2;E=Z?n:k;v=Z?k:m;F=Z?m:n;H=Z?q:r;A=Z?r:s;r=Z?s:q}s=E*A;t=v*H;q=s-t;if(q==0.0){q=O;j=Q;break}G=(v*r-F*A)/q;A=N*A/q;q=t-s;v=(E*r-F*H)/q;q=N*H/q;r=G*G+v*v+1.0;s=G*A+v*q;t=s*s-r*(A*A+q*q+-1.0);if(t<0.0){q=O;j=Q;break}t=+P(+t);k=(t-s)/r;Q=A+G*k;O=q+v*k;t=(-s-t)/r;p=A+G*t;n=q+v*t;Z=(g|0)==1;m=Z?k:O;k=Z?O:k;v=Z?t:n;t=Z?n:t;Z=(g|0)==2&(Z^1);n=Z?k:Q;k=Z?Q:k;A=Z?t:p;t=Z?p:t;p=L*k+(J*m+M*n);p=p<0.0?-p:p;q=L*t+(J*v+M*A);q=q<0.0?-q:q;r=I*k+(K*m+j*n);r=r<0.0?-r:r;s=I*t+(K*v+j*A);s=s<0.0?-s:s;if(p<q)if(p<r){if(p<s){q=J;p=L;j=M;break}q=K;k=t;m=v;p=I;n=A;break}else{if(r<s){q=K;p=I;break}q=K;k=t;m=v;p=I;n=A;break}else if(q<r){if(q<s){q=J;k=t;m=v;p=L;n=A;j=M;break}q=K;k=t;m=v;p=I;n=A;break}else{if(r<s){q=K;p=I;break}q=K;k=t;m=v;p=I;n=A;break}}else{q=O;j=Q}while(0);M=k*q-m*p;N=n*p-k*j;O=m*j-n*q;Q=+P(+(O*O+(M*M+N*N)));h[f>>3]=j;h[f+32>>3]=q;h[f+64>>3]=p;h[f+8>>3]=n;h[f+40>>3]=m;h[f+72>>3]=k;h[f+16>>3]=M/Q;h[f+48>>3]=N/Q;h[f+80>>3]=O/Q;h[f+24>>3]=S;h[f+56>>3]=R;h[f+88>>3]=T;g=0}else g=-1}else g=-1;while(0);i=U;return g|0}function Ff(a){a=a|0;Vj(c[a>>2]|0);Vj(a);return 0}function Gf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return +(+If(a,b,c,d,0))}function Hf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return +(+If(a,b,c,d,1))}function If(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0.0,j=0,k=0,l=0,m=0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;F=i;i=i+208|0;z=F+200|0;y=F+192|0;A=F+96|0;B=F;C=e+4|0;p=c[C>>2]|0;q=e+112|0;r=e+120|0;if((p|0)>0){u=c[e>>2]|0;v=(d|0)>0;w=(d|0)>0;x=0;do{if(!(c[u+(x*320|0)+4>>2]|0)){if(v){k=c[u+(x*320|0)>>2]|0;l=0;j=-1;do{if((c[b+(l<<8)+8>>2]|0)==(k|0)?(n=+h[b+(l<<8)+40>>3],!(n<+h[q>>3])):0)if(!((j|0)!=-1?!(+h[b+(j<<8)+40>>3]<n):0))j=l;l=l+1|0}while((l|0)<(d|0))}else j=-1;c[u+(x*320|0)+304>>2]=j;if((j|0)>-1)c[b+(j<<8)+16>>2]=c[b+(j<<8)+20>>2]}else{l=u+(x*320|0)+312|0;m=u+(x*320|0)|0;if(w){o=0;j=-1;do{k=c[b+(o<<8)+12>>2]|0;if((k|0)==0?(t=b+(o<<8)+248|0,s=c[t>>2]|0,t=c[t+4>>2]|0,!((s|0)==0&(t|0)==0)):0){k=l;if((s|0)==(c[k>>2]|0)?(t|0)==(c[k+4>>2]|0):0)E=20}else if((k|0)==(c[m>>2]|0))E=20;if((E|0)==20){E=0;g=+h[b+(o<<8)+48>>3];if(!(g<+h[r>>3]))if(!((j|0)!=-1?!(+h[b+(j<<8)+48>>3]<g):0))j=o}o=o+1|0}while((o|0)<(d|0))}else j=-1;c[u+(x*320|0)+304>>2]=j;if((j|0)>-1)c[b+(j<<8)+16>>2]=c[b+(j<<8)+24>>2]}x=x+1|0}while((x|0)<(p|0))}if((p|0)>0){q=0;j=0;p=0;k=0;while(1){l=c[e>>2]|0;m=c[l+(q*320|0)+304>>2]|0;do if((m|0)<0)l=p;else{o=b+(m<<8)|0;if(+ke(a,o,+h[l+(q*320|0)+8>>3],B)>4.0){c[(c[e>>2]|0)+(q*320|0)+304>>2]=-1;l=b+(m<<8)+236|0;if(c[l>>2]|0){l=p;break}c[l>>2]=7;l=p;break}l=c[o>>2]|0;if((k|0)==0|(p|0)<(l|0)){j=0;do{h[A+(j<<5)>>3]=+h[B+(j<<5)>>3];h[A+(j<<5)+8>>3]=+h[B+(j<<5)+8>>3];h[A+(j<<5)+16>>3]=+h[B+(j<<5)+16>>3];h[A+(j<<5)+24>>3]=+h[B+(j<<5)+24>>3];j=j+1|0}while((j|0)!=3);j=q}else l=p;k=k+1|0}while(0);q=q+1|0;if((q|0)>=(c[C>>2]|0))break;else p=l}}else{j=0;k=0}do if((k|0)!=0?(k|0)>=(c[e+128>>2]|0):0){Ne(A,(c[e>>2]|0)+(j*320|0)+112|0,B)|0;p=k<<2;r=Uj(k<<6)|0;if(!r){Me(3,5472,y);rb(1)}q=Uj(k*96|0)|0;if(!q){Me(3,5472,z);rb(1)}l=c[C>>2]|0;if((l|0)>0){m=c[e>>2]|0;o=0;j=0;do{k=c[m+(o*320|0)+304>>2]|0;if((k|0)>=0){y=c[b+(k<<8)+16>>2]|0;d=(4-y|0)%4|0;z=j<<3;h[r+(z<<3)>>3]=+h[b+(k<<8)+168+(d<<4)>>3];h[r+((z|1)<<3)>>3]=+h[b+(k<<8)+168+(d<<4)+8>>3];d=(5-y|0)%4|0;h[r+((z|2)<<3)>>3]=+h[b+(k<<8)+168+(d<<4)>>3];h[r+((z|3)<<3)>>3]=+h[b+(k<<8)+168+(d<<4)+8>>3];d=(6-y|0)%4|0;h[r+((z|4)<<3)>>3]=+h[b+(k<<8)+168+(d<<4)>>3];h[r+((z|5)<<3)>>3]=+h[b+(k<<8)+168+(d<<4)+8>>3];y=(7-y|0)%4|0;h[r+((z|6)<<3)>>3]=+h[b+(k<<8)+168+(y<<4)>>3];h[r+((z|7)<<3)>>3]=+h[b+(k<<8)+168+(y<<4)+8>>3];z=j*12|0;h[q+(z<<3)>>3]=+h[m+(o*320|0)+208>>3];h[q+((z|1)<<3)>>3]=+h[m+(o*320|0)+216>>3];h[q+((z|2)<<3)>>3]=+h[m+(o*320|0)+224>>3];h[q+((z|3)<<3)>>3]=+h[m+(o*320|0)+232>>3];h[q+(z+4<<3)>>3]=+h[m+(o*320|0)+240>>3];h[q+(z+5<<3)>>3]=+h[m+(o*320|0)+248>>3];h[q+(z+6<<3)>>3]=+h[m+(o*320|0)+256>>3];h[q+(z+7<<3)>>3]=+h[m+(o*320|0)+264>>3];h[q+(z+8<<3)>>3]=+h[m+(o*320|0)+272>>3];h[q+(z+9<<3)>>3]=+h[m+(o*320|0)+280>>3];y=c[e>>2]|0;h[q+(z+10<<3)>>3]=+h[y+(o*320|0)+288>>3];h[q+(z+11<<3)>>3]=+h[y+(o*320|0)+296>>3];j=j+1|0}o=o+1|0}while((o|0)<(l|0))}m=e+104|0;k=(f|0)!=0;if(!(c[m>>2]|0)){j=e+8|0;g=+me(a,B,r,q,p,j);if(k&g>=20.0){yf(c[a>>2]|0,.8)|0;g=+ne(a,B,r,q,p,j);if(g>=20.0){yf(c[a>>2]|0,.6)|0;g=+ne(a,B,r,q,p,j);if(g>=20.0){yf(c[a>>2]|0,.4)|0;g=+ne(a,B,r,q,p,j);if(g>=20.0){yf(c[a>>2]|0,0.0)|0;g=+ne(a,B,r,q,p,j)}}}}Vj(q);Vj(r)}else{g=+me(a,B,r,q,p,A);l=e+8|0;n=+me(a,l,r,q,p,l);j=g<n;do if(k){if(j){j=0;do{h[e+8+(j<<5)>>3]=+h[A+(j<<5)>>3];h[e+8+(j<<5)+8>>3]=+h[A+(j<<5)+8>>3];h[e+8+(j<<5)+16>>3]=+h[A+(j<<5)+16>>3];h[e+8+(j<<5)+24>>3]=+h[A+(j<<5)+24>>3];j=j+1|0}while((j|0)!=3)}else g=n;if(g>=20.0){yf(c[a>>2]|0,.8)|0;g=+ne(a,B,r,q,p,A);n=+ne(a,l,r,q,p,l);if(g<n){j=0;do{h[e+8+(j<<5)>>3]=+h[A+(j<<5)>>3];h[e+8+(j<<5)+8>>3]=+h[A+(j<<5)+8>>3];h[e+8+(j<<5)+16>>3]=+h[A+(j<<5)+16>>3];h[e+8+(j<<5)+24>>3]=+h[A+(j<<5)+24>>3];j=j+1|0}while((j|0)!=3)}else g=n;if(g>=20.0){yf(c[a>>2]|0,.6)|0;g=+ne(a,B,r,q,p,A);n=+ne(a,l,r,q,p,l);if(g<n){j=0;do{h[e+8+(j<<5)>>3]=+h[A+(j<<5)>>3];h[e+8+(j<<5)+8>>3]=+h[A+(j<<5)+8>>3];h[e+8+(j<<5)+16>>3]=+h[A+(j<<5)+16>>3];h[e+8+(j<<5)+24>>3]=+h[A+(j<<5)+24>>3];j=j+1|0}while((j|0)!=3)}else g=n;if(g>=20.0){yf(c[a>>2]|0,.4)|0;g=+ne(a,B,r,q,p,A);n=+ne(a,l,r,q,p,l);if(g<n){j=0;do{h[e+8+(j<<5)>>3]=+h[A+(j<<5)>>3];h[e+8+(j<<5)+8>>3]=+h[A+(j<<5)+8>>3];h[e+8+(j<<5)+16>>3]=+h[A+(j<<5)+16>>3];h[e+8+(j<<5)+24>>3]=+h[A+(j<<5)+24>>3];j=j+1|0}while((j|0)!=3)}else g=n;if(g>=20.0){yf(c[a>>2]|0,0.0)|0;g=+ne(a,B,r,q,p,A);n=+ne(a,l,r,q,p,l);if(g<n)j=0;else{g=n;break}do{h[e+8+(j<<5)>>3]=+h[A+(j<<5)>>3];h[e+8+(j<<5)+8>>3]=+h[A+(j<<5)+8>>3];h[e+8+(j<<5)+16>>3]=+h[A+(j<<5)+16>>3];h[e+8+(j<<5)+24>>3]=+h[A+(j<<5)+24>>3];j=j+1|0}while((j|0)!=3)}}}}}else if(j){j=0;do{h[e+8+(j<<5)>>3]=+h[A+(j<<5)>>3];h[e+8+(j<<5)+8>>3]=+h[A+(j<<5)+8>>3];h[e+8+(j<<5)+16>>3]=+h[A+(j<<5)+16>>3];h[e+8+(j<<5)+24>>3]=+h[A+(j<<5)+24>>3];j=j+1|0}while((j|0)!=3)}else g=n;while(0);Vj(q);Vj(r)}if(g<20.0){c[m>>2]=1;break}c[m>>2]=0;m=c[C>>2]|0;if((m|0)>0){j=c[e>>2]|0;l=0;do{k=c[j+(l*320|0)+304>>2]|0;if((k|0)>=0?(D=b+(k<<8)+236|0,(c[D>>2]|0)==0):0)c[D>>2]=8;l=l+1|0}while((l|0)<(m|0))}}else E=38;while(0);if((E|0)==38){c[e+104>>2]=0;g=-1.0}i=F;return +g}function Jf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0.0,W=0.0;U=i;i=i+2544|0;S=U+208|0;R=U+200|0;G=U+184|0;Q=U+176|0;F=U+168|0;E=U+152|0;P=U+144|0;D=U+136|0;M=U+128|0;L=U+120|0;K=U+112|0;C=U+104|0;j=U+96|0;g=U+88|0;f=U+80|0;e=U+72|0;d=U+64|0;H=U;I=U+2280|0;J=U+232|0;z=U+224|0;O=U+220|0;A=U+216|0;B=U+212|0;T=_i(a,5306)|0;a:do if(!T){c[d>>2]=a;Me(3,5308,d);d=ri(c[(qi()|0)>>2]|0)|0;c[e>>2]=5367;c[e+4>>2]=d;Me(3,5361,e);d=0}else{Kf(I,T);c[f>>2]=O;if((kj(I,5368,f)|0)!=1){c[g>>2]=a;Me(3,5371,g);Wi(T)|0;d=0;break}d=c[O>>2]|0;N=Uj(d*320|0)|0;if(!N){Me(3,5472,j);rb(1)}r=H+8|0;s=H+16|0;t=H+24|0;u=H+32|0;v=H+40|0;w=H+48|0;x=H+56|0;y=(b|0)==0;b:do if((d|0)>0){d=0;f=0;c:while(1){Kf(I,T);e=N+(d*320|0)|0;g=N+(d*320|0)+312|0;c[C>>2]=g;c[C+4>>2]=z;if((kj(I,5489,C)|0)==1){q=c[g>>2]|0;c[e>>2]=(q&-32768|0)==0&0==0?q&32767:0;c[N+(d*320|0)+4>>2]=1;f=f|2}else{if(y){e=10;break}if(!(Qe(J,a,2048,1)|0)){e=12;break}Cj(J,I,2047-(Bj(J)|0)|0)|0;q=Ke(b,J)|0;c[e>>2]=q;if((q|0)<0){e=14;break}c[N+(d*320|0)+4>>2]=0;f=f|1}Kf(I,T);e=N+(d*320|0)+8|0;c[D>>2]=e;if((kj(I,5785,D)|0)!=1){e=18;break}Kf(I,T);o=N+(d*320|0)+16|0;p=N+(d*320|0)+24|0;q=N+(d*320|0)+40|0;c[E>>2]=o;c[E+4>>2]=p;c[E+8>>2]=N+(d*320|0)+32;c[E+12>>2]=q;if((kj(I,5894,E)|0)!=4){c[F>>2]=A;c[F+4>>2]=B;if((kj(I,5910,F)|0)==2)g=0;else{e=21;break}}else g=1;do{Kf(I,T);c[G>>2]=N+(d*320|0)+16+(g<<5);c[G+4>>2]=N+(d*320|0)+16+(g<<5)+8;c[G+8>>2]=N+(d*320|0)+16+(g<<5)+16;c[G+12>>2]=N+(d*320|0)+16+(g<<5)+24;if((kj(I,5894,G)|0)!=4){e=23;break c}g=g+1|0}while((g|0)<3);Oe(o,N+(d*320|0)+112|0)|0;W=+h[e>>3];V=W*-.5;h[H>>3]=V;W=W*.5;h[r>>3]=W;h[s>>3]=W;h[t>>3]=W;h[u>>3]=W;h[v>>3]=V;h[w>>3]=V;h[x>>3]=V;e=N+(d*320|0)+48|0;g=N+(d*320|0)+56|0;j=N+(d*320|0)+72|0;k=N+(d*320|0)+80|0;l=N+(d*320|0)+88|0;m=N+(d*320|0)+104|0;n=0;do{V=+h[H+(n<<4)>>3];W=+h[H+(n<<4)+8>>3];h[N+(d*320|0)+208+(n*24|0)>>3]=+h[q>>3]+(+h[o>>3]*V+ +h[p>>3]*W);h[N+(d*320|0)+208+(n*24|0)+8>>3]=+h[j>>3]+(+h[e>>3]*V+ +h[g>>3]*W);h[N+(d*320|0)+208+(n*24|0)+16>>3]=+h[m>>3]+(+h[k>>3]*V+ +h[l>>3]*W);n=n+1|0}while((n|0)!=4);d=d+1|0;if((d|0)>=(c[O>>2]|0))break b}if((e|0)==10){c[K>>2]=a;c[K+4>>2]=I;Me(3,5496,K)}else if((e|0)==12){c[L>>2]=a;Me(3,5624,L)}else if((e|0)==14){c[M>>2]=a;c[M+4>>2]=J;Me(3,5708,M)}else if((e|0)==18){c[P>>2]=a;c[P+4>>2]=d+1;Me(3,5789,P)}else if((e|0)==21){c[Q>>2]=a;c[Q+4>>2]=d+1;Me(3,5916,Q)}else if((e|0)==23){c[R>>2]=a;c[R+4>>2]=d+1;Me(3,5916,R)}Wi(T)|0;Vj(N);d=0;break a}else f=0;while(0);Wi(T)|0;d=Uj(136)|0;if(!d){Me(3,5472,S);rb(1)}c[d>>2]=N;c[d+4>>2]=c[O>>2];c[d+104>>2]=0;do if((f&3|0)!=3){e=d+108|0;if(!(f&1)){c[e>>2]=1;break}else{c[e>>2]=0;break}}else c[d+108>>2]=2;while(0);h[d+112>>3]=.5;h[d+120>>3]=.5}while(0);i=U;return d|0}function Kf(b,c){b=b|0;c=c|0;var d=0,e=0;a:do if(Zi(b,256,c)|0)while(1){d=Bj(b)|0;b:do if(d)while(1){d=d+-1|0;e=b+d|0;switch(a[e>>0]|0){case 13:case 10:break;default:break b}a[e>>0]=0;if(!d)break b}while(0);switch(a[b>>0]|0){case 0:case 35:break;default:break a}if(!(Zi(b,256,c)|0))break a}while(0);return}function Lf(a,b,d,e){a=a|0;b=+b;d=+d;e=e|0;var f=0,g=0.0,j=0.0,k=0,l=0.0,m=0.0,n=0,o=0,p=0,q=0,r=0;r=i;i=i+400|0;n=r+296|0;q=r+200|0;o=r+128|0;p=r;k=c[a>>2]|0;f=c[a+4>>2]|0;if((bf(a+8|0,n,q)|0)<0)Me(3,6025,r+392|0);else{j=+(f+-1|0);f=n+32|0;h[f>>3]=j*+h[n+64>>3]-+h[f>>3];f=n+40|0;h[f>>3]=j*+h[n+72>>3]-+h[f>>3];f=n+48|0;h[f>>3]=j*+h[n+80>>3]-+h[f>>3];f=n+56|0;h[f>>3]=j*+h[n+88>>3]-+h[f>>3];g=+h[n+80>>3];f=0;do{h[o+(f*24|0)>>3]=+h[n+(f<<5)>>3]/g;h[o+(f*24|0)+8>>3]=+h[n+(f<<5)+8>>3]/g;h[o+(f*24|0)+16>>3]=+h[n+(f<<5)+16>>3]/g;f=f+1|0}while((f|0)!=3);g=+(k+-1|0);h[p>>3]=+h[o>>3]*2.0/g;h[p+8>>3]=+h[o+8>>3]*2.0/g;h[p+16>>3]=+h[o+16>>3]*2.0/g+-1.0;k=p+24|0;c[k>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;c[k+12>>2]=0;h[p+40>>3]=+h[o+32>>3]*2.0/j;h[p+48>>3]=+h[o+40>>3]*2.0/j+-1.0;k=p+56|0;g=d-b;c[k>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;c[k+12>>2]=0;c[k+16>>2]=0;c[k+20>>2]=0;h[p+80>>3]=(b+d)/g;h[p+88>>3]=d*-2.0*b/g;k=p+96|0;c[k>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;c[k+12>>2]=0;h[p+112>>3]=1.0;h[p+120>>3]=0.0;g=+h[q+24>>3];j=+h[q+56>>3];d=+h[q+88>>3];k=0;do{b=+h[p+(k<<5)>>3];f=p+(k<<5)+8|0;a=p+(k<<5)+16|0;l=+h[f>>3];m=+h[a>>3];n=0;do{h[e+((n<<2)+k<<3)>>3]=b*+h[q+(n<<3)>>3]+l*+h[q+32+(n<<3)>>3]+m*+h[q+64+(n<<3)>>3];n=n+1|0}while((n|0)!=3);h[e+(k+12<<3)>>3]=+h[p+(k<<5)+24>>3]+(b*g+ +h[f>>3]*j+ +h[a>>3]*d);k=k+1|0}while((k|0)!=4)}i=r;return}function Mf(a){a=a|0;c[496]=a;return}function Nf(){return c[496]|0}function Of(a){a=a|0;var b=0,d=0;b=a+212|0;d=c[b>>2]|0;if(d){ze(d)|0;Qd(c[b>>2]|0)|0;c[b>>2]=0}b=a+224|0;if(c[b>>2]|0){Ld(b)|0;c[b>>2]=0}b=a+192|0;if(c[b>>2]|0){kf(b)|0;c[b>>2]=0}return}function Pf(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;g=i;i=i+16|0;d=g;c[d>>2]=a;if(!(Cg(2044,d)|0))a=-1;else{f=Dg(2044,d)|0;a=f+196|0;b=c[a>>2]|0;if(b){Vj(b);c[a>>2]=0;c[f+200>>2]=0}Of(f);Ce(c[f+216>>2]|0)|0;Eg(2044,d)|0;d=f+248|0;e=f+252|0;a=c[d>>2]|0;if((c[e>>2]|0)!=(a|0)){b=0;do{Ff(c[a+(b<<3)+4>>2]|0)|0;b=b+1|0;a=c[d>>2]|0}while(b>>>0<(c[e>>2]|0)-a>>3>>>0)}Fg(d);Lh(d);Fg(f+248|0);Lh(f);a=0}i=g;return a|0}function Qf(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;h=i;i=i+208|0;g=h+192|0;f=h;e=h+196|0;if(!(a[b>>0]&1))d=b+1|0;else d=c[b+8>>2]|0;if((ef(d,1,f,h+184|0)|0)<0){if(!(a[b>>0]&1))d=b+1|0;else d=c[b+8>>2]|0;c[g>>2]=d;Me(3,6093,g);d=-1}else{d=c[521]|0;c[521]=d+1;c[e>>2]=d;ik(Gg(2064,e)|0,f|0,184)|0}i=h;return d|0}function Rf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0;n=i;i=i+48|0;m=n+24|0;l=n+16|0;j=n+8|0;f=n;d=n+32|0;e=n+28|0;c[d>>2]=a;c[e>>2]=b;do if((Cg(2044,d)|0)!=0?(k=Dg(2044,d)|0,(Hg(2064,e)|0)!=0):0){g=k+8|0;ik(g|0,Gg(2064,e)|0,184)|0;e=c[g>>2]|0;d=k+204|0;b=c[k+12>>2]|0;a=k+208|0;if(!((e|0)==(c[d>>2]|0)?(b|0)==(c[a>>2]|0):0)){c[f>>2]=e;c[f+4>>2]=b;Me(2,6152,f);af(g,c[d>>2]|0,c[a>>2]|0,g)|0}Of(k);d=jf(g,15)|0;a=k+192|0;c[a>>2]=d;if(!d){Me(3,6199,j);d=-1;break}d=Md(d)|0;b=k+212|0;c[b>>2]=d;if(!d){Me(3,6237,l);d=-1;break}Nd(d,2)|0;l=Jd(g)|0;c[k+224>>2]=l;if(!l){Me(3,6274,m);d=-1;break}else{ye(c[b>>2]|0,c[k+216>>2]|0)|0;Lf(c[a>>2]|0,+h[k+232>>3],+h[k+240>>3],k+264|0);d=0;break}}else d=-1;while(0);i=n;return d|0}function Sf(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;j=i;i=i+16|0;h=j+8|0;g=j;e=j+12|0;c[e>>2]=b;if(Cg(2044,e)|0){f=Dg(2044,e)|0;if(!(a[d>>0]&1))d=d+1|0;else d=c[d+8>>2]|0;b=f+216|0;e=Ke(c[b>>2]|0,d)|0;c[f+260>>2]=e;if((e|0)<0){c[g>>2]=d;Me(3,6312,g);Ce(c[b>>2]|0)|0;Me(3,6358,h);e=-1}}else e=-1;i=j;return e|0}function Tf(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;l=i;i=i+32|0;g=l+16|0;f=l+8|0;e=l+20|0;k=l;c[e>>2]=b;do if(Cg(2044,e)|0){j=Dg(2044,e)|0;if(!(a[d>>0]&1))e=d+1|0;else e=c[d+8>>2]|0;b=c[j+212>>2]|0;d=j+216|0;h=j+220|0;e=Jf(e,c[d>>2]|0)|0;c[h>>2]=e;if(!e){Me(3,6402,f);Ce(c[d>>2]|0)|0;Me(3,6429,g);e=-1;break}switch(c[e+108>>2]|0){case 0:{Zd(b,0)|0;break}case 1:{Zd(b,2)|0;break}default:Zd(b,3)|0}b=j+248|0;d=j+252|0;f=c[d>>2]|0;e=f-(c[b>>2]|0)>>3;g=k;c[g>>2]=0;c[g+4>>2]=0;c[k>>2]=e;c[k+4>>2]=c[h>>2];if((f|0)==(c[j+256>>2]|0)){Ig(b,k);break}else{j=k;e=c[j>>2]|0;j=c[j+4>>2]|0;k=f;c[k>>2]=e;c[k+4>>2]=j;c[d>>2]=(c[d>>2]|0)+8;break}}else e=-1;while(0);i=l;return e|0}function Uf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;g=i;i=i+16|0;d=g;c[d>>2]=a;if(((Cg(2044,d)|0)!=0?(e=Dg(2044,d)|0,(b|0)>=0):0)?(f=c[e+248>>2]|0,(c[e+252>>2]|0)-f>>3>>>0>b>>>0):0)d=c[(c[f+(b<<3)+4>>2]|0)+4>>2]|0;else d=-1;i=g;return d|0}function Vf(a){a=a|0;var b=0,d=0;d=i;i=i+16|0;b=d;c[b>>2]=a;if(!(Cg(2044,b)|0))b=-1;else{b=Dg(2044,b)|0;b=(c[b+252>>2]|0)-(c[b+248>>2]|0)>>3}i=d;return b|0}function Wf(a,b){a=a|0;b=+b;var d=0,e=0;e=i;i=i+16|0;d=e;c[d>>2]=a;if(Cg(2044,d)|0)h[(Dg(2044,d)|0)+232>>3]=b;i=e;return}function Xf(a){a=a|0;var b=0.0,d=0,e=0;e=i;i=i+16|0;d=e;c[d>>2]=a;if(!(Cg(2044,d)|0))b=-1.0;else b=+h[(Dg(2044,d)|0)+232>>3];i=e;return +b}function Yf(a,b){a=a|0;b=+b;var d=0,e=0;e=i;i=i+16|0;d=e;c[d>>2]=a;if(Cg(2044,d)|0)h[(Dg(2044,d)|0)+240>>3]=b;i=e;return}function Zf(a){a=a|0;var b=0.0,d=0,e=0;e=i;i=i+16|0;d=e;c[d>>2]=a;if(!(Cg(2044,d)|0))b=-1.0;else b=+h[(Dg(2044,d)|0)+240>>3];i=e;return +b}function _f(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=i;i=i+16|0;e=f;d=f+4|0;c[d>>2]=a;if((Cg(2044,d)|0)!=0?(Zd(c[(Dg(2044,d)|0)+212>>2]|0,b)|0)==0:0){c[e>>2]=b;Me(1,6478,e)}i=f;return}function $f(a){a=a|0;var b=0,d=0,e=0;e=i;i=i+16|0;b=e+4|0;d=e;c[b>>2]=a;if(!(Cg(2044,b)|0)){i=e;return -1}else{a=(ae(c[(Dg(2044,b)|0)+212>>2]|0,d)|0)==0;i=e;return (a?c[d>>2]|0:-1)|0}return 0}function ag(a,b){a=a|0;b=+b;var d=0,e=0,f=0.0,g=0,j=0,k=0;k=i;i=i+16|0;j=k;d=k+8|0;c[d>>2]=a;if((((Cg(2044,d)|0)!=0?(e=Dg(2044,d)|0,!(b<=0.0|b>=1.0)):0)?(f=b,g=c[e+212>>2]|0,(g|0)!=0):0)?(be(g,f)|0)==0:0){h[j>>3]=f;Me(1,6513,j)}i=k;return}function bg(a){a=a|0;var b=0,d=0,e=0,f=0;f=i;i=i+16|0;b=f+8|0;e=f;c[b>>2]=a;if((Cg(2044,b)|0)!=0?(d=c[(Dg(2044,b)|0)+212>>2]|0,(d|0)!=0):0){a=(ce(d,e)|0)==0;i=f;return +(a?+h[e>>3]:-1.0)}i=f;return -1.0}function cg(a,b){a=a|0;b=b|0;var d=0,e=0;e=i;i=i+16|0;d=e;c[d>>2]=a;if(Cg(2044,d)|0)_d(c[(Dg(2044,d)|0)+212>>2]|0,b)|0;i=e;return}function dg(a){a=a|0;var b=0,d=0,e=0;e=i;i=i+16|0;b=e+4|0;d=e;c[b>>2]=a;if(!(Cg(2044,b)|0))b=-1;else{$d(c[(Dg(2044,b)|0)+212>>2]|0,d)|0;b=c[d>>2]|0}i=e;return b|0}function eg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=i;i=i+16|0;e=f;d=f+4|0;c[d>>2]=a;if((Cg(2044,d)|0)!=0?(Sd(c[(Dg(2044,d)|0)+212>>2]|0,b)|0)==0:0){c[e>>2]=b;Me(1,6544,e)}i=f;return}function fg(a){a=a|0;var b=0,d=0,e=0;e=i;i=i+16|0;b=e+4|0;d=e;c[b>>2]=a;if(!(Cg(2044,b)|0)){i=e;return -1}else{a=(Td(c[(Dg(2044,b)|0)+212>>2]|0,d)|0)==0;i=e;return (a?c[d>>2]|0:-1)|0}return 0}function gg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;g=i;i=i+16|0;f=g;d=g+4|0;c[d>>2]=a;if(((Cg(2044,d)|0)!=0?(e=Dg(2044,d)|0,b>>>0<=255):0)?(Ud(c[e+212>>2]|0,b)|0)==0:0){c[f>>2]=b;Me(1,6569,f)}i=g;return}function hg(a){a=a|0;var b=0,d=0,e=0;e=i;i=i+16|0;b=e+4|0;d=e;c[b>>2]=a;if(!(Cg(2044,b)|0)){i=e;return -1}else{a=(Vd(c[(Dg(2044,b)|0)+212>>2]|0,d)|0)==0;i=e;return (a?c[d>>2]|0:-1)|0}return 0}function ig(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=i;i=i+16|0;e=f;d=f+4|0;c[d>>2]=a;if((Cg(2044,d)|0)!=0?(Pd(c[(Dg(2044,d)|0)+212>>2]|0,b)|0)==0:0){c[e>>2]=b;Me(1,6590,e)}i=f;return}function jg(a){a=a|0;var b=0,d=0,e=0;e=i;i=i+16|0;b=e+4|0;d=e;c[b>>2]=a;if(!(Cg(2044,b)|0)){i=e;return -1}else{a=(Wd(c[(Dg(2044,b)|0)+212>>2]|0,d)|0)==0;i=e;return (a?c[d>>2]|0:-1)|0}return 0}function kg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=i;i=i+16|0;e=f;d=f+4|0;c[d>>2]=a;if(!(Cg(2044,d)|0))b=0;else{a=(b|0)!=0;Od(c[(Dg(2044,d)|0)+212>>2]|0,a&1)|0;c[e>>2]=a?6616:6620;Me(1,6625,e)}i=f;return b|0}function lg(a){a=a|0;var b=0,d=0;d=i;i=i+16|0;b=d;c[b>>2]=a;if(!(Cg(2044,b)|0))b=0;else b=c[(c[(Dg(2044,b)|0)+212>>2]|0)+4834148>>2]|0;i=d;return b|0}function mg(a){a=a|0;var b=0,d=0,e=0;e=i;i=i+16|0;b=e+4|0;d=e;c[b>>2]=a;if(!(Cg(2044,b)|0))b=0;else{Rd(c[(Dg(2044,b)|0)+212>>2]|0,d)|0;b=c[d>>2]|0}i=e;return b|0}function ng(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=i;i=i+16|0;e=f;d=f+4|0;c[d>>2]=a;if((Cg(2044,d)|0)!=0?(Xd(c[(Dg(2044,d)|0)+212>>2]|0,b)|0)==0:0){c[e>>2]=b;Me(1,6647,e)}i=f;return}function og(a){a=a|0;var b=0,d=0,e=0;e=i;i=i+16|0;b=e+4|0;d=e;c[b>>2]=a;if(!(Cg(2044,b)|0)){i=e;return -1}else{a=(Yd(c[(Dg(2044,b)|0)+212>>2]|0,d)|0)==0;i=e;return (a?c[d>>2]|0:-1)|0}return 0}function pg(a,b){a=a|0;b=b|0;var c=0;c=0;do{h[b+(c<<5)>>3]=+h[a+(c<<5)>>3];h[b+(c<<5)+8>>3]=+h[a+(c<<5)+8>>3];h[b+(c<<5)+16>>3]=+h[a+(c<<5)+16>>3];h[b+(c<<5)+24>>3]=+h[a+(c<<5)+24>>3];c=c+1|0}while((c|0)!=3);return}function qg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;f=i;i=i+16|0;e=f;c[e>>2]=a;do if(Cg(2044,e)|0){e=Dg(2044,e)|0;a=c[e+212>>2]|0;if((c[a+44>>2]|0)>(b|0)){+ke(c[e+224>>2]|0,(b|0)<0?8:a+48+(b<<8)|0,+(d|0),264);e=0;break}else{e=c[523]|0;break}}else e=c[522]|0;while(0);i=f;return e|0}function rg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;f=i;i=i+16|0;e=f;c[e>>2]=a;do if(Cg(2044,e)|0){e=Dg(2044,e)|0;a=c[e+212>>2]|0;if((c[a+44>>2]|0)>(b|0)){+le(c[e+224>>2]|0,(b|0)<0?8:a+48+(b<<8)|0,264,+(d|0),264);e=0;break}else{e=c[523]|0;break}}else e=c[522]|0;while(0);i=f;return e|0}function sg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;f=i;i=i+16|0;e=f;c[e>>2]=a;do if(Cg(2044,e)|0){e=c[(Dg(2044,e)|0)+212>>2]|0;if((c[e+44>>2]|0)>(b|0)){c[((b|0)<0?8:e+48+(b<<8)|0)+16>>2]=d;e=0;break}else{e=c[523]|0;break}}else e=c[522]|0;while(0);i=f;return e|0}function tg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0,g=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0;e=i;i=i+16|0;d=e;c[d>>2]=a;do if(Cg(2044,d)|0){d=c[(Dg(2044,d)|0)+212>>2]|0;if((c[d+44>>2]|0)>(b|0)){d=(b|0)<0?8:d+48+(b<<8)|0;o=+h[33];h[d+168>>3]=o;k=+h[34];h[d+176>>3]=k;n=+h[35];h[d+184>>3]=n;j=+h[36];h[d+192>>3]=j;m=+h[37];h[d+200>>3]=m;g=+h[38];h[d+208>>3]=g;l=+h[39];h[d+216>>3]=l;f=+h[40];h[d+224>>3]=f;h[d+56>>3]=(o+n+m+l)*.25;h[d+64>>3]=(k+j+g+f)*.25;d=0;break}else{d=c[523]|0;break}}else d=c[522]|0;while(0);i=e;return d|0}function ug(a,b){a=a|0;b=b|0;var d=0,e=0;e=i;i=i+16|0;d=e;c[d>>2]=a;do if(Cg(2044,d)|0){d=Dg(2044,d)|0;a=c[d+248>>2]|0;if((b|0)<0?1:(c[d+252>>2]|0)-a>>3>>>0<=b>>>0){d=c[524]|0;break}else{b=c[a+(b<<3)+4>>2]|0;a=c[d+212>>2]|0;+Hf(c[d+224>>2]|0,a+48|0,c[a+44>>2]|0,b);pg(b+8|0,264);d=0;break}}else d=c[522]|0;while(0);i=e;return d|0}function vg(a,b){a=a|0;b=b|0;var d=0,e=0;e=i;i=i+16|0;d=e;c[d>>2]=a;do if(Cg(2044,d)|0){d=Dg(2044,d)|0;a=c[d+248>>2]|0;if((b|0)<0?1:(c[d+252>>2]|0)-a>>3>>>0<=b>>>0){d=c[524]|0;break}else{b=c[a+(b<<3)+4>>2]|0;a=c[d+212>>2]|0;+Gf(c[d+224>>2]|0,a+48|0,c[a+44>>2]|0,b);pg(b+8|0,264);d=0;break}}else d=c[522]|0;while(0);i=e;return d|0}function wg(a){a=a|0;var b=0,d=0;d=i;i=i+16|0;b=d;c[b>>2]=a;if(!(Cg(2044,b)|0))b=c[522]|0;else{b=Dg(2044,b)|0;b=de(c[b+212>>2]|0,c[b+196>>2]|0)|0}i=d;return b|0}function xg(a){a=a|0;var b=0,d=0;d=i;i=i+16|0;b=d;c[b>>2]=a;if(!(Cg(2044,b)|0))b=2088;else b=(c[(Dg(2044,b)|0)+212>>2]|0)+44|0;i=d;return c[b>>2]|0}function yg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;f=i;i=i+16|0;e=f;c[e>>2]=a;do if(Cg(2044,e)|0){a=Dg(2044,e)|0;e=c[a+248>>2]|0;if((b|0)<0?1:(c[a+252>>2]|0)-e>>3>>>0<=b>>>0){e=c[524]|0;break}e=c[e+(b<<3)+4>>2]|0;if((d|0)<0?1:(c[e+4>>2]|0)<=(d|0)){e=c[523]|0;break}else{e=c[e>>2]|0;pg(e+(d*320|0)+16|0,264);Lb(0,c[e+(d*320|0)+304>>2]|0,c[e+(d*320|0)>>2]|0,c[e+(d*320|0)+4>>2]|0,+(+h[e+(d*320|0)+8>>3]))|0;e=0;break}}else e=c[522]|0;while(0);i=f;return e|0}function zg(a,b){a=a|0;b=b|0;var d=0,e=0;e=i;i=i+16|0;d=e;c[d>>2]=a;do if(Cg(2044,d)|0){d=c[(Dg(2044,d)|0)+212>>2]|0;if((c[d+44>>2]|0)>(b|0)){d=(b|0)<0?8:d+48+(b<<8)|0;Qa(1,c[d>>2]|0,c[d+4>>2]|0,c[d+8>>2]|0,c[d+12>>2]|0,c[d+16>>2]|0,c[d+20>>2]|0,c[d+24>>2]|0,+(+h[d+32>>3]),+(+h[d+40>>3]),+(+h[d+48>>3]),+(+h[d+56>>3]),+(+h[d+64>>3]),+(+h[d+72>>3]),+(+h[d+80>>3]),+(+h[d+88>>3]),+(+h[d+96>>3]),+(+h[d+104>>3]),+(+h[d+112>>3]),+(+h[d+120>>3]),+(+h[d+128>>3]),+(+h[d+136>>3]),+(+h[d+144>>3]),+(+h[d+152>>3]),+(+h[d+160>>3]),+(+h[d+168>>3]),+(+h[d+176>>3]),+(+h[d+184>>3]),+(+h[d+192>>3]),+(+h[d+200>>3]),+(+h[d+208>>3]),+(+h[d+216>>3]),+(+h[d+224>>3]),c[d+240>>2]|0)|0;d=0;break}else{d=c[523]|0;break}}else d=c[522]|0;while(0);i=e;return d|0}function Ag(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;h=i;i=i+16|0;g=h+8|0;f=h+12|0;e=c[525]|0;c[525]=e+1;c[f>>2]=e;f=Dg(2044,f)|0;c[f>>2]=e;c[f+204>>2]=a;c[f+208>>2]=b;j=$(a<<2,b)|0;b=f+200|0;c[b>>2]=j;a=f+196|0;c[a>>2]=Uj(j)|0;j=Ae()|0;c[f+216>>2]=j;if(!j)Me(3,8285,h);Rf(e,d)|0;c[g>>2]=c[b>>2];Me(1,8322,g);Kb(2,c[f>>2]|0,c[a>>2]|0,c[b>>2]|0,f+264|0,264)|0;i=h;return c[f>>2]|0}function Bg(a){a=a|0;var b=0;a=i;i=i+16|0;b=a;Jg(8591,7);Kg(8597,3);Lg(8606,2);Lg(8617,3);Mg(8633,4);Kg(8651,4);Ng(8671,5);Jg(8683,8);Mg(8700,5);Jg(8720,9);Jg(8738,10);Mg(8760,6);Mg(8783,7);Kg(8812,6);Kg(8825,7);Jg(8838,11);Mg(8857,8);Mg(8867,9);Kg(8880,8);Kg(8893,9);Og(8912,10);Pg(8924,1);Qg(8936,1);Rg(8959,1);Qg(8982,2);Rg(9004,2);Sg(9026,1);Kg(9043,10);Sg(9060,2);Kg(9073,11);Sg(9086,3);Kg(9110,12);Tg(9134,3);Rg(9147,3);Sg(9160,4);Kg(9178,13);Sg(9196,5);Kg(9212,14);Sg(9228,6);Kg(9245,15);Ug(9262,2088);Ug(9291,2096);Ug(9319,2092);Cb(9352,680,0);Cb(9369,680,1);Cb(9385,680,0);Cb(9407,680,0);Cb(9432,680,1);Cb(9457,680,1);Cb(9482,680,100);Cb(9509,680,0);Cb(9535,680,1);Cb(9561,680,0);Cb(9588,680,0);Cb(9615,680,1);Cb(9641,680,2);Cb(9666,680,3);Cb(9704,680,4);Cb(9741,680,0);Cb(9775,680,0);Cb(9799,680,1);Cb(9825,680,2);Cb(9852,680,2);Cb(9886,680,5);h[b>>3]=.5;Vg(9904,b);Cb(9925,680,0);Cb(9944,680,1);Cb(9962,680,2);Cb(9980,680,3);Cb(9999,680,4);Cb(10021,680,3);Cb(10040,680,515);Cb(10069,680,259);Cb(10097,680,4);Cb(10116,680,772);Cb(10146,680,1028);Cb(10176,680,0);Cb(10207,680,1);Cb(10243,680,2);Cb(10277,680,3);Cb(10315,680,0);Cb(10348,680,1);Cb(10395,680,2);Cb(10437,680,3);Cb(10480,680,4);Cb(10532,680,5);Cb(10583,680,6);Cb(10628,680,7);Cb(10667,680,8);Cb(10712,680,9);i=a;return}function Cg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=c[b>>2]|0;f=c[a+4>>2]|0;a:do if(f){g=f+-1|0;h=(g&f|0)==0;if(h)e=g&d;else e=(d>>>0)%(f>>>0)|0;b=c[(c[a>>2]|0)+(e<<2)>>2]|0;if(b)do{b=c[b>>2]|0;if(!b){b=0;break a}a=c[b+4>>2]|0;if(h)a=a&g;else a=(a>>>0)%(f>>>0)|0;if((a|0)!=(e|0)){b=0;break a}}while((c[b+8>>2]|0)!=(d|0));else b=0}else b=0;while(0);return b|0}function Dg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;g=i;i=i+32|0;f=g+8|0;e=g;d=Cg(a,b)|0;if(!d){wh(f,a,b);xh(e,a,c[f>>2]|0);d=c[e>>2]|0;c[f>>2]=0}i=g;return d+16|0}function Eg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=i;i=i+16|0;d=f+4|0;e=f;b=Cg(a,b)|0;if(!b)b=0;else{c[e>>2]=b;c[d>>2]=c[e>>2];uh(a,d)|0;b=1}i=f;return b|0}function Fg(a){a=a|0;var b=0,d=0;d=c[a>>2]|0;if(d){b=a+4|0;a=c[b>>2]|0;if((a|0)!=(d|0)){do a=a+-8|0;while((a|0)!=(d|0));c[b>>2]=a}Lh(d)}return}function Gg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;g=i;i=i+32|0;f=g+8|0;e=g;d=Hg(a,b)|0;if(!d){qh(f,a,b);rh(e,a,c[f>>2]|0);d=c[e>>2]|0;c[f>>2]=0}i=g;return d+16|0}function Hg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=c[b>>2]|0;f=c[a+4>>2]|0;a:do if(f){g=f+-1|0;h=(g&f|0)==0;if(h)e=g&d;else e=(d>>>0)%(f>>>0)|0;b=c[(c[a>>2]|0)+(e<<2)>>2]|0;if(b)do{b=c[b>>2]|0;if(!b){b=0;break a}a=c[b+4>>2]|0;if(h)a=a&g;else a=(a>>>0)%(f>>>0)|0;if((a|0)!=(e|0)){b=0;break a}}while((c[b+8>>2]|0)!=(d|0));else b=0}else b=0;while(0);return b|0}function Ig(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;j=i;i=i+32|0;h=j;g=a+4|0;d=c[a>>2]|0;f=((c[g>>2]|0)-d>>3)+1|0;if(f>>>0>536870911)Jh(a);e=d;d=(c[a+8>>2]|0)-e|0;if(d>>3>>>0<268435455){d=d>>2;d=d>>>0<f>>>0?f:d}else d=536870911;nh(h,d,(c[g>>2]|0)-e>>3,a+8|0);g=h+8|0;f=c[g>>2]|0;d=b;e=c[d+4>>2]|0;b=f;c[b>>2]=c[d>>2];c[b+4>>2]=e;c[g>>2]=f+8;oh(a,h);ph(h);i=j;return}function Jg(a,b){a=a|0;b=b|0;Oa(a|0,4,2200,10911,1,b|0);return}function Kg(a,b){a=a|0;b=b|0;Oa(a|0,2,2192,10801,10,b|0);return}function Lg(a,b){a=a|0;b=b|0;Oa(a|0,3,2180,10906,12,b|0);return}function Mg(a,b){a=a|0;b=b|0;Oa(a|0,3,2168,10906,13,b|0);return}function Ng(a,b){a=a|0;b=b|0;Oa(a|0,2,2160,10801,11,b|0);return}function Og(a,b){a=a|0;b=b|0;Oa(a|0,2,2152,10797,7,b|0);return}function Pg(a,b){a=a|0;b=b|0;Oa(a|0,1,2148,10794,16,b|0);return}function Qg(a,b){a=a|0;b=b|0;Oa(a|0,3,2136,10789,1,b|0);return}function Rg(a,b){a=a|0;b=b|0;Oa(a|0,2,2128,10785,1,b|0);return}function Sg(a,b){a=a|0;b=b|0;Oa(a|0,3,2116,10780,1,b|0);return}function Tg(a,b){a=a|0;b=b|0;Oa(a|0,3,2104,10775,2,b|0);return}function Ug(a,b){a=a|0;b=b|0;Cb(a|0,680,c[b>>2]|0);return}function Vg(a,b){a=a|0;b=b|0;Cb(a|0,720,~~+h[b>>3]>>>0|0);return}function Wg(){c[511]=0;c[512]=0;c[513]=0;c[514]=0;g[515]=1.0;ub(11,2044,n|0)|0;c[516]=0;c[517]=0;c[518]=0;c[519]=0;g[520]=1.0;ub(12,2064,n|0)|0;Bg(0);return}function Xg(a){a=a|0;$g(a);return}function Yg(a){a=a|0;Zg(a);return}function Zg(a){a=a|0;var b=0;_g(a,c[a+8>>2]|0);b=c[a>>2]|0;c[a>>2]=0;if(b)Lh(b);return}function _g(a,b){a=a|0;b=b|0;if(b)do{a=b;b=c[b>>2]|0;Lh(a)}while((b|0)!=0);return}function $g(a){a=a|0;var b=0;ah(a,c[a+8>>2]|0);b=c[a>>2]|0;c[a>>2]=0;if(b)Lh(b);return}function ah(a,b){a=a|0;b=b|0;if(b)do{a=b;b=c[b>>2]|0;Fg(a+264|0);Lh(a)}while((b|0)!=0);return}function bh(a,b,c){a=a|0;b=b|0;c=+c;Tb[a&3](b,c);return}function ch(a,b,c){a=a|0;b=b|0;c=c|0;Xb[a&7](b,c);return}function dh(a,b){a=a|0;b=b|0;return +(+Ub[a&3](b))}function eh(a,b,c){a=a|0;b=b|0;c=+c;Tb[a&3](b,c);return}function fh(a){a=a|0;return Vb[a&1]()|0}function gh(a,b){a=a|0;b=b|0;Wb[a&15](b);return}function hh(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;i=i+16|0;d=c;ih(d,b);a=Yb[a&31](d)|0;bk(d);i=c;return a|0}function ih(a,b){a=a|0;b=b|0;ak(a,b+4|0,c[b>>2]|0);return}function jh(a,b,c){a=a|0;b=b|0;c=c|0;return cc[a&15](b,c)|0}function kh(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=i;i=i+16|0;e=d;ih(e,c);a=cc[a&15](b,e)|0;bk(e);i=d;return a|0}function lh(a,b){a=a|0;b=b|0;return Yb[a&31](b)|0}function mh(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Qb[a&15](b,c,d)|0}function nh(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;c[a+12>>2]=0;c[a+16>>2]=e;if(!b)e=0;else e=Kh(b<<3)|0;c[a>>2]=e;d=e+(d<<3)|0;c[a+8>>2]=d;c[a+4>>2]=d;c[a+12>>2]=e+(b<<3);return}function oh(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;e=c[a>>2]|0;g=a+4|0;d=b+4|0;f=(c[g>>2]|0)-e|0;h=(c[d>>2]|0)+(0-(f>>3)<<3)|0;c[d>>2]=h;ik(h|0,e|0,f|0)|0;f=c[a>>2]|0;c[a>>2]=c[d>>2];c[d>>2]=f;f=b+8|0;e=c[g>>2]|0;c[g>>2]=c[f>>2];c[f>>2]=e;f=a+8|0;a=b+12|0;e=c[f>>2]|0;c[f>>2]=c[a>>2];c[a>>2]=e;c[b>>2]=c[d>>2];return}function ph(a){a=a|0;var b=0,d=0,e=0;d=c[a+4>>2]|0;e=a+8|0;b=c[e>>2]|0;if((b|0)!=(d|0)){do b=b+-8|0;while((b|0)!=(d|0));c[e>>2]=b}b=c[a>>2]|0;if(b)Lh(b);return}function qh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=Kh(200)|0;c[e+8>>2]=c[d>>2];ek(e+16|0,0,184)|0;c[a>>2]=e;a=a+4|0;c[a>>2]=b+8;c[a+4>>2]=257;return}function rh(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0.0,k=0.0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;m=c[e+8>>2]|0;s=e+4|0;c[s>>2]=m;r=d+4|0;l=c[r>>2]|0;q=(l|0)==0;a:do if(!q){n=l+-1|0;o=(n&l|0)==0;if(o)h=n&m;else h=(m>>>0)%(l>>>0)|0;f=c[(c[d>>2]|0)+(h<<2)>>2]|0;if(!f)p=12;else while(1){i=c[f>>2]|0;if(!i){p=12;break a}f=c[i+4>>2]|0;if(o)f=f&n;else f=(f>>>0)%(l>>>0)|0;if((f|0)!=(h|0)){p=12;break a}if((c[i+8>>2]|0)==(m|0)){f=0;e=i;break}else f=i}}else{h=0;p=12}while(0);if((p|0)==12){m=d+12|0;j=+(((c[m>>2]|0)+1|0)>>>0);k=+g[d+16>>2];do if(q|j>+(l>>>0)*k){if(l>>>0>2)f=(l+-1&l|0)==0;else f=0;i=(f&1|l<<1)^1;f=~~+_(+(j/k))>>>0;sh(d,i>>>0<f>>>0?f:i);i=c[r>>2]|0;f=c[s>>2]|0;h=i+-1|0;if(!(h&i)){l=i;h=h&f;break}else{l=i;h=(f>>>0)%(i>>>0)|0;break}}while(0);f=c[(c[d>>2]|0)+(h<<2)>>2]|0;if(!f){f=d+8|0;c[e>>2]=c[f>>2];c[f>>2]=e;c[(c[d>>2]|0)+(h<<2)>>2]=f;f=c[e>>2]|0;if(f){f=c[f+4>>2]|0;h=l+-1|0;if(!(h&l))f=f&h;else f=(f>>>0)%(l>>>0)|0;c[(c[d>>2]|0)+(f<<2)>>2]=e}}else{c[e>>2]=c[f>>2];c[f>>2]=e}c[m>>2]=(c[m>>2]|0)+1;f=1}c[b>>2]=e;a[b+4>>0]=f;return} +function zd(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;E=i;i=i+16|0;C=E;p=c[k>>2]|0;B=g+-1|0;if((f|0)>0){l=0;m=p;n=p+(($(B,f)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(f|0))break;else{m=m+2|0;n=n+2|0}}}A=j*3|0;z=f+-1|0;if((g|0)>0){l=0;j=p;m=p+(z<<1)|0;while(1){b[m>>1]=0;b[j>>1]=0;l=l+1|0;if((l|0)>=(g|0))break;else{j=j+(f<<1)|0;m=m+(f<<1)|0}}}m=k+1179664|0;l=f+1|0;w=0-f|0;u=1-f|0;v=~f;a:do if((B|0)>1){x=(z|0)>1;o=(c[k+4>>2]|0)+l|0;y=1;n=e+(l*3|0)|0;e=p+(l<<1)|0;j=0;b:while(1){if(x){l=o;t=1;s=n;r=j;while(1){do if(((d[s+1>>0]|0)+(d[s>>0]|0)+(d[s+2>>0]|0)|0)>(A|0)){a[l>>0]=-1;j=b[e+(w<<1)>>1]|0;if(j<<16>>16>0){b[e>>1]=j;j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}o=b[e+(u<<1)>>1]|0;p=o<<16>>16;j=b[e+(v<<1)>>1]|0;q=j<<16>>16;n=j<<16>>16>0;if(o<<16>>16<=0){if(n){b[e>>1]=j;j=q*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+t;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+y;n=k+1310736+(j+-3<<2)|0;if((c[n>>2]|0)<(t|0))c[n>>2]=t;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}j=b[e+-2>>1]|0;if(j<<16>>16>0){b[e>>1]=j;j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;j=k+1310736+(j+-3<<2)|0;if((c[j>>2]|0)>=(t|0)){j=r;break}c[j>>2]=t;j=r;break}else{j=r+1|0;if((r|0)>32767)break b;b[e>>1]=j;c[k+1179664+(r<<2)>>2]=j<<16>>16;r=r*7|0;c[k+1310736+(r<<2)>>2]=1;c[k+1310736+(r+1<<2)>>2]=t;c[k+1310736+(r+2<<2)>>2]=y;c[k+1310736+(r+3<<2)>>2]=t;c[k+1310736+(r+4<<2)>>2]=t;c[k+1310736+(r+5<<2)>>2]=y;c[k+1310736+(r+6<<2)>>2]=y;break}}if(n){j=c[k+1179664+(p+-1<<2)>>2]|0;p=c[k+1179664+(q+-1<<2)>>2]|0;if((j|0)>(p|0)){b[e>>1]=p;if((r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(j|0))c[o>>2]=p;n=n+1|0;if((n|0)>=(r|0)){j=p;break}else o=o+4|0}}else j=p}else{b[e>>1]=j;if((j|0)<(p|0)&(r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(p|0))c[o>>2]=j;n=n+1|0;if((n|0)>=(r|0))break;else o=o+4|0}}}j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}n=b[e+-2>>1]|0;if(n<<16>>16<=0){b[e>>1]=o;j=p*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+t;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+y;n=k+1310736+(j+-4<<2)|0;if((c[n>>2]|0)>(t|0))c[n>>2]=t;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}j=c[k+1179664+(p+-1<<2)>>2]|0;p=c[k+1179664+((n<<16>>16)+-1<<2)>>2]|0;if((j|0)>(p|0)){b[e>>1]=p;if((r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(j|0))c[o>>2]=p;n=n+1|0;if((n|0)>=(r|0)){j=p;break}else o=o+4|0}}else j=p}else{b[e>>1]=j;if((j|0)<(p|0)&(r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(p|0))c[o>>2]=j;n=n+1|0;if((n|0)>=(r|0))break;else o=o+4|0}}}j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;j=k+1310736+(j+-5<<2)|0;c[j>>2]=(c[j>>2]|0)+y;j=r}else{b[e>>1]=0;a[l>>0]=0;j=r}while(0);t=t+1|0;n=s+3|0;e=e+2|0;l=l+1|0;if((t|0)>=(z|0))break;else{s=n;r=j}}}else l=o;y=y+1|0;if((y|0)>=(B|0)){p=j;D=52;break a}else{o=l+2|0;n=n+6|0;e=e+4|0}}Me(3,3904,C);l=-1}else{p=0;D=52}while(0);if((D|0)==52){e=k+12|0;if((p|0)<1)j=1;else{n=1;j=1;while(1){l=c[m>>2]|0;if((l|0)==(n|0)){l=j;j=j+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[m>>2]=l;if((n|0)<(p|0)){n=n+1|0;m=m+4|0}else break}}o=k+8|0;l=j+-1|0;c[o>>2]=l;if(l){ek(e|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((j|0)>1){l=0;do{D=l<<2;c[k+131084+(D<<2)>>2]=f;c[k+131084+((D|1)<<2)>>2]=0;c[k+131084+((D|2)<<2)>>2]=g;c[k+131084+((D|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[o>>2]|0))}if((p|0)>0){e=0;do{m=(c[k+1179664+(e<<2)>>2]|0)+-1|0;n=e*7|0;l=k+12+(m<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(n<<2)>>2]|0);l=m<<1;j=k+655376+(l<<3)|0;h[j>>3]=+h[j>>3]+ +(c[k+1310736+(n+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(n+2<<2)>>2]|0);m=m<<2;l=k+131084+(m<<2)|0;j=c[k+1310736+(n+3<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;l=k+131084+((m|1)<<2)|0;j=c[k+1310736+(n+4<<2)>>2]|0;if((c[l>>2]|0)<(j|0))c[l>>2]=j;l=k+131084+((m|2)<<2)|0;j=c[k+1310736+(n+5<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;j=k+131084+((m|3)<<2)|0;l=c[k+1310736+(n+6<<2)>>2]|0;if((c[j>>2]|0)<(l|0))c[j>>2]=l;e=e+1|0}while((e|0)<(p|0))}if((c[o>>2]|0)>0){l=0;do{f=k+12+(l<<2)|0;g=l<<1;D=k+655376+(g<<3)|0;h[D>>3]=+h[D>>3]/+(c[f>>2]|0);g=k+655376+((g|1)<<3)|0;h[g>>3]=+h[g>>3]/+(c[f>>2]|0);l=l+1|0}while((l|0)<(c[o>>2]|0));l=0}else l=0}else l=0}i=E;return l|0}function Ad(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;E=i;i=i+16|0;C=E;p=c[k>>2]|0;B=g+-1|0;if((f|0)>0){l=0;m=p;n=p+(($(B,f)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(f|0))break;else{m=m+2|0;n=n+2|0}}}A=j*3|0;z=f+-1|0;if((g|0)>0){l=0;j=p;m=p+(z<<1)|0;while(1){b[m>>1]=0;b[j>>1]=0;l=l+1|0;if((l|0)>=(g|0))break;else{j=j+(f<<1)|0;m=m+(f<<1)|0}}}m=k+1179664|0;l=f+1|0;w=0-f|0;u=1-f|0;v=~f;a:do if((B|0)>1){x=(z|0)>1;o=(c[k+4>>2]|0)+l|0;y=1;n=e+(l<<1)|0;e=p+(l<<1)|0;j=0;b:while(1){if(x){l=o;t=1;s=n;r=j;while(1){p=d[s>>0]|0;q=d[s+1>>0]|0;do if(((p&248)+10+(p<<5&224)+(q>>>3&28)+(q<<3&248)|0)>(A|0)){a[l>>0]=-1;j=b[e+(w<<1)>>1]|0;if(j<<16>>16>0){b[e>>1]=j;j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}o=b[e+(u<<1)>>1]|0;p=o<<16>>16;j=b[e+(v<<1)>>1]|0;q=j<<16>>16;n=j<<16>>16>0;if(o<<16>>16<=0){if(n){b[e>>1]=j;j=q*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+t;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+y;n=k+1310736+(j+-3<<2)|0;if((c[n>>2]|0)<(t|0))c[n>>2]=t;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}j=b[e+-2>>1]|0;if(j<<16>>16>0){b[e>>1]=j;j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;j=k+1310736+(j+-3<<2)|0;if((c[j>>2]|0)>=(t|0)){j=r;break}c[j>>2]=t;j=r;break}else{j=r+1|0;if((r|0)>32767)break b;b[e>>1]=j;c[k+1179664+(r<<2)>>2]=j<<16>>16;r=r*7|0;c[k+1310736+(r<<2)>>2]=1;c[k+1310736+(r+1<<2)>>2]=t;c[k+1310736+(r+2<<2)>>2]=y;c[k+1310736+(r+3<<2)>>2]=t;c[k+1310736+(r+4<<2)>>2]=t;c[k+1310736+(r+5<<2)>>2]=y;c[k+1310736+(r+6<<2)>>2]=y;break}}if(n){j=c[k+1179664+(p+-1<<2)>>2]|0;p=c[k+1179664+(q+-1<<2)>>2]|0;if((j|0)>(p|0)){b[e>>1]=p;if((r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(j|0))c[o>>2]=p;n=n+1|0;if((n|0)>=(r|0)){j=p;break}else o=o+4|0}}else j=p}else{b[e>>1]=j;if((j|0)<(p|0)&(r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(p|0))c[o>>2]=j;n=n+1|0;if((n|0)>=(r|0))break;else o=o+4|0}}}j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}n=b[e+-2>>1]|0;if(n<<16>>16<=0){b[e>>1]=o;j=p*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+t;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+y;n=k+1310736+(j+-4<<2)|0;if((c[n>>2]|0)>(t|0))c[n>>2]=t;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}j=c[k+1179664+(p+-1<<2)>>2]|0;p=c[k+1179664+((n<<16>>16)+-1<<2)>>2]|0;if((j|0)>(p|0)){b[e>>1]=p;if((r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(j|0))c[o>>2]=p;n=n+1|0;if((n|0)>=(r|0)){j=p;break}else o=o+4|0}}else j=p}else{b[e>>1]=j;if((j|0)<(p|0)&(r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(p|0))c[o>>2]=j;n=n+1|0;if((n|0)>=(r|0))break;else o=o+4|0}}}j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;j=k+1310736+(j+-5<<2)|0;c[j>>2]=(c[j>>2]|0)+y;j=r}else{b[e>>1]=0;a[l>>0]=0;j=r}while(0);t=t+1|0;n=s+2|0;e=e+2|0;l=l+1|0;if((t|0)>=(z|0))break;else{s=n;r=j}}}else l=o;y=y+1|0;if((y|0)>=(B|0)){p=j;D=52;break a}else{o=l+2|0;n=n+4|0;e=e+4|0}}Me(3,3904,C);l=-1}else{p=0;D=52}while(0);if((D|0)==52){e=k+12|0;if((p|0)<1)j=1;else{n=1;j=1;while(1){l=c[m>>2]|0;if((l|0)==(n|0)){l=j;j=j+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[m>>2]=l;if((n|0)<(p|0)){n=n+1|0;m=m+4|0}else break}}o=k+8|0;l=j+-1|0;c[o>>2]=l;if(l){ek(e|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((j|0)>1){l=0;do{D=l<<2;c[k+131084+(D<<2)>>2]=f;c[k+131084+((D|1)<<2)>>2]=0;c[k+131084+((D|2)<<2)>>2]=g;c[k+131084+((D|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[o>>2]|0))}if((p|0)>0){e=0;do{m=(c[k+1179664+(e<<2)>>2]|0)+-1|0;n=e*7|0;l=k+12+(m<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(n<<2)>>2]|0);l=m<<1;j=k+655376+(l<<3)|0;h[j>>3]=+h[j>>3]+ +(c[k+1310736+(n+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(n+2<<2)>>2]|0);m=m<<2;l=k+131084+(m<<2)|0;j=c[k+1310736+(n+3<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;l=k+131084+((m|1)<<2)|0;j=c[k+1310736+(n+4<<2)>>2]|0;if((c[l>>2]|0)<(j|0))c[l>>2]=j;l=k+131084+((m|2)<<2)|0;j=c[k+1310736+(n+5<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;j=k+131084+((m|3)<<2)|0;l=c[k+1310736+(n+6<<2)>>2]|0;if((c[j>>2]|0)<(l|0))c[j>>2]=l;e=e+1|0}while((e|0)<(p|0))}if((c[o>>2]|0)>0){l=0;do{f=k+12+(l<<2)|0;g=l<<1;D=k+655376+(g<<3)|0;h[D>>3]=+h[D>>3]/+(c[f>>2]|0);g=k+655376+((g|1)<<3)|0;h[g>>3]=+h[g>>3]/+(c[f>>2]|0);l=l+1|0}while((l|0)<(c[o>>2]|0));l=0}else l=0}else l=0}i=E;return l|0}function Bd(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;E=i;i=i+16|0;C=E;p=c[k>>2]|0;B=g+-1|0;if((f|0)>0){l=0;m=p;n=p+(($(B,f)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(f|0))break;else{m=m+2|0;n=n+2|0}}}A=j*3|0;z=f+-1|0;if((g|0)>0){l=0;j=p;m=p+(z<<1)|0;while(1){b[m>>1]=0;b[j>>1]=0;l=l+1|0;if((l|0)>=(g|0))break;else{j=j+(f<<1)|0;m=m+(f<<1)|0}}}m=k+1179664|0;l=f+1|0;w=0-f|0;u=1-f|0;v=~f;a:do if((B|0)>1){x=(z|0)>1;o=(c[k+4>>2]|0)+l|0;y=1;n=e+(l<<2)|0;e=p+(l<<1)|0;j=0;b:while(1){if(x){l=o;t=1;s=n;r=j;while(1){do if(((d[s+1>>0]|0)+(d[s>>0]|0)+(d[s+2>>0]|0)|0)>(A|0)){a[l>>0]=-1;j=b[e+(w<<1)>>1]|0;if(j<<16>>16>0){b[e>>1]=j;j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}o=b[e+(u<<1)>>1]|0;p=o<<16>>16;j=b[e+(v<<1)>>1]|0;q=j<<16>>16;n=j<<16>>16>0;if(o<<16>>16<=0){if(n){b[e>>1]=j;j=q*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+t;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+y;n=k+1310736+(j+-3<<2)|0;if((c[n>>2]|0)<(t|0))c[n>>2]=t;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}j=b[e+-2>>1]|0;if(j<<16>>16>0){b[e>>1]=j;j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;j=k+1310736+(j+-3<<2)|0;if((c[j>>2]|0)>=(t|0)){j=r;break}c[j>>2]=t;j=r;break}else{j=r+1|0;if((r|0)>32767)break b;b[e>>1]=j;c[k+1179664+(r<<2)>>2]=j<<16>>16;r=r*7|0;c[k+1310736+(r<<2)>>2]=1;c[k+1310736+(r+1<<2)>>2]=t;c[k+1310736+(r+2<<2)>>2]=y;c[k+1310736+(r+3<<2)>>2]=t;c[k+1310736+(r+4<<2)>>2]=t;c[k+1310736+(r+5<<2)>>2]=y;c[k+1310736+(r+6<<2)>>2]=y;break}}if(n){j=c[k+1179664+(p+-1<<2)>>2]|0;p=c[k+1179664+(q+-1<<2)>>2]|0;if((j|0)>(p|0)){b[e>>1]=p;if((r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(j|0))c[o>>2]=p;n=n+1|0;if((n|0)>=(r|0)){j=p;break}else o=o+4|0}}else j=p}else{b[e>>1]=j;if((j|0)<(p|0)&(r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(p|0))c[o>>2]=j;n=n+1|0;if((n|0)>=(r|0))break;else o=o+4|0}}}j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}n=b[e+-2>>1]|0;if(n<<16>>16<=0){b[e>>1]=o;j=p*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+t;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+y;n=k+1310736+(j+-4<<2)|0;if((c[n>>2]|0)>(t|0))c[n>>2]=t;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}j=c[k+1179664+(p+-1<<2)>>2]|0;p=c[k+1179664+((n<<16>>16)+-1<<2)>>2]|0;if((j|0)>(p|0)){b[e>>1]=p;if((r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(j|0))c[o>>2]=p;n=n+1|0;if((n|0)>=(r|0)){j=p;break}else o=o+4|0}}else j=p}else{b[e>>1]=j;if((j|0)<(p|0)&(r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(p|0))c[o>>2]=j;n=n+1|0;if((n|0)>=(r|0))break;else o=o+4|0}}}j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;j=k+1310736+(j+-5<<2)|0;c[j>>2]=(c[j>>2]|0)+y;j=r}else{b[e>>1]=0;a[l>>0]=0;j=r}while(0);t=t+1|0;n=s+4|0;e=e+2|0;l=l+1|0;if((t|0)>=(z|0))break;else{s=n;r=j}}}else l=o;y=y+1|0;if((y|0)>=(B|0)){p=j;D=52;break a}else{o=l+2|0;n=n+8|0;e=e+4|0}}Me(3,3904,C);l=-1}else{p=0;D=52}while(0);if((D|0)==52){e=k+12|0;if((p|0)<1)j=1;else{n=1;j=1;while(1){l=c[m>>2]|0;if((l|0)==(n|0)){l=j;j=j+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[m>>2]=l;if((n|0)<(p|0)){n=n+1|0;m=m+4|0}else break}}o=k+8|0;l=j+-1|0;c[o>>2]=l;if(l){ek(e|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((j|0)>1){l=0;do{D=l<<2;c[k+131084+(D<<2)>>2]=f;c[k+131084+((D|1)<<2)>>2]=0;c[k+131084+((D|2)<<2)>>2]=g;c[k+131084+((D|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[o>>2]|0))}if((p|0)>0){e=0;do{m=(c[k+1179664+(e<<2)>>2]|0)+-1|0;n=e*7|0;l=k+12+(m<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(n<<2)>>2]|0);l=m<<1;j=k+655376+(l<<3)|0;h[j>>3]=+h[j>>3]+ +(c[k+1310736+(n+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(n+2<<2)>>2]|0);m=m<<2;l=k+131084+(m<<2)|0;j=c[k+1310736+(n+3<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;l=k+131084+((m|1)<<2)|0;j=c[k+1310736+(n+4<<2)>>2]|0;if((c[l>>2]|0)<(j|0))c[l>>2]=j;l=k+131084+((m|2)<<2)|0;j=c[k+1310736+(n+5<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;j=k+131084+((m|3)<<2)|0;l=c[k+1310736+(n+6<<2)>>2]|0;if((c[j>>2]|0)<(l|0))c[j>>2]=l;e=e+1|0}while((e|0)<(p|0))}if((c[o>>2]|0)>0){l=0;do{f=k+12+(l<<2)|0;g=l<<1;D=k+655376+(g<<3)|0;h[D>>3]=+h[D>>3]/+(c[f>>2]|0);g=k+655376+((g|1)<<3)|0;h[g>>3]=+h[g>>3]/+(c[f>>2]|0);l=l+1|0}while((l|0)<(c[o>>2]|0));l=0}else l=0}else l=0}i=E;return l|0}function Cd(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;E=i;i=i+16|0;C=E;p=c[k>>2]|0;B=g+-1|0;if((f|0)>0){l=0;m=p;n=p+(($(B,f)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(f|0))break;else{m=m+2|0;n=n+2|0}}}A=j*3|0;z=f+-1|0;if((g|0)>0){l=0;j=p;m=p+(z<<1)|0;while(1){b[m>>1]=0;b[j>>1]=0;l=l+1|0;if((l|0)>=(g|0))break;else{j=j+(f<<1)|0;m=m+(f<<1)|0}}}m=k+1179664|0;l=f+1|0;w=0-f|0;u=1-f|0;v=~f;a:do if((B|0)>1){x=(z|0)>1;o=(c[k+4>>2]|0)+l|0;y=1;n=e+(l<<1)|0;e=p+(l<<1)|0;j=0;b:while(1){if(x){l=o;t=1;s=n;r=j;while(1){q=d[s>>0]|0;do if(((q&240)+24+(q<<4&240)+((d[s+1>>0]|0)&240)|0)>(A|0)){a[l>>0]=-1;j=b[e+(w<<1)>>1]|0;if(j<<16>>16>0){b[e>>1]=j;j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}o=b[e+(u<<1)>>1]|0;p=o<<16>>16;j=b[e+(v<<1)>>1]|0;q=j<<16>>16;n=j<<16>>16>0;if(o<<16>>16<=0){if(n){b[e>>1]=j;j=q*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+t;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+y;n=k+1310736+(j+-3<<2)|0;if((c[n>>2]|0)<(t|0))c[n>>2]=t;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}j=b[e+-2>>1]|0;if(j<<16>>16>0){b[e>>1]=j;j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;j=k+1310736+(j+-3<<2)|0;if((c[j>>2]|0)>=(t|0)){j=r;break}c[j>>2]=t;j=r;break}else{j=r+1|0;if((r|0)>32767)break b;b[e>>1]=j;c[k+1179664+(r<<2)>>2]=j<<16>>16;r=r*7|0;c[k+1310736+(r<<2)>>2]=1;c[k+1310736+(r+1<<2)>>2]=t;c[k+1310736+(r+2<<2)>>2]=y;c[k+1310736+(r+3<<2)>>2]=t;c[k+1310736+(r+4<<2)>>2]=t;c[k+1310736+(r+5<<2)>>2]=y;c[k+1310736+(r+6<<2)>>2]=y;break}}if(n){j=c[k+1179664+(p+-1<<2)>>2]|0;p=c[k+1179664+(q+-1<<2)>>2]|0;if((j|0)>(p|0)){b[e>>1]=p;if((r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(j|0))c[o>>2]=p;n=n+1|0;if((n|0)>=(r|0)){j=p;break}else o=o+4|0}}else j=p}else{b[e>>1]=j;if((j|0)<(p|0)&(r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(p|0))c[o>>2]=j;n=n+1|0;if((n|0)>=(r|0))break;else o=o+4|0}}}j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}n=b[e+-2>>1]|0;if(n<<16>>16<=0){b[e>>1]=o;j=p*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+t;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+y;n=k+1310736+(j+-4<<2)|0;if((c[n>>2]|0)>(t|0))c[n>>2]=t;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}j=c[k+1179664+(p+-1<<2)>>2]|0;p=c[k+1179664+((n<<16>>16)+-1<<2)>>2]|0;if((j|0)>(p|0)){b[e>>1]=p;if((r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(j|0))c[o>>2]=p;n=n+1|0;if((n|0)>=(r|0)){j=p;break}else o=o+4|0}}else j=p}else{b[e>>1]=j;if((j|0)<(p|0)&(r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(p|0))c[o>>2]=j;n=n+1|0;if((n|0)>=(r|0))break;else o=o+4|0}}}j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;j=k+1310736+(j+-5<<2)|0;c[j>>2]=(c[j>>2]|0)+y;j=r}else{b[e>>1]=0;a[l>>0]=0;j=r}while(0);t=t+1|0;n=s+2|0;e=e+2|0;l=l+1|0;if((t|0)>=(z|0))break;else{s=n;r=j}}}else l=o;y=y+1|0;if((y|0)>=(B|0)){p=j;D=52;break a}else{o=l+2|0;n=n+4|0;e=e+4|0}}Me(3,3904,C);l=-1}else{p=0;D=52}while(0);if((D|0)==52){e=k+12|0;if((p|0)<1)j=1;else{n=1;j=1;while(1){l=c[m>>2]|0;if((l|0)==(n|0)){l=j;j=j+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[m>>2]=l;if((n|0)<(p|0)){n=n+1|0;m=m+4|0}else break}}o=k+8|0;l=j+-1|0;c[o>>2]=l;if(l){ek(e|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((j|0)>1){l=0;do{D=l<<2;c[k+131084+(D<<2)>>2]=f;c[k+131084+((D|1)<<2)>>2]=0;c[k+131084+((D|2)<<2)>>2]=g;c[k+131084+((D|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[o>>2]|0))}if((p|0)>0){e=0;do{m=(c[k+1179664+(e<<2)>>2]|0)+-1|0;n=e*7|0;l=k+12+(m<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(n<<2)>>2]|0);l=m<<1;j=k+655376+(l<<3)|0;h[j>>3]=+h[j>>3]+ +(c[k+1310736+(n+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(n+2<<2)>>2]|0);m=m<<2;l=k+131084+(m<<2)|0;j=c[k+1310736+(n+3<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;l=k+131084+((m|1)<<2)|0;j=c[k+1310736+(n+4<<2)>>2]|0;if((c[l>>2]|0)<(j|0))c[l>>2]=j;l=k+131084+((m|2)<<2)|0;j=c[k+1310736+(n+5<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;j=k+131084+((m|3)<<2)|0;l=c[k+1310736+(n+6<<2)>>2]|0;if((c[j>>2]|0)<(l|0))c[j>>2]=l;e=e+1|0}while((e|0)<(p|0))}if((c[o>>2]|0)>0){l=0;do{f=k+12+(l<<2)|0;g=l<<1;D=k+655376+(g<<3)|0;h[D>>3]=+h[D>>3]/+(c[f>>2]|0);g=k+655376+((g|1)<<3)|0;h[g>>3]=+h[g>>3]/+(c[f>>2]|0);l=l+1|0}while((l|0)<(c[o>>2]|0));l=0}else l=0}else l=0}i=E;return l|0}function Dd(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;E=i;i=i+16|0;C=E;p=c[k>>2]|0;B=g+-1|0;if((f|0)>0){l=0;m=p;n=p+(($(B,f)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(f|0))break;else{m=m+2|0;n=n+2|0}}}A=j*3|0;z=f+-1|0;if((g|0)>0){l=0;j=p;m=p+(z<<1)|0;while(1){b[m>>1]=0;b[j>>1]=0;l=l+1|0;if((l|0)>=(g|0))break;else{j=j+(f<<1)|0;m=m+(f<<1)|0}}}m=k+1179664|0;l=f+1|0;w=0-f|0;u=1-f|0;v=~f;a:do if((B|0)>1){x=(z|0)>1;o=(c[k+4>>2]|0)+l|0;y=1;n=e+(l<<1)|0;e=p+(l<<1)|0;j=0;b:while(1){if(x){l=o;t=1;s=n;r=j;while(1){p=d[s>>0]|0;q=d[s+1>>0]|0;do if(((p&248)+12+(p<<5&224)+(q>>>3&24)+(q<<2&248)|0)>(A|0)){a[l>>0]=-1;j=b[e+(w<<1)>>1]|0;if(j<<16>>16>0){b[e>>1]=j;j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}o=b[e+(u<<1)>>1]|0;p=o<<16>>16;j=b[e+(v<<1)>>1]|0;q=j<<16>>16;n=j<<16>>16>0;if(o<<16>>16<=0){if(n){b[e>>1]=j;j=q*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+t;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+y;n=k+1310736+(j+-3<<2)|0;if((c[n>>2]|0)<(t|0))c[n>>2]=t;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}j=b[e+-2>>1]|0;if(j<<16>>16>0){b[e>>1]=j;j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;j=k+1310736+(j+-3<<2)|0;if((c[j>>2]|0)>=(t|0)){j=r;break}c[j>>2]=t;j=r;break}else{j=r+1|0;if((r|0)>32767)break b;b[e>>1]=j;c[k+1179664+(r<<2)>>2]=j<<16>>16;r=r*7|0;c[k+1310736+(r<<2)>>2]=1;c[k+1310736+(r+1<<2)>>2]=t;c[k+1310736+(r+2<<2)>>2]=y;c[k+1310736+(r+3<<2)>>2]=t;c[k+1310736+(r+4<<2)>>2]=t;c[k+1310736+(r+5<<2)>>2]=y;c[k+1310736+(r+6<<2)>>2]=y;break}}if(n){j=c[k+1179664+(p+-1<<2)>>2]|0;p=c[k+1179664+(q+-1<<2)>>2]|0;if((j|0)>(p|0)){b[e>>1]=p;if((r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(j|0))c[o>>2]=p;n=n+1|0;if((n|0)>=(r|0)){j=p;break}else o=o+4|0}}else j=p}else{b[e>>1]=j;if((j|0)<(p|0)&(r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(p|0))c[o>>2]=j;n=n+1|0;if((n|0)>=(r|0))break;else o=o+4|0}}}j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}n=b[e+-2>>1]|0;if(n<<16>>16<=0){b[e>>1]=o;j=p*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+t;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+y;n=k+1310736+(j+-4<<2)|0;if((c[n>>2]|0)>(t|0))c[n>>2]=t;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}j=c[k+1179664+(p+-1<<2)>>2]|0;p=c[k+1179664+((n<<16>>16)+-1<<2)>>2]|0;if((j|0)>(p|0)){b[e>>1]=p;if((r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(j|0))c[o>>2]=p;n=n+1|0;if((n|0)>=(r|0)){j=p;break}else o=o+4|0}}else j=p}else{b[e>>1]=j;if((j|0)<(p|0)&(r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(p|0))c[o>>2]=j;n=n+1|0;if((n|0)>=(r|0))break;else o=o+4|0}}}j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;j=k+1310736+(j+-5<<2)|0;c[j>>2]=(c[j>>2]|0)+y;j=r}else{b[e>>1]=0;a[l>>0]=0;j=r}while(0);t=t+1|0;n=s+2|0;e=e+2|0;l=l+1|0;if((t|0)>=(z|0))break;else{s=n;r=j}}}else l=o;y=y+1|0;if((y|0)>=(B|0)){p=j;D=52;break a}else{o=l+2|0;n=n+4|0;e=e+4|0}}Me(3,3904,C);l=-1}else{p=0;D=52}while(0);if((D|0)==52){e=k+12|0;if((p|0)<1)j=1;else{n=1;j=1;while(1){l=c[m>>2]|0;if((l|0)==(n|0)){l=j;j=j+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[m>>2]=l;if((n|0)<(p|0)){n=n+1|0;m=m+4|0}else break}}o=k+8|0;l=j+-1|0;c[o>>2]=l;if(l){ek(e|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((j|0)>1){l=0;do{D=l<<2;c[k+131084+(D<<2)>>2]=f;c[k+131084+((D|1)<<2)>>2]=0;c[k+131084+((D|2)<<2)>>2]=g;c[k+131084+((D|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[o>>2]|0))}if((p|0)>0){e=0;do{m=(c[k+1179664+(e<<2)>>2]|0)+-1|0;n=e*7|0;l=k+12+(m<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(n<<2)>>2]|0);l=m<<1;j=k+655376+(l<<3)|0;h[j>>3]=+h[j>>3]+ +(c[k+1310736+(n+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(n+2<<2)>>2]|0);m=m<<2;l=k+131084+(m<<2)|0;j=c[k+1310736+(n+3<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;l=k+131084+((m|1)<<2)|0;j=c[k+1310736+(n+4<<2)>>2]|0;if((c[l>>2]|0)<(j|0))c[l>>2]=j;l=k+131084+((m|2)<<2)|0;j=c[k+1310736+(n+5<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;j=k+131084+((m|3)<<2)|0;l=c[k+1310736+(n+6<<2)>>2]|0;if((c[j>>2]|0)<(l|0))c[j>>2]=l;e=e+1|0}while((e|0)<(p|0))}if((c[o>>2]|0)>0){l=0;do{f=k+12+(l<<2)|0;g=l<<1;D=k+655376+(g<<3)|0;h[D>>3]=+h[D>>3]/+(c[f>>2]|0);g=k+655376+((g|1)<<3)|0;h[g>>3]=+h[g>>3]/+(c[f>>2]|0);l=l+1|0}while((l|0)<(c[o>>2]|0));l=0}else l=0}else l=0}i=E;return l|0}function Ed(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;E=i;i=i+16|0;C=E;p=c[k>>2]|0;B=g+-1|0;if((f|0)>0){l=0;m=p;n=p+(($(B,f)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(f|0))break;else{m=m+2|0;n=n+2|0}}}A=j*3|0;z=f+-1|0;if((g|0)>0){l=0;j=p;m=p+(z<<1)|0;while(1){b[m>>1]=0;b[j>>1]=0;l=l+1|0;if((l|0)>=(g|0))break;else{j=j+(f<<1)|0;m=m+(f<<1)|0}}}m=k+1179664|0;l=f+1|0;w=0-f|0;u=1-f|0;v=~f;a:do if((B|0)>1){x=(z|0)>1;o=(c[k+4>>2]|0)+l|0;y=1;n=e+(l<<2)|0;e=p+(l<<1)|0;j=0;b:while(1){if(x){l=o;t=1;s=n;r=j;while(1){do if(((d[s+2>>0]|0)+(d[s+1>>0]|0)+(d[s+3>>0]|0)|0)>(A|0)){a[l>>0]=-1;j=b[e+(w<<1)>>1]|0;if(j<<16>>16>0){b[e>>1]=j;j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}o=b[e+(u<<1)>>1]|0;p=o<<16>>16;j=b[e+(v<<1)>>1]|0;q=j<<16>>16;n=j<<16>>16>0;if(o<<16>>16<=0){if(n){b[e>>1]=j;j=q*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+t;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+y;n=k+1310736+(j+-3<<2)|0;if((c[n>>2]|0)<(t|0))c[n>>2]=t;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}j=b[e+-2>>1]|0;if(j<<16>>16>0){b[e>>1]=j;j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;j=k+1310736+(j+-3<<2)|0;if((c[j>>2]|0)>=(t|0)){j=r;break}c[j>>2]=t;j=r;break}else{j=r+1|0;if((r|0)>32767)break b;b[e>>1]=j;c[k+1179664+(r<<2)>>2]=j<<16>>16;r=r*7|0;c[k+1310736+(r<<2)>>2]=1;c[k+1310736+(r+1<<2)>>2]=t;c[k+1310736+(r+2<<2)>>2]=y;c[k+1310736+(r+3<<2)>>2]=t;c[k+1310736+(r+4<<2)>>2]=t;c[k+1310736+(r+5<<2)>>2]=y;c[k+1310736+(r+6<<2)>>2]=y;break}}if(n){j=c[k+1179664+(p+-1<<2)>>2]|0;p=c[k+1179664+(q+-1<<2)>>2]|0;if((j|0)>(p|0)){b[e>>1]=p;if((r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(j|0))c[o>>2]=p;n=n+1|0;if((n|0)>=(r|0)){j=p;break}else o=o+4|0}}else j=p}else{b[e>>1]=j;if((j|0)<(p|0)&(r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(p|0))c[o>>2]=j;n=n+1|0;if((n|0)>=(r|0))break;else o=o+4|0}}}j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}n=b[e+-2>>1]|0;if(n<<16>>16<=0){b[e>>1]=o;j=p*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+t;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+y;n=k+1310736+(j+-4<<2)|0;if((c[n>>2]|0)>(t|0))c[n>>2]=t;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}j=c[k+1179664+(p+-1<<2)>>2]|0;p=c[k+1179664+((n<<16>>16)+-1<<2)>>2]|0;if((j|0)>(p|0)){b[e>>1]=p;if((r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(j|0))c[o>>2]=p;n=n+1|0;if((n|0)>=(r|0)){j=p;break}else o=o+4|0}}else j=p}else{b[e>>1]=j;if((j|0)<(p|0)&(r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(p|0))c[o>>2]=j;n=n+1|0;if((n|0)>=(r|0))break;else o=o+4|0}}}j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;j=k+1310736+(j+-5<<2)|0;c[j>>2]=(c[j>>2]|0)+y;j=r}else{b[e>>1]=0;a[l>>0]=0;j=r}while(0);t=t+1|0;n=s+4|0;e=e+2|0;l=l+1|0;if((t|0)>=(z|0))break;else{s=n;r=j}}}else l=o;y=y+1|0;if((y|0)>=(B|0)){p=j;D=52;break a}else{o=l+2|0;n=n+8|0;e=e+4|0}}Me(3,3904,C);l=-1}else{p=0;D=52}while(0);if((D|0)==52){e=k+12|0;if((p|0)<1)j=1;else{n=1;j=1;while(1){l=c[m>>2]|0;if((l|0)==(n|0)){l=j;j=j+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[m>>2]=l;if((n|0)<(p|0)){n=n+1|0;m=m+4|0}else break}}o=k+8|0;l=j+-1|0;c[o>>2]=l;if(l){ek(e|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((j|0)>1){l=0;do{D=l<<2;c[k+131084+(D<<2)>>2]=f;c[k+131084+((D|1)<<2)>>2]=0;c[k+131084+((D|2)<<2)>>2]=g;c[k+131084+((D|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[o>>2]|0))}if((p|0)>0){e=0;do{m=(c[k+1179664+(e<<2)>>2]|0)+-1|0;n=e*7|0;l=k+12+(m<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(n<<2)>>2]|0);l=m<<1;j=k+655376+(l<<3)|0;h[j>>3]=+h[j>>3]+ +(c[k+1310736+(n+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(n+2<<2)>>2]|0);m=m<<2;l=k+131084+(m<<2)|0;j=c[k+1310736+(n+3<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;l=k+131084+((m|1)<<2)|0;j=c[k+1310736+(n+4<<2)>>2]|0;if((c[l>>2]|0)<(j|0))c[l>>2]=j;l=k+131084+((m|2)<<2)|0;j=c[k+1310736+(n+5<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;j=k+131084+((m|3)<<2)|0;l=c[k+1310736+(n+6<<2)>>2]|0;if((c[j>>2]|0)<(l|0))c[j>>2]=l;e=e+1|0}while((e|0)<(p|0))}if((c[o>>2]|0)>0){l=0;do{f=k+12+(l<<2)|0;g=l<<1;D=k+655376+(g<<3)|0;h[D>>3]=+h[D>>3]/+(c[f>>2]|0);g=k+655376+((g|1)<<3)|0;h[g>>3]=+h[g>>3]/+(c[f>>2]|0);l=l+1|0}while((l|0)<(c[o>>2]|0));l=0}else l=0}else l=0}i=E;return l|0}function Fd(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;E=i;i=i+16|0;C=E;o=c[k>>2]|0;B=g+-1|0;if((f|0)>0){l=0;m=o;n=o+(($(B,f)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(f|0))break;else{m=m+2|0;n=n+2|0}}}A=f+-1|0;if((g|0)>0){l=0;m=o;n=o+(A<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(g|0))break;else{m=m+(f<<1)|0;n=n+(f<<1)|0}}}n=k+1179664|0;l=f+1|0;x=0-f|0;v=1-f|0;w=~f;a:do if((B|0)>1){y=(A|0)>1;p=(c[k+4>>2]|0)+l|0;z=1;e=e+l|0;o=o+(l<<1)|0;m=0;b:while(1){if(y){l=p;u=1;t=e;s=m;while(1){do if((d[t>>0]|0|0)>(j|0)){a[l>>0]=-1;m=b[o+(x<<1)>>1]|0;if(m<<16>>16>0){b[o>>1]=m;m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}p=b[o+(v<<1)>>1]|0;q=p<<16>>16;m=b[o+(w<<1)>>1]|0;r=m<<16>>16;e=m<<16>>16>0;if(p<<16>>16<=0){if(e){b[o>>1]=m;m=r*7|0;e=k+1310736+(m+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=k+1310736+(m+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+u;e=k+1310736+(m+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+z;e=k+1310736+(m+-3<<2)|0;if((c[e>>2]|0)<(u|0))c[e>>2]=u;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}m=b[o+-2>>1]|0;if(m<<16>>16>0){b[o>>1]=m;m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;m=k+1310736+(m+-3<<2)|0;if((c[m>>2]|0)>=(u|0)){m=s;break}c[m>>2]=u;m=s;break}else{m=s+1|0;if((s|0)>32767)break b;b[o>>1]=m;c[k+1179664+(s<<2)>>2]=m<<16>>16;s=s*7|0;c[k+1310736+(s<<2)>>2]=1;c[k+1310736+(s+1<<2)>>2]=u;c[k+1310736+(s+2<<2)>>2]=z;c[k+1310736+(s+3<<2)>>2]=u;c[k+1310736+(s+4<<2)>>2]=u;c[k+1310736+(s+5<<2)>>2]=z;c[k+1310736+(s+6<<2)>>2]=z;break}}if(e){m=c[k+1179664+(q+-1<<2)>>2]|0;q=c[k+1179664+(r+-1<<2)>>2]|0;if((m|0)>(q|0)){b[o>>1]=q;if((s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(m|0))c[p>>2]=q;e=e+1|0;if((e|0)>=(s|0)){m=q;break}else p=p+4|0}}else m=q}else{b[o>>1]=m;if((m|0)<(q|0)&(s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(q|0))c[p>>2]=m;e=e+1|0;if((e|0)>=(s|0))break;else p=p+4|0}}}m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}e=b[o+-2>>1]|0;if(e<<16>>16<=0){b[o>>1]=p;m=q*7|0;e=k+1310736+(m+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=k+1310736+(m+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+u;e=k+1310736+(m+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+z;e=k+1310736+(m+-4<<2)|0;if((c[e>>2]|0)>(u|0))c[e>>2]=u;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}m=c[k+1179664+(q+-1<<2)>>2]|0;q=c[k+1179664+((e<<16>>16)+-1<<2)>>2]|0;if((m|0)>(q|0)){b[o>>1]=q;if((s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(m|0))c[p>>2]=q;e=e+1|0;if((e|0)>=(s|0)){m=q;break}else p=p+4|0}}else m=q}else{b[o>>1]=m;if((m|0)<(q|0)&(s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(q|0))c[p>>2]=m;e=e+1|0;if((e|0)>=(s|0))break;else p=p+4|0}}}m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;m=k+1310736+(m+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+z;m=s}else{b[o>>1]=0;a[l>>0]=0;m=s}while(0);u=u+1|0;e=t+1|0;o=o+2|0;l=l+1|0;if((u|0)>=(A|0))break;else{t=e;s=m}}}else l=p;z=z+1|0;if((z|0)>=(B|0)){q=m;D=52;break a}else{p=l+2|0;e=e+2|0;o=o+4|0}}Me(3,3904,C);l=-1}else{q=0;D=52}while(0);if((D|0)==52){o=k+12|0;if((q|0)<1)m=1;else{e=1;m=1;while(1){l=c[n>>2]|0;if((l|0)==(e|0)){l=m;m=m+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[n>>2]=l;if((e|0)<(q|0)){e=e+1|0;n=n+4|0}else break}}p=k+8|0;l=m+-1|0;c[p>>2]=l;if(l){ek(o|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((m|0)>1){l=0;do{D=l<<2;c[k+131084+(D<<2)>>2]=f;c[k+131084+((D|1)<<2)>>2]=0;c[k+131084+((D|2)<<2)>>2]=g;c[k+131084+((D|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[p>>2]|0))}if((q|0)>0){o=0;do{n=(c[k+1179664+(o<<2)>>2]|0)+-1|0;e=o*7|0;l=k+12+(n<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(e<<2)>>2]|0);l=n<<1;m=k+655376+(l<<3)|0;h[m>>3]=+h[m>>3]+ +(c[k+1310736+(e+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(e+2<<2)>>2]|0);n=n<<2;l=k+131084+(n<<2)|0;m=c[k+1310736+(e+3<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;l=k+131084+((n|1)<<2)|0;m=c[k+1310736+(e+4<<2)>>2]|0;if((c[l>>2]|0)<(m|0))c[l>>2]=m;l=k+131084+((n|2)<<2)|0;m=c[k+1310736+(e+5<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;m=k+131084+((n|3)<<2)|0;l=c[k+1310736+(e+6<<2)>>2]|0;if((c[m>>2]|0)<(l|0))c[m>>2]=l;o=o+1|0}while((o|0)<(q|0))}if((c[p>>2]|0)>0){l=0;do{f=k+12+(l<<2)|0;g=l<<1;D=k+655376+(g<<3)|0;h[D>>3]=+h[D>>3]/+(c[f>>2]|0);g=k+655376+((g|1)<<3)|0;h[g>>3]=+h[g>>3]/+(c[f>>2]|0);l=l+1|0}while((l|0)<(c[p>>2]|0));l=0}else l=0}else l=0}i=E;return l|0}function Gd(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;E=i;i=i+16|0;C=E;o=c[k>>2]|0;B=g+-1|0;if((f|0)>0){l=0;m=o;n=o+(($(B,f)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(f|0))break;else{m=m+2|0;n=n+2|0}}}A=f+-1|0;if((g|0)>0){l=0;m=o;n=o+(A<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(g|0))break;else{m=m+(f<<1)|0;n=n+(f<<1)|0}}}n=k+1179664|0;l=f+1|0;x=0-f|0;v=1-f|0;w=~f;a:do if((B|0)>1){y=(A|0)>1;p=(c[k+4>>2]|0)+l|0;z=1;e=e+(l<<1)|0;o=o+(l<<1)|0;m=0;b:while(1){if(y){l=p;u=1;t=e;s=m;while(1){do if((d[t+1>>0]|0|0)>(j|0)){a[l>>0]=-1;m=b[o+(x<<1)>>1]|0;if(m<<16>>16>0){b[o>>1]=m;m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}p=b[o+(v<<1)>>1]|0;q=p<<16>>16;m=b[o+(w<<1)>>1]|0;r=m<<16>>16;e=m<<16>>16>0;if(p<<16>>16<=0){if(e){b[o>>1]=m;m=r*7|0;e=k+1310736+(m+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=k+1310736+(m+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+u;e=k+1310736+(m+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+z;e=k+1310736+(m+-3<<2)|0;if((c[e>>2]|0)<(u|0))c[e>>2]=u;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}m=b[o+-2>>1]|0;if(m<<16>>16>0){b[o>>1]=m;m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;m=k+1310736+(m+-3<<2)|0;if((c[m>>2]|0)>=(u|0)){m=s;break}c[m>>2]=u;m=s;break}else{m=s+1|0;if((s|0)>32767)break b;b[o>>1]=m;c[k+1179664+(s<<2)>>2]=m<<16>>16;s=s*7|0;c[k+1310736+(s<<2)>>2]=1;c[k+1310736+(s+1<<2)>>2]=u;c[k+1310736+(s+2<<2)>>2]=z;c[k+1310736+(s+3<<2)>>2]=u;c[k+1310736+(s+4<<2)>>2]=u;c[k+1310736+(s+5<<2)>>2]=z;c[k+1310736+(s+6<<2)>>2]=z;break}}if(e){m=c[k+1179664+(q+-1<<2)>>2]|0;q=c[k+1179664+(r+-1<<2)>>2]|0;if((m|0)>(q|0)){b[o>>1]=q;if((s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(m|0))c[p>>2]=q;e=e+1|0;if((e|0)>=(s|0)){m=q;break}else p=p+4|0}}else m=q}else{b[o>>1]=m;if((m|0)<(q|0)&(s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(q|0))c[p>>2]=m;e=e+1|0;if((e|0)>=(s|0))break;else p=p+4|0}}}m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}e=b[o+-2>>1]|0;if(e<<16>>16<=0){b[o>>1]=p;m=q*7|0;e=k+1310736+(m+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=k+1310736+(m+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+u;e=k+1310736+(m+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+z;e=k+1310736+(m+-4<<2)|0;if((c[e>>2]|0)>(u|0))c[e>>2]=u;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}m=c[k+1179664+(q+-1<<2)>>2]|0;q=c[k+1179664+((e<<16>>16)+-1<<2)>>2]|0;if((m|0)>(q|0)){b[o>>1]=q;if((s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(m|0))c[p>>2]=q;e=e+1|0;if((e|0)>=(s|0)){m=q;break}else p=p+4|0}}else m=q}else{b[o>>1]=m;if((m|0)<(q|0)&(s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(q|0))c[p>>2]=m;e=e+1|0;if((e|0)>=(s|0))break;else p=p+4|0}}}m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;m=k+1310736+(m+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+z;m=s}else{b[o>>1]=0;a[l>>0]=0;m=s}while(0);u=u+1|0;e=t+2|0;o=o+2|0;l=l+1|0;if((u|0)>=(A|0))break;else{t=e;s=m}}}else l=p;z=z+1|0;if((z|0)>=(B|0)){q=m;D=52;break a}else{p=l+2|0;e=e+4|0;o=o+4|0}}Me(3,3904,C);l=-1}else{q=0;D=52}while(0);if((D|0)==52){o=k+12|0;if((q|0)<1)m=1;else{e=1;m=1;while(1){l=c[n>>2]|0;if((l|0)==(e|0)){l=m;m=m+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[n>>2]=l;if((e|0)<(q|0)){e=e+1|0;n=n+4|0}else break}}p=k+8|0;l=m+-1|0;c[p>>2]=l;if(l){ek(o|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((m|0)>1){l=0;do{D=l<<2;c[k+131084+(D<<2)>>2]=f;c[k+131084+((D|1)<<2)>>2]=0;c[k+131084+((D|2)<<2)>>2]=g;c[k+131084+((D|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[p>>2]|0))}if((q|0)>0){o=0;do{n=(c[k+1179664+(o<<2)>>2]|0)+-1|0;e=o*7|0;l=k+12+(n<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(e<<2)>>2]|0);l=n<<1;m=k+655376+(l<<3)|0;h[m>>3]=+h[m>>3]+ +(c[k+1310736+(e+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(e+2<<2)>>2]|0);n=n<<2;l=k+131084+(n<<2)|0;m=c[k+1310736+(e+3<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;l=k+131084+((n|1)<<2)|0;m=c[k+1310736+(e+4<<2)>>2]|0;if((c[l>>2]|0)<(m|0))c[l>>2]=m;l=k+131084+((n|2)<<2)|0;m=c[k+1310736+(e+5<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;m=k+131084+((n|3)<<2)|0;l=c[k+1310736+(e+6<<2)>>2]|0;if((c[m>>2]|0)<(l|0))c[m>>2]=l;o=o+1|0}while((o|0)<(q|0))}if((c[p>>2]|0)>0){l=0;do{f=k+12+(l<<2)|0;g=l<<1;D=k+655376+(g<<3)|0;h[D>>3]=+h[D>>3]/+(c[f>>2]|0);g=k+655376+((g|1)<<3)|0;h[g>>3]=+h[g>>3]/+(c[f>>2]|0);l=l+1|0}while((l|0)<(c[p>>2]|0));l=0}else l=0}else l=0}i=E;return l|0}function Hd(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;E=i;i=i+16|0;C=E;o=c[k>>2]|0;B=g+-1|0;if((f|0)>0){l=0;m=o;n=o+(($(B,f)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(f|0))break;else{m=m+2|0;n=n+2|0}}}A=f+-1|0;if((g|0)>0){l=0;m=o;n=o+(A<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(g|0))break;else{m=m+(f<<1)|0;n=n+(f<<1)|0}}}n=k+1179664|0;l=f+1|0;x=0-f|0;v=1-f|0;w=~f;a:do if((B|0)>1){y=(A|0)>1;p=(c[k+4>>2]|0)+l|0;z=1;e=e+(l<<1)|0;o=o+(l<<1)|0;m=0;b:while(1){if(y){l=p;u=1;t=e;s=m;while(1){do if((d[t>>0]|0|0)>(j|0)){a[l>>0]=-1;m=b[o+(x<<1)>>1]|0;if(m<<16>>16>0){b[o>>1]=m;m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}p=b[o+(v<<1)>>1]|0;q=p<<16>>16;m=b[o+(w<<1)>>1]|0;r=m<<16>>16;e=m<<16>>16>0;if(p<<16>>16<=0){if(e){b[o>>1]=m;m=r*7|0;e=k+1310736+(m+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=k+1310736+(m+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+u;e=k+1310736+(m+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+z;e=k+1310736+(m+-3<<2)|0;if((c[e>>2]|0)<(u|0))c[e>>2]=u;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}m=b[o+-2>>1]|0;if(m<<16>>16>0){b[o>>1]=m;m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;m=k+1310736+(m+-3<<2)|0;if((c[m>>2]|0)>=(u|0)){m=s;break}c[m>>2]=u;m=s;break}else{m=s+1|0;if((s|0)>32767)break b;b[o>>1]=m;c[k+1179664+(s<<2)>>2]=m<<16>>16;s=s*7|0;c[k+1310736+(s<<2)>>2]=1;c[k+1310736+(s+1<<2)>>2]=u;c[k+1310736+(s+2<<2)>>2]=z;c[k+1310736+(s+3<<2)>>2]=u;c[k+1310736+(s+4<<2)>>2]=u;c[k+1310736+(s+5<<2)>>2]=z;c[k+1310736+(s+6<<2)>>2]=z;break}}if(e){m=c[k+1179664+(q+-1<<2)>>2]|0;q=c[k+1179664+(r+-1<<2)>>2]|0;if((m|0)>(q|0)){b[o>>1]=q;if((s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(m|0))c[p>>2]=q;e=e+1|0;if((e|0)>=(s|0)){m=q;break}else p=p+4|0}}else m=q}else{b[o>>1]=m;if((m|0)<(q|0)&(s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(q|0))c[p>>2]=m;e=e+1|0;if((e|0)>=(s|0))break;else p=p+4|0}}}m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}e=b[o+-2>>1]|0;if(e<<16>>16<=0){b[o>>1]=p;m=q*7|0;e=k+1310736+(m+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=k+1310736+(m+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+u;e=k+1310736+(m+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+z;e=k+1310736+(m+-4<<2)|0;if((c[e>>2]|0)>(u|0))c[e>>2]=u;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}m=c[k+1179664+(q+-1<<2)>>2]|0;q=c[k+1179664+((e<<16>>16)+-1<<2)>>2]|0;if((m|0)>(q|0)){b[o>>1]=q;if((s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(m|0))c[p>>2]=q;e=e+1|0;if((e|0)>=(s|0)){m=q;break}else p=p+4|0}}else m=q}else{b[o>>1]=m;if((m|0)<(q|0)&(s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(q|0))c[p>>2]=m;e=e+1|0;if((e|0)>=(s|0))break;else p=p+4|0}}}m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;m=k+1310736+(m+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+z;m=s}else{b[o>>1]=0;a[l>>0]=0;m=s}while(0);u=u+1|0;e=t+2|0;o=o+2|0;l=l+1|0;if((u|0)>=(A|0))break;else{t=e;s=m}}}else l=p;z=z+1|0;if((z|0)>=(B|0)){q=m;D=52;break a}else{p=l+2|0;e=e+4|0;o=o+4|0}}Me(3,3904,C);l=-1}else{q=0;D=52}while(0);if((D|0)==52){o=k+12|0;if((q|0)<1)m=1;else{e=1;m=1;while(1){l=c[n>>2]|0;if((l|0)==(e|0)){l=m;m=m+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[n>>2]=l;if((e|0)<(q|0)){e=e+1|0;n=n+4|0}else break}}p=k+8|0;l=m+-1|0;c[p>>2]=l;if(l){ek(o|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((m|0)>1){l=0;do{D=l<<2;c[k+131084+(D<<2)>>2]=f;c[k+131084+((D|1)<<2)>>2]=0;c[k+131084+((D|2)<<2)>>2]=g;c[k+131084+((D|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[p>>2]|0))}if((q|0)>0){o=0;do{n=(c[k+1179664+(o<<2)>>2]|0)+-1|0;e=o*7|0;l=k+12+(n<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(e<<2)>>2]|0);l=n<<1;m=k+655376+(l<<3)|0;h[m>>3]=+h[m>>3]+ +(c[k+1310736+(e+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(e+2<<2)>>2]|0);n=n<<2;l=k+131084+(n<<2)|0;m=c[k+1310736+(e+3<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;l=k+131084+((n|1)<<2)|0;m=c[k+1310736+(e+4<<2)>>2]|0;if((c[l>>2]|0)<(m|0))c[l>>2]=m;l=k+131084+((n|2)<<2)|0;m=c[k+1310736+(e+5<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;m=k+131084+((n|3)<<2)|0;l=c[k+1310736+(e+6<<2)>>2]|0;if((c[m>>2]|0)<(l|0))c[m>>2]=l;o=o+1|0}while((o|0)<(q|0))}if((c[p>>2]|0)>0){l=0;do{f=k+12+(l<<2)|0;g=l<<1;D=k+655376+(g<<3)|0;h[D>>3]=+h[D>>3]/+(c[f>>2]|0);g=k+655376+((g|1)<<3)|0;h[g>>3]=+h[g>>3]/+(c[f>>2]|0);l=l+1|0}while((l|0)<(c[p>>2]|0));l=0}else l=0}else l=0}i=E;return l|0}function Id(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;E=i;i=i+16|0;C=E;o=c[k>>2]|0;B=g+-1|0;if((f|0)>0){l=0;m=o;n=o+(($(B,f)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(f|0))break;else{m=m+2|0;n=n+2|0}}}A=f+-1|0;if((g|0)>0){l=0;m=o;n=o+(A<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(g|0))break;else{m=m+(f<<1)|0;n=n+(f<<1)|0}}}n=k+1179664|0;m=f+1|0;x=0-f|0;v=1-f|0;w=~f;a:do if((B|0)>1){y=(A|0)>1;l=(c[k+4>>2]|0)+m|0;z=1;e=e+m|0;o=o+(m<<1)|0;j=j+m|0;m=0;b:while(1){if(y){u=1;t=e;s=m;while(1){do if((d[t>>0]|0)>(d[j>>0]|0)){a[l>>0]=-1;m=b[o+(x<<1)>>1]|0;if(m<<16>>16>0){b[o>>1]=m;m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}p=b[o+(v<<1)>>1]|0;q=p<<16>>16;m=b[o+(w<<1)>>1]|0;r=m<<16>>16;e=m<<16>>16>0;if(p<<16>>16<=0){if(e){b[o>>1]=m;m=r*7|0;e=k+1310736+(m+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=k+1310736+(m+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+u;e=k+1310736+(m+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+z;e=k+1310736+(m+-3<<2)|0;if((c[e>>2]|0)<(u|0))c[e>>2]=u;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}m=b[o+-2>>1]|0;if(m<<16>>16>0){b[o>>1]=m;m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;m=k+1310736+(m+-3<<2)|0;if((c[m>>2]|0)>=(u|0)){m=s;break}c[m>>2]=u;m=s;break}else{m=s+1|0;if((s|0)>32767)break b;b[o>>1]=m;c[k+1179664+(s<<2)>>2]=m<<16>>16;s=s*7|0;c[k+1310736+(s<<2)>>2]=1;c[k+1310736+(s+1<<2)>>2]=u;c[k+1310736+(s+2<<2)>>2]=z;c[k+1310736+(s+3<<2)>>2]=u;c[k+1310736+(s+4<<2)>>2]=u;c[k+1310736+(s+5<<2)>>2]=z;c[k+1310736+(s+6<<2)>>2]=z;break}}if(e){m=c[k+1179664+(q+-1<<2)>>2]|0;q=c[k+1179664+(r+-1<<2)>>2]|0;if((m|0)>(q|0)){b[o>>1]=q;if((s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(m|0))c[p>>2]=q;e=e+1|0;if((e|0)>=(s|0)){m=q;break}else p=p+4|0}}else m=q}else{b[o>>1]=m;if((m|0)<(q|0)&(s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(q|0))c[p>>2]=m;e=e+1|0;if((e|0)>=(s|0))break;else p=p+4|0}}}m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}e=b[o+-2>>1]|0;if(e<<16>>16<=0){b[o>>1]=p;m=q*7|0;e=k+1310736+(m+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=k+1310736+(m+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+u;e=k+1310736+(m+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+z;e=k+1310736+(m+-4<<2)|0;if((c[e>>2]|0)>(u|0))c[e>>2]=u;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}m=c[k+1179664+(q+-1<<2)>>2]|0;q=c[k+1179664+((e<<16>>16)+-1<<2)>>2]|0;if((m|0)>(q|0)){b[o>>1]=q;if((s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(m|0))c[p>>2]=q;e=e+1|0;if((e|0)>=(s|0)){m=q;break}else p=p+4|0}}else m=q}else{b[o>>1]=m;if((m|0)<(q|0)&(s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(q|0))c[p>>2]=m;e=e+1|0;if((e|0)>=(s|0))break;else p=p+4|0}}}m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;m=k+1310736+(m+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+z;m=s}else{b[o>>1]=0;a[l>>0]=0;m=s}while(0);u=u+1|0;e=t+1|0;j=j+1|0;o=o+2|0;l=l+1|0;if((u|0)>=(A|0))break;else{t=e;s=m}}}z=z+1|0;if((z|0)>=(B|0)){p=m;D=52;break a}else{l=l+2|0;e=e+2|0;o=o+4|0;j=j+2|0}}Me(3,3904,C);l=-1}else{p=0;D=52}while(0);if((D|0)==52){o=k+12|0;if((p|0)<1)m=1;else{e=1;m=1;while(1){l=c[n>>2]|0;if((l|0)==(e|0)){l=m;m=m+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[n>>2]=l;if((e|0)<(p|0)){e=e+1|0;n=n+4|0}else break}}j=k+8|0;l=m+-1|0;c[j>>2]=l;if(l){ek(o|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((m|0)>1){l=0;do{D=l<<2;c[k+131084+(D<<2)>>2]=f;c[k+131084+((D|1)<<2)>>2]=0;c[k+131084+((D|2)<<2)>>2]=g;c[k+131084+((D|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[j>>2]|0))}if((p|0)>0){o=0;do{n=(c[k+1179664+(o<<2)>>2]|0)+-1|0;e=o*7|0;l=k+12+(n<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(e<<2)>>2]|0);l=n<<1;m=k+655376+(l<<3)|0;h[m>>3]=+h[m>>3]+ +(c[k+1310736+(e+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(e+2<<2)>>2]|0);n=n<<2;l=k+131084+(n<<2)|0;m=c[k+1310736+(e+3<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;l=k+131084+((n|1)<<2)|0;m=c[k+1310736+(e+4<<2)>>2]|0;if((c[l>>2]|0)<(m|0))c[l>>2]=m;l=k+131084+((n|2)<<2)|0;m=c[k+1310736+(e+5<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;m=k+131084+((n|3)<<2)|0;l=c[k+1310736+(e+6<<2)>>2]|0;if((c[m>>2]|0)<(l|0))c[m>>2]=l;o=o+1|0}while((o|0)<(p|0))}if((c[j>>2]|0)>0){l=0;do{f=k+12+(l<<2)|0;g=l<<1;D=k+655376+(g<<3)|0;h[D>>3]=+h[D>>3]/+(c[f>>2]|0);g=k+655376+((g|1)<<3)|0;h[g>>3]=+h[g>>3]/+(c[f>>2]|0);l=l+1|0}while((l|0)<(c[j>>2]|0));l=0}else l=0}else l=0}i=E;return l|0}function Jd(a){a=a|0;return Kd(a+8|0)|0}function Kd(a){a=a|0;var b=0,d=0;d=i;i=i+16|0;b=Uj(4)|0;if(!b){Me(3,5472,d);rb(1)}a=wf(a)|0;c[b>>2]=a;if(!a){Vj(b);b=0}i=d;return b|0}function Ld(a){a=a|0;var b=0;b=c[a>>2]|0;if(!b)b=-1;else{xf(b)|0;Vj(c[a>>2]|0);c[a>>2]=0;b=0}return b|0}function Md(a){a=a|0;var b=0,d=0,e=0;d=i;i=i+16|0;b=Uj(7062432)|0;if(!b){Me(3,5472,d);rb(1)}c[b>>2]=0;c[b+4834148>>2]=0;c[b+7062408>>2]=0;c[b+4>>2]=-1;c[b+8>>2]=0;c[b+12>>2]=1;c[b+16>>2]=100;c[b+20>>2]=0;c[b+24>>2]=0;c[b+28>>2]=2;h[b+7062416>>3]=.5;c[b+7062424>>2]=3;c[b+32>>2]=a;e=c[a>>2]|0;c[b+36>>2]=e;a=c[a+4>>2]|0;c[b+40>>2]=a;c[b+44>>2]=0;c[b+15408>>2]=0;c[b+4834152>>2]=0;c[b+4818296>>2]=0;a=Uj($(e<<1,a)|0)|0;c[b+4834144>>2]=a;if(!a){Me(3,5472,d+8|0);rb(1)}else{c[b+7062384>>2]=0;Nd(b,2)|0;Od(b,0)|0;c[b+7062388>>2]=-1;Pd(b,0)|0;c[b+7062392>>2]=7;c[b+7062396>>2]=0;i=d;return b|0}return 0}function Nd(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;g=i;i=i+16|0;d=g;a:do if(a){e=a+4|0;if((c[e>>2]|0)!=(b|0)){switch(b|0){case 11:case 10:case 9:case 8:case 7:case 6:case 4:case 3:case 2:case 1:case 0:{f=0;break}case 14:case 13:case 12:case 5:{f=1;break}default:{c[d>>2]=b;Me(3,3936,d);d=-1;break a}}c[e>>2]=b;c[a+8>>2]=Pe(b)|0;d=a+7062408|0;b=c[d>>2]|0;if(b){pe(b);c[d>>2]=oe(c[a+36>>2]|0,c[a+40>>2]|0,c[e>>2]|0,0)|0}d=a+24|0;b=c[d>>2]|0;if(!f)switch(b|0){case 1:{c[d>>2]=4;d=0;break a}case 4:{c[d>>2]=3;d=0;break a}default:{d=0;break a}}else switch(b|0){case 0:{c[d>>2]=1;d=0;break a}case 3:{c[d>>2]=4;d=0;break a}default:{d=0;break a}}}else d=0}else d=-1;while(0);i=g;return d|0}function Od(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=i;i=i+16|0;e=f;do if(a)if((c[a>>2]|0)!=(b|0)){c[a>>2]=b;if(!b){d=a+4834148|0;Vj(c[d>>2]|0);c[d>>2]=0;d=0;break}b=Uj($(c[a+40>>2]|0,c[a+36>>2]|0)|0)|0;c[a+4834148>>2]=b;if(!b){Me(3,5472,e);rb(1)}else d=0}else d=0;else d=-1;while(0);i=f;return d|0}function Pd(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;j=i;i=i+16|0;h=j+8|0;f=j;if(a){g=a+7062388|0;if((c[g>>2]|0)!=(b|0)){d=a+7062408|0;e=c[d>>2]|0;if(e){pe(e);c[d>>2]=0}switch(b|0){case 3:case 2:case 1:{c[d>>2]=oe(c[a+36>>2]|0,c[a+40>>2]|0,c[a+4>>2]|0,0)|0;break}case 4:{c[a+7062404>>2]=1;c[a+7062400>>2]=1;b=4;break}case 0:{b=0;break}default:{Me(3,3985,f);b=0}}c[g>>2]=b;if((c[a>>2]|0)==1){c[h>>2]=c[760+(b<<2)>>2];Me(3,4059,h);b=0}else b=0}else b=0}else b=-1;i=j;return b|0}function Qd(a){a=a|0;var b=0,d=0;if(!a)b=-1;else{b=a+7062408|0;d=c[b>>2]|0;if(d){pe(d);c[b>>2]=0}Vj(c[a+4834144>>2]|0);Vj(c[a+4834148>>2]|0);Vj(a);b=0}return b|0}function Rd(a,b){a=a|0;b=b|0;if((a|0)!=0&(b|0)!=0){c[b>>2]=c[a>>2];a=0}else a=-1;return a|0}function Sd(a,b){a=a|0;b=b|0;if((a|0)!=0&b>>>0<2){c[a+12>>2]=b;a=0}else a=-1;return a|0}function Td(a,b){a=a|0;b=b|0;if((a|0)!=0&(b|0)!=0){c[b>>2]=c[a+12>>2];a=0}else a=-1;return a|0}function Ud(a,b){a=a|0;b=b|0;if((a|0)==0|b>>>0>255)a=-1;else{c[a+16>>2]=b;a=0}return a|0}function Vd(a,b){a=a|0;b=b|0;if((a|0)!=0&(b|0)!=0){c[b>>2]=c[a+16>>2];a=0}else a=-1;return a|0}function Wd(a,b){a=a|0;b=b|0;if((a|0)!=0&(b|0)!=0){c[b>>2]=c[a+7062388>>2];a=0}else a=-1;return a|0}function Xd(a,b){a=a|0;b=b|0;if((a|0)!=0&b>>>0<2){c[a+20>>2]=b;a=0}else a=-1;return a|0}function Yd(a,b){a=a|0;b=b|0;if(!a)a=-1;else{c[b>>2]=c[a+20>>2];a=0}return a|0}function Zd(a,b){a=a|0;b=b|0;if((a|0)!=0&b>>>0<5){c[a+24>>2]=b;a=0}else a=-1;return a|0}function _d(a,b){a=a|0;b=b|0;if(!a)a=-1;else{c[a+7062424>>2]=b;a=0}return a|0}function $d(a,b){a=a|0;b=b|0;if((a|0)!=0&(b|0)!=0){c[b>>2]=c[a+7062424>>2];a=0}else a=-1;return a|0}function ae(a,b){a=a|0;b=b|0;if(!a)a=-1;else{c[b>>2]=c[a+24>>2];a=0}return a|0}function be(a,b){a=a|0;b=+b;if((a|0)!=0?!(b<=0.0|b>=1.0):0){h[a+7062416>>3]=b;a=0}else a=-1;return a|0}function ce(a,b){a=a|0;b=b|0;if(!a)a=-1;else{h[b>>3]=+h[a+7062416>>3];a=0}return a|0}function de(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,j=0.0,k=0,l=0,m=0,n=0.0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0.0,P=0,Q=0,R=0.0,S=0.0;Q=i;i=i+80|0;M=Q+32|0;G=Q+24|0;z=Q;y=Q+52|0;D=Q+40|0;L=Q+64|0;P=a+44|0;c[P>>2]=0;J=a+7062388|0;f=c[J>>2]|0;a:do if((f|0)==4){I=a+7062396|0;e=c[I>>2]|0;do if((e|0)>0){f=4;e=e+-1|0}else{C=a+16|0;F=c[C>>2]|0;E=a+7062400|0;A=(c[E>>2]|0)+F|0;A=(A|0)>255?255:A;c[y>>2]=A;H=a+7062404|0;B=F-(c[H>>2]|0)|0;B=(B|0)<0?0:B;c[y+4>>2]=B;c[y+8>>2]=F;e=a+36|0;f=a+40|0;g=a+4|0;k=a+12|0;l=a+20|0;m=a+4834144|0;p=a+15416|0;q=a+15408|0;r=a+7062384|0;s=a+24|0;t=a+32|0;u=a+7062416|0;v=a+48|0;w=a+7062424|0;x=0;do{if((xe(b,c[e>>2]|0,c[f>>2]|0,c[g>>2]|0,c[a>>2]|0,c[k>>2]|0,c[y+(x<<2)>>2]|0,c[l>>2]|0,m,0)|0)<0){e=-1;break a}if((fe(c[e>>2]|0,c[f>>2]|0,m,c[l>>2]|0,1e6,70,1.0,p,q)|0)<0){e=-1;break a}if((je(b,c[e>>2]|0,c[f>>2]|0,c[g>>2]|0,p,c[q>>2]|0,c[r>>2]|0,c[l>>2]|0,c[s>>2]|0,(c[t>>2]|0)+184|0,+h[u>>3],v,P,c[w>>2]|0)|0)<0){e=-1;break a}c[D+(x<<2)>>2]=c[P>>2];x=x+1|0}while((x|0)<3);if((c[a>>2]|0)==1){N=c[D+4>>2]|0;g=c[D+8>>2]|0;f=c[D>>2]|0;c[z>>2]=B;c[z+4>>2]=N;c[z+8>>2]=F;c[z+12>>2]=g;c[z+16>>2]=A;c[z+20>>2]=f;Me(3,4153,z)}else{f=c[D>>2]|0;g=c[D+8>>2]|0}e=c[D+4>>2]|0;if((f|0)>(g|0)|(e|0)>(g|0)){f=(f|0)>=(e|0)?A:B;c[C>>2]=f;e=f-F|0;if((e|0)>0){c[E>>2]=e;e=1}else{c[E>>2]=1;e=0-e|0}c[H>>2]=e;if((c[a>>2]|0)==1){c[G>>2]=f;Me(3,4229,G)}f=c[J>>2]|0;e=c[a+7062392>>2]|0;break}e=c[E>>2]|0;f=c[H>>2]|0;do if((e|0)>=(f|0))if((e|0)>(f|0)){c[H>>2]=f+1;break}else{e=e+1|0;c[E>>2]=e;c[H>>2]=f+1;break}else{e=e+1|0;c[E>>2]=e}while(0);if((e+F|0)>254){c[E>>2]=1;e=1}if((F|0)<=(e|0))c[H>>2]=1;c[I>>2]=c[a+7062392>>2];N=47;break a}while(0);c[I>>2]=e;N=30}else N=30;while(0);b:do if((N|0)==30){c:do switch(f|0){case 3:{f=a+7062408|0;e=we(c[f>>2]|0,b,9,-7)|0;if((e|0)<0)break b;e=c[f>>2]|0;f=a+4834144|0;e=xe(c[e>>2]|0,c[e+8>>2]|0,c[e+12>>2]|0,5,c[a>>2]|0,c[a+12>>2]|0,0,0,f,c[e+4>>2]|0)|0;if((e|0)<0)break b;e=a+36|0;g=a+40|0;k=a+20|0;break}case 2:case 1:{g=a+7062396|0;e=c[g>>2]|0;if((e|0)>0){c[g>>2]=e+-1;N=44;break c}e=c[a+7062408>>2]|0;if((f|0)==1)e=ue(e,b,L)|0;else e=ve(e,b,L)|0;if((e|0)<0)break b;e=a+16|0;if((c[a>>2]|0)==1?(K=d[L>>0]|0,(c[e>>2]|0)!=(K|0)):0){c[M>>2]=(c[J>>2]|0)==1?4281:4288;c[M+4>>2]=K;Me(3,4293,M)}c[e>>2]=d[L>>0];c[g>>2]=c[a+7062392>>2];N=44;break}default:N=44}while(0);if((N|0)==44){e=a+36|0;g=a+40|0;k=a+20|0;f=a+4834144|0;if((xe(b,c[e>>2]|0,c[g>>2]|0,c[a+4>>2]|0,c[a>>2]|0,c[a+12>>2]|0,c[a+16>>2]|0,c[k>>2]|0,f,0)|0)<0){e=-1;break}}l=a+15416|0;m=a+15408|0;if((fe(c[e>>2]|0,c[g>>2]|0,f,c[k>>2]|0,1e6,70,1.0,l,m)|0)>=0?(je(b,c[e>>2]|0,c[g>>2]|0,c[a+4>>2]|0,l,c[m>>2]|0,c[a+7062384>>2]|0,c[k>>2]|0,c[a+24>>2]|0,(c[a+32>>2]|0)+184|0,+h[a+7062416>>3],a+48|0,P,c[a+7062424>>2]|0)|0)>=0:0)N=47;else e=-1}while(0);d:do if((N|0)==47){t=a+28|0;if((c[t>>2]|0)==1){ee(a);e=0;break}u=a+4818296|0;r=a+24|0;q=c[u>>2]|0;if((q|0)>0){s=0;do{f=c[P>>2]|0;g=a+4818304+(s*264|0)+56|0;k=a+4818304+(s*264|0)+64|0;if((f|0)>0){o=+(c[a+4818304+(s*264|0)>>2]|0);e=-1;l=0;n=.5;while(1){j=+(c[a+48+(l<<8)>>2]|0);R=o/j;if(!(R<.7|R>1.43)?(R=+h[a+48+(l<<8)+56>>3]-+h[g>>3],O=+h[a+48+(l<<8)+64>>3]-+h[k>>3],O=(R*R+O*O)/j,O<n):0){e=l;j=O}else j=n;l=l+1|0;if((l|0)>=(f|0)){p=e;break}else n=j}}else p=-1;e:do if((p|0)>-1){m=c[r>>2]|0;switch(m|0){case 2:case 1:case 0:break;case 4:case 3:{g=a+48+(p<<8)+40|0;j=+h[a+4818304+(s*264|0)+40>>3];if(!(+h[g>>3]<j)){e=a+48+(p<<8)+48|0;f=a+4818304+(s*264|0)+48|0;if(!(+h[e>>3]<+h[f>>3]))break e}else{f=a+4818304+(s*264|0)+48|0;e=a+48+(p<<8)+48|0}h[g>>3]=j;c[a+48+(p<<8)+8>>2]=c[a+4818304+(s*264|0)+8>>2];h[e>>3]=+h[f>>3];c[a+48+(p<<8)+12>>2]=c[a+4818304+(s*264|0)+12>>2];e=-1;n=1.0e8;g=0;while(1){j=0.0;f=0;do{b=(f+g|0)%4|0;o=+h[a+4818304+(s*264|0)+168+(f<<4)>>3]-+h[a+48+(p<<8)+168+(b<<4)>>3];R=+h[a+4818304+(s*264|0)+168+(f<<4)+8>>3]-+h[a+48+(p<<8)+168+(b<<4)+8>>3];j=j+(o*o+R*R);f=f+1|0}while((f|0)!=4);f=j<n;e=f?g:e;g=g+1|0;if((g|0)==4)break;else n=f?j:n}b=4-e|0;c[a+48+(p<<8)+20>>2]=(b+(c[a+4818304+(s*264|0)+20>>2]|0)|0)%4|0;c[a+48+(p<<8)+24>>2]=(b+(c[a+4818304+(s*264|0)+24>>2]|0)|0)%4|0;break e}default:{e=-1;break d}}e=a+48+(p<<8)+32|0;o=+h[a+4818304+(s*264|0)+32>>3];if(+h[e>>3]<o){h[e>>3]=o;l=c[a+4818304+(s*264|0)+4>>2]|0;c[a+48+(p<<8)+4>>2]=l;g=a+4818304+(s*264|0)+16|0;e=-1;n=1.0e8;k=0;while(1){j=0.0;f=0;do{b=(f+k|0)%4|0;S=+h[a+4818304+(s*264|0)+168+(f<<4)>>3]-+h[a+48+(p<<8)+168+(b<<4)>>3];R=+h[a+4818304+(s*264|0)+168+(f<<4)+8>>3]-+h[a+48+(p<<8)+168+(b<<4)+8>>3];j=j+(S*S+R*R);f=f+1|0}while((f|0)!=4);if(j<n)e=(4-k+(c[g>>2]|0)|0)%4|0;else j=n;k=k+1|0;if((k|0)==4)break;else n=j}c[a+48+(p<<8)+16>>2]=e;if(m>>>0<2){c[a+48+(p<<8)+8>>2]=l;h[a+48+(p<<8)+40>>3]=o;c[a+48+(p<<8)+20>>2]=e;break}else{c[a+48+(p<<8)+12>>2]=l;h[a+48+(p<<8)+48>>3]=o;c[a+48+(p<<8)+24>>2]=e;break}}}while(0);s=s+1|0}while((s|0)<(q|0))}ee(a);if((c[u>>2]|0)>0){g=0;e=0;do{f=a+4818304+(g*264|0)|0;N=a+4818304+(g*264|0)+256|0;b=(c[N>>2]|0)+1|0;c[N>>2]=b;if((b|0)<4){if((g|0)!=(e|0))ik(a+4818304+(e*264|0)|0,f|0,264)|0;e=e+1|0}g=g+1|0}while((g|0)<(c[u>>2]|0))}else e=0;c[u>>2]=e;e=c[P>>2]|0;f:do if((e|0)>0){m=0;do{k=a+48+(m<<8)|0;g=c[a+48+(m<<8)+4>>2]|0;if((g|0)>=0){l=c[u>>2]|0;g:do if((l|0)>0){f=0;do{if((c[a+4818304+(f*264|0)+4>>2]|0)==(g|0))break g;f=f+1|0}while((f|0)<(l|0))}else f=0;while(0);if((f|0)==(l|0)){if((l|0)==60)break f;c[u>>2]=l+1}ik(a+4818304+(f*264|0)|0,k|0,256)|0;c[a+4818304+(f*264|0)+256>>2]=1}m=m+1|0;e=c[P>>2]|0}while((m|0)<(e|0))}while(0);if((c[t>>2]|0)!=2?(c[u>>2]|0)>0:0){l=0;while(1){g=a+4818304+(l*264|0)+56|0;k=a+4818304+(l*264|0)+64|0;h:do if((e|0)>0){n=+(c[a+4818304+(l*264|0)>>2]|0);f=0;do{j=+(c[a+48+(f<<8)>>2]|0);S=n/j;if(!(S<.7|S>1.43)?(R=+h[a+48+(f<<8)+56>>3]-+h[g>>3],S=+h[a+48+(f<<8)+64>>3]-+h[k>>3],(R*R+S*S)/j<.5):0)break h;f=f+1|0}while((f|0)<(e|0))}else f=0;while(0);if((f|0)==(e|0)){ik(a+48+(e<<8)|0,a+4818304+(l*264|0)|0,256)|0;e=(c[P>>2]|0)+1|0;c[P>>2]=e}l=l+1|0;if((l|0)>=(c[u>>2]|0)){e=0;break}}}else e=0}while(0);i=Q;return e|0}function ee(a){a=a|0;var b=0,d=0,e=0,f=0;switch(c[a+24>>2]|0){case 1:case 0:{d=c[a+44>>2]|0;if((d|0)>0){e=0;do{b=a+48+(e<<8)+4|0;if((c[b>>2]|0)>-1?+h[a+48+(e<<8)+32>>3]<.5:0){c[a+48+(e<<8)+8>>2]=-1;c[b>>2]=-1;c[a+48+(e<<8)+236>>2]=6}e=e+1|0}while((e|0)<(d|0))}break}case 2:{d=c[a+44>>2]|0;if((d|0)>0){e=0;do{b=a+48+(e<<8)+4|0;if((c[b>>2]|0)>-1?+h[a+48+(e<<8)+32>>3]<.5:0){c[a+48+(e<<8)+12>>2]=-1;c[b>>2]=-1;c[a+48+(e<<8)+236>>2]=6}e=e+1|0}while((e|0)<(d|0))}break}default:{e=c[a+44>>2]|0;if((e|0)>0){f=0;do{b=a+48+(f<<8)+8|0;if((c[b>>2]|0)>-1?+h[a+48+(f<<8)+40>>3]<.5:0){c[b>>2]=-1;d=0}else d=1;b=a+48+(f<<8)+12|0;if(((c[b>>2]|0)>-1?+h[a+48+(f<<8)+48>>3]<.5:0)?(c[b>>2]=-1,(d|0)==0):0)c[a+48+(f<<8)+236>>2]=6;f=f+1|0}while((f|0)<(e|0))}}}return}function fe(a,b,d,e,f,g,j,k,l){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;j=+j;k=k|0;l=l|0;var m=0.0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0.0;L=i;i=i+96|0;F=L+56|0;H=L+48|0;G=L+8|0;I=L;K=(e|0)==1;if(K){a=(a|0)/2|0;b=(b|0)/2|0;f=(f|0)/4|0;g=(g|0)/4|0}c[l>>2]=0;C=d+8|0;D=a+-2|0;z=b+-2|0;A=d+1179664|0;a:do if((c[C>>2]|0)>0){B=0;while(1){w=d+12+(B<<2)|0;y=c[w>>2]|0;b:do if(((((!((y|0)<(g|0)|(y|0)>(f|0))?(E=d+131084+(B<<4)|0,(c[E>>2]|0)!=1):0)?(c[d+131084+(B<<4)+4>>2]|0)!=(D|0):0)?(c[d+131084+(B<<4)+8>>2]|0)!=1:0)?(c[d+131084+(B<<4)+12>>2]|0)!=(z|0):0)?(ge(c[d>>2]|0,a,0,A,B+1|0,E,k+((c[l>>2]|0)*80048|0)|0)|0)>=0:0){t=c[w>>2]|0;x=c[l>>2]|0;u=k+(x*80048|0)+28|0;b=c[u>>2]|0;v=k+(x*80048|0)+40028|0;n=c[v>>2]|0;y=k+(x*80048|0)+24|0;o=(c[y>>2]|0)+-1|0;if((o|0)>1){r=0;s=1;e=0;while(1){p=(c[k+(x*80048|0)+28+(s<<2)>>2]|0)-b|0;p=$(p,p)|0;q=(c[k+(x*80048|0)+40028+(s<<2)>>2]|0)-n|0;p=($(q,q)|0)+p|0;q=(p|0)>(r|0);e=q?s:e;s=s+1|0;if((s|0)>=(o|0))break;else r=q?p:r}}else e=0;m=+(t|0)/.75*.01*j;c[H>>2]=0;c[I>>2]=0;c:do if((he(u,v,0,e,m,F,H)|0)>=0?(he(u,v,e,(c[y>>2]|0)+-1|0,m,G,I)|0)>=0:0){b=c[H>>2]|0;n=c[I>>2]|0;do if((b|0)==1&(n|0)==1){b=c[G>>2]|0;n=c[F>>2]|0}else{if((b|0)>1&(n|0)==0){b=(e|0)/2|0;c[I>>2]=0;c[H>>2]=0;if((he(u,v,0,b,m,F,H)|0)<0)break c;if((he(u,v,b,e,m,G,I)|0)<0)break c;if(!((c[H>>2]|0)==1&(c[I>>2]|0)==1))break c;b=e;n=c[F>>2]|0;e=c[G>>2]|0;break}if(!((b|0)==0&(n|0)>1))break c;b=(e+-1+(c[y>>2]|0)|0)/2|0;c[I>>2]=0;c[H>>2]=0;if((he(u,v,e,b,m,F,H)|0)<0)break c;if((he(u,v,b,(c[y>>2]|0)+-1|0,m,G,I)|0)<0)break c;if(!((c[H>>2]|0)==1&(c[I>>2]|0)==1))break c;b=c[G>>2]|0;n=e;e=c[F>>2]|0}while(0);c[k+(x*80048|0)+80028>>2]=0;c[k+(x*80048|0)+80032>>2]=n;c[k+(x*80048|0)+80036>>2]=e;c[k+(x*80048|0)+80040>>2]=b;c[k+(x*80048|0)+80044>>2]=(c[y>>2]|0)+-1;c[k+((c[l>>2]|0)*80048|0)>>2]=c[w>>2];y=c[l>>2]|0;h[k+(y*80048|0)+8>>3]=+h[d+655376+(B<<4)>>3];h[k+(y*80048|0)+16>>3]=+h[d+655376+(B<<4)+8>>3];y=y+1|0;c[l>>2]=y;if((y|0)==60){e=60;break a}else break b}while(0)}while(0);B=B+1|0;if((B|0)>=(c[C>>2]|0)){J=4;break}}}else J=4;while(0);if((J|0)==4)e=c[l>>2]|0;if((e|0)>0){o=0;do{a=o;o=o+1|0;g=k+(a*80048|0)+16|0;n=k+(a*80048|0)|0;if((o|0)<(e|0)){j=+h[k+(a*80048|0)+8>>3];f=o;do{M=j-+h[k+(f*80048|0)+8>>3];m=+h[g>>3]-+h[k+(f*80048|0)+16>>3];m=M*M+m*m;e=c[n>>2]|0;a=k+(f*80048|0)|0;b=c[a>>2]|0;if((e|0)>(b|0)){if(m<+((e|0)/4|0|0))c[a>>2]=0}else if(m<+((b|0)/4|0|0))c[n>>2]=0;f=f+1|0;e=c[l>>2]|0}while((f|0)<(e|0))}}while((o|0)<(e|0))}if((e|0)>0){f=0;do{if(!(c[k+(f*80048|0)>>2]|0)){a=f+1|0;if((a|0)<(e|0)){e=f;b=a;while(1){ik(k+(e*80048|0)|0,k+(b*80048|0)|0,80048)|0;e=c[l>>2]|0;a=b+1|0;if((a|0)<(e|0)){e=b;b=a}else break}}e=e+-1|0;c[l>>2]=e}f=f+1|0}while((f|0)<(e|0))}if(K&(e|0)>0){b=0;while(1){c[k>>2]=c[k>>2]<<2;e=k+8|0;h[e>>3]=+h[e>>3]*2.0;e=k+16|0;h[e>>3]=+h[e>>3]*2.0;e=k+24|0;if((c[e>>2]|0)>0){a=0;do{K=k+28+(a<<2)|0;c[K>>2]=c[K>>2]<<1;K=k+40028+(a<<2)|0;c[K>>2]=c[K>>2]<<1;a=a+1|0}while((a|0)<(c[e>>2]|0))}b=b+1|0;if((b|0)>=(c[l>>2]|0))break;else k=k+80048|0}}i=L;return 0}function ge(a,d,e,f,g,h,j){a=a|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;w=i;i=i+80032|0;p=w+16|0;o=w+8|0;l=w;u=w+40024|0;v=w+24|0;t=c[h+8>>2]|0;e=c[h>>2]|0;h=c[h+4>>2]|0;a:do if((e|0)<=(h|0)){k=e;e=a+(($(t,d)|0)+e<<1)|0;while(1){s=b[e>>1]|0;if(s<<16>>16>0?(c[f+((s<<16>>16)+-1<<2)>>2]|0)==(g|0):0){n=k;break}if((k|0)<(h|0)){k=k+1|0;e=e+2|0}else{x=6;break a}}q=j+24|0;c[q>>2]=1;r=j+28|0;c[r>>2]=n;s=j+40028|0;c[s>>2]=t;f=t;m=n;k=1;e=5;while(1){h=(e+5|0)%8|0;e=0;while(1){g=c[776+(h<<2)>>2]|0;l=c[808+(h<<2)>>2]|0;if((b[a+(l+m+($(g+f|0,d)|0)<<1)>>1]|0)>0){e=g;g=h;break}e=e+1|0;h=(h+1|0)%8|0;if((e|0)>=8){x=11;break}}if((x|0)==11){x=0;if((e|0)==8){x=13;break}l=c[808+(h<<2)>>2]|0;e=c[776+(h<<2)>>2]|0;g=h}c[j+28+(k<<2)>>2]=l+m;h=c[q>>2]|0;c[j+40028+(h<<2)>>2]=e+(c[j+40028+(h+-1<<2)>>2]|0);e=c[q>>2]|0;h=j+28+(e<<2)|0;if((c[h>>2]|0)==(n|0)?(c[j+40028+(e<<2)>>2]|0)==(t|0):0){f=e;x=16;break}k=e+1|0;c[q>>2]=k;if((k|0)==9999){x=19;break}f=c[j+40028+(e<<2)>>2]|0;m=c[h>>2]|0;e=g}if((x|0)==13){Me(3,4347,o);e=-1;break}else if((x|0)==16){if((f|0)>1){l=0;g=1;h=0;while(1){e=(c[j+28+(g<<2)>>2]|0)-n|0;e=$(e,e)|0;k=(c[j+40028+(g<<2)>>2]|0)-t|0;e=($(k,k)|0)+e|0;k=(e|0)>(l|0);h=k?g:h;g=g+1|0;if((g|0)>=(f|0))break;else l=k?e:l}}else h=0;if((h|0)>0){e=0;do{c[u+(e<<2)>>2]=c[j+28+(e<<2)>>2];c[v+(e<<2)>>2]=c[j+40028+(e<<2)>>2];e=e+1|0}while((e|0)<(h|0))}if((h|0)<(f|0)){e=h;do{t=e-h|0;c[j+28+(t<<2)>>2]=c[j+28+(e<<2)>>2];c[j+40028+(t<<2)>>2]=c[j+40028+(e<<2)>>2];e=e+1|0}while((e|0)<(c[q>>2]|0))}if((h|0)>0){e=0;do{t=e-h|0;c[j+28+((c[q>>2]|0)+t<<2)>>2]=c[u+(e<<2)>>2];c[j+40028+((c[q>>2]|0)+t<<2)>>2]=c[v+(e<<2)>>2];e=e+1|0}while((e|0)<(h|0))}c[j+28+(c[q>>2]<<2)>>2]=c[r>>2];c[j+40028+(c[q>>2]<<2)>>2]=c[s>>2];c[q>>2]=(c[q>>2]|0)+1;e=0;break}else if((x|0)==19){Me(3,4354,p);e=-1;break}}else x=6;while(0);if((x|0)==6){Me(3,4340,l);e=-1}i=w;return e|0}function he(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=+f;g=g|0;h=h|0;var i=0,j=0.0,k=0.0,l=0,m=0.0,n=0,o=0.0,p=0,q=0,r=0,s=0.0;i=c[b+(e<<2)>>2]|0;q=c[b+(d<<2)>>2]|0;o=+(i-q|0);l=c[a+(d<<2)>>2]|0;r=c[a+(e<<2)>>2]|0;m=+(l-r|0);k=+(($(r,q)|0)-($(l,i)|0)|0);i=d+1|0;if((i|0)<(e|0)){j=0.0;l=i;do{s=k+(o*+(c[a+(l<<2)>>2]|0)+m*+(c[b+(l<<2)>>2]|0));s=s*s;r=s>j;j=r?s:j;i=r?l:i;l=l+1|0}while((l|0)<(e|0))}else j=0.0;if(j/(o*o+m*m)>f)if(((he(a,b,d,i,f,g,h)|0)>=0?(n=c[h>>2]|0,(n|0)<=5):0)?(c[g+(n<<2)>>2]=i,c[h>>2]=(c[h>>2]|0)+1,(he(a,b,i,e,f,g,h)|0)>=0):0)p=7;else i=-1;else p=7;if((p|0)==7)i=0;return i|0}function ie(a,b,d,e,f,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;j=j|0;k=k|0;var l=0,m=0.0,n=0,o=0.0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;y=i;i=i+16|0;t=y+4|0;u=y;v=nf(2)|0;w=nf(2)|0;x=Re(2,2)|0;q=0;a:while(1){r=q;q=q+1|0;s=c[e+(q<<2)>>2]|0;l=c[e+(r<<2)>>2]|0;p=+(s+1-l|0)*.05+.5;l=~~(+(l|0)+p);s=~~(+(s|0)-p)-l|0;n=s+1|0;d=Re(n,2)|0;if((s|0)>-1){s=0;do{z=s+l|0;if((mf(f,+(c[a+(z<<2)>>2]|0),+(c[b+(z<<2)>>2]|0),t,u)|0)<0){l=10;break a}z=s<<1;A=c[d>>2]|0;h[A+(z<<3)>>3]=+g[t>>2];h[A+((z|1)<<3)>>3]=+g[u>>2];s=s+1|0}while((s|0)<(n|0))}if((Ye(d,x,v,w)|0)<0){l=10;break}A=c[x>>2]|0;o=+h[A+8>>3];h[j+(r*24|0)>>3]=o;p=-+h[A>>3];h[j+(r*24|0)+8>>3]=p;A=c[w>>2]|0;h[j+(r*24|0)+16>>3]=-(o*+h[A>>3]+ +h[A+8>>3]*p);We(d)|0;if((q|0)>=4){l=7;break}}b:do if((l|0)==7){We(x)|0;of(w)|0;of(v)|0;q=0;while(1){d=(q+3|0)%4|0;l=j+(d*24|0)|0;m=+h[j+(q*24|0)+8>>3];n=j+(q*24|0)|0;o=+h[j+(d*24|0)+8>>3];p=+h[l>>3]*m-+h[n>>3]*o;if(+O(+p)<.0001){d=-1;break b}A=j+(q*24|0)+16|0;z=j+(d*24|0)+16|0;h[k+(q<<4)>>3]=(o*+h[A>>3]-m*+h[z>>3])/p;h[k+(q<<4)+8>>3]=(+h[n>>3]*+h[z>>3]-+h[l>>3]*+h[A>>3])/p;q=q+1|0;if((q|0)>=4){d=0;break}}}else if((l|0)==10){We(d)|0;We(x)|0;of(w)|0;of(v)|0;d=-1}while(0);i=y;return d|0}function je(a,b,d,e,f,j,k,l,m,n,o,p,q,r){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=+o;p=p|0;q=q|0;r=r|0;var s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;F=i;i=i+16|0;D=F+4|0;E=F;z=m>>>0<2;A=(m|0)==2;if((j|0)>0){C=0;s=0;do{c[p+(s<<8)>>2]=c[f+(C*80048|0)>>2];if((mf(n,+h[f+(C*80048|0)+8>>3],+h[f+(C*80048|0)+16>>3],D,E)|0)>=0?(h[p+(s<<8)+56>>3]=+g[D>>2],h[p+(s<<8)+64>>3]=+g[E>>2],B=p+(s<<8)+168|0,(ie(f+(C*80048|0)+28|0,f+(C*80048|0)+40028|0,c[f+(C*80048|0)+24>>2]|0,f+(C*80048|0)+80028|0,n,p+(s<<8)+72|0,B)|0)>=0):0){t=p+(s<<8)+8|0;u=p+(s<<8)+20|0;v=p+(s<<8)+40|0;w=p+(s<<8)+12|0;x=p+(s<<8)+24|0;y=p+(s<<8)+48|0;switch(De(k,l,m,a,b,d,e,n,B,o,t,u,v,w,x,y,r,p+(s<<8)+240|0,p+(s<<8)+248|0)|0){case 0:{c[p+(s<<8)+236>>2]=0;break}case -1:{c[p+(s<<8)+236>>2]=2;break}case -2:{c[p+(s<<8)+236>>2]=3;break}case -3:{c[p+(s<<8)+236>>2]=4;break}case -4:{c[p+(s<<8)+236>>2]=5;break}case -5:{c[p+(s<<8)+236>>2]=9;break}case -6:{c[p+(s<<8)+236>>2]=1;break}default:{}}if(!z){if(A){c[p+(s<<8)+4>>2]=c[w>>2];c[p+(s<<8)+16>>2]=c[x>>2];h[p+(s<<8)+32>>3]=+h[y>>3]}}else{c[p+(s<<8)+4>>2]=c[t>>2];c[p+(s<<8)+16>>2]=c[u>>2];h[p+(s<<8)+32>>3]=+h[v>>3]}s=s+1|0}C=C+1|0}while((C|0)<(j|0))}else s=0;c[q>>2]=s;i=F;return 0}function ke(a,b,d,e){a=a|0;b=b|0;d=+d;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0.0,o=0,p=0;k=i;i=i+288|0;m=k+200|0;l=k+104|0;f=k+264|0;j=k+8|0;g=k;o=c[b+16>>2]|0;p=(4-o|0)%4|0;h[m>>3]=+h[b+168+(p<<4)>>3];h[m+8>>3]=+h[b+168+(p<<4)+8>>3];p=(5-o|0)%4|0;h[m+16>>3]=+h[b+168+(p<<4)>>3];h[m+24>>3]=+h[b+168+(p<<4)+8>>3];p=(6-o|0)%4|0;h[m+32>>3]=+h[b+168+(p<<4)>>3];h[m+40>>3]=+h[b+168+(p<<4)+8>>3];o=(7-o|0)%4|0;h[m+48>>3]=+h[b+168+(o<<4)>>3];h[m+56>>3]=+h[b+168+(o<<4)+8>>3];n=d*-.5;h[l>>3]=n;d=d*.5;h[l+8>>3]=d;h[l+16>>3]=0.0;h[l+24>>3]=d;h[l+32>>3]=d;h[l+40>>3]=0.0;h[l+48>>3]=d;h[l+56>>3]=n;h[l+64>>3]=0.0;h[l+72>>3]=n;h[l+80>>3]=n;h[l+88>>3]=0.0;c[f>>2]=m;c[f+4>>2]=l;c[f+8>>2]=4;if((Ef(c[a>>2]|0,m,l,4,j)|0)<0)d=1.0e8;else{p=(zf(c[a>>2]|0,f,j,e,g)|0)<0;d=p?1.0e8:+h[g>>3]}i=k;return +d}function le(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=+e;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0.0,o=0,p=0;j=i;i=i+192|0;m=j+104|0;l=j+8|0;k=j+168|0;g=j;o=c[b+16>>2]|0;p=(4-o|0)%4|0;h[m>>3]=+h[b+168+(p<<4)>>3];h[m+8>>3]=+h[b+168+(p<<4)+8>>3];p=(5-o|0)%4|0;h[m+16>>3]=+h[b+168+(p<<4)>>3];h[m+24>>3]=+h[b+168+(p<<4)+8>>3];p=(6-o|0)%4|0;h[m+32>>3]=+h[b+168+(p<<4)>>3];h[m+40>>3]=+h[b+168+(p<<4)+8>>3];o=(7-o|0)%4|0;h[m+48>>3]=+h[b+168+(o<<4)>>3];h[m+56>>3]=+h[b+168+(o<<4)+8>>3];n=e*-.5;h[l>>3]=n;e=e*.5;h[l+8>>3]=e;h[l+16>>3]=0.0;h[l+24>>3]=e;h[l+32>>3]=e;h[l+40>>3]=0.0;h[l+48>>3]=e;h[l+56>>3]=n;h[l+64>>3]=0.0;h[l+72>>3]=n;h[l+80>>3]=n;h[l+88>>3]=0.0;c[k>>2]=m;c[k+4>>2]=l;c[k+8>>2]=4;b=(zf(c[a>>2]|0,k,d,f,g)|0)<0;i=j;return +(b?1.0e8:+h[g>>3])}function me(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0;p=i;i=i+32|0;m=p+20|0;n=p;j=Uj(f<<4)|0;c[m>>2]=j;if(!j){Me(3,5472,p+8|0);rb(1)}k=Uj(f*24|0)|0;l=m+4|0;c[l>>2]=k;if(!k){Me(3,5472,p+16|0);rb(1)}if((f|0)>0){o=0;do{h[j+(o<<4)>>3]=+h[d+(o<<4)>>3];h[j+(o<<4)+8>>3]=+h[d+(o<<4)+8>>3];h[k+(o*24|0)>>3]=+h[e+(o*24|0)>>3];h[k+(o*24|0)+8>>3]=+h[e+(o*24|0)+8>>3];h[k+(o*24|0)+16>>3]=+h[e+(o*24|0)+16>>3];o=o+1|0}while((o|0)<(f|0))}c[m+8>>2]=f;if((zf(c[a>>2]|0,m,b,g,n)|0)<0)h[n>>3]=1.0e8;Vj(c[m>>2]|0);Vj(c[l>>2]|0);i=p;return +(+h[n>>3])}function ne(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0;p=i;i=i+32|0;m=p+20|0;n=p;j=Uj(f<<4)|0;c[m>>2]=j;if(!j){Me(3,5472,p+8|0);rb(1)}k=Uj(f*24|0)|0;l=m+4|0;c[l>>2]=k;if(!k){Me(3,5472,p+16|0);rb(1)}if((f|0)>0){o=0;do{h[j+(o<<4)>>3]=+h[d+(o<<4)>>3];h[j+(o<<4)+8>>3]=+h[d+(o<<4)+8>>3];h[k+(o*24|0)>>3]=+h[e+(o*24|0)>>3];h[k+(o*24|0)+8>>3]=+h[e+(o*24|0)+8>>3];h[k+(o*24|0)+16>>3]=+h[e+(o*24|0)+16>>3];o=o+1|0}while((o|0)<(f|0))}c[m+8>>2]=f;if((Bf(c[a>>2]|0,m,b,g,n)|0)<0)h[n>>3]=1.0e8;Vj(c[m>>2]|0);Vj(c[l>>2]|0);i=p;return +(+h[n>>3])}function oe(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=Uj(2080)|0;a:do if(f){c[f+2068>>2]=d;b:do if(!e){switch(d|0){case 5:case 12:case 13:case 14:break;default:{g=4;break b}}c[f+2076>>2]=0}else g=4;while(0);do if((g|0)==4){g=Uj($(b,a)|0)|0;c[f>>2]=g;if(!g){Vj(f);f=0;break a}else{c[f+2076>>2]=1;break}}while(0);c[f+2072>>2]=e;c[f+4>>2]=0;c[f+8>>2]=a;c[f+12>>2]=b}while(0);return f|0}function pe(a){a=a|0;if(a){if(c[a+2076>>2]|0)Vj(c[a>>2]|0);Vj(c[a+4>>2]|0);Vj(a)}return}function qe(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0;k=i;i=i+16|0;g=k;f=c[b+2068>>2]|0;a:do switch(f|0){case 5:case 12:case 13:case 14:if(!(c[b+2072>>2]|0)){c[b>>2]=e;f=0;break a}else{ik(c[b>>2]|0,e|0,$(c[b+12>>2]|0,c[b+8>>2]|0)|0)|0;f=0;break a}default:{if((f&-2|0)==2){f=b+8|0;g=b+12|0;if(!($(c[g>>2]|0,c[f>>2]|0)|0)){f=0;break a}else{h=0;j=0}while(1){a[(c[b>>2]|0)+h>>0]=(((d[e+(j|1)>>0]|0)+(d[e+j>>0]|0)+(d[e+(j|2)>>0]|0)|0)>>>0)/3|0;h=h+1|0;if(h>>>0>=($(c[g>>2]|0,c[f>>2]|0)|0)>>>0){f=0;break a}else j=j+4|0}}if((f&-3|0)==4){f=b+8|0;g=b+12|0;if(!($(c[g>>2]|0,c[f>>2]|0)|0)){f=0;break a}else{h=0;j=0}while(1){a[(c[b>>2]|0)+h>>0]=(((d[e+(j|2)>>0]|0)+(d[e+(j|1)>>0]|0)+(d[e+(j|3)>>0]|0)|0)>>>0)/3|0;h=h+1|0;if(h>>>0>=($(c[g>>2]|0,c[f>>2]|0)|0)>>>0){f=0;break a}else j=j+4|0}}if(f>>>0<2){f=b+8|0;g=b+12|0;if(!($(c[g>>2]|0,c[f>>2]|0)|0)){f=0;break a}else{h=0;j=0}while(1){a[(c[b>>2]|0)+h>>0]=(((d[e+(j+1)>>0]|0)+(d[e+j>>0]|0)+(d[e+(j+2)>>0]|0)|0)>>>0)/3|0;h=h+1|0;if(h>>>0>=($(c[g>>2]|0,c[f>>2]|0)|0)>>>0){f=0;break a}else j=j+3|0}}switch(f|0){case 8:{f=b+8|0;g=b+12|0;if(!($(c[g>>2]|0,c[f>>2]|0)|0)){f=0;break a}else{h=0;j=0}while(1){a[(c[b>>2]|0)+h>>0]=a[e+j>>0]|0;h=h+1|0;if(h>>>0>=($(c[g>>2]|0,c[f>>2]|0)|0)>>>0){f=0;break}else j=j+2|0}break}case 7:{f=b+8|0;g=b+12|0;if(!($(c[g>>2]|0,c[f>>2]|0)|0)){f=0;break a}else{h=0;j=0}while(1){a[(c[b>>2]|0)+h>>0]=a[e+(j|1)>>0]|0;h=h+1|0;if(h>>>0>=($(c[g>>2]|0,c[f>>2]|0)|0)>>>0){f=0;break}else j=j+2|0}break}case 9:{f=b+8|0;g=b+12|0;if(!($(c[g>>2]|0,c[f>>2]|0)|0)){f=0;break a}else{h=0;j=0}while(1){m=d[e+j>>0]|0;l=d[e+(j|1)>>0]|0;a[(c[b>>2]|0)+h>>0]=(((m&248)+10+(m<<5&224)+(l>>>3&28)+(l<<3&248)|0)>>>0)/3|0;h=h+1|0;if(h>>>0>=($(c[g>>2]|0,c[f>>2]|0)|0)>>>0){f=0;break}else j=j+2|0}break}case 10:{f=b+8|0;g=b+12|0;if(!($(c[g>>2]|0,c[f>>2]|0)|0)){f=0;break a}else{h=0;j=0}while(1){l=d[e+j>>0]|0;m=d[e+(j|1)>>0]|0;a[(c[b>>2]|0)+h>>0]=(((l&248)+12+(l<<5&224)+(m>>>3&24)+(m<<2&248)|0)>>>0)/3|0;h=h+1|0;if(h>>>0>=($(c[g>>2]|0,c[f>>2]|0)|0)>>>0){f=0;break}else j=j+2|0}break}case 11:{f=b+8|0;g=b+12|0;if(!($(c[g>>2]|0,c[f>>2]|0)|0)){f=0;break a}else{h=0;j=0}while(1){m=d[e+j>>0]|0;a[(c[b>>2]|0)+h>>0]=(((m&240)+24+(m<<4&240)+((d[e+(j|1)>>0]|0)&240)|0)>>>0)/3|0;h=h+1|0;if(h>>>0>=($(c[g>>2]|0,c[f>>2]|0)|0)>>>0){f=0;break}else j=j+2|0}break}default:{Me(3,4361,g);f=-1;break a}}}}while(0);i=k;return f|0}function re(a,b){a=a|0;b=b|0;var e=0,f=0;if((a|0)!=0&(b|0)!=0?(qe(a,b)|0)>=0:0){ek(a+16|0,0,1024)|0;b=c[a>>2]|0;f=$(c[a+12>>2]|0,c[a+8>>2]|0)|0;e=b+f|0;if((f|0)>0){do{f=a+16+((d[b>>0]|0)<<2)|0;c[f>>2]=(c[f>>2]|0)+1;b=b+1|0}while(b>>>0<e>>>0);b=0}else b=0}else b=-1;return b|0}function se(a,b){a=a|0;b=b|0;var d=0;b=re(a,b)|0;if((b|0)>=0){b=0;d=0;do{b=(c[a+16+(d<<2)>>2]|0)+b|0;c[a+1040+(d<<2)>>2]=b;d=d+1|0}while((d|0)!=256);b=0}return b|0}function te(b,d,e,f){b=b|0;d=d|0;e=+e;f=f|0;var g=0,h=0,i=0;if(!(e<0.0|e>1.0)){d=se(b,d)|0;if((d|0)>=0){i=~~(+($(c[b+12>>2]|0,c[b+8>>2]|0)|0)*e)>>>0;d=0;while(1){h=d&255;g=c[b+1040+(h<<2)>>2]|0;if(g>>>0<i>>>0)d=d+1<<24>>24;else break}if((g|0)==(i|0))do d=d+1<<24>>24;while((c[b+1040+((d&255)<<2)>>2]|0)==(i|0));a[f>>0]=((d&255)+h|0)>>>1;d=0}}else d=-1;return d|0}function ue(a,b,c){a=a|0;b=b|0;c=c|0;return te(a,b,.5,c)|0}function ve(b,d,e){b=b|0;d=d|0;e=e|0;var f=0.0,g=0,h=0.0,i=0.0,j=0.0,k=0.0,l=0,m=0.0,n=0.0;d=re(b,d)|0;if((d|0)>=0){d=1;f=0.0;do{f=f+ +(($(c[b+16+(d<<2)>>2]|0,d)|0)>>>0);d=d+1|0}while((d|0)!=256);k=+($(c[b+12>>2]|0,c[b+8>>2]|0)|0);l=0;h=0.0;d=0;j=0.0;m=0.0;while(1){g=c[b+16+(l<<2)>>2]|0;m=m+ +(g>>>0);if(m!=0.0){i=k-m;if(i==0.0)break;h=h+ +(($(l,g)|0)>>>0);n=h/m-(f-h)/i;i=n*(m*i*n);if(i>j)d=l&255;else i=j}else i=j;if((l&255)<<24>>24==-1)break;else{l=l+1|0;j=i}}a[e>>0]=d;d=0}return d|0}function we(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;e=re(b,e)|0;do if((e|0)>=0){t=b+4|0;if(!(c[t>>2]|0)){e=b+8|0;h=b+12|0;s=Uj($(c[h>>2]|0,c[e>>2]|0)|0)|0;c[t>>2]=s;if(!s){e=-1;break}else s=e}else{s=b+8|0;h=b+12|0}q=f>>1;r=0-q|0;e=c[h>>2]|0;if((e|0)>0){n=(q|0)<(r|0);o=(q|0)<(r|0);p=0;do{e=c[s>>2]|0;if((e|0)>0){m=0;do{if(n){i=0;f=0}else{i=0;l=r;f=0;while(1){j=l+p|0;if(((j|0)>=0?(j|0)<(c[h>>2]|0):0)?(u=$(e,j)|0,!o):0){k=r;while(1){j=k+m|0;if((j|0)>-1&(j|0)<(e|0)){i=i+1|0;f=(d[(c[b>>2]|0)+(u+j)>>0]|0)+f|0}if((k|0)<(q|0))k=k+1|0;else break}}if((l|0)<(q|0))l=l+1|0;else break}}l=($(e,p)|0)+m|0;a[(c[t>>2]|0)+l>>0]=(f|0)/(i|0)|0;m=m+1|0;e=c[s>>2]|0}while((m|0)<(e|0))}p=p+1|0;e=c[h>>2]|0}while((p|0)<(e|0))}if((g|0)!=0?($(e,c[s>>2]|0)|0)>0:0){e=0;do{b=(c[t>>2]|0)+e|0;a[b>>0]=(d[b>>0]|0)+g;e=e+1|0}while((e|0)<($(c[h>>2]|0,c[s>>2]|0)|0));e=0}else e=0}while(0);return e|0}function xe(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0;a:do switch(e|0){case 0:{switch(f|0){case 1:{if(j){k=Fc(a,b,c,j,i)|0;break a}switch(h|0){case 0:{if(d>>>0<2){k=wc(a,b,c,g,i)|0;break a}if((d&-2|0)==2){k=yc(a,b,c,g,i)|0;break a}if((d&-3|0)==4){k=Bc(a,b,c,g,i)|0;break a}switch(d|0){case 5:case 12:case 13:case 14:{k=Cc(a,b,c,g,i)|0;break a}case 8:{k=Ec(a,b,c,g,i)|0;break a}case 7:{k=Dc(a,b,c,g,i)|0;break a}case 9:{k=xc(a,b,c,g,i)|0;break a}case 10:{k=Ac(a,b,c,g,i)|0;break a}case 11:{k=zc(a,b,c,g,i)|0;break a}default:rb(0)}break}case 1:{if(d>>>0<2){k=nc(a,b,c,g,i)|0;break a}if((d&-2|0)==2){k=pc(a,b,c,g,i)|0;break a}if((d&-3|0)==4){k=sc(a,b,c,g,i)|0;break a}switch(d|0){case 5:case 12:case 13:case 14:{k=tc(a,b,c,g,i)|0;break a}case 8:{k=vc(a,b,c,g,i)|0;break a}case 7:{k=uc(a,b,c,g,i)|0;break a}case 9:{k=oc(a,b,c,g,i)|0;break a}case 10:{k=rc(a,b,c,g,i)|0;break a}case 11:{k=qc(a,b,c,g,i)|0;break a}default:rb(0)}break}default:rb(0)}break}case 0:{if(j){k=Yc(a,b,c,j,i)|0;break a}switch(h|0){case 0:{if(d>>>0<2){k=Pc(a,b,c,g,i)|0;break a}if((d&-2|0)==2){k=Rc(a,b,c,g,i)|0;break a}if((d&-3|0)==4){k=Uc(a,b,c,g,i)|0;break a}switch(d|0){case 5:case 12:case 13:case 14:{k=Vc(a,b,c,g,i)|0;break a}case 8:{k=Xc(a,b,c,g,i)|0;break a}case 7:{k=Wc(a,b,c,g,i)|0;break a}case 9:{k=Qc(a,b,c,g,i)|0;break a}case 10:{k=Tc(a,b,c,g,i)|0;break a}case 11:{k=Sc(a,b,c,g,i)|0;break a}default:rb(0)}break}case 1:{if(d>>>0<2){k=Gc(a,b,c,g,i)|0;break a}if((d&-2|0)==2){k=Ic(a,b,c,g,i)|0;break a}if((d&-3|0)==4){k=Lc(a,b,c,g,i)|0;break a}switch(d|0){case 5:case 12:case 13:case 14:{k=Mc(a,b,c,g,i)|0;break a}case 8:{k=Oc(a,b,c,g,i)|0;break a}case 7:{k=Nc(a,b,c,g,i)|0;break a}case 9:{k=Hc(a,b,c,g,i)|0;break a}case 10:{k=Kc(a,b,c,g,i)|0;break a}case 11:{k=Jc(a,b,c,g,i)|0;break a}default:rb(0)}break}default:rb(0)}break}default:rb(0)}break}case 1:{switch(f|0){case 1:{if(j){k=pd(a,b,c,j,i)|0;break a}switch(h|0){case 0:{if(d>>>0<2){k=gd(a,b,c,g,i)|0;break a}if((d&-2|0)==2){k=id(a,b,c,g,i)|0;break a}if((d&-3|0)==4){k=ld(a,b,c,g,i)|0;break a}switch(d|0){case 5:case 12:case 13:case 14:{k=md(a,b,c,g,i)|0;break a}case 8:{k=od(a,b,c,g,i)|0;break a}case 7:{k=nd(a,b,c,g,i)|0;break a}case 9:{k=hd(a,b,c,g,i)|0;break a}case 10:{k=kd(a,b,c,g,i)|0;break a}case 11:{k=jd(a,b,c,g,i)|0;break a}default:rb(0)}break}case 1:{if(d>>>0<2){k=Zc(a,b,c,g,i)|0;break a}if((d&-2|0)==2){k=$c(a,b,c,g,i)|0;break a}if((d&-3|0)==4){k=cd(a,b,c,g,i)|0;break a}switch(d|0){case 5:case 12:case 13:case 14:{k=dd(a,b,c,g,i)|0;break a}case 8:{k=fd(a,b,c,g,i)|0;break a}case 7:{k=ed(a,b,c,g,i)|0;break a}case 9:{k=_c(a,b,c,g,i)|0;break a}case 10:{k=bd(a,b,c,g,i)|0;break a}case 11:{k=ad(a,b,c,g,i)|0;break a}default:rb(0)}break}default:rb(0)}break}case 0:{if(j){k=Id(a,b,c,j,i)|0;break a}switch(h|0){case 0:{if(d>>>0<2){k=zd(a,b,c,g,i)|0;break a}if((d&-2|0)==2){k=Bd(a,b,c,g,i)|0;break a}if((d&-3|0)==4){k=Ed(a,b,c,g,i)|0;break a}switch(d|0){case 5:case 12:case 13:case 14:{k=Fd(a,b,c,g,i)|0;break a}case 8:{k=Hd(a,b,c,g,i)|0;break a}case 7:{k=Gd(a,b,c,g,i)|0;break a}case 9:{k=Ad(a,b,c,g,i)|0;break a}case 10:{k=Dd(a,b,c,g,i)|0;break a}case 11:{k=Cd(a,b,c,g,i)|0;break a}default:rb(0)}break}case 1:{if(d>>>0<2){k=qd(a,b,c,g,i)|0;break a}if((d&-2|0)==2){k=sd(a,b,c,g,i)|0;break a}if((d&-3|0)==4){k=vd(a,b,c,g,i)|0;break a}switch(d|0){case 5:case 12:case 13:case 14:{k=wd(a,b,c,g,i)|0;break a}case 8:{k=yd(a,b,c,g,i)|0;break a}case 7:{k=xd(a,b,c,g,i)|0;break a}case 9:{k=rd(a,b,c,g,i)|0;break a}case 10:{k=ud(a,b,c,g,i)|0;break a}case 11:{k=td(a,b,c,g,i)|0;break a}default:rb(0)}break}default:rb(0)}break}default:rb(0)}break}default:rb(0)}while(0);return k|0}function ye(a,b){a=a|0;b=b|0;var d=0;if((a|0)!=0?(d=a+7062384|0,(c[d>>2]|0)==0):0){c[d>>2]=b;d=0}else d=-1;return d|0}function ze(a){a=a|0;var b=0;if((a|0)!=0?(b=a+7062384|0,(c[b>>2]|0)!=0):0){c[b>>2]=0;b=0}else b=-1;return b|0}function Ae(){return Be(16,50)|0}function Be(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;r=i;i=i+64|0;q=r+56|0;p=r+48|0;j=r+40|0;h=r+32|0;g=r+24|0;f=r+16|0;e=r+8|0;d=r;a:do if(!((a+-16|0)>>>0>48|(b|0)<1)){n=Uj(32)|0;if(!n){Me(3,5472,d);rb(1)}c[n>>2]=0;c[n+4>>2]=b;c[n+28>>2]=a;m=Uj(b<<2)|0;c[n+8>>2]=m;if(!m){Me(3,5472,e);rb(1)}d=b<<4;l=Uj(d)|0;c[n+12>>2]=l;if(!l){Me(3,5472,f);rb(1)}f=Uj(d)|0;k=n+20|0;c[k>>2]=f;if(!f){Me(3,5472,g);rb(1)}d=b<<5;g=Uj(d)|0;c[n+16>>2]=g;if(!g){Me(3,5472,h);rb(1)}h=Uj(d)|0;c[n+24>>2]=h;if(!h){Me(3,5472,j);rb(1)}e=$(a,a)|0;d=e*12|0;e=e<<2;if((b|0)>0){a=0;b:while(1){c[m+(a<<2)>>2]=0;f=a<<2;h=0;while(1){if((h|0)>=4)break;j=Uj(d)|0;g=h+f|0;c[l+(g<<2)>>2]=j;if(!j){d=18;break b}j=Uj(e)|0;c[(c[k>>2]|0)+(g<<2)>>2]=j;if(!j){d=20;break b}else h=h+1|0}a=a+1|0;if((a|0)>=(b|0)){o=n;break a}}if((d|0)==18){Me(3,5472,p);rb(1)}else if((d|0)==20){Me(3,5472,q);rb(1)}}else o=n}else o=0;while(0);i=r;return o|0}function Ce(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0;if(!a)b=-1;else{b=a+4|0;d=a+8|0;e=a+12|0;f=a+20|0;if((c[b>>2]|0)>0){g=0;do{if(c[(c[d>>2]|0)+(g<<2)>>2]|0)Le(a,g)|0;h=g<<2;Vj(c[(c[e>>2]|0)+(h<<2)>>2]|0);Vj(c[(c[f>>2]|0)+(h<<2)>>2]|0);i=1+h|0;Vj(c[(c[e>>2]|0)+(i<<2)>>2]|0);Vj(c[(c[f>>2]|0)+(i<<2)>>2]|0);i=2+h|0;Vj(c[(c[e>>2]|0)+(i<<2)>>2]|0);Vj(c[(c[f>>2]|0)+(i<<2)>>2]|0);h=3+h|0;Vj(c[(c[e>>2]|0)+(h<<2)>>2]|0);Vj(c[(c[f>>2]|0)+(h<<2)>>2]|0);g=g+1|0}while((g|0)<(c[b>>2]|0))}Vj(a);b=0}return b|0}function De(b,e,f,g,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x){b=b|0;e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=+o;p=p|0;q=q|0;r=r|0;s=s|0;t=t|0;u=u|0;v=v|0;w=w|0;x=x|0;var y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;L=i;i=i+12448|0;A=L+12440|0;z=L+8|0;J=L;I=L+12312|0;K=L+24|0;do if((f+-2|0)>>>0<3){if((v|0)!=2830){y=v&255;if((Ee(e,2,y,y*3|0,g,j,k,l,m,n,o,K)|0)<0){c[s>>2]=-1;y=-6;break}y=Fe(K,y,s,t,u,v,w)|0;if(!x)break;c[x>>2]=0;c[x+4>>2]=0;break}if((Ee(e,2,14,42,g,j,k,l,m,n,.875,K)|0)<0){c[s>>2]=-1;y=-6;break}c[z>>2]=0;c[z+4>>2]=182;c[z+8>>2]=195;c[z+12>>2]=13;v=a[K+(c[z>>2]|0)>>0]|0;y=(v&255)>0?v:0;v=(v&255)<255?v:-1;H=a[K+(c[z+4>>2]|0)>>0]|0;y=(H&255)>(y&255)?H:y;v=(H&255)<(v&255)?H:v;H=a[K+(c[z+8>>2]|0)>>0]|0;y=(H&255)>(y&255)?H:y;v=(H&255)<(v&255)?H:v;H=a[K+(c[z+12>>2]|0)>>0]|0;y=((H&255)>(y&255)?H:y)&255;v=((H&255)<(v&255)?H:v)&255;a:do if((y-v|0)>=30){H=(y+v|0)>>>1;a[A>>0]=(d[K+(c[z>>2]|0)>>0]|0)>>>0<H>>>0&1;a[A+1>>0]=(d[K+(c[z+4>>2]|0)>>0]|0)>>>0<H>>>0&1;a[A+2>>0]=(d[K+(c[z+8>>2]|0)>>0]|0)>>>0<H>>>0&1;a[A+3>>0]=(d[K+(c[z+12>>2]|0)>>0]|0)>>>0<H>>>0&1;v=0;while(1){y=v+1|0;if(((a[A+v>>0]|0)==1?(a[A+((y|0)%4|0)>>0]|0)==1:0)?(a[A+((v+2|0)%4|0)>>0]|0)==0:0){G=v;break}if((y|0)<4)v=y;else{G=y;break}}switch(G|0){case 4:{c[t>>2]=0;h[u>>3]=-1.0;y=-3;v=0;z=0;break a}case 0:{z=119;y=255;v=0;do{D=v+-3|0;B=(v&-2|0)==12;C=v*14|0;A=0;do{if(((A+-3|D)>>>0>=8?(F=A&-2,(A|v)>>>0>=2):0)?!(B&((F|0)==0|(F|0)==12)):0){E=(d[K+(A+C)>>0]|0)-H|0;a[I+z>>0]=E>>>31;E=(E|0)>-1?E:0-E|0;z=z+-1|0;y=(E|0)<(y|0)?E:y}A=A+1|0}while((A|0)!=14);v=v+1|0}while((v|0)!=14);break}case 1:{z=119;y=255;v=0;do{D=v+-3|0;C=v&-2;B=(C|0)==0;C=(C|0)==12;A=13;while(1){if(((A+-3|D)>>>0>=8?(E=(A&-2|0)==12,!(B&E)):0)?!(C&(A>>>0<2|E)):0){F=(d[K+((A*14|0)+v)>>0]|0)-H|0;a[I+z>>0]=F>>>31;F=(F|0)>-1?F:0-F|0;z=z+-1|0;y=(F|0)<(y|0)?F:y}if((A|0)>0)A=A+-1|0;else break}v=v+1|0}while((v|0)!=14);break}case 2:{v=119;y=255;D=13;while(1){B=D+-3|0;C=D>>>0<2|(D&-2|0)==12;A=D*14|0;z=13;while(1){if((z+-3|B)>>>0>=8?!((z|D)>>>0<2|C&(z&-2|0)==12):0){F=(d[K+(z+A)>>0]|0)-H|0;a[I+v>>0]=F>>>31;F=(F|0)>-1?F:0-F|0;v=v+-1|0;y=(F|0)<(y|0)?F:y}if((z|0)>0)z=z+-1|0;else break}if((D|0)>0)D=D+-1|0;else break}break}case 3:{v=119;y=255;D=13;while(1){C=D+-3|0;B=D&-2;A=(B|0)==12;B=(B|0)==0;z=0;do{if(((z+-3|C)>>>0>=8?!(A&z>>>0<2|(z|D)>>>0<2):0)?!(B&(z&-2|0)==12):0){F=(d[K+((z*14|0)+D)>>0]|0)-H|0;a[I+v>>0]=F>>>31;F=(F|0)>-1?F:0-F|0;v=v+-1|0;y=(F|0)<(y|0)?F:y}z=z+1|0}while((z|0)!=14);if((D|0)>0)D=D+-1|0;else break}break}default:y=255}c[t>>2]=G;h[u>>3]=(y|0)>30?1.0:+(y|0)/30.0;y=Ie(2830,0,0,I,J)|0;if((y|0)<0){y=-4;v=0;z=0}else{if(w)c[w>>2]=y;z=J;y=0;v=c[z>>2]|0;z=c[z+4>>2]|0}}else{c[t>>2]=0;h[u>>3]=-1.0;y=-2;v=0;z=0}while(0);if((y|0)<0){c[s>>2]=-1;break}if((v|0)==-1&(z|0)==-1){c[s>>2]=-1;y=-5;break}c[s>>2]=(v&-32768|0)==0&0==0?v&32767:0;if(!x)y=0;else{y=x;c[y>>2]=v;c[y+4>>2]=z;y=0}}else y=1;while(0);b:do switch(f|0){case 0:case 1:case 3:case 4:{if(!b){c[p>>2]=-1;v=-1;break b}v=b+28|0;z=c[v>>2]|0;A=z<<2;switch(f|0){case 0:case 3:if((Ee(e,0,z,A,g,j,k,l,m,n,o,K)|0)<0){c[p>>2]=-1;v=-6;break b}else{v=Ge(b,0,K,c[v>>2]|0,p,q,r)|0;break b}default:if((Ee(e,1,z,A,g,j,k,l,m,n,o,K)|0)<0){c[p>>2]=-1;v=-6;break b}else{v=Ge(b,1,K,c[v>>2]|0,p,q,r)|0;break b}}}default:v=1}while(0);if((y|0)!=1){if((v|0)!=1)y=(v&y|0)<0?v:0}else y=v;i=L;return y|0} +function _j(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0;k=i;i=i+16|0;b=k+8|0;h=k+4|0;d=k;c[h>>2]=a;do if(a>>>0>=212){g=(a>>>0)/210|0;e=g*210|0;c[d>>2]=a-e;b=($j(3712,3904,d,b)|0)-3712>>2;f=b;b=(c[3712+(b<<2)>>2]|0)+e|0;a:while(1){e=5;while(1){if(e>>>0>=47){e=211;j=8;break}d=c[3520+(e<<2)>>2]|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=106;break a}if((b|0)==($(a,d)|0))break;else e=e+1|0}b:do if((j|0)==8)while(1){j=0;d=(b>>>0)/(e>>>0)|0;if(d>>>0<e>>>0){j=105;break a}if((b|0)==($(d,e)|0))break b;d=e+10|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+12|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+16|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+18|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+22|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+28|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+30|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+36|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+40|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+42|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+46|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+52|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+58|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+60|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+66|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+70|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+72|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+78|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+82|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+88|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+96|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+100|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+102|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+106|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+108|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+112|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+120|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+126|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+130|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+136|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+138|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+142|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+148|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+150|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+156|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+162|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+166|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+168|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+172|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+178|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+180|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+186|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+190|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+192|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+196|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+198|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+208|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break;else{e=e+210|0;j=8}}while(0);e=f+1|0;b=(e|0)==48;e=b?0:e;b=(b&1)+g|0;f=e;g=b;b=(c[3712+(e<<2)>>2]|0)+(b*210|0)|0}if((j|0)==105){c[h>>2]=b;break}else if((j|0)==106){c[h>>2]=b;break}}else b=c[($j(3520,3712,h,b)|0)>>2]|0;while(0);i=k;return b|0}function $j(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=c[d>>2]|0;e=a;d=b-a>>2;a:while(1){while(1){if(!d)break a;a=(d|0)/2|0;if((c[e+(a<<2)>>2]|0)>>>0<f>>>0)break;else d=a}e=e+(a+1<<2)|0;d=d+-1-a|0}return e|0}function ak(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0;if(e>>>0>4294967279)oi(b);if(e>>>0<11){a[b>>0]=e<<1;b=b+1|0}else{g=e+16&-16;f=Kh(g)|0;c[b+8>>2]=f;c[b>>2]=g|1;c[b+4>>2]=e;b=f}ik(b|0,d|0,e|0)|0;a[b+e>>0]=0;return}function bk(b){b=b|0;if(a[b>>0]&1)Lh(c[b+8>>2]|0);return}function ck(){}function dk(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;d=b-d-(c>>>0>a>>>0|0)>>>0;return (D=d,a-c>>>0|0)|0}function ek(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=b+e|0;if((e|0)>=20){d=d&255;h=b&3;i=d|d<<8|d<<16|d<<24;g=f&~3;if(h){h=b+4-h|0;while((b|0)<(h|0)){a[b>>0]=d;b=b+1|0}}while((b|0)<(g|0)){c[b>>2]=i;b=b+4|0}}while((b|0)<(f|0)){a[b>>0]=d;b=b+1|0}return b-e|0}function fk(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){D=b<<c|(a&(1<<c)-1<<32-c)>>>32-c;return a<<c}D=a<<c-32;return 0}function gk(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;c=a+c>>>0;return (D=b+d+(c>>>0<a>>>0|0)>>>0,c|0)|0}function hk(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){D=b>>>c;return a>>>c|(b&(1<<c)-1)<<32-c}D=0;return b>>>c-32|0}function ik(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;if((e|0)>=4096)return Xa(b|0,d|0,e|0)|0;f=b|0;if((b&3)==(d&3)){while(b&3){if(!e)return f|0;a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0;e=e-1|0}while((e|0)>=4){c[b>>2]=c[d>>2];b=b+4|0;d=d+4|0;e=e-4|0}}while((e|0)>0){a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0;e=e-1|0}return f|0}function jk(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){D=b>>c;return a>>>c|(b&(1<<c)-1)<<32-c}D=(b|0)<0?-1:0;return b>>c-32|0}function kk(b){b=b|0;var c=0;c=a[m+(b&255)>>0]|0;if((c|0)<8)return c|0;c=a[m+(b>>8&255)>>0]|0;if((c|0)<8)return c+8|0;c=a[m+(b>>16&255)>>0]|0;if((c|0)<8)return c+16|0;return (a[m+(b>>>24)>>0]|0)+24|0}function lk(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;f=a&65535;e=b&65535;c=$(e,f)|0;d=a>>>16;a=(c>>>16)+($(e,d)|0)|0;e=b>>>16;b=$(e,f)|0;return (D=(a>>>16)+($(e,d)|0)+(((a&65535)+b|0)>>>16)|0,a+b<<16|c&65535|0)|0}function mk(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;j=b>>31|((b|0)<0?-1:0)<<1;i=((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1;f=d>>31|((d|0)<0?-1:0)<<1;e=((d|0)<0?-1:0)>>31|((d|0)<0?-1:0)<<1;h=dk(j^a,i^b,j,i)|0;g=D;a=f^j;b=e^i;return dk((rk(h,g,dk(f^c,e^d,f,e)|0,D,0)|0)^a,D^b,a,b)|0}function nk(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;i=i+16|0;j=f|0;h=b>>31|((b|0)<0?-1:0)<<1;g=((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1;l=e>>31|((e|0)<0?-1:0)<<1;k=((e|0)<0?-1:0)>>31|((e|0)<0?-1:0)<<1;a=dk(h^a,g^b,h,g)|0;b=D;rk(a,b,dk(l^d,k^e,l,k)|0,D,j)|0;e=dk(c[j>>2]^h,c[j+4>>2]^g,h,g)|0;d=D;i=f;return (D=d,e)|0}function ok(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=a;f=c;c=lk(e,f)|0;a=D;return (D=($(b,f)|0)+($(d,e)|0)+a|a&0,c|0|0)|0}function pk(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return rk(a,b,c,d,0)|0}function qk(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;g=i;i=i+16|0;f=g|0;rk(a,b,d,e,f)|0;i=g;return (D=c[f+4>>2]|0,c[f>>2]|0)|0}function rk(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;l=a;j=b;k=j;h=d;n=e;i=n;if(!k){g=(f|0)!=0;if(!i){if(g){c[f>>2]=(l>>>0)%(h>>>0);c[f+4>>2]=0}n=0;f=(l>>>0)/(h>>>0)>>>0;return (D=n,f)|0}else{if(!g){n=0;f=0;return (D=n,f)|0}c[f>>2]=a|0;c[f+4>>2]=b&0;n=0;f=0;return (D=n,f)|0}}g=(i|0)==0;do if(h){if(!g){g=(ba(i|0)|0)-(ba(k|0)|0)|0;if(g>>>0<=31){m=g+1|0;i=31-g|0;b=g-31>>31;h=m;a=l>>>(m>>>0)&b|k<<i;b=k>>>(m>>>0)&b;g=0;i=l<<i;break}if(!f){n=0;f=0;return (D=n,f)|0}c[f>>2]=a|0;c[f+4>>2]=j|b&0;n=0;f=0;return (D=n,f)|0}g=h-1|0;if(g&h){i=(ba(h|0)|0)+33-(ba(k|0)|0)|0;p=64-i|0;m=32-i|0;j=m>>31;o=i-32|0;b=o>>31;h=i;a=m-1>>31&k>>>(o>>>0)|(k<<m|l>>>(i>>>0))&b;b=b&k>>>(i>>>0);g=l<<p&j;i=(k<<p|l>>>(o>>>0))&j|l<<m&i-33>>31;break}if(f){c[f>>2]=g&l;c[f+4>>2]=0}if((h|0)==1){o=j|b&0;p=a|0|0;return (D=o,p)|0}else{p=kk(h|0)|0;o=k>>>(p>>>0)|0;p=k<<32-p|l>>>(p>>>0)|0;return (D=o,p)|0}}else{if(g){if(f){c[f>>2]=(k>>>0)%(h>>>0);c[f+4>>2]=0}o=0;p=(k>>>0)/(h>>>0)>>>0;return (D=o,p)|0}if(!l){if(f){c[f>>2]=0;c[f+4>>2]=(k>>>0)%(i>>>0)}o=0;p=(k>>>0)/(i>>>0)>>>0;return (D=o,p)|0}g=i-1|0;if(!(g&i)){if(f){c[f>>2]=a|0;c[f+4>>2]=g&k|b&0}o=0;p=k>>>((kk(i|0)|0)>>>0);return (D=o,p)|0}g=(ba(i|0)|0)-(ba(k|0)|0)|0;if(g>>>0<=30){b=g+1|0;i=31-g|0;h=b;a=k<<i|l>>>(b>>>0);b=k>>>(b>>>0);g=0;i=l<<i;break}if(!f){o=0;p=0;return (D=o,p)|0}c[f>>2]=a|0;c[f+4>>2]=j|b&0;o=0;p=0;return (D=o,p)|0}while(0);if(!h){k=i;j=0;i=0}else{m=d|0|0;l=n|e&0;k=gk(m|0,l|0,-1,-1)|0;d=D;j=i;i=0;do{e=j;j=g>>>31|j<<1;g=i|g<<1;e=a<<1|e>>>31|0;n=a>>>31|b<<1|0;dk(k,d,e,n)|0;p=D;o=p>>31|((p|0)<0?-1:0)<<1;i=o&1;a=dk(e,n,o&m,(((p|0)<0?-1:0)>>31|((p|0)<0?-1:0)<<1)&l)|0;b=D;h=h-1|0}while((h|0)!=0);k=j;j=0}h=0;if(f){c[f>>2]=a;c[f+4>>2]=b}o=(g|0)>>>31|(k|h)<<1|(h<<1|g>>>31)&0|j;p=(g<<1|0>>>31)&-2|i;return (D=o,p)|0}function sk(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Qb[a&15](b|0,c|0,d|0)|0}function tk(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;Rb[a&3](b|0,c|0,d|0,e|0,f|0)}function uk(a,b,c){a=a|0;b=b|0;c=c|0;return +Sb[a&1](b|0,c|0)}function vk(a,b,c){a=a|0;b=b|0;c=+c;Tb[a&3](b|0,+c)}function wk(a,b){a=a|0;b=b|0;return +Ub[a&3](b|0)}function xk(a){a=a|0;return Vb[a&1]()|0}function yk(a,b){a=a|0;b=b|0;Wb[a&15](b|0)}function zk(a,b,c){a=a|0;b=b|0;c=c|0;Xb[a&7](b|0,c|0)}function Ak(a,b){a=a|0;b=b|0;return Yb[a&31](b|0)|0}function Bk(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Zb[a&1](b|0,c|0,d|0)}function Ck(a){a=a|0;_b[a&0]()}function Dk(a,b,c,d){a=a|0;b=b|0;c=c|0;d=+d;$b[a&3](b|0,c|0,+d)}function Ek(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return ac[a&1](b|0,c|0,d|0,e|0)|0}function Fk(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;bc[a&3](b|0,c|0,d|0,e|0,f|0,g|0)}function Gk(a,b,c){a=a|0;b=b|0;c=c|0;return cc[a&15](b|0,c|0)|0}function Hk(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;dc[a&3](b|0,c|0,d|0,e|0)}function Ik(a,b,c){a=a|0;b=b|0;c=c|0;ca(0);return 0}function Jk(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;ca(1)}function Kk(a,b){a=a|0;b=b|0;ca(2);return 0.0}function Lk(a,b){a=a|0;b=+b;ca(3)}function Mk(a){a=a|0;ca(4);return 0.0}function Nk(){ca(5);return 0}function Ok(a){a=a|0;ca(6)}function Pk(a,b){a=a|0;b=b|0;ca(7)}function Qk(a){a=a|0;ca(8);return 0}function Rk(a,b,c){a=a|0;b=b|0;c=c|0;ca(9)}function Sk(){ca(10)}function Tk(a,b,c){a=a|0;b=b|0;c=+c;ca(11)}function Uk(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;ca(12);return 0}function Vk(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;ca(13)}function Wk(a,b){a=a|0;b=b|0;ca(14);return 0}function Xk(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;ca(15)} + +// EMSCRIPTEN_END_FUNCS +var Qb=[Ik,Zh,_h,Qj,Qi,Pi,Ri,Ag,sg,qg,rg,yg,kh,jh,Oi,Mj];var Rb=[Jk,ki,ji,gi];var Sb=[Kk,dh];var Tb=[Lk,Wf,Yf,ag];var Ub=[Mk,Xf,Zf,bg];var Vb=[Nk,Nf];var Wb=[Ok,Mh,Nh,Sh,Vh,Th,Uh,Wh,Xh,Yh,Mf,Xg,Yg,Ij,Jj,Ok];var Xb=[Pk,ig,gg,_f,cg,eg,ng,gh];var Yb=[Qk,Oh,Ni,Pf,Vf,Qf,wg,xg,mg,lg,jg,hg,$f,dg,fg,og,fh,Qk,Qk,Qk,Qk,Qk,Qk,Qk,Qk,Qk,Qk,Qk,Qk,Qk,Qk,Qk];var Zb=[Rk,ch];var _b=[Sk];var $b=[Tk,eh,bh,Tk];var ac=[Uk,mh];var bc=[Vk,ni,mi,li];var cc=[Wk,Df,Sf,Tf,Uf,tg,vg,ug,zg,kg,lh,hh,Wk,Wk,Wk,Wk];var dc=[Xk,ai,bi,di];return{_i64Subtract:dk,_fflush:Yi,_i64Add:gk,_memset:ek,_malloc:Uj,_memcpy:ik,___getTypeName:Ah,_bitshift64Lshr:hk,_free:Vj,___errno_location:qi,_bitshift64Shl:fk,__GLOBAL__sub_I_ARToolKitJS_cpp:Wg,__GLOBAL__sub_I_bind_cpp:Ch,runPostSets:ck,stackAlloc:ec,stackSave:fc,stackRestore:gc,establishStackSpace:hc,setThrew:ic,setTempRet0:lc,getTempRet0:mc,dynCall_iiii:sk,dynCall_viiiii:tk,dynCall_dii:uk,dynCall_vid:vk,dynCall_di:wk,dynCall_i:xk,dynCall_vi:yk,dynCall_vii:zk,dynCall_ii:Ak,dynCall_viii:Bk,dynCall_v:Ck,dynCall_viid:Dk,dynCall_iiiii:Ek,dynCall_viiiiii:Fk,dynCall_iii:Gk,dynCall_viiii:Hk}}) + + +// EMSCRIPTEN_END_ASM +(Module.asmGlobalArg,Module.asmLibraryArg,buffer);var _i64Subtract=Module["_i64Subtract"]=asm["_i64Subtract"];var __GLOBAL__sub_I_bind_cpp=Module["__GLOBAL__sub_I_bind_cpp"]=asm["__GLOBAL__sub_I_bind_cpp"];var _fflush=Module["_fflush"]=asm["_fflush"];var __GLOBAL__sub_I_ARToolKitJS_cpp=Module["__GLOBAL__sub_I_ARToolKitJS_cpp"]=asm["__GLOBAL__sub_I_ARToolKitJS_cpp"];var _i64Add=Module["_i64Add"]=asm["_i64Add"];var _memset=Module["_memset"]=asm["_memset"];var runPostSets=Module["runPostSets"]=asm["runPostSets"];var _malloc=Module["_malloc"]=asm["_malloc"];var _memcpy=Module["_memcpy"]=asm["_memcpy"];var ___getTypeName=Module["___getTypeName"]=asm["___getTypeName"];var _bitshift64Lshr=Module["_bitshift64Lshr"]=asm["_bitshift64Lshr"];var _free=Module["_free"]=asm["_free"];var ___errno_location=Module["___errno_location"]=asm["___errno_location"];var _bitshift64Shl=Module["_bitshift64Shl"]=asm["_bitshift64Shl"];var dynCall_iiii=Module["dynCall_iiii"]=asm["dynCall_iiii"];var dynCall_viiiii=Module["dynCall_viiiii"]=asm["dynCall_viiiii"];var dynCall_dii=Module["dynCall_dii"]=asm["dynCall_dii"];var dynCall_vid=Module["dynCall_vid"]=asm["dynCall_vid"];var dynCall_di=Module["dynCall_di"]=asm["dynCall_di"];var dynCall_i=Module["dynCall_i"]=asm["dynCall_i"];var dynCall_vi=Module["dynCall_vi"]=asm["dynCall_vi"];var dynCall_vii=Module["dynCall_vii"]=asm["dynCall_vii"];var dynCall_ii=Module["dynCall_ii"]=asm["dynCall_ii"];var dynCall_viii=Module["dynCall_viii"]=asm["dynCall_viii"];var dynCall_v=Module["dynCall_v"]=asm["dynCall_v"];var dynCall_viid=Module["dynCall_viid"]=asm["dynCall_viid"];var dynCall_iiiii=Module["dynCall_iiiii"]=asm["dynCall_iiiii"];var dynCall_viiiiii=Module["dynCall_viiiiii"]=asm["dynCall_viiiiii"];var dynCall_iii=Module["dynCall_iii"]=asm["dynCall_iii"];var dynCall_viiii=Module["dynCall_viiii"]=asm["dynCall_viiii"];Runtime.stackAlloc=asm["stackAlloc"];Runtime.stackSave=asm["stackSave"];Runtime.stackRestore=asm["stackRestore"];Runtime.establishStackSpace=asm["establishStackSpace"];Runtime.setTempRet0=asm["setTempRet0"];Runtime.getTempRet0=asm["getTempRet0"];function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;var preloadStartTime=null;var calledMain=false;dependenciesFulfilled=function runCaller(){if(!Module["calledRun"])run();if(!Module["calledRun"])dependenciesFulfilled=runCaller};Module["callMain"]=Module.callMain=function callMain(args){assert(runDependencies==0,"cannot call main when async dependencies remain! (listen on __ATMAIN__)");assert(__ATPRERUN__.length==0,"cannot call main when preRun functions remain to be called");args=args||[];ensureInitRuntime();var argc=args.length+1;function pad(){for(var i=0;i<4-1;i++){argv.push(0)}}var argv=[allocate(intArrayFromString(Module["thisProgram"]),"i8",ALLOC_NORMAL)];pad();for(var i=0;i<argc-1;i=i+1){argv.push(allocate(intArrayFromString(args[i]),"i8",ALLOC_NORMAL));pad()}argv.push(0);argv=allocate(argv,"i32",ALLOC_NORMAL);try{var ret=Module["_main"](argc,argv,0);exit(ret,true)}catch(e){if(e instanceof ExitStatus){return}else if(e=="SimulateInfiniteLoop"){Module["noExitRuntime"]=true;return}else{if(e&&typeof e==="object"&&e.stack)Module.printErr("exception thrown: "+[e,e.stack]);throw e}}finally{calledMain=true}};function run(args){args=args||Module["arguments"];if(preloadStartTime===null)preloadStartTime=Date.now();if(runDependencies>0){return}preRun();if(runDependencies>0)return;if(Module["calledRun"])return;function doRun(){if(Module["calledRun"])return;Module["calledRun"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();if(Module["_main"]&&shouldRunNow)Module["callMain"](args);postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout((function(){setTimeout((function(){Module["setStatus"]("")}),1);doRun()}),1)}else{doRun()}}Module["run"]=Module.run=run;function exit(status,implicit){if(implicit&&Module["noExitRuntime"]){return}if(Module["noExitRuntime"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module["onExit"])Module["onExit"](status)}if(ENVIRONMENT_IS_NODE){process["stdout"]["once"]("drain",(function(){process["exit"](status)}));console.log(" ");setTimeout((function(){process["exit"](status)}),500)}else if(ENVIRONMENT_IS_SHELL&&typeof quit==="function"){quit(status)}throw new ExitStatus(status)}Module["exit"]=Module.exit=exit;var abortDecorators=[];function abort(what){if(what!==undefined){Module.print(what);Module.printErr(what);what=JSON.stringify(what)}else{what=""}ABORT=true;EXITSTATUS=1;var extra="\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.";var output="abort("+what+") at "+stackTrace()+extra;if(abortDecorators){abortDecorators.forEach((function(decorator){output=decorator(output,what)}))}throw output}Module["abort"]=Module.abort=abort;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}var shouldRunNow=true;if(Module["noInitialRun"]){shouldRunNow=false}run() +;(function() { + 'use strict' + + /** + The ARController is the main object for doing AR marker detection with JSARToolKit. + + To use an ARController, you need to tell it the dimensions to use for the AR processing canvas and + pass it an ARCameraParam to define the camera parameters to use when processing images. + The ARCameraParam defines the lens distortion and aspect ratio of the camera used. + See https://www.artoolworks.com/support/library/Calibrating_your_camera for more information about AR camera parameteters and how to make and use them. + + If you pass an image as the first argument, the ARController uses that as the image to process, + using the dimensions of the image as AR processing canvas width and height. If the first argument + to ARController is an image, the second argument is used as the camera param. + + The camera parameters argument can be either an ARCameraParam or an URL to a camera definition file. + If the camera argument is an URL, it is loaded into a new ARCameraParam, and the ARController dispatches + a 'load' event and calls the onload method if it is defined. + + @exports ARController + @constructor + + @param {number} width The width of the images to process. + @param {number} height The height of the images to process. + @param {ARCameraParam | string} camera The ARCameraParam to use for image processing. If this is a string, the ARController treats it as an URL and tries to load it as a ARCameraParam definition file, calling ARController#onload on success. + */ + var ARController = function(width, height, camera) { + var id; + var w = width, h = height; + + this.orientation = 'landscape'; + + this.listeners = {}; + + if (typeof width !== 'number') { + var image = width; + camera = height; + w = image.videoWidth || image.width; + h = image.videoHeight || image.height; + this.image = image; + } + + this.defaultMarkerWidth = 1; + this.patternMarkers = {}; + this.barcodeMarkers = {}; + this.transform_mat = new Float32Array(16); + + this.canvas = document.createElement('canvas'); + this.canvas.width = w; + this.canvas.height = h; + this.ctx = this.canvas.getContext('2d'); + + this.videoWidth = w; + this.videoHeight = h; + + if (typeof camera === 'string') { + + var self = this; + this.cameraParam = new ARCameraParam(camera, function() { + self._initialize(); + }, function(err) { + console.error("ARController: Failed to load ARCameraParam", err); + }); + + } else { + + this.cameraParam = camera; + this._initialize(); + + } + }; + + /** + Destroys the ARController instance and frees all associated resources. + After calling dispose, the ARController can't be used any longer. Make a new one if you need one. + + Calling this avoids leaking Emscripten memory, which may be important if you're using multiple ARControllers. + */ + ARController.prototype.dispose = function() { + artoolkit.teardown(this.id); + + for (var t in this) { + this[t] = null; + } + }; + + /** + Detects markers in the given image. The process method dispatches marker detection events during its run. + + The marker detection process proceeds by first dispatching a markerNum event that tells you how many + markers were found in the image. Next, a getMarker event is dispatched for each found marker square. + Finally, getMultiMarker is dispatched for every found multimarker, followed by getMultiMarkerSub events + dispatched for each of the markers in the multimarker. + + arController.addEventListener('markerNum', function(ev) { + console.log("Detected " + ev.data + " markers.") + }); + arController.addEventListener('getMarker', function(ev) { + console.log("Detected marker with ids:", ev.data.marker.id, ev.data.marker.idPatt, ev.data.marker.idMatrix); + console.log("Marker data", ev.data.marker); + console.log("Marker transform matrix:", [].join.call(ev.data.matrix, ', ')); + }); + arController.addEventListener('getMultiMarker', function(ev) { + console.log("Detected multimarker with id:", ev.data.multiMarkerId); + }); + arController.addEventListener('getMultiMarkerSub', function(ev) { + console.log("Submarker for " + ev.data.multiMarkerId, ev.data.markerIndex, ev.data.marker); + }); + + arController.process(image); + + + If no image is given, defaults to this.image. + + If the debugSetup has been called, draws debug markers on the debug canvas. + + @param {ImageElement | VideoElement} image The image to process [optional]. + */ + ARController.prototype.process = function(image) { + this.detectMarker(image); + + var markerNum = this.getMarkerNum(); + var k,o; + for (k in this.patternMarkers) { + o = this.patternMarkers[k] + o.inPrevious = o.inCurrent; + o.inCurrent = false; + } + for (k in this.barcodeMarkers) { + o = this.barcodeMarkers[k] + o.inPrevious = o.inCurrent; + o.inCurrent = false; + } + + for (var i=0; i<markerNum; i++) { + var markerInfo = this.getMarker(i); + + var markerType = artoolkit.UNKNOWN_MARKER; + var visible = this.trackPatternMarkerId(-1); + + if (markerInfo.idPatt > -1 && (markerInfo.id === markerInfo.idPatt || markerInfo.idMatrix === -1)) { + visible = this.trackPatternMarkerId(markerInfo.idPatt); + markerType = artoolkit.PATTERN_MARKER; + + if (markerInfo.dir !== markerInfo.dirPatt) { + this.setMarkerInfoDir(i, markerInfo.dirPatt); + } + + } else if (markerInfo.idMatrix > -1) { + visible = this.trackBarcodeMarkerId(markerInfo.idMatrix); + markerType = artoolkit.BARCODE_MARKER; + + if (markerInfo.dir !== markerInfo.dirMatrix) { + this.setMarkerInfoDir(i, markerInfo.dirMatrix); + } + } + + if (markerType !== artoolkit.UNKNOWN_MARKER && visible.inPrevious) { + this.getTransMatSquareCont(i, visible.markerWidth, visible.matrix, visible.matrix); + } else { + this.getTransMatSquare(i, visible.markerWidth, visible.matrix); + } +// this.getTransMatSquare(i, visible.markerWidth, visible.matrix); + + visible.inCurrent = true; + this.transMatToGLMat(visible.matrix, this.transform_mat); + this.dispatchEvent({ + name: 'getMarker', + target: this, + data: { + index: i, + type: markerType, + marker: markerInfo, + matrix: this.transform_mat + } + }); + } + + var multiMarkerCount = this.getMultiMarkerCount(); + for (var i=0; i<multiMarkerCount; i++) { + var subMarkerCount = this.getMultiMarkerPatternCount(i); + var visible = false; + + artoolkit.getTransMatMultiSquareRobust(this.id, i); + this.transMatToGLMat(this.marker_transform_mat, this.transform_mat); + for (var j=0; j<subMarkerCount; j++) { + var multiEachMarkerInfo = this.getMultiEachMarker(i, j); + if (multiEachMarkerInfo.visible >= 0) { + visible = true; + this.dispatchEvent({ + name: 'getMultiMarker', + target: this, + data: { + multiMarkerId: i, + matrix: this.transform_mat + } + }); + break; + } + } + if (visible) { + for (var j=0; j<subMarkerCount; j++) { + var multiEachMarkerInfo = this.getMultiEachMarker(i, j); + this.transMatToGLMat(this.marker_transform_mat, this.transform_mat); + this.dispatchEvent({ + name: 'getMultiMarkerSub', + target: this, + data: { + multiMarkerId: i, + markerIndex: j, + marker: multiEachMarkerInfo, + matrix: this.transform_mat + } + }); + } + } + } + if (this._bwpointer) { + this.debugDraw(); + } + }; + + /** + Adds the given pattern marker ID to the index of tracked IDs. + Sets the markerWidth for the pattern marker to markerWidth. + + Used by process() to implement continuous tracking, + keeping track of the marker's transformation matrix + and customizable marker widths. + + @param {number} id ID of the pattern marker to track. + @param {number} markerWidth The width of the marker to track. + @return {Object} The marker tracking object. + */ + ARController.prototype.trackPatternMarkerId = function(id, markerWidth) { + var obj = this.patternMarkers[id]; + if (!obj) { + this.patternMarkers[id] = obj = { + inPrevious: false, + inCurrent: false, + matrix: new Float32Array(12), + markerWidth: markerWidth || this.defaultMarkerWidth + }; + } + if (markerWidth) { + obj.markerWidth = markerWidth; + } + return obj; + }; + + /** + Adds the given barcode marker ID to the index of tracked IDs. + Sets the markerWidth for the pattern marker to markerWidth. + + Used by process() to implement continuous tracking, + keeping track of the marker's transformation matrix + and customizable marker widths. + + @param {number} id ID of the barcode marker to track. + @param {number} markerWidth The width of the marker to track. + @return {Object} The marker tracking object. + */ + ARController.prototype.trackBarcodeMarkerId = function(id, markerWidth) { + var obj = this.barcodeMarkers[id]; + if (!obj) { + this.barcodeMarkers[id] = obj = { + inPrevious: false, + inCurrent: false, + matrix: new Float32Array(12), + markerWidth: markerWidth || this.defaultMarkerWidth + }; + } + if (markerWidth) { + obj.markerWidth = markerWidth; + } + return obj; + }; + + /** + Returns the number of multimarkers registered on this ARController. + + @return {number} Number of multimarkers registered. + */ + ARController.prototype.getMultiMarkerCount = function() { + return artoolkit.getMultiMarkerCount(this.id); + }; + + /** + Returns the number of markers in the multimarker registered for the given multiMarkerId. + + @param {number} multiMarkerId The id number of the multimarker to access. Given by loadMultiMarker. + @return {number} Number of markers in the multimarker. Negative value indicates failure to find the multimarker. + */ + ARController.prototype.getMultiMarkerPatternCount = function(multiMarkerId) { + return artoolkit.getMultiMarkerNum(this.id, multiMarkerId); + }; + + /** + Add an event listener on this ARController for the named event, calling the callback function + whenever that event is dispatched. + + Possible events are: + * getMarker - dispatched whenever process() finds a square marker + * getMultiMarker - dispatched whenever process() finds a visible registered multimarker + * getMultiMarkerSub - dispatched by process() for each marker in a visible multimarker + * load - dispatched when the ARController is ready to use (useful if passing in a camera URL in the constructor) + + @param {string} name Name of the event to listen to. + @param {function} callback Callback function to call when an event with the given name is dispatched. + */ + ARController.prototype.addEventListener = function(name, callback) { + if (!this.listeners[name]) { + this.listeners[name] = []; + } + this.listeners[name].push(callback); + }; + + /** + Remove an event listener from the named event. + + @param {string} name Name of the event to stop listening to. + @param {function} callback Callback function to remove from the listeners of the named event. + */ + ARController.prototype.removeEventListener = function(name, callback) { + if (this.listeners[name]) { + var index = this.listeners[name].indexOf(callback); + if (index > -1) { + this.listeners[name].splice(index, 1); + } + } + }; + + /** + Dispatches the given event to all registered listeners on event.name. + + @param {Object} event Event to dispatch. + */ + ARController.prototype.dispatchEvent = function(event) { + var listeners = this.listeners[event.name]; + if (listeners) { + for (var i=0; i<listeners.length; i++) { + listeners[i].call(this, event); + } + } + }; + + /** + Sets up a debug canvas for the AR detection. Draws a red marker on top of each detected square in the image. + + The debug canvas is added to document.body. + */ + ARController.prototype.debugSetup = function() { + document.body.appendChild(this.canvas) + this.setDebugMode(1); + this._bwpointer = this.getProcessingImage(); + }; + + /** + Loads a pattern marker from the given URL and calls the onSuccess callback with the UID of the marker. + + arController.loadMarker(markerURL, onSuccess, onError); + + @param {string} markerURL - The URL of the marker pattern file to load. + @param {function} onSuccess - The success callback. Called with the id of the loaded marker on a successful load. + @param {function} onError - The error callback. Called with the encountered error if the load fails. + */ + ARController.prototype.loadMarker = function(markerURL, onSuccess, onError) { + return artoolkit.addMarker(this.id, markerURL, onSuccess, onError); + }; + + /** + Loads a multimarker from the given URL and calls the onSuccess callback with the UID of the marker. + + arController.loadMultiMarker(markerURL, onSuccess, onError); + + @param {string} markerURL - The URL of the multimarker pattern file to load. + @param {function} onSuccess - The success callback. Called with the id and the number of sub-markers of the loaded marker on a successful load. + @param {function} onError - The error callback. Called with the encountered error if the load fails. + */ + ARController.prototype.loadMultiMarker = function(markerURL, onSuccess, onError) { + return artoolkit.addMultiMarker(this.id, markerURL, onSuccess, onError); + }; + + /** + * Populates the provided float array with the current transformation for the specified marker. After + * a call to detectMarker, all marker information will be current. Marker transformations can then be + * checked. + * @param {number} markerUID The unique identifier (UID) of the marker to query + * @param {number} markerWidth The width of the marker + * @param {Float64Array} dst The float array to populate with the 3x4 marker transformation matrix + * @return {Float64Array} The dst array. + */ + ARController.prototype.getTransMatSquare = function(markerIndex, markerWidth, dst) { + artoolkit.getTransMatSquare(this.id, markerIndex, markerWidth); + dst.set(this.marker_transform_mat); + return dst; + }; + + /** + * Populates the provided float array with the current transformation for the specified marker, using + * previousMarkerTransform as the previously detected transformation. After + * a call to detectMarker, all marker information will be current. Marker transformations can then be + * checked. + * @param {number} markerUID The unique identifier (UID) of the marker to query + * @param {number} markerWidth The width of the marker + * @param {Float64Array} previousMarkerTransform The float array to use as the previous 3x4 marker transformation matrix + * @param {Float64Array} dst The float array to populate with the 3x4 marker transformation matrix + * @return {Float64Array} The dst array. + */ + ARController.prototype.getTransMatSquareCont = function(markerIndex, markerWidth, previousMarkerTransform, dst) { + this.marker_transform_mat.set(previousMarkerTransform) + artoolkit.getTransMatSquareCont(this.id, markerIndex, markerWidth); + dst.set(this.marker_transform_mat); + return dst; + }; + + /** + * Populates the provided float array with the current transformation for the specified multimarker. After + * a call to detectMarker, all marker information will be current. Marker transformations can then be + * checked. + * + * @param {number} markerUID The unique identifier (UID) of the marker to query + * @param {number} markerWidth The width of the marker + * @param {Float64Array} dst The float array to populate with the 3x4 marker transformation matrix + * @return {Float64Array} The dst array. + */ + ARController.prototype.getTransMatMultiSquare = function(multiMarkerId, dst) { + artoolkit.getTransMatMultiSquare(this.id, multiMarkerId); + dst.set(this.marker_transform_mat); + return dst; + }; + + /** + * Populates the provided float array with the current robust transformation for the specified multimarker. After + * a call to detectMarker, all marker information will be current. Marker transformations can then be + * checked. + * @param {number} markerUID The unique identifier (UID) of the marker to query + * @param {number} markerWidth The width of the marker + * @param {Float64Array} dst The float array to populate with the 3x4 marker transformation matrix + * @return {Float64Array} The dst array. + */ + ARController.prototype.getTransMatMultiSquareRobust = function(multiMarkerId, dst) { + artoolkit.getTransMatMultiSquare(this.id, multiMarkerId); + dst.set(this.marker_transform_mat); + return dst; + }; + + /** + Converts the given 3x4 marker transformation matrix in the 12-element transMat array + into a 4x4 WebGL matrix and writes the result into the 16-element glMat array. + + If scale parameter is given, scales the transform of the glMat by the scale parameter. + + @param {Float64Array} transMat The 3x4 marker transformation matrix. + @param {Float64Array} glMat The 4x4 GL transformation matrix. + @param {number} scale The scale for the transform. + */ + ARController.prototype.transMatToGLMat = function(transMat, glMat, scale) { + glMat[0 + 0*4] = transMat[0]; // R1C1 + glMat[0 + 1*4] = transMat[1]; // R1C2 + glMat[0 + 2*4] = transMat[2]; + glMat[0 + 3*4] = transMat[3]; + glMat[1 + 0*4] = transMat[4]; // R2 + glMat[1 + 1*4] = transMat[5]; + glMat[1 + 2*4] = transMat[6]; + glMat[1 + 3*4] = transMat[7]; + glMat[2 + 0*4] = transMat[8]; // R3 + glMat[2 + 1*4] = transMat[9]; + glMat[2 + 2*4] = transMat[10]; + glMat[2 + 3*4] = transMat[11]; + glMat[3 + 0*4] = 0.0; + glMat[3 + 1*4] = 0.0; + glMat[3 + 2*4] = 0.0; + glMat[3 + 3*4] = 1.0; + if (scale != undefined && scale !== 0.0) { + glMat[12] *= scale; + glMat[13] *= scale; + glMat[14] *= scale; + } + return glMat; + }; + + /** + This is the core ARToolKit marker detection function. It calls through to a set of + internal functions to perform the key marker detection steps of binarization and + labelling, contour extraction, and template matching and/or matrix code extraction. + + Typically, the resulting set of detected markers is retrieved by calling arGetMarkerNum + to get the number of markers detected and arGetMarker to get an array of ARMarkerInfo + structures with information on each detected marker, followed by a step in which + detected markers are possibly examined for some measure of goodness of match (e.g. by + examining the match confidence value) and pose extraction. + + @param {image} Image to be processed to detect markers. + @return {number} 0 if the function proceeded without error, or a value less than 0 in case of error. + A result of 0 does not however, imply any markers were detected. + */ + ARController.prototype.detectMarker = function(image) { + if (this._copyImageToHeap(image)) { + return artoolkit.detectMarker(this.id); + } + return -99; + }; + + /** + Get the number of markers detected in a video frame. + + @return {number} The number of detected markers in the most recent image passed to arDetectMarker. + Note that this is actually a count, not an index. A better name for this function would be + arGetDetectedMarkerCount, but the current name lives on for historical reasons. + */ + ARController.prototype.getMarkerNum = function() { + return artoolkit.getMarkerNum(this.id); + }; + + /** + Get the marker info struct for the given marker index in detected markers. + + Call this.detectMarker first, then use this.getMarkerNum to get the detected marker count. + + The returned object is the global artoolkit.markerInfo object and will be overwritten + by subsequent calls. If you need to hang on to it, create a copy using this.cloneMarkerInfo(); + + Returns undefined if no marker was found. + + A markerIndex of -1 is used to access the global custom marker. + + The fields of the markerInfo struct are: + @field area Area in pixels of the largest connected region, comprising the marker border and regions connected to it. Note that this is + not the same as the actual onscreen area inside the marker border. + @field id If pattern detection mode is either pattern mode OR matrix but not both, will be marker ID (>= 0) if marker is valid, or -1 if invalid. + @field idPatt If pattern detection mode includes a pattern mode, will be marker ID (>= 0) if marker is valid, or -1 if invalid. + @field idMatrix If pattern detection mode includes a matrix mode, will be marker ID (>= 0) if marker is valid, or -1 if invalid. + @field dir If pattern detection mode is either pattern mode OR matrix but not both, and id != -1, will be marker direction (range 0 to 3, inclusive). + @field dirPatt If pattern detection mode includes a pattern mode, and id != -1, will be marker direction (range 0 to 3, inclusive). + @field dirMatrix If pattern detection mode includes a matrix mode, and id != -1, will be marker direction (range 0 to 3, inclusive). + @field cf If pattern detection mode is either pattern mode OR matrix but not both, will be marker matching confidence (range 0.0 to 1.0 inclusive) if marker is valid, or -1.0 if marker is invalid. + @field cfPatt If pattern detection mode includes a pattern mode, will be marker matching confidence (range 0.0 to 1.0 inclusive) if marker is valid, or -1.0 if marker is invalid. + @field cfMatrix If pattern detection mode includes a matrix mode, will be marker matching confidence (range 0.0 to 1.0 inclusive) if marker is valid, or -1.0 if marker is invalid. + @field pos 2D position (in camera image coordinates, origin at top-left) of the centre of the marker. + @field line Line equations for the 4 sides of the marker. + @field vertex 2D positions (in camera image coordinates, origin at top-left) of the corners of the marker. vertex[(4 - dir)%4][] is the top-left corner of the marker. Other vertices proceed clockwise from this. These are idealised coordinates (i.e. the onscreen position aligns correctly with the undistorted camera image.) + + + @param {number} markerIndex The index of the marker to query. + @returns {Object} The markerInfo struct. + */ + ARController.prototype.getMarker = function(markerIndex) { + if (0 === artoolkit.getMarker(this.id, markerIndex)) { + return artoolkit.markerInfo; + } + }; + + /** + Set marker vertices to the given vertexData[4][2] array. + + Sets the marker pos to the center of the vertices. + + Useful for building custom markers for getTransMatSquare. + + A markerIndex of -1 is used to access the global custom marker. + + @param {number} markerIndex The index of the marker to edit. + */ + ARController.prototype.setMarkerInfoVertex = function(markerIndex, vertexData) { + for (var i=0; i<vertexData.length; i++) { + this.marker_transform_mat[i*2+0] = vertexData[i][0]; + this.marker_transform_mat[i*2+1] = vertexData[i][1]; + } + return artoolkit.setMarkerInfoVertex(this.id, markerIndex); + }; + + /** + Makes a deep copy of the given marker info. + + @param {Object} markerInfo The marker info object to copy. + @return {Object} The new copy of the marker info. + */ + ARController.prototype.cloneMarkerInfo = function(markerInfo) { + return JSON.parse(JSON.stringify(markerInfo)); + }; + + /** + Get the marker info struct for the given marker index in detected markers. + + Call this.detectMarker first, then use this.getMarkerNum to get the detected marker count. + + The returned object is the global artoolkit.markerInfo object and will be overwritten + by subsequent calls. If you need to hang on to it, create a copy using this.cloneMarkerInfo(); + + Returns undefined if no marker was found. + + @field {number} pattId The index of the marker. + @field {number} pattType The type of the marker. Either AR_MULTI_PATTERN_TYPE_TEMPLATE or AR_MULTI_PATTERN_TYPE_MATRIX. + @field {number} visible 0 or larger if the marker is visible + @field {number} width The width of the marker. + + @param {number} multiMarkerId The multimarker to query. + @param {number} markerIndex The index of the marker to query. + @returns {Object} The markerInfo struct. + */ + ARController.prototype.getMultiEachMarker = function(multiMarkerId, markerIndex) { + if (0 === artoolkit.getMultiEachMarker(this.id, multiMarkerId, markerIndex)) { + return artoolkit.multiEachMarkerInfo; + } + }; + + + /** + Returns the 16-element WebGL transformation matrix used by ARController.process to + pass marker WebGL matrices to event listeners. + + Unique to each ARController. + + @return {Float64Array} The 16-element WebGL transformation matrix used by the ARController. + */ + ARController.prototype.getTransformationMatrix = function() { + return this.transform_mat; + }; + + /** + * Returns the projection matrix computed from camera parameters for the ARController. + * + * @return {Float64Array} The 16-element WebGL camera matrix for the ARController camera parameters. + */ + ARController.prototype.getCameraMatrix = function() { + return this.camera_mat; + }; + + /** + Returns the shared ARToolKit 3x4 marker transformation matrix, used for passing and receiving + marker transforms to/from the Emscripten side. + + @return {Float64Array} The 12-element 3x4 row-major marker transformation matrix used by ARToolKit. + */ + ARController.prototype.getMarkerTransformationMatrix = function() { + return this.marker_transform_mat; + }; + + + /* Setter / Getter Proxies */ + + /** + * Enables or disables debug mode in the tracker. When enabled, a black and white debug + * image is generated during marker detection. The debug image is useful for visualising + * the binarization process and choosing a threshold value. + * @param {number} debug true to enable debug mode, false to disable debug mode + * @see getDebugMode() + */ + ARController.prototype.setDebugMode = function(mode) { + return artoolkit.setDebugMode(this.id, mode); + }; + + /** + * Returns whether debug mode is currently enabled. + * @return true when debug mode is enabled, false when debug mode is disabled + * @see setDebugMode() + */ + ARController.prototype.getDebugMode = function() { + return artoolkit.getDebugMode(this.id); + }; + + /** + Returns the Emscripten HEAP offset to the debug processing image used by ARToolKit. + + @return {number} HEAP offset to the debug processing image. + */ + ARController.prototype.getProcessingImage = function() { + return artoolkit.getProcessingImage(this.id); + } + + /** + Sets the logging level to use by ARToolKit. + + @param + */ + ARController.prototype.setLogLevel = function(mode) { + return artoolkit.setLogLevel(mode); + }; + + ARController.prototype.getLogLevel = function() { + return artoolkit.getLogLevel(); + }; + + ARController.prototype.setMarkerInfoDir = function(markerIndex, dir) { + return artoolkit.setMarkerInfoDir(this.id, markerIndex, dir); + }; + + ARController.prototype.setProjectionNearPlane = function(value) { + return artoolkit.setProjectionNearPlane(this.id, value); + }; + + ARController.prototype.getProjectionNearPlane = function() { + return artoolkit.getProjectionNearPlane(this.id); + }; + + ARController.prototype.setProjectionFarPlane = function(value) { + return artoolkit.setProjectionFarPlane(this.id, value); + }; + + ARController.prototype.getProjectionFarPlane = function() { + return artoolkit.getProjectionFarPlane(this.id); + }; + + + /** + Set the labeling threshold mode (auto/manual). + + @param {number} mode An integer specifying the mode. One of: + AR_LABELING_THRESH_MODE_MANUAL, + AR_LABELING_THRESH_MODE_AUTO_MEDIAN, + AR_LABELING_THRESH_MODE_AUTO_OTSU, + AR_LABELING_THRESH_MODE_AUTO_ADAPTIVE, + AR_LABELING_THRESH_MODE_AUTO_BRACKETING + */ + ARController.prototype.setThresholdMode = function(mode) { + return artoolkit.setThresholdMode(this.id, mode); + }; + + /** + * Gets the current threshold mode used for image binarization. + * @return {number} The current threshold mode + * @see getVideoThresholdMode() + */ + ARController.prototype.getThresholdMode = function() { + return artoolkit.getThresholdMode(this.id); + }; + + /** + Set the labeling threshhold. + + This function forces sets the threshold value. + The default value is AR_DEFAULT_LABELING_THRESH which is 100. + + The current threshold mode is not affected by this call. + Typically, this function is used when labeling threshold mode + is AR_LABELING_THRESH_MODE_MANUAL. + + The threshold value is not relevant if threshold mode is + AR_LABELING_THRESH_MODE_AUTO_ADAPTIVE. + + Background: The labeling threshold is the value which + the AR library uses to differentiate between black and white + portions of an ARToolKit marker. Since the actual brightness, + contrast, and gamma of incoming images can vary signficantly + between different cameras and lighting conditions, this + value typically needs to be adjusted dynamically to a + suitable midpoint between the observed values for black + and white portions of the markers in the image. + + @param {number} thresh An integer in the range [0,255] (inclusive). + */ + ARController.prototype.setThreshold = function(threshold) { + return artoolkit.setThreshold(this.id, threshold); + }; + + /** + Get the current labeling threshold. + + This function queries the current labeling threshold. For, + AR_LABELING_THRESH_MODE_AUTO_MEDIAN, AR_LABELING_THRESH_MODE_AUTO_OTSU, + and AR_LABELING_THRESH_MODE_AUTO_BRACKETING + the threshold value is only valid until the next auto-update. + + The current threshold mode is not affected by this call. + + The threshold value is not relevant if threshold mode is + AR_LABELING_THRESH_MODE_AUTO_ADAPTIVE. + + @return {number} The current threshold value. + */ + ARController.prototype.getThreshold = function() { + return artoolkit.getThreshold(this.id); + }; + + + /** + Set the pattern detection mode + + The pattern detection determines the method by which ARToolKit + matches detected squares in the video image to marker templates + and/or IDs. ARToolKit v4.x can match against pictorial "template" markers, + whose pattern files are created with the mk_patt utility, in either colour + or mono, and additionally can match against 2D-barcode-type "matrix" + markers, which have an embedded marker ID. Two different two-pass modes + are also available, in which a matrix-detection pass is made first, + followed by a template-matching pass. + + @param {number} mode + Options for this field are: + AR_TEMPLATE_MATCHING_COLOR + AR_TEMPLATE_MATCHING_MONO + AR_MATRIX_CODE_DETECTION + AR_TEMPLATE_MATCHING_COLOR_AND_MATRIX + AR_TEMPLATE_MATCHING_MONO_AND_MATRIX + The default mode is AR_TEMPLATE_MATCHING_COLOR. + */ + ARController.prototype.setPatternDetectionMode = function(value) { + return artoolkit.setPatternDetectionMode(this.id, value); + }; + + /** + Returns the current pattern detection mode. + + @return {number} The current pattern detection mode. + */ + ARController.prototype.getPatternDetectionMode = function() { + return artoolkit.getPatternDetectionMode(this.id); + }; + + /** + Set the size and ECC algorithm to be used for matrix code (2D barcode) marker detection. + + When matrix-code (2D barcode) marker detection is enabled (see arSetPatternDetectionMode) + then the size of the barcode pattern and the type of error checking and correction (ECC) + with which the markers were produced can be set via this function. + + This setting is global to a given ARHandle; It is not possible to have two different matrix + code types in use at once. + + @param type The type of matrix code (2D barcode) in use. Options include: + AR_MATRIX_CODE_3x3 + AR_MATRIX_CODE_3x3_HAMMING63 + AR_MATRIX_CODE_3x3_PARITY65 + AR_MATRIX_CODE_4x4 + AR_MATRIX_CODE_4x4_BCH_13_9_3 + AR_MATRIX_CODE_4x4_BCH_13_5_5 + The default mode is AR_MATRIX_CODE_3x3. + */ + ARController.prototype.setMatrixCodeType = function(value) { + return artoolkit.setMatrixCodeType(this.id, value); + }; + + /** + Returns the current matrix code (2D barcode) marker detection type. + + @return {number} The current matrix code type. + */ + ARController.prototype.getMatrixCodeType = function() { + return artoolkit.getMatrixCodeType(this.id); + }; + + /** + Select between detection of black markers and white markers. + + ARToolKit's labelling algorithm can work with both black-bordered + markers on a white background (AR_LABELING_BLACK_REGION) or + white-bordered markers on a black background (AR_LABELING_WHITE_REGION). + This function allows you to specify the type of markers to look for. + Note that this does not affect the pattern-detection algorith + which works on the interior of the marker. + + @param {number} mode + Options for this field are: + AR_LABELING_WHITE_REGION + AR_LABELING_BLACK_REGION + The default mode is AR_LABELING_BLACK_REGION. + */ + ARController.prototype.setLabelingMode = function(value) { + return artoolkit.setLabelingMode(this.id, value); + }; + + /** + Enquire whether detection is looking for black markers or white markers. + + See discussion for setLabelingMode. + + @result {number} The current labeling mode. + */ + ARController.prototype.getLabelingMode = function() { + return artoolkit.getLabelingMode(this.id); + }; + + /** + Set the width/height of the marker pattern space, as a proportion of marker width/height. + + @param {number} pattRatio The the width/height of the marker pattern space, as a proportion of marker + width/height. To set the default, pass AR_PATT_RATIO. + If compatibility with ARToolKit verions 1.0 through 4.4 is required, this value + must be 0.5. + */ + ARController.prototype.setPattRatio = function(value) { + return artoolkit.setPattRatio(this.id, value); + }; + + /** + Returns the current ratio of the marker pattern to the total marker size. + + @return {number} The current pattern ratio. + */ + ARController.prototype.getPattRatio = function() { + return artoolkit.getPattRatio(this.id); + }; + + /** + Set the image processing mode. + + When the image processing mode is AR_IMAGE_PROC_FRAME_IMAGE, + ARToolKit processes all pixels in each incoming image + to locate markers. When the mode is AR_IMAGE_PROC_FIELD_IMAGE, + ARToolKit processes pixels in only every second pixel row and + column. This is useful both for handling images from interlaced + video sources (where alternate lines are assembled from alternate + fields and thus have one field time-difference, resulting in a + "comb" effect) such as Digital Video cameras. + The effective reduction by 75% in the pixels processed also + has utility in accelerating tracking by effectively reducing + the image size to one quarter size, at the cost of pose accuraccy. + + @param {number} mode + Options for this field are: + AR_IMAGE_PROC_FRAME_IMAGE + AR_IMAGE_PROC_FIELD_IMAGE + The default mode is AR_IMAGE_PROC_FRAME_IMAGE. + */ + ARController.prototype.setImageProcMode = function(value) { + return artoolkit.setImageProcMode(this.id, value); + }; + + /** + Get the image processing mode. + + See arSetImageProcMode() for a complete description. + + @return {number} The current image processing mode. + */ + ARController.prototype.getImageProcMode = function() { + return artoolkit.getImageProcMode(this.id); + }; + + + /** + Draw the black and white image and debug markers to the ARController canvas. + + See setDebugMode. + */ + ARController.prototype.debugDraw = function() { + var debugBuffer = new Uint8ClampedArray(Module.HEAPU8.buffer, this._bwpointer, this.framesize); + var id = new ImageData(debugBuffer, this.canvas.width, this.canvas.height) + this.ctx.putImageData(id, 0, 0) + + var marker_num = this.getMarkerNum(); + for (var i=0; i<marker_num; i++) { + this._debugMarker(this.getMarker(i)); + } + }; + + + // private + + ARController.prototype._initialize = function() { + this.id = artoolkit.setup(this.canvas.width, this.canvas.height, this.cameraParam.id); + + var params = artoolkit.frameMalloc; + this.framepointer = params.framepointer; + this.framesize = params.framesize; + + this.dataHeap = new Uint8Array(Module.HEAPU8.buffer, this.framepointer, this.framesize); + + this.camera_mat = new Float64Array(Module.HEAPU8.buffer, params.camera, 16); + this.marker_transform_mat = new Float64Array(Module.HEAPU8.buffer, params.transform, 12); + + this.setProjectionNearPlane(0.1) + this.setProjectionFarPlane(1000); + + var self = this; + setTimeout(function() { + if (self.onload) { + self.onload(); + } + self.dispatchEvent({ + name: 'load', + target: self + }); + }, 1); + }; +/* + ARController.prototype._copyImageToHeap = function(image) { + if (!image) { + image = this.image; + } + + + // if (this.orientation === 'portrait') { + // this.ctx.save(); + // this.ctx.translate(this.canvas.width, 0); + // this.ctx.rotate(Math.PI/2); + // this.ctx.drawImage(image, 0, 0, this.canvas.height, this.canvas.width); // draw video + // this.ctx.restore(); + // } else { + // debugger + // this.ctx.drawImage(image, 0, 0, this.canvas.width, this.canvas.height); // draw video + // } + + + this.ctx.drawImage(image, 0, 0, this.canvas.width, this.canvas.height); // draw video + var imageData = this.ctx.getImageData(0, 0, this.canvas.width, this.canvas.height); + var data = imageData.data; + + if (this.dataHeap) { + this.dataHeap.set( data ); + return true; + } + return false; + }; +*/ + + ARController.prototype._copyImageToHeap = function(image) { + if (!image) { + image = this.image; + } + + if( (image.nodeName === 'IMG' && image.width > image.height ) || + (image.nodeName === 'VIDEO' && image.videoWidth > image.videoHeight) ){ + // if landscape + this.ctx.drawImage(image, 0, 0, this.canvas.width, this.canvas.height); // draw video + }else{ + // if portrait + this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height); + var scale = this.canvas.height / this.canvas.width; + var scaledHeight = this.canvas.width*scale; + var scaledWidth = this.canvas.height*scale; + var marginLeft = ( this.canvas.width - scaledWidth)/2; + this.ctx.drawImage(image, marginLeft, 0, scaledWidth, scaledHeight); // draw video + } + + var imageData = this.ctx.getImageData(0, 0, this.canvas.width, this.canvas.height); + var data = imageData.data; + + if (this.dataHeap) { + this.dataHeap.set( data ); + return true; + } + return false; + }; + + ARController.prototype._debugMarker = function(marker) { + var vertex, pos; + vertex = marker.vertex; + var ctx = this.ctx; + ctx.strokeStyle = 'red'; + + ctx.beginPath() + ctx.moveTo(vertex[0][0], vertex[0][1]) + ctx.lineTo(vertex[1][0], vertex[1][1]) + ctx.stroke(); + + ctx.beginPath() + ctx.moveTo(vertex[2][0], vertex[2][1]) + ctx.lineTo(vertex[3][0], vertex[3][1]) + ctx.stroke() + + ctx.strokeStyle = 'green'; + ctx.beginPath() + ctx.lineTo(vertex[1][0], vertex[1][1]) + ctx.lineTo(vertex[2][0], vertex[2][1]) + ctx.stroke(); + + ctx.beginPath() + ctx.moveTo(vertex[3][0], vertex[3][1]) + ctx.lineTo(vertex[0][0], vertex[0][1]) + ctx.stroke(); + + pos = marker.pos + ctx.beginPath() + ctx.arc(pos[0], pos[1], 8, 0, Math.PI * 2) + ctx.fillStyle = 'red' + ctx.fill() + }; + + + // static + + /** + ARController.getUserMedia gets a device camera video feed and calls the given onSuccess callback with it. + + Tries to start playing the video. Playing the video can fail on Chrome for Android, + so ARController.getUserMedia adds user input event listeners to the window + that try to start playing the video. On success, the event listeners are removed. + + To use ARController.getUserMedia, call it with an object with the onSuccess attribute set to a callback function. + + ARController.getUserMedia({ + onSuccess: function(video) { + console.log("Got video", video); + } + }); + + The configuration object supports the following attributes: + + { + onSuccess : function(video), + onError : function(error), + + width : number | {min: number, ideal: number, max: number}, + height : number | {min: number, ideal: number, max: number}, + + facingMode : 'environment' | 'user' | 'left' | 'right' | { exact: 'environment' | ... } + } + + See https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia for more information about the + width, height and facingMode attributes. + + @param {object} configuration The configuration object. + @return {VideoElement} Returns the created video element. + */ + ARController.getUserMedia = function(configuration) { + var facing = configuration.facingMode || 'environment'; + + var onSuccess = configuration.onSuccess; + var onError = configuration.onError || function(err) { console.error("ARController.getUserMedia", err); }; + + var video = document.createElement('video'); + + var initProgress = function() { + if (this.videoWidth !== 0) { + onSuccess(video); + } + }; + + var readyToPlay = false; + var eventNames = [ + 'touchstart', 'touchend', 'touchmove', 'touchcancel', + 'click', 'mousedown', 'mouseup', 'mousemove', + 'keydown', 'keyup', 'keypress', 'scroll' + ]; + var play = function(ev) { + if (readyToPlay) { + video.play(); + if (!video.paused) { + eventNames.forEach(function(eventName) { + window.removeEventListener(eventName, play, true); + }); + } + } + }; + eventNames.forEach(function(eventName) { + window.addEventListener(eventName, play, true); + }); + + var success = function(stream) { + video.addEventListener('loadedmetadata', initProgress, false); + video.src = window.URL.createObjectURL(stream); + readyToPlay = true; + play(); // Try playing without user input, should work on non-Android Chrome + }; + + var constraints = {}; + var mediaDevicesConstraints = {}; + if (configuration.width) { + mediaDevicesConstraints.width = configuration.width; + if (typeof configuration.width === 'object') { + if (configuration.width.max) { + constraints.maxWidth = configuration.width.max; + } + if (configuration.width.min) { + constraints.minWidth = configuration.width.max; + } + } else { + constraints.maxWidth = configuration.width; + } + } + + if (configuration.height) { + mediaDevicesConstraints.height = configuration.height; + if (typeof configuration.height === 'object') { + if (configuration.height.max) { + constraints.maxHeight = configuration.height.max; + } + if (configuration.height.min) { + constraints.minHeight = configuration.height.max; + } + } else { + constraints.maxHeight = configuration.height; + } + } + + mediaDevicesConstraints.facingMode = facing; + + navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia; + var hdConstraints = { + audio: false, + video: { + mandatory: constraints + } + }; + + if ( false ) { + // if ( navigator.mediaDevices || window.MediaStreamTrack) { + if (navigator.mediaDevices) { + navigator.mediaDevices.getUserMedia({ + audio: false, + video: mediaDevicesConstraints + }).then(success, onError); + } else { + MediaStreamTrack.getSources(function(sources) { + var facingDir = mediaDevicesConstraints.facingMode; + if (facing && facing.exact) { + facingDir = facing.exact; + } + for (var i=0; i<sources.length; i++) { + if (sources[i].kind === 'video' && sources[i].facing === facingDir) { + hdConstraints.video.mandatory.sourceId = sources[i].id; + break; + } + } + if (facing && facing.exact && !hdConstraints.video.mandatory.sourceId) { + onError('Failed to get camera facing the wanted direction'); + } else { + if (navigator.getUserMedia) { + navigator.getUserMedia(hdConstraints, success, onError); + } else { + onError('navigator.getUserMedia is not supported on your browser'); + } + } + }); + } + } else { + if (navigator.getUserMedia) { + navigator.getUserMedia(hdConstraints, success, onError); + } else { + onError('navigator.getUserMedia is not supported on your browser'); + } + } + + return video; + }; + + /** + ARController.getUserMediaARController gets an ARController for the device camera video feed and calls the + given onSuccess callback with it. + + To use ARController.getUserMediaARController, call it with an object with the cameraParam attribute set to + a camera parameter file URL, and the onSuccess attribute set to a callback function. + + ARController.getUserMediaARController({ + cameraParam: 'Data/camera_para.dat', + onSuccess: function(arController, arCameraParam) { + console.log("Got ARController", arController); + console.log("Got ARCameraParam", arCameraParam); + console.log("Got video", arController.image); + } + }); + + The configuration object supports the following attributes: + + { + onSuccess : function(ARController, ARCameraParam), + onError : function(error), + + cameraParam: url, // URL to camera parameters definition file. + maxARVideoSize: number, // Maximum max(width, height) for the AR processing canvas. + + width : number | {min: number, ideal: number, max: number}, + height : number | {min: number, ideal: number, max: number}, + + facingMode : 'environment' | 'user' | 'left' | 'right' | { exact: 'environment' | ... } + } + + See https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia for more information about the + width, height and facingMode attributes. + + The orientation attribute of the returned ARController is set to "portrait" if the userMedia video has larger + height than width. Otherwise it's set to "landscape". The videoWidth and videoHeight attributes of the arController + are set to be always in landscape configuration so that width is larger than height. + + @param {object} configuration The configuration object. + @return {VideoElement} Returns the created video element. + */ + ARController.getUserMediaARController = function(configuration) { + var obj = {}; + for (var i in configuration) { + obj[i] = configuration[i]; + } + var onSuccess = configuration.onSuccess; + var cameraParamURL = configuration.cameraParam; + + obj.onSuccess = function() { + new ARCameraParam(cameraParamURL, function() { + var arCameraParam = this; + var maxSize = configuration.maxARVideoSize || Math.max(video.videoWidth, video.videoHeight); + var f = maxSize / Math.max(video.videoWidth, video.videoHeight); + var w = f * video.videoWidth; + var h = f * video.videoHeight; + if (video.videoWidth < video.videoHeight) { + var tmp = w; + w = h; + h = tmp; + } + var arController = new ARController(w, h, arCameraParam); + arController.image = video; + if (video.videoWidth < video.videoHeight) { + arController.orientation = 'portrait'; + arController.videoWidth = video.videoHeight; + arController.videoHeight = video.videoWidth; + } else { + arController.orientation = 'landscape'; + arController.videoWidth = video.videoWidth; + arController.videoHeight = video.videoHeight; + } + onSuccess(arController, arCameraParam); + }, function(err) { + console.error("ARController: Failed to load ARCameraParam", err); + }); + }; + + var video = this.getUserMedia(obj); + return video; + }; + + + /** + ARCameraParam is used for loading AR camera parameters for use with ARController. + Use by passing in an URL and a callback function. + + var camera = new ARCameraParam('Data/camera_para.dat', function() { + console.log('loaded camera', this.id); + }, + function(err) { + console.log('failed to load camera', err); + }); + + @exports ARCameraParam + @constructor + + @param {string} src URL to load camera parameters from. + @param {string} onload Onload callback to be called on successful parameter loading. + @param {string} onerror Error callback to called when things don't work out. + */ + var ARCameraParam = function(src, onload, onerror) { + this.id = -1; + this._src = ''; + this.complete = false; + this.onload = onload; + this.onerror = onerror; + if (src) { + this.load(src); + } + }; + + /** + Loads the given URL as camera parameters definition file into this ARCameraParam. + + Can only be called on an unloaded ARCameraParam instance. + + @param {string} src URL to load. + */ + ARCameraParam.prototype.load = function(src) { + if (this._src !== '') { + throw("ARCameraParam: Trying to load camera parameters twice.") + } + this._src = src; + if (src) { + var self = this; + artoolkit.loadCamera(src, function(id) { + self.id = id; + self.complete = true; + self.onload(); + }, function(err) { + self.onerror(err); + }); + } + }; + + Object.defineProperty(ARCameraParam.prototype, 'src', { + set: function(src) { + this.load(src); + }, + get: function() { + return this._src; + } + }); + + /** + Destroys the camera parameter and frees associated Emscripten resources. + + */ + ARCameraParam.prototype.dispose = function() { + if (this.id !== -1) { + artoolkit.deleteCamera(this.id); + } + this.id = -1; + this._src = ''; + this.complete = false; + }; + + + + // ARToolKit exported JS API + // + var artoolkit = { + + UNKNOWN_MARKER: -1, + PATTERN_MARKER: 0, + BARCODE_MARKER: 1, + + loadCamera: loadCamera, + + addMarker: addMarker, + addMultiMarker: addMultiMarker, + + }; + + var FUNCTIONS = [ + 'setup', + 'teardown', + + 'setLogLevel', + 'getLogLevel', + + 'setDebugMode', + 'getDebugMode', + + 'getProcessingImage', + + 'setMarkerInfoDir', + 'setMarkerInfoVertex', + + 'getTransMatSquare', + 'getTransMatSquareCont', + + 'getTransMatMultiSquare', + 'getTransMatMultiSquareRobust', + + 'getMultiMarkerNum', + 'getMultiMarkerCount', + + 'detectMarker', + 'getMarkerNum', + + 'getMarker', + 'getMultiEachMarker', + + 'setProjectionNearPlane', + 'getProjectionNearPlane', + + 'setProjectionFarPlane', + 'getProjectionFarPlane', + + 'setThresholdMode', + 'getThresholdMode', + + 'setThreshold', + 'getThreshold', + + 'setPatternDetectionMode', + 'getPatternDetectionMode', + + 'setMatrixCodeType', + 'getMatrixCodeType', + + 'setLabelingMode', + 'getLabelingMode', + + 'setPattRatio', + 'getPattRatio', + + 'setImageProcMode', + 'getImageProcMode', + ]; + + function runWhenLoaded() { + FUNCTIONS.forEach(function(n) { + artoolkit[n] = Module[n]; + }) + + for (var m in Module) { + if (m.match(/^AR/)) + artoolkit[m] = Module[m]; + } + } + + var marker_count = 0; + function addMarker(arId, url, callback) { + var filename = '/marker_' + marker_count++; + ajax(url, filename, function() { + var id = Module._addMarker(arId, filename); + if (callback) callback(id); + }); + } + + function bytesToString(array) { + return String.fromCharCode.apply(String, array); + } + + function parseMultiFile(bytes) { + var str = bytesToString(bytes); + + var lines = str.split('\n'); + + var files = []; + + var state = 0; // 0 - read, + var markers = 0; + + lines.forEach(function(line) { + line = line.trim(); + if (!line || line.startsWith('#')) return; + + switch (state) { + case 0: + markers = +line; + state = 1; + return; + case 1: // filename or barcode + if (!line.match(/^\d+$/)) { + files.push(line); + } + case 2: // width + case 3: // matrices + case 4: + state++; + return; + case 5: + state = 1; + return; + } + }); + + return files; + } + + var multi_marker_count = 0; + + function addMultiMarker(arId, url, callback) { + var filename = '/multi_marker_' + multi_marker_count++; + ajax(url, filename, function(bytes) { + var files = parseMultiFile(bytes); + + function ok() { + var markerID = Module._addMultiMarker(arId, filename); + var markerNum = Module.getMultiMarkerNum(arId, markerID); + if (callback) callback(markerID, markerNum); + } + + if (!files.length) return ok(); + + var path = url.split('/').slice(0, -1).join('/') + files = files.map(function(file) { + // FIXME super kludge - remove it + // console.assert(file !== '') + if( file === 'patt.hiro' || file === 'patt.kanji' || file === 'patt2.hiro' || file === 'patt2.kanji' ){ + // debugger + return ['http://127.0.0.1:8080/data/data/' + file, file] + } + return [path + '/' + file, file] + }) + ajaxDependencies(files, ok); + }); + } + + var camera_count = 0; + function loadCamera(url, callback) { + var filename = '/camera_param_' + camera_count++; + var writeCallback = function() { + var id = Module._loadCamera(filename); + if (callback) callback(id); + }; + if (typeof url === 'object') { // Maybe it's a byte array + writeByteArrayToFS(filename, url, writeCallback); + } else if (url.indexOf("\n") > -1) { // Or a string with the camera param + writeStringToFS(filename, url, writeCallback); + } else { + ajax(url, filename, writeCallback); + } + } + + + // transfer image + + function writeStringToFS(target, string, callback) { + var byteArray = new Uint8Array(string.length); + for (var i=0; i<byteArray.length; i++) { + byteArray[i] = string.charCodeAt(i) & 0xff; + } + writeByteArrayToFS(target, byteArray, callback); + } + + function writeByteArrayToFS(target, byteArray, callback) { + FS.writeFile(target, byteArray, { encoding: 'binary' }); + // console.log('FS written', target); + + callback(byteArray); + } + + // Eg. + // ajax('../bin/Data2/markers.dat', '/Data2/markers.dat', callback); + // ajax('../bin/Data/patt.hiro', '/patt.hiro', callback); + + function ajax(url, target, callback) { + var oReq = new XMLHttpRequest(); + oReq.open('GET', url, true); + oReq.responseType = 'arraybuffer'; // blob arraybuffer + + oReq.onload = function(oEvent) { + // console.log('ajax done for ', url); + var arrayBuffer = oReq.response; + var byteArray = new Uint8Array(arrayBuffer); + // console.log('writeByteArrayToFS', target, byteArray.length, 'byte. url', url) + writeByteArrayToFS(target, byteArray, callback); + }; + + oReq.send(); + } + + function ajaxDependencies(files, callback) { + var next = files.pop(); + if (next) { + ajax(next[0], next[1], function() { + ajaxDependencies(files, callback); + }); + } else { + callback(); + } + } + + /* Exports */ + window.artoolkit = artoolkit; + window.ARController = ARController; + window.ARCameraParam = ARCameraParam; + + if (window.Module) { + runWhenLoaded(); + } else { + window.Module = { + onRuntimeInitialized: function() { + runWhenLoaded(); + } + }; + } + +})(); +/* +Copyright (c) 2011 Juan Mellado + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + +/* +References: +- "ArUco: a minimal library for Augmented Reality applications based on OpenCv" +http://www.uco.es/investiga/grupos/ava/node/26 +*/ + +var AR = AR || {}; + +AR.Marker = function(id, corners){ + this.id = id; + this.corners = corners; +}; + +AR.Detector = function(){ + this.grey = new CV.Image(); + this.thres = new CV.Image(); + this.homography = new CV.Image(); + this.binary = []; + this.contours = []; + this.polys = []; + this.candidates = []; +}; + +AR.Detector.prototype.detect = function(image){ + CV.grayscale(image, this.grey); + CV.adaptiveThreshold(this.grey, this.thres, 2, 7); + + this.contours = CV.findContours(this.thres, this.binary); + + this.candidates = this.findCandidates(this.contours, image.width * 0.20, 0.05, 10); + this.candidates = this.clockwiseCorners(this.candidates); + this.candidates = this.notTooNear(this.candidates, 10); + + return this.findMarkers(this.grey, this.candidates, 49); +}; + +AR.Detector.prototype.findCandidates = function(contours, minSize, epsilon, minLength){ + var candidates = [], len = contours.length, contour, poly, i; + + this.polys = []; + + for (i = 0; i < len; ++ i){ + contour = contours[i]; + + if (contour.length >= minSize){ + poly = CV.approxPolyDP(contour, contour.length * epsilon); + + this.polys.push(poly); + + if ( (4 === poly.length) && ( CV.isContourConvex(poly) ) ){ + + if ( CV.minEdgeLength(poly) >= minLength){ + candidates.push(poly); + } + } + } + } + + return candidates; +}; + +AR.Detector.prototype.clockwiseCorners = function(candidates){ + var len = candidates.length, dx1, dx2, dy1, dy2, swap, i; + + for (i = 0; i < len; ++ i){ + dx1 = candidates[i][1].x - candidates[i][0].x; + dy1 = candidates[i][1].y - candidates[i][0].y; + dx2 = candidates[i][2].x - candidates[i][0].x; + dy2 = candidates[i][2].y - candidates[i][0].y; + + if ( (dx1 * dy2 - dy1 * dx2) < 0){ + swap = candidates[i][1]; + candidates[i][1] = candidates[i][3]; + candidates[i][3] = swap; + } + } + + return candidates; +}; + +AR.Detector.prototype.notTooNear = function(candidates, minDist){ + var notTooNear = [], len = candidates.length, dist, dx, dy, i, j, k; + + for (i = 0; i < len; ++ i){ + + for (j = i + 1; j < len; ++ j){ + dist = 0; + + for (k = 0; k < 4; ++ k){ + dx = candidates[i][k].x - candidates[j][k].x; + dy = candidates[i][k].y - candidates[j][k].y; + + dist += dx * dx + dy * dy; + } + + if ( (dist / 4) < (minDist * minDist) ){ + + if ( CV.perimeter( candidates[i] ) < CV.perimeter( candidates[j] ) ){ + candidates[i].tooNear = true; + }else{ + candidates[j].tooNear = true; + } + } + } + } + + for (i = 0; i < len; ++ i){ + if ( !candidates[i].tooNear ){ + notTooNear.push( candidates[i] ); + } + } + + return notTooNear; +}; + +AR.Detector.prototype.findMarkers = function(imageSrc, candidates, warpSize){ + var markers = [], len = candidates.length, candidate, marker, i; + + for (i = 0; i < len; ++ i){ + candidate = candidates[i]; + + CV.warp(imageSrc, this.homography, candidate, warpSize); + + CV.threshold(this.homography, this.homography, CV.otsu(this.homography) ); + + marker = this.getMarker(this.homography, candidate); + if (marker){ + markers.push(marker); + } + } + + return markers; +}; + +AR.Detector.prototype.getMarker = function(imageSrc, candidate){ + var width = (imageSrc.width / 7) >>> 0, + minZero = (width * width) >> 1, + bits = [], rotations = [], distances = [], + square, pair, inc, i, j; + + for (i = 0; i < 7; ++ i){ + inc = (0 === i || 6 === i)? 1: 6; + + for (j = 0; j < 7; j += inc){ + square = {x: j * width, y: i * width, width: width, height: width}; + if ( CV.countNonZero(imageSrc, square) > minZero){ + return null; + } + } + } + + for (i = 0; i < 5; ++ i){ + bits[i] = []; + + for (j = 0; j < 5; ++ j){ + square = {x: (j + 1) * width, y: (i + 1) * width, width: width, height: width}; + + bits[i][j] = CV.countNonZero(imageSrc, square) > minZero? 1: 0; + } + } + + rotations[0] = bits; + distances[0] = this.hammingDistance( rotations[0] ); + + pair = {first: distances[0], second: 0}; + + for (i = 1; i < 4; ++ i){ + rotations[i] = this.rotate( rotations[i - 1] ); + distances[i] = this.hammingDistance( rotations[i] ); + + if (distances[i] < pair.first){ + pair.first = distances[i]; + pair.second = i; + } + } + + if (0 !== pair.first){ + return null; + } + + return new AR.Marker( + this.mat2id( rotations[pair.second] ), + this.rotate2(candidate, 4 - pair.second) + ); +}; + +AR.Detector.prototype.hammingDistance = function(bits){ + var ids = [ [1,0,0,0,0], [1,0,1,1,1], [0,1,0,0,1], [0,1,1,1,0] ], + dist = 0, sum, minSum, i, j, k; + + for (i = 0; i < 5; ++ i){ + minSum = Infinity; + + for (j = 0; j < 4; ++ j){ + sum = 0; + + for (k = 0; k < 5; ++ k){ + sum += bits[i][k] === ids[j][k]? 0: 1; + } + + if (sum < minSum){ + minSum = sum; + } + } + + dist += minSum; + } + + return dist; +}; + +AR.Detector.prototype.mat2id = function(bits){ + var id = 0, i; + + for (i = 0; i < 5; ++ i){ + id <<= 1; + id |= bits[i][1]; + id <<= 1; + id |= bits[i][3]; + } + + return id; +}; + +AR.Detector.prototype.rotate = function(src){ + var dst = [], len = src.length, i, j; + + for (i = 0; i < len; ++ i){ + dst[i] = []; + for (j = 0; j < src[i].length; ++ j){ + dst[i][j] = src[src[i].length - j - 1][i]; + } + } + + return dst; +}; + +AR.Detector.prototype.rotate2 = function(src, rotation){ + var dst = [], len = src.length, i; + + for (i = 0; i < len; ++ i){ + dst[i] = src[ (rotation + i) % len ]; + } + + return dst; +}; +/* +Copyright (c) 2011 Juan Mellado + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + +/* +References: +- "OpenCV: Open Computer Vision Library" +http://sourceforge.net/projects/opencvlibrary/ +- "Stack Blur: Fast But Goodlooking" +http://incubator.quasimondo.com/processing/fast_blur_deluxe.php +*/ + +var CV = CV || {}; + +CV.Image = function(width, height, data){ + this.width = width || 0; + this.height = height || 0; + this.data = data || []; +}; + +CV.grayscale = function(imageSrc, imageDst){ + var src = imageSrc.data, dst = imageDst.data, len = src.length, + i = 0, j = 0; + + for (; i < len; i += 4){ + dst[j ++] = + (src[i] * 0.299 + src[i + 1] * 0.587 + src[i + 2] * 0.114 + 0.5) & 0xff; + } + + imageDst.width = imageSrc.width; + imageDst.height = imageSrc.height; + + return imageDst; +}; + +CV.threshold = function(imageSrc, imageDst, threshold){ + var src = imageSrc.data, dst = imageDst.data, + len = src.length, tab = [], i; + + for (i = 0; i < 256; ++ i){ + tab[i] = i <= threshold? 0: 255; + } + + for (i = 0; i < len; ++ i){ + dst[i] = tab[ src[i] ]; + } + + imageDst.width = imageSrc.width; + imageDst.height = imageSrc.height; + + return imageDst; +}; + +CV.adaptiveThreshold = function(imageSrc, imageDst, kernelSize, threshold){ + var src = imageSrc.data, dst = imageDst.data, len = src.length, tab = [], i; + + CV.stackBoxBlur(imageSrc, imageDst, kernelSize); + + for (i = 0; i < 768; ++ i){ + tab[i] = (i - 255 <= -threshold)? 255: 0; + } + + for (i = 0; i < len; ++ i){ + dst[i] = tab[ src[i] - dst[i] + 255 ]; + } + + imageDst.width = imageSrc.width; + imageDst.height = imageSrc.height; + + return imageDst; +}; + +CV.otsu = function(imageSrc){ + var src = imageSrc.data, len = src.length, hist = [], + threshold = 0, sum = 0, sumB = 0, wB = 0, wF = 0, max = 0, + mu, between, i; + + for (i = 0; i < 256; ++ i){ + hist[i] = 0; + } + + for (i = 0; i < len; ++ i){ + hist[ src[i] ] ++; + } + + for (i = 0; i < 256; ++ i){ + sum += hist[i] * i; + } + + for (i = 0; i < 256; ++ i){ + wB += hist[i]; + if (0 !== wB){ + + wF = len - wB; + if (0 === wF){ + break; + } + + sumB += hist[i] * i; + + mu = (sumB / wB) - ( (sum - sumB) / wF ); + + between = wB * wF * mu * mu; + + if (between > max){ + max = between; + threshold = i; + } + } + } + + return threshold; +}; + +CV.stackBoxBlurMult = +[1, 171, 205, 293, 57, 373, 79, 137, 241, 27, 391, 357, 41, 19, 283, 265]; + +CV.stackBoxBlurShift = +[0, 9, 10, 11, 9, 12, 10, 11, 12, 9, 13, 13, 10, 9, 13, 13]; + +CV.BlurStack = function(){ + this.color = 0; + this.next = null; +}; + +CV.stackBoxBlur = function(imageSrc, imageDst, kernelSize){ + var src = imageSrc.data, dst = imageDst.data, + height = imageSrc.height, width = imageSrc.width, + heightMinus1 = height - 1, widthMinus1 = width - 1, + size = kernelSize + kernelSize + 1, radius = kernelSize + 1, + mult = CV.stackBoxBlurMult[kernelSize], + shift = CV.stackBoxBlurShift[kernelSize], + stack, stackStart, color, sum, pos, start, p, x, y, i; + + stack = stackStart = new CV.BlurStack(); + for (i = 1; i < size; ++ i){ + stack = stack.next = new CV.BlurStack(); + } + stack.next = stackStart; + + pos = 0; + + for (y = 0; y < height; ++ y){ + start = pos; + + color = src[pos]; + sum = radius * color; + + stack = stackStart; + for (i = 0; i < radius; ++ i){ + stack.color = color; + stack = stack.next; + } + for (i = 1; i < radius; ++ i){ + stack.color = src[pos + i]; + sum += stack.color; + stack = stack.next; + } + + stack = stackStart; + for (x = 0; x < width; ++ x){ + dst[pos ++] = (sum * mult) >>> shift; + + p = x + radius; + p = start + (p < widthMinus1? p: widthMinus1); + sum -= stack.color - src[p]; + + stack.color = src[p]; + stack = stack.next; + } + } + + for (x = 0; x < width; ++ x){ + pos = x; + start = pos + width; + + color = dst[pos]; + sum = radius * color; + + stack = stackStart; + for (i = 0; i < radius; ++ i){ + stack.color = color; + stack = stack.next; + } + for (i = 1; i < radius; ++ i){ + stack.color = dst[start]; + sum += stack.color; + stack = stack.next; + + start += width; + } + + stack = stackStart; + for (y = 0; y < height; ++ y){ + dst[pos] = (sum * mult) >>> shift; + + p = y + radius; + p = x + ( (p < heightMinus1? p: heightMinus1) * width ); + sum -= stack.color - dst[p]; + + stack.color = dst[p]; + stack = stack.next; + + pos += width; + } + } + + return imageDst; +}; + +CV.gaussianBlur = function(imageSrc, imageDst, imageMean, kernelSize){ + var kernel = CV.gaussianKernel(kernelSize); + + imageDst.width = imageSrc.width; + imageDst.height = imageSrc.height; + + imageMean.width = imageSrc.width; + imageMean.height = imageSrc.height; + + CV.gaussianBlurFilter(imageSrc, imageMean, kernel, true); + CV.gaussianBlurFilter(imageMean, imageDst, kernel, false); + + return imageDst; +}; + +CV.gaussianBlurFilter = function(imageSrc, imageDst, kernel, horizontal){ + var src = imageSrc.data, dst = imageDst.data, + height = imageSrc.height, width = imageSrc.width, + pos = 0, limit = kernel.length >> 1, + cur, value, i, j, k; + + for (i = 0; i < height; ++ i){ + + for (j = 0; j < width; ++ j){ + value = 0.0; + + for (k = -limit; k <= limit; ++ k){ + + if (horizontal){ + cur = pos + k; + if (j + k < 0){ + cur = pos; + } + else if (j + k >= width){ + cur = pos; + } + }else{ + cur = pos + (k * width); + if (i + k < 0){ + cur = pos; + } + else if (i + k >= height){ + cur = pos; + } + } + + value += kernel[limit + k] * src[cur]; + } + + dst[pos ++] = horizontal? value: (value + 0.5) & 0xff; + } + } + + return imageDst; +}; + +CV.gaussianKernel = function(kernelSize){ + var tab = + [ [1], + [0.25, 0.5, 0.25], + [0.0625, 0.25, 0.375, 0.25, 0.0625], + [0.03125, 0.109375, 0.21875, 0.28125, 0.21875, 0.109375, 0.03125] ], + kernel = [], center, sigma, scale2X, sum, x, i; + + if ( (kernelSize <= 7) && (kernelSize % 2 === 1) ){ + kernel = tab[kernelSize >> 1]; + }else{ + center = (kernelSize - 1.0) * 0.5; + sigma = 0.8 + (0.3 * (center - 1.0) ); + scale2X = -0.5 / (sigma * sigma); + sum = 0.0; + for (i = 0; i < kernelSize; ++ i){ + x = i - center; + sum += kernel[i] = Math.exp(scale2X * x * x); + } + sum = 1 / sum; + for (i = 0; i < kernelSize; ++ i){ + kernel[i] *= sum; + } + } + + return kernel; +}; + +CV.findContours = function(imageSrc, binary){ + var width = imageSrc.width, height = imageSrc.height, contours = [], + src, deltas, pos, pix, nbd, outer, hole, i, j; + + src = CV.binaryBorder(imageSrc, binary); + + deltas = CV.neighborhoodDeltas(width + 2); + + pos = width + 3; + nbd = 1; + + for (i = 0; i < height; ++ i, pos += 2){ + + for (j = 0; j < width; ++ j, ++ pos){ + pix = src[pos]; + + if (0 !== pix){ + outer = hole = false; + + if (1 === pix && 0 === src[pos - 1]){ + outer = true; + } + else if (pix >= 1 && 0 === src[pos + 1]){ + hole = true; + } + + if (outer || hole){ + ++ nbd; + + contours.push( CV.borderFollowing(src, pos, nbd, {x: j, y: i}, hole, deltas) ); + } + } + } + } + + return contours; +}; + +CV.borderFollowing = function(src, pos, nbd, point, hole, deltas){ + var contour = [], pos1, pos3, pos4, s, s_end, s_prev; + + contour.hole = hole; + + s = s_end = hole? 0: 4; + do{ + s = (s - 1) & 7; + pos1 = pos + deltas[s]; + if (src[pos1] !== 0){ + break; + } + }while(s !== s_end); + + if (s === s_end){ + src[pos] = -nbd; + contour.push( {x: point.x, y: point.y} ); + + }else{ + pos3 = pos; + s_prev = s ^ 4; + + while(true){ + s_end = s; + + do{ + pos4 = pos3 + deltas[++ s]; + }while(src[pos4] === 0); + + s &= 7; + + if ( ( (s - 1) >>> 0) < (s_end >>> 0) ){ + src[pos3] = -nbd; + } + else if (src[pos3] === 1){ + src[pos3] = nbd; + } + + contour.push( {x: point.x, y: point.y} ); + + s_prev = s; + + point.x += CV.neighborhood[s][0]; + point.y += CV.neighborhood[s][1]; + + if ( (pos4 === pos) && (pos3 === pos1) ){ + break; + } + + pos3 = pos4; + s = (s + 4) & 7; + } + } + + return contour; +}; + +CV.neighborhood = +[ [1, 0], [1, -1], [0, -1], [-1, -1], [-1, 0], [-1, 1], [0, 1], [1, 1] ]; + +CV.neighborhoodDeltas = function(width){ + var deltas = [], len = CV.neighborhood.length, i = 0; + + for (; i < len; ++ i){ + deltas[i] = CV.neighborhood[i][0] + (CV.neighborhood[i][1] * width); + } + + return deltas.concat(deltas); +}; + +CV.approxPolyDP = function(contour, epsilon){ + var slice = {start_index: 0, end_index: 0}, + right_slice = {start_index: 0, end_index: 0}, + poly = [], stack = [], len = contour.length, + pt, start_pt, end_pt, dist, max_dist, le_eps, + dx, dy, i, j, k; + + epsilon *= epsilon; + + k = 0; + + for (i = 0; i < 3; ++ i){ + max_dist = 0; + + k = (k + right_slice.start_index) % len; + start_pt = contour[k]; + if (++ k === len) {k = 0;} + + for (j = 1; j < len; ++ j){ + pt = contour[k]; + if (++ k === len) {k = 0;} + + dx = pt.x - start_pt.x; + dy = pt.y - start_pt.y; + dist = dx * dx + dy * dy; + + if (dist > max_dist){ + max_dist = dist; + right_slice.start_index = j; + } + } + } + + if (max_dist <= epsilon){ + poly.push( {x: start_pt.x, y: start_pt.y} ); + + }else{ + slice.start_index = k; + slice.end_index = (right_slice.start_index += slice.start_index); + + right_slice.start_index -= right_slice.start_index >= len? len: 0; + right_slice.end_index = slice.start_index; + if (right_slice.end_index < right_slice.start_index){ + right_slice.end_index += len; + } + + stack.push( {start_index: right_slice.start_index, end_index: right_slice.end_index} ); + stack.push( {start_index: slice.start_index, end_index: slice.end_index} ); + } + + while(stack.length !== 0){ + slice = stack.pop(); + + end_pt = contour[slice.end_index % len]; + start_pt = contour[k = slice.start_index % len]; + if (++ k === len) {k = 0;} + + if (slice.end_index <= slice.start_index + 1){ + le_eps = true; + + }else{ + max_dist = 0; + + dx = end_pt.x - start_pt.x; + dy = end_pt.y - start_pt.y; + + for (i = slice.start_index + 1; i < slice.end_index; ++ i){ + pt = contour[k]; + if (++ k === len) {k = 0;} + + dist = Math.abs( (pt.y - start_pt.y) * dx - (pt.x - start_pt.x) * dy); + + if (dist > max_dist){ + max_dist = dist; + right_slice.start_index = i; + } + } + + le_eps = max_dist * max_dist <= epsilon * (dx * dx + dy * dy); + } + + if (le_eps){ + poly.push( {x: start_pt.x, y: start_pt.y} ); + + }else{ + right_slice.end_index = slice.end_index; + slice.end_index = right_slice.start_index; + + stack.push( {start_index: right_slice.start_index, end_index: right_slice.end_index} ); + stack.push( {start_index: slice.start_index, end_index: slice.end_index} ); + } + } + + return poly; +}; + +CV.warp = function(imageSrc, imageDst, contour, warpSize){ + var src = imageSrc.data, dst = imageDst.data, + width = imageSrc.width, height = imageSrc.height, + pos = 0, + sx1, sx2, dx1, dx2, sy1, sy2, dy1, dy2, p1, p2, p3, p4, + m, r, s, t, u, v, w, x, y, i, j; + + m = CV.getPerspectiveTransform(contour, warpSize - 1); + + r = m[8]; + s = m[2]; + t = m[5]; + + for (i = 0; i < warpSize; ++ i){ + r += m[7]; + s += m[1]; + t += m[4]; + + u = r; + v = s; + w = t; + + for (j = 0; j < warpSize; ++ j){ + u += m[6]; + v += m[0]; + w += m[3]; + + x = v / u; + y = w / u; + + sx1 = x >>> 0; + sx2 = (sx1 === width - 1)? sx1: sx1 + 1; + dx1 = x - sx1; + dx2 = 1.0 - dx1; + + sy1 = y >>> 0; + sy2 = (sy1 === height - 1)? sy1: sy1 + 1; + dy1 = y - sy1; + dy2 = 1.0 - dy1; + + p1 = p2 = sy1 * width; + p3 = p4 = sy2 * width; + + dst[pos ++] = + (dy2 * (dx2 * src[p1 + sx1] + dx1 * src[p2 + sx2]) + + dy1 * (dx2 * src[p3 + sx1] + dx1 * src[p4 + sx2]) ) & 0xff; + + } + } + + imageDst.width = warpSize; + imageDst.height = warpSize; + + return imageDst; +}; + +CV.getPerspectiveTransform = function(src, size){ + var rq = CV.square2quad(src); + + rq[0] /= size; + rq[1] /= size; + rq[3] /= size; + rq[4] /= size; + rq[6] /= size; + rq[7] /= size; + + return rq; +}; + +CV.square2quad = function(src){ + var sq = [], px, py, dx1, dx2, dy1, dy2, den; + + px = src[0].x - src[1].x + src[2].x - src[3].x; + py = src[0].y - src[1].y + src[2].y - src[3].y; + + if (0 === px && 0 === py){ + sq[0] = src[1].x - src[0].x; + sq[1] = src[2].x - src[1].x; + sq[2] = src[0].x; + sq[3] = src[1].y - src[0].y; + sq[4] = src[2].y - src[1].y; + sq[5] = src[0].y; + sq[6] = 0; + sq[7] = 0; + sq[8] = 1; + + }else{ + dx1 = src[1].x - src[2].x; + dx2 = src[3].x - src[2].x; + dy1 = src[1].y - src[2].y; + dy2 = src[3].y - src[2].y; + den = dx1 * dy2 - dx2 * dy1; + + sq[6] = (px * dy2 - dx2 * py) / den; + sq[7] = (dx1 * py - px * dy1) / den; + sq[8] = 1; + sq[0] = src[1].x - src[0].x + sq[6] * src[1].x; + sq[1] = src[3].x - src[0].x + sq[7] * src[3].x; + sq[2] = src[0].x; + sq[3] = src[1].y - src[0].y + sq[6] * src[1].y; + sq[4] = src[3].y - src[0].y + sq[7] * src[3].y; + sq[5] = src[0].y; + } + + return sq; +}; + +CV.isContourConvex = function(contour){ + var orientation = 0, convex = true, + len = contour.length, i = 0, j = 0, + cur_pt, prev_pt, dxdy0, dydx0, dx0, dy0, dx, dy; + + prev_pt = contour[len - 1]; + cur_pt = contour[0]; + + dx0 = cur_pt.x - prev_pt.x; + dy0 = cur_pt.y - prev_pt.y; + + for (; i < len; ++ i){ + if (++ j === len) {j = 0;} + + prev_pt = cur_pt; + cur_pt = contour[j]; + + dx = cur_pt.x - prev_pt.x; + dy = cur_pt.y - prev_pt.y; + dxdy0 = dx * dy0; + dydx0 = dy * dx0; + + orientation |= dydx0 > dxdy0? 1: (dydx0 < dxdy0? 2: 3); + + if (3 === orientation){ + convex = false; + break; + } + + dx0 = dx; + dy0 = dy; + } + + return convex; +}; + +CV.perimeter = function(poly){ + var len = poly.length, i = 0, j = len - 1, + p = 0.0, dx, dy; + + for (; i < len; j = i ++){ + dx = poly[i].x - poly[j].x; + dy = poly[i].y - poly[j].y; + + p += Math.sqrt(dx * dx + dy * dy) ; + } + + return p; +}; + +CV.minEdgeLength = function(poly){ + var len = poly.length, i = 0, j = len - 1, + min = Infinity, d, dx, dy; + + for (; i < len; j = i ++){ + dx = poly[i].x - poly[j].x; + dy = poly[i].y - poly[j].y; + + d = dx * dx + dy * dy; + + if (d < min){ + min = d; + } + } + + return Math.sqrt(min); +}; + +CV.countNonZero = function(imageSrc, square){ + var src = imageSrc.data, height = square.height, width = square.width, + pos = square.x + (square.y * imageSrc.width), + span = imageSrc.width - width, + nz = 0, i, j; + + for (i = 0; i < height; ++ i){ + + for (j = 0; j < width; ++ j){ + + if ( 0 !== src[pos ++] ){ + ++ nz; + } + } + + pos += span; + } + + return nz; +}; + +CV.binaryBorder = function(imageSrc, dst){ + var src = imageSrc.data, height = imageSrc.height, width = imageSrc.width, + posSrc = 0, posDst = 0, i, j; + + for (j = -2; j < width; ++ j){ + dst[posDst ++] = 0; + } + + for (i = 0; i < height; ++ i){ + dst[posDst ++] = 0; + + for (j = 0; j < width; ++ j){ + dst[posDst ++] = (0 === src[posSrc ++]? 0: 1); + } + + dst[posDst ++] = 0; + } + + for (j = -2; j < width; ++ j){ + dst[posDst ++] = 0; + } + + return dst; +}; +/* +Copyright (c) 2012 Juan Mellado + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + +/* +References: +- "Iterative Pose Estimation using Coplanar Feature Points" +Denis Oberkampf, Daniel F. DeMenthon, Larry S. Davis +http://www.cfar.umd.edu/~daniel/daniel_papersfordownload/CoplanarPts.pdf +*/ + +var POS = POS || {}; + +POS.Posit = function(modelSize, focalLength){ + this.objectPoints = this.buildModel(modelSize); + this.focalLength = focalLength; + + this.objectVectors = []; + this.objectNormal = []; + this.objectMatrix = [[],[],[]]; + + this.init(); +}; + +POS.Posit.prototype.buildModel = function(modelSize){ + var half = modelSize / 2.0; + + return [ + [-half, half, 0.0], + [ half, half, 0.0], + [ half, -half, 0.0], + [-half, -half, 0.0] + ]; +}; + +POS.Posit.prototype.init = function(){ + var np = this.objectPoints.length, + vectors = [], n = [], len = 0.0, row = 2, i; + + for (i = 0; i < np; ++ i){ + this.objectVectors[i] = [this.objectPoints[i][0] - this.objectPoints[0][0], + this.objectPoints[i][1] - this.objectPoints[0][1], + this.objectPoints[i][2] - this.objectPoints[0][2]]; + + vectors[i] = [this.objectVectors[i][0], + this.objectVectors[i][1], + this.objectVectors[i][2]]; + } + + while(0.0 === len){ + n[0] = this.objectVectors[1][1] * this.objectVectors[row][2] - + this.objectVectors[1][2] * this.objectVectors[row][1]; + n[1] = this.objectVectors[1][2] * this.objectVectors[row][0] - + this.objectVectors[1][0] * this.objectVectors[row][2]; + n[2] = this.objectVectors[1][0] * this.objectVectors[row][1] - + this.objectVectors[1][1] * this.objectVectors[row][0]; + + len = Math.sqrt(n[0] * n[0] + n[1] * n[1] + n[2] * n[2]); + + ++ row; + } + + for (i = 0; i < 3; ++ i){ + this.objectNormal[i] = n[i] / len; + } + + POS.pseudoInverse(vectors, np, this.objectMatrix); +}; + +POS.Posit.prototype.pose = function(imagePoints){ + var posRotation1 = [[],[],[]], posRotation2 = [[],[],[]], posTranslation = [], + rotation1 = [[],[],[]], rotation2 = [[],[],[]], translation1 = [], translation2 = [], + error1, error2, valid1, valid2, i, j; + + this.pos(imagePoints, posRotation1, posRotation2, posTranslation); + + valid1 = this.isValid(posRotation1, posTranslation); + if (valid1){ + error1 = this.iterate(imagePoints, posRotation1, posTranslation, rotation1, translation1); + }else{ + error1 = {euclidean: -1.0, pixels: -1, maximum: -1.0}; + } + + valid2 = this.isValid(posRotation2, posTranslation); + if (valid2){ + error2 = this.iterate(imagePoints, posRotation2, posTranslation, rotation2, translation2); + }else{ + error2 = {euclidean: -1.0, pixels: -1, maximum: -1.0}; + } + + for (i = 0; i < 3; ++ i){ + for (j = 0; j < 3; ++ j){ + if (valid1){ + translation1[i] -= rotation1[i][j] * this.objectPoints[0][j]; + } + if (valid2){ + translation2[i] -= rotation2[i][j] * this.objectPoints[0][j]; + } + } + } + + return error1.euclidean < error2.euclidean? + new POS.Pose(error1.pixels, rotation1, translation1, error2.pixels, rotation2, translation2): + new POS.Pose(error2.pixels, rotation2, translation2, error1.pixels, rotation1, translation1); +}; + +POS.Posit.prototype.pos = function(imagePoints, rotation1, rotation2, translation){ + var np = this.objectPoints.length, imageVectors = [], + i0 = [], j0 = [], ivec = [], jvec = [], row1 = [], row2 = [], row3 = [], + i0i0, j0j0, i0j0, delta, q, lambda, mu, scale, i, j; + + for (i = 0; i < np; ++ i){ + imageVectors[i] = [imagePoints[i].x - imagePoints[0].x, + imagePoints[i].y - imagePoints[0].y]; + } + + //i0 and j0 + for (i = 0; i < 3; ++ i){ + i0[i] = 0.0; + j0[i] = 0.0; + for (j = 0; j < np; ++ j){ + i0[i] += this.objectMatrix[i][j] * imageVectors[j][0]; + j0[i] += this.objectMatrix[i][j] * imageVectors[j][1]; + } + } + + i0i0 = i0[0] * i0[0] + i0[1] * i0[1] + i0[2] * i0[2]; + j0j0 = j0[0] * j0[0] + j0[1] * j0[1] + j0[2] * j0[2]; + i0j0 = i0[0] * j0[0] + i0[1] * j0[1] + i0[2] * j0[2]; + + //Lambda and mu + delta = (j0j0 - i0i0) * (j0j0 - i0i0) + 4.0 * (i0j0 * i0j0); + + if (j0j0 - i0i0 >= 0.0){ + q = (j0j0 - i0i0 + Math.sqrt(delta) ) / 2.0; + }else{ + q = (j0j0 - i0i0 - Math.sqrt(delta) ) / 2.0; + } + + if (q >= 0.0){ + lambda = Math.sqrt(q); + if (0.0 === lambda){ + mu = 0.0; + }else{ + mu = -i0j0 / lambda; + } + }else{ + lambda = Math.sqrt( -(i0j0 * i0j0) / q); + if (0.0 === lambda){ + mu = Math.sqrt(i0i0 - j0j0); + }else{ + mu = -i0j0 / lambda; + } + } + + //First rotation + for (i = 0; i < 3; ++ i){ + ivec[i] = i0[i] + lambda * this.objectNormal[i]; + jvec[i] = j0[i] + mu * this.objectNormal[i]; + } + + scale = Math.sqrt(ivec[0] * ivec[0] + ivec[1] * ivec[1] + ivec[2] * ivec[2]); + + for (i = 0; i < 3; ++ i){ + row1[i] = ivec[i] / scale; + row2[i] = jvec[i] / scale; + } + + row3[0] = row1[1] * row2[2] - row1[2] * row2[1]; + row3[1] = row1[2] * row2[0] - row1[0] * row2[2]; + row3[2] = row1[0] * row2[1] - row1[1] * row2[0]; + + for (i = 0; i < 3; ++ i){ + rotation1[0][i] = row1[i]; + rotation1[1][i] = row2[i]; + rotation1[2][i] = row3[i]; + } + + //Second rotation + for (i = 0; i < 3; ++ i){ + ivec[i] = i0[i] - lambda * this.objectNormal[i]; + jvec[i] = j0[i] - mu * this.objectNormal[i]; + } + + for (i = 0; i < 3; ++ i){ + row1[i] = ivec[i] / scale; + row2[i] = jvec[i] / scale; + } + + row3[0] = row1[1] * row2[2] - row1[2] * row2[1]; + row3[1] = row1[2] * row2[0] - row1[0] * row2[2]; + row3[2] = row1[0] * row2[1] - row1[1] * row2[0]; + + for (i = 0; i < 3; ++ i){ + rotation2[0][i] = row1[i]; + rotation2[1][i] = row2[i]; + rotation2[2][i] = row3[i]; + } + + //Translation + translation[0] = imagePoints[0].x / scale; + translation[1] = imagePoints[0].y / scale; + translation[2] = this.focalLength / scale; +}; + +POS.Posit.prototype.isValid = function(rotation, translation){ + var np = this.objectPoints.length, zmin = Infinity, i = 0, zi; + + for (; i < np; ++ i){ + zi = translation[2] + + (rotation[2][0] * this.objectVectors[i][0] + + rotation[2][1] * this.objectVectors[i][1] + + rotation[2][2] * this.objectVectors[i][2] + ); + if (zi < zmin){ + zmin = zi; + } + } + + return zmin >= 0.0; +}; + +POS.Posit.prototype.iterate = function(imagePoints, posRotation, posTranslation, rotation, translation){ + var np = this.objectPoints.length, + oldSopImagePoints = [], sopImagePoints = [], + rotation1 = [[],[],[]], rotation2 = [[],[],[]], + translation1 = [], translation2 = [], + converged = false, iteration = 0, + oldImageDifference, imageDifference, factor, + error, error1, error2, delta, i, j; + + for (i = 0; i < np; ++ i){ + oldSopImagePoints[i] = {x: imagePoints[i].x, + y: imagePoints[i].y + }; + } + + for (i = 0; i < 3; ++ i){ + for (j = 0; j < 3; ++ j){ + rotation[i][j] = posRotation[i][j]; + } + translation[i] = posTranslation[i]; + } + + for (i = 0; i < np; ++ i){ + factor = 0.0; + for (j = 0; j < 3; ++ j){ + factor += this.objectVectors[i][j] * rotation[2][j] / translation[2]; + } + sopImagePoints[i] = {x: (1.0 + factor) * imagePoints[i].x, + y: (1.0 + factor) * imagePoints[i].y + }; + } + + imageDifference = 0.0; + + for (i = 0; i < np; ++ i){ + imageDifference += Math.abs(sopImagePoints[i].x - oldSopImagePoints[i].x); + imageDifference += Math.abs(sopImagePoints[i].y - oldSopImagePoints[i].y); + } + + for (i = 0; i < 3; ++ i){ + translation1[i] = translation[i] - + (rotation[i][0] * this.objectPoints[0][0] + + rotation[i][1] * this.objectPoints[0][1] + + rotation[i][2] * this.objectPoints[0][2] + ); + } + + error = error1 = this.error(imagePoints, rotation, translation1); + + //Convergence + converged = (0.0 === error1.pixels) || (imageDifference < 0.01); + + while( iteration ++ < 100 && !converged ){ + + for (i = 0; i < np; ++ i){ + oldSopImagePoints[i].x = sopImagePoints[i].x; + oldSopImagePoints[i].y = sopImagePoints[i].y; + } + + this.pos(sopImagePoints, rotation1, rotation2, translation); + + for (i = 0; i < 3; ++ i){ + translation1[i] = translation[i] - + (rotation1[i][0] * this.objectPoints[0][0] + + rotation1[i][1] * this.objectPoints[0][1] + + rotation1[i][2] * this.objectPoints[0][2] + ); + + translation2[i] = translation[i] - + (rotation2[i][0] * this.objectPoints[0][0] + + rotation2[i][1] * this.objectPoints[0][1] + + rotation2[i][2] * this.objectPoints[0][2] + ); + } + + error1 = this.error(imagePoints, rotation1, translation1); + error2 = this.error(imagePoints, rotation2, translation2); + + if ( (error1.euclidean >= 0.0) && (error2.euclidean >= 0.0) ){ + if (error2.euclidean < error1.euclidean){ + error = error2; + for (i = 0; i < 3; ++ i){ + for (j = 0; j < 3; ++ j){ + rotation[i][j] = rotation2[i][j]; + } + } + }else{ + error = error1; + for (i = 0; i < 3; ++ i){ + for (j = 0; j < 3; ++ j){ + rotation[i][j] = rotation1[i][j]; + } + } + } + } + + if ( (error1.euclidean < 0.0) && (error2.euclidean >= 0.0) ){ + error = error2; + for (i = 0; i < 3; ++ i){ + for (j = 0; j < 3; ++ j){ + rotation[i][j] = rotation2[i][j]; + } + } + } + + if ( (error2.euclidean < 0.0) && (error1.euclidean >= 0.0) ){ + error = error1; + for (i = 0; i < 3; ++ i){ + for (j = 0; j < 3; ++ j){ + rotation[i][j] = rotation1[i][j]; + } + } + } + + for (i = 0; i < np; ++ i){ + factor = 0.0; + for (j = 0; j < 3; ++ j){ + factor += this.objectVectors[i][j] * rotation[2][j] / translation[2]; + } + sopImagePoints[i].x = (1.0 + factor) * imagePoints[i].x; + sopImagePoints[i].y = (1.0 + factor) * imagePoints[i].y; + } + + oldImageDifference = imageDifference; + imageDifference = 0.0; + + for (i = 0; i < np; ++ i){ + imageDifference += Math.abs(sopImagePoints[i].x - oldSopImagePoints[i].x); + imageDifference += Math.abs(sopImagePoints[i].y - oldSopImagePoints[i].y); + } + + delta = Math.abs(imageDifference - oldImageDifference); + + converged = (0.0 === error.pixels) || (delta < 0.01); + } + + return error; +}; + +POS.Posit.prototype.error = function(imagePoints, rotation, translation){ + var np = this.objectPoints.length, + move = [], projection = [], errorvec = [], + euclidean = 0.0, pixels = 0.0, maximum = 0.0, + i, j, k; + + if ( !this.isValid(rotation, translation) ){ + return {euclidean: -1.0, pixels: -1, maximum: -1.0}; + } + + for (i = 0; i < np; ++ i){ + move[i] = []; + for (j = 0; j < 3; ++ j){ + move[i][j] = translation[j]; + } + } + + for (i = 0; i < np; ++ i){ + for (j = 0; j < 3; ++ j){ + for (k = 0; k < 3; ++ k){ + move[i][j] += rotation[j][k] * this.objectPoints[i][k]; + } + } + } + + for (i = 0; i < np; ++ i){ + projection[i] = []; + for (j = 0; j < 2; ++ j){ + projection[i][j] = this.focalLength * move[i][j] / move[i][2]; + } + } + + for (i = 0; i < np; ++ i){ + errorvec[i] = [projection[i][0] - imagePoints[i].x, + projection[i][1] - imagePoints[i].y]; + } + + for (i = 0; i < np; ++ i){ + euclidean += Math.sqrt(errorvec[i][0] * errorvec[i][0] + + errorvec[i][1] * errorvec[i][1] + ); + + pixels += Math.abs( Math.round(projection[i][0]) - Math.round(imagePoints[i].x) ) + + Math.abs( Math.round(projection[i][1]) - Math.round(imagePoints[i].y) ); + + if (Math.abs(errorvec[i][0]) > maximum){ + maximum = Math.abs(errorvec[i][0]); + } + if (Math.abs(errorvec[i][1]) > maximum){ + maximum = Math.abs(errorvec[i][1]); + } + } + + return {euclidean: euclidean / np, pixels: pixels, maximum: maximum}; +}; + +POS.pseudoInverse = function(a, n, b){ + var w = [], v = [[],[],[]], s = [[],[],[]], + wmax = 0.0, cn = 0, + i, j, k; + + SVD.svdcmp(a, n, 3, w, v); + + for (i = 0; i < 3; ++ i){ + if (w[i] > wmax){ + wmax = w[i]; + } + } + + wmax *= 0.01; + + for (i = 0; i < 3; ++ i){ + if (w[i] < wmax){ + w[i] = 0.0; + } + } + + for (j = 0; j < 3; ++ j){ + if (0.0 === w[j]){ + ++ cn; + for (k = j; k < 2; ++ k){ + for (i = 0; i < n; ++ i){ + a[i][k] = a[i][k + 1]; + } + for (i = 0; i < 3; ++ i){ + v[i][k] = v[i][k + 1]; + } + } + } + } + + for (j = 0; j < 2; ++ j){ + if (0.0 === w[j]){ + w[j] = w[j + 1]; + } + } + + for (i = 0; i < 3; ++ i){ + for (j = 0; j < 3 - cn; ++ j){ + s[i][j] = v[i][j] / w[j]; + } + } + + for (i = 0; i < 3; ++ i){ + for (j = 0; j < n; ++ j){ + b[i][j] = 0.0; + for (k = 0; k < 3 - cn; ++ k){ + b[i][j] += s[i][k] * a[j][k]; + } + } + } +}; + +POS.Pose = function(error1, rotation1, translation1, error2, rotation2, translation2){ + this.bestError = error1; + this.bestRotation = rotation1; + this.bestTranslation = translation1; + this.alternativeError = error2; + this.alternativeRotation = rotation2; + this.alternativeTranslation = translation2; +}; +/* +Copyright (c) 2012 Juan Mellado + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + +/* +References: +- "Numerical Recipes in C - Second Edition" + http://www.nr.com/ +*/ + +var SVD = SVD || {}; + +SVD.svdcmp = function(a, m, n, w, v){ + var flag, i, its, j, jj, k, l, nm, + anorm = 0.0, c, f, g = 0.0, h, s, scale = 0.0, x, y, z, rv1 = []; + + //Householder reduction to bidiagonal form + for (i = 0; i < n; ++ i){ + l = i + 1; + rv1[i] = scale * g; + g = s = scale = 0.0; + if (i < m){ + for (k = i; k < m; ++ k){ + scale += Math.abs( a[k][i] ); + } + if (0.0 !== scale){ + for (k = i; k < m; ++ k){ + a[k][i] /= scale; + s += a[k][i] * a[k][i]; + } + f = a[i][i]; + g = -SVD.sign( Math.sqrt(s), f ); + h = f * g - s; + a[i][i] = f - g; + for (j = l; j < n; ++ j){ + for (s = 0.0, k = i; k < m; ++ k){ + s += a[k][i] * a[k][j]; + } + f = s / h; + for (k = i; k < m; ++ k){ + a[k][j] += f * a[k][i]; + } + } + for (k = i; k < m; ++ k){ + a[k][i] *= scale; + } + } + } + w[i] = scale * g; + g = s = scale = 0.0; + if ( (i < m) && (i !== n - 1) ){ + for (k = l; k < n; ++ k){ + scale += Math.abs( a[i][k] ); + } + if (0.0 !== scale){ + for (k = l; k < n; ++ k){ + a[i][k] /= scale; + s += a[i][k] * a[i][k]; + } + f = a[i][l]; + g = -SVD.sign( Math.sqrt(s), f ); + h = f * g - s; + a[i][l] = f - g; + for (k = l; k < n; ++ k){ + rv1[k] = a[i][k] / h; + } + for (j = l; j < m; ++ j){ + for (s = 0.0, k = l; k < n; ++ k){ + s += a[j][k] * a[i][k]; + } + for (k = l; k < n; ++ k){ + a[j][k] += s * rv1[k]; + } + } + for (k = l; k < n; ++ k){ + a[i][k] *= scale; + } + } + } + anorm = Math.max(anorm, ( Math.abs( w[i] ) + Math.abs( rv1[i] ) ) ); + } + + //Acumulation of right-hand transformation + for (i = n - 1; i >= 0; -- i){ + if (i < n - 1){ + if (0.0 !== g){ + for (j = l; j < n; ++ j){ + v[j][i] = ( a[i][j] / a[i][l] ) / g; + } + for (j = l; j < n; ++ j){ + for (s = 0.0, k = l; k < n; ++ k){ + s += a[i][k] * v[k][j]; + } + for (k = l; k < n; ++ k){ + v[k][j] += s * v[k][i]; + } + } + } + for (j = l; j < n; ++ j){ + v[i][j] = v[j][i] = 0.0; + } + } + v[i][i] = 1.0; + g = rv1[i]; + l = i; + } + + //Acumulation of left-hand transformation + for (i = Math.min(n, m) - 1; i >= 0; -- i){ + l = i + 1; + g = w[i]; + for (j = l; j < n; ++ j){ + a[i][j] = 0.0; + } + if (0.0 !== g){ + g = 1.0 / g; + for (j = l; j < n; ++ j){ + for (s = 0.0, k = l; k < m; ++ k){ + s += a[k][i] * a[k][j]; + } + f = (s / a[i][i]) * g; + for (k = i; k < m; ++ k){ + a[k][j] += f * a[k][i]; + } + } + for (j = i; j < m; ++ j){ + a[j][i] *= g; + } + }else{ + for (j = i; j < m; ++ j){ + a[j][i] = 0.0; + } + } + ++ a[i][i]; + } + + //Diagonalization of the bidiagonal form + for (k = n - 1; k >= 0; -- k){ + for (its = 1; its <= 30; ++ its){ + flag = true; + for (l = k; l >= 0; -- l){ + nm = l - 1; + if ( Math.abs( rv1[l] ) + anorm === anorm ){ + flag = false; + break; + } + if ( Math.abs( w[nm] ) + anorm === anorm ){ + break; + } + } + if (flag){ + c = 0.0; + s = 1.0; + for (i = l; i <= k; ++ i){ + f = s * rv1[i]; + if ( Math.abs(f) + anorm === anorm ){ + break; + } + g = w[i]; + h = SVD.pythag(f, g); + w[i] = h; + h = 1.0 / h; + c = g * h; + s = -f * h; + for (j = 1; j <= m; ++ j){ + y = a[j][nm]; + z = a[j][i]; + a[j][nm] = y * c + z * s; + a[j][i] = z * c - y * s; + } + } + } + + //Convergence + z = w[k]; + if (l === k){ + if (z < 0.0){ + w[k] = -z; + for (j = 0; j < n; ++ j){ + v[j][k] = -v[j][k]; + } + } + break; + } + + if (30 === its){ + return false; + } + + //Shift from bottom 2-by-2 minor + x = w[l]; + nm = k - 1; + y = w[nm]; + g = rv1[nm]; + h = rv1[k]; + f = ( (y - z) * (y + z) + (g - h) * (g + h) ) / (2.0 * h * y); + g = SVD.pythag( f, 1.0 ); + f = ( (x - z) * (x + z) + h * ( (y / (f + SVD.sign(g, f) ) ) - h) ) / x; + + //Next QR transformation + c = s = 1.0; + for (j = l; j <= nm; ++ j){ + i = j + 1; + g = rv1[i]; + y = w[i]; + h = s * g; + g = c * g; + z = SVD.pythag(f, h); + rv1[j] = z; + c = f / z; + s = h / z; + f = x * c + g * s; + g = g * c - x * s; + h = y * s; + y *= c; + for (jj = 0; jj < n; ++ jj){ + x = v[jj][j]; + z = v[jj][i]; + v[jj][j] = x * c + z * s; + v[jj][i] = z * c - x * s; + } + z = SVD.pythag(f, h); + w[j] = z; + if (0.0 !== z){ + z = 1.0 / z; + c = f * z; + s = h * z; + } + f = c * g + s * y; + x = c * y - s * g; + for (jj = 0; jj < m; ++ jj){ + y = a[jj][j]; + z = a[jj][i]; + a[jj][j] = y * c + z * s; + a[jj][i] = z * c - y * s; + } + } + rv1[l] = 0.0; + rv1[k] = f; + w[k] = x; + } + } + + return true; +}; + +SVD.pythag = function(a, b){ + var at = Math.abs(a), bt = Math.abs(b), ct; + + if (at > bt){ + ct = bt / at; + return at * Math.sqrt(1.0 + ct * ct); + } + + if (0.0 === bt){ + return 0.0; + } + + ct = at / bt; + return bt * Math.sqrt(1.0 + ct * ct); +}; + +SVD.sign = function(a, b){ + return b >= 0.0? Math.abs(a): -Math.abs(a); +}; +var THREEx = THREEx || {} + +THREEx.ArucoContext = function(parameters){ + // handle default parameters + parameters = parameters || {} + this.parameters = { + // debug - true if one should display artoolkit debug canvas, false otherwise + debug: parameters.debug !== undefined ? parameters.debug : false, + // resolution of at which we detect pose in the source image + canvasWidth: parameters.canvasWidth !== undefined ? parameters.canvasWidth : 640, + canvasHeight: parameters.canvasHeight !== undefined ? parameters.canvasHeight : 480, + } + + + this.canvas = document.createElement('canvas'); + + this.detector = new AR.Detector() + + // setup THREEx.ArucoDebug if needed + this.debug = null + if( parameters.debug == true ){ + this.debug = new THREEx.ArucoDebug(this) + } + + // honor parameters.canvasWidth/.canvasHeight + this.setSize(this.parameters.canvasWidth, this.parameters.canvasHeight) +} + +THREEx.ArucoContext.prototype.setSize = function (width, height) { + this.canvas.width = width + this.canvas.height = height + if( this.debug !== null ){ + this.debug.setSize(width, height) + } +} + +THREEx.ArucoContext.prototype.detect = function (videoElement) { + var _this = this + var canvas = this.canvas + + // get imageData from videoElement + var context = canvas.getContext('2d'); + context.drawImage(videoElement, 0, 0, canvas.width, canvas.height); + var imageData = context.getImageData(0, 0, canvas.width, canvas.height); + + // detect markers in imageData + var detectedMarkers = this.detector.detect(imageData); + return detectedMarkers +}; + +/** + * crappy function to update a object3d with a detectedMarker - super crappy + */ +THREEx.ArucoContext.prototype.updateObject3D = function(object3D, arucoPosit, markerSize, detectedMarker){ + var markerCorners = detectedMarker.corners; + var canvas = this.canvas + + // convert the corners + var poseCorners = new Array(markerCorners.length) + for (var i = 0; i < markerCorners.length; ++ i){ + var markerCorner = markerCorners[i]; + poseCorners[i] = { + x: markerCorner.x - (canvas.width / 2), + y: -markerCorner.y + (canvas.height/ 2) + } + } + + // estimate pose from corners + var pose = arucoPosit.pose(poseCorners); + + + var rotation = pose.bestRotation + var translation = pose.bestTranslation + + object3D.position.x = translation[0]; + object3D.position.y = translation[1]; + object3D.position.z = -translation[2]; + + object3D.rotation.x = -Math.asin(-rotation[1][2]); + object3D.rotation.y = -Math.atan2(rotation[0][2], rotation[2][2]); + object3D.rotation.z = Math.atan2(rotation[1][0], rotation[1][1]); + + object3D.scale.x = markerSize; + object3D.scale.y = markerSize; + object3D.scale.z = markerSize; +} +var THREEx = THREEx || {}; + + +////////////////////////////////////////////////////////////////////////////// +// monkey patch AR.Detector +////////////////////////////////////////////////////////////////////////////// + +AR.Detector.prototype.detect = function(image){ + var opts = this.datGUIOptions + + CV.grayscale(image, this.grey); + CV.adaptiveThreshold(this.grey, this.thres, opts.adaptativeThreshold.kernelSize, opts.adaptativeThreshold.threshold); + + this.contours = CV.findContours(this.thres, this.binary); + + this.candidates = this.findCandidates(this.contours, image.width * opts.candidates.minSize, opts.candidates.epsilon, opts.candidates.minLength); + this.candidates = this.clockwiseCorners(this.candidates); + this.candidates = this.notTooNear(this.candidates, opts.notTooNear.minDist); + + return this.findMarkers(this.grey, this.candidates, opts.findMarkers.warpSize); +}; + +// make names explicits - make unit explicit too +AR.Detector.prototype.datGUIOptions = { + adaptativeThreshold : { + kernelSize: 2, + threshold: 7, + }, + candidates: { + minSize: 0.20, + epsilon: 0.05, + minLength: 10, + }, + notTooNear : { + minDist: 10, + }, + findMarkers : { + warpSize: 49, + } +} + +// see https://github.com/jeromeetienne/threex.geometricglow/blob/master/threex.atmospherematerialdatgui.js + +THREEx.addArucoDatGui = function(arucoContext, datGui){ + var datGUIOptions = arucoContext.detector.datGUIOptions + var options = { + resolution: '640x480', + } + var onChange = function(){ + // honor option resolution + var matches = options.resolution.match(/(\d+)x(\d+)/) + var width = parseInt(matches[1]) + var height = parseInt(matches[2]) + arucoContext.setSize(width, height) + } + onChange(); + + datGui.add( options, 'resolution', [ '320x240', '640x480' ]).onChange( onChange ) + + var folder = datGui.addFolder('Adaptative Threshold') + folder.open() + folder.add( arucoContext.detector.datGUIOptions.adaptativeThreshold, 'kernelSize').min(0).step(1) + .onChange( onChange ) + folder.add( arucoContext.detector.datGUIOptions.adaptativeThreshold, 'threshold').min(0).step(1) + .onChange( onChange ) + + var folder = datGui.addFolder('Candidates') + folder.open() + folder.add( arucoContext.detector.datGUIOptions.candidates, 'minSize').min(0).max(1) + .onChange( onChange ) + folder.add( arucoContext.detector.datGUIOptions.candidates, 'epsilon').min(0) + .onChange( onChange ) + folder.add( arucoContext.detector.datGUIOptions.candidates, 'minLength').min(0).step(1) + .onChange( onChange ) + + var folder = datGui.addFolder('notTooNear') + folder.open() + folder.add( arucoContext.detector.datGUIOptions.notTooNear, 'minDist').min(0).step(1) + .onChange( onChange ) + + var folder = datGui.addFolder('findMarkers') + folder.open() + folder.add( arucoContext.detector.datGUIOptions.findMarkers, 'warpSize').min(0).step(1) + .onChange( onChange ) +} +var THREEx = THREEx || {} + +THREEx.ArucoDebug = function(arucoContext){ + this.arucoContext = arucoContext + +// TODO to rename canvasElement into canvas + this.canvasElement = document.createElement('canvas'); + this.canvasElement.width = this.arucoContext.canvas.width + this.canvasElement.height = this.arucoContext.canvas.height +} + +THREEx.ArucoDebug.prototype.setSize = function (width, height) { + if( this.canvasElement.width !== width ) this.canvasElement.width = width + if( this.canvasElement.height !== height ) this.canvasElement.height = height +} + + +THREEx.ArucoDebug.prototype.clear = function(){ + var canvas = this.canvasElement + var context = canvas.getContext('2d'); + context.clearRect(0,0,canvas.width, canvas.height) + +} + +THREEx.ArucoDebug.prototype.drawContoursContours = function(){ + var contours = this.arucoContext.detector.contours + var canvas = this.canvasElement + this.drawContours(contours, 0, 0, canvas.width, canvas.height, function(hole){ + return hole? "magenta": "blue" + }) +} + +THREEx.ArucoDebug.prototype.drawContoursPolys = function(){ + var contours = this.arucoContext.detector.polys + var canvas = this.canvasElement + this.drawContours(contours, 0, 0, canvas.width, canvas.height, function(){ + return 'green' + }) +} + + +THREEx.ArucoDebug.prototype.drawContoursCandidates = function(){ + var contours = this.arucoContext.detector.candidates + var canvas = this.canvasElement + this.drawContours(contours, 0, 0, canvas.width, canvas.height, function(){ + return 'red' + }) +} + +THREEx.ArucoDebug.prototype.drawContours = function(contours, x, y, width, height, fn){ + var i = contours.length, j, contour, point; + var canvas = this.canvasElement + var context = canvas.getContext('2d'); + + context.save(); + while(i --){ + contour = contours[i]; + context.strokeStyle = fn(contour.hole); + context.beginPath(); + for (j = 0; j < contour.length; ++ j){ + point = contour[j]; + context.moveTo(x + point.x, y + point.y); + point = contour[(j + 1) % contour.length]; + context.lineTo(x + point.x, y + point.y); + } + + context.stroke(); + context.closePath(); + } + context.restore(); +} + +////////////////////////////////////////////////////////////////////////////// +// Code Separator +////////////////////////////////////////////////////////////////////////////// + +THREEx.ArucoDebug.prototype.drawDetectorGrey = function(){ + var cvImage = arucoContext.detector.grey + this.drawCVImage( cvImage ) +} + +THREEx.ArucoDebug.prototype.drawDetectorThreshold = function(){ + var cvImage = arucoContext.detector.thres + this.drawCVImage( cvImage ) +} + +////////////////////////////////////////////////////////////////////////////// +// Code Separator +////////////////////////////////////////////////////////////////////////////// +THREEx.ArucoDebug.prototype.drawCVImage = function(cvImage){ + var detector = this.arucoContext.detector + + var canvas = this.canvasElement + var context = canvas.getContext('2d'); + + var imageData = context.createImageData(canvas.width, canvas.height); + this.copyCVImage2ImageData(cvImage, imageData) + context.putImageData( imageData, 0, 0); +} + + +THREEx.ArucoDebug.prototype.copyCVImage2ImageData = function(cvImage, imageData){ + var i = cvImage.data.length, j = (i * 4) + 3; + + while(i --){ + imageData.data[j -= 4] = 255; + imageData.data[j - 1] = imageData.data[j - 2] = imageData.data[j - 3] = cvImage.data[i]; + } + + return imageData; +}; + +////////////////////////////////////////////////////////////////////////////// +// Code Separator +////////////////////////////////////////////////////////////////////////////// +THREEx.ArucoDebug.prototype.drawVideo = function(videoElement){ + var canvas = this.canvasElement + var context = canvas.getContext('2d'); + context.drawImage(videoElement, 0, 0, canvas.width, canvas.height); +} + +////////////////////////////////////////////////////////////////////////////// +// Code Separator +////////////////////////////////////////////////////////////////////////////// +THREEx.ArucoDebug.prototype.drawMarkerIDs = function(markers){ + var canvas = this.canvasElement + var context = canvas.getContext('2d'); + var corners, corner, x, y, i, j; + + context.save(); + context.strokeStyle = "blue"; + context.lineWidth = 1; + + for (i = 0; i !== markers.length; ++ i){ + corners = markers[i].corners; + + x = Infinity; + y = Infinity; + + for (j = 0; j !== corners.length; ++ j){ + corner = corners[j]; + + x = Math.min(x, corner.x); + y = Math.min(y, corner.y); + } + context.strokeText(markers[i].id, x, y) + } + context.restore(); +} + +////////////////////////////////////////////////////////////////////////////// +// Code Separator +////////////////////////////////////////////////////////////////////////////// +THREEx.ArucoDebug.prototype.drawMarkerCorners = function(markers){ + var canvas = this.canvasElement + var corners, corner, i, j; + var context = canvas.getContext('2d'); + context.save(); + context.lineWidth = 3; + + for (i = 0; i < markers.length; ++ i){ + corners = markers[i].corners; + + context.strokeStyle = 'red'; + context.beginPath(); + + for (j = 0; j < corners.length; ++ j){ + corner = corners[j]; + context.moveTo(corner.x, corner.y); + corner = corners[(j + 1) % corners.length]; + context.lineTo(corner.x, corner.y); + } + + context.stroke(); + context.closePath(); + + context.strokeStyle = 'green'; + context.strokeRect(corners[0].x - 2, corners[0].y - 2, 4, 4); + } + context.restore(); + +} +var THREEx = THREEx || {} + +THREEx.ArucoMarkerGenerator = function(){ + +} + +////////////////////////////////////////////////////////////////////////////// +// Code Separator +////////////////////////////////////////////////////////////////////////////// +THREEx.ArucoMarkerGenerator.createSVG = function(markerId, svgSize){ + var domElement = document.createElement('div'); + domElement.innerHTML = new ArucoMarker(markerId).toSVG(svgSize); + return domElement +} + +THREEx.ArucoMarkerGenerator.createImage = function(markerId, width){ + // create canvas + var canvas = this.createCanvas(markerId, width) + var imageURL = canvas.toDataURL() + + // create imageElement + var imageElement = document.createElement('img'); + imageElement.src = imageURL + + // return imageElement + return imageElement; +} + +////////////////////////////////////////////////////////////////////////////// +// Code Separator +////////////////////////////////////////////////////////////////////////////// +THREEx.ArucoMarkerGenerator.createCanvas = function(markerId, width){ + var canvas = document.createElement('canvas'); + var context = canvas.getContext('2d') + canvas.width = width + canvas.height = width + + var arucoMarker = new ArucoMarker(markerId) + var marker = arucoMarker.markerMatrix() + + var margin = canvas.width*0.1 + var innerW = width-margin*2 + var squareW = innerW/7 + + context.fillStyle = 'white' + context.fillRect(0, 0, canvas.width, canvas.height) + context.fillStyle = 'black' + context.fillRect(margin, margin, canvas.width-margin*2, canvas.height-margin*2) + + for(var y = 0; y < 5; y++){ + for(var x = 0; x < 5; x++){ + if (marker[x][y] !== 1) continue + context.fillStyle = 'white' + context.fillRect(margin+(x+1)*squareW, margin+(y+1)*squareW, squareW+1, squareW+1) + } + } + + return canvas +} +/* + * Copyright 2017 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** +* @namespace +*/ +// var THREE = THREE || require("three"); + +/** +* The WebAR namespace inside the THREE namespace. This namespace includes different utilities to be able to handle WebAR functionalities on top of the ThreeJS framework/engine in an easier way. +* +* NOTE: As a coding standard all the variables/functions starting with an underscore '_' are considered as private and should not be used/called outside of the namespace/class they are defined in. +* @namespace +*/ +THREE.WebAR = {}; + +THREE.WebAR.MAX_FLOAT32_VALUE = 3.4028e38; + +/** +* A class that allows to manage the point cloud acquisition and representation in ThreeJS. A buffer geometry is generated to represent the point cloud. The point cloud is provided using a VRDisplay instance that shows the capability to do so. The point cloud is actually exposed using a TypedArray. The array includes 3 values per point in the cloud. There are 2 ways of exposing this array: +* 1.- Using a new TypedArray for every frame/update. The advantage is that the TypedArray is always of the correct size depending on the number of points detected. The disadvantage is that there is a performance hit from the creation and copying of the array (and future garbage collection). +* 2.- Using the same reference to a single TypedArray. The advantage is that the performance is as good as it can get with no creation/destruction and copy penalties. The disadvantage is that the size of the array is the biggest possible point cloud provided by the underlying hardware. The non used values are filled with THREE.WebAR.MAX_FLOAT32_VALUE. +* @constructor +* @param {window.VRDisplay} vrDisplay The reference to the VRDisplay instance that is capable of providing the point cloud. +* +* NOTE: The buffer geometry that can be retrieved from instances of this class can be used along with THREE.Point and THREE.PointMaterial to render the point cloud using points. This class represents the vertices colors with the color white. +*/ +THREE.WebAR.VRPointCloud = function(vrDisplay) { + + this._vrDisplay = vrDisplay; + + this._numberOfPointsInLastPointCloud = 0; + + this._bufferGeometry = new THREE.BufferGeometry(); + this._bufferGeometry.frustumCulled = false; + + var positions = null; + if (vrDisplay) { + this._pointCloud = new VRPointCloud(); + vrDisplay.getPointCloud(this._pointCloud, false, 0, false); + positions = this._pointCloud.points; + } + else { + positions = new Float32Array( + [-1, 1, -2, 1, 1, -2, 1, -1, -2, -1, -1, -2 ]); + } + var colors = new Float32Array( positions.length ); + + var color = new THREE.Color(); + + for ( var i = 0; i < colors.length; i += 3 ) { + if (vrDisplay) { + positions[ i ] = THREE.WebAR.MAX_FLOAT32_VALUE; + positions[ i + 1 ] = THREE.WebAR.MAX_FLOAT32_VALUE; + positions[ i + 2 ] = THREE.WebAR.MAX_FLOAT32_VALUE; + } + color.setRGB( 1, 1, 1 ); + colors[ i ] = color.r; + colors[ i + 1 ] = color.g; + colors[ i + 2 ] = color.b; + } + + this._positions = new THREE.BufferAttribute( positions, 3 ); + this._bufferGeometry.addAttribute( 'position', this._positions ); + this._colors = new THREE.BufferAttribute( colors, 3 ); + this._bufferGeometry.addAttribute( 'color', this._colors ); + + this._bufferGeometry.computeBoundingSphere(); + + return this; +}; + +/** +* Returns the THREE.BufferGeometry instance that represents the points in the pont cloud. +* @return {THREE.BufferGeometry} The buffer geometry that represents the points in the point cloud. +* +* NOTE: A possible way to render the point cloud could be to use the THREE.BufferGeometry instance returned by this method along with THREE.Points and THREE.PointMaterial. + + var pointCloud = new THREE.VRPointCloud(vrDisplay, true); + var material = new THREE.PointsMaterial( { size: 0.01, vertexColors: THREE.VertexColors } ); + var points = new THREE.Points( pointCloud.getBufferGeometry(), material ); +*/ +THREE.WebAR.VRPointCloud.prototype.getBufferGeometry = function() { + return this._bufferGeometry; +}; + +/** +* Update the point cloud. The THREE.BufferGeometry that this class provides will automatically be updated with the point cloud retrieved by the underlying hardware. +* @param {boolean} updateBufferGeometry A flag to indicate if the underlying THREE.BufferGeometry should also be updated. Updating the THREE.BufferGeometry is very cost innefficient so it is better to only do it if necessary (only if the buffer geometry is going to be rendered for example). If this flag is set to false, then the underlying point cloud is updated but not buffer geometry that represents it. Updating the point cloud is important to be able to call functions that operate with it, like the getPickingPointAndPlaneInPointCloud function. +* @param {number} pointsToSkip A positive integer from 0-N that specifies the number of points to skip when returning the point cloud. If the updateBufferGeometry flag is activated (true) then this parameter allows to specify the density of the point cloud. A values of 0 means all the detected points need to be returned. A number of 1 means that 1 every other point needs to be skipped and thus, half of the detected points will be retrieved, and so on. If the parameter is not specified, 0 is considered. +* @param {boolean} transformPoints A flag to specify if the points should be transformed in the native side or not. If the points are not transformed in the native side, they should be transformed in the JS side (in a vertex shader for example). +*/ +THREE.WebAR.VRPointCloud.prototype.update = function(updateBufferGeometry, pointsToSkip, transformPoints) { + if (!this._vrDisplay) return; + this._vrDisplay.getPointCloud(this._pointCloud, + !updateBufferGeometry, typeof(pointsToSkip) === "number" ? + pointsToSkip : 0, !!transformPoints); + if (!updateBufferGeometry) return; + if (this._pointCloud.numberOfPoints > 0) { + this._positions.needsUpdate = true; + } +}; + +/** +* Provides an index based on an orientation angle. The corresponding index to the angle is: +* orientation = 0 <-> index = 0 +* orientation = 90 <-> index = 1 +* orientation = 180 <-> index = 2 +* orientation = 270 <-> index = 3 +* @param {number} orientation The orientation angle. Values are: 0, 90, 180, 270. +* @return {number} An index from 0 to 3 that corresponds to the give orientation angle. +*/ +THREE.WebAR.getIndexFromOrientation = function(orientation) { + var index = 0; + switch (orientation) { + case 90: + index = 1; + break; + case 180: + index = 2; + break; + case 270: + index = 3; + break; + default: + index = 0; + break; + } + return index; +}; + +/** +* Returns an index that is based on the combination between the display orientation and the see through camera orientation. This index will always be device natural orientation independent. +* @param {VRDisplay} vrDisplay The VRDisplay that is capable to provide a correct VRSeeThroughCamera instance. +* @return {number} The index from 0 to 3 that represents the combination of the device and see through camera orientations. +*/ +THREE.WebAR.getIndexFromScreenAndSeeThroughCameraOrientations = function(vrDisplay) { + var screenOrientation = screen.orientation.angle; + var seeThroughCamera = vrDisplay ? vrDisplay.getSeeThroughCamera() : null; + var seeThroughCameraOrientation = seeThroughCamera ? + seeThroughCamera.orientation : 0; + var seeThroughCameraOrientationIndex = + THREE.WebAR.getIndexFromOrientation(seeThroughCameraOrientation); + var screenOrientationIndex = + THREE.WebAR.getIndexFromOrientation(screenOrientation); + ret = screenOrientationIndex - seeThroughCameraOrientationIndex; + if (ret < 0) { + ret += 4; + } + return (ret % 4); +} + +/** +* A utility function that helps create a THREE.Mesh instance to be able to show the VRSeeThroughCamera as a background quad with the correct texture coordinates and a THREE.VideoTexture instance. +* @param {VRDisplay} vrDisplay The VRDisplay that is capable to provide a correct VRSeeThroughCamera instance. It can be null/undefined. +* @param {string} fallbackVideoPath The path to a video in case there is no vrDisplay. If this parameter is not provided, a default video at path "../resources/sintel.webm" will be used. +* @return {THREE.Mesh} The THREE.Mesh instance that represents a quad to be able to present the see through camera. +*/ +THREE.WebAR.createVRSeeThroughCameraMesh = function(vrDisplay, + fallbackVideoPath) { + var video; + var geometry = new THREE.BufferGeometry(); + + // The camera or video and the texture coordinates may vary depending if the vrDisplay has the see through camera. + if (vrDisplay) { + var seeThroughCamera = vrDisplay.getSeeThroughCamera(); + + if (!seeThroughCamera) + throw "ERROR: Could not get the see through camera!"; + + video = seeThroughCamera; + // HACK: Needed to tell the THREE.VideoTexture that the video is ready and + // that the texture needs update. + video.readyState = 2; + video.HAVE_CURRENT_DATA = 2; + + // All the possible texture coordinates for the 4 possible orientations. + // The ratio between the texture size and the camera size is used in order + // to be compatible with the YUV to RGB conversion option (not recommended + // but still available). + var u = seeThroughCamera.width / seeThroughCamera.textureWidth; + var v = seeThroughCamera.height / seeThroughCamera.textureHeight; + geometry.WebAR_textureCoords = [ + new Float32Array([ + 0.0, 0.0, + 0.0, v, + u, 0.0, + u, v + ]), + new Float32Array([ + u, 0.0, + 0.0, 0.0, + u, v, + 0.0, v + ]), + new Float32Array([ + u, v, + u, 0.0, + 0.0, v, + 0.0, 0.0 + ]), + new Float32Array([ + 0.0, v, + u, v, + 0.0, 0.0, + u, 0.0 + ]) + ]; + } + else { + var video = document.createElement("video"); + video.src = typeof(fallbackVideoPath) === "string" ? + fallbackVideoPath : "../../resources/videos/sintel.webm"; + video.play(); + + // All the possible texture coordinates for the 4 possible orientations. + geometry.WebAR_textureCoords = [ + new Float32Array([0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0]), + new Float32Array([1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0]), + new Float32Array([1.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0]), + new Float32Array([0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0]) + ]; + } + + geometry.addAttribute("position", new THREE.BufferAttribute( + new Float32Array([ + -1.0, 1.0, 0.0, + -1.0, -1.0, 0.0, + 1.0, 1.0, 0.0, + 1.0, -1.0, 0.0 + ]), 3)); + + geometry.setIndex(new THREE.BufferAttribute( + new Uint16Array([0, 1, 2, 2, 1, 3]), 1)); + geometry.WebAR_textureCoordIndex = + THREE.WebAR.getIndexFromScreenAndSeeThroughCameraOrientations(vrDisplay); + var textureCoords = + geometry.WebAR_textureCoords[geometry.WebAR_textureCoordIndex]; + + geometry.addAttribute("uv", new THREE.BufferAttribute( + new Float32Array(textureCoords), 2 )); + geometry.computeBoundingSphere(); + + var videoTexture = new THREE.VideoTexture(video); + videoTexture.minFilter = THREE.NearestFilter; + videoTexture.magFilter = THREE.NearestFilter; + videoTexture.format = THREE.RGBFormat; + videoTexture.flipY = false; + + // The material is different if the see through camera is provided inside the vrDisplay or not. + var material; + if (vrDisplay) { + var vertexShaderSource = [ + 'attribute vec3 position;', + 'attribute vec2 uv;', + '', + 'uniform mat4 modelViewMatrix;', + 'uniform mat4 projectionMatrix;', + '', + 'varying vec2 vUV;', + '', + 'void main(void) {', + ' gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);', + ' vUV = uv;', + '}' + ]; + + var fragmentShaderSource = [ + '#extension GL_OES_EGL_image_external : require', + 'precision mediump float;', + '', + 'varying vec2 vUV;', + '', + 'uniform samplerExternalOES map;', + '', + 'void main(void) {', + ' gl_FragColor = texture2D(map, vUV);', + '}' + ]; + + material = new THREE.RawShaderMaterial({ + uniforms: { + map: {type: 't', value: videoTexture}, + }, + vertexShader: vertexShaderSource.join( '\r\n' ), + fragmentShader: fragmentShaderSource.join( '\r\n' ), + side: THREE.DoubleSide, + }); + } + else { + material = new THREE.MeshBasicMaterial( + {color: 0xFFFFFF, side: THREE.DoubleSide, map: videoTexture } ); + } + + var mesh = new THREE.Mesh(geometry, material); + + return mesh; +}; + +/** +* Updates the camera mesh texture coordinates depending on the orientation of the current screen and the see through camera. +* @param {VRDisplay} vrDisplay The VRDisplay that holds the VRSeeThroughCamera. If could be null/undefined. +* @param {THREE.Mesh} cameraMesh The ThreeJS mesh that represents the camera quad that needs to be updated/rotated depending on the device and camera orientations. This instance should have been created by calling THREE.WebAR.createVRSeeThroughCameraMesh. +*/ +THREE.WebAR.updateCameraMeshOrientation = function(vrDisplay, cameraMesh) { + var textureCoordIndex = THREE.WebAR.getIndexFromScreenAndSeeThroughCameraOrientations(vrDisplay); + if (textureCoordIndex != cameraMesh.geometry.WebAR_textureCoordIndex) { + var uvs = cameraMesh.geometry.getAttribute("uv"); + var textureCoords = + cameraMesh.geometry.WebAR_textureCoords[textureCoordIndex]; + cameraMesh.geometry.WebAR_textureCoordIndex = textureCoordIndex; + for (var i = 0; i < uvs.length; i++) { + uvs.array[i] = textureCoords[i]; + } + uvs.needsUpdate = true; + } +}; + +/** +* A utility function to create a THREE.Camera instance with as frustum that is obtainer from the underlying vrdisplay see through camera information. This camera can be used to correctly render 3D objects on top of the underlying camera image. +* @param {VRDisplay} vrDisplay - The VRDisplay that is capable to provide a correct VRSeeThroughCamera instance in order to obtain the camera lens information and create the correct projection matrix/frustum. It could be null/undefined. +* @param {number} near The near plane value to be used to create the correct projection matrix frustum. +* @param {number} far The far plane value to be used to create the correct projection matrix frustum. +* @return {THREE.Camera} A camera instance to be used to correctly render a scene on top of the camera video feed. +*/ +THREE.WebAR.createVRSeeThroughCamera = function(vrDisplay, near, far) { + var camera = new THREE.PerspectiveCamera( 60, + window.innerWidth / window.innerHeight, near, far ); + if (vrDisplay) { + THREE.WebAR.resizeVRSeeThroughCamera(vrDisplay, camera); + } + return camera; +}; + +/** +* Recalculate a camera projection matrix depending on the current device and see through camera orientation and specification. +* @param {VRDisplay} vrDisplay The VRDisplay that handles the see through camera. +* @param {THREE.Camera} camera The ThreeJS camera instance to update its projection matrix depending on the current device orientation and see through camera properties. +*/ +THREE.WebAR.resizeVRSeeThroughCamera = function(vrDisplay, camera) { + camera.aspect = window.innerWidth / window.innerHeight; + if (vrDisplay) { + var windowWidthBiggerThanHeight = window.innerWidth > window.innerHeight; + var seeThroughCamera = vrDisplay.getSeeThroughCamera(); + if (seeThroughCamera) { + var cameraWidthBiggerThanHeight = + seeThroughCamera.width > seeThroughCamera.height; + var swapWidthAndHeight = + !(windowWidthBiggerThanHeight && cameraWidthBiggerThanHeight); + + var width = swapWidthAndHeight ? + seeThroughCamera.height : seeThroughCamera.width; + var height = swapWidthAndHeight ? + seeThroughCamera.width : seeThroughCamera.height; + var fx = swapWidthAndHeight ? + seeThroughCamera.focalLengthY : seeThroughCamera.focalLengthX; + var fy = swapWidthAndHeight ? + seeThroughCamera.focalLengthX : seeThroughCamera.focalLengthY; + var cx = swapWidthAndHeight ? + seeThroughCamera.pointY : seeThroughCamera.pointX; + var cy = swapWidthAndHeight ? + seeThroughCamera.pointX : seeThroughCamera.pointY; + + var xscale = camera.near / fx; + var yscale = camera.near / fy; + + var xoffset = (cx - (width / 2.0)) * xscale; + // Color camera's coordinates has Y pointing downwards so we negate this term. + var yoffset = -(cy - (height / 2.0)) * yscale; + + var left = xscale * -width / 2.0 - xoffset; + var right = xscale * width / 2.0 - xoffset; + var bottom = yscale * -height / 2.0 - yoffset; + var top = yscale * height / 2.0 - yoffset; + + // camera.projectionMatrix.makeFrustum( + // left, right, bottom, top, camera.near, camera.far); + + camera.projectionMatrix.makePerspective( + left, right, top, bottom, camera.near, camera.far); + + // Recalculate the fov as threejs is not doing it. + camera.fov = THREE.Math.radToDeg( + Math.atan((top * camera.zoom) / camera.near)) * 2.0; + } + } + else { + camera.updateProjectionMatrix(); + } +} + +// Some precalculated private objects to avoid garbage collection +THREE.WebAR._worldUp = new THREE.Vector3(0.0, 1.0, 0.0); +THREE.WebAR._normalY = new THREE.Vector3(); +THREE.WebAR._normalZ = new THREE.Vector3(); +THREE.WebAR._rotationMatrix = new THREE.Matrix4(); +THREE.WebAR._planeNormal = new THREE.Vector3(); + +THREE.WebAR.rotateObject3D = function(normal1, normal2, object3d) { + if (normal1 instanceof THREE.Vector3 || normal1 instanceof THREE.Vector4) { + THREE.WebAR._planeNormal.set(normal1.x, normal1.y, normal1.z); + } + else if (normal1 instanceof Float32Array) { + THREE.WebAR._planeNormal.set(normal1[0], normal1[1], normal1[2]); + } + else { + throw "Unknown normal1 type."; + } + if (normal2 instanceof THREE.Vector3 || normal2 instanceof THREE.Vector4) { + THREE.WebAR._normalZ.set(normal2.x, normal2.y, normal2.z); + } + else if (normal1 instanceof Float32Array) { + THREE.WebAR._normalZ.set(normal2[0], normal2[1], normal2[2]); + } + else { + throw "Unknown normal2 type."; + } + THREE.WebAR._normalY.crossVectors(THREE.WebAR._planeNormal, + THREE.WebAR._normalZ).normalize(); + THREE.WebAR._rotationMatrix.elements[ 0] = THREE.WebAR._planeNormal.x; + THREE.WebAR._rotationMatrix.elements[ 1] = THREE.WebAR._planeNormal.y; + THREE.WebAR._rotationMatrix.elements[ 2] = THREE.WebAR._planeNormal.z; + THREE.WebAR._rotationMatrix.elements[ 4] = THREE.WebAR._normalZ.x; + THREE.WebAR._rotationMatrix.elements[ 5] = THREE.WebAR._normalZ.y; + THREE.WebAR._rotationMatrix.elements[ 6] = THREE.WebAR._normalZ.z; + THREE.WebAR._rotationMatrix.elements[ 8] = THREE.WebAR._normalY.x; + THREE.WebAR._rotationMatrix.elements[ 9] = THREE.WebAR._normalY.y; + THREE.WebAR._rotationMatrix.elements[10] = THREE.WebAR._normalY.z; + object3d.quaternion.setFromRotationMatrix(THREE.WebAR._rotationMatrix); +}; + +/** +* Transform a given THREE.Object3D instance to be correctly oriented according to a given plane normal. +* @param {THREE.Vector3|THREE.Vector4|Float32Array} plane A vector that represents the normal of the plane to be used to orient the object3d. +* @param {THREE.Object3D} object3d The object3d to be transformed so it is oriented according to the given plane. +*/ +THREE.WebAR.rotateObject3DWithPickingPlane = function(plane, object3d) { + if (plane instanceof THREE.Vector3 || plane instanceof THREE.Vector4) { + THREE.WebAR._planeNormal.set(plane.x, plane.y, plane.z); + } + else if (plane instanceof Float32Array) { + THREE.WebAR._planeNormal.set(plane[0], plane[1], plane[2]); + } + else { + throw "Unknown plane type."; + } + THREE.WebAR._normalY.set(0.0, 1.0, 0.0); + var threshold = 0.5; + if (Math.abs(THREE.WebAR._planeNormal.dot(THREE.WebAR._worldUp)) > + threshold) { + THREE.WebAR._normalY.set(0.0, 0.0, 1.0); + } + THREE.WebAR._normalZ.crossVectors(THREE.WebAR._planeNormal, + THREE.WebAR._normalY).normalize(); + THREE.WebAR._normalY.crossVectors(THREE.WebAR._normalZ, + THREE.WebAR._planeNormal).normalize(); + THREE.WebAR._rotationMatrix.elements[ 0] = THREE.WebAR._planeNormal.x; + THREE.WebAR._rotationMatrix.elements[ 1] = THREE.WebAR._planeNormal.y; + THREE.WebAR._rotationMatrix.elements[ 2] = THREE.WebAR._planeNormal.z; + THREE.WebAR._rotationMatrix.elements[ 4] = THREE.WebAR._normalY.x; + THREE.WebAR._rotationMatrix.elements[ 5] = THREE.WebAR._normalY.y; + THREE.WebAR._rotationMatrix.elements[ 6] = THREE.WebAR._normalY.z; + THREE.WebAR._rotationMatrix.elements[ 8] = THREE.WebAR._normalZ.x; + THREE.WebAR._rotationMatrix.elements[ 9] = THREE.WebAR._normalZ.y; + THREE.WebAR._rotationMatrix.elements[10] = THREE.WebAR._normalZ.z; + object3d.quaternion.setFromRotationMatrix(THREE.WebAR._rotationMatrix); +}; + +/** +* Transform a given THREE.Object3D instance to be correctly positioned according to a given point position. +* @param {THREE.Vector3|THREE.Vector4|Float32Array} point A vector that represents the position where the object3d should be positioned. +* @param {THREE.Object3D} object3d The object3d to be transformed so it is positioned according to the given point. +*/ +THREE.WebAR.positionObject3DWithPickingPoint = function(point, object3d) { + if (point instanceof THREE.Vector3 || point instanceof THREE.Vector4) { + object3d.position.set(point.x, point.y, point.z); + } + else if (point instanceof Float32Array) { + object3d.position.set(point[0], point[1], point[2]); + } + else { + throw "Unknown point type."; + } +}; + +/** +* Transform a given THREE.Object3D instance to be correctly positioned and oriented according to a given VRPickingPointAndPlane and a scale (half the size of the object3d for example). +* @param {VRPickingPointandPlane} pointAndPlane The point and plane retrieved using the VRDisplay.getPickingPointAndPlaneInPointCloud function. +* @param {THREE.Object3D} object3d The object3d to be transformed so it is positioned and oriented according to the given point and plane. +* @param {number} scale The value the object3d will be positioned in the direction of the normal of the plane to be correctly positioned. Objects usually have their position value referenced as the center of the geometry. In this case, positioning the object in the picking point would lead to have the object3d positioned in the plane, not on top of it. this scale value will allow to correctly position the object in the picking point and in the direction of the normal of the plane. Half the size of the object3d would be a correct value in this case. +*/ +THREE.WebAR.positionAndRotateObject3DWithPickingPointAndPlaneInPointCloud = + function(pointAndPlane, object3d, scale) { + THREE.WebAR.rotateObject3DWithPickingPlane(pointAndPlane.plane, object3d); + THREE.WebAR.positionObject3DWithPickingPoint(pointAndPlane.point, object3d); + object3d.position.add(THREE.WebAR._planeNormal.multiplyScalar(scale)); +}; + +/** +* Transform a given THREE.Object3D instance to be correctly positioned and oriented according to an axis formed by 2 plane normals, a position and a scale (half the size of the object3d for example). +* @param {VRPickingPointandPlane} pointAndPlane The point and plane retrieved using the VRDisplay.getPickingPointAndPlaneInPointCloud function. +* @param {THREE.Object3D} object3d The object3d to be transformed so it is positioned and oriented according to the given point and plane. +* @param {number} scale The value the object3d will be positioned in the direction of the normal of the plane to be correctly positioned. Objects usually have their position value referenced as the center of the geometry. In this case, positioning the object in the picking point would lead to have the object3d positioned in the plane, not on top of it. this scale value will allow to correctly position the object in the picking point and in the direction of the normal of the plane. Half the size of the object3d would be a correct value in this case. +*/ +THREE.WebAR.positionAndRotateObject3D = + function(position, normal1, normal2, object3d, scale) { + THREE.WebAR.rotateObject3D(normal1, normal2, object3d); + THREE.WebAR.positionObject3DWithPickingPoint(position, object3d); + object3d.position.add(THREE.WebAR._planeNormal.multiplyScalar(scale)); +}; + +// UMD +(function (root, factory) { + if (typeof define === 'function' && define.amd) { + define(['WebAR'], factory); + } else if (typeof exports === 'object') { + module.exports = factory(); + } else { + root.WebAR = factory(); + } +}(this, function() { + return THREE.WebAR; +})); +/* + + JS Signals <http://millermedeiros.github.com/js-signals/> + Released under the MIT license + Author: Miller Medeiros + Version: 0.7.4 - Build: 252 (2012/02/24 10:30 PM) +*/ +(function(h){function g(a,b,c,d,e){this._listener=b;this._isOnce=c;this.context=d;this._signal=a;this._priority=e||0}function f(a,b){if(typeof a!=="function")throw Error("listener is a required param of {fn}() and should be a Function.".replace("{fn}",b));}var e={VERSION:"0.7.4"};g.prototype={active:!0,params:null,execute:function(a){var b;this.active&&this._listener&&(a=this.params?this.params.concat(a):a,b=this._listener.apply(this.context,a),this._isOnce&&this.detach());return b},detach:function(){return this.isBound()? +this._signal.remove(this._listener,this.context):null},isBound:function(){return!!this._signal&&!!this._listener},getListener:function(){return this._listener},_destroy:function(){delete this._signal;delete this._listener;delete this.context},isOnce:function(){return this._isOnce},toString:function(){return"[SignalBinding isOnce:"+this._isOnce+", isBound:"+this.isBound()+", active:"+this.active+"]"}};e.Signal=function(){this._bindings=[];this._prevParams=null};e.Signal.prototype={memorize:!1,_shouldPropagate:!0, +active:!0,_registerListener:function(a,b,c,d){var e=this._indexOfListener(a,c);if(e!==-1){if(a=this._bindings[e],a.isOnce()!==b)throw Error("You cannot add"+(b?"":"Once")+"() then add"+(!b?"":"Once")+"() the same listener without removing the relationship first.");}else a=new g(this,a,b,c,d),this._addBinding(a);this.memorize&&this._prevParams&&a.execute(this._prevParams);return a},_addBinding:function(a){var b=this._bindings.length;do--b;while(this._bindings[b]&&a._priority<=this._bindings[b]._priority); +this._bindings.splice(b+1,0,a)},_indexOfListener:function(a,b){for(var c=this._bindings.length,d;c--;)if(d=this._bindings[c],d._listener===a&&d.context===b)return c;return-1},has:function(a,b){return this._indexOfListener(a,b)!==-1},add:function(a,b,c){f(a,"add");return this._registerListener(a,!1,b,c)},addOnce:function(a,b,c){f(a,"addOnce");return this._registerListener(a,!0,b,c)},remove:function(a,b){f(a,"remove");var c=this._indexOfListener(a,b);c!==-1&&(this._bindings[c]._destroy(),this._bindings.splice(c, +1));return a},removeAll:function(){for(var a=this._bindings.length;a--;)this._bindings[a]._destroy();this._bindings.length=0},getNumListeners:function(){return this._bindings.length},halt:function(){this._shouldPropagate=!1},dispatch:function(a){if(this.active){var b=Array.prototype.slice.call(arguments),c=this._bindings.length,d;if(this.memorize)this._prevParams=b;if(c){d=this._bindings.slice();this._shouldPropagate=!0;do c--;while(d[c]&&this._shouldPropagate&&d[c].execute(b)!==!1)}}},forget:function(){this._prevParams= +null},dispose:function(){this.removeAll();delete this._bindings;delete this._prevParams},toString:function(){return"[Signal active:"+this.active+" numListeners:"+this.getNumListeners()+"]"}};typeof define==="function"&&define.amd?define(e):typeof module!=="undefined"&&module.exports?module.exports=e:h.signals=e})(this);var THREEx = THREEx || {} + +THREEx.ArBaseControls = function(object3d){ + this.id = THREEx.ArBaseControls.id++ + + this.object3d = object3d + this.object3d.matrixAutoUpdate = false; + this.object3d.visible = false + + // Events to honor + // this.dispatchEvent({ type: 'becameVisible' }) + // this.dispatchEvent({ type: 'markerVisible' }) // replace markerFound + // this.dispatchEvent({ type: 'becameUnVisible' }) +} + +THREEx.ArBaseControls.id = 0 + +Object.assign( THREEx.ArBaseControls.prototype, THREE.EventDispatcher.prototype ); + +////////////////////////////////////////////////////////////////////////////// +// Functions +////////////////////////////////////////////////////////////////////////////// +/** + * error catching function for update() + */ +THREEx.ArBaseControls.prototype.update = function(){ + console.assert(false, 'you need to implement your own update') +} + +/** + * error catching function for name() + */ +THREEx.ArBaseControls.prototype.name = function(){ + console.assert(false, 'you need to implement your own .name()') + return 'Not yet implemented - name()' +} +var THREEx = THREEx || {} + +// TODO this is useless - prefere arjs-HitTesting.js + +/** + * - maybe support .onClickFcts in each object3d + * - seems an easy light layer for clickable object + * - up to + */ +THREEx.ARClickability = function(sourceElement){ + this._sourceElement = sourceElement + // Create cameraPicking + var fullWidth = parseInt(sourceElement.style.width) + var fullHeight = parseInt(sourceElement.style.height) + this._cameraPicking = new THREE.PerspectiveCamera(42, fullWidth / fullHeight, 0.1, 100); + +console.warn('THREEx.ARClickability works only in modelViewMatrix') +console.warn('OBSOLETE OBSOLETE! instead use THREEx.HitTestingPlane or THREEx.HitTestingTango') +} + +THREEx.ARClickability.prototype.onResize = function(){ + var sourceElement = this._sourceElement + var cameraPicking = this._cameraPicking + + var fullWidth = parseInt(sourceElement.style.width) + var fullHeight = parseInt(sourceElement.style.height) + cameraPicking.aspect = fullWidth / fullHeight; + cameraPicking.updateProjectionMatrix(); +} + +THREEx.ARClickability.prototype.computeIntersects = function(domEvent, objects){ + var sourceElement = this._sourceElement + var cameraPicking = this._cameraPicking + + // compute mouse coordinatge with [-1,1] + var eventCoords = new THREE.Vector3(); + eventCoords.x = ( domEvent.layerX / parseInt(sourceElement.style.width) ) * 2 - 1; + eventCoords.y = - ( domEvent.layerY / parseInt(sourceElement.style.height) ) * 2 + 1; + + // compute intersections between eventCoords and pickingPlane + var raycaster = new THREE.Raycaster(); + raycaster.setFromCamera( eventCoords, cameraPicking ); + var intersects = raycaster.intersectObjects( objects ) + + return intersects +} + +THREEx.ARClickability.prototype.update = function(){ + +} + +////////////////////////////////////////////////////////////////////////////// +// Code Separator +////////////////////////////////////////////////////////////////////////////// + +THREEx.ARClickability.tangoPickingPointCloud = function(artoolkitContext, mouseX, mouseY){ + +// THIS IS CRAP!!!! use THREEx.HitTestingTango + + var vrDisplay = artoolkitContext._tangoContext.vrDisplay + if (vrDisplay === null ) return null + var pointAndPlane = vrDisplay.getPickingPointAndPlaneInPointCloud(mouseX, mouseY) + if( pointAndPlane == null ) { + console.warn('Could not retrieve the correct point and plane.') + return null + } + + // FIXME not sure what this is + var boundingSphereRadius = 0.01 + + // the bigger the number the likeliest it crash chromium-webar + + // Orient and position the model in the picking point according + // to the picking plane. The offset is half of the model size. + var object3d = new THREE.Object3D + THREE.WebAR.positionAndRotateObject3DWithPickingPointAndPlaneInPointCloud( + pointAndPlane, object3d, boundingSphereRadius + ) + object3d.rotateZ(-Math.PI/2) + + // return the result + var result = {} + result.position = object3d.position + result.quaternion = object3d.quaternion + return result +} +var THREEx = THREEx || {} +/** + * - videoTexture + * - cloakWidth + * - cloakHeight + * - cloakSegmentsHeight + * - remove all mentions of cache, for cloak + */ +THREEx.ArMarkerCloak = function(videoTexture){ + var updateInShaderEnabled = true + + // build cloakMesh + // TODO if webgl2 use repeat warp, and not multi segment, this will reduce the geometry to draw + var geometry = new THREE.PlaneGeometry(1.3+0.25,1.85+0.25, 1, 8).translate(0,-0.3,0) + var material = new THREE.ShaderMaterial( { + vertexShader: THREEx.ArMarkerCloak.vertexShader, + fragmentShader: THREEx.ArMarkerCloak.fragmentShader, + transparent: true, + uniforms: { + texture: { + value: videoTexture + }, + opacity: { + value: 0.5 + } + }, + defines: { + updateInShaderEnabled: updateInShaderEnabled ? 1 : 0, + } + }); + + var cloakMesh = new THREE.Mesh( geometry, material ); + cloakMesh.rotation.x = -Math.PI/2 + this.object3d = cloakMesh + + ////////////////////////////////////////////////////////////////////////////// + // Code Separator + ////////////////////////////////////////////////////////////////////////////// + + var xMin = -0.65 + var xMax = 0.65 + var yMin = 0.65 + 0.1 + var yMax = 0.95 + 0.1 + + ////////////////////////////////////////////////////////////////////////////// + // originalsFaceVertexUvs + ////////////////////////////////////////////////////////////////////////////// + var originalsFaceVertexUvs = [[]] + + // build originalsFaceVertexUvs array + for(var faceIndex = 0; faceIndex < cloakMesh.geometry.faces.length; faceIndex ++ ){ + originalsFaceVertexUvs[0][faceIndex] = [] + originalsFaceVertexUvs[0][faceIndex][0] = new THREE.Vector2() + originalsFaceVertexUvs[0][faceIndex][1] = new THREE.Vector2() + originalsFaceVertexUvs[0][faceIndex][2] = new THREE.Vector2() + } + + // set values in originalsFaceVertexUvs + for(var i = 0; i < cloakMesh.geometry.parameters.heightSegments/2; i ++ ){ + // one segment height - even row - normale orientation + originalsFaceVertexUvs[0][i*4+0][0].set( xMin/2+0.5, yMax/2+0.5 ) + originalsFaceVertexUvs[0][i*4+0][1].set( xMin/2+0.5, yMin/2+0.5 ) + originalsFaceVertexUvs[0][i*4+0][2].set( xMax/2+0.5, yMax/2+0.5 ) + + originalsFaceVertexUvs[0][i*4+1][0].set( xMin/2+0.5, yMin/2+0.5 ) + originalsFaceVertexUvs[0][i*4+1][1].set( xMax/2+0.5, yMin/2+0.5 ) + originalsFaceVertexUvs[0][i*4+1][2].set( xMax/2+0.5, yMax/2+0.5 ) + + // one segment height - odd row - mirror-y orientation + originalsFaceVertexUvs[0][i*4+2][0].set( xMin/2+0.5, yMin/2+0.5 ) + originalsFaceVertexUvs[0][i*4+2][1].set( xMin/2+0.5, yMax/2+0.5 ) + originalsFaceVertexUvs[0][i*4+2][2].set( xMax/2+0.5, yMin/2+0.5 ) + + originalsFaceVertexUvs[0][i*4+3][0].set( xMin/2+0.5, yMax/2+0.5 ) + originalsFaceVertexUvs[0][i*4+3][1].set( xMax/2+0.5, yMax/2+0.5 ) + originalsFaceVertexUvs[0][i*4+3][2].set( xMax/2+0.5, yMin/2+0.5 ) + } + + if( updateInShaderEnabled === true ){ + cloakMesh.geometry.faceVertexUvs = originalsFaceVertexUvs + cloakMesh.geometry.uvsNeedUpdate = true + } + + ////////////////////////////////////////////////////////////////////////////// + // Code Separator + ////////////////////////////////////////////////////////////////////////////// + + var originalOrthoVertices = [] + originalOrthoVertices.push( new THREE.Vector3(xMin, yMax, 0)) + originalOrthoVertices.push( new THREE.Vector3(xMax, yMax, 0)) + originalOrthoVertices.push( new THREE.Vector3(xMin, yMin, 0)) + originalOrthoVertices.push( new THREE.Vector3(xMax, yMin, 0)) + + // build debugMesh + var material = new THREE.MeshNormalMaterial({ + transparent : true, + opacity: 0.5, + side: THREE.DoubleSide + }); + var geometry = new THREE.PlaneGeometry(1,1); + var orthoMesh = new THREE.Mesh(geometry, material); + this.orthoMesh = orthoMesh + + ////////////////////////////////////////////////////////////////////////////// + // Code Separator + ////////////////////////////////////////////////////////////////////////////// + + this.update = function(modelViewMatrix, cameraProjectionMatrix){ + updateOrtho(modelViewMatrix, cameraProjectionMatrix) + + if( updateInShaderEnabled === false ){ + updateUvs(modelViewMatrix, cameraProjectionMatrix) + } + } + + return + + // update cloakMesh + function updateUvs(modelViewMatrix, cameraProjectionMatrix){ + var transformedUv = new THREE.Vector3() + originalsFaceVertexUvs[0].forEach(function(faceVertexUvs, faceIndex){ + faceVertexUvs.forEach(function(originalUv, uvIndex){ + // set transformedUv - from UV coord to clip coord + transformedUv.x = originalUv.x * 2.0 - 1.0; + transformedUv.y = originalUv.y * 2.0 - 1.0; + transformedUv.z = 0 + // apply modelViewMatrix and projectionMatrix + transformedUv.applyMatrix4( modelViewMatrix ) + transformedUv.applyMatrix4( cameraProjectionMatrix ) + // apply perspective + transformedUv.x /= transformedUv.z + transformedUv.y /= transformedUv.z + // set back from clip coord to Uv coord + transformedUv.x = transformedUv.x / 2.0 + 0.5; + transformedUv.y = transformedUv.y / 2.0 + 0.5; + // copy the trasnformedUv into the geometry + cloakMesh.geometry.faceVertexUvs[0][faceIndex][uvIndex].set(transformedUv.x, transformedUv.y) + }) + }) + + // cloakMesh.geometry.faceVertexUvs = faceVertexUvs + cloakMesh.geometry.uvsNeedUpdate = true + } + + // update orthoMesh + function updateOrtho(modelViewMatrix, cameraProjectionMatrix){ + // compute transformedUvs + var transformedUvs = [] + originalOrthoVertices.forEach(function(originalOrthoVertices, index){ + var transformedUv = originalOrthoVertices.clone() + // apply modelViewMatrix and projectionMatrix + transformedUv.applyMatrix4( modelViewMatrix ) + transformedUv.applyMatrix4( cameraProjectionMatrix ) + // apply perspective + transformedUv.x /= transformedUv.z + transformedUv.y /= transformedUv.z + // store it + transformedUvs.push(transformedUv) + }) + + // change orthoMesh vertices + for(var i = 0; i < transformedUvs.length; i++){ + orthoMesh.geometry.vertices[i].copy(transformedUvs[i]) + } + orthoMesh.geometry.computeBoundingSphere() + orthoMesh.geometry.verticesNeedUpdate = true + } + +} + +////////////////////////////////////////////////////////////////////////////// +// Shaders +////////////////////////////////////////////////////////////////////////////// + +THREEx.ArMarkerCloak.markerSpaceShaderFunction = '\n'+ +' vec2 transformUvToMarkerSpace(vec2 originalUv){\n'+ +' vec3 transformedUv;\n'+ +' // set transformedUv - from UV coord to clip coord\n'+ +' transformedUv.x = originalUv.x * 2.0 - 1.0;\n'+ +' transformedUv.y = originalUv.y * 2.0 - 1.0;\n'+ +' transformedUv.z = 0.0;\n'+ +'\n'+ +' // apply modelViewMatrix and projectionMatrix\n'+ +' transformedUv = (projectionMatrix * modelViewMatrix * vec4( transformedUv, 1.0 ) ).xyz;\n'+ +'\n'+ +' // apply perspective\n'+ +' transformedUv.x /= transformedUv.z;\n'+ +' transformedUv.y /= transformedUv.z;\n'+ +'\n'+ +' // set back from clip coord to Uv coord\n'+ +' transformedUv.x = transformedUv.x / 2.0 + 0.5;\n'+ +' transformedUv.y = transformedUv.y / 2.0 + 0.5;\n'+ +'\n'+ +' // return the result\n'+ +' return transformedUv.xy;\n'+ +' }' + +THREEx.ArMarkerCloak.vertexShader = THREEx.ArMarkerCloak.markerSpaceShaderFunction + +' varying vec2 vUv;\n'+ +'\n'+ +' void main(){\n'+ +' // pass the UV to the fragment\n'+ +' #if (updateInShaderEnabled == 1)\n'+ +' vUv = transformUvToMarkerSpace(uv);\n'+ +' #else\n'+ +' vUv = uv;\n'+ +' #endif\n'+ +'\n'+ +' // compute gl_Position\n'+ +' vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n'+ +' gl_Position = projectionMatrix * mvPosition;\n'+ +' }'; + +THREEx.ArMarkerCloak.fragmentShader = '\n'+ +' varying vec2 vUv;\n'+ +' uniform sampler2D texture;\n'+ +' uniform float opacity;\n'+ +'\n'+ +' void main(void){\n'+ +' vec3 color = texture2D( texture, vUv ).rgb;\n'+ +'\n'+ +' gl_FragColor = vec4( color, opacity);\n'+ +' }' +var ARjs = ARjs || {} +var THREEx = THREEx || {} + +ARjs.MarkerControls = THREEx.ArMarkerControls = function(context, object3d, parameters){ + var _this = this + + THREEx.ArBaseControls.call(this, object3d) + + this.context = context + // handle default parameters + this.parameters = { + // size of the marker in meter + size : 1, + // type of marker - ['pattern', 'barcode', 'unknown' ] + type : 'unknown', + // url of the pattern - IIF type='pattern' + patternUrl : null, + // value of the barcode - IIF type='barcode' + barcodeValue : null, + // change matrix mode - [modelViewMatrix, cameraTransformMatrix] + changeMatrixMode : 'modelViewMatrix', + // minimal confidence in the marke recognition - between [0, 1] - default to 1 + minConfidence: 0.6, + } + + // sanity check + var possibleValues = ['pattern', 'barcode', 'unknown'] + console.assert(possibleValues.indexOf(this.parameters.type) !== -1, 'illegal value', this.parameters.type) + var possibleValues = ['modelViewMatrix', 'cameraTransformMatrix' ] + console.assert(possibleValues.indexOf(this.parameters.changeMatrixMode) !== -1, 'illegal value', this.parameters.changeMatrixMode) + + + // create the marker Root + this.object3d = object3d + this.object3d.matrixAutoUpdate = false; + this.object3d.visible = false + + ////////////////////////////////////////////////////////////////////////////// + // setParameters + ////////////////////////////////////////////////////////////////////////////// + setParameters(parameters) + function setParameters(parameters){ + if( parameters === undefined ) return + for( var key in parameters ){ + var newValue = parameters[ key ] + + if( newValue === undefined ){ + console.warn( "THREEx.ArMarkerControls: '" + key + "' parameter is undefined." ) + continue + } + + var currentValue = _this.parameters[ key ] + + if( currentValue === undefined ){ + console.warn( "THREEx.ArMarkerControls: '" + key + "' is not a property of this material." ) + continue + } + + _this.parameters[ key ] = newValue + } + } + + ////////////////////////////////////////////////////////////////////////////// + // Code Separator + ////////////////////////////////////////////////////////////////////////////// + // add this marker to artoolkitsystem + // TODO rename that .addMarkerControls + context.addMarker(this) + + if( _this.context.parameters.trackingBackend === 'artoolkit' ){ + this._initArtoolkit() + }else if( _this.context.parameters.trackingBackend === 'aruco' ){ + // TODO create a ._initAruco + // put aruco second + this._arucoPosit = new POS.Posit(this.parameters.size, _this.context.arucoContext.canvas.width) + }else if( _this.context.parameters.trackingBackend === 'tango' ){ + this._initTango() + }else console.assert(false) +} + +ARjs.MarkerControls.prototype = Object.create( THREEx.ArBaseControls.prototype ); +ARjs.MarkerControls.prototype.constructor = THREEx.ArMarkerControls; + +ARjs.MarkerControls.prototype.dispose = function(){ + this.context.removeMarker(this) + + // TODO remove the event listener if needed + // unloadMaker ??? +} + +////////////////////////////////////////////////////////////////////////////// +// update controls with new modelViewMatrix +////////////////////////////////////////////////////////////////////////////// + +/** + * When you actually got a new modelViewMatrix, you need to perfom a whole bunch + * of things. it is done here. + */ +ARjs.MarkerControls.prototype.updateWithModelViewMatrix = function(modelViewMatrix){ + var markerObject3D = this.object3d; + + // mark object as visible + markerObject3D.visible = true + + if( this.context.parameters.trackingBackend === 'artoolkit' ){ + // apply context._axisTransformMatrix - change artoolkit axis to match usual webgl one + var tmpMatrix = new THREE.Matrix4().copy(this.context._artoolkitProjectionAxisTransformMatrix) + tmpMatrix.multiply(modelViewMatrix) + + modelViewMatrix.copy(tmpMatrix) + }else if( this.context.parameters.trackingBackend === 'aruco' ){ + // ... + }else if( this.context.parameters.trackingBackend === 'tango' ){ + // ... + }else console.assert(false) + + + if( this.context.parameters.trackingBackend !== 'tango' ){ + + // change axis orientation on marker - artoolkit say Z is normal to the marker - ar.js say Y is normal to the marker + var markerAxisTransformMatrix = new THREE.Matrix4().makeRotationX(Math.PI/2) + modelViewMatrix.multiply(markerAxisTransformMatrix) + } + + // change markerObject3D.matrix based on parameters.changeMatrixMode + if( this.parameters.changeMatrixMode === 'modelViewMatrix' ){ + markerObject3D.matrix.copy(modelViewMatrix) + }else if( this.parameters.changeMatrixMode === 'cameraTransformMatrix' ){ + markerObject3D.matrix.getInverse( modelViewMatrix ) + }else { + console.assert(false) + } + + // decompose - the matrix into .position, .quaternion, .scale + markerObject3D.matrix.decompose(markerObject3D.position, markerObject3D.quaternion, markerObject3D.scale) + + // dispatchEvent + this.dispatchEvent( { type: 'markerFound' } ); +} + +////////////////////////////////////////////////////////////////////////////// +// utility functions +////////////////////////////////////////////////////////////////////////////// + +/** + * provide a name for a marker + * - silly heuristic for now + * - should be improved + */ +ARjs.MarkerControls.prototype.name = function(){ + var name = '' + name += this.parameters.type; + if( this.parameters.type === 'pattern' ){ + var url = this.parameters.patternUrl + var basename = url.replace(/^.*\//g, '') + name += ' - ' + basename + }else if( this.parameters.type === 'barcode' ){ + name += ' - ' + this.parameters.barcodeValue + }else{ + console.assert(false, 'no .name() implemented for this marker controls') + } + return name +} + +////////////////////////////////////////////////////////////////////////////// +// init for Artoolkit +////////////////////////////////////////////////////////////////////////////// +ARjs.MarkerControls.prototype._initArtoolkit = function(){ + var _this = this + + var artoolkitMarkerId = null + + var delayedInitTimerId = setInterval(function(){ + // check if arController is init + var arController = _this.context.arController + if( arController === null ) return + // stop looping if it is init + clearInterval(delayedInitTimerId) + delayedInitTimerId = null + // launch the _postInitArtoolkit + postInit() + }, 1000/50) + + return + + function postInit(){ + // check if arController is init + var arController = _this.context.arController + console.assert(arController !== null ) + + // start tracking this pattern + if( _this.parameters.type === 'pattern' ){ + arController.loadMarker(_this.parameters.patternUrl, function(markerId) { + artoolkitMarkerId = markerId + arController.trackPatternMarkerId(artoolkitMarkerId, _this.parameters.size); + }); + }else if( _this.parameters.type === 'barcode' ){ + artoolkitMarkerId = _this.parameters.barcodeValue + arController.trackBarcodeMarkerId(artoolkitMarkerId, _this.parameters.size); + }else if( _this.parameters.type === 'unknown' ){ + artoolkitMarkerId = null + }else{ + console.log(false, 'invalid marker type', _this.parameters.type) + } + + // listen to the event + arController.addEventListener('getMarker', function(event){ + if( event.data.type === artoolkit.PATTERN_MARKER && _this.parameters.type === 'pattern' ){ + if( artoolkitMarkerId === null ) return + if( event.data.marker.idPatt === artoolkitMarkerId ) onMarkerFound(event) + }else if( event.data.type === artoolkit.BARCODE_MARKER && _this.parameters.type === 'barcode' ){ + // console.log('BARCODE_MARKER idMatrix', event.data.marker.idMatrix, artoolkitMarkerId ) + if( artoolkitMarkerId === null ) return + if( event.data.marker.idMatrix === artoolkitMarkerId ) onMarkerFound(event) + }else if( event.data.type === artoolkit.UNKNOWN_MARKER && _this.parameters.type === 'unknown'){ + onMarkerFound(event) + } + }) + + } + + function onMarkerFound(event){ + // honor his.parameters.minConfidence + if( event.data.type === artoolkit.PATTERN_MARKER && event.data.marker.cfPatt < _this.parameters.minConfidence ) return + if( event.data.type === artoolkit.BARCODE_MARKER && event.data.marker.cfMatt < _this.parameters.minConfidence ) return + + var modelViewMatrix = new THREE.Matrix4().fromArray(event.data.matrix) + _this.updateWithModelViewMatrix(modelViewMatrix) + } +} + +////////////////////////////////////////////////////////////////////////////// +// aruco specific +////////////////////////////////////////////////////////////////////////////// +ARjs.MarkerControls.prototype._initAruco = function(){ + this._arucoPosit = new POS.Posit(this.parameters.size, _this.context.arucoContext.canvas.width) +} + +////////////////////////////////////////////////////////////////////////////// +// init for Artoolkit +////////////////////////////////////////////////////////////////////////////// +ARjs.MarkerControls.prototype._initTango = function(){ + var _this = this + console.log('init tango ArMarkerControls') +} +var THREEx = THREEx || {} + +THREEx.ArMarkerHelper = function(markerControls){ + this.object3d = new THREE.Group + + var mesh = new THREE.AxisHelper() + this.object3d.add(mesh) + + var text = markerControls.id + // debugger + // var text = markerControls.parameters.patternUrl.slice(-1).toUpperCase(); + + var canvas = document.createElement( 'canvas' ); + canvas.width = 64; + canvas.height = 64; + + var context = canvas.getContext( '2d' ); + var texture = new THREE.CanvasTexture( canvas ); + + // put the text in the sprite + context.font = '48px monospace'; + context.fillStyle = 'rgba(192,192,255, 0.5)'; + context.fillRect( 0, 0, canvas.width, canvas.height ); + context.fillStyle = 'darkblue'; + context.fillText(text, canvas.width/4, 3*canvas.height/4 ) + texture.needsUpdate = true + + // var geometry = new THREE.CubeGeometry(1, 1, 1) + var geometry = new THREE.PlaneGeometry(1, 1) + var material = new THREE.MeshBasicMaterial({ + map: texture, + transparent: true + }); + var mesh = new THREE.Mesh(geometry, material) + mesh.rotation.x = -Math.PI/2 + + this.object3d.add(mesh) + +} +var THREEx = THREEx || {} + +/** + * - lerp position/quaternino/scale + * - minDelayDetected + * - minDelayUndetected + * @param {[type]} object3d [description] + * @param {[type]} parameters [description] + */ +THREEx.ArSmoothedControls = function(object3d, parameters){ + var _this = this + + THREEx.ArBaseControls.call(this, object3d) + + // copy parameters + this.object3d.visible = false + + this._lastLerpStepAt = null + this._visibleStartedAt = null + this._unvisibleStartedAt = null + + // handle default parameters + parameters = parameters || {} + this.parameters = { + // lerp coeficient for the position - between [0,1] - default to 1 + lerpPosition: 0.8, + // lerp coeficient for the quaternion - between [0,1] - default to 1 + lerpQuaternion: 0.2, + // lerp coeficient for the scale - between [0,1] - default to 1 + lerpScale: 0.7, + // delay for lerp fixed steps - in seconds - default to 1/120 + lerpStepDelay: 1/60, + // minimum delay the sub-control must be visible before this controls become visible - default to 0 seconds + minVisibleDelay: 0.0, + // minimum delay the sub-control must be unvisible before this controls become unvisible - default to 0 seconds + minUnvisibleDelay: 0.2, + } + + ////////////////////////////////////////////////////////////////////////////// + // setParameters + ////////////////////////////////////////////////////////////////////////////// + setParameters(parameters) + function setParameters(parameters){ + if( parameters === undefined ) return + for( var key in parameters ){ + var newValue = parameters[ key ] + + if( newValue === undefined ){ + console.warn( "THREEx.ArSmoothedControls: '" + key + "' parameter is undefined." ) + continue + } + + var currentValue = _this.parameters[ key ] + + if( currentValue === undefined ){ + console.warn( "THREEx.ArSmoothedControls: '" + key + "' is not a property of this material." ) + continue + } + + _this.parameters[ key ] = newValue + } + } +} + +THREEx.ArSmoothedControls.prototype = Object.create( THREEx.ArBaseControls.prototype ); +THREEx.ArSmoothedControls.prototype.constructor = THREEx.ArSmoothedControls; + +////////////////////////////////////////////////////////////////////////////// +// update function +////////////////////////////////////////////////////////////////////////////// + +THREEx.ArSmoothedControls.prototype.update = function(targetObject3d){ + var object3d = this.object3d + var parameters = this.parameters + var wasVisible = object3d.visible + var present = performance.now()/1000 + + + ////////////////////////////////////////////////////////////////////////////// + // handle object3d.visible with minVisibleDelay/minUnvisibleDelay + ////////////////////////////////////////////////////////////////////////////// + if( targetObject3d.visible === false ) this._visibleStartedAt = null + if( targetObject3d.visible === true ) this._unvisibleStartedAt = null + + if( targetObject3d.visible === true && this._visibleStartedAt === null ) this._visibleStartedAt = present + if( targetObject3d.visible === false && this._unvisibleStartedAt === null ) this._unvisibleStartedAt = present + + if( wasVisible === false && targetObject3d.visible === true ){ + var visibleFor = present - this._visibleStartedAt + if( visibleFor >= this.parameters.minVisibleDelay ){ + object3d.visible = true + snapDirectlyToTarget() + } + // console.log('visibleFor', visibleFor) + } + + if( wasVisible === true && targetObject3d.visible === false ){ + var unvisibleFor = present - this._unvisibleStartedAt + if( unvisibleFor >= this.parameters.minUnvisibleDelay ){ + object3d.visible = false + } + } + + ////////////////////////////////////////////////////////////////////////////// + // apply lerp on positon/quaternion/scale + ////////////////////////////////////////////////////////////////////////////// + + // apply lerp steps - require fix time steps to behave the same no matter the fps + if( this._lastLerpStepAt === null ){ + applyOneSlerpStep() + this._lastLerpStepAt = present + }else{ + var nStepsToDo = Math.floor( (present - this._lastLerpStepAt)/this.parameters.lerpStepDelay ) + for(var i = 0; i < nStepsToDo; i++){ + applyOneSlerpStep() + this._lastLerpStepAt += this.parameters.lerpStepDelay + } + } + + // disable the lerp by directly copying targetObject3d position/quaternion/scale + if( false ){ + snapDirectlyToTarget() + } + + // update the matrix + this.object3d.updateMatrix() + + ////////////////////////////////////////////////////////////////////////////// + // honor becameVisible/becameUnVisible event + ////////////////////////////////////////////////////////////////////////////// + // honor becameVisible event + if( wasVisible === false && object3d.visible === true ){ + this.dispatchEvent({ type: 'becameVisible' }) + } + // honor becameUnVisible event + if( wasVisible === true && object3d.visible === false ){ + this.dispatchEvent({ type: 'becameUnVisible' }) + } + return + + function snapDirectlyToTarget(){ + object3d.position.copy( targetObject3d.position ) + object3d.quaternion.copy( targetObject3d.quaternion ) + object3d.scale.copy( targetObject3d.scale ) + } + + function applyOneSlerpStep(){ + object3d.position.lerp(targetObject3d.position, parameters.lerpPosition) + object3d.quaternion.slerp(targetObject3d.quaternion, parameters.lerpQuaternion) + object3d.scale.lerp(targetObject3d.scale, parameters.lerpScale) + } +} +var ARjs = ARjs || {} +var THREEx = THREEx || {} + +ARjs.Context = THREEx.ArToolkitContext = function(parameters){ + var _this = this + + _this._updatedAt = null + + // handle default parameters + this.parameters = { + // AR backend - ['artoolkit', 'aruco', 'tango'] + trackingBackend: 'artoolkit', + // debug - true if one should display artoolkit debug canvas, false otherwise + debug: false, + // the mode of detection - ['color', 'color_and_matrix', 'mono', 'mono_and_matrix'] + detectionMode: 'mono', + // type of matrix code - valid iif detectionMode end with 'matrix' - [3x3, 3x3_HAMMING63, 3x3_PARITY65, 4x4, 4x4_BCH_13_9_3, 4x4_BCH_13_5_5] + matrixCodeType: '3x3', + + // url of the camera parameters + cameraParametersUrl: ARjs.Context.baseURL + 'parameters/camera_para.dat', + + // tune the maximum rate of pose detection in the source image + maxDetectionRate: 60, + // resolution of at which we detect pose in the source image + canvasWidth: 640, + canvasHeight: 480, + + // the patternRatio inside the artoolkit marker - artoolkit only + patternRatio: 0.5, + + // enable image smoothing or not for canvas copy - default to true + // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/imageSmoothingEnabled + imageSmoothingEnabled : false, + } + // parameters sanity check + console.assert(['artoolkit', 'aruco', 'tango'].indexOf(this.parameters.trackingBackend) !== -1, 'invalid parameter trackingBackend', this.parameters.trackingBackend) + console.assert(['color', 'color_and_matrix', 'mono', 'mono_and_matrix'].indexOf(this.parameters.detectionMode) !== -1, 'invalid parameter detectionMode', this.parameters.detectionMode) + + this.arController = null; + this.arucoContext = null; + + _this.initialized = false + + + this._arMarkersControls = [] + + ////////////////////////////////////////////////////////////////////////////// + // setParameters + ////////////////////////////////////////////////////////////////////////////// + setParameters(parameters) + function setParameters(parameters){ + if( parameters === undefined ) return + for( var key in parameters ){ + var newValue = parameters[ key ] + + if( newValue === undefined ){ + console.warn( "THREEx.ArToolkitContext: '" + key + "' parameter is undefined." ) + continue + } + + var currentValue = _this.parameters[ key ] + + if( currentValue === undefined ){ + console.warn( "THREEx.ArToolkitContext: '" + key + "' is not a property of this material." ) + continue + } + + _this.parameters[ key ] = newValue + } + } +} + +Object.assign( ARjs.Context.prototype, THREE.EventDispatcher.prototype ); + +// ARjs.Context.baseURL = '../' +// default to github page +ARjs.Context.baseURL = 'https://jeromeetienne.github.io/AR.js/three.js/' +ARjs.Context.REVISION = '1.6.0' + + + +/** + * Create a default camera for this trackingBackend + * @param {string} trackingBackend - the tracking to user + * @return {THREE.Camera} the created camera + */ +ARjs.Context.createDefaultCamera = function( trackingBackend ){ + console.assert(false, 'use ARjs.Utils.createDefaultCamera instead') + // Create a camera + if( trackingBackend === 'artoolkit' ){ + var camera = new THREE.Camera(); + }else if( trackingBackend === 'aruco' ){ + var camera = new THREE.PerspectiveCamera(42, renderer.domElement.width / renderer.domElement.height, 0.01, 100); + }else if( trackingBackend === 'tango' ){ + var camera = new THREE.PerspectiveCamera(42, renderer.domElement.width / renderer.domElement.height, 0.01, 100); + }else console.assert(false) + return camera +} + + +////////////////////////////////////////////////////////////////////////////// +// init functions +////////////////////////////////////////////////////////////////////////////// +ARjs.Context.prototype.init = function(onCompleted){ + var _this = this + if( this.parameters.trackingBackend === 'artoolkit' ){ + this._initArtoolkit(done) + }else if( this.parameters.trackingBackend === 'aruco' ){ + this._initAruco(done) + }else if( this.parameters.trackingBackend === 'tango' ){ + this._initTango(done) + }else console.assert(false) + return + + function done(){ + // dispatch event + _this.dispatchEvent({ + type: 'initialized' + }); + + _this.initialized = true + + onCompleted && onCompleted() + } + +} +//////////////////////////////////////////////////////////////////////////////// +// update function +//////////////////////////////////////////////////////////////////////////////// +ARjs.Context.prototype.update = function(srcElement){ + + // be sure arController is fully initialized + if(this.parameters.trackingBackend === 'artoolkit' && this.arController === null) return false; + + // honor this.parameters.maxDetectionRate + var present = performance.now() + if( this._updatedAt !== null && present - this._updatedAt < 1000/this.parameters.maxDetectionRate ){ + return false + } + this._updatedAt = present + + // mark all markers to invisible before processing this frame + this._arMarkersControls.forEach(function(markerControls){ + markerControls.object3d.visible = false + }) + + // process this frame + if(this.parameters.trackingBackend === 'artoolkit'){ + this._updateArtoolkit(srcElement) + }else if( this.parameters.trackingBackend === 'aruco' ){ + this._updateAruco(srcElement) + }else if( this.parameters.trackingBackend === 'tango' ){ + this._updateTango(srcElement) + }else{ + console.assert(false) + } + + // dispatch event + this.dispatchEvent({ + type: 'sourceProcessed' + }); + + + // return true as we processed the frame + return true; +} + +//////////////////////////////////////////////////////////////////////////////// +// Add/Remove markerControls +//////////////////////////////////////////////////////////////////////////////// +ARjs.Context.prototype.addMarker = function(arMarkerControls){ + console.assert(arMarkerControls instanceof THREEx.ArMarkerControls) + this._arMarkersControls.push(arMarkerControls) +} + +ARjs.Context.prototype.removeMarker = function(arMarkerControls){ + console.assert(arMarkerControls instanceof THREEx.ArMarkerControls) + // console.log('remove marker for', arMarkerControls) + var index = this.arMarkerControlss.indexOf(artoolkitMarker); + console.assert(index !== index ) + this._arMarkersControls.splice(index, 1) +} + +////////////////////////////////////////////////////////////////////////////// +// artoolkit specific +////////////////////////////////////////////////////////////////////////////// +ARjs.Context.prototype._initArtoolkit = function(onCompleted){ + var _this = this + + // set this._artoolkitProjectionAxisTransformMatrix to change artoolkit projection matrix axis to match usual webgl one + this._artoolkitProjectionAxisTransformMatrix = new THREE.Matrix4() + this._artoolkitProjectionAxisTransformMatrix.multiply(new THREE.Matrix4().makeRotationY(Math.PI)) + this._artoolkitProjectionAxisTransformMatrix.multiply(new THREE.Matrix4().makeRotationZ(Math.PI)) + + // get cameraParameters + var cameraParameters = new ARCameraParam(_this.parameters.cameraParametersUrl, function(){ + // init controller + var arController = new ARController(_this.parameters.canvasWidth, _this.parameters.canvasHeight, cameraParameters); + _this.arController = arController + + // honor this.parameters.imageSmoothingEnabled + arController.ctx.mozImageSmoothingEnabled = _this.parameters.imageSmoothingEnabled; + arController.ctx.webkitImageSmoothingEnabled = _this.parameters.imageSmoothingEnabled; + arController.ctx.msImageSmoothingEnabled = _this.parameters.imageSmoothingEnabled; + arController.ctx.imageSmoothingEnabled = _this.parameters.imageSmoothingEnabled; + + // honor this.parameters.debug + if( _this.parameters.debug === true ){ + arController.debugSetup(); + arController.canvas.style.position = 'absolute' + arController.canvas.style.top = '0px' + arController.canvas.style.opacity = '0.6' + arController.canvas.style.pointerEvents = 'none' + arController.canvas.style.zIndex = '-1' + } + + // setPatternDetectionMode + var detectionModes = { + 'color' : artoolkit.AR_TEMPLATE_MATCHING_COLOR, + 'color_and_matrix' : artoolkit.AR_TEMPLATE_MATCHING_COLOR_AND_MATRIX, + 'mono' : artoolkit.AR_TEMPLATE_MATCHING_MONO, + 'mono_and_matrix' : artoolkit.AR_TEMPLATE_MATCHING_MONO_AND_MATRIX, + } + var detectionMode = detectionModes[_this.parameters.detectionMode] + console.assert(detectionMode !== undefined) + arController.setPatternDetectionMode(detectionMode); + + // setMatrixCodeType + var matrixCodeTypes = { + '3x3' : artoolkit.AR_MATRIX_CODE_3x3, + '3x3_HAMMING63' : artoolkit.AR_MATRIX_CODE_3x3_HAMMING63, + '3x3_PARITY65' : artoolkit.AR_MATRIX_CODE_3x3_PARITY65, + '4x4' : artoolkit.AR_MATRIX_CODE_4x4, + '4x4_BCH_13_9_3': artoolkit.AR_MATRIX_CODE_4x4_BCH_13_9_3, + '4x4_BCH_13_5_5': artoolkit.AR_MATRIX_CODE_4x4_BCH_13_5_5, + } + var matrixCodeType = matrixCodeTypes[_this.parameters.matrixCodeType] + console.assert(matrixCodeType !== undefined) + arController.setMatrixCodeType(matrixCodeType); + + // set the patternRatio for artoolkit + arController.setPattRatio(_this.parameters.patternRatio); + + // set thresholding in artoolkit + // this seems to be the default + // arController.setThresholdMode(artoolkit.AR_LABELING_THRESH_MODE_MANUAL) + // adatative consume a LOT of cpu... + // arController.setThresholdMode(artoolkit.AR_LABELING_THRESH_MODE_AUTO_ADAPTIVE) + // arController.setThresholdMode(artoolkit.AR_LABELING_THRESH_MODE_AUTO_OTSU) + + // notify + onCompleted() + }) + return this +} + +/** + * return the projection matrix + */ +ARjs.Context.prototype.getProjectionMatrix = function(srcElement){ + + +// FIXME rename this function to say it is artoolkit specific - getArtoolkitProjectMatrix +// keep a backward compatibility with a console.warn + + console.assert( this.parameters.trackingBackend === 'artoolkit' ) + console.assert(this.arController, 'arController MUST be initialized to call this function') + // get projectionMatrixArr from artoolkit + var projectionMatrixArr = this.arController.getCameraMatrix(); + var projectionMatrix = new THREE.Matrix4().fromArray(projectionMatrixArr) + + // apply context._axisTransformMatrix - change artoolkit axis to match usual webgl one + projectionMatrix.multiply(this._artoolkitProjectionAxisTransformMatrix) + + // return the result + return projectionMatrix +} + +ARjs.Context.prototype._updateArtoolkit = function(srcElement){ + this.arController.process(srcElement) +} + +////////////////////////////////////////////////////////////////////////////// +// aruco specific +////////////////////////////////////////////////////////////////////////////// +ARjs.Context.prototype._initAruco = function(onCompleted){ + this.arucoContext = new THREEx.ArucoContext() + + // honor this.parameters.canvasWidth/.canvasHeight + this.arucoContext.canvas.width = this.parameters.canvasWidth + this.arucoContext.canvas.height = this.parameters.canvasHeight + + // honor this.parameters.imageSmoothingEnabled + var context = this.arucoContext.canvas.getContext('2d') + // context.mozImageSmoothingEnabled = this.parameters.imageSmoothingEnabled; + context.webkitImageSmoothingEnabled = this.parameters.imageSmoothingEnabled; + context.msImageSmoothingEnabled = this.parameters.imageSmoothingEnabled; + context.imageSmoothingEnabled = this.parameters.imageSmoothingEnabled; + + + setTimeout(function(){ + onCompleted() + }, 0) +} + + +ARjs.Context.prototype._updateAruco = function(srcElement){ + // console.log('update aruco here') + var _this = this + var arMarkersControls = this._arMarkersControls + var detectedMarkers = this.arucoContext.detect(srcElement) + + detectedMarkers.forEach(function(detectedMarker){ + var foundControls = null + for(var i = 0; i < arMarkersControls.length; i++){ + console.assert( arMarkersControls[i].parameters.type === 'barcode' ) + if( arMarkersControls[i].parameters.barcodeValue === detectedMarker.id ){ + foundControls = arMarkersControls[i] + break; + } + } + if( foundControls === null ) return + + var tmpObject3d = new THREE.Object3D + _this.arucoContext.updateObject3D(tmpObject3d, foundControls._arucoPosit, foundControls.parameters.size, detectedMarker); + tmpObject3d.updateMatrix() + + foundControls.updateWithModelViewMatrix(tmpObject3d.matrix) + }) +} + +////////////////////////////////////////////////////////////////////////////// +// tango specific +////////////////////////////////////////////////////////////////////////////// +ARjs.Context.prototype._initTango = function(onCompleted){ + var _this = this + // check webvr is available + if (navigator.getVRDisplays){ + // do nothing + } else if (navigator.getVRDevices){ + alert("Your browser supports WebVR but not the latest version. See <a href='http://webvr.info'>webvr.info</a> for more info."); + } else { + alert("Your browser does not support WebVR. See <a href='http://webvr.info'>webvr.info</a> for assistance."); + } + + + this._tangoContext = { + vrDisplay: null, + vrPointCloud: null, + frameData: new VRFrameData(), + } + + + // get vrDisplay + navigator.getVRDisplays().then(function (vrDisplays){ + if( vrDisplays.length === 0 ) alert('no vrDisplays available') + var vrDisplay = _this._tangoContext.vrDisplay = vrDisplays[0] + + console.log('vrDisplays.displayName :', vrDisplay.displayName) + + // init vrPointCloud + if( vrDisplay.displayName === "Tango VR Device" ){ + _this._tangoContext.vrPointCloud = new THREE.WebAR.VRPointCloud(vrDisplay, true) + } + + // NOTE it doesnt seem necessary and it fails on tango + // var canvasElement = document.createElement('canvas') + // document.body.appendChild(canvasElement) + // _this._tangoContext.requestPresent([{ source: canvasElement }]).then(function(){ + // console.log('vrdisplay request accepted') + // }); + + onCompleted() + }); +} + + +ARjs.Context.prototype._updateTango = function(srcElement){ + // console.log('update aruco here') + var _this = this + var arMarkersControls = this._arMarkersControls + var tangoContext= this._tangoContext + var vrDisplay = this._tangoContext.vrDisplay + + // check vrDisplay is already initialized + if( vrDisplay === null ) return + + + // Update the point cloud. Only if the point cloud will be shown the geometry is also updated. + if( vrDisplay.displayName === "Tango VR Device" ){ + var showPointCloud = true + var pointsToSkip = 0 + _this._tangoContext.vrPointCloud.update(showPointCloud, pointsToSkip, true) + } + + + if( this._arMarkersControls.length === 0 ) return + + // TODO here do a fake search on barcode/1001 ? + + var foundControls = this._arMarkersControls[0] + + var frameData = this._tangoContext.frameData + + // read frameData + vrDisplay.getFrameData(frameData); + + if( frameData.pose.position === null ) return + if( frameData.pose.orientation === null ) return + + // create cameraTransformMatrix + var position = new THREE.Vector3().fromArray(frameData.pose.position) + var quaternion = new THREE.Quaternion().fromArray(frameData.pose.orientation) + var scale = new THREE.Vector3(1,1,1) + var cameraTransformMatrix = new THREE.Matrix4().compose(position, quaternion, scale) + // compute modelViewMatrix from cameraTransformMatrix + var modelViewMatrix = new THREE.Matrix4() + modelViewMatrix.getInverse( cameraTransformMatrix ) + + foundControls.updateWithModelViewMatrix(modelViewMatrix) + + // console.log('position', position) + // if( position.x !== 0 || position.y !== 0 || position.z !== 0 ){ + // console.log('vrDisplay tracking') + // }else{ + // console.log('vrDisplay NOT tracking') + // } + +} +var ARjs = ARjs || {} +var THREEx = THREEx || {} + +/** + * ArToolkitProfile helps you build parameters for artoolkit + * - it is fully independent of the rest of the code + * - all the other classes are still expecting normal parameters + * - you can use this class to understand how to tune your specific usecase + * - it is made to help people to build parameters without understanding all the underlying details. + */ +ARjs.Profile = THREEx.ArToolkitProfile = function(){ + this.reset() + + this.performance('default') +} + + +ARjs.Profile.prototype._guessPerformanceLabel = function() { + var isMobile = navigator.userAgent.match(/Android/i) + || navigator.userAgent.match(/webOS/i) + || navigator.userAgent.match(/iPhone/i) + || navigator.userAgent.match(/iPad/i) + || navigator.userAgent.match(/iPod/i) + || navigator.userAgent.match(/BlackBerry/i) + || navigator.userAgent.match(/Windows Phone/i) + ? true : false + if( isMobile === true ){ + return 'phone-normal' + } + return 'desktop-normal' +} + +////////////////////////////////////////////////////////////////////////////// +// Code Separator +////////////////////////////////////////////////////////////////////////////// + +/** + * reset all parameters + */ +ARjs.Profile.prototype.reset = function () { + this.sourceParameters = { + // to read from the webcam + sourceType : 'webcam', + } + + this.contextParameters = { + cameraParametersUrl: THREEx.ArToolkitContext.baseURL + '../data/data/camera_para.dat', + detectionMode: 'mono', + } + this.defaultMarkerParameters = { + type : 'pattern', + patternUrl : THREEx.ArToolkitContext.baseURL + '../data/data/patt.hiro', + changeMatrixMode: 'modelViewMatrix', + } + return this +}; + +////////////////////////////////////////////////////////////////////////////// +// Performance +////////////////////////////////////////////////////////////////////////////// + + + +ARjs.Profile.prototype.performance = function(label) { + + if( label === 'default' ){ + label = this._guessPerformanceLabel() + } + + if( label === 'desktop-fast' ){ + this.contextParameters.canvasWidth = 640*3 + this.contextParameters.canvasHeight = 480*3 + + this.contextParameters.maxDetectionRate = 30 + }else if( label === 'desktop-normal' ){ + this.contextParameters.canvasWidth = 640 + this.contextParameters.canvasHeight = 480 + + this.contextParameters.maxDetectionRate = 60 + }else if( label === 'phone-normal' ){ + this.contextParameters.canvasWidth = 80*4 + this.contextParameters.canvasHeight = 60*4 + + this.contextParameters.maxDetectionRate = 30 + }else if( label === 'phone-slow' ){ + this.contextParameters.canvasWidth = 80*3 + this.contextParameters.canvasHeight = 60*3 + + this.contextParameters.maxDetectionRate = 30 + }else { + console.assert(false, 'unknonwn label '+label) + } + return this +} + +////////////////////////////////////////////////////////////////////////////// +// Marker +////////////////////////////////////////////////////////////////////////////// + + +ARjs.Profile.prototype.defaultMarker = function (trackingBackend) { + trackingBackend = trackingBackend || this.contextParameters.trackingBackend + + if( trackingBackend === 'artoolkit' ){ + this.contextParameters.detectionMode = 'mono' + this.defaultMarkerParameters.type = 'pattern' + this.defaultMarkerParameters.patternUrl = THREEx.ArToolkitContext.baseURL + '../data/data/patt.hiro' + }else if( trackingBackend === 'aruco' ){ + this.contextParameters.detectionMode = 'mono' + this.defaultMarkerParameters.type = 'barcode' + this.defaultMarkerParameters.barcodeValue = 1001 + }else if( trackingBackend === 'tango' ){ + // FIXME temporary placeholder - to reevaluate later + this.defaultMarkerParameters.type = 'barcode' + this.defaultMarkerParameters.barcodeValue = 1001 + }else console.assert(false) + + return this +} +////////////////////////////////////////////////////////////////////////////// +// Source +////////////////////////////////////////////////////////////////////////////// +ARjs.Profile.prototype.sourceWebcam = function () { + this.sourceParameters.sourceType = 'webcam' + delete this.sourceParameters.sourceUrl + return this +} + +ARjs.Profile.prototype.sourceVideo = function (url) { + this.sourceParameters.sourceType = 'video' + this.sourceParameters.sourceUrl = url + return this +} + +ARjs.Profile.prototype.sourceImage = function (url) { + this.sourceParameters.sourceType = 'image' + this.sourceParameters.sourceUrl = url + return this +} + +////////////////////////////////////////////////////////////////////////////// +// trackingBackend +////////////////////////////////////////////////////////////////////////////// +ARjs.Profile.prototype.trackingBackend = function (trackingBackend) { + console.warn('stop profile.trackingBackend() obsolete function. use .trackingMethod instead') + this.contextParameters.trackingBackend = trackingBackend + return this +} + +////////////////////////////////////////////////////////////////////////////// +// trackingBackend +////////////////////////////////////////////////////////////////////////////// +ARjs.Profile.prototype.changeMatrixMode = function (changeMatrixMode) { + this.defaultMarkerParameters.changeMatrixMode = changeMatrixMode + return this +} + +////////////////////////////////////////////////////////////////////////////// +// trackingBackend +////////////////////////////////////////////////////////////////////////////// +ARjs.Profile.prototype.trackingMethod = function (trackingMethod) { + var data = ARjs.Utils.parseTrackingMethod(trackingMethod) + this.defaultMarkerParameters.markersAreaEnabled = data.markersAreaEnabled + this.contextParameters.trackingBackend = data.trackingBackend + return this +} + +/** + * check if the profile is valid. Throw an exception is not valid + */ +ARjs.Profile.prototype.checkIfValid = function () { + if( this.contextParameters.trackingBackend === 'tango' ){ + this.sourceImage(THREEx.ArToolkitContext.baseURL + '../data/images/img.jpg') + } + return this +} +var ARjs = ARjs || {} +var THREEx = THREEx || {} + +ARjs.Source = THREEx.ArToolkitSource = function(parameters){ + var _this = this + + this.ready = false + this.domElement = null + + // handle default parameters + this.parameters = { + // type of source - ['webcam', 'image', 'video'] + sourceType : 'webcam', + // url of the source - valid if sourceType = image|video + sourceUrl : null, + + // resolution of at which we initialize in the source image + sourceWidth: 640, + sourceHeight: 480, + // resolution displayed for the source + displayWidth: 640, + displayHeight: 480, + } + ////////////////////////////////////////////////////////////////////////////// + // setParameters + ////////////////////////////////////////////////////////////////////////////// + setParameters(parameters) + function setParameters(parameters){ + if( parameters === undefined ) return + for( var key in parameters ){ + var newValue = parameters[ key ] + + if( newValue === undefined ){ + console.warn( "THREEx.ArToolkitSource: '" + key + "' parameter is undefined." ) + continue + } + + var currentValue = _this.parameters[ key ] + + if( currentValue === undefined ){ + console.warn( "THREEx.ArToolkitSource: '" + key + "' is not a property of this material." ) + continue + } + + _this.parameters[ key ] = newValue + } + } +} + +////////////////////////////////////////////////////////////////////////////// +// Code Separator +////////////////////////////////////////////////////////////////////////////// +ARjs.Source.prototype.init = function(onReady, onError){ + var _this = this + + if( this.parameters.sourceType === 'image' ){ + var domElement = this._initSourceImage(onSourceReady, onError) + }else if( this.parameters.sourceType === 'video' ){ + var domElement = this._initSourceVideo(onSourceReady, onError) + }else if( this.parameters.sourceType === 'webcam' ){ + // var domElement = this._initSourceWebcamOld(onSourceReady) + var domElement = this._initSourceWebcam(onSourceReady, onError) + }else{ + console.assert(false) + } + + // attach + this.domElement = domElement + this.domElement.style.position = 'absolute' + this.domElement.style.top = '0px' + this.domElement.style.left = '0px' + this.domElement.style.zIndex = '-2' + + return this + function onSourceReady(){ + document.body.appendChild(_this.domElement); + + _this.ready = true + + onReady && onReady() + } +} + +//////////////////////////////////////////////////////////////////////////////// +// init image source +//////////////////////////////////////////////////////////////////////////////// + + +ARjs.Source.prototype._initSourceImage = function(onReady) { + // TODO make it static + var domElement = document.createElement('img') + domElement.src = this.parameters.sourceUrl + + domElement.width = this.parameters.sourceWidth + domElement.height = this.parameters.sourceHeight + domElement.style.width = this.parameters.displayWidth+'px' + domElement.style.height = this.parameters.displayHeight+'px' + + // wait until the video stream is ready + var interval = setInterval(function() { + if (!domElement.naturalWidth) return; + onReady() + clearInterval(interval) + }, 1000/50); + + return domElement +} + +//////////////////////////////////////////////////////////////////////////////// +// init video source +//////////////////////////////////////////////////////////////////////////////// + + +ARjs.Source.prototype._initSourceVideo = function(onReady) { + // TODO make it static + var domElement = document.createElement('video'); + domElement.src = this.parameters.sourceUrl + + domElement.style.objectFit = 'initial' + + domElement.autoplay = true; + domElement.webkitPlaysinline = true; + domElement.controls = false; + domElement.loop = true; + domElement.muted = true + + // trick to trigger the video on android + document.body.addEventListener('click', function onClick(){ + document.body.removeEventListener('click', onClick); + domElement.play() + }) + + domElement.width = this.parameters.sourceWidth + domElement.height = this.parameters.sourceHeight + domElement.style.width = this.parameters.displayWidth+'px' + domElement.style.height = this.parameters.displayHeight+'px' + + // wait until the video stream is ready + var interval = setInterval(function() { + if (!domElement.videoWidth) return; + onReady() + clearInterval(interval) + }, 1000/50); + return domElement +} + +//////////////////////////////////////////////////////////////////////////////// +// handle webcam source +//////////////////////////////////////////////////////////////////////////////// + +ARjs.Source.prototype._initSourceWebcam = function(onReady, onError) { + var _this = this + + // init default value + onError = onError || function(error){ + alert('Webcam Error\nName: '+error.name + '\nMessage: '+error.message) + } + + var domElement = document.createElement('video'); + domElement.setAttribute('autoplay', ''); + domElement.setAttribute('muted', ''); + domElement.setAttribute('playsinline', ''); + domElement.style.width = this.parameters.displayWidth+'px' + domElement.style.height = this.parameters.displayHeight+'px' + + // check API is available + if (navigator.mediaDevices === undefined + || navigator.mediaDevices.enumerateDevices === undefined + || navigator.mediaDevices.getUserMedia === undefined ){ + if( navigator.mediaDevices === undefined ) var fctName = 'navigator.mediaDevices' + else if( navigator.mediaDevices.enumerateDevices === undefined ) var fctName = 'navigator.mediaDevices.enumerateDevices' + else if( navigator.mediaDevices.getUserMedia === undefined ) var fctName = 'navigator.mediaDevices.getUserMedia' + else console.assert(false) + onError({ + name: '', + message: 'WebRTC issue-! '+fctName+' not present in your browser' + }) + return null + } + + // get available devices + navigator.mediaDevices.enumerateDevices().then(function(devices) { + var userMediaConstraints = { + audio: false, + video: { + facingMode: 'environment', + width: { + ideal: _this.parameters.sourceWidth, + // min: 1024, + // max: 1920 + }, + height: { + ideal: _this.parameters.sourceHeight, + // min: 776, + // max: 1080 + } + } + } + // get a device which satisfy the constraints + navigator.mediaDevices.getUserMedia(userMediaConstraints).then(function success(stream) { + // set the .src of the domElement + domElement.srcObject = stream; + // to start the video, when it is possible to start it only on userevent. like in android + document.body.addEventListener('click', function(){ + domElement.play(); + }) + // domElement.play(); + +// TODO listen to loadedmetadata instead + // wait until the video stream is ready + var interval = setInterval(function() { + if (!domElement.videoWidth) return; + onReady() + clearInterval(interval) + }, 1000/50); + }).catch(function(error) { + onError({ + name: error.name, + message: error.message + }); + }); + }).catch(function(error) { + onError({ + message: error.message + }); + }); + + return domElement +} + +////////////////////////////////////////////////////////////////////////////// +// Handle Mobile Torch +////////////////////////////////////////////////////////////////////////////// +ARjs.Source.prototype.hasMobileTorch = function(){ + var stream = arToolkitSource.domElement.srcObject + if( stream instanceof MediaStream === false ) return false + + if( this._currentTorchStatus === undefined ){ + this._currentTorchStatus = false + } + + var videoTrack = stream.getVideoTracks()[0]; + + // if videoTrack.getCapabilities() doesnt exist, return false now + if( videoTrack.getCapabilities === undefined ) return false + + var capabilities = videoTrack.getCapabilities() + + return capabilities.torch ? true : false +} + +/** + * toggle the flash/torch of the mobile fun if applicable. + * Great post about it https://www.oberhofer.co/mediastreamtrack-and-its-capabilities/ + */ +ARjs.Source.prototype.toggleMobileTorch = function(){ + // sanity check + console.assert(this.hasMobileTorch() === true) + + var stream = arToolkitSource.domElement.srcObject + if( stream instanceof MediaStream === false ){ + alert('enabling mobile torch is available only on webcam') + return + } + + if( this._currentTorchStatus === undefined ){ + this._currentTorchStatus = false + } + + var videoTrack = stream.getVideoTracks()[0]; + var capabilities = videoTrack.getCapabilities() + + if( !capabilities.torch ){ + alert('no mobile torch is available on your camera') + return + } + + this._currentTorchStatus = this._currentTorchStatus === false ? true : false + videoTrack.applyConstraints({ + advanced: [{ + torch: this._currentTorchStatus + }] + }).catch(function(error){ + console.log(error) + }); +} + +ARjs.Source.prototype.domElementWidth = function(){ + return parseInt(this.domElement.style.width) +} +ARjs.Source.prototype.domElementHeight = function(){ + return parseInt(this.domElement.style.height) +} + +//////////////////////////////////////////////////////////////////////////////// +// handle resize +//////////////////////////////////////////////////////////////////////////////// + +ARjs.Source.prototype.onResizeElement = function(){ + var _this = this + var screenWidth = window.innerWidth + var screenHeight = window.innerHeight + + // sanity check + console.assert( arguments.length === 0 ) + + // compute sourceWidth, sourceHeight + if( this.domElement.nodeName === "IMG" ){ + var sourceWidth = this.domElement.naturalWidth + var sourceHeight = this.domElement.naturalHeight + }else if( this.domElement.nodeName === "VIDEO" ){ + var sourceWidth = this.domElement.videoWidth + var sourceHeight = this.domElement.videoHeight + }else{ + console.assert(false) + } + + // compute sourceAspect + var sourceAspect = sourceWidth / sourceHeight + // compute screenAspect + var screenAspect = screenWidth / screenHeight + + // if screenAspect < sourceAspect, then change the width, else change the height + if( screenAspect < sourceAspect ){ + // compute newWidth and set .width/.marginLeft + var newWidth = sourceAspect * screenHeight + this.domElement.style.width = newWidth+'px' + this.domElement.style.marginLeft = -(newWidth-screenWidth)/2+'px' + + // init style.height/.marginTop to normal value + this.domElement.style.height = screenHeight+'px' + this.domElement.style.marginTop = '0px' + }else{ + // compute newHeight and set .height/.marginTop + var newHeight = 1 / (sourceAspect / screenWidth) + this.domElement.style.height = newHeight+'px' + this.domElement.style.marginTop = -(newHeight-screenHeight)/2+'px' + + // init style.width/.marginLeft to normal value + this.domElement.style.width = screenWidth+'px' + this.domElement.style.marginLeft = '0px' + } +} +/* +ARjs.Source.prototype.copyElementSizeTo = function(otherElement){ + otherElement.style.width = this.domElement.style.width + otherElement.style.height = this.domElement.style.height + otherElement.style.marginLeft = this.domElement.style.marginLeft + otherElement.style.marginTop = this.domElement.style.marginTop +} +*/ + +ARjs.Source.prototype.copyElementSizeTo = function(otherElement){ + + if (window.innerWidth > window.innerHeight) + { + //landscape + otherElement.style.width = this.domElement.style.width + otherElement.style.height = this.domElement.style.height + otherElement.style.marginLeft = this.domElement.style.marginLeft + otherElement.style.marginTop = this.domElement.style.marginTop + } + else { + //portrait + otherElement.style.height = this.domElement.style.height + otherElement.style.width = (parseInt(otherElement.style.height) * 4/3)+"px"; + otherElement.style.marginLeft = ((window.innerWidth- parseInt(otherElement.style.width))/2)+"px"; + otherElement.style.marginTop = 0; + } + +} + +////////////////////////////////////////////////////////////////////////////// +// Code Separator +////////////////////////////////////////////////////////////////////////////// + +ARjs.Source.prototype.copySizeTo = function(){ + console.warn('obsolete function arToolkitSource.copySizeTo. Use arToolkitSource.copyElementSizeTo' ) + this.copyElementSizeTo.apply(this, arguments) +} + +////////////////////////////////////////////////////////////////////////////// +// Code Separator +////////////////////////////////////////////////////////////////////////////// + +ARjs.Source.prototype.onResize = function(arToolkitContext, renderer, camera){ + if( arguments.length !== 3 ){ + console.warn('obsolete function arToolkitSource.onResize. Use arToolkitSource.onResizeElement' ) + return this.onResizeElement.apply(this, arguments) + } + + var trackingBackend = arToolkitContext.parameters.trackingBackend + + + // RESIZE DOMELEMENT + if( trackingBackend === 'artoolkit' ){ + + this.onResizeElement() + + var isAframe = renderer.domElement.dataset.aframeCanvas ? true : false + if( isAframe === false ){ + this.copyElementSizeTo(renderer.domElement) + }else{ + + } + + if( arToolkitContext.arController !== null ){ + this.copyElementSizeTo(arToolkitContext.arController.canvas) + } + }else if( trackingBackend === 'aruco' ){ + this.onResizeElement() + this.copyElementSizeTo(renderer.domElement) + + this.copyElementSizeTo(arToolkitContext.arucoContext.canvas) + }else if( trackingBackend === 'tango' ){ + renderer.setSize( window.innerWidth, window.innerHeight ) + }else console.assert(false, 'unhandled trackingBackend '+trackingBackend) + + + // UPDATE CAMERA + if( trackingBackend === 'artoolkit' ){ + if( arToolkitContext.arController !== null ){ + camera.projectionMatrix.copy( arToolkitContext.getProjectionMatrix() ); + } + }else if( trackingBackend === 'aruco' ){ + camera.aspect = renderer.domElement.width / renderer.domElement.height; + camera.updateProjectionMatrix(); + }else if( trackingBackend === 'tango' ){ + var vrDisplay = arToolkitContext._tangoContext.vrDisplay + // make camera fit vrDisplay + if( vrDisplay && vrDisplay.displayName === "Tango VR Device" ) THREE.WebAR.resizeVRSeeThroughCamera(vrDisplay, camera) + }else console.assert(false, 'unhandled trackingBackend '+trackingBackend) +} +var THREEx = THREEx || {} + +THREEx.ArVideoInWebgl = function(videoTexture){ + var _this = this + + ////////////////////////////////////////////////////////////////////////////// + // plane always in front of the camera, exactly as big as the viewport + ////////////////////////////////////////////////////////////////////////////// + var geometry = new THREE.PlaneGeometry(2, 2); + var material = new THREE.MeshBasicMaterial({ + // map : new THREE.TextureLoader().load('images/water.jpg'), + map : videoTexture, + // side: THREE.DoubleSide, + // opacity: 0.5, + // color: 'pink', + // transparent: true, + }); + var seethruPlane = new THREE.Mesh(geometry, material); + this.object3d = seethruPlane + // scene.add(seethruPlane); + + // arToolkitSource.domElement.style.visibility = 'hidden' + + // TODO extract the fov from the projectionMatrix + // camera.fov = 43.1 + this.update = function(camera){ + camera.updateMatrixWorld(true) + + // get seethruPlane position + var position = new THREE.Vector3(-0,0,-20) // TODO how come you got that offset on x ??? + var position = new THREE.Vector3(-0,0,-20) // TODO how come you got that offset on x ??? + seethruPlane.position.copy(position) + camera.localToWorld(seethruPlane.position) + + // get seethruPlane quaternion + camera.matrixWorld.decompose( camera.position, camera.quaternion, camera.scale ); + seethruPlane.quaternion.copy( camera.quaternion ) + + // extract the fov from the projectionMatrix + var fov = THREE.Math.radToDeg(Math.atan(1/camera.projectionMatrix.elements[5]))*2; + // console.log('fov', fov) + + var elementWidth = parseFloat( arToolkitSource.domElement.style.width.replace(/px$/,''), 10 ) + var elementHeight = parseFloat( arToolkitSource.domElement.style.height.replace(/px$/,''), 10 ) + + var aspect = elementWidth / elementHeight + + // camera.fov = fov + // if( vrDisplay.isPresenting ){ + // fov *= 2 + // aspect *= 2 + // } + + // get seethruPlane height relative to fov + seethruPlane.scale.y = Math.tan(THREE.Math.DEG2RAD * fov/2)*position.length() + // get seethruPlane aspect + seethruPlane.scale.x = seethruPlane.scale.y * aspect + } + + ////////////////////////////////////////////////////////////////////////////// + // Code Separator + ////////////////////////////////////////////////////////////////////////////// + // var video = arToolkitSource.domElement; + // + // window.addEventListener('resize', function(){ + // updateSeeThruAspectUv(seethruPlane) + // }) + // video.addEventListener('canplaythrough', function(){ + // updateSeeThruAspectUv(seethruPlane) + // }) + // function updateSeeThruAspectUv(plane){ + // + // // if video isnt yet ready to play + // if( video.videoWidth === 0 || video.videoHeight === 0 ) return + // + // var faceVertexUvs = plane.geometry.faceVertexUvs[0] + // var screenAspect = window.innerWidth / window.innerHeight + // var videoAspect = video.videoWidth / video.videoHeight + // + // plane.geometry.uvsNeedUpdate = true + // if( screenAspect >= videoAspect ){ + // var actualHeight = videoAspect / screenAspect; + // // faceVertexUvs y 0 + // faceVertexUvs[0][1].y = 0.5 - actualHeight/2 + // faceVertexUvs[1][0].y = 0.5 - actualHeight/2 + // faceVertexUvs[1][1].y = 0.5 - actualHeight/2 + // // faceVertexUvs y 1 + // faceVertexUvs[0][0].y = 0.5 + actualHeight/2 + // faceVertexUvs[0][2].y = 0.5 + actualHeight/2 + // faceVertexUvs[1][2].y = 0.5 + actualHeight/2 + // }else{ + // var actualWidth = screenAspect / videoAspect; + // // faceVertexUvs x 0 + // faceVertexUvs[0][0].x = 0.5 - actualWidth/2 + // faceVertexUvs[0][1].x = 0.5 - actualWidth/2 + // faceVertexUvs[1][0].x = 0.5 - actualWidth/2 + // + // // faceVertexUvs x 1 + // faceVertexUvs[0][2].x = 0.5 + actualWidth/2 + // faceVertexUvs[1][1].x = 0.5 + actualWidth/2 + // faceVertexUvs[1][2].x = 0.5 + actualWidth/2 + // } + // } + +} +var THREEx = THREEx || {} + +// TODO this is useless - prefere arjs-HitTesting.js + +/** + * - maybe support .onClickFcts in each object3d + * - seems an easy light layer for clickable object + * - up to + */ +THREEx.HitTestingPlane = function(sourceElement){ + this._sourceElement = sourceElement + + // create _pickingScene + this._pickingScene = new THREE.Scene + + // create _pickingPlane + var geometry = new THREE.PlaneGeometry(20,20,19,19).rotateX(-Math.PI/2) + // var geometry = new THREE.PlaneGeometry(20,20).rotateX(-Math.PI/2) + var material = new THREE.MeshBasicMaterial({ + // opacity: 0.5, + // transparent: true, + wireframe: true + }) + // material.visible = false + this._pickingPlane = new THREE.Mesh(geometry, material) + this._pickingScene.add(this._pickingPlane) + + // Create pickingCamera + var fullWidth = parseInt(sourceElement.style.width) + var fullHeight = parseInt(sourceElement.style.height) + // TODO hardcoded fov - couch + this._pickingCamera = new THREE.PerspectiveCamera(42, fullWidth / fullHeight, 0.1, 30); +} + +////////////////////////////////////////////////////////////////////////////// +// update function +////////////////////////////////////////////////////////////////////////////// + +THREEx.HitTestingPlane.prototype.update = function(camera, pickingRoot, changeMatrixMode){ + + this.onResize() + + + if( changeMatrixMode === 'modelViewMatrix' ){ + // set pickingPlane position + var pickingPlane = this._pickingPlane + pickingRoot.parent.updateMatrixWorld() + pickingPlane.matrix.copy(pickingRoot.parent.matrixWorld) + // set position/quaternion/scale from pickingPlane.matrix + pickingPlane.matrix.decompose(pickingPlane.position, pickingPlane.quaternion, pickingPlane.scale) + }else if( changeMatrixMode === 'cameraTransformMatrix' ){ + // set pickingPlane position + var pickingCamera = this._pickingCamera + camera.updateMatrixWorld() + pickingCamera.matrix.copy(camera.matrixWorld) + // set position/quaternion/scale from pickingCamera.matrix + pickingCamera.matrix.decompose(pickingCamera.position, pickingCamera.quaternion, pickingCamera.scale) + }else console.assert(false) + + +// var position = this._pickingPlane.position +// console.log('pickingPlane position', position.x.toFixed(2), position.y.toFixed(2), position.z.toFixed(2)) +// var position = this._pickingCamera.position +// console.log('his._pickingCamera position', position.x.toFixed(2), position.y.toFixed(2), position.z.toFixed(2)) + +} + +////////////////////////////////////////////////////////////////////////////// +// resize camera +////////////////////////////////////////////////////////////////////////////// + +THREEx.HitTestingPlane.prototype.onResize = function(){ + var sourceElement = this._sourceElement + var pickingCamera = this._pickingCamera + +// FIXME why using css here ??? not even computed style +// should get the size of the elment directly independantly + var fullWidth = parseInt(sourceElement.style.width) + var fullHeight = parseInt(sourceElement.style.height) + pickingCamera.aspect = fullWidth / fullHeight + + pickingCamera.updateProjectionMatrix() +} + +////////////////////////////////////////////////////////////////////////////// +// Perform test +////////////////////////////////////////////////////////////////////////////// +THREEx.HitTestingPlane.prototype.test = function(mouseX, mouseY){ + // convert mouseX, mouseY to [-1, +1] + mouseX = (mouseX-0.5)*2 + mouseY =-(mouseY-0.5)*2 + + this._pickingScene.updateMatrixWorld(true) + + // compute intersections between mouseVector3 and pickingPlane + var raycaster = new THREE.Raycaster(); + var mouseVector3 = new THREE.Vector3(mouseX, mouseY, 1); + raycaster.setFromCamera( mouseVector3, this._pickingCamera ) + var intersects = raycaster.intersectObjects( [this._pickingPlane] ) + + if( intersects.length === 0 ) return null + + // set new demoRoot position + var position = this._pickingPlane.worldToLocal( intersects[0].point.clone() ) + // TODO here do a look at the camera ? + var quaternion = new THREE.Quaternion + var scale = new THREE.Vector3(1,1,1)//.multiplyScalar(1) + + return { + position : position, + quaternion : quaternion, + scale : scale + } +} + +////////////////////////////////////////////////////////////////////////////// +// render the pickingPlane for debug +////////////////////////////////////////////////////////////////////////////// + +THREEx.HitTestingPlane.prototype.renderDebug = function(renderer){ + // render sceneOrtho + renderer.render( this._pickingScene, this._pickingCamera ) +} +var THREEx = THREEx || {} + +/** + * @class + * + * @return {[type]} [description] + */ +THREEx.HitTestingTango = function(arContext){ + this._arContext = arContext + // seems to be the object bounding sphere for picking + this.boundingSphereRadius = 0.01 + // default result scale + this.resultScale = new THREE.Vector3(1,1,1).multiplyScalar(1) +} + +////////////////////////////////////////////////////////////////////////////// +// update function +////////////////////////////////////////////////////////////////////////////// + +THREEx.HitTestingTango.prototype.update = function(){ +} + +////////////////////////////////////////////////////////////////////////////// +// Code Separator +////////////////////////////////////////////////////////////////////////////// +/** + * do the actual testing + * + * @param {ARjs.Context} arContext - context to use + * @param {Number} mouseX - mouse x coordinate in [0, 1] + * @param {Numer} mouseY - mouse y coordinate in [0, 1] + * @return {Object} - result + */ +THREEx.HitTestingTango.prototype.test = function(mouseX, mouseY){ + var vrDisplay = this._arContext._tangoContext.vrDisplay + if (vrDisplay === null ) return null + + if( vrDisplay.displayName !== "Tango VR Device" ) return null + + var pointAndPlane = vrDisplay.getPickingPointAndPlaneInPointCloud(mouseX, mouseY) + if( pointAndPlane == null ) { + console.warn('Could not retrieve the correct point and plane.') + return null + } + + // FIXME not sure what this is + var boundingSphereRadius = 0.01 + + // the bigger the number the likeliest it crash chromium-webar + + // Orient and position the model in the picking point according + // to the picking plane. The offset is half of the model size. + var object3d = new THREE.Object3D + THREE.WebAR.positionAndRotateObject3DWithPickingPointAndPlaneInPointCloud( + pointAndPlane, object3d, this.boundingSphereRadius + ) + object3d.rotateZ(-Math.PI/2) + + // return the result + var result = { + position : object3d.position, + quaternion : object3d.quaternion, + scale : this.resultScale, + } + + return result +} +// @namespace +var ARjs = ARjs || {} + +// TODO this is a controls... should i give the object3d here ? +// not according to 'no three.js dependancy' + +/** + * Create an anchor in the real world + * + * @param {ARjs.Session} arSession - the session on which we create the anchor + * @param {Object} markerParameters - parameter of this anchor + */ +ARjs.Anchor = function(arSession, markerParameters){ + var _this = this + var arContext = arSession.arContext + var scene = arSession.parameters.scene + var camera = arSession.parameters.camera + + this.arSession = arSession + this.parameters = markerParameters + + // log to debug + console.log('ARjs.Anchor -', 'changeMatrixMode:', this.parameters.changeMatrixMode, '/ markersAreaEnabled:', markerParameters.markersAreaEnabled) + + var markerRoot = new THREE.Group + scene.add(markerRoot) + + // set controlledObject depending on changeMatrixMode + if( markerParameters.changeMatrixMode === 'modelViewMatrix' ){ + var controlledObject = markerRoot + }else if( markerParameters.changeMatrixMode === 'cameraTransformMatrix' ){ + var controlledObject = camera + }else console.assert(false) + + if( markerParameters.markersAreaEnabled === false ){ + var markerControls = new THREEx.ArMarkerControls(arContext, controlledObject, markerParameters) + this.controls = markerControls + }else{ + // sanity check - MUST be a trackingBackend with markers + console.assert( arContext.parameters.trackingBackend === 'artoolkit' || arContext.parameters.trackingBackend === 'aruco' ) + + // honor markers-page-resolution for https://webxr.io/augmented-website + if( location.hash.substring(1).startsWith('markers-page-resolution=') === true ){ + // get resolutionW/resolutionH from url + var markerPageResolution = location.hash.substring(1) + var matches = markerPageResolution.match(/markers-page-resolution=(\d+)x(\d+)/) + console.assert(matches.length === 3) + var resolutionW = parseInt(matches[1]) + var resolutionH = parseInt(matches[2]) + var arContext = arSession.arContext + // generate and store the ARjsMultiMarkerFile + ARjs.MarkersAreaUtils.storeMarkersAreaFileFromResolution(arContext.parameters.trackingBackend, resolutionW, resolutionH) + } + + // if there is no ARjsMultiMarkerFile, build a default one + if( localStorage.getItem('ARjsMultiMarkerFile') === null ){ + ARjs.MarkersAreaUtils.storeDefaultMultiMarkerFile(arContext.parameters.trackingBackend) + } + + // get multiMarkerFile from localStorage + console.assert( localStorage.getItem('ARjsMultiMarkerFile') !== null ) + var multiMarkerFile = localStorage.getItem('ARjsMultiMarkerFile') + + // set controlledObject depending on changeMatrixMode + if( markerParameters.changeMatrixMode === 'modelViewMatrix' ){ + var parent3D = scene + }else if( markerParameters.changeMatrixMode === 'cameraTransformMatrix' ){ + var parent3D = camera + }else console.assert(false) + + // build a multiMarkerControls + var multiMarkerControls = ARjs.MarkersAreaControls.fromJSON(arContext, parent3D, controlledObject, multiMarkerFile) + this.controls = multiMarkerControls + + // honor markerParameters.changeMatrixMode + multiMarkerControls.parameters.changeMatrixMode = markerParameters.changeMatrixMode + +// TODO put subMarkerControls visibility into an external file. with 2 handling for three.js and babylon.js + // create ArMarkerHelper - useful to debug - super three.js specific + var markerHelpers = [] + multiMarkerControls.subMarkersControls.forEach(function(subMarkerControls){ + // add an helper to visuable each sub-marker + var markerHelper = new THREEx.ArMarkerHelper(subMarkerControls) + markerHelper.object3d.visible = false + // subMarkerControls.object3d.add( markerHelper.object3d ) + subMarkerControls.object3d.add( markerHelper.object3d ) + // add it to markerHelpers + markerHelpers.push(markerHelper) + }) + // define API specific to markersArea + this.markersArea = {} + this.markersArea.setSubMarkersVisibility = function(visible){ + markerHelpers.forEach(function(markerHelper){ + markerHelper.object3d.visible = visible + }) + } + } + + this.object3d = new THREE.Group() + + ////////////////////////////////////////////////////////////////////////////// + // THREEx.ArSmoothedControls + ////////////////////////////////////////////////////////////////////////////// + + var shouldBeSmoothed = true + if( arContext.parameters.trackingBackend === 'tango' ) shouldBeSmoothed = false + + if( shouldBeSmoothed === true ){ + // build a smoothedControls + var smoothedRoot = new THREE.Group() + scene.add(smoothedRoot) + var smoothedControls = new THREEx.ArSmoothedControls(smoothedRoot) + smoothedRoot.add(this.object3d) + }else{ + markerRoot.add(this.object3d) + } + + + ////////////////////////////////////////////////////////////////////////////// + // Code Separator + ////////////////////////////////////////////////////////////////////////////// + this.update = function(){ + // update _this.object3d.visible + _this.object3d.visible = _this.object3d.parent.visible + + // console.log('controlledObject.visible', _this.object3d.parent.visible) + if( smoothedControls !== undefined ){ + // update smoothedControls parameters depending on how many markers are visible in multiMarkerControls + if( multiMarkerControls !== undefined ){ + multiMarkerControls.updateSmoothedControls(smoothedControls) + } + + // update smoothedControls + smoothedControls.update(markerRoot) + } + } +} +// @namespace +var ARjs = ARjs || {} + +/** + * Create an debug UI for an ARjs.Anchor + * + * @param {ARjs.Anchor} arAnchor - the anchor to user + */ +ARjs.SessionDebugUI = function(arSession, tangoPointCloud){ + var trackingBackend = arSession.arContext.parameters.trackingBackend + + this.domElement = document.createElement('div') + this.domElement.style.color = 'rgba(0,0,0,0.9)' + this.domElement.style.backgroundColor = 'rgba(127,127,127,0.5)' + this.domElement.style.display = 'inline-block' + this.domElement.style.padding = '0.5em' + this.domElement.style.margin = '0.5em' + this.domElement.style.textAlign = 'left' + + ////////////////////////////////////////////////////////////////////////////// + // add title + ////////////////////////////////////////////////////////////////////////////// + // var domElement = document.createElement('div') + // domElement.style.display = 'block' + // domElement.style.fontWeight = 'bold' + // domElement.style.fontSize = '120%' + // this.domElement.appendChild(domElement) + // domElement.innerHTML = 'AR.js Session Debug' + + ////////////////////////////////////////////////////////////////////////////// + // current-tracking-backend + ////////////////////////////////////////////////////////////////////////////// + + var domElement = document.createElement('span') + domElement.style.display = 'block' + this.domElement.appendChild(domElement) + domElement.innerHTML = '<b>trackingBackend</b> : ' +trackingBackend + + ////////////////////////////////////////////////////////////////////////////// + // augmented-websites + ////////////////////////////////////////////////////////////////////////////// + + if( ARjs.SessionDebugUI.AugmentedWebsiteURL ){ + var domElement = document.createElement('a') + domElement.innerHTML = 'Share on augmented-websites' + domElement.style.display = 'block' + // domElement.setAttribute('target', '_blank') + domElement.href = ARjs.SessionDebugUI.AugmentedWebsiteURL + '?'+location.href + this.domElement.appendChild(domElement) + } + + ////////////////////////////////////////////////////////////////////////////// + // toggle-point-cloud + ////////////////////////////////////////////////////////////////////////////// + + if( trackingBackend === 'tango' && tangoPointCloud ){ + var domElement = document.createElement('button') + this.domElement.appendChild(domElement) + + domElement.id= 'buttonTangoTogglePointCloud' + domElement.innerHTML = 'toggle-point-cloud' + domElement.href='javascript:void(0)' + + domElement.addEventListener('click', function(){ + var scene = arSession.parameters.scene + // TODO how tangoPointCloud, get connected here ??? + // in arguments simply ? + if( tangoPointCloud.object3d.parent ){ + scene.remove(tangoPointCloud.object3d) + }else{ + scene.add(tangoPointCloud.object3d) + } + }) + } +} + +/** + * Url of augmented-website service - if === '' then dont include augmented-website link + * @type {String} + */ +ARjs.SessionDebugUI.AugmentedWebsiteURL = 'https://webxr.io/augmented-website' + +////////////////////////////////////////////////////////////////////////////// +// ARjs.AnchorDebugUI +////////////////////////////////////////////////////////////////////////////// + + + + +/** + * Create an debug UI for an ARjs.Anchor + * + * @param {ARjs.Anchor} arAnchor - the anchor to user + */ +ARjs.AnchorDebugUI = function(arAnchor){ + var _this = this + var arSession = arAnchor.arSession + var trackingBackend = arSession.arContext.parameters.trackingBackend + + this.domElement = document.createElement('div') + this.domElement.style.color = 'rgba(0,0,0,0.9)' + this.domElement.style.backgroundColor = 'rgba(127,127,127,0.5)' + this.domElement.style.display = 'inline-block' + this.domElement.style.padding = '0.5em' + this.domElement.style.margin = '0.5em' + this.domElement.style.textAlign = 'left' + + ////////////////////////////////////////////////////////////////////////////// + // add title + ////////////////////////////////////////////////////////////////////////////// + + // var domElement = document.createElement('div') + // domElement.style.display = 'block' + // domElement.style.fontWeight = 'bold' + // domElement.style.fontSize = '120%' + // this.domElement.appendChild(domElement) + // domElement.innerHTML = 'Anchor Marker Debug' + + ////////////////////////////////////////////////////////////////////////////// + // current-tracking-backend + ////////////////////////////////////////////////////////////////////////////// + + var domElement = document.createElement('span') + domElement.style.display = 'block' + this.domElement.appendChild(domElement) + domElement.innerHTML = '<b>markersAreaEnabled</b> :' +arAnchor.parameters.markersAreaEnabled + + ////////////////////////////////////////////////////////////////////////////// + // toggle-marker-helper + ////////////////////////////////////////////////////////////////////////////// + + if( arAnchor.parameters.markersAreaEnabled ){ + var domElement = document.createElement('button') + domElement.style.display = 'block' + this.domElement.appendChild(domElement) + + domElement.id= 'buttonToggleMarkerHelpers' + domElement.innerHTML = 'toggle-marker-helper' + domElement.href='javascript:void(0)' + + var subMarkerHelpersVisible = false + domElement.addEventListener('click', function(){ + subMarkerHelpersVisible = subMarkerHelpersVisible ? false : true + arAnchor.markersArea.setSubMarkersVisibility(subMarkerHelpersVisible) + }) + } + + ////////////////////////////////////////////////////////////////////////////// + // Learn-new-marker-area + ////////////////////////////////////////////////////////////////////////////// + + if( arAnchor.parameters.markersAreaEnabled ){ + var domElement = document.createElement('button') + domElement.style.display = 'block' + this.domElement.appendChild(domElement) + + domElement.id = 'buttonMarkersAreaLearner' + domElement.innerHTML = 'Learn-new-marker-area' + domElement.href ='javascript:void(0)' + + domElement.addEventListener('click', function(){ + if( ARjs.AnchorDebugUI.MarkersAreaLearnerURL !== null ){ + var learnerURL = ARjs.AnchorDebugUI.MarkersAreaLearnerURL + }else{ + var learnerURL = ARjs.Context.baseURL + 'examples/multi-markers/examples/learner.html' + } + ARjs.MarkersAreaUtils.navigateToLearnerPage(learnerURL, trackingBackend) + }) + } + + ////////////////////////////////////////////////////////////////////////////// + // Reset-marker-area + ////////////////////////////////////////////////////////////////////////////// + + if( arAnchor.parameters.markersAreaEnabled ){ + var domElement = document.createElement('button') + domElement.style.display = 'block' + this.domElement.appendChild(domElement) + + domElement.id = 'buttonMarkersAreaReset' + domElement.innerHTML = 'Reset-marker-area' + domElement.href ='javascript:void(0)' + + domElement.addEventListener('click', function(){ + ARjs.MarkersAreaUtils.storeDefaultMultiMarkerFile(trackingBackend) + location.reload() + }) + } +} + +/** + * url for the markers-area learner. if not set, take the default one + * @type {String} + */ +ARjs.AnchorDebugUI.MarkersAreaLearnerURL = null +// @namespace +var ARjs = ARjs || {} + +/** + * Create an anchor in the real world + * + * @param {ARjs.Session} arSession - the session on which we create the anchor + * @param {Object} markerParameters - parameter of this anchor + */ +ARjs.HitTesting = function(arSession){ + var _this = this + var arContext = arSession.arContext + var trackingBackend = arContext.parameters.trackingBackend + + this.enabled = true + this._arSession = arSession + this._hitTestingPlane = null + this._hitTestingTango = null + + if( trackingBackend === 'tango' ){ + _this._hitTestingTango = new THREEx.HitTestingTango(arContext) + }else{ + _this._hitTestingPlane = new THREEx.HitTestingPlane(arSession.arSource.domElement) + } +} + +////////////////////////////////////////////////////////////////////////////// +// update function +////////////////////////////////////////////////////////////////////////////// +/** + * update + * + * @param {THREE.Camera} camera - the camera to use + * @param {THREE.Object3D} object3d - + */ +ARjs.HitTesting.prototype.update = function (camera, pickingRoot, changeMatrixMode) { + // if it isnt enabled, do nothing + if( this.enabled === false ) return + + if( this._hitTestingTango !== null ){ + this._hitTestingTango.update() + }else if( this._hitTestingPlane !== null ){ + this._hitTestingPlane.update(camera, pickingRoot, changeMatrixMode) + }else console.assert(false) +} + +////////////////////////////////////////////////////////////////////////////// +// actual hit testing +////////////////////////////////////////////////////////////////////////////// + +/** + * Test the real world for intersections directly from a DomEvent + * + * @param {Number} mouseX - position X of the hit [-1, +1] + * @param {Number} mouseY - position Y of the hit [-1, +1] + * @return {[ARjs.HitTesting.Result]} - array of result + */ +ARjs.HitTesting.prototype.testDomEvent = function(domEvent){ + var trackingBackend = this._arSession.arContext.parameters.trackingBackend + var arSource = this._arSession.arSource + + // if it isnt enabled, do nothing + if( this.enabled === false ) return [] + + if( trackingBackend === 'tango' ){ + var mouseX = domEvent.pageX / window.innerWidth + var mouseY = domEvent.pageY / window.innerHeight + }else{ + var mouseX = domEvent.clientX / arSource.domElementWidth() + var mouseY = domEvent.clientY / arSource.domElementHeight() + } + + return this.test(mouseX, mouseY) +} + +/** + * Test the real world for intersections. + * + * @param {Number} mouseX - position X of the hit [0, +1] + * @param {Number} mouseY - position Y of the hit [0, +1] + * @return {[ARjs.HitTesting.Result]} - array of result + */ +ARjs.HitTesting.prototype.test = function(mouseX, mouseY){ + var arContext = this._arSession.arContext + var trackingBackend = arContext.parameters.trackingBackend + var hitTestResults = [] + + // if it isnt enabled, do nothing + if( this.enabled === false ) return [] + + var result = null + if( trackingBackend === 'tango' ){ + var result = this._hitTestingTango.test(mouseX, mouseY) + }else{ + var result = this._hitTestingPlane.test(mouseX, mouseY) + } + + // if no result is found, return now + if( result === null ) return hitTestResults + + // build a ARjs.HitTesting.Result + var hitTestResult = new ARjs.HitTesting.Result(result.position, result.quaternion, result.scale) + hitTestResults.push(hitTestResult) + + return hitTestResults +} + +////////////////////////////////////////////////////////////////////////////// +// ARjs.HitTesting.Result +////////////////////////////////////////////////////////////////////////////// +/** + * Contains the result of ARjs.HitTesting.test() + * + * @param {THREE.Vector3} position - position to use + * @param {THREE.Quaternion} quaternion - quaternion to use + * @param {THREE.Vector3} scale - scale + */ +ARjs.HitTesting.Result = function(position, quaternion, scale){ + this.position = position + this.quaternion = quaternion + this.scale = scale +} + +/** + * Apply to a controlled object3d + * + * @param {THREE.Object3D} object3d - the result to apply + */ +ARjs.HitTesting.Result.prototype.apply = function(object3d){ + object3d.position.copy(this.position) + object3d.quaternion.copy(this.quaternion) + object3d.scale.copy(this.scale) + + object3d.updateMatrix() +} + +/** + * Apply to a controlled object3d + * + * @param {THREE.Object3D} object3d - the result to apply + */ +ARjs.HitTesting.Result.prototype.applyPosition = function(object3d){ + object3d.position.copy(this.position) + + object3d.updateMatrix() + + return this +} + +/** + * Apply to a controlled object3d + * + * @param {THREE.Object3D} object3d - the result to apply + */ +ARjs.HitTesting.Result.prototype.applyQuaternion = function(object3d){ + object3d.quaternion.copy(this.quaternion) + + object3d.updateMatrix() + + return this +} +var ARjs = ARjs || {} + +/** + * define a ARjs.Session + * + * @param {Object} parameters - parameters for this session + */ +ARjs.Session = function(parameters){ + var _this = this + // handle default parameters + this.parameters = { + renderer: null, + camera: null, + scene: null, + sourceParameters: {}, + contextParameters: {}, + } + + this.signals = { + sourceReady : new signals.Signal(), + contextInitialized: new signals.Signal(), + } + + ////////////////////////////////////////////////////////////////////////////// + // setParameters + ////////////////////////////////////////////////////////////////////////////// + setParameters(parameters) + function setParameters(parameters){ + if( parameters === undefined ) return + for( var key in parameters ){ + var newValue = parameters[ key ] + + if( newValue === undefined ){ + console.warn( "THREEx.Session: '" + key + "' parameter is undefined." ) + continue + } + + var currentValue = _this.parameters[ key ] + + if( currentValue === undefined ){ + console.warn( "THREEx.Session: '" + key + "' is not a property of this material." ) + continue + } + + _this.parameters[ key ] = newValue + } + } + // sanity check + console.assert(this.parameters.renderer instanceof THREE.WebGLRenderer) + console.assert(this.parameters.camera instanceof THREE.Camera) + console.assert(this.parameters.scene instanceof THREE.Scene) + + + // backward emulation + Object.defineProperty(this, 'renderer', {get: function(){ + console.warn('use .parameters.renderer renderer') + return this.parameters.renderer; + }}); + Object.defineProperty(this, 'camera', {get: function(){ + console.warn('use .parameters.camera instead') + return this.parameters.camera; + }}); + Object.defineProperty(this, 'scene', {get: function(){ + console.warn('use .parameters.scene instead') + return this.parameters.scene; + }}); + + + // log the version + console.log('AR.js', ARjs.Context.REVISION, '- trackingBackend:', parameters.contextParameters.trackingBackend) + + ////////////////////////////////////////////////////////////////////////////// + // init arSource + ////////////////////////////////////////////////////////////////////////////// + var arSource = _this.arSource = new ARjs.Source(parameters.sourceParameters) + + arSource.init(function onReady(){ + arSource.onResize(arContext, _this.parameters.renderer, _this.parameters.camera) + + _this.signals.sourceReady.dispatch() + }) + + // handle resize + window.addEventListener('resize', function(){ + arSource.onResize(arContext, _this.parameters.renderer, _this.parameters.camera) + }) + + ////////////////////////////////////////////////////////////////////////////// + // init arContext + ////////////////////////////////////////////////////////////////////////////// + + // create atToolkitContext + var arContext = _this.arContext = new ARjs.Context(parameters.contextParameters) + + // initialize it + _this.arContext.init() + + arContext.addEventListener('initialized', function(event){ + arSource.onResize(arContext, _this.parameters.renderer, _this.parameters.camera) + + _this.signals.contextInitialized.dispatch() + }) + + ////////////////////////////////////////////////////////////////////////////// + // update function + ////////////////////////////////////////////////////////////////////////////// + // update artoolkit on every frame + this.update = function(){ + if( arSource.ready === false ) return + + arContext.update( arSource.domElement ) + } +} + +ARjs.Session.prototype.onResize = function () { + this.arSource.onResize(this.arContext, this.parameters.renderer, this.parameters.camera) +}; +// @namespace +var ARjs = ARjs || {} + +ARjs.TangoPointCloud = function(arSession){ + var _this = this + var arContext = arSession.arContext + this.object3d = new THREE.Group + +console.warn('Work only on cameraTransformMatrix - fix me - useless limitation') + + arContext.addEventListener('initialized', function(event){ + var vrPointCloud = arContext._tangoContext.vrPointCloud + var geometry = vrPointCloud.getBufferGeometry() + var material = new THREE.PointsMaterial({ + size: 0.01, + // colorWrite: false, // good for occlusion + depthWrite: false, + }) + var pointsObject = new THREE.Points(geometry, material) + // Points are changing all the time so calculating the frustum culling volume is not very convenient. + pointsObject.frustumCulled = false; + pointsObject.renderDepth = 0; + + _this.object3d.add(pointsObject) + }) +} +// @namespace +var ARjs = ARjs || {} + +ARjs.TangoVideoMesh = function(arSession){ + var arContext = arSession.arContext + var renderer = arSession.renderer + + var videoMesh = null + var vrDisplay = null + + // Create the see through camera scene and camera + var sceneOrtho = new THREE.Scene() + var cameraOrtho = new THREE.OrthographicCamera( -1, 1, 1, -1, 0, 100 ) +this._sceneOrtho = sceneOrtho +this._cameraOrtho = cameraOrtho + + // tango only - init cameraMesh + arContext.addEventListener('initialized', function(event){ + // sanity check + console.assert( arContext.parameters.trackingBackend === 'tango' ) + // variable declaration + vrDisplay = arContext._tangoContext.vrDisplay + console.assert(vrDisplay, 'vrDisplay MUST be defined') + // if vrDisplay isnt for tango, do nothing. It may be another vrDisplay (e.g. webvr emulator in chrome) + if( vrDisplay.displayName !== "Tango VR Device" ) return + // init videoPlane + videoMesh = THREE.WebAR.createVRSeeThroughCameraMesh(vrDisplay) + sceneOrtho.add(videoMesh) + }) + + ////////////////////////////////////////////////////////////////////////////// + // Code Separator + ////////////////////////////////////////////////////////////////////////////// + + this.update = function(){ + // sanity check + console.assert( arContext.parameters.trackingBackend === 'tango' ) + // if not yet initialized, return now + if( videoMesh === null ) return + // Make sure that the camera is correctly displayed depending on the device and camera orientations. + THREE.WebAR.updateCameraMeshOrientation(vrDisplay, videoMesh) + } + + ////////////////////////////////////////////////////////////////////////////// + // Code Separator + ////////////////////////////////////////////////////////////////////////////// + + this.render = function(){ + // sanity check + console.assert( arContext.parameters.trackingBackend === 'tango' ) + // render sceneOrtho + renderer.render( sceneOrtho, cameraOrtho ) + // Render the perspective scene + renderer.clearDepth() + } +} +var ARjs = ARjs || {} +ARjs.Utils = {} + +/** + * Create a default rendering camera for this trackingBackend. They may be modified later. to fit physical camera parameters + * + * @param {string} trackingBackend - the tracking to user + * @return {THREE.Camera} the created camera + */ +ARjs.Utils.createDefaultCamera = function(trackingMethod){ + var trackingBackend = this.parseTrackingMethod(trackingMethod).trackingBackend + // Create a camera + if( trackingBackend === 'artoolkit' ){ + var camera = new THREE.Camera(); + }else if( trackingBackend === 'aruco' ){ + var camera = new THREE.PerspectiveCamera(42, window.innerWidth / window.innerHeight, 0.01, 100); + }else if( trackingBackend === 'tango' ){ + var camera = new THREE.PerspectiveCamera(42, window.innerWidth / window.innerHeight, 0.01, 100); + }else console.assert(false, 'unknown trackingBackend: '+trackingBackend) + + return camera +} + +/** + * test if the code is running on tango + * + * @return {boolean} - true if running on tango, false otherwise + */ +ARjs.Utils.isTango = function(){ + // FIXME: this test is super bad + var isTango = navigator.userAgent.match('Chrome/57.0.2987.5') !== null ? true : false + return isTango +} + + +/** + * parse tracking method + * + * @param {String} trackingMethod - the tracking method to parse + * @return {Object} - various field of the tracking method + */ +ARjs.Utils.parseTrackingMethod = function(trackingMethod){ + + if( trackingMethod === 'best' ){ + trackingMethod = ARjs.Utils.isTango() ? 'tango' : 'area-artoolkit' + } + + if( trackingMethod.startsWith('area-') ){ + return { + trackingBackend : trackingMethod.replace('area-', ''), + markersAreaEnabled : true, + } + }else{ + return { + trackingBackend : trackingMethod, + markersAreaEnabled : false, + } + } +} +var ARjs = ARjs || {} +var THREEx = THREEx || {} + +ARjs.MarkersAreaControls = THREEx.ArMultiMarkerControls = function(arToolkitContext, object3d, parameters){ + var _this = this + THREEx.ArBaseControls.call(this, object3d) + + if( arguments.length > 3 ) console.assert('wrong api for', THREEx.ArMultiMarkerControls) + + // have a parameters in argument + this.parameters = { + // list of controls for each subMarker + subMarkersControls: parameters.subMarkersControls, + // list of pose for each subMarker relative to the origin + subMarkerPoses: parameters.subMarkerPoses, + // change matrix mode - [modelViewMatrix, cameraTransformMatrix] + changeMatrixMode : parameters.changeMatrixMode !== undefined ? parameters.changeMatrixMode : 'modelViewMatrix', + } + + this.object3d.visible = false + // honor obsolete stuff - add a warning to use + this.subMarkersControls = this.parameters.subMarkersControls + this.subMarkerPoses = this.parameters.subMarkerPoses + + // listen to arToolkitContext event 'sourceProcessed' + // - after we fully processed one image, aka when we know all detected poses in it + arToolkitContext.addEventListener('sourceProcessed', function(){ + _this._onSourceProcessed() + }) +} + +ARjs.MarkersAreaControls.prototype = Object.create( THREEx.ArBaseControls.prototype ); +ARjs.MarkersAreaControls.prototype.constructor = ARjs.MarkersAreaControls; + +////////////////////////////////////////////////////////////////////////////// +// Code Separator +////////////////////////////////////////////////////////////////////////////// + + +/** + * What to do when a image source is fully processed + */ +ARjs.MarkersAreaControls.prototype._onSourceProcessed = function(){ + var _this = this + var stats = { + count: 0, + position : { + sum: new THREE.Vector3(0,0,0), + average: new THREE.Vector3(0,0,0), + }, + quaternion : { + sum: new THREE.Quaternion(0,0,0,0), + average: new THREE.Quaternion(0,0,0,0), + }, + scale : { + sum: new THREE.Vector3(0,0,0), + average: new THREE.Vector3(0,0,0), + }, + } + + var firstQuaternion = _this.parameters.subMarkersControls[0].object3d.quaternion + + this.parameters.subMarkersControls.forEach(function(markerControls, markerIndex){ + + var markerObject3d = markerControls.object3d + // if this marker is not visible, ignore it + if( markerObject3d.visible === false ) return + + // transformation matrix of this.object3d according to this sub-markers + var matrix = markerObject3d.matrix.clone() + var markerPose = _this.parameters.subMarkerPoses[markerIndex] + matrix.multiply(new THREE.Matrix4().getInverse(markerPose)) + + // decompose the matrix into .position, .quaternion, .scale + var position = new THREE.Vector3 + var quaternion = new THREE.Quaternion() + var scale = new THREE.Vector3 + matrix.decompose(position, quaternion, scale) + + // http://wiki.unity3d.com/index.php/Averaging_Quaternions_and_Vectors + stats.count++ + + ARjs.MarkersAreaControls.averageVector3(stats.position.sum, position, stats.count, stats.position.average) + ARjs.MarkersAreaControls.averageQuaternion(stats.quaternion.sum, quaternion, firstQuaternion, stats.count, stats.quaternion.average) + ARjs.MarkersAreaControls.averageVector3(stats.scale.sum, scale, stats.count, stats.scale.average) + }) + + // honor _this.object3d.visible + if( stats.count > 0 ){ + _this.object3d.visible = true + }else{ + _this.object3d.visible = false + } + + // if at least one sub-marker has been detected, make the average of all detected markers + if( stats.count > 0 ){ + // compute modelViewMatrix + var modelViewMatrix = new THREE.Matrix4() + modelViewMatrix.compose(stats.position.average, stats.quaternion.average, stats.scale.average) + + // change _this.object3d.matrix based on parameters.changeMatrixMode + if( this.parameters.changeMatrixMode === 'modelViewMatrix' ){ + _this.object3d.matrix.copy(modelViewMatrix) + }else if( this.parameters.changeMatrixMode === 'cameraTransformMatrix' ){ + _this.object3d.matrix.getInverse( modelViewMatrix ) + }else { + console.assert(false) + } + + // decompose - the matrix into .position, .quaternion, .scale + _this.object3d.matrix.decompose(_this.object3d.position, _this.object3d.quaternion, _this.object3d.scale) + } + +} + +////////////////////////////////////////////////////////////////////////////// +// Utility functions +////////////////////////////////////////////////////////////////////////////// + +/** + * from http://wiki.unity3d.com/index.php/Averaging_Quaternions_and_Vectors + */ +ARjs.MarkersAreaControls.averageQuaternion = function(quaternionSum, newQuaternion, firstQuaternion, count, quaternionAverage){ + quaternionAverage = quaternionAverage || new THREE.Quaternion() + // sanity check + console.assert(firstQuaternion instanceof THREE.Quaternion === true) + + // from http://wiki.unity3d.com/index.php/Averaging_Quaternions_and_Vectors + if( newQuaternion.dot(firstQuaternion) > 0 ){ + newQuaternion = new THREE.Quaternion(-newQuaternion.x, -newQuaternion.y, -newQuaternion.z, -newQuaternion.w) + } + + quaternionSum.x += newQuaternion.x + quaternionSum.y += newQuaternion.y + quaternionSum.z += newQuaternion.z + quaternionSum.w += newQuaternion.w + + quaternionAverage.x = quaternionSum.x/count + quaternionAverage.y = quaternionSum.y/count + quaternionAverage.z = quaternionSum.z/count + quaternionAverage.w = quaternionSum.w/count + + quaternionAverage.normalize() + + return quaternionAverage +} + + +ARjs.MarkersAreaControls.averageVector3 = function(vector3Sum, vector3, count, vector3Average){ + vector3Average = vector3Average || new THREE.Vector3() + + vector3Sum.x += vector3.x + vector3Sum.y += vector3.y + vector3Sum.z += vector3.z + + vector3Average.x = vector3Sum.x / count + vector3Average.y = vector3Sum.y / count + vector3Average.z = vector3Sum.z / count + + return vector3Average +} + +////////////////////////////////////////////////////////////////////////////// +// Utility function +////////////////////////////////////////////////////////////////////////////// + +/** + * compute the center of this multimarker file + */ +ARjs.MarkersAreaControls.computeCenter = function(jsonData){ + var multiMarkerFile = JSON.parse(jsonData) + var stats = { + count : 0, + position : { + sum: new THREE.Vector3(0,0,0), + average: new THREE.Vector3(0,0,0), + }, + quaternion : { + sum: new THREE.Quaternion(0,0,0,0), + average: new THREE.Quaternion(0,0,0,0), + }, + scale : { + sum: new THREE.Vector3(0,0,0), + average: new THREE.Vector3(0,0,0), + }, + } + var firstQuaternion = new THREE.Quaternion() // FIXME ??? + + multiMarkerFile.subMarkersControls.forEach(function(item){ + var poseMatrix = new THREE.Matrix4().fromArray(item.poseMatrix) + + var position = new THREE.Vector3 + var quaternion = new THREE.Quaternion + var scale = new THREE.Vector3 + poseMatrix.decompose(position, quaternion, scale) + + // http://wiki.unity3d.com/index.php/Averaging_Quaternions_and_Vectors + stats.count++ + + ARjs.MarkersAreaControls.averageVector3(stats.position.sum, position, stats.count, stats.position.average) + ARjs.MarkersAreaControls.averageQuaternion(stats.quaternion.sum, quaternion, firstQuaternion, stats.count, stats.quaternion.average) + ARjs.MarkersAreaControls.averageVector3(stats.scale.sum, scale, stats.count, stats.scale.average) + }) + + var averageMatrix = new THREE.Matrix4() + averageMatrix.compose(stats.position.average, stats.quaternion.average, stats.scale.average) + + return averageMatrix +} + +ARjs.MarkersAreaControls.computeBoundingBox = function(jsonData){ + var multiMarkerFile = JSON.parse(jsonData) + var boundingBox = new THREE.Box3() + + multiMarkerFile.subMarkersControls.forEach(function(item){ + var poseMatrix = new THREE.Matrix4().fromArray(item.poseMatrix) + + var position = new THREE.Vector3 + var quaternion = new THREE.Quaternion + var scale = new THREE.Vector3 + poseMatrix.decompose(position, quaternion, scale) + + boundingBox.expandByPoint(position) + }) + + return boundingBox +} +////////////////////////////////////////////////////////////////////////////// +// updateSmoothedControls +////////////////////////////////////////////////////////////////////////////// + +ARjs.MarkersAreaControls.prototype.updateSmoothedControls = function(smoothedControls, lerpsValues){ + // handle default values + if( lerpsValues === undefined ){ + // FIXME this parameter format is uselessly cryptic + // lerpValues = [ + // {lerpPosition: 0.5, lerpQuaternion: 0.2, lerpQuaternion: 0.7} + // ] + lerpsValues = [ + [0.3+.1, 0.1, 0.3], + [0.4+.1, 0.1, 0.4], + [0.4+.1, 0.2, 0.5], + [0.5+.1, 0.2, 0.7], + [0.5+.1, 0.2, 0.7], + ] + } + // count how many subMarkersControls are visible + var nVisible = 0 + this.parameters.subMarkersControls.forEach(function(markerControls, markerIndex){ + var markerObject3d = markerControls.object3d + if( markerObject3d.visible === true ) nVisible ++ + }) + + // find the good lerpValues + if( lerpsValues[nVisible-1] !== undefined ){ + var lerpValues = lerpsValues[nVisible-1] + }else{ + var lerpValues = lerpsValues[lerpsValues.length-1] + } + + // modify lerpValues in smoothedControls + smoothedControls.parameters.lerpPosition = lerpValues[0] + smoothedControls.parameters.lerpQuaternion = lerpValues[1] + smoothedControls.parameters.lerpScale = lerpValues[2] +} + + +////////////////////////////////////////////////////////////////////////////// +// Create THREEx.ArMultiMarkerControls from JSON +////////////////////////////////////////////////////////////////////////////// + +ARjs.MarkersAreaControls.fromJSON = function(arToolkitContext, parent3D, markerRoot, jsonData, parameters){ + var multiMarkerFile = JSON.parse(jsonData) + // declare variables + var subMarkersControls = [] + var subMarkerPoses = [] + // handle default arguments + parameters = parameters || {} + + // prepare the parameters + multiMarkerFile.subMarkersControls.forEach(function(item){ + // create a markerRoot + var markerRoot = new THREE.Object3D() + parent3D.add(markerRoot) + + // create markerControls for our markerRoot + var subMarkerControls = new THREEx.ArMarkerControls(arToolkitContext, markerRoot, item.parameters) + +// if( true ){ + // store it in the parameters + subMarkersControls.push(subMarkerControls) + subMarkerPoses.push(new THREE.Matrix4().fromArray(item.poseMatrix)) +// }else{ +// // build a smoothedControls +// var smoothedRoot = new THREE.Group() +// parent3D.add(smoothedRoot) +// var smoothedControls = new THREEx.ArSmoothedControls(smoothedRoot, { +// lerpPosition : 0.1, +// lerpQuaternion : 0.1, +// lerpScale : 0.1, +// minVisibleDelay: 0, +// minUnvisibleDelay: 0, +// }) +// onRenderFcts.push(function(delta){ +// smoothedControls.update(markerRoot) // TODO this is a global +// }) +// +// +// // store it in the parameters +// subMarkersControls.push(smoothedControls) +// subMarkerPoses.push(new THREE.Matrix4().fromArray(item.poseMatrix)) +// } + }) + + parameters.subMarkersControls = subMarkersControls + parameters.subMarkerPoses = subMarkerPoses + // create a new THREEx.ArMultiMarkerControls + var multiMarkerControls = new THREEx.ArMultiMarkerControls(arToolkitContext, markerRoot, parameters) + + // return it + return multiMarkerControls +} +var ARjs = ARjs || {} +var THREEx = THREEx || {} + +ARjs.MarkersAreaLearning = THREEx.ArMultiMakersLearning = function(arToolkitContext, subMarkersControls){ + var _this = this + this._arToolkitContext = arToolkitContext + + // Init variables + this.subMarkersControls = subMarkersControls + this.enabled = true + + // listen to arToolkitContext event 'sourceProcessed' + // - after we fully processed one image, aka when we know all detected poses in it + arToolkitContext.addEventListener('sourceProcessed', function(){ + _this._onSourceProcessed() + }) +} + + +////////////////////////////////////////////////////////////////////////////// +// statistic collection +////////////////////////////////////////////////////////////////////////////// + +/** + * What to do when a image source is fully processed + */ +ARjs.MarkersAreaLearning.prototype._onSourceProcessed = function(){ + var originQuaternion = this.subMarkersControls[0].object3d.quaternion + // here collect the statistic on relative positioning + + // honor this.enabled + if( this.enabled === false ) return + + // keep only the visible markers + var visibleMarkerControls = this.subMarkersControls.filter(function(markerControls){ + return markerControls.object3d.visible === true + }) + + var count = Object.keys(visibleMarkerControls).length + + var positionDelta = new THREE.Vector3() + var quaternionDelta = new THREE.Quaternion() + var scaleDelta = new THREE.Vector3() + var tmpMatrix = new THREE.Matrix4() + + // go thru all the visibleMarkerControls + for(var i = 0; i < count; i++){ + var markerControls1 = visibleMarkerControls[i] + for(var j = 0; j < count; j++){ + var markerControls2 = visibleMarkerControls[j] + + // if markerControls1 is markerControls2, then skip it + if( i === j ) continue + + + ////////////////////////////////////////////////////////////////////////////// + // create data in markerControls1.object3d.userData if needed + ////////////////////////////////////////////////////////////////////////////// + // create seenCouples for markerControls1 if needed + if( markerControls1.object3d.userData.seenCouples === undefined ){ + markerControls1.object3d.userData.seenCouples = {} + } + var seenCouples = markerControls1.object3d.userData.seenCouples + // create the multiMarkerPosition average if needed` + if( seenCouples[markerControls2.id] === undefined ){ + // console.log('create seenCouples between', markerControls1.id, 'and', markerControls2.id) + seenCouples[markerControls2.id] = { + count : 0, + position : { + sum: new THREE.Vector3(0,0,0), + average: new THREE.Vector3(0,0,0), + }, + quaternion : { + sum: new THREE.Quaternion(0,0,0,0), + average: new THREE.Quaternion(0,0,0,0), + }, + scale : { + sum: new THREE.Vector3(0,0,0), + average: new THREE.Vector3(0,0,0), + }, + } + } + + + ////////////////////////////////////////////////////////////////////////////// + // Compute markerControls2 position relative to markerControls1 + ////////////////////////////////////////////////////////////////////////////// + + // compute markerControls2 position/quaternion/scale in relation with markerControls1 + tmpMatrix.getInverse(markerControls1.object3d.matrix) + tmpMatrix.multiply(markerControls2.object3d.matrix) + tmpMatrix.decompose(positionDelta, quaternionDelta, scaleDelta) + + ////////////////////////////////////////////////////////////////////////////// + // update statistics + ////////////////////////////////////////////////////////////////////////////// + var stats = seenCouples[markerControls2.id] + // update the count + stats.count++ + + // update the average of position/rotation/scale + THREEx.ArMultiMarkerControls.averageVector3(stats.position.sum, positionDelta, stats.count, stats.position.average) + THREEx.ArMultiMarkerControls.averageQuaternion(stats.quaternion.sum, quaternionDelta, originQuaternion, stats.count, stats.quaternion.average) + THREEx.ArMultiMarkerControls.averageVector3(stats.scale.sum, scaleDelta, stats.count, stats.scale.average) + } + } +} + +////////////////////////////////////////////////////////////////////////////// +// Compute markers transformation matrix from current stats +////////////////////////////////////////////////////////////////////////////// + +ARjs.MarkersAreaLearning.prototype.computeResult = function(){ + var _this = this + var originSubControls = this.subMarkersControls[0] + + this.deleteResult() + + // special case of originSubControls averageMatrix + originSubControls.object3d.userData.result = { + averageMatrix : new THREE.Matrix4(), + confidenceFactor: 1, + } + // TODO here check if the originSubControls has been seen at least once!! + + + /** + * ALGO in pseudo code + * + * - Set confidenceFactor of origin sub markers as 1 + * + * Start Looping + * - For a given sub marker, skip it if it already has a result. + * - if no result, check all seen couple and find n ones which has a progress of 1 or more. + * - So the other seen sub markers, got a valid transformation matrix. + * - So take local averages position/orientation/scale, compose a transformation matrix. + * - aka transformation matrix from parent matrix * transf matrix pos/orientation/scale + * - Multiple it by the other seen marker matrix. + * - Loop on the array until one pass could not compute any new sub marker + */ + + do{ + var resultChanged = false + // loop over each subMarkerControls + this.subMarkersControls.forEach(function(subMarkerControls){ + + // if subMarkerControls already has a result, do nothing + var result = subMarkerControls.object3d.userData.result + var isLearned = (result !== undefined && result.confidenceFactor >= 1) ? true : false + if( isLearned === true ) return + + // console.log('compute subMarkerControls', subMarkerControls.name()) + var otherSubControlsID = _this._getLearnedCoupleStats(subMarkerControls) + if( otherSubControlsID === null ){ + // console.log('no learnedCoupleStats') + return + } + + var otherSubControls = _this._getSubMarkerControlsByID(otherSubControlsID) + + var seenCoupleStats = subMarkerControls.object3d.userData.seenCouples[otherSubControlsID] + + var averageMatrix = new THREE.Matrix4() + averageMatrix.compose(seenCoupleStats.position.average, seenCoupleStats.quaternion.average, seenCoupleStats.scale.average) + + var otherAverageMatrix = otherSubControls.object3d.userData.result.averageMatrix + + var matrix = new THREE.Matrix4().getInverse(otherAverageMatrix).multiply(averageMatrix) + matrix = new THREE.Matrix4().getInverse(matrix) + + console.assert( subMarkerControls.object3d.userData.result === undefined ) + subMarkerControls.object3d.userData.result = { + averageMatrix: matrix, + confidenceFactor: 1 + } + + resultChanged = true + }) + // console.log('loop') + }while(resultChanged === true) + + // debugger + // console.log('json:', this.toJSON()) + // this.subMarkersControls.forEach(function(subMarkerControls){ + // var hasResult = subMarkerControls.object3d.userData.result !== undefined + // console.log('marker', subMarkerControls.name(), hasResult ? 'has' : 'has NO', 'result') + // }) +} + +////////////////////////////////////////////////////////////////////////////// +// Utility function +////////////////////////////////////////////////////////////////////////////// + +/** + * get a _this.subMarkersControls id based on markerControls.id + */ +ARjs.MarkersAreaLearning.prototype._getLearnedCoupleStats = function(subMarkerControls){ + + // if this subMarkerControls has never been seen with another subMarkerControls + if( subMarkerControls.object3d.userData.seenCouples === undefined ) return null + + var seenCouples = subMarkerControls.object3d.userData.seenCouples + var coupleControlsIDs = Object.keys(seenCouples).map(Number) + + for(var i = 0; i < coupleControlsIDs.length; i++){ + var otherSubControlsID = coupleControlsIDs[i] + // get otherSubControls + var otherSubControls = this._getSubMarkerControlsByID(otherSubControlsID) + + // if otherSubControls isnt learned, skip it + var result = otherSubControls.object3d.userData.result + var isLearned = (result !== undefined && result.confidenceFactor >= 1) ? true : false + if( isLearned === false ) continue + + // return this seenCouplesStats + return otherSubControlsID + } + + // if none is found, return null + return null +} + +/** + * get a _this.subMarkersControls based on markerControls.id + */ +ARjs.MarkersAreaLearning.prototype._getSubMarkerControlsByID = function(controlsID){ + + for(var i = 0; i < this.subMarkersControls.length; i++){ + var subMarkerControls = this.subMarkersControls[i] + if( subMarkerControls.id === controlsID ){ + return subMarkerControls + } + } + + return null +} + ////////////////////////////////////////////////////////////////////////////// +// JSON file building +////////////////////////////////////////////////////////////////////////////// + +ARjs.MarkersAreaLearning.prototype.toJSON = function(){ + + // compute the average matrix before generating the file + this.computeResult() + + ////////////////////////////////////////////////////////////////////////////// + // actually build the json + ////////////////////////////////////////////////////////////////////////////// + var data = { + meta : { + createdBy : "Area Learning - AR.js "+THREEx.ArToolkitContext.REVISION, + createdAt : new Date().toJSON(), + + }, + trackingBackend: this._arToolkitContext.parameters.trackingBackend, + subMarkersControls : [], + } + + var originSubControls = this.subMarkersControls[0] + var originMatrixInverse = new THREE.Matrix4().getInverse(originSubControls.object3d.matrix) + this.subMarkersControls.forEach(function(subMarkerControls, index){ + + // if a subMarkerControls has no result, ignore it + if( subMarkerControls.object3d.userData.result === undefined ) return + + var poseMatrix = subMarkerControls.object3d.userData.result.averageMatrix + console.assert(poseMatrix instanceof THREE.Matrix4) + + + // build the info + var info = { + parameters : { + // to fill ... + }, + poseMatrix : poseMatrix.toArray(), + } + if( subMarkerControls.parameters.type === 'pattern' ){ + info.parameters.type = subMarkerControls.parameters.type + info.parameters.patternUrl = subMarkerControls.parameters.patternUrl + }else if( subMarkerControls.parameters.type === 'barcode' ){ + info.parameters.type = subMarkerControls.parameters.type + info.parameters.barcodeValue = subMarkerControls.parameters.barcodeValue + }else console.assert(false) + + data.subMarkersControls.push(info) + }) + + var strJSON = JSON.stringify(data, null, '\t'); + + + ////////////////////////////////////////////////////////////////////////////// + // round matrix elements to ease readability - for debug + ////////////////////////////////////////////////////////////////////////////// + var humanReadable = false + if( humanReadable === true ){ + var tmp = JSON.parse(strJSON) + tmp.subMarkersControls.forEach(function(markerControls){ + markerControls.poseMatrix = markerControls.poseMatrix.map(function(value){ + var roundingFactor = 100 + return Math.round(value*roundingFactor)/roundingFactor + }) + }) + strJSON = JSON.stringify(tmp, null, '\t'); + } + + return strJSON; +} + +////////////////////////////////////////////////////////////////////////////// +// utility function +////////////////////////////////////////////////////////////////////////////// + +/** + * reset all collected statistics + */ +ARjs.MarkersAreaLearning.prototype.resetStats = function(){ + this.deleteResult() + + this.subMarkersControls.forEach(function(markerControls){ + delete markerControls.object3d.userData.seenCouples + }) +} +/** + * reset all collected statistics + */ +ARjs.MarkersAreaLearning.prototype.deleteResult = function(){ + this.subMarkersControls.forEach(function(markerControls){ + delete markerControls.object3d.userData.result + }) +} +var THREEx = THREEx || {} + +var ARjs = ARjs || {} +var THREEx = THREEx || {} + +ARjs.MarkersAreaUtils = THREEx.ArMultiMarkerUtils = {} + +////////////////////////////////////////////////////////////////////////////// +// navigateToLearnerPage +////////////////////////////////////////////////////////////////////////////// + +/** + * Navigate to the multi-marker learner page + * + * @param {String} learnerBaseURL - the base url for the learner + * @param {String} trackingBackend - the tracking backend to use + */ +ARjs.MarkersAreaUtils.navigateToLearnerPage = function(learnerBaseURL, trackingBackend){ + var learnerParameters = { + backURL : location.href, + trackingBackend: trackingBackend, + markersControlsParameters: ARjs.MarkersAreaUtils.createDefaultMarkersControlsParameters(trackingBackend), + } + location.href = learnerBaseURL + '?' + encodeURIComponent(JSON.stringify(learnerParameters)) +} + +////////////////////////////////////////////////////////////////////////////// +// DefaultMultiMarkerFile +////////////////////////////////////////////////////////////////////////////// + +/** + * Create and store a default multi-marker file + * + * @param {String} trackingBackend - the tracking backend to use + */ +ARjs.MarkersAreaUtils.storeDefaultMultiMarkerFile = function(trackingBackend){ + var file = ARjs.MarkersAreaUtils.createDefaultMultiMarkerFile(trackingBackend) + // json.strinfy the value and store it in localStorage + localStorage.setItem('ARjsMultiMarkerFile', JSON.stringify(file)) +} + + + +/** + * Create a default multi-marker file + * @param {String} trackingBackend - the tracking backend to use + * @return {Object} - json object of the multi-marker file + */ +ARjs.MarkersAreaUtils.createDefaultMultiMarkerFile = function(trackingBackend){ + console.assert(trackingBackend) + if( trackingBackend === undefined ) debugger + + // create absoluteBaseURL + var link = document.createElement('a') + link.href = ARjs.Context.baseURL + var absoluteBaseURL = link.href + + // create the base file + var file = { + meta : { + createdBy : 'AR.js ' + ARjs.Context.REVISION + ' - Default Marker', + createdAt : new Date().toJSON(), + }, + trackingBackend : trackingBackend, + subMarkersControls : [ + // empty for now... being filled + ] + } + // add a subMarkersControls + file.subMarkersControls[0] = { + parameters: {}, + poseMatrix: new THREE.Matrix4().makeTranslation(0,0, 0).toArray(), + } + if( trackingBackend === 'artoolkit' ){ + file.subMarkersControls[0].parameters.type = 'pattern' + file.subMarkersControls[0].parameters.patternUrl = absoluteBaseURL + 'examples/marker-training/examples/pattern-files/pattern-hiro.patt' + }else if( trackingBackend === 'aruco' ){ + file.subMarkersControls[0].parameters.type = 'barcode' + file.subMarkersControls[0].parameters.barcodeValue = 1001 + }else console.assert(false) + + // json.strinfy the value and store it in localStorage + return file +} + +////////////////////////////////////////////////////////////////////////////// +// createDefaultMarkersControlsParameters +////////////////////////////////////////////////////////////////////////////// + +/** + * Create a default controls parameters for the multi-marker learner + * + * @param {String} trackingBackend - the tracking backend to use + * @return {Object} - json object containing the controls parameters + */ +ARjs.MarkersAreaUtils.createDefaultMarkersControlsParameters = function(trackingBackend){ + // create absoluteBaseURL + var link = document.createElement('a') + link.href = ARjs.Context.baseURL + var absoluteBaseURL = link.href + + + if( trackingBackend === 'artoolkit' ){ + // pattern hiro/kanji/a/b/c/f + var markersControlsParameters = [ + { + type : 'pattern', + patternUrl : absoluteBaseURL + 'examples/marker-training/examples/pattern-files/pattern-hiro.patt', + }, + { + type : 'pattern', + patternUrl : absoluteBaseURL + 'examples/marker-training/examples/pattern-files/pattern-kanji.patt', + }, + { + type : 'pattern', + patternUrl : absoluteBaseURL + 'examples/marker-training/examples/pattern-files/pattern-letterA.patt', + }, + { + type : 'pattern', + patternUrl : absoluteBaseURL + 'examples/marker-training/examples/pattern-files/pattern-letterB.patt', + }, + { + type : 'pattern', + patternUrl : absoluteBaseURL + 'examples/marker-training/examples/pattern-files/pattern-letterC.patt', + }, + { + type : 'pattern', + patternUrl : absoluteBaseURL + 'examples/marker-training/examples/pattern-files/pattern-letterF.patt', + }, + ] + }else if( trackingBackend === 'aruco' ){ + var markersControlsParameters = [ + { + type : 'barcode', + barcodeValue: 1001, + }, + { + type : 'barcode', + barcodeValue: 1002, + }, + { + type : 'barcode', + barcodeValue: 1003, + }, + { + type : 'barcode', + barcodeValue: 1004, + }, + { + type : 'barcode', + barcodeValue: 1005, + }, + { + type : 'barcode', + barcodeValue: 1006, + }, + ] + }else console.assert(false) + return markersControlsParameters +} + + +////////////////////////////////////////////////////////////////////////////// +// Code Separator +////////////////////////////////////////////////////////////////////////////// +/** + * generate areaFile + */ +ARjs.MarkersAreaUtils.storeMarkersAreaFileFromResolution = function (trackingBackend, resolutionW, resolutionH) { + // generate areaFile + var areaFile = this.buildMarkersAreaFileFromResolution(trackingBackend, resolutionW, resolutionH) + // store areaFile in localStorage + localStorage.setItem('ARjsMultiMarkerFile', JSON.stringify(areaFile)) +} + + +////////////////////////////////////////////////////////////////////////////// +// Code Separator +////////////////////////////////////////////////////////////////////////////// + +ARjs.MarkersAreaUtils.buildMarkersAreaFileFromResolution = function(trackingBackend, resolutionW, resolutionH){ + // create the base file + var file = { + meta : { + createdBy : 'AR.js - Augmented Website', + createdAt : new Date().toJSON(), + }, + trackingBackend : trackingBackend, + subMarkersControls : [ + // empty for now... + ] + } + + var whiteMargin = 0.1 + if( resolutionW > resolutionH ){ + var markerImageSize = 0.4 * resolutionH + }else if( resolutionW < resolutionH ){ + var markerImageSize = 0.4 * resolutionW + }else if( resolutionW === resolutionH ){ + // specific for twitter player - https://dev.twitter.com/cards/types/player + var markerImageSize = 0.33 * resolutionW + }else console.assert(false) + + // console.warn('using new markerImageSize computation') + var actualMarkerSize = markerImageSize * (1 - 2*whiteMargin) + + var deltaX = (resolutionW - markerImageSize)/2 / actualMarkerSize + var deltaZ = (resolutionH - markerImageSize)/2 / actualMarkerSize + + var subMarkerControls = buildSubMarkerControls('center', 0, 0) + file.subMarkersControls.push(subMarkerControls) + + var subMarkerControls = buildSubMarkerControls('topleft', -deltaX, -deltaZ) + file.subMarkersControls.push(subMarkerControls) + + var subMarkerControls = buildSubMarkerControls('topright', +deltaX, -deltaZ) + file.subMarkersControls.push(subMarkerControls) + + var subMarkerControls = buildSubMarkerControls('bottomleft', -deltaX, +deltaZ) + file.subMarkersControls.push(subMarkerControls) + + var subMarkerControls = buildSubMarkerControls('bottomright', +deltaX, +deltaZ) + file.subMarkersControls.push(subMarkerControls) + + return file + + ////////////////////////////////////////////////////////////////////////////// + // Code Separator + ////////////////////////////////////////////////////////////////////////////// + + function buildSubMarkerControls(layout, positionX, positionZ){ + console.log('buildSubMarkerControls', layout, positionX, positionZ) + // create subMarkersControls + var subMarkersControls = { + parameters: {}, + poseMatrix: new THREE.Matrix4().makeTranslation(positionX,0, positionZ).toArray(), + } + // fill the parameters + if( trackingBackend === 'artoolkit' ){ + layout2MarkerParametersArtoolkit(subMarkersControls.parameters, layout) + }else if( trackingBackend === 'aruco' ){ + layout2MarkerParametersAruco(subMarkersControls.parameters, layout) + }else console.assert(false) + // return subMarkersControls + return subMarkersControls + } + + function layout2MarkerParametersArtoolkit(parameters, layout){ + // create absoluteBaseURL + var link = document.createElement('a') + link.href = ARjs.Context.baseURL + var absoluteBaseURL = link.href + + var layout2PatternUrl = { + 'center' : convertRelativeUrlToAbsolute(absoluteBaseURL + 'examples/marker-training/examples/pattern-files/pattern-hiro.patt'), + 'topleft' : convertRelativeUrlToAbsolute(absoluteBaseURL + 'examples/marker-training/examples/pattern-files/pattern-letterA.patt'), + 'topright' : convertRelativeUrlToAbsolute(absoluteBaseURL + 'examples/marker-training/examples/pattern-files/pattern-letterB.patt'), + 'bottomleft' : convertRelativeUrlToAbsolute(absoluteBaseURL + 'examples/marker-training/examples/pattern-files/pattern-letterC.patt'), + 'bottomright' : convertRelativeUrlToAbsolute(absoluteBaseURL + 'examples/marker-training/examples/pattern-files/pattern-letterF.patt'), + } + console.assert(layout2PatternUrl[layout] !== undefined ) + parameters.type = 'pattern' + parameters.patternUrl = layout2PatternUrl[layout] + return + function convertRelativeUrlToAbsolute(relativeUrl){ + var tmpLink = document.createElement('a'); + tmpLink.href = relativeUrl + return tmpLink.href + } + } + + function layout2MarkerParametersAruco(parameters, layout){ + var layout2Barcode = { + 'center' : 1001, + 'topleft' : 1002, + 'topright' : 1003, + 'bottomleft' : 1004, + 'bottomright' : 1005, + } + console.assert(layout2Barcode[layout]) + parameters.type = 'barcode' + parameters.barcodeValue = layout2Barcode[layout] + } +} diff --git a/1_Three.js/6_AR/js/dat.gui.min.js b/1_Three.js/6_AR/js/dat.gui.min.js new file mode 100755 index 0000000000000000000000000000000000000000..5b69be5aae03edb7be84df6398fb28e66c331086 --- /dev/null +++ b/1_Three.js/6_AR/js/dat.gui.min.js @@ -0,0 +1,14 @@ +/** + * dat-gui JavaScript Controller Library + * https://github.com/dataarts/dat.gui + * + * Copyright 2016 Data Arts Team, Google Creative Lab + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.dat=t():e.dat=t()}(this,function(){return function(e){function t(o){if(n[o])return n[o].exports;var i=n[o]={exports:{},id:o,loaded:!1};return e[o].call(i.exports,i,i.exports,t),i.loaded=!0,i.exports}var n={};return t.m=e,t.c=n,t.p="",t(0)}([function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{"default":e}}var i=n(1),r=o(i);e.exports=r["default"]},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{"default":e}}t.__esModule=!0;var i=n(2),r=o(i),a=n(6),l=o(a),s=n(3),u=o(s),d=n(7),c=o(d),f=n(8),_=o(f),p=n(10),h=o(p),m=n(11),b=o(m),g=n(12),v=o(g),y=n(13),w=o(y),x=n(14),E=o(x),C=n(15),A=o(C),S=n(16),k=o(S),O=n(9),T=o(O),R=n(17),L=o(R);t["default"]={color:{Color:r["default"],math:l["default"],interpret:u["default"]},controllers:{Controller:c["default"],BooleanController:_["default"],OptionController:h["default"],StringController:b["default"],NumberController:v["default"],NumberControllerBox:w["default"],NumberControllerSlider:E["default"],FunctionController:A["default"],ColorController:k["default"]},dom:{dom:T["default"]},gui:{GUI:L["default"]},GUI:L["default"]}},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{"default":e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,t,n){Object.defineProperty(e,t,{get:function(){return"RGB"===this.__state.space?this.__state[t]:(h.recalculateRGB(this,t,n),this.__state[t])},set:function(e){"RGB"!==this.__state.space&&(h.recalculateRGB(this,t,n),this.__state.space="RGB"),this.__state[t]=e}})}function a(e,t){Object.defineProperty(e,t,{get:function(){return"HSV"===this.__state.space?this.__state[t]:(h.recalculateHSV(this),this.__state[t])},set:function(e){"HSV"!==this.__state.space&&(h.recalculateHSV(this),this.__state.space="HSV"),this.__state[t]=e}})}t.__esModule=!0;var l=n(3),s=o(l),u=n(6),d=o(u),c=n(4),f=o(c),_=n(5),p=o(_),h=function(){function e(){if(i(this,e),this.__state=s["default"].apply(this,arguments),this.__state===!1)throw new Error("Failed to interpret color arguments");this.__state.a=this.__state.a||1}return e.prototype.toString=function(){return(0,f["default"])(this)},e.prototype.toHexString=function(){return(0,f["default"])(this,!0)},e.prototype.toOriginal=function(){return this.__state.conversion.write(this)},e}();h.recalculateRGB=function(e,t,n){if("HEX"===e.__state.space)e.__state[t]=d["default"].component_from_hex(e.__state.hex,n);else{if("HSV"!==e.__state.space)throw new Error("Corrupted color state");p["default"].extend(e.__state,d["default"].hsv_to_rgb(e.__state.h,e.__state.s,e.__state.v))}},h.recalculateHSV=function(e){var t=d["default"].rgb_to_hsv(e.r,e.g,e.b);p["default"].extend(e.__state,{s:t.s,v:t.v}),p["default"].isNaN(t.h)?p["default"].isUndefined(e.__state.h)&&(e.__state.h=0):e.__state.h=t.h},h.COMPONENTS=["r","g","b","h","s","v","hex","a"],r(h.prototype,"r",2),r(h.prototype,"g",1),r(h.prototype,"b",0),a(h.prototype,"h"),a(h.prototype,"s"),a(h.prototype,"v"),Object.defineProperty(h.prototype,"a",{get:function(){return this.__state.a},set:function(e){this.__state.a=e}}),Object.defineProperty(h.prototype,"hex",{get:function(){return"HEX"!==!this.__state.space&&(this.__state.hex=d["default"].rgb_to_hex(this.r,this.g,this.b)),this.__state.hex},set:function(e){this.__state.space="HEX",this.__state.hex=e}}),t["default"]=h},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{"default":e}}t.__esModule=!0;var i=n(4),r=o(i),a=n(5),l=o(a),s=[{litmus:l["default"].isString,conversions:{THREE_CHAR_HEX:{read:function(e){var t=e.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i);return null!==t&&{space:"HEX",hex:parseInt("0x"+t[1].toString()+t[1].toString()+t[2].toString()+t[2].toString()+t[3].toString()+t[3].toString(),0)}},write:r["default"]},SIX_CHAR_HEX:{read:function(e){var t=e.match(/^#([A-F0-9]{6})$/i);return null!==t&&{space:"HEX",hex:parseInt("0x"+t[1].toString(),0)}},write:r["default"]},CSS_RGB:{read:function(e){var t=e.match(/^rgb\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\)/);return null!==t&&{space:"RGB",r:parseFloat(t[1]),g:parseFloat(t[2]),b:parseFloat(t[3])}},write:r["default"]},CSS_RGBA:{read:function(e){var t=e.match(/^rgba\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\)/);return null!==t&&{space:"RGB",r:parseFloat(t[1]),g:parseFloat(t[2]),b:parseFloat(t[3]),a:parseFloat(t[4])}},write:r["default"]}}},{litmus:l["default"].isNumber,conversions:{HEX:{read:function(e){return{space:"HEX",hex:e,conversionName:"HEX"}},write:function(e){return e.hex}}}},{litmus:l["default"].isArray,conversions:{RGB_ARRAY:{read:function(e){return 3===e.length&&{space:"RGB",r:e[0],g:e[1],b:e[2]}},write:function(e){return[e.r,e.g,e.b]}},RGBA_ARRAY:{read:function(e){return 4===e.length&&{space:"RGB",r:e[0],g:e[1],b:e[2],a:e[3]}},write:function(e){return[e.r,e.g,e.b,e.a]}}}},{litmus:l["default"].isObject,conversions:{RGBA_OBJ:{read:function(e){return!!(l["default"].isNumber(e.r)&&l["default"].isNumber(e.g)&&l["default"].isNumber(e.b)&&l["default"].isNumber(e.a))&&{space:"RGB",r:e.r,g:e.g,b:e.b,a:e.a}},write:function(e){return{r:e.r,g:e.g,b:e.b,a:e.a}}},RGB_OBJ:{read:function(e){return!!(l["default"].isNumber(e.r)&&l["default"].isNumber(e.g)&&l["default"].isNumber(e.b))&&{space:"RGB",r:e.r,g:e.g,b:e.b}},write:function(e){return{r:e.r,g:e.g,b:e.b}}},HSVA_OBJ:{read:function(e){return!!(l["default"].isNumber(e.h)&&l["default"].isNumber(e.s)&&l["default"].isNumber(e.v)&&l["default"].isNumber(e.a))&&{space:"HSV",h:e.h,s:e.s,v:e.v,a:e.a}},write:function(e){return{h:e.h,s:e.s,v:e.v,a:e.a}}},HSV_OBJ:{read:function(e){return!!(l["default"].isNumber(e.h)&&l["default"].isNumber(e.s)&&l["default"].isNumber(e.v))&&{space:"HSV",h:e.h,s:e.s,v:e.v}},write:function(e){return{h:e.h,s:e.s,v:e.v}}}}}],u=void 0,d=void 0,c=function(){d=!1;var e=arguments.length>1?l["default"].toArray(arguments):arguments[0];return l["default"].each(s,function(t){if(t.litmus(e))return l["default"].each(t.conversions,function(t,n){if(u=t.read(e),d===!1&&u!==!1)return d=u,u.conversionName=n,u.conversion=t,l["default"].BREAK}),l["default"].BREAK}),d};t["default"]=c},function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e,t){var n=e.__state.conversionName.toString(),o=Math.round(e.r),i=Math.round(e.g),r=Math.round(e.b),a=e.a,l=Math.round(e.h),s=e.s.toFixed(1),u=e.v.toFixed(1);if(t||"THREE_CHAR_HEX"===n||"SIX_CHAR_HEX"===n){for(var d=e.hex.toString(16);d.length<6;)d="0"+d;return"#"+d}return"CSS_RGB"===n?"rgb("+o+","+i+","+r+")":"CSS_RGBA"===n?"rgba("+o+","+i+","+r+","+a+")":"HEX"===n?"0x"+e.hex.toString(16):"RGB_ARRAY"===n?"["+o+","+i+","+r+"]":"RGBA_ARRAY"===n?"["+o+","+i+","+r+","+a+"]":"RGB_OBJ"===n?"{r:"+o+",g:"+i+",b:"+r+"}":"RGBA_OBJ"===n?"{r:"+o+",g:"+i+",b:"+r+",a:"+a+"}":"HSV_OBJ"===n?"{h:"+l+",s:"+s+",v:"+u+"}":"HSVA_OBJ"===n?"{h:"+l+",s:"+s+",v:"+u+",a:"+a+"}":"unknown format"}},function(e,t){"use strict";t.__esModule=!0;var n=Array.prototype.forEach,o=Array.prototype.slice,i={BREAK:{},extend:function(e){return this.each(o.call(arguments,1),function(t){var n=this.isObject(t)?Object.keys(t):[];n.forEach(function(n){this.isUndefined(t[n])||(e[n]=t[n])}.bind(this))},this),e},defaults:function(e){return this.each(o.call(arguments,1),function(t){var n=this.isObject(t)?Object.keys(t):[];n.forEach(function(n){this.isUndefined(e[n])&&(e[n]=t[n])}.bind(this))},this),e},compose:function(){var e=o.call(arguments);return function(){for(var t=o.call(arguments),n=e.length-1;n>=0;n--)t=[e[n].apply(this,t)];return t[0]}},each:function(e,t,o){if(e)if(n&&e.forEach&&e.forEach===n)e.forEach(t,o);else if(e.length===e.length+0){var i=void 0,r=void 0;for(i=0,r=e.length;i<r;i++)if(i in e&&t.call(o,e[i],i)===this.BREAK)return}else for(var a in e)if(t.call(o,e[a],a)===this.BREAK)return},defer:function(e){setTimeout(e,0)},debounce:function(e,t){var n=void 0;return function(){function o(){n=null}var i=this,r=arguments,a=!n;clearTimeout(n),n=setTimeout(o,t),a&&e.apply(i,r)}},toArray:function(e){return e.toArray?e.toArray():o.call(e)},isUndefined:function(e){return void 0===e},isNull:function(e){return null===e},isNaN:function(e){function t(t){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}(function(e){return isNaN(e)}),isArray:Array.isArray||function(e){return e.constructor===Array},isObject:function(e){return e===Object(e)},isNumber:function(e){return e===e+0},isString:function(e){return e===e+""},isBoolean:function(e){return e===!1||e===!0},isFunction:function(e){return"[object Function]"===Object.prototype.toString.call(e)}};t["default"]=i},function(e,t){"use strict";t.__esModule=!0;var n=void 0,o={hsv_to_rgb:function(e,t,n){var o=Math.floor(e/60)%6,i=e/60-Math.floor(e/60),r=n*(1-t),a=n*(1-i*t),l=n*(1-(1-i)*t),s=[[n,l,r],[a,n,r],[r,n,l],[r,a,n],[l,r,n],[n,r,a]][o];return{r:255*s[0],g:255*s[1],b:255*s[2]}},rgb_to_hsv:function(e,t,n){var o=Math.min(e,t,n),i=Math.max(e,t,n),r=i-o,a=void 0,l=void 0;return 0===i?{h:NaN,s:0,v:0}:(l=r/i,a=e===i?(t-n)/r:t===i?2+(n-e)/r:4+(e-t)/r,a/=6,a<0&&(a+=1),{h:360*a,s:l,v:i/255})},rgb_to_hex:function(e,t,n){var o=this.hex_with_component(0,2,e);return o=this.hex_with_component(o,1,t),o=this.hex_with_component(o,0,n)},component_from_hex:function(e,t){return e>>8*t&255},hex_with_component:function(e,t,o){return o<<(n=8*t)|e&~(255<<n)}};t["default"]=o},function(e,t){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var o=function(){function e(t,o){n(this,e),this.initialValue=t[o],this.domElement=document.createElement("div"),this.object=t,this.property=o,this.__onChange=void 0,this.__onFinishChange=void 0}return e.prototype.onChange=function(e){return this.__onChange=e,this},e.prototype.onFinishChange=function(e){return this.__onFinishChange=e,this},e.prototype.setValue=function(e){return this.object[this.property]=e,this.__onChange&&this.__onChange.call(this,e),this.updateDisplay(),this},e.prototype.getValue=function(){return this.object[this.property]},e.prototype.updateDisplay=function(){return this},e.prototype.isModified=function(){return this.initialValue!==this.getValue()},e}();t["default"]=o},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{"default":e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var l=n(7),s=o(l),u=n(9),d=o(u),c=function(e){function t(n,o){function a(){s.setValue(!s.__prev)}i(this,t);var l=r(this,e.call(this,n,o)),s=l;return l.__prev=l.getValue(),l.__checkbox=document.createElement("input"),l.__checkbox.setAttribute("type","checkbox"),d["default"].bind(l.__checkbox,"change",a,!1),l.domElement.appendChild(l.__checkbox),l.updateDisplay(),l}return a(t,e),t.prototype.setValue=function(t){var n=e.prototype.setValue.call(this,t);return this.__onFinishChange&&this.__onFinishChange.call(this,this.getValue()),this.__prev=this.getValue(),n},t.prototype.updateDisplay=function(){return this.getValue()===!0?(this.__checkbox.setAttribute("checked","checked"),this.__checkbox.checked=!0):this.__checkbox.checked=!1,e.prototype.updateDisplay.call(this)},t}(s["default"]);t["default"]=c},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{"default":e}}function i(e){if("0"===e||a["default"].isUndefined(e))return 0;var t=e.match(u);return a["default"].isNull(t)?0:parseFloat(t[1])}t.__esModule=!0;var r=n(5),a=o(r),l={HTMLEvents:["change"],MouseEvents:["click","mousemove","mousedown","mouseup","mouseover"],KeyboardEvents:["keydown"]},s={};a["default"].each(l,function(e,t){a["default"].each(e,function(e){s[e]=t})});var u=/(\d+(\.\d+)?)px/,d={makeSelectable:function(e,t){void 0!==e&&void 0!==e.style&&(e.onselectstart=t?function(){return!1}:function(){},e.style.MozUserSelect=t?"auto":"none",e.style.KhtmlUserSelect=t?"auto":"none",e.unselectable=t?"on":"off")},makeFullscreen:function(e,t,n){var o=n,i=t;a["default"].isUndefined(i)&&(i=!0),a["default"].isUndefined(o)&&(o=!0),e.style.position="absolute",i&&(e.style.left=0,e.style.right=0),o&&(e.style.top=0,e.style.bottom=0)},fakeEvent:function(e,t,n,o){var i=n||{},r=s[t];if(!r)throw new Error("Event type "+t+" not supported.");var l=document.createEvent(r);switch(r){case"MouseEvents":var u=i.x||i.clientX||0,d=i.y||i.clientY||0;l.initMouseEvent(t,i.bubbles||!1,i.cancelable||!0,window,i.clickCount||1,0,0,u,d,!1,!1,!1,!1,0,null);break;case"KeyboardEvents":var c=l.initKeyboardEvent||l.initKeyEvent;a["default"].defaults(i,{cancelable:!0,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,keyCode:void 0,charCode:void 0}),c(t,i.bubbles||!1,i.cancelable,window,i.ctrlKey,i.altKey,i.shiftKey,i.metaKey,i.keyCode,i.charCode);break;default:l.initEvent(t,i.bubbles||!1,i.cancelable||!0)}a["default"].defaults(l,o),e.dispatchEvent(l)},bind:function(e,t,n,o){var i=o||!1;return e.addEventListener?e.addEventListener(t,n,i):e.attachEvent&&e.attachEvent("on"+t,n),d},unbind:function(e,t,n,o){var i=o||!1;return e.removeEventListener?e.removeEventListener(t,n,i):e.detachEvent&&e.detachEvent("on"+t,n),d},addClass:function(e,t){if(void 0===e.className)e.className=t;else if(e.className!==t){var n=e.className.split(/ +/);n.indexOf(t)===-1&&(n.push(t),e.className=n.join(" ").replace(/^\s+/,"").replace(/\s+$/,""))}return d},removeClass:function(e,t){if(t)if(e.className===t)e.removeAttribute("class");else{var n=e.className.split(/ +/),o=n.indexOf(t);o!==-1&&(n.splice(o,1),e.className=n.join(" "))}else e.className=void 0;return d},hasClass:function(e,t){return new RegExp("(?:^|\\s+)"+t+"(?:\\s+|$)").test(e.className)||!1},getWidth:function(e){var t=getComputedStyle(e);return i(t["border-left-width"])+i(t["border-right-width"])+i(t["padding-left"])+i(t["padding-right"])+i(t.width)},getHeight:function(e){var t=getComputedStyle(e);return i(t["border-top-width"])+i(t["border-bottom-width"])+i(t["padding-top"])+i(t["padding-bottom"])+i(t.height)},getOffset:function(e){var t=e,n={left:0,top:0};if(t.offsetParent)do n.left+=t.offsetLeft,n.top+=t.offsetTop,t=t.offsetParent;while(t);return n},isActive:function(e){return e===document.activeElement&&(e.type||e.href)}};t["default"]=d},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{"default":e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var l=n(7),s=o(l),u=n(9),d=o(u),c=n(5),f=o(c),_=function(e){function t(n,o,a){i(this,t);var l=r(this,e.call(this,n,o)),s=a,u=l;return l.__select=document.createElement("select"),f["default"].isArray(s)&&!function(){var e={};f["default"].each(s,function(t){e[t]=t}),s=e}(),f["default"].each(s,function(e,t){var n=document.createElement("option");n.innerHTML=t,n.setAttribute("value",e),u.__select.appendChild(n)}),l.updateDisplay(),d["default"].bind(l.__select,"change",function(){var e=this.options[this.selectedIndex].value;u.setValue(e)}),l.domElement.appendChild(l.__select),l}return a(t,e),t.prototype.setValue=function(t){var n=e.prototype.setValue.call(this,t);return this.__onFinishChange&&this.__onFinishChange.call(this,this.getValue()),n},t.prototype.updateDisplay=function(){return d["default"].isActive(this.__select)?this:(this.__select.value=this.getValue(),e.prototype.updateDisplay.call(this))},t}(s["default"]);t["default"]=_},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{"default":e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var l=n(7),s=o(l),u=n(9),d=o(u),c=function(e){function t(n,o){function a(){u.setValue(u.__input.value)}function l(){u.__onFinishChange&&u.__onFinishChange.call(u,u.getValue())}i(this,t);var s=r(this,e.call(this,n,o)),u=s;return s.__input=document.createElement("input"),s.__input.setAttribute("type","text"),d["default"].bind(s.__input,"keyup",a),d["default"].bind(s.__input,"change",a),d["default"].bind(s.__input,"blur",l),d["default"].bind(s.__input,"keydown",function(e){13===e.keyCode&&this.blur()}),s.updateDisplay(),s.domElement.appendChild(s.__input),s}return a(t,e),t.prototype.updateDisplay=function(){return d["default"].isActive(this.__input)||(this.__input.value=this.getValue()),e.prototype.updateDisplay.call(this)},t}(s["default"]);t["default"]=c},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{"default":e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function l(e){var t=e.toString();return t.indexOf(".")>-1?t.length-t.indexOf(".")-1:0}t.__esModule=!0;var s=n(7),u=o(s),d=n(5),c=o(d),f=function(e){function t(n,o,a){i(this,t);var s=r(this,e.call(this,n,o)),u=a||{};return s.__min=u.min,s.__max=u.max,s.__step=u.step,c["default"].isUndefined(s.__step)?0===s.initialValue?s.__impliedStep=1:s.__impliedStep=Math.pow(10,Math.floor(Math.log(Math.abs(s.initialValue))/Math.LN10))/10:s.__impliedStep=s.__step,s.__precision=l(s.__impliedStep),s}return a(t,e),t.prototype.setValue=function(t){var n=t;return void 0!==this.__min&&n<this.__min?n=this.__min:void 0!==this.__max&&n>this.__max&&(n=this.__max),void 0!==this.__step&&n%this.__step!==0&&(n=Math.round(n/this.__step)*this.__step),e.prototype.setValue.call(this,n)},t.prototype.min=function(e){return this.__min=e,this},t.prototype.max=function(e){return this.__max=e,this},t.prototype.step=function(e){return this.__step=e,this.__impliedStep=e,this.__precision=l(e),this},t}(u["default"]);t["default"]=f},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{"default":e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function l(e,t){var n=Math.pow(10,t);return Math.round(e*n)/n}t.__esModule=!0;var s=n(12),u=o(s),d=n(9),c=o(d),f=n(5),_=o(f),p=function(e){function t(n,o,a){function l(){var e=parseFloat(m.__input.value);_["default"].isNaN(e)||m.setValue(e)}function s(){m.__onFinishChange&&m.__onFinishChange.call(m,m.getValue())}function u(){s()}function d(e){var t=b-e.clientY;m.setValue(m.getValue()+t*m.__impliedStep),b=e.clientY}function f(){c["default"].unbind(window,"mousemove",d),c["default"].unbind(window,"mouseup",f),s()}function p(e){c["default"].bind(window,"mousemove",d),c["default"].bind(window,"mouseup",f),b=e.clientY}i(this,t);var h=r(this,e.call(this,n,o,a));h.__truncationSuspended=!1;var m=h,b=void 0;return h.__input=document.createElement("input"),h.__input.setAttribute("type","text"),c["default"].bind(h.__input,"change",l),c["default"].bind(h.__input,"blur",u),c["default"].bind(h.__input,"mousedown",p),c["default"].bind(h.__input,"keydown",function(e){13===e.keyCode&&(m.__truncationSuspended=!0,this.blur(),m.__truncationSuspended=!1,s())}),h.updateDisplay(),h.domElement.appendChild(h.__input),h}return a(t,e),t.prototype.updateDisplay=function(){return this.__input.value=this.__truncationSuspended?this.getValue():l(this.getValue(),this.__precision),e.prototype.updateDisplay.call(this)},t}(u["default"]);t["default"]=p},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{"default":e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function l(e,t,n,o,i){return o+(i-o)*((e-t)/(n-t))}t.__esModule=!0;var s=n(12),u=o(s),d=n(9),c=o(d),f=function(e){function t(n,o,a,s,u){function d(e){document.activeElement.blur(),c["default"].bind(window,"mousemove",f),c["default"].bind(window,"mouseup",_),f(e)}function f(e){e.preventDefault();var t=h.__background.getBoundingClientRect();return h.setValue(l(e.clientX,t.left,t.right,h.__min,h.__max)),!1}function _(){c["default"].unbind(window,"mousemove",f),c["default"].unbind(window,"mouseup",_),h.__onFinishChange&&h.__onFinishChange.call(h,h.getValue())}i(this,t);var p=r(this,e.call(this,n,o,{min:a,max:s,step:u})),h=p;return p.__background=document.createElement("div"),p.__foreground=document.createElement("div"),c["default"].bind(p.__background,"mousedown",d),c["default"].addClass(p.__background,"slider"),c["default"].addClass(p.__foreground,"slider-fg"),p.updateDisplay(),p.__background.appendChild(p.__foreground),p.domElement.appendChild(p.__background),p}return a(t,e),t.prototype.updateDisplay=function(){var t=(this.getValue()-this.__min)/(this.__max-this.__min);return this.__foreground.style.width=100*t+"%",e.prototype.updateDisplay.call(this)},t}(u["default"]);t["default"]=f},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{"default":e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var l=n(7),s=o(l),u=n(9),d=o(u),c=function(e){function t(n,o,a){i(this,t);var l=r(this,e.call(this,n,o)),s=l;return l.__button=document.createElement("div"),l.__button.innerHTML=void 0===a?"Fire":a,d["default"].bind(l.__button,"click",function(e){return e.preventDefault(),s.fire(),!1}),d["default"].addClass(l.__button,"button"),l.domElement.appendChild(l.__button),l}return a(t,e),t.prototype.fire=function(){this.__onChange&&this.__onChange.call(this),this.getValue().call(this.object),this.__onFinishChange&&this.__onFinishChange.call(this,this.getValue())},t}(s["default"]);t["default"]=c},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{"default":e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function l(e,t,n,o){e.style.background="",g["default"].each(y,function(i){e.style.cssText+="background: "+i+"linear-gradient("+t+", "+n+" 0%, "+o+" 100%); "})}function s(e){e.style.background="",e.style.cssText+="background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);",e.style.cssText+="background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);",e.style.cssText+="background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);",e.style.cssText+="background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);",e.style.cssText+="background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);"}t.__esModule=!0;var u=n(7),d=o(u),c=n(9),f=o(c),_=n(2),p=o(_),h=n(3),m=o(h),b=n(5),g=o(b),v=function(e){function t(n,o){function a(e){h(e),f["default"].bind(window,"mousemove",h),f["default"].bind(window,"mouseup",u)}function u(){f["default"].unbind(window,"mousemove",h),f["default"].unbind(window,"mouseup",u),_()}function d(){var e=(0,m["default"])(this.value);e!==!1?(y.__color.__state=e,y.setValue(y.__color.toOriginal())):this.value=y.__color.toString()}function c(){f["default"].unbind(window,"mousemove",b),f["default"].unbind(window,"mouseup",c),_()}function _(){y.__onFinishChange&&y.__onFinishChange.call(y,y.__color.toOriginal())}function h(e){e.preventDefault();var t=y.__saturation_field.getBoundingClientRect(),n=(e.clientX-t.left)/(t.right-t.left),o=1-(e.clientY-t.top)/(t.bottom-t.top);return o>1?o=1:o<0&&(o=0),n>1?n=1:n<0&&(n=0),y.__color.v=o,y.__color.s=n,y.setValue(y.__color.toOriginal()),!1}function b(e){e.preventDefault();var t=y.__hue_field.getBoundingClientRect(),n=1-(e.clientY-t.top)/(t.bottom-t.top);return n>1?n=1:n<0&&(n=0),y.__color.h=360*n,y.setValue(y.__color.toOriginal()),!1}i(this,t);var v=r(this,e.call(this,n,o));v.__color=new p["default"](v.getValue()),v.__temp=new p["default"](0);var y=v;v.domElement=document.createElement("div"),f["default"].makeSelectable(v.domElement,!1),v.__selector=document.createElement("div"),v.__selector.className="selector",v.__saturation_field=document.createElement("div"),v.__saturation_field.className="saturation-field",v.__field_knob=document.createElement("div"),v.__field_knob.className="field-knob",v.__field_knob_border="2px solid ",v.__hue_knob=document.createElement("div"),v.__hue_knob.className="hue-knob",v.__hue_field=document.createElement("div"),v.__hue_field.className="hue-field",v.__input=document.createElement("input"),v.__input.type="text",v.__input_textShadow="0 1px 1px ",f["default"].bind(v.__input,"keydown",function(e){13===e.keyCode&&d.call(this)}),f["default"].bind(v.__input,"blur",d),f["default"].bind(v.__selector,"mousedown",function(){f["default"].addClass(this,"drag").bind(window,"mouseup",function(){f["default"].removeClass(y.__selector,"drag")})});var w=document.createElement("div");return g["default"].extend(v.__selector.style,{width:"122px",height:"102px",padding:"3px",backgroundColor:"#222",boxShadow:"0px 1px 3px rgba(0,0,0,0.3)"}),g["default"].extend(v.__field_knob.style,{position:"absolute",width:"12px",height:"12px",border:v.__field_knob_border+(v.__color.v<.5?"#fff":"#000"),boxShadow:"0px 1px 3px rgba(0,0,0,0.5)",borderRadius:"12px",zIndex:1}),g["default"].extend(v.__hue_knob.style,{position:"absolute",width:"15px",height:"2px",borderRight:"4px solid #fff",zIndex:1}),g["default"].extend(v.__saturation_field.style,{width:"100px",height:"100px",border:"1px solid #555",marginRight:"3px",display:"inline-block",cursor:"pointer"}),g["default"].extend(w.style,{width:"100%",height:"100%",background:"none"}),l(w,"top","rgba(0,0,0,0)","#000"),g["default"].extend(v.__hue_field.style,{width:"15px",height:"100px",border:"1px solid #555",cursor:"ns-resize",position:"absolute",top:"3px",right:"3px"}),s(v.__hue_field),g["default"].extend(v.__input.style,{outline:"none",textAlign:"center",color:"#fff",border:0,fontWeight:"bold",textShadow:v.__input_textShadow+"rgba(0,0,0,0.7)"}),f["default"].bind(v.__saturation_field,"mousedown",a),f["default"].bind(v.__field_knob,"mousedown",a),f["default"].bind(v.__hue_field,"mousedown",function(e){b(e),f["default"].bind(window,"mousemove",b),f["default"].bind(window,"mouseup",c)}),v.__saturation_field.appendChild(w),v.__selector.appendChild(v.__field_knob),v.__selector.appendChild(v.__saturation_field),v.__selector.appendChild(v.__hue_field),v.__hue_field.appendChild(v.__hue_knob),v.domElement.appendChild(v.__input),v.domElement.appendChild(v.__selector),v.updateDisplay(),v}return a(t,e),t.prototype.updateDisplay=function(){var e=(0,m["default"])(this.getValue());if(e!==!1){var t=!1;g["default"].each(p["default"].COMPONENTS,function(n){if(!g["default"].isUndefined(e[n])&&!g["default"].isUndefined(this.__color.__state[n])&&e[n]!==this.__color.__state[n])return t=!0,{}},this),t&&g["default"].extend(this.__color.__state,e)}g["default"].extend(this.__temp.__state,this.__color.__state),this.__temp.a=1;var n=this.__color.v<.5||this.__color.s>.5?255:0,o=255-n;g["default"].extend(this.__field_knob.style,{marginLeft:100*this.__color.s-7+"px",marginTop:100*(1-this.__color.v)-7+"px",backgroundColor:this.__temp.toHexString(),border:this.__field_knob_border+"rgb("+n+","+n+","+n+")"}),this.__hue_knob.style.marginTop=100*(1-this.__color.h/360)+"px",this.__temp.s=1,this.__temp.v=1,l(this.__saturation_field,"left","#fff",this.__temp.toHexString()),this.__input.value=this.__color.toString(),g["default"].extend(this.__input.style,{backgroundColor:this.__color.toHexString(),color:"rgb("+n+","+n+","+n+")",textShadow:this.__input_textShadow+"rgba("+o+","+o+","+o+",.7)"})},t}(d["default"]),y=["-moz-","-o-","-webkit-","-ms-",""];t["default"]=v},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{"default":e}}function i(e,t,n){var o=document.createElement("li");return t&&o.appendChild(t),n?e.__ul.insertBefore(o,n):e.__ul.appendChild(o),e.onResize(),o}function r(e,t){var n=e.__preset_select[e.__preset_select.selectedIndex];t?n.innerHTML=n.value+"*":n.innerHTML=n.value}function a(e,t,n){if(n.__li=t,n.__gui=e,U["default"].extend(n,{options:function(t){if(arguments.length>1){var o=n.__li.nextElementSibling;return n.remove(),s(e,n.object,n.property,{before:o,factoryArgs:[U["default"].toArray(arguments)]})}if(U["default"].isArray(t)||U["default"].isObject(t)){var i=n.__li.nextElementSibling;return n.remove(),s(e,n.object,n.property,{before:i,factoryArgs:[t]})}},name:function(e){return n.__li.firstElementChild.firstElementChild.innerHTML=e,n},listen:function(){return n.__gui.listen(n),n},remove:function(){ +return n.__gui.remove(n),n}}),n instanceof B["default"])!function(){var e=new N["default"](n.object,n.property,{min:n.__min,max:n.__max,step:n.__step});U["default"].each(["updateDisplay","onChange","onFinishChange","step"],function(t){var o=n[t],i=e[t];n[t]=e[t]=function(){var t=Array.prototype.slice.call(arguments);return i.apply(e,t),o.apply(n,t)}}),z["default"].addClass(t,"has-slider"),n.domElement.insertBefore(e.domElement,n.domElement.firstElementChild)}();else if(n instanceof N["default"]){var o=function(t){if(U["default"].isNumber(n.__min)&&U["default"].isNumber(n.__max)){var o=n.__li.firstElementChild.firstElementChild.innerHTML,i=n.__gui.__listening.indexOf(n)>-1;n.remove();var r=s(e,n.object,n.property,{before:n.__li.nextElementSibling,factoryArgs:[n.__min,n.__max,n.__step]});return r.name(o),i&&r.listen(),r}return t};n.min=U["default"].compose(o,n.min),n.max=U["default"].compose(o,n.max)}else n instanceof O["default"]?(z["default"].bind(t,"click",function(){z["default"].fakeEvent(n.__checkbox,"click")}),z["default"].bind(n.__checkbox,"click",function(e){e.stopPropagation()})):n instanceof R["default"]?(z["default"].bind(t,"click",function(){z["default"].fakeEvent(n.__button,"click")}),z["default"].bind(t,"mouseover",function(){z["default"].addClass(n.__button,"hover")}),z["default"].bind(t,"mouseout",function(){z["default"].removeClass(n.__button,"hover")})):n instanceof j["default"]&&(z["default"].addClass(t,"color"),n.updateDisplay=U["default"].compose(function(e){return t.style.borderLeftColor=n.__color.toString(),e},n.updateDisplay),n.updateDisplay());n.setValue=U["default"].compose(function(t){return e.getRoot().__preset_select&&n.isModified()&&r(e.getRoot(),!0),t},n.setValue)}function l(e,t){var n=e.getRoot(),o=n.__rememberedObjects.indexOf(t.object);if(o!==-1){var i=n.__rememberedObjectIndecesToControllers[o];if(void 0===i&&(i={},n.__rememberedObjectIndecesToControllers[o]=i),i[t.property]=t,n.load&&n.load.remembered){var r=n.load.remembered,a=void 0;if(r[e.preset])a=r[e.preset];else{if(!r[Q])return;a=r[Q]}if(a[o]&&void 0!==a[o][t.property]){var l=a[o][t.property];t.initialValue=l,t.setValue(l)}}}}function s(e,t,n,o){if(void 0===t[n])throw new Error('Object "'+t+'" has no property "'+n+'"');var r=void 0;if(o.color)r=new j["default"](t,n);else{var s=[t,n].concat(o.factoryArgs);r=C["default"].apply(e,s)}o.before instanceof S["default"]&&(o.before=o.before.__li),l(e,r),z["default"].addClass(r.domElement,"c");var u=document.createElement("span");z["default"].addClass(u,"property-name"),u.innerHTML=r.property;var d=document.createElement("div");d.appendChild(u),d.appendChild(r.domElement);var c=i(e,d,o.before);return z["default"].addClass(c,oe.CLASS_CONTROLLER_ROW),r instanceof j["default"]?z["default"].addClass(c,"color"):z["default"].addClass(c,g(r.getValue())),a(e,c,r),e.__controllers.push(r),r}function u(e,t){return document.location.href+"."+t}function d(e,t,n){var o=document.createElement("option");o.innerHTML=t,o.value=t,e.__preset_select.appendChild(o),n&&(e.__preset_select.selectedIndex=e.__preset_select.length-1)}function c(e,t){t.style.display=e.useLocalStorage?"block":"none"}function f(e){var t=e.__save_row=document.createElement("li");z["default"].addClass(e.domElement,"has-save"),e.__ul.insertBefore(t,e.__ul.firstChild),z["default"].addClass(t,"save-row");var n=document.createElement("span");n.innerHTML=" ",z["default"].addClass(n,"button gears");var o=document.createElement("span");o.innerHTML="Save",z["default"].addClass(o,"button"),z["default"].addClass(o,"save");var i=document.createElement("span");i.innerHTML="New",z["default"].addClass(i,"button"),z["default"].addClass(i,"save-as");var r=document.createElement("span");r.innerHTML="Revert",z["default"].addClass(r,"button"),z["default"].addClass(r,"revert");var a=e.__preset_select=document.createElement("select");e.load&&e.load.remembered?U["default"].each(e.load.remembered,function(t,n){d(e,n,n===e.preset)}):d(e,Q,!1),z["default"].bind(a,"change",function(){for(var t=0;t<e.__preset_select.length;t++)e.__preset_select[t].innerHTML=e.__preset_select[t].value;e.preset=this.value}),t.appendChild(a),t.appendChild(n),t.appendChild(o),t.appendChild(i),t.appendChild(r),q&&!function(){var t=document.getElementById("dg-local-explain"),n=document.getElementById("dg-local-storage"),o=document.getElementById("dg-save-locally");o.style.display="block","true"===localStorage.getItem(u(e,"isLocal"))&&n.setAttribute("checked","checked"),c(e,t),z["default"].bind(n,"change",function(){e.useLocalStorage=!e.useLocalStorage,c(e,t)})}();var l=document.getElementById("dg-new-constructor");z["default"].bind(l,"keydown",function(e){!e.metaKey||67!==e.which&&67!==e.keyCode||Z.hide()}),z["default"].bind(n,"click",function(){l.innerHTML=JSON.stringify(e.getSaveObject(),void 0,2),Z.show(),l.focus(),l.select()}),z["default"].bind(o,"click",function(){e.save()}),z["default"].bind(i,"click",function(){var t=prompt("Enter a new preset name.");t&&e.saveAs(t)}),z["default"].bind(r,"click",function(){e.revert()})}function _(e){function t(t){return t.preventDefault(),e.width+=i-t.clientX,e.onResize(),i=t.clientX,!1}function n(){z["default"].removeClass(e.__closeButton,oe.CLASS_DRAG),z["default"].unbind(window,"mousemove",t),z["default"].unbind(window,"mouseup",n)}function o(o){return o.preventDefault(),i=o.clientX,z["default"].addClass(e.__closeButton,oe.CLASS_DRAG),z["default"].bind(window,"mousemove",t),z["default"].bind(window,"mouseup",n),!1}var i=void 0;e.__resize_handle=document.createElement("div"),U["default"].extend(e.__resize_handle.style,{width:"6px",marginLeft:"-3px",height:"200px",cursor:"ew-resize",position:"absolute"}),z["default"].bind(e.__resize_handle,"mousedown",o),z["default"].bind(e.__closeButton,"mousedown",o),e.domElement.insertBefore(e.__resize_handle,e.domElement.firstElementChild)}function p(e,t){e.domElement.style.width=t+"px",e.__save_row&&e.autoPlace&&(e.__save_row.style.width=t+"px"),e.__closeButton&&(e.__closeButton.style.width=t+"px")}function h(e,t){var n={};return U["default"].each(e.__rememberedObjects,function(o,i){var r={},a=e.__rememberedObjectIndecesToControllers[i];U["default"].each(a,function(e,n){r[n]=t?e.initialValue:e.getValue()}),n[i]=r}),n}function m(e){for(var t=0;t<e.__preset_select.length;t++)e.__preset_select[t].value===e.preset&&(e.__preset_select.selectedIndex=t)}function b(e){0!==e.length&&D["default"].call(window,function(){b(e)}),U["default"].each(e,function(e){e.updateDisplay()})}var g="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol?"symbol":typeof e},v=n(18),y=o(v),w=n(19),x=o(w),E=n(20),C=o(E),A=n(7),S=o(A),k=n(8),O=o(k),T=n(15),R=o(T),L=n(13),N=o(L),M=n(14),B=o(M),H=n(16),j=o(H),P=n(21),D=o(P),V=n(22),F=o(V),I=n(9),z=o(I),G=n(5),U=o(G),X=n(23),K=o(X);y["default"].inject(K["default"]);var Y="dg",J=72,W=20,Q="Default",q=function(){try{return"localStorage"in window&&null!==window.localStorage}catch(e){return!1}}(),Z=void 0,$=!0,ee=void 0,te=!1,ne=[],oe=function ie(e){function t(){var e=n.getRoot();e.width+=1,U["default"].defer(function(){e.width-=1})}var n=this,o=e||{};this.domElement=document.createElement("div"),this.__ul=document.createElement("ul"),this.domElement.appendChild(this.__ul),z["default"].addClass(this.domElement,Y),this.__folders={},this.__controllers=[],this.__rememberedObjects=[],this.__rememberedObjectIndecesToControllers=[],this.__listening=[],o=U["default"].defaults(o,{autoPlace:!0,width:ie.DEFAULT_WIDTH}),o=U["default"].defaults(o,{resizable:o.autoPlace,hideable:o.autoPlace}),U["default"].isUndefined(o.load)?o.load={preset:Q}:o.preset&&(o.load.preset=o.preset),U["default"].isUndefined(o.parent)&&o.hideable&&ne.push(this),o.resizable=U["default"].isUndefined(o.parent)&&o.resizable,o.autoPlace&&U["default"].isUndefined(o.scrollable)&&(o.scrollable=!0);var r=q&&"true"===localStorage.getItem(u(this,"isLocal")),a=void 0;if(Object.defineProperties(this,{parent:{get:function(){return o.parent}},scrollable:{get:function(){return o.scrollable}},autoPlace:{get:function(){return o.autoPlace}},preset:{get:function(){return n.parent?n.getRoot().preset:o.load.preset},set:function(e){n.parent?n.getRoot().preset=e:o.load.preset=e,m(this),n.revert()}},width:{get:function(){return o.width},set:function(e){o.width=e,p(n,e)}},name:{get:function(){return o.name},set:function(e){o.name=e,titleRowName&&(titleRowName.innerHTML=o.name)}},closed:{get:function(){return o.closed},set:function(e){o.closed=e,o.closed?z["default"].addClass(n.__ul,ie.CLASS_CLOSED):z["default"].removeClass(n.__ul,ie.CLASS_CLOSED),this.onResize(),n.__closeButton&&(n.__closeButton.innerHTML=e?ie.TEXT_OPEN:ie.TEXT_CLOSED)}},load:{get:function(){return o.load}},useLocalStorage:{get:function(){return r},set:function(e){q&&(r=e,e?z["default"].bind(window,"unload",a):z["default"].unbind(window,"unload",a),localStorage.setItem(u(n,"isLocal"),e))}}}),U["default"].isUndefined(o.parent)){if(o.closed=!1,z["default"].addClass(this.domElement,ie.CLASS_MAIN),z["default"].makeSelectable(this.domElement,!1),q&&r){n.useLocalStorage=!0;var l=localStorage.getItem(u(this,"gui"));l&&(o.load=JSON.parse(l))}this.__closeButton=document.createElement("div"),this.__closeButton.innerHTML=ie.TEXT_CLOSED,z["default"].addClass(this.__closeButton,ie.CLASS_CLOSE_BUTTON),this.domElement.appendChild(this.__closeButton),z["default"].bind(this.__closeButton,"click",function(){n.closed=!n.closed})}else{void 0===o.closed&&(o.closed=!0);var s=document.createTextNode(o.name);z["default"].addClass(s,"controller-name");var d=i(n,s),c=function(e){return e.preventDefault(),n.closed=!n.closed,!1};z["default"].addClass(this.__ul,ie.CLASS_CLOSED),z["default"].addClass(d,"title"),z["default"].bind(d,"click",c),o.closed||(this.closed=!1)}o.autoPlace&&(U["default"].isUndefined(o.parent)&&($&&(ee=document.createElement("div"),z["default"].addClass(ee,Y),z["default"].addClass(ee,ie.CLASS_AUTO_PLACE_CONTAINER),document.body.appendChild(ee),$=!1),ee.appendChild(this.domElement),z["default"].addClass(this.domElement,ie.CLASS_AUTO_PLACE)),this.parent||p(n,o.width)),this.__resizeHandler=function(){n.onResizeDebounced()},z["default"].bind(window,"resize",this.__resizeHandler),z["default"].bind(this.__ul,"webkitTransitionEnd",this.__resizeHandler),z["default"].bind(this.__ul,"transitionend",this.__resizeHandler),z["default"].bind(this.__ul,"oTransitionEnd",this.__resizeHandler),this.onResize(),o.resizable&&_(this),a=function(){q&&"true"===localStorage.getItem(u(n,"isLocal"))&&localStorage.setItem(u(n,"gui"),JSON.stringify(n.getSaveObject()))},this.saveToLocalStorageIfPossible=a,o.parent||t()};oe.toggleHide=function(){te=!te,U["default"].each(ne,function(e){e.domElement.style.display=te?"none":""})},oe.CLASS_AUTO_PLACE="a",oe.CLASS_AUTO_PLACE_CONTAINER="ac",oe.CLASS_MAIN="main",oe.CLASS_CONTROLLER_ROW="cr",oe.CLASS_TOO_TALL="taller-than-window",oe.CLASS_CLOSED="closed",oe.CLASS_CLOSE_BUTTON="close-button",oe.CLASS_DRAG="drag",oe.DEFAULT_WIDTH=245,oe.TEXT_CLOSED="Close Controls",oe.TEXT_OPEN="Open Controls",oe._keydownHandler=function(e){"text"===document.activeElement.type||e.which!==J&&e.keyCode!==J||oe.toggleHide()},z["default"].bind(window,"keydown",oe._keydownHandler,!1),U["default"].extend(oe.prototype,{add:function(e,t){return s(this,e,t,{factoryArgs:Array.prototype.slice.call(arguments,2)})},addColor:function(e,t){return s(this,e,t,{color:!0})},remove:function(e){this.__ul.removeChild(e.__li),this.__controllers.splice(this.__controllers.indexOf(e),1);var t=this;U["default"].defer(function(){t.onResize()})},destroy:function(){this.autoPlace&&ee.removeChild(this.domElement),z["default"].unbind(window,"keydown",oe._keydownHandler,!1),z["default"].unbind(window,"resize",this.__resizeHandler),this.saveToLocalStorageIfPossible&&z["default"].unbind(window,"unload",this.saveToLocalStorageIfPossible)},addFolder:function(e){if(void 0!==this.__folders[e])throw new Error('You already have a folder in this GUI by the name "'+e+'"');var t={name:e,parent:this};t.autoPlace=this.autoPlace,this.load&&this.load.folders&&this.load.folders[e]&&(t.closed=this.load.folders[e].closed,t.load=this.load.folders[e]);var n=new oe(t);this.__folders[e]=n;var o=i(this,n.domElement);return z["default"].addClass(o,"folder"),n},open:function(){this.closed=!1},close:function(){this.closed=!0},onResize:function(){var e=this.getRoot();if(e.scrollable){var t=z["default"].getOffset(e.__ul).top,n=0;U["default"].each(e.__ul.childNodes,function(t){e.autoPlace&&t===e.__save_row||(n+=z["default"].getHeight(t))}),window.innerHeight-t-W<n?(z["default"].addClass(e.domElement,oe.CLASS_TOO_TALL),e.__ul.style.height=window.innerHeight-t-W+"px"):(z["default"].removeClass(e.domElement,oe.CLASS_TOO_TALL),e.__ul.style.height="auto")}e.__resize_handle&&U["default"].defer(function(){e.__resize_handle.style.height=e.__ul.offsetHeight+"px"}),e.__closeButton&&(e.__closeButton.style.width=e.width+"px")},onResizeDebounced:U["default"].debounce(function(){this.onResize()},200),remember:function(){if(U["default"].isUndefined(Z)&&(Z=new F["default"],Z.domElement.innerHTML=x["default"]),this.parent)throw new Error("You can only call remember on a top level GUI.");var e=this;U["default"].each(Array.prototype.slice.call(arguments),function(t){0===e.__rememberedObjects.length&&f(e),e.__rememberedObjects.indexOf(t)===-1&&e.__rememberedObjects.push(t)}),this.autoPlace&&p(this,this.width)},getRoot:function(){for(var e=this;e.parent;)e=e.parent;return e},getSaveObject:function(){var e=this.load;return e.closed=this.closed,this.__rememberedObjects.length>0&&(e.preset=this.preset,e.remembered||(e.remembered={}),e.remembered[this.preset]=h(this)),e.folders={},U["default"].each(this.__folders,function(t,n){e.folders[n]=t.getSaveObject()}),e},save:function(){this.load.remembered||(this.load.remembered={}),this.load.remembered[this.preset]=h(this),r(this,!1),this.saveToLocalStorageIfPossible()},saveAs:function(e){this.load.remembered||(this.load.remembered={},this.load.remembered[Q]=h(this,!0)),this.load.remembered[e]=h(this),this.preset=e,d(this,e,!0),this.saveToLocalStorageIfPossible()},revert:function(e){U["default"].each(this.__controllers,function(t){this.getRoot().load.remembered?l(e||this.getRoot(),t):t.setValue(t.initialValue),t.__onFinishChange&&t.__onFinishChange.call(t,t.getValue())},this),U["default"].each(this.__folders,function(e){e.revert(e)}),e||r(this.getRoot(),!1)},listen:function(e){var t=0===this.__listening.length;this.__listening.push(e),t&&b(this.__listening)},updateDisplay:function(){U["default"].each(this.__controllers,function(e){e.updateDisplay()}),U["default"].each(this.__folders,function(e){e.updateDisplay()})}}),e.exports=oe},function(e,t){"use strict";e.exports={load:function(e,t){var n=t||document,o=n.createElement("link");o.type="text/css",o.rel="stylesheet",o.href=e,n.getElementsByTagName("head")[0].appendChild(o)},inject:function(e,t){var n=t||document,o=document.createElement("style");o.type="text/css",o.innerHTML=e;var i=n.getElementsByTagName("head")[0];try{i.appendChild(o)}catch(r){}}}},function(e,t){e.exports="<div id=dg-save class=\"dg dialogue\"> Here's the new load parameter for your <code>GUI</code>'s constructor: <textarea id=dg-new-constructor></textarea> <div id=dg-save-locally> <input id=dg-local-storage type=checkbox /> Automatically save values to <code>localStorage</code> on exit. <div id=dg-local-explain>The values saved to <code>localStorage</code> will override those passed to <code>dat.GUI</code>'s constructor. This makes it easier to work incrementally, but <code>localStorage</code> is fragile, and your friends may not see the same values you do. </div> </div> </div>"},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{"default":e}}t.__esModule=!0;var i=n(10),r=o(i),a=n(13),l=o(a),s=n(14),u=o(s),d=n(11),c=o(d),f=n(15),_=o(f),p=n(8),h=o(p),m=n(5),b=o(m),g=function(e,t){var n=e[t];return b["default"].isArray(arguments[2])||b["default"].isObject(arguments[2])?new r["default"](e,t,arguments[2]):b["default"].isNumber(n)?b["default"].isNumber(arguments[2])&&b["default"].isNumber(arguments[3])?b["default"].isNumber(arguments[4])?new u["default"](e,t,arguments[2],arguments[3],arguments[4]):new u["default"](e,t,arguments[2],arguments[3]):b["default"].isNumber(arguments[4])?new l["default"](e,t,{min:arguments[2],max:arguments[3],step:arguments[4]}):new l["default"](e,t,{min:arguments[2],max:arguments[3]}):b["default"].isString(n)?new c["default"](e,t):b["default"].isFunction(n)?new _["default"](e,t,""):b["default"].isBoolean(n)?new h["default"](e,t):null};t["default"]=g},function(e,t){"use strict";function n(e){setTimeout(e,1e3/60)}t.__esModule=!0,t["default"]=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||n},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{"default":e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var r=n(9),a=o(r),l=n(5),s=o(l),u=function(){function e(){i(this,e),this.backgroundElement=document.createElement("div"),s["default"].extend(this.backgroundElement.style,{backgroundColor:"rgba(0,0,0,0.8)",top:0,left:0,display:"none",zIndex:"1000",opacity:0,WebkitTransition:"opacity 0.2s linear",transition:"opacity 0.2s linear"}),a["default"].makeFullscreen(this.backgroundElement),this.backgroundElement.style.position="fixed",this.domElement=document.createElement("div"),s["default"].extend(this.domElement.style,{position:"fixed",display:"none",zIndex:"1001",opacity:0,WebkitTransition:"-webkit-transform 0.2s ease-out, opacity 0.2s linear",transition:"transform 0.2s ease-out, opacity 0.2s linear"}),document.body.appendChild(this.backgroundElement),document.body.appendChild(this.domElement);var t=this;a["default"].bind(this.backgroundElement,"click",function(){t.hide()})}return e.prototype.show=function(){var e=this;this.backgroundElement.style.display="block",this.domElement.style.display="block",this.domElement.style.opacity=0,this.domElement.style.webkitTransform="scale(1.1)",this.layout(),s["default"].defer(function(){e.backgroundElement.style.opacity=1,e.domElement.style.opacity=1,e.domElement.style.webkitTransform="scale(1)"})},e.prototype.hide=function t(){var e=this,t=function n(){e.domElement.style.display="none",e.backgroundElement.style.display="none",a["default"].unbind(e.domElement,"webkitTransitionEnd",n),a["default"].unbind(e.domElement,"transitionend",n),a["default"].unbind(e.domElement,"oTransitionEnd",n)};a["default"].bind(this.domElement,"webkitTransitionEnd",t),a["default"].bind(this.domElement,"transitionend",t),a["default"].bind(this.domElement,"oTransitionEnd",t),this.backgroundElement.style.opacity=0,this.domElement.style.opacity=0,this.domElement.style.webkitTransform="scale(1.1)"},e.prototype.layout=function(){this.domElement.style.left=window.innerWidth/2-a["default"].getWidth(this.domElement)/2+"px",this.domElement.style.top=window.innerHeight/2-a["default"].getHeight(this.domElement)/2+"px"},e}();t["default"]=u},function(e,t,n){t=e.exports=n(24)(),t.push([e.id,".dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity .1s linear;transition:opacity .1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1!important}.dg.main .close-button.drag,.dg.main:hover .close-button{opacity:1}.dg.main .close-button{-webkit-transition:opacity .1s linear;transition:opacity .1s linear;border:0;position:absolute;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-x:hidden}.dg.a.has-save>ul{margin-top:27px}.dg.a.has-save>ul.closed{margin-top:0}.dg.a .save-row{position:fixed;top:0;z-index:1002}.dg li{-webkit-transition:height .1s ease-out;transition:height .1s ease-out}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;overflow:hidden;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid transparent}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li>*{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .c{float:left;width:60%}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:9px}.dg .c select{margin-top:5px}.dg .cr.boolean,.dg .cr.boolean *,.dg .cr.function,.dg .cr.function *,.dg .cr.function .property-name{cursor:pointer}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco,monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px Lucida Grande,sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid hsla(0,0%,100%,.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.color{border-left:3px solid}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2fa1d6}.dg .cr.number input[type=text]{color:#2fa1d6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.boolean:hover,.dg .cr.function:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2fa1d6;max-width:100%}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda}",""])},function(e,t){e.exports=function(){var e=[];return e.toString=function(){for(var e=[],t=0;t<this.length;t++){var n=this[t];n[2]?e.push("@media "+n[2]+"{"+n[1]+"}"):e.push(n[1])}return e.join("")},e.i=function(t,n){"string"==typeof t&&(t=[[null,t,""]]);for(var o={},i=0;i<this.length;i++){var r=this[i][0];"number"==typeof r&&(o[r]=!0)}for(i=0;i<t.length;i++){var a=t[i];"number"==typeof a[0]&&o[a[0]]||(n&&!a[2]?a[2]=n:n&&(a[2]="("+a[2]+") and ("+n+")"),e.push(a))}},e}}])}); diff --git a/1_Three.js/6_AR/js/keyboard.js b/1_Three.js/6_AR/js/keyboard.js new file mode 100755 index 0000000000000000000000000000000000000000..48902e9d1b159015ebe775124707f323359181cd --- /dev/null +++ b/1_Three.js/6_AR/js/keyboard.js @@ -0,0 +1,126 @@ +/* + Keyboard.js - a class for simplifying keyboard interaction. + Created by Lee Stemkoski. + + Usage: + // initialize keyboard + var keyboard = new Keyboard(); + + // in update loop + keyboard.update(); + + // check for discrete input (on key down/up event) + keyboard.isKeyDown("Space"); + keyboard.isKeyUp("X"); + + // check for continuous input (true between key down and key up events) + keyboard.isKeyPressed("ArrowUp"); +*/ + +class Keyboard +{ + constructor() + { + // Event listeners add keys to Queues. + // Update method updates Sets accordingly. + this.keyDownQueue = new Set(); + this.keyUpQueue = new Set(); + + this.keyDownSet = new Set(); + this.keyPressedSet = new Set(); + this.keyUpSet = new Set(); + + this.onKeyDown = function(key) {}; + this.onKeyUp = function(key) {}; + + let self = this; + + document.addEventListener( "keydown", + function(eventData) + { + let key = eventData.key; + if (key == " ") + key = "Space"; + if (key.length == 1) + key = key.toUpperCase(); + self.keyDownQueue.add( key ); + // activate callback function (only once) + if ( !self.keyPressedSet.has(key) ) + self.onKeyDown(key); + } + ); + + document.addEventListener( "keyup", + function(eventData) + { + let key = eventData.key; + if (key == " ") + key = "Space"; + if (key.length == 1) + key = key.toUpperCase(); + self.keyUpQueue.add( key ); + // activate callback function + self.onKeyUp(key); + } + ); + }; + + update() + { + // clear previous discrete event status + this.keyDownSet.clear(); + this.keyUpSet.clear(); + + // update current event status + for (let k of this.keyDownQueue) + { + // avoid multiple keydown events while holding key + if ( !this.keyPressedSet.has(k) ) + { + this.keyDownSet.add(k); + this.keyPressedSet.add(k); + } + } + + for (let k of this.keyUpQueue) + { + this.keyPressedSet.delete(k); + this.keyUpSet.add(k); + } + + // clear the queues used to store events + this.keyDownQueue.clear(); + this.keyUpQueue.clear(); + }; + + // only true for a single frame after key down + isKeyDown( keyName ) + { + return ( this.keyDownSet.has(keyName) ); + }; + + // true between key down and key up events + isKeyPressed( keyName ) + { + return ( this.keyPressedSet.has(keyName) ); + }; + + // only true for a single frame after key up + isKeyUp( keyName ) + { + return ( this.keyUpSet.has(keyName) ); + }; + + // set callback function + setOnKeyDown( callbackFunction ) + { + this.onKeyDown = callbackFunction; + }; + + // set callback function + setOnKeyUp( callbackFunction ) + { + this.onKeyUp = callbackFunction; + }; + +} diff --git a/1_Three.js/6_AR/js/stats.min.js b/1_Three.js/6_AR/js/stats.min.js new file mode 100755 index 0000000000000000000000000000000000000000..ef000cf4a9ab3b21369da0fe2be3881650127acb --- /dev/null +++ b/1_Three.js/6_AR/js/stats.min.js @@ -0,0 +1,5 @@ +// stats.js - http://github.com/mrdoob/stats.js +var Stats=function(){function h(a){c.appendChild(a.dom);return a}function k(a){for(var d=0;d<c.children.length;d++)c.children[d].style.display=d===a?"block":"none";l=a}var l=0,c=document.createElement("div");c.style.cssText="position:fixed;top:0;left:0;cursor:pointer;opacity:0.9;z-index:10000";c.addEventListener("click",function(a){a.preventDefault();k(++l%c.children.length)},!1);var g=(performance||Date).now(),e=g,a=0,r=h(new Stats.Panel("FPS","#0ff","#002")),f=h(new Stats.Panel("MS","#0f0","#020")); +if(self.performance&&self.performance.memory)var t=h(new Stats.Panel("MB","#f08","#201"));k(0);return{REVISION:16,dom:c,addPanel:h,showPanel:k,begin:function(){g=(performance||Date).now()},end:function(){a++;var c=(performance||Date).now();f.update(c-g,200);if(c>e+1E3&&(r.update(1E3*a/(c-e),100),e=c,a=0,t)){var d=performance.memory;t.update(d.usedJSHeapSize/1048576,d.jsHeapSizeLimit/1048576)}return c},update:function(){g=this.end()},domElement:c,setMode:k}}; +Stats.Panel=function(h,k,l){var c=Infinity,g=0,e=Math.round,a=e(window.devicePixelRatio||1),r=80*a,f=48*a,t=3*a,u=2*a,d=3*a,m=15*a,n=74*a,p=30*a,q=document.createElement("canvas");q.width=r;q.height=f;q.style.cssText="width:80px;height:48px";var b=q.getContext("2d");b.font="bold "+9*a+"px Helvetica,Arial,sans-serif";b.textBaseline="top";b.fillStyle=l;b.fillRect(0,0,r,f);b.fillStyle=k;b.fillText(h,t,u);b.fillRect(d,m,n,p);b.fillStyle=l;b.globalAlpha=.9;b.fillRect(d,m,n,p);return{dom:q,update:function(f, +v){c=Math.min(c,f);g=Math.max(g,f);b.fillStyle=l;b.globalAlpha=1;b.fillRect(0,0,r,m);b.fillStyle=k;b.fillText(e(f)+" "+h+" ("+e(c)+"-"+e(g)+")",t,u);b.drawImage(q,d+a,m,n-a,p,d,m,n-a,p);b.fillRect(d+n-a,m,a,p);b.fillStyle=l;b.globalAlpha=.9;b.fillRect(d+n-a,m,a,e((1-f/v)*p))}}};"object"===typeof module&&(module.exports=Stats); diff --git a/1_Three.js/6_AR/js/three.js b/1_Three.js/6_AR/js/three.js new file mode 100755 index 0000000000000000000000000000000000000000..aa81ee531874c44873e6fd512f1d38923811966b --- /dev/null +++ b/1_Three.js/6_AR/js/three.js @@ -0,0 +1,44110 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (factory((global.THREE = global.THREE || {}))); +}(this, (function (exports) { 'use strict'; + + // Polyfills + + if ( Number.EPSILON === undefined ) { + + Number.EPSILON = Math.pow( 2, - 52 ); + + } + + if ( Number.isInteger === undefined ) { + + // Missing in IE + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger + + Number.isInteger = function ( value ) { + + return typeof value === 'number' && isFinite( value ) && Math.floor( value ) === value; + + }; + + } + + // + + if ( Math.sign === undefined ) { + + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sign + + Math.sign = function ( x ) { + + return ( x < 0 ) ? - 1 : ( x > 0 ) ? 1 : + x; + + }; + + } + + if ( Function.prototype.name === undefined ) { + + // Missing in IE + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name + + Object.defineProperty( Function.prototype, 'name', { + + get: function () { + + return this.toString().match( /^\s*function\s*([^\(\s]*)/ )[ 1 ]; + + } + + } ); + + } + + if ( Object.assign === undefined ) { + + // Missing in IE + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign + + ( function () { + + Object.assign = function ( target ) { + + 'use strict'; + + if ( target === undefined || target === null ) { + + throw new TypeError( 'Cannot convert undefined or null to object' ); + + } + + var output = Object( target ); + + for ( var index = 1; index < arguments.length; index ++ ) { + + var source = arguments[ index ]; + + if ( source !== undefined && source !== null ) { + + for ( var nextKey in source ) { + + if ( Object.prototype.hasOwnProperty.call( source, nextKey ) ) { + + output[ nextKey ] = source[ nextKey ]; + + } + + } + + } + + } + + return output; + + }; + + } )(); + + } + + /** + * https://github.com/mrdoob/eventdispatcher.js/ + */ + + function EventDispatcher() {} + + Object.assign( EventDispatcher.prototype, { + + addEventListener: function ( type, listener ) { + + if ( this._listeners === undefined ) this._listeners = {}; + + var listeners = this._listeners; + + if ( listeners[ type ] === undefined ) { + + listeners[ type ] = []; + + } + + if ( listeners[ type ].indexOf( listener ) === - 1 ) { + + listeners[ type ].push( listener ); + + } + + }, + + hasEventListener: function ( type, listener ) { + + if ( this._listeners === undefined ) return false; + + var listeners = this._listeners; + + return listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1; + + }, + + removeEventListener: function ( type, listener ) { + + if ( this._listeners === undefined ) return; + + var listeners = this._listeners; + var listenerArray = listeners[ type ]; + + if ( listenerArray !== undefined ) { + + var index = listenerArray.indexOf( listener ); + + if ( index !== - 1 ) { + + listenerArray.splice( index, 1 ); + + } + + } + + }, + + dispatchEvent: function ( event ) { + + if ( this._listeners === undefined ) return; + + var listeners = this._listeners; + var listenerArray = listeners[ event.type ]; + + if ( listenerArray !== undefined ) { + + event.target = this; + + var array = listenerArray.slice( 0 ); + + for ( var i = 0, l = array.length; i < l; i ++ ) { + + array[ i ].call( this, event ); + + } + + } + + } + + } ); + + var REVISION = '86'; + var MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2 }; + var CullFaceNone = 0; + var CullFaceBack = 1; + var CullFaceFront = 2; + var CullFaceFrontBack = 3; + var FrontFaceDirectionCW = 0; + var FrontFaceDirectionCCW = 1; + var BasicShadowMap = 0; + var PCFShadowMap = 1; + var PCFSoftShadowMap = 2; + var FrontSide = 0; + var BackSide = 1; + var DoubleSide = 2; + var FlatShading = 1; + var SmoothShading = 2; + var NoColors = 0; + var FaceColors = 1; + var VertexColors = 2; + var NoBlending = 0; + var NormalBlending = 1; + var AdditiveBlending = 2; + var SubtractiveBlending = 3; + var MultiplyBlending = 4; + var CustomBlending = 5; + var AddEquation = 100; + var SubtractEquation = 101; + var ReverseSubtractEquation = 102; + var MinEquation = 103; + var MaxEquation = 104; + var ZeroFactor = 200; + var OneFactor = 201; + var SrcColorFactor = 202; + var OneMinusSrcColorFactor = 203; + var SrcAlphaFactor = 204; + var OneMinusSrcAlphaFactor = 205; + var DstAlphaFactor = 206; + var OneMinusDstAlphaFactor = 207; + var DstColorFactor = 208; + var OneMinusDstColorFactor = 209; + var SrcAlphaSaturateFactor = 210; + var NeverDepth = 0; + var AlwaysDepth = 1; + var LessDepth = 2; + var LessEqualDepth = 3; + var EqualDepth = 4; + var GreaterEqualDepth = 5; + var GreaterDepth = 6; + var NotEqualDepth = 7; + var MultiplyOperation = 0; + var MixOperation = 1; + var AddOperation = 2; + var NoToneMapping = 0; + var LinearToneMapping = 1; + var ReinhardToneMapping = 2; + var Uncharted2ToneMapping = 3; + var CineonToneMapping = 4; + var UVMapping = 300; + var CubeReflectionMapping = 301; + var CubeRefractionMapping = 302; + var EquirectangularReflectionMapping = 303; + var EquirectangularRefractionMapping = 304; + var SphericalReflectionMapping = 305; + var CubeUVReflectionMapping = 306; + var CubeUVRefractionMapping = 307; + var RepeatWrapping = 1000; + var ClampToEdgeWrapping = 1001; + var MirroredRepeatWrapping = 1002; + var NearestFilter = 1003; + var NearestMipMapNearestFilter = 1004; + var NearestMipMapLinearFilter = 1005; + var LinearFilter = 1006; + var LinearMipMapNearestFilter = 1007; + var LinearMipMapLinearFilter = 1008; + var UnsignedByteType = 1009; + var ByteType = 1010; + var ShortType = 1011; + var UnsignedShortType = 1012; + var IntType = 1013; + var UnsignedIntType = 1014; + var FloatType = 1015; + var HalfFloatType = 1016; + var UnsignedShort4444Type = 1017; + var UnsignedShort5551Type = 1018; + var UnsignedShort565Type = 1019; + var UnsignedInt248Type = 1020; + var AlphaFormat = 1021; + var RGBFormat = 1022; + var RGBAFormat = 1023; + var LuminanceFormat = 1024; + var LuminanceAlphaFormat = 1025; + var RGBEFormat = RGBAFormat; + var DepthFormat = 1026; + var DepthStencilFormat = 1027; + var RGB_S3TC_DXT1_Format = 2001; + var RGBA_S3TC_DXT1_Format = 2002; + var RGBA_S3TC_DXT3_Format = 2003; + var RGBA_S3TC_DXT5_Format = 2004; + var RGB_PVRTC_4BPPV1_Format = 2100; + var RGB_PVRTC_2BPPV1_Format = 2101; + var RGBA_PVRTC_4BPPV1_Format = 2102; + var RGBA_PVRTC_2BPPV1_Format = 2103; + var RGB_ETC1_Format = 2151; + var LoopOnce = 2200; + var LoopRepeat = 2201; + var LoopPingPong = 2202; + var InterpolateDiscrete = 2300; + var InterpolateLinear = 2301; + var InterpolateSmooth = 2302; + var ZeroCurvatureEnding = 2400; + var ZeroSlopeEnding = 2401; + var WrapAroundEnding = 2402; + var TrianglesDrawMode = 0; + var TriangleStripDrawMode = 1; + var TriangleFanDrawMode = 2; + var LinearEncoding = 3000; + var sRGBEncoding = 3001; + var GammaEncoding = 3007; + var RGBEEncoding = 3002; + var LogLuvEncoding = 3003; + var RGBM7Encoding = 3004; + var RGBM16Encoding = 3005; + var RGBDEncoding = 3006; + var BasicDepthPacking = 3200; + var RGBADepthPacking = 3201; + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + var _Math = { + + DEG2RAD: Math.PI / 180, + RAD2DEG: 180 / Math.PI, + + generateUUID: function () { + + // http://www.broofa.com/Tools/Math.uuid.htm + + var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split( '' ); + var uuid = new Array( 36 ); + var rnd = 0, r; + + return function generateUUID() { + + for ( var i = 0; i < 36; i ++ ) { + + if ( i === 8 || i === 13 || i === 18 || i === 23 ) { + + uuid[ i ] = '-'; + + } else if ( i === 14 ) { + + uuid[ i ] = '4'; + + } else { + + if ( rnd <= 0x02 ) rnd = 0x2000000 + ( Math.random() * 0x1000000 ) | 0; + r = rnd & 0xf; + rnd = rnd >> 4; + uuid[ i ] = chars[ ( i === 19 ) ? ( r & 0x3 ) | 0x8 : r ]; + + } + + } + + return uuid.join( '' ); + + }; + + }(), + + clamp: function ( value, min, max ) { + + return Math.max( min, Math.min( max, value ) ); + + }, + + // compute euclidian modulo of m % n + // https://en.wikipedia.org/wiki/Modulo_operation + + euclideanModulo: function ( n, m ) { + + return ( ( n % m ) + m ) % m; + + }, + + // Linear mapping from range <a1, a2> to range <b1, b2> + + mapLinear: function ( x, a1, a2, b1, b2 ) { + + return b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 ); + + }, + + // https://en.wikipedia.org/wiki/Linear_interpolation + + lerp: function ( x, y, t ) { + + return ( 1 - t ) * x + t * y; + + }, + + // http://en.wikipedia.org/wiki/Smoothstep + + smoothstep: function ( x, min, max ) { + + if ( x <= min ) return 0; + if ( x >= max ) return 1; + + x = ( x - min ) / ( max - min ); + + return x * x * ( 3 - 2 * x ); + + }, + + smootherstep: function ( x, min, max ) { + + if ( x <= min ) return 0; + if ( x >= max ) return 1; + + x = ( x - min ) / ( max - min ); + + return x * x * x * ( x * ( x * 6 - 15 ) + 10 ); + + }, + + // Random integer from <low, high> interval + + randInt: function ( low, high ) { + + return low + Math.floor( Math.random() * ( high - low + 1 ) ); + + }, + + // Random float from <low, high> interval + + randFloat: function ( low, high ) { + + return low + Math.random() * ( high - low ); + + }, + + // Random float from <-range/2, range/2> interval + + randFloatSpread: function ( range ) { + + return range * ( 0.5 - Math.random() ); + + }, + + degToRad: function ( degrees ) { + + return degrees * _Math.DEG2RAD; + + }, + + radToDeg: function ( radians ) { + + return radians * _Math.RAD2DEG; + + }, + + isPowerOfTwo: function ( value ) { + + return ( value & ( value - 1 ) ) === 0 && value !== 0; + + }, + + nearestPowerOfTwo: function ( value ) { + + return Math.pow( 2, Math.round( Math.log( value ) / Math.LN2 ) ); + + }, + + nextPowerOfTwo: function ( value ) { + + value --; + value |= value >> 1; + value |= value >> 2; + value |= value >> 4; + value |= value >> 8; + value |= value >> 16; + value ++; + + return value; + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author philogb / http://blog.thejit.org/ + * @author egraether / http://egraether.com/ + * @author zz85 / http://www.lab4games.net/zz85/blog + */ + + function Vector2( x, y ) { + + this.x = x || 0; + this.y = y || 0; + + } + + Object.defineProperties( Vector2.prototype, { + + "width" : { + + get: function () { + + return this.x; + + }, + + set: function ( value ) { + + this.x = value; + + } + + }, + + "height" : { + + get: function () { + + return this.y; + + }, + + set: function ( value ) { + + this.y = value; + + } + + } + + } ); + + Object.assign( Vector2.prototype, { + + isVector2: true, + + set: function ( x, y ) { + + this.x = x; + this.y = y; + + return this; + + }, + + setScalar: function ( scalar ) { + + this.x = scalar; + this.y = scalar; + + return this; + + }, + + setX: function ( x ) { + + this.x = x; + + return this; + + }, + + setY: function ( y ) { + + this.y = y; + + return this; + + }, + + setComponent: function ( index, value ) { + + switch ( index ) { + + case 0: this.x = value; break; + case 1: this.y = value; break; + default: throw new Error( 'index is out of range: ' + index ); + + } + + return this; + + }, + + getComponent: function ( index ) { + + switch ( index ) { + + case 0: return this.x; + case 1: return this.y; + default: throw new Error( 'index is out of range: ' + index ); + + } + + }, + + clone: function () { + + return new this.constructor( this.x, this.y ); + + }, + + copy: function ( v ) { + + this.x = v.x; + this.y = v.y; + + return this; + + }, + + add: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ); + return this.addVectors( v, w ); + + } + + this.x += v.x; + this.y += v.y; + + return this; + + }, + + addScalar: function ( s ) { + + this.x += s; + this.y += s; + + return this; + + }, + + addVectors: function ( a, b ) { + + this.x = a.x + b.x; + this.y = a.y + b.y; + + return this; + + }, + + addScaledVector: function ( v, s ) { + + this.x += v.x * s; + this.y += v.y * s; + + return this; + + }, + + sub: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ); + return this.subVectors( v, w ); + + } + + this.x -= v.x; + this.y -= v.y; + + return this; + + }, + + subScalar: function ( s ) { + + this.x -= s; + this.y -= s; + + return this; + + }, + + subVectors: function ( a, b ) { + + this.x = a.x - b.x; + this.y = a.y - b.y; + + return this; + + }, + + multiply: function ( v ) { + + this.x *= v.x; + this.y *= v.y; + + return this; + + }, + + multiplyScalar: function ( scalar ) { + + this.x *= scalar; + this.y *= scalar; + + return this; + + }, + + divide: function ( v ) { + + this.x /= v.x; + this.y /= v.y; + + return this; + + }, + + divideScalar: function ( scalar ) { + + return this.multiplyScalar( 1 / scalar ); + + }, + + min: function ( v ) { + + this.x = Math.min( this.x, v.x ); + this.y = Math.min( this.y, v.y ); + + return this; + + }, + + max: function ( v ) { + + this.x = Math.max( this.x, v.x ); + this.y = Math.max( this.y, v.y ); + + return this; + + }, + + clamp: function ( min, max ) { + + // assumes min < max, componentwise + + this.x = Math.max( min.x, Math.min( max.x, this.x ) ); + this.y = Math.max( min.y, Math.min( max.y, this.y ) ); + + return this; + + }, + + clampScalar: function () { + + var min = new Vector2(); + var max = new Vector2(); + + return function clampScalar( minVal, maxVal ) { + + min.set( minVal, minVal ); + max.set( maxVal, maxVal ); + + return this.clamp( min, max ); + + }; + + }(), + + clampLength: function ( min, max ) { + + var length = this.length(); + + return this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) ); + + }, + + floor: function () { + + this.x = Math.floor( this.x ); + this.y = Math.floor( this.y ); + + return this; + + }, + + ceil: function () { + + this.x = Math.ceil( this.x ); + this.y = Math.ceil( this.y ); + + return this; + + }, + + round: function () { + + this.x = Math.round( this.x ); + this.y = Math.round( this.y ); + + return this; + + }, + + roundToZero: function () { + + this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x ); + this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y ); + + return this; + + }, + + negate: function () { + + this.x = - this.x; + this.y = - this.y; + + return this; + + }, + + dot: function ( v ) { + + return this.x * v.x + this.y * v.y; + + }, + + lengthSq: function () { + + return this.x * this.x + this.y * this.y; + + }, + + length: function () { + + return Math.sqrt( this.x * this.x + this.y * this.y ); + + }, + + lengthManhattan: function() { + + return Math.abs( this.x ) + Math.abs( this.y ); + + }, + + normalize: function () { + + return this.divideScalar( this.length() || 1 ); + + }, + + angle: function () { + + // computes the angle in radians with respect to the positive x-axis + + var angle = Math.atan2( this.y, this.x ); + + if ( angle < 0 ) angle += 2 * Math.PI; + + return angle; + + }, + + distanceTo: function ( v ) { + + return Math.sqrt( this.distanceToSquared( v ) ); + + }, + + distanceToSquared: function ( v ) { + + var dx = this.x - v.x, dy = this.y - v.y; + return dx * dx + dy * dy; + + }, + + distanceToManhattan: function ( v ) { + + return Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ); + + }, + + setLength: function ( length ) { + + return this.normalize().multiplyScalar( length ); + + }, + + lerp: function ( v, alpha ) { + + this.x += ( v.x - this.x ) * alpha; + this.y += ( v.y - this.y ) * alpha; + + return this; + + }, + + lerpVectors: function ( v1, v2, alpha ) { + + return this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 ); + + }, + + equals: function ( v ) { + + return ( ( v.x === this.x ) && ( v.y === this.y ) ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.x = array[ offset ]; + this.y = array[ offset + 1 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.x; + array[ offset + 1 ] = this.y; + + return array; + + }, + + fromBufferAttribute: function ( attribute, index, offset ) { + + if ( offset !== undefined ) { + + console.warn( 'THREE.Vector2: offset has been removed from .fromBufferAttribute().' ); + + } + + this.x = attribute.getX( index ); + this.y = attribute.getY( index ); + + return this; + + }, + + rotateAround: function ( center, angle ) { + + var c = Math.cos( angle ), s = Math.sin( angle ); + + var x = this.x - center.x; + var y = this.y - center.y; + + this.x = x * c - y * s + center.x; + this.y = x * s + y * c + center.y; + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author szimek / https://github.com/szimek/ + */ + + var textureId = 0; + + function Texture( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) { + + Object.defineProperty( this, 'id', { value: textureId ++ } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + + this.image = image !== undefined ? image : Texture.DEFAULT_IMAGE; + this.mipmaps = []; + + this.mapping = mapping !== undefined ? mapping : Texture.DEFAULT_MAPPING; + + this.wrapS = wrapS !== undefined ? wrapS : ClampToEdgeWrapping; + this.wrapT = wrapT !== undefined ? wrapT : ClampToEdgeWrapping; + + this.magFilter = magFilter !== undefined ? magFilter : LinearFilter; + this.minFilter = minFilter !== undefined ? minFilter : LinearMipMapLinearFilter; + + this.anisotropy = anisotropy !== undefined ? anisotropy : 1; + + this.format = format !== undefined ? format : RGBAFormat; + this.type = type !== undefined ? type : UnsignedByteType; + + this.offset = new Vector2( 0, 0 ); + this.repeat = new Vector2( 1, 1 ); + + this.generateMipmaps = true; + this.premultiplyAlpha = false; + this.flipY = true; + this.unpackAlignment = 4; // valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml) + + // Values of encoding !== THREE.LinearEncoding only supported on map, envMap and emissiveMap. + // + // Also changing the encoding after already used by a Material will not automatically make the Material + // update. You need to explicitly call Material.needsUpdate to trigger it to recompile. + this.encoding = encoding !== undefined ? encoding : LinearEncoding; + + this.version = 0; + this.onUpdate = null; + + } + + Texture.DEFAULT_IMAGE = undefined; + Texture.DEFAULT_MAPPING = UVMapping; + + Object.defineProperty( Texture.prototype, "needsUpdate", { + + set: function ( value ) { + + if ( value === true ) this.version ++; + + } + + } ); + + Object.assign( Texture.prototype, EventDispatcher.prototype, { + + constructor: Texture, + + isTexture: true, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.name = source.name; + + this.image = source.image; + this.mipmaps = source.mipmaps.slice( 0 ); + + this.mapping = source.mapping; + + this.wrapS = source.wrapS; + this.wrapT = source.wrapT; + + this.magFilter = source.magFilter; + this.minFilter = source.minFilter; + + this.anisotropy = source.anisotropy; + + this.format = source.format; + this.type = source.type; + + this.offset.copy( source.offset ); + this.repeat.copy( source.repeat ); + + this.generateMipmaps = source.generateMipmaps; + this.premultiplyAlpha = source.premultiplyAlpha; + this.flipY = source.flipY; + this.unpackAlignment = source.unpackAlignment; + this.encoding = source.encoding; + + return this; + + }, + + toJSON: function ( meta ) { + + if ( meta.textures[ this.uuid ] !== undefined ) { + + return meta.textures[ this.uuid ]; + + } + + function getDataURL( image ) { + + var canvas; + + if ( image.toDataURL !== undefined ) { + + canvas = image; + + } else { + + canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); + canvas.width = image.width; + canvas.height = image.height; + + canvas.getContext( '2d' ).drawImage( image, 0, 0, image.width, image.height ); + + } + + if ( canvas.width > 2048 || canvas.height > 2048 ) { + + return canvas.toDataURL( 'image/jpeg', 0.6 ); + + } else { + + return canvas.toDataURL( 'image/png' ); + + } + + } + + var output = { + metadata: { + version: 4.5, + type: 'Texture', + generator: 'Texture.toJSON' + }, + + uuid: this.uuid, + name: this.name, + + mapping: this.mapping, + + repeat: [ this.repeat.x, this.repeat.y ], + offset: [ this.offset.x, this.offset.y ], + wrap: [ this.wrapS, this.wrapT ], + + minFilter: this.minFilter, + magFilter: this.magFilter, + anisotropy: this.anisotropy, + + flipY: this.flipY + }; + + if ( this.image !== undefined ) { + + // TODO: Move to THREE.Image + + var image = this.image; + + if ( image.uuid === undefined ) { + + image.uuid = _Math.generateUUID(); // UGH + + } + + if ( meta.images[ image.uuid ] === undefined ) { + + meta.images[ image.uuid ] = { + uuid: image.uuid, + url: getDataURL( image ) + }; + + } + + output.image = image.uuid; + + } + + meta.textures[ this.uuid ] = output; + + return output; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + }, + + transformUv: function ( uv ) { + + if ( this.mapping !== UVMapping ) return; + + uv.multiply( this.repeat ); + uv.add( this.offset ); + + if ( uv.x < 0 || uv.x > 1 ) { + + switch ( this.wrapS ) { + + case RepeatWrapping: + + uv.x = uv.x - Math.floor( uv.x ); + break; + + case ClampToEdgeWrapping: + + uv.x = uv.x < 0 ? 0 : 1; + break; + + case MirroredRepeatWrapping: + + if ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) { + + uv.x = Math.ceil( uv.x ) - uv.x; + + } else { + + uv.x = uv.x - Math.floor( uv.x ); + + } + break; + + } + + } + + if ( uv.y < 0 || uv.y > 1 ) { + + switch ( this.wrapT ) { + + case RepeatWrapping: + + uv.y = uv.y - Math.floor( uv.y ); + break; + + case ClampToEdgeWrapping: + + uv.y = uv.y < 0 ? 0 : 1; + break; + + case MirroredRepeatWrapping: + + if ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) { + + uv.y = Math.ceil( uv.y ) - uv.y; + + } else { + + uv.y = uv.y - Math.floor( uv.y ); + + } + break; + + } + + } + + if ( this.flipY ) { + + uv.y = 1 - uv.y; + + } + + } + + } ); + + /** + * @author supereggbert / http://www.paulbrunt.co.uk/ + * @author philogb / http://blog.thejit.org/ + * @author mikael emtinger / http://gomo.se/ + * @author egraether / http://egraether.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function Vector4( x, y, z, w ) { + + this.x = x || 0; + this.y = y || 0; + this.z = z || 0; + this.w = ( w !== undefined ) ? w : 1; + + } + + Object.assign( Vector4.prototype, { + + isVector4: true, + + set: function ( x, y, z, w ) { + + this.x = x; + this.y = y; + this.z = z; + this.w = w; + + return this; + + }, + + setScalar: function ( scalar ) { + + this.x = scalar; + this.y = scalar; + this.z = scalar; + this.w = scalar; + + return this; + + }, + + setX: function ( x ) { + + this.x = x; + + return this; + + }, + + setY: function ( y ) { + + this.y = y; + + return this; + + }, + + setZ: function ( z ) { + + this.z = z; + + return this; + + }, + + setW: function ( w ) { + + this.w = w; + + return this; + + }, + + setComponent: function ( index, value ) { + + switch ( index ) { + + case 0: this.x = value; break; + case 1: this.y = value; break; + case 2: this.z = value; break; + case 3: this.w = value; break; + default: throw new Error( 'index is out of range: ' + index ); + + } + + return this; + + }, + + getComponent: function ( index ) { + + switch ( index ) { + + case 0: return this.x; + case 1: return this.y; + case 2: return this.z; + case 3: return this.w; + default: throw new Error( 'index is out of range: ' + index ); + + } + + }, + + clone: function () { + + return new this.constructor( this.x, this.y, this.z, this.w ); + + }, + + copy: function ( v ) { + + this.x = v.x; + this.y = v.y; + this.z = v.z; + this.w = ( v.w !== undefined ) ? v.w : 1; + + return this; + + }, + + add: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ); + return this.addVectors( v, w ); + + } + + this.x += v.x; + this.y += v.y; + this.z += v.z; + this.w += v.w; + + return this; + + }, + + addScalar: function ( s ) { + + this.x += s; + this.y += s; + this.z += s; + this.w += s; + + return this; + + }, + + addVectors: function ( a, b ) { + + this.x = a.x + b.x; + this.y = a.y + b.y; + this.z = a.z + b.z; + this.w = a.w + b.w; + + return this; + + }, + + addScaledVector: function ( v, s ) { + + this.x += v.x * s; + this.y += v.y * s; + this.z += v.z * s; + this.w += v.w * s; + + return this; + + }, + + sub: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ); + return this.subVectors( v, w ); + + } + + this.x -= v.x; + this.y -= v.y; + this.z -= v.z; + this.w -= v.w; + + return this; + + }, + + subScalar: function ( s ) { + + this.x -= s; + this.y -= s; + this.z -= s; + this.w -= s; + + return this; + + }, + + subVectors: function ( a, b ) { + + this.x = a.x - b.x; + this.y = a.y - b.y; + this.z = a.z - b.z; + this.w = a.w - b.w; + + return this; + + }, + + multiplyScalar: function ( scalar ) { + + this.x *= scalar; + this.y *= scalar; + this.z *= scalar; + this.w *= scalar; + + return this; + + }, + + applyMatrix4: function ( m ) { + + var x = this.x, y = this.y, z = this.z, w = this.w; + var e = m.elements; + + this.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w; + this.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w; + this.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w; + this.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w; + + return this; + + }, + + divideScalar: function ( scalar ) { + + return this.multiplyScalar( 1 / scalar ); + + }, + + setAxisAngleFromQuaternion: function ( q ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm + + // q is assumed to be normalized + + this.w = 2 * Math.acos( q.w ); + + var s = Math.sqrt( 1 - q.w * q.w ); + + if ( s < 0.0001 ) { + + this.x = 1; + this.y = 0; + this.z = 0; + + } else { + + this.x = q.x / s; + this.y = q.y / s; + this.z = q.z / s; + + } + + return this; + + }, + + setAxisAngleFromRotationMatrix: function ( m ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + var angle, x, y, z, // variables for result + epsilon = 0.01, // margin to allow for rounding errors + epsilon2 = 0.1, // margin to distinguish between 0 and 180 degrees + + te = m.elements, + + m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ], + m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ], + m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ]; + + if ( ( Math.abs( m12 - m21 ) < epsilon ) && + ( Math.abs( m13 - m31 ) < epsilon ) && + ( Math.abs( m23 - m32 ) < epsilon ) ) { + + // singularity found + // first check for identity matrix which must have +1 for all terms + // in leading diagonal and zero in other terms + + if ( ( Math.abs( m12 + m21 ) < epsilon2 ) && + ( Math.abs( m13 + m31 ) < epsilon2 ) && + ( Math.abs( m23 + m32 ) < epsilon2 ) && + ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) { + + // this singularity is identity matrix so angle = 0 + + this.set( 1, 0, 0, 0 ); + + return this; // zero angle, arbitrary axis + + } + + // otherwise this singularity is angle = 180 + + angle = Math.PI; + + var xx = ( m11 + 1 ) / 2; + var yy = ( m22 + 1 ) / 2; + var zz = ( m33 + 1 ) / 2; + var xy = ( m12 + m21 ) / 4; + var xz = ( m13 + m31 ) / 4; + var yz = ( m23 + m32 ) / 4; + + if ( ( xx > yy ) && ( xx > zz ) ) { + + // m11 is the largest diagonal term + + if ( xx < epsilon ) { + + x = 0; + y = 0.707106781; + z = 0.707106781; + + } else { + + x = Math.sqrt( xx ); + y = xy / x; + z = xz / x; + + } + + } else if ( yy > zz ) { + + // m22 is the largest diagonal term + + if ( yy < epsilon ) { + + x = 0.707106781; + y = 0; + z = 0.707106781; + + } else { + + y = Math.sqrt( yy ); + x = xy / y; + z = yz / y; + + } + + } else { + + // m33 is the largest diagonal term so base result on this + + if ( zz < epsilon ) { + + x = 0.707106781; + y = 0.707106781; + z = 0; + + } else { + + z = Math.sqrt( zz ); + x = xz / z; + y = yz / z; + + } + + } + + this.set( x, y, z, angle ); + + return this; // return 180 deg rotation + + } + + // as we have reached here there are no singularities so we can handle normally + + var s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) + + ( m13 - m31 ) * ( m13 - m31 ) + + ( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize + + if ( Math.abs( s ) < 0.001 ) s = 1; + + // prevent divide by zero, should not happen if matrix is orthogonal and should be + // caught by singularity test above, but I've left it in just in case + + this.x = ( m32 - m23 ) / s; + this.y = ( m13 - m31 ) / s; + this.z = ( m21 - m12 ) / s; + this.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 ); + + return this; + + }, + + min: function ( v ) { + + this.x = Math.min( this.x, v.x ); + this.y = Math.min( this.y, v.y ); + this.z = Math.min( this.z, v.z ); + this.w = Math.min( this.w, v.w ); + + return this; + + }, + + max: function ( v ) { + + this.x = Math.max( this.x, v.x ); + this.y = Math.max( this.y, v.y ); + this.z = Math.max( this.z, v.z ); + this.w = Math.max( this.w, v.w ); + + return this; + + }, + + clamp: function ( min, max ) { + + // assumes min < max, componentwise + + this.x = Math.max( min.x, Math.min( max.x, this.x ) ); + this.y = Math.max( min.y, Math.min( max.y, this.y ) ); + this.z = Math.max( min.z, Math.min( max.z, this.z ) ); + this.w = Math.max( min.w, Math.min( max.w, this.w ) ); + + return this; + + }, + + clampScalar: function () { + + var min, max; + + return function clampScalar( minVal, maxVal ) { + + if ( min === undefined ) { + + min = new Vector4(); + max = new Vector4(); + + } + + min.set( minVal, minVal, minVal, minVal ); + max.set( maxVal, maxVal, maxVal, maxVal ); + + return this.clamp( min, max ); + + }; + + }(), + + clampLength: function ( min, max ) { + + var length = this.length(); + + return this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) ); + + }, + + floor: function () { + + this.x = Math.floor( this.x ); + this.y = Math.floor( this.y ); + this.z = Math.floor( this.z ); + this.w = Math.floor( this.w ); + + return this; + + }, + + ceil: function () { + + this.x = Math.ceil( this.x ); + this.y = Math.ceil( this.y ); + this.z = Math.ceil( this.z ); + this.w = Math.ceil( this.w ); + + return this; + + }, + + round: function () { + + this.x = Math.round( this.x ); + this.y = Math.round( this.y ); + this.z = Math.round( this.z ); + this.w = Math.round( this.w ); + + return this; + + }, + + roundToZero: function () { + + this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x ); + this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y ); + this.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z ); + this.w = ( this.w < 0 ) ? Math.ceil( this.w ) : Math.floor( this.w ); + + return this; + + }, + + negate: function () { + + this.x = - this.x; + this.y = - this.y; + this.z = - this.z; + this.w = - this.w; + + return this; + + }, + + dot: function ( v ) { + + return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w; + + }, + + lengthSq: function () { + + return this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w; + + }, + + length: function () { + + return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w ); + + }, + + lengthManhattan: function () { + + return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w ); + + }, + + normalize: function () { + + return this.divideScalar( this.length() || 1 ); + + }, + + setLength: function ( length ) { + + return this.normalize().multiplyScalar( length ); + + }, + + lerp: function ( v, alpha ) { + + this.x += ( v.x - this.x ) * alpha; + this.y += ( v.y - this.y ) * alpha; + this.z += ( v.z - this.z ) * alpha; + this.w += ( v.w - this.w ) * alpha; + + return this; + + }, + + lerpVectors: function ( v1, v2, alpha ) { + + return this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 ); + + }, + + equals: function ( v ) { + + return ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.x = array[ offset ]; + this.y = array[ offset + 1 ]; + this.z = array[ offset + 2 ]; + this.w = array[ offset + 3 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.x; + array[ offset + 1 ] = this.y; + array[ offset + 2 ] = this.z; + array[ offset + 3 ] = this.w; + + return array; + + }, + + fromBufferAttribute: function ( attribute, index, offset ) { + + if ( offset !== undefined ) { + + console.warn( 'THREE.Vector4: offset has been removed from .fromBufferAttribute().' ); + + } + + this.x = attribute.getX( index ); + this.y = attribute.getY( index ); + this.z = attribute.getZ( index ); + this.w = attribute.getW( index ); + + return this; + + } + + } ); + + /** + * @author szimek / https://github.com/szimek/ + * @author alteredq / http://alteredqualia.com/ + * @author Marius Kintel / https://github.com/kintel + */ + + /* + In options, we can specify: + * Texture parameters for an auto-generated target texture + * depthBuffer/stencilBuffer: Booleans to indicate if we should generate these buffers + */ + function WebGLRenderTarget( width, height, options ) { + + this.uuid = _Math.generateUUID(); + + this.width = width; + this.height = height; + + this.scissor = new Vector4( 0, 0, width, height ); + this.scissorTest = false; + + this.viewport = new Vector4( 0, 0, width, height ); + + options = options || {}; + + if ( options.minFilter === undefined ) options.minFilter = LinearFilter; + + this.texture = new Texture( undefined, undefined, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding ); + + this.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true; + this.stencilBuffer = options.stencilBuffer !== undefined ? options.stencilBuffer : true; + this.depthTexture = options.depthTexture !== undefined ? options.depthTexture : null; + + } + + Object.assign( WebGLRenderTarget.prototype, EventDispatcher.prototype, { + + isWebGLRenderTarget: true, + + setSize: function ( width, height ) { + + if ( this.width !== width || this.height !== height ) { + + this.width = width; + this.height = height; + + this.dispose(); + + } + + this.viewport.set( 0, 0, width, height ); + this.scissor.set( 0, 0, width, height ); + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.width = source.width; + this.height = source.height; + + this.viewport.copy( source.viewport ); + + this.texture = source.texture.clone(); + + this.depthBuffer = source.depthBuffer; + this.stencilBuffer = source.stencilBuffer; + this.depthTexture = source.depthTexture; + + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com + */ + + function WebGLRenderTargetCube( width, height, options ) { + + WebGLRenderTarget.call( this, width, height, options ); + + this.activeCubeFace = 0; // PX 0, NX 1, PY 2, NY 3, PZ 4, NZ 5 + this.activeMipMapLevel = 0; + + } + + WebGLRenderTargetCube.prototype = Object.create( WebGLRenderTarget.prototype ); + WebGLRenderTargetCube.prototype.constructor = WebGLRenderTargetCube; + + WebGLRenderTargetCube.prototype.isWebGLRenderTargetCube = true; + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author bhouston / http://clara.io + */ + + function Quaternion( x, y, z, w ) { + + this._x = x || 0; + this._y = y || 0; + this._z = z || 0; + this._w = ( w !== undefined ) ? w : 1; + + } + + Object.assign( Quaternion, { + + slerp: function ( qa, qb, qm, t ) { + + return qm.copy( qa ).slerp( qb, t ); + + }, + + slerpFlat: function ( dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) { + + // fuzz-free, array-based Quaternion SLERP operation + + var x0 = src0[ srcOffset0 + 0 ], + y0 = src0[ srcOffset0 + 1 ], + z0 = src0[ srcOffset0 + 2 ], + w0 = src0[ srcOffset0 + 3 ], + + x1 = src1[ srcOffset1 + 0 ], + y1 = src1[ srcOffset1 + 1 ], + z1 = src1[ srcOffset1 + 2 ], + w1 = src1[ srcOffset1 + 3 ]; + + if ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) { + + var s = 1 - t, + + cos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1, + + dir = ( cos >= 0 ? 1 : - 1 ), + sqrSin = 1 - cos * cos; + + // Skip the Slerp for tiny steps to avoid numeric problems: + if ( sqrSin > Number.EPSILON ) { + + var sin = Math.sqrt( sqrSin ), + len = Math.atan2( sin, cos * dir ); + + s = Math.sin( s * len ) / sin; + t = Math.sin( t * len ) / sin; + + } + + var tDir = t * dir; + + x0 = x0 * s + x1 * tDir; + y0 = y0 * s + y1 * tDir; + z0 = z0 * s + z1 * tDir; + w0 = w0 * s + w1 * tDir; + + // Normalize in case we just did a lerp: + if ( s === 1 - t ) { + + var f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 ); + + x0 *= f; + y0 *= f; + z0 *= f; + w0 *= f; + + } + + } + + dst[ dstOffset ] = x0; + dst[ dstOffset + 1 ] = y0; + dst[ dstOffset + 2 ] = z0; + dst[ dstOffset + 3 ] = w0; + + } + + } ); + + Object.defineProperties( Quaternion.prototype, { + + x: { + + get: function () { + + return this._x; + + }, + + set: function ( value ) { + + this._x = value; + this.onChangeCallback(); + + } + + }, + + y: { + + get: function () { + + return this._y; + + }, + + set: function ( value ) { + + this._y = value; + this.onChangeCallback(); + + } + + }, + + z: { + + get: function () { + + return this._z; + + }, + + set: function ( value ) { + + this._z = value; + this.onChangeCallback(); + + } + + }, + + w: { + + get: function () { + + return this._w; + + }, + + set: function ( value ) { + + this._w = value; + this.onChangeCallback(); + + } + + } + + } ); + + Object.assign( Quaternion.prototype, { + + set: function ( x, y, z, w ) { + + this._x = x; + this._y = y; + this._z = z; + this._w = w; + + this.onChangeCallback(); + + return this; + + }, + + clone: function () { + + return new this.constructor( this._x, this._y, this._z, this._w ); + + }, + + copy: function ( quaternion ) { + + this._x = quaternion.x; + this._y = quaternion.y; + this._z = quaternion.z; + this._w = quaternion.w; + + this.onChangeCallback(); + + return this; + + }, + + setFromEuler: function ( euler, update ) { + + if ( ! ( euler && euler.isEuler ) ) { + + throw new Error( 'THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.' ); + + } + + var x = euler._x, y = euler._y, z = euler._z, order = euler.order; + + // http://www.mathworks.com/matlabcentral/fileexchange/ + // 20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/ + // content/SpinCalc.m + + var cos = Math.cos; + var sin = Math.sin; + + var c1 = cos( x / 2 ); + var c2 = cos( y / 2 ); + var c3 = cos( z / 2 ); + + var s1 = sin( x / 2 ); + var s2 = sin( y / 2 ); + var s3 = sin( z / 2 ); + + if ( order === 'XYZ' ) { + + this._x = s1 * c2 * c3 + c1 * s2 * s3; + this._y = c1 * s2 * c3 - s1 * c2 * s3; + this._z = c1 * c2 * s3 + s1 * s2 * c3; + this._w = c1 * c2 * c3 - s1 * s2 * s3; + + } else if ( order === 'YXZ' ) { + + this._x = s1 * c2 * c3 + c1 * s2 * s3; + this._y = c1 * s2 * c3 - s1 * c2 * s3; + this._z = c1 * c2 * s3 - s1 * s2 * c3; + this._w = c1 * c2 * c3 + s1 * s2 * s3; + + } else if ( order === 'ZXY' ) { + + this._x = s1 * c2 * c3 - c1 * s2 * s3; + this._y = c1 * s2 * c3 + s1 * c2 * s3; + this._z = c1 * c2 * s3 + s1 * s2 * c3; + this._w = c1 * c2 * c3 - s1 * s2 * s3; + + } else if ( order === 'ZYX' ) { + + this._x = s1 * c2 * c3 - c1 * s2 * s3; + this._y = c1 * s2 * c3 + s1 * c2 * s3; + this._z = c1 * c2 * s3 - s1 * s2 * c3; + this._w = c1 * c2 * c3 + s1 * s2 * s3; + + } else if ( order === 'YZX' ) { + + this._x = s1 * c2 * c3 + c1 * s2 * s3; + this._y = c1 * s2 * c3 + s1 * c2 * s3; + this._z = c1 * c2 * s3 - s1 * s2 * c3; + this._w = c1 * c2 * c3 - s1 * s2 * s3; + + } else if ( order === 'XZY' ) { + + this._x = s1 * c2 * c3 - c1 * s2 * s3; + this._y = c1 * s2 * c3 - s1 * c2 * s3; + this._z = c1 * c2 * s3 + s1 * s2 * c3; + this._w = c1 * c2 * c3 + s1 * s2 * s3; + + } + + if ( update !== false ) this.onChangeCallback(); + + return this; + + }, + + setFromAxisAngle: function ( axis, angle ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm + + // assumes axis is normalized + + var halfAngle = angle / 2, s = Math.sin( halfAngle ); + + this._x = axis.x * s; + this._y = axis.y * s; + this._z = axis.z * s; + this._w = Math.cos( halfAngle ); + + this.onChangeCallback(); + + return this; + + }, + + setFromRotationMatrix: function ( m ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + var te = m.elements, + + m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ], + m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ], + m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ], + + trace = m11 + m22 + m33, + s; + + if ( trace > 0 ) { + + s = 0.5 / Math.sqrt( trace + 1.0 ); + + this._w = 0.25 / s; + this._x = ( m32 - m23 ) * s; + this._y = ( m13 - m31 ) * s; + this._z = ( m21 - m12 ) * s; + + } else if ( m11 > m22 && m11 > m33 ) { + + s = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 ); + + this._w = ( m32 - m23 ) / s; + this._x = 0.25 * s; + this._y = ( m12 + m21 ) / s; + this._z = ( m13 + m31 ) / s; + + } else if ( m22 > m33 ) { + + s = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 ); + + this._w = ( m13 - m31 ) / s; + this._x = ( m12 + m21 ) / s; + this._y = 0.25 * s; + this._z = ( m23 + m32 ) / s; + + } else { + + s = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 ); + + this._w = ( m21 - m12 ) / s; + this._x = ( m13 + m31 ) / s; + this._y = ( m23 + m32 ) / s; + this._z = 0.25 * s; + + } + + this.onChangeCallback(); + + return this; + + }, + + setFromUnitVectors: function () { + + // assumes direction vectors vFrom and vTo are normalized + + var v1 = new Vector3(); + var r; + + var EPS = 0.000001; + + return function setFromUnitVectors( vFrom, vTo ) { + + if ( v1 === undefined ) v1 = new Vector3(); + + r = vFrom.dot( vTo ) + 1; + + if ( r < EPS ) { + + r = 0; + + if ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) { + + v1.set( - vFrom.y, vFrom.x, 0 ); + + } else { + + v1.set( 0, - vFrom.z, vFrom.y ); + + } + + } else { + + v1.crossVectors( vFrom, vTo ); + + } + + this._x = v1.x; + this._y = v1.y; + this._z = v1.z; + this._w = r; + + return this.normalize(); + + }; + + }(), + + inverse: function () { + + return this.conjugate().normalize(); + + }, + + conjugate: function () { + + this._x *= - 1; + this._y *= - 1; + this._z *= - 1; + + this.onChangeCallback(); + + return this; + + }, + + dot: function ( v ) { + + return this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w; + + }, + + lengthSq: function () { + + return this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w; + + }, + + length: function () { + + return Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w ); + + }, + + normalize: function () { + + var l = this.length(); + + if ( l === 0 ) { + + this._x = 0; + this._y = 0; + this._z = 0; + this._w = 1; + + } else { + + l = 1 / l; + + this._x = this._x * l; + this._y = this._y * l; + this._z = this._z * l; + this._w = this._w * l; + + } + + this.onChangeCallback(); + + return this; + + }, + + multiply: function ( q, p ) { + + if ( p !== undefined ) { + + console.warn( 'THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.' ); + return this.multiplyQuaternions( q, p ); + + } + + return this.multiplyQuaternions( this, q ); + + }, + + premultiply: function ( q ) { + + return this.multiplyQuaternions( q, this ); + + }, + + multiplyQuaternions: function ( a, b ) { + + // from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm + + var qax = a._x, qay = a._y, qaz = a._z, qaw = a._w; + var qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w; + + this._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby; + this._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz; + this._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx; + this._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz; + + this.onChangeCallback(); + + return this; + + }, + + slerp: function ( qb, t ) { + + if ( t === 0 ) return this; + if ( t === 1 ) return this.copy( qb ); + + var x = this._x, y = this._y, z = this._z, w = this._w; + + // http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/ + + var cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z; + + if ( cosHalfTheta < 0 ) { + + this._w = - qb._w; + this._x = - qb._x; + this._y = - qb._y; + this._z = - qb._z; + + cosHalfTheta = - cosHalfTheta; + + } else { + + this.copy( qb ); + + } + + if ( cosHalfTheta >= 1.0 ) { + + this._w = w; + this._x = x; + this._y = y; + this._z = z; + + return this; + + } + + var sinHalfTheta = Math.sqrt( 1.0 - cosHalfTheta * cosHalfTheta ); + + if ( Math.abs( sinHalfTheta ) < 0.001 ) { + + this._w = 0.5 * ( w + this._w ); + this._x = 0.5 * ( x + this._x ); + this._y = 0.5 * ( y + this._y ); + this._z = 0.5 * ( z + this._z ); + + return this; + + } + + var halfTheta = Math.atan2( sinHalfTheta, cosHalfTheta ); + var ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta, + ratioB = Math.sin( t * halfTheta ) / sinHalfTheta; + + this._w = ( w * ratioA + this._w * ratioB ); + this._x = ( x * ratioA + this._x * ratioB ); + this._y = ( y * ratioA + this._y * ratioB ); + this._z = ( z * ratioA + this._z * ratioB ); + + this.onChangeCallback(); + + return this; + + }, + + equals: function ( quaternion ) { + + return ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this._x = array[ offset ]; + this._y = array[ offset + 1 ]; + this._z = array[ offset + 2 ]; + this._w = array[ offset + 3 ]; + + this.onChangeCallback(); + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this._x; + array[ offset + 1 ] = this._y; + array[ offset + 2 ] = this._z; + array[ offset + 3 ] = this._w; + + return array; + + }, + + onChange: function ( callback ) { + + this.onChangeCallback = callback; + + return this; + + }, + + onChangeCallback: function () {} + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author kile / http://kile.stravaganza.org/ + * @author philogb / http://blog.thejit.org/ + * @author mikael emtinger / http://gomo.se/ + * @author egraether / http://egraether.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function Vector3( x, y, z ) { + + this.x = x || 0; + this.y = y || 0; + this.z = z || 0; + + } + + Object.assign( Vector3.prototype, { + + isVector3: true, + + set: function ( x, y, z ) { + + this.x = x; + this.y = y; + this.z = z; + + return this; + + }, + + setScalar: function ( scalar ) { + + this.x = scalar; + this.y = scalar; + this.z = scalar; + + return this; + + }, + + setX: function ( x ) { + + this.x = x; + + return this; + + }, + + setY: function ( y ) { + + this.y = y; + + return this; + + }, + + setZ: function ( z ) { + + this.z = z; + + return this; + + }, + + setComponent: function ( index, value ) { + + switch ( index ) { + + case 0: this.x = value; break; + case 1: this.y = value; break; + case 2: this.z = value; break; + default: throw new Error( 'index is out of range: ' + index ); + + } + + return this; + + }, + + getComponent: function ( index ) { + + switch ( index ) { + + case 0: return this.x; + case 1: return this.y; + case 2: return this.z; + default: throw new Error( 'index is out of range: ' + index ); + + } + + }, + + clone: function () { + + return new this.constructor( this.x, this.y, this.z ); + + }, + + copy: function ( v ) { + + this.x = v.x; + this.y = v.y; + this.z = v.z; + + return this; + + }, + + add: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ); + return this.addVectors( v, w ); + + } + + this.x += v.x; + this.y += v.y; + this.z += v.z; + + return this; + + }, + + addScalar: function ( s ) { + + this.x += s; + this.y += s; + this.z += s; + + return this; + + }, + + addVectors: function ( a, b ) { + + this.x = a.x + b.x; + this.y = a.y + b.y; + this.z = a.z + b.z; + + return this; + + }, + + addScaledVector: function ( v, s ) { + + this.x += v.x * s; + this.y += v.y * s; + this.z += v.z * s; + + return this; + + }, + + sub: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ); + return this.subVectors( v, w ); + + } + + this.x -= v.x; + this.y -= v.y; + this.z -= v.z; + + return this; + + }, + + subScalar: function ( s ) { + + this.x -= s; + this.y -= s; + this.z -= s; + + return this; + + }, + + subVectors: function ( a, b ) { + + this.x = a.x - b.x; + this.y = a.y - b.y; + this.z = a.z - b.z; + + return this; + + }, + + multiply: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.' ); + return this.multiplyVectors( v, w ); + + } + + this.x *= v.x; + this.y *= v.y; + this.z *= v.z; + + return this; + + }, + + multiplyScalar: function ( scalar ) { + + this.x *= scalar; + this.y *= scalar; + this.z *= scalar; + + return this; + + }, + + multiplyVectors: function ( a, b ) { + + this.x = a.x * b.x; + this.y = a.y * b.y; + this.z = a.z * b.z; + + return this; + + }, + + applyEuler: function () { + + var quaternion = new Quaternion(); + + return function applyEuler( euler ) { + + if ( ! ( euler && euler.isEuler ) ) { + + console.error( 'THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.' ); + + } + + return this.applyQuaternion( quaternion.setFromEuler( euler ) ); + + }; + + }(), + + applyAxisAngle: function () { + + var quaternion = new Quaternion(); + + return function applyAxisAngle( axis, angle ) { + + return this.applyQuaternion( quaternion.setFromAxisAngle( axis, angle ) ); + + }; + + }(), + + applyMatrix3: function ( m ) { + + var x = this.x, y = this.y, z = this.z; + var e = m.elements; + + this.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z; + this.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z; + this.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z; + + return this; + + }, + + applyMatrix4: function ( m ) { + + var x = this.x, y = this.y, z = this.z; + var e = m.elements; + + var w = 1 / ( e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] ); + + this.x = ( e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] ) * w; + this.y = ( e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] ) * w; + this.z = ( e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] ) * w; + + return this; + + }, + + applyQuaternion: function ( q ) { + + var x = this.x, y = this.y, z = this.z; + var qx = q.x, qy = q.y, qz = q.z, qw = q.w; + + // calculate quat * vector + + var ix = qw * x + qy * z - qz * y; + var iy = qw * y + qz * x - qx * z; + var iz = qw * z + qx * y - qy * x; + var iw = - qx * x - qy * y - qz * z; + + // calculate result * inverse quat + + this.x = ix * qw + iw * - qx + iy * - qz - iz * - qy; + this.y = iy * qw + iw * - qy + iz * - qx - ix * - qz; + this.z = iz * qw + iw * - qz + ix * - qy - iy * - qx; + + return this; + + }, + + project: function () { + + var matrix = new Matrix4(); + + return function project( camera ) { + + matrix.multiplyMatrices( camera.projectionMatrix, matrix.getInverse( camera.matrixWorld ) ); + return this.applyMatrix4( matrix ); + + }; + + }(), + + unproject: function () { + + var matrix = new Matrix4(); + + return function unproject( camera ) { + + matrix.multiplyMatrices( camera.matrixWorld, matrix.getInverse( camera.projectionMatrix ) ); + return this.applyMatrix4( matrix ); + + }; + + }(), + + transformDirection: function ( m ) { + + // input: THREE.Matrix4 affine matrix + // vector interpreted as a direction + + var x = this.x, y = this.y, z = this.z; + var e = m.elements; + + this.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z; + this.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z; + this.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z; + + return this.normalize(); + + }, + + divide: function ( v ) { + + this.x /= v.x; + this.y /= v.y; + this.z /= v.z; + + return this; + + }, + + divideScalar: function ( scalar ) { + + return this.multiplyScalar( 1 / scalar ); + + }, + + min: function ( v ) { + + this.x = Math.min( this.x, v.x ); + this.y = Math.min( this.y, v.y ); + this.z = Math.min( this.z, v.z ); + + return this; + + }, + + max: function ( v ) { + + this.x = Math.max( this.x, v.x ); + this.y = Math.max( this.y, v.y ); + this.z = Math.max( this.z, v.z ); + + return this; + + }, + + clamp: function ( min, max ) { + + // assumes min < max, componentwise + + this.x = Math.max( min.x, Math.min( max.x, this.x ) ); + this.y = Math.max( min.y, Math.min( max.y, this.y ) ); + this.z = Math.max( min.z, Math.min( max.z, this.z ) ); + + return this; + + }, + + clampScalar: function () { + + var min = new Vector3(); + var max = new Vector3(); + + return function clampScalar( minVal, maxVal ) { + + min.set( minVal, minVal, minVal ); + max.set( maxVal, maxVal, maxVal ); + + return this.clamp( min, max ); + + }; + + }(), + + clampLength: function ( min, max ) { + + var length = this.length(); + + return this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) ); + + }, + + floor: function () { + + this.x = Math.floor( this.x ); + this.y = Math.floor( this.y ); + this.z = Math.floor( this.z ); + + return this; + + }, + + ceil: function () { + + this.x = Math.ceil( this.x ); + this.y = Math.ceil( this.y ); + this.z = Math.ceil( this.z ); + + return this; + + }, + + round: function () { + + this.x = Math.round( this.x ); + this.y = Math.round( this.y ); + this.z = Math.round( this.z ); + + return this; + + }, + + roundToZero: function () { + + this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x ); + this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y ); + this.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z ); + + return this; + + }, + + negate: function () { + + this.x = - this.x; + this.y = - this.y; + this.z = - this.z; + + return this; + + }, + + dot: function ( v ) { + + return this.x * v.x + this.y * v.y + this.z * v.z; + + }, + + // TODO lengthSquared? + + lengthSq: function () { + + return this.x * this.x + this.y * this.y + this.z * this.z; + + }, + + length: function () { + + return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z ); + + }, + + lengthManhattan: function () { + + return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ); + + }, + + normalize: function () { + + return this.divideScalar( this.length() || 1 ); + + }, + + setLength: function ( length ) { + + return this.normalize().multiplyScalar( length ); + + }, + + lerp: function ( v, alpha ) { + + this.x += ( v.x - this.x ) * alpha; + this.y += ( v.y - this.y ) * alpha; + this.z += ( v.z - this.z ) * alpha; + + return this; + + }, + + lerpVectors: function ( v1, v2, alpha ) { + + return this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 ); + + }, + + cross: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.' ); + return this.crossVectors( v, w ); + + } + + var x = this.x, y = this.y, z = this.z; + + this.x = y * v.z - z * v.y; + this.y = z * v.x - x * v.z; + this.z = x * v.y - y * v.x; + + return this; + + }, + + crossVectors: function ( a, b ) { + + var ax = a.x, ay = a.y, az = a.z; + var bx = b.x, by = b.y, bz = b.z; + + this.x = ay * bz - az * by; + this.y = az * bx - ax * bz; + this.z = ax * by - ay * bx; + + return this; + + }, + + projectOnVector: function ( vector ) { + + var scalar = vector.dot( this ) / vector.lengthSq(); + + return this.copy( vector ).multiplyScalar( scalar ); + + }, + + projectOnPlane: function () { + + var v1 = new Vector3(); + + return function projectOnPlane( planeNormal ) { + + v1.copy( this ).projectOnVector( planeNormal ); + + return this.sub( v1 ); + + }; + + }(), + + reflect: function () { + + // reflect incident vector off plane orthogonal to normal + // normal is assumed to have unit length + + var v1 = new Vector3(); + + return function reflect( normal ) { + + return this.sub( v1.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) ); + + }; + + }(), + + angleTo: function ( v ) { + + var theta = this.dot( v ) / ( Math.sqrt( this.lengthSq() * v.lengthSq() ) ); + + // clamp, to handle numerical problems + + return Math.acos( _Math.clamp( theta, - 1, 1 ) ); + + }, + + distanceTo: function ( v ) { + + return Math.sqrt( this.distanceToSquared( v ) ); + + }, + + distanceToSquared: function ( v ) { + + var dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z; + + return dx * dx + dy * dy + dz * dz; + + }, + + distanceToManhattan: function ( v ) { + + return Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z ); + + }, + + setFromSpherical: function ( s ) { + + var sinPhiRadius = Math.sin( s.phi ) * s.radius; + + this.x = sinPhiRadius * Math.sin( s.theta ); + this.y = Math.cos( s.phi ) * s.radius; + this.z = sinPhiRadius * Math.cos( s.theta ); + + return this; + + }, + + setFromCylindrical: function ( c ) { + + this.x = c.radius * Math.sin( c.theta ); + this.y = c.y; + this.z = c.radius * Math.cos( c.theta ); + + return this; + + }, + + setFromMatrixPosition: function ( m ) { + + var e = m.elements; + + this.x = e[ 12 ]; + this.y = e[ 13 ]; + this.z = e[ 14 ]; + + return this; + + }, + + setFromMatrixScale: function ( m ) { + + var sx = this.setFromMatrixColumn( m, 0 ).length(); + var sy = this.setFromMatrixColumn( m, 1 ).length(); + var sz = this.setFromMatrixColumn( m, 2 ).length(); + + this.x = sx; + this.y = sy; + this.z = sz; + + return this; + + }, + + setFromMatrixColumn: function ( m, index ) { + + return this.fromArray( m.elements, index * 4 ); + + }, + + equals: function ( v ) { + + return ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.x = array[ offset ]; + this.y = array[ offset + 1 ]; + this.z = array[ offset + 2 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.x; + array[ offset + 1 ] = this.y; + array[ offset + 2 ] = this.z; + + return array; + + }, + + fromBufferAttribute: function ( attribute, index, offset ) { + + if ( offset !== undefined ) { + + console.warn( 'THREE.Vector3: offset has been removed from .fromBufferAttribute().' ); + + } + + this.x = attribute.getX( index ); + this.y = attribute.getY( index ); + this.z = attribute.getZ( index ); + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author supereggbert / http://www.paulbrunt.co.uk/ + * @author philogb / http://blog.thejit.org/ + * @author jordi_ros / http://plattsoft.com + * @author D1plo1d / http://github.com/D1plo1d + * @author alteredq / http://alteredqualia.com/ + * @author mikael emtinger / http://gomo.se/ + * @author timknip / http://www.floorplanner.com/ + * @author bhouston / http://clara.io + * @author WestLangley / http://github.com/WestLangley + */ + + function Matrix4() { + + this.elements = [ + + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + + ]; + + if ( arguments.length > 0 ) { + + console.error( 'THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.' ); + + } + + } + + Object.assign( Matrix4.prototype, { + + isMatrix4: true, + + set: function ( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) { + + var te = this.elements; + + te[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14; + te[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24; + te[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34; + te[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44; + + return this; + + }, + + identity: function () { + + this.set( + + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + clone: function () { + + return new Matrix4().fromArray( this.elements ); + + }, + + copy: function ( m ) { + + var te = this.elements; + var me = m.elements; + + te[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ]; te[ 3 ] = me[ 3 ]; + te[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ]; te[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ]; + te[ 8 ] = me[ 8 ]; te[ 9 ] = me[ 9 ]; te[ 10 ] = me[ 10 ]; te[ 11 ] = me[ 11 ]; + te[ 12 ] = me[ 12 ]; te[ 13 ] = me[ 13 ]; te[ 14 ] = me[ 14 ]; te[ 15 ] = me[ 15 ]; + + return this; + + }, + + copyPosition: function ( m ) { + + var te = this.elements, me = m.elements; + + te[ 12 ] = me[ 12 ]; + te[ 13 ] = me[ 13 ]; + te[ 14 ] = me[ 14 ]; + + return this; + + }, + + extractBasis: function ( xAxis, yAxis, zAxis ) { + + xAxis.setFromMatrixColumn( this, 0 ); + yAxis.setFromMatrixColumn( this, 1 ); + zAxis.setFromMatrixColumn( this, 2 ); + + return this; + + }, + + makeBasis: function ( xAxis, yAxis, zAxis ) { + + this.set( + xAxis.x, yAxis.x, zAxis.x, 0, + xAxis.y, yAxis.y, zAxis.y, 0, + xAxis.z, yAxis.z, zAxis.z, 0, + 0, 0, 0, 1 + ); + + return this; + + }, + + extractRotation: function () { + + var v1 = new Vector3(); + + return function extractRotation( m ) { + + var te = this.elements; + var me = m.elements; + + var scaleX = 1 / v1.setFromMatrixColumn( m, 0 ).length(); + var scaleY = 1 / v1.setFromMatrixColumn( m, 1 ).length(); + var scaleZ = 1 / v1.setFromMatrixColumn( m, 2 ).length(); + + te[ 0 ] = me[ 0 ] * scaleX; + te[ 1 ] = me[ 1 ] * scaleX; + te[ 2 ] = me[ 2 ] * scaleX; + + te[ 4 ] = me[ 4 ] * scaleY; + te[ 5 ] = me[ 5 ] * scaleY; + te[ 6 ] = me[ 6 ] * scaleY; + + te[ 8 ] = me[ 8 ] * scaleZ; + te[ 9 ] = me[ 9 ] * scaleZ; + te[ 10 ] = me[ 10 ] * scaleZ; + + return this; + + }; + + }(), + + makeRotationFromEuler: function ( euler ) { + + if ( ! ( euler && euler.isEuler ) ) { + + console.error( 'THREE.Matrix: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.' ); + + } + + var te = this.elements; + + var x = euler.x, y = euler.y, z = euler.z; + var a = Math.cos( x ), b = Math.sin( x ); + var c = Math.cos( y ), d = Math.sin( y ); + var e = Math.cos( z ), f = Math.sin( z ); + + if ( euler.order === 'XYZ' ) { + + var ae = a * e, af = a * f, be = b * e, bf = b * f; + + te[ 0 ] = c * e; + te[ 4 ] = - c * f; + te[ 8 ] = d; + + te[ 1 ] = af + be * d; + te[ 5 ] = ae - bf * d; + te[ 9 ] = - b * c; + + te[ 2 ] = bf - ae * d; + te[ 6 ] = be + af * d; + te[ 10 ] = a * c; + + } else if ( euler.order === 'YXZ' ) { + + var ce = c * e, cf = c * f, de = d * e, df = d * f; + + te[ 0 ] = ce + df * b; + te[ 4 ] = de * b - cf; + te[ 8 ] = a * d; + + te[ 1 ] = a * f; + te[ 5 ] = a * e; + te[ 9 ] = - b; + + te[ 2 ] = cf * b - de; + te[ 6 ] = df + ce * b; + te[ 10 ] = a * c; + + } else if ( euler.order === 'ZXY' ) { + + var ce = c * e, cf = c * f, de = d * e, df = d * f; + + te[ 0 ] = ce - df * b; + te[ 4 ] = - a * f; + te[ 8 ] = de + cf * b; + + te[ 1 ] = cf + de * b; + te[ 5 ] = a * e; + te[ 9 ] = df - ce * b; + + te[ 2 ] = - a * d; + te[ 6 ] = b; + te[ 10 ] = a * c; + + } else if ( euler.order === 'ZYX' ) { + + var ae = a * e, af = a * f, be = b * e, bf = b * f; + + te[ 0 ] = c * e; + te[ 4 ] = be * d - af; + te[ 8 ] = ae * d + bf; + + te[ 1 ] = c * f; + te[ 5 ] = bf * d + ae; + te[ 9 ] = af * d - be; + + te[ 2 ] = - d; + te[ 6 ] = b * c; + te[ 10 ] = a * c; + + } else if ( euler.order === 'YZX' ) { + + var ac = a * c, ad = a * d, bc = b * c, bd = b * d; + + te[ 0 ] = c * e; + te[ 4 ] = bd - ac * f; + te[ 8 ] = bc * f + ad; + + te[ 1 ] = f; + te[ 5 ] = a * e; + te[ 9 ] = - b * e; + + te[ 2 ] = - d * e; + te[ 6 ] = ad * f + bc; + te[ 10 ] = ac - bd * f; + + } else if ( euler.order === 'XZY' ) { + + var ac = a * c, ad = a * d, bc = b * c, bd = b * d; + + te[ 0 ] = c * e; + te[ 4 ] = - f; + te[ 8 ] = d * e; + + te[ 1 ] = ac * f + bd; + te[ 5 ] = a * e; + te[ 9 ] = ad * f - bc; + + te[ 2 ] = bc * f - ad; + te[ 6 ] = b * e; + te[ 10 ] = bd * f + ac; + + } + + // last column + te[ 3 ] = 0; + te[ 7 ] = 0; + te[ 11 ] = 0; + + // bottom row + te[ 12 ] = 0; + te[ 13 ] = 0; + te[ 14 ] = 0; + te[ 15 ] = 1; + + return this; + + }, + + makeRotationFromQuaternion: function ( q ) { + + var te = this.elements; + + var x = q._x, y = q._y, z = q._z, w = q._w; + var x2 = x + x, y2 = y + y, z2 = z + z; + var xx = x * x2, xy = x * y2, xz = x * z2; + var yy = y * y2, yz = y * z2, zz = z * z2; + var wx = w * x2, wy = w * y2, wz = w * z2; + + te[ 0 ] = 1 - ( yy + zz ); + te[ 4 ] = xy - wz; + te[ 8 ] = xz + wy; + + te[ 1 ] = xy + wz; + te[ 5 ] = 1 - ( xx + zz ); + te[ 9 ] = yz - wx; + + te[ 2 ] = xz - wy; + te[ 6 ] = yz + wx; + te[ 10 ] = 1 - ( xx + yy ); + + // last column + te[ 3 ] = 0; + te[ 7 ] = 0; + te[ 11 ] = 0; + + // bottom row + te[ 12 ] = 0; + te[ 13 ] = 0; + te[ 14 ] = 0; + te[ 15 ] = 1; + + return this; + + }, + + lookAt: function () { + + var x = new Vector3(); + var y = new Vector3(); + var z = new Vector3(); + + return function lookAt( eye, target, up ) { + + var te = this.elements; + + z.subVectors( eye, target ); + + if ( z.lengthSq() === 0 ) { + + // eye and target are in the same position + + z.z = 1; + + } + + z.normalize(); + x.crossVectors( up, z ); + + if ( x.lengthSq() === 0 ) { + + // up and z are parallel + + if ( Math.abs( up.z ) === 1 ) { + + z.x += 0.0001; + + } else { + + z.z += 0.0001; + + } + + z.normalize(); + x.crossVectors( up, z ); + + } + + x.normalize(); + y.crossVectors( z, x ); + + 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; + + return this; + + }; + + }(), + + multiply: function ( m, n ) { + + if ( n !== undefined ) { + + console.warn( 'THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.' ); + return this.multiplyMatrices( m, n ); + + } + + return this.multiplyMatrices( this, m ); + + }, + + premultiply: function ( m ) { + + return this.multiplyMatrices( m, this ); + + }, + + multiplyMatrices: function ( a, b ) { + + var ae = a.elements; + var be = b.elements; + var te = this.elements; + + var a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ]; + var a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ]; + var a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ]; + var a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ]; + + var b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ]; + var b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ]; + var b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ]; + var b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ]; + + te[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41; + te[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42; + te[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43; + te[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44; + + te[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41; + te[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42; + te[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43; + te[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44; + + te[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41; + te[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42; + te[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43; + te[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44; + + te[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41; + te[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42; + te[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43; + te[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44; + + return this; + + }, + + multiplyScalar: function ( s ) { + + var te = this.elements; + + te[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s; + te[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s; + te[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s; + te[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s; + + return this; + + }, + + applyToBufferAttribute: function () { + + var v1 = new Vector3(); + + return function applyToBufferAttribute( attribute ) { + + for ( var i = 0, l = attribute.count; i < l; i ++ ) { + + v1.x = attribute.getX( i ); + v1.y = attribute.getY( i ); + v1.z = attribute.getZ( i ); + + v1.applyMatrix4( this ); + + attribute.setXYZ( i, v1.x, v1.y, v1.z ); + + } + + return attribute; + + }; + + }(), + + determinant: function () { + + var te = this.elements; + + var n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ]; + var n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ]; + var n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ]; + var n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ]; + + //TODO: make this more efficient + //( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm ) + + return ( + n41 * ( + + n14 * n23 * n32 + - n13 * n24 * n32 + - n14 * n22 * n33 + + n12 * n24 * n33 + + n13 * n22 * n34 + - n12 * n23 * n34 + ) + + n42 * ( + + n11 * n23 * n34 + - n11 * n24 * n33 + + n14 * n21 * n33 + - n13 * n21 * n34 + + n13 * n24 * n31 + - n14 * n23 * n31 + ) + + n43 * ( + + n11 * n24 * n32 + - n11 * n22 * n34 + - n14 * n21 * n32 + + n12 * n21 * n34 + + n14 * n22 * n31 + - n12 * n24 * n31 + ) + + n44 * ( + - n13 * n22 * n31 + - n11 * n23 * n32 + + n11 * n22 * n33 + + n13 * n21 * n32 + - n12 * n21 * n33 + + n12 * n23 * n31 + ) + + ); + + }, + + transpose: function () { + + var te = this.elements; + var tmp; + + tmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp; + tmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp; + tmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp; + + tmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp; + tmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp; + tmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp; + + return this; + + }, + + setPosition: function ( v ) { + + var te = this.elements; + + te[ 12 ] = v.x; + te[ 13 ] = v.y; + te[ 14 ] = v.z; + + return this; + + }, + + getInverse: function ( m, throwOnDegenerate ) { + + // based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm + var te = this.elements, + me = m.elements, + + n11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ], n41 = me[ 3 ], + n12 = me[ 4 ], n22 = me[ 5 ], n32 = me[ 6 ], n42 = me[ 7 ], + n13 = me[ 8 ], n23 = me[ 9 ], n33 = me[ 10 ], n43 = me[ 11 ], + n14 = me[ 12 ], n24 = me[ 13 ], n34 = me[ 14 ], n44 = me[ 15 ], + + t11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44, + t12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44, + t13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44, + t14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34; + + var det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14; + + if ( det === 0 ) { + + var msg = "THREE.Matrix4.getInverse(): can't invert matrix, determinant is 0"; + + if ( throwOnDegenerate === true ) { + + throw new Error( msg ); + + } else { + + console.warn( msg ); + + } + + return this.identity(); + + } + + var detInv = 1 / det; + + te[ 0 ] = t11 * detInv; + te[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv; + te[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv; + te[ 3 ] = ( n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43 ) * detInv; + + te[ 4 ] = t12 * detInv; + te[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv; + te[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv; + te[ 7 ] = ( n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43 ) * detInv; + + te[ 8 ] = t13 * detInv; + te[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv; + te[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv; + te[ 11 ] = ( n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43 ) * detInv; + + te[ 12 ] = t14 * detInv; + te[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv; + te[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv; + te[ 15 ] = ( n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33 ) * detInv; + + return this; + + }, + + scale: function ( v ) { + + var te = this.elements; + var x = v.x, y = v.y, z = v.z; + + te[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z; + te[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z; + te[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z; + te[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z; + + return this; + + }, + + getMaxScaleOnAxis: function () { + + var te = this.elements; + + var scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ]; + var scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ]; + var scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ]; + + return Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) ); + + }, + + makeTranslation: function ( x, y, z ) { + + this.set( + + 1, 0, 0, x, + 0, 1, 0, y, + 0, 0, 1, z, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeRotationX: function ( theta ) { + + var c = Math.cos( theta ), s = Math.sin( theta ); + + this.set( + + 1, 0, 0, 0, + 0, c, - s, 0, + 0, s, c, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeRotationY: function ( theta ) { + + var c = Math.cos( theta ), s = Math.sin( theta ); + + this.set( + + c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeRotationZ: function ( theta ) { + + var c = Math.cos( theta ), s = Math.sin( theta ); + + this.set( + + c, - s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeRotationAxis: function ( axis, angle ) { + + // Based on http://www.gamedev.net/reference/articles/article1199.asp + + var c = Math.cos( angle ); + var s = Math.sin( angle ); + var t = 1 - c; + var x = axis.x, y = axis.y, z = axis.z; + var tx = t * x, ty = t * y; + + this.set( + + tx * x + c, tx * y - s * z, tx * z + s * y, 0, + tx * y + s * z, ty * y + c, ty * z - s * x, 0, + tx * z - s * y, ty * z + s * x, t * z * z + c, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeScale: function ( x, y, z ) { + + this.set( + + x, 0, 0, 0, + 0, y, 0, 0, + 0, 0, z, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeShear: function ( x, y, z ) { + + this.set( + + 1, y, z, 0, + x, 1, z, 0, + x, y, 1, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + compose: function ( position, quaternion, scale ) { + + this.makeRotationFromQuaternion( quaternion ); + this.scale( scale ); + this.setPosition( position ); + + return this; + + }, + + decompose: function () { + + var vector = new Vector3(); + var matrix = new Matrix4(); + + return function decompose( position, quaternion, scale ) { + + var te = this.elements; + + var sx = vector.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length(); + var sy = vector.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length(); + var sz = vector.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length(); + + // if determine is negative, we need to invert one scale + var det = this.determinant(); + if ( det < 0 ) sx = - sx; + + position.x = te[ 12 ]; + position.y = te[ 13 ]; + position.z = te[ 14 ]; + + // scale the rotation part + matrix.copy( this ); + + var invSX = 1 / sx; + var invSY = 1 / sy; + var invSZ = 1 / sz; + + matrix.elements[ 0 ] *= invSX; + matrix.elements[ 1 ] *= invSX; + matrix.elements[ 2 ] *= invSX; + + matrix.elements[ 4 ] *= invSY; + matrix.elements[ 5 ] *= invSY; + matrix.elements[ 6 ] *= invSY; + + matrix.elements[ 8 ] *= invSZ; + matrix.elements[ 9 ] *= invSZ; + matrix.elements[ 10 ] *= invSZ; + + quaternion.setFromRotationMatrix( matrix ); + + scale.x = sx; + scale.y = sy; + scale.z = sz; + + return this; + + }; + + }(), + + makePerspective: function ( left, right, top, bottom, near, far ) { + + if ( far === undefined ) { + + console.warn( 'THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.' ); + + } + + var te = this.elements; + var x = 2 * near / ( right - left ); + var y = 2 * near / ( top - bottom ); + + var a = ( right + left ) / ( right - left ); + var b = ( top + bottom ) / ( top - bottom ); + var c = - ( far + near ) / ( far - near ); + var d = - 2 * far * near / ( far - near ); + + te[ 0 ] = x; te[ 4 ] = 0; te[ 8 ] = a; te[ 12 ] = 0; + te[ 1 ] = 0; te[ 5 ] = y; te[ 9 ] = b; te[ 13 ] = 0; + te[ 2 ] = 0; te[ 6 ] = 0; te[ 10 ] = c; te[ 14 ] = d; + te[ 3 ] = 0; te[ 7 ] = 0; te[ 11 ] = - 1; te[ 15 ] = 0; + + return this; + + }, + + makeOrthographic: function ( left, right, top, bottom, near, far ) { + + var te = this.elements; + var w = 1.0 / ( right - left ); + var h = 1.0 / ( top - bottom ); + var p = 1.0 / ( far - near ); + + var x = ( right + left ) * w; + var y = ( top + bottom ) * h; + var z = ( far + near ) * p; + + te[ 0 ] = 2 * w; te[ 4 ] = 0; te[ 8 ] = 0; te[ 12 ] = - x; + te[ 1 ] = 0; te[ 5 ] = 2 * h; te[ 9 ] = 0; te[ 13 ] = - y; + te[ 2 ] = 0; te[ 6 ] = 0; te[ 10 ] = - 2 * p; te[ 14 ] = - z; + te[ 3 ] = 0; te[ 7 ] = 0; te[ 11 ] = 0; te[ 15 ] = 1; + + return this; + + }, + + equals: function ( matrix ) { + + var te = this.elements; + var me = matrix.elements; + + for ( var i = 0; i < 16; i ++ ) { + + if ( te[ i ] !== me[ i ] ) return false; + + } + + return true; + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + for ( var i = 0; i < 16; i ++ ) { + + this.elements[ i ] = array[ i + offset ]; + + } + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + var te = this.elements; + + array[ offset ] = te[ 0 ]; + array[ offset + 1 ] = te[ 1 ]; + array[ offset + 2 ] = te[ 2 ]; + array[ offset + 3 ] = te[ 3 ]; + + array[ offset + 4 ] = te[ 4 ]; + array[ offset + 5 ] = te[ 5 ]; + array[ offset + 6 ] = te[ 6 ]; + array[ offset + 7 ] = te[ 7 ]; + + array[ offset + 8 ] = te[ 8 ]; + array[ offset + 9 ] = te[ 9 ]; + array[ offset + 10 ] = te[ 10 ]; + array[ offset + 11 ] = te[ 11 ]; + + array[ offset + 12 ] = te[ 12 ]; + array[ offset + 13 ] = te[ 13 ]; + array[ offset + 14 ] = te[ 14 ]; + array[ offset + 15 ] = te[ 15 ]; + + return array; + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function DataTexture( data, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) { + + Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ); + + this.image = { data: data, width: width, height: height }; + + this.magFilter = magFilter !== undefined ? magFilter : NearestFilter; + this.minFilter = minFilter !== undefined ? minFilter : NearestFilter; + + this.generateMipmaps = false; + this.flipY = false; + this.unpackAlignment = 1; + + } + + DataTexture.prototype = Object.create( Texture.prototype ); + DataTexture.prototype.constructor = DataTexture; + + DataTexture.prototype.isDataTexture = true; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function CubeTexture( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) { + + images = images !== undefined ? images : []; + mapping = mapping !== undefined ? mapping : CubeReflectionMapping; + + Texture.call( this, images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ); + + this.flipY = false; + + } + + CubeTexture.prototype = Object.create( Texture.prototype ); + CubeTexture.prototype.constructor = CubeTexture; + + CubeTexture.prototype.isCubeTexture = true; + + Object.defineProperty( CubeTexture.prototype, 'images', { + + get: function () { + + return this.image; + + }, + + set: function ( value ) { + + this.image = value; + + } + + } ); + + /** + * @author tschw + * + * Uniforms of a program. + * Those form a tree structure with a special top-level container for the root, + * which you get by calling 'new WebGLUniforms( gl, program, renderer )'. + * + * + * Properties of inner nodes including the top-level container: + * + * .seq - array of nested uniforms + * .map - nested uniforms by name + * + * + * Methods of all nodes except the top-level container: + * + * .setValue( gl, value, [renderer] ) + * + * uploads a uniform value(s) + * the 'renderer' parameter is needed for sampler uniforms + * + * + * Static methods of the top-level container (renderer factorizations): + * + * .upload( gl, seq, values, renderer ) + * + * sets uniforms in 'seq' to 'values[id].value' + * + * .seqWithValue( seq, values ) : filteredSeq + * + * filters 'seq' entries with corresponding entry in values + * + * + * Methods of the top-level container (renderer factorizations): + * + * .setValue( gl, name, value ) + * + * sets uniform with name 'name' to 'value' + * + * .set( gl, obj, prop ) + * + * sets uniform from object and property with same name than uniform + * + * .setOptional( gl, obj, prop ) + * + * like .set for an optional property of the object + * + */ + + var emptyTexture = new Texture(); + var emptyCubeTexture = new CubeTexture(); + + // --- Base for inner nodes (including the root) --- + + function UniformContainer() { + + this.seq = []; + this.map = {}; + + } + + // --- Utilities --- + + // Array Caches (provide typed arrays for temporary by size) + + var arrayCacheF32 = []; + var arrayCacheI32 = []; + + // Float32Array caches used for uploading Matrix uniforms + + var mat4array = new Float32Array( 16 ); + var mat3array = new Float32Array( 9 ); + + // Flattening for arrays of vectors and matrices + + function flatten( array, nBlocks, blockSize ) { + + var firstElem = array[ 0 ]; + + if ( firstElem <= 0 || firstElem > 0 ) return array; + // unoptimized: ! isNaN( firstElem ) + // see http://jacksondunstan.com/articles/983 + + var n = nBlocks * blockSize, + r = arrayCacheF32[ n ]; + + if ( r === undefined ) { + + r = new Float32Array( n ); + arrayCacheF32[ n ] = r; + + } + + if ( nBlocks !== 0 ) { + + firstElem.toArray( r, 0 ); + + for ( var i = 1, offset = 0; i !== nBlocks; ++ i ) { + + offset += blockSize; + array[ i ].toArray( r, offset ); + + } + + } + + return r; + + } + + // Texture unit allocation + + function allocTexUnits( renderer, n ) { + + var r = arrayCacheI32[ n ]; + + if ( r === undefined ) { + + r = new Int32Array( n ); + arrayCacheI32[ n ] = r; + + } + + for ( var i = 0; i !== n; ++ i ) + r[ i ] = renderer.allocTextureUnit(); + + return r; + + } + + // --- Setters --- + + // Note: Defining these methods externally, because they come in a bunch + // and this way their names minify. + + // Single scalar + + function setValue1f( gl, v ) { gl.uniform1f( this.addr, v ); } + function setValue1i( gl, v ) { gl.uniform1i( this.addr, v ); } + + // Single float vector (from flat array or THREE.VectorN) + + function setValue2fv( gl, v ) { + + if ( v.x === undefined ) gl.uniform2fv( this.addr, v ); + else gl.uniform2f( this.addr, v.x, v.y ); + + } + + function setValue3fv( gl, v ) { + + if ( v.x !== undefined ) + gl.uniform3f( this.addr, v.x, v.y, v.z ); + else if ( v.r !== undefined ) + gl.uniform3f( this.addr, v.r, v.g, v.b ); + else + gl.uniform3fv( this.addr, v ); + + } + + function setValue4fv( gl, v ) { + + if ( v.x === undefined ) gl.uniform4fv( this.addr, v ); + else gl.uniform4f( this.addr, v.x, v.y, v.z, v.w ); + + } + + // Single matrix (from flat array or MatrixN) + + function setValue2fm( gl, v ) { + + gl.uniformMatrix2fv( this.addr, false, v.elements || v ); + + } + + function setValue3fm( gl, v ) { + + if ( v.elements === undefined ) { + + gl.uniformMatrix3fv( this.addr, false, v ); + + } else { + + mat3array.set( v.elements ); + gl.uniformMatrix3fv( this.addr, false, mat3array ); + + } + + } + + function setValue4fm( gl, v ) { + + if ( v.elements === undefined ) { + + gl.uniformMatrix4fv( this.addr, false, v ); + + } else { + + mat4array.set( v.elements ); + gl.uniformMatrix4fv( this.addr, false, mat4array ); + + } + + } + + // Single texture (2D / Cube) + + function setValueT1( gl, v, renderer ) { + + var unit = renderer.allocTextureUnit(); + gl.uniform1i( this.addr, unit ); + renderer.setTexture2D( v || emptyTexture, unit ); + + } + + function setValueT6( gl, v, renderer ) { + + var unit = renderer.allocTextureUnit(); + gl.uniform1i( this.addr, unit ); + renderer.setTextureCube( v || emptyCubeTexture, unit ); + + } + + // Integer / Boolean vectors or arrays thereof (always flat arrays) + + function setValue2iv( gl, v ) { gl.uniform2iv( this.addr, v ); } + function setValue3iv( gl, v ) { gl.uniform3iv( this.addr, v ); } + function setValue4iv( gl, v ) { gl.uniform4iv( this.addr, v ); } + + // Helper to pick the right setter for the singular case + + function getSingularSetter( type ) { + + switch ( type ) { + + case 0x1406: return setValue1f; // FLOAT + case 0x8b50: return setValue2fv; // _VEC2 + case 0x8b51: return setValue3fv; // _VEC3 + case 0x8b52: return setValue4fv; // _VEC4 + + case 0x8b5a: return setValue2fm; // _MAT2 + case 0x8b5b: return setValue3fm; // _MAT3 + case 0x8b5c: return setValue4fm; // _MAT4 + + case 0x8b5e: case 0x8d66: return setValueT1; // SAMPLER_2D, SAMPLER_EXTERNAL_OES + case 0x8b60: return setValueT6; // SAMPLER_CUBE + + case 0x1404: case 0x8b56: return setValue1i; // INT, BOOL + case 0x8b53: case 0x8b57: return setValue2iv; // _VEC2 + case 0x8b54: case 0x8b58: return setValue3iv; // _VEC3 + case 0x8b55: case 0x8b59: return setValue4iv; // _VEC4 + + } + + } + + // Array of scalars + + function setValue1fv( gl, v ) { gl.uniform1fv( this.addr, v ); } + function setValue1iv( gl, v ) { gl.uniform1iv( this.addr, v ); } + + // Array of vectors (flat or from THREE classes) + + function setValueV2a( gl, v ) { + + gl.uniform2fv( this.addr, flatten( v, this.size, 2 ) ); + + } + + function setValueV3a( gl, v ) { + + gl.uniform3fv( this.addr, flatten( v, this.size, 3 ) ); + + } + + function setValueV4a( gl, v ) { + + gl.uniform4fv( this.addr, flatten( v, this.size, 4 ) ); + + } + + // Array of matrices (flat or from THREE clases) + + function setValueM2a( gl, v ) { + + gl.uniformMatrix2fv( this.addr, false, flatten( v, this.size, 4 ) ); + + } + + function setValueM3a( gl, v ) { + + gl.uniformMatrix3fv( this.addr, false, flatten( v, this.size, 9 ) ); + + } + + function setValueM4a( gl, v ) { + + gl.uniformMatrix4fv( this.addr, false, flatten( v, this.size, 16 ) ); + + } + + // Array of textures (2D / Cube) + + function setValueT1a( gl, v, renderer ) { + + var n = v.length, + units = allocTexUnits( renderer, n ); + + gl.uniform1iv( this.addr, units ); + + for ( var i = 0; i !== n; ++ i ) { + + renderer.setTexture2D( v[ i ] || emptyTexture, units[ i ] ); + + } + + } + + function setValueT6a( gl, v, renderer ) { + + var n = v.length, + units = allocTexUnits( renderer, n ); + + gl.uniform1iv( this.addr, units ); + + for ( var i = 0; i !== n; ++ i ) { + + renderer.setTextureCube( v[ i ] || emptyCubeTexture, units[ i ] ); + + } + + } + + // Helper to pick the right setter for a pure (bottom-level) array + + function getPureArraySetter( type ) { + + switch ( type ) { + + case 0x1406: return setValue1fv; // FLOAT + case 0x8b50: return setValueV2a; // _VEC2 + case 0x8b51: return setValueV3a; // _VEC3 + case 0x8b52: return setValueV4a; // _VEC4 + + case 0x8b5a: return setValueM2a; // _MAT2 + case 0x8b5b: return setValueM3a; // _MAT3 + case 0x8b5c: return setValueM4a; // _MAT4 + + case 0x8b5e: return setValueT1a; // SAMPLER_2D + case 0x8b60: return setValueT6a; // SAMPLER_CUBE + + case 0x1404: case 0x8b56: return setValue1iv; // INT, BOOL + case 0x8b53: case 0x8b57: return setValue2iv; // _VEC2 + case 0x8b54: case 0x8b58: return setValue3iv; // _VEC3 + case 0x8b55: case 0x8b59: return setValue4iv; // _VEC4 + + } + + } + + // --- Uniform Classes --- + + function SingleUniform( id, activeInfo, addr ) { + + this.id = id; + this.addr = addr; + this.setValue = getSingularSetter( activeInfo.type ); + + // this.path = activeInfo.name; // DEBUG + + } + + function PureArrayUniform( id, activeInfo, addr ) { + + this.id = id; + this.addr = addr; + this.size = activeInfo.size; + this.setValue = getPureArraySetter( activeInfo.type ); + + // this.path = activeInfo.name; // DEBUG + + } + + function StructuredUniform( id ) { + + this.id = id; + + UniformContainer.call( this ); // mix-in + + } + + StructuredUniform.prototype.setValue = function ( gl, value ) { + + // Note: Don't need an extra 'renderer' parameter, since samplers + // are not allowed in structured uniforms. + + var seq = this.seq; + + for ( var i = 0, n = seq.length; i !== n; ++ i ) { + + var u = seq[ i ]; + u.setValue( gl, value[ u.id ] ); + + } + + }; + + // --- Top-level --- + + // Parser - builds up the property tree from the path strings + + var RePathPart = /([\w\d_]+)(\])?(\[|\.)?/g; + + // extracts + // - the identifier (member name or array index) + // - followed by an optional right bracket (found when array index) + // - followed by an optional left bracket or dot (type of subscript) + // + // Note: These portions can be read in a non-overlapping fashion and + // allow straightforward parsing of the hierarchy that WebGL encodes + // in the uniform names. + + function addUniform( container, uniformObject ) { + + container.seq.push( uniformObject ); + container.map[ uniformObject.id ] = uniformObject; + + } + + function parseUniform( activeInfo, addr, container ) { + + var path = activeInfo.name, + pathLength = path.length; + + // reset RegExp object, because of the early exit of a previous run + RePathPart.lastIndex = 0; + + for ( ; ; ) { + + var match = RePathPart.exec( path ), + matchEnd = RePathPart.lastIndex, + + id = match[ 1 ], + idIsIndex = match[ 2 ] === ']', + subscript = match[ 3 ]; + + if ( idIsIndex ) id = id | 0; // convert to integer + + if ( subscript === undefined || subscript === '[' && matchEnd + 2 === pathLength ) { + + // bare name or "pure" bottom-level array "[0]" suffix + + addUniform( container, subscript === undefined ? + new SingleUniform( id, activeInfo, addr ) : + new PureArrayUniform( id, activeInfo, addr ) ); + + break; + + } else { + + // step into inner node / create it in case it doesn't exist + + var map = container.map, next = map[ id ]; + + if ( next === undefined ) { + + next = new StructuredUniform( id ); + addUniform( container, next ); + + } + + container = next; + + } + + } + + } + + // Root Container + + function WebGLUniforms( gl, program, renderer ) { + + UniformContainer.call( this ); + + this.renderer = renderer; + + var n = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS ); + + for ( var i = 0; i < n; ++ i ) { + + var info = gl.getActiveUniform( program, i ), + path = info.name, + addr = gl.getUniformLocation( program, path ); + + parseUniform( info, addr, this ); + + } + + } + + WebGLUniforms.prototype.setValue = function ( gl, name, value ) { + + var u = this.map[ name ]; + + if ( u !== undefined ) u.setValue( gl, value, this.renderer ); + + }; + + WebGLUniforms.prototype.setOptional = function ( gl, object, name ) { + + var v = object[ name ]; + + if ( v !== undefined ) this.setValue( gl, name, v ); + + }; + + + // Static interface + + WebGLUniforms.upload = function ( gl, seq, values, renderer ) { + + for ( var i = 0, n = seq.length; i !== n; ++ i ) { + + var u = seq[ i ], + v = values[ u.id ]; + + if ( v.needsUpdate !== false ) { + + // note: always updating when .needsUpdate is undefined + u.setValue( gl, v.value, renderer ); + + } + + } + + }; + + WebGLUniforms.seqWithValue = function ( seq, values ) { + + var r = []; + + for ( var i = 0, n = seq.length; i !== n; ++ i ) { + + var u = seq[ i ]; + if ( u.id in values ) r.push( u ); + + } + + return r; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + var ColorKeywords = { 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF, + 'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2, + 'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50, + 'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B, + 'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B, + 'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F, + 'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3, + 'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222, + 'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700, + 'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4, + 'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00, + 'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3, + 'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA, + 'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32, + 'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3, + 'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC, + 'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD, + 'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6, + 'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9, + 'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F, + 'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE, + 'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA, + 'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0, + 'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32 }; + + function Color( r, g, b ) { + + if ( g === undefined && b === undefined ) { + + // r is THREE.Color, hex or string + return this.set( r ); + + } + + return this.setRGB( r, g, b ); + + } + + Object.assign( Color.prototype, { + + isColor: true, + + r: 1, g: 1, b: 1, + + set: function ( value ) { + + if ( value && value.isColor ) { + + this.copy( value ); + + } else if ( typeof value === 'number' ) { + + this.setHex( value ); + + } else if ( typeof value === 'string' ) { + + this.setStyle( value ); + + } + + return this; + + }, + + setScalar: function ( scalar ) { + + this.r = scalar; + this.g = scalar; + this.b = scalar; + + return this; + + }, + + setHex: function ( hex ) { + + hex = Math.floor( hex ); + + this.r = ( hex >> 16 & 255 ) / 255; + this.g = ( hex >> 8 & 255 ) / 255; + this.b = ( hex & 255 ) / 255; + + return this; + + }, + + setRGB: function ( r, g, b ) { + + this.r = r; + this.g = g; + this.b = b; + + return this; + + }, + + setHSL: function () { + + function hue2rgb( p, q, t ) { + + if ( t < 0 ) t += 1; + if ( t > 1 ) t -= 1; + if ( t < 1 / 6 ) return p + ( q - p ) * 6 * t; + if ( t < 1 / 2 ) return q; + if ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t ); + return p; + + } + + return function setHSL( h, s, l ) { + + // h,s,l ranges are in 0.0 - 1.0 + h = _Math.euclideanModulo( h, 1 ); + s = _Math.clamp( s, 0, 1 ); + l = _Math.clamp( l, 0, 1 ); + + if ( s === 0 ) { + + this.r = this.g = this.b = l; + + } else { + + var p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s ); + var q = ( 2 * l ) - p; + + this.r = hue2rgb( q, p, h + 1 / 3 ); + this.g = hue2rgb( q, p, h ); + this.b = hue2rgb( q, p, h - 1 / 3 ); + + } + + return this; + + }; + + }(), + + setStyle: function ( style ) { + + function handleAlpha( string ) { + + if ( string === undefined ) return; + + if ( parseFloat( string ) < 1 ) { + + console.warn( 'THREE.Color: Alpha component of ' + style + ' will be ignored.' ); + + } + + } + + + var m; + + if ( m = /^((?:rgb|hsl)a?)\(\s*([^\)]*)\)/.exec( style ) ) { + + // rgb / hsl + + var color; + var name = m[ 1 ]; + var components = m[ 2 ]; + + switch ( name ) { + + case 'rgb': + case 'rgba': + + if ( color = /^(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( components ) ) { + + // rgb(255,0,0) rgba(255,0,0,0.5) + this.r = Math.min( 255, parseInt( color[ 1 ], 10 ) ) / 255; + this.g = Math.min( 255, parseInt( color[ 2 ], 10 ) ) / 255; + this.b = Math.min( 255, parseInt( color[ 3 ], 10 ) ) / 255; + + handleAlpha( color[ 5 ] ); + + return this; + + } + + if ( color = /^(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( components ) ) { + + // rgb(100%,0%,0%) rgba(100%,0%,0%,0.5) + this.r = Math.min( 100, parseInt( color[ 1 ], 10 ) ) / 100; + this.g = Math.min( 100, parseInt( color[ 2 ], 10 ) ) / 100; + this.b = Math.min( 100, parseInt( color[ 3 ], 10 ) ) / 100; + + handleAlpha( color[ 5 ] ); + + return this; + + } + + break; + + case 'hsl': + case 'hsla': + + if ( color = /^([0-9]*\.?[0-9]+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( components ) ) { + + // hsl(120,50%,50%) hsla(120,50%,50%,0.5) + var h = parseFloat( color[ 1 ] ) / 360; + var s = parseInt( color[ 2 ], 10 ) / 100; + var l = parseInt( color[ 3 ], 10 ) / 100; + + handleAlpha( color[ 5 ] ); + + return this.setHSL( h, s, l ); + + } + + break; + + } + + } else if ( m = /^\#([A-Fa-f0-9]+)$/.exec( style ) ) { + + // hex color + + var hex = m[ 1 ]; + var size = hex.length; + + if ( size === 3 ) { + + // #ff0 + this.r = parseInt( hex.charAt( 0 ) + hex.charAt( 0 ), 16 ) / 255; + this.g = parseInt( hex.charAt( 1 ) + hex.charAt( 1 ), 16 ) / 255; + this.b = parseInt( hex.charAt( 2 ) + hex.charAt( 2 ), 16 ) / 255; + + return this; + + } else if ( size === 6 ) { + + // #ff0000 + this.r = parseInt( hex.charAt( 0 ) + hex.charAt( 1 ), 16 ) / 255; + this.g = parseInt( hex.charAt( 2 ) + hex.charAt( 3 ), 16 ) / 255; + this.b = parseInt( hex.charAt( 4 ) + hex.charAt( 5 ), 16 ) / 255; + + return this; + + } + + } + + if ( style && style.length > 0 ) { + + // color keywords + var hex = ColorKeywords[ style ]; + + if ( hex !== undefined ) { + + // red + this.setHex( hex ); + + } else { + + // unknown color + console.warn( 'THREE.Color: Unknown color ' + style ); + + } + + } + + return this; + + }, + + clone: function () { + + return new this.constructor( this.r, this.g, this.b ); + + }, + + copy: function ( color ) { + + this.r = color.r; + this.g = color.g; + this.b = color.b; + + return this; + + }, + + copyGammaToLinear: function ( color, gammaFactor ) { + + if ( gammaFactor === undefined ) gammaFactor = 2.0; + + this.r = Math.pow( color.r, gammaFactor ); + this.g = Math.pow( color.g, gammaFactor ); + this.b = Math.pow( color.b, gammaFactor ); + + return this; + + }, + + copyLinearToGamma: function ( color, gammaFactor ) { + + if ( gammaFactor === undefined ) gammaFactor = 2.0; + + var safeInverse = ( gammaFactor > 0 ) ? ( 1.0 / gammaFactor ) : 1.0; + + this.r = Math.pow( color.r, safeInverse ); + this.g = Math.pow( color.g, safeInverse ); + this.b = Math.pow( color.b, safeInverse ); + + return this; + + }, + + convertGammaToLinear: function () { + + var r = this.r, g = this.g, b = this.b; + + this.r = r * r; + this.g = g * g; + this.b = b * b; + + return this; + + }, + + convertLinearToGamma: function () { + + this.r = Math.sqrt( this.r ); + this.g = Math.sqrt( this.g ); + this.b = Math.sqrt( this.b ); + + return this; + + }, + + getHex: function () { + + return ( this.r * 255 ) << 16 ^ ( this.g * 255 ) << 8 ^ ( this.b * 255 ) << 0; + + }, + + getHexString: function () { + + return ( '000000' + this.getHex().toString( 16 ) ).slice( - 6 ); + + }, + + getHSL: function ( optionalTarget ) { + + // h,s,l ranges are in 0.0 - 1.0 + + var hsl = optionalTarget || { h: 0, s: 0, l: 0 }; + + var r = this.r, g = this.g, b = this.b; + + var max = Math.max( r, g, b ); + var min = Math.min( r, g, b ); + + var hue, saturation; + var lightness = ( min + max ) / 2.0; + + if ( min === max ) { + + hue = 0; + saturation = 0; + + } else { + + var delta = max - min; + + saturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min ); + + switch ( max ) { + + case r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break; + case g: hue = ( b - r ) / delta + 2; break; + case b: hue = ( r - g ) / delta + 4; break; + + } + + hue /= 6; + + } + + hsl.h = hue; + hsl.s = saturation; + hsl.l = lightness; + + return hsl; + + }, + + getStyle: function () { + + return 'rgb(' + ( ( this.r * 255 ) | 0 ) + ',' + ( ( this.g * 255 ) | 0 ) + ',' + ( ( this.b * 255 ) | 0 ) + ')'; + + }, + + offsetHSL: function ( h, s, l ) { + + var hsl = this.getHSL(); + + hsl.h += h; hsl.s += s; hsl.l += l; + + this.setHSL( hsl.h, hsl.s, hsl.l ); + + return this; + + }, + + add: function ( color ) { + + this.r += color.r; + this.g += color.g; + this.b += color.b; + + return this; + + }, + + addColors: function ( color1, color2 ) { + + this.r = color1.r + color2.r; + this.g = color1.g + color2.g; + this.b = color1.b + color2.b; + + return this; + + }, + + addScalar: function ( s ) { + + this.r += s; + this.g += s; + this.b += s; + + return this; + + }, + + sub: function( color ) { + + this.r = Math.max( 0, this.r - color.r ); + this.g = Math.max( 0, this.g - color.g ); + this.b = Math.max( 0, this.b - color.b ); + + return this; + + }, + + multiply: function ( color ) { + + this.r *= color.r; + this.g *= color.g; + this.b *= color.b; + + return this; + + }, + + multiplyScalar: function ( s ) { + + this.r *= s; + this.g *= s; + this.b *= s; + + return this; + + }, + + lerp: function ( color, alpha ) { + + this.r += ( color.r - this.r ) * alpha; + this.g += ( color.g - this.g ) * alpha; + this.b += ( color.b - this.b ) * alpha; + + return this; + + }, + + equals: function ( c ) { + + return ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.r = array[ offset ]; + this.g = array[ offset + 1 ]; + this.b = array[ offset + 2 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.r; + array[ offset + 1 ] = this.g; + array[ offset + 2 ] = this.b; + + return array; + + }, + + toJSON: function () { + + return this.getHex(); + + } + + } ); + + /** + * Uniforms library for shared webgl shaders + */ + + var UniformsLib = { + + common: { + + diffuse: { value: new Color( 0xeeeeee ) }, + opacity: { value: 1.0 }, + + map: { value: null }, + offsetRepeat: { value: new Vector4( 0, 0, 1, 1 ) }, + + specularMap: { value: null }, + alphaMap: { value: null }, + + envMap: { value: null }, + flipEnvMap: { value: - 1 }, + reflectivity: { value: 1.0 }, + refractionRatio: { value: 0.98 } + + }, + + aomap: { + + aoMap: { value: null }, + aoMapIntensity: { value: 1 } + + }, + + lightmap: { + + lightMap: { value: null }, + lightMapIntensity: { value: 1 } + + }, + + emissivemap: { + + emissiveMap: { value: null } + + }, + + bumpmap: { + + bumpMap: { value: null }, + bumpScale: { value: 1 } + + }, + + normalmap: { + + normalMap: { value: null }, + normalScale: { value: new Vector2( 1, 1 ) } + + }, + + displacementmap: { + + displacementMap: { value: null }, + displacementScale: { value: 1 }, + displacementBias: { value: 0 } + + }, + + roughnessmap: { + + roughnessMap: { value: null } + + }, + + metalnessmap: { + + metalnessMap: { value: null } + + }, + + gradientmap: { + + gradientMap: { value: null } + + }, + + fog: { + + fogDensity: { value: 0.00025 }, + fogNear: { value: 1 }, + fogFar: { value: 2000 }, + fogColor: { value: new Color( 0xffffff ) } + + }, + + lights: { + + ambientLightColor: { value: [] }, + + directionalLights: { value: [], properties: { + direction: {}, + color: {}, + + shadow: {}, + shadowBias: {}, + shadowRadius: {}, + shadowMapSize: {} + } }, + + directionalShadowMap: { value: [] }, + directionalShadowMatrix: { value: [] }, + + spotLights: { value: [], properties: { + color: {}, + position: {}, + direction: {}, + distance: {}, + coneCos: {}, + penumbraCos: {}, + decay: {}, + + shadow: {}, + shadowBias: {}, + shadowRadius: {}, + shadowMapSize: {} + } }, + + spotShadowMap: { value: [] }, + spotShadowMatrix: { value: [] }, + + pointLights: { value: [], properties: { + color: {}, + position: {}, + decay: {}, + distance: {}, + + shadow: {}, + shadowBias: {}, + shadowRadius: {}, + shadowMapSize: {} + } }, + + pointShadowMap: { value: [] }, + pointShadowMatrix: { value: [] }, + + hemisphereLights: { value: [], properties: { + direction: {}, + skyColor: {}, + groundColor: {} + } }, + + // TODO (abelnation): RectAreaLight BRDF data needs to be moved from example to main src + rectAreaLights: { value: [], properties: { + color: {}, + position: {}, + width: {}, + height: {} + } } + + }, + + points: { + + diffuse: { value: new Color( 0xeeeeee ) }, + opacity: { value: 1.0 }, + size: { value: 1.0 }, + scale: { value: 1.0 }, + map: { value: null }, + offsetRepeat: { value: new Vector4( 0, 0, 1, 1 ) } + + } + + }; + + /** + * Uniform Utilities + */ + + var UniformsUtils = { + + merge: function ( uniforms ) { + + var merged = {}; + + for ( var u = 0; u < uniforms.length; u ++ ) { + + var tmp = this.clone( uniforms[ u ] ); + + for ( var p in tmp ) { + + merged[ p ] = tmp[ p ]; + + } + + } + + return merged; + + }, + + clone: function ( uniforms_src ) { + + var uniforms_dst = {}; + + for ( var u in uniforms_src ) { + + uniforms_dst[ u ] = {}; + + for ( var p in uniforms_src[ u ] ) { + + var parameter_src = uniforms_src[ u ][ p ]; + + if ( parameter_src && ( parameter_src.isColor || + parameter_src.isMatrix3 || parameter_src.isMatrix4 || + parameter_src.isVector2 || parameter_src.isVector3 || parameter_src.isVector4 || + parameter_src.isTexture ) ) { + + uniforms_dst[ u ][ p ] = parameter_src.clone(); + + } else if ( Array.isArray( parameter_src ) ) { + + uniforms_dst[ u ][ p ] = parameter_src.slice(); + + } else { + + uniforms_dst[ u ][ p ] = parameter_src; + + } + + } + + } + + return uniforms_dst; + + } + + }; + + var alphamap_fragment = "#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\n#endif\n"; + + var alphamap_pars_fragment = "#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif\n"; + + var alphatest_fragment = "#ifdef ALPHATEST\n\tif ( diffuseColor.a < ALPHATEST ) discard;\n#endif\n"; + + var aomap_fragment = "#ifdef USE_AOMAP\n\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\n\treflectedLight.indirectDiffuse *= ambientOcclusion;\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.specularRoughness );\n\t#endif\n#endif\n"; + + var aomap_pars_fragment = "#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif"; + + var begin_vertex = "\nvec3 transformed = vec3( position );\n"; + + var beginnormal_vertex = "\nvec3 objectNormal = vec3( normal );\n"; + + var bsdfs = "float punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\tif( decayExponent > 0.0 ) {\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\t\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\t\tfloat maxDistanceCutoffFactor = pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t\treturn distanceFalloff * maxDistanceCutoffFactor;\n#else\n\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n#endif\n\t}\n\treturn 1.0;\n}\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\n\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\n}\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\treturn 1.0 / ( gl * gv );\n}\nfloat G_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNL = saturate( dot( geometry.normal, incidentLight.direction ) );\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\tfloat D = D_GGX( alpha, dotNH );\n\treturn F * ( G * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\tfloat theta = acos( dot( N, V ) );\n\tvec2 uv = vec2(\n\t\tsqrt( saturate( roughness ) ),\n\t\tsaturate( theta / ( 0.5 * PI ) ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.86267 + (0.49788 + 0.01436 * y ) * y;\n\tfloat b = 3.45068 + (4.18814 + y) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = (x > 0.0) ? v : 0.5 * inversesqrt( 1.0 - x * x ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transpose( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tvec3 result = vec3( LTC_ClippedSphereFormFactor( vectorFormFactor ) );\n\treturn result;\n}\nvec3 BRDF_Specular_GGX_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\tvec2 AB = vec2( -1.04, 1.04 ) * a004 + r.zw;\n\treturn specularColor * AB.x + AB.y;\n}\nfloat G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\n\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\n}\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\n\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\n}\n"; + + var bumpmap_pars_fragment = "#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\n\t\tvec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );\n\t\tvec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 );\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif\n"; + + var clipping_planes_fragment = "#if NUM_CLIPPING_PLANES > 0\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; ++ i ) {\n\t\tvec4 plane = clippingPlanes[ i ];\n\t\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t\t\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; ++ i ) {\n\t\t\tvec4 plane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\tif ( clipped ) discard;\n\t\n\t#endif\n#endif\n"; + + var clipping_planes_pars_fragment = "#if NUM_CLIPPING_PLANES > 0\n\t#if ! defined( PHYSICAL ) && ! defined( PHONG )\n\t\tvarying vec3 vViewPosition;\n\t#endif\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif\n"; + + var clipping_planes_pars_vertex = "#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvarying vec3 vViewPosition;\n#endif\n"; + + var clipping_planes_vertex = "#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n"; + + var color_fragment = "#ifdef USE_COLOR\n\tdiffuseColor.rgb *= vColor;\n#endif"; + + var color_pars_fragment = "#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif\n"; + + var color_pars_vertex = "#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif"; + + var color_vertex = "#ifdef USE_COLOR\n\tvColor.xyz = color.xyz;\n#endif"; + + var common = "#define PI 3.14159265359\n#define PI2 6.28318530718\n#define PI_HALF 1.5707963267949\n#define RECIPROCAL_PI 0.31830988618\n#define RECIPROCAL_PI2 0.15915494\n#define LOG2 1.442695\n#define EPSILON 1e-6\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#define whiteCompliment(a) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract(sin(sn) * c);\n}\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\tfloat distance = dot( planeNormal, point - pointOnPlane );\n\treturn - distance * planeNormal + point;\n}\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn sign( dot( point - pointOnPlane, planeNormal ) );\n}\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\n}\nmat3 transpose( const in mat3 v ) {\n\tmat3 tmp;\n\ttmp[0] = vec3(v[0].x, v[1].x, v[2].x);\n\ttmp[1] = vec3(v[0].y, v[1].y, v[2].y);\n\ttmp[2] = vec3(v[0].z, v[1].z, v[2].z);\n\treturn tmp;\n}\n"; + + var cube_uv_reflection_fragment = "#ifdef ENVMAP_TYPE_CUBE_UV\n#define cubeUV_textureSize (1024.0)\nint getFaceFromDirection(vec3 direction) {\n\tvec3 absDirection = abs(direction);\n\tint face = -1;\n\tif( absDirection.x > absDirection.z ) {\n\t\tif(absDirection.x > absDirection.y )\n\t\t\tface = direction.x > 0.0 ? 0 : 3;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\telse {\n\t\tif(absDirection.z > absDirection.y )\n\t\t\tface = direction.z > 0.0 ? 2 : 5;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\treturn face;\n}\n#define cubeUV_maxLods1 (log2(cubeUV_textureSize*0.25) - 1.0)\n#define cubeUV_rangeClamp (exp2((6.0 - 1.0) * 2.0))\nvec2 MipLevelInfo( vec3 vec, float roughnessLevel, float roughness ) {\n\tfloat scale = exp2(cubeUV_maxLods1 - roughnessLevel);\n\tfloat dxRoughness = dFdx(roughness);\n\tfloat dyRoughness = dFdy(roughness);\n\tvec3 dx = dFdx( vec * scale * dxRoughness );\n\tvec3 dy = dFdy( vec * scale * dyRoughness );\n\tfloat d = max( dot( dx, dx ), dot( dy, dy ) );\n\td = clamp(d, 1.0, cubeUV_rangeClamp);\n\tfloat mipLevel = 0.5 * log2(d);\n\treturn vec2(floor(mipLevel), fract(mipLevel));\n}\n#define cubeUV_maxLods2 (log2(cubeUV_textureSize*0.25) - 2.0)\n#define cubeUV_rcpTextureSize (1.0 / cubeUV_textureSize)\nvec2 getCubeUV(vec3 direction, float roughnessLevel, float mipLevel) {\n\tmipLevel = roughnessLevel > cubeUV_maxLods2 - 3.0 ? 0.0 : mipLevel;\n\tfloat a = 16.0 * cubeUV_rcpTextureSize;\n\tvec2 exp2_packed = exp2( vec2( roughnessLevel, mipLevel ) );\n\tvec2 rcp_exp2_packed = vec2( 1.0 ) / exp2_packed;\n\tfloat powScale = exp2_packed.x * exp2_packed.y;\n\tfloat scale = rcp_exp2_packed.x * rcp_exp2_packed.y * 0.25;\n\tfloat mipOffset = 0.75*(1.0 - rcp_exp2_packed.y) * rcp_exp2_packed.x;\n\tbool bRes = mipLevel == 0.0;\n\tscale = bRes && (scale < a) ? a : scale;\n\tvec3 r;\n\tvec2 offset;\n\tint face = getFaceFromDirection(direction);\n\tfloat rcpPowScale = 1.0 / powScale;\n\tif( face == 0) {\n\t\tr = vec3(direction.x, -direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 1) {\n\t\tr = vec3(direction.y, direction.x, direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 2) {\n\t\tr = vec3(direction.z, direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 3) {\n\t\tr = vec3(direction.x, direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse if( face == 4) {\n\t\tr = vec3(direction.y, direction.x, -direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse {\n\t\tr = vec3(direction.z, -direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\tr = normalize(r);\n\tfloat texelOffset = 0.5 * cubeUV_rcpTextureSize;\n\tvec2 s = ( r.yz / abs( r.x ) + vec2( 1.0 ) ) * 0.5;\n\tvec2 base = offset + vec2( texelOffset );\n\treturn base + s * ( scale - 2.0 * texelOffset );\n}\n#define cubeUV_maxLods3 (log2(cubeUV_textureSize*0.25) - 3.0)\nvec4 textureCubeUV(vec3 reflectedDirection, float roughness ) {\n\tfloat roughnessVal = roughness* cubeUV_maxLods3;\n\tfloat r1 = floor(roughnessVal);\n\tfloat r2 = r1 + 1.0;\n\tfloat t = fract(roughnessVal);\n\tvec2 mipInfo = MipLevelInfo(reflectedDirection, r1, roughness);\n\tfloat s = mipInfo.y;\n\tfloat level0 = mipInfo.x;\n\tfloat level1 = level0 + 1.0;\n\tlevel1 = level1 > 5.0 ? 5.0 : level1;\n\tlevel0 += min( floor( s + 0.5 ), 5.0 );\n\tvec2 uv_10 = getCubeUV(reflectedDirection, r1, level0);\n\tvec4 color10 = envMapTexelToLinear(texture2D(envMap, uv_10));\n\tvec2 uv_20 = getCubeUV(reflectedDirection, r2, level0);\n\tvec4 color20 = envMapTexelToLinear(texture2D(envMap, uv_20));\n\tvec4 result = mix(color10, color20, t);\n\treturn vec4(result.rgb, 1.0);\n}\n#endif\n"; + + var defaultnormal_vertex = "vec3 transformedNormal = normalMatrix * objectNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n"; + + var displacementmap_pars_vertex = "#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif\n"; + + var displacementmap_vertex = "#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\n#endif\n"; + + var emissivemap_fragment = "#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif\n"; + + var emissivemap_pars_fragment = "#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif\n"; + + var encodings_fragment = " gl_FragColor = linearToOutputTexel( gl_FragColor );\n"; + + var encodings_pars_fragment = "\nvec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.xyz, vec3( gammaFactor ) ), value.w );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.xyz, vec3( 1.0 / gammaFactor ) ), value.w );\n}\nvec4 sRGBToLinear( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.w );\n}\nvec4 LinearTosRGB( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.w );\n}\nvec4 RGBEToLinear( in vec4 value ) {\n\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\n}\nvec4 LinearToRGBE( in vec4 value ) {\n\tfloat maxComponent = max( max( value.r, value.g ), value.b );\n\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\n\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\n}\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.xyz * value.w * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\n\tfloat M = clamp( maxRGB / maxRange, 0.0, 1.0 );\n\tM = ceil( M * 255.0 ) / 255.0;\n\treturn vec4( value.rgb / ( M * maxRange ), M );\n}\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\n}\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\n\tfloat D = max( maxRange / maxRGB, 1.0 );\n\tD = min( floor( D ) / 255.0, 1.0 );\n\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\n}\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\nvec4 LinearToLogLuv( in vec4 value ) {\n\tvec3 Xp_Y_XYZp = value.rgb * cLogLuvM;\n\tXp_Y_XYZp = max(Xp_Y_XYZp, vec3(1e-6, 1e-6, 1e-6));\n\tvec4 vResult;\n\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\n\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\n\tvResult.w = fract(Le);\n\tvResult.z = (Le - (floor(vResult.w*255.0))/255.0)/255.0;\n\treturn vResult;\n}\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\nvec4 LogLuvToLinear( in vec4 value ) {\n\tfloat Le = value.z * 255.0 + value.w;\n\tvec3 Xp_Y_XYZp;\n\tXp_Y_XYZp.y = exp2((Le - 127.0) / 2.0);\n\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\n\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\n\tvec3 vRGB = Xp_Y_XYZp.rgb * cLogLuvInverseM;\n\treturn vec4( max(vRGB, 0.0), 1.0 );\n}\n"; + + var envmap_fragment = "#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\tvec2 sampleUV;\n\t\tsampleUV.y = asin( flipNormal * reflectVec.y ) * RECIPROCAL_PI + 0.5;\n\t\tsampleUV.x = atan( flipNormal * reflectVec.z, flipNormal * reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\tvec4 envColor = texture2D( envMap, sampleUV );\n\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\tvec3 reflectView = flipNormal * normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0, 0.0, 1.0 ) );\n\t\tvec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\tenvColor = envMapTexelToLinear( envColor );\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif\n"; + + var envmap_pars_fragment = "#if defined( USE_ENVMAP ) || defined( PHYSICAL )\n\tuniform float reflectivity;\n\tuniform float envMapIntensity;\n#endif\n#ifdef USE_ENVMAP\n\t#if ! defined( PHYSICAL ) && ( defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) )\n\t\tvarying vec3 vWorldPosition;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\tuniform float flipEnvMap;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( PHYSICAL )\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif\n"; + + var envmap_pars_vertex = "#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif\n"; + + var envmap_vertex = "#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif\n"; + + var fog_vertex = "\n#ifdef USE_FOG\nfogDepth = -mvPosition.z;\n#endif"; + + var fog_pars_vertex = "#ifdef USE_FOG\n varying float fogDepth;\n#endif\n"; + + var fog_fragment = "#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 ) );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif\n"; + + var fog_pars_fragment = "#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float fogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif\n"; + + var gradientmap_pars_fragment = "#ifdef TOON\n\tuniform sampler2D gradientMap;\n\tvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\t\tfloat dotNL = dot( normal, lightDirection );\n\t\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t\t#ifdef USE_GRADIENTMAP\n\t\t\treturn texture2D( gradientMap, coord ).rgb;\n\t\t#else\n\t\t\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\n\t\t#endif\n\t}\n#endif\n"; + + var lightmap_fragment = "#ifdef USE_LIGHTMAP\n\treflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n#endif\n"; + + var lightmap_pars_fragment = "#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif"; + + var lights_lambert_vertex = "vec3 diffuse = vec3( 1.0 );\nGeometricContext geometry;\ngeometry.position = mvPosition.xyz;\ngeometry.normal = normalize( transformedNormal );\ngeometry.viewDir = normalize( -mvPosition.xyz );\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\nvLightFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n#endif\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\n#if NUM_POINT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_DIR_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\tvLightFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\n\t\t#endif\n\t}\n#endif\n"; + + var lights_pars = "uniform vec3 ambientLightColor;\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treturn irradiance;\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tdirectLight.color = directionalLight.color;\n\t\tdirectLight.direction = directionalLight.direction;\n\t\tdirectLight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tdirectLight.color = pointLight.color;\n\t\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\n\t\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tfloat angleCos = dot( directLight.direction, spotLight.direction );\n\t\tif ( angleCos > spotLight.coneCos ) {\n\t\t\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\t\tdirectLight.color = spotLight.color;\n\t\t\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tdirectLight.visible = true;\n\t\t} else {\n\t\t\tdirectLight.color = vec3( 0.0 );\n\t\t\tdirectLight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltcMat;\tuniform sampler2D ltcMag;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\n\t\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tirradiance *= PI;\n\t\t#endif\n\t\treturn irradiance;\n\t}\n#endif\n#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\n\t\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\tvec4 envMapColor = textureCubeUV( queryVec, 1.0 );\n\t\t#else\n\t\t\tvec4 envMapColor = vec4( 0.0 );\n\t\t#endif\n\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t}\n\tfloat getSpecularMIPLevel( const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\tfloat maxMIPLevelScalar = float( maxMIPLevel );\n\t\tfloat desiredMIPLevel = maxMIPLevelScalar - 0.79248 - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 );\n\t\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\n\t}\n\tvec3 getLightProbeIndirectRadiance( const in GeometricContext geometry, const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( -geometry.viewDir, geometry.normal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( -geometry.viewDir, geometry.normal, refractionRatio );\n\t\t#endif\n\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\tfloat specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, maxMIPLevel );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\tvec4 envMapColor = textureCubeUV(queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent));\n\t\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\t\tvec2 sampleUV;\n\t\t\tsampleUV.y = saturate( reflectVec.y * 0.5 + 0.5 );\n\t\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#endif\n\t\treturn envMapColor.rgb * envMapIntensity;\n\t}\n#endif\n"; + + var lights_phong_fragment = "BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;\n"; + + var lights_phong_pars_fragment = "varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct BlinnPhongMaterial {\n\tvec3\tdiffuseColor;\n\tvec3\tspecularColor;\n\tfloat\tspecularShininess;\n\tfloat\tspecularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifdef TOON\n\t\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\t#else\n\t\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\t\tvec3 irradiance = dotNL * directLight.color;\n\t#endif\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n#define Material_LightProbeLOD( material )\t(0)\n"; + + var lights_physical_fragment = "PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nmaterial.specularRoughness = clamp( roughnessFactor, 0.04, 1.0 );\n#ifdef STANDARD\n\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.clearCoat = saturate( clearCoat );\tmaterial.clearCoatRoughness = clamp( clearCoatRoughness, 0.04, 1.0 );\n#endif\n"; + + var lights_physical_pars_fragment = "struct PhysicalMaterial {\n\tvec3\tdiffuseColor;\n\tfloat\tspecularRoughness;\n\tvec3\tspecularColor;\n\t#ifndef STANDARD\n\t\tfloat clearCoat;\n\t\tfloat clearCoatRoughness;\n\t#endif\n};\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\nfloat clearCoatDHRApprox( const in float roughness, const in float dotNL ) {\n\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.specularRoughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos - halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos + halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos + halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos - halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tfloat norm = texture2D( ltcMag, uv ).a;\n\t\tvec4 t = texture2D( ltcMat, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( 1, 0, t.y ),\n\t\t\tvec3( 0, t.z, 0 ),\n\t\t\tvec3( t.w, 0, t.x )\n\t\t);\n\t\treflectedLight.directSpecular += lightColor * material.specularColor * norm * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\t#ifndef STANDARD\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.directSpecular += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry, material.specularColor, material.specularRoughness );\n\treflectedLight.directDiffuse += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\t#ifndef STANDARD\n\t\treflectedLight.directSpecular += irradiance * material.clearCoat * BRDF_Specular_GGX( directLight, geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 clearCoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifndef STANDARD\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\tfloat dotNL = dotNV;\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.indirectSpecular += ( 1.0 - clearCoatDHR ) * radiance * BRDF_Specular_GGX_Environment( geometry, material.specularColor, material.specularRoughness );\n\t#ifndef STANDARD\n\t\treflectedLight.indirectSpecular += clearCoatRadiance * material.clearCoat * BRDF_Specular_GGX_Environment( geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\n#define Material_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.specularRoughness )\n#define Material_ClearCoat_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.clearCoatRoughness )\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}\n"; + + var lights_template = "\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = normalize( vViewPosition );\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( pointLight.shadow, directLight.visible ) ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( spotLight.shadow, directLight.visible ) ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( directionalLight.shadow, directLight.visible ) ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\t#ifdef USE_LIGHTMAP\n\t\tvec3 lightMapIrradiance = texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tlightMapIrradiance *= PI;\n\t\t#endif\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t}\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tirradiance += getLightProbeIndirectIrradiance( geometry, 8 );\n\t#endif\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tvec3 radiance = getLightProbeIndirectRadiance( geometry, Material_BlinnShininessExponent( material ), 8 );\n\t#ifndef STANDARD\n\t\tvec3 clearCoatRadiance = getLightProbeIndirectRadiance( geometry, Material_ClearCoat_BlinnShininessExponent( material ), 8 );\n\t#else\n\t\tvec3 clearCoatRadiance = vec3( 0.0 );\n\t#endif\n\tRE_IndirectSpecular( radiance, clearCoatRadiance, geometry, material, reflectedLight );\n#endif\n"; + + var logdepthbuf_fragment = "#if defined(USE_LOGDEPTHBUF) && defined(USE_LOGDEPTHBUF_EXT)\n\tgl_FragDepthEXT = log2(vFragDepth) * logDepthBufFC * 0.5;\n#endif"; + + var logdepthbuf_pars_fragment = "#ifdef USE_LOGDEPTHBUF\n\tuniform float logDepthBufFC;\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n#endif\n"; + + var logdepthbuf_pars_vertex = "#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n\tuniform float logDepthBufFC;\n#endif"; + + var logdepthbuf_vertex = "#ifdef USE_LOGDEPTHBUF\n\tgl_Position.z = log2(max( EPSILON, gl_Position.w + 1.0 )) * logDepthBufFC;\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t#else\n\t\tgl_Position.z = (gl_Position.z - 1.0) * gl_Position.w;\n\t#endif\n#endif\n"; + + var map_fragment = "#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif\n"; + + var map_pars_fragment = "#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n"; + + var map_particle_fragment = "#ifdef USE_MAP\n\tvec4 mapTexel = texture2D( map, vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y ) * offsetRepeat.zw + offsetRepeat.xy );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n"; + + var map_particle_pars_fragment = "#ifdef USE_MAP\n\tuniform vec4 offsetRepeat;\n\tuniform sampler2D map;\n#endif\n"; + + var metalnessmap_fragment = "float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif\n"; + + var metalnessmap_pars_fragment = "#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif"; + + var morphnormal_vertex = "#ifdef USE_MORPHNORMALS\n\tobjectNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\n\tobjectNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\n\tobjectNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\n\tobjectNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\n#endif\n"; + + var morphtarget_pars_vertex = "#ifdef USE_MORPHTARGETS\n\t#ifndef USE_MORPHNORMALS\n\tuniform float morphTargetInfluences[ 8 ];\n\t#else\n\tuniform float morphTargetInfluences[ 4 ];\n\t#endif\n#endif"; + + var morphtarget_vertex = "#ifdef USE_MORPHTARGETS\n\ttransformed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\n\ttransformed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\n\ttransformed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\n\ttransformed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\n\t#ifndef USE_MORPHNORMALS\n\ttransformed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\n\ttransformed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\n\ttransformed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\n\ttransformed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\n\t#endif\n#endif\n"; + + var normal_flip = "#ifdef DOUBLE_SIDED\n\tfloat flipNormal = ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n#else\n\tfloat flipNormal = 1.0;\n#endif\n"; + + var normal_fragment = "#ifdef FLAT_SHADED\n\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\n\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal ) * flipNormal;\n#endif\n#ifdef USE_NORMALMAP\n\tnormal = perturbNormal2Arb( -vViewPosition, normal );\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\n#endif\n"; + + var normalmap_pars_fragment = "#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\n\t\tvec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\n\t\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\t\tvec3 S = normalize( q0 * st1.t - q1 * st0.t );\n\t\tvec3 T = normalize( -q0 * st1.s + q1 * st0.s );\n\t\tvec3 N = normalize( surf_norm );\n\t\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t\tmapN.xy = normalScale * mapN.xy;\n\t\tmat3 tsn = mat3( S, T, N );\n\t\treturn normalize( tsn * mapN );\n\t}\n#endif\n"; + + var packing = "vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 1.0 - 2.0 * rgb.xyz;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n\treturn linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn (( near + viewZ ) * far ) / (( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\n}\n"; + + var premultiplied_alpha_fragment = "#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif\n"; + + var project_vertex = "vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\ngl_Position = projectionMatrix * mvPosition;\n"; + + var dithering_fragment = "#if defined( DITHERING )\n gl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif\n"; + + var dithering_pars_fragment = "#if defined( DITHERING )\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif\n"; + + var roughnessmap_fragment = "float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\n#endif\n"; + + var roughnessmap_pars_fragment = "#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif"; + + var shadowmap_pars_fragment = "#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tfloat texture2DShadowLerp( sampler2D depths, vec2 size, vec2 uv, float compare ) {\n\t\tconst vec2 offset = vec2( 0.0, 1.0 );\n\t\tvec2 texelSize = vec2( 1.0 ) / size;\n\t\tvec2 centroidUV = floor( uv * size + 0.5 ) / size;\n\t\tfloat lb = texture2DCompare( depths, centroidUV + texelSize * offset.xx, compare );\n\t\tfloat lt = texture2DCompare( depths, centroidUV + texelSize * offset.xy, compare );\n\t\tfloat rb = texture2DCompare( depths, centroidUV + texelSize * offset.yx, compare );\n\t\tfloat rt = texture2DCompare( depths, centroidUV + texelSize * offset.yy, compare );\n\t\tvec2 f = fract( uv * size + 0.5 );\n\t\tfloat a = mix( lb, lt, f.y );\n\t\tfloat b = mix( rb, rt, f.y );\n\t\tfloat c = mix( a, b, f.x );\n\t\treturn c;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tfloat shadow = 1.0;\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n\t\tbool inFrustum = all( inFrustumVec );\n\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\t\tbool frustumTest = all( frustumTestVec );\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tshadow = (\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn shadow;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\tfloat dp = ( length( lightToPosition ) - shadowBias ) / 1000.0;\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif\n"; + + var shadowmap_pars_vertex = "#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n#endif\n"; + + var shadowmap_vertex = "#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n#endif\n"; + + var shadowmask_pars_fragment = "float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\tDirectionalLight directionalLight;\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tshadow *= bool( directionalLight.shadow ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\tSpotLight spotLight;\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tshadow *= bool( spotLight.shadow ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\tPointLight pointLight;\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tshadow *= bool( pointLight.shadow ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#endif\n\treturn shadow;\n}\n"; + + var skinbase_vertex = "#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif"; + + var skinning_pars_vertex = "#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\t#ifdef BONE_TEXTURE\n\t\tuniform sampler2D boneTexture;\n\t\tuniform int boneTextureSize;\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureSize ) );\n\t\t\tfloat y = floor( j / float( boneTextureSize ) );\n\t\t\tfloat dx = 1.0 / float( boneTextureSize );\n\t\t\tfloat dy = 1.0 / float( boneTextureSize );\n\t\t\ty = dy * ( y + 0.5 );\n\t\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\t\t\treturn bone;\n\t\t}\n\t#else\n\t\tuniform mat4 boneMatrices[ MAX_BONES ];\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tmat4 bone = boneMatrices[ int(i) ];\n\t\t\treturn bone;\n\t\t}\n\t#endif\n#endif\n"; + + var skinning_vertex = "#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif\n"; + + var skinnormal_vertex = "#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n#endif\n"; + + var specularmap_fragment = "float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif"; + + var specularmap_pars_fragment = "#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif"; + + var tonemapping_fragment = "#if defined( TONE_MAPPING )\n gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif\n"; + + var tonemapping_pars_fragment = "#define saturate(a) clamp( a, 0.0, 1.0 )\nuniform float toneMappingExposure;\nuniform float toneMappingWhitePoint;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\nvec3 Uncharted2ToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\n"; + + var uv_pars_fragment = "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n#endif"; + + var uv_pars_vertex = "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n\tuniform vec4 offsetRepeat;\n#endif\n"; + + var uv_vertex = "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvUv = uv * offsetRepeat.zw + offsetRepeat.xy;\n#endif"; + + var uv2_pars_fragment = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif"; + + var uv2_pars_vertex = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n#endif"; + + var uv2_vertex = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = uv2;\n#endif"; + + var worldpos_vertex = "#if defined( USE_ENVMAP ) || defined( PHONG ) || defined( PHYSICAL ) || defined( LAMBERT ) || defined ( USE_SHADOWMAP )\n\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\n#endif\n"; + + var cube_frag = "uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\n\tgl_FragColor.a *= opacity;\n}\n"; + + var cube_vert = "varying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}\n"; + + var depth_frag = "#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <logdepthbuf_fragment>\n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( gl_FragCoord.z ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( gl_FragCoord.z );\n\t#endif\n}\n"; + + var depth_vert = "#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n}\n"; + + var distanceRGBA_frag = "uniform vec3 lightPos;\nvarying vec4 vWorldPosition;\n#include <common>\n#include <packing>\n#include <clipping_planes_pars_fragment>\nvoid main () {\n\t#include <clipping_planes_fragment>\n\tgl_FragColor = packDepthToRGBA( length( vWorldPosition.xyz - lightPos.xyz ) / 1000.0 );\n}\n"; + + var distanceRGBA_vert = "varying vec4 vWorldPosition;\n#include <common>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <skinbase_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\tvWorldPosition = worldPosition;\n}\n"; + + var equirect_frag = "uniform sampler2D tEquirect;\nuniform float tFlip;\nvarying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvec3 direction = normalize( vWorldPosition );\n\tvec2 sampleUV;\n\tsampleUV.y = saturate( tFlip * direction.y * -0.5 + 0.5 );\n\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n}\n"; + + var equirect_vert = "varying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}\n"; + + var linedashed_frag = "uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <color_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n"; + + var linedashed_vert = "uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <color_vertex>\n\tvLineDistance = scale * lineDistance;\n\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n}\n"; + + var meshbasic_frag = "uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\treflectedLight.indirectDiffuse += texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include <aomap_fragment>\n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include <normal_flip>\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n"; + + var meshbasic_vert = "#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_ENVMAP\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <envmap_vertex>\n\t#include <fog_vertex>\n}\n"; + + var meshlambert_frag = "uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <bsdfs>\n#include <lights_pars>\n#include <fog_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <emissivemap_fragment>\n\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\n\t#include <lightmap_fragment>\n\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\t#else\n\t\treflectedLight.directDiffuse = vLightFront;\n\t#endif\n\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include <normal_flip>\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}\n"; + + var meshlambert_vert = "#define LAMBERT\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <bsdfs>\n#include <lights_pars>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <lights_lambert_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n"; + + var meshphong_frag = "#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <gradientmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars>\n#include <lights_phong_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <normal_flip>\n\t#include <normal_fragment>\n\t#include <emissivemap_fragment>\n\t#include <lights_phong_fragment>\n\t#include <lights_template>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}\n"; + + var meshphong_vert = "#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n"; + + var meshphysical_frag = "#define PHYSICAL\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifndef STANDARD\n\tuniform float clearCoat;\n\tuniform float clearCoatRoughness;\n#endif\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <cube_uv_reflection_fragment>\n#include <lights_pars>\n#include <lights_physical_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <roughnessmap_pars_fragment>\n#include <metalnessmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <roughnessmap_fragment>\n\t#include <metalnessmap_fragment>\n\t#include <normal_flip>\n\t#include <normal_fragment>\n\t#include <emissivemap_fragment>\n\t#include <lights_physical_fragment>\n\t#include <lights_template>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}\n"; + + var meshphysical_vert = "#define PHYSICAL\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n"; + + var normal_frag = "#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <packing>\n#include <uv_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\nvoid main() {\n\t#include <logdepthbuf_fragment>\n\t#include <normal_flip>\n\t#include <normal_fragment>\n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n}\n"; + + var normal_vert = "#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}\n"; + + var points_frag = "uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <color_pars_fragment>\n#include <map_particle_pars_fragment>\n#include <fog_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_particle_fragment>\n\t#include <color_fragment>\n\t#include <alphatest_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n"; + + var points_vert = "uniform float size;\nuniform float scale;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <color_vertex>\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\t#ifdef USE_SIZEATTENUATION\n\t\tgl_PointSize = size * ( scale / - mvPosition.z );\n\t#else\n\t\tgl_PointSize = size;\n\t#endif\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n"; + + var shadow_frag = "uniform float opacity;\n#include <common>\n#include <packing>\n#include <bsdfs>\n#include <lights_pars>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\nvoid main() {\n\tgl_FragColor = vec4( 0.0, 0.0, 0.0, opacity * ( 1.0 - getShadowMask() ) );\n}\n"; + + var shadow_vert = "#include <shadowmap_pars_vertex>\nvoid main() {\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n}\n"; + + var ShaderChunk = { + alphamap_fragment: alphamap_fragment, + alphamap_pars_fragment: alphamap_pars_fragment, + alphatest_fragment: alphatest_fragment, + aomap_fragment: aomap_fragment, + aomap_pars_fragment: aomap_pars_fragment, + begin_vertex: begin_vertex, + beginnormal_vertex: beginnormal_vertex, + bsdfs: bsdfs, + bumpmap_pars_fragment: bumpmap_pars_fragment, + clipping_planes_fragment: clipping_planes_fragment, + clipping_planes_pars_fragment: clipping_planes_pars_fragment, + clipping_planes_pars_vertex: clipping_planes_pars_vertex, + clipping_planes_vertex: clipping_planes_vertex, + color_fragment: color_fragment, + color_pars_fragment: color_pars_fragment, + color_pars_vertex: color_pars_vertex, + color_vertex: color_vertex, + common: common, + cube_uv_reflection_fragment: cube_uv_reflection_fragment, + defaultnormal_vertex: defaultnormal_vertex, + displacementmap_pars_vertex: displacementmap_pars_vertex, + displacementmap_vertex: displacementmap_vertex, + emissivemap_fragment: emissivemap_fragment, + emissivemap_pars_fragment: emissivemap_pars_fragment, + encodings_fragment: encodings_fragment, + encodings_pars_fragment: encodings_pars_fragment, + envmap_fragment: envmap_fragment, + envmap_pars_fragment: envmap_pars_fragment, + envmap_pars_vertex: envmap_pars_vertex, + envmap_vertex: envmap_vertex, + fog_vertex: fog_vertex, + fog_pars_vertex: fog_pars_vertex, + fog_fragment: fog_fragment, + fog_pars_fragment: fog_pars_fragment, + gradientmap_pars_fragment: gradientmap_pars_fragment, + lightmap_fragment: lightmap_fragment, + lightmap_pars_fragment: lightmap_pars_fragment, + lights_lambert_vertex: lights_lambert_vertex, + lights_pars: lights_pars, + lights_phong_fragment: lights_phong_fragment, + lights_phong_pars_fragment: lights_phong_pars_fragment, + lights_physical_fragment: lights_physical_fragment, + lights_physical_pars_fragment: lights_physical_pars_fragment, + lights_template: lights_template, + logdepthbuf_fragment: logdepthbuf_fragment, + logdepthbuf_pars_fragment: logdepthbuf_pars_fragment, + logdepthbuf_pars_vertex: logdepthbuf_pars_vertex, + logdepthbuf_vertex: logdepthbuf_vertex, + map_fragment: map_fragment, + map_pars_fragment: map_pars_fragment, + map_particle_fragment: map_particle_fragment, + map_particle_pars_fragment: map_particle_pars_fragment, + metalnessmap_fragment: metalnessmap_fragment, + metalnessmap_pars_fragment: metalnessmap_pars_fragment, + morphnormal_vertex: morphnormal_vertex, + morphtarget_pars_vertex: morphtarget_pars_vertex, + morphtarget_vertex: morphtarget_vertex, + normal_flip: normal_flip, + normal_fragment: normal_fragment, + normalmap_pars_fragment: normalmap_pars_fragment, + packing: packing, + premultiplied_alpha_fragment: premultiplied_alpha_fragment, + project_vertex: project_vertex, + dithering_fragment: dithering_fragment, + dithering_pars_fragment: dithering_pars_fragment, + roughnessmap_fragment: roughnessmap_fragment, + roughnessmap_pars_fragment: roughnessmap_pars_fragment, + shadowmap_pars_fragment: shadowmap_pars_fragment, + shadowmap_pars_vertex: shadowmap_pars_vertex, + shadowmap_vertex: shadowmap_vertex, + shadowmask_pars_fragment: shadowmask_pars_fragment, + skinbase_vertex: skinbase_vertex, + skinning_pars_vertex: skinning_pars_vertex, + skinning_vertex: skinning_vertex, + skinnormal_vertex: skinnormal_vertex, + specularmap_fragment: specularmap_fragment, + specularmap_pars_fragment: specularmap_pars_fragment, + tonemapping_fragment: tonemapping_fragment, + tonemapping_pars_fragment: tonemapping_pars_fragment, + uv_pars_fragment: uv_pars_fragment, + uv_pars_vertex: uv_pars_vertex, + uv_vertex: uv_vertex, + uv2_pars_fragment: uv2_pars_fragment, + uv2_pars_vertex: uv2_pars_vertex, + uv2_vertex: uv2_vertex, + worldpos_vertex: worldpos_vertex, + + cube_frag: cube_frag, + cube_vert: cube_vert, + depth_frag: depth_frag, + depth_vert: depth_vert, + distanceRGBA_frag: distanceRGBA_frag, + distanceRGBA_vert: distanceRGBA_vert, + equirect_frag: equirect_frag, + equirect_vert: equirect_vert, + linedashed_frag: linedashed_frag, + linedashed_vert: linedashed_vert, + meshbasic_frag: meshbasic_frag, + meshbasic_vert: meshbasic_vert, + meshlambert_frag: meshlambert_frag, + meshlambert_vert: meshlambert_vert, + meshphong_frag: meshphong_frag, + meshphong_vert: meshphong_vert, + meshphysical_frag: meshphysical_frag, + meshphysical_vert: meshphysical_vert, + normal_frag: normal_frag, + normal_vert: normal_vert, + points_frag: points_frag, + points_vert: points_vert, + shadow_frag: shadow_frag, + shadow_vert: shadow_vert + }; + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + * @author mikael emtinger / http://gomo.se/ + */ + + var ShaderLib = { + + basic: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.fog + ] ), + + vertexShader: ShaderChunk.meshbasic_vert, + fragmentShader: ShaderChunk.meshbasic_frag + + }, + + lambert: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.fog, + UniformsLib.lights, + { + emissive: { value: new Color( 0x000000 ) } + } + ] ), + + vertexShader: ShaderChunk.meshlambert_vert, + fragmentShader: ShaderChunk.meshlambert_frag + + }, + + phong: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + UniformsLib.gradientmap, + UniformsLib.fog, + UniformsLib.lights, + { + emissive: { value: new Color( 0x000000 ) }, + specular: { value: new Color( 0x111111 ) }, + shininess: { value: 30 } + } + ] ), + + vertexShader: ShaderChunk.meshphong_vert, + fragmentShader: ShaderChunk.meshphong_frag + + }, + + standard: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + UniformsLib.roughnessmap, + UniformsLib.metalnessmap, + UniformsLib.fog, + UniformsLib.lights, + { + emissive: { value: new Color( 0x000000 ) }, + roughness: { value: 0.5 }, + metalness: { value: 0.5 }, + envMapIntensity: { value: 1 } // temporary + } + ] ), + + vertexShader: ShaderChunk.meshphysical_vert, + fragmentShader: ShaderChunk.meshphysical_frag + + }, + + points: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.points, + UniformsLib.fog + ] ), + + vertexShader: ShaderChunk.points_vert, + fragmentShader: ShaderChunk.points_frag + + }, + + dashed: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.fog, + { + scale: { value: 1 }, + dashSize: { value: 1 }, + totalSize: { value: 2 } + } + ] ), + + vertexShader: ShaderChunk.linedashed_vert, + fragmentShader: ShaderChunk.linedashed_frag + + }, + + depth: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.displacementmap + ] ), + + vertexShader: ShaderChunk.depth_vert, + fragmentShader: ShaderChunk.depth_frag + + }, + + normal: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + { + opacity: { value: 1.0 } + } + ] ), + + vertexShader: ShaderChunk.normal_vert, + fragmentShader: ShaderChunk.normal_frag + + }, + + /* ------------------------------------------------------------------------- + // Cube map shader + ------------------------------------------------------------------------- */ + + cube: { + + uniforms: { + tCube: { value: null }, + tFlip: { value: - 1 }, + opacity: { value: 1.0 } + }, + + vertexShader: ShaderChunk.cube_vert, + fragmentShader: ShaderChunk.cube_frag + + }, + + /* ------------------------------------------------------------------------- + // Cube map shader + ------------------------------------------------------------------------- */ + + equirect: { + + uniforms: { + tEquirect: { value: null }, + tFlip: { value: - 1 } + }, + + vertexShader: ShaderChunk.equirect_vert, + fragmentShader: ShaderChunk.equirect_frag + + }, + + distanceRGBA: { + + uniforms: { + lightPos: { value: new Vector3() } + }, + + vertexShader: ShaderChunk.distanceRGBA_vert, + fragmentShader: ShaderChunk.distanceRGBA_frag + + } + + }; + + ShaderLib.physical = { + + uniforms: UniformsUtils.merge( [ + ShaderLib.standard.uniforms, + { + clearCoat: { value: 0 }, + clearCoatRoughness: { value: 0 } + } + ] ), + + vertexShader: ShaderChunk.meshphysical_vert, + fragmentShader: ShaderChunk.meshphysical_frag + + }; + + /** + * @author bhouston / http://clara.io + */ + + function Box2( min, max ) { + + this.min = ( min !== undefined ) ? min : new Vector2( + Infinity, + Infinity ); + this.max = ( max !== undefined ) ? max : new Vector2( - Infinity, - Infinity ); + + } + + Object.assign( Box2.prototype, { + + set: function ( min, max ) { + + this.min.copy( min ); + this.max.copy( max ); + + return this; + + }, + + setFromPoints: function ( points ) { + + this.makeEmpty(); + + for ( var i = 0, il = points.length; i < il; i ++ ) { + + this.expandByPoint( points[ i ] ); + + } + + return this; + + }, + + setFromCenterAndSize: function () { + + var v1 = new Vector2(); + + return function setFromCenterAndSize( center, size ) { + + var halfSize = v1.copy( size ).multiplyScalar( 0.5 ); + this.min.copy( center ).sub( halfSize ); + this.max.copy( center ).add( halfSize ); + + return this; + + }; + + }(), + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( box ) { + + this.min.copy( box.min ); + this.max.copy( box.max ); + + return this; + + }, + + makeEmpty: function () { + + this.min.x = this.min.y = + Infinity; + this.max.x = this.max.y = - Infinity; + + return this; + + }, + + isEmpty: function () { + + // this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes + + return ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ); + + }, + + getCenter: function ( optionalTarget ) { + + var result = optionalTarget || new Vector2(); + return this.isEmpty() ? result.set( 0, 0 ) : result.addVectors( this.min, this.max ).multiplyScalar( 0.5 ); + + }, + + getSize: function ( optionalTarget ) { + + var result = optionalTarget || new Vector2(); + return this.isEmpty() ? result.set( 0, 0 ) : result.subVectors( this.max, this.min ); + + }, + + expandByPoint: function ( point ) { + + this.min.min( point ); + this.max.max( point ); + + return this; + + }, + + expandByVector: function ( vector ) { + + this.min.sub( vector ); + this.max.add( vector ); + + return this; + + }, + + expandByScalar: function ( scalar ) { + + this.min.addScalar( - scalar ); + this.max.addScalar( scalar ); + + return this; + + }, + + containsPoint: function ( point ) { + + return point.x < this.min.x || point.x > this.max.x || + point.y < this.min.y || point.y > this.max.y ? false : true; + + }, + + containsBox: function ( box ) { + + return this.min.x <= box.min.x && box.max.x <= this.max.x && + this.min.y <= box.min.y && box.max.y <= this.max.y; + + }, + + getParameter: function ( point, optionalTarget ) { + + // This can potentially have a divide by zero if the box + // has a size dimension of 0. + + var result = optionalTarget || new Vector2(); + + return result.set( + ( point.x - this.min.x ) / ( this.max.x - this.min.x ), + ( point.y - this.min.y ) / ( this.max.y - this.min.y ) + ); + + }, + + intersectsBox: function ( box ) { + + // using 4 splitting planes to rule out intersections + + return box.max.x < this.min.x || box.min.x > this.max.x || + box.max.y < this.min.y || box.min.y > this.max.y ? false : true; + + }, + + clampPoint: function ( point, optionalTarget ) { + + var result = optionalTarget || new Vector2(); + return result.copy( point ).clamp( this.min, this.max ); + + }, + + distanceToPoint: function () { + + var v1 = new Vector2(); + + return function distanceToPoint( point ) { + + var clampedPoint = v1.copy( point ).clamp( this.min, this.max ); + return clampedPoint.sub( point ).length(); + + }; + + }(), + + intersect: function ( box ) { + + this.min.max( box.min ); + this.max.min( box.max ); + + return this; + + }, + + union: function ( box ) { + + this.min.min( box.min ); + this.max.max( box.max ); + + return this; + + }, + + translate: function ( offset ) { + + this.min.add( offset ); + this.max.add( offset ); + + return this; + + }, + + equals: function ( box ) { + + return box.min.equals( this.min ) && box.max.equals( this.max ); + + } + + } ); + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + */ + + function LensFlarePlugin( renderer, flares ) { + + var gl = renderer.context; + var state = renderer.state; + + var vertexBuffer, elementBuffer; + var shader, program, attributes, uniforms; + + var tempTexture, occlusionTexture; + + function init() { + + var vertices = new Float32Array( [ + - 1, - 1, 0, 0, + 1, - 1, 1, 0, + 1, 1, 1, 1, + - 1, 1, 0, 1 + ] ); + + var faces = new Uint16Array( [ + 0, 1, 2, + 0, 2, 3 + ] ); + + // buffers + + vertexBuffer = gl.createBuffer(); + elementBuffer = gl.createBuffer(); + + gl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer ); + gl.bufferData( gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW ); + + gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer ); + gl.bufferData( gl.ELEMENT_ARRAY_BUFFER, faces, gl.STATIC_DRAW ); + + // textures + + tempTexture = gl.createTexture(); + occlusionTexture = gl.createTexture(); + + state.bindTexture( gl.TEXTURE_2D, tempTexture ); + gl.texImage2D( gl.TEXTURE_2D, 0, gl.RGB, 16, 16, 0, gl.RGB, gl.UNSIGNED_BYTE, null ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST ); + + state.bindTexture( gl.TEXTURE_2D, occlusionTexture ); + gl.texImage2D( gl.TEXTURE_2D, 0, gl.RGBA, 16, 16, 0, gl.RGBA, gl.UNSIGNED_BYTE, null ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST ); + + shader = { + + vertexShader: [ + + "uniform lowp int renderType;", + + "uniform vec3 screenPosition;", + "uniform vec2 scale;", + "uniform float rotation;", + + "uniform sampler2D occlusionMap;", + + "attribute vec2 position;", + "attribute vec2 uv;", + + "varying vec2 vUV;", + "varying float vVisibility;", + + "void main() {", + + "vUV = uv;", + + "vec2 pos = position;", + + "if ( renderType == 2 ) {", + + "vec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.5, 0.1 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.9, 0.1 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.9, 0.9 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.1, 0.9 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.5, 0.5 ) );", + + "vVisibility = visibility.r / 9.0;", + "vVisibility *= 1.0 - visibility.g / 9.0;", + "vVisibility *= visibility.b / 9.0;", + "vVisibility *= 1.0 - visibility.a / 9.0;", + + "pos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;", + "pos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;", + + "}", + + "gl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );", + + "}" + + ].join( "\n" ), + + fragmentShader: [ + + "uniform lowp int renderType;", + + "uniform sampler2D map;", + "uniform float opacity;", + "uniform vec3 color;", + + "varying vec2 vUV;", + "varying float vVisibility;", + + "void main() {", + + // pink square + + "if ( renderType == 0 ) {", + + "gl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );", + + // restore + + "} else if ( renderType == 1 ) {", + + "gl_FragColor = texture2D( map, vUV );", + + // flare + + "} else {", + + "vec4 texture = texture2D( map, vUV );", + "texture.a *= opacity * vVisibility;", + "gl_FragColor = texture;", + "gl_FragColor.rgb *= color;", + + "}", + + "}" + + ].join( "\n" ) + + }; + + program = createProgram( shader ); + + attributes = { + vertex: gl.getAttribLocation ( program, "position" ), + uv: gl.getAttribLocation ( program, "uv" ) + }; + + uniforms = { + renderType: gl.getUniformLocation( program, "renderType" ), + map: gl.getUniformLocation( program, "map" ), + occlusionMap: gl.getUniformLocation( program, "occlusionMap" ), + opacity: gl.getUniformLocation( program, "opacity" ), + color: gl.getUniformLocation( program, "color" ), + scale: gl.getUniformLocation( program, "scale" ), + rotation: gl.getUniformLocation( program, "rotation" ), + screenPosition: gl.getUniformLocation( program, "screenPosition" ) + }; + + } + + /* + * Render lens flares + * Method: renders 16x16 0xff00ff-colored points scattered over the light source area, + * reads these back and calculates occlusion. + */ + + this.render = function ( scene, camera, viewport ) { + + if ( flares.length === 0 ) return; + + var tempPosition = new Vector3(); + + var invAspect = viewport.w / viewport.z, + halfViewportWidth = viewport.z * 0.5, + halfViewportHeight = viewport.w * 0.5; + + var size = 16 / viewport.w, + scale = new Vector2( size * invAspect, size ); + + var screenPosition = new Vector3( 1, 1, 0 ), + screenPositionPixels = new Vector2( 1, 1 ); + + var validArea = new Box2(); + + validArea.min.set( viewport.x, viewport.y ); + validArea.max.set( viewport.x + ( viewport.z - 16 ), viewport.y + ( viewport.w - 16 ) ); + + if ( program === undefined ) { + + init(); + + } + + gl.useProgram( program ); + + state.initAttributes(); + state.enableAttribute( attributes.vertex ); + state.enableAttribute( attributes.uv ); + state.disableUnusedAttributes(); + + // loop through all lens flares to update their occlusion and positions + // setup gl and common used attribs/uniforms + + gl.uniform1i( uniforms.occlusionMap, 0 ); + gl.uniform1i( uniforms.map, 1 ); + + gl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer ); + gl.vertexAttribPointer( attributes.vertex, 2, gl.FLOAT, false, 2 * 8, 0 ); + gl.vertexAttribPointer( attributes.uv, 2, gl.FLOAT, false, 2 * 8, 8 ); + + gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer ); + + state.disable( gl.CULL_FACE ); + state.buffers.depth.setMask( false ); + + for ( var i = 0, l = flares.length; i < l; i ++ ) { + + size = 16 / viewport.w; + scale.set( size * invAspect, size ); + + // calc object screen position + + var flare = flares[ i ]; + + tempPosition.set( flare.matrixWorld.elements[ 12 ], flare.matrixWorld.elements[ 13 ], flare.matrixWorld.elements[ 14 ] ); + + tempPosition.applyMatrix4( camera.matrixWorldInverse ); + tempPosition.applyMatrix4( camera.projectionMatrix ); + + // setup arrays for gl programs + + screenPosition.copy( tempPosition ); + + // horizontal and vertical coordinate of the lower left corner of the pixels to copy + + screenPositionPixels.x = viewport.x + ( screenPosition.x * halfViewportWidth ) + halfViewportWidth - 8; + screenPositionPixels.y = viewport.y + ( screenPosition.y * halfViewportHeight ) + halfViewportHeight - 8; + + // screen cull + + if ( validArea.containsPoint( screenPositionPixels ) === true ) { + + // save current RGB to temp texture + + state.activeTexture( gl.TEXTURE0 ); + state.bindTexture( gl.TEXTURE_2D, null ); + state.activeTexture( gl.TEXTURE1 ); + state.bindTexture( gl.TEXTURE_2D, tempTexture ); + gl.copyTexImage2D( gl.TEXTURE_2D, 0, gl.RGB, screenPositionPixels.x, screenPositionPixels.y, 16, 16, 0 ); + + + // render pink quad + + gl.uniform1i( uniforms.renderType, 0 ); + gl.uniform2f( uniforms.scale, scale.x, scale.y ); + gl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z ); + + state.disable( gl.BLEND ); + state.enable( gl.DEPTH_TEST ); + + gl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 ); + + + // copy result to occlusionMap + + state.activeTexture( gl.TEXTURE0 ); + state.bindTexture( gl.TEXTURE_2D, occlusionTexture ); + gl.copyTexImage2D( gl.TEXTURE_2D, 0, gl.RGBA, screenPositionPixels.x, screenPositionPixels.y, 16, 16, 0 ); + + + // restore graphics + + gl.uniform1i( uniforms.renderType, 1 ); + state.disable( gl.DEPTH_TEST ); + + state.activeTexture( gl.TEXTURE1 ); + state.bindTexture( gl.TEXTURE_2D, tempTexture ); + gl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 ); + + + // update object positions + + flare.positionScreen.copy( screenPosition ); + + if ( flare.customUpdateCallback ) { + + flare.customUpdateCallback( flare ); + + } else { + + flare.updateLensFlares(); + + } + + // render flares + + gl.uniform1i( uniforms.renderType, 2 ); + state.enable( gl.BLEND ); + + for ( var j = 0, jl = flare.lensFlares.length; j < jl; j ++ ) { + + var sprite = flare.lensFlares[ j ]; + + if ( sprite.opacity > 0.001 && sprite.scale > 0.001 ) { + + screenPosition.x = sprite.x; + screenPosition.y = sprite.y; + screenPosition.z = sprite.z; + + size = sprite.size * sprite.scale / viewport.w; + + scale.x = size * invAspect; + scale.y = size; + + gl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z ); + gl.uniform2f( uniforms.scale, scale.x, scale.y ); + gl.uniform1f( uniforms.rotation, sprite.rotation ); + + gl.uniform1f( uniforms.opacity, sprite.opacity ); + gl.uniform3f( uniforms.color, sprite.color.r, sprite.color.g, sprite.color.b ); + + state.setBlending( sprite.blending, sprite.blendEquation, sprite.blendSrc, sprite.blendDst ); + renderer.setTexture2D( sprite.texture, 1 ); + + gl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 ); + + } + + } + + } + + } + + // restore gl + + state.enable( gl.CULL_FACE ); + state.enable( gl.DEPTH_TEST ); + state.buffers.depth.setMask( true ); + + renderer.resetGLState(); + + }; + + function createProgram( shader ) { + + var program = gl.createProgram(); + + var fragmentShader = gl.createShader( gl.FRAGMENT_SHADER ); + var vertexShader = gl.createShader( gl.VERTEX_SHADER ); + + var prefix = "precision " + renderer.getPrecision() + " float;\n"; + + gl.shaderSource( fragmentShader, prefix + shader.fragmentShader ); + gl.shaderSource( vertexShader, prefix + shader.vertexShader ); + + gl.compileShader( fragmentShader ); + gl.compileShader( vertexShader ); + + gl.attachShader( program, fragmentShader ); + gl.attachShader( program, vertexShader ); + + gl.linkProgram( program ); + + return program; + + } + + } + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + */ + + function SpritePlugin( renderer, sprites ) { + + var gl = renderer.context; + var state = renderer.state; + + var vertexBuffer, elementBuffer; + var program, attributes, uniforms; + + var texture; + + // decompose matrixWorld + + var spritePosition = new Vector3(); + var spriteRotation = new Quaternion(); + var spriteScale = new Vector3(); + + function init() { + + var vertices = new Float32Array( [ + - 0.5, - 0.5, 0, 0, + 0.5, - 0.5, 1, 0, + 0.5, 0.5, 1, 1, + - 0.5, 0.5, 0, 1 + ] ); + + var faces = new Uint16Array( [ + 0, 1, 2, + 0, 2, 3 + ] ); + + vertexBuffer = gl.createBuffer(); + elementBuffer = gl.createBuffer(); + + gl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer ); + gl.bufferData( gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW ); + + gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer ); + gl.bufferData( gl.ELEMENT_ARRAY_BUFFER, faces, gl.STATIC_DRAW ); + + program = createProgram(); + + attributes = { + position: gl.getAttribLocation ( program, 'position' ), + uv: gl.getAttribLocation ( program, 'uv' ) + }; + + uniforms = { + uvOffset: gl.getUniformLocation( program, 'uvOffset' ), + uvScale: gl.getUniformLocation( program, 'uvScale' ), + + rotation: gl.getUniformLocation( program, 'rotation' ), + scale: gl.getUniformLocation( program, 'scale' ), + + color: gl.getUniformLocation( program, 'color' ), + map: gl.getUniformLocation( program, 'map' ), + opacity: gl.getUniformLocation( program, 'opacity' ), + + modelViewMatrix: gl.getUniformLocation( program, 'modelViewMatrix' ), + projectionMatrix: gl.getUniformLocation( program, 'projectionMatrix' ), + + fogType: gl.getUniformLocation( program, 'fogType' ), + fogDensity: gl.getUniformLocation( program, 'fogDensity' ), + fogNear: gl.getUniformLocation( program, 'fogNear' ), + fogFar: gl.getUniformLocation( program, 'fogFar' ), + fogColor: gl.getUniformLocation( program, 'fogColor' ), + + alphaTest: gl.getUniformLocation( program, 'alphaTest' ) + }; + + var canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); + canvas.width = 8; + canvas.height = 8; + + var context = canvas.getContext( '2d' ); + context.fillStyle = 'white'; + context.fillRect( 0, 0, 8, 8 ); + + texture = new Texture( canvas ); + texture.needsUpdate = true; + + } + + this.render = function ( scene, camera ) { + + if ( sprites.length === 0 ) return; + + // setup gl + + if ( program === undefined ) { + + init(); + + } + + gl.useProgram( program ); + + state.initAttributes(); + state.enableAttribute( attributes.position ); + state.enableAttribute( attributes.uv ); + state.disableUnusedAttributes(); + + state.disable( gl.CULL_FACE ); + state.enable( gl.BLEND ); + + gl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer ); + gl.vertexAttribPointer( attributes.position, 2, gl.FLOAT, false, 2 * 8, 0 ); + gl.vertexAttribPointer( attributes.uv, 2, gl.FLOAT, false, 2 * 8, 8 ); + + gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer ); + + gl.uniformMatrix4fv( uniforms.projectionMatrix, false, camera.projectionMatrix.elements ); + + state.activeTexture( gl.TEXTURE0 ); + gl.uniform1i( uniforms.map, 0 ); + + var oldFogType = 0; + var sceneFogType = 0; + var fog = scene.fog; + + if ( fog ) { + + gl.uniform3f( uniforms.fogColor, fog.color.r, fog.color.g, fog.color.b ); + + if ( fog.isFog ) { + + gl.uniform1f( uniforms.fogNear, fog.near ); + gl.uniform1f( uniforms.fogFar, fog.far ); + + gl.uniform1i( uniforms.fogType, 1 ); + oldFogType = 1; + sceneFogType = 1; + + } else if ( fog.isFogExp2 ) { + + gl.uniform1f( uniforms.fogDensity, fog.density ); + + gl.uniform1i( uniforms.fogType, 2 ); + oldFogType = 2; + sceneFogType = 2; + + } + + } else { + + gl.uniform1i( uniforms.fogType, 0 ); + oldFogType = 0; + sceneFogType = 0; + + } + + + // update positions and sort + + for ( var i = 0, l = sprites.length; i < l; i ++ ) { + + var sprite = sprites[ i ]; + + sprite.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, sprite.matrixWorld ); + sprite.z = - sprite.modelViewMatrix.elements[ 14 ]; + + } + + sprites.sort( painterSortStable ); + + // render all sprites + + var scale = []; + + for ( var i = 0, l = sprites.length; i < l; i ++ ) { + + var sprite = sprites[ i ]; + var material = sprite.material; + + if ( material.visible === false ) continue; + + sprite.onBeforeRender( renderer, scene, camera, undefined, material, undefined ); + + gl.uniform1f( uniforms.alphaTest, material.alphaTest ); + gl.uniformMatrix4fv( uniforms.modelViewMatrix, false, sprite.modelViewMatrix.elements ); + + sprite.matrixWorld.decompose( spritePosition, spriteRotation, spriteScale ); + + scale[ 0 ] = spriteScale.x; + scale[ 1 ] = spriteScale.y; + + var fogType = 0; + + if ( scene.fog && material.fog ) { + + fogType = sceneFogType; + + } + + if ( oldFogType !== fogType ) { + + gl.uniform1i( uniforms.fogType, fogType ); + oldFogType = fogType; + + } + + if ( material.map !== null ) { + + gl.uniform2f( uniforms.uvOffset, material.map.offset.x, material.map.offset.y ); + gl.uniform2f( uniforms.uvScale, material.map.repeat.x, material.map.repeat.y ); + + } else { + + gl.uniform2f( uniforms.uvOffset, 0, 0 ); + gl.uniform2f( uniforms.uvScale, 1, 1 ); + + } + + gl.uniform1f( uniforms.opacity, material.opacity ); + gl.uniform3f( uniforms.color, material.color.r, material.color.g, material.color.b ); + + gl.uniform1f( uniforms.rotation, material.rotation ); + gl.uniform2fv( uniforms.scale, scale ); + + state.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha ); + state.buffers.depth.setTest( material.depthTest ); + state.buffers.depth.setMask( material.depthWrite ); + + if ( material.map ) { + + renderer.setTexture2D( material.map, 0 ); + + } else { + + renderer.setTexture2D( texture, 0 ); + + } + + gl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 ); + + sprite.onAfterRender( renderer, scene, camera, undefined, material, undefined ); + + } + + // restore gl + + state.enable( gl.CULL_FACE ); + + renderer.resetGLState(); + + }; + + function createProgram() { + + var program = gl.createProgram(); + + var vertexShader = gl.createShader( gl.VERTEX_SHADER ); + var fragmentShader = gl.createShader( gl.FRAGMENT_SHADER ); + + gl.shaderSource( vertexShader, [ + + 'precision ' + renderer.getPrecision() + ' float;', + + '#define SHADER_NAME ' + 'SpriteMaterial', + + 'uniform mat4 modelViewMatrix;', + 'uniform mat4 projectionMatrix;', + 'uniform float rotation;', + 'uniform vec2 scale;', + 'uniform vec2 uvOffset;', + 'uniform vec2 uvScale;', + + 'attribute vec2 position;', + 'attribute vec2 uv;', + + 'varying vec2 vUV;', + + 'void main() {', + + 'vUV = uvOffset + uv * uvScale;', + + 'vec2 alignedPosition = position * scale;', + + 'vec2 rotatedPosition;', + 'rotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;', + 'rotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;', + + 'vec4 finalPosition;', + + 'finalPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );', + 'finalPosition.xy += rotatedPosition;', + 'finalPosition = projectionMatrix * finalPosition;', + + 'gl_Position = finalPosition;', + + '}' + + ].join( '\n' ) ); + + gl.shaderSource( fragmentShader, [ + + 'precision ' + renderer.getPrecision() + ' float;', + + '#define SHADER_NAME ' + 'SpriteMaterial', + + 'uniform vec3 color;', + 'uniform sampler2D map;', + 'uniform float opacity;', + + 'uniform int fogType;', + 'uniform vec3 fogColor;', + 'uniform float fogDensity;', + 'uniform float fogNear;', + 'uniform float fogFar;', + 'uniform float alphaTest;', + + 'varying vec2 vUV;', + + 'void main() {', + + 'vec4 texture = texture2D( map, vUV );', + + 'if ( texture.a < alphaTest ) discard;', + + 'gl_FragColor = vec4( color * texture.xyz, texture.a * opacity );', + + 'if ( fogType > 0 ) {', + + 'float depth = gl_FragCoord.z / gl_FragCoord.w;', + 'float fogFactor = 0.0;', + + 'if ( fogType == 1 ) {', + + 'fogFactor = smoothstep( fogNear, fogFar, depth );', + + '} else {', + + 'const float LOG2 = 1.442695;', + 'fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );', + 'fogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );', + + '}', + + 'gl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );', + + '}', + + '}' + + ].join( '\n' ) ); + + gl.compileShader( vertexShader ); + gl.compileShader( fragmentShader ); + + gl.attachShader( program, vertexShader ); + gl.attachShader( program, fragmentShader ); + + gl.linkProgram( program ); + + return program; + + } + + function painterSortStable( a, b ) { + + if ( a.renderOrder !== b.renderOrder ) { + + return a.renderOrder - b.renderOrder; + + } else if ( a.z !== b.z ) { + + return b.z - a.z; + + } else { + + return b.id - a.id; + + } + + } + + } + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + var materialId = 0; + + function Material() { + + Object.defineProperty( this, 'id', { value: materialId ++ } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + this.type = 'Material'; + + this.fog = true; + this.lights = true; + + this.blending = NormalBlending; + this.side = FrontSide; + this.shading = SmoothShading; // THREE.FlatShading, THREE.SmoothShading + this.vertexColors = NoColors; // THREE.NoColors, THREE.VertexColors, THREE.FaceColors + + this.opacity = 1; + this.transparent = false; + + this.blendSrc = SrcAlphaFactor; + this.blendDst = OneMinusSrcAlphaFactor; + this.blendEquation = AddEquation; + this.blendSrcAlpha = null; + this.blendDstAlpha = null; + this.blendEquationAlpha = null; + + this.depthFunc = LessEqualDepth; + this.depthTest = true; + this.depthWrite = true; + + this.clippingPlanes = null; + this.clipIntersection = false; + this.clipShadows = false; + + this.colorWrite = true; + + this.precision = null; // override the renderer's default precision for this material + + this.polygonOffset = false; + this.polygonOffsetFactor = 0; + this.polygonOffsetUnits = 0; + + this.dithering = false; + + this.alphaTest = 0; + this.premultipliedAlpha = false; + + this.overdraw = 0; // Overdrawn pixels (typically between 0 and 1) for fixing antialiasing gaps in CanvasRenderer + + this.visible = true; + + this.needsUpdate = true; + + } + + Object.assign( Material.prototype, EventDispatcher.prototype, { + + isMaterial: true, + + onBeforeCompile: function () {}, + + setValues: function ( values ) { + + if ( values === undefined ) return; + + for ( var key in values ) { + + var newValue = values[ key ]; + + if ( newValue === undefined ) { + + console.warn( "THREE.Material: '" + key + "' parameter is undefined." ); + continue; + + } + + var currentValue = this[ key ]; + + if ( currentValue === undefined ) { + + console.warn( "THREE." + this.type + ": '" + key + "' is not a property of this material." ); + continue; + + } + + if ( currentValue && currentValue.isColor ) { + + currentValue.set( newValue ); + + } else if ( ( currentValue && currentValue.isVector3 ) && ( newValue && newValue.isVector3 ) ) { + + currentValue.copy( newValue ); + + } else if ( key === 'overdraw' ) { + + // ensure overdraw is backwards-compatible with legacy boolean type + this[ key ] = Number( newValue ); + + } else { + + this[ key ] = newValue; + + } + + } + + }, + + toJSON: function ( meta ) { + + var isRoot = meta === undefined; + + if ( isRoot ) { + + meta = { + textures: {}, + images: {} + }; + + } + + var data = { + metadata: { + version: 4.5, + type: 'Material', + generator: 'Material.toJSON' + } + }; + + // standard Material serialization + data.uuid = this.uuid; + data.type = this.type; + + if ( this.name !== '' ) data.name = this.name; + + if ( this.color && this.color.isColor ) data.color = this.color.getHex(); + + if ( this.roughness !== undefined ) data.roughness = this.roughness; + if ( this.metalness !== undefined ) data.metalness = this.metalness; + + if ( this.emissive && this.emissive.isColor ) data.emissive = this.emissive.getHex(); + if ( this.specular && this.specular.isColor ) data.specular = this.specular.getHex(); + if ( this.shininess !== undefined ) data.shininess = this.shininess; + if ( this.clearCoat !== undefined ) data.clearCoat = this.clearCoat; + if ( this.clearCoatRoughness !== undefined ) data.clearCoatRoughness = this.clearCoatRoughness; + + if ( this.map && this.map.isTexture ) data.map = this.map.toJSON( meta ).uuid; + if ( this.alphaMap && this.alphaMap.isTexture ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid; + if ( this.lightMap && this.lightMap.isTexture ) data.lightMap = this.lightMap.toJSON( meta ).uuid; + if ( this.bumpMap && this.bumpMap.isTexture ) { + + data.bumpMap = this.bumpMap.toJSON( meta ).uuid; + data.bumpScale = this.bumpScale; + + } + if ( this.normalMap && this.normalMap.isTexture ) { + + data.normalMap = this.normalMap.toJSON( meta ).uuid; + data.normalScale = this.normalScale.toArray(); + + } + if ( this.displacementMap && this.displacementMap.isTexture ) { + + data.displacementMap = this.displacementMap.toJSON( meta ).uuid; + data.displacementScale = this.displacementScale; + data.displacementBias = this.displacementBias; + + } + if ( this.roughnessMap && this.roughnessMap.isTexture ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid; + if ( this.metalnessMap && this.metalnessMap.isTexture ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid; + + if ( this.emissiveMap && this.emissiveMap.isTexture ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid; + if ( this.specularMap && this.specularMap.isTexture ) data.specularMap = this.specularMap.toJSON( meta ).uuid; + + if ( this.envMap && this.envMap.isTexture ) { + + data.envMap = this.envMap.toJSON( meta ).uuid; + data.reflectivity = this.reflectivity; // Scale behind envMap + + } + + if ( this.gradientMap && this.gradientMap.isTexture ) { + + data.gradientMap = this.gradientMap.toJSON( meta ).uuid; + + } + + if ( this.size !== undefined ) data.size = this.size; + if ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation; + + if ( this.blending !== NormalBlending ) data.blending = this.blending; + if ( this.shading !== SmoothShading ) data.shading = this.shading; + if ( this.side !== FrontSide ) data.side = this.side; + if ( this.vertexColors !== NoColors ) data.vertexColors = this.vertexColors; + + if ( this.opacity < 1 ) data.opacity = this.opacity; + if ( this.transparent === true ) data.transparent = this.transparent; + + data.depthFunc = this.depthFunc; + data.depthTest = this.depthTest; + data.depthWrite = this.depthWrite; + + if ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest; + if ( this.premultipliedAlpha === true ) data.premultipliedAlpha = this.premultipliedAlpha; + if ( this.wireframe === true ) data.wireframe = this.wireframe; + if ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth; + if ( this.wireframeLinecap !== 'round' ) data.wireframeLinecap = this.wireframeLinecap; + if ( this.wireframeLinejoin !== 'round' ) data.wireframeLinejoin = this.wireframeLinejoin; + + data.skinning = this.skinning; + data.morphTargets = this.morphTargets; + + data.dithering = this.dithering; + + // TODO: Copied from Object3D.toJSON + + function extractFromCache( cache ) { + + var values = []; + + for ( var key in cache ) { + + var data = cache[ key ]; + delete data.metadata; + values.push( data ); + + } + + return values; + + } + + if ( isRoot ) { + + var textures = extractFromCache( meta.textures ); + var images = extractFromCache( meta.images ); + + if ( textures.length > 0 ) data.textures = textures; + if ( images.length > 0 ) data.images = images; + + } + + return data; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.name = source.name; + + this.fog = source.fog; + this.lights = source.lights; + + this.blending = source.blending; + this.side = source.side; + this.shading = source.shading; + this.vertexColors = source.vertexColors; + + this.opacity = source.opacity; + this.transparent = source.transparent; + + this.blendSrc = source.blendSrc; + this.blendDst = source.blendDst; + this.blendEquation = source.blendEquation; + this.blendSrcAlpha = source.blendSrcAlpha; + this.blendDstAlpha = source.blendDstAlpha; + this.blendEquationAlpha = source.blendEquationAlpha; + + this.depthFunc = source.depthFunc; + this.depthTest = source.depthTest; + this.depthWrite = source.depthWrite; + + this.colorWrite = source.colorWrite; + + this.precision = source.precision; + + this.polygonOffset = source.polygonOffset; + this.polygonOffsetFactor = source.polygonOffsetFactor; + this.polygonOffsetUnits = source.polygonOffsetUnits; + + this.dithering = source.dithering; + + this.alphaTest = source.alphaTest; + + this.premultipliedAlpha = source.premultipliedAlpha; + + this.overdraw = source.overdraw; + + this.visible = source.visible; + this.clipShadows = source.clipShadows; + this.clipIntersection = source.clipIntersection; + + var srcPlanes = source.clippingPlanes, + dstPlanes = null; + + if ( srcPlanes !== null ) { + + var n = srcPlanes.length; + dstPlanes = new Array( n ); + + for ( var i = 0; i !== n; ++ i ) + dstPlanes[ i ] = srcPlanes[ i ].clone(); + + } + + this.clippingPlanes = dstPlanes; + + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * defines: { "label" : "value" }, + * uniforms: { "parameter1": { value: 1.0 }, "parameter2": { value2: 2 } }, + * + * fragmentShader: <string>, + * vertexShader: <string>, + * + * wireframe: <boolean>, + * wireframeLinewidth: <float>, + * + * lights: <bool>, + * + * skinning: <bool>, + * morphTargets: <bool>, + * morphNormals: <bool> + * } + */ + + function ShaderMaterial( parameters ) { + + Material.call( this ); + + this.type = 'ShaderMaterial'; + + this.defines = {}; + this.uniforms = {}; + + this.vertexShader = 'void main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}'; + this.fragmentShader = 'void main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}'; + + this.linewidth = 1; + + this.wireframe = false; + this.wireframeLinewidth = 1; + + this.fog = false; // set to use scene fog + this.lights = false; // set to use scene lights + this.clipping = false; // set to use user-defined clipping planes + + this.skinning = false; // set to use skinning attribute streams + this.morphTargets = false; // set to use morph targets + this.morphNormals = false; // set to use morph normals + + this.extensions = { + derivatives: false, // set to use derivatives + fragDepth: false, // set to use fragment depth values + drawBuffers: false, // set to use draw buffers + shaderTextureLOD: false // set to use shader texture LOD + }; + + // When rendered geometry doesn't include these attributes but the material does, + // use these default values in WebGL. This avoids errors when buffer data is missing. + this.defaultAttributeValues = { + 'color': [ 1, 1, 1 ], + 'uv': [ 0, 0 ], + 'uv2': [ 0, 0 ] + }; + + this.index0AttributeName = undefined; + + if ( parameters !== undefined ) { + + if ( parameters.attributes !== undefined ) { + + console.error( 'THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead.' ); + + } + + this.setValues( parameters ); + + } + + } + + ShaderMaterial.prototype = Object.create( Material.prototype ); + ShaderMaterial.prototype.constructor = ShaderMaterial; + + ShaderMaterial.prototype.isShaderMaterial = true; + + ShaderMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.fragmentShader = source.fragmentShader; + this.vertexShader = source.vertexShader; + + this.uniforms = UniformsUtils.clone( source.uniforms ); + + this.defines = source.defines; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + + this.lights = source.lights; + this.clipping = source.clipping; + + this.skinning = source.skinning; + + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + this.extensions = source.extensions; + + return this; + + }; + + ShaderMaterial.prototype.toJSON = function ( meta ) { + + var data = Material.prototype.toJSON.call( this, meta ); + + data.uniforms = this.uniforms; + data.vertexShader = this.vertexShader; + data.fragmentShader = this.fragmentShader; + + return data; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author bhouston / https://clara.io + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * + * opacity: <float>, + * + * map: new THREE.Texture( <Image> ), + * + * alphaMap: new THREE.Texture( <Image> ), + * + * displacementMap: new THREE.Texture( <Image> ), + * displacementScale: <float>, + * displacementBias: <float>, + * + * wireframe: <boolean>, + * wireframeLinewidth: <float> + * } + */ + + function MeshDepthMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshDepthMaterial'; + + this.depthPacking = BasicDepthPacking; + + this.skinning = false; + this.morphTargets = false; + + this.map = null; + + this.alphaMap = null; + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.wireframe = false; + this.wireframeLinewidth = 1; + + this.fog = false; + this.lights = false; + + this.setValues( parameters ); + + } + + MeshDepthMaterial.prototype = Object.create( Material.prototype ); + MeshDepthMaterial.prototype.constructor = MeshDepthMaterial; + + MeshDepthMaterial.prototype.isMeshDepthMaterial = true; + + MeshDepthMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.depthPacking = source.depthPacking; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + + this.map = source.map; + + this.alphaMap = source.alphaMap; + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + + return this; + + }; + + /** + * @author bhouston / http://clara.io + * @author WestLangley / http://github.com/WestLangley + */ + + function Box3( min, max ) { + + this.min = ( min !== undefined ) ? min : new Vector3( + Infinity, + Infinity, + Infinity ); + this.max = ( max !== undefined ) ? max : new Vector3( - Infinity, - Infinity, - Infinity ); + + } + + Object.assign( Box3.prototype, { + + isBox3: true, + + set: function ( min, max ) { + + this.min.copy( min ); + this.max.copy( max ); + + return this; + + }, + + setFromArray: function ( array ) { + + var minX = + Infinity; + var minY = + Infinity; + var minZ = + Infinity; + + var maxX = - Infinity; + var maxY = - Infinity; + var maxZ = - Infinity; + + for ( var i = 0, l = array.length; i < l; i += 3 ) { + + var x = array[ i ]; + var y = array[ i + 1 ]; + var z = array[ i + 2 ]; + + if ( x < minX ) minX = x; + if ( y < minY ) minY = y; + if ( z < minZ ) minZ = z; + + if ( x > maxX ) maxX = x; + if ( y > maxY ) maxY = y; + if ( z > maxZ ) maxZ = z; + + } + + this.min.set( minX, minY, minZ ); + this.max.set( maxX, maxY, maxZ ); + + return this; + + }, + + setFromBufferAttribute: function ( attribute ) { + + var minX = + Infinity; + var minY = + Infinity; + var minZ = + Infinity; + + var maxX = - Infinity; + var maxY = - Infinity; + var maxZ = - Infinity; + + for ( var i = 0, l = attribute.count; i < l; i ++ ) { + + var x = attribute.getX( i ); + var y = attribute.getY( i ); + var z = attribute.getZ( i ); + + if ( x < minX ) minX = x; + if ( y < minY ) minY = y; + if ( z < minZ ) minZ = z; + + if ( x > maxX ) maxX = x; + if ( y > maxY ) maxY = y; + if ( z > maxZ ) maxZ = z; + + } + + this.min.set( minX, minY, minZ ); + this.max.set( maxX, maxY, maxZ ); + + return this; + + }, + + setFromPoints: function ( points ) { + + this.makeEmpty(); + + for ( var i = 0, il = points.length; i < il; i ++ ) { + + this.expandByPoint( points[ i ] ); + + } + + return this; + + }, + + setFromCenterAndSize: function () { + + var v1 = new Vector3(); + + return function setFromCenterAndSize( center, size ) { + + var halfSize = v1.copy( size ).multiplyScalar( 0.5 ); + + this.min.copy( center ).sub( halfSize ); + this.max.copy( center ).add( halfSize ); + + return this; + + }; + + }(), + + setFromObject: function ( object ) { + + this.makeEmpty(); + + return this.expandByObject( object ); + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( box ) { + + this.min.copy( box.min ); + this.max.copy( box.max ); + + return this; + + }, + + makeEmpty: function () { + + this.min.x = this.min.y = this.min.z = + Infinity; + this.max.x = this.max.y = this.max.z = - Infinity; + + return this; + + }, + + isEmpty: function () { + + // this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes + + return ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z ); + + }, + + getCenter: function ( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + return this.isEmpty() ? result.set( 0, 0, 0 ) : result.addVectors( this.min, this.max ).multiplyScalar( 0.5 ); + + }, + + getSize: function ( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + return this.isEmpty() ? result.set( 0, 0, 0 ) : result.subVectors( this.max, this.min ); + + }, + + expandByPoint: function ( point ) { + + this.min.min( point ); + this.max.max( point ); + + return this; + + }, + + expandByVector: function ( vector ) { + + this.min.sub( vector ); + this.max.add( vector ); + + return this; + + }, + + expandByScalar: function ( scalar ) { + + this.min.addScalar( - scalar ); + this.max.addScalar( scalar ); + + return this; + + }, + + expandByObject: function () { + + // Computes the world-axis-aligned bounding box of an object (including its children), + // accounting for both the object's, and children's, world transforms + + var v1 = new Vector3(); + + return function expandByObject( object ) { + + var scope = this; + + object.updateMatrixWorld( true ); + + object.traverse( function ( node ) { + + var i, l; + + var geometry = node.geometry; + + if ( geometry !== undefined ) { + + if ( geometry.isGeometry ) { + + var vertices = geometry.vertices; + + for ( i = 0, l = vertices.length; i < l; i ++ ) { + + v1.copy( vertices[ i ] ); + v1.applyMatrix4( node.matrixWorld ); + + scope.expandByPoint( v1 ); + + } + + } else if ( geometry.isBufferGeometry ) { + + var attribute = geometry.attributes.position; + + if ( attribute !== undefined ) { + + for ( i = 0, l = attribute.count; i < l; i ++ ) { + + v1.fromBufferAttribute( attribute, i ).applyMatrix4( node.matrixWorld ); + + scope.expandByPoint( v1 ); + + } + + } + + } + + } + + } ); + + return this; + + }; + + }(), + + containsPoint: function ( point ) { + + return point.x < this.min.x || point.x > this.max.x || + point.y < this.min.y || point.y > this.max.y || + point.z < this.min.z || point.z > this.max.z ? false : true; + + }, + + containsBox: function ( box ) { + + return this.min.x <= box.min.x && box.max.x <= this.max.x && + this.min.y <= box.min.y && box.max.y <= this.max.y && + this.min.z <= box.min.z && box.max.z <= this.max.z; + + }, + + getParameter: function ( point, optionalTarget ) { + + // This can potentially have a divide by zero if the box + // has a size dimension of 0. + + var result = optionalTarget || new Vector3(); + + return result.set( + ( point.x - this.min.x ) / ( this.max.x - this.min.x ), + ( point.y - this.min.y ) / ( this.max.y - this.min.y ), + ( point.z - this.min.z ) / ( this.max.z - this.min.z ) + ); + + }, + + intersectsBox: function ( box ) { + + // using 6 splitting planes to rule out intersections. + return box.max.x < this.min.x || box.min.x > this.max.x || + box.max.y < this.min.y || box.min.y > this.max.y || + box.max.z < this.min.z || box.min.z > this.max.z ? false : true; + + }, + + intersectsSphere: ( function () { + + var closestPoint = new Vector3(); + + return function intersectsSphere( sphere ) { + + // Find the point on the AABB closest to the sphere center. + this.clampPoint( sphere.center, closestPoint ); + + // If that point is inside the sphere, the AABB and sphere intersect. + return closestPoint.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius ); + + }; + + } )(), + + intersectsPlane: function ( plane ) { + + // We compute the minimum and maximum dot product values. If those values + // are on the same side (back or front) of the plane, then there is no intersection. + + var min, max; + + if ( plane.normal.x > 0 ) { + + min = plane.normal.x * this.min.x; + max = plane.normal.x * this.max.x; + + } else { + + min = plane.normal.x * this.max.x; + max = plane.normal.x * this.min.x; + + } + + if ( plane.normal.y > 0 ) { + + min += plane.normal.y * this.min.y; + max += plane.normal.y * this.max.y; + + } else { + + min += plane.normal.y * this.max.y; + max += plane.normal.y * this.min.y; + + } + + if ( plane.normal.z > 0 ) { + + min += plane.normal.z * this.min.z; + max += plane.normal.z * this.max.z; + + } else { + + min += plane.normal.z * this.max.z; + max += plane.normal.z * this.min.z; + + } + + return ( min <= plane.constant && max >= plane.constant ); + + }, + + clampPoint: function ( point, optionalTarget ) { + + var result = optionalTarget || new Vector3(); + return result.copy( point ).clamp( this.min, this.max ); + + }, + + distanceToPoint: function () { + + var v1 = new Vector3(); + + return function distanceToPoint( point ) { + + var clampedPoint = v1.copy( point ).clamp( this.min, this.max ); + return clampedPoint.sub( point ).length(); + + }; + + }(), + + getBoundingSphere: function () { + + var v1 = new Vector3(); + + return function getBoundingSphere( optionalTarget ) { + + var result = optionalTarget || new Sphere(); + + this.getCenter( result.center ); + + result.radius = this.getSize( v1 ).length() * 0.5; + + return result; + + }; + + }(), + + intersect: function ( box ) { + + this.min.max( box.min ); + this.max.min( box.max ); + + // ensure that if there is no overlap, the result is fully empty, not slightly empty with non-inf/+inf values that will cause subsequence intersects to erroneously return valid values. + if( this.isEmpty() ) this.makeEmpty(); + + return this; + + }, + + union: function ( box ) { + + this.min.min( box.min ); + this.max.max( box.max ); + + return this; + + }, + + applyMatrix4: function () { + + var points = [ + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3() + ]; + + return function applyMatrix4( matrix ) { + + // transform of empty box is an empty box. + if( this.isEmpty() ) return this; + + // NOTE: I am using a binary pattern to specify all 2^3 combinations below + points[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000 + points[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001 + points[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010 + points[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011 + points[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100 + points[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101 + points[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110 + points[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 111 + + this.setFromPoints( points ); + + return this; + + }; + + }(), + + translate: function ( offset ) { + + this.min.add( offset ); + this.max.add( offset ); + + return this; + + }, + + equals: function ( box ) { + + return box.min.equals( this.min ) && box.max.equals( this.max ); + + } + + } ); + + /** + * @author bhouston / http://clara.io + * @author mrdoob / http://mrdoob.com/ + */ + + function Sphere( center, radius ) { + + this.center = ( center !== undefined ) ? center : new Vector3(); + this.radius = ( radius !== undefined ) ? radius : 0; + + } + + Object.assign( Sphere.prototype, { + + set: function ( center, radius ) { + + this.center.copy( center ); + this.radius = radius; + + return this; + + }, + + setFromPoints: function () { + + var box = new Box3(); + + return function setFromPoints( points, optionalCenter ) { + + var center = this.center; + + if ( optionalCenter !== undefined ) { + + center.copy( optionalCenter ); + + } else { + + box.setFromPoints( points ).getCenter( center ); + + } + + var maxRadiusSq = 0; + + for ( var i = 0, il = points.length; i < il; i ++ ) { + + maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) ); + + } + + this.radius = Math.sqrt( maxRadiusSq ); + + return this; + + }; + + }(), + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( sphere ) { + + this.center.copy( sphere.center ); + this.radius = sphere.radius; + + return this; + + }, + + empty: function () { + + return ( this.radius <= 0 ); + + }, + + containsPoint: function ( point ) { + + return ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) ); + + }, + + distanceToPoint: function ( point ) { + + return ( point.distanceTo( this.center ) - this.radius ); + + }, + + intersectsSphere: function ( sphere ) { + + var radiusSum = this.radius + sphere.radius; + + return sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum ); + + }, + + intersectsBox: function ( box ) { + + return box.intersectsSphere( this ); + + }, + + intersectsPlane: function ( plane ) { + + // We use the following equation to compute the signed distance from + // the center of the sphere to the plane. + // + // distance = q * n - d + // + // If this distance is greater than the radius of the sphere, + // then there is no intersection. + + return Math.abs( this.center.dot( plane.normal ) - plane.constant ) <= this.radius; + + }, + + clampPoint: function ( point, optionalTarget ) { + + var deltaLengthSq = this.center.distanceToSquared( point ); + + var result = optionalTarget || new Vector3(); + + result.copy( point ); + + if ( deltaLengthSq > ( this.radius * this.radius ) ) { + + result.sub( this.center ).normalize(); + result.multiplyScalar( this.radius ).add( this.center ); + + } + + return result; + + }, + + getBoundingBox: function ( optionalTarget ) { + + var box = optionalTarget || new Box3(); + + box.set( this.center, this.center ); + box.expandByScalar( this.radius ); + + return box; + + }, + + applyMatrix4: function ( matrix ) { + + this.center.applyMatrix4( matrix ); + this.radius = this.radius * matrix.getMaxScaleOnAxis(); + + return this; + + }, + + translate: function ( offset ) { + + this.center.add( offset ); + + return this; + + }, + + equals: function ( sphere ) { + + return sphere.center.equals( this.center ) && ( sphere.radius === this.radius ); + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author bhouston / http://clara.io + * @author tschw + */ + + function Matrix3() { + + this.elements = [ + + 1, 0, 0, + 0, 1, 0, + 0, 0, 1 + + ]; + + if ( arguments.length > 0 ) { + + console.error( 'THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.' ); + + } + + } + + Object.assign( Matrix3.prototype, { + + isMatrix3: true, + + set: function ( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) { + + var te = this.elements; + + te[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31; + te[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32; + te[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33; + + return this; + + }, + + identity: function () { + + this.set( + + 1, 0, 0, + 0, 1, 0, + 0, 0, 1 + + ); + + return this; + + }, + + clone: function () { + + return new this.constructor().fromArray( this.elements ); + + }, + + copy: function ( m ) { + + var te = this.elements; + var me = m.elements; + + te[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ]; + te[ 3 ] = me[ 3 ]; te[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ]; + te[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ]; te[ 8 ] = me[ 8 ]; + + return this; + + }, + + setFromMatrix4: function ( m ) { + + var me = m.elements; + + this.set( + + me[ 0 ], me[ 4 ], me[ 8 ], + me[ 1 ], me[ 5 ], me[ 9 ], + me[ 2 ], me[ 6 ], me[ 10 ] + + ); + + return this; + + }, + + applyToBufferAttribute: function () { + + var v1 = new Vector3(); + + return function applyToBufferAttribute( attribute ) { + + for ( var i = 0, l = attribute.count; i < l; i ++ ) { + + v1.x = attribute.getX( i ); + v1.y = attribute.getY( i ); + v1.z = attribute.getZ( i ); + + v1.applyMatrix3( this ); + + attribute.setXYZ( i, v1.x, v1.y, v1.z ); + + } + + return attribute; + + }; + + }(), + + multiply: function ( m ) { + + return this.multiplyMatrices( this, m ); + + }, + + premultiply: function ( m ) { + + return this.multiplyMatrices( m, this ); + + }, + + multiplyMatrices: function ( a, b ) { + + var ae = a.elements; + var be = b.elements; + var te = this.elements; + + var a11 = ae[ 0 ], a12 = ae[ 3 ], a13 = ae[ 6 ]; + var a21 = ae[ 1 ], a22 = ae[ 4 ], a23 = ae[ 7 ]; + var a31 = ae[ 2 ], a32 = ae[ 5 ], a33 = ae[ 8 ]; + + var b11 = be[ 0 ], b12 = be[ 3 ], b13 = be[ 6 ]; + var b21 = be[ 1 ], b22 = be[ 4 ], b23 = be[ 7 ]; + var b31 = be[ 2 ], b32 = be[ 5 ], b33 = be[ 8 ]; + + te[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31; + te[ 3 ] = a11 * b12 + a12 * b22 + a13 * b32; + te[ 6 ] = a11 * b13 + a12 * b23 + a13 * b33; + + te[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31; + te[ 4 ] = a21 * b12 + a22 * b22 + a23 * b32; + te[ 7 ] = a21 * b13 + a22 * b23 + a23 * b33; + + te[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31; + te[ 5 ] = a31 * b12 + a32 * b22 + a33 * b32; + te[ 8 ] = a31 * b13 + a32 * b23 + a33 * b33; + + return this; + + }, + + multiplyScalar: function ( s ) { + + var te = this.elements; + + te[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s; + te[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s; + te[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s; + + return this; + + }, + + determinant: function () { + + var te = this.elements; + + var a = te[ 0 ], b = te[ 1 ], c = te[ 2 ], + d = te[ 3 ], e = te[ 4 ], f = te[ 5 ], + g = te[ 6 ], h = te[ 7 ], i = te[ 8 ]; + + return a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g; + + }, + + getInverse: function ( matrix, throwOnDegenerate ) { + + if ( matrix && matrix.isMatrix4 ) { + + console.error( "THREE.Matrix3.getInverse no longer takes a Matrix4 argument." ); + + } + + var me = matrix.elements, + te = this.elements, + + n11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ], + n12 = me[ 3 ], n22 = me[ 4 ], n32 = me[ 5 ], + n13 = me[ 6 ], n23 = me[ 7 ], n33 = me[ 8 ], + + t11 = n33 * n22 - n32 * n23, + t12 = n32 * n13 - n33 * n12, + t13 = n23 * n12 - n22 * n13, + + det = n11 * t11 + n21 * t12 + n31 * t13; + + if ( det === 0 ) { + + var msg = "THREE.Matrix3.getInverse(): can't invert matrix, determinant is 0"; + + if ( throwOnDegenerate === true ) { + + throw new Error( msg ); + + } else { + + console.warn( msg ); + + } + + return this.identity(); + + } + + var detInv = 1 / det; + + te[ 0 ] = t11 * detInv; + te[ 1 ] = ( n31 * n23 - n33 * n21 ) * detInv; + te[ 2 ] = ( n32 * n21 - n31 * n22 ) * detInv; + + te[ 3 ] = t12 * detInv; + te[ 4 ] = ( n33 * n11 - n31 * n13 ) * detInv; + te[ 5 ] = ( n31 * n12 - n32 * n11 ) * detInv; + + te[ 6 ] = t13 * detInv; + te[ 7 ] = ( n21 * n13 - n23 * n11 ) * detInv; + te[ 8 ] = ( n22 * n11 - n21 * n12 ) * detInv; + + return this; + + }, + + transpose: function () { + + var tmp, m = this.elements; + + tmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp; + tmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp; + tmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp; + + return this; + + }, + + getNormalMatrix: function ( matrix4 ) { + + return this.setFromMatrix4( matrix4 ).getInverse( this ).transpose(); + + }, + + transposeIntoArray: function ( r ) { + + var m = this.elements; + + r[ 0 ] = m[ 0 ]; + r[ 1 ] = m[ 3 ]; + r[ 2 ] = m[ 6 ]; + r[ 3 ] = m[ 1 ]; + r[ 4 ] = m[ 4 ]; + r[ 5 ] = m[ 7 ]; + r[ 6 ] = m[ 2 ]; + r[ 7 ] = m[ 5 ]; + r[ 8 ] = m[ 8 ]; + + return this; + + }, + + equals: function ( matrix ) { + + var te = this.elements; + var me = matrix.elements; + + for ( var i = 0; i < 9; i ++ ) { + + if ( te[ i ] !== me[ i ] ) return false; + + } + + return true; + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + for ( var i = 0; i < 9; i ++ ) { + + this.elements[ i ] = array[ i + offset ]; + + } + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + var te = this.elements; + + array[ offset ] = te[ 0 ]; + array[ offset + 1 ] = te[ 1 ]; + array[ offset + 2 ] = te[ 2 ]; + + array[ offset + 3 ] = te[ 3 ]; + array[ offset + 4 ] = te[ 4 ]; + array[ offset + 5 ] = te[ 5 ]; + + array[ offset + 6 ] = te[ 6 ]; + array[ offset + 7 ] = te[ 7 ]; + array[ offset + 8 ] = te[ 8 ]; + + return array; + + } + + } ); + + /** + * @author bhouston / http://clara.io + */ + + function Plane( normal, constant ) { + + this.normal = ( normal !== undefined ) ? normal : new Vector3( 1, 0, 0 ); + this.constant = ( constant !== undefined ) ? constant : 0; + + } + + Object.assign( Plane.prototype, { + + set: function ( normal, constant ) { + + this.normal.copy( normal ); + this.constant = constant; + + return this; + + }, + + setComponents: function ( x, y, z, w ) { + + this.normal.set( x, y, z ); + this.constant = w; + + return this; + + }, + + setFromNormalAndCoplanarPoint: function ( normal, point ) { + + this.normal.copy( normal ); + this.constant = - point.dot( this.normal ); // must be this.normal, not normal, as this.normal is normalized + + return this; + + }, + + setFromCoplanarPoints: function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + + return function setFromCoplanarPoints( a, b, c ) { + + var normal = v1.subVectors( c, b ).cross( v2.subVectors( a, b ) ).normalize(); + + // Q: should an error be thrown if normal is zero (e.g. degenerate plane)? + + this.setFromNormalAndCoplanarPoint( normal, a ); + + return this; + + }; + + }(), + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( plane ) { + + this.normal.copy( plane.normal ); + this.constant = plane.constant; + + return this; + + }, + + normalize: function () { + + // Note: will lead to a divide by zero if the plane is invalid. + + var inverseNormalLength = 1.0 / this.normal.length(); + this.normal.multiplyScalar( inverseNormalLength ); + this.constant *= inverseNormalLength; + + return this; + + }, + + negate: function () { + + this.constant *= - 1; + this.normal.negate(); + + return this; + + }, + + distanceToPoint: function ( point ) { + + return this.normal.dot( point ) + this.constant; + + }, + + distanceToSphere: function ( sphere ) { + + return this.distanceToPoint( sphere.center ) - sphere.radius; + + }, + + projectPoint: function ( point, optionalTarget ) { + + return this.orthoPoint( point, optionalTarget ).sub( point ).negate(); + + }, + + orthoPoint: function ( point, optionalTarget ) { + + var perpendicularMagnitude = this.distanceToPoint( point ); + + var result = optionalTarget || new Vector3(); + return result.copy( this.normal ).multiplyScalar( perpendicularMagnitude ); + + }, + + intersectLine: function () { + + var v1 = new Vector3(); + + return function intersectLine( line, optionalTarget ) { + + var result = optionalTarget || new Vector3(); + + var direction = line.delta( v1 ); + + var denominator = this.normal.dot( direction ); + + if ( denominator === 0 ) { + + // line is coplanar, return origin + if ( this.distanceToPoint( line.start ) === 0 ) { + + return result.copy( line.start ); + + } + + // Unsure if this is the correct method to handle this case. + return undefined; + + } + + var t = - ( line.start.dot( this.normal ) + this.constant ) / denominator; + + if ( t < 0 || t > 1 ) { + + return undefined; + + } + + return result.copy( direction ).multiplyScalar( t ).add( line.start ); + + }; + + }(), + + intersectsLine: function ( line ) { + + // Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it. + + var startSign = this.distanceToPoint( line.start ); + var endSign = this.distanceToPoint( line.end ); + + return ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 ); + + }, + + intersectsBox: function ( box ) { + + return box.intersectsPlane( this ); + + }, + + intersectsSphere: function ( sphere ) { + + return sphere.intersectsPlane( this ); + + }, + + coplanarPoint: function ( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + return result.copy( this.normal ).multiplyScalar( - this.constant ); + + }, + + applyMatrix4: function () { + + var v1 = new Vector3(); + var m1 = new Matrix3(); + + return function applyMatrix4( matrix, optionalNormalMatrix ) { + + var referencePoint = this.coplanarPoint( v1 ).applyMatrix4( matrix ); + + // transform normal based on theory here: + // http://www.songho.ca/opengl/gl_normaltransform.html + var normalMatrix = optionalNormalMatrix || m1.getNormalMatrix( matrix ); + var normal = this.normal.applyMatrix3( normalMatrix ).normalize(); + + // recalculate constant (like in setFromNormalAndCoplanarPoint) + this.constant = - referencePoint.dot( normal ); + + return this; + + }; + + }(), + + translate: function ( offset ) { + + this.constant = this.constant - offset.dot( this.normal ); + + return this; + + }, + + equals: function ( plane ) { + + return plane.normal.equals( this.normal ) && ( plane.constant === this.constant ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author bhouston / http://clara.io + */ + + function Frustum( p0, p1, p2, p3, p4, p5 ) { + + this.planes = [ + + ( p0 !== undefined ) ? p0 : new Plane(), + ( p1 !== undefined ) ? p1 : new Plane(), + ( p2 !== undefined ) ? p2 : new Plane(), + ( p3 !== undefined ) ? p3 : new Plane(), + ( p4 !== undefined ) ? p4 : new Plane(), + ( p5 !== undefined ) ? p5 : new Plane() + + ]; + + } + + Object.assign( Frustum.prototype, { + + set: function ( p0, p1, p2, p3, p4, p5 ) { + + var planes = this.planes; + + planes[ 0 ].copy( p0 ); + planes[ 1 ].copy( p1 ); + planes[ 2 ].copy( p2 ); + planes[ 3 ].copy( p3 ); + planes[ 4 ].copy( p4 ); + planes[ 5 ].copy( p5 ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( frustum ) { + + var planes = this.planes; + + for ( var i = 0; i < 6; i ++ ) { + + planes[ i ].copy( frustum.planes[ i ] ); + + } + + return this; + + }, + + setFromMatrix: function ( m ) { + + var planes = this.planes; + var me = m.elements; + var me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ]; + var me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ]; + var me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ]; + var me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ]; + + planes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize(); + planes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize(); + planes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize(); + planes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize(); + planes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize(); + planes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize(); + + return this; + + }, + + intersectsObject: function () { + + var sphere = new Sphere(); + + return function intersectsObject( object ) { + + var geometry = object.geometry; + + if ( geometry.boundingSphere === null ) + geometry.computeBoundingSphere(); + + sphere.copy( geometry.boundingSphere ) + .applyMatrix4( object.matrixWorld ); + + return this.intersectsSphere( sphere ); + + }; + + }(), + + intersectsSprite: function () { + + var sphere = new Sphere(); + + return function intersectsSprite( sprite ) { + + sphere.center.set( 0, 0, 0 ); + sphere.radius = 0.7071067811865476; + sphere.applyMatrix4( sprite.matrixWorld ); + + return this.intersectsSphere( sphere ); + + }; + + }(), + + intersectsSphere: function ( sphere ) { + + var planes = this.planes; + var center = sphere.center; + var negRadius = - sphere.radius; + + for ( var i = 0; i < 6; i ++ ) { + + var distance = planes[ i ].distanceToPoint( center ); + + if ( distance < negRadius ) { + + return false; + + } + + } + + return true; + + }, + + intersectsBox: function () { + + var p1 = new Vector3(), + p2 = new Vector3(); + + return function intersectsBox( box ) { + + var planes = this.planes; + + for ( var i = 0; i < 6; i ++ ) { + + var plane = planes[ i ]; + + p1.x = plane.normal.x > 0 ? box.min.x : box.max.x; + p2.x = plane.normal.x > 0 ? box.max.x : box.min.x; + p1.y = plane.normal.y > 0 ? box.min.y : box.max.y; + p2.y = plane.normal.y > 0 ? box.max.y : box.min.y; + p1.z = plane.normal.z > 0 ? box.min.z : box.max.z; + p2.z = plane.normal.z > 0 ? box.max.z : box.min.z; + + var d1 = plane.distanceToPoint( p1 ); + var d2 = plane.distanceToPoint( p2 ); + + // if both outside plane, no intersection + + if ( d1 < 0 && d2 < 0 ) { + + return false; + + } + + } + + return true; + + }; + + }(), + + containsPoint: function ( point ) { + + var planes = this.planes; + + for ( var i = 0; i < 6; i ++ ) { + + if ( planes[ i ].distanceToPoint( point ) < 0 ) { + + return false; + + } + + } + + return true; + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLShadowMap( _renderer, _lights, _objects, capabilities ) { + + var _gl = _renderer.context, + _state = _renderer.state, + _frustum = new Frustum(), + _projScreenMatrix = new Matrix4(), + + _lightShadows = _lights.shadows, + + _shadowMapSize = new Vector2(), + _maxShadowMapSize = new Vector2( capabilities.maxTextureSize, capabilities.maxTextureSize ), + + _lookTarget = new Vector3(), + _lightPositionWorld = new Vector3(), + + _MorphingFlag = 1, + _SkinningFlag = 2, + + _NumberOfMaterialVariants = ( _MorphingFlag | _SkinningFlag ) + 1, + + _depthMaterials = new Array( _NumberOfMaterialVariants ), + _distanceMaterials = new Array( _NumberOfMaterialVariants ), + + _materialCache = {}; + + var cubeDirections = [ + new Vector3( 1, 0, 0 ), new Vector3( - 1, 0, 0 ), new Vector3( 0, 0, 1 ), + new Vector3( 0, 0, - 1 ), new Vector3( 0, 1, 0 ), new Vector3( 0, - 1, 0 ) + ]; + + var cubeUps = [ + new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), + new Vector3( 0, 1, 0 ), new Vector3( 0, 0, 1 ), new Vector3( 0, 0, - 1 ) + ]; + + var cube2DViewPorts = [ + new Vector4(), new Vector4(), new Vector4(), + new Vector4(), new Vector4(), new Vector4() + ]; + + // init + + var depthMaterialTemplate = new MeshDepthMaterial(); + depthMaterialTemplate.depthPacking = RGBADepthPacking; + depthMaterialTemplate.clipping = true; + + var distanceShader = ShaderLib[ "distanceRGBA" ]; + var distanceUniforms = UniformsUtils.clone( distanceShader.uniforms ); + + for ( var i = 0; i !== _NumberOfMaterialVariants; ++ i ) { + + var useMorphing = ( i & _MorphingFlag ) !== 0; + var useSkinning = ( i & _SkinningFlag ) !== 0; + + var depthMaterial = depthMaterialTemplate.clone(); + depthMaterial.morphTargets = useMorphing; + depthMaterial.skinning = useSkinning; + + _depthMaterials[ i ] = depthMaterial; + + var distanceMaterial = new ShaderMaterial( { + defines: { + 'USE_SHADOWMAP': '' + }, + uniforms: distanceUniforms, + vertexShader: distanceShader.vertexShader, + fragmentShader: distanceShader.fragmentShader, + morphTargets: useMorphing, + skinning: useSkinning, + clipping: true + } ); + + _distanceMaterials[ i ] = distanceMaterial; + + } + + // + + var scope = this; + + this.enabled = false; + + this.autoUpdate = true; + this.needsUpdate = false; + + this.type = PCFShadowMap; + + this.renderReverseSided = true; + this.renderSingleSided = true; + + this.render = function ( scene, camera ) { + + if ( scope.enabled === false ) return; + if ( scope.autoUpdate === false && scope.needsUpdate === false ) return; + + if ( _lightShadows.length === 0 ) return; + + // Set GL state for depth map. + _state.disable( _gl.BLEND ); + _state.buffers.color.setClear( 1, 1, 1, 1 ); + _state.buffers.depth.setTest( true ); + _state.setScissorTest( false ); + + // render depth map + + var faceCount; + + for ( var i = 0, il = _lightShadows.length; i < il; i ++ ) { + + var light = _lightShadows[ i ]; + var shadow = light.shadow; + var isPointLight = light && light.isPointLight; + + if ( shadow === undefined ) { + + console.warn( 'THREE.WebGLShadowMap:', light, 'has no shadow.' ); + continue; + + } + + var shadowCamera = shadow.camera; + + _shadowMapSize.copy( shadow.mapSize ); + _shadowMapSize.min( _maxShadowMapSize ); + + if ( isPointLight ) { + + var vpWidth = _shadowMapSize.x; + var vpHeight = _shadowMapSize.y; + + // These viewports map a cube-map onto a 2D texture with the + // following orientation: + // + // xzXZ + // y Y + // + // X - Positive x direction + // x - Negative x direction + // Y - Positive y direction + // y - Negative y direction + // Z - Positive z direction + // z - Negative z direction + + // positive X + cube2DViewPorts[ 0 ].set( vpWidth * 2, vpHeight, vpWidth, vpHeight ); + // negative X + cube2DViewPorts[ 1 ].set( 0, vpHeight, vpWidth, vpHeight ); + // positive Z + cube2DViewPorts[ 2 ].set( vpWidth * 3, vpHeight, vpWidth, vpHeight ); + // negative Z + cube2DViewPorts[ 3 ].set( vpWidth, vpHeight, vpWidth, vpHeight ); + // positive Y + cube2DViewPorts[ 4 ].set( vpWidth * 3, 0, vpWidth, vpHeight ); + // negative Y + cube2DViewPorts[ 5 ].set( vpWidth, 0, vpWidth, vpHeight ); + + _shadowMapSize.x *= 4.0; + _shadowMapSize.y *= 2.0; + + } + + if ( shadow.map === null ) { + + var pars = { minFilter: NearestFilter, magFilter: NearestFilter, format: RGBAFormat }; + + shadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars ); + shadow.map.texture.name = light.name + ".shadowMap"; + + shadowCamera.updateProjectionMatrix(); + + } + + if ( shadow.isSpotLightShadow ) { + + shadow.update( light ); + + } + + var shadowMap = shadow.map; + var shadowMatrix = shadow.matrix; + + _lightPositionWorld.setFromMatrixPosition( light.matrixWorld ); + shadowCamera.position.copy( _lightPositionWorld ); + + if ( isPointLight ) { + + faceCount = 6; + + // for point lights we set the shadow matrix to be a translation-only matrix + // equal to inverse of the light's position + + shadowMatrix.makeTranslation( - _lightPositionWorld.x, - _lightPositionWorld.y, - _lightPositionWorld.z ); + + } else { + + faceCount = 1; + + _lookTarget.setFromMatrixPosition( light.target.matrixWorld ); + shadowCamera.lookAt( _lookTarget ); + shadowCamera.updateMatrixWorld(); + + // compute shadow matrix + + shadowMatrix.set( + 0.5, 0.0, 0.0, 0.5, + 0.0, 0.5, 0.0, 0.5, + 0.0, 0.0, 0.5, 0.5, + 0.0, 0.0, 0.0, 1.0 + ); + + shadowMatrix.multiply( shadowCamera.projectionMatrix ); + shadowMatrix.multiply( shadowCamera.matrixWorldInverse ); + + } + + _renderer.setRenderTarget( shadowMap ); + _renderer.clear(); + + // render shadow map for each cube face (if omni-directional) or + // run a single pass if not + + for ( var face = 0; face < faceCount; face ++ ) { + + if ( isPointLight ) { + + _lookTarget.copy( shadowCamera.position ); + _lookTarget.add( cubeDirections[ face ] ); + shadowCamera.up.copy( cubeUps[ face ] ); + shadowCamera.lookAt( _lookTarget ); + shadowCamera.updateMatrixWorld(); + + var vpDimensions = cube2DViewPorts[ face ]; + _state.viewport( vpDimensions ); + + } + + // update camera matrices and frustum + + _projScreenMatrix.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse ); + _frustum.setFromMatrix( _projScreenMatrix ); + + // set object matrices & frustum culling + + renderObject( scene, camera, shadowCamera, isPointLight ); + + } + + } + + // Restore GL state. + var clearColor = _renderer.getClearColor(); + var clearAlpha = _renderer.getClearAlpha(); + _renderer.setClearColor( clearColor, clearAlpha ); + + scope.needsUpdate = false; + + }; + + function getDepthMaterial( object, material, isPointLight, lightPositionWorld ) { + + var geometry = object.geometry; + + var result = null; + + var materialVariants = _depthMaterials; + var customMaterial = object.customDepthMaterial; + + if ( isPointLight ) { + + materialVariants = _distanceMaterials; + customMaterial = object.customDistanceMaterial; + + } + + if ( ! customMaterial ) { + + var useMorphing = false; + + if ( material.morphTargets ) { + + if ( geometry && geometry.isBufferGeometry ) { + + useMorphing = geometry.morphAttributes && geometry.morphAttributes.position && geometry.morphAttributes.position.length > 0; + + } else if ( geometry && geometry.isGeometry ) { + + useMorphing = geometry.morphTargets && geometry.morphTargets.length > 0; + + } + + } + + if ( object.isSkinnedMesh && material.skinning === false ) { + + console.warn( 'THREE.WebGLShadowMap: THREE.SkinnedMesh with material.skinning set to false:', object ); + + } + + var useSkinning = object.isSkinnedMesh && material.skinning; + + var variantIndex = 0; + + if ( useMorphing ) variantIndex |= _MorphingFlag; + if ( useSkinning ) variantIndex |= _SkinningFlag; + + result = materialVariants[ variantIndex ]; + + } else { + + result = customMaterial; + + } + + if ( _renderer.localClippingEnabled && + material.clipShadows === true && + material.clippingPlanes.length !== 0 ) { + + // in this case we need a unique material instance reflecting the + // appropriate state + + var keyA = result.uuid, keyB = material.uuid; + + var materialsForVariant = _materialCache[ keyA ]; + + if ( materialsForVariant === undefined ) { + + materialsForVariant = {}; + _materialCache[ keyA ] = materialsForVariant; + + } + + var cachedMaterial = materialsForVariant[ keyB ]; + + if ( cachedMaterial === undefined ) { + + cachedMaterial = result.clone(); + materialsForVariant[ keyB ] = cachedMaterial; + + } + + result = cachedMaterial; + + } + + result.visible = material.visible; + result.wireframe = material.wireframe; + + var side = material.side; + + if ( scope.renderSingleSided && side == DoubleSide ) { + + side = FrontSide; + + } + + if ( scope.renderReverseSided ) { + + if ( side === FrontSide ) side = BackSide; + else if ( side === BackSide ) side = FrontSide; + + } + + result.side = side; + + result.clipShadows = material.clipShadows; + result.clippingPlanes = material.clippingPlanes; + + result.wireframeLinewidth = material.wireframeLinewidth; + result.linewidth = material.linewidth; + + if ( isPointLight && result.uniforms.lightPos !== undefined ) { + + result.uniforms.lightPos.value.copy( lightPositionWorld ); + + } + + return result; + + } + + function renderObject( object, camera, shadowCamera, isPointLight ) { + + if ( object.visible === false ) return; + + var visible = object.layers.test( camera.layers ); + + if ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) { + + if ( object.castShadow && ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) ) { + + object.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld ); + + var geometry = _objects.update( object ); + var material = object.material; + + if ( Array.isArray( material ) ) { + + var groups = geometry.groups; + + for ( var k = 0, kl = groups.length; k < kl; k ++ ) { + + var group = groups[ k ]; + var groupMaterial = material[ group.materialIndex ]; + + if ( groupMaterial && groupMaterial.visible ) { + + var depthMaterial = getDepthMaterial( object, groupMaterial, isPointLight, _lightPositionWorld ); + _renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, group ); + + } + + } + + } else if ( material.visible ) { + + var depthMaterial = getDepthMaterial( object, material, isPointLight, _lightPositionWorld ); + _renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, null ); + + } + + } + + } + + var children = object.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + renderObject( children[ i ], camera, shadowCamera, isPointLight ); + + } + + } + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLAttributes( gl ) { + + var buffers = {}; + + function createBuffer( attribute, bufferType ) { + + var array = attribute.array; + var usage = attribute.dynamic ? gl.DYNAMIC_DRAW : gl.STATIC_DRAW; + + var buffer = gl.createBuffer(); + + gl.bindBuffer( bufferType, buffer ); + gl.bufferData( bufferType, array, usage ); + + attribute.onUploadCallback(); + + var type = gl.FLOAT; + + if ( array instanceof Float32Array ) { + + type = gl.FLOAT; + + } else if ( array instanceof Float64Array ) { + + console.warn( 'THREE.WebGLAttributes: Unsupported data buffer format: Float64Array.' ); + + } else if ( array instanceof Uint16Array ) { + + type = gl.UNSIGNED_SHORT; + + } else if ( array instanceof Int16Array ) { + + type = gl.SHORT; + + } else if ( array instanceof Uint32Array ) { + + type = gl.UNSIGNED_INT; + + } else if ( array instanceof Int32Array ) { + + type = gl.INT; + + } else if ( array instanceof Int8Array ) { + + type = gl.BYTE; + + } else if ( array instanceof Uint8Array ) { + + type = gl.UNSIGNED_BYTE; + + } + + return { + buffer: buffer, + type: type, + bytesPerElement: array.BYTES_PER_ELEMENT, + version: attribute.version + }; + + } + + function updateBuffer( buffer, attribute, bufferType ) { + + var array = attribute.array; + var updateRange = attribute.updateRange; + + gl.bindBuffer( bufferType, buffer ); + + if ( attribute.dynamic === false ) { + + gl.bufferData( bufferType, array, gl.STATIC_DRAW ); + + } else if ( updateRange.count === - 1 ) { + + // Not using update ranges + + gl.bufferSubData( bufferType, 0, array ); + + } else if ( updateRange.count === 0 ) { + + console.error( 'THREE.WebGLObjects.updateBuffer: dynamic THREE.BufferAttribute marked as needsUpdate but updateRange.count is 0, ensure you are using set methods or updating manually.' ); + + } else { + + gl.bufferSubData( bufferType, updateRange.offset * array.BYTES_PER_ELEMENT, + array.subarray( updateRange.offset, updateRange.offset + updateRange.count ) ); + + updateRange.count = -1; // reset range + + } + + } + + // + + function get( attribute ) { + + if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data; + + return buffers[ attribute.uuid ]; + + } + + function remove( attribute ) { + + if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data; + + var data = buffers[ attribute.uuid ]; + + if ( data ) { + + gl.deleteBuffer( data.buffer ); + + delete buffers[ attribute.uuid ]; + + } + + } + + function update( attribute, bufferType ) { + + if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data; + + var data = buffers[ attribute.uuid ]; + + if ( data === undefined ) { + + buffers[ attribute.uuid ] = createBuffer( attribute, bufferType ); + + } else if ( data.version < attribute.version ) { + + updateBuffer( data.buffer, attribute, bufferType ); + + data.version = attribute.version; + + } + + } + + return { + + get: get, + remove: remove, + update: update + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + * @author bhouston / http://clara.io + */ + + function Euler( x, y, z, order ) { + + this._x = x || 0; + this._y = y || 0; + this._z = z || 0; + this._order = order || Euler.DefaultOrder; + + } + + Euler.RotationOrders = [ 'XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX' ]; + + Euler.DefaultOrder = 'XYZ'; + + Object.defineProperties( Euler.prototype, { + + x: { + + get: function () { + + return this._x; + + }, + + set: function ( value ) { + + this._x = value; + this.onChangeCallback(); + + } + + }, + + y: { + + get: function () { + + return this._y; + + }, + + set: function ( value ) { + + this._y = value; + this.onChangeCallback(); + + } + + }, + + z: { + + get: function () { + + return this._z; + + }, + + set: function ( value ) { + + this._z = value; + this.onChangeCallback(); + + } + + }, + + order: { + + get: function () { + + return this._order; + + }, + + set: function ( value ) { + + this._order = value; + this.onChangeCallback(); + + } + + } + + } ); + + Object.assign( Euler.prototype, { + + isEuler: true, + + set: function ( x, y, z, order ) { + + this._x = x; + this._y = y; + this._z = z; + this._order = order || this._order; + + this.onChangeCallback(); + + return this; + + }, + + clone: function () { + + return new this.constructor( this._x, this._y, this._z, this._order ); + + }, + + copy: function ( euler ) { + + this._x = euler._x; + this._y = euler._y; + this._z = euler._z; + this._order = euler._order; + + this.onChangeCallback(); + + return this; + + }, + + setFromRotationMatrix: function ( m, order, update ) { + + var clamp = _Math.clamp; + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + var te = m.elements; + var m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ]; + var m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ]; + var m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ]; + + order = order || this._order; + + if ( order === 'XYZ' ) { + + this._y = Math.asin( clamp( m13, - 1, 1 ) ); + + if ( Math.abs( m13 ) < 0.99999 ) { + + this._x = Math.atan2( - m23, m33 ); + this._z = Math.atan2( - m12, m11 ); + + } else { + + this._x = Math.atan2( m32, m22 ); + this._z = 0; + + } + + } else if ( order === 'YXZ' ) { + + this._x = Math.asin( - clamp( m23, - 1, 1 ) ); + + if ( Math.abs( m23 ) < 0.99999 ) { + + this._y = Math.atan2( m13, m33 ); + this._z = Math.atan2( m21, m22 ); + + } else { + + this._y = Math.atan2( - m31, m11 ); + this._z = 0; + + } + + } else if ( order === 'ZXY' ) { + + this._x = Math.asin( clamp( m32, - 1, 1 ) ); + + if ( Math.abs( m32 ) < 0.99999 ) { + + this._y = Math.atan2( - m31, m33 ); + this._z = Math.atan2( - m12, m22 ); + + } else { + + this._y = 0; + this._z = Math.atan2( m21, m11 ); + + } + + } else if ( order === 'ZYX' ) { + + this._y = Math.asin( - clamp( m31, - 1, 1 ) ); + + if ( Math.abs( m31 ) < 0.99999 ) { + + this._x = Math.atan2( m32, m33 ); + this._z = Math.atan2( m21, m11 ); + + } else { + + this._x = 0; + this._z = Math.atan2( - m12, m22 ); + + } + + } else if ( order === 'YZX' ) { + + this._z = Math.asin( clamp( m21, - 1, 1 ) ); + + if ( Math.abs( m21 ) < 0.99999 ) { + + this._x = Math.atan2( - m23, m22 ); + this._y = Math.atan2( - m31, m11 ); + + } else { + + this._x = 0; + this._y = Math.atan2( m13, m33 ); + + } + + } else if ( order === 'XZY' ) { + + this._z = Math.asin( - clamp( m12, - 1, 1 ) ); + + if ( Math.abs( m12 ) < 0.99999 ) { + + this._x = Math.atan2( m32, m22 ); + this._y = Math.atan2( m13, m11 ); + + } else { + + this._x = Math.atan2( - m23, m33 ); + this._y = 0; + + } + + } else { + + console.warn( 'THREE.Euler: .setFromRotationMatrix() given unsupported order: ' + order ); + + } + + this._order = order; + + if ( update !== false ) this.onChangeCallback(); + + return this; + + }, + + setFromQuaternion: function () { + + var matrix = new Matrix4(); + + return function setFromQuaternion( q, order, update ) { + + matrix.makeRotationFromQuaternion( q ); + + return this.setFromRotationMatrix( matrix, order, update ); + + }; + + }(), + + setFromVector3: function ( v, order ) { + + return this.set( v.x, v.y, v.z, order || this._order ); + + }, + + reorder: function () { + + // WARNING: this discards revolution information -bhouston + + var q = new Quaternion(); + + return function reorder( newOrder ) { + + q.setFromEuler( this ); + + return this.setFromQuaternion( q, newOrder ); + + }; + + }(), + + equals: function ( euler ) { + + return ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order ); + + }, + + fromArray: function ( array ) { + + this._x = array[ 0 ]; + this._y = array[ 1 ]; + this._z = array[ 2 ]; + if ( array[ 3 ] !== undefined ) this._order = array[ 3 ]; + + this.onChangeCallback(); + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this._x; + array[ offset + 1 ] = this._y; + array[ offset + 2 ] = this._z; + array[ offset + 3 ] = this._order; + + return array; + + }, + + toVector3: function ( optionalResult ) { + + if ( optionalResult ) { + + return optionalResult.set( this._x, this._y, this._z ); + + } else { + + return new Vector3( this._x, this._y, this._z ); + + } + + }, + + onChange: function ( callback ) { + + this.onChangeCallback = callback; + + return this; + + }, + + onChangeCallback: function () {} + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Layers() { + + this.mask = 1 | 0; + + } + + Object.assign( Layers.prototype, { + + set: function ( channel ) { + + this.mask = 1 << channel | 0; + + }, + + enable: function ( channel ) { + + this.mask |= 1 << channel | 0; + + }, + + toggle: function ( channel ) { + + this.mask ^= 1 << channel | 0; + + }, + + disable: function ( channel ) { + + this.mask &= ~ ( 1 << channel | 0 ); + + }, + + test: function ( layers ) { + + return ( this.mask & layers.mask ) !== 0; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author elephantatwork / www.elephantatwork.ch + */ + + var object3DId = 0; + + function Object3D() { + + Object.defineProperty( this, 'id', { value: object3DId ++ } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + this.type = 'Object3D'; + + this.parent = null; + this.children = []; + + this.up = Object3D.DefaultUp.clone(); + + var position = new Vector3(); + var rotation = new Euler(); + var quaternion = new Quaternion(); + var scale = new Vector3( 1, 1, 1 ); + + function onRotationChange() { + + quaternion.setFromEuler( rotation, false ); + + } + + function onQuaternionChange() { + + rotation.setFromQuaternion( quaternion, undefined, false ); + + } + + rotation.onChange( onRotationChange ); + quaternion.onChange( onQuaternionChange ); + + Object.defineProperties( this, { + position: { + enumerable: true, + value: position + }, + rotation: { + enumerable: true, + value: rotation + }, + quaternion: { + enumerable: true, + value: quaternion + }, + scale: { + enumerable: true, + value: scale + }, + modelViewMatrix: { + value: new Matrix4() + }, + normalMatrix: { + value: new Matrix3() + } + } ); + + this.matrix = new Matrix4(); + this.matrixWorld = new Matrix4(); + + this.matrixAutoUpdate = Object3D.DefaultMatrixAutoUpdate; + this.matrixWorldNeedsUpdate = false; + + this.layers = new Layers(); + this.visible = true; + + this.castShadow = false; + this.receiveShadow = false; + + this.frustumCulled = true; + this.renderOrder = 0; + + this.userData = {}; + } + + Object3D.DefaultUp = new Vector3( 0, 1, 0 ); + Object3D.DefaultMatrixAutoUpdate = true; + + Object.assign( Object3D.prototype, EventDispatcher.prototype, { + + isObject3D: true, + + onBeforeRender: function () {}, + onAfterRender: function () {}, + + applyMatrix: function ( matrix ) { + + this.matrix.multiplyMatrices( matrix, this.matrix ); + + this.matrix.decompose( this.position, this.quaternion, this.scale ); + + }, + + applyQuaternion: function ( q ) { + + this.quaternion.premultiply( q ); + + return this; + + }, + + setRotationFromAxisAngle: function ( axis, angle ) { + + // assumes axis is normalized + + this.quaternion.setFromAxisAngle( axis, angle ); + + }, + + setRotationFromEuler: function ( euler ) { + + this.quaternion.setFromEuler( euler, true ); + + }, + + setRotationFromMatrix: function ( m ) { + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + this.quaternion.setFromRotationMatrix( m ); + + }, + + setRotationFromQuaternion: function ( q ) { + + // assumes q is normalized + + this.quaternion.copy( q ); + + }, + + rotateOnAxis: function () { + + // rotate object on axis in object space + // axis is assumed to be normalized + + var q1 = new Quaternion(); + + return function rotateOnAxis( axis, angle ) { + + q1.setFromAxisAngle( axis, angle ); + + this.quaternion.multiply( q1 ); + + return this; + + }; + + }(), + + rotateX: function () { + + var v1 = new Vector3( 1, 0, 0 ); + + return function rotateX( angle ) { + + return this.rotateOnAxis( v1, angle ); + + }; + + }(), + + rotateY: function () { + + var v1 = new Vector3( 0, 1, 0 ); + + return function rotateY( angle ) { + + return this.rotateOnAxis( v1, angle ); + + }; + + }(), + + rotateZ: function () { + + var v1 = new Vector3( 0, 0, 1 ); + + return function rotateZ( angle ) { + + return this.rotateOnAxis( v1, angle ); + + }; + + }(), + + translateOnAxis: function () { + + // translate object by distance along axis in object space + // axis is assumed to be normalized + + var v1 = new Vector3(); + + return function translateOnAxis( axis, distance ) { + + v1.copy( axis ).applyQuaternion( this.quaternion ); + + this.position.add( v1.multiplyScalar( distance ) ); + + return this; + + }; + + }(), + + translateX: function () { + + var v1 = new Vector3( 1, 0, 0 ); + + return function translateX( distance ) { + + return this.translateOnAxis( v1, distance ); + + }; + + }(), + + translateY: function () { + + var v1 = new Vector3( 0, 1, 0 ); + + return function translateY( distance ) { + + return this.translateOnAxis( v1, distance ); + + }; + + }(), + + translateZ: function () { + + var v1 = new Vector3( 0, 0, 1 ); + + return function translateZ( distance ) { + + return this.translateOnAxis( v1, distance ); + + }; + + }(), + + localToWorld: function ( vector ) { + + return vector.applyMatrix4( this.matrixWorld ); + + }, + + worldToLocal: function () { + + var m1 = new Matrix4(); + + return function worldToLocal( vector ) { + + return vector.applyMatrix4( m1.getInverse( this.matrixWorld ) ); + + }; + + }(), + + lookAt: function () { + + // This method does not support objects with rotated and/or translated parent(s) + + var m1 = new Matrix4(); + + return function lookAt( vector ) { + + if ( this.isCamera ) { + + m1.lookAt( this.position, vector, this.up ); + + } else { + + m1.lookAt( vector, this.position, this.up ); + + } + + this.quaternion.setFromRotationMatrix( m1 ); + + }; + + }(), + + add: function ( object ) { + + if ( arguments.length > 1 ) { + + for ( var i = 0; i < arguments.length; i ++ ) { + + this.add( arguments[ i ] ); + + } + + return this; + + } + + if ( object === this ) { + + console.error( "THREE.Object3D.add: object can't be added as a child of itself.", object ); + return this; + + } + + if ( ( object && object.isObject3D ) ) { + + if ( object.parent !== null ) { + + object.parent.remove( object ); + + } + + object.parent = this; + object.dispatchEvent( { type: 'added' } ); + + this.children.push( object ); + + } else { + + console.error( "THREE.Object3D.add: object not an instance of THREE.Object3D.", object ); + + } + + return this; + + }, + + remove: function ( object ) { + + if ( arguments.length > 1 ) { + + for ( var i = 0; i < arguments.length; i ++ ) { + + this.remove( arguments[ i ] ); + + } + + return this; + + } + + var index = this.children.indexOf( object ); + + if ( index !== - 1 ) { + + object.parent = null; + + object.dispatchEvent( { type: 'removed' } ); + + this.children.splice( index, 1 ); + + } + + return this; + + }, + + getObjectById: function ( id ) { + + return this.getObjectByProperty( 'id', id ); + + }, + + getObjectByName: function ( name ) { + + return this.getObjectByProperty( 'name', name ); + + }, + + getObjectByProperty: function ( name, value ) { + + if ( this[ name ] === value ) return this; + + for ( var i = 0, l = this.children.length; i < l; i ++ ) { + + var child = this.children[ i ]; + var object = child.getObjectByProperty( name, value ); + + if ( object !== undefined ) { + + return object; + + } + + } + + return undefined; + + }, + + getWorldPosition: function ( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + + this.updateMatrixWorld( true ); + + return result.setFromMatrixPosition( this.matrixWorld ); + + }, + + getWorldQuaternion: function () { + + var position = new Vector3(); + var scale = new Vector3(); + + return function getWorldQuaternion( optionalTarget ) { + + var result = optionalTarget || new Quaternion(); + + this.updateMatrixWorld( true ); + + this.matrixWorld.decompose( position, result, scale ); + + return result; + + }; + + }(), + + getWorldRotation: function () { + + var quaternion = new Quaternion(); + + return function getWorldRotation( optionalTarget ) { + + var result = optionalTarget || new Euler(); + + this.getWorldQuaternion( quaternion ); + + return result.setFromQuaternion( quaternion, this.rotation.order, false ); + + }; + + }(), + + getWorldScale: function () { + + var position = new Vector3(); + var quaternion = new Quaternion(); + + return function getWorldScale( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + + this.updateMatrixWorld( true ); + + this.matrixWorld.decompose( position, quaternion, result ); + + return result; + + }; + + }(), + + getWorldDirection: function () { + + var quaternion = new Quaternion(); + + return function getWorldDirection( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + + this.getWorldQuaternion( quaternion ); + + return result.set( 0, 0, 1 ).applyQuaternion( quaternion ); + + }; + + }(), + + raycast: function () {}, + + traverse: function ( callback ) { + + callback( this ); + + var children = this.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].traverse( callback ); + + } + + }, + + traverseVisible: function ( callback ) { + + if ( this.visible === false ) return; + + callback( this ); + + var children = this.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].traverseVisible( callback ); + + } + + }, + + traverseAncestors: function ( callback ) { + + var parent = this.parent; + + if ( parent !== null ) { + + callback( parent ); + + parent.traverseAncestors( callback ); + + } + + }, + + updateMatrix: function () { + + this.matrix.compose( this.position, this.quaternion, this.scale ); + + this.matrixWorldNeedsUpdate = true; + + }, + + updateMatrixWorld: function ( force ) { + + if ( this.matrixAutoUpdate ) this.updateMatrix(); + + if ( this.matrixWorldNeedsUpdate || force ) { + + if ( this.parent === null ) { + + this.matrixWorld.copy( this.matrix ); + + } else { + + this.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix ); + + } + + this.matrixWorldNeedsUpdate = false; + + force = true; + + } + + // update children + + var children = this.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].updateMatrixWorld( force ); + + } + + }, + + toJSON: function ( meta ) { + + // meta is '' when called from JSON.stringify + var isRootObject = ( meta === undefined || meta === '' ); + + var output = {}; + + // meta is a hash used to collect geometries, materials. + // not providing it implies that this is the root object + // being serialized. + if ( isRootObject ) { + + // initialize meta obj + meta = { + geometries: {}, + materials: {}, + textures: {}, + images: {} + }; + + output.metadata = { + version: 4.5, + type: 'Object', + generator: 'Object3D.toJSON' + }; + + } + + // standard Object3D serialization + + var object = {}; + + object.uuid = this.uuid; + object.type = this.type; + + if ( this.name !== '' ) object.name = this.name; + if ( JSON.stringify( this.userData ) !== '{}' ) object.userData = this.userData; + if ( this.castShadow === true ) object.castShadow = true; + if ( this.receiveShadow === true ) object.receiveShadow = true; + if ( this.visible === false ) object.visible = false; + + object.matrix = this.matrix.toArray(); + + // + + function serialize( library, element ) { + + if ( library[ element.uuid ] === undefined ) { + + library[ element.uuid ] = element.toJSON( meta ); + + } + + return element.uuid; + + } + + if ( this.geometry !== undefined ) { + + object.geometry = serialize( meta.geometries, this.geometry ); + + } + + if ( this.material !== undefined ) { + + if ( Array.isArray( this.material ) ) { + + var uuids = []; + + for ( var i = 0, l = this.material.length; i < l; i ++ ) { + + uuids.push( serialize( meta.materials, this.material[ i ] ) ); + + } + + object.material = uuids; + + } else { + + object.material = serialize( meta.materials, this.material ); + + } + + } + + // + + if ( this.children.length > 0 ) { + + object.children = []; + + for ( var i = 0; i < this.children.length; i ++ ) { + + object.children.push( this.children[ i ].toJSON( meta ).object ); + + } + + } + + if ( isRootObject ) { + + var geometries = extractFromCache( meta.geometries ); + var materials = extractFromCache( meta.materials ); + var textures = extractFromCache( meta.textures ); + var images = extractFromCache( meta.images ); + + if ( geometries.length > 0 ) output.geometries = geometries; + if ( materials.length > 0 ) output.materials = materials; + if ( textures.length > 0 ) output.textures = textures; + if ( images.length > 0 ) output.images = images; + + } + + output.object = object; + + return output; + + // extract data from the cache hash + // remove metadata on each item + // and return as array + function extractFromCache( cache ) { + + var values = []; + for ( var key in cache ) { + + var data = cache[ key ]; + delete data.metadata; + values.push( data ); + + } + return values; + + } + + }, + + clone: function ( recursive ) { + + return new this.constructor().copy( this, recursive ); + + }, + + copy: function ( source, recursive ) { + + if ( recursive === undefined ) recursive = true; + + this.name = source.name; + + this.up.copy( source.up ); + + this.position.copy( source.position ); + this.quaternion.copy( source.quaternion ); + this.scale.copy( source.scale ); + + this.matrix.copy( source.matrix ); + this.matrixWorld.copy( source.matrixWorld ); + + this.matrixAutoUpdate = source.matrixAutoUpdate; + this.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate; + + this.layers.mask = source.layers.mask; + this.visible = source.visible; + + this.castShadow = source.castShadow; + this.receiveShadow = source.receiveShadow; + + this.frustumCulled = source.frustumCulled; + this.renderOrder = source.renderOrder; + + this.userData = JSON.parse( JSON.stringify( source.userData ) ); + + if ( recursive === true ) { + + for ( var i = 0; i < source.children.length; i ++ ) { + + var child = source.children[ i ]; + this.add( child.clone() ); + + } + + } + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author mikael emtinger / http://gomo.se/ + * @author WestLangley / http://github.com/WestLangley + */ + + function Camera() { + + Object3D.call( this ); + + this.type = 'Camera'; + + this.matrixWorldInverse = new Matrix4(); + this.projectionMatrix = new Matrix4(); + + } + + Camera.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Camera, + + isCamera: true, + + copy: function ( source, recursive ) { + + Object3D.prototype.copy.call( this, source, recursive ); + + this.matrixWorldInverse.copy( source.matrixWorldInverse ); + this.projectionMatrix.copy( source.projectionMatrix ); + + return this; + + }, + + getWorldDirection: function () { + + var quaternion = new Quaternion(); + + return function getWorldDirection( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + + this.getWorldQuaternion( quaternion ); + + return result.set( 0, 0, - 1 ).applyQuaternion( quaternion ); + + }; + + }(), + + updateMatrixWorld: function ( force ) { + + Object3D.prototype.updateMatrixWorld.call( this, force ); + + this.matrixWorldInverse.getInverse( this.matrixWorld ); + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author arose / http://github.com/arose + */ + + function OrthographicCamera( left, right, top, bottom, near, far ) { + + Camera.call( this ); + + this.type = 'OrthographicCamera'; + + this.zoom = 1; + this.view = null; + + this.left = left; + this.right = right; + this.top = top; + this.bottom = bottom; + + this.near = ( near !== undefined ) ? near : 0.1; + this.far = ( far !== undefined ) ? far : 2000; + + this.updateProjectionMatrix(); + + } + + OrthographicCamera.prototype = Object.assign( Object.create( Camera.prototype ), { + + constructor: OrthographicCamera, + + isOrthographicCamera: true, + + copy: function ( source, recursive ) { + + Camera.prototype.copy.call( this, source, recursive ); + + this.left = source.left; + this.right = source.right; + this.top = source.top; + this.bottom = source.bottom; + this.near = source.near; + this.far = source.far; + + this.zoom = source.zoom; + this.view = source.view === null ? null : Object.assign( {}, source.view ); + + return this; + + }, + + setViewOffset: function( fullWidth, fullHeight, x, y, width, height ) { + + this.view = { + fullWidth: fullWidth, + fullHeight: fullHeight, + offsetX: x, + offsetY: y, + width: width, + height: height + }; + + this.updateProjectionMatrix(); + + }, + + clearViewOffset: function() { + + this.view = null; + this.updateProjectionMatrix(); + + }, + + updateProjectionMatrix: function () { + + var dx = ( this.right - this.left ) / ( 2 * this.zoom ); + var dy = ( this.top - this.bottom ) / ( 2 * this.zoom ); + var cx = ( this.right + this.left ) / 2; + var cy = ( this.top + this.bottom ) / 2; + + var left = cx - dx; + var right = cx + dx; + var top = cy + dy; + var bottom = cy - dy; + + if ( this.view !== null ) { + + var zoomW = this.zoom / ( this.view.width / this.view.fullWidth ); + var zoomH = this.zoom / ( this.view.height / this.view.fullHeight ); + var scaleW = ( this.right - this.left ) / this.view.width; + var scaleH = ( this.top - this.bottom ) / this.view.height; + + left += scaleW * ( this.view.offsetX / zoomW ); + right = left + scaleW * ( this.view.width / zoomW ); + top -= scaleH * ( this.view.offsetY / zoomH ); + bottom = top - scaleH * ( this.view.height / zoomH ); + + } + + this.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far ); + + }, + + toJSON: function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + data.object.zoom = this.zoom; + data.object.left = this.left; + data.object.right = this.right; + data.object.top = this.top; + data.object.bottom = this.bottom; + data.object.near = this.near; + data.object.far = this.far; + + if ( this.view !== null ) data.object.view = Object.assign( {}, this.view ); + + return data; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author greggman / http://games.greggman.com/ + * @author zz85 / http://www.lab4games.net/zz85/blog + * @author tschw + */ + + function PerspectiveCamera( fov, aspect, near, far ) { + + Camera.call( this ); + + this.type = 'PerspectiveCamera'; + + this.fov = fov !== undefined ? fov : 50; + this.zoom = 1; + + this.near = near !== undefined ? near : 0.1; + this.far = far !== undefined ? far : 2000; + this.focus = 10; + + this.aspect = aspect !== undefined ? aspect : 1; + this.view = null; + + this.filmGauge = 35; // width of the film (default in millimeters) + this.filmOffset = 0; // horizontal film offset (same unit as gauge) + + this.updateProjectionMatrix(); + + } + + PerspectiveCamera.prototype = Object.assign( Object.create( Camera.prototype ), { + + constructor: PerspectiveCamera, + + isPerspectiveCamera: true, + + copy: function ( source, recursive ) { + + Camera.prototype.copy.call( this, source, recursive ); + + this.fov = source.fov; + this.zoom = source.zoom; + + this.near = source.near; + this.far = source.far; + this.focus = source.focus; + + this.aspect = source.aspect; + this.view = source.view === null ? null : Object.assign( {}, source.view ); + + this.filmGauge = source.filmGauge; + this.filmOffset = source.filmOffset; + + return this; + + }, + + /** + * Sets the FOV by focal length in respect to the current .filmGauge. + * + * The default film gauge is 35, so that the focal length can be specified for + * a 35mm (full frame) camera. + * + * Values for focal length and film gauge must have the same unit. + */ + setFocalLength: function ( focalLength ) { + + // see http://www.bobatkins.com/photography/technical/field_of_view.html + var vExtentSlope = 0.5 * this.getFilmHeight() / focalLength; + + this.fov = _Math.RAD2DEG * 2 * Math.atan( vExtentSlope ); + this.updateProjectionMatrix(); + + }, + + /** + * Calculates the focal length from the current .fov and .filmGauge. + */ + getFocalLength: function () { + + var vExtentSlope = Math.tan( _Math.DEG2RAD * 0.5 * this.fov ); + + return 0.5 * this.getFilmHeight() / vExtentSlope; + + }, + + getEffectiveFOV: function () { + + return _Math.RAD2DEG * 2 * Math.atan( + Math.tan( _Math.DEG2RAD * 0.5 * this.fov ) / this.zoom ); + + }, + + getFilmWidth: function () { + + // film not completely covered in portrait format (aspect < 1) + return this.filmGauge * Math.min( this.aspect, 1 ); + + }, + + getFilmHeight: function () { + + // film not completely covered in landscape format (aspect > 1) + return this.filmGauge / Math.max( this.aspect, 1 ); + + }, + + /** + * Sets an offset in a larger frustum. This is useful for multi-window or + * multi-monitor/multi-machine setups. + * + * For example, if you have 3x2 monitors and each monitor is 1920x1080 and + * the monitors are in grid like this + * + * +---+---+---+ + * | A | B | C | + * +---+---+---+ + * | D | E | F | + * +---+---+---+ + * + * then for each monitor you would call it like this + * + * var w = 1920; + * var h = 1080; + * var fullWidth = w * 3; + * var fullHeight = h * 2; + * + * --A-- + * camera.setOffset( fullWidth, fullHeight, w * 0, h * 0, w, h ); + * --B-- + * camera.setOffset( fullWidth, fullHeight, w * 1, h * 0, w, h ); + * --C-- + * camera.setOffset( fullWidth, fullHeight, w * 2, h * 0, w, h ); + * --D-- + * camera.setOffset( fullWidth, fullHeight, w * 0, h * 1, w, h ); + * --E-- + * camera.setOffset( fullWidth, fullHeight, w * 1, h * 1, w, h ); + * --F-- + * camera.setOffset( fullWidth, fullHeight, w * 2, h * 1, w, h ); + * + * Note there is no reason monitors have to be the same size or in a grid. + */ + setViewOffset: function ( fullWidth, fullHeight, x, y, width, height ) { + + this.aspect = fullWidth / fullHeight; + + this.view = { + fullWidth: fullWidth, + fullHeight: fullHeight, + offsetX: x, + offsetY: y, + width: width, + height: height + }; + + this.updateProjectionMatrix(); + + }, + + clearViewOffset: function () { + + this.view = null; + this.updateProjectionMatrix(); + + }, + + updateProjectionMatrix: function () { + + var near = this.near, + top = near * Math.tan( + _Math.DEG2RAD * 0.5 * this.fov ) / this.zoom, + height = 2 * top, + width = this.aspect * height, + left = - 0.5 * width, + view = this.view; + + if ( view !== null ) { + + var fullWidth = view.fullWidth, + fullHeight = view.fullHeight; + + left += view.offsetX * width / fullWidth; + top -= view.offsetY * height / fullHeight; + width *= view.width / fullWidth; + height *= view.height / fullHeight; + + } + + var skew = this.filmOffset; + if ( skew !== 0 ) left += near * skew / this.getFilmWidth(); + + this.projectionMatrix.makePerspective( left, left + width, top, top - height, near, this.far ); + + }, + + toJSON: function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + data.object.fov = this.fov; + data.object.zoom = this.zoom; + + data.object.near = this.near; + data.object.far = this.far; + data.object.focus = this.focus; + + data.object.aspect = this.aspect; + + if ( this.view !== null ) data.object.view = Object.assign( {}, this.view ); + + data.object.filmGauge = this.filmGauge; + data.object.filmOffset = this.filmOffset; + + return data; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function Face3( a, b, c, normal, color, materialIndex ) { + + this.a = a; + this.b = b; + this.c = c; + + this.normal = ( normal && normal.isVector3 ) ? normal : new Vector3(); + this.vertexNormals = Array.isArray( normal ) ? normal : []; + + this.color = ( color && color.isColor ) ? color : new Color(); + this.vertexColors = Array.isArray( color ) ? color : []; + + this.materialIndex = materialIndex !== undefined ? materialIndex : 0; + + } + + Object.assign( Face3.prototype, { + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.a = source.a; + this.b = source.b; + this.c = source.c; + + this.normal.copy( source.normal ); + this.color.copy( source.color ); + + this.materialIndex = source.materialIndex; + + for ( var i = 0, il = source.vertexNormals.length; i < il; i ++ ) { + + this.vertexNormals[ i ] = source.vertexNormals[ i ].clone(); + + } + + for ( var i = 0, il = source.vertexColors.length; i < il; i ++ ) { + + this.vertexColors[ i ] = source.vertexColors[ i ].clone(); + + } + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author kile / http://kile.stravaganza.org/ + * @author alteredq / http://alteredqualia.com/ + * @author mikael emtinger / http://gomo.se/ + * @author zz85 / http://www.lab4games.net/zz85/blog + * @author bhouston / http://clara.io + */ + + var count = 0; + function GeometryIdCount() { return count++; } + + function Geometry() { + + Object.defineProperty( this, 'id', { value: GeometryIdCount() } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + this.type = 'Geometry'; + + this.vertices = []; + this.colors = []; + this.faces = []; + this.faceVertexUvs = [[]]; + + this.morphTargets = []; + this.morphNormals = []; + + this.skinWeights = []; + this.skinIndices = []; + + this.lineDistances = []; + + this.boundingBox = null; + this.boundingSphere = null; + + // update flags + + this.elementsNeedUpdate = false; + this.verticesNeedUpdate = false; + this.uvsNeedUpdate = false; + this.normalsNeedUpdate = false; + this.colorsNeedUpdate = false; + this.lineDistancesNeedUpdate = false; + this.groupsNeedUpdate = false; + + } + + Object.assign( Geometry.prototype, EventDispatcher.prototype, { + + isGeometry: true, + + applyMatrix: function ( matrix ) { + + var normalMatrix = new Matrix3().getNormalMatrix( matrix ); + + for ( var i = 0, il = this.vertices.length; i < il; i ++ ) { + + var vertex = this.vertices[ i ]; + vertex.applyMatrix4( matrix ); + + } + + for ( var i = 0, il = this.faces.length; i < il; i ++ ) { + + var face = this.faces[ i ]; + face.normal.applyMatrix3( normalMatrix ).normalize(); + + for ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) { + + face.vertexNormals[ j ].applyMatrix3( normalMatrix ).normalize(); + + } + + } + + if ( this.boundingBox !== null ) { + + this.computeBoundingBox(); + + } + + if ( this.boundingSphere !== null ) { + + this.computeBoundingSphere(); + + } + + this.verticesNeedUpdate = true; + this.normalsNeedUpdate = true; + + return this; + + }, + + rotateX: function () { + + // rotate geometry around world x-axis + + var m1 = new Matrix4(); + + return function rotateX( angle ) { + + m1.makeRotationX( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + rotateY: function () { + + // rotate geometry around world y-axis + + var m1 = new Matrix4(); + + return function rotateY( angle ) { + + m1.makeRotationY( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + rotateZ: function () { + + // rotate geometry around world z-axis + + var m1 = new Matrix4(); + + return function rotateZ( angle ) { + + m1.makeRotationZ( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + translate: function () { + + // translate geometry + + var m1 = new Matrix4(); + + return function translate( x, y, z ) { + + m1.makeTranslation( x, y, z ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + scale: function () { + + // scale geometry + + var m1 = new Matrix4(); + + return function scale( x, y, z ) { + + m1.makeScale( x, y, z ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + lookAt: function () { + + var obj = new Object3D(); + + return function lookAt( vector ) { + + obj.lookAt( vector ); + + obj.updateMatrix(); + + this.applyMatrix( obj.matrix ); + + }; + + }(), + + fromBufferGeometry: function ( geometry ) { + + var scope = this; + + var indices = geometry.index !== null ? geometry.index.array : undefined; + var attributes = geometry.attributes; + + var positions = attributes.position.array; + var normals = attributes.normal !== undefined ? attributes.normal.array : undefined; + var colors = attributes.color !== undefined ? attributes.color.array : undefined; + var uvs = attributes.uv !== undefined ? attributes.uv.array : undefined; + var uvs2 = attributes.uv2 !== undefined ? attributes.uv2.array : undefined; + + if ( uvs2 !== undefined ) this.faceVertexUvs[ 1 ] = []; + + var tempNormals = []; + var tempUVs = []; + var tempUVs2 = []; + + for ( var i = 0, j = 0; i < positions.length; i += 3, j += 2 ) { + + scope.vertices.push( new Vector3( positions[ i ], positions[ i + 1 ], positions[ i + 2 ] ) ); + + if ( normals !== undefined ) { + + tempNormals.push( new Vector3( normals[ i ], normals[ i + 1 ], normals[ i + 2 ] ) ); + + } + + if ( colors !== undefined ) { + + scope.colors.push( new Color( colors[ i ], colors[ i + 1 ], colors[ i + 2 ] ) ); + + } + + if ( uvs !== undefined ) { + + tempUVs.push( new Vector2( uvs[ j ], uvs[ j + 1 ] ) ); + + } + + if ( uvs2 !== undefined ) { + + tempUVs2.push( new Vector2( uvs2[ j ], uvs2[ j + 1 ] ) ); + + } + + } + + function addFace( a, b, c, materialIndex ) { + + var vertexNormals = normals !== undefined ? [ tempNormals[ a ].clone(), tempNormals[ b ].clone(), tempNormals[ c ].clone() ] : []; + var vertexColors = colors !== undefined ? [ scope.colors[ a ].clone(), scope.colors[ b ].clone(), scope.colors[ c ].clone() ] : []; + + var face = new Face3( a, b, c, vertexNormals, vertexColors, materialIndex ); + + scope.faces.push( face ); + + if ( uvs !== undefined ) { + + scope.faceVertexUvs[ 0 ].push( [ tempUVs[ a ].clone(), tempUVs[ b ].clone(), tempUVs[ c ].clone() ] ); + + } + + if ( uvs2 !== undefined ) { + + scope.faceVertexUvs[ 1 ].push( [ tempUVs2[ a ].clone(), tempUVs2[ b ].clone(), tempUVs2[ c ].clone() ] ); + + } + + } + + var groups = geometry.groups; + + if ( groups.length > 0 ) { + + for ( var i = 0; i < groups.length; i ++ ) { + + var group = groups[ i ]; + + var start = group.start; + var count = group.count; + + for ( var j = start, jl = start + count; j < jl; j += 3 ) { + + if ( indices !== undefined ) { + + addFace( indices[ j ], indices[ j + 1 ], indices[ j + 2 ], group.materialIndex ); + + } else { + + addFace( j, j + 1, j + 2, group.materialIndex ); + + } + + } + + } + + } else { + + if ( indices !== undefined ) { + + for ( var i = 0; i < indices.length; i += 3 ) { + + addFace( indices[ i ], indices[ i + 1 ], indices[ i + 2 ] ); + + } + + } else { + + for ( var i = 0; i < positions.length / 3; i += 3 ) { + + addFace( i, i + 1, i + 2 ); + + } + + } + + } + + this.computeFaceNormals(); + + if ( geometry.boundingBox !== null ) { + + this.boundingBox = geometry.boundingBox.clone(); + + } + + if ( geometry.boundingSphere !== null ) { + + this.boundingSphere = geometry.boundingSphere.clone(); + + } + + return this; + + }, + + center: function () { + + this.computeBoundingBox(); + + var offset = this.boundingBox.getCenter().negate(); + + this.translate( offset.x, offset.y, offset.z ); + + return offset; + + }, + + normalize: function () { + + this.computeBoundingSphere(); + + var center = this.boundingSphere.center; + var radius = this.boundingSphere.radius; + + var s = radius === 0 ? 1 : 1.0 / radius; + + var matrix = new Matrix4(); + matrix.set( + s, 0, 0, - s * center.x, + 0, s, 0, - s * center.y, + 0, 0, s, - s * center.z, + 0, 0, 0, 1 + ); + + this.applyMatrix( matrix ); + + return this; + + }, + + computeFaceNormals: function () { + + var cb = new Vector3(), ab = new Vector3(); + + for ( var f = 0, fl = this.faces.length; f < fl; f ++ ) { + + var face = this.faces[ f ]; + + var vA = this.vertices[ face.a ]; + var vB = this.vertices[ face.b ]; + var vC = this.vertices[ face.c ]; + + cb.subVectors( vC, vB ); + ab.subVectors( vA, vB ); + cb.cross( ab ); + + cb.normalize(); + + face.normal.copy( cb ); + + } + + }, + + computeVertexNormals: function ( areaWeighted ) { + + if ( areaWeighted === undefined ) areaWeighted = true; + + var v, vl, f, fl, face, vertices; + + vertices = new Array( this.vertices.length ); + + for ( v = 0, vl = this.vertices.length; v < vl; v ++ ) { + + vertices[ v ] = new Vector3(); + + } + + if ( areaWeighted ) { + + // vertex normals weighted by triangle areas + // http://www.iquilezles.org/www/articles/normals/normals.htm + + var vA, vB, vC; + var cb = new Vector3(), ab = new Vector3(); + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + vA = this.vertices[ face.a ]; + vB = this.vertices[ face.b ]; + vC = this.vertices[ face.c ]; + + cb.subVectors( vC, vB ); + ab.subVectors( vA, vB ); + cb.cross( ab ); + + vertices[ face.a ].add( cb ); + vertices[ face.b ].add( cb ); + vertices[ face.c ].add( cb ); + + } + + } else { + + this.computeFaceNormals(); + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + vertices[ face.a ].add( face.normal ); + vertices[ face.b ].add( face.normal ); + vertices[ face.c ].add( face.normal ); + + } + + } + + for ( v = 0, vl = this.vertices.length; v < vl; v ++ ) { + + vertices[ v ].normalize(); + + } + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + var vertexNormals = face.vertexNormals; + + if ( vertexNormals.length === 3 ) { + + vertexNormals[ 0 ].copy( vertices[ face.a ] ); + vertexNormals[ 1 ].copy( vertices[ face.b ] ); + vertexNormals[ 2 ].copy( vertices[ face.c ] ); + + } else { + + vertexNormals[ 0 ] = vertices[ face.a ].clone(); + vertexNormals[ 1 ] = vertices[ face.b ].clone(); + vertexNormals[ 2 ] = vertices[ face.c ].clone(); + + } + + } + + if ( this.faces.length > 0 ) { + + this.normalsNeedUpdate = true; + + } + + }, + + computeFlatVertexNormals: function () { + + var f, fl, face; + + this.computeFaceNormals(); + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + var vertexNormals = face.vertexNormals; + + if ( vertexNormals.length === 3 ) { + + vertexNormals[ 0 ].copy( face.normal ); + vertexNormals[ 1 ].copy( face.normal ); + vertexNormals[ 2 ].copy( face.normal ); + + } else { + + vertexNormals[ 0 ] = face.normal.clone(); + vertexNormals[ 1 ] = face.normal.clone(); + vertexNormals[ 2 ] = face.normal.clone(); + + } + + } + + if ( this.faces.length > 0 ) { + + this.normalsNeedUpdate = true; + + } + + }, + + computeMorphNormals: function () { + + var i, il, f, fl, face; + + // save original normals + // - create temp variables on first access + // otherwise just copy (for faster repeated calls) + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + if ( ! face.__originalFaceNormal ) { + + face.__originalFaceNormal = face.normal.clone(); + + } else { + + face.__originalFaceNormal.copy( face.normal ); + + } + + if ( ! face.__originalVertexNormals ) face.__originalVertexNormals = []; + + for ( i = 0, il = face.vertexNormals.length; i < il; i ++ ) { + + if ( ! face.__originalVertexNormals[ i ] ) { + + face.__originalVertexNormals[ i ] = face.vertexNormals[ i ].clone(); + + } else { + + face.__originalVertexNormals[ i ].copy( face.vertexNormals[ i ] ); + + } + + } + + } + + // use temp geometry to compute face and vertex normals for each morph + + var tmpGeo = new Geometry(); + tmpGeo.faces = this.faces; + + for ( i = 0, il = this.morphTargets.length; i < il; i ++ ) { + + // create on first access + + if ( ! this.morphNormals[ i ] ) { + + this.morphNormals[ i ] = {}; + this.morphNormals[ i ].faceNormals = []; + this.morphNormals[ i ].vertexNormals = []; + + var dstNormalsFace = this.morphNormals[ i ].faceNormals; + var dstNormalsVertex = this.morphNormals[ i ].vertexNormals; + + var faceNormal, vertexNormals; + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + faceNormal = new Vector3(); + vertexNormals = { a: new Vector3(), b: new Vector3(), c: new Vector3() }; + + dstNormalsFace.push( faceNormal ); + dstNormalsVertex.push( vertexNormals ); + + } + + } + + var morphNormals = this.morphNormals[ i ]; + + // set vertices to morph target + + tmpGeo.vertices = this.morphTargets[ i ].vertices; + + // compute morph normals + + tmpGeo.computeFaceNormals(); + tmpGeo.computeVertexNormals(); + + // store morph normals + + var faceNormal, vertexNormals; + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + faceNormal = morphNormals.faceNormals[ f ]; + vertexNormals = morphNormals.vertexNormals[ f ]; + + faceNormal.copy( face.normal ); + + vertexNormals.a.copy( face.vertexNormals[ 0 ] ); + vertexNormals.b.copy( face.vertexNormals[ 1 ] ); + vertexNormals.c.copy( face.vertexNormals[ 2 ] ); + + } + + } + + // restore original normals + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + face.normal = face.__originalFaceNormal; + face.vertexNormals = face.__originalVertexNormals; + + } + + }, + + computeLineDistances: function () { + + var d = 0; + var vertices = this.vertices; + + for ( var i = 0, il = vertices.length; i < il; i ++ ) { + + if ( i > 0 ) { + + d += vertices[ i ].distanceTo( vertices[ i - 1 ] ); + + } + + this.lineDistances[ i ] = d; + + } + + }, + + computeBoundingBox: function () { + + if ( this.boundingBox === null ) { + + this.boundingBox = new Box3(); + + } + + this.boundingBox.setFromPoints( this.vertices ); + + }, + + computeBoundingSphere: function () { + + if ( this.boundingSphere === null ) { + + this.boundingSphere = new Sphere(); + + } + + this.boundingSphere.setFromPoints( this.vertices ); + + }, + + merge: function ( geometry, matrix, materialIndexOffset ) { + + if ( ! ( geometry && geometry.isGeometry ) ) { + + console.error( 'THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.', geometry ); + return; + + } + + var normalMatrix, + vertexOffset = this.vertices.length, + vertices1 = this.vertices, + vertices2 = geometry.vertices, + faces1 = this.faces, + faces2 = geometry.faces, + uvs1 = this.faceVertexUvs[ 0 ], + uvs2 = geometry.faceVertexUvs[ 0 ], + colors1 = this.colors, + colors2 = geometry.colors; + + if ( materialIndexOffset === undefined ) materialIndexOffset = 0; + + if ( matrix !== undefined ) { + + normalMatrix = new Matrix3().getNormalMatrix( matrix ); + + } + + // vertices + + for ( var i = 0, il = vertices2.length; i < il; i ++ ) { + + var vertex = vertices2[ i ]; + + var vertexCopy = vertex.clone(); + + if ( matrix !== undefined ) vertexCopy.applyMatrix4( matrix ); + + vertices1.push( vertexCopy ); + + } + + // colors + + for ( var i = 0, il = colors2.length; i < il; i ++ ) { + + colors1.push( colors2[ i ].clone() ); + + } + + // faces + + for ( i = 0, il = faces2.length; i < il; i ++ ) { + + var face = faces2[ i ], faceCopy, normal, color, + faceVertexNormals = face.vertexNormals, + faceVertexColors = face.vertexColors; + + faceCopy = new Face3( face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset ); + faceCopy.normal.copy( face.normal ); + + if ( normalMatrix !== undefined ) { + + faceCopy.normal.applyMatrix3( normalMatrix ).normalize(); + + } + + for ( var j = 0, jl = faceVertexNormals.length; j < jl; j ++ ) { + + normal = faceVertexNormals[ j ].clone(); + + if ( normalMatrix !== undefined ) { + + normal.applyMatrix3( normalMatrix ).normalize(); + + } + + faceCopy.vertexNormals.push( normal ); + + } + + faceCopy.color.copy( face.color ); + + for ( var j = 0, jl = faceVertexColors.length; j < jl; j ++ ) { + + color = faceVertexColors[ j ]; + faceCopy.vertexColors.push( color.clone() ); + + } + + faceCopy.materialIndex = face.materialIndex + materialIndexOffset; + + faces1.push( faceCopy ); + + } + + // uvs + + for ( i = 0, il = uvs2.length; i < il; i ++ ) { + + var uv = uvs2[ i ], uvCopy = []; + + if ( uv === undefined ) { + + continue; + + } + + for ( var j = 0, jl = uv.length; j < jl; j ++ ) { + + uvCopy.push( uv[ j ].clone() ); + + } + + uvs1.push( uvCopy ); + + } + + }, + + mergeMesh: function ( mesh ) { + + if ( ! ( mesh && mesh.isMesh ) ) { + + console.error( 'THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.', mesh ); + return; + + } + + mesh.matrixAutoUpdate && mesh.updateMatrix(); + + this.merge( mesh.geometry, mesh.matrix ); + + }, + + /* + * Checks for duplicate vertices with hashmap. + * Duplicated vertices are removed + * and faces' vertices are updated. + */ + + mergeVertices: function () { + + var verticesMap = {}; // Hashmap for looking up vertices by position coordinates (and making sure they are unique) + var unique = [], changes = []; + + var v, key; + var precisionPoints = 4; // number of decimal points, e.g. 4 for epsilon of 0.0001 + var precision = Math.pow( 10, precisionPoints ); + var i, il, face; + var indices, j, jl; + + for ( i = 0, il = this.vertices.length; i < il; i ++ ) { + + v = this.vertices[ i ]; + key = Math.round( v.x * precision ) + '_' + Math.round( v.y * precision ) + '_' + Math.round( v.z * precision ); + + if ( verticesMap[ key ] === undefined ) { + + verticesMap[ key ] = i; + unique.push( this.vertices[ i ] ); + changes[ i ] = unique.length - 1; + + } else { + + //console.log('Duplicate vertex found. ', i, ' could be using ', verticesMap[key]); + changes[ i ] = changes[ verticesMap[ key ] ]; + + } + + } + + + // if faces are completely degenerate after merging vertices, we + // have to remove them from the geometry. + var faceIndicesToRemove = []; + + for ( i = 0, il = this.faces.length; i < il; i ++ ) { + + face = this.faces[ i ]; + + face.a = changes[ face.a ]; + face.b = changes[ face.b ]; + face.c = changes[ face.c ]; + + indices = [ face.a, face.b, face.c ]; + + // if any duplicate vertices are found in a Face3 + // we have to remove the face as nothing can be saved + for ( var n = 0; n < 3; n ++ ) { + + if ( indices[ n ] === indices[ ( n + 1 ) % 3 ] ) { + + faceIndicesToRemove.push( i ); + break; + + } + + } + + } + + for ( i = faceIndicesToRemove.length - 1; i >= 0; i -- ) { + + var idx = faceIndicesToRemove[ i ]; + + this.faces.splice( idx, 1 ); + + for ( j = 0, jl = this.faceVertexUvs.length; j < jl; j ++ ) { + + this.faceVertexUvs[ j ].splice( idx, 1 ); + + } + + } + + // Use unique set of vertices + + var diff = this.vertices.length - unique.length; + this.vertices = unique; + return diff; + + }, + + sortFacesByMaterialIndex: function () { + + var faces = this.faces; + var length = faces.length; + + // tag faces + + for ( var i = 0; i < length; i ++ ) { + + faces[ i ]._id = i; + + } + + // sort faces + + function materialIndexSort( a, b ) { + + return a.materialIndex - b.materialIndex; + + } + + faces.sort( materialIndexSort ); + + // sort uvs + + var uvs1 = this.faceVertexUvs[ 0 ]; + var uvs2 = this.faceVertexUvs[ 1 ]; + + var newUvs1, newUvs2; + + if ( uvs1 && uvs1.length === length ) newUvs1 = []; + if ( uvs2 && uvs2.length === length ) newUvs2 = []; + + for ( var i = 0; i < length; i ++ ) { + + var id = faces[ i ]._id; + + if ( newUvs1 ) newUvs1.push( uvs1[ id ] ); + if ( newUvs2 ) newUvs2.push( uvs2[ id ] ); + + } + + if ( newUvs1 ) this.faceVertexUvs[ 0 ] = newUvs1; + if ( newUvs2 ) this.faceVertexUvs[ 1 ] = newUvs2; + + }, + + toJSON: function () { + + var data = { + metadata: { + version: 4.5, + type: 'Geometry', + generator: 'Geometry.toJSON' + } + }; + + // standard Geometry serialization + + data.uuid = this.uuid; + data.type = this.type; + if ( this.name !== '' ) data.name = this.name; + + if ( this.parameters !== undefined ) { + + var parameters = this.parameters; + + for ( var key in parameters ) { + + if ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ]; + + } + + return data; + + } + + var vertices = []; + + for ( var i = 0; i < this.vertices.length; i ++ ) { + + var vertex = this.vertices[ i ]; + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + var faces = []; + var normals = []; + var normalsHash = {}; + var colors = []; + var colorsHash = {}; + var uvs = []; + var uvsHash = {}; + + for ( var i = 0; i < this.faces.length; i ++ ) { + + var face = this.faces[ i ]; + + var hasMaterial = true; + var hasFaceUv = false; // deprecated + var hasFaceVertexUv = this.faceVertexUvs[ 0 ][ i ] !== undefined; + var hasFaceNormal = face.normal.length() > 0; + var hasFaceVertexNormal = face.vertexNormals.length > 0; + var hasFaceColor = face.color.r !== 1 || face.color.g !== 1 || face.color.b !== 1; + var hasFaceVertexColor = face.vertexColors.length > 0; + + var faceType = 0; + + faceType = setBit( faceType, 0, 0 ); // isQuad + faceType = setBit( faceType, 1, hasMaterial ); + faceType = setBit( faceType, 2, hasFaceUv ); + faceType = setBit( faceType, 3, hasFaceVertexUv ); + faceType = setBit( faceType, 4, hasFaceNormal ); + faceType = setBit( faceType, 5, hasFaceVertexNormal ); + faceType = setBit( faceType, 6, hasFaceColor ); + faceType = setBit( faceType, 7, hasFaceVertexColor ); + + faces.push( faceType ); + faces.push( face.a, face.b, face.c ); + faces.push( face.materialIndex ); + + if ( hasFaceVertexUv ) { + + var faceVertexUvs = this.faceVertexUvs[ 0 ][ i ]; + + faces.push( + getUvIndex( faceVertexUvs[ 0 ] ), + getUvIndex( faceVertexUvs[ 1 ] ), + getUvIndex( faceVertexUvs[ 2 ] ) + ); + + } + + if ( hasFaceNormal ) { + + faces.push( getNormalIndex( face.normal ) ); + + } + + if ( hasFaceVertexNormal ) { + + var vertexNormals = face.vertexNormals; + + faces.push( + getNormalIndex( vertexNormals[ 0 ] ), + getNormalIndex( vertexNormals[ 1 ] ), + getNormalIndex( vertexNormals[ 2 ] ) + ); + + } + + if ( hasFaceColor ) { + + faces.push( getColorIndex( face.color ) ); + + } + + if ( hasFaceVertexColor ) { + + var vertexColors = face.vertexColors; + + faces.push( + getColorIndex( vertexColors[ 0 ] ), + getColorIndex( vertexColors[ 1 ] ), + getColorIndex( vertexColors[ 2 ] ) + ); + + } + + } + + function setBit( value, position, enabled ) { + + return enabled ? value | ( 1 << position ) : value & ( ~ ( 1 << position ) ); + + } + + function getNormalIndex( normal ) { + + var hash = normal.x.toString() + normal.y.toString() + normal.z.toString(); + + if ( normalsHash[ hash ] !== undefined ) { + + return normalsHash[ hash ]; + + } + + normalsHash[ hash ] = normals.length / 3; + normals.push( normal.x, normal.y, normal.z ); + + return normalsHash[ hash ]; + + } + + function getColorIndex( color ) { + + var hash = color.r.toString() + color.g.toString() + color.b.toString(); + + if ( colorsHash[ hash ] !== undefined ) { + + return colorsHash[ hash ]; + + } + + colorsHash[ hash ] = colors.length; + colors.push( color.getHex() ); + + return colorsHash[ hash ]; + + } + + function getUvIndex( uv ) { + + var hash = uv.x.toString() + uv.y.toString(); + + if ( uvsHash[ hash ] !== undefined ) { + + return uvsHash[ hash ]; + + } + + uvsHash[ hash ] = uvs.length / 2; + uvs.push( uv.x, uv.y ); + + return uvsHash[ hash ]; + + } + + data.data = {}; + + data.data.vertices = vertices; + data.data.normals = normals; + if ( colors.length > 0 ) data.data.colors = colors; + if ( uvs.length > 0 ) data.data.uvs = [ uvs ]; // temporal backward compatibility + data.data.faces = faces; + + return data; + + }, + + clone: function () { + + /* + // Handle primitives + + var parameters = this.parameters; + + if ( parameters !== undefined ) { + + var values = []; + + for ( var key in parameters ) { + + values.push( parameters[ key ] ); + + } + + var geometry = Object.create( this.constructor.prototype ); + this.constructor.apply( geometry, values ); + return geometry; + + } + + return new this.constructor().copy( this ); + */ + + return new Geometry().copy( this ); + + }, + + copy: function ( source ) { + + var i, il, j, jl, k, kl; + + // reset + + this.vertices = []; + this.colors = []; + this.faces = []; + this.faceVertexUvs = [[]]; + this.morphTargets = []; + this.morphNormals = []; + this.skinWeights = []; + this.skinIndices = []; + this.lineDistances = []; + this.boundingBox = null; + this.boundingSphere = null; + + // name + + this.name = source.name; + + // vertices + + var vertices = source.vertices; + + for ( i = 0, il = vertices.length; i < il; i ++ ) { + + this.vertices.push( vertices[ i ].clone() ); + + } + + // colors + + var colors = source.colors; + + for ( i = 0, il = colors.length; i < il; i ++ ) { + + this.colors.push( colors[ i ].clone() ); + + } + + // faces + + var faces = source.faces; + + for ( i = 0, il = faces.length; i < il; i ++ ) { + + this.faces.push( faces[ i ].clone() ); + + } + + // face vertex uvs + + for ( i = 0, il = source.faceVertexUvs.length; i < il; i ++ ) { + + var faceVertexUvs = source.faceVertexUvs[ i ]; + + if ( this.faceVertexUvs[ i ] === undefined ) { + + this.faceVertexUvs[ i ] = []; + + } + + for ( j = 0, jl = faceVertexUvs.length; j < jl; j ++ ) { + + var uvs = faceVertexUvs[ j ], uvsCopy = []; + + for ( k = 0, kl = uvs.length; k < kl; k ++ ) { + + var uv = uvs[ k ]; + + uvsCopy.push( uv.clone() ); + + } + + this.faceVertexUvs[ i ].push( uvsCopy ); + + } + + } + + // morph targets + + var morphTargets = source.morphTargets; + + for ( i = 0, il = morphTargets.length; i < il; i ++ ) { + + var morphTarget = {}; + morphTarget.name = morphTargets[ i ].name; + + // vertices + + if ( morphTargets[ i ].vertices !== undefined ) { + + morphTarget.vertices = []; + + for ( j = 0, jl = morphTargets[ i ].vertices.length; j < jl; j ++ ) { + + morphTarget.vertices.push( morphTargets[ i ].vertices[ j ].clone() ); + + } + + } + + // normals + + if ( morphTargets[ i ].normals !== undefined ) { + + morphTarget.normals = []; + + for ( j = 0, jl = morphTargets[ i ].normals.length; j < jl; j ++ ) { + + morphTarget.normals.push( morphTargets[ i ].normals[ j ].clone() ); + + } + + } + + this.morphTargets.push( morphTarget ); + + } + + // morph normals + + var morphNormals = source.morphNormals; + + for ( i = 0, il = morphNormals.length; i < il; i ++ ) { + + var morphNormal = {}; + + // vertex normals + + if ( morphNormals[ i ].vertexNormals !== undefined ) { + + morphNormal.vertexNormals = []; + + for ( j = 0, jl = morphNormals[ i ].vertexNormals.length; j < jl; j ++ ) { + + var srcVertexNormal = morphNormals[ i ].vertexNormals[ j ]; + var destVertexNormal = {}; + + destVertexNormal.a = srcVertexNormal.a.clone(); + destVertexNormal.b = srcVertexNormal.b.clone(); + destVertexNormal.c = srcVertexNormal.c.clone(); + + morphNormal.vertexNormals.push( destVertexNormal ); + + } + + } + + // face normals + + if ( morphNormals[ i ].faceNormals !== undefined ) { + + morphNormal.faceNormals = []; + + for ( j = 0, jl = morphNormals[ i ].faceNormals.length; j < jl; j ++ ) { + + morphNormal.faceNormals.push( morphNormals[ i ].faceNormals[ j ].clone() ); + + } + + } + + this.morphNormals.push( morphNormal ); + + } + + // skin weights + + var skinWeights = source.skinWeights; + + for ( i = 0, il = skinWeights.length; i < il; i ++ ) { + + this.skinWeights.push( skinWeights[ i ].clone() ); + + } + + // skin indices + + var skinIndices = source.skinIndices; + + for ( i = 0, il = skinIndices.length; i < il; i ++ ) { + + this.skinIndices.push( skinIndices[ i ].clone() ); + + } + + // line distances + + var lineDistances = source.lineDistances; + + for ( i = 0, il = lineDistances.length; i < il; i ++ ) { + + this.lineDistances.push( lineDistances[ i ] ); + + } + + // bounding box + + var boundingBox = source.boundingBox; + + if ( boundingBox !== null ) { + + this.boundingBox = boundingBox.clone(); + + } + + // bounding sphere + + var boundingSphere = source.boundingSphere; + + if ( boundingSphere !== null ) { + + this.boundingSphere = boundingSphere.clone(); + + } + + // update flags + + this.elementsNeedUpdate = source.elementsNeedUpdate; + this.verticesNeedUpdate = source.verticesNeedUpdate; + this.uvsNeedUpdate = source.uvsNeedUpdate; + this.normalsNeedUpdate = source.normalsNeedUpdate; + this.colorsNeedUpdate = source.colorsNeedUpdate; + this.lineDistancesNeedUpdate = source.lineDistancesNeedUpdate; + this.groupsNeedUpdate = source.groupsNeedUpdate; + + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function BufferAttribute( array, itemSize, normalized ) { + + if ( Array.isArray( array ) ) { + + throw new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' ); + + } + + this.uuid = _Math.generateUUID(); + this.name = ''; + + this.array = array; + this.itemSize = itemSize; + this.count = array !== undefined ? array.length / itemSize : 0; + this.normalized = normalized === true; + + this.dynamic = false; + this.updateRange = { offset: 0, count: - 1 }; + + this.onUploadCallback = function () {}; + + this.version = 0; + + } + + Object.defineProperty( BufferAttribute.prototype, 'needsUpdate', { + + set: function ( value ) { + + if ( value === true ) this.version ++; + + } + + } ); + + Object.assign( BufferAttribute.prototype, { + + isBufferAttribute: true, + + setArray: function ( array ) { + + if ( Array.isArray( array ) ) { + + throw new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' ); + + } + + this.count = array !== undefined ? array.length / this.itemSize : 0; + this.array = array; + + }, + + setDynamic: function ( value ) { + + this.dynamic = value; + + return this; + + }, + + copy: function ( source ) { + + this.array = new source.array.constructor( source.array ); + this.itemSize = source.itemSize; + this.count = source.count; + this.normalized = source.normalized; + + this.dynamic = source.dynamic; + + return this; + + }, + + copyAt: function ( index1, attribute, index2 ) { + + index1 *= this.itemSize; + index2 *= attribute.itemSize; + + for ( var i = 0, l = this.itemSize; i < l; i ++ ) { + + this.array[ index1 + i ] = attribute.array[ index2 + i ]; + + } + + return this; + + }, + + copyArray: function ( array ) { + + this.array.set( array ); + + return this; + + }, + + copyColorsArray: function ( colors ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = colors.length; i < l; i ++ ) { + + var color = colors[ i ]; + + if ( color === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyColorsArray(): color is undefined', i ); + color = new Color(); + + } + + array[ offset ++ ] = color.r; + array[ offset ++ ] = color.g; + array[ offset ++ ] = color.b; + + } + + return this; + + }, + + copyIndicesArray: function ( indices ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = indices.length; i < l; i ++ ) { + + var index = indices[ i ]; + + array[ offset ++ ] = index.a; + array[ offset ++ ] = index.b; + array[ offset ++ ] = index.c; + + } + + return this; + + }, + + copyVector2sArray: function ( vectors ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = vectors.length; i < l; i ++ ) { + + var vector = vectors[ i ]; + + if ( vector === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyVector2sArray(): vector is undefined', i ); + vector = new Vector2(); + + } + + array[ offset ++ ] = vector.x; + array[ offset ++ ] = vector.y; + + } + + return this; + + }, + + copyVector3sArray: function ( vectors ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = vectors.length; i < l; i ++ ) { + + var vector = vectors[ i ]; + + if ( vector === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyVector3sArray(): vector is undefined', i ); + vector = new Vector3(); + + } + + array[ offset ++ ] = vector.x; + array[ offset ++ ] = vector.y; + array[ offset ++ ] = vector.z; + + } + + return this; + + }, + + copyVector4sArray: function ( vectors ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = vectors.length; i < l; i ++ ) { + + var vector = vectors[ i ]; + + if ( vector === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyVector4sArray(): vector is undefined', i ); + vector = new Vector4(); + + } + + array[ offset ++ ] = vector.x; + array[ offset ++ ] = vector.y; + array[ offset ++ ] = vector.z; + array[ offset ++ ] = vector.w; + + } + + return this; + + }, + + set: function ( value, offset ) { + + if ( offset === undefined ) offset = 0; + + this.array.set( value, offset ); + + return this; + + }, + + getX: function ( index ) { + + return this.array[ index * this.itemSize ]; + + }, + + setX: function ( index, x ) { + + this.array[ index * this.itemSize ] = x; + + return this; + + }, + + getY: function ( index ) { + + return this.array[ index * this.itemSize + 1 ]; + + }, + + setY: function ( index, y ) { + + this.array[ index * this.itemSize + 1 ] = y; + + return this; + + }, + + getZ: function ( index ) { + + return this.array[ index * this.itemSize + 2 ]; + + }, + + setZ: function ( index, z ) { + + this.array[ index * this.itemSize + 2 ] = z; + + return this; + + }, + + getW: function ( index ) { + + return this.array[ index * this.itemSize + 3 ]; + + }, + + setW: function ( index, w ) { + + this.array[ index * this.itemSize + 3 ] = w; + + return this; + + }, + + setXY: function ( index, x, y ) { + + index *= this.itemSize; + + this.array[ index + 0 ] = x; + this.array[ index + 1 ] = y; + + return this; + + }, + + setXYZ: function ( index, x, y, z ) { + + index *= this.itemSize; + + this.array[ index + 0 ] = x; + this.array[ index + 1 ] = y; + this.array[ index + 2 ] = z; + + return this; + + }, + + setXYZW: function ( index, x, y, z, w ) { + + index *= this.itemSize; + + this.array[ index + 0 ] = x; + this.array[ index + 1 ] = y; + this.array[ index + 2 ] = z; + this.array[ index + 3 ] = w; + + return this; + + }, + + onUpload: function ( callback ) { + + this.onUploadCallback = callback; + + return this; + + }, + + clone: function () { + + return new this.constructor( this.array, this.itemSize ).copy( this ); + + } + + } ); + + // + + function Int8BufferAttribute( array, itemSize ) { + + BufferAttribute.call( this, new Int8Array( array ), itemSize ); + + } + + Int8BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Int8BufferAttribute.prototype.constructor = Int8BufferAttribute; + + + function Uint8BufferAttribute( array, itemSize ) { + + BufferAttribute.call( this, new Uint8Array( array ), itemSize ); + + } + + Uint8BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Uint8BufferAttribute.prototype.constructor = Uint8BufferAttribute; + + + function Uint8ClampedBufferAttribute( array, itemSize ) { + + BufferAttribute.call( this, new Uint8ClampedArray( array ), itemSize ); + + } + + Uint8ClampedBufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Uint8ClampedBufferAttribute.prototype.constructor = Uint8ClampedBufferAttribute; + + + function Int16BufferAttribute( array, itemSize ) { + + BufferAttribute.call( this, new Int16Array( array ), itemSize ); + + } + + Int16BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Int16BufferAttribute.prototype.constructor = Int16BufferAttribute; + + + function Uint16BufferAttribute( array, itemSize ) { + + BufferAttribute.call( this, new Uint16Array( array ), itemSize ); + + } + + Uint16BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Uint16BufferAttribute.prototype.constructor = Uint16BufferAttribute; + + + function Int32BufferAttribute( array, itemSize ) { + + BufferAttribute.call( this, new Int32Array( array ), itemSize ); + + } + + Int32BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Int32BufferAttribute.prototype.constructor = Int32BufferAttribute; + + + function Uint32BufferAttribute( array, itemSize ) { + + BufferAttribute.call( this, new Uint32Array( array ), itemSize ); + + } + + Uint32BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Uint32BufferAttribute.prototype.constructor = Uint32BufferAttribute; + + + function Float32BufferAttribute( array, itemSize ) { + + BufferAttribute.call( this, new Float32Array( array ), itemSize ); + + } + + Float32BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Float32BufferAttribute.prototype.constructor = Float32BufferAttribute; + + + function Float64BufferAttribute( array, itemSize ) { + + BufferAttribute.call( this, new Float64Array( array ), itemSize ); + + } + + Float64BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Float64BufferAttribute.prototype.constructor = Float64BufferAttribute; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function DirectGeometry() { + + this.indices = []; + this.vertices = []; + this.normals = []; + this.colors = []; + this.uvs = []; + this.uvs2 = []; + + this.groups = []; + + this.morphTargets = {}; + + this.skinWeights = []; + this.skinIndices = []; + + // this.lineDistances = []; + + this.boundingBox = null; + this.boundingSphere = null; + + // update flags + + this.verticesNeedUpdate = false; + this.normalsNeedUpdate = false; + this.colorsNeedUpdate = false; + this.uvsNeedUpdate = false; + this.groupsNeedUpdate = false; + + } + + Object.assign( DirectGeometry.prototype, { + + computeGroups: function ( geometry ) { + + var group; + var groups = []; + var materialIndex = undefined; + + var faces = geometry.faces; + + for ( var i = 0; i < faces.length; i ++ ) { + + var face = faces[ i ]; + + // materials + + if ( face.materialIndex !== materialIndex ) { + + materialIndex = face.materialIndex; + + if ( group !== undefined ) { + + group.count = ( i * 3 ) - group.start; + groups.push( group ); + + } + + group = { + start: i * 3, + materialIndex: materialIndex + }; + + } + + } + + if ( group !== undefined ) { + + group.count = ( i * 3 ) - group.start; + groups.push( group ); + + } + + this.groups = groups; + + }, + + fromGeometry: function ( geometry ) { + + var faces = geometry.faces; + var vertices = geometry.vertices; + var faceVertexUvs = geometry.faceVertexUvs; + + var hasFaceVertexUv = faceVertexUvs[ 0 ] && faceVertexUvs[ 0 ].length > 0; + var hasFaceVertexUv2 = faceVertexUvs[ 1 ] && faceVertexUvs[ 1 ].length > 0; + + // morphs + + var morphTargets = geometry.morphTargets; + var morphTargetsLength = morphTargets.length; + + var morphTargetsPosition; + + if ( morphTargetsLength > 0 ) { + + morphTargetsPosition = []; + + for ( var i = 0; i < morphTargetsLength; i ++ ) { + + morphTargetsPosition[ i ] = []; + + } + + this.morphTargets.position = morphTargetsPosition; + + } + + var morphNormals = geometry.morphNormals; + var morphNormalsLength = morphNormals.length; + + var morphTargetsNormal; + + if ( morphNormalsLength > 0 ) { + + morphTargetsNormal = []; + + for ( var i = 0; i < morphNormalsLength; i ++ ) { + + morphTargetsNormal[ i ] = []; + + } + + this.morphTargets.normal = morphTargetsNormal; + + } + + // skins + + var skinIndices = geometry.skinIndices; + var skinWeights = geometry.skinWeights; + + var hasSkinIndices = skinIndices.length === vertices.length; + var hasSkinWeights = skinWeights.length === vertices.length; + + // + + for ( var i = 0; i < faces.length; i ++ ) { + + var face = faces[ i ]; + + this.vertices.push( vertices[ face.a ], vertices[ face.b ], vertices[ face.c ] ); + + var vertexNormals = face.vertexNormals; + + if ( vertexNormals.length === 3 ) { + + this.normals.push( vertexNormals[ 0 ], vertexNormals[ 1 ], vertexNormals[ 2 ] ); + + } else { + + var normal = face.normal; + + this.normals.push( normal, normal, normal ); + + } + + var vertexColors = face.vertexColors; + + if ( vertexColors.length === 3 ) { + + this.colors.push( vertexColors[ 0 ], vertexColors[ 1 ], vertexColors[ 2 ] ); + + } else { + + var color = face.color; + + this.colors.push( color, color, color ); + + } + + if ( hasFaceVertexUv === true ) { + + var vertexUvs = faceVertexUvs[ 0 ][ i ]; + + if ( vertexUvs !== undefined ) { + + this.uvs.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] ); + + } else { + + console.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ', i ); + + this.uvs.push( new Vector2(), new Vector2(), new Vector2() ); + + } + + } + + if ( hasFaceVertexUv2 === true ) { + + var vertexUvs = faceVertexUvs[ 1 ][ i ]; + + if ( vertexUvs !== undefined ) { + + this.uvs2.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] ); + + } else { + + console.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ', i ); + + this.uvs2.push( new Vector2(), new Vector2(), new Vector2() ); + + } + + } + + // morphs + + for ( var j = 0; j < morphTargetsLength; j ++ ) { + + var morphTarget = morphTargets[ j ].vertices; + + morphTargetsPosition[ j ].push( morphTarget[ face.a ], morphTarget[ face.b ], morphTarget[ face.c ] ); + + } + + for ( var j = 0; j < morphNormalsLength; j ++ ) { + + var morphNormal = morphNormals[ j ].vertexNormals[ i ]; + + morphTargetsNormal[ j ].push( morphNormal.a, morphNormal.b, morphNormal.c ); + + } + + // skins + + if ( hasSkinIndices ) { + + this.skinIndices.push( skinIndices[ face.a ], skinIndices[ face.b ], skinIndices[ face.c ] ); + + } + + if ( hasSkinWeights ) { + + this.skinWeights.push( skinWeights[ face.a ], skinWeights[ face.b ], skinWeights[ face.c ] ); + + } + + } + + this.computeGroups( geometry ); + + this.verticesNeedUpdate = geometry.verticesNeedUpdate; + this.normalsNeedUpdate = geometry.normalsNeedUpdate; + this.colorsNeedUpdate = geometry.colorsNeedUpdate; + this.uvsNeedUpdate = geometry.uvsNeedUpdate; + this.groupsNeedUpdate = geometry.groupsNeedUpdate; + + return this; + + } + + } ); + + function arrayMax( array ) { + + if ( array.length === 0 ) return - Infinity; + + var max = array[ 0 ]; + + for ( var i = 1, l = array.length; i < l; ++ i ) { + + if ( array[ i ] > max ) max = array[ i ]; + + } + + return max; + + } + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + function BufferGeometry() { + + Object.defineProperty( this, 'id', { value: GeometryIdCount() } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + this.type = 'BufferGeometry'; + + this.index = null; + this.attributes = {}; + + this.morphAttributes = {}; + + this.groups = []; + + this.boundingBox = null; + this.boundingSphere = null; + + this.drawRange = { start: 0, count: Infinity }; + + } + + BufferGeometry.MaxIndex = 65535; + + Object.assign( BufferGeometry.prototype, EventDispatcher.prototype, { + + isBufferGeometry: true, + + getIndex: function () { + + return this.index; + + }, + + setIndex: function ( index ) { + + if ( Array.isArray( index ) ) { + + this.index = new ( arrayMax( index ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( index, 1 ); + + } else { + + this.index = index; + + } + + }, + + addAttribute: function ( name, attribute ) { + + if ( ! ( attribute && attribute.isBufferAttribute ) && ! ( attribute && attribute.isInterleavedBufferAttribute ) ) { + + console.warn( 'THREE.BufferGeometry: .addAttribute() now expects ( name, attribute ).' ); + + this.addAttribute( name, new BufferAttribute( arguments[ 1 ], arguments[ 2 ] ) ); + + return; + + } + + if ( name === 'index' ) { + + console.warn( 'THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute.' ); + this.setIndex( attribute ); + + return; + + } + + this.attributes[ name ] = attribute; + + return this; + + }, + + getAttribute: function ( name ) { + + return this.attributes[ name ]; + + }, + + removeAttribute: function ( name ) { + + delete this.attributes[ name ]; + + return this; + + }, + + addGroup: function ( start, count, materialIndex ) { + + this.groups.push( { + + start: start, + count: count, + materialIndex: materialIndex !== undefined ? materialIndex : 0 + + } ); + + }, + + clearGroups: function () { + + this.groups = []; + + }, + + setDrawRange: function ( start, count ) { + + this.drawRange.start = start; + this.drawRange.count = count; + + }, + + applyMatrix: function ( matrix ) { + + var position = this.attributes.position; + + if ( position !== undefined ) { + + matrix.applyToBufferAttribute( position ); + position.needsUpdate = true; + + } + + var normal = this.attributes.normal; + + if ( normal !== undefined ) { + + var normalMatrix = new Matrix3().getNormalMatrix( matrix ); + + normalMatrix.applyToBufferAttribute( normal ); + normal.needsUpdate = true; + + } + + if ( this.boundingBox !== null ) { + + this.computeBoundingBox(); + + } + + if ( this.boundingSphere !== null ) { + + this.computeBoundingSphere(); + + } + + return this; + + }, + + rotateX: function () { + + // rotate geometry around world x-axis + + var m1 = new Matrix4(); + + return function rotateX( angle ) { + + m1.makeRotationX( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + rotateY: function () { + + // rotate geometry around world y-axis + + var m1 = new Matrix4(); + + return function rotateY( angle ) { + + m1.makeRotationY( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + rotateZ: function () { + + // rotate geometry around world z-axis + + var m1 = new Matrix4(); + + return function rotateZ( angle ) { + + m1.makeRotationZ( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + translate: function () { + + // translate geometry + + var m1 = new Matrix4(); + + return function translate( x, y, z ) { + + m1.makeTranslation( x, y, z ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + scale: function () { + + // scale geometry + + var m1 = new Matrix4(); + + return function scale( x, y, z ) { + + m1.makeScale( x, y, z ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + lookAt: function () { + + var obj = new Object3D(); + + return function lookAt( vector ) { + + obj.lookAt( vector ); + + obj.updateMatrix(); + + this.applyMatrix( obj.matrix ); + + }; + + }(), + + center: function () { + + this.computeBoundingBox(); + + var offset = this.boundingBox.getCenter().negate(); + + this.translate( offset.x, offset.y, offset.z ); + + return offset; + + }, + + setFromObject: function ( object ) { + + // console.log( 'THREE.BufferGeometry.setFromObject(). Converting', object, this ); + + var geometry = object.geometry; + + if ( object.isPoints || object.isLine ) { + + var positions = new Float32BufferAttribute( geometry.vertices.length * 3, 3 ); + var colors = new Float32BufferAttribute( geometry.colors.length * 3, 3 ); + + this.addAttribute( 'position', positions.copyVector3sArray( geometry.vertices ) ); + this.addAttribute( 'color', colors.copyColorsArray( geometry.colors ) ); + + if ( geometry.lineDistances && geometry.lineDistances.length === geometry.vertices.length ) { + + var lineDistances = new Float32BufferAttribute( geometry.lineDistances.length, 1 ); + + this.addAttribute( 'lineDistance', lineDistances.copyArray( geometry.lineDistances ) ); + + } + + if ( geometry.boundingSphere !== null ) { + + this.boundingSphere = geometry.boundingSphere.clone(); + + } + + if ( geometry.boundingBox !== null ) { + + this.boundingBox = geometry.boundingBox.clone(); + + } + + } else if ( object.isMesh ) { + + if ( geometry && geometry.isGeometry ) { + + this.fromGeometry( geometry ); + + } + + } + + return this; + + }, + + updateFromObject: function ( object ) { + + var geometry = object.geometry; + + if ( object.isMesh ) { + + var direct = geometry.__directGeometry; + + if ( geometry.elementsNeedUpdate === true ) { + + direct = undefined; + geometry.elementsNeedUpdate = false; + + } + + if ( direct === undefined ) { + + return this.fromGeometry( geometry ); + + } + + direct.verticesNeedUpdate = geometry.verticesNeedUpdate; + direct.normalsNeedUpdate = geometry.normalsNeedUpdate; + direct.colorsNeedUpdate = geometry.colorsNeedUpdate; + direct.uvsNeedUpdate = geometry.uvsNeedUpdate; + direct.groupsNeedUpdate = geometry.groupsNeedUpdate; + + geometry.verticesNeedUpdate = false; + geometry.normalsNeedUpdate = false; + geometry.colorsNeedUpdate = false; + geometry.uvsNeedUpdate = false; + geometry.groupsNeedUpdate = false; + + geometry = direct; + + } + + var attribute; + + if ( geometry.verticesNeedUpdate === true ) { + + attribute = this.attributes.position; + + if ( attribute !== undefined ) { + + attribute.copyVector3sArray( geometry.vertices ); + attribute.needsUpdate = true; + + } + + geometry.verticesNeedUpdate = false; + + } + + if ( geometry.normalsNeedUpdate === true ) { + + attribute = this.attributes.normal; + + if ( attribute !== undefined ) { + + attribute.copyVector3sArray( geometry.normals ); + attribute.needsUpdate = true; + + } + + geometry.normalsNeedUpdate = false; + + } + + if ( geometry.colorsNeedUpdate === true ) { + + attribute = this.attributes.color; + + if ( attribute !== undefined ) { + + attribute.copyColorsArray( geometry.colors ); + attribute.needsUpdate = true; + + } + + geometry.colorsNeedUpdate = false; + + } + + if ( geometry.uvsNeedUpdate ) { + + attribute = this.attributes.uv; + + if ( attribute !== undefined ) { + + attribute.copyVector2sArray( geometry.uvs ); + attribute.needsUpdate = true; + + } + + geometry.uvsNeedUpdate = false; + + } + + if ( geometry.lineDistancesNeedUpdate ) { + + attribute = this.attributes.lineDistance; + + if ( attribute !== undefined ) { + + attribute.copyArray( geometry.lineDistances ); + attribute.needsUpdate = true; + + } + + geometry.lineDistancesNeedUpdate = false; + + } + + if ( geometry.groupsNeedUpdate ) { + + geometry.computeGroups( object.geometry ); + this.groups = geometry.groups; + + geometry.groupsNeedUpdate = false; + + } + + return this; + + }, + + fromGeometry: function ( geometry ) { + + geometry.__directGeometry = new DirectGeometry().fromGeometry( geometry ); + + return this.fromDirectGeometry( geometry.__directGeometry ); + + }, + + fromDirectGeometry: function ( geometry ) { + + var positions = new Float32Array( geometry.vertices.length * 3 ); + this.addAttribute( 'position', new BufferAttribute( positions, 3 ).copyVector3sArray( geometry.vertices ) ); + + if ( geometry.normals.length > 0 ) { + + var normals = new Float32Array( geometry.normals.length * 3 ); + this.addAttribute( 'normal', new BufferAttribute( normals, 3 ).copyVector3sArray( geometry.normals ) ); + + } + + if ( geometry.colors.length > 0 ) { + + var colors = new Float32Array( geometry.colors.length * 3 ); + this.addAttribute( 'color', new BufferAttribute( colors, 3 ).copyColorsArray( geometry.colors ) ); + + } + + if ( geometry.uvs.length > 0 ) { + + var uvs = new Float32Array( geometry.uvs.length * 2 ); + this.addAttribute( 'uv', new BufferAttribute( uvs, 2 ).copyVector2sArray( geometry.uvs ) ); + + } + + if ( geometry.uvs2.length > 0 ) { + + var uvs2 = new Float32Array( geometry.uvs2.length * 2 ); + this.addAttribute( 'uv2', new BufferAttribute( uvs2, 2 ).copyVector2sArray( geometry.uvs2 ) ); + + } + + if ( geometry.indices.length > 0 ) { + + var TypeArray = arrayMax( geometry.indices ) > 65535 ? Uint32Array : Uint16Array; + var indices = new TypeArray( geometry.indices.length * 3 ); + this.setIndex( new BufferAttribute( indices, 1 ).copyIndicesArray( geometry.indices ) ); + + } + + // groups + + this.groups = geometry.groups; + + // morphs + + for ( var name in geometry.morphTargets ) { + + var array = []; + var morphTargets = geometry.morphTargets[ name ]; + + for ( var i = 0, l = morphTargets.length; i < l; i ++ ) { + + var morphTarget = morphTargets[ i ]; + + var attribute = new Float32BufferAttribute( morphTarget.length * 3, 3 ); + + array.push( attribute.copyVector3sArray( morphTarget ) ); + + } + + this.morphAttributes[ name ] = array; + + } + + // skinning + + if ( geometry.skinIndices.length > 0 ) { + + var skinIndices = new Float32BufferAttribute( geometry.skinIndices.length * 4, 4 ); + this.addAttribute( 'skinIndex', skinIndices.copyVector4sArray( geometry.skinIndices ) ); + + } + + if ( geometry.skinWeights.length > 0 ) { + + var skinWeights = new Float32BufferAttribute( geometry.skinWeights.length * 4, 4 ); + this.addAttribute( 'skinWeight', skinWeights.copyVector4sArray( geometry.skinWeights ) ); + + } + + // + + if ( geometry.boundingSphere !== null ) { + + this.boundingSphere = geometry.boundingSphere.clone(); + + } + + if ( geometry.boundingBox !== null ) { + + this.boundingBox = geometry.boundingBox.clone(); + + } + + return this; + + }, + + computeBoundingBox: function () { + + if ( this.boundingBox === null ) { + + this.boundingBox = new Box3(); + + } + + var position = this.attributes.position; + + if ( position !== undefined ) { + + this.boundingBox.setFromBufferAttribute( position ); + + } else { + + this.boundingBox.makeEmpty(); + + } + + if ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) { + + console.error( 'THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The "position" attribute is likely to have NaN values.', this ); + + } + + }, + + computeBoundingSphere: function () { + + var box = new Box3(); + var vector = new Vector3(); + + return function computeBoundingSphere() { + + if ( this.boundingSphere === null ) { + + this.boundingSphere = new Sphere(); + + } + + var position = this.attributes.position; + + if ( position ) { + + var center = this.boundingSphere.center; + + box.setFromBufferAttribute( position ); + box.getCenter( center ); + + // hoping to find a boundingSphere with a radius smaller than the + // boundingSphere of the boundingBox: sqrt(3) smaller in the best case + + var maxRadiusSq = 0; + + for ( var i = 0, il = position.count; i < il; i ++ ) { + + vector.x = position.getX( i ); + vector.y = position.getY( i ); + vector.z = position.getZ( i ); + maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( vector ) ); + + } + + this.boundingSphere.radius = Math.sqrt( maxRadiusSq ); + + if ( isNaN( this.boundingSphere.radius ) ) { + + console.error( 'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.', this ); + + } + + } + + }; + + }(), + + computeFaceNormals: function () { + + // backwards compatibility + + }, + + computeVertexNormals: function () { + + var index = this.index; + var attributes = this.attributes; + var groups = this.groups; + + if ( attributes.position ) { + + var positions = attributes.position.array; + + if ( attributes.normal === undefined ) { + + this.addAttribute( 'normal', new BufferAttribute( new Float32Array( positions.length ), 3 ) ); + + } else { + + // reset existing normals to zero + + var array = attributes.normal.array; + + for ( var i = 0, il = array.length; i < il; i ++ ) { + + array[ i ] = 0; + + } + + } + + var normals = attributes.normal.array; + + var vA, vB, vC; + var pA = new Vector3(), pB = new Vector3(), pC = new Vector3(); + var cb = new Vector3(), ab = new Vector3(); + + // indexed elements + + if ( index ) { + + var indices = index.array; + + if ( groups.length === 0 ) { + + this.addGroup( 0, indices.length ); + + } + + for ( var j = 0, jl = groups.length; j < jl; ++ j ) { + + var group = groups[ j ]; + + var start = group.start; + var count = group.count; + + for ( var i = start, il = start + count; i < il; i += 3 ) { + + vA = indices[ i + 0 ] * 3; + vB = indices[ i + 1 ] * 3; + vC = indices[ i + 2 ] * 3; + + pA.fromArray( positions, vA ); + pB.fromArray( positions, vB ); + pC.fromArray( positions, vC ); + + cb.subVectors( pC, pB ); + ab.subVectors( pA, pB ); + cb.cross( ab ); + + normals[ vA ] += cb.x; + normals[ vA + 1 ] += cb.y; + normals[ vA + 2 ] += cb.z; + + normals[ vB ] += cb.x; + normals[ vB + 1 ] += cb.y; + normals[ vB + 2 ] += cb.z; + + normals[ vC ] += cb.x; + normals[ vC + 1 ] += cb.y; + normals[ vC + 2 ] += cb.z; + + } + + } + + } else { + + // non-indexed elements (unconnected triangle soup) + + for ( var i = 0, il = positions.length; i < il; i += 9 ) { + + pA.fromArray( positions, i ); + pB.fromArray( positions, i + 3 ); + pC.fromArray( positions, i + 6 ); + + cb.subVectors( pC, pB ); + ab.subVectors( pA, pB ); + cb.cross( ab ); + + normals[ i ] = cb.x; + normals[ i + 1 ] = cb.y; + normals[ i + 2 ] = cb.z; + + normals[ i + 3 ] = cb.x; + normals[ i + 4 ] = cb.y; + normals[ i + 5 ] = cb.z; + + normals[ i + 6 ] = cb.x; + normals[ i + 7 ] = cb.y; + normals[ i + 8 ] = cb.z; + + } + + } + + this.normalizeNormals(); + + attributes.normal.needsUpdate = true; + + } + + }, + + merge: function ( geometry, offset ) { + + if ( ! ( geometry && geometry.isBufferGeometry ) ) { + + console.error( 'THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.', geometry ); + return; + + } + + if ( offset === undefined ) offset = 0; + + var attributes = this.attributes; + + for ( var key in attributes ) { + + if ( geometry.attributes[ key ] === undefined ) continue; + + var attribute1 = attributes[ key ]; + var attributeArray1 = attribute1.array; + + var attribute2 = geometry.attributes[ key ]; + var attributeArray2 = attribute2.array; + + var attributeSize = attribute2.itemSize; + + for ( var i = 0, j = attributeSize * offset; i < attributeArray2.length; i ++, j ++ ) { + + attributeArray1[ j ] = attributeArray2[ i ]; + + } + + } + + return this; + + }, + + normalizeNormals: function () { + + var normals = this.attributes.normal; + + var x, y, z, n; + + for ( var i = 0, il = normals.count; i < il; i ++ ) { + + x = normals.getX( i ); + y = normals.getY( i ); + z = normals.getZ( i ); + + n = 1.0 / Math.sqrt( x * x + y * y + z * z ); + + normals.setXYZ( i, x * n, y * n, z * n ); + + } + + }, + + toNonIndexed: function () { + + if ( this.index === null ) { + + console.warn( 'THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed.' ); + return this; + + } + + var geometry2 = new BufferGeometry(); + + var indices = this.index.array; + var attributes = this.attributes; + + for ( var name in attributes ) { + + var attribute = attributes[ name ]; + + var array = attribute.array; + var itemSize = attribute.itemSize; + + var array2 = new array.constructor( indices.length * itemSize ); + + var index = 0, index2 = 0; + + for ( var i = 0, l = indices.length; i < l; i ++ ) { + + index = indices[ i ] * itemSize; + + for ( var j = 0; j < itemSize; j ++ ) { + + array2[ index2 ++ ] = array[ index ++ ]; + + } + + } + + geometry2.addAttribute( name, new BufferAttribute( array2, itemSize ) ); + + } + + return geometry2; + + }, + + toJSON: function () { + + var data = { + metadata: { + version: 4.5, + type: 'BufferGeometry', + generator: 'BufferGeometry.toJSON' + } + }; + + // standard BufferGeometry serialization + + data.uuid = this.uuid; + data.type = this.type; + if ( this.name !== '' ) data.name = this.name; + + if ( this.parameters !== undefined ) { + + var parameters = this.parameters; + + for ( var key in parameters ) { + + if ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ]; + + } + + return data; + + } + + data.data = { attributes: {} }; + + var index = this.index; + + if ( index !== null ) { + + var array = Array.prototype.slice.call( index.array ); + + data.data.index = { + type: index.array.constructor.name, + array: array + }; + + } + + var attributes = this.attributes; + + for ( var key in attributes ) { + + var attribute = attributes[ key ]; + + var array = Array.prototype.slice.call( attribute.array ); + + data.data.attributes[ key ] = { + itemSize: attribute.itemSize, + type: attribute.array.constructor.name, + array: array, + normalized: attribute.normalized + }; + + } + + var groups = this.groups; + + if ( groups.length > 0 ) { + + data.data.groups = JSON.parse( JSON.stringify( groups ) ); + + } + + var boundingSphere = this.boundingSphere; + + if ( boundingSphere !== null ) { + + data.data.boundingSphere = { + center: boundingSphere.center.toArray(), + radius: boundingSphere.radius + }; + + } + + return data; + + }, + + clone: function () { + + /* + // Handle primitives + + var parameters = this.parameters; + + if ( parameters !== undefined ) { + + var values = []; + + for ( var key in parameters ) { + + values.push( parameters[ key ] ); + + } + + var geometry = Object.create( this.constructor.prototype ); + this.constructor.apply( geometry, values ); + return geometry; + + } + + return new this.constructor().copy( this ); + */ + + return new BufferGeometry().copy( this ); + + }, + + copy: function ( source ) { + + var name, i, l; + + // reset + + this.index = null; + this.attributes = {}; + this.morphAttributes = {}; + this.groups = []; + this.boundingBox = null; + this.boundingSphere = null; + + // name + + this.name = source.name; + + // index + + var index = source.index; + + if ( index !== null ) { + + this.setIndex( index.clone() ); + + } + + // attributes + + var attributes = source.attributes; + + for ( name in attributes ) { + + var attribute = attributes[ name ]; + this.addAttribute( name, attribute.clone() ); + + } + + // morph attributes + + var morphAttributes = source.morphAttributes; + + for ( name in morphAttributes ) { + + var array = []; + var morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes + + for ( i = 0, l = morphAttribute.length; i < l; i ++ ) { + + array.push( morphAttribute[ i ].clone() ); + + } + + this.morphAttributes[ name ] = array; + + } + + // groups + + var groups = source.groups; + + for ( i = 0, l = groups.length; i < l; i ++ ) { + + var group = groups[ i ]; + this.addGroup( group.start, group.count, group.materialIndex ); + + } + + // bounding box + + var boundingBox = source.boundingBox; + + if ( boundingBox !== null ) { + + this.boundingBox = boundingBox.clone(); + + } + + // bounding sphere + + var boundingSphere = source.boundingSphere; + + if ( boundingSphere !== null ) { + + this.boundingSphere = boundingSphere.clone(); + + } + + // draw range + + this.drawRange.start = source.drawRange.start; + this.drawRange.count = source.drawRange.count; + + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + + // BoxGeometry + + function BoxGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) { + + Geometry.call( this ); + + this.type = 'BoxGeometry'; + + this.parameters = { + width: width, + height: height, + depth: depth, + widthSegments: widthSegments, + heightSegments: heightSegments, + depthSegments: depthSegments + }; + + this.fromBufferGeometry( new BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) ); + this.mergeVertices(); + + } + + BoxGeometry.prototype = Object.create( Geometry.prototype ); + BoxGeometry.prototype.constructor = BoxGeometry; + + // BoxBufferGeometry + + function BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) { + + BufferGeometry.call( this ); + + this.type = 'BoxBufferGeometry'; + + this.parameters = { + width: width, + height: height, + depth: depth, + widthSegments: widthSegments, + heightSegments: heightSegments, + depthSegments: depthSegments + }; + + var scope = this; + + // segments + + widthSegments = Math.floor( widthSegments ) || 1; + heightSegments = Math.floor( heightSegments ) || 1; + depthSegments = Math.floor( depthSegments ) || 1; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var numberOfVertices = 0; + var groupStart = 0; + + // build each side of the box geometry + + buildPlane( 'z', 'y', 'x', - 1, - 1, depth, height, width, depthSegments, heightSegments, 0 ); // px + buildPlane( 'z', 'y', 'x', 1, - 1, depth, height, - width, depthSegments, heightSegments, 1 ); // nx + buildPlane( 'x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2 ); // py + buildPlane( 'x', 'z', 'y', 1, - 1, width, depth, - height, widthSegments, depthSegments, 3 ); // ny + buildPlane( 'x', 'y', 'z', 1, - 1, width, height, depth, widthSegments, heightSegments, 4 ); // pz + buildPlane( 'x', 'y', 'z', - 1, - 1, width, height, - depth, widthSegments, heightSegments, 5 ); // nz + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + function buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) { + + var segmentWidth = width / gridX; + var segmentHeight = height / gridY; + + var widthHalf = width / 2; + var heightHalf = height / 2; + var depthHalf = depth / 2; + + var gridX1 = gridX + 1; + var gridY1 = gridY + 1; + + var vertexCounter = 0; + var groupCount = 0; + + var ix, iy; + + var vector = new Vector3(); + + // generate vertices, normals and uvs + + for ( iy = 0; iy < gridY1; iy ++ ) { + + var y = iy * segmentHeight - heightHalf; + + for ( ix = 0; ix < gridX1; ix ++ ) { + + var x = ix * segmentWidth - widthHalf; + + // set values to correct vector component + + vector[ u ] = x * udir; + vector[ v ] = y * vdir; + vector[ w ] = depthHalf; + + // now apply vector to vertex buffer + + vertices.push( vector.x, vector.y, vector.z ); + + // set values to correct vector component + + vector[ u ] = 0; + vector[ v ] = 0; + vector[ w ] = depth > 0 ? 1 : - 1; + + // now apply vector to normal buffer + + normals.push( vector.x, vector.y, vector.z ); + + // uvs + + uvs.push( ix / gridX ); + uvs.push( 1 - ( iy / gridY ) ); + + // counters + + vertexCounter += 1; + + } + + } + + // indices + + // 1. you need three indices to draw a single face + // 2. a single segment consists of two faces + // 3. so we need to generate six (2*3) indices per segment + + for ( iy = 0; iy < gridY; iy ++ ) { + + for ( ix = 0; ix < gridX; ix ++ ) { + + var a = numberOfVertices + ix + gridX1 * iy; + var b = numberOfVertices + ix + gridX1 * ( iy + 1 ); + var c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 ); + var d = numberOfVertices + ( ix + 1 ) + gridX1 * iy; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + // increase counter + + groupCount += 6; + + } + + } + + // add a group to the geometry. this will ensure multi material support + + scope.addGroup( groupStart, groupCount, materialIndex ); + + // calculate new start value for groups + + groupStart += groupCount; + + // update total number of vertices + + numberOfVertices += vertexCounter; + + } + + } + + BoxBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + BoxBufferGeometry.prototype.constructor = BoxBufferGeometry; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + + // PlaneGeometry + + function PlaneGeometry( width, height, widthSegments, heightSegments ) { + + Geometry.call( this ); + + this.type = 'PlaneGeometry'; + + this.parameters = { + width: width, + height: height, + widthSegments: widthSegments, + heightSegments: heightSegments + }; + + this.fromBufferGeometry( new PlaneBufferGeometry( width, height, widthSegments, heightSegments ) ); + this.mergeVertices(); + + } + + PlaneGeometry.prototype = Object.create( Geometry.prototype ); + PlaneGeometry.prototype.constructor = PlaneGeometry; + + // PlaneBufferGeometry + + function PlaneBufferGeometry( width, height, widthSegments, heightSegments ) { + + BufferGeometry.call( this ); + + this.type = 'PlaneBufferGeometry'; + + this.parameters = { + width: width, + height: height, + widthSegments: widthSegments, + heightSegments: heightSegments + }; + + var width_half = width / 2; + var height_half = height / 2; + + var gridX = Math.floor( widthSegments ) || 1; + var gridY = Math.floor( heightSegments ) || 1; + + var gridX1 = gridX + 1; + var gridY1 = gridY + 1; + + var segment_width = width / gridX; + var segment_height = height / gridY; + + var ix, iy; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // generate vertices, normals and uvs + + for ( iy = 0; iy < gridY1; iy ++ ) { + + var y = iy * segment_height - height_half; + + for ( ix = 0; ix < gridX1; ix ++ ) { + + var x = ix * segment_width - width_half; + + vertices.push( x, - y, 0 ); + + normals.push( 0, 0, 1 ); + + uvs.push( ix / gridX ); + uvs.push( 1 - ( iy / gridY ) ); + + } + + } + + // indices + + for ( iy = 0; iy < gridY; iy ++ ) { + + for ( ix = 0; ix < gridX; ix ++ ) { + + var a = ix + gridX1 * iy; + var b = ix + gridX1 * ( iy + 1 ); + var c = ( ix + 1 ) + gridX1 * ( iy + 1 ); + var d = ( ix + 1 ) + gridX1 * iy; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + PlaneBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + PlaneBufferGeometry.prototype.constructor = PlaneBufferGeometry; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: <hex>, + * opacity: <float>, + * map: new THREE.Texture( <Image> ), + * + * lightMap: new THREE.Texture( <Image> ), + * lightMapIntensity: <float> + * + * aoMap: new THREE.Texture( <Image> ), + * aoMapIntensity: <float> + * + * specularMap: new THREE.Texture( <Image> ), + * + * alphaMap: new THREE.Texture( <Image> ), + * + * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ), + * combine: THREE.Multiply, + * reflectivity: <float>, + * refractionRatio: <float>, + * + * shading: THREE.SmoothShading, + * depthTest: <bool>, + * depthWrite: <bool>, + * + * wireframe: <boolean>, + * wireframeLinewidth: <float>, + * + * skinning: <bool>, + * morphTargets: <bool> + * } + */ + + function MeshBasicMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshBasicMaterial'; + + this.color = new Color( 0xffffff ); // emissive + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.specularMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.combine = MultiplyOperation; + this.reflectivity = 1; + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.skinning = false; + this.morphTargets = false; + + this.lights = false; + + this.setValues( parameters ); + + } + + MeshBasicMaterial.prototype = Object.create( Material.prototype ); + MeshBasicMaterial.prototype.constructor = MeshBasicMaterial; + + MeshBasicMaterial.prototype.isMeshBasicMaterial = true; + + MeshBasicMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.specularMap = source.specularMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.combine = source.combine; + this.reflectivity = source.reflectivity; + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + + return this; + + }; + + /** + * @author bhouston / http://clara.io + */ + + function Ray( origin, direction ) { + + this.origin = ( origin !== undefined ) ? origin : new Vector3(); + this.direction = ( direction !== undefined ) ? direction : new Vector3(); + + } + + Object.assign( Ray.prototype, { + + set: function ( origin, direction ) { + + this.origin.copy( origin ); + this.direction.copy( direction ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( ray ) { + + this.origin.copy( ray.origin ); + this.direction.copy( ray.direction ); + + return this; + + }, + + at: function ( t, optionalTarget ) { + + var result = optionalTarget || new Vector3(); + + return result.copy( this.direction ).multiplyScalar( t ).add( this.origin ); + + }, + + lookAt: function ( v ) { + + this.direction.copy( v ).sub( this.origin ).normalize(); + + return this; + + }, + + recast: function () { + + var v1 = new Vector3(); + + return function recast( t ) { + + this.origin.copy( this.at( t, v1 ) ); + + return this; + + }; + + }(), + + closestPointToPoint: function ( point, optionalTarget ) { + + var result = optionalTarget || new Vector3(); + result.subVectors( point, this.origin ); + var directionDistance = result.dot( this.direction ); + + if ( directionDistance < 0 ) { + + return result.copy( this.origin ); + + } + + return result.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin ); + + }, + + distanceToPoint: function ( point ) { + + return Math.sqrt( this.distanceSqToPoint( point ) ); + + }, + + distanceSqToPoint: function () { + + var v1 = new Vector3(); + + return function distanceSqToPoint( point ) { + + var directionDistance = v1.subVectors( point, this.origin ).dot( this.direction ); + + // point behind the ray + + if ( directionDistance < 0 ) { + + return this.origin.distanceToSquared( point ); + + } + + v1.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin ); + + return v1.distanceToSquared( point ); + + }; + + }(), + + distanceSqToSegment: function () { + + var segCenter = new Vector3(); + var segDir = new Vector3(); + var diff = new Vector3(); + + return function distanceSqToSegment( v0, v1, optionalPointOnRay, optionalPointOnSegment ) { + + // from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteDistRaySegment.h + // It returns the min distance between the ray and the segment + // defined by v0 and v1 + // It can also set two optional targets : + // - The closest point on the ray + // - The closest point on the segment + + segCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 ); + segDir.copy( v1 ).sub( v0 ).normalize(); + diff.copy( this.origin ).sub( segCenter ); + + var segExtent = v0.distanceTo( v1 ) * 0.5; + var a01 = - this.direction.dot( segDir ); + var b0 = diff.dot( this.direction ); + var b1 = - diff.dot( segDir ); + var c = diff.lengthSq(); + var det = Math.abs( 1 - a01 * a01 ); + var s0, s1, sqrDist, extDet; + + if ( det > 0 ) { + + // The ray and segment are not parallel. + + s0 = a01 * b1 - b0; + s1 = a01 * b0 - b1; + extDet = segExtent * det; + + if ( s0 >= 0 ) { + + if ( s1 >= - extDet ) { + + if ( s1 <= extDet ) { + + // region 0 + // Minimum at interior points of ray and segment. + + var invDet = 1 / det; + s0 *= invDet; + s1 *= invDet; + sqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c; + + } else { + + // region 1 + + s1 = segExtent; + s0 = Math.max( 0, - ( a01 * s1 + b0 ) ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + } else { + + // region 5 + + s1 = - segExtent; + s0 = Math.max( 0, - ( a01 * s1 + b0 ) ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + } else { + + if ( s1 <= - extDet ) { + + // region 4 + + s0 = Math.max( 0, - ( - a01 * segExtent + b0 ) ); + s1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } else if ( s1 <= extDet ) { + + // region 3 + + s0 = 0; + s1 = Math.min( Math.max( - segExtent, - b1 ), segExtent ); + sqrDist = s1 * ( s1 + 2 * b1 ) + c; + + } else { + + // region 2 + + s0 = Math.max( 0, - ( a01 * segExtent + b0 ) ); + s1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + } + + } else { + + // Ray and segment are parallel. + + s1 = ( a01 > 0 ) ? - segExtent : segExtent; + s0 = Math.max( 0, - ( a01 * s1 + b0 ) ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + if ( optionalPointOnRay ) { + + optionalPointOnRay.copy( this.direction ).multiplyScalar( s0 ).add( this.origin ); + + } + + if ( optionalPointOnSegment ) { + + optionalPointOnSegment.copy( segDir ).multiplyScalar( s1 ).add( segCenter ); + + } + + return sqrDist; + + }; + + }(), + + intersectSphere: function () { + + var v1 = new Vector3(); + + return function intersectSphere( sphere, optionalTarget ) { + + v1.subVectors( sphere.center, this.origin ); + var tca = v1.dot( this.direction ); + var d2 = v1.dot( v1 ) - tca * tca; + var radius2 = sphere.radius * sphere.radius; + + if ( d2 > radius2 ) return null; + + var thc = Math.sqrt( radius2 - d2 ); + + // t0 = first intersect point - entrance on front of sphere + var t0 = tca - thc; + + // t1 = second intersect point - exit point on back of sphere + var t1 = tca + thc; + + // test to see if both t0 and t1 are behind the ray - if so, return null + if ( t0 < 0 && t1 < 0 ) return null; + + // test to see if t0 is behind the ray: + // if it is, the ray is inside the sphere, so return the second exit point scaled by t1, + // in order to always return an intersect point that is in front of the ray. + if ( t0 < 0 ) return this.at( t1, optionalTarget ); + + // else t0 is in front of the ray, so return the first collision point scaled by t0 + return this.at( t0, optionalTarget ); + + }; + + }(), + + intersectsSphere: function ( sphere ) { + + return this.distanceToPoint( sphere.center ) <= sphere.radius; + + }, + + distanceToPlane: function ( plane ) { + + var denominator = plane.normal.dot( this.direction ); + + if ( denominator === 0 ) { + + // line is coplanar, return origin + if ( plane.distanceToPoint( this.origin ) === 0 ) { + + return 0; + + } + + // Null is preferable to undefined since undefined means.... it is undefined + + return null; + + } + + var t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator; + + // Return if the ray never intersects the plane + + return t >= 0 ? t : null; + + }, + + intersectPlane: function ( plane, optionalTarget ) { + + var t = this.distanceToPlane( plane ); + + if ( t === null ) { + + return null; + + } + + return this.at( t, optionalTarget ); + + }, + + intersectsPlane: function ( plane ) { + + // check if the ray lies on the plane first + + var distToPoint = plane.distanceToPoint( this.origin ); + + if ( distToPoint === 0 ) { + + return true; + + } + + var denominator = plane.normal.dot( this.direction ); + + if ( denominator * distToPoint < 0 ) { + + return true; + + } + + // ray origin is behind the plane (and is pointing behind it) + + return false; + + }, + + intersectBox: function ( box, optionalTarget ) { + + var tmin, tmax, tymin, tymax, tzmin, tzmax; + + var invdirx = 1 / this.direction.x, + invdiry = 1 / this.direction.y, + invdirz = 1 / this.direction.z; + + var origin = this.origin; + + if ( invdirx >= 0 ) { + + tmin = ( box.min.x - origin.x ) * invdirx; + tmax = ( box.max.x - origin.x ) * invdirx; + + } else { + + tmin = ( box.max.x - origin.x ) * invdirx; + tmax = ( box.min.x - origin.x ) * invdirx; + + } + + if ( invdiry >= 0 ) { + + tymin = ( box.min.y - origin.y ) * invdiry; + tymax = ( box.max.y - origin.y ) * invdiry; + + } else { + + tymin = ( box.max.y - origin.y ) * invdiry; + tymax = ( box.min.y - origin.y ) * invdiry; + + } + + if ( ( tmin > tymax ) || ( tymin > tmax ) ) return null; + + // These lines also handle the case where tmin or tmax is NaN + // (result of 0 * Infinity). x !== x returns true if x is NaN + + if ( tymin > tmin || tmin !== tmin ) tmin = tymin; + + if ( tymax < tmax || tmax !== tmax ) tmax = tymax; + + if ( invdirz >= 0 ) { + + tzmin = ( box.min.z - origin.z ) * invdirz; + tzmax = ( box.max.z - origin.z ) * invdirz; + + } else { + + tzmin = ( box.max.z - origin.z ) * invdirz; + tzmax = ( box.min.z - origin.z ) * invdirz; + + } + + if ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return null; + + if ( tzmin > tmin || tmin !== tmin ) tmin = tzmin; + + if ( tzmax < tmax || tmax !== tmax ) tmax = tzmax; + + //return point closest to the ray (positive side) + + if ( tmax < 0 ) return null; + + return this.at( tmin >= 0 ? tmin : tmax, optionalTarget ); + + }, + + intersectsBox: ( function () { + + var v = new Vector3(); + + return function intersectsBox( box ) { + + return this.intersectBox( box, v ) !== null; + + }; + + } )(), + + intersectTriangle: function () { + + // Compute the offset origin, edges, and normal. + var diff = new Vector3(); + var edge1 = new Vector3(); + var edge2 = new Vector3(); + var normal = new Vector3(); + + return function intersectTriangle( a, b, c, backfaceCulling, optionalTarget ) { + + // from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h + + edge1.subVectors( b, a ); + edge2.subVectors( c, a ); + normal.crossVectors( edge1, edge2 ); + + // Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction, + // E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by + // |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2)) + // |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q)) + // |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N) + var DdN = this.direction.dot( normal ); + var sign; + + if ( DdN > 0 ) { + + if ( backfaceCulling ) return null; + sign = 1; + + } else if ( DdN < 0 ) { + + sign = - 1; + DdN = - DdN; + + } else { + + return null; + + } + + diff.subVectors( this.origin, a ); + var DdQxE2 = sign * this.direction.dot( edge2.crossVectors( diff, edge2 ) ); + + // b1 < 0, no intersection + if ( DdQxE2 < 0 ) { + + return null; + + } + + var DdE1xQ = sign * this.direction.dot( edge1.cross( diff ) ); + + // b2 < 0, no intersection + if ( DdE1xQ < 0 ) { + + return null; + + } + + // b1+b2 > 1, no intersection + if ( DdQxE2 + DdE1xQ > DdN ) { + + return null; + + } + + // Line intersects triangle, check if ray does. + var QdN = - sign * diff.dot( normal ); + + // t < 0, no intersection + if ( QdN < 0 ) { + + return null; + + } + + // Ray intersects triangle. + return this.at( QdN / DdN, optionalTarget ); + + }; + + }(), + + applyMatrix4: function ( matrix4 ) { + + this.origin.applyMatrix4( matrix4 ); + this.direction.transformDirection( matrix4 ); + + return this; + + }, + + equals: function ( ray ) { + + return ray.origin.equals( this.origin ) && ray.direction.equals( this.direction ); + + } + + } ); + + /** + * @author bhouston / http://clara.io + */ + + function Line3( start, end ) { + + this.start = ( start !== undefined ) ? start : new Vector3(); + this.end = ( end !== undefined ) ? end : new Vector3(); + + } + + Object.assign( Line3.prototype, { + + set: function ( start, end ) { + + this.start.copy( start ); + this.end.copy( end ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( line ) { + + this.start.copy( line.start ); + this.end.copy( line.end ); + + return this; + + }, + + getCenter: function ( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + return result.addVectors( this.start, this.end ).multiplyScalar( 0.5 ); + + }, + + delta: function ( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + return result.subVectors( this.end, this.start ); + + }, + + distanceSq: function () { + + return this.start.distanceToSquared( this.end ); + + }, + + distance: function () { + + return this.start.distanceTo( this.end ); + + }, + + at: function ( t, optionalTarget ) { + + var result = optionalTarget || new Vector3(); + + return this.delta( result ).multiplyScalar( t ).add( this.start ); + + }, + + closestPointToPointParameter: function () { + + var startP = new Vector3(); + var startEnd = new Vector3(); + + return function closestPointToPointParameter( point, clampToLine ) { + + startP.subVectors( point, this.start ); + startEnd.subVectors( this.end, this.start ); + + var startEnd2 = startEnd.dot( startEnd ); + var startEnd_startP = startEnd.dot( startP ); + + var t = startEnd_startP / startEnd2; + + if ( clampToLine ) { + + t = _Math.clamp( t, 0, 1 ); + + } + + return t; + + }; + + }(), + + closestPointToPoint: function ( point, clampToLine, optionalTarget ) { + + var t = this.closestPointToPointParameter( point, clampToLine ); + + var result = optionalTarget || new Vector3(); + + return this.delta( result ).multiplyScalar( t ).add( this.start ); + + }, + + applyMatrix4: function ( matrix ) { + + this.start.applyMatrix4( matrix ); + this.end.applyMatrix4( matrix ); + + return this; + + }, + + equals: function ( line ) { + + return line.start.equals( this.start ) && line.end.equals( this.end ); + + } + + } ); + + /** + * @author bhouston / http://clara.io + * @author mrdoob / http://mrdoob.com/ + */ + + function Triangle( a, b, c ) { + + this.a = ( a !== undefined ) ? a : new Vector3(); + this.b = ( b !== undefined ) ? b : new Vector3(); + this.c = ( c !== undefined ) ? c : new Vector3(); + + } + + Object.assign( Triangle, { + + normal: function () { + + var v0 = new Vector3(); + + return function normal( a, b, c, optionalTarget ) { + + var result = optionalTarget || new Vector3(); + + result.subVectors( c, b ); + v0.subVectors( a, b ); + result.cross( v0 ); + + var resultLengthSq = result.lengthSq(); + if ( resultLengthSq > 0 ) { + + return result.multiplyScalar( 1 / Math.sqrt( resultLengthSq ) ); + + } + + return result.set( 0, 0, 0 ); + + }; + + }(), + + // static/instance method to calculate barycentric coordinates + // based on: http://www.blackpawn.com/texts/pointinpoly/default.html + barycoordFromPoint: function () { + + var v0 = new Vector3(); + var v1 = new Vector3(); + var v2 = new Vector3(); + + return function barycoordFromPoint( point, a, b, c, optionalTarget ) { + + v0.subVectors( c, a ); + v1.subVectors( b, a ); + v2.subVectors( point, a ); + + var dot00 = v0.dot( v0 ); + var dot01 = v0.dot( v1 ); + var dot02 = v0.dot( v2 ); + var dot11 = v1.dot( v1 ); + var dot12 = v1.dot( v2 ); + + var denom = ( dot00 * dot11 - dot01 * dot01 ); + + var result = optionalTarget || new Vector3(); + + // collinear or singular triangle + if ( denom === 0 ) { + + // arbitrary location outside of triangle? + // not sure if this is the best idea, maybe should be returning undefined + return result.set( - 2, - 1, - 1 ); + + } + + var invDenom = 1 / denom; + var u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom; + var v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom; + + // barycentric coordinates must always sum to 1 + return result.set( 1 - u - v, v, u ); + + }; + + }(), + + containsPoint: function () { + + var v1 = new Vector3(); + + return function containsPoint( point, a, b, c ) { + + var result = Triangle.barycoordFromPoint( point, a, b, c, v1 ); + + return ( result.x >= 0 ) && ( result.y >= 0 ) && ( ( result.x + result.y ) <= 1 ); + + }; + + }() + + } ); + + Object.assign( Triangle.prototype, { + + set: function ( a, b, c ) { + + this.a.copy( a ); + this.b.copy( b ); + this.c.copy( c ); + + return this; + + }, + + setFromPointsAndIndices: function ( points, i0, i1, i2 ) { + + this.a.copy( points[ i0 ] ); + this.b.copy( points[ i1 ] ); + this.c.copy( points[ i2 ] ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( triangle ) { + + this.a.copy( triangle.a ); + this.b.copy( triangle.b ); + this.c.copy( triangle.c ); + + return this; + + }, + + area: function () { + + var v0 = new Vector3(); + var v1 = new Vector3(); + + return function area() { + + v0.subVectors( this.c, this.b ); + v1.subVectors( this.a, this.b ); + + return v0.cross( v1 ).length() * 0.5; + + }; + + }(), + + midpoint: function ( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + return result.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 ); + + }, + + normal: function ( optionalTarget ) { + + return Triangle.normal( this.a, this.b, this.c, optionalTarget ); + + }, + + plane: function ( optionalTarget ) { + + var result = optionalTarget || new Plane(); + + return result.setFromCoplanarPoints( this.a, this.b, this.c ); + + }, + + barycoordFromPoint: function ( point, optionalTarget ) { + + return Triangle.barycoordFromPoint( point, this.a, this.b, this.c, optionalTarget ); + + }, + + containsPoint: function ( point ) { + + return Triangle.containsPoint( point, this.a, this.b, this.c ); + + }, + + closestPointToPoint: function () { + + var plane = new Plane(); + var edgeList = [ new Line3(), new Line3(), new Line3() ]; + var projectedPoint = new Vector3(); + var closestPoint = new Vector3(); + + return function closestPointToPoint( point, optionalTarget ) { + + var result = optionalTarget || new Vector3(); + var minDistance = Infinity; + + // project the point onto the plane of the triangle + + plane.setFromCoplanarPoints( this.a, this.b, this.c ); + plane.projectPoint( point, projectedPoint ); + + // check if the projection lies within the triangle + + if( this.containsPoint( projectedPoint ) === true ) { + + // if so, this is the closest point + + result.copy( projectedPoint ); + + } else { + + // if not, the point falls outside the triangle. the result is the closest point to the triangle's edges or vertices + + edgeList[ 0 ].set( this.a, this.b ); + edgeList[ 1 ].set( this.b, this.c ); + edgeList[ 2 ].set( this.c, this.a ); + + for( var i = 0; i < edgeList.length; i ++ ) { + + edgeList[ i ].closestPointToPoint( projectedPoint, true, closestPoint ); + + var distance = projectedPoint.distanceToSquared( closestPoint ); + + if( distance < minDistance ) { + + minDistance = distance; + + result.copy( closestPoint ); + + } + + } + + } + + return result; + + }; + + }(), + + equals: function ( triangle ) { + + return triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author mikael emtinger / http://gomo.se/ + * @author jonobr1 / http://jonobr1.com/ + */ + + function Mesh( geometry, material ) { + + Object3D.call( this ); + + this.type = 'Mesh'; + + this.geometry = geometry !== undefined ? geometry : new BufferGeometry(); + this.material = material !== undefined ? material : new MeshBasicMaterial( { color: Math.random() * 0xffffff } ); + + this.drawMode = TrianglesDrawMode; + + this.updateMorphTargets(); + + } + + Mesh.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Mesh, + + isMesh: true, + + setDrawMode: function ( value ) { + + this.drawMode = value; + + }, + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source ); + + this.drawMode = source.drawMode; + + return this; + + }, + + updateMorphTargets: function () { + + var geometry = this.geometry; + var m, ml, name; + + if ( geometry.isBufferGeometry ) { + + var morphAttributes = geometry.morphAttributes; + var keys = Object.keys( morphAttributes ); + + if ( keys.length > 0 ) { + + var morphAttribute = morphAttributes[ keys[ 0 ] ]; + + if ( morphAttribute !== undefined ) { + + this.morphTargetInfluences = []; + this.morphTargetDictionary = {}; + + for ( m = 0, ml = morphAttribute.length; m < ml; m ++ ) { + + name = morphAttribute[ m ].name || String( m ); + + this.morphTargetInfluences.push( 0 ); + this.morphTargetDictionary[ name ] = m; + + } + + } + + } + + } else { + + var morphTargets = geometry.morphTargets; + + if ( morphTargets !== undefined && morphTargets.length > 0 ) { + + this.morphTargetInfluences = []; + this.morphTargetDictionary = {}; + + for ( m = 0, ml = morphTargets.length; m < ml; m ++ ) { + + name = morphTargets[ m ].name || String( m ); + + this.morphTargetInfluences.push( 0 ); + this.morphTargetDictionary[ name ] = m; + + } + + } + + } + + }, + + raycast: ( function () { + + var inverseMatrix = new Matrix4(); + var ray = new Ray(); + var sphere = new Sphere(); + + var vA = new Vector3(); + var vB = new Vector3(); + var vC = new Vector3(); + + var tempA = new Vector3(); + var tempB = new Vector3(); + var tempC = new Vector3(); + + var uvA = new Vector2(); + var uvB = new Vector2(); + var uvC = new Vector2(); + + var barycoord = new Vector3(); + + var intersectionPoint = new Vector3(); + var intersectionPointWorld = new Vector3(); + + function uvIntersection( point, p1, p2, p3, uv1, uv2, uv3 ) { + + Triangle.barycoordFromPoint( point, p1, p2, p3, barycoord ); + + uv1.multiplyScalar( barycoord.x ); + uv2.multiplyScalar( barycoord.y ); + uv3.multiplyScalar( barycoord.z ); + + uv1.add( uv2 ).add( uv3 ); + + return uv1.clone(); + + } + + function checkIntersection( object, raycaster, ray, pA, pB, pC, point ) { + + var intersect; + var material = object.material; + + if ( material.side === BackSide ) { + + intersect = ray.intersectTriangle( pC, pB, pA, true, point ); + + } else { + + intersect = ray.intersectTriangle( pA, pB, pC, material.side !== DoubleSide, point ); + + } + + if ( intersect === null ) return null; + + intersectionPointWorld.copy( point ); + intersectionPointWorld.applyMatrix4( object.matrixWorld ); + + var distance = raycaster.ray.origin.distanceTo( intersectionPointWorld ); + + if ( distance < raycaster.near || distance > raycaster.far ) return null; + + return { + distance: distance, + point: intersectionPointWorld.clone(), + object: object + }; + + } + + function checkBufferGeometryIntersection( object, raycaster, ray, position, uv, a, b, c ) { + + vA.fromBufferAttribute( position, a ); + vB.fromBufferAttribute( position, b ); + vC.fromBufferAttribute( position, c ); + + var intersection = checkIntersection( object, raycaster, ray, vA, vB, vC, intersectionPoint ); + + if ( intersection ) { + + if ( uv ) { + + uvA.fromBufferAttribute( uv, a ); + uvB.fromBufferAttribute( uv, b ); + uvC.fromBufferAttribute( uv, c ); + + intersection.uv = uvIntersection( intersectionPoint, vA, vB, vC, uvA, uvB, uvC ); + + } + + intersection.face = new Face3( a, b, c, Triangle.normal( vA, vB, vC ) ); + intersection.faceIndex = a; + + } + + return intersection; + + } + + return function raycast( raycaster, intersects ) { + + var geometry = this.geometry; + var material = this.material; + var matrixWorld = this.matrixWorld; + + if ( material === undefined ) return; + + // Checking boundingSphere distance to ray + + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); + + sphere.copy( geometry.boundingSphere ); + sphere.applyMatrix4( matrixWorld ); + + if ( raycaster.ray.intersectsSphere( sphere ) === false ) return; + + // + + inverseMatrix.getInverse( matrixWorld ); + ray.copy( raycaster.ray ).applyMatrix4( inverseMatrix ); + + // Check boundingBox before continuing + + if ( geometry.boundingBox !== null ) { + + if ( ray.intersectsBox( geometry.boundingBox ) === false ) return; + + } + + var intersection; + + if ( geometry.isBufferGeometry ) { + + var a, b, c; + var index = geometry.index; + var position = geometry.attributes.position; + var uv = geometry.attributes.uv; + var i, l; + + if ( index !== null ) { + + // indexed buffer geometry + + for ( i = 0, l = index.count; i < l; i += 3 ) { + + a = index.getX( i ); + b = index.getX( i + 1 ); + c = index.getX( i + 2 ); + + intersection = checkBufferGeometryIntersection( this, raycaster, ray, position, uv, a, b, c ); + + if ( intersection ) { + + intersection.faceIndex = Math.floor( i / 3 ); // triangle number in indices buffer semantics + intersects.push( intersection ); + + } + + } + + } else { + + // non-indexed buffer geometry + + for ( i = 0, l = position.count; i < l; i += 3 ) { + + a = i; + b = i + 1; + c = i + 2; + + intersection = checkBufferGeometryIntersection( this, raycaster, ray, position, uv, a, b, c ); + + if ( intersection ) { + + intersection.index = a; // triangle number in positions buffer semantics + intersects.push( intersection ); + + } + + } + + } + + } else if ( geometry.isGeometry ) { + + var fvA, fvB, fvC; + var isMultiMaterial = Array.isArray( material ); + + var vertices = geometry.vertices; + var faces = geometry.faces; + var uvs; + + var faceVertexUvs = geometry.faceVertexUvs[ 0 ]; + if ( faceVertexUvs.length > 0 ) uvs = faceVertexUvs; + + for ( var f = 0, fl = faces.length; f < fl; f ++ ) { + + var face = faces[ f ]; + var faceMaterial = isMultiMaterial ? material[ face.materialIndex ] : material; + + if ( faceMaterial === undefined ) continue; + + fvA = vertices[ face.a ]; + fvB = vertices[ face.b ]; + fvC = vertices[ face.c ]; + + if ( faceMaterial.morphTargets === true ) { + + var morphTargets = geometry.morphTargets; + var morphInfluences = this.morphTargetInfluences; + + vA.set( 0, 0, 0 ); + vB.set( 0, 0, 0 ); + vC.set( 0, 0, 0 ); + + for ( var t = 0, tl = morphTargets.length; t < tl; t ++ ) { + + var influence = morphInfluences[ t ]; + + if ( influence === 0 ) continue; + + var targets = morphTargets[ t ].vertices; + + vA.addScaledVector( tempA.subVectors( targets[ face.a ], fvA ), influence ); + vB.addScaledVector( tempB.subVectors( targets[ face.b ], fvB ), influence ); + vC.addScaledVector( tempC.subVectors( targets[ face.c ], fvC ), influence ); + + } + + vA.add( fvA ); + vB.add( fvB ); + vC.add( fvC ); + + fvA = vA; + fvB = vB; + fvC = vC; + + } + + intersection = checkIntersection( this, raycaster, ray, fvA, fvB, fvC, intersectionPoint ); + + if ( intersection ) { + + if ( uvs && uvs[ f ] ) { + + var uvs_f = uvs[ f ]; + uvA.copy( uvs_f[ 0 ] ); + uvB.copy( uvs_f[ 1 ] ); + uvC.copy( uvs_f[ 2 ] ); + + intersection.uv = uvIntersection( intersectionPoint, fvA, fvB, fvC, uvA, uvB, uvC ); + + } + + intersection.face = face; + intersection.faceIndex = f; + intersects.push( intersection ); + + } + + } + + } + + }; + + }() ), + + clone: function () { + + return new this.constructor( this.geometry, this.material ).copy( this ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLBackground( renderer, state, objects, premultipliedAlpha ) { + + var clearColor = new Color( 0x000000 ); + var clearAlpha = 0; + + var planeCamera, planeMesh; + var boxCamera, boxMesh; + + function render( scene, camera, forceClear ) { + + var background = scene.background; + + if ( background === null ) { + + setClear( clearColor, clearAlpha ); + + } else if ( background && background.isColor ) { + + setClear( background, 1 ); + forceClear = true; + + } + + if ( renderer.autoClear || forceClear ) { + + renderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil ); + + } + + if ( background && background.isCubeTexture ) { + + if ( boxCamera === undefined ) { + + boxCamera = new PerspectiveCamera(); + + boxMesh = new Mesh( + new BoxBufferGeometry( 5, 5, 5 ), + new ShaderMaterial( { + uniforms: ShaderLib.cube.uniforms, + vertexShader: ShaderLib.cube.vertexShader, + fragmentShader: ShaderLib.cube.fragmentShader, + side: BackSide, + depthTest: false, + depthWrite: false, + fog: false + } ) + ); + + } + + boxCamera.projectionMatrix.copy( camera.projectionMatrix ); + + boxCamera.matrixWorld.extractRotation( camera.matrixWorld ); + boxCamera.matrixWorldInverse.getInverse( boxCamera.matrixWorld ); + + boxMesh.material.uniforms[ "tCube" ].value = background; + boxMesh.modelViewMatrix.multiplyMatrices( boxCamera.matrixWorldInverse, boxMesh.matrixWorld ); + + objects.update( boxMesh ); + + renderer.renderBufferDirect( boxCamera, null, boxMesh.geometry, boxMesh.material, boxMesh, null ); + + } else if ( background && background.isTexture ) { + + if ( planeCamera === undefined ) { + + planeCamera = new OrthographicCamera( - 1, 1, 1, - 1, 0, 1 ); + + planeMesh = new Mesh( + new PlaneBufferGeometry( 2, 2 ), + new MeshBasicMaterial( { depthTest: false, depthWrite: false, fog: false } ) + ); + + } + + planeMesh.material.map = background; + + objects.update( planeMesh ); + + renderer.renderBufferDirect( planeCamera, null, planeMesh.geometry, planeMesh.material, planeMesh, null ); + + } + + } + + function setClear( color, alpha ) { + + state.buffers.color.setClear( color.r, color.g, color.b, alpha, premultipliedAlpha ); + + } + + return { + + getClearColor: function () { + + return clearColor; + + }, + setClearColor: function ( color, alpha ) { + + clearColor.set( color ); + clearAlpha = alpha !== undefined ? alpha : 1; + setClear( clearColor, clearAlpha ); + + }, + getClearAlpha: function () { + + return clearAlpha; + + }, + setClearAlpha: function ( alpha ) { + + clearAlpha = alpha; + setClear( clearColor, clearAlpha ); + + }, + render: render + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function painterSortStable( a, b ) { + + if ( a.renderOrder !== b.renderOrder ) { + + return a.renderOrder - b.renderOrder; + + } else if ( a.program && b.program && a.program !== b.program ) { + + return a.program.id - b.program.id; + + } else if ( a.material.id !== b.material.id ) { + + return a.material.id - b.material.id; + + } else if ( a.z !== b.z ) { + + return a.z - b.z; + + } else { + + return a.id - b.id; + + } + + } + + function reversePainterSortStable( a, b ) { + + if ( a.renderOrder !== b.renderOrder ) { + + return a.renderOrder - b.renderOrder; + + } if ( a.z !== b.z ) { + + return b.z - a.z; + + } else { + + return a.id - b.id; + + } + + } + + function WebGLRenderList() { + + var opaque = []; + var opaqueLastIndex = - 1; + + var transparent = []; + var transparentLastIndex = - 1; + + function init() { + + opaqueLastIndex = - 1; + transparentLastIndex = - 1; + + } + + function push( object, geometry, material, z, group ) { + + var array, index; + + // allocate the next position in the appropriate array + + if ( material.transparent ) { + + array = transparent; + index = ++ transparentLastIndex; + + } else { + + array = opaque; + index = ++ opaqueLastIndex; + + } + + // recycle existing render item or grow the array + + var renderItem = array[ index ]; + + if ( renderItem ) { + + renderItem.id = object.id; + renderItem.object = object; + renderItem.geometry = geometry; + renderItem.material = material; + renderItem.program = material.program; + renderItem.renderOrder = object.renderOrder; + renderItem.z = z; + renderItem.group = group; + + } else { + + renderItem = { + id: object.id, + object: object, + geometry: geometry, + material: material, + program: material.program, + renderOrder: object.renderOrder, + z: z, + group: group + }; + + // assert( index === array.length ); + array.push( renderItem ); + + } + + } + + function finish() { + + opaque.length = opaqueLastIndex + 1; + transparent.length = transparentLastIndex + 1; + + } + + function sort() { + + opaque.sort( painterSortStable ); + transparent.sort( reversePainterSortStable ); + + } + + return { + opaque: opaque, + transparent: transparent, + + init: init, + push: push, + finish: finish, + + sort: sort + }; + + } + + function WebGLRenderLists() { + + var lists = {}; + + function get( scene, camera ) { + + var hash = scene.id + ',' + camera.id; + var list = lists[ hash ]; + + if ( list === undefined ) { + + // console.log( 'THREE.WebGLRenderLists:', hash ); + + list = new WebGLRenderList(); + lists[ hash ] = list; + + } + + return list; + + } + + function dispose() { + + lists = {}; + + } + + return { + get: get, + dispose: dispose + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLIndexedBufferRenderer( gl, extensions, infoRender ) { + + var mode; + + function setMode( value ) { + + mode = value; + + } + + var type, bytesPerElement; + + function setIndex( value ) { + + type = value.type; + bytesPerElement = value.bytesPerElement; + + } + + function render( start, count ) { + + gl.drawElements( mode, count, type, start * bytesPerElement ); + + infoRender.calls ++; + infoRender.vertices += count; + + if ( mode === gl.TRIANGLES ) infoRender.faces += count / 3; + + } + + function renderInstances( geometry, start, count ) { + + var extension = extensions.get( 'ANGLE_instanced_arrays' ); + + if ( extension === null ) { + + console.error( 'THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' ); + return; + + } + + extension.drawElementsInstancedANGLE( mode, count, type, start * bytesPerElement, geometry.maxInstancedCount ); + + infoRender.calls ++; + infoRender.vertices += count * geometry.maxInstancedCount; + + if ( mode === gl.TRIANGLES ) infoRender.faces += geometry.maxInstancedCount * count / 3; + + } + + // + + this.setMode = setMode; + this.setIndex = setIndex; + this.render = render; + this.renderInstances = renderInstances; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLBufferRenderer( gl, extensions, infoRender ) { + + var mode; + + function setMode( value ) { + + mode = value; + + } + + function render( start, count ) { + + gl.drawArrays( mode, start, count ); + + infoRender.calls ++; + infoRender.vertices += count; + + if ( mode === gl.TRIANGLES ) infoRender.faces += count / 3; + + } + + function renderInstances( geometry, start, count ) { + + var extension = extensions.get( 'ANGLE_instanced_arrays' ); + + if ( extension === null ) { + + console.error( 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' ); + return; + + } + + var position = geometry.attributes.position; + + if ( position.isInterleavedBufferAttribute ) { + + count = position.data.count; + + extension.drawArraysInstancedANGLE( mode, 0, count, geometry.maxInstancedCount ); + + } else { + + extension.drawArraysInstancedANGLE( mode, start, count, geometry.maxInstancedCount ); + + } + + infoRender.calls ++; + infoRender.vertices += count * geometry.maxInstancedCount; + + if ( mode === gl.TRIANGLES ) infoRender.faces += geometry.maxInstancedCount * count / 3; + + } + + // + + this.setMode = setMode; + this.render = render; + this.renderInstances = renderInstances; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLGeometries( gl, attributes, infoMemory ) { + + var geometries = {}; + var wireframeAttributes = {}; + + function onGeometryDispose( event ) { + + var geometry = event.target; + var buffergeometry = geometries[ geometry.id ]; + + if ( buffergeometry.index !== null ) { + + attributes.remove( buffergeometry.index ); + + } + + for ( var name in buffergeometry.attributes ) { + + attributes.remove( buffergeometry.attributes[ name ] ); + + } + + geometry.removeEventListener( 'dispose', onGeometryDispose ); + + delete geometries[ geometry.id ]; + + // TODO Remove duplicate code + + var attribute = wireframeAttributes[ geometry.id ]; + + if ( attribute ) { + + attributes.remove( attribute ); + delete wireframeAttributes[ geometry.id ]; + + } + + attribute = wireframeAttributes[ buffergeometry.id ]; + + if ( attribute ) { + + attributes.remove( attribute ); + delete wireframeAttributes[ buffergeometry.id ]; + + } + + // + + infoMemory.geometries --; + + } + + function get( object, geometry ) { + + var buffergeometry = geometries[ geometry.id ]; + + if ( buffergeometry ) return buffergeometry; + + geometry.addEventListener( 'dispose', onGeometryDispose ); + + if ( geometry.isBufferGeometry ) { + + buffergeometry = geometry; + + } else if ( geometry.isGeometry ) { + + if ( geometry._bufferGeometry === undefined ) { + + geometry._bufferGeometry = new BufferGeometry().setFromObject( object ); + + } + + buffergeometry = geometry._bufferGeometry; + + } + + geometries[ geometry.id ] = buffergeometry; + + infoMemory.geometries ++; + + return buffergeometry; + + } + + function update( geometry ) { + + var index = geometry.index; + var geometryAttributes = geometry.attributes; + + if ( index !== null ) { + + attributes.update( index, gl.ELEMENT_ARRAY_BUFFER ); + + } + + for ( var name in geometryAttributes ) { + + attributes.update( geometryAttributes[ name ], gl.ARRAY_BUFFER ); + + } + + // morph targets + + var morphAttributes = geometry.morphAttributes; + + for ( var name in morphAttributes ) { + + var array = morphAttributes[ name ]; + + for ( var i = 0, l = array.length; i < l; i ++ ) { + + attributes.update( array[ i ], gl.ARRAY_BUFFER ); + + } + + } + + } + + function getWireframeAttribute( geometry ) { + + var attribute = wireframeAttributes[ geometry.id ]; + + if ( attribute ) return attribute; + + var indices = []; + + var geometryIndex = geometry.index; + var geometryAttributes = geometry.attributes; + + // console.time( 'wireframe' ); + + if ( geometryIndex !== null ) { + + var array = geometryIndex.array; + + for ( var i = 0, l = array.length; i < l; i += 3 ) { + + var a = array[ i + 0 ]; + var b = array[ i + 1 ]; + var c = array[ i + 2 ]; + + indices.push( a, b, b, c, c, a ); + + } + + } else { + + var array = geometryAttributes.position.array; + + for ( var i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) { + + var a = i + 0; + var b = i + 1; + var c = i + 2; + + indices.push( a, b, b, c, c, a ); + + } + + } + + // console.timeEnd( 'wireframe' ); + + attribute = new ( arrayMax( indices ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 ); + + attributes.update( attribute, gl.ELEMENT_ARRAY_BUFFER ); + + wireframeAttributes[ geometry.id ] = attribute; + + return attribute; + + } + + return { + + get: get, + update: update, + + getWireframeAttribute: getWireframeAttribute + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLLights() { + + var lights = {}; + + return { + + get: function ( light ) { + + if ( lights[ light.id ] !== undefined ) { + + return lights[ light.id ]; + + } + + var uniforms; + + switch ( light.type ) { + + case 'DirectionalLight': + uniforms = { + direction: new Vector3(), + color: new Color(), + + shadow: false, + shadowBias: 0, + shadowRadius: 1, + shadowMapSize: new Vector2() + }; + break; + + case 'SpotLight': + uniforms = { + position: new Vector3(), + direction: new Vector3(), + color: new Color(), + distance: 0, + coneCos: 0, + penumbraCos: 0, + decay: 0, + + shadow: false, + shadowBias: 0, + shadowRadius: 1, + shadowMapSize: new Vector2() + }; + break; + + case 'PointLight': + uniforms = { + position: new Vector3(), + color: new Color(), + distance: 0, + decay: 0, + + shadow: false, + shadowBias: 0, + shadowRadius: 1, + shadowMapSize: new Vector2() + }; + break; + + case 'HemisphereLight': + uniforms = { + direction: new Vector3(), + skyColor: new Color(), + groundColor: new Color() + }; + break; + + case 'RectAreaLight': + uniforms = { + color: new Color(), + position: new Vector3(), + halfWidth: new Vector3(), + halfHeight: new Vector3() + // TODO (abelnation): set RectAreaLight shadow uniforms + }; + break; + + } + + lights[ light.id ] = uniforms; + + return uniforms; + + } + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLObjects( gl, geometries, infoRender ) { + + var updateList = {}; + + function update( object ) { + + var frame = infoRender.frame; + + var geometry = object.geometry; + var buffergeometry = geometries.get( object, geometry ); + + // Update once per frame + + if ( updateList[ buffergeometry.id ] !== frame ) { + + if ( geometry.isGeometry ) { + + buffergeometry.updateFromObject( object ); + + } + + geometries.update( buffergeometry ); + + updateList[ buffergeometry.id ] = frame; + + } + + return buffergeometry; + + } + + function clear() { + + updateList = {}; + + } + + return { + + update: update, + clear: clear + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function addLineNumbers( string ) { + + var lines = string.split( '\n' ); + + for ( var i = 0; i < lines.length; i ++ ) { + + lines[ i ] = ( i + 1 ) + ': ' + lines[ i ]; + + } + + return lines.join( '\n' ); + + } + + function WebGLShader( gl, type, string ) { + + var shader = gl.createShader( type ); + + gl.shaderSource( shader, string ); + gl.compileShader( shader ); + + if ( gl.getShaderParameter( shader, gl.COMPILE_STATUS ) === false ) { + + console.error( 'THREE.WebGLShader: Shader couldn\'t compile.' ); + + } + + if ( gl.getShaderInfoLog( shader ) !== '' ) { + + console.warn( 'THREE.WebGLShader: gl.getShaderInfoLog()', type === gl.VERTEX_SHADER ? 'vertex' : 'fragment', gl.getShaderInfoLog( shader ), addLineNumbers( string ) ); + + } + + // --enable-privileged-webgl-extension + // console.log( type, gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) ); + + return shader; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + var programIdCount = 0; + + function getEncodingComponents( encoding ) { + + switch ( encoding ) { + + case LinearEncoding: + return [ 'Linear','( value )' ]; + case sRGBEncoding: + return [ 'sRGB','( value )' ]; + case RGBEEncoding: + return [ 'RGBE','( value )' ]; + case RGBM7Encoding: + return [ 'RGBM','( value, 7.0 )' ]; + case RGBM16Encoding: + return [ 'RGBM','( value, 16.0 )' ]; + case RGBDEncoding: + return [ 'RGBD','( value, 256.0 )' ]; + case GammaEncoding: + return [ 'Gamma','( value, float( GAMMA_FACTOR ) )' ]; + default: + throw new Error( 'unsupported encoding: ' + encoding ); + + } + + } + + function getTexelDecodingFunction( functionName, encoding ) { + + var components = getEncodingComponents( encoding ); + return "vec4 " + functionName + "( vec4 value ) { return " + components[ 0 ] + "ToLinear" + components[ 1 ] + "; }"; + + } + + function getTexelEncodingFunction( functionName, encoding ) { + + var components = getEncodingComponents( encoding ); + return "vec4 " + functionName + "( vec4 value ) { return LinearTo" + components[ 0 ] + components[ 1 ] + "; }"; + + } + + function getToneMappingFunction( functionName, toneMapping ) { + + var toneMappingName; + + switch ( toneMapping ) { + + case LinearToneMapping: + toneMappingName = "Linear"; + break; + + case ReinhardToneMapping: + toneMappingName = "Reinhard"; + break; + + case Uncharted2ToneMapping: + toneMappingName = "Uncharted2"; + break; + + case CineonToneMapping: + toneMappingName = "OptimizedCineon"; + break; + + default: + throw new Error( 'unsupported toneMapping: ' + toneMapping ); + + } + + return "vec3 " + functionName + "( vec3 color ) { return " + toneMappingName + "ToneMapping( color ); }"; + + } + + function generateExtensions( extensions, parameters, rendererExtensions ) { + + extensions = extensions || {}; + + var chunks = [ + ( extensions.derivatives || parameters.envMapCubeUV || parameters.bumpMap || parameters.normalMap || parameters.flatShading ) ? '#extension GL_OES_standard_derivatives : enable' : '', + ( extensions.fragDepth || parameters.logarithmicDepthBuffer ) && rendererExtensions.get( 'EXT_frag_depth' ) ? '#extension GL_EXT_frag_depth : enable' : '', + ( extensions.drawBuffers ) && rendererExtensions.get( 'WEBGL_draw_buffers' ) ? '#extension GL_EXT_draw_buffers : require' : '', + ( extensions.shaderTextureLOD || parameters.envMap ) && rendererExtensions.get( 'EXT_shader_texture_lod' ) ? '#extension GL_EXT_shader_texture_lod : enable' : '' + ]; + + return chunks.filter( filterEmptyLine ).join( '\n' ); + + } + + function generateDefines( defines ) { + + var chunks = []; + + for ( var name in defines ) { + + var value = defines[ name ]; + + if ( value === false ) continue; + + chunks.push( '#define ' + name + ' ' + value ); + + } + + return chunks.join( '\n' ); + + } + + function fetchAttributeLocations( gl, program, identifiers ) { + + var attributes = {}; + + var n = gl.getProgramParameter( program, gl.ACTIVE_ATTRIBUTES ); + + for ( var i = 0; i < n; i ++ ) { + + var info = gl.getActiveAttrib( program, i ); + var name = info.name; + + // console.log("THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:", name, i ); + + attributes[ name ] = gl.getAttribLocation( program, name ); + + } + + return attributes; + + } + + function filterEmptyLine( string ) { + + return string !== ''; + + } + + function replaceLightNums( string, parameters ) { + + return string + .replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights ) + .replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights ) + .replace( /NUM_RECT_AREA_LIGHTS/g, parameters.numRectAreaLights ) + .replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights ) + .replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights ); + + } + + function parseIncludes( string ) { + + var pattern = /^[ \t]*#include +<([\w\d.]+)>/gm; + + function replace( match, include ) { + + var replace = ShaderChunk[ include ]; + + if ( replace === undefined ) { + + throw new Error( 'Can not resolve #include <' + include + '>' ); + + } + + return parseIncludes( replace ); + + } + + return string.replace( pattern, replace ); + + } + + function unrollLoops( string ) { + + var pattern = /for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g; + + function replace( match, start, end, snippet ) { + + var unroll = ''; + + for ( var i = parseInt( start ); i < parseInt( end ); i ++ ) { + + unroll += snippet.replace( /\[ i \]/g, '[ ' + i + ' ]' ); + + } + + return unroll; + + } + + return string.replace( pattern, replace ); + + } + + function WebGLProgram( renderer, code, material, shader, parameters ) { + + var gl = renderer.context; + + var extensions = material.extensions; + var defines = material.defines; + + var vertexShader = shader.vertexShader; + var fragmentShader = shader.fragmentShader; + + var shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC'; + + if ( parameters.shadowMapType === PCFShadowMap ) { + + shadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF'; + + } else if ( parameters.shadowMapType === PCFSoftShadowMap ) { + + shadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT'; + + } + + var envMapTypeDefine = 'ENVMAP_TYPE_CUBE'; + var envMapModeDefine = 'ENVMAP_MODE_REFLECTION'; + var envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY'; + + if ( parameters.envMap ) { + + switch ( material.envMap.mapping ) { + + case CubeReflectionMapping: + case CubeRefractionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_CUBE'; + break; + + case CubeUVReflectionMapping: + case CubeUVRefractionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV'; + break; + + case EquirectangularReflectionMapping: + case EquirectangularRefractionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_EQUIREC'; + break; + + case SphericalReflectionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_SPHERE'; + break; + + } + + switch ( material.envMap.mapping ) { + + case CubeRefractionMapping: + case EquirectangularRefractionMapping: + envMapModeDefine = 'ENVMAP_MODE_REFRACTION'; + break; + + } + + switch ( material.combine ) { + + case MultiplyOperation: + envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY'; + break; + + case MixOperation: + envMapBlendingDefine = 'ENVMAP_BLENDING_MIX'; + break; + + case AddOperation: + envMapBlendingDefine = 'ENVMAP_BLENDING_ADD'; + break; + + } + + } + + var gammaFactorDefine = ( renderer.gammaFactor > 0 ) ? renderer.gammaFactor : 1.0; + + // console.log( 'building new program ' ); + + // + + var customExtensions = generateExtensions( extensions, parameters, renderer.extensions ); + + var customDefines = generateDefines( defines ); + + // + + var program = gl.createProgram(); + + var prefixVertex, prefixFragment; + + if ( material.isRawShaderMaterial ) { + + prefixVertex = [ + + customDefines, + + '\n' + + ].filter( filterEmptyLine ).join( '\n' ); + + prefixFragment = [ + + customExtensions, + customDefines, + + '\n' + + ].filter( filterEmptyLine ).join( '\n' ); + + } else { + + prefixVertex = [ + + 'precision ' + parameters.precision + ' float;', + 'precision ' + parameters.precision + ' int;', + + '#define SHADER_NAME ' + shader.name, + + customDefines, + + parameters.supportsVertexTextures ? '#define VERTEX_TEXTURES' : '', + + '#define GAMMA_FACTOR ' + gammaFactorDefine, + + '#define MAX_BONES ' + parameters.maxBones, + ( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '', + ( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '', + + parameters.map ? '#define USE_MAP' : '', + parameters.envMap ? '#define USE_ENVMAP' : '', + parameters.envMap ? '#define ' + envMapModeDefine : '', + parameters.lightMap ? '#define USE_LIGHTMAP' : '', + parameters.aoMap ? '#define USE_AOMAP' : '', + parameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '', + parameters.bumpMap ? '#define USE_BUMPMAP' : '', + parameters.normalMap ? '#define USE_NORMALMAP' : '', + parameters.displacementMap && parameters.supportsVertexTextures ? '#define USE_DISPLACEMENTMAP' : '', + parameters.specularMap ? '#define USE_SPECULARMAP' : '', + parameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '', + parameters.metalnessMap ? '#define USE_METALNESSMAP' : '', + parameters.alphaMap ? '#define USE_ALPHAMAP' : '', + parameters.vertexColors ? '#define USE_COLOR' : '', + + parameters.flatShading ? '#define FLAT_SHADED' : '', + + parameters.skinning ? '#define USE_SKINNING' : '', + parameters.useVertexTexture ? '#define BONE_TEXTURE' : '', + + parameters.morphTargets ? '#define USE_MORPHTARGETS' : '', + parameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '', + parameters.doubleSided ? '#define DOUBLE_SIDED' : '', + parameters.flipSided ? '#define FLIP_SIDED' : '', + + '#define NUM_CLIPPING_PLANES ' + parameters.numClippingPlanes, + + parameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '', + parameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '', + + parameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '', + + parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '', + parameters.logarithmicDepthBuffer && renderer.extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '', + + 'uniform mat4 modelMatrix;', + 'uniform mat4 modelViewMatrix;', + 'uniform mat4 projectionMatrix;', + 'uniform mat4 viewMatrix;', + 'uniform mat3 normalMatrix;', + 'uniform vec3 cameraPosition;', + + 'attribute vec3 position;', + 'attribute vec3 normal;', + 'attribute vec2 uv;', + + '#ifdef USE_COLOR', + + ' attribute vec3 color;', + + '#endif', + + '#ifdef USE_MORPHTARGETS', + + ' attribute vec3 morphTarget0;', + ' attribute vec3 morphTarget1;', + ' attribute vec3 morphTarget2;', + ' attribute vec3 morphTarget3;', + + ' #ifdef USE_MORPHNORMALS', + + ' attribute vec3 morphNormal0;', + ' attribute vec3 morphNormal1;', + ' attribute vec3 morphNormal2;', + ' attribute vec3 morphNormal3;', + + ' #else', + + ' attribute vec3 morphTarget4;', + ' attribute vec3 morphTarget5;', + ' attribute vec3 morphTarget6;', + ' attribute vec3 morphTarget7;', + + ' #endif', + + '#endif', + + '#ifdef USE_SKINNING', + + ' attribute vec4 skinIndex;', + ' attribute vec4 skinWeight;', + + '#endif', + + '\n' + + ].filter( filterEmptyLine ).join( '\n' ); + + prefixFragment = [ + + customExtensions, + + 'precision ' + parameters.precision + ' float;', + 'precision ' + parameters.precision + ' int;', + + '#define SHADER_NAME ' + shader.name, + + customDefines, + + parameters.alphaTest ? '#define ALPHATEST ' + parameters.alphaTest : '', + + '#define GAMMA_FACTOR ' + gammaFactorDefine, + + ( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '', + ( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '', + + parameters.map ? '#define USE_MAP' : '', + parameters.envMap ? '#define USE_ENVMAP' : '', + parameters.envMap ? '#define ' + envMapTypeDefine : '', + parameters.envMap ? '#define ' + envMapModeDefine : '', + parameters.envMap ? '#define ' + envMapBlendingDefine : '', + parameters.lightMap ? '#define USE_LIGHTMAP' : '', + parameters.aoMap ? '#define USE_AOMAP' : '', + parameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '', + parameters.bumpMap ? '#define USE_BUMPMAP' : '', + parameters.normalMap ? '#define USE_NORMALMAP' : '', + parameters.specularMap ? '#define USE_SPECULARMAP' : '', + parameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '', + parameters.metalnessMap ? '#define USE_METALNESSMAP' : '', + parameters.alphaMap ? '#define USE_ALPHAMAP' : '', + parameters.vertexColors ? '#define USE_COLOR' : '', + + parameters.gradientMap ? '#define USE_GRADIENTMAP' : '', + + parameters.flatShading ? '#define FLAT_SHADED' : '', + + parameters.doubleSided ? '#define DOUBLE_SIDED' : '', + parameters.flipSided ? '#define FLIP_SIDED' : '', + + '#define NUM_CLIPPING_PLANES ' + parameters.numClippingPlanes, + '#define UNION_CLIPPING_PLANES ' + (parameters.numClippingPlanes - parameters.numClipIntersection), + + parameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '', + parameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '', + + parameters.premultipliedAlpha ? "#define PREMULTIPLIED_ALPHA" : '', + + parameters.physicallyCorrectLights ? "#define PHYSICALLY_CORRECT_LIGHTS" : '', + + parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '', + parameters.logarithmicDepthBuffer && renderer.extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '', + + parameters.envMap && renderer.extensions.get( 'EXT_shader_texture_lod' ) ? '#define TEXTURE_LOD_EXT' : '', + + 'uniform mat4 viewMatrix;', + 'uniform vec3 cameraPosition;', + + ( parameters.toneMapping !== NoToneMapping ) ? "#define TONE_MAPPING" : '', + ( parameters.toneMapping !== NoToneMapping ) ? ShaderChunk[ 'tonemapping_pars_fragment' ] : '', // this code is required here because it is used by the toneMapping() function defined below + ( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( "toneMapping", parameters.toneMapping ) : '', + + parameters.dithering ? '#define DITHERING' : '', + + ( parameters.outputEncoding || parameters.mapEncoding || parameters.envMapEncoding || parameters.emissiveMapEncoding ) ? ShaderChunk[ 'encodings_pars_fragment' ] : '', // this code is required here because it is used by the various encoding/decoding function defined below + parameters.mapEncoding ? getTexelDecodingFunction( 'mapTexelToLinear', parameters.mapEncoding ) : '', + parameters.envMapEncoding ? getTexelDecodingFunction( 'envMapTexelToLinear', parameters.envMapEncoding ) : '', + parameters.emissiveMapEncoding ? getTexelDecodingFunction( 'emissiveMapTexelToLinear', parameters.emissiveMapEncoding ) : '', + parameters.outputEncoding ? getTexelEncodingFunction( "linearToOutputTexel", parameters.outputEncoding ) : '', + + parameters.depthPacking ? "#define DEPTH_PACKING " + material.depthPacking : '', + + '\n' + + ].filter( filterEmptyLine ).join( '\n' ); + + } + + vertexShader = parseIncludes( vertexShader ); + vertexShader = replaceLightNums( vertexShader, parameters ); + + fragmentShader = parseIncludes( fragmentShader ); + fragmentShader = replaceLightNums( fragmentShader, parameters ); + + if ( ! material.isShaderMaterial ) { + + vertexShader = unrollLoops( vertexShader ); + fragmentShader = unrollLoops( fragmentShader ); + + } + + var vertexGlsl = prefixVertex + vertexShader; + var fragmentGlsl = prefixFragment + fragmentShader; + + // console.log( '*VERTEX*', vertexGlsl ); + // console.log( '*FRAGMENT*', fragmentGlsl ); + + var glVertexShader = WebGLShader( gl, gl.VERTEX_SHADER, vertexGlsl ); + var glFragmentShader = WebGLShader( gl, gl.FRAGMENT_SHADER, fragmentGlsl ); + + gl.attachShader( program, glVertexShader ); + gl.attachShader( program, glFragmentShader ); + + // Force a particular attribute to index 0. + + if ( material.index0AttributeName !== undefined ) { + + gl.bindAttribLocation( program, 0, material.index0AttributeName ); + + } else if ( parameters.morphTargets === true ) { + + // programs with morphTargets displace position out of attribute 0 + gl.bindAttribLocation( program, 0, 'position' ); + + } + + gl.linkProgram( program ); + + var programLog = gl.getProgramInfoLog( program ); + var vertexLog = gl.getShaderInfoLog( glVertexShader ); + var fragmentLog = gl.getShaderInfoLog( glFragmentShader ); + + var runnable = true; + var haveDiagnostics = true; + + // console.log( '**VERTEX**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glVertexShader ) ); + // console.log( '**FRAGMENT**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glFragmentShader ) ); + + if ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) { + + runnable = false; + + console.error( 'THREE.WebGLProgram: shader error: ', gl.getError(), 'gl.VALIDATE_STATUS', gl.getProgramParameter( program, gl.VALIDATE_STATUS ), 'gl.getProgramInfoLog', programLog, vertexLog, fragmentLog ); + + } else if ( programLog !== '' ) { + + console.warn( 'THREE.WebGLProgram: gl.getProgramInfoLog()', programLog ); + + } else if ( vertexLog === '' || fragmentLog === '' ) { + + haveDiagnostics = false; + + } + + if ( haveDiagnostics ) { + + this.diagnostics = { + + runnable: runnable, + material: material, + + programLog: programLog, + + vertexShader: { + + log: vertexLog, + prefix: prefixVertex + + }, + + fragmentShader: { + + log: fragmentLog, + prefix: prefixFragment + + } + + }; + + } + + // clean up + + gl.deleteShader( glVertexShader ); + gl.deleteShader( glFragmentShader ); + + // set up caching for uniform locations + + var cachedUniforms; + + this.getUniforms = function() { + + if ( cachedUniforms === undefined ) { + + cachedUniforms = + new WebGLUniforms( gl, program, renderer ); + + } + + return cachedUniforms; + + }; + + // set up caching for attribute locations + + var cachedAttributes; + + this.getAttributes = function() { + + if ( cachedAttributes === undefined ) { + + cachedAttributes = fetchAttributeLocations( gl, program ); + + } + + return cachedAttributes; + + }; + + // free resource + + this.destroy = function() { + + gl.deleteProgram( program ); + this.program = undefined; + + }; + + // DEPRECATED + + Object.defineProperties( this, { + + uniforms: { + get: function() { + + console.warn( 'THREE.WebGLProgram: .uniforms is now .getUniforms().' ); + return this.getUniforms(); + + } + }, + + attributes: { + get: function() { + + console.warn( 'THREE.WebGLProgram: .attributes is now .getAttributes().' ); + return this.getAttributes(); + + } + } + + } ); + + + // + + this.id = programIdCount ++; + this.code = code; + this.usedTimes = 1; + this.program = program; + this.vertexShader = glVertexShader; + this.fragmentShader = glFragmentShader; + + return this; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLPrograms( renderer, capabilities ) { + + var programs = []; + + var shaderIDs = { + MeshDepthMaterial: 'depth', + MeshNormalMaterial: 'normal', + MeshBasicMaterial: 'basic', + MeshLambertMaterial: 'lambert', + MeshPhongMaterial: 'phong', + MeshToonMaterial: 'phong', + MeshStandardMaterial: 'physical', + MeshPhysicalMaterial: 'physical', + LineBasicMaterial: 'basic', + LineDashedMaterial: 'dashed', + PointsMaterial: 'points' + }; + + var parameterNames = [ + "precision", "supportsVertexTextures", "map", "mapEncoding", "envMap", "envMapMode", "envMapEncoding", + "lightMap", "aoMap", "emissiveMap", "emissiveMapEncoding", "bumpMap", "normalMap", "displacementMap", "specularMap", + "roughnessMap", "metalnessMap", "gradientMap", + "alphaMap", "combine", "vertexColors", "fog", "useFog", "fogExp", + "flatShading", "sizeAttenuation", "logarithmicDepthBuffer", "skinning", + "maxBones", "useVertexTexture", "morphTargets", "morphNormals", + "maxMorphTargets", "maxMorphNormals", "premultipliedAlpha", + "numDirLights", "numPointLights", "numSpotLights", "numHemiLights", "numRectAreaLights", + "shadowMapEnabled", "shadowMapType", "toneMapping", 'physicallyCorrectLights', + "alphaTest", "doubleSided", "flipSided", "numClippingPlanes", "numClipIntersection", "depthPacking", "dithering" + ]; + + + function allocateBones( object ) { + + var skeleton = object.skeleton; + var bones = skeleton.bones; + + if ( capabilities.floatVertexTextures ) { + + return 1024; + + } else { + + // default for when object is not specified + // ( for example when prebuilding shader to be used with multiple objects ) + // + // - leave some extra space for other uniforms + // - limit here is ANGLE's 254 max uniform vectors + // (up to 54 should be safe) + + var nVertexUniforms = capabilities.maxVertexUniforms; + var nVertexMatrices = Math.floor( ( nVertexUniforms - 20 ) / 4 ); + + var maxBones = Math.min( nVertexMatrices, bones.length ); + + if ( maxBones < bones.length ) { + + console.warn( 'THREE.WebGLRenderer: Skeleton has ' + bones.length + ' bones. This GPU supports ' + maxBones + '.' ); + return 0; + + } + + return maxBones; + + } + + } + + function getTextureEncodingFromMap( map, gammaOverrideLinear ) { + + var encoding; + + if ( ! map ) { + + encoding = LinearEncoding; + + } else if ( map.isTexture ) { + + encoding = map.encoding; + + } else if ( map.isWebGLRenderTarget ) { + + console.warn( "THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead." ); + encoding = map.texture.encoding; + + } + + // add backwards compatibility for WebGLRenderer.gammaInput/gammaOutput parameter, should probably be removed at some point. + if ( encoding === LinearEncoding && gammaOverrideLinear ) { + + encoding = GammaEncoding; + + } + + return encoding; + + } + + this.getParameters = function ( material, lights, fog, nClipPlanes, nClipIntersection, object ) { + + var shaderID = shaderIDs[ material.type ]; + + // heuristics to create shader parameters according to lights in the scene + // (not to blow over maxLights budget) + + var maxBones = object.isSkinnedMesh ? allocateBones( object ) : 0; + var precision = renderer.getPrecision(); + + if ( material.precision !== null ) { + + precision = capabilities.getMaxPrecision( material.precision ); + + if ( precision !== material.precision ) { + + console.warn( 'THREE.WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' ); + + } + + } + + var currentRenderTarget = renderer.getRenderTarget(); + + var parameters = { + + shaderID: shaderID, + + precision: precision, + supportsVertexTextures: capabilities.vertexTextures, + outputEncoding: getTextureEncodingFromMap( ( ! currentRenderTarget ) ? null : currentRenderTarget.texture, renderer.gammaOutput ), + map: !! material.map, + mapEncoding: getTextureEncodingFromMap( material.map, renderer.gammaInput ), + envMap: !! material.envMap, + envMapMode: material.envMap && material.envMap.mapping, + envMapEncoding: getTextureEncodingFromMap( material.envMap, renderer.gammaInput ), + envMapCubeUV: ( !! material.envMap ) && ( ( material.envMap.mapping === CubeUVReflectionMapping ) || ( material.envMap.mapping === CubeUVRefractionMapping ) ), + lightMap: !! material.lightMap, + aoMap: !! material.aoMap, + emissiveMap: !! material.emissiveMap, + emissiveMapEncoding: getTextureEncodingFromMap( material.emissiveMap, renderer.gammaInput ), + bumpMap: !! material.bumpMap, + normalMap: !! material.normalMap, + displacementMap: !! material.displacementMap, + roughnessMap: !! material.roughnessMap, + metalnessMap: !! material.metalnessMap, + specularMap: !! material.specularMap, + alphaMap: !! material.alphaMap, + + gradientMap: !! material.gradientMap, + + combine: material.combine, + + vertexColors: material.vertexColors, + + fog: !! fog, + useFog: material.fog, + fogExp: ( fog && fog.isFogExp2 ), + + flatShading: material.shading === FlatShading, + + sizeAttenuation: material.sizeAttenuation, + logarithmicDepthBuffer: capabilities.logarithmicDepthBuffer, + + skinning: material.skinning && maxBones > 0, + maxBones: maxBones, + useVertexTexture: capabilities.floatVertexTextures, + + morphTargets: material.morphTargets, + morphNormals: material.morphNormals, + maxMorphTargets: renderer.maxMorphTargets, + maxMorphNormals: renderer.maxMorphNormals, + + numDirLights: lights.directional.length, + numPointLights: lights.point.length, + numSpotLights: lights.spot.length, + numRectAreaLights: lights.rectArea.length, + numHemiLights: lights.hemi.length, + + numClippingPlanes: nClipPlanes, + numClipIntersection: nClipIntersection, + + dithering: material.dithering, + + shadowMapEnabled: renderer.shadowMap.enabled && object.receiveShadow && lights.shadows.length > 0, + shadowMapType: renderer.shadowMap.type, + + toneMapping: renderer.toneMapping, + physicallyCorrectLights: renderer.physicallyCorrectLights, + + premultipliedAlpha: material.premultipliedAlpha, + + alphaTest: material.alphaTest, + doubleSided: material.side === DoubleSide, + flipSided: material.side === BackSide, + + depthPacking: ( material.depthPacking !== undefined ) ? material.depthPacking : false + + }; + + return parameters; + + }; + + this.getProgramCode = function ( material, parameters ) { + + var array = []; + + if ( parameters.shaderID ) { + + array.push( parameters.shaderID ); + + } else { + + array.push( material.fragmentShader ); + array.push( material.vertexShader ); + + } + + if ( material.defines !== undefined ) { + + for ( var name in material.defines ) { + + array.push( name ); + array.push( material.defines[ name ] ); + + } + + } + + for ( var i = 0; i < parameterNames.length; i ++ ) { + + array.push( parameters[ parameterNames[ i ] ] ); + + } + + array.push( material.onBeforeCompile.toString() ); + + array.push( renderer.gammaOutput ); + + return array.join(); + + }; + + this.acquireProgram = function ( material, shader, parameters, code ) { + + var program; + + // Check if code has been already compiled + for ( var p = 0, pl = programs.length; p < pl; p ++ ) { + + var programInfo = programs[ p ]; + + if ( programInfo.code === code ) { + + program = programInfo; + ++ program.usedTimes; + + break; + + } + + } + + if ( program === undefined ) { + + program = new WebGLProgram( renderer, code, material, shader, parameters ); + programs.push( program ); + + } + + return program; + + }; + + this.releaseProgram = function ( program ) { + + if ( -- program.usedTimes === 0 ) { + + // Remove from unordered set + var i = programs.indexOf( program ); + programs[ i ] = programs[ programs.length - 1 ]; + programs.pop(); + + // Free WebGL resources + program.destroy(); + + } + + }; + + // Exposed for resource monitoring & error feedback via renderer.info: + this.programs = programs; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLTextures( _gl, extensions, state, properties, capabilities, paramThreeToGL, infoMemory ) { + + var _isWebGL2 = ( typeof WebGL2RenderingContext !== 'undefined' && _gl instanceof WebGL2RenderingContext ); + + // + + function clampToMaxSize( image, maxSize ) { + + if ( image.width > maxSize || image.height > maxSize ) { + + // Warning: Scaling through the canvas will only work with images that use + // premultiplied alpha. + + var scale = maxSize / Math.max( image.width, image.height ); + + var canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); + canvas.width = Math.floor( image.width * scale ); + canvas.height = Math.floor( image.height * scale ); + + var context = canvas.getContext( '2d' ); + context.drawImage( image, 0, 0, image.width, image.height, 0, 0, canvas.width, canvas.height ); + + console.warn( 'THREE.WebGLRenderer: image is too big (' + image.width + 'x' + image.height + '). Resized to ' + canvas.width + 'x' + canvas.height, image ); + + return canvas; + + } + + return image; + + } + + function isPowerOfTwo( image ) { + + return _Math.isPowerOfTwo( image.width ) && _Math.isPowerOfTwo( image.height ); + + } + + function makePowerOfTwo( image ) { + + if ( image instanceof HTMLImageElement || image instanceof HTMLCanvasElement ) { + + var canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); + canvas.width = _Math.nearestPowerOfTwo( image.width ); + canvas.height = _Math.nearestPowerOfTwo( image.height ); + + var context = canvas.getContext( '2d' ); + context.drawImage( image, 0, 0, canvas.width, canvas.height ); + + console.warn( 'THREE.WebGLRenderer: image is not power of two (' + image.width + 'x' + image.height + '). Resized to ' + canvas.width + 'x' + canvas.height, image ); + + return canvas; + + } + + return image; + + } + + function textureNeedsPowerOfTwo( texture ) { + + return ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) || + ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ); + + } + + function textureNeedsGenerateMipmaps( texture, isPowerOfTwo ) { + + return texture.generateMipmaps && isPowerOfTwo && + texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter; + + } + + // Fallback filters for non-power-of-2 textures + + function filterFallback( f ) { + + if ( f === NearestFilter || f === NearestMipMapNearestFilter || f === NearestMipMapLinearFilter ) { + + return _gl.NEAREST; + + } + + return _gl.LINEAR; + + } + + // + + function onTextureDispose( event ) { + + var texture = event.target; + + texture.removeEventListener( 'dispose', onTextureDispose ); + + deallocateTexture( texture ); + + infoMemory.textures --; + + + } + + function onRenderTargetDispose( event ) { + + var renderTarget = event.target; + + renderTarget.removeEventListener( 'dispose', onRenderTargetDispose ); + + deallocateRenderTarget( renderTarget ); + + infoMemory.textures --; + + } + + // + + function deallocateTexture( texture ) { + + var textureProperties = properties.get( texture ); + + if ( texture.image && textureProperties.__image__webglTextureCube ) { + + // cube texture + + _gl.deleteTexture( textureProperties.__image__webglTextureCube ); + + } else { + + // 2D texture + + if ( textureProperties.__webglInit === undefined ) return; + + _gl.deleteTexture( textureProperties.__webglTexture ); + + } + + // remove all webgl properties + properties.remove( texture ); + + } + + function deallocateRenderTarget( renderTarget ) { + + var renderTargetProperties = properties.get( renderTarget ); + var textureProperties = properties.get( renderTarget.texture ); + + if ( ! renderTarget ) return; + + if ( textureProperties.__webglTexture !== undefined ) { + + _gl.deleteTexture( textureProperties.__webglTexture ); + + } + + if ( renderTarget.depthTexture ) { + + renderTarget.depthTexture.dispose(); + + } + + if ( renderTarget.isWebGLRenderTargetCube ) { + + for ( var i = 0; i < 6; i ++ ) { + + _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] ); + if ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] ); + + } + + } else { + + _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer ); + if ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer ); + + } + + properties.remove( renderTarget.texture ); + properties.remove( renderTarget ); + + } + + // + + + + function setTexture2D( texture, slot ) { + + var textureProperties = properties.get( texture ); + + if ( texture.version > 0 && textureProperties.__version !== texture.version ) { + + var image = texture.image; + + if ( image === undefined ) { + + console.warn( 'THREE.WebGLRenderer: Texture marked for update but image is undefined', texture ); + + } else if ( image.complete === false ) { + + console.warn( 'THREE.WebGLRenderer: Texture marked for update but image is incomplete', texture ); + + } else { + + uploadTexture( textureProperties, texture, slot ); + return; + + } + + } + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture ); + + } + + function setTextureCube( texture, slot ) { + + var textureProperties = properties.get( texture ); + + if ( texture.image.length === 6 ) { + + if ( texture.version > 0 && textureProperties.__version !== texture.version ) { + + if ( ! textureProperties.__image__webglTextureCube ) { + + texture.addEventListener( 'dispose', onTextureDispose ); + + textureProperties.__image__webglTextureCube = _gl.createTexture(); + + infoMemory.textures ++; + + } + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube ); + + _gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY ); + + var isCompressed = ( texture && texture.isCompressedTexture ); + var isDataTexture = ( texture.image[ 0 ] && texture.image[ 0 ].isDataTexture ); + + var cubeImage = []; + + for ( var i = 0; i < 6; i ++ ) { + + if ( ! isCompressed && ! isDataTexture ) { + + cubeImage[ i ] = clampToMaxSize( texture.image[ i ], capabilities.maxCubemapSize ); + + } else { + + cubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ]; + + } + + } + + var image = cubeImage[ 0 ], + isPowerOfTwoImage = isPowerOfTwo( image ), + glFormat = paramThreeToGL( texture.format ), + glType = paramThreeToGL( texture.type ); + + setTextureParameters( _gl.TEXTURE_CUBE_MAP, texture, isPowerOfTwoImage ); + + for ( var i = 0; i < 6; i ++ ) { + + if ( ! isCompressed ) { + + if ( isDataTexture ) { + + state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data ); + + } else { + + state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, glFormat, glType, cubeImage[ i ] ); + + } + + } else { + + var mipmap, mipmaps = cubeImage[ i ].mipmaps; + + for ( var j = 0, jl = mipmaps.length; j < jl; j ++ ) { + + mipmap = mipmaps[ j ]; + + if ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) { + + if ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) { + + state.compressedTexImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glFormat, mipmap.width, mipmap.height, 0, mipmap.data ); + + } else { + + console.warn( "THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()" ); + + } + + } else { + + state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); + + } + + } + + } + + } + + if ( textureNeedsGenerateMipmaps( texture, isPowerOfTwoImage ) ) { + + _gl.generateMipmap( _gl.TEXTURE_CUBE_MAP ); + + } + + textureProperties.__version = texture.version; + + if ( texture.onUpdate ) texture.onUpdate( texture ); + + } else { + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube ); + + } + + } + + } + + function setTextureCubeDynamic( texture, slot ) { + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_CUBE_MAP, properties.get( texture ).__webglTexture ); + + } + + function setTextureParameters( textureType, texture, isPowerOfTwoImage ) { + + var extension; + + if ( isPowerOfTwoImage ) { + + _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, paramThreeToGL( texture.wrapS ) ); + _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, paramThreeToGL( texture.wrapT ) ); + + _gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, paramThreeToGL( texture.magFilter ) ); + _gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, paramThreeToGL( texture.minFilter ) ); + + } else { + + _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE ); + _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE ); + + if ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) { + + console.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.', texture ); + + } + + _gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterFallback( texture.magFilter ) ); + _gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterFallback( texture.minFilter ) ); + + if ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) { + + console.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.', texture ); + + } + + } + + extension = extensions.get( 'EXT_texture_filter_anisotropic' ); + + if ( extension ) { + + if ( texture.type === FloatType && extensions.get( 'OES_texture_float_linear' ) === null ) return; + if ( texture.type === HalfFloatType && extensions.get( 'OES_texture_half_float_linear' ) === null ) return; + + if ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) { + + _gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, capabilities.getMaxAnisotropy() ) ); + properties.get( texture ).__currentAnisotropy = texture.anisotropy; + + } + + } + + } + + function uploadTexture( textureProperties, texture, slot ) { + + if ( textureProperties.__webglInit === undefined ) { + + textureProperties.__webglInit = true; + + texture.addEventListener( 'dispose', onTextureDispose ); + + textureProperties.__webglTexture = _gl.createTexture(); + + infoMemory.textures ++; + + } + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture ); + + _gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY ); + _gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha ); + _gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment ); + + var image = clampToMaxSize( texture.image, capabilities.maxTextureSize ); + + if ( textureNeedsPowerOfTwo( texture ) && isPowerOfTwo( image ) === false ) { + + image = makePowerOfTwo( image ); + + } + + var isPowerOfTwoImage = isPowerOfTwo( image ), + glFormat = paramThreeToGL( texture.format ), + glType = paramThreeToGL( texture.type ); + + setTextureParameters( _gl.TEXTURE_2D, texture, isPowerOfTwoImage ); + + var mipmap, mipmaps = texture.mipmaps; + + if ( texture.isDepthTexture ) { + + // populate depth texture with dummy data + + var internalFormat = _gl.DEPTH_COMPONENT; + + if ( texture.type === FloatType ) { + + if ( !_isWebGL2 ) throw new Error('Float Depth Texture only supported in WebGL2.0'); + internalFormat = _gl.DEPTH_COMPONENT32F; + + } else if ( _isWebGL2 ) { + + // WebGL 2.0 requires signed internalformat for glTexImage2D + internalFormat = _gl.DEPTH_COMPONENT16; + + } + + if ( texture.format === DepthFormat && internalFormat === _gl.DEPTH_COMPONENT ) { + + // The error INVALID_OPERATION is generated by texImage2D if format and internalformat are + // DEPTH_COMPONENT and type is not UNSIGNED_SHORT or UNSIGNED_INT + // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/) + if ( texture.type !== UnsignedShortType && texture.type !== UnsignedIntType ) { + + console.warn( 'THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture.' ); + + texture.type = UnsignedShortType; + glType = paramThreeToGL( texture.type ); + + } + + } + + // Depth stencil textures need the DEPTH_STENCIL internal format + // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/) + if ( texture.format === DepthStencilFormat ) { + + internalFormat = _gl.DEPTH_STENCIL; + + // The error INVALID_OPERATION is generated by texImage2D if format and internalformat are + // DEPTH_STENCIL and type is not UNSIGNED_INT_24_8_WEBGL. + // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/) + if ( texture.type !== UnsignedInt248Type ) { + + console.warn( 'THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture.' ); + + texture.type = UnsignedInt248Type; + glType = paramThreeToGL( texture.type ); + + } + + } + + state.texImage2D( _gl.TEXTURE_2D, 0, internalFormat, image.width, image.height, 0, glFormat, glType, null ); + + } else if ( texture.isDataTexture ) { + + // use manually created mipmaps if available + // if there are no manual mipmaps + // set 0 level mipmap and then use GL to generate other mipmap levels + + if ( mipmaps.length > 0 && isPowerOfTwoImage ) { + + for ( var i = 0, il = mipmaps.length; i < il; i ++ ) { + + mipmap = mipmaps[ i ]; + state.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); + + } + + texture.generateMipmaps = false; + + } else { + + state.texImage2D( _gl.TEXTURE_2D, 0, glFormat, image.width, image.height, 0, glFormat, glType, image.data ); + + } + + } else if ( texture.isCompressedTexture ) { + + for ( var i = 0, il = mipmaps.length; i < il; i ++ ) { + + mipmap = mipmaps[ i ]; + + if ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) { + + if ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) { + + state.compressedTexImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, mipmap.data ); + + } else { + + console.warn( "THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()" ); + + } + + } else { + + state.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); + + } + + } + + } else { + + // regular Texture (image, video, canvas) + + // use manually created mipmaps if available + // if there are no manual mipmaps + // set 0 level mipmap and then use GL to generate other mipmap levels + + if ( mipmaps.length > 0 && isPowerOfTwoImage ) { + + for ( var i = 0, il = mipmaps.length; i < il; i ++ ) { + + mipmap = mipmaps[ i ]; + state.texImage2D( _gl.TEXTURE_2D, i, glFormat, glFormat, glType, mipmap ); + + } + + texture.generateMipmaps = false; + + } else { + + state.texImage2D( _gl.TEXTURE_2D, 0, glFormat, glFormat, glType, image ); + + } + + } + + if ( textureNeedsGenerateMipmaps( texture, isPowerOfTwoImage ) ) _gl.generateMipmap( _gl.TEXTURE_2D ); + + textureProperties.__version = texture.version; + + if ( texture.onUpdate ) texture.onUpdate( texture ); + + } + + // Render targets + + // Setup storage for target texture and bind it to correct framebuffer + function setupFrameBufferTexture( framebuffer, renderTarget, attachment, textureTarget ) { + + var glFormat = paramThreeToGL( renderTarget.texture.format ); + var glType = paramThreeToGL( renderTarget.texture.type ); + state.texImage2D( textureTarget, 0, glFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null ); + _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); + _gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( renderTarget.texture ).__webglTexture, 0 ); + _gl.bindFramebuffer( _gl.FRAMEBUFFER, null ); + + } + + // Setup storage for internal depth/stencil buffers and bind to correct framebuffer + function setupRenderBufferStorage( renderbuffer, renderTarget ) { + + _gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer ); + + if ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) { + + _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_COMPONENT16, renderTarget.width, renderTarget.height ); + _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer ); + + } else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) { + + _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_STENCIL, renderTarget.width, renderTarget.height ); + _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer ); + + } else { + + // FIXME: We don't support !depth !stencil + _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.RGBA4, renderTarget.width, renderTarget.height ); + + } + + _gl.bindRenderbuffer( _gl.RENDERBUFFER, null ); + + } + + // Setup resources for a Depth Texture for a FBO (needs an extension) + function setupDepthTexture( framebuffer, renderTarget ) { + + var isCube = ( renderTarget && renderTarget.isWebGLRenderTargetCube ); + if ( isCube ) throw new Error('Depth Texture with cube render targets is not supported!'); + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); + + if ( !( renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture ) ) { + + throw new Error('renderTarget.depthTexture must be an instance of THREE.DepthTexture'); + + } + + // upload an empty depth texture with framebuffer size + if ( !properties.get( renderTarget.depthTexture ).__webglTexture || + renderTarget.depthTexture.image.width !== renderTarget.width || + renderTarget.depthTexture.image.height !== renderTarget.height ) { + renderTarget.depthTexture.image.width = renderTarget.width; + renderTarget.depthTexture.image.height = renderTarget.height; + renderTarget.depthTexture.needsUpdate = true; + } + + setTexture2D( renderTarget.depthTexture, 0 ); + + var webglDepthTexture = properties.get( renderTarget.depthTexture ).__webglTexture; + + if ( renderTarget.depthTexture.format === DepthFormat ) { + + _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 ); + + } else if ( renderTarget.depthTexture.format === DepthStencilFormat ) { + + _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 ); + + } else { + + throw new Error('Unknown depthTexture format') + + } + + } + + // Setup GL resources for a non-texture depth buffer + function setupDepthRenderbuffer( renderTarget ) { + + var renderTargetProperties = properties.get( renderTarget ); + + var isCube = ( renderTarget.isWebGLRenderTargetCube === true ); + + if ( renderTarget.depthTexture ) { + + if ( isCube ) throw new Error('target.depthTexture not supported in Cube render targets'); + + setupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget ); + + } else { + + if ( isCube ) { + + renderTargetProperties.__webglDepthbuffer = []; + + for ( var i = 0; i < 6; i ++ ) { + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ i ] ); + renderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer(); + setupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget ); + + } + + } else { + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer ); + renderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer(); + setupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget ); + + } + + } + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, null ); + + } + + // Set up GL resources for the render target + function setupRenderTarget( renderTarget ) { + + var renderTargetProperties = properties.get( renderTarget ); + var textureProperties = properties.get( renderTarget.texture ); + + renderTarget.addEventListener( 'dispose', onRenderTargetDispose ); + + textureProperties.__webglTexture = _gl.createTexture(); + + infoMemory.textures ++; + + var isCube = ( renderTarget.isWebGLRenderTargetCube === true ); + var isTargetPowerOfTwo = isPowerOfTwo( renderTarget ); + + // Setup framebuffer + + if ( isCube ) { + + renderTargetProperties.__webglFramebuffer = []; + + for ( var i = 0; i < 6; i ++ ) { + + renderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer(); + + } + + } else { + + renderTargetProperties.__webglFramebuffer = _gl.createFramebuffer(); + + } + + // Setup color buffer + + if ( isCube ) { + + state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture ); + setTextureParameters( _gl.TEXTURE_CUBE_MAP, renderTarget.texture, isTargetPowerOfTwo ); + + for ( var i = 0; i < 6; i ++ ) { + + setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i ); + + } + + if ( textureNeedsGenerateMipmaps( renderTarget.texture, isTargetPowerOfTwo ) ) _gl.generateMipmap( _gl.TEXTURE_CUBE_MAP ); + state.bindTexture( _gl.TEXTURE_CUBE_MAP, null ); + + } else { + + state.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture ); + setTextureParameters( _gl.TEXTURE_2D, renderTarget.texture, isTargetPowerOfTwo ); + setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D ); + + if ( textureNeedsGenerateMipmaps( renderTarget.texture, isTargetPowerOfTwo ) ) _gl.generateMipmap( _gl.TEXTURE_2D ); + state.bindTexture( _gl.TEXTURE_2D, null ); + + } + + // Setup depth and stencil buffers + + if ( renderTarget.depthBuffer ) { + + setupDepthRenderbuffer( renderTarget ); + + } + + } + + function updateRenderTargetMipmap( renderTarget ) { + + var texture = renderTarget.texture; + var isTargetPowerOfTwo = isPowerOfTwo( renderTarget ); + + if ( textureNeedsGenerateMipmaps( texture, isTargetPowerOfTwo ) ) { + + var target = renderTarget.isWebGLRenderTargetCube ? _gl.TEXTURE_CUBE_MAP : _gl.TEXTURE_2D; + var webglTexture = properties.get( texture ).__webglTexture; + + state.bindTexture( target, webglTexture ); + _gl.generateMipmap( target ); + state.bindTexture( target, null ); + + } + + } + + this.setTexture2D = setTexture2D; + this.setTextureCube = setTextureCube; + this.setTextureCubeDynamic = setTextureCubeDynamic; + this.setupRenderTarget = setupRenderTarget; + this.updateRenderTargetMipmap = updateRenderTargetMipmap; + + } + + /** + * @author fordacious / fordacious.github.io + */ + + function WebGLProperties() { + + var properties = {}; + + function get( object ) { + + var uuid = object.uuid; + var map = properties[ uuid ]; + + if ( map === undefined ) { + + map = {}; + properties[ uuid ] = map; + + } + + return map; + + } + + function remove( object ) { + + delete properties[ object.uuid ]; + + } + + function clear() { + + properties = {}; + + } + + return { + get: get, + remove: remove, + clear: clear + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLState( gl, extensions, paramThreeToGL ) { + + function ColorBuffer() { + + var locked = false; + + var color = new Vector4(); + var currentColorMask = null; + var currentColorClear = new Vector4(); + + return { + + setMask: function ( colorMask ) { + + if ( currentColorMask !== colorMask && ! locked ) { + + gl.colorMask( colorMask, colorMask, colorMask, colorMask ); + currentColorMask = colorMask; + + } + + }, + + setLocked: function ( lock ) { + + locked = lock; + + }, + + setClear: function ( r, g, b, a, premultipliedAlpha ) { + + if ( premultipliedAlpha === true ) { + + r *= a; g *= a; b *= a; + + } + + color.set( r, g, b, a ); + + if ( currentColorClear.equals( color ) === false ) { + + gl.clearColor( r, g, b, a ); + currentColorClear.copy( color ); + + } + + }, + + reset: function () { + + locked = false; + + currentColorMask = null; + currentColorClear.set( 0, 0, 0, 1 ); + + } + + }; + + } + + function DepthBuffer() { + + var locked = false; + + var currentDepthMask = null; + var currentDepthFunc = null; + var currentDepthClear = null; + + return { + + setTest: function ( depthTest ) { + + if ( depthTest ) { + + enable( gl.DEPTH_TEST ); + + } else { + + disable( gl.DEPTH_TEST ); + + } + + }, + + setMask: function ( depthMask ) { + + if ( currentDepthMask !== depthMask && ! locked ) { + + gl.depthMask( depthMask ); + currentDepthMask = depthMask; + + } + + }, + + setFunc: function ( depthFunc ) { + + if ( currentDepthFunc !== depthFunc ) { + + if ( depthFunc ) { + + switch ( depthFunc ) { + + case NeverDepth: + + gl.depthFunc( gl.NEVER ); + break; + + case AlwaysDepth: + + gl.depthFunc( gl.ALWAYS ); + break; + + case LessDepth: + + gl.depthFunc( gl.LESS ); + break; + + case LessEqualDepth: + + gl.depthFunc( gl.LEQUAL ); + break; + + case EqualDepth: + + gl.depthFunc( gl.EQUAL ); + break; + + case GreaterEqualDepth: + + gl.depthFunc( gl.GEQUAL ); + break; + + case GreaterDepth: + + gl.depthFunc( gl.GREATER ); + break; + + case NotEqualDepth: + + gl.depthFunc( gl.NOTEQUAL ); + break; + + default: + + gl.depthFunc( gl.LEQUAL ); + + } + + } else { + + gl.depthFunc( gl.LEQUAL ); + + } + + currentDepthFunc = depthFunc; + + } + + }, + + setLocked: function ( lock ) { + + locked = lock; + + }, + + setClear: function ( depth ) { + + if ( currentDepthClear !== depth ) { + + gl.clearDepth( depth ); + currentDepthClear = depth; + + } + + }, + + reset: function () { + + locked = false; + + currentDepthMask = null; + currentDepthFunc = null; + currentDepthClear = null; + + } + + }; + + } + + function StencilBuffer() { + + var locked = false; + + var currentStencilMask = null; + var currentStencilFunc = null; + var currentStencilRef = null; + var currentStencilFuncMask = null; + var currentStencilFail = null; + var currentStencilZFail = null; + var currentStencilZPass = null; + var currentStencilClear = null; + + return { + + setTest: function ( stencilTest ) { + + if ( stencilTest ) { + + enable( gl.STENCIL_TEST ); + + } else { + + disable( gl.STENCIL_TEST ); + + } + + }, + + setMask: function ( stencilMask ) { + + if ( currentStencilMask !== stencilMask && ! locked ) { + + gl.stencilMask( stencilMask ); + currentStencilMask = stencilMask; + + } + + }, + + setFunc: function ( stencilFunc, stencilRef, stencilMask ) { + + if ( currentStencilFunc !== stencilFunc || + currentStencilRef !== stencilRef || + currentStencilFuncMask !== stencilMask ) { + + gl.stencilFunc( stencilFunc, stencilRef, stencilMask ); + + currentStencilFunc = stencilFunc; + currentStencilRef = stencilRef; + currentStencilFuncMask = stencilMask; + + } + + }, + + setOp: function ( stencilFail, stencilZFail, stencilZPass ) { + + if ( currentStencilFail !== stencilFail || + currentStencilZFail !== stencilZFail || + currentStencilZPass !== stencilZPass ) { + + gl.stencilOp( stencilFail, stencilZFail, stencilZPass ); + + currentStencilFail = stencilFail; + currentStencilZFail = stencilZFail; + currentStencilZPass = stencilZPass; + + } + + }, + + setLocked: function ( lock ) { + + locked = lock; + + }, + + setClear: function ( stencil ) { + + if ( currentStencilClear !== stencil ) { + + gl.clearStencil( stencil ); + currentStencilClear = stencil; + + } + + }, + + reset: function () { + + locked = false; + + currentStencilMask = null; + currentStencilFunc = null; + currentStencilRef = null; + currentStencilFuncMask = null; + currentStencilFail = null; + currentStencilZFail = null; + currentStencilZPass = null; + currentStencilClear = null; + + } + + }; + + } + + // + + var colorBuffer = new ColorBuffer(); + var depthBuffer = new DepthBuffer(); + var stencilBuffer = new StencilBuffer(); + + var maxVertexAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS ); + var newAttributes = new Uint8Array( maxVertexAttributes ); + var enabledAttributes = new Uint8Array( maxVertexAttributes ); + var attributeDivisors = new Uint8Array( maxVertexAttributes ); + + var capabilities = {}; + + var compressedTextureFormats = null; + + var currentBlending = null; + var currentBlendEquation = null; + var currentBlendSrc = null; + var currentBlendDst = null; + var currentBlendEquationAlpha = null; + var currentBlendSrcAlpha = null; + var currentBlendDstAlpha = null; + var currentPremultipledAlpha = false; + + var currentFlipSided = null; + var currentCullFace = null; + + var currentLineWidth = null; + + var currentPolygonOffsetFactor = null; + var currentPolygonOffsetUnits = null; + + var currentScissorTest = null; + + var maxTextures = gl.getParameter( gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS ); + + var version = parseFloat( /^WebGL\ ([0-9])/.exec( gl.getParameter( gl.VERSION ) )[ 1 ] ); + var lineWidthAvailable = parseFloat( version ) >= 1.0; + + var currentTextureSlot = null; + var currentBoundTextures = {}; + + var currentScissor = new Vector4(); + var currentViewport = new Vector4(); + + function createTexture( type, target, count ) { + + var data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4. + var texture = gl.createTexture(); + + gl.bindTexture( type, texture ); + gl.texParameteri( type, gl.TEXTURE_MIN_FILTER, gl.NEAREST ); + gl.texParameteri( type, gl.TEXTURE_MAG_FILTER, gl.NEAREST ); + + for ( var i = 0; i < count; i ++ ) { + + gl.texImage2D( target + i, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data ); + + } + + return texture; + + } + + var emptyTextures = {}; + emptyTextures[ gl.TEXTURE_2D ] = createTexture( gl.TEXTURE_2D, gl.TEXTURE_2D, 1 ); + emptyTextures[ gl.TEXTURE_CUBE_MAP ] = createTexture( gl.TEXTURE_CUBE_MAP, gl.TEXTURE_CUBE_MAP_POSITIVE_X, 6 ); + + // + + function init() { + + colorBuffer.setClear( 0, 0, 0, 1 ); + depthBuffer.setClear( 1 ); + stencilBuffer.setClear( 0 ); + + enable( gl.DEPTH_TEST ); + depthBuffer.setFunc( LessEqualDepth ); + + setFlipSided( false ); + setCullFace( CullFaceBack ); + enable( gl.CULL_FACE ); + + enable( gl.BLEND ); + setBlending( NormalBlending ); + + } + + function initAttributes() { + + for ( var i = 0, l = newAttributes.length; i < l; i ++ ) { + + newAttributes[ i ] = 0; + + } + + } + + function enableAttribute( attribute ) { + + newAttributes[ attribute ] = 1; + + if ( enabledAttributes[ attribute ] === 0 ) { + + gl.enableVertexAttribArray( attribute ); + enabledAttributes[ attribute ] = 1; + + } + + if ( attributeDivisors[ attribute ] !== 0 ) { + + var extension = extensions.get( 'ANGLE_instanced_arrays' ); + + extension.vertexAttribDivisorANGLE( attribute, 0 ); + attributeDivisors[ attribute ] = 0; + + } + + } + + function enableAttributeAndDivisor( attribute, meshPerAttribute ) { + + newAttributes[ attribute ] = 1; + + if ( enabledAttributes[ attribute ] === 0 ) { + + gl.enableVertexAttribArray( attribute ); + enabledAttributes[ attribute ] = 1; + + } + + if ( attributeDivisors[ attribute ] !== meshPerAttribute ) { + + var extension = extensions.get( 'ANGLE_instanced_arrays' ); + + extension.vertexAttribDivisorANGLE( attribute, meshPerAttribute ); + attributeDivisors[ attribute ] = meshPerAttribute; + + } + + } + + function disableUnusedAttributes() { + + for ( var i = 0, l = enabledAttributes.length; i !== l; ++ i ) { + + if ( enabledAttributes[ i ] !== newAttributes[ i ] ) { + + gl.disableVertexAttribArray( i ); + enabledAttributes[ i ] = 0; + + } + + } + + } + + function enable( id ) { + + if ( capabilities[ id ] !== true ) { + + gl.enable( id ); + capabilities[ id ] = true; + + } + + } + + function disable( id ) { + + if ( capabilities[ id ] !== false ) { + + gl.disable( id ); + capabilities[ id ] = false; + + } + + } + + function getCompressedTextureFormats() { + + if ( compressedTextureFormats === null ) { + + compressedTextureFormats = []; + + if ( extensions.get( 'WEBGL_compressed_texture_pvrtc' ) || + extensions.get( 'WEBGL_compressed_texture_s3tc' ) || + extensions.get( 'WEBGL_compressed_texture_etc1' ) ) { + + var formats = gl.getParameter( gl.COMPRESSED_TEXTURE_FORMATS ); + + for ( var i = 0; i < formats.length; i ++ ) { + + compressedTextureFormats.push( formats[ i ] ); + + } + + } + + } + + return compressedTextureFormats; + + } + + function setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, premultipliedAlpha ) { + + if ( blending !== NoBlending ) { + + enable( gl.BLEND ); + + } else { + + disable( gl.BLEND ); + + } + + if ( ( blending !== CustomBlending ) && ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) ) { + + if ( blending === AdditiveBlending ) { + + if ( premultipliedAlpha ) { + + gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD ); + gl.blendFuncSeparate( gl.ONE, gl.ONE, gl.ONE, gl.ONE ); + + } else { + + gl.blendEquation( gl.FUNC_ADD ); + gl.blendFunc( gl.SRC_ALPHA, gl.ONE ); + + } + + } else if ( blending === SubtractiveBlending ) { + + if ( premultipliedAlpha ) { + + gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD ); + gl.blendFuncSeparate( gl.ZERO, gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ONE_MINUS_SRC_ALPHA ); + + } else { + + gl.blendEquation( gl.FUNC_ADD ); + gl.blendFunc( gl.ZERO, gl.ONE_MINUS_SRC_COLOR ); + + } + + } else if ( blending === MultiplyBlending ) { + + if ( premultipliedAlpha ) { + + gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD ); + gl.blendFuncSeparate( gl.ZERO, gl.SRC_COLOR, gl.ZERO, gl.SRC_ALPHA ); + + } else { + + gl.blendEquation( gl.FUNC_ADD ); + gl.blendFunc( gl.ZERO, gl.SRC_COLOR ); + + } + + } else { + + if ( premultipliedAlpha ) { + + gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD ); + gl.blendFuncSeparate( gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA ); + + } else { + + gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD ); + gl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA ); + + } + + } + + currentBlending = blending; + currentPremultipledAlpha = premultipliedAlpha; + + } + + if ( blending === CustomBlending ) { + + blendEquationAlpha = blendEquationAlpha || blendEquation; + blendSrcAlpha = blendSrcAlpha || blendSrc; + blendDstAlpha = blendDstAlpha || blendDst; + + if ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) { + + gl.blendEquationSeparate( paramThreeToGL( blendEquation ), paramThreeToGL( blendEquationAlpha ) ); + + currentBlendEquation = blendEquation; + currentBlendEquationAlpha = blendEquationAlpha; + + } + + if ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) { + + gl.blendFuncSeparate( paramThreeToGL( blendSrc ), paramThreeToGL( blendDst ), paramThreeToGL( blendSrcAlpha ), paramThreeToGL( blendDstAlpha ) ); + + currentBlendSrc = blendSrc; + currentBlendDst = blendDst; + currentBlendSrcAlpha = blendSrcAlpha; + currentBlendDstAlpha = blendDstAlpha; + + } + + } else { + + currentBlendEquation = null; + currentBlendSrc = null; + currentBlendDst = null; + currentBlendEquationAlpha = null; + currentBlendSrcAlpha = null; + currentBlendDstAlpha = null; + + } + + } + + function setMaterial( material ) { + + material.side === DoubleSide + ? disable( gl.CULL_FACE ) + : enable( gl.CULL_FACE ); + + setFlipSided( material.side === BackSide ); + + material.transparent === true + ? setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha ) + : setBlending( NoBlending ); + + depthBuffer.setFunc( material.depthFunc ); + depthBuffer.setTest( material.depthTest ); + depthBuffer.setMask( material.depthWrite ); + colorBuffer.setMask( material.colorWrite ); + + setPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits ); + + } + + // + + function setFlipSided( flipSided ) { + + if ( currentFlipSided !== flipSided ) { + + if ( flipSided ) { + + gl.frontFace( gl.CW ); + + } else { + + gl.frontFace( gl.CCW ); + + } + + currentFlipSided = flipSided; + + } + + } + + function setCullFace( cullFace ) { + + if ( cullFace !== CullFaceNone ) { + + enable( gl.CULL_FACE ); + + if ( cullFace !== currentCullFace ) { + + if ( cullFace === CullFaceBack ) { + + gl.cullFace( gl.BACK ); + + } else if ( cullFace === CullFaceFront ) { + + gl.cullFace( gl.FRONT ); + + } else { + + gl.cullFace( gl.FRONT_AND_BACK ); + + } + + } + + } else { + + disable( gl.CULL_FACE ); + + } + + currentCullFace = cullFace; + + } + + function setLineWidth( width ) { + + if ( width !== currentLineWidth ) { + + if ( lineWidthAvailable ) gl.lineWidth( width ); + + currentLineWidth = width; + + } + + } + + function setPolygonOffset( polygonOffset, factor, units ) { + + if ( polygonOffset ) { + + enable( gl.POLYGON_OFFSET_FILL ); + + if ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) { + + gl.polygonOffset( factor, units ); + + currentPolygonOffsetFactor = factor; + currentPolygonOffsetUnits = units; + + } + + } else { + + disable( gl.POLYGON_OFFSET_FILL ); + + } + + } + + function getScissorTest() { + + return currentScissorTest; + + } + + function setScissorTest( scissorTest ) { + + currentScissorTest = scissorTest; + + if ( scissorTest ) { + + enable( gl.SCISSOR_TEST ); + + } else { + + disable( gl.SCISSOR_TEST ); + + } + + } + + // texture + + function activeTexture( webglSlot ) { + + if ( webglSlot === undefined ) webglSlot = gl.TEXTURE0 + maxTextures - 1; + + if ( currentTextureSlot !== webglSlot ) { + + gl.activeTexture( webglSlot ); + currentTextureSlot = webglSlot; + + } + + } + + function bindTexture( webglType, webglTexture ) { + + if ( currentTextureSlot === null ) { + + activeTexture(); + + } + + var boundTexture = currentBoundTextures[ currentTextureSlot ]; + + if ( boundTexture === undefined ) { + + boundTexture = { type: undefined, texture: undefined }; + currentBoundTextures[ currentTextureSlot ] = boundTexture; + + } + + if ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) { + + gl.bindTexture( webglType, webglTexture || emptyTextures[ webglType ] ); + + boundTexture.type = webglType; + boundTexture.texture = webglTexture; + + } + + } + + function compressedTexImage2D() { + + try { + + gl.compressedTexImage2D.apply( gl, arguments ); + + } catch ( error ) { + + console.error( 'THREE.WebGLState:', error ); + + } + + } + + function texImage2D() { + + try { + + gl.texImage2D.apply( gl, arguments ); + + } catch ( error ) { + + console.error( 'THREE.WebGLState:', error ); + + } + + } + + // + + function scissor( scissor ) { + + if ( currentScissor.equals( scissor ) === false ) { + + gl.scissor( scissor.x, scissor.y, scissor.z, scissor.w ); + currentScissor.copy( scissor ); + + } + + } + + function viewport( viewport ) { + + if ( currentViewport.equals( viewport ) === false ) { + + gl.viewport( viewport.x, viewport.y, viewport.z, viewport.w ); + currentViewport.copy( viewport ); + + } + + } + + // + + function reset() { + + for ( var i = 0; i < enabledAttributes.length; i ++ ) { + + if ( enabledAttributes[ i ] === 1 ) { + + gl.disableVertexAttribArray( i ); + enabledAttributes[ i ] = 0; + + } + + } + + capabilities = {}; + + compressedTextureFormats = null; + + currentTextureSlot = null; + currentBoundTextures = {}; + + currentBlending = null; + + currentFlipSided = null; + currentCullFace = null; + + colorBuffer.reset(); + depthBuffer.reset(); + stencilBuffer.reset(); + + } + + return { + + buffers: { + color: colorBuffer, + depth: depthBuffer, + stencil: stencilBuffer + }, + + init: init, + initAttributes: initAttributes, + enableAttribute: enableAttribute, + enableAttributeAndDivisor: enableAttributeAndDivisor, + disableUnusedAttributes: disableUnusedAttributes, + enable: enable, + disable: disable, + getCompressedTextureFormats: getCompressedTextureFormats, + + setBlending: setBlending, + setMaterial: setMaterial, + + setFlipSided: setFlipSided, + setCullFace: setCullFace, + + setLineWidth: setLineWidth, + setPolygonOffset: setPolygonOffset, + + getScissorTest: getScissorTest, + setScissorTest: setScissorTest, + + activeTexture: activeTexture, + bindTexture: bindTexture, + compressedTexImage2D: compressedTexImage2D, + texImage2D: texImage2D, + + scissor: scissor, + viewport: viewport, + + reset: reset + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLCapabilities( gl, extensions, parameters ) { + + var maxAnisotropy; + + function getMaxAnisotropy() { + + if ( maxAnisotropy !== undefined ) return maxAnisotropy; + + var extension = extensions.get( 'EXT_texture_filter_anisotropic' ); + + if ( extension !== null ) { + + maxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT ); + + } else { + + maxAnisotropy = 0; + + } + + return maxAnisotropy; + + } + + function getMaxPrecision( precision ) { + + if ( precision === 'highp' ) { + + if ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.HIGH_FLOAT ).precision > 0 && + gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.HIGH_FLOAT ).precision > 0 ) { + + return 'highp'; + + } + + precision = 'mediump'; + + } + + if ( precision === 'mediump' ) { + + if ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.MEDIUM_FLOAT ).precision > 0 && + gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT ).precision > 0 ) { + + return 'mediump'; + + } + + } + + return 'lowp'; + + } + + var precision = parameters.precision !== undefined ? parameters.precision : 'highp'; + var maxPrecision = getMaxPrecision( precision ); + + if ( maxPrecision !== precision ) { + + console.warn( 'THREE.WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' ); + precision = maxPrecision; + + } + + var logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true && !! extensions.get( 'EXT_frag_depth' ); + + var maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS ); + var maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS ); + var maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE ); + var maxCubemapSize = gl.getParameter( gl.MAX_CUBE_MAP_TEXTURE_SIZE ); + + var maxAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS ); + var maxVertexUniforms = gl.getParameter( gl.MAX_VERTEX_UNIFORM_VECTORS ); + var maxVaryings = gl.getParameter( gl.MAX_VARYING_VECTORS ); + var maxFragmentUniforms = gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS ); + + var vertexTextures = maxVertexTextures > 0; + var floatFragmentTextures = !! extensions.get( 'OES_texture_float' ); + var floatVertexTextures = vertexTextures && floatFragmentTextures; + + return { + + getMaxAnisotropy: getMaxAnisotropy, + getMaxPrecision: getMaxPrecision, + + precision: precision, + logarithmicDepthBuffer: logarithmicDepthBuffer, + + maxTextures: maxTextures, + maxVertexTextures: maxVertexTextures, + maxTextureSize: maxTextureSize, + maxCubemapSize: maxCubemapSize, + + maxAttributes: maxAttributes, + maxVertexUniforms: maxVertexUniforms, + maxVaryings: maxVaryings, + maxFragmentUniforms: maxFragmentUniforms, + + vertexTextures: vertexTextures, + floatFragmentTextures: floatFragmentTextures, + floatVertexTextures: floatVertexTextures + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function ArrayCamera( array ) { + + PerspectiveCamera.call( this ); + + this.cameras = array || []; + + } + + ArrayCamera.prototype = Object.assign( Object.create( PerspectiveCamera.prototype ), { + + constructor: ArrayCamera, + + isArrayCamera: true + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebVRManager( renderer ) { + + var scope = this; + + var device = null; + var frameData = null; + + if ( 'VRFrameData' in window ) { + + frameData = new window.VRFrameData(); + + } + + var matrixWorldInverse = new Matrix4(); + + var standingMatrix = new Matrix4(); + var standingMatrixInverse = new Matrix4(); + + var cameraL = new PerspectiveCamera(); + cameraL.bounds = new Vector4( 0.0, 0.0, 0.5, 1.0 ); + cameraL.layers.enable( 1 ); + + var cameraR = new PerspectiveCamera(); + cameraR.bounds = new Vector4( 0.5, 0.0, 0.5, 1.0 ); + cameraR.layers.enable( 2 ); + + var cameraVR = new ArrayCamera( [ cameraL, cameraR ] ); + cameraVR.layers.enable( 1 ); + cameraVR.layers.enable( 2 ); + + // + + var currentSize, currentPixelRatio; + + function onVRDisplayPresentChange() { + + if ( device.isPresenting ) { + + var eyeParameters = device.getEyeParameters( 'left' ); + var renderWidth = eyeParameters.renderWidth; + var renderHeight = eyeParameters.renderHeight; + + currentPixelRatio = renderer.getPixelRatio(); + currentSize = renderer.getSize(); + + renderer.setDrawingBufferSize( renderWidth * 2, renderHeight, 1 ); + + } else if ( scope.enabled ) { + + renderer.setDrawingBufferSize( currentSize.width, currentSize.height, currentPixelRatio ); + + } + + } + + window.addEventListener( 'vrdisplaypresentchange', onVRDisplayPresentChange, false ); + + // + + this.enabled = false; + this.standing = false; + + this.getDevice = function () { + + return device; + + }; + + this.setDevice = function ( value ) { + + if ( value !== undefined ) device = value; + + }; + + this.getCamera = function ( camera ) { + + if ( device === null ) return camera; + + device.depthNear = camera.near; + device.depthFar = camera.far; + + device.getFrameData( frameData ); + + // + + var pose = frameData.pose; + + if ( pose.position !== null ) { + + camera.position.fromArray( pose.position ); + + } else { + + camera.position.set( 0, 0, 0 ); + + } + + if ( pose.orientation !== null ) { + + camera.quaternion.fromArray( pose.orientation ); + + } + + camera.updateMatrixWorld(); + + var stageParameters = device.stageParameters; + + if ( this.standing && stageParameters ) { + + standingMatrix.fromArray( stageParameters.sittingToStandingTransform ); + standingMatrixInverse.getInverse( standingMatrix ); + + camera.matrixWorld.multiply( standingMatrix ); + camera.matrixWorldInverse.multiply( standingMatrixInverse ); + + } + + if ( device.isPresenting === false ) return camera; + + // + + cameraVR.matrixWorld.copy( camera.matrixWorld ); + cameraVR.matrixWorldInverse.copy( camera.matrixWorldInverse ); + + cameraL.matrixWorldInverse.fromArray( frameData.leftViewMatrix ); + cameraR.matrixWorldInverse.fromArray( frameData.rightViewMatrix ); + + if ( this.standing && stageParameters ) { + + cameraL.matrixWorldInverse.multiply( standingMatrixInverse ); + cameraR.matrixWorldInverse.multiply( standingMatrixInverse ); + + } + + var parent = camera.parent; + + if ( parent !== null ) { + + matrixWorldInverse.getInverse( parent.matrixWorld ); + + cameraL.matrixWorldInverse.multiply( matrixWorldInverse ); + cameraR.matrixWorldInverse.multiply( matrixWorldInverse ); + + } + + // envMap and Mirror needs camera.matrixWorld + + cameraL.matrixWorld.getInverse( cameraL.matrixWorldInverse ); + cameraR.matrixWorld.getInverse( cameraR.matrixWorldInverse ); + + cameraL.projectionMatrix.fromArray( frameData.leftProjectionMatrix ); + cameraR.projectionMatrix.fromArray( frameData.rightProjectionMatrix ); + + // HACK @mrdoob + // https://github.com/w3c/webvr/issues/203 + + cameraVR.projectionMatrix.copy( cameraL.projectionMatrix ); + + // + + var layers = device.getLayers(); + + if ( layers.length ) { + + var layer = layers[ 0 ]; + + if ( layer.leftBounds !== null && layer.leftBounds.length === 4 ) { + + cameraL.bounds.fromArray( layer.leftBounds ); + + } + + if ( layer.rightBounds !== null && layer.rightBounds.length === 4 ) { + + cameraR.bounds.fromArray( layer.rightBounds ); + + } + + } + + return cameraVR; + + }; + + this.getStandingMatrix = function () { + + return standingMatrix; + + }; + + this.submitFrame = function () { + + if ( device && device.isPresenting ) device.submitFrame(); + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLExtensions( gl ) { + + var extensions = {}; + + return { + + get: function ( name ) { + + if ( extensions[ name ] !== undefined ) { + + return extensions[ name ]; + + } + + var extension; + + switch ( name ) { + + case 'WEBGL_depth_texture': + extension = gl.getExtension( 'WEBGL_depth_texture' ) || gl.getExtension( 'MOZ_WEBGL_depth_texture' ) || gl.getExtension( 'WEBKIT_WEBGL_depth_texture' ); + break; + + case 'EXT_texture_filter_anisotropic': + extension = gl.getExtension( 'EXT_texture_filter_anisotropic' ) || gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) || gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' ); + break; + + case 'WEBGL_compressed_texture_s3tc': + extension = gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' ); + break; + + case 'WEBGL_compressed_texture_pvrtc': + extension = gl.getExtension( 'WEBGL_compressed_texture_pvrtc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_pvrtc' ); + break; + + case 'WEBGL_compressed_texture_etc1': + extension = gl.getExtension( 'WEBGL_compressed_texture_etc1' ); + break; + + default: + extension = gl.getExtension( name ); + + } + + if ( extension === null ) { + + console.warn( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' ); + + } + + extensions[ name ] = extension; + + return extension; + + } + + }; + + } + + /** + * @author tschw + */ + + function WebGLClipping() { + + var scope = this, + + globalState = null, + numGlobalPlanes = 0, + localClippingEnabled = false, + renderingShadows = false, + + plane = new Plane(), + viewNormalMatrix = new Matrix3(), + + uniform = { value: null, needsUpdate: false }; + + this.uniform = uniform; + this.numPlanes = 0; + this.numIntersection = 0; + + this.init = function( planes, enableLocalClipping, camera ) { + + var enabled = + planes.length !== 0 || + enableLocalClipping || + // enable state of previous frame - the clipping code has to + // run another frame in order to reset the state: + numGlobalPlanes !== 0 || + localClippingEnabled; + + localClippingEnabled = enableLocalClipping; + + globalState = projectPlanes( planes, camera, 0 ); + numGlobalPlanes = planes.length; + + return enabled; + + }; + + this.beginShadows = function() { + + renderingShadows = true; + projectPlanes( null ); + + }; + + this.endShadows = function() { + + renderingShadows = false; + resetGlobalState(); + + }; + + this.setState = function( planes, clipIntersection, clipShadows, camera, cache, fromCache ) { + + if ( ! localClippingEnabled || + planes === null || planes.length === 0 || + renderingShadows && ! clipShadows ) { + // there's no local clipping + + if ( renderingShadows ) { + // there's no global clipping + + projectPlanes( null ); + + } else { + + resetGlobalState(); + } + + } else { + + var nGlobal = renderingShadows ? 0 : numGlobalPlanes, + lGlobal = nGlobal * 4, + + dstArray = cache.clippingState || null; + + uniform.value = dstArray; // ensure unique state + + dstArray = projectPlanes( planes, camera, lGlobal, fromCache ); + + for ( var i = 0; i !== lGlobal; ++ i ) { + + dstArray[ i ] = globalState[ i ]; + + } + + cache.clippingState = dstArray; + this.numIntersection = clipIntersection ? this.numPlanes : 0; + this.numPlanes += nGlobal; + + } + + + }; + + function resetGlobalState() { + + if ( uniform.value !== globalState ) { + + uniform.value = globalState; + uniform.needsUpdate = numGlobalPlanes > 0; + + } + + scope.numPlanes = numGlobalPlanes; + scope.numIntersection = 0; + + } + + function projectPlanes( planes, camera, dstOffset, skipTransform ) { + + var nPlanes = planes !== null ? planes.length : 0, + dstArray = null; + + if ( nPlanes !== 0 ) { + + dstArray = uniform.value; + + if ( skipTransform !== true || dstArray === null ) { + + var flatSize = dstOffset + nPlanes * 4, + viewMatrix = camera.matrixWorldInverse; + + viewNormalMatrix.getNormalMatrix( viewMatrix ); + + if ( dstArray === null || dstArray.length < flatSize ) { + + dstArray = new Float32Array( flatSize ); + + } + + for ( var i = 0, i4 = dstOffset; + i !== nPlanes; ++ i, i4 += 4 ) { + + plane.copy( planes[ i ] ). + applyMatrix4( viewMatrix, viewNormalMatrix ); + + plane.normal.toArray( dstArray, i4 ); + dstArray[ i4 + 3 ] = plane.constant; + + } + + } + + uniform.value = dstArray; + uniform.needsUpdate = true; + + } + + scope.numPlanes = nPlanes; + + return dstArray; + + } + + } + + // import { Sphere } from '../math/Sphere'; + /** + * @author supereggbert / http://www.paulbrunt.co.uk/ + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author szimek / https://github.com/szimek/ + * @author tschw + */ + + function WebGLRenderer( parameters ) { + + console.log( 'THREE.WebGLRenderer', REVISION ); + + parameters = parameters || {}; + + var _canvas = parameters.canvas !== undefined ? parameters.canvas : document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ), + _context = parameters.context !== undefined ? parameters.context : null, + + _alpha = parameters.alpha !== undefined ? parameters.alpha : false, + _depth = parameters.depth !== undefined ? parameters.depth : true, + _stencil = parameters.stencil !== undefined ? parameters.stencil : true, + _antialias = parameters.antialias !== undefined ? parameters.antialias : false, + _premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true, + _preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false; + + var lights = []; + + var currentRenderList = null; + + var morphInfluences = new Float32Array( 8 ); + + var sprites = []; + var lensFlares = []; + + // public properties + + this.domElement = _canvas; + this.context = null; + + // clearing + + this.autoClear = true; + this.autoClearColor = true; + this.autoClearDepth = true; + this.autoClearStencil = true; + + // scene graph + + this.sortObjects = true; + + // user-defined clipping + + this.clippingPlanes = []; + this.localClippingEnabled = false; + + // physically based shading + + this.gammaFactor = 2.0; // for backwards compatibility + this.gammaInput = false; + this.gammaOutput = false; + + // physical lights + + this.physicallyCorrectLights = false; + + // tone mapping + + this.toneMapping = LinearToneMapping; + this.toneMappingExposure = 1.0; + this.toneMappingWhitePoint = 1.0; + + // morphs + + this.maxMorphTargets = 8; + this.maxMorphNormals = 4; + + // internal properties + + var _this = this, + + // internal state cache + + _currentProgram = null, + _currentRenderTarget = null, + _currentFramebuffer = null, + _currentMaterialId = - 1, + _currentGeometryProgram = '', + + _currentCamera = null, + _currentArrayCamera = null, + + _currentScissor = new Vector4(), + _currentScissorTest = null, + + _currentViewport = new Vector4(), + + // + + _usedTextureUnits = 0, + + // + + _width = _canvas.width, + _height = _canvas.height, + + _pixelRatio = 1, + + _scissor = new Vector4( 0, 0, _width, _height ), + _scissorTest = false, + + _viewport = new Vector4( 0, 0, _width, _height ), + + // frustum + + _frustum = new Frustum(), + + // clipping + + _clipping = new WebGLClipping(), + _clippingEnabled = false, + _localClippingEnabled = false, + + // camera matrices cache + + _projScreenMatrix = new Matrix4(), + + _vector3 = new Vector3(), + _matrix4 = new Matrix4(), + _matrix42 = new Matrix4(), + + // light arrays cache + + _lights = { + + hash: '', + + ambient: [ 0, 0, 0 ], + directional: [], + directionalShadowMap: [], + directionalShadowMatrix: [], + spot: [], + spotShadowMap: [], + spotShadowMatrix: [], + rectArea: [], + point: [], + pointShadowMap: [], + pointShadowMatrix: [], + hemi: [], + + shadows: [] + + }, + + // info + + _infoMemory = { + geometries: 0, + textures: 0 + }, + + _infoRender = { + + frame: 0, + calls: 0, + vertices: 0, + faces: 0, + points: 0 + + }; + + this.info = { + + render: _infoRender, + memory: _infoMemory, + programs: null + + }; + + + // initialize + + var _gl; + + try { + + var contextAttributes = { + alpha: _alpha, + depth: _depth, + stencil: _stencil, + antialias: _antialias, + premultipliedAlpha: _premultipliedAlpha, + preserveDrawingBuffer: _preserveDrawingBuffer + }; + + _gl = _context || _canvas.getContext( 'webgl', contextAttributes ) || _canvas.getContext( 'experimental-webgl', contextAttributes ); + + if ( _gl === null ) { + + if ( _canvas.getContext( 'webgl' ) !== null ) { + + throw 'Error creating WebGL context with your selected attributes.'; + + } else { + + throw 'Error creating WebGL context.'; + + } + + } + + // Some experimental-webgl implementations do not have getShaderPrecisionFormat + + if ( _gl.getShaderPrecisionFormat === undefined ) { + + _gl.getShaderPrecisionFormat = function () { + + return { 'rangeMin': 1, 'rangeMax': 1, 'precision': 1 }; + + }; + + } + + _canvas.addEventListener( 'webglcontextlost', onContextLost, false ); + + } catch ( error ) { + + console.error( 'THREE.WebGLRenderer: ' + error ); + + } + + var extensions = new WebGLExtensions( _gl ); + + extensions.get( 'WEBGL_depth_texture' ); + extensions.get( 'OES_texture_float' ); + extensions.get( 'OES_texture_float_linear' ); + extensions.get( 'OES_texture_half_float' ); + extensions.get( 'OES_texture_half_float_linear' ); + extensions.get( 'OES_standard_derivatives' ); + extensions.get( 'ANGLE_instanced_arrays' ); + + if ( extensions.get( 'OES_element_index_uint' ) ) { + + BufferGeometry.MaxIndex = 4294967296; + + } + + var capabilities = new WebGLCapabilities( _gl, extensions, parameters ); + + var state = new WebGLState( _gl, extensions, paramThreeToGL ); + + var properties = new WebGLProperties(); + var textures = new WebGLTextures( _gl, extensions, state, properties, capabilities, paramThreeToGL, _infoMemory ); + var attributes = new WebGLAttributes( _gl ); + var geometries = new WebGLGeometries( _gl, attributes, _infoMemory ); + var objects = new WebGLObjects( _gl, geometries, _infoRender ); + var programCache = new WebGLPrograms( this, capabilities ); + var lightCache = new WebGLLights(); + var renderLists = new WebGLRenderLists(); + + var background = new WebGLBackground( this, state, objects, _premultipliedAlpha ); + var vr = new WebVRManager( this ); + + this.info.programs = programCache.programs; + + var bufferRenderer = new WebGLBufferRenderer( _gl, extensions, _infoRender ); + var indexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, _infoRender ); + + // + + function getTargetPixelRatio() { + + return _currentRenderTarget === null ? _pixelRatio : 1; + + } + + function setDefaultGLState() { + + state.init(); + + state.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ) ); + state.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ) ); + + } + + function resetGLState() { + + _currentProgram = null; + _currentCamera = null; + + _currentGeometryProgram = ''; + _currentMaterialId = - 1; + + state.reset(); + + } + + setDefaultGLState(); + + this.context = _gl; + this.capabilities = capabilities; + this.extensions = extensions; + this.properties = properties; + this.renderLists = renderLists; + this.state = state; + this.vr = vr; + + // shadow map + + var shadowMap = new WebGLShadowMap( this, _lights, objects, capabilities ); + + this.shadowMap = shadowMap; + + + // Plugins + + var spritePlugin = new SpritePlugin( this, sprites ); + var lensFlarePlugin = new LensFlarePlugin( this, lensFlares ); + + // API + + this.getContext = function () { + + return _gl; + + }; + + this.getContextAttributes = function () { + + return _gl.getContextAttributes(); + + }; + + this.forceContextLoss = function () { + + var extension = extensions.get( 'WEBGL_lose_context' ); + if ( extension ) extension.loseContext(); + + }; + + this.getMaxAnisotropy = function () { + + return capabilities.getMaxAnisotropy(); + + }; + + this.getPrecision = function () { + + return capabilities.precision; + + }; + + this.getPixelRatio = function () { + + return _pixelRatio; + + }; + + this.setPixelRatio = function ( value ) { + + if ( value === undefined ) return; + + _pixelRatio = value; + + this.setSize( _width, _height, false ); + + }; + + this.getSize = function () { + + return { + width: _width, + height: _height + }; + + }; + + this.setSize = function ( width, height, updateStyle ) { + + var device = vr.getDevice(); + + if ( device && device.isPresenting ) { + + console.warn( 'THREE.WebGLRenderer: Can\'t change size while VR device is presenting.' ); + return; + + } + + _width = width; + _height = height; + + _canvas.width = width * _pixelRatio; + _canvas.height = height * _pixelRatio; + + if ( updateStyle !== false ) { + + _canvas.style.width = width + 'px'; + _canvas.style.height = height + 'px'; + + } + + this.setViewport( 0, 0, width, height ); + + }; + + this.getDrawingBufferSize = function () { + + return { + width: _width * _pixelRatio, + height: _height * _pixelRatio + }; + + }; + + this.setDrawingBufferSize = function ( width, height, pixelRatio ) { + + _width = width; + _height = height; + + _pixelRatio = pixelRatio; + + _canvas.width = width * pixelRatio; + _canvas.height = height * pixelRatio; + + this.setViewport( 0, 0, width, height ); + + }; + + this.setViewport = function ( x, y, width, height ) { + + _viewport.set( x, _height - y - height, width, height ); + state.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ) ); + + }; + + this.setScissor = function ( x, y, width, height ) { + + _scissor.set( x, _height - y - height, width, height ); + state.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ) ); + + }; + + this.setScissorTest = function ( boolean ) { + + state.setScissorTest( _scissorTest = boolean ); + + }; + + // Clearing + + this.getClearColor = background.getClearColor; + this.setClearColor = background.setClearColor; + this.getClearAlpha = background.getClearAlpha; + this.setClearAlpha = background.setClearAlpha; + + this.clear = function ( color, depth, stencil ) { + + var bits = 0; + + if ( color === undefined || color ) bits |= _gl.COLOR_BUFFER_BIT; + if ( depth === undefined || depth ) bits |= _gl.DEPTH_BUFFER_BIT; + if ( stencil === undefined || stencil ) bits |= _gl.STENCIL_BUFFER_BIT; + + _gl.clear( bits ); + + }; + + this.clearColor = function () { + + this.clear( true, false, false ); + + }; + + this.clearDepth = function () { + + this.clear( false, true, false ); + + }; + + this.clearStencil = function () { + + this.clear( false, false, true ); + + }; + + this.clearTarget = function ( renderTarget, color, depth, stencil ) { + + this.setRenderTarget( renderTarget ); + this.clear( color, depth, stencil ); + + }; + + // Reset + + this.resetGLState = resetGLState; + + this.dispose = function () { + + _canvas.removeEventListener( 'webglcontextlost', onContextLost, false ); + + renderLists.dispose(); + + }; + + // Events + + function onContextLost( event ) { + + event.preventDefault(); + + resetGLState(); + setDefaultGLState(); + + properties.clear(); + objects.clear(); + + } + + function onMaterialDispose( event ) { + + var material = event.target; + + material.removeEventListener( 'dispose', onMaterialDispose ); + + deallocateMaterial( material ); + + } + + // Buffer deallocation + + function deallocateMaterial( material ) { + + releaseMaterialProgramReference( material ); + + properties.remove( material ); + + } + + + function releaseMaterialProgramReference( material ) { + + var programInfo = properties.get( material ).program; + + material.program = undefined; + + if ( programInfo !== undefined ) { + + programCache.releaseProgram( programInfo ); + + } + + } + + // Buffer rendering + + function renderObjectImmediate( object, program, material ) { + + object.render( function ( object ) { + + _this.renderBufferImmediate( object, program, material ); + + } ); + + } + + this.renderBufferImmediate = function ( object, program, material ) { + + state.initAttributes(); + + var buffers = properties.get( object ); + + if ( object.hasPositions && ! buffers.position ) buffers.position = _gl.createBuffer(); + if ( object.hasNormals && ! buffers.normal ) buffers.normal = _gl.createBuffer(); + if ( object.hasUvs && ! buffers.uv ) buffers.uv = _gl.createBuffer(); + if ( object.hasColors && ! buffers.color ) buffers.color = _gl.createBuffer(); + + var programAttributes = program.getAttributes(); + + if ( object.hasPositions ) { + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.position ); + _gl.bufferData( _gl.ARRAY_BUFFER, object.positionArray, _gl.DYNAMIC_DRAW ); + + state.enableAttribute( programAttributes.position ); + _gl.vertexAttribPointer( programAttributes.position, 3, _gl.FLOAT, false, 0, 0 ); + + } + + if ( object.hasNormals ) { + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.normal ); + + if ( ! material.isMeshPhongMaterial && + ! material.isMeshStandardMaterial && + ! material.isMeshNormalMaterial && + material.shading === FlatShading ) { + + for ( var i = 0, l = object.count * 3; i < l; i += 9 ) { + + var array = object.normalArray; + + var nx = ( array[ i + 0 ] + array[ i + 3 ] + array[ i + 6 ] ) / 3; + var ny = ( array[ i + 1 ] + array[ i + 4 ] + array[ i + 7 ] ) / 3; + var nz = ( array[ i + 2 ] + array[ i + 5 ] + array[ i + 8 ] ) / 3; + + array[ i + 0 ] = nx; + array[ i + 1 ] = ny; + array[ i + 2 ] = nz; + + array[ i + 3 ] = nx; + array[ i + 4 ] = ny; + array[ i + 5 ] = nz; + + array[ i + 6 ] = nx; + array[ i + 7 ] = ny; + array[ i + 8 ] = nz; + + } + + } + + _gl.bufferData( _gl.ARRAY_BUFFER, object.normalArray, _gl.DYNAMIC_DRAW ); + + state.enableAttribute( programAttributes.normal ); + + _gl.vertexAttribPointer( programAttributes.normal, 3, _gl.FLOAT, false, 0, 0 ); + + } + + if ( object.hasUvs && material.map ) { + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.uv ); + _gl.bufferData( _gl.ARRAY_BUFFER, object.uvArray, _gl.DYNAMIC_DRAW ); + + state.enableAttribute( programAttributes.uv ); + + _gl.vertexAttribPointer( attributes.uv, 2, _gl.FLOAT, false, 0, 0 ); + + } + + if ( object.hasColors && material.vertexColors !== NoColors ) { + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.color ); + _gl.bufferData( _gl.ARRAY_BUFFER, object.colorArray, _gl.DYNAMIC_DRAW ); + + state.enableAttribute( programAttributes.color ); + + _gl.vertexAttribPointer( programAttributes.color, 3, _gl.FLOAT, false, 0, 0 ); + + } + + state.disableUnusedAttributes(); + + _gl.drawArrays( _gl.TRIANGLES, 0, object.count ); + + object.count = 0; + + }; + + function absNumericalSort( a, b ) { + + return Math.abs( b[ 0 ] ) - Math.abs( a[ 0 ] ); + + } + + this.renderBufferDirect = function ( camera, fog, geometry, material, object, group ) { + + state.setMaterial( material ); + + var program = setProgram( camera, fog, material, object ); + var geometryProgram = geometry.id + '_' + program.id + '_' + ( material.wireframe === true ); + + var updateBuffers = false; + + if ( geometryProgram !== _currentGeometryProgram ) { + + _currentGeometryProgram = geometryProgram; + updateBuffers = true; + + } + + // morph targets + + var morphTargetInfluences = object.morphTargetInfluences; + + if ( morphTargetInfluences !== undefined ) { + + // TODO Remove allocations + + var activeInfluences = []; + + for ( var i = 0, l = morphTargetInfluences.length; i < l; i ++ ) { + + var influence = morphTargetInfluences[ i ]; + activeInfluences.push( [ influence, i ] ); + + } + + activeInfluences.sort( absNumericalSort ); + + if ( activeInfluences.length > 8 ) { + + activeInfluences.length = 8; + + } + + var morphAttributes = geometry.morphAttributes; + + for ( var i = 0, l = activeInfluences.length; i < l; i ++ ) { + + var influence = activeInfluences[ i ]; + morphInfluences[ i ] = influence[ 0 ]; + + if ( influence[ 0 ] !== 0 ) { + + var index = influence[ 1 ]; + + if ( material.morphTargets === true && morphAttributes.position ) geometry.addAttribute( 'morphTarget' + i, morphAttributes.position[ index ] ); + if ( material.morphNormals === true && morphAttributes.normal ) geometry.addAttribute( 'morphNormal' + i, morphAttributes.normal[ index ] ); + + } else { + + if ( material.morphTargets === true ) geometry.removeAttribute( 'morphTarget' + i ); + if ( material.morphNormals === true ) geometry.removeAttribute( 'morphNormal' + i ); + + } + + } + + for ( var i = activeInfluences.length, il = morphInfluences.length; i < il; i ++ ) { + + morphInfluences[ i ] = 0.0; + + } + + program.getUniforms().setValue( _gl, 'morphTargetInfluences', morphInfluences ); + + updateBuffers = true; + + } + + // + + var index = geometry.index; + var position = geometry.attributes.position; + var rangeFactor = 1; + + if ( material.wireframe === true ) { + + index = geometries.getWireframeAttribute( geometry ); + rangeFactor = 2; + + } + + var attribute; + var renderer = bufferRenderer; + + if ( index !== null ) { + + attribute = attributes.get( index ); + + renderer = indexedBufferRenderer; + renderer.setIndex( attribute ); + + } + + if ( updateBuffers ) { + + setupVertexAttributes( material, program, geometry ); + + if ( index !== null ) { + + _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, attribute.buffer ); + + } + + } + + // + + var dataCount = 0; + + if ( index !== null ) { + + dataCount = index.count; + + } else if ( position !== undefined ) { + + dataCount = position.count; + + } + + var rangeStart = geometry.drawRange.start * rangeFactor; + var rangeCount = geometry.drawRange.count * rangeFactor; + + var groupStart = group !== null ? group.start * rangeFactor : 0; + var groupCount = group !== null ? group.count * rangeFactor : Infinity; + + var drawStart = Math.max( rangeStart, groupStart ); + var drawEnd = Math.min( dataCount, rangeStart + rangeCount, groupStart + groupCount ) - 1; + + var drawCount = Math.max( 0, drawEnd - drawStart + 1 ); + + if ( drawCount === 0 ) return; + + // + + if ( object.isMesh ) { + + if ( material.wireframe === true ) { + + state.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() ); + renderer.setMode( _gl.LINES ); + + } else { + + switch ( object.drawMode ) { + + case TrianglesDrawMode: + renderer.setMode( _gl.TRIANGLES ); + break; + + case TriangleStripDrawMode: + renderer.setMode( _gl.TRIANGLE_STRIP ); + break; + + case TriangleFanDrawMode: + renderer.setMode( _gl.TRIANGLE_FAN ); + break; + + } + + } + + + } else if ( object.isLine ) { + + var lineWidth = material.linewidth; + + if ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material + + state.setLineWidth( lineWidth * getTargetPixelRatio() ); + + if ( object.isLineSegments ) { + + renderer.setMode( _gl.LINES ); + + } else if ( object.isLineLoop ) { + + renderer.setMode( _gl.LINE_LOOP ); + + } else { + + renderer.setMode( _gl.LINE_STRIP ); + + } + + } else if ( object.isPoints ) { + + renderer.setMode( _gl.POINTS ); + + } + + if ( geometry && geometry.isInstancedBufferGeometry ) { + + if ( geometry.maxInstancedCount > 0 ) { + + renderer.renderInstances( geometry, drawStart, drawCount ); + + } + + } else { + + renderer.render( drawStart, drawCount ); + + } + + }; + + function setupVertexAttributes( material, program, geometry, startIndex ) { + + if ( geometry && geometry.isInstancedBufferGeometry ) { + + if ( extensions.get( 'ANGLE_instanced_arrays' ) === null ) { + + console.error( 'THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' ); + return; + + } + + } + + if ( startIndex === undefined ) startIndex = 0; + + state.initAttributes(); + + var geometryAttributes = geometry.attributes; + + var programAttributes = program.getAttributes(); + + var materialDefaultAttributeValues = material.defaultAttributeValues; + + for ( var name in programAttributes ) { + + var programAttribute = programAttributes[ name ]; + + if ( programAttribute >= 0 ) { + + var geometryAttribute = geometryAttributes[ name ]; + + if ( geometryAttribute !== undefined ) { + + var normalized = geometryAttribute.normalized; + var size = geometryAttribute.itemSize; + + var attribute = attributes.get( geometryAttribute ); + + var buffer = attribute.buffer; + var type = attribute.type; + var bytesPerElement = attribute.bytesPerElement; + + if ( geometryAttribute.isInterleavedBufferAttribute ) { + + var data = geometryAttribute.data; + var stride = data.stride; + var offset = geometryAttribute.offset; + + if ( data && data.isInstancedInterleavedBuffer ) { + + state.enableAttributeAndDivisor( programAttribute, data.meshPerAttribute ); + + if ( geometry.maxInstancedCount === undefined ) { + + geometry.maxInstancedCount = data.meshPerAttribute * data.count; + + } + + } else { + + state.enableAttribute( programAttribute ); + + } + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffer ); + _gl.vertexAttribPointer( programAttribute, size, type, normalized, stride * bytesPerElement, ( startIndex * stride + offset ) * bytesPerElement ); + + } else { + + if ( geometryAttribute.isInstancedBufferAttribute ) { + + state.enableAttributeAndDivisor( programAttribute, geometryAttribute.meshPerAttribute ); + + if ( geometry.maxInstancedCount === undefined ) { + + geometry.maxInstancedCount = geometryAttribute.meshPerAttribute * geometryAttribute.count; + + } + + } else { + + state.enableAttribute( programAttribute ); + + } + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffer ); + _gl.vertexAttribPointer( programAttribute, size, type, normalized, 0, startIndex * size * bytesPerElement ); + + } + + } else if ( materialDefaultAttributeValues !== undefined ) { + + var value = materialDefaultAttributeValues[ name ]; + + if ( value !== undefined ) { + + switch ( value.length ) { + + case 2: + _gl.vertexAttrib2fv( programAttribute, value ); + break; + + case 3: + _gl.vertexAttrib3fv( programAttribute, value ); + break; + + case 4: + _gl.vertexAttrib4fv( programAttribute, value ); + break; + + default: + _gl.vertexAttrib1fv( programAttribute, value ); + + } + + } + + } + + } + + } + + state.disableUnusedAttributes(); + + } + + // Compile + + this.compile = function ( scene, camera ) { + + lights = []; + + scene.traverse( function ( object ) { + + if ( object.isLight ) { + + lights.push( object ); + + } + + } ); + + setupLights( lights, camera ); + + scene.traverse( function ( object ) { + + if ( object.material ) { + + if ( Array.isArray( object.material ) ) { + + for ( var i = 0; i < object.material.length; i ++ ) { + + initMaterial( object.material[ i ], scene.fog, object ); + + } + + } else { + + initMaterial( object.material, scene.fog, object ); + + } + + } + + } ); + + }; + + // Rendering + + this.animate = function ( callback ) { + + function onFrame() { + + callback(); + + ( vr.getDevice() || window ).requestAnimationFrame( onFrame ); + + } + + ( vr.getDevice() || window ).requestAnimationFrame( onFrame ); + + }; + + this.render = function ( scene, camera, renderTarget, forceClear ) { + + if ( ! ( camera && camera.isCamera ) ) { + + console.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' ); + return; + + } + + // reset caching for this frame + + _currentGeometryProgram = ''; + _currentMaterialId = - 1; + _currentCamera = null; + + // update scene graph + + if ( scene.autoUpdate === true ) scene.updateMatrixWorld(); + + // update camera matrices and frustum + + if ( camera.parent === null ) camera.updateMatrixWorld(); + + if ( vr.enabled ) { + + camera = vr.getCamera( camera ); + + } + + _projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse ); + _frustum.setFromMatrix( _projScreenMatrix ); + + lights.length = 0; + sprites.length = 0; + lensFlares.length = 0; + + _localClippingEnabled = this.localClippingEnabled; + _clippingEnabled = _clipping.init( this.clippingPlanes, _localClippingEnabled, camera ); + + currentRenderList = renderLists.get( scene, camera ); + currentRenderList.init(); + + projectObject( scene, camera, _this.sortObjects ); + + currentRenderList.finish(); + + if ( _this.sortObjects === true ) { + + currentRenderList.sort(); + + } + + // + + if ( _clippingEnabled ) _clipping.beginShadows(); + + setupShadows( lights ); + + shadowMap.render( scene, camera ); + + setupLights( lights, camera ); + + if ( _clippingEnabled ) _clipping.endShadows(); + + // + + _infoRender.frame ++; + _infoRender.calls = 0; + _infoRender.vertices = 0; + _infoRender.faces = 0; + _infoRender.points = 0; + + if ( renderTarget === undefined ) { + + renderTarget = null; + + } + + this.setRenderTarget( renderTarget ); + + // + + background.render( scene, camera, forceClear ); + + // render scene + + var opaqueObjects = currentRenderList.opaque; + var transparentObjects = currentRenderList.transparent; + + if ( scene.overrideMaterial ) { + + var overrideMaterial = scene.overrideMaterial; + + if ( opaqueObjects.length ) renderObjects( opaqueObjects, scene, camera, overrideMaterial ); + if ( transparentObjects.length ) renderObjects( transparentObjects, scene, camera, overrideMaterial ); + + } else { + + // opaque pass (front-to-back order) + + if ( opaqueObjects.length ) renderObjects( opaqueObjects, scene, camera ); + + // transparent pass (back-to-front order) + + if ( transparentObjects.length ) renderObjects( transparentObjects, scene, camera ); + + } + + // custom render plugins (post pass) + + spritePlugin.render( scene, camera ); + lensFlarePlugin.render( scene, camera, _currentViewport ); + + // Generate mipmap if we're using any kind of mipmap filtering + + if ( renderTarget ) { + + textures.updateRenderTargetMipmap( renderTarget ); + + } + + // Ensure depth buffer writing is enabled so it can be cleared on next render + + state.buffers.depth.setTest( true ); + state.buffers.depth.setMask( true ); + state.buffers.color.setMask( true ); + + if ( camera.isArrayCamera ) { + + _this.setScissorTest( false ); + + } + + if ( vr.enabled ) { + + vr.submitFrame(); + + } + + // _gl.finish(); + + }; + + /* + // TODO Duplicated code (Frustum) + + var _sphere = new Sphere(); + + function isObjectViewable( object ) { + + var geometry = object.geometry; + + if ( geometry.boundingSphere === null ) + geometry.computeBoundingSphere(); + + _sphere.copy( geometry.boundingSphere ). + applyMatrix4( object.matrixWorld ); + + return isSphereViewable( _sphere ); + + } + + function isSpriteViewable( sprite ) { + + _sphere.center.set( 0, 0, 0 ); + _sphere.radius = 0.7071067811865476; + _sphere.applyMatrix4( sprite.matrixWorld ); + + return isSphereViewable( _sphere ); + + } + + function isSphereViewable( sphere ) { + + if ( ! _frustum.intersectsSphere( sphere ) ) return false; + + var numPlanes = _clipping.numPlanes; + + if ( numPlanes === 0 ) return true; + + var planes = _this.clippingPlanes, + + center = sphere.center, + negRad = - sphere.radius, + i = 0; + + do { + + // out when deeper than radius in the negative halfspace + if ( planes[ i ].distanceToPoint( center ) < negRad ) return false; + + } while ( ++ i !== numPlanes ); + + return true; + + } + */ + + function projectObject( object, camera, sortObjects ) { + + if ( ! object.visible ) return; + + var visible = object.layers.test( camera.layers ); + + if ( visible ) { + + if ( object.isLight ) { + + lights.push( object ); + + } else if ( object.isSprite ) { + + if ( ! object.frustumCulled || _frustum.intersectsSprite( object ) ) { + + sprites.push( object ); + + } + + } else if ( object.isLensFlare ) { + + lensFlares.push( object ); + + } else if ( object.isImmediateRenderObject ) { + + if ( sortObjects ) { + + _vector3.setFromMatrixPosition( object.matrixWorld ) + .applyMatrix4( _projScreenMatrix ); + + } + + currentRenderList.push( object, null, object.material, _vector3.z, null ); + + } else if ( object.isMesh || object.isLine || object.isPoints ) { + + if ( object.isSkinnedMesh ) { + + object.skeleton.update(); + + } + + if ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) { + + if ( sortObjects ) { + + _vector3.setFromMatrixPosition( object.matrixWorld ) + .applyMatrix4( _projScreenMatrix ); + + } + + var geometry = objects.update( object ); + var material = object.material; + + if ( Array.isArray( material ) ) { + + var groups = geometry.groups; + + for ( var i = 0, l = groups.length; i < l; i ++ ) { + + var group = groups[ i ]; + var groupMaterial = material[ group.materialIndex ]; + + if ( groupMaterial && groupMaterial.visible ) { + + currentRenderList.push( object, geometry, groupMaterial, _vector3.z, group ); + + } + + } + + } else if ( material.visible ) { + + currentRenderList.push( object, geometry, material, _vector3.z, null ); + + } + + } + + } + + } + + var children = object.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + projectObject( children[ i ], camera, sortObjects ); + + } + + } + + function renderObjects( renderList, scene, camera, overrideMaterial ) { + + for ( var i = 0, l = renderList.length; i < l; i ++ ) { + + var renderItem = renderList[ i ]; + + var object = renderItem.object; + var geometry = renderItem.geometry; + var material = overrideMaterial === undefined ? renderItem.material : overrideMaterial; + var group = renderItem.group; + + if ( camera.isArrayCamera ) { + + _currentArrayCamera = camera; + + var cameras = camera.cameras; + + for ( var j = 0, jl = cameras.length; j < jl; j ++ ) { + + var camera2 = cameras[ j ]; + + if ( object.layers.test( camera2.layers ) ) { + + var bounds = camera2.bounds; + + var x = bounds.x * _width; + var y = bounds.y * _height; + var width = bounds.z * _width; + var height = bounds.w * _height; + + _this.setViewport( x, y, width, height ); + _this.setScissor( x, y, width, height ); + _this.setScissorTest( true ); + + renderObject( object, scene, camera2, geometry, material, group ); + + } + + } + + } else { + + _currentArrayCamera = null; + + renderObject( object, scene, camera, geometry, material, group ); + + } + + } + + } + + function renderObject( object, scene, camera, geometry, material, group ) { + + object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld ); + object.normalMatrix.getNormalMatrix( object.modelViewMatrix ); + + object.onBeforeRender( _this, scene, camera, geometry, material, group ); + + if ( object.isImmediateRenderObject ) { + + state.setMaterial( material ); + + var program = setProgram( camera, scene.fog, material, object ); + + _currentGeometryProgram = ''; + + renderObjectImmediate( object, program, material ); + + } else { + + _this.renderBufferDirect( camera, scene.fog, geometry, material, object, group ); + + } + + object.onAfterRender( _this, scene, camera, geometry, material, group ); + + } + + function initMaterial( material, fog, object ) { + + var materialProperties = properties.get( material ); + + var parameters = programCache.getParameters( + material, _lights, fog, _clipping.numPlanes, _clipping.numIntersection, object ); + + var code = programCache.getProgramCode( material, parameters ); + + var program = materialProperties.program; + var programChange = true; + + if ( program === undefined ) { + + // new material + material.addEventListener( 'dispose', onMaterialDispose ); + + } else if ( program.code !== code ) { + + // changed glsl or parameters + releaseMaterialProgramReference( material ); + + } else if ( parameters.shaderID !== undefined ) { + + // same glsl and uniform list + return; + + } else { + + // only rebuild uniform list + programChange = false; + + } + + if ( programChange ) { + + if ( parameters.shaderID ) { + + var shader = ShaderLib[ parameters.shaderID ]; + + materialProperties.shader = { + name: material.type, + uniforms: UniformsUtils.clone( shader.uniforms ), + vertexShader: shader.vertexShader, + fragmentShader: shader.fragmentShader + }; + + } else { + + materialProperties.shader = { + name: material.type, + uniforms: material.uniforms, + vertexShader: material.vertexShader, + fragmentShader: material.fragmentShader + }; + + } + + material.onBeforeCompile( materialProperties.shader ); + + program = programCache.acquireProgram( material, materialProperties.shader, parameters, code ); + + materialProperties.program = program; + material.program = program; + + } + + var programAttributes = program.getAttributes(); + + if ( material.morphTargets ) { + + material.numSupportedMorphTargets = 0; + + for ( var i = 0; i < _this.maxMorphTargets; i ++ ) { + + if ( programAttributes[ 'morphTarget' + i ] >= 0 ) { + + material.numSupportedMorphTargets ++; + + } + + } + + } + + if ( material.morphNormals ) { + + material.numSupportedMorphNormals = 0; + + for ( var i = 0; i < _this.maxMorphNormals; i ++ ) { + + if ( programAttributes[ 'morphNormal' + i ] >= 0 ) { + + material.numSupportedMorphNormals ++; + + } + + } + + } + + var uniforms = materialProperties.shader.uniforms; + + if ( ! material.isShaderMaterial && + ! material.isRawShaderMaterial || + material.clipping === true ) { + + materialProperties.numClippingPlanes = _clipping.numPlanes; + materialProperties.numIntersection = _clipping.numIntersection; + uniforms.clippingPlanes = _clipping.uniform; + + } + + materialProperties.fog = fog; + + // store the light setup it was created for + + materialProperties.lightsHash = _lights.hash; + + if ( material.lights ) { + + // wire up the material to this renderer's lighting state + + uniforms.ambientLightColor.value = _lights.ambient; + uniforms.directionalLights.value = _lights.directional; + uniforms.spotLights.value = _lights.spot; + uniforms.rectAreaLights.value = _lights.rectArea; + uniforms.pointLights.value = _lights.point; + uniforms.hemisphereLights.value = _lights.hemi; + + uniforms.directionalShadowMap.value = _lights.directionalShadowMap; + uniforms.directionalShadowMatrix.value = _lights.directionalShadowMatrix; + uniforms.spotShadowMap.value = _lights.spotShadowMap; + uniforms.spotShadowMatrix.value = _lights.spotShadowMatrix; + uniforms.pointShadowMap.value = _lights.pointShadowMap; + uniforms.pointShadowMatrix.value = _lights.pointShadowMatrix; + // TODO (abelnation): add area lights shadow info to uniforms + + } + + var progUniforms = materialProperties.program.getUniforms(), + uniformsList = + WebGLUniforms.seqWithValue( progUniforms.seq, uniforms ); + + materialProperties.uniformsList = uniformsList; + + } + + function setProgram( camera, fog, material, object ) { + + _usedTextureUnits = 0; + + var materialProperties = properties.get( material ); + + if ( _clippingEnabled ) { + + if ( _localClippingEnabled || camera !== _currentCamera ) { + + var useCache = + camera === _currentCamera && + material.id === _currentMaterialId; + + // we might want to call this function with some ClippingGroup + // object instead of the material, once it becomes feasible + // (#8465, #8379) + _clipping.setState( + material.clippingPlanes, material.clipIntersection, material.clipShadows, + camera, materialProperties, useCache ); + + } + + } + + if ( material.needsUpdate === false ) { + + if ( materialProperties.program === undefined ) { + + material.needsUpdate = true; + + } else if ( material.fog && materialProperties.fog !== fog ) { + + material.needsUpdate = true; + + } else if ( material.lights && materialProperties.lightsHash !== _lights.hash ) { + + material.needsUpdate = true; + + } else if ( materialProperties.numClippingPlanes !== undefined && + ( materialProperties.numClippingPlanes !== _clipping.numPlanes || + materialProperties.numIntersection !== _clipping.numIntersection ) ) { + + material.needsUpdate = true; + + } + + } + + if ( material.needsUpdate ) { + + initMaterial( material, fog, object ); + material.needsUpdate = false; + + } + + var refreshProgram = false; + var refreshMaterial = false; + var refreshLights = false; + + var program = materialProperties.program, + p_uniforms = program.getUniforms(), + m_uniforms = materialProperties.shader.uniforms; + + if ( program.id !== _currentProgram ) { + + _gl.useProgram( program.program ); + _currentProgram = program.id; + + refreshProgram = true; + refreshMaterial = true; + refreshLights = true; + + } + + if ( material.id !== _currentMaterialId ) { + + _currentMaterialId = material.id; + + refreshMaterial = true; + + } + + if ( refreshProgram || camera !== _currentCamera ) { + + p_uniforms.setValue( _gl, 'projectionMatrix', camera.projectionMatrix ); + + if ( capabilities.logarithmicDepthBuffer ) { + + p_uniforms.setValue( _gl, 'logDepthBufFC', + 2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) ); + + } + + // Avoid unneeded uniform updates per ArrayCamera's sub-camera + + if ( _currentCamera !== ( _currentArrayCamera || camera ) ) { + + _currentCamera = ( _currentArrayCamera || camera ); + + // lighting uniforms depend on the camera so enforce an update + // now, in case this material supports lights - or later, when + // the next material that does gets activated: + + refreshMaterial = true; // set to true on material change + refreshLights = true; // remains set until update done + + } + + // load material specific uniforms + // (shader material also gets them for the sake of genericity) + + if ( material.isShaderMaterial || + material.isMeshPhongMaterial || + material.isMeshStandardMaterial || + material.envMap ) { + + var uCamPos = p_uniforms.map.cameraPosition; + + if ( uCamPos !== undefined ) { + + uCamPos.setValue( _gl, + _vector3.setFromMatrixPosition( camera.matrixWorld ) ); + + } + + } + + if ( material.isMeshPhongMaterial || + material.isMeshLambertMaterial || + material.isMeshBasicMaterial || + material.isMeshStandardMaterial || + material.isShaderMaterial || + material.skinning ) { + + p_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse ); + + } + + } + + // skinning uniforms must be set even if material didn't change + // auto-setting of texture unit for bone texture must go before other textures + // not sure why, but otherwise weird things happen + + if ( material.skinning ) { + + p_uniforms.setOptional( _gl, object, 'bindMatrix' ); + p_uniforms.setOptional( _gl, object, 'bindMatrixInverse' ); + + var skeleton = object.skeleton; + + if ( skeleton ) { + + var bones = skeleton.bones; + + if ( capabilities.floatVertexTextures ) { + + if ( skeleton.boneTexture === undefined ) { + + // layout (1 matrix = 4 pixels) + // RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4) + // with 8x8 pixel texture max 16 bones * 4 pixels = (8 * 8) + // 16x16 pixel texture max 64 bones * 4 pixels = (16 * 16) + // 32x32 pixel texture max 256 bones * 4 pixels = (32 * 32) + // 64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64) + + + var size = Math.sqrt( bones.length * 4 ); // 4 pixels needed for 1 matrix + size = _Math.nextPowerOfTwo( Math.ceil( size ) ); + size = Math.max( size, 4 ); + + var boneMatrices = new Float32Array( size * size * 4 ); // 4 floats per RGBA pixel + boneMatrices.set( skeleton.boneMatrices ); // copy current values + + var boneTexture = new DataTexture( boneMatrices, size, size, RGBAFormat, FloatType ); + + skeleton.boneMatrices = boneMatrices; + skeleton.boneTexture = boneTexture; + skeleton.boneTextureSize = size; + + } + + p_uniforms.setValue( _gl, 'boneTexture', skeleton.boneTexture ); + p_uniforms.setValue( _gl, 'boneTextureSize', skeleton.boneTextureSize ); + + } else { + + p_uniforms.setOptional( _gl, skeleton, 'boneMatrices' ); + + } + + } + + } + + if ( refreshMaterial ) { + + p_uniforms.setValue( _gl, 'toneMappingExposure', _this.toneMappingExposure ); + p_uniforms.setValue( _gl, 'toneMappingWhitePoint', _this.toneMappingWhitePoint ); + + if ( material.lights ) { + + // the current material requires lighting info + + // note: all lighting uniforms are always set correctly + // they simply reference the renderer's state for their + // values + // + // use the current material's .needsUpdate flags to set + // the GL state when required + + markUniformsLightsNeedsUpdate( m_uniforms, refreshLights ); + + } + + // refresh uniforms common to several materials + + if ( fog && material.fog ) { + + refreshUniformsFog( m_uniforms, fog ); + + } + + if ( material.isMeshBasicMaterial || + material.isMeshLambertMaterial || + material.isMeshPhongMaterial || + material.isMeshStandardMaterial || + material.isMeshNormalMaterial || + material.isMeshDepthMaterial ) { + + refreshUniformsCommon( m_uniforms, material ); + + } + + // refresh single material specific uniforms + + if ( material.isLineBasicMaterial ) { + + refreshUniformsLine( m_uniforms, material ); + + } else if ( material.isLineDashedMaterial ) { + + refreshUniformsLine( m_uniforms, material ); + refreshUniformsDash( m_uniforms, material ); + + } else if ( material.isPointsMaterial ) { + + refreshUniformsPoints( m_uniforms, material ); + + } else if ( material.isMeshLambertMaterial ) { + + refreshUniformsLambert( m_uniforms, material ); + + } else if ( material.isMeshToonMaterial ) { + + refreshUniformsToon( m_uniforms, material ); + + } else if ( material.isMeshPhongMaterial ) { + + refreshUniformsPhong( m_uniforms, material ); + + } else if ( material.isMeshPhysicalMaterial ) { + + refreshUniformsPhysical( m_uniforms, material ); + + } else if ( material.isMeshStandardMaterial ) { + + refreshUniformsStandard( m_uniforms, material ); + + } else if ( material.isMeshDepthMaterial ) { + + if ( material.displacementMap ) { + + m_uniforms.displacementMap.value = material.displacementMap; + m_uniforms.displacementScale.value = material.displacementScale; + m_uniforms.displacementBias.value = material.displacementBias; + + } + + } else if ( material.isMeshNormalMaterial ) { + + refreshUniformsNormal( m_uniforms, material ); + + } + + // RectAreaLight Texture + // TODO (mrdoob): Find a nicer implementation + + if ( m_uniforms.ltcMat !== undefined ) m_uniforms.ltcMat.value = UniformsLib.LTC_MAT_TEXTURE; + if ( m_uniforms.ltcMag !== undefined ) m_uniforms.ltcMag.value = UniformsLib.LTC_MAG_TEXTURE; + + WebGLUniforms.upload( + _gl, materialProperties.uniformsList, m_uniforms, _this ); + + } + + + // common matrices + + p_uniforms.setValue( _gl, 'modelViewMatrix', object.modelViewMatrix ); + p_uniforms.setValue( _gl, 'normalMatrix', object.normalMatrix ); + p_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld ); + + return program; + + } + + // Uniforms (refresh uniforms objects) + + function refreshUniformsCommon( uniforms, material ) { + + uniforms.opacity.value = material.opacity; + + uniforms.diffuse.value = material.color; + + if ( material.emissive ) { + + uniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity ); + + } + + uniforms.map.value = material.map; + uniforms.specularMap.value = material.specularMap; + uniforms.alphaMap.value = material.alphaMap; + + if ( material.lightMap ) { + + uniforms.lightMap.value = material.lightMap; + uniforms.lightMapIntensity.value = material.lightMapIntensity; + + } + + if ( material.aoMap ) { + + uniforms.aoMap.value = material.aoMap; + uniforms.aoMapIntensity.value = material.aoMapIntensity; + + } + + // uv repeat and offset setting priorities + // 1. color map + // 2. specular map + // 3. normal map + // 4. bump map + // 5. alpha map + // 6. emissive map + + var uvScaleMap; + + if ( material.map ) { + + uvScaleMap = material.map; + + } else if ( material.specularMap ) { + + uvScaleMap = material.specularMap; + + } else if ( material.displacementMap ) { + + uvScaleMap = material.displacementMap; + + } else if ( material.normalMap ) { + + uvScaleMap = material.normalMap; + + } else if ( material.bumpMap ) { + + uvScaleMap = material.bumpMap; + + } else if ( material.roughnessMap ) { + + uvScaleMap = material.roughnessMap; + + } else if ( material.metalnessMap ) { + + uvScaleMap = material.metalnessMap; + + } else if ( material.alphaMap ) { + + uvScaleMap = material.alphaMap; + + } else if ( material.emissiveMap ) { + + uvScaleMap = material.emissiveMap; + + } + + if ( uvScaleMap !== undefined ) { + + // backwards compatibility + if ( uvScaleMap.isWebGLRenderTarget ) { + + uvScaleMap = uvScaleMap.texture; + + } + + var offset = uvScaleMap.offset; + var repeat = uvScaleMap.repeat; + + uniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y ); + + } + + uniforms.envMap.value = material.envMap; + + // don't flip CubeTexture envMaps, flip everything else: + // WebGLRenderTargetCube will be flipped for backwards compatibility + // WebGLRenderTargetCube.texture will be flipped because it's a Texture and NOT a CubeTexture + // this check must be handled differently, or removed entirely, if WebGLRenderTargetCube uses a CubeTexture in the future + uniforms.flipEnvMap.value = ( ! ( material.envMap && material.envMap.isCubeTexture ) ) ? 1 : - 1; + + uniforms.reflectivity.value = material.reflectivity; + uniforms.refractionRatio.value = material.refractionRatio; + + } + + function refreshUniformsLine( uniforms, material ) { + + uniforms.diffuse.value = material.color; + uniforms.opacity.value = material.opacity; + + } + + function refreshUniformsDash( uniforms, material ) { + + uniforms.dashSize.value = material.dashSize; + uniforms.totalSize.value = material.dashSize + material.gapSize; + uniforms.scale.value = material.scale; + + } + + function refreshUniformsPoints( uniforms, material ) { + + uniforms.diffuse.value = material.color; + uniforms.opacity.value = material.opacity; + uniforms.size.value = material.size * _pixelRatio; + uniforms.scale.value = _height * 0.5; + + uniforms.map.value = material.map; + + if ( material.map !== null ) { + + var offset = material.map.offset; + var repeat = material.map.repeat; + + uniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y ); + + } + + } + + function refreshUniformsFog( uniforms, fog ) { + + uniforms.fogColor.value = fog.color; + + if ( fog.isFog ) { + + uniforms.fogNear.value = fog.near; + uniforms.fogFar.value = fog.far; + + } else if ( fog.isFogExp2 ) { + + uniforms.fogDensity.value = fog.density; + + } + + } + + function refreshUniformsLambert( uniforms, material ) { + + if ( material.emissiveMap ) { + + uniforms.emissiveMap.value = material.emissiveMap; + + } + + } + + function refreshUniformsPhong( uniforms, material ) { + + uniforms.specular.value = material.specular; + uniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 ) + + if ( material.emissiveMap ) { + + uniforms.emissiveMap.value = material.emissiveMap; + + } + + if ( material.bumpMap ) { + + uniforms.bumpMap.value = material.bumpMap; + uniforms.bumpScale.value = material.bumpScale; + + } + + if ( material.normalMap ) { + + uniforms.normalMap.value = material.normalMap; + uniforms.normalScale.value.copy( material.normalScale ); + + } + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + } + + function refreshUniformsToon( uniforms, material ) { + + refreshUniformsPhong( uniforms, material ); + + if ( material.gradientMap ) { + + uniforms.gradientMap.value = material.gradientMap; + + } + + } + + function refreshUniformsStandard( uniforms, material ) { + + uniforms.roughness.value = material.roughness; + uniforms.metalness.value = material.metalness; + + if ( material.roughnessMap ) { + + uniforms.roughnessMap.value = material.roughnessMap; + + } + + if ( material.metalnessMap ) { + + uniforms.metalnessMap.value = material.metalnessMap; + + } + + if ( material.emissiveMap ) { + + uniforms.emissiveMap.value = material.emissiveMap; + + } + + if ( material.bumpMap ) { + + uniforms.bumpMap.value = material.bumpMap; + uniforms.bumpScale.value = material.bumpScale; + + } + + if ( material.normalMap ) { + + uniforms.normalMap.value = material.normalMap; + uniforms.normalScale.value.copy( material.normalScale ); + + } + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + if ( material.envMap ) { + + //uniforms.envMap.value = material.envMap; // part of uniforms common + uniforms.envMapIntensity.value = material.envMapIntensity; + + } + + } + + function refreshUniformsPhysical( uniforms, material ) { + + uniforms.clearCoat.value = material.clearCoat; + uniforms.clearCoatRoughness.value = material.clearCoatRoughness; + + refreshUniformsStandard( uniforms, material ); + + } + + function refreshUniformsNormal( uniforms, material ) { + + if ( material.bumpMap ) { + + uniforms.bumpMap.value = material.bumpMap; + uniforms.bumpScale.value = material.bumpScale; + + } + + if ( material.normalMap ) { + + uniforms.normalMap.value = material.normalMap; + uniforms.normalScale.value.copy( material.normalScale ); + + } + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + } + + // If uniforms are marked as clean, they don't need to be loaded to the GPU. + + function markUniformsLightsNeedsUpdate( uniforms, value ) { + + uniforms.ambientLightColor.needsUpdate = value; + + uniforms.directionalLights.needsUpdate = value; + uniforms.pointLights.needsUpdate = value; + uniforms.spotLights.needsUpdate = value; + uniforms.rectAreaLights.needsUpdate = value; + uniforms.hemisphereLights.needsUpdate = value; + + } + + // Lighting + + function setupShadows( lights ) { + + var lightShadowsLength = 0; + + for ( var i = 0, l = lights.length; i < l; i ++ ) { + + var light = lights[ i ]; + + if ( light.castShadow ) { + + _lights.shadows[ lightShadowsLength ] = light; + lightShadowsLength ++; + + } + + } + + _lights.shadows.length = lightShadowsLength; + + } + + function setupLights( lights, camera ) { + + var l, ll, light, shadow, + r = 0, g = 0, b = 0, + color, + intensity, + distance, + shadowMap, + + viewMatrix = camera.matrixWorldInverse, + + directionalLength = 0, + pointLength = 0, + spotLength = 0, + rectAreaLength = 0, + hemiLength = 0; + + for ( l = 0, ll = lights.length; l < ll; l ++ ) { + + light = lights[ l ]; + + color = light.color; + intensity = light.intensity; + distance = light.distance; + + shadowMap = ( light.shadow && light.shadow.map ) ? light.shadow.map.texture : null; + + if ( light.isAmbientLight ) { + + r += color.r * intensity; + g += color.g * intensity; + b += color.b * intensity; + + } else if ( light.isDirectionalLight ) { + + var uniforms = lightCache.get( light ); + + uniforms.color.copy( light.color ).multiplyScalar( light.intensity ); + uniforms.direction.setFromMatrixPosition( light.matrixWorld ); + _vector3.setFromMatrixPosition( light.target.matrixWorld ); + uniforms.direction.sub( _vector3 ); + uniforms.direction.transformDirection( viewMatrix ); + + uniforms.shadow = light.castShadow; + + if ( light.castShadow ) { + + shadow = light.shadow; + + uniforms.shadowBias = shadow.bias; + uniforms.shadowRadius = shadow.radius; + uniforms.shadowMapSize = shadow.mapSize; + + } + + _lights.directionalShadowMap[ directionalLength ] = shadowMap; + _lights.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix; + _lights.directional[ directionalLength ] = uniforms; + + directionalLength ++; + + } else if ( light.isSpotLight ) { + + var uniforms = lightCache.get( light ); + + uniforms.position.setFromMatrixPosition( light.matrixWorld ); + uniforms.position.applyMatrix4( viewMatrix ); + + uniforms.color.copy( color ).multiplyScalar( intensity ); + uniforms.distance = distance; + + uniforms.direction.setFromMatrixPosition( light.matrixWorld ); + _vector3.setFromMatrixPosition( light.target.matrixWorld ); + uniforms.direction.sub( _vector3 ); + uniforms.direction.transformDirection( viewMatrix ); + + uniforms.coneCos = Math.cos( light.angle ); + uniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) ); + uniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay; + + uniforms.shadow = light.castShadow; + + if ( light.castShadow ) { + + shadow = light.shadow; + + uniforms.shadowBias = shadow.bias; + uniforms.shadowRadius = shadow.radius; + uniforms.shadowMapSize = shadow.mapSize; + + } + + _lights.spotShadowMap[ spotLength ] = shadowMap; + _lights.spotShadowMatrix[ spotLength ] = light.shadow.matrix; + _lights.spot[ spotLength ] = uniforms; + + spotLength ++; + + } else if ( light.isRectAreaLight ) { + + var uniforms = lightCache.get( light ); + + // (a) intensity controls irradiance of entire light + uniforms.color + .copy( color ) + .multiplyScalar( intensity / ( light.width * light.height ) ); + + // (b) intensity controls the radiance per light area + // uniforms.color.copy( color ).multiplyScalar( intensity ); + + uniforms.position.setFromMatrixPosition( light.matrixWorld ); + uniforms.position.applyMatrix4( viewMatrix ); + + // extract local rotation of light to derive width/height half vectors + _matrix42.identity(); + _matrix4.copy( light.matrixWorld ); + _matrix4.premultiply( viewMatrix ); + _matrix42.extractRotation( _matrix4 ); + + uniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 ); + uniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 ); + + uniforms.halfWidth.applyMatrix4( _matrix42 ); + uniforms.halfHeight.applyMatrix4( _matrix42 ); + + // TODO (abelnation): RectAreaLight distance? + // uniforms.distance = distance; + + _lights.rectArea[ rectAreaLength ] = uniforms; + + rectAreaLength ++; + + } else if ( light.isPointLight ) { + + var uniforms = lightCache.get( light ); + + uniforms.position.setFromMatrixPosition( light.matrixWorld ); + uniforms.position.applyMatrix4( viewMatrix ); + + uniforms.color.copy( light.color ).multiplyScalar( light.intensity ); + uniforms.distance = light.distance; + uniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay; + + uniforms.shadow = light.castShadow; + + if ( light.castShadow ) { + + shadow = light.shadow; + + uniforms.shadowBias = shadow.bias; + uniforms.shadowRadius = shadow.radius; + uniforms.shadowMapSize = shadow.mapSize; + + } + + _lights.pointShadowMap[ pointLength ] = shadowMap; + _lights.pointShadowMatrix[ pointLength ] = light.shadow.matrix; + _lights.point[ pointLength ] = uniforms; + + pointLength ++; + + } else if ( light.isHemisphereLight ) { + + var uniforms = lightCache.get( light ); + + uniforms.direction.setFromMatrixPosition( light.matrixWorld ); + uniforms.direction.transformDirection( viewMatrix ); + uniforms.direction.normalize(); + + uniforms.skyColor.copy( light.color ).multiplyScalar( intensity ); + uniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity ); + + _lights.hemi[ hemiLength ] = uniforms; + + hemiLength ++; + + } + + } + + _lights.ambient[ 0 ] = r; + _lights.ambient[ 1 ] = g; + _lights.ambient[ 2 ] = b; + + _lights.directional.length = directionalLength; + _lights.spot.length = spotLength; + _lights.rectArea.length = rectAreaLength; + _lights.point.length = pointLength; + _lights.hemi.length = hemiLength; + + // TODO (sam-g-steel) why aren't we using join + _lights.hash = directionalLength + ',' + pointLength + ',' + spotLength + ',' + rectAreaLength + ',' + hemiLength + ',' + _lights.shadows.length; + + } + + // GL state setting + + this.setFaceCulling = function ( cullFace, frontFaceDirection ) { + + state.setCullFace( cullFace ); + state.setFlipSided( frontFaceDirection === FrontFaceDirectionCW ); + + }; + + // Textures + + function allocTextureUnit() { + + var textureUnit = _usedTextureUnits; + + if ( textureUnit >= capabilities.maxTextures ) { + + console.warn( 'THREE.WebGLRenderer: Trying to use ' + textureUnit + ' texture units while this GPU supports only ' + capabilities.maxTextures ); + + } + + _usedTextureUnits += 1; + + return textureUnit; + + } + + this.allocTextureUnit = allocTextureUnit; + + // this.setTexture2D = setTexture2D; + this.setTexture2D = ( function () { + + var warned = false; + + // backwards compatibility: peel texture.texture + return function setTexture2D( texture, slot ) { + + if ( texture && texture.isWebGLRenderTarget ) { + + if ( ! warned ) { + + console.warn( "THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead." ); + warned = true; + + } + + texture = texture.texture; + + } + + textures.setTexture2D( texture, slot ); + + }; + + }() ); + + this.setTexture = ( function () { + + var warned = false; + + return function setTexture( texture, slot ) { + + if ( ! warned ) { + + console.warn( "THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead." ); + warned = true; + + } + + textures.setTexture2D( texture, slot ); + + }; + + }() ); + + this.setTextureCube = ( function () { + + var warned = false; + + return function setTextureCube( texture, slot ) { + + // backwards compatibility: peel texture.texture + if ( texture && texture.isWebGLRenderTargetCube ) { + + if ( ! warned ) { + + console.warn( "THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead." ); + warned = true; + + } + + texture = texture.texture; + + } + + // currently relying on the fact that WebGLRenderTargetCube.texture is a Texture and NOT a CubeTexture + // TODO: unify these code paths + if ( ( texture && texture.isCubeTexture ) || + ( Array.isArray( texture.image ) && texture.image.length === 6 ) ) { + + // CompressedTexture can have Array in image :/ + + // this function alone should take care of cube textures + textures.setTextureCube( texture, slot ); + + } else { + + // assumed: texture property of THREE.WebGLRenderTargetCube + + textures.setTextureCubeDynamic( texture, slot ); + + } + + }; + + }() ); + + this.getRenderTarget = function () { + + return _currentRenderTarget; + + }; + + this.setRenderTarget = function ( renderTarget ) { + + _currentRenderTarget = renderTarget; + + if ( renderTarget && properties.get( renderTarget ).__webglFramebuffer === undefined ) { + + textures.setupRenderTarget( renderTarget ); + + } + + var isCube = ( renderTarget && renderTarget.isWebGLRenderTargetCube ); + var framebuffer; + + if ( renderTarget ) { + + var renderTargetProperties = properties.get( renderTarget ); + + if ( isCube ) { + + framebuffer = renderTargetProperties.__webglFramebuffer[ renderTarget.activeCubeFace ]; + + } else { + + framebuffer = renderTargetProperties.__webglFramebuffer; + + } + + _currentScissor.copy( renderTarget.scissor ); + _currentScissorTest = renderTarget.scissorTest; + + _currentViewport.copy( renderTarget.viewport ); + + } else { + + framebuffer = null; + + _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ); + _currentScissorTest = _scissorTest; + + _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ); + + } + + if ( _currentFramebuffer !== framebuffer ) { + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); + _currentFramebuffer = framebuffer; + + } + + state.scissor( _currentScissor ); + state.setScissorTest( _currentScissorTest ); + + state.viewport( _currentViewport ); + + if ( isCube ) { + + var textureProperties = properties.get( renderTarget.texture ); + _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + renderTarget.activeCubeFace, textureProperties.__webglTexture, renderTarget.activeMipMapLevel ); + + } + + }; + + this.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer ) { + + if ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' ); + return; + + } + + var framebuffer = properties.get( renderTarget ).__webglFramebuffer; + + if ( framebuffer ) { + + var restore = false; + + if ( framebuffer !== _currentFramebuffer ) { + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); + + restore = true; + + } + + try { + + var texture = renderTarget.texture; + var textureFormat = texture.format; + var textureType = texture.type; + + if ( textureFormat !== RGBAFormat && paramThreeToGL( textureFormat ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_FORMAT ) ) { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' ); + return; + + } + + if ( textureType !== UnsignedByteType && paramThreeToGL( textureType ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // IE11, Edge and Chrome Mac < 52 (#9513) + ! ( textureType === FloatType && ( extensions.get( 'OES_texture_float' ) || extensions.get( 'WEBGL_color_buffer_float' ) ) ) && // Chrome Mac >= 52 and Firefox + ! ( textureType === HalfFloatType && extensions.get( 'EXT_color_buffer_half_float' ) ) ) { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' ); + return; + + } + + if ( _gl.checkFramebufferStatus( _gl.FRAMEBUFFER ) === _gl.FRAMEBUFFER_COMPLETE ) { + + // the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604) + + if ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) { + + _gl.readPixels( x, y, width, height, paramThreeToGL( textureFormat ), paramThreeToGL( textureType ), buffer ); + + } + + } else { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.' ); + + } + + } finally { + + if ( restore ) { + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, _currentFramebuffer ); + + } + + } + + } + + }; + + // Map three.js constants to WebGL constants + + function paramThreeToGL( p ) { + + var extension; + + if ( p === RepeatWrapping ) return _gl.REPEAT; + if ( p === ClampToEdgeWrapping ) return _gl.CLAMP_TO_EDGE; + if ( p === MirroredRepeatWrapping ) return _gl.MIRRORED_REPEAT; + + if ( p === NearestFilter ) return _gl.NEAREST; + if ( p === NearestMipMapNearestFilter ) return _gl.NEAREST_MIPMAP_NEAREST; + if ( p === NearestMipMapLinearFilter ) return _gl.NEAREST_MIPMAP_LINEAR; + + if ( p === LinearFilter ) return _gl.LINEAR; + if ( p === LinearMipMapNearestFilter ) return _gl.LINEAR_MIPMAP_NEAREST; + if ( p === LinearMipMapLinearFilter ) return _gl.LINEAR_MIPMAP_LINEAR; + + if ( p === UnsignedByteType ) return _gl.UNSIGNED_BYTE; + if ( p === UnsignedShort4444Type ) return _gl.UNSIGNED_SHORT_4_4_4_4; + if ( p === UnsignedShort5551Type ) return _gl.UNSIGNED_SHORT_5_5_5_1; + if ( p === UnsignedShort565Type ) return _gl.UNSIGNED_SHORT_5_6_5; + + if ( p === ByteType ) return _gl.BYTE; + if ( p === ShortType ) return _gl.SHORT; + if ( p === UnsignedShortType ) return _gl.UNSIGNED_SHORT; + if ( p === IntType ) return _gl.INT; + if ( p === UnsignedIntType ) return _gl.UNSIGNED_INT; + if ( p === FloatType ) return _gl.FLOAT; + + if ( p === HalfFloatType ) { + + extension = extensions.get( 'OES_texture_half_float' ); + + if ( extension !== null ) return extension.HALF_FLOAT_OES; + + } + + if ( p === AlphaFormat ) return _gl.ALPHA; + if ( p === RGBFormat ) return _gl.RGB; + if ( p === RGBAFormat ) return _gl.RGBA; + if ( p === LuminanceFormat ) return _gl.LUMINANCE; + if ( p === LuminanceAlphaFormat ) return _gl.LUMINANCE_ALPHA; + if ( p === DepthFormat ) return _gl.DEPTH_COMPONENT; + if ( p === DepthStencilFormat ) return _gl.DEPTH_STENCIL; + + if ( p === AddEquation ) return _gl.FUNC_ADD; + if ( p === SubtractEquation ) return _gl.FUNC_SUBTRACT; + if ( p === ReverseSubtractEquation ) return _gl.FUNC_REVERSE_SUBTRACT; + + if ( p === ZeroFactor ) return _gl.ZERO; + if ( p === OneFactor ) return _gl.ONE; + if ( p === SrcColorFactor ) return _gl.SRC_COLOR; + if ( p === OneMinusSrcColorFactor ) return _gl.ONE_MINUS_SRC_COLOR; + if ( p === SrcAlphaFactor ) return _gl.SRC_ALPHA; + if ( p === OneMinusSrcAlphaFactor ) return _gl.ONE_MINUS_SRC_ALPHA; + if ( p === DstAlphaFactor ) return _gl.DST_ALPHA; + if ( p === OneMinusDstAlphaFactor ) return _gl.ONE_MINUS_DST_ALPHA; + + if ( p === DstColorFactor ) return _gl.DST_COLOR; + if ( p === OneMinusDstColorFactor ) return _gl.ONE_MINUS_DST_COLOR; + if ( p === SrcAlphaSaturateFactor ) return _gl.SRC_ALPHA_SATURATE; + + if ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format || + p === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) { + + extension = extensions.get( 'WEBGL_compressed_texture_s3tc' ); + + if ( extension !== null ) { + + if ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT; + if ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT; + if ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT; + if ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT; + + } + + } + + if ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format || + p === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) { + + extension = extensions.get( 'WEBGL_compressed_texture_pvrtc' ); + + if ( extension !== null ) { + + if ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG; + if ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG; + if ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG; + if ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG; + + } + + } + + if ( p === RGB_ETC1_Format ) { + + extension = extensions.get( 'WEBGL_compressed_texture_etc1' ); + + if ( extension !== null ) return extension.COMPRESSED_RGB_ETC1_WEBGL; + + } + + if ( p === MinEquation || p === MaxEquation ) { + + extension = extensions.get( 'EXT_blend_minmax' ); + + if ( extension !== null ) { + + if ( p === MinEquation ) return extension.MIN_EXT; + if ( p === MaxEquation ) return extension.MAX_EXT; + + } + + } + + if ( p === UnsignedInt248Type ) { + + extension = extensions.get( 'WEBGL_depth_texture' ); + + if ( extension !== null ) return extension.UNSIGNED_INT_24_8_WEBGL; + + } + + return 0; + + } + + } + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function FogExp2 ( color, density ) { + + this.name = ''; + + this.color = new Color( color ); + this.density = ( density !== undefined ) ? density : 0.00025; + + } + + FogExp2.prototype.isFogExp2 = true; + + FogExp2.prototype.clone = function () { + + return new FogExp2( this.color.getHex(), this.density ); + + }; + + FogExp2.prototype.toJSON = function ( meta ) { + + return { + type: 'FogExp2', + color: this.color.getHex(), + density: this.density + }; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function Fog ( color, near, far ) { + + this.name = ''; + + this.color = new Color( color ); + + this.near = ( near !== undefined ) ? near : 1; + this.far = ( far !== undefined ) ? far : 1000; + + } + + Fog.prototype.isFog = true; + + Fog.prototype.clone = function () { + + return new Fog( this.color.getHex(), this.near, this.far ); + + }; + + Fog.prototype.toJSON = function ( meta ) { + + return { + type: 'Fog', + color: this.color.getHex(), + near: this.near, + far: this.far + }; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Scene () { + + Object3D.call( this ); + + this.type = 'Scene'; + + this.background = null; + this.fog = null; + this.overrideMaterial = null; + + this.autoUpdate = true; // checked by the renderer + + } + + Scene.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Scene, + + copy: function ( source, recursive ) { + + Object3D.prototype.copy.call( this, source, recursive ); + + if ( source.background !== null ) this.background = source.background.clone(); + if ( source.fog !== null ) this.fog = source.fog.clone(); + if ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone(); + + this.autoUpdate = source.autoUpdate; + this.matrixAutoUpdate = source.matrixAutoUpdate; + + return this; + + }, + + toJSON: function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + if ( this.background !== null ) data.object.background = this.background.toJSON( meta ); + if ( this.fog !== null ) data.object.fog = this.fog.toJSON(); + + return data; + + } + + } ); + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + */ + + function LensFlare( texture, size, distance, blending, color ) { + + Object3D.call( this ); + + this.lensFlares = []; + + this.positionScreen = new Vector3(); + this.customUpdateCallback = undefined; + + if ( texture !== undefined ) { + + this.add( texture, size, distance, blending, color ); + + } + + } + + LensFlare.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: LensFlare, + + isLensFlare: true, + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source ); + + this.positionScreen.copy( source.positionScreen ); + this.customUpdateCallback = source.customUpdateCallback; + + for ( var i = 0, l = source.lensFlares.length; i < l; i ++ ) { + + this.lensFlares.push( source.lensFlares[ i ] ); + + } + + return this; + + }, + + add: function ( texture, size, distance, blending, color, opacity ) { + + if ( size === undefined ) size = - 1; + if ( distance === undefined ) distance = 0; + if ( opacity === undefined ) opacity = 1; + if ( color === undefined ) color = new Color( 0xffffff ); + if ( blending === undefined ) blending = NormalBlending; + + distance = Math.min( distance, Math.max( 0, distance ) ); + + this.lensFlares.push( { + texture: texture, // THREE.Texture + size: size, // size in pixels (-1 = use texture.width) + distance: distance, // distance (0-1) from light source (0=at light source) + x: 0, y: 0, z: 0, // screen position (-1 => 1) z = 0 is in front z = 1 is back + scale: 1, // scale + rotation: 0, // rotation + opacity: opacity, // opacity + color: color, // color + blending: blending // blending + } ); + + }, + + /* + * Update lens flares update positions on all flares based on the screen position + * Set myLensFlare.customUpdateCallback to alter the flares in your project specific way. + */ + + updateLensFlares: function () { + + var f, fl = this.lensFlares.length; + var flare; + var vecX = - this.positionScreen.x * 2; + var vecY = - this.positionScreen.y * 2; + + for ( f = 0; f < fl; f ++ ) { + + flare = this.lensFlares[ f ]; + + flare.x = this.positionScreen.x + vecX * flare.distance; + flare.y = this.positionScreen.y + vecY * flare.distance; + + flare.wantedRotation = flare.x * Math.PI * 0.25; + flare.rotation += ( flare.wantedRotation - flare.rotation ) * 0.25; + + } + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: <hex>, + * opacity: <float>, + * map: new THREE.Texture( <Image> ), + * + * uvOffset: new THREE.Vector2(), + * uvScale: new THREE.Vector2() + * } + */ + + function SpriteMaterial( parameters ) { + + Material.call( this ); + + this.type = 'SpriteMaterial'; + + this.color = new Color( 0xffffff ); + this.map = null; + + this.rotation = 0; + + this.fog = false; + this.lights = false; + + this.setValues( parameters ); + + } + + SpriteMaterial.prototype = Object.create( Material.prototype ); + SpriteMaterial.prototype.constructor = SpriteMaterial; + SpriteMaterial.prototype.isSpriteMaterial = true; + + SpriteMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + this.map = source.map; + + this.rotation = source.rotation; + + return this; + + }; + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + */ + + function Sprite( material ) { + + Object3D.call( this ); + + this.type = 'Sprite'; + + this.material = ( material !== undefined ) ? material : new SpriteMaterial(); + + } + + Sprite.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Sprite, + + isSprite: true, + + raycast: ( function () { + + var intersectPoint = new Vector3(); + var worldPosition = new Vector3(); + var worldScale = new Vector3(); + + return function raycast( raycaster, intersects ) { + + worldPosition.setFromMatrixPosition( this.matrixWorld ); + raycaster.ray.closestPointToPoint( worldPosition, intersectPoint ); + + worldScale.setFromMatrixScale( this.matrixWorld ); + var guessSizeSq = worldScale.x * worldScale.y / 4; + + if ( worldPosition.distanceToSquared( intersectPoint ) > guessSizeSq ) return; + + var distance = raycaster.ray.origin.distanceTo( intersectPoint ); + + if ( distance < raycaster.near || distance > raycaster.far ) return; + + intersects.push( { + + distance: distance, + point: intersectPoint.clone(), + face: null, + object: this + + } ); + + }; + + }() ), + + clone: function () { + + return new this.constructor( this.material ).copy( this ); + + } + + } ); + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + function LOD() { + + Object3D.call( this ); + + this.type = 'LOD'; + + Object.defineProperties( this, { + levels: { + enumerable: true, + value: [] + } + } ); + + } + + LOD.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: LOD, + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source, false ); + + var levels = source.levels; + + for ( var i = 0, l = levels.length; i < l; i ++ ) { + + var level = levels[ i ]; + + this.addLevel( level.object.clone(), level.distance ); + + } + + return this; + + }, + + addLevel: function ( object, distance ) { + + if ( distance === undefined ) distance = 0; + + distance = Math.abs( distance ); + + var levels = this.levels; + + for ( var l = 0; l < levels.length; l ++ ) { + + if ( distance < levels[ l ].distance ) { + + break; + + } + + } + + levels.splice( l, 0, { distance: distance, object: object } ); + + this.add( object ); + + }, + + getObjectForDistance: function ( distance ) { + + var levels = this.levels; + + for ( var i = 1, l = levels.length; i < l; i ++ ) { + + if ( distance < levels[ i ].distance ) { + + break; + + } + + } + + return levels[ i - 1 ].object; + + }, + + raycast: ( function () { + + var matrixPosition = new Vector3(); + + return function raycast( raycaster, intersects ) { + + matrixPosition.setFromMatrixPosition( this.matrixWorld ); + + var distance = raycaster.ray.origin.distanceTo( matrixPosition ); + + this.getObjectForDistance( distance ).raycast( raycaster, intersects ); + + }; + + }() ), + + update: function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + + return function update( camera ) { + + var levels = this.levels; + + if ( levels.length > 1 ) { + + v1.setFromMatrixPosition( camera.matrixWorld ); + v2.setFromMatrixPosition( this.matrixWorld ); + + var distance = v1.distanceTo( v2 ); + + levels[ 0 ].object.visible = true; + + for ( var i = 1, l = levels.length; i < l; i ++ ) { + + if ( distance >= levels[ i ].distance ) { + + levels[ i - 1 ].object.visible = false; + levels[ i ].object.visible = true; + + } else { + + break; + + } + + } + + for ( ; i < l; i ++ ) { + + levels[ i ].object.visible = false; + + } + + } + + }; + + }(), + + toJSON: function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + data.object.levels = []; + + var levels = this.levels; + + for ( var i = 0, l = levels.length; i < l; i ++ ) { + + var level = levels[ i ]; + + data.object.levels.push( { + object: level.object.uuid, + distance: level.distance + } ); + + } + + return data; + + } + + } ); + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author michael guerrero / http://realitymeltdown.com + * @author ikerr / http://verold.com + */ + + function Skeleton( bones, boneInverses ) { + + // copy the bone array + + bones = bones || []; + + this.bones = bones.slice( 0 ); + this.boneMatrices = new Float32Array( this.bones.length * 16 ); + + // use the supplied bone inverses or calculate the inverses + + if ( boneInverses === undefined ) { + + this.calculateInverses(); + + } else { + + if ( this.bones.length === boneInverses.length ) { + + this.boneInverses = boneInverses.slice( 0 ); + + } else { + + console.warn( 'THREE.Skeleton boneInverses is the wrong length.' ); + + this.boneInverses = []; + + for ( var i = 0, il = this.bones.length; i < il; i ++ ) { + + this.boneInverses.push( new Matrix4() ); + + } + + } + + } + + } + + Object.assign( Skeleton.prototype, { + + calculateInverses: function () { + + this.boneInverses = []; + + for ( var i = 0, il = this.bones.length; i < il; i ++ ) { + + var inverse = new Matrix4(); + + if ( this.bones[ i ] ) { + + inverse.getInverse( this.bones[ i ].matrixWorld ); + + } + + this.boneInverses.push( inverse ); + + } + + }, + + pose: function () { + + var bone, i, il; + + // recover the bind-time world matrices + + for ( i = 0, il = this.bones.length; i < il; i ++ ) { + + bone = this.bones[ i ]; + + if ( bone ) { + + bone.matrixWorld.getInverse( this.boneInverses[ i ] ); + + } + + } + + // compute the local matrices, positions, rotations and scales + + for ( i = 0, il = this.bones.length; i < il; i ++ ) { + + bone = this.bones[ i ]; + + if ( bone ) { + + if ( bone.parent && bone.parent.isBone ) { + + bone.matrix.getInverse( bone.parent.matrixWorld ); + bone.matrix.multiply( bone.matrixWorld ); + + } else { + + bone.matrix.copy( bone.matrixWorld ); + + } + + bone.matrix.decompose( bone.position, bone.quaternion, bone.scale ); + + } + + } + + }, + + update: ( function () { + + var offsetMatrix = new Matrix4(); + var identityMatrix = new Matrix4(); + + return function update() { + + var bones = this.bones; + var boneInverses = this.boneInverses; + var boneMatrices = this.boneMatrices; + var boneTexture = this.boneTexture; + + // flatten bone matrices to array + + for ( var i = 0, il = bones.length; i < il; i ++ ) { + + // compute the offset between the current and the original transform + + var matrix = bones[ i ] ? bones[ i ].matrixWorld : identityMatrix; + + offsetMatrix.multiplyMatrices( matrix, boneInverses[ i ] ); + offsetMatrix.toArray( boneMatrices, i * 16 ); + + } + + if ( boneTexture !== undefined ) { + + boneTexture.needsUpdate = true; + + } + + }; + + } )(), + + clone: function () { + + return new Skeleton( this.bones, this.boneInverses ); + + } + + } ); + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author ikerr / http://verold.com + */ + + function Bone() { + + Object3D.call( this ); + + this.type = 'Bone'; + + } + + Bone.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Bone, + + isBone: true + + } ); + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author ikerr / http://verold.com + */ + + function SkinnedMesh( geometry, material ) { + + Mesh.call( this, geometry, material ); + + this.type = 'SkinnedMesh'; + + this.bindMode = 'attached'; + this.bindMatrix = new Matrix4(); + this.bindMatrixInverse = new Matrix4(); + + var bones = this.initBones(); + var skeleton = new Skeleton( bones ); + + this.bind( skeleton, this.matrixWorld ); + + this.normalizeSkinWeights(); + + } + + SkinnedMesh.prototype = Object.assign( Object.create( Mesh.prototype ), { + + constructor: SkinnedMesh, + + isSkinnedMesh: true, + + initBones: function () { + + var bones = [], bone, gbone; + var i, il; + + if ( this.geometry && this.geometry.bones !== undefined ) { + + // first, create array of 'Bone' objects from geometry data + + for ( i = 0, il = this.geometry.bones.length; i < il; i ++ ) { + + gbone = this.geometry.bones[ i ]; + + // create new 'Bone' object + + bone = new Bone(); + bones.push( bone ); + + // apply values + + bone.name = gbone.name; + bone.position.fromArray( gbone.pos ); + bone.quaternion.fromArray( gbone.rotq ); + if ( gbone.scl !== undefined ) bone.scale.fromArray( gbone.scl ); + + } + + // second, create bone hierarchy + + for ( i = 0, il = this.geometry.bones.length; i < il; i ++ ) { + + gbone = this.geometry.bones[ i ]; + + if ( ( gbone.parent !== - 1 ) && ( gbone.parent !== null ) && ( bones[ gbone.parent ] !== undefined ) ) { + + // subsequent bones in the hierarchy + + bones[ gbone.parent ].add( bones[ i ] ); + + } else { + + // topmost bone, immediate child of the skinned mesh + + this.add( bones[ i ] ); + + } + + } + + } + + // now the bones are part of the scene graph and children of the skinned mesh. + // let's update the corresponding matrices + + this.updateMatrixWorld( true ); + + return bones; + + }, + + bind: function ( skeleton, bindMatrix ) { + + this.skeleton = skeleton; + + if ( bindMatrix === undefined ) { + + this.updateMatrixWorld( true ); + + this.skeleton.calculateInverses(); + + bindMatrix = this.matrixWorld; + + } + + this.bindMatrix.copy( bindMatrix ); + this.bindMatrixInverse.getInverse( bindMatrix ); + + }, + + pose: function () { + + this.skeleton.pose(); + + }, + + normalizeSkinWeights: function () { + + var scale, i; + + if ( this.geometry && this.geometry.isGeometry ) { + + for ( i = 0; i < this.geometry.skinWeights.length; i ++ ) { + + var sw = this.geometry.skinWeights[ i ]; + + scale = 1.0 / sw.lengthManhattan(); + + if ( scale !== Infinity ) { + + sw.multiplyScalar( scale ); + + } else { + + sw.set( 1, 0, 0, 0 ); // do something reasonable + + } + + } + + } else if ( this.geometry && this.geometry.isBufferGeometry ) { + + var vec = new Vector4(); + + var skinWeight = this.geometry.attributes.skinWeight; + + for ( i = 0; i < skinWeight.count; i ++ ) { + + vec.x = skinWeight.getX( i ); + vec.y = skinWeight.getY( i ); + vec.z = skinWeight.getZ( i ); + vec.w = skinWeight.getW( i ); + + scale = 1.0 / vec.lengthManhattan(); + + if ( scale !== Infinity ) { + + vec.multiplyScalar( scale ); + + } else { + + vec.set( 1, 0, 0, 0 ); // do something reasonable + + } + + skinWeight.setXYZW( i, vec.x, vec.y, vec.z, vec.w ); + + } + + } + + }, + + updateMatrixWorld: function ( force ) { + + Mesh.prototype.updateMatrixWorld.call( this, force ); + + if ( this.bindMode === 'attached' ) { + + this.bindMatrixInverse.getInverse( this.matrixWorld ); + + } else if ( this.bindMode === 'detached' ) { + + this.bindMatrixInverse.getInverse( this.bindMatrix ); + + } else { + + console.warn( 'THREE.SkinnedMesh: Unrecognized bindMode: ' + this.bindMode ); + + } + + }, + + clone: function () { + + return new this.constructor( this.geometry, this.material ).copy( this ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: <hex>, + * opacity: <float>, + * + * linewidth: <float>, + * linecap: "round", + * linejoin: "round" + * } + */ + + function LineBasicMaterial( parameters ) { + + Material.call( this ); + + this.type = 'LineBasicMaterial'; + + this.color = new Color( 0xffffff ); + + this.linewidth = 1; + this.linecap = 'round'; + this.linejoin = 'round'; + + this.lights = false; + + this.setValues( parameters ); + + } + + LineBasicMaterial.prototype = Object.create( Material.prototype ); + LineBasicMaterial.prototype.constructor = LineBasicMaterial; + + LineBasicMaterial.prototype.isLineBasicMaterial = true; + + LineBasicMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.linewidth = source.linewidth; + this.linecap = source.linecap; + this.linejoin = source.linejoin; + + return this; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Line( geometry, material, mode ) { + + if ( mode === 1 ) { + + console.warn( 'THREE.Line: parameter THREE.LinePieces no longer supported. Created THREE.LineSegments instead.' ); + return new LineSegments( geometry, material ); + + } + + Object3D.call( this ); + + this.type = 'Line'; + + this.geometry = geometry !== undefined ? geometry : new BufferGeometry(); + this.material = material !== undefined ? material : new LineBasicMaterial( { color: Math.random() * 0xffffff } ); + + } + + Line.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Line, + + isLine: true, + + raycast: ( function () { + + var inverseMatrix = new Matrix4(); + var ray = new Ray(); + var sphere = new Sphere(); + + return function raycast( raycaster, intersects ) { + + var precision = raycaster.linePrecision; + var precisionSq = precision * precision; + + var geometry = this.geometry; + var matrixWorld = this.matrixWorld; + + // Checking boundingSphere distance to ray + + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); + + sphere.copy( geometry.boundingSphere ); + sphere.applyMatrix4( matrixWorld ); + + if ( raycaster.ray.intersectsSphere( sphere ) === false ) return; + + // + + inverseMatrix.getInverse( matrixWorld ); + ray.copy( raycaster.ray ).applyMatrix4( inverseMatrix ); + + var vStart = new Vector3(); + var vEnd = new Vector3(); + var interSegment = new Vector3(); + var interRay = new Vector3(); + var step = (this && this.isLineSegments) ? 2 : 1; + + if ( geometry.isBufferGeometry ) { + + var index = geometry.index; + var attributes = geometry.attributes; + var positions = attributes.position.array; + + if ( index !== null ) { + + var indices = index.array; + + for ( var i = 0, l = indices.length - 1; i < l; i += step ) { + + var a = indices[ i ]; + var b = indices[ i + 1 ]; + + vStart.fromArray( positions, a * 3 ); + vEnd.fromArray( positions, b * 3 ); + + var distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment ); + + if ( distSq > precisionSq ) continue; + + interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation + + var distance = raycaster.ray.origin.distanceTo( interRay ); + + if ( distance < raycaster.near || distance > raycaster.far ) continue; + + intersects.push( { + + distance: distance, + // What do we want? intersection point on the ray or on the segment?? + // point: raycaster.ray.at( distance ), + point: interSegment.clone().applyMatrix4( this.matrixWorld ), + index: i, + face: null, + faceIndex: null, + object: this + + } ); + + } + + } else { + + for ( var i = 0, l = positions.length / 3 - 1; i < l; i += step ) { + + vStart.fromArray( positions, 3 * i ); + vEnd.fromArray( positions, 3 * i + 3 ); + + var distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment ); + + if ( distSq > precisionSq ) continue; + + interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation + + var distance = raycaster.ray.origin.distanceTo( interRay ); + + if ( distance < raycaster.near || distance > raycaster.far ) continue; + + intersects.push( { + + distance: distance, + // What do we want? intersection point on the ray or on the segment?? + // point: raycaster.ray.at( distance ), + point: interSegment.clone().applyMatrix4( this.matrixWorld ), + index: i, + face: null, + faceIndex: null, + object: this + + } ); + + } + + } + + } else if ( geometry.isGeometry ) { + + var vertices = geometry.vertices; + var nbVertices = vertices.length; + + for ( var i = 0; i < nbVertices - 1; i += step ) { + + var distSq = ray.distanceSqToSegment( vertices[ i ], vertices[ i + 1 ], interRay, interSegment ); + + if ( distSq > precisionSq ) continue; + + interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation + + var distance = raycaster.ray.origin.distanceTo( interRay ); + + if ( distance < raycaster.near || distance > raycaster.far ) continue; + + intersects.push( { + + distance: distance, + // What do we want? intersection point on the ray or on the segment?? + // point: raycaster.ray.at( distance ), + point: interSegment.clone().applyMatrix4( this.matrixWorld ), + index: i, + face: null, + faceIndex: null, + object: this + + } ); + + } + + } + + }; + + }() ), + + clone: function () { + + return new this.constructor( this.geometry, this.material ).copy( this ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function LineSegments( geometry, material ) { + + Line.call( this, geometry, material ); + + this.type = 'LineSegments'; + + } + + LineSegments.prototype = Object.assign( Object.create( Line.prototype ), { + + constructor: LineSegments, + + isLineSegments: true + + } ); + + /** + * @author mgreter / http://github.com/mgreter + */ + + function LineLoop( geometry, material ) { + + Line.call( this, geometry, material ); + + this.type = 'LineLoop'; + + } + + LineLoop.prototype = Object.assign( Object.create( Line.prototype ), { + + constructor: LineLoop, + + isLineLoop: true, + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: <hex>, + * opacity: <float>, + * map: new THREE.Texture( <Image> ), + * + * size: <float>, + * sizeAttenuation: <bool> + * } + */ + + function PointsMaterial( parameters ) { + + Material.call( this ); + + this.type = 'PointsMaterial'; + + this.color = new Color( 0xffffff ); + + this.map = null; + + this.size = 1; + this.sizeAttenuation = true; + + this.lights = false; + + this.setValues( parameters ); + + } + + PointsMaterial.prototype = Object.create( Material.prototype ); + PointsMaterial.prototype.constructor = PointsMaterial; + + PointsMaterial.prototype.isPointsMaterial = true; + + PointsMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.map = source.map; + + this.size = source.size; + this.sizeAttenuation = source.sizeAttenuation; + + return this; + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function Points( geometry, material ) { + + Object3D.call( this ); + + this.type = 'Points'; + + this.geometry = geometry !== undefined ? geometry : new BufferGeometry(); + this.material = material !== undefined ? material : new PointsMaterial( { color: Math.random() * 0xffffff } ); + + } + + Points.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Points, + + isPoints: true, + + raycast: ( function () { + + var inverseMatrix = new Matrix4(); + var ray = new Ray(); + var sphere = new Sphere(); + + return function raycast( raycaster, intersects ) { + + var object = this; + var geometry = this.geometry; + var matrixWorld = this.matrixWorld; + var threshold = raycaster.params.Points.threshold; + + // Checking boundingSphere distance to ray + + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); + + sphere.copy( geometry.boundingSphere ); + sphere.applyMatrix4( matrixWorld ); + sphere.radius += threshold; + + if ( raycaster.ray.intersectsSphere( sphere ) === false ) return; + + // + + inverseMatrix.getInverse( matrixWorld ); + ray.copy( raycaster.ray ).applyMatrix4( inverseMatrix ); + + var localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 ); + var localThresholdSq = localThreshold * localThreshold; + var position = new Vector3(); + + function testPoint( point, index ) { + + var rayPointDistanceSq = ray.distanceSqToPoint( point ); + + if ( rayPointDistanceSq < localThresholdSq ) { + + var intersectPoint = ray.closestPointToPoint( point ); + intersectPoint.applyMatrix4( matrixWorld ); + + var distance = raycaster.ray.origin.distanceTo( intersectPoint ); + + if ( distance < raycaster.near || distance > raycaster.far ) return; + + intersects.push( { + + distance: distance, + distanceToRay: Math.sqrt( rayPointDistanceSq ), + point: intersectPoint.clone(), + index: index, + face: null, + object: object + + } ); + + } + + } + + if ( geometry.isBufferGeometry ) { + + var index = geometry.index; + var attributes = geometry.attributes; + var positions = attributes.position.array; + + if ( index !== null ) { + + var indices = index.array; + + for ( var i = 0, il = indices.length; i < il; i ++ ) { + + var a = indices[ i ]; + + position.fromArray( positions, a * 3 ); + + testPoint( position, a ); + + } + + } else { + + for ( var i = 0, l = positions.length / 3; i < l; i ++ ) { + + position.fromArray( positions, i * 3 ); + + testPoint( position, i ); + + } + + } + + } else { + + var vertices = geometry.vertices; + + for ( var i = 0, l = vertices.length; i < l; i ++ ) { + + testPoint( vertices[ i ], i ); + + } + + } + + }; + + }() ), + + clone: function () { + + return new this.constructor( this.geometry, this.material ).copy( this ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Group() { + + Object3D.call( this ); + + this.type = 'Group'; + + } + + Group.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Group + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function VideoTexture( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) { + + Texture.call( this, video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + + this.generateMipmaps = false; + + var scope = this; + + function update() { + + requestAnimationFrame( update ); + + if ( video.readyState >= video.HAVE_CURRENT_DATA ) { + + scope.needsUpdate = true; + + } + + } + + update(); + + } + + VideoTexture.prototype = Object.create( Texture.prototype ); + VideoTexture.prototype.constructor = VideoTexture; + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function CompressedTexture( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) { + + Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ); + + this.image = { width: width, height: height }; + this.mipmaps = mipmaps; + + // no flipping for cube textures + // (also flipping doesn't work for compressed textures ) + + this.flipY = false; + + // can't generate mipmaps for compressed textures + // mips must be embedded in DDS files + + this.generateMipmaps = false; + + } + + CompressedTexture.prototype = Object.create( Texture.prototype ); + CompressedTexture.prototype.constructor = CompressedTexture; + + CompressedTexture.prototype.isCompressedTexture = true; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function CanvasTexture( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) { + + Texture.call( this, canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + + this.needsUpdate = true; + + } + + CanvasTexture.prototype = Object.create( Texture.prototype ); + CanvasTexture.prototype.constructor = CanvasTexture; + + /** + * @author Matt DesLauriers / @mattdesl + * @author atix / arthursilber.de + */ + + function DepthTexture( width, height, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, format ) { + + format = format !== undefined ? format : DepthFormat; + + if ( format !== DepthFormat && format !== DepthStencilFormat ) { + + throw new Error( 'DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat' ) + + } + + if ( type === undefined && format === DepthFormat ) type = UnsignedShortType; + if ( type === undefined && format === DepthStencilFormat ) type = UnsignedInt248Type; + + Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + + this.image = { width: width, height: height }; + + this.magFilter = magFilter !== undefined ? magFilter : NearestFilter; + this.minFilter = minFilter !== undefined ? minFilter : NearestFilter; + + this.flipY = false; + this.generateMipmaps = false; + + } + + DepthTexture.prototype = Object.create( Texture.prototype ); + DepthTexture.prototype.constructor = DepthTexture; + DepthTexture.prototype.isDepthTexture = true; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + + function WireframeGeometry( geometry ) { + + BufferGeometry.call( this ); + + this.type = 'WireframeGeometry'; + + // buffer + + var vertices = []; + + // helper variables + + var i, j, l, o, ol; + var edge = [ 0, 0 ], edges = {}, e, edge1, edge2; + var key, keys = [ 'a', 'b', 'c' ]; + var vertex; + + // different logic for Geometry and BufferGeometry + + if ( geometry && geometry.isGeometry ) { + + // create a data structure that contains all edges without duplicates + + var faces = geometry.faces; + + for ( i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + for ( j = 0; j < 3; j ++ ) { + + edge1 = face[ keys[ j ] ]; + edge2 = face[ keys[ ( j + 1 ) % 3 ] ]; + edge[ 0 ] = Math.min( edge1, edge2 ); // sorting prevents duplicates + edge[ 1 ] = Math.max( edge1, edge2 ); + + key = edge[ 0 ] + ',' + edge[ 1 ]; + + if ( edges[ key ] === undefined ) { + + edges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] }; + + } + + } + + } + + // generate vertices + + for ( key in edges ) { + + e = edges[ key ]; + + vertex = geometry.vertices[ e.index1 ]; + vertices.push( vertex.x, vertex.y, vertex.z ); + + vertex = geometry.vertices[ e.index2 ]; + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + } else if ( geometry && geometry.isBufferGeometry ) { + + var position, indices, groups; + var group, start, count; + var index1, index2; + + vertex = new Vector3(); + + if ( geometry.index !== null ) { + + // indexed BufferGeometry + + position = geometry.attributes.position; + indices = geometry.index; + groups = geometry.groups; + + if ( groups.length === 0 ) { + + groups = [ { start: 0, count: indices.count, materialIndex: 0 } ]; + + } + + // create a data structure that contains all eges without duplicates + + for ( o = 0, ol = groups.length; o < ol; ++ o ) { + + group = groups[ o ]; + + start = group.start; + count = group.count; + + for ( i = start, l = ( start + count ); i < l; i += 3 ) { + + for ( j = 0; j < 3; j ++ ) { + + edge1 = indices.getX( i + j ); + edge2 = indices.getX( i + ( j + 1 ) % 3 ); + edge[ 0 ] = Math.min( edge1, edge2 ); // sorting prevents duplicates + edge[ 1 ] = Math.max( edge1, edge2 ); + + key = edge[ 0 ] + ',' + edge[ 1 ]; + + if ( edges[ key ] === undefined ) { + + edges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] }; + + } + + } + + } + + } + + // generate vertices + + for ( key in edges ) { + + e = edges[ key ]; + + vertex.fromBufferAttribute( position, e.index1 ); + vertices.push( vertex.x, vertex.y, vertex.z ); + + vertex.fromBufferAttribute( position, e.index2 ); + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + } else { + + // non-indexed BufferGeometry + + position = geometry.attributes.position; + + for ( i = 0, l = ( position.count / 3 ); i < l; i ++ ) { + + for ( j = 0; j < 3; j ++ ) { + + // three edges per triangle, an edge is represented as (index1, index2) + // e.g. the first triangle has the following edges: (0,1),(1,2),(2,0) + + index1 = 3 * i + j; + vertex.fromBufferAttribute( position, index1 ); + vertices.push( vertex.x, vertex.y, vertex.z ); + + index2 = 3 * i + ( ( j + 1 ) % 3 ); + vertex.fromBufferAttribute( position, index2 ); + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + } + + } + + } + + // build geometry + + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + + } + + WireframeGeometry.prototype = Object.create( BufferGeometry.prototype ); + WireframeGeometry.prototype.constructor = WireframeGeometry; + + /** + * @author zz85 / https://github.com/zz85 + * @author Mugen87 / https://github.com/Mugen87 + * + * Parametric Surfaces Geometry + * based on the brilliant article by @prideout http://prideout.net/blog/?p=44 + */ + + // ParametricGeometry + + function ParametricGeometry( func, slices, stacks ) { + + Geometry.call( this ); + + this.type = 'ParametricGeometry'; + + this.parameters = { + func: func, + slices: slices, + stacks: stacks + }; + + this.fromBufferGeometry( new ParametricBufferGeometry( func, slices, stacks ) ); + this.mergeVertices(); + + } + + ParametricGeometry.prototype = Object.create( Geometry.prototype ); + ParametricGeometry.prototype.constructor = ParametricGeometry; + + // ParametricBufferGeometry + + function ParametricBufferGeometry( func, slices, stacks ) { + + BufferGeometry.call( this ); + + this.type = 'ParametricBufferGeometry'; + + this.parameters = { + func: func, + slices: slices, + stacks: stacks + }; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + var EPS = 0.00001; + + var normal = new Vector3(); + + var p0 = new Vector3(), p1 = new Vector3(); + var pu = new Vector3(), pv = new Vector3(); + + var i, j; + + // generate vertices, normals and uvs + + var sliceCount = slices + 1; + + for ( i = 0; i <= stacks; i ++ ) { + + var v = i / stacks; + + for ( j = 0; j <= slices; j ++ ) { + + var u = j / slices; + + // vertex + + p0 = func( u, v, p0 ); + vertices.push( p0.x, p0.y, p0.z ); + + // normal + + // approximate tangent vectors via finite differences + + if ( u - EPS >= 0 ) { + + p1 = func( u - EPS, v, p1 ); + pu.subVectors( p0, p1 ); + + } else { + + p1 = func( u + EPS, v, p1 ); + pu.subVectors( p1, p0 ); + + } + + if ( v - EPS >= 0 ) { + + p1 = func( u, v - EPS, p1 ); + pv.subVectors( p0, p1 ); + + } else { + + p1 = func( u, v + EPS, p1 ); + pv.subVectors( p1, p0 ); + + } + + // cross product of tangent vectors returns surface normal + + normal.crossVectors( pu, pv ).normalize(); + normals.push( normal.x, normal.y, normal.z ); + + // uv + + uvs.push( u, v ); + + } + + } + + // generate indices + + for ( i = 0; i < stacks; i ++ ) { + + for ( j = 0; j < slices; j ++ ) { + + var a = i * sliceCount + j; + var b = i * sliceCount + j + 1; + var c = ( i + 1 ) * sliceCount + j + 1; + var d = ( i + 1 ) * sliceCount + j; + + // faces one and two + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + ParametricBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + ParametricBufferGeometry.prototype.constructor = ParametricBufferGeometry; + + /** + * @author clockworkgeek / https://github.com/clockworkgeek + * @author timothypratley / https://github.com/timothypratley + * @author WestLangley / http://github.com/WestLangley + * @author Mugen87 / https://github.com/Mugen87 + */ + + // PolyhedronGeometry + + function PolyhedronGeometry( vertices, indices, radius, detail ) { + + Geometry.call( this ); + + this.type = 'PolyhedronGeometry'; + + this.parameters = { + vertices: vertices, + indices: indices, + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new PolyhedronBufferGeometry( vertices, indices, radius, detail ) ); + this.mergeVertices(); + + } + + PolyhedronGeometry.prototype = Object.create( Geometry.prototype ); + PolyhedronGeometry.prototype.constructor = PolyhedronGeometry; + + // PolyhedronBufferGeometry + + function PolyhedronBufferGeometry( vertices, indices, radius, detail ) { + + BufferGeometry.call( this ); + + this.type = 'PolyhedronBufferGeometry'; + + this.parameters = { + vertices: vertices, + indices: indices, + radius: radius, + detail: detail + }; + + radius = radius || 1; + detail = detail || 0; + + // default buffer data + + var vertexBuffer = []; + var uvBuffer = []; + + // the subdivision creates the vertex buffer data + + subdivide( detail ); + + // all vertices should lie on a conceptual sphere with a given radius + + appplyRadius( radius ); + + // finally, create the uv data + + generateUVs(); + + // build non-indexed geometry + + this.addAttribute( 'position', new Float32BufferAttribute( vertexBuffer, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( vertexBuffer.slice(), 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvBuffer, 2 ) ); + + if ( detail === 0 ) { + + this.computeVertexNormals(); // flat normals + + } else { + + this.normalizeNormals(); // smooth normals + + } + + // helper functions + + function subdivide( detail ) { + + var a = new Vector3(); + var b = new Vector3(); + var c = new Vector3(); + + // iterate over all faces and apply a subdivison with the given detail value + + for ( var i = 0; i < indices.length; i += 3 ) { + + // get the vertices of the face + + getVertexByIndex( indices[ i + 0 ], a ); + getVertexByIndex( indices[ i + 1 ], b ); + getVertexByIndex( indices[ i + 2 ], c ); + + // perform subdivision + + subdivideFace( a, b, c, detail ); + + } + + } + + function subdivideFace( a, b, c, detail ) { + + var cols = Math.pow( 2, detail ); + + // we use this multidimensional array as a data structure for creating the subdivision + + var v = []; + + var i, j; + + // construct all of the vertices for this subdivision + + for ( i = 0; i <= cols; i ++ ) { + + v[ i ] = []; + + var aj = a.clone().lerp( c, i / cols ); + var bj = b.clone().lerp( c, i / cols ); + + var rows = cols - i; + + for ( j = 0; j <= rows; j ++ ) { + + if ( j === 0 && i === cols ) { + + v[ i ][ j ] = aj; + + } else { + + v[ i ][ j ] = aj.clone().lerp( bj, j / rows ); + + } + + } + + } + + // construct all of the faces + + for ( i = 0; i < cols; i ++ ) { + + for ( j = 0; j < 2 * ( cols - i ) - 1; j ++ ) { + + var k = Math.floor( j / 2 ); + + if ( j % 2 === 0 ) { + + pushVertex( v[ i ][ k + 1 ] ); + pushVertex( v[ i + 1 ][ k ] ); + pushVertex( v[ i ][ k ] ); + + } else { + + pushVertex( v[ i ][ k + 1 ] ); + pushVertex( v[ i + 1 ][ k + 1 ] ); + pushVertex( v[ i + 1 ][ k ] ); + + } + + } + + } + + } + + function appplyRadius( radius ) { + + var vertex = new Vector3(); + + // iterate over the entire buffer and apply the radius to each vertex + + for ( var i = 0; i < vertexBuffer.length; i += 3 ) { + + vertex.x = vertexBuffer[ i + 0 ]; + vertex.y = vertexBuffer[ i + 1 ]; + vertex.z = vertexBuffer[ i + 2 ]; + + vertex.normalize().multiplyScalar( radius ); + + vertexBuffer[ i + 0 ] = vertex.x; + vertexBuffer[ i + 1 ] = vertex.y; + vertexBuffer[ i + 2 ] = vertex.z; + + } + + } + + function generateUVs() { + + var vertex = new Vector3(); + + for ( var i = 0; i < vertexBuffer.length; i += 3 ) { + + vertex.x = vertexBuffer[ i + 0 ]; + vertex.y = vertexBuffer[ i + 1 ]; + vertex.z = vertexBuffer[ i + 2 ]; + + var u = azimuth( vertex ) / 2 / Math.PI + 0.5; + var v = inclination( vertex ) / Math.PI + 0.5; + uvBuffer.push( u, 1 - v ); + + } + + correctUVs(); + + correctSeam(); + + } + + function correctSeam() { + + // handle case when face straddles the seam, see #3269 + + for ( var i = 0; i < uvBuffer.length; i += 6 ) { + + // uv data of a single face + + var x0 = uvBuffer[ i + 0 ]; + var x1 = uvBuffer[ i + 2 ]; + var x2 = uvBuffer[ i + 4 ]; + + var max = Math.max( x0, x1, x2 ); + var min = Math.min( x0, x1, x2 ); + + // 0.9 is somewhat arbitrary + + if ( max > 0.9 && min < 0.1 ) { + + if ( x0 < 0.2 ) uvBuffer[ i + 0 ] += 1; + if ( x1 < 0.2 ) uvBuffer[ i + 2 ] += 1; + if ( x2 < 0.2 ) uvBuffer[ i + 4 ] += 1; + + } + + } + + } + + function pushVertex( vertex ) { + + vertexBuffer.push( vertex.x, vertex.y, vertex.z ); + + } + + function getVertexByIndex( index, vertex ) { + + var stride = index * 3; + + vertex.x = vertices[ stride + 0 ]; + vertex.y = vertices[ stride + 1 ]; + vertex.z = vertices[ stride + 2 ]; + + } + + function correctUVs() { + + var a = new Vector3(); + var b = new Vector3(); + var c = new Vector3(); + + var centroid = new Vector3(); + + var uvA = new Vector2(); + var uvB = new Vector2(); + var uvC = new Vector2(); + + for ( var i = 0, j = 0; i < vertexBuffer.length; i += 9, j += 6 ) { + + a.set( vertexBuffer[ i + 0 ], vertexBuffer[ i + 1 ], vertexBuffer[ i + 2 ] ); + b.set( vertexBuffer[ i + 3 ], vertexBuffer[ i + 4 ], vertexBuffer[ i + 5 ] ); + c.set( vertexBuffer[ i + 6 ], vertexBuffer[ i + 7 ], vertexBuffer[ i + 8 ] ); + + uvA.set( uvBuffer[ j + 0 ], uvBuffer[ j + 1 ] ); + uvB.set( uvBuffer[ j + 2 ], uvBuffer[ j + 3 ] ); + uvC.set( uvBuffer[ j + 4 ], uvBuffer[ j + 5 ] ); + + centroid.copy( a ).add( b ).add( c ).divideScalar( 3 ); + + var azi = azimuth( centroid ); + + correctUV( uvA, j + 0, a, azi ); + correctUV( uvB, j + 2, b, azi ); + correctUV( uvC, j + 4, c, azi ); + + } + + } + + function correctUV( uv, stride, vector, azimuth ) { + + if ( ( azimuth < 0 ) && ( uv.x === 1 ) ) { + + uvBuffer[ stride ] = uv.x - 1; + + } + + if ( ( vector.x === 0 ) && ( vector.z === 0 ) ) { + + uvBuffer[ stride ] = azimuth / 2 / Math.PI + 0.5; + + } + + } + + // Angle around the Y axis, counter-clockwise when looking from above. + + function azimuth( vector ) { + + return Math.atan2( vector.z, - vector.x ); + + } + + + // Angle above the XZ plane. + + function inclination( vector ) { + + return Math.atan2( - vector.y, Math.sqrt( ( vector.x * vector.x ) + ( vector.z * vector.z ) ) ); + + } + + } + + PolyhedronBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + PolyhedronBufferGeometry.prototype.constructor = PolyhedronBufferGeometry; + + /** + * @author timothypratley / https://github.com/timothypratley + * @author Mugen87 / https://github.com/Mugen87 + */ + + // TetrahedronGeometry + + function TetrahedronGeometry( radius, detail ) { + + Geometry.call( this ); + + this.type = 'TetrahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new TetrahedronBufferGeometry( radius, detail ) ); + this.mergeVertices(); + + } + + TetrahedronGeometry.prototype = Object.create( Geometry.prototype ); + TetrahedronGeometry.prototype.constructor = TetrahedronGeometry; + + // TetrahedronBufferGeometry + + function TetrahedronBufferGeometry( radius, detail ) { + + var vertices = [ + 1, 1, 1, - 1, - 1, 1, - 1, 1, - 1, 1, - 1, - 1 + ]; + + var indices = [ + 2, 1, 0, 0, 3, 2, 1, 3, 0, 2, 3, 1 + ]; + + PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail ); + + this.type = 'TetrahedronBufferGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + } + + TetrahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype ); + TetrahedronBufferGeometry.prototype.constructor = TetrahedronBufferGeometry; + + /** + * @author timothypratley / https://github.com/timothypratley + * @author Mugen87 / https://github.com/Mugen87 + */ + + // OctahedronGeometry + + function OctahedronGeometry( radius, detail ) { + + Geometry.call( this ); + + this.type = 'OctahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new OctahedronBufferGeometry( radius, detail ) ); + this.mergeVertices(); + + } + + OctahedronGeometry.prototype = Object.create( Geometry.prototype ); + OctahedronGeometry.prototype.constructor = OctahedronGeometry; + + // OctahedronBufferGeometry + + function OctahedronBufferGeometry( radius, detail ) { + + var vertices = [ + 1, 0, 0, - 1, 0, 0, 0, 1, 0, 0, - 1, 0, 0, 0, 1, 0, 0, - 1 + ]; + + var indices = [ + 0, 2, 4, 0, 4, 3, 0, 3, 5, 0, 5, 2, 1, 2, 5, 1, 5, 3, 1, 3, 4, 1, 4, 2 + ]; + + PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail ); + + this.type = 'OctahedronBufferGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + } + + OctahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype ); + OctahedronBufferGeometry.prototype.constructor = OctahedronBufferGeometry; + + /** + * @author timothypratley / https://github.com/timothypratley + * @author Mugen87 / https://github.com/Mugen87 + */ + + // IcosahedronGeometry + + function IcosahedronGeometry( radius, detail ) { + + Geometry.call( this ); + + this.type = 'IcosahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new IcosahedronBufferGeometry( radius, detail ) ); + this.mergeVertices(); + + } + + IcosahedronGeometry.prototype = Object.create( Geometry.prototype ); + IcosahedronGeometry.prototype.constructor = IcosahedronGeometry; + + // IcosahedronBufferGeometry + + function IcosahedronBufferGeometry( radius, detail ) { + + var t = ( 1 + Math.sqrt( 5 ) ) / 2; + + var vertices = [ + - 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t, 0, + 0, - 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t, + t, 0, - 1, t, 0, 1, - t, 0, - 1, - t, 0, 1 + ]; + + var indices = [ + 0, 11, 5, 0, 5, 1, 0, 1, 7, 0, 7, 10, 0, 10, 11, + 1, 5, 9, 5, 11, 4, 11, 10, 2, 10, 7, 6, 7, 1, 8, + 3, 9, 4, 3, 4, 2, 3, 2, 6, 3, 6, 8, 3, 8, 9, + 4, 9, 5, 2, 4, 11, 6, 2, 10, 8, 6, 7, 9, 8, 1 + ]; + + PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail ); + + this.type = 'IcosahedronBufferGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + } + + IcosahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype ); + IcosahedronBufferGeometry.prototype.constructor = IcosahedronBufferGeometry; + + /** + * @author Abe Pazos / https://hamoid.com + * @author Mugen87 / https://github.com/Mugen87 + */ + + // DodecahedronGeometry + + function DodecahedronGeometry( radius, detail ) { + + Geometry.call( this ); + + this.type = 'DodecahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new DodecahedronBufferGeometry( radius, detail ) ); + this.mergeVertices(); + + } + + DodecahedronGeometry.prototype = Object.create( Geometry.prototype ); + DodecahedronGeometry.prototype.constructor = DodecahedronGeometry; + + // DodecahedronBufferGeometry + + function DodecahedronBufferGeometry( radius, detail ) { + + var t = ( 1 + Math.sqrt( 5 ) ) / 2; + var r = 1 / t; + + var vertices = [ + + // (±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, + + // (0, ±1/φ, ±φ) + 0, - r, - t, 0, - r, t, + 0, r, - t, 0, r, t, + + // (±1/φ, ±φ, 0) + - r, - t, 0, - r, t, 0, + r, - t, 0, r, t, 0, + + // (±φ, 0, ±1/φ) + - t, 0, - r, t, 0, - r, + - t, 0, r, t, 0, r + ]; + + var indices = [ + 3, 11, 7, 3, 7, 15, 3, 15, 13, + 7, 19, 17, 7, 17, 6, 7, 6, 15, + 17, 4, 8, 17, 8, 10, 17, 10, 6, + 8, 0, 16, 8, 16, 2, 8, 2, 10, + 0, 12, 1, 0, 1, 18, 0, 18, 16, + 6, 10, 2, 6, 2, 13, 6, 13, 15, + 2, 16, 18, 2, 18, 3, 2, 3, 13, + 18, 1, 9, 18, 9, 11, 18, 11, 3, + 4, 14, 12, 4, 12, 0, 4, 0, 8, + 11, 9, 5, 11, 5, 19, 11, 19, 7, + 19, 5, 14, 19, 14, 4, 19, 4, 17, + 1, 12, 14, 1, 14, 5, 1, 5, 9 + ]; + + PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail ); + + this.type = 'DodecahedronBufferGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + } + + DodecahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype ); + DodecahedronBufferGeometry.prototype.constructor = DodecahedronBufferGeometry; + + /** + * @author oosmoxiecode / https://github.com/oosmoxiecode + * @author WestLangley / https://github.com/WestLangley + * @author zz85 / https://github.com/zz85 + * @author miningold / https://github.com/miningold + * @author jonobr1 / https://github.com/jonobr1 + * @author Mugen87 / https://github.com/Mugen87 + * + */ + + // TubeGeometry + + function TubeGeometry( path, tubularSegments, radius, radialSegments, closed, taper ) { + + Geometry.call( this ); + + this.type = 'TubeGeometry'; + + this.parameters = { + path: path, + tubularSegments: tubularSegments, + radius: radius, + radialSegments: radialSegments, + closed: closed + }; + + if ( taper !== undefined ) console.warn( 'THREE.TubeGeometry: taper has been removed.' ); + + var bufferGeometry = new TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed ); + + // expose internals + + this.tangents = bufferGeometry.tangents; + this.normals = bufferGeometry.normals; + this.binormals = bufferGeometry.binormals; + + // create geometry + + this.fromBufferGeometry( bufferGeometry ); + this.mergeVertices(); + + } + + TubeGeometry.prototype = Object.create( Geometry.prototype ); + TubeGeometry.prototype.constructor = TubeGeometry; + + // TubeBufferGeometry + + function TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed ) { + + BufferGeometry.call( this ); + + this.type = 'TubeBufferGeometry'; + + this.parameters = { + path: path, + tubularSegments: tubularSegments, + radius: radius, + radialSegments: radialSegments, + closed: closed + }; + + tubularSegments = tubularSegments || 64; + radius = radius || 1; + radialSegments = radialSegments || 8; + closed = closed || false; + + var frames = path.computeFrenetFrames( tubularSegments, closed ); + + // expose internals + + this.tangents = frames.tangents; + this.normals = frames.normals; + this.binormals = frames.binormals; + + // helper variables + + var vertex = new Vector3(); + var normal = new Vector3(); + var uv = new Vector2(); + + var i, j; + + // buffer + + var vertices = []; + var normals = []; + var uvs = []; + var indices = []; + + // create buffer data + + generateBufferData(); + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + // functions + + function generateBufferData() { + + for ( i = 0; i < tubularSegments; i ++ ) { + + generateSegment( i ); + + } + + // if the geometry is not closed, generate the last row of vertices and normals + // at the regular position on the given path + // + // if the geometry is closed, duplicate the first row of vertices and normals (uvs will differ) + + generateSegment( ( closed === false ) ? tubularSegments : 0 ); + + // uvs are generated in a separate function. + // this makes it easy compute correct values for closed geometries + + generateUVs(); + + // finally create faces + + generateIndices(); + + } + + function generateSegment( i ) { + + // we use getPointAt to sample evenly distributed points from the given path + + var P = path.getPointAt( i / tubularSegments ); + + // retrieve corresponding normal and binormal + + var N = frames.normals[ i ]; + var B = frames.binormals[ i ]; + + // generate normals and vertices for the current segment + + for ( j = 0; j <= radialSegments; j ++ ) { + + var v = j / radialSegments * Math.PI * 2; + + var sin = Math.sin( v ); + var cos = - Math.cos( v ); + + // normal + + normal.x = ( cos * N.x + sin * B.x ); + normal.y = ( cos * N.y + sin * B.y ); + normal.z = ( cos * N.z + sin * B.z ); + normal.normalize(); + + normals.push( normal.x, normal.y, normal.z ); + + // vertex + + vertex.x = P.x + radius * normal.x; + vertex.y = P.y + radius * normal.y; + vertex.z = P.z + radius * normal.z; + + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + } + + function generateIndices() { + + for ( j = 1; j <= tubularSegments; j ++ ) { + + for ( i = 1; i <= radialSegments; i ++ ) { + + var a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 ); + var b = ( radialSegments + 1 ) * j + ( i - 1 ); + var c = ( radialSegments + 1 ) * j + i; + var d = ( radialSegments + 1 ) * ( j - 1 ) + i; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + } + + function generateUVs() { + + for ( i = 0; i <= tubularSegments; i ++ ) { + + for ( j = 0; j <= radialSegments; j ++ ) { + + uv.x = i / tubularSegments; + uv.y = j / radialSegments; + + uvs.push( uv.x, uv.y ); + + } + + } + + } + + } + + TubeBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + TubeBufferGeometry.prototype.constructor = TubeBufferGeometry; + + /** + * @author oosmoxiecode + * @author Mugen87 / https://github.com/Mugen87 + * + * based on http://www.blackpawn.com/texts/pqtorus/ + */ + + // TorusKnotGeometry + + function TorusKnotGeometry( radius, tube, tubularSegments, radialSegments, p, q, heightScale ) { + + Geometry.call( this ); + + this.type = 'TorusKnotGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + tubularSegments: tubularSegments, + radialSegments: radialSegments, + p: p, + q: q + }; + + if ( heightScale !== undefined ) console.warn( 'THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead.' ); + + this.fromBufferGeometry( new TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) ); + this.mergeVertices(); + + } + + TorusKnotGeometry.prototype = Object.create( Geometry.prototype ); + TorusKnotGeometry.prototype.constructor = TorusKnotGeometry; + + // TorusKnotBufferGeometry + + function TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) { + + BufferGeometry.call( this ); + + this.type = 'TorusKnotBufferGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + tubularSegments: tubularSegments, + radialSegments: radialSegments, + p: p, + q: q + }; + + radius = radius || 100; + tube = tube || 40; + tubularSegments = Math.floor( tubularSegments ) || 64; + radialSegments = Math.floor( radialSegments ) || 8; + p = p || 2; + q = q || 3; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var i, j; + + var vertex = new Vector3(); + var normal = new Vector3(); + + var P1 = new Vector3(); + var P2 = new Vector3(); + + var B = new Vector3(); + var T = new Vector3(); + var N = new Vector3(); + + // generate vertices, normals and uvs + + for ( i = 0; i <= tubularSegments; ++ i ) { + + // the radian "u" is used to calculate the position on the torus curve of the current tubular segement + + var u = i / tubularSegments * p * Math.PI * 2; + + // now we calculate two points. P1 is our current position on the curve, P2 is a little farther ahead. + // these points are used to create a special "coordinate space", which is necessary to calculate the correct vertex positions + + calculatePositionOnCurve( u, p, q, radius, P1 ); + calculatePositionOnCurve( u + 0.01, p, q, radius, P2 ); + + // calculate orthonormal basis + + T.subVectors( P2, P1 ); + N.addVectors( P2, P1 ); + B.crossVectors( T, N ); + N.crossVectors( B, T ); + + // normalize B, N. T can be ignored, we don't use it + + B.normalize(); + N.normalize(); + + for ( j = 0; j <= radialSegments; ++ j ) { + + // now calculate the vertices. they are nothing more than an extrusion of the torus curve. + // because we extrude a shape in the xy-plane, there is no need to calculate a z-value. + + var v = j / radialSegments * Math.PI * 2; + var cx = - tube * Math.cos( v ); + var cy = tube * Math.sin( v ); + + // now calculate the final vertex position. + // first we orient the extrusion with our basis vectos, then we add it to the current position on the curve + + vertex.x = P1.x + ( cx * N.x + cy * B.x ); + vertex.y = P1.y + ( cx * N.y + cy * B.y ); + vertex.z = P1.z + ( cx * N.z + cy * B.z ); + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal (P1 is always the center/origin of the extrusion, thus we can use it to calculate the normal) + + normal.subVectors( vertex, P1 ).normalize(); + + normals.push( normal.x, normal.y, normal.z ); + + // uv + + uvs.push( i / tubularSegments ); + uvs.push( j / radialSegments ); + + } + + } + + // generate indices + + for ( j = 1; j <= tubularSegments; j ++ ) { + + for ( i = 1; i <= radialSegments; i ++ ) { + + // indices + + var a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 ); + var b = ( radialSegments + 1 ) * j + ( i - 1 ); + var c = ( radialSegments + 1 ) * j + i; + var d = ( radialSegments + 1 ) * ( j - 1 ) + i; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + // this function calculates the current position on the torus curve + + function calculatePositionOnCurve( u, p, q, radius, position ) { + + var cu = Math.cos( u ); + var su = Math.sin( u ); + var quOverP = q / p * u; + var cs = Math.cos( quOverP ); + + position.x = radius * ( 2 + cs ) * 0.5 * cu; + position.y = radius * ( 2 + cs ) * su * 0.5; + position.z = radius * Math.sin( quOverP ) * 0.5; + + } + + } + + TorusKnotBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + TorusKnotBufferGeometry.prototype.constructor = TorusKnotBufferGeometry; + + /** + * @author oosmoxiecode + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + + // TorusGeometry + + function TorusGeometry( radius, tube, radialSegments, tubularSegments, arc ) { + + Geometry.call( this ); + + this.type = 'TorusGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + radialSegments: radialSegments, + tubularSegments: tubularSegments, + arc: arc + }; + + this.fromBufferGeometry( new TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) ); + this.mergeVertices(); + + } + + TorusGeometry.prototype = Object.create( Geometry.prototype ); + TorusGeometry.prototype.constructor = TorusGeometry; + + // TorusBufferGeometry + + function TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) { + + BufferGeometry.call( this ); + + this.type = 'TorusBufferGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + radialSegments: radialSegments, + tubularSegments: tubularSegments, + arc: arc + }; + + radius = radius || 100; + tube = tube || 40; + radialSegments = Math.floor( radialSegments ) || 8; + tubularSegments = Math.floor( tubularSegments ) || 6; + arc = arc || Math.PI * 2; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var center = new Vector3(); + var vertex = new Vector3(); + var normal = new Vector3(); + + var j, i; + + // generate vertices, normals and uvs + + for ( j = 0; j <= radialSegments; j ++ ) { + + for ( i = 0; i <= tubularSegments; i ++ ) { + + var u = i / tubularSegments * arc; + var v = j / radialSegments * Math.PI * 2; + + // vertex + + vertex.x = ( radius + tube * Math.cos( v ) ) * Math.cos( u ); + vertex.y = ( radius + tube * Math.cos( v ) ) * Math.sin( u ); + vertex.z = tube * Math.sin( v ); + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + center.x = radius * Math.cos( u ); + center.y = radius * Math.sin( u ); + normal.subVectors( vertex, center ).normalize(); + + normals.push( normal.x, normal.y, normal.z ); + + // uv + + uvs.push( i / tubularSegments ); + uvs.push( j / radialSegments ); + + } + + } + + // generate indices + + for ( j = 1; j <= radialSegments; j ++ ) { + + for ( i = 1; i <= tubularSegments; i ++ ) { + + // indices + + var a = ( tubularSegments + 1 ) * j + i - 1; + var b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1; + var c = ( tubularSegments + 1 ) * ( j - 1 ) + i; + var d = ( tubularSegments + 1 ) * j + i; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + TorusBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + TorusBufferGeometry.prototype.constructor = TorusBufferGeometry; + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + */ + + var ShapeUtils = { + + // calculate area of the contour polygon + + area: function ( contour ) { + + var n = contour.length; + var a = 0.0; + + for ( var p = n - 1, q = 0; q < n; p = q ++ ) { + + a += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y; + + } + + return a * 0.5; + + }, + + triangulate: ( function () { + + /** + * This code is a quick port of code written in C++ which was submitted to + * flipcode.com by John W. Ratcliff // July 22, 2000 + * See original code and more information here: + * http://www.flipcode.com/archives/Efficient_Polygon_Triangulation.shtml + * + * ported to actionscript by Zevan Rosser + * www.actionsnippet.com + * + * ported to javascript by Joshua Koo + * http://www.lab4games.net/zz85/blog + * + */ + + function snip( contour, u, v, w, n, verts ) { + + var p; + var ax, ay, bx, by; + var cx, cy, px, py; + + ax = contour[ verts[ u ] ].x; + ay = contour[ verts[ u ] ].y; + + bx = contour[ verts[ v ] ].x; + by = contour[ verts[ v ] ].y; + + cx = contour[ verts[ w ] ].x; + cy = contour[ verts[ w ] ].y; + + if ( ( bx - ax ) * ( cy - ay ) - ( by - ay ) * ( cx - ax ) <= 0 ) return false; + + var aX, aY, bX, bY, cX, cY; + var apx, apy, bpx, bpy, cpx, cpy; + var cCROSSap, bCROSScp, aCROSSbp; + + aX = cx - bx; aY = cy - by; + bX = ax - cx; bY = ay - cy; + cX = bx - ax; cY = by - ay; + + for ( p = 0; p < n; p ++ ) { + + px = contour[ verts[ p ] ].x; + py = contour[ verts[ p ] ].y; + + if ( ( ( px === ax ) && ( py === ay ) ) || + ( ( px === bx ) && ( py === by ) ) || + ( ( px === cx ) && ( py === cy ) ) ) continue; + + apx = px - ax; apy = py - ay; + bpx = px - bx; bpy = py - by; + cpx = px - cx; cpy = py - cy; + + // see if p is inside triangle abc + + aCROSSbp = aX * bpy - aY * bpx; + cCROSSap = cX * apy - cY * apx; + bCROSScp = bX * cpy - bY * cpx; + + if ( ( aCROSSbp >= - Number.EPSILON ) && ( bCROSScp >= - Number.EPSILON ) && ( cCROSSap >= - Number.EPSILON ) ) return false; + + } + + return true; + + } + + // takes in an contour array and returns + + return function triangulate( contour, indices ) { + + var n = contour.length; + + if ( n < 3 ) return null; + + var result = [], + verts = [], + vertIndices = []; + + /* we want a counter-clockwise polygon in verts */ + + var u, v, w; + + if ( ShapeUtils.area( contour ) > 0.0 ) { + + for ( v = 0; v < n; v ++ ) verts[ v ] = v; + + } else { + + for ( v = 0; v < n; v ++ ) verts[ v ] = ( n - 1 ) - v; + + } + + var nv = n; + + /* remove nv - 2 vertices, creating 1 triangle every time */ + + var count = 2 * nv; /* error detection */ + + for ( v = nv - 1; nv > 2; ) { + + /* if we loop, it is probably a non-simple polygon */ + + if ( ( count -- ) <= 0 ) { + + //** Triangulate: ERROR - probable bad polygon! + + //throw ( "Warning, unable to triangulate polygon!" ); + //return null; + // Sometimes warning is fine, especially polygons are triangulated in reverse. + console.warn( 'THREE.ShapeUtils: Unable to triangulate polygon! in triangulate()' ); + + if ( indices ) return vertIndices; + return result; + + } + + /* three consecutive vertices in current polygon, <u,v,w> */ + + u = v; if ( nv <= u ) u = 0; /* previous */ + v = u + 1; if ( nv <= v ) v = 0; /* new v */ + w = v + 1; if ( nv <= w ) w = 0; /* next */ + + if ( snip( contour, u, v, w, nv, verts ) ) { + + var a, b, c, s, t; + + /* true names of the vertices */ + + a = verts[ u ]; + b = verts[ v ]; + c = verts[ w ]; + + /* output Triangle */ + + result.push( [ contour[ a ], + contour[ b ], + contour[ c ] ] ); + + + vertIndices.push( [ verts[ u ], verts[ v ], verts[ w ] ] ); + + /* remove v from the remaining polygon */ + + for ( s = v, t = v + 1; t < nv; s ++, t ++ ) { + + verts[ s ] = verts[ t ]; + + } + + nv --; + + /* reset error detection counter */ + + count = 2 * nv; + + } + + } + + if ( indices ) return vertIndices; + return result; + + } + + } )(), + + triangulateShape: function ( contour, holes ) { + + function removeDupEndPts(points) { + + var l = points.length; + + if ( l > 2 && points[ l - 1 ].equals( points[ 0 ] ) ) { + + points.pop(); + + } + + } + + removeDupEndPts( contour ); + holes.forEach( removeDupEndPts ); + + function point_in_segment_2D_colin( inSegPt1, inSegPt2, inOtherPt ) { + + // inOtherPt needs to be collinear to the inSegment + if ( inSegPt1.x !== inSegPt2.x ) { + + if ( inSegPt1.x < inSegPt2.x ) { + + return ( ( inSegPt1.x <= inOtherPt.x ) && ( inOtherPt.x <= inSegPt2.x ) ); + + } else { + + return ( ( inSegPt2.x <= inOtherPt.x ) && ( inOtherPt.x <= inSegPt1.x ) ); + + } + + } else { + + if ( inSegPt1.y < inSegPt2.y ) { + + return ( ( inSegPt1.y <= inOtherPt.y ) && ( inOtherPt.y <= inSegPt2.y ) ); + + } else { + + return ( ( inSegPt2.y <= inOtherPt.y ) && ( inOtherPt.y <= inSegPt1.y ) ); + + } + + } + + } + + function intersect_segments_2D( inSeg1Pt1, inSeg1Pt2, inSeg2Pt1, inSeg2Pt2, inExcludeAdjacentSegs ) { + + var seg1dx = inSeg1Pt2.x - inSeg1Pt1.x, seg1dy = inSeg1Pt2.y - inSeg1Pt1.y; + var seg2dx = inSeg2Pt2.x - inSeg2Pt1.x, seg2dy = inSeg2Pt2.y - inSeg2Pt1.y; + + var seg1seg2dx = inSeg1Pt1.x - inSeg2Pt1.x; + var seg1seg2dy = inSeg1Pt1.y - inSeg2Pt1.y; + + var limit = seg1dy * seg2dx - seg1dx * seg2dy; + var perpSeg1 = seg1dy * seg1seg2dx - seg1dx * seg1seg2dy; + + if ( Math.abs( limit ) > Number.EPSILON ) { + + // not parallel + + var perpSeg2; + if ( limit > 0 ) { + + if ( ( perpSeg1 < 0 ) || ( perpSeg1 > limit ) ) return []; + perpSeg2 = seg2dy * seg1seg2dx - seg2dx * seg1seg2dy; + if ( ( perpSeg2 < 0 ) || ( perpSeg2 > limit ) ) return []; + + } else { + + if ( ( perpSeg1 > 0 ) || ( perpSeg1 < limit ) ) return []; + perpSeg2 = seg2dy * seg1seg2dx - seg2dx * seg1seg2dy; + if ( ( perpSeg2 > 0 ) || ( perpSeg2 < limit ) ) return []; + + } + + // i.e. to reduce rounding errors + // intersection at endpoint of segment#1? + if ( perpSeg2 === 0 ) { + + if ( ( inExcludeAdjacentSegs ) && + ( ( perpSeg1 === 0 ) || ( perpSeg1 === limit ) ) ) return []; + return [ inSeg1Pt1 ]; + + } + if ( perpSeg2 === limit ) { + + if ( ( inExcludeAdjacentSegs ) && + ( ( perpSeg1 === 0 ) || ( perpSeg1 === limit ) ) ) return []; + return [ inSeg1Pt2 ]; + + } + // intersection at endpoint of segment#2? + if ( perpSeg1 === 0 ) return [ inSeg2Pt1 ]; + if ( perpSeg1 === limit ) return [ inSeg2Pt2 ]; + + // return real intersection point + var factorSeg1 = perpSeg2 / limit; + return [ { x: inSeg1Pt1.x + factorSeg1 * seg1dx, + y: inSeg1Pt1.y + factorSeg1 * seg1dy } ]; + + } else { + + // parallel or collinear + if ( ( perpSeg1 !== 0 ) || + ( seg2dy * seg1seg2dx !== seg2dx * seg1seg2dy ) ) return []; + + // they are collinear or degenerate + var seg1Pt = ( ( seg1dx === 0 ) && ( seg1dy === 0 ) ); // segment1 is just a point? + var seg2Pt = ( ( seg2dx === 0 ) && ( seg2dy === 0 ) ); // segment2 is just a point? + // both segments are points + if ( seg1Pt && seg2Pt ) { + + if ( ( inSeg1Pt1.x !== inSeg2Pt1.x ) || + ( inSeg1Pt1.y !== inSeg2Pt1.y ) ) return []; // they are distinct points + return [ inSeg1Pt1 ]; // they are the same point + + } + // segment#1 is a single point + if ( seg1Pt ) { + + if ( ! point_in_segment_2D_colin( inSeg2Pt1, inSeg2Pt2, inSeg1Pt1 ) ) return []; // but not in segment#2 + return [ inSeg1Pt1 ]; + + } + // segment#2 is a single point + if ( seg2Pt ) { + + if ( ! point_in_segment_2D_colin( inSeg1Pt1, inSeg1Pt2, inSeg2Pt1 ) ) return []; // but not in segment#1 + return [ inSeg2Pt1 ]; + + } + + // they are collinear segments, which might overlap + var seg1min, seg1max, seg1minVal, seg1maxVal; + var seg2min, seg2max, seg2minVal, seg2maxVal; + if ( seg1dx !== 0 ) { + + // the segments are NOT on a vertical line + if ( inSeg1Pt1.x < inSeg1Pt2.x ) { + + seg1min = inSeg1Pt1; seg1minVal = inSeg1Pt1.x; + seg1max = inSeg1Pt2; seg1maxVal = inSeg1Pt2.x; + + } else { + + seg1min = inSeg1Pt2; seg1minVal = inSeg1Pt2.x; + seg1max = inSeg1Pt1; seg1maxVal = inSeg1Pt1.x; + + } + if ( inSeg2Pt1.x < inSeg2Pt2.x ) { + + seg2min = inSeg2Pt1; seg2minVal = inSeg2Pt1.x; + seg2max = inSeg2Pt2; seg2maxVal = inSeg2Pt2.x; + + } else { + + seg2min = inSeg2Pt2; seg2minVal = inSeg2Pt2.x; + seg2max = inSeg2Pt1; seg2maxVal = inSeg2Pt1.x; + + } + + } else { + + // the segments are on a vertical line + if ( inSeg1Pt1.y < inSeg1Pt2.y ) { + + seg1min = inSeg1Pt1; seg1minVal = inSeg1Pt1.y; + seg1max = inSeg1Pt2; seg1maxVal = inSeg1Pt2.y; + + } else { + + seg1min = inSeg1Pt2; seg1minVal = inSeg1Pt2.y; + seg1max = inSeg1Pt1; seg1maxVal = inSeg1Pt1.y; + + } + if ( inSeg2Pt1.y < inSeg2Pt2.y ) { + + seg2min = inSeg2Pt1; seg2minVal = inSeg2Pt1.y; + seg2max = inSeg2Pt2; seg2maxVal = inSeg2Pt2.y; + + } else { + + seg2min = inSeg2Pt2; seg2minVal = inSeg2Pt2.y; + seg2max = inSeg2Pt1; seg2maxVal = inSeg2Pt1.y; + + } + + } + if ( seg1minVal <= seg2minVal ) { + + if ( seg1maxVal < seg2minVal ) return []; + if ( seg1maxVal === seg2minVal ) { + + if ( inExcludeAdjacentSegs ) return []; + return [ seg2min ]; + + } + if ( seg1maxVal <= seg2maxVal ) return [ seg2min, seg1max ]; + return [ seg2min, seg2max ]; + + } else { + + if ( seg1minVal > seg2maxVal ) return []; + if ( seg1minVal === seg2maxVal ) { + + if ( inExcludeAdjacentSegs ) return []; + return [ seg1min ]; + + } + if ( seg1maxVal <= seg2maxVal ) return [ seg1min, seg1max ]; + return [ seg1min, seg2max ]; + + } + + } + + } + + function isPointInsideAngle( inVertex, inLegFromPt, inLegToPt, inOtherPt ) { + + // The order of legs is important + + // translation of all points, so that Vertex is at (0,0) + var legFromPtX = inLegFromPt.x - inVertex.x, legFromPtY = inLegFromPt.y - inVertex.y; + var legToPtX = inLegToPt.x - inVertex.x, legToPtY = inLegToPt.y - inVertex.y; + var otherPtX = inOtherPt.x - inVertex.x, otherPtY = inOtherPt.y - inVertex.y; + + // main angle >0: < 180 deg.; 0: 180 deg.; <0: > 180 deg. + var from2toAngle = legFromPtX * legToPtY - legFromPtY * legToPtX; + var from2otherAngle = legFromPtX * otherPtY - legFromPtY * otherPtX; + + if ( Math.abs( from2toAngle ) > Number.EPSILON ) { + + // angle != 180 deg. + + var other2toAngle = otherPtX * legToPtY - otherPtY * legToPtX; + // console.log( "from2to: " + from2toAngle + ", from2other: " + from2otherAngle + ", other2to: " + other2toAngle ); + + if ( from2toAngle > 0 ) { + + // main angle < 180 deg. + return ( ( from2otherAngle >= 0 ) && ( other2toAngle >= 0 ) ); + + } else { + + // main angle > 180 deg. + return ( ( from2otherAngle >= 0 ) || ( other2toAngle >= 0 ) ); + + } + + } else { + + // angle == 180 deg. + // console.log( "from2to: 180 deg., from2other: " + from2otherAngle ); + return ( from2otherAngle > 0 ); + + } + + } + + + function removeHoles( contour, holes ) { + + var shape = contour.concat(); // work on this shape + var hole; + + function isCutLineInsideAngles( inShapeIdx, inHoleIdx ) { + + // Check if hole point lies within angle around shape point + var lastShapeIdx = shape.length - 1; + + var prevShapeIdx = inShapeIdx - 1; + if ( prevShapeIdx < 0 ) prevShapeIdx = lastShapeIdx; + + var nextShapeIdx = inShapeIdx + 1; + if ( nextShapeIdx > lastShapeIdx ) nextShapeIdx = 0; + + var insideAngle = isPointInsideAngle( shape[ inShapeIdx ], shape[ prevShapeIdx ], shape[ nextShapeIdx ], hole[ inHoleIdx ] ); + if ( ! insideAngle ) { + + // console.log( "Vertex (Shape): " + inShapeIdx + ", Point: " + hole[inHoleIdx].x + "/" + hole[inHoleIdx].y ); + return false; + + } + + // Check if shape point lies within angle around hole point + var lastHoleIdx = hole.length - 1; + + var prevHoleIdx = inHoleIdx - 1; + if ( prevHoleIdx < 0 ) prevHoleIdx = lastHoleIdx; + + var nextHoleIdx = inHoleIdx + 1; + if ( nextHoleIdx > lastHoleIdx ) nextHoleIdx = 0; + + insideAngle = isPointInsideAngle( hole[ inHoleIdx ], hole[ prevHoleIdx ], hole[ nextHoleIdx ], shape[ inShapeIdx ] ); + if ( ! insideAngle ) { + + // console.log( "Vertex (Hole): " + inHoleIdx + ", Point: " + shape[inShapeIdx].x + "/" + shape[inShapeIdx].y ); + return false; + + } + + return true; + + } + + function intersectsShapeEdge( inShapePt, inHolePt ) { + + // checks for intersections with shape edges + var sIdx, nextIdx, intersection; + for ( sIdx = 0; sIdx < shape.length; sIdx ++ ) { + + nextIdx = sIdx + 1; nextIdx %= shape.length; + intersection = intersect_segments_2D( inShapePt, inHolePt, shape[ sIdx ], shape[ nextIdx ], true ); + if ( intersection.length > 0 ) return true; + + } + + return false; + + } + + var indepHoles = []; + + function intersectsHoleEdge( inShapePt, inHolePt ) { + + // checks for intersections with hole edges + var ihIdx, chkHole, + hIdx, nextIdx, intersection; + for ( ihIdx = 0; ihIdx < indepHoles.length; ihIdx ++ ) { + + chkHole = holes[ indepHoles[ ihIdx ]]; + for ( hIdx = 0; hIdx < chkHole.length; hIdx ++ ) { + + nextIdx = hIdx + 1; nextIdx %= chkHole.length; + intersection = intersect_segments_2D( inShapePt, inHolePt, chkHole[ hIdx ], chkHole[ nextIdx ], true ); + if ( intersection.length > 0 ) return true; + + } + + } + return false; + + } + + var holeIndex, shapeIndex, + shapePt, holePt, + holeIdx, cutKey, failedCuts = [], + tmpShape1, tmpShape2, + tmpHole1, tmpHole2; + + for ( var h = 0, hl = holes.length; h < hl; h ++ ) { + + indepHoles.push( h ); + + } + + var minShapeIndex = 0; + var counter = indepHoles.length * 2; + while ( indepHoles.length > 0 ) { + + counter --; + if ( counter < 0 ) { + + console.log( "Infinite Loop! Holes left:" + indepHoles.length + ", Probably Hole outside Shape!" ); + break; + + } + + // search for shape-vertex and hole-vertex, + // which can be connected without intersections + for ( shapeIndex = minShapeIndex; shapeIndex < shape.length; shapeIndex ++ ) { + + shapePt = shape[ shapeIndex ]; + holeIndex = - 1; + + // search for hole which can be reached without intersections + for ( var h = 0; h < indepHoles.length; h ++ ) { + + holeIdx = indepHoles[ h ]; + + // prevent multiple checks + cutKey = shapePt.x + ":" + shapePt.y + ":" + holeIdx; + if ( failedCuts[ cutKey ] !== undefined ) continue; + + hole = holes[ holeIdx ]; + for ( var h2 = 0; h2 < hole.length; h2 ++ ) { + + holePt = hole[ h2 ]; + if ( ! isCutLineInsideAngles( shapeIndex, h2 ) ) continue; + if ( intersectsShapeEdge( shapePt, holePt ) ) continue; + if ( intersectsHoleEdge( shapePt, holePt ) ) continue; + + holeIndex = h2; + indepHoles.splice( h, 1 ); + + tmpShape1 = shape.slice( 0, shapeIndex + 1 ); + tmpShape2 = shape.slice( shapeIndex ); + tmpHole1 = hole.slice( holeIndex ); + tmpHole2 = hole.slice( 0, holeIndex + 1 ); + + shape = tmpShape1.concat( tmpHole1 ).concat( tmpHole2 ).concat( tmpShape2 ); + + minShapeIndex = shapeIndex; + + // Debug only, to show the selected cuts + // glob_CutLines.push( [ shapePt, holePt ] ); + + break; + + } + if ( holeIndex >= 0 ) break; // hole-vertex found + + failedCuts[ cutKey ] = true; // remember failure + + } + if ( holeIndex >= 0 ) break; // hole-vertex found + + } + + } + + return shape; /* shape with no holes */ + + } + + + var i, il, f, face, + key, index, + allPointsMap = {}; + + // To maintain reference to old shape, one must match coordinates, or offset the indices from original arrays. It's probably easier to do the first. + + var allpoints = contour.concat(); + + for ( var h = 0, hl = holes.length; h < hl; h ++ ) { + + Array.prototype.push.apply( allpoints, holes[ h ] ); + + } + + //console.log( "allpoints",allpoints, allpoints.length ); + + // prepare all points map + + for ( i = 0, il = allpoints.length; i < il; i ++ ) { + + key = allpoints[ i ].x + ":" + allpoints[ i ].y; + + if ( allPointsMap[ key ] !== undefined ) { + + console.warn( "THREE.ShapeUtils: Duplicate point", key, i ); + + } + + allPointsMap[ key ] = i; + + } + + // remove holes by cutting paths to holes and adding them to the shape + var shapeWithoutHoles = removeHoles( contour, holes ); + + var triangles = ShapeUtils.triangulate( shapeWithoutHoles, false ); // True returns indices for points of spooled shape + //console.log( "triangles",triangles, triangles.length ); + + // check all face vertices against all points map + + for ( i = 0, il = triangles.length; i < il; i ++ ) { + + face = triangles[ i ]; + + for ( f = 0; f < 3; f ++ ) { + + key = face[ f ].x + ":" + face[ f ].y; + + index = allPointsMap[ key ]; + + if ( index !== undefined ) { + + face[ f ] = index; + + } + + } + + } + + return triangles.concat(); + + }, + + isClockWise: function ( pts ) { + + return ShapeUtils.area( pts ) < 0; + + } + + }; + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * + * Creates extruded geometry from a path shape. + * + * parameters = { + * + * curveSegments: <int>, // number of points on the curves + * steps: <int>, // number of points for z-side extrusions / used for subdividing segments of extrude spline too + * amount: <int>, // Depth to extrude the shape + * + * bevelEnabled: <bool>, // turn on bevel + * bevelThickness: <float>, // how deep into the original shape bevel goes + * bevelSize: <float>, // how far from shape outline is bevel + * bevelSegments: <int>, // number of bevel layers + * + * extrudePath: <THREE.Curve> // curve to extrude shape along + * frames: <Object> // containing arrays of tangents, normals, binormals + * + * UVGenerator: <Object> // object that provides UV generator functions + * + * } + */ + + // ExtrudeGeometry + + function ExtrudeGeometry( shapes, options ) { + + Geometry.call( this ); + + this.type = 'ExtrudeGeometry'; + + this.parameters = { + shapes: shapes, + options: options + }; + + this.fromBufferGeometry( new ExtrudeBufferGeometry( shapes, options ) ); + this.mergeVertices(); + + } + + ExtrudeGeometry.prototype = Object.create( Geometry.prototype ); + ExtrudeGeometry.prototype.constructor = ExtrudeGeometry; + + // ExtrudeBufferGeometry + + function ExtrudeBufferGeometry( shapes, options ) { + + if ( typeof ( shapes ) === "undefined" ) { + + return; + + } + + BufferGeometry.call( this ); + + this.type = 'ExtrudeBufferGeometry'; + + shapes = Array.isArray( shapes ) ? shapes : [ shapes ]; + + this.addShapeList( shapes, options ); + + this.computeVertexNormals(); + + // can't really use automatic vertex normals + // as then front and back sides get smoothed too + // should do separate smoothing just for sides + + //this.computeVertexNormals(); + + //console.log( "took", ( Date.now() - startTime ) ); + + } + + ExtrudeBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + ExtrudeBufferGeometry.prototype.constructor = ExtrudeBufferGeometry; + + ExtrudeBufferGeometry.prototype.getArrays = function () { + + var positionAttribute = this.getAttribute( "position" ); + var verticesArray = positionAttribute ? Array.prototype.slice.call( positionAttribute.array ) : []; + + var uvAttribute = this.getAttribute( "uv" ); + var uvArray = uvAttribute ? Array.prototype.slice.call( uvAttribute.array ) : []; + + var IndexAttribute = this.index; + var indicesArray = IndexAttribute ? Array.prototype.slice.call( IndexAttribute.array ) : []; + + return { + position: verticesArray, + uv: uvArray, + index: indicesArray + }; + + }; + + ExtrudeBufferGeometry.prototype.addShapeList = function ( shapes, options ) { + + var sl = shapes.length; + options.arrays = this.getArrays(); + + for ( var s = 0; s < sl; s ++ ) { + + var shape = shapes[ s ]; + this.addShape( shape, options ); + + } + + this.setIndex( options.arrays.index ); + this.addAttribute( 'position', new Float32BufferAttribute( options.arrays.position, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( options.arrays.uv, 2 ) ); + + }; + + ExtrudeBufferGeometry.prototype.addShape = function ( shape, options ) { + + var arrays = options.arrays ? options.arrays : this.getArrays(); + var verticesArray = arrays.position; + var indicesArray = arrays.index; + var uvArray = arrays.uv; + + var placeholder = []; + + + var amount = options.amount !== undefined ? options.amount : 100; + + var bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 6; // 10 + var bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 2; // 8 + var bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3; + + var bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true; // false + + var curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12; + + var steps = options.steps !== undefined ? options.steps : 1; + + var extrudePath = options.extrudePath; + var extrudePts, extrudeByPath = false; + + // Use default WorldUVGenerator if no UV generators are specified. + var uvgen = options.UVGenerator !== undefined ? options.UVGenerator : ExtrudeGeometry.WorldUVGenerator; + + var splineTube, binormal, normal, position2; + if ( extrudePath ) { + + extrudePts = extrudePath.getSpacedPoints( steps ); + + extrudeByPath = true; + bevelEnabled = false; // bevels not supported for path extrusion + + // SETUP TNB variables + + // TODO1 - have a .isClosed in spline? + + splineTube = options.frames !== undefined ? options.frames : extrudePath.computeFrenetFrames( steps, false ); + + // console.log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length); + + binormal = new Vector3(); + normal = new Vector3(); + position2 = new Vector3(); + + } + + // Safeguards if bevels are not enabled + + if ( ! bevelEnabled ) { + + bevelSegments = 0; + bevelThickness = 0; + bevelSize = 0; + + } + + // Variables initialization + + var ahole, h, hl; // looping of holes + var scope = this; + + var shapePoints = shape.extractPoints( curveSegments ); + + var vertices = shapePoints.shape; + var holes = shapePoints.holes; + + var reverse = ! ShapeUtils.isClockWise( vertices ); + + if ( reverse ) { + + vertices = vertices.reverse(); + + // Maybe we should also check if holes are in the opposite direction, just to be safe ... + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + + if ( ShapeUtils.isClockWise( ahole ) ) { + + holes[ h ] = ahole.reverse(); + + } + + } + + } + + + var faces = ShapeUtils.triangulateShape( vertices, holes ); + + /* Vertices */ + + var contour = vertices; // vertices has all points but contour has only points of circumference + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + + vertices = vertices.concat( ahole ); + + } + + + function scalePt2( pt, vec, size ) { + + if ( ! vec ) console.error( "THREE.ExtrudeGeometry: vec does not exist" ); + + return vec.clone().multiplyScalar( size ).add( pt ); + + } + + var b, bs, t, z, + vert, vlen = vertices.length, + face, flen = faces.length; + + + // Find directions for point movement + + + function getBevelVec( inPt, inPrev, inNext ) { + + // computes for inPt the corresponding point inPt' on a new contour + // shifted by 1 unit (length of normalized vector) to the left + // if we walk along contour clockwise, this new contour is outside the old one + // + // inPt' is the intersection of the two lines parallel to the two + // adjacent edges of inPt at a distance of 1 unit on the left side. + + var v_trans_x, v_trans_y, shrink_by; // resulting translation vector for inPt + + // good reading for geometry algorithms (here: line-line intersection) + // http://geomalgorithms.com/a05-_intersect-1.html + + var v_prev_x = inPt.x - inPrev.x, + v_prev_y = inPt.y - inPrev.y; + var v_next_x = inNext.x - inPt.x, + v_next_y = inNext.y - inPt.y; + + var v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y ); + + // check for collinear edges + var collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x ); + + if ( Math.abs( collinear0 ) > Number.EPSILON ) { + + // not collinear + + // length of vectors for normalizing + + var v_prev_len = Math.sqrt( v_prev_lensq ); + var v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y ); + + // shift adjacent points by unit vectors to the left + + var ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len ); + var ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len ); + + var ptNextShift_x = ( inNext.x - v_next_y / v_next_len ); + var ptNextShift_y = ( inNext.y + v_next_x / v_next_len ); + + // scaling factor for v_prev to intersection point + + var sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y - + ( ptNextShift_y - ptPrevShift_y ) * v_next_x ) / + ( v_prev_x * v_next_y - v_prev_y * v_next_x ); + + // vector from inPt to intersection point + + v_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x ); + v_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y ); + + // Don't normalize!, otherwise sharp corners become ugly + // but prevent crazy spikes + var v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y ); + if ( v_trans_lensq <= 2 ) { + + return new Vector2( v_trans_x, v_trans_y ); + + } else { + + shrink_by = Math.sqrt( v_trans_lensq / 2 ); + + } + + } else { + + // handle special case of collinear edges + + var direction_eq = false; // assumes: opposite + if ( v_prev_x > Number.EPSILON ) { + + if ( v_next_x > Number.EPSILON ) { + + direction_eq = true; + + } + + } else { + + if ( v_prev_x < - Number.EPSILON ) { + + if ( v_next_x < - Number.EPSILON ) { + + direction_eq = true; + + } + + } else { + + if ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) { + + direction_eq = true; + + } + + } + + } + + if ( direction_eq ) { + + // console.log("Warning: lines are a straight sequence"); + v_trans_x = - v_prev_y; + v_trans_y = v_prev_x; + shrink_by = Math.sqrt( v_prev_lensq ); + + } else { + + // console.log("Warning: lines are a straight spike"); + v_trans_x = v_prev_x; + v_trans_y = v_prev_y; + shrink_by = Math.sqrt( v_prev_lensq / 2 ); + + } + + } + + return new Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by ); + + } + + + var contourMovements = []; + + for ( var i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) { + + if ( j === il ) j = 0; + if ( k === il ) k = 0; + + // (j)---(i)---(k) + // console.log('i,j,k', i, j , k) + + contourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] ); + + } + + var holesMovements = [], + oneHoleMovements, verticesMovements = contourMovements.concat(); + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + + oneHoleMovements = []; + + for ( i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) { + + if ( j === il ) j = 0; + if ( k === il ) k = 0; + + // (j)---(i)---(k) + oneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] ); + + } + + holesMovements.push( oneHoleMovements ); + verticesMovements = verticesMovements.concat( oneHoleMovements ); + + } + + + // Loop bevelSegments, 1 for the front, 1 for the back + + for ( b = 0; b < bevelSegments; b ++ ) { + + //for ( b = bevelSegments; b > 0; b -- ) { + + t = b / bevelSegments; + z = bevelThickness * Math.cos( t * Math.PI / 2 ); + bs = bevelSize * Math.sin( t * Math.PI / 2 ); + + // contract shape + + for ( i = 0, il = contour.length; i < il; i ++ ) { + + vert = scalePt2( contour[ i ], contourMovements[ i ], bs ); + + v( vert.x, vert.y, - z ); + + } + + // expand holes + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + oneHoleMovements = holesMovements[ h ]; + + for ( i = 0, il = ahole.length; i < il; i ++ ) { + + vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs ); + + v( vert.x, vert.y, - z ); + + } + + } + + } + + bs = bevelSize; + + // Back facing vertices + + for ( i = 0; i < vlen; i ++ ) { + + vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ]; + + if ( ! extrudeByPath ) { + + v( vert.x, vert.y, 0 ); + + } else { + + // v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x ); + + normal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x ); + binormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y ); + + position2.copy( extrudePts[ 0 ] ).add( normal ).add( binormal ); + + v( position2.x, position2.y, position2.z ); + + } + + } + + // Add stepped vertices... + // Including front facing vertices + + var s; + + for ( s = 1; s <= steps; s ++ ) { + + for ( i = 0; i < vlen; i ++ ) { + + vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ]; + + if ( ! extrudeByPath ) { + + v( vert.x, vert.y, amount / steps * s ); + + } else { + + // v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x ); + + normal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x ); + binormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y ); + + position2.copy( extrudePts[ s ] ).add( normal ).add( binormal ); + + v( position2.x, position2.y, position2.z ); + + } + + } + + } + + + // Add bevel segments planes + + //for ( b = 1; b <= bevelSegments; b ++ ) { + for ( b = bevelSegments - 1; b >= 0; b -- ) { + + t = b / bevelSegments; + z = bevelThickness * Math.cos( t * Math.PI / 2 ); + bs = bevelSize * Math.sin( t * Math.PI / 2 ); + + // contract shape + + for ( i = 0, il = contour.length; i < il; i ++ ) { + + vert = scalePt2( contour[ i ], contourMovements[ i ], bs ); + v( vert.x, vert.y, amount + z ); + + } + + // expand holes + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + oneHoleMovements = holesMovements[ h ]; + + for ( i = 0, il = ahole.length; i < il; i ++ ) { + + vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs ); + + if ( ! extrudeByPath ) { + + v( vert.x, vert.y, amount + z ); + + } else { + + v( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z ); + + } + + } + + } + + } + + /* Faces */ + + // Top and bottom faces + + buildLidFaces(); + + // Sides faces + + buildSideFaces(); + + + ///// Internal functions + + function buildLidFaces() { + + var start = verticesArray.length/3; + + if ( bevelEnabled ) { + + var layer = 0; // steps + 1 + var offset = vlen * layer; + + // Bottom faces + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + f3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset ); + + } + + layer = steps + bevelSegments * 2; + offset = vlen * layer; + + // Top faces + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + f3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset ); + + } + + } else { + + // Bottom faces + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + f3( face[ 2 ], face[ 1 ], face[ 0 ] ); + + } + + // Top faces + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + f3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps ); + + } + + } + + scope.addGroup( start, verticesArray.length/3 -start, options.material !== undefined ? options.material : 0); + + } + + // Create faces for the z-sides of the shape + + function buildSideFaces() { + + var start = verticesArray.length/3; + var layeroffset = 0; + sidewalls( contour, layeroffset ); + layeroffset += contour.length; + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + sidewalls( ahole, layeroffset ); + + //, true + layeroffset += ahole.length; + + } + + + scope.addGroup( start, verticesArray.length/3 -start, options.extrudeMaterial !== undefined ? options.extrudeMaterial : 1); + + + } + + function sidewalls( contour, layeroffset ) { + + var j, k; + i = contour.length; + + while ( -- i >= 0 ) { + + j = i; + k = i - 1; + if ( k < 0 ) k = contour.length - 1; + + //console.log('b', i,j, i-1, k,vertices.length); + + var s = 0, + sl = steps + bevelSegments * 2; + + for ( s = 0; s < sl; s ++ ) { + + var slen1 = vlen * s; + var slen2 = vlen * ( s + 1 ); + + var a = layeroffset + j + slen1, + b = layeroffset + k + slen1, + c = layeroffset + k + slen2, + d = layeroffset + j + slen2; + + f4( a, b, c, d, contour, s, sl, j, k ); + + } + + } + + } + + function v( x, y, z ) { + + placeholder.push( x ); + placeholder.push( y ); + placeholder.push( z ); + + } + + + function f3( a, b, c ) { + + addVertex( a ); + addVertex( b ); + addVertex( c ); + + var nextIndex = verticesArray.length / 3; + var uvs = uvgen.generateTopUV( scope, verticesArray, nextIndex - 3, nextIndex - 2, nextIndex - 1 ); + + addUV( uvs[ 0 ] ); + addUV( uvs[ 1 ] ); + addUV( uvs[ 2 ] ); + + } + + function f4( a, b, c, d, wallContour, stepIndex, stepsLength, contourIndex1, contourIndex2 ) { + + addVertex( a ); + addVertex( b ); + addVertex( d ); + + addVertex( b ); + addVertex( c ); + addVertex( d ); + + + var nextIndex = verticesArray.length / 3; + var uvs = uvgen.generateSideWallUV( scope, verticesArray, nextIndex - 6, nextIndex - 3, nextIndex - 2, nextIndex - 1 ); + + addUV( uvs[ 0 ] ); + addUV( uvs[ 1 ] ); + addUV( uvs[ 3 ] ); + + addUV( uvs[ 1 ] ); + addUV( uvs[ 2 ] ); + addUV( uvs[ 3 ] ); + + } + + function addVertex( index ) { + + indicesArray.push( verticesArray.length / 3 ); + verticesArray.push( placeholder[ index * 3 + 0 ] ); + verticesArray.push( placeholder[ index * 3 + 1 ] ); + verticesArray.push( placeholder[ index * 3 + 2 ] ); + + } + + + function addUV( vector2 ) { + + uvArray.push( vector2.x ); + uvArray.push( vector2.y ); + + } + + if ( ! options.arrays ) { + + this.setIndex( indicesArray ); + this.addAttribute( 'position', new Float32BufferAttribute( verticesArray, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( options.arrays.uv, 2 ) ); + + } + + }; + + ExtrudeGeometry.WorldUVGenerator = { + + generateTopUV: function ( geometry, vertices, indexA, indexB, indexC ) { + + var a_x = vertices[ indexA * 3 ]; + var a_y = vertices[ indexA * 3 + 1 ]; + var b_x = vertices[ indexB * 3 ]; + var b_y = vertices[ indexB * 3 + 1 ]; + var c_x = vertices[ indexC * 3 ]; + var c_y = vertices[ indexC * 3 + 1 ]; + + return [ + new Vector2( a_x, a_y ), + new Vector2( b_x, b_y ), + new Vector2( c_x, c_y ) + ]; + + }, + + generateSideWallUV: function ( geometry, vertices, indexA, indexB, indexC, indexD ) { + + var a_x = vertices[ indexA * 3 ]; + var a_y = vertices[ indexA * 3 + 1 ]; + var a_z = vertices[ indexA * 3 + 2 ]; + var b_x = vertices[ indexB * 3 ]; + var b_y = vertices[ indexB * 3 + 1 ]; + var b_z = vertices[ indexB * 3 + 2 ]; + var c_x = vertices[ indexC * 3 ]; + var c_y = vertices[ indexC * 3 + 1 ]; + var c_z = vertices[ indexC * 3 + 2 ]; + var d_x = vertices[ indexD * 3 ]; + var d_y = vertices[ indexD * 3 + 1 ]; + var d_z = vertices[ indexD * 3 + 2 ]; + + if ( Math.abs( a_y - b_y ) < 0.01 ) { + + return [ + new Vector2( a_x, 1 - a_z ), + new Vector2( b_x, 1 - b_z ), + new Vector2( c_x, 1 - c_z ), + new Vector2( d_x, 1 - d_z ) + ]; + + } else { + + return [ + new Vector2( a_y, 1 - a_z ), + new Vector2( b_y, 1 - b_z ), + new Vector2( c_y, 1 - c_z ), + new Vector2( d_y, 1 - d_z ) + ]; + + } + + } + }; + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * @author alteredq / http://alteredqualia.com/ + * + * Text = 3D Text + * + * parameters = { + * font: <THREE.Font>, // font + * + * size: <float>, // size of the text + * height: <float>, // thickness to extrude text + * curveSegments: <int>, // number of points on the curves + * + * bevelEnabled: <bool>, // turn on bevel + * bevelThickness: <float>, // how deep into text bevel goes + * bevelSize: <float> // how far from text outline is bevel + * } + */ + + // TextGeometry + + function TextGeometry( text, parameters ) { + + Geometry.call( this ); + + this.type = 'TextGeometry'; + + this.parameters = { + text: text, + parameters: parameters + }; + + this.fromBufferGeometry( new TextBufferGeometry( text, parameters ) ); + this.mergeVertices(); + + } + + TextGeometry.prototype = Object.create( Geometry.prototype ); + TextGeometry.prototype.constructor = TextGeometry; + + // TextBufferGeometry + + function TextBufferGeometry( text, parameters ) { + + parameters = parameters || {}; + + var font = parameters.font; + + if ( ! ( font && font.isFont ) ) { + + console.error( 'THREE.TextGeometry: font parameter is not an instance of THREE.Font.' ); + return new Geometry(); + + } + + var shapes = font.generateShapes( text, parameters.size, parameters.curveSegments ); + + // translate parameters to ExtrudeGeometry API + + parameters.amount = parameters.height !== undefined ? parameters.height : 50; + + // defaults + + if ( parameters.bevelThickness === undefined ) parameters.bevelThickness = 10; + if ( parameters.bevelSize === undefined ) parameters.bevelSize = 8; + if ( parameters.bevelEnabled === undefined ) parameters.bevelEnabled = false; + + ExtrudeBufferGeometry.call( this, shapes, parameters ); + + this.type = 'TextBufferGeometry'; + + } + + TextBufferGeometry.prototype = Object.create( ExtrudeBufferGeometry.prototype ); + TextBufferGeometry.prototype.constructor = TextBufferGeometry; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author benaadams / https://twitter.com/ben_a_adams + * @author Mugen87 / https://github.com/Mugen87 + */ + + // SphereGeometry + + function SphereGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) { + + Geometry.call( this ); + + this.type = 'SphereGeometry'; + + this.parameters = { + radius: radius, + widthSegments: widthSegments, + heightSegments: heightSegments, + phiStart: phiStart, + phiLength: phiLength, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + this.fromBufferGeometry( new SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) ); + this.mergeVertices(); + + } + + SphereGeometry.prototype = Object.create( Geometry.prototype ); + SphereGeometry.prototype.constructor = SphereGeometry; + + // SphereBufferGeometry + + function SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) { + + BufferGeometry.call( this ); + + this.type = 'SphereBufferGeometry'; + + this.parameters = { + radius: radius, + widthSegments: widthSegments, + heightSegments: heightSegments, + phiStart: phiStart, + phiLength: phiLength, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + radius = radius || 50; + + widthSegments = Math.max( 3, Math.floor( widthSegments ) || 8 ); + heightSegments = Math.max( 2, Math.floor( heightSegments ) || 6 ); + + phiStart = phiStart !== undefined ? phiStart : 0; + phiLength = phiLength !== undefined ? phiLength : Math.PI * 2; + + thetaStart = thetaStart !== undefined ? thetaStart : 0; + thetaLength = thetaLength !== undefined ? thetaLength : Math.PI; + + var thetaEnd = thetaStart + thetaLength; + + var ix, iy; + + var index = 0; + var grid = []; + + var vertex = new Vector3(); + var normal = new Vector3(); + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // generate vertices, normals and uvs + + for ( iy = 0; iy <= heightSegments; iy ++ ) { + + var verticesRow = []; + + var v = iy / heightSegments; + + for ( ix = 0; ix <= widthSegments; ix ++ ) { + + var u = ix / widthSegments; + + // vertex + + vertex.x = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength ); + vertex.y = radius * Math.cos( thetaStart + v * thetaLength ); + vertex.z = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength ); + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + normal.set( vertex.x, vertex.y, vertex.z ).normalize(); + normals.push( normal.x, normal.y, normal.z ); + + // uv + + uvs.push( u, 1 - v ); + + verticesRow.push( index ++ ); + + } + + grid.push( verticesRow ); + + } + + // indices + + for ( iy = 0; iy < heightSegments; iy ++ ) { + + for ( ix = 0; ix < widthSegments; ix ++ ) { + + var a = grid[ iy ][ ix + 1 ]; + var b = grid[ iy ][ ix ]; + var c = grid[ iy + 1 ][ ix ]; + var d = grid[ iy + 1 ][ ix + 1 ]; + + if ( iy !== 0 || thetaStart > 0 ) indices.push( a, b, d ); + if ( iy !== heightSegments - 1 || thetaEnd < Math.PI ) indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + SphereBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + SphereBufferGeometry.prototype.constructor = SphereBufferGeometry; + + /** + * @author Kaleb Murphy + * @author Mugen87 / https://github.com/Mugen87 + */ + + // RingGeometry + + function RingGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) { + + Geometry.call( this ); + + this.type = 'RingGeometry'; + + this.parameters = { + innerRadius: innerRadius, + outerRadius: outerRadius, + thetaSegments: thetaSegments, + phiSegments: phiSegments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + this.fromBufferGeometry( new RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) ); + this.mergeVertices(); + + } + + RingGeometry.prototype = Object.create( Geometry.prototype ); + RingGeometry.prototype.constructor = RingGeometry; + + // RingBufferGeometry + + function RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) { + + BufferGeometry.call( this ); + + this.type = 'RingBufferGeometry'; + + this.parameters = { + innerRadius: innerRadius, + outerRadius: outerRadius, + thetaSegments: thetaSegments, + phiSegments: phiSegments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + innerRadius = innerRadius || 20; + outerRadius = outerRadius || 50; + + thetaStart = thetaStart !== undefined ? thetaStart : 0; + thetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2; + + thetaSegments = thetaSegments !== undefined ? Math.max( 3, thetaSegments ) : 8; + phiSegments = phiSegments !== undefined ? Math.max( 1, phiSegments ) : 1; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // some helper variables + + var segment; + var radius = innerRadius; + var radiusStep = ( ( outerRadius - innerRadius ) / phiSegments ); + var vertex = new Vector3(); + var uv = new Vector2(); + var j, i; + + // generate vertices, normals and uvs + + for ( j = 0; j <= phiSegments; j ++ ) { + + for ( i = 0; i <= thetaSegments; i ++ ) { + + // values are generate from the inside of the ring to the outside + + segment = thetaStart + i / thetaSegments * thetaLength; + + // vertex + + vertex.x = radius * Math.cos( segment ); + vertex.y = radius * Math.sin( segment ); + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + normals.push( 0, 0, 1 ); + + // uv + + uv.x = ( vertex.x / outerRadius + 1 ) / 2; + uv.y = ( vertex.y / outerRadius + 1 ) / 2; + + uvs.push( uv.x, uv.y ); + + } + + // increase the radius for next row of vertices + + radius += radiusStep; + + } + + // indices + + for ( j = 0; j < phiSegments; j ++ ) { + + var thetaSegmentLevel = j * ( thetaSegments + 1 ); + + for ( i = 0; i < thetaSegments; i ++ ) { + + segment = i + thetaSegmentLevel; + + var a = segment; + var b = segment + thetaSegments + 1; + var c = segment + thetaSegments + 2; + var d = segment + 1; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + RingBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + RingBufferGeometry.prototype.constructor = RingBufferGeometry; + + /** + * @author astrodud / http://astrodud.isgreat.org/ + * @author zz85 / https://github.com/zz85 + * @author bhouston / http://clara.io + * @author Mugen87 / https://github.com/Mugen87 + */ + + // LatheGeometry + + function LatheGeometry( points, segments, phiStart, phiLength ) { + + Geometry.call( this ); + + this.type = 'LatheGeometry'; + + this.parameters = { + points: points, + segments: segments, + phiStart: phiStart, + phiLength: phiLength + }; + + this.fromBufferGeometry( new LatheBufferGeometry( points, segments, phiStart, phiLength ) ); + this.mergeVertices(); + + } + + LatheGeometry.prototype = Object.create( Geometry.prototype ); + LatheGeometry.prototype.constructor = LatheGeometry; + + // LatheBufferGeometry + + function LatheBufferGeometry( points, segments, phiStart, phiLength ) { + + BufferGeometry.call( this ); + + this.type = 'LatheBufferGeometry'; + + this.parameters = { + points: points, + segments: segments, + phiStart: phiStart, + phiLength: phiLength + }; + + segments = Math.floor( segments ) || 12; + phiStart = phiStart || 0; + phiLength = phiLength || Math.PI * 2; + + // clamp phiLength so it's in range of [ 0, 2PI ] + + phiLength = _Math.clamp( phiLength, 0, Math.PI * 2 ); + + + // buffers + + var indices = []; + var vertices = []; + var uvs = []; + + // helper variables + + var base; + var inverseSegments = 1.0 / segments; + var vertex = new Vector3(); + var uv = new Vector2(); + var i, j; + + // generate vertices and uvs + + for ( i = 0; i <= segments; i ++ ) { + + var phi = phiStart + i * inverseSegments * phiLength; + + var sin = Math.sin( phi ); + var cos = Math.cos( phi ); + + for ( j = 0; j <= ( points.length - 1 ); j ++ ) { + + // vertex + + vertex.x = points[ j ].x * sin; + vertex.y = points[ j ].y; + vertex.z = points[ j ].x * cos; + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // uv + + uv.x = i / segments; + uv.y = j / ( points.length - 1 ); + + uvs.push( uv.x, uv.y ); + + + } + + } + + // indices + + for ( i = 0; i < segments; i ++ ) { + + for ( j = 0; j < ( points.length - 1 ); j ++ ) { + + base = j + i * points.length; + + var a = base; + var b = base + points.length; + var c = base + points.length + 1; + var d = base + 1; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + // generate normals + + this.computeVertexNormals(); + + // if the geometry is closed, we need to average the normals along the seam. + // because the corresponding vertices are identical (but still have different UVs). + + if ( phiLength === Math.PI * 2 ) { + + var normals = this.attributes.normal.array; + var n1 = new Vector3(); + var n2 = new Vector3(); + var n = new Vector3(); + + // this is the buffer offset for the last line of vertices + + base = segments * points.length * 3; + + for ( i = 0, j = 0; i < points.length; i ++, j += 3 ) { + + // select the normal of the vertex in the first line + + n1.x = normals[ j + 0 ]; + n1.y = normals[ j + 1 ]; + n1.z = normals[ j + 2 ]; + + // select the normal of the vertex in the last line + + n2.x = normals[ base + j + 0 ]; + n2.y = normals[ base + j + 1 ]; + n2.z = normals[ base + j + 2 ]; + + // average normals + + n.addVectors( n1, n2 ).normalize(); + + // assign the new values to both normals + + normals[ j + 0 ] = normals[ base + j + 0 ] = n.x; + normals[ j + 1 ] = normals[ base + j + 1 ] = n.y; + normals[ j + 2 ] = normals[ base + j + 2 ] = n.z; + + } + + } + + } + + LatheBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + LatheBufferGeometry.prototype.constructor = LatheBufferGeometry; + + /** + * @author jonobr1 / http://jonobr1.com + * @author Mugen87 / https://github.com/Mugen87 + */ + + // ShapeGeometry + + function ShapeGeometry( shapes, curveSegments ) { + + Geometry.call( this ); + + this.type = 'ShapeGeometry'; + + if ( typeof curveSegments === 'object' ) { + + console.warn( 'THREE.ShapeGeometry: Options parameter has been removed.' ); + + curveSegments = curveSegments.curveSegments; + + } + + this.parameters = { + shapes: shapes, + curveSegments: curveSegments + }; + + this.fromBufferGeometry( new ShapeBufferGeometry( shapes, curveSegments ) ); + this.mergeVertices(); + + } + + ShapeGeometry.prototype = Object.create( Geometry.prototype ); + ShapeGeometry.prototype.constructor = ShapeGeometry; + + // ShapeBufferGeometry + + function ShapeBufferGeometry( shapes, curveSegments ) { + + BufferGeometry.call( this ); + + this.type = 'ShapeBufferGeometry'; + + this.parameters = { + shapes: shapes, + curveSegments: curveSegments + }; + + curveSegments = curveSegments || 12; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var groupStart = 0; + var groupCount = 0; + + // allow single and array values for "shapes" parameter + + if ( Array.isArray( shapes ) === false ) { + + addShape( shapes ); + + } else { + + for ( var i = 0; i < shapes.length; i ++ ) { + + addShape( shapes[ i ] ); + + this.addGroup( groupStart, groupCount, i ); // enables MultiMaterial support + + groupStart += groupCount; + groupCount = 0; + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + + // helper functions + + function addShape( shape ) { + + var i, l, shapeHole; + + var indexOffset = vertices.length / 3; + var points = shape.extractPoints( curveSegments ); + + var shapeVertices = points.shape; + var shapeHoles = points.holes; + + // check direction of vertices + + if ( ShapeUtils.isClockWise( shapeVertices ) === false ) { + + shapeVertices = shapeVertices.reverse(); + + // also check if holes are in the opposite direction + + for ( i = 0, l = shapeHoles.length; i < l; i ++ ) { + + shapeHole = shapeHoles[ i ]; + + if ( ShapeUtils.isClockWise( shapeHole ) === true ) { + + shapeHoles[ i ] = shapeHole.reverse(); + + } + + } + + } + + var faces = ShapeUtils.triangulateShape( shapeVertices, shapeHoles ); + + // join vertices of inner and outer paths to a single array + + for ( i = 0, l = shapeHoles.length; i < l; i ++ ) { + + shapeHole = shapeHoles[ i ]; + shapeVertices = shapeVertices.concat( shapeHole ); + + } + + // vertices, normals, uvs + + for ( i = 0, l = shapeVertices.length; i < l; i ++ ) { + + var vertex = shapeVertices[ i ]; + + vertices.push( vertex.x, vertex.y, 0 ); + normals.push( 0, 0, 1 ); + uvs.push( vertex.x, vertex.y ); // world uvs + + } + + // incides + + for ( i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + var a = face[ 0 ] + indexOffset; + var b = face[ 1 ] + indexOffset; + var c = face[ 2 ] + indexOffset; + + indices.push( a, b, c ); + groupCount += 3; + + } + + } + + } + + ShapeBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + ShapeBufferGeometry.prototype.constructor = ShapeBufferGeometry; + + /** + * @author WestLangley / http://github.com/WestLangley + * @author Mugen87 / https://github.com/Mugen87 + */ + + function EdgesGeometry( geometry, thresholdAngle ) { + + BufferGeometry.call( this ); + + this.type = 'EdgesGeometry'; + + this.parameters = { + thresholdAngle: thresholdAngle + }; + + thresholdAngle = ( thresholdAngle !== undefined ) ? thresholdAngle : 1; + + // buffer + + var vertices = []; + + // helper variables + + var thresholdDot = Math.cos( _Math.DEG2RAD * thresholdAngle ); + var edge = [ 0, 0 ], edges = {}, edge1, edge2; + var key, keys = [ 'a', 'b', 'c' ]; + + // prepare source geometry + + var geometry2; + + if ( geometry.isBufferGeometry ) { + + geometry2 = new Geometry(); + geometry2.fromBufferGeometry( geometry ); + + } else { + + geometry2 = geometry.clone(); + + } + + geometry2.mergeVertices(); + geometry2.computeFaceNormals(); + + var sourceVertices = geometry2.vertices; + var faces = geometry2.faces; + + // now create a data structure where each entry represents an edge with its adjoining faces + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + for ( var j = 0; j < 3; j ++ ) { + + edge1 = face[ keys[ j ] ]; + edge2 = face[ keys[ ( j + 1 ) % 3 ] ]; + edge[ 0 ] = Math.min( edge1, edge2 ); + edge[ 1 ] = Math.max( edge1, edge2 ); + + key = edge[ 0 ] + ',' + edge[ 1 ]; + + if ( edges[ key ] === undefined ) { + + edges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ], face1: i, face2: undefined }; + + } else { + + edges[ key ].face2 = i; + + } + + } + + } + + // generate vertices + + for ( key in edges ) { + + var e = edges[ key ]; + + // an edge is only rendered if the angle (in degrees) between the face normals of the adjoining faces exceeds this value. default = 1 degree. + + if ( e.face2 === undefined || faces[ e.face1 ].normal.dot( faces[ e.face2 ].normal ) <= thresholdDot ) { + + var vertex = sourceVertices[ e.index1 ]; + vertices.push( vertex.x, vertex.y, vertex.z ); + + vertex = sourceVertices[ e.index2 ]; + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + } + + // build geometry + + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + + } + + EdgesGeometry.prototype = Object.create( BufferGeometry.prototype ); + EdgesGeometry.prototype.constructor = EdgesGeometry; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + + // CylinderGeometry + + function CylinderGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { + + Geometry.call( this ); + + this.type = 'CylinderGeometry'; + + this.parameters = { + radiusTop: radiusTop, + radiusBottom: radiusBottom, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + this.fromBufferGeometry( new CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) ); + this.mergeVertices(); + + } + + CylinderGeometry.prototype = Object.create( Geometry.prototype ); + CylinderGeometry.prototype.constructor = CylinderGeometry; + + // CylinderBufferGeometry + + function CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { + + BufferGeometry.call( this ); + + this.type = 'CylinderBufferGeometry'; + + this.parameters = { + radiusTop: radiusTop, + radiusBottom: radiusBottom, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + var scope = this; + + radiusTop = radiusTop !== undefined ? radiusTop : 20; + radiusBottom = radiusBottom !== undefined ? radiusBottom : 20; + height = height !== undefined ? height : 100; + + radialSegments = Math.floor( radialSegments ) || 8; + heightSegments = Math.floor( heightSegments ) || 1; + + openEnded = openEnded !== undefined ? openEnded : false; + thetaStart = thetaStart !== undefined ? thetaStart : 0.0; + thetaLength = thetaLength !== undefined ? thetaLength : 2.0 * Math.PI; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var index = 0; + var indexArray = []; + var halfHeight = height / 2; + var groupStart = 0; + + // generate geometry + + generateTorso(); + + if ( openEnded === false ) { + + if ( radiusTop > 0 ) generateCap( true ); + if ( radiusBottom > 0 ) generateCap( false ); + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + function generateTorso() { + + var x, y; + var normal = new Vector3(); + var vertex = new Vector3(); + + var groupCount = 0; + + // this will be used to calculate the normal + var slope = ( radiusBottom - radiusTop ) / height; + + // generate vertices, normals and uvs + + for ( y = 0; y <= heightSegments; y ++ ) { + + var indexRow = []; + + var v = y / heightSegments; + + // calculate the radius of the current row + + var radius = v * ( radiusBottom - radiusTop ) + radiusTop; + + for ( x = 0; x <= radialSegments; x ++ ) { + + var u = x / radialSegments; + + var theta = u * thetaLength + thetaStart; + + var sinTheta = Math.sin( theta ); + var cosTheta = Math.cos( theta ); + + // vertex + + vertex.x = radius * sinTheta; + vertex.y = - v * height + halfHeight; + vertex.z = radius * cosTheta; + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + normal.set( sinTheta, slope, cosTheta ).normalize(); + normals.push( normal.x, normal.y, normal.z ); + + // uv + + uvs.push( u, 1 - v ); + + // save index of vertex in respective row + + indexRow.push( index ++ ); + + } + + // now save vertices of the row in our index array + + indexArray.push( indexRow ); + + } + + // generate indices + + for ( x = 0; x < radialSegments; x ++ ) { + + for ( y = 0; y < heightSegments; y ++ ) { + + // we use the index array to access the correct indices + + var a = indexArray[ y ][ x ]; + var b = indexArray[ y + 1 ][ x ]; + var c = indexArray[ y + 1 ][ x + 1 ]; + var d = indexArray[ y ][ x + 1 ]; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + // update group counter + + groupCount += 6; + + } + + } + + // add a group to the geometry. this will ensure multi material support + + scope.addGroup( groupStart, groupCount, 0 ); + + // calculate new start value for groups + + groupStart += groupCount; + + } + + function generateCap( top ) { + + var x, centerIndexStart, centerIndexEnd; + + var uv = new Vector2(); + var vertex = new Vector3(); + + var groupCount = 0; + + var radius = ( top === true ) ? radiusTop : radiusBottom; + var sign = ( top === true ) ? 1 : - 1; + + // save the index of the first center vertex + centerIndexStart = index; + + // first we generate the center vertex data of the cap. + // because the geometry needs one set of uvs per face, + // we must generate a center vertex per face/segment + + for ( x = 1; x <= radialSegments; x ++ ) { + + // vertex + + vertices.push( 0, halfHeight * sign, 0 ); + + // normal + + normals.push( 0, sign, 0 ); + + // uv + + uvs.push( 0.5, 0.5 ); + + // increase index + + index ++; + + } + + // save the index of the last center vertex + + centerIndexEnd = index; + + // now we generate the surrounding vertices, normals and uvs + + for ( x = 0; x <= radialSegments; x ++ ) { + + var u = x / radialSegments; + var theta = u * thetaLength + thetaStart; + + var cosTheta = Math.cos( theta ); + var sinTheta = Math.sin( theta ); + + // vertex + + vertex.x = radius * sinTheta; + vertex.y = halfHeight * sign; + vertex.z = radius * cosTheta; + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + normals.push( 0, sign, 0 ); + + // uv + + uv.x = ( cosTheta * 0.5 ) + 0.5; + uv.y = ( sinTheta * 0.5 * sign ) + 0.5; + uvs.push( uv.x, uv.y ); + + // increase index + + index ++; + + } + + // generate indices + + for ( x = 0; x < radialSegments; x ++ ) { + + var c = centerIndexStart + x; + var i = centerIndexEnd + x; + + if ( top === true ) { + + // face top + + indices.push( i, i + 1, c ); + + } else { + + // face bottom + + indices.push( i + 1, i, c ); + + } + + groupCount += 3; + + } + + // add a group to the geometry. this will ensure multi material support + + scope.addGroup( groupStart, groupCount, top === true ? 1 : 2 ); + + // calculate new start value for groups + + groupStart += groupCount; + + } + + } + + CylinderBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + CylinderBufferGeometry.prototype.constructor = CylinderBufferGeometry; + + /** + * @author abelnation / http://github.com/abelnation + */ + + // ConeGeometry + + function ConeGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { + + CylinderGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ); + + this.type = 'ConeGeometry'; + + this.parameters = { + radius: radius, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + } + + ConeGeometry.prototype = Object.create( CylinderGeometry.prototype ); + ConeGeometry.prototype.constructor = ConeGeometry; + + // ConeBufferGeometry + + function ConeBufferGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { + + CylinderBufferGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ); + + this.type = 'ConeBufferGeometry'; + + this.parameters = { + radius: radius, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + } + + ConeBufferGeometry.prototype = Object.create( CylinderBufferGeometry.prototype ); + ConeBufferGeometry.prototype.constructor = ConeBufferGeometry; + + /** + * @author benaadams / https://twitter.com/ben_a_adams + * @author Mugen87 / https://github.com/Mugen87 + * @author hughes + */ + + // CircleGeometry + + function CircleGeometry( radius, segments, thetaStart, thetaLength ) { + + Geometry.call( this ); + + this.type = 'CircleGeometry'; + + this.parameters = { + radius: radius, + segments: segments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + this.fromBufferGeometry( new CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) ); + this.mergeVertices(); + + } + + CircleGeometry.prototype = Object.create( Geometry.prototype ); + CircleGeometry.prototype.constructor = CircleGeometry; + + // CircleBufferGeometry + + function CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) { + + BufferGeometry.call( this ); + + this.type = 'CircleBufferGeometry'; + + this.parameters = { + radius: radius, + segments: segments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + radius = radius || 50; + segments = segments !== undefined ? Math.max( 3, segments ) : 8; + + thetaStart = thetaStart !== undefined ? thetaStart : 0; + thetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var i, s; + var vertex = new Vector3(); + var uv = new Vector2(); + + // center point + + vertices.push( 0, 0, 0 ); + normals.push( 0, 0, 1 ); + uvs.push( 0.5, 0.5 ); + + for ( s = 0, i = 3; s <= segments; s ++, i += 3 ) { + + var segment = thetaStart + s / segments * thetaLength; + + // vertex + + vertex.x = radius * Math.cos( segment ); + vertex.y = radius * Math.sin( segment ); + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + normals.push( 0, 0, 1 ); + + // uvs + + uv.x = ( vertices[ i ] / radius + 1 ) / 2; + uv.y = ( vertices[ i + 1 ] / radius + 1 ) / 2; + + uvs.push( uv.x, uv.y ); + + } + + // indices + + for ( i = 1; i <= segments; i ++ ) { + + indices.push( i, i + 1, 0 ); + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + CircleBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + CircleBufferGeometry.prototype.constructor = CircleBufferGeometry; + + + + var Geometries = Object.freeze({ + WireframeGeometry: WireframeGeometry, + ParametricGeometry: ParametricGeometry, + ParametricBufferGeometry: ParametricBufferGeometry, + TetrahedronGeometry: TetrahedronGeometry, + TetrahedronBufferGeometry: TetrahedronBufferGeometry, + OctahedronGeometry: OctahedronGeometry, + OctahedronBufferGeometry: OctahedronBufferGeometry, + IcosahedronGeometry: IcosahedronGeometry, + IcosahedronBufferGeometry: IcosahedronBufferGeometry, + DodecahedronGeometry: DodecahedronGeometry, + DodecahedronBufferGeometry: DodecahedronBufferGeometry, + PolyhedronGeometry: PolyhedronGeometry, + PolyhedronBufferGeometry: PolyhedronBufferGeometry, + TubeGeometry: TubeGeometry, + TubeBufferGeometry: TubeBufferGeometry, + TorusKnotGeometry: TorusKnotGeometry, + TorusKnotBufferGeometry: TorusKnotBufferGeometry, + TorusGeometry: TorusGeometry, + TorusBufferGeometry: TorusBufferGeometry, + TextGeometry: TextGeometry, + TextBufferGeometry: TextBufferGeometry, + SphereGeometry: SphereGeometry, + SphereBufferGeometry: SphereBufferGeometry, + RingGeometry: RingGeometry, + RingBufferGeometry: RingBufferGeometry, + PlaneGeometry: PlaneGeometry, + PlaneBufferGeometry: PlaneBufferGeometry, + LatheGeometry: LatheGeometry, + LatheBufferGeometry: LatheBufferGeometry, + ShapeGeometry: ShapeGeometry, + ShapeBufferGeometry: ShapeBufferGeometry, + ExtrudeGeometry: ExtrudeGeometry, + ExtrudeBufferGeometry: ExtrudeBufferGeometry, + EdgesGeometry: EdgesGeometry, + ConeGeometry: ConeGeometry, + ConeBufferGeometry: ConeBufferGeometry, + CylinderGeometry: CylinderGeometry, + CylinderBufferGeometry: CylinderBufferGeometry, + CircleGeometry: CircleGeometry, + CircleBufferGeometry: CircleBufferGeometry, + BoxGeometry: BoxGeometry, + BoxBufferGeometry: BoxBufferGeometry + }); + + /** + * @author mrdoob / http://mrdoob.com/ + * + * parameters = { + * opacity: <float> + * } + */ + + function ShadowMaterial( parameters ) { + + ShaderMaterial.call( this, { + uniforms: UniformsUtils.merge( [ + UniformsLib.lights, + { + opacity: { value: 1.0 } + } + ] ), + vertexShader: ShaderChunk[ 'shadow_vert' ], + fragmentShader: ShaderChunk[ 'shadow_frag' ] + } ); + + this.lights = true; + this.transparent = true; + + Object.defineProperties( this, { + opacity: { + enumerable: true, + get: function () { + return this.uniforms.opacity.value; + }, + set: function ( value ) { + this.uniforms.opacity.value = value; + } + } + } ); + + this.setValues( parameters ); + + } + + ShadowMaterial.prototype = Object.create( ShaderMaterial.prototype ); + ShadowMaterial.prototype.constructor = ShadowMaterial; + + ShadowMaterial.prototype.isShadowMaterial = true; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function RawShaderMaterial( parameters ) { + + ShaderMaterial.call( this, parameters ); + + this.type = 'RawShaderMaterial'; + + } + + RawShaderMaterial.prototype = Object.create( ShaderMaterial.prototype ); + RawShaderMaterial.prototype.constructor = RawShaderMaterial; + + RawShaderMaterial.prototype.isRawShaderMaterial = true; + + /** + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * color: <hex>, + * roughness: <float>, + * metalness: <float>, + * opacity: <float>, + * + * map: new THREE.Texture( <Image> ), + * + * lightMap: new THREE.Texture( <Image> ), + * lightMapIntensity: <float> + * + * aoMap: new THREE.Texture( <Image> ), + * aoMapIntensity: <float> + * + * emissive: <hex>, + * emissiveIntensity: <float> + * emissiveMap: new THREE.Texture( <Image> ), + * + * bumpMap: new THREE.Texture( <Image> ), + * bumpScale: <float>, + * + * normalMap: new THREE.Texture( <Image> ), + * normalScale: <Vector2>, + * + * displacementMap: new THREE.Texture( <Image> ), + * displacementScale: <float>, + * displacementBias: <float>, + * + * roughnessMap: new THREE.Texture( <Image> ), + * + * metalnessMap: new THREE.Texture( <Image> ), + * + * alphaMap: new THREE.Texture( <Image> ), + * + * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ), + * envMapIntensity: <float> + * + * refractionRatio: <float>, + * + * wireframe: <boolean>, + * wireframeLinewidth: <float>, + * + * skinning: <bool>, + * morphTargets: <bool>, + * morphNormals: <bool> + * } + */ + + function MeshStandardMaterial( parameters ) { + + Material.call( this ); + + this.defines = { 'STANDARD': '' }; + + this.type = 'MeshStandardMaterial'; + + this.color = new Color( 0xffffff ); // diffuse + this.roughness = 0.5; + this.metalness = 0.5; + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.emissive = new Color( 0x000000 ); + this.emissiveIntensity = 1.0; + this.emissiveMap = null; + + this.bumpMap = null; + this.bumpScale = 1; + + this.normalMap = null; + this.normalScale = new Vector2( 1, 1 ); + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.roughnessMap = null; + + this.metalnessMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.envMapIntensity = 1.0; + + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.setValues( parameters ); + + } + + MeshStandardMaterial.prototype = Object.create( Material.prototype ); + MeshStandardMaterial.prototype.constructor = MeshStandardMaterial; + + MeshStandardMaterial.prototype.isMeshStandardMaterial = true; + + MeshStandardMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.defines = { 'STANDARD': '' }; + + this.color.copy( source.color ); + this.roughness = source.roughness; + this.metalness = source.metalness; + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.emissive.copy( source.emissive ); + this.emissiveMap = source.emissiveMap; + this.emissiveIntensity = source.emissiveIntensity; + + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + + this.normalMap = source.normalMap; + this.normalScale.copy( source.normalScale ); + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.roughnessMap = source.roughnessMap; + + this.metalnessMap = source.metalnessMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.envMapIntensity = source.envMapIntensity; + + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + + }; + + /** + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * reflectivity: <float> + * } + */ + + function MeshPhysicalMaterial( parameters ) { + + MeshStandardMaterial.call( this ); + + this.defines = { 'PHYSICAL': '' }; + + this.type = 'MeshPhysicalMaterial'; + + this.reflectivity = 0.5; // maps to F0 = 0.04 + + this.clearCoat = 0.0; + this.clearCoatRoughness = 0.0; + + this.setValues( parameters ); + + } + + MeshPhysicalMaterial.prototype = Object.create( MeshStandardMaterial.prototype ); + MeshPhysicalMaterial.prototype.constructor = MeshPhysicalMaterial; + + MeshPhysicalMaterial.prototype.isMeshPhysicalMaterial = true; + + MeshPhysicalMaterial.prototype.copy = function ( source ) { + + MeshStandardMaterial.prototype.copy.call( this, source ); + + this.defines = { 'PHYSICAL': '' }; + + this.reflectivity = source.reflectivity; + + this.clearCoat = source.clearCoat; + this.clearCoatRoughness = source.clearCoatRoughness; + + return this; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: <hex>, + * specular: <hex>, + * shininess: <float>, + * opacity: <float>, + * + * map: new THREE.Texture( <Image> ), + * + * lightMap: new THREE.Texture( <Image> ), + * lightMapIntensity: <float> + * + * aoMap: new THREE.Texture( <Image> ), + * aoMapIntensity: <float> + * + * emissive: <hex>, + * emissiveIntensity: <float> + * emissiveMap: new THREE.Texture( <Image> ), + * + * bumpMap: new THREE.Texture( <Image> ), + * bumpScale: <float>, + * + * normalMap: new THREE.Texture( <Image> ), + * normalScale: <Vector2>, + * + * displacementMap: new THREE.Texture( <Image> ), + * displacementScale: <float>, + * displacementBias: <float>, + * + * specularMap: new THREE.Texture( <Image> ), + * + * alphaMap: new THREE.Texture( <Image> ), + * + * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ), + * combine: THREE.Multiply, + * reflectivity: <float>, + * refractionRatio: <float>, + * + * wireframe: <boolean>, + * wireframeLinewidth: <float>, + * + * skinning: <bool>, + * morphTargets: <bool>, + * morphNormals: <bool> + * } + */ + + function MeshPhongMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshPhongMaterial'; + + this.color = new Color( 0xffffff ); // diffuse + this.specular = new Color( 0x111111 ); + this.shininess = 30; + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.emissive = new Color( 0x000000 ); + this.emissiveIntensity = 1.0; + this.emissiveMap = null; + + this.bumpMap = null; + this.bumpScale = 1; + + this.normalMap = null; + this.normalScale = new Vector2( 1, 1 ); + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.specularMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.combine = MultiplyOperation; + this.reflectivity = 1; + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.setValues( parameters ); + + } + + MeshPhongMaterial.prototype = Object.create( Material.prototype ); + MeshPhongMaterial.prototype.constructor = MeshPhongMaterial; + + MeshPhongMaterial.prototype.isMeshPhongMaterial = true; + + MeshPhongMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + this.specular.copy( source.specular ); + this.shininess = source.shininess; + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.emissive.copy( source.emissive ); + this.emissiveMap = source.emissiveMap; + this.emissiveIntensity = source.emissiveIntensity; + + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + + this.normalMap = source.normalMap; + this.normalScale.copy( source.normalScale ); + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.specularMap = source.specularMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.combine = source.combine; + this.reflectivity = source.reflectivity; + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + + }; + + /** + * @author takahirox / http://github.com/takahirox + * + * parameters = { + * gradientMap: new THREE.Texture( <Image> ) + * } + */ + + function MeshToonMaterial( parameters ) { + + MeshPhongMaterial.call( this ); + + this.defines = { 'TOON': '' }; + + this.type = 'MeshToonMaterial'; + + this.gradientMap = null; + + this.setValues( parameters ); + + } + + MeshToonMaterial.prototype = Object.create( MeshPhongMaterial.prototype ); + MeshToonMaterial.prototype.constructor = MeshToonMaterial; + + MeshToonMaterial.prototype.isMeshToonMaterial = true; + + MeshToonMaterial.prototype.copy = function ( source ) { + + MeshPhongMaterial.prototype.copy.call( this, source ); + + this.gradientMap = source.gradientMap; + + return this; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * opacity: <float>, + * + * bumpMap: new THREE.Texture( <Image> ), + * bumpScale: <float>, + * + * normalMap: new THREE.Texture( <Image> ), + * normalScale: <Vector2>, + * + * displacementMap: new THREE.Texture( <Image> ), + * displacementScale: <float>, + * displacementBias: <float>, + * + * wireframe: <boolean>, + * wireframeLinewidth: <float> + * + * skinning: <bool>, + * morphTargets: <bool>, + * morphNormals: <bool> + * } + */ + + function MeshNormalMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshNormalMaterial'; + + this.bumpMap = null; + this.bumpScale = 1; + + this.normalMap = null; + this.normalScale = new Vector2( 1, 1 ); + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.wireframe = false; + this.wireframeLinewidth = 1; + + this.fog = false; + this.lights = false; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.setValues( parameters ); + + } + + MeshNormalMaterial.prototype = Object.create( Material.prototype ); + MeshNormalMaterial.prototype.constructor = MeshNormalMaterial; + + MeshNormalMaterial.prototype.isMeshNormalMaterial = true; + + MeshNormalMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + + this.normalMap = source.normalMap; + this.normalScale.copy( source.normalScale ); + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: <hex>, + * opacity: <float>, + * + * map: new THREE.Texture( <Image> ), + * + * lightMap: new THREE.Texture( <Image> ), + * lightMapIntensity: <float> + * + * aoMap: new THREE.Texture( <Image> ), + * aoMapIntensity: <float> + * + * emissive: <hex>, + * emissiveIntensity: <float> + * emissiveMap: new THREE.Texture( <Image> ), + * + * specularMap: new THREE.Texture( <Image> ), + * + * alphaMap: new THREE.Texture( <Image> ), + * + * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ), + * combine: THREE.Multiply, + * reflectivity: <float>, + * refractionRatio: <float>, + * + * wireframe: <boolean>, + * wireframeLinewidth: <float>, + * + * skinning: <bool>, + * morphTargets: <bool>, + * morphNormals: <bool> + * } + */ + + function MeshLambertMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshLambertMaterial'; + + this.color = new Color( 0xffffff ); // diffuse + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.emissive = new Color( 0x000000 ); + this.emissiveIntensity = 1.0; + this.emissiveMap = null; + + this.specularMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.combine = MultiplyOperation; + this.reflectivity = 1; + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.setValues( parameters ); + + } + + MeshLambertMaterial.prototype = Object.create( Material.prototype ); + MeshLambertMaterial.prototype.constructor = MeshLambertMaterial; + + MeshLambertMaterial.prototype.isMeshLambertMaterial = true; + + MeshLambertMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.emissive.copy( source.emissive ); + this.emissiveMap = source.emissiveMap; + this.emissiveIntensity = source.emissiveIntensity; + + this.specularMap = source.specularMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.combine = source.combine; + this.reflectivity = source.reflectivity; + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: <hex>, + * opacity: <float>, + * + * linewidth: <float>, + * + * scale: <float>, + * dashSize: <float>, + * gapSize: <float> + * } + */ + + function LineDashedMaterial( parameters ) { + + Material.call( this ); + + this.type = 'LineDashedMaterial'; + + this.color = new Color( 0xffffff ); + + this.linewidth = 1; + + this.scale = 1; + this.dashSize = 3; + this.gapSize = 1; + + this.lights = false; + + this.setValues( parameters ); + + } + + LineDashedMaterial.prototype = Object.create( Material.prototype ); + LineDashedMaterial.prototype.constructor = LineDashedMaterial; + + LineDashedMaterial.prototype.isLineDashedMaterial = true; + + LineDashedMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.linewidth = source.linewidth; + + this.scale = source.scale; + this.dashSize = source.dashSize; + this.gapSize = source.gapSize; + + return this; + + }; + + + + var Materials = Object.freeze({ + ShadowMaterial: ShadowMaterial, + SpriteMaterial: SpriteMaterial, + RawShaderMaterial: RawShaderMaterial, + ShaderMaterial: ShaderMaterial, + PointsMaterial: PointsMaterial, + MeshPhysicalMaterial: MeshPhysicalMaterial, + MeshStandardMaterial: MeshStandardMaterial, + MeshPhongMaterial: MeshPhongMaterial, + MeshToonMaterial: MeshToonMaterial, + MeshNormalMaterial: MeshNormalMaterial, + MeshLambertMaterial: MeshLambertMaterial, + MeshDepthMaterial: MeshDepthMaterial, + MeshBasicMaterial: MeshBasicMaterial, + LineDashedMaterial: LineDashedMaterial, + LineBasicMaterial: LineBasicMaterial, + Material: Material + }); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + var Cache = { + + enabled: false, + + files: {}, + + add: function ( key, file ) { + + if ( this.enabled === false ) return; + + // console.log( 'THREE.Cache', 'Adding key:', key ); + + this.files[ key ] = file; + + }, + + get: function ( key ) { + + if ( this.enabled === false ) return; + + // console.log( 'THREE.Cache', 'Checking key:', key ); + + return this.files[ key ]; + + }, + + remove: function ( key ) { + + delete this.files[ key ]; + + }, + + clear: function () { + + this.files = {}; + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function LoadingManager( onLoad, onProgress, onError ) { + + var scope = this; + + var isLoading = false, itemsLoaded = 0, itemsTotal = 0; + + this.onStart = undefined; + this.onLoad = onLoad; + this.onProgress = onProgress; + this.onError = onError; + + this.itemStart = function ( url ) { + + itemsTotal ++; + + if ( isLoading === false ) { + + if ( scope.onStart !== undefined ) { + + scope.onStart( url, itemsLoaded, itemsTotal ); + + } + + } + + isLoading = true; + + }; + + this.itemEnd = function ( url ) { + + itemsLoaded ++; + + if ( scope.onProgress !== undefined ) { + + scope.onProgress( url, itemsLoaded, itemsTotal ); + + } + + if ( itemsLoaded === itemsTotal ) { + + isLoading = false; + + if ( scope.onLoad !== undefined ) { + + scope.onLoad(); + + } + + } + + }; + + this.itemError = function ( url ) { + + if ( scope.onError !== undefined ) { + + scope.onError( url ); + + } + + }; + + } + + var DefaultLoadingManager = new LoadingManager(); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function FileLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( FileLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + if ( url === undefined ) url = ''; + + if ( this.path !== undefined ) url = this.path + url; + + var scope = this; + + var cached = Cache.get( url ); + + if ( cached !== undefined ) { + + scope.manager.itemStart( url ); + + setTimeout( function () { + + if ( onLoad ) onLoad( cached ); + + scope.manager.itemEnd( url ); + + }, 0 ); + + return cached; + + } + + // Check for data: URI + var dataUriRegex = /^data:(.*?)(;base64)?,(.*)$/; + var dataUriRegexResult = url.match( dataUriRegex ); + + // Safari can not handle Data URIs through XMLHttpRequest so process manually + if ( dataUriRegexResult ) { + + var mimeType = dataUriRegexResult[ 1 ]; + var isBase64 = !! dataUriRegexResult[ 2 ]; + var data = dataUriRegexResult[ 3 ]; + + data = window.decodeURIComponent( data ); + + if ( isBase64 ) data = window.atob( data ); + + try { + + var response; + var responseType = ( this.responseType || '' ).toLowerCase(); + + switch ( responseType ) { + + case 'arraybuffer': + case 'blob': + + response = new ArrayBuffer( data.length ); + + var view = new Uint8Array( response ); + + for ( var i = 0; i < data.length; i ++ ) { + + view[ i ] = data.charCodeAt( i ); + + } + + if ( responseType === 'blob' ) { + + response = new Blob( [ response ], { type: mimeType } ); + + } + + break; + + case 'document': + + var parser = new DOMParser(); + response = parser.parseFromString( data, mimeType ); + + break; + + case 'json': + + response = JSON.parse( data ); + + break; + + default: // 'text' or other + + response = data; + + break; + + } + + // Wait for next browser tick + window.setTimeout( function () { + + if ( onLoad ) onLoad( response ); + + scope.manager.itemEnd( url ); + + }, 0 ); + + } catch ( error ) { + + // Wait for next browser tick + window.setTimeout( function () { + + if ( onError ) onError( error ); + + scope.manager.itemEnd( url ); + scope.manager.itemError( url ); + + }, 0 ); + + } + + } else { + + var request = new XMLHttpRequest(); + request.open( 'GET', url, true ); + + request.addEventListener( 'load', function ( event ) { + + var response = event.target.response; + + Cache.add( url, response ); + + if ( this.status === 200 ) { + + if ( onLoad ) onLoad( response ); + + scope.manager.itemEnd( url ); + + } else if ( this.status === 0 ) { + + // Some browsers return HTTP Status 0 when using non-http protocol + // e.g. 'file://' or 'data://'. Handle as success. + + console.warn( 'THREE.FileLoader: HTTP Status 0 received.' ); + + if ( onLoad ) onLoad( response ); + + scope.manager.itemEnd( url ); + + } else { + + if ( onError ) onError( event ); + + scope.manager.itemEnd( url ); + scope.manager.itemError( url ); + + } + + }, false ); + + if ( onProgress !== undefined ) { + + request.addEventListener( 'progress', function ( event ) { + + onProgress( event ); + + }, false ); + + } + + request.addEventListener( 'error', function ( event ) { + + if ( onError ) onError( event ); + + scope.manager.itemEnd( url ); + scope.manager.itemError( url ); + + }, false ); + + if ( this.responseType !== undefined ) request.responseType = this.responseType; + if ( this.withCredentials !== undefined ) request.withCredentials = this.withCredentials; + + if ( request.overrideMimeType ) request.overrideMimeType( this.mimeType !== undefined ? this.mimeType : 'text/plain' ); + + for ( var header in this.requestHeader ) { + + request.setRequestHeader( header, this.requestHeader[ header ] ); + + } + + request.send( null ); + + } + + scope.manager.itemStart( url ); + + return request; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + }, + + setResponseType: function ( value ) { + + this.responseType = value; + return this; + + }, + + setWithCredentials: function ( value ) { + + this.withCredentials = value; + return this; + + }, + + setMimeType: function ( value ) { + + this.mimeType = value; + return this; + + }, + + setRequestHeader: function ( value ) { + + this.requestHeader = value; + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * + * Abstract Base class to block based textures loader (dds, pvr, ...) + */ + + function CompressedTextureLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + // override in sub classes + this._parser = null; + + } + + Object.assign( CompressedTextureLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var images = []; + + var texture = new CompressedTexture(); + texture.image = images; + + var loader = new FileLoader( this.manager ); + loader.setPath( this.path ); + loader.setResponseType( 'arraybuffer' ); + + function loadTexture( i ) { + + loader.load( url[ i ], function ( buffer ) { + + var texDatas = scope._parser( buffer, true ); + + images[ i ] = { + width: texDatas.width, + height: texDatas.height, + format: texDatas.format, + mipmaps: texDatas.mipmaps + }; + + loaded += 1; + + if ( loaded === 6 ) { + + if ( texDatas.mipmapCount === 1 ) + texture.minFilter = LinearFilter; + + texture.format = texDatas.format; + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture ); + + } + + }, onProgress, onError ); + + } + + if ( Array.isArray( url ) ) { + + var loaded = 0; + + for ( var i = 0, il = url.length; i < il; ++ i ) { + + loadTexture( i ); + + } + + } else { + + // compressed cubemap texture stored in a single DDS file + + loader.load( url, function ( buffer ) { + + var texDatas = scope._parser( buffer, true ); + + if ( texDatas.isCubemap ) { + + var faces = texDatas.mipmaps.length / texDatas.mipmapCount; + + for ( var f = 0; f < faces; f ++ ) { + + images[ f ] = { mipmaps : [] }; + + for ( var i = 0; i < texDatas.mipmapCount; i ++ ) { + + images[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] ); + images[ f ].format = texDatas.format; + images[ f ].width = texDatas.width; + images[ f ].height = texDatas.height; + + } + + } + + } else { + + texture.image.width = texDatas.width; + texture.image.height = texDatas.height; + texture.mipmaps = texDatas.mipmaps; + + } + + if ( texDatas.mipmapCount === 1 ) { + + texture.minFilter = LinearFilter; + + } + + texture.format = texDatas.format; + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture ); + + }, onProgress, onError ); + + } + + return texture; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + + } ); + + /** + * @author Nikos M. / https://github.com/foo123/ + * + * Abstract Base class to load generic binary textures formats (rgbe, hdr, ...) + */ + + function DataTextureLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + // override in sub classes + this._parser = null; + + } + + Object.assign( DataTextureLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var texture = new DataTexture(); + + var loader = new FileLoader( this.manager ); + loader.setResponseType( 'arraybuffer' ); + + loader.load( url, function ( buffer ) { + + var texData = scope._parser( buffer ); + + if ( ! texData ) return; + + if ( undefined !== texData.image ) { + + texture.image = texData.image; + + } else if ( undefined !== texData.data ) { + + texture.image.width = texData.width; + texture.image.height = texData.height; + texture.image.data = texData.data; + + } + + texture.wrapS = undefined !== texData.wrapS ? texData.wrapS : ClampToEdgeWrapping; + texture.wrapT = undefined !== texData.wrapT ? texData.wrapT : ClampToEdgeWrapping; + + texture.magFilter = undefined !== texData.magFilter ? texData.magFilter : LinearFilter; + texture.minFilter = undefined !== texData.minFilter ? texData.minFilter : LinearMipMapLinearFilter; + + texture.anisotropy = undefined !== texData.anisotropy ? texData.anisotropy : 1; + + if ( undefined !== texData.format ) { + + texture.format = texData.format; + + } + if ( undefined !== texData.type ) { + + texture.type = texData.type; + + } + + if ( undefined !== texData.mipmaps ) { + + texture.mipmaps = texData.mipmaps; + + } + + if ( 1 === texData.mipmapCount ) { + + texture.minFilter = LinearFilter; + + } + + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture, texData ); + + }, onProgress, onError ); + + + return texture; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function ImageLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( ImageLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + if ( url === undefined ) url = ''; + + if ( this.path !== undefined ) url = this.path + url; + + var scope = this; + + var cached = Cache.get( url ); + + if ( cached !== undefined ) { + + scope.manager.itemStart( url ); + + setTimeout( function () { + + if ( onLoad ) onLoad( cached ); + + scope.manager.itemEnd( url ); + + }, 0 ); + + return cached; + + } + + var image = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'img' ); + + image.addEventListener( 'load', function () { + + Cache.add( url, this ); + + if ( onLoad ) onLoad( this ); + + scope.manager.itemEnd( url ); + + }, false ); + + /* + image.addEventListener( 'progress', function ( event ) { + + if ( onProgress ) onProgress( event ); + + }, false ); + */ + + image.addEventListener( 'error', function ( event ) { + + if ( onError ) onError( event ); + + scope.manager.itemEnd( url ); + scope.manager.itemError( url ); + + }, false ); + + if ( url.substr( 0, 5 ) !== 'data:' ) { + + if ( this.crossOrigin !== undefined ) image.crossOrigin = this.crossOrigin; + + } + + scope.manager.itemStart( url ); + + image.src = url; + + return image; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + return this; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function CubeTextureLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( CubeTextureLoader.prototype, { + + load: function ( urls, onLoad, onProgress, onError ) { + + var texture = new CubeTexture(); + + var loader = new ImageLoader( this.manager ); + loader.setCrossOrigin( this.crossOrigin ); + loader.setPath( this.path ); + + var loaded = 0; + + function loadTexture( i ) { + + loader.load( urls[ i ], function ( image ) { + + texture.images[ i ] = image; + + loaded ++; + + if ( loaded === 6 ) { + + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture ); + + } + + }, undefined, onError ); + + } + + for ( var i = 0; i < urls.length; ++ i ) { + + loadTexture( i ); + + } + + return texture; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + return this; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function TextureLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( TextureLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var loader = new ImageLoader( this.manager ); + loader.setCrossOrigin( this.crossOrigin ); + loader.setPath( this.path ); + + var texture = new Texture(); + texture.image = loader.load( url, function () { + + // JPEGs can't have an alpha channel, so memory can be saved by storing them as RGB. + var isJPEG = url.search( /\.(jpg|jpeg)$/ ) > 0 || url.search( /^data\:image\/jpeg/ ) === 0; + + texture.format = isJPEG ? RGBFormat : RGBAFormat; + texture.needsUpdate = true; + + if ( onLoad !== undefined ) { + + onLoad( texture ); + + } + + }, onProgress, onError ); + + return texture; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + return this; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function Light( color, intensity ) { + + Object3D.call( this ); + + this.type = 'Light'; + + this.color = new Color( color ); + this.intensity = intensity !== undefined ? intensity : 1; + + this.receiveShadow = undefined; + + } + + Light.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Light, + + isLight: true, + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + this.intensity = source.intensity; + + return this; + + }, + + toJSON: function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + data.object.color = this.color.getHex(); + data.object.intensity = this.intensity; + + if ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex(); + + if ( this.distance !== undefined ) data.object.distance = this.distance; + if ( this.angle !== undefined ) data.object.angle = this.angle; + if ( this.decay !== undefined ) data.object.decay = this.decay; + if ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra; + + if ( this.shadow !== undefined ) data.object.shadow = this.shadow.toJSON(); + + return data; + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function HemisphereLight( skyColor, groundColor, intensity ) { + + Light.call( this, skyColor, intensity ); + + this.type = 'HemisphereLight'; + + this.castShadow = undefined; + + this.position.copy( Object3D.DefaultUp ); + this.updateMatrix(); + + this.groundColor = new Color( groundColor ); + + } + + HemisphereLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: HemisphereLight, + + isHemisphereLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.groundColor.copy( source.groundColor ); + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function LightShadow( camera ) { + + this.camera = camera; + + this.bias = 0; + this.radius = 1; + + this.mapSize = new Vector2( 512, 512 ); + + this.map = null; + this.matrix = new Matrix4(); + + } + + Object.assign( LightShadow.prototype, { + + copy: function ( source ) { + + this.camera = source.camera.clone(); + + this.bias = source.bias; + this.radius = source.radius; + + this.mapSize.copy( source.mapSize ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + toJSON: function () { + + var object = {}; + + if ( this.bias !== 0 ) object.bias = this.bias; + if ( this.radius !== 1 ) object.radius = this.radius; + if ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray(); + + object.camera = this.camera.toJSON( false ).object; + delete object.camera.matrix; + + return object; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function SpotLightShadow() { + + LightShadow.call( this, new PerspectiveCamera( 50, 1, 0.5, 500 ) ); + + } + + SpotLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), { + + constructor: SpotLightShadow, + + isSpotLightShadow: true, + + update: function ( light ) { + + var camera = this.camera; + + var fov = _Math.RAD2DEG * 2 * light.angle; + var aspect = this.mapSize.width / this.mapSize.height; + var far = light.distance || camera.far; + + if ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) { + + camera.fov = fov; + camera.aspect = aspect; + camera.far = far; + camera.updateProjectionMatrix(); + + } + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function SpotLight( color, intensity, distance, angle, penumbra, decay ) { + + Light.call( this, color, intensity ); + + this.type = 'SpotLight'; + + this.position.copy( Object3D.DefaultUp ); + this.updateMatrix(); + + this.target = new Object3D(); + + Object.defineProperty( this, 'power', { + get: function () { + // intensity = power per solid angle. + // ref: equation (17) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf + return this.intensity * Math.PI; + }, + set: function ( power ) { + // intensity = power per solid angle. + // ref: equation (17) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf + this.intensity = power / Math.PI; + } + } ); + + this.distance = ( distance !== undefined ) ? distance : 0; + this.angle = ( angle !== undefined ) ? angle : Math.PI / 3; + this.penumbra = ( penumbra !== undefined ) ? penumbra : 0; + this.decay = ( decay !== undefined ) ? decay : 1; // for physically correct lights, should be 2. + + this.shadow = new SpotLightShadow(); + + } + + SpotLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: SpotLight, + + isSpotLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.distance = source.distance; + this.angle = source.angle; + this.penumbra = source.penumbra; + this.decay = source.decay; + + this.target = source.target.clone(); + + this.shadow = source.shadow.clone(); + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + + function PointLight( color, intensity, distance, decay ) { + + Light.call( this, color, intensity ); + + this.type = 'PointLight'; + + Object.defineProperty( this, 'power', { + get: function () { + // intensity = power per solid angle. + // ref: equation (15) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf + return this.intensity * 4 * Math.PI; + + }, + set: function ( power ) { + // intensity = power per solid angle. + // ref: equation (15) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf + this.intensity = power / ( 4 * Math.PI ); + } + } ); + + this.distance = ( distance !== undefined ) ? distance : 0; + this.decay = ( decay !== undefined ) ? decay : 1; // for physically correct lights, should be 2. + + this.shadow = new LightShadow( new PerspectiveCamera( 90, 1, 0.5, 500 ) ); + + } + + PointLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: PointLight, + + isPointLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.distance = source.distance; + this.decay = source.decay; + + this.shadow = source.shadow.clone(); + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function DirectionalLightShadow( ) { + + LightShadow.call( this, new OrthographicCamera( - 5, 5, 5, - 5, 0.5, 500 ) ); + + } + + DirectionalLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), { + + constructor: DirectionalLightShadow + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function DirectionalLight( color, intensity ) { + + Light.call( this, color, intensity ); + + this.type = 'DirectionalLight'; + + this.position.copy( Object3D.DefaultUp ); + this.updateMatrix(); + + this.target = new Object3D(); + + this.shadow = new DirectionalLightShadow(); + + } + + DirectionalLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: DirectionalLight, + + isDirectionalLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.target = source.target.clone(); + + this.shadow = source.shadow.clone(); + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function AmbientLight( color, intensity ) { + + Light.call( this, color, intensity ); + + this.type = 'AmbientLight'; + + this.castShadow = undefined; + + } + + AmbientLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: AmbientLight, + + isAmbientLight: true + + } ); + + /** + * @author abelnation / http://github.com/abelnation + */ + + function RectAreaLight( color, intensity, width, height ) { + + Light.call( this, color, intensity ); + + this.type = 'RectAreaLight'; + + this.position.set( 0, 1, 0 ); + this.updateMatrix(); + + this.width = ( width !== undefined ) ? width : 10; + this.height = ( height !== undefined ) ? height : 10; + + // TODO (abelnation): distance/decay + + // TODO (abelnation): update method for RectAreaLight to update transform to lookat target + + // TODO (abelnation): shadows + + } + + // TODO (abelnation): RectAreaLight update when light shape is changed + RectAreaLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: RectAreaLight, + + isRectAreaLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.width = source.width; + this.height = source.height; + + return this; + + }, + + toJSON: function ( meta ) { + + var data = Light.prototype.toJSON.call( this, meta ); + + data.object.width = this.width; + data.object.height = this.height; + + return data; + + } + + } ); + + /** + * @author tschw + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + */ + + var AnimationUtils = { + + // same as Array.prototype.slice, but also works on typed arrays + arraySlice: function ( array, from, to ) { + + if ( AnimationUtils.isTypedArray( array ) ) { + + // in ios9 array.subarray(from, undefined) will return empty array + // but array.subarray(from) or array.subarray(from, len) is correct + return new array.constructor( array.subarray( from, to !== undefined ? to : array.length ) ); + + } + + return array.slice( from, to ); + + }, + + // converts an array to a specific type + convertArray: function ( array, type, forceClone ) { + + if ( ! array || // let 'undefined' and 'null' pass + ! forceClone && array.constructor === type ) return array; + + if ( typeof type.BYTES_PER_ELEMENT === 'number' ) { + + return new type( array ); // create typed array + + } + + return Array.prototype.slice.call( array ); // create Array + + }, + + isTypedArray: function ( object ) { + + return ArrayBuffer.isView( object ) && + ! ( object instanceof DataView ); + + }, + + // returns an array by which times and values can be sorted + getKeyframeOrder: function ( times ) { + + function compareTime( i, j ) { + + return times[ i ] - times[ j ]; + + } + + var n = times.length; + var result = new Array( n ); + for ( var i = 0; i !== n; ++ i ) result[ i ] = i; + + result.sort( compareTime ); + + return result; + + }, + + // uses the array previously returned by 'getKeyframeOrder' to sort data + sortedArray: function ( values, stride, order ) { + + var nValues = values.length; + var result = new values.constructor( nValues ); + + for ( var i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) { + + var srcOffset = order[ i ] * stride; + + for ( var j = 0; j !== stride; ++ j ) { + + result[ dstOffset ++ ] = values[ srcOffset + j ]; + + } + + } + + return result; + + }, + + // function for parsing AOS keyframe formats + flattenJSON: function ( jsonKeys, times, values, valuePropertyName ) { + + var i = 1, key = jsonKeys[ 0 ]; + + while ( key !== undefined && key[ valuePropertyName ] === undefined ) { + + key = jsonKeys[ i ++ ]; + + } + + if ( key === undefined ) return; // no data + + var value = key[ valuePropertyName ]; + if ( value === undefined ) return; // no data + + if ( Array.isArray( value ) ) { + + do { + + value = key[ valuePropertyName ]; + + if ( value !== undefined ) { + + times.push( key.time ); + values.push.apply( values, value ); // push all elements + + } + + key = jsonKeys[ i ++ ]; + + } while ( key !== undefined ); + + } else if ( value.toArray !== undefined ) { + + // ...assume THREE.Math-ish + + do { + + value = key[ valuePropertyName ]; + + if ( value !== undefined ) { + + times.push( key.time ); + value.toArray( values, values.length ); + + } + + key = jsonKeys[ i ++ ]; + + } while ( key !== undefined ); + + } else { + + // otherwise push as-is + + do { + + value = key[ valuePropertyName ]; + + if ( value !== undefined ) { + + times.push( key.time ); + values.push( value ); + + } + + key = jsonKeys[ i ++ ]; + + } while ( key !== undefined ); + + } + + } + + }; + + /** + * Abstract base class of interpolants over parametric samples. + * + * The parameter domain is one dimensional, typically the time or a path + * along a curve defined by the data. + * + * The sample values can have any dimensionality and derived classes may + * apply special interpretations to the data. + * + * This class provides the interval seek in a Template Method, deferring + * the actual interpolation to derived classes. + * + * Time complexity is O(1) for linear access crossing at most two points + * and O(log N) for random access, where N is the number of positions. + * + * References: + * + * http://www.oodesign.com/template-method-pattern.html + * + * @author tschw + */ + + function Interpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + this.parameterPositions = parameterPositions; + this._cachedIndex = 0; + + this.resultBuffer = resultBuffer !== undefined ? + resultBuffer : new sampleValues.constructor( sampleSize ); + this.sampleValues = sampleValues; + this.valueSize = sampleSize; + + } + + Object.assign( Interpolant.prototype, { + + evaluate: function( t ) { + + var pp = this.parameterPositions, + i1 = this._cachedIndex, + + t1 = pp[ i1 ], + t0 = pp[ i1 - 1 ]; + + validate_interval: { + + seek: { + + var right; + + linear_scan: { + //- See http://jsperf.com/comparison-to-undefined/3 + //- slower code: + //- + //- if ( t >= t1 || t1 === undefined ) { + forward_scan: if ( ! ( t < t1 ) ) { + + for ( var giveUpAt = i1 + 2; ;) { + + if ( t1 === undefined ) { + + if ( t < t0 ) break forward_scan; + + // after end + + i1 = pp.length; + this._cachedIndex = i1; + return this.afterEnd_( i1 - 1, t, t0 ); + + } + + if ( i1 === giveUpAt ) break; // this loop + + t0 = t1; + t1 = pp[ ++ i1 ]; + + if ( t < t1 ) { + + // we have arrived at the sought interval + break seek; + + } + + } + + // prepare binary search on the right side of the index + right = pp.length; + break linear_scan; + + } + + //- slower code: + //- if ( t < t0 || t0 === undefined ) { + if ( ! ( t >= t0 ) ) { + + // looping? + + var t1global = pp[ 1 ]; + + if ( t < t1global ) { + + i1 = 2; // + 1, using the scan for the details + t0 = t1global; + + } + + // linear reverse scan + + for ( var giveUpAt = i1 - 2; ;) { + + if ( t0 === undefined ) { + + // before start + + this._cachedIndex = 0; + return this.beforeStart_( 0, t, t1 ); + + } + + if ( i1 === giveUpAt ) break; // this loop + + t1 = t0; + t0 = pp[ -- i1 - 1 ]; + + if ( t >= t0 ) { + + // we have arrived at the sought interval + break seek; + + } + + } + + // prepare binary search on the left side of the index + right = i1; + i1 = 0; + break linear_scan; + + } + + // the interval is valid + + break validate_interval; + + } // linear scan + + // binary search + + while ( i1 < right ) { + + var mid = ( i1 + right ) >>> 1; + + if ( t < pp[ mid ] ) { + + right = mid; + + } else { + + i1 = mid + 1; + + } + + } + + t1 = pp[ i1 ]; + t0 = pp[ i1 - 1 ]; + + // check boundary cases, again + + if ( t0 === undefined ) { + + this._cachedIndex = 0; + return this.beforeStart_( 0, t, t1 ); + + } + + if ( t1 === undefined ) { + + i1 = pp.length; + this._cachedIndex = i1; + return this.afterEnd_( i1 - 1, t0, t ); + + } + + } // seek + + this._cachedIndex = i1; + + this.intervalChanged_( i1, t0, t1 ); + + } // validate_interval + + return this.interpolate_( i1, t0, t, t1 ); + + }, + + settings: null, // optional, subclass-specific settings structure + // Note: The indirection allows central control of many interpolants. + + // --- Protected interface + + DefaultSettings_: {}, + + getSettings_: function() { + + return this.settings || this.DefaultSettings_; + + }, + + copySampleValue_: function( index ) { + + // copies a sample value to the result buffer + + var result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + offset = index * stride; + + for ( var i = 0; i !== stride; ++ i ) { + + result[ i ] = values[ offset + i ]; + + } + + return result; + + }, + + // Template methods for derived classes: + + interpolate_: function( i1, t0, t, t1 ) { + + throw new Error( "call to abstract method" ); + // implementations shall return this.resultBuffer + + }, + + intervalChanged_: function( i1, t0, t1 ) { + + // empty + + } + + } ); + + //!\ DECLARE ALIAS AFTER assign prototype ! + Object.assign( Interpolant.prototype, { + + //( 0, t, t0 ), returns this.resultBuffer + beforeStart_: Interpolant.prototype.copySampleValue_, + + //( N-1, tN-1, t ), returns this.resultBuffer + afterEnd_: Interpolant.prototype.copySampleValue_, + + } ); + + /** + * Fast and simple cubic spline interpolant. + * + * It was derived from a Hermitian construction setting the first derivative + * at each sample position to the linear slope between neighboring positions + * over their parameter interval. + * + * @author tschw + */ + + function CubicInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + Interpolant.call( + this, parameterPositions, sampleValues, sampleSize, resultBuffer ); + + this._weightPrev = -0; + this._offsetPrev = -0; + this._weightNext = -0; + this._offsetNext = -0; + + } + + CubicInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), { + + constructor: CubicInterpolant, + + DefaultSettings_: { + + endingStart: ZeroCurvatureEnding, + endingEnd: ZeroCurvatureEnding + + }, + + intervalChanged_: function( i1, t0, t1 ) { + + var pp = this.parameterPositions, + iPrev = i1 - 2, + iNext = i1 + 1, + + tPrev = pp[ iPrev ], + tNext = pp[ iNext ]; + + if ( tPrev === undefined ) { + + switch ( this.getSettings_().endingStart ) { + + case ZeroSlopeEnding: + + // f'(t0) = 0 + iPrev = i1; + tPrev = 2 * t0 - t1; + + break; + + case WrapAroundEnding: + + // use the other end of the curve + iPrev = pp.length - 2; + tPrev = t0 + pp[ iPrev ] - pp[ iPrev + 1 ]; + + break; + + default: // ZeroCurvatureEnding + + // f''(t0) = 0 a.k.a. Natural Spline + iPrev = i1; + tPrev = t1; + + } + + } + + if ( tNext === undefined ) { + + switch ( this.getSettings_().endingEnd ) { + + case ZeroSlopeEnding: + + // f'(tN) = 0 + iNext = i1; + tNext = 2 * t1 - t0; + + break; + + case WrapAroundEnding: + + // use the other end of the curve + iNext = 1; + tNext = t1 + pp[ 1 ] - pp[ 0 ]; + + break; + + default: // ZeroCurvatureEnding + + // f''(tN) = 0, a.k.a. Natural Spline + iNext = i1 - 1; + tNext = t0; + + } + + } + + var halfDt = ( t1 - t0 ) * 0.5, + stride = this.valueSize; + + this._weightPrev = halfDt / ( t0 - tPrev ); + this._weightNext = halfDt / ( tNext - t1 ); + this._offsetPrev = iPrev * stride; + this._offsetNext = iNext * stride; + + }, + + interpolate_: function( i1, t0, t, t1 ) { + + var result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + + o1 = i1 * stride, o0 = o1 - stride, + oP = this._offsetPrev, oN = this._offsetNext, + wP = this._weightPrev, wN = this._weightNext, + + p = ( t - t0 ) / ( t1 - t0 ), + pp = p * p, + ppp = pp * p; + + // evaluate polynomials + + var sP = - wP * ppp + 2 * wP * pp - wP * p; + var s0 = ( 1 + wP ) * ppp + (-1.5 - 2 * wP ) * pp + ( -0.5 + wP ) * p + 1; + var s1 = (-1 - wN ) * ppp + ( 1.5 + wN ) * pp + 0.5 * p; + var sN = wN * ppp - wN * pp; + + // combine data linearly + + for ( var i = 0; i !== stride; ++ i ) { + + result[ i ] = + sP * values[ oP + i ] + + s0 * values[ o0 + i ] + + s1 * values[ o1 + i ] + + sN * values[ oN + i ]; + + } + + return result; + + } + + } ); + + /** + * @author tschw + */ + + function LinearInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer ); + + } + + LinearInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), { + + constructor: LinearInterpolant, + + interpolate_: function( i1, t0, t, t1 ) { + + var result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + + offset1 = i1 * stride, + offset0 = offset1 - stride, + + weight1 = ( t - t0 ) / ( t1 - t0 ), + weight0 = 1 - weight1; + + for ( var i = 0; i !== stride; ++ i ) { + + result[ i ] = + values[ offset0 + i ] * weight0 + + values[ offset1 + i ] * weight1; + + } + + return result; + + } + + } ); + + /** + * + * Interpolant that evaluates to the sample value at the position preceeding + * the parameter. + * + * @author tschw + */ + + function DiscreteInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer ); + + } + + DiscreteInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), { + + constructor: DiscreteInterpolant, + + interpolate_: function( i1, t0, t, t1 ) { + + return this.copySampleValue_( i1 - 1 ); + + } + + } ); + + var KeyframeTrackPrototype; + + KeyframeTrackPrototype = { + + TimeBufferType: Float32Array, + ValueBufferType: Float32Array, + + DefaultInterpolation: InterpolateLinear, + + InterpolantFactoryMethodDiscrete: function ( result ) { + + return new DiscreteInterpolant( + this.times, this.values, this.getValueSize(), result ); + + }, + + InterpolantFactoryMethodLinear: function ( result ) { + + return new LinearInterpolant( + this.times, this.values, this.getValueSize(), result ); + + }, + + InterpolantFactoryMethodSmooth: function ( result ) { + + return new CubicInterpolant( + this.times, this.values, this.getValueSize(), result ); + + }, + + setInterpolation: function ( interpolation ) { + + var factoryMethod; + + switch ( interpolation ) { + + case InterpolateDiscrete: + + factoryMethod = this.InterpolantFactoryMethodDiscrete; + + break; + + case InterpolateLinear: + + factoryMethod = this.InterpolantFactoryMethodLinear; + + break; + + case InterpolateSmooth: + + factoryMethod = this.InterpolantFactoryMethodSmooth; + + break; + + } + + if ( factoryMethod === undefined ) { + + var message = "unsupported interpolation for " + + this.ValueTypeName + " keyframe track named " + this.name; + + if ( this.createInterpolant === undefined ) { + + // fall back to default, unless the default itself is messed up + if ( interpolation !== this.DefaultInterpolation ) { + + this.setInterpolation( this.DefaultInterpolation ); + + } else { + + throw new Error( message ); // fatal, in this case + + } + + } + + console.warn( 'THREE.KeyframeTrackPrototype:', message ); + return; + + } + + this.createInterpolant = factoryMethod; + + }, + + getInterpolation: function () { + + switch ( this.createInterpolant ) { + + case this.InterpolantFactoryMethodDiscrete: + + return InterpolateDiscrete; + + case this.InterpolantFactoryMethodLinear: + + return InterpolateLinear; + + case this.InterpolantFactoryMethodSmooth: + + return InterpolateSmooth; + + } + + }, + + getValueSize: function () { + + return this.values.length / this.times.length; + + }, + + // move all keyframes either forwards or backwards in time + shift: function ( timeOffset ) { + + if ( timeOffset !== 0.0 ) { + + var times = this.times; + + for ( var i = 0, n = times.length; i !== n; ++ i ) { + + times[ i ] += timeOffset; + + } + + } + + return this; + + }, + + // scale all keyframe times by a factor (useful for frame <-> seconds conversions) + scale: function ( timeScale ) { + + if ( timeScale !== 1.0 ) { + + var times = this.times; + + for ( var i = 0, n = times.length; i !== n; ++ i ) { + + times[ i ] *= timeScale; + + } + + } + + return this; + + }, + + // removes keyframes before and after animation without changing any values within the range [startTime, endTime]. + // IMPORTANT: We do not shift around keys to the start of the track time, because for interpolated keys this will change their values + trim: function ( startTime, endTime ) { + + var times = this.times, + nKeys = times.length, + from = 0, + to = nKeys - 1; + + while ( from !== nKeys && times[ from ] < startTime ) ++ from; + while ( to !== - 1 && times[ to ] > endTime ) -- to; + + ++ to; // inclusive -> exclusive bound + + if ( from !== 0 || to !== nKeys ) { + + // empty tracks are forbidden, so keep at least one keyframe + if ( from >= to ) to = Math.max( to, 1 ), from = to - 1; + + var stride = this.getValueSize(); + this.times = AnimationUtils.arraySlice( times, from, to ); + this.values = AnimationUtils. + arraySlice( this.values, from * stride, to * stride ); + + } + + return this; + + }, + + // ensure we do not get a GarbageInGarbageOut situation, make sure tracks are at least minimally viable + validate: function () { + + var valid = true; + + var valueSize = this.getValueSize(); + if ( valueSize - Math.floor( valueSize ) !== 0 ) { + + console.error( 'THREE.KeyframeTrackPrototype: Invalid value size in track.', this ); + valid = false; + + } + + var times = this.times, + values = this.values, + + nKeys = times.length; + + if ( nKeys === 0 ) { + + console.error( 'THREE.KeyframeTrackPrototype: Track is empty.', this ); + valid = false; + + } + + var prevTime = null; + + for ( var i = 0; i !== nKeys; i ++ ) { + + var currTime = times[ i ]; + + if ( typeof currTime === 'number' && isNaN( currTime ) ) { + + console.error( 'THREE.KeyframeTrackPrototype: Time is not a valid number.', this, i, currTime ); + valid = false; + break; + + } + + if ( prevTime !== null && prevTime > currTime ) { + + console.error( 'THREE.KeyframeTrackPrototype: Out of order keys.', this, i, currTime, prevTime ); + valid = false; + break; + + } + + prevTime = currTime; + + } + + if ( values !== undefined ) { + + if ( AnimationUtils.isTypedArray( values ) ) { + + for ( var i = 0, n = values.length; i !== n; ++ i ) { + + var value = values[ i ]; + + if ( isNaN( value ) ) { + + console.error( 'THREE.KeyframeTrackPrototype: Value is not a valid number.', this, i, value ); + valid = false; + break; + + } + + } + + } + + } + + return valid; + + }, + + // removes equivalent sequential keys as common in morph target sequences + // (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0) + optimize: function () { + + var times = this.times, + values = this.values, + stride = this.getValueSize(), + + smoothInterpolation = this.getInterpolation() === InterpolateSmooth, + + writeIndex = 1, + lastIndex = times.length - 1; + + for ( var i = 1; i < lastIndex; ++ i ) { + + var keep = false; + + var time = times[ i ]; + var timeNext = times[ i + 1 ]; + + // remove adjacent keyframes scheduled at the same time + + if ( time !== timeNext && ( i !== 1 || time !== time[ 0 ] ) ) { + + if ( ! smoothInterpolation ) { + + // remove unnecessary keyframes same as their neighbors + + var offset = i * stride, + offsetP = offset - stride, + offsetN = offset + stride; + + for ( var j = 0; j !== stride; ++ j ) { + + var value = values[ offset + j ]; + + if ( value !== values[ offsetP + j ] || + value !== values[ offsetN + j ] ) { + + keep = true; + break; + + } + + } + + } else keep = true; + + } + + // in-place compaction + + if ( keep ) { + + if ( i !== writeIndex ) { + + times[ writeIndex ] = times[ i ]; + + var readOffset = i * stride, + writeOffset = writeIndex * stride; + + for ( var j = 0; j !== stride; ++ j ) + + values[ writeOffset + j ] = values[ readOffset + j ]; + + } + + ++ writeIndex; + + } + + } + + // flush last keyframe (compaction looks ahead) + + if ( lastIndex > 0 ) { + + times[ writeIndex ] = times[ lastIndex ]; + + for ( var readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j ) + + values[ writeOffset + j ] = values[ readOffset + j ]; + + ++ writeIndex; + + } + + if ( writeIndex !== times.length ) { + + this.times = AnimationUtils.arraySlice( times, 0, writeIndex ); + this.values = AnimationUtils.arraySlice( values, 0, writeIndex * stride ); + + } + + return this; + + } + + }; + + function KeyframeTrackConstructor( name, times, values, interpolation ) { + + if ( name === undefined ) throw new Error( "track name is undefined" ); + + if ( times === undefined || times.length === 0 ) { + + throw new Error( "no keyframes in track named " + name ); + + } + + this.name = name; + + this.times = AnimationUtils.convertArray( times, this.TimeBufferType ); + this.values = AnimationUtils.convertArray( values, this.ValueBufferType ); + + this.setInterpolation( interpolation || this.DefaultInterpolation ); + + this.validate(); + this.optimize(); + + } + + /** + * + * A Track of vectored keyframe values. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function VectorKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrackConstructor.call( this, name, times, values, interpolation ); + + } + + VectorKeyframeTrack.prototype = + Object.assign( Object.create( KeyframeTrackPrototype ), { + + constructor: VectorKeyframeTrack, + + ValueTypeName: 'vector' + + // ValueBufferType is inherited + + // DefaultInterpolation is inherited + + } ); + + /** + * Spherical linear unit quaternion interpolant. + * + * @author tschw + */ + + function QuaternionLinearInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer ); + + } + + QuaternionLinearInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), { + + constructor: QuaternionLinearInterpolant, + + interpolate_: function( i1, t0, t, t1 ) { + + var result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + + offset = i1 * stride, + + alpha = ( t - t0 ) / ( t1 - t0 ); + + for ( var end = offset + stride; offset !== end; offset += 4 ) { + + Quaternion.slerpFlat( result, 0, + values, offset - stride, values, offset, alpha ); + + } + + return result; + + } + + } ); + + /** + * + * A Track of quaternion keyframe values. + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function QuaternionKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrackConstructor.call( this, name, times, values, interpolation ); + + } + + QuaternionKeyframeTrack.prototype = + Object.assign( Object.create( KeyframeTrackPrototype ), { + + constructor: QuaternionKeyframeTrack, + + ValueTypeName: 'quaternion', + + // ValueBufferType is inherited + + DefaultInterpolation: InterpolateLinear, + + InterpolantFactoryMethodLinear: function( result ) { + + return new QuaternionLinearInterpolant( + this.times, this.values, this.getValueSize(), result ); + + }, + + InterpolantFactoryMethodSmooth: undefined // not yet implemented + + } ); + + /** + * + * A Track of numeric keyframe values. + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function NumberKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrackConstructor.call( this, name, times, values, interpolation ); + + } + + NumberKeyframeTrack.prototype = + Object.assign( Object.create( KeyframeTrackPrototype ), { + + constructor: NumberKeyframeTrack, + + ValueTypeName: 'number' + + // ValueBufferType is inherited + + // DefaultInterpolation is inherited + + } ); + + /** + * + * A Track that interpolates Strings + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function StringKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrackConstructor.call( this, name, times, values, interpolation ); + + } + + StringKeyframeTrack.prototype = + Object.assign( Object.create( KeyframeTrackPrototype ), { + + constructor: StringKeyframeTrack, + + ValueTypeName: 'string', + ValueBufferType: Array, + + DefaultInterpolation: InterpolateDiscrete, + + InterpolantFactoryMethodLinear: undefined, + + InterpolantFactoryMethodSmooth: undefined + + } ); + + /** + * + * A Track of Boolean keyframe values. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function BooleanKeyframeTrack( name, times, values ) { + + KeyframeTrackConstructor.call( this, name, times, values ); + + } + + BooleanKeyframeTrack.prototype = + Object.assign( Object.create( KeyframeTrackPrototype ), { + + constructor: BooleanKeyframeTrack, + + ValueTypeName: 'bool', + ValueBufferType: Array, + + DefaultInterpolation: InterpolateDiscrete, + + InterpolantFactoryMethodLinear: undefined, + InterpolantFactoryMethodSmooth: undefined + + // Note: Actually this track could have a optimized / compressed + // representation of a single value and a custom interpolant that + // computes "firstValue ^ isOdd( index )". + + } ); + + /** + * + * A Track of keyframe values that represent color. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function ColorKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrackConstructor.call( this, name, times, values, interpolation ); + + } + + ColorKeyframeTrack.prototype = + Object.assign( Object.create( KeyframeTrackPrototype ), { + + constructor: ColorKeyframeTrack, + + ValueTypeName: 'color' + + // ValueBufferType is inherited + + // DefaultInterpolation is inherited + + + // Note: Very basic implementation and nothing special yet. + // However, this is the place for color space parameterization. + + } ); + + /** + * + * A timed sequence of keyframes for a specific property. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function KeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrackConstructor.apply( this, arguments ); + + } + + KeyframeTrack.prototype = KeyframeTrackPrototype; + KeyframeTrackPrototype.constructor = KeyframeTrack; + + // Static methods: + + Object.assign( KeyframeTrack, { + + // Serialization (in static context, because of constructor invocation + // and automatic invocation of .toJSON): + + parse: function( json ) { + + if( json.type === undefined ) { + + throw new Error( "track type undefined, can not parse" ); + + } + + var trackType = KeyframeTrack._getTrackTypeForValueTypeName( json.type ); + + if ( json.times === undefined ) { + + var times = [], values = []; + + AnimationUtils.flattenJSON( json.keys, times, values, 'value' ); + + json.times = times; + json.values = values; + + } + + // derived classes can define a static parse method + if ( trackType.parse !== undefined ) { + + return trackType.parse( json ); + + } else { + + // by default, we asssume a constructor compatible with the base + return new trackType( + json.name, json.times, json.values, json.interpolation ); + + } + + }, + + toJSON: function( track ) { + + var trackType = track.constructor; + + var json; + + // derived classes can define a static toJSON method + if ( trackType.toJSON !== undefined ) { + + json = trackType.toJSON( track ); + + } else { + + // by default, we assume the data can be serialized as-is + json = { + + 'name': track.name, + 'times': AnimationUtils.convertArray( track.times, Array ), + 'values': AnimationUtils.convertArray( track.values, Array ) + + }; + + var interpolation = track.getInterpolation(); + + if ( interpolation !== track.DefaultInterpolation ) { + + json.interpolation = interpolation; + + } + + } + + json.type = track.ValueTypeName; // mandatory + + return json; + + }, + + _getTrackTypeForValueTypeName: function( typeName ) { + + switch( typeName.toLowerCase() ) { + + case "scalar": + case "double": + case "float": + case "number": + case "integer": + + return NumberKeyframeTrack; + + case "vector": + case "vector2": + case "vector3": + case "vector4": + + return VectorKeyframeTrack; + + case "color": + + return ColorKeyframeTrack; + + case "quaternion": + + return QuaternionKeyframeTrack; + + case "bool": + case "boolean": + + return BooleanKeyframeTrack; + + case "string": + + return StringKeyframeTrack; + + } + + throw new Error( "Unsupported typeName: " + typeName ); + + } + + } ); + + /** + * + * Reusable set of Tracks that represent an animation. + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + */ + + function AnimationClip( name, duration, tracks ) { + + this.name = name; + this.tracks = tracks; + this.duration = ( duration !== undefined ) ? duration : - 1; + + this.uuid = _Math.generateUUID(); + + // this means it should figure out its duration by scanning the tracks + if ( this.duration < 0 ) { + + this.resetDuration(); + + } + + this.optimize(); + + } + + Object.assign( AnimationClip, { + + parse: function ( json ) { + + var tracks = [], + jsonTracks = json.tracks, + frameTime = 1.0 / ( json.fps || 1.0 ); + + for ( var i = 0, n = jsonTracks.length; i !== n; ++ i ) { + + tracks.push( KeyframeTrack.parse( jsonTracks[ i ] ).scale( frameTime ) ); + + } + + return new AnimationClip( json.name, json.duration, tracks ); + + }, + + toJSON: function ( clip ) { + + var tracks = [], + clipTracks = clip.tracks; + + var json = { + + 'name': clip.name, + 'duration': clip.duration, + 'tracks': tracks + + }; + + for ( var i = 0, n = clipTracks.length; i !== n; ++ i ) { + + tracks.push( KeyframeTrack.toJSON( clipTracks[ i ] ) ); + + } + + return json; + + }, + + CreateFromMorphTargetSequence: function ( name, morphTargetSequence, fps, noLoop ) { + + var numMorphTargets = morphTargetSequence.length; + var tracks = []; + + for ( var i = 0; i < numMorphTargets; i ++ ) { + + var times = []; + var values = []; + + times.push( + ( i + numMorphTargets - 1 ) % numMorphTargets, + i, + ( i + 1 ) % numMorphTargets ); + + values.push( 0, 1, 0 ); + + var order = AnimationUtils.getKeyframeOrder( times ); + times = AnimationUtils.sortedArray( times, 1, order ); + values = AnimationUtils.sortedArray( values, 1, order ); + + // if there is a key at the first frame, duplicate it as the + // last frame as well for perfect loop. + if ( ! noLoop && times[ 0 ] === 0 ) { + + times.push( numMorphTargets ); + values.push( values[ 0 ] ); + + } + + tracks.push( + new NumberKeyframeTrack( + '.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']', + times, values + ).scale( 1.0 / fps ) ); + + } + + return new AnimationClip( name, - 1, tracks ); + + }, + + findByName: function ( objectOrClipArray, name ) { + + var clipArray = objectOrClipArray; + + if ( ! Array.isArray( objectOrClipArray ) ) { + + var o = objectOrClipArray; + clipArray = o.geometry && o.geometry.animations || o.animations; + + } + + for ( var i = 0; i < clipArray.length; i ++ ) { + + if ( clipArray[ i ].name === name ) { + + return clipArray[ i ]; + + } + + } + + return null; + + }, + + CreateClipsFromMorphTargetSequences: function ( morphTargets, fps, noLoop ) { + + var animationToMorphTargets = {}; + + // tested with https://regex101.com/ on trick sequences + // such flamingo_flyA_003, flamingo_run1_003, crdeath0059 + var pattern = /^([\w-]*?)([\d]+)$/; + + // sort morph target names into animation groups based + // patterns like Walk_001, Walk_002, Run_001, Run_002 + for ( var i = 0, il = morphTargets.length; i < il; i ++ ) { + + var morphTarget = morphTargets[ i ]; + var parts = morphTarget.name.match( pattern ); + + if ( parts && parts.length > 1 ) { + + var name = parts[ 1 ]; + + var animationMorphTargets = animationToMorphTargets[ name ]; + if ( ! animationMorphTargets ) { + + animationToMorphTargets[ name ] = animationMorphTargets = []; + + } + + animationMorphTargets.push( morphTarget ); + + } + + } + + var clips = []; + + for ( var name in animationToMorphTargets ) { + + clips.push( AnimationClip.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) ); + + } + + return clips; + + }, + + // parse the animation.hierarchy format + parseAnimation: function ( animation, bones ) { + + if ( ! animation ) { + + console.error( 'THREE.AnimationClip: No animation in JSONLoader data.' ); + return null; + + } + + var addNonemptyTrack = function ( trackType, trackName, animationKeys, propertyName, destTracks ) { + + // only return track if there are actually keys. + if ( animationKeys.length !== 0 ) { + + var times = []; + var values = []; + + AnimationUtils.flattenJSON( animationKeys, times, values, propertyName ); + + // empty keys are filtered out, so check again + if ( times.length !== 0 ) { + + destTracks.push( new trackType( trackName, times, values ) ); + + } + + } + + }; + + var tracks = []; + + var clipName = animation.name || 'default'; + // automatic length determination in AnimationClip. + var duration = animation.length || - 1; + var fps = animation.fps || 30; + + var hierarchyTracks = animation.hierarchy || []; + + for ( var h = 0; h < hierarchyTracks.length; h ++ ) { + + var animationKeys = hierarchyTracks[ h ].keys; + + // skip empty tracks + if ( ! animationKeys || animationKeys.length === 0 ) continue; + + // process morph targets + if ( animationKeys[ 0 ].morphTargets ) { + + // figure out all morph targets used in this track + var morphTargetNames = {}; + + for ( var k = 0; k < animationKeys.length; k ++ ) { + + if ( animationKeys[ k ].morphTargets ) { + + for ( var m = 0; m < animationKeys[ k ].morphTargets.length; m ++ ) { + + morphTargetNames[ animationKeys[ k ].morphTargets[ m ] ] = - 1; + + } + + } + + } + + // create a track for each morph target with all zero + // morphTargetInfluences except for the keys in which + // the morphTarget is named. + for ( var morphTargetName in morphTargetNames ) { + + var times = []; + var values = []; + + for ( var m = 0; m !== animationKeys[ k ].morphTargets.length; ++ m ) { + + var animationKey = animationKeys[ k ]; + + times.push( animationKey.time ); + values.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 ); + + } + + tracks.push( new NumberKeyframeTrack( '.morphTargetInfluence[' + morphTargetName + ']', times, values ) ); + + } + + duration = morphTargetNames.length * ( fps || 1.0 ); + + } else { + + // ...assume skeletal animation + + var boneName = '.bones[' + bones[ h ].name + ']'; + + addNonemptyTrack( + VectorKeyframeTrack, boneName + '.position', + animationKeys, 'pos', tracks ); + + addNonemptyTrack( + QuaternionKeyframeTrack, boneName + '.quaternion', + animationKeys, 'rot', tracks ); + + addNonemptyTrack( + VectorKeyframeTrack, boneName + '.scale', + animationKeys, 'scl', tracks ); + + } + + } + + if ( tracks.length === 0 ) { + + return null; + + } + + var clip = new AnimationClip( clipName, duration, tracks ); + + return clip; + + } + + } ); + + Object.assign( AnimationClip.prototype, { + + resetDuration: function () { + + var tracks = this.tracks, duration = 0; + + for ( var i = 0, n = tracks.length; i !== n; ++ i ) { + + var track = this.tracks[ i ]; + + duration = Math.max( duration, track.times[ track.times.length - 1 ] ); + + } + + this.duration = duration; + + }, + + trim: function () { + + for ( var i = 0; i < this.tracks.length; i ++ ) { + + this.tracks[ i ].trim( 0, this.duration ); + + } + + return this; + + }, + + optimize: function () { + + for ( var i = 0; i < this.tracks.length; i ++ ) { + + this.tracks[ i ].optimize(); + + } + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function MaterialLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + this.textures = {}; + + } + + Object.assign( MaterialLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var loader = new FileLoader( scope.manager ); + loader.load( url, function ( text ) { + + onLoad( scope.parse( JSON.parse( text ) ) ); + + }, onProgress, onError ); + + }, + + setTextures: function ( value ) { + + this.textures = value; + + }, + + parse: function ( json ) { + + var textures = this.textures; + + function getTexture( name ) { + + if ( textures[ name ] === undefined ) { + + console.warn( 'THREE.MaterialLoader: Undefined texture', name ); + + } + + return textures[ name ]; + + } + + var material = new Materials[ json.type ](); + + if ( json.uuid !== undefined ) material.uuid = json.uuid; + if ( json.name !== undefined ) material.name = json.name; + if ( json.color !== undefined ) material.color.setHex( json.color ); + if ( json.roughness !== undefined ) material.roughness = json.roughness; + if ( json.metalness !== undefined ) material.metalness = json.metalness; + if ( json.emissive !== undefined ) material.emissive.setHex( json.emissive ); + if ( json.specular !== undefined ) material.specular.setHex( json.specular ); + if ( json.shininess !== undefined ) material.shininess = json.shininess; + if ( json.clearCoat !== undefined ) material.clearCoat = json.clearCoat; + if ( json.clearCoatRoughness !== undefined ) material.clearCoatRoughness = json.clearCoatRoughness; + if ( json.uniforms !== undefined ) material.uniforms = json.uniforms; + if ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader; + if ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader; + if ( json.vertexColors !== undefined ) material.vertexColors = json.vertexColors; + if ( json.fog !== undefined ) material.fog = json.fog; + if ( json.shading !== undefined ) material.shading = json.shading; + if ( json.blending !== undefined ) material.blending = json.blending; + if ( json.side !== undefined ) material.side = json.side; + if ( json.opacity !== undefined ) material.opacity = json.opacity; + if ( json.transparent !== undefined ) material.transparent = json.transparent; + if ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest; + if ( json.depthTest !== undefined ) material.depthTest = json.depthTest; + if ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite; + if ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite; + if ( json.wireframe !== undefined ) material.wireframe = json.wireframe; + if ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth; + if ( json.wireframeLinecap !== undefined ) material.wireframeLinecap = json.wireframeLinecap; + if ( json.wireframeLinejoin !== undefined ) material.wireframeLinejoin = json.wireframeLinejoin; + if ( json.skinning !== undefined ) material.skinning = json.skinning; + if ( json.morphTargets !== undefined ) material.morphTargets = json.morphTargets; + + // for PointsMaterial + + if ( json.size !== undefined ) material.size = json.size; + if ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation; + + // maps + + if ( json.map !== undefined ) material.map = getTexture( json.map ); + + if ( json.alphaMap !== undefined ) { + + material.alphaMap = getTexture( json.alphaMap ); + material.transparent = true; + + } + + if ( json.bumpMap !== undefined ) material.bumpMap = getTexture( json.bumpMap ); + if ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale; + + if ( json.normalMap !== undefined ) material.normalMap = getTexture( json.normalMap ); + if ( json.normalScale !== undefined ) { + + var normalScale = json.normalScale; + + if ( Array.isArray( normalScale ) === false ) { + + // Blender exporter used to export a scalar. See #7459 + + normalScale = [ normalScale, normalScale ]; + + } + + material.normalScale = new Vector2().fromArray( normalScale ); + + } + + if ( json.displacementMap !== undefined ) material.displacementMap = getTexture( json.displacementMap ); + if ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale; + if ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias; + + if ( json.roughnessMap !== undefined ) material.roughnessMap = getTexture( json.roughnessMap ); + if ( json.metalnessMap !== undefined ) material.metalnessMap = getTexture( json.metalnessMap ); + + if ( json.emissiveMap !== undefined ) material.emissiveMap = getTexture( json.emissiveMap ); + if ( json.emissiveIntensity !== undefined ) material.emissiveIntensity = json.emissiveIntensity; + + if ( json.specularMap !== undefined ) material.specularMap = getTexture( json.specularMap ); + + if ( json.envMap !== undefined ) material.envMap = getTexture( json.envMap ); + + if ( json.reflectivity !== undefined ) material.reflectivity = json.reflectivity; + + if ( json.lightMap !== undefined ) material.lightMap = getTexture( json.lightMap ); + if ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity; + + if ( json.aoMap !== undefined ) material.aoMap = getTexture( json.aoMap ); + if ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity; + + if ( json.gradientMap !== undefined ) material.gradientMap = getTexture( json.gradientMap ); + + return material; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function BufferGeometryLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( BufferGeometryLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var loader = new FileLoader( scope.manager ); + loader.load( url, function ( text ) { + + onLoad( scope.parse( JSON.parse( text ) ) ); + + }, onProgress, onError ); + + }, + + parse: function ( json ) { + + var geometry = new BufferGeometry(); + + var index = json.data.index; + + if ( index !== undefined ) { + + var typedArray = new TYPED_ARRAYS[ index.type ]( index.array ); + geometry.setIndex( new BufferAttribute( typedArray, 1 ) ); + + } + + var attributes = json.data.attributes; + + for ( var key in attributes ) { + + var attribute = attributes[ key ]; + var typedArray = new TYPED_ARRAYS[ attribute.type ]( attribute.array ); + + geometry.addAttribute( key, new BufferAttribute( typedArray, attribute.itemSize, attribute.normalized ) ); + + } + + var groups = json.data.groups || json.data.drawcalls || json.data.offsets; + + if ( groups !== undefined ) { + + for ( var i = 0, n = groups.length; i !== n; ++ i ) { + + var group = groups[ i ]; + + geometry.addGroup( group.start, group.count, group.materialIndex ); + + } + + } + + var boundingSphere = json.data.boundingSphere; + + if ( boundingSphere !== undefined ) { + + var center = new Vector3(); + + if ( boundingSphere.center !== undefined ) { + + center.fromArray( boundingSphere.center ); + + } + + geometry.boundingSphere = new Sphere( center, boundingSphere.radius ); + + } + + return geometry; + + } + + } ); + + var TYPED_ARRAYS = { + Int8Array: Int8Array, + Uint8Array: Uint8Array, + // Workaround for IE11 pre KB2929437. See #11440 + Uint8ClampedArray: typeof Uint8ClampedArray !== 'undefined' ? Uint8ClampedArray : Uint8Array, + Int16Array: Int16Array, + Uint16Array: Uint16Array, + Int32Array: Int32Array, + Uint32Array: Uint32Array, + Float32Array: Float32Array, + Float64Array: Float64Array + }; + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function Loader() { + + this.onLoadStart = function () {}; + this.onLoadProgress = function () {}; + this.onLoadComplete = function () {}; + + } + + Loader.Handlers = { + + handlers: [], + + add: function ( regex, loader ) { + + this.handlers.push( regex, loader ); + + }, + + get: function ( file ) { + + var handlers = this.handlers; + + for ( var i = 0, l = handlers.length; i < l; i += 2 ) { + + var regex = handlers[ i ]; + var loader = handlers[ i + 1 ]; + + if ( regex.test( file ) ) { + + return loader; + + } + + } + + return null; + + } + + }; + + Object.assign( Loader.prototype, { + + crossOrigin: undefined, + + extractUrlBase: function ( url ) { + + var parts = url.split( '/' ); + + if ( parts.length === 1 ) return './'; + + parts.pop(); + + return parts.join( '/' ) + '/'; + + }, + + initMaterials: function ( materials, texturePath, crossOrigin ) { + + var array = []; + + for ( var i = 0; i < materials.length; ++ i ) { + + array[ i ] = this.createMaterial( materials[ i ], texturePath, crossOrigin ); + + } + + return array; + + }, + + createMaterial: ( function () { + + var BlendingMode = { + NoBlending: NoBlending, + NormalBlending: NormalBlending, + AdditiveBlending: AdditiveBlending, + SubtractiveBlending: SubtractiveBlending, + MultiplyBlending: MultiplyBlending, + CustomBlending: CustomBlending + }; + + var color = new Color(); + var textureLoader = new TextureLoader(); + var materialLoader = new MaterialLoader(); + + return function createMaterial( m, texturePath, crossOrigin ) { + + // convert from old material format + + var textures = {}; + + function loadTexture( path, repeat, offset, wrap, anisotropy ) { + + var fullPath = texturePath + path; + var loader = Loader.Handlers.get( fullPath ); + + var texture; + + if ( loader !== null ) { + + texture = loader.load( fullPath ); + + } else { + + textureLoader.setCrossOrigin( crossOrigin ); + texture = textureLoader.load( fullPath ); + + } + + if ( repeat !== undefined ) { + + texture.repeat.fromArray( repeat ); + + if ( repeat[ 0 ] !== 1 ) texture.wrapS = RepeatWrapping; + if ( repeat[ 1 ] !== 1 ) texture.wrapT = RepeatWrapping; + + } + + if ( offset !== undefined ) { + + texture.offset.fromArray( offset ); + + } + + if ( wrap !== undefined ) { + + if ( wrap[ 0 ] === 'repeat' ) texture.wrapS = RepeatWrapping; + if ( wrap[ 0 ] === 'mirror' ) texture.wrapS = MirroredRepeatWrapping; + + if ( wrap[ 1 ] === 'repeat' ) texture.wrapT = RepeatWrapping; + if ( wrap[ 1 ] === 'mirror' ) texture.wrapT = MirroredRepeatWrapping; + + } + + if ( anisotropy !== undefined ) { + + texture.anisotropy = anisotropy; + + } + + var uuid = _Math.generateUUID(); + + textures[ uuid ] = texture; + + return uuid; + + } + + // + + var json = { + uuid: _Math.generateUUID(), + type: 'MeshLambertMaterial' + }; + + for ( var name in m ) { + + var value = m[ name ]; + + switch ( name ) { + + case 'DbgColor': + case 'DbgIndex': + case 'opticalDensity': + case 'illumination': + break; + case 'DbgName': + json.name = value; + break; + case 'blending': + json.blending = BlendingMode[ value ]; + break; + case 'colorAmbient': + case 'mapAmbient': + console.warn( 'THREE.Loader.createMaterial:', name, 'is no longer supported.' ); + break; + case 'colorDiffuse': + json.color = color.fromArray( value ).getHex(); + break; + case 'colorSpecular': + json.specular = color.fromArray( value ).getHex(); + break; + case 'colorEmissive': + json.emissive = color.fromArray( value ).getHex(); + break; + case 'specularCoef': + json.shininess = value; + break; + case 'shading': + if ( value.toLowerCase() === 'basic' ) json.type = 'MeshBasicMaterial'; + if ( value.toLowerCase() === 'phong' ) json.type = 'MeshPhongMaterial'; + if ( value.toLowerCase() === 'standard' ) json.type = 'MeshStandardMaterial'; + break; + case 'mapDiffuse': + json.map = loadTexture( value, m.mapDiffuseRepeat, m.mapDiffuseOffset, m.mapDiffuseWrap, m.mapDiffuseAnisotropy ); + break; + case 'mapDiffuseRepeat': + case 'mapDiffuseOffset': + case 'mapDiffuseWrap': + case 'mapDiffuseAnisotropy': + break; + case 'mapEmissive': + json.emissiveMap = loadTexture( value, m.mapEmissiveRepeat, m.mapEmissiveOffset, m.mapEmissiveWrap, m.mapEmissiveAnisotropy ); + break; + case 'mapEmissiveRepeat': + case 'mapEmissiveOffset': + case 'mapEmissiveWrap': + case 'mapEmissiveAnisotropy': + break; + case 'mapLight': + json.lightMap = loadTexture( value, m.mapLightRepeat, m.mapLightOffset, m.mapLightWrap, m.mapLightAnisotropy ); + break; + case 'mapLightRepeat': + case 'mapLightOffset': + case 'mapLightWrap': + case 'mapLightAnisotropy': + break; + case 'mapAO': + json.aoMap = loadTexture( value, m.mapAORepeat, m.mapAOOffset, m.mapAOWrap, m.mapAOAnisotropy ); + break; + case 'mapAORepeat': + case 'mapAOOffset': + case 'mapAOWrap': + case 'mapAOAnisotropy': + break; + case 'mapBump': + json.bumpMap = loadTexture( value, m.mapBumpRepeat, m.mapBumpOffset, m.mapBumpWrap, m.mapBumpAnisotropy ); + break; + case 'mapBumpScale': + json.bumpScale = value; + break; + case 'mapBumpRepeat': + case 'mapBumpOffset': + case 'mapBumpWrap': + case 'mapBumpAnisotropy': + break; + case 'mapNormal': + json.normalMap = loadTexture( value, m.mapNormalRepeat, m.mapNormalOffset, m.mapNormalWrap, m.mapNormalAnisotropy ); + break; + case 'mapNormalFactor': + json.normalScale = [ value, value ]; + break; + case 'mapNormalRepeat': + case 'mapNormalOffset': + case 'mapNormalWrap': + case 'mapNormalAnisotropy': + break; + case 'mapSpecular': + json.specularMap = loadTexture( value, m.mapSpecularRepeat, m.mapSpecularOffset, m.mapSpecularWrap, m.mapSpecularAnisotropy ); + break; + case 'mapSpecularRepeat': + case 'mapSpecularOffset': + case 'mapSpecularWrap': + case 'mapSpecularAnisotropy': + break; + case 'mapMetalness': + json.metalnessMap = loadTexture( value, m.mapMetalnessRepeat, m.mapMetalnessOffset, m.mapMetalnessWrap, m.mapMetalnessAnisotropy ); + break; + case 'mapMetalnessRepeat': + case 'mapMetalnessOffset': + case 'mapMetalnessWrap': + case 'mapMetalnessAnisotropy': + break; + case 'mapRoughness': + json.roughnessMap = loadTexture( value, m.mapRoughnessRepeat, m.mapRoughnessOffset, m.mapRoughnessWrap, m.mapRoughnessAnisotropy ); + break; + case 'mapRoughnessRepeat': + case 'mapRoughnessOffset': + case 'mapRoughnessWrap': + case 'mapRoughnessAnisotropy': + break; + case 'mapAlpha': + json.alphaMap = loadTexture( value, m.mapAlphaRepeat, m.mapAlphaOffset, m.mapAlphaWrap, m.mapAlphaAnisotropy ); + break; + case 'mapAlphaRepeat': + case 'mapAlphaOffset': + case 'mapAlphaWrap': + case 'mapAlphaAnisotropy': + break; + case 'flipSided': + json.side = BackSide; + break; + case 'doubleSided': + json.side = DoubleSide; + break; + case 'transparency': + console.warn( 'THREE.Loader.createMaterial: transparency has been renamed to opacity' ); + json.opacity = value; + break; + case 'depthTest': + case 'depthWrite': + case 'colorWrite': + case 'opacity': + case 'reflectivity': + case 'transparent': + case 'visible': + case 'wireframe': + json[ name ] = value; + break; + case 'vertexColors': + if ( value === true ) json.vertexColors = VertexColors; + if ( value === 'face' ) json.vertexColors = FaceColors; + break; + default: + console.error( 'THREE.Loader.createMaterial: Unsupported', name, value ); + break; + + } + + } + + if ( json.type === 'MeshBasicMaterial' ) delete json.emissive; + if ( json.type !== 'MeshPhongMaterial' ) delete json.specular; + + if ( json.opacity < 1 ) json.transparent = true; + + materialLoader.setTextures( textures ); + + return materialLoader.parse( json ); + + }; + + } )() + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function JSONLoader( manager ) { + + if ( typeof manager === 'boolean' ) { + + console.warn( 'THREE.JSONLoader: showStatus parameter has been removed from constructor.' ); + manager = undefined; + + } + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + this.withCredentials = false; + + } + + Object.assign( JSONLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var texturePath = this.texturePath && ( typeof this.texturePath === "string" ) ? this.texturePath : Loader.prototype.extractUrlBase( url ); + + var loader = new FileLoader( this.manager ); + loader.setWithCredentials( this.withCredentials ); + loader.load( url, function ( text ) { + + var json = JSON.parse( text ); + var metadata = json.metadata; + + if ( metadata !== undefined ) { + + var type = metadata.type; + + if ( type !== undefined ) { + + if ( type.toLowerCase() === 'object' ) { + + console.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.ObjectLoader instead.' ); + return; + + } + + if ( type.toLowerCase() === 'scene' ) { + + console.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.SceneLoader instead.' ); + return; + + } + + } + + } + + var object = scope.parse( json, texturePath ); + onLoad( object.geometry, object.materials ); + + }, onProgress, onError ); + + }, + + setTexturePath: function ( value ) { + + this.texturePath = value; + + }, + + parse: ( function () { + + function parseModel( json, geometry ) { + + function isBitSet( value, position ) { + + return value & ( 1 << position ); + + } + + var i, j, fi, + + offset, zLength, + + colorIndex, normalIndex, uvIndex, materialIndex, + + type, + isQuad, + hasMaterial, + hasFaceVertexUv, + hasFaceNormal, hasFaceVertexNormal, + hasFaceColor, hasFaceVertexColor, + + vertex, face, faceA, faceB, hex, normal, + + uvLayer, uv, u, v, + + faces = json.faces, + vertices = json.vertices, + normals = json.normals, + colors = json.colors, + + scale = json.scale, + + nUvLayers = 0; + + + if ( json.uvs !== undefined ) { + + // disregard empty arrays + + for ( i = 0; i < json.uvs.length; i ++ ) { + + if ( json.uvs[ i ].length ) nUvLayers ++; + + } + + for ( i = 0; i < nUvLayers; i ++ ) { + + geometry.faceVertexUvs[ i ] = []; + + } + + } + + offset = 0; + zLength = vertices.length; + + while ( offset < zLength ) { + + vertex = new Vector3(); + + vertex.x = vertices[ offset ++ ] * scale; + vertex.y = vertices[ offset ++ ] * scale; + vertex.z = vertices[ offset ++ ] * scale; + + geometry.vertices.push( vertex ); + + } + + offset = 0; + zLength = faces.length; + + while ( offset < zLength ) { + + type = faces[ offset ++ ]; + + isQuad = isBitSet( type, 0 ); + hasMaterial = isBitSet( type, 1 ); + hasFaceVertexUv = isBitSet( type, 3 ); + hasFaceNormal = isBitSet( type, 4 ); + hasFaceVertexNormal = isBitSet( type, 5 ); + hasFaceColor = isBitSet( type, 6 ); + hasFaceVertexColor = isBitSet( type, 7 ); + + // console.log("type", type, "bits", isQuad, hasMaterial, hasFaceVertexUv, hasFaceNormal, hasFaceVertexNormal, hasFaceColor, hasFaceVertexColor); + + if ( isQuad ) { + + faceA = new Face3(); + faceA.a = faces[ offset ]; + faceA.b = faces[ offset + 1 ]; + faceA.c = faces[ offset + 3 ]; + + faceB = new Face3(); + faceB.a = faces[ offset + 1 ]; + faceB.b = faces[ offset + 2 ]; + faceB.c = faces[ offset + 3 ]; + + offset += 4; + + if ( hasMaterial ) { + + materialIndex = faces[ offset ++ ]; + faceA.materialIndex = materialIndex; + faceB.materialIndex = materialIndex; + + } + + // to get face <=> uv index correspondence + + fi = geometry.faces.length; + + if ( hasFaceVertexUv ) { + + for ( i = 0; i < nUvLayers; i ++ ) { + + uvLayer = json.uvs[ i ]; + + geometry.faceVertexUvs[ i ][ fi ] = []; + geometry.faceVertexUvs[ i ][ fi + 1 ] = []; + + for ( j = 0; j < 4; j ++ ) { + + uvIndex = faces[ offset ++ ]; + + u = uvLayer[ uvIndex * 2 ]; + v = uvLayer[ uvIndex * 2 + 1 ]; + + uv = new Vector2( u, v ); + + if ( j !== 2 ) geometry.faceVertexUvs[ i ][ fi ].push( uv ); + if ( j !== 0 ) geometry.faceVertexUvs[ i ][ fi + 1 ].push( uv ); + + } + + } + + } + + if ( hasFaceNormal ) { + + normalIndex = faces[ offset ++ ] * 3; + + faceA.normal.set( + normals[ normalIndex ++ ], + normals[ normalIndex ++ ], + normals[ normalIndex ] + ); + + faceB.normal.copy( faceA.normal ); + + } + + if ( hasFaceVertexNormal ) { + + for ( i = 0; i < 4; i ++ ) { + + normalIndex = faces[ offset ++ ] * 3; + + normal = new Vector3( + normals[ normalIndex ++ ], + normals[ normalIndex ++ ], + normals[ normalIndex ] + ); + + + if ( i !== 2 ) faceA.vertexNormals.push( normal ); + if ( i !== 0 ) faceB.vertexNormals.push( normal ); + + } + + } + + + if ( hasFaceColor ) { + + colorIndex = faces[ offset ++ ]; + hex = colors[ colorIndex ]; + + faceA.color.setHex( hex ); + faceB.color.setHex( hex ); + + } + + + if ( hasFaceVertexColor ) { + + for ( i = 0; i < 4; i ++ ) { + + colorIndex = faces[ offset ++ ]; + hex = colors[ colorIndex ]; + + if ( i !== 2 ) faceA.vertexColors.push( new Color( hex ) ); + if ( i !== 0 ) faceB.vertexColors.push( new Color( hex ) ); + + } + + } + + geometry.faces.push( faceA ); + geometry.faces.push( faceB ); + + } else { + + face = new Face3(); + face.a = faces[ offset ++ ]; + face.b = faces[ offset ++ ]; + face.c = faces[ offset ++ ]; + + if ( hasMaterial ) { + + materialIndex = faces[ offset ++ ]; + face.materialIndex = materialIndex; + + } + + // to get face <=> uv index correspondence + + fi = geometry.faces.length; + + if ( hasFaceVertexUv ) { + + for ( i = 0; i < nUvLayers; i ++ ) { + + uvLayer = json.uvs[ i ]; + + geometry.faceVertexUvs[ i ][ fi ] = []; + + for ( j = 0; j < 3; j ++ ) { + + uvIndex = faces[ offset ++ ]; + + u = uvLayer[ uvIndex * 2 ]; + v = uvLayer[ uvIndex * 2 + 1 ]; + + uv = new Vector2( u, v ); + + geometry.faceVertexUvs[ i ][ fi ].push( uv ); + + } + + } + + } + + if ( hasFaceNormal ) { + + normalIndex = faces[ offset ++ ] * 3; + + face.normal.set( + normals[ normalIndex ++ ], + normals[ normalIndex ++ ], + normals[ normalIndex ] + ); + + } + + if ( hasFaceVertexNormal ) { + + for ( i = 0; i < 3; i ++ ) { + + normalIndex = faces[ offset ++ ] * 3; + + normal = new Vector3( + normals[ normalIndex ++ ], + normals[ normalIndex ++ ], + normals[ normalIndex ] + ); + + face.vertexNormals.push( normal ); + + } + + } + + + if ( hasFaceColor ) { + + colorIndex = faces[ offset ++ ]; + face.color.setHex( colors[ colorIndex ] ); + + } + + + if ( hasFaceVertexColor ) { + + for ( i = 0; i < 3; i ++ ) { + + colorIndex = faces[ offset ++ ]; + face.vertexColors.push( new Color( colors[ colorIndex ] ) ); + + } + + } + + geometry.faces.push( face ); + + } + + } + + } + + function parseSkin( json, geometry ) { + + var influencesPerVertex = ( json.influencesPerVertex !== undefined ) ? json.influencesPerVertex : 2; + + if ( json.skinWeights ) { + + for ( var i = 0, l = json.skinWeights.length; i < l; i += influencesPerVertex ) { + + var x = json.skinWeights[ i ]; + var y = ( influencesPerVertex > 1 ) ? json.skinWeights[ i + 1 ] : 0; + var z = ( influencesPerVertex > 2 ) ? json.skinWeights[ i + 2 ] : 0; + var w = ( influencesPerVertex > 3 ) ? json.skinWeights[ i + 3 ] : 0; + + geometry.skinWeights.push( new Vector4( x, y, z, w ) ); + + } + + } + + if ( json.skinIndices ) { + + for ( var i = 0, l = json.skinIndices.length; i < l; i += influencesPerVertex ) { + + var a = json.skinIndices[ i ]; + var b = ( influencesPerVertex > 1 ) ? json.skinIndices[ i + 1 ] : 0; + var c = ( influencesPerVertex > 2 ) ? json.skinIndices[ i + 2 ] : 0; + var d = ( influencesPerVertex > 3 ) ? json.skinIndices[ i + 3 ] : 0; + + geometry.skinIndices.push( new Vector4( a, b, c, d ) ); + + } + + } + + geometry.bones = json.bones; + + if ( geometry.bones && geometry.bones.length > 0 && ( geometry.skinWeights.length !== geometry.skinIndices.length || geometry.skinIndices.length !== geometry.vertices.length ) ) { + + console.warn( 'When skinning, number of vertices (' + geometry.vertices.length + '), skinIndices (' + + geometry.skinIndices.length + '), and skinWeights (' + geometry.skinWeights.length + ') should match.' ); + + } + + } + + function parseMorphing( json, geometry ) { + + var scale = json.scale; + + if ( json.morphTargets !== undefined ) { + + for ( var i = 0, l = json.morphTargets.length; i < l; i ++ ) { + + geometry.morphTargets[ i ] = {}; + geometry.morphTargets[ i ].name = json.morphTargets[ i ].name; + geometry.morphTargets[ i ].vertices = []; + + var dstVertices = geometry.morphTargets[ i ].vertices; + var srcVertices = json.morphTargets[ i ].vertices; + + for ( var v = 0, vl = srcVertices.length; v < vl; v += 3 ) { + + var vertex = new Vector3(); + vertex.x = srcVertices[ v ] * scale; + vertex.y = srcVertices[ v + 1 ] * scale; + vertex.z = srcVertices[ v + 2 ] * scale; + + dstVertices.push( vertex ); + + } + + } + + } + + if ( json.morphColors !== undefined && json.morphColors.length > 0 ) { + + console.warn( 'THREE.JSONLoader: "morphColors" no longer supported. Using them as face colors.' ); + + var faces = geometry.faces; + var morphColors = json.morphColors[ 0 ].colors; + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + faces[ i ].color.fromArray( morphColors, i * 3 ); + + } + + } + + } + + function parseAnimations( json, geometry ) { + + var outputAnimations = []; + + // parse old style Bone/Hierarchy animations + var animations = []; + + if ( json.animation !== undefined ) { + + animations.push( json.animation ); + + } + + if ( json.animations !== undefined ) { + + if ( json.animations.length ) { + + animations = animations.concat( json.animations ); + + } else { + + animations.push( json.animations ); + + } + + } + + for ( var i = 0; i < animations.length; i ++ ) { + + var clip = AnimationClip.parseAnimation( animations[ i ], geometry.bones ); + if ( clip ) outputAnimations.push( clip ); + + } + + // parse implicit morph animations + if ( geometry.morphTargets ) { + + // TODO: Figure out what an appropraite FPS is for morph target animations -- defaulting to 10, but really it is completely arbitrary. + var morphAnimationClips = AnimationClip.CreateClipsFromMorphTargetSequences( geometry.morphTargets, 10 ); + outputAnimations = outputAnimations.concat( morphAnimationClips ); + + } + + if ( outputAnimations.length > 0 ) geometry.animations = outputAnimations; + + } + + return function ( json, texturePath ) { + + if ( json.data !== undefined ) { + + // Geometry 4.0 spec + json = json.data; + + } + + if ( json.scale !== undefined ) { + + json.scale = 1.0 / json.scale; + + } else { + + json.scale = 1.0; + + } + + var geometry = new Geometry(); + + parseModel( json, geometry ); + parseSkin( json, geometry ); + parseMorphing( json, geometry ); + parseAnimations( json, geometry ); + + geometry.computeFaceNormals(); + geometry.computeBoundingSphere(); + + if ( json.materials === undefined || json.materials.length === 0 ) { + + return { geometry: geometry }; + + } else { + + var materials = Loader.prototype.initMaterials( json.materials, texturePath, this.crossOrigin ); + + return { geometry: geometry, materials: materials }; + + } + + }; + + } )() + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function ObjectLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + this.texturePath = ''; + + } + + Object.assign( ObjectLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + if ( this.texturePath === '' ) { + + this.texturePath = url.substring( 0, url.lastIndexOf( '/' ) + 1 ); + + } + + var scope = this; + + var loader = new FileLoader( scope.manager ); + loader.load( url, function ( text ) { + + var json = null; + + try { + + json = JSON.parse( text ); + + } catch ( error ) { + + if ( onError !== undefined ) onError( error ); + + console.error( 'THREE:ObjectLoader: Can\'t parse ' + url + '.', error.message ); + + return; + + } + + var metadata = json.metadata; + + if ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) { + + console.error( 'THREE.ObjectLoader: Can\'t load ' + url + '. Use THREE.JSONLoader instead.' ); + return; + + } + + scope.parse( json, onLoad ); + + }, onProgress, onError ); + + }, + + setTexturePath: function ( value ) { + + this.texturePath = value; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + + }, + + parse: function ( json, onLoad ) { + + var geometries = this.parseGeometries( json.geometries ); + + var images = this.parseImages( json.images, function () { + + if ( onLoad !== undefined ) onLoad( object ); + + } ); + + var textures = this.parseTextures( json.textures, images ); + var materials = this.parseMaterials( json.materials, textures ); + + var object = this.parseObject( json.object, geometries, materials ); + + if ( json.animations ) { + + object.animations = this.parseAnimations( json.animations ); + + } + + if ( json.images === undefined || json.images.length === 0 ) { + + if ( onLoad !== undefined ) onLoad( object ); + + } + + return object; + + }, + + parseGeometries: function ( json ) { + + var geometries = {}; + + if ( json !== undefined ) { + + var geometryLoader = new JSONLoader(); + var bufferGeometryLoader = new BufferGeometryLoader(); + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var geometry; + var data = json[ i ]; + + switch ( data.type ) { + + case 'PlaneGeometry': + case 'PlaneBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.width, + data.height, + data.widthSegments, + data.heightSegments + ); + + break; + + case 'BoxGeometry': + case 'BoxBufferGeometry': + case 'CubeGeometry': // backwards compatible + + geometry = new Geometries[ data.type ]( + data.width, + data.height, + data.depth, + data.widthSegments, + data.heightSegments, + data.depthSegments + ); + + break; + + case 'CircleGeometry': + case 'CircleBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.segments, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'CylinderGeometry': + case 'CylinderBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radiusTop, + data.radiusBottom, + data.height, + data.radialSegments, + data.heightSegments, + data.openEnded, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'ConeGeometry': + case 'ConeBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.height, + data.radialSegments, + data.heightSegments, + data.openEnded, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'SphereGeometry': + case 'SphereBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.widthSegments, + data.heightSegments, + data.phiStart, + data.phiLength, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'DodecahedronGeometry': + case 'IcosahedronGeometry': + case 'OctahedronGeometry': + case 'TetrahedronGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.detail + ); + + break; + + case 'RingGeometry': + case 'RingBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.innerRadius, + data.outerRadius, + data.thetaSegments, + data.phiSegments, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'TorusGeometry': + case 'TorusBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.tube, + data.radialSegments, + data.tubularSegments, + data.arc + ); + + break; + + case 'TorusKnotGeometry': + case 'TorusKnotBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.tube, + data.tubularSegments, + data.radialSegments, + data.p, + data.q + ); + + break; + + case 'LatheGeometry': + case 'LatheBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.points, + data.segments, + data.phiStart, + data.phiLength + ); + + break; + + case 'BufferGeometry': + + geometry = bufferGeometryLoader.parse( data ); + + break; + + case 'Geometry': + + geometry = geometryLoader.parse( data, this.texturePath ).geometry; + + break; + + default: + + console.warn( 'THREE.ObjectLoader: Unsupported geometry type "' + data.type + '"' ); + + continue; + + } + + geometry.uuid = data.uuid; + + if ( data.name !== undefined ) geometry.name = data.name; + + geometries[ data.uuid ] = geometry; + + } + + } + + return geometries; + + }, + + parseMaterials: function ( json, textures ) { + + var materials = {}; + + if ( json !== undefined ) { + + var loader = new MaterialLoader(); + loader.setTextures( textures ); + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var data = json[ i ]; + + if ( data.type === 'MultiMaterial' ) { + + // Deprecated + + var array = []; + + for ( var j = 0; j < data.materials.length; j ++ ) { + + array.push( loader.parse( data.materials[ j ] ) ); + + } + + materials[ data.uuid ] = array; + + } else { + + materials[ data.uuid ] = loader.parse( data ); + + } + + } + + } + + return materials; + + }, + + parseAnimations: function ( json ) { + + var animations = []; + + for ( var i = 0; i < json.length; i ++ ) { + + var clip = AnimationClip.parse( json[ i ] ); + + animations.push( clip ); + + } + + return animations; + + }, + + parseImages: function ( json, onLoad ) { + + var scope = this; + var images = {}; + + function loadImage( url ) { + + scope.manager.itemStart( url ); + + return loader.load( url, function () { + + scope.manager.itemEnd( url ); + + }, undefined, function () { + + scope.manager.itemEnd( url ); + scope.manager.itemError( url ); + + } ); + + } + + if ( json !== undefined && json.length > 0 ) { + + var manager = new LoadingManager( onLoad ); + + var loader = new ImageLoader( manager ); + loader.setCrossOrigin( this.crossOrigin ); + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var image = json[ i ]; + var path = /^(\/\/)|([a-z]+:(\/\/)?)/i.test( image.url ) ? image.url : scope.texturePath + image.url; + + images[ image.uuid ] = loadImage( path ); + + } + + } + + return images; + + }, + + parseTextures: function ( json, images ) { + + function parseConstant( value, type ) { + + if ( typeof( value ) === 'number' ) return value; + + console.warn( 'THREE.ObjectLoader.parseTexture: Constant should be in numeric form.', value ); + + return type[ value ]; + + } + + var textures = {}; + + if ( json !== undefined ) { + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var data = json[ i ]; + + if ( data.image === undefined ) { + + console.warn( 'THREE.ObjectLoader: No "image" specified for', data.uuid ); + + } + + if ( images[ data.image ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined image', data.image ); + + } + + var texture = new Texture( images[ data.image ] ); + texture.needsUpdate = true; + + texture.uuid = data.uuid; + + if ( data.name !== undefined ) texture.name = data.name; + + if ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TEXTURE_MAPPING ); + + if ( data.offset !== undefined ) texture.offset.fromArray( data.offset ); + if ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat ); + if ( data.wrap !== undefined ) { + + texture.wrapS = parseConstant( data.wrap[ 0 ], TEXTURE_WRAPPING ); + texture.wrapT = parseConstant( data.wrap[ 1 ], TEXTURE_WRAPPING ); + + } + + if ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TEXTURE_FILTER ); + if ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TEXTURE_FILTER ); + if ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy; + + if ( data.flipY !== undefined ) texture.flipY = data.flipY; + + textures[ data.uuid ] = texture; + + } + + } + + return textures; + + }, + + parseObject: function () { + + var matrix = new Matrix4(); + + return function parseObject( data, geometries, materials ) { + + var object; + + function getGeometry( name ) { + + if ( geometries[ name ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined geometry', name ); + + } + + return geometries[ name ]; + + } + + function getMaterial( name ) { + + if ( name === undefined ) return undefined; + + if ( Array.isArray( name ) ) { + + var array = []; + + for ( var i = 0, l = name.length; i < l; i ++ ) { + + var uuid = name[ i ]; + + if ( materials[ uuid ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined material', uuid ); + + } + + array.push( materials[ uuid ] ); + + } + + return array; + + } + + if ( materials[ name ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined material', name ); + + } + + return materials[ name ]; + + } + + switch ( data.type ) { + + case 'Scene': + + object = new Scene(); + + if ( data.background !== undefined ) { + + if ( Number.isInteger( data.background ) ) { + + object.background = new Color( data.background ); + + } + + } + + if ( data.fog !== undefined ) { + + if ( data.fog.type === 'Fog' ) { + + object.fog = new Fog( data.fog.color, data.fog.near, data.fog.far ); + + } else if ( data.fog.type === 'FogExp2' ) { + + object.fog = new FogExp2( data.fog.color, data.fog.density ); + + } + + } + + break; + + case 'PerspectiveCamera': + + object = new PerspectiveCamera( data.fov, data.aspect, data.near, data.far ); + + if ( data.focus !== undefined ) object.focus = data.focus; + if ( data.zoom !== undefined ) object.zoom = data.zoom; + if ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge; + if ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset; + if ( data.view !== undefined ) object.view = Object.assign( {}, data.view ); + + break; + + case 'OrthographicCamera': + + object = new OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far ); + + break; + + case 'AmbientLight': + + object = new AmbientLight( data.color, data.intensity ); + + break; + + case 'DirectionalLight': + + object = new DirectionalLight( data.color, data.intensity ); + + break; + + case 'PointLight': + + object = new PointLight( data.color, data.intensity, data.distance, data.decay ); + + break; + + case 'RectAreaLight': + + object = new RectAreaLight( data.color, data.intensity, data.width, data.height ); + + break; + + case 'SpotLight': + + object = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay ); + + break; + + case 'HemisphereLight': + + object = new HemisphereLight( data.color, data.groundColor, data.intensity ); + + break; + + case 'SkinnedMesh': + + console.warn( 'THREE.ObjectLoader.parseObject() does not support SkinnedMesh yet.' ); + + case 'Mesh': + + var geometry = getGeometry( data.geometry ); + var material = getMaterial( data.material ); + + if ( geometry.bones && geometry.bones.length > 0 ) { + + object = new SkinnedMesh( geometry, material ); + + } else { + + object = new Mesh( geometry, material ); + + } + + break; + + case 'LOD': + + object = new LOD(); + + break; + + case 'Line': + + object = new Line( getGeometry( data.geometry ), getMaterial( data.material ), data.mode ); + + break; + + case 'LineLoop': + + object = new LineLoop( getGeometry( data.geometry ), getMaterial( data.material ) ); + + break; + + case 'LineSegments': + + object = new LineSegments( getGeometry( data.geometry ), getMaterial( data.material ) ); + + break; + + case 'PointCloud': + case 'Points': + + object = new Points( getGeometry( data.geometry ), getMaterial( data.material ) ); + + break; + + case 'Sprite': + + object = new Sprite( getMaterial( data.material ) ); + + break; + + case 'Group': + + object = new Group(); + + break; + + default: + + object = new Object3D(); + + } + + object.uuid = data.uuid; + + if ( data.name !== undefined ) object.name = data.name; + if ( data.matrix !== undefined ) { + + matrix.fromArray( data.matrix ); + matrix.decompose( object.position, object.quaternion, object.scale ); + + } else { + + if ( data.position !== undefined ) object.position.fromArray( data.position ); + if ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation ); + if ( data.quaternion !== undefined ) object.quaternion.fromArray( data.quaternion ); + if ( data.scale !== undefined ) object.scale.fromArray( data.scale ); + + } + + if ( data.castShadow !== undefined ) object.castShadow = data.castShadow; + if ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow; + + if ( data.shadow ) { + + if ( data.shadow.bias !== undefined ) object.shadow.bias = data.shadow.bias; + if ( data.shadow.radius !== undefined ) object.shadow.radius = data.shadow.radius; + if ( data.shadow.mapSize !== undefined ) object.shadow.mapSize.fromArray( data.shadow.mapSize ); + if ( data.shadow.camera !== undefined ) object.shadow.camera = this.parseObject( data.shadow.camera ); + + } + + if ( data.visible !== undefined ) object.visible = data.visible; + if ( data.userData !== undefined ) object.userData = data.userData; + + if ( data.children !== undefined ) { + + for ( var child in data.children ) { + + object.add( this.parseObject( data.children[ child ], geometries, materials ) ); + + } + + } + + if ( data.type === 'LOD' ) { + + var levels = data.levels; + + for ( var l = 0; l < levels.length; l ++ ) { + + var level = levels[ l ]; + var child = object.getObjectByProperty( 'uuid', level.object ); + + if ( child !== undefined ) { + + object.addLevel( child, level.distance ); + + } + + } + + } + + return object; + + }; + + }() + + } ); + + var TEXTURE_MAPPING = { + UVMapping: UVMapping, + CubeReflectionMapping: CubeReflectionMapping, + CubeRefractionMapping: CubeRefractionMapping, + EquirectangularReflectionMapping: EquirectangularReflectionMapping, + EquirectangularRefractionMapping: EquirectangularRefractionMapping, + SphericalReflectionMapping: SphericalReflectionMapping, + CubeUVReflectionMapping: CubeUVReflectionMapping, + CubeUVRefractionMapping: CubeUVRefractionMapping + }; + + var TEXTURE_WRAPPING = { + RepeatWrapping: RepeatWrapping, + ClampToEdgeWrapping: ClampToEdgeWrapping, + MirroredRepeatWrapping: MirroredRepeatWrapping + }; + + var TEXTURE_FILTER = { + NearestFilter: NearestFilter, + NearestMipMapNearestFilter: NearestMipMapNearestFilter, + NearestMipMapLinearFilter: NearestMipMapLinearFilter, + LinearFilter: LinearFilter, + LinearMipMapNearestFilter: LinearMipMapNearestFilter, + LinearMipMapLinearFilter: LinearMipMapLinearFilter + }; + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * + * Bezier Curves formulas obtained from + * http://en.wikipedia.org/wiki/Bézier_curve + */ + + function CatmullRom( t, p0, p1, p2, p3 ) { + + var v0 = ( p2 - p0 ) * 0.5; + var v1 = ( p3 - p1 ) * 0.5; + var t2 = t * t; + var t3 = t * t2; + return ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1; + + } + + // + + function QuadraticBezierP0( t, p ) { + + var k = 1 - t; + return k * k * p; + + } + + function QuadraticBezierP1( t, p ) { + + return 2 * ( 1 - t ) * t * p; + + } + + function QuadraticBezierP2( t, p ) { + + return t * t * p; + + } + + function QuadraticBezier( t, p0, p1, p2 ) { + + return QuadraticBezierP0( t, p0 ) + QuadraticBezierP1( t, p1 ) + + QuadraticBezierP2( t, p2 ); + + } + + // + + function CubicBezierP0( t, p ) { + + var k = 1 - t; + return k * k * k * p; + + } + + function CubicBezierP1( t, p ) { + + var k = 1 - t; + return 3 * k * k * t * p; + + } + + function CubicBezierP2( t, p ) { + + return 3 * ( 1 - t ) * t * t * p; + + } + + function CubicBezierP3( t, p ) { + + return t * t * t * p; + + } + + function CubicBezier( t, p0, p1, p2, p3 ) { + + return CubicBezierP0( t, p0 ) + CubicBezierP1( t, p1 ) + CubicBezierP2( t, p2 ) + + CubicBezierP3( t, p3 ); + + } + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * Extensible curve object + * + * Some common of curve methods: + * .getPoint(t), getTangent(t) + * .getPointAt(u), getTangentAt(u) + * .getPoints(), .getSpacedPoints() + * .getLength() + * .updateArcLengths() + * + * This following curves inherit from THREE.Curve: + * + * -- 2D curves -- + * THREE.ArcCurve + * THREE.CubicBezierCurve + * THREE.EllipseCurve + * THREE.LineCurve + * THREE.QuadraticBezierCurve + * THREE.SplineCurve + * + * -- 3D curves -- + * THREE.CatmullRomCurve3 + * THREE.CubicBezierCurve3 + * THREE.LineCurve3 + * THREE.QuadraticBezierCurve3 + * + * A series of curves can be represented as a THREE.CurvePath. + * + **/ + + /************************************************************** + * Abstract Curve base class + **************************************************************/ + + function Curve() { + + this.arcLengthDivisions = 200; + + } + + Object.assign( Curve.prototype, { + + // Virtual base class method to overwrite and implement in subclasses + // - t [0 .. 1] + + getPoint: function () { + + console.warn( 'THREE.Curve: .getPoint() not implemented.' ); + return null; + + }, + + // Get point at relative position in curve according to arc length + // - u [0 .. 1] + + getPointAt: function ( u ) { + + var t = this.getUtoTmapping( u ); + return this.getPoint( t ); + + }, + + // Get sequence of points using getPoint( t ) + + getPoints: function ( divisions ) { + + if ( divisions === undefined ) divisions = 5; + + var points = []; + + for ( var d = 0; d <= divisions; d ++ ) { + + points.push( this.getPoint( d / divisions ) ); + + } + + return points; + + }, + + // Get sequence of points using getPointAt( u ) + + getSpacedPoints: function ( divisions ) { + + if ( divisions === undefined ) divisions = 5; + + var points = []; + + for ( var d = 0; d <= divisions; d ++ ) { + + points.push( this.getPointAt( d / divisions ) ); + + } + + return points; + + }, + + // Get total curve arc length + + getLength: function () { + + var lengths = this.getLengths(); + return lengths[ lengths.length - 1 ]; + + }, + + // Get list of cumulative segment lengths + + getLengths: function ( divisions ) { + + if ( divisions === undefined ) divisions = this.arcLengthDivisions; + + if ( this.cacheArcLengths && + ( this.cacheArcLengths.length === divisions + 1 ) && + ! this.needsUpdate ) { + + return this.cacheArcLengths; + + } + + this.needsUpdate = false; + + var cache = []; + var current, last = this.getPoint( 0 ); + var p, sum = 0; + + cache.push( 0 ); + + for ( p = 1; p <= divisions; p ++ ) { + + current = this.getPoint( p / divisions ); + sum += current.distanceTo( last ); + cache.push( sum ); + last = current; + + } + + this.cacheArcLengths = cache; + + return cache; // { sums: cache, sum: sum }; Sum is in the last element. + + }, + + updateArcLengths: function () { + + this.needsUpdate = true; + this.getLengths(); + + }, + + // Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant + + getUtoTmapping: function ( u, distance ) { + + var arcLengths = this.getLengths(); + + var i = 0, il = arcLengths.length; + + var targetArcLength; // The targeted u distance value to get + + if ( distance ) { + + targetArcLength = distance; + + } else { + + targetArcLength = u * arcLengths[ il - 1 ]; + + } + + // binary search for the index with largest value smaller than target u distance + + var low = 0, high = il - 1, comparison; + + while ( low <= high ) { + + i = Math.floor( low + ( high - low ) / 2 ); // less likely to overflow, though probably not issue here, JS doesn't really have integers, all numbers are floats + + comparison = arcLengths[ i ] - targetArcLength; + + if ( comparison < 0 ) { + + low = i + 1; + + } else if ( comparison > 0 ) { + + high = i - 1; + + } else { + + high = i; + break; + + // DONE + + } + + } + + i = high; + + if ( arcLengths[ i ] === targetArcLength ) { + + return i / ( il - 1 ); + + } + + // we could get finer grain at lengths, or use simple interpolation between two points + + var lengthBefore = arcLengths[ i ]; + var lengthAfter = arcLengths[ i + 1 ]; + + var segmentLength = lengthAfter - lengthBefore; + + // determine where we are between the 'before' and 'after' points + + var segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength; + + // add that fractional amount to t + + var t = ( i + segmentFraction ) / ( il - 1 ); + + return t; + + }, + + // Returns a unit vector tangent at t + // In case any sub curve does not implement its tangent derivation, + // 2 points a small delta apart will be used to find its gradient + // which seems to give a reasonable approximation + + getTangent: function ( t ) { + + var delta = 0.0001; + var t1 = t - delta; + var t2 = t + delta; + + // Capping in case of danger + + if ( t1 < 0 ) t1 = 0; + if ( t2 > 1 ) t2 = 1; + + var pt1 = this.getPoint( t1 ); + var pt2 = this.getPoint( t2 ); + + var vec = pt2.clone().sub( pt1 ); + return vec.normalize(); + + }, + + getTangentAt: function ( u ) { + + var t = this.getUtoTmapping( u ); + return this.getTangent( t ); + + }, + + computeFrenetFrames: function ( segments, closed ) { + + // see http://www.cs.indiana.edu/pub/techreports/TR425.pdf + + var normal = new Vector3(); + + var tangents = []; + var normals = []; + var binormals = []; + + var vec = new Vector3(); + var mat = new Matrix4(); + + var i, u, theta; + + // compute the tangent vectors for each segment on the curve + + for ( i = 0; i <= segments; i ++ ) { + + u = i / segments; + + tangents[ i ] = this.getTangentAt( u ); + tangents[ i ].normalize(); + + } + + // select an initial normal vector perpendicular to the first tangent vector, + // and in the direction of the minimum tangent xyz component + + normals[ 0 ] = new Vector3(); + binormals[ 0 ] = new Vector3(); + var min = Number.MAX_VALUE; + var tx = Math.abs( tangents[ 0 ].x ); + var ty = Math.abs( tangents[ 0 ].y ); + var tz = Math.abs( tangents[ 0 ].z ); + + if ( tx <= min ) { + + min = tx; + normal.set( 1, 0, 0 ); + + } + + if ( ty <= min ) { + + min = ty; + normal.set( 0, 1, 0 ); + + } + + if ( tz <= min ) { + + normal.set( 0, 0, 1 ); + + } + + vec.crossVectors( tangents[ 0 ], normal ).normalize(); + + normals[ 0 ].crossVectors( tangents[ 0 ], vec ); + binormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] ); + + + // compute the slowly-varying normal and binormal vectors for each segment on the curve + + for ( i = 1; i <= segments; i ++ ) { + + normals[ i ] = normals[ i - 1 ].clone(); + + binormals[ i ] = binormals[ i - 1 ].clone(); + + vec.crossVectors( tangents[ i - 1 ], tangents[ i ] ); + + if ( vec.length() > Number.EPSILON ) { + + vec.normalize(); + + theta = Math.acos( _Math.clamp( tangents[ i - 1 ].dot( tangents[ i ] ), - 1, 1 ) ); // clamp for floating pt errors + + normals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) ); + + } + + binormals[ i ].crossVectors( tangents[ i ], normals[ i ] ); + + } + + // if the curve is closed, postprocess the vectors so the first and last normal vectors are the same + + if ( closed === true ) { + + theta = Math.acos( _Math.clamp( normals[ 0 ].dot( normals[ segments ] ), - 1, 1 ) ); + theta /= segments; + + if ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ segments ] ) ) > 0 ) { + + theta = - theta; + + } + + for ( i = 1; i <= segments; i ++ ) { + + // twist a little... + normals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) ); + binormals[ i ].crossVectors( tangents[ i ], normals[ i ] ); + + } + + } + + return { + tangents: tangents, + normals: normals, + binormals: binormals + }; + + } + + } ); + + function LineCurve( v1, v2 ) { + + Curve.call( this ); + + this.v1 = v1; + this.v2 = v2; + + } + + LineCurve.prototype = Object.create( Curve.prototype ); + LineCurve.prototype.constructor = LineCurve; + + LineCurve.prototype.isLineCurve = true; + + LineCurve.prototype.getPoint = function ( t ) { + + if ( t === 1 ) { + + return this.v2.clone(); + + } + + var point = this.v2.clone().sub( this.v1 ); + point.multiplyScalar( t ).add( this.v1 ); + + return point; + + }; + + // Line curve is linear, so we can overwrite default getPointAt + + LineCurve.prototype.getPointAt = function ( u ) { + + return this.getPoint( u ); + + }; + + LineCurve.prototype.getTangent = function ( t ) { + + var tangent = this.v2.clone().sub( this.v1 ); + + return tangent.normalize(); + + }; + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * + **/ + + /************************************************************** + * Curved Path - a curve path is simply a array of connected + * curves, but retains the api of a curve + **************************************************************/ + + function CurvePath() { + + Curve.call( this ); + + this.curves = []; + + this.autoClose = false; // Automatically closes the path + + } + + CurvePath.prototype = Object.assign( Object.create( Curve.prototype ), { + + constructor: CurvePath, + + add: function ( curve ) { + + this.curves.push( curve ); + + }, + + closePath: function () { + + // Add a line curve if start and end of lines are not connected + var startPoint = this.curves[ 0 ].getPoint( 0 ); + var endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 ); + + if ( ! startPoint.equals( endPoint ) ) { + + this.curves.push( new LineCurve( endPoint, startPoint ) ); + + } + + }, + + // To get accurate point with reference to + // entire path distance at time t, + // following has to be done: + + // 1. Length of each sub path have to be known + // 2. Locate and identify type of curve + // 3. Get t for the curve + // 4. Return curve.getPointAt(t') + + getPoint: function ( t ) { + + var d = t * this.getLength(); + var curveLengths = this.getCurveLengths(); + var i = 0; + + // To think about boundaries points. + + while ( i < curveLengths.length ) { + + if ( curveLengths[ i ] >= d ) { + + var diff = curveLengths[ i ] - d; + var curve = this.curves[ i ]; + + var segmentLength = curve.getLength(); + var u = segmentLength === 0 ? 0 : 1 - diff / segmentLength; + + return curve.getPointAt( u ); + + } + + i ++; + + } + + return null; + + // loop where sum != 0, sum > d , sum+1 <d + + }, + + // We cannot use the default THREE.Curve getPoint() with getLength() because in + // THREE.Curve, getLength() depends on getPoint() but in THREE.CurvePath + // getPoint() depends on getLength + + getLength: function () { + + var lens = this.getCurveLengths(); + return lens[ lens.length - 1 ]; + + }, + + // cacheLengths must be recalculated. + updateArcLengths: function () { + + this.needsUpdate = true; + this.cacheLengths = null; + this.getCurveLengths(); + + }, + + // Compute lengths and cache them + // We cannot overwrite getLengths() because UtoT mapping uses it. + + getCurveLengths: function () { + + // We use cache values if curves and cache array are same length + + if ( this.cacheLengths && this.cacheLengths.length === this.curves.length ) { + + return this.cacheLengths; + + } + + // Get length of sub-curve + // Push sums into cached array + + var lengths = [], sums = 0; + + for ( var i = 0, l = this.curves.length; i < l; i ++ ) { + + sums += this.curves[ i ].getLength(); + lengths.push( sums ); + + } + + this.cacheLengths = lengths; + + return lengths; + + }, + + getSpacedPoints: function ( divisions ) { + + if ( divisions === undefined ) divisions = 40; + + var points = []; + + for ( var i = 0; i <= divisions; i ++ ) { + + points.push( this.getPoint( i / divisions ) ); + + } + + if ( this.autoClose ) { + + points.push( points[ 0 ] ); + + } + + return points; + + }, + + getPoints: function ( divisions ) { + + divisions = divisions || 12; + + var points = [], last; + + for ( var i = 0, curves = this.curves; i < curves.length; i ++ ) { + + var curve = curves[ i ]; + var resolution = (curve && curve.isEllipseCurve) ? divisions * 2 + : (curve && curve.isLineCurve) ? 1 + : (curve && curve.isSplineCurve) ? divisions * curve.points.length + : divisions; + + var pts = curve.getPoints( resolution ); + + for ( var j = 0; j < pts.length; j++ ) { + + var point = pts[ j ]; + + if ( last && last.equals( point ) ) continue; // ensures no consecutive points are duplicates + + points.push( point ); + last = point; + + } + + } + + if ( this.autoClose && points.length > 1 && !points[ points.length - 1 ].equals( points[ 0 ] ) ) { + + points.push( points[ 0 ] ); + + } + + return points; + + }, + + /************************************************************** + * Create Geometries Helpers + **************************************************************/ + + /// Generate geometry from path points (for Line or Points objects) + + createPointsGeometry: function ( divisions ) { + + var pts = this.getPoints( divisions ); + return this.createGeometry( pts ); + + }, + + // Generate geometry from equidistant sampling along the path + + createSpacedPointsGeometry: function ( divisions ) { + + var pts = this.getSpacedPoints( divisions ); + return this.createGeometry( pts ); + + }, + + createGeometry: function ( points ) { + + var geometry = new Geometry(); + + for ( var i = 0, l = points.length; i < l; i ++ ) { + + var point = points[ i ]; + geometry.vertices.push( new Vector3( point.x, point.y, point.z || 0 ) ); + + } + + return geometry; + + } + + } ); + + function EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) { + + Curve.call( this ); + + this.aX = aX; + this.aY = aY; + + this.xRadius = xRadius; + this.yRadius = yRadius; + + this.aStartAngle = aStartAngle; + this.aEndAngle = aEndAngle; + + this.aClockwise = aClockwise; + + this.aRotation = aRotation || 0; + + } + + EllipseCurve.prototype = Object.create( Curve.prototype ); + EllipseCurve.prototype.constructor = EllipseCurve; + + EllipseCurve.prototype.isEllipseCurve = true; + + EllipseCurve.prototype.getPoint = function ( t ) { + + var twoPi = Math.PI * 2; + var deltaAngle = this.aEndAngle - this.aStartAngle; + var samePoints = Math.abs( deltaAngle ) < Number.EPSILON; + + // ensures that deltaAngle is 0 .. 2 PI + while ( deltaAngle < 0 ) deltaAngle += twoPi; + while ( deltaAngle > twoPi ) deltaAngle -= twoPi; + + if ( deltaAngle < Number.EPSILON ) { + + if ( samePoints ) { + + deltaAngle = 0; + + } else { + + deltaAngle = twoPi; + + } + + } + + if ( this.aClockwise === true && ! samePoints ) { + + if ( deltaAngle === twoPi ) { + + deltaAngle = - twoPi; + + } else { + + deltaAngle = deltaAngle - twoPi; + + } + + } + + var angle = this.aStartAngle + t * deltaAngle; + var x = this.aX + this.xRadius * Math.cos( angle ); + var y = this.aY + this.yRadius * Math.sin( angle ); + + if ( this.aRotation !== 0 ) { + + var cos = Math.cos( this.aRotation ); + var sin = Math.sin( this.aRotation ); + + var tx = x - this.aX; + var ty = y - this.aY; + + // Rotate the point about the center of the ellipse. + x = tx * cos - ty * sin + this.aX; + y = tx * sin + ty * cos + this.aY; + + } + + return new Vector2( x, y ); + + }; + + function SplineCurve( points /* array of Vector2 */ ) { + + Curve.call( this ); + + this.points = ( points === undefined ) ? [] : points; + + } + + SplineCurve.prototype = Object.create( Curve.prototype ); + SplineCurve.prototype.constructor = SplineCurve; + + SplineCurve.prototype.isSplineCurve = true; + + SplineCurve.prototype.getPoint = function ( t ) { + + var points = this.points; + var point = ( points.length - 1 ) * t; + + var intPoint = Math.floor( point ); + var weight = point - intPoint; + + var point0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ]; + var point1 = points[ intPoint ]; + var point2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ]; + var point3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ]; + + return new Vector2( + CatmullRom( weight, point0.x, point1.x, point2.x, point3.x ), + CatmullRom( weight, point0.y, point1.y, point2.y, point3.y ) + ); + + }; + + function CubicBezierCurve( v0, v1, v2, v3 ) { + + Curve.call( this ); + + this.v0 = v0; + this.v1 = v1; + this.v2 = v2; + this.v3 = v3; + + } + + CubicBezierCurve.prototype = Object.create( Curve.prototype ); + CubicBezierCurve.prototype.constructor = CubicBezierCurve; + + CubicBezierCurve.prototype.getPoint = function ( t ) { + + var v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3; + + return new Vector2( + CubicBezier( t, v0.x, v1.x, v2.x, v3.x ), + CubicBezier( t, v0.y, v1.y, v2.y, v3.y ) + ); + + }; + + function QuadraticBezierCurve( v0, v1, v2 ) { + + Curve.call( this ); + + this.v0 = v0; + this.v1 = v1; + this.v2 = v2; + + } + + QuadraticBezierCurve.prototype = Object.create( Curve.prototype ); + QuadraticBezierCurve.prototype.constructor = QuadraticBezierCurve; + + QuadraticBezierCurve.prototype.getPoint = function ( t ) { + + var v0 = this.v0, v1 = this.v1, v2 = this.v2; + + return new Vector2( + QuadraticBezier( t, v0.x, v1.x, v2.x ), + QuadraticBezier( t, v0.y, v1.y, v2.y ) + ); + + }; + + var PathPrototype = Object.assign( Object.create( CurvePath.prototype ), { + + fromPoints: function ( vectors ) { + + this.moveTo( vectors[ 0 ].x, vectors[ 0 ].y ); + + for ( var i = 1, l = vectors.length; i < l; i ++ ) { + + this.lineTo( vectors[ i ].x, vectors[ i ].y ); + + } + + }, + + moveTo: function ( x, y ) { + + this.currentPoint.set( x, y ); // TODO consider referencing vectors instead of copying? + + }, + + lineTo: function ( x, y ) { + + var curve = new LineCurve( this.currentPoint.clone(), new Vector2( x, y ) ); + this.curves.push( curve ); + + this.currentPoint.set( x, y ); + + }, + + quadraticCurveTo: function ( aCPx, aCPy, aX, aY ) { + + var curve = new QuadraticBezierCurve( + this.currentPoint.clone(), + new Vector2( aCPx, aCPy ), + new Vector2( aX, aY ) + ); + + this.curves.push( curve ); + + this.currentPoint.set( aX, aY ); + + }, + + bezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) { + + var curve = new CubicBezierCurve( + this.currentPoint.clone(), + new Vector2( aCP1x, aCP1y ), + new Vector2( aCP2x, aCP2y ), + new Vector2( aX, aY ) + ); + + this.curves.push( curve ); + + this.currentPoint.set( aX, aY ); + + }, + + splineThru: function ( pts /*Array of Vector*/ ) { + + var npts = [ this.currentPoint.clone() ].concat( pts ); + + var curve = new SplineCurve( npts ); + this.curves.push( curve ); + + this.currentPoint.copy( pts[ pts.length - 1 ] ); + + }, + + arc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) { + + var x0 = this.currentPoint.x; + var y0 = this.currentPoint.y; + + this.absarc( aX + x0, aY + y0, aRadius, + aStartAngle, aEndAngle, aClockwise ); + + }, + + absarc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) { + + this.absellipse( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise ); + + }, + + ellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) { + + var x0 = this.currentPoint.x; + var y0 = this.currentPoint.y; + + this.absellipse( aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ); + + }, + + absellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) { + + var curve = new EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ); + + if ( this.curves.length > 0 ) { + + // if a previous curve is present, attempt to join + var firstPoint = curve.getPoint( 0 ); + + if ( ! firstPoint.equals( this.currentPoint ) ) { + + this.lineTo( firstPoint.x, firstPoint.y ); + + } + + } + + this.curves.push( curve ); + + var lastPoint = curve.getPoint( 1 ); + this.currentPoint.copy( lastPoint ); + + } + + } ); + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * Creates free form 2d path using series of points, lines or curves. + **/ + + function Path( points ) { + + CurvePath.call( this ); + this.currentPoint = new Vector2(); + + if ( points ) { + + this.fromPoints( points ); + + } + + } + + Path.prototype = PathPrototype; + PathPrototype.constructor = Path; + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * Defines a 2d shape plane using paths. + **/ + + // STEP 1 Create a path. + // STEP 2 Turn path into shape. + // STEP 3 ExtrudeGeometry takes in Shape/Shapes + // STEP 3a - Extract points from each shape, turn to vertices + // STEP 3b - Triangulate each shape, add faces. + + function Shape() { + + Path.apply( this, arguments ); + + this.holes = []; + + } + + Shape.prototype = Object.assign( Object.create( PathPrototype ), { + + constructor: Shape, + + getPointsHoles: function ( divisions ) { + + var holesPts = []; + + for ( var i = 0, l = this.holes.length; i < l; i ++ ) { + + holesPts[ i ] = this.holes[ i ].getPoints( divisions ); + + } + + return holesPts; + + }, + + // Get points of shape and holes (keypoints based on segments parameter) + + extractAllPoints: function ( divisions ) { + + return { + + shape: this.getPoints( divisions ), + holes: this.getPointsHoles( divisions ) + + }; + + }, + + extractPoints: function ( divisions ) { + + return this.extractAllPoints( divisions ); + + } + + } ); + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * minimal class for proxing functions to Path. Replaces old "extractSubpaths()" + **/ + + function ShapePath() { + + this.subPaths = []; + this.currentPath = null; + + } + + Object.assign( ShapePath.prototype, { + + moveTo: function ( x, y ) { + + this.currentPath = new Path(); + this.subPaths.push( this.currentPath ); + this.currentPath.moveTo( x, y ); + + }, + + lineTo: function ( x, y ) { + + this.currentPath.lineTo( x, y ); + + }, + + quadraticCurveTo: function ( aCPx, aCPy, aX, aY ) { + + this.currentPath.quadraticCurveTo( aCPx, aCPy, aX, aY ); + + }, + + bezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) { + + this.currentPath.bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ); + + }, + + splineThru: function ( pts ) { + + this.currentPath.splineThru( pts ); + + }, + + toShapes: function ( isCCW, noHoles ) { + + function toShapesNoHoles( inSubpaths ) { + + var shapes = []; + + for ( var i = 0, l = inSubpaths.length; i < l; i ++ ) { + + var tmpPath = inSubpaths[ i ]; + + var tmpShape = new Shape(); + tmpShape.curves = tmpPath.curves; + + shapes.push( tmpShape ); + + } + + return shapes; + + } + + function isPointInsidePolygon( inPt, inPolygon ) { + + var polyLen = inPolygon.length; + + // inPt on polygon contour => immediate success or + // toggling of inside/outside at every single! intersection point of an edge + // with the horizontal line through inPt, left of inPt + // not counting lowerY endpoints of edges and whole edges on that line + var inside = false; + for ( var p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) { + + var edgeLowPt = inPolygon[ p ]; + var edgeHighPt = inPolygon[ q ]; + + var edgeDx = edgeHighPt.x - edgeLowPt.x; + var edgeDy = edgeHighPt.y - edgeLowPt.y; + + if ( Math.abs( edgeDy ) > Number.EPSILON ) { + + // not parallel + if ( edgeDy < 0 ) { + + edgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx; + edgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy; + + } + if ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) continue; + + if ( inPt.y === edgeLowPt.y ) { + + if ( inPt.x === edgeLowPt.x ) return true; // inPt is on contour ? + // continue; // no intersection or edgeLowPt => doesn't count !!! + + } else { + + var perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y ); + if ( perpEdge === 0 ) return true; // inPt is on contour ? + if ( perpEdge < 0 ) continue; + inside = ! inside; // true intersection left of inPt + + } + + } else { + + // parallel or collinear + if ( inPt.y !== edgeLowPt.y ) continue; // parallel + // edge lies on the same horizontal line as inPt + if ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) || + ( ( edgeLowPt.x <= inPt.x ) && ( inPt.x <= edgeHighPt.x ) ) ) return true; // inPt: Point on contour ! + // continue; + + } + + } + + return inside; + + } + + var isClockWise = ShapeUtils.isClockWise; + + var subPaths = this.subPaths; + if ( subPaths.length === 0 ) return []; + + if ( noHoles === true ) return toShapesNoHoles( subPaths ); + + + var solid, tmpPath, tmpShape, shapes = []; + + if ( subPaths.length === 1 ) { + + tmpPath = subPaths[ 0 ]; + tmpShape = new Shape(); + tmpShape.curves = tmpPath.curves; + shapes.push( tmpShape ); + return shapes; + + } + + var holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() ); + holesFirst = isCCW ? ! holesFirst : holesFirst; + + // console.log("Holes first", holesFirst); + + var betterShapeHoles = []; + var newShapes = []; + var newShapeHoles = []; + var mainIdx = 0; + var tmpPoints; + + newShapes[ mainIdx ] = undefined; + newShapeHoles[ mainIdx ] = []; + + for ( var i = 0, l = subPaths.length; i < l; i ++ ) { + + tmpPath = subPaths[ i ]; + tmpPoints = tmpPath.getPoints(); + solid = isClockWise( tmpPoints ); + solid = isCCW ? ! solid : solid; + + if ( solid ) { + + if ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) ) mainIdx ++; + + newShapes[ mainIdx ] = { s: new Shape(), p: tmpPoints }; + newShapes[ mainIdx ].s.curves = tmpPath.curves; + + if ( holesFirst ) mainIdx ++; + newShapeHoles[ mainIdx ] = []; + + //console.log('cw', i); + + } else { + + newShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } ); + + //console.log('ccw', i); + + } + + } + + // only Holes? -> probably all Shapes with wrong orientation + if ( ! newShapes[ 0 ] ) return toShapesNoHoles( subPaths ); + + + if ( newShapes.length > 1 ) { + + var ambiguous = false; + var toChange = []; + + for ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) { + + betterShapeHoles[ sIdx ] = []; + + } + + for ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) { + + var sho = newShapeHoles[ sIdx ]; + + for ( var hIdx = 0; hIdx < sho.length; hIdx ++ ) { + + var ho = sho[ hIdx ]; + var hole_unassigned = true; + + for ( var s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) { + + if ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) { + + if ( sIdx !== s2Idx ) toChange.push( { froms: sIdx, tos: s2Idx, hole: hIdx } ); + if ( hole_unassigned ) { + + hole_unassigned = false; + betterShapeHoles[ s2Idx ].push( ho ); + + } else { + + ambiguous = true; + + } + + } + + } + if ( hole_unassigned ) { + + betterShapeHoles[ sIdx ].push( ho ); + + } + + } + + } + // console.log("ambiguous: ", ambiguous); + if ( toChange.length > 0 ) { + + // console.log("to change: ", toChange); + if ( ! ambiguous ) newShapeHoles = betterShapeHoles; + + } + + } + + var tmpHoles; + + for ( var i = 0, il = newShapes.length; i < il; i ++ ) { + + tmpShape = newShapes[ i ].s; + shapes.push( tmpShape ); + tmpHoles = newShapeHoles[ i ]; + + for ( var j = 0, jl = tmpHoles.length; j < jl; j ++ ) { + + tmpShape.holes.push( tmpHoles[ j ].h ); + + } + + } + + //console.log("shape", shapes); + + return shapes; + + } + + } ); + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * @author mrdoob / http://mrdoob.com/ + */ + + function Font( data ) { + + this.data = data; + + } + + Object.assign( Font.prototype, { + + isFont: true, + + generateShapes: function ( text, size, divisions ) { + + function createPaths( text ) { + + var chars = String( text ).split( '' ); + var scale = size / data.resolution; + var line_height = ( data.boundingBox.yMax - data.boundingBox.yMin + data.underlineThickness ) * scale; + + var offsetX = 0, offsetY = 0; + + var paths = []; + + for ( var i = 0; i < chars.length; i ++ ) { + + var char = chars[ i ]; + + if ( char === '\n' ) { + + offsetX = 0; + offsetY -= line_height; + + } else { + + var ret = createPath( char, scale, offsetX, offsetY ); + offsetX += ret.offsetX; + paths.push( ret.path ); + + } + + } + + return paths; + + } + + function createPath( c, scale, offsetX, offsetY ) { + + var glyph = data.glyphs[ c ] || data.glyphs[ '?' ]; + + if ( ! glyph ) return; + + var path = new ShapePath(); + + var pts = []; + var x, y, cpx, cpy, cpx0, cpy0, cpx1, cpy1, cpx2, cpy2, laste; + + if ( glyph.o ) { + + var outline = glyph._cachedOutline || ( glyph._cachedOutline = glyph.o.split( ' ' ) ); + + for ( var i = 0, l = outline.length; i < l; ) { + + var action = outline[ i ++ ]; + + switch ( action ) { + + case 'm': // moveTo + + x = outline[ i ++ ] * scale + offsetX; + y = outline[ i ++ ] * scale + offsetY; + + path.moveTo( x, y ); + + break; + + case 'l': // lineTo + + x = outline[ i ++ ] * scale + offsetX; + y = outline[ i ++ ] * scale + offsetY; + + path.lineTo( x, y ); + + break; + + case 'q': // quadraticCurveTo + + cpx = outline[ i ++ ] * scale + offsetX; + cpy = outline[ i ++ ] * scale + offsetY; + cpx1 = outline[ i ++ ] * scale + offsetX; + cpy1 = outline[ i ++ ] * scale + offsetY; + + path.quadraticCurveTo( cpx1, cpy1, cpx, cpy ); + + laste = pts[ pts.length - 1 ]; + + if ( laste ) { + + cpx0 = laste.x; + cpy0 = laste.y; + + for ( var i2 = 1; i2 <= divisions; i2 ++ ) { + + var t = i2 / divisions; + QuadraticBezier( t, cpx0, cpx1, cpx ); + QuadraticBezier( t, cpy0, cpy1, cpy ); + + } + + } + + break; + + case 'b': // bezierCurveTo + + cpx = outline[ i ++ ] * scale + offsetX; + cpy = outline[ i ++ ] * scale + offsetY; + cpx1 = outline[ i ++ ] * scale + offsetX; + cpy1 = outline[ i ++ ] * scale + offsetY; + cpx2 = outline[ i ++ ] * scale + offsetX; + cpy2 = outline[ i ++ ] * scale + offsetY; + + path.bezierCurveTo( cpx1, cpy1, cpx2, cpy2, cpx, cpy ); + + laste = pts[ pts.length - 1 ]; + + if ( laste ) { + + cpx0 = laste.x; + cpy0 = laste.y; + + for ( var i2 = 1; i2 <= divisions; i2 ++ ) { + + var t = i2 / divisions; + CubicBezier( t, cpx0, cpx1, cpx2, cpx ); + CubicBezier( t, cpy0, cpy1, cpy2, cpy ); + + } + + } + + break; + + } + + } + + } + + return { offsetX: glyph.ha * scale, path: path }; + + } + + // + + if ( size === undefined ) size = 100; + if ( divisions === undefined ) divisions = 4; + + var data = this.data; + + var paths = createPaths( text ); + var shapes = []; + + for ( var p = 0, pl = paths.length; p < pl; p ++ ) { + + Array.prototype.push.apply( shapes, paths[ p ].toShapes() ); + + } + + return shapes; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function FontLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( FontLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var loader = new FileLoader( this.manager ); + loader.load( url, function ( text ) { + + var json; + + try { + + json = JSON.parse( text ); + + } catch ( e ) { + + console.warn( 'THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead.' ); + json = JSON.parse( text.substring( 65, text.length - 2 ) ); + + } + + var font = scope.parse( json ); + + if ( onLoad ) onLoad( font ); + + }, onProgress, onError ); + + }, + + parse: function ( json ) { + + return new Font( json ); + + } + + } ); + + var context; + + var AudioContext = { + + getContext: function () { + + if ( context === undefined ) { + + context = new ( window.AudioContext || window.webkitAudioContext )(); + + } + + return context; + + }, + + setContext: function ( value ) { + + context = value; + + } + + }; + + /** + * @author Reece Aaron Lecrivain / http://reecenotes.com/ + */ + + function AudioLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( AudioLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var loader = new FileLoader( this.manager ); + loader.setResponseType( 'arraybuffer' ); + loader.load( url, function ( buffer ) { + + var context = AudioContext.getContext(); + + context.decodeAudioData( buffer, function ( audioBuffer ) { + + onLoad( audioBuffer ); + + } ); + + }, onProgress, onError ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function StereoCamera() { + + this.type = 'StereoCamera'; + + this.aspect = 1; + + this.eyeSep = 0.064; + + this.cameraL = new PerspectiveCamera(); + this.cameraL.layers.enable( 1 ); + this.cameraL.matrixAutoUpdate = false; + + this.cameraR = new PerspectiveCamera(); + this.cameraR.layers.enable( 2 ); + this.cameraR.matrixAutoUpdate = false; + + } + + Object.assign( StereoCamera.prototype, { + + update: ( function () { + + var instance, focus, fov, aspect, near, far, zoom, eyeSep; + + var eyeRight = new Matrix4(); + var eyeLeft = new Matrix4(); + + return function update( camera ) { + + var needsUpdate = instance !== this || focus !== camera.focus || fov !== camera.fov || + aspect !== camera.aspect * this.aspect || near !== camera.near || + far !== camera.far || zoom !== camera.zoom || eyeSep !== this.eyeSep; + + if ( needsUpdate ) { + + instance = this; + focus = camera.focus; + fov = camera.fov; + aspect = camera.aspect * this.aspect; + near = camera.near; + far = camera.far; + zoom = camera.zoom; + + // Off-axis stereoscopic effect based on + // http://paulbourke.net/stereographics/stereorender/ + + var projectionMatrix = camera.projectionMatrix.clone(); + eyeSep = this.eyeSep / 2; + var eyeSepOnProjection = eyeSep * near / focus; + var ymax = ( near * Math.tan( _Math.DEG2RAD * fov * 0.5 ) ) / zoom; + var xmin, xmax; + + // translate xOffset + + eyeLeft.elements[ 12 ] = - eyeSep; + eyeRight.elements[ 12 ] = eyeSep; + + // for left eye + + xmin = - ymax * aspect + eyeSepOnProjection; + xmax = ymax * aspect + eyeSepOnProjection; + + projectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin ); + projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin ); + + this.cameraL.projectionMatrix.copy( projectionMatrix ); + + // for right eye + + xmin = - ymax * aspect - eyeSepOnProjection; + xmax = ymax * aspect - eyeSepOnProjection; + + projectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin ); + projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin ); + + this.cameraR.projectionMatrix.copy( projectionMatrix ); + + } + + this.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( eyeLeft ); + this.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( eyeRight ); + + }; + + } )() + + } ); + + /** + * Camera for rendering cube maps + * - renders scene into axis-aligned cube + * + * @author alteredq / http://alteredqualia.com/ + */ + + function CubeCamera( near, far, cubeResolution ) { + + Object3D.call( this ); + + this.type = 'CubeCamera'; + + var fov = 90, aspect = 1; + + var cameraPX = new PerspectiveCamera( fov, aspect, near, far ); + cameraPX.up.set( 0, - 1, 0 ); + cameraPX.lookAt( new Vector3( 1, 0, 0 ) ); + this.add( cameraPX ); + + var cameraNX = new PerspectiveCamera( fov, aspect, near, far ); + cameraNX.up.set( 0, - 1, 0 ); + cameraNX.lookAt( new Vector3( - 1, 0, 0 ) ); + this.add( cameraNX ); + + var cameraPY = new PerspectiveCamera( fov, aspect, near, far ); + cameraPY.up.set( 0, 0, 1 ); + cameraPY.lookAt( new Vector3( 0, 1, 0 ) ); + this.add( cameraPY ); + + var cameraNY = new PerspectiveCamera( fov, aspect, near, far ); + cameraNY.up.set( 0, 0, - 1 ); + cameraNY.lookAt( new Vector3( 0, - 1, 0 ) ); + this.add( cameraNY ); + + var cameraPZ = new PerspectiveCamera( fov, aspect, near, far ); + cameraPZ.up.set( 0, - 1, 0 ); + cameraPZ.lookAt( new Vector3( 0, 0, 1 ) ); + this.add( cameraPZ ); + + var cameraNZ = new PerspectiveCamera( fov, aspect, near, far ); + cameraNZ.up.set( 0, - 1, 0 ); + cameraNZ.lookAt( new Vector3( 0, 0, - 1 ) ); + this.add( cameraNZ ); + + var options = { format: RGBFormat, magFilter: LinearFilter, minFilter: LinearFilter }; + + this.renderTarget = new WebGLRenderTargetCube( cubeResolution, cubeResolution, options ); + this.renderTarget.texture.name = "CubeCamera"; + + this.updateCubeMap = function ( renderer, scene ) { + + if ( this.parent === null ) this.updateMatrixWorld(); + + var renderTarget = this.renderTarget; + var generateMipmaps = renderTarget.texture.generateMipmaps; + + renderTarget.texture.generateMipmaps = false; + + renderTarget.activeCubeFace = 0; + renderer.render( scene, cameraPX, renderTarget ); + + renderTarget.activeCubeFace = 1; + renderer.render( scene, cameraNX, renderTarget ); + + renderTarget.activeCubeFace = 2; + renderer.render( scene, cameraPY, renderTarget ); + + renderTarget.activeCubeFace = 3; + renderer.render( scene, cameraNY, renderTarget ); + + renderTarget.activeCubeFace = 4; + renderer.render( scene, cameraPZ, renderTarget ); + + renderTarget.texture.generateMipmaps = generateMipmaps; + + renderTarget.activeCubeFace = 5; + renderer.render( scene, cameraNZ, renderTarget ); + + renderer.setRenderTarget( null ); + + }; + + } + + CubeCamera.prototype = Object.create( Object3D.prototype ); + CubeCamera.prototype.constructor = CubeCamera; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function AudioListener() { + + Object3D.call( this ); + + this.type = 'AudioListener'; + + this.context = AudioContext.getContext(); + + this.gain = this.context.createGain(); + this.gain.connect( this.context.destination ); + + this.filter = null; + + } + + AudioListener.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: AudioListener, + + getInput: function () { + + return this.gain; + + }, + + removeFilter: function ( ) { + + if ( this.filter !== null ) { + + this.gain.disconnect( this.filter ); + this.filter.disconnect( this.context.destination ); + this.gain.connect( this.context.destination ); + this.filter = null; + + } + + }, + + getFilter: function () { + + return this.filter; + + }, + + setFilter: function ( value ) { + + if ( this.filter !== null ) { + + this.gain.disconnect( this.filter ); + this.filter.disconnect( this.context.destination ); + + } else { + + this.gain.disconnect( this.context.destination ); + + } + + this.filter = value; + this.gain.connect( this.filter ); + this.filter.connect( this.context.destination ); + + }, + + getMasterVolume: function () { + + return this.gain.gain.value; + + }, + + setMasterVolume: function ( value ) { + + this.gain.gain.value = value; + + }, + + updateMatrixWorld: ( function () { + + var position = new Vector3(); + var quaternion = new Quaternion(); + var scale = new Vector3(); + + var orientation = new Vector3(); + + return function updateMatrixWorld( force ) { + + Object3D.prototype.updateMatrixWorld.call( this, force ); + + var listener = this.context.listener; + var up = this.up; + + this.matrixWorld.decompose( position, quaternion, scale ); + + orientation.set( 0, 0, - 1 ).applyQuaternion( quaternion ); + + if ( listener.positionX ) { + + listener.positionX.setValueAtTime( position.x, this.context.currentTime ); + listener.positionY.setValueAtTime( position.y, this.context.currentTime ); + listener.positionZ.setValueAtTime( position.z, this.context.currentTime ); + listener.forwardX.setValueAtTime( orientation.x, this.context.currentTime ); + listener.forwardY.setValueAtTime( orientation.y, this.context.currentTime ); + listener.forwardZ.setValueAtTime( orientation.z, this.context.currentTime ); + listener.upX.setValueAtTime( up.x, this.context.currentTime ); + listener.upY.setValueAtTime( up.y, this.context.currentTime ); + listener.upZ.setValueAtTime( up.z, this.context.currentTime ); + + } else { + + listener.setPosition( position.x, position.y, position.z ); + listener.setOrientation( orientation.x, orientation.y, orientation.z, up.x, up.y, up.z ); + + } + + }; + + } )() + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Reece Aaron Lecrivain / http://reecenotes.com/ + */ + + function Audio( listener ) { + + Object3D.call( this ); + + this.type = 'Audio'; + + this.context = listener.context; + + this.gain = this.context.createGain(); + this.gain.connect( listener.getInput() ); + + this.autoplay = false; + + this.buffer = null; + this.loop = false; + this.startTime = 0; + this.playbackRate = 1; + this.isPlaying = false; + this.hasPlaybackControl = true; + this.sourceType = 'empty'; + + this.filters = []; + + } + + Audio.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Audio, + + getOutput: function () { + + return this.gain; + + }, + + setNodeSource: function ( audioNode ) { + + this.hasPlaybackControl = false; + this.sourceType = 'audioNode'; + this.source = audioNode; + this.connect(); + + return this; + + }, + + setBuffer: function ( audioBuffer ) { + + this.buffer = audioBuffer; + this.sourceType = 'buffer'; + + if ( this.autoplay ) this.play(); + + return this; + + }, + + play: function () { + + if ( this.isPlaying === true ) { + + console.warn( 'THREE.Audio: Audio is already playing.' ); + return; + + } + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + var source = this.context.createBufferSource(); + + source.buffer = this.buffer; + source.loop = this.loop; + source.onended = this.onEnded.bind( this ); + source.playbackRate.setValueAtTime( this.playbackRate, this.startTime ); + source.start( 0, this.startTime ); + + this.isPlaying = true; + + this.source = source; + + return this.connect(); + + }, + + pause: function () { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + this.source.stop(); + this.startTime = this.context.currentTime; + this.isPlaying = false; + + return this; + + }, + + stop: function () { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + this.source.stop(); + this.startTime = 0; + this.isPlaying = false; + + return this; + + }, + + connect: function () { + + if ( this.filters.length > 0 ) { + + this.source.connect( this.filters[ 0 ] ); + + for ( var i = 1, l = this.filters.length; i < l; i ++ ) { + + this.filters[ i - 1 ].connect( this.filters[ i ] ); + + } + + this.filters[ this.filters.length - 1 ].connect( this.getOutput() ); + + } else { + + this.source.connect( this.getOutput() ); + + } + + return this; + + }, + + disconnect: function () { + + if ( this.filters.length > 0 ) { + + this.source.disconnect( this.filters[ 0 ] ); + + for ( var i = 1, l = this.filters.length; i < l; i ++ ) { + + this.filters[ i - 1 ].disconnect( this.filters[ i ] ); + + } + + this.filters[ this.filters.length - 1 ].disconnect( this.getOutput() ); + + } else { + + this.source.disconnect( this.getOutput() ); + + } + + return this; + + }, + + getFilters: function () { + + return this.filters; + + }, + + setFilters: function ( value ) { + + if ( ! value ) value = []; + + if ( this.isPlaying === true ) { + + this.disconnect(); + this.filters = value; + this.connect(); + + } else { + + this.filters = value; + + } + + return this; + + }, + + getFilter: function () { + + return this.getFilters()[ 0 ]; + + }, + + setFilter: function ( filter ) { + + return this.setFilters( filter ? [ filter ] : [] ); + + }, + + setPlaybackRate: function ( value ) { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + this.playbackRate = value; + + if ( this.isPlaying === true ) { + + this.source.playbackRate.setValueAtTime( this.playbackRate, this.context.currentTime ); + + } + + return this; + + }, + + getPlaybackRate: function () { + + return this.playbackRate; + + }, + + onEnded: function () { + + this.isPlaying = false; + + }, + + getLoop: function () { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return false; + + } + + return this.loop; + + }, + + setLoop: function ( value ) { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + this.loop = value; + + if ( this.isPlaying === true ) { + + this.source.loop = this.loop; + + } + + return this; + + }, + + getVolume: function () { + + return this.gain.gain.value; + + }, + + setVolume: function ( value ) { + + this.gain.gain.value = value; + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function PositionalAudio( listener ) { + + Audio.call( this, listener ); + + this.panner = this.context.createPanner(); + this.panner.connect( this.gain ); + + } + + PositionalAudio.prototype = Object.assign( Object.create( Audio.prototype ), { + + constructor: PositionalAudio, + + getOutput: function () { + + return this.panner; + + }, + + getRefDistance: function () { + + return this.panner.refDistance; + + }, + + setRefDistance: function ( value ) { + + this.panner.refDistance = value; + + }, + + getRolloffFactor: function () { + + return this.panner.rolloffFactor; + + }, + + setRolloffFactor: function ( value ) { + + this.panner.rolloffFactor = value; + + }, + + getDistanceModel: function () { + + return this.panner.distanceModel; + + }, + + setDistanceModel: function ( value ) { + + this.panner.distanceModel = value; + + }, + + getMaxDistance: function () { + + return this.panner.maxDistance; + + }, + + setMaxDistance: function ( value ) { + + this.panner.maxDistance = value; + + }, + + updateMatrixWorld: ( function () { + + var position = new Vector3(); + + return function updateMatrixWorld( force ) { + + Object3D.prototype.updateMatrixWorld.call( this, force ); + + position.setFromMatrixPosition( this.matrixWorld ); + + this.panner.setPosition( position.x, position.y, position.z ); + + }; + + } )() + + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function AudioAnalyser( audio, fftSize ) { + + this.analyser = audio.context.createAnalyser(); + this.analyser.fftSize = fftSize !== undefined ? fftSize : 2048; + + this.data = new Uint8Array( this.analyser.frequencyBinCount ); + + audio.getOutput().connect( this.analyser ); + + } + + Object.assign( AudioAnalyser.prototype, { + + getFrequencyData: function () { + + this.analyser.getByteFrequencyData( this.data ); + + return this.data; + + }, + + getAverageFrequency: function () { + + var value = 0, data = this.getFrequencyData(); + + for ( var i = 0; i < data.length; i ++ ) { + + value += data[ i ]; + + } + + return value / data.length; + + } + + } ); + + /** + * + * Buffered scene graph property that allows weighted accumulation. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function PropertyMixer( binding, typeName, valueSize ) { + + this.binding = binding; + this.valueSize = valueSize; + + var bufferType = Float64Array, + mixFunction; + + switch ( typeName ) { + + case 'quaternion': + mixFunction = this._slerp; + break; + + case 'string': + case 'bool': + bufferType = Array; + mixFunction = this._select; + break; + + default: + mixFunction = this._lerp; + + } + + this.buffer = new bufferType( valueSize * 4 ); + // layout: [ incoming | accu0 | accu1 | orig ] + // + // interpolators can use .buffer as their .result + // the data then goes to 'incoming' + // + // 'accu0' and 'accu1' are used frame-interleaved for + // the cumulative result and are compared to detect + // changes + // + // 'orig' stores the original state of the property + + this._mixBufferRegion = mixFunction; + + this.cumulativeWeight = 0; + + this.useCount = 0; + this.referenceCount = 0; + + } + + Object.assign( PropertyMixer.prototype, { + + // accumulate data in the 'incoming' region into 'accu<i>' + accumulate: function ( accuIndex, weight ) { + + // note: happily accumulating nothing when weight = 0, the caller knows + // the weight and shouldn't have made the call in the first place + + var buffer = this.buffer, + stride = this.valueSize, + offset = accuIndex * stride + stride, + + currentWeight = this.cumulativeWeight; + + if ( currentWeight === 0 ) { + + // accuN := incoming * weight + + for ( var i = 0; i !== stride; ++ i ) { + + buffer[ offset + i ] = buffer[ i ]; + + } + + currentWeight = weight; + + } else { + + // accuN := accuN + incoming * weight + + currentWeight += weight; + var mix = weight / currentWeight; + this._mixBufferRegion( buffer, offset, 0, mix, stride ); + + } + + this.cumulativeWeight = currentWeight; + + }, + + // apply the state of 'accu<i>' to the binding when accus differ + apply: function ( accuIndex ) { + + var stride = this.valueSize, + buffer = this.buffer, + offset = accuIndex * stride + stride, + + weight = this.cumulativeWeight, + + binding = this.binding; + + this.cumulativeWeight = 0; + + if ( weight < 1 ) { + + // accuN := accuN + original * ( 1 - cumulativeWeight ) + + var originalValueOffset = stride * 3; + + this._mixBufferRegion( + buffer, offset, originalValueOffset, 1 - weight, stride ); + + } + + for ( var i = stride, e = stride + stride; i !== e; ++ i ) { + + if ( buffer[ i ] !== buffer[ i + stride ] ) { + + // value has changed -> update scene graph + + binding.setValue( buffer, offset ); + break; + + } + + } + + }, + + // remember the state of the bound property and copy it to both accus + saveOriginalState: function () { + + var binding = this.binding; + + var buffer = this.buffer, + stride = this.valueSize, + + originalValueOffset = stride * 3; + + binding.getValue( buffer, originalValueOffset ); + + // accu[0..1] := orig -- initially detect changes against the original + for ( var i = stride, e = originalValueOffset; i !== e; ++ i ) { + + buffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ]; + + } + + this.cumulativeWeight = 0; + + }, + + // apply the state previously taken via 'saveOriginalState' to the binding + restoreOriginalState: function () { + + var originalValueOffset = this.valueSize * 3; + this.binding.setValue( this.buffer, originalValueOffset ); + + }, + + + // mix functions + + _select: function ( buffer, dstOffset, srcOffset, t, stride ) { + + if ( t >= 0.5 ) { + + for ( var i = 0; i !== stride; ++ i ) { + + buffer[ dstOffset + i ] = buffer[ srcOffset + i ]; + + } + + } + + }, + + _slerp: function ( buffer, dstOffset, srcOffset, t ) { + + Quaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, srcOffset, t ); + + }, + + _lerp: function ( buffer, dstOffset, srcOffset, t, stride ) { + + var s = 1 - t; + + for ( var i = 0; i !== stride; ++ i ) { + + var j = dstOffset + i; + + buffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t; + + } + + } + + } ); + + /** + * + * A reference to a real property in the scene graph. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function Composite( targetGroup, path, optionalParsedPath ) { + + var parsedPath = optionalParsedPath || PropertyBinding.parseTrackName( path ); + + this._targetGroup = targetGroup; + this._bindings = targetGroup.subscribe_( path, parsedPath ); + + } + + Object.assign( Composite.prototype, { + + getValue: function ( array, offset ) { + + this.bind(); // bind all binding + + var firstValidIndex = this._targetGroup.nCachedObjects_, + binding = this._bindings[ firstValidIndex ]; + + // and only call .getValue on the first + if ( binding !== undefined ) binding.getValue( array, offset ); + + }, + + setValue: function ( array, offset ) { + + var bindings = this._bindings; + + for ( var i = this._targetGroup.nCachedObjects_, + n = bindings.length; i !== n; ++ i ) { + + bindings[ i ].setValue( array, offset ); + + } + + }, + + bind: function () { + + var bindings = this._bindings; + + for ( var i = this._targetGroup.nCachedObjects_, + n = bindings.length; i !== n; ++ i ) { + + bindings[ i ].bind(); + + } + + }, + + unbind: function () { + + var bindings = this._bindings; + + for ( var i = this._targetGroup.nCachedObjects_, + n = bindings.length; i !== n; ++ i ) { + + bindings[ i ].unbind(); + + } + + } + + } ); + + + function PropertyBinding( rootNode, path, parsedPath ) { + + this.path = path; + this.parsedPath = parsedPath || PropertyBinding.parseTrackName( path ); + + this.node = PropertyBinding.findNode( rootNode, this.parsedPath.nodeName ) || rootNode; + + this.rootNode = rootNode; + + } + + Object.assign( PropertyBinding, { + + Composite: Composite, + + create: function ( root, path, parsedPath ) { + + if ( ! ( root && root.isAnimationObjectGroup ) ) { + + return new PropertyBinding( root, path, parsedPath ); + + } else { + + return new PropertyBinding.Composite( root, path, parsedPath ); + + } + + }, + + /** + * Replaces spaces with underscores and removes unsupported characters from + * node names, to ensure compatibility with parseTrackName(). + * + * @param {string} name Node name to be sanitized. + * @return {string} + */ + sanitizeNodeName: function ( name ) { + + return name.replace( /\s/g, '_' ).replace( /[^\w-]/g, '' ); + + }, + + parseTrackName: function () { + + // Parent directories, delimited by '/' or ':'. Currently unused, but must + // be matched to parse the rest of the track name. + var directoryRe = /((?:[\w-]+[\/:])*)/; + + // Target node. May contain word characters (a-zA-Z0-9_) and '.' or '-'. + var nodeRe = /([\w-\.]+)?/; + + // Object on target node, and accessor. Name may contain only word + // characters. Accessor may contain any character except closing bracket. + var objectRe = /(?:\.([\w-]+)(?:\[(.+)\])?)?/; + + // Property and accessor. May contain only word characters. Accessor may + // contain any non-bracket characters. + var propertyRe = /\.([\w-]+)(?:\[(.+)\])?/; + + var trackRe = new RegExp('' + + '^' + + directoryRe.source + + nodeRe.source + + objectRe.source + + propertyRe.source + + '$' + ); + + var supportedObjectNames = [ 'material', 'materials', 'bones' ]; + + return function ( trackName ) { + + var matches = trackRe.exec( trackName ); + + if ( ! matches ) { + + throw new Error( 'PropertyBinding: Cannot parse trackName: ' + trackName ); + + } + + var results = { + // directoryName: matches[ 1 ], // (tschw) currently unused + nodeName: matches[ 2 ], + objectName: matches[ 3 ], + objectIndex: matches[ 4 ], + propertyName: matches[ 5 ], // required + propertyIndex: matches[ 6 ] + }; + + var lastDot = results.nodeName && results.nodeName.lastIndexOf( '.' ); + + if ( lastDot !== undefined && lastDot !== -1 ) { + + var objectName = results.nodeName.substring( lastDot + 1 ); + + // Object names must be checked against a whitelist. Otherwise, there + // is no way to parse 'foo.bar.baz': 'baz' must be a property, but + // 'bar' could be the objectName, or part of a nodeName (which can + // include '.' characters). + if ( supportedObjectNames.indexOf( objectName ) !== -1 ) { + + results.nodeName = results.nodeName.substring( 0, lastDot ); + results.objectName = objectName; + + } + + } + + if ( results.propertyName === null || results.propertyName.length === 0 ) { + + throw new Error( 'PropertyBinding: can not parse propertyName from trackName: ' + trackName ); + + } + + return results; + + }; + + }(), + + findNode: function ( root, nodeName ) { + + if ( ! nodeName || nodeName === "" || nodeName === "root" || nodeName === "." || nodeName === - 1 || nodeName === root.name || nodeName === root.uuid ) { + + return root; + + } + + // search into skeleton bones. + if ( root.skeleton ) { + + var searchSkeleton = function ( skeleton ) { + + for ( var i = 0; i < skeleton.bones.length; i ++ ) { + + var bone = skeleton.bones[ i ]; + + if ( bone.name === nodeName ) { + + return bone; + + } + + } + + return null; + + }; + + var bone = searchSkeleton( root.skeleton ); + + if ( bone ) { + + return bone; + + } + + } + + // search into node subtree. + if ( root.children ) { + + var searchNodeSubtree = function ( children ) { + + for ( var i = 0; i < children.length; i ++ ) { + + var childNode = children[ i ]; + + if ( childNode.name === nodeName || childNode.uuid === nodeName ) { + + return childNode; + + } + + var result = searchNodeSubtree( childNode.children ); + + if ( result ) return result; + + } + + return null; + + }; + + var subTreeNode = searchNodeSubtree( root.children ); + + if ( subTreeNode ) { + + return subTreeNode; + + } + + } + + return null; + + } + + } ); + + Object.assign( PropertyBinding.prototype, { // prototype, continued + + // these are used to "bind" a nonexistent property + _getValue_unavailable: function () {}, + _setValue_unavailable: function () {}, + + BindingType: { + Direct: 0, + EntireArray: 1, + ArrayElement: 2, + HasFromToArray: 3 + }, + + Versioning: { + None: 0, + NeedsUpdate: 1, + MatrixWorldNeedsUpdate: 2 + }, + + GetterByBindingType: [ + + function getValue_direct( buffer, offset ) { + + buffer[ offset ] = this.node[ this.propertyName ]; + + }, + + function getValue_array( buffer, offset ) { + + var source = this.resolvedProperty; + + for ( var i = 0, n = source.length; i !== n; ++ i ) { + + buffer[ offset ++ ] = source[ i ]; + + } + + }, + + function getValue_arrayElement( buffer, offset ) { + + buffer[ offset ] = this.resolvedProperty[ this.propertyIndex ]; + + }, + + function getValue_toArray( buffer, offset ) { + + this.resolvedProperty.toArray( buffer, offset ); + + } + + ], + + SetterByBindingTypeAndVersioning: [ + + [ + // Direct + + function setValue_direct( buffer, offset ) { + + this.node[ this.propertyName ] = buffer[ offset ]; + + }, + + function setValue_direct_setNeedsUpdate( buffer, offset ) { + + this.node[ this.propertyName ] = buffer[ offset ]; + this.targetObject.needsUpdate = true; + + }, + + function setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) { + + this.node[ this.propertyName ] = buffer[ offset ]; + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + ], [ + + // EntireArray + + function setValue_array( buffer, offset ) { + + var dest = this.resolvedProperty; + + for ( var i = 0, n = dest.length; i !== n; ++ i ) { + + dest[ i ] = buffer[ offset ++ ]; + + } + + }, + + function setValue_array_setNeedsUpdate( buffer, offset ) { + + var dest = this.resolvedProperty; + + for ( var i = 0, n = dest.length; i !== n; ++ i ) { + + dest[ i ] = buffer[ offset ++ ]; + + } + + this.targetObject.needsUpdate = true; + + }, + + function setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) { + + var dest = this.resolvedProperty; + + for ( var i = 0, n = dest.length; i !== n; ++ i ) { + + dest[ i ] = buffer[ offset ++ ]; + + } + + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + ], [ + + // ArrayElement + + function setValue_arrayElement( buffer, offset ) { + + this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ]; + + }, + + function setValue_arrayElement_setNeedsUpdate( buffer, offset ) { + + this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ]; + this.targetObject.needsUpdate = true; + + }, + + function setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) { + + this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ]; + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + ], [ + + // HasToFromArray + + function setValue_fromArray( buffer, offset ) { + + this.resolvedProperty.fromArray( buffer, offset ); + + }, + + function setValue_fromArray_setNeedsUpdate( buffer, offset ) { + + this.resolvedProperty.fromArray( buffer, offset ); + this.targetObject.needsUpdate = true; + + }, + + function setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) { + + this.resolvedProperty.fromArray( buffer, offset ); + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + ] + + ], + + getValue: function getValue_unbound( targetArray, offset ) { + + this.bind(); + this.getValue( targetArray, offset ); + + // Note: This class uses a State pattern on a per-method basis: + // 'bind' sets 'this.getValue' / 'setValue' and shadows the + // prototype version of these methods with one that represents + // the bound state. When the property is not found, the methods + // become no-ops. + + }, + + setValue: function getValue_unbound( sourceArray, offset ) { + + this.bind(); + this.setValue( sourceArray, offset ); + + }, + + // create getter / setter pair for a property in the scene graph + bind: function () { + + var targetObject = this.node, + parsedPath = this.parsedPath, + + objectName = parsedPath.objectName, + propertyName = parsedPath.propertyName, + propertyIndex = parsedPath.propertyIndex; + + if ( ! targetObject ) { + + targetObject = PropertyBinding.findNode( + this.rootNode, parsedPath.nodeName ) || this.rootNode; + + this.node = targetObject; + + } + + // set fail state so we can just 'return' on error + this.getValue = this._getValue_unavailable; + this.setValue = this._setValue_unavailable; + + // ensure there is a value node + if ( ! targetObject ) { + + console.error( 'THREE.PropertyBinding: Trying to update node for track: ' + this.path + ' but it wasn\'t found.' ); + return; + + } + + if ( objectName ) { + + var objectIndex = parsedPath.objectIndex; + + // special cases were we need to reach deeper into the hierarchy to get the face materials.... + switch ( objectName ) { + + case 'materials': + + if ( ! targetObject.material ) { + + console.error( 'THREE.PropertyBinding: Can not bind to material as node does not have a material.', this ); + return; + + } + + if ( ! targetObject.material.materials ) { + + console.error( 'THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.', this ); + return; + + } + + targetObject = targetObject.material.materials; + + break; + + case 'bones': + + if ( ! targetObject.skeleton ) { + + console.error( 'THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.', this ); + return; + + } + + // potential future optimization: skip this if propertyIndex is already an integer + // and convert the integer string to a true integer. + + targetObject = targetObject.skeleton.bones; + + // support resolving morphTarget names into indices. + for ( var i = 0; i < targetObject.length; i ++ ) { + + if ( targetObject[ i ].name === objectIndex ) { + + objectIndex = i; + break; + + } + + } + + break; + + default: + + if ( targetObject[ objectName ] === undefined ) { + + console.error( 'THREE.PropertyBinding: Can not bind to objectName of node undefined.', this ); + return; + + } + + targetObject = targetObject[ objectName ]; + + } + + + if ( objectIndex !== undefined ) { + + if ( targetObject[ objectIndex ] === undefined ) { + + console.error( 'THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.', this, targetObject ); + return; + + } + + targetObject = targetObject[ objectIndex ]; + + } + + } + + // resolve property + var nodeProperty = targetObject[ propertyName ]; + + if ( nodeProperty === undefined ) { + + var nodeName = parsedPath.nodeName; + + console.error( 'THREE.PropertyBinding: Trying to update property for track: ' + nodeName + + '.' + propertyName + ' but it wasn\'t found.', targetObject ); + return; + + } + + // determine versioning scheme + var versioning = this.Versioning.None; + + if ( targetObject.needsUpdate !== undefined ) { // material + + versioning = this.Versioning.NeedsUpdate; + this.targetObject = targetObject; + + } else if ( targetObject.matrixWorldNeedsUpdate !== undefined ) { // node transform + + versioning = this.Versioning.MatrixWorldNeedsUpdate; + this.targetObject = targetObject; + + } + + // determine how the property gets bound + var bindingType = this.BindingType.Direct; + + if ( propertyIndex !== undefined ) { + + // access a sub element of the property array (only primitives are supported right now) + + if ( propertyName === "morphTargetInfluences" ) { + + // potential optimization, skip this if propertyIndex is already an integer, and convert the integer string to a true integer. + + // support resolving morphTarget names into indices. + if ( ! targetObject.geometry ) { + + console.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.', this ); + return; + + } + + if ( targetObject.geometry.isBufferGeometry ) { + + if ( ! targetObject.geometry.morphAttributes ) { + + console.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.', this ); + return; + + } + + for ( var i = 0; i < this.node.geometry.morphAttributes.position.length; i ++ ) { + + if ( targetObject.geometry.morphAttributes.position[ i ].name === propertyIndex ) { + + propertyIndex = i; + break; + + } + + } + + + } else { + + if ( ! targetObject.geometry.morphTargets ) { + + console.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphTargets.', this ); + return; + + } + + for ( var i = 0; i < this.node.geometry.morphTargets.length; i ++ ) { + + if ( targetObject.geometry.morphTargets[ i ].name === propertyIndex ) { + + propertyIndex = i; + break; + + } + + } + + } + + } + + bindingType = this.BindingType.ArrayElement; + + this.resolvedProperty = nodeProperty; + this.propertyIndex = propertyIndex; + + } else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) { + + // must use copy for Object3D.Euler/Quaternion + + bindingType = this.BindingType.HasFromToArray; + + this.resolvedProperty = nodeProperty; + + } else if ( Array.isArray( nodeProperty ) ) { + + bindingType = this.BindingType.EntireArray; + + this.resolvedProperty = nodeProperty; + + } else { + + this.propertyName = propertyName; + + } + + // select getter / setter + this.getValue = this.GetterByBindingType[ bindingType ]; + this.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ]; + + }, + + unbind: function () { + + this.node = null; + + // back to the prototype version of getValue / setValue + // note: avoiding to mutate the shape of 'this' via 'delete' + this.getValue = this._getValue_unbound; + this.setValue = this._setValue_unbound; + + } + + } ); + + //!\ DECLARE ALIAS AFTER assign prototype ! + Object.assign( PropertyBinding.prototype, { + + // initial state of these methods that calls 'bind' + _getValue_unbound: PropertyBinding.prototype.getValue, + _setValue_unbound: PropertyBinding.prototype.setValue, + + } ); + + /** + * + * A group of objects that receives a shared animation state. + * + * Usage: + * + * - Add objects you would otherwise pass as 'root' to the + * constructor or the .clipAction method of AnimationMixer. + * + * - Instead pass this object as 'root'. + * + * - You can also add and remove objects later when the mixer + * is running. + * + * Note: + * + * Objects of this class appear as one object to the mixer, + * so cache control of the individual objects must be done + * on the group. + * + * Limitation: + * + * - The animated properties must be compatible among the + * all objects in the group. + * + * - A single property can either be controlled through a + * target group or directly, but not both. + * + * @author tschw + */ + + function AnimationObjectGroup( var_args ) { + + this.uuid = _Math.generateUUID(); + + // cached objects followed by the active ones + this._objects = Array.prototype.slice.call( arguments ); + + this.nCachedObjects_ = 0; // threshold + // note: read by PropertyBinding.Composite + + var indices = {}; + this._indicesByUUID = indices; // for bookkeeping + + for ( var i = 0, n = arguments.length; i !== n; ++ i ) { + + indices[ arguments[ i ].uuid ] = i; + + } + + this._paths = []; // inside: string + this._parsedPaths = []; // inside: { we don't care, here } + this._bindings = []; // inside: Array< PropertyBinding > + this._bindingsIndicesByPath = {}; // inside: indices in these arrays + + var scope = this; + + this.stats = { + + objects: { + get total() { return scope._objects.length; }, + get inUse() { return this.total - scope.nCachedObjects_; } + }, + + get bindingsPerObject() { return scope._bindings.length; } + + }; + + } + + Object.assign( AnimationObjectGroup.prototype, { + + isAnimationObjectGroup: true, + + add: function( var_args ) { + + var objects = this._objects, + nObjects = objects.length, + nCachedObjects = this.nCachedObjects_, + indicesByUUID = this._indicesByUUID, + paths = this._paths, + parsedPaths = this._parsedPaths, + bindings = this._bindings, + nBindings = bindings.length; + + for ( var i = 0, n = arguments.length; i !== n; ++ i ) { + + var object = arguments[ i ], + uuid = object.uuid, + index = indicesByUUID[ uuid ], + knownObject = undefined; + + if ( index === undefined ) { + + // unknown object -> add it to the ACTIVE region + + index = nObjects ++; + indicesByUUID[ uuid ] = index; + objects.push( object ); + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + bindings[ j ].push( + new PropertyBinding( + object, paths[ j ], parsedPaths[ j ] ) ); + + } + + } else if ( index < nCachedObjects ) { + + knownObject = objects[ index ]; + + // move existing object to the ACTIVE region + + var firstActiveIndex = -- nCachedObjects, + lastCachedObject = objects[ firstActiveIndex ]; + + indicesByUUID[ lastCachedObject.uuid ] = index; + objects[ index ] = lastCachedObject; + + indicesByUUID[ uuid ] = firstActiveIndex; + objects[ firstActiveIndex ] = object; + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + var bindingsForPath = bindings[ j ], + lastCached = bindingsForPath[ firstActiveIndex ], + binding = bindingsForPath[ index ]; + + bindingsForPath[ index ] = lastCached; + + if ( binding === undefined ) { + + // since we do not bother to create new bindings + // for objects that are cached, the binding may + // or may not exist + + binding = new PropertyBinding( + object, paths[ j ], parsedPaths[ j ] ); + + } + + bindingsForPath[ firstActiveIndex ] = binding; + + } + + } else if ( objects[ index ] !== knownObject ) { + + console.error( 'THREE.AnimationObjectGroup: Different objects with the same UUID ' + + 'detected. Clean the caches or recreate your infrastructure when reloading scenes.' ); + + } // else the object is already where we want it to be + + } // for arguments + + this.nCachedObjects_ = nCachedObjects; + + }, + + remove: function( var_args ) { + + var objects = this._objects, + nCachedObjects = this.nCachedObjects_, + indicesByUUID = this._indicesByUUID, + bindings = this._bindings, + nBindings = bindings.length; + + for ( var i = 0, n = arguments.length; i !== n; ++ i ) { + + var object = arguments[ i ], + uuid = object.uuid, + index = indicesByUUID[ uuid ]; + + if ( index !== undefined && index >= nCachedObjects ) { + + // move existing object into the CACHED region + + var lastCachedIndex = nCachedObjects ++, + firstActiveObject = objects[ lastCachedIndex ]; + + indicesByUUID[ firstActiveObject.uuid ] = index; + objects[ index ] = firstActiveObject; + + indicesByUUID[ uuid ] = lastCachedIndex; + objects[ lastCachedIndex ] = object; + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + var bindingsForPath = bindings[ j ], + firstActive = bindingsForPath[ lastCachedIndex ], + binding = bindingsForPath[ index ]; + + bindingsForPath[ index ] = firstActive; + bindingsForPath[ lastCachedIndex ] = binding; + + } + + } + + } // for arguments + + this.nCachedObjects_ = nCachedObjects; + + }, + + // remove & forget + uncache: function( var_args ) { + + var objects = this._objects, + nObjects = objects.length, + nCachedObjects = this.nCachedObjects_, + indicesByUUID = this._indicesByUUID, + bindings = this._bindings, + nBindings = bindings.length; + + for ( var i = 0, n = arguments.length; i !== n; ++ i ) { + + var object = arguments[ i ], + uuid = object.uuid, + index = indicesByUUID[ uuid ]; + + if ( index !== undefined ) { + + delete indicesByUUID[ uuid ]; + + if ( index < nCachedObjects ) { + + // object is cached, shrink the CACHED region + + var firstActiveIndex = -- nCachedObjects, + lastCachedObject = objects[ firstActiveIndex ], + lastIndex = -- nObjects, + lastObject = objects[ lastIndex ]; + + // last cached object takes this object's place + indicesByUUID[ lastCachedObject.uuid ] = index; + objects[ index ] = lastCachedObject; + + // last object goes to the activated slot and pop + indicesByUUID[ lastObject.uuid ] = firstActiveIndex; + objects[ firstActiveIndex ] = lastObject; + objects.pop(); + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + var bindingsForPath = bindings[ j ], + lastCached = bindingsForPath[ firstActiveIndex ], + last = bindingsForPath[ lastIndex ]; + + bindingsForPath[ index ] = lastCached; + bindingsForPath[ firstActiveIndex ] = last; + bindingsForPath.pop(); + + } + + } else { + + // object is active, just swap with the last and pop + + var lastIndex = -- nObjects, + lastObject = objects[ lastIndex ]; + + indicesByUUID[ lastObject.uuid ] = index; + objects[ index ] = lastObject; + objects.pop(); + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + var bindingsForPath = bindings[ j ]; + + bindingsForPath[ index ] = bindingsForPath[ lastIndex ]; + bindingsForPath.pop(); + + } + + } // cached or active + + } // if object is known + + } // for arguments + + this.nCachedObjects_ = nCachedObjects; + + }, + + // Internal interface used by befriended PropertyBinding.Composite: + + subscribe_: function ( path, parsedPath ) { + + // returns an array of bindings for the given path that is changed + // according to the contained objects in the group + + var indicesByPath = this._bindingsIndicesByPath, + index = indicesByPath[ path ], + bindings = this._bindings; + + if ( index !== undefined ) return bindings[ index ]; + + var paths = this._paths, + parsedPaths = this._parsedPaths, + objects = this._objects, + nObjects = objects.length, + nCachedObjects = this.nCachedObjects_, + bindingsForPath = new Array( nObjects ); + + index = bindings.length; + + indicesByPath[ path ] = index; + + paths.push( path ); + parsedPaths.push( parsedPath ); + bindings.push( bindingsForPath ); + + for ( var i = nCachedObjects, n = objects.length; i !== n; ++ i ) { + + var object = objects[ i ]; + bindingsForPath[ i ] = new PropertyBinding( object, path, parsedPath ); + + } + + return bindingsForPath; + + }, + + unsubscribe_: function ( path ) { + + // tells the group to forget about a property path and no longer + // update the array previously obtained with 'subscribe_' + + var indicesByPath = this._bindingsIndicesByPath, + index = indicesByPath[ path ]; + + if ( index !== undefined ) { + + var paths = this._paths, + parsedPaths = this._parsedPaths, + bindings = this._bindings, + lastBindingsIndex = bindings.length - 1, + lastBindings = bindings[ lastBindingsIndex ], + lastBindingsPath = path[ lastBindingsIndex ]; + + indicesByPath[ lastBindingsPath ] = index; + + bindings[ index ] = lastBindings; + bindings.pop(); + + parsedPaths[ index ] = parsedPaths[ lastBindingsIndex ]; + parsedPaths.pop(); + + paths[ index ] = paths[ lastBindingsIndex ]; + paths.pop(); + + } + + } + + } ); + + /** + * + * Action provided by AnimationMixer for scheduling clip playback on specific + * objects. + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + * + */ + + function AnimationAction( mixer, clip, localRoot ) { + + this._mixer = mixer; + this._clip = clip; + this._localRoot = localRoot || null; + + var tracks = clip.tracks, + nTracks = tracks.length, + interpolants = new Array( nTracks ); + + var interpolantSettings = { + endingStart: ZeroCurvatureEnding, + endingEnd: ZeroCurvatureEnding + }; + + for ( var i = 0; i !== nTracks; ++ i ) { + + var interpolant = tracks[ i ].createInterpolant( null ); + interpolants[ i ] = interpolant; + interpolant.settings = interpolantSettings; + + } + + this._interpolantSettings = interpolantSettings; + + this._interpolants = interpolants; // bound by the mixer + + // inside: PropertyMixer (managed by the mixer) + this._propertyBindings = new Array( nTracks ); + + this._cacheIndex = null; // for the memory manager + this._byClipCacheIndex = null; // for the memory manager + + this._timeScaleInterpolant = null; + this._weightInterpolant = null; + + this.loop = LoopRepeat; + this._loopCount = -1; + + // global mixer time when the action is to be started + // it's set back to 'null' upon start of the action + this._startTime = null; + + // scaled local time of the action + // gets clamped or wrapped to 0..clip.duration according to loop + this.time = 0; + + this.timeScale = 1; + this._effectiveTimeScale = 1; + + this.weight = 1; + this._effectiveWeight = 1; + + this.repetitions = Infinity; // no. of repetitions when looping + + this.paused = false; // true -> zero effective time scale + this.enabled = true; // false -> zero effective weight + + this.clampWhenFinished = false; // keep feeding the last frame? + + this.zeroSlopeAtStart = true; // for smooth interpolation w/o separate + this.zeroSlopeAtEnd = true; // clips for start, loop and end + + } + + Object.assign( AnimationAction.prototype, { + + // State & Scheduling + + play: function() { + + this._mixer._activateAction( this ); + + return this; + + }, + + stop: function() { + + this._mixer._deactivateAction( this ); + + return this.reset(); + + }, + + reset: function() { + + this.paused = false; + this.enabled = true; + + this.time = 0; // restart clip + this._loopCount = -1; // forget previous loops + this._startTime = null; // forget scheduling + + return this.stopFading().stopWarping(); + + }, + + isRunning: function() { + + return this.enabled && ! this.paused && this.timeScale !== 0 && + this._startTime === null && this._mixer._isActiveAction( this ); + + }, + + // return true when play has been called + isScheduled: function() { + + return this._mixer._isActiveAction( this ); + + }, + + startAt: function( time ) { + + this._startTime = time; + + return this; + + }, + + setLoop: function( mode, repetitions ) { + + this.loop = mode; + this.repetitions = repetitions; + + return this; + + }, + + // Weight + + // set the weight stopping any scheduled fading + // although .enabled = false yields an effective weight of zero, this + // method does *not* change .enabled, because it would be confusing + setEffectiveWeight: function( weight ) { + + this.weight = weight; + + // note: same logic as when updated at runtime + this._effectiveWeight = this.enabled ? weight : 0; + + return this.stopFading(); + + }, + + // return the weight considering fading and .enabled + getEffectiveWeight: function() { + + return this._effectiveWeight; + + }, + + fadeIn: function( duration ) { + + return this._scheduleFading( duration, 0, 1 ); + + }, + + fadeOut: function( duration ) { + + return this._scheduleFading( duration, 1, 0 ); + + }, + + crossFadeFrom: function( fadeOutAction, duration, warp ) { + + fadeOutAction.fadeOut( duration ); + this.fadeIn( duration ); + + if( warp ) { + + var fadeInDuration = this._clip.duration, + fadeOutDuration = fadeOutAction._clip.duration, + + startEndRatio = fadeOutDuration / fadeInDuration, + endStartRatio = fadeInDuration / fadeOutDuration; + + fadeOutAction.warp( 1.0, startEndRatio, duration ); + this.warp( endStartRatio, 1.0, duration ); + + } + + return this; + + }, + + crossFadeTo: function( fadeInAction, duration, warp ) { + + return fadeInAction.crossFadeFrom( this, duration, warp ); + + }, + + stopFading: function() { + + var weightInterpolant = this._weightInterpolant; + + if ( weightInterpolant !== null ) { + + this._weightInterpolant = null; + this._mixer._takeBackControlInterpolant( weightInterpolant ); + + } + + return this; + + }, + + // Time Scale Control + + // set the time scale stopping any scheduled warping + // although .paused = true yields an effective time scale of zero, this + // method does *not* change .paused, because it would be confusing + setEffectiveTimeScale: function( timeScale ) { + + this.timeScale = timeScale; + this._effectiveTimeScale = this.paused ? 0 :timeScale; + + return this.stopWarping(); + + }, + + // return the time scale considering warping and .paused + getEffectiveTimeScale: function() { + + return this._effectiveTimeScale; + + }, + + setDuration: function( duration ) { + + this.timeScale = this._clip.duration / duration; + + return this.stopWarping(); + + }, + + syncWith: function( action ) { + + this.time = action.time; + this.timeScale = action.timeScale; + + return this.stopWarping(); + + }, + + halt: function( duration ) { + + return this.warp( this._effectiveTimeScale, 0, duration ); + + }, + + warp: function( startTimeScale, endTimeScale, duration ) { + + var mixer = this._mixer, now = mixer.time, + interpolant = this._timeScaleInterpolant, + + timeScale = this.timeScale; + + if ( interpolant === null ) { + + interpolant = mixer._lendControlInterpolant(); + this._timeScaleInterpolant = interpolant; + + } + + var times = interpolant.parameterPositions, + values = interpolant.sampleValues; + + times[ 0 ] = now; + times[ 1 ] = now + duration; + + values[ 0 ] = startTimeScale / timeScale; + values[ 1 ] = endTimeScale / timeScale; + + return this; + + }, + + stopWarping: function() { + + var timeScaleInterpolant = this._timeScaleInterpolant; + + if ( timeScaleInterpolant !== null ) { + + this._timeScaleInterpolant = null; + this._mixer._takeBackControlInterpolant( timeScaleInterpolant ); + + } + + return this; + + }, + + // Object Accessors + + getMixer: function() { + + return this._mixer; + + }, + + getClip: function() { + + return this._clip; + + }, + + getRoot: function() { + + return this._localRoot || this._mixer._root; + + }, + + // Interna + + _update: function( time, deltaTime, timeDirection, accuIndex ) { + + // called by the mixer + + if ( ! this.enabled ) { + + // call ._updateWeight() to update ._effectiveWeight + + this._updateWeight( time ); + return; + + } + + var startTime = this._startTime; + + if ( startTime !== null ) { + + // check for scheduled start of action + + var timeRunning = ( time - startTime ) * timeDirection; + if ( timeRunning < 0 || timeDirection === 0 ) { + + return; // yet to come / don't decide when delta = 0 + + } + + // start + + this._startTime = null; // unschedule + deltaTime = timeDirection * timeRunning; + + } + + // apply time scale and advance time + + deltaTime *= this._updateTimeScale( time ); + var clipTime = this._updateTime( deltaTime ); + + // note: _updateTime may disable the action resulting in + // an effective weight of 0 + + var weight = this._updateWeight( time ); + + if ( weight > 0 ) { + + var interpolants = this._interpolants; + var propertyMixers = this._propertyBindings; + + for ( var j = 0, m = interpolants.length; j !== m; ++ j ) { + + interpolants[ j ].evaluate( clipTime ); + propertyMixers[ j ].accumulate( accuIndex, weight ); + + } + + } + + }, + + _updateWeight: function( time ) { + + var weight = 0; + + if ( this.enabled ) { + + weight = this.weight; + var interpolant = this._weightInterpolant; + + if ( interpolant !== null ) { + + var interpolantValue = interpolant.evaluate( time )[ 0 ]; + + weight *= interpolantValue; + + if ( time > interpolant.parameterPositions[ 1 ] ) { + + this.stopFading(); + + if ( interpolantValue === 0 ) { + + // faded out, disable + this.enabled = false; + + } + + } + + } + + } + + this._effectiveWeight = weight; + return weight; + + }, + + _updateTimeScale: function( time ) { + + var timeScale = 0; + + if ( ! this.paused ) { + + timeScale = this.timeScale; + + var interpolant = this._timeScaleInterpolant; + + if ( interpolant !== null ) { + + var interpolantValue = interpolant.evaluate( time )[ 0 ]; + + timeScale *= interpolantValue; + + if ( time > interpolant.parameterPositions[ 1 ] ) { + + this.stopWarping(); + + if ( timeScale === 0 ) { + + // motion has halted, pause + this.paused = true; + + } else { + + // warp done - apply final time scale + this.timeScale = timeScale; + + } + + } + + } + + } + + this._effectiveTimeScale = timeScale; + return timeScale; + + }, + + _updateTime: function( deltaTime ) { + + var time = this.time + deltaTime; + + if ( deltaTime === 0 ) return time; + + var duration = this._clip.duration, + + loop = this.loop, + loopCount = this._loopCount; + + if ( loop === LoopOnce ) { + + if ( loopCount === -1 ) { + // just started + + this._loopCount = 0; + this._setEndings( true, true, false ); + + } + + handle_stop: { + + if ( time >= duration ) { + + time = duration; + + } else if ( time < 0 ) { + + time = 0; + + } else break handle_stop; + + if ( this.clampWhenFinished ) this.paused = true; + else this.enabled = false; + + this._mixer.dispatchEvent( { + type: 'finished', action: this, + direction: deltaTime < 0 ? -1 : 1 + } ); + + } + + } else { // repetitive Repeat or PingPong + + var pingPong = ( loop === LoopPingPong ); + + if ( loopCount === -1 ) { + // just started + + if ( deltaTime >= 0 ) { + + loopCount = 0; + + this._setEndings( + true, this.repetitions === 0, pingPong ); + + } else { + + // when looping in reverse direction, the initial + // transition through zero counts as a repetition, + // so leave loopCount at -1 + + this._setEndings( + this.repetitions === 0, true, pingPong ); + + } + + } + + if ( time >= duration || time < 0 ) { + // wrap around + + var loopDelta = Math.floor( time / duration ); // signed + time -= duration * loopDelta; + + loopCount += Math.abs( loopDelta ); + + var pending = this.repetitions - loopCount; + + if ( pending < 0 ) { + // have to stop (switch state, clamp time, fire event) + + if ( this.clampWhenFinished ) this.paused = true; + else this.enabled = false; + + time = deltaTime > 0 ? duration : 0; + + this._mixer.dispatchEvent( { + type: 'finished', action: this, + direction: deltaTime > 0 ? 1 : -1 + } ); + + } else { + // keep running + + if ( pending === 0 ) { + // entering the last round + + var atStart = deltaTime < 0; + this._setEndings( atStart, ! atStart, pingPong ); + + } else { + + this._setEndings( false, false, pingPong ); + + } + + this._loopCount = loopCount; + + this._mixer.dispatchEvent( { + type: 'loop', action: this, loopDelta: loopDelta + } ); + + } + + } + + if ( pingPong && ( loopCount & 1 ) === 1 ) { + // invert time for the "pong round" + + this.time = time; + return duration - time; + + } + + } + + this.time = time; + return time; + + }, + + _setEndings: function( atStart, atEnd, pingPong ) { + + var settings = this._interpolantSettings; + + if ( pingPong ) { + + settings.endingStart = ZeroSlopeEnding; + settings.endingEnd = ZeroSlopeEnding; + + } else { + + // assuming for LoopOnce atStart == atEnd == true + + if ( atStart ) { + + settings.endingStart = this.zeroSlopeAtStart ? + ZeroSlopeEnding : ZeroCurvatureEnding; + + } else { + + settings.endingStart = WrapAroundEnding; + + } + + if ( atEnd ) { + + settings.endingEnd = this.zeroSlopeAtEnd ? + ZeroSlopeEnding : ZeroCurvatureEnding; + + } else { + + settings.endingEnd = WrapAroundEnding; + + } + + } + + }, + + _scheduleFading: function( duration, weightNow, weightThen ) { + + var mixer = this._mixer, now = mixer.time, + interpolant = this._weightInterpolant; + + if ( interpolant === null ) { + + interpolant = mixer._lendControlInterpolant(); + this._weightInterpolant = interpolant; + + } + + var times = interpolant.parameterPositions, + values = interpolant.sampleValues; + + times[ 0 ] = now; values[ 0 ] = weightNow; + times[ 1 ] = now + duration; values[ 1 ] = weightThen; + + return this; + + } + + } ); + + /** + * + * Player for AnimationClips. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function AnimationMixer( root ) { + + this._root = root; + this._initMemoryManager(); + this._accuIndex = 0; + + this.time = 0; + + this.timeScale = 1.0; + + } + + Object.assign( AnimationMixer.prototype, EventDispatcher.prototype, { + + _bindAction: function ( action, prototypeAction ) { + + var root = action._localRoot || this._root, + tracks = action._clip.tracks, + nTracks = tracks.length, + bindings = action._propertyBindings, + interpolants = action._interpolants, + rootUuid = root.uuid, + bindingsByRoot = this._bindingsByRootAndName, + bindingsByName = bindingsByRoot[ rootUuid ]; + + if ( bindingsByName === undefined ) { + + bindingsByName = {}; + bindingsByRoot[ rootUuid ] = bindingsByName; + + } + + for ( var i = 0; i !== nTracks; ++ i ) { + + var track = tracks[ i ], + trackName = track.name, + binding = bindingsByName[ trackName ]; + + if ( binding !== undefined ) { + + bindings[ i ] = binding; + + } else { + + binding = bindings[ i ]; + + if ( binding !== undefined ) { + + // existing binding, make sure the cache knows + + if ( binding._cacheIndex === null ) { + + ++ binding.referenceCount; + this._addInactiveBinding( binding, rootUuid, trackName ); + + } + + continue; + + } + + var path = prototypeAction && prototypeAction. + _propertyBindings[ i ].binding.parsedPath; + + binding = new PropertyMixer( + PropertyBinding.create( root, trackName, path ), + track.ValueTypeName, track.getValueSize() ); + + ++ binding.referenceCount; + this._addInactiveBinding( binding, rootUuid, trackName ); + + bindings[ i ] = binding; + + } + + interpolants[ i ].resultBuffer = binding.buffer; + + } + + }, + + _activateAction: function ( action ) { + + if ( ! this._isActiveAction( action ) ) { + + if ( action._cacheIndex === null ) { + + // this action has been forgotten by the cache, but the user + // appears to be still using it -> rebind + + var rootUuid = ( action._localRoot || this._root ).uuid, + clipUuid = action._clip.uuid, + actionsForClip = this._actionsByClip[ clipUuid ]; + + this._bindAction( action, + actionsForClip && actionsForClip.knownActions[ 0 ] ); + + this._addInactiveAction( action, clipUuid, rootUuid ); + + } + + var bindings = action._propertyBindings; + + // increment reference counts / sort out state + for ( var i = 0, n = bindings.length; i !== n; ++ i ) { + + var binding = bindings[ i ]; + + if ( binding.useCount ++ === 0 ) { + + this._lendBinding( binding ); + binding.saveOriginalState(); + + } + + } + + this._lendAction( action ); + + } + + }, + + _deactivateAction: function ( action ) { + + if ( this._isActiveAction( action ) ) { + + var bindings = action._propertyBindings; + + // decrement reference counts / sort out state + for ( var i = 0, n = bindings.length; i !== n; ++ i ) { + + var binding = bindings[ i ]; + + if ( -- binding.useCount === 0 ) { + + binding.restoreOriginalState(); + this._takeBackBinding( binding ); + + } + + } + + this._takeBackAction( action ); + + } + + }, + + // Memory manager + + _initMemoryManager: function () { + + this._actions = []; // 'nActiveActions' followed by inactive ones + this._nActiveActions = 0; + + this._actionsByClip = {}; + // inside: + // { + // knownActions: Array< AnimationAction > - used as prototypes + // actionByRoot: AnimationAction - lookup + // } + + + this._bindings = []; // 'nActiveBindings' followed by inactive ones + this._nActiveBindings = 0; + + this._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer > + + + this._controlInterpolants = []; // same game as above + this._nActiveControlInterpolants = 0; + + var scope = this; + + this.stats = { + + actions: { + get total() { return scope._actions.length; }, + get inUse() { return scope._nActiveActions; } + }, + bindings: { + get total() { return scope._bindings.length; }, + get inUse() { return scope._nActiveBindings; } + }, + controlInterpolants: { + get total() { return scope._controlInterpolants.length; }, + get inUse() { return scope._nActiveControlInterpolants; } + } + + }; + + }, + + // Memory management for AnimationAction objects + + _isActiveAction: function ( action ) { + + var index = action._cacheIndex; + return index !== null && index < this._nActiveActions; + + }, + + _addInactiveAction: function ( action, clipUuid, rootUuid ) { + + var actions = this._actions, + actionsByClip = this._actionsByClip, + actionsForClip = actionsByClip[ clipUuid ]; + + if ( actionsForClip === undefined ) { + + actionsForClip = { + + knownActions: [ action ], + actionByRoot: {} + + }; + + action._byClipCacheIndex = 0; + + actionsByClip[ clipUuid ] = actionsForClip; + + } else { + + var knownActions = actionsForClip.knownActions; + + action._byClipCacheIndex = knownActions.length; + knownActions.push( action ); + + } + + action._cacheIndex = actions.length; + actions.push( action ); + + actionsForClip.actionByRoot[ rootUuid ] = action; + + }, + + _removeInactiveAction: function ( action ) { + + var actions = this._actions, + lastInactiveAction = actions[ actions.length - 1 ], + cacheIndex = action._cacheIndex; + + lastInactiveAction._cacheIndex = cacheIndex; + actions[ cacheIndex ] = lastInactiveAction; + actions.pop(); + + action._cacheIndex = null; + + + var clipUuid = action._clip.uuid, + actionsByClip = this._actionsByClip, + actionsForClip = actionsByClip[ clipUuid ], + knownActionsForClip = actionsForClip.knownActions, + + lastKnownAction = + knownActionsForClip[ knownActionsForClip.length - 1 ], + + byClipCacheIndex = action._byClipCacheIndex; + + lastKnownAction._byClipCacheIndex = byClipCacheIndex; + knownActionsForClip[ byClipCacheIndex ] = lastKnownAction; + knownActionsForClip.pop(); + + action._byClipCacheIndex = null; + + + var actionByRoot = actionsForClip.actionByRoot, + rootUuid = ( action._localRoot || this._root ).uuid; + + delete actionByRoot[ rootUuid ]; + + if ( knownActionsForClip.length === 0 ) { + + delete actionsByClip[ clipUuid ]; + + } + + this._removeInactiveBindingsForAction( action ); + + }, + + _removeInactiveBindingsForAction: function ( action ) { + + var bindings = action._propertyBindings; + for ( var i = 0, n = bindings.length; i !== n; ++ i ) { + + var binding = bindings[ i ]; + + if ( -- binding.referenceCount === 0 ) { + + this._removeInactiveBinding( binding ); + + } + + } + + }, + + _lendAction: function ( action ) { + + // [ active actions | inactive actions ] + // [ active actions >| inactive actions ] + // s a + // <-swap-> + // a s + + var actions = this._actions, + prevIndex = action._cacheIndex, + + lastActiveIndex = this._nActiveActions ++, + + firstInactiveAction = actions[ lastActiveIndex ]; + + action._cacheIndex = lastActiveIndex; + actions[ lastActiveIndex ] = action; + + firstInactiveAction._cacheIndex = prevIndex; + actions[ prevIndex ] = firstInactiveAction; + + }, + + _takeBackAction: function ( action ) { + + // [ active actions | inactive actions ] + // [ active actions |< inactive actions ] + // a s + // <-swap-> + // s a + + var actions = this._actions, + prevIndex = action._cacheIndex, + + firstInactiveIndex = -- this._nActiveActions, + + lastActiveAction = actions[ firstInactiveIndex ]; + + action._cacheIndex = firstInactiveIndex; + actions[ firstInactiveIndex ] = action; + + lastActiveAction._cacheIndex = prevIndex; + actions[ prevIndex ] = lastActiveAction; + + }, + + // Memory management for PropertyMixer objects + + _addInactiveBinding: function ( binding, rootUuid, trackName ) { + + var bindingsByRoot = this._bindingsByRootAndName, + bindingByName = bindingsByRoot[ rootUuid ], + + bindings = this._bindings; + + if ( bindingByName === undefined ) { + + bindingByName = {}; + bindingsByRoot[ rootUuid ] = bindingByName; + + } + + bindingByName[ trackName ] = binding; + + binding._cacheIndex = bindings.length; + bindings.push( binding ); + + }, + + _removeInactiveBinding: function ( binding ) { + + var bindings = this._bindings, + propBinding = binding.binding, + rootUuid = propBinding.rootNode.uuid, + trackName = propBinding.path, + bindingsByRoot = this._bindingsByRootAndName, + bindingByName = bindingsByRoot[ rootUuid ], + + lastInactiveBinding = bindings[ bindings.length - 1 ], + cacheIndex = binding._cacheIndex; + + lastInactiveBinding._cacheIndex = cacheIndex; + bindings[ cacheIndex ] = lastInactiveBinding; + bindings.pop(); + + delete bindingByName[ trackName ]; + + remove_empty_map: { + + for ( var _ in bindingByName ) break remove_empty_map; + + delete bindingsByRoot[ rootUuid ]; + + } + + }, + + _lendBinding: function ( binding ) { + + var bindings = this._bindings, + prevIndex = binding._cacheIndex, + + lastActiveIndex = this._nActiveBindings ++, + + firstInactiveBinding = bindings[ lastActiveIndex ]; + + binding._cacheIndex = lastActiveIndex; + bindings[ lastActiveIndex ] = binding; + + firstInactiveBinding._cacheIndex = prevIndex; + bindings[ prevIndex ] = firstInactiveBinding; + + }, + + _takeBackBinding: function ( binding ) { + + var bindings = this._bindings, + prevIndex = binding._cacheIndex, + + firstInactiveIndex = -- this._nActiveBindings, + + lastActiveBinding = bindings[ firstInactiveIndex ]; + + binding._cacheIndex = firstInactiveIndex; + bindings[ firstInactiveIndex ] = binding; + + lastActiveBinding._cacheIndex = prevIndex; + bindings[ prevIndex ] = lastActiveBinding; + + }, + + + // Memory management of Interpolants for weight and time scale + + _lendControlInterpolant: function () { + + var interpolants = this._controlInterpolants, + lastActiveIndex = this._nActiveControlInterpolants ++, + interpolant = interpolants[ lastActiveIndex ]; + + if ( interpolant === undefined ) { + + interpolant = new LinearInterpolant( + new Float32Array( 2 ), new Float32Array( 2 ), + 1, this._controlInterpolantsResultBuffer ); + + interpolant.__cacheIndex = lastActiveIndex; + interpolants[ lastActiveIndex ] = interpolant; + + } + + return interpolant; + + }, + + _takeBackControlInterpolant: function ( interpolant ) { + + var interpolants = this._controlInterpolants, + prevIndex = interpolant.__cacheIndex, + + firstInactiveIndex = -- this._nActiveControlInterpolants, + + lastActiveInterpolant = interpolants[ firstInactiveIndex ]; + + interpolant.__cacheIndex = firstInactiveIndex; + interpolants[ firstInactiveIndex ] = interpolant; + + lastActiveInterpolant.__cacheIndex = prevIndex; + interpolants[ prevIndex ] = lastActiveInterpolant; + + }, + + _controlInterpolantsResultBuffer: new Float32Array( 1 ), + + // return an action for a clip optionally using a custom root target + // object (this method allocates a lot of dynamic memory in case a + // previously unknown clip/root combination is specified) + clipAction: function ( clip, optionalRoot ) { + + var root = optionalRoot || this._root, + rootUuid = root.uuid, + + clipObject = typeof clip === 'string' ? + AnimationClip.findByName( root, clip ) : clip, + + clipUuid = clipObject !== null ? clipObject.uuid : clip, + + actionsForClip = this._actionsByClip[ clipUuid ], + prototypeAction = null; + + if ( actionsForClip !== undefined ) { + + var existingAction = + actionsForClip.actionByRoot[ rootUuid ]; + + if ( existingAction !== undefined ) { + + return existingAction; + + } + + // we know the clip, so we don't have to parse all + // the bindings again but can just copy + prototypeAction = actionsForClip.knownActions[ 0 ]; + + // also, take the clip from the prototype action + if ( clipObject === null ) + clipObject = prototypeAction._clip; + + } + + // clip must be known when specified via string + if ( clipObject === null ) return null; + + // allocate all resources required to run it + var newAction = new AnimationAction( this, clipObject, optionalRoot ); + + this._bindAction( newAction, prototypeAction ); + + // and make the action known to the memory manager + this._addInactiveAction( newAction, clipUuid, rootUuid ); + + return newAction; + + }, + + // get an existing action + existingAction: function ( clip, optionalRoot ) { + + var root = optionalRoot || this._root, + rootUuid = root.uuid, + + clipObject = typeof clip === 'string' ? + AnimationClip.findByName( root, clip ) : clip, + + clipUuid = clipObject ? clipObject.uuid : clip, + + actionsForClip = this._actionsByClip[ clipUuid ]; + + if ( actionsForClip !== undefined ) { + + return actionsForClip.actionByRoot[ rootUuid ] || null; + + } + + return null; + + }, + + // deactivates all previously scheduled actions + stopAllAction: function () { + + var actions = this._actions, + nActions = this._nActiveActions, + bindings = this._bindings, + nBindings = this._nActiveBindings; + + this._nActiveActions = 0; + this._nActiveBindings = 0; + + for ( var i = 0; i !== nActions; ++ i ) { + + actions[ i ].reset(); + + } + + for ( var i = 0; i !== nBindings; ++ i ) { + + bindings[ i ].useCount = 0; + + } + + return this; + + }, + + // advance the time and update apply the animation + update: function ( deltaTime ) { + + deltaTime *= this.timeScale; + + var actions = this._actions, + nActions = this._nActiveActions, + + time = this.time += deltaTime, + timeDirection = Math.sign( deltaTime ), + + accuIndex = this._accuIndex ^= 1; + + // run active actions + + for ( var i = 0; i !== nActions; ++ i ) { + + var action = actions[ i ]; + + action._update( time, deltaTime, timeDirection, accuIndex ); + + } + + // update scene graph + + var bindings = this._bindings, + nBindings = this._nActiveBindings; + + for ( var i = 0; i !== nBindings; ++ i ) { + + bindings[ i ].apply( accuIndex ); + + } + + return this; + + }, + + // return this mixer's root target object + getRoot: function () { + + return this._root; + + }, + + // free all resources specific to a particular clip + uncacheClip: function ( clip ) { + + var actions = this._actions, + clipUuid = clip.uuid, + actionsByClip = this._actionsByClip, + actionsForClip = actionsByClip[ clipUuid ]; + + if ( actionsForClip !== undefined ) { + + // note: just calling _removeInactiveAction would mess up the + // iteration state and also require updating the state we can + // just throw away + + var actionsToRemove = actionsForClip.knownActions; + + for ( var i = 0, n = actionsToRemove.length; i !== n; ++ i ) { + + var action = actionsToRemove[ i ]; + + this._deactivateAction( action ); + + var cacheIndex = action._cacheIndex, + lastInactiveAction = actions[ actions.length - 1 ]; + + action._cacheIndex = null; + action._byClipCacheIndex = null; + + lastInactiveAction._cacheIndex = cacheIndex; + actions[ cacheIndex ] = lastInactiveAction; + actions.pop(); + + this._removeInactiveBindingsForAction( action ); + + } + + delete actionsByClip[ clipUuid ]; + + } + + }, + + // free all resources specific to a particular root target object + uncacheRoot: function ( root ) { + + var rootUuid = root.uuid, + actionsByClip = this._actionsByClip; + + for ( var clipUuid in actionsByClip ) { + + var actionByRoot = actionsByClip[ clipUuid ].actionByRoot, + action = actionByRoot[ rootUuid ]; + + if ( action !== undefined ) { + + this._deactivateAction( action ); + this._removeInactiveAction( action ); + + } + + } + + var bindingsByRoot = this._bindingsByRootAndName, + bindingByName = bindingsByRoot[ rootUuid ]; + + if ( bindingByName !== undefined ) { + + for ( var trackName in bindingByName ) { + + var binding = bindingByName[ trackName ]; + binding.restoreOriginalState(); + this._removeInactiveBinding( binding ); + + } + + } + + }, + + // remove a targeted clip from the cache + uncacheAction: function ( clip, optionalRoot ) { + + var action = this.existingAction( clip, optionalRoot ); + + if ( action !== null ) { + + this._deactivateAction( action ); + this._removeInactiveAction( action ); + + } + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Uniform( value ) { + + if ( typeof value === 'string' ) { + + console.warn( 'THREE.Uniform: Type parameter is no longer needed.' ); + value = arguments[ 1 ]; + + } + + this.value = value; + + } + + Uniform.prototype.clone = function () { + + return new Uniform( this.value.clone === undefined ? this.value : this.value.clone() ); + + }; + + /** + * @author benaadams / https://twitter.com/ben_a_adams + */ + + function InstancedBufferGeometry() { + + BufferGeometry.call( this ); + + this.type = 'InstancedBufferGeometry'; + this.maxInstancedCount = undefined; + + } + + InstancedBufferGeometry.prototype = Object.assign( Object.create( BufferGeometry.prototype ), { + + constructor: InstancedBufferGeometry, + + isInstancedBufferGeometry: true, + + addGroup: function ( start, count, materialIndex ) { + + this.groups.push( { + + start: start, + count: count, + materialIndex: materialIndex + + } ); + + }, + + copy: function ( source ) { + + var index = source.index; + + if ( index !== null ) { + + this.setIndex( index.clone() ); + + } + + var attributes = source.attributes; + + for ( var name in attributes ) { + + var attribute = attributes[ name ]; + this.addAttribute( name, attribute.clone() ); + + } + + var groups = source.groups; + + for ( var i = 0, l = groups.length; i < l; i ++ ) { + + var group = groups[ i ]; + this.addGroup( group.start, group.count, group.materialIndex ); + + } + + return this; + + } + + } ); + + /** + * @author benaadams / https://twitter.com/ben_a_adams + */ + + function InterleavedBufferAttribute( interleavedBuffer, itemSize, offset, normalized ) { + + this.uuid = _Math.generateUUID(); + + this.data = interleavedBuffer; + this.itemSize = itemSize; + this.offset = offset; + + this.normalized = normalized === true; + + } + + Object.defineProperties( InterleavedBufferAttribute.prototype, { + + count: { + + get: function () { + + return this.data.count; + + } + + }, + + array: { + + get: function () { + + return this.data.array; + + } + + } + + } ); + + Object.assign( InterleavedBufferAttribute.prototype, { + + isInterleavedBufferAttribute: true, + + setX: function ( index, x ) { + + this.data.array[ index * this.data.stride + this.offset ] = x; + + return this; + + }, + + setY: function ( index, y ) { + + this.data.array[ index * this.data.stride + this.offset + 1 ] = y; + + return this; + + }, + + setZ: function ( index, z ) { + + this.data.array[ index * this.data.stride + this.offset + 2 ] = z; + + return this; + + }, + + setW: function ( index, w ) { + + this.data.array[ index * this.data.stride + this.offset + 3 ] = w; + + return this; + + }, + + getX: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset ]; + + }, + + getY: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset + 1 ]; + + }, + + getZ: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset + 2 ]; + + }, + + getW: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset + 3 ]; + + }, + + setXY: function ( index, x, y ) { + + index = index * this.data.stride + this.offset; + + this.data.array[ index + 0 ] = x; + this.data.array[ index + 1 ] = y; + + return this; + + }, + + setXYZ: function ( index, x, y, z ) { + + index = index * this.data.stride + this.offset; + + this.data.array[ index + 0 ] = x; + this.data.array[ index + 1 ] = y; + this.data.array[ index + 2 ] = z; + + return this; + + }, + + setXYZW: function ( index, x, y, z, w ) { + + index = index * this.data.stride + this.offset; + + this.data.array[ index + 0 ] = x; + this.data.array[ index + 1 ] = y; + this.data.array[ index + 2 ] = z; + this.data.array[ index + 3 ] = w; + + return this; + + } + + } ); + + /** + * @author benaadams / https://twitter.com/ben_a_adams + */ + + function InterleavedBuffer( array, stride ) { + + this.uuid = _Math.generateUUID(); + + this.array = array; + this.stride = stride; + this.count = array !== undefined ? array.length / stride : 0; + + this.dynamic = false; + this.updateRange = { offset: 0, count: - 1 }; + + this.onUploadCallback = function () {}; + + this.version = 0; + + } + + Object.defineProperty( InterleavedBuffer.prototype, 'needsUpdate', { + + set: function ( value ) { + + if ( value === true ) this.version ++; + + } + + } ); + + Object.assign( InterleavedBuffer.prototype, { + + isInterleavedBuffer: true, + + setArray: function ( array ) { + + if ( Array.isArray( array ) ) { + + throw new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' ); + + } + + this.count = array !== undefined ? array.length / this.stride : 0; + this.array = array; + + }, + + setDynamic: function ( value ) { + + this.dynamic = value; + + return this; + + }, + + copy: function ( source ) { + + this.array = new source.array.constructor( source.array ); + this.count = source.count; + this.stride = source.stride; + this.dynamic = source.dynamic; + + return this; + + }, + + copyAt: function ( index1, attribute, index2 ) { + + index1 *= this.stride; + index2 *= attribute.stride; + + for ( var i = 0, l = this.stride; i < l; i ++ ) { + + this.array[ index1 + i ] = attribute.array[ index2 + i ]; + + } + + return this; + + }, + + set: function ( value, offset ) { + + if ( offset === undefined ) offset = 0; + + this.array.set( value, offset ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + onUpload: function ( callback ) { + + this.onUploadCallback = callback; + + return this; + + } + + } ); + + /** + * @author benaadams / https://twitter.com/ben_a_adams + */ + + function InstancedInterleavedBuffer( array, stride, meshPerAttribute ) { + + InterleavedBuffer.call( this, array, stride ); + + this.meshPerAttribute = meshPerAttribute || 1; + + } + + InstancedInterleavedBuffer.prototype = Object.assign( Object.create( InterleavedBuffer.prototype ), { + + constructor: InstancedInterleavedBuffer, + + isInstancedInterleavedBuffer: true, + + copy: function ( source ) { + + InterleavedBuffer.prototype.copy.call( this, source ); + + this.meshPerAttribute = source.meshPerAttribute; + + return this; + + } + + } ); + + /** + * @author benaadams / https://twitter.com/ben_a_adams + */ + + function InstancedBufferAttribute( array, itemSize, meshPerAttribute ) { + + BufferAttribute.call( this, array, itemSize ); + + this.meshPerAttribute = meshPerAttribute || 1; + + } + + InstancedBufferAttribute.prototype = Object.assign( Object.create( BufferAttribute.prototype ), { + + constructor: InstancedBufferAttribute, + + isInstancedBufferAttribute: true, + + copy: function ( source ) { + + BufferAttribute.prototype.copy.call( this, source ); + + this.meshPerAttribute = source.meshPerAttribute; + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author bhouston / http://clara.io/ + * @author stephomi / http://stephaneginier.com/ + */ + + function Raycaster( origin, direction, near, far ) { + + this.ray = new Ray( origin, direction ); + // direction is assumed to be normalized (for accurate distance calculations) + + this.near = near || 0; + this.far = far || Infinity; + + this.params = { + Mesh: {}, + Line: {}, + LOD: {}, + Points: { threshold: 1 }, + Sprite: {} + }; + + Object.defineProperties( this.params, { + PointCloud: { + get: function () { + console.warn( 'THREE.Raycaster: params.PointCloud has been renamed to params.Points.' ); + return this.Points; + } + } + } ); + + } + + function ascSort( a, b ) { + + return a.distance - b.distance; + + } + + function intersectObject( object, raycaster, intersects, recursive ) { + + if ( object.visible === false ) return; + + object.raycast( raycaster, intersects ); + + if ( recursive === true ) { + + var children = object.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + intersectObject( children[ i ], raycaster, intersects, true ); + + } + + } + + } + + Object.assign( Raycaster.prototype, { + + linePrecision: 1, + + set: function ( origin, direction ) { + + // direction is assumed to be normalized (for accurate distance calculations) + + this.ray.set( origin, direction ); + + }, + + setFromCamera: function ( coords, camera ) { + + if ( ( camera && camera.isPerspectiveCamera ) ) { + + this.ray.origin.setFromMatrixPosition( camera.matrixWorld ); + this.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize(); + + } else if ( ( camera && camera.isOrthographicCamera ) ) { + + this.ray.origin.set( coords.x, coords.y, ( camera.near + camera.far ) / ( camera.near - camera.far ) ).unproject( camera ); // set origin in plane of camera + this.ray.direction.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld ); + + } else { + + console.error( 'THREE.Raycaster: Unsupported camera type.' ); + + } + + }, + + intersectObject: function ( object, recursive ) { + + var intersects = []; + + intersectObject( object, this, intersects, recursive ); + + intersects.sort( ascSort ); + + return intersects; + + }, + + intersectObjects: function ( objects, recursive ) { + + var intersects = []; + + if ( Array.isArray( objects ) === false ) { + + console.warn( 'THREE.Raycaster.intersectObjects: objects is not an Array.' ); + return intersects; + + } + + for ( var i = 0, l = objects.length; i < l; i ++ ) { + + intersectObject( objects[ i ], this, intersects, recursive ); + + } + + intersects.sort( ascSort ); + + return intersects; + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function Clock( autoStart ) { + + this.autoStart = ( autoStart !== undefined ) ? autoStart : true; + + this.startTime = 0; + this.oldTime = 0; + this.elapsedTime = 0; + + this.running = false; + + } + + Object.assign( Clock.prototype, { + + start: function () { + + this.startTime = ( typeof performance === 'undefined' ? Date : performance ).now(); // see #10732 + + this.oldTime = this.startTime; + this.elapsedTime = 0; + this.running = true; + + }, + + stop: function () { + + this.getElapsedTime(); + this.running = false; + this.autoStart = false; + + }, + + getElapsedTime: function () { + + this.getDelta(); + return this.elapsedTime; + + }, + + getDelta: function () { + + var diff = 0; + + if ( this.autoStart && ! this.running ) { + + this.start(); + return 0; + + } + + if ( this.running ) { + + var newTime = ( typeof performance === 'undefined' ? Date : performance ).now(); + + diff = ( newTime - this.oldTime ) / 1000; + this.oldTime = newTime; + + this.elapsedTime += diff; + + } + + return diff; + + } + + } ); + + /** + * @author bhouston / http://clara.io + * @author WestLangley / http://github.com/WestLangley + * + * Ref: https://en.wikipedia.org/wiki/Spherical_coordinate_system + * + * The poles (phi) are at the positive and negative y axis. + * The equator starts at positive z. + */ + + function Spherical( radius, phi, theta ) { + + this.radius = ( radius !== undefined ) ? radius : 1.0; + this.phi = ( phi !== undefined ) ? phi : 0; // up / down towards top and bottom pole + this.theta = ( theta !== undefined ) ? theta : 0; // around the equator of the sphere + + return this; + + } + + Object.assign( Spherical.prototype, { + + set: function ( radius, phi, theta ) { + + this.radius = radius; + this.phi = phi; + this.theta = theta; + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( other ) { + + this.radius = other.radius; + this.phi = other.phi; + this.theta = other.theta; + + return this; + + }, + + // restrict phi to be betwee EPS and PI-EPS + makeSafe: function() { + + var EPS = 0.000001; + this.phi = Math.max( EPS, Math.min( Math.PI - EPS, this.phi ) ); + + return this; + + }, + + setFromVector3: function( vec3 ) { + + this.radius = vec3.length(); + + if ( this.radius === 0 ) { + + this.theta = 0; + this.phi = 0; + + } else { + + this.theta = Math.atan2( vec3.x, vec3.z ); // equator angle around y-up axis + this.phi = Math.acos( _Math.clamp( vec3.y / this.radius, - 1, 1 ) ); // polar angle + + } + + return this; + + } + + } ); + + /** + * @author Mugen87 / https://github.com/Mugen87 + * + * Ref: https://en.wikipedia.org/wiki/Cylindrical_coordinate_system + * + */ + + function Cylindrical( radius, theta, y ) { + + this.radius = ( radius !== undefined ) ? radius : 1.0; // distance from the origin to a point in the x-z plane + this.theta = ( theta !== undefined ) ? theta : 0; // counterclockwise angle in the x-z plane measured in radians from the positive z-axis + this.y = ( y !== undefined ) ? y : 0; // height above the x-z plane + + return this; + + } + + Object.assign( Cylindrical.prototype, { + + set: function ( radius, theta, y ) { + + this.radius = radius; + this.theta = theta; + this.y = y; + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( other ) { + + this.radius = other.radius; + this.theta = other.theta; + this.y = other.y; + + return this; + + }, + + setFromVector3: function( vec3 ) { + + this.radius = Math.sqrt( vec3.x * vec3.x + vec3.z * vec3.z ); + this.theta = Math.atan2( vec3.x, vec3.z ); + this.y = vec3.y; + + return this; + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function MorphBlendMesh( geometry, material ) { + + Mesh.call( this, geometry, material ); + + this.animationsMap = {}; + this.animationsList = []; + + // prepare default animation + // (all frames played together in 1 second) + + var numFrames = this.geometry.morphTargets.length; + + var name = "__default"; + + var startFrame = 0; + var endFrame = numFrames - 1; + + var fps = numFrames / 1; + + this.createAnimation( name, startFrame, endFrame, fps ); + this.setAnimationWeight( name, 1 ); + + } + + MorphBlendMesh.prototype = Object.create( Mesh.prototype ); + MorphBlendMesh.prototype.constructor = MorphBlendMesh; + + MorphBlendMesh.prototype.createAnimation = function ( name, start, end, fps ) { + + var animation = { + + start: start, + end: end, + + length: end - start + 1, + + fps: fps, + duration: ( end - start ) / fps, + + lastFrame: 0, + currentFrame: 0, + + active: false, + + time: 0, + direction: 1, + weight: 1, + + directionBackwards: false, + mirroredLoop: false + + }; + + this.animationsMap[ name ] = animation; + this.animationsList.push( animation ); + + }; + + MorphBlendMesh.prototype.autoCreateAnimations = function ( fps ) { + + var pattern = /([a-z]+)_?(\d+)/i; + + var firstAnimation, frameRanges = {}; + + var geometry = this.geometry; + + for ( var i = 0, il = geometry.morphTargets.length; i < il; i ++ ) { + + var morph = geometry.morphTargets[ i ]; + var chunks = morph.name.match( pattern ); + + if ( chunks && chunks.length > 1 ) { + + var name = chunks[ 1 ]; + + if ( ! frameRanges[ name ] ) frameRanges[ name ] = { start: Infinity, end: - Infinity }; + + var range = frameRanges[ name ]; + + if ( i < range.start ) range.start = i; + if ( i > range.end ) range.end = i; + + if ( ! firstAnimation ) firstAnimation = name; + + } + + } + + for ( var name in frameRanges ) { + + var range = frameRanges[ name ]; + this.createAnimation( name, range.start, range.end, fps ); + + } + + this.firstAnimation = firstAnimation; + + }; + + MorphBlendMesh.prototype.setAnimationDirectionForward = function ( name ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.direction = 1; + animation.directionBackwards = false; + + } + + }; + + MorphBlendMesh.prototype.setAnimationDirectionBackward = function ( name ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.direction = - 1; + animation.directionBackwards = true; + + } + + }; + + MorphBlendMesh.prototype.setAnimationFPS = function ( name, fps ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.fps = fps; + animation.duration = ( animation.end - animation.start ) / animation.fps; + + } + + }; + + MorphBlendMesh.prototype.setAnimationDuration = function ( name, duration ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.duration = duration; + animation.fps = ( animation.end - animation.start ) / animation.duration; + + } + + }; + + MorphBlendMesh.prototype.setAnimationWeight = function ( name, weight ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.weight = weight; + + } + + }; + + MorphBlendMesh.prototype.setAnimationTime = function ( name, time ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.time = time; + + } + + }; + + MorphBlendMesh.prototype.getAnimationTime = function ( name ) { + + var time = 0; + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + time = animation.time; + + } + + return time; + + }; + + MorphBlendMesh.prototype.getAnimationDuration = function ( name ) { + + var duration = - 1; + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + duration = animation.duration; + + } + + return duration; + + }; + + MorphBlendMesh.prototype.playAnimation = function ( name ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.time = 0; + animation.active = true; + + } else { + + console.warn( "THREE.MorphBlendMesh: animation[" + name + "] undefined in .playAnimation()" ); + + } + + }; + + MorphBlendMesh.prototype.stopAnimation = function ( name ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.active = false; + + } + + }; + + MorphBlendMesh.prototype.update = function ( delta ) { + + for ( var i = 0, il = this.animationsList.length; i < il; i ++ ) { + + var animation = this.animationsList[ i ]; + + if ( ! animation.active ) continue; + + var frameTime = animation.duration / animation.length; + + animation.time += animation.direction * delta; + + if ( animation.mirroredLoop ) { + + if ( animation.time > animation.duration || animation.time < 0 ) { + + animation.direction *= - 1; + + if ( animation.time > animation.duration ) { + + animation.time = animation.duration; + animation.directionBackwards = true; + + } + + if ( animation.time < 0 ) { + + animation.time = 0; + animation.directionBackwards = false; + + } + + } + + } else { + + animation.time = animation.time % animation.duration; + + if ( animation.time < 0 ) animation.time += animation.duration; + + } + + var keyframe = animation.start + _Math.clamp( Math.floor( animation.time / frameTime ), 0, animation.length - 1 ); + var weight = animation.weight; + + if ( keyframe !== animation.currentFrame ) { + + this.morphTargetInfluences[ animation.lastFrame ] = 0; + this.morphTargetInfluences[ animation.currentFrame ] = 1 * weight; + + this.morphTargetInfluences[ keyframe ] = 0; + + animation.lastFrame = animation.currentFrame; + animation.currentFrame = keyframe; + + } + + var mix = ( animation.time % frameTime ) / frameTime; + + if ( animation.directionBackwards ) mix = 1 - mix; + + if ( animation.currentFrame !== animation.lastFrame ) { + + this.morphTargetInfluences[ animation.currentFrame ] = mix * weight; + this.morphTargetInfluences[ animation.lastFrame ] = ( 1 - mix ) * weight; + + } else { + + this.morphTargetInfluences[ animation.currentFrame ] = weight; + + } + + } + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function ImmediateRenderObject( material ) { + + Object3D.call( this ); + + this.material = material; + this.render = function ( renderCallback ) {}; + + } + + ImmediateRenderObject.prototype = Object.create( Object3D.prototype ); + ImmediateRenderObject.prototype.constructor = ImmediateRenderObject; + + ImmediateRenderObject.prototype.isImmediateRenderObject = true; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function VertexNormalsHelper( object, size, hex, linewidth ) { + + this.object = object; + + this.size = ( size !== undefined ) ? size : 1; + + var color = ( hex !== undefined ) ? hex : 0xff0000; + + var width = ( linewidth !== undefined ) ? linewidth : 1; + + // + + var nNormals = 0; + + var objGeometry = this.object.geometry; + + if ( objGeometry && objGeometry.isGeometry ) { + + nNormals = objGeometry.faces.length * 3; + + } else if ( objGeometry && objGeometry.isBufferGeometry ) { + + nNormals = objGeometry.attributes.normal.count; + + } + + // + + var geometry = new BufferGeometry(); + + var positions = new Float32BufferAttribute( nNormals * 2 * 3, 3 ); + + geometry.addAttribute( 'position', positions ); + + LineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) ); + + // + + this.matrixAutoUpdate = false; + + this.update(); + + } + + VertexNormalsHelper.prototype = Object.create( LineSegments.prototype ); + VertexNormalsHelper.prototype.constructor = VertexNormalsHelper; + + VertexNormalsHelper.prototype.update = ( function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + var normalMatrix = new Matrix3(); + + return function update() { + + var keys = [ 'a', 'b', 'c' ]; + + this.object.updateMatrixWorld( true ); + + normalMatrix.getNormalMatrix( this.object.matrixWorld ); + + var matrixWorld = this.object.matrixWorld; + + var position = this.geometry.attributes.position; + + // + + var objGeometry = this.object.geometry; + + if ( objGeometry && objGeometry.isGeometry ) { + + var vertices = objGeometry.vertices; + + var faces = objGeometry.faces; + + var idx = 0; + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + for ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) { + + var vertex = vertices[ face[ keys[ j ] ] ]; + + var normal = face.vertexNormals[ j ]; + + v1.copy( vertex ).applyMatrix4( matrixWorld ); + + v2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 ); + + position.setXYZ( idx, v1.x, v1.y, v1.z ); + + idx = idx + 1; + + position.setXYZ( idx, v2.x, v2.y, v2.z ); + + idx = idx + 1; + + } + + } + + } else if ( objGeometry && objGeometry.isBufferGeometry ) { + + var objPos = objGeometry.attributes.position; + + var objNorm = objGeometry.attributes.normal; + + var idx = 0; + + // for simplicity, ignore index and drawcalls, and render every normal + + for ( var j = 0, jl = objPos.count; j < jl; j ++ ) { + + v1.set( objPos.getX( j ), objPos.getY( j ), objPos.getZ( j ) ).applyMatrix4( matrixWorld ); + + v2.set( objNorm.getX( j ), objNorm.getY( j ), objNorm.getZ( j ) ); + + v2.applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 ); + + position.setXYZ( idx, v1.x, v1.y, v1.z ); + + idx = idx + 1; + + position.setXYZ( idx, v2.x, v2.y, v2.z ); + + idx = idx + 1; + + } + + } + + position.needsUpdate = true; + + }; + + }() ); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function SpotLightHelper( light ) { + + Object3D.call( this ); + + this.light = light; + this.light.updateMatrixWorld(); + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + var geometry = new BufferGeometry(); + + var positions = [ + 0, 0, 0, 0, 0, 1, + 0, 0, 0, 1, 0, 1, + 0, 0, 0, - 1, 0, 1, + 0, 0, 0, 0, 1, 1, + 0, 0, 0, 0, - 1, 1 + ]; + + for ( var i = 0, j = 1, l = 32; i < l; i ++, j ++ ) { + + var p1 = ( i / l ) * Math.PI * 2; + var p2 = ( j / l ) * Math.PI * 2; + + positions.push( + Math.cos( p1 ), Math.sin( p1 ), 1, + Math.cos( p2 ), Math.sin( p2 ), 1 + ); + + } + + geometry.addAttribute( 'position', new Float32BufferAttribute( positions, 3 ) ); + + var material = new LineBasicMaterial( { fog: false } ); + + this.cone = new LineSegments( geometry, material ); + this.add( this.cone ); + + this.update(); + + } + + SpotLightHelper.prototype = Object.create( Object3D.prototype ); + SpotLightHelper.prototype.constructor = SpotLightHelper; + + SpotLightHelper.prototype.dispose = function () { + + this.cone.geometry.dispose(); + this.cone.material.dispose(); + + }; + + SpotLightHelper.prototype.update = function () { + + var vector = new Vector3(); + var vector2 = new Vector3(); + + return function update() { + + this.light.updateMatrixWorld(); + + var coneLength = this.light.distance ? this.light.distance : 1000; + var coneWidth = coneLength * Math.tan( this.light.angle ); + + this.cone.scale.set( coneWidth, coneWidth, coneLength ); + + vector.setFromMatrixPosition( this.light.matrixWorld ); + vector2.setFromMatrixPosition( this.light.target.matrixWorld ); + + this.cone.lookAt( vector2.sub( vector ) ); + + this.cone.material.color.copy( this.light.color ); + + }; + + }(); + + /** + * @author Sean Griffin / http://twitter.com/sgrif + * @author Michael Guerrero / http://realitymeltdown.com + * @author mrdoob / http://mrdoob.com/ + * @author ikerr / http://verold.com + * @author Mugen87 / https://github.com/Mugen87 + */ + + function getBoneList( object ) { + + var boneList = []; + + if ( object && object.isBone ) { + + boneList.push( object ); + + } + + for ( var i = 0; i < object.children.length; i ++ ) { + + boneList.push.apply( boneList, getBoneList( object.children[ i ] ) ); + + } + + return boneList; + + } + + function SkeletonHelper( object ) { + + var bones = getBoneList( object ); + + var geometry = new BufferGeometry(); + + var vertices = []; + var colors = []; + + var color1 = new Color( 0, 0, 1 ); + var color2 = new Color( 0, 1, 0 ); + + for ( var i = 0; i < bones.length; i ++ ) { + + var bone = bones[ i ]; + + if ( bone.parent && bone.parent.isBone ) { + + vertices.push( 0, 0, 0 ); + vertices.push( 0, 0, 0 ); + colors.push( color1.r, color1.g, color1.b ); + colors.push( color2.r, color2.g, color2.b ); + + } + + } + + geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + var material = new LineBasicMaterial( { vertexColors: VertexColors, depthTest: false, depthWrite: false, transparent: true } ); + + LineSegments.call( this, geometry, material ); + + this.root = object; + this.bones = bones; + + this.matrix = object.matrixWorld; + this.matrixAutoUpdate = false; + + this.onBeforeRender(); + + } + + SkeletonHelper.prototype = Object.create( LineSegments.prototype ); + SkeletonHelper.prototype.constructor = SkeletonHelper; + + SkeletonHelper.prototype.onBeforeRender = function () { + + var vector = new Vector3(); + + var boneMatrix = new Matrix4(); + var matrixWorldInv = new Matrix4(); + + return function onBeforeRender() { + + var bones = this.bones; + + var geometry = this.geometry; + var position = geometry.getAttribute( 'position' ); + + matrixWorldInv.getInverse( this.root.matrixWorld ); + + for ( var i = 0, j = 0; i < bones.length; i ++ ) { + + var bone = bones[ i ]; + + if ( bone.parent && bone.parent.isBone ) { + + boneMatrix.multiplyMatrices( matrixWorldInv, bone.matrixWorld ); + vector.setFromMatrixPosition( boneMatrix ); + position.setXYZ( j, vector.x, vector.y, vector.z ); + + boneMatrix.multiplyMatrices( matrixWorldInv, bone.parent.matrixWorld ); + vector.setFromMatrixPosition( boneMatrix ); + position.setXYZ( j + 1, vector.x, vector.y, vector.z ); + + j += 2; + + } + + } + + geometry.getAttribute( 'position' ).needsUpdate = true; + + }; + + }(); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + function PointLightHelper( light, sphereSize ) { + + this.light = light; + this.light.updateMatrixWorld(); + + var geometry = new SphereBufferGeometry( sphereSize, 4, 2 ); + var material = new MeshBasicMaterial( { wireframe: true, fog: false } ); + material.color.copy( this.light.color ); + + Mesh.call( this, geometry, material ); + + this.matrix = this.light.matrixWorld; + this.matrixAutoUpdate = false; + + /* + var distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 ); + var distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } ); + + this.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial ); + this.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial ); + + var d = light.distance; + + if ( d === 0.0 ) { + + this.lightDistance.visible = false; + + } else { + + this.lightDistance.scale.set( d, d, d ); + + } + + this.add( this.lightDistance ); + */ + + } + + PointLightHelper.prototype = Object.create( Mesh.prototype ); + PointLightHelper.prototype.constructor = PointLightHelper; + + PointLightHelper.prototype.dispose = function () { + + this.geometry.dispose(); + this.material.dispose(); + + }; + + PointLightHelper.prototype.update = function () { + + this.material.color.copy( this.light.color ); + + /* + var d = this.light.distance; + + if ( d === 0.0 ) { + + this.lightDistance.visible = false; + + } else { + + this.lightDistance.visible = true; + this.lightDistance.scale.set( d, d, d ); + + } + */ + + }; + + /** + * @author abelnation / http://github.com/abelnation + * @author Mugen87 / http://github.com/Mugen87 + * @author WestLangley / http://github.com/WestLangley + */ + + function RectAreaLightHelper( light ) { + + Object3D.call( this ); + + this.light = light; + this.light.updateMatrixWorld(); + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + var material = new LineBasicMaterial( { color: light.color } ); + + var geometry = new BufferGeometry(); + + geometry.addAttribute( 'position', new BufferAttribute( new Float32Array( 5 * 3 ), 3 ) ); + + this.add( new Line( geometry, material ) ); + + this.update(); + + } + + RectAreaLightHelper.prototype = Object.create( Object3D.prototype ); + RectAreaLightHelper.prototype.constructor = RectAreaLightHelper; + + RectAreaLightHelper.prototype.dispose = function () { + + this.children[ 0 ].geometry.dispose(); + this.children[ 0 ].material.dispose(); + + }; + + RectAreaLightHelper.prototype.update = function () { + + var line = this.children[ 0 ]; + + // update material + + line.material.color.copy( this.light.color ); + + // calculate new dimensions of the helper + + var hx = this.light.width * 0.5; + var hy = this.light.height * 0.5; + + var position = line.geometry.attributes.position; + var array = position.array; + + // update vertices + + array[ 0 ] = hx; array[ 1 ] = - hy; array[ 2 ] = 0; + array[ 3 ] = hx; array[ 4 ] = hy; array[ 5 ] = 0; + array[ 6 ] = - hx; array[ 7 ] = hy; array[ 8 ] = 0; + array[ 9 ] = - hx; array[ 10 ] = - hy; array[ 11 ] = 0; + array[ 12 ] = hx; array[ 13 ] = - hy; array[ 14 ] = 0; + + position.needsUpdate = true; + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + + function HemisphereLightHelper( light, size ) { + + Object3D.call( this ); + + this.light = light; + this.light.updateMatrixWorld(); + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + var geometry = new OctahedronBufferGeometry( size ); + geometry.rotateY( Math.PI * 0.5 ); + + var material = new MeshBasicMaterial( { vertexColors: VertexColors, wireframe: true } ); + + var position = geometry.getAttribute( 'position' ); + var colors = new Float32Array( position.count * 3 ); + + geometry.addAttribute( 'color', new BufferAttribute( colors, 3 ) ); + + this.add( new Mesh( geometry, material ) ); + + this.update(); + + } + + HemisphereLightHelper.prototype = Object.create( Object3D.prototype ); + HemisphereLightHelper.prototype.constructor = HemisphereLightHelper; + + HemisphereLightHelper.prototype.dispose = function () { + + this.children[ 0 ].geometry.dispose(); + this.children[ 0 ].material.dispose(); + + }; + + HemisphereLightHelper.prototype.update = function () { + + var vector = new Vector3(); + + var color1 = new Color(); + var color2 = new Color(); + + return function update() { + + var mesh = this.children[ 0 ]; + + var colors = mesh.geometry.getAttribute( 'color' ); + + color1.copy( this.light.color ); + color2.copy( this.light.groundColor ); + + for ( var i = 0, l = colors.count; i < l; i ++ ) { + + var color = ( i < ( l / 2 ) ) ? color1 : color2; + + colors.setXYZ( i, color.r, color.g, color.b ); + + } + + mesh.lookAt( vector.setFromMatrixPosition( this.light.matrixWorld ).negate() ); + + colors.needsUpdate = true; + + }; + + }(); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function GridHelper( size, divisions, color1, color2 ) { + + size = size || 10; + divisions = divisions || 10; + color1 = new Color( color1 !== undefined ? color1 : 0x444444 ); + color2 = new Color( color2 !== undefined ? color2 : 0x888888 ); + + var center = divisions / 2; + var step = size / divisions; + var halfSize = size / 2; + + var vertices = [], colors = []; + + for ( var i = 0, j = 0, k = - halfSize; i <= divisions; i ++, k += step ) { + + vertices.push( - halfSize, 0, k, halfSize, 0, k ); + vertices.push( k, 0, - halfSize, k, 0, halfSize ); + + var color = i === center ? color1 : color2; + + color.toArray( colors, j ); j += 3; + color.toArray( colors, j ); j += 3; + color.toArray( colors, j ); j += 3; + color.toArray( colors, j ); j += 3; + + } + + var geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + var material = new LineBasicMaterial( { vertexColors: VertexColors } ); + + LineSegments.call( this, geometry, material ); + + } + + GridHelper.prototype = Object.create( LineSegments.prototype ); + GridHelper.prototype.constructor = GridHelper; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / http://github.com/Mugen87 + * @author Hectate / http://www.github.com/Hectate + */ + + function PolarGridHelper( radius, radials, circles, divisions, color1, color2 ) { + + radius = radius || 10; + radials = radials || 16; + circles = circles || 8; + divisions = divisions || 64; + color1 = new Color( color1 !== undefined ? color1 : 0x444444 ); + color2 = new Color( color2 !== undefined ? color2 : 0x888888 ); + + var vertices = []; + var colors = []; + + var x, z; + var v, i, j, r, color; + + // create the radials + + for ( i = 0; i <= radials; i ++ ) { + + v = ( i / radials ) * ( Math.PI * 2 ); + + x = Math.sin( v ) * radius; + z = Math.cos( v ) * radius; + + vertices.push( 0, 0, 0 ); + vertices.push( x, 0, z ); + + color = ( i & 1 ) ? color1 : color2; + + colors.push( color.r, color.g, color.b ); + colors.push( color.r, color.g, color.b ); + + } + + // create the circles + + for ( i = 0; i <= circles; i ++ ) { + + color = ( i & 1 ) ? color1 : color2; + + r = radius - ( radius / circles * i ); + + for ( j = 0; j < divisions; j ++ ) { + + // first vertex + + v = ( j / divisions ) * ( Math.PI * 2 ); + + x = Math.sin( v ) * r; + z = Math.cos( v ) * r; + + vertices.push( x, 0, z ); + colors.push( color.r, color.g, color.b ); + + // second vertex + + v = ( ( j + 1 ) / divisions ) * ( Math.PI * 2 ); + + x = Math.sin( v ) * r; + z = Math.cos( v ) * r; + + vertices.push( x, 0, z ); + colors.push( color.r, color.g, color.b ); + + } + + } + + var geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + var material = new LineBasicMaterial( { vertexColors: VertexColors } ); + + LineSegments.call( this, geometry, material ); + + } + + PolarGridHelper.prototype = Object.create( LineSegments.prototype ); + PolarGridHelper.prototype.constructor = PolarGridHelper; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function FaceNormalsHelper( object, size, hex, linewidth ) { + + // FaceNormalsHelper only supports THREE.Geometry + + this.object = object; + + this.size = ( size !== undefined ) ? size : 1; + + var color = ( hex !== undefined ) ? hex : 0xffff00; + + var width = ( linewidth !== undefined ) ? linewidth : 1; + + // + + var nNormals = 0; + + var objGeometry = this.object.geometry; + + if ( objGeometry && objGeometry.isGeometry ) { + + nNormals = objGeometry.faces.length; + + } else { + + console.warn( 'THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead.' ); + + } + + // + + var geometry = new BufferGeometry(); + + var positions = new Float32BufferAttribute( nNormals * 2 * 3, 3 ); + + geometry.addAttribute( 'position', positions ); + + LineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) ); + + // + + this.matrixAutoUpdate = false; + this.update(); + + } + + FaceNormalsHelper.prototype = Object.create( LineSegments.prototype ); + FaceNormalsHelper.prototype.constructor = FaceNormalsHelper; + + FaceNormalsHelper.prototype.update = ( function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + var normalMatrix = new Matrix3(); + + return function update() { + + this.object.updateMatrixWorld( true ); + + normalMatrix.getNormalMatrix( this.object.matrixWorld ); + + var matrixWorld = this.object.matrixWorld; + + var position = this.geometry.attributes.position; + + // + + var objGeometry = this.object.geometry; + + var vertices = objGeometry.vertices; + + var faces = objGeometry.faces; + + var idx = 0; + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + var normal = face.normal; + + v1.copy( vertices[ face.a ] ) + .add( vertices[ face.b ] ) + .add( vertices[ face.c ] ) + .divideScalar( 3 ) + .applyMatrix4( matrixWorld ); + + v2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 ); + + position.setXYZ( idx, v1.x, v1.y, v1.z ); + + idx = idx + 1; + + position.setXYZ( idx, v2.x, v2.y, v2.z ); + + idx = idx + 1; + + } + + position.needsUpdate = true; + + }; + + }() ); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function DirectionalLightHelper( light, size ) { + + Object3D.call( this ); + + this.light = light; + this.light.updateMatrixWorld(); + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + if ( size === undefined ) size = 1; + + var geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32BufferAttribute( [ + - size, size, 0, + size, size, 0, + size, - size, 0, + - size, - size, 0, + - size, size, 0 + ], 3 ) ); + + var material = new LineBasicMaterial( { fog: false } ); + + this.add( new Line( geometry, material ) ); + + geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) ); + + this.add( new Line( geometry, material )); + + this.update(); + + } + + DirectionalLightHelper.prototype = Object.create( Object3D.prototype ); + DirectionalLightHelper.prototype.constructor = DirectionalLightHelper; + + DirectionalLightHelper.prototype.dispose = function () { + + var lightPlane = this.children[ 0 ]; + var targetLine = this.children[ 1 ]; + + lightPlane.geometry.dispose(); + lightPlane.material.dispose(); + targetLine.geometry.dispose(); + targetLine.material.dispose(); + + }; + + DirectionalLightHelper.prototype.update = function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + var v3 = new Vector3(); + + return function update() { + + v1.setFromMatrixPosition( this.light.matrixWorld ); + v2.setFromMatrixPosition( this.light.target.matrixWorld ); + v3.subVectors( v2, v1 ); + + var lightPlane = this.children[ 0 ]; + var targetLine = this.children[ 1 ]; + + lightPlane.lookAt( v3 ); + lightPlane.material.color.copy( this.light.color ); + + targetLine.lookAt( v3 ); + targetLine.scale.z = v3.length(); + + }; + + }(); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author Mugen87 / https://github.com/Mugen87 + * + * - shows frustum, line of sight and up of the camera + * - suitable for fast updates + * - based on frustum visualization in lightgl.js shadowmap example + * http://evanw.github.com/lightgl.js/tests/shadowmap.html + */ + + function CameraHelper( camera ) { + + var geometry = new BufferGeometry(); + var material = new LineBasicMaterial( { color: 0xffffff, vertexColors: FaceColors } ); + + var vertices = []; + var colors = []; + + var pointMap = {}; + + // colors + + var colorFrustum = new Color( 0xffaa00 ); + var colorCone = new Color( 0xff0000 ); + var colorUp = new Color( 0x00aaff ); + var colorTarget = new Color( 0xffffff ); + var colorCross = new Color( 0x333333 ); + + // near + + addLine( "n1", "n2", colorFrustum ); + addLine( "n2", "n4", colorFrustum ); + addLine( "n4", "n3", colorFrustum ); + addLine( "n3", "n1", colorFrustum ); + + // far + + addLine( "f1", "f2", colorFrustum ); + addLine( "f2", "f4", colorFrustum ); + addLine( "f4", "f3", colorFrustum ); + addLine( "f3", "f1", colorFrustum ); + + // sides + + addLine( "n1", "f1", colorFrustum ); + addLine( "n2", "f2", colorFrustum ); + addLine( "n3", "f3", colorFrustum ); + addLine( "n4", "f4", colorFrustum ); + + // cone + + addLine( "p", "n1", colorCone ); + addLine( "p", "n2", colorCone ); + addLine( "p", "n3", colorCone ); + addLine( "p", "n4", colorCone ); + + // up + + addLine( "u1", "u2", colorUp ); + addLine( "u2", "u3", colorUp ); + addLine( "u3", "u1", colorUp ); + + // target + + addLine( "c", "t", colorTarget ); + addLine( "p", "c", colorCross ); + + // cross + + addLine( "cn1", "cn2", colorCross ); + addLine( "cn3", "cn4", colorCross ); + + addLine( "cf1", "cf2", colorCross ); + addLine( "cf3", "cf4", colorCross ); + + function addLine( a, b, color ) { + + addPoint( a, color ); + addPoint( b, color ); + + } + + function addPoint( id, color ) { + + vertices.push( 0, 0, 0 ); + colors.push( color.r, color.g, color.b ); + + if ( pointMap[ id ] === undefined ) { + + pointMap[ id ] = []; + + } + + pointMap[ id ].push( ( vertices.length / 3 ) - 1 ); + + } + + geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + LineSegments.call( this, geometry, material ); + + this.camera = camera; + if ( this.camera.updateProjectionMatrix ) this.camera.updateProjectionMatrix(); + + this.matrix = camera.matrixWorld; + this.matrixAutoUpdate = false; + + this.pointMap = pointMap; + + this.update(); + + } + + CameraHelper.prototype = Object.create( LineSegments.prototype ); + CameraHelper.prototype.constructor = CameraHelper; + + CameraHelper.prototype.update = function () { + + var geometry, pointMap; + + var vector = new Vector3(); + var camera = new Camera(); + + function setPoint( point, x, y, z ) { + + vector.set( x, y, z ).unproject( camera ); + + var points = pointMap[ point ]; + + if ( points !== undefined ) { + + var position = geometry.getAttribute( 'position' ); + + for ( var i = 0, l = points.length; i < l; i ++ ) { + + position.setXYZ( points[ i ], vector.x, vector.y, vector.z ); + + } + + } + + } + + return function update() { + + geometry = this.geometry; + pointMap = this.pointMap; + + var w = 1, h = 1; + + // we need just camera projection matrix + // world matrix must be identity + + camera.projectionMatrix.copy( this.camera.projectionMatrix ); + + // center / target + + setPoint( "c", 0, 0, - 1 ); + setPoint( "t", 0, 0, 1 ); + + // near + + setPoint( "n1", - w, - h, - 1 ); + setPoint( "n2", w, - h, - 1 ); + setPoint( "n3", - w, h, - 1 ); + setPoint( "n4", w, h, - 1 ); + + // far + + setPoint( "f1", - w, - h, 1 ); + setPoint( "f2", w, - h, 1 ); + setPoint( "f3", - w, h, 1 ); + setPoint( "f4", w, h, 1 ); + + // up + + setPoint( "u1", w * 0.7, h * 1.1, - 1 ); + setPoint( "u2", - w * 0.7, h * 1.1, - 1 ); + setPoint( "u3", 0, h * 2, - 1 ); + + // cross + + setPoint( "cf1", - w, 0, 1 ); + setPoint( "cf2", w, 0, 1 ); + setPoint( "cf3", 0, - h, 1 ); + setPoint( "cf4", 0, h, 1 ); + + setPoint( "cn1", - w, 0, - 1 ); + setPoint( "cn2", w, 0, - 1 ); + setPoint( "cn3", 0, - h, - 1 ); + setPoint( "cn4", 0, h, - 1 ); + + geometry.getAttribute( 'position' ).needsUpdate = true; + + }; + + }(); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / http://github.com/Mugen87 + */ + + function BoxHelper( object, color ) { + + this.object = object; + + if ( color === undefined ) color = 0xffff00; + + var indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] ); + var positions = new Float32Array( 8 * 3 ); + + var geometry = new BufferGeometry(); + geometry.setIndex( new BufferAttribute( indices, 1 ) ); + geometry.addAttribute( 'position', new BufferAttribute( positions, 3 ) ); + + LineSegments.call( this, geometry, new LineBasicMaterial( { color: color } ) ); + + this.matrixAutoUpdate = false; + + this.update(); + + } + + BoxHelper.prototype = Object.create( LineSegments.prototype ); + BoxHelper.prototype.constructor = BoxHelper; + + BoxHelper.prototype.update = ( function () { + + var box = new Box3(); + + return function update( object ) { + + if ( object !== undefined ) { + + console.warn( 'THREE.BoxHelper: .update() has no longer arguments.' ); + + } + + if ( this.object !== undefined ) { + + box.setFromObject( this.object ); + + } + + if ( box.isEmpty() ) return; + + var min = box.min; + var max = box.max; + + /* + 5____4 + 1/___0/| + | 6__|_7 + 2/___3/ + + 0: max.x, max.y, max.z + 1: min.x, max.y, max.z + 2: min.x, min.y, max.z + 3: max.x, min.y, max.z + 4: max.x, max.y, min.z + 5: min.x, max.y, min.z + 6: min.x, min.y, min.z + 7: max.x, min.y, min.z + */ + + var position = this.geometry.attributes.position; + var array = position.array; + + array[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z; + array[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z; + array[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z; + array[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z; + array[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z; + array[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z; + array[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z; + array[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z; + + position.needsUpdate = true; + + this.geometry.computeBoundingSphere(); + + }; + + } )(); + + BoxHelper.prototype.setFromObject = function ( object ) { + + this.object = object; + this.update(); + + return this; + + }; + + /** + * @author WestLangley / http://github.com/WestLangley + * @author zz85 / http://github.com/zz85 + * @author bhouston / http://clara.io + * + * Creates an arrow for visualizing directions + * + * Parameters: + * dir - Vector3 + * origin - Vector3 + * length - Number + * color - color in hex value + * headLength - Number + * headWidth - Number + */ + + var lineGeometry; + var coneGeometry; + + function ArrowHelper( dir, origin, length, color, headLength, headWidth ) { + + // dir is assumed to be normalized + + Object3D.call( this ); + + if ( color === undefined ) color = 0xffff00; + if ( length === undefined ) length = 1; + if ( headLength === undefined ) headLength = 0.2 * length; + if ( headWidth === undefined ) headWidth = 0.2 * headLength; + + if ( lineGeometry === undefined ) { + + lineGeometry = new BufferGeometry(); + lineGeometry.addAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) ); + + coneGeometry = new CylinderBufferGeometry( 0, 0.5, 1, 5, 1 ); + coneGeometry.translate( 0, - 0.5, 0 ); + + } + + this.position.copy( origin ); + + this.line = new Line( lineGeometry, new LineBasicMaterial( { color: color } ) ); + this.line.matrixAutoUpdate = false; + this.add( this.line ); + + this.cone = new Mesh( coneGeometry, new MeshBasicMaterial( { color: color } ) ); + this.cone.matrixAutoUpdate = false; + this.add( this.cone ); + + this.setDirection( dir ); + this.setLength( length, headLength, headWidth ); + + } + + ArrowHelper.prototype = Object.create( Object3D.prototype ); + ArrowHelper.prototype.constructor = ArrowHelper; + + ArrowHelper.prototype.setDirection = ( function () { + + var axis = new Vector3(); + var radians; + + return function setDirection( dir ) { + + // dir is assumed to be normalized + + if ( dir.y > 0.99999 ) { + + this.quaternion.set( 0, 0, 0, 1 ); + + } else if ( dir.y < - 0.99999 ) { + + this.quaternion.set( 1, 0, 0, 0 ); + + } else { + + axis.set( dir.z, 0, - dir.x ).normalize(); + + radians = Math.acos( dir.y ); + + this.quaternion.setFromAxisAngle( axis, radians ); + + } + + }; + + }() ); + + ArrowHelper.prototype.setLength = function ( length, headLength, headWidth ) { + + if ( headLength === undefined ) headLength = 0.2 * length; + if ( headWidth === undefined ) headWidth = 0.2 * headLength; + + this.line.scale.set( 1, Math.max( 0, length - headLength ), 1 ); + this.line.updateMatrix(); + + this.cone.scale.set( headWidth, headLength, headWidth ); + this.cone.position.y = length; + this.cone.updateMatrix(); + + }; + + ArrowHelper.prototype.setColor = function ( color ) { + + this.line.material.color.copy( color ); + this.cone.material.color.copy( color ); + + }; + + /** + * @author sroucheray / http://sroucheray.org/ + * @author mrdoob / http://mrdoob.com/ + */ + + function AxisHelper( size ) { + + size = size || 1; + + var vertices = [ + 0, 0, 0, size, 0, 0, + 0, 0, 0, 0, size, 0, + 0, 0, 0, 0, 0, size + ]; + + var colors = [ + 1, 0, 0, 1, 0.6, 0, + 0, 1, 0, 0.6, 1, 0, + 0, 0, 1, 0, 0.6, 1 + ]; + + var geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + var material = new LineBasicMaterial( { vertexColors: VertexColors } ); + + LineSegments.call( this, geometry, material ); + + } + + AxisHelper.prototype = Object.create( LineSegments.prototype ); + AxisHelper.prototype.constructor = AxisHelper; + + /** + * @author zz85 https://github.com/zz85 + * + * Centripetal CatmullRom Curve - which is useful for avoiding + * cusps and self-intersections in non-uniform catmull rom curves. + * http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf + * + * curve.type accepts centripetal(default), chordal and catmullrom + * curve.tension is used for catmullrom which defaults to 0.5 + */ + + + /* + Based on an optimized c++ solution in + - http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/ + - http://ideone.com/NoEbVM + + This CubicPoly class could be used for reusing some variables and calculations, + but for three.js curve use, it could be possible inlined and flatten into a single function call + which can be placed in CurveUtils. + */ + + function CubicPoly() { + + var c0 = 0, c1 = 0, c2 = 0, c3 = 0; + + /* + * Compute coefficients for a cubic polynomial + * p(s) = c0 + c1*s + c2*s^2 + c3*s^3 + * such that + * p(0) = x0, p(1) = x1 + * and + * p'(0) = t0, p'(1) = t1. + */ + function init( x0, x1, t0, t1 ) { + + c0 = x0; + c1 = t0; + c2 = - 3 * x0 + 3 * x1 - 2 * t0 - t1; + c3 = 2 * x0 - 2 * x1 + t0 + t1; + + } + + return { + + initCatmullRom: function ( x0, x1, x2, x3, tension ) { + + init( x1, x2, tension * ( x2 - x0 ), tension * ( x3 - x1 ) ); + + }, + + initNonuniformCatmullRom: function ( x0, x1, x2, x3, dt0, dt1, dt2 ) { + + // compute tangents when parameterized in [t1,t2] + var t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1; + var t2 = ( x2 - x1 ) / dt1 - ( x3 - x1 ) / ( dt1 + dt2 ) + ( x3 - x2 ) / dt2; + + // rescale tangents for parametrization in [0,1] + t1 *= dt1; + t2 *= dt1; + + init( x1, x2, t1, t2 ); + + }, + + calc: function ( t ) { + + var t2 = t * t; + var t3 = t2 * t; + return c0 + c1 * t + c2 * t2 + c3 * t3; + + } + + }; + + } + + // + + var tmp = new Vector3(); + var px = new CubicPoly(); + var py = new CubicPoly(); + var pz = new CubicPoly(); + + function CatmullRomCurve3( points ) { + + Curve.call( this ); + + if ( points.length < 2 ) console.warn( 'THREE.CatmullRomCurve3: Points array needs at least two entries.' ); + + this.points = points || []; + this.closed = false; + + } + + CatmullRomCurve3.prototype = Object.create( Curve.prototype ); + CatmullRomCurve3.prototype.constructor = CatmullRomCurve3; + + CatmullRomCurve3.prototype.getPoint = function ( t ) { + + var points = this.points; + var l = points.length; + + var point = ( l - ( this.closed ? 0 : 1 ) ) * t; + var intPoint = Math.floor( point ); + var weight = point - intPoint; + + if ( this.closed ) { + + intPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / points.length ) + 1 ) * points.length; + + } else if ( weight === 0 && intPoint === l - 1 ) { + + intPoint = l - 2; + weight = 1; + + } + + var p0, p1, p2, p3; // 4 points + + if ( this.closed || intPoint > 0 ) { + + p0 = points[ ( intPoint - 1 ) % l ]; + + } else { + + // extrapolate first point + tmp.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] ); + p0 = tmp; + + } + + p1 = points[ intPoint % l ]; + p2 = points[ ( intPoint + 1 ) % l ]; + + if ( this.closed || intPoint + 2 < l ) { + + p3 = points[ ( intPoint + 2 ) % l ]; + + } else { + + // extrapolate last point + tmp.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 1 ] ); + p3 = tmp; + + } + + if ( this.type === undefined || this.type === 'centripetal' || this.type === 'chordal' ) { + + // init Centripetal / Chordal Catmull-Rom + var pow = this.type === 'chordal' ? 0.5 : 0.25; + var dt0 = Math.pow( p0.distanceToSquared( p1 ), pow ); + var dt1 = Math.pow( p1.distanceToSquared( p2 ), pow ); + var dt2 = Math.pow( p2.distanceToSquared( p3 ), pow ); + + // safety check for repeated points + if ( dt1 < 1e-4 ) dt1 = 1.0; + if ( dt0 < 1e-4 ) dt0 = dt1; + if ( dt2 < 1e-4 ) dt2 = dt1; + + px.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 ); + py.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 ); + pz.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 ); + + } else if ( this.type === 'catmullrom' ) { + + var tension = this.tension !== undefined ? this.tension : 0.5; + px.initCatmullRom( p0.x, p1.x, p2.x, p3.x, tension ); + py.initCatmullRom( p0.y, p1.y, p2.y, p3.y, tension ); + pz.initCatmullRom( p0.z, p1.z, p2.z, p3.z, tension ); + + } + + return new Vector3( px.calc( weight ), py.calc( weight ), pz.calc( weight ) ); + + }; + + function CubicBezierCurve3( v0, v1, v2, v3 ) { + + Curve.call( this ); + + this.v0 = v0; + this.v1 = v1; + this.v2 = v2; + this.v3 = v3; + + } + + CubicBezierCurve3.prototype = Object.create( Curve.prototype ); + CubicBezierCurve3.prototype.constructor = CubicBezierCurve3; + + CubicBezierCurve3.prototype.getPoint = function ( t ) { + + var v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3; + + return new Vector3( + CubicBezier( t, v0.x, v1.x, v2.x, v3.x ), + CubicBezier( t, v0.y, v1.y, v2.y, v3.y ), + CubicBezier( t, v0.z, v1.z, v2.z, v3.z ) + ); + + }; + + function QuadraticBezierCurve3( v0, v1, v2 ) { + + Curve.call( this ); + + this.v0 = v0; + this.v1 = v1; + this.v2 = v2; + + } + + QuadraticBezierCurve3.prototype = Object.create( Curve.prototype ); + QuadraticBezierCurve3.prototype.constructor = QuadraticBezierCurve3; + + QuadraticBezierCurve3.prototype.getPoint = function ( t ) { + + var v0 = this.v0, v1 = this.v1, v2 = this.v2; + + return new Vector3( + QuadraticBezier( t, v0.x, v1.x, v2.x ), + QuadraticBezier( t, v0.y, v1.y, v2.y ), + QuadraticBezier( t, v0.z, v1.z, v2.z ) + ); + + }; + + function LineCurve3( v1, v2 ) { + + Curve.call( this ); + + this.v1 = v1; + this.v2 = v2; + + } + + LineCurve3.prototype = Object.create( Curve.prototype ); + LineCurve3.prototype.constructor = LineCurve3; + + LineCurve3.prototype.getPoint = function ( t ) { + + if ( t === 1 ) { + + return this.v2.clone(); + + } + + var vector = new Vector3(); + + vector.subVectors( this.v2, this.v1 ); // diff + vector.multiplyScalar( t ); + vector.add( this.v1 ); + + return vector; + + }; + + function ArcCurve( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) { + + EllipseCurve.call( this, aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise ); + + } + + ArcCurve.prototype = Object.create( EllipseCurve.prototype ); + ArcCurve.prototype.constructor = ArcCurve; + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + var SceneUtils = { + + createMultiMaterialObject: function ( geometry, materials ) { + + var group = new Group(); + + for ( var i = 0, l = materials.length; i < l; i ++ ) { + + group.add( new Mesh( geometry, materials[ i ] ) ); + + } + + return group; + + }, + + detach: function ( child, parent, scene ) { + + child.applyMatrix( parent.matrixWorld ); + parent.remove( child ); + scene.add( child ); + + }, + + attach: function ( child, scene, parent ) { + + child.applyMatrix( new Matrix4().getInverse( parent.matrixWorld ) ); + + scene.remove( child ); + parent.add( child ); + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Face4( a, b, c, d, normal, color, materialIndex ) { + + console.warn( 'THREE.Face4 has been removed. A THREE.Face3 will be created instead.' ); + return new Face3( a, b, c, normal, color, materialIndex ); + + } + + var LineStrip = 0; + + var LinePieces = 1; + + function MeshFaceMaterial( materials ) { + + console.warn( 'THREE.MeshFaceMaterial has been removed. Use an Array instead.' ); + return materials; + + } + + function MultiMaterial( materials ) { + + if ( materials === undefined ) materials = []; + + console.warn( 'THREE.MultiMaterial has been removed. Use an Array instead.' ); + materials.isMultiMaterial = true; + materials.materials = materials; + materials.clone = function () { + + return materials.slice(); + + }; + return materials; + + } + + function PointCloud( geometry, material ) { + + console.warn( 'THREE.PointCloud has been renamed to THREE.Points.' ); + return new Points( geometry, material ); + + } + + function Particle( material ) { + + console.warn( 'THREE.Particle has been renamed to THREE.Sprite.' ); + return new Sprite( material ); + + } + + function ParticleSystem( geometry, material ) { + + console.warn( 'THREE.ParticleSystem has been renamed to THREE.Points.' ); + return new Points( geometry, material ); + + } + + function PointCloudMaterial( parameters ) { + + console.warn( 'THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.' ); + return new PointsMaterial( parameters ); + + } + + function ParticleBasicMaterial( parameters ) { + + console.warn( 'THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.' ); + return new PointsMaterial( parameters ); + + } + + function ParticleSystemMaterial( parameters ) { + + console.warn( 'THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.' ); + return new PointsMaterial( parameters ); + + } + + function Vertex( x, y, z ) { + + console.warn( 'THREE.Vertex has been removed. Use THREE.Vector3 instead.' ); + return new Vector3( x, y, z ); + + } + + // + + function DynamicBufferAttribute( array, itemSize ) { + + console.warn( 'THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setDynamic( true ) instead.' ); + return new BufferAttribute( array, itemSize ).setDynamic( true ); + + } + + function Int8Attribute( array, itemSize ) { + + console.warn( 'THREE.Int8Attribute has been removed. Use new THREE.Int8BufferAttribute() instead.' ); + return new Int8BufferAttribute( array, itemSize ); + + } + + function Uint8Attribute( array, itemSize ) { + + console.warn( 'THREE.Uint8Attribute has been removed. Use new THREE.Uint8BufferAttribute() instead.' ); + return new Uint8BufferAttribute( array, itemSize ); + + } + + function Uint8ClampedAttribute( array, itemSize ) { + + console.warn( 'THREE.Uint8ClampedAttribute has been removed. Use new THREE.Uint8ClampedBufferAttribute() instead.' ); + return new Uint8ClampedBufferAttribute( array, itemSize ); + + } + + function Int16Attribute( array, itemSize ) { + + console.warn( 'THREE.Int16Attribute has been removed. Use new THREE.Int16BufferAttribute() instead.' ); + return new Int16BufferAttribute( array, itemSize ); + + } + + function Uint16Attribute( array, itemSize ) { + + console.warn( 'THREE.Uint16Attribute has been removed. Use new THREE.Uint16BufferAttribute() instead.' ); + return new Uint16BufferAttribute( array, itemSize ); + + } + + function Int32Attribute( array, itemSize ) { + + console.warn( 'THREE.Int32Attribute has been removed. Use new THREE.Int32BufferAttribute() instead.' ); + return new Int32BufferAttribute( array, itemSize ); + + } + + function Uint32Attribute( array, itemSize ) { + + console.warn( 'THREE.Uint32Attribute has been removed. Use new THREE.Uint32BufferAttribute() instead.' ); + return new Uint32BufferAttribute( array, itemSize ); + + } + + function Float32Attribute( array, itemSize ) { + + console.warn( 'THREE.Float32Attribute has been removed. Use new THREE.Float32BufferAttribute() instead.' ); + return new Float32BufferAttribute( array, itemSize ); + + } + + function Float64Attribute( array, itemSize ) { + + console.warn( 'THREE.Float64Attribute has been removed. Use new THREE.Float64BufferAttribute() instead.' ); + return new Float64BufferAttribute( array, itemSize ); + + } + + // + + Curve.create = function ( construct, getPoint ) { + + console.log( 'THREE.Curve.create() has been deprecated' ); + + construct.prototype = Object.create( Curve.prototype ); + construct.prototype.constructor = construct; + construct.prototype.getPoint = getPoint; + + return construct; + + }; + + // + + function ClosedSplineCurve3( points ) { + + console.warn( 'THREE.ClosedSplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.' ); + + CatmullRomCurve3.call( this, points ); + this.type = 'catmullrom'; + this.closed = true; + + } + + ClosedSplineCurve3.prototype = Object.create( CatmullRomCurve3.prototype ); + + // + + function SplineCurve3( points ) { + + console.warn( 'THREE.SplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.' ); + + CatmullRomCurve3.call( this, points ); + this.type = 'catmullrom'; + + } + + SplineCurve3.prototype = Object.create( CatmullRomCurve3.prototype ); + + // + + function Spline( points ) { + + console.warn( 'THREE.Spline has been removed. Use THREE.CatmullRomCurve3 instead.' ); + + CatmullRomCurve3.call( this, points ); + this.type = 'catmullrom'; + + } + + Spline.prototype = Object.create( CatmullRomCurve3.prototype ); + + Object.assign( Spline.prototype, { + + initFromArray: function ( a ) { + + console.error( 'THREE.Spline: .initFromArray() has been removed.' ); + + }, + getControlPointsArray: function ( optionalTarget ) { + + console.error( 'THREE.Spline: .getControlPointsArray() has been removed.' ); + + }, + reparametrizeByArcLength: function ( samplingCoef ) { + + console.error( 'THREE.Spline: .reparametrizeByArcLength() has been removed.' ); + + } + + } ); + + // + function BoundingBoxHelper( object, color ) { + + console.warn( 'THREE.BoundingBoxHelper has been deprecated. Creating a THREE.BoxHelper instead.' ); + return new BoxHelper( object, color ); + + } + + function EdgesHelper( object, hex ) { + + console.warn( 'THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead.' ); + return new LineSegments( new EdgesGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) ); + + } + + GridHelper.prototype.setColors = function () { + + console.error( 'THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.' ); + + }; + + SkeletonHelper.prototype.update = function () { + + console.error( 'THREE.SkeletonHelper: update() no longer needs to be called.' ); + + }; + + function WireframeHelper( object, hex ) { + + console.warn( 'THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead.' ); + return new LineSegments( new WireframeGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) ); + + } + + // + + function XHRLoader( manager ) { + + console.warn( 'THREE.XHRLoader has been renamed to THREE.FileLoader.' ); + return new FileLoader( manager ); + + } + + function BinaryTextureLoader( manager ) { + + console.warn( 'THREE.BinaryTextureLoader has been renamed to THREE.DataTextureLoader.' ); + return new DataTextureLoader( manager ); + + } + + // + + Object.assign( Box2.prototype, { + + center: function ( optionalTarget ) { + + console.warn( 'THREE.Box2: .center() has been renamed to .getCenter().' ); + return this.getCenter( optionalTarget ); + + }, + empty: function () { + + console.warn( 'THREE.Box2: .empty() has been renamed to .isEmpty().' ); + return this.isEmpty(); + + }, + isIntersectionBox: function ( box ) { + + console.warn( 'THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().' ); + return this.intersectsBox( box ); + + }, + size: function ( optionalTarget ) { + + console.warn( 'THREE.Box2: .size() has been renamed to .getSize().' ); + return this.getSize( optionalTarget ); + + } + } ); + + Object.assign( Box3.prototype, { + + center: function ( optionalTarget ) { + + console.warn( 'THREE.Box3: .center() has been renamed to .getCenter().' ); + return this.getCenter( optionalTarget ); + + }, + empty: function () { + + console.warn( 'THREE.Box3: .empty() has been renamed to .isEmpty().' ); + return this.isEmpty(); + + }, + isIntersectionBox: function ( box ) { + + console.warn( 'THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().' ); + return this.intersectsBox( box ); + + }, + isIntersectionSphere: function ( sphere ) { + + console.warn( 'THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().' ); + return this.intersectsSphere( sphere ); + + }, + size: function ( optionalTarget ) { + + console.warn( 'THREE.Box3: .size() has been renamed to .getSize().' ); + return this.getSize( optionalTarget ); + + } + } ); + + Line3.prototype.center = function ( optionalTarget ) { + + console.warn( 'THREE.Line3: .center() has been renamed to .getCenter().' ); + return this.getCenter( optionalTarget ); + + }; + + _Math.random16 = function () { + + console.warn( 'THREE.Math.random16() has been deprecated. Use Math.random() instead.' ); + return Math.random(); + + }; + + Object.assign( Matrix3.prototype, { + + flattenToArrayOffset: function ( array, offset ) { + + console.warn( "THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead." ); + return this.toArray( array, offset ); + + }, + multiplyVector3: function ( vector ) { + + console.warn( 'THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.' ); + return vector.applyMatrix3( this ); + + }, + multiplyVector3Array: function ( a ) { + + console.error( 'THREE.Matrix3: .multiplyVector3Array() has been removed.' ); + + }, + applyToBuffer: function( buffer, offset, length ) { + + console.warn( 'THREE.Matrix3: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.' ); + return this.applyToBufferAttribute( buffer ); + + }, + applyToVector3Array: function( array, offset, length ) { + + console.error( 'THREE.Matrix3: .applyToVector3Array() has been removed.' ); + + } + + } ); + + Object.assign( Matrix4.prototype, { + + extractPosition: function ( m ) { + + console.warn( 'THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().' ); + return this.copyPosition( m ); + + }, + flattenToArrayOffset: function ( array, offset ) { + + console.warn( "THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead." ); + return this.toArray( array, offset ); + + }, + getPosition: function () { + + var v1; + + return function getPosition() { + + if ( v1 === undefined ) v1 = new Vector3(); + console.warn( 'THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.' ); + return v1.setFromMatrixColumn( this, 3 ); + + }; + + }(), + setRotationFromQuaternion: function ( q ) { + + console.warn( 'THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().' ); + return this.makeRotationFromQuaternion( q ); + + }, + multiplyToArray: function () { + + console.warn( 'THREE.Matrix4: .multiplyToArray() has been removed.' ); + + }, + multiplyVector3: function ( vector ) { + + console.warn( 'THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead.' ); + return vector.applyMatrix4( this ); + + }, + multiplyVector4: function ( vector ) { + + console.warn( 'THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.' ); + return vector.applyMatrix4( this ); + + }, + multiplyVector3Array: function ( a ) { + + console.error( 'THREE.Matrix4: .multiplyVector3Array() has been removed.' ); + + }, + rotateAxis: function ( v ) { + + console.warn( 'THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.' ); + v.transformDirection( this ); + + }, + crossVector: function ( vector ) { + + console.warn( 'THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.' ); + return vector.applyMatrix4( this ); + + }, + translate: function () { + + console.error( 'THREE.Matrix4: .translate() has been removed.' ); + + }, + rotateX: function () { + + console.error( 'THREE.Matrix4: .rotateX() has been removed.' ); + + }, + rotateY: function () { + + console.error( 'THREE.Matrix4: .rotateY() has been removed.' ); + + }, + rotateZ: function () { + + console.error( 'THREE.Matrix4: .rotateZ() has been removed.' ); + + }, + rotateByAxis: function () { + + console.error( 'THREE.Matrix4: .rotateByAxis() has been removed.' ); + + }, + applyToBuffer: function( buffer, offset, length ) { + + console.warn( 'THREE.Matrix4: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.' ); + return this.applyToBufferAttribute( buffer ); + + }, + applyToVector3Array: function( array, offset, length ) { + + console.error( 'THREE.Matrix4: .applyToVector3Array() has been removed.' ); + + }, + makeFrustum: function( left, right, bottom, top, near, far ) { + + console.warn( 'THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead.' ); + return this.makePerspective( left, right, top, bottom, near, far ); + + } + + } ); + + Plane.prototype.isIntersectionLine = function ( line ) { + + console.warn( 'THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().' ); + return this.intersectsLine( line ); + + }; + + Quaternion.prototype.multiplyVector3 = function ( vector ) { + + console.warn( 'THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.' ); + return vector.applyQuaternion( this ); + + }; + + Object.assign( Ray.prototype, { + + isIntersectionBox: function ( box ) { + + console.warn( 'THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().' ); + return this.intersectsBox( box ); + + }, + isIntersectionPlane: function ( plane ) { + + console.warn( 'THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().' ); + return this.intersectsPlane( plane ); + + }, + isIntersectionSphere: function ( sphere ) { + + console.warn( 'THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().' ); + return this.intersectsSphere( sphere ); + + } + + } ); + + Object.assign( Shape.prototype, { + + extrude: function ( options ) { + + console.warn( 'THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.' ); + return new ExtrudeGeometry( this, options ); + + }, + makeGeometry: function ( options ) { + + console.warn( 'THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.' ); + return new ShapeGeometry( this, options ); + + } + + } ); + + Object.assign( Vector2.prototype, { + + fromAttribute: function ( attribute, index, offset ) { + + console.error( 'THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute().' ); + return this.fromBufferAttribute( attribute, index, offset ); + + } + + } ); + + Object.assign( Vector3.prototype, { + + setEulerFromRotationMatrix: function () { + + console.error( 'THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.' ); + + }, + setEulerFromQuaternion: function () { + + console.error( 'THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.' ); + + }, + getPositionFromMatrix: function ( m ) { + + console.warn( 'THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().' ); + return this.setFromMatrixPosition( m ); + + }, + getScaleFromMatrix: function ( m ) { + + console.warn( 'THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().' ); + return this.setFromMatrixScale( m ); + + }, + getColumnFromMatrix: function ( index, matrix ) { + + console.warn( 'THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().' ); + return this.setFromMatrixColumn( matrix, index ); + + }, + applyProjection: function ( m ) { + + console.warn( 'THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead.' ); + return this.applyMatrix4( m ); + + }, + fromAttribute: function ( attribute, index, offset ) { + + console.error( 'THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute().' ); + return this.fromBufferAttribute( attribute, index, offset ); + + } + + } ); + + Object.assign( Vector4.prototype, { + + fromAttribute: function ( attribute, index, offset ) { + + console.error( 'THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().' ); + return this.fromBufferAttribute( attribute, index, offset ); + + } + + } ); + + // + + Geometry.prototype.computeTangents = function () { + + console.warn( 'THREE.Geometry: .computeTangents() has been removed.' ); + + }; + + Object.assign( Object3D.prototype, { + + getChildByName: function ( name ) { + + console.warn( 'THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().' ); + return this.getObjectByName( name ); + + }, + renderDepth: function () { + + console.warn( 'THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.' ); + + }, + translate: function ( distance, axis ) { + + console.warn( 'THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.' ); + return this.translateOnAxis( axis, distance ); + + } + + } ); + + Object.defineProperties( Object3D.prototype, { + + eulerOrder: { + get: function () { + + console.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' ); + return this.rotation.order; + + }, + set: function ( value ) { + + console.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' ); + this.rotation.order = value; + + } + }, + useQuaternion: { + get: function () { + + console.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' ); + + }, + set: function () { + + console.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' ); + + } + } + + } ); + + Object.defineProperties( LOD.prototype, { + + objects: { + get: function () { + + console.warn( 'THREE.LOD: .objects has been renamed to .levels.' ); + return this.levels; + + } + } + + } ); + + Object.defineProperty( Skeleton.prototype, 'useVertexTexture', { + + get: function () { + + console.warn( 'THREE.Skeleton: useVertexTexture has been removed.' ); + + }, + set: function () { + + console.warn( 'THREE.Skeleton: useVertexTexture has been removed.' ); + + } + + } ); + + Object.defineProperty( Curve.prototype, '__arcLengthDivisions', { + + get: function () { + + console.warn( 'THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.' ); + return this.arcLengthDivisions; + + }, + set: function ( value ) { + + console.warn( 'THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.' ); + this.arcLengthDivisions = value; + + } + + } ); + + // + + PerspectiveCamera.prototype.setLens = function ( focalLength, filmGauge ) { + + console.warn( "THREE.PerspectiveCamera.setLens is deprecated. " + + "Use .setFocalLength and .filmGauge for a photographic setup." ); + + if ( filmGauge !== undefined ) this.filmGauge = filmGauge; + this.setFocalLength( focalLength ); + + }; + + // + + Object.defineProperties( Light.prototype, { + onlyShadow: { + set: function () { + + console.warn( 'THREE.Light: .onlyShadow has been removed.' ); + + } + }, + shadowCameraFov: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraFov is now .shadow.camera.fov.' ); + this.shadow.camera.fov = value; + + } + }, + shadowCameraLeft: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraLeft is now .shadow.camera.left.' ); + this.shadow.camera.left = value; + + } + }, + shadowCameraRight: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraRight is now .shadow.camera.right.' ); + this.shadow.camera.right = value; + + } + }, + shadowCameraTop: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraTop is now .shadow.camera.top.' ); + this.shadow.camera.top = value; + + } + }, + shadowCameraBottom: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.' ); + this.shadow.camera.bottom = value; + + } + }, + shadowCameraNear: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraNear is now .shadow.camera.near.' ); + this.shadow.camera.near = value; + + } + }, + shadowCameraFar: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraFar is now .shadow.camera.far.' ); + this.shadow.camera.far = value; + + } + }, + shadowCameraVisible: { + set: function () { + + console.warn( 'THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.' ); + + } + }, + shadowBias: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowBias is now .shadow.bias.' ); + this.shadow.bias = value; + + } + }, + shadowDarkness: { + set: function () { + + console.warn( 'THREE.Light: .shadowDarkness has been removed.' ); + + } + }, + shadowMapWidth: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.' ); + this.shadow.mapSize.width = value; + + } + }, + shadowMapHeight: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.' ); + this.shadow.mapSize.height = value; + + } + } + } ); + + // + + Object.defineProperties( BufferAttribute.prototype, { + + length: { + get: function () { + + console.warn( 'THREE.BufferAttribute: .length has been deprecated. Use .count instead.' ); + return this.array.length; + + } + } + + } ); + + Object.assign( BufferGeometry.prototype, { + + addIndex: function ( index ) { + + console.warn( 'THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().' ); + this.setIndex( index ); + + }, + addDrawCall: function ( start, count, indexOffset ) { + + if ( indexOffset !== undefined ) { + + console.warn( 'THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.' ); + + } + console.warn( 'THREE.BufferGeometry: .addDrawCall() is now .addGroup().' ); + this.addGroup( start, count ); + + }, + clearDrawCalls: function () { + + console.warn( 'THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().' ); + this.clearGroups(); + + }, + computeTangents: function () { + + console.warn( 'THREE.BufferGeometry: .computeTangents() has been removed.' ); + + }, + computeOffsets: function () { + + console.warn( 'THREE.BufferGeometry: .computeOffsets() has been removed.' ); + + } + + } ); + + Object.defineProperties( BufferGeometry.prototype, { + + drawcalls: { + get: function () { + + console.error( 'THREE.BufferGeometry: .drawcalls has been renamed to .groups.' ); + return this.groups; + + } + }, + offsets: { + get: function () { + + console.warn( 'THREE.BufferGeometry: .offsets has been renamed to .groups.' ); + return this.groups; + + } + } + + } ); + + // + + Object.defineProperties( Uniform.prototype, { + + dynamic: { + set: function () { + + console.warn( 'THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.' ); + + } + }, + onUpdate: { + value: function () { + + console.warn( 'THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.' ); + return this; + + } + } + + } ); + + // + + Object.defineProperties( Material.prototype, { + + wrapAround: { + get: function () { + + console.warn( 'THREE.Material: .wrapAround has been removed.' ); + + }, + set: function () { + + console.warn( 'THREE.Material: .wrapAround has been removed.' ); + + } + }, + wrapRGB: { + get: function () { + + console.warn( 'THREE.Material: .wrapRGB has been removed.' ); + return new Color(); + + } + } + + } ); + + Object.defineProperties( MeshPhongMaterial.prototype, { + + metal: { + get: function () { + + console.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead.' ); + return false; + + }, + set: function () { + + console.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead' ); + + } + } + + } ); + + Object.defineProperties( ShaderMaterial.prototype, { + + derivatives: { + get: function () { + + console.warn( 'THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' ); + return this.extensions.derivatives; + + }, + set: function ( value ) { + + console.warn( 'THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' ); + this.extensions.derivatives = value; + + } + } + + } ); + + // + + Object.assign( WebGLRenderer.prototype, { + + getCurrentRenderTarget: function () { + + console.warn( 'THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget().' ); + return this.getRenderTarget(); + + }, + + supportsFloatTextures: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( \'OES_texture_float\' ).' ); + return this.extensions.get( 'OES_texture_float' ); + + }, + supportsHalfFloatTextures: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( \'OES_texture_half_float\' ).' ); + return this.extensions.get( 'OES_texture_half_float' ); + + }, + supportsStandardDerivatives: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( \'OES_standard_derivatives\' ).' ); + return this.extensions.get( 'OES_standard_derivatives' ); + + }, + supportsCompressedTextureS3TC: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( \'WEBGL_compressed_texture_s3tc\' ).' ); + return this.extensions.get( 'WEBGL_compressed_texture_s3tc' ); + + }, + supportsCompressedTexturePVRTC: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( \'WEBGL_compressed_texture_pvrtc\' ).' ); + return this.extensions.get( 'WEBGL_compressed_texture_pvrtc' ); + + }, + supportsBlendMinMax: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( \'EXT_blend_minmax\' ).' ); + return this.extensions.get( 'EXT_blend_minmax' ); + + }, + supportsVertexTextures: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures.' ); + return this.capabilities.vertexTextures; + + }, + supportsInstancedArrays: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( \'ANGLE_instanced_arrays\' ).' ); + return this.extensions.get( 'ANGLE_instanced_arrays' ); + + }, + enableScissorTest: function ( boolean ) { + + console.warn( 'THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().' ); + this.setScissorTest( boolean ); + + }, + initMaterial: function () { + + console.warn( 'THREE.WebGLRenderer: .initMaterial() has been removed.' ); + + }, + addPrePlugin: function () { + + console.warn( 'THREE.WebGLRenderer: .addPrePlugin() has been removed.' ); + + }, + addPostPlugin: function () { + + console.warn( 'THREE.WebGLRenderer: .addPostPlugin() has been removed.' ); + + }, + updateShadowMap: function () { + + console.warn( 'THREE.WebGLRenderer: .updateShadowMap() has been removed.' ); + + } + + } ); + + Object.defineProperties( WebGLRenderer.prototype, { + + shadowMapEnabled: { + get: function () { + + return this.shadowMap.enabled; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.' ); + this.shadowMap.enabled = value; + + } + }, + shadowMapType: { + get: function () { + + return this.shadowMap.type; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.' ); + this.shadowMap.type = value; + + } + }, + shadowMapCullFace: { + get: function () { + + return this.shadowMap.cullFace; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderer: .shadowMapCullFace is now .shadowMap.cullFace.' ); + this.shadowMap.cullFace = value; + + } + } + } ); + + Object.defineProperties( WebGLShadowMap.prototype, { + + cullFace: { + get: function () { + + return this.renderReverseSided ? CullFaceFront : CullFaceBack; + + }, + set: function ( cullFace ) { + + var value = ( cullFace !== CullFaceBack ); + console.warn( "WebGLRenderer: .shadowMap.cullFace is deprecated. Set .shadowMap.renderReverseSided to " + value + "." ); + this.renderReverseSided = value; + + } + } + + } ); + + // + + Object.defineProperties( WebGLRenderTarget.prototype, { + + wrapS: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' ); + return this.texture.wrapS; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' ); + this.texture.wrapS = value; + + } + }, + wrapT: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' ); + return this.texture.wrapT; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' ); + this.texture.wrapT = value; + + } + }, + magFilter: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' ); + return this.texture.magFilter; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' ); + this.texture.magFilter = value; + + } + }, + minFilter: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' ); + return this.texture.minFilter; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' ); + this.texture.minFilter = value; + + } + }, + anisotropy: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' ); + return this.texture.anisotropy; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' ); + this.texture.anisotropy = value; + + } + }, + offset: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' ); + return this.texture.offset; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' ); + this.texture.offset = value; + + } + }, + repeat: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' ); + return this.texture.repeat; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' ); + this.texture.repeat = value; + + } + }, + format: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' ); + return this.texture.format; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' ); + this.texture.format = value; + + } + }, + type: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' ); + return this.texture.type; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' ); + this.texture.type = value; + + } + }, + generateMipmaps: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' ); + return this.texture.generateMipmaps; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' ); + this.texture.generateMipmaps = value; + + } + } + + } ); + + // + + Audio.prototype.load = function ( file ) { + + console.warn( 'THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.' ); + var scope = this; + var audioLoader = new AudioLoader(); + audioLoader.load( file, function ( buffer ) { + + scope.setBuffer( buffer ); + + } ); + return this; + + }; + + AudioAnalyser.prototype.getData = function () { + + console.warn( 'THREE.AudioAnalyser: .getData() is now .getFrequencyData().' ); + return this.getFrequencyData(); + + }; + + // + + var GeometryUtils = { + + merge: function ( geometry1, geometry2, materialIndexOffset ) { + + console.warn( 'THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead.' ); + var matrix; + + if ( geometry2.isMesh ) { + + geometry2.matrixAutoUpdate && geometry2.updateMatrix(); + + matrix = geometry2.matrix; + geometry2 = geometry2.geometry; + + } + + geometry1.merge( geometry2, matrix, materialIndexOffset ); + + }, + + center: function ( geometry ) { + + console.warn( 'THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead.' ); + return geometry.center(); + + } + + }; + + var ImageUtils = { + + crossOrigin: undefined, + + loadTexture: function ( url, mapping, onLoad, onError ) { + + console.warn( 'THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.' ); + + var loader = new TextureLoader(); + loader.setCrossOrigin( this.crossOrigin ); + + var texture = loader.load( url, onLoad, undefined, onError ); + + if ( mapping ) texture.mapping = mapping; + + return texture; + + }, + + loadTextureCube: function ( urls, mapping, onLoad, onError ) { + + console.warn( 'THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.' ); + + var loader = new CubeTextureLoader(); + loader.setCrossOrigin( this.crossOrigin ); + + var texture = loader.load( urls, onLoad, undefined, onError ); + + if ( mapping ) texture.mapping = mapping; + + return texture; + + }, + + loadCompressedTexture: function () { + + console.error( 'THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.' ); + + }, + + loadCompressedTextureCube: function () { + + console.error( 'THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.' ); + + } + + }; + + // + + function Projector() { + + console.error( 'THREE.Projector has been moved to /examples/js/renderers/Projector.js.' ); + + this.projectVector = function ( vector, camera ) { + + console.warn( 'THREE.Projector: .projectVector() is now vector.project().' ); + vector.project( camera ); + + }; + + this.unprojectVector = function ( vector, camera ) { + + console.warn( 'THREE.Projector: .unprojectVector() is now vector.unproject().' ); + vector.unproject( camera ); + + }; + + this.pickingRay = function () { + + console.error( 'THREE.Projector: .pickingRay() is now raycaster.setFromCamera().' ); + + }; + + } + + // + + function CanvasRenderer() { + + console.error( 'THREE.CanvasRenderer has been moved to /examples/js/renderers/CanvasRenderer.js' ); + + this.domElement = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); + this.clear = function () {}; + this.render = function () {}; + this.setClearColor = function () {}; + this.setSize = function () {}; + + } + + exports.WebGLRenderTargetCube = WebGLRenderTargetCube; + exports.WebGLRenderTarget = WebGLRenderTarget; + exports.WebGLRenderer = WebGLRenderer; + exports.ShaderLib = ShaderLib; + exports.UniformsLib = UniformsLib; + exports.UniformsUtils = UniformsUtils; + exports.ShaderChunk = ShaderChunk; + exports.FogExp2 = FogExp2; + exports.Fog = Fog; + exports.Scene = Scene; + exports.LensFlare = LensFlare; + exports.Sprite = Sprite; + exports.LOD = LOD; + exports.SkinnedMesh = SkinnedMesh; + exports.Skeleton = Skeleton; + exports.Bone = Bone; + exports.Mesh = Mesh; + exports.LineSegments = LineSegments; + exports.LineLoop = LineLoop; + exports.Line = Line; + exports.Points = Points; + exports.Group = Group; + exports.VideoTexture = VideoTexture; + exports.DataTexture = DataTexture; + exports.CompressedTexture = CompressedTexture; + exports.CubeTexture = CubeTexture; + exports.CanvasTexture = CanvasTexture; + exports.DepthTexture = DepthTexture; + exports.Texture = Texture; + exports.CompressedTextureLoader = CompressedTextureLoader; + exports.DataTextureLoader = DataTextureLoader; + exports.CubeTextureLoader = CubeTextureLoader; + exports.TextureLoader = TextureLoader; + exports.ObjectLoader = ObjectLoader; + exports.MaterialLoader = MaterialLoader; + exports.BufferGeometryLoader = BufferGeometryLoader; + exports.DefaultLoadingManager = DefaultLoadingManager; + exports.LoadingManager = LoadingManager; + exports.JSONLoader = JSONLoader; + exports.ImageLoader = ImageLoader; + exports.FontLoader = FontLoader; + exports.FileLoader = FileLoader; + exports.Loader = Loader; + exports.Cache = Cache; + exports.AudioLoader = AudioLoader; + exports.SpotLightShadow = SpotLightShadow; + exports.SpotLight = SpotLight; + exports.PointLight = PointLight; + exports.RectAreaLight = RectAreaLight; + exports.HemisphereLight = HemisphereLight; + exports.DirectionalLightShadow = DirectionalLightShadow; + exports.DirectionalLight = DirectionalLight; + exports.AmbientLight = AmbientLight; + exports.LightShadow = LightShadow; + exports.Light = Light; + exports.StereoCamera = StereoCamera; + exports.PerspectiveCamera = PerspectiveCamera; + exports.OrthographicCamera = OrthographicCamera; + exports.CubeCamera = CubeCamera; + exports.ArrayCamera = ArrayCamera; + exports.Camera = Camera; + exports.AudioListener = AudioListener; + exports.PositionalAudio = PositionalAudio; + exports.AudioContext = AudioContext; + exports.AudioAnalyser = AudioAnalyser; + exports.Audio = Audio; + exports.VectorKeyframeTrack = VectorKeyframeTrack; + exports.StringKeyframeTrack = StringKeyframeTrack; + exports.QuaternionKeyframeTrack = QuaternionKeyframeTrack; + exports.NumberKeyframeTrack = NumberKeyframeTrack; + exports.ColorKeyframeTrack = ColorKeyframeTrack; + exports.BooleanKeyframeTrack = BooleanKeyframeTrack; + exports.PropertyMixer = PropertyMixer; + exports.PropertyBinding = PropertyBinding; + exports.KeyframeTrack = KeyframeTrack; + exports.AnimationUtils = AnimationUtils; + exports.AnimationObjectGroup = AnimationObjectGroup; + exports.AnimationMixer = AnimationMixer; + exports.AnimationClip = AnimationClip; + exports.Uniform = Uniform; + exports.InstancedBufferGeometry = InstancedBufferGeometry; + exports.BufferGeometry = BufferGeometry; + exports.GeometryIdCount = GeometryIdCount; + exports.Geometry = Geometry; + exports.InterleavedBufferAttribute = InterleavedBufferAttribute; + exports.InstancedInterleavedBuffer = InstancedInterleavedBuffer; + exports.InterleavedBuffer = InterleavedBuffer; + exports.InstancedBufferAttribute = InstancedBufferAttribute; + exports.Face3 = Face3; + exports.Object3D = Object3D; + exports.Raycaster = Raycaster; + exports.Layers = Layers; + exports.EventDispatcher = EventDispatcher; + exports.Clock = Clock; + exports.QuaternionLinearInterpolant = QuaternionLinearInterpolant; + exports.LinearInterpolant = LinearInterpolant; + exports.DiscreteInterpolant = DiscreteInterpolant; + exports.CubicInterpolant = CubicInterpolant; + exports.Interpolant = Interpolant; + exports.Triangle = Triangle; + exports.Math = _Math; + exports.Spherical = Spherical; + exports.Cylindrical = Cylindrical; + exports.Plane = Plane; + exports.Frustum = Frustum; + exports.Sphere = Sphere; + exports.Ray = Ray; + exports.Matrix4 = Matrix4; + exports.Matrix3 = Matrix3; + exports.Box3 = Box3; + exports.Box2 = Box2; + exports.Line3 = Line3; + exports.Euler = Euler; + exports.Vector4 = Vector4; + exports.Vector3 = Vector3; + exports.Vector2 = Vector2; + exports.Quaternion = Quaternion; + exports.Color = Color; + exports.MorphBlendMesh = MorphBlendMesh; + exports.ImmediateRenderObject = ImmediateRenderObject; + exports.VertexNormalsHelper = VertexNormalsHelper; + exports.SpotLightHelper = SpotLightHelper; + exports.SkeletonHelper = SkeletonHelper; + exports.PointLightHelper = PointLightHelper; + exports.RectAreaLightHelper = RectAreaLightHelper; + exports.HemisphereLightHelper = HemisphereLightHelper; + exports.GridHelper = GridHelper; + exports.PolarGridHelper = PolarGridHelper; + exports.FaceNormalsHelper = FaceNormalsHelper; + exports.DirectionalLightHelper = DirectionalLightHelper; + exports.CameraHelper = CameraHelper; + exports.BoxHelper = BoxHelper; + exports.ArrowHelper = ArrowHelper; + exports.AxisHelper = AxisHelper; + exports.CatmullRomCurve3 = CatmullRomCurve3; + exports.CubicBezierCurve3 = CubicBezierCurve3; + exports.QuadraticBezierCurve3 = QuadraticBezierCurve3; + exports.LineCurve3 = LineCurve3; + exports.ArcCurve = ArcCurve; + exports.EllipseCurve = EllipseCurve; + exports.SplineCurve = SplineCurve; + exports.CubicBezierCurve = CubicBezierCurve; + exports.QuadraticBezierCurve = QuadraticBezierCurve; + exports.LineCurve = LineCurve; + exports.Shape = Shape; + exports.Path = Path; + exports.ShapePath = ShapePath; + exports.Font = Font; + exports.CurvePath = CurvePath; + exports.Curve = Curve; + exports.ShapeUtils = ShapeUtils; + exports.SceneUtils = SceneUtils; + exports.WireframeGeometry = WireframeGeometry; + exports.ParametricGeometry = ParametricGeometry; + exports.ParametricBufferGeometry = ParametricBufferGeometry; + exports.TetrahedronGeometry = TetrahedronGeometry; + exports.TetrahedronBufferGeometry = TetrahedronBufferGeometry; + exports.OctahedronGeometry = OctahedronGeometry; + exports.OctahedronBufferGeometry = OctahedronBufferGeometry; + exports.IcosahedronGeometry = IcosahedronGeometry; + exports.IcosahedronBufferGeometry = IcosahedronBufferGeometry; + exports.DodecahedronGeometry = DodecahedronGeometry; + exports.DodecahedronBufferGeometry = DodecahedronBufferGeometry; + exports.PolyhedronGeometry = PolyhedronGeometry; + exports.PolyhedronBufferGeometry = PolyhedronBufferGeometry; + exports.TubeGeometry = TubeGeometry; + exports.TubeBufferGeometry = TubeBufferGeometry; + exports.TorusKnotGeometry = TorusKnotGeometry; + exports.TorusKnotBufferGeometry = TorusKnotBufferGeometry; + exports.TorusGeometry = TorusGeometry; + exports.TorusBufferGeometry = TorusBufferGeometry; + exports.TextGeometry = TextGeometry; + exports.TextBufferGeometry = TextBufferGeometry; + exports.SphereGeometry = SphereGeometry; + exports.SphereBufferGeometry = SphereBufferGeometry; + exports.RingGeometry = RingGeometry; + exports.RingBufferGeometry = RingBufferGeometry; + exports.PlaneGeometry = PlaneGeometry; + exports.PlaneBufferGeometry = PlaneBufferGeometry; + exports.LatheGeometry = LatheGeometry; + exports.LatheBufferGeometry = LatheBufferGeometry; + exports.ShapeGeometry = ShapeGeometry; + exports.ShapeBufferGeometry = ShapeBufferGeometry; + exports.ExtrudeGeometry = ExtrudeGeometry; + exports.ExtrudeBufferGeometry = ExtrudeBufferGeometry; + exports.EdgesGeometry = EdgesGeometry; + exports.ConeGeometry = ConeGeometry; + exports.ConeBufferGeometry = ConeBufferGeometry; + exports.CylinderGeometry = CylinderGeometry; + exports.CylinderBufferGeometry = CylinderBufferGeometry; + exports.CircleGeometry = CircleGeometry; + exports.CircleBufferGeometry = CircleBufferGeometry; + exports.BoxGeometry = BoxGeometry; + exports.BoxBufferGeometry = BoxBufferGeometry; + exports.ShadowMaterial = ShadowMaterial; + exports.SpriteMaterial = SpriteMaterial; + exports.RawShaderMaterial = RawShaderMaterial; + exports.ShaderMaterial = ShaderMaterial; + exports.PointsMaterial = PointsMaterial; + exports.MeshPhysicalMaterial = MeshPhysicalMaterial; + exports.MeshStandardMaterial = MeshStandardMaterial; + exports.MeshPhongMaterial = MeshPhongMaterial; + exports.MeshToonMaterial = MeshToonMaterial; + exports.MeshNormalMaterial = MeshNormalMaterial; + exports.MeshLambertMaterial = MeshLambertMaterial; + exports.MeshDepthMaterial = MeshDepthMaterial; + exports.MeshBasicMaterial = MeshBasicMaterial; + exports.LineDashedMaterial = LineDashedMaterial; + exports.LineBasicMaterial = LineBasicMaterial; + exports.Material = Material; + exports.Float64BufferAttribute = Float64BufferAttribute; + exports.Float32BufferAttribute = Float32BufferAttribute; + exports.Uint32BufferAttribute = Uint32BufferAttribute; + exports.Int32BufferAttribute = Int32BufferAttribute; + exports.Uint16BufferAttribute = Uint16BufferAttribute; + exports.Int16BufferAttribute = Int16BufferAttribute; + exports.Uint8ClampedBufferAttribute = Uint8ClampedBufferAttribute; + exports.Uint8BufferAttribute = Uint8BufferAttribute; + exports.Int8BufferAttribute = Int8BufferAttribute; + exports.BufferAttribute = BufferAttribute; + exports.REVISION = REVISION; + exports.MOUSE = MOUSE; + exports.CullFaceNone = CullFaceNone; + exports.CullFaceBack = CullFaceBack; + exports.CullFaceFront = CullFaceFront; + exports.CullFaceFrontBack = CullFaceFrontBack; + exports.FrontFaceDirectionCW = FrontFaceDirectionCW; + exports.FrontFaceDirectionCCW = FrontFaceDirectionCCW; + exports.BasicShadowMap = BasicShadowMap; + exports.PCFShadowMap = PCFShadowMap; + exports.PCFSoftShadowMap = PCFSoftShadowMap; + exports.FrontSide = FrontSide; + exports.BackSide = BackSide; + exports.DoubleSide = DoubleSide; + exports.FlatShading = FlatShading; + exports.SmoothShading = SmoothShading; + exports.NoColors = NoColors; + exports.FaceColors = FaceColors; + exports.VertexColors = VertexColors; + exports.NoBlending = NoBlending; + exports.NormalBlending = NormalBlending; + exports.AdditiveBlending = AdditiveBlending; + exports.SubtractiveBlending = SubtractiveBlending; + exports.MultiplyBlending = MultiplyBlending; + exports.CustomBlending = CustomBlending; + exports.AddEquation = AddEquation; + exports.SubtractEquation = SubtractEquation; + exports.ReverseSubtractEquation = ReverseSubtractEquation; + exports.MinEquation = MinEquation; + exports.MaxEquation = MaxEquation; + exports.ZeroFactor = ZeroFactor; + exports.OneFactor = OneFactor; + exports.SrcColorFactor = SrcColorFactor; + exports.OneMinusSrcColorFactor = OneMinusSrcColorFactor; + exports.SrcAlphaFactor = SrcAlphaFactor; + exports.OneMinusSrcAlphaFactor = OneMinusSrcAlphaFactor; + exports.DstAlphaFactor = DstAlphaFactor; + exports.OneMinusDstAlphaFactor = OneMinusDstAlphaFactor; + exports.DstColorFactor = DstColorFactor; + exports.OneMinusDstColorFactor = OneMinusDstColorFactor; + exports.SrcAlphaSaturateFactor = SrcAlphaSaturateFactor; + exports.NeverDepth = NeverDepth; + exports.AlwaysDepth = AlwaysDepth; + exports.LessDepth = LessDepth; + exports.LessEqualDepth = LessEqualDepth; + exports.EqualDepth = EqualDepth; + exports.GreaterEqualDepth = GreaterEqualDepth; + exports.GreaterDepth = GreaterDepth; + exports.NotEqualDepth = NotEqualDepth; + exports.MultiplyOperation = MultiplyOperation; + exports.MixOperation = MixOperation; + exports.AddOperation = AddOperation; + exports.NoToneMapping = NoToneMapping; + exports.LinearToneMapping = LinearToneMapping; + exports.ReinhardToneMapping = ReinhardToneMapping; + exports.Uncharted2ToneMapping = Uncharted2ToneMapping; + exports.CineonToneMapping = CineonToneMapping; + exports.UVMapping = UVMapping; + exports.CubeReflectionMapping = CubeReflectionMapping; + exports.CubeRefractionMapping = CubeRefractionMapping; + exports.EquirectangularReflectionMapping = EquirectangularReflectionMapping; + exports.EquirectangularRefractionMapping = EquirectangularRefractionMapping; + exports.SphericalReflectionMapping = SphericalReflectionMapping; + exports.CubeUVReflectionMapping = CubeUVReflectionMapping; + exports.CubeUVRefractionMapping = CubeUVRefractionMapping; + exports.RepeatWrapping = RepeatWrapping; + exports.ClampToEdgeWrapping = ClampToEdgeWrapping; + exports.MirroredRepeatWrapping = MirroredRepeatWrapping; + exports.NearestFilter = NearestFilter; + exports.NearestMipMapNearestFilter = NearestMipMapNearestFilter; + exports.NearestMipMapLinearFilter = NearestMipMapLinearFilter; + exports.LinearFilter = LinearFilter; + exports.LinearMipMapNearestFilter = LinearMipMapNearestFilter; + exports.LinearMipMapLinearFilter = LinearMipMapLinearFilter; + exports.UnsignedByteType = UnsignedByteType; + exports.ByteType = ByteType; + exports.ShortType = ShortType; + exports.UnsignedShortType = UnsignedShortType; + exports.IntType = IntType; + exports.UnsignedIntType = UnsignedIntType; + exports.FloatType = FloatType; + exports.HalfFloatType = HalfFloatType; + exports.UnsignedShort4444Type = UnsignedShort4444Type; + exports.UnsignedShort5551Type = UnsignedShort5551Type; + exports.UnsignedShort565Type = UnsignedShort565Type; + exports.UnsignedInt248Type = UnsignedInt248Type; + exports.AlphaFormat = AlphaFormat; + exports.RGBFormat = RGBFormat; + exports.RGBAFormat = RGBAFormat; + exports.LuminanceFormat = LuminanceFormat; + exports.LuminanceAlphaFormat = LuminanceAlphaFormat; + exports.RGBEFormat = RGBEFormat; + exports.DepthFormat = DepthFormat; + exports.DepthStencilFormat = DepthStencilFormat; + exports.RGB_S3TC_DXT1_Format = RGB_S3TC_DXT1_Format; + exports.RGBA_S3TC_DXT1_Format = RGBA_S3TC_DXT1_Format; + exports.RGBA_S3TC_DXT3_Format = RGBA_S3TC_DXT3_Format; + exports.RGBA_S3TC_DXT5_Format = RGBA_S3TC_DXT5_Format; + exports.RGB_PVRTC_4BPPV1_Format = RGB_PVRTC_4BPPV1_Format; + exports.RGB_PVRTC_2BPPV1_Format = RGB_PVRTC_2BPPV1_Format; + exports.RGBA_PVRTC_4BPPV1_Format = RGBA_PVRTC_4BPPV1_Format; + exports.RGBA_PVRTC_2BPPV1_Format = RGBA_PVRTC_2BPPV1_Format; + exports.RGB_ETC1_Format = RGB_ETC1_Format; + exports.LoopOnce = LoopOnce; + exports.LoopRepeat = LoopRepeat; + exports.LoopPingPong = LoopPingPong; + exports.InterpolateDiscrete = InterpolateDiscrete; + exports.InterpolateLinear = InterpolateLinear; + exports.InterpolateSmooth = InterpolateSmooth; + exports.ZeroCurvatureEnding = ZeroCurvatureEnding; + exports.ZeroSlopeEnding = ZeroSlopeEnding; + exports.WrapAroundEnding = WrapAroundEnding; + exports.TrianglesDrawMode = TrianglesDrawMode; + exports.TriangleStripDrawMode = TriangleStripDrawMode; + exports.TriangleFanDrawMode = TriangleFanDrawMode; + exports.LinearEncoding = LinearEncoding; + exports.sRGBEncoding = sRGBEncoding; + exports.GammaEncoding = GammaEncoding; + exports.RGBEEncoding = RGBEEncoding; + exports.LogLuvEncoding = LogLuvEncoding; + exports.RGBM7Encoding = RGBM7Encoding; + exports.RGBM16Encoding = RGBM16Encoding; + exports.RGBDEncoding = RGBDEncoding; + exports.BasicDepthPacking = BasicDepthPacking; + exports.RGBADepthPacking = RGBADepthPacking; + exports.CubeGeometry = BoxGeometry; + exports.Face4 = Face4; + exports.LineStrip = LineStrip; + exports.LinePieces = LinePieces; + exports.MeshFaceMaterial = MeshFaceMaterial; + exports.MultiMaterial = MultiMaterial; + exports.PointCloud = PointCloud; + exports.Particle = Particle; + exports.ParticleSystem = ParticleSystem; + exports.PointCloudMaterial = PointCloudMaterial; + exports.ParticleBasicMaterial = ParticleBasicMaterial; + exports.ParticleSystemMaterial = ParticleSystemMaterial; + exports.Vertex = Vertex; + exports.DynamicBufferAttribute = DynamicBufferAttribute; + exports.Int8Attribute = Int8Attribute; + exports.Uint8Attribute = Uint8Attribute; + exports.Uint8ClampedAttribute = Uint8ClampedAttribute; + exports.Int16Attribute = Int16Attribute; + exports.Uint16Attribute = Uint16Attribute; + exports.Int32Attribute = Int32Attribute; + exports.Uint32Attribute = Uint32Attribute; + exports.Float32Attribute = Float32Attribute; + exports.Float64Attribute = Float64Attribute; + exports.ClosedSplineCurve3 = ClosedSplineCurve3; + exports.SplineCurve3 = SplineCurve3; + exports.Spline = Spline; + exports.BoundingBoxHelper = BoundingBoxHelper; + exports.EdgesHelper = EdgesHelper; + exports.WireframeHelper = WireframeHelper; + exports.XHRLoader = XHRLoader; + exports.BinaryTextureLoader = BinaryTextureLoader; + exports.GeometryUtils = GeometryUtils; + exports.ImageUtils = ImageUtils; + exports.Projector = Projector; + exports.CanvasRenderer = CanvasRenderer; + + Object.defineProperty(exports, '__esModule', { value: true }); + +}))); diff --git a/1_Three.js/6_AR/jsartoolkit5/artoolkit.api.js b/1_Three.js/6_AR/jsartoolkit5/artoolkit.api.js new file mode 100755 index 0000000000000000000000000000000000000000..cd2495af69c238411bca258a936f385bd223ed2a --- /dev/null +++ b/1_Three.js/6_AR/jsartoolkit5/artoolkit.api.js @@ -0,0 +1,1632 @@ +;(function() { + 'use strict' + + /** + The ARController is the main object for doing AR marker detection with JSARToolKit. + + To use an ARController, you need to tell it the dimensions to use for the AR processing canvas and + pass it an ARCameraParam to define the camera parameters to use when processing images. + The ARCameraParam defines the lens distortion and aspect ratio of the camera used. + See https://www.artoolworks.com/support/library/Calibrating_your_camera for more information about AR camera parameteters and how to make and use them. + + If you pass an image as the first argument, the ARController uses that as the image to process, + using the dimensions of the image as AR processing canvas width and height. If the first argument + to ARController is an image, the second argument is used as the camera param. + + The camera parameters argument can be either an ARCameraParam or an URL to a camera definition file. + If the camera argument is an URL, it is loaded into a new ARCameraParam, and the ARController dispatches + a 'load' event and calls the onload method if it is defined. + + @exports ARController + @constructor + + @param {number} width The width of the images to process. + @param {number} height The height of the images to process. + @param {ARCameraParam | string} camera The ARCameraParam to use for image processing. If this is a string, the ARController treats it as an URL and tries to load it as a ARCameraParam definition file, calling ARController#onload on success. + */ + var ARController = function(width, height, camera) { + var id; + var w = width, h = height; + + this.orientation = 'landscape'; + + this.listeners = {}; + + if (typeof width !== 'number') { + var image = width; + camera = height; + w = image.videoWidth || image.width; + h = image.videoHeight || image.height; + this.image = image; + } + + this.defaultMarkerWidth = 1; + this.patternMarkers = {}; + this.barcodeMarkers = {}; + this.transform_mat = new Float32Array(16); + + this.canvas = document.createElement('canvas'); + this.canvas.width = w; + this.canvas.height = h; + this.ctx = this.canvas.getContext('2d'); + + this.videoWidth = w; + this.videoHeight = h; + + if (typeof camera === 'string') { + + var self = this; + this.cameraParam = new ARCameraParam(camera, function() { + self._initialize(); + }, function(err) { + console.error("ARController: Failed to load ARCameraParam", err); + }); + + } else { + + this.cameraParam = camera; + this._initialize(); + + } + }; + + /** + Destroys the ARController instance and frees all associated resources. + After calling dispose, the ARController can't be used any longer. Make a new one if you need one. + + Calling this avoids leaking Emscripten memory, which may be important if you're using multiple ARControllers. + */ + ARController.prototype.dispose = function() { + artoolkit.teardown(this.id); + + for (var t in this) { + this[t] = null; + } + }; + + /** + Detects markers in the given image. The process method dispatches marker detection events during its run. + + The marker detection process proceeds by first dispatching a markerNum event that tells you how many + markers were found in the image. Next, a getMarker event is dispatched for each found marker square. + Finally, getMultiMarker is dispatched for every found multimarker, followed by getMultiMarkerSub events + dispatched for each of the markers in the multimarker. + + arController.addEventListener('markerNum', function(ev) { + console.log("Detected " + ev.data + " markers.") + }); + arController.addEventListener('getMarker', function(ev) { + console.log("Detected marker with ids:", ev.data.marker.id, ev.data.marker.idPatt, ev.data.marker.idMatrix); + console.log("Marker data", ev.data.marker); + console.log("Marker transform matrix:", [].join.call(ev.data.matrix, ', ')); + }); + arController.addEventListener('getMultiMarker', function(ev) { + console.log("Detected multimarker with id:", ev.data.multiMarkerId); + }); + arController.addEventListener('getMultiMarkerSub', function(ev) { + console.log("Submarker for " + ev.data.multiMarkerId, ev.data.markerIndex, ev.data.marker); + }); + + arController.process(image); + + + If no image is given, defaults to this.image. + + If the debugSetup has been called, draws debug markers on the debug canvas. + + @param {ImageElement | VideoElement} image The image to process [optional]. + */ + ARController.prototype.process = function(image) { + this.detectMarker(image); + + var markerNum = this.getMarkerNum(); + var k,o; + for (k in this.patternMarkers) { + o = this.patternMarkers[k] + o.inPrevious = o.inCurrent; + o.inCurrent = false; + } + for (k in this.barcodeMarkers) { + o = this.barcodeMarkers[k] + o.inPrevious = o.inCurrent; + o.inCurrent = false; + } + + for (var i=0; i<markerNum; i++) { + var markerInfo = this.getMarker(i); + + var markerType = artoolkit.UNKNOWN_MARKER; + var visible = this.trackPatternMarkerId(-1); + + if (markerInfo.idPatt > -1 && (markerInfo.id === markerInfo.idPatt || markerInfo.idMatrix === -1)) { + visible = this.trackPatternMarkerId(markerInfo.idPatt); + markerType = artoolkit.PATTERN_MARKER; + + if (markerInfo.dir !== markerInfo.dirPatt) { + this.setMarkerInfoDir(i, markerInfo.dirPatt); + } + + } else if (markerInfo.idMatrix > -1) { + visible = this.trackBarcodeMarkerId(markerInfo.idMatrix); + markerType = artoolkit.BARCODE_MARKER; + + if (markerInfo.dir !== markerInfo.dirMatrix) { + this.setMarkerInfoDir(i, markerInfo.dirMatrix); + } + } + + if (markerType !== artoolkit.UNKNOWN_MARKER && visible.inPrevious) { + this.getTransMatSquareCont(i, visible.markerWidth, visible.matrix, visible.matrix); + } else { + this.getTransMatSquare(i, visible.markerWidth, visible.matrix); + } +// this.getTransMatSquare(i, visible.markerWidth, visible.matrix); + + visible.inCurrent = true; + this.transMatToGLMat(visible.matrix, this.transform_mat); + this.dispatchEvent({ + name: 'getMarker', + target: this, + data: { + index: i, + type: markerType, + marker: markerInfo, + matrix: this.transform_mat + } + }); + } + + var multiMarkerCount = this.getMultiMarkerCount(); + for (var i=0; i<multiMarkerCount; i++) { + var subMarkerCount = this.getMultiMarkerPatternCount(i); + var visible = false; + + artoolkit.getTransMatMultiSquareRobust(this.id, i); + this.transMatToGLMat(this.marker_transform_mat, this.transform_mat); + for (var j=0; j<subMarkerCount; j++) { + var multiEachMarkerInfo = this.getMultiEachMarker(i, j); + if (multiEachMarkerInfo.visible >= 0) { + visible = true; + this.dispatchEvent({ + name: 'getMultiMarker', + target: this, + data: { + multiMarkerId: i, + matrix: this.transform_mat + } + }); + break; + } + } + if (visible) { + for (var j=0; j<subMarkerCount; j++) { + var multiEachMarkerInfo = this.getMultiEachMarker(i, j); + this.transMatToGLMat(this.marker_transform_mat, this.transform_mat); + this.dispatchEvent({ + name: 'getMultiMarkerSub', + target: this, + data: { + multiMarkerId: i, + markerIndex: j, + marker: multiEachMarkerInfo, + matrix: this.transform_mat + } + }); + } + } + } + if (this._bwpointer) { + this.debugDraw(); + } + }; + + /** + Adds the given pattern marker ID to the index of tracked IDs. + Sets the markerWidth for the pattern marker to markerWidth. + + Used by process() to implement continuous tracking, + keeping track of the marker's transformation matrix + and customizable marker widths. + + @param {number} id ID of the pattern marker to track. + @param {number} markerWidth The width of the marker to track. + @return {Object} The marker tracking object. + */ + ARController.prototype.trackPatternMarkerId = function(id, markerWidth) { + var obj = this.patternMarkers[id]; + if (!obj) { + this.patternMarkers[id] = obj = { + inPrevious: false, + inCurrent: false, + matrix: new Float32Array(12), + markerWidth: markerWidth || this.defaultMarkerWidth + }; + } + if (markerWidth) { + obj.markerWidth = markerWidth; + } + return obj; + }; + + /** + Adds the given barcode marker ID to the index of tracked IDs. + Sets the markerWidth for the pattern marker to markerWidth. + + Used by process() to implement continuous tracking, + keeping track of the marker's transformation matrix + and customizable marker widths. + + @param {number} id ID of the barcode marker to track. + @param {number} markerWidth The width of the marker to track. + @return {Object} The marker tracking object. + */ + ARController.prototype.trackBarcodeMarkerId = function(id, markerWidth) { + var obj = this.barcodeMarkers[id]; + if (!obj) { + this.barcodeMarkers[id] = obj = { + inPrevious: false, + inCurrent: false, + matrix: new Float32Array(12), + markerWidth: markerWidth || this.defaultMarkerWidth + }; + } + if (markerWidth) { + obj.markerWidth = markerWidth; + } + return obj; + }; + + /** + Returns the number of multimarkers registered on this ARController. + + @return {number} Number of multimarkers registered. + */ + ARController.prototype.getMultiMarkerCount = function() { + return artoolkit.getMultiMarkerCount(this.id); + }; + + /** + Returns the number of markers in the multimarker registered for the given multiMarkerId. + + @param {number} multiMarkerId The id number of the multimarker to access. Given by loadMultiMarker. + @return {number} Number of markers in the multimarker. Negative value indicates failure to find the multimarker. + */ + ARController.prototype.getMultiMarkerPatternCount = function(multiMarkerId) { + return artoolkit.getMultiMarkerNum(this.id, multiMarkerId); + }; + + /** + Add an event listener on this ARController for the named event, calling the callback function + whenever that event is dispatched. + + Possible events are: + * getMarker - dispatched whenever process() finds a square marker + * getMultiMarker - dispatched whenever process() finds a visible registered multimarker + * getMultiMarkerSub - dispatched by process() for each marker in a visible multimarker + * load - dispatched when the ARController is ready to use (useful if passing in a camera URL in the constructor) + + @param {string} name Name of the event to listen to. + @param {function} callback Callback function to call when an event with the given name is dispatched. + */ + ARController.prototype.addEventListener = function(name, callback) { + if (!this.listeners[name]) { + this.listeners[name] = []; + } + this.listeners[name].push(callback); + }; + + /** + Remove an event listener from the named event. + + @param {string} name Name of the event to stop listening to. + @param {function} callback Callback function to remove from the listeners of the named event. + */ + ARController.prototype.removeEventListener = function(name, callback) { + if (this.listeners[name]) { + var index = this.listeners[name].indexOf(callback); + if (index > -1) { + this.listeners[name].splice(index, 1); + } + } + }; + + /** + Dispatches the given event to all registered listeners on event.name. + + @param {Object} event Event to dispatch. + */ + ARController.prototype.dispatchEvent = function(event) { + var listeners = this.listeners[event.name]; + if (listeners) { + for (var i=0; i<listeners.length; i++) { + listeners[i].call(this, event); + } + } + }; + + /** + Sets up a debug canvas for the AR detection. Draws a red marker on top of each detected square in the image. + + The debug canvas is added to document.body. + */ + ARController.prototype.debugSetup = function() { + document.body.appendChild(this.canvas) + this.setDebugMode(1); + this._bwpointer = this.getProcessingImage(); + }; + + /** + Loads a pattern marker from the given URL and calls the onSuccess callback with the UID of the marker. + + arController.loadMarker(markerURL, onSuccess, onError); + + @param {string} markerURL - The URL of the marker pattern file to load. + @param {function} onSuccess - The success callback. Called with the id of the loaded marker on a successful load. + @param {function} onError - The error callback. Called with the encountered error if the load fails. + */ + ARController.prototype.loadMarker = function(markerURL, onSuccess, onError) { + return artoolkit.addMarker(this.id, markerURL, onSuccess, onError); + }; + + /** + Loads a multimarker from the given URL and calls the onSuccess callback with the UID of the marker. + + arController.loadMultiMarker(markerURL, onSuccess, onError); + + @param {string} markerURL - The URL of the multimarker pattern file to load. + @param {function} onSuccess - The success callback. Called with the id and the number of sub-markers of the loaded marker on a successful load. + @param {function} onError - The error callback. Called with the encountered error if the load fails. + */ + ARController.prototype.loadMultiMarker = function(markerURL, onSuccess, onError) { + return artoolkit.addMultiMarker(this.id, markerURL, onSuccess, onError); + }; + + /** + * Populates the provided float array with the current transformation for the specified marker. After + * a call to detectMarker, all marker information will be current. Marker transformations can then be + * checked. + * @param {number} markerUID The unique identifier (UID) of the marker to query + * @param {number} markerWidth The width of the marker + * @param {Float64Array} dst The float array to populate with the 3x4 marker transformation matrix + * @return {Float64Array} The dst array. + */ + ARController.prototype.getTransMatSquare = function(markerIndex, markerWidth, dst) { + artoolkit.getTransMatSquare(this.id, markerIndex, markerWidth); + dst.set(this.marker_transform_mat); + return dst; + }; + + /** + * Populates the provided float array with the current transformation for the specified marker, using + * previousMarkerTransform as the previously detected transformation. After + * a call to detectMarker, all marker information will be current. Marker transformations can then be + * checked. + * @param {number} markerUID The unique identifier (UID) of the marker to query + * @param {number} markerWidth The width of the marker + * @param {Float64Array} previousMarkerTransform The float array to use as the previous 3x4 marker transformation matrix + * @param {Float64Array} dst The float array to populate with the 3x4 marker transformation matrix + * @return {Float64Array} The dst array. + */ + ARController.prototype.getTransMatSquareCont = function(markerIndex, markerWidth, previousMarkerTransform, dst) { + this.marker_transform_mat.set(previousMarkerTransform) + artoolkit.getTransMatSquareCont(this.id, markerIndex, markerWidth); + dst.set(this.marker_transform_mat); + return dst; + }; + + /** + * Populates the provided float array with the current transformation for the specified multimarker. After + * a call to detectMarker, all marker information will be current. Marker transformations can then be + * checked. + * + * @param {number} markerUID The unique identifier (UID) of the marker to query + * @param {number} markerWidth The width of the marker + * @param {Float64Array} dst The float array to populate with the 3x4 marker transformation matrix + * @return {Float64Array} The dst array. + */ + ARController.prototype.getTransMatMultiSquare = function(multiMarkerId, dst) { + artoolkit.getTransMatMultiSquare(this.id, multiMarkerId); + dst.set(this.marker_transform_mat); + return dst; + }; + + /** + * Populates the provided float array with the current robust transformation for the specified multimarker. After + * a call to detectMarker, all marker information will be current. Marker transformations can then be + * checked. + * @param {number} markerUID The unique identifier (UID) of the marker to query + * @param {number} markerWidth The width of the marker + * @param {Float64Array} dst The float array to populate with the 3x4 marker transformation matrix + * @return {Float64Array} The dst array. + */ + ARController.prototype.getTransMatMultiSquareRobust = function(multiMarkerId, dst) { + artoolkit.getTransMatMultiSquare(this.id, multiMarkerId); + dst.set(this.marker_transform_mat); + return dst; + }; + + /** + Converts the given 3x4 marker transformation matrix in the 12-element transMat array + into a 4x4 WebGL matrix and writes the result into the 16-element glMat array. + + If scale parameter is given, scales the transform of the glMat by the scale parameter. + + @param {Float64Array} transMat The 3x4 marker transformation matrix. + @param {Float64Array} glMat The 4x4 GL transformation matrix. + @param {number} scale The scale for the transform. + */ + ARController.prototype.transMatToGLMat = function(transMat, glMat, scale) { + glMat[0 + 0*4] = transMat[0]; // R1C1 + glMat[0 + 1*4] = transMat[1]; // R1C2 + glMat[0 + 2*4] = transMat[2]; + glMat[0 + 3*4] = transMat[3]; + glMat[1 + 0*4] = transMat[4]; // R2 + glMat[1 + 1*4] = transMat[5]; + glMat[1 + 2*4] = transMat[6]; + glMat[1 + 3*4] = transMat[7]; + glMat[2 + 0*4] = transMat[8]; // R3 + glMat[2 + 1*4] = transMat[9]; + glMat[2 + 2*4] = transMat[10]; + glMat[2 + 3*4] = transMat[11]; + glMat[3 + 0*4] = 0.0; + glMat[3 + 1*4] = 0.0; + glMat[3 + 2*4] = 0.0; + glMat[3 + 3*4] = 1.0; + if (scale != undefined && scale !== 0.0) { + glMat[12] *= scale; + glMat[13] *= scale; + glMat[14] *= scale; + } + return glMat; + }; + + /** + This is the core ARToolKit marker detection function. It calls through to a set of + internal functions to perform the key marker detection steps of binarization and + labelling, contour extraction, and template matching and/or matrix code extraction. + + Typically, the resulting set of detected markers is retrieved by calling arGetMarkerNum + to get the number of markers detected and arGetMarker to get an array of ARMarkerInfo + structures with information on each detected marker, followed by a step in which + detected markers are possibly examined for some measure of goodness of match (e.g. by + examining the match confidence value) and pose extraction. + + @param {image} Image to be processed to detect markers. + @return {number} 0 if the function proceeded without error, or a value less than 0 in case of error. + A result of 0 does not however, imply any markers were detected. + */ + ARController.prototype.detectMarker = function(image) { + if (this._copyImageToHeap(image)) { + return artoolkit.detectMarker(this.id); + } + return -99; + }; + + /** + Get the number of markers detected in a video frame. + + @return {number} The number of detected markers in the most recent image passed to arDetectMarker. + Note that this is actually a count, not an index. A better name for this function would be + arGetDetectedMarkerCount, but the current name lives on for historical reasons. + */ + ARController.prototype.getMarkerNum = function() { + return artoolkit.getMarkerNum(this.id); + }; + + /** + Get the marker info struct for the given marker index in detected markers. + + Call this.detectMarker first, then use this.getMarkerNum to get the detected marker count. + + The returned object is the global artoolkit.markerInfo object and will be overwritten + by subsequent calls. If you need to hang on to it, create a copy using this.cloneMarkerInfo(); + + Returns undefined if no marker was found. + + A markerIndex of -1 is used to access the global custom marker. + + The fields of the markerInfo struct are: + @field area Area in pixels of the largest connected region, comprising the marker border and regions connected to it. Note that this is + not the same as the actual onscreen area inside the marker border. + @field id If pattern detection mode is either pattern mode OR matrix but not both, will be marker ID (>= 0) if marker is valid, or -1 if invalid. + @field idPatt If pattern detection mode includes a pattern mode, will be marker ID (>= 0) if marker is valid, or -1 if invalid. + @field idMatrix If pattern detection mode includes a matrix mode, will be marker ID (>= 0) if marker is valid, or -1 if invalid. + @field dir If pattern detection mode is either pattern mode OR matrix but not both, and id != -1, will be marker direction (range 0 to 3, inclusive). + @field dirPatt If pattern detection mode includes a pattern mode, and id != -1, will be marker direction (range 0 to 3, inclusive). + @field dirMatrix If pattern detection mode includes a matrix mode, and id != -1, will be marker direction (range 0 to 3, inclusive). + @field cf If pattern detection mode is either pattern mode OR matrix but not both, will be marker matching confidence (range 0.0 to 1.0 inclusive) if marker is valid, or -1.0 if marker is invalid. + @field cfPatt If pattern detection mode includes a pattern mode, will be marker matching confidence (range 0.0 to 1.0 inclusive) if marker is valid, or -1.0 if marker is invalid. + @field cfMatrix If pattern detection mode includes a matrix mode, will be marker matching confidence (range 0.0 to 1.0 inclusive) if marker is valid, or -1.0 if marker is invalid. + @field pos 2D position (in camera image coordinates, origin at top-left) of the centre of the marker. + @field line Line equations for the 4 sides of the marker. + @field vertex 2D positions (in camera image coordinates, origin at top-left) of the corners of the marker. vertex[(4 - dir)%4][] is the top-left corner of the marker. Other vertices proceed clockwise from this. These are idealised coordinates (i.e. the onscreen position aligns correctly with the undistorted camera image.) + + + @param {number} markerIndex The index of the marker to query. + @returns {Object} The markerInfo struct. + */ + ARController.prototype.getMarker = function(markerIndex) { + if (0 === artoolkit.getMarker(this.id, markerIndex)) { + return artoolkit.markerInfo; + } + }; + + /** + Set marker vertices to the given vertexData[4][2] array. + + Sets the marker pos to the center of the vertices. + + Useful for building custom markers for getTransMatSquare. + + A markerIndex of -1 is used to access the global custom marker. + + @param {number} markerIndex The index of the marker to edit. + */ + ARController.prototype.setMarkerInfoVertex = function(markerIndex, vertexData) { + for (var i=0; i<vertexData.length; i++) { + this.marker_transform_mat[i*2+0] = vertexData[i][0]; + this.marker_transform_mat[i*2+1] = vertexData[i][1]; + } + return artoolkit.setMarkerInfoVertex(this.id, markerIndex); + }; + + /** + Makes a deep copy of the given marker info. + + @param {Object} markerInfo The marker info object to copy. + @return {Object} The new copy of the marker info. + */ + ARController.prototype.cloneMarkerInfo = function(markerInfo) { + return JSON.parse(JSON.stringify(markerInfo)); + }; + + /** + Get the marker info struct for the given marker index in detected markers. + + Call this.detectMarker first, then use this.getMarkerNum to get the detected marker count. + + The returned object is the global artoolkit.markerInfo object and will be overwritten + by subsequent calls. If you need to hang on to it, create a copy using this.cloneMarkerInfo(); + + Returns undefined if no marker was found. + + @field {number} pattId The index of the marker. + @field {number} pattType The type of the marker. Either AR_MULTI_PATTERN_TYPE_TEMPLATE or AR_MULTI_PATTERN_TYPE_MATRIX. + @field {number} visible 0 or larger if the marker is visible + @field {number} width The width of the marker. + + @param {number} multiMarkerId The multimarker to query. + @param {number} markerIndex The index of the marker to query. + @returns {Object} The markerInfo struct. + */ + ARController.prototype.getMultiEachMarker = function(multiMarkerId, markerIndex) { + if (0 === artoolkit.getMultiEachMarker(this.id, multiMarkerId, markerIndex)) { + return artoolkit.multiEachMarkerInfo; + } + }; + + + /** + Returns the 16-element WebGL transformation matrix used by ARController.process to + pass marker WebGL matrices to event listeners. + + Unique to each ARController. + + @return {Float64Array} The 16-element WebGL transformation matrix used by the ARController. + */ + ARController.prototype.getTransformationMatrix = function() { + return this.transform_mat; + }; + + /** + * Returns the projection matrix computed from camera parameters for the ARController. + * + * @return {Float64Array} The 16-element WebGL camera matrix for the ARController camera parameters. + */ + ARController.prototype.getCameraMatrix = function() { + return this.camera_mat; + }; + + /** + Returns the shared ARToolKit 3x4 marker transformation matrix, used for passing and receiving + marker transforms to/from the Emscripten side. + + @return {Float64Array} The 12-element 3x4 row-major marker transformation matrix used by ARToolKit. + */ + ARController.prototype.getMarkerTransformationMatrix = function() { + return this.marker_transform_mat; + }; + + + /* Setter / Getter Proxies */ + + /** + * Enables or disables debug mode in the tracker. When enabled, a black and white debug + * image is generated during marker detection. The debug image is useful for visualising + * the binarization process and choosing a threshold value. + * @param {number} debug true to enable debug mode, false to disable debug mode + * @see getDebugMode() + */ + ARController.prototype.setDebugMode = function(mode) { + return artoolkit.setDebugMode(this.id, mode); + }; + + /** + * Returns whether debug mode is currently enabled. + * @return true when debug mode is enabled, false when debug mode is disabled + * @see setDebugMode() + */ + ARController.prototype.getDebugMode = function() { + return artoolkit.getDebugMode(this.id); + }; + + /** + Returns the Emscripten HEAP offset to the debug processing image used by ARToolKit. + + @return {number} HEAP offset to the debug processing image. + */ + ARController.prototype.getProcessingImage = function() { + return artoolkit.getProcessingImage(this.id); + } + + /** + Sets the logging level to use by ARToolKit. + + @param + */ + ARController.prototype.setLogLevel = function(mode) { + return artoolkit.setLogLevel(mode); + }; + + ARController.prototype.getLogLevel = function() { + return artoolkit.getLogLevel(); + }; + + ARController.prototype.setMarkerInfoDir = function(markerIndex, dir) { + return artoolkit.setMarkerInfoDir(this.id, markerIndex, dir); + }; + + ARController.prototype.setProjectionNearPlane = function(value) { + return artoolkit.setProjectionNearPlane(this.id, value); + }; + + ARController.prototype.getProjectionNearPlane = function() { + return artoolkit.getProjectionNearPlane(this.id); + }; + + ARController.prototype.setProjectionFarPlane = function(value) { + return artoolkit.setProjectionFarPlane(this.id, value); + }; + + ARController.prototype.getProjectionFarPlane = function() { + return artoolkit.getProjectionFarPlane(this.id); + }; + + + /** + Set the labeling threshold mode (auto/manual). + + @param {number} mode An integer specifying the mode. One of: + AR_LABELING_THRESH_MODE_MANUAL, + AR_LABELING_THRESH_MODE_AUTO_MEDIAN, + AR_LABELING_THRESH_MODE_AUTO_OTSU, + AR_LABELING_THRESH_MODE_AUTO_ADAPTIVE, + AR_LABELING_THRESH_MODE_AUTO_BRACKETING + */ + ARController.prototype.setThresholdMode = function(mode) { + return artoolkit.setThresholdMode(this.id, mode); + }; + + /** + * Gets the current threshold mode used for image binarization. + * @return {number} The current threshold mode + * @see getVideoThresholdMode() + */ + ARController.prototype.getThresholdMode = function() { + return artoolkit.getThresholdMode(this.id); + }; + + /** + Set the labeling threshhold. + + This function forces sets the threshold value. + The default value is AR_DEFAULT_LABELING_THRESH which is 100. + + The current threshold mode is not affected by this call. + Typically, this function is used when labeling threshold mode + is AR_LABELING_THRESH_MODE_MANUAL. + + The threshold value is not relevant if threshold mode is + AR_LABELING_THRESH_MODE_AUTO_ADAPTIVE. + + Background: The labeling threshold is the value which + the AR library uses to differentiate between black and white + portions of an ARToolKit marker. Since the actual brightness, + contrast, and gamma of incoming images can vary signficantly + between different cameras and lighting conditions, this + value typically needs to be adjusted dynamically to a + suitable midpoint between the observed values for black + and white portions of the markers in the image. + + @param {number} thresh An integer in the range [0,255] (inclusive). + */ + ARController.prototype.setThreshold = function(threshold) { + return artoolkit.setThreshold(this.id, threshold); + }; + + /** + Get the current labeling threshold. + + This function queries the current labeling threshold. For, + AR_LABELING_THRESH_MODE_AUTO_MEDIAN, AR_LABELING_THRESH_MODE_AUTO_OTSU, + and AR_LABELING_THRESH_MODE_AUTO_BRACKETING + the threshold value is only valid until the next auto-update. + + The current threshold mode is not affected by this call. + + The threshold value is not relevant if threshold mode is + AR_LABELING_THRESH_MODE_AUTO_ADAPTIVE. + + @return {number} The current threshold value. + */ + ARController.prototype.getThreshold = function() { + return artoolkit.getThreshold(this.id); + }; + + + /** + Set the pattern detection mode + + The pattern detection determines the method by which ARToolKit + matches detected squares in the video image to marker templates + and/or IDs. ARToolKit v4.x can match against pictorial "template" markers, + whose pattern files are created with the mk_patt utility, in either colour + or mono, and additionally can match against 2D-barcode-type "matrix" + markers, which have an embedded marker ID. Two different two-pass modes + are also available, in which a matrix-detection pass is made first, + followed by a template-matching pass. + + @param {number} mode + Options for this field are: + AR_TEMPLATE_MATCHING_COLOR + AR_TEMPLATE_MATCHING_MONO + AR_MATRIX_CODE_DETECTION + AR_TEMPLATE_MATCHING_COLOR_AND_MATRIX + AR_TEMPLATE_MATCHING_MONO_AND_MATRIX + The default mode is AR_TEMPLATE_MATCHING_COLOR. + */ + ARController.prototype.setPatternDetectionMode = function(value) { + return artoolkit.setPatternDetectionMode(this.id, value); + }; + + /** + Returns the current pattern detection mode. + + @return {number} The current pattern detection mode. + */ + ARController.prototype.getPatternDetectionMode = function() { + return artoolkit.getPatternDetectionMode(this.id); + }; + + /** + Set the size and ECC algorithm to be used for matrix code (2D barcode) marker detection. + + When matrix-code (2D barcode) marker detection is enabled (see arSetPatternDetectionMode) + then the size of the barcode pattern and the type of error checking and correction (ECC) + with which the markers were produced can be set via this function. + + This setting is global to a given ARHandle; It is not possible to have two different matrix + code types in use at once. + + @param type The type of matrix code (2D barcode) in use. Options include: + AR_MATRIX_CODE_3x3 + AR_MATRIX_CODE_3x3_HAMMING63 + AR_MATRIX_CODE_3x3_PARITY65 + AR_MATRIX_CODE_4x4 + AR_MATRIX_CODE_4x4_BCH_13_9_3 + AR_MATRIX_CODE_4x4_BCH_13_5_5 + The default mode is AR_MATRIX_CODE_3x3. + */ + ARController.prototype.setMatrixCodeType = function(value) { + return artoolkit.setMatrixCodeType(this.id, value); + }; + + /** + Returns the current matrix code (2D barcode) marker detection type. + + @return {number} The current matrix code type. + */ + ARController.prototype.getMatrixCodeType = function() { + return artoolkit.getMatrixCodeType(this.id); + }; + + /** + Select between detection of black markers and white markers. + + ARToolKit's labelling algorithm can work with both black-bordered + markers on a white background (AR_LABELING_BLACK_REGION) or + white-bordered markers on a black background (AR_LABELING_WHITE_REGION). + This function allows you to specify the type of markers to look for. + Note that this does not affect the pattern-detection algorith + which works on the interior of the marker. + + @param {number} mode + Options for this field are: + AR_LABELING_WHITE_REGION + AR_LABELING_BLACK_REGION + The default mode is AR_LABELING_BLACK_REGION. + */ + ARController.prototype.setLabelingMode = function(value) { + return artoolkit.setLabelingMode(this.id, value); + }; + + /** + Enquire whether detection is looking for black markers or white markers. + + See discussion for setLabelingMode. + + @result {number} The current labeling mode. + */ + ARController.prototype.getLabelingMode = function() { + return artoolkit.getLabelingMode(this.id); + }; + + /** + Set the width/height of the marker pattern space, as a proportion of marker width/height. + + @param {number} pattRatio The the width/height of the marker pattern space, as a proportion of marker + width/height. To set the default, pass AR_PATT_RATIO. + If compatibility with ARToolKit verions 1.0 through 4.4 is required, this value + must be 0.5. + */ + ARController.prototype.setPattRatio = function(value) { + return artoolkit.setPattRatio(this.id, value); + }; + + /** + Returns the current ratio of the marker pattern to the total marker size. + + @return {number} The current pattern ratio. + */ + ARController.prototype.getPattRatio = function() { + return artoolkit.getPattRatio(this.id); + }; + + /** + Set the image processing mode. + + When the image processing mode is AR_IMAGE_PROC_FRAME_IMAGE, + ARToolKit processes all pixels in each incoming image + to locate markers. When the mode is AR_IMAGE_PROC_FIELD_IMAGE, + ARToolKit processes pixels in only every second pixel row and + column. This is useful both for handling images from interlaced + video sources (where alternate lines are assembled from alternate + fields and thus have one field time-difference, resulting in a + "comb" effect) such as Digital Video cameras. + The effective reduction by 75% in the pixels processed also + has utility in accelerating tracking by effectively reducing + the image size to one quarter size, at the cost of pose accuraccy. + + @param {number} mode + Options for this field are: + AR_IMAGE_PROC_FRAME_IMAGE + AR_IMAGE_PROC_FIELD_IMAGE + The default mode is AR_IMAGE_PROC_FRAME_IMAGE. + */ + ARController.prototype.setImageProcMode = function(value) { + return artoolkit.setImageProcMode(this.id, value); + }; + + /** + Get the image processing mode. + + See arSetImageProcMode() for a complete description. + + @return {number} The current image processing mode. + */ + ARController.prototype.getImageProcMode = function() { + return artoolkit.getImageProcMode(this.id); + }; + + + /** + Draw the black and white image and debug markers to the ARController canvas. + + See setDebugMode. + */ + ARController.prototype.debugDraw = function() { + var debugBuffer = new Uint8ClampedArray(Module.HEAPU8.buffer, this._bwpointer, this.framesize); + var id = new ImageData(debugBuffer, this.canvas.width, this.canvas.height) + this.ctx.putImageData(id, 0, 0) + + var marker_num = this.getMarkerNum(); + for (var i=0; i<marker_num; i++) { + this._debugMarker(this.getMarker(i)); + } + }; + + + // private + + ARController.prototype._initialize = function() { + this.id = artoolkit.setup(this.canvas.width, this.canvas.height, this.cameraParam.id); + + var params = artoolkit.frameMalloc; + this.framepointer = params.framepointer; + this.framesize = params.framesize; + + this.dataHeap = new Uint8Array(Module.HEAPU8.buffer, this.framepointer, this.framesize); + + this.camera_mat = new Float64Array(Module.HEAPU8.buffer, params.camera, 16); + this.marker_transform_mat = new Float64Array(Module.HEAPU8.buffer, params.transform, 12); + + this.setProjectionNearPlane(0.1) + this.setProjectionFarPlane(1000); + + var self = this; + setTimeout(function() { + if (self.onload) { + self.onload(); + } + self.dispatchEvent({ + name: 'load', + target: self + }); + }, 1); + }; +/* + ARController.prototype._copyImageToHeap = function(image) { + if (!image) { + image = this.image; + } + + + // if (this.orientation === 'portrait') { + // this.ctx.save(); + // this.ctx.translate(this.canvas.width, 0); + // this.ctx.rotate(Math.PI/2); + // this.ctx.drawImage(image, 0, 0, this.canvas.height, this.canvas.width); // draw video + // this.ctx.restore(); + // } else { + // debugger + // this.ctx.drawImage(image, 0, 0, this.canvas.width, this.canvas.height); // draw video + // } + + + this.ctx.drawImage(image, 0, 0, this.canvas.width, this.canvas.height); // draw video + var imageData = this.ctx.getImageData(0, 0, this.canvas.width, this.canvas.height); + var data = imageData.data; + + if (this.dataHeap) { + this.dataHeap.set( data ); + return true; + } + return false; + }; +*/ + + ARController.prototype._copyImageToHeap = function(image) { + if (!image) { + image = this.image; + } + + if( (image.nodeName === 'IMG' && image.width > image.height ) || + (image.nodeName === 'VIDEO' && image.videoWidth > image.videoHeight) ){ + // if landscape + this.ctx.drawImage(image, 0, 0, this.canvas.width, this.canvas.height); // draw video + }else{ + // if portrait + this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height); + var scale = this.canvas.height / this.canvas.width; + var scaledHeight = this.canvas.width*scale; + var scaledWidth = this.canvas.height*scale; + var marginLeft = ( this.canvas.width - scaledWidth)/2; + this.ctx.drawImage(image, marginLeft, 0, scaledWidth, scaledHeight); // draw video + } + + var imageData = this.ctx.getImageData(0, 0, this.canvas.width, this.canvas.height); + var data = imageData.data; + + if (this.dataHeap) { + this.dataHeap.set( data ); + return true; + } + return false; + }; + + ARController.prototype._debugMarker = function(marker) { + var vertex, pos; + vertex = marker.vertex; + var ctx = this.ctx; + ctx.strokeStyle = 'red'; + + ctx.beginPath() + ctx.moveTo(vertex[0][0], vertex[0][1]) + ctx.lineTo(vertex[1][0], vertex[1][1]) + ctx.stroke(); + + ctx.beginPath() + ctx.moveTo(vertex[2][0], vertex[2][1]) + ctx.lineTo(vertex[3][0], vertex[3][1]) + ctx.stroke() + + ctx.strokeStyle = 'green'; + ctx.beginPath() + ctx.lineTo(vertex[1][0], vertex[1][1]) + ctx.lineTo(vertex[2][0], vertex[2][1]) + ctx.stroke(); + + ctx.beginPath() + ctx.moveTo(vertex[3][0], vertex[3][1]) + ctx.lineTo(vertex[0][0], vertex[0][1]) + ctx.stroke(); + + pos = marker.pos + ctx.beginPath() + ctx.arc(pos[0], pos[1], 8, 0, Math.PI * 2) + ctx.fillStyle = 'red' + ctx.fill() + }; + + + // static + + /** + ARController.getUserMedia gets a device camera video feed and calls the given onSuccess callback with it. + + Tries to start playing the video. Playing the video can fail on Chrome for Android, + so ARController.getUserMedia adds user input event listeners to the window + that try to start playing the video. On success, the event listeners are removed. + + To use ARController.getUserMedia, call it with an object with the onSuccess attribute set to a callback function. + + ARController.getUserMedia({ + onSuccess: function(video) { + console.log("Got video", video); + } + }); + + The configuration object supports the following attributes: + + { + onSuccess : function(video), + onError : function(error), + + width : number | {min: number, ideal: number, max: number}, + height : number | {min: number, ideal: number, max: number}, + + facingMode : 'environment' | 'user' | 'left' | 'right' | { exact: 'environment' | ... } + } + + See https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia for more information about the + width, height and facingMode attributes. + + @param {object} configuration The configuration object. + @return {VideoElement} Returns the created video element. + */ + ARController.getUserMedia = function(configuration) { + var facing = configuration.facingMode || 'environment'; + + var onSuccess = configuration.onSuccess; + var onError = configuration.onError || function(err) { console.error("ARController.getUserMedia", err); }; + + var video = document.createElement('video'); + + var initProgress = function() { + if (this.videoWidth !== 0) { + onSuccess(video); + } + }; + + var readyToPlay = false; + var eventNames = [ + 'touchstart', 'touchend', 'touchmove', 'touchcancel', + 'click', 'mousedown', 'mouseup', 'mousemove', + 'keydown', 'keyup', 'keypress', 'scroll' + ]; + var play = function(ev) { + if (readyToPlay) { + video.play(); + if (!video.paused) { + eventNames.forEach(function(eventName) { + window.removeEventListener(eventName, play, true); + }); + } + } + }; + eventNames.forEach(function(eventName) { + window.addEventListener(eventName, play, true); + }); + + var success = function(stream) { + video.addEventListener('loadedmetadata', initProgress, false); + video.src = window.URL.createObjectURL(stream); + readyToPlay = true; + play(); // Try playing without user input, should work on non-Android Chrome + }; + + var constraints = {}; + var mediaDevicesConstraints = {}; + if (configuration.width) { + mediaDevicesConstraints.width = configuration.width; + if (typeof configuration.width === 'object') { + if (configuration.width.max) { + constraints.maxWidth = configuration.width.max; + } + if (configuration.width.min) { + constraints.minWidth = configuration.width.max; + } + } else { + constraints.maxWidth = configuration.width; + } + } + + if (configuration.height) { + mediaDevicesConstraints.height = configuration.height; + if (typeof configuration.height === 'object') { + if (configuration.height.max) { + constraints.maxHeight = configuration.height.max; + } + if (configuration.height.min) { + constraints.minHeight = configuration.height.max; + } + } else { + constraints.maxHeight = configuration.height; + } + } + + mediaDevicesConstraints.facingMode = facing; + + navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia; + var hdConstraints = { + audio: false, + video: { + mandatory: constraints + } + }; + + if ( false ) { + // if ( navigator.mediaDevices || window.MediaStreamTrack) { + if (navigator.mediaDevices) { + navigator.mediaDevices.getUserMedia({ + audio: false, + video: mediaDevicesConstraints + }).then(success, onError); + } else { + MediaStreamTrack.getSources(function(sources) { + var facingDir = mediaDevicesConstraints.facingMode; + if (facing && facing.exact) { + facingDir = facing.exact; + } + for (var i=0; i<sources.length; i++) { + if (sources[i].kind === 'video' && sources[i].facing === facingDir) { + hdConstraints.video.mandatory.sourceId = sources[i].id; + break; + } + } + if (facing && facing.exact && !hdConstraints.video.mandatory.sourceId) { + onError('Failed to get camera facing the wanted direction'); + } else { + if (navigator.getUserMedia) { + navigator.getUserMedia(hdConstraints, success, onError); + } else { + onError('navigator.getUserMedia is not supported on your browser'); + } + } + }); + } + } else { + if (navigator.getUserMedia) { + navigator.getUserMedia(hdConstraints, success, onError); + } else { + onError('navigator.getUserMedia is not supported on your browser'); + } + } + + return video; + }; + + /** + ARController.getUserMediaARController gets an ARController for the device camera video feed and calls the + given onSuccess callback with it. + + To use ARController.getUserMediaARController, call it with an object with the cameraParam attribute set to + a camera parameter file URL, and the onSuccess attribute set to a callback function. + + ARController.getUserMediaARController({ + cameraParam: 'Data/camera_para.dat', + onSuccess: function(arController, arCameraParam) { + console.log("Got ARController", arController); + console.log("Got ARCameraParam", arCameraParam); + console.log("Got video", arController.image); + } + }); + + The configuration object supports the following attributes: + + { + onSuccess : function(ARController, ARCameraParam), + onError : function(error), + + cameraParam: url, // URL to camera parameters definition file. + maxARVideoSize: number, // Maximum max(width, height) for the AR processing canvas. + + width : number | {min: number, ideal: number, max: number}, + height : number | {min: number, ideal: number, max: number}, + + facingMode : 'environment' | 'user' | 'left' | 'right' | { exact: 'environment' | ... } + } + + See https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia for more information about the + width, height and facingMode attributes. + + The orientation attribute of the returned ARController is set to "portrait" if the userMedia video has larger + height than width. Otherwise it's set to "landscape". The videoWidth and videoHeight attributes of the arController + are set to be always in landscape configuration so that width is larger than height. + + @param {object} configuration The configuration object. + @return {VideoElement} Returns the created video element. + */ + ARController.getUserMediaARController = function(configuration) { + var obj = {}; + for (var i in configuration) { + obj[i] = configuration[i]; + } + var onSuccess = configuration.onSuccess; + var cameraParamURL = configuration.cameraParam; + + obj.onSuccess = function() { + new ARCameraParam(cameraParamURL, function() { + var arCameraParam = this; + var maxSize = configuration.maxARVideoSize || Math.max(video.videoWidth, video.videoHeight); + var f = maxSize / Math.max(video.videoWidth, video.videoHeight); + var w = f * video.videoWidth; + var h = f * video.videoHeight; + if (video.videoWidth < video.videoHeight) { + var tmp = w; + w = h; + h = tmp; + } + var arController = new ARController(w, h, arCameraParam); + arController.image = video; + if (video.videoWidth < video.videoHeight) { + arController.orientation = 'portrait'; + arController.videoWidth = video.videoHeight; + arController.videoHeight = video.videoWidth; + } else { + arController.orientation = 'landscape'; + arController.videoWidth = video.videoWidth; + arController.videoHeight = video.videoHeight; + } + onSuccess(arController, arCameraParam); + }, function(err) { + console.error("ARController: Failed to load ARCameraParam", err); + }); + }; + + var video = this.getUserMedia(obj); + return video; + }; + + + /** + ARCameraParam is used for loading AR camera parameters for use with ARController. + Use by passing in an URL and a callback function. + + var camera = new ARCameraParam('Data/camera_para.dat', function() { + console.log('loaded camera', this.id); + }, + function(err) { + console.log('failed to load camera', err); + }); + + @exports ARCameraParam + @constructor + + @param {string} src URL to load camera parameters from. + @param {string} onload Onload callback to be called on successful parameter loading. + @param {string} onerror Error callback to called when things don't work out. + */ + var ARCameraParam = function(src, onload, onerror) { + this.id = -1; + this._src = ''; + this.complete = false; + this.onload = onload; + this.onerror = onerror; + if (src) { + this.load(src); + } + }; + + /** + Loads the given URL as camera parameters definition file into this ARCameraParam. + + Can only be called on an unloaded ARCameraParam instance. + + @param {string} src URL to load. + */ + ARCameraParam.prototype.load = function(src) { + if (this._src !== '') { + throw("ARCameraParam: Trying to load camera parameters twice.") + } + this._src = src; + if (src) { + var self = this; + artoolkit.loadCamera(src, function(id) { + self.id = id; + self.complete = true; + self.onload(); + }, function(err) { + self.onerror(err); + }); + } + }; + + Object.defineProperty(ARCameraParam.prototype, 'src', { + set: function(src) { + this.load(src); + }, + get: function() { + return this._src; + } + }); + + /** + Destroys the camera parameter and frees associated Emscripten resources. + + */ + ARCameraParam.prototype.dispose = function() { + if (this.id !== -1) { + artoolkit.deleteCamera(this.id); + } + this.id = -1; + this._src = ''; + this.complete = false; + }; + + + + // ARToolKit exported JS API + // + var artoolkit = { + + UNKNOWN_MARKER: -1, + PATTERN_MARKER: 0, + BARCODE_MARKER: 1, + + loadCamera: loadCamera, + + addMarker: addMarker, + addMultiMarker: addMultiMarker, + + }; + + var FUNCTIONS = [ + 'setup', + 'teardown', + + 'setLogLevel', + 'getLogLevel', + + 'setDebugMode', + 'getDebugMode', + + 'getProcessingImage', + + 'setMarkerInfoDir', + 'setMarkerInfoVertex', + + 'getTransMatSquare', + 'getTransMatSquareCont', + + 'getTransMatMultiSquare', + 'getTransMatMultiSquareRobust', + + 'getMultiMarkerNum', + 'getMultiMarkerCount', + + 'detectMarker', + 'getMarkerNum', + + 'getMarker', + 'getMultiEachMarker', + + 'setProjectionNearPlane', + 'getProjectionNearPlane', + + 'setProjectionFarPlane', + 'getProjectionFarPlane', + + 'setThresholdMode', + 'getThresholdMode', + + 'setThreshold', + 'getThreshold', + + 'setPatternDetectionMode', + 'getPatternDetectionMode', + + 'setMatrixCodeType', + 'getMatrixCodeType', + + 'setLabelingMode', + 'getLabelingMode', + + 'setPattRatio', + 'getPattRatio', + + 'setImageProcMode', + 'getImageProcMode', + ]; + + function runWhenLoaded() { + FUNCTIONS.forEach(function(n) { + artoolkit[n] = Module[n]; + }) + + for (var m in Module) { + if (m.match(/^AR/)) + artoolkit[m] = Module[m]; + } + } + + var marker_count = 0; + function addMarker(arId, url, callback) { + var filename = '/marker_' + marker_count++; + ajax(url, filename, function() { + var id = Module._addMarker(arId, filename); + if (callback) callback(id); + }); + } + + function bytesToString(array) { + return String.fromCharCode.apply(String, array); + } + + function parseMultiFile(bytes) { + var str = bytesToString(bytes); + + var lines = str.split('\n'); + + var files = []; + + var state = 0; // 0 - read, + var markers = 0; + + lines.forEach(function(line) { + line = line.trim(); + if (!line || line.startsWith('#')) return; + + switch (state) { + case 0: + markers = +line; + state = 1; + return; + case 1: // filename or barcode + if (!line.match(/^\d+$/)) { + files.push(line); + } + case 2: // width + case 3: // matrices + case 4: + state++; + return; + case 5: + state = 1; + return; + } + }); + + return files; + } + + var multi_marker_count = 0; + + function addMultiMarker(arId, url, callback) { + var filename = '/multi_marker_' + multi_marker_count++; + ajax(url, filename, function(bytes) { + var files = parseMultiFile(bytes); + + function ok() { + var markerID = Module._addMultiMarker(arId, filename); + var markerNum = Module.getMultiMarkerNum(arId, markerID); + if (callback) callback(markerID, markerNum); + } + + if (!files.length) return ok(); + + var path = url.split('/').slice(0, -1).join('/') + files = files.map(function(file) { + // FIXME super kludge - remove it + // console.assert(file !== '') + if( file === 'patt.hiro' || file === 'patt.kanji' || file === 'patt2.hiro' || file === 'patt2.kanji' ){ + // debugger + return ['http://127.0.0.1:8080/data/data/' + file, file] + } + return [path + '/' + file, file] + }) + ajaxDependencies(files, ok); + }); + } + + var camera_count = 0; + function loadCamera(url, callback) { + var filename = '/camera_param_' + camera_count++; + var writeCallback = function() { + var id = Module._loadCamera(filename); + if (callback) callback(id); + }; + if (typeof url === 'object') { // Maybe it's a byte array + writeByteArrayToFS(filename, url, writeCallback); + } else if (url.indexOf("\n") > -1) { // Or a string with the camera param + writeStringToFS(filename, url, writeCallback); + } else { + ajax(url, filename, writeCallback); + } + } + + + // transfer image + + function writeStringToFS(target, string, callback) { + var byteArray = new Uint8Array(string.length); + for (var i=0; i<byteArray.length; i++) { + byteArray[i] = string.charCodeAt(i) & 0xff; + } + writeByteArrayToFS(target, byteArray, callback); + } + + function writeByteArrayToFS(target, byteArray, callback) { + FS.writeFile(target, byteArray, { encoding: 'binary' }); + // console.log('FS written', target); + + callback(byteArray); + } + + // Eg. + // ajax('../bin/Data2/markers.dat', '/Data2/markers.dat', callback); + // ajax('../bin/Data/patt.hiro', '/patt.hiro', callback); + + function ajax(url, target, callback) { + var oReq = new XMLHttpRequest(); + oReq.open('GET', url, true); + oReq.responseType = 'arraybuffer'; // blob arraybuffer + + oReq.onload = function(oEvent) { + // console.log('ajax done for ', url); + var arrayBuffer = oReq.response; + var byteArray = new Uint8Array(arrayBuffer); + // console.log('writeByteArrayToFS', target, byteArray.length, 'byte. url', url) + writeByteArrayToFS(target, byteArray, callback); + }; + + oReq.send(); + } + + function ajaxDependencies(files, callback) { + var next = files.pop(); + if (next) { + ajax(next[0], next[1], function() { + ajaxDependencies(files, callback); + }); + } else { + callback(); + } + } + + /* Exports */ + window.artoolkit = artoolkit; + window.ARController = ARController; + window.ARCameraParam = ARCameraParam; + + if (window.Module) { + runWhenLoaded(); + } else { + window.Module = { + onRuntimeInitialized: function() { + runWhenLoaded(); + } + }; + } + +})(); diff --git a/1_Three.js/6_AR/jsartoolkit5/artoolkit.debug.js b/1_Three.js/6_AR/jsartoolkit5/artoolkit.debug.js new file mode 100755 index 0000000000000000000000000000000000000000..5b94e83968fcdc14bb7b6375525fcda8b4997bce --- /dev/null +++ b/1_Three.js/6_AR/jsartoolkit5/artoolkit.debug.js @@ -0,0 +1,74365 @@ +// The Module object: Our interface to the outside world. We import +// and export values on it, and do the work to get that through +// closure compiler if necessary. There are various ways Module can be used: +// 1. Not defined. We create it here +// 2. A function parameter, function(Module) { ..generated code.. } +// 3. pre-run appended it, var Module = {}; ..generated code.. +// 4. External script tag defines var Module. +// We need to do an eval in order to handle the closure compiler +// case, where this code here is minified but Module was defined +// elsewhere (e.g. case 4 above). We also need to check if Module +// already exists (e.g. case 3 above). +// Note that if you want to run closure, and also to use Module +// after the generated code, you will need to define var Module = {}; +// before the code. Then that object will be used in the code, and you +// can continue to use Module afterwards as well. +var Module; +if (!Module) Module = (typeof Module !== 'undefined' ? Module : null) || {}; + +// Sometimes an existing Module object exists with properties +// meant to overwrite the default module functionality. Here +// we collect those properties and reapply _after_ we configure +// the current environment's defaults to avoid having to be so +// defensive during initialization. +var moduleOverrides = {}; +for (var key in Module) { + if (Module.hasOwnProperty(key)) { + moduleOverrides[key] = Module[key]; + } +} + +// The environment setup code below is customized to use Module. +// *** Environment setup code *** +var ENVIRONMENT_IS_WEB = typeof window === 'object'; +// Three configurations we can be running in: +// 1) We could be the application main() thread running in the main JS UI thread. (ENVIRONMENT_IS_WORKER == false and ENVIRONMENT_IS_PTHREAD == false) +// 2) We could be the application main() thread proxied to worker. (with Emscripten -s PROXY_TO_WORKER=1) (ENVIRONMENT_IS_WORKER == true, ENVIRONMENT_IS_PTHREAD == false) +// 3) We could be an application pthread running in a worker. (ENVIRONMENT_IS_WORKER == true and ENVIRONMENT_IS_PTHREAD == true) +var ENVIRONMENT_IS_WORKER = typeof importScripts === 'function'; +var ENVIRONMENT_IS_NODE = typeof process === 'object' && typeof require === 'function' && !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_WORKER; +var ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; + +if (ENVIRONMENT_IS_NODE) { + // Expose functionality in the same simple way that the shells work + // Note that we pollute the global namespace here, otherwise we break in node + if (!Module['print']) Module['print'] = function print(x) { + process['stdout'].write(x + '\n'); + }; + if (!Module['printErr']) Module['printErr'] = function printErr(x) { + process['stderr'].write(x + '\n'); + }; + + var nodeFS = require('fs'); + var nodePath = require('path'); + + Module['read'] = function read(filename, binary) { + filename = nodePath['normalize'](filename); + var ret = nodeFS['readFileSync'](filename); + // The path is absolute if the normalized version is the same as the resolved. + if (!ret && filename != nodePath['resolve'](filename)) { + filename = path.join(__dirname, '..', 'src', filename); + ret = nodeFS['readFileSync'](filename); + } + if (ret && !binary) ret = ret.toString(); + return ret; + }; + + Module['readBinary'] = function readBinary(filename) { + var ret = Module['read'](filename, true); + if (!ret.buffer) { + ret = new Uint8Array(ret); + } + assert(ret.buffer); + return ret; + }; + + Module['load'] = function load(f) { + globalEval(read(f)); + }; + + if (!Module['thisProgram']) { + if (process['argv'].length > 1) { + Module['thisProgram'] = process['argv'][1].replace(/\\/g, '/'); + } else { + Module['thisProgram'] = 'unknown-program'; + } + } + + Module['arguments'] = process['argv'].slice(2); + + if (typeof module !== 'undefined') { + module['exports'] = Module; + } + + process['on']('uncaughtException', function(ex) { + // suppress ExitStatus exceptions from showing an error + if (!(ex instanceof ExitStatus)) { + throw ex; + } + }); + + Module['inspect'] = function () { return '[Emscripten Module object]'; }; +} +else if (ENVIRONMENT_IS_SHELL) { + if (!Module['print']) Module['print'] = print; + if (typeof printErr != 'undefined') Module['printErr'] = printErr; // not present in v8 or older sm + + if (typeof read != 'undefined') { + Module['read'] = read; + } else { + Module['read'] = function read() { throw 'no read() available (jsc?)' }; + } + + Module['readBinary'] = function readBinary(f) { + if (typeof readbuffer === 'function') { + return new Uint8Array(readbuffer(f)); + } + var data = read(f, 'binary'); + assert(typeof data === 'object'); + return data; + }; + + if (typeof scriptArgs != 'undefined') { + Module['arguments'] = scriptArgs; + } else if (typeof arguments != 'undefined') { + Module['arguments'] = arguments; + } + +} +else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { + Module['read'] = function read(url) { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, false); + xhr.send(null); + return xhr.responseText; + }; + + if (typeof arguments != 'undefined') { + Module['arguments'] = arguments; + } + + if (typeof console !== 'undefined') { + if (!Module['print']) Module['print'] = function print(x) { + console.log(x); + }; + if (!Module['printErr']) Module['printErr'] = function printErr(x) { + console.log(x); + }; + } else { + // Probably a worker, and without console.log. We can do very little here... + var TRY_USE_DUMP = false; + if (!Module['print']) Module['print'] = (TRY_USE_DUMP && (typeof(dump) !== "undefined") ? (function(x) { + dump(x); + }) : (function(x) { + // self.postMessage(x); // enable this if you want stdout to be sent as messages + })); + } + + if (ENVIRONMENT_IS_WORKER) { + Module['load'] = importScripts; + } + + if (typeof Module['setWindowTitle'] === 'undefined') { + Module['setWindowTitle'] = function(title) { document.title = title }; + } +} +else { + // Unreachable because SHELL is dependant on the others + throw 'Unknown runtime environment. Where are we?'; +} + +function globalEval(x) { + eval.call(null, x); +} +if (!Module['load'] && Module['read']) { + Module['load'] = function load(f) { + globalEval(Module['read'](f)); + }; +} +if (!Module['print']) { + Module['print'] = function(){}; +} +if (!Module['printErr']) { + Module['printErr'] = Module['print']; +} +if (!Module['arguments']) { + Module['arguments'] = []; +} +if (!Module['thisProgram']) { + Module['thisProgram'] = './this.program'; +} + +// *** Environment setup code *** + +// Closure helpers +Module.print = Module['print']; +Module.printErr = Module['printErr']; + +// Callbacks +Module['preRun'] = []; +Module['postRun'] = []; + +// Merge back in the overrides +for (var key in moduleOverrides) { + if (moduleOverrides.hasOwnProperty(key)) { + Module[key] = moduleOverrides[key]; + } +} + + + +// === Preamble library stuff === + +// Documentation for the public APIs defined in this file must be updated in: +// site/source/docs/api_reference/preamble.js.rst +// A prebuilt local version of the documentation is available at: +// site/build/text/docs/api_reference/preamble.js.txt +// You can also build docs locally as HTML or other formats in site/ +// An online HTML version (which may be of a different version of Emscripten) +// is up at http://kripken.github.io/emscripten-site/docs/api_reference/preamble.js.html + +//======================================== +// Runtime code shared with compiler +//======================================== + +var Runtime = { + setTempRet0: function (value) { + tempRet0 = value; + }, + getTempRet0: function () { + return tempRet0; + }, + stackSave: function () { + return STACKTOP; + }, + stackRestore: function (stackTop) { + STACKTOP = stackTop; + }, + getNativeTypeSize: function (type) { + switch (type) { + case 'i1': case 'i8': return 1; + case 'i16': return 2; + case 'i32': return 4; + case 'i64': return 8; + case 'float': return 4; + case 'double': return 8; + default: { + if (type[type.length-1] === '*') { + return Runtime.QUANTUM_SIZE; // A pointer + } else if (type[0] === 'i') { + var bits = parseInt(type.substr(1)); + assert(bits % 8 === 0); + return bits/8; + } else { + return 0; + } + } + } + }, + getNativeFieldSize: function (type) { + return Math.max(Runtime.getNativeTypeSize(type), Runtime.QUANTUM_SIZE); + }, + STACK_ALIGN: 16, + prepVararg: function (ptr, type) { + if (type === 'double' || type === 'i64') { + // move so the load is aligned + if (ptr & 7) { + assert((ptr & 7) === 4); + ptr += 4; + } + } else { + assert((ptr & 3) === 0); + } + return ptr; + }, + getAlignSize: function (type, size, vararg) { + // we align i64s and doubles on 64-bit boundaries, unlike x86 + if (!vararg && (type == 'i64' || type == 'double')) return 8; + if (!type) return Math.min(size, 8); // align structures internally to 64 bits + return Math.min(size || (type ? Runtime.getNativeFieldSize(type) : 0), Runtime.QUANTUM_SIZE); + }, + dynCall: function (sig, ptr, args) { + if (args && args.length) { + assert(args.length == sig.length-1); + if (!args.splice) args = Array.prototype.slice.call(args); + args.splice(0, 0, ptr); + assert(('dynCall_' + sig) in Module, 'bad function pointer type - no table for sig \'' + sig + '\''); + return Module['dynCall_' + sig].apply(null, args); + } else { + assert(sig.length == 1); + assert(('dynCall_' + sig) in Module, 'bad function pointer type - no table for sig \'' + sig + '\''); + return Module['dynCall_' + sig].call(null, ptr); + } + }, + functionPointers: [], + addFunction: function (func) { + for (var i = 0; i < Runtime.functionPointers.length; i++) { + if (!Runtime.functionPointers[i]) { + Runtime.functionPointers[i] = func; + return 2*(1 + i); + } + } + throw 'Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS.'; + }, + removeFunction: function (index) { + Runtime.functionPointers[(index-2)/2] = null; + }, + warnOnce: function (text) { + if (!Runtime.warnOnce.shown) Runtime.warnOnce.shown = {}; + if (!Runtime.warnOnce.shown[text]) { + Runtime.warnOnce.shown[text] = 1; + Module.printErr(text); + } + }, + funcWrappers: {}, + getFuncWrapper: function (func, sig) { + assert(sig); + if (!Runtime.funcWrappers[sig]) { + Runtime.funcWrappers[sig] = {}; + } + var sigCache = Runtime.funcWrappers[sig]; + if (!sigCache[func]) { + sigCache[func] = function dynCall_wrapper() { + return Runtime.dynCall(sig, func, arguments); + }; + } + return sigCache[func]; + }, + getCompilerSetting: function (name) { + throw 'You must build with -s RETAIN_COMPILER_SETTINGS=1 for Runtime.getCompilerSetting or emscripten_get_compiler_setting to work'; + }, + stackAlloc: function (size) { var ret = STACKTOP;STACKTOP = (STACKTOP + size)|0;STACKTOP = (((STACKTOP)+15)&-16);(assert((((STACKTOP|0) < (STACK_MAX|0))|0))|0); return ret; }, + staticAlloc: function (size) { var ret = STATICTOP;STATICTOP = (STATICTOP + (assert(!staticSealed),size))|0;STATICTOP = (((STATICTOP)+15)&-16); return ret; }, + dynamicAlloc: function (size) { var ret = DYNAMICTOP;DYNAMICTOP = (DYNAMICTOP + (assert(DYNAMICTOP > 0),size))|0;DYNAMICTOP = (((DYNAMICTOP)+15)&-16); if (DYNAMICTOP >= TOTAL_MEMORY) { var success = enlargeMemory(); if (!success) { DYNAMICTOP = ret; return 0; } }; return ret; }, + alignMemory: function (size,quantum) { var ret = size = Math.ceil((size)/(quantum ? quantum : 16))*(quantum ? quantum : 16); return ret; }, + makeBigInt: function (low,high,unsigned) { var ret = (unsigned ? ((+((low>>>0)))+((+((high>>>0)))*(+4294967296))) : ((+((low>>>0)))+((+((high|0)))*(+4294967296)))); return ret; }, + GLOBAL_BASE: 8, + QUANTUM_SIZE: 4, + __dummy__: 0 +} + + + +Module["Runtime"] = Runtime; + + + +//======================================== +// Runtime essentials +//======================================== + +var __THREW__ = 0; // Used in checking for thrown exceptions. + +var ABORT = false; // whether we are quitting the application. no code should run after this. set in exit() and abort() +var EXITSTATUS = 0; + +var undef = 0; +// tempInt is used for 32-bit signed values or smaller. tempBigInt is used +// for 32-bit unsigned values or more than 32 bits. TODO: audit all uses of tempInt +var tempValue, tempInt, tempBigInt, tempInt2, tempBigInt2, tempPair, tempBigIntI, tempBigIntR, tempBigIntS, tempBigIntP, tempBigIntD, tempDouble, tempFloat; +var tempI64, tempI64b; +var tempRet0, tempRet1, tempRet2, tempRet3, tempRet4, tempRet5, tempRet6, tempRet7, tempRet8, tempRet9; + +function assert(condition, text) { + if (!condition) { + abort('Assertion failed: ' + text); + } +} + +var globalScope = this; + +// Returns the C function with a specified identifier (for C++, you need to do manual name mangling) +function getCFunc(ident) { + var func = Module['_' + ident]; // closure exported function + if (!func) { + try { + func = eval('_' + ident); // explicit lookup + } catch(e) {} + } + assert(func, 'Cannot call unknown function ' + ident + ' (perhaps LLVM optimizations or closure removed it?)'); + return func; +} + +var cwrap, ccall; +(function(){ + var JSfuncs = { + // Helpers for cwrap -- it can't refer to Runtime directly because it might + // be renamed by closure, instead it calls JSfuncs['stackSave'].body to find + // out what the minified function name is. + 'stackSave': function() { + Runtime.stackSave() + }, + 'stackRestore': function() { + Runtime.stackRestore() + }, + // type conversion from js to c + 'arrayToC' : function(arr) { + var ret = Runtime.stackAlloc(arr.length); + writeArrayToMemory(arr, ret); + return ret; + }, + 'stringToC' : function(str) { + var ret = 0; + if (str !== null && str !== undefined && str !== 0) { // null string + // at most 4 bytes per UTF-8 code point, +1 for the trailing '\0' + ret = Runtime.stackAlloc((str.length << 2) + 1); + writeStringToMemory(str, ret); + } + return ret; + } + }; + // For fast lookup of conversion functions + var toC = {'string' : JSfuncs['stringToC'], 'array' : JSfuncs['arrayToC']}; + + // C calling interface. + ccall = function ccallFunc(ident, returnType, argTypes, args, opts) { + var func = getCFunc(ident); + var cArgs = []; + var stack = 0; + assert(returnType !== 'array', 'Return type should not be "array".'); + if (args) { + for (var i = 0; i < args.length; i++) { + var converter = toC[argTypes[i]]; + if (converter) { + if (stack === 0) stack = Runtime.stackSave(); + cArgs[i] = converter(args[i]); + } else { + cArgs[i] = args[i]; + } + } + } + var ret = func.apply(null, cArgs); + if ((!opts || !opts.async) && typeof EmterpreterAsync === 'object') { + assert(!EmterpreterAsync.state, 'cannot start async op with normal JS calling ccall'); + } + if (opts && opts.async) assert(!returnType, 'async ccalls cannot return values'); + if (returnType === 'string') ret = Pointer_stringify(ret); + if (stack !== 0) { + if (opts && opts.async) { + EmterpreterAsync.asyncFinalizers.push(function() { + Runtime.stackRestore(stack); + }); + return; + } + Runtime.stackRestore(stack); + } + return ret; + } + + var sourceRegex = /^function\s*\(([^)]*)\)\s*{\s*([^*]*?)[\s;]*(?:return\s*(.*?)[;\s]*)?}$/; + function parseJSFunc(jsfunc) { + // Match the body and the return value of a javascript function source + var parsed = jsfunc.toString().match(sourceRegex).slice(1); + return {arguments : parsed[0], body : parsed[1], returnValue: parsed[2]} + } + var JSsource = {}; + for (var fun in JSfuncs) { + if (JSfuncs.hasOwnProperty(fun)) { + // Elements of toCsource are arrays of three items: + // the code, and the return value + JSsource[fun] = parseJSFunc(JSfuncs[fun]); + } + } + + + cwrap = function cwrap(ident, returnType, argTypes) { + argTypes = argTypes || []; + var cfunc = getCFunc(ident); + // When the function takes numbers and returns a number, we can just return + // the original function + var numericArgs = argTypes.every(function(type){ return type === 'number'}); + var numericRet = (returnType !== 'string'); + if ( numericRet && numericArgs) { + return cfunc; + } + // Creation of the arguments list (["$1","$2",...,"$nargs"]) + var argNames = argTypes.map(function(x,i){return '$'+i}); + var funcstr = "(function(" + argNames.join(',') + ") {"; + var nargs = argTypes.length; + if (!numericArgs) { + // Generate the code needed to convert the arguments from javascript + // values to pointers + funcstr += 'var stack = ' + JSsource['stackSave'].body + ';'; + for (var i = 0; i < nargs; i++) { + var arg = argNames[i], type = argTypes[i]; + if (type === 'number') continue; + var convertCode = JSsource[type + 'ToC']; // [code, return] + funcstr += 'var ' + convertCode.arguments + ' = ' + arg + ';'; + funcstr += convertCode.body + ';'; + funcstr += arg + '=' + convertCode.returnValue + ';'; + } + } + + // When the code is compressed, the name of cfunc is not literally 'cfunc' anymore + var cfuncname = parseJSFunc(function(){return cfunc}).returnValue; + // Call the function + funcstr += 'var ret = ' + cfuncname + '(' + argNames.join(',') + ');'; + if (!numericRet) { // Return type can only by 'string' or 'number' + // Convert the result to a string + var strgfy = parseJSFunc(function(){return Pointer_stringify}).returnValue; + funcstr += 'ret = ' + strgfy + '(ret);'; + } + funcstr += "if (typeof EmterpreterAsync === 'object') { assert(!EmterpreterAsync.state, 'cannot start async op with normal JS calling cwrap') }"; + if (!numericArgs) { + // If we had a stack, restore it + funcstr += JSsource['stackRestore'].body.replace('()', '(stack)') + ';'; + } + funcstr += 'return ret})'; + return eval(funcstr); + }; +})(); +Module["ccall"] = ccall; +Module["cwrap"] = cwrap; + +function setValue(ptr, value, type, noSafe) { + type = type || 'i8'; + if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit + switch(type) { + case 'i1': HEAP8[((ptr)>>0)]=value; break; + case 'i8': HEAP8[((ptr)>>0)]=value; break; + case 'i16': HEAP16[((ptr)>>1)]=value; break; + case 'i32': HEAP32[((ptr)>>2)]=value; break; + case 'i64': (tempI64 = [value>>>0,(tempDouble=value,(+(Math_abs(tempDouble))) >= (+1) ? (tempDouble > (+0) ? ((Math_min((+(Math_floor((tempDouble)/(+4294967296)))), (+4294967295)))|0)>>>0 : (~~((+(Math_ceil((tempDouble - +(((~~(tempDouble)))>>>0))/(+4294967296))))))>>>0) : 0)],HEAP32[((ptr)>>2)]=tempI64[0],HEAP32[(((ptr)+(4))>>2)]=tempI64[1]); break; + case 'float': HEAPF32[((ptr)>>2)]=value; break; + case 'double': HEAPF64[((ptr)>>3)]=value; break; + default: abort('invalid type for setValue: ' + type); + } +} +Module["setValue"] = setValue; + + +function getValue(ptr, type, noSafe) { + type = type || 'i8'; + if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit + switch(type) { + case 'i1': return HEAP8[((ptr)>>0)]; + case 'i8': return HEAP8[((ptr)>>0)]; + case 'i16': return HEAP16[((ptr)>>1)]; + case 'i32': return HEAP32[((ptr)>>2)]; + case 'i64': return HEAP32[((ptr)>>2)]; + case 'float': return HEAPF32[((ptr)>>2)]; + case 'double': return HEAPF64[((ptr)>>3)]; + default: abort('invalid type for setValue: ' + type); + } + return null; +} +Module["getValue"] = getValue; + +var ALLOC_NORMAL = 0; // Tries to use _malloc() +var ALLOC_STACK = 1; // Lives for the duration of the current function call +var ALLOC_STATIC = 2; // Cannot be freed +var ALLOC_DYNAMIC = 3; // Cannot be freed except through sbrk +var ALLOC_NONE = 4; // Do not allocate +Module["ALLOC_NORMAL"] = ALLOC_NORMAL; +Module["ALLOC_STACK"] = ALLOC_STACK; +Module["ALLOC_STATIC"] = ALLOC_STATIC; +Module["ALLOC_DYNAMIC"] = ALLOC_DYNAMIC; +Module["ALLOC_NONE"] = ALLOC_NONE; + +// allocate(): This is for internal use. You can use it yourself as well, but the interface +// is a little tricky (see docs right below). The reason is that it is optimized +// for multiple syntaxes to save space in generated code. So you should +// normally not use allocate(), and instead allocate memory using _malloc(), +// initialize it with setValue(), and so forth. +// @slab: An array of data, or a number. If a number, then the size of the block to allocate, +// in *bytes* (note that this is sometimes confusing: the next parameter does not +// affect this!) +// @types: Either an array of types, one for each byte (or 0 if no type at that position), +// or a single type which is used for the entire block. This only matters if there +// is initial data - if @slab is a number, then this does not matter at all and is +// ignored. +// @allocator: How to allocate memory, see ALLOC_* +function allocate(slab, types, allocator, ptr) { + var zeroinit, size; + if (typeof slab === 'number') { + zeroinit = true; + size = slab; + } else { + zeroinit = false; + size = slab.length; + } + + var singleType = typeof types === 'string' ? types : null; + + var ret; + if (allocator == ALLOC_NONE) { + ret = ptr; + } else { + ret = [_malloc, Runtime.stackAlloc, Runtime.staticAlloc, Runtime.dynamicAlloc][allocator === undefined ? ALLOC_STATIC : allocator](Math.max(size, singleType ? 1 : types.length)); + } + + if (zeroinit) { + var ptr = ret, stop; + assert((ret & 3) == 0); + stop = ret + (size & ~3); + for (; ptr < stop; ptr += 4) { + HEAP32[((ptr)>>2)]=0; + } + stop = ret + size; + while (ptr < stop) { + HEAP8[((ptr++)>>0)]=0; + } + return ret; + } + + if (singleType === 'i8') { + if (slab.subarray || slab.slice) { + HEAPU8.set(slab, ret); + } else { + HEAPU8.set(new Uint8Array(slab), ret); + } + return ret; + } + + var i = 0, type, typeSize, previousType; + while (i < size) { + var curr = slab[i]; + + if (typeof curr === 'function') { + curr = Runtime.getFunctionIndex(curr); + } + + type = singleType || types[i]; + if (type === 0) { + i++; + continue; + } + assert(type, 'Must know what type to store in allocate!'); + + if (type == 'i64') type = 'i32'; // special case: we have one i32 here, and one i32 later + + setValue(ret+i, curr, type); + + // no need to look up size unless type changes, so cache it + if (previousType !== type) { + typeSize = Runtime.getNativeTypeSize(type); + previousType = type; + } + i += typeSize; + } + + return ret; +} +Module["allocate"] = allocate; + +// Allocate memory during any stage of startup - static memory early on, dynamic memory later, malloc when ready +function getMemory(size) { + if (!staticSealed) return Runtime.staticAlloc(size); + if ((typeof _sbrk !== 'undefined' && !_sbrk.called) || !runtimeInitialized) return Runtime.dynamicAlloc(size); + return _malloc(size); +} +Module["getMemory"] = getMemory; + +function Pointer_stringify(ptr, /* optional */ length) { + if (length === 0 || !ptr) return ''; + // TODO: use TextDecoder + // Find the length, and check for UTF while doing so + var hasUtf = 0; + var t; + var i = 0; + while (1) { + assert(ptr + i < TOTAL_MEMORY); + t = HEAPU8[(((ptr)+(i))>>0)]; + hasUtf |= t; + if (t == 0 && !length) break; + i++; + if (length && i == length) break; + } + if (!length) length = i; + + var ret = ''; + + if (hasUtf < 128) { + var MAX_CHUNK = 1024; // split up into chunks, because .apply on a huge string can overflow the stack + var curr; + while (length > 0) { + curr = String.fromCharCode.apply(String, HEAPU8.subarray(ptr, ptr + Math.min(length, MAX_CHUNK))); + ret = ret ? ret + curr : curr; + ptr += MAX_CHUNK; + length -= MAX_CHUNK; + } + return ret; + } + return Module['UTF8ToString'](ptr); +} +Module["Pointer_stringify"] = Pointer_stringify; + +// Given a pointer 'ptr' to a null-terminated ASCII-encoded string in the emscripten HEAP, returns +// a copy of that string as a Javascript String object. + +function AsciiToString(ptr) { + var str = ''; + while (1) { + var ch = HEAP8[((ptr++)>>0)]; + if (!ch) return str; + str += String.fromCharCode(ch); + } +} +Module["AsciiToString"] = AsciiToString; + +// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', +// null-terminated and encoded in ASCII form. The copy will require at most str.length+1 bytes of space in the HEAP. + +function stringToAscii(str, outPtr) { + return writeAsciiToMemory(str, outPtr, false); +} +Module["stringToAscii"] = stringToAscii; + +// Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the given array that contains uint8 values, returns +// a copy of that string as a Javascript String object. + +function UTF8ArrayToString(u8Array, idx) { + var u0, u1, u2, u3, u4, u5; + + var str = ''; + while (1) { + // For UTF8 byte structure, see http://en.wikipedia.org/wiki/UTF-8#Description and https://www.ietf.org/rfc/rfc2279.txt and https://tools.ietf.org/html/rfc3629 + u0 = u8Array[idx++]; + if (!u0) return str; + if (!(u0 & 0x80)) { str += String.fromCharCode(u0); continue; } + u1 = u8Array[idx++] & 63; + if ((u0 & 0xE0) == 0xC0) { str += String.fromCharCode(((u0 & 31) << 6) | u1); continue; } + u2 = u8Array[idx++] & 63; + if ((u0 & 0xF0) == 0xE0) { + u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; + } else { + u3 = u8Array[idx++] & 63; + if ((u0 & 0xF8) == 0xF0) { + u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | u3; + } else { + u4 = u8Array[idx++] & 63; + if ((u0 & 0xFC) == 0xF8) { + u0 = ((u0 & 3) << 24) | (u1 << 18) | (u2 << 12) | (u3 << 6) | u4; + } else { + u5 = u8Array[idx++] & 63; + u0 = ((u0 & 1) << 30) | (u1 << 24) | (u2 << 18) | (u3 << 12) | (u4 << 6) | u5; + } + } + } + if (u0 < 0x10000) { + str += String.fromCharCode(u0); + } else { + var ch = u0 - 0x10000; + str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF)); + } + } +} +Module["UTF8ArrayToString"] = UTF8ArrayToString; + +// Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the emscripten HEAP, returns +// a copy of that string as a Javascript String object. + +function UTF8ToString(ptr) { + return UTF8ArrayToString(HEAPU8,ptr); +} +Module["UTF8ToString"] = UTF8ToString; + +// Copies the given Javascript String object 'str' to the given byte array at address 'outIdx', +// encoded in UTF8 form and null-terminated. The copy will require at most str.length*4+1 bytes of space in the HEAP. +// Use the function lengthBytesUTF8() to compute the exact number of bytes (excluding null terminator) that this function will write. +// Parameters: +// str: the Javascript string to copy. +// outU8Array: the array to copy to. Each index in this array is assumed to be one 8-byte element. +// outIdx: The starting offset in the array to begin the copying. +// maxBytesToWrite: The maximum number of bytes this function can write to the array. This count should include the null +// terminator, i.e. if maxBytesToWrite=1, only the null terminator will be written and nothing else. +// maxBytesToWrite=0 does not write any bytes to the output, not even the null terminator. +// Returns the number of bytes written, EXCLUDING the null terminator. + +function stringToUTF8Array(str, outU8Array, outIdx, maxBytesToWrite) { + if (!(maxBytesToWrite > 0)) // Parameter maxBytesToWrite is not optional. Negative values, 0, null, undefined and false each don't write out any bytes. + return 0; + + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; // -1 for string null terminator. + for (var i = 0; i < str.length; ++i) { + // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! So decode UTF16->UTF32->UTF8. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + // For UTF8 byte structure, see http://en.wikipedia.org/wiki/UTF-8#Description and https://www.ietf.org/rfc/rfc2279.txt and https://tools.ietf.org/html/rfc3629 + var u = str.charCodeAt(i); // possibly a lead surrogate + if (u >= 0xD800 && u <= 0xDFFF) u = 0x10000 + ((u & 0x3FF) << 10) | (str.charCodeAt(++i) & 0x3FF); + if (u <= 0x7F) { + if (outIdx >= endIdx) break; + outU8Array[outIdx++] = u; + } else if (u <= 0x7FF) { + if (outIdx + 1 >= endIdx) break; + outU8Array[outIdx++] = 0xC0 | (u >> 6); + outU8Array[outIdx++] = 0x80 | (u & 63); + } else if (u <= 0xFFFF) { + if (outIdx + 2 >= endIdx) break; + outU8Array[outIdx++] = 0xE0 | (u >> 12); + outU8Array[outIdx++] = 0x80 | ((u >> 6) & 63); + outU8Array[outIdx++] = 0x80 | (u & 63); + } else if (u <= 0x1FFFFF) { + if (outIdx + 3 >= endIdx) break; + outU8Array[outIdx++] = 0xF0 | (u >> 18); + outU8Array[outIdx++] = 0x80 | ((u >> 12) & 63); + outU8Array[outIdx++] = 0x80 | ((u >> 6) & 63); + outU8Array[outIdx++] = 0x80 | (u & 63); + } else if (u <= 0x3FFFFFF) { + if (outIdx + 4 >= endIdx) break; + outU8Array[outIdx++] = 0xF8 | (u >> 24); + outU8Array[outIdx++] = 0x80 | ((u >> 18) & 63); + outU8Array[outIdx++] = 0x80 | ((u >> 12) & 63); + outU8Array[outIdx++] = 0x80 | ((u >> 6) & 63); + outU8Array[outIdx++] = 0x80 | (u & 63); + } else { + if (outIdx + 5 >= endIdx) break; + outU8Array[outIdx++] = 0xFC | (u >> 30); + outU8Array[outIdx++] = 0x80 | ((u >> 24) & 63); + outU8Array[outIdx++] = 0x80 | ((u >> 18) & 63); + outU8Array[outIdx++] = 0x80 | ((u >> 12) & 63); + outU8Array[outIdx++] = 0x80 | ((u >> 6) & 63); + outU8Array[outIdx++] = 0x80 | (u & 63); + } + } + // Null-terminate the pointer to the buffer. + outU8Array[outIdx] = 0; + return outIdx - startIdx; +} +Module["stringToUTF8Array"] = stringToUTF8Array; + +// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', +// null-terminated and encoded in UTF8 form. The copy will require at most str.length*4+1 bytes of space in the HEAP. +// Use the function lengthBytesUTF8() to compute the exact number of bytes (excluding null terminator) that this function will write. +// Returns the number of bytes written, EXCLUDING the null terminator. + +function stringToUTF8(str, outPtr, maxBytesToWrite) { + assert(typeof maxBytesToWrite == 'number', 'stringToUTF8(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!'); + return stringToUTF8Array(str, HEAPU8,outPtr, maxBytesToWrite); +} +Module["stringToUTF8"] = stringToUTF8; + +// Returns the number of bytes the given Javascript string takes if encoded as a UTF8 byte array, EXCLUDING the null terminator byte. + +function lengthBytesUTF8(str) { + var len = 0; + for (var i = 0; i < str.length; ++i) { + // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! So decode UTF16->UTF32->UTF8. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + var u = str.charCodeAt(i); // possibly a lead surrogate + if (u >= 0xD800 && u <= 0xDFFF) u = 0x10000 + ((u & 0x3FF) << 10) | (str.charCodeAt(++i) & 0x3FF); + if (u <= 0x7F) { + ++len; + } else if (u <= 0x7FF) { + len += 2; + } else if (u <= 0xFFFF) { + len += 3; + } else if (u <= 0x1FFFFF) { + len += 4; + } else if (u <= 0x3FFFFFF) { + len += 5; + } else { + len += 6; + } + } + return len; +} +Module["lengthBytesUTF8"] = lengthBytesUTF8; + +// Given a pointer 'ptr' to a null-terminated UTF16LE-encoded string in the emscripten HEAP, returns +// a copy of that string as a Javascript String object. + +function UTF16ToString(ptr) { + var i = 0; + + var str = ''; + while (1) { + var codeUnit = HEAP16[(((ptr)+(i*2))>>1)]; + if (codeUnit == 0) + return str; + ++i; + // fromCharCode constructs a character from a UTF-16 code unit, so we can pass the UTF16 string right through. + str += String.fromCharCode(codeUnit); + } +} +Module["UTF16ToString"] = UTF16ToString; + +// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', +// null-terminated and encoded in UTF16 form. The copy will require at most str.length*4+2 bytes of space in the HEAP. +// Use the function lengthBytesUTF16() to compute the exact number of bytes (excluding null terminator) that this function will write. +// Parameters: +// str: the Javascript string to copy. +// outPtr: Byte address in Emscripten HEAP where to write the string to. +// maxBytesToWrite: The maximum number of bytes this function can write to the array. This count should include the null +// terminator, i.e. if maxBytesToWrite=2, only the null terminator will be written and nothing else. +// maxBytesToWrite<2 does not write any bytes to the output, not even the null terminator. +// Returns the number of bytes written, EXCLUDING the null terminator. + +function stringToUTF16(str, outPtr, maxBytesToWrite) { + assert(typeof maxBytesToWrite == 'number', 'stringToUTF16(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!'); + // Backwards compatibility: if max bytes is not specified, assume unsafe unbounded write is allowed. + if (maxBytesToWrite === undefined) { + maxBytesToWrite = 0x7FFFFFFF; + } + if (maxBytesToWrite < 2) return 0; + maxBytesToWrite -= 2; // Null terminator. + var startPtr = outPtr; + var numCharsToWrite = (maxBytesToWrite < str.length*2) ? (maxBytesToWrite / 2) : str.length; + for (var i = 0; i < numCharsToWrite; ++i) { + // charCodeAt returns a UTF-16 encoded code unit, so it can be directly written to the HEAP. + var codeUnit = str.charCodeAt(i); // possibly a lead surrogate + HEAP16[((outPtr)>>1)]=codeUnit; + outPtr += 2; + } + // Null-terminate the pointer to the HEAP. + HEAP16[((outPtr)>>1)]=0; + return outPtr - startPtr; +} +Module["stringToUTF16"] = stringToUTF16; + +// Returns the number of bytes the given Javascript string takes if encoded as a UTF16 byte array, EXCLUDING the null terminator byte. + +function lengthBytesUTF16(str) { + return str.length*2; +} +Module["lengthBytesUTF16"] = lengthBytesUTF16; + +function UTF32ToString(ptr) { + var i = 0; + + var str = ''; + while (1) { + var utf32 = HEAP32[(((ptr)+(i*4))>>2)]; + if (utf32 == 0) + return str; + ++i; + // Gotcha: fromCharCode constructs a character from a UTF-16 encoded code (pair), not from a Unicode code point! So encode the code point to UTF-16 for constructing. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + if (utf32 >= 0x10000) { + var ch = utf32 - 0x10000; + str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF)); + } else { + str += String.fromCharCode(utf32); + } + } +} +Module["UTF32ToString"] = UTF32ToString; + +// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', +// null-terminated and encoded in UTF32 form. The copy will require at most str.length*4+4 bytes of space in the HEAP. +// Use the function lengthBytesUTF32() to compute the exact number of bytes (excluding null terminator) that this function will write. +// Parameters: +// str: the Javascript string to copy. +// outPtr: Byte address in Emscripten HEAP where to write the string to. +// maxBytesToWrite: The maximum number of bytes this function can write to the array. This count should include the null +// terminator, i.e. if maxBytesToWrite=4, only the null terminator will be written and nothing else. +// maxBytesToWrite<4 does not write any bytes to the output, not even the null terminator. +// Returns the number of bytes written, EXCLUDING the null terminator. + +function stringToUTF32(str, outPtr, maxBytesToWrite) { + assert(typeof maxBytesToWrite == 'number', 'stringToUTF32(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!'); + // Backwards compatibility: if max bytes is not specified, assume unsafe unbounded write is allowed. + if (maxBytesToWrite === undefined) { + maxBytesToWrite = 0x7FFFFFFF; + } + if (maxBytesToWrite < 4) return 0; + var startPtr = outPtr; + var endPtr = startPtr + maxBytesToWrite - 4; + for (var i = 0; i < str.length; ++i) { + // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! We must decode the string to UTF-32 to the heap. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + var codeUnit = str.charCodeAt(i); // possibly a lead surrogate + if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) { + var trailSurrogate = str.charCodeAt(++i); + codeUnit = 0x10000 + ((codeUnit & 0x3FF) << 10) | (trailSurrogate & 0x3FF); + } + HEAP32[((outPtr)>>2)]=codeUnit; + outPtr += 4; + if (outPtr + 4 > endPtr) break; + } + // Null-terminate the pointer to the HEAP. + HEAP32[((outPtr)>>2)]=0; + return outPtr - startPtr; +} +Module["stringToUTF32"] = stringToUTF32; + +// Returns the number of bytes the given Javascript string takes if encoded as a UTF16 byte array, EXCLUDING the null terminator byte. + +function lengthBytesUTF32(str) { + var len = 0; + for (var i = 0; i < str.length; ++i) { + // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! We must decode the string to UTF-32 to the heap. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + var codeUnit = str.charCodeAt(i); + if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) ++i; // possibly a lead surrogate, so skip over the tail surrogate. + len += 4; + } + + return len; +} +Module["lengthBytesUTF32"] = lengthBytesUTF32; + +function demangle(func) { + var hasLibcxxabi = !!Module['___cxa_demangle']; + if (hasLibcxxabi) { + try { + var buf = _malloc(func.length); + writeStringToMemory(func.substr(1), buf); + var status = _malloc(4); + var ret = Module['___cxa_demangle'](buf, 0, 0, status); + if (getValue(status, 'i32') === 0 && ret) { + return Pointer_stringify(ret); + } + // otherwise, libcxxabi failed, we can try ours which may return a partial result + } catch(e) { + // failure when using libcxxabi, we can try ours which may return a partial result + } finally { + if (buf) _free(buf); + if (status) _free(status); + if (ret) _free(ret); + } + } + var i = 3; + // params, etc. + var basicTypes = { + 'v': 'void', + 'b': 'bool', + 'c': 'char', + 's': 'short', + 'i': 'int', + 'l': 'long', + 'f': 'float', + 'd': 'double', + 'w': 'wchar_t', + 'a': 'signed char', + 'h': 'unsigned char', + 't': 'unsigned short', + 'j': 'unsigned int', + 'm': 'unsigned long', + 'x': 'long long', + 'y': 'unsigned long long', + 'z': '...' + }; + var subs = []; + var first = true; + function dump(x) { + //return; + if (x) Module.print(x); + Module.print(func); + var pre = ''; + for (var a = 0; a < i; a++) pre += ' '; + Module.print (pre + '^'); + } + function parseNested() { + i++; + if (func[i] === 'K') i++; // ignore const + var parts = []; + while (func[i] !== 'E') { + if (func[i] === 'S') { // substitution + i++; + var next = func.indexOf('_', i); + var num = func.substring(i, next) || 0; + parts.push(subs[num] || '?'); + i = next+1; + continue; + } + if (func[i] === 'C') { // constructor + parts.push(parts[parts.length-1]); + i += 2; + continue; + } + var size = parseInt(func.substr(i)); + var pre = size.toString().length; + if (!size || !pre) { i--; break; } // counter i++ below us + var curr = func.substr(i + pre, size); + parts.push(curr); + subs.push(curr); + i += pre + size; + } + i++; // skip E + return parts; + } + function parse(rawList, limit, allowVoid) { // main parser + limit = limit || Infinity; + var ret = '', list = []; + function flushList() { + return '(' + list.join(', ') + ')'; + } + var name; + if (func[i] === 'N') { + // namespaced N-E + name = parseNested().join('::'); + limit--; + if (limit === 0) return rawList ? [name] : name; + } else { + // not namespaced + if (func[i] === 'K' || (first && func[i] === 'L')) i++; // ignore const and first 'L' + var size = parseInt(func.substr(i)); + if (size) { + var pre = size.toString().length; + name = func.substr(i + pre, size); + i += pre + size; + } + } + first = false; + if (func[i] === 'I') { + i++; + var iList = parse(true); + var iRet = parse(true, 1, true); + ret += iRet[0] + ' ' + name + '<' + iList.join(', ') + '>'; + } else { + ret = name; + } + paramLoop: while (i < func.length && limit-- > 0) { + //dump('paramLoop'); + var c = func[i++]; + if (c in basicTypes) { + list.push(basicTypes[c]); + } else { + switch (c) { + case 'P': list.push(parse(true, 1, true)[0] + '*'); break; // pointer + case 'R': list.push(parse(true, 1, true)[0] + '&'); break; // reference + case 'L': { // literal + i++; // skip basic type + var end = func.indexOf('E', i); + var size = end - i; + list.push(func.substr(i, size)); + i += size + 2; // size + 'EE' + break; + } + case 'A': { // array + var size = parseInt(func.substr(i)); + i += size.toString().length; + if (func[i] !== '_') throw '?'; + i++; // skip _ + list.push(parse(true, 1, true)[0] + ' [' + size + ']'); + break; + } + case 'E': break paramLoop; + default: ret += '?' + c; break paramLoop; + } + } + } + if (!allowVoid && list.length === 1 && list[0] === 'void') list = []; // avoid (void) + if (rawList) { + if (ret) { + list.push(ret + '?'); + } + return list; + } else { + return ret + flushList(); + } + } + var parsed = func; + try { + // Special-case the entry point, since its name differs from other name mangling. + if (func == 'Object._main' || func == '_main') { + return 'main()'; + } + if (typeof func === 'number') func = Pointer_stringify(func); + if (func[0] !== '_') return func; + if (func[1] !== '_') return func; // C function + if (func[2] !== 'Z') return func; + switch (func[3]) { + case 'n': return 'operator new()'; + case 'd': return 'operator delete()'; + } + parsed = parse(); + } catch(e) { + parsed += '?'; + } + if (parsed.indexOf('?') >= 0 && !hasLibcxxabi) { + Runtime.warnOnce('warning: a problem occurred in builtin C++ name demangling; build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling'); + } + return parsed; +} + +function demangleAll(text) { + return text.replace(/__Z[\w\d_]+/g, function(x) { var y = demangle(x); return x === y ? x : (x + ' [' + y + ']') }); +} + +function jsStackTrace() { + var err = new Error(); + if (!err.stack) { + // IE10+ special cases: It does have callstack info, but it is only populated if an Error object is thrown, + // so try that as a special-case. + try { + throw new Error(0); + } catch(e) { + err = e; + } + if (!err.stack) { + return '(no stack trace available)'; + } + } + return err.stack.toString(); +} + +function stackTrace() { + return demangleAll(jsStackTrace()); +} +Module["stackTrace"] = stackTrace; + +// Memory management + +var PAGE_SIZE = 4096; + +function alignMemoryPage(x) { + if (x % 4096 > 0) { + x += (4096 - (x % 4096)); + } + return x; +} + +var HEAP; +var HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64; + +var STATIC_BASE = 0, STATICTOP = 0, staticSealed = false; // static area +var STACK_BASE = 0, STACKTOP = 0, STACK_MAX = 0; // stack area +var DYNAMIC_BASE = 0, DYNAMICTOP = 0; // dynamic area handled by sbrk + + + +function enlargeMemory() { + // TOTAL_MEMORY is the current size of the actual array, and DYNAMICTOP is the new top. + assert(DYNAMICTOP >= TOTAL_MEMORY); + assert(TOTAL_MEMORY > 4); // So the loop below will not be infinite + + var OLD_TOTAL_MEMORY = TOTAL_MEMORY; + + + var LIMIT = Math.pow(2, 31); // 2GB is a practical maximum, as we use signed ints as pointers + // and JS engines seem unhappy to give us 2GB arrays currently + if (DYNAMICTOP >= LIMIT) return false; + + while (TOTAL_MEMORY <= DYNAMICTOP) { // Simple heuristic. + if (TOTAL_MEMORY < LIMIT/2) { + TOTAL_MEMORY = alignMemoryPage(2*TOTAL_MEMORY); // double until 1GB + } else { + var last = TOTAL_MEMORY; + TOTAL_MEMORY = alignMemoryPage((3*TOTAL_MEMORY + LIMIT)/4); // add smaller increments towards 2GB, which we cannot reach + if (TOTAL_MEMORY <= last) return false; + } + } + + TOTAL_MEMORY = Math.max(TOTAL_MEMORY, 16*1024*1024); + + if (TOTAL_MEMORY >= LIMIT) return false; + + Module.printErr('Warning: Enlarging memory arrays, this is not fast! ' + [OLD_TOTAL_MEMORY, TOTAL_MEMORY]); + + + var start = Date.now(); + + try { + if (ArrayBuffer.transfer) { + buffer = ArrayBuffer.transfer(buffer, TOTAL_MEMORY); + } else { + var oldHEAP8 = HEAP8; + buffer = new ArrayBuffer(TOTAL_MEMORY); + } + } catch(e) { + return false; + } + + var success = _emscripten_replace_memory(buffer); + if (!success) return false; + + // everything worked + + Module['buffer'] = buffer; + Module['HEAP8'] = HEAP8 = new Int8Array(buffer); + Module['HEAP16'] = HEAP16 = new Int16Array(buffer); + Module['HEAP32'] = HEAP32 = new Int32Array(buffer); + Module['HEAPU8'] = HEAPU8 = new Uint8Array(buffer); + Module['HEAPU16'] = HEAPU16 = new Uint16Array(buffer); + Module['HEAPU32'] = HEAPU32 = new Uint32Array(buffer); + Module['HEAPF32'] = HEAPF32 = new Float32Array(buffer); + Module['HEAPF64'] = HEAPF64 = new Float64Array(buffer); + if (!ArrayBuffer.transfer) { + HEAP8.set(oldHEAP8); + } + + Module.printErr('enlarged memory arrays from ' + OLD_TOTAL_MEMORY + ' to ' + TOTAL_MEMORY + ', took ' + (Date.now() - start) + ' ms (has ArrayBuffer.transfer? ' + (!!ArrayBuffer.transfer) + ')'); + + return true; +} + +var byteLength; +try { + byteLength = Function.prototype.call.bind(Object.getOwnPropertyDescriptor(ArrayBuffer.prototype, 'byteLength').get); + byteLength(new ArrayBuffer(4)); // can fail on older ie +} catch(e) { // can fail on older node/v8 + byteLength = function(buffer) { return buffer.byteLength; }; +} + +var TOTAL_STACK = Module['TOTAL_STACK'] || 5242880; +var TOTAL_MEMORY = Module['TOTAL_MEMORY'] || 268435456; + +var totalMemory = 64*1024; +while (totalMemory < TOTAL_MEMORY || totalMemory < 2*TOTAL_STACK) { + if (totalMemory < 16*1024*1024) { + totalMemory *= 2; + } else { + totalMemory += 16*1024*1024 + } +} +totalMemory = Math.max(totalMemory, 16*1024*1024); +if (totalMemory !== TOTAL_MEMORY) { + Module.printErr('increasing TOTAL_MEMORY to ' + totalMemory + ' to be compliant with the asm.js spec (and given that TOTAL_STACK=' + TOTAL_STACK + ')'); + TOTAL_MEMORY = totalMemory; +} + +// Initialize the runtime's memory +// check for full engine support (use string 'subarray' to avoid closure compiler confusion) +assert(typeof Int32Array !== 'undefined' && typeof Float64Array !== 'undefined' && !!(new Int32Array(1)['subarray']) && !!(new Int32Array(1)['set']), + 'JS engine does not provide full typed array support'); + +var buffer; + + + +buffer = new ArrayBuffer(TOTAL_MEMORY); +HEAP8 = new Int8Array(buffer); +HEAP16 = new Int16Array(buffer); +HEAP32 = new Int32Array(buffer); +HEAPU8 = new Uint8Array(buffer); +HEAPU16 = new Uint16Array(buffer); +HEAPU32 = new Uint32Array(buffer); +HEAPF32 = new Float32Array(buffer); +HEAPF64 = new Float64Array(buffer); + + +// Endianness check (note: assumes compiler arch was little-endian) +HEAP32[0] = 255; +assert(HEAPU8[0] === 255 && HEAPU8[3] === 0, 'Typed arrays 2 must be run on a little-endian system'); + +Module['HEAP'] = HEAP; +Module['buffer'] = buffer; +Module['HEAP8'] = HEAP8; +Module['HEAP16'] = HEAP16; +Module['HEAP32'] = HEAP32; +Module['HEAPU8'] = HEAPU8; +Module['HEAPU16'] = HEAPU16; +Module['HEAPU32'] = HEAPU32; +Module['HEAPF32'] = HEAPF32; +Module['HEAPF64'] = HEAPF64; + +function callRuntimeCallbacks(callbacks) { + while(callbacks.length > 0) { + var callback = callbacks.shift(); + if (typeof callback == 'function') { + callback(); + continue; + } + var func = callback.func; + if (typeof func === 'number') { + if (callback.arg === undefined) { + Runtime.dynCall('v', func); + } else { + Runtime.dynCall('vi', func, [callback.arg]); + } + } else { + func(callback.arg === undefined ? null : callback.arg); + } + } +} + +var __ATPRERUN__ = []; // functions called before the runtime is initialized +var __ATINIT__ = []; // functions called during startup +var __ATMAIN__ = []; // functions called when main() is to be run +var __ATEXIT__ = []; // functions called during shutdown +var __ATPOSTRUN__ = []; // functions called after the runtime has exited + +var runtimeInitialized = false; +var runtimeExited = false; + + +function preRun() { + // compatibility - merge in anything from Module['preRun'] at this time + if (Module['preRun']) { + if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']]; + while (Module['preRun'].length) { + addOnPreRun(Module['preRun'].shift()); + } + } + callRuntimeCallbacks(__ATPRERUN__); +} + +function ensureInitRuntime() { + if (runtimeInitialized) return; + runtimeInitialized = true; + callRuntimeCallbacks(__ATINIT__); +} + +function preMain() { + callRuntimeCallbacks(__ATMAIN__); +} + +function exitRuntime() { + callRuntimeCallbacks(__ATEXIT__); + runtimeExited = true; +} + +function postRun() { + // compatibility - merge in anything from Module['postRun'] at this time + if (Module['postRun']) { + if (typeof Module['postRun'] == 'function') Module['postRun'] = [Module['postRun']]; + while (Module['postRun'].length) { + addOnPostRun(Module['postRun'].shift()); + } + } + callRuntimeCallbacks(__ATPOSTRUN__); +} + +function addOnPreRun(cb) { + __ATPRERUN__.unshift(cb); +} +Module["addOnPreRun"] = addOnPreRun; + +function addOnInit(cb) { + __ATINIT__.unshift(cb); +} +Module["addOnInit"] = addOnInit; + +function addOnPreMain(cb) { + __ATMAIN__.unshift(cb); +} +Module["addOnPreMain"] = addOnPreMain; + +function addOnExit(cb) { + __ATEXIT__.unshift(cb); +} +Module["addOnExit"] = addOnExit; + +function addOnPostRun(cb) { + __ATPOSTRUN__.unshift(cb); +} +Module["addOnPostRun"] = addOnPostRun; + +// Tools + + +function intArrayFromString(stringy, dontAddNull, length /* optional */) { + var len = length > 0 ? length : lengthBytesUTF8(stringy)+1; + var u8array = new Array(len); + var numBytesWritten = stringToUTF8Array(stringy, u8array, 0, u8array.length); + if (dontAddNull) u8array.length = numBytesWritten; + return u8array; +} +Module["intArrayFromString"] = intArrayFromString; + +function intArrayToString(array) { + var ret = []; + for (var i = 0; i < array.length; i++) { + var chr = array[i]; + if (chr > 0xFF) { + assert(false, 'Character code ' + chr + ' (' + String.fromCharCode(chr) + ') at offset ' + i + ' not in 0x00-0xFF.'); + chr &= 0xFF; + } + ret.push(String.fromCharCode(chr)); + } + return ret.join(''); +} +Module["intArrayToString"] = intArrayToString; + +function writeStringToMemory(string, buffer, dontAddNull) { + var array = intArrayFromString(string, dontAddNull); + var i = 0; + while (i < array.length) { + var chr = array[i]; + HEAP8[(((buffer)+(i))>>0)]=chr; + i = i + 1; + } +} +Module["writeStringToMemory"] = writeStringToMemory; + +function writeArrayToMemory(array, buffer) { + for (var i = 0; i < array.length; i++) { + HEAP8[((buffer++)>>0)]=array[i]; + } +} +Module["writeArrayToMemory"] = writeArrayToMemory; + +function writeAsciiToMemory(str, buffer, dontAddNull) { + for (var i = 0; i < str.length; ++i) { + assert(str.charCodeAt(i) === str.charCodeAt(i)&0xff); + HEAP8[((buffer++)>>0)]=str.charCodeAt(i); + } + // Null-terminate the pointer to the HEAP. + if (!dontAddNull) HEAP8[((buffer)>>0)]=0; +} +Module["writeAsciiToMemory"] = writeAsciiToMemory; + +function unSign(value, bits, ignore) { + if (value >= 0) { + return value; + } + return bits <= 32 ? 2*Math.abs(1 << (bits-1)) + value // Need some trickery, since if bits == 32, we are right at the limit of the bits JS uses in bitshifts + : Math.pow(2, bits) + value; +} +function reSign(value, bits, ignore) { + if (value <= 0) { + return value; + } + var half = bits <= 32 ? Math.abs(1 << (bits-1)) // abs is needed if bits == 32 + : Math.pow(2, bits-1); + if (value >= half && (bits <= 32 || value > half)) { // for huge values, we can hit the precision limit and always get true here. so don't do that + // but, in general there is no perfect solution here. With 64-bit ints, we get rounding and errors + // TODO: In i64 mode 1, resign the two parts separately and safely + value = -2*half + value; // Cannot bitshift half, as it may be at the limit of the bits JS uses in bitshifts + } + return value; +} + + +// check for imul support, and also for correctness ( https://bugs.webkit.org/show_bug.cgi?id=126345 ) +if (!Math['imul'] || Math['imul'](0xffffffff, 5) !== -5) Math['imul'] = function imul(a, b) { + var ah = a >>> 16; + var al = a & 0xffff; + var bh = b >>> 16; + var bl = b & 0xffff; + return (al*bl + ((ah*bl + al*bh) << 16))|0; +}; +Math.imul = Math['imul']; + + +if (!Math['clz32']) Math['clz32'] = function(x) { + x = x >>> 0; + for (var i = 0; i < 32; i++) { + if (x & (1 << (31 - i))) return i; + } + return 32; +}; +Math.clz32 = Math['clz32'] + +var Math_abs = Math.abs; +var Math_cos = Math.cos; +var Math_sin = Math.sin; +var Math_tan = Math.tan; +var Math_acos = Math.acos; +var Math_asin = Math.asin; +var Math_atan = Math.atan; +var Math_atan2 = Math.atan2; +var Math_exp = Math.exp; +var Math_log = Math.log; +var Math_sqrt = Math.sqrt; +var Math_ceil = Math.ceil; +var Math_floor = Math.floor; +var Math_pow = Math.pow; +var Math_imul = Math.imul; +var Math_fround = Math.fround; +var Math_min = Math.min; +var Math_clz32 = Math.clz32; + +// A counter of dependencies for calling run(). If we need to +// do asynchronous work before running, increment this and +// decrement it. Incrementing must happen in a place like +// PRE_RUN_ADDITIONS (used by emcc to add file preloading). +// Note that you can add dependencies in preRun, even though +// it happens right before run - run will be postponed until +// the dependencies are met. +var runDependencies = 0; +var runDependencyWatcher = null; +var dependenciesFulfilled = null; // overridden to take different actions when all run dependencies are fulfilled +var runDependencyTracking = {}; + +function getUniqueRunDependency(id) { + var orig = id; + while (1) { + if (!runDependencyTracking[id]) return id; + id = orig + Math.random(); + } + return id; +} + +function addRunDependency(id) { + runDependencies++; + if (Module['monitorRunDependencies']) { + Module['monitorRunDependencies'](runDependencies); + } + if (id) { + assert(!runDependencyTracking[id]); + runDependencyTracking[id] = 1; + if (runDependencyWatcher === null && typeof setInterval !== 'undefined') { + // Check for missing dependencies every few seconds + runDependencyWatcher = setInterval(function() { + if (ABORT) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + return; + } + var shown = false; + for (var dep in runDependencyTracking) { + if (!shown) { + shown = true; + Module.printErr('still waiting on run dependencies:'); + } + Module.printErr('dependency: ' + dep); + } + if (shown) { + Module.printErr('(end of list)'); + } + }, 10000); + } + } else { + Module.printErr('warning: run dependency added without ID'); + } +} +Module["addRunDependency"] = addRunDependency; + +function removeRunDependency(id) { + runDependencies--; + if (Module['monitorRunDependencies']) { + Module['monitorRunDependencies'](runDependencies); + } + if (id) { + assert(runDependencyTracking[id]); + delete runDependencyTracking[id]; + } else { + Module.printErr('warning: run dependency removed without ID'); + } + if (runDependencies == 0) { + if (runDependencyWatcher !== null) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + } + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); // can add another dependenciesFulfilled + } + } +} +Module["removeRunDependency"] = removeRunDependency; + +Module["preloadedImages"] = {}; // maps url to image data +Module["preloadedAudios"] = {}; // maps url to audio data + + + +var memoryInitializer = null; + + + +// === Body === + +var ASM_CONSTS = [function($0, $1, $2, $3) { { if (!artoolkit["multiEachMarkerInfo"]) { artoolkit["multiEachMarkerInfo"] = ({}); } var multiEachMarker = artoolkit["multiEachMarkerInfo"]; multiEachMarker['visible'] = $0; multiEachMarker['pattId'] = $1; multiEachMarker['pattType'] = $2; multiEachMarker['width'] = $3; } }, + function($0, $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) { { var $a = arguments; var i = 12; if (!artoolkit["markerInfo"]) { artoolkit["markerInfo"] = ({ pos: [0,0], line: [[0,0,0], [0,0,0], [0,0,0], [0,0,0]], vertex: [[0,0], [0,0], [0,0], [0,0]] }); } var markerInfo = artoolkit["markerInfo"]; markerInfo["area"] = $0; markerInfo["id"] = $1; markerInfo["idPatt"] = $2; markerInfo["idMatrix"] = $3; markerInfo["dir"] = $4; markerInfo["dirPatt"] = $5; markerInfo["dirMatrix"] = $6; markerInfo["cf"] = $7; markerInfo["cfPatt"] = $8; markerInfo["cfMatrix"] = $9; markerInfo["pos"][0] = $10; markerInfo["pos"][1] = $11; markerInfo["line"][0][0] = $a[i++]; markerInfo["line"][0][1] = $a[i++]; markerInfo["line"][0][2] = $a[i++]; markerInfo["line"][1][0] = $a[i++]; markerInfo["line"][1][1] = $a[i++]; markerInfo["line"][1][2] = $a[i++]; markerInfo["line"][2][0] = $a[i++]; markerInfo["line"][2][1] = $a[i++]; markerInfo["line"][2][2] = $a[i++]; markerInfo["line"][3][0] = $a[i++]; markerInfo["line"][3][1] = $a[i++]; markerInfo["line"][3][2] = $a[i++]; markerInfo["vertex"][0][0] = $a[i++]; markerInfo["vertex"][0][1] = $a[i++]; markerInfo["vertex"][1][0] = $a[i++]; markerInfo["vertex"][1][1] = $a[i++]; markerInfo["vertex"][2][0] = $a[i++]; markerInfo["vertex"][2][1] = $a[i++]; markerInfo["vertex"][3][0] = $a[i++]; markerInfo["vertex"][3][1] = $a[i++]; markerInfo["errorCorrected"] = $a[i++]; } }, + function($0, $1, $2, $3, $4) { { if (!artoolkit["frameMalloc"]) { artoolkit["frameMalloc"] = ({}); } var frameMalloc = artoolkit["frameMalloc"]; frameMalloc["framepointer"] = $1; frameMalloc["framesize"] = $2; frameMalloc["camera"] = $3; frameMalloc["transform"] = $4; } }]; + +function _emscripten_asm_const_33(code, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32) { + return ASM_CONSTS[code](a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32); +} + +function _emscripten_asm_const_4(code, a0, a1, a2, a3) { + return ASM_CONSTS[code](a0, a1, a2, a3); +} + +function _emscripten_asm_const_5(code, a0, a1, a2, a3, a4) { + return ASM_CONSTS[code](a0, a1, a2, a3, a4); +} + + + +STATIC_BASE = 8; + +STATICTOP = STATIC_BASE + 18336; + /* global initializers */ __ATINIT__.push({ func: function() { __GLOBAL__sub_I_ARToolKitJS_cpp() } }, { func: function() { __GLOBAL__sub_I_bind_cpp() } }); + + +/* memory initializer */ allocate([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,9,0,0,52,42,0,0,0,0,0,0,1,0,0,0,128,1,0,0,0,0,0,0,228,8,0,0,115,42,0,0,52,9,0,0,12,47,0,0,0,0,0,0,1,0,0,0,128,1,0,0,0,0,0,0,52,9,0,0,205,46,0,0,0,0,0,0,1,0,0,0,128,1,0,0,0,0,0,0,228,8,0,0,186,46,0,0,228,8,0,0,155,46,0,0,228,8,0,0,194,45,0,0,228,8,0,0,163,45,0,0,228,8,0,0,132,45,0,0,228,8,0,0,101,45,0,0,228,8,0,0,70,45,0,0,228,8,0,0,225,45,0,0,228,8,0,0,0,46,0,0,228,8,0,0,31,46,0,0,228,8,0,0,62,46,0,0,228,8,0,0,93,46,0,0,228,8,0,0,124,46,0,0,12,9,0,0,75,47,0,0,48,2,0,0,0,0,0,0,228,8,0,0,88,47,0,0,228,8,0,0,101,47,0,0,12,9,0,0,114,47,0,0,56,2,0,0,0,0,0,0,12,9,0,0,147,47,0,0,64,2,0,0,0,0,0,0,12,9,0,0,181,47,0,0,64,2,0,0,0,0,0,0,200,8,0,0,221,47,0,0,200,8,0,0,223,47,0,0,200,8,0,0,225,47,0,0,200,8,0,0,227,47,0,0,200,8,0,0,229,47,0,0,200,8,0,0,231,47,0,0,200,8,0,0,233,47,0,0,200,8,0,0,235,47,0,0,200,8,0,0,237,47,0,0,200,8,0,0,14,54,0,0,200,8,0,0,239,47,0,0,200,8,0,0,241,47,0,0,200,8,0,0,243,47,0,0,12,9,0,0,245,47,0,0,80,2,0,0,0,0,0,0,12,9,0,0,26,48,0,0,80,2,0,0,0,0,0,0,255,15,0,0,6,16,0,0,18,16,0,0,28,16,0,0,255,255,255,255,255,255,255,255,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,1,0,0,0,2,0,0,0,4,0,0,0,8,0,0,0,3,0,0,0,6,0,0,0,12,0,0,0,11,0,0,0,5,0,0,0,10,0,0,0,7,0,0,0,14,0,0,0,15,0,0,0,13,0,0,0,9,0,0,0,1,0,0,0,2,0,0,0,4,0,0,0,8,0,0,0,16,0,0,0,32,0,0,0,64,0,0,0,3,0,0,0,6,0,0,0,12,0,0,0,24,0,0,0,48,0,0,0,96,0,0,0,67,0,0,0,5,0,0,0,10,0,0,0,20,0,0,0,40,0,0,0,80,0,0,0,35,0,0,0,70,0,0,0,15,0,0,0,30,0,0,0,60,0,0,0,120,0,0,0,115,0,0,0,101,0,0,0,73,0,0,0,17,0,0,0,34,0,0,0,68,0,0,0,11,0,0,0,22,0,0,0,44,0,0,0,88,0,0,0,51,0,0,0,102,0,0,0,79,0,0,0,29,0,0,0,58,0,0,0,116,0,0,0,107,0,0,0,85,0,0,0,41,0,0,0,82,0,0,0,39,0,0,0,78,0,0,0,31,0,0,0,62,0,0,0,124,0,0,0,123,0,0,0,117,0,0,0,105,0,0,0,81,0,0,0,33,0,0,0,66,0,0,0,7,0,0,0,14,0,0,0,28,0,0,0,56,0,0,0,112,0,0,0,99,0,0,0,69,0,0,0,9,0,0,0,18,0,0,0,36,0,0,0,72,0,0,0,19,0,0,0,38,0,0,0,76,0,0,0,27,0,0,0,54,0,0,0,108,0,0,0,91,0,0,0,53,0,0,0,106,0,0,0,87,0,0,0,45,0,0,0,90,0,0,0,55,0,0,0,110,0,0,0,95,0,0,0,61,0,0,0,122,0,0,0,119,0,0,0,109,0,0,0,89,0,0,0,49,0,0,0,98,0,0,0,71,0,0,0,13,0,0,0,26,0,0,0,52,0,0,0,104,0,0,0,83,0,0,0,37,0,0,0,74,0,0,0,23,0,0,0,46,0,0,0,92,0,0,0,59,0,0,0,118,0,0,0,111,0,0,0,93,0,0,0,57,0,0,0,114,0,0,0,103,0,0,0,77,0,0,0,25,0,0,0,50,0,0,0,100,0,0,0,75,0,0,0,21,0,0,0,42,0,0,0,84,0,0,0,43,0,0,0,86,0,0,0,47,0,0,0,94,0,0,0,63,0,0,0,126,0,0,0,127,0,0,0,125,0,0,0,121,0,0,0,113,0,0,0,97,0,0,0,65,0,0,0,255,255,255,255,0,0,0,0,1,0,0,0,4,0,0,0,2,0,0,0,8,0,0,0,5,0,0,0,10,0,0,0,3,0,0,0,14,0,0,0,9,0,0,0,7,0,0,0,6,0,0,0,13,0,0,0,11,0,0,0,12,0,0,0,255,255,255,255,0,0,0,0,1,0,0,0,7,0,0,0,2,0,0,0,14,0,0,0,8,0,0,0,56,0,0,0,3,0,0,0,63,0,0,0,15,0,0,0,31,0,0,0,9,0,0,0,90,0,0,0,57,0,0,0,21,0,0,0,4,0,0,0,28,0,0,0,64,0,0,0,67,0,0,0,16,0,0,0,112,0,0,0,32,0,0,0,97,0,0,0,10,0,0,0,108,0,0,0,91,0,0,0,70,0,0,0,58,0,0,0,38,0,0,0,22,0,0,0,47,0,0,0,5,0,0,0,54,0,0,0,29,0,0,0,19,0,0,0,65,0,0,0,95,0,0,0,68,0,0,0,45,0,0,0,17,0,0,0,43,0,0,0,113,0,0,0,115,0,0,0,33,0,0,0,77,0,0,0,98,0,0,0,117,0,0,0,11,0,0,0,87,0,0,0,109,0,0,0,35,0,0,0,92,0,0,0,74,0,0,0,71,0,0,0,79,0,0,0,59,0,0,0,104,0,0,0,39,0,0,0,100,0,0,0,23,0,0,0,82,0,0,0,48,0,0,0,119,0,0,0,6,0,0,0,126,0,0,0,55,0,0,0,13,0,0,0,30,0,0,0,62,0,0,0,20,0,0,0,89,0,0,0,66,0,0,0,27,0,0,0,96,0,0,0,111,0,0,0,69,0,0,0,107,0,0,0,46,0,0,0,37,0,0,0,18,0,0,0,53,0,0,0,44,0,0,0,94,0,0,0,114,0,0,0,42,0,0,0,116,0,0,0,76,0,0,0,34,0,0,0,86,0,0,0,78,0,0,0,73,0,0,0,99,0,0,0,103,0,0,0,118,0,0,0,81,0,0,0,12,0,0,0,125,0,0,0,88,0,0,0,61,0,0,0,110,0,0,0,26,0,0,0,36,0,0,0,106,0,0,0,93,0,0,0,52,0,0,0,75,0,0,0,41,0,0,0,72,0,0,0,85,0,0,0,80,0,0,0,102,0,0,0,60,0,0,0,124,0,0,0,105,0,0,0,25,0,0,0,40,0,0,0,51,0,0,0,101,0,0,0,84,0,0,0,24,0,0,0,123,0,0,0,83,0,0,0,50,0,0,0,49,0,0,0,122,0,0,0,120,0,0,0,121,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,136,0,0,0,5,0,0,0,144,0,0,0,6,0,0,0,152,0,0,0,9,0,0,0,176,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,253,255,255,255,254,255,255,255,0,0,0,0,112,2,0,0,168,2,0,0,200,2,0,0,112,2,0,0,168,2,0,0,168,2,0,0,208,2,0,0,168,2,0,0,112,2,0,0,168,2,0,0,208,2,0,0,168,2,0,0,112,2,0,0,168,2,0,0,168,2,0,0,104,1,0,0,168,2,0,0,168,2,0,0,168,2,0,0,168,2,0,0,168,2,0,0,104,1,0,0,168,2,0,0,168,2,0,0,168,2,0,0,168,2,0,0,168,2,0,0,168,2,0,0,0,0,0,0,32,2,0,0,1,0,0,0,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,96,2,0,0,3,0,0,0,4,0,0,0,5,0,0,0,6,0,0,0,1,0,0,0,0,0,0,0,80,2,0,0,3,0,0,0,7,0,0,0,5,0,0,0,6,0,0,0,2,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,216,2,0,0,3,0,0,0,8,0,0,0,5,0,0,0,6,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,232,2,0,0,3,0,0,0,9,0,0,0,5,0,0,0,6,0,0,0,2,0,0,0,3,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,192,3,0,0,192,4,0,0,192,5,0,0,192,6,0,0,192,7,0,0,192,8,0,0,192,9,0,0,192,10,0,0,192,11,0,0,192,12,0,0,192,13,0,0,192,14,0,0,192,15,0,0,192,16,0,0,192,17,0,0,192,18,0,0,192,19,0,0,192,20,0,0,192,21,0,0,192,22,0,0,192,23,0,0,192,24,0,0,192,25,0,0,192,26,0,0,192,27,0,0,192,28,0,0,192,29,0,0,192,30,0,0,192,31,0,0,192,0,0,0,179,1,0,0,195,2,0,0,195,3,0,0,195,4,0,0,195,5,0,0,195,6,0,0,195,7,0,0,195,8,0,0,195,9,0,0,195,10,0,0,195,11,0,0,195,12,0,0,195,13,0,0,211,14,0,0,195,15,0,0,195,0,0,12,187,1,0,12,195,2,0,12,195,3,0,12,195,4,0,12,211,240,10,0,0,96,11,0,0,0,0,0,0,10,0,0,0,100,0,0,0,232,3,0,0,16,39,0,0,160,134,1,0,64,66,15,0,128,150,152,0,0,225,245,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,5,0,0,0,139,69,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,5,0,0,0,131,65,0,0,0,4,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,5,0,0,0,7,0,0,0,11,0,0,0,13,0,0,0,17,0,0,0,19,0,0,0,23,0,0,0,29,0,0,0,31,0,0,0,37,0,0,0,41,0,0,0,43,0,0,0,47,0,0,0,53,0,0,0,59,0,0,0,61,0,0,0,67,0,0,0,71,0,0,0,73,0,0,0,79,0,0,0,83,0,0,0,89,0,0,0,97,0,0,0,101,0,0,0,103,0,0,0,107,0,0,0,109,0,0,0,113,0,0,0,127,0,0,0,131,0,0,0,137,0,0,0,139,0,0,0,149,0,0,0,151,0,0,0,157,0,0,0,163,0,0,0,167,0,0,0,173,0,0,0,179,0,0,0,181,0,0,0,191,0,0,0,193,0,0,0,197,0,0,0,199,0,0,0,211,0,0,0,1,0,0,0,11,0,0,0,13,0,0,0,17,0,0,0,19,0,0,0,23,0,0,0,29,0,0,0,31,0,0,0,37,0,0,0,41,0,0,0,43,0,0,0,47,0,0,0,53,0,0,0,59,0,0,0,61,0,0,0,67,0,0,0,71,0,0,0,73,0,0,0,79,0,0,0,83,0,0,0,89,0,0,0,97,0,0,0,101,0,0,0,103,0,0,0,107,0,0,0,109,0,0,0,113,0,0,0,121,0,0,0,127,0,0,0,131,0,0,0,137,0,0,0,139,0,0,0,143,0,0,0,149,0,0,0,151,0,0,0,157,0,0,0,163,0,0,0,167,0,0,0,169,0,0,0,173,0,0,0,179,0,0,0,181,0,0,0,187,0,0,0,191,0,0,0,193,0,0,0,197,0,0,0,199,0,0,0,209,0,0,0,69,114,114,111,114,58,32,108,97,98,101,108,105,110,103,32,119,111,114,107,32,111,118,101,114,102,108,111,119,46,10,0,69,114,114,111,114,58,32,85,110,115,117,112,112,111,114,116,101,100,32,112,105,120,101,108,32,102,111,114,109,97,116,32,40,37,100,41,32,114,101,113,117,101,115,116,101,100,46,10,0,85,110,107,110,111,119,110,32,111,114,32,117,110,115,117,112,112,111,114,116,101,100,32,108,97,98,101,108,105,110,103,32,116,104,114,101,115,104,111,108,100,32,109,111,100,101,32,114,101,113,117,101,115,116,101,100,46,32,83,101,116,32,116,111,32,109,97,110,117,97,108,46,10,0,76,97,98,101,108,105,110,103,32,116,104,114,101,115,104,111,108,100,32,109,111,100,101,32,115,101,116,32,116,111,32,37,115,46,10,0,77,65,78,85,65,76,0,65,85,84,79,95,77,69,68,73,65,78,0,65,85,84,79,95,79,84,83,85,0,65,85,84,79,95,65,68,65,80,84,73,86,69,65,85,84,79,95,66,82,65,67,75,69,84,73,78,71,0,65,117,116,111,32,116,104,114,101,115,104,111,108,100,32,40,98,114,97,99,107,101,116,41,32,109,97,114,107,101,114,32,99,111,117,110,116,115,32,45,91,37,51,100,58,32,37,51,100,93,32,91,37,51,100,58,32,37,51,100,93,32,91,37,51,100,58,32,37,51,100,93,43,46,10,0,65,117,116,111,32,116,104,114,101,115,104,111,108,100,32,40,98,114,97,99,107,101,116,41,32,97,100,106,117,115,116,101,100,32,116,104,114,101,115,104,111,108,100,32,116,111,32,37,100,46,10,0,109,101,100,105,97,110,0,79,116,115,117,0,65,117,116,111,32,116,104,114,101,115,104,111,108,100,32,40,37,115,41,32,97,100,106,117,115,116,101,100,32,116,104,114,101,115,104,111,108,100,32,116,111,32,37,100,46,10,0,63,63,63,32,49,10,0,63,63,63,32,50,10,0,63,63,63,32,51,10,0,69,114,114,111,114,58,32,85,110,115,117,112,112,111,114,116,101,100,32,112,105,120,101,108,32,102,111,114,109,97,116,32,112,97,115,115,101,100,32,116,111,32,97,114,73,109,97,103,101,80,114,111,99,72,105,115,116,40,41,46,10,0,0,0,0,1,0,1,1,1,0,2,4,255,255,5,3,1,0,2,255,6,7,255,3,1,2,2,3,2,3,2,3,3,0,255,4,6,7,5,255,1,4,5,4,4,5,5,4,5,7,6,6,6,7,7,7,6,255,2,4,6,7,5,3,255,0,1,1,1,1,1,1,0,1,1,1,0,0,1,1,1,1,1,0,1,1,0,1,1,1,0,1,1,1,1,0,1,1,0,1,1,1,1,0,1,1,1,0,1,1,0,1,1,1,1,1,0,0,1,1,1,0,1,1,1,1,1,1,0,0,255,255,3,255,5,6,255,255,9,10,255,12,255,255,15,255,17,18,255,20,255,255,23,24,255,255,27,255,29,30,255,255,1,2,255,4,255,255,7,8,255,255,11,255,13,14,255,16,255,255,19,255,21,22,255,255,25,26,255,28,255,255,31,69,114,114,111,114,58,32,117,110,115,117,112,112,111,114,116,101,100,32,112,105,120,101,108,32,102,111,114,109,97,116,46,10,0,69,114,114,111,114,58,32,78,85,76,76,32,112,97,116,116,72,97,110,100,108,101,46,10,0,69,114,114,111,114,58,32,99,97,110,39,116,32,108,111,97,100,32,112,97,116,116,101,114,110,32,102,114,111,109,32,78,85,76,76,32,98,117,102,102,101,114,46,10,0,69,114,114,111,114,58,32,111,117,116,32,111,102,32,109,101,109,111,114,121,46,10,0,32,9,10,13,0,80,97,116,116,101,114,110,32,68,97,116,97,32,114,101,97,100,32,101,114,114,111,114,33,33,10,0,69,114,114,111,114,32,111,112,101,110,105,110,103,32,112,97,116,116,101,114,110,32,102,105,108,101,32,39,37,115,39,32,102,111,114,32,114,101,97,100,105,110,103,46,10,0,69,114,114,111,114,32,114,101,97,100,105,110,103,32,112,97,116,116,101,114,110,32,102,105,108,101,32,39,37,115,39,46,10,0,114,98,0,69,114,114,111,114,32,40,37,100,41,58,32,117,110,97,98,108,101,32,116,111,32,111,112,101,110,32,99,97,109,101,114,97,32,112,97,114,97,109,101,116,101,114,115,32,102,105,108,101,32,34,37,115,34,32,102,111,114,32,114,101,97,100,105,110,103,46,10,0,69,114,114,111,114,32,40,37,100,41,58,32,117,110,97,98,108,101,32,116,111,32,100,101,116,101,114,109,105,110,101,32,102,105,108,101,32,108,101,110,103,116,104,46,0,69,114,114,111,114,58,32,115,117,112,112,108,105,101,100,32,102,105,108,101,32,100,111,101,115,32,110,111,116,32,97,112,112,101,97,114,32,116,111,32,98,101,32,97,110,32,65,82,84,111,111,108,75,105,116,32,99,97,109,101,114,97,32,112,97,114,97,109,101,116,101,114,32,102,105,108,101,46,10,0,69,114,114,111,114,32,40,37,100,41,58,32,117,110,97,98,108,101,32,116,111,32,114,101,97,100,32,102,114,111,109,32,102,105,108,101,46,0,69,114,114,111,114,58,32,105,99,112,71,101,116,74,95,85,95,88,99,0,69,114,114,111,114,58,32,109,97,108,108,111,99,10,0,69,114,114,111,114,32,49,58,32,105,99,112,71,101,116,73,110,105,116,88,119,50,88,99,10,0,69,114,114,111,114,32,50,58,32,105,99,112,71,101,116,73,110,105,116,88,119,50,88,99,10,0,69,114,114,111,114,32,51,58,32,105,99,112,71,101,116,73,110,105,116,88,119,50,88,99,10,0,69,114,114,111,114,32,52,58,32,105,99,112,71,101,116,73,110,105,116,88,119,50,88,99,10,0,69,114,114,111,114,32,53,58,32,105,99,112,71,101,116,73,110,105,116,88,119,50,88,99,10,0,69,114,114,111,114,32,54,58,32,105,99,112,71,101,116,73,110,105,116,88,119,50,88,99,10,0,69,114,114,111,114,32,55,58,32,105,99,112,71,101,116,73,110,105,116,88,119,50,88,99,10,0,114,0,69,114,114,111,114,58,32,117,110,97,98,108,101,32,116,111,32,111,112,101,110,32,109,117,108,116,105,109,97,114,107,101,114,32,99,111,110,102,105,103,32,102,105,108,101,32,39,37,115,39,46,10,0,37,115,37,115,10,0,37,100,0,69,114,114,111,114,32,112,114,111,99,101,115,115,105,110,103,32,109,117,108,116,105,109,97,114,107,101,114,32,99,111,110,102,105,103,32,102,105,108,101,32,39,37,115,39,58,32,70,105,114,115,116,32,108,105,110,101,32,109,117,115,116,32,98,101,32,110,117,109,98,101,114,32,111,102,32,109,97,114,107,101,114,32,99,111,110,102,105,103,115,32,116,111,32,114,101,97,100,46,10,0,79,117,116,32,111,102,32,109,101,109,111,114,121,33,33,10,0,37,108,108,117,37,99,0,69,114,114,111,114,32,112,114,111,99,101,115,115,105,110,103,32,109,117,108,116,105,109,97,114,107,101,114,32,99,111,110,102,105,103,32,102,105,108,101,32,39,37,115,39,58,32,112,97,116,116,101,114,110,32,39,37,115,39,32,115,112,101,99,105,102,105,101,100,32,105,110,32,109,117,108,116,105,109,97,114,107,101,114,32,99,111,110,102,105,103,117,114,97,116,105,111,110,32,119,104,105,108,101,32,105,110,32,98,97,114,99,111,100,101,45,111,110,108,121,32,109,111,100,101,46,10,0,69,114,114,111,114,32,112,114,111,99,101,115,115,105,110,103,32,109,117,108,116,105,109,97,114,107,101,114,32,99,111,110,102,105,103,32,102,105,108,101,32,39,37,115,39,58,32,85,110,97,98,108,101,32,116,111,32,100,101,116,101,114,109,105,110,101,32,100,105,114,101,99,116,111,114,121,32,110,97,109,101,46,10,0,69,114,114,111,114,32,112,114,111,99,101,115,115,105,110,103,32,109,117,108,116,105,109,97,114,107,101,114,32,99,111,110,102,105,103,32,102,105,108,101,32,39,37,115,39,58,32,85,110,97,98,108,101,32,116,111,32,108,111,97,100,32,112,97,116,116,101,114,110,32,39,37,115,39,46,10,0,37,108,102,0,69,114,114,111,114,32,112,114,111,99,101,115,115,105,110,103,32,109,117,108,116,105,109,97,114,107,101,114,32,99,111,110,102,105,103,32,102,105,108,101,32,39,37,115,39,44,32,109,97,114,107,101,114,32,100,101,102,105,110,105,116,105,111,110,32,37,51,100,58,32,70,105,114,115,116,32,108,105,110,101,32,109,117,115,116,32,98,101,32,112,97,116,116,101,114,110,32,119,105,100,116,104,46,10,0,37,108,102,32,37,108,102,32,37,108,102,32,37,108,102,0,37,102,32,37,102,0,69,114,114,111,114,32,112,114,111,99,101,115,115,105,110,103,32,109,117,108,116,105,109,97,114,107,101,114,32,99,111,110,102,105,103,32,102,105,108,101,32,39,37,115,39,44,32,109,97,114,107,101,114,32,100,101,102,105,110,105,116,105,111,110,32,37,51,100,58,32,76,105,110,101,115,32,50,32,45,32,52,32,109,117,115,116,32,98,101,32,109,97,114,107,101,114,32,116,114,97,110,115,102,111,114,109,46,10,0,97,114,103,108,67,97,109,101,114,97,70,114,117,115,116,117,109,40,41,58,32,97,114,80,97,114,97,109,68,101,99,111,109,112,77,97,116,40,41,32,105,110,100,105,99,97,116,101,100,32,112,97,114,97,109,101,116,101,114,32,101,114,114,111,114,46,10,0,108,111,97,100,67,97,109,101,114,97,40,41,58,32,69,114,114,111,114,32,108,111,97,100,105,110,103,32,112,97,114,97,109,101,116,101,114,32,102,105,108,101,32,37,115,32,102,111,114,32,99,97,109,101,114,97,46,10,0,42,42,42,32,67,97,109,101,114,97,32,80,97,114,97,109,101,116,101,114,32,114,101,115,105,122,101,100,32,102,114,111,109,32,37,100,44,32,37,100,46,32,42,42,42,10,0,115,101,116,67,97,109,101,114,97,40,41,58,32,69,114,114,111,114,58,32,97,114,80,97,114,97,109,76,84,67,114,101,97,116,101,46,10,0,115,101,116,67,97,109,101,114,97,40,41,58,32,69,114,114,111,114,58,32,97,114,67,114,101,97,116,101,72,97,110,100,108,101,46,10,0,115,101,116,67,97,109,101,114,97,40,41,58,32,69,114,114,111,114,32,99,114,101,97,116,105,110,103,32,51,68,32,104,97,110,100,108,101,0,108,111,97,100,77,97,114,107,101,114,40,41,58,32,69,114,114,111,114,32,108,111,97,100,105,110,103,32,112,97,116,116,101,114,110,32,102,105,108,101,32,37,115,46,10,0,65,82,84,111,111,108,75,105,116,74,83,40,41,58,32,85,110,97,98,108,101,32,116,111,32,115,101,116,32,117,112,32,65,82,32,109,97,114,107,101,114,46,10,0,99,111,110,102,105,103,32,100,97,116,97,32,108,111,97,100,32,101,114,114,111,114,32,33,33,10,0,65,82,84,111,111,108,75,105,116,74,83,40,41,58,32,85,110,97,98,108,101,32,116,111,32,115,101,116,32,117,112,32,65,82,32,109,117,108,116,105,109,97,114,107,101,114,46,10,0,80,97,116,116,101,114,110,32,100,101,116,101,99,116,105,111,110,32,109,111,100,101,32,115,101,116,32,116,111,32,37,100,46,10,0,80,97,116,116,101,114,110,32,114,97,116,105,111,32,115,105,122,101,32,115,101,116,32,116,111,32,37,102,46,10,0,76,97,98,101,108,105,110,103,32,109,111,100,101,32,115,101,116,32,116,111,32,37,100,10,0,84,104,114,101,115,104,111,108,100,32,115,101,116,32,116,111,32,37,100,10,0,84,104,114,101,115,104,111,108,100,32,109,111,100,101,32,115,101,116,32,116,111,32,37,100,10,0,111,110,46,0,111,102,102,46,0,68,101,98,117,103,32,109,111,100,101,32,115,101,116,32,116,111,32,37,115,10,0,73,109,97,103,101,32,112,114,111,99,46,32,109,111,100,101,32,115,101,116,32,116,111,32,37,100,46,10,0,123,32,105,102,32,40,33,97,114,116,111,111,108,107,105,116,91,34,109,117,108,116,105,69,97,99,104,77,97,114,107,101,114,73,110,102,111,34,93,41,32,123,32,97,114,116,111,111,108,107,105,116,91,34,109,117,108,116,105,69,97,99,104,77,97,114,107,101,114,73,110,102,111,34,93,32,61,32,40,123,125,41,59,32,125,32,118,97,114,32,109,117,108,116,105,69,97,99,104,77,97,114,107,101,114,32,61,32,97,114,116,111,111,108,107,105,116,91,34,109,117,108,116,105,69,97,99,104,77,97,114,107,101,114,73,110,102,111,34,93,59,32,109,117,108,116,105,69,97,99,104,77,97,114,107,101,114,91,39,118,105,115,105,98,108,101,39,93,32,61,32,36,48,59,32,109,117,108,116,105,69,97,99,104,77,97,114,107,101,114,91,39,112,97,116,116,73,100,39,93,32,61,32,36,49,59,32,109,117,108,116,105,69,97,99,104,77,97,114,107,101,114,91,39,112,97,116,116,84,121,112,101,39,93,32,61,32,36,50,59,32,109,117,108,116,105,69,97,99,104,77,97,114,107,101,114,91,39,119,105,100,116,104,39,93,32,61,32,36,51,59,32,125,0,123,32,118,97,114,32,36,97,32,61,32,97,114,103,117,109,101,110,116,115,59,32,118,97,114,32,105,32,61,32,49,50,59,32,105,102,32,40,33,97,114,116,111,111,108,107,105,116,91,34,109,97,114,107,101,114,73,110,102,111,34,93,41,32,123,32,97,114,116,111,111,108,107,105,116,91,34,109,97,114,107,101,114,73,110,102,111,34,93,32,61,32,40,123,32,112,111,115,58,32,91,48,44,48,93,44,32,108,105,110,101,58,32,91,91,48,44,48,44,48,93,44,32,91,48,44,48,44,48,93,44,32,91,48,44,48,44,48,93,44,32,91,48,44,48,44,48,93,93,44,32,118,101,114,116,101,120,58,32,91,91,48,44,48,93,44,32,91,48,44,48,93,44,32,91,48,44,48,93,44,32,91,48,44,48,93,93,32,125,41,59,32,125,32,118,97,114,32,109,97,114,107,101,114,73,110,102,111,32,61,32,97,114,116,111,111,108,107,105,116,91,34,109,97,114,107,101,114,73,110,102,111,34,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,97,114,101,97,34,93,32,61,32,36,48,59,32,109,97,114,107,101,114,73,110,102,111,91,34,105,100,34,93,32,61,32,36,49,59,32,109,97,114,107,101,114,73,110,102,111,91,34,105,100,80,97,116,116,34,93,32,61,32,36,50,59,32,109,97,114,107,101,114,73,110,102,111,91,34,105,100,77,97,116,114,105,120,34,93,32,61,32,36,51,59,32,109,97,114,107,101,114,73,110,102,111,91,34,100,105,114,34,93,32,61,32,36,52,59,32,109,97,114,107,101,114,73,110,102,111,91,34,100,105,114,80,97,116,116,34,93,32,61,32,36,53,59,32,109,97,114,107,101,114,73,110,102,111,91,34,100,105,114,77,97,116,114,105,120,34,93,32,61,32,36,54,59,32,109,97,114,107,101,114,73,110,102,111,91,34,99,102,34,93,32,61,32,36,55,59,32,109,97,114,107,101,114,73,110,102,111,91,34,99,102,80,97,116,116,34,93,32,61,32,36,56,59,32,109,97,114,107,101,114,73,110,102,111,91,34,99,102,77,97,116,114,105,120,34,93,32,61,32,36,57,59,32,109,97,114,107,101,114,73,110,102,111,91,34,112,111,115,34,93,91,48,93,32,61,32,36,49,48,59,32,109,97,114,107,101,114,73,110,102,111,91,34,112,111,115,34,93,91,49,93,32,61,32,36,49,49,59,32,109,97,114,107,101,114,73,110,102,111,91,34,108,105,110,101,34,93,91,48,93,91,48,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,108,105,110,101,34,93,91,48,93,91,49,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,108,105,110,101,34,93,91,48,93,91,50,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,108,105,110,101,34,93,91,49,93,91,48,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,108,105,110,101,34,93,91,49,93,91,49,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,108,105,110,101,34,93,91,49,93,91,50,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,108,105,110,101,34,93,91,50,93,91,48,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,108,105,110,101,34,93,91,50,93,91,49,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,108,105,110,101,34,93,91,50,93,91,50,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,108,105,110,101,34,93,91,51,93,91,48,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,108,105,110,101,34,93,91,51,93,91,49,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,108,105,110,101,34,93,91,51,93,91,50,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,118,101,114,116,101,120,34,93,91,48,93,91,48,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,118,101,114,116,101,120,34,93,91,48,93,91,49,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,118,101,114,116,101,120,34,93,91,49,93,91,48,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,118,101,114,116,101,120,34,93,91,49,93,91,49,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,118,101,114,116,101,120,34,93,91,50,93,91,48,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,118,101,114,116,101,120,34,93,91,50,93,91,49,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,118,101,114,116,101,120,34,93,91,51,93,91,48,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,118,101,114,116,101,120,34,93,91,51,93,91,49,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,101,114,114,111,114,67,111,114,114,101,99,116,101,100,34,93,32,61,32,36,97,91,105,43,43,93,59,32,125,0,115,101,116,117,112,40,41,58,32,69,114,114,111,114,58,32,97,114,80,97,116,116,67,114,101,97,116,101,72,97,110,100,108,101,46,10,0,65,108,108,111,99,97,116,101,100,32,118,105,100,101,111,70,114,97,109,101,83,105,122,101,32,37,100,10,0,123,32,105,102,32,40,33,97,114,116,111,111,108,107,105,116,91,34,102,114,97,109,101,77,97,108,108,111,99,34,93,41,32,123,32,97,114,116,111,111,108,107,105,116,91,34,102,114,97,109,101,77,97,108,108,111,99,34,93,32,61,32,40,123,125,41,59,32,125,32,118,97,114,32,102,114,97,109,101,77,97,108,108,111,99,32,61,32,97,114,116,111,111,108,107,105,116,91,34,102,114,97,109,101,77,97,108,108,111,99,34,93,59,32,102,114,97,109,101,77,97,108,108,111,99,91,34,102,114,97,109,101,112,111,105,110,116,101,114,34,93,32,61,32,36,49,59,32,102,114,97,109,101,77,97,108,108,111,99,91,34,102,114,97,109,101,115,105,122,101,34,93,32,61,32,36,50,59,32,102,114,97,109,101,77,97,108,108,111,99,91,34,99,97,109,101,114,97,34,93,32,61,32,36,51,59,32,102,114,97,109,101,77,97,108,108,111,99,91,34,116,114,97,110,115,102,111,114,109,34,93,32,61,32,36,52,59,32,125,0,115,101,116,117,112,0,116,101,97,114,100,111,119,110,0,95,97,100,100,77,97,114,107,101,114,0,95,97,100,100,77,117,108,116,105,77,97,114,107,101,114,0,103,101,116,77,117,108,116,105,77,97,114,107,101,114,78,117,109,0,103,101,116,77,117,108,116,105,77,97,114,107,101,114,67,111,117,110,116,0,95,108,111,97,100,67,97,109,101,114,97,0,115,101,116,77,97,114,107,101,114,73,110,102,111,68,105,114,0,115,101,116,77,97,114,107,101,114,73,110,102,111,86,101,114,116,101,120,0,103,101,116,84,114,97,110,115,77,97,116,83,113,117,97,114,101,0,103,101,116,84,114,97,110,115,77,97,116,83,113,117,97,114,101,67,111,110,116,0,103,101,116,84,114,97,110,115,77,97,116,77,117,108,116,105,83,113,117,97,114,101,0,103,101,116,84,114,97,110,115,77,97,116,77,117,108,116,105,83,113,117,97,114,101,82,111,98,117,115,116,0,100,101,116,101,99,116,77,97,114,107,101,114,0,103,101,116,77,97,114,107,101,114,78,117,109,0,103,101,116,77,117,108,116,105,69,97,99,104,77,97,114,107,101,114,0,103,101,116,77,97,114,107,101,114,0,115,101,116,68,101,98,117,103,77,111,100,101,0,103,101,116,68,101,98,117,103,77,111,100,101,0,103,101,116,80,114,111,99,101,115,115,105,110,103,73,109,97,103,101,0,115,101,116,76,111,103,76,101,118,101,108,0,103,101,116,76,111,103,76,101,118,101,108,0,115,101,116,80,114,111,106,101,99,116,105,111,110,78,101,97,114,80,108,97,110,101,0,103,101,116,80,114,111,106,101,99,116,105,111,110,78,101,97,114,80,108,97,110,101,0,115,101,116,80,114,111,106,101,99,116,105,111,110,70,97,114,80,108,97,110,101,0,103,101,116,80,114,111,106,101,99,116,105,111,110,70,97,114,80,108,97,110,101,0,115,101,116,84,104,114,101,115,104,111,108,100,77,111,100,101,0,103,101,116,84,104,114,101,115,104,111,108,100,77,111,100,101,0,115,101,116,84,104,114,101,115,104,111,108,100,0,103,101,116,84,104,114,101,115,104,111,108,100,0,115,101,116,80,97,116,116,101,114,110,68,101,116,101,99,116,105,111,110,77,111,100,101,0,103,101,116,80,97,116,116,101,114,110,68,101,116,101,99,116,105,111,110,77,111,100,101,0,115,101,116,80,97,116,116,82,97,116,105,111,0,103,101,116,80,97,116,116,82,97,116,105,111,0,115,101,116,77,97,116,114,105,120,67,111,100,101,84,121,112,101,0,103,101,116,77,97,116,114,105,120,67,111,100,101,84,121,112,101,0,115,101,116,76,97,98,101,108,105,110,103,77,111,100,101,0,103,101,116,76,97,98,101,108,105,110,103,77,111,100,101,0,115,101,116,73,109,97,103,101,80,114,111,99,77,111,100,101,0,103,101,116,73,109,97,103,101,80,114,111,99,77,111,100,101,0,69,82,82,79,82,95,65,82,67,79,78,84,82,79,76,76,69,82,95,78,79,84,95,70,79,85,78,68,0,69,82,82,79,82,95,77,85,76,84,73,77,65,82,75,69,82,95,78,79,84,95,70,79,85,78,68,0,69,82,82,79,82,95,77,65,82,75,69,82,95,73,78,68,69,88,95,79,85,84,95,79,70,95,66,79,85,78,68,83,0,65,82,95,68,69,66,85,71,95,68,73,83,65,66,76,69,0,65,82,95,68,69,66,85,71,95,69,78,65,66,76,69,0,65,82,95,68,69,70,65,85,76,84,95,68,69,66,85,71,95,77,79,68,69,0,65,82,95,76,65,66,69,76,73,78,71,95,87,72,73,84,69,95,82,69,71,73,79,78,0,65,82,95,76,65,66,69,76,73,78,71,95,66,76,65,67,75,95,82,69,71,73,79,78,0,65,82,95,68,69,70,65,85,76,84,95,76,65,66,69,76,73,78,71,95,77,79,68,69,0,65,82,95,68,69,70,65,85,76,84,95,76,65,66,69,76,73,78,71,95,84,72,82,69,83,72,0,65,82,95,73,77,65,71,69,95,80,82,79,67,95,70,82,65,77,69,95,73,77,65,71,69,0,65,82,95,73,77,65,71,69,95,80,82,79,67,95,70,73,69,76,68,95,73,77,65,71,69,0,65,82,95,68,69,70,65,85,76,84,95,73,77,65,71,69,95,80,82,79,67,95,77,79,68,69,0,65,82,95,84,69,77,80,76,65,84,69,95,77,65,84,67,72,73,78,71,95,67,79,76,79,82,0,65,82,95,84,69,77,80,76,65,84,69,95,77,65,84,67,72,73,78,71,95,77,79,78,79,0,65,82,95,77,65,84,82,73,88,95,67,79,68,69,95,68,69,84,69,67,84,73,79,78,0,65,82,95,84,69,77,80,76,65,84,69,95,77,65,84,67,72,73,78,71,95,67,79,76,79,82,95,65,78,68,95,77,65,84,82,73,88,0,65,82,95,84,69,77,80,76,65,84,69,95,77,65,84,67,72,73,78,71,95,77,79,78,79,95,65,78,68,95,77,65,84,82,73,88,0,65,82,95,68,69,70,65,85,76,84,95,80,65,84,84,69,82,78,95,68,69,84,69,67,84,73,79,78,95,77,79,68,69,0,65,82,95,85,83,69,95,84,82,65,67,75,73,78,71,95,72,73,83,84,79,82,89,0,65,82,95,78,79,85,83,69,95,84,82,65,67,75,73,78,71,95,72,73,83,84,79,82,89,0,65,82,95,85,83,69,95,84,82,65,67,75,73,78,71,95,72,73,83,84,79,82,89,95,86,50,0,65,82,95,68,69,70,65,85,76,84,95,77,65,82,75,69,82,95,69,88,84,82,65,67,84,73,79,78,95,77,79,68,69,0,65,82,95,77,65,88,95,76,79,79,80,95,67,79,85,78,84,0,65,82,95,76,79,79,80,95,66,82,69,65,75,95,84,72,82,69,83,72,0,65,82,95,76,79,71,95,76,69,86,69,76,95,68,69,66,85,71,0,65,82,95,76,79,71,95,76,69,86,69,76,95,73,78,70,79,0,65,82,95,76,79,71,95,76,69,86,69,76,95,87,65,82,78,0,65,82,95,76,79,71,95,76,69,86,69,76,95,69,82,82,79,82,0,65,82,95,76,79,71,95,76,69,86,69,76,95,82,69,76,95,73,78,70,79,0,65,82,95,77,65,84,82,73,88,95,67,79,68,69,95,51,120,51,0,65,82,95,77,65,84,82,73,88,95,67,79,68,69,95,51,120,51,95,72,65,77,77,73,78,71,54,51,0,65,82,95,77,65,84,82,73,88,95,67,79,68,69,95,51,120,51,95,80,65,82,73,84,89,54,53,0,65,82,95,77,65,84,82,73,88,95,67,79,68,69,95,52,120,52,0,65,82,95,77,65,84,82,73,88,95,67,79,68,69,95,52,120,52,95,66,67,72,95,49,51,95,57,95,51,0,65,82,95,77,65,84,82,73,88,95,67,79,68,69,95,52,120,52,95,66,67,72,95,49,51,95,53,95,53,0,65,82,95,76,65,66,69,76,73,78,71,95,84,72,82,69,83,72,95,77,79,68,69,95,77,65,78,85,65,76,0,65,82,95,76,65,66,69,76,73,78,71,95,84,72,82,69,83,72,95,77,79,68,69,95,65,85,84,79,95,77,69,68,73,65,78,0,65,82,95,76,65,66], "i8", ALLOC_NONE, Runtime.GLOBAL_BASE); +/* memory initializer */ allocate([69,76,73,78,71,95,84,72,82,69,83,72,95,77,79,68,69,95,65,85,84,79,95,79,84,83,85,0,65,82,95,76,65,66,69,76,73,78,71,95,84,72,82,69,83,72,95,77,79,68,69,95,65,85,84,79,95,65,68,65,80,84,73,86,69,0,65,82,95,77,65,82,75,69,82,95,73,78,70,79,95,67,85,84,79,70,70,95,80,72,65,83,69,95,78,79,78,69,0,65,82,95,77,65,82,75,69,82,95,73,78,70,79,95,67,85,84,79,70,70,95,80,72,65,83,69,95,80,65,84,84,69,82,78,95,69,88,84,82,65,67,84,73,79,78,0,65,82,95,77,65,82,75,69,82,95,73,78,70,79,95,67,85,84,79,70,70,95,80,72,65,83,69,95,77,65,84,67,72,95,71,69,78,69,82,73,67,0,65,82,95,77,65,82,75,69,82,95,73,78,70,79,95,67,85,84,79,70,70,95,80,72,65,83,69,95,77,65,84,67,72,95,67,79,78,84,82,65,83,84,0,65,82,95,77,65,82,75,69,82,95,73,78,70,79,95,67,85,84,79,70,70,95,80,72,65,83,69,95,77,65,84,67,72,95,66,65,82,67,79,68,69,95,78,79,84,95,70,79,85,78,68,0,65,82,95,77,65,82,75,69,82,95,73,78,70,79,95,67,85,84,79,70,70,95,80,72,65,83,69,95,77,65,84,67,72,95,66,65,82,67,79,68,69,95,69,68,67,95,70,65,73,76,0,65,82,95,77,65,82,75,69,82,95,73,78,70,79,95,67,85,84,79,70,70,95,80,72,65,83,69,95,77,65,84,67,72,95,67,79,78,70,73,68,69,78,67,69,0,65,82,95,77,65,82,75,69,82,95,73,78,70,79,95,67,85,84,79,70,70,95,80,72,65,83,69,95,80,79,83,69,95,69,82,82,79,82,0,65,82,95,77,65,82,75,69,82,95,73,78,70,79,95,67,85,84,79,70,70,95,80,72,65,83,69,95,80,79,83,69,95,69,82,82,79,82,95,77,85,76,84,73,0,65,82,95,77,65,82,75,69,82,95,73,78,70,79,95,67,85,84,79,70,70,95,80,72,65,83,69,95,72,69,85,82,73,83,84,73,67,95,84,82,79,85,66,76,69,83,79,77,69,95,77,65,84,82,73,88,95,67,79,68,69,83,0,118,105,105,102,0,118,105,105,105,0,100,105,105,0,118,105,105,100,0,105,105,0,118,105,105,0,105,105,105,0,78,83,116,51,95,95,49,49,50,98,97,115,105,99,95,115,116,114,105,110,103,73,99,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,99,69,69,78,83,95,57,97,108,108,111,99,97,116,111,114,73,99,69,69,69,69,0,78,83,116,51,95,95,49,50,49,95,95,98,97,115,105,99,95,115,116,114,105,110,103,95,99,111,109,109,111,110,73,76,98,49,69,69,69,0,105,105,105,105,0,105,105,105,105,105,0,115,116,100,58,58,98,97,115,105,99,95,115,116,114,105,110,103,60,117,110,115,105,103,110,101,100,32,99,104,97,114,62,0,115,116,100,58,58,119,115,116,114,105,110,103,0,101,109,115,99,114,105,112,116,101,110,58,58,118,97,108,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,99,104,97,114,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,115,105,103,110,101,100,32,99,104,97,114,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,117,110,115,105,103,110,101,100,32,99,104,97,114,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,115,104,111,114,116,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,117,110,115,105,103,110,101,100,32,115,104,111,114,116,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,105,110,116,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,117,110,115,105,103,110,101,100,32,105,110,116,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,108,111,110,103,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,117,110,115,105,103,110,101,100,32,108,111,110,103,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,105,110,116,56,95,116,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,117,105,110,116,56,95,116,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,105,110,116,49,54,95,116,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,117,105,110,116,49,54,95,116,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,105,110,116,51,50,95,116,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,117,105,110,116,51,50,95,116,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,102,108,111,97,116,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,100,111,117,98,108,101,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,108,111,110,103,32,100,111,117,98,108,101,62,0,78,49,48,101,109,115,99,114,105,112,116,101,110,49,49,109,101,109,111,114,121,95,118,105,101,119,73,101,69,69,0,78,49,48,101,109,115,99,114,105,112,116,101,110,49,49,109,101,109,111,114,121,95,118,105,101,119,73,100,69,69,0,78,49,48,101,109,115,99,114,105,112,116,101,110,49,49,109,101,109,111,114,121,95,118,105,101,119,73,102,69,69,0,78,49,48,101,109,115,99,114,105,112,116,101,110,49,49,109,101,109,111,114,121,95,118,105,101,119,73,109,69,69,0,78,49,48,101,109,115,99,114,105,112,116,101,110,49,49,109,101,109,111,114,121,95,118,105,101,119,73,108,69,69,0,78,49,48,101,109,115,99,114,105,112,116,101,110,49,49,109,101,109,111,114,121,95,118,105,101,119,73,106,69,69,0,78,49,48,101,109,115,99,114,105,112,116,101,110,49,49,109,101,109,111,114,121,95,118,105,101,119,73,105,69,69,0,78,49,48,101,109,115,99,114,105,112,116,101,110,49,49,109,101,109,111,114,121,95,118,105,101,119,73,116,69,69,0,78,49,48,101,109,115,99,114,105,112,116,101,110,49,49,109,101,109,111,114,121,95,118,105,101,119,73,115,69,69,0,78,49,48,101,109,115,99,114,105,112,116,101,110,49,49,109,101,109,111,114,121,95,118,105,101,119,73,104,69,69,0,78,49,48,101,109,115,99,114,105,112,116,101,110,49,49,109,101,109,111,114,121,95,118,105,101,119,73,97,69,69,0,78,49,48,101,109,115,99,114,105,112,116,101,110,49,49,109,101,109,111,114,121,95,118,105,101,119,73,99,69,69,0,78,49,48,101,109,115,99,114,105,112,116,101,110,51,118,97,108,69,0,78,83,116,51,95,95,49,49,50,98,97,115,105,99,95,115,116,114,105,110,103,73,119,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,119,69,69,78,83,95,57,97,108,108,111,99,97,116,111,114,73,119,69,69,69,69,0,78,83,116,51,95,95,49,49,50,98,97,115,105,99,95,115,116,114,105,110,103,73,104,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,104,69,69,78,83,95,57,97,108,108,111,99,97,116,111,114,73,104,69,69,69,69,0,83,116,57,98,97,100,95,97,108,108,111,99,0,83,116,57,101,120,99,101,112,116,105,111,110,0,83,116,57,116,121,112,101,95,105,110,102,111,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,54,95,95,115,104,105,109,95,116,121,112,101,95,105,110,102,111,69,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,55,95,95,99,108,97,115,115,95,116,121,112,101,95,105,110,102,111,69,0,78,49,48,95,95,99,120,120,97,98,105,118,49,50,51,95,95,102,117,110,100,97,109,101,110,116,97,108,95,116,121,112,101,95,105,110,102,111,69,0,118,0,98,0,99,0,104,0,97,0,115,0,116,0,105,0,106,0,109,0,102,0,100,0,78,49,48,95,95,99,120,120,97,98,105,118,49,50,48,95,95,115,105,95,99,108,97,115,115,95,116,121,112,101,95,105,110,102,111,69,0,78,49,48,95,95,99,120,120,97,98,105,118,49,50,49,95,95,118,109,105,95,99,108,97,115,115,95,116,121,112,101,95,105,110,102,111,69,0,33,34,118,101,99,116,111,114,32,108,101,110,103,116,104,95,101,114,114,111,114,34,0,47,85,115,101,114,115,47,106,101,114,111,109,101,101,116,105,101,110,110,101,47,119,111,114,107,47,101,109,115,100,107,95,112,111,114,116,97,98,108,101,47,101,109,115,99,114,105,112,116,101,110,47,49,46,51,53,46,48,47,115,121,115,116,101,109,47,105,110,99,108,117,100,101,47,108,105,98,99,120,120,47,118,101,99,116,111,114,0,95,95,116,104,114,111,119,95,108,101,110,103,116,104,95,101,114,114,111,114,0,115,116,100,58,58,98,97,100,95,97,108,108,111,99,0,33,34,98,97,115,105,99,95,115,116,114,105,110,103,32,108,101,110,103,116,104,95,101,114,114,111,114,34,0,47,85,115,101,114,115,47,106,101,114,111,109,101,101,116,105,101,110,110,101,47,119,111,114,107,47,101,109,115,100,107,95,112,111,114,116,97,98,108,101,47,101,109,115,99,114,105,112,116,101,110,47,49,46,51,53,46,48,47,115,121,115,116,101,109,47,105,110,99,108,117,100,101,47,108,105,98,99,120,120,47,115,116,114,105,110,103,0,32,40,0,41,0,95,98,108,111,99,107,95,105,110,118,111,107,101,0,105,110,118,111,99,97,116,105,111,110,32,102,117,110,99,116,105,111,110,32,102,111,114,32,98,108,111,99,107,32,105,110,32,0,32,99,111,110,115,116,0,32,118,111,108,97,116,105,108,101,0,32,114,101,115,116,114,105,99,116,0,32,91,0,32,91,93,0,93,0,32,99,111,109,112,108,101,120,0,40,0,44,32,0,32,38,0,32,38,38,0,32,0,32,105,109,97,103,105,110,97,114,121,0,58,58,42,0,38,38,0,111,98,106,99,95,111,98,106,101,99,116,60,0,42,0,105,100,0,38,0,111,98,106,99,112,114,111,116,111,0,60,0,62,0,32,118,101,99,116,111,114,91,0,112,105,120,101,108,32,118,101,99,116,111,114,91,0,100,101,99,108,116,121,112,101,40,0,115,116,100,58,58,97,108,108,111,99,97,116,111,114,0,115,116,100,58,58,98,97,115,105,99,95,115,116,114,105,110,103,0,115,116,100,58,58,115,116,114,105,110,103,0,115,116,100,58,58,105,115,116,114,101,97,109,0,115,116,100,58,58,111,115,116,114,101,97,109,0,115,116,100,58,58,105,111,115,116,114,101,97,109,0,115,116,100,0,58,58,0,58,58,115,116,114,105,110,103,32,108,105,116,101,114,97,108,0,115,116,100,58,58,0,126,0,39,117,110,110,97,109,101,100,0,39,108,97,109,98,100,97,39,40,0,111,112,101,114,97,116,111,114,38,38,0,111,112,101,114,97,116,111,114,38,0,111,112,101,114,97,116,111,114,38,61,0,111,112,101,114,97,116,111,114,61,0,111,112,101,114,97,116,111,114,40,41,0,111,112,101,114,97,116,111,114,44,0,111,112,101,114,97,116,111,114,126,0,111,112,101,114,97,116,111,114,32,0,111,112,101,114,97,116,111,114,32,100,101,108,101,116,101,91,93,0,111,112,101,114,97,116,111,114,42,0,111,112,101,114,97,116,111,114,32,100,101,108,101,116,101,0,111,112,101,114,97,116,111,114,47,0,111,112,101,114,97,116,111,114,47,61,0,111,112,101,114,97,116,111,114,94,0,111,112,101,114,97,116,111,114,94,61,0,111,112,101,114,97,116,111,114,61,61,0,111,112,101,114,97,116,111,114,62,61,0,111,112,101,114,97,116,111,114,62,0,111,112,101,114,97,116,111,114,91,93,0,111,112,101,114,97,116,111,114,60,61,0,111,112,101,114,97,116,111,114,34,34,32,0,111,112,101,114,97,116,111,114,60,60,0,111,112,101,114,97,116,111,114,60,60,61,0,111,112,101,114,97,116,111,114,60,0,111,112,101,114,97,116,111,114,45,0,111,112,101,114,97,116,111,114,45,61,0,111,112,101,114,97,116,111,114,42,61,0,111,112,101,114,97,116,111,114,45,45,0,111,112,101,114,97,116,111,114,32,110,101,119,91,93,0,111,112,101,114,97,116,111,114,33,61,0,111,112,101,114,97,116,111,114,33,0,111,112,101,114,97,116,111,114,32,110,101,119,0,111,112,101,114,97,116,111,114,124,124,0,111,112,101,114,97,116,111,114,124,0,111,112,101,114,97,116,111,114,124,61,0,111,112,101,114,97,116,111,114,45,62,42,0,111,112,101,114,97,116,111,114,43,0,111,112,101,114,97,116,111,114,43,61,0,111,112,101,114,97,116,111,114,43,43,0,111,112,101,114,97,116,111,114,45,62,0,111,112,101,114,97,116,111,114,63,0,111,112,101,114,97,116,111,114,37,0,111,112,101,114,97,116,111,114,37,61,0,111,112,101,114,97,116,111,114,62,62,0,111,112,101,114,97,116,111,114,62,62,61,0,115,116,100,58,58,98,97,115,105,99,95,115,116,114,105,110,103,60,99,104,97,114,44,32,115,116,100,58,58,99,104,97,114,95,116,114,97,105,116,115,60,99,104,97,114,62,44,32,115,116,100,58,58,97,108,108,111,99,97,116,111,114,60,99,104,97,114,62,32,62,0,98,97,115,105,99,95,115,116,114,105,110,103,0,115,116,100,58,58,98,97,115,105,99,95,105,115,116,114,101,97,109,60,99,104,97,114,44,32,115,116,100,58,58,99,104,97,114,95,116,114,97,105,116,115,60,99,104,97,114,62,32,62,0,98,97,115,105,99,95,105,115,116,114,101,97,109,0,115,116,100,58,58,98,97,115,105,99,95,111,115,116,114,101,97,109,60,99,104,97,114,44,32,115,116,100,58,58,99,104,97,114,95,116,114,97,105,116,115,60,99,104,97,114,62,32,62,0,98,97,115,105,99,95,111,115,116,114,101,97,109,0,115,116,100,58,58,98,97,115,105,99,95,105,111,115,116,114,101,97,109,60,99,104,97,114,44,32,115,116,100,58,58,99,104,97,114,95,116,114,97,105,116,115,60,99,104,97,114,62,32,62,0,98,97,115,105,99,95,105,111,115,116,114,101,97,109,0,95,71,76,79,66,65,76,95,95,78,0,40,97,110,111,110,121,109,111,117,115,32,110,97,109,101,115,112,97,99,101,41,0,32,62,0,119,99,104,97,114,95,116,0,102,97,108,115,101,0,116,114,117,101,0,99,104,97,114,0,115,105,103,110,101,100,32,99,104,97,114,0,117,110,115,105,103,110,101,100,32,99,104,97,114,0,115,104,111,114,116,0,117,110,115,105,103,110,101,100,32,115,104,111,114,116,0,0,117,0,108,0,117,108,0,108,108,0,117,108,108,0,95,95,105,110,116,49,50,56,0,117,110,115,105,103,110,101,100,32,95,95,105,110,116,49,50,56,0,37,97,102,0,37,97,0,37,76,97,76,0,38,61,0,61,0,97,108,105,103,110,111,102,32,40,0,99,111,110,115,116,95,99,97,115,116,60,0,62,40,0,44,0,41,40,0,100,101,108,101,116,101,91,93,32,0,100,121,110,97,109,105,99,95,99,97,115,116,60,0,100,101,108,101,116,101,32,0,46,42,0,47,0,47,61,0,94,0,94,61,0,61,61,0,62,61,0,41,91,0,60,61,0,60,60,0,60,60,61,0,45,0,45,61,0,42,61,0,45,45,0,41,45,45,0,91,93,32,0,41,32,0,33,61,0,33,0,110,111,101,120,99,101,112,116,32,40,0,124,124,0,124,0,124,61,0,45,62,42,0,43,0,43,61,0,43,43,0,41,43,43,0,45,62,0,41,32,63,32,40,0,41,32,58,32,40,0,114,101,105,110,116,101,114,112,114,101,116,95,99,97,115,116,60,0,37,0,37,61,0,62,62,0,62,62,61,0,115,116,97,116,105,99,95,99,97,115,116,60,0,115,105,122,101,111,102,32,40,0,115,105,122,101,111,102,46,46,46,40,0,116,121,112,101,105,100,40,0,116,104,114,111,119,0,116,104,114,111,119,32,0,102,112,0,33,34,98,97,115,105,99,95,115,116,114,105,110,103,32,111,117,116,95,111,102,95,114,97,110,103,101,34,0,95,95,116,104,114,111,119,95,111,117,116,95,111,102,95,114,97,110,103,101,0,118,111,105,100,0,98,111,111,108,0,105,110,116,0,117,110,115,105,103,110,101,100,32,105,110,116,0,108,111,110,103,0,117,110,115,105,103,110,101,100,32,108,111,110,103,0,108,111,110,103,32,108,111,110,103,0,117,110,115,105,103,110,101,100,32,108,111,110,103,32,108,111,110,103,0,102,108,111,97,116,0,100,111,117,98,108,101,0,108,111,110,103,32,100,111,117,98,108,101,0,95,95,102,108,111,97,116,49,50,56,0,46,46,46,0,100,101,99,105,109,97,108,54,52,0,100,101,99,105,109,97,108,49,50,56,0,100,101,99,105,109,97,108,51,50,0,100,101,99,105,109,97,108,49,54,0,99,104,97,114,51,50,95,116,0,99,104,97,114,49,54,95,116,0,97,117,116,111,0,115,116,100,58,58,110,117,108,108,112,116,114,95,116,0,118,116,97,98,108,101,32,102,111,114,32,0,86,84,84,32,102,111,114,32,0,116,121,112,101,105,110,102,111,32,102,111,114,32,0,116,121,112,101,105,110,102,111,32,110,97,109,101,32,102,111,114,32,0,99,111,118,97,114,105,97,110,116,32,114,101,116,117,114,110,32,116,104,117,110,107,32,116,111,32,0,99,111,110,115,116,114,117,99,116,105,111,110,32,118,116,97,98,108,101,32,102,111,114,32,0,45,105,110,45,0,118,105,114,116,117,97,108,32,116,104,117,110,107,32,116,111,32,0,110,111,110,45,118,105,114,116,117,97,108,32,116,104,117,110,107,32,116,111,32,0,103,117,97,114,100,32,118,97,114,105,97,98,108,101,32,102,111,114,32,0,114,101,102,101,114,101,110,99,101,32,116,101,109,112,111,114,97,114,121,32,102,111,114,32,0,84,33,34,25,13,1,2,3,17,75,28,12,16,4,11,29,18,30,39,104,110,111,112,113,98,32,5,6,15,19,20,21,26,8,22,7,40,36,23,24,9,10,14,27,31,37,35,131,130,125,38,42,43,60,61,62,63,67,71,74,77,88,89,90,91,92,93,94,95,96,97,99,100,101,102,103,105,106,107,108,114,115,116,121,122,123,124,0,73,108,108,101,103,97,108,32,98,121,116,101,32,115,101,113,117,101,110,99,101,0,68,111,109,97,105,110,32,101,114,114,111,114,0,82,101,115,117,108,116,32,110,111,116,32,114,101,112,114,101,115,101,110,116,97,98,108,101,0,78,111,116,32,97,32,116,116,121,0,80,101,114,109,105,115,115,105,111,110,32,100,101,110,105,101,100,0,79,112,101,114,97,116,105,111,110,32,110,111,116,32,112,101,114,109,105,116,116,101,100,0,78,111,32,115,117,99,104,32,102,105,108,101,32,111,114,32,100,105,114,101,99,116,111,114,121,0,78,111,32,115,117,99,104,32,112,114,111,99,101,115,115,0,70,105,108,101,32,101,120,105,115,116,115,0,86,97,108,117,101,32,116,111,111,32,108,97,114,103,101,32,102,111,114,32,100,97,116,97,32,116,121,112,101,0,78,111,32,115,112,97,99,101,32,108,101,102,116,32,111,110,32,100,101,118,105,99,101,0,79,117,116,32,111,102,32,109,101,109,111,114,121,0,82,101,115,111,117,114,99,101,32,98,117,115,121,0,73,110,116,101,114,114,117,112,116,101,100,32,115,121,115,116,101,109,32,99,97,108,108,0,82,101,115,111,117,114,99,101,32,116,101,109,112,111,114,97,114,105,108,121,32,117,110,97,118,97,105,108,97,98,108,101,0,73,110,118,97,108,105,100,32,115,101,101,107,0,67,114,111,115,115,45,100,101,118,105,99,101,32,108,105,110,107,0,82,101,97,100,45,111,110,108,121,32,102,105,108,101,32,115,121,115,116,101,109,0,68,105,114,101,99,116,111,114,121,32,110,111,116,32,101,109,112,116,121,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,112,101,101,114,0,79,112,101,114,97,116,105,111,110,32,116,105,109,101,100,32,111,117,116,0,67,111,110,110,101,99,116,105,111,110,32,114,101,102,117,115,101,100,0,72,111,115,116,32,105,115,32,100,111,119,110,0,72,111,115,116,32,105,115,32,117,110,114,101,97,99,104,97,98,108,101,0,65,100,100,114,101,115,115,32,105,110,32,117,115,101,0,66,114,111,107,101,110,32,112,105,112,101,0,73,47,79,32,101,114,114,111,114,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,32,111,114,32,97,100,100,114,101,115,115,0,66,108,111,99,107,32,100,101,118,105,99,101,32,114,101,113,117,105,114,101,100,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,0,78,111,116,32,97,32,100,105,114,101,99,116,111,114,121,0,73,115,32,97,32,100,105,114,101,99,116,111,114,121,0,84,101,120,116,32,102,105,108,101,32,98,117,115,121,0,69,120,101,99,32,102,111,114,109,97,116,32,101,114,114,111,114,0,73,110,118,97,108,105,100,32,97,114,103,117,109,101,110,116,0,65,114,103,117,109,101,110,116,32,108,105,115,116,32,116,111,111,32,108,111,110,103,0,83,121,109,98,111,108,105,99,32,108,105,110,107,32,108,111,111,112,0,70,105,108,101,110,97,109,101,32,116,111,111,32,108,111,110,103,0,84,111,111,32,109,97,110,121,32,111,112,101,110,32,102,105,108,101,115,32,105,110,32,115,121,115,116,101,109,0,78,111,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,115,32,97,118,97,105,108,97,98,108,101,0,66,97,100,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,0,78,111,32,99,104,105,108,100,32,112,114,111,99,101,115,115,0,66,97,100,32,97,100,100,114,101,115,115,0,70,105,108,101,32,116,111,111,32,108,97,114,103,101,0,84,111,111,32,109,97,110,121,32,108,105,110,107,115,0,78,111,32,108,111,99,107,115,32,97,118,97,105,108,97,98,108,101,0,82,101,115,111,117,114,99,101,32,100,101,97,100,108,111,99,107,32,119,111,117,108,100,32,111,99,99,117,114,0,83,116,97,116,101,32,110,111,116,32,114,101,99,111,118,101,114,97,98,108,101,0,80,114,101,118,105,111,117,115,32,111,119,110,101,114,32,100,105,101,100,0,79,112,101,114,97,116,105,111,110,32,99,97,110,99,101,108,101,100,0,70,117,110,99,116,105,111,110,32,110,111,116,32,105,109,112,108,101,109,101,110,116,101,100,0,78,111,32,109,101,115,115,97,103,101,32,111,102,32,100,101,115,105,114,101,100,32,116,121,112,101,0,73,100,101,110,116,105,102,105,101,114,32,114,101,109,111,118,101,100,0,68,101,118,105,99,101,32,110,111,116,32,97,32,115,116,114,101,97,109,0,78,111,32,100,97,116,97,32,97,118,97,105,108,97,98,108,101,0,68,101,118,105,99,101,32,116,105,109,101,111,117,116,0,79,117,116,32,111,102,32,115,116,114,101,97,109,115,32,114,101,115,111,117,114,99,101,115,0,76,105,110,107,32,104,97,115,32,98,101,101,110,32,115,101,118,101,114,101,100,0,80,114,111,116,111,99,111,108,32,101,114,114,111,114,0,66,97,100,32,109,101,115,115,97,103,101,0,70,105,108,101,32,100,101,115,99,114,105,112,116,111,114,32,105,110,32,98,97,100,32,115,116,97,116,101,0,78,111,116,32,97,32,115,111,99,107,101,116,0,68,101,115,116,105,110,97,116,105,111,110,32,97,100,100,114,101,115,115,32,114,101,113,117,105,114,101,100,0,77,101,115,115,97,103,101,32,116,111,111,32,108,97,114,103,101,0,80,114,111,116,111,99,111,108,32,119,114,111,110,103,32,116,121,112,101,32,102,111,114,32,115,111,99,107,101,116,0,80,114,111,116,111,99,111,108,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,80,114,111,116,111,99,111,108,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,83,111,99,107,101,116,32,116,121,112,101,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,78,111,116,32,115,117,112,112,111,114,116,101,100,0,80,114,111,116,111,99,111,108,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,65,100,100,114,101,115,115,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,98,121,32,112,114,111,116,111,99,111,108,0,65,100,100,114,101,115,115,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,78,101,116,119,111,114,107,32,105,115,32,100,111,119,110,0,78,101,116,119,111,114,107,32,117,110,114,101,97,99,104,97,98,108,101,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,110,101,116,119,111,114,107,0,67,111,110,110,101,99,116,105,111,110,32,97,98,111,114,116,101,100,0,78,111,32,98,117,102,102,101,114,32,115,112,97,99,101,32,97,118,97,105,108,97,98,108,101,0,83,111,99,107,101,116,32,105,115,32,99,111,110,110,101,99,116,101,100,0,83,111,99,107,101,116,32,110,111,116,32,99,111,110,110,101,99,116,101,100,0,67,97,110,110,111,116,32,115,101,110,100,32,97,102,116,101,114,32,115,111,99,107,101,116,32,115,104,117,116,100,111,119,110,0,79,112,101,114,97,116,105,111,110,32,97,108,114,101,97,100,121,32,105,110,32,112,114,111,103,114,101,115,115,0,79,112,101,114,97,116,105,111,110,32,105,110,32,112,114,111,103,114,101,115,115,0,83,116,97,108,101,32,102,105,108,101,32,104,97,110,100,108,101,0,82,101,109,111,116,101,32,73,47,79,32,101,114,114,111,114,0,81,117,111,116,97,32,101,120,99,101,101,100,101,100,0,78,111,32,109,101,100,105,117,109,32,102,111,117,110,100,0,87,114,111,110,103,32,109,101,100,105,117,109,32,116,121,112,101,0,78,111,32,101,114,114,111,114,32,105,110,102,111,114,109,97,116,105,111,110,0,0,105,110,102,105,110,105,116,121,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,1,2,3,4,5,6,7,8,9,255,255,255,255,255,255,255,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,255,255,255,255,255,255,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,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,1,2,4,7,3,6,5,0,114,119,97], "i8", ALLOC_NONE, Runtime.GLOBAL_BASE+10240); +/* memory initializer */ allocate([17,0,10,0,17,17,17,0,0,0,0,5,0,0,0,0,0,0,9,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,15,10,17,17,17,3,10,7,0,1,19,9,11,11,0,0,9,6,11,0,0,11,0,6,17,0,0,0,17,17,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,10,10,17,17,17,0,10,0,0,2,0,9,11,0,0,0,9,0,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,4,13,0,0,0,0,9,14,0,0,0,0,0,14,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,15,0,0,0,0,9,16,0,0,0,0,0,16,0,0,16,0,0,18,0,0,0,18,18,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,18,18,18,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,0,0,0,0,9,11,0,0,0,0,0,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70,45,43,32,32,32,48,88,48,120,0,40,110,117,108,108,41,0,45,48,88,43,48,88,32,48,88,45,48,120,43,48,120,32,48,120,0,105,110,102,0,73,78,70,0,110,97,110,0,78,65,78,0,46,0], "i8", ALLOC_NONE, Runtime.GLOBAL_BASE+17795); + + + + + +/* no memory initializer */ +var tempDoublePtr = Runtime.alignMemory(allocate(12, "i8", ALLOC_STATIC), 8); + +assert(tempDoublePtr % 8 == 0); + +function copyTempFloat(ptr) { // functions, because inlining this code increases code size too much + + HEAP8[tempDoublePtr] = HEAP8[ptr]; + + HEAP8[tempDoublePtr+1] = HEAP8[ptr+1]; + + HEAP8[tempDoublePtr+2] = HEAP8[ptr+2]; + + HEAP8[tempDoublePtr+3] = HEAP8[ptr+3]; + +} + +function copyTempDouble(ptr) { + + HEAP8[tempDoublePtr] = HEAP8[ptr]; + + HEAP8[tempDoublePtr+1] = HEAP8[ptr+1]; + + HEAP8[tempDoublePtr+2] = HEAP8[ptr+2]; + + HEAP8[tempDoublePtr+3] = HEAP8[ptr+3]; + + HEAP8[tempDoublePtr+4] = HEAP8[ptr+4]; + + HEAP8[tempDoublePtr+5] = HEAP8[ptr+5]; + + HEAP8[tempDoublePtr+6] = HEAP8[ptr+6]; + + HEAP8[tempDoublePtr+7] = HEAP8[ptr+7]; + +} + +// {{PRE_LIBRARY}} + + + + function _atexit(func, arg) { + __ATEXIT__.unshift({ func: func, arg: arg }); + }function ___cxa_atexit() { + return _atexit.apply(null, arguments) + } + + + Module["_i64Subtract"] = _i64Subtract; + + function ___assert_fail(condition, filename, line, func) { + ABORT = true; + throw 'Assertion failed: ' + Pointer_stringify(condition) + ', at: ' + [filename ? Pointer_stringify(filename) : 'unknown filename', line, func ? Pointer_stringify(func) : 'unknown function'] + ' at ' + stackTrace(); + } + + + + + function embind_init_charCodes() { + var codes = new Array(256); + for (var i = 0; i < 256; ++i) { + codes[i] = String.fromCharCode(i); + } + embind_charCodes = codes; + }var embind_charCodes=undefined;function readLatin1String(ptr) { + var ret = ""; + var c = ptr; + while (HEAPU8[c]) { + ret += embind_charCodes[HEAPU8[c++]]; + } + return ret; + } + + + var awaitingDependencies={}; + + var registeredTypes={}; + + var typeDependencies={}; + + + + + + + var char_0=48; + + var char_9=57;function makeLegalFunctionName(name) { + if (undefined === name) { + return '_unknown'; + } + name = name.replace(/[^a-zA-Z0-9_]/g, '$'); + var f = name.charCodeAt(0); + if (f >= char_0 && f <= char_9) { + return '_' + name; + } else { + return name; + } + }function createNamedFunction(name, body) { + name = makeLegalFunctionName(name); + /*jshint evil:true*/ + return new Function( + "body", + "return function " + name + "() {\n" + + " \"use strict\";" + + " return body.apply(this, arguments);\n" + + "};\n" + )(body); + }function extendError(baseErrorType, errorName) { + var errorClass = createNamedFunction(errorName, function(message) { + this.name = errorName; + this.message = message; + + var stack = (new Error(message)).stack; + if (stack !== undefined) { + this.stack = this.toString() + '\n' + + stack.replace(/^Error(:[^\n]*)?\n/, ''); + } + }); + errorClass.prototype = Object.create(baseErrorType.prototype); + errorClass.prototype.constructor = errorClass; + errorClass.prototype.toString = function() { + if (this.message === undefined) { + return this.name; + } else { + return this.name + ': ' + this.message; + } + }; + + return errorClass; + }var BindingError=undefined;function throwBindingError(message) { + throw new BindingError(message); + } + + + + var InternalError=undefined;function throwInternalError(message) { + throw new InternalError(message); + }function whenDependentTypesAreResolved(myTypes, dependentTypes, getTypeConverters) { + myTypes.forEach(function(type) { + typeDependencies[type] = dependentTypes; + }); + + function onComplete(typeConverters) { + var myTypeConverters = getTypeConverters(typeConverters); + if (myTypeConverters.length !== myTypes.length) { + throwInternalError('Mismatched type converter count'); + } + for (var i = 0; i < myTypes.length; ++i) { + registerType(myTypes[i], myTypeConverters[i]); + } + } + + var typeConverters = new Array(dependentTypes.length); + var unregisteredTypes = []; + var registered = 0; + dependentTypes.forEach(function(dt, i) { + if (registeredTypes.hasOwnProperty(dt)) { + typeConverters[i] = registeredTypes[dt]; + } else { + unregisteredTypes.push(dt); + if (!awaitingDependencies.hasOwnProperty(dt)) { + awaitingDependencies[dt] = []; + } + awaitingDependencies[dt].push(function() { + typeConverters[i] = registeredTypes[dt]; + ++registered; + if (registered === unregisteredTypes.length) { + onComplete(typeConverters); + } + }); + } + }); + if (0 === unregisteredTypes.length) { + onComplete(typeConverters); + } + }function registerType(rawType, registeredInstance, options) { + options = options || {}; + + if (!('argPackAdvance' in registeredInstance)) { + throw new TypeError('registerType registeredInstance requires argPackAdvance'); + } + + var name = registeredInstance.name; + if (!rawType) { + throwBindingError('type "' + name + '" must have a positive integer typeid pointer'); + } + if (registeredTypes.hasOwnProperty(rawType)) { + if (options.ignoreDuplicateRegistrations) { + return; + } else { + throwBindingError("Cannot register type '" + name + "' twice"); + } + } + + registeredTypes[rawType] = registeredInstance; + delete typeDependencies[rawType]; + + if (awaitingDependencies.hasOwnProperty(rawType)) { + var callbacks = awaitingDependencies[rawType]; + delete awaitingDependencies[rawType]; + callbacks.forEach(function(cb) { + cb(); + }); + } + }function __embind_register_void(rawType, name) { + name = readLatin1String(name); + registerType(rawType, { + isVoid: true, // void return values can be optimized out sometimes + name: name, + 'argPackAdvance': 0, + 'fromWireType': function() { + return undefined; + }, + 'toWireType': function(destructors, o) { + // TODO: assert if anything else is given? + return undefined; + }, + }); + } + + + function __ZSt18uncaught_exceptionv() { // std::uncaught_exception() + return !!__ZSt18uncaught_exceptionv.uncaught_exception; + } + + + + var EXCEPTIONS={last:0,caught:[],infos:{},deAdjust:function (adjusted) { + if (!adjusted || EXCEPTIONS.infos[adjusted]) return adjusted; + for (var ptr in EXCEPTIONS.infos) { + var info = EXCEPTIONS.infos[ptr]; + if (info.adjusted === adjusted) { + return ptr; + } + } + return adjusted; + },addRef:function (ptr) { + if (!ptr) return; + var info = EXCEPTIONS.infos[ptr]; + info.refcount++; + },decRef:function (ptr) { + if (!ptr) return; + var info = EXCEPTIONS.infos[ptr]; + assert(info.refcount > 0); + info.refcount--; + if (info.refcount === 0) { + if (info.destructor) { + Runtime.dynCall('vi', info.destructor, [ptr]); + } + delete EXCEPTIONS.infos[ptr]; + ___cxa_free_exception(ptr); + } + },clearRef:function (ptr) { + if (!ptr) return; + var info = EXCEPTIONS.infos[ptr]; + info.refcount = 0; + }}; + function ___resumeException(ptr) { + if (!EXCEPTIONS.last) { EXCEPTIONS.last = ptr; } + EXCEPTIONS.clearRef(EXCEPTIONS.deAdjust(ptr)); // exception refcount should be cleared, but don't free it + throw ptr + " - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch."; + }function ___cxa_find_matching_catch() { + var thrown = EXCEPTIONS.last; + if (!thrown) { + // just pass through the null ptr + return ((asm["setTempRet0"](0),0)|0); + } + var info = EXCEPTIONS.infos[thrown]; + var throwntype = info.type; + if (!throwntype) { + // just pass through the thrown ptr + return ((asm["setTempRet0"](0),thrown)|0); + } + var typeArray = Array.prototype.slice.call(arguments); + + var pointer = Module['___cxa_is_pointer_type'](throwntype); + // can_catch receives a **, add indirection + if (!___cxa_find_matching_catch.buffer) ___cxa_find_matching_catch.buffer = _malloc(4); + HEAP32[((___cxa_find_matching_catch.buffer)>>2)]=thrown; + thrown = ___cxa_find_matching_catch.buffer; + // The different catch blocks are denoted by different types. + // Due to inheritance, those types may not precisely match the + // type of the thrown object. Find one which matches, and + // return the type of the catch block which should be called. + for (var i = 0; i < typeArray.length; i++) { + if (typeArray[i] && Module['___cxa_can_catch'](typeArray[i], throwntype, thrown)) { + thrown = HEAP32[((thrown)>>2)]; // undo indirection + info.adjusted = thrown; + return ((asm["setTempRet0"](typeArray[i]),thrown)|0); + } + } + // Shouldn't happen unless we have bogus data in typeArray + // or encounter a type for which emscripten doesn't have suitable + // typeinfo defined. Best-efforts match just in case. + thrown = HEAP32[((thrown)>>2)]; // undo indirection + return ((asm["setTempRet0"](throwntype),thrown)|0); + }function ___cxa_throw(ptr, type, destructor) { + EXCEPTIONS.infos[ptr] = { + ptr: ptr, + adjusted: ptr, + type: type, + destructor: destructor, + refcount: 0 + }; + EXCEPTIONS.last = ptr; + if (!("uncaught_exception" in __ZSt18uncaught_exceptionv)) { + __ZSt18uncaught_exceptionv.uncaught_exception = 1; + } else { + __ZSt18uncaught_exceptionv.uncaught_exception++; + } + throw ptr + " - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch."; + } + + + Module["_memset"] = _memset; + + var _BDtoILow=true; + + + function getShiftFromSize(size) { + switch (size) { + case 1: return 0; + case 2: return 1; + case 4: return 2; + case 8: return 3; + default: + throw new TypeError('Unknown type size: ' + size); + } + }function __embind_register_bool(rawType, name, size, trueValue, falseValue) { + var shift = getShiftFromSize(size); + + name = readLatin1String(name); + registerType(rawType, { + name: name, + 'fromWireType': function(wt) { + // ambiguous emscripten ABI: sometimes return values are + // true or false, and sometimes integers (0 or 1) + return !!wt; + }, + 'toWireType': function(destructors, o) { + return o ? trueValue : falseValue; + }, + 'argPackAdvance': 8, + 'readValueFromPointer': function(pointer) { + // TODO: if heap is fixed (like in asm.js) this could be executed outside + var heap; + if (size === 1) { + heap = HEAP8; + } else if (size === 2) { + heap = HEAP16; + } else if (size === 4) { + heap = HEAP32; + } else { + throw new TypeError("Unknown boolean type size: " + name); + } + return this['fromWireType'](heap[pointer >> shift]); + }, + destructorFunction: null, // This type does not need a destructor + }); + } + + + Module["_bitshift64Shl"] = _bitshift64Shl; + + function _abort() { + Module['abort'](); + } + + + function _free() { + } + Module["_free"] = _free; + + function _malloc(bytes) { + /* Over-allocate to make sure it is byte-aligned by 8. + * This will leak memory, but this is only the dummy + * implementation (replaced by dlmalloc normally) so + * not an issue. + */ + var ptr = Runtime.dynamicAlloc(bytes + 8); + return (ptr+8) & 0xFFFFFFF8; + } + Module["_malloc"] = _malloc; + + function simpleReadValueFromPointer(pointer) { + return this['fromWireType'](HEAPU32[pointer >> 2]); + }function __embind_register_std_string(rawType, name) { + name = readLatin1String(name); + registerType(rawType, { + name: name, + 'fromWireType': function(value) { + var length = HEAPU32[value >> 2]; + var a = new Array(length); + for (var i = 0; i < length; ++i) { + a[i] = String.fromCharCode(HEAPU8[value + 4 + i]); + } + _free(value); + return a.join(''); + }, + 'toWireType': function(destructors, value) { + if (value instanceof ArrayBuffer) { + value = new Uint8Array(value); + } + + function getTAElement(ta, index) { + return ta[index]; + } + function getStringElement(string, index) { + return string.charCodeAt(index); + } + var getElement; + if (value instanceof Uint8Array) { + getElement = getTAElement; + } else if (value instanceof Int8Array) { + getElement = getTAElement; + } else if (typeof value === 'string') { + getElement = getStringElement; + } else { + throwBindingError('Cannot pass non-string to std::string'); + } + + // assumes 4-byte alignment + var length = value.length; + var ptr = _malloc(4 + length); + HEAPU32[ptr >> 2] = length; + for (var i = 0; i < length; ++i) { + var charCode = getElement(value, i); + if (charCode > 255) { + _free(ptr); + throwBindingError('String has UTF-16 code units that do not fit in 8 bits'); + } + HEAPU8[ptr + 4 + i] = charCode; + } + if (destructors !== null) { + destructors.push(_free, ptr); + } + return ptr; + }, + 'argPackAdvance': 8, + 'readValueFromPointer': simpleReadValueFromPointer, + destructorFunction: function(ptr) { _free(ptr); }, + }); + } + + function __embind_register_std_wstring(rawType, charSize, name) { + // nb. do not cache HEAPU16 and HEAPU32, they may be destroyed by enlargeMemory(). + name = readLatin1String(name); + var getHeap, shift; + if (charSize === 2) { + getHeap = function() { return HEAPU16; }; + shift = 1; + } else if (charSize === 4) { + getHeap = function() { return HEAPU32; }; + shift = 2; + } + registerType(rawType, { + name: name, + 'fromWireType': function(value) { + var HEAP = getHeap(); + var length = HEAPU32[value >> 2]; + var a = new Array(length); + var start = (value + 4) >> shift; + for (var i = 0; i < length; ++i) { + a[i] = String.fromCharCode(HEAP[start + i]); + } + _free(value); + return a.join(''); + }, + 'toWireType': function(destructors, value) { + // assumes 4-byte alignment + var HEAP = getHeap(); + var length = value.length; + var ptr = _malloc(4 + length * charSize); + HEAPU32[ptr >> 2] = length; + var start = (ptr + 4) >> shift; + for (var i = 0; i < length; ++i) { + HEAP[start + i] = value.charCodeAt(i); + } + if (destructors !== null) { + destructors.push(_free, ptr); + } + return ptr; + }, + 'argPackAdvance': 8, + 'readValueFromPointer': simpleReadValueFromPointer, + destructorFunction: function(ptr) { _free(ptr); }, + }); + } + + function ___lock() {} + + function ___unlock() {} + + var _emscripten_asm_const_int=true; + + + Module["_i64Add"] = _i64Add; + + var _fabs=Math_abs; + + var _sqrt=Math_sqrt; + + + function _embind_repr(v) { + if (v === null) { + return 'null'; + } + var t = typeof v; + if (t === 'object' || t === 'array' || t === 'function') { + return v.toString(); + } else { + return '' + v; + } + } + + function integerReadValueFromPointer(name, shift, signed) { + // integers are quite common, so generate very specialized functions + switch (shift) { + case 0: return signed ? + function readS8FromPointer(pointer) { return HEAP8[pointer]; } : + function readU8FromPointer(pointer) { return HEAPU8[pointer]; }; + case 1: return signed ? + function readS16FromPointer(pointer) { return HEAP16[pointer >> 1]; } : + function readU16FromPointer(pointer) { return HEAPU16[pointer >> 1]; }; + case 2: return signed ? + function readS32FromPointer(pointer) { return HEAP32[pointer >> 2]; } : + function readU32FromPointer(pointer) { return HEAPU32[pointer >> 2]; }; + default: + throw new TypeError("Unknown integer type: " + name); + } + }function __embind_register_integer(primitiveType, name, size, minRange, maxRange) { + name = readLatin1String(name); + if (maxRange === -1) { // LLVM doesn't have signed and unsigned 32-bit types, so u32 literals come out as 'i32 -1'. Always treat those as max u32. + maxRange = 4294967295; + } + + var shift = getShiftFromSize(size); + + var fromWireType = function(value) { + return value; + }; + + if (minRange === 0) { + var bitshift = 32 - 8*size; + fromWireType = function(value) { + return (value << bitshift) >>> bitshift; + }; + } + + registerType(primitiveType, { + name: name, + 'fromWireType': fromWireType, + 'toWireType': function(destructors, value) { + // todo: Here we have an opportunity for -O3 level "unsafe" optimizations: we could + // avoid the following two if()s and assume value is of proper type. + if (typeof value !== "number" && typeof value !== "boolean") { + throw new TypeError('Cannot convert "' + _embind_repr(value) + '" to ' + this.name); + } + if (value < minRange || value > maxRange) { + throw new TypeError('Passing a number "' + _embind_repr(value) + '" from JS side to C/C++ side to an argument of type "' + name + '", which is outside the valid range [' + minRange + ', ' + maxRange + ']!'); + } + return value | 0; + }, + 'argPackAdvance': 8, + 'readValueFromPointer': integerReadValueFromPointer(name, shift, minRange !== 0), + destructorFunction: null, // This type does not need a destructor + }); + } + + + + var emval_free_list=[]; + + var emval_handle_array=[{},{value:undefined},{value:null},{value:true},{value:false}];function __emval_decref(handle) { + if (handle > 4 && 0 === --emval_handle_array[handle].refcount) { + emval_handle_array[handle] = undefined; + emval_free_list.push(handle); + } + } + + + + function count_emval_handles() { + var count = 0; + for (var i = 5; i < emval_handle_array.length; ++i) { + if (emval_handle_array[i] !== undefined) { + ++count; + } + } + return count; + } + + function get_first_emval() { + for (var i = 5; i < emval_handle_array.length; ++i) { + if (emval_handle_array[i] !== undefined) { + return emval_handle_array[i]; + } + } + return null; + }function init_emval() { + Module['count_emval_handles'] = count_emval_handles; + Module['get_first_emval'] = get_first_emval; + }function __emval_register(value) { + + switch(value){ + case undefined :{ return 1; } + case null :{ return 2; } + case true :{ return 3; } + case false :{ return 4; } + default:{ + var handle = emval_free_list.length ? + emval_free_list.pop() : + emval_handle_array.length; + + emval_handle_array[handle] = {refcount: 1, value: value}; + return handle; + } + } + }function __embind_register_emval(rawType, name) { + name = readLatin1String(name); + registerType(rawType, { + name: name, + 'fromWireType': function(handle) { + var rv = emval_handle_array[handle].value; + __emval_decref(handle); + return rv; + }, + 'toWireType': function(destructors, value) { + return __emval_register(value); + }, + 'argPackAdvance': 8, + 'readValueFromPointer': simpleReadValueFromPointer, + destructorFunction: null, // This type does not need a destructor + + // TODO: do we need a deleteObject here? write a test where + // emval is passed into JS via an interface + }); + } + + function ___cxa_allocate_exception(size) { + return _malloc(size); + } + + var _sin=Math_sin; + + + function ___setErrNo(value) { + if (Module['___errno_location']) HEAP32[((Module['___errno_location']())>>2)]=value; + else Module.printErr('failed to set errno from JS'); + return value; + } + + var ERRNO_CODES={EPERM:1,ENOENT:2,ESRCH:3,EINTR:4,EIO:5,ENXIO:6,E2BIG:7,ENOEXEC:8,EBADF:9,ECHILD:10,EAGAIN:11,EWOULDBLOCK:11,ENOMEM:12,EACCES:13,EFAULT:14,ENOTBLK:15,EBUSY:16,EEXIST:17,EXDEV:18,ENODEV:19,ENOTDIR:20,EISDIR:21,EINVAL:22,ENFILE:23,EMFILE:24,ENOTTY:25,ETXTBSY:26,EFBIG:27,ENOSPC:28,ESPIPE:29,EROFS:30,EMLINK:31,EPIPE:32,EDOM:33,ERANGE:34,ENOMSG:42,EIDRM:43,ECHRNG:44,EL2NSYNC:45,EL3HLT:46,EL3RST:47,ELNRNG:48,EUNATCH:49,ENOCSI:50,EL2HLT:51,EDEADLK:35,ENOLCK:37,EBADE:52,EBADR:53,EXFULL:54,ENOANO:55,EBADRQC:56,EBADSLT:57,EDEADLOCK:35,EBFONT:59,ENOSTR:60,ENODATA:61,ETIME:62,ENOSR:63,ENONET:64,ENOPKG:65,EREMOTE:66,ENOLINK:67,EADV:68,ESRMNT:69,ECOMM:70,EPROTO:71,EMULTIHOP:72,EDOTDOT:73,EBADMSG:74,ENOTUNIQ:76,EBADFD:77,EREMCHG:78,ELIBACC:79,ELIBBAD:80,ELIBSCN:81,ELIBMAX:82,ELIBEXEC:83,ENOSYS:38,ENOTEMPTY:39,ENAMETOOLONG:36,ELOOP:40,EOPNOTSUPP:95,EPFNOSUPPORT:96,ECONNRESET:104,ENOBUFS:105,EAFNOSUPPORT:97,EPROTOTYPE:91,ENOTSOCK:88,ENOPROTOOPT:92,ESHUTDOWN:108,ECONNREFUSED:111,EADDRINUSE:98,ECONNABORTED:103,ENETUNREACH:101,ENETDOWN:100,ETIMEDOUT:110,EHOSTDOWN:112,EHOSTUNREACH:113,EINPROGRESS:115,EALREADY:114,EDESTADDRREQ:89,EMSGSIZE:90,EPROTONOSUPPORT:93,ESOCKTNOSUPPORT:94,EADDRNOTAVAIL:99,ENETRESET:102,EISCONN:106,ENOTCONN:107,ETOOMANYREFS:109,EUSERS:87,EDQUOT:122,ESTALE:116,ENOTSUP:95,ENOMEDIUM:123,EILSEQ:84,EOVERFLOW:75,ECANCELED:125,ENOTRECOVERABLE:131,EOWNERDEAD:130,ESTRPIPE:86};function _sysconf(name) { + // long sysconf(int name); + // http://pubs.opengroup.org/onlinepubs/009695399/functions/sysconf.html + switch(name) { + case 30: return PAGE_SIZE; + case 85: return totalMemory / PAGE_SIZE; + case 132: + case 133: + case 12: + case 137: + case 138: + case 15: + case 235: + case 16: + case 17: + case 18: + case 19: + case 20: + case 149: + case 13: + case 10: + case 236: + case 153: + case 9: + case 21: + case 22: + case 159: + case 154: + case 14: + case 77: + case 78: + case 139: + case 80: + case 81: + case 82: + case 68: + case 67: + case 164: + case 11: + case 29: + case 47: + case 48: + case 95: + case 52: + case 51: + case 46: + return 200809; + case 79: + return 0; + case 27: + case 246: + case 127: + case 128: + case 23: + case 24: + case 160: + case 161: + case 181: + case 182: + case 242: + case 183: + case 184: + case 243: + case 244: + case 245: + case 165: + case 178: + case 179: + case 49: + case 50: + case 168: + case 169: + case 175: + case 170: + case 171: + case 172: + case 97: + case 76: + case 32: + case 173: + case 35: + return -1; + case 176: + case 177: + case 7: + case 155: + case 8: + case 157: + case 125: + case 126: + case 92: + case 93: + case 129: + case 130: + case 131: + case 94: + case 91: + return 1; + case 74: + case 60: + case 69: + case 70: + case 4: + return 1024; + case 31: + case 42: + case 72: + return 32; + case 87: + case 26: + case 33: + return 2147483647; + case 34: + case 1: + return 47839; + case 38: + case 36: + return 99; + case 43: + case 37: + return 2048; + case 0: return 2097152; + case 3: return 65536; + case 28: return 32768; + case 44: return 32767; + case 75: return 16384; + case 39: return 1000; + case 89: return 700; + case 71: return 256; + case 40: return 255; + case 2: return 100; + case 180: return 64; + case 25: return 20; + case 5: return 16; + case 6: return 6; + case 73: return 4; + case 84: { + if (typeof navigator === 'object') return navigator['hardwareConcurrency'] || 1; + return 1; + } + } + ___setErrNo(ERRNO_CODES.EINVAL); + return -1; + } + + + Module["_bitshift64Lshr"] = _bitshift64Lshr; + + + function __exit(status) { + // void _exit(int status); + // http://pubs.opengroup.org/onlinepubs/000095399/functions/exit.html + Module['exit'](status); + }function _exit(status) { + __exit(status); + } + + var _llvm_ctlz_i32=true; + + + function floatReadValueFromPointer(name, shift) { + switch (shift) { + case 2: return function(pointer) { + return this['fromWireType'](HEAPF32[pointer >> 2]); + }; + case 3: return function(pointer) { + return this['fromWireType'](HEAPF64[pointer >> 3]); + }; + default: + throw new TypeError("Unknown float type: " + name); + } + }function __embind_register_float(rawType, name, size) { + var shift = getShiftFromSize(size); + name = readLatin1String(name); + registerType(rawType, { + name: name, + 'fromWireType': function(value) { + return value; + }, + 'toWireType': function(destructors, value) { + // todo: Here we have an opportunity for -O3 level "unsafe" optimizations: we could + // avoid the following if() and assume value is of proper type. + if (typeof value !== "number" && typeof value !== "boolean") { + throw new TypeError('Cannot convert "' + _embind_repr(value) + '" to ' + this.name); + } + return value; + }, + 'argPackAdvance': 8, + 'readValueFromPointer': floatReadValueFromPointer(name, shift), + destructorFunction: null, // This type does not need a destructor + }); + } + + var _BDtoIHigh=true; + + function _pthread_cleanup_push(routine, arg) { + __ATEXIT__.push(function() { Runtime.dynCall('vi', routine, [arg]) }) + _pthread_cleanup_push.level = __ATEXIT__.length; + } + + + + function new_(constructor, argumentList) { + if (!(constructor instanceof Function)) { + throw new TypeError('new_ called with constructor type ' + typeof(constructor) + " which is not a function"); + } + + /* + * Previously, the following line was just: + + function dummy() {}; + + * Unfortunately, Chrome was preserving 'dummy' as the object's name, even though at creation, the 'dummy' has the + * correct constructor name. Thus, objects created with IMVU.new would show up in the debugger as 'dummy', which + * isn't very helpful. Using IMVU.createNamedFunction addresses the issue. Doublely-unfortunately, there's no way + * to write a test for this behavior. -NRD 2013.02.22 + */ + var dummy = createNamedFunction(constructor.name || 'unknownFunctionName', function(){}); + dummy.prototype = constructor.prototype; + var obj = new dummy; + + var r = constructor.apply(obj, argumentList); + return (r instanceof Object) ? r : obj; + } + + function runDestructors(destructors) { + while (destructors.length) { + var ptr = destructors.pop(); + var del = destructors.pop(); + del(ptr); + } + }function craftInvokerFunction(humanName, argTypes, classType, cppInvokerFunc, cppTargetFunc) { + // humanName: a human-readable string name for the function to be generated. + // argTypes: An array that contains the embind type objects for all types in the function signature. + // argTypes[0] is the type object for the function return value. + // argTypes[1] is the type object for function this object/class type, or null if not crafting an invoker for a class method. + // argTypes[2...] are the actual function parameters. + // classType: The embind type object for the class to be bound, or null if this is not a method of a class. + // cppInvokerFunc: JS Function object to the C++-side function that interops into C++ code. + // cppTargetFunc: Function pointer (an integer to FUNCTION_TABLE) to the target C++ function the cppInvokerFunc will end up calling. + var argCount = argTypes.length; + + if (argCount < 2) { + throwBindingError("argTypes array size mismatch! Must at least get return value and 'this' types!"); + } + + var isClassMethodFunc = (argTypes[1] !== null && classType !== null); + + // Free functions with signature "void function()" do not need an invoker that marshalls between wire types. + // TODO: This omits argument count check - enable only at -O3 or similar. + // if (ENABLE_UNSAFE_OPTS && argCount == 2 && argTypes[0].name == "void" && !isClassMethodFunc) { + // return FUNCTION_TABLE[fn]; + // } + + var argsList = ""; + var argsListWired = ""; + for(var i = 0; i < argCount - 2; ++i) { + argsList += (i!==0?", ":"")+"arg"+i; + argsListWired += (i!==0?", ":"")+"arg"+i+"Wired"; + } + + var invokerFnBody = + "return function "+makeLegalFunctionName(humanName)+"("+argsList+") {\n" + + "if (arguments.length !== "+(argCount - 2)+") {\n" + + "throwBindingError('function "+humanName+" called with ' + arguments.length + ' arguments, expected "+(argCount - 2)+" args!');\n" + + "}\n"; + + + // Determine if we need to use a dynamic stack to store the destructors for the function parameters. + // TODO: Remove this completely once all function invokers are being dynamically generated. + var needsDestructorStack = false; + + for(var i = 1; i < argTypes.length; ++i) { // Skip return value at index 0 - it's not deleted here. + if (argTypes[i] !== null && argTypes[i].destructorFunction === undefined) { // The type does not define a destructor function - must use dynamic stack + needsDestructorStack = true; + break; + } + } + + if (needsDestructorStack) { + invokerFnBody += + "var destructors = [];\n"; + } + + var dtorStack = needsDestructorStack ? "destructors" : "null"; + var args1 = ["throwBindingError", "invoker", "fn", "runDestructors", "retType", "classParam"]; + var args2 = [throwBindingError, cppInvokerFunc, cppTargetFunc, runDestructors, argTypes[0], argTypes[1]]; + + + if (isClassMethodFunc) { + invokerFnBody += "var thisWired = classParam.toWireType("+dtorStack+", this);\n"; + } + + for(var i = 0; i < argCount - 2; ++i) { + invokerFnBody += "var arg"+i+"Wired = argType"+i+".toWireType("+dtorStack+", arg"+i+"); // "+argTypes[i+2].name+"\n"; + args1.push("argType"+i); + args2.push(argTypes[i+2]); + } + + if (isClassMethodFunc) { + argsListWired = "thisWired" + (argsListWired.length > 0 ? ", " : "") + argsListWired; + } + + var returns = (argTypes[0].name !== "void"); + + invokerFnBody += + (returns?"var rv = ":"") + "invoker(fn"+(argsListWired.length>0?", ":"")+argsListWired+");\n"; + + if (needsDestructorStack) { + invokerFnBody += "runDestructors(destructors);\n"; + } else { + for(var i = isClassMethodFunc?1:2; i < argTypes.length; ++i) { // Skip return value at index 0 - it's not deleted here. Also skip class type if not a method. + var paramName = (i === 1 ? "thisWired" : ("arg"+(i - 2)+"Wired")); + if (argTypes[i].destructorFunction !== null) { + invokerFnBody += paramName+"_dtor("+paramName+"); // "+argTypes[i].name+"\n"; + args1.push(paramName+"_dtor"); + args2.push(argTypes[i].destructorFunction); + } + } + } + + if (returns) { + invokerFnBody += "var ret = retType.fromWireType(rv);\n" + + "return ret;\n"; + } else { + } + invokerFnBody += "}\n"; + + args1.push(invokerFnBody); + + var invokerFunction = new_(Function, args1).apply(null, args2); + return invokerFunction; + } + + + function ensureOverloadTable(proto, methodName, humanName) { + if (undefined === proto[methodName].overloadTable) { + var prevFunc = proto[methodName]; + // Inject an overload resolver function that routes to the appropriate overload based on the number of arguments. + proto[methodName] = function() { + // TODO This check can be removed in -O3 level "unsafe" optimizations. + if (!proto[methodName].overloadTable.hasOwnProperty(arguments.length)) { + throwBindingError("Function '" + humanName + "' called with an invalid number of arguments (" + arguments.length + ") - expects one of (" + proto[methodName].overloadTable + ")!"); + } + return proto[methodName].overloadTable[arguments.length].apply(this, arguments); + }; + // Move the previous function into the overload table. + proto[methodName].overloadTable = []; + proto[methodName].overloadTable[prevFunc.argCount] = prevFunc; + } + }function exposePublicSymbol(name, value, numArguments) { + if (Module.hasOwnProperty(name)) { + if (undefined === numArguments || (undefined !== Module[name].overloadTable && undefined !== Module[name].overloadTable[numArguments])) { + throwBindingError("Cannot register public name '" + name + "' twice"); + } + + // We are exposing a function with the same name as an existing function. Create an overload table and a function selector + // that routes between the two. + ensureOverloadTable(Module, name, name); + if (Module.hasOwnProperty(numArguments)) { + throwBindingError("Cannot register multiple overloads of a function with the same number of arguments (" + numArguments + ")!"); + } + // Add the new function into the overload table. + Module[name].overloadTable[numArguments] = value; + } + else { + Module[name] = value; + if (undefined !== numArguments) { + Module[name].numArguments = numArguments; + } + } + } + + function heap32VectorToArray(count, firstElement) { + var array = []; + for (var i = 0; i < count; i++) { + array.push(HEAP32[(firstElement >> 2) + i]); + } + return array; + } + + function replacePublicSymbol(name, value, numArguments) { + if (!Module.hasOwnProperty(name)) { + throwInternalError('Replacing nonexistant public symbol'); + } + // If there's an overload table for this symbol, replace the symbol in the overload table instead. + if (undefined !== Module[name].overloadTable && undefined !== numArguments) { + Module[name].overloadTable[numArguments] = value; + } + else { + Module[name] = value; + } + } + + function requireFunction(signature, rawFunction) { + signature = readLatin1String(signature); + + function makeDynCaller(dynCall) { + var args = []; + for (var i = 1; i < signature.length; ++i) { + args.push('a' + i); + } + + var name = 'dynCall_' + signature + '_' + rawFunction; + var body = 'return function ' + name + '(' + args.join(', ') + ') {\n'; + body += ' return dynCall(rawFunction' + (args.length ? ', ' : '') + args.join(', ') + ');\n'; + body += '};\n'; + + return (new Function('dynCall', 'rawFunction', body))(dynCall, rawFunction); + } + + var fp; + if (Module['FUNCTION_TABLE_' + signature] !== undefined) { + fp = Module['FUNCTION_TABLE_' + signature][rawFunction]; + } else if (typeof FUNCTION_TABLE !== "undefined") { + fp = FUNCTION_TABLE[rawFunction]; + } else { + // asm.js does not give direct access to the function tables, + // and thus we must go through the dynCall interface which allows + // calling into a signature's function table by pointer value. + // + // https://github.com/dherman/asm.js/issues/83 + // + // This has three main penalties: + // - dynCall is another function call in the path from JavaScript to C++. + // - JITs may not predict through the function table indirection at runtime. + var dc = asm['dynCall_' + signature]; + if (dc === undefined) { + // We will always enter this branch if the signature + // contains 'f' and PRECISE_F32 is not enabled. + // + // Try again, replacing 'f' with 'd'. + dc = asm['dynCall_' + signature.replace(/f/g, 'd')]; + if (dc === undefined) { + throwBindingError("No dynCall invoker for signature: " + signature); + } + } + fp = makeDynCaller(dc); + } + + if (typeof fp !== "function") { + throwBindingError("unknown function pointer with signature " + signature + ": " + rawFunction); + } + return fp; + } + + + var UnboundTypeError=undefined; + + function getTypeName(type) { + var ptr = ___getTypeName(type); + var rv = readLatin1String(ptr); + _free(ptr); + return rv; + }function throwUnboundTypeError(message, types) { + var unboundTypes = []; + var seen = {}; + function visit(type) { + if (seen[type]) { + return; + } + if (registeredTypes[type]) { + return; + } + if (typeDependencies[type]) { + typeDependencies[type].forEach(visit); + return; + } + unboundTypes.push(type); + seen[type] = true; + } + types.forEach(visit); + + throw new UnboundTypeError(message + ': ' + unboundTypes.map(getTypeName).join([', '])); + }function __embind_register_function(name, argCount, rawArgTypesAddr, signature, rawInvoker, fn) { + var argTypes = heap32VectorToArray(argCount, rawArgTypesAddr); + name = readLatin1String(name); + + rawInvoker = requireFunction(signature, rawInvoker); + + exposePublicSymbol(name, function() { + throwUnboundTypeError('Cannot call ' + name + ' due to unbound types', argTypes); + }, argCount - 1); + + whenDependentTypesAreResolved([], argTypes, function(argTypes) { + var invokerArgsArray = [argTypes[0] /* return value */, null /* no class 'this'*/].concat(argTypes.slice(1) /* actual params */); + replacePublicSymbol(name, craftInvokerFunction(name, invokerArgsArray, null /* no class 'this'*/, rawInvoker, fn), argCount - 1); + return []; + }); + } + + function __embind_register_constant(name, type, value) { + name = readLatin1String(name); + whenDependentTypesAreResolved([], [type], function(type) { + type = type[0]; + Module[name] = type['fromWireType'](value); + return []; + }); + } + + function _pthread_cleanup_pop() { + assert(_pthread_cleanup_push.level == __ATEXIT__.length, 'cannot pop if something else added meanwhile!'); + __ATEXIT__.pop(); + _pthread_cleanup_push.level = __ATEXIT__.length; + } + + + + + var ERRNO_MESSAGES={0:"Success",1:"Not super-user",2:"No such file or directory",3:"No such process",4:"Interrupted system call",5:"I/O error",6:"No such device or address",7:"Arg list too long",8:"Exec format error",9:"Bad file number",10:"No children",11:"No more processes",12:"Not enough core",13:"Permission denied",14:"Bad address",15:"Block device required",16:"Mount device busy",17:"File exists",18:"Cross-device link",19:"No such device",20:"Not a directory",21:"Is a directory",22:"Invalid argument",23:"Too many open files in system",24:"Too many open files",25:"Not a typewriter",26:"Text file busy",27:"File too large",28:"No space left on device",29:"Illegal seek",30:"Read only file system",31:"Too many links",32:"Broken pipe",33:"Math arg out of domain of func",34:"Math result not representable",35:"File locking deadlock error",36:"File or path name too long",37:"No record locks available",38:"Function not implemented",39:"Directory not empty",40:"Too many symbolic links",42:"No message of desired type",43:"Identifier removed",44:"Channel number out of range",45:"Level 2 not synchronized",46:"Level 3 halted",47:"Level 3 reset",48:"Link number out of range",49:"Protocol driver not attached",50:"No CSI structure available",51:"Level 2 halted",52:"Invalid exchange",53:"Invalid request descriptor",54:"Exchange full",55:"No anode",56:"Invalid request code",57:"Invalid slot",59:"Bad font file fmt",60:"Device not a stream",61:"No data (for no delay io)",62:"Timer expired",63:"Out of streams resources",64:"Machine is not on the network",65:"Package not installed",66:"The object is remote",67:"The link has been severed",68:"Advertise error",69:"Srmount error",70:"Communication error on send",71:"Protocol error",72:"Multihop attempted",73:"Cross mount point (not really error)",74:"Trying to read unreadable message",75:"Value too large for defined data type",76:"Given log. name not unique",77:"f.d. invalid for this operation",78:"Remote address changed",79:"Can access a needed shared lib",80:"Accessing a corrupted shared lib",81:".lib section in a.out corrupted",82:"Attempting to link in too many libs",83:"Attempting to exec a shared library",84:"Illegal byte sequence",86:"Streams pipe error",87:"Too many users",88:"Socket operation on non-socket",89:"Destination address required",90:"Message too long",91:"Protocol wrong type for socket",92:"Protocol not available",93:"Unknown protocol",94:"Socket type not supported",95:"Not supported",96:"Protocol family not supported",97:"Address family not supported by protocol family",98:"Address already in use",99:"Address not available",100:"Network interface is not configured",101:"Network is unreachable",102:"Connection reset by network",103:"Connection aborted",104:"Connection reset by peer",105:"No buffer space available",106:"Socket is already connected",107:"Socket is not connected",108:"Can't send after socket shutdown",109:"Too many references",110:"Connection timed out",111:"Connection refused",112:"Host is down",113:"Host is unreachable",114:"Socket already connected",115:"Connection already in progress",116:"Stale file handle",122:"Quota exceeded",123:"No medium (in tape drive)",125:"Operation canceled",130:"Previous owner died",131:"State not recoverable"}; + + var PATH={splitPath:function (filename) { + var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; + return splitPathRe.exec(filename).slice(1); + },normalizeArray:function (parts, allowAboveRoot) { + // if the path tries to go above the root, `up` ends up > 0 + var up = 0; + for (var i = parts.length - 1; i >= 0; i--) { + var last = parts[i]; + if (last === '.') { + parts.splice(i, 1); + } else if (last === '..') { + parts.splice(i, 1); + up++; + } else if (up) { + parts.splice(i, 1); + up--; + } + } + // if the path is allowed to go above the root, restore leading ..s + if (allowAboveRoot) { + for (; up--; up) { + parts.unshift('..'); + } + } + return parts; + },normalize:function (path) { + var isAbsolute = path.charAt(0) === '/', + trailingSlash = path.substr(-1) === '/'; + // Normalize the path + path = PATH.normalizeArray(path.split('/').filter(function(p) { + return !!p; + }), !isAbsolute).join('/'); + if (!path && !isAbsolute) { + path = '.'; + } + if (path && trailingSlash) { + path += '/'; + } + return (isAbsolute ? '/' : '') + path; + },dirname:function (path) { + var result = PATH.splitPath(path), + root = result[0], + dir = result[1]; + if (!root && !dir) { + // No dirname whatsoever + return '.'; + } + if (dir) { + // It has a dirname, strip trailing slash + dir = dir.substr(0, dir.length - 1); + } + return root + dir; + },basename:function (path) { + // EMSCRIPTEN return '/'' for '/', not an empty string + if (path === '/') return '/'; + var lastSlash = path.lastIndexOf('/'); + if (lastSlash === -1) return path; + return path.substr(lastSlash+1); + },extname:function (path) { + return PATH.splitPath(path)[3]; + },join:function () { + var paths = Array.prototype.slice.call(arguments, 0); + return PATH.normalize(paths.join('/')); + },join2:function (l, r) { + return PATH.normalize(l + '/' + r); + },resolve:function () { + var resolvedPath = '', + resolvedAbsolute = false; + for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) { + var path = (i >= 0) ? arguments[i] : FS.cwd(); + // Skip empty and invalid entries + if (typeof path !== 'string') { + throw new TypeError('Arguments to path.resolve must be strings'); + } else if (!path) { + return ''; // an invalid portion invalidates the whole thing + } + resolvedPath = path + '/' + resolvedPath; + resolvedAbsolute = path.charAt(0) === '/'; + } + // At this point the path should be resolved to a full absolute path, but + // handle relative paths to be safe (might happen when process.cwd() fails) + resolvedPath = PATH.normalizeArray(resolvedPath.split('/').filter(function(p) { + return !!p; + }), !resolvedAbsolute).join('/'); + return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.'; + },relative:function (from, to) { + from = PATH.resolve(from).substr(1); + to = PATH.resolve(to).substr(1); + function trim(arr) { + var start = 0; + for (; start < arr.length; start++) { + if (arr[start] !== '') break; + } + var end = arr.length - 1; + for (; end >= 0; end--) { + if (arr[end] !== '') break; + } + if (start > end) return []; + return arr.slice(start, end - start + 1); + } + var fromParts = trim(from.split('/')); + var toParts = trim(to.split('/')); + var length = Math.min(fromParts.length, toParts.length); + var samePartsLength = length; + for (var i = 0; i < length; i++) { + if (fromParts[i] !== toParts[i]) { + samePartsLength = i; + break; + } + } + var outputParts = []; + for (var i = samePartsLength; i < fromParts.length; i++) { + outputParts.push('..'); + } + outputParts = outputParts.concat(toParts.slice(samePartsLength)); + return outputParts.join('/'); + }}; + + var TTY={ttys:[],init:function () { + // https://github.com/kripken/emscripten/pull/1555 + // if (ENVIRONMENT_IS_NODE) { + // // currently, FS.init does not distinguish if process.stdin is a file or TTY + // // device, it always assumes it's a TTY device. because of this, we're forcing + // // process.stdin to UTF8 encoding to at least make stdin reading compatible + // // with text files until FS.init can be refactored. + // process['stdin']['setEncoding']('utf8'); + // } + },shutdown:function () { + // https://github.com/kripken/emscripten/pull/1555 + // if (ENVIRONMENT_IS_NODE) { + // // inolen: any idea as to why node -e 'process.stdin.read()' wouldn't exit immediately (with process.stdin being a tty)? + // // isaacs: because now it's reading from the stream, you've expressed interest in it, so that read() kicks off a _read() which creates a ReadReq operation + // // inolen: I thought read() in that case was a synchronous operation that just grabbed some amount of buffered data if it exists? + // // isaacs: it is. but it also triggers a _read() call, which calls readStart() on the handle + // // isaacs: do process.stdin.pause() and i'd think it'd probably close the pending call + // process['stdin']['pause'](); + // } + },register:function (dev, ops) { + TTY.ttys[dev] = { input: [], output: [], ops: ops }; + FS.registerDevice(dev, TTY.stream_ops); + },stream_ops:{open:function (stream) { + var tty = TTY.ttys[stream.node.rdev]; + if (!tty) { + throw new FS.ErrnoError(ERRNO_CODES.ENODEV); + } + stream.tty = tty; + stream.seekable = false; + },close:function (stream) { + // flush any pending line data + stream.tty.ops.flush(stream.tty); + },flush:function (stream) { + stream.tty.ops.flush(stream.tty); + },read:function (stream, buffer, offset, length, pos /* ignored */) { + if (!stream.tty || !stream.tty.ops.get_char) { + throw new FS.ErrnoError(ERRNO_CODES.ENXIO); + } + var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = stream.tty.ops.get_char(stream.tty); + } catch (e) { + throw new FS.ErrnoError(ERRNO_CODES.EIO); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(ERRNO_CODES.EAGAIN); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset+i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + },write:function (stream, buffer, offset, length, pos) { + if (!stream.tty || !stream.tty.ops.put_char) { + throw new FS.ErrnoError(ERRNO_CODES.ENXIO); + } + for (var i = 0; i < length; i++) { + try { + stream.tty.ops.put_char(stream.tty, buffer[offset+i]); + } catch (e) { + throw new FS.ErrnoError(ERRNO_CODES.EIO); + } + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + }},default_tty_ops:{get_char:function (tty) { + if (!tty.input.length) { + var result = null; + if (ENVIRONMENT_IS_NODE) { + // we will read data by chunks of BUFSIZE + var BUFSIZE = 256; + var buf = new Buffer(BUFSIZE); + var bytesRead = 0; + + var fd = process.stdin.fd; + // Linux and Mac cannot use process.stdin.fd (which isn't set up as sync) + var usingDevice = false; + try { + fd = fs.openSync('/dev/stdin', 'r'); + usingDevice = true; + } catch (e) {} + + bytesRead = fs.readSync(fd, buf, 0, BUFSIZE, null); + + if (usingDevice) { fs.closeSync(fd); } + if (bytesRead > 0) { + result = buf.slice(0, bytesRead).toString('utf-8'); + } else { + result = null; + } + + } else if (typeof window != 'undefined' && + typeof window.prompt == 'function') { + // Browser. + result = window.prompt('Input: '); // returns null on cancel + if (result !== null) { + result += '\n'; + } + } else if (typeof readline == 'function') { + // Command line. + result = readline(); + if (result !== null) { + result += '\n'; + } + } + if (!result) { + return null; + } + tty.input = intArrayFromString(result, true); + } + return tty.input.shift(); + },put_char:function (tty, val) { + if (val === null || val === 10) { + Module['print'](UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); // val == 0 would cut text output off in the middle. + } + },flush:function (tty) { + if (tty.output && tty.output.length > 0) { + Module['print'](UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } + }},default_tty1_ops:{put_char:function (tty, val) { + if (val === null || val === 10) { + Module['printErr'](UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); + } + },flush:function (tty) { + if (tty.output && tty.output.length > 0) { + Module['printErr'](UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } + }}}; + + var MEMFS={ops_table:null,mount:function (mount) { + return MEMFS.createNode(null, '/', 16384 | 511 /* 0777 */, 0); + },createNode:function (parent, name, mode, dev) { + if (FS.isBlkdev(mode) || FS.isFIFO(mode)) { + // no supported + throw new FS.ErrnoError(ERRNO_CODES.EPERM); + } + if (!MEMFS.ops_table) { + MEMFS.ops_table = { + dir: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr, + lookup: MEMFS.node_ops.lookup, + mknod: MEMFS.node_ops.mknod, + rename: MEMFS.node_ops.rename, + unlink: MEMFS.node_ops.unlink, + rmdir: MEMFS.node_ops.rmdir, + readdir: MEMFS.node_ops.readdir, + symlink: MEMFS.node_ops.symlink + }, + stream: { + llseek: MEMFS.stream_ops.llseek + } + }, + file: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr + }, + stream: { + llseek: MEMFS.stream_ops.llseek, + read: MEMFS.stream_ops.read, + write: MEMFS.stream_ops.write, + allocate: MEMFS.stream_ops.allocate, + mmap: MEMFS.stream_ops.mmap, + msync: MEMFS.stream_ops.msync + } + }, + link: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr, + readlink: MEMFS.node_ops.readlink + }, + stream: {} + }, + chrdev: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr + }, + stream: FS.chrdev_stream_ops + } + }; + } + var node = FS.createNode(parent, name, mode, dev); + if (FS.isDir(node.mode)) { + node.node_ops = MEMFS.ops_table.dir.node; + node.stream_ops = MEMFS.ops_table.dir.stream; + node.contents = {}; + } else if (FS.isFile(node.mode)) { + node.node_ops = MEMFS.ops_table.file.node; + node.stream_ops = MEMFS.ops_table.file.stream; + node.usedBytes = 0; // The actual number of bytes used in the typed array, as opposed to contents.buffer.byteLength which gives the whole capacity. + // When the byte data of the file is populated, this will point to either a typed array, or a normal JS array. Typed arrays are preferred + // for performance, and used by default. However, typed arrays are not resizable like normal JS arrays are, so there is a small disk size + // penalty involved for appending file writes that continuously grow a file similar to std::vector capacity vs used -scheme. + node.contents = null; + } else if (FS.isLink(node.mode)) { + node.node_ops = MEMFS.ops_table.link.node; + node.stream_ops = MEMFS.ops_table.link.stream; + } else if (FS.isChrdev(node.mode)) { + node.node_ops = MEMFS.ops_table.chrdev.node; + node.stream_ops = MEMFS.ops_table.chrdev.stream; + } + node.timestamp = Date.now(); + // add the new node to the parent + if (parent) { + parent.contents[name] = node; + } + return node; + },getFileDataAsRegularArray:function (node) { + if (node.contents && node.contents.subarray) { + var arr = []; + for (var i = 0; i < node.usedBytes; ++i) arr.push(node.contents[i]); + return arr; // Returns a copy of the original data. + } + return node.contents; // No-op, the file contents are already in a JS array. Return as-is. + },getFileDataAsTypedArray:function (node) { + if (!node.contents) return new Uint8Array; + if (node.contents.subarray) return node.contents.subarray(0, node.usedBytes); // Make sure to not return excess unused bytes. + return new Uint8Array(node.contents); + },expandFileStorage:function (node, newCapacity) { + // If we are asked to expand the size of a file that already exists, revert to using a standard JS array to store the file + // instead of a typed array. This makes resizing the array more flexible because we can just .push() elements at the back to + // increase the size. + if (node.contents && node.contents.subarray && newCapacity > node.contents.length) { + node.contents = MEMFS.getFileDataAsRegularArray(node); + node.usedBytes = node.contents.length; // We might be writing to a lazy-loaded file which had overridden this property, so force-reset it. + } + + if (!node.contents || node.contents.subarray) { // Keep using a typed array if creating a new storage, or if old one was a typed array as well. + var prevCapacity = node.contents ? node.contents.buffer.byteLength : 0; + if (prevCapacity >= newCapacity) return; // No need to expand, the storage was already large enough. + // Don't expand strictly to the given requested limit if it's only a very small increase, but instead geometrically grow capacity. + // For small filesizes (<1MB), perform size*2 geometric increase, but for large sizes, do a much more conservative size*1.125 increase to + // avoid overshooting the allocation cap by a very large margin. + var CAPACITY_DOUBLING_MAX = 1024 * 1024; + newCapacity = Math.max(newCapacity, (prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2.0 : 1.125)) | 0); + if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); // At minimum allocate 256b for each file when expanding. + var oldContents = node.contents; + node.contents = new Uint8Array(newCapacity); // Allocate new storage. + if (node.usedBytes > 0) node.contents.set(oldContents.subarray(0, node.usedBytes), 0); // Copy old data over to the new storage. + return; + } + // Not using a typed array to back the file storage. Use a standard JS array instead. + if (!node.contents && newCapacity > 0) node.contents = []; + while (node.contents.length < newCapacity) node.contents.push(0); + },resizeFileStorage:function (node, newSize) { + if (node.usedBytes == newSize) return; + if (newSize == 0) { + node.contents = null; // Fully decommit when requesting a resize to zero. + node.usedBytes = 0; + return; + } + if (!node.contents || node.contents.subarray) { // Resize a typed array if that is being used as the backing store. + var oldContents = node.contents; + node.contents = new Uint8Array(new ArrayBuffer(newSize)); // Allocate new storage. + if (oldContents) { + node.contents.set(oldContents.subarray(0, Math.min(newSize, node.usedBytes))); // Copy old data over to the new storage. + } + node.usedBytes = newSize; + return; + } + // Backing with a JS array. + if (!node.contents) node.contents = []; + if (node.contents.length > newSize) node.contents.length = newSize; + else while (node.contents.length < newSize) node.contents.push(0); + node.usedBytes = newSize; + },node_ops:{getattr:function (node) { + var attr = {}; + // device numbers reuse inode numbers. + attr.dev = FS.isChrdev(node.mode) ? node.id : 1; + attr.ino = node.id; + attr.mode = node.mode; + attr.nlink = 1; + attr.uid = 0; + attr.gid = 0; + attr.rdev = node.rdev; + if (FS.isDir(node.mode)) { + attr.size = 4096; + } else if (FS.isFile(node.mode)) { + attr.size = node.usedBytes; + } else if (FS.isLink(node.mode)) { + attr.size = node.link.length; + } else { + attr.size = 0; + } + attr.atime = new Date(node.timestamp); + attr.mtime = new Date(node.timestamp); + attr.ctime = new Date(node.timestamp); + // NOTE: In our implementation, st_blocks = Math.ceil(st_size/st_blksize), + // but this is not required by the standard. + attr.blksize = 4096; + attr.blocks = Math.ceil(attr.size / attr.blksize); + return attr; + },setattr:function (node, attr) { + if (attr.mode !== undefined) { + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + node.timestamp = attr.timestamp; + } + if (attr.size !== undefined) { + MEMFS.resizeFileStorage(node, attr.size); + } + },lookup:function (parent, name) { + throw FS.genericErrors[ERRNO_CODES.ENOENT]; + },mknod:function (parent, name, mode, dev) { + return MEMFS.createNode(parent, name, mode, dev); + },rename:function (old_node, new_dir, new_name) { + // if we're overwriting a directory at new_name, make sure it's empty. + if (FS.isDir(old_node.mode)) { + var new_node; + try { + new_node = FS.lookupNode(new_dir, new_name); + } catch (e) { + } + if (new_node) { + for (var i in new_node.contents) { + throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY); + } + } + } + // do the internal rewiring + delete old_node.parent.contents[old_node.name]; + old_node.name = new_name; + new_dir.contents[new_name] = old_node; + old_node.parent = new_dir; + },unlink:function (parent, name) { + delete parent.contents[name]; + },rmdir:function (parent, name) { + var node = FS.lookupNode(parent, name); + for (var i in node.contents) { + throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY); + } + delete parent.contents[name]; + },readdir:function (node) { + var entries = ['.', '..'] + for (var key in node.contents) { + if (!node.contents.hasOwnProperty(key)) { + continue; + } + entries.push(key); + } + return entries; + },symlink:function (parent, newname, oldpath) { + var node = MEMFS.createNode(parent, newname, 511 /* 0777 */ | 40960, 0); + node.link = oldpath; + return node; + },readlink:function (node) { + if (!FS.isLink(node.mode)) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + return node.link; + }},stream_ops:{read:function (stream, buffer, offset, length, position) { + var contents = stream.node.contents; + if (position >= stream.node.usedBytes) return 0; + var size = Math.min(stream.node.usedBytes - position, length); + assert(size >= 0); + if (size > 8 && contents.subarray) { // non-trivial, and typed array + buffer.set(contents.subarray(position, position + size), offset); + } else { + for (var i = 0; i < size; i++) buffer[offset + i] = contents[position + i]; + } + return size; + },write:function (stream, buffer, offset, length, position, canOwn) { + if (!length) return 0; + var node = stream.node; + node.timestamp = Date.now(); + + if (buffer.subarray && (!node.contents || node.contents.subarray)) { // This write is from a typed array to a typed array? + if (canOwn) { // Can we just reuse the buffer we are given? + assert(position === 0, 'canOwn must imply no weird position inside the file'); + node.contents = buffer.subarray(offset, offset + length); + node.usedBytes = length; + return length; + } else if (node.usedBytes === 0 && position === 0) { // If this is a simple first write to an empty file, do a fast set since we don't need to care about old data. + node.contents = new Uint8Array(buffer.subarray(offset, offset + length)); + node.usedBytes = length; + return length; + } else if (position + length <= node.usedBytes) { // Writing to an already allocated and used subrange of the file? + node.contents.set(buffer.subarray(offset, offset + length), position); + return length; + } + } + + // Appending to an existing file and we need to reallocate, or source data did not come as a typed array. + MEMFS.expandFileStorage(node, position+length); + if (node.contents.subarray && buffer.subarray) node.contents.set(buffer.subarray(offset, offset + length), position); // Use typed array write if available. + else { + for (var i = 0; i < length; i++) { + node.contents[position + i] = buffer[offset + i]; // Or fall back to manual write if not. + } + } + node.usedBytes = Math.max(node.usedBytes, position+length); + return length; + },llseek:function (stream, offset, whence) { + var position = offset; + if (whence === 1) { // SEEK_CUR. + position += stream.position; + } else if (whence === 2) { // SEEK_END. + if (FS.isFile(stream.node.mode)) { + position += stream.node.usedBytes; + } + } + if (position < 0) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + return position; + },allocate:function (stream, offset, length) { + MEMFS.expandFileStorage(stream.node, offset + length); + stream.node.usedBytes = Math.max(stream.node.usedBytes, offset + length); + },mmap:function (stream, buffer, offset, length, position, prot, flags) { + if (!FS.isFile(stream.node.mode)) { + throw new FS.ErrnoError(ERRNO_CODES.ENODEV); + } + var ptr; + var allocated; + var contents = stream.node.contents; + // Only make a new copy when MAP_PRIVATE is specified. + if ( !(flags & 2) && + (contents.buffer === buffer || contents.buffer === buffer.buffer) ) { + // We can't emulate MAP_SHARED when the file is not backed by the buffer + // we're mapping to (e.g. the HEAP buffer). + allocated = false; + ptr = contents.byteOffset; + } else { + // Try to avoid unnecessary slices. + if (position > 0 || position + length < stream.node.usedBytes) { + if (contents.subarray) { + contents = contents.subarray(position, position + length); + } else { + contents = Array.prototype.slice.call(contents, position, position + length); + } + } + allocated = true; + ptr = _malloc(length); + if (!ptr) { + throw new FS.ErrnoError(ERRNO_CODES.ENOMEM); + } + buffer.set(contents, ptr); + } + return { ptr: ptr, allocated: allocated }; + },msync:function (stream, buffer, offset, length, mmapFlags) { + if (!FS.isFile(stream.node.mode)) { + throw new FS.ErrnoError(ERRNO_CODES.ENODEV); + } + if (mmapFlags & 2) { + // MAP_PRIVATE calls need not to be synced back to underlying fs + return 0; + } + + var bytesWritten = MEMFS.stream_ops.write(stream, buffer, 0, length, offset, false); + // should we check if bytesWritten and length are the same? + return 0; + }}}; + + var IDBFS={dbs:{},indexedDB:function () { + if (typeof indexedDB !== 'undefined') return indexedDB; + var ret = null; + if (typeof window === 'object') ret = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB; + assert(ret, 'IDBFS used, but indexedDB not supported'); + return ret; + },DB_VERSION:21,DB_STORE_NAME:"FILE_DATA",mount:function (mount) { + // reuse all of the core MEMFS functionality + return MEMFS.mount.apply(null, arguments); + },syncfs:function (mount, populate, callback) { + IDBFS.getLocalSet(mount, function(err, local) { + if (err) return callback(err); + + IDBFS.getRemoteSet(mount, function(err, remote) { + if (err) return callback(err); + + var src = populate ? remote : local; + var dst = populate ? local : remote; + + IDBFS.reconcile(src, dst, callback); + }); + }); + },getDB:function (name, callback) { + // check the cache first + var db = IDBFS.dbs[name]; + if (db) { + return callback(null, db); + } + + var req; + try { + req = IDBFS.indexedDB().open(name, IDBFS.DB_VERSION); + } catch (e) { + return callback(e); + } + req.onupgradeneeded = function(e) { + var db = e.target.result; + var transaction = e.target.transaction; + + var fileStore; + + if (db.objectStoreNames.contains(IDBFS.DB_STORE_NAME)) { + fileStore = transaction.objectStore(IDBFS.DB_STORE_NAME); + } else { + fileStore = db.createObjectStore(IDBFS.DB_STORE_NAME); + } + + if (!fileStore.indexNames.contains('timestamp')) { + fileStore.createIndex('timestamp', 'timestamp', { unique: false }); + } + }; + req.onsuccess = function() { + db = req.result; + + // add to the cache + IDBFS.dbs[name] = db; + callback(null, db); + }; + req.onerror = function(e) { + callback(this.error); + e.preventDefault(); + }; + },getLocalSet:function (mount, callback) { + var entries = {}; + + function isRealDir(p) { + return p !== '.' && p !== '..'; + }; + function toAbsolute(root) { + return function(p) { + return PATH.join2(root, p); + } + }; + + var check = FS.readdir(mount.mountpoint).filter(isRealDir).map(toAbsolute(mount.mountpoint)); + + while (check.length) { + var path = check.pop(); + var stat; + + try { + stat = FS.stat(path); + } catch (e) { + return callback(e); + } + + if (FS.isDir(stat.mode)) { + check.push.apply(check, FS.readdir(path).filter(isRealDir).map(toAbsolute(path))); + } + + entries[path] = { timestamp: stat.mtime }; + } + + return callback(null, { type: 'local', entries: entries }); + },getRemoteSet:function (mount, callback) { + var entries = {}; + + IDBFS.getDB(mount.mountpoint, function(err, db) { + if (err) return callback(err); + + var transaction = db.transaction([IDBFS.DB_STORE_NAME], 'readonly'); + transaction.onerror = function(e) { + callback(this.error); + e.preventDefault(); + }; + + var store = transaction.objectStore(IDBFS.DB_STORE_NAME); + var index = store.index('timestamp'); + + index.openKeyCursor().onsuccess = function(event) { + var cursor = event.target.result; + + if (!cursor) { + return callback(null, { type: 'remote', db: db, entries: entries }); + } + + entries[cursor.primaryKey] = { timestamp: cursor.key }; + + cursor.continue(); + }; + }); + },loadLocalEntry:function (path, callback) { + var stat, node; + + try { + var lookup = FS.lookupPath(path); + node = lookup.node; + stat = FS.stat(path); + } catch (e) { + return callback(e); + } + + if (FS.isDir(stat.mode)) { + return callback(null, { timestamp: stat.mtime, mode: stat.mode }); + } else if (FS.isFile(stat.mode)) { + // Performance consideration: storing a normal JavaScript array to a IndexedDB is much slower than storing a typed array. + // Therefore always convert the file contents to a typed array first before writing the data to IndexedDB. + node.contents = MEMFS.getFileDataAsTypedArray(node); + return callback(null, { timestamp: stat.mtime, mode: stat.mode, contents: node.contents }); + } else { + return callback(new Error('node type not supported')); + } + },storeLocalEntry:function (path, entry, callback) { + try { + if (FS.isDir(entry.mode)) { + FS.mkdir(path, entry.mode); + } else if (FS.isFile(entry.mode)) { + FS.writeFile(path, entry.contents, { encoding: 'binary', canOwn: true }); + } else { + return callback(new Error('node type not supported')); + } + + FS.chmod(path, entry.mode); + FS.utime(path, entry.timestamp, entry.timestamp); + } catch (e) { + return callback(e); + } + + callback(null); + },removeLocalEntry:function (path, callback) { + try { + var lookup = FS.lookupPath(path); + var stat = FS.stat(path); + + if (FS.isDir(stat.mode)) { + FS.rmdir(path); + } else if (FS.isFile(stat.mode)) { + FS.unlink(path); + } + } catch (e) { + return callback(e); + } + + callback(null); + },loadRemoteEntry:function (store, path, callback) { + var req = store.get(path); + req.onsuccess = function(event) { callback(null, event.target.result); }; + req.onerror = function(e) { + callback(this.error); + e.preventDefault(); + }; + },storeRemoteEntry:function (store, path, entry, callback) { + var req = store.put(entry, path); + req.onsuccess = function() { callback(null); }; + req.onerror = function(e) { + callback(this.error); + e.preventDefault(); + }; + },removeRemoteEntry:function (store, path, callback) { + var req = store.delete(path); + req.onsuccess = function() { callback(null); }; + req.onerror = function(e) { + callback(this.error); + e.preventDefault(); + }; + },reconcile:function (src, dst, callback) { + var total = 0; + + var create = []; + Object.keys(src.entries).forEach(function (key) { + var e = src.entries[key]; + var e2 = dst.entries[key]; + if (!e2 || e.timestamp > e2.timestamp) { + create.push(key); + total++; + } + }); + + var remove = []; + Object.keys(dst.entries).forEach(function (key) { + var e = dst.entries[key]; + var e2 = src.entries[key]; + if (!e2) { + remove.push(key); + total++; + } + }); + + if (!total) { + return callback(null); + } + + var errored = false; + var completed = 0; + var db = src.type === 'remote' ? src.db : dst.db; + var transaction = db.transaction([IDBFS.DB_STORE_NAME], 'readwrite'); + var store = transaction.objectStore(IDBFS.DB_STORE_NAME); + + function done(err) { + if (err) { + if (!done.errored) { + done.errored = true; + return callback(err); + } + return; + } + if (++completed >= total) { + return callback(null); + } + }; + + transaction.onerror = function(e) { + done(this.error); + e.preventDefault(); + }; + + // sort paths in ascending order so directory entries are created + // before the files inside them + create.sort().forEach(function (path) { + if (dst.type === 'local') { + IDBFS.loadRemoteEntry(store, path, function (err, entry) { + if (err) return done(err); + IDBFS.storeLocalEntry(path, entry, done); + }); + } else { + IDBFS.loadLocalEntry(path, function (err, entry) { + if (err) return done(err); + IDBFS.storeRemoteEntry(store, path, entry, done); + }); + } + }); + + // sort paths in descending order so files are deleted before their + // parent directories + remove.sort().reverse().forEach(function(path) { + if (dst.type === 'local') { + IDBFS.removeLocalEntry(path, done); + } else { + IDBFS.removeRemoteEntry(store, path, done); + } + }); + }}; + + var NODEFS={isWindows:false,staticInit:function () { + NODEFS.isWindows = !!process.platform.match(/^win/); + },mount:function (mount) { + assert(ENVIRONMENT_IS_NODE); + return NODEFS.createNode(null, '/', NODEFS.getMode(mount.opts.root), 0); + },createNode:function (parent, name, mode, dev) { + if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + var node = FS.createNode(parent, name, mode); + node.node_ops = NODEFS.node_ops; + node.stream_ops = NODEFS.stream_ops; + return node; + },getMode:function (path) { + var stat; + try { + stat = fs.lstatSync(path); + if (NODEFS.isWindows) { + // On Windows, directories return permission bits 'rw-rw-rw-', even though they have 'rwxrwxrwx', so + // propagate write bits to execute bits. + stat.mode = stat.mode | ((stat.mode & 146) >> 1); + } + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + return stat.mode; + },realPath:function (node) { + var parts = []; + while (node.parent !== node) { + parts.push(node.name); + node = node.parent; + } + parts.push(node.mount.opts.root); + parts.reverse(); + return PATH.join.apply(null, parts); + },flagsToPermissionStringMap:{0:"r",1:"r+",2:"r+",64:"r",65:"r+",66:"r+",129:"rx+",193:"rx+",514:"w+",577:"w",578:"w+",705:"wx",706:"wx+",1024:"a",1025:"a",1026:"a+",1089:"a",1090:"a+",1153:"ax",1154:"ax+",1217:"ax",1218:"ax+",4096:"rs",4098:"rs+"},flagsToPermissionString:function (flags) { + flags &= ~0100000 /*O_LARGEFILE*/; // Ignore this flag from musl, otherwise node.js fails to open the file. + if (flags in NODEFS.flagsToPermissionStringMap) { + return NODEFS.flagsToPermissionStringMap[flags]; + } else { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + },node_ops:{getattr:function (node) { + var path = NODEFS.realPath(node); + var stat; + try { + stat = fs.lstatSync(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + // node.js v0.10.20 doesn't report blksize and blocks on Windows. Fake them with default blksize of 4096. + // See http://support.microsoft.com/kb/140365 + if (NODEFS.isWindows && !stat.blksize) { + stat.blksize = 4096; + } + if (NODEFS.isWindows && !stat.blocks) { + stat.blocks = (stat.size+stat.blksize-1)/stat.blksize|0; + } + return { + dev: stat.dev, + ino: stat.ino, + mode: stat.mode, + nlink: stat.nlink, + uid: stat.uid, + gid: stat.gid, + rdev: stat.rdev, + size: stat.size, + atime: stat.atime, + mtime: stat.mtime, + ctime: stat.ctime, + blksize: stat.blksize, + blocks: stat.blocks + }; + },setattr:function (node, attr) { + var path = NODEFS.realPath(node); + try { + if (attr.mode !== undefined) { + fs.chmodSync(path, attr.mode); + // update the common node structure mode as well + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + var date = new Date(attr.timestamp); + fs.utimesSync(path, date, date); + } + if (attr.size !== undefined) { + fs.truncateSync(path, attr.size); + } + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + },lookup:function (parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + var mode = NODEFS.getMode(path); + return NODEFS.createNode(parent, name, mode); + },mknod:function (parent, name, mode, dev) { + var node = NODEFS.createNode(parent, name, mode, dev); + // create the backing node for this in the fs root as well + var path = NODEFS.realPath(node); + try { + if (FS.isDir(node.mode)) { + fs.mkdirSync(path, node.mode); + } else { + fs.writeFileSync(path, '', { mode: node.mode }); + } + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + return node; + },rename:function (oldNode, newDir, newName) { + var oldPath = NODEFS.realPath(oldNode); + var newPath = PATH.join2(NODEFS.realPath(newDir), newName); + try { + fs.renameSync(oldPath, newPath); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + },unlink:function (parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + try { + fs.unlinkSync(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + },rmdir:function (parent, name) { + var path = PATH.join2(NODEFS.realPath(parent), name); + try { + fs.rmdirSync(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + },readdir:function (node) { + var path = NODEFS.realPath(node); + try { + return fs.readdirSync(path); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + },symlink:function (parent, newName, oldPath) { + var newPath = PATH.join2(NODEFS.realPath(parent), newName); + try { + fs.symlinkSync(oldPath, newPath); + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + },readlink:function (node) { + var path = NODEFS.realPath(node); + try { + path = fs.readlinkSync(path); + path = NODEJS_PATH.relative(NODEJS_PATH.resolve(node.mount.opts.root), path); + return path; + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + }},stream_ops:{open:function (stream) { + var path = NODEFS.realPath(stream.node); + try { + if (FS.isFile(stream.node.mode)) { + stream.nfd = fs.openSync(path, NODEFS.flagsToPermissionString(stream.flags)); + } + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + },close:function (stream) { + try { + if (FS.isFile(stream.node.mode) && stream.nfd) { + fs.closeSync(stream.nfd); + } + } catch (e) { + if (!e.code) throw e; + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + },read:function (stream, buffer, offset, length, position) { + if (length === 0) return 0; // node errors on 0 length reads + // FIXME this is terrible. + var nbuffer = new Buffer(length); + var res; + try { + res = fs.readSync(stream.nfd, nbuffer, 0, length, position); + } catch (e) { + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + if (res > 0) { + for (var i = 0; i < res; i++) { + buffer[offset + i] = nbuffer[i]; + } + } + return res; + },write:function (stream, buffer, offset, length, position) { + // FIXME this is terrible. + var nbuffer = new Buffer(buffer.subarray(offset, offset + length)); + var res; + try { + res = fs.writeSync(stream.nfd, nbuffer, 0, length, position); + } catch (e) { + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + return res; + },llseek:function (stream, offset, whence) { + var position = offset; + if (whence === 1) { // SEEK_CUR. + position += stream.position; + } else if (whence === 2) { // SEEK_END. + if (FS.isFile(stream.node.mode)) { + try { + var stat = fs.fstatSync(stream.nfd); + position += stat.size; + } catch (e) { + throw new FS.ErrnoError(ERRNO_CODES[e.code]); + } + } + } + + if (position < 0) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + + return position; + }}}; + + var WORKERFS={DIR_MODE:16895,FILE_MODE:33279,reader:null,mount:function (mount) { + assert(ENVIRONMENT_IS_WORKER); + if (!WORKERFS.reader) WORKERFS.reader = new FileReaderSync(); + var root = WORKERFS.createNode(null, '/', WORKERFS.DIR_MODE, 0); + var createdParents = {}; + function ensureParent(path) { + // return the parent node, creating subdirs as necessary + var parts = path.split('/'); + var parent = root; + for (var i = 0; i < parts.length-1; i++) { + var curr = parts.slice(0, i+1).join('/'); + if (!createdParents[curr]) { + createdParents[curr] = WORKERFS.createNode(parent, curr, WORKERFS.DIR_MODE, 0); + } + parent = createdParents[curr]; + } + return parent; + } + function base(path) { + var parts = path.split('/'); + return parts[parts.length-1]; + } + // We also accept FileList here, by using Array.prototype + Array.prototype.forEach.call(mount.opts["files"] || [], function(file) { + WORKERFS.createNode(ensureParent(file.name), base(file.name), WORKERFS.FILE_MODE, 0, file, file.lastModifiedDate); + }); + (mount.opts["blobs"] || []).forEach(function(obj) { + WORKERFS.createNode(ensureParent(obj["name"]), base(obj["name"]), WORKERFS.FILE_MODE, 0, obj["data"]); + }); + (mount.opts["packages"] || []).forEach(function(pack) { + pack['metadata'].files.forEach(function(file) { + var name = file.filename.substr(1); // remove initial slash + WORKERFS.createNode(ensureParent(name), base(name), WORKERFS.FILE_MODE, 0, pack['blob'].slice(file.start, file.end)); + }); + }); + return root; + },createNode:function (parent, name, mode, dev, contents, mtime) { + var node = FS.createNode(parent, name, mode); + node.mode = mode; + node.node_ops = WORKERFS.node_ops; + node.stream_ops = WORKERFS.stream_ops; + node.timestamp = (mtime || new Date).getTime(); + assert(WORKERFS.FILE_MODE !== WORKERFS.DIR_MODE); + if (mode === WORKERFS.FILE_MODE) { + node.size = contents.size; + node.contents = contents; + } else { + node.size = 4096; + node.contents = {}; + } + if (parent) { + parent.contents[name] = node; + } + return node; + },node_ops:{getattr:function (node) { + return { + dev: 1, + ino: undefined, + mode: node.mode, + nlink: 1, + uid: 0, + gid: 0, + rdev: undefined, + size: node.size, + atime: new Date(node.timestamp), + mtime: new Date(node.timestamp), + ctime: new Date(node.timestamp), + blksize: 4096, + blocks: Math.ceil(node.size / 4096), + }; + },setattr:function (node, attr) { + if (attr.mode !== undefined) { + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + node.timestamp = attr.timestamp; + } + },lookup:function (parent, name) { + throw new FS.ErrnoError(ERRNO_CODES.ENOENT); + },mknod:function (parent, name, mode, dev) { + throw new FS.ErrnoError(ERRNO_CODES.EPERM); + },rename:function (oldNode, newDir, newName) { + throw new FS.ErrnoError(ERRNO_CODES.EPERM); + },unlink:function (parent, name) { + throw new FS.ErrnoError(ERRNO_CODES.EPERM); + },rmdir:function (parent, name) { + throw new FS.ErrnoError(ERRNO_CODES.EPERM); + },readdir:function (node) { + throw new FS.ErrnoError(ERRNO_CODES.EPERM); + },symlink:function (parent, newName, oldPath) { + throw new FS.ErrnoError(ERRNO_CODES.EPERM); + },readlink:function (node) { + throw new FS.ErrnoError(ERRNO_CODES.EPERM); + }},stream_ops:{read:function (stream, buffer, offset, length, position) { + if (position >= stream.node.size) return 0; + var chunk = stream.node.contents.slice(position, position + length); + var ab = WORKERFS.reader.readAsArrayBuffer(chunk); + buffer.set(new Uint8Array(ab), offset); + return chunk.size; + },write:function (stream, buffer, offset, length, position) { + throw new FS.ErrnoError(ERRNO_CODES.EIO); + },llseek:function (stream, offset, whence) { + var position = offset; + if (whence === 1) { // SEEK_CUR. + position += stream.position; + } else if (whence === 2) { // SEEK_END. + if (FS.isFile(stream.node.mode)) { + position += stream.node.size; + } + } + if (position < 0) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + return position; + }}}; + + var _stdin=allocate(1, "i32*", ALLOC_STATIC); + + var _stdout=allocate(1, "i32*", ALLOC_STATIC); + + var _stderr=allocate(1, "i32*", ALLOC_STATIC);var FS={root:null,mounts:[],devices:[null],streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,trackingDelegate:{},tracking:{openFlags:{READ:1,WRITE:2}},ErrnoError:null,genericErrors:{},filesystems:null,handleFSError:function (e) { + if (!(e instanceof FS.ErrnoError)) throw e + ' : ' + stackTrace(); + return ___setErrNo(e.errno); + },lookupPath:function (path, opts) { + path = PATH.resolve(FS.cwd(), path); + opts = opts || {}; + + if (!path) return { path: '', node: null }; + + var defaults = { + follow_mount: true, + recurse_count: 0 + }; + for (var key in defaults) { + if (opts[key] === undefined) { + opts[key] = defaults[key]; + } + } + + if (opts.recurse_count > 8) { // max recursive lookup of 8 + throw new FS.ErrnoError(ERRNO_CODES.ELOOP); + } + + // split the path + var parts = PATH.normalizeArray(path.split('/').filter(function(p) { + return !!p; + }), false); + + // start at the root + var current = FS.root; + var current_path = '/'; + + for (var i = 0; i < parts.length; i++) { + var islast = (i === parts.length-1); + if (islast && opts.parent) { + // stop resolving + break; + } + + current = FS.lookupNode(current, parts[i]); + current_path = PATH.join2(current_path, parts[i]); + + // jump to the mount's root node if this is a mountpoint + if (FS.isMountpoint(current)) { + if (!islast || (islast && opts.follow_mount)) { + current = current.mounted.root; + } + } + + // by default, lookupPath will not follow a symlink if it is the final path component. + // setting opts.follow = true will override this behavior. + if (!islast || opts.follow) { + var count = 0; + while (FS.isLink(current.mode)) { + var link = FS.readlink(current_path); + current_path = PATH.resolve(PATH.dirname(current_path), link); + + var lookup = FS.lookupPath(current_path, { recurse_count: opts.recurse_count }); + current = lookup.node; + + if (count++ > 40) { // limit max consecutive symlinks to 40 (SYMLOOP_MAX). + throw new FS.ErrnoError(ERRNO_CODES.ELOOP); + } + } + } + } + + return { path: current_path, node: current }; + },getPath:function (node) { + var path; + while (true) { + if (FS.isRoot(node)) { + var mount = node.mount.mountpoint; + if (!path) return mount; + return mount[mount.length-1] !== '/' ? mount + '/' + path : mount + path; + } + path = path ? node.name + '/' + path : node.name; + node = node.parent; + } + },hashName:function (parentid, name) { + var hash = 0; + + + for (var i = 0; i < name.length; i++) { + hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; + } + return ((parentid + hash) >>> 0) % FS.nameTable.length; + },hashAddNode:function (node) { + var hash = FS.hashName(node.parent.id, node.name); + node.name_next = FS.nameTable[hash]; + FS.nameTable[hash] = node; + },hashRemoveNode:function (node) { + var hash = FS.hashName(node.parent.id, node.name); + if (FS.nameTable[hash] === node) { + FS.nameTable[hash] = node.name_next; + } else { + var current = FS.nameTable[hash]; + while (current) { + if (current.name_next === node) { + current.name_next = node.name_next; + break; + } + current = current.name_next; + } + } + },lookupNode:function (parent, name) { + var err = FS.mayLookup(parent); + if (err) { + throw new FS.ErrnoError(err, parent); + } + var hash = FS.hashName(parent.id, name); + for (var node = FS.nameTable[hash]; node; node = node.name_next) { + var nodeName = node.name; + if (node.parent.id === parent.id && nodeName === name) { + return node; + } + } + // if we failed to find it in the cache, call into the VFS + return FS.lookup(parent, name); + },createNode:function (parent, name, mode, rdev) { + if (!FS.FSNode) { + FS.FSNode = function(parent, name, mode, rdev) { + if (!parent) { + parent = this; // root node sets parent to itself + } + this.parent = parent; + this.mount = parent.mount; + this.mounted = null; + this.id = FS.nextInode++; + this.name = name; + this.mode = mode; + this.node_ops = {}; + this.stream_ops = {}; + this.rdev = rdev; + }; + + FS.FSNode.prototype = {}; + + // compatibility + var readMode = 292 | 73; + var writeMode = 146; + + // NOTE we must use Object.defineProperties instead of individual calls to + // Object.defineProperty in order to make closure compiler happy + Object.defineProperties(FS.FSNode.prototype, { + read: { + get: function() { return (this.mode & readMode) === readMode; }, + set: function(val) { val ? this.mode |= readMode : this.mode &= ~readMode; } + }, + write: { + get: function() { return (this.mode & writeMode) === writeMode; }, + set: function(val) { val ? this.mode |= writeMode : this.mode &= ~writeMode; } + }, + isFolder: { + get: function() { return FS.isDir(this.mode); } + }, + isDevice: { + get: function() { return FS.isChrdev(this.mode); } + } + }); + } + + var node = new FS.FSNode(parent, name, mode, rdev); + + FS.hashAddNode(node); + + return node; + },destroyNode:function (node) { + FS.hashRemoveNode(node); + },isRoot:function (node) { + return node === node.parent; + },isMountpoint:function (node) { + return !!node.mounted; + },isFile:function (mode) { + return (mode & 61440) === 32768; + },isDir:function (mode) { + return (mode & 61440) === 16384; + },isLink:function (mode) { + return (mode & 61440) === 40960; + },isChrdev:function (mode) { + return (mode & 61440) === 8192; + },isBlkdev:function (mode) { + return (mode & 61440) === 24576; + },isFIFO:function (mode) { + return (mode & 61440) === 4096; + },isSocket:function (mode) { + return (mode & 49152) === 49152; + },flagModes:{"r":0,"rs":1052672,"r+":2,"w":577,"wx":705,"xw":705,"w+":578,"wx+":706,"xw+":706,"a":1089,"ax":1217,"xa":1217,"a+":1090,"ax+":1218,"xa+":1218},modeStringToFlags:function (str) { + var flags = FS.flagModes[str]; + if (typeof flags === 'undefined') { + throw new Error('Unknown file open mode: ' + str); + } + return flags; + },flagsToPermissionString:function (flag) { + var perms = ['r', 'w', 'rw'][flag & 3]; + if ((flag & 512)) { + perms += 'w'; + } + return perms; + },nodePermissions:function (node, perms) { + if (FS.ignorePermissions) { + return 0; + } + // return 0 if any user, group or owner bits are set. + if (perms.indexOf('r') !== -1 && !(node.mode & 292)) { + return ERRNO_CODES.EACCES; + } else if (perms.indexOf('w') !== -1 && !(node.mode & 146)) { + return ERRNO_CODES.EACCES; + } else if (perms.indexOf('x') !== -1 && !(node.mode & 73)) { + return ERRNO_CODES.EACCES; + } + return 0; + },mayLookup:function (dir) { + var err = FS.nodePermissions(dir, 'x'); + if (err) return err; + if (!dir.node_ops.lookup) return ERRNO_CODES.EACCES; + return 0; + },mayCreate:function (dir, name) { + try { + var node = FS.lookupNode(dir, name); + return ERRNO_CODES.EEXIST; + } catch (e) { + } + return FS.nodePermissions(dir, 'wx'); + },mayDelete:function (dir, name, isdir) { + var node; + try { + node = FS.lookupNode(dir, name); + } catch (e) { + return e.errno; + } + var err = FS.nodePermissions(dir, 'wx'); + if (err) { + return err; + } + if (isdir) { + if (!FS.isDir(node.mode)) { + return ERRNO_CODES.ENOTDIR; + } + if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) { + return ERRNO_CODES.EBUSY; + } + } else { + if (FS.isDir(node.mode)) { + return ERRNO_CODES.EISDIR; + } + } + return 0; + },mayOpen:function (node, flags) { + if (!node) { + return ERRNO_CODES.ENOENT; + } + if (FS.isLink(node.mode)) { + return ERRNO_CODES.ELOOP; + } else if (FS.isDir(node.mode)) { + if ((flags & 2097155) !== 0 || // opening for write + (flags & 512)) { + return ERRNO_CODES.EISDIR; + } + } + return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); + },MAX_OPEN_FDS:4096,nextfd:function (fd_start, fd_end) { + fd_start = fd_start || 0; + fd_end = fd_end || FS.MAX_OPEN_FDS; + for (var fd = fd_start; fd <= fd_end; fd++) { + if (!FS.streams[fd]) { + return fd; + } + } + throw new FS.ErrnoError(ERRNO_CODES.EMFILE); + },getStream:function (fd) { + return FS.streams[fd]; + },createStream:function (stream, fd_start, fd_end) { + if (!FS.FSStream) { + FS.FSStream = function(){}; + FS.FSStream.prototype = {}; + // compatibility + Object.defineProperties(FS.FSStream.prototype, { + object: { + get: function() { return this.node; }, + set: function(val) { this.node = val; } + }, + isRead: { + get: function() { return (this.flags & 2097155) !== 1; } + }, + isWrite: { + get: function() { return (this.flags & 2097155) !== 0; } + }, + isAppend: { + get: function() { return (this.flags & 1024); } + } + }); + } + // clone it, so we can return an instance of FSStream + var newStream = new FS.FSStream(); + for (var p in stream) { + newStream[p] = stream[p]; + } + stream = newStream; + var fd = FS.nextfd(fd_start, fd_end); + stream.fd = fd; + FS.streams[fd] = stream; + return stream; + },closeStream:function (fd) { + FS.streams[fd] = null; + },chrdev_stream_ops:{open:function (stream) { + var device = FS.getDevice(stream.node.rdev); + // override node's stream ops with the device's + stream.stream_ops = device.stream_ops; + // forward the open call + if (stream.stream_ops.open) { + stream.stream_ops.open(stream); + } + },llseek:function () { + throw new FS.ErrnoError(ERRNO_CODES.ESPIPE); + }},major:function (dev) { + return ((dev) >> 8); + },minor:function (dev) { + return ((dev) & 0xff); + },makedev:function (ma, mi) { + return ((ma) << 8 | (mi)); + },registerDevice:function (dev, ops) { + FS.devices[dev] = { stream_ops: ops }; + },getDevice:function (dev) { + return FS.devices[dev]; + },getMounts:function (mount) { + var mounts = []; + var check = [mount]; + + while (check.length) { + var m = check.pop(); + + mounts.push(m); + + check.push.apply(check, m.mounts); + } + + return mounts; + },syncfs:function (populate, callback) { + if (typeof(populate) === 'function') { + callback = populate; + populate = false; + } + + var mounts = FS.getMounts(FS.root.mount); + var completed = 0; + + function done(err) { + if (err) { + if (!done.errored) { + done.errored = true; + return callback(err); + } + return; + } + if (++completed >= mounts.length) { + callback(null); + } + }; + + // sync all mounts + mounts.forEach(function (mount) { + if (!mount.type.syncfs) { + return done(null); + } + mount.type.syncfs(mount, populate, done); + }); + },mount:function (type, opts, mountpoint) { + var root = mountpoint === '/'; + var pseudo = !mountpoint; + var node; + + if (root && FS.root) { + throw new FS.ErrnoError(ERRNO_CODES.EBUSY); + } else if (!root && !pseudo) { + var lookup = FS.lookupPath(mountpoint, { follow_mount: false }); + + mountpoint = lookup.path; // use the absolute path + node = lookup.node; + + if (FS.isMountpoint(node)) { + throw new FS.ErrnoError(ERRNO_CODES.EBUSY); + } + + if (!FS.isDir(node.mode)) { + throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR); + } + } + + var mount = { + type: type, + opts: opts, + mountpoint: mountpoint, + mounts: [] + }; + + // create a root node for the fs + var mountRoot = type.mount(mount); + mountRoot.mount = mount; + mount.root = mountRoot; + + if (root) { + FS.root = mountRoot; + } else if (node) { + // set as a mountpoint + node.mounted = mount; + + // add the new mount to the current mount's children + if (node.mount) { + node.mount.mounts.push(mount); + } + } + + return mountRoot; + },unmount:function (mountpoint) { + var lookup = FS.lookupPath(mountpoint, { follow_mount: false }); + + if (!FS.isMountpoint(lookup.node)) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + + // destroy the nodes for this mount, and all its child mounts + var node = lookup.node; + var mount = node.mounted; + var mounts = FS.getMounts(mount); + + Object.keys(FS.nameTable).forEach(function (hash) { + var current = FS.nameTable[hash]; + + while (current) { + var next = current.name_next; + + if (mounts.indexOf(current.mount) !== -1) { + FS.destroyNode(current); + } + + current = next; + } + }); + + // no longer a mountpoint + node.mounted = null; + + // remove this mount from the child mounts + var idx = node.mount.mounts.indexOf(mount); + assert(idx !== -1); + node.mount.mounts.splice(idx, 1); + },lookup:function (parent, name) { + return parent.node_ops.lookup(parent, name); + },mknod:function (path, mode, dev) { + var lookup = FS.lookupPath(path, { parent: true }); + var parent = lookup.node; + var name = PATH.basename(path); + if (!name || name === '.' || name === '..') { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + var err = FS.mayCreate(parent, name); + if (err) { + throw new FS.ErrnoError(err); + } + if (!parent.node_ops.mknod) { + throw new FS.ErrnoError(ERRNO_CODES.EPERM); + } + return parent.node_ops.mknod(parent, name, mode, dev); + },create:function (path, mode) { + mode = mode !== undefined ? mode : 438 /* 0666 */; + mode &= 4095; + mode |= 32768; + return FS.mknod(path, mode, 0); + },mkdir:function (path, mode) { + mode = mode !== undefined ? mode : 511 /* 0777 */; + mode &= 511 | 512; + mode |= 16384; + return FS.mknod(path, mode, 0); + },mkdev:function (path, mode, dev) { + if (typeof(dev) === 'undefined') { + dev = mode; + mode = 438 /* 0666 */; + } + mode |= 8192; + return FS.mknod(path, mode, dev); + },symlink:function (oldpath, newpath) { + if (!PATH.resolve(oldpath)) { + throw new FS.ErrnoError(ERRNO_CODES.ENOENT); + } + var lookup = FS.lookupPath(newpath, { parent: true }); + var parent = lookup.node; + if (!parent) { + throw new FS.ErrnoError(ERRNO_CODES.ENOENT); + } + var newname = PATH.basename(newpath); + var err = FS.mayCreate(parent, newname); + if (err) { + throw new FS.ErrnoError(err); + } + if (!parent.node_ops.symlink) { + throw new FS.ErrnoError(ERRNO_CODES.EPERM); + } + return parent.node_ops.symlink(parent, newname, oldpath); + },rename:function (old_path, new_path) { + var old_dirname = PATH.dirname(old_path); + var new_dirname = PATH.dirname(new_path); + var old_name = PATH.basename(old_path); + var new_name = PATH.basename(new_path); + // parents must exist + var lookup, old_dir, new_dir; + try { + lookup = FS.lookupPath(old_path, { parent: true }); + old_dir = lookup.node; + lookup = FS.lookupPath(new_path, { parent: true }); + new_dir = lookup.node; + } catch (e) { + throw new FS.ErrnoError(ERRNO_CODES.EBUSY); + } + if (!old_dir || !new_dir) throw new FS.ErrnoError(ERRNO_CODES.ENOENT); + // need to be part of the same mount + if (old_dir.mount !== new_dir.mount) { + throw new FS.ErrnoError(ERRNO_CODES.EXDEV); + } + // source must exist + var old_node = FS.lookupNode(old_dir, old_name); + // old path should not be an ancestor of the new path + var relative = PATH.relative(old_path, new_dirname); + if (relative.charAt(0) !== '.') { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + // new path should not be an ancestor of the old path + relative = PATH.relative(new_path, old_dirname); + if (relative.charAt(0) !== '.') { + throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY); + } + // see if the new path already exists + var new_node; + try { + new_node = FS.lookupNode(new_dir, new_name); + } catch (e) { + // not fatal + } + // early out if nothing needs to change + if (old_node === new_node) { + return; + } + // we'll need to delete the old entry + var isdir = FS.isDir(old_node.mode); + var err = FS.mayDelete(old_dir, old_name, isdir); + if (err) { + throw new FS.ErrnoError(err); + } + // need delete permissions if we'll be overwriting. + // need create permissions if new doesn't already exist. + err = new_node ? + FS.mayDelete(new_dir, new_name, isdir) : + FS.mayCreate(new_dir, new_name); + if (err) { + throw new FS.ErrnoError(err); + } + if (!old_dir.node_ops.rename) { + throw new FS.ErrnoError(ERRNO_CODES.EPERM); + } + if (FS.isMountpoint(old_node) || (new_node && FS.isMountpoint(new_node))) { + throw new FS.ErrnoError(ERRNO_CODES.EBUSY); + } + // if we are going to change the parent, check write permissions + if (new_dir !== old_dir) { + err = FS.nodePermissions(old_dir, 'w'); + if (err) { + throw new FS.ErrnoError(err); + } + } + try { + if (FS.trackingDelegate['willMovePath']) { + FS.trackingDelegate['willMovePath'](old_path, new_path); + } + } catch(e) { + console.log("FS.trackingDelegate['willMovePath']('"+old_path+"', '"+new_path+"') threw an exception: " + e.message); + } + // remove the node from the lookup hash + FS.hashRemoveNode(old_node); + // do the underlying fs rename + try { + old_dir.node_ops.rename(old_node, new_dir, new_name); + } catch (e) { + throw e; + } finally { + // add the node back to the hash (in case node_ops.rename + // changed its name) + FS.hashAddNode(old_node); + } + try { + if (FS.trackingDelegate['onMovePath']) FS.trackingDelegate['onMovePath'](old_path, new_path); + } catch(e) { + console.log("FS.trackingDelegate['onMovePath']('"+old_path+"', '"+new_path+"') threw an exception: " + e.message); + } + },rmdir:function (path) { + var lookup = FS.lookupPath(path, { parent: true }); + var parent = lookup.node; + var name = PATH.basename(path); + var node = FS.lookupNode(parent, name); + var err = FS.mayDelete(parent, name, true); + if (err) { + throw new FS.ErrnoError(err); + } + if (!parent.node_ops.rmdir) { + throw new FS.ErrnoError(ERRNO_CODES.EPERM); + } + if (FS.isMountpoint(node)) { + throw new FS.ErrnoError(ERRNO_CODES.EBUSY); + } + try { + if (FS.trackingDelegate['willDeletePath']) { + FS.trackingDelegate['willDeletePath'](path); + } + } catch(e) { + console.log("FS.trackingDelegate['willDeletePath']('"+path+"') threw an exception: " + e.message); + } + parent.node_ops.rmdir(parent, name); + FS.destroyNode(node); + try { + if (FS.trackingDelegate['onDeletePath']) FS.trackingDelegate['onDeletePath'](path); + } catch(e) { + console.log("FS.trackingDelegate['onDeletePath']('"+path+"') threw an exception: " + e.message); + } + },readdir:function (path) { + var lookup = FS.lookupPath(path, { follow: true }); + var node = lookup.node; + if (!node.node_ops.readdir) { + throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR); + } + return node.node_ops.readdir(node); + },unlink:function (path) { + var lookup = FS.lookupPath(path, { parent: true }); + var parent = lookup.node; + var name = PATH.basename(path); + var node = FS.lookupNode(parent, name); + var err = FS.mayDelete(parent, name, false); + if (err) { + // POSIX says unlink should set EPERM, not EISDIR + if (err === ERRNO_CODES.EISDIR) err = ERRNO_CODES.EPERM; + throw new FS.ErrnoError(err); + } + if (!parent.node_ops.unlink) { + throw new FS.ErrnoError(ERRNO_CODES.EPERM); + } + if (FS.isMountpoint(node)) { + throw new FS.ErrnoError(ERRNO_CODES.EBUSY); + } + try { + if (FS.trackingDelegate['willDeletePath']) { + FS.trackingDelegate['willDeletePath'](path); + } + } catch(e) { + console.log("FS.trackingDelegate['willDeletePath']('"+path+"') threw an exception: " + e.message); + } + parent.node_ops.unlink(parent, name); + FS.destroyNode(node); + try { + if (FS.trackingDelegate['onDeletePath']) FS.trackingDelegate['onDeletePath'](path); + } catch(e) { + console.log("FS.trackingDelegate['onDeletePath']('"+path+"') threw an exception: " + e.message); + } + },readlink:function (path) { + var lookup = FS.lookupPath(path); + var link = lookup.node; + if (!link) { + throw new FS.ErrnoError(ERRNO_CODES.ENOENT); + } + if (!link.node_ops.readlink) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + return PATH.resolve(FS.getPath(link.parent), link.node_ops.readlink(link)); + },stat:function (path, dontFollow) { + var lookup = FS.lookupPath(path, { follow: !dontFollow }); + var node = lookup.node; + if (!node) { + throw new FS.ErrnoError(ERRNO_CODES.ENOENT); + } + if (!node.node_ops.getattr) { + throw new FS.ErrnoError(ERRNO_CODES.EPERM); + } + return node.node_ops.getattr(node); + },lstat:function (path) { + return FS.stat(path, true); + },chmod:function (path, mode, dontFollow) { + var node; + if (typeof path === 'string') { + var lookup = FS.lookupPath(path, { follow: !dontFollow }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(ERRNO_CODES.EPERM); + } + node.node_ops.setattr(node, { + mode: (mode & 4095) | (node.mode & ~4095), + timestamp: Date.now() + }); + },lchmod:function (path, mode) { + FS.chmod(path, mode, true); + },fchmod:function (fd, mode) { + var stream = FS.getStream(fd); + if (!stream) { + throw new FS.ErrnoError(ERRNO_CODES.EBADF); + } + FS.chmod(stream.node, mode); + },chown:function (path, uid, gid, dontFollow) { + var node; + if (typeof path === 'string') { + var lookup = FS.lookupPath(path, { follow: !dontFollow }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(ERRNO_CODES.EPERM); + } + node.node_ops.setattr(node, { + timestamp: Date.now() + // we ignore the uid / gid for now + }); + },lchown:function (path, uid, gid) { + FS.chown(path, uid, gid, true); + },fchown:function (fd, uid, gid) { + var stream = FS.getStream(fd); + if (!stream) { + throw new FS.ErrnoError(ERRNO_CODES.EBADF); + } + FS.chown(stream.node, uid, gid); + },truncate:function (path, len) { + if (len < 0) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + var node; + if (typeof path === 'string') { + var lookup = FS.lookupPath(path, { follow: true }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(ERRNO_CODES.EPERM); + } + if (FS.isDir(node.mode)) { + throw new FS.ErrnoError(ERRNO_CODES.EISDIR); + } + if (!FS.isFile(node.mode)) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + var err = FS.nodePermissions(node, 'w'); + if (err) { + throw new FS.ErrnoError(err); + } + node.node_ops.setattr(node, { + size: len, + timestamp: Date.now() + }); + },ftruncate:function (fd, len) { + var stream = FS.getStream(fd); + if (!stream) { + throw new FS.ErrnoError(ERRNO_CODES.EBADF); + } + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + FS.truncate(stream.node, len); + },utime:function (path, atime, mtime) { + var lookup = FS.lookupPath(path, { follow: true }); + var node = lookup.node; + node.node_ops.setattr(node, { + timestamp: Math.max(atime, mtime) + }); + },open:function (path, flags, mode, fd_start, fd_end) { + if (path === "") { + throw new FS.ErrnoError(ERRNO_CODES.ENOENT); + } + flags = typeof flags === 'string' ? FS.modeStringToFlags(flags) : flags; + mode = typeof mode === 'undefined' ? 438 /* 0666 */ : mode; + if ((flags & 64)) { + mode = (mode & 4095) | 32768; + } else { + mode = 0; + } + var node; + if (typeof path === 'object') { + node = path; + } else { + path = PATH.normalize(path); + try { + var lookup = FS.lookupPath(path, { + follow: !(flags & 131072) + }); + node = lookup.node; + } catch (e) { + // ignore + } + } + // perhaps we need to create the node + var created = false; + if ((flags & 64)) { + if (node) { + // if O_CREAT and O_EXCL are set, error out if the node already exists + if ((flags & 128)) { + throw new FS.ErrnoError(ERRNO_CODES.EEXIST); + } + } else { + // node doesn't exist, try to create it + node = FS.mknod(path, mode, 0); + created = true; + } + } + if (!node) { + throw new FS.ErrnoError(ERRNO_CODES.ENOENT); + } + // can't truncate a device + if (FS.isChrdev(node.mode)) { + flags &= ~512; + } + // if asked only for a directory, then this must be one + if ((flags & 65536) && !FS.isDir(node.mode)) { + throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR); + } + // check permissions, if this is not a file we just created now (it is ok to + // create and write to a file with read-only permissions; it is read-only + // for later use) + if (!created) { + var err = FS.mayOpen(node, flags); + if (err) { + throw new FS.ErrnoError(err); + } + } + // do truncation if necessary + if ((flags & 512)) { + FS.truncate(node, 0); + } + // we've already handled these, don't pass down to the underlying vfs + flags &= ~(128 | 512); + + // register the stream with the filesystem + var stream = FS.createStream({ + node: node, + path: FS.getPath(node), // we want the absolute path to the node + flags: flags, + seekable: true, + position: 0, + stream_ops: node.stream_ops, + // used by the file family libc calls (fopen, fwrite, ferror, etc.) + ungotten: [], + error: false + }, fd_start, fd_end); + // call the new stream's open function + if (stream.stream_ops.open) { + stream.stream_ops.open(stream); + } + if (Module['logReadFiles'] && !(flags & 1)) { + if (!FS.readFiles) FS.readFiles = {}; + if (!(path in FS.readFiles)) { + FS.readFiles[path] = 1; + Module['printErr']('read file: ' + path); + } + } + try { + if (FS.trackingDelegate['onOpenFile']) { + var trackingFlags = 0; + if ((flags & 2097155) !== 1) { + trackingFlags |= FS.tracking.openFlags.READ; + } + if ((flags & 2097155) !== 0) { + trackingFlags |= FS.tracking.openFlags.WRITE; + } + FS.trackingDelegate['onOpenFile'](path, trackingFlags); + } + } catch(e) { + console.log("FS.trackingDelegate['onOpenFile']('"+path+"', flags) threw an exception: " + e.message); + } + return stream; + },close:function (stream) { + if (stream.getdents) stream.getdents = null; // free readdir state + try { + if (stream.stream_ops.close) { + stream.stream_ops.close(stream); + } + } catch (e) { + throw e; + } finally { + FS.closeStream(stream.fd); + } + },llseek:function (stream, offset, whence) { + if (!stream.seekable || !stream.stream_ops.llseek) { + throw new FS.ErrnoError(ERRNO_CODES.ESPIPE); + } + stream.position = stream.stream_ops.llseek(stream, offset, whence); + stream.ungotten = []; + return stream.position; + },read:function (stream, buffer, offset, length, position) { + if (length < 0 || position < 0) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + if ((stream.flags & 2097155) === 1) { + throw new FS.ErrnoError(ERRNO_CODES.EBADF); + } + if (FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(ERRNO_CODES.EISDIR); + } + if (!stream.stream_ops.read) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + var seeking = true; + if (typeof position === 'undefined') { + position = stream.position; + seeking = false; + } else if (!stream.seekable) { + throw new FS.ErrnoError(ERRNO_CODES.ESPIPE); + } + var bytesRead = stream.stream_ops.read(stream, buffer, offset, length, position); + if (!seeking) stream.position += bytesRead; + return bytesRead; + },write:function (stream, buffer, offset, length, position, canOwn) { + if (length < 0 || position < 0) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(ERRNO_CODES.EBADF); + } + if (FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(ERRNO_CODES.EISDIR); + } + if (!stream.stream_ops.write) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + if (stream.flags & 1024) { + // seek to the end before writing in append mode + FS.llseek(stream, 0, 2); + } + var seeking = true; + if (typeof position === 'undefined') { + position = stream.position; + seeking = false; + } else if (!stream.seekable) { + throw new FS.ErrnoError(ERRNO_CODES.ESPIPE); + } + var bytesWritten = stream.stream_ops.write(stream, buffer, offset, length, position, canOwn); + if (!seeking) stream.position += bytesWritten; + try { + if (stream.path && FS.trackingDelegate['onWriteToFile']) FS.trackingDelegate['onWriteToFile'](stream.path); + } catch(e) { + console.log("FS.trackingDelegate['onWriteToFile']('"+path+"') threw an exception: " + e.message); + } + return bytesWritten; + },allocate:function (stream, offset, length) { + if (offset < 0 || length <= 0) { + throw new FS.ErrnoError(ERRNO_CODES.EINVAL); + } + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(ERRNO_CODES.EBADF); + } + if (!FS.isFile(stream.node.mode) && !FS.isDir(node.mode)) { + throw new FS.ErrnoError(ERRNO_CODES.ENODEV); + } + if (!stream.stream_ops.allocate) { + throw new FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP); + } + stream.stream_ops.allocate(stream, offset, length); + },mmap:function (stream, buffer, offset, length, position, prot, flags) { + // TODO if PROT is PROT_WRITE, make sure we have write access + if ((stream.flags & 2097155) === 1) { + throw new FS.ErrnoError(ERRNO_CODES.EACCES); + } + if (!stream.stream_ops.mmap) { + throw new FS.ErrnoError(ERRNO_CODES.ENODEV); + } + return stream.stream_ops.mmap(stream, buffer, offset, length, position, prot, flags); + },msync:function (stream, buffer, offset, length, mmapFlags) { + if (!stream || !stream.stream_ops.msync) { + return 0; + } + return stream.stream_ops.msync(stream, buffer, offset, length, mmapFlags); + },munmap:function (stream) { + return 0; + },ioctl:function (stream, cmd, arg) { + if (!stream.stream_ops.ioctl) { + throw new FS.ErrnoError(ERRNO_CODES.ENOTTY); + } + return stream.stream_ops.ioctl(stream, cmd, arg); + },readFile:function (path, opts) { + opts = opts || {}; + opts.flags = opts.flags || 'r'; + opts.encoding = opts.encoding || 'binary'; + if (opts.encoding !== 'utf8' && opts.encoding !== 'binary') { + throw new Error('Invalid encoding type "' + opts.encoding + '"'); + } + var ret; + var stream = FS.open(path, opts.flags); + var stat = FS.stat(path); + var length = stat.size; + var buf = new Uint8Array(length); + FS.read(stream, buf, 0, length, 0); + if (opts.encoding === 'utf8') { + ret = UTF8ArrayToString(buf, 0); + } else if (opts.encoding === 'binary') { + ret = buf; + } + FS.close(stream); + return ret; + },writeFile:function (path, data, opts) { + opts = opts || {}; + opts.flags = opts.flags || 'w'; + opts.encoding = opts.encoding || 'utf8'; + if (opts.encoding !== 'utf8' && opts.encoding !== 'binary') { + throw new Error('Invalid encoding type "' + opts.encoding + '"'); + } + var stream = FS.open(path, opts.flags, opts.mode); + if (opts.encoding === 'utf8') { + var buf = new Uint8Array(lengthBytesUTF8(data)+1); + var actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length); + FS.write(stream, buf, 0, actualNumBytes, 0, opts.canOwn); + } else if (opts.encoding === 'binary') { + FS.write(stream, data, 0, data.length, 0, opts.canOwn); + } + FS.close(stream); + },cwd:function () { + return FS.currentPath; + },chdir:function (path) { + var lookup = FS.lookupPath(path, { follow: true }); + if (!FS.isDir(lookup.node.mode)) { + throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR); + } + var err = FS.nodePermissions(lookup.node, 'x'); + if (err) { + throw new FS.ErrnoError(err); + } + FS.currentPath = lookup.path; + },createDefaultDirectories:function () { + FS.mkdir('/tmp'); + FS.mkdir('/home'); + FS.mkdir('/home/web_user'); + },createDefaultDevices:function () { + // create /dev + FS.mkdir('/dev'); + // setup /dev/null + FS.registerDevice(FS.makedev(1, 3), { + read: function() { return 0; }, + write: function(stream, buffer, offset, length, pos) { return length; } + }); + FS.mkdev('/dev/null', FS.makedev(1, 3)); + // setup /dev/tty and /dev/tty1 + // stderr needs to print output using Module['printErr'] + // so we register a second tty just for it. + TTY.register(FS.makedev(5, 0), TTY.default_tty_ops); + TTY.register(FS.makedev(6, 0), TTY.default_tty1_ops); + FS.mkdev('/dev/tty', FS.makedev(5, 0)); + FS.mkdev('/dev/tty1', FS.makedev(6, 0)); + // setup /dev/[u]random + var random_device; + if (typeof crypto !== 'undefined') { + // for modern web browsers + var randomBuffer = new Uint8Array(1); + random_device = function() { crypto.getRandomValues(randomBuffer); return randomBuffer[0]; }; + } else if (ENVIRONMENT_IS_NODE) { + // for nodejs + random_device = function() { return require('crypto').randomBytes(1)[0]; }; + } else { + // default for ES5 platforms + random_device = function() { return (Math.random()*256)|0; }; + } + FS.createDevice('/dev', 'random', random_device); + FS.createDevice('/dev', 'urandom', random_device); + // we're not going to emulate the actual shm device, + // just create the tmp dirs that reside in it commonly + FS.mkdir('/dev/shm'); + FS.mkdir('/dev/shm/tmp'); + },createSpecialDirectories:function () { + // create /proc/self/fd which allows /proc/self/fd/6 => readlink gives the name of the stream for fd 6 (see test_unistd_ttyname) + FS.mkdir('/proc'); + FS.mkdir('/proc/self'); + FS.mkdir('/proc/self/fd'); + FS.mount({ + mount: function() { + var node = FS.createNode('/proc/self', 'fd', 16384 | 0777, 73); + node.node_ops = { + lookup: function(parent, name) { + var fd = +name; + var stream = FS.getStream(fd); + if (!stream) throw new FS.ErrnoError(ERRNO_CODES.EBADF); + var ret = { + parent: null, + mount: { mountpoint: 'fake' }, + node_ops: { readlink: function() { return stream.path } } + }; + ret.parent = ret; // make it look like a simple root node + return ret; + } + }; + return node; + } + }, {}, '/proc/self/fd'); + },createStandardStreams:function () { + // TODO deprecate the old functionality of a single + // input / output callback and that utilizes FS.createDevice + // and instead require a unique set of stream ops + + // by default, we symlink the standard streams to the + // default tty devices. however, if the standard streams + // have been overwritten we create a unique device for + // them instead. + if (Module['stdin']) { + FS.createDevice('/dev', 'stdin', Module['stdin']); + } else { + FS.symlink('/dev/tty', '/dev/stdin'); + } + if (Module['stdout']) { + FS.createDevice('/dev', 'stdout', null, Module['stdout']); + } else { + FS.symlink('/dev/tty', '/dev/stdout'); + } + if (Module['stderr']) { + FS.createDevice('/dev', 'stderr', null, Module['stderr']); + } else { + FS.symlink('/dev/tty1', '/dev/stderr'); + } + + // open default streams for the stdin, stdout and stderr devices + var stdin = FS.open('/dev/stdin', 'r'); + assert(stdin.fd === 0, 'invalid handle for stdin (' + stdin.fd + ')'); + + var stdout = FS.open('/dev/stdout', 'w'); + assert(stdout.fd === 1, 'invalid handle for stdout (' + stdout.fd + ')'); + + var stderr = FS.open('/dev/stderr', 'w'); + assert(stderr.fd === 2, 'invalid handle for stderr (' + stderr.fd + ')'); + },ensureErrnoError:function () { + if (FS.ErrnoError) return; + FS.ErrnoError = function ErrnoError(errno, node) { + //Module.printErr(stackTrace()); // useful for debugging + this.node = node; + this.setErrno = function(errno) { + this.errno = errno; + for (var key in ERRNO_CODES) { + if (ERRNO_CODES[key] === errno) { + this.code = key; + break; + } + } + }; + this.setErrno(errno); + this.message = ERRNO_MESSAGES[errno]; + if (this.stack) this.stack = demangleAll(this.stack); + }; + FS.ErrnoError.prototype = new Error(); + FS.ErrnoError.prototype.constructor = FS.ErrnoError; + // Some errors may happen quite a bit, to avoid overhead we reuse them (and suffer a lack of stack info) + [ERRNO_CODES.ENOENT].forEach(function(code) { + FS.genericErrors[code] = new FS.ErrnoError(code); + FS.genericErrors[code].stack = '<generic error, no stack>'; + }); + },staticInit:function () { + FS.ensureErrnoError(); + + FS.nameTable = new Array(4096); + + FS.mount(MEMFS, {}, '/'); + + FS.createDefaultDirectories(); + FS.createDefaultDevices(); + FS.createSpecialDirectories(); + + FS.filesystems = { + 'MEMFS': MEMFS, + 'IDBFS': IDBFS, + 'NODEFS': NODEFS, + 'WORKERFS': WORKERFS, + }; + },init:function (input, output, error) { + assert(!FS.init.initialized, 'FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)'); + FS.init.initialized = true; + + FS.ensureErrnoError(); + + // Allow Module.stdin etc. to provide defaults, if none explicitly passed to us here + Module['stdin'] = input || Module['stdin']; + Module['stdout'] = output || Module['stdout']; + Module['stderr'] = error || Module['stderr']; + + FS.createStandardStreams(); + },quit:function () { + FS.init.initialized = false; + // force-flush all streams, so we get musl std streams printed out + var fflush = Module['_fflush']; + if (fflush) fflush(0); + // close all of our streams + for (var i = 0; i < FS.streams.length; i++) { + var stream = FS.streams[i]; + if (!stream) { + continue; + } + FS.close(stream); + } + },getMode:function (canRead, canWrite) { + var mode = 0; + if (canRead) mode |= 292 | 73; + if (canWrite) mode |= 146; + return mode; + },joinPath:function (parts, forceRelative) { + var path = PATH.join.apply(null, parts); + if (forceRelative && path[0] == '/') path = path.substr(1); + return path; + },absolutePath:function (relative, base) { + return PATH.resolve(base, relative); + },standardizePath:function (path) { + return PATH.normalize(path); + },findObject:function (path, dontResolveLastLink) { + var ret = FS.analyzePath(path, dontResolveLastLink); + if (ret.exists) { + return ret.object; + } else { + ___setErrNo(ret.error); + return null; + } + },analyzePath:function (path, dontResolveLastLink) { + // operate from within the context of the symlink's target + try { + var lookup = FS.lookupPath(path, { follow: !dontResolveLastLink }); + path = lookup.path; + } catch (e) { + } + var ret = { + isRoot: false, exists: false, error: 0, name: null, path: null, object: null, + parentExists: false, parentPath: null, parentObject: null + }; + try { + var lookup = FS.lookupPath(path, { parent: true }); + ret.parentExists = true; + ret.parentPath = lookup.path; + ret.parentObject = lookup.node; + ret.name = PATH.basename(path); + lookup = FS.lookupPath(path, { follow: !dontResolveLastLink }); + ret.exists = true; + ret.path = lookup.path; + ret.object = lookup.node; + ret.name = lookup.node.name; + ret.isRoot = lookup.path === '/'; + } catch (e) { + ret.error = e.errno; + }; + return ret; + },createFolder:function (parent, name, canRead, canWrite) { + var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name); + var mode = FS.getMode(canRead, canWrite); + return FS.mkdir(path, mode); + },createPath:function (parent, path, canRead, canWrite) { + parent = typeof parent === 'string' ? parent : FS.getPath(parent); + var parts = path.split('/').reverse(); + while (parts.length) { + var part = parts.pop(); + if (!part) continue; + var current = PATH.join2(parent, part); + try { + FS.mkdir(current); + } catch (e) { + // ignore EEXIST + } + parent = current; + } + return current; + },createFile:function (parent, name, properties, canRead, canWrite) { + var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name); + var mode = FS.getMode(canRead, canWrite); + return FS.create(path, mode); + },createDataFile:function (parent, name, data, canRead, canWrite, canOwn) { + var path = name ? PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name) : parent; + var mode = FS.getMode(canRead, canWrite); + var node = FS.create(path, mode); + if (data) { + if (typeof data === 'string') { + var arr = new Array(data.length); + for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i); + data = arr; + } + // make sure we can write to the file + FS.chmod(node, mode | 146); + var stream = FS.open(node, 'w'); + FS.write(stream, data, 0, data.length, 0, canOwn); + FS.close(stream); + FS.chmod(node, mode); + } + return node; + },createDevice:function (parent, name, input, output) { + var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name); + var mode = FS.getMode(!!input, !!output); + if (!FS.createDevice.major) FS.createDevice.major = 64; + var dev = FS.makedev(FS.createDevice.major++, 0); + // Create a fake device that a set of stream ops to emulate + // the old behavior. + FS.registerDevice(dev, { + open: function(stream) { + stream.seekable = false; + }, + close: function(stream) { + // flush any pending line data + if (output && output.buffer && output.buffer.length) { + output(10); + } + }, + read: function(stream, buffer, offset, length, pos /* ignored */) { + var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = input(); + } catch (e) { + throw new FS.ErrnoError(ERRNO_CODES.EIO); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(ERRNO_CODES.EAGAIN); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset+i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + }, + write: function(stream, buffer, offset, length, pos) { + for (var i = 0; i < length; i++) { + try { + output(buffer[offset+i]); + } catch (e) { + throw new FS.ErrnoError(ERRNO_CODES.EIO); + } + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + } + }); + return FS.mkdev(path, mode, dev); + },createLink:function (parent, name, target, canRead, canWrite) { + var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name); + return FS.symlink(target, path); + },forceLoadFile:function (obj) { + if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true; + var success = true; + if (typeof XMLHttpRequest !== 'undefined') { + throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread."); + } else if (Module['read']) { + // Command-line. + try { + // WARNING: Can't read binary files in V8's d8 or tracemonkey's js, as + // read() will try to parse UTF8. + obj.contents = intArrayFromString(Module['read'](obj.url), true); + obj.usedBytes = obj.contents.length; + } catch (e) { + success = false; + } + } else { + throw new Error('Cannot load without read() or XMLHttpRequest.'); + } + if (!success) ___setErrNo(ERRNO_CODES.EIO); + return success; + },createLazyFile:function (parent, name, url, canRead, canWrite) { + // Lazy chunked Uint8Array (implements get and length from Uint8Array). Actual getting is abstracted away for eventual reuse. + function LazyUint8Array() { + this.lengthKnown = false; + this.chunks = []; // Loaded chunks. Index is the chunk number + } + LazyUint8Array.prototype.get = function LazyUint8Array_get(idx) { + if (idx > this.length-1 || idx < 0) { + return undefined; + } + var chunkOffset = idx % this.chunkSize; + var chunkNum = (idx / this.chunkSize)|0; + return this.getter(chunkNum)[chunkOffset]; + } + LazyUint8Array.prototype.setDataGetter = function LazyUint8Array_setDataGetter(getter) { + this.getter = getter; + } + LazyUint8Array.prototype.cacheLength = function LazyUint8Array_cacheLength() { + // Find length + var xhr = new XMLHttpRequest(); + xhr.open('HEAD', url, false); + xhr.send(null); + if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); + var datalength = Number(xhr.getResponseHeader("Content-length")); + var header; + var hasByteServing = (header = xhr.getResponseHeader("Accept-Ranges")) && header === "bytes"; + var chunkSize = 1024*1024; // Chunk size in bytes + + if (!hasByteServing) chunkSize = datalength; + + // Function to get a range from the remote URL. + var doXHR = (function(from, to) { + if (from > to) throw new Error("invalid range (" + from + ", " + to + ") or no bytes requested!"); + if (to > datalength-1) throw new Error("only " + datalength + " bytes available! programmer error!"); + + // TODO: Use mozResponseArrayBuffer, responseStream, etc. if available. + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, false); + if (datalength !== chunkSize) xhr.setRequestHeader("Range", "bytes=" + from + "-" + to); + + // Some hints to the browser that we want binary data. + if (typeof Uint8Array != 'undefined') xhr.responseType = 'arraybuffer'; + if (xhr.overrideMimeType) { + xhr.overrideMimeType('text/plain; charset=x-user-defined'); + } + + xhr.send(null); + if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); + if (xhr.response !== undefined) { + return new Uint8Array(xhr.response || []); + } else { + return intArrayFromString(xhr.responseText || '', true); + } + }); + var lazyArray = this; + lazyArray.setDataGetter(function(chunkNum) { + var start = chunkNum * chunkSize; + var end = (chunkNum+1) * chunkSize - 1; // including this byte + end = Math.min(end, datalength-1); // if datalength-1 is selected, this is the last block + if (typeof(lazyArray.chunks[chunkNum]) === "undefined") { + lazyArray.chunks[chunkNum] = doXHR(start, end); + } + if (typeof(lazyArray.chunks[chunkNum]) === "undefined") throw new Error("doXHR failed!"); + return lazyArray.chunks[chunkNum]; + }); + + this._length = datalength; + this._chunkSize = chunkSize; + this.lengthKnown = true; + } + if (typeof XMLHttpRequest !== 'undefined') { + if (!ENVIRONMENT_IS_WORKER) throw 'Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc'; + var lazyArray = new LazyUint8Array(); + Object.defineProperty(lazyArray, "length", { + get: function() { + if(!this.lengthKnown) { + this.cacheLength(); + } + return this._length; + } + }); + Object.defineProperty(lazyArray, "chunkSize", { + get: function() { + if(!this.lengthKnown) { + this.cacheLength(); + } + return this._chunkSize; + } + }); + + var properties = { isDevice: false, contents: lazyArray }; + } else { + var properties = { isDevice: false, url: url }; + } + + var node = FS.createFile(parent, name, properties, canRead, canWrite); + // This is a total hack, but I want to get this lazy file code out of the + // core of MEMFS. If we want to keep this lazy file concept I feel it should + // be its own thin LAZYFS proxying calls to MEMFS. + if (properties.contents) { + node.contents = properties.contents; + } else if (properties.url) { + node.contents = null; + node.url = properties.url; + } + // Add a function that defers querying the file size until it is asked the first time. + Object.defineProperty(node, "usedBytes", { + get: function() { return this.contents.length; } + }); + // override each stream op with one that tries to force load the lazy file first + var stream_ops = {}; + var keys = Object.keys(node.stream_ops); + keys.forEach(function(key) { + var fn = node.stream_ops[key]; + stream_ops[key] = function forceLoadLazyFile() { + if (!FS.forceLoadFile(node)) { + throw new FS.ErrnoError(ERRNO_CODES.EIO); + } + return fn.apply(null, arguments); + }; + }); + // use a custom read function + stream_ops.read = function stream_ops_read(stream, buffer, offset, length, position) { + if (!FS.forceLoadFile(node)) { + throw new FS.ErrnoError(ERRNO_CODES.EIO); + } + var contents = stream.node.contents; + if (position >= contents.length) + return 0; + var size = Math.min(contents.length - position, length); + assert(size >= 0); + if (contents.slice) { // normal array + for (var i = 0; i < size; i++) { + buffer[offset + i] = contents[position + i]; + } + } else { + for (var i = 0; i < size; i++) { // LazyUint8Array from sync binary XHR + buffer[offset + i] = contents.get(position + i); + } + } + return size; + }; + node.stream_ops = stream_ops; + return node; + },createPreloadedFile:function (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) { + Browser.init(); + // TODO we should allow people to just pass in a complete filename instead + // of parent and name being that we just join them anyways + var fullname = name ? PATH.resolve(PATH.join2(parent, name)) : parent; + var dep = getUniqueRunDependency('cp ' + fullname); // might have several active requests for the same fullname + function processData(byteArray) { + function finish(byteArray) { + if (preFinish) preFinish(); + if (!dontCreateFile) { + FS.createDataFile(parent, name, byteArray, canRead, canWrite, canOwn); + } + if (onload) onload(); + removeRunDependency(dep); + } + var handled = false; + Module['preloadPlugins'].forEach(function(plugin) { + if (handled) return; + if (plugin['canHandle'](fullname)) { + plugin['handle'](byteArray, fullname, finish, function() { + if (onerror) onerror(); + removeRunDependency(dep); + }); + handled = true; + } + }); + if (!handled) finish(byteArray); + } + addRunDependency(dep); + if (typeof url == 'string') { + Browser.asyncLoad(url, function(byteArray) { + processData(byteArray); + }, onerror); + } else { + processData(url); + } + },indexedDB:function () { + return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB; + },DB_NAME:function () { + return 'EM_FS_' + window.location.pathname; + },DB_VERSION:20,DB_STORE_NAME:"FILE_DATA",saveFilesToDB:function (paths, onload, onerror) { + onload = onload || function(){}; + onerror = onerror || function(){}; + var indexedDB = FS.indexedDB(); + try { + var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION); + } catch (e) { + return onerror(e); + } + openRequest.onupgradeneeded = function openRequest_onupgradeneeded() { + console.log('creating db'); + var db = openRequest.result; + db.createObjectStore(FS.DB_STORE_NAME); + }; + openRequest.onsuccess = function openRequest_onsuccess() { + var db = openRequest.result; + var transaction = db.transaction([FS.DB_STORE_NAME], 'readwrite'); + var files = transaction.objectStore(FS.DB_STORE_NAME); + var ok = 0, fail = 0, total = paths.length; + function finish() { + if (fail == 0) onload(); else onerror(); + } + paths.forEach(function(path) { + var putRequest = files.put(FS.analyzePath(path).object.contents, path); + putRequest.onsuccess = function putRequest_onsuccess() { ok++; if (ok + fail == total) finish() }; + putRequest.onerror = function putRequest_onerror() { fail++; if (ok + fail == total) finish() }; + }); + transaction.onerror = onerror; + }; + openRequest.onerror = onerror; + },loadFilesFromDB:function (paths, onload, onerror) { + onload = onload || function(){}; + onerror = onerror || function(){}; + var indexedDB = FS.indexedDB(); + try { + var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION); + } catch (e) { + return onerror(e); + } + openRequest.onupgradeneeded = onerror; // no database to load from + openRequest.onsuccess = function openRequest_onsuccess() { + var db = openRequest.result; + try { + var transaction = db.transaction([FS.DB_STORE_NAME], 'readonly'); + } catch(e) { + onerror(e); + return; + } + var files = transaction.objectStore(FS.DB_STORE_NAME); + var ok = 0, fail = 0, total = paths.length; + function finish() { + if (fail == 0) onload(); else onerror(); + } + paths.forEach(function(path) { + var getRequest = files.get(path); + getRequest.onsuccess = function getRequest_onsuccess() { + if (FS.analyzePath(path).exists) { + FS.unlink(path); + } + FS.createDataFile(PATH.dirname(path), PATH.basename(path), getRequest.result, true, true, true); + ok++; + if (ok + fail == total) finish(); + }; + getRequest.onerror = function getRequest_onerror() { fail++; if (ok + fail == total) finish() }; + }); + transaction.onerror = onerror; + }; + openRequest.onerror = onerror; + }};var SYSCALLS={DEFAULT_POLLMASK:5,mappings:{},umask:511,calculateAt:function (dirfd, path) { + if (path[0] !== '/') { + // relative path + var dir; + if (dirfd === -100) { + dir = FS.cwd(); + } else { + var dirstream = FS.getStream(dirfd); + if (!dirstream) throw new FS.ErrnoError(ERRNO_CODES.EBADF); + dir = dirstream.path; + } + path = PATH.join2(dir, path); + } + return path; + },doStat:function (func, path, buf) { + try { + var stat = func(path); + } catch (e) { + if (e && e.node && PATH.normalize(path) !== PATH.normalize(FS.getPath(e.node))) { + // an error occurred while trying to look up the path; we should just report ENOTDIR + return -ERRNO_CODES.ENOTDIR; + } + throw e; + } + HEAP32[((buf)>>2)]=stat.dev; + HEAP32[(((buf)+(4))>>2)]=0; + HEAP32[(((buf)+(8))>>2)]=stat.ino; + HEAP32[(((buf)+(12))>>2)]=stat.mode; + HEAP32[(((buf)+(16))>>2)]=stat.nlink; + HEAP32[(((buf)+(20))>>2)]=stat.uid; + HEAP32[(((buf)+(24))>>2)]=stat.gid; + HEAP32[(((buf)+(28))>>2)]=stat.rdev; + HEAP32[(((buf)+(32))>>2)]=0; + HEAP32[(((buf)+(36))>>2)]=stat.size; + HEAP32[(((buf)+(40))>>2)]=4096; + HEAP32[(((buf)+(44))>>2)]=stat.blocks; + HEAP32[(((buf)+(48))>>2)]=(stat.atime.getTime() / 1000)|0; + HEAP32[(((buf)+(52))>>2)]=0; + HEAP32[(((buf)+(56))>>2)]=(stat.mtime.getTime() / 1000)|0; + HEAP32[(((buf)+(60))>>2)]=0; + HEAP32[(((buf)+(64))>>2)]=(stat.ctime.getTime() / 1000)|0; + HEAP32[(((buf)+(68))>>2)]=0; + HEAP32[(((buf)+(72))>>2)]=stat.ino; + return 0; + },doMsync:function (addr, stream, len, flags) { + var buffer = new Uint8Array(HEAPU8.subarray(addr, addr + len)); + FS.msync(stream, buffer, 0, len, flags); + },doMkdir:function (path, mode) { + // remove a trailing slash, if one - /a/b/ has basename of '', but + // we want to create b in the context of this function + path = PATH.normalize(path); + if (path[path.length-1] === '/') path = path.substr(0, path.length-1); + FS.mkdir(path, mode, 0); + return 0; + },doMknod:function (path, mode, dev) { + // we don't want this in the JS API as it uses mknod to create all nodes. + switch (mode & 61440) { + case 32768: + case 8192: + case 24576: + case 4096: + case 49152: + break; + default: return -ERRNO_CODES.EINVAL; + } + FS.mknod(path, mode, dev); + return 0; + },doReadlink:function (path, buf, bufsize) { + if (bufsize <= 0) return -ERRNO_CODES.EINVAL; + var ret = FS.readlink(path); + ret = ret.slice(0, Math.max(0, bufsize)); + writeStringToMemory(ret, buf, true); + return ret.length; + },doAccess:function (path, amode) { + if (amode & ~7) { + // need a valid mode + return -ERRNO_CODES.EINVAL; + } + var node; + var lookup = FS.lookupPath(path, { follow: true }); + node = lookup.node; + var perms = ''; + if (amode & 4) perms += 'r'; + if (amode & 2) perms += 'w'; + if (amode & 1) perms += 'x'; + if (perms /* otherwise, they've just passed F_OK */ && FS.nodePermissions(node, perms)) { + return -ERRNO_CODES.EACCES; + } + return 0; + },doDup:function (path, flags, suggestFD) { + var suggest = FS.getStream(suggestFD); + if (suggest) FS.close(suggest); + return FS.open(path, flags, 0, suggestFD, suggestFD).fd; + },doReadv:function (stream, iov, iovcnt, offset) { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAP32[(((iov)+(i*8))>>2)]; + var len = HEAP32[(((iov)+(i*8 + 4))>>2)]; + var curr = FS.read(stream, HEAP8,ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + if (curr < len) break; // nothing more to read + } + return ret; + },doWritev:function (stream, iov, iovcnt, offset) { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAP32[(((iov)+(i*8))>>2)]; + var len = HEAP32[(((iov)+(i*8 + 4))>>2)]; + var curr = FS.write(stream, HEAP8,ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + } + return ret; + },varargs:0,get:function (varargs) { + SYSCALLS.varargs += 4; + var ret = HEAP32[(((SYSCALLS.varargs)-(4))>>2)]; + return ret; + },getStr:function () { + var ret = Pointer_stringify(SYSCALLS.get()); + return ret; + },getStreamFromFD:function () { + var stream = FS.getStream(SYSCALLS.get()); + if (!stream) throw new FS.ErrnoError(ERRNO_CODES.EBADF); + return stream; + },getSocketFromFD:function () { + var socket = SOCKFS.getSocket(SYSCALLS.get()); + if (!socket) throw new FS.ErrnoError(ERRNO_CODES.EBADF); + return socket; + },getSocketAddress:function (allowNull) { + var addrp = SYSCALLS.get(), addrlen = SYSCALLS.get(); + if (allowNull && addrp === 0) return null; + var info = __read_sockaddr(addrp, addrlen); + if (info.errno) throw new FS.ErrnoError(info.errno); + info.addr = DNS.lookup_addr(info.addr) || info.addr; + return info; + },get64:function () { + var low = SYSCALLS.get(), high = SYSCALLS.get(); + if (low >= 0) assert(high === 0); + else assert(high === -1); + return low; + },getZero:function () { + assert(SYSCALLS.get() === 0); + }};function ___syscall5(which, varargs) {SYSCALLS.varargs = varargs; + try { + // open + var pathname = SYSCALLS.getStr(), flags = SYSCALLS.get(), mode = SYSCALLS.get() // optional TODO + var stream = FS.open(pathname, flags, mode); + return stream.fd; + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return -e.errno; + } + } + + + function _emscripten_memcpy_big(dest, src, num) { + HEAPU8.set(HEAPU8.subarray(src, src+num), dest); + return dest; + } + Module["_memcpy"] = _memcpy; + + function ___syscall6(which, varargs) {SYSCALLS.varargs = varargs; + try { + // close + var stream = SYSCALLS.getStreamFromFD(); + FS.close(stream); + return 0; + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return -e.errno; + } + } + + var _cos=Math_cos; + + function _sbrk(bytes) { + // Implement a Linux-like 'memory area' for our 'process'. + // Changes the size of the memory area by |bytes|; returns the + // address of the previous top ('break') of the memory area + // We control the "dynamic" memory - DYNAMIC_BASE to DYNAMICTOP + var self = _sbrk; + if (!self.called) { + DYNAMICTOP = alignMemoryPage(DYNAMICTOP); // make sure we start out aligned + self.called = true; + assert(Runtime.dynamicAlloc); + self.alloc = Runtime.dynamicAlloc; + Runtime.dynamicAlloc = function() { abort('cannot dynamically allocate, sbrk now has control') }; + } + var ret = DYNAMICTOP; + if (bytes != 0) { + var success = self.alloc(bytes); + if (!success) return -1 >>> 0; // sbrk failure code + } + return ret; // Previous break location. + } + + + Module["_memmove"] = _memmove; + + var _BItoD=true; + + function ___syscall54(which, varargs) {SYSCALLS.varargs = varargs; + try { + // ioctl + var stream = SYSCALLS.getStreamFromFD(), op = SYSCALLS.get(); + switch (op) { + case 21505: { + if (!stream.tty) return -ERRNO_CODES.ENOTTY; + return 0; + } + case 21506: { + if (!stream.tty) return -ERRNO_CODES.ENOTTY; + return 0; // no-op, not actually adjusting terminal settings + } + case 21519: { + if (!stream.tty) return -ERRNO_CODES.ENOTTY; + var argp = SYSCALLS.get(); + HEAP32[((argp)>>2)]=0; + return 0; + } + case 21520: { + if (!stream.tty) return -ERRNO_CODES.ENOTTY; + return -ERRNO_CODES.EINVAL; // not supported + } + case 21531: { + var argp = SYSCALLS.get(); + return FS.ioctl(stream, op, argp); + } + default: abort('bad ioctl syscall ' + op); + } + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return -e.errno; + } + } + + var _ceilf=Math_ceil; + + function __embind_register_memory_view(rawType, dataTypeIndex, name) { + var typeMapping = [ + Int8Array, + Uint8Array, + Int16Array, + Uint16Array, + Int32Array, + Uint32Array, + Float32Array, + Float64Array, + ]; + + var TA = typeMapping[dataTypeIndex]; + + function decodeMemoryView(handle) { + handle = handle >> 2; + var heap = HEAPU32; + var size = heap[handle]; // in elements + var data = heap[handle + 1]; // byte offset into emscripten heap + return new TA(heap['buffer'], data, size); + } + + name = readLatin1String(name); + registerType(rawType, { + name: name, + 'fromWireType': decodeMemoryView, + 'argPackAdvance': 8, + 'readValueFromPointer': decodeMemoryView, + }, { + ignoreDuplicateRegistrations: true, + }); + } + + function _time(ptr) { + var ret = (Date.now()/1000)|0; + if (ptr) { + HEAP32[((ptr)>>2)]=ret; + } + return ret; + } + + function _pthread_self() { + //FIXME: assumes only a single thread + return 0; + } + + function ___syscall140(which, varargs) {SYSCALLS.varargs = varargs; + try { + // llseek + var stream = SYSCALLS.getStreamFromFD(), offset_high = SYSCALLS.get(), offset_low = SYSCALLS.get(), result = SYSCALLS.get(), whence = SYSCALLS.get(); + var offset = offset_low; + assert(offset_high === 0); + FS.llseek(stream, offset, whence); + HEAP32[((result)>>2)]=stream.position; + if (stream.getdents && offset === 0 && whence === 0) stream.getdents = null; // reset readdir state + return 0; + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return -e.errno; + } + } + + function ___syscall146(which, varargs) {SYSCALLS.varargs = varargs; + try { + // writev + var stream = SYSCALLS.getStreamFromFD(), iov = SYSCALLS.get(), iovcnt = SYSCALLS.get(); + return SYSCALLS.doWritev(stream, iov, iovcnt); + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return -e.errno; + } + } + + function ___syscall221(which, varargs) {SYSCALLS.varargs = varargs; + try { + // fcntl64 + var stream = SYSCALLS.getStreamFromFD(), cmd = SYSCALLS.get(); + switch (cmd) { + case 0: { + var arg = SYSCALLS.get(); + if (arg < 0) { + return -ERRNO_CODES.EINVAL; + } + var newStream; + newStream = FS.open(stream.path, stream.flags, 0, arg); + return newStream.fd; + } + case 1: + case 2: + return 0; // FD_CLOEXEC makes no sense for a single process. + case 3: + return stream.flags; + case 4: { + var arg = SYSCALLS.get(); + stream.flags |= arg; + return 0; + } + case 12: + case 12: { + var arg = SYSCALLS.get(); + var offset = 0; + // We're always unlocked. + HEAP16[(((arg)+(offset))>>1)]=2; + return 0; + } + case 13: + case 14: + case 13: + case 14: + return 0; // Pretend that the locking is successful. + case 16: + case 8: + return -ERRNO_CODES.EINVAL; // These are for sockets. We don't have them fully implemented yet. + case 9: + // musl trusts getown return values, due to a bug where they must be, as they overlap with errors. just return -1 here, so fnctl() returns that, and we set errno ourselves. + ___setErrNo(ERRNO_CODES.EINVAL); + return -1; + default: { + return -ERRNO_CODES.EINVAL; + } + } + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return -e.errno; + } + } + + function ___syscall145(which, varargs) {SYSCALLS.varargs = varargs; + try { + // readv + var stream = SYSCALLS.getStreamFromFD(), iov = SYSCALLS.get(), iovcnt = SYSCALLS.get(); + return SYSCALLS.doReadv(stream, iov, iovcnt); + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return -e.errno; + } + } + + var ___dso_handle=allocate(1, "i32*", ALLOC_STATIC); +embind_init_charCodes() +BindingError = Module['BindingError'] = extendError(Error, 'BindingError'); +InternalError = Module['InternalError'] = extendError(Error, 'InternalError'); +init_emval(); +UnboundTypeError = Module['UnboundTypeError'] = extendError(Error, 'UnboundTypeError'); +FS.staticInit();__ATINIT__.unshift(function() { if (!Module["noFSInit"] && !FS.init.initialized) FS.init() });__ATMAIN__.push(function() { FS.ignorePermissions = false });__ATEXIT__.push(function() { FS.quit() });Module["FS_createFolder"] = FS.createFolder;Module["FS_createPath"] = FS.createPath;Module["FS_createDataFile"] = FS.createDataFile;Module["FS_createPreloadedFile"] = FS.createPreloadedFile;Module["FS_createLazyFile"] = FS.createLazyFile;Module["FS_createLink"] = FS.createLink;Module["FS_createDevice"] = FS.createDevice;Module["FS_unlink"] = FS.unlink; +__ATINIT__.unshift(function() { TTY.init() });__ATEXIT__.push(function() { TTY.shutdown() }); +if (ENVIRONMENT_IS_NODE) { var fs = require("fs"); var NODEJS_PATH = require("path"); NODEFS.staticInit(); } +STACK_BASE = STACKTOP = Runtime.alignMemory(STATICTOP); + +staticSealed = true; // seal the static portion of memory + +STACK_MAX = STACK_BASE + TOTAL_STACK; + +DYNAMIC_BASE = DYNAMICTOP = Runtime.alignMemory(STACK_MAX); + +assert(DYNAMIC_BASE < TOTAL_MEMORY, "TOTAL_MEMORY not big enough for stack"); + + var cttz_i8 = allocate([8,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0], "i8", ALLOC_DYNAMIC); + + +function nullFunc_iiii(x) { Module["printErr"]("Invalid function pointer called with signature 'iiii'. Perhaps this is an invalid value (e.g. caused by calling a virtual method on a NULL pointer)? Or calling a function with an incorrect type, which will fail? (it is worth building your source files with -Werror (warnings are errors), as warnings can indicate undefined behavior which can cause this)"); Module["printErr"]("Build with ASSERTIONS=2 for more info.");abort(x) } + +function nullFunc_viiiii(x) { Module["printErr"]("Invalid function pointer called with signature 'viiiii'. Perhaps this is an invalid value (e.g. caused by calling a virtual method on a NULL pointer)? Or calling a function with an incorrect type, which will fail? (it is worth building your source files with -Werror (warnings are errors), as warnings can indicate undefined behavior which can cause this)"); Module["printErr"]("Build with ASSERTIONS=2 for more info.");abort(x) } + +function nullFunc_dii(x) { Module["printErr"]("Invalid function pointer called with signature 'dii'. Perhaps this is an invalid value (e.g. caused by calling a virtual method on a NULL pointer)? Or calling a function with an incorrect type, which will fail? (it is worth building your source files with -Werror (warnings are errors), as warnings can indicate undefined behavior which can cause this)"); Module["printErr"]("Build with ASSERTIONS=2 for more info.");abort(x) } + +function nullFunc_vid(x) { Module["printErr"]("Invalid function pointer called with signature 'vid'. Perhaps this is an invalid value (e.g. caused by calling a virtual method on a NULL pointer)? Or calling a function with an incorrect type, which will fail? (it is worth building your source files with -Werror (warnings are errors), as warnings can indicate undefined behavior which can cause this)"); Module["printErr"]("Build with ASSERTIONS=2 for more info.");abort(x) } + +function nullFunc_di(x) { Module["printErr"]("Invalid function pointer called with signature 'di'. Perhaps this is an invalid value (e.g. caused by calling a virtual method on a NULL pointer)? Or calling a function with an incorrect type, which will fail? (it is worth building your source files with -Werror (warnings are errors), as warnings can indicate undefined behavior which can cause this)"); Module["printErr"]("Build with ASSERTIONS=2 for more info.");abort(x) } + +function nullFunc_i(x) { Module["printErr"]("Invalid function pointer called with signature 'i'. Perhaps this is an invalid value (e.g. caused by calling a virtual method on a NULL pointer)? Or calling a function with an incorrect type, which will fail? (it is worth building your source files with -Werror (warnings are errors), as warnings can indicate undefined behavior which can cause this)"); Module["printErr"]("Build with ASSERTIONS=2 for more info.");abort(x) } + +function nullFunc_vi(x) { Module["printErr"]("Invalid function pointer called with signature 'vi'. Perhaps this is an invalid value (e.g. caused by calling a virtual method on a NULL pointer)? Or calling a function with an incorrect type, which will fail? (it is worth building your source files with -Werror (warnings are errors), as warnings can indicate undefined behavior which can cause this)"); Module["printErr"]("Build with ASSERTIONS=2 for more info.");abort(x) } + +function nullFunc_vii(x) { Module["printErr"]("Invalid function pointer called with signature 'vii'. Perhaps this is an invalid value (e.g. caused by calling a virtual method on a NULL pointer)? Or calling a function with an incorrect type, which will fail? (it is worth building your source files with -Werror (warnings are errors), as warnings can indicate undefined behavior which can cause this)"); Module["printErr"]("Build with ASSERTIONS=2 for more info.");abort(x) } + +function nullFunc_ii(x) { Module["printErr"]("Invalid function pointer called with signature 'ii'. Perhaps this is an invalid value (e.g. caused by calling a virtual method on a NULL pointer)? Or calling a function with an incorrect type, which will fail? (it is worth building your source files with -Werror (warnings are errors), as warnings can indicate undefined behavior which can cause this)"); Module["printErr"]("Build with ASSERTIONS=2 for more info.");abort(x) } + +function nullFunc_viii(x) { Module["printErr"]("Invalid function pointer called with signature 'viii'. Perhaps this is an invalid value (e.g. caused by calling a virtual method on a NULL pointer)? Or calling a function with an incorrect type, which will fail? (it is worth building your source files with -Werror (warnings are errors), as warnings can indicate undefined behavior which can cause this)"); Module["printErr"]("Build with ASSERTIONS=2 for more info.");abort(x) } + +function nullFunc_v(x) { Module["printErr"]("Invalid function pointer called with signature 'v'. Perhaps this is an invalid value (e.g. caused by calling a virtual method on a NULL pointer)? Or calling a function with an incorrect type, which will fail? (it is worth building your source files with -Werror (warnings are errors), as warnings can indicate undefined behavior which can cause this)"); Module["printErr"]("Build with ASSERTIONS=2 for more info.");abort(x) } + +function nullFunc_viid(x) { Module["printErr"]("Invalid function pointer called with signature 'viid'. Perhaps this is an invalid value (e.g. caused by calling a virtual method on a NULL pointer)? Or calling a function with an incorrect type, which will fail? (it is worth building your source files with -Werror (warnings are errors), as warnings can indicate undefined behavior which can cause this)"); Module["printErr"]("Build with ASSERTIONS=2 for more info.");abort(x) } + +function nullFunc_iiiii(x) { Module["printErr"]("Invalid function pointer called with signature 'iiiii'. Perhaps this is an invalid value (e.g. caused by calling a virtual method on a NULL pointer)? Or calling a function with an incorrect type, which will fail? (it is worth building your source files with -Werror (warnings are errors), as warnings can indicate undefined behavior which can cause this)"); Module["printErr"]("Build with ASSERTIONS=2 for more info.");abort(x) } + +function nullFunc_viiiiii(x) { Module["printErr"]("Invalid function pointer called with signature 'viiiiii'. Perhaps this is an invalid value (e.g. caused by calling a virtual method on a NULL pointer)? Or calling a function with an incorrect type, which will fail? (it is worth building your source files with -Werror (warnings are errors), as warnings can indicate undefined behavior which can cause this)"); Module["printErr"]("Build with ASSERTIONS=2 for more info.");abort(x) } + +function nullFunc_iii(x) { Module["printErr"]("Invalid function pointer called with signature 'iii'. Perhaps this is an invalid value (e.g. caused by calling a virtual method on a NULL pointer)? Or calling a function with an incorrect type, which will fail? (it is worth building your source files with -Werror (warnings are errors), as warnings can indicate undefined behavior which can cause this)"); Module["printErr"]("Build with ASSERTIONS=2 for more info.");abort(x) } + +function nullFunc_viiii(x) { Module["printErr"]("Invalid function pointer called with signature 'viiii'. Perhaps this is an invalid value (e.g. caused by calling a virtual method on a NULL pointer)? Or calling a function with an incorrect type, which will fail? (it is worth building your source files with -Werror (warnings are errors), as warnings can indicate undefined behavior which can cause this)"); Module["printErr"]("Build with ASSERTIONS=2 for more info.");abort(x) } + +function invoke_iiii(index,a1,a2,a3) { + try { + return Module["dynCall_iiii"](index,a1,a2,a3); + } catch(e) { + if (typeof e !== 'number' && e !== 'longjmp') throw e; + asm["setThrew"](1, 0); + } +} + +function invoke_viiiii(index,a1,a2,a3,a4,a5) { + try { + Module["dynCall_viiiii"](index,a1,a2,a3,a4,a5); + } catch(e) { + if (typeof e !== 'number' && e !== 'longjmp') throw e; + asm["setThrew"](1, 0); + } +} + +function invoke_dii(index,a1,a2) { + try { + return Module["dynCall_dii"](index,a1,a2); + } catch(e) { + if (typeof e !== 'number' && e !== 'longjmp') throw e; + asm["setThrew"](1, 0); + } +} + +function invoke_vid(index,a1,a2) { + try { + Module["dynCall_vid"](index,a1,a2); + } catch(e) { + if (typeof e !== 'number' && e !== 'longjmp') throw e; + asm["setThrew"](1, 0); + } +} + +function invoke_di(index,a1) { + try { + return Module["dynCall_di"](index,a1); + } catch(e) { + if (typeof e !== 'number' && e !== 'longjmp') throw e; + asm["setThrew"](1, 0); + } +} + +function invoke_i(index) { + try { + return Module["dynCall_i"](index); + } catch(e) { + if (typeof e !== 'number' && e !== 'longjmp') throw e; + asm["setThrew"](1, 0); + } +} + +function invoke_vi(index,a1) { + try { + Module["dynCall_vi"](index,a1); + } catch(e) { + if (typeof e !== 'number' && e !== 'longjmp') throw e; + asm["setThrew"](1, 0); + } +} + +function invoke_vii(index,a1,a2) { + try { + Module["dynCall_vii"](index,a1,a2); + } catch(e) { + if (typeof e !== 'number' && e !== 'longjmp') throw e; + asm["setThrew"](1, 0); + } +} + +function invoke_ii(index,a1) { + try { + return Module["dynCall_ii"](index,a1); + } catch(e) { + if (typeof e !== 'number' && e !== 'longjmp') throw e; + asm["setThrew"](1, 0); + } +} + +function invoke_viii(index,a1,a2,a3) { + try { + Module["dynCall_viii"](index,a1,a2,a3); + } catch(e) { + if (typeof e !== 'number' && e !== 'longjmp') throw e; + asm["setThrew"](1, 0); + } +} + +function invoke_v(index) { + try { + Module["dynCall_v"](index); + } catch(e) { + if (typeof e !== 'number' && e !== 'longjmp') throw e; + asm["setThrew"](1, 0); + } +} + +function invoke_viid(index,a1,a2,a3) { + try { + Module["dynCall_viid"](index,a1,a2,a3); + } catch(e) { + if (typeof e !== 'number' && e !== 'longjmp') throw e; + asm["setThrew"](1, 0); + } +} + +function invoke_iiiii(index,a1,a2,a3,a4) { + try { + return Module["dynCall_iiiii"](index,a1,a2,a3,a4); + } catch(e) { + if (typeof e !== 'number' && e !== 'longjmp') throw e; + asm["setThrew"](1, 0); + } +} + +function invoke_viiiiii(index,a1,a2,a3,a4,a5,a6) { + try { + Module["dynCall_viiiiii"](index,a1,a2,a3,a4,a5,a6); + } catch(e) { + if (typeof e !== 'number' && e !== 'longjmp') throw e; + asm["setThrew"](1, 0); + } +} + +function invoke_iii(index,a1,a2) { + try { + return Module["dynCall_iii"](index,a1,a2); + } catch(e) { + if (typeof e !== 'number' && e !== 'longjmp') throw e; + asm["setThrew"](1, 0); + } +} + +function invoke_viiii(index,a1,a2,a3,a4) { + try { + Module["dynCall_viiii"](index,a1,a2,a3,a4); + } catch(e) { + if (typeof e !== 'number' && e !== 'longjmp') throw e; + asm["setThrew"](1, 0); + } +} + +Module.asmGlobalArg = { "Math": Math, "Int8Array": Int8Array, "Int16Array": Int16Array, "Int32Array": Int32Array, "Uint8Array": Uint8Array, "Uint16Array": Uint16Array, "Uint32Array": Uint32Array, "Float32Array": Float32Array, "Float64Array": Float64Array, "NaN": NaN, "Infinity": Infinity, "byteLength": byteLength }; + +Module.asmLibraryArg = { "abort": abort, "assert": assert, "nullFunc_iiii": nullFunc_iiii, "nullFunc_viiiii": nullFunc_viiiii, "nullFunc_dii": nullFunc_dii, "nullFunc_vid": nullFunc_vid, "nullFunc_di": nullFunc_di, "nullFunc_i": nullFunc_i, "nullFunc_vi": nullFunc_vi, "nullFunc_vii": nullFunc_vii, "nullFunc_ii": nullFunc_ii, "nullFunc_viii": nullFunc_viii, "nullFunc_v": nullFunc_v, "nullFunc_viid": nullFunc_viid, "nullFunc_iiiii": nullFunc_iiiii, "nullFunc_viiiiii": nullFunc_viiiiii, "nullFunc_iii": nullFunc_iii, "nullFunc_viiii": nullFunc_viiii, "invoke_iiii": invoke_iiii, "invoke_viiiii": invoke_viiiii, "invoke_dii": invoke_dii, "invoke_vid": invoke_vid, "invoke_di": invoke_di, "invoke_i": invoke_i, "invoke_vi": invoke_vi, "invoke_vii": invoke_vii, "invoke_ii": invoke_ii, "invoke_viii": invoke_viii, "invoke_v": invoke_v, "invoke_viid": invoke_viid, "invoke_iiiii": invoke_iiiii, "invoke_viiiiii": invoke_viiiiii, "invoke_iii": invoke_iii, "invoke_viiii": invoke_viiii, "_fabs": _fabs, "___syscall221": ___syscall221, "_sin": _sin, "floatReadValueFromPointer": floatReadValueFromPointer, "simpleReadValueFromPointer": simpleReadValueFromPointer, "___syscall54": ___syscall54, "__embind_register_memory_view": __embind_register_memory_view, "throwInternalError": throwInternalError, "get_first_emval": get_first_emval, "_abort": _abort, "_pthread_cleanup_push": _pthread_cleanup_push, "extendError": extendError, "__embind_register_integer": __embind_register_integer, "___assert_fail": ___assert_fail, "init_emval": init_emval, "___cxa_allocate_exception": ___cxa_allocate_exception, "__ZSt18uncaught_exceptionv": __ZSt18uncaught_exceptionv, "_ceilf": _ceilf, "getShiftFromSize": getShiftFromSize, "__embind_register_function": __embind_register_function, "__embind_register_emval": __embind_register_emval, "_emscripten_asm_const_33": _emscripten_asm_const_33, "__embind_register_constant": __embind_register_constant, "___setErrNo": ___setErrNo, "__emval_register": __emval_register, "_sbrk": _sbrk, "readLatin1String": readLatin1String, "__embind_register_void": __embind_register_void, "_emscripten_memcpy_big": _emscripten_memcpy_big, "__embind_register_bool": __embind_register_bool, "___resumeException": ___resumeException, "___cxa_find_matching_catch": ___cxa_find_matching_catch, "_sysconf": _sysconf, "_embind_repr": _embind_repr, "__embind_register_std_wstring": __embind_register_std_wstring, "createNamedFunction": createNamedFunction, "embind_init_charCodes": embind_init_charCodes, "_cos": _cos, "getTypeName": getTypeName, "throwUnboundTypeError": throwUnboundTypeError, "_pthread_self": _pthread_self, "craftInvokerFunction": craftInvokerFunction, "__emval_decref": __emval_decref, "_sqrt": _sqrt, "__embind_register_float": __embind_register_float, "makeLegalFunctionName": makeLegalFunctionName, "integerReadValueFromPointer": integerReadValueFromPointer, "___unlock": ___unlock, "heap32VectorToArray": heap32VectorToArray, "_pthread_cleanup_pop": _pthread_cleanup_pop, "whenDependentTypesAreResolved": whenDependentTypesAreResolved, "_exit": _exit, "___syscall5": ___syscall5, "_emscripten_asm_const_4": _emscripten_asm_const_4, "___cxa_atexit": ___cxa_atexit, "registerType": registerType, "___cxa_throw": ___cxa_throw, "__exit": __exit, "___lock": ___lock, "___syscall6": ___syscall6, "throwBindingError": throwBindingError, "ensureOverloadTable": ensureOverloadTable, "count_emval_handles": count_emval_handles, "_time": _time, "requireFunction": requireFunction, "runDestructors": runDestructors, "new_": new_, "_atexit": _atexit, "___syscall140": ___syscall140, "exposePublicSymbol": exposePublicSymbol, "_emscripten_asm_const_5": _emscripten_asm_const_5, "__embind_register_std_string": __embind_register_std_string, "replacePublicSymbol": replacePublicSymbol, "___syscall145": ___syscall145, "___syscall146": ___syscall146, "STACKTOP": STACKTOP, "STACK_MAX": STACK_MAX, "tempDoublePtr": tempDoublePtr, "ABORT": ABORT, "cttz_i8": cttz_i8, "___dso_handle": ___dso_handle }; +// EMSCRIPTEN_START_ASM +var asm = (function(global, env, buffer) { + 'use asm'; + + + var Int8View = global.Int8Array; + var Int16View = global.Int16Array; + var Int32View = global.Int32Array; + var Uint8View = global.Uint8Array; + var Uint16View = global.Uint16Array; + var Uint32View = global.Uint32Array; + var Float32View = global.Float32Array; + var Float64View = global.Float64Array; + var HEAP8 = new Int8View(buffer); + var HEAP16 = new Int16View(buffer); + var HEAP32 = new Int32View(buffer); + var HEAPU8 = new Uint8View(buffer); + var HEAPU16 = new Uint16View(buffer); + var HEAPU32 = new Uint32View(buffer); + var HEAPF32 = new Float32View(buffer); + var HEAPF64 = new Float64View(buffer); + var byteLength = global.byteLength; + + + var STACKTOP=env.STACKTOP|0; + var STACK_MAX=env.STACK_MAX|0; + var tempDoublePtr=env.tempDoublePtr|0; + var ABORT=env.ABORT|0; + var cttz_i8=env.cttz_i8|0; + var ___dso_handle=env.___dso_handle|0; + + var __THREW__ = 0; + var threwValue = 0; + var setjmpId = 0; + var undef = 0; + var nan = global.NaN, inf = global.Infinity; + var tempInt = 0, tempBigInt = 0, tempBigIntP = 0, tempBigIntS = 0, tempBigIntR = 0.0, tempBigIntI = 0, tempBigIntD = 0, tempValue = 0, tempDouble = 0.0; + + var tempRet0 = 0; + var tempRet1 = 0; + var tempRet2 = 0; + var tempRet3 = 0; + var tempRet4 = 0; + var tempRet5 = 0; + var tempRet6 = 0; + var tempRet7 = 0; + var tempRet8 = 0; + var tempRet9 = 0; + var Math_floor=global.Math.floor; + var Math_abs=global.Math.abs; + var Math_sqrt=global.Math.sqrt; + var Math_pow=global.Math.pow; + var Math_cos=global.Math.cos; + var Math_sin=global.Math.sin; + var Math_tan=global.Math.tan; + var Math_acos=global.Math.acos; + var Math_asin=global.Math.asin; + var Math_atan=global.Math.atan; + var Math_atan2=global.Math.atan2; + var Math_exp=global.Math.exp; + var Math_log=global.Math.log; + var Math_ceil=global.Math.ceil; + var Math_imul=global.Math.imul; + var Math_min=global.Math.min; + var Math_clz32=global.Math.clz32; + var abort=env.abort; + var assert=env.assert; + var nullFunc_iiii=env.nullFunc_iiii; + var nullFunc_viiiii=env.nullFunc_viiiii; + var nullFunc_dii=env.nullFunc_dii; + var nullFunc_vid=env.nullFunc_vid; + var nullFunc_di=env.nullFunc_di; + var nullFunc_i=env.nullFunc_i; + var nullFunc_vi=env.nullFunc_vi; + var nullFunc_vii=env.nullFunc_vii; + var nullFunc_ii=env.nullFunc_ii; + var nullFunc_viii=env.nullFunc_viii; + var nullFunc_v=env.nullFunc_v; + var nullFunc_viid=env.nullFunc_viid; + var nullFunc_iiiii=env.nullFunc_iiiii; + var nullFunc_viiiiii=env.nullFunc_viiiiii; + var nullFunc_iii=env.nullFunc_iii; + var nullFunc_viiii=env.nullFunc_viiii; + var invoke_iiii=env.invoke_iiii; + var invoke_viiiii=env.invoke_viiiii; + var invoke_dii=env.invoke_dii; + var invoke_vid=env.invoke_vid; + var invoke_di=env.invoke_di; + var invoke_i=env.invoke_i; + var invoke_vi=env.invoke_vi; + var invoke_vii=env.invoke_vii; + var invoke_ii=env.invoke_ii; + var invoke_viii=env.invoke_viii; + var invoke_v=env.invoke_v; + var invoke_viid=env.invoke_viid; + var invoke_iiiii=env.invoke_iiiii; + var invoke_viiiiii=env.invoke_viiiiii; + var invoke_iii=env.invoke_iii; + var invoke_viiii=env.invoke_viiii; + var _fabs=env._fabs; + var ___syscall221=env.___syscall221; + var _sin=env._sin; + var floatReadValueFromPointer=env.floatReadValueFromPointer; + var simpleReadValueFromPointer=env.simpleReadValueFromPointer; + var ___syscall54=env.___syscall54; + var __embind_register_memory_view=env.__embind_register_memory_view; + var throwInternalError=env.throwInternalError; + var get_first_emval=env.get_first_emval; + var _abort=env._abort; + var _pthread_cleanup_push=env._pthread_cleanup_push; + var extendError=env.extendError; + var __embind_register_integer=env.__embind_register_integer; + var ___assert_fail=env.___assert_fail; + var init_emval=env.init_emval; + var ___cxa_allocate_exception=env.___cxa_allocate_exception; + var __ZSt18uncaught_exceptionv=env.__ZSt18uncaught_exceptionv; + var _ceilf=env._ceilf; + var getShiftFromSize=env.getShiftFromSize; + var __embind_register_function=env.__embind_register_function; + var __embind_register_emval=env.__embind_register_emval; + var _emscripten_asm_const_33=env._emscripten_asm_const_33; + var __embind_register_constant=env.__embind_register_constant; + var ___setErrNo=env.___setErrNo; + var __emval_register=env.__emval_register; + var _sbrk=env._sbrk; + var readLatin1String=env.readLatin1String; + var __embind_register_void=env.__embind_register_void; + var _emscripten_memcpy_big=env._emscripten_memcpy_big; + var __embind_register_bool=env.__embind_register_bool; + var ___resumeException=env.___resumeException; + var ___cxa_find_matching_catch=env.___cxa_find_matching_catch; + var _sysconf=env._sysconf; + var _embind_repr=env._embind_repr; + var __embind_register_std_wstring=env.__embind_register_std_wstring; + var createNamedFunction=env.createNamedFunction; + var embind_init_charCodes=env.embind_init_charCodes; + var _cos=env._cos; + var getTypeName=env.getTypeName; + var throwUnboundTypeError=env.throwUnboundTypeError; + var _pthread_self=env._pthread_self; + var craftInvokerFunction=env.craftInvokerFunction; + var __emval_decref=env.__emval_decref; + var _sqrt=env._sqrt; + var __embind_register_float=env.__embind_register_float; + var makeLegalFunctionName=env.makeLegalFunctionName; + var integerReadValueFromPointer=env.integerReadValueFromPointer; + var ___unlock=env.___unlock; + var heap32VectorToArray=env.heap32VectorToArray; + var _pthread_cleanup_pop=env._pthread_cleanup_pop; + var whenDependentTypesAreResolved=env.whenDependentTypesAreResolved; + var _exit=env._exit; + var ___syscall5=env.___syscall5; + var _emscripten_asm_const_4=env._emscripten_asm_const_4; + var ___cxa_atexit=env.___cxa_atexit; + var registerType=env.registerType; + var ___cxa_throw=env.___cxa_throw; + var __exit=env.__exit; + var ___lock=env.___lock; + var ___syscall6=env.___syscall6; + var throwBindingError=env.throwBindingError; + var ensureOverloadTable=env.ensureOverloadTable; + var count_emval_handles=env.count_emval_handles; + var _time=env._time; + var requireFunction=env.requireFunction; + var runDestructors=env.runDestructors; + var new_=env.new_; + var _atexit=env._atexit; + var ___syscall140=env.___syscall140; + var exposePublicSymbol=env.exposePublicSymbol; + var _emscripten_asm_const_5=env._emscripten_asm_const_5; + var __embind_register_std_string=env.__embind_register_std_string; + var replacePublicSymbol=env.replacePublicSymbol; + var ___syscall145=env.___syscall145; + var ___syscall146=env.___syscall146; + var tempFloat = 0.0; + +function _emscripten_replace_memory(newBuffer) { + if ((byteLength(newBuffer) & 0xffffff || byteLength(newBuffer) <= 0xffffff) || byteLength(newBuffer) > 0x80000000) return false; + HEAP8 = new Int8View(newBuffer); + HEAP16 = new Int16View(newBuffer); + HEAP32 = new Int32View(newBuffer); + HEAPU8 = new Uint8View(newBuffer); + HEAPU16 = new Uint16View(newBuffer); + HEAPU32 = new Uint32View(newBuffer); + HEAPF32 = new Float32View(newBuffer); + HEAPF64 = new Float64View(newBuffer); + buffer = newBuffer; + return true; +} + +// EMSCRIPTEN_START_FUNCS + +function __ZN10__cxxabiv112_GLOBAL__N_110parse_typeINS0_2DbEEEPKcS4_S4_RT_($first, $last, $db) { + $first = $first | 0; + $last = $last | 0; + $db = $db | 0; + var $$0 = 0, $$0$i = 0, $$0$i$i = 0, $$0$i$i$i = 0, $$0$i$i$i$i = 0, $$0$i$i$i105 = 0, $$0$i$i$i113 = 0, $$0$i$i$i123 = 0, $$0$i$i$i131 = 0, $$0$i$i$i136 = 0, $$0$i$i$i148 = 0, $$0$i$i$i153 = 0, $$0$i$i$i17 = 0, $$0$i$i$i181 = 0, $$0$i$i$i191509 = 0, $$0$i$i$i22 = 0, $$0$i$i$i27 = 0, $$0$i$i$i29 = 0, $$0$i$i$i31 = 0, $$0$i$i$i38 = 0, $$0$i$i$i43 = 0, $$0$i$i$i51 = 0, $$0$i$i$i56 = 0, $$0$i$i$i61 = 0, $$0$i$i$i66 = 0, $$0$i$i$i71 = 0, $$0$i$i$i76 = 0, $$0$i$i$i81 = 0, $$0$i$i$i87 = 0, $$0$i$i$i95 = 0, $$01$i$i = 0, $$03$i$i = 0, $$08$i = 0, $$1$i$i = 0, $$1$i263 = 0, $$12$i$i = 0, $$13$i259$ph = 0, $$14$i$i = 0, $$2$i$i = 0, $$in = 0, $$lcssa667 = 0, $$lcssa674 = 0, $$lcssa682 = 0, $$lcssa690 = 0, $$lcssa698 = 0, $$lcssa706 = 0, $$ph390 = 0, $$pre$i$i$i$i = 0, $$pre$i$i$i$i203 = 0, $$pre$i$i$i21$i = 0, $$pre$i$i$i36$i = 0, $$pre$i$i$i52$i = 0, $$pre$i$i$i71$i = 0, $0 = 0, $1 = 0, $10 = 0, $1001 = 0, $1003 = 0, $1006 = 0, $101 = 0, $1010 = 0, $1013 = 0, $1018 = 0, $1019 = 0, $1022 = 0, $1023 = 0, $1025 = 0, $1026 = 0, $1035 = 0, $1038 = 0, $104 = 0, $1043 = 0, $1044 = 0, $1049 = 0, $1051 = 0, $1054 = 0, $1058 = 0, $1061 = 0, $1066 = 0, $1067 = 0, $107 = 0, $1070 = 0, $1071 = 0, $1073 = 0, $1074 = 0, $108 = 0, $1083 = 0, $1086 = 0, $1094 = 0, $1096 = 0, $11 = 0, $1100 = 0, $1101 = 0, $1103 = 0, $1110 = 0, $1112 = 0, $1120 = 0, $1121 = 0, $1122 = 0, $1123 = 0, $1126 = 0, $1129 = 0, $113 = 0, $1132 = 0, $1133 = 0, $1139 = 0, $1141 = 0, $1145 = 0, $115 = 0, $1151 = 0, $1152 = 0, $1153 = 0, $1159 = 0, $1161 = 0, $1164 = 0, $1165 = 0, $1166 = 0, $1168 = 0, $117 = 0, $1178 = 0, $1179 = 0, $1180 = 0, $1181 = 0, $1184 = 0, $1187 = 0, $119 = 0, $1190 = 0, $1191 = 0, $1196 = 0, $1197 = 0, $1198 = 0, $1199 = 0, $12 = 0, $120 = 0, $1201 = 0, $1202 = 0, $1203 = 0, $1205 = 0, $1210 = 0, $1217 = 0, $1219 = 0, $122 = 0, $1223 = 0, $1226 = 0, $1228 = 0, $123 = 0, $1233 = 0, $1237 = 0, $124 = 0, $1245 = 0, $1252 = 0, $1253 = 0, $1254 = 0, $1255 = 0, $1256 = 0, $1257 = 0, $126 = 0, $1269 = 0, $1270 = 0, $1271 = 0, $1274 = 0, $1277 = 0, $1283 = 0, $1289 = 0, $1290 = 0, $1291 = 0, $1297 = 0, $1299 = 0, $13 = 0, $1302 = 0, $1303 = 0, $1304 = 0, $1306 = 0, $1316 = 0, $1317 = 0, $1318 = 0, $1319 = 0, $1322 = 0, $1325 = 0, $1328 = 0, $1329 = 0, $1334 = 0, $1335 = 0, $1336 = 0, $1337 = 0, $1338 = 0, $1339 = 0, $134 = 0, $1340 = 0, $1342 = 0, $1343 = 0, $1344 = 0, $1346 = 0, $1351 = 0, $1358 = 0, $136 = 0, $1360 = 0, $1364 = 0, $1367 = 0, $1369 = 0, $1374 = 0, $1378 = 0, $1386 = 0, $1393 = 0, $1394 = 0, $1395 = 0, $1397 = 0, $14 = 0, $1402 = 0, $1409 = 0, $1411 = 0, $1415 = 0, $1418 = 0, $1420 = 0, $1425 = 0, $1426 = 0, $1427 = 0, $1428 = 0, $1432 = 0, $1436 = 0, $1439 = 0, $1443 = 0, $1444 = 0, $1446 = 0, $1449 = 0, $1455 = 0, $1458 = 0, $147 = 0, $1470 = 0, $1474 = 0, $1475 = 0, $1486 = 0, $1487 = 0, $1488 = 0, $1489 = 0, $149 = 0, $1490 = 0, $1491 = 0, $15 = 0, $1503 = 0, $1504 = 0, $1505 = 0, $1508 = 0, $1511 = 0, $1517 = 0, $1523 = 0, $1524 = 0, $1525 = 0, $1531 = 0, $1533 = 0, $1536 = 0, $1537 = 0, $1538 = 0, $1540 = 0, $1550 = 0, $1551 = 0, $1552 = 0, $1553 = 0, $1556 = 0, $1559 = 0, $1562 = 0, $1563 = 0, $1568 = 0, $1569 = 0, $1570 = 0, $1571 = 0, $1573 = 0, $1574 = 0, $1575 = 0, $1577 = 0, $1582 = 0, $1589 = 0, $1591 = 0, $1595 = 0, $1598 = 0, $16 = 0, $1600 = 0, $1605 = 0, $1609 = 0, $1617 = 0, $1624 = 0, $1625 = 0, $1626 = 0, $1627 = 0, $1628 = 0, $1629 = 0, $164 = 0, $1641 = 0, $1642 = 0, $1643 = 0, $1646 = 0, $1649 = 0, $165 = 0, $1655 = 0, $166 = 0, $1661 = 0, $1662 = 0, $1668 = 0, $167 = 0, $1670 = 0, $1671 = 0, $1673 = 0, $1674 = 0, $1675 = 0, $1676 = 0, $1677 = 0, $168 = 0, $1687 = 0, $1688 = 0, $1689 = 0, $169 = 0, $1690 = 0, $1693 = 0, $1696 = 0, $1699 = 0, $17 = 0, $1700 = 0, $1705 = 0, $1707 = 0, $1708 = 0, $1709 = 0, $1710 = 0, $1711 = 0, $1712 = 0, $1724 = 0, $1725 = 0, $1726 = 0, $1729 = 0, $1732 = 0, $1743 = 0, $1747 = 0, $1748 = 0, $1749 = 0, $1750 = 0, $1753 = 0, $1755 = 0, $1766 = 0, $1768 = 0, $1769 = 0, $1776 = 0, $1778 = 0, $1786 = 0, $1787 = 0, $1788 = 0, $1789 = 0, $1792 = 0, $1795 = 0, $1798 = 0, $1799 = 0, $18 = 0, $1805 = 0, $1807 = 0, $181 = 0, $1811 = 0, $1813 = 0, $1815 = 0, $1817 = 0, $1818 = 0, $182 = 0, $1826 = 0, $1827 = 0, $1828 = 0, $1829 = 0, $183 = 0, $1831 = 0, $1832 = 0, $1834 = 0, $1839 = 0, $1846 = 0, $1848 = 0, $1853 = 0, $1858 = 0, $186 = 0, $1860 = 0, $1866 = 0, $1869 = 0, $1871 = 0, $1881 = 0, $1884 = 0, $1885 = 0, $1886 = 0, $1887 = 0, $1889 = 0, $189 = 0, $1891 = 0, $1892 = 0, $1894 = 0, $1895 = 0, $1897 = 0, $19 = 0, $1903 = 0, $1912 = 0, $1915 = 0, $1917 = 0, $1927 = 0, $1930 = 0, $1933 = 0, $1935 = 0, $1942 = 0, $1945 = 0, $1947 = 0, $195 = 0, $1954 = 0, $1955 = 0, $1956 = 0, $1957 = 0, $1961 = 0, $1963 = 0, $1966 = 0, $1967 = 0, $197 = 0, $1970 = 0, $1973 = 0, $1974 = 0, $1975 = 0, $1977 = 0, $1984 = 0, $1986 = 0, $1994 = 0, $1995 = 0, $1996 = 0, $1997 = 0, $2 = 0, $20 = 0, $200 = 0, $2000 = 0, $2003 = 0, $2006 = 0, $2007 = 0, $2013 = 0, $2015 = 0, $2019 = 0, $202 = 0, $2023 = 0, $2027 = 0, $2029 = 0, $2033 = 0, $2034 = 0, $2036 = 0, $204 = 0, $2043 = 0, $2045 = 0, $205 = 0, $2053 = 0, $2054 = 0, $2055 = 0, $2056 = 0, $2059 = 0, $2062 = 0, $2065 = 0, $2066 = 0, $2072 = 0, $2074 = 0, $2078 = 0, $208 = 0, $2080 = 0, $2082 = 0, $2083 = 0, $209 = 0, $2091 = 0, $2092 = 0, $2093 = 0, $2094 = 0, $2097 = 0, $2099 = 0, $21 = 0, $211 = 0, $2110 = 0, $2113 = 0, $2114 = 0, $2115 = 0, $2117 = 0, $212 = 0, $2124 = 0, $2126 = 0, $2134 = 0, $2135 = 0, $2136 = 0, $2137 = 0, $214 = 0, $2140 = 0, $2143 = 0, $2146 = 0, $2147 = 0, $2153 = 0, $2155 = 0, $2159 = 0, $2161 = 0, $2163 = 0, $2169 = 0, $2170 = 0, $2171 = 0, $2177 = 0, $2179 = 0, $2182 = 0, $2183 = 0, $2184 = 0, $2186 = 0, $219 = 0, $2196 = 0, $2197 = 0, $2198 = 0, $2199 = 0, $22 = 0, $2202 = 0, $2205 = 0, $2208 = 0, $2209 = 0, $2214 = 0, $2216 = 0, $2217 = 0, $2218 = 0, $2219 = 0, $2220 = 0, $2221 = 0, $2233 = 0, $2234 = 0, $2235 = 0, $2238 = 0, $2241 = 0, $2247 = 0, $2251 = 0, $2253 = 0, $2257 = 0, $2258 = 0, $226 = 0, $2260 = 0, $2267 = 0, $2269 = 0, $2277 = 0, $2278 = 0, $2279 = 0, $228 = 0, $2280 = 0, $2283 = 0, $2286 = 0, $2289 = 0, $2290 = 0, $2296 = 0, $2298 = 0, $23 = 0, $2308 = 0, $2309 = 0, $2311 = 0, $2317 = 0, $2318 = 0, $2322 = 0, $2326 = 0, $2329 = 0, $233 = 0, $2332 = 0, $2335 = 0, $2337 = 0, $2347 = 0, $2348 = 0, $2351 = 0, $2354 = 0, $2355 = 0, $2357 = 0, $2364 = 0, $2365 = 0, $2366 = 0, $2367 = 0, $2371 = 0, $2373 = 0, $2376 = 0, $2377 = 0, $238 = 0, $2382 = 0, $2385 = 0, $2386 = 0, $2393 = 0, $2394 = 0, $2395 = 0, $2396 = 0, $2398 = 0, $24 = 0, $240 = 0, $2402 = 0, $2405 = 0, $2408 = 0, $2424 = 0, $2425 = 0, $2426 = 0, $2427 = 0, $2432 = 0, $2434 = 0, $2438 = 0, $2441 = 0, $2444 = 0, $2446 = 0, $2459 = 0, $2461 = 0, $2465 = 0, $2466 = 0, $2468 = 0, $2475 = 0, $2477 = 0, $2485 = 0, $2486 = 0, $2487 = 0, $2488 = 0, $2491 = 0, $2494 = 0, $2497 = 0, $2498 = 0, $25 = 0, $250 = 0, $2504 = 0, $2506 = 0, $2510 = 0, $2512 = 0, $2516 = 0, $2518 = 0, $2522 = 0, $2523 = 0, $2525 = 0, $2532 = 0, $2534 = 0, $254 = 0, $2542 = 0, $2543 = 0, $2544 = 0, $2545 = 0, $2548 = 0, $255 = 0, $2551 = 0, $2554 = 0, $2555 = 0, $2561 = 0, $2563 = 0, $2567 = 0, $2568 = 0, $2569 = 0, $2570 = 0, $2571 = 0, $2572 = 0, $2573 = 0, $258 = 0, $259 = 0, $26 = 0, $261 = 0, $262 = 0, $264 = 0, $269 = 0, $27 = 0, $276 = 0, $278 = 0, $28 = 0, $283 = 0, $288 = 0, $29 = 0, $290 = 0, $298 = 0, $3 = 0, $30 = 0, $301 = 0, $308 = 0, $309 = 0, $31 = 0, $318 = 0, $32 = 0, $321 = 0, $324 = 0, $326 = 0, $33 = 0, $336 = 0, $34 = 0, $341 = 0, $342 = 0, $344 = 0, $345 = 0, $35 = 0, $353 = 0, $354 = 0, $355 = 0, $356 = 0, $359 = 0, $36 = 0, $360 = 0, $365 = 0, $367 = 0, $37 = 0, $370 = 0, $374 = 0, $377 = 0, $38 = 0, $382 = 0, $383 = 0, $386 = 0, $387 = 0, $389 = 0, $39 = 0, $390 = 0, $399 = 0, $4 = 0, $40 = 0, $402 = 0, $407 = 0, $408 = 0, $41 = 0, $410 = 0, $411 = 0, $415 = 0, $416 = 0, $418 = 0, $42 = 0, $422 = 0, $424 = 0, $429 = 0, $43 = 0, $434 = 0, $436 = 0, $44 = 0, $441 = 0, $442 = 0, $443 = 0, $446 = 0, $449 = 0, $45 = 0, $451 = 0, $458 = 0, $46 = 0, $465 = 0, $467 = 0, $47 = 0, $470 = 0, $474 = 0, $477 = 0, $48 = 0, $482 = 0, $483 = 0, $486 = 0, $487 = 0, $489 = 0, $49 = 0, $490 = 0, $499 = 0, $5 = 0, $50 = 0, $502 = 0, $510 = 0, $512 = 0, $516 = 0, $517 = 0, $519 = 0, $526 = 0, $528 = 0, $536 = 0, $537 = 0, $538 = 0, $539 = 0, $54 = 0, $542 = 0, $545 = 0, $548 = 0, $549 = 0, $555 = 0, $557 = 0, $56 = 0, $561 = 0, $562 = 0, $565 = 0, $566 = 0, $569 = 0, $57 = 0, $571 = 0, $574 = 0, $575 = 0, $577 = 0, $584 = 0, $586 = 0, $594 = 0, $595 = 0, $596 = 0, $597 = 0, $6 = 0, $600 = 0, $603 = 0, $606 = 0, $607 = 0, $613 = 0, $615 = 0, $620 = 0, $624 = 0, $626 = 0, $628 = 0, $629 = 0, $63 = 0, $630 = 0, $631 = 0, $632 = 0, $635 = 0, $636 = 0, $637 = 0, $638 = 0, $64 = 0, $641 = 0, $644 = 0, $648 = 0, $657 = 0, $658 = 0, $664 = 0, $669 = 0, $679 = 0, $681 = 0, $690 = 0, $691 = 0, $692 = 0, $693 = 0, $698 = 0, $7 = 0, $70 = 0, $703 = 0, $705 = 0, $716 = 0, $718 = 0, $72 = 0, $722 = 0, $723 = 0, $725 = 0, $73 = 0, $732 = 0, $734 = 0, $74 = 0, $742 = 0, $743 = 0, $744 = 0, $745 = 0, $748 = 0, $75 = 0, $751 = 0, $754 = 0, $755 = 0, $76 = 0, $761 = 0, $763 = 0, $767 = 0, $768 = 0, $77 = 0, $771 = 0, $772 = 0, $775 = 0, $777 = 0, $780 = 0, $781 = 0, $783 = 0, $79 = 0, $790 = 0, $792 = 0, $8 = 0, $800 = 0, $801 = 0, $802 = 0, $803 = 0, $806 = 0, $809 = 0, $812 = 0, $813 = 0, $819 = 0, $82 = 0, $821 = 0, $826 = 0, $827 = 0, $829 = 0, $831 = 0, $832 = 0, $84 = 0, $840 = 0, $841 = 0, $842 = 0, $843 = 0, $846 = 0, $856 = 0, $857 = 0, $858 = 0, $86 = 0, $861 = 0, $863 = 0, $873 = 0, $876 = 0, $883 = 0, $885 = 0, $888 = 0, $892 = 0, $895 = 0, $9 = 0, $900 = 0, $901 = 0, $904 = 0, $905 = 0, $907 = 0, $908 = 0, $917 = 0, $920 = 0, $925 = 0, $926 = 0, $929 = 0, $934 = 0, $936 = 0, $939 = 0, $943 = 0, $946 = 0, $95 = 0, $951 = 0, $952 = 0, $955 = 0, $956 = 0, $958 = 0, $959 = 0, $96 = 0, $968 = 0, $97 = 0, $971 = 0, $976 = 0, $979 = 0, $98 = 0, $981 = 0, $991 = 0, $994 = 0, $__p$0$i$i$i508 = 0, $__p$0$ph$i$i$i = 0, $__v$i$i$i = 0, $args = 0, $cv = 0, $k$0$i515 = 0, $k$0560 = 0, $k11$0540 = 0, $k15$0543 = 0, $k2$0$i516 = 0, $k20$0550 = 0, $k5$0533 = 0, $k8$0536 = 0, $num1$i = 0, $p$0 = 0, $p$1 = 0, $p$2 = 0, $phitmp$i$i$i$i$i$i$i240 = 0, $phitmp$i2$i$i$i$i$i$i243 = 0, $proto = 0, $ref_qual$0$i$ph$ph = 0, $ref_qual$0$i$ph521 = 0, $ref_qual$0$i$ph521$lcssa = 0, $t$0$i = 0, $t$1$i$be = 0, $t$1$i$ph$ph = 0, $t$1$i$ph520 = 0, $t$1$i518 = 0, $t$1$i518$lcssa = 0, $t12$0$i = 0, $template_args = 0, $type = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 784 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $__v$i$i$i = sp + 752 | 0; + $0 = sp + 728 | 0; + $1 = sp + 716 | 0; + $2 = sp + 704 | 0; + $3 = sp + 680 | 0; + $4 = sp + 656 | 0; + $5 = sp + 632 | 0; + $6 = sp + 620 | 0; + $num1$i = sp + 608 | 0; + $7 = sp + 596 | 0; + $8 = sp + 584 | 0; + $9 = sp + 572 | 0; + $cv = sp + 568 | 0; + $10 = sp + 552 | 0; + $11 = sp + 544 | 0; + $12 = sp + 528 | 0; + $13 = sp + 520 | 0; + $14 = sp + 504 | 0; + $15 = sp + 496 | 0; + $16 = sp + 480 | 0; + $17 = sp + 472 | 0; + $18 = sp + 456 | 0; + $19 = sp + 452 | 0; + $20 = sp + 440 | 0; + $21 = sp + 428 | 0; + $22 = sp + 416 | 0; + $23 = sp + 404 | 0; + $args = sp + 392 | 0; + $24 = sp + 376 | 0; + $25 = sp + 368 | 0; + $type = sp + 356 | 0; + $26 = sp + 344 | 0; + $27 = sp + 320 | 0; + $28 = sp + 308 | 0; + $29 = sp + 296 | 0; + $30 = sp + 284 | 0; + $proto = sp + 272 | 0; + $31 = sp + 248 | 0; + $32 = sp + 236 | 0; + $33 = sp + 224 | 0; + $34 = sp + 212 | 0; + $35 = sp + 200 | 0; + $36 = sp + 176 | 0; + $37 = sp + 164 | 0; + $38 = sp + 152 | 0; + $39 = sp + 136 | 0; + $40 = sp + 128 | 0; + $41 = sp + 112 | 0; + $42 = sp + 108 | 0; + $template_args = sp + 96 | 0; + $43 = sp + 80 | 0; + $44 = sp + 72 | 0; + $45 = sp + 56 | 0; + $46 = sp + 48 | 0; + $47 = sp + 32 | 0; + $48 = sp + 24 | 0; + $49 = sp + 8 | 0; + $50 = sp; + L1 : do if (($first | 0) == ($last | 0)) $$0 = $first; else { + switch (HEAP8[$first >> 0] | 0) { + case 75: + case 86: + case 114: + { + HEAP32[$cv >> 2] = 0; + $54 = __ZN10__cxxabiv112_GLOBAL__N_119parse_cv_qualifiersEPKcS2_Rj($first, $last, $cv) | 0; + if (($54 | 0) == ($first | 0)) { + $$0 = $first; + break L1; + } + $56 = HEAP8[$54 >> 0] | 0; + $57 = $db + 4 | 0; + $63 = ((HEAP32[$57 >> 2] | 0) - (HEAP32[$db >> 2] | 0) | 0) / 24 | 0; + $64 = __ZN10__cxxabiv112_GLOBAL__N_110parse_typeINS0_2DbEEEPKcS4_S4_RT_($54, $last, $db) | 0; + $70 = ((HEAP32[$57 >> 2] | 0) - (HEAP32[$db >> 2] | 0) | 0) / 24 | 0; + if (($64 | 0) == ($54 | 0)) { + $$0 = $first; + break L1; + } + $72 = $56 << 24 >> 24 == 70; + $73 = $db + 20 | 0; + $74 = HEAP32[$73 >> 2] | 0; + if ($72) { + $75 = $74 + -16 | 0; + $77 = $74; + do { + $76 = $77 + -16 | 0; + HEAP32[$73 >> 2] = $76; + __ZNSt3__113__vector_baseIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEED2Ev($76); + $77 = HEAP32[$73 >> 2] | 0; + } while (($77 | 0) != ($75 | 0)); + $86 = $75; + } else $86 = $74; + $79 = $db + 16 | 0; + $82 = HEAP32[$db + 12 >> 2] | 0; + $84 = HEAP32[$db + 24 >> 2] | 0; + if ($86 >>> 0 < $84 >>> 0) { + HEAP32[$86 >> 2] = 0; + HEAP32[$86 + 4 >> 2] = 0; + HEAP32[$86 + 8 >> 2] = 0; + HEAP32[$86 + 12 >> 2] = $82; + HEAP32[$73 >> 2] = (HEAP32[$73 >> 2] | 0) + 16; + } else { + $95 = HEAP32[$79 >> 2] | 0; + $96 = $86 - $95 | 0; + $97 = $96 >> 4; + $98 = $97 + 1 | 0; + if (($96 | 0) < -16) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($79); + $101 = $84 - $95 | 0; + if ($101 >> 4 >>> 0 < 1073741823) { + $104 = $101 >> 3; + $$0$i$i$i38 = $104 >>> 0 < $98 >>> 0 ? $98 : $104; + } else $$0$i$i$i38 = 2147483647; + __ZNSt3__114__split_bufferINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEERNS5_IS7_Lj4096EEEEC2EjjS9_($__v$i$i$i, $$0$i$i$i38, $97, $db + 28 | 0); + $107 = $__v$i$i$i + 8 | 0; + $108 = HEAP32[$107 >> 2] | 0; + HEAP32[$108 >> 2] = 0; + HEAP32[$108 + 4 >> 2] = 0; + HEAP32[$108 + 8 >> 2] = 0; + HEAP32[$108 + 12 >> 2] = $82; + HEAP32[$107 >> 2] = $108 + 16; + __ZNSt3__16vectorINS0_IN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEEENS4_IS6_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS6_RS7_EE($79, $__v$i$i$i); + __ZNSt3__114__split_bufferINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEERNS5_IS7_Lj4096EEEED2Ev($__v$i$i$i); + } + $113 = HEAP32[$cv >> 2] | 0; + $115 = ($113 & 1 | 0) == 0; + $117 = ($113 & 2 | 0) == 0; + $119 = ($113 & 4 | 0) == 0; + $120 = $__v$i$i$i + 8 | 0; + if ($63 >>> 0 < $70 >>> 0) $k$0560 = $63; else { + $$0 = $64; + break L1; + } + while (1) { + if ($72) { + $122 = HEAP32[$db >> 2] | 0; + $123 = $122 + ($k$0560 * 24 | 0) + 12 | 0; + $124 = HEAP8[$123 >> 0] | 0; + $126 = ($124 & 1) == 0; + if ($126) { + $$in = ($124 & 255) >>> 1; + $136 = $123 + 1 | 0; + } else { + $$in = HEAP32[$122 + ($k$0560 * 24 | 0) + 16 >> 2] | 0; + $136 = HEAP32[$122 + ($k$0560 * 24 | 0) + 20 >> 2] | 0; + } + $134 = $$in + -2 | 0; + if ((HEAP8[$136 + $134 >> 0] | 0) == 38) $p$0 = $$in + -3 | 0; else { + if ($126) { + $147 = ($124 & 255) >>> 1; + $149 = $123 + 1 | 0; + } else { + $147 = HEAP32[$122 + ($k$0560 * 24 | 0) + 16 >> 2] | 0; + $149 = HEAP32[$122 + ($k$0560 * 24 | 0) + 20 >> 2] | 0; + } + $p$0 = (HEAP8[$149 + ($147 + -1) >> 0] | 0) == 38 ? $134 : $$in; + } + if ($115) $p$1 = $p$0; else { + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc($123, $p$0, 12669) | 0; + $p$1 = $p$0 + 6 | 0; + } + if ($117) $p$2 = $p$1; else { + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc((HEAP32[$db >> 2] | 0) + ($k$0560 * 24 | 0) + 12 | 0, $p$1, 12676) | 0; + $p$2 = $p$1 + 9 | 0; + } + if (!$119) __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc((HEAP32[$db >> 2] | 0) + ($k$0560 * 24 | 0) + 12 | 0, $p$2, 12686) | 0; + } else { + if (!$115) __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc((HEAP32[$db >> 2] | 0) + ($k$0560 * 24 | 0) | 0, 12669) | 0; + if (!$117) __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc((HEAP32[$db >> 2] | 0) + ($k$0560 * 24 | 0) | 0, 12676) | 0; + if (!$119) __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc((HEAP32[$db >> 2] | 0) + ($k$0560 * 24 | 0) | 0, 12686) | 0; + } + $164 = HEAP32[$73 >> 2] | 0; + $165 = $164 + -16 | 0; + $166 = HEAP32[$db >> 2] | 0; + $167 = $166 + ($k$0560 * 24 | 0) | 0; + $168 = $164 + -12 | 0; + $169 = HEAP32[$168 >> 2] | 0; + if (($169 | 0) == (HEAP32[$164 + -8 >> 2] | 0)) { + $181 = $169 - (HEAP32[$165 >> 2] | 0) | 0; + $182 = ($181 | 0) / 24 | 0; + $183 = $182 + 1 | 0; + if (($181 | 0) < -24) { + $$lcssa706 = $165; + break; + } + if ($182 >>> 0 < 1073741823) { + $186 = $182 << 1; + $$0$i$i$i43 = $186 >>> 0 < $183 >>> 0 ? $183 : $186; + } else $$0$i$i$i43 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i$i, $$0$i$i$i43, $182, $164 + -4 | 0); + $189 = HEAP32[$120 >> 2] | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEC2ERKS7_($189, $167); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEC2ERKS7_($189 + 12 | 0, $166 + ($k$0560 * 24 | 0) + 12 | 0); + HEAP32[$120 >> 2] = $189 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($165, $__v$i$i$i); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i$i); + } else { + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEC2ERKS7_($169, $167); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEC2ERKS7_($169 + 12 | 0, $166 + ($k$0560 * 24 | 0) + 12 | 0); + HEAP32[$168 >> 2] = (HEAP32[$168 >> 2] | 0) + 24; + } + $k$0560 = $k$0560 + 1 | 0; + if ($k$0560 >>> 0 >= $70 >>> 0) { + $$0 = $64; + break L1; + } + } + __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($$lcssa706); + break; + } + default: + {} + } + $195 = __ZN10__cxxabiv112_GLOBAL__N_118parse_builtin_typeINS0_2DbEEEPKcS4_S4_RT_($first, $last, $db) | 0; + if (($195 | 0) == ($first | 0)) { + $197 = HEAP8[$first >> 0] | 0; + L65 : do switch ($197 << 24 >> 24 | 0) { + case 65: + { + do if ($197 << 24 >> 24 == 65) { + $200 = $first + 1 | 0; + if (($200 | 0) == ($last | 0)) $$0$i = $first; else { + $202 = HEAP8[$200 >> 0] | 0; + if ($202 << 24 >> 24 == 95) { + $204 = $first + 2 | 0; + $205 = __ZN10__cxxabiv112_GLOBAL__N_110parse_typeINS0_2DbEEEPKcS4_S4_RT_($204, $last, $db) | 0; + if (($205 | 0) == ($204 | 0)) { + $$0$i = $first; + break; + } + $208 = $db + 4 | 0; + $209 = HEAP32[$208 >> 2] | 0; + if ((HEAP32[$db >> 2] | 0) == ($209 | 0)) { + $$0$i = $first; + break; + } + $211 = $209 + -12 | 0; + $212 = HEAP8[$211 >> 0] | 0; + $214 = ($212 & 1) == 0; + $219 = $214 ? ($212 & 255) >>> 1 : HEAP32[$209 + -8 >> 2] | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($__v$i$i$i, $214 ? $211 + 1 | 0 : HEAP32[$209 + -4 >> 2] | 0, $219 >>> 0 < 2 ? $219 : 2); + $226 = HEAP8[$__v$i$i$i >> 0] | 0; + $228 = ($226 & 1) == 0; + $233 = $228 ? ($226 & 255) >>> 1 : HEAP32[$__v$i$i$i + 4 >> 2] | 0; + $238 = $233 >>> 0 > 2; + $240 = _memcmp($228 ? $__v$i$i$i + 1 | 0 : HEAP32[$__v$i$i$i + 8 >> 2] | 0, 12696, $238 ? 2 : $233) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($__v$i$i$i); + if (!((($240 | 0) == 0 ? ($233 >>> 0 < 2 ? -1 : $238 & 1) : $240) | 0)) __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE5eraseEjj((HEAP32[$208 >> 2] | 0) + -12 | 0); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc((HEAP32[$208 >> 2] | 0) + -12 | 0, 0, 12699) | 0; + $$0$i = $205; + break; + } + if (($202 + -49 & 255) < 9) { + $250 = __ZN10__cxxabiv112_GLOBAL__N_112parse_numberEPKcS2_($200, $last) | 0; + if (($250 | 0) == ($last | 0)) { + $$0$i = $first; + break; + } + if ((HEAP8[$250 >> 0] | 0) != 95) { + $$0$i = $first; + break; + } + $254 = $250 + 1 | 0; + $255 = __ZN10__cxxabiv112_GLOBAL__N_110parse_typeINS0_2DbEEEPKcS4_S4_RT_($254, $last, $db) | 0; + if (($255 | 0) == ($254 | 0)) { + $$0$i = $first; + break; + } + $258 = $db + 4 | 0; + $259 = HEAP32[$258 >> 2] | 0; + if ((HEAP32[$db >> 2] | 0) == ($259 | 0)) { + $$0$i = $first; + break; + } + $261 = $259 + -12 | 0; + $262 = HEAP8[$261 >> 0] | 0; + $264 = ($262 & 1) == 0; + $269 = $264 ? ($262 & 255) >>> 1 : HEAP32[$259 + -8 >> 2] | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($0, $264 ? $261 + 1 | 0 : HEAP32[$259 + -4 >> 2] | 0, $269 >>> 0 < 2 ? $269 : 2); + $276 = HEAP8[$0 >> 0] | 0; + $278 = ($276 & 1) == 0; + $283 = $278 ? ($276 & 255) >>> 1 : HEAP32[$0 + 4 >> 2] | 0; + $288 = $283 >>> 0 > 2; + $290 = _memcmp($278 ? $0 + 1 | 0 : HEAP32[$0 + 8 >> 2] | 0, 12696, $288 ? 2 : $283) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($0); + if (!((($290 | 0) == 0 ? ($283 >>> 0 < 2 ? -1 : $288 & 1) : $290) | 0)) __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE5eraseEjj((HEAP32[$258 >> 2] | 0) + -12 | 0); + $298 = (HEAP32[$258 >> 2] | 0) + -12 | 0; + $301 = $250 - $200 | 0; + if ($301 >>> 0 > 4294967279) __ZNKSt3__121__basic_string_commonILb1EE20__throw_length_errorEv($3); + if ($301 >>> 0 < 11) { + HEAP8[$3 >> 0] = $301 << 1; + $__p$0$ph$i$i$i = $3 + 1 | 0; + } else { + $308 = $301 + 16 & -16; + $309 = _malloc($308) | 0; + HEAP32[$3 + 8 >> 2] = $309; + HEAP32[$3 >> 2] = $308 | 1; + HEAP32[$3 + 4 >> 2] = $301; + $__p$0$ph$i$i$i = $309; + } + if (($200 | 0) != ($250 | 0)) { + $$0$i$i$i191509 = $200; + $__p$0$i$i$i508 = $__p$0$ph$i$i$i; + while (1) { + HEAP8[$__p$0$i$i$i508 >> 0] = HEAP8[$$0$i$i$i191509 >> 0] | 0; + $$0$i$i$i191509 = $$0$i$i$i191509 + 1 | 0; + if (($$0$i$i$i191509 | 0) == ($250 | 0)) break; else $__p$0$i$i$i508 = $__p$0$i$i$i508 + 1 | 0; + } + } + HEAP8[$__p$0$ph$i$i$i + $301 >> 0] = 0; + $318 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc($3, 0, 12696) | 0; + HEAP32[$2 >> 2] = HEAP32[$318 >> 2]; + HEAP32[$2 + 4 >> 2] = HEAP32[$318 + 4 >> 2]; + HEAP32[$2 + 8 >> 2] = HEAP32[$318 + 8 >> 2]; + HEAP32[$318 >> 2] = 0; + HEAP32[$318 + 4 >> 2] = 0; + HEAP32[$318 + 8 >> 2] = 0; + $321 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($2, 12703) | 0; + HEAP32[$1 >> 2] = HEAP32[$321 >> 2]; + HEAP32[$1 + 4 >> 2] = HEAP32[$321 + 4 >> 2]; + HEAP32[$1 + 8 >> 2] = HEAP32[$321 + 8 >> 2]; + HEAP32[$321 >> 2] = 0; + HEAP32[$321 + 4 >> 2] = 0; + HEAP32[$321 + 8 >> 2] = 0; + $324 = HEAP8[$1 >> 0] | 0; + $326 = ($324 & 1) == 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKcj($298, 0, $326 ? $1 + 1 | 0 : HEAP32[$1 + 8 >> 2] | 0, $326 ? ($324 & 255) >>> 1 : HEAP32[$1 + 4 >> 2] | 0) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($1); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($2); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($3); + $$0$i = $255; + break; + } + $336 = __ZN10__cxxabiv112_GLOBAL__N_116parse_expressionINS0_2DbEEEPKcS4_S4_RT_($200, $last, $db) | 0; + if (($336 | 0) == ($200 | 0) | ($336 | 0) == ($last | 0)) $$0$i = $first; else if ((HEAP8[$336 >> 0] | 0) == 95) { + $341 = $336 + 1 | 0; + $342 = __ZN10__cxxabiv112_GLOBAL__N_110parse_typeINS0_2DbEEEPKcS4_S4_RT_($341, $last, $db) | 0; + if (($342 | 0) == ($341 | 0)) $$0$i = $first; else { + $344 = $db + 4 | 0; + $345 = HEAP32[$344 >> 2] | 0; + if ((($345 - (HEAP32[$db >> 2] | 0) | 0) / 24 | 0) >>> 0 < 2) $$0$i = $first; else { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($4, $345 + -24 | 0); + $353 = HEAP32[$344 >> 2] | 0; + $354 = $353 + -24 | 0; + $356 = $353; + do { + $355 = $356 + -24 | 0; + HEAP32[$344 >> 2] = $355; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($355); + $356 = HEAP32[$344 >> 2] | 0; + } while (($356 | 0) != ($354 | 0)); + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($5, $353 + -48 | 0); + $359 = HEAP32[$344 >> 2] | 0; + $360 = $359 + -24 | 0; + do if (!(HEAP8[$360 >> 0] & 1)) { + HEAP8[$360 + 1 >> 0] = 0; + HEAP8[$360 >> 0] = 0; + } else { + $365 = $359 + -16 | 0; + HEAP8[HEAP32[$365 >> 2] >> 0] = 0; + $367 = $359 + -20 | 0; + HEAP32[$367 >> 2] = 0; + $$pre$i$i$i$i203 = HEAP8[$360 >> 0] | 0; + if (!($$pre$i$i$i$i203 & 1)) { + $374 = $$pre$i$i$i$i203; + $383 = 10; + } else { + $370 = HEAP32[$360 >> 2] | 0; + $374 = $370 & 255; + $383 = ($370 & -2) + -1 | 0; + } + if (!($374 & 1)) { + $377 = ($374 & 255) >>> 1; + if (($374 & 255) < 22) { + $2567 = 1; + $382 = 10; + $402 = $377; + } else { + $2567 = 1; + $382 = ($377 + 16 & 240) + -1 | 0; + $402 = $377; + } + } else { + $2567 = 0; + $382 = 10; + $402 = 0; + } + if (($382 | 0) != ($383 | 0)) { + if (($382 | 0) == 10) { + $389 = $360 + 1 | 0; + $390 = HEAP32[$365 >> 2] | 0; + if ($2567) { + _memcpy($389 | 0, $390 | 0, (($374 & 255) >>> 1) + 1 | 0) | 0; + _free($390); + } else { + HEAP8[$389 >> 0] = HEAP8[$390 >> 0] | 0; + _free($390); + } + HEAP8[$360 >> 0] = $402 << 1; + break; + } + $386 = $382 + 1 | 0; + $387 = _malloc($386) | 0; + if (!($382 >>> 0 <= $383 >>> 0 & ($387 | 0) == 0)) { + if ($2567) _memcpy($387 | 0, $360 + 1 | 0, (($374 & 255) >>> 1) + 1 | 0) | 0; else { + $399 = HEAP32[$365 >> 2] | 0; + HEAP8[$387 >> 0] = HEAP8[$399 >> 0] | 0; + _free($399); + } + HEAP32[$360 >> 2] = $386 | 1; + HEAP32[$367 >> 2] = $402; + HEAP32[$365 >> 2] = $387; + } + } + } while (0); + HEAP32[$360 >> 2] = HEAP32[$4 >> 2]; + HEAP32[$360 + 4 >> 2] = HEAP32[$4 + 4 >> 2]; + HEAP32[$360 + 8 >> 2] = HEAP32[$4 + 8 >> 2]; + HEAP32[$4 >> 2] = 0; + HEAP32[$4 + 4 >> 2] = 0; + HEAP32[$4 + 8 >> 2] = 0; + $407 = $4 + 12 | 0; + $408 = HEAP8[$407 >> 0] | 0; + $410 = ($408 & 1) == 0; + $411 = $4 + 16 | 0; + $415 = $410 ? ($408 & 255) >>> 1 : HEAP32[$411 >> 2] | 0; + $416 = $4 + 20 | 0; + $418 = $407 + 1 | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($6, $410 ? $418 : HEAP32[$416 >> 2] | 0, $415 >>> 0 < 2 ? $415 : 2); + $422 = HEAP8[$6 >> 0] | 0; + $424 = ($422 & 1) == 0; + $429 = $424 ? ($422 & 255) >>> 1 : HEAP32[$6 + 4 >> 2] | 0; + $434 = $429 >>> 0 > 2; + $436 = _memcmp($424 ? $6 + 1 | 0 : HEAP32[$6 + 8 >> 2] | 0, 12696, $434 ? 2 : $429) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($6); + if (!((($436 | 0) == 0 ? ($429 >>> 0 < 2 ? -1 : $434 & 1) : $436) | 0)) __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE5eraseEjj($407); + $441 = HEAP32[$344 >> 2] | 0; + $442 = $441 + -12 | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($9, $5); + $443 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc($9, 0, 12696) | 0; + HEAP32[$8 >> 2] = HEAP32[$443 >> 2]; + HEAP32[$8 + 4 >> 2] = HEAP32[$443 + 4 >> 2]; + HEAP32[$8 + 8 >> 2] = HEAP32[$443 + 8 >> 2]; + HEAP32[$443 >> 2] = 0; + HEAP32[$443 + 4 >> 2] = 0; + HEAP32[$443 + 8 >> 2] = 0; + $446 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($8, 12703) | 0; + HEAP32[$7 >> 2] = HEAP32[$446 >> 2]; + HEAP32[$7 + 4 >> 2] = HEAP32[$446 + 4 >> 2]; + HEAP32[$7 + 8 >> 2] = HEAP32[$446 + 8 >> 2]; + HEAP32[$446 >> 2] = 0; + HEAP32[$446 + 4 >> 2] = 0; + HEAP32[$446 + 8 >> 2] = 0; + $449 = HEAP8[$407 >> 0] | 0; + $451 = ($449 & 1) == 0; + $458 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($7, $451 ? $418 : HEAP32[$416 >> 2] | 0, $451 ? ($449 & 255) >>> 1 : HEAP32[$411 >> 2] | 0) | 0; + HEAP32[$num1$i >> 2] = HEAP32[$458 >> 2]; + HEAP32[$num1$i + 4 >> 2] = HEAP32[$458 + 4 >> 2]; + HEAP32[$num1$i + 8 >> 2] = HEAP32[$458 + 8 >> 2]; + HEAP32[$458 >> 2] = 0; + HEAP32[$458 + 4 >> 2] = 0; + HEAP32[$458 + 8 >> 2] = 0; + do if (!(HEAP8[$442 >> 0] & 1)) { + HEAP8[$442 + 1 >> 0] = 0; + HEAP8[$442 >> 0] = 0; + } else { + $465 = $441 + -4 | 0; + HEAP8[HEAP32[$465 >> 2] >> 0] = 0; + $467 = $441 + -8 | 0; + HEAP32[$467 >> 2] = 0; + $$pre$i$i$i36$i = HEAP8[$442 >> 0] | 0; + if (!($$pre$i$i$i36$i & 1)) { + $474 = $$pre$i$i$i36$i; + $483 = 10; + } else { + $470 = HEAP32[$442 >> 2] | 0; + $474 = $470 & 255; + $483 = ($470 & -2) + -1 | 0; + } + do if (!($474 & 1)) { + $477 = ($474 & 255) >>> 1; + if (($474 & 255) < 22) { + $2568 = 1; + $482 = 10; + $502 = $477; + break; + } + $2568 = 1; + $482 = ($477 + 16 & 240) + -1 | 0; + $502 = $477; + } else { + $2568 = 0; + $482 = 10; + $502 = 0; + } while (0); + if (($482 | 0) != ($483 | 0)) { + if (($482 | 0) == 10) { + $489 = $442 + 1 | 0; + $490 = HEAP32[$465 >> 2] | 0; + if ($2568) { + _memcpy($489 | 0, $490 | 0, (($474 & 255) >>> 1) + 1 | 0) | 0; + _free($490); + } else { + HEAP8[$489 >> 0] = HEAP8[$490 >> 0] | 0; + _free($490); + } + HEAP8[$442 >> 0] = $502 << 1; + break; + } + $486 = $482 + 1 | 0; + $487 = _malloc($486) | 0; + if ($482 >>> 0 <= $483 >>> 0 & ($487 | 0) == 0) break; + if ($2568) _memcpy($487 | 0, $442 + 1 | 0, (($474 & 255) >>> 1) + 1 | 0) | 0; else { + $499 = HEAP32[$465 >> 2] | 0; + HEAP8[$487 >> 0] = HEAP8[$499 >> 0] | 0; + _free($499); + } + HEAP32[$442 >> 2] = $486 | 1; + HEAP32[$467 >> 2] = $502; + HEAP32[$465 >> 2] = $487; + } + } while (0); + HEAP32[$442 >> 2] = HEAP32[$num1$i >> 2]; + HEAP32[$442 + 4 >> 2] = HEAP32[$num1$i + 4 >> 2]; + HEAP32[$442 + 8 >> 2] = HEAP32[$num1$i + 8 >> 2]; + HEAP32[$num1$i >> 2] = 0; + HEAP32[$num1$i + 4 >> 2] = 0; + HEAP32[$num1$i + 8 >> 2] = 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($num1$i); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($7); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($8); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($9); + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($5); + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($4); + $$0$i = $342; + } + } + } else $$0$i = $first; + } + } else $$0$i = $first; while (0); + if (($$0$i | 0) == ($first | 0)) { + $$0 = $first; + break L1; + } + $510 = HEAP32[$db + 4 >> 2] | 0; + if ((HEAP32[$db >> 2] | 0) == ($510 | 0)) { + $$0 = $first; + break L1; + } + $512 = $db + 16 | 0; + HEAP32[$11 >> 2] = HEAP32[$db + 12 >> 2]; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEEC2EjRKS3_RKS5_($10, $510 + -24 | 0, $11); + $516 = $db + 20 | 0; + $517 = HEAP32[$516 >> 2] | 0; + $519 = HEAP32[$db + 24 >> 2] | 0; + if ($517 >>> 0 < $519 >>> 0) { + HEAP32[$517 + 12 >> 2] = HEAP32[$10 + 12 >> 2]; + HEAP32[$517 >> 2] = HEAP32[$10 >> 2]; + $526 = $10 + 4 | 0; + HEAP32[$517 + 4 >> 2] = HEAP32[$526 >> 2]; + $528 = $10 + 8 | 0; + HEAP32[$517 + 8 >> 2] = HEAP32[$528 >> 2]; + HEAP32[$528 >> 2] = 0; + HEAP32[$526 >> 2] = 0; + HEAP32[$10 >> 2] = 0; + HEAP32[$516 >> 2] = (HEAP32[$516 >> 2] | 0) + 16; + } else { + $536 = HEAP32[$512 >> 2] | 0; + $537 = $517 - $536 | 0; + $538 = $537 >> 4; + $539 = $538 + 1 | 0; + if (($537 | 0) < -16) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($512); + $542 = $519 - $536 | 0; + if ($542 >> 4 >>> 0 < 1073741823) { + $545 = $542 >> 3; + $$0$i$i$i56 = $545 >>> 0 < $539 >>> 0 ? $539 : $545; + } else $$0$i$i$i56 = 2147483647; + __ZNSt3__114__split_bufferINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEERNS5_IS7_Lj4096EEEEC2EjjS9_($__v$i$i$i, $$0$i$i$i56, $538, $db + 28 | 0); + $548 = $__v$i$i$i + 8 | 0; + $549 = HEAP32[$548 >> 2] | 0; + HEAP32[$549 + 12 >> 2] = HEAP32[$10 + 12 >> 2]; + HEAP32[$549 >> 2] = HEAP32[$10 >> 2]; + $555 = $10 + 4 | 0; + HEAP32[$549 + 4 >> 2] = HEAP32[$555 >> 2]; + $557 = $10 + 8 | 0; + HEAP32[$549 + 8 >> 2] = HEAP32[$557 >> 2]; + HEAP32[$557 >> 2] = 0; + HEAP32[$555 >> 2] = 0; + HEAP32[$10 >> 2] = 0; + HEAP32[$548 >> 2] = $549 + 16; + __ZNSt3__16vectorINS0_IN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEEENS4_IS6_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS6_RS7_EE($512, $__v$i$i$i); + __ZNSt3__114__split_bufferINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEERNS5_IS7_Lj4096EEEED2Ev($__v$i$i$i); + } + __ZNSt3__113__vector_baseIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEED2Ev($10); + $$0 = $$0$i; + break L1; + break; + } + case 67: + { + $561 = $first + 1 | 0; + $562 = __ZN10__cxxabiv112_GLOBAL__N_110parse_typeINS0_2DbEEEPKcS4_S4_RT_($561, $last, $db) | 0; + if (($562 | 0) == ($561 | 0)) { + $$0 = $first; + break L1; + } + $565 = $db + 4 | 0; + $566 = HEAP32[$565 >> 2] | 0; + if ((HEAP32[$db >> 2] | 0) == ($566 | 0)) { + $$0 = $first; + break L1; + } + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($566 + -24 | 0, 12705) | 0; + $569 = $db + 16 | 0; + $571 = (HEAP32[$565 >> 2] | 0) + -24 | 0; + HEAP32[$13 >> 2] = HEAP32[$db + 12 >> 2]; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEEC2EjRKS3_RKS5_($12, $571, $13); + $574 = $db + 20 | 0; + $575 = HEAP32[$574 >> 2] | 0; + $577 = HEAP32[$db + 24 >> 2] | 0; + if ($575 >>> 0 < $577 >>> 0) { + HEAP32[$575 + 12 >> 2] = HEAP32[$12 + 12 >> 2]; + HEAP32[$575 >> 2] = HEAP32[$12 >> 2]; + $584 = $12 + 4 | 0; + HEAP32[$575 + 4 >> 2] = HEAP32[$584 >> 2]; + $586 = $12 + 8 | 0; + HEAP32[$575 + 8 >> 2] = HEAP32[$586 >> 2]; + HEAP32[$586 >> 2] = 0; + HEAP32[$584 >> 2] = 0; + HEAP32[$12 >> 2] = 0; + HEAP32[$574 >> 2] = (HEAP32[$574 >> 2] | 0) + 16; + } else { + $594 = HEAP32[$569 >> 2] | 0; + $595 = $575 - $594 | 0; + $596 = $595 >> 4; + $597 = $596 + 1 | 0; + if (($595 | 0) < -16) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($569); + $600 = $577 - $594 | 0; + if ($600 >> 4 >>> 0 < 1073741823) { + $603 = $600 >> 3; + $$0$i$i$i61 = $603 >>> 0 < $597 >>> 0 ? $597 : $603; + } else $$0$i$i$i61 = 2147483647; + __ZNSt3__114__split_bufferINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEERNS5_IS7_Lj4096EEEEC2EjjS9_($__v$i$i$i, $$0$i$i$i61, $596, $db + 28 | 0); + $606 = $__v$i$i$i + 8 | 0; + $607 = HEAP32[$606 >> 2] | 0; + HEAP32[$607 + 12 >> 2] = HEAP32[$12 + 12 >> 2]; + HEAP32[$607 >> 2] = HEAP32[$12 >> 2]; + $613 = $12 + 4 | 0; + HEAP32[$607 + 4 >> 2] = HEAP32[$613 >> 2]; + $615 = $12 + 8 | 0; + HEAP32[$607 + 8 >> 2] = HEAP32[$615 >> 2]; + HEAP32[$615 >> 2] = 0; + HEAP32[$613 >> 2] = 0; + HEAP32[$12 >> 2] = 0; + HEAP32[$606 >> 2] = $607 + 16; + __ZNSt3__16vectorINS0_IN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEEENS4_IS6_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS6_RS7_EE($569, $__v$i$i$i); + __ZNSt3__114__split_bufferINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEERNS5_IS7_Lj4096EEEED2Ev($__v$i$i$i); + } + __ZNSt3__113__vector_baseIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEED2Ev($12); + $$0 = $562; + break L1; + break; + } + case 70: + { + do if ($197 << 24 >> 24 == 70) { + $620 = $first + 1 | 0; + if (($620 | 0) != ($last | 0)) { + if ((HEAP8[$620 >> 0] | 0) == 89) { + $624 = $first + 2 | 0; + if (($624 | 0) == ($last | 0)) break; else $t$0$i = $624; + } else $t$0$i = $620; + $626 = __ZN10__cxxabiv112_GLOBAL__N_110parse_typeINS0_2DbEEEPKcS4_S4_RT_($t$0$i, $last, $db) | 0; + if (($626 | 0) != ($t$0$i | 0)) { + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($__v$i$i$i, 12714, 1); + $628 = $db + 4 | 0; + $629 = $__v$i$i$i + 4 | 0; + $630 = $0 + 8 | 0; + $631 = $0 + 1 | 0; + $632 = $0 + 4 | 0; + L191 : do if (($626 | 0) == ($last | 0)) label = 144; else { + $ref_qual$0$i$ph521 = 0; + $t$1$i$ph520 = $626; + L192 : while (1) { + $t$1$i518 = $t$1$i$ph520; + L194 : while (1) { + switch (HEAP8[$t$1$i518 >> 0] | 0) { + case 69: + { + $ref_qual$0$i$ph521$lcssa = $ref_qual$0$i$ph521; + $t$1$i518$lcssa = $t$1$i518; + break L192; + break; + } + case 118: + { + $t$1$i$be = $t$1$i518 + 1 | 0; + break; + } + case 82: + { + $644 = $t$1$i518 + 1 | 0; + if (($644 | 0) == ($last | 0)) label = 154; else if ((HEAP8[$644 >> 0] | 0) == 69) { + $ref_qual$0$i$ph$ph = 1; + $t$1$i$ph$ph = $644; + break L194; + } else label = 154; + break; + } + case 79: + { + $648 = $t$1$i518 + 1 | 0; + if (($648 | 0) == ($last | 0)) label = 154; else if ((HEAP8[$648 >> 0] | 0) == 69) { + $ref_qual$0$i$ph$ph = 2; + $t$1$i$ph$ph = $648; + break L194; + } else label = 154; + break; + } + default: + label = 154; + } + if ((label | 0) == 154) { + label = 0; + $657 = ((HEAP32[$628 >> 2] | 0) - (HEAP32[$db >> 2] | 0) | 0) / 24 | 0; + $658 = __ZN10__cxxabiv112_GLOBAL__N_110parse_typeINS0_2DbEEEPKcS4_S4_RT_($t$1$i518, $last, $db) | 0; + $664 = ((HEAP32[$628 >> 2] | 0) - (HEAP32[$db >> 2] | 0) | 0) / 24 | 0; + if (($658 | 0) == ($t$1$i518 | 0) | ($658 | 0) == ($last | 0)) break L191; + if ($657 >>> 0 < $664 >>> 0) { + $k$0$i515 = $657; + do { + $669 = HEAP8[$__v$i$i$i >> 0] | 0; + if ((($669 & 1) == 0 ? ($669 & 255) >>> 1 : HEAP32[$629 >> 2] | 0) >>> 0 > 1) __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($__v$i$i$i, 12716) | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($0, (HEAP32[$db >> 2] | 0) + ($k$0$i515 * 24 | 0) | 0); + $679 = HEAP8[$0 >> 0] | 0; + $681 = ($679 & 1) == 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($__v$i$i$i, $681 ? $631 : HEAP32[$630 >> 2] | 0, $681 ? ($679 & 255) >>> 1 : HEAP32[$632 >> 2] | 0) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($0); + $k$0$i515 = $k$0$i515 + 1 | 0; + } while ($k$0$i515 >>> 0 < $664 >>> 0); + } + if ($657 >>> 0 < $664 >>> 0) { + $k2$0$i516 = $657; + do { + $690 = HEAP32[$628 >> 2] | 0; + $691 = $690 + -24 | 0; + $693 = $690; + do { + $692 = $693 + -24 | 0; + HEAP32[$628 >> 2] = $692; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($692); + $693 = HEAP32[$628 >> 2] | 0; + } while (($693 | 0) != ($691 | 0)); + $k2$0$i516 = $k2$0$i516 + 1 | 0; + } while ($k2$0$i516 >>> 0 < $664 >>> 0); + $t$1$i$be = $658; + } else $t$1$i$be = $658; + } + if (($t$1$i$be | 0) == ($last | 0)) { + label = 144; + break L191; + } else $t$1$i518 = $t$1$i$be; + } + if (($t$1$i$ph$ph | 0) == ($last | 0)) { + label = 144; + break L191; + } else { + $ref_qual$0$i$ph521 = $ref_qual$0$i$ph$ph; + $t$1$i$ph520 = $t$1$i$ph$ph; + } + } + $641 = $t$1$i518$lcssa + 1 | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($__v$i$i$i, 12619) | 0; + switch ($ref_qual$0$i$ph521$lcssa | 0) { + case 1: + { + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($__v$i$i$i, 12719) | 0; + break; + } + case 2: + { + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($__v$i$i$i, 12722) | 0; + break; + } + default: + {} + } + $698 = HEAP32[$628 >> 2] | 0; + if ((HEAP32[$db >> 2] | 0) != ($698 | 0)) { + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($698 + -24 | 0, 12726) | 0; + $703 = HEAP8[$__v$i$i$i >> 0] | 0; + $705 = ($703 & 1) == 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKcj((HEAP32[$628 >> 2] | 0) + -12 | 0, 0, $705 ? $__v$i$i$i + 1 | 0 : HEAP32[$__v$i$i$i + 8 >> 2] | 0, $705 ? ($703 & 255) >>> 1 : HEAP32[$629 >> 2] | 0) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($__v$i$i$i); + if (($641 | 0) == ($first | 0)) { + $$0 = $first; + break L1; + } + $716 = HEAP32[$628 >> 2] | 0; + if ((HEAP32[$db >> 2] | 0) == ($716 | 0)) { + $$0 = $first; + break L1; + } + $718 = $db + 16 | 0; + HEAP32[$15 >> 2] = HEAP32[$db + 12 >> 2]; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEEC2EjRKS3_RKS5_($14, $716 + -24 | 0, $15); + $722 = $db + 20 | 0; + $723 = HEAP32[$722 >> 2] | 0; + $725 = HEAP32[$db + 24 >> 2] | 0; + if ($723 >>> 0 < $725 >>> 0) { + HEAP32[$723 + 12 >> 2] = HEAP32[$14 + 12 >> 2]; + HEAP32[$723 >> 2] = HEAP32[$14 >> 2]; + $732 = $14 + 4 | 0; + HEAP32[$723 + 4 >> 2] = HEAP32[$732 >> 2]; + $734 = $14 + 8 | 0; + HEAP32[$723 + 8 >> 2] = HEAP32[$734 >> 2]; + HEAP32[$734 >> 2] = 0; + HEAP32[$732 >> 2] = 0; + HEAP32[$14 >> 2] = 0; + HEAP32[$722 >> 2] = (HEAP32[$722 >> 2] | 0) + 16; + } else { + $742 = HEAP32[$718 >> 2] | 0; + $743 = $723 - $742 | 0; + $744 = $743 >> 4; + $745 = $744 + 1 | 0; + if (($743 | 0) < -16) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($718); + $748 = $725 - $742 | 0; + if ($748 >> 4 >>> 0 < 1073741823) { + $751 = $748 >> 3; + $$0$i$i$i66 = $751 >>> 0 < $745 >>> 0 ? $745 : $751; + } else $$0$i$i$i66 = 2147483647; + __ZNSt3__114__split_bufferINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEERNS5_IS7_Lj4096EEEEC2EjjS9_($__v$i$i$i, $$0$i$i$i66, $744, $db + 28 | 0); + $754 = $__v$i$i$i + 8 | 0; + $755 = HEAP32[$754 >> 2] | 0; + HEAP32[$755 + 12 >> 2] = HEAP32[$14 + 12 >> 2]; + HEAP32[$755 >> 2] = HEAP32[$14 >> 2]; + $761 = $14 + 4 | 0; + HEAP32[$755 + 4 >> 2] = HEAP32[$761 >> 2]; + $763 = $14 + 8 | 0; + HEAP32[$755 + 8 >> 2] = HEAP32[$763 >> 2]; + HEAP32[$763 >> 2] = 0; + HEAP32[$761 >> 2] = 0; + HEAP32[$14 >> 2] = 0; + HEAP32[$754 >> 2] = $755 + 16; + __ZNSt3__16vectorINS0_IN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEEENS4_IS6_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS6_RS7_EE($718, $__v$i$i$i); + __ZNSt3__114__split_bufferINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEERNS5_IS7_Lj4096EEEED2Ev($__v$i$i$i); + } + __ZNSt3__113__vector_baseIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEED2Ev($14); + $$0 = $641; + break L1; + } + } while (0); + if ((label | 0) == 144) { + $635 = HEAP32[$628 >> 2] | 0; + $636 = $635 + -24 | 0; + $638 = $635; + do { + $637 = $638 + -24 | 0; + HEAP32[$628 >> 2] = $637; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($637); + $638 = HEAP32[$628 >> 2] | 0; + } while (($638 | 0) != ($636 | 0)); + } + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($__v$i$i$i); + } + } + } while (0); + $$0 = $first; + break L1; + break; + } + case 71: + { + $767 = $first + 1 | 0; + $768 = __ZN10__cxxabiv112_GLOBAL__N_110parse_typeINS0_2DbEEEPKcS4_S4_RT_($767, $last, $db) | 0; + if (($768 | 0) == ($767 | 0)) { + $$0 = $first; + break L1; + } + $771 = $db + 4 | 0; + $772 = HEAP32[$771 >> 2] | 0; + if ((HEAP32[$db >> 2] | 0) == ($772 | 0)) { + $$0 = $first; + break L1; + } + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($772 + -24 | 0, 12728) | 0; + $775 = $db + 16 | 0; + $777 = (HEAP32[$771 >> 2] | 0) + -24 | 0; + HEAP32[$17 >> 2] = HEAP32[$db + 12 >> 2]; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEEC2EjRKS3_RKS5_($16, $777, $17); + $780 = $db + 20 | 0; + $781 = HEAP32[$780 >> 2] | 0; + $783 = HEAP32[$db + 24 >> 2] | 0; + if ($781 >>> 0 < $783 >>> 0) { + HEAP32[$781 + 12 >> 2] = HEAP32[$16 + 12 >> 2]; + HEAP32[$781 >> 2] = HEAP32[$16 >> 2]; + $790 = $16 + 4 | 0; + HEAP32[$781 + 4 >> 2] = HEAP32[$790 >> 2]; + $792 = $16 + 8 | 0; + HEAP32[$781 + 8 >> 2] = HEAP32[$792 >> 2]; + HEAP32[$792 >> 2] = 0; + HEAP32[$790 >> 2] = 0; + HEAP32[$16 >> 2] = 0; + HEAP32[$780 >> 2] = (HEAP32[$780 >> 2] | 0) + 16; + } else { + $800 = HEAP32[$775 >> 2] | 0; + $801 = $781 - $800 | 0; + $802 = $801 >> 4; + $803 = $802 + 1 | 0; + if (($801 | 0) < -16) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($775); + $806 = $783 - $800 | 0; + if ($806 >> 4 >>> 0 < 1073741823) { + $809 = $806 >> 3; + $$0$i$i$i71 = $809 >>> 0 < $803 >>> 0 ? $803 : $809; + } else $$0$i$i$i71 = 2147483647; + __ZNSt3__114__split_bufferINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEERNS5_IS7_Lj4096EEEEC2EjjS9_($__v$i$i$i, $$0$i$i$i71, $802, $db + 28 | 0); + $812 = $__v$i$i$i + 8 | 0; + $813 = HEAP32[$812 >> 2] | 0; + HEAP32[$813 + 12 >> 2] = HEAP32[$16 + 12 >> 2]; + HEAP32[$813 >> 2] = HEAP32[$16 >> 2]; + $819 = $16 + 4 | 0; + HEAP32[$813 + 4 >> 2] = HEAP32[$819 >> 2]; + $821 = $16 + 8 | 0; + HEAP32[$813 + 8 >> 2] = HEAP32[$821 >> 2]; + HEAP32[$821 >> 2] = 0; + HEAP32[$819 >> 2] = 0; + HEAP32[$16 >> 2] = 0; + HEAP32[$812 >> 2] = $813 + 16; + __ZNSt3__16vectorINS0_IN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEEENS4_IS6_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS6_RS7_EE($775, $__v$i$i$i); + __ZNSt3__114__split_bufferINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEERNS5_IS7_Lj4096EEEED2Ev($__v$i$i$i); + } + __ZNSt3__113__vector_baseIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEED2Ev($16); + $$0 = $768; + break L1; + break; + } + case 77: + { + if ($197 << 24 >> 24 == 77) { + $826 = $first + 1 | 0; + $827 = __ZN10__cxxabiv112_GLOBAL__N_110parse_typeINS0_2DbEEEPKcS4_S4_RT_($826, $last, $db) | 0; + if (($827 | 0) == ($826 | 0)) $$08$i = $first; else { + $829 = __ZN10__cxxabiv112_GLOBAL__N_110parse_typeINS0_2DbEEEPKcS4_S4_RT_($827, $last, $db) | 0; + if (($829 | 0) == ($827 | 0)) $$08$i = $first; else { + $831 = $db + 4 | 0; + $832 = HEAP32[$831 >> 2] | 0; + if ((($832 - (HEAP32[$db >> 2] | 0) | 0) / 24 | 0) >>> 0 < 2) $$08$i = $first; else { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($__v$i$i$i, $832 + -24 | 0); + $840 = HEAP32[$831 >> 2] | 0; + $841 = $840 + -24 | 0; + $843 = $840; + do { + $842 = $843 + -24 | 0; + HEAP32[$831 >> 2] = $842; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($842); + $843 = HEAP32[$831 >> 2] | 0; + } while (($843 | 0) != ($841 | 0)); + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($0, $840 + -48 | 0); + $846 = $__v$i$i$i + 12 | 0; + $856 = HEAP32[$831 >> 2] | 0; + $857 = $856 + -24 | 0; + if ((HEAP8[((HEAP8[$846 >> 0] & 1) == 0 ? $846 + 1 | 0 : HEAP32[$__v$i$i$i + 20 >> 2] | 0) >> 0] | 0) == 40) { + $858 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($__v$i$i$i, 12714) | 0; + HEAP32[$3 >> 2] = HEAP32[$858 >> 2]; + HEAP32[$3 + 4 >> 2] = HEAP32[$858 + 4 >> 2]; + HEAP32[$3 + 8 >> 2] = HEAP32[$858 + 8 >> 2]; + HEAP32[$858 >> 2] = 0; + HEAP32[$858 + 4 >> 2] = 0; + HEAP32[$858 + 8 >> 2] = 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($4, $0); + $861 = HEAP8[$4 >> 0] | 0; + $863 = ($861 & 1) == 0; + $873 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($3, $863 ? $4 + 1 | 0 : HEAP32[$4 + 8 >> 2] | 0, $863 ? ($861 & 255) >>> 1 : HEAP32[$4 + 4 >> 2] | 0) | 0; + HEAP32[$2 >> 2] = HEAP32[$873 >> 2]; + HEAP32[$2 + 4 >> 2] = HEAP32[$873 + 4 >> 2]; + HEAP32[$2 + 8 >> 2] = HEAP32[$873 + 8 >> 2]; + HEAP32[$873 >> 2] = 0; + HEAP32[$873 + 4 >> 2] = 0; + HEAP32[$873 + 8 >> 2] = 0; + $876 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($2, 12739) | 0; + HEAP32[$1 >> 2] = HEAP32[$876 >> 2]; + HEAP32[$1 + 4 >> 2] = HEAP32[$876 + 4 >> 2]; + HEAP32[$1 + 8 >> 2] = HEAP32[$876 + 8 >> 2]; + HEAP32[$876 >> 2] = 0; + HEAP32[$876 + 4 >> 2] = 0; + HEAP32[$876 + 8 >> 2] = 0; + do if (!(HEAP8[$857 >> 0] & 1)) { + HEAP8[$857 + 1 >> 0] = 0; + HEAP8[$857 >> 0] = 0; + } else { + $883 = $856 + -16 | 0; + HEAP8[HEAP32[$883 >> 2] >> 0] = 0; + $885 = $856 + -20 | 0; + HEAP32[$885 >> 2] = 0; + $$pre$i$i$i$i = HEAP8[$857 >> 0] | 0; + if (!($$pre$i$i$i$i & 1)) { + $892 = $$pre$i$i$i$i; + $901 = 10; + } else { + $888 = HEAP32[$857 >> 2] | 0; + $892 = $888 & 255; + $901 = ($888 & -2) + -1 | 0; + } + if (!($892 & 1)) { + $895 = ($892 & 255) >>> 1; + if (($892 & 255) < 22) { + $2569 = 1; + $900 = 10; + $920 = $895; + } else { + $2569 = 1; + $900 = ($895 + 16 & 240) + -1 | 0; + $920 = $895; + } + } else { + $2569 = 0; + $900 = 10; + $920 = 0; + } + if (($900 | 0) != ($901 | 0)) { + if (($900 | 0) == 10) { + $907 = $857 + 1 | 0; + $908 = HEAP32[$883 >> 2] | 0; + if ($2569) { + _memcpy($907 | 0, $908 | 0, (($892 & 255) >>> 1) + 1 | 0) | 0; + _free($908); + } else { + HEAP8[$907 >> 0] = HEAP8[$908 >> 0] | 0; + _free($908); + } + HEAP8[$857 >> 0] = $920 << 1; + break; + } + $904 = $900 + 1 | 0; + $905 = _malloc($904) | 0; + if (!($900 >>> 0 <= $901 >>> 0 & ($905 | 0) == 0)) { + if ($2569) _memcpy($905 | 0, $857 + 1 | 0, (($892 & 255) >>> 1) + 1 | 0) | 0; else { + $917 = HEAP32[$883 >> 2] | 0; + HEAP8[$905 >> 0] = HEAP8[$917 >> 0] | 0; + _free($917); + } + HEAP32[$857 >> 2] = $904 | 1; + HEAP32[$885 >> 2] = $920; + HEAP32[$883 >> 2] = $905; + } + } + } while (0); + HEAP32[$857 >> 2] = HEAP32[$1 >> 2]; + HEAP32[$857 + 4 >> 2] = HEAP32[$1 + 4 >> 2]; + HEAP32[$857 + 8 >> 2] = HEAP32[$1 + 8 >> 2]; + HEAP32[$1 >> 2] = 0; + HEAP32[$1 + 4 >> 2] = 0; + HEAP32[$1 + 8 >> 2] = 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($1); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($2); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($4); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($3); + $925 = HEAP32[$831 >> 2] | 0; + $926 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc($846, 0, 12619) | 0; + HEAP32[$5 >> 2] = HEAP32[$926 >> 2]; + HEAP32[$5 + 4 >> 2] = HEAP32[$926 + 4 >> 2]; + HEAP32[$5 + 8 >> 2] = HEAP32[$926 + 8 >> 2]; + HEAP32[$926 >> 2] = 0; + HEAP32[$926 + 4 >> 2] = 0; + HEAP32[$926 + 8 >> 2] = 0; + $929 = $925 + -12 | 0; + do if (!(HEAP8[$929 >> 0] & 1)) { + HEAP8[$929 + 1 >> 0] = 0; + HEAP8[$929 >> 0] = 0; + } else { + $934 = $925 + -4 | 0; + HEAP8[HEAP32[$934 >> 2] >> 0] = 0; + $936 = $925 + -8 | 0; + HEAP32[$936 >> 2] = 0; + $$pre$i$i$i21$i = HEAP8[$929 >> 0] | 0; + if (!($$pre$i$i$i21$i & 1)) { + $943 = $$pre$i$i$i21$i; + $952 = 10; + } else { + $939 = HEAP32[$929 >> 2] | 0; + $943 = $939 & 255; + $952 = ($939 & -2) + -1 | 0; + } + if (!($943 & 1)) { + $946 = ($943 & 255) >>> 1; + if (($943 & 255) < 22) { + $2570 = 1; + $951 = 10; + $971 = $946; + } else { + $2570 = 1; + $951 = ($946 + 16 & 240) + -1 | 0; + $971 = $946; + } + } else { + $2570 = 0; + $951 = 10; + $971 = 0; + } + if (($951 | 0) != ($952 | 0)) { + if (($951 | 0) == 10) { + $958 = $929 + 1 | 0; + $959 = HEAP32[$934 >> 2] | 0; + if ($2570) { + _memcpy($958 | 0, $959 | 0, (($943 & 255) >>> 1) + 1 | 0) | 0; + _free($959); + } else { + HEAP8[$958 >> 0] = HEAP8[$959 >> 0] | 0; + _free($959); + } + HEAP8[$929 >> 0] = $971 << 1; + break; + } + $955 = $951 + 1 | 0; + $956 = _malloc($955) | 0; + if (!($951 >>> 0 <= $952 >>> 0 & ($956 | 0) == 0)) { + if ($2570) _memcpy($956 | 0, $929 + 1 | 0, (($943 & 255) >>> 1) + 1 | 0) | 0; else { + $968 = HEAP32[$934 >> 2] | 0; + HEAP8[$956 >> 0] = HEAP8[$968 >> 0] | 0; + _free($968); + } + HEAP32[$929 >> 2] = $955 | 1; + HEAP32[$936 >> 2] = $971; + HEAP32[$934 >> 2] = $956; + } + } + } while (0); + HEAP32[$929 >> 2] = HEAP32[$5 >> 2]; + HEAP32[$929 + 4 >> 2] = HEAP32[$5 + 4 >> 2]; + HEAP32[$929 + 8 >> 2] = HEAP32[$5 + 8 >> 2]; + HEAP32[$5 >> 2] = 0; + HEAP32[$5 + 4 >> 2] = 0; + HEAP32[$5 + 8 >> 2] = 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($5); + } else { + $976 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($__v$i$i$i, 12726) | 0; + HEAP32[$7 >> 2] = HEAP32[$976 >> 2]; + HEAP32[$7 + 4 >> 2] = HEAP32[$976 + 4 >> 2]; + HEAP32[$7 + 8 >> 2] = HEAP32[$976 + 8 >> 2]; + HEAP32[$976 >> 2] = 0; + HEAP32[$976 + 4 >> 2] = 0; + HEAP32[$976 + 8 >> 2] = 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($8, $0); + $979 = HEAP8[$8 >> 0] | 0; + $981 = ($979 & 1) == 0; + $991 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($7, $981 ? $8 + 1 | 0 : HEAP32[$8 + 8 >> 2] | 0, $981 ? ($979 & 255) >>> 1 : HEAP32[$8 + 4 >> 2] | 0) | 0; + HEAP32[$num1$i >> 2] = HEAP32[$991 >> 2]; + HEAP32[$num1$i + 4 >> 2] = HEAP32[$991 + 4 >> 2]; + HEAP32[$num1$i + 8 >> 2] = HEAP32[$991 + 8 >> 2]; + HEAP32[$991 >> 2] = 0; + HEAP32[$991 + 4 >> 2] = 0; + HEAP32[$991 + 8 >> 2] = 0; + $994 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($num1$i, 12739) | 0; + HEAP32[$6 >> 2] = HEAP32[$994 >> 2]; + HEAP32[$6 + 4 >> 2] = HEAP32[$994 + 4 >> 2]; + HEAP32[$6 + 8 >> 2] = HEAP32[$994 + 8 >> 2]; + HEAP32[$994 >> 2] = 0; + HEAP32[$994 + 4 >> 2] = 0; + HEAP32[$994 + 8 >> 2] = 0; + do if (!(HEAP8[$857 >> 0] & 1)) { + HEAP8[$857 + 1 >> 0] = 0; + HEAP8[$857 >> 0] = 0; + } else { + $1001 = $856 + -16 | 0; + HEAP8[HEAP32[$1001 >> 2] >> 0] = 0; + $1003 = $856 + -20 | 0; + HEAP32[$1003 >> 2] = 0; + $$pre$i$i$i52$i = HEAP8[$857 >> 0] | 0; + if (!($$pre$i$i$i52$i & 1)) { + $1010 = $$pre$i$i$i52$i; + $1019 = 10; + } else { + $1006 = HEAP32[$857 >> 2] | 0; + $1010 = $1006 & 255; + $1019 = ($1006 & -2) + -1 | 0; + } + if (!($1010 & 1)) { + $1013 = ($1010 & 255) >>> 1; + if (($1010 & 255) < 22) { + $1018 = 10; + $1038 = $1013; + $2571 = 1; + } else { + $1018 = ($1013 + 16 & 240) + -1 | 0; + $1038 = $1013; + $2571 = 1; + } + } else { + $1018 = 10; + $1038 = 0; + $2571 = 0; + } + if (($1018 | 0) != ($1019 | 0)) { + if (($1018 | 0) == 10) { + $1025 = $857 + 1 | 0; + $1026 = HEAP32[$1001 >> 2] | 0; + if ($2571) { + _memcpy($1025 | 0, $1026 | 0, (($1010 & 255) >>> 1) + 1 | 0) | 0; + _free($1026); + } else { + HEAP8[$1025 >> 0] = HEAP8[$1026 >> 0] | 0; + _free($1026); + } + HEAP8[$857 >> 0] = $1038 << 1; + break; + } + $1022 = $1018 + 1 | 0; + $1023 = _malloc($1022) | 0; + if (!($1018 >>> 0 <= $1019 >>> 0 & ($1023 | 0) == 0)) { + if ($2571) _memcpy($1023 | 0, $857 + 1 | 0, (($1010 & 255) >>> 1) + 1 | 0) | 0; else { + $1035 = HEAP32[$1001 >> 2] | 0; + HEAP8[$1023 >> 0] = HEAP8[$1035 >> 0] | 0; + _free($1035); + } + HEAP32[$857 >> 2] = $1022 | 1; + HEAP32[$1003 >> 2] = $1038; + HEAP32[$1001 >> 2] = $1023; + } + } + } while (0); + HEAP32[$857 >> 2] = HEAP32[$6 >> 2]; + HEAP32[$857 + 4 >> 2] = HEAP32[$6 + 4 >> 2]; + HEAP32[$857 + 8 >> 2] = HEAP32[$6 + 8 >> 2]; + HEAP32[$6 >> 2] = 0; + HEAP32[$6 + 4 >> 2] = 0; + HEAP32[$6 + 8 >> 2] = 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($6); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($num1$i); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($8); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($7); + $1043 = HEAP32[$831 >> 2] | 0; + $1044 = $1043 + -12 | 0; + do if (!(HEAP8[$1044 >> 0] & 1)) { + HEAP8[$1044 + 1 >> 0] = 0; + HEAP8[$1044 >> 0] = 0; + } else { + $1049 = $1043 + -4 | 0; + HEAP8[HEAP32[$1049 >> 2] >> 0] = 0; + $1051 = $1043 + -8 | 0; + HEAP32[$1051 >> 2] = 0; + $$pre$i$i$i71$i = HEAP8[$1044 >> 0] | 0; + if (!($$pre$i$i$i71$i & 1)) { + $1058 = $$pre$i$i$i71$i; + $1067 = 10; + } else { + $1054 = HEAP32[$1044 >> 2] | 0; + $1058 = $1054 & 255; + $1067 = ($1054 & -2) + -1 | 0; + } + if (!($1058 & 1)) { + $1061 = ($1058 & 255) >>> 1; + if (($1058 & 255) < 22) { + $1066 = 10; + $1086 = $1061; + $2572 = 1; + } else { + $1066 = ($1061 + 16 & 240) + -1 | 0; + $1086 = $1061; + $2572 = 1; + } + } else { + $1066 = 10; + $1086 = 0; + $2572 = 0; + } + if (($1066 | 0) != ($1067 | 0)) { + if (($1066 | 0) == 10) { + $1073 = $1044 + 1 | 0; + $1074 = HEAP32[$1049 >> 2] | 0; + if ($2572) { + _memcpy($1073 | 0, $1074 | 0, (($1058 & 255) >>> 1) + 1 | 0) | 0; + _free($1074); + } else { + HEAP8[$1073 >> 0] = HEAP8[$1074 >> 0] | 0; + _free($1074); + } + HEAP8[$1044 >> 0] = $1086 << 1; + break; + } + $1070 = $1066 + 1 | 0; + $1071 = _malloc($1070) | 0; + if (!($1066 >>> 0 <= $1067 >>> 0 & ($1071 | 0) == 0)) { + if ($2572) _memcpy($1071 | 0, $1044 + 1 | 0, (($1058 & 255) >>> 1) + 1 | 0) | 0; else { + $1083 = HEAP32[$1049 >> 2] | 0; + HEAP8[$1071 >> 0] = HEAP8[$1083 >> 0] | 0; + _free($1083); + } + HEAP32[$1044 >> 2] = $1070 | 1; + HEAP32[$1051 >> 2] = $1086; + HEAP32[$1049 >> 2] = $1071; + } + } + } while (0); + HEAP32[$1044 >> 2] = HEAP32[$846 >> 2]; + HEAP32[$1044 + 4 >> 2] = HEAP32[$846 + 4 >> 2]; + HEAP32[$1044 + 8 >> 2] = HEAP32[$846 + 8 >> 2]; + HEAP32[$846 >> 2] = 0; + HEAP32[$846 + 4 >> 2] = 0; + HEAP32[$846 + 8 >> 2] = 0; + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($0); + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($__v$i$i$i); + $$08$i = $829; + } + } + } + } else $$08$i = $first; + if (($$08$i | 0) == ($first | 0)) { + $$0 = $first; + break L1; + } + $1094 = HEAP32[$db + 4 >> 2] | 0; + if ((HEAP32[$db >> 2] | 0) == ($1094 | 0)) { + $$0 = $first; + break L1; + } + $1096 = $db + 16 | 0; + HEAP32[$19 >> 2] = HEAP32[$db + 12 >> 2]; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEEC2EjRKS3_RKS5_($18, $1094 + -24 | 0, $19); + $1100 = $db + 20 | 0; + $1101 = HEAP32[$1100 >> 2] | 0; + $1103 = HEAP32[$db + 24 >> 2] | 0; + if ($1101 >>> 0 < $1103 >>> 0) { + HEAP32[$1101 + 12 >> 2] = HEAP32[$18 + 12 >> 2]; + HEAP32[$1101 >> 2] = HEAP32[$18 >> 2]; + $1110 = $18 + 4 | 0; + HEAP32[$1101 + 4 >> 2] = HEAP32[$1110 >> 2]; + $1112 = $18 + 8 | 0; + HEAP32[$1101 + 8 >> 2] = HEAP32[$1112 >> 2]; + HEAP32[$1112 >> 2] = 0; + HEAP32[$1110 >> 2] = 0; + HEAP32[$18 >> 2] = 0; + HEAP32[$1100 >> 2] = (HEAP32[$1100 >> 2] | 0) + 16; + } else { + $1120 = HEAP32[$1096 >> 2] | 0; + $1121 = $1101 - $1120 | 0; + $1122 = $1121 >> 4; + $1123 = $1122 + 1 | 0; + if (($1121 | 0) < -16) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($1096); + $1126 = $1103 - $1120 | 0; + if ($1126 >> 4 >>> 0 < 1073741823) { + $1129 = $1126 >> 3; + $$0$i$i$i76 = $1129 >>> 0 < $1123 >>> 0 ? $1123 : $1129; + } else $$0$i$i$i76 = 2147483647; + __ZNSt3__114__split_bufferINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEERNS5_IS7_Lj4096EEEEC2EjjS9_($__v$i$i$i, $$0$i$i$i76, $1122, $db + 28 | 0); + $1132 = $__v$i$i$i + 8 | 0; + $1133 = HEAP32[$1132 >> 2] | 0; + HEAP32[$1133 + 12 >> 2] = HEAP32[$18 + 12 >> 2]; + HEAP32[$1133 >> 2] = HEAP32[$18 >> 2]; + $1139 = $18 + 4 | 0; + HEAP32[$1133 + 4 >> 2] = HEAP32[$1139 >> 2]; + $1141 = $18 + 8 | 0; + HEAP32[$1133 + 8 >> 2] = HEAP32[$1141 >> 2]; + HEAP32[$1141 >> 2] = 0; + HEAP32[$1139 >> 2] = 0; + HEAP32[$18 >> 2] = 0; + HEAP32[$1132 >> 2] = $1133 + 16; + __ZNSt3__16vectorINS0_IN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEEENS4_IS6_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS6_RS7_EE($1096, $__v$i$i$i); + __ZNSt3__114__split_bufferINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEERNS5_IS7_Lj4096EEEED2Ev($__v$i$i$i); + } + __ZNSt3__113__vector_baseIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEED2Ev($18); + $$0 = $$08$i; + break L1; + break; + } + case 79: + { + $1145 = $db + 4 | 0; + $1151 = ((HEAP32[$1145 >> 2] | 0) - (HEAP32[$db >> 2] | 0) | 0) / 24 | 0; + $1152 = $first + 1 | 0; + $1153 = __ZN10__cxxabiv112_GLOBAL__N_110parse_typeINS0_2DbEEEPKcS4_S4_RT_($1152, $last, $db) | 0; + $1159 = ((HEAP32[$1145 >> 2] | 0) - (HEAP32[$db >> 2] | 0) | 0) / 24 | 0; + if (($1153 | 0) == ($1152 | 0)) { + $$0 = $first; + break L1; + } + $1161 = $db + 16 | 0; + $1164 = HEAP32[$db + 12 >> 2] | 0; + $1165 = $db + 20 | 0; + $1166 = HEAP32[$1165 >> 2] | 0; + $1168 = HEAP32[$db + 24 >> 2] | 0; + if ($1166 >>> 0 < $1168 >>> 0) { + HEAP32[$1166 >> 2] = 0; + HEAP32[$1166 + 4 >> 2] = 0; + HEAP32[$1166 + 8 >> 2] = 0; + HEAP32[$1166 + 12 >> 2] = $1164; + HEAP32[$1165 >> 2] = (HEAP32[$1165 >> 2] | 0) + 16; + } else { + $1178 = HEAP32[$1161 >> 2] | 0; + $1179 = $1166 - $1178 | 0; + $1180 = $1179 >> 4; + $1181 = $1180 + 1 | 0; + if (($1179 | 0) < -16) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($1161); + $1184 = $1168 - $1178 | 0; + if ($1184 >> 4 >>> 0 < 1073741823) { + $1187 = $1184 >> 3; + $$0$i$i$i81 = $1187 >>> 0 < $1181 >>> 0 ? $1181 : $1187; + } else $$0$i$i$i81 = 2147483647; + __ZNSt3__114__split_bufferINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEERNS5_IS7_Lj4096EEEEC2EjjS9_($__v$i$i$i, $$0$i$i$i81, $1180, $db + 28 | 0); + $1190 = $__v$i$i$i + 8 | 0; + $1191 = HEAP32[$1190 >> 2] | 0; + HEAP32[$1191 >> 2] = 0; + HEAP32[$1191 + 4 >> 2] = 0; + HEAP32[$1191 + 8 >> 2] = 0; + HEAP32[$1191 + 12 >> 2] = $1164; + HEAP32[$1190 >> 2] = $1191 + 16; + __ZNSt3__16vectorINS0_IN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEEENS4_IS6_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS6_RS7_EE($1161, $__v$i$i$i); + __ZNSt3__114__split_bufferINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEERNS5_IS7_Lj4096EEEED2Ev($__v$i$i$i); + } + $1196 = $20 + 4 | 0; + $1197 = $20 + 8 | 0; + $1198 = $20 + 1 | 0; + $1199 = $__v$i$i$i + 8 | 0; + if ($1151 >>> 0 < $1159 >>> 0) $k5$0533 = $1151; else { + $$0 = $1153; + break L1; + } + while (1) { + $1201 = HEAP32[$db >> 2] | 0; + $1202 = $1201 + ($k5$0533 * 24 | 0) + 12 | 0; + $1203 = HEAP8[$1202 >> 0] | 0; + $1205 = ($1203 & 1) == 0; + $1210 = $1205 ? ($1203 & 255) >>> 1 : HEAP32[$1201 + ($k5$0533 * 24 | 0) + 16 >> 2] | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($20, $1205 ? $1202 + 1 | 0 : HEAP32[$1201 + ($k5$0533 * 24 | 0) + 20 >> 2] | 0, $1210 >>> 0 < 2 ? $1210 : 2); + $1217 = HEAP8[$20 >> 0] | 0; + $1219 = ($1217 & 1) == 0; + $1223 = $1219 ? ($1217 & 255) >>> 1 : HEAP32[$1196 >> 2] | 0; + $1226 = $1223 >>> 0 > 2; + $1228 = _memcmp($1219 ? $1198 : HEAP32[$1197 >> 2] | 0, 12696, $1226 ? 2 : $1223) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($20); + $1233 = HEAP32[$db >> 2] | 0; + if (!((($1228 | 0) == 0 ? ($1223 >>> 0 < 2 ? -1 : $1226 & 1) : $1228) | 0)) { + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($1233 + ($k5$0533 * 24 | 0) | 0, 12616) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc((HEAP32[$db >> 2] | 0) + ($k5$0533 * 24 | 0) + 12 | 0, 0, 12619) | 0; + } else { + $1237 = $1233 + ($k5$0533 * 24 | 0) + 12 | 0; + if (!(HEAP8[$1237 >> 0] & 1)) $1245 = $1237 + 1 | 0; else $1245 = HEAP32[$1233 + ($k5$0533 * 24 | 0) + 20 >> 2] | 0; + if ((HEAP8[$1245 >> 0] | 0) == 40) { + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($1233 + ($k5$0533 * 24 | 0) | 0, 12714) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc((HEAP32[$db >> 2] | 0) + ($k5$0533 * 24 | 0) + 12 | 0, 0, 12619) | 0; + } + } + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc((HEAP32[$db >> 2] | 0) + ($k5$0533 * 24 | 0) | 0, 12743) | 0; + $1252 = HEAP32[$1165 >> 2] | 0; + $1253 = $1252 + -16 | 0; + $1254 = HEAP32[$db >> 2] | 0; + $1255 = $1254 + ($k5$0533 * 24 | 0) | 0; + $1256 = $1252 + -12 | 0; + $1257 = HEAP32[$1256 >> 2] | 0; + if (($1257 | 0) == (HEAP32[$1252 + -8 >> 2] | 0)) { + $1269 = $1257 - (HEAP32[$1253 >> 2] | 0) | 0; + $1270 = ($1269 | 0) / 24 | 0; + $1271 = $1270 + 1 | 0; + if (($1269 | 0) < -24) { + $$lcssa667 = $1253; + break; + } + if ($1270 >>> 0 < 1073741823) { + $1274 = $1270 << 1; + $$0$i$i$i87 = $1274 >>> 0 < $1271 >>> 0 ? $1271 : $1274; + } else $$0$i$i$i87 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i$i, $$0$i$i$i87, $1270, $1252 + -4 | 0); + $1277 = HEAP32[$1199 >> 2] | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEC2ERKS7_($1277, $1255); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEC2ERKS7_($1277 + 12 | 0, $1254 + ($k5$0533 * 24 | 0) + 12 | 0); + HEAP32[$1199 >> 2] = $1277 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($1253, $__v$i$i$i); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i$i); + } else { + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEC2ERKS7_($1257, $1255); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEC2ERKS7_($1257 + 12 | 0, $1254 + ($k5$0533 * 24 | 0) + 12 | 0); + HEAP32[$1256 >> 2] = (HEAP32[$1256 >> 2] | 0) + 24; + } + $k5$0533 = $k5$0533 + 1 | 0; + if ($k5$0533 >>> 0 >= $1159 >>> 0) { + $$0 = $1153; + break L1; + } + } + __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($$lcssa667); + break; + } + case 80: + { + $1283 = $db + 4 | 0; + $1289 = ((HEAP32[$1283 >> 2] | 0) - (HEAP32[$db >> 2] | 0) | 0) / 24 | 0; + $1290 = $first + 1 | 0; + $1291 = __ZN10__cxxabiv112_GLOBAL__N_110parse_typeINS0_2DbEEEPKcS4_S4_RT_($1290, $last, $db) | 0; + $1297 = ((HEAP32[$1283 >> 2] | 0) - (HEAP32[$db >> 2] | 0) | 0) / 24 | 0; + if (($1291 | 0) == ($1290 | 0)) { + $$0 = $first; + break L1; + } + $1299 = $db + 16 | 0; + $1302 = HEAP32[$db + 12 >> 2] | 0; + $1303 = $db + 20 | 0; + $1304 = HEAP32[$1303 >> 2] | 0; + $1306 = HEAP32[$db + 24 >> 2] | 0; + if ($1304 >>> 0 < $1306 >>> 0) { + HEAP32[$1304 >> 2] = 0; + HEAP32[$1304 + 4 >> 2] = 0; + HEAP32[$1304 + 8 >> 2] = 0; + HEAP32[$1304 + 12 >> 2] = $1302; + HEAP32[$1303 >> 2] = (HEAP32[$1303 >> 2] | 0) + 16; + } else { + $1316 = HEAP32[$1299 >> 2] | 0; + $1317 = $1304 - $1316 | 0; + $1318 = $1317 >> 4; + $1319 = $1318 + 1 | 0; + if (($1317 | 0) < -16) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($1299); + $1322 = $1306 - $1316 | 0; + if ($1322 >> 4 >>> 0 < 1073741823) { + $1325 = $1322 >> 3; + $$0$i$i$i95 = $1325 >>> 0 < $1319 >>> 0 ? $1319 : $1325; + } else $$0$i$i$i95 = 2147483647; + __ZNSt3__114__split_bufferINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEERNS5_IS7_Lj4096EEEEC2EjjS9_($__v$i$i$i, $$0$i$i$i95, $1318, $db + 28 | 0); + $1328 = $__v$i$i$i + 8 | 0; + $1329 = HEAP32[$1328 >> 2] | 0; + HEAP32[$1329 >> 2] = 0; + HEAP32[$1329 + 4 >> 2] = 0; + HEAP32[$1329 + 8 >> 2] = 0; + HEAP32[$1329 + 12 >> 2] = $1302; + HEAP32[$1328 >> 2] = $1329 + 16; + __ZNSt3__16vectorINS0_IN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEEENS4_IS6_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS6_RS7_EE($1299, $__v$i$i$i); + __ZNSt3__114__split_bufferINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEERNS5_IS7_Lj4096EEEED2Ev($__v$i$i$i); + } + $1334 = $21 + 4 | 0; + $1335 = $21 + 8 | 0; + $1336 = $21 + 1 | 0; + $1337 = $22 + 4 | 0; + $1338 = $22 + 8 | 0; + $1339 = $22 + 1 | 0; + $1340 = $__v$i$i$i + 8 | 0; + if ($1289 >>> 0 < $1297 >>> 0) $k8$0536 = $1289; else { + $$0 = $1291; + break L1; + } + while (1) { + $1342 = HEAP32[$db >> 2] | 0; + $1343 = $1342 + ($k8$0536 * 24 | 0) + 12 | 0; + $1344 = HEAP8[$1343 >> 0] | 0; + $1346 = ($1344 & 1) == 0; + $1351 = $1346 ? ($1344 & 255) >>> 1 : HEAP32[$1342 + ($k8$0536 * 24 | 0) + 16 >> 2] | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($21, $1346 ? $1343 + 1 | 0 : HEAP32[$1342 + ($k8$0536 * 24 | 0) + 20 >> 2] | 0, $1351 >>> 0 < 2 ? $1351 : 2); + $1358 = HEAP8[$21 >> 0] | 0; + $1360 = ($1358 & 1) == 0; + $1364 = $1360 ? ($1358 & 255) >>> 1 : HEAP32[$1334 >> 2] | 0; + $1367 = $1364 >>> 0 > 2; + $1369 = _memcmp($1360 ? $1336 : HEAP32[$1335 >> 2] | 0, 12696, $1367 ? 2 : $1364) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($21); + $1374 = HEAP32[$db >> 2] | 0; + if (!((($1369 | 0) == 0 ? ($1364 >>> 0 < 2 ? -1 : $1367 & 1) : $1369) | 0)) { + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($1374 + ($k8$0536 * 24 | 0) | 0, 12616) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc((HEAP32[$db >> 2] | 0) + ($k8$0536 * 24 | 0) + 12 | 0, 0, 12619) | 0; + } else { + $1378 = $1374 + ($k8$0536 * 24 | 0) + 12 | 0; + if (!(HEAP8[$1378 >> 0] & 1)) $1386 = $1378 + 1 | 0; else $1386 = HEAP32[$1374 + ($k8$0536 * 24 | 0) + 20 >> 2] | 0; + if ((HEAP8[$1386 >> 0] | 0) == 40) { + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($1374 + ($k8$0536 * 24 | 0) | 0, 12714) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc((HEAP32[$db >> 2] | 0) + ($k8$0536 * 24 | 0) + 12 | 0, 0, 12619) | 0; + } + } + $1393 = HEAP32[$db >> 2] | 0; + $1394 = $1393 + ($k8$0536 * 24 | 0) | 0; + do if ((HEAP8[$1290 >> 0] | 0) == 85) { + $1395 = HEAP8[$1394 >> 0] | 0; + $1397 = ($1395 & 1) == 0; + $1402 = $1397 ? ($1395 & 255) >>> 1 : HEAP32[$1393 + ($k8$0536 * 24 | 0) + 4 >> 2] | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($22, $1397 ? $1394 + 1 | 0 : HEAP32[$1393 + ($k8$0536 * 24 | 0) + 8 >> 2] | 0, $1402 >>> 0 < 12 ? $1402 : 12); + $1409 = HEAP8[$22 >> 0] | 0; + $1411 = ($1409 & 1) == 0; + $1415 = $1411 ? ($1409 & 255) >>> 1 : HEAP32[$1337 >> 2] | 0; + $1418 = $1415 >>> 0 > 12; + $1420 = _memcmp($1411 ? $1339 : HEAP32[$1338 >> 2] | 0, 12746, $1418 ? 12 : $1415) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($22); + $1425 = HEAP32[$db >> 2] | 0; + $1426 = $1425 + ($k8$0536 * 24 | 0) | 0; + if (!((($1420 | 0) == 0 ? ($1415 >>> 0 < 12 ? -1 : $1418 & 1) : $1420) | 0)) { + $1428 = HEAP8[$1426 >> 0] | 0; + if (!($1428 & 1)) { + $1432 = ($1428 & 255) >>> 1; + $1443 = $1432 >>> 0 < 11 ? $1432 : 11; + $1444 = $1432; + $1446 = 10; + $1449 = $1428; + } else { + $1436 = HEAP32[$1425 + ($k8$0536 * 24 | 0) + 4 >> 2] | 0; + $1439 = HEAP32[$1426 >> 2] | 0; + $1443 = $1436 >>> 0 < 11 ? $1436 : 11; + $1444 = $1436; + $1446 = ($1439 & -2) + -1 | 0; + $1449 = $1439 & 255; + } + if (($1443 - $1444 + $1446 | 0) >>> 0 < 2) { + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE21__grow_by_and_replaceEjjjjjjPKc($1426, $1446, 2 - $1443 + $1444 - $1446 | 0, $1444, 0, $1443, 2, 12761); + break; + } + if (!($1449 & 1)) $1458 = $1426 + 1 | 0; else $1458 = HEAP32[$1425 + ($k8$0536 * 24 | 0) + 8 >> 2] | 0; + do if (($1443 | 0) == 2) { + $$1$i$i = 0; + $$12$i$i = 12761; + $$14$i$i = 2; + $2573 = 2; + label = 339; + } else { + $1455 = $1444 - $1443 | 0; + if (($1444 | 0) == ($1443 | 0)) { + $$1$i$i = 0; + $$12$i$i = 12761; + $$14$i$i = 2; + $2573 = $1443; + label = 339; + } else { + if ($1443 >>> 0 > 2) { + HEAP8[$1458 >> 0] = 105; + HEAP8[$1458 + 1 >> 0] = 100; + _memmove($1458 + 2 | 0, $1458 + $1443 | 0, $1455 | 0) | 0; + $$2$i$i = 2; + $1474 = $1443; + break; + } + do if ($1458 >>> 0 < 12761 >>> 0 & ($1458 + $1444 | 0) >>> 0 > 12761 >>> 0) if (($1458 + $1443 | 0) >>> 0 > 12761 >>> 0) { + _memcpy($1458 | 0, 12761, $1443 | 0) | 0; + $$0$i$i = $1443; + $$01$i$i = 12763; + $$03$i$i = 2 - $1443 | 0; + $1470 = 0; + break; + } else { + $$0$i$i = 0; + $$01$i$i = 12761 + (2 - $1443) | 0; + $$03$i$i = 2; + $1470 = $1443; + break; + } else { + $$0$i$i = 0; + $$01$i$i = 12761; + $$03$i$i = 2; + $1470 = $1443; + } while (0); + _memmove($1458 + ($$0$i$i + $$03$i$i) | 0, $1458 + ($$0$i$i + $1470) | 0, $1455 | 0) | 0; + $$1$i$i = $$0$i$i; + $$12$i$i = $$01$i$i; + $$14$i$i = $$03$i$i; + $2573 = $1470; + label = 339; + } + } while (0); + if ((label | 0) == 339) { + label = 0; + _memmove($1458 + $$1$i$i | 0, $$12$i$i | 0, $$14$i$i | 0) | 0; + $$2$i$i = $$14$i$i; + $1474 = $2573; + } + $1475 = $$2$i$i - $1474 + $1444 | 0; + if (!(HEAP8[$1426 >> 0] & 1)) HEAP8[$1426 >> 0] = $1475 << 1; else HEAP32[$1425 + ($k8$0536 * 24 | 0) + 4 >> 2] = $1475; + HEAP8[$1458 + $1475 >> 0] = 0; + } else { + $1427 = $1426; + label = 322; + } + } else { + $1427 = $1394; + label = 322; + } while (0); + if ((label | 0) == 322) { + label = 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($1427, 12759) | 0; + } + $1486 = HEAP32[$1303 >> 2] | 0; + $1487 = $1486 + -16 | 0; + $1488 = HEAP32[$db >> 2] | 0; + $1489 = $1488 + ($k8$0536 * 24 | 0) | 0; + $1490 = $1486 + -12 | 0; + $1491 = HEAP32[$1490 >> 2] | 0; + if (($1491 | 0) == (HEAP32[$1486 + -8 >> 2] | 0)) { + $1503 = $1491 - (HEAP32[$1487 >> 2] | 0) | 0; + $1504 = ($1503 | 0) / 24 | 0; + $1505 = $1504 + 1 | 0; + if (($1503 | 0) < -24) { + $$lcssa674 = $1487; + break; + } + if ($1504 >>> 0 < 1073741823) { + $1508 = $1504 << 1; + $$0$i$i$i105 = $1508 >>> 0 < $1505 >>> 0 ? $1505 : $1508; + } else $$0$i$i$i105 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i$i, $$0$i$i$i105, $1504, $1486 + -4 | 0); + $1511 = HEAP32[$1340 >> 2] | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEC2ERKS7_($1511, $1489); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEC2ERKS7_($1511 + 12 | 0, $1488 + ($k8$0536 * 24 | 0) + 12 | 0); + HEAP32[$1340 >> 2] = $1511 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($1487, $__v$i$i$i); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i$i); + } else { + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEC2ERKS7_($1491, $1489); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEC2ERKS7_($1491 + 12 | 0, $1488 + ($k8$0536 * 24 | 0) + 12 | 0); + HEAP32[$1490 >> 2] = (HEAP32[$1490 >> 2] | 0) + 24; + } + $k8$0536 = $k8$0536 + 1 | 0; + if ($k8$0536 >>> 0 >= $1297 >>> 0) { + $$0 = $1291; + break L1; + } + } + __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($$lcssa674); + break; + } + case 82: + { + $1517 = $db + 4 | 0; + $1523 = ((HEAP32[$1517 >> 2] | 0) - (HEAP32[$db >> 2] | 0) | 0) / 24 | 0; + $1524 = $first + 1 | 0; + $1525 = __ZN10__cxxabiv112_GLOBAL__N_110parse_typeINS0_2DbEEEPKcS4_S4_RT_($1524, $last, $db) | 0; + $1531 = ((HEAP32[$1517 >> 2] | 0) - (HEAP32[$db >> 2] | 0) | 0) / 24 | 0; + if (($1525 | 0) == ($1524 | 0)) { + $$0 = $first; + break L1; + } + $1533 = $db + 16 | 0; + $1536 = HEAP32[$db + 12 >> 2] | 0; + $1537 = $db + 20 | 0; + $1538 = HEAP32[$1537 >> 2] | 0; + $1540 = HEAP32[$db + 24 >> 2] | 0; + if ($1538 >>> 0 < $1540 >>> 0) { + HEAP32[$1538 >> 2] = 0; + HEAP32[$1538 + 4 >> 2] = 0; + HEAP32[$1538 + 8 >> 2] = 0; + HEAP32[$1538 + 12 >> 2] = $1536; + HEAP32[$1537 >> 2] = (HEAP32[$1537 >> 2] | 0) + 16; + } else { + $1550 = HEAP32[$1533 >> 2] | 0; + $1551 = $1538 - $1550 | 0; + $1552 = $1551 >> 4; + $1553 = $1552 + 1 | 0; + if (($1551 | 0) < -16) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($1533); + $1556 = $1540 - $1550 | 0; + if ($1556 >> 4 >>> 0 < 1073741823) { + $1559 = $1556 >> 3; + $$0$i$i$i113 = $1559 >>> 0 < $1553 >>> 0 ? $1553 : $1559; + } else $$0$i$i$i113 = 2147483647; + __ZNSt3__114__split_bufferINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEERNS5_IS7_Lj4096EEEEC2EjjS9_($__v$i$i$i, $$0$i$i$i113, $1552, $db + 28 | 0); + $1562 = $__v$i$i$i + 8 | 0; + $1563 = HEAP32[$1562 >> 2] | 0; + HEAP32[$1563 >> 2] = 0; + HEAP32[$1563 + 4 >> 2] = 0; + HEAP32[$1563 + 8 >> 2] = 0; + HEAP32[$1563 + 12 >> 2] = $1536; + HEAP32[$1562 >> 2] = $1563 + 16; + __ZNSt3__16vectorINS0_IN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEEENS4_IS6_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS6_RS7_EE($1533, $__v$i$i$i); + __ZNSt3__114__split_bufferINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEERNS5_IS7_Lj4096EEEED2Ev($__v$i$i$i); + } + $1568 = $23 + 4 | 0; + $1569 = $23 + 8 | 0; + $1570 = $23 + 1 | 0; + $1571 = $__v$i$i$i + 8 | 0; + if ($1523 >>> 0 < $1531 >>> 0) $k11$0540 = $1523; else { + $$0 = $1525; + break L1; + } + while (1) { + $1573 = HEAP32[$db >> 2] | 0; + $1574 = $1573 + ($k11$0540 * 24 | 0) + 12 | 0; + $1575 = HEAP8[$1574 >> 0] | 0; + $1577 = ($1575 & 1) == 0; + $1582 = $1577 ? ($1575 & 255) >>> 1 : HEAP32[$1573 + ($k11$0540 * 24 | 0) + 16 >> 2] | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($23, $1577 ? $1574 + 1 | 0 : HEAP32[$1573 + ($k11$0540 * 24 | 0) + 20 >> 2] | 0, $1582 >>> 0 < 2 ? $1582 : 2); + $1589 = HEAP8[$23 >> 0] | 0; + $1591 = ($1589 & 1) == 0; + $1595 = $1591 ? ($1589 & 255) >>> 1 : HEAP32[$1568 >> 2] | 0; + $1598 = $1595 >>> 0 > 2; + $1600 = _memcmp($1591 ? $1570 : HEAP32[$1569 >> 2] | 0, 12696, $1598 ? 2 : $1595) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($23); + $1605 = HEAP32[$db >> 2] | 0; + if (!((($1600 | 0) == 0 ? ($1595 >>> 0 < 2 ? -1 : $1598 & 1) : $1600) | 0)) { + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($1605 + ($k11$0540 * 24 | 0) | 0, 12616) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc((HEAP32[$db >> 2] | 0) + ($k11$0540 * 24 | 0) + 12 | 0, 0, 12619) | 0; + } else { + $1609 = $1605 + ($k11$0540 * 24 | 0) + 12 | 0; + if (!(HEAP8[$1609 >> 0] & 1)) $1617 = $1609 + 1 | 0; else $1617 = HEAP32[$1605 + ($k11$0540 * 24 | 0) + 20 >> 2] | 0; + if ((HEAP8[$1617 >> 0] | 0) == 40) { + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($1605 + ($k11$0540 * 24 | 0) | 0, 12714) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc((HEAP32[$db >> 2] | 0) + ($k11$0540 * 24 | 0) + 12 | 0, 0, 12619) | 0; + } + } + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc((HEAP32[$db >> 2] | 0) + ($k11$0540 * 24 | 0) | 0, 12764) | 0; + $1624 = HEAP32[$1537 >> 2] | 0; + $1625 = $1624 + -16 | 0; + $1626 = HEAP32[$db >> 2] | 0; + $1627 = $1626 + ($k11$0540 * 24 | 0) | 0; + $1628 = $1624 + -12 | 0; + $1629 = HEAP32[$1628 >> 2] | 0; + if (($1629 | 0) == (HEAP32[$1624 + -8 >> 2] | 0)) { + $1641 = $1629 - (HEAP32[$1625 >> 2] | 0) | 0; + $1642 = ($1641 | 0) / 24 | 0; + $1643 = $1642 + 1 | 0; + if (($1641 | 0) < -24) { + $$lcssa682 = $1625; + break; + } + if ($1642 >>> 0 < 1073741823) { + $1646 = $1642 << 1; + $$0$i$i$i123 = $1646 >>> 0 < $1643 >>> 0 ? $1643 : $1646; + } else $$0$i$i$i123 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i$i, $$0$i$i$i123, $1642, $1624 + -4 | 0); + $1649 = HEAP32[$1571 >> 2] | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEC2ERKS7_($1649, $1627); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEC2ERKS7_($1649 + 12 | 0, $1626 + ($k11$0540 * 24 | 0) + 12 | 0); + HEAP32[$1571 >> 2] = $1649 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($1625, $__v$i$i$i); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i$i); + } else { + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEC2ERKS7_($1629, $1627); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEC2ERKS7_($1629 + 12 | 0, $1626 + ($k11$0540 * 24 | 0) + 12 | 0); + HEAP32[$1628 >> 2] = (HEAP32[$1628 >> 2] | 0) + 24; + } + $k11$0540 = $k11$0540 + 1 | 0; + if ($k11$0540 >>> 0 >= $1531 >>> 0) { + $$0 = $1525; + break L1; + } + } + __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($$lcssa682); + break; + } + case 84: + { + $1655 = $db + 4 | 0; + $1661 = ((HEAP32[$1655 >> 2] | 0) - (HEAP32[$db >> 2] | 0) | 0) / 24 | 0; + $1662 = __ZN10__cxxabiv112_GLOBAL__N_120parse_template_paramINS0_2DbEEEPKcS4_S4_RT_($first, $last, $db) | 0; + $1668 = ((HEAP32[$1655 >> 2] | 0) - (HEAP32[$db >> 2] | 0) | 0) / 24 | 0; + if (($1662 | 0) == ($first | 0)) { + $$0 = $first; + break L1; + } + $1670 = $db + 16 | 0; + $1671 = $db + 12 | 0; + $1673 = HEAP32[$1671 >> 2] | 0; + $1674 = $db + 20 | 0; + $1675 = HEAP32[$1674 >> 2] | 0; + $1676 = $db + 24 | 0; + $1677 = HEAP32[$1676 >> 2] | 0; + if ($1675 >>> 0 < $1677 >>> 0) { + HEAP32[$1675 >> 2] = 0; + HEAP32[$1675 + 4 >> 2] = 0; + HEAP32[$1675 + 8 >> 2] = 0; + HEAP32[$1675 + 12 >> 2] = $1673; + HEAP32[$1674 >> 2] = (HEAP32[$1674 >> 2] | 0) + 16; + } else { + $1687 = HEAP32[$1670 >> 2] | 0; + $1688 = $1675 - $1687 | 0; + $1689 = $1688 >> 4; + $1690 = $1689 + 1 | 0; + if (($1688 | 0) < -16) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($1670); + $1693 = $1677 - $1687 | 0; + if ($1693 >> 4 >>> 0 < 1073741823) { + $1696 = $1693 >> 3; + $$0$i$i$i131 = $1696 >>> 0 < $1690 >>> 0 ? $1690 : $1696; + } else $$0$i$i$i131 = 2147483647; + __ZNSt3__114__split_bufferINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEERNS5_IS7_Lj4096EEEEC2EjjS9_($__v$i$i$i, $$0$i$i$i131, $1689, $db + 28 | 0); + $1699 = $__v$i$i$i + 8 | 0; + $1700 = HEAP32[$1699 >> 2] | 0; + HEAP32[$1700 >> 2] = 0; + HEAP32[$1700 + 4 >> 2] = 0; + HEAP32[$1700 + 8 >> 2] = 0; + HEAP32[$1700 + 12 >> 2] = $1673; + HEAP32[$1699 >> 2] = $1700 + 16; + __ZNSt3__16vectorINS0_IN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEEENS4_IS6_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS6_RS7_EE($1670, $__v$i$i$i); + __ZNSt3__114__split_bufferINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEERNS5_IS7_Lj4096EEEED2Ev($__v$i$i$i); + } + $1705 = $__v$i$i$i + 8 | 0; + L522 : do if ($1661 >>> 0 < $1668 >>> 0) { + $k15$0543 = $1661; + while (1) { + $1707 = HEAP32[$1674 >> 2] | 0; + $1708 = $1707 + -16 | 0; + $1709 = HEAP32[$db >> 2] | 0; + $1710 = $1709 + ($k15$0543 * 24 | 0) | 0; + $1711 = $1707 + -12 | 0; + $1712 = HEAP32[$1711 >> 2] | 0; + if (($1712 | 0) == (HEAP32[$1707 + -8 >> 2] | 0)) { + $1724 = $1712 - (HEAP32[$1708 >> 2] | 0) | 0; + $1725 = ($1724 | 0) / 24 | 0; + $1726 = $1725 + 1 | 0; + if (($1724 | 0) < -24) { + $$lcssa690 = $1708; + break; + } + if ($1725 >>> 0 < 1073741823) { + $1729 = $1725 << 1; + $$0$i$i$i136 = $1729 >>> 0 < $1726 >>> 0 ? $1726 : $1729; + } else $$0$i$i$i136 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i$i, $$0$i$i$i136, $1725, $1707 + -4 | 0); + $1732 = HEAP32[$1705 >> 2] | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEC2ERKS7_($1732, $1710); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEC2ERKS7_($1732 + 12 | 0, $1709 + ($k15$0543 * 24 | 0) + 12 | 0); + HEAP32[$1705 >> 2] = $1732 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($1708, $__v$i$i$i); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i$i); + } else { + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEC2ERKS7_($1712, $1710); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEC2ERKS7_($1712 + 12 | 0, $1709 + ($k15$0543 * 24 | 0) + 12 | 0); + HEAP32[$1711 >> 2] = (HEAP32[$1711 >> 2] | 0) + 24; + } + $k15$0543 = $k15$0543 + 1 | 0; + if ($k15$0543 >>> 0 >= $1668 >>> 0) break L522; + } + __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($$lcssa690); + } while (0); + if (!(($1668 | 0) == ($1661 + 1 | 0) & (HEAP8[$db + 63 >> 0] | 0) != 0)) { + $$0 = $1662; + break L1; + } + $1743 = __ZN10__cxxabiv112_GLOBAL__N_119parse_template_argsINS0_2DbEEEPKcS4_S4_RT_($1662, $last, $db) | 0; + if (($1743 | 0) == ($1662 | 0)) { + $$0 = $1662; + break L1; + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($args, (HEAP32[$1655 >> 2] | 0) + -24 | 0); + $1747 = HEAP32[$1655 >> 2] | 0; + $1748 = $1747 + -24 | 0; + $1750 = $1747; + do { + $1749 = $1750 + -24 | 0; + HEAP32[$1655 >> 2] = $1749; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($1749); + $1750 = HEAP32[$1655 >> 2] | 0; + } while (($1750 | 0) != ($1748 | 0)); + $1753 = HEAP8[$args >> 0] | 0; + $1755 = ($1753 & 1) == 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($1747 + -48 | 0, $1755 ? $args + 1 | 0 : HEAP32[$args + 8 >> 2] | 0, $1755 ? ($1753 & 255) >>> 1 : HEAP32[$args + 4 >> 2] | 0) | 0; + $1766 = (HEAP32[$1655 >> 2] | 0) + -24 | 0; + HEAP32[$25 >> 2] = HEAP32[$1671 >> 2]; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEEC2EjRKS3_RKS5_($24, $1766, $25); + $1768 = HEAP32[$1674 >> 2] | 0; + $1769 = HEAP32[$1676 >> 2] | 0; + if ($1768 >>> 0 < $1769 >>> 0) { + HEAP32[$1768 + 12 >> 2] = HEAP32[$24 + 12 >> 2]; + HEAP32[$1768 >> 2] = HEAP32[$24 >> 2]; + $1776 = $24 + 4 | 0; + HEAP32[$1768 + 4 >> 2] = HEAP32[$1776 >> 2]; + $1778 = $24 + 8 | 0; + HEAP32[$1768 + 8 >> 2] = HEAP32[$1778 >> 2]; + HEAP32[$1778 >> 2] = 0; + HEAP32[$1776 >> 2] = 0; + HEAP32[$24 >> 2] = 0; + HEAP32[$1674 >> 2] = (HEAP32[$1674 >> 2] | 0) + 16; + } else { + $1786 = HEAP32[$1670 >> 2] | 0; + $1787 = $1768 - $1786 | 0; + $1788 = $1787 >> 4; + $1789 = $1788 + 1 | 0; + if (($1787 | 0) < -16) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($1670); + $1792 = $1769 - $1786 | 0; + if ($1792 >> 4 >>> 0 < 1073741823) { + $1795 = $1792 >> 3; + $$0$i$i$i148 = $1795 >>> 0 < $1789 >>> 0 ? $1789 : $1795; + } else $$0$i$i$i148 = 2147483647; + __ZNSt3__114__split_bufferINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEERNS5_IS7_Lj4096EEEEC2EjjS9_($__v$i$i$i, $$0$i$i$i148, $1788, $db + 28 | 0); + $1798 = $__v$i$i$i + 8 | 0; + $1799 = HEAP32[$1798 >> 2] | 0; + HEAP32[$1799 + 12 >> 2] = HEAP32[$24 + 12 >> 2]; + HEAP32[$1799 >> 2] = HEAP32[$24 >> 2]; + $1805 = $24 + 4 | 0; + HEAP32[$1799 + 4 >> 2] = HEAP32[$1805 >> 2]; + $1807 = $24 + 8 | 0; + HEAP32[$1799 + 8 >> 2] = HEAP32[$1807 >> 2]; + HEAP32[$1807 >> 2] = 0; + HEAP32[$1805 >> 2] = 0; + HEAP32[$24 >> 2] = 0; + HEAP32[$1798 >> 2] = $1799 + 16; + __ZNSt3__16vectorINS0_IN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEEENS4_IS6_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS6_RS7_EE($1670, $__v$i$i$i); + __ZNSt3__114__split_bufferINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEERNS5_IS7_Lj4096EEEED2Ev($__v$i$i$i); + } + __ZNSt3__113__vector_baseIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEED2Ev($24); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($args); + $$0 = $1743; + break L1; + break; + } + case 85: + { + $1811 = $first + 1 | 0; + if (($1811 | 0) == ($last | 0)) { + $$0 = $first; + break L1; + } + $1813 = __ZN10__cxxabiv112_GLOBAL__N_117parse_source_nameINS0_2DbEEEPKcS4_S4_RT_($1811, $last, $db) | 0; + if (($1813 | 0) == ($1811 | 0)) { + $$0 = $first; + break L1; + } + $1815 = __ZN10__cxxabiv112_GLOBAL__N_110parse_typeINS0_2DbEEEPKcS4_S4_RT_($1813, $last, $db) | 0; + if (($1815 | 0) == ($1813 | 0)) { + $$0 = $first; + break L1; + } + $1817 = $db + 4 | 0; + $1818 = HEAP32[$1817 >> 2] | 0; + if ((($1818 - (HEAP32[$db >> 2] | 0) | 0) / 24 | 0) >>> 0 < 2) { + $$0 = $first; + break L1; + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($type, $1818 + -24 | 0); + $1826 = HEAP32[$1817 >> 2] | 0; + $1827 = $1826 + -24 | 0; + $1829 = $1826; + do { + $1828 = $1829 + -24 | 0; + HEAP32[$1817 >> 2] = $1828; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($1828); + $1829 = HEAP32[$1817 >> 2] | 0; + } while (($1829 | 0) != ($1827 | 0)); + $1831 = $1826 + -48 | 0; + $1832 = HEAP8[$1831 >> 0] | 0; + $1834 = ($1832 & 1) == 0; + $1839 = $1834 ? ($1832 & 255) >>> 1 : HEAP32[$1826 + -44 >> 2] | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($26, $1834 ? $1831 + 1 | 0 : HEAP32[$1826 + -40 >> 2] | 0, $1839 >>> 0 < 9 ? $1839 : 9); + $1846 = HEAP8[$26 >> 0] | 0; + $1848 = ($1846 & 1) == 0; + $1853 = $1848 ? ($1846 & 255) >>> 1 : HEAP32[$26 + 4 >> 2] | 0; + $1858 = $1853 >>> 0 > 9; + $1860 = _memcmp($1848 ? $26 + 1 | 0 : HEAP32[$26 + 8 >> 2] | 0, 12766, $1858 ? 9 : $1853) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($26); + $1866 = (HEAP32[$1817 >> 2] | 0) + -24 | 0; + if (!((($1860 | 0) == 0 ? ($1853 >>> 0 < 9 ? -1 : $1858 & 1) : $1860) | 0)) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($proto, $1866); + $1884 = HEAP32[$1817 >> 2] | 0; + $1885 = $1884 + -24 | 0; + $1887 = $1884; + do { + $1886 = $1887 + -24 | 0; + HEAP32[$1817 >> 2] = $1886; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($1886); + $1887 = HEAP32[$1817 >> 2] | 0; + } while (($1887 | 0) != ($1885 | 0)); + $1889 = HEAP8[$proto >> 0] | 0; + $1891 = ($1889 & 1) == 0; + $1892 = $proto + 8 | 0; + $1894 = $proto + 1 | 0; + $1895 = $1891 ? $1894 : HEAP32[$1892 >> 2] | 0; + $1897 = $proto + 4 | 0; + $1903 = __ZN10__cxxabiv112_GLOBAL__N_117parse_source_nameINS0_2DbEEEPKcS4_S4_RT_($1895 + 9 | 0, $1895 + ($1891 ? ($1889 & 255) >>> 1 : HEAP32[$1897 >> 2] | 0) | 0, $db) | 0; + if (($1903 | 0) == (((HEAP8[$proto >> 0] & 1) == 0 ? $1894 : HEAP32[$1892 >> 2] | 0) + 9 | 0)) { + __ZNSt3__1plIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEENS_12basic_stringIT_T0_T1_EERKSB_PKS8_($38, $type, 12726); + $1933 = HEAP8[$proto >> 0] | 0; + $1935 = ($1933 & 1) == 0; + $1942 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($38, $1935 ? $1894 : HEAP32[$1892 >> 2] | 0, $1935 ? ($1933 & 255) >>> 1 : HEAP32[$1897 >> 2] | 0) | 0; + HEAP32[$37 >> 2] = HEAP32[$1942 >> 2]; + HEAP32[$37 + 4 >> 2] = HEAP32[$1942 + 4 >> 2]; + HEAP32[$37 + 8 >> 2] = HEAP32[$1942 + 8 >> 2]; + HEAP32[$1942 >> 2] = 0; + HEAP32[$1942 + 4 >> 2] = 0; + HEAP32[$1942 + 8 >> 2] = 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ENSt3__112basic_stringIcNS2_11char_traitsIcEENS0_12malloc_allocIcEEEE($36, $37); + $1945 = HEAP32[$1817 >> 2] | 0; + $1947 = HEAP32[$db + 8 >> 2] | 0; + if ($1945 >>> 0 < $1947 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($1945, $36); + HEAP32[$1817 >> 2] = (HEAP32[$1817 >> 2] | 0) + 24; + } else { + $1954 = HEAP32[$db >> 2] | 0; + $1955 = $1945 - $1954 | 0; + $1956 = ($1955 | 0) / 24 | 0; + $1957 = $1956 + 1 | 0; + if (($1955 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $1961 = ($1947 - $1954 | 0) / 24 | 0; + if ($1961 >>> 0 < 1073741823) { + $1963 = $1961 << 1; + $$0$i$i$i181 = $1963 >>> 0 < $1957 >>> 0 ? $1957 : $1963; + } else $$0$i$i$i181 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i$i, $$0$i$i$i181, $1956, $db + 12 | 0); + $1966 = $__v$i$i$i + 8 | 0; + $1967 = HEAP32[$1966 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($1967, $36); + HEAP32[$1966 >> 2] = $1967 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i$i); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i$i); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($36); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($37); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($38); + } else { + $1912 = (HEAP32[$1817 >> 2] | 0) + -24 | 0; + __ZNSt3__1plIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEENS_12basic_stringIT_T0_T1_EERKSB_PKS8_($34, $type, 12776); + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($35, (HEAP32[$1817 >> 2] | 0) + -24 | 0); + $1915 = HEAP8[$35 >> 0] | 0; + $1917 = ($1915 & 1) == 0; + $1927 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($34, $1917 ? $35 + 1 | 0 : HEAP32[$35 + 8 >> 2] | 0, $1917 ? ($1915 & 255) >>> 1 : HEAP32[$35 + 4 >> 2] | 0) | 0; + HEAP32[$33 >> 2] = HEAP32[$1927 >> 2]; + HEAP32[$33 + 4 >> 2] = HEAP32[$1927 + 4 >> 2]; + HEAP32[$33 + 8 >> 2] = HEAP32[$1927 + 8 >> 2]; + HEAP32[$1927 >> 2] = 0; + HEAP32[$1927 + 4 >> 2] = 0; + HEAP32[$1927 + 8 >> 2] = 0; + $1930 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($33, 12778) | 0; + HEAP32[$32 >> 2] = HEAP32[$1930 >> 2]; + HEAP32[$32 + 4 >> 2] = HEAP32[$1930 + 4 >> 2]; + HEAP32[$32 + 8 >> 2] = HEAP32[$1930 + 8 >> 2]; + HEAP32[$1930 >> 2] = 0; + HEAP32[$1930 + 4 >> 2] = 0; + HEAP32[$1930 + 8 >> 2] = 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ENSt3__112basic_stringIcNS2_11char_traitsIcEENS0_12malloc_allocIcEEEE($31, $32); + __ZN10__cxxabiv112_GLOBAL__N_111string_pairaSEOS1_($1912, $31); + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($31); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($32); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($33); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($35); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($34); + } + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($proto); + } else { + __ZNSt3__1plIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEENS_12basic_stringIT_T0_T1_EERKSB_PKS8_($29, $type, 12726); + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($30, (HEAP32[$1817 >> 2] | 0) + -24 | 0); + $1869 = HEAP8[$30 >> 0] | 0; + $1871 = ($1869 & 1) == 0; + $1881 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($29, $1871 ? $30 + 1 | 0 : HEAP32[$30 + 8 >> 2] | 0, $1871 ? ($1869 & 255) >>> 1 : HEAP32[$30 + 4 >> 2] | 0) | 0; + HEAP32[$28 >> 2] = HEAP32[$1881 >> 2]; + HEAP32[$28 + 4 >> 2] = HEAP32[$1881 + 4 >> 2]; + HEAP32[$28 + 8 >> 2] = HEAP32[$1881 + 8 >> 2]; + HEAP32[$1881 >> 2] = 0; + HEAP32[$1881 + 4 >> 2] = 0; + HEAP32[$1881 + 8 >> 2] = 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ENSt3__112basic_stringIcNS2_11char_traitsIcEENS0_12malloc_allocIcEEEE($27, $28); + __ZN10__cxxabiv112_GLOBAL__N_111string_pairaSEOS1_($1866, $27); + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($27); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($28); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($30); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($29); + } + $1970 = (HEAP32[$1817 >> 2] | 0) + -24 | 0; + HEAP32[$40 >> 2] = HEAP32[$db + 12 >> 2]; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEEC2EjRKS3_RKS5_($39, $1970, $40); + $1973 = $db + 16 | 0; + $1974 = $db + 20 | 0; + $1975 = HEAP32[$1974 >> 2] | 0; + $1977 = HEAP32[$db + 24 >> 2] | 0; + if ($1975 >>> 0 < $1977 >>> 0) { + HEAP32[$1975 + 12 >> 2] = HEAP32[$39 + 12 >> 2]; + HEAP32[$1975 >> 2] = HEAP32[$39 >> 2]; + $1984 = $39 + 4 | 0; + HEAP32[$1975 + 4 >> 2] = HEAP32[$1984 >> 2]; + $1986 = $39 + 8 | 0; + HEAP32[$1975 + 8 >> 2] = HEAP32[$1986 >> 2]; + HEAP32[$1986 >> 2] = 0; + HEAP32[$1984 >> 2] = 0; + HEAP32[$39 >> 2] = 0; + HEAP32[$1974 >> 2] = (HEAP32[$1974 >> 2] | 0) + 16; + } else { + $1994 = HEAP32[$1973 >> 2] | 0; + $1995 = $1975 - $1994 | 0; + $1996 = $1995 >> 4; + $1997 = $1996 + 1 | 0; + if (($1995 | 0) < -16) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($1973); + $2000 = $1977 - $1994 | 0; + if ($2000 >> 4 >>> 0 < 1073741823) { + $2003 = $2000 >> 3; + $$0$i$i$i153 = $2003 >>> 0 < $1997 >>> 0 ? $1997 : $2003; + } else $$0$i$i$i153 = 2147483647; + __ZNSt3__114__split_bufferINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEERNS5_IS7_Lj4096EEEEC2EjjS9_($__v$i$i$i, $$0$i$i$i153, $1996, $db + 28 | 0); + $2006 = $__v$i$i$i + 8 | 0; + $2007 = HEAP32[$2006 >> 2] | 0; + HEAP32[$2007 + 12 >> 2] = HEAP32[$39 + 12 >> 2]; + HEAP32[$2007 >> 2] = HEAP32[$39 >> 2]; + $2013 = $39 + 4 | 0; + HEAP32[$2007 + 4 >> 2] = HEAP32[$2013 >> 2]; + $2015 = $39 + 8 | 0; + HEAP32[$2007 + 8 >> 2] = HEAP32[$2015 >> 2]; + HEAP32[$2015 >> 2] = 0; + HEAP32[$2013 >> 2] = 0; + HEAP32[$39 >> 2] = 0; + HEAP32[$2006 >> 2] = $2007 + 16; + __ZNSt3__16vectorINS0_IN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEEENS4_IS6_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS6_RS7_EE($1973, $__v$i$i$i); + __ZNSt3__114__split_bufferINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEERNS5_IS7_Lj4096EEEED2Ev($__v$i$i$i); + } + __ZNSt3__113__vector_baseIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEED2Ev($39); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($type); + $$0 = $1815; + break L1; + break; + } + case 83: + { + $2019 = $first + 1 | 0; + if (($2019 | 0) != ($last | 0)) if ((HEAP8[$2019 >> 0] | 0) == 116) { + $2023 = __ZN10__cxxabiv112_GLOBAL__N_110parse_nameINS0_2DbEEEPKcS4_S4_RT_($first, $last, $db) | 0; + if (($2023 | 0) == ($first | 0)) { + $$0 = $first; + break L1; + } + $2027 = HEAP32[$db + 4 >> 2] | 0; + if ((HEAP32[$db >> 2] | 0) == ($2027 | 0)) { + $$0 = $first; + break L1; + } + $2029 = $db + 16 | 0; + HEAP32[$42 >> 2] = HEAP32[$db + 12 >> 2]; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEEC2EjRKS3_RKS5_($41, $2027 + -24 | 0, $42); + $2033 = $db + 20 | 0; + $2034 = HEAP32[$2033 >> 2] | 0; + $2036 = HEAP32[$db + 24 >> 2] | 0; + if ($2034 >>> 0 < $2036 >>> 0) { + HEAP32[$2034 + 12 >> 2] = HEAP32[$41 + 12 >> 2]; + HEAP32[$2034 >> 2] = HEAP32[$41 >> 2]; + $2043 = $41 + 4 | 0; + HEAP32[$2034 + 4 >> 2] = HEAP32[$2043 >> 2]; + $2045 = $41 + 8 | 0; + HEAP32[$2034 + 8 >> 2] = HEAP32[$2045 >> 2]; + HEAP32[$2045 >> 2] = 0; + HEAP32[$2043 >> 2] = 0; + HEAP32[$41 >> 2] = 0; + HEAP32[$2033 >> 2] = (HEAP32[$2033 >> 2] | 0) + 16; + } else { + $2053 = HEAP32[$2029 >> 2] | 0; + $2054 = $2034 - $2053 | 0; + $2055 = $2054 >> 4; + $2056 = $2055 + 1 | 0; + if (($2054 | 0) < -16) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($2029); + $2059 = $2036 - $2053 | 0; + if ($2059 >> 4 >>> 0 < 1073741823) { + $2062 = $2059 >> 3; + $$0$i$i$i51 = $2062 >>> 0 < $2056 >>> 0 ? $2056 : $2062; + } else $$0$i$i$i51 = 2147483647; + __ZNSt3__114__split_bufferINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEERNS5_IS7_Lj4096EEEEC2EjjS9_($__v$i$i$i, $$0$i$i$i51, $2055, $db + 28 | 0); + $2065 = $__v$i$i$i + 8 | 0; + $2066 = HEAP32[$2065 >> 2] | 0; + HEAP32[$2066 + 12 >> 2] = HEAP32[$41 + 12 >> 2]; + HEAP32[$2066 >> 2] = HEAP32[$41 >> 2]; + $2072 = $41 + 4 | 0; + HEAP32[$2066 + 4 >> 2] = HEAP32[$2072 >> 2]; + $2074 = $41 + 8 | 0; + HEAP32[$2066 + 8 >> 2] = HEAP32[$2074 >> 2]; + HEAP32[$2074 >> 2] = 0; + HEAP32[$2072 >> 2] = 0; + HEAP32[$41 >> 2] = 0; + HEAP32[$2065 >> 2] = $2066 + 16; + __ZNSt3__16vectorINS0_IN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEEENS4_IS6_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS6_RS7_EE($2029, $__v$i$i$i); + __ZNSt3__114__split_bufferINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEERNS5_IS7_Lj4096EEEED2Ev($__v$i$i$i); + } + __ZNSt3__113__vector_baseIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEED2Ev($41); + $$0 = $2023; + break L1; + } + $2078 = __ZN10__cxxabiv112_GLOBAL__N_118parse_substitutionINS0_2DbEEEPKcS4_S4_RT_($first, $last, $db) | 0; + if (($2078 | 0) == ($first | 0)) { + $$0 = $first; + break L1; + } + $2080 = __ZN10__cxxabiv112_GLOBAL__N_119parse_template_argsINS0_2DbEEEPKcS4_S4_RT_($2078, $last, $db) | 0; + if (($2080 | 0) == ($2078 | 0)) { + $$0 = $2078; + break L1; + } + $2082 = $db + 4 | 0; + $2083 = HEAP32[$2082 >> 2] | 0; + if ((($2083 - (HEAP32[$db >> 2] | 0) | 0) / 24 | 0) >>> 0 < 2) { + $$0 = $2078; + break L1; + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($template_args, $2083 + -24 | 0); + $2091 = HEAP32[$2082 >> 2] | 0; + $2092 = $2091 + -24 | 0; + $2094 = $2091; + do { + $2093 = $2094 + -24 | 0; + HEAP32[$2082 >> 2] = $2093; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($2093); + $2094 = HEAP32[$2082 >> 2] | 0; + } while (($2094 | 0) != ($2092 | 0)); + $2097 = HEAP8[$template_args >> 0] | 0; + $2099 = ($2097 & 1) == 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($2091 + -48 | 0, $2099 ? $template_args + 1 | 0 : HEAP32[$template_args + 8 >> 2] | 0, $2099 ? ($2097 & 255) >>> 1 : HEAP32[$template_args + 4 >> 2] | 0) | 0; + $2110 = (HEAP32[$2082 >> 2] | 0) + -24 | 0; + HEAP32[$44 >> 2] = HEAP32[$db + 12 >> 2]; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEEC2EjRKS3_RKS5_($43, $2110, $44); + $2113 = $db + 16 | 0; + $2114 = $db + 20 | 0; + $2115 = HEAP32[$2114 >> 2] | 0; + $2117 = HEAP32[$db + 24 >> 2] | 0; + if ($2115 >>> 0 < $2117 >>> 0) { + HEAP32[$2115 + 12 >> 2] = HEAP32[$43 + 12 >> 2]; + HEAP32[$2115 >> 2] = HEAP32[$43 >> 2]; + $2124 = $43 + 4 | 0; + HEAP32[$2115 + 4 >> 2] = HEAP32[$2124 >> 2]; + $2126 = $43 + 8 | 0; + HEAP32[$2115 + 8 >> 2] = HEAP32[$2126 >> 2]; + HEAP32[$2126 >> 2] = 0; + HEAP32[$2124 >> 2] = 0; + HEAP32[$43 >> 2] = 0; + HEAP32[$2114 >> 2] = (HEAP32[$2114 >> 2] | 0) + 16; + } else { + $2134 = HEAP32[$2113 >> 2] | 0; + $2135 = $2115 - $2134 | 0; + $2136 = $2135 >> 4; + $2137 = $2136 + 1 | 0; + if (($2135 | 0) < -16) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($2113); + $2140 = $2117 - $2134 | 0; + if ($2140 >> 4 >>> 0 < 1073741823) { + $2143 = $2140 >> 3; + $$0$i$i$i31 = $2143 >>> 0 < $2137 >>> 0 ? $2137 : $2143; + } else $$0$i$i$i31 = 2147483647; + __ZNSt3__114__split_bufferINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEERNS5_IS7_Lj4096EEEEC2EjjS9_($__v$i$i$i, $$0$i$i$i31, $2136, $db + 28 | 0); + $2146 = $__v$i$i$i + 8 | 0; + $2147 = HEAP32[$2146 >> 2] | 0; + HEAP32[$2147 + 12 >> 2] = HEAP32[$43 + 12 >> 2]; + HEAP32[$2147 >> 2] = HEAP32[$43 >> 2]; + $2153 = $43 + 4 | 0; + HEAP32[$2147 + 4 >> 2] = HEAP32[$2153 >> 2]; + $2155 = $43 + 8 | 0; + HEAP32[$2147 + 8 >> 2] = HEAP32[$2155 >> 2]; + HEAP32[$2155 >> 2] = 0; + HEAP32[$2153 >> 2] = 0; + HEAP32[$43 >> 2] = 0; + HEAP32[$2146 >> 2] = $2147 + 16; + __ZNSt3__16vectorINS0_IN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEEENS4_IS6_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS6_RS7_EE($2113, $__v$i$i$i); + __ZNSt3__114__split_bufferINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEERNS5_IS7_Lj4096EEEED2Ev($__v$i$i$i); + } + __ZNSt3__113__vector_baseIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEED2Ev($43); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($template_args); + $$0 = $2080; + break L1; + break; + } + case 68: + { + $2159 = $first + 1 | 0; + if (($2159 | 0) != ($last | 0)) { + $2161 = HEAP8[$2159 >> 0] | 0; + switch ($2161 << 24 >> 24 | 0) { + case 112: + { + $2163 = $db + 4 | 0; + $2169 = ((HEAP32[$2163 >> 2] | 0) - (HEAP32[$db >> 2] | 0) | 0) / 24 | 0; + $2170 = $first + 2 | 0; + $2171 = __ZN10__cxxabiv112_GLOBAL__N_110parse_typeINS0_2DbEEEPKcS4_S4_RT_($2170, $last, $db) | 0; + $2177 = ((HEAP32[$2163 >> 2] | 0) - (HEAP32[$db >> 2] | 0) | 0) / 24 | 0; + if (($2171 | 0) == ($2170 | 0)) break L65; + $2179 = $db + 16 | 0; + $2182 = HEAP32[$db + 12 >> 2] | 0; + $2183 = $db + 20 | 0; + $2184 = HEAP32[$2183 >> 2] | 0; + $2186 = HEAP32[$db + 24 >> 2] | 0; + if ($2184 >>> 0 < $2186 >>> 0) { + HEAP32[$2184 >> 2] = 0; + HEAP32[$2184 + 4 >> 2] = 0; + HEAP32[$2184 + 8 >> 2] = 0; + HEAP32[$2184 + 12 >> 2] = $2182; + HEAP32[$2183 >> 2] = (HEAP32[$2183 >> 2] | 0) + 16; + } else { + $2196 = HEAP32[$2179 >> 2] | 0; + $2197 = $2184 - $2196 | 0; + $2198 = $2197 >> 4; + $2199 = $2198 + 1 | 0; + if (($2197 | 0) < -16) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($2179); + $2202 = $2186 - $2196 | 0; + if ($2202 >> 4 >>> 0 < 1073741823) { + $2205 = $2202 >> 3; + $$0$i$i$i29 = $2205 >>> 0 < $2199 >>> 0 ? $2199 : $2205; + } else $$0$i$i$i29 = 2147483647; + __ZNSt3__114__split_bufferINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEERNS5_IS7_Lj4096EEEEC2EjjS9_($__v$i$i$i, $$0$i$i$i29, $2198, $db + 28 | 0); + $2208 = $__v$i$i$i + 8 | 0; + $2209 = HEAP32[$2208 >> 2] | 0; + HEAP32[$2209 >> 2] = 0; + HEAP32[$2209 + 4 >> 2] = 0; + HEAP32[$2209 + 8 >> 2] = 0; + HEAP32[$2209 + 12 >> 2] = $2182; + HEAP32[$2208 >> 2] = $2209 + 16; + __ZNSt3__16vectorINS0_IN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEEENS4_IS6_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS6_RS7_EE($2179, $__v$i$i$i); + __ZNSt3__114__split_bufferINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEERNS5_IS7_Lj4096EEEED2Ev($__v$i$i$i); + } + $2214 = $__v$i$i$i + 8 | 0; + if ($2169 >>> 0 < $2177 >>> 0) $k20$0550 = $2169; else { + $$0 = $2171; + break L1; + } + while (1) { + $2216 = HEAP32[$2183 >> 2] | 0; + $2217 = $2216 + -16 | 0; + $2218 = HEAP32[$db >> 2] | 0; + $2219 = $2218 + ($k20$0550 * 24 | 0) | 0; + $2220 = $2216 + -12 | 0; + $2221 = HEAP32[$2220 >> 2] | 0; + if (($2221 | 0) == (HEAP32[$2216 + -8 >> 2] | 0)) { + $2233 = $2221 - (HEAP32[$2217 >> 2] | 0) | 0; + $2234 = ($2233 | 0) / 24 | 0; + $2235 = $2234 + 1 | 0; + if (($2233 | 0) < -24) { + $$lcssa698 = $2217; + break; + } + if ($2234 >>> 0 < 1073741823) { + $2238 = $2234 << 1; + $$0$i$i$i27 = $2238 >>> 0 < $2235 >>> 0 ? $2235 : $2238; + } else $$0$i$i$i27 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i$i, $$0$i$i$i27, $2234, $2216 + -4 | 0); + $2241 = HEAP32[$2214 >> 2] | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEC2ERKS7_($2241, $2219); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEC2ERKS7_($2241 + 12 | 0, $2218 + ($k20$0550 * 24 | 0) + 12 | 0); + HEAP32[$2214 >> 2] = $2241 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($2217, $__v$i$i$i); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i$i); + } else { + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEC2ERKS7_($2221, $2219); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEC2ERKS7_($2221 + 12 | 0, $2218 + ($k20$0550 * 24 | 0) + 12 | 0); + HEAP32[$2220 >> 2] = (HEAP32[$2220 >> 2] | 0) + 24; + } + $k20$0550 = $k20$0550 + 1 | 0; + if ($k20$0550 >>> 0 >= $2177 >>> 0) { + $$0 = $2171; + break L1; + } + } + __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($$lcssa698); + break; + } + case 84: + case 116: + { + $2247 = __ZN10__cxxabiv112_GLOBAL__N_114parse_decltypeINS0_2DbEEEPKcS4_S4_RT_($first, $last, $db) | 0; + if (($2247 | 0) == ($first | 0)) break L65; + $2251 = HEAP32[$db + 4 >> 2] | 0; + if ((HEAP32[$db >> 2] | 0) == ($2251 | 0)) { + $$0 = $first; + break L1; + } + $2253 = $db + 16 | 0; + HEAP32[$46 >> 2] = HEAP32[$db + 12 >> 2]; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEEC2EjRKS3_RKS5_($45, $2251 + -24 | 0, $46); + $2257 = $db + 20 | 0; + $2258 = HEAP32[$2257 >> 2] | 0; + $2260 = HEAP32[$db + 24 >> 2] | 0; + if ($2258 >>> 0 < $2260 >>> 0) { + HEAP32[$2258 + 12 >> 2] = HEAP32[$45 + 12 >> 2]; + HEAP32[$2258 >> 2] = HEAP32[$45 >> 2]; + $2267 = $45 + 4 | 0; + HEAP32[$2258 + 4 >> 2] = HEAP32[$2267 >> 2]; + $2269 = $45 + 8 | 0; + HEAP32[$2258 + 8 >> 2] = HEAP32[$2269 >> 2]; + HEAP32[$2269 >> 2] = 0; + HEAP32[$2267 >> 2] = 0; + HEAP32[$45 >> 2] = 0; + HEAP32[$2257 >> 2] = (HEAP32[$2257 >> 2] | 0) + 16; + } else { + $2277 = HEAP32[$2253 >> 2] | 0; + $2278 = $2258 - $2277 | 0; + $2279 = $2278 >> 4; + $2280 = $2279 + 1 | 0; + if (($2278 | 0) < -16) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($2253); + $2283 = $2260 - $2277 | 0; + if ($2283 >> 4 >>> 0 < 1073741823) { + $2286 = $2283 >> 3; + $$0$i$i$i22 = $2286 >>> 0 < $2280 >>> 0 ? $2280 : $2286; + } else $$0$i$i$i22 = 2147483647; + __ZNSt3__114__split_bufferINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEERNS5_IS7_Lj4096EEEEC2EjjS9_($__v$i$i$i, $$0$i$i$i22, $2279, $db + 28 | 0); + $2289 = $__v$i$i$i + 8 | 0; + $2290 = HEAP32[$2289 >> 2] | 0; + HEAP32[$2290 + 12 >> 2] = HEAP32[$45 + 12 >> 2]; + HEAP32[$2290 >> 2] = HEAP32[$45 >> 2]; + $2296 = $45 + 4 | 0; + HEAP32[$2290 + 4 >> 2] = HEAP32[$2296 >> 2]; + $2298 = $45 + 8 | 0; + HEAP32[$2290 + 8 >> 2] = HEAP32[$2298 >> 2]; + HEAP32[$2298 >> 2] = 0; + HEAP32[$2296 >> 2] = 0; + HEAP32[$45 >> 2] = 0; + HEAP32[$2289 >> 2] = $2290 + 16; + __ZNSt3__16vectorINS0_IN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEEENS4_IS6_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS6_RS7_EE($2253, $__v$i$i$i); + __ZNSt3__114__split_bufferINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEERNS5_IS7_Lj4096EEEED2Ev($__v$i$i$i); + } + __ZNSt3__113__vector_baseIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEED2Ev($45); + $$0 = $2247; + break L1; + break; + } + case 118: + { + L662 : do if (($last - $first | 0) > 3 & $197 << 24 >> 24 == 68 & $2161 << 24 >> 24 == 118) { + $2308 = $first + 2 | 0; + $2309 = HEAP8[$2308 >> 0] | 0; + if (($2309 + -49 & 255) < 9) { + $2311 = __ZN10__cxxabiv112_GLOBAL__N_112parse_numberEPKcS2_($2308, $last) | 0; + if (($2311 | 0) == ($last | 0)) { + $$1$i263 = $first; + break; + } + if ((HEAP8[$2311 >> 0] | 0) != 95) { + $$1$i263 = $first; + break; + } + $2317 = $2311 - $2308 | 0; + $2318 = $2311 + 1 | 0; + if (($2318 | 0) == ($last | 0)) { + $$1$i263 = $first; + break; + } + if ((HEAP8[$2318 >> 0] | 0) != 112) { + $2322 = __ZN10__cxxabiv112_GLOBAL__N_110parse_typeINS0_2DbEEEPKcS4_S4_RT_($2318, $last, $db) | 0; + if (($2322 | 0) == ($2318 | 0)) { + $$1$i263 = $first; + break; + } + $2326 = HEAP32[$db + 4 >> 2] | 0; + if ((HEAP32[$db >> 2] | 0) == ($2326 | 0)) { + $$1$i263 = $first; + break; + } + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($2, $2308, $2317); + $2329 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc($2, 0, 12780) | 0; + HEAP32[$1 >> 2] = HEAP32[$2329 >> 2]; + HEAP32[$1 + 4 >> 2] = HEAP32[$2329 + 4 >> 2]; + HEAP32[$1 + 8 >> 2] = HEAP32[$2329 + 8 >> 2]; + HEAP32[$2329 >> 2] = 0; + HEAP32[$2329 + 4 >> 2] = 0; + HEAP32[$2329 + 8 >> 2] = 0; + $2332 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($1, 12703) | 0; + HEAP32[$0 >> 2] = HEAP32[$2332 >> 2]; + HEAP32[$0 + 4 >> 2] = HEAP32[$2332 + 4 >> 2]; + HEAP32[$0 + 8 >> 2] = HEAP32[$2332 + 8 >> 2]; + HEAP32[$2332 >> 2] = 0; + HEAP32[$2332 + 4 >> 2] = 0; + HEAP32[$2332 + 8 >> 2] = 0; + $2335 = HEAP8[$0 >> 0] | 0; + $2337 = ($2335 & 1) == 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($2326 + -24 | 0, $2337 ? $0 + 1 | 0 : HEAP32[$0 + 8 >> 2] | 0, $2337 ? ($2335 & 255) >>> 1 : HEAP32[$0 + 4 >> 2] | 0) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($0); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($1); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($2); + $$1$i263 = $2322; + break; + } + $2347 = $2311 + 2 | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($6, $2308, $2317); + $2348 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc($6, 0, 12789) | 0; + HEAP32[$5 >> 2] = HEAP32[$2348 >> 2]; + HEAP32[$5 + 4 >> 2] = HEAP32[$2348 + 4 >> 2]; + HEAP32[$5 + 8 >> 2] = HEAP32[$2348 + 8 >> 2]; + HEAP32[$2348 >> 2] = 0; + HEAP32[$2348 + 4 >> 2] = 0; + HEAP32[$2348 + 8 >> 2] = 0; + $2351 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($5, 12703) | 0; + HEAP32[$4 >> 2] = HEAP32[$2351 >> 2]; + HEAP32[$4 + 4 >> 2] = HEAP32[$2351 + 4 >> 2]; + HEAP32[$4 + 8 >> 2] = HEAP32[$2351 + 8 >> 2]; + HEAP32[$2351 >> 2] = 0; + HEAP32[$2351 + 4 >> 2] = 0; + HEAP32[$2351 + 8 >> 2] = 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ENSt3__112basic_stringIcNS2_11char_traitsIcEENS0_12malloc_allocIcEEEE($3, $4); + $2354 = $db + 4 | 0; + $2355 = HEAP32[$2354 >> 2] | 0; + $2357 = HEAP32[$db + 8 >> 2] | 0; + if ($2355 >>> 0 < $2357 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($2355, $3); + HEAP32[$2354 >> 2] = (HEAP32[$2354 >> 2] | 0) + 24; + } else { + $2364 = HEAP32[$db >> 2] | 0; + $2365 = $2355 - $2364 | 0; + $2366 = ($2365 | 0) / 24 | 0; + $2367 = $2366 + 1 | 0; + if (($2365 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $2371 = ($2357 - $2364 | 0) / 24 | 0; + if ($2371 >>> 0 < 1073741823) { + $2373 = $2371 << 1; + $$0$i$i$i$i = $2373 >>> 0 < $2367 >>> 0 ? $2367 : $2373; + } else $$0$i$i$i$i = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i$i, $$0$i$i$i$i, $2366, $db + 12 | 0); + $2376 = $__v$i$i$i + 8 | 0; + $2377 = HEAP32[$2376 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($2377, $3); + HEAP32[$2376 >> 2] = $2377 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i$i); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i$i); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($3); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($4); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($5); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($6); + $$1$i263 = $2347; + break; + } + HEAP32[$num1$i >> 2] = 0; + HEAP32[$num1$i + 4 >> 2] = 0; + HEAP32[$num1$i + 8 >> 2] = 0; + if ($2309 << 24 >> 24 == 95) { + $t12$0$i = $2308; + label = 521; + } else { + $2382 = __ZN10__cxxabiv112_GLOBAL__N_116parse_expressionINS0_2DbEEEPKcS4_S4_RT_($2308, $last, $db) | 0; + if (($2382 | 0) == ($2308 | 0)) { + $t12$0$i = $2308; + label = 521; + } else { + $2385 = $db + 4 | 0; + $2386 = HEAP32[$2385 >> 2] | 0; + if ((HEAP32[$db >> 2] | 0) != ($2386 | 0)) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($7, $2386 + -24 | 0); + L689 : do if (!(HEAP8[$num1$i >> 0] & 1)) { + HEAP8[$num1$i + 1 >> 0] = 0; + HEAP8[$num1$i >> 0] = 0; + } else { + $2393 = $num1$i + 8 | 0; + $2394 = HEAP32[$2393 >> 2] | 0; + HEAP8[$2394 >> 0] = 0; + $2395 = $num1$i + 4 | 0; + HEAP32[$2395 >> 2] = 0; + $2396 = HEAP32[$num1$i >> 2] | 0; + $phitmp$i$i$i$i$i$i$i240 = ($2396 & -2) + -1 | 0; + $2398 = $2396 & 255; + do if (!($2398 & 1)) { + $2402 = $2396 >>> 1 & 127; + if (($2398 & 255) < 22) { + _memcpy($num1$i + 1 | 0, $2394 | 0, ($2396 >>> 1 & 127) + 1 | 0) | 0; + _free($2394); + $$ph390 = $2402; + break; + } + $2405 = $2402 + 16 & 240; + $phitmp$i2$i$i$i$i$i$i243 = $2405 + -1 | 0; + if (($phitmp$i2$i$i$i$i$i$i243 | 0) == ($phitmp$i$i$i$i$i$i$i240 | 0)) break L689; + $2408 = _malloc($2405) | 0; + if ($phitmp$i2$i$i$i$i$i$i243 >>> 0 <= $phitmp$i$i$i$i$i$i$i240 >>> 0 & ($2408 | 0) == 0) break L689; + _memcpy($2408 | 0, $num1$i + 1 | 0, ($2396 >>> 1 & 127) + 1 | 0) | 0; + HEAP32[$num1$i >> 2] = $2405 | 1; + HEAP32[$2395 >> 2] = $2402; + HEAP32[$2393 >> 2] = $2408; + break L689; + } else { + HEAP8[$num1$i + 1 >> 0] = 0; + _free($2394); + $$ph390 = 0; + } while (0); + HEAP8[$num1$i >> 0] = $$ph390 << 1; + } while (0); + HEAP32[$num1$i >> 2] = HEAP32[$7 >> 2]; + HEAP32[$num1$i + 4 >> 2] = HEAP32[$7 + 4 >> 2]; + HEAP32[$num1$i + 8 >> 2] = HEAP32[$7 + 8 >> 2]; + HEAP32[$7 >> 2] = 0; + HEAP32[$7 + 4 >> 2] = 0; + HEAP32[$7 + 8 >> 2] = 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($7); + $2424 = HEAP32[$2385 >> 2] | 0; + $2425 = $2424 + -24 | 0; + $2427 = $2424; + do { + $2426 = $2427 + -24 | 0; + HEAP32[$2385 >> 2] = $2426; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($2426); + $2427 = HEAP32[$2385 >> 2] | 0; + } while (($2427 | 0) != ($2425 | 0)); + $t12$0$i = $2382; + label = 521; + } + } + } + do if ((label | 0) == 521) { + if (($t12$0$i | 0) == ($last | 0)) $$13$i259$ph = $first; else if ((HEAP8[$t12$0$i >> 0] | 0) == 95) { + $2432 = $t12$0$i + 1 | 0; + if (($2432 | 0) == ($last | 0)) $$13$i259$ph = $first; else { + $2434 = __ZN10__cxxabiv112_GLOBAL__N_110parse_typeINS0_2DbEEEPKcS4_S4_RT_($2432, $last, $db) | 0; + if (($2434 | 0) == ($2432 | 0)) $$13$i259$ph = $first; else { + $2438 = HEAP32[$db + 4 >> 2] | 0; + if ((HEAP32[$db >> 2] | 0) == ($2438 | 0)) break; + __ZNSt3__1plIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEENS_12basic_stringIT_T0_T1_EEPKS8_RKSB_($9, 12780, $num1$i); + $2441 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($9, 12703) | 0; + HEAP32[$8 >> 2] = HEAP32[$2441 >> 2]; + HEAP32[$8 + 4 >> 2] = HEAP32[$2441 + 4 >> 2]; + HEAP32[$8 + 8 >> 2] = HEAP32[$2441 + 8 >> 2]; + HEAP32[$2441 >> 2] = 0; + HEAP32[$2441 + 4 >> 2] = 0; + HEAP32[$2441 + 8 >> 2] = 0; + $2444 = HEAP8[$8 >> 0] | 0; + $2446 = ($2444 & 1) == 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($2438 + -24 | 0, $2446 ? $8 + 1 | 0 : HEAP32[$8 + 8 >> 2] | 0, $2446 ? ($2444 & 255) >>> 1 : HEAP32[$8 + 4 >> 2] | 0) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($8); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($9); + $$13$i259$ph = $2434; + } + } + } else $$13$i259$ph = $first; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($num1$i); + $$1$i263 = $$13$i259$ph; + break L662; + } while (0); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($num1$i); + $$1$i263 = $first; + } else $$1$i263 = $first; while (0); + if (($$1$i263 | 0) == ($first | 0)) break L65; + $2459 = HEAP32[$db + 4 >> 2] | 0; + if ((HEAP32[$db >> 2] | 0) == ($2459 | 0)) { + $$0 = $first; + break L1; + } + $2461 = $db + 16 | 0; + HEAP32[$48 >> 2] = HEAP32[$db + 12 >> 2]; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEEC2EjRKS3_RKS5_($47, $2459 + -24 | 0, $48); + $2465 = $db + 20 | 0; + $2466 = HEAP32[$2465 >> 2] | 0; + $2468 = HEAP32[$db + 24 >> 2] | 0; + if ($2466 >>> 0 < $2468 >>> 0) { + HEAP32[$2466 + 12 >> 2] = HEAP32[$47 + 12 >> 2]; + HEAP32[$2466 >> 2] = HEAP32[$47 >> 2]; + $2475 = $47 + 4 | 0; + HEAP32[$2466 + 4 >> 2] = HEAP32[$2475 >> 2]; + $2477 = $47 + 8 | 0; + HEAP32[$2466 + 8 >> 2] = HEAP32[$2477 >> 2]; + HEAP32[$2477 >> 2] = 0; + HEAP32[$2475 >> 2] = 0; + HEAP32[$47 >> 2] = 0; + HEAP32[$2465 >> 2] = (HEAP32[$2465 >> 2] | 0) + 16; + } else { + $2485 = HEAP32[$2461 >> 2] | 0; + $2486 = $2466 - $2485 | 0; + $2487 = $2486 >> 4; + $2488 = $2487 + 1 | 0; + if (($2486 | 0) < -16) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($2461); + $2491 = $2468 - $2485 | 0; + if ($2491 >> 4 >>> 0 < 1073741823) { + $2494 = $2491 >> 3; + $$0$i$i$i17 = $2494 >>> 0 < $2488 >>> 0 ? $2488 : $2494; + } else $$0$i$i$i17 = 2147483647; + __ZNSt3__114__split_bufferINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEERNS5_IS7_Lj4096EEEEC2EjjS9_($__v$i$i$i, $$0$i$i$i17, $2487, $db + 28 | 0); + $2497 = $__v$i$i$i + 8 | 0; + $2498 = HEAP32[$2497 >> 2] | 0; + HEAP32[$2498 + 12 >> 2] = HEAP32[$47 + 12 >> 2]; + HEAP32[$2498 >> 2] = HEAP32[$47 >> 2]; + $2504 = $47 + 4 | 0; + HEAP32[$2498 + 4 >> 2] = HEAP32[$2504 >> 2]; + $2506 = $47 + 8 | 0; + HEAP32[$2498 + 8 >> 2] = HEAP32[$2506 >> 2]; + HEAP32[$2506 >> 2] = 0; + HEAP32[$2504 >> 2] = 0; + HEAP32[$47 >> 2] = 0; + HEAP32[$2497 >> 2] = $2498 + 16; + __ZNSt3__16vectorINS0_IN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEEENS4_IS6_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS6_RS7_EE($2461, $__v$i$i$i); + __ZNSt3__114__split_bufferINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEERNS5_IS7_Lj4096EEEED2Ev($__v$i$i$i); + } + __ZNSt3__113__vector_baseIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEED2Ev($47); + $$0 = $$1$i263; + break L1; + break; + } + default: + break L65; + } + } + break; + } + default: + {} + } while (0); + $2510 = __ZN10__cxxabiv112_GLOBAL__N_118parse_builtin_typeINS0_2DbEEEPKcS4_S4_RT_($first, $last, $db) | 0; + if (($2510 | 0) == ($first | 0)) { + $2512 = __ZN10__cxxabiv112_GLOBAL__N_110parse_nameINS0_2DbEEEPKcS4_S4_RT_($first, $last, $db) | 0; + if (($2512 | 0) == ($first | 0)) $$0 = $first; else { + $2516 = HEAP32[$db + 4 >> 2] | 0; + if ((HEAP32[$db >> 2] | 0) == ($2516 | 0)) $$0 = $first; else { + $2518 = $db + 16 | 0; + HEAP32[$50 >> 2] = HEAP32[$db + 12 >> 2]; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEEC2EjRKS3_RKS5_($49, $2516 + -24 | 0, $50); + $2522 = $db + 20 | 0; + $2523 = HEAP32[$2522 >> 2] | 0; + $2525 = HEAP32[$db + 24 >> 2] | 0; + if ($2523 >>> 0 < $2525 >>> 0) { + HEAP32[$2523 + 12 >> 2] = HEAP32[$49 + 12 >> 2]; + HEAP32[$2523 >> 2] = HEAP32[$49 >> 2]; + $2532 = $49 + 4 | 0; + HEAP32[$2523 + 4 >> 2] = HEAP32[$2532 >> 2]; + $2534 = $49 + 8 | 0; + HEAP32[$2523 + 8 >> 2] = HEAP32[$2534 >> 2]; + HEAP32[$2534 >> 2] = 0; + HEAP32[$2532 >> 2] = 0; + HEAP32[$49 >> 2] = 0; + HEAP32[$2522 >> 2] = (HEAP32[$2522 >> 2] | 0) + 16; + } else { + $2542 = HEAP32[$2518 >> 2] | 0; + $2543 = $2523 - $2542 | 0; + $2544 = $2543 >> 4; + $2545 = $2544 + 1 | 0; + if (($2543 | 0) < -16) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($2518); + $2548 = $2525 - $2542 | 0; + if ($2548 >> 4 >>> 0 < 1073741823) { + $2551 = $2548 >> 3; + $$0$i$i$i = $2551 >>> 0 < $2545 >>> 0 ? $2545 : $2551; + } else $$0$i$i$i = 2147483647; + __ZNSt3__114__split_bufferINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEERNS5_IS7_Lj4096EEEEC2EjjS9_($__v$i$i$i, $$0$i$i$i, $2544, $db + 28 | 0); + $2554 = $__v$i$i$i + 8 | 0; + $2555 = HEAP32[$2554 >> 2] | 0; + HEAP32[$2555 + 12 >> 2] = HEAP32[$49 + 12 >> 2]; + HEAP32[$2555 >> 2] = HEAP32[$49 >> 2]; + $2561 = $49 + 4 | 0; + HEAP32[$2555 + 4 >> 2] = HEAP32[$2561 >> 2]; + $2563 = $49 + 8 | 0; + HEAP32[$2555 + 8 >> 2] = HEAP32[$2563 >> 2]; + HEAP32[$2563 >> 2] = 0; + HEAP32[$2561 >> 2] = 0; + HEAP32[$49 >> 2] = 0; + HEAP32[$2554 >> 2] = $2555 + 16; + __ZNSt3__16vectorINS0_IN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEEENS4_IS6_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS6_RS7_EE($2518, $__v$i$i$i); + __ZNSt3__114__split_bufferINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEERNS5_IS7_Lj4096EEEED2Ev($__v$i$i$i); + } + __ZNSt3__113__vector_baseIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEED2Ev($49); + $$0 = $2512; + } + } + } else $$0 = $2510; + } else $$0 = $195; + } while (0); + STACKTOP = sp; + return $$0 | 0; +} +function __ZN10__cxxabiv112_GLOBAL__N_116parse_expressionINS0_2DbEEEPKcS4_S4_RT_($first, $last, $db) { + $first = $first | 0; + $last = $last | 0; + $db = $db | 0; + var $$0 = 0, $$0$i$i$i = 0, $$0$i$i$i$i = 0, $$0$i$i$i$i299 = 0, $$0$i$i$i$i348 = 0, $$0$i254 = 0, $$019$i = 0, $$02$i = 0, $$02$i310 = 0, $$02$i317 = 0, $$03$i = 0, $$03$i174 = 0, $$03$i189 = 0, $$03$i200 = 0, $$03$i211 = 0, $$03$i265 = 0, $$03$i456 = 0, $$03$i486 = 0, $$06$i = 0, $$06$i248 = 0, $$06$i345 = 0, $$06$i426 = 0, $$2$i302 = 0, $$2$i398 = 0, $$221$i = 0, $$311$i = 0, $$9$i = 0, $$first$i = 0, $$ph518 = 0, $$ph520524 = 0, $$phi$trans$insert = 0, $$pre$i$i$i = 0, $$pre$i$i$i$i = 0, $$pre$i$i$i$i372 = 0, $$pre$i$i$i$i436 = 0, $$pre$i$i$i$i466 = 0, $$pre$i$i$i87 = 0, $$pre$phi511Z2D = 0, $$pre$phiZ2D = 0, $0 = 0, $1 = 0, $10 = 0, $100 = 0, $101 = 0, $1015 = 0, $1016 = 0, $1017 = 0, $1018 = 0, $1022 = 0, $1024 = 0, $1025 = 0, $1026 = 0, $1027 = 0, $103 = 0, $1038 = 0, $1039 = 0, $104 = 0, $1040 = 0, $1041 = 0, $1043 = 0, $1047 = 0, $1050 = 0, $1053 = 0, $106 = 0, $1069 = 0, $107 = 0, $1070 = 0, $1071 = 0, $1072 = 0, $1076 = 0, $1079 = 0, $1081 = 0, $109 = 0, $1091 = 0, $1093 = 0, $11 = 0, $110 = 0, $1103 = 0, $1106 = 0, $1108 = 0, $112 = 0, $1120 = 0, $1122 = 0, $1129 = 0, $113 = 0, $1130 = 0, $1131 = 0, $1132 = 0, $1136 = 0, $1138 = 0, $1141 = 0, $1142 = 0, $1145 = 0, $1146 = 0, $1148 = 0, $1149 = 0, $1151 = 0, $1152 = 0, $1154 = 0, $1155 = 0, $1159 = 0, $1161 = 0, $1162 = 0, $1165 = 0, $1172 = 0, $1174 = 0, $1177 = 0, $1181 = 0, $1184 = 0, $1189 = 0, $1190 = 0, $1193 = 0, $1194 = 0, $1196 = 0, $1197 = 0, $12 = 0, $1206 = 0, $1209 = 0, $121 = 0, $1219 = 0, $122 = 0, $1220 = 0, $1222 = 0, $1223 = 0, $1225 = 0, $1226 = 0, $1231 = 0, $1232 = 0, $1234 = 0, $1235 = 0, $1237 = 0, $1238 = 0, $1240 = 0, $1244 = 0, $1245 = 0, $1247 = 0, $1251 = 0, $1253 = 0, $1254 = 0, $1257 = 0, $126 = 0, $1260 = 0, $1261 = 0, $1269 = 0, $1270 = 0, $1272 = 0, $1274 = 0, $1275 = 0, $128 = 0, $1283 = 0, $1284 = 0, $1285 = 0, $1286 = 0, $129 = 0, $1291 = 0, $1293 = 0, $13 = 0, $1306 = 0, $1307 = 0, $1309 = 0, $1311 = 0, $1313 = 0, $1314 = 0, $132 = 0, $1322 = 0, $1323 = 0, $1324 = 0, $1325 = 0, $1328 = 0, $1329 = 0, $1330 = 0, $1331 = 0, $1335 = 0, $1336 = 0, $1339 = 0, $1341 = 0, $1351 = 0, $1354 = 0, $1357 = 0, $1359 = 0, $1369 = 0, $1372 = 0, $1375 = 0, $1376 = 0, $1377 = 0, $1379 = 0, $1380 = 0, $1381 = 0, $1383 = 0, $1384 = 0, $1385 = 0, $1386 = 0, $1387 = 0, $139 = 0, $1398 = 0, $1399 = 0, $14 = 0, $1401 = 0, $1403 = 0, $1404 = 0, $141 = 0, $1412 = 0, $1413 = 0, $1414 = 0, $1415 = 0, $1417 = 0, $1418 = 0, $1421 = 0, $1424 = 0, $1426 = 0, $1436 = 0, $1439 = 0, $144 = 0, $1442 = 0, $1443 = 0, $1445 = 0, $1446 = 0, $1448 = 0, $1449 = 0, $1451 = 0, $1452 = 0, $1463 = 0, $1464 = 0, $1466 = 0, $1468 = 0, $1469 = 0, $1477 = 0, $1478 = 0, $1479 = 0, $148 = 0, $1480 = 0, $1482 = 0, $1483 = 0, $1486 = 0, $1489 = 0, $1491 = 0, $15 = 0, $1501 = 0, $1504 = 0, $151 = 0, $1513 = 0, $1514 = 0, $1523 = 0, $1524 = 0, $1528 = 0, $1530 = 0, $1531 = 0, $1534 = 0, $1543 = 0, $1544 = 0, $1548 = 0, $1550 = 0, $1551 = 0, $1554 = 0, $156 = 0, $1569 = 0, $157 = 0, $1572 = 0, $1578 = 0, $1579 = 0, $1581 = 0, $1585 = 0, $1591 = 0, $1593 = 0, $16 = 0, $160 = 0, $1603 = 0, $1604 = 0, $1605 = 0, $1609 = 0, $161 = 0, $1612 = 0, $1614 = 0, $1623 = 0, $1624 = 0, $1625 = 0, $1626 = 0, $163 = 0, $1632 = 0, $1634 = 0, $164 = 0, $1641 = 0, $1642 = 0, $1643 = 0, $1644 = 0, $1648 = 0, $1650 = 0, $1653 = 0, $1654 = 0, $1662 = 0, $1665 = 0, $1669 = 0, $1671 = 0, $1672 = 0, $1675 = 0, $1685 = 0, $1687 = 0, $1693 = 0, $1695 = 0, $1696 = 0, $1699 = 0, $17 = 0, $1702 = 0, $1703 = 0, $1705 = 0, $1712 = 0, $1713 = 0, $1714 = 0, $1715 = 0, $1719 = 0, $1721 = 0, $1724 = 0, $1725 = 0, $173 = 0, $1734 = 0, $1735 = 0, $1739 = 0, $1741 = 0, $1742 = 0, $1746 = 0, $1747 = 0, $1748 = 0, $1749 = 0, $1750 = 0, $1751 = 0, $176 = 0, $18 = 0, $187 = 0, $188 = 0, $19 = 0, $192 = 0, $194 = 0, $195 = 0, $198 = 0, $2 = 0, $20 = 0, $205 = 0, $207 = 0, $21 = 0, $210 = 0, $214 = 0, $217 = 0, $22 = 0, $222 = 0, $223 = 0, $226 = 0, $227 = 0, $229 = 0, $23 = 0, $230 = 0, $239 = 0, $24 = 0, $242 = 0, $25 = 0, $256 = 0, $257 = 0, $259 = 0, $26 = 0, $261 = 0, $262 = 0, $27 = 0, $270 = 0, $271 = 0, $272 = 0, $273 = 0, $275 = 0, $276 = 0, $279 = 0, $28 = 0, $282 = 0, $284 = 0, $29 = 0, $294 = 0, $297 = 0, $3 = 0, $30 = 0, $305 = 0, $306 = 0, $31 = 0, $310 = 0, $311 = 0, $314 = 0, $315 = 0, $317 = 0, $32 = 0, $327 = 0, $33 = 0, $330 = 0, $335 = 0, $337 = 0, $34 = 0, $340 = 0, $344 = 0, $347 = 0, $35 = 0, $352 = 0, $353 = 0, $356 = 0, $357 = 0, $359 = 0, $36 = 0, $360 = 0, $369 = 0, $37 = 0, $372 = 0, $379 = 0, $38 = 0, $380 = 0, $381 = 0, $384 = 0, $388 = 0, $39 = 0, $391 = 0, $392 = 0, $393 = 0, $394 = 0, $396 = 0, $398 = 0, $4 = 0, $40 = 0, $402 = 0, $41 = 0, $412 = 0, $416 = 0, $417 = 0, $419 = 0, $42 = 0, $420 = 0, $428 = 0, $429 = 0, $43 = 0, $430 = 0, $431 = 0, $436 = 0, $438 = 0, $44 = 0, $442 = 0, $443 = 0, $445 = 0, $449 = 0, $45 = 0, $457 = 0, $458 = 0, $459 = 0, $46 = 0, $460 = 0, $464 = 0, $466 = 0, $469 = 0, $47 = 0, $470 = 0, $473 = 0, $477 = 0, $48 = 0, $482 = 0, $483 = 0, $49 = 0, $491 = 0, $492 = 0, $493 = 0, $494 = 0, $496 = 0, $497 = 0, $5 = 0, $50 = 0, $500 = 0, $503 = 0, $505 = 0, $51 = 0, $515 = 0, $518 = 0, $52 = 0, $524 = 0, $525 = 0, $528 = 0, $529 = 0, $53 = 0, $531 = 0, $534 = 0, $539 = 0, $54 = 0, $541 = 0, $55 = 0, $551 = 0, $558 = 0, $56 = 0, $560 = 0, $563 = 0, $567 = 0, $57 = 0, $570 = 0, $575 = 0, $576 = 0, $579 = 0, $58 = 0, $580 = 0, $582 = 0, $583 = 0, $59 = 0, $592 = 0, $595 = 0, $6 = 0, $60 = 0, $606 = 0, $607 = 0, $609 = 0, $61 = 0, $611 = 0, $612 = 0, $62 = 0, $620 = 0, $621 = 0, $622 = 0, $623 = 0, $625 = 0, $626 = 0, $629 = 0, $63 = 0, $632 = 0, $634 = 0, $64 = 0, $644 = 0, $647 = 0, $65 = 0, $650 = 0, $651 = 0, $653 = 0, $654 = 0, $657 = 0, $658 = 0, $66 = 0, $660 = 0, $663 = 0, $668 = 0, $67 = 0, $670 = 0, $68 = 0, $680 = 0, $687 = 0, $689 = 0, $69 = 0, $692 = 0, $696 = 0, $699 = 0, $7 = 0, $70 = 0, $704 = 0, $705 = 0, $708 = 0, $709 = 0, $71 = 0, $711 = 0, $712 = 0, $72 = 0, $721 = 0, $724 = 0, $73 = 0, $736 = 0, $737 = 0, $739 = 0, $74 = 0, $741 = 0, $742 = 0, $75 = 0, $750 = 0, $751 = 0, $752 = 0, $753 = 0, $756 = 0, $758 = 0, $76 = 0, $77 = 0, $774 = 0, $775 = 0, $777 = 0, $779 = 0, $78 = 0, $780 = 0, $788 = 0, $789 = 0, $79 = 0, $790 = 0, $791 = 0, $794 = 0, $796 = 0, $8 = 0, $80 = 0, $806 = 0, $807 = 0, $809 = 0, $81 = 0, $810 = 0, $815 = 0, $816 = 0, $818 = 0, $819 = 0, $821 = 0, $822 = 0, $827 = 0, $828 = 0, $83 = 0, $830 = 0, $831 = 0, $836 = 0, $837 = 0, $839 = 0, $841 = 0, $842 = 0, $85 = 0, $850 = 0, $851 = 0, $852 = 0, $853 = 0, $857 = 0, $858 = 0, $861 = 0, $863 = 0, $873 = 0, $876 = 0, $879 = 0, $880 = 0, $881 = 0, $886 = 0, $887 = 0, $889 = 0, $890 = 0, $892 = 0, $893 = 0, $895 = 0, $896 = 0, $9 = 0, $90 = 0, $901 = 0, $902 = 0, $904 = 0, $905 = 0, $907 = 0, $908 = 0, $910 = 0, $911 = 0, $913 = 0, $917 = 0, $918 = 0, $920 = 0, $924 = 0, $926 = 0, $927 = 0, $930 = 0, $936 = 0, $940 = 0, $943 = 0, $945 = 0, $946 = 0, $947 = 0, $954 = 0, $955 = 0, $961 = 0, $976 = 0, $977 = 0, $984 = 0, $985 = 0, $986 = 0, $987 = 0, $989 = 0, $993 = 0, $996 = 0, $999 = 0, $has_expr_list$0$off0$i = 0, $has_expr_list$0$off0$i$lcssa = 0, $has_init$0$off0$i513 = 0, $k$0$i621 = 0, $k$0$i622 = 0, $k1$0$i618 = 0, $op1 = 0, $op18 = 0, $op2 = 0, $op27 = 0, $op3 = 0, $parsed_gs$0$off0 = 0, $parsed_gs$0$off0$i = 0, $phitmp$i$i$i$i$i$i$i273 = 0, $phitmp$i$i$i$i$i$i32$i = 0, $phitmp$i2$i$i$i$i$i$i276 = 0, $phitmp$i2$i$i$i$i$i35$i = 0, $t$0 = 0, $t$0$i = 0, $t$0$i267 = 0, $t$0$i349567 = 0, $t$0$i390$lcssa = 0, $t$0$i390556 = 0, $t$1$i = 0, $t$1$i$lcssa = 0, $t$1$i350 = 0, $t$2$i = 0, $t$2$i351 = 0, $t$3$i512 = 0, dest = 0, label = 0, sp = 0, src = 0, stop = 0, $t$1$i$looptemp = 0, $t$2$i$looptemp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 1168 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $0 = sp + 1144 | 0; + $1 = sp + 1120 | 0; + $2 = sp + 1096 | 0; + $3 = sp + 1084 | 0; + $4 = sp + 1072 | 0; + $5 = sp + 1048 | 0; + $6 = sp + 1032 | 0; + $7 = sp + 900 | 0; + $8 = sp + 632 | 0; + $9 = sp + 620 | 0; + $10 = sp + 584 | 0; + $11 = sp + 560 | 0; + $12 = sp + 524 | 0; + $13 = sp + 1020 | 0; + $14 = sp + 1008 | 0; + $15 = sp + 996 | 0; + $16 = sp + 984 | 0; + $17 = sp + 972 | 0; + $18 = sp + 960 | 0; + $19 = sp + 948 | 0; + $20 = sp + 936 | 0; + $21 = sp + 924 | 0; + $22 = sp + 912 | 0; + $23 = sp + 888 | 0; + $24 = sp + 876 | 0; + $25 = sp + 864 | 0; + $26 = sp + 852 | 0; + $27 = sp + 840 | 0; + $28 = sp + 828 | 0; + $29 = sp + 816 | 0; + $30 = sp + 804 | 0; + $31 = sp + 792 | 0; + $32 = sp + 780 | 0; + $33 = sp + 768 | 0; + $34 = sp + 756 | 0; + $35 = sp + 744 | 0; + $op2 = sp + 732 | 0; + $op1 = sp + 720 | 0; + $36 = sp + 696 | 0; + $37 = sp + 680 | 0; + $38 = sp + 668 | 0; + $39 = sp + 656 | 0; + $40 = sp + 644 | 0; + $41 = sp + 608 | 0; + $42 = sp + 596 | 0; + $43 = sp + 548 | 0; + $44 = sp + 536 | 0; + $45 = sp + 512 | 0; + $46 = sp + 500 | 0; + $47 = sp + 488 | 0; + $48 = sp + 476 | 0; + $49 = sp + 464 | 0; + $50 = sp + 440 | 0; + $51 = sp + 424 | 0; + $52 = sp + 412 | 0; + $53 = sp + 400 | 0; + $54 = sp + 388 | 0; + $55 = sp + 376 | 0; + $56 = sp + 364 | 0; + $57 = sp + 352 | 0; + $58 = sp + 340 | 0; + $59 = sp + 328 | 0; + $60 = sp + 316 | 0; + $61 = sp + 304 | 0; + $62 = sp + 292 | 0; + $63 = sp + 280 | 0; + $64 = sp + 256 | 0; + $65 = sp + 240 | 0; + $66 = sp + 228 | 0; + $67 = sp + 216 | 0; + $68 = sp + 204 | 0; + $op3 = sp + 192 | 0; + $op27 = sp + 180 | 0; + $op18 = sp + 168 | 0; + $69 = sp + 144 | 0; + $70 = sp + 132 | 0; + $71 = sp + 120 | 0; + $72 = sp + 108 | 0; + $73 = sp + 96 | 0; + $74 = sp + 84 | 0; + $75 = sp + 72 | 0; + $76 = sp + 60 | 0; + $77 = sp + 48 | 0; + $78 = sp + 36 | 0; + $79 = sp + 24 | 0; + $80 = sp; + $81 = $last; + $83 = $81 - $first | 0; + L1 : do if (($83 | 0) > 1) { + $85 = ($83 | 0) > 3; + if ($85) if ((HEAP8[$first >> 0] | 0) == 103) { + $90 = (HEAP8[$first + 1 >> 0] | 0) == 115; + $parsed_gs$0$off0 = $90; + $t$0 = $90 ? $first + 2 | 0 : $first; + } else { + $parsed_gs$0$off0 = 0; + $t$0 = $first; + } else { + $parsed_gs$0$off0 = 0; + $t$0 = $first; + } + do switch (HEAP8[$t$0 >> 0] | 0) { + case 76: + { + $$0 = __ZN10__cxxabiv112_GLOBAL__N_118parse_expr_primaryINS0_2DbEEEPKcS4_S4_RT_($first, $last, $db) | 0; + break L1; + break; + } + case 84: + { + $$0 = __ZN10__cxxabiv112_GLOBAL__N_120parse_template_paramINS0_2DbEEEPKcS4_S4_RT_($first, $last, $db) | 0; + break L1; + break; + } + case 102: + { + $$0 = __ZN10__cxxabiv112_GLOBAL__N_120parse_function_paramINS0_2DbEEEPKcS4_S4_RT_($first, $last, $db) | 0; + break L1; + break; + } + case 97: + { + switch (HEAP8[$t$0 + 1 >> 0] | 0) { + case 97: + { + $100 = $first + 2 | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($13, 12743, 2); + $101 = __ZN10__cxxabiv112_GLOBAL__N_123parse_binary_expressionINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_($100, $last, $13, $db) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($13); + $$0 = ($101 | 0) == ($100 | 0) ? $first : $101; + break L1; + break; + } + case 100: + { + $103 = $first + 2 | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($14, 12764, 1); + $104 = __ZN10__cxxabiv112_GLOBAL__N_123parse_prefix_expressionINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_($103, $last, $14, $db) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($14); + $$0 = ($104 | 0) == ($103 | 0) ? $first : $104; + break L1; + break; + } + case 110: + { + $106 = $first + 2 | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($15, 12764, 1); + $107 = __ZN10__cxxabiv112_GLOBAL__N_123parse_binary_expressionINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_($106, $last, $15, $db) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($15); + $$0 = ($107 | 0) == ($106 | 0) ? $first : $107; + break L1; + break; + } + case 78: + { + $109 = $first + 2 | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($16, 13889, 2); + $110 = __ZN10__cxxabiv112_GLOBAL__N_123parse_binary_expressionINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_($109, $last, $16, $db) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($16); + $$0 = ($110 | 0) == ($109 | 0) ? $first : $110; + break L1; + break; + } + case 83: + { + $112 = $first + 2 | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($17, 13892, 1); + $113 = __ZN10__cxxabiv112_GLOBAL__N_123parse_binary_expressionINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_($112, $last, $17, $db) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($17); + $$0 = ($113 | 0) == ($112 | 0) ? $first : $113; + break L1; + break; + } + case 116: + { + if (($83 | 0) > 2) if ((HEAP8[$first >> 0] | 0) == 97) if ((HEAP8[$first + 1 >> 0] | 0) == 116) { + $121 = $first + 2 | 0; + $122 = __ZN10__cxxabiv112_GLOBAL__N_110parse_typeINS0_2DbEEEPKcS4_S4_RT_($121, $last, $db) | 0; + if (($122 | 0) == ($121 | 0)) $$03$i486 = $first; else { + $126 = HEAP32[$db + 4 >> 2] | 0; + if ((HEAP32[$db >> 2] | 0) == ($126 | 0)) $$03$i486 = $first; else { + $128 = $126 + -24 | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($2, $128); + $129 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc($2, 0, 13894) | 0; + HEAP32[$1 >> 2] = HEAP32[$129 >> 2]; + HEAP32[$1 + 4 >> 2] = HEAP32[$129 + 4 >> 2]; + HEAP32[$1 + 8 >> 2] = HEAP32[$129 + 8 >> 2]; + HEAP32[$129 >> 2] = 0; + HEAP32[$129 + 4 >> 2] = 0; + HEAP32[$129 + 8 >> 2] = 0; + $132 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($1, 12619) | 0; + HEAP32[$0 >> 2] = HEAP32[$132 >> 2]; + HEAP32[$0 + 4 >> 2] = HEAP32[$132 + 4 >> 2]; + HEAP32[$0 + 8 >> 2] = HEAP32[$132 + 8 >> 2]; + HEAP32[$132 >> 2] = 0; + HEAP32[$132 + 4 >> 2] = 0; + HEAP32[$132 + 8 >> 2] = 0; + do if (!(HEAP8[$128 >> 0] & 1)) { + HEAP8[$128 + 1 >> 0] = 0; + HEAP8[$128 >> 0] = 0; + } else { + $139 = $126 + -16 | 0; + HEAP8[HEAP32[$139 >> 2] >> 0] = 0; + $141 = $126 + -20 | 0; + HEAP32[$141 >> 2] = 0; + $$pre$i$i$i$i466 = HEAP8[$128 >> 0] | 0; + if (!($$pre$i$i$i$i466 & 1)) { + $148 = $$pre$i$i$i$i466; + $157 = 10; + } else { + $144 = HEAP32[$128 >> 2] | 0; + $148 = $144 & 255; + $157 = ($144 & -2) + -1 | 0; + } + if (!($148 & 1)) { + $151 = ($148 & 255) >>> 1; + if (($148 & 255) < 22) { + $156 = 10; + $1746 = 1; + $176 = $151; + } else { + $156 = ($151 + 16 & 240) + -1 | 0; + $1746 = 1; + $176 = $151; + } + } else { + $156 = 10; + $1746 = 0; + $176 = 0; + } + if (($156 | 0) != ($157 | 0)) { + if (($156 | 0) == 10) { + $163 = $128 + 1 | 0; + $164 = HEAP32[$139 >> 2] | 0; + if ($1746) { + _memcpy($163 | 0, $164 | 0, (($148 & 255) >>> 1) + 1 | 0) | 0; + _free($164); + } else { + HEAP8[$163 >> 0] = HEAP8[$164 >> 0] | 0; + _free($164); + } + HEAP8[$128 >> 0] = $176 << 1; + break; + } + $160 = $156 + 1 | 0; + $161 = _malloc($160) | 0; + if (!($156 >>> 0 <= $157 >>> 0 & ($161 | 0) == 0)) { + if ($1746) _memcpy($161 | 0, $128 + 1 | 0, (($148 & 255) >>> 1) + 1 | 0) | 0; else { + $173 = HEAP32[$139 >> 2] | 0; + HEAP8[$161 >> 0] = HEAP8[$173 >> 0] | 0; + _free($173); + } + HEAP32[$128 >> 2] = $160 | 1; + HEAP32[$141 >> 2] = $176; + HEAP32[$139 >> 2] = $161; + } + } + } while (0); + HEAP32[$128 >> 2] = HEAP32[$0 >> 2]; + HEAP32[$128 + 4 >> 2] = HEAP32[$0 + 4 >> 2]; + HEAP32[$128 + 8 >> 2] = HEAP32[$0 + 8 >> 2]; + HEAP32[$0 >> 2] = 0; + HEAP32[$0 + 4 >> 2] = 0; + HEAP32[$0 + 8 >> 2] = 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($0); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($1); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($2); + $$03$i486 = $122; + } + } + } else $$03$i486 = $first; else $$03$i486 = $first; else $$03$i486 = $first; + $$0 = $$03$i486; + break L1; + break; + } + case 122: + { + if (($83 | 0) > 2) if ((HEAP8[$first >> 0] | 0) == 97) if ((HEAP8[$first + 1 >> 0] | 0) == 122) { + $187 = $first + 2 | 0; + $188 = __ZN10__cxxabiv112_GLOBAL__N_116parse_expressionINS0_2DbEEEPKcS4_S4_RT_($187, $last, $db) | 0; + if (($188 | 0) == ($187 | 0)) $$03$i456 = $first; else { + $192 = HEAP32[$db + 4 >> 2] | 0; + if ((HEAP32[$db >> 2] | 0) == ($192 | 0)) $$03$i456 = $first; else { + $194 = $192 + -24 | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($2, $194); + $195 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc($2, 0, 13894) | 0; + HEAP32[$1 >> 2] = HEAP32[$195 >> 2]; + HEAP32[$1 + 4 >> 2] = HEAP32[$195 + 4 >> 2]; + HEAP32[$1 + 8 >> 2] = HEAP32[$195 + 8 >> 2]; + HEAP32[$195 >> 2] = 0; + HEAP32[$195 + 4 >> 2] = 0; + HEAP32[$195 + 8 >> 2] = 0; + $198 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($1, 12619) | 0; + HEAP32[$0 >> 2] = HEAP32[$198 >> 2]; + HEAP32[$0 + 4 >> 2] = HEAP32[$198 + 4 >> 2]; + HEAP32[$0 + 8 >> 2] = HEAP32[$198 + 8 >> 2]; + HEAP32[$198 >> 2] = 0; + HEAP32[$198 + 4 >> 2] = 0; + HEAP32[$198 + 8 >> 2] = 0; + do if (!(HEAP8[$194 >> 0] & 1)) { + HEAP8[$194 + 1 >> 0] = 0; + HEAP8[$194 >> 0] = 0; + } else { + $205 = $192 + -16 | 0; + HEAP8[HEAP32[$205 >> 2] >> 0] = 0; + $207 = $192 + -20 | 0; + HEAP32[$207 >> 2] = 0; + $$pre$i$i$i$i436 = HEAP8[$194 >> 0] | 0; + if (!($$pre$i$i$i$i436 & 1)) { + $214 = $$pre$i$i$i$i436; + $223 = 10; + } else { + $210 = HEAP32[$194 >> 2] | 0; + $214 = $210 & 255; + $223 = ($210 & -2) + -1 | 0; + } + if (!($214 & 1)) { + $217 = ($214 & 255) >>> 1; + if (($214 & 255) < 22) { + $1747 = 1; + $222 = 10; + $242 = $217; + } else { + $1747 = 1; + $222 = ($217 + 16 & 240) + -1 | 0; + $242 = $217; + } + } else { + $1747 = 0; + $222 = 10; + $242 = 0; + } + if (($222 | 0) != ($223 | 0)) { + if (($222 | 0) == 10) { + $229 = $194 + 1 | 0; + $230 = HEAP32[$205 >> 2] | 0; + if ($1747) { + _memcpy($229 | 0, $230 | 0, (($214 & 255) >>> 1) + 1 | 0) | 0; + _free($230); + } else { + HEAP8[$229 >> 0] = HEAP8[$230 >> 0] | 0; + _free($230); + } + HEAP8[$194 >> 0] = $242 << 1; + break; + } + $226 = $222 + 1 | 0; + $227 = _malloc($226) | 0; + if (!($222 >>> 0 <= $223 >>> 0 & ($227 | 0) == 0)) { + if ($1747) _memcpy($227 | 0, $194 + 1 | 0, (($214 & 255) >>> 1) + 1 | 0) | 0; else { + $239 = HEAP32[$205 >> 2] | 0; + HEAP8[$227 >> 0] = HEAP8[$239 >> 0] | 0; + _free($239); + } + HEAP32[$194 >> 2] = $226 | 1; + HEAP32[$207 >> 2] = $242; + HEAP32[$205 >> 2] = $227; + } + } + } while (0); + HEAP32[$194 >> 2] = HEAP32[$0 >> 2]; + HEAP32[$194 + 4 >> 2] = HEAP32[$0 + 4 >> 2]; + HEAP32[$194 + 8 >> 2] = HEAP32[$0 + 8 >> 2]; + HEAP32[$0 >> 2] = 0; + HEAP32[$0 + 4 >> 2] = 0; + HEAP32[$0 + 8 >> 2] = 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($0); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($1); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($2); + $$03$i456 = $188; + } + } + } else $$03$i456 = $first; else $$03$i456 = $first; else $$03$i456 = $first; + $$0 = $$03$i456; + break L1; + break; + } + default: + { + $$0 = $first; + break L1; + } + } + break; + } + case 99: + { + switch (HEAP8[$t$0 + 1 >> 0] | 0) { + case 99: + { + if (($83 | 0) > 2) if ((HEAP8[$first >> 0] | 0) == 99) if ((HEAP8[$first + 1 >> 0] | 0) == 99) { + $256 = $first + 2 | 0; + $257 = __ZN10__cxxabiv112_GLOBAL__N_110parse_typeINS0_2DbEEEPKcS4_S4_RT_($256, $last, $db) | 0; + if (($257 | 0) == ($256 | 0)) $$06$i426 = $first; else { + $259 = __ZN10__cxxabiv112_GLOBAL__N_116parse_expressionINS0_2DbEEEPKcS4_S4_RT_($257, $last, $db) | 0; + if (($259 | 0) == ($257 | 0)) $$06$i426 = $first; else { + $261 = $db + 4 | 0; + $262 = HEAP32[$261 >> 2] | 0; + if ((($262 - (HEAP32[$db >> 2] | 0) | 0) / 24 | 0) >>> 0 < 2) $$06$i426 = $first; else { + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($0, $262 + -24 | 0); + $270 = HEAP32[$261 >> 2] | 0; + $271 = $270 + -24 | 0; + $273 = $270; + do { + $272 = $273 + -24 | 0; + HEAP32[$261 >> 2] = $272; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($272); + $273 = HEAP32[$261 >> 2] | 0; + } while (($273 | 0) != ($271 | 0)); + $275 = $270 + -48 | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($6, $275); + $276 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc($6, 0, 13904) | 0; + HEAP32[$5 >> 2] = HEAP32[$276 >> 2]; + HEAP32[$5 + 4 >> 2] = HEAP32[$276 + 4 >> 2]; + HEAP32[$5 + 8 >> 2] = HEAP32[$276 + 8 >> 2]; + HEAP32[$276 >> 2] = 0; + HEAP32[$276 + 4 >> 2] = 0; + HEAP32[$276 + 8 >> 2] = 0; + $279 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($5, 13916) | 0; + HEAP32[$4 >> 2] = HEAP32[$279 >> 2]; + HEAP32[$4 + 4 >> 2] = HEAP32[$279 + 4 >> 2]; + HEAP32[$4 + 8 >> 2] = HEAP32[$279 + 8 >> 2]; + HEAP32[$279 >> 2] = 0; + HEAP32[$279 + 4 >> 2] = 0; + HEAP32[$279 + 8 >> 2] = 0; + $282 = HEAP8[$0 >> 0] | 0; + $284 = ($282 & 1) == 0; + $294 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($4, $284 ? $0 + 1 | 0 : HEAP32[$0 + 8 >> 2] | 0, $284 ? ($282 & 255) >>> 1 : HEAP32[$0 + 4 >> 2] | 0) | 0; + HEAP32[$3 >> 2] = HEAP32[$294 >> 2]; + HEAP32[$3 + 4 >> 2] = HEAP32[$294 + 4 >> 2]; + HEAP32[$3 + 8 >> 2] = HEAP32[$294 + 8 >> 2]; + HEAP32[$294 >> 2] = 0; + HEAP32[$294 + 4 >> 2] = 0; + HEAP32[$294 + 8 >> 2] = 0; + $297 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($3, 12619) | 0; + HEAP32[$2 >> 2] = HEAP32[$297 >> 2]; + HEAP32[$2 + 4 >> 2] = HEAP32[$297 + 4 >> 2]; + HEAP32[$2 + 8 >> 2] = HEAP32[$297 + 8 >> 2]; + HEAP32[$297 >> 2] = 0; + HEAP32[$297 + 4 >> 2] = 0; + HEAP32[$297 + 8 >> 2] = 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ENSt3__112basic_stringIcNS2_11char_traitsIcEENS0_12malloc_allocIcEEEE($1, $2); + __ZN10__cxxabiv112_GLOBAL__N_111string_pairaSEOS1_($275, $1); + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($1); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($2); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($3); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($4); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($5); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($6); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($0); + $$06$i426 = $259; + } + } + } + } else $$06$i426 = $first; else $$06$i426 = $first; else $$06$i426 = $first; + $$0 = $$06$i426; + break L1; + break; + } + case 108: + { + L97 : do if ($85) if ((HEAP8[$first >> 0] | 0) == 99) if ((HEAP8[$first + 1 >> 0] | 0) == 108) { + $305 = $first + 2 | 0; + $306 = __ZN10__cxxabiv112_GLOBAL__N_116parse_expressionINS0_2DbEEEPKcS4_S4_RT_($305, $last, $db) | 0; + if (($306 | 0) == ($305 | 0) | ($306 | 0) == ($last | 0)) $$2$i398 = $first; else { + $310 = $db + 4 | 0; + $311 = HEAP32[$310 >> 2] | 0; + if ((HEAP32[$db >> 2] | 0) == ($311 | 0)) $$2$i398 = $first; else { + $314 = $311 + -12 | 0; + $315 = HEAP8[$314 >> 0] | 0; + $317 = ($315 & 1) == 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($311 + -24 | 0, $317 ? $314 + 1 | 0 : HEAP32[$311 + -4 >> 2] | 0, $317 ? ($315 & 255) >>> 1 : HEAP32[$311 + -8 >> 2] | 0) | 0; + $327 = HEAP32[$310 >> 2] | 0; + HEAP32[$0 >> 2] = 0; + HEAP32[$0 + 4 >> 2] = 0; + HEAP32[$0 + 8 >> 2] = 0; + $330 = $327 + -12 | 0; + do if (!(HEAP8[$330 >> 0] & 1)) { + HEAP8[$330 + 1 >> 0] = 0; + HEAP8[$330 >> 0] = 0; + } else { + $335 = $327 + -4 | 0; + HEAP8[HEAP32[$335 >> 2] >> 0] = 0; + $337 = $327 + -8 | 0; + HEAP32[$337 >> 2] = 0; + $$pre$i$i$i$i372 = HEAP8[$330 >> 0] | 0; + if (!($$pre$i$i$i$i372 & 1)) { + $344 = $$pre$i$i$i$i372; + $353 = 10; + } else { + $340 = HEAP32[$330 >> 2] | 0; + $344 = $340 & 255; + $353 = ($340 & -2) + -1 | 0; + } + if (!($344 & 1)) { + $347 = ($344 & 255) >>> 1; + if (($344 & 255) < 22) { + $1748 = 1; + $352 = 10; + $372 = $347; + } else { + $1748 = 1; + $352 = ($347 + 16 & 240) + -1 | 0; + $372 = $347; + } + } else { + $1748 = 0; + $352 = 10; + $372 = 0; + } + if (($352 | 0) != ($353 | 0)) { + if (($352 | 0) == 10) { + $359 = $330 + 1 | 0; + $360 = HEAP32[$335 >> 2] | 0; + if ($1748) { + _memcpy($359 | 0, $360 | 0, (($344 & 255) >>> 1) + 1 | 0) | 0; + _free($360); + } else { + HEAP8[$359 >> 0] = HEAP8[$360 >> 0] | 0; + _free($360); + } + HEAP8[$330 >> 0] = $372 << 1; + break; + } + $356 = $352 + 1 | 0; + $357 = _malloc($356) | 0; + if (!($352 >>> 0 <= $353 >>> 0 & ($357 | 0) == 0)) { + if ($1748) _memcpy($357 | 0, $330 + 1 | 0, (($344 & 255) >>> 1) + 1 | 0) | 0; else { + $369 = HEAP32[$335 >> 2] | 0; + HEAP8[$357 >> 0] = HEAP8[$369 >> 0] | 0; + _free($369); + } + HEAP32[$330 >> 2] = $356 | 1; + HEAP32[$337 >> 2] = $372; + HEAP32[$335 >> 2] = $357; + } + } + } while (0); + HEAP32[$330 >> 2] = HEAP32[$0 >> 2]; + HEAP32[$330 + 4 >> 2] = HEAP32[$0 + 4 >> 2]; + HEAP32[$330 + 8 >> 2] = HEAP32[$0 + 8 >> 2]; + HEAP32[$0 >> 2] = 0; + HEAP32[$0 + 4 >> 2] = 0; + HEAP32[$0 + 8 >> 2] = 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($0); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc((HEAP32[$310 >> 2] | 0) + -24 | 0, 12714) | 0; + $379 = $1 + 4 | 0; + $380 = $1 + 8 | 0; + $381 = $1 + 1 | 0; + L127 : do if ((HEAP8[$306 >> 0] | 0) == 69) $t$0$i390$lcssa = $306; else { + $t$0$i390556 = $306; + while (1) { + $384 = __ZN10__cxxabiv112_GLOBAL__N_116parse_expressionINS0_2DbEEEPKcS4_S4_RT_($t$0$i390556, $last, $db) | 0; + if (($384 | 0) == ($t$0$i390556 | 0) | ($384 | 0) == ($last | 0)) { + $$2$i398 = $first; + break L97; + } + $388 = HEAP32[$310 >> 2] | 0; + if ((HEAP32[$db >> 2] | 0) == ($388 | 0)) { + $$2$i398 = $first; + break L97; + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($1, $388 + -24 | 0); + $391 = HEAP32[$310 >> 2] | 0; + $392 = $391 + -24 | 0; + $394 = $391; + do { + $393 = $394 + -24 | 0; + HEAP32[$310 >> 2] = $393; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($393); + $394 = HEAP32[$310 >> 2] | 0; + } while (($394 | 0) != ($392 | 0)); + $396 = HEAP8[$1 >> 0] | 0; + $398 = ($396 & 1) == 0; + $402 = $398 ? ($396 & 255) >>> 1 : HEAP32[$379 >> 2] | 0; + if ($402) { + if ((HEAP32[$db >> 2] | 0) == ($392 | 0)) break; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($391 + -48 | 0, $398 ? $381 : HEAP32[$380 >> 2] | 0, $402) | 0; + } + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($1); + if ((HEAP8[$384 >> 0] | 0) == 69) { + $t$0$i390$lcssa = $384; + break L127; + } else $t$0$i390556 = $384; + } + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($1); + $$2$i398 = $first; + break L97; + } while (0); + $412 = HEAP32[$310 >> 2] | 0; + if ((HEAP32[$db >> 2] | 0) == ($412 | 0)) $$2$i398 = $first; else { + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($412 + -24 | 0, 12619) | 0; + $$2$i398 = $t$0$i390$lcssa + 1 | 0; + } + } + } + } else $$2$i398 = $first; else $$2$i398 = $first; else $$2$i398 = $first; while (0); + $$0 = $$2$i398; + break L1; + break; + } + case 109: + { + $416 = $first + 2 | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($18, 13919, 1); + $417 = __ZN10__cxxabiv112_GLOBAL__N_123parse_binary_expressionINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_($416, $last, $18, $db) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($18); + $$0 = ($417 | 0) == ($416 | 0) ? $first : $417; + break L1; + break; + } + case 111: + { + $419 = $first + 2 | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($19, 12928, 1); + $420 = __ZN10__cxxabiv112_GLOBAL__N_123parse_prefix_expressionINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_($419, $last, $19, $db) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($19); + $$0 = ($420 | 0) == ($419 | 0) ? $first : $420; + break L1; + break; + } + case 118: + { + L146 : do if (($83 | 0) > 2) if ((HEAP8[$first >> 0] | 0) == 99) if ((HEAP8[$first + 1 >> 0] | 0) == 118) { + $428 = $db + 63 | 0; + $429 = HEAP8[$428 >> 0] | 0; + HEAP8[$428 >> 0] = 0; + $430 = $first + 2 | 0; + $431 = __ZN10__cxxabiv112_GLOBAL__N_110parse_typeINS0_2DbEEEPKcS4_S4_RT_($430, $last, $db) | 0; + HEAP8[$428 >> 0] = $429; + if (($431 | 0) == ($430 | 0) | ($431 | 0) == ($last | 0)) $$311$i = $first; else { + if ((HEAP8[$431 >> 0] | 0) == 95) { + $438 = $431 + 1 | 0; + if (($438 | 0) == ($last | 0)) { + $$311$i = $first; + break; + } + do if ((HEAP8[$438 >> 0] | 0) == 69) { + $442 = $db + 4 | 0; + $443 = HEAP32[$442 >> 2] | 0; + $445 = HEAP32[$db + 8 >> 2] | 0; + if ($443 >>> 0 < $445 >>> 0) { + HEAP32[$443 >> 2] = 0; + HEAP32[$443 + 4 >> 2] = 0; + HEAP32[$443 + 8 >> 2] = 0; + HEAP32[$443 + 12 >> 2] = 0; + HEAP32[$443 + 16 >> 2] = 0; + HEAP32[$443 + 20 >> 2] = 0; + HEAP32[$443 >> 2] = 0; + HEAP32[$443 + 4 >> 2] = 0; + HEAP32[$443 + 8 >> 2] = 0; + $449 = $443 + 12 | 0; + HEAP32[$449 >> 2] = 0; + HEAP32[$449 + 4 >> 2] = 0; + HEAP32[$449 + 8 >> 2] = 0; + HEAP32[$442 >> 2] = (HEAP32[$442 >> 2] | 0) + 24; + $t$1$i350 = $438; + break; + } + $457 = HEAP32[$db >> 2] | 0; + $458 = $443 - $457 | 0; + $459 = ($458 | 0) / 24 | 0; + $460 = $459 + 1 | 0; + if (($458 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $464 = ($445 - $457 | 0) / 24 | 0; + if ($464 >>> 0 < 1073741823) { + $466 = $464 << 1; + $$0$i$i$i$i348 = $466 >>> 0 < $460 >>> 0 ? $460 : $466; + } else $$0$i$i$i$i348 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($0, $$0$i$i$i$i348, $459, $db + 12 | 0); + $469 = $0 + 8 | 0; + $470 = HEAP32[$469 >> 2] | 0; + HEAP32[$470 >> 2] = 0; + HEAP32[$470 + 4 >> 2] = 0; + HEAP32[$470 + 8 >> 2] = 0; + HEAP32[$470 + 12 >> 2] = 0; + HEAP32[$470 + 16 >> 2] = 0; + HEAP32[$470 + 20 >> 2] = 0; + HEAP32[$470 >> 2] = 0; + HEAP32[$470 + 4 >> 2] = 0; + HEAP32[$470 + 8 >> 2] = 0; + $473 = $470 + 12 | 0; + HEAP32[$473 >> 2] = 0; + HEAP32[$473 + 4 >> 2] = 0; + HEAP32[$473 + 8 >> 2] = 0; + HEAP32[$469 >> 2] = $470 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $0); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($0); + $t$1$i350 = $438; + } else { + $t$0$i349567 = $438; + while (1) { + $477 = __ZN10__cxxabiv112_GLOBAL__N_116parse_expressionINS0_2DbEEEPKcS4_S4_RT_($t$0$i349567, $last, $db) | 0; + if (($477 | 0) == ($t$0$i349567 | 0) | ($477 | 0) == ($last | 0)) { + $$311$i = $first; + break L146; + } + if ((HEAP8[$477 >> 0] | 0) == 69) { + $t$1$i350 = $477; + break; + } else $t$0$i349567 = $477; + } + } while (0); + $t$2$i351 = $t$1$i350 + 1 | 0; + } else { + $436 = __ZN10__cxxabiv112_GLOBAL__N_116parse_expressionINS0_2DbEEEPKcS4_S4_RT_($431, $last, $db) | 0; + if (($436 | 0) == ($431 | 0)) { + $$311$i = $first; + break; + } else $t$2$i351 = $436; + } + $482 = $db + 4 | 0; + $483 = HEAP32[$482 >> 2] | 0; + if ((($483 - (HEAP32[$db >> 2] | 0) | 0) / 24 | 0) >>> 0 < 2) $$311$i = $first; else { + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($1, $483 + -24 | 0); + $491 = HEAP32[$482 >> 2] | 0; + $492 = $491 + -24 | 0; + $494 = $491; + do { + $493 = $494 + -24 | 0; + HEAP32[$482 >> 2] = $493; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($493); + $494 = HEAP32[$482 >> 2] | 0; + } while (($494 | 0) != ($492 | 0)); + $496 = $491 + -48 | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($7, $496); + $497 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc($7, 0, 12714) | 0; + HEAP32[$6 >> 2] = HEAP32[$497 >> 2]; + HEAP32[$6 + 4 >> 2] = HEAP32[$497 + 4 >> 2]; + HEAP32[$6 + 8 >> 2] = HEAP32[$497 + 8 >> 2]; + HEAP32[$497 >> 2] = 0; + HEAP32[$497 + 4 >> 2] = 0; + HEAP32[$497 + 8 >> 2] = 0; + $500 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($6, 13921) | 0; + HEAP32[$5 >> 2] = HEAP32[$500 >> 2]; + HEAP32[$5 + 4 >> 2] = HEAP32[$500 + 4 >> 2]; + HEAP32[$5 + 8 >> 2] = HEAP32[$500 + 8 >> 2]; + HEAP32[$500 >> 2] = 0; + HEAP32[$500 + 4 >> 2] = 0; + HEAP32[$500 + 8 >> 2] = 0; + $503 = HEAP8[$1 >> 0] | 0; + $505 = ($503 & 1) == 0; + $515 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($5, $505 ? $1 + 1 | 0 : HEAP32[$1 + 8 >> 2] | 0, $505 ? ($503 & 255) >>> 1 : HEAP32[$1 + 4 >> 2] | 0) | 0; + HEAP32[$4 >> 2] = HEAP32[$515 >> 2]; + HEAP32[$4 + 4 >> 2] = HEAP32[$515 + 4 >> 2]; + HEAP32[$4 + 8 >> 2] = HEAP32[$515 + 8 >> 2]; + HEAP32[$515 >> 2] = 0; + HEAP32[$515 + 4 >> 2] = 0; + HEAP32[$515 + 8 >> 2] = 0; + $518 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($4, 12619) | 0; + HEAP32[$3 >> 2] = HEAP32[$518 >> 2]; + HEAP32[$3 + 4 >> 2] = HEAP32[$518 + 4 >> 2]; + HEAP32[$3 + 8 >> 2] = HEAP32[$518 + 8 >> 2]; + HEAP32[$518 >> 2] = 0; + HEAP32[$518 + 4 >> 2] = 0; + HEAP32[$518 + 8 >> 2] = 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ENSt3__112basic_stringIcNS2_11char_traitsIcEENS0_12malloc_allocIcEEEE($2, $3); + __ZN10__cxxabiv112_GLOBAL__N_111string_pairaSEOS1_($496, $2); + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($2); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($3); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($4); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($5); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($6); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($7); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($1); + $$311$i = $t$2$i351; + } + } + } else $$311$i = $first; else $$311$i = $first; else $$311$i = $first; while (0); + $$0 = $$311$i; + break L1; + break; + } + default: + { + $$0 = $first; + break L1; + } + } + break; + } + case 100: + { + switch (HEAP8[$t$0 + 1 >> 0] | 0) { + case 97: + { + $524 = $t$0 + 2 | 0; + $525 = __ZN10__cxxabiv112_GLOBAL__N_116parse_expressionINS0_2DbEEEPKcS4_S4_RT_($524, $last, $db) | 0; + if (($525 | 0) == ($524 | 0)) { + $$0 = $first; + break L1; + } + $528 = $db + 4 | 0; + $529 = HEAP32[$528 >> 2] | 0; + if ((HEAP32[$db >> 2] | 0) == ($529 | 0)) { + $$0 = $first; + break L1; + } + $531 = $529 + -24 | 0; + if ($parsed_gs$0$off0) __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($22, 12902, 2); else { + HEAP32[$22 >> 2] = 0; + HEAP32[$22 + 4 >> 2] = 0; + HEAP32[$22 + 8 >> 2] = 0; + } + $534 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($22, 13924) | 0; + HEAP32[$21 >> 2] = HEAP32[$534 >> 2]; + HEAP32[$21 + 4 >> 2] = HEAP32[$534 + 4 >> 2]; + HEAP32[$21 + 8 >> 2] = HEAP32[$534 + 8 >> 2]; + HEAP32[$534 >> 2] = 0; + HEAP32[$534 + 4 >> 2] = 0; + HEAP32[$534 + 8 >> 2] = 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($23, (HEAP32[$528 >> 2] | 0) + -24 | 0); + $539 = HEAP8[$23 >> 0] | 0; + $541 = ($539 & 1) == 0; + $551 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($21, $541 ? $23 + 1 | 0 : HEAP32[$23 + 8 >> 2] | 0, $541 ? ($539 & 255) >>> 1 : HEAP32[$23 + 4 >> 2] | 0) | 0; + HEAP32[$20 >> 2] = HEAP32[$551 >> 2]; + HEAP32[$20 + 4 >> 2] = HEAP32[$551 + 4 >> 2]; + HEAP32[$20 + 8 >> 2] = HEAP32[$551 + 8 >> 2]; + HEAP32[$551 >> 2] = 0; + HEAP32[$551 + 4 >> 2] = 0; + HEAP32[$551 + 8 >> 2] = 0; + do if (!(HEAP8[$531 >> 0] & 1)) { + HEAP8[$531 + 1 >> 0] = 0; + HEAP8[$531 >> 0] = 0; + } else { + $558 = $529 + -16 | 0; + HEAP8[HEAP32[$558 >> 2] >> 0] = 0; + $560 = $529 + -20 | 0; + HEAP32[$560 >> 2] = 0; + $$pre$i$i$i = HEAP8[$531 >> 0] | 0; + if (!($$pre$i$i$i & 1)) { + $567 = $$pre$i$i$i; + $576 = 10; + } else { + $563 = HEAP32[$531 >> 2] | 0; + $567 = $563 & 255; + $576 = ($563 & -2) + -1 | 0; + } + if (!($567 & 1)) { + $570 = ($567 & 255) >>> 1; + if (($567 & 255) < 22) { + $1749 = 1; + $575 = 10; + $595 = $570; + } else { + $1749 = 1; + $575 = ($570 + 16 & 240) + -1 | 0; + $595 = $570; + } + } else { + $1749 = 0; + $575 = 10; + $595 = 0; + } + if (($575 | 0) != ($576 | 0)) { + if (($575 | 0) == 10) { + $582 = $531 + 1 | 0; + $583 = HEAP32[$558 >> 2] | 0; + if ($1749) { + _memcpy($582 | 0, $583 | 0, (($567 & 255) >>> 1) + 1 | 0) | 0; + _free($583); + } else { + HEAP8[$582 >> 0] = HEAP8[$583 >> 0] | 0; + _free($583); + } + HEAP8[$531 >> 0] = $595 << 1; + break; + } + $579 = $575 + 1 | 0; + $580 = _malloc($579) | 0; + if (!($575 >>> 0 <= $576 >>> 0 & ($580 | 0) == 0)) { + if ($1749) _memcpy($580 | 0, $531 + 1 | 0, (($567 & 255) >>> 1) + 1 | 0) | 0; else { + $592 = HEAP32[$558 >> 2] | 0; + HEAP8[$580 >> 0] = HEAP8[$592 >> 0] | 0; + _free($592); + } + HEAP32[$531 >> 2] = $579 | 1; + HEAP32[$560 >> 2] = $595; + HEAP32[$558 >> 2] = $580; + } + } + } while (0); + HEAP32[$531 >> 2] = HEAP32[$20 >> 2]; + HEAP32[$531 + 4 >> 2] = HEAP32[$20 + 4 >> 2]; + HEAP32[$531 + 8 >> 2] = HEAP32[$20 + 8 >> 2]; + HEAP32[$20 >> 2] = 0; + HEAP32[$20 + 4 >> 2] = 0; + HEAP32[$20 + 8 >> 2] = 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($20); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($23); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($21); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($22); + $$0 = $525; + break L1; + break; + } + case 99: + { + if (($83 | 0) > 2) if ((HEAP8[$first >> 0] | 0) == 100) if ((HEAP8[$first + 1 >> 0] | 0) == 99) { + $606 = $first + 2 | 0; + $607 = __ZN10__cxxabiv112_GLOBAL__N_110parse_typeINS0_2DbEEEPKcS4_S4_RT_($606, $last, $db) | 0; + if (($607 | 0) == ($606 | 0)) $$06$i345 = $first; else { + $609 = __ZN10__cxxabiv112_GLOBAL__N_116parse_expressionINS0_2DbEEEPKcS4_S4_RT_($607, $last, $db) | 0; + if (($609 | 0) == ($607 | 0)) $$06$i345 = $first; else { + $611 = $db + 4 | 0; + $612 = HEAP32[$611 >> 2] | 0; + if ((($612 - (HEAP32[$db >> 2] | 0) | 0) / 24 | 0) >>> 0 < 2) $$06$i345 = $first; else { + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($0, $612 + -24 | 0); + $620 = HEAP32[$611 >> 2] | 0; + $621 = $620 + -24 | 0; + $623 = $620; + do { + $622 = $623 + -24 | 0; + HEAP32[$611 >> 2] = $622; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($622); + $623 = HEAP32[$611 >> 2] | 0; + } while (($623 | 0) != ($621 | 0)); + $625 = $620 + -48 | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($6, $625); + $626 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc($6, 0, 13934) | 0; + HEAP32[$5 >> 2] = HEAP32[$626 >> 2]; + HEAP32[$5 + 4 >> 2] = HEAP32[$626 + 4 >> 2]; + HEAP32[$5 + 8 >> 2] = HEAP32[$626 + 8 >> 2]; + HEAP32[$626 >> 2] = 0; + HEAP32[$626 + 4 >> 2] = 0; + HEAP32[$626 + 8 >> 2] = 0; + $629 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($5, 13916) | 0; + HEAP32[$4 >> 2] = HEAP32[$629 >> 2]; + HEAP32[$4 + 4 >> 2] = HEAP32[$629 + 4 >> 2]; + HEAP32[$4 + 8 >> 2] = HEAP32[$629 + 8 >> 2]; + HEAP32[$629 >> 2] = 0; + HEAP32[$629 + 4 >> 2] = 0; + HEAP32[$629 + 8 >> 2] = 0; + $632 = HEAP8[$0 >> 0] | 0; + $634 = ($632 & 1) == 0; + $644 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($4, $634 ? $0 + 1 | 0 : HEAP32[$0 + 8 >> 2] | 0, $634 ? ($632 & 255) >>> 1 : HEAP32[$0 + 4 >> 2] | 0) | 0; + HEAP32[$3 >> 2] = HEAP32[$644 >> 2]; + HEAP32[$3 + 4 >> 2] = HEAP32[$644 + 4 >> 2]; + HEAP32[$3 + 8 >> 2] = HEAP32[$644 + 8 >> 2]; + HEAP32[$644 >> 2] = 0; + HEAP32[$644 + 4 >> 2] = 0; + HEAP32[$644 + 8 >> 2] = 0; + $647 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($3, 12619) | 0; + HEAP32[$2 >> 2] = HEAP32[$647 >> 2]; + HEAP32[$2 + 4 >> 2] = HEAP32[$647 + 4 >> 2]; + HEAP32[$2 + 8 >> 2] = HEAP32[$647 + 8 >> 2]; + HEAP32[$647 >> 2] = 0; + HEAP32[$647 + 4 >> 2] = 0; + HEAP32[$647 + 8 >> 2] = 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ENSt3__112basic_stringIcNS2_11char_traitsIcEENS0_12malloc_allocIcEEEE($1, $2); + __ZN10__cxxabiv112_GLOBAL__N_111string_pairaSEOS1_($625, $1); + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($1); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($2); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($3); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($4); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($5); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($6); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($0); + $$06$i345 = $609; + } + } + } + } else $$06$i345 = $first; else $$06$i345 = $first; else $$06$i345 = $first; + $$0 = $$06$i345; + break L1; + break; + } + case 101: + { + $650 = $first + 2 | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($24, 12759, 1); + $651 = __ZN10__cxxabiv112_GLOBAL__N_123parse_prefix_expressionINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_($650, $last, $24, $db) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($24); + $$0 = ($651 | 0) == ($650 | 0) ? $first : $651; + break L1; + break; + } + case 108: + { + $653 = $t$0 + 2 | 0; + $654 = __ZN10__cxxabiv112_GLOBAL__N_116parse_expressionINS0_2DbEEEPKcS4_S4_RT_($653, $last, $db) | 0; + if (($654 | 0) == ($653 | 0)) { + $$0 = $first; + break L1; + } + $657 = $db + 4 | 0; + $658 = HEAP32[$657 >> 2] | 0; + if ((HEAP32[$db >> 2] | 0) == ($658 | 0)) { + $$0 = $first; + break L1; + } + $660 = $658 + -24 | 0; + if ($parsed_gs$0$off0) __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($27, 12902, 2); else { + HEAP32[$27 >> 2] = 0; + HEAP32[$27 + 4 >> 2] = 0; + HEAP32[$27 + 8 >> 2] = 0; + } + $663 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($27, 13948) | 0; + HEAP32[$26 >> 2] = HEAP32[$663 >> 2]; + HEAP32[$26 + 4 >> 2] = HEAP32[$663 + 4 >> 2]; + HEAP32[$26 + 8 >> 2] = HEAP32[$663 + 8 >> 2]; + HEAP32[$663 >> 2] = 0; + HEAP32[$663 + 4 >> 2] = 0; + HEAP32[$663 + 8 >> 2] = 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($28, (HEAP32[$657 >> 2] | 0) + -24 | 0); + $668 = HEAP8[$28 >> 0] | 0; + $670 = ($668 & 1) == 0; + $680 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($26, $670 ? $28 + 1 | 0 : HEAP32[$28 + 8 >> 2] | 0, $670 ? ($668 & 255) >>> 1 : HEAP32[$28 + 4 >> 2] | 0) | 0; + HEAP32[$25 >> 2] = HEAP32[$680 >> 2]; + HEAP32[$25 + 4 >> 2] = HEAP32[$680 + 4 >> 2]; + HEAP32[$25 + 8 >> 2] = HEAP32[$680 + 8 >> 2]; + HEAP32[$680 >> 2] = 0; + HEAP32[$680 + 4 >> 2] = 0; + HEAP32[$680 + 8 >> 2] = 0; + do if (!(HEAP8[$660 >> 0] & 1)) { + HEAP8[$660 + 1 >> 0] = 0; + HEAP8[$660 >> 0] = 0; + } else { + $687 = $658 + -16 | 0; + HEAP8[HEAP32[$687 >> 2] >> 0] = 0; + $689 = $658 + -20 | 0; + HEAP32[$689 >> 2] = 0; + $$pre$i$i$i87 = HEAP8[$660 >> 0] | 0; + if (!($$pre$i$i$i87 & 1)) { + $696 = $$pre$i$i$i87; + $705 = 10; + } else { + $692 = HEAP32[$660 >> 2] | 0; + $696 = $692 & 255; + $705 = ($692 & -2) + -1 | 0; + } + if (!($696 & 1)) { + $699 = ($696 & 255) >>> 1; + if (($696 & 255) < 22) { + $1750 = 1; + $704 = 10; + $724 = $699; + } else { + $1750 = 1; + $704 = ($699 + 16 & 240) + -1 | 0; + $724 = $699; + } + } else { + $1750 = 0; + $704 = 10; + $724 = 0; + } + if (($704 | 0) != ($705 | 0)) { + if (($704 | 0) == 10) { + $711 = $660 + 1 | 0; + $712 = HEAP32[$687 >> 2] | 0; + if ($1750) { + _memcpy($711 | 0, $712 | 0, (($696 & 255) >>> 1) + 1 | 0) | 0; + _free($712); + } else { + HEAP8[$711 >> 0] = HEAP8[$712 >> 0] | 0; + _free($712); + } + HEAP8[$660 >> 0] = $724 << 1; + break; + } + $708 = $704 + 1 | 0; + $709 = _malloc($708) | 0; + if (!($704 >>> 0 <= $705 >>> 0 & ($709 | 0) == 0)) { + if ($1750) _memcpy($709 | 0, $660 + 1 | 0, (($696 & 255) >>> 1) + 1 | 0) | 0; else { + $721 = HEAP32[$687 >> 2] | 0; + HEAP8[$709 >> 0] = HEAP8[$721 >> 0] | 0; + _free($721); + } + HEAP32[$660 >> 2] = $708 | 1; + HEAP32[$689 >> 2] = $724; + HEAP32[$687 >> 2] = $709; + } + } + } while (0); + HEAP32[$660 >> 2] = HEAP32[$25 >> 2]; + HEAP32[$660 + 4 >> 2] = HEAP32[$25 + 4 >> 2]; + HEAP32[$660 + 8 >> 2] = HEAP32[$25 + 8 >> 2]; + HEAP32[$25 >> 2] = 0; + HEAP32[$25 + 4 >> 2] = 0; + HEAP32[$25 + 8 >> 2] = 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($25); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($28); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($26); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($27); + $$0 = $654; + break L1; + break; + } + case 110: + { + $$0 = __ZN10__cxxabiv112_GLOBAL__N_121parse_unresolved_nameINS0_2DbEEEPKcS4_S4_RT_($first, $last, $db) | 0; + break L1; + break; + } + case 115: + { + if (($83 | 0) > 2) if ((HEAP8[$first >> 0] | 0) == 100) if ((HEAP8[$first + 1 >> 0] | 0) == 115) { + $736 = $first + 2 | 0; + $737 = __ZN10__cxxabiv112_GLOBAL__N_116parse_expressionINS0_2DbEEEPKcS4_S4_RT_($736, $last, $db) | 0; + if (($737 | 0) == ($736 | 0)) $$02$i317 = $first; else { + $739 = __ZN10__cxxabiv112_GLOBAL__N_116parse_expressionINS0_2DbEEEPKcS4_S4_RT_($737, $last, $db) | 0; + if (($739 | 0) == ($737 | 0)) $$02$i317 = $first; else { + $741 = $db + 4 | 0; + $742 = HEAP32[$741 >> 2] | 0; + if ((($742 - (HEAP32[$db >> 2] | 0) | 0) / 24 | 0) >>> 0 < 2) $$02$i317 = $first; else { + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($0, $742 + -24 | 0); + $750 = HEAP32[$741 >> 2] | 0; + $751 = $750 + -24 | 0; + $753 = $750; + do { + $752 = $753 + -24 | 0; + HEAP32[$741 >> 2] = $752; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($752); + $753 = HEAP32[$741 >> 2] | 0; + } while (($753 | 0) != ($751 | 0)); + __ZNSt3__1plIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEENS_12basic_stringIT_T0_T1_EEPKS8_RKSB_($1, 13956, $0); + $756 = HEAP8[$1 >> 0] | 0; + $758 = ($756 & 1) == 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($750 + -48 | 0, $758 ? $1 + 1 | 0 : HEAP32[$1 + 8 >> 2] | 0, $758 ? ($756 & 255) >>> 1 : HEAP32[$1 + 4 >> 2] | 0) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($1); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($0); + $$02$i317 = $739; + } + } + } + } else $$02$i317 = $first; else $$02$i317 = $first; else $$02$i317 = $first; + $$0 = $$02$i317; + break L1; + break; + } + case 116: + { + if (($83 | 0) > 2) if ((HEAP8[$first >> 0] | 0) == 100) if ((HEAP8[$first + 1 >> 0] | 0) == 116) { + $774 = $first + 2 | 0; + $775 = __ZN10__cxxabiv112_GLOBAL__N_116parse_expressionINS0_2DbEEEPKcS4_S4_RT_($774, $last, $db) | 0; + if (($775 | 0) == ($774 | 0)) $$02$i310 = $first; else { + $777 = __ZN10__cxxabiv112_GLOBAL__N_121parse_unresolved_nameINS0_2DbEEEPKcS4_S4_RT_($775, $last, $db) | 0; + if (($777 | 0) == ($775 | 0)) $$02$i310 = $first; else { + $779 = $db + 4 | 0; + $780 = HEAP32[$779 >> 2] | 0; + if ((($780 - (HEAP32[$db >> 2] | 0) | 0) / 24 | 0) >>> 0 < 2) $$02$i310 = $first; else { + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($0, $780 + -24 | 0); + $788 = HEAP32[$779 >> 2] | 0; + $789 = $788 + -24 | 0; + $791 = $788; + do { + $790 = $791 + -24 | 0; + HEAP32[$779 >> 2] = $790; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($790); + $791 = HEAP32[$779 >> 2] | 0; + } while (($791 | 0) != ($789 | 0)); + __ZNSt3__1plIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEENS_12basic_stringIT_T0_T1_EEPKS8_RKSB_($1, 18335, $0); + $794 = HEAP8[$1 >> 0] | 0; + $796 = ($794 & 1) == 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($788 + -48 | 0, $796 ? $1 + 1 | 0 : HEAP32[$1 + 8 >> 2] | 0, $796 ? ($794 & 255) >>> 1 : HEAP32[$1 + 4 >> 2] | 0) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($1); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($0); + $$02$i310 = $777; + } + } + } + } else $$02$i310 = $first; else $$02$i310 = $first; else $$02$i310 = $first; + $$0 = $$02$i310; + break L1; + break; + } + case 118: + { + $806 = $first + 2 | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($29, 13959, 1); + $807 = __ZN10__cxxabiv112_GLOBAL__N_123parse_binary_expressionINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_($806, $last, $29, $db) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($29); + $$0 = ($807 | 0) == ($806 | 0) ? $first : $807; + break L1; + break; + } + case 86: + { + $809 = $first + 2 | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($30, 13961, 2); + $810 = __ZN10__cxxabiv112_GLOBAL__N_123parse_binary_expressionINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_($809, $last, $30, $db) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($30); + $$0 = ($810 | 0) == ($809 | 0) ? $first : $810; + break L1; + break; + } + default: + { + $$0 = $first; + break L1; + } + } + break; + } + case 101: + { + switch (HEAP8[$t$0 + 1 >> 0] | 0) { + case 111: + { + $815 = $first + 2 | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($31, 13964, 1); + $816 = __ZN10__cxxabiv112_GLOBAL__N_123parse_binary_expressionINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_($815, $last, $31, $db) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($31); + $$0 = ($816 | 0) == ($815 | 0) ? $first : $816; + break L1; + break; + } + case 79: + { + $818 = $first + 2 | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($32, 13966, 2); + $819 = __ZN10__cxxabiv112_GLOBAL__N_123parse_binary_expressionINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_($818, $last, $32, $db) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($32); + $$0 = ($819 | 0) == ($818 | 0) ? $first : $819; + break L1; + break; + } + case 113: + { + $821 = $first + 2 | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($33, 13969, 2); + $822 = __ZN10__cxxabiv112_GLOBAL__N_123parse_binary_expressionINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_($821, $last, $33, $db) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($33); + $$0 = ($822 | 0) == ($821 | 0) ? $first : $822; + break L1; + break; + } + default: + { + $$0 = $first; + break L1; + } + } + break; + } + case 103: + { + switch (HEAP8[$t$0 + 1 >> 0] | 0) { + case 101: + { + $827 = $first + 2 | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($34, 13972, 2); + $828 = __ZN10__cxxabiv112_GLOBAL__N_123parse_binary_expressionINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_($827, $last, $34, $db) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($34); + $$0 = ($828 | 0) == ($827 | 0) ? $first : $828; + break L1; + break; + } + case 116: + { + $830 = $first + 2 | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($35, 12778, 1); + $831 = __ZN10__cxxabiv112_GLOBAL__N_123parse_binary_expressionINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_($830, $last, $35, $db) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($35); + $$0 = ($831 | 0) == ($830 | 0) ? $first : $831; + break L1; + break; + } + default: + { + $$0 = $first; + break L1; + } + } + break; + } + case 105: + { + if ((HEAP8[$t$0 + 1 >> 0] | 0) != 120) { + $$0 = $first; + break L1; + } + $836 = $first + 2 | 0; + $837 = __ZN10__cxxabiv112_GLOBAL__N_116parse_expressionINS0_2DbEEEPKcS4_S4_RT_($836, $last, $db) | 0; + if (($837 | 0) == ($836 | 0)) { + $$0 = $first; + break L1; + } + $839 = __ZN10__cxxabiv112_GLOBAL__N_116parse_expressionINS0_2DbEEEPKcS4_S4_RT_($837, $last, $db) | 0; + $841 = $db + 4 | 0; + $842 = HEAP32[$841 >> 2] | 0; + if (($839 | 0) == ($837 | 0)) { + $879 = $842 + -24 | 0; + $881 = $842; + while (1) { + $880 = $881 + -24 | 0; + HEAP32[$841 >> 2] = $880; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($880); + $881 = HEAP32[$841 >> 2] | 0; + if (($881 | 0) == ($879 | 0)) { + $$0 = $first; + break L1; + } + } + } + if ((($842 - (HEAP32[$db >> 2] | 0) | 0) / 24 | 0) >>> 0 < 2) { + $$0 = $first; + break L1; + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($op2, $842 + -24 | 0); + $850 = HEAP32[$841 >> 2] | 0; + $851 = $850 + -24 | 0; + $853 = $850; + do { + $852 = $853 + -24 | 0; + HEAP32[$841 >> 2] = $852; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($852); + $853 = HEAP32[$841 >> 2] | 0; + } while (($853 | 0) != ($851 | 0)); + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($op1, $850 + -48 | 0); + $857 = (HEAP32[$841 >> 2] | 0) + -24 | 0; + __ZNSt3__1plIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEENS_12basic_stringIT_T0_T1_EEPKS8_RKSB_($40, 12714, $op1); + $858 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($40, 13975) | 0; + HEAP32[$39 >> 2] = HEAP32[$858 >> 2]; + HEAP32[$39 + 4 >> 2] = HEAP32[$858 + 4 >> 2]; + HEAP32[$39 + 8 >> 2] = HEAP32[$858 + 8 >> 2]; + HEAP32[$858 >> 2] = 0; + HEAP32[$858 + 4 >> 2] = 0; + HEAP32[$858 + 8 >> 2] = 0; + $861 = HEAP8[$op2 >> 0] | 0; + $863 = ($861 & 1) == 0; + $873 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($39, $863 ? $op2 + 1 | 0 : HEAP32[$op2 + 8 >> 2] | 0, $863 ? ($861 & 255) >>> 1 : HEAP32[$op2 + 4 >> 2] | 0) | 0; + HEAP32[$38 >> 2] = HEAP32[$873 >> 2]; + HEAP32[$38 + 4 >> 2] = HEAP32[$873 + 4 >> 2]; + HEAP32[$38 + 8 >> 2] = HEAP32[$873 + 8 >> 2]; + HEAP32[$873 >> 2] = 0; + HEAP32[$873 + 4 >> 2] = 0; + HEAP32[$873 + 8 >> 2] = 0; + $876 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($38, 12703) | 0; + HEAP32[$37 >> 2] = HEAP32[$876 >> 2]; + HEAP32[$37 + 4 >> 2] = HEAP32[$876 + 4 >> 2]; + HEAP32[$37 + 8 >> 2] = HEAP32[$876 + 8 >> 2]; + HEAP32[$876 >> 2] = 0; + HEAP32[$876 + 4 >> 2] = 0; + HEAP32[$876 + 8 >> 2] = 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ENSt3__112basic_stringIcNS2_11char_traitsIcEENS0_12malloc_allocIcEEEE($36, $37); + __ZN10__cxxabiv112_GLOBAL__N_111string_pairaSEOS1_($857, $36); + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($36); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($37); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($38); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($39); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($40); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($op1); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($op2); + $$0 = $839; + break L1; + break; + } + case 108: + { + switch (HEAP8[$t$0 + 1 >> 0] | 0) { + case 101: + { + $886 = $first + 2 | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($41, 13978, 2); + $887 = __ZN10__cxxabiv112_GLOBAL__N_123parse_binary_expressionINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_($886, $last, $41, $db) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($41); + $$0 = ($887 | 0) == ($886 | 0) ? $first : $887; + break L1; + break; + } + case 115: + { + $889 = $first + 2 | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($42, 13981, 2); + $890 = __ZN10__cxxabiv112_GLOBAL__N_123parse_binary_expressionINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_($889, $last, $42, $db) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($42); + $$0 = ($890 | 0) == ($889 | 0) ? $first : $890; + break L1; + break; + } + case 83: + { + $892 = $first + 2 | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($43, 13984, 3); + $893 = __ZN10__cxxabiv112_GLOBAL__N_123parse_binary_expressionINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_($892, $last, $43, $db) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($43); + $$0 = ($893 | 0) == ($892 | 0) ? $first : $893; + break L1; + break; + } + case 116: + { + $895 = $first + 2 | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($44, 12776, 1); + $896 = __ZN10__cxxabiv112_GLOBAL__N_123parse_binary_expressionINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_($895, $last, $44, $db) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($44); + $$0 = ($896 | 0) == ($895 | 0) ? $first : $896; + break L1; + break; + } + default: + { + $$0 = $first; + break L1; + } + } + break; + } + case 109: + { + switch (HEAP8[$t$0 + 1 >> 0] | 0) { + case 105: + { + $901 = $first + 2 | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($45, 13988, 1); + $902 = __ZN10__cxxabiv112_GLOBAL__N_123parse_binary_expressionINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_($901, $last, $45, $db) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($45); + $$0 = ($902 | 0) == ($901 | 0) ? $first : $902; + break L1; + break; + } + case 73: + { + $904 = $first + 2 | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($46, 13990, 2); + $905 = __ZN10__cxxabiv112_GLOBAL__N_123parse_binary_expressionINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_($904, $last, $46, $db) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($46); + $$0 = ($905 | 0) == ($904 | 0) ? $first : $905; + break L1; + break; + } + case 108: + { + $907 = $first + 2 | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($47, 12759, 1); + $908 = __ZN10__cxxabiv112_GLOBAL__N_123parse_binary_expressionINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_($907, $last, $47, $db) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($47); + $$0 = ($908 | 0) == ($907 | 0) ? $first : $908; + break L1; + break; + } + case 76: + { + $910 = $first + 2 | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($48, 13993, 2); + $911 = __ZN10__cxxabiv112_GLOBAL__N_123parse_binary_expressionINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_($910, $last, $48, $db) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($48); + $$0 = ($911 | 0) == ($910 | 0) ? $first : $911; + break L1; + break; + } + case 109: + { + $913 = $first + 2 | 0; + if (($913 | 0) != ($last | 0)) if ((HEAP8[$913 >> 0] | 0) == 95) { + $917 = $first + 3 | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($49, 13996, 2); + $918 = __ZN10__cxxabiv112_GLOBAL__N_123parse_prefix_expressionINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_($917, $last, $49, $db) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($49); + $$0 = ($918 | 0) == ($917 | 0) ? $first : $918; + break L1; + } + $920 = __ZN10__cxxabiv112_GLOBAL__N_116parse_expressionINS0_2DbEEEPKcS4_S4_RT_($913, $last, $db) | 0; + if (($920 | 0) == ($913 | 0)) { + $$0 = $first; + break L1; + } + $924 = HEAP32[$db + 4 >> 2] | 0; + if ((HEAP32[$db >> 2] | 0) == ($924 | 0)) { + $$0 = $first; + break L1; + } + $926 = $924 + -24 | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($53, $926); + $927 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc($53, 0, 12714) | 0; + HEAP32[$52 >> 2] = HEAP32[$927 >> 2]; + HEAP32[$52 + 4 >> 2] = HEAP32[$927 + 4 >> 2]; + HEAP32[$52 + 8 >> 2] = HEAP32[$927 + 8 >> 2]; + HEAP32[$927 >> 2] = 0; + HEAP32[$927 + 4 >> 2] = 0; + HEAP32[$927 + 8 >> 2] = 0; + $930 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($52, 13999) | 0; + HEAP32[$51 >> 2] = HEAP32[$930 >> 2]; + HEAP32[$51 + 4 >> 2] = HEAP32[$930 + 4 >> 2]; + HEAP32[$51 + 8 >> 2] = HEAP32[$930 + 8 >> 2]; + HEAP32[$930 >> 2] = 0; + HEAP32[$930 + 4 >> 2] = 0; + HEAP32[$930 + 8 >> 2] = 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ENSt3__112basic_stringIcNS2_11char_traitsIcEENS0_12malloc_allocIcEEEE($50, $51); + __ZN10__cxxabiv112_GLOBAL__N_111string_pairaSEOS1_($926, $50); + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($50); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($51); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($52); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($53); + $$0 = $920; + break L1; + break; + } + default: + { + $$0 = $first; + break L1; + } + } + break; + } + case 110: + { + switch (HEAP8[$t$0 + 1 >> 0] | 0) { + case 119: + case 97: + { + L323 : do if ($85) { + $936 = HEAP8[$first >> 0] | 0; + if ($936 << 24 >> 24 == 103) { + $940 = (HEAP8[$first + 1 >> 0] | 0) == 115; + $$first$i = $940 ? $first + 2 | 0 : $first; + $943 = HEAP8[$$first$i >> 0] | 0; + $parsed_gs$0$off0$i = $940; + $t$0$i267 = $$first$i; + } else { + $943 = $936; + $parsed_gs$0$off0$i = 0; + $t$0$i267 = $first; + } + if ($943 << 24 >> 24 == 110) { + $945 = HEAP8[$t$0$i267 + 1 >> 0] | 0; + switch ($945 << 24 >> 24) { + case 97: + case 119: + break; + default: + { + $$221$i = $first; + label = 319; + break L323; + } + } + $946 = $945 << 24 >> 24 == 97; + $947 = $t$0$i267 + 2 | 0; + if (($947 | 0) == ($last | 0)) $$9$i = $first; else { + $has_expr_list$0$off0$i = 0; + $t$1$i = $947; + while (1) { + if ((HEAP8[$t$1$i >> 0] | 0) == 95) { + $has_expr_list$0$off0$i$lcssa = $has_expr_list$0$off0$i; + $t$1$i$lcssa = $t$1$i; + break; + } + $t$1$i$looptemp = $t$1$i; + $t$1$i = __ZN10__cxxabiv112_GLOBAL__N_116parse_expressionINS0_2DbEEEPKcS4_S4_RT_($t$1$i, $last, $db) | 0; + if (($t$1$i | 0) == ($t$1$i$looptemp | 0) | ($t$1$i | 0) == ($last | 0)) { + $$9$i = $first; + break L323; + } else $has_expr_list$0$off0$i = 1; + } + $954 = $t$1$i$lcssa + 1 | 0; + $955 = __ZN10__cxxabiv112_GLOBAL__N_110parse_typeINS0_2DbEEEPKcS4_S4_RT_($954, $last, $db) | 0; + if (($955 | 0) == ($954 | 0) | ($955 | 0) == ($last | 0)) $$9$i = $first; else { + $961 = HEAP8[$955 >> 0] | 0; + L335 : do if (($81 - $955 | 0) > 2 & $961 << 24 >> 24 == 112) { + if ((HEAP8[$955 + 1 >> 0] | 0) != 105) { + $$9$i = $first; + break L323; + } + $t$2$i = $955 + 2 | 0; + while (1) { + if ((HEAP8[$t$2$i >> 0] | 0) == 69) { + $has_init$0$off0$i513 = 1; + $t$3$i512 = $t$2$i; + break L335; + } + $t$2$i$looptemp = $t$2$i; + $t$2$i = __ZN10__cxxabiv112_GLOBAL__N_116parse_expressionINS0_2DbEEEPKcS4_S4_RT_($t$2$i, $last, $db) | 0; + if (($t$2$i | 0) == ($t$2$i$looptemp | 0) | ($t$2$i | 0) == ($last | 0)) { + $$9$i = $first; + break L323; + } + } + } else if ($961 << 24 >> 24 == 69) { + $has_init$0$off0$i513 = 0; + $t$3$i512 = $955; + } else { + $$9$i = $first; + break L323; + } while (0); + HEAP32[$1 >> 2] = 0; + HEAP32[$1 + 4 >> 2] = 0; + HEAP32[$1 + 8 >> 2] = 0; + if ($has_init$0$off0$i513) { + $976 = $db + 4 | 0; + $977 = HEAP32[$976 >> 2] | 0; + if ((HEAP32[$db >> 2] | 0) != ($977 | 0)) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($2, $977 + -24 | 0); + L346 : do if (!(HEAP8[$1 >> 0] & 1)) { + HEAP8[$1 + 1 >> 0] = 0; + HEAP8[$1 >> 0] = 0; + } else { + $984 = $1 + 8 | 0; + $985 = HEAP32[$984 >> 2] | 0; + HEAP8[$985 >> 0] = 0; + $986 = $1 + 4 | 0; + HEAP32[$986 >> 2] = 0; + $987 = HEAP32[$1 >> 2] | 0; + $phitmp$i$i$i$i$i$i$i273 = ($987 & -2) + -1 | 0; + $989 = $987 & 255; + do if (!($989 & 1)) { + $993 = $987 >>> 1 & 127; + if (($989 & 255) < 22) { + _memcpy($1 + 1 | 0, $985 | 0, ($987 >>> 1 & 127) + 1 | 0) | 0; + _free($985); + $$ph518 = $993; + break; + } + $996 = $993 + 16 & 240; + $phitmp$i2$i$i$i$i$i$i276 = $996 + -1 | 0; + if (($phitmp$i2$i$i$i$i$i$i276 | 0) == ($phitmp$i$i$i$i$i$i$i273 | 0)) break L346; + $999 = _malloc($996) | 0; + if ($phitmp$i2$i$i$i$i$i$i276 >>> 0 <= $phitmp$i$i$i$i$i$i$i273 >>> 0 & ($999 | 0) == 0) break L346; + _memcpy($999 | 0, $1 + 1 | 0, ($987 >>> 1 & 127) + 1 | 0) | 0; + HEAP32[$1 >> 2] = $996 | 1; + HEAP32[$986 >> 2] = $993; + HEAP32[$984 >> 2] = $999; + break L346; + } else { + HEAP8[$1 + 1 >> 0] = 0; + _free($985); + $$ph518 = 0; + } while (0); + HEAP8[$1 >> 0] = $$ph518 << 1; + } while (0); + HEAP32[$1 >> 2] = HEAP32[$2 >> 2]; + HEAP32[$1 + 4 >> 2] = HEAP32[$2 + 4 >> 2]; + HEAP32[$1 + 8 >> 2] = HEAP32[$2 + 8 >> 2]; + HEAP32[$2 >> 2] = 0; + HEAP32[$2 + 4 >> 2] = 0; + HEAP32[$2 + 8 >> 2] = 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($2); + $1015 = HEAP32[$976 >> 2] | 0; + $1016 = $1015 + -24 | 0; + $1018 = $1015; + do { + $1017 = $1018 + -24 | 0; + HEAP32[$976 >> 2] = $1017; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($1017); + $1018 = HEAP32[$976 >> 2] | 0; + } while (($1018 | 0) != ($1016 | 0)); + $$pre$phi511Z2D = $976; + $$pre$phiZ2D = $db; + $1022 = $1016; + label = 283; + } + } else { + $$phi$trans$insert = $db + 4 | 0; + $$pre$phi511Z2D = $$phi$trans$insert; + $$pre$phiZ2D = $db; + $1022 = HEAP32[$$phi$trans$insert >> 2] | 0; + label = 283; + } + if ((label | 0) == 283) if ((HEAP32[$$pre$phiZ2D >> 2] | 0) != ($1022 | 0)) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($3, $1022 + -24 | 0); + $1024 = HEAP32[$$pre$phi511Z2D >> 2] | 0; + $1025 = $1024 + -24 | 0; + $1027 = $1024; + do { + $1026 = $1027 + -24 | 0; + HEAP32[$$pre$phi511Z2D >> 2] = $1026; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($1026); + $1027 = HEAP32[$$pre$phi511Z2D >> 2] | 0; + } while (($1027 | 0) != ($1025 | 0)); + HEAP32[$4 >> 2] = 0; + HEAP32[$4 + 4 >> 2] = 0; + HEAP32[$4 + 8 >> 2] = 0; + if ($has_expr_list$0$off0$i$lcssa) if ((HEAP32[$$pre$phiZ2D >> 2] | 0) == ($1025 | 0)) { + $$019$i = $first; + $$2$i302 = 0; + } else { + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($5, $1024 + -48 | 0); + L371 : do if (!(HEAP8[$4 >> 0] & 1)) { + HEAP8[$4 + 1 >> 0] = 0; + HEAP8[$4 >> 0] = 0; + } else { + $1038 = $4 + 8 | 0; + $1039 = HEAP32[$1038 >> 2] | 0; + HEAP8[$1039 >> 0] = 0; + $1040 = $4 + 4 | 0; + HEAP32[$1040 >> 2] = 0; + $1041 = HEAP32[$4 >> 2] | 0; + $phitmp$i$i$i$i$i$i32$i = ($1041 & -2) + -1 | 0; + $1043 = $1041 & 255; + do if (!($1043 & 1)) { + $1047 = $1041 >>> 1 & 127; + if (($1043 & 255) < 22) { + _memcpy($4 + 1 | 0, $1039 | 0, ($1041 >>> 1 & 127) + 1 | 0) | 0; + _free($1039); + $$ph520524 = $1047; + break; + } + $1050 = $1047 + 16 & 240; + $phitmp$i2$i$i$i$i$i35$i = $1050 + -1 | 0; + if (($phitmp$i2$i$i$i$i$i35$i | 0) == ($phitmp$i$i$i$i$i$i32$i | 0)) break L371; + $1053 = _malloc($1050) | 0; + if ($phitmp$i2$i$i$i$i$i35$i >>> 0 <= $phitmp$i$i$i$i$i$i32$i >>> 0 & ($1053 | 0) == 0) break L371; + _memcpy($1053 | 0, $4 + 1 | 0, ($1041 >>> 1 & 127) + 1 | 0) | 0; + HEAP32[$4 >> 2] = $1050 | 1; + HEAP32[$1040 >> 2] = $1047; + HEAP32[$1038 >> 2] = $1053; + break L371; + } else { + HEAP8[$4 + 1 >> 0] = 0; + _free($1039); + $$ph520524 = 0; + } while (0); + HEAP8[$4 >> 0] = $$ph520524 << 1; + } while (0); + HEAP32[$4 >> 2] = HEAP32[$5 >> 2]; + HEAP32[$4 + 4 >> 2] = HEAP32[$5 + 4 >> 2]; + HEAP32[$4 + 8 >> 2] = HEAP32[$5 + 8 >> 2]; + HEAP32[$5 >> 2] = 0; + HEAP32[$5 + 4 >> 2] = 0; + HEAP32[$5 + 8 >> 2] = 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($5); + $1069 = HEAP32[$$pre$phi511Z2D >> 2] | 0; + $1070 = $1069 + -24 | 0; + $1072 = $1069; + do { + $1071 = $1072 + -24 | 0; + HEAP32[$$pre$phi511Z2D >> 2] = $1071; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($1071); + $1072 = HEAP32[$$pre$phi511Z2D >> 2] | 0; + } while (($1072 | 0) != ($1070 | 0)); + label = 300; + } else label = 300; + if ((label | 0) == 300) { + HEAP32[$6 >> 2] = 0; + HEAP32[$6 + 4 >> 2] = 0; + HEAP32[$6 + 8 >> 2] = 0; + if ($parsed_gs$0$off0$i) __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6assignEPKcj($6, 12902, 2); + if ($946) __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($6, 14003) | 0; else __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($6, 12726) | 0; + if ($has_expr_list$0$off0$i$lcssa) { + __ZNSt3__1plIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEENS_12basic_stringIT_T0_T1_EEPKS8_RKSB_($8, 12714, $4); + $1076 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($8, 14007) | 0; + HEAP32[$7 >> 2] = HEAP32[$1076 >> 2]; + HEAP32[$7 + 4 >> 2] = HEAP32[$1076 + 4 >> 2]; + HEAP32[$7 + 8 >> 2] = HEAP32[$1076 + 8 >> 2]; + HEAP32[$1076 >> 2] = 0; + HEAP32[$1076 + 4 >> 2] = 0; + HEAP32[$1076 + 8 >> 2] = 0; + $1079 = HEAP8[$7 >> 0] | 0; + $1081 = ($1079 & 1) == 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($6, $1081 ? $7 + 1 | 0 : HEAP32[$7 + 8 >> 2] | 0, $1081 ? ($1079 & 255) >>> 1 : HEAP32[$7 + 4 >> 2] | 0) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($7); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($8); + } + $1091 = HEAP8[$3 >> 0] | 0; + $1093 = ($1091 & 1) == 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($6, $1093 ? $3 + 1 | 0 : HEAP32[$3 + 8 >> 2] | 0, $1093 ? ($1091 & 255) >>> 1 : HEAP32[$3 + 4 >> 2] | 0) | 0; + if ($has_init$0$off0$i513) { + __ZNSt3__1plIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEENS_12basic_stringIT_T0_T1_EEPKS8_RKSB_($10, 12616, $1); + $1103 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($10, 12619) | 0; + HEAP32[$9 >> 2] = HEAP32[$1103 >> 2]; + HEAP32[$9 + 4 >> 2] = HEAP32[$1103 + 4 >> 2]; + HEAP32[$9 + 8 >> 2] = HEAP32[$1103 + 8 >> 2]; + HEAP32[$1103 >> 2] = 0; + HEAP32[$1103 + 4 >> 2] = 0; + HEAP32[$1103 + 8 >> 2] = 0; + $1106 = HEAP8[$9 >> 0] | 0; + $1108 = ($1106 & 1) == 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($6, $1108 ? $9 + 1 | 0 : HEAP32[$9 + 8 >> 2] | 0, $1108 ? ($1106 & 255) >>> 1 : HEAP32[$9 + 4 >> 2] | 0) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($9); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($10); + }; + HEAP32[$12 >> 2] = HEAP32[$6 >> 2]; + HEAP32[$12 + 4 >> 2] = HEAP32[$6 + 4 >> 2]; + HEAP32[$12 + 8 >> 2] = HEAP32[$6 + 8 >> 2]; + HEAP32[$6 >> 2] = 0; + HEAP32[$6 + 4 >> 2] = 0; + HEAP32[$6 + 8 >> 2] = 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ENSt3__112basic_stringIcNS2_11char_traitsIcEENS0_12malloc_allocIcEEEE($11, $12); + $1120 = HEAP32[$$pre$phi511Z2D >> 2] | 0; + $1122 = HEAP32[$db + 8 >> 2] | 0; + if ($1120 >>> 0 < $1122 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($1120, $11); + HEAP32[$$pre$phi511Z2D >> 2] = (HEAP32[$$pre$phi511Z2D >> 2] | 0) + 24; + } else { + $1129 = HEAP32[$$pre$phiZ2D >> 2] | 0; + $1130 = $1120 - $1129 | 0; + $1131 = ($1130 | 0) / 24 | 0; + $1132 = $1131 + 1 | 0; + if (($1130 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $1136 = ($1122 - $1129 | 0) / 24 | 0; + if ($1136 >>> 0 < 1073741823) { + $1138 = $1136 << 1; + $$0$i$i$i$i299 = $1138 >>> 0 < $1132 >>> 0 ? $1132 : $1138; + } else $$0$i$i$i$i299 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($0, $$0$i$i$i$i299, $1131, $db + 12 | 0); + $1141 = $0 + 8 | 0; + $1142 = HEAP32[$1141 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($1142, $11); + HEAP32[$1141 >> 2] = $1142 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $0); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($0); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($11); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($12); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($6); + $$019$i = $t$3$i512 + 1 | 0; + $$2$i302 = 1; + } + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($4); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($3); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($1); + if ($$2$i302) { + $$221$i = $$019$i; + label = 319; + break; + } else { + $$9$i = $first; + break; + } + } + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($1); + $$9$i = $first; + } + } + } else { + $$221$i = $first; + label = 319; + } + } else { + $$221$i = $first; + label = 319; + } while (0); + if ((label | 0) == 319) $$9$i = $$221$i; + $$0 = $$9$i; + break L1; + break; + } + case 101: + { + $1145 = $first + 2 | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($54, 14010, 2); + $1146 = __ZN10__cxxabiv112_GLOBAL__N_123parse_binary_expressionINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_($1145, $last, $54, $db) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($54); + $$0 = ($1146 | 0) == ($1145 | 0) ? $first : $1146; + break L1; + break; + } + case 103: + { + $1148 = $first + 2 | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($55, 13988, 1); + $1149 = __ZN10__cxxabiv112_GLOBAL__N_123parse_prefix_expressionINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_($1148, $last, $55, $db) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($55); + $$0 = ($1149 | 0) == ($1148 | 0) ? $first : $1149; + break L1; + break; + } + case 116: + { + $1151 = $first + 2 | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($56, 14013, 1); + $1152 = __ZN10__cxxabiv112_GLOBAL__N_123parse_prefix_expressionINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_($1151, $last, $56, $db) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($56); + $$0 = ($1152 | 0) == ($1151 | 0) ? $first : $1152; + break L1; + break; + } + case 120: + { + $1154 = $first + 2 | 0; + $1155 = __ZN10__cxxabiv112_GLOBAL__N_116parse_expressionINS0_2DbEEEPKcS4_S4_RT_($1154, $last, $db) | 0; + if (($1155 | 0) == ($1154 | 0)) $$03$i265 = $1154; else { + $1159 = HEAP32[$db + 4 >> 2] | 0; + if ((HEAP32[$db >> 2] | 0) == ($1159 | 0)) $$03$i265 = $1154; else { + $1161 = $1159 + -24 | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($2, $1161); + $1162 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc($2, 0, 14015) | 0; + HEAP32[$1 >> 2] = HEAP32[$1162 >> 2]; + HEAP32[$1 + 4 >> 2] = HEAP32[$1162 + 4 >> 2]; + HEAP32[$1 + 8 >> 2] = HEAP32[$1162 + 8 >> 2]; + HEAP32[$1162 >> 2] = 0; + HEAP32[$1162 + 4 >> 2] = 0; + HEAP32[$1162 + 8 >> 2] = 0; + $1165 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($1, 12619) | 0; + HEAP32[$0 >> 2] = HEAP32[$1165 >> 2]; + HEAP32[$0 + 4 >> 2] = HEAP32[$1165 + 4 >> 2]; + HEAP32[$0 + 8 >> 2] = HEAP32[$1165 + 8 >> 2]; + HEAP32[$1165 >> 2] = 0; + HEAP32[$1165 + 4 >> 2] = 0; + HEAP32[$1165 + 8 >> 2] = 0; + do if (!(HEAP8[$1161 >> 0] & 1)) { + HEAP8[$1161 + 1 >> 0] = 0; + HEAP8[$1161 >> 0] = 0; + } else { + $1172 = $1159 + -16 | 0; + HEAP8[HEAP32[$1172 >> 2] >> 0] = 0; + $1174 = $1159 + -20 | 0; + HEAP32[$1174 >> 2] = 0; + $$pre$i$i$i$i = HEAP8[$1161 >> 0] | 0; + if (!($$pre$i$i$i$i & 1)) { + $1181 = $$pre$i$i$i$i; + $1190 = 10; + } else { + $1177 = HEAP32[$1161 >> 2] | 0; + $1181 = $1177 & 255; + $1190 = ($1177 & -2) + -1 | 0; + } + if (!($1181 & 1)) { + $1184 = ($1181 & 255) >>> 1; + if (($1181 & 255) < 22) { + $1189 = 10; + $1209 = $1184; + $1751 = 1; + } else { + $1189 = ($1184 + 16 & 240) + -1 | 0; + $1209 = $1184; + $1751 = 1; + } + } else { + $1189 = 10; + $1209 = 0; + $1751 = 0; + } + if (($1189 | 0) != ($1190 | 0)) { + if (($1189 | 0) == 10) { + $1196 = $1161 + 1 | 0; + $1197 = HEAP32[$1172 >> 2] | 0; + if ($1751) { + _memcpy($1196 | 0, $1197 | 0, (($1181 & 255) >>> 1) + 1 | 0) | 0; + _free($1197); + } else { + HEAP8[$1196 >> 0] = HEAP8[$1197 >> 0] | 0; + _free($1197); + } + HEAP8[$1161 >> 0] = $1209 << 1; + break; + } + $1193 = $1189 + 1 | 0; + $1194 = _malloc($1193) | 0; + if (!($1189 >>> 0 <= $1190 >>> 0 & ($1194 | 0) == 0)) { + if ($1751) _memcpy($1194 | 0, $1161 + 1 | 0, (($1181 & 255) >>> 1) + 1 | 0) | 0; else { + $1206 = HEAP32[$1172 >> 2] | 0; + HEAP8[$1194 >> 0] = HEAP8[$1206 >> 0] | 0; + _free($1206); + } + HEAP32[$1161 >> 2] = $1193 | 1; + HEAP32[$1174 >> 2] = $1209; + HEAP32[$1172 >> 2] = $1194; + } + } + } while (0); + HEAP32[$1161 >> 2] = HEAP32[$0 >> 2]; + HEAP32[$1161 + 4 >> 2] = HEAP32[$0 + 4 >> 2]; + HEAP32[$1161 + 8 >> 2] = HEAP32[$0 + 8 >> 2]; + HEAP32[$0 >> 2] = 0; + HEAP32[$0 + 4 >> 2] = 0; + HEAP32[$0 + 8 >> 2] = 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($0); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($1); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($2); + $$03$i265 = $1155; + } + } + $$0 = ($$03$i265 | 0) == ($1154 | 0) ? $first : $$03$i265; + break L1; + break; + } + default: + { + $$0 = $first; + break L1; + } + } + break; + } + case 111: + { + switch (HEAP8[$t$0 + 1 >> 0] | 0) { + case 110: + { + $$0 = __ZN10__cxxabiv112_GLOBAL__N_121parse_unresolved_nameINS0_2DbEEEPKcS4_S4_RT_($first, $last, $db) | 0; + break L1; + break; + } + case 111: + { + $1219 = $first + 2 | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($57, 14026, 2); + $1220 = __ZN10__cxxabiv112_GLOBAL__N_123parse_binary_expressionINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_($1219, $last, $57, $db) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($57); + $$0 = ($1220 | 0) == ($1219 | 0) ? $first : $1220; + break L1; + break; + } + case 114: + { + $1222 = $first + 2 | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($58, 14029, 1); + $1223 = __ZN10__cxxabiv112_GLOBAL__N_123parse_binary_expressionINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_($1222, $last, $58, $db) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($58); + $$0 = ($1223 | 0) == ($1222 | 0) ? $first : $1223; + break L1; + break; + } + case 82: + { + $1225 = $first + 2 | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($59, 14031, 2); + $1226 = __ZN10__cxxabiv112_GLOBAL__N_123parse_binary_expressionINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_($1225, $last, $59, $db) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($59); + $$0 = ($1226 | 0) == ($1225 | 0) ? $first : $1226; + break L1; + break; + } + default: + { + $$0 = $first; + break L1; + } + } + break; + } + case 112: + { + switch (HEAP8[$t$0 + 1 >> 0] | 0) { + case 109: + { + $1231 = $first + 2 | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($60, 14034, 3); + $1232 = __ZN10__cxxabiv112_GLOBAL__N_123parse_binary_expressionINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_($1231, $last, $60, $db) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($60); + $$0 = ($1232 | 0) == ($1231 | 0) ? $first : $1232; + break L1; + break; + } + case 108: + { + $1234 = $first + 2 | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($61, 14038, 1); + $1235 = __ZN10__cxxabiv112_GLOBAL__N_123parse_binary_expressionINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_($1234, $last, $61, $db) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($61); + $$0 = ($1235 | 0) == ($1234 | 0) ? $first : $1235; + break L1; + break; + } + case 76: + { + $1237 = $first + 2 | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($62, 14040, 2); + $1238 = __ZN10__cxxabiv112_GLOBAL__N_123parse_binary_expressionINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_($1237, $last, $62, $db) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($62); + $$0 = ($1238 | 0) == ($1237 | 0) ? $first : $1238; + break L1; + break; + } + case 112: + { + $1240 = $first + 2 | 0; + if (($1240 | 0) != ($last | 0)) if ((HEAP8[$1240 >> 0] | 0) == 95) { + $1244 = $first + 3 | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($63, 14043, 2); + $1245 = __ZN10__cxxabiv112_GLOBAL__N_123parse_prefix_expressionINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_($1244, $last, $63, $db) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($63); + $$0 = ($1245 | 0) == ($1244 | 0) ? $first : $1245; + break L1; + } + $1247 = __ZN10__cxxabiv112_GLOBAL__N_116parse_expressionINS0_2DbEEEPKcS4_S4_RT_($1240, $last, $db) | 0; + if (($1247 | 0) == ($1240 | 0)) { + $$0 = $first; + break L1; + } + $1251 = HEAP32[$db + 4 >> 2] | 0; + if ((HEAP32[$db >> 2] | 0) == ($1251 | 0)) { + $$0 = $first; + break L1; + } + $1253 = $1251 + -24 | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($67, $1253); + $1254 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc($67, 0, 12714) | 0; + HEAP32[$66 >> 2] = HEAP32[$1254 >> 2]; + HEAP32[$66 + 4 >> 2] = HEAP32[$1254 + 4 >> 2]; + HEAP32[$66 + 8 >> 2] = HEAP32[$1254 + 8 >> 2]; + HEAP32[$1254 >> 2] = 0; + HEAP32[$1254 + 4 >> 2] = 0; + HEAP32[$1254 + 8 >> 2] = 0; + $1257 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($66, 14046) | 0; + HEAP32[$65 >> 2] = HEAP32[$1257 >> 2]; + HEAP32[$65 + 4 >> 2] = HEAP32[$1257 + 4 >> 2]; + HEAP32[$65 + 8 >> 2] = HEAP32[$1257 + 8 >> 2]; + HEAP32[$1257 >> 2] = 0; + HEAP32[$1257 + 4 >> 2] = 0; + HEAP32[$1257 + 8 >> 2] = 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ENSt3__112basic_stringIcNS2_11char_traitsIcEENS0_12malloc_allocIcEEEE($64, $65); + __ZN10__cxxabiv112_GLOBAL__N_111string_pairaSEOS1_($1253, $64); + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($64); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($65); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($66); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($67); + $$0 = $1247; + break L1; + break; + } + case 115: + { + $1260 = $first + 2 | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($68, 14038, 1); + $1261 = __ZN10__cxxabiv112_GLOBAL__N_123parse_prefix_expressionINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_($1260, $last, $68, $db) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($68); + $$0 = ($1261 | 0) == ($1260 | 0) ? $first : $1261; + break L1; + break; + } + case 116: + { + if (($83 | 0) > 2) if ((HEAP8[$first >> 0] | 0) == 112) if ((HEAP8[$first + 1 >> 0] | 0) == 116) { + $1269 = $first + 2 | 0; + $1270 = __ZN10__cxxabiv112_GLOBAL__N_116parse_expressionINS0_2DbEEEPKcS4_S4_RT_($1269, $last, $db) | 0; + if (($1270 | 0) == ($1269 | 0)) $$0$i254 = $first; else { + $1272 = __ZN10__cxxabiv112_GLOBAL__N_116parse_expressionINS0_2DbEEEPKcS4_S4_RT_($1270, $last, $db) | 0; + if (($1272 | 0) == ($1270 | 0)) $$0$i254 = $first; else { + $1274 = $db + 4 | 0; + $1275 = HEAP32[$1274 >> 2] | 0; + if ((($1275 - (HEAP32[$db >> 2] | 0) | 0) / 24 | 0) >>> 0 < 2) $$0$i254 = $first; else { + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($0, $1275 + -24 | 0); + $1283 = HEAP32[$1274 >> 2] | 0; + $1284 = $1283 + -24 | 0; + $1286 = $1283; + do { + $1285 = $1286 + -24 | 0; + HEAP32[$1274 >> 2] = $1285; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($1285); + $1286 = HEAP32[$1274 >> 2] | 0; + } while (($1286 | 0) != ($1284 | 0)); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($1283 + -48 | 0, 14050) | 0; + $1291 = HEAP8[$0 >> 0] | 0; + $1293 = ($1291 & 1) == 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj((HEAP32[$1274 >> 2] | 0) + -24 | 0, $1293 ? $0 + 1 | 0 : HEAP32[$0 + 8 >> 2] | 0, $1293 ? ($1291 & 255) >>> 1 : HEAP32[$0 + 4 >> 2] | 0) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($0); + $$0$i254 = $1272; + } + } + } + } else $$0$i254 = $first; else $$0$i254 = $first; else $$0$i254 = $first; + $$0 = $$0$i254; + break L1; + break; + } + default: + { + $$0 = $first; + break L1; + } + } + break; + } + case 113: + { + if ((HEAP8[$t$0 + 1 >> 0] | 0) != 117) { + $$0 = $first; + break L1; + } + $1306 = $first + 2 | 0; + $1307 = __ZN10__cxxabiv112_GLOBAL__N_116parse_expressionINS0_2DbEEEPKcS4_S4_RT_($1306, $last, $db) | 0; + if (($1307 | 0) == ($1306 | 0)) { + $$0 = $first; + break L1; + } + $1309 = __ZN10__cxxabiv112_GLOBAL__N_116parse_expressionINS0_2DbEEEPKcS4_S4_RT_($1307, $last, $db) | 0; + if (($1309 | 0) == ($1307 | 0)) { + $1383 = $db + 4 | 0; + $1384 = HEAP32[$1383 >> 2] | 0; + $1385 = $1384 + -24 | 0; + $1387 = $1384; + while (1) { + $1386 = $1387 + -24 | 0; + HEAP32[$1383 >> 2] = $1386; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($1386); + $1387 = HEAP32[$1383 >> 2] | 0; + if (($1387 | 0) == ($1385 | 0)) { + $$0 = $first; + break L1; + } + } + } + $1311 = __ZN10__cxxabiv112_GLOBAL__N_116parse_expressionINS0_2DbEEEPKcS4_S4_RT_($1309, $last, $db) | 0; + $1313 = $db + 4 | 0; + $1314 = HEAP32[$1313 >> 2] | 0; + if (($1311 | 0) == ($1309 | 0)) { + $1375 = $1314 + -24 | 0; + $1377 = $1314; + do { + $1376 = $1377 + -24 | 0; + HEAP32[$1313 >> 2] = $1376; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($1376); + $1377 = HEAP32[$1313 >> 2] | 0; + } while (($1377 | 0) != ($1375 | 0)); + $1379 = $1314 + -48 | 0; + $1381 = $1375; + while (1) { + $1380 = $1381 + -24 | 0; + HEAP32[$1313 >> 2] = $1380; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($1380); + $1381 = HEAP32[$1313 >> 2] | 0; + if (($1381 | 0) == ($1379 | 0)) { + $$0 = $first; + break L1; + } + } + } + if ((($1314 - (HEAP32[$db >> 2] | 0) | 0) / 24 | 0) >>> 0 < 3) { + $$0 = $first; + break L1; + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($op3, $1314 + -24 | 0); + $1322 = HEAP32[$1313 >> 2] | 0; + $1323 = $1322 + -24 | 0; + $1325 = $1322; + do { + $1324 = $1325 + -24 | 0; + HEAP32[$1313 >> 2] = $1324; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($1324); + $1325 = HEAP32[$1313 >> 2] | 0; + } while (($1325 | 0) != ($1323 | 0)); + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($op27, $1322 + -48 | 0); + $1328 = HEAP32[$1313 >> 2] | 0; + $1329 = $1328 + -24 | 0; + $1331 = $1328; + do { + $1330 = $1331 + -24 | 0; + HEAP32[$1313 >> 2] = $1330; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($1330); + $1331 = HEAP32[$1313 >> 2] | 0; + } while (($1331 | 0) != ($1329 | 0)); + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($op18, $1328 + -48 | 0); + $1335 = (HEAP32[$1313 >> 2] | 0) + -24 | 0; + __ZNSt3__1plIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEENS_12basic_stringIT_T0_T1_EEPKS8_RKSB_($75, 12714, $op18); + $1336 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($75, 14053) | 0; + HEAP32[$74 >> 2] = HEAP32[$1336 >> 2]; + HEAP32[$74 + 4 >> 2] = HEAP32[$1336 + 4 >> 2]; + HEAP32[$74 + 8 >> 2] = HEAP32[$1336 + 8 >> 2]; + HEAP32[$1336 >> 2] = 0; + HEAP32[$1336 + 4 >> 2] = 0; + HEAP32[$1336 + 8 >> 2] = 0; + $1339 = HEAP8[$op27 >> 0] | 0; + $1341 = ($1339 & 1) == 0; + $1351 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($74, $1341 ? $op27 + 1 | 0 : HEAP32[$op27 + 8 >> 2] | 0, $1341 ? ($1339 & 255) >>> 1 : HEAP32[$op27 + 4 >> 2] | 0) | 0; + HEAP32[$73 >> 2] = HEAP32[$1351 >> 2]; + HEAP32[$73 + 4 >> 2] = HEAP32[$1351 + 4 >> 2]; + HEAP32[$73 + 8 >> 2] = HEAP32[$1351 + 8 >> 2]; + HEAP32[$1351 >> 2] = 0; + HEAP32[$1351 + 4 >> 2] = 0; + HEAP32[$1351 + 8 >> 2] = 0; + $1354 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($73, 14059) | 0; + HEAP32[$72 >> 2] = HEAP32[$1354 >> 2]; + HEAP32[$72 + 4 >> 2] = HEAP32[$1354 + 4 >> 2]; + HEAP32[$72 + 8 >> 2] = HEAP32[$1354 + 8 >> 2]; + HEAP32[$1354 >> 2] = 0; + HEAP32[$1354 + 4 >> 2] = 0; + HEAP32[$1354 + 8 >> 2] = 0; + $1357 = HEAP8[$op3 >> 0] | 0; + $1359 = ($1357 & 1) == 0; + $1369 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($72, $1359 ? $op3 + 1 | 0 : HEAP32[$op3 + 8 >> 2] | 0, $1359 ? ($1357 & 255) >>> 1 : HEAP32[$op3 + 4 >> 2] | 0) | 0; + HEAP32[$71 >> 2] = HEAP32[$1369 >> 2]; + HEAP32[$71 + 4 >> 2] = HEAP32[$1369 + 4 >> 2]; + HEAP32[$71 + 8 >> 2] = HEAP32[$1369 + 8 >> 2]; + HEAP32[$1369 >> 2] = 0; + HEAP32[$1369 + 4 >> 2] = 0; + HEAP32[$1369 + 8 >> 2] = 0; + $1372 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($71, 12619) | 0; + HEAP32[$70 >> 2] = HEAP32[$1372 >> 2]; + HEAP32[$70 + 4 >> 2] = HEAP32[$1372 + 4 >> 2]; + HEAP32[$70 + 8 >> 2] = HEAP32[$1372 + 8 >> 2]; + HEAP32[$1372 >> 2] = 0; + HEAP32[$1372 + 4 >> 2] = 0; + HEAP32[$1372 + 8 >> 2] = 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ENSt3__112basic_stringIcNS2_11char_traitsIcEENS0_12malloc_allocIcEEEE($69, $70); + __ZN10__cxxabiv112_GLOBAL__N_111string_pairaSEOS1_($1335, $69); + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($69); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($70); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($71); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($72); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($73); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($74); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($75); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($op18); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($op27); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($op3); + $$0 = $1311; + break L1; + break; + } + case 114: + { + switch (HEAP8[$t$0 + 1 >> 0] | 0) { + case 99: + { + if (($83 | 0) > 2) if ((HEAP8[$first >> 0] | 0) == 114) if ((HEAP8[$first + 1 >> 0] | 0) == 99) { + $1398 = $first + 2 | 0; + $1399 = __ZN10__cxxabiv112_GLOBAL__N_110parse_typeINS0_2DbEEEPKcS4_S4_RT_($1398, $last, $db) | 0; + if (($1399 | 0) == ($1398 | 0)) $$06$i248 = $first; else { + $1401 = __ZN10__cxxabiv112_GLOBAL__N_116parse_expressionINS0_2DbEEEPKcS4_S4_RT_($1399, $last, $db) | 0; + if (($1401 | 0) == ($1399 | 0)) $$06$i248 = $first; else { + $1403 = $db + 4 | 0; + $1404 = HEAP32[$1403 >> 2] | 0; + if ((($1404 - (HEAP32[$db >> 2] | 0) | 0) / 24 | 0) >>> 0 < 2) $$06$i248 = $first; else { + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($0, $1404 + -24 | 0); + $1412 = HEAP32[$1403 >> 2] | 0; + $1413 = $1412 + -24 | 0; + $1415 = $1412; + do { + $1414 = $1415 + -24 | 0; + HEAP32[$1403 >> 2] = $1414; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($1414); + $1415 = HEAP32[$1403 >> 2] | 0; + } while (($1415 | 0) != ($1413 | 0)); + $1417 = $1412 + -48 | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($6, $1417); + $1418 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc($6, 0, 14065) | 0; + HEAP32[$5 >> 2] = HEAP32[$1418 >> 2]; + HEAP32[$5 + 4 >> 2] = HEAP32[$1418 + 4 >> 2]; + HEAP32[$5 + 8 >> 2] = HEAP32[$1418 + 8 >> 2]; + HEAP32[$1418 >> 2] = 0; + HEAP32[$1418 + 4 >> 2] = 0; + HEAP32[$1418 + 8 >> 2] = 0; + $1421 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($5, 13916) | 0; + HEAP32[$4 >> 2] = HEAP32[$1421 >> 2]; + HEAP32[$4 + 4 >> 2] = HEAP32[$1421 + 4 >> 2]; + HEAP32[$4 + 8 >> 2] = HEAP32[$1421 + 8 >> 2]; + HEAP32[$1421 >> 2] = 0; + HEAP32[$1421 + 4 >> 2] = 0; + HEAP32[$1421 + 8 >> 2] = 0; + $1424 = HEAP8[$0 >> 0] | 0; + $1426 = ($1424 & 1) == 0; + $1436 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($4, $1426 ? $0 + 1 | 0 : HEAP32[$0 + 8 >> 2] | 0, $1426 ? ($1424 & 255) >>> 1 : HEAP32[$0 + 4 >> 2] | 0) | 0; + HEAP32[$3 >> 2] = HEAP32[$1436 >> 2]; + HEAP32[$3 + 4 >> 2] = HEAP32[$1436 + 4 >> 2]; + HEAP32[$3 + 8 >> 2] = HEAP32[$1436 + 8 >> 2]; + HEAP32[$1436 >> 2] = 0; + HEAP32[$1436 + 4 >> 2] = 0; + HEAP32[$1436 + 8 >> 2] = 0; + $1439 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($3, 12619) | 0; + HEAP32[$2 >> 2] = HEAP32[$1439 >> 2]; + HEAP32[$2 + 4 >> 2] = HEAP32[$1439 + 4 >> 2]; + HEAP32[$2 + 8 >> 2] = HEAP32[$1439 + 8 >> 2]; + HEAP32[$1439 >> 2] = 0; + HEAP32[$1439 + 4 >> 2] = 0; + HEAP32[$1439 + 8 >> 2] = 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ENSt3__112basic_stringIcNS2_11char_traitsIcEENS0_12malloc_allocIcEEEE($1, $2); + __ZN10__cxxabiv112_GLOBAL__N_111string_pairaSEOS1_($1417, $1); + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($1); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($2); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($3); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($4); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($5); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($6); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($0); + $$06$i248 = $1401; + } + } + } + } else $$06$i248 = $first; else $$06$i248 = $first; else $$06$i248 = $first; + $$0 = $$06$i248; + break L1; + break; + } + case 109: + { + $1442 = $first + 2 | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($76, 14083, 1); + $1443 = __ZN10__cxxabiv112_GLOBAL__N_123parse_binary_expressionINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_($1442, $last, $76, $db) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($76); + $$0 = ($1443 | 0) == ($1442 | 0) ? $first : $1443; + break L1; + break; + } + case 77: + { + $1445 = $first + 2 | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($77, 14085, 2); + $1446 = __ZN10__cxxabiv112_GLOBAL__N_123parse_binary_expressionINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_($1445, $last, $77, $db) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($77); + $$0 = ($1446 | 0) == ($1445 | 0) ? $first : $1446; + break L1; + break; + } + case 115: + { + $1448 = $first + 2 | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($78, 14088, 2); + $1449 = __ZN10__cxxabiv112_GLOBAL__N_123parse_binary_expressionINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_($1448, $last, $78, $db) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($78); + $$0 = ($1449 | 0) == ($1448 | 0) ? $first : $1449; + break L1; + break; + } + case 83: + { + $1451 = $first + 2 | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($79, 14091, 3); + $1452 = __ZN10__cxxabiv112_GLOBAL__N_123parse_binary_expressionINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_($1451, $last, $79, $db) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($79); + STACKTOP = sp; + return (($1452 | 0) == ($1451 | 0) ? $first : $1452) | 0; + } + default: + { + $$0 = $first; + break L1; + } + } + break; + } + case 115: + { + switch (HEAP8[$t$0 + 1 >> 0] | 0) { + case 99: + { + if (($83 | 0) > 2) if ((HEAP8[$first >> 0] | 0) == 115) if ((HEAP8[$first + 1 >> 0] | 0) == 99) { + $1463 = $first + 2 | 0; + $1464 = __ZN10__cxxabiv112_GLOBAL__N_110parse_typeINS0_2DbEEEPKcS4_S4_RT_($1463, $last, $db) | 0; + if (($1464 | 0) == ($1463 | 0)) $$06$i = $first; else { + $1466 = __ZN10__cxxabiv112_GLOBAL__N_116parse_expressionINS0_2DbEEEPKcS4_S4_RT_($1464, $last, $db) | 0; + if (($1466 | 0) == ($1464 | 0)) $$06$i = $first; else { + $1468 = $db + 4 | 0; + $1469 = HEAP32[$1468 >> 2] | 0; + if ((($1469 - (HEAP32[$db >> 2] | 0) | 0) / 24 | 0) >>> 0 < 2) $$06$i = $first; else { + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($0, $1469 + -24 | 0); + $1477 = HEAP32[$1468 >> 2] | 0; + $1478 = $1477 + -24 | 0; + $1480 = $1477; + do { + $1479 = $1480 + -24 | 0; + HEAP32[$1468 >> 2] = $1479; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($1479); + $1480 = HEAP32[$1468 >> 2] | 0; + } while (($1480 | 0) != ($1478 | 0)); + $1482 = $1477 + -48 | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($6, $1482); + $1483 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc($6, 0, 14095) | 0; + HEAP32[$5 >> 2] = HEAP32[$1483 >> 2]; + HEAP32[$5 + 4 >> 2] = HEAP32[$1483 + 4 >> 2]; + HEAP32[$5 + 8 >> 2] = HEAP32[$1483 + 8 >> 2]; + HEAP32[$1483 >> 2] = 0; + HEAP32[$1483 + 4 >> 2] = 0; + HEAP32[$1483 + 8 >> 2] = 0; + $1486 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($5, 13916) | 0; + HEAP32[$4 >> 2] = HEAP32[$1486 >> 2]; + HEAP32[$4 + 4 >> 2] = HEAP32[$1486 + 4 >> 2]; + HEAP32[$4 + 8 >> 2] = HEAP32[$1486 + 8 >> 2]; + HEAP32[$1486 >> 2] = 0; + HEAP32[$1486 + 4 >> 2] = 0; + HEAP32[$1486 + 8 >> 2] = 0; + $1489 = HEAP8[$0 >> 0] | 0; + $1491 = ($1489 & 1) == 0; + $1501 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($4, $1491 ? $0 + 1 | 0 : HEAP32[$0 + 8 >> 2] | 0, $1491 ? ($1489 & 255) >>> 1 : HEAP32[$0 + 4 >> 2] | 0) | 0; + HEAP32[$3 >> 2] = HEAP32[$1501 >> 2]; + HEAP32[$3 + 4 >> 2] = HEAP32[$1501 + 4 >> 2]; + HEAP32[$3 + 8 >> 2] = HEAP32[$1501 + 8 >> 2]; + HEAP32[$1501 >> 2] = 0; + HEAP32[$1501 + 4 >> 2] = 0; + HEAP32[$1501 + 8 >> 2] = 0; + $1504 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($3, 12619) | 0; + HEAP32[$2 >> 2] = HEAP32[$1504 >> 2]; + HEAP32[$2 + 4 >> 2] = HEAP32[$1504 + 4 >> 2]; + HEAP32[$2 + 8 >> 2] = HEAP32[$1504 + 8 >> 2]; + HEAP32[$1504 >> 2] = 0; + HEAP32[$1504 + 4 >> 2] = 0; + HEAP32[$1504 + 8 >> 2] = 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ENSt3__112basic_stringIcNS2_11char_traitsIcEENS0_12malloc_allocIcEEEE($1, $2); + __ZN10__cxxabiv112_GLOBAL__N_111string_pairaSEOS1_($1482, $1); + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($1); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($2); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($3); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($4); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($5); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($6); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($0); + $$06$i = $1466; + } + } + } + } else $$06$i = $first; else $$06$i = $first; else $$06$i = $first; + $$0 = $$06$i; + break L1; + break; + } + case 112: + { + if (($83 | 0) <= 2) { + $$0 = $first; + break L1; + } + if ((HEAP8[$first >> 0] | 0) != 115) { + $$0 = $first; + break L1; + } + if ((HEAP8[$first + 1 >> 0] | 0) != 112) { + $$0 = $first; + break L1; + } + $1513 = $first + 2 | 0; + $1514 = __ZN10__cxxabiv112_GLOBAL__N_116parse_expressionINS0_2DbEEEPKcS4_S4_RT_($1513, $last, $db) | 0; + $$0 = ($1514 | 0) == ($1513 | 0) ? $first : $1514; + break L1; + break; + } + case 114: + { + $$0 = __ZN10__cxxabiv112_GLOBAL__N_121parse_unresolved_nameINS0_2DbEEEPKcS4_S4_RT_($first, $last, $db) | 0; + break L1; + break; + } + case 116: + { + if (($83 | 0) > 2) if ((HEAP8[$first >> 0] | 0) == 115) if ((HEAP8[$first + 1 >> 0] | 0) == 116) { + $1523 = $first + 2 | 0; + $1524 = __ZN10__cxxabiv112_GLOBAL__N_110parse_typeINS0_2DbEEEPKcS4_S4_RT_($1523, $last, $db) | 0; + if (($1524 | 0) == ($1523 | 0)) $$03$i211 = $first; else { + $1528 = HEAP32[$db + 4 >> 2] | 0; + if ((HEAP32[$db >> 2] | 0) == ($1528 | 0)) $$03$i211 = $first; else { + $1530 = $1528 + -24 | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($3, $1530); + $1531 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc($3, 0, 14108) | 0; + HEAP32[$2 >> 2] = HEAP32[$1531 >> 2]; + HEAP32[$2 + 4 >> 2] = HEAP32[$1531 + 4 >> 2]; + HEAP32[$2 + 8 >> 2] = HEAP32[$1531 + 8 >> 2]; + HEAP32[$1531 >> 2] = 0; + HEAP32[$1531 + 4 >> 2] = 0; + HEAP32[$1531 + 8 >> 2] = 0; + $1534 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($2, 12619) | 0; + HEAP32[$1 >> 2] = HEAP32[$1534 >> 2]; + HEAP32[$1 + 4 >> 2] = HEAP32[$1534 + 4 >> 2]; + HEAP32[$1 + 8 >> 2] = HEAP32[$1534 + 8 >> 2]; + HEAP32[$1534 >> 2] = 0; + HEAP32[$1534 + 4 >> 2] = 0; + HEAP32[$1534 + 8 >> 2] = 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ENSt3__112basic_stringIcNS2_11char_traitsIcEENS0_12malloc_allocIcEEEE($0, $1); + __ZN10__cxxabiv112_GLOBAL__N_111string_pairaSEOS1_($1530, $0); + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($0); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($1); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($2); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($3); + $$03$i211 = $1524; + } + } + } else $$03$i211 = $first; else $$03$i211 = $first; else $$03$i211 = $first; + $$0 = $$03$i211; + break L1; + break; + } + case 122: + { + if (($83 | 0) > 2) if ((HEAP8[$first >> 0] | 0) == 115) if ((HEAP8[$first + 1 >> 0] | 0) == 122) { + $1543 = $first + 2 | 0; + $1544 = __ZN10__cxxabiv112_GLOBAL__N_116parse_expressionINS0_2DbEEEPKcS4_S4_RT_($1543, $last, $db) | 0; + if (($1544 | 0) == ($1543 | 0)) $$03$i200 = $first; else { + $1548 = HEAP32[$db + 4 >> 2] | 0; + if ((HEAP32[$db >> 2] | 0) == ($1548 | 0)) $$03$i200 = $first; else { + $1550 = $1548 + -24 | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($3, $1550); + $1551 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc($3, 0, 14108) | 0; + HEAP32[$2 >> 2] = HEAP32[$1551 >> 2]; + HEAP32[$2 + 4 >> 2] = HEAP32[$1551 + 4 >> 2]; + HEAP32[$2 + 8 >> 2] = HEAP32[$1551 + 8 >> 2]; + HEAP32[$1551 >> 2] = 0; + HEAP32[$1551 + 4 >> 2] = 0; + HEAP32[$1551 + 8 >> 2] = 0; + $1554 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($2, 12619) | 0; + HEAP32[$1 >> 2] = HEAP32[$1554 >> 2]; + HEAP32[$1 + 4 >> 2] = HEAP32[$1554 + 4 >> 2]; + HEAP32[$1 + 8 >> 2] = HEAP32[$1554 + 8 >> 2]; + HEAP32[$1554 >> 2] = 0; + HEAP32[$1554 + 4 >> 2] = 0; + HEAP32[$1554 + 8 >> 2] = 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ENSt3__112basic_stringIcNS2_11char_traitsIcEENS0_12malloc_allocIcEEEE($0, $1); + __ZN10__cxxabiv112_GLOBAL__N_111string_pairaSEOS1_($1550, $0); + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($0); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($1); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($2); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($3); + $$03$i200 = $1544; + } + } + } else $$03$i200 = $first; else $$03$i200 = $first; else $$03$i200 = $first; + $$0 = $$03$i200; + break L1; + break; + } + case 90: + { + if (($81 - $t$0 | 0) <= 2) { + $$0 = $first; + break L1; + } + switch (HEAP8[$t$0 + 2 >> 0] | 0) { + case 84: + break; + case 102: + { + if (($83 | 0) > 2) if ((HEAP8[$first >> 0] | 0) == 115) if ((HEAP8[$first + 1 >> 0] | 0) == 90) { + $1662 = $first + 2 | 0; + if ((HEAP8[$1662 >> 0] | 0) == 102) { + $1665 = __ZN10__cxxabiv112_GLOBAL__N_120parse_function_paramINS0_2DbEEEPKcS4_S4_RT_($1662, $last, $db) | 0; + if (($1665 | 0) == ($1662 | 0)) $$03$i174 = $first; else { + $1669 = HEAP32[$db + 4 >> 2] | 0; + if ((HEAP32[$db >> 2] | 0) == ($1669 | 0)) $$03$i174 = $first; else { + $1671 = $1669 + -24 | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($3, $1671); + $1672 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc($3, 0, 14117) | 0; + HEAP32[$2 >> 2] = HEAP32[$1672 >> 2]; + HEAP32[$2 + 4 >> 2] = HEAP32[$1672 + 4 >> 2]; + HEAP32[$2 + 8 >> 2] = HEAP32[$1672 + 8 >> 2]; + HEAP32[$1672 >> 2] = 0; + HEAP32[$1672 + 4 >> 2] = 0; + HEAP32[$1672 + 8 >> 2] = 0; + $1675 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($2, 12619) | 0; + HEAP32[$1 >> 2] = HEAP32[$1675 >> 2]; + HEAP32[$1 + 4 >> 2] = HEAP32[$1675 + 4 >> 2]; + HEAP32[$1 + 8 >> 2] = HEAP32[$1675 + 8 >> 2]; + HEAP32[$1675 >> 2] = 0; + HEAP32[$1675 + 4 >> 2] = 0; + HEAP32[$1675 + 8 >> 2] = 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ENSt3__112basic_stringIcNS2_11char_traitsIcEENS0_12malloc_allocIcEEEE($0, $1); + __ZN10__cxxabiv112_GLOBAL__N_111string_pairaSEOS1_($1671, $0); + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($0); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($1); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($2); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($3); + $$03$i174 = $1665; + } + } + } else $$03$i174 = $first; + } else $$03$i174 = $first; else $$03$i174 = $first; else $$03$i174 = $first; + $$0 = $$03$i174; + break L1; + break; + } + default: + { + $$0 = $first; + break L1; + } + } + if (($83 | 0) > 2) if ((HEAP8[$first >> 0] | 0) == 115) if ((HEAP8[$first + 1 >> 0] | 0) == 90) { + $1569 = $first + 2 | 0; + if ((HEAP8[$1569 >> 0] | 0) == 84) { + $1572 = $db + 4 | 0; + $1578 = ((HEAP32[$1572 >> 2] | 0) - (HEAP32[$db >> 2] | 0) | 0) / 24 | 0; + $1579 = __ZN10__cxxabiv112_GLOBAL__N_120parse_template_paramINS0_2DbEEEPKcS4_S4_RT_($1569, $last, $db) | 0; + $1581 = HEAP32[$db >> 2] | 0; + $1585 = ((HEAP32[$1572 >> 2] | 0) - $1581 | 0) / 24 | 0; + if (($1579 | 0) == ($1569 | 0)) $$03$i = $first; else { + HEAP8[$1 >> 0] = 20; + dest = $1 + 1 | 0; + src = 14117; + stop = dest + 10 | 0; + do { + HEAP8[dest >> 0] = HEAP8[src >> 0] | 0; + dest = dest + 1 | 0; + src = src + 1 | 0; + } while ((dest | 0) < (stop | 0)); + HEAP8[$1 + 11 >> 0] = 0; + if (($1578 | 0) != ($1585 | 0)) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($2, $1581 + ($1578 * 24 | 0) | 0); + $1591 = HEAP8[$2 >> 0] | 0; + $1593 = ($1591 & 1) == 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($1, $1593 ? $2 + 1 | 0 : HEAP32[$2 + 8 >> 2] | 0, $1593 ? ($1591 & 255) >>> 1 : HEAP32[$2 + 4 >> 2] | 0) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($2); + $1603 = $3 + 8 | 0; + $1604 = $3 + 1 | 0; + $1605 = $3 + 4 | 0; + $k$0$i621 = $1578 + 1 | 0; + if (($k$0$i621 | 0) != ($1585 | 0)) { + $k$0$i622 = $k$0$i621; + do { + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($4, (HEAP32[$db >> 2] | 0) + ($k$0$i622 * 24 | 0) | 0); + $1609 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc($4, 0, 12716) | 0; + HEAP32[$3 >> 2] = HEAP32[$1609 >> 2]; + HEAP32[$3 + 4 >> 2] = HEAP32[$1609 + 4 >> 2]; + HEAP32[$3 + 8 >> 2] = HEAP32[$1609 + 8 >> 2]; + HEAP32[$1609 >> 2] = 0; + HEAP32[$1609 + 4 >> 2] = 0; + HEAP32[$1609 + 8 >> 2] = 0; + $1612 = HEAP8[$3 >> 0] | 0; + $1614 = ($1612 & 1) == 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($1, $1614 ? $1604 : HEAP32[$1603 >> 2] | 0, $1614 ? ($1612 & 255) >>> 1 : HEAP32[$1605 >> 2] | 0) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($3); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($4); + $k$0$i622 = $k$0$i622 + 1 | 0; + } while (($k$0$i622 | 0) != ($1585 | 0)); + } + } + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($1, 12619) | 0; + if (($1585 | 0) != ($1578 | 0)) { + $k1$0$i618 = $1585; + do { + $1623 = HEAP32[$1572 >> 2] | 0; + $1624 = $1623 + -24 | 0; + $1626 = $1623; + do { + $1625 = $1626 + -24 | 0; + HEAP32[$1572 >> 2] = $1625; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($1625); + $1626 = HEAP32[$1572 >> 2] | 0; + } while (($1626 | 0) != ($1624 | 0)); + $k1$0$i618 = $k1$0$i618 + -1 | 0; + } while (($k1$0$i618 | 0) != ($1578 | 0)); + }; + HEAP32[$6 >> 2] = HEAP32[$1 >> 2]; + HEAP32[$6 + 4 >> 2] = HEAP32[$1 + 4 >> 2]; + HEAP32[$6 + 8 >> 2] = HEAP32[$1 + 8 >> 2]; + HEAP32[$1 >> 2] = 0; + HEAP32[$1 + 4 >> 2] = 0; + HEAP32[$1 + 8 >> 2] = 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ENSt3__112basic_stringIcNS2_11char_traitsIcEENS0_12malloc_allocIcEEEE($5, $6); + $1632 = HEAP32[$1572 >> 2] | 0; + $1634 = HEAP32[$db + 8 >> 2] | 0; + if ($1632 >>> 0 < $1634 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($1632, $5); + HEAP32[$1572 >> 2] = (HEAP32[$1572 >> 2] | 0) + 24; + } else { + $1641 = HEAP32[$db >> 2] | 0; + $1642 = $1632 - $1641 | 0; + $1643 = ($1642 | 0) / 24 | 0; + $1644 = $1643 + 1 | 0; + if (($1642 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $1648 = ($1634 - $1641 | 0) / 24 | 0; + if ($1648 >>> 0 < 1073741823) { + $1650 = $1648 << 1; + $$0$i$i$i$i = $1650 >>> 0 < $1644 >>> 0 ? $1644 : $1650; + } else $$0$i$i$i$i = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($0, $$0$i$i$i$i, $1643, $db + 12 | 0); + $1653 = $0 + 8 | 0; + $1654 = HEAP32[$1653 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($1654, $5); + HEAP32[$1653 >> 2] = $1654 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $0); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($0); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($5); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($6); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($1); + $$03$i = $1579; + } + } else $$03$i = $first; + } else $$03$i = $first; else $$03$i = $first; else $$03$i = $first; + $$0 = $$03$i; + break L1; + break; + } + default: + { + $$0 = $first; + break L1; + } + } + break; + } + case 116: + { + switch (HEAP8[$t$0 + 1 >> 0] | 0) { + case 105: + case 101: + { + L600 : do if (($83 | 0) > 2) if ((HEAP8[$first >> 0] | 0) == 116) { + $1685 = HEAP8[$first + 1 >> 0] | 0; + switch ($1685 << 24 >> 24) { + case 105: + case 101: + break; + default: + { + $$03$i189 = $first; + break L600; + } + } + $1687 = $first + 2 | 0; + if ($1685 << 24 >> 24 == 101) $t$0$i = __ZN10__cxxabiv112_GLOBAL__N_116parse_expressionINS0_2DbEEEPKcS4_S4_RT_($1687, $last, $db) | 0; else $t$0$i = __ZN10__cxxabiv112_GLOBAL__N_110parse_typeINS0_2DbEEEPKcS4_S4_RT_($1687, $last, $db) | 0; + if (($t$0$i | 0) == ($1687 | 0)) $$03$i189 = $first; else { + $1693 = HEAP32[$db + 4 >> 2] | 0; + if ((HEAP32[$db >> 2] | 0) == ($1693 | 0)) $$03$i189 = $first; else { + $1695 = $1693 + -24 | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($3, $1695); + $1696 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc($3, 0, 14128) | 0; + HEAP32[$2 >> 2] = HEAP32[$1696 >> 2]; + HEAP32[$2 + 4 >> 2] = HEAP32[$1696 + 4 >> 2]; + HEAP32[$2 + 8 >> 2] = HEAP32[$1696 + 8 >> 2]; + HEAP32[$1696 >> 2] = 0; + HEAP32[$1696 + 4 >> 2] = 0; + HEAP32[$1696 + 8 >> 2] = 0; + $1699 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($2, 12619) | 0; + HEAP32[$1 >> 2] = HEAP32[$1699 >> 2]; + HEAP32[$1 + 4 >> 2] = HEAP32[$1699 + 4 >> 2]; + HEAP32[$1 + 8 >> 2] = HEAP32[$1699 + 8 >> 2]; + HEAP32[$1699 >> 2] = 0; + HEAP32[$1699 + 4 >> 2] = 0; + HEAP32[$1699 + 8 >> 2] = 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ENSt3__112basic_stringIcNS2_11char_traitsIcEENS0_12malloc_allocIcEEEE($0, $1); + __ZN10__cxxabiv112_GLOBAL__N_111string_pairaSEOS1_($1695, $0); + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($0); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($1); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($2); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($3); + $$03$i189 = $t$0$i; + } + } + } else $$03$i189 = $first; else $$03$i189 = $first; while (0); + $$0 = $$03$i189; + break L1; + break; + } + case 114: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj6EEERAT__Kc($80, 14136); + $1702 = $db + 4 | 0; + $1703 = HEAP32[$1702 >> 2] | 0; + $1705 = HEAP32[$db + 8 >> 2] | 0; + if ($1703 >>> 0 < $1705 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($1703, $80); + HEAP32[$1702 >> 2] = (HEAP32[$1702 >> 2] | 0) + 24; + } else { + $1712 = HEAP32[$db >> 2] | 0; + $1713 = $1703 - $1712 | 0; + $1714 = ($1713 | 0) / 24 | 0; + $1715 = $1714 + 1 | 0; + if (($1713 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $1719 = ($1705 - $1712 | 0) / 24 | 0; + if ($1719 >>> 0 < 1073741823) { + $1721 = $1719 << 1; + $$0$i$i$i = $1721 >>> 0 < $1715 >>> 0 ? $1715 : $1721; + } else $$0$i$i$i = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($0, $$0$i$i$i, $1714, $db + 12 | 0); + $1724 = $0 + 8 | 0; + $1725 = HEAP32[$1724 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($1725, $80); + HEAP32[$1724 >> 2] = $1725 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $0); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($0); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($80); + $$0 = $first + 2 | 0; + break L1; + break; + } + case 119: + { + if (($83 | 0) > 2) if ((HEAP8[$first >> 0] | 0) == 116) if ((HEAP8[$first + 1 >> 0] | 0) == 119) { + $1734 = $first + 2 | 0; + $1735 = __ZN10__cxxabiv112_GLOBAL__N_116parse_expressionINS0_2DbEEEPKcS4_S4_RT_($1734, $last, $db) | 0; + if (($1735 | 0) == ($1734 | 0)) $$02$i = $first; else { + $1739 = HEAP32[$db + 4 >> 2] | 0; + if ((HEAP32[$db >> 2] | 0) == ($1739 | 0)) $$02$i = $first; else { + $1741 = $1739 + -24 | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($2, $1741); + $1742 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc($2, 0, 14142) | 0; + HEAP32[$1 >> 2] = HEAP32[$1742 >> 2]; + HEAP32[$1 + 4 >> 2] = HEAP32[$1742 + 4 >> 2]; + HEAP32[$1 + 8 >> 2] = HEAP32[$1742 + 8 >> 2]; + HEAP32[$1742 >> 2] = 0; + HEAP32[$1742 + 4 >> 2] = 0; + HEAP32[$1742 + 8 >> 2] = 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ENSt3__112basic_stringIcNS2_11char_traitsIcEENS0_12malloc_allocIcEEEE($0, $1); + __ZN10__cxxabiv112_GLOBAL__N_111string_pairaSEOS1_($1741, $0); + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($0); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($1); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($2); + $$02$i = $1735; + } + } + } else $$02$i = $first; else $$02$i = $first; else $$02$i = $first; + $$0 = $$02$i; + break L1; + break; + } + default: + { + $$0 = $first; + break L1; + } + } + break; + } + case 57: + case 56: + case 55: + case 54: + case 53: + case 52: + case 51: + case 50: + case 49: + { + $$0 = __ZN10__cxxabiv112_GLOBAL__N_121parse_unresolved_nameINS0_2DbEEEPKcS4_S4_RT_($first, $last, $db) | 0; + break L1; + break; + } + default: + { + $$0 = $first; + break L1; + } + } while (0); + } else $$0 = $first; while (0); + STACKTOP = sp; + return $$0 | 0; +} + +function __ZN10__cxxabiv112_GLOBAL__N_119parse_operator_nameINS0_2DbEEEPKcS4_S4_RT_($first, $last, $db) { + $first = $first | 0; + $last = $last | 0; + $db = $db | 0; + var $$0 = 0, $$0$i$i$i = 0, $$0$i$i$i10 = 0, $$0$i$i$i100 = 0, $$0$i$i$i105 = 0, $$0$i$i$i110 = 0, $$0$i$i$i115 = 0, $$0$i$i$i120 = 0, $$0$i$i$i125 = 0, $$0$i$i$i130 = 0, $$0$i$i$i135 = 0, $$0$i$i$i140 = 0, $$0$i$i$i145 = 0, $$0$i$i$i15 = 0, $$0$i$i$i150 = 0, $$0$i$i$i155 = 0, $$0$i$i$i160 = 0, $$0$i$i$i165 = 0, $$0$i$i$i170 = 0, $$0$i$i$i175 = 0, $$0$i$i$i180 = 0, $$0$i$i$i185 = 0, $$0$i$i$i190 = 0, $$0$i$i$i195 = 0, $$0$i$i$i20 = 0, $$0$i$i$i200 = 0, $$0$i$i$i205 = 0, $$0$i$i$i210 = 0, $$0$i$i$i215 = 0, $$0$i$i$i220 = 0, $$0$i$i$i225 = 0, $$0$i$i$i25 = 0, $$0$i$i$i30 = 0, $$0$i$i$i35 = 0, $$0$i$i$i40 = 0, $$0$i$i$i45 = 0, $$0$i$i$i5 = 0, $$0$i$i$i50 = 0, $$0$i$i$i55 = 0, $$0$i$i$i60 = 0, $$0$i$i$i65 = 0, $$0$i$i$i70 = 0, $$0$i$i$i75 = 0, $$0$i$i$i80 = 0, $$0$i$i$i85 = 0, $$0$i$i$i90 = 0, $$0$i$i$i95 = 0, $0 = 0, $1 = 0, $10 = 0, $100 = 0, $1002 = 0, $1003 = 0, $1004 = 0, $1005 = 0, $1009 = 0, $1011 = 0, $1014 = 0, $1015 = 0, $1021 = 0, $1022 = 0, $1024 = 0, $103 = 0, $1031 = 0, $1032 = 0, $1033 = 0, $1034 = 0, $1038 = 0, $104 = 0, $1040 = 0, $1043 = 0, $1044 = 0, $1047 = 0, $1048 = 0, $1050 = 0, $1057 = 0, $1058 = 0, $1059 = 0, $1060 = 0, $1064 = 0, $1066 = 0, $1069 = 0, $107 = 0, $1070 = 0, $1073 = 0, $1074 = 0, $1076 = 0, $108 = 0, $1083 = 0, $1084 = 0, $1085 = 0, $1086 = 0, $1090 = 0, $1092 = 0, $1095 = 0, $1096 = 0, $1099 = 0, $11 = 0, $110 = 0, $1100 = 0, $1102 = 0, $1109 = 0, $1110 = 0, $1111 = 0, $1112 = 0, $1116 = 0, $1118 = 0, $1121 = 0, $1122 = 0, $1125 = 0, $1126 = 0, $1128 = 0, $1135 = 0, $1136 = 0, $1137 = 0, $1138 = 0, $1142 = 0, $1144 = 0, $1147 = 0, $1148 = 0, $1151 = 0, $1152 = 0, $1154 = 0, $1161 = 0, $1162 = 0, $1163 = 0, $1164 = 0, $1168 = 0, $117 = 0, $1170 = 0, $1173 = 0, $1174 = 0, $118 = 0, $1180 = 0, $1181 = 0, $1183 = 0, $119 = 0, $1190 = 0, $1191 = 0, $1192 = 0, $1193 = 0, $1197 = 0, $1199 = 0, $12 = 0, $120 = 0, $1202 = 0, $1203 = 0, $1209 = 0, $1210 = 0, $1212 = 0, $1219 = 0, $1220 = 0, $1221 = 0, $1222 = 0, $1226 = 0, $1228 = 0, $1231 = 0, $1232 = 0, $1235 = 0, $1236 = 0, $1238 = 0, $124 = 0, $1245 = 0, $1246 = 0, $1247 = 0, $1248 = 0, $1252 = 0, $1254 = 0, $1257 = 0, $1258 = 0, $126 = 0, $1261 = 0, $1262 = 0, $1264 = 0, $1271 = 0, $1272 = 0, $1273 = 0, $1274 = 0, $1278 = 0, $1280 = 0, $1283 = 0, $1284 = 0, $1287 = 0, $1288 = 0, $129 = 0, $1290 = 0, $1297 = 0, $1298 = 0, $1299 = 0, $13 = 0, $130 = 0, $1300 = 0, $1304 = 0, $1306 = 0, $1309 = 0, $1310 = 0, $1316 = 0, $1317 = 0, $1321 = 0, $133 = 0, $134 = 0, $136 = 0, $14 = 0, $143 = 0, $144 = 0, $145 = 0, $146 = 0, $15 = 0, $150 = 0, $152 = 0, $155 = 0, $156 = 0, $16 = 0, $162 = 0, $163 = 0, $165 = 0, $17 = 0, $172 = 0, $173 = 0, $174 = 0, $175 = 0, $179 = 0, $18 = 0, $181 = 0, $184 = 0, $185 = 0, $188 = 0, $189 = 0, $19 = 0, $191 = 0, $198 = 0, $199 = 0, $2 = 0, $20 = 0, $200 = 0, $201 = 0, $205 = 0, $207 = 0, $21 = 0, $210 = 0, $211 = 0, $214 = 0, $215 = 0, $217 = 0, $22 = 0, $224 = 0, $225 = 0, $226 = 0, $227 = 0, $23 = 0, $231 = 0, $233 = 0, $236 = 0, $237 = 0, $24 = 0, $240 = 0, $241 = 0, $242 = 0, $243 = 0, $247 = 0, $25 = 0, $254 = 0, $255 = 0, $257 = 0, $26 = 0, $264 = 0, $265 = 0, $266 = 0, $267 = 0, $27 = 0, $271 = 0, $273 = 0, $276 = 0, $277 = 0, $28 = 0, $280 = 0, $281 = 0, $283 = 0, $29 = 0, $290 = 0, $291 = 0, $292 = 0, $293 = 0, $297 = 0, $299 = 0, $3 = 0, $30 = 0, $302 = 0, $303 = 0, $306 = 0, $31 = 0, $310 = 0, $313 = 0, $314 = 0, $316 = 0, $32 = 0, $323 = 0, $324 = 0, $325 = 0, $326 = 0, $33 = 0, $330 = 0, $332 = 0, $335 = 0, $336 = 0, $339 = 0, $34 = 0, $340 = 0, $342 = 0, $349 = 0, $35 = 0, $350 = 0, $351 = 0, $352 = 0, $356 = 0, $358 = 0, $36 = 0, $361 = 0, $362 = 0, $365 = 0, $366 = 0, $368 = 0, $37 = 0, $375 = 0, $376 = 0, $377 = 0, $378 = 0, $38 = 0, $382 = 0, $384 = 0, $387 = 0, $388 = 0, $39 = 0, $394 = 0, $395 = 0, $397 = 0, $4 = 0, $40 = 0, $404 = 0, $405 = 0, $406 = 0, $407 = 0, $41 = 0, $411 = 0, $413 = 0, $416 = 0, $417 = 0, $42 = 0, $420 = 0, $421 = 0, $423 = 0, $43 = 0, $430 = 0, $431 = 0, $432 = 0, $433 = 0, $437 = 0, $439 = 0, $44 = 0, $442 = 0, $443 = 0, $446 = 0, $447 = 0, $449 = 0, $45 = 0, $456 = 0, $457 = 0, $458 = 0, $459 = 0, $463 = 0, $465 = 0, $468 = 0, $469 = 0, $475 = 0, $476 = 0, $478 = 0, $485 = 0, $486 = 0, $487 = 0, $488 = 0, $492 = 0, $494 = 0, $497 = 0, $498 = 0, $5 = 0, $501 = 0, $502 = 0, $504 = 0, $511 = 0, $512 = 0, $513 = 0, $514 = 0, $518 = 0, $520 = 0, $523 = 0, $524 = 0, $530 = 0, $531 = 0, $533 = 0, $540 = 0, $541 = 0, $542 = 0, $543 = 0, $547 = 0, $549 = 0, $55 = 0, $552 = 0, $553 = 0, $559 = 0, $56 = 0, $560 = 0, $562 = 0, $569 = 0, $570 = 0, $571 = 0, $572 = 0, $576 = 0, $578 = 0, $58 = 0, $581 = 0, $582 = 0, $585 = 0, $586 = 0, $590 = 0, $593 = 0, $594 = 0, $596 = 0, $6 = 0, $603 = 0, $604 = 0, $605 = 0, $606 = 0, $610 = 0, $612 = 0, $615 = 0, $616 = 0, $619 = 0, $620 = 0, $622 = 0, $629 = 0, $630 = 0, $631 = 0, $632 = 0, $636 = 0, $638 = 0, $641 = 0, $642 = 0, $645 = 0, $646 = 0, $648 = 0, $65 = 0, $655 = 0, $656 = 0, $657 = 0, $658 = 0, $66 = 0, $662 = 0, $664 = 0, $667 = 0, $668 = 0, $67 = 0, $674 = 0, $675 = 0, $677 = 0, $68 = 0, $684 = 0, $685 = 0, $686 = 0, $687 = 0, $691 = 0, $693 = 0, $696 = 0, $697 = 0, $7 = 0, $700 = 0, $701 = 0, $703 = 0, $710 = 0, $711 = 0, $712 = 0, $713 = 0, $717 = 0, $719 = 0, $72 = 0, $722 = 0, $723 = 0, $726 = 0, $727 = 0, $729 = 0, $736 = 0, $737 = 0, $738 = 0, $739 = 0, $74 = 0, $743 = 0, $745 = 0, $748 = 0, $749 = 0, $752 = 0, $753 = 0, $755 = 0, $762 = 0, $763 = 0, $764 = 0, $765 = 0, $769 = 0, $77 = 0, $771 = 0, $774 = 0, $775 = 0, $778 = 0, $779 = 0, $78 = 0, $781 = 0, $788 = 0, $789 = 0, $790 = 0, $791 = 0, $795 = 0, $797 = 0, $8 = 0, $800 = 0, $801 = 0, $807 = 0, $808 = 0, $81 = 0, $810 = 0, $817 = 0, $818 = 0, $819 = 0, $82 = 0, $820 = 0, $824 = 0, $826 = 0, $829 = 0, $830 = 0, $833 = 0, $834 = 0, $836 = 0, $84 = 0, $843 = 0, $844 = 0, $845 = 0, $846 = 0, $850 = 0, $852 = 0, $855 = 0, $856 = 0, $859 = 0, $860 = 0, $862 = 0, $869 = 0, $870 = 0, $871 = 0, $872 = 0, $876 = 0, $878 = 0, $881 = 0, $882 = 0, $885 = 0, $886 = 0, $888 = 0, $895 = 0, $896 = 0, $897 = 0, $898 = 0, $9 = 0, $902 = 0, $904 = 0, $907 = 0, $908 = 0, $91 = 0, $911 = 0, $912 = 0, $914 = 0, $92 = 0, $921 = 0, $922 = 0, $923 = 0, $924 = 0, $928 = 0, $93 = 0, $930 = 0, $933 = 0, $934 = 0, $94 = 0, $940 = 0, $941 = 0, $943 = 0, $950 = 0, $951 = 0, $952 = 0, $953 = 0, $957 = 0, $959 = 0, $962 = 0, $963 = 0, $966 = 0, $967 = 0, $969 = 0, $976 = 0, $977 = 0, $978 = 0, $979 = 0, $98 = 0, $983 = 0, $985 = 0, $988 = 0, $989 = 0, $992 = 0, $993 = 0, $995 = 0, $__v$i$i224 = 0, dest = 0, sp = 0, src = 0, stop = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 1136 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $__v$i$i224 = sp + 1104 | 0; + $0 = sp + 1080 | 0; + $1 = sp + 1056 | 0; + $2 = sp + 1032 | 0; + $3 = sp + 1008 | 0; + $4 = sp + 984 | 0; + $5 = sp + 960 | 0; + $6 = sp + 936 | 0; + $7 = sp + 912 | 0; + $8 = sp + 888 | 0; + $9 = sp + 864 | 0; + $10 = sp + 840 | 0; + $11 = sp + 816 | 0; + $12 = sp + 792 | 0; + $13 = sp + 768 | 0; + $14 = sp + 744 | 0; + $15 = sp + 720 | 0; + $16 = sp + 696 | 0; + $17 = sp + 672 | 0; + $18 = sp + 648 | 0; + $19 = sp + 624 | 0; + $20 = sp + 600 | 0; + $21 = sp + 576 | 0; + $22 = sp + 552 | 0; + $23 = sp + 528 | 0; + $24 = sp + 504 | 0; + $25 = sp + 480 | 0; + $26 = sp + 456 | 0; + $27 = sp + 432 | 0; + $28 = sp + 408 | 0; + $29 = sp + 384 | 0; + $30 = sp + 360 | 0; + $31 = sp + 336 | 0; + $32 = sp + 312 | 0; + $33 = sp + 288 | 0; + $34 = sp + 264 | 0; + $35 = sp + 240 | 0; + $36 = sp + 216 | 0; + $37 = sp + 192 | 0; + $38 = sp + 168 | 0; + $39 = sp + 144 | 0; + $40 = sp + 120 | 0; + $41 = sp + 96 | 0; + $42 = sp + 72 | 0; + $43 = sp + 48 | 0; + $44 = sp + 24 | 0; + $45 = sp; + L1 : do if (($last - $first | 0) > 1) do switch (HEAP8[$first >> 0] | 0) { + case 97: + { + switch (HEAP8[$first + 1 >> 0] | 0) { + case 97: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj11EEERAT__Kc($0, 12949); + $55 = $db + 4 | 0; + $56 = HEAP32[$55 >> 2] | 0; + $58 = HEAP32[$db + 8 >> 2] | 0; + if ($56 >>> 0 < $58 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($56, $0); + HEAP32[$55 >> 2] = (HEAP32[$55 >> 2] | 0) + 24; + } else { + $65 = HEAP32[$db >> 2] | 0; + $66 = $56 - $65 | 0; + $67 = ($66 | 0) / 24 | 0; + $68 = $67 + 1 | 0; + if (($66 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $72 = ($58 - $65 | 0) / 24 | 0; + if ($72 >>> 0 < 1073741823) { + $74 = $72 << 1; + $$0$i$i$i = $74 >>> 0 < $68 >>> 0 ? $68 : $74; + } else $$0$i$i$i = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i224, $$0$i$i$i, $67, $db + 12 | 0); + $77 = $__v$i$i224 + 8 | 0; + $78 = HEAP32[$77 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($78, $0); + HEAP32[$77 >> 2] = $78 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i224); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i224); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($0); + $$0 = $first + 2 | 0; + break L1; + break; + } + case 110: + case 100: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj10EEERAT__Kc($1, 12960); + $81 = $db + 4 | 0; + $82 = HEAP32[$81 >> 2] | 0; + $84 = HEAP32[$db + 8 >> 2] | 0; + if ($82 >>> 0 < $84 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($82, $1); + HEAP32[$81 >> 2] = (HEAP32[$81 >> 2] | 0) + 24; + } else { + $91 = HEAP32[$db >> 2] | 0; + $92 = $82 - $91 | 0; + $93 = ($92 | 0) / 24 | 0; + $94 = $93 + 1 | 0; + if (($92 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $98 = ($84 - $91 | 0) / 24 | 0; + if ($98 >>> 0 < 1073741823) { + $100 = $98 << 1; + $$0$i$i$i5 = $100 >>> 0 < $94 >>> 0 ? $94 : $100; + } else $$0$i$i$i5 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i224, $$0$i$i$i5, $93, $db + 12 | 0); + $103 = $__v$i$i224 + 8 | 0; + $104 = HEAP32[$103 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($104, $1); + HEAP32[$103 >> 2] = $104 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i224); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i224); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($1); + $$0 = $first + 2 | 0; + break L1; + break; + } + case 78: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj11EEERAT__Kc($2, 12970); + $107 = $db + 4 | 0; + $108 = HEAP32[$107 >> 2] | 0; + $110 = HEAP32[$db + 8 >> 2] | 0; + if ($108 >>> 0 < $110 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($108, $2); + HEAP32[$107 >> 2] = (HEAP32[$107 >> 2] | 0) + 24; + } else { + $117 = HEAP32[$db >> 2] | 0; + $118 = $108 - $117 | 0; + $119 = ($118 | 0) / 24 | 0; + $120 = $119 + 1 | 0; + if (($118 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $124 = ($110 - $117 | 0) / 24 | 0; + if ($124 >>> 0 < 1073741823) { + $126 = $124 << 1; + $$0$i$i$i10 = $126 >>> 0 < $120 >>> 0 ? $120 : $126; + } else $$0$i$i$i10 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i224, $$0$i$i$i10, $119, $db + 12 | 0); + $129 = $__v$i$i224 + 8 | 0; + $130 = HEAP32[$129 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($130, $2); + HEAP32[$129 >> 2] = $130 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i224); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i224); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($2); + $$0 = $first + 2 | 0; + break L1; + break; + } + case 83: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj10EEERAT__Kc($3, 12981); + $133 = $db + 4 | 0; + $134 = HEAP32[$133 >> 2] | 0; + $136 = HEAP32[$db + 8 >> 2] | 0; + if ($134 >>> 0 < $136 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($134, $3); + HEAP32[$133 >> 2] = (HEAP32[$133 >> 2] | 0) + 24; + } else { + $143 = HEAP32[$db >> 2] | 0; + $144 = $134 - $143 | 0; + $145 = ($144 | 0) / 24 | 0; + $146 = $145 + 1 | 0; + if (($144 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $150 = ($136 - $143 | 0) / 24 | 0; + if ($150 >>> 0 < 1073741823) { + $152 = $150 << 1; + $$0$i$i$i15 = $152 >>> 0 < $146 >>> 0 ? $146 : $152; + } else $$0$i$i$i15 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i224, $$0$i$i$i15, $145, $db + 12 | 0); + $155 = $__v$i$i224 + 8 | 0; + $156 = HEAP32[$155 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($156, $3); + HEAP32[$155 >> 2] = $156 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i224); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i224); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($3); + $$0 = $first + 2 | 0; + break L1; + break; + } + default: + { + $$0 = $first; + break L1; + } + } + break; + } + case 99: + { + switch (HEAP8[$first + 1 >> 0] | 0) { + case 108: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj11EEERAT__Kc($4, 12991); + $162 = $db + 4 | 0; + $163 = HEAP32[$162 >> 2] | 0; + $165 = HEAP32[$db + 8 >> 2] | 0; + if ($163 >>> 0 < $165 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($163, $4); + HEAP32[$162 >> 2] = (HEAP32[$162 >> 2] | 0) + 24; + } else { + $172 = HEAP32[$db >> 2] | 0; + $173 = $163 - $172 | 0; + $174 = ($173 | 0) / 24 | 0; + $175 = $174 + 1 | 0; + if (($173 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $179 = ($165 - $172 | 0) / 24 | 0; + if ($179 >>> 0 < 1073741823) { + $181 = $179 << 1; + $$0$i$i$i20 = $181 >>> 0 < $175 >>> 0 ? $175 : $181; + } else $$0$i$i$i20 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i224, $$0$i$i$i20, $174, $db + 12 | 0); + $184 = $__v$i$i224 + 8 | 0; + $185 = HEAP32[$184 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($185, $4); + HEAP32[$184 >> 2] = $185 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i224); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i224); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($4); + $$0 = $first + 2 | 0; + break L1; + break; + } + case 109: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj10EEERAT__Kc($5, 13002); + $188 = $db + 4 | 0; + $189 = HEAP32[$188 >> 2] | 0; + $191 = HEAP32[$db + 8 >> 2] | 0; + if ($189 >>> 0 < $191 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($189, $5); + HEAP32[$188 >> 2] = (HEAP32[$188 >> 2] | 0) + 24; + } else { + $198 = HEAP32[$db >> 2] | 0; + $199 = $189 - $198 | 0; + $200 = ($199 | 0) / 24 | 0; + $201 = $200 + 1 | 0; + if (($199 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $205 = ($191 - $198 | 0) / 24 | 0; + if ($205 >>> 0 < 1073741823) { + $207 = $205 << 1; + $$0$i$i$i25 = $207 >>> 0 < $201 >>> 0 ? $201 : $207; + } else $$0$i$i$i25 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i224, $$0$i$i$i25, $200, $db + 12 | 0); + $210 = $__v$i$i224 + 8 | 0; + $211 = HEAP32[$210 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($211, $5); + HEAP32[$210 >> 2] = $211 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i224); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i224); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($5); + $$0 = $first + 2 | 0; + break L1; + break; + } + case 111: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj10EEERAT__Kc($6, 13012); + $214 = $db + 4 | 0; + $215 = HEAP32[$214 >> 2] | 0; + $217 = HEAP32[$db + 8 >> 2] | 0; + if ($215 >>> 0 < $217 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($215, $6); + HEAP32[$214 >> 2] = (HEAP32[$214 >> 2] | 0) + 24; + } else { + $224 = HEAP32[$db >> 2] | 0; + $225 = $215 - $224 | 0; + $226 = ($225 | 0) / 24 | 0; + $227 = $226 + 1 | 0; + if (($225 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $231 = ($217 - $224 | 0) / 24 | 0; + if ($231 >>> 0 < 1073741823) { + $233 = $231 << 1; + $$0$i$i$i30 = $233 >>> 0 < $227 >>> 0 ? $227 : $233; + } else $$0$i$i$i30 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i224, $$0$i$i$i30, $226, $db + 12 | 0); + $236 = $__v$i$i224 + 8 | 0; + $237 = HEAP32[$236 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($237, $6); + HEAP32[$236 >> 2] = $237 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i224); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i224); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($6); + $$0 = $first + 2 | 0; + break L1; + break; + } + case 118: + { + $240 = $db + 63 | 0; + $241 = HEAP8[$240 >> 0] | 0; + HEAP8[$240 >> 0] = 0; + $242 = $first + 2 | 0; + $243 = __ZN10__cxxabiv112_GLOBAL__N_110parse_typeINS0_2DbEEEPKcS4_S4_RT_($242, $last, $db) | 0; + HEAP8[$240 >> 0] = $241; + if (($243 | 0) == ($242 | 0)) { + $$0 = $first; + break L1; + } + $247 = HEAP32[$db + 4 >> 2] | 0; + if ((HEAP32[$db >> 2] | 0) == ($247 | 0)) { + $$0 = $first; + break L1; + } + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc($247 + -24 | 0, 0, 13022) | 0; + HEAP8[$db + 60 >> 0] = 1; + $$0 = $243; + break L1; + break; + } + default: + { + $$0 = $first; + break L1; + } + } + break; + } + case 100: + { + switch (HEAP8[$first + 1 >> 0] | 0) { + case 97: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj18EEERAT__Kc($7, 13032); + $254 = $db + 4 | 0; + $255 = HEAP32[$254 >> 2] | 0; + $257 = HEAP32[$db + 8 >> 2] | 0; + if ($255 >>> 0 < $257 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($255, $7); + HEAP32[$254 >> 2] = (HEAP32[$254 >> 2] | 0) + 24; + } else { + $264 = HEAP32[$db >> 2] | 0; + $265 = $255 - $264 | 0; + $266 = ($265 | 0) / 24 | 0; + $267 = $266 + 1 | 0; + if (($265 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $271 = ($257 - $264 | 0) / 24 | 0; + if ($271 >>> 0 < 1073741823) { + $273 = $271 << 1; + $$0$i$i$i35 = $273 >>> 0 < $267 >>> 0 ? $267 : $273; + } else $$0$i$i$i35 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i224, $$0$i$i$i35, $266, $db + 12 | 0); + $276 = $__v$i$i224 + 8 | 0; + $277 = HEAP32[$276 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($277, $7); + HEAP32[$276 >> 2] = $277 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i224); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i224); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($7); + $$0 = $first + 2 | 0; + break L1; + break; + } + case 101: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj10EEERAT__Kc($8, 13050); + $280 = $db + 4 | 0; + $281 = HEAP32[$280 >> 2] | 0; + $283 = HEAP32[$db + 8 >> 2] | 0; + if ($281 >>> 0 < $283 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($281, $8); + HEAP32[$280 >> 2] = (HEAP32[$280 >> 2] | 0) + 24; + } else { + $290 = HEAP32[$db >> 2] | 0; + $291 = $281 - $290 | 0; + $292 = ($291 | 0) / 24 | 0; + $293 = $292 + 1 | 0; + if (($291 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $297 = ($283 - $290 | 0) / 24 | 0; + if ($297 >>> 0 < 1073741823) { + $299 = $297 << 1; + $$0$i$i$i40 = $299 >>> 0 < $293 >>> 0 ? $293 : $299; + } else $$0$i$i$i40 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i224, $$0$i$i$i40, $292, $db + 12 | 0); + $302 = $__v$i$i224 + 8 | 0; + $303 = HEAP32[$302 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($303, $8); + HEAP32[$302 >> 2] = $303 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i224); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i224); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($8); + $$0 = $first + 2 | 0; + break L1; + break; + } + case 108: + { + $306 = _malloc(16) | 0; + HEAP32[$9 + 8 >> 2] = $306; + HEAP32[$9 >> 2] = 17; + HEAP32[$9 + 4 >> 2] = 15; + dest = $306; + src = 13060; + stop = dest + 15 | 0; + do { + HEAP8[dest >> 0] = HEAP8[src >> 0] | 0; + dest = dest + 1 | 0; + src = src + 1 | 0; + } while ((dest | 0) < (stop | 0)); + HEAP8[$306 + 15 >> 0] = 0; + $310 = $9 + 12 | 0; + HEAP32[$310 >> 2] = 0; + HEAP32[$310 + 4 >> 2] = 0; + HEAP32[$310 + 8 >> 2] = 0; + $313 = $db + 4 | 0; + $314 = HEAP32[$313 >> 2] | 0; + $316 = HEAP32[$db + 8 >> 2] | 0; + if ($314 >>> 0 < $316 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($314, $9); + HEAP32[$313 >> 2] = (HEAP32[$313 >> 2] | 0) + 24; + } else { + $323 = HEAP32[$db >> 2] | 0; + $324 = $314 - $323 | 0; + $325 = ($324 | 0) / 24 | 0; + $326 = $325 + 1 | 0; + if (($324 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $330 = ($316 - $323 | 0) / 24 | 0; + if ($330 >>> 0 < 1073741823) { + $332 = $330 << 1; + $$0$i$i$i45 = $332 >>> 0 < $326 >>> 0 ? $326 : $332; + } else $$0$i$i$i45 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i224, $$0$i$i$i45, $325, $db + 12 | 0); + $335 = $__v$i$i224 + 8 | 0; + $336 = HEAP32[$335 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($336, $9); + HEAP32[$335 >> 2] = $336 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i224); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i224); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($9); + $$0 = $first + 2 | 0; + break L1; + break; + } + case 118: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj10EEERAT__Kc($10, 13076); + $339 = $db + 4 | 0; + $340 = HEAP32[$339 >> 2] | 0; + $342 = HEAP32[$db + 8 >> 2] | 0; + if ($340 >>> 0 < $342 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($340, $10); + HEAP32[$339 >> 2] = (HEAP32[$339 >> 2] | 0) + 24; + } else { + $349 = HEAP32[$db >> 2] | 0; + $350 = $340 - $349 | 0; + $351 = ($350 | 0) / 24 | 0; + $352 = $351 + 1 | 0; + if (($350 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $356 = ($342 - $349 | 0) / 24 | 0; + if ($356 >>> 0 < 1073741823) { + $358 = $356 << 1; + $$0$i$i$i50 = $358 >>> 0 < $352 >>> 0 ? $352 : $358; + } else $$0$i$i$i50 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i224, $$0$i$i$i50, $351, $db + 12 | 0); + $361 = $__v$i$i224 + 8 | 0; + $362 = HEAP32[$361 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($362, $10); + HEAP32[$361 >> 2] = $362 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i224); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i224); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($10); + $$0 = $first + 2 | 0; + break L1; + break; + } + case 86: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj11EEERAT__Kc($11, 13086); + $365 = $db + 4 | 0; + $366 = HEAP32[$365 >> 2] | 0; + $368 = HEAP32[$db + 8 >> 2] | 0; + if ($366 >>> 0 < $368 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($366, $11); + HEAP32[$365 >> 2] = (HEAP32[$365 >> 2] | 0) + 24; + } else { + $375 = HEAP32[$db >> 2] | 0; + $376 = $366 - $375 | 0; + $377 = ($376 | 0) / 24 | 0; + $378 = $377 + 1 | 0; + if (($376 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $382 = ($368 - $375 | 0) / 24 | 0; + if ($382 >>> 0 < 1073741823) { + $384 = $382 << 1; + $$0$i$i$i55 = $384 >>> 0 < $378 >>> 0 ? $378 : $384; + } else $$0$i$i$i55 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i224, $$0$i$i$i55, $377, $db + 12 | 0); + $387 = $__v$i$i224 + 8 | 0; + $388 = HEAP32[$387 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($388, $11); + HEAP32[$387 >> 2] = $388 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i224); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i224); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($11); + $$0 = $first + 2 | 0; + break L1; + break; + } + default: + { + $$0 = $first; + break L1; + } + } + break; + } + case 101: + { + switch (HEAP8[$first + 1 >> 0] | 0) { + case 111: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj10EEERAT__Kc($12, 13097); + $394 = $db + 4 | 0; + $395 = HEAP32[$394 >> 2] | 0; + $397 = HEAP32[$db + 8 >> 2] | 0; + if ($395 >>> 0 < $397 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($395, $12); + HEAP32[$394 >> 2] = (HEAP32[$394 >> 2] | 0) + 24; + } else { + $404 = HEAP32[$db >> 2] | 0; + $405 = $395 - $404 | 0; + $406 = ($405 | 0) / 24 | 0; + $407 = $406 + 1 | 0; + if (($405 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $411 = ($397 - $404 | 0) / 24 | 0; + if ($411 >>> 0 < 1073741823) { + $413 = $411 << 1; + $$0$i$i$i60 = $413 >>> 0 < $407 >>> 0 ? $407 : $413; + } else $$0$i$i$i60 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i224, $$0$i$i$i60, $406, $db + 12 | 0); + $416 = $__v$i$i224 + 8 | 0; + $417 = HEAP32[$416 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($417, $12); + HEAP32[$416 >> 2] = $417 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i224); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i224); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($12); + $$0 = $first + 2 | 0; + break L1; + break; + } + case 79: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj11EEERAT__Kc($13, 13107); + $420 = $db + 4 | 0; + $421 = HEAP32[$420 >> 2] | 0; + $423 = HEAP32[$db + 8 >> 2] | 0; + if ($421 >>> 0 < $423 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($421, $13); + HEAP32[$420 >> 2] = (HEAP32[$420 >> 2] | 0) + 24; + } else { + $430 = HEAP32[$db >> 2] | 0; + $431 = $421 - $430 | 0; + $432 = ($431 | 0) / 24 | 0; + $433 = $432 + 1 | 0; + if (($431 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $437 = ($423 - $430 | 0) / 24 | 0; + if ($437 >>> 0 < 1073741823) { + $439 = $437 << 1; + $$0$i$i$i65 = $439 >>> 0 < $433 >>> 0 ? $433 : $439; + } else $$0$i$i$i65 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i224, $$0$i$i$i65, $432, $db + 12 | 0); + $442 = $__v$i$i224 + 8 | 0; + $443 = HEAP32[$442 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($443, $13); + HEAP32[$442 >> 2] = $443 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i224); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i224); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($13); + $$0 = $first + 2 | 0; + break L1; + break; + } + case 113: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj11EEERAT__Kc($14, 13118); + $446 = $db + 4 | 0; + $447 = HEAP32[$446 >> 2] | 0; + $449 = HEAP32[$db + 8 >> 2] | 0; + if ($447 >>> 0 < $449 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($447, $14); + HEAP32[$446 >> 2] = (HEAP32[$446 >> 2] | 0) + 24; + } else { + $456 = HEAP32[$db >> 2] | 0; + $457 = $447 - $456 | 0; + $458 = ($457 | 0) / 24 | 0; + $459 = $458 + 1 | 0; + if (($457 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $463 = ($449 - $456 | 0) / 24 | 0; + if ($463 >>> 0 < 1073741823) { + $465 = $463 << 1; + $$0$i$i$i70 = $465 >>> 0 < $459 >>> 0 ? $459 : $465; + } else $$0$i$i$i70 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i224, $$0$i$i$i70, $458, $db + 12 | 0); + $468 = $__v$i$i224 + 8 | 0; + $469 = HEAP32[$468 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($469, $14); + HEAP32[$468 >> 2] = $469 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i224); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i224); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($14); + $$0 = $first + 2 | 0; + break L1; + break; + } + default: + { + $$0 = $first; + break L1; + } + } + break; + } + case 103: + { + switch (HEAP8[$first + 1 >> 0] | 0) { + case 101: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj11EEERAT__Kc($15, 13129); + $475 = $db + 4 | 0; + $476 = HEAP32[$475 >> 2] | 0; + $478 = HEAP32[$db + 8 >> 2] | 0; + if ($476 >>> 0 < $478 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($476, $15); + HEAP32[$475 >> 2] = (HEAP32[$475 >> 2] | 0) + 24; + } else { + $485 = HEAP32[$db >> 2] | 0; + $486 = $476 - $485 | 0; + $487 = ($486 | 0) / 24 | 0; + $488 = $487 + 1 | 0; + if (($486 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $492 = ($478 - $485 | 0) / 24 | 0; + if ($492 >>> 0 < 1073741823) { + $494 = $492 << 1; + $$0$i$i$i75 = $494 >>> 0 < $488 >>> 0 ? $488 : $494; + } else $$0$i$i$i75 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i224, $$0$i$i$i75, $487, $db + 12 | 0); + $497 = $__v$i$i224 + 8 | 0; + $498 = HEAP32[$497 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($498, $15); + HEAP32[$497 >> 2] = $498 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i224); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i224); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($15); + $$0 = $first + 2 | 0; + break L1; + break; + } + case 116: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj10EEERAT__Kc($16, 13140); + $501 = $db + 4 | 0; + $502 = HEAP32[$501 >> 2] | 0; + $504 = HEAP32[$db + 8 >> 2] | 0; + if ($502 >>> 0 < $504 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($502, $16); + HEAP32[$501 >> 2] = (HEAP32[$501 >> 2] | 0) + 24; + } else { + $511 = HEAP32[$db >> 2] | 0; + $512 = $502 - $511 | 0; + $513 = ($512 | 0) / 24 | 0; + $514 = $513 + 1 | 0; + if (($512 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $518 = ($504 - $511 | 0) / 24 | 0; + if ($518 >>> 0 < 1073741823) { + $520 = $518 << 1; + $$0$i$i$i80 = $520 >>> 0 < $514 >>> 0 ? $514 : $520; + } else $$0$i$i$i80 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i224, $$0$i$i$i80, $513, $db + 12 | 0); + $523 = $__v$i$i224 + 8 | 0; + $524 = HEAP32[$523 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($524, $16); + HEAP32[$523 >> 2] = $524 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i224); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i224); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($16); + $$0 = $first + 2 | 0; + break L1; + break; + } + default: + { + $$0 = $first; + break L1; + } + } + break; + } + case 105: + { + if ((HEAP8[$first + 1 >> 0] | 0) != 120) { + $$0 = $first; + break L1; + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj11EEERAT__Kc($17, 13150); + $530 = $db + 4 | 0; + $531 = HEAP32[$530 >> 2] | 0; + $533 = HEAP32[$db + 8 >> 2] | 0; + if ($531 >>> 0 < $533 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($531, $17); + HEAP32[$530 >> 2] = (HEAP32[$530 >> 2] | 0) + 24; + } else { + $540 = HEAP32[$db >> 2] | 0; + $541 = $531 - $540 | 0; + $542 = ($541 | 0) / 24 | 0; + $543 = $542 + 1 | 0; + if (($541 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $547 = ($533 - $540 | 0) / 24 | 0; + if ($547 >>> 0 < 1073741823) { + $549 = $547 << 1; + $$0$i$i$i85 = $549 >>> 0 < $543 >>> 0 ? $543 : $549; + } else $$0$i$i$i85 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i224, $$0$i$i$i85, $542, $db + 12 | 0); + $552 = $__v$i$i224 + 8 | 0; + $553 = HEAP32[$552 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($553, $17); + HEAP32[$552 >> 2] = $553 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i224); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i224); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($17); + $$0 = $first + 2 | 0; + break L1; + break; + } + case 108: + { + switch (HEAP8[$first + 1 >> 0] | 0) { + case 101: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj11EEERAT__Kc($18, 13161); + $559 = $db + 4 | 0; + $560 = HEAP32[$559 >> 2] | 0; + $562 = HEAP32[$db + 8 >> 2] | 0; + if ($560 >>> 0 < $562 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($560, $18); + HEAP32[$559 >> 2] = (HEAP32[$559 >> 2] | 0) + 24; + } else { + $569 = HEAP32[$db >> 2] | 0; + $570 = $560 - $569 | 0; + $571 = ($570 | 0) / 24 | 0; + $572 = $571 + 1 | 0; + if (($570 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $576 = ($562 - $569 | 0) / 24 | 0; + if ($576 >>> 0 < 1073741823) { + $578 = $576 << 1; + $$0$i$i$i90 = $578 >>> 0 < $572 >>> 0 ? $572 : $578; + } else $$0$i$i$i90 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i224, $$0$i$i$i90, $571, $db + 12 | 0); + $581 = $__v$i$i224 + 8 | 0; + $582 = HEAP32[$581 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($582, $18); + HEAP32[$581 >> 2] = $582 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i224); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i224); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($18); + $$0 = $first + 2 | 0; + break L1; + break; + } + case 105: + { + $585 = $first + 2 | 0; + $586 = __ZN10__cxxabiv112_GLOBAL__N_117parse_source_nameINS0_2DbEEEPKcS4_S4_RT_($585, $last, $db) | 0; + if (($586 | 0) == ($585 | 0)) { + $$0 = $first; + break L1; + } + $590 = HEAP32[$db + 4 >> 2] | 0; + if ((HEAP32[$db >> 2] | 0) == ($590 | 0)) { + $$0 = $first; + break L1; + } + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc($590 + -24 | 0, 0, 13172) | 0; + $$0 = $586; + break L1; + break; + } + case 115: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj11EEERAT__Kc($19, 13184); + $593 = $db + 4 | 0; + $594 = HEAP32[$593 >> 2] | 0; + $596 = HEAP32[$db + 8 >> 2] | 0; + if ($594 >>> 0 < $596 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($594, $19); + HEAP32[$593 >> 2] = (HEAP32[$593 >> 2] | 0) + 24; + } else { + $603 = HEAP32[$db >> 2] | 0; + $604 = $594 - $603 | 0; + $605 = ($604 | 0) / 24 | 0; + $606 = $605 + 1 | 0; + if (($604 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $610 = ($596 - $603 | 0) / 24 | 0; + if ($610 >>> 0 < 1073741823) { + $612 = $610 << 1; + $$0$i$i$i95 = $612 >>> 0 < $606 >>> 0 ? $606 : $612; + } else $$0$i$i$i95 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i224, $$0$i$i$i95, $605, $db + 12 | 0); + $615 = $__v$i$i224 + 8 | 0; + $616 = HEAP32[$615 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($616, $19); + HEAP32[$615 >> 2] = $616 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i224); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i224); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($19); + $$0 = $first + 2 | 0; + break L1; + break; + } + case 83: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj12EEERAT__Kc($20, 13195); + $619 = $db + 4 | 0; + $620 = HEAP32[$619 >> 2] | 0; + $622 = HEAP32[$db + 8 >> 2] | 0; + if ($620 >>> 0 < $622 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($620, $20); + HEAP32[$619 >> 2] = (HEAP32[$619 >> 2] | 0) + 24; + } else { + $629 = HEAP32[$db >> 2] | 0; + $630 = $620 - $629 | 0; + $631 = ($630 | 0) / 24 | 0; + $632 = $631 + 1 | 0; + if (($630 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $636 = ($622 - $629 | 0) / 24 | 0; + if ($636 >>> 0 < 1073741823) { + $638 = $636 << 1; + $$0$i$i$i100 = $638 >>> 0 < $632 >>> 0 ? $632 : $638; + } else $$0$i$i$i100 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i224, $$0$i$i$i100, $631, $db + 12 | 0); + $641 = $__v$i$i224 + 8 | 0; + $642 = HEAP32[$641 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($642, $20); + HEAP32[$641 >> 2] = $642 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i224); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i224); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($20); + $$0 = $first + 2 | 0; + break L1; + break; + } + case 116: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj10EEERAT__Kc($21, 13207); + $645 = $db + 4 | 0; + $646 = HEAP32[$645 >> 2] | 0; + $648 = HEAP32[$db + 8 >> 2] | 0; + if ($646 >>> 0 < $648 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($646, $21); + HEAP32[$645 >> 2] = (HEAP32[$645 >> 2] | 0) + 24; + } else { + $655 = HEAP32[$db >> 2] | 0; + $656 = $646 - $655 | 0; + $657 = ($656 | 0) / 24 | 0; + $658 = $657 + 1 | 0; + if (($656 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $662 = ($648 - $655 | 0) / 24 | 0; + if ($662 >>> 0 < 1073741823) { + $664 = $662 << 1; + $$0$i$i$i105 = $664 >>> 0 < $658 >>> 0 ? $658 : $664; + } else $$0$i$i$i105 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i224, $$0$i$i$i105, $657, $db + 12 | 0); + $667 = $__v$i$i224 + 8 | 0; + $668 = HEAP32[$667 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($668, $21); + HEAP32[$667 >> 2] = $668 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i224); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i224); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($21); + $$0 = $first + 2 | 0; + break L1; + break; + } + default: + { + $$0 = $first; + break L1; + } + } + break; + } + case 109: + { + switch (HEAP8[$first + 1 >> 0] | 0) { + case 105: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj10EEERAT__Kc($22, 13217); + $674 = $db + 4 | 0; + $675 = HEAP32[$674 >> 2] | 0; + $677 = HEAP32[$db + 8 >> 2] | 0; + if ($675 >>> 0 < $677 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($675, $22); + HEAP32[$674 >> 2] = (HEAP32[$674 >> 2] | 0) + 24; + } else { + $684 = HEAP32[$db >> 2] | 0; + $685 = $675 - $684 | 0; + $686 = ($685 | 0) / 24 | 0; + $687 = $686 + 1 | 0; + if (($685 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $691 = ($677 - $684 | 0) / 24 | 0; + if ($691 >>> 0 < 1073741823) { + $693 = $691 << 1; + $$0$i$i$i110 = $693 >>> 0 < $687 >>> 0 ? $687 : $693; + } else $$0$i$i$i110 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i224, $$0$i$i$i110, $686, $db + 12 | 0); + $696 = $__v$i$i224 + 8 | 0; + $697 = HEAP32[$696 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($697, $22); + HEAP32[$696 >> 2] = $697 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i224); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i224); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($22); + $$0 = $first + 2 | 0; + break L1; + break; + } + case 73: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj11EEERAT__Kc($23, 13227); + $700 = $db + 4 | 0; + $701 = HEAP32[$700 >> 2] | 0; + $703 = HEAP32[$db + 8 >> 2] | 0; + if ($701 >>> 0 < $703 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($701, $23); + HEAP32[$700 >> 2] = (HEAP32[$700 >> 2] | 0) + 24; + } else { + $710 = HEAP32[$db >> 2] | 0; + $711 = $701 - $710 | 0; + $712 = ($711 | 0) / 24 | 0; + $713 = $712 + 1 | 0; + if (($711 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $717 = ($703 - $710 | 0) / 24 | 0; + if ($717 >>> 0 < 1073741823) { + $719 = $717 << 1; + $$0$i$i$i115 = $719 >>> 0 < $713 >>> 0 ? $713 : $719; + } else $$0$i$i$i115 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i224, $$0$i$i$i115, $712, $db + 12 | 0); + $722 = $__v$i$i224 + 8 | 0; + $723 = HEAP32[$722 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($723, $23); + HEAP32[$722 >> 2] = $723 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i224); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i224); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($23); + $$0 = $first + 2 | 0; + break L1; + break; + } + case 108: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj10EEERAT__Kc($24, 13050); + $726 = $db + 4 | 0; + $727 = HEAP32[$726 >> 2] | 0; + $729 = HEAP32[$db + 8 >> 2] | 0; + if ($727 >>> 0 < $729 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($727, $24); + HEAP32[$726 >> 2] = (HEAP32[$726 >> 2] | 0) + 24; + } else { + $736 = HEAP32[$db >> 2] | 0; + $737 = $727 - $736 | 0; + $738 = ($737 | 0) / 24 | 0; + $739 = $738 + 1 | 0; + if (($737 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $743 = ($729 - $736 | 0) / 24 | 0; + if ($743 >>> 0 < 1073741823) { + $745 = $743 << 1; + $$0$i$i$i120 = $745 >>> 0 < $739 >>> 0 ? $739 : $745; + } else $$0$i$i$i120 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i224, $$0$i$i$i120, $738, $db + 12 | 0); + $748 = $__v$i$i224 + 8 | 0; + $749 = HEAP32[$748 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($749, $24); + HEAP32[$748 >> 2] = $749 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i224); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i224); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($24); + $$0 = $first + 2 | 0; + break L1; + break; + } + case 76: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj11EEERAT__Kc($25, 13238); + $752 = $db + 4 | 0; + $753 = HEAP32[$752 >> 2] | 0; + $755 = HEAP32[$db + 8 >> 2] | 0; + if ($753 >>> 0 < $755 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($753, $25); + HEAP32[$752 >> 2] = (HEAP32[$752 >> 2] | 0) + 24; + } else { + $762 = HEAP32[$db >> 2] | 0; + $763 = $753 - $762 | 0; + $764 = ($763 | 0) / 24 | 0; + $765 = $764 + 1 | 0; + if (($763 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $769 = ($755 - $762 | 0) / 24 | 0; + if ($769 >>> 0 < 1073741823) { + $771 = $769 << 1; + $$0$i$i$i125 = $771 >>> 0 < $765 >>> 0 ? $765 : $771; + } else $$0$i$i$i125 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i224, $$0$i$i$i125, $764, $db + 12 | 0); + $774 = $__v$i$i224 + 8 | 0; + $775 = HEAP32[$774 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($775, $25); + HEAP32[$774 >> 2] = $775 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i224); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i224); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($25); + $$0 = $first + 2 | 0; + break L1; + break; + } + case 109: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj11EEERAT__Kc($26, 13249); + $778 = $db + 4 | 0; + $779 = HEAP32[$778 >> 2] | 0; + $781 = HEAP32[$db + 8 >> 2] | 0; + if ($779 >>> 0 < $781 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($779, $26); + HEAP32[$778 >> 2] = (HEAP32[$778 >> 2] | 0) + 24; + } else { + $788 = HEAP32[$db >> 2] | 0; + $789 = $779 - $788 | 0; + $790 = ($789 | 0) / 24 | 0; + $791 = $790 + 1 | 0; + if (($789 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $795 = ($781 - $788 | 0) / 24 | 0; + if ($795 >>> 0 < 1073741823) { + $797 = $795 << 1; + $$0$i$i$i130 = $797 >>> 0 < $791 >>> 0 ? $791 : $797; + } else $$0$i$i$i130 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i224, $$0$i$i$i130, $790, $db + 12 | 0); + $800 = $__v$i$i224 + 8 | 0; + $801 = HEAP32[$800 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($801, $26); + HEAP32[$800 >> 2] = $801 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i224); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i224); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($26); + $$0 = $first + 2 | 0; + break L1; + break; + } + default: + { + $$0 = $first; + break L1; + } + } + break; + } + case 110: + { + switch (HEAP8[$first + 1 >> 0] | 0) { + case 97: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj15EEERAT__Kc($27, 13260); + $807 = $db + 4 | 0; + $808 = HEAP32[$807 >> 2] | 0; + $810 = HEAP32[$db + 8 >> 2] | 0; + if ($808 >>> 0 < $810 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($808, $27); + HEAP32[$807 >> 2] = (HEAP32[$807 >> 2] | 0) + 24; + } else { + $817 = HEAP32[$db >> 2] | 0; + $818 = $808 - $817 | 0; + $819 = ($818 | 0) / 24 | 0; + $820 = $819 + 1 | 0; + if (($818 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $824 = ($810 - $817 | 0) / 24 | 0; + if ($824 >>> 0 < 1073741823) { + $826 = $824 << 1; + $$0$i$i$i135 = $826 >>> 0 < $820 >>> 0 ? $820 : $826; + } else $$0$i$i$i135 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i224, $$0$i$i$i135, $819, $db + 12 | 0); + $829 = $__v$i$i224 + 8 | 0; + $830 = HEAP32[$829 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($830, $27); + HEAP32[$829 >> 2] = $830 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i224); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i224); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($27); + $$0 = $first + 2 | 0; + break L1; + break; + } + case 101: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj11EEERAT__Kc($28, 13275); + $833 = $db + 4 | 0; + $834 = HEAP32[$833 >> 2] | 0; + $836 = HEAP32[$db + 8 >> 2] | 0; + if ($834 >>> 0 < $836 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($834, $28); + HEAP32[$833 >> 2] = (HEAP32[$833 >> 2] | 0) + 24; + } else { + $843 = HEAP32[$db >> 2] | 0; + $844 = $834 - $843 | 0; + $845 = ($844 | 0) / 24 | 0; + $846 = $845 + 1 | 0; + if (($844 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $850 = ($836 - $843 | 0) / 24 | 0; + if ($850 >>> 0 < 1073741823) { + $852 = $850 << 1; + $$0$i$i$i140 = $852 >>> 0 < $846 >>> 0 ? $846 : $852; + } else $$0$i$i$i140 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i224, $$0$i$i$i140, $845, $db + 12 | 0); + $855 = $__v$i$i224 + 8 | 0; + $856 = HEAP32[$855 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($856, $28); + HEAP32[$855 >> 2] = $856 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i224); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i224); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($28); + $$0 = $first + 2 | 0; + break L1; + break; + } + case 103: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj10EEERAT__Kc($29, 13217); + $859 = $db + 4 | 0; + $860 = HEAP32[$859 >> 2] | 0; + $862 = HEAP32[$db + 8 >> 2] | 0; + if ($860 >>> 0 < $862 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($860, $29); + HEAP32[$859 >> 2] = (HEAP32[$859 >> 2] | 0) + 24; + } else { + $869 = HEAP32[$db >> 2] | 0; + $870 = $860 - $869 | 0; + $871 = ($870 | 0) / 24 | 0; + $872 = $871 + 1 | 0; + if (($870 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $876 = ($862 - $869 | 0) / 24 | 0; + if ($876 >>> 0 < 1073741823) { + $878 = $876 << 1; + $$0$i$i$i145 = $878 >>> 0 < $872 >>> 0 ? $872 : $878; + } else $$0$i$i$i145 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i224, $$0$i$i$i145, $871, $db + 12 | 0); + $881 = $__v$i$i224 + 8 | 0; + $882 = HEAP32[$881 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($882, $29); + HEAP32[$881 >> 2] = $882 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i224); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i224); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($29); + $$0 = $first + 2 | 0; + break L1; + break; + } + case 116: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj10EEERAT__Kc($30, 13286); + $885 = $db + 4 | 0; + $886 = HEAP32[$885 >> 2] | 0; + $888 = HEAP32[$db + 8 >> 2] | 0; + if ($886 >>> 0 < $888 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($886, $30); + HEAP32[$885 >> 2] = (HEAP32[$885 >> 2] | 0) + 24; + } else { + $895 = HEAP32[$db >> 2] | 0; + $896 = $886 - $895 | 0; + $897 = ($896 | 0) / 24 | 0; + $898 = $897 + 1 | 0; + if (($896 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $902 = ($888 - $895 | 0) / 24 | 0; + if ($902 >>> 0 < 1073741823) { + $904 = $902 << 1; + $$0$i$i$i150 = $904 >>> 0 < $898 >>> 0 ? $898 : $904; + } else $$0$i$i$i150 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i224, $$0$i$i$i150, $897, $db + 12 | 0); + $907 = $__v$i$i224 + 8 | 0; + $908 = HEAP32[$907 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($908, $30); + HEAP32[$907 >> 2] = $908 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i224); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i224); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($30); + $$0 = $first + 2 | 0; + break L1; + break; + } + case 119: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj13EEERAT__Kc($31, 13296); + $911 = $db + 4 | 0; + $912 = HEAP32[$911 >> 2] | 0; + $914 = HEAP32[$db + 8 >> 2] | 0; + if ($912 >>> 0 < $914 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($912, $31); + HEAP32[$911 >> 2] = (HEAP32[$911 >> 2] | 0) + 24; + } else { + $921 = HEAP32[$db >> 2] | 0; + $922 = $912 - $921 | 0; + $923 = ($922 | 0) / 24 | 0; + $924 = $923 + 1 | 0; + if (($922 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $928 = ($914 - $921 | 0) / 24 | 0; + if ($928 >>> 0 < 1073741823) { + $930 = $928 << 1; + $$0$i$i$i155 = $930 >>> 0 < $924 >>> 0 ? $924 : $930; + } else $$0$i$i$i155 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i224, $$0$i$i$i155, $923, $db + 12 | 0); + $933 = $__v$i$i224 + 8 | 0; + $934 = HEAP32[$933 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($934, $31); + HEAP32[$933 >> 2] = $934 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i224); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i224); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($31); + $$0 = $first + 2 | 0; + break L1; + break; + } + default: + { + $$0 = $first; + break L1; + } + } + break; + } + case 111: + { + switch (HEAP8[$first + 1 >> 0] | 0) { + case 111: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj11EEERAT__Kc($32, 13309); + $940 = $db + 4 | 0; + $941 = HEAP32[$940 >> 2] | 0; + $943 = HEAP32[$db + 8 >> 2] | 0; + if ($941 >>> 0 < $943 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($941, $32); + HEAP32[$940 >> 2] = (HEAP32[$940 >> 2] | 0) + 24; + } else { + $950 = HEAP32[$db >> 2] | 0; + $951 = $941 - $950 | 0; + $952 = ($951 | 0) / 24 | 0; + $953 = $952 + 1 | 0; + if (($951 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $957 = ($943 - $950 | 0) / 24 | 0; + if ($957 >>> 0 < 1073741823) { + $959 = $957 << 1; + $$0$i$i$i160 = $959 >>> 0 < $953 >>> 0 ? $953 : $959; + } else $$0$i$i$i160 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i224, $$0$i$i$i160, $952, $db + 12 | 0); + $962 = $__v$i$i224 + 8 | 0; + $963 = HEAP32[$962 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($963, $32); + HEAP32[$962 >> 2] = $963 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i224); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i224); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($32); + $$0 = $first + 2 | 0; + break L1; + break; + } + case 114: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj10EEERAT__Kc($33, 13320); + $966 = $db + 4 | 0; + $967 = HEAP32[$966 >> 2] | 0; + $969 = HEAP32[$db + 8 >> 2] | 0; + if ($967 >>> 0 < $969 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($967, $33); + HEAP32[$966 >> 2] = (HEAP32[$966 >> 2] | 0) + 24; + } else { + $976 = HEAP32[$db >> 2] | 0; + $977 = $967 - $976 | 0; + $978 = ($977 | 0) / 24 | 0; + $979 = $978 + 1 | 0; + if (($977 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $983 = ($969 - $976 | 0) / 24 | 0; + if ($983 >>> 0 < 1073741823) { + $985 = $983 << 1; + $$0$i$i$i165 = $985 >>> 0 < $979 >>> 0 ? $979 : $985; + } else $$0$i$i$i165 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i224, $$0$i$i$i165, $978, $db + 12 | 0); + $988 = $__v$i$i224 + 8 | 0; + $989 = HEAP32[$988 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($989, $33); + HEAP32[$988 >> 2] = $989 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i224); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i224); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($33); + $$0 = $first + 2 | 0; + break L1; + break; + } + case 82: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj11EEERAT__Kc($34, 13330); + $992 = $db + 4 | 0; + $993 = HEAP32[$992 >> 2] | 0; + $995 = HEAP32[$db + 8 >> 2] | 0; + if ($993 >>> 0 < $995 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($993, $34); + HEAP32[$992 >> 2] = (HEAP32[$992 >> 2] | 0) + 24; + } else { + $1002 = HEAP32[$db >> 2] | 0; + $1003 = $993 - $1002 | 0; + $1004 = ($1003 | 0) / 24 | 0; + $1005 = $1004 + 1 | 0; + if (($1003 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $1009 = ($995 - $1002 | 0) / 24 | 0; + if ($1009 >>> 0 < 1073741823) { + $1011 = $1009 << 1; + $$0$i$i$i170 = $1011 >>> 0 < $1005 >>> 0 ? $1005 : $1011; + } else $$0$i$i$i170 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i224, $$0$i$i$i170, $1004, $db + 12 | 0); + $1014 = $__v$i$i224 + 8 | 0; + $1015 = HEAP32[$1014 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($1015, $34); + HEAP32[$1014 >> 2] = $1015 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i224); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i224); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($34); + $$0 = $first + 2 | 0; + break L1; + break; + } + default: + { + $$0 = $first; + break L1; + } + } + break; + } + case 112: + { + switch (HEAP8[$first + 1 >> 0] | 0) { + case 109: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj12EEERAT__Kc($35, 13341); + $1021 = $db + 4 | 0; + $1022 = HEAP32[$1021 >> 2] | 0; + $1024 = HEAP32[$db + 8 >> 2] | 0; + if ($1022 >>> 0 < $1024 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($1022, $35); + HEAP32[$1021 >> 2] = (HEAP32[$1021 >> 2] | 0) + 24; + } else { + $1031 = HEAP32[$db >> 2] | 0; + $1032 = $1022 - $1031 | 0; + $1033 = ($1032 | 0) / 24 | 0; + $1034 = $1033 + 1 | 0; + if (($1032 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $1038 = ($1024 - $1031 | 0) / 24 | 0; + if ($1038 >>> 0 < 1073741823) { + $1040 = $1038 << 1; + $$0$i$i$i175 = $1040 >>> 0 < $1034 >>> 0 ? $1034 : $1040; + } else $$0$i$i$i175 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i224, $$0$i$i$i175, $1033, $db + 12 | 0); + $1043 = $__v$i$i224 + 8 | 0; + $1044 = HEAP32[$1043 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($1044, $35); + HEAP32[$1043 >> 2] = $1044 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i224); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i224); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($35); + $$0 = $first + 2 | 0; + break L1; + break; + } + case 108: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj10EEERAT__Kc($36, 13353); + $1047 = $db + 4 | 0; + $1048 = HEAP32[$1047 >> 2] | 0; + $1050 = HEAP32[$db + 8 >> 2] | 0; + if ($1048 >>> 0 < $1050 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($1048, $36); + HEAP32[$1047 >> 2] = (HEAP32[$1047 >> 2] | 0) + 24; + } else { + $1057 = HEAP32[$db >> 2] | 0; + $1058 = $1048 - $1057 | 0; + $1059 = ($1058 | 0) / 24 | 0; + $1060 = $1059 + 1 | 0; + if (($1058 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $1064 = ($1050 - $1057 | 0) / 24 | 0; + if ($1064 >>> 0 < 1073741823) { + $1066 = $1064 << 1; + $$0$i$i$i180 = $1066 >>> 0 < $1060 >>> 0 ? $1060 : $1066; + } else $$0$i$i$i180 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i224, $$0$i$i$i180, $1059, $db + 12 | 0); + $1069 = $__v$i$i224 + 8 | 0; + $1070 = HEAP32[$1069 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($1070, $36); + HEAP32[$1069 >> 2] = $1070 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i224); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i224); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($36); + $$0 = $first + 2 | 0; + break L1; + break; + } + case 76: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj11EEERAT__Kc($37, 13363); + $1073 = $db + 4 | 0; + $1074 = HEAP32[$1073 >> 2] | 0; + $1076 = HEAP32[$db + 8 >> 2] | 0; + if ($1074 >>> 0 < $1076 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($1074, $37); + HEAP32[$1073 >> 2] = (HEAP32[$1073 >> 2] | 0) + 24; + } else { + $1083 = HEAP32[$db >> 2] | 0; + $1084 = $1074 - $1083 | 0; + $1085 = ($1084 | 0) / 24 | 0; + $1086 = $1085 + 1 | 0; + if (($1084 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $1090 = ($1076 - $1083 | 0) / 24 | 0; + if ($1090 >>> 0 < 1073741823) { + $1092 = $1090 << 1; + $$0$i$i$i185 = $1092 >>> 0 < $1086 >>> 0 ? $1086 : $1092; + } else $$0$i$i$i185 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i224, $$0$i$i$i185, $1085, $db + 12 | 0); + $1095 = $__v$i$i224 + 8 | 0; + $1096 = HEAP32[$1095 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($1096, $37); + HEAP32[$1095 >> 2] = $1096 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i224); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i224); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($37); + $$0 = $first + 2 | 0; + break L1; + break; + } + case 112: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj11EEERAT__Kc($38, 13374); + $1099 = $db + 4 | 0; + $1100 = HEAP32[$1099 >> 2] | 0; + $1102 = HEAP32[$db + 8 >> 2] | 0; + if ($1100 >>> 0 < $1102 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($1100, $38); + HEAP32[$1099 >> 2] = (HEAP32[$1099 >> 2] | 0) + 24; + } else { + $1109 = HEAP32[$db >> 2] | 0; + $1110 = $1100 - $1109 | 0; + $1111 = ($1110 | 0) / 24 | 0; + $1112 = $1111 + 1 | 0; + if (($1110 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $1116 = ($1102 - $1109 | 0) / 24 | 0; + if ($1116 >>> 0 < 1073741823) { + $1118 = $1116 << 1; + $$0$i$i$i190 = $1118 >>> 0 < $1112 >>> 0 ? $1112 : $1118; + } else $$0$i$i$i190 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i224, $$0$i$i$i190, $1111, $db + 12 | 0); + $1121 = $__v$i$i224 + 8 | 0; + $1122 = HEAP32[$1121 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($1122, $38); + HEAP32[$1121 >> 2] = $1122 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i224); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i224); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($38); + $$0 = $first + 2 | 0; + break L1; + break; + } + case 115: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj10EEERAT__Kc($39, 13353); + $1125 = $db + 4 | 0; + $1126 = HEAP32[$1125 >> 2] | 0; + $1128 = HEAP32[$db + 8 >> 2] | 0; + if ($1126 >>> 0 < $1128 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($1126, $39); + HEAP32[$1125 >> 2] = (HEAP32[$1125 >> 2] | 0) + 24; + } else { + $1135 = HEAP32[$db >> 2] | 0; + $1136 = $1126 - $1135 | 0; + $1137 = ($1136 | 0) / 24 | 0; + $1138 = $1137 + 1 | 0; + if (($1136 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $1142 = ($1128 - $1135 | 0) / 24 | 0; + if ($1142 >>> 0 < 1073741823) { + $1144 = $1142 << 1; + $$0$i$i$i195 = $1144 >>> 0 < $1138 >>> 0 ? $1138 : $1144; + } else $$0$i$i$i195 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i224, $$0$i$i$i195, $1137, $db + 12 | 0); + $1147 = $__v$i$i224 + 8 | 0; + $1148 = HEAP32[$1147 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($1148, $39); + HEAP32[$1147 >> 2] = $1148 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i224); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i224); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($39); + $$0 = $first + 2 | 0; + break L1; + break; + } + case 116: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj11EEERAT__Kc($40, 13385); + $1151 = $db + 4 | 0; + $1152 = HEAP32[$1151 >> 2] | 0; + $1154 = HEAP32[$db + 8 >> 2] | 0; + if ($1152 >>> 0 < $1154 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($1152, $40); + HEAP32[$1151 >> 2] = (HEAP32[$1151 >> 2] | 0) + 24; + } else { + $1161 = HEAP32[$db >> 2] | 0; + $1162 = $1152 - $1161 | 0; + $1163 = ($1162 | 0) / 24 | 0; + $1164 = $1163 + 1 | 0; + if (($1162 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $1168 = ($1154 - $1161 | 0) / 24 | 0; + if ($1168 >>> 0 < 1073741823) { + $1170 = $1168 << 1; + $$0$i$i$i200 = $1170 >>> 0 < $1164 >>> 0 ? $1164 : $1170; + } else $$0$i$i$i200 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i224, $$0$i$i$i200, $1163, $db + 12 | 0); + $1173 = $__v$i$i224 + 8 | 0; + $1174 = HEAP32[$1173 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($1174, $40); + HEAP32[$1173 >> 2] = $1174 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i224); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i224); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($40); + $$0 = $first + 2 | 0; + break L1; + break; + } + default: + { + $$0 = $first; + break L1; + } + } + break; + } + case 113: + { + if ((HEAP8[$first + 1 >> 0] | 0) != 117) { + $$0 = $first; + break L1; + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj10EEERAT__Kc($41, 13396); + $1180 = $db + 4 | 0; + $1181 = HEAP32[$1180 >> 2] | 0; + $1183 = HEAP32[$db + 8 >> 2] | 0; + if ($1181 >>> 0 < $1183 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($1181, $41); + HEAP32[$1180 >> 2] = (HEAP32[$1180 >> 2] | 0) + 24; + } else { + $1190 = HEAP32[$db >> 2] | 0; + $1191 = $1181 - $1190 | 0; + $1192 = ($1191 | 0) / 24 | 0; + $1193 = $1192 + 1 | 0; + if (($1191 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $1197 = ($1183 - $1190 | 0) / 24 | 0; + if ($1197 >>> 0 < 1073741823) { + $1199 = $1197 << 1; + $$0$i$i$i205 = $1199 >>> 0 < $1193 >>> 0 ? $1193 : $1199; + } else $$0$i$i$i205 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i224, $$0$i$i$i205, $1192, $db + 12 | 0); + $1202 = $__v$i$i224 + 8 | 0; + $1203 = HEAP32[$1202 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($1203, $41); + HEAP32[$1202 >> 2] = $1203 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i224); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i224); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($41); + $$0 = $first + 2 | 0; + break L1; + break; + } + case 114: + { + switch (HEAP8[$first + 1 >> 0] | 0) { + case 109: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj10EEERAT__Kc($42, 13406); + $1209 = $db + 4 | 0; + $1210 = HEAP32[$1209 >> 2] | 0; + $1212 = HEAP32[$db + 8 >> 2] | 0; + if ($1210 >>> 0 < $1212 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($1210, $42); + HEAP32[$1209 >> 2] = (HEAP32[$1209 >> 2] | 0) + 24; + } else { + $1219 = HEAP32[$db >> 2] | 0; + $1220 = $1210 - $1219 | 0; + $1221 = ($1220 | 0) / 24 | 0; + $1222 = $1221 + 1 | 0; + if (($1220 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $1226 = ($1212 - $1219 | 0) / 24 | 0; + if ($1226 >>> 0 < 1073741823) { + $1228 = $1226 << 1; + $$0$i$i$i210 = $1228 >>> 0 < $1222 >>> 0 ? $1222 : $1228; + } else $$0$i$i$i210 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i224, $$0$i$i$i210, $1221, $db + 12 | 0); + $1231 = $__v$i$i224 + 8 | 0; + $1232 = HEAP32[$1231 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($1232, $42); + HEAP32[$1231 >> 2] = $1232 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i224); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i224); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($42); + $$0 = $first + 2 | 0; + break L1; + break; + } + case 77: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj11EEERAT__Kc($43, 13416); + $1235 = $db + 4 | 0; + $1236 = HEAP32[$1235 >> 2] | 0; + $1238 = HEAP32[$db + 8 >> 2] | 0; + if ($1236 >>> 0 < $1238 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($1236, $43); + HEAP32[$1235 >> 2] = (HEAP32[$1235 >> 2] | 0) + 24; + } else { + $1245 = HEAP32[$db >> 2] | 0; + $1246 = $1236 - $1245 | 0; + $1247 = ($1246 | 0) / 24 | 0; + $1248 = $1247 + 1 | 0; + if (($1246 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $1252 = ($1238 - $1245 | 0) / 24 | 0; + if ($1252 >>> 0 < 1073741823) { + $1254 = $1252 << 1; + $$0$i$i$i215 = $1254 >>> 0 < $1248 >>> 0 ? $1248 : $1254; + } else $$0$i$i$i215 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i224, $$0$i$i$i215, $1247, $db + 12 | 0); + $1257 = $__v$i$i224 + 8 | 0; + $1258 = HEAP32[$1257 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($1258, $43); + HEAP32[$1257 >> 2] = $1258 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i224); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i224); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($43); + $$0 = $first + 2 | 0; + break L1; + break; + } + case 115: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj11EEERAT__Kc($44, 13427); + $1261 = $db + 4 | 0; + $1262 = HEAP32[$1261 >> 2] | 0; + $1264 = HEAP32[$db + 8 >> 2] | 0; + if ($1262 >>> 0 < $1264 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($1262, $44); + HEAP32[$1261 >> 2] = (HEAP32[$1261 >> 2] | 0) + 24; + } else { + $1271 = HEAP32[$db >> 2] | 0; + $1272 = $1262 - $1271 | 0; + $1273 = ($1272 | 0) / 24 | 0; + $1274 = $1273 + 1 | 0; + if (($1272 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $1278 = ($1264 - $1271 | 0) / 24 | 0; + if ($1278 >>> 0 < 1073741823) { + $1280 = $1278 << 1; + $$0$i$i$i220 = $1280 >>> 0 < $1274 >>> 0 ? $1274 : $1280; + } else $$0$i$i$i220 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i224, $$0$i$i$i220, $1273, $db + 12 | 0); + $1283 = $__v$i$i224 + 8 | 0; + $1284 = HEAP32[$1283 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($1284, $44); + HEAP32[$1283 >> 2] = $1284 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i224); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i224); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($44); + $$0 = $first + 2 | 0; + break L1; + break; + } + case 83: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj12EEERAT__Kc($45, 13438); + $1287 = $db + 4 | 0; + $1288 = HEAP32[$1287 >> 2] | 0; + $1290 = HEAP32[$db + 8 >> 2] | 0; + if ($1288 >>> 0 < $1290 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($1288, $45); + HEAP32[$1287 >> 2] = (HEAP32[$1287 >> 2] | 0) + 24; + } else { + $1297 = HEAP32[$db >> 2] | 0; + $1298 = $1288 - $1297 | 0; + $1299 = ($1298 | 0) / 24 | 0; + $1300 = $1299 + 1 | 0; + if (($1298 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $1304 = ($1290 - $1297 | 0) / 24 | 0; + if ($1304 >>> 0 < 1073741823) { + $1306 = $1304 << 1; + $$0$i$i$i225 = $1306 >>> 0 < $1300 >>> 0 ? $1300 : $1306; + } else $$0$i$i$i225 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i224, $$0$i$i$i225, $1299, $db + 12 | 0); + $1309 = $__v$i$i224 + 8 | 0; + $1310 = HEAP32[$1309 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($1310, $45); + HEAP32[$1309 >> 2] = $1310 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i224); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i224); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($45); + $$0 = $first + 2 | 0; + break L1; + break; + } + default: + { + $$0 = $first; + break L1; + } + } + break; + } + case 118: + { + if (((HEAP8[$first + 1 >> 0] | 0) + -48 | 0) >>> 0 >= 10) { + $$0 = $first; + break L1; + } + $1316 = $first + 2 | 0; + $1317 = __ZN10__cxxabiv112_GLOBAL__N_117parse_source_nameINS0_2DbEEEPKcS4_S4_RT_($1316, $last, $db) | 0; + if (($1317 | 0) == ($1316 | 0)) { + $$0 = $first; + break L1; + } + $1321 = HEAP32[$db + 4 >> 2] | 0; + if ((HEAP32[$db >> 2] | 0) == ($1321 | 0)) { + $$0 = $first; + break L1; + } + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc($1321 + -24 | 0, 0, 13022) | 0; + $$0 = $1317; + break L1; + break; + } + default: + { + $$0 = $first; + break L1; + } + } while (0); else $$0 = $first; while (0); + STACKTOP = sp; + return $$0 | 0; +} +function _arPattGetImage2($imageProcMode, $pattDetectMode, $patt_size, $sample_size, $image, $xsize, $ysize, $pixelFormat, $paramLTf, $vertex, $pattRatio, $ext_patt) { + $imageProcMode = $imageProcMode | 0; + $pattDetectMode = $pattDetectMode | 0; + $patt_size = $patt_size | 0; + $sample_size = $sample_size | 0; + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $pixelFormat = $pixelFormat | 0; + $paramLTf = $paramLTf | 0; + $vertex = $vertex | 0; + $pattRatio = +$pattRatio; + $ext_patt = $ext_patt | 0; + var $$0 = 0, $100 = 0, $1001 = 0, $1005 = 0, $1009 = 0, $1012 = 0, $1023 = 0.0, $1028 = 0.0, $103 = 0.0, $1035 = 0.0, $104 = 0.0, $1045 = 0.0, $1054 = 0.0, $1055 = 0.0, $106 = 0, $107 = 0, $1074 = 0, $108 = 0, $1084 = 0, $1090 = 0.0, $1096 = 0.0, $1097 = 0.0, $110 = 0.0, $1101 = 0, $1107 = 0, $111 = 0.0, $1111 = 0, $1113 = 0, $1119 = 0, $112 = 0.0, $1120 = 0, $1124 = 0, $1128 = 0, $113 = 0, $1132 = 0, $1135 = 0, $114 = 0, $1146 = 0.0, $115 = 0, $1151 = 0.0, $1158 = 0.0, $116 = 0, $1168 = 0.0, $117 = 0, $1177 = 0.0, $1178 = 0.0, $118 = 0, $119 = 0, $1199 = 0, $120 = 0, $1203 = 0, $121 = 0, $1211 = 0, $1212 = 0, $1217 = 0, $1225 = 0, $123 = 0, $1231 = 0, $124 = 0.0, $1242 = 0.0, $1247 = 0.0, $125 = 0.0, $1254 = 0.0, $126 = 0.0, $1264 = 0.0, $127 = 0, $1273 = 0.0, $1274 = 0.0, $128 = 0, $129 = 0, $1295 = 0, $1299 = 0, $130 = 0, $1307 = 0, $1308 = 0, $131 = 0, $1313 = 0, $132 = 0, $1321 = 0, $1327 = 0, $133 = 0, $1338 = 0.0, $134 = 0, $1343 = 0.0, $135 = 0, $1350 = 0.0, $1360 = 0.0, $1369 = 0.0, $137 = 0, $1370 = 0.0, $138 = 0.0, $139 = 0.0, $1391 = 0, $140 = 0.0, $1402 = 0, $1403 = 0, $1408 = 0, $141 = 0, $1413 = 0, $1419 = 0, $142 = 0, $143 = 0, $1433 = 0, $1436 = 0.0, $1437 = 0.0, $1438 = 0.0, $1439 = 0, $144 = 0, $1440 = 0, $1441 = 0, $1442 = 0, $1443 = 0, $1444 = 0, $1445 = 0, $1446 = 0, $1447 = 0, $1449 = 0, $145 = 0, $1450 = 0, $1456 = 0.0, $146 = 0, $1461 = 0.0, $1468 = 0.0, $147 = 0, $1478 = 0.0, $148 = 0, $1487 = 0.0, $1488 = 0.0, $149 = 0, $1509 = 0, $151 = 0, $152 = 0.0, $1528 = 0, $153 = 0.0, $1537 = 0.0, $1538 = 0.0, $1539 = 0.0, $154 = 0.0, $1540 = 0, $1541 = 0, $1542 = 0, $1543 = 0, $1544 = 0, $1545 = 0, $1546 = 0, $1547 = 0, $1548 = 0, $155 = 0, $1550 = 0, $1555 = 0.0, $156 = 0, $1560 = 0.0, $1567 = 0.0, $157 = 0, $1577 = 0.0, $158 = 0, $1586 = 0.0, $1587 = 0.0, $159 = 0, $160 = 0, $1608 = 0, $161 = 0, $162 = 0, $1627 = 0, $163 = 0, $1636 = 0.0, $1637 = 0.0, $1638 = 0.0, $1639 = 0, $1640 = 0, $1641 = 0, $1642 = 0, $1643 = 0, $1644 = 0, $1645 = 0, $1646 = 0, $1647 = 0, $1649 = 0, $165 = 0, $1654 = 0.0, $1659 = 0.0, $166 = 0.0, $1666 = 0.0, $167 = 0.0, $1676 = 0.0, $168 = 0.0, $1685 = 0.0, $1686 = 0.0, $169 = 0, $170 = 0, $1707 = 0, $171 = 0, $172 = 0, $1727 = 0, $173 = 0, $1734 = 0.0, $1735 = 0.0, $1736 = 0.0, $1737 = 0, $1738 = 0, $1739 = 0, $174 = 0, $1740 = 0, $1741 = 0, $1742 = 0, $1743 = 0, $1744 = 0, $1745 = 0, $1747 = 0, $1748 = 0.0, $1749 = 0.0, $175 = 0, $1750 = 0.0, $1751 = 0, $1752 = 0, $1753 = 0, $1754 = 0, $1755 = 0, $1756 = 0, $1757 = 0, $1758 = 0, $1759 = 0, $176 = 0, $1761 = 0, $1762 = 0.0, $1763 = 0.0, $1764 = 0.0, $1765 = 0, $1766 = 0, $1767 = 0, $1768 = 0, $1769 = 0, $177 = 0, $1770 = 0, $1771 = 0, $1772 = 0, $1773 = 0, $1775 = 0, $1776 = 0.0, $1777 = 0.0, $1778 = 0.0, $1779 = 0, $1780 = 0, $1781 = 0, $1782 = 0, $1783 = 0, $1784 = 0, $1785 = 0, $1786 = 0, $1787 = 0, $1789 = 0, $179 = 0, $1790 = 0.0, $1791 = 0.0, $1792 = 0.0, $1793 = 0, $1794 = 0, $1795 = 0, $1796 = 0, $1797 = 0, $1798 = 0, $1799 = 0, $180 = 0.0, $1800 = 0, $1801 = 0, $1803 = 0, $1804 = 0.0, $1805 = 0.0, $1806 = 0.0, $1807 = 0, $1808 = 0, $1809 = 0, $181 = 0.0, $1810 = 0, $1811 = 0, $1812 = 0, $1813 = 0, $1814 = 0, $1815 = 0, $1817 = 0, $182 = 0.0, $1822 = 0.0, $1827 = 0.0, $183 = 0, $1834 = 0.0, $184 = 0, $1844 = 0.0, $185 = 0, $1853 = 0.0, $1854 = 0.0, $186 = 0, $187 = 0, $1875 = 0, $188 = 0, $1882 = 0, $189 = 0, $1893 = 0.0, $1898 = 0.0, $190 = 0, $1905 = 0.0, $191 = 0, $1915 = 0.0, $1924 = 0.0, $1925 = 0.0, $193 = 0, $194 = 0.0, $1948 = 0, $195 = 0.0, $1955 = 0, $196 = 0.0, $1966 = 0.0, $197 = 0, $1971 = 0.0, $1978 = 0.0, $198 = 0, $1988 = 0.0, $199 = 0, $1997 = 0.0, $1998 = 0.0, $200 = 0, $201 = 0, $202 = 0, $2020 = 0, $2027 = 0, $203 = 0, $2038 = 0.0, $204 = 0, $2043 = 0.0, $205 = 0, $2050 = 0.0, $2060 = 0.0, $2069 = 0.0, $207 = 0, $2070 = 0.0, $208 = 0.0, $209 = 0.0, $2091 = 0, $2094 = 0, $210 = 0.0, $2102 = 0, $211 = 0, $2117 = 0, $212 = 0, $2128 = 0.0, $213 = 0, $2133 = 0.0, $214 = 0, $2140 = 0.0, $215 = 0, $2150 = 0.0, $2159 = 0.0, $216 = 0, $2160 = 0.0, $217 = 0, $218 = 0, $2181 = 0, $2184 = 0, $219 = 0, $2192 = 0, $2207 = 0, $221 = 0, $2218 = 0.0, $222 = 0.0, $2223 = 0.0, $223 = 0.0, $2230 = 0.0, $224 = 0.0, $2240 = 0.0, $2249 = 0.0, $225 = 0, $2250 = 0.0, $226 = 0, $227 = 0, $2271 = 0, $2274 = 0, $228 = 0, $229 = 0, $2293 = 0, $230 = 0, $231 = 0, $232 = 0, $233 = 0, $235 = 0, $236 = 0.0, $237 = 0.0, $238 = 0.0, $239 = 0, $240 = 0, $241 = 0, $242 = 0, $243 = 0, $244 = 0, $245 = 0, $246 = 0, $247 = 0, $249 = 0, $250 = 0.0, $251 = 0.0, $252 = 0.0, $253 = 0, $254 = 0, $255 = 0, $256 = 0, $257 = 0, $258 = 0, $259 = 0, $260 = 0, $261 = 0, $263 = 0, $264 = 0.0, $265 = 0.0, $266 = 0.0, $267 = 0, $268 = 0, $269 = 0, $270 = 0, $271 = 0, $272 = 0, $273 = 0, $274 = 0, $275 = 0, $277 = 0, $278 = 0, $284 = 0.0, $289 = 0.0, $29 = 0.0, $296 = 0.0, $306 = 0.0, $31 = 0.0, $315 = 0.0, $316 = 0.0, $32 = 0.0, $337 = 0, $346 = 0, $347 = 0, $35 = 0.0, $355 = 0, $362 = 0, $37 = 0.0, $373 = 0.0, $378 = 0.0, $38 = 0.0, $385 = 0.0, $395 = 0.0, $404 = 0.0, $405 = 0.0, $41 = 0, $426 = 0, $43 = 0.0, $434 = 0, $435 = 0, $443 = 0, $45 = 0.0, $451 = 0, $46 = 0.0, $462 = 0.0, $467 = 0.0, $474 = 0.0, $484 = 0.0, $49 = 0.0, $493 = 0.0, $494 = 0.0, $51 = 0.0, $515 = 0, $52 = 0.0, $524 = 0, $525 = 0, $533 = 0, $540 = 0, $55 = 0, $551 = 0.0, $556 = 0.0, $56 = 0.0, $563 = 0.0, $573 = 0.0, $58 = 0.0, $582 = 0.0, $583 = 0.0, $604 = 0, $61 = 0, $612 = 0, $613 = 0, $62 = 0.0, $621 = 0, $629 = 0, $64 = 0.0, $640 = 0.0, $645 = 0.0, $652 = 0.0, $662 = 0.0, $67 = 0, $671 = 0.0, $672 = 0.0, $693 = 0, $702 = 0, $703 = 0, $711 = 0, $719 = 0, $73 = 0, $730 = 0.0, $735 = 0.0, $742 = 0.0, $752 = 0.0, $761 = 0.0, $762 = 0.0, $77 = 0, $783 = 0, $785 = 0, $790 = 0, $791 = 0, $795 = 0, $799 = 0, $810 = 0.0, $815 = 0.0, $822 = 0.0, $832 = 0.0, $841 = 0.0, $842 = 0.0, $863 = 0, $872 = 0, $873 = 0, $881 = 0, $889 = 0, $900 = 0.0, $905 = 0.0, $912 = 0.0, $922 = 0.0, $931 = 0.0, $932 = 0.0, $951 = 0, $954 = 0, $959 = 0.0, $973 = 0.0, $974 = 0.0, $978 = 0, $984 = 0, $988 = 0, $99 = 0, $990 = 0, $996 = 0, $997 = 0, $ext_patt2$0 = 0, $i$10291 = 0, $i$11297 = 0, $i$12303 = 0, $i$1237 = 0, $i$13236 = 0, $i$14312 = 0, $i$15318 = 0, $i$16324 = 0, $i$17330 = 0, $i$18336 = 0, $i$19342 = 0, $i$20348 = 0, $i$21354 = 0, $i$22360 = 0, $i$2243 = 0, $i$23309 = 0, $i$3249 = 0, $i$4255 = 0, $i$5261 = 0, $i$6267 = 0, $i$7273 = 0, $i$8279 = 0, $i$9285 = 0, $j$0241 = 0, $j$10301 = 0, $j$11307 = 0, $j$12316 = 0, $j$1247 = 0, $j$13322 = 0, $j$14328 = 0, $j$15334 = 0, $j$16340 = 0, $j$17346 = 0, $j$18352 = 0, $j$19358 = 0, $j$20364 = 0, $j$2253 = 0, $j$3259 = 0, $j$4265 = 0, $j$5271 = 0, $j$6277 = 0, $j$7283 = 0, $j$8289 = 0, $j$9295 = 0, $local = 0, $para = 0, $sample_size$xdiv2$2 = 0, $vararg_buffer = 0, $vararg_buffer1 = 0, $vararg_buffer3 = 0, $vararg_buffer5 = 0, $world = 0, $xc$0 = 0, $xc$1 = 0, $xc$10 = 0, $xc$11 = 0, $xc$12 = 0, $xc$13 = 0, $xc$14 = 0, $xc$15 = 0, $xc$16 = 0, $xc$17 = 0, $xc$18 = 0, $xc$19 = 0, $xc$2 = 0, $xc$20 = 0, $xc$3 = 0, $xc$4 = 0, $xc$5 = 0, $xc$6 = 0, $xc$7 = 0, $xc$8 = 0, $xc$9 = 0, $xc2 = 0, $xdiv2$0 = 0, $xdiv2$0$lcssa = 0, $xdiv2$1 = 0, $xdiv2$1$lcssa = 0, $xdiv2$2 = 0, $yc$0 = 0, $yc$1 = 0, $yc$10 = 0, $yc$11 = 0, $yc$12 = 0, $yc$13 = 0, $yc$14 = 0, $yc$15 = 0, $yc$16 = 0, $yc$17 = 0, $yc$18 = 0, $yc$19 = 0, $yc$2 = 0, $yc$20 = 0, $yc$3 = 0, $yc$4 = 0, $yc$5 = 0, $yc$6 = 0, $yc$7 = 0, $yc$8 = 0, $yc$9 = 0, $yc2 = 0, $ydiv2$0 = 0, $ydiv2$1 = 0, $ydiv2$2 = 0, $ydiv2$3 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 240 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer5 = sp + 224 | 0; + $vararg_buffer3 = sp + 216 | 0; + $vararg_buffer1 = sp + 208 | 0; + $vararg_buffer = sp + 200 | 0; + $world = sp + 136 | 0; + $local = sp + 72 | 0; + $para = sp; + $xc2 = sp + 232 | 0; + $yc2 = sp + 228 | 0; + HEAPF64[$world >> 3] = 100.0; + HEAPF64[$world + 8 >> 3] = 100.0; + HEAPF64[$world + 16 >> 3] = 110.0; + HEAPF64[$world + 24 >> 3] = 100.0; + HEAPF64[$world + 32 >> 3] = 110.0; + HEAPF64[$world + 40 >> 3] = 110.0; + HEAPF64[$world + 48 >> 3] = 100.0; + HEAPF64[$world + 56 >> 3] = 110.0; + HEAPF64[$local >> 3] = +HEAPF64[$vertex >> 3]; + HEAPF64[$local + 8 >> 3] = +HEAPF64[$vertex + 8 >> 3]; + HEAPF64[$local + 16 >> 3] = +HEAPF64[$vertex + 16 >> 3]; + HEAPF64[$local + 24 >> 3] = +HEAPF64[$vertex + 24 >> 3]; + HEAPF64[$local + 32 >> 3] = +HEAPF64[$vertex + 32 >> 3]; + HEAPF64[$local + 40 >> 3] = +HEAPF64[$vertex + 40 >> 3]; + HEAPF64[$local + 48 >> 3] = +HEAPF64[$vertex + 48 >> 3]; + HEAPF64[$local + 56 >> 3] = +HEAPF64[$vertex + 56 >> 3]; + _get_cpara($world, $local, $para); + $29 = +HEAPF64[$local >> 3]; + $31 = +HEAPF64[$local + 16 >> 3]; + $32 = $29 - $31; + $35 = +HEAPF64[$local + 8 >> 3]; + $37 = +HEAPF64[$local + 24 >> 3]; + $38 = $35 - $37; + $41 = ~~($32 * $32 + $38 * $38); + $43 = +HEAPF64[$local + 32 >> 3]; + $45 = +HEAPF64[$local + 48 >> 3]; + $46 = $43 - $45; + $49 = +HEAPF64[$local + 40 >> 3]; + $51 = +HEAPF64[$local + 56 >> 3]; + $52 = $49 - $51; + $55 = ~~($46 * $46 + $52 * $52); + $56 = $31 - $43; + $58 = $37 - $49; + $61 = ~~($56 * $56 + $58 * $58); + $62 = $45 - $29; + $64 = $51 - $35; + $67 = ~~($62 * $62 + $64 * $64); + $73 = ~~(+((($55 | 0) > ($41 | 0) ? $55 : $41) | 0) * $pattRatio * $pattRatio); + $77 = ~~(+((($67 | 0) > ($61 | 0) ? $67 : $61) | 0) * $pattRatio * $pattRatio); + if (!$imageProcMode) { + $xdiv2$0 = $patt_size; + while (1) if (($xdiv2$0 | 0) < ($sample_size | 0) & (Math_imul($xdiv2$0, $xdiv2$0) | 0) < ($73 | 0)) $xdiv2$0 = $xdiv2$0 << 1; else { + $xdiv2$0$lcssa = $xdiv2$0; + break; + } + $ydiv2$0 = $patt_size; + while (1) if (($ydiv2$0 | 0) < ($sample_size | 0) & (Math_imul($ydiv2$0, $ydiv2$0) | 0) < ($77 | 0)) $ydiv2$0 = $ydiv2$0 << 1; else { + $xdiv2$2 = $xdiv2$0$lcssa; + $ydiv2$2 = $ydiv2$0; + break; + } + } else { + $xdiv2$1 = $patt_size; + while (1) if (($xdiv2$1 | 0) < ($sample_size | 0) & (Math_imul($xdiv2$1 << 2, $xdiv2$1) | 0) < ($73 | 0)) $xdiv2$1 = $xdiv2$1 << 1; else { + $xdiv2$1$lcssa = $xdiv2$1; + break; + } + $ydiv2$1 = $patt_size; + while (1) if (($ydiv2$1 | 0) < ($sample_size | 0) & (Math_imul($ydiv2$1 << 2, $ydiv2$1) | 0) < ($77 | 0)) $ydiv2$1 = $ydiv2$1 << 1; else { + $xdiv2$2 = $xdiv2$1$lcssa; + $ydiv2$2 = $ydiv2$1; + break; + } + } + $sample_size$xdiv2$2 = ($xdiv2$2 | 0) > ($sample_size | 0) ? $sample_size : $xdiv2$2; + $ydiv2$3 = ($ydiv2$2 | 0) > ($sample_size | 0) ? $sample_size : $ydiv2$2; + $99 = ($sample_size$xdiv2$2 | 0) / ($patt_size | 0) | 0; + $100 = ($ydiv2$3 | 0) / ($patt_size | 0) | 0; + $103 = (1.0 - $pattRatio) * .5 * 10.0; + $104 = $pattRatio * 10.0; + $106 = Math_imul($patt_size, $patt_size) | 0; + L13 : do if (!$pattDetectMode) { + $107 = $106 * 3 | 0; + $108 = _calloc($107, 4) | 0; + if (!$108) { + _arLog(3, 5471, $vararg_buffer); + _exit(1); + } + do switch ($pixelFormat | 0) { + case 0: + { + $264 = $103 + 100.0; + $265 = +($ydiv2$3 | 0); + $266 = +($sample_size$xdiv2$2 | 0); + $267 = $para + 48 | 0; + $268 = $para + 56 | 0; + $269 = $para + 64 | 0; + $270 = $para + 8 | 0; + $271 = $para + 16 | 0; + $272 = $para + 24 | 0; + $273 = $para + 32 | 0; + $274 = $para + 40 | 0; + $275 = ($imageProcMode | 0) == 1; + if (($ydiv2$3 | 0) > 0) { + $277 = ($sample_size$xdiv2$2 | 0) > 0; + $j$0241 = 0; + do { + $284 = $264 + $104 * (+($j$0241 | 0) + .5) / $265; + if ($277) { + $i$1237 = 0; + do { + $289 = $264 + $104 * (+($i$1237 | 0) + .5) / $266; + $296 = +HEAPF64[$269 >> 3] + (+HEAPF64[$267 >> 3] * $289 + $284 * +HEAPF64[$268 >> 3]); + if ($296 == 0.0) { + $ext_patt2$0 = $108; + label = 278; + break L13; + } + $306 = (+HEAPF64[$271 >> 3] + ($289 * +HEAPF64[$para >> 3] + $284 * +HEAPF64[$270 >> 3])) / $296; + HEAPF32[$xc2 >> 2] = $306; + $315 = (+HEAPF64[$274 >> 3] + ($289 * +HEAPF64[$272 >> 3] + $284 * +HEAPF64[$273 >> 3])) / $296; + HEAPF32[$yc2 >> 2] = $315; + _arParamIdeal2ObservLTf($paramLTf, $306, $315, $xc2, $yc2) | 0; + $316 = +HEAPF32[$xc2 >> 2]; + if ($275) { + $xc$0 = ((~~($316 + 1.0) | 0) / 2 | 0) << 1; + $yc$0 = ((~~(+HEAPF32[$yc2 >> 2] + 1.0) | 0) / 2 | 0) << 1; + } else { + $xc$0 = ~~($316 + .5); + $yc$0 = ~~(+HEAPF32[$yc2 >> 2] + .5); + } + if (($xc$0 | 0) > -1) if (($yc$0 | 0) < ($ysize | 0) & (($yc$0 | 0) > -1 & ($xc$0 | 0) < ($xsize | 0))) { + $337 = ((Math_imul($yc$0, $xsize) | 0) + $xc$0 | 0) * 3 | 0; + $346 = ((Math_imul(($j$0241 | 0) / ($100 | 0) | 0, $patt_size) | 0) + (($i$1237 | 0) / ($99 | 0) | 0) | 0) * 3 | 0; + $347 = $108 + ($346 << 2) | 0; + HEAP32[$347 >> 2] = (HEAP32[$347 >> 2] | 0) + (HEAPU8[$image + ($337 + 2) >> 0] | 0); + $355 = $108 + ($346 + 1 << 2) | 0; + HEAP32[$355 >> 2] = (HEAP32[$355 >> 2] | 0) + (HEAPU8[$image + ($337 + 1) >> 0] | 0); + $362 = $108 + ($346 + 2 << 2) | 0; + HEAP32[$362 >> 2] = (HEAP32[$362 >> 2] | 0) + (HEAPU8[$image + $337 >> 0] | 0); + } + $i$1237 = $i$1237 + 1 | 0; + } while (($i$1237 | 0) < ($sample_size$xdiv2$2 | 0)); + } + $j$0241 = $j$0241 + 1 | 0; + } while (($j$0241 | 0) < ($ydiv2$3 | 0)); + } + break; + } + case 1: + { + $250 = $103 + 100.0; + $251 = +($ydiv2$3 | 0); + $252 = +($sample_size$xdiv2$2 | 0); + $253 = $para + 48 | 0; + $254 = $para + 56 | 0; + $255 = $para + 64 | 0; + $256 = $para + 8 | 0; + $257 = $para + 16 | 0; + $258 = $para + 24 | 0; + $259 = $para + 32 | 0; + $260 = $para + 40 | 0; + $261 = ($imageProcMode | 0) == 1; + if (($ydiv2$3 | 0) > 0) { + $263 = ($sample_size$xdiv2$2 | 0) > 0; + $j$1247 = 0; + do { + $373 = $250 + $104 * (+($j$1247 | 0) + .5) / $251; + if ($263) { + $i$2243 = 0; + do { + $378 = $250 + $104 * (+($i$2243 | 0) + .5) / $252; + $385 = +HEAPF64[$255 >> 3] + (+HEAPF64[$253 >> 3] * $378 + $373 * +HEAPF64[$254 >> 3]); + if ($385 == 0.0) { + $ext_patt2$0 = $108; + label = 278; + break L13; + } + $395 = (+HEAPF64[$257 >> 3] + ($378 * +HEAPF64[$para >> 3] + $373 * +HEAPF64[$256 >> 3])) / $385; + HEAPF32[$xc2 >> 2] = $395; + $404 = (+HEAPF64[$260 >> 3] + ($378 * +HEAPF64[$258 >> 3] + $373 * +HEAPF64[$259 >> 3])) / $385; + HEAPF32[$yc2 >> 2] = $404; + _arParamIdeal2ObservLTf($paramLTf, $395, $404, $xc2, $yc2) | 0; + $405 = +HEAPF32[$xc2 >> 2]; + if ($261) { + $xc$1 = ((~~($405 + 1.0) | 0) / 2 | 0) << 1; + $yc$1 = ((~~(+HEAPF32[$yc2 >> 2] + 1.0) | 0) / 2 | 0) << 1; + } else { + $xc$1 = ~~($405 + .5); + $yc$1 = ~~(+HEAPF32[$yc2 >> 2] + .5); + } + if (($xc$1 | 0) > -1) if (($yc$1 | 0) < ($ysize | 0) & (($yc$1 | 0) > -1 & ($xc$1 | 0) < ($xsize | 0))) { + $426 = ((Math_imul($yc$1, $xsize) | 0) + $xc$1 | 0) * 3 | 0; + $434 = ((Math_imul(($j$1247 | 0) / ($100 | 0) | 0, $patt_size) | 0) + (($i$2243 | 0) / ($99 | 0) | 0) | 0) * 3 | 0; + $435 = $108 + ($434 << 2) | 0; + HEAP32[$435 >> 2] = (HEAP32[$435 >> 2] | 0) + (HEAPU8[$image + $426 >> 0] | 0); + $443 = $108 + ($434 + 1 << 2) | 0; + HEAP32[$443 >> 2] = (HEAP32[$443 >> 2] | 0) + (HEAPU8[$image + ($426 + 1) >> 0] | 0); + $451 = $108 + ($434 + 2 << 2) | 0; + HEAP32[$451 >> 2] = (HEAP32[$451 >> 2] | 0) + (HEAPU8[$image + ($426 + 2) >> 0] | 0); + } + $i$2243 = $i$2243 + 1 | 0; + } while (($i$2243 | 0) < ($sample_size$xdiv2$2 | 0)); + } + $j$1247 = $j$1247 + 1 | 0; + } while (($j$1247 | 0) < ($ydiv2$3 | 0)); + } + break; + } + case 2: + { + $236 = $103 + 100.0; + $237 = +($ydiv2$3 | 0); + $238 = +($sample_size$xdiv2$2 | 0); + $239 = $para + 48 | 0; + $240 = $para + 56 | 0; + $241 = $para + 64 | 0; + $242 = $para + 8 | 0; + $243 = $para + 16 | 0; + $244 = $para + 24 | 0; + $245 = $para + 32 | 0; + $246 = $para + 40 | 0; + $247 = ($imageProcMode | 0) == 1; + if (($ydiv2$3 | 0) > 0) { + $249 = ($sample_size$xdiv2$2 | 0) > 0; + $j$2253 = 0; + do { + $462 = $236 + $104 * (+($j$2253 | 0) + .5) / $237; + if ($249) { + $i$3249 = 0; + do { + $467 = $236 + $104 * (+($i$3249 | 0) + .5) / $238; + $474 = +HEAPF64[$241 >> 3] + (+HEAPF64[$239 >> 3] * $467 + $462 * +HEAPF64[$240 >> 3]); + if ($474 == 0.0) { + $ext_patt2$0 = $108; + label = 278; + break L13; + } + $484 = (+HEAPF64[$243 >> 3] + ($467 * +HEAPF64[$para >> 3] + $462 * +HEAPF64[$242 >> 3])) / $474; + HEAPF32[$xc2 >> 2] = $484; + $493 = (+HEAPF64[$246 >> 3] + ($467 * +HEAPF64[$244 >> 3] + $462 * +HEAPF64[$245 >> 3])) / $474; + HEAPF32[$yc2 >> 2] = $493; + _arParamIdeal2ObservLTf($paramLTf, $484, $493, $xc2, $yc2) | 0; + $494 = +HEAPF32[$xc2 >> 2]; + if ($247) { + $xc$2 = ((~~($494 + 1.0) | 0) / 2 | 0) << 1; + $yc$2 = ((~~(+HEAPF32[$yc2 >> 2] + 1.0) | 0) / 2 | 0) << 1; + } else { + $xc$2 = ~~($494 + .5); + $yc$2 = ~~(+HEAPF32[$yc2 >> 2] + .5); + } + if (($xc$2 | 0) > -1) if (($yc$2 | 0) < ($ysize | 0) & (($yc$2 | 0) > -1 & ($xc$2 | 0) < ($xsize | 0))) { + $515 = (Math_imul($yc$2, $xsize) | 0) + $xc$2 << 2; + $524 = ((Math_imul(($j$2253 | 0) / ($100 | 0) | 0, $patt_size) | 0) + (($i$3249 | 0) / ($99 | 0) | 0) | 0) * 3 | 0; + $525 = $108 + ($524 << 2) | 0; + HEAP32[$525 >> 2] = (HEAP32[$525 >> 2] | 0) + (HEAPU8[$image + ($515 | 2) >> 0] | 0); + $533 = $108 + ($524 + 1 << 2) | 0; + HEAP32[$533 >> 2] = (HEAP32[$533 >> 2] | 0) + (HEAPU8[$image + ($515 | 1) >> 0] | 0); + $540 = $108 + ($524 + 2 << 2) | 0; + HEAP32[$540 >> 2] = (HEAP32[$540 >> 2] | 0) + (HEAPU8[$image + $515 >> 0] | 0); + } + $i$3249 = $i$3249 + 1 | 0; + } while (($i$3249 | 0) < ($sample_size$xdiv2$2 | 0)); + } + $j$2253 = $j$2253 + 1 | 0; + } while (($j$2253 | 0) < ($ydiv2$3 | 0)); + } + break; + } + case 3: + { + $222 = $103 + 100.0; + $223 = +($ydiv2$3 | 0); + $224 = +($sample_size$xdiv2$2 | 0); + $225 = $para + 48 | 0; + $226 = $para + 56 | 0; + $227 = $para + 64 | 0; + $228 = $para + 8 | 0; + $229 = $para + 16 | 0; + $230 = $para + 24 | 0; + $231 = $para + 32 | 0; + $232 = $para + 40 | 0; + $233 = ($imageProcMode | 0) == 1; + if (($ydiv2$3 | 0) > 0) { + $235 = ($sample_size$xdiv2$2 | 0) > 0; + $j$3259 = 0; + do { + $551 = $222 + $104 * (+($j$3259 | 0) + .5) / $223; + if ($235) { + $i$4255 = 0; + do { + $556 = $222 + $104 * (+($i$4255 | 0) + .5) / $224; + $563 = +HEAPF64[$227 >> 3] + (+HEAPF64[$225 >> 3] * $556 + $551 * +HEAPF64[$226 >> 3]); + if ($563 == 0.0) { + $ext_patt2$0 = $108; + label = 278; + break L13; + } + $573 = (+HEAPF64[$229 >> 3] + ($556 * +HEAPF64[$para >> 3] + $551 * +HEAPF64[$228 >> 3])) / $563; + HEAPF32[$xc2 >> 2] = $573; + $582 = (+HEAPF64[$232 >> 3] + ($556 * +HEAPF64[$230 >> 3] + $551 * +HEAPF64[$231 >> 3])) / $563; + HEAPF32[$yc2 >> 2] = $582; + _arParamIdeal2ObservLTf($paramLTf, $573, $582, $xc2, $yc2) | 0; + $583 = +HEAPF32[$xc2 >> 2]; + if ($233) { + $xc$3 = ((~~($583 + 1.0) | 0) / 2 | 0) << 1; + $yc$3 = ((~~(+HEAPF32[$yc2 >> 2] + 1.0) | 0) / 2 | 0) << 1; + } else { + $xc$3 = ~~($583 + .5); + $yc$3 = ~~(+HEAPF32[$yc2 >> 2] + .5); + } + if (($xc$3 | 0) > -1) if (($yc$3 | 0) < ($ysize | 0) & (($yc$3 | 0) > -1 & ($xc$3 | 0) < ($xsize | 0))) { + $604 = (Math_imul($yc$3, $xsize) | 0) + $xc$3 << 2; + $612 = ((Math_imul(($j$3259 | 0) / ($100 | 0) | 0, $patt_size) | 0) + (($i$4255 | 0) / ($99 | 0) | 0) | 0) * 3 | 0; + $613 = $108 + ($612 << 2) | 0; + HEAP32[$613 >> 2] = (HEAP32[$613 >> 2] | 0) + (HEAPU8[$image + $604 >> 0] | 0); + $621 = $108 + ($612 + 1 << 2) | 0; + HEAP32[$621 >> 2] = (HEAP32[$621 >> 2] | 0) + (HEAPU8[$image + ($604 | 1) >> 0] | 0); + $629 = $108 + ($612 + 2 << 2) | 0; + HEAP32[$629 >> 2] = (HEAP32[$629 >> 2] | 0) + (HEAPU8[$image + ($604 | 2) >> 0] | 0); + } + $i$4255 = $i$4255 + 1 | 0; + } while (($i$4255 | 0) < ($sample_size$xdiv2$2 | 0)); + } + $j$3259 = $j$3259 + 1 | 0; + } while (($j$3259 | 0) < ($ydiv2$3 | 0)); + } + break; + } + case 4: + { + $208 = $103 + 100.0; + $209 = +($ydiv2$3 | 0); + $210 = +($sample_size$xdiv2$2 | 0); + $211 = $para + 48 | 0; + $212 = $para + 56 | 0; + $213 = $para + 64 | 0; + $214 = $para + 8 | 0; + $215 = $para + 16 | 0; + $216 = $para + 24 | 0; + $217 = $para + 32 | 0; + $218 = $para + 40 | 0; + $219 = ($imageProcMode | 0) == 1; + if (($ydiv2$3 | 0) > 0) { + $221 = ($sample_size$xdiv2$2 | 0) > 0; + $j$4265 = 0; + do { + $640 = $208 + $104 * (+($j$4265 | 0) + .5) / $209; + if ($221) { + $i$5261 = 0; + do { + $645 = $208 + $104 * (+($i$5261 | 0) + .5) / $210; + $652 = +HEAPF64[$213 >> 3] + (+HEAPF64[$211 >> 3] * $645 + $640 * +HEAPF64[$212 >> 3]); + if ($652 == 0.0) { + $ext_patt2$0 = $108; + label = 278; + break L13; + } + $662 = (+HEAPF64[$215 >> 3] + ($645 * +HEAPF64[$para >> 3] + $640 * +HEAPF64[$214 >> 3])) / $652; + HEAPF32[$xc2 >> 2] = $662; + $671 = (+HEAPF64[$218 >> 3] + ($645 * +HEAPF64[$216 >> 3] + $640 * +HEAPF64[$217 >> 3])) / $652; + HEAPF32[$yc2 >> 2] = $671; + _arParamIdeal2ObservLTf($paramLTf, $662, $671, $xc2, $yc2) | 0; + $672 = +HEAPF32[$xc2 >> 2]; + if ($219) { + $xc$4 = ((~~($672 + 1.0) | 0) / 2 | 0) << 1; + $yc$4 = ((~~(+HEAPF32[$yc2 >> 2] + 1.0) | 0) / 2 | 0) << 1; + } else { + $xc$4 = ~~($672 + .5); + $yc$4 = ~~(+HEAPF32[$yc2 >> 2] + .5); + } + if (($xc$4 | 0) > -1) if (($yc$4 | 0) < ($ysize | 0) & (($yc$4 | 0) > -1 & ($xc$4 | 0) < ($xsize | 0))) { + $693 = (Math_imul($yc$4, $xsize) | 0) + $xc$4 << 2; + $702 = ((Math_imul(($j$4265 | 0) / ($100 | 0) | 0, $patt_size) | 0) + (($i$5261 | 0) / ($99 | 0) | 0) | 0) * 3 | 0; + $703 = $108 + ($702 << 2) | 0; + HEAP32[$703 >> 2] = (HEAP32[$703 >> 2] | 0) + (HEAPU8[$image + ($693 | 1) >> 0] | 0); + $711 = $108 + ($702 + 1 << 2) | 0; + HEAP32[$711 >> 2] = (HEAP32[$711 >> 2] | 0) + (HEAPU8[$image + ($693 | 2) >> 0] | 0); + $719 = $108 + ($702 + 2 << 2) | 0; + HEAP32[$719 >> 2] = (HEAP32[$719 >> 2] | 0) + (HEAPU8[$image + ($693 | 3) >> 0] | 0); + } + $i$5261 = $i$5261 + 1 | 0; + } while (($i$5261 | 0) < ($sample_size$xdiv2$2 | 0)); + } + $j$4265 = $j$4265 + 1 | 0; + } while (($j$4265 | 0) < ($ydiv2$3 | 0)); + } + break; + } + case 5: + case 12: + case 13: + case 14: + { + $194 = $103 + 100.0; + $195 = +($ydiv2$3 | 0); + $196 = +($sample_size$xdiv2$2 | 0); + $197 = $para + 48 | 0; + $198 = $para + 56 | 0; + $199 = $para + 64 | 0; + $200 = $para + 8 | 0; + $201 = $para + 16 | 0; + $202 = $para + 24 | 0; + $203 = $para + 32 | 0; + $204 = $para + 40 | 0; + $205 = ($imageProcMode | 0) == 1; + if (($ydiv2$3 | 0) > 0) { + $207 = ($sample_size$xdiv2$2 | 0) > 0; + $j$5271 = 0; + do { + $730 = $194 + $104 * (+($j$5271 | 0) + .5) / $195; + if ($207) { + $i$6267 = 0; + do { + $735 = $194 + $104 * (+($i$6267 | 0) + .5) / $196; + $742 = +HEAPF64[$199 >> 3] + (+HEAPF64[$197 >> 3] * $735 + $730 * +HEAPF64[$198 >> 3]); + if ($742 == 0.0) { + $ext_patt2$0 = $108; + label = 278; + break L13; + } + $752 = (+HEAPF64[$201 >> 3] + ($735 * +HEAPF64[$para >> 3] + $730 * +HEAPF64[$200 >> 3])) / $742; + HEAPF32[$xc2 >> 2] = $752; + $761 = (+HEAPF64[$204 >> 3] + ($735 * +HEAPF64[$202 >> 3] + $730 * +HEAPF64[$203 >> 3])) / $742; + HEAPF32[$yc2 >> 2] = $761; + _arParamIdeal2ObservLTf($paramLTf, $752, $761, $xc2, $yc2) | 0; + $762 = +HEAPF32[$xc2 >> 2]; + if ($205) { + $xc$5 = ((~~($762 + 1.0) | 0) / 2 | 0) << 1; + $yc$5 = ((~~(+HEAPF32[$yc2 >> 2] + 1.0) | 0) / 2 | 0) << 1; + } else { + $xc$5 = ~~($762 + .5); + $yc$5 = ~~(+HEAPF32[$yc2 >> 2] + .5); + } + if (($xc$5 | 0) > -1) if (($yc$5 | 0) < ($ysize | 0) & (($yc$5 | 0) > -1 & ($xc$5 | 0) < ($xsize | 0))) { + $783 = $image + ((Math_imul($yc$5, $xsize) | 0) + $xc$5) | 0; + $785 = HEAPU8[$783 >> 0] | 0; + $790 = ((Math_imul(($j$5271 | 0) / ($100 | 0) | 0, $patt_size) | 0) + (($i$6267 | 0) / ($99 | 0) | 0) | 0) * 3 | 0; + $791 = $108 + ($790 << 2) | 0; + HEAP32[$791 >> 2] = (HEAP32[$791 >> 2] | 0) + $785; + $795 = $108 + ($790 + 1 << 2) | 0; + HEAP32[$795 >> 2] = (HEAP32[$795 >> 2] | 0) + $785; + $799 = $108 + ($790 + 2 << 2) | 0; + HEAP32[$799 >> 2] = (HEAP32[$799 >> 2] | 0) + $785; + } + $i$6267 = $i$6267 + 1 | 0; + } while (($i$6267 | 0) < ($sample_size$xdiv2$2 | 0)); + } + $j$5271 = $j$5271 + 1 | 0; + } while (($j$5271 | 0) < ($ydiv2$3 | 0)); + } + break; + } + case 6: + { + $180 = $103 + 100.0; + $181 = +($ydiv2$3 | 0); + $182 = +($sample_size$xdiv2$2 | 0); + $183 = $para + 48 | 0; + $184 = $para + 56 | 0; + $185 = $para + 64 | 0; + $186 = $para + 8 | 0; + $187 = $para + 16 | 0; + $188 = $para + 24 | 0; + $189 = $para + 32 | 0; + $190 = $para + 40 | 0; + $191 = ($imageProcMode | 0) == 1; + if (($ydiv2$3 | 0) > 0) { + $193 = ($sample_size$xdiv2$2 | 0) > 0; + $j$6277 = 0; + do { + $810 = $180 + $104 * (+($j$6277 | 0) + .5) / $181; + if ($193) { + $i$7273 = 0; + do { + $815 = $180 + $104 * (+($i$7273 | 0) + .5) / $182; + $822 = +HEAPF64[$185 >> 3] + (+HEAPF64[$183 >> 3] * $815 + $810 * +HEAPF64[$184 >> 3]); + if ($822 == 0.0) { + $ext_patt2$0 = $108; + label = 278; + break L13; + } + $832 = (+HEAPF64[$187 >> 3] + ($815 * +HEAPF64[$para >> 3] + $810 * +HEAPF64[$186 >> 3])) / $822; + HEAPF32[$xc2 >> 2] = $832; + $841 = (+HEAPF64[$190 >> 3] + ($815 * +HEAPF64[$188 >> 3] + $810 * +HEAPF64[$189 >> 3])) / $822; + HEAPF32[$yc2 >> 2] = $841; + _arParamIdeal2ObservLTf($paramLTf, $832, $841, $xc2, $yc2) | 0; + $842 = +HEAPF32[$xc2 >> 2]; + if ($191) { + $xc$6 = ((~~($842 + 1.0) | 0) / 2 | 0) << 1; + $yc$6 = ((~~(+HEAPF32[$yc2 >> 2] + 1.0) | 0) / 2 | 0) << 1; + } else { + $xc$6 = ~~($842 + .5); + $yc$6 = ~~(+HEAPF32[$yc2 >> 2] + .5); + } + if (($xc$6 | 0) > -1) if (($yc$6 | 0) < ($ysize | 0) & (($yc$6 | 0) > -1 & ($xc$6 | 0) < ($xsize | 0))) { + $863 = (Math_imul($yc$6, $xsize) | 0) + $xc$6 << 2; + $872 = ((Math_imul(($j$6277 | 0) / ($100 | 0) | 0, $patt_size) | 0) + (($i$7273 | 0) / ($99 | 0) | 0) | 0) * 3 | 0; + $873 = $108 + ($872 << 2) | 0; + HEAP32[$873 >> 2] = (HEAP32[$873 >> 2] | 0) + (HEAPU8[$image + ($863 | 3) >> 0] | 0); + $881 = $108 + ($872 + 1 << 2) | 0; + HEAP32[$881 >> 2] = (HEAP32[$881 >> 2] | 0) + (HEAPU8[$image + ($863 | 2) >> 0] | 0); + $889 = $108 + ($872 + 2 << 2) | 0; + HEAP32[$889 >> 2] = (HEAP32[$889 >> 2] | 0) + (HEAPU8[$image + ($863 | 1) >> 0] | 0); + } + $i$7273 = $i$7273 + 1 | 0; + } while (($i$7273 | 0) < ($sample_size$xdiv2$2 | 0)); + } + $j$6277 = $j$6277 + 1 | 0; + } while (($j$6277 | 0) < ($ydiv2$3 | 0)); + } + break; + } + case 7: + { + $166 = $103 + 100.0; + $167 = +($ydiv2$3 | 0); + $168 = +($sample_size$xdiv2$2 | 0); + $169 = $para + 48 | 0; + $170 = $para + 56 | 0; + $171 = $para + 64 | 0; + $172 = $para + 8 | 0; + $173 = $para + 16 | 0; + $174 = $para + 24 | 0; + $175 = $para + 32 | 0; + $176 = $para + 40 | 0; + $177 = ($imageProcMode | 0) == 1; + if (($ydiv2$3 | 0) > 0) { + $179 = ($sample_size$xdiv2$2 | 0) > 0; + $j$7283 = 0; + do { + $900 = $166 + $104 * (+($j$7283 | 0) + .5) / $167; + if ($179) { + $i$8279 = 0; + do { + $905 = $166 + $104 * (+($i$8279 | 0) + .5) / $168; + $912 = +HEAPF64[$171 >> 3] + (+HEAPF64[$169 >> 3] * $905 + $900 * +HEAPF64[$170 >> 3]); + if ($912 == 0.0) { + $ext_patt2$0 = $108; + label = 278; + break L13; + } + $922 = (+HEAPF64[$173 >> 3] + ($905 * +HEAPF64[$para >> 3] + $900 * +HEAPF64[$172 >> 3])) / $912; + HEAPF32[$xc2 >> 2] = $922; + $931 = (+HEAPF64[$176 >> 3] + ($905 * +HEAPF64[$174 >> 3] + $900 * +HEAPF64[$175 >> 3])) / $912; + HEAPF32[$yc2 >> 2] = $931; + _arParamIdeal2ObservLTf($paramLTf, $922, $931, $xc2, $yc2) | 0; + $932 = +HEAPF32[$xc2 >> 2]; + if ($177) { + $xc$7 = ((~~($932 + 1.0) | 0) / 2 | 0) << 1; + $yc$7 = ((~~(+HEAPF32[$yc2 >> 2] + 1.0) | 0) / 2 | 0) << 1; + } else { + $xc$7 = ~~($932 + .5); + $yc$7 = ~~(+HEAPF32[$yc2 >> 2] + .5); + } + if (($xc$7 | 0) > -1) if (($yc$7 | 0) < ($ysize | 0) & (($yc$7 | 0) > -1 & ($xc$7 | 0) < ($xsize | 0))) { + $951 = Math_imul($yc$7, $xsize) | 0; + $954 = ($xc$7 & 65534) + $951 << 1; + $959 = +((HEAPU8[$image + $954 >> 0] | 0) + -128 | 0); + $973 = +((HEAPU8[$image + ($954 + 2) >> 0] | 0) + -128 | 0); + $974 = +((HEAPU8[$image + ($951 + $xc$7 << 1 | 1) >> 0] | 0) + -16 | 0) * 298.0820007324219; + $978 = ~~($959 * 516.4110107421875 + $974) >> 8; + $984 = ~~($974 - $959 * 100.29100036621094 - $973 * 208.1199951171875) >> 8; + $988 = ~~($974 + $973 * 408.5830078125) >> 8; + $990 = ($978 | 0) > 0 ? $978 : 0; + $996 = ((Math_imul(($j$7283 | 0) / ($100 | 0) | 0, $patt_size) | 0) + (($i$8279 | 0) / ($99 | 0) | 0) | 0) * 3 | 0; + $997 = $108 + ($996 << 2) | 0; + HEAP32[$997 >> 2] = (($990 | 0) < 255 ? $990 : 255) + (HEAP32[$997 >> 2] | 0); + $1001 = ($984 | 0) > 0 ? $984 : 0; + $1005 = $108 + ($996 + 1 << 2) | 0; + HEAP32[$1005 >> 2] = (($1001 | 0) < 255 ? $1001 : 255) + (HEAP32[$1005 >> 2] | 0); + $1009 = ($988 | 0) > 0 ? $988 : 0; + $1012 = $108 + ($996 + 2 << 2) | 0; + HEAP32[$1012 >> 2] = (($1009 | 0) < 255 ? $1009 : 255) + (HEAP32[$1012 >> 2] | 0); + } + $i$8279 = $i$8279 + 1 | 0; + } while (($i$8279 | 0) < ($sample_size$xdiv2$2 | 0)); + } + $j$7283 = $j$7283 + 1 | 0; + } while (($j$7283 | 0) < ($ydiv2$3 | 0)); + } + break; + } + case 8: + { + $152 = $103 + 100.0; + $153 = +($ydiv2$3 | 0); + $154 = +($sample_size$xdiv2$2 | 0); + $155 = $para + 48 | 0; + $156 = $para + 56 | 0; + $157 = $para + 64 | 0; + $158 = $para + 8 | 0; + $159 = $para + 16 | 0; + $160 = $para + 24 | 0; + $161 = $para + 32 | 0; + $162 = $para + 40 | 0; + $163 = ($imageProcMode | 0) == 1; + if (($ydiv2$3 | 0) > 0) { + $165 = ($sample_size$xdiv2$2 | 0) > 0; + $j$8289 = 0; + do { + $1023 = $152 + $104 * (+($j$8289 | 0) + .5) / $153; + if ($165) { + $i$9285 = 0; + do { + $1028 = $152 + $104 * (+($i$9285 | 0) + .5) / $154; + $1035 = +HEAPF64[$157 >> 3] + (+HEAPF64[$155 >> 3] * $1028 + $1023 * +HEAPF64[$156 >> 3]); + if ($1035 == 0.0) { + $ext_patt2$0 = $108; + label = 278; + break L13; + } + $1045 = (+HEAPF64[$159 >> 3] + ($1028 * +HEAPF64[$para >> 3] + $1023 * +HEAPF64[$158 >> 3])) / $1035; + HEAPF32[$xc2 >> 2] = $1045; + $1054 = (+HEAPF64[$162 >> 3] + ($1028 * +HEAPF64[$160 >> 3] + $1023 * +HEAPF64[$161 >> 3])) / $1035; + HEAPF32[$yc2 >> 2] = $1054; + _arParamIdeal2ObservLTf($paramLTf, $1045, $1054, $xc2, $yc2) | 0; + $1055 = +HEAPF32[$xc2 >> 2]; + if ($163) { + $xc$8 = ((~~($1055 + 1.0) | 0) / 2 | 0) << 1; + $yc$8 = ((~~(+HEAPF32[$yc2 >> 2] + 1.0) | 0) / 2 | 0) << 1; + } else { + $xc$8 = ~~($1055 + .5); + $yc$8 = ~~(+HEAPF32[$yc2 >> 2] + .5); + } + if (($xc$8 | 0) > -1) if (($yc$8 | 0) < ($ysize | 0) & (($yc$8 | 0) > -1 & ($xc$8 | 0) < ($xsize | 0))) { + $1074 = Math_imul($yc$8, $xsize) | 0; + $1084 = ($xc$8 & 65534) + $1074 << 1; + $1090 = +((HEAPU8[$image + ($1084 | 1) >> 0] | 0) + -128 | 0); + $1096 = +((HEAPU8[$image + ($1084 + 3) >> 0] | 0) + -128 | 0); + $1097 = +((HEAPU8[$image + ($1074 + $xc$8 << 1) >> 0] | 0) + -16 | 0) * 298.0820007324219; + $1101 = ~~($1097 + $1090 * 516.4110107421875) >> 8; + $1107 = ~~($1097 - $1090 * 100.29100036621094 - $1096 * 208.1199951171875) >> 8; + $1111 = ~~($1097 + $1096 * 408.5830078125) >> 8; + $1113 = ($1101 | 0) > 0 ? $1101 : 0; + $1119 = ((Math_imul(($j$8289 | 0) / ($100 | 0) | 0, $patt_size) | 0) + (($i$9285 | 0) / ($99 | 0) | 0) | 0) * 3 | 0; + $1120 = $108 + ($1119 << 2) | 0; + HEAP32[$1120 >> 2] = (($1113 | 0) < 255 ? $1113 : 255) + (HEAP32[$1120 >> 2] | 0); + $1124 = ($1107 | 0) > 0 ? $1107 : 0; + $1128 = $108 + ($1119 + 1 << 2) | 0; + HEAP32[$1128 >> 2] = (($1124 | 0) < 255 ? $1124 : 255) + (HEAP32[$1128 >> 2] | 0); + $1132 = ($1111 | 0) > 0 ? $1111 : 0; + $1135 = $108 + ($1119 + 2 << 2) | 0; + HEAP32[$1135 >> 2] = (($1132 | 0) < 255 ? $1132 : 255) + (HEAP32[$1135 >> 2] | 0); + } + $i$9285 = $i$9285 + 1 | 0; + } while (($i$9285 | 0) < ($sample_size$xdiv2$2 | 0)); + } + $j$8289 = $j$8289 + 1 | 0; + } while (($j$8289 | 0) < ($ydiv2$3 | 0)); + } + break; + } + case 9: + { + $138 = $103 + 100.0; + $139 = +($ydiv2$3 | 0); + $140 = +($sample_size$xdiv2$2 | 0); + $141 = $para + 48 | 0; + $142 = $para + 56 | 0; + $143 = $para + 64 | 0; + $144 = $para + 8 | 0; + $145 = $para + 16 | 0; + $146 = $para + 24 | 0; + $147 = $para + 32 | 0; + $148 = $para + 40 | 0; + $149 = ($imageProcMode | 0) == 1; + if (($ydiv2$3 | 0) > 0) { + $151 = ($sample_size$xdiv2$2 | 0) > 0; + $j$9295 = 0; + do { + $1146 = $138 + $104 * (+($j$9295 | 0) + .5) / $139; + if ($151) { + $i$10291 = 0; + do { + $1151 = $138 + $104 * (+($i$10291 | 0) + .5) / $140; + $1158 = +HEAPF64[$143 >> 3] + (+HEAPF64[$141 >> 3] * $1151 + $1146 * +HEAPF64[$142 >> 3]); + if ($1158 == 0.0) { + $ext_patt2$0 = $108; + label = 278; + break L13; + } + $1168 = (+HEAPF64[$145 >> 3] + ($1151 * +HEAPF64[$para >> 3] + $1146 * +HEAPF64[$144 >> 3])) / $1158; + HEAPF32[$xc2 >> 2] = $1168; + $1177 = (+HEAPF64[$148 >> 3] + ($1151 * +HEAPF64[$146 >> 3] + $1146 * +HEAPF64[$147 >> 3])) / $1158; + HEAPF32[$yc2 >> 2] = $1177; + _arParamIdeal2ObservLTf($paramLTf, $1168, $1177, $xc2, $yc2) | 0; + $1178 = +HEAPF32[$xc2 >> 2]; + if ($149) { + $xc$9 = ((~~($1178 + 1.0) | 0) / 2 | 0) << 1; + $yc$9 = ((~~(+HEAPF32[$yc2 >> 2] + 1.0) | 0) / 2 | 0) << 1; + } else { + $xc$9 = ~~($1178 + .5); + $yc$9 = ~~(+HEAPF32[$yc2 >> 2] + .5); + } + if (($xc$9 | 0) > -1) if (($yc$9 | 0) < ($ysize | 0) & (($yc$9 | 0) > -1 & ($xc$9 | 0) < ($xsize | 0))) { + $1199 = (Math_imul($yc$9, $xsize) | 0) + $xc$9 << 1; + $1203 = HEAPU8[$image + ($1199 | 1) >> 0] | 0; + $1211 = ((Math_imul(($j$9295 | 0) / ($100 | 0) | 0, $patt_size) | 0) + (($i$10291 | 0) / ($99 | 0) | 0) | 0) * 3 | 0; + $1212 = $108 + ($1211 << 2) | 0; + HEAP32[$1212 >> 2] = ($1203 << 3 & 248 | 4) + (HEAP32[$1212 >> 2] | 0); + $1217 = HEAPU8[$image + $1199 >> 0] | 0; + $1225 = $108 + ($1211 + 1 << 2) | 0; + HEAP32[$1225 >> 2] = ($1217 << 5 & 224 | $1203 >>> 3 & 28 | 2) + (HEAP32[$1225 >> 2] | 0); + $1231 = $108 + ($1211 + 2 << 2) | 0; + HEAP32[$1231 >> 2] = ($1217 & 248 | 4) + (HEAP32[$1231 >> 2] | 0); + } + $i$10291 = $i$10291 + 1 | 0; + } while (($i$10291 | 0) < ($sample_size$xdiv2$2 | 0)); + } + $j$9295 = $j$9295 + 1 | 0; + } while (($j$9295 | 0) < ($ydiv2$3 | 0)); + } + break; + } + case 10: + { + $124 = $103 + 100.0; + $125 = +($ydiv2$3 | 0); + $126 = +($sample_size$xdiv2$2 | 0); + $127 = $para + 48 | 0; + $128 = $para + 56 | 0; + $129 = $para + 64 | 0; + $130 = $para + 8 | 0; + $131 = $para + 16 | 0; + $132 = $para + 24 | 0; + $133 = $para + 32 | 0; + $134 = $para + 40 | 0; + $135 = ($imageProcMode | 0) == 1; + if (($ydiv2$3 | 0) > 0) { + $137 = ($sample_size$xdiv2$2 | 0) > 0; + $j$10301 = 0; + do { + $1242 = $124 + $104 * (+($j$10301 | 0) + .5) / $125; + if ($137) { + $i$11297 = 0; + do { + $1247 = $124 + $104 * (+($i$11297 | 0) + .5) / $126; + $1254 = +HEAPF64[$129 >> 3] + (+HEAPF64[$127 >> 3] * $1247 + $1242 * +HEAPF64[$128 >> 3]); + if ($1254 == 0.0) { + $ext_patt2$0 = $108; + label = 278; + break L13; + } + $1264 = (+HEAPF64[$131 >> 3] + ($1247 * +HEAPF64[$para >> 3] + $1242 * +HEAPF64[$130 >> 3])) / $1254; + HEAPF32[$xc2 >> 2] = $1264; + $1273 = (+HEAPF64[$134 >> 3] + ($1247 * +HEAPF64[$132 >> 3] + $1242 * +HEAPF64[$133 >> 3])) / $1254; + HEAPF32[$yc2 >> 2] = $1273; + _arParamIdeal2ObservLTf($paramLTf, $1264, $1273, $xc2, $yc2) | 0; + $1274 = +HEAPF32[$xc2 >> 2]; + if ($135) { + $xc$10 = ((~~($1274 + 1.0) | 0) / 2 | 0) << 1; + $yc$10 = ((~~(+HEAPF32[$yc2 >> 2] + 1.0) | 0) / 2 | 0) << 1; + } else { + $xc$10 = ~~($1274 + .5); + $yc$10 = ~~(+HEAPF32[$yc2 >> 2] + .5); + } + if (($xc$10 | 0) > -1) if (($yc$10 | 0) < ($ysize | 0) & (($yc$10 | 0) > -1 & ($xc$10 | 0) < ($xsize | 0))) { + $1295 = (Math_imul($yc$10, $xsize) | 0) + $xc$10 << 1; + $1299 = HEAPU8[$image + ($1295 | 1) >> 0] | 0; + $1307 = ((Math_imul(($j$10301 | 0) / ($100 | 0) | 0, $patt_size) | 0) + (($i$11297 | 0) / ($99 | 0) | 0) | 0) * 3 | 0; + $1308 = $108 + ($1307 << 2) | 0; + HEAP32[$1308 >> 2] = ($1299 << 2 & 248 | 4) + (HEAP32[$1308 >> 2] | 0); + $1313 = HEAPU8[$image + $1295 >> 0] | 0; + $1321 = $108 + ($1307 + 1 << 2) | 0; + HEAP32[$1321 >> 2] = ($1313 << 5 & 224 | $1299 >>> 3 & 24 | 4) + (HEAP32[$1321 >> 2] | 0); + $1327 = $108 + ($1307 + 2 << 2) | 0; + HEAP32[$1327 >> 2] = ($1313 & 248 | 4) + (HEAP32[$1327 >> 2] | 0); + } + $i$11297 = $i$11297 + 1 | 0; + } while (($i$11297 | 0) < ($sample_size$xdiv2$2 | 0)); + } + $j$10301 = $j$10301 + 1 | 0; + } while (($j$10301 | 0) < ($ydiv2$3 | 0)); + } + break; + } + case 11: + { + $110 = $103 + 100.0; + $111 = +($ydiv2$3 | 0); + $112 = +($sample_size$xdiv2$2 | 0); + $113 = $para + 48 | 0; + $114 = $para + 56 | 0; + $115 = $para + 64 | 0; + $116 = $para + 8 | 0; + $117 = $para + 16 | 0; + $118 = $para + 24 | 0; + $119 = $para + 32 | 0; + $120 = $para + 40 | 0; + $121 = ($imageProcMode | 0) == 1; + if (($ydiv2$3 | 0) > 0) { + $123 = ($sample_size$xdiv2$2 | 0) > 0; + $j$11307 = 0; + do { + $1338 = $110 + $104 * (+($j$11307 | 0) + .5) / $111; + if ($123) { + $i$12303 = 0; + do { + $1343 = $110 + $104 * (+($i$12303 | 0) + .5) / $112; + $1350 = +HEAPF64[$115 >> 3] + (+HEAPF64[$113 >> 3] * $1343 + $1338 * +HEAPF64[$114 >> 3]); + if ($1350 == 0.0) { + $ext_patt2$0 = $108; + label = 278; + break L13; + } + $1360 = (+HEAPF64[$117 >> 3] + ($1343 * +HEAPF64[$para >> 3] + $1338 * +HEAPF64[$116 >> 3])) / $1350; + HEAPF32[$xc2 >> 2] = $1360; + $1369 = (+HEAPF64[$120 >> 3] + ($1343 * +HEAPF64[$118 >> 3] + $1338 * +HEAPF64[$119 >> 3])) / $1350; + HEAPF32[$yc2 >> 2] = $1369; + _arParamIdeal2ObservLTf($paramLTf, $1360, $1369, $xc2, $yc2) | 0; + $1370 = +HEAPF32[$xc2 >> 2]; + if ($121) { + $xc$11 = ((~~($1370 + 1.0) | 0) / 2 | 0) << 1; + $yc$11 = ((~~(+HEAPF32[$yc2 >> 2] + 1.0) | 0) / 2 | 0) << 1; + } else { + $xc$11 = ~~($1370 + .5); + $yc$11 = ~~(+HEAPF32[$yc2 >> 2] + .5); + } + if (($xc$11 | 0) > -1) if (($yc$11 | 0) < ($ysize | 0) & (($yc$11 | 0) > -1 & ($xc$11 | 0) < ($xsize | 0))) { + $1391 = (Math_imul($yc$11, $xsize) | 0) + $xc$11 << 1; + $1402 = ((Math_imul(($j$11307 | 0) / ($100 | 0) | 0, $patt_size) | 0) + (($i$12303 | 0) / ($99 | 0) | 0) | 0) * 3 | 0; + $1403 = $108 + ($1402 << 2) | 0; + HEAP32[$1403 >> 2] = (HEAP32[$1403 >> 2] | 0) + ((HEAPU8[$image + ($1391 | 1) >> 0] | 0) & 240 | 8); + $1408 = HEAPU8[$image + $1391 >> 0] | 0; + $1413 = $108 + ($1402 + 1 << 2) | 0; + HEAP32[$1413 >> 2] = ($1408 << 4 & 240 | 8) + (HEAP32[$1413 >> 2] | 0); + $1419 = $108 + ($1402 + 2 << 2) | 0; + HEAP32[$1419 >> 2] = ($1408 & 240 | 8) + (HEAP32[$1419 >> 2] | 0); + } + $i$12303 = $i$12303 + 1 | 0; + } while (($i$12303 | 0) < ($sample_size$xdiv2$2 | 0)); + } + $j$11307 = $j$11307 + 1 | 0; + } while (($j$11307 | 0) < ($ydiv2$3 | 0)); + } + break; + } + default: + { + _arLog(3, 4615, $vararg_buffer1); + $ext_patt2$0 = $108; + label = 278; + break L13; + } + } while (0); + $278 = Math_imul($100, $99) | 0; + if ($106) { + $i$13236 = 0; + do { + HEAP8[$ext_patt + $i$13236 >> 0] = ((HEAP32[$108 + ($i$13236 << 2) >> 2] | 0) >>> 0) / ($278 >>> 0) | 0; + $i$13236 = $i$13236 + 1 | 0; + } while (($i$13236 | 0) < ($107 | 0)); + } + _free($108); + $$0 = 0; + } else { + $1433 = _calloc($106, 4) | 0; + if (!$1433) { + _arLog(3, 5471, $vararg_buffer3); + _exit(1); + } + L233 : do if ($pixelFormat >>> 0 < 2) { + $1436 = $103 + 100.0; + $1437 = +($ydiv2$3 | 0); + $1438 = +($sample_size$xdiv2$2 | 0); + $1439 = $para + 48 | 0; + $1440 = $para + 56 | 0; + $1441 = $para + 64 | 0; + $1442 = $para + 8 | 0; + $1443 = $para + 16 | 0; + $1444 = $para + 24 | 0; + $1445 = $para + 32 | 0; + $1446 = $para + 40 | 0; + $1447 = ($imageProcMode | 0) == 1; + if (($ydiv2$3 | 0) > 0) { + $1449 = ($sample_size$xdiv2$2 | 0) > 0; + $j$12316 = 0; + do { + $1456 = $1436 + $104 * (+($j$12316 | 0) + .5) / $1437; + if ($1449) { + $i$14312 = 0; + do { + $1461 = $1436 + $104 * (+($i$14312 | 0) + .5) / $1438; + $1468 = +HEAPF64[$1441 >> 3] + (+HEAPF64[$1439 >> 3] * $1461 + $1456 * +HEAPF64[$1440 >> 3]); + if ($1468 == 0.0) { + $ext_patt2$0 = $1433; + label = 278; + break L13; + } + $1478 = (+HEAPF64[$1443 >> 3] + ($1461 * +HEAPF64[$para >> 3] + $1456 * +HEAPF64[$1442 >> 3])) / $1468; + HEAPF32[$xc2 >> 2] = $1478; + $1487 = (+HEAPF64[$1446 >> 3] + ($1461 * +HEAPF64[$1444 >> 3] + $1456 * +HEAPF64[$1445 >> 3])) / $1468; + HEAPF32[$yc2 >> 2] = $1487; + _arParamIdeal2ObservLTf($paramLTf, $1478, $1487, $xc2, $yc2) | 0; + $1488 = +HEAPF32[$xc2 >> 2]; + if ($1447) { + $xc$12 = ((~~($1488 + 1.0) | 0) / 2 | 0) << 1; + $yc$12 = ((~~(+HEAPF32[$yc2 >> 2] + 1.0) | 0) / 2 | 0) << 1; + } else { + $xc$12 = ~~($1488 + .5); + $yc$12 = ~~(+HEAPF32[$yc2 >> 2] + .5); + } + if (($xc$12 | 0) > -1) if (($yc$12 | 0) < ($ysize | 0) & (($yc$12 | 0) > -1 & ($xc$12 | 0) < ($xsize | 0))) { + $1509 = ((Math_imul($yc$12, $xsize) | 0) + $xc$12 | 0) * 3 | 0; + $1528 = $1433 + ((Math_imul(($j$12316 | 0) / ($100 | 0) | 0, $patt_size) | 0) + (($i$14312 | 0) / ($99 | 0) | 0) << 2) | 0; + HEAP32[$1528 >> 2] = (HEAP32[$1528 >> 2] | 0) + ((((HEAPU8[$image + ($1509 + 1) >> 0] | 0) + (HEAPU8[$image + $1509 >> 0] | 0) + (HEAPU8[$image + ($1509 + 2) >> 0] | 0) | 0) >>> 0) / 3 | 0); + } + $i$14312 = $i$14312 + 1 | 0; + } while (($i$14312 | 0) < ($sample_size$xdiv2$2 | 0)); + } + $j$12316 = $j$12316 + 1 | 0; + } while (($j$12316 | 0) < ($ydiv2$3 | 0)); + } + } else { + if (($pixelFormat & -2 | 0) == 2) { + $1537 = $103 + 100.0; + $1538 = +($ydiv2$3 | 0); + $1539 = +($sample_size$xdiv2$2 | 0); + $1540 = $para + 48 | 0; + $1541 = $para + 56 | 0; + $1542 = $para + 64 | 0; + $1543 = $para + 8 | 0; + $1544 = $para + 16 | 0; + $1545 = $para + 24 | 0; + $1546 = $para + 32 | 0; + $1547 = $para + 40 | 0; + $1548 = ($imageProcMode | 0) == 1; + if (($ydiv2$3 | 0) <= 0) break; + $1550 = ($sample_size$xdiv2$2 | 0) > 0; + $j$13322 = 0; + while (1) { + $1555 = $1537 + $104 * (+($j$13322 | 0) + .5) / $1538; + if ($1550) { + $i$15318 = 0; + do { + $1560 = $1537 + $104 * (+($i$15318 | 0) + .5) / $1539; + $1567 = +HEAPF64[$1542 >> 3] + (+HEAPF64[$1540 >> 3] * $1560 + $1555 * +HEAPF64[$1541 >> 3]); + if ($1567 == 0.0) { + $ext_patt2$0 = $1433; + label = 278; + break L13; + } + $1577 = (+HEAPF64[$1544 >> 3] + ($1560 * +HEAPF64[$para >> 3] + $1555 * +HEAPF64[$1543 >> 3])) / $1567; + HEAPF32[$xc2 >> 2] = $1577; + $1586 = (+HEAPF64[$1547 >> 3] + ($1560 * +HEAPF64[$1545 >> 3] + $1555 * +HEAPF64[$1546 >> 3])) / $1567; + HEAPF32[$yc2 >> 2] = $1586; + _arParamIdeal2ObservLTf($paramLTf, $1577, $1586, $xc2, $yc2) | 0; + $1587 = +HEAPF32[$xc2 >> 2]; + if ($1548) { + $xc$13 = ((~~($1587 + 1.0) | 0) / 2 | 0) << 1; + $yc$13 = ((~~(+HEAPF32[$yc2 >> 2] + 1.0) | 0) / 2 | 0) << 1; + } else { + $xc$13 = ~~($1587 + .5); + $yc$13 = ~~(+HEAPF32[$yc2 >> 2] + .5); + } + if (($xc$13 | 0) > -1) if (($yc$13 | 0) < ($ysize | 0) & (($yc$13 | 0) > -1 & ($xc$13 | 0) < ($xsize | 0))) { + $1608 = (Math_imul($yc$13, $xsize) | 0) + $xc$13 << 2; + $1627 = $1433 + ((Math_imul(($j$13322 | 0) / ($100 | 0) | 0, $patt_size) | 0) + (($i$15318 | 0) / ($99 | 0) | 0) << 2) | 0; + HEAP32[$1627 >> 2] = (HEAP32[$1627 >> 2] | 0) + ((((HEAPU8[$image + ($1608 | 1) >> 0] | 0) + (HEAPU8[$image + $1608 >> 0] | 0) + (HEAPU8[$image + ($1608 | 2) >> 0] | 0) | 0) >>> 0) / 3 | 0); + } + $i$15318 = $i$15318 + 1 | 0; + } while (($i$15318 | 0) < ($sample_size$xdiv2$2 | 0)); + } + $j$13322 = $j$13322 + 1 | 0; + if (($j$13322 | 0) >= ($ydiv2$3 | 0)) break L233; + } + } + if (($pixelFormat & -3 | 0) == 4) { + $1636 = $103 + 100.0; + $1637 = +($ydiv2$3 | 0); + $1638 = +($sample_size$xdiv2$2 | 0); + $1639 = $para + 48 | 0; + $1640 = $para + 56 | 0; + $1641 = $para + 64 | 0; + $1642 = $para + 8 | 0; + $1643 = $para + 16 | 0; + $1644 = $para + 24 | 0; + $1645 = $para + 32 | 0; + $1646 = $para + 40 | 0; + $1647 = ($imageProcMode | 0) == 1; + if (($ydiv2$3 | 0) <= 0) break; + $1649 = ($sample_size$xdiv2$2 | 0) > 0; + $j$14328 = 0; + while (1) { + $1654 = $1636 + $104 * (+($j$14328 | 0) + .5) / $1637; + if ($1649) { + $i$16324 = 0; + do { + $1659 = $1636 + $104 * (+($i$16324 | 0) + .5) / $1638; + $1666 = +HEAPF64[$1641 >> 3] + (+HEAPF64[$1639 >> 3] * $1659 + $1654 * +HEAPF64[$1640 >> 3]); + if ($1666 == 0.0) { + $ext_patt2$0 = $1433; + label = 278; + break L13; + } + $1676 = (+HEAPF64[$1643 >> 3] + ($1659 * +HEAPF64[$para >> 3] + $1654 * +HEAPF64[$1642 >> 3])) / $1666; + HEAPF32[$xc2 >> 2] = $1676; + $1685 = (+HEAPF64[$1646 >> 3] + ($1659 * +HEAPF64[$1644 >> 3] + $1654 * +HEAPF64[$1645 >> 3])) / $1666; + HEAPF32[$yc2 >> 2] = $1685; + _arParamIdeal2ObservLTf($paramLTf, $1676, $1685, $xc2, $yc2) | 0; + $1686 = +HEAPF32[$xc2 >> 2]; + if ($1647) { + $xc$14 = ((~~($1686 + 1.0) | 0) / 2 | 0) << 1; + $yc$14 = ((~~(+HEAPF32[$yc2 >> 2] + 1.0) | 0) / 2 | 0) << 1; + } else { + $xc$14 = ~~($1686 + .5); + $yc$14 = ~~(+HEAPF32[$yc2 >> 2] + .5); + } + if (($xc$14 | 0) > -1) if (($yc$14 | 0) < ($ysize | 0) & (($yc$14 | 0) > -1 & ($xc$14 | 0) < ($xsize | 0))) { + $1707 = (Math_imul($yc$14, $xsize) | 0) + $xc$14 << 2; + $1727 = $1433 + ((Math_imul(($j$14328 | 0) / ($100 | 0) | 0, $patt_size) | 0) + (($i$16324 | 0) / ($99 | 0) | 0) << 2) | 0; + HEAP32[$1727 >> 2] = (HEAP32[$1727 >> 2] | 0) + ((((HEAPU8[$image + ($1707 | 2) >> 0] | 0) + (HEAPU8[$image + ($1707 | 1) >> 0] | 0) + (HEAPU8[$image + ($1707 | 3) >> 0] | 0) | 0) >>> 0) / 3 | 0); + } + $i$16324 = $i$16324 + 1 | 0; + } while (($i$16324 | 0) < ($sample_size$xdiv2$2 | 0)); + } + $j$14328 = $j$14328 + 1 | 0; + if (($j$14328 | 0) >= ($ydiv2$3 | 0)) break L233; + } + } + switch ($pixelFormat | 0) { + case 5: + case 12: + case 13: + case 14: + { + $1804 = $103 + 100.0; + $1805 = +($ydiv2$3 | 0); + $1806 = +($sample_size$xdiv2$2 | 0); + $1807 = $para + 48 | 0; + $1808 = $para + 56 | 0; + $1809 = $para + 64 | 0; + $1810 = $para + 8 | 0; + $1811 = $para + 16 | 0; + $1812 = $para + 24 | 0; + $1813 = $para + 32 | 0; + $1814 = $para + 40 | 0; + $1815 = ($imageProcMode | 0) == 1; + if (($ydiv2$3 | 0) <= 0) break L233; + $1817 = ($sample_size$xdiv2$2 | 0) > 0; + $j$15334 = 0; + do { + $1822 = $1804 + $104 * (+($j$15334 | 0) + .5) / $1805; + if ($1817) { + $i$17330 = 0; + do { + $1827 = $1804 + $104 * (+($i$17330 | 0) + .5) / $1806; + $1834 = +HEAPF64[$1809 >> 3] + (+HEAPF64[$1807 >> 3] * $1827 + $1822 * +HEAPF64[$1808 >> 3]); + if ($1834 == 0.0) { + $ext_patt2$0 = $1433; + label = 278; + break L13; + } + $1844 = (+HEAPF64[$1811 >> 3] + ($1827 * +HEAPF64[$para >> 3] + $1822 * +HEAPF64[$1810 >> 3])) / $1834; + HEAPF32[$xc2 >> 2] = $1844; + $1853 = (+HEAPF64[$1814 >> 3] + ($1827 * +HEAPF64[$1812 >> 3] + $1822 * +HEAPF64[$1813 >> 3])) / $1834; + HEAPF32[$yc2 >> 2] = $1853; + _arParamIdeal2ObservLTf($paramLTf, $1844, $1853, $xc2, $yc2) | 0; + $1854 = +HEAPF32[$xc2 >> 2]; + if ($1815) { + $xc$15 = ((~~($1854 + 1.0) | 0) / 2 | 0) << 1; + $yc$15 = ((~~(+HEAPF32[$yc2 >> 2] + 1.0) | 0) / 2 | 0) << 1; + } else { + $xc$15 = ~~($1854 + .5); + $yc$15 = ~~(+HEAPF32[$yc2 >> 2] + .5); + } + if (($xc$15 | 0) > -1) if (($yc$15 | 0) < ($ysize | 0) & (($yc$15 | 0) > -1 & ($xc$15 | 0) < ($xsize | 0))) { + $1875 = $image + ((Math_imul($yc$15, $xsize) | 0) + $xc$15) | 0; + $1882 = $1433 + ((Math_imul(($j$15334 | 0) / ($100 | 0) | 0, $patt_size) | 0) + (($i$17330 | 0) / ($99 | 0) | 0) << 2) | 0; + HEAP32[$1882 >> 2] = (HEAP32[$1882 >> 2] | 0) + (HEAPU8[$1875 >> 0] | 0); + } + $i$17330 = $i$17330 + 1 | 0; + } while (($i$17330 | 0) < ($sample_size$xdiv2$2 | 0)); + } + $j$15334 = $j$15334 + 1 | 0; + } while (($j$15334 | 0) < ($ydiv2$3 | 0)); + break; + } + case 7: + { + $1790 = $103 + 100.0; + $1791 = +($ydiv2$3 | 0); + $1792 = +($sample_size$xdiv2$2 | 0); + $1793 = $para + 48 | 0; + $1794 = $para + 56 | 0; + $1795 = $para + 64 | 0; + $1796 = $para + 8 | 0; + $1797 = $para + 16 | 0; + $1798 = $para + 24 | 0; + $1799 = $para + 32 | 0; + $1800 = $para + 40 | 0; + $1801 = ($imageProcMode | 0) == 1; + if (($ydiv2$3 | 0) <= 0) break L233; + $1803 = ($sample_size$xdiv2$2 | 0) > 0; + $j$16340 = 0; + do { + $1893 = $1790 + $104 * (+($j$16340 | 0) + .5) / $1791; + if ($1803) { + $i$18336 = 0; + do { + $1898 = $1790 + $104 * (+($i$18336 | 0) + .5) / $1792; + $1905 = +HEAPF64[$1795 >> 3] + (+HEAPF64[$1793 >> 3] * $1898 + $1893 * +HEAPF64[$1794 >> 3]); + if ($1905 == 0.0) { + $ext_patt2$0 = $1433; + label = 278; + break L13; + } + $1915 = (+HEAPF64[$1797 >> 3] + ($1898 * +HEAPF64[$para >> 3] + $1893 * +HEAPF64[$1796 >> 3])) / $1905; + HEAPF32[$xc2 >> 2] = $1915; + $1924 = (+HEAPF64[$1800 >> 3] + ($1898 * +HEAPF64[$1798 >> 3] + $1893 * +HEAPF64[$1799 >> 3])) / $1905; + HEAPF32[$yc2 >> 2] = $1924; + _arParamIdeal2ObservLTf($paramLTf, $1915, $1924, $xc2, $yc2) | 0; + $1925 = +HEAPF32[$xc2 >> 2]; + if ($1801) { + $xc$16 = ((~~($1925 + 1.0) | 0) / 2 | 0) << 1; + $yc$16 = ((~~(+HEAPF32[$yc2 >> 2] + 1.0) | 0) / 2 | 0) << 1; + } else { + $xc$16 = ~~($1925 + .5); + $yc$16 = ~~(+HEAPF32[$yc2 >> 2] + .5); + } + if (($xc$16 | 0) > -1) if (($yc$16 | 0) < ($ysize | 0) & (($yc$16 | 0) > -1 & ($xc$16 | 0) < ($xsize | 0))) { + $1948 = $image + ((Math_imul($yc$16, $xsize) | 0) + $xc$16 << 1 | 1) | 0; + $1955 = $1433 + ((Math_imul(($j$16340 | 0) / ($100 | 0) | 0, $patt_size) | 0) + (($i$18336 | 0) / ($99 | 0) | 0) << 2) | 0; + HEAP32[$1955 >> 2] = (HEAP32[$1955 >> 2] | 0) + (HEAPU8[$1948 >> 0] | 0); + } + $i$18336 = $i$18336 + 1 | 0; + } while (($i$18336 | 0) < ($sample_size$xdiv2$2 | 0)); + } + $j$16340 = $j$16340 + 1 | 0; + } while (($j$16340 | 0) < ($ydiv2$3 | 0)); + break; + } + case 8: + { + $1776 = $103 + 100.0; + $1777 = +($ydiv2$3 | 0); + $1778 = +($sample_size$xdiv2$2 | 0); + $1779 = $para + 48 | 0; + $1780 = $para + 56 | 0; + $1781 = $para + 64 | 0; + $1782 = $para + 8 | 0; + $1783 = $para + 16 | 0; + $1784 = $para + 24 | 0; + $1785 = $para + 32 | 0; + $1786 = $para + 40 | 0; + $1787 = ($imageProcMode | 0) == 1; + if (($ydiv2$3 | 0) <= 0) break L233; + $1789 = ($sample_size$xdiv2$2 | 0) > 0; + $j$17346 = 0; + do { + $1966 = $1776 + $104 * (+($j$17346 | 0) + .5) / $1777; + if ($1789) { + $i$19342 = 0; + do { + $1971 = $1776 + $104 * (+($i$19342 | 0) + .5) / $1778; + $1978 = +HEAPF64[$1781 >> 3] + (+HEAPF64[$1779 >> 3] * $1971 + $1966 * +HEAPF64[$1780 >> 3]); + if ($1978 == 0.0) { + $ext_patt2$0 = $1433; + label = 278; + break L13; + } + $1988 = (+HEAPF64[$1783 >> 3] + ($1971 * +HEAPF64[$para >> 3] + $1966 * +HEAPF64[$1782 >> 3])) / $1978; + HEAPF32[$xc2 >> 2] = $1988; + $1997 = (+HEAPF64[$1786 >> 3] + ($1971 * +HEAPF64[$1784 >> 3] + $1966 * +HEAPF64[$1785 >> 3])) / $1978; + HEAPF32[$yc2 >> 2] = $1997; + _arParamIdeal2ObservLTf($paramLTf, $1988, $1997, $xc2, $yc2) | 0; + $1998 = +HEAPF32[$xc2 >> 2]; + if ($1787) { + $xc$17 = ((~~($1998 + 1.0) | 0) / 2 | 0) << 1; + $yc$17 = ((~~(+HEAPF32[$yc2 >> 2] + 1.0) | 0) / 2 | 0) << 1; + } else { + $xc$17 = ~~($1998 + .5); + $yc$17 = ~~(+HEAPF32[$yc2 >> 2] + .5); + } + if (($xc$17 | 0) > -1) if (($yc$17 | 0) < ($ysize | 0) & (($yc$17 | 0) > -1 & ($xc$17 | 0) < ($xsize | 0))) { + $2020 = $image + ((Math_imul($yc$17, $xsize) | 0) + $xc$17 << 1) | 0; + $2027 = $1433 + ((Math_imul(($j$17346 | 0) / ($100 | 0) | 0, $patt_size) | 0) + (($i$19342 | 0) / ($99 | 0) | 0) << 2) | 0; + HEAP32[$2027 >> 2] = (HEAP32[$2027 >> 2] | 0) + (HEAPU8[$2020 >> 0] | 0); + } + $i$19342 = $i$19342 + 1 | 0; + } while (($i$19342 | 0) < ($sample_size$xdiv2$2 | 0)); + } + $j$17346 = $j$17346 + 1 | 0; + } while (($j$17346 | 0) < ($ydiv2$3 | 0)); + break; + } + case 9: + { + $1762 = $103 + 100.0; + $1763 = +($ydiv2$3 | 0); + $1764 = +($sample_size$xdiv2$2 | 0); + $1765 = $para + 48 | 0; + $1766 = $para + 56 | 0; + $1767 = $para + 64 | 0; + $1768 = $para + 8 | 0; + $1769 = $para + 16 | 0; + $1770 = $para + 24 | 0; + $1771 = $para + 32 | 0; + $1772 = $para + 40 | 0; + $1773 = ($imageProcMode | 0) == 1; + if (($ydiv2$3 | 0) <= 0) break L233; + $1775 = ($sample_size$xdiv2$2 | 0) > 0; + $j$18352 = 0; + do { + $2038 = $1762 + $104 * (+($j$18352 | 0) + .5) / $1763; + if ($1775) { + $i$20348 = 0; + do { + $2043 = $1762 + $104 * (+($i$20348 | 0) + .5) / $1764; + $2050 = +HEAPF64[$1767 >> 3] + (+HEAPF64[$1765 >> 3] * $2043 + $2038 * +HEAPF64[$1766 >> 3]); + if ($2050 == 0.0) { + $ext_patt2$0 = $1433; + label = 278; + break L13; + } + $2060 = (+HEAPF64[$1769 >> 3] + ($2043 * +HEAPF64[$para >> 3] + $2038 * +HEAPF64[$1768 >> 3])) / $2050; + HEAPF32[$xc2 >> 2] = $2060; + $2069 = (+HEAPF64[$1772 >> 3] + ($2043 * +HEAPF64[$1770 >> 3] + $2038 * +HEAPF64[$1771 >> 3])) / $2050; + HEAPF32[$yc2 >> 2] = $2069; + _arParamIdeal2ObservLTf($paramLTf, $2060, $2069, $xc2, $yc2) | 0; + $2070 = +HEAPF32[$xc2 >> 2]; + if ($1773) { + $xc$18 = ((~~($2070 + 1.0) | 0) / 2 | 0) << 1; + $yc$18 = ((~~(+HEAPF32[$yc2 >> 2] + 1.0) | 0) / 2 | 0) << 1; + } else { + $xc$18 = ~~($2070 + .5); + $yc$18 = ~~(+HEAPF32[$yc2 >> 2] + .5); + } + if (($xc$18 | 0) > -1) if (($yc$18 | 0) < ($ysize | 0) & (($yc$18 | 0) > -1 & ($xc$18 | 0) < ($xsize | 0))) { + $2091 = (Math_imul($yc$18, $xsize) | 0) + $xc$18 << 1; + $2094 = HEAPU8[$image + $2091 >> 0] | 0; + $2102 = HEAPU8[$image + ($2091 | 1) >> 0] | 0; + $2117 = $1433 + ((Math_imul(($j$18352 | 0) / ($100 | 0) | 0, $patt_size) | 0) + (($i$20348 | 0) / ($99 | 0) | 0) << 2) | 0; + HEAP32[$2117 >> 2] = (HEAP32[$2117 >> 2] | 0) + (((($2102 << 3 & 248 | 4) + ($2094 & 248 | 4) + ($2094 << 5 & 224 | $2102 >>> 3 & 28 | 2) | 0) >>> 0) / 3 | 0); + } + $i$20348 = $i$20348 + 1 | 0; + } while (($i$20348 | 0) < ($sample_size$xdiv2$2 | 0)); + } + $j$18352 = $j$18352 + 1 | 0; + } while (($j$18352 | 0) < ($ydiv2$3 | 0)); + break; + } + case 10: + { + $1748 = $103 + 100.0; + $1749 = +($ydiv2$3 | 0); + $1750 = +($sample_size$xdiv2$2 | 0); + $1751 = $para + 48 | 0; + $1752 = $para + 56 | 0; + $1753 = $para + 64 | 0; + $1754 = $para + 8 | 0; + $1755 = $para + 16 | 0; + $1756 = $para + 24 | 0; + $1757 = $para + 32 | 0; + $1758 = $para + 40 | 0; + $1759 = ($imageProcMode | 0) == 1; + if (($ydiv2$3 | 0) <= 0) break L233; + $1761 = ($sample_size$xdiv2$2 | 0) > 0; + $j$19358 = 0; + do { + $2128 = $1748 + $104 * (+($j$19358 | 0) + .5) / $1749; + if ($1761) { + $i$21354 = 0; + do { + $2133 = $1748 + $104 * (+($i$21354 | 0) + .5) / $1750; + $2140 = +HEAPF64[$1753 >> 3] + (+HEAPF64[$1751 >> 3] * $2133 + $2128 * +HEAPF64[$1752 >> 3]); + if ($2140 == 0.0) { + $ext_patt2$0 = $1433; + label = 278; + break L13; + } + $2150 = (+HEAPF64[$1755 >> 3] + ($2133 * +HEAPF64[$para >> 3] + $2128 * +HEAPF64[$1754 >> 3])) / $2140; + HEAPF32[$xc2 >> 2] = $2150; + $2159 = (+HEAPF64[$1758 >> 3] + ($2133 * +HEAPF64[$1756 >> 3] + $2128 * +HEAPF64[$1757 >> 3])) / $2140; + HEAPF32[$yc2 >> 2] = $2159; + _arParamIdeal2ObservLTf($paramLTf, $2150, $2159, $xc2, $yc2) | 0; + $2160 = +HEAPF32[$xc2 >> 2]; + if ($1759) { + $xc$19 = ((~~($2160 + 1.0) | 0) / 2 | 0) << 1; + $yc$19 = ((~~(+HEAPF32[$yc2 >> 2] + 1.0) | 0) / 2 | 0) << 1; + } else { + $xc$19 = ~~($2160 + .5); + $yc$19 = ~~(+HEAPF32[$yc2 >> 2] + .5); + } + if (($xc$19 | 0) > -1) if (($yc$19 | 0) < ($ysize | 0) & (($yc$19 | 0) > -1 & ($xc$19 | 0) < ($xsize | 0))) { + $2181 = (Math_imul($yc$19, $xsize) | 0) + $xc$19 << 1; + $2184 = HEAPU8[$image + $2181 >> 0] | 0; + $2192 = HEAPU8[$image + ($2181 | 1) >> 0] | 0; + $2207 = $1433 + ((Math_imul(($j$19358 | 0) / ($100 | 0) | 0, $patt_size) | 0) + (($i$21354 | 0) / ($99 | 0) | 0) << 2) | 0; + HEAP32[$2207 >> 2] = (HEAP32[$2207 >> 2] | 0) + (((($2192 << 2 & 248 | 4) + ($2184 & 248 | 4) + ($2184 << 5 & 224 | $2192 >>> 3 & 24 | 4) | 0) >>> 0) / 3 | 0); + } + $i$21354 = $i$21354 + 1 | 0; + } while (($i$21354 | 0) < ($sample_size$xdiv2$2 | 0)); + } + $j$19358 = $j$19358 + 1 | 0; + } while (($j$19358 | 0) < ($ydiv2$3 | 0)); + break; + } + case 11: + { + $1734 = $103 + 100.0; + $1735 = +($ydiv2$3 | 0); + $1736 = +($sample_size$xdiv2$2 | 0); + $1737 = $para + 48 | 0; + $1738 = $para + 56 | 0; + $1739 = $para + 64 | 0; + $1740 = $para + 8 | 0; + $1741 = $para + 16 | 0; + $1742 = $para + 24 | 0; + $1743 = $para + 32 | 0; + $1744 = $para + 40 | 0; + $1745 = ($imageProcMode | 0) == 1; + if (($ydiv2$3 | 0) <= 0) break L233; + $1747 = ($sample_size$xdiv2$2 | 0) > 0; + $j$20364 = 0; + do { + $2218 = $1734 + $104 * (+($j$20364 | 0) + .5) / $1735; + if ($1747) { + $i$22360 = 0; + do { + $2223 = $1734 + $104 * (+($i$22360 | 0) + .5) / $1736; + $2230 = +HEAPF64[$1739 >> 3] + (+HEAPF64[$1737 >> 3] * $2223 + $2218 * +HEAPF64[$1738 >> 3]); + if ($2230 == 0.0) { + $ext_patt2$0 = $1433; + label = 278; + break L13; + } + $2240 = (+HEAPF64[$1741 >> 3] + ($2223 * +HEAPF64[$para >> 3] + $2218 * +HEAPF64[$1740 >> 3])) / $2230; + HEAPF32[$xc2 >> 2] = $2240; + $2249 = (+HEAPF64[$1744 >> 3] + ($2223 * +HEAPF64[$1742 >> 3] + $2218 * +HEAPF64[$1743 >> 3])) / $2230; + HEAPF32[$yc2 >> 2] = $2249; + _arParamIdeal2ObservLTf($paramLTf, $2240, $2249, $xc2, $yc2) | 0; + $2250 = +HEAPF32[$xc2 >> 2]; + if ($1745) { + $xc$20 = ((~~($2250 + 1.0) | 0) / 2 | 0) << 1; + $yc$20 = ((~~(+HEAPF32[$yc2 >> 2] + 1.0) | 0) / 2 | 0) << 1; + } else { + $xc$20 = ~~($2250 + .5); + $yc$20 = ~~(+HEAPF32[$yc2 >> 2] + .5); + } + if (($xc$20 | 0) > -1) if (($yc$20 | 0) < ($ysize | 0) & (($yc$20 | 0) > -1 & ($xc$20 | 0) < ($xsize | 0))) { + $2271 = (Math_imul($yc$20, $xsize) | 0) + $xc$20 << 1; + $2274 = HEAPU8[$image + $2271 >> 0] | 0; + $2293 = $1433 + ((Math_imul(($j$20364 | 0) / ($100 | 0) | 0, $patt_size) | 0) + (($i$22360 | 0) / ($99 | 0) | 0) << 2) | 0; + HEAP32[$2293 >> 2] = (HEAP32[$2293 >> 2] | 0) + (((($2274 << 4 & 240 | 8) + ($2274 & 240 | 8) + ((HEAPU8[$image + ($2271 | 1) >> 0] | 0) & 240 | 8) | 0) >>> 0) / 3 | 0); + } + $i$22360 = $i$22360 + 1 | 0; + } while (($i$22360 | 0) < ($sample_size$xdiv2$2 | 0)); + } + $j$20364 = $j$20364 + 1 | 0; + } while (($j$20364 | 0) < ($ydiv2$3 | 0)); + break; + } + default: + { + _arLog(3, 4615, $vararg_buffer5); + $ext_patt2$0 = $1433; + label = 278; + break L13; + } + } + } while (0); + $1450 = Math_imul($100, $99) | 0; + if ($106) { + $i$23309 = 0; + do { + HEAP8[$ext_patt + $i$23309 >> 0] = ((HEAP32[$1433 + ($i$23309 << 2) >> 2] | 0) >>> 0) / ($1450 >>> 0) | 0; + $i$23309 = $i$23309 + 1 | 0; + } while (($i$23309 | 0) < ($106 | 0)); + } + _free($1433); + $$0 = 0; + } while (0); + if ((label | 0) == 278) { + _free($ext_patt2$0); + $$0 = -1; + } + STACKTOP = sp; + return $$0 | 0; +} + +function __ZN10__cxxabiv112_GLOBAL__N_118parse_builtin_typeINS0_2DbEEEPKcS4_S4_RT_($first, $last, $db) { + $first = $first | 0; + $last = $last | 0; + $db = $db | 0; + var $$0 = 0, $$0$i$i$i = 0, $$0$i$i$i103 = 0, $$0$i$i$i108 = 0, $$0$i$i$i113 = 0, $$0$i$i$i118 = 0, $$0$i$i$i123 = 0, $$0$i$i$i128 = 0, $$0$i$i$i133 = 0, $$0$i$i$i138 = 0, $$0$i$i$i14 = 0, $$0$i$i$i143 = 0, $$0$i$i$i19 = 0, $$0$i$i$i24 = 0, $$0$i$i$i29 = 0, $$0$i$i$i34 = 0, $$0$i$i$i39 = 0, $$0$i$i$i4 = 0, $$0$i$i$i44 = 0, $$0$i$i$i49 = 0, $$0$i$i$i54 = 0, $$0$i$i$i59 = 0, $$0$i$i$i66 = 0, $$0$i$i$i71 = 0, $$0$i$i$i76 = 0, $$0$i$i$i81 = 0, $$0$i$i$i88 = 0, $$0$i$i$i9 = 0, $$0$i$i$i93 = 0, $$0$i$i$i98 = 0, $0 = 0, $1 = 0, $10 = 0, $100 = 0, $101 = 0, $102 = 0, $106 = 0, $108 = 0, $11 = 0, $111 = 0, $112 = 0, $115 = 0, $116 = 0, $118 = 0, $12 = 0, $125 = 0, $126 = 0, $127 = 0, $128 = 0, $13 = 0, $132 = 0, $134 = 0, $137 = 0, $138 = 0, $14 = 0, $141 = 0, $142 = 0, $144 = 0, $15 = 0, $151 = 0, $152 = 0, $153 = 0, $154 = 0, $158 = 0, $16 = 0, $160 = 0, $163 = 0, $164 = 0, $167 = 0, $168 = 0, $17 = 0, $170 = 0, $177 = 0, $178 = 0, $179 = 0, $18 = 0, $180 = 0, $184 = 0, $186 = 0, $189 = 0, $19 = 0, $190 = 0, $193 = 0, $194 = 0, $196 = 0, $2 = 0, $20 = 0, $203 = 0, $204 = 0, $205 = 0, $206 = 0, $21 = 0, $210 = 0, $212 = 0, $215 = 0, $216 = 0, $219 = 0, $22 = 0, $220 = 0, $222 = 0, $229 = 0, $23 = 0, $230 = 0, $231 = 0, $232 = 0, $236 = 0, $238 = 0, $24 = 0, $241 = 0, $242 = 0, $245 = 0, $246 = 0, $248 = 0, $25 = 0, $255 = 0, $256 = 0, $257 = 0, $258 = 0, $26 = 0, $262 = 0, $264 = 0, $267 = 0, $268 = 0, $27 = 0, $271 = 0, $272 = 0, $274 = 0, $28 = 0, $281 = 0, $282 = 0, $283 = 0, $284 = 0, $288 = 0, $290 = 0, $293 = 0, $294 = 0, $297 = 0, $298 = 0, $3 = 0, $300 = 0, $307 = 0, $308 = 0, $309 = 0, $310 = 0, $314 = 0, $316 = 0, $319 = 0, $32 = 0, $320 = 0, $323 = 0, $324 = 0, $326 = 0, $33 = 0, $333 = 0, $334 = 0, $335 = 0, $336 = 0, $340 = 0, $342 = 0, $345 = 0, $346 = 0, $349 = 0, $35 = 0, $350 = 0, $352 = 0, $359 = 0, $360 = 0, $361 = 0, $362 = 0, $366 = 0, $368 = 0, $371 = 0, $372 = 0, $375 = 0, $379 = 0, $382 = 0, $383 = 0, $385 = 0, $392 = 0, $393 = 0, $394 = 0, $395 = 0, $399 = 0, $4 = 0, $401 = 0, $404 = 0, $405 = 0, $408 = 0, $409 = 0, $411 = 0, $418 = 0, $419 = 0, $42 = 0, $420 = 0, $421 = 0, $425 = 0, $427 = 0, $43 = 0, $430 = 0, $431 = 0, $434 = 0, $435 = 0, $437 = 0, $44 = 0, $444 = 0, $445 = 0, $446 = 0, $447 = 0, $45 = 0, $451 = 0, $453 = 0, $456 = 0, $457 = 0, $460 = 0, $461 = 0, $463 = 0, $470 = 0, $471 = 0, $472 = 0, $473 = 0, $477 = 0, $479 = 0, $482 = 0, $483 = 0, $486 = 0, $488 = 0, $49 = 0, $491 = 0, $492 = 0, $494 = 0, $5 = 0, $501 = 0, $502 = 0, $503 = 0, $504 = 0, $508 = 0, $51 = 0, $510 = 0, $513 = 0, $514 = 0, $517 = 0, $518 = 0, $520 = 0, $527 = 0, $528 = 0, $529 = 0, $530 = 0, $534 = 0, $536 = 0, $539 = 0, $54 = 0, $540 = 0, $543 = 0, $544 = 0, $546 = 0, $55 = 0, $553 = 0, $554 = 0, $555 = 0, $556 = 0, $560 = 0, $562 = 0, $565 = 0, $566 = 0, $569 = 0, $570 = 0, $572 = 0, $579 = 0, $58 = 0, $580 = 0, $581 = 0, $582 = 0, $586 = 0, $588 = 0, $591 = 0, $592 = 0, $595 = 0, $596 = 0, $598 = 0, $6 = 0, $60 = 0, $602 = 0, $603 = 0, $605 = 0, $612 = 0, $613 = 0, $614 = 0, $615 = 0, $619 = 0, $621 = 0, $624 = 0, $625 = 0, $628 = 0, $629 = 0, $63 = 0, $631 = 0, $638 = 0, $639 = 0, $64 = 0, $640 = 0, $641 = 0, $645 = 0, $647 = 0, $650 = 0, $651 = 0, $654 = 0, $655 = 0, $657 = 0, $66 = 0, $664 = 0, $665 = 0, $666 = 0, $667 = 0, $671 = 0, $673 = 0, $676 = 0, $677 = 0, $680 = 0, $681 = 0, $683 = 0, $690 = 0, $691 = 0, $692 = 0, $693 = 0, $697 = 0, $699 = 0, $7 = 0, $702 = 0, $703 = 0, $706 = 0, $707 = 0, $709 = 0, $716 = 0, $717 = 0, $718 = 0, $719 = 0, $723 = 0, $725 = 0, $728 = 0, $729 = 0, $73 = 0, $732 = 0, $733 = 0, $735 = 0, $74 = 0, $742 = 0, $743 = 0, $744 = 0, $745 = 0, $749 = 0, $75 = 0, $751 = 0, $754 = 0, $755 = 0, $758 = 0, $759 = 0, $76 = 0, $761 = 0, $768 = 0, $769 = 0, $770 = 0, $771 = 0, $775 = 0, $777 = 0, $780 = 0, $781 = 0, $784 = 0, $785 = 0, $787 = 0, $794 = 0, $795 = 0, $796 = 0, $797 = 0, $8 = 0, $80 = 0, $801 = 0, $803 = 0, $806 = 0, $807 = 0, $82 = 0, $85 = 0, $86 = 0, $89 = 0, $9 = 0, $90 = 0, $92 = 0, $99 = 0, $__v$i$i142 = 0, dest = 0, sp = 0, src = 0, stop = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 720 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $__v$i$i142 = sp + 696 | 0; + $0 = sp + 672 | 0; + $1 = sp + 648 | 0; + $2 = sp + 624 | 0; + $3 = sp + 600 | 0; + $4 = sp + 576 | 0; + $5 = sp + 552 | 0; + $6 = sp + 528 | 0; + $7 = sp + 504 | 0; + $8 = sp + 480 | 0; + $9 = sp + 456 | 0; + $10 = sp + 432 | 0; + $11 = sp + 408 | 0; + $12 = sp + 384 | 0; + $13 = sp + 360 | 0; + $14 = sp + 336 | 0; + $15 = sp + 312 | 0; + $16 = sp + 288 | 0; + $17 = sp + 264 | 0; + $18 = sp + 240 | 0; + $19 = sp + 216 | 0; + $20 = sp + 192 | 0; + $21 = sp + 168 | 0; + $22 = sp + 144 | 0; + $23 = sp + 120 | 0; + $24 = sp + 96 | 0; + $25 = sp + 72 | 0; + $26 = sp + 48 | 0; + $27 = sp + 24 | 0; + $28 = sp; + L1 : do if (($first | 0) == ($last | 0)) $$0 = $first; else do switch (HEAP8[$first >> 0] | 0) { + case 118: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj5EEERAT__Kc($0, 14202); + $32 = $db + 4 | 0; + $33 = HEAP32[$32 >> 2] | 0; + $35 = HEAP32[$db + 8 >> 2] | 0; + if ($33 >>> 0 < $35 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($33, $0); + HEAP32[$32 >> 2] = (HEAP32[$32 >> 2] | 0) + 24; + } else { + $42 = HEAP32[$db >> 2] | 0; + $43 = $33 - $42 | 0; + $44 = ($43 | 0) / 24 | 0; + $45 = $44 + 1 | 0; + if (($43 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $49 = ($35 - $42 | 0) / 24 | 0; + if ($49 >>> 0 < 1073741823) { + $51 = $49 << 1; + $$0$i$i$i = $51 >>> 0 < $45 >>> 0 ? $45 : $51; + } else $$0$i$i$i = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i142, $$0$i$i$i, $44, $db + 12 | 0); + $54 = $__v$i$i142 + 8 | 0; + $55 = HEAP32[$54 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($55, $0); + HEAP32[$54 >> 2] = $55 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i142); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i142); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($0); + $$0 = $first + 1 | 0; + break L1; + break; + } + case 119: + { + HEAP8[$1 >> 0] = 14; + $58 = $1 + 1 | 0; + HEAP8[$58 >> 0] = HEAP8[13764] | 0; + HEAP8[$58 + 1 >> 0] = HEAP8[13765] | 0; + HEAP8[$58 + 2 >> 0] = HEAP8[13766] | 0; + HEAP8[$58 + 3 >> 0] = HEAP8[13767] | 0; + HEAP8[$58 + 4 >> 0] = HEAP8[13768] | 0; + HEAP8[$58 + 5 >> 0] = HEAP8[13769] | 0; + HEAP8[$58 + 6 >> 0] = HEAP8[13770] | 0; + HEAP8[$1 + 8 >> 0] = 0; + $60 = $1 + 12 | 0; + HEAP32[$60 >> 2] = 0; + HEAP32[$60 + 4 >> 2] = 0; + HEAP32[$60 + 8 >> 2] = 0; + $63 = $db + 4 | 0; + $64 = HEAP32[$63 >> 2] | 0; + $66 = HEAP32[$db + 8 >> 2] | 0; + if ($64 >>> 0 < $66 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($64, $1); + HEAP32[$63 >> 2] = (HEAP32[$63 >> 2] | 0) + 24; + } else { + $73 = HEAP32[$db >> 2] | 0; + $74 = $64 - $73 | 0; + $75 = ($74 | 0) / 24 | 0; + $76 = $75 + 1 | 0; + if (($74 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $80 = ($66 - $73 | 0) / 24 | 0; + if ($80 >>> 0 < 1073741823) { + $82 = $80 << 1; + $$0$i$i$i4 = $82 >>> 0 < $76 >>> 0 ? $76 : $82; + } else $$0$i$i$i4 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i142, $$0$i$i$i4, $75, $db + 12 | 0); + $85 = $__v$i$i142 + 8 | 0; + $86 = HEAP32[$85 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($86, $1); + HEAP32[$85 >> 2] = $86 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i142); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i142); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($1); + $$0 = $first + 1 | 0; + break L1; + break; + } + case 98: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj5EEERAT__Kc($2, 14207); + $89 = $db + 4 | 0; + $90 = HEAP32[$89 >> 2] | 0; + $92 = HEAP32[$db + 8 >> 2] | 0; + if ($90 >>> 0 < $92 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($90, $2); + HEAP32[$89 >> 2] = (HEAP32[$89 >> 2] | 0) + 24; + } else { + $99 = HEAP32[$db >> 2] | 0; + $100 = $90 - $99 | 0; + $101 = ($100 | 0) / 24 | 0; + $102 = $101 + 1 | 0; + if (($100 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $106 = ($92 - $99 | 0) / 24 | 0; + if ($106 >>> 0 < 1073741823) { + $108 = $106 << 1; + $$0$i$i$i9 = $108 >>> 0 < $102 >>> 0 ? $102 : $108; + } else $$0$i$i$i9 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i142, $$0$i$i$i9, $101, $db + 12 | 0); + $111 = $__v$i$i142 + 8 | 0; + $112 = HEAP32[$111 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($112, $2); + HEAP32[$111 >> 2] = $112 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i142); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i142); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($2); + $$0 = $first + 1 | 0; + break L1; + break; + } + case 99: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj5EEERAT__Kc($3, 13783); + $115 = $db + 4 | 0; + $116 = HEAP32[$115 >> 2] | 0; + $118 = HEAP32[$db + 8 >> 2] | 0; + if ($116 >>> 0 < $118 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($116, $3); + HEAP32[$115 >> 2] = (HEAP32[$115 >> 2] | 0) + 24; + } else { + $125 = HEAP32[$db >> 2] | 0; + $126 = $116 - $125 | 0; + $127 = ($126 | 0) / 24 | 0; + $128 = $127 + 1 | 0; + if (($126 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $132 = ($118 - $125 | 0) / 24 | 0; + if ($132 >>> 0 < 1073741823) { + $134 = $132 << 1; + $$0$i$i$i14 = $134 >>> 0 < $128 >>> 0 ? $128 : $134; + } else $$0$i$i$i14 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i142, $$0$i$i$i14, $127, $db + 12 | 0); + $137 = $__v$i$i142 + 8 | 0; + $138 = HEAP32[$137 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($138, $3); + HEAP32[$137 >> 2] = $138 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i142); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i142); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($3); + $$0 = $first + 1 | 0; + break L1; + break; + } + case 97: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj12EEERAT__Kc($4, 13788); + $141 = $db + 4 | 0; + $142 = HEAP32[$141 >> 2] | 0; + $144 = HEAP32[$db + 8 >> 2] | 0; + if ($142 >>> 0 < $144 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($142, $4); + HEAP32[$141 >> 2] = (HEAP32[$141 >> 2] | 0) + 24; + } else { + $151 = HEAP32[$db >> 2] | 0; + $152 = $142 - $151 | 0; + $153 = ($152 | 0) / 24 | 0; + $154 = $153 + 1 | 0; + if (($152 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $158 = ($144 - $151 | 0) / 24 | 0; + if ($158 >>> 0 < 1073741823) { + $160 = $158 << 1; + $$0$i$i$i19 = $160 >>> 0 < $154 >>> 0 ? $154 : $160; + } else $$0$i$i$i19 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i142, $$0$i$i$i19, $153, $db + 12 | 0); + $163 = $__v$i$i142 + 8 | 0; + $164 = HEAP32[$163 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($164, $4); + HEAP32[$163 >> 2] = $164 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i142); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i142); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($4); + $$0 = $first + 1 | 0; + break L1; + break; + } + case 104: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj14EEERAT__Kc($5, 13800); + $167 = $db + 4 | 0; + $168 = HEAP32[$167 >> 2] | 0; + $170 = HEAP32[$db + 8 >> 2] | 0; + if ($168 >>> 0 < $170 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($168, $5); + HEAP32[$167 >> 2] = (HEAP32[$167 >> 2] | 0) + 24; + } else { + $177 = HEAP32[$db >> 2] | 0; + $178 = $168 - $177 | 0; + $179 = ($178 | 0) / 24 | 0; + $180 = $179 + 1 | 0; + if (($178 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $184 = ($170 - $177 | 0) / 24 | 0; + if ($184 >>> 0 < 1073741823) { + $186 = $184 << 1; + $$0$i$i$i24 = $186 >>> 0 < $180 >>> 0 ? $180 : $186; + } else $$0$i$i$i24 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i142, $$0$i$i$i24, $179, $db + 12 | 0); + $189 = $__v$i$i142 + 8 | 0; + $190 = HEAP32[$189 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($190, $5); + HEAP32[$189 >> 2] = $190 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i142); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i142); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($5); + $$0 = $first + 1 | 0; + break L1; + break; + } + case 115: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj6EEERAT__Kc($6, 13814); + $193 = $db + 4 | 0; + $194 = HEAP32[$193 >> 2] | 0; + $196 = HEAP32[$db + 8 >> 2] | 0; + if ($194 >>> 0 < $196 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($194, $6); + HEAP32[$193 >> 2] = (HEAP32[$193 >> 2] | 0) + 24; + } else { + $203 = HEAP32[$db >> 2] | 0; + $204 = $194 - $203 | 0; + $205 = ($204 | 0) / 24 | 0; + $206 = $205 + 1 | 0; + if (($204 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $210 = ($196 - $203 | 0) / 24 | 0; + if ($210 >>> 0 < 1073741823) { + $212 = $210 << 1; + $$0$i$i$i29 = $212 >>> 0 < $206 >>> 0 ? $206 : $212; + } else $$0$i$i$i29 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i142, $$0$i$i$i29, $205, $db + 12 | 0); + $215 = $__v$i$i142 + 8 | 0; + $216 = HEAP32[$215 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($216, $6); + HEAP32[$215 >> 2] = $216 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i142); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i142); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($6); + $$0 = $first + 1 | 0; + break L1; + break; + } + case 116: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj15EEERAT__Kc($7, 13820); + $219 = $db + 4 | 0; + $220 = HEAP32[$219 >> 2] | 0; + $222 = HEAP32[$db + 8 >> 2] | 0; + if ($220 >>> 0 < $222 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($220, $7); + HEAP32[$219 >> 2] = (HEAP32[$219 >> 2] | 0) + 24; + } else { + $229 = HEAP32[$db >> 2] | 0; + $230 = $220 - $229 | 0; + $231 = ($230 | 0) / 24 | 0; + $232 = $231 + 1 | 0; + if (($230 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $236 = ($222 - $229 | 0) / 24 | 0; + if ($236 >>> 0 < 1073741823) { + $238 = $236 << 1; + $$0$i$i$i34 = $238 >>> 0 < $232 >>> 0 ? $232 : $238; + } else $$0$i$i$i34 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i142, $$0$i$i$i34, $231, $db + 12 | 0); + $241 = $__v$i$i142 + 8 | 0; + $242 = HEAP32[$241 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($242, $7); + HEAP32[$241 >> 2] = $242 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i142); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i142); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($7); + $$0 = $first + 1 | 0; + break L1; + break; + } + case 105: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj4EEERAT__Kc($8, 14212); + $245 = $db + 4 | 0; + $246 = HEAP32[$245 >> 2] | 0; + $248 = HEAP32[$db + 8 >> 2] | 0; + if ($246 >>> 0 < $248 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($246, $8); + HEAP32[$245 >> 2] = (HEAP32[$245 >> 2] | 0) + 24; + } else { + $255 = HEAP32[$db >> 2] | 0; + $256 = $246 - $255 | 0; + $257 = ($256 | 0) / 24 | 0; + $258 = $257 + 1 | 0; + if (($256 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $262 = ($248 - $255 | 0) / 24 | 0; + if ($262 >>> 0 < 1073741823) { + $264 = $262 << 1; + $$0$i$i$i39 = $264 >>> 0 < $258 >>> 0 ? $258 : $264; + } else $$0$i$i$i39 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i142, $$0$i$i$i39, $257, $db + 12 | 0); + $267 = $__v$i$i142 + 8 | 0; + $268 = HEAP32[$267 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($268, $8); + HEAP32[$267 >> 2] = $268 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i142); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i142); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($8); + $$0 = $first + 1 | 0; + break L1; + break; + } + case 106: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj13EEERAT__Kc($9, 14216); + $271 = $db + 4 | 0; + $272 = HEAP32[$271 >> 2] | 0; + $274 = HEAP32[$db + 8 >> 2] | 0; + if ($272 >>> 0 < $274 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($272, $9); + HEAP32[$271 >> 2] = (HEAP32[$271 >> 2] | 0) + 24; + } else { + $281 = HEAP32[$db >> 2] | 0; + $282 = $272 - $281 | 0; + $283 = ($282 | 0) / 24 | 0; + $284 = $283 + 1 | 0; + if (($282 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $288 = ($274 - $281 | 0) / 24 | 0; + if ($288 >>> 0 < 1073741823) { + $290 = $288 << 1; + $$0$i$i$i44 = $290 >>> 0 < $284 >>> 0 ? $284 : $290; + } else $$0$i$i$i44 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i142, $$0$i$i$i44, $283, $db + 12 | 0); + $293 = $__v$i$i142 + 8 | 0; + $294 = HEAP32[$293 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($294, $9); + HEAP32[$293 >> 2] = $294 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i142); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i142); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($9); + $$0 = $first + 1 | 0; + break L1; + break; + } + case 108: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj5EEERAT__Kc($10, 14229); + $297 = $db + 4 | 0; + $298 = HEAP32[$297 >> 2] | 0; + $300 = HEAP32[$db + 8 >> 2] | 0; + if ($298 >>> 0 < $300 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($298, $10); + HEAP32[$297 >> 2] = (HEAP32[$297 >> 2] | 0) + 24; + } else { + $307 = HEAP32[$db >> 2] | 0; + $308 = $298 - $307 | 0; + $309 = ($308 | 0) / 24 | 0; + $310 = $309 + 1 | 0; + if (($308 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $314 = ($300 - $307 | 0) / 24 | 0; + if ($314 >>> 0 < 1073741823) { + $316 = $314 << 1; + $$0$i$i$i49 = $316 >>> 0 < $310 >>> 0 ? $310 : $316; + } else $$0$i$i$i49 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i142, $$0$i$i$i49, $309, $db + 12 | 0); + $319 = $__v$i$i142 + 8 | 0; + $320 = HEAP32[$319 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($320, $10); + HEAP32[$319 >> 2] = $320 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i142); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i142); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($10); + $$0 = $first + 1 | 0; + break L1; + break; + } + case 109: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj14EEERAT__Kc($11, 14234); + $323 = $db + 4 | 0; + $324 = HEAP32[$323 >> 2] | 0; + $326 = HEAP32[$db + 8 >> 2] | 0; + if ($324 >>> 0 < $326 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($324, $11); + HEAP32[$323 >> 2] = (HEAP32[$323 >> 2] | 0) + 24; + } else { + $333 = HEAP32[$db >> 2] | 0; + $334 = $324 - $333 | 0; + $335 = ($334 | 0) / 24 | 0; + $336 = $335 + 1 | 0; + if (($334 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $340 = ($326 - $333 | 0) / 24 | 0; + if ($340 >>> 0 < 1073741823) { + $342 = $340 << 1; + $$0$i$i$i54 = $342 >>> 0 < $336 >>> 0 ? $336 : $342; + } else $$0$i$i$i54 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i142, $$0$i$i$i54, $335, $db + 12 | 0); + $345 = $__v$i$i142 + 8 | 0; + $346 = HEAP32[$345 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($346, $11); + HEAP32[$345 >> 2] = $346 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i142); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i142); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($11); + $$0 = $first + 1 | 0; + break L1; + break; + } + case 120: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj10EEERAT__Kc($12, 14248); + $349 = $db + 4 | 0; + $350 = HEAP32[$349 >> 2] | 0; + $352 = HEAP32[$db + 8 >> 2] | 0; + if ($350 >>> 0 < $352 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($350, $12); + HEAP32[$349 >> 2] = (HEAP32[$349 >> 2] | 0) + 24; + } else { + $359 = HEAP32[$db >> 2] | 0; + $360 = $350 - $359 | 0; + $361 = ($360 | 0) / 24 | 0; + $362 = $361 + 1 | 0; + if (($360 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $366 = ($352 - $359 | 0) / 24 | 0; + if ($366 >>> 0 < 1073741823) { + $368 = $366 << 1; + $$0$i$i$i59 = $368 >>> 0 < $362 >>> 0 ? $362 : $368; + } else $$0$i$i$i59 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i142, $$0$i$i$i59, $361, $db + 12 | 0); + $371 = $__v$i$i142 + 8 | 0; + $372 = HEAP32[$371 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($372, $12); + HEAP32[$371 >> 2] = $372 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i142); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i142); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($12); + $$0 = $first + 1 | 0; + break L1; + break; + } + case 121: + { + $375 = _malloc(32) | 0; + HEAP32[$13 + 8 >> 2] = $375; + HEAP32[$13 >> 2] = 33; + HEAP32[$13 + 4 >> 2] = 18; + dest = $375; + src = 14258; + stop = dest + 18 | 0; + do { + HEAP8[dest >> 0] = HEAP8[src >> 0] | 0; + dest = dest + 1 | 0; + src = src + 1 | 0; + } while ((dest | 0) < (stop | 0)); + HEAP8[$375 + 18 >> 0] = 0; + $379 = $13 + 12 | 0; + HEAP32[$379 >> 2] = 0; + HEAP32[$379 + 4 >> 2] = 0; + HEAP32[$379 + 8 >> 2] = 0; + $382 = $db + 4 | 0; + $383 = HEAP32[$382 >> 2] | 0; + $385 = HEAP32[$db + 8 >> 2] | 0; + if ($383 >>> 0 < $385 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($383, $13); + HEAP32[$382 >> 2] = (HEAP32[$382 >> 2] | 0) + 24; + } else { + $392 = HEAP32[$db >> 2] | 0; + $393 = $383 - $392 | 0; + $394 = ($393 | 0) / 24 | 0; + $395 = $394 + 1 | 0; + if (($393 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $399 = ($385 - $392 | 0) / 24 | 0; + if ($399 >>> 0 < 1073741823) { + $401 = $399 << 1; + $$0$i$i$i66 = $401 >>> 0 < $395 >>> 0 ? $395 : $401; + } else $$0$i$i$i66 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i142, $$0$i$i$i66, $394, $db + 12 | 0); + $404 = $__v$i$i142 + 8 | 0; + $405 = HEAP32[$404 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($405, $13); + HEAP32[$404 >> 2] = $405 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i142); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i142); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($13); + $$0 = $first + 1 | 0; + break L1; + break; + } + case 110: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj9EEERAT__Kc($14, 13850); + $408 = $db + 4 | 0; + $409 = HEAP32[$408 >> 2] | 0; + $411 = HEAP32[$db + 8 >> 2] | 0; + if ($409 >>> 0 < $411 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($409, $14); + HEAP32[$408 >> 2] = (HEAP32[$408 >> 2] | 0) + 24; + } else { + $418 = HEAP32[$db >> 2] | 0; + $419 = $409 - $418 | 0; + $420 = ($419 | 0) / 24 | 0; + $421 = $420 + 1 | 0; + if (($419 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $425 = ($411 - $418 | 0) / 24 | 0; + if ($425 >>> 0 < 1073741823) { + $427 = $425 << 1; + $$0$i$i$i71 = $427 >>> 0 < $421 >>> 0 ? $421 : $427; + } else $$0$i$i$i71 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i142, $$0$i$i$i71, $420, $db + 12 | 0); + $430 = $__v$i$i142 + 8 | 0; + $431 = HEAP32[$430 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($431, $14); + HEAP32[$430 >> 2] = $431 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i142); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i142); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($14); + $$0 = $first + 1 | 0; + break L1; + break; + } + case 111: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj18EEERAT__Kc($15, 13859); + $434 = $db + 4 | 0; + $435 = HEAP32[$434 >> 2] | 0; + $437 = HEAP32[$db + 8 >> 2] | 0; + if ($435 >>> 0 < $437 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($435, $15); + HEAP32[$434 >> 2] = (HEAP32[$434 >> 2] | 0) + 24; + } else { + $444 = HEAP32[$db >> 2] | 0; + $445 = $435 - $444 | 0; + $446 = ($445 | 0) / 24 | 0; + $447 = $446 + 1 | 0; + if (($445 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $451 = ($437 - $444 | 0) / 24 | 0; + if ($451 >>> 0 < 1073741823) { + $453 = $451 << 1; + $$0$i$i$i76 = $453 >>> 0 < $447 >>> 0 ? $447 : $453; + } else $$0$i$i$i76 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i142, $$0$i$i$i76, $446, $db + 12 | 0); + $456 = $__v$i$i142 + 8 | 0; + $457 = HEAP32[$456 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($457, $15); + HEAP32[$456 >> 2] = $457 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i142); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i142); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($15); + $$0 = $first + 1 | 0; + break L1; + break; + } + case 102: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj6EEERAT__Kc($16, 14277); + $460 = $db + 4 | 0; + $461 = HEAP32[$460 >> 2] | 0; + $463 = HEAP32[$db + 8 >> 2] | 0; + if ($461 >>> 0 < $463 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($461, $16); + HEAP32[$460 >> 2] = (HEAP32[$460 >> 2] | 0) + 24; + } else { + $470 = HEAP32[$db >> 2] | 0; + $471 = $461 - $470 | 0; + $472 = ($471 | 0) / 24 | 0; + $473 = $472 + 1 | 0; + if (($471 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $477 = ($463 - $470 | 0) / 24 | 0; + if ($477 >>> 0 < 1073741823) { + $479 = $477 << 1; + $$0$i$i$i81 = $479 >>> 0 < $473 >>> 0 ? $473 : $479; + } else $$0$i$i$i81 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i142, $$0$i$i$i81, $472, $db + 12 | 0); + $482 = $__v$i$i142 + 8 | 0; + $483 = HEAP32[$482 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($483, $16); + HEAP32[$482 >> 2] = $483 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i142); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i142); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($16); + $$0 = $first + 1 | 0; + break L1; + break; + } + case 100: + { + HEAP8[$17 >> 0] = 12; + $486 = $17 + 1 | 0; + HEAP8[$486 >> 0] = HEAP8[14283] | 0; + HEAP8[$486 + 1 >> 0] = HEAP8[14284] | 0; + HEAP8[$486 + 2 >> 0] = HEAP8[14285] | 0; + HEAP8[$486 + 3 >> 0] = HEAP8[14286] | 0; + HEAP8[$486 + 4 >> 0] = HEAP8[14287] | 0; + HEAP8[$486 + 5 >> 0] = HEAP8[14288] | 0; + HEAP8[$17 + 7 >> 0] = 0; + $488 = $17 + 12 | 0; + HEAP32[$488 >> 2] = 0; + HEAP32[$488 + 4 >> 2] = 0; + HEAP32[$488 + 8 >> 2] = 0; + $491 = $db + 4 | 0; + $492 = HEAP32[$491 >> 2] | 0; + $494 = HEAP32[$db + 8 >> 2] | 0; + if ($492 >>> 0 < $494 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($492, $17); + HEAP32[$491 >> 2] = (HEAP32[$491 >> 2] | 0) + 24; + } else { + $501 = HEAP32[$db >> 2] | 0; + $502 = $492 - $501 | 0; + $503 = ($502 | 0) / 24 | 0; + $504 = $503 + 1 | 0; + if (($502 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $508 = ($494 - $501 | 0) / 24 | 0; + if ($508 >>> 0 < 1073741823) { + $510 = $508 << 1; + $$0$i$i$i88 = $510 >>> 0 < $504 >>> 0 ? $504 : $510; + } else $$0$i$i$i88 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i142, $$0$i$i$i88, $503, $db + 12 | 0); + $513 = $__v$i$i142 + 8 | 0; + $514 = HEAP32[$513 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($514, $17); + HEAP32[$513 >> 2] = $514 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i142); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i142); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($17); + $$0 = $first + 1 | 0; + break L1; + break; + } + case 101: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj12EEERAT__Kc($18, 14290); + $517 = $db + 4 | 0; + $518 = HEAP32[$517 >> 2] | 0; + $520 = HEAP32[$db + 8 >> 2] | 0; + if ($518 >>> 0 < $520 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($518, $18); + HEAP32[$517 >> 2] = (HEAP32[$517 >> 2] | 0) + 24; + } else { + $527 = HEAP32[$db >> 2] | 0; + $528 = $518 - $527 | 0; + $529 = ($528 | 0) / 24 | 0; + $530 = $529 + 1 | 0; + if (($528 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $534 = ($520 - $527 | 0) / 24 | 0; + if ($534 >>> 0 < 1073741823) { + $536 = $534 << 1; + $$0$i$i$i93 = $536 >>> 0 < $530 >>> 0 ? $530 : $536; + } else $$0$i$i$i93 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i142, $$0$i$i$i93, $529, $db + 12 | 0); + $539 = $__v$i$i142 + 8 | 0; + $540 = HEAP32[$539 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($540, $18); + HEAP32[$539 >> 2] = $540 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i142); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i142); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($18); + $$0 = $first + 1 | 0; + break L1; + break; + } + case 103: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj11EEERAT__Kc($19, 14302); + $543 = $db + 4 | 0; + $544 = HEAP32[$543 >> 2] | 0; + $546 = HEAP32[$db + 8 >> 2] | 0; + if ($544 >>> 0 < $546 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($544, $19); + HEAP32[$543 >> 2] = (HEAP32[$543 >> 2] | 0) + 24; + } else { + $553 = HEAP32[$db >> 2] | 0; + $554 = $544 - $553 | 0; + $555 = ($554 | 0) / 24 | 0; + $556 = $555 + 1 | 0; + if (($554 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $560 = ($546 - $553 | 0) / 24 | 0; + if ($560 >>> 0 < 1073741823) { + $562 = $560 << 1; + $$0$i$i$i98 = $562 >>> 0 < $556 >>> 0 ? $556 : $562; + } else $$0$i$i$i98 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i142, $$0$i$i$i98, $555, $db + 12 | 0); + $565 = $__v$i$i142 + 8 | 0; + $566 = HEAP32[$565 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($566, $19); + HEAP32[$565 >> 2] = $566 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i142); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i142); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($19); + $$0 = $first + 1 | 0; + break L1; + break; + } + case 122: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj4EEERAT__Kc($20, 14313); + $569 = $db + 4 | 0; + $570 = HEAP32[$569 >> 2] | 0; + $572 = HEAP32[$db + 8 >> 2] | 0; + if ($570 >>> 0 < $572 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($570, $20); + HEAP32[$569 >> 2] = (HEAP32[$569 >> 2] | 0) + 24; + } else { + $579 = HEAP32[$db >> 2] | 0; + $580 = $570 - $579 | 0; + $581 = ($580 | 0) / 24 | 0; + $582 = $581 + 1 | 0; + if (($580 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $586 = ($572 - $579 | 0) / 24 | 0; + if ($586 >>> 0 < 1073741823) { + $588 = $586 << 1; + $$0$i$i$i103 = $588 >>> 0 < $582 >>> 0 ? $582 : $588; + } else $$0$i$i$i103 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i142, $$0$i$i$i103, $581, $db + 12 | 0); + $591 = $__v$i$i142 + 8 | 0; + $592 = HEAP32[$591 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($592, $20); + HEAP32[$591 >> 2] = $592 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i142); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i142); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($20); + $$0 = $first + 1 | 0; + break L1; + break; + } + case 117: + { + $595 = $first + 1 | 0; + $596 = __ZN10__cxxabiv112_GLOBAL__N_117parse_source_nameINS0_2DbEEEPKcS4_S4_RT_($595, $last, $db) | 0; + STACKTOP = sp; + return (($596 | 0) == ($595 | 0) ? $first : $596) | 0; + } + case 68: + { + $598 = $first + 1 | 0; + if (($598 | 0) == ($last | 0)) { + $$0 = $first; + break L1; + } + switch (HEAP8[$598 >> 0] | 0) { + case 100: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj10EEERAT__Kc($21, 14317); + $602 = $db + 4 | 0; + $603 = HEAP32[$602 >> 2] | 0; + $605 = HEAP32[$db + 8 >> 2] | 0; + if ($603 >>> 0 < $605 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($603, $21); + HEAP32[$602 >> 2] = (HEAP32[$602 >> 2] | 0) + 24; + } else { + $612 = HEAP32[$db >> 2] | 0; + $613 = $603 - $612 | 0; + $614 = ($613 | 0) / 24 | 0; + $615 = $614 + 1 | 0; + if (($613 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $619 = ($605 - $612 | 0) / 24 | 0; + if ($619 >>> 0 < 1073741823) { + $621 = $619 << 1; + $$0$i$i$i108 = $621 >>> 0 < $615 >>> 0 ? $615 : $621; + } else $$0$i$i$i108 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i142, $$0$i$i$i108, $614, $db + 12 | 0); + $624 = $__v$i$i142 + 8 | 0; + $625 = HEAP32[$624 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($625, $21); + HEAP32[$624 >> 2] = $625 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i142); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i142); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($21); + $$0 = $first + 2 | 0; + break L1; + break; + } + case 101: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj11EEERAT__Kc($22, 14327); + $628 = $db + 4 | 0; + $629 = HEAP32[$628 >> 2] | 0; + $631 = HEAP32[$db + 8 >> 2] | 0; + if ($629 >>> 0 < $631 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($629, $22); + HEAP32[$628 >> 2] = (HEAP32[$628 >> 2] | 0) + 24; + } else { + $638 = HEAP32[$db >> 2] | 0; + $639 = $629 - $638 | 0; + $640 = ($639 | 0) / 24 | 0; + $641 = $640 + 1 | 0; + if (($639 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $645 = ($631 - $638 | 0) / 24 | 0; + if ($645 >>> 0 < 1073741823) { + $647 = $645 << 1; + $$0$i$i$i113 = $647 >>> 0 < $641 >>> 0 ? $641 : $647; + } else $$0$i$i$i113 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i142, $$0$i$i$i113, $640, $db + 12 | 0); + $650 = $__v$i$i142 + 8 | 0; + $651 = HEAP32[$650 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($651, $22); + HEAP32[$650 >> 2] = $651 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i142); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i142); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($22); + $$0 = $first + 2 | 0; + break L1; + break; + } + case 102: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj10EEERAT__Kc($23, 14338); + $654 = $db + 4 | 0; + $655 = HEAP32[$654 >> 2] | 0; + $657 = HEAP32[$db + 8 >> 2] | 0; + if ($655 >>> 0 < $657 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($655, $23); + HEAP32[$654 >> 2] = (HEAP32[$654 >> 2] | 0) + 24; + } else { + $664 = HEAP32[$db >> 2] | 0; + $665 = $655 - $664 | 0; + $666 = ($665 | 0) / 24 | 0; + $667 = $666 + 1 | 0; + if (($665 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $671 = ($657 - $664 | 0) / 24 | 0; + if ($671 >>> 0 < 1073741823) { + $673 = $671 << 1; + $$0$i$i$i118 = $673 >>> 0 < $667 >>> 0 ? $667 : $673; + } else $$0$i$i$i118 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i142, $$0$i$i$i118, $666, $db + 12 | 0); + $676 = $__v$i$i142 + 8 | 0; + $677 = HEAP32[$676 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($677, $23); + HEAP32[$676 >> 2] = $677 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i142); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i142); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($23); + $$0 = $first + 2 | 0; + break L1; + break; + } + case 104: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj10EEERAT__Kc($24, 14348); + $680 = $db + 4 | 0; + $681 = HEAP32[$680 >> 2] | 0; + $683 = HEAP32[$db + 8 >> 2] | 0; + if ($681 >>> 0 < $683 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($681, $24); + HEAP32[$680 >> 2] = (HEAP32[$680 >> 2] | 0) + 24; + } else { + $690 = HEAP32[$db >> 2] | 0; + $691 = $681 - $690 | 0; + $692 = ($691 | 0) / 24 | 0; + $693 = $692 + 1 | 0; + if (($691 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $697 = ($683 - $690 | 0) / 24 | 0; + if ($697 >>> 0 < 1073741823) { + $699 = $697 << 1; + $$0$i$i$i123 = $699 >>> 0 < $693 >>> 0 ? $693 : $699; + } else $$0$i$i$i123 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i142, $$0$i$i$i123, $692, $db + 12 | 0); + $702 = $__v$i$i142 + 8 | 0; + $703 = HEAP32[$702 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($703, $24); + HEAP32[$702 >> 2] = $703 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i142); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i142); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($24); + $$0 = $first + 2 | 0; + break L1; + break; + } + case 105: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj9EEERAT__Kc($25, 14358); + $706 = $db + 4 | 0; + $707 = HEAP32[$706 >> 2] | 0; + $709 = HEAP32[$db + 8 >> 2] | 0; + if ($707 >>> 0 < $709 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($707, $25); + HEAP32[$706 >> 2] = (HEAP32[$706 >> 2] | 0) + 24; + } else { + $716 = HEAP32[$db >> 2] | 0; + $717 = $707 - $716 | 0; + $718 = ($717 | 0) / 24 | 0; + $719 = $718 + 1 | 0; + if (($717 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $723 = ($709 - $716 | 0) / 24 | 0; + if ($723 >>> 0 < 1073741823) { + $725 = $723 << 1; + $$0$i$i$i128 = $725 >>> 0 < $719 >>> 0 ? $719 : $725; + } else $$0$i$i$i128 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i142, $$0$i$i$i128, $718, $db + 12 | 0); + $728 = $__v$i$i142 + 8 | 0; + $729 = HEAP32[$728 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($729, $25); + HEAP32[$728 >> 2] = $729 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i142); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i142); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($25); + $$0 = $first + 2 | 0; + break L1; + break; + } + case 115: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj9EEERAT__Kc($26, 14367); + $732 = $db + 4 | 0; + $733 = HEAP32[$732 >> 2] | 0; + $735 = HEAP32[$db + 8 >> 2] | 0; + if ($733 >>> 0 < $735 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($733, $26); + HEAP32[$732 >> 2] = (HEAP32[$732 >> 2] | 0) + 24; + } else { + $742 = HEAP32[$db >> 2] | 0; + $743 = $733 - $742 | 0; + $744 = ($743 | 0) / 24 | 0; + $745 = $744 + 1 | 0; + if (($743 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $749 = ($735 - $742 | 0) / 24 | 0; + if ($749 >>> 0 < 1073741823) { + $751 = $749 << 1; + $$0$i$i$i133 = $751 >>> 0 < $745 >>> 0 ? $745 : $751; + } else $$0$i$i$i133 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i142, $$0$i$i$i133, $744, $db + 12 | 0); + $754 = $__v$i$i142 + 8 | 0; + $755 = HEAP32[$754 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($755, $26); + HEAP32[$754 >> 2] = $755 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i142); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i142); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($26); + $$0 = $first + 2 | 0; + break L1; + break; + } + case 97: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj5EEERAT__Kc($27, 14376); + $758 = $db + 4 | 0; + $759 = HEAP32[$758 >> 2] | 0; + $761 = HEAP32[$db + 8 >> 2] | 0; + if ($759 >>> 0 < $761 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($759, $27); + HEAP32[$758 >> 2] = (HEAP32[$758 >> 2] | 0) + 24; + } else { + $768 = HEAP32[$db >> 2] | 0; + $769 = $759 - $768 | 0; + $770 = ($769 | 0) / 24 | 0; + $771 = $770 + 1 | 0; + if (($769 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $775 = ($761 - $768 | 0) / 24 | 0; + if ($775 >>> 0 < 1073741823) { + $777 = $775 << 1; + $$0$i$i$i138 = $777 >>> 0 < $771 >>> 0 ? $771 : $777; + } else $$0$i$i$i138 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i142, $$0$i$i$i138, $770, $db + 12 | 0); + $780 = $__v$i$i142 + 8 | 0; + $781 = HEAP32[$780 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($781, $27); + HEAP32[$780 >> 2] = $781 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i142); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i142); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($27); + $$0 = $first + 2 | 0; + break L1; + break; + } + case 110: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj15EEERAT__Kc($28, 14381); + $784 = $db + 4 | 0; + $785 = HEAP32[$784 >> 2] | 0; + $787 = HEAP32[$db + 8 >> 2] | 0; + if ($785 >>> 0 < $787 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($785, $28); + HEAP32[$784 >> 2] = (HEAP32[$784 >> 2] | 0) + 24; + } else { + $794 = HEAP32[$db >> 2] | 0; + $795 = $785 - $794 | 0; + $796 = ($795 | 0) / 24 | 0; + $797 = $796 + 1 | 0; + if (($795 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $801 = ($787 - $794 | 0) / 24 | 0; + if ($801 >>> 0 < 1073741823) { + $803 = $801 << 1; + $$0$i$i$i143 = $803 >>> 0 < $797 >>> 0 ? $797 : $803; + } else $$0$i$i$i143 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i142, $$0$i$i$i143, $796, $db + 12 | 0); + $806 = $__v$i$i142 + 8 | 0; + $807 = HEAP32[$806 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($807, $28); + HEAP32[$806 >> 2] = $807 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i142); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i142); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($28); + $$0 = $first + 2 | 0; + break L1; + break; + } + default: + { + $$0 = $first; + break L1; + } + } + break; + } + default: + { + $$0 = $first; + break L1; + } + } while (0); while (0); + STACKTOP = sp; + return $$0 | 0; +} + +function _malloc($bytes) { + $bytes = $bytes | 0; + var $$3$i = 0, $$lcssa = 0, $$lcssa211 = 0, $$lcssa215 = 0, $$lcssa216 = 0, $$lcssa217 = 0, $$lcssa219 = 0, $$lcssa222 = 0, $$lcssa224 = 0, $$lcssa226 = 0, $$lcssa228 = 0, $$lcssa230 = 0, $$lcssa232 = 0, $$pre$phi$i$iZ2D = 0, $$pre$phi$i23$iZ2D = 0, $$pre$phi$i26Z2D = 0, $$pre$phi$iZ2D = 0, $$pre$phi58$i$iZ2D = 0, $$pre$phiZ2D = 0, $$rsize$3$i = 0, $$sum$i19$i = 0, $$sum2$i21$i = 0, $$sum3132$i$i = 0, $$sum67$i$i = 0, $100 = 0, $1000 = 0, $1002 = 0, $1005 = 0, $1010 = 0, $1016 = 0, $1019 = 0, $1020 = 0, $1027 = 0, $1039 = 0, $1044 = 0, $1051 = 0, $1052 = 0, $1053 = 0, $106 = 0, $1060 = 0, $1062 = 0, $1063 = 0, $1070 = 0, $110 = 0, $112 = 0, $113 = 0, $115 = 0, $117 = 0, $119 = 0, $12 = 0, $121 = 0, $123 = 0, $125 = 0, $127 = 0, $13 = 0, $132 = 0, $138 = 0, $14 = 0, $141 = 0, $144 = 0, $147 = 0, $148 = 0, $149 = 0, $15 = 0, $151 = 0, $154 = 0, $156 = 0, $159 = 0, $16 = 0, $161 = 0, $164 = 0, $167 = 0, $168 = 0, $17 = 0, $170 = 0, $171 = 0, $173 = 0, $174 = 0, $176 = 0, $177 = 0, $18 = 0, $182 = 0, $183 = 0, $192 = 0, $197 = 0, $201 = 0, $207 = 0, $214 = 0, $217 = 0, $225 = 0, $227 = 0, $228 = 0, $229 = 0, $230 = 0, $231 = 0, $232 = 0, $236 = 0, $237 = 0, $245 = 0, $246 = 0, $247 = 0, $249 = 0, $25 = 0, $250 = 0, $255 = 0, $256 = 0, $259 = 0, $261 = 0, $264 = 0, $269 = 0, $276 = 0, $28 = 0, $285 = 0, $286 = 0, $290 = 0, $300 = 0, $303 = 0, $307 = 0, $309 = 0, $31 = 0, $310 = 0, $312 = 0, $314 = 0, $316 = 0, $318 = 0, $320 = 0, $322 = 0, $324 = 0, $334 = 0, $335 = 0, $337 = 0, $34 = 0, $346 = 0, $348 = 0, $351 = 0, $353 = 0, $356 = 0, $358 = 0, $361 = 0, $364 = 0, $365 = 0, $367 = 0, $368 = 0, $370 = 0, $371 = 0, $373 = 0, $374 = 0, $379 = 0, $38 = 0, $380 = 0, $389 = 0, $394 = 0, $398 = 0, $4 = 0, $404 = 0, $41 = 0, $411 = 0, $414 = 0, $422 = 0, $424 = 0, $425 = 0, $426 = 0, $427 = 0, $431 = 0, $432 = 0, $438 = 0, $44 = 0, $443 = 0, $444 = 0, $447 = 0, $449 = 0, $452 = 0, $457 = 0, $46 = 0, $463 = 0, $467 = 0, $468 = 0, $47 = 0, $475 = 0, $487 = 0, $49 = 0, $492 = 0, $499 = 0, $5 = 0, $500 = 0, $501 = 0, $509 = 0, $51 = 0, $511 = 0, $512 = 0, $522 = 0, $526 = 0, $528 = 0, $529 = 0, $53 = 0, $538 = 0, $544 = 0, $545 = 0, $546 = 0, $547 = 0, $548 = 0, $549 = 0, $55 = 0, $550 = 0, $552 = 0, $554 = 0, $555 = 0, $561 = 0, $563 = 0, $565 = 0, $57 = 0, $572 = 0, $574 = 0, $575 = 0, $576 = 0, $584 = 0, $585 = 0, $588 = 0, $59 = 0, $592 = 0, $593 = 0, $596 = 0, $598 = 0, $6 = 0, $602 = 0, $604 = 0, $608 = 0, $61 = 0, $612 = 0, $621 = 0, $622 = 0, $628 = 0, $630 = 0, $632 = 0, $635 = 0, $637 = 0, $64 = 0, $641 = 0, $642 = 0, $648 = 0, $65 = 0, $653 = 0, $655 = 0, $66 = 0, $660 = 0, $661 = 0, $662 = 0, $67 = 0, $676 = 0, $678 = 0, $68 = 0, $683 = 0, $685 = 0, $69 = 0, $690 = 0, $692 = 0, $7 = 0, $70 = 0, $702 = 0, $706 = 0, $711 = 0, $714 = 0, $719 = 0, $720 = 0, $724 = 0, $725 = 0, $730 = 0, $736 = 0, $741 = 0, $744 = 0, $745 = 0, $748 = 0, $750 = 0, $752 = 0, $755 = 0, $766 = 0, $77 = 0, $771 = 0, $773 = 0, $776 = 0, $778 = 0, $781 = 0, $784 = 0, $785 = 0, $787 = 0, $788 = 0, $790 = 0, $791 = 0, $793 = 0, $794 = 0, $799 = 0, $80 = 0, $800 = 0, $809 = 0, $81 = 0, $814 = 0, $818 = 0, $824 = 0, $832 = 0, $838 = 0, $84 = 0, $840 = 0, $841 = 0, $842 = 0, $843 = 0, $847 = 0, $848 = 0, $854 = 0, $859 = 0, $860 = 0, $863 = 0, $865 = 0, $868 = 0, $873 = 0, $879 = 0, $883 = 0, $884 = 0, $89 = 0, $891 = 0, $90 = 0, $903 = 0, $908 = 0, $91 = 0, $915 = 0, $916 = 0, $917 = 0, $92 = 0, $925 = 0, $928 = 0, $929 = 0, $93 = 0, $934 = 0, $94 = 0, $940 = 0, $941 = 0, $943 = 0, $944 = 0, $947 = 0, $95 = 0, $952 = 0, $954 = 0, $959 = 0, $960 = 0, $964 = 0, $970 = 0, $975 = 0, $977 = 0, $978 = 0, $979 = 0, $980 = 0, $984 = 0, $985 = 0, $99 = 0, $991 = 0, $996 = 0, $997 = 0, $F$0$i$i = 0, $F1$0$i = 0, $F4$0 = 0, $F4$0$i$i = 0, $F5$0$i = 0, $I1$0$i$i = 0, $I7$0$i = 0, $I7$0$i$i = 0, $K12$029$i = 0, $K2$07$i$i = 0, $K8$051$i$i = 0, $R$0$i = 0, $R$0$i$i = 0, $R$0$i$i$lcssa = 0, $R$0$i$lcssa = 0, $R$0$i18 = 0, $R$0$i18$lcssa = 0, $R$1$i = 0, $R$1$i$i = 0, $R$1$i20 = 0, $RP$0$i = 0, $RP$0$i$i = 0, $RP$0$i$i$lcssa = 0, $RP$0$i$lcssa = 0, $RP$0$i17 = 0, $RP$0$i17$lcssa = 0, $T$0$lcssa$i = 0, $T$0$lcssa$i$i = 0, $T$0$lcssa$i25$i = 0, $T$028$i = 0, $T$028$i$lcssa = 0, $T$050$i$i = 0, $T$050$i$i$lcssa = 0, $T$06$i$i = 0, $T$06$i$i$lcssa = 0, $br$0$ph$i = 0, $i$02$i$i = 0, $idx$0$i = 0, $mem$0 = 0, $nb$0 = 0, $oldfirst$0$i$i = 0, $qsize$0$i$i = 0, $rsize$0$i = 0, $rsize$0$i$lcssa = 0, $rsize$0$i15 = 0, $rsize$1$i = 0, $rsize$2$i = 0, $rsize$3$lcssa$i = 0, $rsize$331$i = 0, $rst$0$i = 0, $rst$1$i = 0, $sizebits$0$i = 0, $sp$0$i$i = 0, $sp$0$i$i$i = 0, $sp$084$i = 0, $sp$084$i$lcssa = 0, $sp$183$i = 0, $sp$183$i$lcssa = 0, $ssize$0$$i = 0, $ssize$0$i = 0, $ssize$1$ph$i = 0, $ssize$2$i = 0, $t$0$i = 0, $t$0$i14 = 0, $t$1$i = 0, $t$2$ph$i = 0, $t$2$v$3$i = 0, $t$230$i = 0, $tbase$255$i = 0, $tsize$0$ph$i = 0, $tsize$0323944$i = 0, $tsize$1$i = 0, $tsize$254$i = 0, $v$0$i = 0, $v$0$i$lcssa = 0, $v$0$i16 = 0, $v$1$i = 0, $v$2$i = 0, $v$3$lcssa$i = 0, $v$3$ph$i = 0, $v$332$i = 0, label = 0, $964$looptemp = 0; + do if ($bytes >>> 0 < 245) { + $4 = $bytes >>> 0 < 11 ? 16 : $bytes + 11 & -8; + $5 = $4 >>> 3; + $6 = HEAP32[756] | 0; + $7 = $6 >>> $5; + if ($7 & 3) { + $12 = ($7 & 1 ^ 1) + $5 | 0; + $13 = $12 << 1; + $14 = 3064 + ($13 << 2) | 0; + $15 = 3064 + ($13 + 2 << 2) | 0; + $16 = HEAP32[$15 >> 2] | 0; + $17 = $16 + 8 | 0; + $18 = HEAP32[$17 >> 2] | 0; + do if (($14 | 0) == ($18 | 0)) HEAP32[756] = $6 & ~(1 << $12); else { + if ($18 >>> 0 < (HEAP32[760] | 0) >>> 0) _abort(); + $25 = $18 + 12 | 0; + if ((HEAP32[$25 >> 2] | 0) == ($16 | 0)) { + HEAP32[$25 >> 2] = $14; + HEAP32[$15 >> 2] = $18; + break; + } else _abort(); + } while (0); + $28 = $12 << 3; + HEAP32[$16 + 4 >> 2] = $28 | 3; + $31 = $16 + ($28 | 4) | 0; + HEAP32[$31 >> 2] = HEAP32[$31 >> 2] | 1; + $mem$0 = $17; + return $mem$0 | 0; + } + $34 = HEAP32[758] | 0; + if ($4 >>> 0 > $34 >>> 0) { + if ($7) { + $38 = 2 << $5; + $41 = $7 << $5 & ($38 | 0 - $38); + $44 = ($41 & 0 - $41) + -1 | 0; + $46 = $44 >>> 12 & 16; + $47 = $44 >>> $46; + $49 = $47 >>> 5 & 8; + $51 = $47 >>> $49; + $53 = $51 >>> 2 & 4; + $55 = $51 >>> $53; + $57 = $55 >>> 1 & 2; + $59 = $55 >>> $57; + $61 = $59 >>> 1 & 1; + $64 = ($49 | $46 | $53 | $57 | $61) + ($59 >>> $61) | 0; + $65 = $64 << 1; + $66 = 3064 + ($65 << 2) | 0; + $67 = 3064 + ($65 + 2 << 2) | 0; + $68 = HEAP32[$67 >> 2] | 0; + $69 = $68 + 8 | 0; + $70 = HEAP32[$69 >> 2] | 0; + do if (($66 | 0) == ($70 | 0)) { + HEAP32[756] = $6 & ~(1 << $64); + $89 = $34; + } else { + if ($70 >>> 0 < (HEAP32[760] | 0) >>> 0) _abort(); + $77 = $70 + 12 | 0; + if ((HEAP32[$77 >> 2] | 0) == ($68 | 0)) { + HEAP32[$77 >> 2] = $66; + HEAP32[$67 >> 2] = $70; + $89 = HEAP32[758] | 0; + break; + } else _abort(); + } while (0); + $80 = $64 << 3; + $81 = $80 - $4 | 0; + HEAP32[$68 + 4 >> 2] = $4 | 3; + $84 = $68 + $4 | 0; + HEAP32[$68 + ($4 | 4) >> 2] = $81 | 1; + HEAP32[$68 + $80 >> 2] = $81; + if ($89) { + $90 = HEAP32[761] | 0; + $91 = $89 >>> 3; + $92 = $91 << 1; + $93 = 3064 + ($92 << 2) | 0; + $94 = HEAP32[756] | 0; + $95 = 1 << $91; + if (!($94 & $95)) { + HEAP32[756] = $94 | $95; + $$pre$phiZ2D = 3064 + ($92 + 2 << 2) | 0; + $F4$0 = $93; + } else { + $99 = 3064 + ($92 + 2 << 2) | 0; + $100 = HEAP32[$99 >> 2] | 0; + if ($100 >>> 0 < (HEAP32[760] | 0) >>> 0) _abort(); else { + $$pre$phiZ2D = $99; + $F4$0 = $100; + } + } + HEAP32[$$pre$phiZ2D >> 2] = $90; + HEAP32[$F4$0 + 12 >> 2] = $90; + HEAP32[$90 + 8 >> 2] = $F4$0; + HEAP32[$90 + 12 >> 2] = $93; + } + HEAP32[758] = $81; + HEAP32[761] = $84; + $mem$0 = $69; + return $mem$0 | 0; + } + $106 = HEAP32[757] | 0; + if (!$106) $nb$0 = $4; else { + $110 = ($106 & 0 - $106) + -1 | 0; + $112 = $110 >>> 12 & 16; + $113 = $110 >>> $112; + $115 = $113 >>> 5 & 8; + $117 = $113 >>> $115; + $119 = $117 >>> 2 & 4; + $121 = $117 >>> $119; + $123 = $121 >>> 1 & 2; + $125 = $121 >>> $123; + $127 = $125 >>> 1 & 1; + $132 = HEAP32[3328 + (($115 | $112 | $119 | $123 | $127) + ($125 >>> $127) << 2) >> 2] | 0; + $rsize$0$i = (HEAP32[$132 + 4 >> 2] & -8) - $4 | 0; + $t$0$i = $132; + $v$0$i = $132; + while (1) { + $138 = HEAP32[$t$0$i + 16 >> 2] | 0; + if (!$138) { + $141 = HEAP32[$t$0$i + 20 >> 2] | 0; + if (!$141) { + $rsize$0$i$lcssa = $rsize$0$i; + $v$0$i$lcssa = $v$0$i; + break; + } else $144 = $141; + } else $144 = $138; + $147 = (HEAP32[$144 + 4 >> 2] & -8) - $4 | 0; + $148 = $147 >>> 0 < $rsize$0$i >>> 0; + $rsize$0$i = $148 ? $147 : $rsize$0$i; + $t$0$i = $144; + $v$0$i = $148 ? $144 : $v$0$i; + } + $149 = HEAP32[760] | 0; + if ($v$0$i$lcssa >>> 0 < $149 >>> 0) _abort(); + $151 = $v$0$i$lcssa + $4 | 0; + if ($v$0$i$lcssa >>> 0 >= $151 >>> 0) _abort(); + $154 = HEAP32[$v$0$i$lcssa + 24 >> 2] | 0; + $156 = HEAP32[$v$0$i$lcssa + 12 >> 2] | 0; + do if (($156 | 0) == ($v$0$i$lcssa | 0)) { + $167 = $v$0$i$lcssa + 20 | 0; + $168 = HEAP32[$167 >> 2] | 0; + if (!$168) { + $170 = $v$0$i$lcssa + 16 | 0; + $171 = HEAP32[$170 >> 2] | 0; + if (!$171) { + $R$1$i = 0; + break; + } else { + $R$0$i = $171; + $RP$0$i = $170; + } + } else { + $R$0$i = $168; + $RP$0$i = $167; + } + while (1) { + $173 = $R$0$i + 20 | 0; + $174 = HEAP32[$173 >> 2] | 0; + if ($174) { + $R$0$i = $174; + $RP$0$i = $173; + continue; + } + $176 = $R$0$i + 16 | 0; + $177 = HEAP32[$176 >> 2] | 0; + if (!$177) { + $R$0$i$lcssa = $R$0$i; + $RP$0$i$lcssa = $RP$0$i; + break; + } else { + $R$0$i = $177; + $RP$0$i = $176; + } + } + if ($RP$0$i$lcssa >>> 0 < $149 >>> 0) _abort(); else { + HEAP32[$RP$0$i$lcssa >> 2] = 0; + $R$1$i = $R$0$i$lcssa; + break; + } + } else { + $159 = HEAP32[$v$0$i$lcssa + 8 >> 2] | 0; + if ($159 >>> 0 < $149 >>> 0) _abort(); + $161 = $159 + 12 | 0; + if ((HEAP32[$161 >> 2] | 0) != ($v$0$i$lcssa | 0)) _abort(); + $164 = $156 + 8 | 0; + if ((HEAP32[$164 >> 2] | 0) == ($v$0$i$lcssa | 0)) { + HEAP32[$161 >> 2] = $156; + HEAP32[$164 >> 2] = $159; + $R$1$i = $156; + break; + } else _abort(); + } while (0); + do if ($154) { + $182 = HEAP32[$v$0$i$lcssa + 28 >> 2] | 0; + $183 = 3328 + ($182 << 2) | 0; + if (($v$0$i$lcssa | 0) == (HEAP32[$183 >> 2] | 0)) { + HEAP32[$183 >> 2] = $R$1$i; + if (!$R$1$i) { + HEAP32[757] = HEAP32[757] & ~(1 << $182); + break; + } + } else { + if ($154 >>> 0 < (HEAP32[760] | 0) >>> 0) _abort(); + $192 = $154 + 16 | 0; + if ((HEAP32[$192 >> 2] | 0) == ($v$0$i$lcssa | 0)) HEAP32[$192 >> 2] = $R$1$i; else HEAP32[$154 + 20 >> 2] = $R$1$i; + if (!$R$1$i) break; + } + $197 = HEAP32[760] | 0; + if ($R$1$i >>> 0 < $197 >>> 0) _abort(); + HEAP32[$R$1$i + 24 >> 2] = $154; + $201 = HEAP32[$v$0$i$lcssa + 16 >> 2] | 0; + do if ($201) if ($201 >>> 0 < $197 >>> 0) _abort(); else { + HEAP32[$R$1$i + 16 >> 2] = $201; + HEAP32[$201 + 24 >> 2] = $R$1$i; + break; + } while (0); + $207 = HEAP32[$v$0$i$lcssa + 20 >> 2] | 0; + if ($207) if ($207 >>> 0 < (HEAP32[760] | 0) >>> 0) _abort(); else { + HEAP32[$R$1$i + 20 >> 2] = $207; + HEAP32[$207 + 24 >> 2] = $R$1$i; + break; + } + } while (0); + if ($rsize$0$i$lcssa >>> 0 < 16) { + $214 = $rsize$0$i$lcssa + $4 | 0; + HEAP32[$v$0$i$lcssa + 4 >> 2] = $214 | 3; + $217 = $v$0$i$lcssa + ($214 + 4) | 0; + HEAP32[$217 >> 2] = HEAP32[$217 >> 2] | 1; + } else { + HEAP32[$v$0$i$lcssa + 4 >> 2] = $4 | 3; + HEAP32[$v$0$i$lcssa + ($4 | 4) >> 2] = $rsize$0$i$lcssa | 1; + HEAP32[$v$0$i$lcssa + ($rsize$0$i$lcssa + $4) >> 2] = $rsize$0$i$lcssa; + $225 = HEAP32[758] | 0; + if ($225) { + $227 = HEAP32[761] | 0; + $228 = $225 >>> 3; + $229 = $228 << 1; + $230 = 3064 + ($229 << 2) | 0; + $231 = HEAP32[756] | 0; + $232 = 1 << $228; + if (!($231 & $232)) { + HEAP32[756] = $231 | $232; + $$pre$phi$iZ2D = 3064 + ($229 + 2 << 2) | 0; + $F1$0$i = $230; + } else { + $236 = 3064 + ($229 + 2 << 2) | 0; + $237 = HEAP32[$236 >> 2] | 0; + if ($237 >>> 0 < (HEAP32[760] | 0) >>> 0) _abort(); else { + $$pre$phi$iZ2D = $236; + $F1$0$i = $237; + } + } + HEAP32[$$pre$phi$iZ2D >> 2] = $227; + HEAP32[$F1$0$i + 12 >> 2] = $227; + HEAP32[$227 + 8 >> 2] = $F1$0$i; + HEAP32[$227 + 12 >> 2] = $230; + } + HEAP32[758] = $rsize$0$i$lcssa; + HEAP32[761] = $151; + } + $mem$0 = $v$0$i$lcssa + 8 | 0; + return $mem$0 | 0; + } + } else $nb$0 = $4; + } else if ($bytes >>> 0 > 4294967231) $nb$0 = -1; else { + $245 = $bytes + 11 | 0; + $246 = $245 & -8; + $247 = HEAP32[757] | 0; + if (!$247) $nb$0 = $246; else { + $249 = 0 - $246 | 0; + $250 = $245 >>> 8; + if (!$250) $idx$0$i = 0; else if ($246 >>> 0 > 16777215) $idx$0$i = 31; else { + $255 = ($250 + 1048320 | 0) >>> 16 & 8; + $256 = $250 << $255; + $259 = ($256 + 520192 | 0) >>> 16 & 4; + $261 = $256 << $259; + $264 = ($261 + 245760 | 0) >>> 16 & 2; + $269 = 14 - ($259 | $255 | $264) + ($261 << $264 >>> 15) | 0; + $idx$0$i = $246 >>> ($269 + 7 | 0) & 1 | $269 << 1; + } + $276 = HEAP32[3328 + ($idx$0$i << 2) >> 2] | 0; + L123 : do if (!$276) { + $rsize$2$i = $249; + $t$1$i = 0; + $v$2$i = 0; + label = 86; + } else { + $rsize$0$i15 = $249; + $rst$0$i = 0; + $sizebits$0$i = $246 << (($idx$0$i | 0) == 31 ? 0 : 25 - ($idx$0$i >>> 1) | 0); + $t$0$i14 = $276; + $v$0$i16 = 0; + while (1) { + $285 = HEAP32[$t$0$i14 + 4 >> 2] & -8; + $286 = $285 - $246 | 0; + if ($286 >>> 0 < $rsize$0$i15 >>> 0) if (($285 | 0) == ($246 | 0)) { + $rsize$331$i = $286; + $t$230$i = $t$0$i14; + $v$332$i = $t$0$i14; + label = 90; + break L123; + } else { + $rsize$1$i = $286; + $v$1$i = $t$0$i14; + } else { + $rsize$1$i = $rsize$0$i15; + $v$1$i = $v$0$i16; + } + $290 = HEAP32[$t$0$i14 + 20 >> 2] | 0; + $t$0$i14 = HEAP32[$t$0$i14 + 16 + ($sizebits$0$i >>> 31 << 2) >> 2] | 0; + $rst$1$i = ($290 | 0) == 0 | ($290 | 0) == ($t$0$i14 | 0) ? $rst$0$i : $290; + if (!$t$0$i14) { + $rsize$2$i = $rsize$1$i; + $t$1$i = $rst$1$i; + $v$2$i = $v$1$i; + label = 86; + break; + } else { + $rsize$0$i15 = $rsize$1$i; + $rst$0$i = $rst$1$i; + $sizebits$0$i = $sizebits$0$i << 1; + $v$0$i16 = $v$1$i; + } + } + } while (0); + if ((label | 0) == 86) { + if (($t$1$i | 0) == 0 & ($v$2$i | 0) == 0) { + $300 = 2 << $idx$0$i; + $303 = $247 & ($300 | 0 - $300); + if (!$303) { + $nb$0 = $246; + break; + } + $307 = ($303 & 0 - $303) + -1 | 0; + $309 = $307 >>> 12 & 16; + $310 = $307 >>> $309; + $312 = $310 >>> 5 & 8; + $314 = $310 >>> $312; + $316 = $314 >>> 2 & 4; + $318 = $314 >>> $316; + $320 = $318 >>> 1 & 2; + $322 = $318 >>> $320; + $324 = $322 >>> 1 & 1; + $t$2$ph$i = HEAP32[3328 + (($312 | $309 | $316 | $320 | $324) + ($322 >>> $324) << 2) >> 2] | 0; + $v$3$ph$i = 0; + } else { + $t$2$ph$i = $t$1$i; + $v$3$ph$i = $v$2$i; + } + if (!$t$2$ph$i) { + $rsize$3$lcssa$i = $rsize$2$i; + $v$3$lcssa$i = $v$3$ph$i; + } else { + $rsize$331$i = $rsize$2$i; + $t$230$i = $t$2$ph$i; + $v$332$i = $v$3$ph$i; + label = 90; + } + } + if ((label | 0) == 90) while (1) { + label = 0; + $334 = (HEAP32[$t$230$i + 4 >> 2] & -8) - $246 | 0; + $335 = $334 >>> 0 < $rsize$331$i >>> 0; + $$rsize$3$i = $335 ? $334 : $rsize$331$i; + $t$2$v$3$i = $335 ? $t$230$i : $v$332$i; + $337 = HEAP32[$t$230$i + 16 >> 2] | 0; + if ($337) { + $rsize$331$i = $$rsize$3$i; + $t$230$i = $337; + $v$332$i = $t$2$v$3$i; + label = 90; + continue; + } + $t$230$i = HEAP32[$t$230$i + 20 >> 2] | 0; + if (!$t$230$i) { + $rsize$3$lcssa$i = $$rsize$3$i; + $v$3$lcssa$i = $t$2$v$3$i; + break; + } else { + $rsize$331$i = $$rsize$3$i; + $v$332$i = $t$2$v$3$i; + label = 90; + } + } + if (!$v$3$lcssa$i) $nb$0 = $246; else if ($rsize$3$lcssa$i >>> 0 < ((HEAP32[758] | 0) - $246 | 0) >>> 0) { + $346 = HEAP32[760] | 0; + if ($v$3$lcssa$i >>> 0 < $346 >>> 0) _abort(); + $348 = $v$3$lcssa$i + $246 | 0; + if ($v$3$lcssa$i >>> 0 >= $348 >>> 0) _abort(); + $351 = HEAP32[$v$3$lcssa$i + 24 >> 2] | 0; + $353 = HEAP32[$v$3$lcssa$i + 12 >> 2] | 0; + do if (($353 | 0) == ($v$3$lcssa$i | 0)) { + $364 = $v$3$lcssa$i + 20 | 0; + $365 = HEAP32[$364 >> 2] | 0; + if (!$365) { + $367 = $v$3$lcssa$i + 16 | 0; + $368 = HEAP32[$367 >> 2] | 0; + if (!$368) { + $R$1$i20 = 0; + break; + } else { + $R$0$i18 = $368; + $RP$0$i17 = $367; + } + } else { + $R$0$i18 = $365; + $RP$0$i17 = $364; + } + while (1) { + $370 = $R$0$i18 + 20 | 0; + $371 = HEAP32[$370 >> 2] | 0; + if ($371) { + $R$0$i18 = $371; + $RP$0$i17 = $370; + continue; + } + $373 = $R$0$i18 + 16 | 0; + $374 = HEAP32[$373 >> 2] | 0; + if (!$374) { + $R$0$i18$lcssa = $R$0$i18; + $RP$0$i17$lcssa = $RP$0$i17; + break; + } else { + $R$0$i18 = $374; + $RP$0$i17 = $373; + } + } + if ($RP$0$i17$lcssa >>> 0 < $346 >>> 0) _abort(); else { + HEAP32[$RP$0$i17$lcssa >> 2] = 0; + $R$1$i20 = $R$0$i18$lcssa; + break; + } + } else { + $356 = HEAP32[$v$3$lcssa$i + 8 >> 2] | 0; + if ($356 >>> 0 < $346 >>> 0) _abort(); + $358 = $356 + 12 | 0; + if ((HEAP32[$358 >> 2] | 0) != ($v$3$lcssa$i | 0)) _abort(); + $361 = $353 + 8 | 0; + if ((HEAP32[$361 >> 2] | 0) == ($v$3$lcssa$i | 0)) { + HEAP32[$358 >> 2] = $353; + HEAP32[$361 >> 2] = $356; + $R$1$i20 = $353; + break; + } else _abort(); + } while (0); + do if ($351) { + $379 = HEAP32[$v$3$lcssa$i + 28 >> 2] | 0; + $380 = 3328 + ($379 << 2) | 0; + if (($v$3$lcssa$i | 0) == (HEAP32[$380 >> 2] | 0)) { + HEAP32[$380 >> 2] = $R$1$i20; + if (!$R$1$i20) { + HEAP32[757] = HEAP32[757] & ~(1 << $379); + break; + } + } else { + if ($351 >>> 0 < (HEAP32[760] | 0) >>> 0) _abort(); + $389 = $351 + 16 | 0; + if ((HEAP32[$389 >> 2] | 0) == ($v$3$lcssa$i | 0)) HEAP32[$389 >> 2] = $R$1$i20; else HEAP32[$351 + 20 >> 2] = $R$1$i20; + if (!$R$1$i20) break; + } + $394 = HEAP32[760] | 0; + if ($R$1$i20 >>> 0 < $394 >>> 0) _abort(); + HEAP32[$R$1$i20 + 24 >> 2] = $351; + $398 = HEAP32[$v$3$lcssa$i + 16 >> 2] | 0; + do if ($398) if ($398 >>> 0 < $394 >>> 0) _abort(); else { + HEAP32[$R$1$i20 + 16 >> 2] = $398; + HEAP32[$398 + 24 >> 2] = $R$1$i20; + break; + } while (0); + $404 = HEAP32[$v$3$lcssa$i + 20 >> 2] | 0; + if ($404) if ($404 >>> 0 < (HEAP32[760] | 0) >>> 0) _abort(); else { + HEAP32[$R$1$i20 + 20 >> 2] = $404; + HEAP32[$404 + 24 >> 2] = $R$1$i20; + break; + } + } while (0); + L199 : do if ($rsize$3$lcssa$i >>> 0 < 16) { + $411 = $rsize$3$lcssa$i + $246 | 0; + HEAP32[$v$3$lcssa$i + 4 >> 2] = $411 | 3; + $414 = $v$3$lcssa$i + ($411 + 4) | 0; + HEAP32[$414 >> 2] = HEAP32[$414 >> 2] | 1; + } else { + HEAP32[$v$3$lcssa$i + 4 >> 2] = $246 | 3; + HEAP32[$v$3$lcssa$i + ($246 | 4) >> 2] = $rsize$3$lcssa$i | 1; + HEAP32[$v$3$lcssa$i + ($rsize$3$lcssa$i + $246) >> 2] = $rsize$3$lcssa$i; + $422 = $rsize$3$lcssa$i >>> 3; + if ($rsize$3$lcssa$i >>> 0 < 256) { + $424 = $422 << 1; + $425 = 3064 + ($424 << 2) | 0; + $426 = HEAP32[756] | 0; + $427 = 1 << $422; + if (!($426 & $427)) { + HEAP32[756] = $426 | $427; + $$pre$phi$i26Z2D = 3064 + ($424 + 2 << 2) | 0; + $F5$0$i = $425; + } else { + $431 = 3064 + ($424 + 2 << 2) | 0; + $432 = HEAP32[$431 >> 2] | 0; + if ($432 >>> 0 < (HEAP32[760] | 0) >>> 0) _abort(); else { + $$pre$phi$i26Z2D = $431; + $F5$0$i = $432; + } + } + HEAP32[$$pre$phi$i26Z2D >> 2] = $348; + HEAP32[$F5$0$i + 12 >> 2] = $348; + HEAP32[$v$3$lcssa$i + ($246 + 8) >> 2] = $F5$0$i; + HEAP32[$v$3$lcssa$i + ($246 + 12) >> 2] = $425; + break; + } + $438 = $rsize$3$lcssa$i >>> 8; + if (!$438) $I7$0$i = 0; else if ($rsize$3$lcssa$i >>> 0 > 16777215) $I7$0$i = 31; else { + $443 = ($438 + 1048320 | 0) >>> 16 & 8; + $444 = $438 << $443; + $447 = ($444 + 520192 | 0) >>> 16 & 4; + $449 = $444 << $447; + $452 = ($449 + 245760 | 0) >>> 16 & 2; + $457 = 14 - ($447 | $443 | $452) + ($449 << $452 >>> 15) | 0; + $I7$0$i = $rsize$3$lcssa$i >>> ($457 + 7 | 0) & 1 | $457 << 1; + } + $463 = 3328 + ($I7$0$i << 2) | 0; + HEAP32[$v$3$lcssa$i + ($246 + 28) >> 2] = $I7$0$i; + HEAP32[$v$3$lcssa$i + ($246 + 20) >> 2] = 0; + HEAP32[$v$3$lcssa$i + ($246 + 16) >> 2] = 0; + $467 = HEAP32[757] | 0; + $468 = 1 << $I7$0$i; + if (!($467 & $468)) { + HEAP32[757] = $467 | $468; + HEAP32[$463 >> 2] = $348; + HEAP32[$v$3$lcssa$i + ($246 + 24) >> 2] = $463; + HEAP32[$v$3$lcssa$i + ($246 + 12) >> 2] = $348; + HEAP32[$v$3$lcssa$i + ($246 + 8) >> 2] = $348; + break; + } + $475 = HEAP32[$463 >> 2] | 0; + L217 : do if ((HEAP32[$475 + 4 >> 2] & -8 | 0) == ($rsize$3$lcssa$i | 0)) $T$0$lcssa$i = $475; else { + $K12$029$i = $rsize$3$lcssa$i << (($I7$0$i | 0) == 31 ? 0 : 25 - ($I7$0$i >>> 1) | 0); + $T$028$i = $475; + while (1) { + $492 = $T$028$i + 16 + ($K12$029$i >>> 31 << 2) | 0; + $487 = HEAP32[$492 >> 2] | 0; + if (!$487) { + $$lcssa232 = $492; + $T$028$i$lcssa = $T$028$i; + break; + } + if ((HEAP32[$487 + 4 >> 2] & -8 | 0) == ($rsize$3$lcssa$i | 0)) { + $T$0$lcssa$i = $487; + break L217; + } else { + $K12$029$i = $K12$029$i << 1; + $T$028$i = $487; + } + } + if ($$lcssa232 >>> 0 < (HEAP32[760] | 0) >>> 0) _abort(); else { + HEAP32[$$lcssa232 >> 2] = $348; + HEAP32[$v$3$lcssa$i + ($246 + 24) >> 2] = $T$028$i$lcssa; + HEAP32[$v$3$lcssa$i + ($246 + 12) >> 2] = $348; + HEAP32[$v$3$lcssa$i + ($246 + 8) >> 2] = $348; + break L199; + } + } while (0); + $499 = $T$0$lcssa$i + 8 | 0; + $500 = HEAP32[$499 >> 2] | 0; + $501 = HEAP32[760] | 0; + if ($500 >>> 0 >= $501 >>> 0 & $T$0$lcssa$i >>> 0 >= $501 >>> 0) { + HEAP32[$500 + 12 >> 2] = $348; + HEAP32[$499 >> 2] = $348; + HEAP32[$v$3$lcssa$i + ($246 + 8) >> 2] = $500; + HEAP32[$v$3$lcssa$i + ($246 + 12) >> 2] = $T$0$lcssa$i; + HEAP32[$v$3$lcssa$i + ($246 + 24) >> 2] = 0; + break; + } else _abort(); + } while (0); + $mem$0 = $v$3$lcssa$i + 8 | 0; + return $mem$0 | 0; + } else $nb$0 = $246; + } + } while (0); + $509 = HEAP32[758] | 0; + if ($509 >>> 0 >= $nb$0 >>> 0) { + $511 = $509 - $nb$0 | 0; + $512 = HEAP32[761] | 0; + if ($511 >>> 0 > 15) { + HEAP32[761] = $512 + $nb$0; + HEAP32[758] = $511; + HEAP32[$512 + ($nb$0 + 4) >> 2] = $511 | 1; + HEAP32[$512 + $509 >> 2] = $511; + HEAP32[$512 + 4 >> 2] = $nb$0 | 3; + } else { + HEAP32[758] = 0; + HEAP32[761] = 0; + HEAP32[$512 + 4 >> 2] = $509 | 3; + $522 = $512 + ($509 + 4) | 0; + HEAP32[$522 >> 2] = HEAP32[$522 >> 2] | 1; + } + $mem$0 = $512 + 8 | 0; + return $mem$0 | 0; + } + $526 = HEAP32[759] | 0; + if ($526 >>> 0 > $nb$0 >>> 0) { + $528 = $526 - $nb$0 | 0; + HEAP32[759] = $528; + $529 = HEAP32[762] | 0; + HEAP32[762] = $529 + $nb$0; + HEAP32[$529 + ($nb$0 + 4) >> 2] = $528 | 1; + HEAP32[$529 + 4 >> 2] = $nb$0 | 3; + $mem$0 = $529 + 8 | 0; + return $mem$0 | 0; + } + do if (!(HEAP32[874] | 0)) { + $538 = _sysconf(30) | 0; + if (!($538 + -1 & $538)) { + HEAP32[876] = $538; + HEAP32[875] = $538; + HEAP32[877] = -1; + HEAP32[878] = -1; + HEAP32[879] = 0; + HEAP32[867] = 0; + $544 = (_time(0) | 0) & -16 ^ 1431655768; + HEAP32[874] = $544; + break; + } else _abort(); + } while (0); + $545 = $nb$0 + 48 | 0; + $546 = HEAP32[876] | 0; + $547 = $nb$0 + 47 | 0; + $548 = $546 + $547 | 0; + $549 = 0 - $546 | 0; + $550 = $548 & $549; + if ($550 >>> 0 <= $nb$0 >>> 0) { + $mem$0 = 0; + return $mem$0 | 0; + } + $552 = HEAP32[866] | 0; + if ($552) { + $554 = HEAP32[864] | 0; + $555 = $554 + $550 | 0; + if ($555 >>> 0 <= $554 >>> 0 | $555 >>> 0 > $552 >>> 0) { + $mem$0 = 0; + return $mem$0 | 0; + } + } + L258 : do if (!(HEAP32[867] & 4)) { + $561 = HEAP32[762] | 0; + L260 : do if (!$561) label = 174; else { + $sp$0$i$i = 3472; + while (1) { + $563 = HEAP32[$sp$0$i$i >> 2] | 0; + if ($563 >>> 0 <= $561 >>> 0) { + $565 = $sp$0$i$i + 4 | 0; + if (($563 + (HEAP32[$565 >> 2] | 0) | 0) >>> 0 > $561 >>> 0) { + $$lcssa228 = $sp$0$i$i; + $$lcssa230 = $565; + break; + } + } + $sp$0$i$i = HEAP32[$sp$0$i$i + 8 >> 2] | 0; + if (!$sp$0$i$i) { + label = 174; + break L260; + } + } + $596 = $548 - (HEAP32[759] | 0) & $549; + if ($596 >>> 0 < 2147483647) { + $598 = _sbrk($596 | 0) | 0; + $602 = ($598 | 0) == ((HEAP32[$$lcssa228 >> 2] | 0) + (HEAP32[$$lcssa230 >> 2] | 0) | 0); + $$3$i = $602 ? $596 : 0; + if ($602) if (($598 | 0) == (-1 | 0)) $tsize$0323944$i = $$3$i; else { + $tbase$255$i = $598; + $tsize$254$i = $$3$i; + label = 194; + break L258; + } else { + $br$0$ph$i = $598; + $ssize$1$ph$i = $596; + $tsize$0$ph$i = $$3$i; + label = 184; + } + } else $tsize$0323944$i = 0; + } while (0); + do if ((label | 0) == 174) { + $572 = _sbrk(0) | 0; + if (($572 | 0) == (-1 | 0)) $tsize$0323944$i = 0; else { + $574 = $572; + $575 = HEAP32[875] | 0; + $576 = $575 + -1 | 0; + if (!($576 & $574)) $ssize$0$i = $550; else $ssize$0$i = $550 - $574 + ($576 + $574 & 0 - $575) | 0; + $584 = HEAP32[864] | 0; + $585 = $584 + $ssize$0$i | 0; + if ($ssize$0$i >>> 0 > $nb$0 >>> 0 & $ssize$0$i >>> 0 < 2147483647) { + $588 = HEAP32[866] | 0; + if ($588) if ($585 >>> 0 <= $584 >>> 0 | $585 >>> 0 > $588 >>> 0) { + $tsize$0323944$i = 0; + break; + } + $592 = _sbrk($ssize$0$i | 0) | 0; + $593 = ($592 | 0) == ($572 | 0); + $ssize$0$$i = $593 ? $ssize$0$i : 0; + if ($593) { + $tbase$255$i = $572; + $tsize$254$i = $ssize$0$$i; + label = 194; + break L258; + } else { + $br$0$ph$i = $592; + $ssize$1$ph$i = $ssize$0$i; + $tsize$0$ph$i = $ssize$0$$i; + label = 184; + } + } else $tsize$0323944$i = 0; + } + } while (0); + L280 : do if ((label | 0) == 184) { + $604 = 0 - $ssize$1$ph$i | 0; + do if ($545 >>> 0 > $ssize$1$ph$i >>> 0 & ($ssize$1$ph$i >>> 0 < 2147483647 & ($br$0$ph$i | 0) != (-1 | 0))) { + $608 = HEAP32[876] | 0; + $612 = $547 - $ssize$1$ph$i + $608 & 0 - $608; + if ($612 >>> 0 < 2147483647) if ((_sbrk($612 | 0) | 0) == (-1 | 0)) { + _sbrk($604 | 0) | 0; + $tsize$0323944$i = $tsize$0$ph$i; + break L280; + } else { + $ssize$2$i = $612 + $ssize$1$ph$i | 0; + break; + } else $ssize$2$i = $ssize$1$ph$i; + } else $ssize$2$i = $ssize$1$ph$i; while (0); + if (($br$0$ph$i | 0) == (-1 | 0)) $tsize$0323944$i = $tsize$0$ph$i; else { + $tbase$255$i = $br$0$ph$i; + $tsize$254$i = $ssize$2$i; + label = 194; + break L258; + } + } while (0); + HEAP32[867] = HEAP32[867] | 4; + $tsize$1$i = $tsize$0323944$i; + label = 191; + } else { + $tsize$1$i = 0; + label = 191; + } while (0); + if ((label | 0) == 191) if ($550 >>> 0 < 2147483647) { + $621 = _sbrk($550 | 0) | 0; + $622 = _sbrk(0) | 0; + if ($621 >>> 0 < $622 >>> 0 & (($621 | 0) != (-1 | 0) & ($622 | 0) != (-1 | 0))) { + $628 = $622 - $621 | 0; + $630 = $628 >>> 0 > ($nb$0 + 40 | 0) >>> 0; + if ($630) { + $tbase$255$i = $621; + $tsize$254$i = $630 ? $628 : $tsize$1$i; + label = 194; + } + } + } + if ((label | 0) == 194) { + $632 = (HEAP32[864] | 0) + $tsize$254$i | 0; + HEAP32[864] = $632; + if ($632 >>> 0 > (HEAP32[865] | 0) >>> 0) HEAP32[865] = $632; + $635 = HEAP32[762] | 0; + L299 : do if (!$635) { + $637 = HEAP32[760] | 0; + if (($637 | 0) == 0 | $tbase$255$i >>> 0 < $637 >>> 0) HEAP32[760] = $tbase$255$i; + HEAP32[868] = $tbase$255$i; + HEAP32[869] = $tsize$254$i; + HEAP32[871] = 0; + HEAP32[765] = HEAP32[874]; + HEAP32[764] = -1; + $i$02$i$i = 0; + do { + $641 = $i$02$i$i << 1; + $642 = 3064 + ($641 << 2) | 0; + HEAP32[3064 + ($641 + 3 << 2) >> 2] = $642; + HEAP32[3064 + ($641 + 2 << 2) >> 2] = $642; + $i$02$i$i = $i$02$i$i + 1 | 0; + } while (($i$02$i$i | 0) != 32); + $648 = $tbase$255$i + 8 | 0; + $653 = ($648 & 7 | 0) == 0 ? 0 : 0 - $648 & 7; + $655 = $tsize$254$i + -40 - $653 | 0; + HEAP32[762] = $tbase$255$i + $653; + HEAP32[759] = $655; + HEAP32[$tbase$255$i + ($653 + 4) >> 2] = $655 | 1; + HEAP32[$tbase$255$i + ($tsize$254$i + -36) >> 2] = 40; + HEAP32[763] = HEAP32[878]; + } else { + $sp$084$i = 3472; + do { + $660 = HEAP32[$sp$084$i >> 2] | 0; + $661 = $sp$084$i + 4 | 0; + $662 = HEAP32[$661 >> 2] | 0; + if (($tbase$255$i | 0) == ($660 + $662 | 0)) { + $$lcssa222 = $660; + $$lcssa224 = $661; + $$lcssa226 = $662; + $sp$084$i$lcssa = $sp$084$i; + label = 204; + break; + } + $sp$084$i = HEAP32[$sp$084$i + 8 >> 2] | 0; + } while (($sp$084$i | 0) != 0); + if ((label | 0) == 204) if (!(HEAP32[$sp$084$i$lcssa + 12 >> 2] & 8)) if ($635 >>> 0 < $tbase$255$i >>> 0 & $635 >>> 0 >= $$lcssa222 >>> 0) { + HEAP32[$$lcssa224 >> 2] = $$lcssa226 + $tsize$254$i; + $676 = (HEAP32[759] | 0) + $tsize$254$i | 0; + $678 = $635 + 8 | 0; + $683 = ($678 & 7 | 0) == 0 ? 0 : 0 - $678 & 7; + $685 = $676 - $683 | 0; + HEAP32[762] = $635 + $683; + HEAP32[759] = $685; + HEAP32[$635 + ($683 + 4) >> 2] = $685 | 1; + HEAP32[$635 + ($676 + 4) >> 2] = 40; + HEAP32[763] = HEAP32[878]; + break; + } + $690 = HEAP32[760] | 0; + if ($tbase$255$i >>> 0 < $690 >>> 0) { + HEAP32[760] = $tbase$255$i; + $755 = $tbase$255$i; + } else $755 = $690; + $692 = $tbase$255$i + $tsize$254$i | 0; + $sp$183$i = 3472; + while (1) { + if ((HEAP32[$sp$183$i >> 2] | 0) == ($692 | 0)) { + $$lcssa219 = $sp$183$i; + $sp$183$i$lcssa = $sp$183$i; + label = 212; + break; + } + $sp$183$i = HEAP32[$sp$183$i + 8 >> 2] | 0; + if (!$sp$183$i) { + $sp$0$i$i$i = 3472; + break; + } + } + if ((label | 0) == 212) if (!(HEAP32[$sp$183$i$lcssa + 12 >> 2] & 8)) { + HEAP32[$$lcssa219 >> 2] = $tbase$255$i; + $702 = $sp$183$i$lcssa + 4 | 0; + HEAP32[$702 >> 2] = (HEAP32[$702 >> 2] | 0) + $tsize$254$i; + $706 = $tbase$255$i + 8 | 0; + $711 = ($706 & 7 | 0) == 0 ? 0 : 0 - $706 & 7; + $714 = $tbase$255$i + ($tsize$254$i + 8) | 0; + $719 = ($714 & 7 | 0) == 0 ? 0 : 0 - $714 & 7; + $720 = $tbase$255$i + ($719 + $tsize$254$i) | 0; + $$sum$i19$i = $711 + $nb$0 | 0; + $724 = $tbase$255$i + $$sum$i19$i | 0; + $725 = $720 - ($tbase$255$i + $711) - $nb$0 | 0; + HEAP32[$tbase$255$i + ($711 + 4) >> 2] = $nb$0 | 3; + L324 : do if (($720 | 0) == ($635 | 0)) { + $730 = (HEAP32[759] | 0) + $725 | 0; + HEAP32[759] = $730; + HEAP32[762] = $724; + HEAP32[$tbase$255$i + ($$sum$i19$i + 4) >> 2] = $730 | 1; + } else { + if (($720 | 0) == (HEAP32[761] | 0)) { + $736 = (HEAP32[758] | 0) + $725 | 0; + HEAP32[758] = $736; + HEAP32[761] = $724; + HEAP32[$tbase$255$i + ($$sum$i19$i + 4) >> 2] = $736 | 1; + HEAP32[$tbase$255$i + ($736 + $$sum$i19$i) >> 2] = $736; + break; + } + $$sum2$i21$i = $tsize$254$i + 4 | 0; + $741 = HEAP32[$tbase$255$i + ($$sum2$i21$i + $719) >> 2] | 0; + if (($741 & 3 | 0) == 1) { + $744 = $741 & -8; + $745 = $741 >>> 3; + L332 : do if ($741 >>> 0 < 256) { + $748 = HEAP32[$tbase$255$i + (($719 | 8) + $tsize$254$i) >> 2] | 0; + $750 = HEAP32[$tbase$255$i + ($tsize$254$i + 12 + $719) >> 2] | 0; + $752 = 3064 + ($745 << 1 << 2) | 0; + do if (($748 | 0) != ($752 | 0)) { + if ($748 >>> 0 < $755 >>> 0) _abort(); + if ((HEAP32[$748 + 12 >> 2] | 0) == ($720 | 0)) break; + _abort(); + } while (0); + if (($750 | 0) == ($748 | 0)) { + HEAP32[756] = HEAP32[756] & ~(1 << $745); + break; + } + do if (($750 | 0) == ($752 | 0)) $$pre$phi58$i$iZ2D = $750 + 8 | 0; else { + if ($750 >>> 0 < $755 >>> 0) _abort(); + $766 = $750 + 8 | 0; + if ((HEAP32[$766 >> 2] | 0) == ($720 | 0)) { + $$pre$phi58$i$iZ2D = $766; + break; + } + _abort(); + } while (0); + HEAP32[$748 + 12 >> 2] = $750; + HEAP32[$$pre$phi58$i$iZ2D >> 2] = $748; + } else { + $771 = HEAP32[$tbase$255$i + (($719 | 24) + $tsize$254$i) >> 2] | 0; + $773 = HEAP32[$tbase$255$i + ($tsize$254$i + 12 + $719) >> 2] | 0; + do if (($773 | 0) == ($720 | 0)) { + $$sum67$i$i = $719 | 16; + $784 = $tbase$255$i + ($$sum2$i21$i + $$sum67$i$i) | 0; + $785 = HEAP32[$784 >> 2] | 0; + if (!$785) { + $787 = $tbase$255$i + ($$sum67$i$i + $tsize$254$i) | 0; + $788 = HEAP32[$787 >> 2] | 0; + if (!$788) { + $R$1$i$i = 0; + break; + } else { + $R$0$i$i = $788; + $RP$0$i$i = $787; + } + } else { + $R$0$i$i = $785; + $RP$0$i$i = $784; + } + while (1) { + $790 = $R$0$i$i + 20 | 0; + $791 = HEAP32[$790 >> 2] | 0; + if ($791) { + $R$0$i$i = $791; + $RP$0$i$i = $790; + continue; + } + $793 = $R$0$i$i + 16 | 0; + $794 = HEAP32[$793 >> 2] | 0; + if (!$794) { + $R$0$i$i$lcssa = $R$0$i$i; + $RP$0$i$i$lcssa = $RP$0$i$i; + break; + } else { + $R$0$i$i = $794; + $RP$0$i$i = $793; + } + } + if ($RP$0$i$i$lcssa >>> 0 < $755 >>> 0) _abort(); else { + HEAP32[$RP$0$i$i$lcssa >> 2] = 0; + $R$1$i$i = $R$0$i$i$lcssa; + break; + } + } else { + $776 = HEAP32[$tbase$255$i + (($719 | 8) + $tsize$254$i) >> 2] | 0; + if ($776 >>> 0 < $755 >>> 0) _abort(); + $778 = $776 + 12 | 0; + if ((HEAP32[$778 >> 2] | 0) != ($720 | 0)) _abort(); + $781 = $773 + 8 | 0; + if ((HEAP32[$781 >> 2] | 0) == ($720 | 0)) { + HEAP32[$778 >> 2] = $773; + HEAP32[$781 >> 2] = $776; + $R$1$i$i = $773; + break; + } else _abort(); + } while (0); + if (!$771) break; + $799 = HEAP32[$tbase$255$i + ($tsize$254$i + 28 + $719) >> 2] | 0; + $800 = 3328 + ($799 << 2) | 0; + do if (($720 | 0) == (HEAP32[$800 >> 2] | 0)) { + HEAP32[$800 >> 2] = $R$1$i$i; + if ($R$1$i$i) break; + HEAP32[757] = HEAP32[757] & ~(1 << $799); + break L332; + } else { + if ($771 >>> 0 < (HEAP32[760] | 0) >>> 0) _abort(); + $809 = $771 + 16 | 0; + if ((HEAP32[$809 >> 2] | 0) == ($720 | 0)) HEAP32[$809 >> 2] = $R$1$i$i; else HEAP32[$771 + 20 >> 2] = $R$1$i$i; + if (!$R$1$i$i) break L332; + } while (0); + $814 = HEAP32[760] | 0; + if ($R$1$i$i >>> 0 < $814 >>> 0) _abort(); + HEAP32[$R$1$i$i + 24 >> 2] = $771; + $$sum3132$i$i = $719 | 16; + $818 = HEAP32[$tbase$255$i + ($$sum3132$i$i + $tsize$254$i) >> 2] | 0; + do if ($818) if ($818 >>> 0 < $814 >>> 0) _abort(); else { + HEAP32[$R$1$i$i + 16 >> 2] = $818; + HEAP32[$818 + 24 >> 2] = $R$1$i$i; + break; + } while (0); + $824 = HEAP32[$tbase$255$i + ($$sum2$i21$i + $$sum3132$i$i) >> 2] | 0; + if (!$824) break; + if ($824 >>> 0 < (HEAP32[760] | 0) >>> 0) _abort(); else { + HEAP32[$R$1$i$i + 20 >> 2] = $824; + HEAP32[$824 + 24 >> 2] = $R$1$i$i; + break; + } + } while (0); + $oldfirst$0$i$i = $tbase$255$i + (($744 | $719) + $tsize$254$i) | 0; + $qsize$0$i$i = $744 + $725 | 0; + } else { + $oldfirst$0$i$i = $720; + $qsize$0$i$i = $725; + } + $832 = $oldfirst$0$i$i + 4 | 0; + HEAP32[$832 >> 2] = HEAP32[$832 >> 2] & -2; + HEAP32[$tbase$255$i + ($$sum$i19$i + 4) >> 2] = $qsize$0$i$i | 1; + HEAP32[$tbase$255$i + ($qsize$0$i$i + $$sum$i19$i) >> 2] = $qsize$0$i$i; + $838 = $qsize$0$i$i >>> 3; + if ($qsize$0$i$i >>> 0 < 256) { + $840 = $838 << 1; + $841 = 3064 + ($840 << 2) | 0; + $842 = HEAP32[756] | 0; + $843 = 1 << $838; + do if (!($842 & $843)) { + HEAP32[756] = $842 | $843; + $$pre$phi$i23$iZ2D = 3064 + ($840 + 2 << 2) | 0; + $F4$0$i$i = $841; + } else { + $847 = 3064 + ($840 + 2 << 2) | 0; + $848 = HEAP32[$847 >> 2] | 0; + if ($848 >>> 0 >= (HEAP32[760] | 0) >>> 0) { + $$pre$phi$i23$iZ2D = $847; + $F4$0$i$i = $848; + break; + } + _abort(); + } while (0); + HEAP32[$$pre$phi$i23$iZ2D >> 2] = $724; + HEAP32[$F4$0$i$i + 12 >> 2] = $724; + HEAP32[$tbase$255$i + ($$sum$i19$i + 8) >> 2] = $F4$0$i$i; + HEAP32[$tbase$255$i + ($$sum$i19$i + 12) >> 2] = $841; + break; + } + $854 = $qsize$0$i$i >>> 8; + do if (!$854) $I7$0$i$i = 0; else { + if ($qsize$0$i$i >>> 0 > 16777215) { + $I7$0$i$i = 31; + break; + } + $859 = ($854 + 1048320 | 0) >>> 16 & 8; + $860 = $854 << $859; + $863 = ($860 + 520192 | 0) >>> 16 & 4; + $865 = $860 << $863; + $868 = ($865 + 245760 | 0) >>> 16 & 2; + $873 = 14 - ($863 | $859 | $868) + ($865 << $868 >>> 15) | 0; + $I7$0$i$i = $qsize$0$i$i >>> ($873 + 7 | 0) & 1 | $873 << 1; + } while (0); + $879 = 3328 + ($I7$0$i$i << 2) | 0; + HEAP32[$tbase$255$i + ($$sum$i19$i + 28) >> 2] = $I7$0$i$i; + HEAP32[$tbase$255$i + ($$sum$i19$i + 20) >> 2] = 0; + HEAP32[$tbase$255$i + ($$sum$i19$i + 16) >> 2] = 0; + $883 = HEAP32[757] | 0; + $884 = 1 << $I7$0$i$i; + if (!($883 & $884)) { + HEAP32[757] = $883 | $884; + HEAP32[$879 >> 2] = $724; + HEAP32[$tbase$255$i + ($$sum$i19$i + 24) >> 2] = $879; + HEAP32[$tbase$255$i + ($$sum$i19$i + 12) >> 2] = $724; + HEAP32[$tbase$255$i + ($$sum$i19$i + 8) >> 2] = $724; + break; + } + $891 = HEAP32[$879 >> 2] | 0; + L418 : do if ((HEAP32[$891 + 4 >> 2] & -8 | 0) == ($qsize$0$i$i | 0)) $T$0$lcssa$i25$i = $891; else { + $K8$051$i$i = $qsize$0$i$i << (($I7$0$i$i | 0) == 31 ? 0 : 25 - ($I7$0$i$i >>> 1) | 0); + $T$050$i$i = $891; + while (1) { + $908 = $T$050$i$i + 16 + ($K8$051$i$i >>> 31 << 2) | 0; + $903 = HEAP32[$908 >> 2] | 0; + if (!$903) { + $$lcssa = $908; + $T$050$i$i$lcssa = $T$050$i$i; + break; + } + if ((HEAP32[$903 + 4 >> 2] & -8 | 0) == ($qsize$0$i$i | 0)) { + $T$0$lcssa$i25$i = $903; + break L418; + } else { + $K8$051$i$i = $K8$051$i$i << 1; + $T$050$i$i = $903; + } + } + if ($$lcssa >>> 0 < (HEAP32[760] | 0) >>> 0) _abort(); else { + HEAP32[$$lcssa >> 2] = $724; + HEAP32[$tbase$255$i + ($$sum$i19$i + 24) >> 2] = $T$050$i$i$lcssa; + HEAP32[$tbase$255$i + ($$sum$i19$i + 12) >> 2] = $724; + HEAP32[$tbase$255$i + ($$sum$i19$i + 8) >> 2] = $724; + break L324; + } + } while (0); + $915 = $T$0$lcssa$i25$i + 8 | 0; + $916 = HEAP32[$915 >> 2] | 0; + $917 = HEAP32[760] | 0; + if ($916 >>> 0 >= $917 >>> 0 & $T$0$lcssa$i25$i >>> 0 >= $917 >>> 0) { + HEAP32[$916 + 12 >> 2] = $724; + HEAP32[$915 >> 2] = $724; + HEAP32[$tbase$255$i + ($$sum$i19$i + 8) >> 2] = $916; + HEAP32[$tbase$255$i + ($$sum$i19$i + 12) >> 2] = $T$0$lcssa$i25$i; + HEAP32[$tbase$255$i + ($$sum$i19$i + 24) >> 2] = 0; + break; + } else _abort(); + } while (0); + $mem$0 = $tbase$255$i + ($711 | 8) | 0; + return $mem$0 | 0; + } else $sp$0$i$i$i = 3472; + while (1) { + $925 = HEAP32[$sp$0$i$i$i >> 2] | 0; + if ($925 >>> 0 <= $635 >>> 0) { + $928 = HEAP32[$sp$0$i$i$i + 4 >> 2] | 0; + $929 = $925 + $928 | 0; + if ($929 >>> 0 > $635 >>> 0) { + $$lcssa215 = $925; + $$lcssa216 = $928; + $$lcssa217 = $929; + break; + } + } + $sp$0$i$i$i = HEAP32[$sp$0$i$i$i + 8 >> 2] | 0; + } + $934 = $$lcssa215 + ($$lcssa216 + -39) | 0; + $940 = $$lcssa215 + ($$lcssa216 + -47 + (($934 & 7 | 0) == 0 ? 0 : 0 - $934 & 7)) | 0; + $941 = $635 + 16 | 0; + $943 = $940 >>> 0 < $941 >>> 0 ? $635 : $940; + $944 = $943 + 8 | 0; + $947 = $tbase$255$i + 8 | 0; + $952 = ($947 & 7 | 0) == 0 ? 0 : 0 - $947 & 7; + $954 = $tsize$254$i + -40 - $952 | 0; + HEAP32[762] = $tbase$255$i + $952; + HEAP32[759] = $954; + HEAP32[$tbase$255$i + ($952 + 4) >> 2] = $954 | 1; + HEAP32[$tbase$255$i + ($tsize$254$i + -36) >> 2] = 40; + HEAP32[763] = HEAP32[878]; + $959 = $943 + 4 | 0; + HEAP32[$959 >> 2] = 27; + HEAP32[$944 >> 2] = HEAP32[868]; + HEAP32[$944 + 4 >> 2] = HEAP32[869]; + HEAP32[$944 + 8 >> 2] = HEAP32[870]; + HEAP32[$944 + 12 >> 2] = HEAP32[871]; + HEAP32[868] = $tbase$255$i; + HEAP32[869] = $tsize$254$i; + HEAP32[871] = 0; + HEAP32[870] = $944; + $960 = $943 + 28 | 0; + HEAP32[$960 >> 2] = 7; + if (($943 + 32 | 0) >>> 0 < $$lcssa217 >>> 0) { + $964 = $960; + do { + $964$looptemp = $964; + $964 = $964 + 4 | 0; + HEAP32[$964 >> 2] = 7; + } while (($964$looptemp + 8 | 0) >>> 0 < $$lcssa217 >>> 0); + } + if (($943 | 0) != ($635 | 0)) { + $970 = $943 - $635 | 0; + HEAP32[$959 >> 2] = HEAP32[$959 >> 2] & -2; + HEAP32[$635 + 4 >> 2] = $970 | 1; + HEAP32[$943 >> 2] = $970; + $975 = $970 >>> 3; + if ($970 >>> 0 < 256) { + $977 = $975 << 1; + $978 = 3064 + ($977 << 2) | 0; + $979 = HEAP32[756] | 0; + $980 = 1 << $975; + if (!($979 & $980)) { + HEAP32[756] = $979 | $980; + $$pre$phi$i$iZ2D = 3064 + ($977 + 2 << 2) | 0; + $F$0$i$i = $978; + } else { + $984 = 3064 + ($977 + 2 << 2) | 0; + $985 = HEAP32[$984 >> 2] | 0; + if ($985 >>> 0 < (HEAP32[760] | 0) >>> 0) _abort(); else { + $$pre$phi$i$iZ2D = $984; + $F$0$i$i = $985; + } + } + HEAP32[$$pre$phi$i$iZ2D >> 2] = $635; + HEAP32[$F$0$i$i + 12 >> 2] = $635; + HEAP32[$635 + 8 >> 2] = $F$0$i$i; + HEAP32[$635 + 12 >> 2] = $978; + break; + } + $991 = $970 >>> 8; + if (!$991) $I1$0$i$i = 0; else if ($970 >>> 0 > 16777215) $I1$0$i$i = 31; else { + $996 = ($991 + 1048320 | 0) >>> 16 & 8; + $997 = $991 << $996; + $1000 = ($997 + 520192 | 0) >>> 16 & 4; + $1002 = $997 << $1000; + $1005 = ($1002 + 245760 | 0) >>> 16 & 2; + $1010 = 14 - ($1000 | $996 | $1005) + ($1002 << $1005 >>> 15) | 0; + $I1$0$i$i = $970 >>> ($1010 + 7 | 0) & 1 | $1010 << 1; + } + $1016 = 3328 + ($I1$0$i$i << 2) | 0; + HEAP32[$635 + 28 >> 2] = $I1$0$i$i; + HEAP32[$635 + 20 >> 2] = 0; + HEAP32[$941 >> 2] = 0; + $1019 = HEAP32[757] | 0; + $1020 = 1 << $I1$0$i$i; + if (!($1019 & $1020)) { + HEAP32[757] = $1019 | $1020; + HEAP32[$1016 >> 2] = $635; + HEAP32[$635 + 24 >> 2] = $1016; + HEAP32[$635 + 12 >> 2] = $635; + HEAP32[$635 + 8 >> 2] = $635; + break; + } + $1027 = HEAP32[$1016 >> 2] | 0; + L459 : do if ((HEAP32[$1027 + 4 >> 2] & -8 | 0) == ($970 | 0)) $T$0$lcssa$i$i = $1027; else { + $K2$07$i$i = $970 << (($I1$0$i$i | 0) == 31 ? 0 : 25 - ($I1$0$i$i >>> 1) | 0); + $T$06$i$i = $1027; + while (1) { + $1044 = $T$06$i$i + 16 + ($K2$07$i$i >>> 31 << 2) | 0; + $1039 = HEAP32[$1044 >> 2] | 0; + if (!$1039) { + $$lcssa211 = $1044; + $T$06$i$i$lcssa = $T$06$i$i; + break; + } + if ((HEAP32[$1039 + 4 >> 2] & -8 | 0) == ($970 | 0)) { + $T$0$lcssa$i$i = $1039; + break L459; + } else { + $K2$07$i$i = $K2$07$i$i << 1; + $T$06$i$i = $1039; + } + } + if ($$lcssa211 >>> 0 < (HEAP32[760] | 0) >>> 0) _abort(); else { + HEAP32[$$lcssa211 >> 2] = $635; + HEAP32[$635 + 24 >> 2] = $T$06$i$i$lcssa; + HEAP32[$635 + 12 >> 2] = $635; + HEAP32[$635 + 8 >> 2] = $635; + break L299; + } + } while (0); + $1051 = $T$0$lcssa$i$i + 8 | 0; + $1052 = HEAP32[$1051 >> 2] | 0; + $1053 = HEAP32[760] | 0; + if ($1052 >>> 0 >= $1053 >>> 0 & $T$0$lcssa$i$i >>> 0 >= $1053 >>> 0) { + HEAP32[$1052 + 12 >> 2] = $635; + HEAP32[$1051 >> 2] = $635; + HEAP32[$635 + 8 >> 2] = $1052; + HEAP32[$635 + 12 >> 2] = $T$0$lcssa$i$i; + HEAP32[$635 + 24 >> 2] = 0; + break; + } else _abort(); + } + } while (0); + $1060 = HEAP32[759] | 0; + if ($1060 >>> 0 > $nb$0 >>> 0) { + $1062 = $1060 - $nb$0 | 0; + HEAP32[759] = $1062; + $1063 = HEAP32[762] | 0; + HEAP32[762] = $1063 + $nb$0; + HEAP32[$1063 + ($nb$0 + 4) >> 2] = $1062 | 1; + HEAP32[$1063 + 4 >> 2] = $nb$0 | 3; + $mem$0 = $1063 + 8 | 0; + return $mem$0 | 0; + } + } + $1070 = ___errno_location() | 0; + HEAP32[$1070 >> 2] = 12; + $mem$0 = 0; + return $mem$0 | 0; +} + +function ___floatscan($f, $prec, $pok) { + $f = $f | 0; + $prec = $prec | 0; + $pok = $pok | 0; + var $$0 = 0.0, $$0$i27 = 0.0, $$010$i = 0, $$07$i = 0, $$0710$i = 0, $$0711$i = 0, $$09$i = 0, $$1$be$i = 0, $$1$ph$i = 0, $$18$i = 0, $$2$i = 0, $$3$be$i = 0, $$3$lcssa$i = 0, $$3105$i = 0, $$in = 0, $$lcssa = 0, $$lcssa256 = 0, $$lcssa256$lcssa = 0, $$lcssa257 = 0, $$lcssa257$lcssa = 0, $$lcssa263 = 0, $$lcssa264 = 0, $$lcssa265 = 0, $$lcssa275 = 0, $$not$i = 0, $$pre$i = 0, $$pre$i17 = 0, $$pre$phi42$iZ2D = 0.0, $$sink$off0$i = 0, $0 = 0, $1 = 0, $103 = 0, $113 = 0, $115 = 0, $123 = 0, $125 = 0, $132 = 0, $139 = 0, $147 = 0, $15 = 0, $154 = 0, $155 = 0, $156 = 0, $157 = 0, $159 = 0, $16 = 0, $160 = 0, $164 = 0, $169 = 0, $171 = 0, $183 = 0.0, $190 = 0, $192 = 0, $2 = 0, $201 = 0, $205 = 0, $211 = 0, $212 = 0, $213 = 0, $214 = 0, $215 = 0, $216 = 0, $217 = 0, $223 = 0, $224 = 0, $225 = 0, $235 = 0, $236 = 0, $249 = 0, $251 = 0, $253 = 0, $254 = 0, $255 = 0, $256 = 0, $266 = 0, $270 = 0, $272 = 0, $279 = 0, $283 = 0, $287 = 0, $288 = 0, $289 = 0, $29 = 0, $290 = 0, $291 = 0, $295 = 0, $297 = 0, $298 = 0, $299 = 0, $300 = 0, $310 = 0.0, $322 = 0.0, $324 = 0, $330 = 0, $331 = 0, $338 = 0, $346 = 0, $347 = 0, $348 = 0, $349 = 0, $350 = 0, $358 = 0, $36 = 0, $360 = 0, $362 = 0, $365 = 0, $366 = 0, $367 = 0, $368 = 0, $369 = 0, $371 = 0, $376 = 0, $377 = 0, $381 = 0, $39 = 0, $392 = 0, $393 = 0, $394 = 0, $395 = 0, $396 = 0, $397 = 0, $398 = 0, $399 = 0, $402 = 0, $403 = 0, $412 = 0, $413 = 0, $414 = 0, $42 = 0, $421 = 0, $422 = 0, $427 = 0, $428 = 0, $430 = 0, $431 = 0, $444 = 0, $446 = 0, $452 = 0, $456 = 0, $458 = 0, $464 = 0, $470 = 0, $471 = 0, $472 = 0, $494 = 0, $506 = 0, $510 = 0, $513 = 0, $515 = 0, $516 = 0, $517 = 0, $520 = 0, $521 = 0, $533 = 0, $534 = 0, $535 = 0, $539 = 0, $541 = 0, $543 = 0, $544 = 0, $550 = 0, $552 = 0, $557 = 0, $560 = 0, $564 = 0, $567 = 0, $572 = 0, $576 = 0, $577 = 0, $579 = 0, $583 = 0, $585 = 0, $588 = 0, $589 = 0, $590 = 0, $591 = 0, $594 = 0, $595 = 0, $60 = 0, $604 = 0, $609 = 0, $610 = 0, $617 = 0, $619 = 0.0, $621 = 0, $625 = 0.0, $626 = 0.0, $629 = 0.0, $633 = 0, $636 = 0, $643 = 0.0, $661 = 0.0, $663 = 0, $669 = 0, $67 = 0, $670 = 0, $677 = 0, $680 = 0, $69 = 0, $691 = 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, $77 = 0, $82 = 0, $9 = 0, $90 = 0, $99 = 0, $a$0$lcssa151$i = 0, $a$085$i = 0, $a$1$i = 0, $a$1$i$lcssa = 0, $a$2$ph38$i = 0, $a$3$i = 0, $a$3$i$lcssa248 = 0, $a$3$i249 = 0, $a$3$ph$i = 0, $a$3$ph157$i = 0, $a$478$i = 0, $a$5$i = 0, $a$5$i$lcssa = 0, $a$5$i$lcssa$lcssa = 0, $bias$0$i = 0.0, $bias$0$i25 = 0.0, $bits$0$ph = 0, $c$0 = 0, $c$0$i = 0, $c$1$lcssa = 0, $c$1$ph$i = 0, $c$179 = 0, $c$2 = 0, $c$2$i = 0, $c$2$lcssa$i = 0, $c$377 = 0, $c$4 = 0, $c$5 = 0, $c$6 = 0, $carry$087$i = 0, $carry1$0$i = 0, $carry1$1$i = 0, $carry1$1$i$lcssa = 0, $carry1$1$i$lcssa$lcssa = 0, $carry3$081$i = 0, $d$0$i = 0, $denormal$0$i = 0, $denormal$2$i = 0, $e2$0$i19 = 0, $e2$0$ph$i = 0, $e2$1$i = 0, $e2$1$i246 = 0, $e2$1$ph$i = 0, $e2$1$ph156$i = 0, $e2$2$i = 0, $e2$3$i = 0, $emin$0$ph = 0, $frac$0$i = 0.0, $frac$1$i = 0.0, $frac$2$i = 0.0, $gotdig$0$i = 0, $gotdig$0$i$lcssa242 = 0, $gotdig$0$i12 = 0, $gotdig$0$i12$lcssa273 = 0, $gotdig$2$i = 0, $gotdig$2$i$lcssa = 0, $gotdig$2$i13 = 0, $gotdig$3$i = 0, $gotdig$3$lcssa$i = 0, $gotdig$3101$i = 0, $gotdig$3101$i$lcssa = 0, $gotdig$4$i = 0, $gotrad$0$i = 0, $gotrad$0$i$lcssa = 0, $gotrad$0$i14 = 0, $gotrad$1$i = 0, $gotrad$1$lcssa$i = 0, $gotrad$1102$i = 0, $gotrad$2$i = 0, $gottail$0$i = 0, $gottail$1$i = 0, $gottail$2$i = 0, $i$0$lcssa = 0, $i$078 = 0, $i$1 = 0, $i$276 = 0, $i$3 = 0, $i$4 = 0, $i$4$lcssa = 0, $j$0$lcssa$i = 0, $j$0104$i = 0, $j$0104$i$lcssa = 0, $j$067$i = 0, $j$068$i = 0, $j$069$i = 0, $j$2$i = 0, $j$394$i = 0, $k$0$lcssa$i = 0, $k$0103$i = 0, $k$0103$i$lcssa = 0, $k$063$i = 0, $k$064$i = 0, $k$065$i = 0, $k$2$i = 0, $k$3$i = 0, $k$486$i = 0, $k$5$i = 0, $k$5$in$i = 0, $k$679$i = 0, $lnz$0$lcssa$i = 0, $lnz$0100$i = 0, $lnz$0100$i$lcssa = 0, $lnz$057$i = 0, $lnz$058$i = 0, $lnz$059$i = 0, $lnz$2$i = 0, $or$cond16$i = 0, $or$cond19$i = 0, $or$cond9$i = 0, $rp$0$lcssa152$i = 0, $rp$084$i = 0, $rp$1$i18 = 0, $rp$1$i18$lcssa = 0, $rp$2$ph36$i = 0, $rp$3$ph$i = 0, $rp$3$ph34$i = 0, $rp$477$i = 0, $rp$5$i = 0, $rp$5$i$lcssa = 0, $rp$5$i$lcssa$lcssa = 0, $scale$0$i = 0.0, $scale$1$i = 0.0, $scale$2$i = 0.0, $sign$0 = 0, $storemerge$i = 0, $sum$i = 0, $x$0$i = 0, $x$0$i$lcssa = 0, $x$1$i = 0, $x$2$i = 0, $x$3$lcssa$i = 0, $x$324$i = 0, $x$4$lcssa$i = 0, $x$419$i = 0, $x$5$i = 0, $x$i = 0, $y$0$i = 0.0, $y$0$i$lcssa = 0.0, $y$1$i = 0.0, $y$1$i24 = 0.0, $y$2$i = 0.0, $y$2$i26 = 0.0, $y$3$i = 0.0, $y$3$lcssa$i = 0.0, $y$320$i = 0.0, $y$4$i = 0.0, $z$0$i = 0, $z$1$i = 0, $z$1$ph37$i = 0, $z$2$i = 0, $z$3$i = 0, $z$3$i$lcssa = 0, $z$3$i$lcssa$lcssa = 0, $z$4$i = 0, $z$5$ph$i = 0, $z$7$1$i = 0, $z$7$i = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 512 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $x$i = sp; + switch ($prec | 0) { + case 0: + { + $bits$0$ph = 24; + $emin$0$ph = -149; + label = 4; + break; + } + case 1: + { + $bits$0$ph = 53; + $emin$0$ph = -1074; + label = 4; + break; + } + case 2: + { + $bits$0$ph = 53; + $emin$0$ph = -1074; + label = 4; + break; + } + default: + $$0 = 0.0; + } + L4 : do if ((label | 0) == 4) { + $0 = $f + 4 | 0; + $1 = $f + 100 | 0; + do { + $2 = HEAP32[$0 >> 2] | 0; + if ($2 >>> 0 < (HEAP32[$1 >> 2] | 0) >>> 0) { + HEAP32[$0 >> 2] = $2 + 1; + $9 = HEAPU8[$2 >> 0] | 0; + } else $9 = ___shgetc($f) | 0; + } while ((_isspace($9) | 0) != 0); + $$lcssa275 = $9; + L13 : do switch ($$lcssa275 | 0) { + case 43: + case 45: + { + $15 = 1 - ((($$lcssa275 | 0) == 45 & 1) << 1) | 0; + $16 = HEAP32[$0 >> 2] | 0; + if ($16 >>> 0 < (HEAP32[$1 >> 2] | 0) >>> 0) { + HEAP32[$0 >> 2] = $16 + 1; + $c$0 = HEAPU8[$16 >> 0] | 0; + $sign$0 = $15; + break L13; + } else { + $c$0 = ___shgetc($f) | 0; + $sign$0 = $15; + break L13; + } + break; + } + default: + { + $c$0 = $$lcssa275; + $sign$0 = 1; + } + } while (0); + $c$179 = $c$0; + $i$078 = 0; + while (1) { + if (($c$179 | 32 | 0) != (HEAP8[16484 + $i$078 >> 0] | 0)) { + $c$1$lcssa = $c$179; + $i$0$lcssa = $i$078; + break; + } + do if ($i$078 >>> 0 < 7) { + $29 = HEAP32[$0 >> 2] | 0; + if ($29 >>> 0 < (HEAP32[$1 >> 2] | 0) >>> 0) { + HEAP32[$0 >> 2] = $29 + 1; + $c$2 = HEAPU8[$29 >> 0] | 0; + break; + } else { + $c$2 = ___shgetc($f) | 0; + break; + } + } else $c$2 = $c$179; while (0); + $36 = $i$078 + 1 | 0; + if ($36 >>> 0 < 8) { + $c$179 = $c$2; + $i$078 = $36; + } else { + $c$1$lcssa = $c$2; + $i$0$lcssa = $36; + break; + } + } + L29 : do switch ($i$0$lcssa | 0) { + case 8: + break; + case 3: + { + label = 23; + break; + } + default: + { + $39 = ($pok | 0) != 0; + if ($39 & $i$0$lcssa >>> 0 > 3) if (($i$0$lcssa | 0) == 8) break L29; else { + label = 23; + break L29; + } + L34 : do if (!$i$0$lcssa) { + $c$377 = $c$1$lcssa; + $i$276 = 0; + while (1) { + if (($c$377 | 32 | 0) != (HEAP8[18327 + $i$276 >> 0] | 0)) { + $c$5 = $c$377; + $i$3 = $i$276; + break L34; + } + do if ($i$276 >>> 0 < 2) { + $60 = HEAP32[$0 >> 2] | 0; + if ($60 >>> 0 < (HEAP32[$1 >> 2] | 0) >>> 0) { + HEAP32[$0 >> 2] = $60 + 1; + $c$4 = HEAPU8[$60 >> 0] | 0; + break; + } else { + $c$4 = ___shgetc($f) | 0; + break; + } + } else $c$4 = $c$377; while (0); + $67 = $i$276 + 1 | 0; + if ($67 >>> 0 < 3) { + $c$377 = $c$4; + $i$276 = $67; + } else { + $c$5 = $c$4; + $i$3 = $67; + break; + } + } + } else { + $c$5 = $c$1$lcssa; + $i$3 = $i$0$lcssa; + } while (0); + switch ($i$3 | 0) { + case 3: + { + $69 = HEAP32[$0 >> 2] | 0; + if ($69 >>> 0 < (HEAP32[$1 >> 2] | 0) >>> 0) { + HEAP32[$0 >> 2] = $69 + 1; + $77 = HEAPU8[$69 >> 0] | 0; + } else $77 = ___shgetc($f) | 0; + if (($77 | 0) == 40) $i$4 = 1; else { + if (!(HEAP32[$1 >> 2] | 0)) { + $$0 = nan; + break L4; + } + HEAP32[$0 >> 2] = (HEAP32[$0 >> 2] | 0) + -1; + $$0 = nan; + break L4; + } + while (1) { + $82 = HEAP32[$0 >> 2] | 0; + if ($82 >>> 0 < (HEAP32[$1 >> 2] | 0) >>> 0) { + HEAP32[$0 >> 2] = $82 + 1; + $90 = HEAPU8[$82 >> 0] | 0; + } else $90 = ___shgetc($f) | 0; + if (!(($90 + -48 | 0) >>> 0 < 10 | ($90 + -65 | 0) >>> 0 < 26)) if (!(($90 | 0) == 95 | ($90 + -97 | 0) >>> 0 < 26)) { + $$lcssa = $90; + $i$4$lcssa = $i$4; + break; + } + $i$4 = $i$4 + 1 | 0; + } + if (($$lcssa | 0) == 41) { + $$0 = nan; + break L4; + } + $99 = (HEAP32[$1 >> 2] | 0) == 0; + if (!$99) HEAP32[$0 >> 2] = (HEAP32[$0 >> 2] | 0) + -1; + if (!$39) { + $103 = ___errno_location() | 0; + HEAP32[$103 >> 2] = 22; + ___shlim($f, 0); + $$0 = 0.0; + break L4; + } + if (!$i$4$lcssa) { + $$0 = nan; + break L4; + } else $$in = $i$4$lcssa; + while (1) { + $$in = $$in + -1 | 0; + if (!$99) HEAP32[$0 >> 2] = (HEAP32[$0 >> 2] | 0) + -1; + if (!$$in) { + $$0 = nan; + break L4; + } + } + break; + } + case 0: + { + do if (($c$5 | 0) == 48) { + $115 = HEAP32[$0 >> 2] | 0; + if ($115 >>> 0 < (HEAP32[$1 >> 2] | 0) >>> 0) { + HEAP32[$0 >> 2] = $115 + 1; + $123 = HEAPU8[$115 >> 0] | 0; + } else $123 = ___shgetc($f) | 0; + if (($123 | 32 | 0) != 120) { + if (!(HEAP32[$1 >> 2] | 0)) { + $c$6 = 48; + break; + } + HEAP32[$0 >> 2] = (HEAP32[$0 >> 2] | 0) + -1; + $c$6 = 48; + break; + } + $125 = HEAP32[$0 >> 2] | 0; + if ($125 >>> 0 < (HEAP32[$1 >> 2] | 0) >>> 0) { + HEAP32[$0 >> 2] = $125 + 1; + $c$0$i = HEAPU8[$125 >> 0] | 0; + $gotdig$0$i = 0; + } else { + $c$0$i = ___shgetc($f) | 0; + $gotdig$0$i = 0; + } + L94 : while (1) { + switch ($c$0$i | 0) { + case 46: + { + $gotdig$0$i$lcssa242 = $gotdig$0$i; + label = 74; + break L94; + break; + } + case 48: + break; + default: + { + $169 = 0; + $171 = 0; + $694 = 0; + $695 = 0; + $c$2$i = $c$0$i; + $gotdig$2$i = $gotdig$0$i; + $gotrad$0$i = 0; + $gottail$0$i = 0; + $scale$0$i = 1.0; + $x$0$i = 0; + $y$0$i = 0.0; + break L94; + } + } + $132 = HEAP32[$0 >> 2] | 0; + if ($132 >>> 0 < (HEAP32[$1 >> 2] | 0) >>> 0) { + HEAP32[$0 >> 2] = $132 + 1; + $c$0$i = HEAPU8[$132 >> 0] | 0; + $gotdig$0$i = 1; + continue; + } else { + $c$0$i = ___shgetc($f) | 0; + $gotdig$0$i = 1; + continue; + } + } + if ((label | 0) == 74) { + $139 = HEAP32[$0 >> 2] | 0; + if ($139 >>> 0 < (HEAP32[$1 >> 2] | 0) >>> 0) { + HEAP32[$0 >> 2] = $139 + 1; + $c$1$ph$i = HEAPU8[$139 >> 0] | 0; + } else $c$1$ph$i = ___shgetc($f) | 0; + if (($c$1$ph$i | 0) == 48) { + $154 = 0; + $155 = 0; + while (1) { + $147 = HEAP32[$0 >> 2] | 0; + if ($147 >>> 0 < (HEAP32[$1 >> 2] | 0) >>> 0) { + HEAP32[$0 >> 2] = $147 + 1; + $159 = HEAPU8[$147 >> 0] | 0; + } else $159 = ___shgetc($f) | 0; + $156 = _i64Add($154 | 0, $155 | 0, -1, -1) | 0; + $157 = tempRet0; + if (($159 | 0) == 48) { + $154 = $156; + $155 = $157; + } else { + $169 = 0; + $171 = 0; + $694 = $156; + $695 = $157; + $c$2$i = $159; + $gotdig$2$i = 1; + $gotrad$0$i = 1; + $gottail$0$i = 0; + $scale$0$i = 1.0; + $x$0$i = 0; + $y$0$i = 0.0; + break; + } + } + } else { + $169 = 0; + $171 = 0; + $694 = 0; + $695 = 0; + $c$2$i = $c$1$ph$i; + $gotdig$2$i = $gotdig$0$i$lcssa242; + $gotrad$0$i = 1; + $gottail$0$i = 0; + $scale$0$i = 1.0; + $x$0$i = 0; + $y$0$i = 0.0; + } + } + while (1) { + $160 = $c$2$i + -48 | 0; + $$pre$i = $c$2$i | 32; + if ($160 >>> 0 < 10) label = 86; else { + $164 = ($c$2$i | 0) == 46; + if (!($164 | ($$pre$i + -97 | 0) >>> 0 < 6)) { + $213 = $171; + $214 = $694; + $216 = $169; + $217 = $695; + $c$2$lcssa$i = $c$2$i; + $gotdig$2$i$lcssa = $gotdig$2$i; + $gotrad$0$i$lcssa = $gotrad$0$i; + $x$0$i$lcssa = $x$0$i; + $y$0$i$lcssa = $y$0$i; + break; + } + if ($164) if (!$gotrad$0$i) { + $696 = $171; + $697 = $169; + $698 = $171; + $699 = $169; + $gotdig$3$i = $gotdig$2$i; + $gotrad$1$i = 1; + $gottail$2$i = $gottail$0$i; + $scale$2$i = $scale$0$i; + $x$2$i = $x$0$i; + $y$2$i = $y$0$i; + } else { + $213 = $171; + $214 = $694; + $216 = $169; + $217 = $695; + $c$2$lcssa$i = 46; + $gotdig$2$i$lcssa = $gotdig$2$i; + $gotrad$0$i$lcssa = $gotrad$0$i; + $x$0$i$lcssa = $x$0$i; + $y$0$i$lcssa = $y$0$i; + break; + } else label = 86; + } + if ((label | 0) == 86) { + label = 0; + $d$0$i = ($c$2$i | 0) > 57 ? $$pre$i + -87 | 0 : $160; + do if (($169 | 0) < 0 | ($169 | 0) == 0 & $171 >>> 0 < 8) { + $gottail$1$i = $gottail$0$i; + $scale$1$i = $scale$0$i; + $x$1$i = $d$0$i + ($x$0$i << 4) | 0; + $y$1$i = $y$0$i; + } else { + if (($169 | 0) < 0 | ($169 | 0) == 0 & $171 >>> 0 < 14) { + $183 = $scale$0$i * .0625; + $gottail$1$i = $gottail$0$i; + $scale$1$i = $183; + $x$1$i = $x$0$i; + $y$1$i = $y$0$i + $183 * +($d$0$i | 0); + break; + } + if (($gottail$0$i | 0) != 0 | ($d$0$i | 0) == 0) { + $gottail$1$i = $gottail$0$i; + $scale$1$i = $scale$0$i; + $x$1$i = $x$0$i; + $y$1$i = $y$0$i; + } else { + $gottail$1$i = 1; + $scale$1$i = $scale$0$i; + $x$1$i = $x$0$i; + $y$1$i = $y$0$i + $scale$0$i * .5; + } + } while (0); + $190 = _i64Add($171 | 0, $169 | 0, 1, 0) | 0; + $696 = $694; + $697 = $695; + $698 = $190; + $699 = tempRet0; + $gotdig$3$i = 1; + $gotrad$1$i = $gotrad$0$i; + $gottail$2$i = $gottail$1$i; + $scale$2$i = $scale$1$i; + $x$2$i = $x$1$i; + $y$2$i = $y$1$i; + } + $192 = HEAP32[$0 >> 2] | 0; + if ($192 >>> 0 < (HEAP32[$1 >> 2] | 0) >>> 0) { + HEAP32[$0 >> 2] = $192 + 1; + $169 = $699; + $171 = $698; + $694 = $696; + $695 = $697; + $c$2$i = HEAPU8[$192 >> 0] | 0; + $gotdig$2$i = $gotdig$3$i; + $gotrad$0$i = $gotrad$1$i; + $gottail$0$i = $gottail$2$i; + $scale$0$i = $scale$2$i; + $x$0$i = $x$2$i; + $y$0$i = $y$2$i; + continue; + } else { + $169 = $699; + $171 = $698; + $694 = $696; + $695 = $697; + $c$2$i = ___shgetc($f) | 0; + $gotdig$2$i = $gotdig$3$i; + $gotrad$0$i = $gotrad$1$i; + $gottail$0$i = $gottail$2$i; + $scale$0$i = $scale$2$i; + $x$0$i = $x$2$i; + $y$0$i = $y$2$i; + continue; + } + } + if (!$gotdig$2$i$lcssa) { + $201 = (HEAP32[$1 >> 2] | 0) == 0; + if (!$201) HEAP32[$0 >> 2] = (HEAP32[$0 >> 2] | 0) + -1; + if (!$pok) ___shlim($f, 0); else if (!$201) { + $205 = HEAP32[$0 >> 2] | 0; + HEAP32[$0 >> 2] = $205 + -1; + if ($gotrad$0$i$lcssa) HEAP32[$0 >> 2] = $205 + -2; + } + $$0 = +($sign$0 | 0) * 0.0; + break L4; + } + $211 = ($gotrad$0$i$lcssa | 0) == 0; + $212 = $211 ? $213 : $214; + $215 = $211 ? $216 : $217; + if (($216 | 0) < 0 | ($216 | 0) == 0 & $213 >>> 0 < 8) { + $224 = $213; + $225 = $216; + $x$324$i = $x$0$i$lcssa; + while (1) { + $223 = $x$324$i << 4; + $224 = _i64Add($224 | 0, $225 | 0, 1, 0) | 0; + $225 = tempRet0; + if (!(($225 | 0) < 0 | ($225 | 0) == 0 & $224 >>> 0 < 8)) { + $x$3$lcssa$i = $223; + break; + } else $x$324$i = $223; + } + } else $x$3$lcssa$i = $x$0$i$lcssa; + if (($c$2$lcssa$i | 32 | 0) == 112) { + $235 = _scanexp($f, $pok) | 0; + $236 = tempRet0; + if (($235 | 0) == 0 & ($236 | 0) == -2147483648) { + if (!$pok) { + ___shlim($f, 0); + $$0 = 0.0; + break L4; + } + if (!(HEAP32[$1 >> 2] | 0)) { + $253 = 0; + $254 = 0; + } else { + HEAP32[$0 >> 2] = (HEAP32[$0 >> 2] | 0) + -1; + $253 = 0; + $254 = 0; + } + } else { + $253 = $235; + $254 = $236; + } + } else if (!(HEAP32[$1 >> 2] | 0)) { + $253 = 0; + $254 = 0; + } else { + HEAP32[$0 >> 2] = (HEAP32[$0 >> 2] | 0) + -1; + $253 = 0; + $254 = 0; + } + $249 = _bitshift64Shl($212 | 0, $215 | 0, 2) | 0; + $251 = _i64Add($249 | 0, tempRet0 | 0, -32, -1) | 0; + $255 = _i64Add($251 | 0, tempRet0 | 0, $253 | 0, $254 | 0) | 0; + $256 = tempRet0; + if (!$x$3$lcssa$i) { + $$0 = +($sign$0 | 0) * 0.0; + break L4; + } + if (($256 | 0) > 0 | ($256 | 0) == 0 & $255 >>> 0 > (0 - $emin$0$ph | 0) >>> 0) { + $266 = ___errno_location() | 0; + HEAP32[$266 >> 2] = 34; + $$0 = +($sign$0 | 0) * 1797693134862315708145274.0e284 * 1797693134862315708145274.0e284; + break L4; + } + $270 = $emin$0$ph + -106 | 0; + $272 = (($270 | 0) < 0) << 31 >> 31; + if (($256 | 0) < ($272 | 0) | ($256 | 0) == ($272 | 0) & $255 >>> 0 < $270 >>> 0) { + $279 = ___errno_location() | 0; + HEAP32[$279 >> 2] = 34; + $$0 = +($sign$0 | 0) * 2.2250738585072014e-308 * 2.2250738585072014e-308; + break L4; + } + if (($x$3$lcssa$i | 0) > -1) { + $288 = $255; + $289 = $256; + $x$419$i = $x$3$lcssa$i; + $y$320$i = $y$0$i$lcssa; + while (1) { + $283 = !($y$320$i >= .5); + $287 = $283 & 1 | $x$419$i << 1; + $x$5$i = $287 ^ 1; + $y$4$i = $y$320$i + ($283 ? $y$320$i : $y$320$i + -1.0); + $290 = _i64Add($288 | 0, $289 | 0, -1, -1) | 0; + $291 = tempRet0; + if (($287 | 0) > -1) { + $288 = $290; + $289 = $291; + $x$419$i = $x$5$i; + $y$320$i = $y$4$i; + } else { + $297 = $290; + $298 = $291; + $x$4$lcssa$i = $x$5$i; + $y$3$lcssa$i = $y$4$i; + break; + } + } + } else { + $297 = $255; + $298 = $256; + $x$4$lcssa$i = $x$3$lcssa$i; + $y$3$lcssa$i = $y$0$i$lcssa; + } + $295 = _i64Subtract(32, 0, $emin$0$ph | 0, (($emin$0$ph | 0) < 0) << 31 >> 31 | 0) | 0; + $299 = _i64Add($297 | 0, $298 | 0, $295 | 0, tempRet0 | 0) | 0; + $300 = tempRet0; + if (0 > ($300 | 0) | 0 == ($300 | 0) & $bits$0$ph >>> 0 > $299 >>> 0) if (($299 | 0) < 0) { + $$0710$i = 0; + label = 127; + } else { + $$07$i = $299; + label = 125; + } else { + $$07$i = $bits$0$ph; + label = 125; + } + if ((label | 0) == 125) if (($$07$i | 0) < 53) { + $$0710$i = $$07$i; + label = 127; + } else { + $$0711$i = $$07$i; + $$pre$phi42$iZ2D = +($sign$0 | 0); + $bias$0$i = 0.0; + } + if ((label | 0) == 127) { + $310 = +($sign$0 | 0); + $$0711$i = $$0710$i; + $$pre$phi42$iZ2D = $310; + $bias$0$i = +_copysignl(+_scalbn(1.0, 84 - $$0710$i | 0), $310); + } + $or$cond9$i = ($x$4$lcssa$i & 1 | 0) == 0 & ($y$3$lcssa$i != 0.0 & ($$0711$i | 0) < 32); + $322 = $$pre$phi42$iZ2D * ($or$cond9$i ? 0.0 : $y$3$lcssa$i) + ($bias$0$i + $$pre$phi42$iZ2D * +((($or$cond9$i & 1) + $x$4$lcssa$i | 0) >>> 0)) - $bias$0$i; + if (!($322 != 0.0)) { + $324 = ___errno_location() | 0; + HEAP32[$324 >> 2] = 34; + } + $$0 = +_scalbnl($322, $297); + break L4; + } else $c$6 = $c$5; while (0); + $sum$i = $emin$0$ph + $bits$0$ph | 0; + $330 = 0 - $sum$i | 0; + $$09$i = $c$6; + $gotdig$0$i12 = 0; + L184 : while (1) { + switch ($$09$i | 0) { + case 46: + { + $gotdig$0$i12$lcssa273 = $gotdig$0$i12; + label = 138; + break L184; + break; + } + case 48: + break; + default: + { + $$2$i = $$09$i; + $700 = 0; + $701 = 0; + $gotdig$2$i13 = $gotdig$0$i12; + $gotrad$0$i14 = 0; + break L184; + } + } + $331 = HEAP32[$0 >> 2] | 0; + if ($331 >>> 0 < (HEAP32[$1 >> 2] | 0) >>> 0) { + HEAP32[$0 >> 2] = $331 + 1; + $$09$i = HEAPU8[$331 >> 0] | 0; + $gotdig$0$i12 = 1; + continue; + } else { + $$09$i = ___shgetc($f) | 0; + $gotdig$0$i12 = 1; + continue; + } + } + if ((label | 0) == 138) { + $338 = HEAP32[$0 >> 2] | 0; + if ($338 >>> 0 < (HEAP32[$1 >> 2] | 0) >>> 0) { + HEAP32[$0 >> 2] = $338 + 1; + $$1$ph$i = HEAPU8[$338 >> 0] | 0; + } else $$1$ph$i = ___shgetc($f) | 0; + if (($$1$ph$i | 0) == 48) { + $346 = 0; + $347 = 0; + while (1) { + $348 = _i64Add($346 | 0, $347 | 0, -1, -1) | 0; + $349 = tempRet0; + $350 = HEAP32[$0 >> 2] | 0; + if ($350 >>> 0 < (HEAP32[$1 >> 2] | 0) >>> 0) { + HEAP32[$0 >> 2] = $350 + 1; + $$1$be$i = HEAPU8[$350 >> 0] | 0; + } else $$1$be$i = ___shgetc($f) | 0; + if (($$1$be$i | 0) == 48) { + $346 = $348; + $347 = $349; + } else { + $$2$i = $$1$be$i; + $700 = $348; + $701 = $349; + $gotdig$2$i13 = 1; + $gotrad$0$i14 = 1; + break; + } + } + } else { + $$2$i = $$1$ph$i; + $700 = 0; + $701 = 0; + $gotdig$2$i13 = $gotdig$0$i12$lcssa273; + $gotrad$0$i14 = 1; + } + } + HEAP32[$x$i >> 2] = 0; + $358 = $$2$i + -48 | 0; + $360 = ($$2$i | 0) == 46; + L203 : do if ($360 | $358 >>> 0 < 10) { + $362 = $x$i + 496 | 0; + $$3105$i = $$2$i; + $365 = 0; + $366 = 0; + $702 = $360; + $703 = $358; + $704 = $700; + $705 = $701; + $gotdig$3101$i = $gotdig$2$i13; + $gotrad$1102$i = $gotrad$0$i14; + $j$0104$i = 0; + $k$0103$i = 0; + $lnz$0100$i = 0; + L205 : while (1) { + do if ($702) if (!$gotrad$1102$i) { + $706 = $365; + $707 = $366; + $708 = $365; + $709 = $366; + $gotdig$4$i = $gotdig$3101$i; + $gotrad$2$i = 1; + $j$2$i = $j$0104$i; + $k$2$i = $k$0103$i; + $lnz$2$i = $lnz$0100$i; + } else { + $710 = $704; + $711 = $705; + $712 = $365; + $713 = $366; + $gotdig$3101$i$lcssa = $gotdig$3101$i; + $j$0104$i$lcssa = $j$0104$i; + $k$0103$i$lcssa = $k$0103$i; + $lnz$0100$i$lcssa = $lnz$0100$i; + break L205; + } else { + $367 = _i64Add($365 | 0, $366 | 0, 1, 0) | 0; + $368 = tempRet0; + $369 = ($$3105$i | 0) != 48; + if (($k$0103$i | 0) >= 125) { + if (!$369) { + $706 = $704; + $707 = $705; + $708 = $367; + $709 = $368; + $gotdig$4$i = $gotdig$3101$i; + $gotrad$2$i = $gotrad$1102$i; + $j$2$i = $j$0104$i; + $k$2$i = $k$0103$i; + $lnz$2$i = $lnz$0100$i; + break; + } + HEAP32[$362 >> 2] = HEAP32[$362 >> 2] | 1; + $706 = $704; + $707 = $705; + $708 = $367; + $709 = $368; + $gotdig$4$i = $gotdig$3101$i; + $gotrad$2$i = $gotrad$1102$i; + $j$2$i = $j$0104$i; + $k$2$i = $k$0103$i; + $lnz$2$i = $lnz$0100$i; + break; + } + $371 = $x$i + ($k$0103$i << 2) | 0; + if (!$j$0104$i) $storemerge$i = $703; else $storemerge$i = $$3105$i + -48 + ((HEAP32[$371 >> 2] | 0) * 10 | 0) | 0; + HEAP32[$371 >> 2] = $storemerge$i; + $376 = $j$0104$i + 1 | 0; + $377 = ($376 | 0) == 9; + $706 = $704; + $707 = $705; + $708 = $367; + $709 = $368; + $gotdig$4$i = 1; + $gotrad$2$i = $gotrad$1102$i; + $j$2$i = $377 ? 0 : $376; + $k$2$i = ($377 & 1) + $k$0103$i | 0; + $lnz$2$i = $369 ? $367 : $lnz$0100$i; + } while (0); + $381 = HEAP32[$0 >> 2] | 0; + if ($381 >>> 0 < (HEAP32[$1 >> 2] | 0) >>> 0) { + HEAP32[$0 >> 2] = $381 + 1; + $$3$be$i = HEAPU8[$381 >> 0] | 0; + } else $$3$be$i = ___shgetc($f) | 0; + $703 = $$3$be$i + -48 | 0; + $702 = ($$3$be$i | 0) == 46; + if (!($702 | $703 >>> 0 < 10)) { + $$3$lcssa$i = $$3$be$i; + $394 = $708; + $395 = $706; + $397 = $709; + $398 = $707; + $gotdig$3$lcssa$i = $gotdig$4$i; + $gotrad$1$lcssa$i = $gotrad$2$i; + $j$0$lcssa$i = $j$2$i; + $k$0$lcssa$i = $k$2$i; + $lnz$0$lcssa$i = $lnz$2$i; + label = 161; + break L203; + } else { + $$3105$i = $$3$be$i; + $365 = $708; + $366 = $709; + $704 = $706; + $705 = $707; + $gotdig$3101$i = $gotdig$4$i; + $gotrad$1102$i = $gotrad$2$i; + $j$0104$i = $j$2$i; + $k$0103$i = $k$2$i; + $lnz$0100$i = $lnz$2$i; + } + } + $714 = $712; + $715 = $713; + $716 = $710; + $717 = $711; + $718 = ($gotdig$3101$i$lcssa | 0) != 0; + $j$069$i = $j$0104$i$lcssa; + $k$065$i = $k$0103$i$lcssa; + $lnz$059$i = $lnz$0100$i$lcssa; + label = 169; + } else { + $$3$lcssa$i = $$2$i; + $394 = 0; + $395 = $700; + $397 = 0; + $398 = $701; + $gotdig$3$lcssa$i = $gotdig$2$i13; + $gotrad$1$lcssa$i = $gotrad$0$i14; + $j$0$lcssa$i = 0; + $k$0$lcssa$i = 0; + $lnz$0$lcssa$i = 0; + label = 161; + } while (0); + do if ((label | 0) == 161) { + $392 = ($gotrad$1$lcssa$i | 0) == 0; + $393 = $392 ? $394 : $395; + $396 = $392 ? $397 : $398; + $399 = ($gotdig$3$lcssa$i | 0) != 0; + if (!(($$3$lcssa$i | 32 | 0) == 101 & $399)) if (($$3$lcssa$i | 0) > -1) { + $714 = $394; + $715 = $397; + $716 = $393; + $717 = $396; + $718 = $399; + $j$069$i = $j$0$lcssa$i; + $k$065$i = $k$0$lcssa$i; + $lnz$059$i = $lnz$0$lcssa$i; + label = 169; + break; + } else { + $719 = $394; + $720 = $397; + $721 = $399; + $722 = $393; + $723 = $396; + $j$068$i = $j$0$lcssa$i; + $k$064$i = $k$0$lcssa$i; + $lnz$058$i = $lnz$0$lcssa$i; + label = 171; + break; + } + $402 = _scanexp($f, $pok) | 0; + $403 = tempRet0; + if (($402 | 0) == 0 & ($403 | 0) == -2147483648) { + if (!$pok) { + ___shlim($f, 0); + $$0$i27 = 0.0; + break; + } + if (!(HEAP32[$1 >> 2] | 0)) { + $412 = 0; + $413 = 0; + } else { + HEAP32[$0 >> 2] = (HEAP32[$0 >> 2] | 0) + -1; + $412 = 0; + $413 = 0; + } + } else { + $412 = $402; + $413 = $403; + } + $414 = _i64Add($412 | 0, $413 | 0, $393 | 0, $396 | 0) | 0; + $427 = $414; + $428 = $394; + $430 = tempRet0; + $431 = $397; + $j$067$i = $j$0$lcssa$i; + $k$063$i = $k$0$lcssa$i; + $lnz$057$i = $lnz$0$lcssa$i; + label = 173; + } while (0); + if ((label | 0) == 169) if (!(HEAP32[$1 >> 2] | 0)) { + $719 = $714; + $720 = $715; + $721 = $718; + $722 = $716; + $723 = $717; + $j$068$i = $j$069$i; + $k$064$i = $k$065$i; + $lnz$058$i = $lnz$059$i; + label = 171; + } else { + HEAP32[$0 >> 2] = (HEAP32[$0 >> 2] | 0) + -1; + if ($718) { + $427 = $716; + $428 = $714; + $430 = $717; + $431 = $715; + $j$067$i = $j$069$i; + $k$063$i = $k$065$i; + $lnz$057$i = $lnz$059$i; + label = 173; + } else label = 172; + } + if ((label | 0) == 171) if ($721) { + $427 = $722; + $428 = $719; + $430 = $723; + $431 = $720; + $j$067$i = $j$068$i; + $k$063$i = $k$064$i; + $lnz$057$i = $lnz$058$i; + label = 173; + } else label = 172; + do if ((label | 0) == 172) { + $421 = ___errno_location() | 0; + HEAP32[$421 >> 2] = 22; + ___shlim($f, 0); + $$0$i27 = 0.0; + } else if ((label | 0) == 173) { + $422 = HEAP32[$x$i >> 2] | 0; + if (!$422) { + $$0$i27 = +($sign$0 | 0) * 0.0; + break; + } + if ((($431 | 0) < 0 | ($431 | 0) == 0 & $428 >>> 0 < 10) & (($427 | 0) == ($428 | 0) & ($430 | 0) == ($431 | 0))) if ($bits$0$ph >>> 0 > 30 | ($422 >>> $bits$0$ph | 0) == 0) { + $$0$i27 = +($sign$0 | 0) * +($422 >>> 0); + break; + } + $444 = ($emin$0$ph | 0) / -2 | 0; + $446 = (($444 | 0) < 0) << 31 >> 31; + if (($430 | 0) > ($446 | 0) | ($430 | 0) == ($446 | 0) & $427 >>> 0 > $444 >>> 0) { + $452 = ___errno_location() | 0; + HEAP32[$452 >> 2] = 34; + $$0$i27 = +($sign$0 | 0) * 1797693134862315708145274.0e284 * 1797693134862315708145274.0e284; + break; + } + $456 = $emin$0$ph + -106 | 0; + $458 = (($456 | 0) < 0) << 31 >> 31; + if (($430 | 0) < ($458 | 0) | ($430 | 0) == ($458 | 0) & $427 >>> 0 < $456 >>> 0) { + $464 = ___errno_location() | 0; + HEAP32[$464 >> 2] = 34; + $$0$i27 = +($sign$0 | 0) * 2.2250738585072014e-308 * 2.2250738585072014e-308; + break; + } + if (!$j$067$i) $k$3$i = $k$063$i; else { + if (($j$067$i | 0) < 9) { + $470 = $x$i + ($k$063$i << 2) | 0; + $472 = HEAP32[$470 >> 2] | 0; + $j$394$i = $j$067$i; + while (1) { + $471 = $472 * 10 | 0; + $j$394$i = $j$394$i + 1 | 0; + if (($j$394$i | 0) == 9) { + $$lcssa265 = $471; + break; + } else $472 = $471; + } + HEAP32[$470 >> 2] = $$lcssa265; + } + $k$3$i = $k$063$i + 1 | 0; + } + if (($lnz$057$i | 0) < 9) if (($lnz$057$i | 0) <= ($427 | 0) & ($427 | 0) < 18) { + if (($427 | 0) == 9) { + $$0$i27 = +($sign$0 | 0) * +((HEAP32[$x$i >> 2] | 0) >>> 0); + break; + } + if (($427 | 0) < 9) { + $$0$i27 = +($sign$0 | 0) * +((HEAP32[$x$i >> 2] | 0) >>> 0) / +(HEAP32[2648 + (8 - $427 << 2) >> 2] | 0); + break; + } + $494 = $bits$0$ph + 27 + (Math_imul($427, -3) | 0) | 0; + $$pre$i17 = HEAP32[$x$i >> 2] | 0; + if (($494 | 0) > 30 | ($$pre$i17 >>> $494 | 0) == 0) { + $$0$i27 = +($sign$0 | 0) * +($$pre$i17 >>> 0) * +(HEAP32[2648 + ($427 + -10 << 2) >> 2] | 0); + break; + } + } + $506 = ($427 | 0) % 9 | 0; + if (!$506) { + $a$2$ph38$i = 0; + $e2$0$ph$i = 0; + $rp$2$ph36$i = $427; + $z$1$ph37$i = $k$3$i; + } else { + $510 = ($427 | 0) > -1 ? $506 : $506 + 9 | 0; + $513 = HEAP32[2648 + (8 - $510 << 2) >> 2] | 0; + if (!$k$3$i) { + $a$0$lcssa151$i = 0; + $rp$0$lcssa152$i = $427; + $z$0$i = 0; + } else { + $515 = 1e9 / ($513 | 0) | 0; + $a$085$i = 0; + $carry$087$i = 0; + $k$486$i = 0; + $rp$084$i = $427; + while (1) { + $516 = $x$i + ($k$486$i << 2) | 0; + $517 = HEAP32[$516 >> 2] | 0; + $520 = (($517 >>> 0) / ($513 >>> 0) | 0) + $carry$087$i | 0; + HEAP32[$516 >> 2] = $520; + $521 = Math_imul(($517 >>> 0) % ($513 >>> 0) | 0, $515) | 0; + $or$cond16$i = ($k$486$i | 0) == ($a$085$i | 0) & ($520 | 0) == 0; + $k$486$i = $k$486$i + 1 | 0; + $rp$1$i18 = $or$cond16$i ? $rp$084$i + -9 | 0 : $rp$084$i; + $a$1$i = $or$cond16$i ? $k$486$i & 127 : $a$085$i; + if (($k$486$i | 0) == ($k$3$i | 0)) { + $$lcssa264 = $521; + $a$1$i$lcssa = $a$1$i; + $rp$1$i18$lcssa = $rp$1$i18; + break; + } else { + $a$085$i = $a$1$i; + $carry$087$i = $521; + $rp$084$i = $rp$1$i18; + } + } + if (!$$lcssa264) { + $a$0$lcssa151$i = $a$1$i$lcssa; + $rp$0$lcssa152$i = $rp$1$i18$lcssa; + $z$0$i = $k$3$i; + } else { + HEAP32[$x$i + ($k$3$i << 2) >> 2] = $$lcssa264; + $a$0$lcssa151$i = $a$1$i$lcssa; + $rp$0$lcssa152$i = $rp$1$i18$lcssa; + $z$0$i = $k$3$i + 1 | 0; + } + } + $a$2$ph38$i = $a$0$lcssa151$i; + $e2$0$ph$i = 0; + $rp$2$ph36$i = 9 - $510 + $rp$0$lcssa152$i | 0; + $z$1$ph37$i = $z$0$i; + } + L284 : while (1) { + $533 = ($rp$2$ph36$i | 0) < 18; + $534 = ($rp$2$ph36$i | 0) == 18; + $535 = $x$i + ($a$2$ph38$i << 2) | 0; + $e2$0$i19 = $e2$0$ph$i; + $z$1$i = $z$1$ph37$i; + while (1) { + if (!$533) { + if (!$534) { + $a$3$ph$i = $a$2$ph38$i; + $e2$1$ph$i = $e2$0$i19; + $rp$3$ph34$i = $rp$2$ph36$i; + $z$5$ph$i = $z$1$i; + break L284; + } + if ((HEAP32[$535 >> 2] | 0) >>> 0 >= 9007199) { + $a$3$ph$i = $a$2$ph38$i; + $e2$1$ph$i = $e2$0$i19; + $rp$3$ph34$i = 18; + $z$5$ph$i = $z$1$i; + break L284; + } + } + $carry1$0$i = 0; + $k$5$in$i = $z$1$i + 127 | 0; + $z$2$i = $z$1$i; + while (1) { + $k$5$i = $k$5$in$i & 127; + $539 = $x$i + ($k$5$i << 2) | 0; + $541 = _bitshift64Shl(HEAP32[$539 >> 2] | 0, 0, 29) | 0; + $543 = _i64Add($541 | 0, tempRet0 | 0, $carry1$0$i | 0, 0) | 0; + $544 = tempRet0; + if ($544 >>> 0 > 0 | ($544 | 0) == 0 & $543 >>> 0 > 1e9) { + $550 = ___udivdi3($543 | 0, $544 | 0, 1e9, 0) | 0; + $552 = ___uremdi3($543 | 0, $544 | 0, 1e9, 0) | 0; + $$sink$off0$i = $552; + $carry1$1$i = $550; + } else { + $$sink$off0$i = $543; + $carry1$1$i = 0; + } + HEAP32[$539 >> 2] = $$sink$off0$i; + $557 = ($k$5$i | 0) == ($a$2$ph38$i | 0); + $z$3$i = ($k$5$i | 0) != ($z$2$i + 127 & 127 | 0) | $557 ? $z$2$i : ($$sink$off0$i | 0) == 0 ? $k$5$i : $z$2$i; + if ($557) { + $carry1$1$i$lcssa = $carry1$1$i; + $z$3$i$lcssa = $z$3$i; + break; + } else { + $carry1$0$i = $carry1$1$i; + $k$5$in$i = $k$5$i + -1 | 0; + $z$2$i = $z$3$i; + } + } + $560 = $e2$0$i19 + -29 | 0; + if (!$carry1$1$i$lcssa) { + $e2$0$i19 = $560; + $z$1$i = $z$3$i$lcssa; + } else { + $$lcssa263 = $560; + $carry1$1$i$lcssa$lcssa = $carry1$1$i$lcssa; + $z$3$i$lcssa$lcssa = $z$3$i$lcssa; + break; + } + } + $564 = $a$2$ph38$i + 127 & 127; + if (($564 | 0) == ($z$3$i$lcssa$lcssa | 0)) { + $567 = $z$3$i$lcssa$lcssa + 127 & 127; + $572 = $x$i + (($z$3$i$lcssa$lcssa + 126 & 127) << 2) | 0; + HEAP32[$572 >> 2] = HEAP32[$572 >> 2] | HEAP32[$x$i + ($567 << 2) >> 2]; + $z$4$i = $567; + } else $z$4$i = $z$3$i$lcssa$lcssa; + HEAP32[$x$i + ($564 << 2) >> 2] = $carry1$1$i$lcssa$lcssa; + $a$2$ph38$i = $564; + $e2$0$ph$i = $$lcssa263; + $rp$2$ph36$i = $rp$2$ph36$i + 9 | 0; + $z$1$ph37$i = $z$4$i; + } + L302 : while (1) { + $604 = $z$5$ph$i + 1 & 127; + $609 = $x$i + (($z$5$ph$i + 127 & 127) << 2) | 0; + $a$3$ph157$i = $a$3$ph$i; + $e2$1$ph156$i = $e2$1$ph$i; + $rp$3$ph$i = $rp$3$ph34$i; + while (1) { + $610 = ($rp$3$ph$i | 0) == 18; + $$18$i = ($rp$3$ph$i | 0) > 27 ? 9 : 1; + $$not$i = $610 ^ 1; + $a$3$i = $a$3$ph157$i; + $e2$1$i = $e2$1$ph156$i; + while (1) { + $576 = $a$3$i & 127; + $577 = ($576 | 0) == ($z$5$ph$i | 0); + do if ($577) label = 219; else { + $579 = HEAP32[$x$i + ($576 << 2) >> 2] | 0; + if ($579 >>> 0 < 9007199) { + label = 219; + break; + } + if ($579 >>> 0 > 9007199) break; + $583 = $a$3$i + 1 & 127; + if (($583 | 0) == ($z$5$ph$i | 0)) { + label = 219; + break; + } + $691 = HEAP32[$x$i + ($583 << 2) >> 2] | 0; + if ($691 >>> 0 < 254740991) { + label = 219; + break; + } + if (!($691 >>> 0 > 254740991 | $$not$i)) { + $617 = $576; + $a$3$i249 = $a$3$i; + $e2$1$i246 = $e2$1$i; + $z$7$i = $z$5$ph$i; + break L302; + } + } while (0); + if ((label | 0) == 219) { + label = 0; + if ($610) { + label = 220; + break L302; + } + } + $585 = $e2$1$i + $$18$i | 0; + if (($a$3$i | 0) == ($z$5$ph$i | 0)) { + $a$3$i = $z$5$ph$i; + $e2$1$i = $585; + } else { + $$lcssa256 = $585; + $a$3$i$lcssa248 = $a$3$i; + break; + } + } + $588 = (1 << $$18$i) + -1 | 0; + $589 = 1e9 >>> $$18$i; + $a$478$i = $a$3$i$lcssa248; + $carry3$081$i = 0; + $k$679$i = $a$3$i$lcssa248; + $rp$477$i = $rp$3$ph$i; + while (1) { + $590 = $x$i + ($k$679$i << 2) | 0; + $591 = HEAP32[$590 >> 2] | 0; + $594 = ($591 >>> $$18$i) + $carry3$081$i | 0; + HEAP32[$590 >> 2] = $594; + $595 = Math_imul($591 & $588, $589) | 0; + $or$cond19$i = ($k$679$i | 0) == ($a$478$i | 0) & ($594 | 0) == 0; + $k$679$i = $k$679$i + 1 & 127; + $rp$5$i = $or$cond19$i ? $rp$477$i + -9 | 0 : $rp$477$i; + $a$5$i = $or$cond19$i ? $k$679$i : $a$478$i; + if (($k$679$i | 0) == ($z$5$ph$i | 0)) { + $$lcssa257 = $595; + $a$5$i$lcssa = $a$5$i; + $rp$5$i$lcssa = $rp$5$i; + break; + } else { + $a$478$i = $a$5$i; + $carry3$081$i = $595; + $rp$477$i = $rp$5$i; + } + } + if (!$$lcssa257) { + $a$3$ph157$i = $a$5$i$lcssa; + $e2$1$ph156$i = $$lcssa256; + $rp$3$ph$i = $rp$5$i$lcssa; + continue; + } + if (($604 | 0) != ($a$5$i$lcssa | 0)) { + $$lcssa256$lcssa = $$lcssa256; + $$lcssa257$lcssa = $$lcssa257; + $a$5$i$lcssa$lcssa = $a$5$i$lcssa; + $rp$5$i$lcssa$lcssa = $rp$5$i$lcssa; + break; + } + HEAP32[$609 >> 2] = HEAP32[$609 >> 2] | 1; + $a$3$ph157$i = $a$5$i$lcssa; + $e2$1$ph156$i = $$lcssa256; + $rp$3$ph$i = $rp$5$i$lcssa; + } + HEAP32[$x$i + ($z$5$ph$i << 2) >> 2] = $$lcssa257$lcssa; + $a$3$ph$i = $a$5$i$lcssa$lcssa; + $e2$1$ph$i = $$lcssa256$lcssa; + $rp$3$ph34$i = $rp$5$i$lcssa$lcssa; + $z$5$ph$i = $604; + } + if ((label | 0) == 220) if ($577) { + HEAP32[$x$i + ($604 + -1 << 2) >> 2] = 0; + $617 = $z$5$ph$i; + $a$3$i249 = $a$3$i; + $e2$1$i246 = $e2$1$i; + $z$7$i = $604; + } else { + $617 = $576; + $a$3$i249 = $a$3$i; + $e2$1$i246 = $e2$1$i; + $z$7$i = $z$5$ph$i; + } + $619 = +((HEAP32[$x$i + ($617 << 2) >> 2] | 0) >>> 0); + $621 = $a$3$i249 + 1 & 127; + if (($621 | 0) == ($z$7$i | 0)) { + $680 = $a$3$i249 + 2 & 127; + HEAP32[$x$i + ($680 + -1 << 2) >> 2] = 0; + $z$7$1$i = $680; + } else $z$7$1$i = $z$7$i; + $643 = +($sign$0 | 0); + $625 = $643 * ($619 * 1.0e9 + +((HEAP32[$x$i + ($621 << 2) >> 2] | 0) >>> 0)); + $663 = $e2$1$i246 + 53 | 0; + $669 = $663 - $emin$0$ph | 0; + $670 = ($669 | 0) < ($bits$0$ph | 0); + $denormal$0$i = $670 & 1; + $$010$i = $670 ? (($669 | 0) < 0 ? 0 : $669) : $bits$0$ph; + if (($$010$i | 0) < 53) { + $626 = +_copysignl(+_scalbn(1.0, 105 - $$010$i | 0), $625); + $629 = +_fmodl($625, +_scalbn(1.0, 53 - $$010$i | 0)); + $bias$0$i25 = $626; + $frac$0$i = $629; + $y$1$i24 = $626 + ($625 - $629); + } else { + $bias$0$i25 = 0.0; + $frac$0$i = 0.0; + $y$1$i24 = $625; + } + $633 = $a$3$i249 + 2 & 127; + do if (($633 | 0) == ($z$7$1$i | 0)) $frac$2$i = $frac$0$i; else { + $636 = HEAP32[$x$i + ($633 << 2) >> 2] | 0; + do if ($636 >>> 0 < 5e8) { + if (!$636) if (($a$3$i249 + 3 & 127 | 0) == ($z$7$1$i | 0)) { + $frac$1$i = $frac$0$i; + break; + } + $frac$1$i = $643 * .25 + $frac$0$i; + } else { + if ($636 >>> 0 > 5e8) { + $frac$1$i = $643 * .75 + $frac$0$i; + break; + } + if (($a$3$i249 + 3 & 127 | 0) == ($z$7$1$i | 0)) { + $frac$1$i = $643 * .5 + $frac$0$i; + break; + } else { + $frac$1$i = $643 * .75 + $frac$0$i; + break; + } + } while (0); + if ((53 - $$010$i | 0) <= 1) { + $frac$2$i = $frac$1$i; + break; + } + if (+_fmodl($frac$1$i, 1.0) != 0.0) { + $frac$2$i = $frac$1$i; + break; + } + $frac$2$i = $frac$1$i + 1.0; + } while (0); + $661 = $y$1$i24 + $frac$2$i - $bias$0$i25; + do if (($663 & 2147483647 | 0) > (-2 - $sum$i | 0)) { + if (!(+Math_abs(+$661) >= 9007199254740992.0)) { + $denormal$2$i = $denormal$0$i; + $e2$2$i = $e2$1$i246; + $y$2$i26 = $661; + } else { + $denormal$2$i = $670 & ($$010$i | 0) == ($669 | 0) ? 0 : $denormal$0$i; + $e2$2$i = $e2$1$i246 + 1 | 0; + $y$2$i26 = $661 * .5; + } + if (($e2$2$i + 50 | 0) <= ($330 | 0)) if (!($frac$2$i != 0.0 & ($denormal$2$i | 0) != 0)) { + $e2$3$i = $e2$2$i; + $y$3$i = $y$2$i26; + break; + } + $677 = ___errno_location() | 0; + HEAP32[$677 >> 2] = 34; + $e2$3$i = $e2$2$i; + $y$3$i = $y$2$i26; + } else { + $e2$3$i = $e2$1$i246; + $y$3$i = $661; + } while (0); + $$0$i27 = +_scalbnl($y$3$i, $e2$3$i); + } while (0); + $$0 = $$0$i27; + break L4; + break; + } + default: + { + if (HEAP32[$1 >> 2] | 0) HEAP32[$0 >> 2] = (HEAP32[$0 >> 2] | 0) + -1; + $113 = ___errno_location() | 0; + HEAP32[$113 >> 2] = 22; + ___shlim($f, 0); + $$0 = 0.0; + break L4; + } + } + } + } while (0); + if ((label | 0) == 23) { + $42 = (HEAP32[$1 >> 2] | 0) == 0; + if (!$42) HEAP32[$0 >> 2] = (HEAP32[$0 >> 2] | 0) + -1; + if (($pok | 0) != 0 & $i$0$lcssa >>> 0 > 3) { + $i$1 = $i$0$lcssa; + do { + if (!$42) HEAP32[$0 >> 2] = (HEAP32[$0 >> 2] | 0) + -1; + $i$1 = $i$1 + -1 | 0; + } while ($i$1 >>> 0 > 3); + } + } + $$0 = +($sign$0 | 0) * inf; + } while (0); + STACKTOP = sp; + return +$$0; +} + +function __ZN10__cxxabiv112_GLOBAL__N_110parse_nameINS0_2DbEEEPKcS4_S4_RT_($first, $last, $db) { + $first = $first | 0; + $last = $last | 0; + $db = $db | 0; + var $$0$i = 0, $$0$i$i$i = 0, $$0$i$i$i$i = 0, $$0$i$i$i16$i = 0, $$0$i$i$i23$i = 0, $$0$i$i$i33$i = 0, $$0$i$i$i42$i = 0, $$0$i$i$i52$i = 0, $$0$i10 = 0, $$02 = 0, $$07$i = 0, $$first = 0, $0 = 0, $1 = 0, $10 = 0, $100 = 0, $101 = 0, $102 = 0, $103 = 0, $104 = 0, $105 = 0, $106 = 0, $107 = 0, $108 = 0, $109 = 0, $11 = 0, $110 = 0, $111 = 0, $112 = 0, $113 = 0, $114 = 0, $115 = 0, $116 = 0, $117 = 0, $118 = 0, $119 = 0, $12 = 0, $120 = 0, $121 = 0, $123 = 0, $124 = 0, $125 = 0, $126 = 0, $129 = 0, $13 = 0, $130 = 0, $134 = 0, $139 = 0, $14 = 0, $140 = 0, $141 = 0, $142 = 0, $144 = 0, $145 = 0, $15 = 0, $153 = 0, $154 = 0, $156 = 0, $16 = 0, $164 = 0, $166 = 0, $167 = 0, $180 = 0, $181 = 0, $182 = 0, $183 = 0, $186 = 0, $189 = 0, $192 = 0, $2 = 0, $201 = 0, $206 = 0, $207 = 0, $208 = 0, $209 = 0, $211 = 0, $212 = 0, $220 = 0, $221 = 0, $223 = 0, $23 = 0, $231 = 0, $233 = 0, $234 = 0, $247 = 0, $248 = 0, $249 = 0, $250 = 0, $253 = 0, $256 = 0, $259 = 0, $268 = 0, $271 = 0, $276 = 0, $277 = 0, $278 = 0, $279 = 0, $28 = 0, $281 = 0, $282 = 0, $290 = 0, $291 = 0, $293 = 0, $3 = 0, $30 = 0, $301 = 0, $303 = 0, $304 = 0, $317 = 0, $318 = 0, $319 = 0, $320 = 0, $323 = 0, $326 = 0, $329 = 0, $338 = 0, $34 = 0, $343 = 0, $344 = 0, $345 = 0, $346 = 0, $349 = 0, $35 = 0, $351 = 0, $359 = 0, $361 = 0, $362 = 0, $37 = 0, $375 = 0, $376 = 0, $377 = 0, $378 = 0, $381 = 0, $384 = 0, $387 = 0, $398 = 0, $4 = 0, $400 = 0, $405 = 0, $406 = 0, $407 = 0, $408 = 0, $41 = 0, $410 = 0, $411 = 0, $419 = 0, $420 = 0, $422 = 0, $430 = 0, $432 = 0, $433 = 0, $446 = 0, $447 = 0, $448 = 0, $449 = 0, $452 = 0, $455 = 0, $458 = 0, $469 = 0, $474 = 0, $476 = 0, $477 = 0, $478 = 0, $483 = 0, $484 = 0, $489 = 0, $49 = 0, $494 = 0, $497 = 0, $5 = 0, $50 = 0, $500 = 0, $502 = 0, $506 = 0, $507 = 0, $509 = 0, $51 = 0, $510 = 0, $518 = 0, $519 = 0, $52 = 0, $520 = 0, $521 = 0, $526 = 0, $528 = 0, $538 = 0, $539 = 0, $540 = 0, $542 = 0, $544 = 0, $545 = 0, $546 = 0, $554 = 0, $555 = 0, $556 = 0, $557 = 0, $56 = 0, $562 = 0, $564 = 0, $574 = 0, $575 = 0, $576 = 0, $577 = 0, $578 = 0, $58 = 0, $588 = 0, $593 = 0, $594 = 0, $597 = 0, $6 = 0, $605 = 0, $606 = 0, $608 = 0, $61 = 0, $612 = 0, $613 = 0, $615 = 0, $62 = 0, $622 = 0, $624 = 0, $632 = 0, $633 = 0, $634 = 0, $635 = 0, $638 = 0, $641 = 0, $644 = 0, $645 = 0, $65 = 0, $651 = 0, $653 = 0, $657 = 0, $659 = 0, $667 = 0, $668 = 0, $669 = 0, $670 = 0, $673 = 0, $675 = 0, $685 = 0, $690 = 0, $692 = 0, $693 = 0, $7 = 0, $701 = 0, $702 = 0, $703 = 0, $704 = 0, $707 = 0, $709 = 0, $719 = 0, $8 = 0, $81 = 0, $82 = 0, $83 = 0, $84 = 0, $85 = 0, $86 = 0, $87 = 0, $88 = 0, $89 = 0, $9 = 0, $90 = 0, $91 = 0, $92 = 0, $93 = 0, $94 = 0, $95 = 0, $96 = 0, $97 = 0, $98 = 0, $99 = 0, $St$0$off0$i = 0, $__v$i$i51$i = 0, $cv$i = 0, $name$i11 = 0, $name1$i = 0, $name2$i12 = 0, $name3$i = 0, $name4$i = 0, $pop_subs$0$off0$i$ph$lcssa = 0, $pop_subs$0$off0$i$ph136 = 0, $t0$0$i = 0, $t0$0$i13 = 0, $t0$1$i = 0, $t0$2$i$be = 0, $t0$2$i$lcssa = 0, $t0$2$i$ph$be = 0, $t0$2$i$ph135 = 0, $t0$2$i131 = 0, $t0$2$i131$lcssa177 = 0, $t0$2$i131$lcssa178 = 0, $t0$2$i131$lcssa179 = 0, $t0$2$i131184 = 0, $tmp = 0, $tmp3 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 304 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $__v$i$i51$i = sp + 276 | 0; + $cv$i = sp + 264 | 0; + $name$i11 = sp + 252 | 0; + $0 = sp + 240 | 0; + $1 = sp + 224 | 0; + $2 = sp + 216 | 0; + $name1$i = sp + 204 | 0; + $3 = sp + 192 | 0; + $4 = sp + 176 | 0; + $5 = sp + 168 | 0; + $name2$i12 = sp + 156 | 0; + $6 = sp + 144 | 0; + $7 = sp + 128 | 0; + $8 = sp + 124 | 0; + $name3$i = sp + 112 | 0; + $9 = sp + 96 | 0; + $10 = sp + 76 | 0; + $name4$i = sp + 64 | 0; + $11 = sp + 48 | 0; + $12 = sp + 8 | 0; + $13 = sp; + $14 = sp + 80 | 0; + $15 = sp + 60 | 0; + $tmp = sp + 36 | 0; + $tmp3 = sp + 24 | 0; + $16 = $last; + L1 : do if (($16 - $first | 0) > 1) { + $$first = (HEAP8[$first >> 0] | 0) == 76 ? $first + 1 | 0 : $first; + $23 = HEAP8[$$first >> 0] | 0; + switch ($23 << 24 >> 24 | 0) { + case 78: + { + L44 : do if (($$first | 0) == ($last | 0)) $$07$i = $last; else if ($23 << 24 >> 24 == 78) { + $28 = __ZN10__cxxabiv112_GLOBAL__N_119parse_cv_qualifiersEPKcS2_Rj($$first + 1 | 0, $last, $cv$i) | 0; + if (($28 | 0) == ($last | 0)) $$07$i = $$first; else { + $30 = $db + 52 | 0; + HEAP32[$30 >> 2] = 0; + switch (HEAP8[$28 >> 0] | 0) { + case 82: + { + HEAP32[$30 >> 2] = 1; + $t0$0$i13 = $28 + 1 | 0; + break; + } + case 79: + { + HEAP32[$30 >> 2] = 2; + $t0$0$i13 = $28 + 1 | 0; + break; + } + default: + $t0$0$i13 = $28; + } + $34 = $db + 4 | 0; + $35 = HEAP32[$34 >> 2] | 0; + $37 = HEAP32[$db + 8 >> 2] | 0; + if ($35 >>> 0 < $37 >>> 0) { + HEAP32[$35 >> 2] = 0; + HEAP32[$35 + 4 >> 2] = 0; + HEAP32[$35 + 8 >> 2] = 0; + HEAP32[$35 + 12 >> 2] = 0; + HEAP32[$35 + 16 >> 2] = 0; + HEAP32[$35 + 20 >> 2] = 0; + HEAP32[$35 >> 2] = 0; + HEAP32[$35 + 4 >> 2] = 0; + HEAP32[$35 + 8 >> 2] = 0; + $41 = $35 + 12 | 0; + HEAP32[$41 >> 2] = 0; + HEAP32[$41 + 4 >> 2] = 0; + HEAP32[$41 + 8 >> 2] = 0; + HEAP32[$34 >> 2] = (HEAP32[$34 >> 2] | 0) + 24; + } else { + $49 = HEAP32[$db >> 2] | 0; + $50 = $35 - $49 | 0; + $51 = ($50 | 0) / 24 | 0; + $52 = $51 + 1 | 0; + if (($50 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $56 = ($37 - $49 | 0) / 24 | 0; + if ($56 >>> 0 < 1073741823) { + $58 = $56 << 1; + $$0$i$i$i$i = $58 >>> 0 < $52 >>> 0 ? $52 : $58; + } else $$0$i$i$i$i = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i51$i, $$0$i$i$i$i, $51, $db + 12 | 0); + $61 = $__v$i$i51$i + 8 | 0; + $62 = HEAP32[$61 >> 2] | 0; + HEAP32[$62 >> 2] = 0; + HEAP32[$62 + 4 >> 2] = 0; + HEAP32[$62 + 8 >> 2] = 0; + HEAP32[$62 + 12 >> 2] = 0; + HEAP32[$62 + 16 >> 2] = 0; + HEAP32[$62 + 20 >> 2] = 0; + HEAP32[$62 >> 2] = 0; + HEAP32[$62 + 4 >> 2] = 0; + HEAP32[$62 + 8 >> 2] = 0; + $65 = $62 + 12 | 0; + HEAP32[$65 >> 2] = 0; + HEAP32[$65 + 4 >> 2] = 0; + HEAP32[$65 + 8 >> 2] = 0; + HEAP32[$61 >> 2] = $62 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i51$i); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i51$i); + } + if (($16 - $t0$0$i13 | 0) > 1) if ((HEAP8[$t0$0$i13 >> 0] | 0) == 83) if ((HEAP8[$t0$0$i13 + 1 >> 0] | 0) == 116) { + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6assignEPKcj((HEAP32[$34 >> 2] | 0) + -24 | 0, 12898, 3); + $t0$1$i = $t0$0$i13 + 2 | 0; + } else $t0$1$i = $t0$0$i13; else $t0$1$i = $t0$0$i13; else $t0$1$i = $t0$0$i13; + if (($t0$1$i | 0) == ($last | 0)) { + $123 = HEAP32[$34 >> 2] | 0; + $124 = $123 + -24 | 0; + $126 = $123; + while (1) { + $125 = $126 + -24 | 0; + HEAP32[$34 >> 2] = $125; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($125); + $126 = HEAP32[$34 >> 2] | 0; + if (($126 | 0) == ($124 | 0)) { + $$07$i = $$first; + break L44; + } + } + } + $81 = $name3$i + 8 | 0; + $82 = $name3$i + 1 | 0; + $83 = $name3$i + 4 | 0; + $84 = $db + 12 | 0; + $85 = $db + 16 | 0; + $86 = $db + 20 | 0; + $87 = $db + 24 | 0; + $88 = $9 + 12 | 0; + $89 = $9 + 4 | 0; + $90 = $9 + 8 | 0; + $91 = $db + 28 | 0; + $92 = $__v$i$i51$i + 8 | 0; + $93 = $12 + 12 | 0; + $94 = $12 + 4 | 0; + $95 = $12 + 8 | 0; + $96 = $__v$i$i51$i + 8 | 0; + $97 = $11 + 8 | 0; + $98 = $11 + 1 | 0; + $99 = $11 + 4 | 0; + $100 = $0 + 8 | 0; + $101 = $0 + 1 | 0; + $102 = $0 + 4 | 0; + $103 = $1 + 12 | 0; + $104 = $1 + 4 | 0; + $105 = $1 + 8 | 0; + $106 = $__v$i$i51$i + 8 | 0; + $107 = $4 + 12 | 0; + $108 = $4 + 4 | 0; + $109 = $4 + 8 | 0; + $110 = $__v$i$i51$i + 8 | 0; + $111 = $3 + 8 | 0; + $112 = $3 + 1 | 0; + $113 = $3 + 4 | 0; + $114 = $7 + 12 | 0; + $115 = $7 + 4 | 0; + $116 = $7 + 8 | 0; + $117 = $__v$i$i51$i + 8 | 0; + $118 = $6 + 8 | 0; + $119 = $6 + 1 | 0; + $120 = $6 + 4 | 0; + $121 = HEAP8[$t0$1$i >> 0] | 0; + L72 : do if ($121 << 24 >> 24 == 69) { + $pop_subs$0$off0$i$ph$lcssa = 0; + $t0$2$i$lcssa = $t0$1$i; + } else { + $719 = $121; + $pop_subs$0$off0$i$ph136 = 0; + $t0$2$i$ph135 = $t0$1$i; + L73 : while (1) { + $129 = $719; + $t0$2$i131 = $t0$2$i$ph135; + L75 : while (1) { + switch ($129 << 24 >> 24 | 0) { + case 83: + { + $t0$2$i131$lcssa177 = $t0$2$i131; + label = 25; + break L75; + break; + } + case 84: + { + $t0$2$i131$lcssa178 = $t0$2$i131; + label = 44; + break L75; + break; + } + case 68: + { + $t0$2$i131$lcssa179 = $t0$2$i131; + label = 61; + break L75; + break; + } + case 73: + { + $338 = __ZN10__cxxabiv112_GLOBAL__N_119parse_template_argsINS0_2DbEEEPKcS4_S4_RT_($t0$2$i131, $last, $db) | 0; + if (($338 | 0) == ($t0$2$i131 | 0) | ($338 | 0) == ($last | 0)) { + $$07$i = $$first; + break L44; + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($name3$i, (HEAP32[$34 >> 2] | 0) + -24 | 0); + $343 = HEAP32[$34 >> 2] | 0; + $344 = $343 + -24 | 0; + $346 = $343; + do { + $345 = $346 + -24 | 0; + HEAP32[$34 >> 2] = $345; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($345); + $346 = HEAP32[$34 >> 2] | 0; + } while (($346 | 0) != ($344 | 0)); + $349 = HEAP8[$name3$i >> 0] | 0; + $351 = ($349 & 1) == 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($343 + -48 | 0, $351 ? $82 : HEAP32[$81 >> 2] | 0, $351 ? ($349 & 255) >>> 1 : HEAP32[$83 >> 2] | 0) | 0; + $359 = (HEAP32[$34 >> 2] | 0) + -24 | 0; + HEAP32[$10 >> 2] = HEAP32[$84 >> 2]; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEEC2EjRKS3_RKS5_($9, $359, $10); + $361 = HEAP32[$86 >> 2] | 0; + $362 = HEAP32[$87 >> 2] | 0; + if ($361 >>> 0 < $362 >>> 0) { + HEAP32[$361 + 12 >> 2] = HEAP32[$88 >> 2]; + HEAP32[$361 >> 2] = HEAP32[$9 >> 2]; + HEAP32[$361 + 4 >> 2] = HEAP32[$89 >> 2]; + HEAP32[$361 + 8 >> 2] = HEAP32[$90 >> 2]; + HEAP32[$90 >> 2] = 0; + HEAP32[$89 >> 2] = 0; + HEAP32[$9 >> 2] = 0; + HEAP32[$86 >> 2] = (HEAP32[$86 >> 2] | 0) + 16; + } else { + $375 = HEAP32[$85 >> 2] | 0; + $376 = $361 - $375 | 0; + $377 = $376 >> 4; + $378 = $377 + 1 | 0; + if (($376 | 0) < -16) { + label = 86; + break L73; + } + $381 = $362 - $375 | 0; + if ($381 >> 4 >>> 0 < 1073741823) { + $384 = $381 >> 3; + $$0$i$i$i42$i = $384 >>> 0 < $378 >>> 0 ? $378 : $384; + } else $$0$i$i$i42$i = 2147483647; + __ZNSt3__114__split_bufferINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEERNS5_IS7_Lj4096EEEEC2EjjS9_($__v$i$i51$i, $$0$i$i$i42$i, $377, $91); + $387 = HEAP32[$92 >> 2] | 0; + HEAP32[$387 + 12 >> 2] = HEAP32[$88 >> 2]; + HEAP32[$387 >> 2] = HEAP32[$9 >> 2]; + HEAP32[$387 + 4 >> 2] = HEAP32[$89 >> 2]; + HEAP32[$387 + 8 >> 2] = HEAP32[$90 >> 2]; + HEAP32[$90 >> 2] = 0; + HEAP32[$89 >> 2] = 0; + HEAP32[$9 >> 2] = 0; + HEAP32[$92 >> 2] = $387 + 16; + __ZNSt3__16vectorINS0_IN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEEENS4_IS6_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS6_RS7_EE($85, $__v$i$i51$i); + __ZNSt3__114__split_bufferINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEERNS5_IS7_Lj4096EEEED2Ev($__v$i$i51$i); + } + __ZNSt3__113__vector_baseIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEED2Ev($9); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($name3$i); + $t0$2$i$be = $338; + break; + } + case 76: + { + $398 = $t0$2$i131 + 1 | 0; + if (($398 | 0) == ($last | 0)) { + $$07$i = $$first; + break L44; + } else $t0$2$i$be = $398; + break; + } + default: + { + $t0$2$i131184 = $t0$2$i131; + label = 93; + break L75; + } + } + $129 = HEAP8[$t0$2$i$be >> 0] | 0; + if ($129 << 24 >> 24 == 69) { + $pop_subs$0$off0$i$ph$lcssa = $pop_subs$0$off0$i$ph136; + $t0$2$i$lcssa = $t0$2$i$be; + break L72; + } else $t0$2$i131 = $t0$2$i$be; + } + L93 : do if ((label | 0) == 25) { + label = 0; + $130 = $t0$2$i131$lcssa177 + 1 | 0; + if (($130 | 0) != ($last | 0)) if ((HEAP8[$130 >> 0] | 0) == 116) { + $t0$2$i131184 = $t0$2$i131$lcssa177; + label = 93; + break; + } + $134 = __ZN10__cxxabiv112_GLOBAL__N_118parse_substitutionINS0_2DbEEEPKcS4_S4_RT_($t0$2$i131$lcssa177, $last, $db) | 0; + if (($134 | 0) == ($t0$2$i131$lcssa177 | 0) | ($134 | 0) == ($last | 0)) { + $$07$i = $$first; + break L44; + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($name$i11, (HEAP32[$34 >> 2] | 0) + -24 | 0); + $139 = HEAP32[$34 >> 2] | 0; + $140 = $139 + -24 | 0; + $142 = $139; + do { + $141 = $142 + -24 | 0; + HEAP32[$34 >> 2] = $141; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($141); + $142 = HEAP32[$34 >> 2] | 0; + } while (($142 | 0) != ($140 | 0)); + $144 = $139 + -48 | 0; + $145 = HEAP8[$144 >> 0] | 0; + if (!($145 & 1)) $153 = ($145 & 255) >>> 1; else $153 = HEAP32[$139 + -44 >> 2] | 0; + if (!$153) __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEaSERKS7_($144, $name$i11); else { + __ZNSt3__1plIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEENS_12basic_stringIT_T0_T1_EEPKS8_RKSB_($0, 12902, $name$i11); + $154 = HEAP8[$0 >> 0] | 0; + $156 = ($154 & 1) == 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($144, $156 ? $101 : HEAP32[$100 >> 2] | 0, $156 ? ($154 & 255) >>> 1 : HEAP32[$102 >> 2] | 0) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($0); + $164 = (HEAP32[$34 >> 2] | 0) + -24 | 0; + HEAP32[$2 >> 2] = HEAP32[$84 >> 2]; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEEC2EjRKS3_RKS5_($1, $164, $2); + $166 = HEAP32[$86 >> 2] | 0; + $167 = HEAP32[$87 >> 2] | 0; + if ($166 >>> 0 < $167 >>> 0) { + HEAP32[$166 + 12 >> 2] = HEAP32[$103 >> 2]; + HEAP32[$166 >> 2] = HEAP32[$1 >> 2]; + HEAP32[$166 + 4 >> 2] = HEAP32[$104 >> 2]; + HEAP32[$166 + 8 >> 2] = HEAP32[$105 >> 2]; + HEAP32[$105 >> 2] = 0; + HEAP32[$104 >> 2] = 0; + HEAP32[$1 >> 2] = 0; + HEAP32[$86 >> 2] = (HEAP32[$86 >> 2] | 0) + 16; + } else { + $180 = HEAP32[$85 >> 2] | 0; + $181 = $166 - $180 | 0; + $182 = $181 >> 4; + $183 = $182 + 1 | 0; + if (($181 | 0) < -16) { + label = 37; + break L73; + } + $186 = $167 - $180 | 0; + if ($186 >> 4 >>> 0 < 1073741823) { + $189 = $186 >> 3; + $$0$i$i$i16$i = $189 >>> 0 < $183 >>> 0 ? $183 : $189; + } else $$0$i$i$i16$i = 2147483647; + __ZNSt3__114__split_bufferINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEERNS5_IS7_Lj4096EEEEC2EjjS9_($__v$i$i51$i, $$0$i$i$i16$i, $182, $91); + $192 = HEAP32[$106 >> 2] | 0; + HEAP32[$192 + 12 >> 2] = HEAP32[$103 >> 2]; + HEAP32[$192 >> 2] = HEAP32[$1 >> 2]; + HEAP32[$192 + 4 >> 2] = HEAP32[$104 >> 2]; + HEAP32[$192 + 8 >> 2] = HEAP32[$105 >> 2]; + HEAP32[$105 >> 2] = 0; + HEAP32[$104 >> 2] = 0; + HEAP32[$1 >> 2] = 0; + HEAP32[$106 >> 2] = $192 + 16; + __ZNSt3__16vectorINS0_IN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEEENS4_IS6_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS6_RS7_EE($85, $__v$i$i51$i); + __ZNSt3__114__split_bufferINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEERNS5_IS7_Lj4096EEEED2Ev($__v$i$i51$i); + } + __ZNSt3__113__vector_baseIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEED2Ev($1); + } + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($name$i11); + $t0$2$i$ph$be = $134; + } else if ((label | 0) == 44) { + label = 0; + $201 = __ZN10__cxxabiv112_GLOBAL__N_120parse_template_paramINS0_2DbEEEPKcS4_S4_RT_($t0$2$i131$lcssa178, $last, $db) | 0; + if (($201 | 0) == ($t0$2$i131$lcssa178 | 0) | ($201 | 0) == ($last | 0)) { + $$07$i = $$first; + break L44; + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($name1$i, (HEAP32[$34 >> 2] | 0) + -24 | 0); + $206 = HEAP32[$34 >> 2] | 0; + $207 = $206 + -24 | 0; + $209 = $206; + do { + $208 = $209 + -24 | 0; + HEAP32[$34 >> 2] = $208; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($208); + $209 = HEAP32[$34 >> 2] | 0; + } while (($209 | 0) != ($207 | 0)); + $211 = $206 + -48 | 0; + $212 = HEAP8[$211 >> 0] | 0; + if (!($212 & 1)) $220 = ($212 & 255) >>> 1; else $220 = HEAP32[$206 + -44 >> 2] | 0; + if (!$220) __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEaSERKS7_($211, $name1$i); else { + __ZNSt3__1plIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEENS_12basic_stringIT_T0_T1_EEPKS8_RKSB_($3, 12902, $name1$i); + $221 = HEAP8[$3 >> 0] | 0; + $223 = ($221 & 1) == 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($211, $223 ? $112 : HEAP32[$111 >> 2] | 0, $223 ? ($221 & 255) >>> 1 : HEAP32[$113 >> 2] | 0) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($3); + } + $231 = (HEAP32[$34 >> 2] | 0) + -24 | 0; + HEAP32[$5 >> 2] = HEAP32[$84 >> 2]; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEEC2EjRKS3_RKS5_($4, $231, $5); + $233 = HEAP32[$86 >> 2] | 0; + $234 = HEAP32[$87 >> 2] | 0; + if ($233 >>> 0 < $234 >>> 0) { + HEAP32[$233 + 12 >> 2] = HEAP32[$107 >> 2]; + HEAP32[$233 >> 2] = HEAP32[$4 >> 2]; + HEAP32[$233 + 4 >> 2] = HEAP32[$108 >> 2]; + HEAP32[$233 + 8 >> 2] = HEAP32[$109 >> 2]; + HEAP32[$109 >> 2] = 0; + HEAP32[$108 >> 2] = 0; + HEAP32[$4 >> 2] = 0; + HEAP32[$86 >> 2] = (HEAP32[$86 >> 2] | 0) + 16; + } else { + $247 = HEAP32[$85 >> 2] | 0; + $248 = $233 - $247 | 0; + $249 = $248 >> 4; + $250 = $249 + 1 | 0; + if (($248 | 0) < -16) { + label = 56; + break L73; + } + $253 = $234 - $247 | 0; + if ($253 >> 4 >>> 0 < 1073741823) { + $256 = $253 >> 3; + $$0$i$i$i23$i = $256 >>> 0 < $250 >>> 0 ? $250 : $256; + } else $$0$i$i$i23$i = 2147483647; + __ZNSt3__114__split_bufferINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEERNS5_IS7_Lj4096EEEEC2EjjS9_($__v$i$i51$i, $$0$i$i$i23$i, $249, $91); + $259 = HEAP32[$110 >> 2] | 0; + HEAP32[$259 + 12 >> 2] = HEAP32[$107 >> 2]; + HEAP32[$259 >> 2] = HEAP32[$4 >> 2]; + HEAP32[$259 + 4 >> 2] = HEAP32[$108 >> 2]; + HEAP32[$259 + 8 >> 2] = HEAP32[$109 >> 2]; + HEAP32[$109 >> 2] = 0; + HEAP32[$108 >> 2] = 0; + HEAP32[$4 >> 2] = 0; + HEAP32[$110 >> 2] = $259 + 16; + __ZNSt3__16vectorINS0_IN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEEENS4_IS6_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS6_RS7_EE($85, $__v$i$i51$i); + __ZNSt3__114__split_bufferINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEERNS5_IS7_Lj4096EEEED2Ev($__v$i$i51$i); + } + __ZNSt3__113__vector_baseIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEED2Ev($4); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($name1$i); + $t0$2$i$ph$be = $201; + } else if ((label | 0) == 61) { + label = 0; + $268 = $t0$2$i131$lcssa179 + 1 | 0; + if (($268 | 0) != ($last | 0)) switch (HEAP8[$268 >> 0] | 0) { + case 84: + case 116: + break; + default: + { + $t0$2$i131184 = $t0$2$i131$lcssa179; + label = 93; + break L93; + } + } + $271 = __ZN10__cxxabiv112_GLOBAL__N_114parse_decltypeINS0_2DbEEEPKcS4_S4_RT_($t0$2$i131$lcssa179, $last, $db) | 0; + if (($271 | 0) == ($t0$2$i131$lcssa179 | 0) | ($271 | 0) == ($last | 0)) { + $$07$i = $$first; + break L44; + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($name2$i12, (HEAP32[$34 >> 2] | 0) + -24 | 0); + $276 = HEAP32[$34 >> 2] | 0; + $277 = $276 + -24 | 0; + $279 = $276; + do { + $278 = $279 + -24 | 0; + HEAP32[$34 >> 2] = $278; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($278); + $279 = HEAP32[$34 >> 2] | 0; + } while (($279 | 0) != ($277 | 0)); + $281 = $276 + -48 | 0; + $282 = HEAP8[$281 >> 0] | 0; + if (!($282 & 1)) $290 = ($282 & 255) >>> 1; else $290 = HEAP32[$276 + -44 >> 2] | 0; + if (!$290) __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEaSERKS7_($281, $name2$i12); else { + __ZNSt3__1plIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEENS_12basic_stringIT_T0_T1_EEPKS8_RKSB_($6, 12902, $name2$i12); + $291 = HEAP8[$6 >> 0] | 0; + $293 = ($291 & 1) == 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($281, $293 ? $119 : HEAP32[$118 >> 2] | 0, $293 ? ($291 & 255) >>> 1 : HEAP32[$120 >> 2] | 0) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($6); + } + $301 = (HEAP32[$34 >> 2] | 0) + -24 | 0; + HEAP32[$8 >> 2] = HEAP32[$84 >> 2]; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEEC2EjRKS3_RKS5_($7, $301, $8); + $303 = HEAP32[$86 >> 2] | 0; + $304 = HEAP32[$87 >> 2] | 0; + if ($303 >>> 0 < $304 >>> 0) { + HEAP32[$303 + 12 >> 2] = HEAP32[$114 >> 2]; + HEAP32[$303 >> 2] = HEAP32[$7 >> 2]; + HEAP32[$303 + 4 >> 2] = HEAP32[$115 >> 2]; + HEAP32[$303 + 8 >> 2] = HEAP32[$116 >> 2]; + HEAP32[$116 >> 2] = 0; + HEAP32[$115 >> 2] = 0; + HEAP32[$7 >> 2] = 0; + HEAP32[$86 >> 2] = (HEAP32[$86 >> 2] | 0) + 16; + } else { + $317 = HEAP32[$85 >> 2] | 0; + $318 = $303 - $317 | 0; + $319 = $318 >> 4; + $320 = $319 + 1 | 0; + if (($318 | 0) < -16) { + label = 75; + break L73; + } + $323 = $304 - $317 | 0; + if ($323 >> 4 >>> 0 < 1073741823) { + $326 = $323 >> 3; + $$0$i$i$i33$i = $326 >>> 0 < $320 >>> 0 ? $320 : $326; + } else $$0$i$i$i33$i = 2147483647; + __ZNSt3__114__split_bufferINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEERNS5_IS7_Lj4096EEEEC2EjjS9_($__v$i$i51$i, $$0$i$i$i33$i, $319, $91); + $329 = HEAP32[$117 >> 2] | 0; + HEAP32[$329 + 12 >> 2] = HEAP32[$114 >> 2]; + HEAP32[$329 >> 2] = HEAP32[$7 >> 2]; + HEAP32[$329 + 4 >> 2] = HEAP32[$115 >> 2]; + HEAP32[$329 + 8 >> 2] = HEAP32[$116 >> 2]; + HEAP32[$116 >> 2] = 0; + HEAP32[$115 >> 2] = 0; + HEAP32[$7 >> 2] = 0; + HEAP32[$117 >> 2] = $329 + 16; + __ZNSt3__16vectorINS0_IN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEEENS4_IS6_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS6_RS7_EE($85, $__v$i$i51$i); + __ZNSt3__114__split_bufferINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEERNS5_IS7_Lj4096EEEED2Ev($__v$i$i51$i); + } + __ZNSt3__113__vector_baseIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEED2Ev($7); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($name2$i12); + $t0$2$i$ph$be = $271; + } while (0); + if ((label | 0) == 93) { + label = 0; + $400 = __ZN10__cxxabiv112_GLOBAL__N_122parse_unqualified_nameINS0_2DbEEEPKcS4_S4_RT_($t0$2$i131184, $last, $db) | 0; + if (($400 | 0) == ($t0$2$i131184 | 0) | ($400 | 0) == ($last | 0)) { + $$07$i = $$first; + break L44; + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($name4$i, (HEAP32[$34 >> 2] | 0) + -24 | 0); + $405 = HEAP32[$34 >> 2] | 0; + $406 = $405 + -24 | 0; + $408 = $405; + do { + $407 = $408 + -24 | 0; + HEAP32[$34 >> 2] = $407; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($407); + $408 = HEAP32[$34 >> 2] | 0; + } while (($408 | 0) != ($406 | 0)); + $410 = $405 + -48 | 0; + $411 = HEAP8[$410 >> 0] | 0; + if (!($411 & 1)) $419 = ($411 & 255) >>> 1; else $419 = HEAP32[$405 + -44 >> 2] | 0; + if (!$419) __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEaSERKS7_($410, $name4$i); else { + __ZNSt3__1plIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEENS_12basic_stringIT_T0_T1_EEPKS8_RKSB_($11, 12902, $name4$i); + $420 = HEAP8[$11 >> 0] | 0; + $422 = ($420 & 1) == 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($410, $422 ? $98 : HEAP32[$97 >> 2] | 0, $422 ? ($420 & 255) >>> 1 : HEAP32[$99 >> 2] | 0) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($11); + } + $430 = (HEAP32[$34 >> 2] | 0) + -24 | 0; + HEAP32[$13 >> 2] = HEAP32[$84 >> 2]; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEEC2EjRKS3_RKS5_($12, $430, $13); + $432 = HEAP32[$86 >> 2] | 0; + $433 = HEAP32[$87 >> 2] | 0; + if ($432 >>> 0 < $433 >>> 0) { + HEAP32[$432 + 12 >> 2] = HEAP32[$93 >> 2]; + HEAP32[$432 >> 2] = HEAP32[$12 >> 2]; + HEAP32[$432 + 4 >> 2] = HEAP32[$94 >> 2]; + HEAP32[$432 + 8 >> 2] = HEAP32[$95 >> 2]; + HEAP32[$95 >> 2] = 0; + HEAP32[$94 >> 2] = 0; + HEAP32[$12 >> 2] = 0; + HEAP32[$86 >> 2] = (HEAP32[$86 >> 2] | 0) + 16; + } else { + $446 = HEAP32[$85 >> 2] | 0; + $447 = $432 - $446 | 0; + $448 = $447 >> 4; + $449 = $448 + 1 | 0; + if (($447 | 0) < -16) { + label = 105; + break; + } + $452 = $433 - $446 | 0; + if ($452 >> 4 >>> 0 < 1073741823) { + $455 = $452 >> 3; + $$0$i$i$i52$i = $455 >>> 0 < $449 >>> 0 ? $449 : $455; + } else $$0$i$i$i52$i = 2147483647; + __ZNSt3__114__split_bufferINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEERNS5_IS7_Lj4096EEEEC2EjjS9_($__v$i$i51$i, $$0$i$i$i52$i, $448, $91); + $458 = HEAP32[$96 >> 2] | 0; + HEAP32[$458 + 12 >> 2] = HEAP32[$93 >> 2]; + HEAP32[$458 >> 2] = HEAP32[$12 >> 2]; + HEAP32[$458 + 4 >> 2] = HEAP32[$94 >> 2]; + HEAP32[$458 + 8 >> 2] = HEAP32[$95 >> 2]; + HEAP32[$95 >> 2] = 0; + HEAP32[$94 >> 2] = 0; + HEAP32[$12 >> 2] = 0; + HEAP32[$96 >> 2] = $458 + 16; + __ZNSt3__16vectorINS0_IN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEEENS4_IS6_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS6_RS7_EE($85, $__v$i$i51$i); + __ZNSt3__114__split_bufferINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEERNS5_IS7_Lj4096EEEED2Ev($__v$i$i51$i); + } + __ZNSt3__113__vector_baseIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEED2Ev($12); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($name4$i); + $t0$2$i$ph$be = $400; + } + $719 = HEAP8[$t0$2$i$ph$be >> 0] | 0; + if ($719 << 24 >> 24 == 69) { + $pop_subs$0$off0$i$ph$lcssa = 1; + $t0$2$i$lcssa = $t0$2$i$ph$be; + break L72; + } else { + $pop_subs$0$off0$i$ph136 = 1; + $t0$2$i$ph135 = $t0$2$i$ph$be; + } + } + if ((label | 0) == 37) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($85); else if ((label | 0) == 56) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($85); else if ((label | 0) == 75) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($85); else if ((label | 0) == 86) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($85); else if ((label | 0) == 105) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($85); + } while (0); + $469 = $t0$2$i$lcssa + 1 | 0; + HEAP32[$db + 48 >> 2] = HEAP32[$cv$i >> 2]; + if ($pop_subs$0$off0$i$ph$lcssa) { + $474 = HEAP32[$86 >> 2] | 0; + if ((HEAP32[$db + 16 >> 2] | 0) == ($474 | 0)) $$07$i = $469; else { + $476 = $474 + -16 | 0; + $478 = $474; + do { + $477 = $478 + -16 | 0; + HEAP32[$86 >> 2] = $477; + __ZNSt3__113__vector_baseIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEED2Ev($477); + $478 = HEAP32[$86 >> 2] | 0; + } while (($478 | 0) != ($476 | 0)); + $$07$i = $469; + } + } else $$07$i = $469; + } + } else $$07$i = $$first; while (0); + $$02 = ($$07$i | 0) == ($$first | 0) ? $first : $$07$i; + break L1; + break; + } + case 90: + { + L199 : do if (($$first | 0) == ($last | 0)) $$0$i10 = $last; else if ($23 << 24 >> 24 == 90) { + $483 = $$first + 1 | 0; + $484 = __ZN10__cxxabiv112_GLOBAL__N_114parse_encodingINS0_2DbEEEPKcS4_S4_RT_($483, $last, $db) | 0; + if (($484 | 0) == ($483 | 0) | ($484 | 0) == ($last | 0)) $$0$i10 = $$first; else if ((HEAP8[$484 >> 0] | 0) == 69) { + $489 = $484 + 1 | 0; + if (($489 | 0) == ($last | 0)) $$0$i10 = $$first; else switch (HEAP8[$489 >> 0] | 0) { + case 115: + { + $494 = __ZN10__cxxabiv112_GLOBAL__N_119parse_discriminatorEPKcS2_($484 + 2 | 0, $last) | 0; + $497 = HEAP32[$db + 4 >> 2] | 0; + if ((HEAP32[$db >> 2] | 0) == ($497 | 0)) { + $$0$i10 = $494; + break L199; + } + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($497 + -24 | 0, 12905) | 0; + $$0$i10 = $494; + break L199; + break; + } + case 100: + { + $500 = $484 + 2 | 0; + if (($500 | 0) == ($last | 0)) { + $$0$i10 = $$first; + break L199; + } + $502 = __ZN10__cxxabiv112_GLOBAL__N_112parse_numberEPKcS2_($500, $last) | 0; + if (($502 | 0) == ($last | 0)) { + $$0$i10 = $$first; + break L199; + } + if ((HEAP8[$502 >> 0] | 0) != 95) { + $$0$i10 = $$first; + break L199; + } + $506 = $502 + 1 | 0; + $507 = __ZN10__cxxabiv112_GLOBAL__N_110parse_nameINS0_2DbEEEPKcS4_S4_RT_($506, $last, $db) | 0; + $509 = $db + 4 | 0; + $510 = HEAP32[$509 >> 2] | 0; + if (($507 | 0) == ($506 | 0)) { + $538 = $510 + -24 | 0; + $540 = $510; + while (1) { + $539 = $540 + -24 | 0; + HEAP32[$509 >> 2] = $539; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($539); + $540 = HEAP32[$509 >> 2] | 0; + if (($540 | 0) == ($538 | 0)) { + $$0$i10 = $$first; + break L199; + } + } + } + if ((($510 - (HEAP32[$db >> 2] | 0) | 0) / 24 | 0) >>> 0 < 2) { + $$0$i10 = $$first; + break L199; + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($__v$i$i51$i, $510 + -24 | 0); + $518 = HEAP32[$509 >> 2] | 0; + $519 = $518 + -24 | 0; + $521 = $518; + do { + $520 = $521 + -24 | 0; + HEAP32[$509 >> 2] = $520; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($520); + $521 = HEAP32[$509 >> 2] | 0; + } while (($521 | 0) != ($519 | 0)); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($518 + -48 | 0, 12902) | 0; + $526 = HEAP8[$__v$i$i51$i >> 0] | 0; + $528 = ($526 & 1) == 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj((HEAP32[$509 >> 2] | 0) + -24 | 0, $528 ? $__v$i$i51$i + 1 | 0 : HEAP32[$__v$i$i51$i + 8 >> 2] | 0, $528 ? ($526 & 255) >>> 1 : HEAP32[$__v$i$i51$i + 4 >> 2] | 0) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($__v$i$i51$i); + $$0$i10 = $507; + break L199; + break; + } + default: + { + $542 = __ZN10__cxxabiv112_GLOBAL__N_110parse_nameINS0_2DbEEEPKcS4_S4_RT_($489, $last, $db) | 0; + if (($542 | 0) == ($489 | 0)) { + $574 = $db + 4 | 0; + $575 = HEAP32[$574 >> 2] | 0; + $576 = $575 + -24 | 0; + $578 = $575; + while (1) { + $577 = $578 + -24 | 0; + HEAP32[$574 >> 2] = $577; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($577); + $578 = HEAP32[$574 >> 2] | 0; + if (($578 | 0) == ($576 | 0)) { + $$0$i10 = $$first; + break L199; + } + } + } + $544 = __ZN10__cxxabiv112_GLOBAL__N_119parse_discriminatorEPKcS2_($542, $last) | 0; + $545 = $db + 4 | 0; + $546 = HEAP32[$545 >> 2] | 0; + if ((($546 - (HEAP32[$db >> 2] | 0) | 0) / 24 | 0) >>> 0 < 2) { + $$0$i10 = $544; + break L199; + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($cv$i, $546 + -24 | 0); + $554 = HEAP32[$545 >> 2] | 0; + $555 = $554 + -24 | 0; + $557 = $554; + do { + $556 = $557 + -24 | 0; + HEAP32[$545 >> 2] = $556; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($556); + $557 = HEAP32[$545 >> 2] | 0; + } while (($557 | 0) != ($555 | 0)); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($554 + -48 | 0, 12902) | 0; + $562 = HEAP8[$cv$i >> 0] | 0; + $564 = ($562 & 1) == 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj((HEAP32[$545 >> 2] | 0) + -24 | 0, $564 ? $cv$i + 1 | 0 : HEAP32[$cv$i + 8 >> 2] | 0, $564 ? ($562 & 255) >>> 1 : HEAP32[$cv$i + 4 >> 2] | 0) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($cv$i); + $$0$i10 = $544; + break L199; + } + } + } else $$0$i10 = $$first; + } else $$0$i10 = $$first; while (0); + STACKTOP = sp; + return (($$0$i10 | 0) == ($$first | 0) ? $first : $$0$i10) | 0; + } + default: + { + do if (($16 - $$first | 0) > 1) { + if ($23 << 24 >> 24 == 83) if ((HEAP8[$$first + 1 >> 0] | 0) == 116) { + $588 = $$first + 2 | 0; + if (($588 | 0) == ($last | 0)) { + $St$0$off0$i = 0; + $t0$0$i = $last; + } else { + $St$0$off0$i = 0; + $t0$0$i = (HEAP8[$588 >> 0] | 0) == 76 ? $$first + 3 | 0 : $588; + } + } else { + $St$0$off0$i = 1; + $t0$0$i = $$first; + } else { + $St$0$off0$i = 1; + $t0$0$i = $$first; + } + $593 = __ZN10__cxxabiv112_GLOBAL__N_122parse_unqualified_nameINS0_2DbEEEPKcS4_S4_RT_($t0$0$i, $last, $db) | 0; + $594 = ($593 | 0) == ($t0$0$i | 0); + if ($St$0$off0$i | $594) $$0$i = $594 ? $$first : $593; else { + $597 = HEAP32[$db + 4 >> 2] | 0; + if ((HEAP32[$db >> 2] | 0) == ($597 | 0)) break; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc($597 + -24 | 0, 0, 12922) | 0; + $$0$i = $593; + } + if (($$0$i | 0) != ($$first | 0)) { + if (($$0$i | 0) == ($last | 0)) { + $$02 = $last; + break L1; + } + if ((HEAP8[$$0$i >> 0] | 0) != 73) { + $$02 = $$0$i; + break L1; + } + $605 = $db + 4 | 0; + $606 = HEAP32[$605 >> 2] | 0; + if ((HEAP32[$db >> 2] | 0) == ($606 | 0)) { + $$02 = $first; + break L1; + } + $608 = $db + 16 | 0; + HEAP32[$15 >> 2] = HEAP32[$db + 12 >> 2]; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEEC2EjRKS3_RKS5_($14, $606 + -24 | 0, $15); + $612 = $db + 20 | 0; + $613 = HEAP32[$612 >> 2] | 0; + $615 = HEAP32[$db + 24 >> 2] | 0; + if ($613 >>> 0 < $615 >>> 0) { + HEAP32[$613 + 12 >> 2] = HEAP32[$14 + 12 >> 2]; + HEAP32[$613 >> 2] = HEAP32[$14 >> 2]; + $622 = $14 + 4 | 0; + HEAP32[$613 + 4 >> 2] = HEAP32[$622 >> 2]; + $624 = $14 + 8 | 0; + HEAP32[$613 + 8 >> 2] = HEAP32[$624 >> 2]; + HEAP32[$624 >> 2] = 0; + HEAP32[$622 >> 2] = 0; + HEAP32[$14 >> 2] = 0; + HEAP32[$612 >> 2] = (HEAP32[$612 >> 2] | 0) + 16; + } else { + $632 = HEAP32[$608 >> 2] | 0; + $633 = $613 - $632 | 0; + $634 = $633 >> 4; + $635 = $634 + 1 | 0; + if (($633 | 0) < -16) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($608); + $638 = $615 - $632 | 0; + if ($638 >> 4 >>> 0 < 1073741823) { + $641 = $638 >> 3; + $$0$i$i$i = $641 >>> 0 < $635 >>> 0 ? $635 : $641; + } else $$0$i$i$i = 2147483647; + __ZNSt3__114__split_bufferINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEERNS5_IS7_Lj4096EEEEC2EjjS9_($__v$i$i51$i, $$0$i$i$i, $634, $db + 28 | 0); + $644 = $__v$i$i51$i + 8 | 0; + $645 = HEAP32[$644 >> 2] | 0; + HEAP32[$645 + 12 >> 2] = HEAP32[$14 + 12 >> 2]; + HEAP32[$645 >> 2] = HEAP32[$14 >> 2]; + $651 = $14 + 4 | 0; + HEAP32[$645 + 4 >> 2] = HEAP32[$651 >> 2]; + $653 = $14 + 8 | 0; + HEAP32[$645 + 8 >> 2] = HEAP32[$653 >> 2]; + HEAP32[$653 >> 2] = 0; + HEAP32[$651 >> 2] = 0; + HEAP32[$14 >> 2] = 0; + HEAP32[$644 >> 2] = $645 + 16; + __ZNSt3__16vectorINS0_IN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEEENS4_IS6_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS6_RS7_EE($608, $__v$i$i51$i); + __ZNSt3__114__split_bufferINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEERNS5_IS7_Lj4096EEEED2Ev($__v$i$i51$i); + } + __ZNSt3__113__vector_baseIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEED2Ev($14); + $657 = __ZN10__cxxabiv112_GLOBAL__N_119parse_template_argsINS0_2DbEEEPKcS4_S4_RT_($$0$i, $last, $db) | 0; + if (($657 | 0) == ($$0$i | 0)) { + $$02 = $first; + break L1; + } + $659 = HEAP32[$605 >> 2] | 0; + if ((($659 - (HEAP32[$db >> 2] | 0) | 0) / 24 | 0) >>> 0 < 2) { + $$02 = $first; + break L1; + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($tmp, $659 + -24 | 0); + $667 = HEAP32[$605 >> 2] | 0; + $668 = $667 + -24 | 0; + $670 = $667; + do { + $669 = $670 + -24 | 0; + HEAP32[$605 >> 2] = $669; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($669); + $670 = HEAP32[$605 >> 2] | 0; + } while (($670 | 0) != ($668 | 0)); + $673 = HEAP8[$tmp >> 0] | 0; + $675 = ($673 & 1) == 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($667 + -48 | 0, $675 ? $tmp + 1 | 0 : HEAP32[$tmp + 8 >> 2] | 0, $675 ? ($673 & 255) >>> 1 : HEAP32[$tmp + 4 >> 2] | 0) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($tmp); + $$02 = $657; + break L1; + } + } while (0); + $685 = __ZN10__cxxabiv112_GLOBAL__N_118parse_substitutionINS0_2DbEEEPKcS4_S4_RT_($$first, $last, $db) | 0; + if (($685 | 0) == ($$first | 0) | ($685 | 0) == ($last | 0)) { + $$02 = $first; + break L1; + } + if ((HEAP8[$685 >> 0] | 0) != 73) { + $$02 = $first; + break L1; + } + $690 = __ZN10__cxxabiv112_GLOBAL__N_119parse_template_argsINS0_2DbEEEPKcS4_S4_RT_($685, $last, $db) | 0; + if (($690 | 0) == ($685 | 0)) { + $$02 = $first; + break L1; + } + $692 = $db + 4 | 0; + $693 = HEAP32[$692 >> 2] | 0; + if ((($693 - (HEAP32[$db >> 2] | 0) | 0) / 24 | 0) >>> 0 < 2) { + $$02 = $first; + break L1; + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($tmp3, $693 + -24 | 0); + $701 = HEAP32[$692 >> 2] | 0; + $702 = $701 + -24 | 0; + $704 = $701; + do { + $703 = $704 + -24 | 0; + HEAP32[$692 >> 2] = $703; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($703); + $704 = HEAP32[$692 >> 2] | 0; + } while (($704 | 0) != ($702 | 0)); + $707 = HEAP8[$tmp3 >> 0] | 0; + $709 = ($707 & 1) == 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($701 + -48 | 0, $709 ? $tmp3 + 1 | 0 : HEAP32[$tmp3 + 8 >> 2] | 0, $709 ? ($707 & 255) >>> 1 : HEAP32[$tmp3 + 4 >> 2] | 0) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($tmp3); + $$02 = $690; + break L1; + } + } + } else $$02 = $first; while (0); + STACKTOP = sp; + return $$02 | 0; +} + +function _printf_core($f, $fmt, $ap, $nl_arg, $nl_type) { + $f = $f | 0; + $fmt = $fmt | 0; + $ap = $ap | 0; + $nl_arg = $nl_arg | 0; + $nl_type = $nl_type | 0; + var $$0 = 0, $$0$i = 0, $$0$lcssa$i = 0, $$012$i = 0, $$013$i = 0, $$03$i33 = 0, $$07$i = 0.0, $$1$i = 0.0, $$114$i = 0, $$2$i = 0.0, $$20$i = 0.0, $$21$i = 0, $$210$i = 0, $$23$i = 0, $$3$i = 0.0, $$31$i = 0, $$311$i = 0, $$4$i = 0.0, $$412$lcssa$i = 0, $$41276$i = 0, $$5$lcssa$i = 0, $$51 = 0, $$587$i = 0, $$a$3$i = 0, $$a$3186$i = 0, $$fl$4 = 0, $$lcssa = 0, $$lcssa159$i = 0, $$lcssa318 = 0, $$lcssa323 = 0, $$lcssa324 = 0, $$lcssa325 = 0, $$lcssa326 = 0, $$lcssa327 = 0, $$lcssa329 = 0, $$lcssa339 = 0, $$lcssa342 = 0.0, $$lcssa344 = 0, $$p$$i = 0, $$p$5 = 0, $$p$i = 0, $$pn$i = 0, $$pr$i = 0, $$pr47$i = 0, $$pre$phi184$iZ2D = 0, $$pre182$i = 0, $$z$4$i = 0, $0 = 0, $1 = 0, $10 = 0, $100 = 0, $106 = 0, $107 = 0, $109 = 0, $11 = 0, $12 = 0, $13 = 0, $133 = 0, $134 = 0, $137 = 0, $138 = 0, $139 = 0, $14 = 0, $144 = 0, $146 = 0, $148 = 0, $149 = 0, $15 = 0, $154 = 0, $157 = 0, $162 = 0, $163 = 0, $168 = 0, $175 = 0, $176 = 0, $187 = 0, $19 = 0, $199 = 0, $2 = 0, $206 = 0, $208 = 0, $21 = 0, $211 = 0, $212 = 0, $217 = 0, $223 = 0, $224 = 0, $23 = 0, $230 = 0, $24 = 0, $243 = 0, $245 = 0, $248 = 0, $253 = 0, $256 = 0, $257 = 0, $267 = 0, $269 = 0, $271 = 0, $274 = 0, $276 = 0, $277 = 0, $278 = 0, $28 = 0, $284 = 0, $286 = 0, $287 = 0, $29 = 0, $291 = 0, $299 = 0, $3 = 0, $305 = 0, $314 = 0, $317 = 0, $320 = 0, $321 = 0, $334 = 0, $336 = 0, $34 = 0, $341 = 0, $346 = 0, $349 = 0, $359 = 0.0, $366 = 0, $370 = 0, $377 = 0, $379 = 0, $381 = 0, $382 = 0, $386 = 0, $39 = 0, $392 = 0.0, $393 = 0, $396 = 0, $398 = 0, $4 = 0, $40 = 0, $401 = 0, $403 = 0, $407 = 0.0, $417 = 0, $420 = 0, $423 = 0, $432 = 0, $434 = 0, $435 = 0, $44 = 0, $441 = 0, $459 = 0, $46 = 0, $464 = 0, $469 = 0, $47 = 0, $479 = 0, $481 = 0, $482 = 0, $483 = 0, $484 = 0, $491 = 0, $492 = 0, $495 = 0, $497 = 0, $498 = 0, $499 = 0, $5 = 0, $501 = 0, $505 = 0, $507 = 0, $51 = 0, $511 = 0, $516 = 0, $517 = 0, $518 = 0, $519 = 0, $521 = 0, $527 = 0, $528 = 0, $529 = 0, $533 = 0, $541 = 0, $555 = 0, $556 = 0, $559 = 0, $56 = 0, $564 = 0, $565 = 0, $567 = 0, $574 = 0, $575 = 0, $576 = 0, $579 = 0, $580 = 0, $581 = 0, $588 = 0, $59 = 0, $598 = 0, $6 = 0, $60 = 0, $601 = 0, $603 = 0, $605 = 0, $607 = 0, $61 = 0, $612 = 0, $613 = 0, $616 = 0, $618 = 0, $620 = 0, $622 = 0, $633 = 0, $636 = 0, $641 = 0, $650 = 0, $651 = 0, $655 = 0, $658 = 0, $66 = 0, $660 = 0, $662 = 0, $666 = 0, $669 = 0, $67 = 0, $673 = 0, $683 = 0, $688 = 0, $695 = 0, $698 = 0, $7 = 0, $706 = 0, $716 = 0, $718 = 0, $726 = 0, $733 = 0, $735 = 0, $739 = 0, $741 = 0, $750 = 0, $756 = 0, $771 = 0, $773 = 0, $786 = 0, $8 = 0, $9 = 0, $91 = 0, $92 = 0, $98 = 0, $99 = 0, $a$0 = 0, $a$1 = 0, $a$1$lcssa$i = 0, $a$1147$i = 0, $a$2 = 0, $a$2$ph$i = 0, $a$3$lcssa$i = 0, $a$3134$i = 0, $a$5$lcssa$i = 0, $a$5109$i = 0, $a$6$i = 0, $a$7$i = 0, $a$8$ph$i = 0, $arg = 0, $argpos$0 = 0, $big$i = 0, $buf = 0, $buf$i = 0, $carry$0140$i = 0, $carry3$0128$i = 0, $cnt$0 = 0, $cnt$1 = 0, $cnt$1$lcssa = 0, $d$0139$i = 0, $d$0141$i = 0, $d$1127$i = 0, $d$2$lcssa$i = 0, $d$2108$i = 0, $d$3$i = 0, $d$482$i = 0, $d$575$i = 0, $d$686$i = 0, $e$0123$i = 0, $e$1$i = 0, $e$2104$i = 0, $e$3$i = 0, $e$4$ph$i = 0, $e2$i = 0, $ebuf0$i = 0, $estr$0$i = 0, $estr$1$lcssa$i = 0, $estr$193$i = 0, $estr$2$i = 0, $fl$0109 = 0, $fl$062 = 0, $fl$1 = 0, $fl$1$ = 0, $fl$3 = 0, $fl$4 = 0, $fl$6 = 0, $fmt39$lcssa = 0, $fmt39101 = 0, $fmt40 = 0, $fmt41 = 0, $fmt42 = 0, $fmt44 = 0, $fmt44$lcssa321 = 0, $fmt45 = 0, $i$0$lcssa = 0, $i$0$lcssa200 = 0, $i$0114 = 0, $i$0122$i = 0, $i$03$i = 0, $i$03$i25 = 0, $i$1$lcssa$i = 0, $i$1116$i = 0, $i$1125 = 0, $i$2100 = 0, $i$2100$lcssa = 0, $i$2103$i = 0, $i$398 = 0, $i$399$i = 0, $isdigittmp = 0, $isdigittmp1$i = 0, $isdigittmp1$i22 = 0, $isdigittmp11 = 0, $isdigittmp4$i = 0, $isdigittmp4$i24 = 0, $isdigittmp9 = 0, $j$0115$i = 0, $j$0117$i = 0, $j$1100$i = 0, $j$2$i = 0, $l$0 = 0, $l$0$i = 0, $l$1113 = 0, $l$2 = 0, $l10n$0 = 0, $l10n$0$lcssa = 0, $l10n$1 = 0, $l10n$2 = 0, $l10n$3 = 0, $mb = 0, $notrhs$i = 0, $p$0 = 0, $p$1 = 0, $p$2 = 0, $p$4198 = 0, $p$5 = 0, $pl$0 = 0, $pl$0$i = 0, $pl$1 = 0, $pl$1$i = 0, $pl$2 = 0, $prefix$0 = 0, $prefix$0$$i = 0, $prefix$0$i = 0, $prefix$1 = 0, $prefix$2 = 0, $r$0$a$8$i = 0, $re$169$i = 0, $round$068$i = 0.0, $round6$1$i = 0.0, $s$0$i = 0, $s$1$i = 0, $s$1$i$lcssa = 0, $s7$079$i = 0, $s7$1$i = 0, $s8$0$lcssa$i = 0, $s8$070$i = 0, $s9$0$i = 0, $s9$183$i = 0, $s9$2$i = 0, $small$0$i = 0.0, $small$1$i = 0.0, $st$0 = 0, $st$0$lcssa322 = 0, $storemerge = 0, $storemerge13 = 0, $storemerge8108 = 0, $storemerge860 = 0, $t$0 = 0, $t$1 = 0, $w$0 = 0, $w$1 = 0, $w$2 = 0, $wc = 0, $ws$0115 = 0, $ws$1126 = 0, $z$0$i = 0, $z$0$lcssa = 0, $z$0102 = 0, $z$1$lcssa$i = 0, $z$1146$i = 0, $z$2 = 0, $z$2$i = 0, $z$2$i$lcssa = 0, $z$3$lcssa$i = 0, $z$3133$i = 0, $z$4$i = 0, $z$6$$i = 0, $z$6$i = 0, $z$6$i$lcssa = 0, $z$6$ph$i = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 624 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $big$i = sp + 24 | 0; + $e2$i = sp + 16 | 0; + $buf$i = sp + 588 | 0; + $ebuf0$i = sp + 576 | 0; + $arg = sp; + $buf = sp + 536 | 0; + $wc = sp + 8 | 0; + $mb = sp + 528 | 0; + $0 = ($f | 0) != 0; + $1 = $buf + 40 | 0; + $2 = $1; + $3 = $buf + 39 | 0; + $4 = $wc + 4 | 0; + $5 = $ebuf0$i + 12 | 0; + $6 = $ebuf0$i + 11 | 0; + $7 = $buf$i; + $8 = $5; + $9 = $8 - $7 | 0; + $10 = -2 - $7 | 0; + $11 = $8 + 2 | 0; + $12 = $big$i + 288 | 0; + $13 = $buf$i + 9 | 0; + $14 = $13; + $15 = $buf$i + 8 | 0; + $cnt$0 = 0; + $fmt41 = $fmt; + $l$0 = 0; + $l10n$0 = 0; + L1 : while (1) { + do if (($cnt$0 | 0) > -1) if (($l$0 | 0) > (2147483647 - $cnt$0 | 0)) { + $19 = ___errno_location() | 0; + HEAP32[$19 >> 2] = 75; + $cnt$1 = -1; + break; + } else { + $cnt$1 = $l$0 + $cnt$0 | 0; + break; + } else $cnt$1 = $cnt$0; while (0); + $21 = HEAP8[$fmt41 >> 0] | 0; + if (!($21 << 24 >> 24)) { + $cnt$1$lcssa = $cnt$1; + $l10n$0$lcssa = $l10n$0; + label = 245; + break; + } else { + $23 = $21; + $fmt40 = $fmt41; + } + L9 : while (1) { + switch ($23 << 24 >> 24) { + case 37: + { + $fmt39101 = $fmt40; + $z$0102 = $fmt40; + label = 9; + break L9; + break; + } + case 0: + { + $fmt39$lcssa = $fmt40; + $z$0$lcssa = $fmt40; + break L9; + break; + } + default: + {} + } + $24 = $fmt40 + 1 | 0; + $23 = HEAP8[$24 >> 0] | 0; + $fmt40 = $24; + } + L12 : do if ((label | 0) == 9) while (1) { + label = 0; + if ((HEAP8[$fmt39101 + 1 >> 0] | 0) != 37) { + $fmt39$lcssa = $fmt39101; + $z$0$lcssa = $z$0102; + break L12; + } + $28 = $z$0102 + 1 | 0; + $29 = $fmt39101 + 2 | 0; + if ((HEAP8[$29 >> 0] | 0) == 37) { + $fmt39101 = $29; + $z$0102 = $28; + label = 9; + } else { + $fmt39$lcssa = $29; + $z$0$lcssa = $28; + break; + } + } while (0); + $34 = $z$0$lcssa - $fmt41 | 0; + if ($0) if (!(HEAP32[$f >> 2] & 32)) ___fwritex($fmt41, $34, $f) | 0; + if (($z$0$lcssa | 0) != ($fmt41 | 0)) { + $cnt$0 = $cnt$1; + $fmt41 = $fmt39$lcssa; + $l$0 = $34; + continue; + } + $39 = $fmt39$lcssa + 1 | 0; + $40 = HEAP8[$39 >> 0] | 0; + $isdigittmp = ($40 << 24 >> 24) + -48 | 0; + if ($isdigittmp >>> 0 < 10) { + $44 = (HEAP8[$fmt39$lcssa + 2 >> 0] | 0) == 36; + $$51 = $44 ? $fmt39$lcssa + 3 | 0 : $39; + $47 = HEAP8[$$51 >> 0] | 0; + $argpos$0 = $44 ? $isdigittmp : -1; + $l10n$1 = $44 ? 1 : $l10n$0; + $storemerge = $$51; + } else { + $47 = $40; + $argpos$0 = -1; + $l10n$1 = $l10n$0; + $storemerge = $39; + } + $46 = $47 << 24 >> 24; + L25 : do if (($46 & -32 | 0) == 32) { + $51 = $46; + $56 = $47; + $fl$0109 = 0; + $storemerge8108 = $storemerge; + while (1) { + if (!(1 << $51 + -32 & 75913)) { + $66 = $56; + $fl$062 = $fl$0109; + $storemerge860 = $storemerge8108; + break L25; + } + $59 = 1 << ($56 << 24 >> 24) + -32 | $fl$0109; + $60 = $storemerge8108 + 1 | 0; + $61 = HEAP8[$60 >> 0] | 0; + $51 = $61 << 24 >> 24; + if (($51 & -32 | 0) != 32) { + $66 = $61; + $fl$062 = $59; + $storemerge860 = $60; + break; + } else { + $56 = $61; + $fl$0109 = $59; + $storemerge8108 = $60; + } + } + } else { + $66 = $47; + $fl$062 = 0; + $storemerge860 = $storemerge; + } while (0); + do if ($66 << 24 >> 24 == 42) { + $67 = $storemerge860 + 1 | 0; + $isdigittmp11 = (HEAP8[$67 >> 0] | 0) + -48 | 0; + if ($isdigittmp11 >>> 0 < 10) if ((HEAP8[$storemerge860 + 2 >> 0] | 0) == 36) { + HEAP32[$nl_type + ($isdigittmp11 << 2) >> 2] = 10; + $l10n$2 = 1; + $storemerge13 = $storemerge860 + 3 | 0; + $w$0 = HEAP32[$nl_arg + ((HEAP8[$67 >> 0] | 0) + -48 << 3) >> 2] | 0; + } else label = 24; else label = 24; + if ((label | 0) == 24) { + label = 0; + if ($l10n$1) { + $$0 = -1; + break L1; + } + if (!$0) { + $fl$1 = $fl$062; + $fmt42 = $67; + $l10n$3 = 0; + $w$1 = 0; + break; + } + $91 = (HEAP32[$ap >> 2] | 0) + (4 - 1) & ~(4 - 1); + $92 = HEAP32[$91 >> 2] | 0; + HEAP32[$ap >> 2] = $91 + 4; + $l10n$2 = 0; + $storemerge13 = $67; + $w$0 = $92; + } + if (($w$0 | 0) < 0) { + $fl$1 = $fl$062 | 8192; + $fmt42 = $storemerge13; + $l10n$3 = $l10n$2; + $w$1 = 0 - $w$0 | 0; + } else { + $fl$1 = $fl$062; + $fmt42 = $storemerge13; + $l10n$3 = $l10n$2; + $w$1 = $w$0; + } + } else { + $isdigittmp1$i = ($66 << 24 >> 24) + -48 | 0; + if ($isdigittmp1$i >>> 0 < 10) { + $100 = $storemerge860; + $i$03$i = 0; + $isdigittmp4$i = $isdigittmp1$i; + while (1) { + $98 = ($i$03$i * 10 | 0) + $isdigittmp4$i | 0; + $99 = $100 + 1 | 0; + $isdigittmp4$i = (HEAP8[$99 >> 0] | 0) + -48 | 0; + if ($isdigittmp4$i >>> 0 >= 10) { + $$lcssa = $98; + $$lcssa318 = $99; + break; + } else { + $100 = $99; + $i$03$i = $98; + } + } + if (($$lcssa | 0) < 0) { + $$0 = -1; + break L1; + } else { + $fl$1 = $fl$062; + $fmt42 = $$lcssa318; + $l10n$3 = $l10n$1; + $w$1 = $$lcssa; + } + } else { + $fl$1 = $fl$062; + $fmt42 = $storemerge860; + $l10n$3 = $l10n$1; + $w$1 = 0; + } + } while (0); + L46 : do if ((HEAP8[$fmt42 >> 0] | 0) == 46) { + $106 = $fmt42 + 1 | 0; + $107 = HEAP8[$106 >> 0] | 0; + if ($107 << 24 >> 24 != 42) { + $isdigittmp1$i22 = ($107 << 24 >> 24) + -48 | 0; + if ($isdigittmp1$i22 >>> 0 < 10) { + $139 = $106; + $i$03$i25 = 0; + $isdigittmp4$i24 = $isdigittmp1$i22; + } else { + $fmt45 = $106; + $p$0 = 0; + break; + } + while (1) { + $137 = ($i$03$i25 * 10 | 0) + $isdigittmp4$i24 | 0; + $138 = $139 + 1 | 0; + $isdigittmp4$i24 = (HEAP8[$138 >> 0] | 0) + -48 | 0; + if ($isdigittmp4$i24 >>> 0 >= 10) { + $fmt45 = $138; + $p$0 = $137; + break L46; + } else { + $139 = $138; + $i$03$i25 = $137; + } + } + } + $109 = $fmt42 + 2 | 0; + $isdigittmp9 = (HEAP8[$109 >> 0] | 0) + -48 | 0; + if ($isdigittmp9 >>> 0 < 10) if ((HEAP8[$fmt42 + 3 >> 0] | 0) == 36) { + HEAP32[$nl_type + ($isdigittmp9 << 2) >> 2] = 10; + $fmt45 = $fmt42 + 4 | 0; + $p$0 = HEAP32[$nl_arg + ((HEAP8[$109 >> 0] | 0) + -48 << 3) >> 2] | 0; + break; + } + if ($l10n$3) { + $$0 = -1; + break L1; + } + if ($0) { + $133 = (HEAP32[$ap >> 2] | 0) + (4 - 1) & ~(4 - 1); + $134 = HEAP32[$133 >> 2] | 0; + HEAP32[$ap >> 2] = $133 + 4; + $fmt45 = $109; + $p$0 = $134; + } else { + $fmt45 = $109; + $p$0 = 0; + } + } else { + $fmt45 = $fmt42; + $p$0 = -1; + } while (0); + $fmt44 = $fmt45; + $st$0 = 0; + while (1) { + $144 = (HEAP8[$fmt44 >> 0] | 0) + -65 | 0; + if ($144 >>> 0 > 57) { + $$0 = -1; + break L1; + } + $146 = $fmt44 + 1 | 0; + $148 = HEAP8[17803 + ($st$0 * 58 | 0) + $144 >> 0] | 0; + $149 = $148 & 255; + if (($149 + -1 | 0) >>> 0 < 8) { + $fmt44 = $146; + $st$0 = $149; + } else { + $$lcssa323 = $146; + $$lcssa324 = $148; + $$lcssa325 = $149; + $fmt44$lcssa321 = $fmt44; + $st$0$lcssa322 = $st$0; + break; + } + } + if (!($$lcssa324 << 24 >> 24)) { + $$0 = -1; + break; + } + $154 = ($argpos$0 | 0) > -1; + do if ($$lcssa324 << 24 >> 24 == 19) if ($154) { + $$0 = -1; + break L1; + } else label = 52; else { + if ($154) { + HEAP32[$nl_type + ($argpos$0 << 2) >> 2] = $$lcssa325; + $157 = $nl_arg + ($argpos$0 << 3) | 0; + $162 = HEAP32[$157 + 4 >> 2] | 0; + $163 = $arg; + HEAP32[$163 >> 2] = HEAP32[$157 >> 2]; + HEAP32[$163 + 4 >> 2] = $162; + label = 52; + break; + } + if (!$0) { + $$0 = 0; + break L1; + } + _pop_arg($arg, $$lcssa325, $ap); + } while (0); + if ((label | 0) == 52) { + label = 0; + if (!$0) { + $cnt$0 = $cnt$1; + $fmt41 = $$lcssa323; + $l$0 = $34; + $l10n$0 = $l10n$3; + continue; + } + } + $168 = HEAP8[$fmt44$lcssa321 >> 0] | 0; + $t$0 = ($st$0$lcssa322 | 0) != 0 & ($168 & 15 | 0) == 3 ? $168 & -33 : $168; + $175 = $fl$1 & -65537; + $fl$1$ = ($fl$1 & 8192 | 0) == 0 ? $fl$1 : $175; + L75 : do switch ($t$0 | 0) { + case 110: + { + switch ($st$0$lcssa322 | 0) { + case 0: + { + HEAP32[HEAP32[$arg >> 2] >> 2] = $cnt$1; + $cnt$0 = $cnt$1; + $fmt41 = $$lcssa323; + $l$0 = $34; + $l10n$0 = $l10n$3; + continue L1; + break; + } + case 1: + { + HEAP32[HEAP32[$arg >> 2] >> 2] = $cnt$1; + $cnt$0 = $cnt$1; + $fmt41 = $$lcssa323; + $l$0 = $34; + $l10n$0 = $l10n$3; + continue L1; + break; + } + case 2: + { + $187 = HEAP32[$arg >> 2] | 0; + HEAP32[$187 >> 2] = $cnt$1; + HEAP32[$187 + 4 >> 2] = (($cnt$1 | 0) < 0) << 31 >> 31; + $cnt$0 = $cnt$1; + $fmt41 = $$lcssa323; + $l$0 = $34; + $l10n$0 = $l10n$3; + continue L1; + break; + } + case 3: + { + HEAP16[HEAP32[$arg >> 2] >> 1] = $cnt$1; + $cnt$0 = $cnt$1; + $fmt41 = $$lcssa323; + $l$0 = $34; + $l10n$0 = $l10n$3; + continue L1; + break; + } + case 4: + { + HEAP8[HEAP32[$arg >> 2] >> 0] = $cnt$1; + $cnt$0 = $cnt$1; + $fmt41 = $$lcssa323; + $l$0 = $34; + $l10n$0 = $l10n$3; + continue L1; + break; + } + case 6: + { + HEAP32[HEAP32[$arg >> 2] >> 2] = $cnt$1; + $cnt$0 = $cnt$1; + $fmt41 = $$lcssa323; + $l$0 = $34; + $l10n$0 = $l10n$3; + continue L1; + break; + } + case 7: + { + $199 = HEAP32[$arg >> 2] | 0; + HEAP32[$199 >> 2] = $cnt$1; + HEAP32[$199 + 4 >> 2] = (($cnt$1 | 0) < 0) << 31 >> 31; + $cnt$0 = $cnt$1; + $fmt41 = $$lcssa323; + $l$0 = $34; + $l10n$0 = $l10n$3; + continue L1; + break; + } + default: + { + $cnt$0 = $cnt$1; + $fmt41 = $$lcssa323; + $l$0 = $34; + $l10n$0 = $l10n$3; + continue L1; + } + } + break; + } + case 112: + { + $fl$3 = $fl$1$ | 8; + $p$1 = $p$0 >>> 0 > 8 ? $p$0 : 8; + $t$1 = 120; + label = 64; + break; + } + case 88: + case 120: + { + $fl$3 = $fl$1$; + $p$1 = $p$0; + $t$1 = $t$0; + label = 64; + break; + } + case 111: + { + $243 = $arg; + $245 = HEAP32[$243 >> 2] | 0; + $248 = HEAP32[$243 + 4 >> 2] | 0; + if (($245 | 0) == 0 & ($248 | 0) == 0) $$0$lcssa$i = $1; else { + $$03$i33 = $1; + $253 = $245; + $257 = $248; + while (1) { + $256 = $$03$i33 + -1 | 0; + HEAP8[$256 >> 0] = $253 & 7 | 48; + $253 = _bitshift64Lshr($253 | 0, $257 | 0, 3) | 0; + $257 = tempRet0; + if (($253 | 0) == 0 & ($257 | 0) == 0) { + $$0$lcssa$i = $256; + break; + } else $$03$i33 = $256; + } + } + if (!($fl$1$ & 8)) { + $a$0 = $$0$lcssa$i; + $fl$4 = $fl$1$; + $p$2 = $p$0; + $pl$1 = 0; + $prefix$1 = 18283; + label = 77; + } else { + $267 = $2 - $$0$lcssa$i + 1 | 0; + $a$0 = $$0$lcssa$i; + $fl$4 = $fl$1$; + $p$2 = ($p$0 | 0) < ($267 | 0) ? $267 : $p$0; + $pl$1 = 0; + $prefix$1 = 18283; + label = 77; + } + break; + } + case 105: + case 100: + { + $269 = $arg; + $271 = HEAP32[$269 >> 2] | 0; + $274 = HEAP32[$269 + 4 >> 2] | 0; + if (($274 | 0) < 0) { + $276 = _i64Subtract(0, 0, $271 | 0, $274 | 0) | 0; + $277 = tempRet0; + $278 = $arg; + HEAP32[$278 >> 2] = $276; + HEAP32[$278 + 4 >> 2] = $277; + $286 = $276; + $287 = $277; + $pl$0 = 1; + $prefix$0 = 18283; + label = 76; + break L75; + } + if (!($fl$1$ & 2048)) { + $284 = $fl$1$ & 1; + $286 = $271; + $287 = $274; + $pl$0 = $284; + $prefix$0 = ($284 | 0) == 0 ? 18283 : 18285; + label = 76; + } else { + $286 = $271; + $287 = $274; + $pl$0 = 1; + $prefix$0 = 18284; + label = 76; + } + break; + } + case 117: + { + $176 = $arg; + $286 = HEAP32[$176 >> 2] | 0; + $287 = HEAP32[$176 + 4 >> 2] | 0; + $pl$0 = 0; + $prefix$0 = 18283; + label = 76; + break; + } + case 99: + { + HEAP8[$3 >> 0] = HEAP32[$arg >> 2]; + $a$2 = $3; + $fl$6 = $175; + $p$5 = 1; + $pl$2 = 0; + $prefix$2 = 18283; + $z$2 = $1; + break; + } + case 109: + { + $314 = ___errno_location() | 0; + $a$1 = _strerror(HEAP32[$314 >> 2] | 0) | 0; + label = 82; + break; + } + case 115: + { + $317 = HEAP32[$arg >> 2] | 0; + $a$1 = ($317 | 0) != 0 ? $317 : 18293; + label = 82; + break; + } + case 67: + { + HEAP32[$wc >> 2] = HEAP32[$arg >> 2]; + HEAP32[$4 >> 2] = 0; + HEAP32[$arg >> 2] = $wc; + $p$4198 = -1; + label = 86; + break; + } + case 83: + { + if (!$p$0) { + _pad($f, 32, $w$1, 0, $fl$1$); + $i$0$lcssa200 = 0; + label = 98; + } else { + $p$4198 = $p$0; + label = 86; + } + break; + } + case 65: + case 71: + case 70: + case 69: + case 97: + case 103: + case 102: + case 101: + { + $359 = +HEAPF64[$arg >> 3]; + HEAP32[$e2$i >> 2] = 0; + HEAPF64[tempDoublePtr >> 3] = $359; + if ((HEAP32[tempDoublePtr + 4 >> 2] | 0) < 0) { + $$07$i = -$359; + $pl$0$i = 1; + $prefix$0$i = 18300; + } else if (!($fl$1$ & 2048)) { + $366 = $fl$1$ & 1; + $$07$i = $359; + $pl$0$i = $366; + $prefix$0$i = ($366 | 0) == 0 ? 18301 : 18306; + } else { + $$07$i = $359; + $pl$0$i = 1; + $prefix$0$i = 18303; + } + HEAPF64[tempDoublePtr >> 3] = $$07$i; + $370 = HEAP32[tempDoublePtr + 4 >> 2] & 2146435072; + do if ($370 >>> 0 < 2146435072 | ($370 | 0) == 2146435072 & 0 < 0) { + $392 = +_frexpl($$07$i, $e2$i) * 2.0; + $393 = $392 != 0.0; + if ($393) HEAP32[$e2$i >> 2] = (HEAP32[$e2$i >> 2] | 0) + -1; + $396 = $t$0 | 32; + if (($396 | 0) == 97) { + $398 = $t$0 & 32; + $prefix$0$$i = ($398 | 0) == 0 ? $prefix$0$i : $prefix$0$i + 9 | 0; + $401 = $pl$0$i | 2; + $403 = 12 - $p$0 | 0; + do if ($p$0 >>> 0 > 11 | ($403 | 0) == 0) $$1$i = $392; else { + $re$169$i = $403; + $round$068$i = 8.0; + while (1) { + $re$169$i = $re$169$i + -1 | 0; + $407 = $round$068$i * 16.0; + if (!$re$169$i) { + $$lcssa342 = $407; + break; + } else $round$068$i = $407; + } + if ((HEAP8[$prefix$0$$i >> 0] | 0) == 45) { + $$1$i = -($$lcssa342 + (-$392 - $$lcssa342)); + break; + } else { + $$1$i = $392 + $$lcssa342 - $$lcssa342; + break; + } + } while (0); + $417 = HEAP32[$e2$i >> 2] | 0; + $420 = ($417 | 0) < 0 ? 0 - $417 | 0 : $417; + $423 = _fmt_u($420, (($420 | 0) < 0) << 31 >> 31, $5) | 0; + if (($423 | 0) == ($5 | 0)) { + HEAP8[$6 >> 0] = 48; + $estr$0$i = $6; + } else $estr$0$i = $423; + HEAP8[$estr$0$i + -1 >> 0] = ($417 >> 31 & 2) + 43; + $432 = $estr$0$i + -2 | 0; + HEAP8[$432 >> 0] = $t$0 + 15; + $notrhs$i = ($p$0 | 0) < 1; + $434 = ($fl$1$ & 8 | 0) == 0; + $$2$i = $$1$i; + $s$0$i = $buf$i; + while (1) { + $435 = ~~$$2$i; + $441 = $s$0$i + 1 | 0; + HEAP8[$s$0$i >> 0] = HEAPU8[18267 + $435 >> 0] | $398; + $$2$i = ($$2$i - +($435 | 0)) * 16.0; + do if (($441 - $7 | 0) == 1) { + if ($434 & ($notrhs$i & $$2$i == 0.0)) { + $s$1$i = $441; + break; + } + HEAP8[$441 >> 0] = 46; + $s$1$i = $s$0$i + 2 | 0; + } else $s$1$i = $441; while (0); + if (!($$2$i != 0.0)) { + $s$1$i$lcssa = $s$1$i; + break; + } else $s$0$i = $s$1$i; + } + $$pre182$i = $s$1$i$lcssa; + $l$0$i = ($p$0 | 0) != 0 & ($10 + $$pre182$i | 0) < ($p$0 | 0) ? $11 + $p$0 - $432 | 0 : $9 - $432 + $$pre182$i | 0; + $459 = $l$0$i + $401 | 0; + _pad($f, 32, $w$1, $459, $fl$1$); + if (!(HEAP32[$f >> 2] & 32)) ___fwritex($prefix$0$$i, $401, $f) | 0; + _pad($f, 48, $w$1, $459, $fl$1$ ^ 65536); + $464 = $$pre182$i - $7 | 0; + if (!(HEAP32[$f >> 2] & 32)) ___fwritex($buf$i, $464, $f) | 0; + $469 = $8 - $432 | 0; + _pad($f, 48, $l$0$i - ($464 + $469) | 0, 0, 0); + if (!(HEAP32[$f >> 2] & 32)) ___fwritex($432, $469, $f) | 0; + _pad($f, 32, $w$1, $459, $fl$1$ ^ 8192); + $$0$i = ($459 | 0) < ($w$1 | 0) ? $w$1 : $459; + break; + } + $$p$i = ($p$0 | 0) < 0 ? 6 : $p$0; + if ($393) { + $479 = (HEAP32[$e2$i >> 2] | 0) + -28 | 0; + HEAP32[$e2$i >> 2] = $479; + $$3$i = $392 * 268435456.0; + $481 = $479; + } else { + $$3$i = $392; + $481 = HEAP32[$e2$i >> 2] | 0; + } + $$31$i = ($481 | 0) < 0 ? $big$i : $12; + $482 = $$31$i; + $$4$i = $$3$i; + $z$0$i = $$31$i; + while (1) { + $483 = ~~$$4$i >>> 0; + HEAP32[$z$0$i >> 2] = $483; + $484 = $z$0$i + 4 | 0; + $$4$i = ($$4$i - +($483 >>> 0)) * 1.0e9; + if (!($$4$i != 0.0)) { + $$lcssa326 = $484; + break; + } else $z$0$i = $484; + } + $$pr$i = HEAP32[$e2$i >> 2] | 0; + if (($$pr$i | 0) > 0) { + $491 = $$pr$i; + $a$1147$i = $$31$i; + $z$1146$i = $$lcssa326; + while (1) { + $492 = ($491 | 0) > 29 ? 29 : $491; + $d$0139$i = $z$1146$i + -4 | 0; + do if ($d$0139$i >>> 0 < $a$1147$i >>> 0) $a$2$ph$i = $a$1147$i; else { + $carry$0140$i = 0; + $d$0141$i = $d$0139$i; + while (1) { + $495 = _bitshift64Shl(HEAP32[$d$0141$i >> 2] | 0, 0, $492 | 0) | 0; + $497 = _i64Add($495 | 0, tempRet0 | 0, $carry$0140$i | 0, 0) | 0; + $498 = tempRet0; + $499 = ___uremdi3($497 | 0, $498 | 0, 1e9, 0) | 0; + HEAP32[$d$0141$i >> 2] = $499; + $501 = ___udivdi3($497 | 0, $498 | 0, 1e9, 0) | 0; + $d$0141$i = $d$0141$i + -4 | 0; + if ($d$0141$i >>> 0 < $a$1147$i >>> 0) { + $$lcssa327 = $501; + break; + } else $carry$0140$i = $501; + } + if (!$$lcssa327) { + $a$2$ph$i = $a$1147$i; + break; + } + $505 = $a$1147$i + -4 | 0; + HEAP32[$505 >> 2] = $$lcssa327; + $a$2$ph$i = $505; + } while (0); + $z$2$i = $z$1146$i; + while (1) { + if ($z$2$i >>> 0 <= $a$2$ph$i >>> 0) { + $z$2$i$lcssa = $z$2$i; + break; + } + $507 = $z$2$i + -4 | 0; + if (!(HEAP32[$507 >> 2] | 0)) $z$2$i = $507; else { + $z$2$i$lcssa = $z$2$i; + break; + } + } + $511 = (HEAP32[$e2$i >> 2] | 0) - $492 | 0; + HEAP32[$e2$i >> 2] = $511; + if (($511 | 0) > 0) { + $491 = $511; + $a$1147$i = $a$2$ph$i; + $z$1146$i = $z$2$i$lcssa; + } else { + $$pr47$i = $511; + $a$1$lcssa$i = $a$2$ph$i; + $z$1$lcssa$i = $z$2$i$lcssa; + break; + } + } + } else { + $$pr47$i = $$pr$i; + $a$1$lcssa$i = $$31$i; + $z$1$lcssa$i = $$lcssa326; + } + if (($$pr47$i | 0) < 0) { + $516 = (($$p$i + 25 | 0) / 9 | 0) + 1 | 0; + $517 = ($396 | 0) == 102; + $519 = $$pr47$i; + $a$3134$i = $a$1$lcssa$i; + $z$3133$i = $z$1$lcssa$i; + while (1) { + $518 = 0 - $519 | 0; + $521 = ($518 | 0) > 9 ? 9 : $518; + do if ($a$3134$i >>> 0 < $z$3133$i >>> 0) { + $527 = (1 << $521) + -1 | 0; + $528 = 1e9 >>> $521; + $carry3$0128$i = 0; + $d$1127$i = $a$3134$i; + while (1) { + $529 = HEAP32[$d$1127$i >> 2] | 0; + HEAP32[$d$1127$i >> 2] = ($529 >>> $521) + $carry3$0128$i; + $533 = Math_imul($529 & $527, $528) | 0; + $d$1127$i = $d$1127$i + 4 | 0; + if ($d$1127$i >>> 0 >= $z$3133$i >>> 0) { + $$lcssa329 = $533; + break; + } else $carry3$0128$i = $533; + } + $$a$3$i = (HEAP32[$a$3134$i >> 2] | 0) == 0 ? $a$3134$i + 4 | 0 : $a$3134$i; + if (!$$lcssa329) { + $$a$3186$i = $$a$3$i; + $z$4$i = $z$3133$i; + break; + } + HEAP32[$z$3133$i >> 2] = $$lcssa329; + $$a$3186$i = $$a$3$i; + $z$4$i = $z$3133$i + 4 | 0; + } else { + $$a$3186$i = (HEAP32[$a$3134$i >> 2] | 0) == 0 ? $a$3134$i + 4 | 0 : $a$3134$i; + $z$4$i = $z$3133$i; + } while (0); + $541 = $517 ? $$31$i : $$a$3186$i; + $$z$4$i = ($z$4$i - $541 >> 2 | 0) > ($516 | 0) ? $541 + ($516 << 2) | 0 : $z$4$i; + $519 = (HEAP32[$e2$i >> 2] | 0) + $521 | 0; + HEAP32[$e2$i >> 2] = $519; + if (($519 | 0) >= 0) { + $a$3$lcssa$i = $$a$3186$i; + $z$3$lcssa$i = $$z$4$i; + break; + } else { + $a$3134$i = $$a$3186$i; + $z$3133$i = $$z$4$i; + } + } + } else { + $a$3$lcssa$i = $a$1$lcssa$i; + $z$3$lcssa$i = $z$1$lcssa$i; + } + do if ($a$3$lcssa$i >>> 0 < $z$3$lcssa$i >>> 0) { + $555 = ($482 - $a$3$lcssa$i >> 2) * 9 | 0; + $556 = HEAP32[$a$3$lcssa$i >> 2] | 0; + if ($556 >>> 0 < 10) { + $e$1$i = $555; + break; + } else { + $e$0123$i = $555; + $i$0122$i = 10; + } + while (1) { + $i$0122$i = $i$0122$i * 10 | 0; + $559 = $e$0123$i + 1 | 0; + if ($556 >>> 0 < $i$0122$i >>> 0) { + $e$1$i = $559; + break; + } else $e$0123$i = $559; + } + } else $e$1$i = 0; while (0); + $564 = ($396 | 0) == 103; + $565 = ($$p$i | 0) != 0; + $567 = $$p$i - (($396 | 0) != 102 ? $e$1$i : 0) + (($565 & $564) << 31 >> 31) | 0; + if (($567 | 0) < ((($z$3$lcssa$i - $482 >> 2) * 9 | 0) + -9 | 0)) { + $574 = $567 + 9216 | 0; + $575 = ($574 | 0) / 9 | 0; + $576 = $$31$i + ($575 + -1023 << 2) | 0; + $j$0115$i = (($574 | 0) % 9 | 0) + 1 | 0; + if (($j$0115$i | 0) < 9) { + $i$1116$i = 10; + $j$0117$i = $j$0115$i; + while (1) { + $579 = $i$1116$i * 10 | 0; + $j$0117$i = $j$0117$i + 1 | 0; + if (($j$0117$i | 0) == 9) { + $i$1$lcssa$i = $579; + break; + } else $i$1116$i = $579; + } + } else $i$1$lcssa$i = 10; + $580 = HEAP32[$576 >> 2] | 0; + $581 = ($580 >>> 0) % ($i$1$lcssa$i >>> 0) | 0; + if (!$581) if (($$31$i + ($575 + -1022 << 2) | 0) == ($z$3$lcssa$i | 0)) { + $a$7$i = $a$3$lcssa$i; + $d$3$i = $576; + $e$3$i = $e$1$i; + } else label = 163; else label = 163; + do if ((label | 0) == 163) { + label = 0; + $$20$i = ((($580 >>> 0) / ($i$1$lcssa$i >>> 0) | 0) & 1 | 0) == 0 ? 9007199254740992.0 : 9007199254740994.0; + $588 = ($i$1$lcssa$i | 0) / 2 | 0; + do if ($581 >>> 0 < $588 >>> 0) $small$0$i = .5; else { + if (($581 | 0) == ($588 | 0)) if (($$31$i + ($575 + -1022 << 2) | 0) == ($z$3$lcssa$i | 0)) { + $small$0$i = 1.0; + break; + } + $small$0$i = 1.5; + } while (0); + do if (!$pl$0$i) { + $round6$1$i = $$20$i; + $small$1$i = $small$0$i; + } else { + if ((HEAP8[$prefix$0$i >> 0] | 0) != 45) { + $round6$1$i = $$20$i; + $small$1$i = $small$0$i; + break; + } + $round6$1$i = -$$20$i; + $small$1$i = -$small$0$i; + } while (0); + $598 = $580 - $581 | 0; + HEAP32[$576 >> 2] = $598; + if (!($round6$1$i + $small$1$i != $round6$1$i)) { + $a$7$i = $a$3$lcssa$i; + $d$3$i = $576; + $e$3$i = $e$1$i; + break; + } + $601 = $598 + $i$1$lcssa$i | 0; + HEAP32[$576 >> 2] = $601; + if ($601 >>> 0 > 999999999) { + $a$5109$i = $a$3$lcssa$i; + $d$2108$i = $576; + while (1) { + $603 = $d$2108$i + -4 | 0; + HEAP32[$d$2108$i >> 2] = 0; + if ($603 >>> 0 < $a$5109$i >>> 0) { + $605 = $a$5109$i + -4 | 0; + HEAP32[$605 >> 2] = 0; + $a$6$i = $605; + } else $a$6$i = $a$5109$i; + $607 = (HEAP32[$603 >> 2] | 0) + 1 | 0; + HEAP32[$603 >> 2] = $607; + if ($607 >>> 0 > 999999999) { + $a$5109$i = $a$6$i; + $d$2108$i = $603; + } else { + $a$5$lcssa$i = $a$6$i; + $d$2$lcssa$i = $603; + break; + } + } + } else { + $a$5$lcssa$i = $a$3$lcssa$i; + $d$2$lcssa$i = $576; + } + $612 = ($482 - $a$5$lcssa$i >> 2) * 9 | 0; + $613 = HEAP32[$a$5$lcssa$i >> 2] | 0; + if ($613 >>> 0 < 10) { + $a$7$i = $a$5$lcssa$i; + $d$3$i = $d$2$lcssa$i; + $e$3$i = $612; + break; + } else { + $e$2104$i = $612; + $i$2103$i = 10; + } + while (1) { + $i$2103$i = $i$2103$i * 10 | 0; + $616 = $e$2104$i + 1 | 0; + if ($613 >>> 0 < $i$2103$i >>> 0) { + $a$7$i = $a$5$lcssa$i; + $d$3$i = $d$2$lcssa$i; + $e$3$i = $616; + break; + } else $e$2104$i = $616; + } + } while (0); + $618 = $d$3$i + 4 | 0; + $a$8$ph$i = $a$7$i; + $e$4$ph$i = $e$3$i; + $z$6$ph$i = $z$3$lcssa$i >>> 0 > $618 >>> 0 ? $618 : $z$3$lcssa$i; + } else { + $a$8$ph$i = $a$3$lcssa$i; + $e$4$ph$i = $e$1$i; + $z$6$ph$i = $z$3$lcssa$i; + } + $620 = 0 - $e$4$ph$i | 0; + $z$6$i = $z$6$ph$i; + while (1) { + if ($z$6$i >>> 0 <= $a$8$ph$i >>> 0) { + $$lcssa159$i = 0; + $z$6$i$lcssa = $z$6$i; + break; + } + $622 = $z$6$i + -4 | 0; + if (!(HEAP32[$622 >> 2] | 0)) $z$6$i = $622; else { + $$lcssa159$i = 1; + $z$6$i$lcssa = $z$6$i; + break; + } + } + do if ($564) { + $$p$$i = ($565 & 1 ^ 1) + $$p$i | 0; + if (($$p$$i | 0) > ($e$4$ph$i | 0) & ($e$4$ph$i | 0) > -5) { + $$013$i = $t$0 + -1 | 0; + $$210$i = $$p$$i + -1 - $e$4$ph$i | 0; + } else { + $$013$i = $t$0 + -2 | 0; + $$210$i = $$p$$i + -1 | 0; + } + $633 = $fl$1$ & 8; + if ($633) { + $$114$i = $$013$i; + $$311$i = $$210$i; + $$pre$phi184$iZ2D = $633; + break; + } + do if ($$lcssa159$i) { + $636 = HEAP32[$z$6$i$lcssa + -4 >> 2] | 0; + if (!$636) { + $j$2$i = 9; + break; + } + if (!(($636 >>> 0) % 10 | 0)) { + $i$399$i = 10; + $j$1100$i = 0; + } else { + $j$2$i = 0; + break; + } + while (1) { + $i$399$i = $i$399$i * 10 | 0; + $641 = $j$1100$i + 1 | 0; + if (($636 >>> 0) % ($i$399$i >>> 0) | 0) { + $j$2$i = $641; + break; + } else $j$1100$i = $641; + } + } else $j$2$i = 9; while (0); + $650 = (($z$6$i$lcssa - $482 >> 2) * 9 | 0) + -9 | 0; + if (($$013$i | 32 | 0) == 102) { + $651 = $650 - $j$2$i | 0; + $$21$i = ($651 | 0) < 0 ? 0 : $651; + $$114$i = $$013$i; + $$311$i = ($$210$i | 0) < ($$21$i | 0) ? $$210$i : $$21$i; + $$pre$phi184$iZ2D = 0; + break; + } else { + $655 = $650 + $e$4$ph$i - $j$2$i | 0; + $$23$i = ($655 | 0) < 0 ? 0 : $655; + $$114$i = $$013$i; + $$311$i = ($$210$i | 0) < ($$23$i | 0) ? $$210$i : $$23$i; + $$pre$phi184$iZ2D = 0; + break; + } + } else { + $$114$i = $t$0; + $$311$i = $$p$i; + $$pre$phi184$iZ2D = $fl$1$ & 8; + } while (0); + $658 = $$311$i | $$pre$phi184$iZ2D; + $660 = ($658 | 0) != 0 & 1; + $662 = ($$114$i | 32 | 0) == 102; + if ($662) { + $$pn$i = ($e$4$ph$i | 0) > 0 ? $e$4$ph$i : 0; + $estr$2$i = 0; + } else { + $666 = ($e$4$ph$i | 0) < 0 ? $620 : $e$4$ph$i; + $669 = _fmt_u($666, (($666 | 0) < 0) << 31 >> 31, $5) | 0; + if (($8 - $669 | 0) < 2) { + $estr$193$i = $669; + while (1) { + $673 = $estr$193$i + -1 | 0; + HEAP8[$673 >> 0] = 48; + if (($8 - $673 | 0) < 2) $estr$193$i = $673; else { + $estr$1$lcssa$i = $673; + break; + } + } + } else $estr$1$lcssa$i = $669; + HEAP8[$estr$1$lcssa$i + -1 >> 0] = ($e$4$ph$i >> 31 & 2) + 43; + $683 = $estr$1$lcssa$i + -2 | 0; + HEAP8[$683 >> 0] = $$114$i; + $$pn$i = $8 - $683 | 0; + $estr$2$i = $683; + } + $688 = $pl$0$i + 1 + $$311$i + $660 + $$pn$i | 0; + _pad($f, 32, $w$1, $688, $fl$1$); + if (!(HEAP32[$f >> 2] & 32)) ___fwritex($prefix$0$i, $pl$0$i, $f) | 0; + _pad($f, 48, $w$1, $688, $fl$1$ ^ 65536); + do if ($662) { + $r$0$a$8$i = $a$8$ph$i >>> 0 > $$31$i >>> 0 ? $$31$i : $a$8$ph$i; + $d$482$i = $r$0$a$8$i; + while (1) { + $695 = _fmt_u(HEAP32[$d$482$i >> 2] | 0, 0, $13) | 0; + do if (($d$482$i | 0) == ($r$0$a$8$i | 0)) { + if (($695 | 0) != ($13 | 0)) { + $s7$1$i = $695; + break; + } + HEAP8[$15 >> 0] = 48; + $s7$1$i = $15; + } else { + if ($695 >>> 0 > $buf$i >>> 0) $s7$079$i = $695; else { + $s7$1$i = $695; + break; + } + while (1) { + $698 = $s7$079$i + -1 | 0; + HEAP8[$698 >> 0] = 48; + if ($698 >>> 0 > $buf$i >>> 0) $s7$079$i = $698; else { + $s7$1$i = $698; + break; + } + } + } while (0); + if (!(HEAP32[$f >> 2] & 32)) ___fwritex($s7$1$i, $14 - $s7$1$i | 0, $f) | 0; + $706 = $d$482$i + 4 | 0; + if ($706 >>> 0 > $$31$i >>> 0) { + $$lcssa339 = $706; + break; + } else $d$482$i = $706; + } + do if ($658) { + if (HEAP32[$f >> 2] & 32) break; + ___fwritex(18335, 1, $f) | 0; + } while (0); + if (($$311$i | 0) > 0 & $$lcssa339 >>> 0 < $z$6$i$lcssa >>> 0) { + $$41276$i = $$311$i; + $d$575$i = $$lcssa339; + while (1) { + $716 = _fmt_u(HEAP32[$d$575$i >> 2] | 0, 0, $13) | 0; + if ($716 >>> 0 > $buf$i >>> 0) { + $s8$070$i = $716; + while (1) { + $718 = $s8$070$i + -1 | 0; + HEAP8[$718 >> 0] = 48; + if ($718 >>> 0 > $buf$i >>> 0) $s8$070$i = $718; else { + $s8$0$lcssa$i = $718; + break; + } + } + } else $s8$0$lcssa$i = $716; + if (!(HEAP32[$f >> 2] & 32)) ___fwritex($s8$0$lcssa$i, ($$41276$i | 0) > 9 ? 9 : $$41276$i, $f) | 0; + $d$575$i = $d$575$i + 4 | 0; + $726 = $$41276$i + -9 | 0; + if (!(($$41276$i | 0) > 9 & $d$575$i >>> 0 < $z$6$i$lcssa >>> 0)) { + $$412$lcssa$i = $726; + break; + } else $$41276$i = $726; + } + } else $$412$lcssa$i = $$311$i; + _pad($f, 48, $$412$lcssa$i + 9 | 0, 9, 0); + } else { + $z$6$$i = $$lcssa159$i ? $z$6$i$lcssa : $a$8$ph$i + 4 | 0; + if (($$311$i | 0) > -1) { + $733 = ($$pre$phi184$iZ2D | 0) == 0; + $$587$i = $$311$i; + $d$686$i = $a$8$ph$i; + while (1) { + $735 = _fmt_u(HEAP32[$d$686$i >> 2] | 0, 0, $13) | 0; + if (($735 | 0) == ($13 | 0)) { + HEAP8[$15 >> 0] = 48; + $s9$0$i = $15; + } else $s9$0$i = $735; + do if (($d$686$i | 0) == ($a$8$ph$i | 0)) { + $741 = $s9$0$i + 1 | 0; + if (!(HEAP32[$f >> 2] & 32)) ___fwritex($s9$0$i, 1, $f) | 0; + if ($733 & ($$587$i | 0) < 1) { + $s9$2$i = $741; + break; + } + if (HEAP32[$f >> 2] & 32) { + $s9$2$i = $741; + break; + } + ___fwritex(18335, 1, $f) | 0; + $s9$2$i = $741; + } else { + if ($s9$0$i >>> 0 > $buf$i >>> 0) $s9$183$i = $s9$0$i; else { + $s9$2$i = $s9$0$i; + break; + } + while (1) { + $739 = $s9$183$i + -1 | 0; + HEAP8[$739 >> 0] = 48; + if ($739 >>> 0 > $buf$i >>> 0) $s9$183$i = $739; else { + $s9$2$i = $739; + break; + } + } + } while (0); + $750 = $14 - $s9$2$i | 0; + if (!(HEAP32[$f >> 2] & 32)) ___fwritex($s9$2$i, ($$587$i | 0) > ($750 | 0) ? $750 : $$587$i, $f) | 0; + $756 = $$587$i - $750 | 0; + $d$686$i = $d$686$i + 4 | 0; + if (!($d$686$i >>> 0 < $z$6$$i >>> 0 & ($756 | 0) > -1)) { + $$5$lcssa$i = $756; + break; + } else $$587$i = $756; + } + } else $$5$lcssa$i = $$311$i; + _pad($f, 48, $$5$lcssa$i + 18 | 0, 18, 0); + if (HEAP32[$f >> 2] & 32) break; + ___fwritex($estr$2$i, $8 - $estr$2$i | 0, $f) | 0; + } while (0); + _pad($f, 32, $w$1, $688, $fl$1$ ^ 8192); + $$0$i = ($688 | 0) < ($w$1 | 0) ? $w$1 : $688; + } else { + $377 = ($t$0 & 32 | 0) != 0; + $379 = $$07$i != $$07$i | 0.0 != 0.0; + $pl$1$i = $379 ? 0 : $pl$0$i; + $381 = $pl$1$i + 3 | 0; + _pad($f, 32, $w$1, $381, $175); + $382 = HEAP32[$f >> 2] | 0; + if (!($382 & 32)) { + ___fwritex($prefix$0$i, $pl$1$i, $f) | 0; + $386 = HEAP32[$f >> 2] | 0; + } else $386 = $382; + if (!($386 & 32)) ___fwritex($379 ? ($377 ? 18327 : 18331) : $377 ? 18319 : 18323, 3, $f) | 0; + _pad($f, 32, $w$1, $381, $fl$1$ ^ 8192); + $$0$i = ($381 | 0) < ($w$1 | 0) ? $w$1 : $381; + } while (0); + $cnt$0 = $cnt$1; + $fmt41 = $$lcssa323; + $l$0 = $$0$i; + $l10n$0 = $l10n$3; + continue L1; + break; + } + default: + { + $a$2 = $fmt41; + $fl$6 = $fl$1$; + $p$5 = $p$0; + $pl$2 = 0; + $prefix$2 = 18283; + $z$2 = $1; + } + } while (0); + L313 : do if ((label | 0) == 64) { + label = 0; + $206 = $arg; + $208 = HEAP32[$206 >> 2] | 0; + $211 = HEAP32[$206 + 4 >> 2] | 0; + $212 = $t$1 & 32; + if (($208 | 0) == 0 & ($211 | 0) == 0) { + $a$0 = $1; + $fl$4 = $fl$3; + $p$2 = $p$1; + $pl$1 = 0; + $prefix$1 = 18283; + label = 77; + } else { + $$012$i = $1; + $217 = $208; + $224 = $211; + while (1) { + $223 = $$012$i + -1 | 0; + HEAP8[$223 >> 0] = HEAPU8[18267 + ($217 & 15) >> 0] | $212; + $217 = _bitshift64Lshr($217 | 0, $224 | 0, 4) | 0; + $224 = tempRet0; + if (($217 | 0) == 0 & ($224 | 0) == 0) { + $$lcssa344 = $223; + break; + } else $$012$i = $223; + } + $230 = $arg; + if (($fl$3 & 8 | 0) == 0 | (HEAP32[$230 >> 2] | 0) == 0 & (HEAP32[$230 + 4 >> 2] | 0) == 0) { + $a$0 = $$lcssa344; + $fl$4 = $fl$3; + $p$2 = $p$1; + $pl$1 = 0; + $prefix$1 = 18283; + label = 77; + } else { + $a$0 = $$lcssa344; + $fl$4 = $fl$3; + $p$2 = $p$1; + $pl$1 = 2; + $prefix$1 = 18283 + ($t$1 >> 4) | 0; + label = 77; + } + } + } else if ((label | 0) == 76) { + label = 0; + $a$0 = _fmt_u($286, $287, $1) | 0; + $fl$4 = $fl$1$; + $p$2 = $p$0; + $pl$1 = $pl$0; + $prefix$1 = $prefix$0; + label = 77; + } else if ((label | 0) == 82) { + label = 0; + $320 = _memchr($a$1, 0, $p$0) | 0; + $321 = ($320 | 0) == 0; + $a$2 = $a$1; + $fl$6 = $175; + $p$5 = $321 ? $p$0 : $320 - $a$1 | 0; + $pl$2 = 0; + $prefix$2 = 18283; + $z$2 = $321 ? $a$1 + $p$0 | 0 : $320; + } else if ((label | 0) == 86) { + label = 0; + $i$0114 = 0; + $l$1113 = 0; + $ws$0115 = HEAP32[$arg >> 2] | 0; + while (1) { + $334 = HEAP32[$ws$0115 >> 2] | 0; + if (!$334) { + $i$0$lcssa = $i$0114; + $l$2 = $l$1113; + break; + } + $336 = _wctomb($mb, $334) | 0; + if (($336 | 0) < 0 | $336 >>> 0 > ($p$4198 - $i$0114 | 0) >>> 0) { + $i$0$lcssa = $i$0114; + $l$2 = $336; + break; + } + $341 = $336 + $i$0114 | 0; + if ($p$4198 >>> 0 > $341 >>> 0) { + $i$0114 = $341; + $l$1113 = $336; + $ws$0115 = $ws$0115 + 4 | 0; + } else { + $i$0$lcssa = $341; + $l$2 = $336; + break; + } + } + if (($l$2 | 0) < 0) { + $$0 = -1; + break L1; + } + _pad($f, 32, $w$1, $i$0$lcssa, $fl$1$); + if (!$i$0$lcssa) { + $i$0$lcssa200 = 0; + label = 98; + } else { + $i$1125 = 0; + $ws$1126 = HEAP32[$arg >> 2] | 0; + while (1) { + $346 = HEAP32[$ws$1126 >> 2] | 0; + if (!$346) { + $i$0$lcssa200 = $i$0$lcssa; + label = 98; + break L313; + } + $349 = _wctomb($mb, $346) | 0; + $i$1125 = $349 + $i$1125 | 0; + if (($i$1125 | 0) > ($i$0$lcssa | 0)) { + $i$0$lcssa200 = $i$0$lcssa; + label = 98; + break L313; + } + if (!(HEAP32[$f >> 2] & 32)) ___fwritex($mb, $349, $f) | 0; + if ($i$1125 >>> 0 >= $i$0$lcssa >>> 0) { + $i$0$lcssa200 = $i$0$lcssa; + label = 98; + break; + } else $ws$1126 = $ws$1126 + 4 | 0; + } + } + } while (0); + if ((label | 0) == 98) { + label = 0; + _pad($f, 32, $w$1, $i$0$lcssa200, $fl$1$ ^ 8192); + $cnt$0 = $cnt$1; + $fmt41 = $$lcssa323; + $l$0 = ($w$1 | 0) > ($i$0$lcssa200 | 0) ? $w$1 : $i$0$lcssa200; + $l10n$0 = $l10n$3; + continue; + } + if ((label | 0) == 77) { + label = 0; + $$fl$4 = ($p$2 | 0) > -1 ? $fl$4 & -65537 : $fl$4; + $291 = $arg; + $299 = (HEAP32[$291 >> 2] | 0) != 0 | (HEAP32[$291 + 4 >> 2] | 0) != 0; + if (($p$2 | 0) != 0 | $299) { + $305 = ($299 & 1 ^ 1) + ($2 - $a$0) | 0; + $a$2 = $a$0; + $fl$6 = $$fl$4; + $p$5 = ($p$2 | 0) > ($305 | 0) ? $p$2 : $305; + $pl$2 = $pl$1; + $prefix$2 = $prefix$1; + $z$2 = $1; + } else { + $a$2 = $1; + $fl$6 = $$fl$4; + $p$5 = 0; + $pl$2 = $pl$1; + $prefix$2 = $prefix$1; + $z$2 = $1; + } + } + $771 = $z$2 - $a$2 | 0; + $$p$5 = ($p$5 | 0) < ($771 | 0) ? $771 : $p$5; + $773 = $pl$2 + $$p$5 | 0; + $w$2 = ($w$1 | 0) < ($773 | 0) ? $773 : $w$1; + _pad($f, 32, $w$2, $773, $fl$6); + if (!(HEAP32[$f >> 2] & 32)) ___fwritex($prefix$2, $pl$2, $f) | 0; + _pad($f, 48, $w$2, $773, $fl$6 ^ 65536); + _pad($f, 48, $$p$5, $771, 0); + if (!(HEAP32[$f >> 2] & 32)) ___fwritex($a$2, $771, $f) | 0; + _pad($f, 32, $w$2, $773, $fl$6 ^ 8192); + $cnt$0 = $cnt$1; + $fmt41 = $$lcssa323; + $l$0 = $w$2; + $l10n$0 = $l10n$3; + } + L348 : do if ((label | 0) == 245) if (!$f) if (!$l10n$0$lcssa) $$0 = 0; else { + $i$2100 = 1; + while (1) { + $786 = HEAP32[$nl_type + ($i$2100 << 2) >> 2] | 0; + if (!$786) { + $i$2100$lcssa = $i$2100; + break; + } + _pop_arg($nl_arg + ($i$2100 << 3) | 0, $786, $ap); + $i$2100 = $i$2100 + 1 | 0; + if (($i$2100 | 0) >= 10) { + $$0 = 1; + break L348; + } + } + if (($i$2100$lcssa | 0) < 10) { + $i$398 = $i$2100$lcssa; + while (1) { + if (HEAP32[$nl_type + ($i$398 << 2) >> 2] | 0) { + $$0 = -1; + break L348; + } + $i$398 = $i$398 + 1 | 0; + if (($i$398 | 0) >= 10) { + $$0 = 1; + break; + } + } + } else $$0 = 1; + } else $$0 = $cnt$1$lcssa; while (0); + STACKTOP = sp; + return $$0 | 0; +} +function __ZN10__cxxabiv112_GLOBAL__N_118parse_expr_primaryINS0_2DbEEEPKcS4_S4_RT_($first, $last, $db) { + $first = $first | 0; + $last = $last | 0; + $db = $db | 0; + var $$0 = 0, $$0$i = 0, $$0$i$i$i = 0, $$0$i$i$i$i = 0, $$0$i$i$i$i46 = 0, $$0$i$i$i$i62 = 0, $$0$i$i$i26 = 0, $$0$i$i117 = 0, $$0$i49 = 0, $$01$i$i$i122 = 0, $$01$i$i$i41126 = 0, $$01$i$i$i57130 = 0, $$1$i = 0, $$lcssa = 0, $$lcssa154 = 0, $$lcssa155 = 0, $$lcssa157 = 0, $$lcssa158 = 0, $$lcssa160 = 0, $$lcssa161 = 0, $0 = 0, $1 = 0, $10 = 0, $101 = 0, $102 = 0, $104 = 0, $105 = 0, $107 = 0, $108 = 0, $11 = 0, $110 = 0, $111 = 0, $113 = 0, $114 = 0, $116 = 0, $117 = 0, $119 = 0, $12 = 0, $120 = 0, $122 = 0, $123 = 0, $125 = 0, $126 = 0, $128 = 0, $129 = 0, $13 = 0, $131 = 0, $132 = 0, $134 = 0, $138 = 0, $14 = 0, $141 = 0, $145 = 0, $148 = 0, $148$phi = 0, $149 = 0, $15 = 0, $156 = 0, $157 = 0, $159 = 0, $16 = 0, $163 = 0, $165 = 0, $17 = 0, $171 = 0, $173 = 0, $174 = 0, $176 = 0, $18 = 0, $183 = 0, $184 = 0, $185 = 0, $186 = 0, $19 = 0, $190 = 0, $192 = 0, $195 = 0, $196 = 0, $2 = 0, $20 = 0, $200 = 0, $204 = 0, $207 = 0, $21 = 0, $211 = 0, $214 = 0, $214$phi = 0, $215 = 0, $22 = 0, $222 = 0, $223 = 0, $225 = 0, $229 = 0, $23 = 0, $231 = 0, $236 = 0, $238 = 0, $239 = 0, $24 = 0, $241 = 0, $248 = 0, $249 = 0, $25 = 0, $250 = 0, $251 = 0, $255 = 0, $257 = 0, $260 = 0, $261 = 0, $265 = 0, $269 = 0, $272 = 0, $276 = 0, $279 = 0, $279$phi = 0, $280 = 0, $287 = 0, $288 = 0, $290 = 0, $294 = 0, $296 = 0, $3 = 0, $301 = 0, $303 = 0, $304 = 0, $306 = 0, $31 = 0, $313 = 0, $314 = 0, $315 = 0, $316 = 0, $320 = 0, $322 = 0, $325 = 0, $326 = 0, $333 = 0, $334 = 0, $34 = 0, $340 = 0, $346 = 0, $35 = 0, $354 = 0, $356 = 0, $357 = 0, $360 = 0, $365 = 0, $372 = 0, $373 = 0, $382 = 0, $384 = 0, $394 = 0, $4 = 0, $43 = 0, $44 = 0, $46 = 0, $5 = 0, $53 = 0, $54 = 0, $55 = 0, $56 = 0, $6 = 0, $60 = 0, $62 = 0, $65 = 0, $66 = 0, $69 = 0, $7 = 0, $70 = 0, $72 = 0, $79 = 0, $8 = 0, $80 = 0, $81 = 0, $82 = 0, $86 = 0, $88 = 0, $9 = 0, $91 = 0, $92 = 0, $95 = 0, $96 = 0, $98 = 0, $99 = 0, $__p$0$i$i116 = 0, $__p$0$ph$i$i = 0, $e$0$i124 = 0, $e$0$i124$lcssa153 = 0, $e$0$i33128 = 0, $e$0$i33128$lcssa156 = 0, $e$0$i52132 = 0, $e$0$i52132$lcssa159 = 0, $n$0120 = 0, $n$0120$lcssa = 0, $num$i51 = 0, $t$0$i125 = 0, $t$0$i34129 = 0, $t$0$i53133 = 0, $vararg_buffer = 0, $vararg_buffer1 = 0, $vararg_buffer4 = 0, dest = 0, sp = 0, stop = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 480 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer4 = sp + 72 | 0; + $vararg_buffer1 = sp + 48 | 0; + $vararg_buffer = sp + 24 | 0; + $0 = sp; + $num$i51 = sp + 432 | 0; + $1 = sp + 408 | 0; + $2 = sp + 396 | 0; + $3 = sp + 384 | 0; + $4 = sp + 360 | 0; + $5 = sp + 336 | 0; + $6 = sp + 320 | 0; + $7 = sp + 308 | 0; + $8 = sp + 296 | 0; + $9 = sp + 284 | 0; + $10 = sp + 272 | 0; + $11 = sp + 260 | 0; + $12 = sp + 248 | 0; + $13 = sp + 236 | 0; + $14 = sp + 224 | 0; + $15 = sp + 212 | 0; + $16 = sp + 200 | 0; + $17 = sp + 188 | 0; + $18 = sp + 176 | 0; + $19 = sp + 152 | 0; + $20 = sp + 140 | 0; + $21 = sp + 128 | 0; + $22 = sp + 116 | 0; + $23 = sp + 104 | 0; + $24 = sp + 92 | 0; + $25 = $last; + L1 : do if (($25 - $first | 0) > 3) if ((HEAP8[$first >> 0] | 0) == 76) { + $31 = $first + 1 | 0; + do switch (HEAP8[$31 >> 0] | 0) { + case 84: + { + $$0 = $first; + break L1; + break; + } + case 119: + { + $34 = $first + 2 | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($3, 13764, 7); + $35 = __ZN10__cxxabiv112_GLOBAL__N_121parse_integer_literalINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_($34, $last, $3, $db) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($3); + $$0 = ($35 | 0) == ($34 | 0) ? $first : $35; + break L1; + break; + } + case 98: + { + if ((HEAP8[$first + 3 >> 0] | 0) != 69) { + $$0 = $first; + break L1; + } + switch (HEAP8[$first + 2 >> 0] | 0) { + case 48: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj6EEERAT__Kc($4, 13772); + $43 = $db + 4 | 0; + $44 = HEAP32[$43 >> 2] | 0; + $46 = HEAP32[$db + 8 >> 2] | 0; + if ($44 >>> 0 < $46 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($44, $4); + HEAP32[$43 >> 2] = (HEAP32[$43 >> 2] | 0) + 24; + } else { + $53 = HEAP32[$db >> 2] | 0; + $54 = $44 - $53 | 0; + $55 = ($54 | 0) / 24 | 0; + $56 = $55 + 1 | 0; + if (($54 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $60 = ($46 - $53 | 0) / 24 | 0; + if ($60 >>> 0 < 1073741823) { + $62 = $60 << 1; + $$0$i$i$i = $62 >>> 0 < $56 >>> 0 ? $56 : $62; + } else $$0$i$i$i = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($0, $$0$i$i$i, $55, $db + 12 | 0); + $65 = $0 + 8 | 0; + $66 = HEAP32[$65 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($66, $4); + HEAP32[$65 >> 2] = $66 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $0); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($0); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($4); + $$0 = $first + 4 | 0; + break L1; + break; + } + case 49: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj5EEERAT__Kc($5, 13778); + $69 = $db + 4 | 0; + $70 = HEAP32[$69 >> 2] | 0; + $72 = HEAP32[$db + 8 >> 2] | 0; + if ($70 >>> 0 < $72 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($70, $5); + HEAP32[$69 >> 2] = (HEAP32[$69 >> 2] | 0) + 24; + } else { + $79 = HEAP32[$db >> 2] | 0; + $80 = $70 - $79 | 0; + $81 = ($80 | 0) / 24 | 0; + $82 = $81 + 1 | 0; + if (($80 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $86 = ($72 - $79 | 0) / 24 | 0; + if ($86 >>> 0 < 1073741823) { + $88 = $86 << 1; + $$0$i$i$i26 = $88 >>> 0 < $82 >>> 0 ? $82 : $88; + } else $$0$i$i$i26 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($0, $$0$i$i$i26, $81, $db + 12 | 0); + $91 = $0 + 8 | 0; + $92 = HEAP32[$91 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($92, $5); + HEAP32[$91 >> 2] = $92 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $0); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($0); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($5); + $$0 = $first + 4 | 0; + break L1; + break; + } + default: + { + $$0 = $first; + break L1; + } + } + break; + } + case 99: + { + $95 = $first + 2 | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($6, 13783, 4); + $96 = __ZN10__cxxabiv112_GLOBAL__N_121parse_integer_literalINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_($95, $last, $6, $db) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($6); + $$0 = ($96 | 0) == ($95 | 0) ? $first : $96; + break L1; + break; + } + case 97: + { + $98 = $first + 2 | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($7, 13788, 11); + $99 = __ZN10__cxxabiv112_GLOBAL__N_121parse_integer_literalINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_($98, $last, $7, $db) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($7); + $$0 = ($99 | 0) == ($98 | 0) ? $first : $99; + break L1; + break; + } + case 104: + { + $101 = $first + 2 | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($8, 13800, 13); + $102 = __ZN10__cxxabiv112_GLOBAL__N_121parse_integer_literalINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_($101, $last, $8, $db) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($8); + $$0 = ($102 | 0) == ($101 | 0) ? $first : $102; + break L1; + break; + } + case 115: + { + $104 = $first + 2 | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($9, 13814, 5); + $105 = __ZN10__cxxabiv112_GLOBAL__N_121parse_integer_literalINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_($104, $last, $9, $db) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($9); + $$0 = ($105 | 0) == ($104 | 0) ? $first : $105; + break L1; + break; + } + case 116: + { + $107 = $first + 2 | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($10, 13820, 14); + $108 = __ZN10__cxxabiv112_GLOBAL__N_121parse_integer_literalINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_($107, $last, $10, $db) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($10); + $$0 = ($108 | 0) == ($107 | 0) ? $first : $108; + break L1; + break; + } + case 105: + { + $110 = $first + 2 | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($11, 13835, 0); + $111 = __ZN10__cxxabiv112_GLOBAL__N_121parse_integer_literalINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_($110, $last, $11, $db) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($11); + $$0 = ($111 | 0) == ($110 | 0) ? $first : $111; + break L1; + break; + } + case 106: + { + $113 = $first + 2 | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($12, 13836, 1); + $114 = __ZN10__cxxabiv112_GLOBAL__N_121parse_integer_literalINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_($113, $last, $12, $db) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($12); + $$0 = ($114 | 0) == ($113 | 0) ? $first : $114; + break L1; + break; + } + case 108: + { + $116 = $first + 2 | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($13, 13838, 1); + $117 = __ZN10__cxxabiv112_GLOBAL__N_121parse_integer_literalINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_($116, $last, $13, $db) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($13); + $$0 = ($117 | 0) == ($116 | 0) ? $first : $117; + break L1; + break; + } + case 109: + { + $119 = $first + 2 | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($14, 13840, 2); + $120 = __ZN10__cxxabiv112_GLOBAL__N_121parse_integer_literalINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_($119, $last, $14, $db) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($14); + $$0 = ($120 | 0) == ($119 | 0) ? $first : $120; + break L1; + break; + } + case 120: + { + $122 = $first + 2 | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($15, 13843, 2); + $123 = __ZN10__cxxabiv112_GLOBAL__N_121parse_integer_literalINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_($122, $last, $15, $db) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($15); + $$0 = ($123 | 0) == ($122 | 0) ? $first : $123; + break L1; + break; + } + case 121: + { + $125 = $first + 2 | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($16, 13846, 3); + $126 = __ZN10__cxxabiv112_GLOBAL__N_121parse_integer_literalINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_($125, $last, $16, $db) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($16); + $$0 = ($126 | 0) == ($125 | 0) ? $first : $126; + break L1; + break; + } + case 110: + { + $128 = $first + 2 | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($17, 13850, 8); + $129 = __ZN10__cxxabiv112_GLOBAL__N_121parse_integer_literalINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_($128, $last, $17, $db) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($17); + $$0 = ($129 | 0) == ($128 | 0) ? $first : $129; + break L1; + break; + } + case 111: + { + $131 = $first + 2 | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($18, 13859, 17); + $132 = __ZN10__cxxabiv112_GLOBAL__N_121parse_integer_literalINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_($131, $last, $18, $db) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($18); + $$0 = ($132 | 0) == ($131 | 0) ? $first : $132; + break L1; + break; + } + case 102: + { + $134 = $first + 2 | 0; + L67 : do if (($25 - $134 | 0) >>> 0 > 8) { + $138 = $first + 10 | 0; + $141 = HEAP8[$134 >> 0] | 0; + $148 = $first; + $e$0$i124 = $0; + $t$0$i125 = $134; + while (1) { + if (!(_isxdigit($141 << 24 >> 24) | 0)) { + $$0$i = $134; + break L67; + } + $145 = HEAP8[$t$0$i125 >> 0] | 0; + $149 = HEAP8[$148 + 3 >> 0] | 0; + HEAP8[$e$0$i124 >> 0] = ((($149 << 24 >> 24) + -48 | 0) >>> 0 < 10 ? 208 : 169) + ($149 & 255) + ((($145 + -48 | 0) >>> 0 < 10 ? 0 : 9) + $145 << 4); + $156 = $t$0$i125 + 2 | 0; + $157 = $e$0$i124 + 1 | 0; + $159 = HEAP8[$156 >> 0] | 0; + if (($156 | 0) == ($138 | 0)) { + $$lcssa154 = $157; + $$lcssa155 = $159; + $e$0$i124$lcssa153 = $e$0$i124; + break; + } else { + $148$phi = $t$0$i125; + $141 = $159; + $e$0$i124 = $157; + $t$0$i125 = $156; + $148 = $148$phi; + } + } + if ($$lcssa155 << 24 >> 24 == 69) { + if (($0 | 0) != ($$lcssa154 | 0) & $0 >>> 0 < $e$0$i124$lcssa153 >>> 0) { + $$01$i$i$i122 = $0; + $165 = $e$0$i124$lcssa153; + do { + $163 = HEAP8[$$01$i$i$i122 >> 0] | 0; + HEAP8[$$01$i$i$i122 >> 0] = HEAP8[$165 >> 0] | 0; + HEAP8[$165 >> 0] = $163; + $$01$i$i$i122 = $$01$i$i$i122 + 1 | 0; + $165 = $165 + -1 | 0; + } while ($$01$i$i$i122 >>> 0 < $165 >>> 0); + } + dest = $num$i51; + stop = dest + 24 | 0; + do { + HEAP8[dest >> 0] = 0; + dest = dest + 1 | 0; + } while ((dest | 0) < (stop | 0)); + HEAPF64[$vararg_buffer >> 3] = +HEAPF32[$0 >> 2]; + $171 = _snprintf($num$i51, 24, 13877, $vararg_buffer) | 0; + if ($171 >>> 0 > 23) $$0$i = $134; else { + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($2, $num$i51, $171); + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ENSt3__112basic_stringIcNS2_11char_traitsIcEENS0_12malloc_allocIcEEEE($1, $2); + $173 = $db + 4 | 0; + $174 = HEAP32[$173 >> 2] | 0; + $176 = HEAP32[$db + 8 >> 2] | 0; + if ($174 >>> 0 < $176 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($174, $1); + HEAP32[$173 >> 2] = (HEAP32[$173 >> 2] | 0) + 24; + } else { + $183 = HEAP32[$db >> 2] | 0; + $184 = $174 - $183 | 0; + $185 = ($184 | 0) / 24 | 0; + $186 = $185 + 1 | 0; + if (($184 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $190 = ($176 - $183 | 0) / 24 | 0; + if ($190 >>> 0 < 1073741823) { + $192 = $190 << 1; + $$0$i$i$i$i = $192 >>> 0 < $186 >>> 0 ? $186 : $192; + } else $$0$i$i$i$i = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($vararg_buffer, $$0$i$i$i$i, $185, $db + 12 | 0); + $195 = $vararg_buffer + 8 | 0; + $196 = HEAP32[$195 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($196, $1); + HEAP32[$195 >> 2] = $196 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $vararg_buffer); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($vararg_buffer); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($1); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($2); + $$0$i = $first + 11 | 0; + } + } else $$0$i = $134; + } else $$0$i = $134; while (0); + $$0 = ($$0$i | 0) == ($134 | 0) ? $first : $$0$i; + break L1; + break; + } + case 100: + { + $200 = $first + 2 | 0; + L91 : do if (($25 - $200 | 0) >>> 0 > 16) { + $204 = $first + 18 | 0; + $207 = HEAP8[$200 >> 0] | 0; + $214 = $first; + $e$0$i33128 = $0; + $t$0$i34129 = $200; + while (1) { + if (!(_isxdigit($207 << 24 >> 24) | 0)) { + $$0$i49 = $200; + break L91; + } + $211 = HEAP8[$t$0$i34129 >> 0] | 0; + $215 = HEAP8[$214 + 3 >> 0] | 0; + HEAP8[$e$0$i33128 >> 0] = ((($215 << 24 >> 24) + -48 | 0) >>> 0 < 10 ? 208 : 169) + ($215 & 255) + ((($211 + -48 | 0) >>> 0 < 10 ? 0 : 9) + $211 << 4); + $222 = $t$0$i34129 + 2 | 0; + $223 = $e$0$i33128 + 1 | 0; + $225 = HEAP8[$222 >> 0] | 0; + if (($222 | 0) == ($204 | 0)) { + $$lcssa157 = $223; + $$lcssa158 = $225; + $e$0$i33128$lcssa156 = $e$0$i33128; + break; + } else { + $214$phi = $t$0$i34129; + $207 = $225; + $e$0$i33128 = $223; + $t$0$i34129 = $222; + $214 = $214$phi; + } + } + if ($$lcssa158 << 24 >> 24 == 69) { + if (($0 | 0) != ($$lcssa157 | 0) & $0 >>> 0 < $e$0$i33128$lcssa156 >>> 0) { + $$01$i$i$i41126 = $0; + $231 = $e$0$i33128$lcssa156; + do { + $229 = HEAP8[$$01$i$i$i41126 >> 0] | 0; + HEAP8[$$01$i$i$i41126 >> 0] = HEAP8[$231 >> 0] | 0; + HEAP8[$231 >> 0] = $229; + $$01$i$i$i41126 = $$01$i$i$i41126 + 1 | 0; + $231 = $231 + -1 | 0; + } while ($$01$i$i$i41126 >>> 0 < $231 >>> 0); + } + dest = $num$i51; + stop = dest + 32 | 0; + do { + HEAP8[dest >> 0] = 0; + dest = dest + 1 | 0; + } while ((dest | 0) < (stop | 0)); + HEAPF64[$vararg_buffer1 >> 3] = +HEAPF64[$0 >> 3]; + $236 = _snprintf($num$i51, 32, 13881, $vararg_buffer1) | 0; + if ($236 >>> 0 > 31) $$0$i49 = $200; else { + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($2, $num$i51, $236); + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ENSt3__112basic_stringIcNS2_11char_traitsIcEENS0_12malloc_allocIcEEEE($1, $2); + $238 = $db + 4 | 0; + $239 = HEAP32[$238 >> 2] | 0; + $241 = HEAP32[$db + 8 >> 2] | 0; + if ($239 >>> 0 < $241 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($239, $1); + HEAP32[$238 >> 2] = (HEAP32[$238 >> 2] | 0) + 24; + } else { + $248 = HEAP32[$db >> 2] | 0; + $249 = $239 - $248 | 0; + $250 = ($249 | 0) / 24 | 0; + $251 = $250 + 1 | 0; + if (($249 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $255 = ($241 - $248 | 0) / 24 | 0; + if ($255 >>> 0 < 1073741823) { + $257 = $255 << 1; + $$0$i$i$i$i46 = $257 >>> 0 < $251 >>> 0 ? $251 : $257; + } else $$0$i$i$i$i46 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($vararg_buffer1, $$0$i$i$i$i46, $250, $db + 12 | 0); + $260 = $vararg_buffer1 + 8 | 0; + $261 = HEAP32[$260 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($261, $1); + HEAP32[$260 >> 2] = $261 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $vararg_buffer1); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($vararg_buffer1); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($1); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($2); + $$0$i49 = $first + 19 | 0; + } + } else $$0$i49 = $200; + } else $$0$i49 = $200; while (0); + $$0 = ($$0$i49 | 0) == ($200 | 0) ? $first : $$0$i49; + break L1; + break; + } + case 101: + { + $265 = $first + 2 | 0; + L115 : do if (($25 - $265 | 0) >>> 0 > 20) { + $269 = $first + 22 | 0; + $272 = HEAP8[$265 >> 0] | 0; + $279 = $first; + $e$0$i52132 = $0; + $t$0$i53133 = $265; + while (1) { + if (!(_isxdigit($272 << 24 >> 24) | 0)) { + $$1$i = $265; + break L115; + } + $276 = HEAP8[$t$0$i53133 >> 0] | 0; + $280 = HEAP8[$279 + 3 >> 0] | 0; + HEAP8[$e$0$i52132 >> 0] = ((($280 << 24 >> 24) + -48 | 0) >>> 0 < 10 ? 208 : 169) + ($280 & 255) + ((($276 + -48 | 0) >>> 0 < 10 ? 0 : 9) + $276 << 4); + $287 = $t$0$i53133 + 2 | 0; + $288 = $e$0$i52132 + 1 | 0; + $290 = HEAP8[$287 >> 0] | 0; + if (($287 | 0) == ($269 | 0)) { + $$lcssa160 = $288; + $$lcssa161 = $290; + $e$0$i52132$lcssa159 = $e$0$i52132; + break; + } else { + $279$phi = $t$0$i53133; + $272 = $290; + $e$0$i52132 = $288; + $t$0$i53133 = $287; + $279 = $279$phi; + } + } + if ($$lcssa161 << 24 >> 24 == 69) { + if (($0 | 0) != ($$lcssa160 | 0) & $0 >>> 0 < $e$0$i52132$lcssa159 >>> 0) { + $$01$i$i$i57130 = $0; + $296 = $e$0$i52132$lcssa159; + do { + $294 = HEAP8[$$01$i$i$i57130 >> 0] | 0; + HEAP8[$$01$i$i$i57130 >> 0] = HEAP8[$296 >> 0] | 0; + HEAP8[$296 >> 0] = $294; + $$01$i$i$i57130 = $$01$i$i$i57130 + 1 | 0; + $296 = $296 + -1 | 0; + } while ($$01$i$i$i57130 >>> 0 < $296 >>> 0); + } + dest = $num$i51; + stop = dest + 40 | 0; + do { + HEAP8[dest >> 0] = 0; + dest = dest + 1 | 0; + } while ((dest | 0) < (stop | 0)); + HEAPF64[$vararg_buffer4 >> 3] = +HEAPF64[$0 >> 3]; + $301 = _snprintf($num$i51, 40, 13884, $vararg_buffer4) | 0; + if ($301 >>> 0 > 39) { + $$1$i = $265; + break; + } + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($2, $num$i51, $301); + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ENSt3__112basic_stringIcNS2_11char_traitsIcEENS0_12malloc_allocIcEEEE($1, $2); + $303 = $db + 4 | 0; + $304 = HEAP32[$303 >> 2] | 0; + $306 = HEAP32[$db + 8 >> 2] | 0; + if ($304 >>> 0 < $306 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($304, $1); + HEAP32[$303 >> 2] = (HEAP32[$303 >> 2] | 0) + 24; + } else { + $313 = HEAP32[$db >> 2] | 0; + $314 = $304 - $313 | 0; + $315 = ($314 | 0) / 24 | 0; + $316 = $315 + 1 | 0; + if (($314 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $320 = ($306 - $313 | 0) / 24 | 0; + if ($320 >>> 0 < 1073741823) { + $322 = $320 << 1; + $$0$i$i$i$i62 = $322 >>> 0 < $316 >>> 0 ? $316 : $322; + } else $$0$i$i$i$i62 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($vararg_buffer4, $$0$i$i$i$i62, $315, $db + 12 | 0); + $325 = $vararg_buffer4 + 8 | 0; + $326 = HEAP32[$325 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($326, $1); + HEAP32[$325 >> 2] = $326 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $vararg_buffer4); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($vararg_buffer4); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($1); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($2); + $$1$i = $first + 23 | 0; + } else $$1$i = $265; + } else $$1$i = $265; while (0); + $$0 = ($$1$i | 0) == ($265 | 0) ? $first : $$1$i; + break L1; + break; + } + case 95: + { + if ((HEAP8[$first + 2 >> 0] | 0) != 90) { + $$0 = $first; + break L1; + } + $333 = $first + 3 | 0; + $334 = __ZN10__cxxabiv112_GLOBAL__N_114parse_encodingINS0_2DbEEEPKcS4_S4_RT_($333, $last, $db) | 0; + if (($334 | 0) == ($333 | 0) | ($334 | 0) == ($last | 0)) { + $$0 = $first; + break L1; + } + STACKTOP = sp; + return ((HEAP8[$334 >> 0] | 0) == 69 ? $334 + 1 | 0 : $first) | 0; + } + default: + { + $340 = __ZN10__cxxabiv112_GLOBAL__N_110parse_typeINS0_2DbEEEPKcS4_S4_RT_($31, $last, $db) | 0; + if (($340 | 0) == ($31 | 0) | ($340 | 0) == ($last | 0)) { + $$0 = $first; + break L1; + } + if ((HEAP8[$340 >> 0] | 0) == 69) { + $$0 = $340 + 1 | 0; + break L1; + } + if (($340 | 0) == ($last | 0)) { + $$0 = $first; + break L1; + } else $n$0120 = $340; + while (1) { + $346 = HEAP8[$n$0120 >> 0] | 0; + if ((($346 << 24 >> 24) + -48 | 0) >>> 0 >= 10) { + $$lcssa = $346; + $n$0120$lcssa = $n$0120; + break; + } + $n$0120 = $n$0120 + 1 | 0; + if (($n$0120 | 0) == ($last | 0)) { + $$0 = $first; + break L1; + } + } + if (!(($n$0120$lcssa | 0) != ($340 | 0) & $$lcssa << 24 >> 24 == 69)) { + $$0 = $first; + break L1; + } + $354 = HEAP32[$db + 4 >> 2] | 0; + if ((HEAP32[$db >> 2] | 0) == ($354 | 0)) { + $$0 = $first; + break L1; + } + $356 = $354 + -24 | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($23, $356); + $357 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc($23, 0, 12714) | 0; + HEAP32[$22 >> 2] = HEAP32[$357 >> 2]; + HEAP32[$22 + 4 >> 2] = HEAP32[$357 + 4 >> 2]; + HEAP32[$22 + 8 >> 2] = HEAP32[$357 + 8 >> 2]; + HEAP32[$357 >> 2] = 0; + HEAP32[$357 + 4 >> 2] = 0; + HEAP32[$357 + 8 >> 2] = 0; + $360 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($22, 12619) | 0; + HEAP32[$21 >> 2] = HEAP32[$360 >> 2]; + HEAP32[$21 + 4 >> 2] = HEAP32[$360 + 4 >> 2]; + HEAP32[$21 + 8 >> 2] = HEAP32[$360 + 8 >> 2]; + HEAP32[$360 >> 2] = 0; + HEAP32[$360 + 4 >> 2] = 0; + HEAP32[$360 + 8 >> 2] = 0; + $365 = $n$0120$lcssa - $340 | 0; + if ($365 >>> 0 > 4294967279) __ZNKSt3__121__basic_string_commonILb1EE20__throw_length_errorEv($24); + if ($365 >>> 0 < 11) { + HEAP8[$24 >> 0] = $365 << 1; + $__p$0$ph$i$i = $24 + 1 | 0; + } else { + $372 = $365 + 16 & -16; + $373 = _malloc($372) | 0; + HEAP32[$24 + 8 >> 2] = $373; + HEAP32[$24 >> 2] = $372 | 1; + HEAP32[$24 + 4 >> 2] = $365; + $__p$0$ph$i$i = $373; + } + if (($340 | 0) != ($n$0120$lcssa | 0)) { + $$0$i$i117 = $340; + $__p$0$i$i116 = $__p$0$ph$i$i; + while (1) { + HEAP8[$__p$0$i$i116 >> 0] = HEAP8[$$0$i$i117 >> 0] | 0; + $$0$i$i117 = $$0$i$i117 + 1 | 0; + if (($$0$i$i117 | 0) == ($n$0120$lcssa | 0)) break; else $__p$0$i$i116 = $__p$0$i$i116 + 1 | 0; + } + } + HEAP8[$__p$0$ph$i$i + $365 >> 0] = 0; + $382 = HEAP8[$24 >> 0] | 0; + $384 = ($382 & 1) == 0; + $394 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($21, $384 ? $24 + 1 | 0 : HEAP32[$24 + 8 >> 2] | 0, $384 ? ($382 & 255) >>> 1 : HEAP32[$24 + 4 >> 2] | 0) | 0; + HEAP32[$20 >> 2] = HEAP32[$394 >> 2]; + HEAP32[$20 + 4 >> 2] = HEAP32[$394 + 4 >> 2]; + HEAP32[$20 + 8 >> 2] = HEAP32[$394 + 8 >> 2]; + HEAP32[$394 >> 2] = 0; + HEAP32[$394 + 4 >> 2] = 0; + HEAP32[$394 + 8 >> 2] = 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ENSt3__112basic_stringIcNS2_11char_traitsIcEENS0_12malloc_allocIcEEEE($19, $20); + __ZN10__cxxabiv112_GLOBAL__N_111string_pairaSEOS1_($356, $19); + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($19); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($20); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($24); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($21); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($22); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($23); + $$0 = $n$0120$lcssa + 1 | 0; + break L1; + } + } while (0); + } else $$0 = $first; else $$0 = $first; while (0); + STACKTOP = sp; + return $$0 | 0; +} + +function __ZN10__cxxabiv112_GLOBAL__N_114parse_encodingINS0_2DbEEEPKcS4_S4_RT_($first, $last, $db) { + $first = $first | 0; + $last = $last | 0; + $db = $db | 0; + var $$0$i = 0, $$24$ph = 0, $$7 = 0, $$in = 0, $$in109 = 0, $$lcssa150 = 0, $$lcssa151 = 0, $$lcssa156 = 0, $$ph96 = 0, $$pre$i$i$i$i = 0, $0 = 0, $1 = 0, $10 = 0, $101 = 0, $111 = 0, $118 = 0, $120 = 0, $123 = 0, $127 = 0, $13 = 0, $130 = 0, $135 = 0, $136 = 0, $139 = 0, $140 = 0, $142 = 0, $143 = 0, $152 = 0, $155 = 0, $160 = 0, $162 = 0, $166 = 0, $171 = 0, $175 = 0, $176 = 0, $18 = 0, $180 = 0, $183 = 0, $184 = 0, $188 = 0, $191 = 0, $193 = 0, $195 = 0, $199 = 0, $2 = 0, $203 = 0, $204 = 0, $206 = 0, $207 = 0, $209 = 0, $21 = 0, $215 = 0, $22 = 0, $226 = 0, $228 = 0, $240 = 0, $252 = 0, $255 = 0, $257 = 0, $26 = 0, $264 = 0, $267 = 0, $272 = 0, $273 = 0, $274 = 0, $275 = 0, $277 = 0, $281 = 0, $284 = 0, $287 = 0, $29 = 0, $3 = 0, $30 = 0, $303 = 0, $312 = 0, $313 = 0, $314 = 0, $315 = 0, $318 = 0, $320 = 0, $331 = 0, $335 = 0, $336 = 0, $337 = 0, $338 = 0, $339 = 0, $34 = 0, $340 = 0, $341 = 0, $342 = 0, $345 = 0, $347 = 0, $349 = 0, $350 = 0, $356 = 0, $361 = 0, $37 = 0, $371 = 0, $373 = 0, $38 = 0, $382 = 0, $383 = 0, $384 = 0, $385 = 0, $389 = 0, $392 = 0, $398 = 0, $4 = 0, $402 = 0, $404 = 0, $405 = 0, $411 = 0, $413 = 0, $414 = 0, $42 = 0, $434 = 0, $436 = 0, $446 = 0, $45 = 0, $46 = 0, $50 = 0, $53 = 0, $54 = 0, $56 = 0, $58 = 0, $6 = 0, $62 = 0, $65 = 0, $66 = 0, $68 = 0, $7 = 0, $73 = 0, $74 = 0, $76 = 0, $77 = 0, $8 = 0, $85 = 0, $86 = 0, $87 = 0, $88 = 0, $9 = 0, $90 = 0, $91 = 0, $94 = 0, $99 = 0, $first_arg$0$off0$ph = 0, $first_arg$3$off0$ph = 0, $k$0121 = 0, $k2$0122 = 0, $left$i = 0, $phitmp$i$i$i$i$i$i = 0, $phitmp$i2$i$i$i$i$i = 0, $ret1 = 0, $ret2 = 0, $t$0 = 0, $t$1 = 0, $t$1$ph = 0, $t$2 = 0, $tmp = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 112 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $left$i = sp + 96 | 0; + $0 = sp + 84 | 0; + $1 = sp + 72 | 0; + $2 = sp + 60 | 0; + $3 = sp + 48 | 0; + $ret2 = sp + 36 | 0; + $ret1 = sp + 24 | 0; + $tmp = sp + 12 | 0; + $4 = sp; + L1 : do if (($first | 0) == ($last | 0)) $$7 = $first; else { + $6 = $db + 56 | 0; + $7 = HEAP32[$6 >> 2] | 0; + $8 = $7 + 1 | 0; + HEAP32[$6 >> 2] = $8; + $9 = $db + 61 | 0; + $10 = HEAP8[$9 >> 0] | 0; + if ($8 >>> 0 > 1) HEAP8[$9 >> 0] = 1; + $13 = HEAP8[$first >> 0] | 0; + L6 : do switch ($13 | 0) { + case 84: + case 71: + { + L107 : do if (($last - $first | 0) > 2) { + switch ($13 | 0) { + case 84: + break; + case 71: + { + switch (HEAP8[$first + 1 >> 0] | 0) { + case 86: + { + $175 = $first + 2 | 0; + $176 = __ZN10__cxxabiv112_GLOBAL__N_110parse_nameINS0_2DbEEEPKcS4_S4_RT_($175, $last, $db) | 0; + if (($176 | 0) == ($175 | 0)) { + $$0$i = $first; + break L107; + } + $180 = HEAP32[$db + 4 >> 2] | 0; + if ((HEAP32[$db >> 2] | 0) == ($180 | 0)) { + $$0$i = $first; + break L107; + } + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc($180 + -24 | 0, 0, 14547) | 0; + $$0$i = $176; + break L107; + break; + } + case 82: + { + $183 = $first + 2 | 0; + $184 = __ZN10__cxxabiv112_GLOBAL__N_110parse_nameINS0_2DbEEEPKcS4_S4_RT_($183, $last, $db) | 0; + if (($184 | 0) == ($183 | 0)) { + $$0$i = $first; + break L107; + } + $188 = HEAP32[$db + 4 >> 2] | 0; + if ((HEAP32[$db >> 2] | 0) == ($188 | 0)) { + $$0$i = $first; + break L107; + } + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc($188 + -24 | 0, 0, 14567) | 0; + $$0$i = $184; + break L107; + break; + } + default: + { + $$0$i = $first; + break L107; + } + } + break; + } + default: + { + $$0$i = $first; + break L107; + } + } + $18 = $first + 1 | 0; + switch (HEAP8[$18 >> 0] | 0) { + case 86: + { + $21 = $first + 2 | 0; + $22 = __ZN10__cxxabiv112_GLOBAL__N_110parse_typeINS0_2DbEEEPKcS4_S4_RT_($21, $last, $db) | 0; + if (($22 | 0) == ($21 | 0)) { + $$0$i = $first; + break L107; + } + $26 = HEAP32[$db + 4 >> 2] | 0; + if ((HEAP32[$db >> 2] | 0) == ($26 | 0)) { + $$0$i = $first; + break L107; + } + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc($26 + -24 | 0, 0, 14396) | 0; + $$0$i = $22; + break L107; + break; + } + case 84: + { + $29 = $first + 2 | 0; + $30 = __ZN10__cxxabiv112_GLOBAL__N_110parse_typeINS0_2DbEEEPKcS4_S4_RT_($29, $last, $db) | 0; + if (($30 | 0) == ($29 | 0)) { + $$0$i = $first; + break L107; + } + $34 = HEAP32[$db + 4 >> 2] | 0; + if ((HEAP32[$db >> 2] | 0) == ($34 | 0)) { + $$0$i = $first; + break L107; + } + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc($34 + -24 | 0, 0, 14408) | 0; + $$0$i = $30; + break L107; + break; + } + case 73: + { + $37 = $first + 2 | 0; + $38 = __ZN10__cxxabiv112_GLOBAL__N_110parse_typeINS0_2DbEEEPKcS4_S4_RT_($37, $last, $db) | 0; + if (($38 | 0) == ($37 | 0)) { + $$0$i = $first; + break L107; + } + $42 = HEAP32[$db + 4 >> 2] | 0; + if ((HEAP32[$db >> 2] | 0) == ($42 | 0)) { + $$0$i = $first; + break L107; + } + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc($42 + -24 | 0, 0, 14417) | 0; + $$0$i = $38; + break L107; + break; + } + case 83: + { + $45 = $first + 2 | 0; + $46 = __ZN10__cxxabiv112_GLOBAL__N_110parse_typeINS0_2DbEEEPKcS4_S4_RT_($45, $last, $db) | 0; + if (($46 | 0) == ($45 | 0)) { + $$0$i = $first; + break L107; + } + $50 = HEAP32[$db + 4 >> 2] | 0; + if ((HEAP32[$db >> 2] | 0) == ($50 | 0)) { + $$0$i = $first; + break L107; + } + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc($50 + -24 | 0, 0, 14431) | 0; + $$0$i = $46; + break L107; + break; + } + case 99: + { + $53 = $first + 2 | 0; + $54 = __ZN10__cxxabiv112_GLOBAL__N_117parse_call_offsetEPKcS2_($53, $last) | 0; + if (($54 | 0) == ($53 | 0)) { + $$0$i = $first; + break L107; + } + $56 = __ZN10__cxxabiv112_GLOBAL__N_117parse_call_offsetEPKcS2_($54, $last) | 0; + if (($56 | 0) == ($54 | 0)) { + $$0$i = $first; + break L107; + } + $58 = __ZN10__cxxabiv112_GLOBAL__N_114parse_encodingINS0_2DbEEEPKcS4_S4_RT_($56, $last, $db) | 0; + if (($58 | 0) == ($56 | 0)) { + $$0$i = $first; + break L107; + } + $62 = HEAP32[$db + 4 >> 2] | 0; + if ((HEAP32[$db >> 2] | 0) == ($62 | 0)) { + $$0$i = $first; + break L107; + } + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc($62 + -24 | 0, 0, 14450) | 0; + $$0$i = $58; + break L107; + break; + } + case 67: + { + $65 = $first + 2 | 0; + $66 = __ZN10__cxxabiv112_GLOBAL__N_110parse_typeINS0_2DbEEEPKcS4_S4_RT_($65, $last, $db) | 0; + if (($66 | 0) == ($65 | 0)) { + $$0$i = $first; + break L107; + } + $68 = __ZN10__cxxabiv112_GLOBAL__N_112parse_numberEPKcS2_($66, $last) | 0; + if (($68 | 0) == ($66 | 0) | ($68 | 0) == ($last | 0)) { + $$0$i = $first; + break L107; + } + if ((HEAP8[$68 >> 0] | 0) != 95) { + $$0$i = $first; + break L107; + } + $73 = $68 + 1 | 0; + $74 = __ZN10__cxxabiv112_GLOBAL__N_110parse_typeINS0_2DbEEEPKcS4_S4_RT_($73, $last, $db) | 0; + if (($74 | 0) == ($73 | 0)) { + $$0$i = $first; + break L107; + } + $76 = $db + 4 | 0; + $77 = HEAP32[$76 >> 2] | 0; + if ((($77 - (HEAP32[$db >> 2] | 0) | 0) / 24 | 0) >>> 0 < 2) { + $$0$i = $first; + break L107; + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($left$i, $77 + -24 | 0); + $85 = HEAP32[$76 >> 2] | 0; + $86 = $85 + -24 | 0; + $88 = $85; + do { + $87 = $88 + -24 | 0; + HEAP32[$76 >> 2] = $87; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($87); + $88 = HEAP32[$76 >> 2] | 0; + } while (($88 | 0) != ($86 | 0)); + $90 = $85 + -48 | 0; + $91 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc($left$i, 0, 14477) | 0; + HEAP32[$2 >> 2] = HEAP32[$91 >> 2]; + HEAP32[$2 + 4 >> 2] = HEAP32[$91 + 4 >> 2]; + HEAP32[$2 + 8 >> 2] = HEAP32[$91 + 8 >> 2]; + HEAP32[$91 >> 2] = 0; + HEAP32[$91 + 4 >> 2] = 0; + HEAP32[$91 + 8 >> 2] = 0; + $94 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($2, 14502) | 0; + HEAP32[$1 >> 2] = HEAP32[$94 >> 2]; + HEAP32[$1 + 4 >> 2] = HEAP32[$94 + 4 >> 2]; + HEAP32[$1 + 8 >> 2] = HEAP32[$94 + 8 >> 2]; + HEAP32[$94 >> 2] = 0; + HEAP32[$94 + 4 >> 2] = 0; + HEAP32[$94 + 8 >> 2] = 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($3, (HEAP32[$76 >> 2] | 0) + -24 | 0); + $99 = HEAP8[$3 >> 0] | 0; + $101 = ($99 & 1) == 0; + $111 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($1, $101 ? $3 + 1 | 0 : HEAP32[$3 + 8 >> 2] | 0, $101 ? ($99 & 255) >>> 1 : HEAP32[$3 + 4 >> 2] | 0) | 0; + HEAP32[$0 >> 2] = HEAP32[$111 >> 2]; + HEAP32[$0 + 4 >> 2] = HEAP32[$111 + 4 >> 2]; + HEAP32[$0 + 8 >> 2] = HEAP32[$111 + 8 >> 2]; + HEAP32[$111 >> 2] = 0; + HEAP32[$111 + 4 >> 2] = 0; + HEAP32[$111 + 8 >> 2] = 0; + do if (!(HEAP8[$90 >> 0] & 1)) { + HEAP8[$90 + 1 >> 0] = 0; + HEAP8[$90 >> 0] = 0; + } else { + $118 = $85 + -40 | 0; + HEAP8[HEAP32[$118 >> 2] >> 0] = 0; + $120 = $85 + -44 | 0; + HEAP32[$120 >> 2] = 0; + $$pre$i$i$i$i = HEAP8[$90 >> 0] | 0; + if (!($$pre$i$i$i$i & 1)) { + $127 = $$pre$i$i$i$i; + $136 = 10; + } else { + $123 = HEAP32[$90 >> 2] | 0; + $127 = $123 & 255; + $136 = ($123 & -2) + -1 | 0; + } + if (!($127 & 1)) { + $130 = ($127 & 255) >>> 1; + if (($127 & 255) < 22) { + $135 = 10; + $155 = $130; + $446 = 1; + } else { + $135 = ($130 + 16 & 240) + -1 | 0; + $155 = $130; + $446 = 1; + } + } else { + $135 = 10; + $155 = 0; + $446 = 0; + } + if (($135 | 0) != ($136 | 0)) { + if (($135 | 0) == 10) { + $142 = $90 + 1 | 0; + $143 = HEAP32[$118 >> 2] | 0; + if ($446) { + _memcpy($142 | 0, $143 | 0, (($127 & 255) >>> 1) + 1 | 0) | 0; + _free($143); + } else { + HEAP8[$142 >> 0] = HEAP8[$143 >> 0] | 0; + _free($143); + } + HEAP8[$90 >> 0] = $155 << 1; + break; + } + $139 = $135 + 1 | 0; + $140 = _malloc($139) | 0; + if (!($135 >>> 0 <= $136 >>> 0 & ($140 | 0) == 0)) { + if ($446) _memcpy($140 | 0, $90 + 1 | 0, (($127 & 255) >>> 1) + 1 | 0) | 0; else { + $152 = HEAP32[$118 >> 2] | 0; + HEAP8[$140 >> 0] = HEAP8[$152 >> 0] | 0; + _free($152); + } + HEAP32[$90 >> 2] = $139 | 1; + HEAP32[$120 >> 2] = $155; + HEAP32[$118 >> 2] = $140; + } + } + } while (0); + HEAP32[$90 >> 2] = HEAP32[$0 >> 2]; + HEAP32[$90 + 4 >> 2] = HEAP32[$0 + 4 >> 2]; + HEAP32[$90 + 8 >> 2] = HEAP32[$0 + 8 >> 2]; + HEAP32[$0 >> 2] = 0; + HEAP32[$0 + 4 >> 2] = 0; + HEAP32[$0 + 8 >> 2] = 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($0); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($3); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($1); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($2); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($left$i); + $$0$i = $74; + break L107; + break; + } + default: + { + $160 = __ZN10__cxxabiv112_GLOBAL__N_117parse_call_offsetEPKcS2_($18, $last) | 0; + if (($160 | 0) == ($18 | 0)) { + $$0$i = $first; + break L107; + } + $162 = __ZN10__cxxabiv112_GLOBAL__N_114parse_encodingINS0_2DbEEEPKcS4_S4_RT_($160, $last, $db) | 0; + if (($162 | 0) == ($160 | 0)) { + $$0$i = $first; + break L107; + } + $166 = HEAP32[$db + 4 >> 2] | 0; + if ((HEAP32[$db >> 2] | 0) == ($166 | 0)) { + $$0$i = $first; + break L107; + } + $171 = $166 + -24 | 0; + if ((HEAP8[$first + 2 >> 0] | 0) == 118) { + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc($171, 0, 14507) | 0; + $$0$i = $162; + break L107; + } else { + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc($171, 0, 14525) | 0; + $$0$i = $162; + break L107; + } + } + } + } else $$0$i = $first; while (0); + $$24$ph = $$0$i; + break; + } + default: + { + $191 = __ZN10__cxxabiv112_GLOBAL__N_110parse_nameINS0_2DbEEEPKcS4_S4_RT_($first, $last, $db) | 0; + $193 = HEAP32[$db + 48 >> 2] | 0; + $195 = HEAP32[$db + 52 >> 2] | 0; + if (($191 | 0) == ($first | 0)) $$24$ph = $first; else if (($191 | 0) == ($last | 0)) $$24$ph = $last; else { + switch (HEAP8[$191 >> 0] | 0) { + case 46: + case 69: + { + $$24$ph = $191; + break L6; + break; + } + default: + {} + } + $199 = HEAP8[$9 >> 0] | 0; + HEAP8[$9 >> 0] = 0; + HEAP32[$ret2 >> 2] = 0; + HEAP32[$ret2 + 4 >> 2] = 0; + HEAP32[$ret2 + 8 >> 2] = 0; + $203 = $db + 4 | 0; + $204 = HEAP32[$203 >> 2] | 0; + L11 : do if ((HEAP32[$db >> 2] | 0) != ($204 | 0)) { + $206 = $204 + -24 | 0; + $207 = HEAP8[$206 >> 0] | 0; + $209 = ($207 & 1) == 0; + if ($209) $215 = ($207 & 255) >>> 1; else $215 = HEAP32[$204 + -20 >> 2] | 0; + if ($215) { + if (!(HEAP8[$db + 60 >> 0] | 0)) { + if ($209) { + $226 = ($207 & 255) >>> 1; + $228 = $206 + 1 | 0; + } else { + $226 = HEAP32[$204 + -20 >> 2] | 0; + $228 = HEAP32[$204 + -16 >> 2] | 0; + } + if ((HEAP8[$228 + ($226 + -1) >> 0] | 0) == 62) { + if ($209) { + $$in = ($207 & 255) >>> 1; + $240 = $206 + 1 | 0; + } else { + $$in = HEAP32[$204 + -20 >> 2] | 0; + $240 = HEAP32[$204 + -16 >> 2] | 0; + } + if ((HEAP8[$240 + ($$in + -2) >> 0] | 0) == 45) { + $331 = $204; + $t$0 = $191; + } else { + if ($209) { + $$in109 = ($207 & 255) >>> 1; + $252 = $206 + 1 | 0; + } else { + $$in109 = HEAP32[$204 + -20 >> 2] | 0; + $252 = HEAP32[$204 + -16 >> 2] | 0; + } + if ((HEAP8[$252 + ($$in109 + -2) >> 0] | 0) == 62) { + $331 = $204; + $t$0 = $191; + } else { + $255 = __ZN10__cxxabiv112_GLOBAL__N_110parse_typeINS0_2DbEEEPKcS4_S4_RT_($191, $last, $db) | 0; + if (($255 | 0) == ($191 | 0)) break; + $257 = HEAP32[$203 >> 2] | 0; + if ((($257 - (HEAP32[$db >> 2] | 0) | 0) / 24 | 0) >>> 0 < 2) break; + $264 = $257 + -24 | 0; + HEAP32[$ret1 >> 2] = HEAP32[$264 >> 2]; + HEAP32[$ret1 + 4 >> 2] = HEAP32[$264 + 4 >> 2]; + HEAP32[$ret1 + 8 >> 2] = HEAP32[$264 + 8 >> 2]; + HEAP32[$264 >> 2] = 0; + HEAP32[$264 + 4 >> 2] = 0; + HEAP32[$264 + 8 >> 2] = 0; + $267 = $257 + -12 | 0; + L37 : do if (!(HEAP8[$ret2 >> 0] & 1)) { + HEAP8[$ret2 + 1 >> 0] = 0; + HEAP8[$ret2 >> 0] = 0; + } else { + $272 = $ret2 + 8 | 0; + $273 = HEAP32[$272 >> 2] | 0; + HEAP8[$273 >> 0] = 0; + $274 = $ret2 + 4 | 0; + HEAP32[$274 >> 2] = 0; + $275 = HEAP32[$ret2 >> 2] | 0; + $phitmp$i$i$i$i$i$i = ($275 & -2) + -1 | 0; + $277 = $275 & 255; + do if (!($277 & 1)) { + $281 = $275 >>> 1 & 127; + if (($277 & 255) < 22) { + _memcpy($ret2 + 1 | 0, $273 | 0, ($275 >>> 1 & 127) + 1 | 0) | 0; + _free($273); + $$ph96 = $281; + break; + } + $284 = $281 + 16 & 240; + $phitmp$i2$i$i$i$i$i = $284 + -1 | 0; + if (($phitmp$i2$i$i$i$i$i | 0) == ($phitmp$i$i$i$i$i$i | 0)) break L37; + $287 = _malloc($284) | 0; + if ($phitmp$i2$i$i$i$i$i >>> 0 <= $phitmp$i$i$i$i$i$i >>> 0 & ($287 | 0) == 0) break L37; + _memcpy($287 | 0, $ret2 + 1 | 0, ($275 >>> 1 & 127) + 1 | 0) | 0; + HEAP32[$ret2 >> 2] = $284 | 1; + HEAP32[$274 >> 2] = $281; + HEAP32[$272 >> 2] = $287; + break L37; + } else { + HEAP8[$ret2 + 1 >> 0] = 0; + _free($273); + $$ph96 = 0; + } while (0); + HEAP8[$ret2 >> 0] = $$ph96 << 1; + } while (0); + HEAP32[$ret2 >> 2] = HEAP32[$267 >> 2]; + HEAP32[$ret2 + 4 >> 2] = HEAP32[$267 + 4 >> 2]; + HEAP32[$ret2 + 8 >> 2] = HEAP32[$267 + 8 >> 2]; + HEAP32[$267 >> 2] = 0; + HEAP32[$267 + 4 >> 2] = 0; + HEAP32[$267 + 8 >> 2] = 0; + $303 = HEAP8[$ret2 >> 0] | 0; + if (!((($303 & 1) == 0 ? ($303 & 255) >>> 1 : HEAP32[$ret2 + 4 >> 2] | 0) | 0)) __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE9push_backEc($ret1, 32); + $312 = HEAP32[$203 >> 2] | 0; + $313 = $312 + -24 | 0; + $315 = $312; + do { + $314 = $315 + -24 | 0; + HEAP32[$203 >> 2] = $314; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($314); + $315 = HEAP32[$203 >> 2] | 0; + } while (($315 | 0) != ($313 | 0)); + $318 = HEAP8[$ret1 >> 0] | 0; + $320 = ($318 & 1) == 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKcj($312 + -48 | 0, 0, $320 ? $ret1 + 1 | 0 : HEAP32[$ret1 + 8 >> 2] | 0, $320 ? ($318 & 255) >>> 1 : HEAP32[$ret1 + 4 >> 2] | 0) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($ret1); + $331 = HEAP32[$203 >> 2] | 0; + $t$0 = $255; + } + } + } else { + $331 = $204; + $t$0 = $191; + } + } else { + $331 = $204; + $t$0 = $191; + } + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE9push_backEc($331 + -24 | 0, 40); + if (($t$0 | 0) == ($last | 0)) label = 105; else if ((HEAP8[$t$0 >> 0] | 0) == 118) { + $413 = HEAP32[$db >> 2] | 0; + $414 = HEAP32[$203 >> 2] | 0; + $t$2 = $t$0 + 1 | 0; + } else label = 105; + L60 : do if ((label | 0) == 105) { + $335 = $tmp + 4 | 0; + $336 = $4 + 8 | 0; + $337 = $4 + 1 | 0; + $338 = $4 + 4 | 0; + $339 = $tmp + 8 | 0; + $340 = $tmp + 1 | 0; + $341 = $tmp + 4 | 0; + $342 = $tmp + 8 | 0; + $first_arg$0$off0$ph = 1; + $t$1$ph = $t$0; + while (1) { + $345 = HEAP32[$203 >> 2] | 0; + $347 = HEAP32[$db >> 2] | 0; + $t$1 = $t$1$ph; + while (1) { + $349 = ($345 - $347 | 0) / 24 | 0; + $350 = __ZN10__cxxabiv112_GLOBAL__N_110parse_typeINS0_2DbEEEPKcS4_S4_RT_($t$1, $last, $db) | 0; + $345 = HEAP32[$203 >> 2] | 0; + $347 = HEAP32[$db >> 2] | 0; + $356 = ($345 - $347 | 0) / 24 | 0; + if (($350 | 0) == ($t$1 | 0)) { + $413 = $347; + $414 = $345; + $t$2 = $t$1; + break L60; + } + if ($356 >>> 0 > $349 >>> 0) { + $$lcssa150 = $349; + $$lcssa151 = $350; + $$lcssa156 = $356; + break; + } else $t$1 = $350; + } + HEAP32[$tmp >> 2] = 0; + HEAP32[$341 >> 2] = 0; + HEAP32[$342 >> 2] = 0; + if ($$lcssa150 >>> 0 < $$lcssa156 >>> 0) { + $k$0121 = $$lcssa150; + do { + $361 = HEAP8[$tmp >> 0] | 0; + if ((($361 & 1) == 0 ? ($361 & 255) >>> 1 : HEAP32[$335 >> 2] | 0) | 0) __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($tmp, 12716) | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($4, (HEAP32[$db >> 2] | 0) + ($k$0121 * 24 | 0) | 0); + $371 = HEAP8[$4 >> 0] | 0; + $373 = ($371 & 1) == 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($tmp, $373 ? $337 : HEAP32[$336 >> 2] | 0, $373 ? ($371 & 255) >>> 1 : HEAP32[$338 >> 2] | 0) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($4); + $k$0121 = $k$0121 + 1 | 0; + } while ($k$0121 >>> 0 < $$lcssa156 >>> 0); + } + if ($$lcssa150 >>> 0 < $$lcssa156 >>> 0) { + $k2$0122 = $$lcssa150; + do { + $382 = HEAP32[$203 >> 2] | 0; + $383 = $382 + -24 | 0; + $385 = $382; + do { + $384 = $385 + -24 | 0; + HEAP32[$203 >> 2] = $384; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($384); + $385 = HEAP32[$203 >> 2] | 0; + } while (($385 | 0) != ($383 | 0)); + $k2$0122 = $k2$0122 + 1 | 0; + } while ($k2$0122 >>> 0 < $$lcssa156 >>> 0); + } + $389 = HEAP8[$tmp >> 0] | 0; + $392 = HEAP32[$335 >> 2] | 0; + if (!((($389 & 1) == 0 ? ($389 & 255) >>> 1 : $392) | 0)) $first_arg$3$off0$ph = $first_arg$0$off0$ph; else { + $398 = HEAP32[$203 >> 2] | 0; + if ((HEAP32[$db >> 2] | 0) == ($398 | 0)) break; + if ($first_arg$0$off0$ph) { + $402 = $398; + $404 = $389; + $411 = $392; + } else { + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($398 + -24 | 0, 12716) | 0; + $402 = HEAP32[$203 >> 2] | 0; + $404 = HEAP8[$tmp >> 0] | 0; + $411 = HEAP32[$335 >> 2] | 0; + } + $405 = ($404 & 1) == 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($402 + -24 | 0, $405 ? $340 : HEAP32[$339 >> 2] | 0, $405 ? ($404 & 255) >>> 1 : $411) | 0; + $first_arg$3$off0$ph = 0; + } + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($tmp); + $first_arg$0$off0$ph = $first_arg$3$off0$ph; + $t$1$ph = $$lcssa151; + } + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($tmp); + break L11; + } while (0); + if (($413 | 0) != ($414 | 0)) { + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE9push_backEc($414 + -24 | 0, 41); + if ($193 & 1) __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc((HEAP32[$203 >> 2] | 0) + -24 | 0, 12669) | 0; + if ($193 & 2) __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc((HEAP32[$203 >> 2] | 0) + -24 | 0, 12676) | 0; + if ($193 & 4) __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc((HEAP32[$203 >> 2] | 0) + -24 | 0, 12686) | 0; + switch ($195 | 0) { + case 1: + { + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc((HEAP32[$203 >> 2] | 0) + -24 | 0, 12719) | 0; + break; + } + case 2: + { + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc((HEAP32[$203 >> 2] | 0) + -24 | 0, 12722) | 0; + break; + } + default: + {} + } + $434 = HEAP8[$ret2 >> 0] | 0; + $436 = ($434 & 1) == 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj((HEAP32[$203 >> 2] | 0) + -24 | 0, $436 ? $ret2 + 1 | 0 : HEAP32[$ret2 + 8 >> 2] | 0, $436 ? ($434 & 255) >>> 1 : HEAP32[$ret2 + 4 >> 2] | 0) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($ret2); + HEAP8[$9 >> 0] = $199; + $$24$ph = $t$2; + break L6; + } + } + } while (0); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($ret2); + HEAP8[$9 >> 0] = $10; + HEAP32[$6 >> 2] = $7; + $$7 = $first; + break L1; + } + } + } while (0); + HEAP8[$9 >> 0] = $10; + HEAP32[$6 >> 2] = $7; + $$7 = $$24$ph; + } while (0); + STACKTOP = sp; + return $$7 | 0; +} + +function _vfscanf($f, $fmt, $ap) { + $f = $f | 0; + $fmt = $fmt | 0; + $ap = $ap | 0; + var $$ = 0, $$lcssa = 0, $$lcssa38 = 0, $$lcssa384 = 0, $$pre = 0, $$pre$phi182Z2D = 0, $$pre170 = 0, $$pre178 = 0, $$size$0 = 0, $0 = 0, $10 = 0, $104 = 0, $105 = 0, $107 = 0, $109 = 0, $11 = 0, $112 = 0, $115 = 0, $117 = 0, $12 = 0, $125 = 0, $129 = 0, $13 = 0, $136 = 0, $14 = 0, $141 = 0, $145 = 0, $15 = 0, $150 = 0, $151 = 0, $157 = 0, $160 = 0, $164 = 0, $166 = 0, $168 = 0, $17 = 0, $173 = 0, $176 = 0, $177 = 0, $178 = 0, $179 = 0, $181 = 0, $186 = 0, $190 = 0, $195 = 0, $196 = 0, $197 = 0, $199 = 0, $20 = 0, $201 = 0, $202 = 0, $210 = 0, $220 = 0, $222 = 0, $226 = 0, $228 = 0, $236 = 0, $244 = 0, $245 = 0, $248 = 0, $25 = 0, $250 = 0, $256 = 0, $263 = 0, $265 = 0, $271 = 0, $277 = 0, $281 = 0, $284 = 0, $291 = 0, $306 = 0, $310 = 0.0, $32 = 0, $334 = 0, $37 = 0, $41 = 0, $47 = 0, $48 = 0, $49 = 0, $5 = 0, $51 = 0, $52 = 0, $62 = 0, $7 = 0, $8 = 0, $81 = 0, $82 = 0, $9 = 0, $90 = 0, $91 = 0, $92 = 0, $93 = 0, $96 = 0, $97 = 0, $98 = 0, $99 = 0, $alloc$0 = 0, $alloc$0400 = 0, $alloc$1 = 0, $alloc$2 = 0, $ap2$i = 0, $base$0 = 0, $c$0100 = 0, $dest$0 = 0, $i$0$i = 0, $i$0$ph = 0, $i$0$ph$phi = 0, $i$0$ph20 = 0, $i$0$ph20$lcssa = 0, $i$1 = 0, $i$2 = 0, $i$2$ph = 0, $i$2$ph$phi = 0, $i$3 = 0, $i$4 = 0, $invert$0 = 0, $isdigittmp = 0, $k$0$ph = 0, $k$1$ph = 0, $matches$0104 = 0, $matches$0104$lcssa = 0, $matches$0104376 = 0, $matches$1 = 0, $matches$2 = 0, $matches$3 = 0, $p$0109 = 0, $p$1 = 0, $p$1$lcssa = 0, $p$10 = 0, $p$11 = 0, $p$2 = 0, $p$3$lcssa = 0, $p$396 = 0, $p$4 = 0, $p$5 = 0, $p$6 = 0, $p$7 = 0, $p$7$ph = 0, $p$8 = 0, $p$9 = 0, $pos$0108 = 0, $pos$1 = 0, $pos$2 = 0, $s$0107 = 0, $s$0107$lcssa = 0, $s$1 = 0, $s$2$ph = 0, $s$3 = 0, $s$4 = 0, $s$5 = 0, $s$6 = 0, $s$7 = 0, $s$8 = 0, $scanset = 0, $size$0 = 0, $st = 0, $wc = 0, $wcs$0103 = 0, $wcs$0103$lcssa = 0, $wcs$1 = 0, $wcs$2 = 0, $wcs$3$ph = 0, $wcs$3$ph$lcssa = 0, $wcs$4 = 0, $wcs$5 = 0, $wcs$6 = 0, $wcs$7 = 0, $wcs$8 = 0, $wcs$9 = 0, $width$0$lcssa = 0, $width$097 = 0, $width$1 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 304 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $ap2$i = sp + 16 | 0; + $st = sp + 8 | 0; + $scanset = sp + 33 | 0; + $wc = sp; + $0 = sp + 32 | 0; + if ((HEAP32[$f + 76 >> 2] | 0) > -1) $334 = ___lockfile($f) | 0; else $334 = 0; + $5 = HEAP8[$fmt >> 0] | 0; + L4 : do if (!($5 << 24 >> 24)) $matches$3 = 0; else { + $7 = $f + 4 | 0; + $8 = $f + 100 | 0; + $9 = $f + 108 | 0; + $10 = $f + 8 | 0; + $11 = $scanset + 10 | 0; + $12 = $scanset + 33 | 0; + $13 = $st + 4 | 0; + $14 = $scanset + 46 | 0; + $15 = $scanset + 94 | 0; + $17 = $5; + $matches$0104 = 0; + $p$0109 = $fmt; + $pos$0108 = 0; + $s$0107 = 0; + $wcs$0103 = 0; + L6 : while (1) { + L8 : do if (!(_isspace($17 & 255) | 0)) { + $47 = (HEAP8[$p$0109 >> 0] | 0) == 37; + L10 : do if ($47) { + $48 = $p$0109 + 1 | 0; + $49 = HEAP8[$48 >> 0] | 0; + L12 : do switch ($49 << 24 >> 24) { + case 37: + { + break L10; + break; + } + case 42: + { + $dest$0 = 0; + $p$2 = $p$0109 + 2 | 0; + break; + } + default: + { + $isdigittmp = ($49 & 255) + -48 | 0; + if ($isdigittmp >>> 0 < 10) if ((HEAP8[$p$0109 + 2 >> 0] | 0) == 36) { + HEAP32[$ap2$i >> 2] = HEAP32[$ap >> 2]; + $i$0$i = $isdigittmp; + while (1) { + $81 = (HEAP32[$ap2$i >> 2] | 0) + (4 - 1) & ~(4 - 1); + $82 = HEAP32[$81 >> 2] | 0; + HEAP32[$ap2$i >> 2] = $81 + 4; + if ($i$0$i >>> 0 > 1) $i$0$i = $i$0$i + -1 | 0; else { + $$lcssa = $82; + break; + } + } + $dest$0 = $$lcssa; + $p$2 = $p$0109 + 3 | 0; + break L12; + } + $90 = (HEAP32[$ap >> 2] | 0) + (4 - 1) & ~(4 - 1); + $91 = HEAP32[$90 >> 2] | 0; + HEAP32[$ap >> 2] = $90 + 4; + $dest$0 = $91; + $p$2 = $48; + } + } while (0); + $92 = HEAP8[$p$2 >> 0] | 0; + $93 = $92 & 255; + if (($93 + -48 | 0) >>> 0 < 10) { + $97 = $93; + $p$396 = $p$2; + $width$097 = 0; + while (1) { + $96 = ($width$097 * 10 | 0) + -48 + $97 | 0; + $98 = $p$396 + 1 | 0; + $99 = HEAP8[$98 >> 0] | 0; + $97 = $99 & 255; + if (($97 + -48 | 0) >>> 0 >= 10) { + $$lcssa38 = $99; + $p$3$lcssa = $98; + $width$0$lcssa = $96; + break; + } else { + $p$396 = $98; + $width$097 = $96; + } + } + } else { + $$lcssa38 = $92; + $p$3$lcssa = $p$2; + $width$0$lcssa = 0; + } + if ($$lcssa38 << 24 >> 24 == 109) { + $104 = $p$3$lcssa + 1 | 0; + $107 = HEAP8[$104 >> 0] | 0; + $alloc$0 = ($dest$0 | 0) != 0 & 1; + $p$4 = $104; + $s$1 = 0; + $wcs$1 = 0; + } else { + $107 = $$lcssa38; + $alloc$0 = 0; + $p$4 = $p$3$lcssa; + $s$1 = $s$0107; + $wcs$1 = $wcs$0103; + } + $105 = $p$4 + 1 | 0; + switch ($107 & 255 | 0) { + case 104: + { + $109 = (HEAP8[$105 >> 0] | 0) == 104; + $p$5 = $109 ? $p$4 + 2 | 0 : $105; + $size$0 = $109 ? -2 : -1; + break; + } + case 108: + { + $112 = (HEAP8[$105 >> 0] | 0) == 108; + $p$5 = $112 ? $p$4 + 2 | 0 : $105; + $size$0 = $112 ? 3 : 1; + break; + } + case 106: + { + $p$5 = $105; + $size$0 = 3; + break; + } + case 116: + case 122: + { + $p$5 = $105; + $size$0 = 1; + break; + } + case 76: + { + $p$5 = $105; + $size$0 = 2; + break; + } + case 110: + case 112: + case 67: + case 83: + case 91: + case 99: + case 115: + case 88: + case 71: + case 70: + case 69: + case 65: + case 103: + case 102: + case 101: + case 97: + case 120: + case 117: + case 111: + case 105: + case 100: + { + $p$5 = $p$4; + $size$0 = 0; + break; + } + default: + { + $alloc$0400 = $alloc$0; + $matches$0104376 = $matches$0104; + $s$6 = $s$1; + $wcs$7 = $wcs$1; + label = 152; + break L6; + } + } + $115 = HEAPU8[$p$5 >> 0] | 0; + $117 = ($115 & 47 | 0) == 3; + $$ = $117 ? $115 | 32 : $115; + $$size$0 = $117 ? 1 : $size$0; + switch ($$ | 0) { + case 99: + { + $pos$1 = $pos$0108; + $width$1 = ($width$0$lcssa | 0) < 1 ? 1 : $width$0$lcssa; + break; + } + case 91: + { + $pos$1 = $pos$0108; + $width$1 = $width$0$lcssa; + break; + } + case 110: + { + if (!$dest$0) { + $matches$1 = $matches$0104; + $p$11 = $p$5; + $pos$2 = $pos$0108; + $s$5 = $s$1; + $wcs$6 = $wcs$1; + break L8; + } + switch ($$size$0 | 0) { + case -2: + { + HEAP8[$dest$0 >> 0] = $pos$0108; + $matches$1 = $matches$0104; + $p$11 = $p$5; + $pos$2 = $pos$0108; + $s$5 = $s$1; + $wcs$6 = $wcs$1; + break L8; + break; + } + case -1: + { + HEAP16[$dest$0 >> 1] = $pos$0108; + $matches$1 = $matches$0104; + $p$11 = $p$5; + $pos$2 = $pos$0108; + $s$5 = $s$1; + $wcs$6 = $wcs$1; + break L8; + break; + } + case 0: + { + HEAP32[$dest$0 >> 2] = $pos$0108; + $matches$1 = $matches$0104; + $p$11 = $p$5; + $pos$2 = $pos$0108; + $s$5 = $s$1; + $wcs$6 = $wcs$1; + break L8; + break; + } + case 1: + { + HEAP32[$dest$0 >> 2] = $pos$0108; + $matches$1 = $matches$0104; + $p$11 = $p$5; + $pos$2 = $pos$0108; + $s$5 = $s$1; + $wcs$6 = $wcs$1; + break L8; + break; + } + case 3: + { + $125 = $dest$0; + HEAP32[$125 >> 2] = $pos$0108; + HEAP32[$125 + 4 >> 2] = (($pos$0108 | 0) < 0) << 31 >> 31; + $matches$1 = $matches$0104; + $p$11 = $p$5; + $pos$2 = $pos$0108; + $s$5 = $s$1; + $wcs$6 = $wcs$1; + break L8; + break; + } + default: + { + $matches$1 = $matches$0104; + $p$11 = $p$5; + $pos$2 = $pos$0108; + $s$5 = $s$1; + $wcs$6 = $wcs$1; + break L8; + } + } + break; + } + default: + { + ___shlim($f, 0); + do { + $129 = HEAP32[$7 >> 2] | 0; + if ($129 >>> 0 < (HEAP32[$8 >> 2] | 0) >>> 0) { + HEAP32[$7 >> 2] = $129 + 1; + $136 = HEAPU8[$129 >> 0] | 0; + } else $136 = ___shgetc($f) | 0; + } while ((_isspace($136) | 0) != 0); + $$pre170 = HEAP32[$7 >> 2] | 0; + if (!(HEAP32[$8 >> 2] | 0)) $145 = $$pre170; else { + $141 = $$pre170 + -1 | 0; + HEAP32[$7 >> 2] = $141; + $145 = $141; + } + $pos$1 = (HEAP32[$9 >> 2] | 0) + $pos$0108 + $145 - (HEAP32[$10 >> 2] | 0) | 0; + $width$1 = $width$0$lcssa; + } + } + ___shlim($f, $width$1); + $150 = HEAP32[$7 >> 2] | 0; + $151 = HEAP32[$8 >> 2] | 0; + if ($150 >>> 0 < $151 >>> 0) { + HEAP32[$7 >> 2] = $150 + 1; + $157 = $151; + } else { + if ((___shgetc($f) | 0) < 0) { + $alloc$0400 = $alloc$0; + $matches$0104376 = $matches$0104; + $s$6 = $s$1; + $wcs$7 = $wcs$1; + label = 152; + break L6; + } + $157 = HEAP32[$8 >> 2] | 0; + } + if ($157) HEAP32[$7 >> 2] = (HEAP32[$7 >> 2] | 0) + -1; + L67 : do switch ($$ | 0) { + case 91: + case 99: + case 115: + { + $160 = ($$ | 0) == 99; + L69 : do if (($$ & 239 | 0) == 99) { + _memset($scanset | 0, -1, 257) | 0; + HEAP8[$scanset >> 0] = 0; + if (($$ | 0) == 115) { + HEAP8[$12 >> 0] = 0; + HEAP8[$11 >> 0] = 0; + HEAP8[$11 + 1 >> 0] = 0; + HEAP8[$11 + 2 >> 0] = 0; + HEAP8[$11 + 3 >> 0] = 0; + HEAP8[$11 + 4 >> 0] = 0; + $p$9 = $p$5; + } else $p$9 = $p$5; + } else { + $164 = $p$5 + 1 | 0; + $166 = (HEAP8[$164 >> 0] | 0) == 94; + $invert$0 = $166 & 1; + $168 = $166 ? $164 : $p$5; + $p$6 = $166 ? $p$5 + 2 | 0 : $164; + _memset($scanset | 0, $166 & 1 | 0, 257) | 0; + HEAP8[$scanset >> 0] = 0; + switch (HEAP8[$p$6 >> 0] | 0) { + case 45: + { + $173 = ($invert$0 ^ 1) & 255; + HEAP8[$14 >> 0] = $173; + $$pre$phi182Z2D = $173; + $p$7$ph = $168 + 2 | 0; + break; + } + case 93: + { + $176 = ($invert$0 ^ 1) & 255; + HEAP8[$15 >> 0] = $176; + $$pre$phi182Z2D = $176; + $p$7$ph = $168 + 2 | 0; + break; + } + default: + { + $$pre$phi182Z2D = ($invert$0 ^ 1) & 255; + $p$7$ph = $p$6; + } + } + $p$7 = $p$7$ph; + while (1) { + $177 = HEAP8[$p$7 >> 0] | 0; + L80 : do switch ($177 << 24 >> 24) { + case 0: + { + $alloc$0400 = $alloc$0; + $matches$0104376 = $matches$0104; + $s$6 = $s$1; + $wcs$7 = $wcs$1; + label = 152; + break L6; + break; + } + case 93: + { + $p$9 = $p$7; + break L69; + break; + } + case 45: + { + $178 = $p$7 + 1 | 0; + $179 = HEAP8[$178 >> 0] | 0; + switch ($179 << 24 >> 24) { + case 93: + case 0: + { + $190 = 45; + $p$8 = $p$7; + break L80; + break; + } + default: + {} + } + $181 = HEAP8[$p$7 + -1 >> 0] | 0; + if (($181 & 255) < ($179 & 255)) { + $c$0100 = $181 & 255; + do { + $c$0100 = $c$0100 + 1 | 0; + HEAP8[$scanset + $c$0100 >> 0] = $$pre$phi182Z2D; + $186 = HEAP8[$178 >> 0] | 0; + } while (($c$0100 | 0) < ($186 & 255 | 0)); + $190 = $186; + $p$8 = $178; + } else { + $190 = $179; + $p$8 = $178; + } + break; + } + default: + { + $190 = $177; + $p$8 = $p$7; + } + } while (0); + HEAP8[$scanset + (($190 & 255) + 1) >> 0] = $$pre$phi182Z2D; + $p$7 = $p$8 + 1 | 0; + } + } while (0); + $195 = $160 ? $width$1 + 1 | 0 : 31; + $196 = ($$size$0 | 0) == 1; + $197 = ($alloc$0 | 0) != 0; + L88 : do if ($196) { + if ($197) { + $199 = _malloc($195 << 2) | 0; + if (!$199) { + $alloc$0400 = $alloc$0; + $matches$0104376 = $matches$0104; + $s$6 = 0; + $wcs$7 = $199; + label = 152; + break L6; + } else $wcs$2 = $199; + } else $wcs$2 = $dest$0; + HEAP32[$st >> 2] = 0; + HEAP32[$13 >> 2] = 0; + $i$0$ph = 0; + $k$0$ph = $195; + $wcs$3$ph = $wcs$2; + L94 : while (1) { + $201 = ($wcs$3$ph | 0) == 0; + $i$0$ph20 = $i$0$ph; + while (1) { + L98 : while (1) { + $202 = HEAP32[$7 >> 2] | 0; + if ($202 >>> 0 < (HEAP32[$8 >> 2] | 0) >>> 0) { + HEAP32[$7 >> 2] = $202 + 1; + $210 = HEAPU8[$202 >> 0] | 0; + } else $210 = ___shgetc($f) | 0; + if (!(HEAP8[$scanset + ($210 + 1) >> 0] | 0)) { + $i$0$ph20$lcssa = $i$0$ph20; + $wcs$3$ph$lcssa = $wcs$3$ph; + break L94; + } + HEAP8[$0 >> 0] = $210; + switch (_mbrtowc($wc, $0, 1, $st) | 0) { + case -1: + { + $alloc$0400 = $alloc$0; + $matches$0104376 = $matches$0104; + $s$6 = 0; + $wcs$7 = $wcs$3$ph; + label = 152; + break L6; + break; + } + case -2: + break; + default: + break L98; + } + } + if ($201) $i$1 = $i$0$ph20; else { + HEAP32[$wcs$3$ph + ($i$0$ph20 << 2) >> 2] = HEAP32[$wc >> 2]; + $i$1 = $i$0$ph20 + 1 | 0; + } + if ($197 & ($i$1 | 0) == ($k$0$ph | 0)) break; else $i$0$ph20 = $i$1; + } + $220 = $k$0$ph << 1 | 1; + $222 = _realloc($wcs$3$ph, $220 << 2) | 0; + if (!$222) { + $alloc$0400 = $alloc$0; + $matches$0104376 = $matches$0104; + $s$6 = 0; + $wcs$7 = $wcs$3$ph; + label = 152; + break L6; + } + $i$0$ph$phi = $k$0$ph; + $k$0$ph = $220; + $wcs$3$ph = $222; + $i$0$ph = $i$0$ph$phi; + } + if (!(_mbsinit($st) | 0)) { + $alloc$0400 = $alloc$0; + $matches$0104376 = $matches$0104; + $s$6 = 0; + $wcs$7 = $wcs$3$ph$lcssa; + label = 152; + break L6; + } else { + $i$4 = $i$0$ph20$lcssa; + $s$3 = 0; + $wcs$4 = $wcs$3$ph$lcssa; + } + } else { + if ($197) { + $226 = _malloc($195) | 0; + if (!$226) { + $alloc$0400 = $alloc$0; + $matches$0104376 = $matches$0104; + $s$6 = 0; + $wcs$7 = 0; + label = 152; + break L6; + } else { + $i$2$ph = 0; + $k$1$ph = $195; + $s$2$ph = $226; + } + while (1) { + $i$2 = $i$2$ph; + do { + $228 = HEAP32[$7 >> 2] | 0; + if ($228 >>> 0 < (HEAP32[$8 >> 2] | 0) >>> 0) { + HEAP32[$7 >> 2] = $228 + 1; + $236 = HEAPU8[$228 >> 0] | 0; + } else $236 = ___shgetc($f) | 0; + if (!(HEAP8[$scanset + ($236 + 1) >> 0] | 0)) { + $i$4 = $i$2; + $s$3 = $s$2$ph; + $wcs$4 = 0; + break L88; + } + HEAP8[$s$2$ph + $i$2 >> 0] = $236; + $i$2 = $i$2 + 1 | 0; + } while (($i$2 | 0) != ($k$1$ph | 0)); + $244 = $k$1$ph << 1 | 1; + $245 = _realloc($s$2$ph, $244) | 0; + if (!$245) { + $alloc$0400 = $alloc$0; + $matches$0104376 = $matches$0104; + $s$6 = $s$2$ph; + $wcs$7 = 0; + label = 152; + break L6; + } else { + $i$2$ph$phi = $k$1$ph; + $k$1$ph = $244; + $s$2$ph = $245; + $i$2$ph = $i$2$ph$phi; + } + } + } + if (!$dest$0) { + $265 = $157; + while (1) { + $263 = HEAP32[$7 >> 2] | 0; + if ($263 >>> 0 < $265 >>> 0) { + HEAP32[$7 >> 2] = $263 + 1; + $271 = HEAPU8[$263 >> 0] | 0; + } else $271 = ___shgetc($f) | 0; + if (!(HEAP8[$scanset + ($271 + 1) >> 0] | 0)) { + $i$4 = 0; + $s$3 = 0; + $wcs$4 = 0; + break L88; + } + $265 = HEAP32[$8 >> 2] | 0; + } + } else { + $250 = $157; + $i$3 = 0; + while (1) { + $248 = HEAP32[$7 >> 2] | 0; + if ($248 >>> 0 < $250 >>> 0) { + HEAP32[$7 >> 2] = $248 + 1; + $256 = HEAPU8[$248 >> 0] | 0; + } else $256 = ___shgetc($f) | 0; + if (!(HEAP8[$scanset + ($256 + 1) >> 0] | 0)) { + $i$4 = $i$3; + $s$3 = $dest$0; + $wcs$4 = 0; + break L88; + } + HEAP8[$dest$0 + $i$3 >> 0] = $256; + $250 = HEAP32[$8 >> 2] | 0; + $i$3 = $i$3 + 1 | 0; + } + } + } while (0); + $$pre178 = HEAP32[$7 >> 2] | 0; + if (!(HEAP32[$8 >> 2] | 0)) $281 = $$pre178; else { + $277 = $$pre178 + -1 | 0; + HEAP32[$7 >> 2] = $277; + $281 = $277; + } + $284 = $281 - (HEAP32[$10 >> 2] | 0) + (HEAP32[$9 >> 2] | 0) | 0; + if (!$284) { + $alloc$2 = $alloc$0; + $matches$2 = $matches$0104; + $s$8 = $s$3; + $wcs$9 = $wcs$4; + break L6; + } + if (!(($284 | 0) == ($width$1 | 0) | $160 ^ 1)) { + $alloc$2 = $alloc$0; + $matches$2 = $matches$0104; + $s$8 = $s$3; + $wcs$9 = $wcs$4; + break L6; + } + do if ($197) if ($196) { + HEAP32[$dest$0 >> 2] = $wcs$4; + break; + } else { + HEAP32[$dest$0 >> 2] = $s$3; + break; + } while (0); + if ($160) { + $p$10 = $p$9; + $s$4 = $s$3; + $wcs$5 = $wcs$4; + } else { + if ($wcs$4) HEAP32[$wcs$4 + ($i$4 << 2) >> 2] = 0; + if (!$s$3) { + $p$10 = $p$9; + $s$4 = 0; + $wcs$5 = $wcs$4; + break L67; + } + HEAP8[$s$3 + $i$4 >> 0] = 0; + $p$10 = $p$9; + $s$4 = $s$3; + $wcs$5 = $wcs$4; + } + break; + } + case 120: + case 88: + case 112: + { + $base$0 = 16; + label = 134; + break; + } + case 111: + { + $base$0 = 8; + label = 134; + break; + } + case 117: + case 100: + { + $base$0 = 10; + label = 134; + break; + } + case 105: + { + $base$0 = 0; + label = 134; + break; + } + case 71: + case 103: + case 70: + case 102: + case 69: + case 101: + case 65: + case 97: + { + $310 = +___floatscan($f, $$size$0, 0); + if ((HEAP32[$9 >> 2] | 0) == ((HEAP32[$10 >> 2] | 0) - (HEAP32[$7 >> 2] | 0) | 0)) { + $alloc$2 = $alloc$0; + $matches$2 = $matches$0104; + $s$8 = $s$1; + $wcs$9 = $wcs$1; + break L6; + } + if (!$dest$0) { + $p$10 = $p$5; + $s$4 = $s$1; + $wcs$5 = $wcs$1; + } else switch ($$size$0 | 0) { + case 0: + { + HEAPF32[$dest$0 >> 2] = $310; + $p$10 = $p$5; + $s$4 = $s$1; + $wcs$5 = $wcs$1; + break L67; + break; + } + case 1: + { + HEAPF64[$dest$0 >> 3] = $310; + $p$10 = $p$5; + $s$4 = $s$1; + $wcs$5 = $wcs$1; + break L67; + break; + } + case 2: + { + HEAPF64[$dest$0 >> 3] = $310; + $p$10 = $p$5; + $s$4 = $s$1; + $wcs$5 = $wcs$1; + break L67; + break; + } + default: + { + $p$10 = $p$5; + $s$4 = $s$1; + $wcs$5 = $wcs$1; + break L67; + } + } + break; + } + default: + { + $p$10 = $p$5; + $s$4 = $s$1; + $wcs$5 = $wcs$1; + } + } while (0); + L168 : do if ((label | 0) == 134) { + label = 0; + $291 = ___intscan($f, $base$0, 0, -1, -1) | 0; + if ((HEAP32[$9 >> 2] | 0) == ((HEAP32[$10 >> 2] | 0) - (HEAP32[$7 >> 2] | 0) | 0)) { + $alloc$2 = $alloc$0; + $matches$2 = $matches$0104; + $s$8 = $s$1; + $wcs$9 = $wcs$1; + break L6; + } + if (($dest$0 | 0) != 0 & ($$ | 0) == 112) { + HEAP32[$dest$0 >> 2] = $291; + $p$10 = $p$5; + $s$4 = $s$1; + $wcs$5 = $wcs$1; + break; + } + if (!$dest$0) { + $p$10 = $p$5; + $s$4 = $s$1; + $wcs$5 = $wcs$1; + } else switch ($$size$0 | 0) { + case -2: + { + HEAP8[$dest$0 >> 0] = $291; + $p$10 = $p$5; + $s$4 = $s$1; + $wcs$5 = $wcs$1; + break L168; + break; + } + case -1: + { + HEAP16[$dest$0 >> 1] = $291; + $p$10 = $p$5; + $s$4 = $s$1; + $wcs$5 = $wcs$1; + break L168; + break; + } + case 0: + { + HEAP32[$dest$0 >> 2] = $291; + $p$10 = $p$5; + $s$4 = $s$1; + $wcs$5 = $wcs$1; + break L168; + break; + } + case 1: + { + HEAP32[$dest$0 >> 2] = $291; + $p$10 = $p$5; + $s$4 = $s$1; + $wcs$5 = $wcs$1; + break L168; + break; + } + case 3: + { + $306 = $dest$0; + HEAP32[$306 >> 2] = $291; + HEAP32[$306 + 4 >> 2] = tempRet0; + $p$10 = $p$5; + $s$4 = $s$1; + $wcs$5 = $wcs$1; + break L168; + break; + } + default: + { + $p$10 = $p$5; + $s$4 = $s$1; + $wcs$5 = $wcs$1; + break L168; + } + } + } while (0); + $matches$1 = (($dest$0 | 0) != 0 & 1) + $matches$0104 | 0; + $p$11 = $p$10; + $pos$2 = (HEAP32[$9 >> 2] | 0) + $pos$1 + (HEAP32[$7 >> 2] | 0) - (HEAP32[$10 >> 2] | 0) | 0; + $s$5 = $s$4; + $wcs$6 = $wcs$5; + break L8; + } while (0); + $51 = $p$0109 + ($47 & 1) | 0; + ___shlim($f, 0); + $52 = HEAP32[$7 >> 2] | 0; + if ($52 >>> 0 < (HEAP32[$8 >> 2] | 0) >>> 0) { + HEAP32[$7 >> 2] = $52 + 1; + $62 = HEAPU8[$52 >> 0] | 0; + } else $62 = ___shgetc($f) | 0; + if (($62 | 0) != (HEAPU8[$51 >> 0] | 0)) { + $$lcssa384 = $62; + $matches$0104$lcssa = $matches$0104; + $s$0107$lcssa = $s$0107; + $wcs$0103$lcssa = $wcs$0103; + label = 21; + break L6; + } + $matches$1 = $matches$0104; + $p$11 = $51; + $pos$2 = $pos$0108 + 1 | 0; + $s$5 = $s$0107; + $wcs$6 = $wcs$0103; + } else { + $p$1 = $p$0109; + while (1) { + $20 = $p$1 + 1 | 0; + if (!(_isspace(HEAPU8[$20 >> 0] | 0) | 0)) { + $p$1$lcssa = $p$1; + break; + } else $p$1 = $20; + } + ___shlim($f, 0); + do { + $25 = HEAP32[$7 >> 2] | 0; + if ($25 >>> 0 < (HEAP32[$8 >> 2] | 0) >>> 0) { + HEAP32[$7 >> 2] = $25 + 1; + $32 = HEAPU8[$25 >> 0] | 0; + } else $32 = ___shgetc($f) | 0; + } while ((_isspace($32) | 0) != 0); + $$pre = HEAP32[$7 >> 2] | 0; + if (!(HEAP32[$8 >> 2] | 0)) $41 = $$pre; else { + $37 = $$pre + -1 | 0; + HEAP32[$7 >> 2] = $37; + $41 = $37; + } + $matches$1 = $matches$0104; + $p$11 = $p$1$lcssa; + $pos$2 = (HEAP32[$9 >> 2] | 0) + $pos$0108 + $41 - (HEAP32[$10 >> 2] | 0) | 0; + $s$5 = $s$0107; + $wcs$6 = $wcs$0103; + } while (0); + $p$0109 = $p$11 + 1 | 0; + $17 = HEAP8[$p$0109 >> 0] | 0; + if (!($17 << 24 >> 24)) { + $matches$3 = $matches$1; + break L4; + } else { + $matches$0104 = $matches$1; + $pos$0108 = $pos$2; + $s$0107 = $s$5; + $wcs$0103 = $wcs$6; + } + } + if ((label | 0) == 21) { + if (HEAP32[$8 >> 2] | 0) HEAP32[$7 >> 2] = (HEAP32[$7 >> 2] | 0) + -1; + if (($matches$0104$lcssa | 0) != 0 | ($$lcssa384 | 0) > -1) { + $matches$3 = $matches$0104$lcssa; + break; + } else { + $alloc$1 = 0; + $s$7 = $s$0107$lcssa; + $wcs$8 = $wcs$0103$lcssa; + label = 153; + } + } else if ((label | 0) == 152) if (!$matches$0104376) { + $alloc$1 = $alloc$0400; + $s$7 = $s$6; + $wcs$8 = $wcs$7; + label = 153; + } else { + $alloc$2 = $alloc$0400; + $matches$2 = $matches$0104376; + $s$8 = $s$6; + $wcs$9 = $wcs$7; + } + if ((label | 0) == 153) { + $alloc$2 = $alloc$1; + $matches$2 = -1; + $s$8 = $s$7; + $wcs$9 = $wcs$8; + } + if (!$alloc$2) $matches$3 = $matches$2; else { + _free($s$8); + _free($wcs$9); + $matches$3 = $matches$2; + } + } while (0); + if ($334) ___unlockfile($f); + STACKTOP = sp; + return $matches$3 | 0; +} + +function __ZN10__cxxabiv112_GLOBAL__N_122parse_unqualified_nameINS0_2DbEEEPKcS4_S4_RT_($first, $last, $db) { + $first = $first | 0; + $last = $last | 0; + $db = $db | 0; + var $$0 = 0, $$0$i$i$i$i = 0, $$0$i$i$i$i6 = 0, $$0$i$i$i18$i = 0, $$0$i$i$i7$i = 0, $$0$i$i49 = 0, $$03$i = 0, $$1$i9 = 0, $$lcssa = 0, $$ph26 = 0, $$pre$i$i$i$i = 0, $0 = 0, $1 = 0, $100 = 0, $104 = 0, $106 = 0, $109 = 0, $110 = 0, $112 = 0, $114 = 0, $115 = 0, $116 = 0, $117 = 0, $121 = 0, $13 = 0, $134 = 0, $135 = 0, $136 = 0, $137 = 0, $14 = 0, $140 = 0, $141 = 0, $143 = 0, $150 = 0, $151 = 0, $152 = 0, $153 = 0, $157 = 0, $159 = 0, $162 = 0, $163 = 0, $165 = 0, $171 = 0, $173 = 0, $174 = 0, $175 = 0, $176 = 0, $185 = 0, $186 = 0, $187 = 0, $188 = 0, $191 = 0, $193 = 0, $194 = 0, $196 = 0, $198 = 0, $2 = 0, $20 = 0, $203 = 0, $204 = 0, $205 = 0, $207 = 0, $217 = 0, $218 = 0, $22 = 0, $220 = 0, $224 = 0, $227 = 0, $230 = 0, $241 = 0, $242 = 0, $243 = 0, $244 = 0, $246 = 0, $248 = 0, $252 = 0, $263 = 0, $264 = 0, $265 = 0, $266 = 0, $268 = 0, $270 = 0, $271 = 0, $272 = 0, $273 = 0, $277 = 0, $283 = 0, $284 = 0, $285 = 0, $29 = 0, $292 = 0, $297 = 0, $3 = 0, $30 = 0, $300 = 0, $301 = 0, $304 = 0, $31 = 0, $312 = 0, $318 = 0, $32 = 0, $335 = 0, $336 = 0, $337 = 0, $338 = 0, $341 = 0, $36 = 0, $38 = 0, $4 = 0, $41 = 0, $42 = 0, $50 = 0, $53 = 0, $55 = 0, $6 = 0, $62 = 0, $63 = 0, $64 = 0, $65 = 0, $69 = 0, $7 = 0, $71 = 0, $74 = 0, $75 = 0, $87 = 0, $88 = 0, $90 = 0, $97 = 0, $98 = 0, $99 = 0, $__p$0$i$i = 0, $__p$1$i$i48 = 0, $__v$i$i17$i = 0, $phitmp$i$i$i$i$i$i$i = 0, $phitmp$i2$i$i$i$i$i$i = 0, $t0$0$i = 0, $t01$0$i = 0, $t01$0$i$lcssa67 = 0, $t01$1$i = 0, $t01$2$i = 0, $t1$0$i$lcssa = 0, $t1$0$i45 = 0, $t13$0$i$lcssa = 0, $t13$0$i51 = 0, $tmp$i = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 128 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $__v$i$i17$i = sp + 104 | 0; + $0 = sp + 80 | 0; + $1 = sp + 64 | 0; + $2 = sp + 40 | 0; + $3 = sp + 24 | 0; + $tmp$i = sp + 12 | 0; + $4 = sp; + L1 : do if (($first | 0) == ($last | 0)) $$0 = $first; else { + $6 = HEAP8[$first >> 0] | 0; + $7 = $6 << 24 >> 24; + switch ($7 | 0) { + case 68: + case 67: + { + L6 : do if (($last - $first | 0) > 1) { + $13 = $db + 4 | 0; + $14 = HEAP32[$13 >> 2] | 0; + if ((HEAP32[$db >> 2] | 0) == ($14 | 0)) $$03$i = $first; else switch ($7 | 0) { + case 67: + { + switch (HEAP8[$first + 1 >> 0] | 0) { + case 53: + case 51: + case 50: + case 49: + break; + default: + { + $$03$i = $first; + break L6; + } + } + __ZN10__cxxabiv112_GLOBAL__N_19base_nameINSt3__112basic_stringIcNS2_11char_traitsIcEENS0_12malloc_allocIcEEEEEET_RS9_($1, $14 + -24 | 0); + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ENSt3__112basic_stringIcNS2_11char_traitsIcEENS0_12malloc_allocIcEEEE($0, $1); + $20 = HEAP32[$13 >> 2] | 0; + $22 = HEAP32[$db + 8 >> 2] | 0; + if ($20 >>> 0 < $22 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($20, $0); + HEAP32[$13 >> 2] = (HEAP32[$13 >> 2] | 0) + 24; + } else { + $29 = HEAP32[$db >> 2] | 0; + $30 = $20 - $29 | 0; + $31 = ($30 | 0) / 24 | 0; + $32 = $31 + 1 | 0; + if (($30 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $36 = ($22 - $29 | 0) / 24 | 0; + if ($36 >>> 0 < 1073741823) { + $38 = $36 << 1; + $$0$i$i$i$i = $38 >>> 0 < $32 >>> 0 ? $32 : $38; + } else $$0$i$i$i$i = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i17$i, $$0$i$i$i$i, $31, $db + 12 | 0); + $41 = $__v$i$i17$i + 8 | 0; + $42 = HEAP32[$41 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($42, $0); + HEAP32[$41 >> 2] = $42 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i17$i); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i17$i); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($0); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($1); + HEAP8[$db + 60 >> 0] = 1; + $$03$i = $first + 2 | 0; + break L6; + break; + } + case 68: + { + switch (HEAP8[$first + 1 >> 0] | 0) { + case 53: + case 50: + case 49: + case 48: + break; + default: + { + $$03$i = $first; + break L6; + } + } + __ZN10__cxxabiv112_GLOBAL__N_19base_nameINSt3__112basic_stringIcNS2_11char_traitsIcEENS0_12malloc_allocIcEEEEEET_RS9_($tmp$i, $14 + -24 | 0); + $50 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc($tmp$i, 0, 12928) | 0; + HEAP32[$3 >> 2] = HEAP32[$50 >> 2]; + HEAP32[$3 + 4 >> 2] = HEAP32[$50 + 4 >> 2]; + HEAP32[$3 + 8 >> 2] = HEAP32[$50 + 8 >> 2]; + HEAP32[$50 >> 2] = 0; + HEAP32[$50 + 4 >> 2] = 0; + HEAP32[$50 + 8 >> 2] = 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ENSt3__112basic_stringIcNS2_11char_traitsIcEENS0_12malloc_allocIcEEEE($2, $3); + $53 = HEAP32[$13 >> 2] | 0; + $55 = HEAP32[$db + 8 >> 2] | 0; + if ($53 >>> 0 < $55 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($53, $2); + HEAP32[$13 >> 2] = (HEAP32[$13 >> 2] | 0) + 24; + } else { + $62 = HEAP32[$db >> 2] | 0; + $63 = $53 - $62 | 0; + $64 = ($63 | 0) / 24 | 0; + $65 = $64 + 1 | 0; + if (($63 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $69 = ($55 - $62 | 0) / 24 | 0; + if ($69 >>> 0 < 1073741823) { + $71 = $69 << 1; + $$0$i$i$i7$i = $71 >>> 0 < $65 >>> 0 ? $65 : $71; + } else $$0$i$i$i7$i = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i17$i, $$0$i$i$i7$i, $64, $db + 12 | 0); + $74 = $__v$i$i17$i + 8 | 0; + $75 = HEAP32[$74 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($75, $2); + HEAP32[$74 >> 2] = $75 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i17$i); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i17$i); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($2); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($3); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($tmp$i); + HEAP8[$db + 60 >> 0] = 1; + $$03$i = $first + 2 | 0; + break L6; + break; + } + default: + { + $$03$i = $first; + break L6; + } + } + } else $$03$i = $first; while (0); + $$0 = $$03$i; + break L1; + break; + } + case 85: + { + L36 : do if (($last - $first | 0) > 2 & $6 << 24 >> 24 == 85) { + switch (HEAP8[$first + 1 >> 0] | 0) { + case 116: + { + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($1, 12930, 8); + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ENSt3__112basic_stringIcNS2_11char_traitsIcEENS0_12malloc_allocIcEEEE($0, $1); + $87 = $db + 4 | 0; + $88 = HEAP32[$87 >> 2] | 0; + $90 = HEAP32[$db + 8 >> 2] | 0; + if ($88 >>> 0 < $90 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($88, $0); + HEAP32[$87 >> 2] = (HEAP32[$87 >> 2] | 0) + 24; + } else { + $97 = HEAP32[$db >> 2] | 0; + $98 = $88 - $97 | 0; + $99 = ($98 | 0) / 24 | 0; + $100 = $99 + 1 | 0; + if (($98 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $104 = ($90 - $97 | 0) / 24 | 0; + if ($104 >>> 0 < 1073741823) { + $106 = $104 << 1; + $$0$i$i$i$i6 = $106 >>> 0 < $100 >>> 0 ? $100 : $106; + } else $$0$i$i$i$i6 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i17$i, $$0$i$i$i$i6, $99, $db + 12 | 0); + $109 = $__v$i$i17$i + 8 | 0; + $110 = HEAP32[$109 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($110, $0); + HEAP32[$109 >> 2] = $110 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i17$i); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i17$i); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($0); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($1); + $112 = $first + 2 | 0; + if (($112 | 0) == ($last | 0)) { + $114 = HEAP32[$87 >> 2] | 0; + $115 = $114 + -24 | 0; + $117 = $114; + while (1) { + $116 = $117 + -24 | 0; + HEAP32[$87 >> 2] = $116; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($116); + $117 = HEAP32[$87 >> 2] | 0; + if (($117 | 0) == ($115 | 0)) { + $$1$i9 = $first; + break L36; + } + } + } + if (((HEAP8[$112 >> 0] | 0) + -48 | 0) >>> 0 < 10) { + $121 = $first + 3 | 0; + L57 : do if (($121 | 0) == ($last | 0)) $t1$0$i$lcssa = $last; else { + $t1$0$i45 = $121; + while (1) { + if (((HEAP8[$t1$0$i45 >> 0] | 0) + -48 | 0) >>> 0 >= 10) { + $t1$0$i$lcssa = $t1$0$i45; + break L57; + } + $t1$0$i45 = $t1$0$i45 + 1 | 0; + if (($t1$0$i45 | 0) == ($last | 0)) { + $t1$0$i$lcssa = $last; + break; + } + } + } while (0); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendIPKcEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueERS7_E4typeESC_SC_((HEAP32[$87 >> 2] | 0) + -24 | 0, $112, $t1$0$i$lcssa); + $t0$0$i = $t1$0$i$lcssa; + } else $t0$0$i = $112; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE9push_backEc((HEAP32[$87 >> 2] | 0) + -24 | 0, 39); + if (($t0$0$i | 0) != ($last | 0)) if ((HEAP8[$t0$0$i >> 0] | 0) == 95) { + $$1$i9 = $t0$0$i + 1 | 0; + break L36; + } + $134 = HEAP32[$87 >> 2] | 0; + $135 = $134 + -24 | 0; + $137 = $134; + while (1) { + $136 = $137 + -24 | 0; + HEAP32[$87 >> 2] = $136; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($136); + $137 = HEAP32[$87 >> 2] | 0; + if (($137 | 0) == ($135 | 0)) { + $$1$i9 = $first; + break L36; + } + } + break; + } + case 108: + break; + default: + { + $$1$i9 = $first; + break L36; + } + } + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($3, 12939, 9); + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ENSt3__112basic_stringIcNS2_11char_traitsIcEENS0_12malloc_allocIcEEEE($2, $3); + $140 = $db + 4 | 0; + $141 = HEAP32[$140 >> 2] | 0; + $143 = HEAP32[$db + 8 >> 2] | 0; + if ($141 >>> 0 < $143 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($141, $2); + HEAP32[$140 >> 2] = (HEAP32[$140 >> 2] | 0) + 24; + } else { + $150 = HEAP32[$db >> 2] | 0; + $151 = $141 - $150 | 0; + $152 = ($151 | 0) / 24 | 0; + $153 = $152 + 1 | 0; + if (($151 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $157 = ($143 - $150 | 0) / 24 | 0; + if ($157 >>> 0 < 1073741823) { + $159 = $157 << 1; + $$0$i$i$i18$i = $159 >>> 0 < $153 >>> 0 ? $153 : $159; + } else $$0$i$i$i18$i = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i17$i, $$0$i$i$i18$i, $152, $db + 12 | 0); + $162 = $__v$i$i17$i + 8 | 0; + $163 = HEAP32[$162 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($163, $2); + HEAP32[$162 >> 2] = $163 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i17$i); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i17$i); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($2); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($3); + $165 = $first + 2 | 0; + do if ((HEAP8[$165 >> 0] | 0) == 118) { + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE9push_backEc((HEAP32[$140 >> 2] | 0) + -24 | 0, 41); + $t01$1$i = $first + 3 | 0; + } else { + $171 = __ZN10__cxxabiv112_GLOBAL__N_110parse_typeINS0_2DbEEEPKcS4_S4_RT_($165, $last, $db) | 0; + $173 = HEAP32[$140 >> 2] | 0; + if (($171 | 0) == ($165 | 0)) { + $174 = $173 + -24 | 0; + $176 = $173; + while (1) { + $175 = $176 + -24 | 0; + HEAP32[$140 >> 2] = $175; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($175); + $176 = HEAP32[$140 >> 2] | 0; + if (($176 | 0) == ($174 | 0)) { + $$1$i9 = $first; + break L36; + } + } + } + if ((($173 - (HEAP32[$db >> 2] | 0) | 0) / 24 | 0) >>> 0 < 2) { + $$1$i9 = $first; + break L36; + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($tmp$i, $173 + -24 | 0); + $185 = HEAP32[$140 >> 2] | 0; + $186 = $185 + -24 | 0; + $188 = $185; + do { + $187 = $188 + -24 | 0; + HEAP32[$140 >> 2] = $187; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($187); + $188 = HEAP32[$140 >> 2] | 0; + } while (($188 | 0) != ($186 | 0)); + $191 = HEAP8[$tmp$i >> 0] | 0; + $193 = ($191 & 1) == 0; + $194 = $tmp$i + 8 | 0; + $196 = $tmp$i + 1 | 0; + $198 = $tmp$i + 4 | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($185 + -48 | 0, $193 ? $196 : HEAP32[$194 >> 2] | 0, $193 ? ($191 & 255) >>> 1 : HEAP32[$198 >> 2] | 0) | 0; + $203 = $4 + 4 | 0; + $204 = $4 + 8 | 0; + $$pre$i$i$i$i = $191; + $t01$0$i = $171; + while (1) { + $205 = __ZN10__cxxabiv112_GLOBAL__N_110parse_typeINS0_2DbEEEPKcS4_S4_RT_($t01$0$i, $last, $db) | 0; + $207 = HEAP32[$140 >> 2] | 0; + if (($205 | 0) == ($t01$0$i | 0)) { + $$lcssa = $207; + $t01$0$i$lcssa67 = $t01$0$i; + label = 79; + break; + } + if ((($207 - (HEAP32[$db >> 2] | 0) | 0) / 24 | 0) >>> 0 < 2) { + label = 113; + break; + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($4, $207 + -24 | 0); + L96 : do if (!($$pre$i$i$i$i & 1)) { + HEAP8[$196 >> 0] = 0; + HEAP8[$tmp$i >> 0] = 0; + } else { + $217 = HEAP32[$194 >> 2] | 0; + HEAP8[$217 >> 0] = 0; + HEAP32[$198 >> 2] = 0; + $218 = HEAP32[$tmp$i >> 2] | 0; + $phitmp$i$i$i$i$i$i$i = ($218 & -2) + -1 | 0; + $220 = $218 & 255; + do if (!($220 & 1)) { + $224 = $218 >>> 1 & 127; + if (($220 & 255) < 22) { + _memcpy($196 | 0, $217 | 0, ($218 >>> 1 & 127) + 1 | 0) | 0; + _free($217); + $$ph26 = $224; + break; + } + $227 = $224 + 16 & 240; + $phitmp$i2$i$i$i$i$i$i = $227 + -1 | 0; + if (($phitmp$i2$i$i$i$i$i$i | 0) == ($phitmp$i$i$i$i$i$i$i | 0)) break L96; + $230 = _malloc($227) | 0; + if ($phitmp$i2$i$i$i$i$i$i >>> 0 <= $phitmp$i$i$i$i$i$i$i >>> 0 & ($230 | 0) == 0) break L96; + _memcpy($230 | 0, $196 | 0, ($218 >>> 1 & 127) + 1 | 0) | 0; + HEAP32[$tmp$i >> 2] = $227 | 1; + HEAP32[$198 >> 2] = $224; + HEAP32[$194 >> 2] = $230; + break L96; + } else { + HEAP8[$196 >> 0] = 0; + _free($217); + $$ph26 = 0; + } while (0); + HEAP8[$tmp$i >> 0] = $$ph26 << 1; + } while (0); + HEAP32[$tmp$i >> 2] = HEAP32[$4 >> 2]; + HEAP32[$tmp$i + 4 >> 2] = HEAP32[$4 + 4 >> 2]; + HEAP32[$tmp$i + 8 >> 2] = HEAP32[$4 + 8 >> 2]; + HEAP32[$4 >> 2] = 0; + HEAP32[$203 >> 2] = 0; + HEAP32[$204 >> 2] = 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($4); + $241 = HEAP32[$140 >> 2] | 0; + $242 = $241 + -24 | 0; + $244 = $241; + do { + $243 = $244 + -24 | 0; + HEAP32[$140 >> 2] = $243; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($243); + $244 = HEAP32[$140 >> 2] | 0; + } while (($244 | 0) != ($242 | 0)); + $246 = HEAP8[$tmp$i >> 0] | 0; + $248 = ($246 & 1) == 0; + $252 = $248 ? ($246 & 255) >>> 1 : HEAP32[$198 >> 2] | 0; + if (!$252) { + $$pre$i$i$i$i = $246; + $t01$0$i = $205; + continue; + } + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($241 + -48 | 0, 12716) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj((HEAP32[$140 >> 2] | 0) + -24 | 0, $248 ? $196 : HEAP32[$194 >> 2] | 0, $252) | 0; + $$pre$i$i$i$i = $246; + $t01$0$i = $205; + } + if ((label | 0) == 79) { + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($$lcssa + -24 | 0, 12619) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($tmp$i); + $t01$1$i = $t01$0$i$lcssa67; + break; + } else if ((label | 0) == 113) { + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($tmp$i); + $$1$i9 = $first; + break L36; + } + } while (0); + if (($t01$1$i | 0) != ($last | 0)) if ((HEAP8[$t01$1$i >> 0] | 0) == 69) { + $268 = $t01$1$i + 1 | 0; + if (($268 | 0) == ($last | 0)) { + $270 = HEAP32[$140 >> 2] | 0; + $271 = $270 + -24 | 0; + $273 = $270; + while (1) { + $272 = $273 + -24 | 0; + HEAP32[$140 >> 2] = $272; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($272); + $273 = HEAP32[$140 >> 2] | 0; + if (($273 | 0) == ($271 | 0)) { + $$1$i9 = $first; + break L36; + } + } + } + if (((HEAP8[$268 >> 0] | 0) + -48 | 0) >>> 0 < 10) { + $277 = $t01$1$i + 2 | 0; + L127 : do if (($277 | 0) == ($last | 0)) $t13$0$i$lcssa = $last; else { + $t13$0$i51 = $277; + while (1) { + if (((HEAP8[$t13$0$i51 >> 0] | 0) + -48 | 0) >>> 0 >= 10) { + $t13$0$i$lcssa = $t13$0$i51; + break L127; + } + $t13$0$i51 = $t13$0$i51 + 1 | 0; + if (($t13$0$i51 | 0) == ($last | 0)) { + $t13$0$i$lcssa = $last; + break; + } + } + } while (0); + $283 = HEAP32[$140 >> 2] | 0; + $284 = $283 + -24 | 0; + $285 = HEAP8[$284 >> 0] | 0; + if (!($285 & 1)) { + $300 = 10; + $301 = ($285 & 255) >>> 1; + $304 = $285; + } else { + $292 = HEAP32[$284 >> 2] | 0; + $300 = ($292 & -2) + -1 | 0; + $301 = HEAP32[$283 + -20 >> 2] | 0; + $304 = $292 & 255; + } + $297 = $t13$0$i$lcssa - $268 | 0; + if (($t13$0$i$lcssa | 0) == ($268 | 0)) $t01$2$i = $268; else { + if (($300 - $301 | 0) >>> 0 < $297 >>> 0) { + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE9__grow_byEjjjjjj($284, $300, $301 + $297 - $300 | 0, $301, 7, $297); + $__p$0$i$i = HEAP32[$283 + -16 >> 2] | 0; + } else { + if (!($304 & 1)) $312 = $284 + 1 | 0; else $312 = HEAP32[$283 + -16 >> 2] | 0; + if (($301 | 0) == 7) $__p$0$i$i = $312; else { + _memmove($312 + ($297 + 7) | 0, $312 + 7 | 0, $301 + -7 | 0) | 0; + $__p$0$i$i = $312; + } + } + $318 = $301 + $297 | 0; + if (!(HEAP8[$284 >> 0] & 1)) HEAP8[$284 >> 0] = $318 << 1; else HEAP32[$283 + -20 >> 2] = $318; + HEAP8[$__p$0$i$i + $318 >> 0] = 0; + if (($268 | 0) == ($t13$0$i$lcssa | 0)) $t01$2$i = $t13$0$i$lcssa; else { + $$0$i$i49 = $268; + $__p$1$i$i48 = $__p$0$i$i + 7 | 0; + while (1) { + HEAP8[$__p$1$i$i48 >> 0] = HEAP8[$$0$i$i49 >> 0] | 0; + $$0$i$i49 = $$0$i$i49 + 1 | 0; + if (($$0$i$i49 | 0) == ($t13$0$i$lcssa | 0)) { + $t01$2$i = $t13$0$i$lcssa; + break; + } else $__p$1$i$i48 = $__p$1$i$i48 + 1 | 0; + } + } + } + } else $t01$2$i = $268; + if (($t01$2$i | 0) != ($last | 0)) if ((HEAP8[$t01$2$i >> 0] | 0) == 95) { + $$1$i9 = $t01$2$i + 1 | 0; + break; + } + $335 = HEAP32[$140 >> 2] | 0; + $336 = $335 + -24 | 0; + $338 = $335; + while (1) { + $337 = $338 + -24 | 0; + HEAP32[$140 >> 2] = $337; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($337); + $338 = HEAP32[$140 >> 2] | 0; + if (($338 | 0) == ($336 | 0)) { + $$1$i9 = $first; + break L36; + } + } + } + $263 = HEAP32[$140 >> 2] | 0; + $264 = $263 + -24 | 0; + $266 = $263; + do { + $265 = $266 + -24 | 0; + HEAP32[$140 >> 2] = $265; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($265); + $266 = HEAP32[$140 >> 2] | 0; + } while (($266 | 0) != ($264 | 0)); + $$1$i9 = $first; + } else $$1$i9 = $first; while (0); + $$0 = $$1$i9; + break L1; + break; + } + case 57: + case 56: + case 55: + case 54: + case 53: + case 52: + case 51: + case 50: + case 49: + { + $341 = __ZN10__cxxabiv112_GLOBAL__N_117parse_source_nameINS0_2DbEEEPKcS4_S4_RT_($first, $last, $db) | 0; + STACKTOP = sp; + return $341 | 0; + } + default: + { + $$0 = __ZN10__cxxabiv112_GLOBAL__N_119parse_operator_nameINS0_2DbEEEPKcS4_S4_RT_($first, $last, $db) | 0; + break L1; + } + } + } while (0); + STACKTOP = sp; + return $$0 | 0; +} + +function _PCA($input, $output, $ev) { + $input = $input | 0; + $output = $output | 0; + $ev = $ev | 0; + var $$0 = 0, $0 = 0, $1 = 0, $102 = 0.0, $11 = 0, $112 = 0, $113 = 0, $114 = 0, $117 = 0, $118 = 0, $120 = 0, $121 = 0.0, $123 = 0.0, $124 = 0.0, $125 = 0.0, $128 = 0.0, $138 = 0.0, $14 = 0, $143 = 0.0, $147 = 0.0, $150 = 0.0, $154 = 0.0, $156 = 0, $157 = 0.0, $159 = 0, $160 = 0.0, $161 = 0.0, $164 = 0, $168 = 0.0, $17 = 0, $172 = 0, $179 = 0.0, $18 = 0, $184 = 0, $185 = 0, $186 = 0, $188 = 0, $189 = 0.0, $191 = 0, $192 = 0.0, $2 = 0, $202 = 0.0, $204 = 0, $205 = 0.0, $21 = 0, $210 = 0.0, $212 = 0.0, $219 = 0, $220 = 0.0, $223 = 0.0, $224 = 0, $232 = 0.0, $237 = 0, $238 = 0, $24 = 0, $25 = 0, $251 = 0, $253 = 0, $256 = 0, $257 = 0, $259 = 0.0, $26 = 0, $263 = 0.0, $264 = 0, $272 = 0.0, $279 = 0, $28 = 0, $287 = 0, $289 = 0, $292 = 0, $295 = 0, $296 = 0, $3 = 0, $30 = 0, $304 = 0, $31 = 0, $35 = 0, $37 = 0, $47 = 0.0, $5 = 0, $55 = 0, $57 = 0, $61 = 0, $63 = 0, $70 = 0.0, $8 = 0, $82 = 0, $84 = 0, $90 = 0, $92 = 0, $93 = 0, $97 = 0.0, $98 = 0, $99 = 0, $c$0$i = 0.0, $ev1$i = 0, $exitcond$i133 = 0, $exitcond$i14148 = 0, $exitcond$i28106 = 0, $exitcond$i651 = 0, $exitcond3$i59 = 0, $exitcond6$i115 = 0, $exitcond82 = 0, $h$0$i127 = 0, $h$1$i$lcssa = 0, $h$1$i100 = 0, $h$2$i = 0, $i$0$i11155 = 0, $i$0$i141 = 0, $i$0$i2$lcssa = 0, $i$0$i25116 = 0, $i$0$i266 = 0, $i$0$lcssa = 0, $i$090 = 0, $i$1$i2799 = 0, $i$1$i49 = 0, $i$180 = 0, $i$2$i109 = 0, $in1$0$i129 = 0, $in1$0$i17144 = 0, $in2$0$i128 = 0, $in2$0$i16143 = 0, $iter$0$i = 0, $j$0$i13152 = 0, $j$0$i137 = 0, $j$0$i23 = 0, $j$0$i23$lcssa = 0, $j$0$i461 = 0, $j$085 = 0, $j$1$i47 = 0, $j$175 = 0, $k$0$i130 = 0, $k$0$i18145 = 0, $k$0$i24124 = 0, $k$0$i555 = 0, $k$1$i113 = 0, $m$0$i$lcssa = 0, $m$0$i65 = 0, $m$1$i60 = 0, $m$2$i48 = 0, $m$3$i46 = 0, $m1$0$i54 = 0, $m1$089 = 0, $m1$184 = 0, $m2$0$i52 = 0, $m2$0$lcssa = 0, $m2$088 = 0, $m2$183 = 0, $m2$279 = 0, $m2$374 = 0, $out$0$i10154 = 0, $out$0$i140 = 0, $out$1$i12149 = 0, $out$1$i134 = 0, $s$1$i = 0.0, $scevgep2$i = 0, $scevgep41 = 0, $smax$i = 0, $smax38 = 0, $sum$0$i$lcssa = 0.0, $sum$0$i53 = 0.0, $t$0$i$lcssa = 0.0, $t$0$i98 = 0.0, $t$1$i = 0.0, $v1$0$i107 = 0, $v2$0$i108 = 0, $x$0$i$be = 0.0, $x$0$i122 = 0.0, $x$1$i$lcssa = 0.0, $y$0$i$be = 0.0, $y$0$i123 = 0.0, $y$1$i$lcssa = 0.0, sp = 0, $k$0$i24124$looptemp = 0, $h$0$i127$looptemp = 0, $k$1$i113$looptemp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $ev1$i = sp; + $0 = $input + 4 | 0; + $1 = HEAP32[$0 >> 2] | 0; + $2 = $input + 8 | 0; + $3 = HEAP32[$2 >> 2] | 0; + $5 = ($3 | 0) < ($1 | 0) ? $3 : $1; + L1 : do if (($1 | 0) < 2 | ($3 | 0) < 2) $$0 = -1; else { + $8 = $output + 8 | 0; + if ((HEAP32[$8 >> 2] | 0) == ($3 | 0)) { + $11 = $output + 4 | 0; + if ((HEAP32[$11 >> 2] | 0) == ($5 | 0)) { + $14 = $ev + 4 | 0; + if ((HEAP32[$14 >> 2] | 0) == ($5 | 0)) { + $17 = _arMatrixAlloc($5, $5) | 0; + $18 = $17 + 4 | 0; + if ((HEAP32[$18 >> 2] | 0) == ($5 | 0)) { + $21 = $17 + 8 | 0; + if ((HEAP32[$21 >> 2] | 0) == ($5 | 0)) { + $24 = ($1 | 0) < ($3 | 0); + $25 = HEAP32[$0 >> 2] | 0; + $26 = HEAP32[$2 >> 2] | 0; + if ($24) { + if (($5 | 0) != ($25 | 0)) { + _arMatrixFree($17) | 0; + $$0 = -1; + break; + } + $28 = HEAP32[$17 >> 2] | 0; + if (($5 | 0) > 0) { + $exitcond$i133 = ($5 | 0) == 0; + $30 = ($26 | 0) > 0; + $i$0$i141 = 0; + $out$0$i140 = $28; + while (1) { + $31 = Math_imul($i$0$i141, $26) | 0; + if (!$exitcond$i133) { + $j$0$i137 = 0; + $out$1$i134 = $out$0$i140; + while (1) { + if (($j$0$i137 | 0) < ($i$0$i141 | 0)) { + $35 = $28 + ((Math_imul($j$0$i137, $5) | 0) + $i$0$i141 << 3) | 0; + HEAPF64[$out$1$i134 >> 3] = +HEAPF64[$35 >> 3]; + } else { + $37 = HEAP32[$input >> 2] | 0; + HEAPF64[$out$1$i134 >> 3] = 0.0; + if ($30) { + $47 = 0.0; + $in1$0$i129 = $37 + ($31 << 3) | 0; + $in2$0$i128 = $37 + ((Math_imul($j$0$i137, $26) | 0) << 3) | 0; + $k$0$i130 = 0; + while (1) { + $47 = $47 + +HEAPF64[$in1$0$i129 >> 3] * +HEAPF64[$in2$0$i128 >> 3]; + HEAPF64[$out$1$i134 >> 3] = $47; + $k$0$i130 = $k$0$i130 + 1 | 0; + if (($k$0$i130 | 0) >= ($26 | 0)) break; else { + $in1$0$i129 = $in1$0$i129 + 8 | 0; + $in2$0$i128 = $in2$0$i128 + 8 | 0; + } + } + } + } + $j$0$i137 = $j$0$i137 + 1 | 0; + if (($j$0$i137 | 0) == ($5 | 0)) break; else $out$1$i134 = $out$1$i134 + 8 | 0; + } + } + $i$0$i141 = $i$0$i141 + 1 | 0; + if (($i$0$i141 | 0) >= ($5 | 0)) break; else $out$0$i140 = $out$0$i140 + ($5 << 3) | 0; + } + } + } else { + if (($5 | 0) != ($26 | 0)) { + _arMatrixFree($17) | 0; + $$0 = -1; + break; + } + $55 = HEAP32[$17 >> 2] | 0; + if (($5 | 0) > 0) { + $exitcond$i14148 = ($5 | 0) == 0; + $57 = ($25 | 0) > 0; + $i$0$i11155 = 0; + $out$0$i10154 = $55; + while (1) { + if (!$exitcond$i14148) { + $j$0$i13152 = 0; + $out$1$i12149 = $out$0$i10154; + while (1) { + if (($j$0$i13152 | 0) < ($i$0$i11155 | 0)) { + $61 = $55 + ((Math_imul($j$0$i13152, $5) | 0) + $i$0$i11155 << 3) | 0; + HEAPF64[$out$1$i12149 >> 3] = +HEAPF64[$61 >> 3]; + } else { + $63 = HEAP32[$input >> 2] | 0; + HEAPF64[$out$1$i12149 >> 3] = 0.0; + if ($57) { + $70 = 0.0; + $in1$0$i17144 = $63 + ($i$0$i11155 << 3) | 0; + $in2$0$i16143 = $63 + ($j$0$i13152 << 3) | 0; + $k$0$i18145 = 0; + while (1) { + $70 = $70 + +HEAPF64[$in1$0$i17144 >> 3] * +HEAPF64[$in2$0$i16143 >> 3]; + HEAPF64[$out$1$i12149 >> 3] = $70; + $k$0$i18145 = $k$0$i18145 + 1 | 0; + if (($k$0$i18145 | 0) >= ($25 | 0)) break; else { + $in1$0$i17144 = $in1$0$i17144 + ($5 << 3) | 0; + $in2$0$i16143 = $in2$0$i16143 + ($5 << 3) | 0; + } + } + } + } + $j$0$i13152 = $j$0$i13152 + 1 | 0; + if (($j$0$i13152 | 0) == ($5 | 0)) break; else $out$1$i12149 = $out$1$i12149 + 8 | 0; + } + } + $i$0$i11155 = $i$0$i11155 + 1 | 0; + if (($i$0$i11155 | 0) >= ($5 | 0)) break; else $out$0$i10154 = $out$0$i10154 + ($5 << 3) | 0; + } + } + } + do if (($5 | 0) >= 2) if ((HEAP32[$14 >> 2] | 0) == ($5 | 0)) { + $82 = _arVecAlloc($5) | 0; + if ($82) { + $84 = $5 + -1 | 0; + HEAP32[$ev1$i + 4 >> 2] = $84; + HEAP32[$ev1$i >> 2] = (HEAP32[$82 >> 2] | 0) + 8; + if ((_arVecTridiagonalize($17, $ev, $ev1$i) | 0) < 0) { + _arVecFree($82) | 0; + break; + } + $90 = HEAP32[$82 >> 2] | 0; + HEAPF64[$90 >> 3] = 0.0; + if (($84 | 0) > 0) { + $exitcond6$i115 = ($5 | 0) == 0; + $h$0$i127 = $84; + do { + $j$0$i23 = $h$0$i127; + while (1) { + if (($j$0$i23 | 0) <= 0) { + $j$0$i23$lcssa = $j$0$i23; + break; + } + $97 = +Math_abs(+(+HEAPF64[$90 + ($j$0$i23 << 3) >> 3])); + $98 = $j$0$i23 + -1 | 0; + $99 = HEAP32[$ev >> 2] | 0; + $102 = +Math_abs(+(+HEAPF64[$99 + ($98 << 3) >> 3])); + if ($97 > ($102 + +Math_abs(+(+HEAPF64[$99 + ($j$0$i23 << 3) >> 3]))) * 1.0e-06) $j$0$i23 = $98; else { + $j$0$i23$lcssa = $j$0$i23; + break; + } + } + $h$0$i127$looptemp = $h$0$i127; + $h$0$i127 = $h$0$i127 + -1 | 0; + L62 : do if (($j$0$i23$lcssa | 0) != ($h$0$i127$looptemp | 0)) { + $112 = $90 + ($h$0$i127$looptemp << 3) | 0; + $113 = $90 + ($j$0$i23$lcssa + 1 << 3) | 0; + $114 = ($j$0$i23$lcssa | 0) < ($h$0$i127$looptemp | 0); + $iter$0$i = 0; + do { + if (($iter$0$i | 0) > 99) break L62; + $iter$0$i = $iter$0$i + 1 | 0; + $117 = HEAP32[$ev >> 2] | 0; + $118 = $117 + ($h$0$i127 << 3) | 0; + $120 = $117 + ($h$0$i127$looptemp << 3) | 0; + $121 = +HEAPF64[$120 >> 3]; + $123 = (+HEAPF64[$118 >> 3] - $121) * .5; + $124 = +HEAPF64[$112 >> 3]; + $125 = $124 * $124; + $128 = +Math_sqrt(+($125 + $123 * $123)); + if ($114) { + $k$0$i24124 = $j$0$i23$lcssa; + $x$0$i122 = +HEAPF64[$117 + ($j$0$i23$lcssa << 3) >> 3] - $121 + $125 / ($123 + ($123 < 0.0 ? -$128 : $128)); + $y$0$i123 = +HEAPF64[$113 >> 3]; + while (1) { + $138 = +Math_abs(+$x$0$i122); + do if (!($138 >= +Math_abs(+$y$0$i123))) { + $150 = -$x$0$i122 / $y$0$i123; + $154 = 1.0 / +Math_sqrt(+($150 * $150 + 1.0)); + $c$0$i = $150 * $154; + $s$1$i = $154; + } else { + if (!($138 > 1.0e-16)) { + $c$0$i = 1.0; + $s$1$i = 0.0; + break; + } + $143 = -$y$0$i123 / $x$0$i122; + $147 = 1.0 / +Math_sqrt(+($143 * $143 + 1.0)); + $c$0$i = $147; + $s$1$i = $143 * $147; + } while (0); + $156 = $117 + ($k$0$i24124 << 3) | 0; + $157 = +HEAPF64[$156 >> 3]; + $k$0$i24124$looptemp = $k$0$i24124; + $k$0$i24124 = $k$0$i24124 + 1 | 0; + $159 = $117 + ($k$0$i24124 << 3) | 0; + $160 = +HEAPF64[$159 >> 3]; + $161 = $157 - $160; + $164 = $90 + ($k$0$i24124 << 3) | 0; + $168 = $s$1$i * ($s$1$i * $161 + $c$0$i * 2.0 * +HEAPF64[$164 >> 3]); + HEAPF64[$156 >> 3] = $157 - $168; + HEAPF64[$159 >> 3] = $160 + $168; + if (($k$0$i24124$looptemp | 0) > ($j$0$i23$lcssa | 0)) { + $172 = $90 + ($k$0$i24124$looptemp << 3) | 0; + HEAPF64[$172 >> 3] = $c$0$i * +HEAPF64[$172 >> 3] - $y$0$i123 * $s$1$i; + } + $179 = +HEAPF64[$164 >> 3]; + HEAPF64[$164 >> 3] = $179 + $s$1$i * ($c$0$i * $161 - $s$1$i * 2.0 * $179); + $184 = Math_imul($k$0$i24124$looptemp, $5) | 0; + $185 = Math_imul($k$0$i24124, $5) | 0; + if ($exitcond6$i115) { + $x$1$i$lcssa = $x$0$i122; + $y$1$i$lcssa = $y$0$i123; + } else { + $186 = HEAP32[$17 >> 2] | 0; + $i$0$i25116 = 0; + do { + $188 = $186 + ($i$0$i25116 + $184 << 3) | 0; + $189 = +HEAPF64[$188 >> 3]; + $191 = $186 + ($i$0$i25116 + $185 << 3) | 0; + $192 = +HEAPF64[$191 >> 3]; + HEAPF64[$188 >> 3] = $c$0$i * $189 - $s$1$i * $192; + HEAPF64[$191 >> 3] = $s$1$i * $189 + $c$0$i * $192; + $i$0$i25116 = $i$0$i25116 + 1 | 0; + } while (($i$0$i25116 | 0) != ($5 | 0)); + $x$1$i$lcssa = $189; + $y$1$i$lcssa = $192; + } + if (($k$0$i24124$looptemp | 0) < ($h$0$i127 | 0)) { + $202 = +HEAPF64[$164 >> 3]; + $204 = $90 + ($k$0$i24124$looptemp + 2 << 3) | 0; + $205 = +HEAPF64[$204 >> 3]; + HEAPF64[$204 >> 3] = $c$0$i * $205; + $x$0$i$be = $202; + $y$0$i$be = -($s$1$i * $205); + } else { + $x$0$i$be = $x$1$i$lcssa; + $y$0$i$be = $y$1$i$lcssa; + } + if (($k$0$i24124 | 0) >= ($h$0$i127$looptemp | 0)) break; else { + $x$0$i122 = $x$0$i$be; + $y$0$i123 = $y$0$i$be; + } + } + } + $210 = +Math_abs(+(+HEAPF64[$112 >> 3])); + $212 = +Math_abs(+(+HEAPF64[$118 >> 3])); + } while ($210 > ($212 + +Math_abs(+(+HEAPF64[$120 >> 3]))) * 1.0e-06); + } while (0); + } while (($h$0$i127$looptemp | 0) > 1); + } + if ($84) { + $92 = HEAP32[$ev >> 2] | 0; + $93 = HEAP32[$17 >> 2] | 0; + $exitcond$i28106 = ($5 | 0) == 0; + $k$1$i113 = 0; + do { + $219 = $92 + ($k$1$i113 << 3) | 0; + $220 = +HEAPF64[$219 >> 3]; + $k$1$i113$looptemp = $k$1$i113; + $k$1$i113 = $k$1$i113 + 1 | 0; + if (($k$1$i113 | 0) < ($5 | 0)) { + $h$1$i100 = $k$1$i113$looptemp; + $i$1$i2799 = $k$1$i113; + $t$0$i98 = $220; + while (1) { + $223 = +HEAPF64[$92 + ($i$1$i2799 << 3) >> 3]; + $224 = $223 > $t$0$i98; + $t$1$i = $224 ? $223 : $t$0$i98; + $h$2$i = $224 ? $i$1$i2799 : $h$1$i100; + $i$1$i2799 = $i$1$i2799 + 1 | 0; + if (($i$1$i2799 | 0) >= ($5 | 0)) { + $h$1$i$lcssa = $h$2$i; + $t$0$i$lcssa = $t$1$i; + break; + } else { + $h$1$i100 = $h$2$i; + $t$0$i98 = $t$1$i; + } + } + } else { + $h$1$i$lcssa = $k$1$i113$looptemp; + $t$0$i$lcssa = $220; + } + HEAPF64[$92 + ($h$1$i$lcssa << 3) >> 3] = $220; + HEAPF64[$219 >> 3] = $t$0$i$lcssa; + if (!$exitcond$i28106) { + $i$2$i109 = 0; + $v1$0$i107 = $93 + ((Math_imul($h$1$i$lcssa, $5) | 0) << 3) | 0; + $v2$0$i108 = $93 + ((Math_imul($k$1$i113$looptemp, $5) | 0) << 3) | 0; + while (1) { + $232 = +HEAPF64[$v1$0$i107 >> 3]; + HEAPF64[$v1$0$i107 >> 3] = +HEAPF64[$v2$0$i108 >> 3]; + HEAPF64[$v2$0$i108 >> 3] = $232; + $i$2$i109 = $i$2$i109 + 1 | 0; + if (($i$2$i109 | 0) == ($5 | 0)) break; else { + $v1$0$i107 = $v1$0$i107 + 8 | 0; + $v2$0$i108 = $v2$0$i108 + 8 | 0; + } + } + } + } while (($k$1$i113 | 0) != ($84 | 0)); + } + _arVecFree($82) | 0; + L104 : do if ($24) { + $237 = HEAP32[$0 >> 2] | 0; + $238 = HEAP32[$2 >> 2] | 0; + do if (!(($237 | 0) < 1 | ($238 | 0) < 1)) { + if ((HEAP32[$18 >> 2] | 0) != ($237 | 0)) break; + if ((HEAP32[$21 >> 2] | 0) != ($237 | 0)) break; + if ((HEAP32[$11 >> 2] | 0) != ($237 | 0)) break; + if ((HEAP32[$8 >> 2] | 0) != ($238 | 0)) break; + if ((HEAP32[$14 >> 2] | 0) != ($237 | 0)) break; + $251 = HEAP32[$output >> 2] | 0; + L113 : do if (($237 | 0) > 0) { + $253 = HEAP32[$ev >> 2] | 0; + $exitcond3$i59 = ($238 | 0) == 0; + $exitcond$i651 = ($237 | 0) == 0; + $i$0$i266 = 0; + $m$0$i65 = $251; + while (1) { + $259 = +HEAPF64[$253 + ($i$0$i266 << 3) >> 3]; + if ($259 < 1.0e-16) { + $i$0$i2$lcssa = $i$0$i266; + $m$0$i$lcssa = $m$0$i65; + break L113; + } + $263 = 1.0 / +Math_sqrt(+(+Math_abs(+$259))); + $264 = Math_imul($i$0$i266, $237) | 0; + if (!$exitcond3$i59) { + $j$0$i461 = 0; + $m$1$i60 = $m$0$i65; + while (1) { + if ($exitcond$i651) $sum$0$i$lcssa = 0.0; else { + $k$0$i555 = 0; + $m1$0$i54 = (HEAP32[$17 >> 2] | 0) + ($264 << 3) | 0; + $m2$0$i52 = (HEAP32[$input >> 2] | 0) + ($j$0$i461 << 3) | 0; + $sum$0$i53 = 0.0; + while (1) { + $272 = $sum$0$i53 + +HEAPF64[$m1$0$i54 >> 3] * +HEAPF64[$m2$0$i52 >> 3]; + $k$0$i555 = $k$0$i555 + 1 | 0; + if (($k$0$i555 | 0) == ($237 | 0)) { + $sum$0$i$lcssa = $272; + break; + } else { + $m1$0$i54 = $m1$0$i54 + 8 | 0; + $m2$0$i52 = $m2$0$i52 + ($238 << 3) | 0; + $sum$0$i53 = $272; + } + } + } + HEAPF64[$m$1$i60 >> 3] = $263 * $sum$0$i$lcssa; + $j$0$i461 = $j$0$i461 + 1 | 0; + if (($j$0$i461 | 0) == ($238 | 0)) break; else $m$1$i60 = $m$1$i60 + 8 | 0; + } + } + $scevgep2$i = $m$0$i65 + ($238 << 3) | 0; + $279 = $i$0$i266 + 1 | 0; + if (($279 | 0) < ($237 | 0)) { + $i$0$i266 = $279; + $m$0$i65 = $scevgep2$i; + } else { + $i$0$i2$lcssa = $279; + $m$0$i$lcssa = $scevgep2$i; + break; + } + } + } else { + $i$0$i2$lcssa = 0; + $m$0$i$lcssa = $251; + } while (0); + $smax$i = ($238 | 0) > 0 ? $238 : 0; + if (($i$0$i2$lcssa | 0) >= ($237 | 0)) break L104; + $256 = HEAP32[$ev >> 2] | 0; + $257 = ($238 | 0) > 0; + $i$1$i49 = $i$0$i2$lcssa; + $m$2$i48 = $m$0$i$lcssa; + while (1) { + HEAPF64[$256 + ($i$1$i49 << 3) >> 3] = 0.0; + if ($257) { + $j$1$i47 = 0; + $m$3$i46 = $m$2$i48; + while (1) { + HEAPF64[$m$3$i46 >> 3] = 0.0; + $j$1$i47 = $j$1$i47 + 1 | 0; + if (($j$1$i47 | 0) >= ($238 | 0)) break; else $m$3$i46 = $m$3$i46 + 8 | 0; + } + } + $i$1$i49 = $i$1$i49 + 1 | 0; + if (($i$1$i49 | 0) >= ($237 | 0)) break L104; else $m$2$i48 = $m$2$i48 + ($smax$i << 3) | 0; + } + } while (0); + _arMatrixFree($17) | 0; + $$0 = -1; + break L1; + } else { + $287 = HEAP32[$output >> 2] | 0; + $289 = ($1 | 0) > ($3 | 0) ? $3 : $1; + L137 : do if (($5 | 0) > 0) { + $292 = HEAP32[$ev >> 2] | 0; + $exitcond82 = ($289 | 0) == 0; + $i$090 = 0; + $m1$089 = HEAP32[$17 >> 2] | 0; + $m2$088 = $287; + while (1) { + if (+HEAPF64[$292 + ($i$090 << 3) >> 3] < 1.0e-16) { + $i$0$lcssa = $i$090; + $m2$0$lcssa = $m2$088; + break L137; + } + if (!$exitcond82) { + $j$085 = 0; + $m1$184 = $m1$089; + $m2$183 = $m2$088; + while (1) { + HEAPF64[$m2$183 >> 3] = +HEAPF64[$m1$184 >> 3]; + $j$085 = $j$085 + 1 | 0; + if (($j$085 | 0) == ($289 | 0)) break; else { + $m1$184 = $m1$184 + 8 | 0; + $m2$183 = $m2$183 + 8 | 0; + } + } + } + $m1$089 = $m1$089 + ($289 << 3) | 0; + $scevgep41 = $m2$088 + ($289 << 3) | 0; + $304 = $i$090 + 1 | 0; + if (($304 | 0) >= ($5 | 0)) { + $i$0$lcssa = $304; + $m2$0$lcssa = $scevgep41; + break; + } else { + $i$090 = $304; + $m2$088 = $scevgep41; + } + } + } else { + $i$0$lcssa = 0; + $m2$0$lcssa = $287; + } while (0); + $smax38 = ($289 | 0) > 0 ? $289 : 0; + if (($i$0$lcssa | 0) < ($5 | 0)) { + $295 = HEAP32[$ev >> 2] | 0; + $296 = ($5 | 0) > 0; + $i$180 = $i$0$lcssa; + $m2$279 = $m2$0$lcssa; + while (1) { + HEAPF64[$295 + ($i$180 << 3) >> 3] = 0.0; + if ($296) { + $j$175 = 0; + $m2$374 = $m2$279; + while (1) { + HEAPF64[$m2$374 >> 3] = 0.0; + $j$175 = $j$175 + 1 | 0; + if (($j$175 | 0) >= ($5 | 0)) break; else $m2$374 = $m2$374 + 8 | 0; + } + } + $i$180 = $i$180 + 1 | 0; + if (($i$180 | 0) >= ($5 | 0)) break; else $m2$279 = $m2$279 + ($smax38 << 3) | 0; + } + } + } while (0); + _arMatrixFree($17) | 0; + $$0 = 0; + break L1; + } + } while (0); + _arMatrixFree($17) | 0; + $$0 = -1; + break; + } + } + _arMatrixFree($17) | 0; + $$0 = -1; + } else $$0 = -1; + } else $$0 = -1; + } else $$0 = -1; + } while (0); + STACKTOP = sp; + return $$0 | 0; +} + +function _arDetectMarker($arHandle, $dataPtr) { + $arHandle = $arHandle | 0; + $dataPtr = $dataPtr | 0; + var $$ = 0, $$0 = 0, $$lcssa = 0, $$lcssa109 = 0.0, $$lcssa110 = 0.0, $$pr10 = 0, $$pre$phi45Z2D = 0, $$pre$phi47Z2D = 0, $$pre$phi49Z2D = 0, $$pre$phi51Z2D = 0, $$pre$phi53Z2D = 0, $$pre$phiZ2D = 0, $$pre35 = 0, $$pre37 = 0, $0 = 0, $1 = 0, $10 = 0, $101 = 0, $102 = 0, $104 = 0, $106 = 0, $115 = 0, $118 = 0, $12 = 0, $120 = 0, $121 = 0, $126 = 0, $132 = 0, $135 = 0, $14 = 0, $144 = 0, $146 = 0, $155 = 0, $157 = 0, $16 = 0, $163 = 0, $164 = 0, $187 = 0, $190 = 0, $191 = 0, $193 = 0, $195 = 0, $196 = 0, $199 = 0.0, $2 = 0, $20 = 0, $202 = 0.0, $203 = 0.0, $209 = 0.0, $21 = 0, $214 = 0.0, $217 = 0.0, $22 = 0, $222 = 0, $223 = 0, $226 = 0.0, $229 = 0, $23 = 0, $231 = 0, $235 = 0, $238 = 0.0, $24 = 0, $244 = 0.0, $247 = 0.0, $25 = 0, $26 = 0, $262 = 0, $265 = 0.0, $267 = 0, $269 = 0, $27 = 0, $28 = 0, $282 = 0, $285 = 0.0, $29 = 0, $291 = 0.0, $294 = 0.0, $296 = 0, $30 = 0, $300 = 0, $31 = 0, $313 = 0, $314 = 0, $316 = 0, $32 = 0, $324 = 0, $326 = 0, $328 = 0, $33 = 0, $330 = 0, $335 = 0, $343 = 0, $350 = 0, $351 = 0, $353 = 0, $355 = 0.0, $358 = 0.0, $359 = 0.0, $365 = 0.0, $370 = 0.0, $375 = 0, $381 = 0, $385 = 0, $386 = 0, $387 = 0, $4 = 0, $5 = 0, $69 = 0, $71 = 0, $72 = 0, $74 = 0, $75 = 0, $77 = 0, $78 = 0, $8 = 0, $80 = 0, $83 = 0, $86 = 0, $89 = 0, $9 = 0, $91 = 0, $92 = 0, $cdir$1 = 0, $cdir$1$lcssa = 0, $cdir$295 = 0, $cdir$3 = 0, $cdir$3$lcssa = 0, $cid$0$lcssa = 0, $cid$087 = 0, $cid$1 = 0, $diff$097 = 0.0, $diff$192 = 0.0, $diffmin$099 = 0.0, $diffmin$1 = 0.0, $diffmin$294 = 0.0, $i$0104 = 0, $i$1101 = 0, $i$280 = 0, $i$373 = 0, $i$467 = 0, $j$088 = 0, $j$1100 = 0, $j$296 = 0, $j$3$lcssa = 0, $j$381 = 0, $j$4 = 0, $j$5$lcssa = 0, $j$568 = 0, $j$6$lcssa = 0, $j$663 = 0, $k$098 = 0, $k$193 = 0, $marker_nums = 0, $ret1$0 = 0, $rlenmin$086 = 0.0, $rlenmin$1 = 0.0, $storemerge = 0, $storemerge11 = 0, $storemerge4 = 0, $thresholds = 0, $value = 0, $vararg_buffer = 0, $vararg_buffer6 = 0, $vararg_buffer9 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 80 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer9 = sp + 32 | 0; + $vararg_buffer6 = sp + 24 | 0; + $vararg_buffer = sp; + $thresholds = sp + 52 | 0; + $marker_nums = sp + 40 | 0; + $value = sp + 64 | 0; + $0 = $arHandle + 44 | 0; + HEAP32[$0 >> 2] = 0; + $1 = $arHandle + 7062388 | 0; + $2 = HEAP32[$1 >> 2] | 0; + L1 : do if (($2 | 0) == 4) { + $4 = $arHandle + 7062396 | 0; + $5 = HEAP32[$4 >> 2] | 0; + do if (($5 | 0) > 0) { + $$pr10 = 4; + $storemerge11 = $5 + -1 | 0; + } else { + $8 = $arHandle + 16 | 0; + $9 = HEAP32[$8 >> 2] | 0; + $10 = $arHandle + 7062400 | 0; + $12 = (HEAP32[$10 >> 2] | 0) + $9 | 0; + $$ = ($12 | 0) > 255 ? 255 : $12; + HEAP32[$thresholds >> 2] = $$; + $14 = $arHandle + 7062404 | 0; + $16 = $9 - (HEAP32[$14 >> 2] | 0) | 0; + $storemerge4 = ($16 | 0) < 0 ? 0 : $16; + HEAP32[$thresholds + 4 >> 2] = $storemerge4; + HEAP32[$thresholds + 8 >> 2] = $9; + $20 = $arHandle + 36 | 0; + $21 = $arHandle + 40 | 0; + $22 = $arHandle + 4 | 0; + $23 = $arHandle + 12 | 0; + $24 = $arHandle + 20 | 0; + $25 = $arHandle + 4834144 | 0; + $26 = $arHandle + 15416 | 0; + $27 = $arHandle + 15408 | 0; + $28 = $arHandle + 7062384 | 0; + $29 = $arHandle + 24 | 0; + $30 = $arHandle + 32 | 0; + $31 = $arHandle + 7062416 | 0; + $32 = $arHandle + 48 | 0; + $33 = $arHandle + 7062424 | 0; + $i$0104 = 0; + do { + if ((_arLabeling($dataPtr, HEAP32[$20 >> 2] | 0, HEAP32[$21 >> 2] | 0, HEAP32[$22 >> 2] | 0, HEAP32[$arHandle >> 2] | 0, HEAP32[$23 >> 2] | 0, HEAP32[$thresholds + ($i$0104 << 2) >> 2] | 0, HEAP32[$24 >> 2] | 0, $25, 0) | 0) < 0) { + $$0 = -1; + break L1; + } + if ((_arDetectMarker2(HEAP32[$20 >> 2] | 0, HEAP32[$21 >> 2] | 0, $25, HEAP32[$24 >> 2] | 0, 1e6, 70, 1.0, $26, $27) | 0) < 0) { + $$0 = -1; + break L1; + } + if ((_arGetMarkerInfo($dataPtr, HEAP32[$20 >> 2] | 0, HEAP32[$21 >> 2] | 0, HEAP32[$22 >> 2] | 0, $26, HEAP32[$27 >> 2] | 0, HEAP32[$28 >> 2] | 0, HEAP32[$24 >> 2] | 0, HEAP32[$29 >> 2] | 0, (HEAP32[$30 >> 2] | 0) + 184 | 0, +HEAPF64[$31 >> 3], $32, $0, HEAP32[$33 >> 2] | 0) | 0) < 0) { + $$0 = -1; + break L1; + } + HEAP32[$marker_nums + ($i$0104 << 2) >> 2] = HEAP32[$0 >> 2]; + $i$0104 = $i$0104 + 1 | 0; + } while (($i$0104 | 0) < 3); + if ((HEAP32[$arHandle >> 2] | 0) == 1) { + $69 = HEAP32[$marker_nums + 4 >> 2] | 0; + $71 = HEAP32[$marker_nums + 8 >> 2] | 0; + $72 = HEAP32[$marker_nums >> 2] | 0; + HEAP32[$vararg_buffer >> 2] = $storemerge4; + HEAP32[$vararg_buffer + 4 >> 2] = $69; + HEAP32[$vararg_buffer + 8 >> 2] = $9; + HEAP32[$vararg_buffer + 12 >> 2] = $71; + HEAP32[$vararg_buffer + 16 >> 2] = $$; + HEAP32[$vararg_buffer + 20 >> 2] = $72; + _arLog(3, 4153, $vararg_buffer); + $74 = $72; + $75 = $71; + } else { + $74 = HEAP32[$marker_nums >> 2] | 0; + $75 = HEAP32[$marker_nums + 8 >> 2] | 0; + } + $$pre35 = HEAP32[$marker_nums + 4 >> 2] | 0; + if (($74 | 0) > ($75 | 0) | ($$pre35 | 0) > ($75 | 0)) { + $91 = ($74 | 0) >= ($$pre35 | 0) ? $$ : $storemerge4; + HEAP32[$8 >> 2] = $91; + $92 = $91 - $9 | 0; + if (($92 | 0) > 0) { + HEAP32[$10 >> 2] = $92; + $storemerge = 1; + } else { + HEAP32[$10 >> 2] = 1; + $storemerge = 0 - $92 | 0; + } + HEAP32[$14 >> 2] = $storemerge; + if ((HEAP32[$arHandle >> 2] | 0) == 1) { + HEAP32[$vararg_buffer6 >> 2] = $91; + _arLog(3, 4229, $vararg_buffer6); + } + $$pr10 = HEAP32[$1 >> 2] | 0; + $storemerge11 = HEAP32[$arHandle + 7062392 >> 2] | 0; + break; + } + $77 = HEAP32[$10 >> 2] | 0; + $78 = HEAP32[$14 >> 2] | 0; + do if (($77 | 0) < ($78 | 0)) { + $80 = $77 + 1 | 0; + HEAP32[$10 >> 2] = $80; + $86 = $80; + } else if (($77 | 0) > ($78 | 0)) { + HEAP32[$14 >> 2] = $78 + 1; + $86 = $77; + break; + } else { + $83 = $77 + 1 | 0; + HEAP32[$10 >> 2] = $83; + HEAP32[$14 >> 2] = $78 + 1; + $86 = $83; + break; + } while (0); + if (($86 + $9 | 0) > 254) { + HEAP32[$10 >> 2] = 1; + $89 = 1; + } else $89 = $86; + if (($9 | 0) <= ($89 | 0)) HEAP32[$14 >> 2] = 1; + HEAP32[$4 >> 2] = HEAP32[$arHandle + 7062392 >> 2]; + label = 47; + break L1; + } while (0); + HEAP32[$4 >> 2] = $storemerge11; + $101 = $$pr10; + label = 30; + } else { + $101 = $2; + label = 30; + } while (0); + L40 : do if ((label | 0) == 30) { + L42 : do switch ($101 | 0) { + case 3: + { + $102 = $arHandle + 7062408 | 0; + $104 = _arImageProcLumaHistAndBoxFilterWithBias(HEAP32[$102 >> 2] | 0, $dataPtr, 9, -7) | 0; + if (($104 | 0) < 0) { + $$0 = $104; + break L40; + } + $106 = HEAP32[$102 >> 2] | 0; + $115 = $arHandle + 4834144 | 0; + $118 = _arLabeling(HEAP32[$106 >> 2] | 0, HEAP32[$106 + 8 >> 2] | 0, HEAP32[$106 + 12 >> 2] | 0, 5, HEAP32[$arHandle >> 2] | 0, HEAP32[$arHandle + 12 >> 2] | 0, 0, 0, $115, HEAP32[$106 + 4 >> 2] | 0) | 0; + if (($118 | 0) < 0) { + $$0 = $118; + break L40; + } + $$pre$phi45Z2D = $arHandle + 36 | 0; + $$pre$phi47Z2D = $arHandle + 40 | 0; + $$pre$phi49Z2D = $arHandle + 20 | 0; + $$pre$phiZ2D = $115; + break; + } + case 2: + case 1: + { + $120 = $arHandle + 7062396 | 0; + $121 = HEAP32[$120 >> 2] | 0; + if (($121 | 0) > 0) { + HEAP32[$120 >> 2] = $121 + -1; + label = 44; + break L42; + } + $126 = HEAP32[$arHandle + 7062408 >> 2] | 0; + if (($101 | 0) == 1) $ret1$0 = _arImageProcLumaHistAndCDFAndMedian($126, $dataPtr, $value) | 0; else $ret1$0 = _arImageProcLumaHistAndOtsu($126, $dataPtr, $value) | 0; + if (($ret1$0 | 0) < 0) { + $$0 = $ret1$0; + break L40; + } + $132 = $arHandle + 16 | 0; + if ((HEAP32[$arHandle >> 2] | 0) == 1) { + $135 = HEAPU8[$value >> 0] | 0; + if ((HEAP32[$132 >> 2] | 0) != ($135 | 0)) { + HEAP32[$vararg_buffer9 >> 2] = (HEAP32[$1 >> 2] | 0) == 1 ? 4281 : 4288; + HEAP32[$vararg_buffer9 + 4 >> 2] = $135; + _arLog(3, 4293, $vararg_buffer9); + } + } + HEAP32[$132 >> 2] = HEAPU8[$value >> 0]; + HEAP32[$120 >> 2] = HEAP32[$arHandle + 7062392 >> 2]; + label = 44; + break; + } + default: + label = 44; + } while (0); + if ((label | 0) == 44) { + $144 = $arHandle + 36 | 0; + $146 = $arHandle + 40 | 0; + $155 = $arHandle + 20 | 0; + $157 = $arHandle + 4834144 | 0; + if ((_arLabeling($dataPtr, HEAP32[$144 >> 2] | 0, HEAP32[$146 >> 2] | 0, HEAP32[$arHandle + 4 >> 2] | 0, HEAP32[$arHandle >> 2] | 0, HEAP32[$arHandle + 12 >> 2] | 0, HEAP32[$arHandle + 16 >> 2] | 0, HEAP32[$155 >> 2] | 0, $157, 0) | 0) < 0) { + $$0 = -1; + break; + } else { + $$pre$phi45Z2D = $144; + $$pre$phi47Z2D = $146; + $$pre$phi49Z2D = $155; + $$pre$phiZ2D = $157; + } + } + $163 = $arHandle + 15416 | 0; + $164 = $arHandle + 15408 | 0; + if ((_arDetectMarker2(HEAP32[$$pre$phi45Z2D >> 2] | 0, HEAP32[$$pre$phi47Z2D >> 2] | 0, $$pre$phiZ2D, HEAP32[$$pre$phi49Z2D >> 2] | 0, 1e6, 70, 1.0, $163, $164) | 0) < 0) $$0 = -1; else if ((_arGetMarkerInfo($dataPtr, HEAP32[$$pre$phi45Z2D >> 2] | 0, HEAP32[$$pre$phi47Z2D >> 2] | 0, HEAP32[$arHandle + 4 >> 2] | 0, $163, HEAP32[$164 >> 2] | 0, HEAP32[$arHandle + 7062384 >> 2] | 0, HEAP32[$$pre$phi49Z2D >> 2] | 0, HEAP32[$arHandle + 24 >> 2] | 0, (HEAP32[$arHandle + 32 >> 2] | 0) + 184 | 0, +HEAPF64[$arHandle + 7062416 >> 3], $arHandle + 48 | 0, $0, HEAP32[$arHandle + 7062424 >> 2] | 0) | 0) < 0) $$0 = -1; else label = 47; + } while (0); + L63 : do if ((label | 0) == 47) { + $187 = $arHandle + 28 | 0; + if ((HEAP32[$187 >> 2] | 0) == 1) { + _confidenceCutoff($arHandle); + $$0 = 0; + break; + } + $190 = $arHandle + 4818296 | 0; + $191 = $arHandle + 24 | 0; + $$pre37 = HEAP32[$190 >> 2] | 0; + if (($$pre37 | 0) > 0) { + $i$1101 = 0; + do { + $193 = HEAP32[$0 >> 2] | 0; + $195 = $arHandle + 4818304 + ($i$1101 * 264 | 0) + 56 | 0; + $196 = $arHandle + 4818304 + ($i$1101 * 264 | 0) + 64 | 0; + if (($193 | 0) > 0) { + $199 = +(HEAP32[$arHandle + 4818304 + ($i$1101 * 264 | 0) >> 2] | 0); + $cid$087 = -1; + $j$088 = 0; + $rlenmin$086 = .5; + while (1) { + $202 = +(HEAP32[$arHandle + 48 + ($j$088 << 8) >> 2] | 0); + $203 = $199 / $202; + if ($203 < .7 | $203 > 1.43) { + $cid$1 = $cid$087; + $rlenmin$1 = $rlenmin$086; + } else { + $209 = +HEAPF64[$arHandle + 48 + ($j$088 << 8) + 56 >> 3] - +HEAPF64[$195 >> 3]; + $214 = +HEAPF64[$arHandle + 48 + ($j$088 << 8) + 64 >> 3] - +HEAPF64[$196 >> 3]; + $217 = ($209 * $209 + $214 * $214) / $202; + if ($217 < $rlenmin$086) { + $cid$1 = $j$088; + $rlenmin$1 = $217; + } else { + $cid$1 = $cid$087; + $rlenmin$1 = $rlenmin$086; + } + } + $j$088 = $j$088 + 1 | 0; + if (($j$088 | 0) >= ($193 | 0)) { + $cid$0$lcssa = $cid$1; + break; + } else { + $cid$087 = $cid$1; + $rlenmin$086 = $rlenmin$1; + } + } + } else $cid$0$lcssa = -1; + L80 : do if (($cid$0$lcssa | 0) > -1) { + $222 = HEAP32[$191 >> 2] | 0; + switch ($222 | 0) { + case 2: + case 1: + case 0: + break; + case 4: + case 3: + { + $262 = $arHandle + 48 + ($cid$0$lcssa << 8) + 40 | 0; + $265 = +HEAPF64[$arHandle + 4818304 + ($i$1101 * 264 | 0) + 40 >> 3]; + if (+HEAPF64[$262 >> 3] < $265) { + $$pre$phi51Z2D = $arHandle + 4818304 + ($i$1101 * 264 | 0) + 48 | 0; + $$pre$phi53Z2D = $arHandle + 48 + ($cid$0$lcssa << 8) + 48 | 0; + } else { + $267 = $arHandle + 48 + ($cid$0$lcssa << 8) + 48 | 0; + $269 = $arHandle + 4818304 + ($i$1101 * 264 | 0) + 48 | 0; + if (+HEAPF64[$267 >> 3] < +HEAPF64[$269 >> 3]) { + $$pre$phi51Z2D = $269; + $$pre$phi53Z2D = $267; + } else break L80; + } + HEAPF64[$262 >> 3] = $265; + HEAP32[$arHandle + 48 + ($cid$0$lcssa << 8) + 8 >> 2] = HEAP32[$arHandle + 4818304 + ($i$1101 * 264 | 0) + 8 >> 2]; + HEAPF64[$$pre$phi53Z2D >> 3] = +HEAPF64[$$pre$phi51Z2D >> 3]; + HEAP32[$arHandle + 48 + ($cid$0$lcssa << 8) + 12 >> 2] = HEAP32[$arHandle + 4818304 + ($i$1101 * 264 | 0) + 12 >> 2]; + $cdir$295 = -1; + $diffmin$294 = 1.0e8; + $j$296 = 0; + while (1) { + $diff$192 = 0.0; + $k$193 = 0; + while (1) { + $282 = ($k$193 + $j$296 | 0) % 4 | 0; + $285 = +HEAPF64[$arHandle + 4818304 + ($i$1101 * 264 | 0) + 168 + ($k$193 << 4) >> 3] - +HEAPF64[$arHandle + 48 + ($cid$0$lcssa << 8) + 168 + ($282 << 4) >> 3]; + $291 = +HEAPF64[$arHandle + 4818304 + ($i$1101 * 264 | 0) + 168 + ($k$193 << 4) + 8 >> 3] - +HEAPF64[$arHandle + 48 + ($cid$0$lcssa << 8) + 168 + ($282 << 4) + 8 >> 3]; + $294 = $diff$192 + ($285 * $285 + $291 * $291); + $k$193 = $k$193 + 1 | 0; + if (($k$193 | 0) == 4) { + $$lcssa109 = $294; + break; + } else $diff$192 = $294; + } + $296 = $$lcssa109 < $diffmin$294; + $cdir$3 = $296 ? $j$296 : $cdir$295; + $j$296 = $j$296 + 1 | 0; + if (($j$296 | 0) == 4) { + $cdir$3$lcssa = $cdir$3; + break; + } else { + $cdir$295 = $cdir$3; + $diffmin$294 = $296 ? $$lcssa109 : $diffmin$294; + } + } + $300 = 4 - $cdir$3$lcssa | 0; + HEAP32[$arHandle + 48 + ($cid$0$lcssa << 8) + 20 >> 2] = ($300 + (HEAP32[$arHandle + 4818304 + ($i$1101 * 264 | 0) + 20 >> 2] | 0) | 0) % 4 | 0; + HEAP32[$arHandle + 48 + ($cid$0$lcssa << 8) + 24 >> 2] = ($300 + (HEAP32[$arHandle + 4818304 + ($i$1101 * 264 | 0) + 24 >> 2] | 0) | 0) % 4 | 0; + break L80; + break; + } + default: + { + $$0 = -1; + break L63; + } + } + $223 = $arHandle + 48 + ($cid$0$lcssa << 8) + 32 | 0; + $226 = +HEAPF64[$arHandle + 4818304 + ($i$1101 * 264 | 0) + 32 >> 3]; + if (+HEAPF64[$223 >> 3] < $226) { + HEAPF64[$223 >> 3] = $226; + $229 = HEAP32[$arHandle + 4818304 + ($i$1101 * 264 | 0) + 4 >> 2] | 0; + HEAP32[$arHandle + 48 + ($cid$0$lcssa << 8) + 4 >> 2] = $229; + $231 = $arHandle + 4818304 + ($i$1101 * 264 | 0) + 16 | 0; + $385 = -1; + $diffmin$099 = 1.0e8; + $j$1100 = 0; + while (1) { + $diff$097 = 0.0; + $k$098 = 0; + while (1) { + $235 = ($k$098 + $j$1100 | 0) % 4 | 0; + $238 = +HEAPF64[$arHandle + 4818304 + ($i$1101 * 264 | 0) + 168 + ($k$098 << 4) >> 3] - +HEAPF64[$arHandle + 48 + ($cid$0$lcssa << 8) + 168 + ($235 << 4) >> 3]; + $244 = +HEAPF64[$arHandle + 4818304 + ($i$1101 * 264 | 0) + 168 + ($k$098 << 4) + 8 >> 3] - +HEAPF64[$arHandle + 48 + ($cid$0$lcssa << 8) + 168 + ($235 << 4) + 8 >> 3]; + $247 = $diff$097 + ($238 * $238 + $244 * $244); + $k$098 = $k$098 + 1 | 0; + if (($k$098 | 0) == 4) { + $$lcssa110 = $247; + break; + } else $diff$097 = $247; + } + if ($$lcssa110 < $diffmin$099) { + $cdir$1 = (4 - $j$1100 + (HEAP32[$231 >> 2] | 0) | 0) % 4 | 0; + $diffmin$1 = $$lcssa110; + } else { + $cdir$1 = $385; + $diffmin$1 = $diffmin$099; + } + $j$1100 = $j$1100 + 1 | 0; + if (($j$1100 | 0) == 4) { + $cdir$1$lcssa = $cdir$1; + break; + } else { + $385 = $cdir$1; + $diffmin$099 = $diffmin$1; + } + } + HEAP32[$arHandle + 48 + ($cid$0$lcssa << 8) + 16 >> 2] = $cdir$1$lcssa; + if ($222 >>> 0 < 2) { + HEAP32[$arHandle + 48 + ($cid$0$lcssa << 8) + 8 >> 2] = $229; + HEAPF64[$arHandle + 48 + ($cid$0$lcssa << 8) + 40 >> 3] = $226; + HEAP32[$arHandle + 48 + ($cid$0$lcssa << 8) + 20 >> 2] = $cdir$1$lcssa; + break; + } else { + HEAP32[$arHandle + 48 + ($cid$0$lcssa << 8) + 12 >> 2] = $229; + HEAPF64[$arHandle + 48 + ($cid$0$lcssa << 8) + 48 >> 3] = $226; + HEAP32[$arHandle + 48 + ($cid$0$lcssa << 8) + 24 >> 2] = $cdir$1$lcssa; + break; + } + } + } while (0); + $i$1101 = $i$1101 + 1 | 0; + } while (($i$1101 | 0) < ($$pre37 | 0)); + } + _confidenceCutoff($arHandle); + if ((HEAP32[$190 >> 2] | 0) > 0) { + $i$280 = 0; + $j$381 = 0; + while (1) { + $313 = $arHandle + 4818304 + ($i$280 * 264 | 0) | 0; + $314 = $arHandle + 4818304 + ($i$280 * 264 | 0) + 256 | 0; + $316 = (HEAP32[$314 >> 2] | 0) + 1 | 0; + HEAP32[$314 >> 2] = $316; + if (($316 | 0) < 4) { + if (($i$280 | 0) != ($j$381 | 0)) _memcpy($arHandle + 4818304 + ($j$381 * 264 | 0) | 0, $313 | 0, 264) | 0; + $j$4 = $j$381 + 1 | 0; + } else $j$4 = $j$381; + $i$280 = $i$280 + 1 | 0; + if (($i$280 | 0) >= (HEAP32[$190 >> 2] | 0)) { + $j$3$lcssa = $j$4; + break; + } else $j$381 = $j$4; + } + } else $j$3$lcssa = 0; + HEAP32[$190 >> 2] = $j$3$lcssa; + $324 = HEAP32[$0 >> 2] | 0; + L120 : do if (($324 | 0) > 0) { + $386 = $324; + $i$373 = 0; + while (1) { + $326 = $arHandle + 48 + ($i$373 << 8) | 0; + $328 = HEAP32[$arHandle + 48 + ($i$373 << 8) + 4 >> 2] | 0; + if (($328 | 0) >= 0) { + $330 = HEAP32[$190 >> 2] | 0; + L125 : do if (($330 | 0) > 0) { + $j$568 = 0; + while (1) { + if ((HEAP32[$arHandle + 4818304 + ($j$568 * 264 | 0) + 4 >> 2] | 0) == ($328 | 0)) { + $j$5$lcssa = $j$568; + break L125; + } + $335 = $j$568 + 1 | 0; + if (($335 | 0) < ($330 | 0)) $j$568 = $335; else { + $j$5$lcssa = $335; + break; + } + } + } else $j$5$lcssa = 0; while (0); + if (($j$5$lcssa | 0) == ($330 | 0)) { + if (($330 | 0) == 60) { + $$lcssa = $386; + break L120; + } + HEAP32[$190 >> 2] = $330 + 1; + } + _memcpy($arHandle + 4818304 + ($j$5$lcssa * 264 | 0) | 0, $326 | 0, 256) | 0; + HEAP32[$arHandle + 4818304 + ($j$5$lcssa * 264 | 0) + 256 >> 2] = 1; + } + $i$373 = $i$373 + 1 | 0; + $343 = HEAP32[$0 >> 2] | 0; + if (($i$373 | 0) >= ($343 | 0)) { + $$lcssa = $343; + break; + } else $386 = $343; + } + } else $$lcssa = $324; while (0); + if ((HEAP32[$187 >> 2] | 0) == 2) $$0 = 0; else if ((HEAP32[$190 >> 2] | 0) > 0) { + $353 = $$lcssa; + $i$467 = 0; + while (1) { + $350 = $arHandle + 4818304 + ($i$467 * 264 | 0) + 56 | 0; + $351 = $arHandle + 4818304 + ($i$467 * 264 | 0) + 64 | 0; + L139 : do if (($353 | 0) > 0) { + $355 = +(HEAP32[$arHandle + 4818304 + ($i$467 * 264 | 0) >> 2] | 0); + $j$663 = 0; + while (1) { + $358 = +(HEAP32[$arHandle + 48 + ($j$663 << 8) >> 2] | 0); + $359 = $355 / $358; + if (!($359 < .7 | $359 > 1.43)) { + $365 = +HEAPF64[$arHandle + 48 + ($j$663 << 8) + 56 >> 3] - +HEAPF64[$350 >> 3]; + $370 = +HEAPF64[$arHandle + 48 + ($j$663 << 8) + 64 >> 3] - +HEAPF64[$351 >> 3]; + if (($365 * $365 + $370 * $370) / $358 < .5) { + $j$6$lcssa = $j$663; + break L139; + } + } + $375 = $j$663 + 1 | 0; + if (($375 | 0) < ($353 | 0)) $j$663 = $375; else { + $j$6$lcssa = $375; + break; + } + } + } else $j$6$lcssa = 0; while (0); + if (($j$6$lcssa | 0) == ($353 | 0)) { + _memcpy($arHandle + 48 + ($353 << 8) | 0, $arHandle + 4818304 + ($i$467 * 264 | 0) | 0, 256) | 0; + $381 = (HEAP32[$0 >> 2] | 0) + 1 | 0; + HEAP32[$0 >> 2] = $381; + $387 = $381; + } else $387 = $353; + $i$467 = $i$467 + 1 | 0; + if (($i$467 | 0) >= (HEAP32[$190 >> 2] | 0)) { + $$0 = 0; + break; + } else $353 = $387; + } + } else $$0 = 0; + } while (0); + STACKTOP = sp; + return $$0 | 0; +} + +function __ZN10__cxxabiv112_GLOBAL__N_121parse_unresolved_nameINS0_2DbEEEPKcS4_S4_RT_($first, $last, $db) { + $first = $first | 0; + $last = $last | 0; + $db = $db | 0; + var $$19 = 0, $$pre = 0, $$pre$phi80Z2D = 0, $$pre$phi82Z2D = 0, $$pre$phi84Z2D = 0, $0 = 0, $1 = 0, $107 = 0, $108 = 0, $111 = 0, $113 = 0, $114 = 0, $115 = 0, $117 = 0, $125 = 0, $126 = 0, $127 = 0, $128 = 0, $13 = 0, $130 = 0, $134 = 0, $136 = 0, $146 = 0, $148 = 0, $15 = 0, $150 = 0, $151 = 0, $159 = 0, $160 = 0, $161 = 0, $162 = 0, $165 = 0, $167 = 0, $177 = 0, $180 = 0, $181 = 0, $183 = 0, $184 = 0, $185 = 0, $187 = 0, $188 = 0, $19 = 0, $196 = 0, $197 = 0, $198 = 0, $199 = 0, $2 = 0, $201 = 0, $205 = 0, $207 = 0, $217 = 0, $221 = 0, $222 = 0, $225 = 0, $226 = 0, $227 = 0, $230 = 0, $233 = 0, $241 = 0, $242 = 0, $243 = 0, $244 = 0, $246 = 0, $250 = 0, $252 = 0, $261 = 0, $262 = 0, $265 = 0, $267 = 0, $268 = 0, $269 = 0, $271 = 0, $279 = 0, $280 = 0, $281 = 0, $282 = 0, $284 = 0, $288 = 0, $290 = 0, $3 = 0, $30 = 0, $33 = 0, $34 = 0, $37 = 0, $39 = 0, $4 = 0, $47 = 0, $48 = 0, $49 = 0, $5 = 0, $50 = 0, $53 = 0, $55 = 0, $66 = 0, $67 = 0, $68 = 0, $69 = 0, $71 = 0, $72 = 0, $73 = 0, $76 = 0, $79 = 0, $87 = 0, $88 = 0, $89 = 0, $90 = 0, $92 = 0, $96 = 0, $98 = 0, $args = 0, $args3 = 0, $global$0$off0 = 0, $s = 0, $s1 = 0, $s4 = 0, $s5 = 0, $s6 = 0, $t$0 = 0, $t$1$lcssa = 0, $t$1$ph = 0, $t$1107 = 0, $t$2 = 0, $t$3$lcssa = 0, $t$3110 = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 144 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $args = sp + 132 | 0; + $s = sp + 120 | 0; + $0 = sp + 108 | 0; + $s1 = sp + 96 | 0; + $1 = sp + 84 | 0; + $args3 = sp + 72 | 0; + $s4 = sp + 60 | 0; + $2 = sp + 48 | 0; + $s5 = sp + 36 | 0; + $3 = sp + 24 | 0; + $s6 = sp + 12 | 0; + $4 = sp; + $5 = $last; + L1 : do if (($5 - $first | 0) > 2) { + if ((HEAP8[$first >> 0] | 0) == 103) { + $13 = (HEAP8[$first + 1 >> 0] | 0) == 115; + $global$0$off0 = $13; + $t$0 = $13 ? $first + 2 | 0 : $first; + } else { + $global$0$off0 = 0; + $t$0 = $first; + } + $15 = __ZN10__cxxabiv112_GLOBAL__N_126parse_base_unresolved_nameINS0_2DbEEEPKcS4_S4_RT_($t$0, $last, $db) | 0; + if (($15 | 0) != ($t$0 | 0)) { + if (!$global$0$off0) { + $$19 = $15; + break; + } + $19 = HEAP32[$db + 4 >> 2] | 0; + if ((HEAP32[$db >> 2] | 0) == ($19 | 0)) { + $$19 = $first; + break; + } + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc($19 + -24 | 0, 0, 12902) | 0; + $$19 = $15; + break; + } + if (($5 - $t$0 | 0) > 2) if ((HEAP8[$t$0 >> 0] | 0) == 115) if ((HEAP8[$t$0 + 1 >> 0] | 0) == 114) { + $30 = $t$0 + 2 | 0; + if ((HEAP8[$30 >> 0] | 0) == 78) { + $33 = $t$0 + 3 | 0; + $34 = __ZN10__cxxabiv112_GLOBAL__N_121parse_unresolved_typeINS0_2DbEEEPKcS4_S4_RT_($33, $last, $db) | 0; + if (($34 | 0) == ($33 | 0) | ($34 | 0) == ($last | 0)) { + $$19 = $first; + break; + } + $37 = __ZN10__cxxabiv112_GLOBAL__N_119parse_template_argsINS0_2DbEEEPKcS4_S4_RT_($34, $last, $db) | 0; + $$pre = $db + 4 | 0; + do if (($37 | 0) == ($34 | 0)) { + $$pre$phi80Z2D = $db; + $t$1$ph = $34; + } else { + $39 = HEAP32[$$pre >> 2] | 0; + if ((($39 - (HEAP32[$db >> 2] | 0) | 0) / 24 | 0) >>> 0 < 2) { + $$19 = $first; + break L1; + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($args, $39 + -24 | 0); + $47 = HEAP32[$$pre >> 2] | 0; + $48 = $47 + -24 | 0; + $50 = $47; + do { + $49 = $50 + -24 | 0; + HEAP32[$$pre >> 2] = $49; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($49); + $50 = HEAP32[$$pre >> 2] | 0; + } while (($50 | 0) != ($48 | 0)); + $53 = HEAP8[$args >> 0] | 0; + $55 = ($53 & 1) == 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($47 + -48 | 0, $55 ? $args + 1 | 0 : HEAP32[$args + 8 >> 2] | 0, $55 ? ($53 & 255) >>> 1 : HEAP32[$args + 4 >> 2] | 0) | 0; + if (($37 | 0) != ($last | 0)) { + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($args); + $$pre$phi80Z2D = $db; + $t$1$ph = $37; + break; + } + $66 = HEAP32[$$pre >> 2] | 0; + $67 = $66 + -24 | 0; + $69 = $66; + do { + $68 = $69 + -24 | 0; + HEAP32[$$pre >> 2] = $68; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($68); + $69 = HEAP32[$$pre >> 2] | 0; + } while (($69 | 0) != ($67 | 0)); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($args); + $$19 = $first; + break L1; + } while (0); + $71 = $0 + 8 | 0; + $72 = $0 + 1 | 0; + $73 = $0 + 4 | 0; + if ((HEAP8[$t$1$ph >> 0] | 0) == 69) $t$1$lcssa = $t$1$ph; else { + $t$1107 = $t$1$ph; + while (1) { + $76 = __ZN10__cxxabiv112_GLOBAL__N_115parse_simple_idINS0_2DbEEEPKcS4_S4_RT_($t$1107, $last, $db) | 0; + if (($76 | 0) == ($t$1107 | 0) | ($76 | 0) == ($last | 0)) { + $$19 = $first; + break L1; + } + $79 = HEAP32[$$pre >> 2] | 0; + if ((($79 - (HEAP32[$$pre$phi80Z2D >> 2] | 0) | 0) / 24 | 0) >>> 0 < 2) { + $$19 = $first; + break L1; + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($s, $79 + -24 | 0); + $87 = HEAP32[$$pre >> 2] | 0; + $88 = $87 + -24 | 0; + $90 = $87; + do { + $89 = $90 + -24 | 0; + HEAP32[$$pre >> 2] = $89; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($89); + $90 = HEAP32[$$pre >> 2] | 0; + } while (($90 | 0) != ($88 | 0)); + $92 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc($s, 0, 12902) | 0; + HEAP32[$0 >> 2] = HEAP32[$92 >> 2]; + HEAP32[$0 + 4 >> 2] = HEAP32[$92 + 4 >> 2]; + HEAP32[$0 + 8 >> 2] = HEAP32[$92 + 8 >> 2]; + HEAP32[$92 >> 2] = 0; + HEAP32[$92 + 4 >> 2] = 0; + HEAP32[$92 + 8 >> 2] = 0; + $96 = HEAP8[$0 >> 0] | 0; + $98 = ($96 & 1) == 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($87 + -48 | 0, $98 ? $72 : HEAP32[$71 >> 2] | 0, $98 ? ($96 & 255) >>> 1 : HEAP32[$73 >> 2] | 0) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($0); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($s); + if ((HEAP8[$76 >> 0] | 0) == 69) { + $t$1$lcssa = $76; + break; + } else $t$1107 = $76; + } + } + $107 = $t$1$lcssa + 1 | 0; + $108 = __ZN10__cxxabiv112_GLOBAL__N_126parse_base_unresolved_nameINS0_2DbEEEPKcS4_S4_RT_($107, $last, $db) | 0; + if (($108 | 0) == ($107 | 0)) { + $111 = HEAP32[$$pre >> 2] | 0; + if ((HEAP32[$$pre$phi80Z2D >> 2] | 0) == ($111 | 0)) { + $$19 = $first; + break; + } + $113 = $111 + -24 | 0; + $115 = $111; + while (1) { + $114 = $115 + -24 | 0; + HEAP32[$$pre >> 2] = $114; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($114); + $115 = HEAP32[$$pre >> 2] | 0; + if (($115 | 0) == ($113 | 0)) { + $$19 = $first; + break L1; + } + } + } + $117 = HEAP32[$$pre >> 2] | 0; + if ((($117 - (HEAP32[$$pre$phi80Z2D >> 2] | 0) | 0) / 24 | 0) >>> 0 < 2) { + $$19 = $first; + break; + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($s1, $117 + -24 | 0); + $125 = HEAP32[$$pre >> 2] | 0; + $126 = $125 + -24 | 0; + $128 = $125; + do { + $127 = $128 + -24 | 0; + HEAP32[$$pre >> 2] = $127; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($127); + $128 = HEAP32[$$pre >> 2] | 0; + } while (($128 | 0) != ($126 | 0)); + $130 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc($s1, 0, 12902) | 0; + HEAP32[$1 >> 2] = HEAP32[$130 >> 2]; + HEAP32[$1 + 4 >> 2] = HEAP32[$130 + 4 >> 2]; + HEAP32[$1 + 8 >> 2] = HEAP32[$130 + 8 >> 2]; + HEAP32[$130 >> 2] = 0; + HEAP32[$130 + 4 >> 2] = 0; + HEAP32[$130 + 8 >> 2] = 0; + $134 = HEAP8[$1 >> 0] | 0; + $136 = ($134 & 1) == 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($125 + -48 | 0, $136 ? $1 + 1 | 0 : HEAP32[$1 + 8 >> 2] | 0, $136 ? ($134 & 255) >>> 1 : HEAP32[$1 + 4 >> 2] | 0) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($1); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($s1); + $$19 = $108; + break; + } + $146 = __ZN10__cxxabiv112_GLOBAL__N_121parse_unresolved_typeINS0_2DbEEEPKcS4_S4_RT_($30, $last, $db) | 0; + if (($146 | 0) != ($30 | 0)) { + $148 = __ZN10__cxxabiv112_GLOBAL__N_119parse_template_argsINS0_2DbEEEPKcS4_S4_RT_($146, $last, $db) | 0; + if (($148 | 0) == ($146 | 0)) $t$2 = $146; else { + $150 = $db + 4 | 0; + $151 = HEAP32[$150 >> 2] | 0; + if ((($151 - (HEAP32[$db >> 2] | 0) | 0) / 24 | 0) >>> 0 < 2) { + $$19 = $first; + break; + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($args3, $151 + -24 | 0); + $159 = HEAP32[$150 >> 2] | 0; + $160 = $159 + -24 | 0; + $162 = $159; + do { + $161 = $162 + -24 | 0; + HEAP32[$150 >> 2] = $161; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($161); + $162 = HEAP32[$150 >> 2] | 0; + } while (($162 | 0) != ($160 | 0)); + $165 = HEAP8[$args3 >> 0] | 0; + $167 = ($165 & 1) == 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($159 + -48 | 0, $167 ? $args3 + 1 | 0 : HEAP32[$args3 + 8 >> 2] | 0, $167 ? ($165 & 255) >>> 1 : HEAP32[$args3 + 4 >> 2] | 0) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($args3); + $t$2 = $148; + } + $177 = __ZN10__cxxabiv112_GLOBAL__N_126parse_base_unresolved_nameINS0_2DbEEEPKcS4_S4_RT_($t$2, $last, $db) | 0; + if (($177 | 0) == ($t$2 | 0)) { + $180 = $db + 4 | 0; + $181 = HEAP32[$180 >> 2] | 0; + if ((HEAP32[$db >> 2] | 0) == ($181 | 0)) { + $$19 = $first; + break; + } + $183 = $181 + -24 | 0; + $185 = $181; + while (1) { + $184 = $185 + -24 | 0; + HEAP32[$180 >> 2] = $184; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($184); + $185 = HEAP32[$180 >> 2] | 0; + if (($185 | 0) == ($183 | 0)) { + $$19 = $first; + break L1; + } + } + } + $187 = $db + 4 | 0; + $188 = HEAP32[$187 >> 2] | 0; + if ((($188 - (HEAP32[$db >> 2] | 0) | 0) / 24 | 0) >>> 0 < 2) { + $$19 = $first; + break; + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($s4, $188 + -24 | 0); + $196 = HEAP32[$187 >> 2] | 0; + $197 = $196 + -24 | 0; + $199 = $196; + do { + $198 = $199 + -24 | 0; + HEAP32[$187 >> 2] = $198; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($198); + $199 = HEAP32[$187 >> 2] | 0; + } while (($199 | 0) != ($197 | 0)); + $201 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc($s4, 0, 12902) | 0; + HEAP32[$2 >> 2] = HEAP32[$201 >> 2]; + HEAP32[$2 + 4 >> 2] = HEAP32[$201 + 4 >> 2]; + HEAP32[$2 + 8 >> 2] = HEAP32[$201 + 8 >> 2]; + HEAP32[$201 >> 2] = 0; + HEAP32[$201 + 4 >> 2] = 0; + HEAP32[$201 + 8 >> 2] = 0; + $205 = HEAP8[$2 >> 0] | 0; + $207 = ($205 & 1) == 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($196 + -48 | 0, $207 ? $2 + 1 | 0 : HEAP32[$2 + 8 >> 2] | 0, $207 ? ($205 & 255) >>> 1 : HEAP32[$2 + 4 >> 2] | 0) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($2); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($s4); + $$19 = $177; + break; + } + $217 = __ZN10__cxxabiv112_GLOBAL__N_115parse_simple_idINS0_2DbEEEPKcS4_S4_RT_($30, $last, $db) | 0; + if (($217 | 0) == ($30 | 0) | ($217 | 0) == ($last | 0)) $$19 = $first; else { + if ($global$0$off0) { + $221 = $db + 4 | 0; + $222 = HEAP32[$221 >> 2] | 0; + if ((HEAP32[$db >> 2] | 0) == ($222 | 0)) { + $$19 = $first; + break; + } + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc($222 + -24 | 0, 0, 12902) | 0; + $$pre$phi82Z2D = $221; + $$pre$phi84Z2D = $db; + } else { + $$pre$phi82Z2D = $db + 4 | 0; + $$pre$phi84Z2D = $db; + } + $225 = $3 + 8 | 0; + $226 = $3 + 1 | 0; + $227 = $3 + 4 | 0; + if ((HEAP8[$217 >> 0] | 0) == 69) $t$3$lcssa = $217; else { + $t$3110 = $217; + while (1) { + $230 = __ZN10__cxxabiv112_GLOBAL__N_115parse_simple_idINS0_2DbEEEPKcS4_S4_RT_($t$3110, $last, $db) | 0; + if (($230 | 0) == ($t$3110 | 0) | ($230 | 0) == ($last | 0)) { + $$19 = $first; + break L1; + } + $233 = HEAP32[$$pre$phi82Z2D >> 2] | 0; + if ((($233 - (HEAP32[$$pre$phi84Z2D >> 2] | 0) | 0) / 24 | 0) >>> 0 < 2) { + $$19 = $first; + break L1; + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($s5, $233 + -24 | 0); + $241 = HEAP32[$$pre$phi82Z2D >> 2] | 0; + $242 = $241 + -24 | 0; + $244 = $241; + do { + $243 = $244 + -24 | 0; + HEAP32[$$pre$phi82Z2D >> 2] = $243; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($243); + $244 = HEAP32[$$pre$phi82Z2D >> 2] | 0; + } while (($244 | 0) != ($242 | 0)); + $246 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc($s5, 0, 12902) | 0; + HEAP32[$3 >> 2] = HEAP32[$246 >> 2]; + HEAP32[$3 + 4 >> 2] = HEAP32[$246 + 4 >> 2]; + HEAP32[$3 + 8 >> 2] = HEAP32[$246 + 8 >> 2]; + HEAP32[$246 >> 2] = 0; + HEAP32[$246 + 4 >> 2] = 0; + HEAP32[$246 + 8 >> 2] = 0; + $250 = HEAP8[$3 >> 0] | 0; + $252 = ($250 & 1) == 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($241 + -48 | 0, $252 ? $226 : HEAP32[$225 >> 2] | 0, $252 ? ($250 & 255) >>> 1 : HEAP32[$227 >> 2] | 0) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($3); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($s5); + if ((HEAP8[$230 >> 0] | 0) == 69) { + $t$3$lcssa = $230; + break; + } else $t$3110 = $230; + } + } + $261 = $t$3$lcssa + 1 | 0; + $262 = __ZN10__cxxabiv112_GLOBAL__N_126parse_base_unresolved_nameINS0_2DbEEEPKcS4_S4_RT_($261, $last, $db) | 0; + if (($262 | 0) == ($261 | 0)) { + $265 = HEAP32[$$pre$phi82Z2D >> 2] | 0; + if ((HEAP32[$$pre$phi84Z2D >> 2] | 0) == ($265 | 0)) { + $$19 = $first; + break; + } + $267 = $265 + -24 | 0; + $269 = $265; + while (1) { + $268 = $269 + -24 | 0; + HEAP32[$$pre$phi82Z2D >> 2] = $268; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($268); + $269 = HEAP32[$$pre$phi82Z2D >> 2] | 0; + if (($269 | 0) == ($267 | 0)) { + $$19 = $first; + break L1; + } + } + } + $271 = HEAP32[$$pre$phi82Z2D >> 2] | 0; + if ((($271 - (HEAP32[$$pre$phi84Z2D >> 2] | 0) | 0) / 24 | 0) >>> 0 < 2) $$19 = $first; else { + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($s6, $271 + -24 | 0); + $279 = HEAP32[$$pre$phi82Z2D >> 2] | 0; + $280 = $279 + -24 | 0; + $282 = $279; + do { + $281 = $282 + -24 | 0; + HEAP32[$$pre$phi82Z2D >> 2] = $281; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($281); + $282 = HEAP32[$$pre$phi82Z2D >> 2] | 0; + } while (($282 | 0) != ($280 | 0)); + $284 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc($s6, 0, 12902) | 0; + HEAP32[$4 >> 2] = HEAP32[$284 >> 2]; + HEAP32[$4 + 4 >> 2] = HEAP32[$284 + 4 >> 2]; + HEAP32[$4 + 8 >> 2] = HEAP32[$284 + 8 >> 2]; + HEAP32[$284 >> 2] = 0; + HEAP32[$284 + 4 >> 2] = 0; + HEAP32[$284 + 8 >> 2] = 0; + $288 = HEAP8[$4 >> 0] | 0; + $290 = ($288 & 1) == 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($279 + -48 | 0, $290 ? $4 + 1 | 0 : HEAP32[$4 + 8 >> 2] | 0, $290 ? ($288 & 255) >>> 1 : HEAP32[$4 + 4 >> 2] | 0) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($4); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($s6); + $$19 = $262; + } + } + } else $$19 = $first; else $$19 = $first; else $$19 = $first; + } else $$19 = $first; while (0); + STACKTOP = sp; + return $$19 | 0; +} + +function __ZN10__cxxabiv112_GLOBAL__N_118parse_substitutionINS0_2DbEEEPKcS4_S4_RT_($first, $last, $db) { + $first = $first | 0; + $last = $last | 0; + $db = $db | 0; + var $$0 = 0, $$0$i$i$i = 0, $$0$i$i$i12 = 0, $$0$i$i$i17 = 0, $$0$i$i$i22 = 0, $$0$i$i$i27 = 0, $$0$i$i$i32 = 0, $$0$i$i$i37 = 0, $$0$i$i$i40 = 0, $$lcssa98 = 0, $0 = 0, $1 = 0, $103 = 0, $104 = 0, $105 = 0, $106 = 0, $110 = 0, $112 = 0, $115 = 0, $116 = 0, $119 = 0, $12 = 0, $120 = 0, $122 = 0, $129 = 0, $13 = 0, $130 = 0, $131 = 0, $132 = 0, $136 = 0, $138 = 0, $14 = 0, $141 = 0, $142 = 0, $145 = 0, $146 = 0, $148 = 0, $15 = 0, $155 = 0, $156 = 0, $157 = 0, $158 = 0, $16 = 0, $162 = 0, $164 = 0, $167 = 0, $168 = 0, $172 = 0, $176 = 0, $178 = 0, $179 = 0, $18 = 0, $180 = 0, $181 = 0, $182 = 0, $184 = 0, $187 = 0, $195 = 0, $196 = 0, $197 = 0, $2 = 0, $200 = 0, $203 = 0, $212 = 0, $213 = 0, $214 = 0, $217 = 0, $218 = 0, $220 = 0, $221 = 0, $223 = 0, $224 = 0, $229 = 0, $233 = 0, $240 = 0, $242 = 0, $243 = 0, $244 = 0, $245 = 0, $246 = 0, $248 = 0, $25 = 0, $251 = 0, $259 = 0, $26 = 0, $260 = 0, $261 = 0, $264 = 0, $267 = 0, $27 = 0, $28 = 0, $3 = 0, $32 = 0, $34 = 0, $37 = 0, $38 = 0, $4 = 0, $41 = 0, $42 = 0, $44 = 0, $5 = 0, $51 = 0, $52 = 0, $53 = 0, $54 = 0, $58 = 0, $60 = 0, $63 = 0, $64 = 0, $67 = 0, $68 = 0, $70 = 0, $77 = 0, $78 = 0, $79 = 0, $80 = 0, $84 = 0, $86 = 0, $89 = 0, $90 = 0, $93 = 0, $94 = 0, $96 = 0, $__v$i$i38 = 0, $isdigittmp5 = 0, $isdigittmp9 = 0, $sub$179 = 0, $sub$179$lcssa = 0, $t$080 = 0, $t$080$lcssa = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 176 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $__v$i$i38 = sp + 144 | 0; + $0 = sp + 120 | 0; + $1 = sp + 96 | 0; + $2 = sp + 72 | 0; + $3 = sp + 48 | 0; + $4 = sp + 24 | 0; + $5 = sp; + L1 : do if (($last - $first | 0) > 1) if ((HEAP8[$first >> 0] | 0) == 83) { + $12 = $first + 1 | 0; + $13 = HEAP8[$12 >> 0] | 0; + $14 = $13 << 24 >> 24; + switch ($14 | 0) { + case 97: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj15EEERAT__Kc($0, 12813); + $15 = $db + 4 | 0; + $16 = HEAP32[$15 >> 2] | 0; + $18 = HEAP32[$db + 8 >> 2] | 0; + if ($16 >>> 0 < $18 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($16, $0); + HEAP32[$15 >> 2] = (HEAP32[$15 >> 2] | 0) + 24; + } else { + $25 = HEAP32[$db >> 2] | 0; + $26 = $16 - $25 | 0; + $27 = ($26 | 0) / 24 | 0; + $28 = $27 + 1 | 0; + if (($26 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $32 = ($18 - $25 | 0) / 24 | 0; + if ($32 >>> 0 < 1073741823) { + $34 = $32 << 1; + $$0$i$i$i = $34 >>> 0 < $28 >>> 0 ? $28 : $34; + } else $$0$i$i$i = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i38, $$0$i$i$i, $27, $db + 12 | 0); + $37 = $__v$i$i38 + 8 | 0; + $38 = HEAP32[$37 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($38, $0); + HEAP32[$37 >> 2] = $38 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i38); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i38); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($0); + $$0 = $first + 2 | 0; + break L1; + break; + } + case 98: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj18EEERAT__Kc($1, 12828); + $41 = $db + 4 | 0; + $42 = HEAP32[$41 >> 2] | 0; + $44 = HEAP32[$db + 8 >> 2] | 0; + if ($42 >>> 0 < $44 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($42, $1); + HEAP32[$41 >> 2] = (HEAP32[$41 >> 2] | 0) + 24; + } else { + $51 = HEAP32[$db >> 2] | 0; + $52 = $42 - $51 | 0; + $53 = ($52 | 0) / 24 | 0; + $54 = $53 + 1 | 0; + if (($52 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $58 = ($44 - $51 | 0) / 24 | 0; + if ($58 >>> 0 < 1073741823) { + $60 = $58 << 1; + $$0$i$i$i12 = $60 >>> 0 < $54 >>> 0 ? $54 : $60; + } else $$0$i$i$i12 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i38, $$0$i$i$i12, $53, $db + 12 | 0); + $63 = $__v$i$i38 + 8 | 0; + $64 = HEAP32[$63 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($64, $1); + HEAP32[$63 >> 2] = $64 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i38); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i38); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($1); + $$0 = $first + 2 | 0; + break L1; + break; + } + case 115: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj12EEERAT__Kc($2, 12846); + $67 = $db + 4 | 0; + $68 = HEAP32[$67 >> 2] | 0; + $70 = HEAP32[$db + 8 >> 2] | 0; + if ($68 >>> 0 < $70 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($68, $2); + HEAP32[$67 >> 2] = (HEAP32[$67 >> 2] | 0) + 24; + } else { + $77 = HEAP32[$db >> 2] | 0; + $78 = $68 - $77 | 0; + $79 = ($78 | 0) / 24 | 0; + $80 = $79 + 1 | 0; + if (($78 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $84 = ($70 - $77 | 0) / 24 | 0; + if ($84 >>> 0 < 1073741823) { + $86 = $84 << 1; + $$0$i$i$i17 = $86 >>> 0 < $80 >>> 0 ? $80 : $86; + } else $$0$i$i$i17 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i38, $$0$i$i$i17, $79, $db + 12 | 0); + $89 = $__v$i$i38 + 8 | 0; + $90 = HEAP32[$89 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($90, $2); + HEAP32[$89 >> 2] = $90 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i38); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i38); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($2); + $$0 = $first + 2 | 0; + break L1; + break; + } + case 105: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj13EEERAT__Kc($3, 12858); + $93 = $db + 4 | 0; + $94 = HEAP32[$93 >> 2] | 0; + $96 = HEAP32[$db + 8 >> 2] | 0; + if ($94 >>> 0 < $96 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($94, $3); + HEAP32[$93 >> 2] = (HEAP32[$93 >> 2] | 0) + 24; + } else { + $103 = HEAP32[$db >> 2] | 0; + $104 = $94 - $103 | 0; + $105 = ($104 | 0) / 24 | 0; + $106 = $105 + 1 | 0; + if (($104 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $110 = ($96 - $103 | 0) / 24 | 0; + if ($110 >>> 0 < 1073741823) { + $112 = $110 << 1; + $$0$i$i$i22 = $112 >>> 0 < $106 >>> 0 ? $106 : $112; + } else $$0$i$i$i22 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i38, $$0$i$i$i22, $105, $db + 12 | 0); + $115 = $__v$i$i38 + 8 | 0; + $116 = HEAP32[$115 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($116, $3); + HEAP32[$115 >> 2] = $116 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i38); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i38); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($3); + $$0 = $first + 2 | 0; + break L1; + break; + } + case 111: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj13EEERAT__Kc($4, 12871); + $119 = $db + 4 | 0; + $120 = HEAP32[$119 >> 2] | 0; + $122 = HEAP32[$db + 8 >> 2] | 0; + if ($120 >>> 0 < $122 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($120, $4); + HEAP32[$119 >> 2] = (HEAP32[$119 >> 2] | 0) + 24; + } else { + $129 = HEAP32[$db >> 2] | 0; + $130 = $120 - $129 | 0; + $131 = ($130 | 0) / 24 | 0; + $132 = $131 + 1 | 0; + if (($130 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $136 = ($122 - $129 | 0) / 24 | 0; + if ($136 >>> 0 < 1073741823) { + $138 = $136 << 1; + $$0$i$i$i27 = $138 >>> 0 < $132 >>> 0 ? $132 : $138; + } else $$0$i$i$i27 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i38, $$0$i$i$i27, $131, $db + 12 | 0); + $141 = $__v$i$i38 + 8 | 0; + $142 = HEAP32[$141 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($142, $4); + HEAP32[$141 >> 2] = $142 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i38); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i38); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($4); + $$0 = $first + 2 | 0; + break L1; + break; + } + case 100: + { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj14EEERAT__Kc($5, 12884); + $145 = $db + 4 | 0; + $146 = HEAP32[$145 >> 2] | 0; + $148 = HEAP32[$db + 8 >> 2] | 0; + if ($146 >>> 0 < $148 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($146, $5); + HEAP32[$145 >> 2] = (HEAP32[$145 >> 2] | 0) + 24; + } else { + $155 = HEAP32[$db >> 2] | 0; + $156 = $146 - $155 | 0; + $157 = ($156 | 0) / 24 | 0; + $158 = $157 + 1 | 0; + if (($156 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $162 = ($148 - $155 | 0) / 24 | 0; + if ($162 >>> 0 < 1073741823) { + $164 = $162 << 1; + $$0$i$i$i32 = $164 >>> 0 < $158 >>> 0 ? $158 : $164; + } else $$0$i$i$i32 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i38, $$0$i$i$i32, $157, $db + 12 | 0); + $167 = $__v$i$i38 + 8 | 0; + $168 = HEAP32[$167 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($168, $5); + HEAP32[$167 >> 2] = $168 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i38); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i38); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($5); + $$0 = $first + 2 | 0; + break L1; + break; + } + case 95: + { + $172 = HEAP32[$db + 16 >> 2] | 0; + if (($172 | 0) == (HEAP32[$db + 20 >> 2] | 0)) { + $$0 = $first; + break L1; + } + $176 = HEAP32[$172 >> 2] | 0; + $178 = HEAP32[$172 + 4 >> 2] | 0; + $179 = $db + 4 | 0; + $180 = $db + 8 | 0; + $181 = $db + 12 | 0; + $182 = $__v$i$i38 + 8 | 0; + L100 : do if (($176 | 0) != ($178 | 0)) { + $187 = $176; + while (1) { + $184 = HEAP32[$179 >> 2] | 0; + if (($184 | 0) == (HEAP32[$180 >> 2] | 0)) { + $195 = $184 - (HEAP32[$db >> 2] | 0) | 0; + $196 = ($195 | 0) / 24 | 0; + $197 = $196 + 1 | 0; + if (($195 | 0) < -24) break; + if ($196 >>> 0 < 1073741823) { + $200 = $196 << 1; + $$0$i$i$i37 = $200 >>> 0 < $197 >>> 0 ? $197 : $200; + } else $$0$i$i$i37 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i38, $$0$i$i$i37, $196, $181); + $203 = HEAP32[$182 >> 2] | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEC2ERKS7_($203, $187); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEC2ERKS7_($203 + 12 | 0, $187 + 12 | 0); + HEAP32[$182 >> 2] = $203 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i38); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i38); + } else { + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEC2ERKS7_($184, $187); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEC2ERKS7_($184 + 12 | 0, $187 + 12 | 0); + HEAP32[$179 >> 2] = (HEAP32[$179 >> 2] | 0) + 24; + } + $187 = $187 + 24 | 0; + if (($187 | 0) == ($178 | 0)) break L100; + } + __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + } while (0); + $$0 = $first + 2 | 0; + break L1; + break; + } + default: + { + if (($14 + -48 | 0) >>> 0 < 10) $213 = $13; else { + if (!(_isupper($14) | 0)) { + $$0 = $first; + break L1; + } + $213 = HEAP8[$12 >> 0] | 0; + } + $212 = $213 << 24 >> 24; + $isdigittmp5 = $212 + -48 | 0; + $214 = $first + 2 | 0; + if (($214 | 0) == ($last | 0)) { + $$0 = $first; + break L1; + } + $sub$179 = $isdigittmp5 >>> 0 < 10 ? $isdigittmp5 : $212 + -55 | 0; + $t$080 = $214; + while (1) { + $217 = HEAP8[$t$080 >> 0] | 0; + $218 = $217 << 24 >> 24; + if (($218 + -48 | 0) >>> 0 < 10) $224 = $217; else { + $220 = (_isupper($218) | 0) == 0; + $221 = HEAP8[$t$080 >> 0] | 0; + if ($220) { + $$lcssa98 = $221; + $sub$179$lcssa = $sub$179; + $t$080$lcssa = $t$080; + break; + } else $224 = $221; + } + $223 = $224 << 24 >> 24; + $isdigittmp9 = $223 + -48 | 0; + $t$080 = $t$080 + 1 | 0; + if (($t$080 | 0) == ($last | 0)) { + $$0 = $first; + break L1; + } else $sub$179 = ($isdigittmp9 >>> 0 < 10 ? $isdigittmp9 : $223 + -55 | 0) + ($sub$179 * 36 | 0) | 0; + } + if ($$lcssa98 << 24 >> 24 != 95) { + $$0 = $first; + break L1; + } + $229 = $sub$179$lcssa + 1 | 0; + $233 = HEAP32[$db + 16 >> 2] | 0; + if ($229 >>> 0 >= (HEAP32[$db + 20 >> 2] | 0) - $233 >> 4 >>> 0) { + $$0 = $first; + break L1; + } + $240 = HEAP32[$233 + ($229 << 4) >> 2] | 0; + $242 = HEAP32[$233 + ($229 << 4) + 4 >> 2] | 0; + $243 = $db + 4 | 0; + $244 = $db + 8 | 0; + $245 = $db + 12 | 0; + $246 = $__v$i$i38 + 8 | 0; + L19 : do if (($240 | 0) != ($242 | 0)) { + $251 = $240; + while (1) { + $248 = HEAP32[$243 >> 2] | 0; + if (($248 | 0) == (HEAP32[$244 >> 2] | 0)) { + $259 = $248 - (HEAP32[$db >> 2] | 0) | 0; + $260 = ($259 | 0) / 24 | 0; + $261 = $260 + 1 | 0; + if (($259 | 0) < -24) break; + if ($260 >>> 0 < 1073741823) { + $264 = $260 << 1; + $$0$i$i$i40 = $264 >>> 0 < $261 >>> 0 ? $261 : $264; + } else $$0$i$i$i40 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i38, $$0$i$i$i40, $260, $245); + $267 = HEAP32[$246 >> 2] | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEC2ERKS7_($267, $251); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEC2ERKS7_($267 + 12 | 0, $251 + 12 | 0); + HEAP32[$246 >> 2] = $267 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i38); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i38); + } else { + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEC2ERKS7_($248, $251); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEC2ERKS7_($248 + 12 | 0, $251 + 12 | 0); + HEAP32[$243 >> 2] = (HEAP32[$243 >> 2] | 0) + 24; + } + $251 = $251 + 24 | 0; + if (($251 | 0) == ($242 | 0)) break L19; + } + __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + } while (0); + $$0 = $t$080$lcssa + 1 | 0; + break L1; + } + } + } else $$0 = $first; else $$0 = $first; while (0); + STACKTOP = sp; + return $$0 | 0; +} + +function _icpGetInitXw2Xc_from_PlanarData($matXc2U, $screenCoord, $worldCoord, $num, $initMatXw2Xc) { + $matXc2U = $matXc2U | 0; + $screenCoord = $screenCoord | 0; + $worldCoord = $worldCoord | 0; + $num = $num | 0; + $initMatXw2Xc = $initMatXw2Xc | 0; + var $$$10$i = 0.0, $$$16$i = 0.0, $$$18$i = 0.0, $$$8$i = 0.0, $$0 = 0, $$10$$i = 0.0, $$10$i = 0.0, $$15$i = 0.0, $$16$$i = 0.0, $$16$i = 0.0, $$17$i = 0.0, $$18$$i = 0.0, $$18$i = 0.0, $$7$i = 0.0, $$7$i1 = 0.0, $$7$i2 = 0.0, $$8$$i = 0.0, $$8$i = 0.0, $$9$i = 0.0, $102 = 0, $104 = 0, $106 = 0, $11 = 0, $110 = 0, $112 = 0, $114 = 0.0, $118 = 0.0, $121 = 0.0, $122 = 0.0, $125 = 0.0, $129 = 0.0, $132 = 0.0, $133 = 0.0, $135 = 0.0, $140 = 0.0, $147 = 0.0, $151 = 0.0, $157 = 0.0, $163 = 0.0, $169 = 0.0, $170 = 0.0, $171 = 0.0, $172 = 0.0, $173 = 0.0, $174 = 0.0, $175 = 0.0, $177 = 0.0, $178 = 0.0, $180 = 0.0, $191 = 0.0, $193 = 0.0, $194 = 0.0, $195 = 0.0, $197 = 0.0, $199 = 0.0, $200 = 0.0, $203 = 0.0, $209 = 0.0, $211 = 0.0, $212 = 0.0, $213 = 0.0, $218 = 0.0, $226 = 0.0, $234 = 0, $235 = 0.0, $236 = 0.0, $237 = 0.0, $242 = 0.0, $244 = 0.0, $248 = 0.0, $249 = 0.0, $251 = 0.0, $255 = 0.0, $258 = 0.0, $265 = 0.0, $268 = 0.0, $270 = 0.0, $272 = 0.0, $274 = 0.0, $276 = 0.0, $278 = 0.0, $280 = 0.0, $281 = 0, $283 = 0, $291 = 0, $292 = 0.0, $293 = 0.0, $294 = 0.0, $299 = 0.0, $301 = 0.0, $305 = 0.0, $306 = 0.0, $308 = 0.0, $312 = 0.0, $315 = 0.0, $32 = 0, $322 = 0.0, $325 = 0.0, $327 = 0.0, $329 = 0.0, $33 = 0, $331 = 0.0, $333 = 0.0, $335 = 0.0, $337 = 0.0, $338 = 0, $340 = 0, $345 = 0.0, $35 = 0, $352 = 0.0, $359 = 0.0, $366 = 0.0, $37 = 0, $377 = 0.0, $379 = 0.0, $38 = 0, $380 = 0.0, $381 = 0.0, $383 = 0.0, $385 = 0.0, $386 = 0.0, $389 = 0.0, $39 = 0, $395 = 0.0, $41 = 0, $43 = 0, $56 = 0, $83 = 0, $96 = 0, $cb$0$i = 0.0, $e1$0$i = 0.0, $e2$0$i = 0.0, $e3$0$i = 0.0, $e4$0$i = 0.0, $f$0$i = 0, $f$2$i = 0, $i$0 = 0, $i$15 = 0, $t$sroa$0$0 = 0.0, $t$sroa$6$0 = 0.0, $v1$sroa$0$0$i = 0.0, $v1$sroa$16$0$i = 0.0, $v1$sroa$31$0$i = 0.0, $v2$sroa$0$0$i = 0.0, $v2$sroa$16$0$i = 0.0, $v2$sroa$31$0$i = 0.0, $v3$sroa$0$0$i = 0.0, $v3$sroa$0$0$v3$sroa$31$0$v3$sroa$60$0$i = 0.0, $v3$sroa$0$2$i = 0.0, $v3$sroa$31$0$i = 0.0, $v3$sroa$31$0$v3$sroa$60$0$i = 0.0, $v3$sroa$31$0$v3$sroa$60$0$v3$sroa$0$0$i = 0.0, $v3$sroa$31$2$i = 0.0, $v3$sroa$60$0$i = 0.0, $v3$sroa$60$0$v3$sroa$31$0$i = 0.0, $v3$sroa$60$3$i = 0.0, $vararg_buffer = 0, $vararg_buffer1 = 0, $vararg_buffer11 = 0, $vararg_buffer3 = 0, $vararg_buffer5 = 0, $vararg_buffer7 = 0, $vararg_buffer9 = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 64 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer11 = sp + 48 | 0; + $vararg_buffer9 = sp + 40 | 0; + $vararg_buffer7 = sp + 32 | 0; + $vararg_buffer5 = sp + 24 | 0; + $vararg_buffer3 = sp + 16 | 0; + $vararg_buffer1 = sp + 8 | 0; + $vararg_buffer = sp; + L1 : do if (($num | 0) < 4) $$0 = -1; else { + $i$0 = 0; + while (1) { + if (($i$0 | 0) >= ($num | 0)) break; + if (+HEAPF64[$worldCoord + ($i$0 * 24 | 0) + 16 >> 3] != 0.0) { + $$0 = -1; + break L1; + } else $i$0 = $i$0 + 1 | 0; + } + if (+HEAPF64[$matXc2U >> 3] == 0.0) $$0 = -1; else if (+HEAPF64[$matXc2U + 32 >> 3] != 0.0) $$0 = -1; else { + $11 = $matXc2U + 40 | 0; + if (+HEAPF64[$11 >> 3] == 0.0) $$0 = -1; else if (+HEAPF64[$matXc2U + 64 >> 3] != 0.0) $$0 = -1; else if (+HEAPF64[$matXc2U + 72 >> 3] != 0.0) $$0 = -1; else if (+HEAPF64[$matXc2U + 80 >> 3] != 1.0) $$0 = -1; else if (+HEAPF64[$matXc2U + 24 >> 3] != 0.0) $$0 = -1; else if (+HEAPF64[$matXc2U + 56 >> 3] != 0.0) $$0 = -1; else if (+HEAPF64[$matXc2U + 88 >> 3] != 0.0) $$0 = -1; else { + $32 = $num << 1; + $33 = _arMatrixAlloc($32, 8) | 0; + if (!$33) { + _arLog(3, 5124, $vararg_buffer); + $$0 = -1; + break; + } + $35 = _arMatrixAlloc($32, 1) | 0; + if (!$35) { + _arMatrixFree($33) | 0; + _arLog(3, 5150, $vararg_buffer1); + $$0 = -1; + break; + } + if ($num) { + $37 = HEAP32[$33 >> 2] | 0; + $38 = HEAP32[$35 >> 2] | 0; + $i$15 = 0; + do { + $39 = $worldCoord + ($i$15 * 24 | 0) | 0; + $41 = $i$15 << 4; + HEAPF64[$37 + ($41 << 3) >> 3] = +HEAPF64[$39 >> 3]; + $43 = $worldCoord + ($i$15 * 24 | 0) + 8 | 0; + HEAPF64[$37 + (($41 | 1) << 3) >> 3] = +HEAPF64[$43 >> 3]; + HEAPF64[$37 + (($41 | 2) << 3) >> 3] = 1.0; + HEAPF64[$37 + (($41 | 3) << 3) >> 3] = 0.0; + HEAPF64[$37 + (($41 | 4) << 3) >> 3] = 0.0; + HEAPF64[$37 + (($41 | 5) << 3) >> 3] = 0.0; + $56 = $screenCoord + ($i$15 << 4) | 0; + HEAPF64[$37 + (($41 | 6) << 3) >> 3] = -(+HEAPF64[$39 >> 3] * +HEAPF64[$56 >> 3]); + HEAPF64[$37 + (($41 | 7) << 3) >> 3] = -(+HEAPF64[$43 >> 3] * +HEAPF64[$56 >> 3]); + HEAPF64[$37 + (($41 | 8) << 3) >> 3] = 0.0; + HEAPF64[$37 + (($41 | 9) << 3) >> 3] = 0.0; + HEAPF64[$37 + (($41 | 10) << 3) >> 3] = 0.0; + HEAPF64[$37 + (($41 | 11) << 3) >> 3] = +HEAPF64[$39 >> 3]; + HEAPF64[$37 + (($41 | 12) << 3) >> 3] = +HEAPF64[$43 >> 3]; + HEAPF64[$37 + (($41 | 13) << 3) >> 3] = 1.0; + $83 = $screenCoord + ($i$15 << 4) + 8 | 0; + HEAPF64[$37 + (($41 | 14) << 3) >> 3] = -(+HEAPF64[$39 >> 3] * +HEAPF64[$83 >> 3]); + HEAPF64[$37 + (($41 | 15) << 3) >> 3] = -(+HEAPF64[$43 >> 3] * +HEAPF64[$83 >> 3]); + $96 = $i$15 << 1; + HEAPF64[$38 + ($96 << 3) >> 3] = +HEAPF64[$56 >> 3]; + HEAPF64[$38 + (($96 | 1) << 3) >> 3] = +HEAPF64[$83 >> 3]; + $i$15 = $i$15 + 1 | 0; + } while (($i$15 | 0) != ($num | 0)); + } + $102 = _arMatrixAllocTrans($33) | 0; + if (!$102) { + _arMatrixFree($33) | 0; + _arMatrixFree($35) | 0; + _arLog(3, 5176, $vararg_buffer3); + $$0 = -1; + break; + } + $104 = _arMatrixAllocMul($102, $33) | 0; + if (!$104) { + _arMatrixFree($33) | 0; + _arMatrixFree($35) | 0; + _arMatrixFree($102) | 0; + _arLog(3, 5202, $vararg_buffer5); + $$0 = -1; + break; + } + $106 = _arMatrixAllocMul($102, $35) | 0; + if (!$106) { + _arMatrixFree($33) | 0; + _arMatrixFree($35) | 0; + _arMatrixFree($102) | 0; + _arMatrixFree($104) | 0; + _arLog(3, 5228, $vararg_buffer7); + $$0 = -1; + break; + } + if ((_arMatrixSelfInv($104) | 0) < 0) { + _arMatrixFree($33) | 0; + _arMatrixFree($35) | 0; + _arMatrixFree($102) | 0; + _arMatrixFree($104) | 0; + _arMatrixFree($106) | 0; + _arLog(3, 5254, $vararg_buffer9); + $$0 = -1; + break; + } + $110 = _arMatrixAllocMul($104, $106) | 0; + if (!$110) { + _arMatrixFree($33) | 0; + _arMatrixFree($35) | 0; + _arMatrixFree($102) | 0; + _arMatrixFree($104) | 0; + _arMatrixFree($106) | 0; + _arLog(3, 5280, $vararg_buffer11); + $$0 = -1; + break; + } + $112 = HEAP32[$110 >> 2] | 0; + $114 = +HEAPF64[$112 + 48 >> 3]; + $118 = +HEAPF64[$matXc2U + 48 >> 3]; + $121 = +HEAPF64[$11 >> 3]; + $122 = (+HEAPF64[$112 + 24 >> 3] - $114 * $118) / $121; + $125 = +HEAPF64[$matXc2U + 16 >> 3]; + $129 = +HEAPF64[$matXc2U + 8 >> 3]; + $132 = +HEAPF64[$matXc2U >> 3]; + $133 = (+HEAPF64[$112 >> 3] - $114 * $125 - $122 * $129) / $132; + $135 = +HEAPF64[$112 + 56 >> 3]; + $140 = (+HEAPF64[$112 + 32 >> 3] - $118 * $135) / $121; + $147 = (+HEAPF64[$112 + 8 >> 3] - $125 * $135 - $129 * $140) / $132; + $151 = (+HEAPF64[$112 + 40 >> 3] - $118) / $121; + $157 = (+HEAPF64[$112 + 16 >> 3] - $125 - $129 * $151) / $132; + _arMatrixFree($33) | 0; + _arMatrixFree($35) | 0; + _arMatrixFree($102) | 0; + _arMatrixFree($104) | 0; + _arMatrixFree($106) | 0; + _arMatrixFree($110) | 0; + $163 = +Math_sqrt(+($114 * $114 + ($122 * $122 + $133 * $133))); + $169 = +Math_sqrt(+($135 * $135 + ($140 * $140 + $147 * $147))); + $170 = $133 / $163; + $171 = $122 / $163; + $172 = $114 / $163; + $173 = $147 / $169; + $174 = $140 / $169; + $175 = $135 / $169; + $177 = ($163 + $169) * .5; + $178 = $157 / $177; + $180 = 1.0 / $177; + if ($180 < 0.0) { + $$7$i1 = -$171; + $191 = -$175; + $193 = -$174; + $194 = -$172; + $197 = -$173; + $199 = -$170; + $t$sroa$0$0 = -$178; + $t$sroa$6$0 = -$180; + } else { + $$7$i1 = $171; + $191 = $175; + $193 = $174; + $194 = $172; + $197 = $173; + $199 = $170; + $t$sroa$0$0 = $178; + $t$sroa$6$0 = $151 / $177; + } + $195 = $191 * $$7$i1 - $193 * $194; + $200 = $197 * $194 - $191 * $199; + $203 = $193 * $199 - $197 * $$7$i1; + $209 = +Math_sqrt(+($203 * $203 + ($195 * $195 + $200 * $200))); + do if ($209 == 0.0) { + $$7$i2 = $$7$i1; + $377 = $191; + $379 = $193; + $380 = $194; + $383 = $197; + $385 = $199; + } else { + $211 = $195 / $209; + $212 = $200 / $209; + $213 = $203 / $209; + $218 = $191 * $194 + ($193 * $$7$i1 + $197 * $199); + $cb$0$i = $218 < 0.0 ? -$218 : $218; + $226 = (+Math_sqrt(+($cb$0$i + 1.0)) + +Math_sqrt(+(1.0 - $cb$0$i))) * .5; + if ($199 * $212 - $$7$i1 * $211 != 0.0) { + $f$0$i = 0; + $v1$sroa$0$0$i = $199; + $v1$sroa$16$0$i = $$7$i1; + $v1$sroa$31$0$i = $194; + $v3$sroa$0$0$i = $211; + $v3$sroa$31$0$i = $212; + $v3$sroa$60$0$i = $213; + } else { + $234 = $199 * $213 - $194 * $211 != 0.0; + $f$0$i = $234 ? 1 : 2; + $v1$sroa$0$0$i = $234 ? $199 : $194; + $v1$sroa$16$0$i = $234 ? $194 : $$7$i1; + $v1$sroa$31$0$i = $234 ? $$7$i1 : $199; + $v3$sroa$0$0$i = $234 ? $211 : $213; + $v3$sroa$31$0$i = $234 ? $213 : $212; + $v3$sroa$60$0$i = $234 ? $212 : $211; + } + $235 = $v1$sroa$0$0$i * $v3$sroa$31$0$i; + $236 = $v1$sroa$16$0$i * $v3$sroa$0$0$i; + $237 = $235 - $236; + if ($237 == 0.0) { + $$7$i2 = $$7$i1; + $377 = $191; + $379 = $193; + $380 = $194; + $383 = $197; + $385 = $199; + break; + } + $242 = ($v1$sroa$16$0$i * $v3$sroa$60$0$i - $v1$sroa$31$0$i * $v3$sroa$31$0$i) / $237; + $244 = $226 * $v3$sroa$31$0$i / $237; + $248 = $236 - $235; + $249 = ($v1$sroa$0$0$i * $v3$sroa$60$0$i - $v1$sroa$31$0$i * $v3$sroa$0$0$i) / $248; + $251 = $226 * $v3$sroa$0$0$i / $248; + $255 = $242 * $242 + $249 * $249 + 1.0; + $258 = $242 * $244 + $249 * $251; + $265 = $258 * $258 - $255 * ($244 * $244 + $251 * $251 + -1.0); + if ($265 < 0.0) { + $$7$i2 = $$7$i1; + $377 = $191; + $379 = $193; + $380 = $194; + $383 = $197; + $385 = $199; + break; + } + $268 = +Math_sqrt(+$265); + $270 = ($268 - $258) / $255; + $272 = $244 + $242 * $270; + $274 = $251 + $249 * $270; + $276 = (-$258 - $268) / $255; + $278 = $244 + $242 * $276; + $280 = $251 + $249 * $276; + $281 = ($f$0$i | 0) == 1; + $v3$sroa$31$0$v3$sroa$60$0$i = $281 ? $v3$sroa$31$0$i : $v3$sroa$60$0$i; + $v3$sroa$60$0$v3$sroa$31$0$i = $281 ? $v3$sroa$60$0$i : $v3$sroa$31$0$i; + $$7$i = $281 ? $270 : $274; + $$8$i = $281 ? $274 : $270; + $$9$i = $281 ? $276 : $280; + $$10$i = $281 ? $280 : $276; + $283 = ($f$0$i | 0) == 2 & ($281 ^ 1); + $v3$sroa$0$0$v3$sroa$31$0$v3$sroa$60$0$i = $283 ? $v3$sroa$0$0$i : $v3$sroa$31$0$v3$sroa$60$0$i; + $v3$sroa$31$0$v3$sroa$60$0$v3$sroa$0$0$i = $283 ? $v3$sroa$31$0$v3$sroa$60$0$i : $v3$sroa$0$0$i; + $$8$$i = $283 ? $$8$i : $272; + $$$8$i = $283 ? $272 : $$8$i; + $$10$$i = $283 ? $$10$i : $278; + $$$10$i = $283 ? $278 : $$10$i; + if ($197 * $v3$sroa$60$0$v3$sroa$31$0$i - $193 * $v3$sroa$31$0$v3$sroa$60$0$v3$sroa$0$0$i != 0.0) { + $f$2$i = 0; + $v2$sroa$0$0$i = $197; + $v2$sroa$16$0$i = $193; + $v2$sroa$31$0$i = $191; + $v3$sroa$0$2$i = $v3$sroa$31$0$v3$sroa$60$0$v3$sroa$0$0$i; + $v3$sroa$31$2$i = $v3$sroa$60$0$v3$sroa$31$0$i; + $v3$sroa$60$3$i = $v3$sroa$0$0$v3$sroa$31$0$v3$sroa$60$0$i; + } else { + $291 = $197 * $v3$sroa$0$0$v3$sroa$31$0$v3$sroa$60$0$i - $191 * $v3$sroa$31$0$v3$sroa$60$0$v3$sroa$0$0$i != 0.0; + $f$2$i = $291 ? 1 : 2; + $v2$sroa$0$0$i = $291 ? $197 : $191; + $v2$sroa$16$0$i = $291 ? $191 : $193; + $v2$sroa$31$0$i = $291 ? $193 : $197; + $v3$sroa$0$2$i = $291 ? $v3$sroa$31$0$v3$sroa$60$0$v3$sroa$0$0$i : $v3$sroa$0$0$v3$sroa$31$0$v3$sroa$60$0$i; + $v3$sroa$31$2$i = $291 ? $v3$sroa$0$0$v3$sroa$31$0$v3$sroa$60$0$i : $v3$sroa$60$0$v3$sroa$31$0$i; + $v3$sroa$60$3$i = $291 ? $v3$sroa$60$0$v3$sroa$31$0$i : $v3$sroa$31$0$v3$sroa$60$0$v3$sroa$0$0$i; + } + $292 = $v2$sroa$0$0$i * $v3$sroa$31$2$i; + $293 = $v2$sroa$16$0$i * $v3$sroa$0$2$i; + $294 = $292 - $293; + if ($294 == 0.0) { + $$7$i2 = $$7$i1; + $377 = $191; + $379 = $193; + $380 = $194; + $383 = $197; + $385 = $199; + break; + } + $299 = ($v2$sroa$16$0$i * $v3$sroa$60$3$i - $v2$sroa$31$0$i * $v3$sroa$31$2$i) / $294; + $301 = $226 * $v3$sroa$31$2$i / $294; + $305 = $293 - $292; + $306 = ($v2$sroa$0$0$i * $v3$sroa$60$3$i - $v2$sroa$31$0$i * $v3$sroa$0$2$i) / $305; + $308 = $226 * $v3$sroa$0$2$i / $305; + $312 = $299 * $299 + $306 * $306 + 1.0; + $315 = $299 * $301 + $306 * $308; + $322 = $315 * $315 - $312 * ($301 * $301 + $308 * $308 + -1.0); + if ($322 < 0.0) { + $$7$i2 = $$7$i1; + $377 = $191; + $379 = $193; + $380 = $194; + $383 = $197; + $385 = $199; + break; + } + $325 = +Math_sqrt(+$322); + $327 = ($325 - $315) / $312; + $329 = $301 + $299 * $327; + $331 = $308 + $306 * $327; + $333 = (-$315 - $325) / $312; + $335 = $301 + $299 * $333; + $337 = $308 + $306 * $333; + $338 = ($f$2$i | 0) == 1; + $$15$i = $338 ? $327 : $331; + $$16$i = $338 ? $331 : $327; + $$17$i = $338 ? $333 : $337; + $$18$i = $338 ? $337 : $333; + $340 = ($f$2$i | 0) == 2 & ($338 ^ 1); + $$16$$i = $340 ? $$16$i : $329; + $$$16$i = $340 ? $329 : $$16$i; + $$18$$i = $340 ? $$18$i : $335; + $$$18$i = $340 ? $335 : $$18$i; + $345 = $$$8$i * $$$16$i + ($$7$i * $$15$i + $$8$$i * $$16$$i); + $e1$0$i = $345 < 0.0 ? -$345 : $345; + $352 = $$$8$i * $$$18$i + ($$7$i * $$17$i + $$8$$i * $$18$$i); + $e2$0$i = $352 < 0.0 ? -$352 : $352; + $359 = $$$10$i * $$$16$i + ($$9$i * $$15$i + $$10$$i * $$16$$i); + $e3$0$i = $359 < 0.0 ? -$359 : $359; + $366 = $$$10$i * $$$18$i + ($$9$i * $$17$i + $$10$$i * $$18$$i); + $e4$0$i = $366 < 0.0 ? -$366 : $366; + if ($e1$0$i < $e2$0$i) if ($e1$0$i < $e3$0$i) { + if ($e1$0$i < $e4$0$i) { + $$7$i2 = $$7$i; + $377 = $$$16$i; + $379 = $$15$i; + $380 = $$$8$i; + $383 = $$16$$i; + $385 = $$8$$i; + break; + } + $$7$i2 = $$9$i; + $377 = $$$18$i; + $379 = $$17$i; + $380 = $$$10$i; + $383 = $$18$$i; + $385 = $$10$$i; + break; + } else { + if ($e3$0$i < $e4$0$i) { + $$7$i2 = $$9$i; + $377 = $$$16$i; + $379 = $$15$i; + $380 = $$$10$i; + $383 = $$16$$i; + $385 = $$10$$i; + break; + } + $$7$i2 = $$9$i; + $377 = $$$18$i; + $379 = $$17$i; + $380 = $$$10$i; + $383 = $$18$$i; + $385 = $$10$$i; + break; + } else if ($e2$0$i < $e3$0$i) { + if ($e2$0$i < $e4$0$i) { + $$7$i2 = $$7$i; + $377 = $$$18$i; + $379 = $$17$i; + $380 = $$$8$i; + $383 = $$18$$i; + $385 = $$8$$i; + break; + } + $$7$i2 = $$9$i; + $377 = $$$18$i; + $379 = $$17$i; + $380 = $$$10$i; + $383 = $$18$$i; + $385 = $$10$$i; + break; + } else { + if ($e3$0$i < $e4$0$i) { + $$7$i2 = $$9$i; + $377 = $$$16$i; + $379 = $$15$i; + $380 = $$$10$i; + $383 = $$16$$i; + $385 = $$10$$i; + break; + } + $$7$i2 = $$9$i; + $377 = $$$18$i; + $379 = $$17$i; + $380 = $$$10$i; + $383 = $$18$$i; + $385 = $$10$$i; + break; + } + } while (0); + $381 = $377 * $$7$i2 - $379 * $380; + $386 = $383 * $380 - $377 * $385; + $389 = $379 * $385 - $383 * $$7$i2; + $395 = +Math_sqrt(+($389 * $389 + ($381 * $381 + $386 * $386))); + HEAPF64[$initMatXw2Xc >> 3] = $385; + HEAPF64[$initMatXw2Xc + 32 >> 3] = $$7$i2; + HEAPF64[$initMatXw2Xc + 64 >> 3] = $380; + HEAPF64[$initMatXw2Xc + 8 >> 3] = $383; + HEAPF64[$initMatXw2Xc + 40 >> 3] = $379; + HEAPF64[$initMatXw2Xc + 72 >> 3] = $377; + HEAPF64[$initMatXw2Xc + 16 >> 3] = $381 / $395; + HEAPF64[$initMatXw2Xc + 48 >> 3] = $386 / $395; + HEAPF64[$initMatXw2Xc + 80 >> 3] = $389 / $395; + HEAPF64[$initMatXw2Xc + 24 >> 3] = $t$sroa$0$0; + HEAPF64[$initMatXw2Xc + 56 >> 3] = $t$sroa$6$0; + HEAPF64[$initMatXw2Xc + 88 >> 3] = $180; + $$0 = 0; + } + } + } while (0); + STACKTOP = sp; + return $$0 | 0; +} + +function _arGetTransMatMultiSquare2($handle, $marker_info, $marker_num, $config, $robustFlag) { + $handle = $handle | 0; + $marker_info = $marker_info | 0; + $marker_num = $marker_num | 0; + $config = $config | 0; + $robustFlag = $robustFlag | 0; + var $$0 = 0.0, $$pre38 = 0, $0 = 0, $1 = 0, $114 = 0, $116 = 0, $119 = 0, $12 = 0, $121 = 0, $123 = 0, $125 = 0, $128 = 0, $13 = 0, $130 = 0, $133 = 0, $140 = 0, $15 = 0, $150 = 0, $160 = 0, $171 = 0, $2 = 0, $20 = 0.0, $209 = 0, $221 = 0, $224 = 0, $225 = 0, $226 = 0.0, $229 = 0.0, $232 = 0.0, $235 = 0.0, $239 = 0.0, $240 = 0, $241 = 0.0, $242 = 0, $258 = 0.0, $259 = 0.0, $276 = 0.0, $277 = 0.0, $294 = 0.0, $295 = 0.0, $3 = 0, $312 = 0.0, $313 = 0.0, $342 = 0, $344 = 0, $346 = 0, $348 = 0, $35 = 0, $38 = 0, $40 = 0, $43 = 0, $47 = 0, $5 = 0, $59 = 0.0, $6 = 0, $7 = 0, $75 = 0, $77 = 0, $79 = 0, $86 = 0, $err$0 = 0.0, $err$1 = 0.0, $err$2 = 0.0, $err$3 = 0.0, $err$4 = 0.0, $err$5 = 0.0, $err$6 = 0.0, $i$081 = 0, $i$165 = 0, $i$256 = 0, $i$942 = 0, $j$077 = 0, $j$1055 = 0, $j$171 = 0, $j$261 = 0, $j$357 = 0, $j$4 = 0, $j$553 = 0, $j$651 = 0, $j$749 = 0, $j$847 = 0, $j$945 = 0, $k$0$lcssa = 0, $k$078 = 0, $k$1 = 0, $k$2$lcssa = 0, $k$273 = 0, $k$3 = 0, $max$0$lcssa = 0, $max$062 = 0, $max$1 = 0, $max$2 = 0, $maxArea$063 = 0, $maxArea$1 = 0, $maxArea$2 = 0, $trans1 = 0, $trans2 = 0, $vararg_buffer = 0, $vararg_buffer1 = 0, $vnum$0$lcssa = 0, $vnum$064 = 0, $vnum$1 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 208 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer1 = sp + 200 | 0; + $vararg_buffer = sp + 192 | 0; + $trans1 = sp + 96 | 0; + $trans2 = sp; + $0 = $config + 4 | 0; + $1 = HEAP32[$0 >> 2] | 0; + $2 = $config + 112 | 0; + $3 = $config + 120 | 0; + if (($1 | 0) > 0) { + $5 = HEAP32[$config >> 2] | 0; + $6 = ($marker_num | 0) > 0; + $7 = ($marker_num | 0) > 0; + $i$081 = 0; + do { + if (!(HEAP32[$5 + ($i$081 * 320 | 0) + 4 >> 2] | 0)) { + if ($6) { + $15 = HEAP32[$5 + ($i$081 * 320 | 0) >> 2] | 0; + $j$077 = 0; + $k$078 = -1; + while (1) { + if ((HEAP32[$marker_info + ($j$077 << 8) + 8 >> 2] | 0) == ($15 | 0)) { + $20 = +HEAPF64[$marker_info + ($j$077 << 8) + 40 >> 3]; + if ($20 < +HEAPF64[$2 >> 3]) $k$1 = $k$078; else if (($k$078 | 0) == -1) $k$1 = $j$077; else if (+HEAPF64[$marker_info + ($k$078 << 8) + 40 >> 3] < $20) $k$1 = $j$077; else $k$1 = $k$078; + } else $k$1 = $k$078; + $j$077 = $j$077 + 1 | 0; + if (($j$077 | 0) >= ($marker_num | 0)) { + $k$0$lcssa = $k$1; + break; + } else $k$078 = $k$1; + } + } else $k$0$lcssa = -1; + HEAP32[$5 + ($i$081 * 320 | 0) + 304 >> 2] = $k$0$lcssa; + if (($k$0$lcssa | 0) > -1) HEAP32[$marker_info + ($k$0$lcssa << 8) + 16 >> 2] = HEAP32[$marker_info + ($k$0$lcssa << 8) + 20 >> 2]; + } else { + $12 = $5 + ($i$081 * 320 | 0) + 312 | 0; + $13 = $5 + ($i$081 * 320 | 0) | 0; + if ($7) { + $j$171 = 0; + $k$273 = -1; + while (1) { + $35 = HEAP32[$marker_info + ($j$171 << 8) + 12 >> 2] | 0; + if (!$35) { + $38 = $marker_info + ($j$171 << 8) + 248 | 0; + $40 = HEAP32[$38 >> 2] | 0; + $43 = HEAP32[$38 + 4 >> 2] | 0; + if (($40 | 0) == 0 & ($43 | 0) == 0) label = 19; else { + $47 = $12; + if (($40 | 0) == (HEAP32[$47 >> 2] | 0) ? ($43 | 0) == (HEAP32[$47 + 4 >> 2] | 0) : 0) label = 20; else $k$3 = $k$273; + } + } else label = 19; + if ((label | 0) == 19) { + label = 0; + if (($35 | 0) == (HEAP32[$13 >> 2] | 0)) label = 20; else $k$3 = $k$273; + } + if ((label | 0) == 20) { + label = 0; + $59 = +HEAPF64[$marker_info + ($j$171 << 8) + 48 >> 3]; + if ($59 < +HEAPF64[$3 >> 3]) $k$3 = $k$273; else if (($k$273 | 0) == -1) $k$3 = $j$171; else if (+HEAPF64[$marker_info + ($k$273 << 8) + 48 >> 3] < $59) $k$3 = $j$171; else $k$3 = $k$273; + } + $j$171 = $j$171 + 1 | 0; + if (($j$171 | 0) >= ($marker_num | 0)) { + $k$2$lcssa = $k$3; + break; + } else $k$273 = $k$3; + } + } else $k$2$lcssa = -1; + HEAP32[$5 + ($i$081 * 320 | 0) + 304 >> 2] = $k$2$lcssa; + if (($k$2$lcssa | 0) > -1) HEAP32[$marker_info + ($k$2$lcssa << 8) + 16 >> 2] = HEAP32[$marker_info + ($k$2$lcssa << 8) + 24 >> 2]; + } + $i$081 = $i$081 + 1 | 0; + } while (($i$081 | 0) < ($1 | 0)); + } + if (($1 | 0) > 0) { + $i$165 = 0; + $max$062 = 0; + $maxArea$063 = 0; + $vnum$064 = 0; + while (1) { + $75 = HEAP32[$config >> 2] | 0; + $77 = HEAP32[$75 + ($i$165 * 320 | 0) + 304 >> 2] | 0; + do if (($77 | 0) < 0) { + $max$2 = $max$062; + $maxArea$2 = $maxArea$063; + $vnum$1 = $vnum$064; + } else { + $79 = $marker_info + ($77 << 8) | 0; + if (+_arGetTransMatSquare($handle, $79, +HEAPF64[$75 + ($i$165 * 320 | 0) + 8 >> 3], $trans2) > 4.0) { + HEAP32[(HEAP32[$config >> 2] | 0) + ($i$165 * 320 | 0) + 304 >> 2] = -1; + $86 = $marker_info + ($77 << 8) + 236 | 0; + if (HEAP32[$86 >> 2] | 0) { + $max$2 = $max$062; + $maxArea$2 = $maxArea$063; + $vnum$1 = $vnum$064; + break; + } + HEAP32[$86 >> 2] = 7; + $max$2 = $max$062; + $maxArea$2 = $maxArea$063; + $vnum$1 = $vnum$064; + break; + } + $$pre38 = HEAP32[$79 >> 2] | 0; + if (($vnum$064 | 0) == 0 | ($maxArea$063 | 0) < ($$pre38 | 0)) { + $j$261 = 0; + do { + HEAPF64[$trans1 + ($j$261 << 5) >> 3] = +HEAPF64[$trans2 + ($j$261 << 5) >> 3]; + HEAPF64[$trans1 + ($j$261 << 5) + 8 >> 3] = +HEAPF64[$trans2 + ($j$261 << 5) + 8 >> 3]; + HEAPF64[$trans1 + ($j$261 << 5) + 16 >> 3] = +HEAPF64[$trans2 + ($j$261 << 5) + 16 >> 3]; + HEAPF64[$trans1 + ($j$261 << 5) + 24 >> 3] = +HEAPF64[$trans2 + ($j$261 << 5) + 24 >> 3]; + $j$261 = $j$261 + 1 | 0; + } while (($j$261 | 0) != 3); + $max$1 = $i$165; + $maxArea$1 = $$pre38; + } else { + $max$1 = $max$062; + $maxArea$1 = $maxArea$063; + } + $max$2 = $max$1; + $maxArea$2 = $maxArea$1; + $vnum$1 = $vnum$064 + 1 | 0; + } while (0); + $i$165 = $i$165 + 1 | 0; + if (($i$165 | 0) >= (HEAP32[$0 >> 2] | 0)) { + $max$0$lcssa = $max$2; + $vnum$0$lcssa = $vnum$1; + break; + } else { + $max$062 = $max$2; + $maxArea$063 = $maxArea$2; + $vnum$064 = $vnum$1; + } + } + } else { + $max$0$lcssa = 0; + $vnum$0$lcssa = 0; + } + do if (!$vnum$0$lcssa) label = 38; else if (($vnum$0$lcssa | 0) < (HEAP32[$config + 128 >> 2] | 0)) label = 38; else { + _arUtilMatMul($trans1, (HEAP32[$config >> 2] | 0) + ($max$0$lcssa * 320 | 0) + 112 | 0, $trans2) | 0; + $114 = $vnum$0$lcssa << 2; + $116 = _malloc($vnum$0$lcssa << 6) | 0; + if (!$116) { + _arLog(3, 5471, $vararg_buffer); + _exit(1); + } + $119 = _malloc($vnum$0$lcssa * 96 | 0) | 0; + if (!$119) { + _arLog(3, 5471, $vararg_buffer1); + _exit(1); + } + $121 = HEAP32[$0 >> 2] | 0; + if (($121 | 0) > 0) { + $123 = HEAP32[$config >> 2] | 0; + $i$256 = 0; + $j$357 = 0; + while (1) { + $125 = HEAP32[$123 + ($i$256 * 320 | 0) + 304 >> 2] | 0; + if (($125 | 0) < 0) $j$4 = $j$357; else { + $128 = HEAP32[$marker_info + ($125 << 8) + 16 >> 2] | 0; + $130 = (4 - $128 | 0) % 4 | 0; + $133 = $j$357 << 3; + HEAPF64[$116 + ($133 << 3) >> 3] = +HEAPF64[$marker_info + ($125 << 8) + 168 + ($130 << 4) >> 3]; + HEAPF64[$116 + (($133 | 1) << 3) >> 3] = +HEAPF64[$marker_info + ($125 << 8) + 168 + ($130 << 4) + 8 >> 3]; + $140 = (5 - $128 | 0) % 4 | 0; + HEAPF64[$116 + (($133 | 2) << 3) >> 3] = +HEAPF64[$marker_info + ($125 << 8) + 168 + ($140 << 4) >> 3]; + HEAPF64[$116 + (($133 | 3) << 3) >> 3] = +HEAPF64[$marker_info + ($125 << 8) + 168 + ($140 << 4) + 8 >> 3]; + $150 = (6 - $128 | 0) % 4 | 0; + HEAPF64[$116 + (($133 | 4) << 3) >> 3] = +HEAPF64[$marker_info + ($125 << 8) + 168 + ($150 << 4) >> 3]; + HEAPF64[$116 + (($133 | 5) << 3) >> 3] = +HEAPF64[$marker_info + ($125 << 8) + 168 + ($150 << 4) + 8 >> 3]; + $160 = (7 - $128 | 0) % 4 | 0; + HEAPF64[$116 + (($133 | 6) << 3) >> 3] = +HEAPF64[$marker_info + ($125 << 8) + 168 + ($160 << 4) >> 3]; + HEAPF64[$116 + (($133 | 7) << 3) >> 3] = +HEAPF64[$marker_info + ($125 << 8) + 168 + ($160 << 4) + 8 >> 3]; + $171 = $j$357 * 12 | 0; + HEAPF64[$119 + ($171 << 3) >> 3] = +HEAPF64[$123 + ($i$256 * 320 | 0) + 208 >> 3]; + HEAPF64[$119 + (($171 | 1) << 3) >> 3] = +HEAPF64[$123 + ($i$256 * 320 | 0) + 216 >> 3]; + HEAPF64[$119 + (($171 | 2) << 3) >> 3] = +HEAPF64[$123 + ($i$256 * 320 | 0) + 224 >> 3]; + HEAPF64[$119 + (($171 | 3) << 3) >> 3] = +HEAPF64[$123 + ($i$256 * 320 | 0) + 232 >> 3]; + HEAPF64[$119 + ($171 + 4 << 3) >> 3] = +HEAPF64[$123 + ($i$256 * 320 | 0) + 240 >> 3]; + HEAPF64[$119 + ($171 + 5 << 3) >> 3] = +HEAPF64[$123 + ($i$256 * 320 | 0) + 248 >> 3]; + HEAPF64[$119 + ($171 + 6 << 3) >> 3] = +HEAPF64[$123 + ($i$256 * 320 | 0) + 256 >> 3]; + HEAPF64[$119 + ($171 + 7 << 3) >> 3] = +HEAPF64[$123 + ($i$256 * 320 | 0) + 264 >> 3]; + HEAPF64[$119 + ($171 + 8 << 3) >> 3] = +HEAPF64[$123 + ($i$256 * 320 | 0) + 272 >> 3]; + HEAPF64[$119 + ($171 + 9 << 3) >> 3] = +HEAPF64[$123 + ($i$256 * 320 | 0) + 280 >> 3]; + $209 = HEAP32[$config >> 2] | 0; + HEAPF64[$119 + ($171 + 10 << 3) >> 3] = +HEAPF64[$209 + ($i$256 * 320 | 0) + 288 >> 3]; + HEAPF64[$119 + ($171 + 11 << 3) >> 3] = +HEAPF64[$209 + ($i$256 * 320 | 0) + 296 >> 3]; + $j$4 = $j$357 + 1 | 0; + } + $i$256 = $i$256 + 1 | 0; + if (($i$256 | 0) >= ($121 | 0)) break; else $j$357 = $j$4; + } + } + $221 = $config + 104 | 0; + $224 = ($robustFlag | 0) != 0; + if (!(HEAP32[$221 >> 2] | 0)) { + $225 = $config + 8 | 0; + $226 = +_arGetTransMat($handle, $trans2, $116, $119, $114, $225); + if ($224 & $226 >= 20.0) { + _icpSetInlierProbability(HEAP32[$handle >> 2] | 0, .8) | 0; + $229 = +_arGetTransMatRobust($handle, $trans2, $116, $119, $114, $225); + if (!($229 >= 20.0)) $err$0 = $229; else { + _icpSetInlierProbability(HEAP32[$handle >> 2] | 0, .6) | 0; + $232 = +_arGetTransMatRobust($handle, $trans2, $116, $119, $114, $225); + if (!($232 >= 20.0)) $err$0 = $232; else { + _icpSetInlierProbability(HEAP32[$handle >> 2] | 0, .4) | 0; + $235 = +_arGetTransMatRobust($handle, $trans2, $116, $119, $114, $225); + if (!($235 >= 20.0)) $err$0 = $235; else { + _icpSetInlierProbability(HEAP32[$handle >> 2] | 0, 0.0) | 0; + $err$0 = +_arGetTransMatRobust($handle, $trans2, $116, $119, $114, $225); + } + } + } + } else $err$0 = $226; + _free($119); + _free($116); + $err$6 = $err$0; + } else { + $239 = +_arGetTransMat($handle, $trans2, $116, $119, $114, $trans1); + $240 = $config + 8 | 0; + $241 = +_arGetTransMat($handle, $240, $116, $119, $114, $240); + $242 = $239 < $241; + do if ($224) { + if ($242) { + $j$553 = 0; + do { + HEAPF64[$config + 8 + ($j$553 << 5) >> 3] = +HEAPF64[$trans1 + ($j$553 << 5) >> 3]; + HEAPF64[$config + 8 + ($j$553 << 5) + 8 >> 3] = +HEAPF64[$trans1 + ($j$553 << 5) + 8 >> 3]; + HEAPF64[$config + 8 + ($j$553 << 5) + 16 >> 3] = +HEAPF64[$trans1 + ($j$553 << 5) + 16 >> 3]; + HEAPF64[$config + 8 + ($j$553 << 5) + 24 >> 3] = +HEAPF64[$trans1 + ($j$553 << 5) + 24 >> 3]; + $j$553 = $j$553 + 1 | 0; + } while (($j$553 | 0) != 3); + $err$1 = $239; + } else $err$1 = $241; + if (!($err$1 >= 20.0)) $err$5 = $err$1; else { + _icpSetInlierProbability(HEAP32[$handle >> 2] | 0, .8) | 0; + $258 = +_arGetTransMatRobust($handle, $trans2, $116, $119, $114, $trans1); + $259 = +_arGetTransMatRobust($handle, $240, $116, $119, $114, $240); + if ($258 < $259) { + $j$651 = 0; + do { + HEAPF64[$config + 8 + ($j$651 << 5) >> 3] = +HEAPF64[$trans1 + ($j$651 << 5) >> 3]; + HEAPF64[$config + 8 + ($j$651 << 5) + 8 >> 3] = +HEAPF64[$trans1 + ($j$651 << 5) + 8 >> 3]; + HEAPF64[$config + 8 + ($j$651 << 5) + 16 >> 3] = +HEAPF64[$trans1 + ($j$651 << 5) + 16 >> 3]; + HEAPF64[$config + 8 + ($j$651 << 5) + 24 >> 3] = +HEAPF64[$trans1 + ($j$651 << 5) + 24 >> 3]; + $j$651 = $j$651 + 1 | 0; + } while (($j$651 | 0) != 3); + $err$2 = $258; + } else $err$2 = $259; + if (!($err$2 >= 20.0)) $err$5 = $err$2; else { + _icpSetInlierProbability(HEAP32[$handle >> 2] | 0, .6) | 0; + $276 = +_arGetTransMatRobust($handle, $trans2, $116, $119, $114, $trans1); + $277 = +_arGetTransMatRobust($handle, $240, $116, $119, $114, $240); + if ($276 < $277) { + $j$749 = 0; + do { + HEAPF64[$config + 8 + ($j$749 << 5) >> 3] = +HEAPF64[$trans1 + ($j$749 << 5) >> 3]; + HEAPF64[$config + 8 + ($j$749 << 5) + 8 >> 3] = +HEAPF64[$trans1 + ($j$749 << 5) + 8 >> 3]; + HEAPF64[$config + 8 + ($j$749 << 5) + 16 >> 3] = +HEAPF64[$trans1 + ($j$749 << 5) + 16 >> 3]; + HEAPF64[$config + 8 + ($j$749 << 5) + 24 >> 3] = +HEAPF64[$trans1 + ($j$749 << 5) + 24 >> 3]; + $j$749 = $j$749 + 1 | 0; + } while (($j$749 | 0) != 3); + $err$3 = $276; + } else $err$3 = $277; + if (!($err$3 >= 20.0)) $err$5 = $err$3; else { + _icpSetInlierProbability(HEAP32[$handle >> 2] | 0, .4) | 0; + $294 = +_arGetTransMatRobust($handle, $trans2, $116, $119, $114, $trans1); + $295 = +_arGetTransMatRobust($handle, $240, $116, $119, $114, $240); + if ($294 < $295) { + $j$847 = 0; + do { + HEAPF64[$config + 8 + ($j$847 << 5) >> 3] = +HEAPF64[$trans1 + ($j$847 << 5) >> 3]; + HEAPF64[$config + 8 + ($j$847 << 5) + 8 >> 3] = +HEAPF64[$trans1 + ($j$847 << 5) + 8 >> 3]; + HEAPF64[$config + 8 + ($j$847 << 5) + 16 >> 3] = +HEAPF64[$trans1 + ($j$847 << 5) + 16 >> 3]; + HEAPF64[$config + 8 + ($j$847 << 5) + 24 >> 3] = +HEAPF64[$trans1 + ($j$847 << 5) + 24 >> 3]; + $j$847 = $j$847 + 1 | 0; + } while (($j$847 | 0) != 3); + $err$4 = $294; + } else $err$4 = $295; + if (!($err$4 >= 20.0)) $err$5 = $err$4; else { + _icpSetInlierProbability(HEAP32[$handle >> 2] | 0, 0.0) | 0; + $312 = +_arGetTransMatRobust($handle, $trans2, $116, $119, $114, $trans1); + $313 = +_arGetTransMatRobust($handle, $240, $116, $119, $114, $240); + if ($312 < $313) $j$945 = 0; else { + $err$5 = $313; + break; + } + do { + HEAPF64[$config + 8 + ($j$945 << 5) >> 3] = +HEAPF64[$trans1 + ($j$945 << 5) >> 3]; + HEAPF64[$config + 8 + ($j$945 << 5) + 8 >> 3] = +HEAPF64[$trans1 + ($j$945 << 5) + 8 >> 3]; + HEAPF64[$config + 8 + ($j$945 << 5) + 16 >> 3] = +HEAPF64[$trans1 + ($j$945 << 5) + 16 >> 3]; + HEAPF64[$config + 8 + ($j$945 << 5) + 24 >> 3] = +HEAPF64[$trans1 + ($j$945 << 5) + 24 >> 3]; + $j$945 = $j$945 + 1 | 0; + } while (($j$945 | 0) != 3); + $err$5 = $312; + } + } + } + } + } else if ($242) { + $j$1055 = 0; + do { + HEAPF64[$config + 8 + ($j$1055 << 5) >> 3] = +HEAPF64[$trans1 + ($j$1055 << 5) >> 3]; + HEAPF64[$config + 8 + ($j$1055 << 5) + 8 >> 3] = +HEAPF64[$trans1 + ($j$1055 << 5) + 8 >> 3]; + HEAPF64[$config + 8 + ($j$1055 << 5) + 16 >> 3] = +HEAPF64[$trans1 + ($j$1055 << 5) + 16 >> 3]; + HEAPF64[$config + 8 + ($j$1055 << 5) + 24 >> 3] = +HEAPF64[$trans1 + ($j$1055 << 5) + 24 >> 3]; + $j$1055 = $j$1055 + 1 | 0; + } while (($j$1055 | 0) != 3); + $err$5 = $239; + } else $err$5 = $241; while (0); + _free($119); + _free($116); + $err$6 = $err$5; + } + if ($err$6 < 20.0) { + HEAP32[$221 >> 2] = 1; + $$0 = $err$6; + break; + } + HEAP32[$221 >> 2] = 0; + $342 = HEAP32[$0 >> 2] | 0; + if (($342 | 0) > 0) { + $344 = HEAP32[$config >> 2] | 0; + $i$942 = 0; + do { + $346 = HEAP32[$344 + ($i$942 * 320 | 0) + 304 >> 2] | 0; + if (($346 | 0) >= 0) { + $348 = $marker_info + ($346 << 8) + 236 | 0; + if (!(HEAP32[$348 >> 2] | 0)) HEAP32[$348 >> 2] = 8; + } + $i$942 = $i$942 + 1 | 0; + } while (($i$942 | 0) < ($342 | 0)); + $$0 = $err$6; + } else $$0 = $err$6; + } while (0); + if ((label | 0) == 38) { + HEAP32[$config + 104 >> 2] = 0; + $$0 = -1.0; + } + STACKTOP = sp; + return +$$0; +} + +function __ZNSt3__112__next_primeEj($n) { + $n = $n | 0; + var $$ = 0, $$0 = 0, $$k0$0 = 0, $0 = 0, $1 = 0, $103 = 0, $104 = 0, $108 = 0, $109 = 0, $113 = 0, $114 = 0, $118 = 0, $119 = 0, $12 = 0, $123 = 0, $124 = 0, $128 = 0, $129 = 0, $133 = 0, $134 = 0, $138 = 0, $139 = 0, $143 = 0, $144 = 0, $148 = 0, $149 = 0, $153 = 0, $154 = 0, $158 = 0, $159 = 0, $163 = 0, $164 = 0, $168 = 0, $169 = 0, $173 = 0, $174 = 0, $178 = 0, $179 = 0, $18 = 0, $183 = 0, $184 = 0, $188 = 0, $189 = 0, $19 = 0, $193 = 0, $194 = 0, $198 = 0, $199 = 0, $2 = 0, $203 = 0, $204 = 0, $208 = 0, $209 = 0, $213 = 0, $214 = 0, $218 = 0, $219 = 0, $223 = 0, $224 = 0, $228 = 0, $229 = 0, $233 = 0, $234 = 0, $238 = 0, $239 = 0, $24 = 0, $243 = 0, $244 = 0, $248 = 0, $249 = 0, $253 = 0, $254 = 0, $258 = 0, $259 = 0, $264 = 0, $265 = 0, $28 = 0, $29 = 0, $33 = 0, $34 = 0, $38 = 0, $39 = 0, $4 = 0, $43 = 0, $44 = 0, $48 = 0, $49 = 0, $53 = 0, $54 = 0, $58 = 0, $59 = 0, $6 = 0, $63 = 0, $64 = 0, $68 = 0, $69 = 0, $7 = 0, $73 = 0, $74 = 0, $78 = 0, $79 = 0, $83 = 0, $84 = 0, $88 = 0, $89 = 0, $93 = 0, $94 = 0, $98 = 0, $99 = 0, $i$0 = 0, $in$0 = 0, $j$0 = 0, $k0$0 = 0, $storemerge = 0, $storemerge$lcssa = 0, $storemerge$lcssa15 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $0 = sp + 8 | 0; + $1 = sp + 4 | 0; + $2 = sp; + HEAP32[$1 >> 2] = $n; + do if ($n >>> 0 < 212) { + $4 = __ZNSt3__113__lower_boundIRNS_6__lessIjjEEPKjjEET0_S6_S6_RKT1_T_(3520, 3712, $1, $0) | 0; + $$0 = HEAP32[$4 >> 2] | 0; + } else { + $6 = ($n >>> 0) / 210 | 0; + $7 = $6 * 210 | 0; + HEAP32[$2 >> 2] = $n - $7; + $12 = (__ZNSt3__113__lower_boundIRNS_6__lessIjjEEPKjjEET0_S6_S6_RKT1_T_(3712, 3904, $2, $0) | 0) - 3712 >> 2; + $in$0 = $12; + $k0$0 = $6; + $storemerge = (HEAP32[3712 + ($12 << 2) >> 2] | 0) + $7 | 0; + L4 : while (1) { + $j$0 = 5; + while (1) { + if ($j$0 >>> 0 >= 47) { + $i$0 = 211; + label = 8; + break; + } + $18 = HEAP32[3520 + ($j$0 << 2) >> 2] | 0; + $19 = ($storemerge >>> 0) / ($18 >>> 0) | 0; + if ($19 >>> 0 < $18 >>> 0) { + $storemerge$lcssa15 = $storemerge; + label = 106; + break L4; + } + if (($storemerge | 0) == (Math_imul($19, $18) | 0)) break; else $j$0 = $j$0 + 1 | 0; + } + L10 : do if ((label | 0) == 8) while (1) { + label = 0; + $24 = ($storemerge >>> 0) / ($i$0 >>> 0) | 0; + if ($24 >>> 0 < $i$0 >>> 0) { + $storemerge$lcssa = $storemerge; + label = 105; + break L4; + } + if (($storemerge | 0) == (Math_imul($24, $i$0) | 0)) break L10; + $28 = $i$0 + 10 | 0; + $29 = ($storemerge >>> 0) / ($28 >>> 0) | 0; + if ($29 >>> 0 < $28 >>> 0) { + $storemerge$lcssa = $storemerge; + label = 105; + break L4; + } + if (($storemerge | 0) == (Math_imul($29, $28) | 0)) break L10; + $33 = $i$0 + 12 | 0; + $34 = ($storemerge >>> 0) / ($33 >>> 0) | 0; + if ($34 >>> 0 < $33 >>> 0) { + $storemerge$lcssa = $storemerge; + label = 105; + break L4; + } + if (($storemerge | 0) == (Math_imul($34, $33) | 0)) break L10; + $38 = $i$0 + 16 | 0; + $39 = ($storemerge >>> 0) / ($38 >>> 0) | 0; + if ($39 >>> 0 < $38 >>> 0) { + $storemerge$lcssa = $storemerge; + label = 105; + break L4; + } + if (($storemerge | 0) == (Math_imul($39, $38) | 0)) break L10; + $43 = $i$0 + 18 | 0; + $44 = ($storemerge >>> 0) / ($43 >>> 0) | 0; + if ($44 >>> 0 < $43 >>> 0) { + $storemerge$lcssa = $storemerge; + label = 105; + break L4; + } + if (($storemerge | 0) == (Math_imul($44, $43) | 0)) break L10; + $48 = $i$0 + 22 | 0; + $49 = ($storemerge >>> 0) / ($48 >>> 0) | 0; + if ($49 >>> 0 < $48 >>> 0) { + $storemerge$lcssa = $storemerge; + label = 105; + break L4; + } + if (($storemerge | 0) == (Math_imul($49, $48) | 0)) break L10; + $53 = $i$0 + 28 | 0; + $54 = ($storemerge >>> 0) / ($53 >>> 0) | 0; + if ($54 >>> 0 < $53 >>> 0) { + $storemerge$lcssa = $storemerge; + label = 105; + break L4; + } + if (($storemerge | 0) == (Math_imul($54, $53) | 0)) break L10; + $58 = $i$0 + 30 | 0; + $59 = ($storemerge >>> 0) / ($58 >>> 0) | 0; + if ($59 >>> 0 < $58 >>> 0) { + $storemerge$lcssa = $storemerge; + label = 105; + break L4; + } + if (($storemerge | 0) == (Math_imul($59, $58) | 0)) break L10; + $63 = $i$0 + 36 | 0; + $64 = ($storemerge >>> 0) / ($63 >>> 0) | 0; + if ($64 >>> 0 < $63 >>> 0) { + $storemerge$lcssa = $storemerge; + label = 105; + break L4; + } + if (($storemerge | 0) == (Math_imul($64, $63) | 0)) break L10; + $68 = $i$0 + 40 | 0; + $69 = ($storemerge >>> 0) / ($68 >>> 0) | 0; + if ($69 >>> 0 < $68 >>> 0) { + $storemerge$lcssa = $storemerge; + label = 105; + break L4; + } + if (($storemerge | 0) == (Math_imul($69, $68) | 0)) break L10; + $73 = $i$0 + 42 | 0; + $74 = ($storemerge >>> 0) / ($73 >>> 0) | 0; + if ($74 >>> 0 < $73 >>> 0) { + $storemerge$lcssa = $storemerge; + label = 105; + break L4; + } + if (($storemerge | 0) == (Math_imul($74, $73) | 0)) break L10; + $78 = $i$0 + 46 | 0; + $79 = ($storemerge >>> 0) / ($78 >>> 0) | 0; + if ($79 >>> 0 < $78 >>> 0) { + $storemerge$lcssa = $storemerge; + label = 105; + break L4; + } + if (($storemerge | 0) == (Math_imul($79, $78) | 0)) break L10; + $83 = $i$0 + 52 | 0; + $84 = ($storemerge >>> 0) / ($83 >>> 0) | 0; + if ($84 >>> 0 < $83 >>> 0) { + $storemerge$lcssa = $storemerge; + label = 105; + break L4; + } + if (($storemerge | 0) == (Math_imul($84, $83) | 0)) break L10; + $88 = $i$0 + 58 | 0; + $89 = ($storemerge >>> 0) / ($88 >>> 0) | 0; + if ($89 >>> 0 < $88 >>> 0) { + $storemerge$lcssa = $storemerge; + label = 105; + break L4; + } + if (($storemerge | 0) == (Math_imul($89, $88) | 0)) break L10; + $93 = $i$0 + 60 | 0; + $94 = ($storemerge >>> 0) / ($93 >>> 0) | 0; + if ($94 >>> 0 < $93 >>> 0) { + $storemerge$lcssa = $storemerge; + label = 105; + break L4; + } + if (($storemerge | 0) == (Math_imul($94, $93) | 0)) break L10; + $98 = $i$0 + 66 | 0; + $99 = ($storemerge >>> 0) / ($98 >>> 0) | 0; + if ($99 >>> 0 < $98 >>> 0) { + $storemerge$lcssa = $storemerge; + label = 105; + break L4; + } + if (($storemerge | 0) == (Math_imul($99, $98) | 0)) break L10; + $103 = $i$0 + 70 | 0; + $104 = ($storemerge >>> 0) / ($103 >>> 0) | 0; + if ($104 >>> 0 < $103 >>> 0) { + $storemerge$lcssa = $storemerge; + label = 105; + break L4; + } + if (($storemerge | 0) == (Math_imul($104, $103) | 0)) break L10; + $108 = $i$0 + 72 | 0; + $109 = ($storemerge >>> 0) / ($108 >>> 0) | 0; + if ($109 >>> 0 < $108 >>> 0) { + $storemerge$lcssa = $storemerge; + label = 105; + break L4; + } + if (($storemerge | 0) == (Math_imul($109, $108) | 0)) break L10; + $113 = $i$0 + 78 | 0; + $114 = ($storemerge >>> 0) / ($113 >>> 0) | 0; + if ($114 >>> 0 < $113 >>> 0) { + $storemerge$lcssa = $storemerge; + label = 105; + break L4; + } + if (($storemerge | 0) == (Math_imul($114, $113) | 0)) break L10; + $118 = $i$0 + 82 | 0; + $119 = ($storemerge >>> 0) / ($118 >>> 0) | 0; + if ($119 >>> 0 < $118 >>> 0) { + $storemerge$lcssa = $storemerge; + label = 105; + break L4; + } + if (($storemerge | 0) == (Math_imul($119, $118) | 0)) break L10; + $123 = $i$0 + 88 | 0; + $124 = ($storemerge >>> 0) / ($123 >>> 0) | 0; + if ($124 >>> 0 < $123 >>> 0) { + $storemerge$lcssa = $storemerge; + label = 105; + break L4; + } + if (($storemerge | 0) == (Math_imul($124, $123) | 0)) break L10; + $128 = $i$0 + 96 | 0; + $129 = ($storemerge >>> 0) / ($128 >>> 0) | 0; + if ($129 >>> 0 < $128 >>> 0) { + $storemerge$lcssa = $storemerge; + label = 105; + break L4; + } + if (($storemerge | 0) == (Math_imul($129, $128) | 0)) break L10; + $133 = $i$0 + 100 | 0; + $134 = ($storemerge >>> 0) / ($133 >>> 0) | 0; + if ($134 >>> 0 < $133 >>> 0) { + $storemerge$lcssa = $storemerge; + label = 105; + break L4; + } + if (($storemerge | 0) == (Math_imul($134, $133) | 0)) break L10; + $138 = $i$0 + 102 | 0; + $139 = ($storemerge >>> 0) / ($138 >>> 0) | 0; + if ($139 >>> 0 < $138 >>> 0) { + $storemerge$lcssa = $storemerge; + label = 105; + break L4; + } + if (($storemerge | 0) == (Math_imul($139, $138) | 0)) break L10; + $143 = $i$0 + 106 | 0; + $144 = ($storemerge >>> 0) / ($143 >>> 0) | 0; + if ($144 >>> 0 < $143 >>> 0) { + $storemerge$lcssa = $storemerge; + label = 105; + break L4; + } + if (($storemerge | 0) == (Math_imul($144, $143) | 0)) break L10; + $148 = $i$0 + 108 | 0; + $149 = ($storemerge >>> 0) / ($148 >>> 0) | 0; + if ($149 >>> 0 < $148 >>> 0) { + $storemerge$lcssa = $storemerge; + label = 105; + break L4; + } + if (($storemerge | 0) == (Math_imul($149, $148) | 0)) break L10; + $153 = $i$0 + 112 | 0; + $154 = ($storemerge >>> 0) / ($153 >>> 0) | 0; + if ($154 >>> 0 < $153 >>> 0) { + $storemerge$lcssa = $storemerge; + label = 105; + break L4; + } + if (($storemerge | 0) == (Math_imul($154, $153) | 0)) break L10; + $158 = $i$0 + 120 | 0; + $159 = ($storemerge >>> 0) / ($158 >>> 0) | 0; + if ($159 >>> 0 < $158 >>> 0) { + $storemerge$lcssa = $storemerge; + label = 105; + break L4; + } + if (($storemerge | 0) == (Math_imul($159, $158) | 0)) break L10; + $163 = $i$0 + 126 | 0; + $164 = ($storemerge >>> 0) / ($163 >>> 0) | 0; + if ($164 >>> 0 < $163 >>> 0) { + $storemerge$lcssa = $storemerge; + label = 105; + break L4; + } + if (($storemerge | 0) == (Math_imul($164, $163) | 0)) break L10; + $168 = $i$0 + 130 | 0; + $169 = ($storemerge >>> 0) / ($168 >>> 0) | 0; + if ($169 >>> 0 < $168 >>> 0) { + $storemerge$lcssa = $storemerge; + label = 105; + break L4; + } + if (($storemerge | 0) == (Math_imul($169, $168) | 0)) break L10; + $173 = $i$0 + 136 | 0; + $174 = ($storemerge >>> 0) / ($173 >>> 0) | 0; + if ($174 >>> 0 < $173 >>> 0) { + $storemerge$lcssa = $storemerge; + label = 105; + break L4; + } + if (($storemerge | 0) == (Math_imul($174, $173) | 0)) break L10; + $178 = $i$0 + 138 | 0; + $179 = ($storemerge >>> 0) / ($178 >>> 0) | 0; + if ($179 >>> 0 < $178 >>> 0) { + $storemerge$lcssa = $storemerge; + label = 105; + break L4; + } + if (($storemerge | 0) == (Math_imul($179, $178) | 0)) break L10; + $183 = $i$0 + 142 | 0; + $184 = ($storemerge >>> 0) / ($183 >>> 0) | 0; + if ($184 >>> 0 < $183 >>> 0) { + $storemerge$lcssa = $storemerge; + label = 105; + break L4; + } + if (($storemerge | 0) == (Math_imul($184, $183) | 0)) break L10; + $188 = $i$0 + 148 | 0; + $189 = ($storemerge >>> 0) / ($188 >>> 0) | 0; + if ($189 >>> 0 < $188 >>> 0) { + $storemerge$lcssa = $storemerge; + label = 105; + break L4; + } + if (($storemerge | 0) == (Math_imul($189, $188) | 0)) break L10; + $193 = $i$0 + 150 | 0; + $194 = ($storemerge >>> 0) / ($193 >>> 0) | 0; + if ($194 >>> 0 < $193 >>> 0) { + $storemerge$lcssa = $storemerge; + label = 105; + break L4; + } + if (($storemerge | 0) == (Math_imul($194, $193) | 0)) break L10; + $198 = $i$0 + 156 | 0; + $199 = ($storemerge >>> 0) / ($198 >>> 0) | 0; + if ($199 >>> 0 < $198 >>> 0) { + $storemerge$lcssa = $storemerge; + label = 105; + break L4; + } + if (($storemerge | 0) == (Math_imul($199, $198) | 0)) break L10; + $203 = $i$0 + 162 | 0; + $204 = ($storemerge >>> 0) / ($203 >>> 0) | 0; + if ($204 >>> 0 < $203 >>> 0) { + $storemerge$lcssa = $storemerge; + label = 105; + break L4; + } + if (($storemerge | 0) == (Math_imul($204, $203) | 0)) break L10; + $208 = $i$0 + 166 | 0; + $209 = ($storemerge >>> 0) / ($208 >>> 0) | 0; + if ($209 >>> 0 < $208 >>> 0) { + $storemerge$lcssa = $storemerge; + label = 105; + break L4; + } + if (($storemerge | 0) == (Math_imul($209, $208) | 0)) break L10; + $213 = $i$0 + 168 | 0; + $214 = ($storemerge >>> 0) / ($213 >>> 0) | 0; + if ($214 >>> 0 < $213 >>> 0) { + $storemerge$lcssa = $storemerge; + label = 105; + break L4; + } + if (($storemerge | 0) == (Math_imul($214, $213) | 0)) break L10; + $218 = $i$0 + 172 | 0; + $219 = ($storemerge >>> 0) / ($218 >>> 0) | 0; + if ($219 >>> 0 < $218 >>> 0) { + $storemerge$lcssa = $storemerge; + label = 105; + break L4; + } + if (($storemerge | 0) == (Math_imul($219, $218) | 0)) break L10; + $223 = $i$0 + 178 | 0; + $224 = ($storemerge >>> 0) / ($223 >>> 0) | 0; + if ($224 >>> 0 < $223 >>> 0) { + $storemerge$lcssa = $storemerge; + label = 105; + break L4; + } + if (($storemerge | 0) == (Math_imul($224, $223) | 0)) break L10; + $228 = $i$0 + 180 | 0; + $229 = ($storemerge >>> 0) / ($228 >>> 0) | 0; + if ($229 >>> 0 < $228 >>> 0) { + $storemerge$lcssa = $storemerge; + label = 105; + break L4; + } + if (($storemerge | 0) == (Math_imul($229, $228) | 0)) break L10; + $233 = $i$0 + 186 | 0; + $234 = ($storemerge >>> 0) / ($233 >>> 0) | 0; + if ($234 >>> 0 < $233 >>> 0) { + $storemerge$lcssa = $storemerge; + label = 105; + break L4; + } + if (($storemerge | 0) == (Math_imul($234, $233) | 0)) break L10; + $238 = $i$0 + 190 | 0; + $239 = ($storemerge >>> 0) / ($238 >>> 0) | 0; + if ($239 >>> 0 < $238 >>> 0) { + $storemerge$lcssa = $storemerge; + label = 105; + break L4; + } + if (($storemerge | 0) == (Math_imul($239, $238) | 0)) break L10; + $243 = $i$0 + 192 | 0; + $244 = ($storemerge >>> 0) / ($243 >>> 0) | 0; + if ($244 >>> 0 < $243 >>> 0) { + $storemerge$lcssa = $storemerge; + label = 105; + break L4; + } + if (($storemerge | 0) == (Math_imul($244, $243) | 0)) break L10; + $248 = $i$0 + 196 | 0; + $249 = ($storemerge >>> 0) / ($248 >>> 0) | 0; + if ($249 >>> 0 < $248 >>> 0) { + $storemerge$lcssa = $storemerge; + label = 105; + break L4; + } + if (($storemerge | 0) == (Math_imul($249, $248) | 0)) break L10; + $253 = $i$0 + 198 | 0; + $254 = ($storemerge >>> 0) / ($253 >>> 0) | 0; + if ($254 >>> 0 < $253 >>> 0) { + $storemerge$lcssa = $storemerge; + label = 105; + break L4; + } + if (($storemerge | 0) == (Math_imul($254, $253) | 0)) break L10; + $258 = $i$0 + 208 | 0; + $259 = ($storemerge >>> 0) / ($258 >>> 0) | 0; + if ($259 >>> 0 < $258 >>> 0) { + $storemerge$lcssa = $storemerge; + label = 105; + break L4; + } + if (($storemerge | 0) == (Math_imul($259, $258) | 0)) break; else { + $i$0 = $i$0 + 210 | 0; + label = 8; + } + } while (0); + $264 = $in$0 + 1 | 0; + $265 = ($264 | 0) == 48; + $$ = $265 ? 0 : $264; + $$k0$0 = ($265 & 1) + $k0$0 | 0; + $in$0 = $$; + $k0$0 = $$k0$0; + $storemerge = (HEAP32[3712 + ($$ << 2) >> 2] | 0) + ($$k0$0 * 210 | 0) | 0; + } + if ((label | 0) == 105) { + HEAP32[$1 >> 2] = $storemerge$lcssa; + $$0 = $storemerge$lcssa; + break; + } else if ((label | 0) == 106) { + HEAP32[$1 >> 2] = $storemerge$lcssa15; + $$0 = $storemerge$lcssa15; + break; + } + } while (0); + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubEWZ($image, $xsize, $ysize, $image_thresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $image_thresh = $image_thresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $0 = 0, $1 = 0, $102 = 0, $105 = 0, $122 = 0, $124 = 0, $126 = 0, $130 = 0, $134 = 0, $137 = 0, $139 = 0, $143 = 0, $147 = 0, $151 = 0, $156 = 0, $158 = 0, $16 = 0, $162 = 0, $166 = 0, $17 = 0, $170 = 0, $176 = 0, $179 = 0, $18 = 0, $181 = 0, $185 = 0, $189 = 0, $193 = 0, $196 = 0, $201 = 0, $216 = 0, $217 = 0, $218 = 0, $219 = 0, $227 = 0, $229 = 0, $235 = 0, $239 = 0, $240 = 0, $247 = 0, $26 = 0, $261 = 0, $262 = 0, $265 = 0, $272 = 0, $273 = 0, $281 = 0, $284 = 0, $285 = 0, $289 = 0, $292 = 0, $296 = 0, $299 = 0, $303 = 0, $306 = 0, $31 = 0, $310 = 0, $314 = 0, $317 = 0, $318 = 0, $324 = 0, $34 = 0, $36 = 0, $40 = 0, $44 = 0, $50 = 0, $51 = 0, $54 = 0, $55 = 0, $56 = 0, $59 = 0, $62 = 0, $79 = 0, $81 = 0, $83 = 0, $87 = 0, $9 = 0, $91 = 0, $97 = 0, $dpnt$080 = 0, $dpnt$1$lcssa = 0, $dpnt$163 = 0, $i$096 = 0, $i$190 = 0, $i$270 = 0, $i$345 = 0, $i$443 = 0, $i$541 = 0, $i$640 = 0, $j$083 = 0, $j$1$lcssa = 0, $j$146 = 0, $j$2 = 0, $k$059 = 0, $k$156 = 0, $k$252 = 0, $k$349 = 0, $pnt$086 = 0, $pnt$1$lcssa = 0, $pnt$173 = 0, $pnt1$097 = 0, $pnt1$191 = 0, $pnt2$095 = 0, $pnt2$189 = 0, $pnt2$281 = 0, $pnt2$3$lcssa = 0, $pnt2$364 = 0, $pnt_thresh$085 = 0, $pnt_thresh$1$lcssa = 0, $pnt_thresh$172 = 0, $vararg_buffer = 0, $wk$060 = 0, $wk$157 = 0, $wk$253 = 0, $wk$350 = 0, $wk$447 = 0, $wk_max$0$lcssa = 0, $wk_max$082 = 0, $wk_max$1$lcssa = 0, $wk_max$165 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = HEAP32[$labelInfo >> 2] | 0; + $1 = $ysize + -1 | 0; + if (($xsize | 0) > 0) { + $i$096 = 0; + $pnt1$097 = $0; + $pnt2$095 = $0 + ((Math_imul($1, $xsize) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$095 >> 1] = 0; + HEAP16[$pnt1$097 >> 1] = 0; + $i$096 = $i$096 + 1 | 0; + if (($i$096 | 0) >= ($xsize | 0)) break; else { + $pnt1$097 = $pnt1$097 + 2 | 0; + $pnt2$095 = $pnt2$095 + 2 | 0; + } + } + } + $9 = $xsize + -1 | 0; + if (($ysize | 0) > 0) { + $i$190 = 0; + $pnt1$191 = $0; + $pnt2$189 = $0 + ($9 << 1) | 0; + while (1) { + HEAP16[$pnt2$189 >> 1] = 0; + HEAP16[$pnt1$191 >> 1] = 0; + $i$190 = $i$190 + 1 | 0; + if (($i$190 | 0) >= ($ysize | 0)) break; else { + $pnt1$191 = $pnt1$191 + ($xsize << 1) | 0; + $pnt2$189 = $pnt2$189 + ($xsize << 1) | 0; + } + } + } + $16 = $labelInfo + 1179664 | 0; + $17 = $xsize + 1 | 0; + $18 = 0 - $xsize | 0; + $$sum = 1 - $xsize | 0; + $$sum1 = ~$xsize; + L11 : do if (($1 | 0) > 1) { + $26 = ($9 | 0) > 1; + $dpnt$080 = (HEAP32[$labelInfo + 4 >> 2] | 0) + $17 | 0; + $j$083 = 1; + $pnt$086 = $image + $17 | 0; + $pnt2$281 = $0 + ($17 << 1) | 0; + $pnt_thresh$085 = $image_thresh + $17 | 0; + $wk_max$082 = 0; + L13 : while (1) { + if ($26) { + $dpnt$163 = $dpnt$080; + $i$270 = 1; + $pnt$173 = $pnt$086; + $pnt2$364 = $pnt2$281; + $pnt_thresh$172 = $pnt_thresh$085; + $wk_max$165 = $wk_max$082; + while (1) { + do if ((HEAPU8[$pnt$173 >> 0] | 0) > (HEAPU8[$pnt_thresh$172 >> 0] | 0)) { + HEAP8[$dpnt$163 >> 0] = -1; + $31 = HEAP16[$pnt2$364 + ($18 << 1) >> 1] | 0; + if ($31 << 16 >> 16 > 0) { + HEAP16[$pnt2$364 >> 1] = $31; + $34 = ($31 << 16 >> 16) * 7 | 0; + $36 = $labelInfo + 1310736 + ($34 + -7 << 2) | 0; + HEAP32[$36 >> 2] = (HEAP32[$36 >> 2] | 0) + 1; + $40 = $labelInfo + 1310736 + ($34 + -6 << 2) | 0; + HEAP32[$40 >> 2] = (HEAP32[$40 >> 2] | 0) + $i$270; + $44 = $labelInfo + 1310736 + ($34 + -5 << 2) | 0; + HEAP32[$44 >> 2] = (HEAP32[$44 >> 2] | 0) + $j$083; + HEAP32[$labelInfo + 1310736 + ($34 + -1 << 2) >> 2] = $j$083; + $wk_max$2 = $wk_max$165; + break; + } + $50 = HEAP16[$pnt2$364 + ($$sum << 1) >> 1] | 0; + $51 = $50 << 16 >> 16; + $54 = HEAP16[$pnt2$364 + ($$sum1 << 1) >> 1] | 0; + $55 = $54 << 16 >> 16; + $56 = $54 << 16 >> 16 > 0; + if ($50 << 16 >> 16 <= 0) { + if ($56) { + HEAP16[$pnt2$364 >> 1] = $54; + $156 = $55 * 7 | 0; + $158 = $labelInfo + 1310736 + ($156 + -7 << 2) | 0; + HEAP32[$158 >> 2] = (HEAP32[$158 >> 2] | 0) + 1; + $162 = $labelInfo + 1310736 + ($156 + -6 << 2) | 0; + HEAP32[$162 >> 2] = (HEAP32[$162 >> 2] | 0) + $i$270; + $166 = $labelInfo + 1310736 + ($156 + -5 << 2) | 0; + HEAP32[$166 >> 2] = (HEAP32[$166 >> 2] | 0) + $j$083; + $170 = $labelInfo + 1310736 + ($156 + -3 << 2) | 0; + if ((HEAP32[$170 >> 2] | 0) < ($i$270 | 0)) HEAP32[$170 >> 2] = $i$270; + HEAP32[$labelInfo + 1310736 + ($156 + -1 << 2) >> 2] = $j$083; + $wk_max$2 = $wk_max$165; + break; + } + $176 = HEAP16[$pnt2$364 + -2 >> 1] | 0; + if ($176 << 16 >> 16 > 0) { + HEAP16[$pnt2$364 >> 1] = $176; + $179 = ($176 << 16 >> 16) * 7 | 0; + $181 = $labelInfo + 1310736 + ($179 + -7 << 2) | 0; + HEAP32[$181 >> 2] = (HEAP32[$181 >> 2] | 0) + 1; + $185 = $labelInfo + 1310736 + ($179 + -6 << 2) | 0; + HEAP32[$185 >> 2] = (HEAP32[$185 >> 2] | 0) + $i$270; + $189 = $labelInfo + 1310736 + ($179 + -5 << 2) | 0; + HEAP32[$189 >> 2] = (HEAP32[$189 >> 2] | 0) + $j$083; + $193 = $labelInfo + 1310736 + ($179 + -3 << 2) | 0; + if ((HEAP32[$193 >> 2] | 0) >= ($i$270 | 0)) { + $wk_max$2 = $wk_max$165; + break; + } + HEAP32[$193 >> 2] = $i$270; + $wk_max$2 = $wk_max$165; + break; + } else { + $196 = $wk_max$165 + 1 | 0; + if (($wk_max$165 | 0) > 32767) break L13; + HEAP16[$pnt2$364 >> 1] = $196; + HEAP32[$labelInfo + 1179664 + ($wk_max$165 << 2) >> 2] = $196 << 16 >> 16; + $201 = $wk_max$165 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($201 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($201 + 1 << 2) >> 2] = $i$270; + HEAP32[$labelInfo + 1310736 + ($201 + 2 << 2) >> 2] = $j$083; + HEAP32[$labelInfo + 1310736 + ($201 + 3 << 2) >> 2] = $i$270; + HEAP32[$labelInfo + 1310736 + ($201 + 4 << 2) >> 2] = $i$270; + HEAP32[$labelInfo + 1310736 + ($201 + 5 << 2) >> 2] = $j$083; + HEAP32[$labelInfo + 1310736 + ($201 + 6 << 2) >> 2] = $j$083; + $wk_max$2 = $196; + break; + } + } + if ($56) { + $59 = HEAP32[$labelInfo + 1179664 + ($51 + -1 << 2) >> 2] | 0; + $62 = HEAP32[$labelInfo + 1179664 + ($55 + -1 << 2) >> 2] | 0; + if (($59 | 0) > ($62 | 0)) { + HEAP16[$pnt2$364 >> 1] = $62; + if (($wk_max$165 | 0) > 0) { + $k$059 = 0; + $wk$060 = $16; + while (1) { + if ((HEAP32[$wk$060 >> 2] | 0) == ($59 | 0)) HEAP32[$wk$060 >> 2] = $62; + $k$059 = $k$059 + 1 | 0; + if (($k$059 | 0) >= ($wk_max$165 | 0)) { + $79 = $62; + break; + } else $wk$060 = $wk$060 + 4 | 0; + } + } else $79 = $62; + } else { + HEAP16[$pnt2$364 >> 1] = $59; + if (($59 | 0) < ($62 | 0) & ($wk_max$165 | 0) > 0) { + $k$156 = 0; + $wk$157 = $16; + while (1) { + if ((HEAP32[$wk$157 >> 2] | 0) == ($62 | 0)) HEAP32[$wk$157 >> 2] = $59; + $k$156 = $k$156 + 1 | 0; + if (($k$156 | 0) >= ($wk_max$165 | 0)) { + $79 = $59; + break; + } else $wk$157 = $wk$157 + 4 | 0; + } + } else $79 = $59; + } + $81 = ($79 << 16 >> 16) * 7 | 0; + $83 = $labelInfo + 1310736 + ($81 + -7 << 2) | 0; + HEAP32[$83 >> 2] = (HEAP32[$83 >> 2] | 0) + 1; + $87 = $labelInfo + 1310736 + ($81 + -6 << 2) | 0; + HEAP32[$87 >> 2] = (HEAP32[$87 >> 2] | 0) + $i$270; + $91 = $labelInfo + 1310736 + ($81 + -5 << 2) | 0; + HEAP32[$91 >> 2] = (HEAP32[$91 >> 2] | 0) + $j$083; + HEAP32[$labelInfo + 1310736 + ($81 + -1 << 2) >> 2] = $j$083; + $wk_max$2 = $wk_max$165; + break; + } + $97 = HEAP16[$pnt2$364 + -2 >> 1] | 0; + if ($97 << 16 >> 16 <= 0) { + HEAP16[$pnt2$364 >> 1] = $50; + $137 = $51 * 7 | 0; + $139 = $labelInfo + 1310736 + ($137 + -7 << 2) | 0; + HEAP32[$139 >> 2] = (HEAP32[$139 >> 2] | 0) + 1; + $143 = $labelInfo + 1310736 + ($137 + -6 << 2) | 0; + HEAP32[$143 >> 2] = (HEAP32[$143 >> 2] | 0) + $i$270; + $147 = $labelInfo + 1310736 + ($137 + -5 << 2) | 0; + HEAP32[$147 >> 2] = (HEAP32[$147 >> 2] | 0) + $j$083; + $151 = $labelInfo + 1310736 + ($137 + -4 << 2) | 0; + if ((HEAP32[$151 >> 2] | 0) > ($i$270 | 0)) HEAP32[$151 >> 2] = $i$270; + HEAP32[$labelInfo + 1310736 + ($137 + -1 << 2) >> 2] = $j$083; + $wk_max$2 = $wk_max$165; + break; + } + $102 = HEAP32[$labelInfo + 1179664 + ($51 + -1 << 2) >> 2] | 0; + $105 = HEAP32[$labelInfo + 1179664 + (($97 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($102 | 0) > ($105 | 0)) { + HEAP16[$pnt2$364 >> 1] = $105; + if (($wk_max$165 | 0) > 0) { + $k$252 = 0; + $wk$253 = $16; + while (1) { + if ((HEAP32[$wk$253 >> 2] | 0) == ($102 | 0)) HEAP32[$wk$253 >> 2] = $105; + $k$252 = $k$252 + 1 | 0; + if (($k$252 | 0) >= ($wk_max$165 | 0)) { + $122 = $105; + break; + } else $wk$253 = $wk$253 + 4 | 0; + } + } else $122 = $105; + } else { + HEAP16[$pnt2$364 >> 1] = $102; + if (($102 | 0) < ($105 | 0) & ($wk_max$165 | 0) > 0) { + $k$349 = 0; + $wk$350 = $16; + while (1) { + if ((HEAP32[$wk$350 >> 2] | 0) == ($105 | 0)) HEAP32[$wk$350 >> 2] = $102; + $k$349 = $k$349 + 1 | 0; + if (($k$349 | 0) >= ($wk_max$165 | 0)) { + $122 = $102; + break; + } else $wk$350 = $wk$350 + 4 | 0; + } + } else $122 = $102; + } + $124 = ($122 << 16 >> 16) * 7 | 0; + $126 = $labelInfo + 1310736 + ($124 + -7 << 2) | 0; + HEAP32[$126 >> 2] = (HEAP32[$126 >> 2] | 0) + 1; + $130 = $labelInfo + 1310736 + ($124 + -6 << 2) | 0; + HEAP32[$130 >> 2] = (HEAP32[$130 >> 2] | 0) + $i$270; + $134 = $labelInfo + 1310736 + ($124 + -5 << 2) | 0; + HEAP32[$134 >> 2] = (HEAP32[$134 >> 2] | 0) + $j$083; + $wk_max$2 = $wk_max$165; + } else { + HEAP16[$pnt2$364 >> 1] = 0; + HEAP8[$dpnt$163 >> 0] = 0; + $wk_max$2 = $wk_max$165; + } while (0); + $i$270 = $i$270 + 1 | 0; + $216 = $pnt$173 + 1 | 0; + $217 = $pnt_thresh$172 + 1 | 0; + $218 = $pnt2$364 + 2 | 0; + $219 = $dpnt$163 + 1 | 0; + if (($i$270 | 0) >= ($9 | 0)) { + $dpnt$1$lcssa = $219; + $pnt$1$lcssa = $216; + $pnt2$3$lcssa = $218; + $pnt_thresh$1$lcssa = $217; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $dpnt$163 = $219; + $pnt$173 = $216; + $pnt2$364 = $218; + $pnt_thresh$172 = $217; + $wk_max$165 = $wk_max$2; + } + } + } else { + $dpnt$1$lcssa = $dpnt$080; + $pnt$1$lcssa = $pnt$086; + $pnt2$3$lcssa = $pnt2$281; + $pnt_thresh$1$lcssa = $pnt_thresh$085; + $wk_max$1$lcssa = $wk_max$082; + } + $j$083 = $j$083 + 1 | 0; + if (($j$083 | 0) >= ($1 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $dpnt$080 = $dpnt$1$lcssa + 2 | 0; + $pnt$086 = $pnt$1$lcssa + 2 | 0; + $pnt2$281 = $pnt2$3$lcssa + 4 | 0; + $pnt_thresh$085 = $pnt_thresh$1$lcssa + 2 | 0; + $wk_max$082 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $227 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$345 = 1; + $j$146 = 1; + $wk$447 = $16; + while (1) { + $229 = HEAP32[$wk$447 >> 2] | 0; + if (($229 | 0) == ($i$345 | 0)) { + $235 = $j$146; + $j$2 = $j$146 + 1 | 0; + } else { + $235 = HEAP32[$labelInfo + 1179664 + ($229 + -1 << 2) >> 2] | 0; + $j$2 = $j$146; + } + HEAP32[$wk$447 >> 2] = $235; + if (($i$345 | 0) < ($wk_max$0$lcssa | 0)) { + $i$345 = $i$345 + 1 | 0; + $j$146 = $j$2; + $wk$447 = $wk$447 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $239 = $labelInfo + 8 | 0; + $240 = $j$1$lcssa + -1 | 0; + HEAP32[$239 >> 2] = $240; + if (!$240) $$0 = 0; else { + _memset($227 | 0, 0, $240 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $240 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$443 = 0; + do { + $247 = $i$443 << 2; + HEAP32[$labelInfo + 131084 + ($247 << 2) >> 2] = $xsize; + HEAP32[$labelInfo + 131084 + (($247 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($247 | 2) << 2) >> 2] = $ysize; + HEAP32[$labelInfo + 131084 + (($247 | 3) << 2) >> 2] = 0; + $i$443 = $i$443 + 1 | 0; + } while (($i$443 | 0) < (HEAP32[$239 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$541 = 0; + do { + $261 = (HEAP32[$labelInfo + 1179664 + ($i$541 << 2) >> 2] | 0) + -1 | 0; + $262 = $i$541 * 7 | 0; + $265 = $labelInfo + 12 + ($261 << 2) | 0; + HEAP32[$265 >> 2] = (HEAP32[$265 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($262 << 2) >> 2] | 0); + $272 = $261 << 1; + $273 = $labelInfo + 655376 + ($272 << 3) | 0; + HEAPF64[$273 >> 3] = +HEAPF64[$273 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($262 + 1 << 2) >> 2] | 0); + $281 = $labelInfo + 655376 + (($272 | 1) << 3) | 0; + HEAPF64[$281 >> 3] = +HEAPF64[$281 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($262 + 2 << 2) >> 2] | 0); + $284 = $261 << 2; + $285 = $labelInfo + 131084 + ($284 << 2) | 0; + $289 = HEAP32[$labelInfo + 1310736 + ($262 + 3 << 2) >> 2] | 0; + if ((HEAP32[$285 >> 2] | 0) > ($289 | 0)) HEAP32[$285 >> 2] = $289; + $292 = $labelInfo + 131084 + (($284 | 1) << 2) | 0; + $296 = HEAP32[$labelInfo + 1310736 + ($262 + 4 << 2) >> 2] | 0; + if ((HEAP32[$292 >> 2] | 0) < ($296 | 0)) HEAP32[$292 >> 2] = $296; + $299 = $labelInfo + 131084 + (($284 | 2) << 2) | 0; + $303 = HEAP32[$labelInfo + 1310736 + ($262 + 5 << 2) >> 2] | 0; + if ((HEAP32[$299 >> 2] | 0) > ($303 | 0)) HEAP32[$299 >> 2] = $303; + $306 = $labelInfo + 131084 + (($284 | 3) << 2) | 0; + $310 = HEAP32[$labelInfo + 1310736 + ($262 + 6 << 2) >> 2] | 0; + if ((HEAP32[$306 >> 2] | 0) < ($310 | 0)) HEAP32[$306 >> 2] = $310; + $i$541 = $i$541 + 1 | 0; + } while (($i$541 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$239 >> 2] | 0) > 0) { + $i$640 = 0; + do { + $314 = $labelInfo + 12 + ($i$640 << 2) | 0; + $317 = $i$640 << 1; + $318 = $labelInfo + 655376 + ($317 << 3) | 0; + HEAPF64[$318 >> 3] = +HEAPF64[$318 >> 3] / +(HEAP32[$314 >> 2] | 0); + $324 = $labelInfo + 655376 + (($317 | 1) << 3) | 0; + HEAPF64[$324 >> 3] = +HEAPF64[$324 >> 3] / +(HEAP32[$314 >> 2] | 0); + $i$640 = $i$640 + 1 | 0; + } while (($i$640 | 0) < (HEAP32[$239 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubEBZ($image, $xsize, $ysize, $image_thresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $image_thresh = $image_thresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $0 = 0, $1 = 0, $102 = 0, $105 = 0, $122 = 0, $124 = 0, $126 = 0, $130 = 0, $134 = 0, $137 = 0, $139 = 0, $143 = 0, $147 = 0, $151 = 0, $156 = 0, $158 = 0, $16 = 0, $162 = 0, $166 = 0, $17 = 0, $170 = 0, $176 = 0, $179 = 0, $18 = 0, $181 = 0, $185 = 0, $189 = 0, $193 = 0, $196 = 0, $201 = 0, $216 = 0, $217 = 0, $218 = 0, $219 = 0, $227 = 0, $229 = 0, $235 = 0, $239 = 0, $240 = 0, $247 = 0, $26 = 0, $261 = 0, $262 = 0, $265 = 0, $272 = 0, $273 = 0, $281 = 0, $284 = 0, $285 = 0, $289 = 0, $292 = 0, $296 = 0, $299 = 0, $303 = 0, $306 = 0, $31 = 0, $310 = 0, $314 = 0, $317 = 0, $318 = 0, $324 = 0, $34 = 0, $36 = 0, $40 = 0, $44 = 0, $50 = 0, $51 = 0, $54 = 0, $55 = 0, $56 = 0, $59 = 0, $62 = 0, $79 = 0, $81 = 0, $83 = 0, $87 = 0, $9 = 0, $91 = 0, $97 = 0, $dpnt$080 = 0, $dpnt$1$lcssa = 0, $dpnt$163 = 0, $i$096 = 0, $i$190 = 0, $i$270 = 0, $i$345 = 0, $i$443 = 0, $i$541 = 0, $i$640 = 0, $j$083 = 0, $j$1$lcssa = 0, $j$146 = 0, $j$2 = 0, $k$059 = 0, $k$156 = 0, $k$252 = 0, $k$349 = 0, $pnt$086 = 0, $pnt$1$lcssa = 0, $pnt$173 = 0, $pnt1$097 = 0, $pnt1$191 = 0, $pnt2$095 = 0, $pnt2$189 = 0, $pnt2$281 = 0, $pnt2$3$lcssa = 0, $pnt2$364 = 0, $pnt_thresh$085 = 0, $pnt_thresh$1$lcssa = 0, $pnt_thresh$172 = 0, $vararg_buffer = 0, $wk$060 = 0, $wk$157 = 0, $wk$253 = 0, $wk$350 = 0, $wk$447 = 0, $wk_max$0$lcssa = 0, $wk_max$082 = 0, $wk_max$1$lcssa = 0, $wk_max$165 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = HEAP32[$labelInfo >> 2] | 0; + $1 = $ysize + -1 | 0; + if (($xsize | 0) > 0) { + $i$096 = 0; + $pnt1$097 = $0; + $pnt2$095 = $0 + ((Math_imul($1, $xsize) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$095 >> 1] = 0; + HEAP16[$pnt1$097 >> 1] = 0; + $i$096 = $i$096 + 1 | 0; + if (($i$096 | 0) >= ($xsize | 0)) break; else { + $pnt1$097 = $pnt1$097 + 2 | 0; + $pnt2$095 = $pnt2$095 + 2 | 0; + } + } + } + $9 = $xsize + -1 | 0; + if (($ysize | 0) > 0) { + $i$190 = 0; + $pnt1$191 = $0; + $pnt2$189 = $0 + ($9 << 1) | 0; + while (1) { + HEAP16[$pnt2$189 >> 1] = 0; + HEAP16[$pnt1$191 >> 1] = 0; + $i$190 = $i$190 + 1 | 0; + if (($i$190 | 0) >= ($ysize | 0)) break; else { + $pnt1$191 = $pnt1$191 + ($xsize << 1) | 0; + $pnt2$189 = $pnt2$189 + ($xsize << 1) | 0; + } + } + } + $16 = $labelInfo + 1179664 | 0; + $17 = $xsize + 1 | 0; + $18 = 0 - $xsize | 0; + $$sum = 1 - $xsize | 0; + $$sum1 = ~$xsize; + L11 : do if (($1 | 0) > 1) { + $26 = ($9 | 0) > 1; + $dpnt$080 = (HEAP32[$labelInfo + 4 >> 2] | 0) + $17 | 0; + $j$083 = 1; + $pnt$086 = $image + $17 | 0; + $pnt2$281 = $0 + ($17 << 1) | 0; + $pnt_thresh$085 = $image_thresh + $17 | 0; + $wk_max$082 = 0; + L13 : while (1) { + if ($26) { + $dpnt$163 = $dpnt$080; + $i$270 = 1; + $pnt$173 = $pnt$086; + $pnt2$364 = $pnt2$281; + $pnt_thresh$172 = $pnt_thresh$085; + $wk_max$165 = $wk_max$082; + while (1) { + do if ((HEAPU8[$pnt$173 >> 0] | 0) > (HEAPU8[$pnt_thresh$172 >> 0] | 0)) { + HEAP16[$pnt2$364 >> 1] = 0; + HEAP8[$dpnt$163 >> 0] = 0; + $wk_max$2 = $wk_max$165; + } else { + HEAP8[$dpnt$163 >> 0] = -1; + $31 = HEAP16[$pnt2$364 + ($18 << 1) >> 1] | 0; + if ($31 << 16 >> 16 > 0) { + HEAP16[$pnt2$364 >> 1] = $31; + $34 = ($31 << 16 >> 16) * 7 | 0; + $36 = $labelInfo + 1310736 + ($34 + -7 << 2) | 0; + HEAP32[$36 >> 2] = (HEAP32[$36 >> 2] | 0) + 1; + $40 = $labelInfo + 1310736 + ($34 + -6 << 2) | 0; + HEAP32[$40 >> 2] = (HEAP32[$40 >> 2] | 0) + $i$270; + $44 = $labelInfo + 1310736 + ($34 + -5 << 2) | 0; + HEAP32[$44 >> 2] = (HEAP32[$44 >> 2] | 0) + $j$083; + HEAP32[$labelInfo + 1310736 + ($34 + -1 << 2) >> 2] = $j$083; + $wk_max$2 = $wk_max$165; + break; + } + $50 = HEAP16[$pnt2$364 + ($$sum << 1) >> 1] | 0; + $51 = $50 << 16 >> 16; + $54 = HEAP16[$pnt2$364 + ($$sum1 << 1) >> 1] | 0; + $55 = $54 << 16 >> 16; + $56 = $54 << 16 >> 16 > 0; + if ($50 << 16 >> 16 <= 0) { + if ($56) { + HEAP16[$pnt2$364 >> 1] = $54; + $156 = $55 * 7 | 0; + $158 = $labelInfo + 1310736 + ($156 + -7 << 2) | 0; + HEAP32[$158 >> 2] = (HEAP32[$158 >> 2] | 0) + 1; + $162 = $labelInfo + 1310736 + ($156 + -6 << 2) | 0; + HEAP32[$162 >> 2] = (HEAP32[$162 >> 2] | 0) + $i$270; + $166 = $labelInfo + 1310736 + ($156 + -5 << 2) | 0; + HEAP32[$166 >> 2] = (HEAP32[$166 >> 2] | 0) + $j$083; + $170 = $labelInfo + 1310736 + ($156 + -3 << 2) | 0; + if ((HEAP32[$170 >> 2] | 0) < ($i$270 | 0)) HEAP32[$170 >> 2] = $i$270; + HEAP32[$labelInfo + 1310736 + ($156 + -1 << 2) >> 2] = $j$083; + $wk_max$2 = $wk_max$165; + break; + } + $176 = HEAP16[$pnt2$364 + -2 >> 1] | 0; + if ($176 << 16 >> 16 > 0) { + HEAP16[$pnt2$364 >> 1] = $176; + $179 = ($176 << 16 >> 16) * 7 | 0; + $181 = $labelInfo + 1310736 + ($179 + -7 << 2) | 0; + HEAP32[$181 >> 2] = (HEAP32[$181 >> 2] | 0) + 1; + $185 = $labelInfo + 1310736 + ($179 + -6 << 2) | 0; + HEAP32[$185 >> 2] = (HEAP32[$185 >> 2] | 0) + $i$270; + $189 = $labelInfo + 1310736 + ($179 + -5 << 2) | 0; + HEAP32[$189 >> 2] = (HEAP32[$189 >> 2] | 0) + $j$083; + $193 = $labelInfo + 1310736 + ($179 + -3 << 2) | 0; + if ((HEAP32[$193 >> 2] | 0) >= ($i$270 | 0)) { + $wk_max$2 = $wk_max$165; + break; + } + HEAP32[$193 >> 2] = $i$270; + $wk_max$2 = $wk_max$165; + break; + } else { + $196 = $wk_max$165 + 1 | 0; + if (($wk_max$165 | 0) > 32767) break L13; + HEAP16[$pnt2$364 >> 1] = $196; + HEAP32[$labelInfo + 1179664 + ($wk_max$165 << 2) >> 2] = $196 << 16 >> 16; + $201 = $wk_max$165 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($201 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($201 + 1 << 2) >> 2] = $i$270; + HEAP32[$labelInfo + 1310736 + ($201 + 2 << 2) >> 2] = $j$083; + HEAP32[$labelInfo + 1310736 + ($201 + 3 << 2) >> 2] = $i$270; + HEAP32[$labelInfo + 1310736 + ($201 + 4 << 2) >> 2] = $i$270; + HEAP32[$labelInfo + 1310736 + ($201 + 5 << 2) >> 2] = $j$083; + HEAP32[$labelInfo + 1310736 + ($201 + 6 << 2) >> 2] = $j$083; + $wk_max$2 = $196; + break; + } + } + if ($56) { + $59 = HEAP32[$labelInfo + 1179664 + ($51 + -1 << 2) >> 2] | 0; + $62 = HEAP32[$labelInfo + 1179664 + ($55 + -1 << 2) >> 2] | 0; + if (($59 | 0) > ($62 | 0)) { + HEAP16[$pnt2$364 >> 1] = $62; + if (($wk_max$165 | 0) > 0) { + $k$059 = 0; + $wk$060 = $16; + while (1) { + if ((HEAP32[$wk$060 >> 2] | 0) == ($59 | 0)) HEAP32[$wk$060 >> 2] = $62; + $k$059 = $k$059 + 1 | 0; + if (($k$059 | 0) >= ($wk_max$165 | 0)) { + $79 = $62; + break; + } else $wk$060 = $wk$060 + 4 | 0; + } + } else $79 = $62; + } else { + HEAP16[$pnt2$364 >> 1] = $59; + if (($59 | 0) < ($62 | 0) & ($wk_max$165 | 0) > 0) { + $k$156 = 0; + $wk$157 = $16; + while (1) { + if ((HEAP32[$wk$157 >> 2] | 0) == ($62 | 0)) HEAP32[$wk$157 >> 2] = $59; + $k$156 = $k$156 + 1 | 0; + if (($k$156 | 0) >= ($wk_max$165 | 0)) { + $79 = $59; + break; + } else $wk$157 = $wk$157 + 4 | 0; + } + } else $79 = $59; + } + $81 = ($79 << 16 >> 16) * 7 | 0; + $83 = $labelInfo + 1310736 + ($81 + -7 << 2) | 0; + HEAP32[$83 >> 2] = (HEAP32[$83 >> 2] | 0) + 1; + $87 = $labelInfo + 1310736 + ($81 + -6 << 2) | 0; + HEAP32[$87 >> 2] = (HEAP32[$87 >> 2] | 0) + $i$270; + $91 = $labelInfo + 1310736 + ($81 + -5 << 2) | 0; + HEAP32[$91 >> 2] = (HEAP32[$91 >> 2] | 0) + $j$083; + HEAP32[$labelInfo + 1310736 + ($81 + -1 << 2) >> 2] = $j$083; + $wk_max$2 = $wk_max$165; + break; + } + $97 = HEAP16[$pnt2$364 + -2 >> 1] | 0; + if ($97 << 16 >> 16 <= 0) { + HEAP16[$pnt2$364 >> 1] = $50; + $137 = $51 * 7 | 0; + $139 = $labelInfo + 1310736 + ($137 + -7 << 2) | 0; + HEAP32[$139 >> 2] = (HEAP32[$139 >> 2] | 0) + 1; + $143 = $labelInfo + 1310736 + ($137 + -6 << 2) | 0; + HEAP32[$143 >> 2] = (HEAP32[$143 >> 2] | 0) + $i$270; + $147 = $labelInfo + 1310736 + ($137 + -5 << 2) | 0; + HEAP32[$147 >> 2] = (HEAP32[$147 >> 2] | 0) + $j$083; + $151 = $labelInfo + 1310736 + ($137 + -4 << 2) | 0; + if ((HEAP32[$151 >> 2] | 0) > ($i$270 | 0)) HEAP32[$151 >> 2] = $i$270; + HEAP32[$labelInfo + 1310736 + ($137 + -1 << 2) >> 2] = $j$083; + $wk_max$2 = $wk_max$165; + break; + } + $102 = HEAP32[$labelInfo + 1179664 + ($51 + -1 << 2) >> 2] | 0; + $105 = HEAP32[$labelInfo + 1179664 + (($97 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($102 | 0) > ($105 | 0)) { + HEAP16[$pnt2$364 >> 1] = $105; + if (($wk_max$165 | 0) > 0) { + $k$252 = 0; + $wk$253 = $16; + while (1) { + if ((HEAP32[$wk$253 >> 2] | 0) == ($102 | 0)) HEAP32[$wk$253 >> 2] = $105; + $k$252 = $k$252 + 1 | 0; + if (($k$252 | 0) >= ($wk_max$165 | 0)) { + $122 = $105; + break; + } else $wk$253 = $wk$253 + 4 | 0; + } + } else $122 = $105; + } else { + HEAP16[$pnt2$364 >> 1] = $102; + if (($102 | 0) < ($105 | 0) & ($wk_max$165 | 0) > 0) { + $k$349 = 0; + $wk$350 = $16; + while (1) { + if ((HEAP32[$wk$350 >> 2] | 0) == ($105 | 0)) HEAP32[$wk$350 >> 2] = $102; + $k$349 = $k$349 + 1 | 0; + if (($k$349 | 0) >= ($wk_max$165 | 0)) { + $122 = $102; + break; + } else $wk$350 = $wk$350 + 4 | 0; + } + } else $122 = $102; + } + $124 = ($122 << 16 >> 16) * 7 | 0; + $126 = $labelInfo + 1310736 + ($124 + -7 << 2) | 0; + HEAP32[$126 >> 2] = (HEAP32[$126 >> 2] | 0) + 1; + $130 = $labelInfo + 1310736 + ($124 + -6 << 2) | 0; + HEAP32[$130 >> 2] = (HEAP32[$130 >> 2] | 0) + $i$270; + $134 = $labelInfo + 1310736 + ($124 + -5 << 2) | 0; + HEAP32[$134 >> 2] = (HEAP32[$134 >> 2] | 0) + $j$083; + $wk_max$2 = $wk_max$165; + } while (0); + $i$270 = $i$270 + 1 | 0; + $216 = $pnt$173 + 1 | 0; + $217 = $pnt_thresh$172 + 1 | 0; + $218 = $pnt2$364 + 2 | 0; + $219 = $dpnt$163 + 1 | 0; + if (($i$270 | 0) >= ($9 | 0)) { + $dpnt$1$lcssa = $219; + $pnt$1$lcssa = $216; + $pnt2$3$lcssa = $218; + $pnt_thresh$1$lcssa = $217; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $dpnt$163 = $219; + $pnt$173 = $216; + $pnt2$364 = $218; + $pnt_thresh$172 = $217; + $wk_max$165 = $wk_max$2; + } + } + } else { + $dpnt$1$lcssa = $dpnt$080; + $pnt$1$lcssa = $pnt$086; + $pnt2$3$lcssa = $pnt2$281; + $pnt_thresh$1$lcssa = $pnt_thresh$085; + $wk_max$1$lcssa = $wk_max$082; + } + $j$083 = $j$083 + 1 | 0; + if (($j$083 | 0) >= ($1 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $dpnt$080 = $dpnt$1$lcssa + 2 | 0; + $pnt$086 = $pnt$1$lcssa + 2 | 0; + $pnt2$281 = $pnt2$3$lcssa + 4 | 0; + $pnt_thresh$085 = $pnt_thresh$1$lcssa + 2 | 0; + $wk_max$082 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $227 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$345 = 1; + $j$146 = 1; + $wk$447 = $16; + while (1) { + $229 = HEAP32[$wk$447 >> 2] | 0; + if (($229 | 0) == ($i$345 | 0)) { + $235 = $j$146; + $j$2 = $j$146 + 1 | 0; + } else { + $235 = HEAP32[$labelInfo + 1179664 + ($229 + -1 << 2) >> 2] | 0; + $j$2 = $j$146; + } + HEAP32[$wk$447 >> 2] = $235; + if (($i$345 | 0) < ($wk_max$0$lcssa | 0)) { + $i$345 = $i$345 + 1 | 0; + $j$146 = $j$2; + $wk$447 = $wk$447 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $239 = $labelInfo + 8 | 0; + $240 = $j$1$lcssa + -1 | 0; + HEAP32[$239 >> 2] = $240; + if (!$240) $$0 = 0; else { + _memset($227 | 0, 0, $240 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $240 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$443 = 0; + do { + $247 = $i$443 << 2; + HEAP32[$labelInfo + 131084 + ($247 << 2) >> 2] = $xsize; + HEAP32[$labelInfo + 131084 + (($247 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($247 | 2) << 2) >> 2] = $ysize; + HEAP32[$labelInfo + 131084 + (($247 | 3) << 2) >> 2] = 0; + $i$443 = $i$443 + 1 | 0; + } while (($i$443 | 0) < (HEAP32[$239 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$541 = 0; + do { + $261 = (HEAP32[$labelInfo + 1179664 + ($i$541 << 2) >> 2] | 0) + -1 | 0; + $262 = $i$541 * 7 | 0; + $265 = $labelInfo + 12 + ($261 << 2) | 0; + HEAP32[$265 >> 2] = (HEAP32[$265 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($262 << 2) >> 2] | 0); + $272 = $261 << 1; + $273 = $labelInfo + 655376 + ($272 << 3) | 0; + HEAPF64[$273 >> 3] = +HEAPF64[$273 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($262 + 1 << 2) >> 2] | 0); + $281 = $labelInfo + 655376 + (($272 | 1) << 3) | 0; + HEAPF64[$281 >> 3] = +HEAPF64[$281 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($262 + 2 << 2) >> 2] | 0); + $284 = $261 << 2; + $285 = $labelInfo + 131084 + ($284 << 2) | 0; + $289 = HEAP32[$labelInfo + 1310736 + ($262 + 3 << 2) >> 2] | 0; + if ((HEAP32[$285 >> 2] | 0) > ($289 | 0)) HEAP32[$285 >> 2] = $289; + $292 = $labelInfo + 131084 + (($284 | 1) << 2) | 0; + $296 = HEAP32[$labelInfo + 1310736 + ($262 + 4 << 2) >> 2] | 0; + if ((HEAP32[$292 >> 2] | 0) < ($296 | 0)) HEAP32[$292 >> 2] = $296; + $299 = $labelInfo + 131084 + (($284 | 2) << 2) | 0; + $303 = HEAP32[$labelInfo + 1310736 + ($262 + 5 << 2) >> 2] | 0; + if ((HEAP32[$299 >> 2] | 0) > ($303 | 0)) HEAP32[$299 >> 2] = $303; + $306 = $labelInfo + 131084 + (($284 | 3) << 2) | 0; + $310 = HEAP32[$labelInfo + 1310736 + ($262 + 6 << 2) >> 2] | 0; + if ((HEAP32[$306 >> 2] | 0) < ($310 | 0)) HEAP32[$306 >> 2] = $310; + $i$541 = $i$541 + 1 | 0; + } while (($i$541 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$239 >> 2] | 0) > 0) { + $i$640 = 0; + do { + $314 = $labelInfo + 12 + ($i$640 << 2) | 0; + $317 = $i$640 << 1; + $318 = $labelInfo + 655376 + ($317 << 3) | 0; + HEAPF64[$318 >> 3] = +HEAPF64[$318 >> 3] / +(HEAP32[$314 >> 2] | 0); + $324 = $labelInfo + 655376 + (($317 | 1) << 3) | 0; + HEAPF64[$324 >> 3] = +HEAPF64[$324 >> 3] / +(HEAP32[$314 >> 2] | 0); + $i$640 = $i$640 + 1 | 0; + } while (($i$640 | 0) < (HEAP32[$239 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubEWI3CA5551($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $$sum2 = 0, $0 = 0, $1 = 0, $100 = 0, $102 = 0, $106 = 0, $11 = 0, $110 = 0, $116 = 0, $12 = 0, $121 = 0, $124 = 0, $141 = 0, $143 = 0, $145 = 0, $149 = 0, $153 = 0, $156 = 0, $158 = 0, $162 = 0, $166 = 0, $170 = 0, $175 = 0, $177 = 0, $181 = 0, $185 = 0, $189 = 0, $19 = 0, $195 = 0, $198 = 0, $2 = 0, $20 = 0, $200 = 0, $204 = 0, $208 = 0, $212 = 0, $215 = 0, $22 = 0, $220 = 0, $235 = 0, $236 = 0, $237 = 0, $244 = 0, $246 = 0, $252 = 0, $256 = 0, $257 = 0, $264 = 0, $278 = 0, $279 = 0, $282 = 0, $289 = 0, $290 = 0, $298 = 0, $3 = 0, $301 = 0, $302 = 0, $306 = 0, $309 = 0, $31 = 0, $313 = 0, $316 = 0, $320 = 0, $323 = 0, $327 = 0, $33 = 0, $331 = 0, $334 = 0, $335 = 0, $341 = 0, $39 = 0, $50 = 0, $53 = 0, $55 = 0, $59 = 0, $63 = 0, $69 = 0, $70 = 0, $73 = 0, $74 = 0, $75 = 0, $78 = 0, $81 = 0, $98 = 0, $dpnt$078 = 0, $dpnt$1$lcssa = 0, $dpnt$167 = 0, $i$089 = 0, $i$183 = 0, $i$265 = 0, $i$342 = 0, $i$440 = 0, $i$538 = 0, $i$637 = 0, $j$076 = 0, $j$1$lcssa = 0, $j$143 = 0, $j$2 = 0, $k$056 = 0, $k$153 = 0, $k$249 = 0, $k$346 = 0, $pnt$080 = 0, $pnt$1$lcssa = 0, $pnt$169 = 0, $pnt1$091 = 0, $pnt1$185 = 0, $pnt2$090 = 0, $pnt2$184 = 0, $pnt2$279 = 0, $pnt2$3$lcssa = 0, $pnt2$368 = 0, $vararg_buffer = 0, $wk$057 = 0, $wk$154 = 0, $wk$250 = 0, $wk$347 = 0, $wk$444 = 0, $wk_max$0$lcssa = 0, $wk_max$075 = 0, $wk_max$1$lcssa = 0, $wk_max$160 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = ($xsize | 0) / 2 | 0; + $1 = ($ysize | 0) / 2 | 0; + $2 = HEAP32[$labelInfo >> 2] | 0; + $3 = $1 + -1 | 0; + if (($xsize | 0) > 1) { + $i$089 = 0; + $pnt1$091 = $2; + $pnt2$090 = $2 + ((Math_imul($3, $0) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$090 >> 1] = 0; + HEAP16[$pnt1$091 >> 1] = 0; + $i$089 = $i$089 + 1 | 0; + if (($i$089 | 0) >= ($0 | 0)) break; else { + $pnt1$091 = $pnt1$091 + 2 | 0; + $pnt2$090 = $pnt2$090 + 2 | 0; + } + } + } + $11 = $labelingThresh * 3 | 0; + $12 = $0 + -1 | 0; + if (($ysize | 0) > 1) { + $i$183 = 0; + $pnt1$185 = $2; + $pnt2$184 = $2 + ($12 << 1) | 0; + while (1) { + HEAP16[$pnt2$184 >> 1] = 0; + HEAP16[$pnt1$185 >> 1] = 0; + $i$183 = $i$183 + 1 | 0; + if (($i$183 | 0) >= ($1 | 0)) break; else { + $pnt1$185 = $pnt1$185 + ($0 << 1) | 0; + $pnt2$184 = $pnt2$184 + ($0 << 1) | 0; + } + } + } + $19 = $labelInfo + 1179664 | 0; + $20 = $0 + 1 | 0; + $22 = 0 - $0 | 0; + $$sum1 = 1 - $0 | 0; + $$sum2 = ~$0; + $$sum = ($xsize << 1) + 8 | 0; + L11 : do if (($3 | 0) > 1) { + $31 = ($12 | 0) > 1; + $dpnt$078 = (HEAP32[$labelInfo + 4 >> 2] | 0) + $20 | 0; + $j$076 = 1; + $pnt$080 = $image + (($xsize << 2) + 4) | 0; + $pnt2$279 = $2 + ($20 << 1) | 0; + $wk_max$075 = 0; + L13 : while (1) { + if ($31) { + $dpnt$167 = $dpnt$078; + $i$265 = 1; + $pnt$169 = $pnt$080; + $pnt2$368 = $pnt2$279; + $wk_max$160 = $wk_max$075; + while (1) { + $33 = HEAPU8[$pnt$169 >> 0] | 0; + $39 = HEAPU8[$pnt$169 + 1 >> 0] | 0; + do if ((($33 & 248) + 12 + ($33 << 5 & 224) + ($39 >>> 3 & 24) + ($39 << 2 & 248) | 0) > ($11 | 0)) { + HEAP8[$dpnt$167 >> 0] = -1; + $50 = HEAP16[$pnt2$368 + ($22 << 1) >> 1] | 0; + if ($50 << 16 >> 16 > 0) { + HEAP16[$pnt2$368 >> 1] = $50; + $53 = ($50 << 16 >> 16) * 7 | 0; + $55 = $labelInfo + 1310736 + ($53 + -7 << 2) | 0; + HEAP32[$55 >> 2] = (HEAP32[$55 >> 2] | 0) + 1; + $59 = $labelInfo + 1310736 + ($53 + -6 << 2) | 0; + HEAP32[$59 >> 2] = (HEAP32[$59 >> 2] | 0) + $i$265; + $63 = $labelInfo + 1310736 + ($53 + -5 << 2) | 0; + HEAP32[$63 >> 2] = (HEAP32[$63 >> 2] | 0) + $j$076; + HEAP32[$labelInfo + 1310736 + ($53 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $69 = HEAP16[$pnt2$368 + ($$sum1 << 1) >> 1] | 0; + $70 = $69 << 16 >> 16; + $73 = HEAP16[$pnt2$368 + ($$sum2 << 1) >> 1] | 0; + $74 = $73 << 16 >> 16; + $75 = $73 << 16 >> 16 > 0; + if ($69 << 16 >> 16 <= 0) { + if ($75) { + HEAP16[$pnt2$368 >> 1] = $73; + $175 = $74 * 7 | 0; + $177 = $labelInfo + 1310736 + ($175 + -7 << 2) | 0; + HEAP32[$177 >> 2] = (HEAP32[$177 >> 2] | 0) + 1; + $181 = $labelInfo + 1310736 + ($175 + -6 << 2) | 0; + HEAP32[$181 >> 2] = (HEAP32[$181 >> 2] | 0) + $i$265; + $185 = $labelInfo + 1310736 + ($175 + -5 << 2) | 0; + HEAP32[$185 >> 2] = (HEAP32[$185 >> 2] | 0) + $j$076; + $189 = $labelInfo + 1310736 + ($175 + -3 << 2) | 0; + if ((HEAP32[$189 >> 2] | 0) < ($i$265 | 0)) HEAP32[$189 >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($175 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $195 = HEAP16[$pnt2$368 + -2 >> 1] | 0; + if ($195 << 16 >> 16 > 0) { + HEAP16[$pnt2$368 >> 1] = $195; + $198 = ($195 << 16 >> 16) * 7 | 0; + $200 = $labelInfo + 1310736 + ($198 + -7 << 2) | 0; + HEAP32[$200 >> 2] = (HEAP32[$200 >> 2] | 0) + 1; + $204 = $labelInfo + 1310736 + ($198 + -6 << 2) | 0; + HEAP32[$204 >> 2] = (HEAP32[$204 >> 2] | 0) + $i$265; + $208 = $labelInfo + 1310736 + ($198 + -5 << 2) | 0; + HEAP32[$208 >> 2] = (HEAP32[$208 >> 2] | 0) + $j$076; + $212 = $labelInfo + 1310736 + ($198 + -3 << 2) | 0; + if ((HEAP32[$212 >> 2] | 0) >= ($i$265 | 0)) { + $wk_max$2 = $wk_max$160; + break; + } + HEAP32[$212 >> 2] = $i$265; + $wk_max$2 = $wk_max$160; + break; + } else { + $215 = $wk_max$160 + 1 | 0; + if (($wk_max$160 | 0) > 32767) break L13; + HEAP16[$pnt2$368 >> 1] = $215; + HEAP32[$labelInfo + 1179664 + ($wk_max$160 << 2) >> 2] = $215 << 16 >> 16; + $220 = $wk_max$160 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($220 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($220 + 1 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($220 + 2 << 2) >> 2] = $j$076; + HEAP32[$labelInfo + 1310736 + ($220 + 3 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($220 + 4 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($220 + 5 << 2) >> 2] = $j$076; + HEAP32[$labelInfo + 1310736 + ($220 + 6 << 2) >> 2] = $j$076; + $wk_max$2 = $215; + break; + } + } + if ($75) { + $78 = HEAP32[$labelInfo + 1179664 + ($70 + -1 << 2) >> 2] | 0; + $81 = HEAP32[$labelInfo + 1179664 + ($74 + -1 << 2) >> 2] | 0; + if (($78 | 0) > ($81 | 0)) { + HEAP16[$pnt2$368 >> 1] = $81; + if (($wk_max$160 | 0) > 0) { + $k$056 = 0; + $wk$057 = $19; + while (1) { + if ((HEAP32[$wk$057 >> 2] | 0) == ($78 | 0)) HEAP32[$wk$057 >> 2] = $81; + $k$056 = $k$056 + 1 | 0; + if (($k$056 | 0) >= ($wk_max$160 | 0)) { + $98 = $81; + break; + } else $wk$057 = $wk$057 + 4 | 0; + } + } else $98 = $81; + } else { + HEAP16[$pnt2$368 >> 1] = $78; + if (($78 | 0) < ($81 | 0) & ($wk_max$160 | 0) > 0) { + $k$153 = 0; + $wk$154 = $19; + while (1) { + if ((HEAP32[$wk$154 >> 2] | 0) == ($81 | 0)) HEAP32[$wk$154 >> 2] = $78; + $k$153 = $k$153 + 1 | 0; + if (($k$153 | 0) >= ($wk_max$160 | 0)) { + $98 = $78; + break; + } else $wk$154 = $wk$154 + 4 | 0; + } + } else $98 = $78; + } + $100 = ($98 << 16 >> 16) * 7 | 0; + $102 = $labelInfo + 1310736 + ($100 + -7 << 2) | 0; + HEAP32[$102 >> 2] = (HEAP32[$102 >> 2] | 0) + 1; + $106 = $labelInfo + 1310736 + ($100 + -6 << 2) | 0; + HEAP32[$106 >> 2] = (HEAP32[$106 >> 2] | 0) + $i$265; + $110 = $labelInfo + 1310736 + ($100 + -5 << 2) | 0; + HEAP32[$110 >> 2] = (HEAP32[$110 >> 2] | 0) + $j$076; + HEAP32[$labelInfo + 1310736 + ($100 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $116 = HEAP16[$pnt2$368 + -2 >> 1] | 0; + if ($116 << 16 >> 16 <= 0) { + HEAP16[$pnt2$368 >> 1] = $69; + $156 = $70 * 7 | 0; + $158 = $labelInfo + 1310736 + ($156 + -7 << 2) | 0; + HEAP32[$158 >> 2] = (HEAP32[$158 >> 2] | 0) + 1; + $162 = $labelInfo + 1310736 + ($156 + -6 << 2) | 0; + HEAP32[$162 >> 2] = (HEAP32[$162 >> 2] | 0) + $i$265; + $166 = $labelInfo + 1310736 + ($156 + -5 << 2) | 0; + HEAP32[$166 >> 2] = (HEAP32[$166 >> 2] | 0) + $j$076; + $170 = $labelInfo + 1310736 + ($156 + -4 << 2) | 0; + if ((HEAP32[$170 >> 2] | 0) > ($i$265 | 0)) HEAP32[$170 >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($156 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $121 = HEAP32[$labelInfo + 1179664 + ($70 + -1 << 2) >> 2] | 0; + $124 = HEAP32[$labelInfo + 1179664 + (($116 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($121 | 0) > ($124 | 0)) { + HEAP16[$pnt2$368 >> 1] = $124; + if (($wk_max$160 | 0) > 0) { + $k$249 = 0; + $wk$250 = $19; + while (1) { + if ((HEAP32[$wk$250 >> 2] | 0) == ($121 | 0)) HEAP32[$wk$250 >> 2] = $124; + $k$249 = $k$249 + 1 | 0; + if (($k$249 | 0) >= ($wk_max$160 | 0)) { + $141 = $124; + break; + } else $wk$250 = $wk$250 + 4 | 0; + } + } else $141 = $124; + } else { + HEAP16[$pnt2$368 >> 1] = $121; + if (($121 | 0) < ($124 | 0) & ($wk_max$160 | 0) > 0) { + $k$346 = 0; + $wk$347 = $19; + while (1) { + if ((HEAP32[$wk$347 >> 2] | 0) == ($124 | 0)) HEAP32[$wk$347 >> 2] = $121; + $k$346 = $k$346 + 1 | 0; + if (($k$346 | 0) >= ($wk_max$160 | 0)) { + $141 = $121; + break; + } else $wk$347 = $wk$347 + 4 | 0; + } + } else $141 = $121; + } + $143 = ($141 << 16 >> 16) * 7 | 0; + $145 = $labelInfo + 1310736 + ($143 + -7 << 2) | 0; + HEAP32[$145 >> 2] = (HEAP32[$145 >> 2] | 0) + 1; + $149 = $labelInfo + 1310736 + ($143 + -6 << 2) | 0; + HEAP32[$149 >> 2] = (HEAP32[$149 >> 2] | 0) + $i$265; + $153 = $labelInfo + 1310736 + ($143 + -5 << 2) | 0; + HEAP32[$153 >> 2] = (HEAP32[$153 >> 2] | 0) + $j$076; + $wk_max$2 = $wk_max$160; + } else { + HEAP16[$pnt2$368 >> 1] = 0; + HEAP8[$dpnt$167 >> 0] = 0; + $wk_max$2 = $wk_max$160; + } while (0); + $i$265 = $i$265 + 1 | 0; + $235 = $pnt$169 + 4 | 0; + $236 = $pnt2$368 + 2 | 0; + $237 = $dpnt$167 + 1 | 0; + if (($i$265 | 0) >= ($12 | 0)) { + $dpnt$1$lcssa = $237; + $pnt$1$lcssa = $235; + $pnt2$3$lcssa = $236; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $dpnt$167 = $237; + $pnt$169 = $235; + $pnt2$368 = $236; + $wk_max$160 = $wk_max$2; + } + } + } else { + $dpnt$1$lcssa = $dpnt$078; + $pnt$1$lcssa = $pnt$080; + $pnt2$3$lcssa = $pnt2$279; + $wk_max$1$lcssa = $wk_max$075; + } + $j$076 = $j$076 + 1 | 0; + if (($j$076 | 0) >= ($3 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $dpnt$078 = $dpnt$1$lcssa + 2 | 0; + $pnt$080 = $pnt$1$lcssa + $$sum | 0; + $pnt2$279 = $pnt2$3$lcssa + 4 | 0; + $wk_max$075 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $244 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$342 = 1; + $j$143 = 1; + $wk$444 = $19; + while (1) { + $246 = HEAP32[$wk$444 >> 2] | 0; + if (($246 | 0) == ($i$342 | 0)) { + $252 = $j$143; + $j$2 = $j$143 + 1 | 0; + } else { + $252 = HEAP32[$labelInfo + 1179664 + ($246 + -1 << 2) >> 2] | 0; + $j$2 = $j$143; + } + HEAP32[$wk$444 >> 2] = $252; + if (($i$342 | 0) < ($wk_max$0$lcssa | 0)) { + $i$342 = $i$342 + 1 | 0; + $j$143 = $j$2; + $wk$444 = $wk$444 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $256 = $labelInfo + 8 | 0; + $257 = $j$1$lcssa + -1 | 0; + HEAP32[$256 >> 2] = $257; + if (!$257) $$0 = 0; else { + _memset($244 | 0, 0, $257 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $257 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$440 = 0; + do { + $264 = $i$440 << 2; + HEAP32[$labelInfo + 131084 + ($264 << 2) >> 2] = $0; + HEAP32[$labelInfo + 131084 + (($264 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($264 | 2) << 2) >> 2] = $1; + HEAP32[$labelInfo + 131084 + (($264 | 3) << 2) >> 2] = 0; + $i$440 = $i$440 + 1 | 0; + } while (($i$440 | 0) < (HEAP32[$256 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$538 = 0; + do { + $278 = (HEAP32[$labelInfo + 1179664 + ($i$538 << 2) >> 2] | 0) + -1 | 0; + $279 = $i$538 * 7 | 0; + $282 = $labelInfo + 12 + ($278 << 2) | 0; + HEAP32[$282 >> 2] = (HEAP32[$282 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($279 << 2) >> 2] | 0); + $289 = $278 << 1; + $290 = $labelInfo + 655376 + ($289 << 3) | 0; + HEAPF64[$290 >> 3] = +HEAPF64[$290 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($279 + 1 << 2) >> 2] | 0); + $298 = $labelInfo + 655376 + (($289 | 1) << 3) | 0; + HEAPF64[$298 >> 3] = +HEAPF64[$298 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($279 + 2 << 2) >> 2] | 0); + $301 = $278 << 2; + $302 = $labelInfo + 131084 + ($301 << 2) | 0; + $306 = HEAP32[$labelInfo + 1310736 + ($279 + 3 << 2) >> 2] | 0; + if ((HEAP32[$302 >> 2] | 0) > ($306 | 0)) HEAP32[$302 >> 2] = $306; + $309 = $labelInfo + 131084 + (($301 | 1) << 2) | 0; + $313 = HEAP32[$labelInfo + 1310736 + ($279 + 4 << 2) >> 2] | 0; + if ((HEAP32[$309 >> 2] | 0) < ($313 | 0)) HEAP32[$309 >> 2] = $313; + $316 = $labelInfo + 131084 + (($301 | 2) << 2) | 0; + $320 = HEAP32[$labelInfo + 1310736 + ($279 + 5 << 2) >> 2] | 0; + if ((HEAP32[$316 >> 2] | 0) > ($320 | 0)) HEAP32[$316 >> 2] = $320; + $323 = $labelInfo + 131084 + (($301 | 3) << 2) | 0; + $327 = HEAP32[$labelInfo + 1310736 + ($279 + 6 << 2) >> 2] | 0; + if ((HEAP32[$323 >> 2] | 0) < ($327 | 0)) HEAP32[$323 >> 2] = $327; + $i$538 = $i$538 + 1 | 0; + } while (($i$538 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$256 >> 2] | 0) > 0) { + $i$637 = 0; + do { + $331 = $labelInfo + 12 + ($i$637 << 2) | 0; + $334 = $i$637 << 1; + $335 = $labelInfo + 655376 + ($334 << 3) | 0; + HEAPF64[$335 >> 3] = +HEAPF64[$335 >> 3] / +(HEAP32[$331 >> 2] | 0); + $341 = $labelInfo + 655376 + (($334 | 1) << 3) | 0; + HEAPF64[$341 >> 3] = +HEAPF64[$341 >> 3] / +(HEAP32[$331 >> 2] | 0); + $i$637 = $i$637 + 1 | 0; + } while (($i$637 | 0) < (HEAP32[$256 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubEBI3CA5551($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $$sum2 = 0, $0 = 0, $1 = 0, $100 = 0, $102 = 0, $106 = 0, $11 = 0, $110 = 0, $116 = 0, $12 = 0, $121 = 0, $124 = 0, $141 = 0, $143 = 0, $145 = 0, $149 = 0, $153 = 0, $156 = 0, $158 = 0, $162 = 0, $166 = 0, $170 = 0, $175 = 0, $177 = 0, $181 = 0, $185 = 0, $189 = 0, $19 = 0, $195 = 0, $198 = 0, $2 = 0, $20 = 0, $200 = 0, $204 = 0, $208 = 0, $212 = 0, $215 = 0, $22 = 0, $220 = 0, $235 = 0, $236 = 0, $237 = 0, $244 = 0, $246 = 0, $252 = 0, $256 = 0, $257 = 0, $264 = 0, $278 = 0, $279 = 0, $282 = 0, $289 = 0, $290 = 0, $298 = 0, $3 = 0, $301 = 0, $302 = 0, $306 = 0, $309 = 0, $31 = 0, $313 = 0, $316 = 0, $320 = 0, $323 = 0, $327 = 0, $33 = 0, $331 = 0, $334 = 0, $335 = 0, $341 = 0, $39 = 0, $50 = 0, $53 = 0, $55 = 0, $59 = 0, $63 = 0, $69 = 0, $70 = 0, $73 = 0, $74 = 0, $75 = 0, $78 = 0, $81 = 0, $98 = 0, $dpnt$078 = 0, $dpnt$1$lcssa = 0, $dpnt$167 = 0, $i$089 = 0, $i$183 = 0, $i$265 = 0, $i$342 = 0, $i$440 = 0, $i$538 = 0, $i$637 = 0, $j$076 = 0, $j$1$lcssa = 0, $j$143 = 0, $j$2 = 0, $k$056 = 0, $k$153 = 0, $k$249 = 0, $k$346 = 0, $pnt$080 = 0, $pnt$1$lcssa = 0, $pnt$169 = 0, $pnt1$091 = 0, $pnt1$185 = 0, $pnt2$090 = 0, $pnt2$184 = 0, $pnt2$279 = 0, $pnt2$3$lcssa = 0, $pnt2$368 = 0, $vararg_buffer = 0, $wk$057 = 0, $wk$154 = 0, $wk$250 = 0, $wk$347 = 0, $wk$444 = 0, $wk_max$0$lcssa = 0, $wk_max$075 = 0, $wk_max$1$lcssa = 0, $wk_max$160 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = ($xsize | 0) / 2 | 0; + $1 = ($ysize | 0) / 2 | 0; + $2 = HEAP32[$labelInfo >> 2] | 0; + $3 = $1 + -1 | 0; + if (($xsize | 0) > 1) { + $i$089 = 0; + $pnt1$091 = $2; + $pnt2$090 = $2 + ((Math_imul($3, $0) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$090 >> 1] = 0; + HEAP16[$pnt1$091 >> 1] = 0; + $i$089 = $i$089 + 1 | 0; + if (($i$089 | 0) >= ($0 | 0)) break; else { + $pnt1$091 = $pnt1$091 + 2 | 0; + $pnt2$090 = $pnt2$090 + 2 | 0; + } + } + } + $11 = $labelingThresh * 3 | 0; + $12 = $0 + -1 | 0; + if (($ysize | 0) > 1) { + $i$183 = 0; + $pnt1$185 = $2; + $pnt2$184 = $2 + ($12 << 1) | 0; + while (1) { + HEAP16[$pnt2$184 >> 1] = 0; + HEAP16[$pnt1$185 >> 1] = 0; + $i$183 = $i$183 + 1 | 0; + if (($i$183 | 0) >= ($1 | 0)) break; else { + $pnt1$185 = $pnt1$185 + ($0 << 1) | 0; + $pnt2$184 = $pnt2$184 + ($0 << 1) | 0; + } + } + } + $19 = $labelInfo + 1179664 | 0; + $20 = $0 + 1 | 0; + $22 = 0 - $0 | 0; + $$sum1 = 1 - $0 | 0; + $$sum2 = ~$0; + $$sum = ($xsize << 1) + 8 | 0; + L11 : do if (($3 | 0) > 1) { + $31 = ($12 | 0) > 1; + $dpnt$078 = (HEAP32[$labelInfo + 4 >> 2] | 0) + $20 | 0; + $j$076 = 1; + $pnt$080 = $image + (($xsize << 2) + 4) | 0; + $pnt2$279 = $2 + ($20 << 1) | 0; + $wk_max$075 = 0; + L13 : while (1) { + if ($31) { + $dpnt$167 = $dpnt$078; + $i$265 = 1; + $pnt$169 = $pnt$080; + $pnt2$368 = $pnt2$279; + $wk_max$160 = $wk_max$075; + while (1) { + $33 = HEAPU8[$pnt$169 >> 0] | 0; + $39 = HEAPU8[$pnt$169 + 1 >> 0] | 0; + do if ((($33 & 248) + 12 + ($33 << 5 & 224) + ($39 >>> 3 & 24) + ($39 << 2 & 248) | 0) > ($11 | 0)) { + HEAP16[$pnt2$368 >> 1] = 0; + HEAP8[$dpnt$167 >> 0] = 0; + $wk_max$2 = $wk_max$160; + } else { + HEAP8[$dpnt$167 >> 0] = -1; + $50 = HEAP16[$pnt2$368 + ($22 << 1) >> 1] | 0; + if ($50 << 16 >> 16 > 0) { + HEAP16[$pnt2$368 >> 1] = $50; + $53 = ($50 << 16 >> 16) * 7 | 0; + $55 = $labelInfo + 1310736 + ($53 + -7 << 2) | 0; + HEAP32[$55 >> 2] = (HEAP32[$55 >> 2] | 0) + 1; + $59 = $labelInfo + 1310736 + ($53 + -6 << 2) | 0; + HEAP32[$59 >> 2] = (HEAP32[$59 >> 2] | 0) + $i$265; + $63 = $labelInfo + 1310736 + ($53 + -5 << 2) | 0; + HEAP32[$63 >> 2] = (HEAP32[$63 >> 2] | 0) + $j$076; + HEAP32[$labelInfo + 1310736 + ($53 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $69 = HEAP16[$pnt2$368 + ($$sum1 << 1) >> 1] | 0; + $70 = $69 << 16 >> 16; + $73 = HEAP16[$pnt2$368 + ($$sum2 << 1) >> 1] | 0; + $74 = $73 << 16 >> 16; + $75 = $73 << 16 >> 16 > 0; + if ($69 << 16 >> 16 <= 0) { + if ($75) { + HEAP16[$pnt2$368 >> 1] = $73; + $175 = $74 * 7 | 0; + $177 = $labelInfo + 1310736 + ($175 + -7 << 2) | 0; + HEAP32[$177 >> 2] = (HEAP32[$177 >> 2] | 0) + 1; + $181 = $labelInfo + 1310736 + ($175 + -6 << 2) | 0; + HEAP32[$181 >> 2] = (HEAP32[$181 >> 2] | 0) + $i$265; + $185 = $labelInfo + 1310736 + ($175 + -5 << 2) | 0; + HEAP32[$185 >> 2] = (HEAP32[$185 >> 2] | 0) + $j$076; + $189 = $labelInfo + 1310736 + ($175 + -3 << 2) | 0; + if ((HEAP32[$189 >> 2] | 0) < ($i$265 | 0)) HEAP32[$189 >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($175 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $195 = HEAP16[$pnt2$368 + -2 >> 1] | 0; + if ($195 << 16 >> 16 > 0) { + HEAP16[$pnt2$368 >> 1] = $195; + $198 = ($195 << 16 >> 16) * 7 | 0; + $200 = $labelInfo + 1310736 + ($198 + -7 << 2) | 0; + HEAP32[$200 >> 2] = (HEAP32[$200 >> 2] | 0) + 1; + $204 = $labelInfo + 1310736 + ($198 + -6 << 2) | 0; + HEAP32[$204 >> 2] = (HEAP32[$204 >> 2] | 0) + $i$265; + $208 = $labelInfo + 1310736 + ($198 + -5 << 2) | 0; + HEAP32[$208 >> 2] = (HEAP32[$208 >> 2] | 0) + $j$076; + $212 = $labelInfo + 1310736 + ($198 + -3 << 2) | 0; + if ((HEAP32[$212 >> 2] | 0) >= ($i$265 | 0)) { + $wk_max$2 = $wk_max$160; + break; + } + HEAP32[$212 >> 2] = $i$265; + $wk_max$2 = $wk_max$160; + break; + } else { + $215 = $wk_max$160 + 1 | 0; + if (($wk_max$160 | 0) > 32767) break L13; + HEAP16[$pnt2$368 >> 1] = $215; + HEAP32[$labelInfo + 1179664 + ($wk_max$160 << 2) >> 2] = $215 << 16 >> 16; + $220 = $wk_max$160 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($220 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($220 + 1 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($220 + 2 << 2) >> 2] = $j$076; + HEAP32[$labelInfo + 1310736 + ($220 + 3 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($220 + 4 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($220 + 5 << 2) >> 2] = $j$076; + HEAP32[$labelInfo + 1310736 + ($220 + 6 << 2) >> 2] = $j$076; + $wk_max$2 = $215; + break; + } + } + if ($75) { + $78 = HEAP32[$labelInfo + 1179664 + ($70 + -1 << 2) >> 2] | 0; + $81 = HEAP32[$labelInfo + 1179664 + ($74 + -1 << 2) >> 2] | 0; + if (($78 | 0) > ($81 | 0)) { + HEAP16[$pnt2$368 >> 1] = $81; + if (($wk_max$160 | 0) > 0) { + $k$056 = 0; + $wk$057 = $19; + while (1) { + if ((HEAP32[$wk$057 >> 2] | 0) == ($78 | 0)) HEAP32[$wk$057 >> 2] = $81; + $k$056 = $k$056 + 1 | 0; + if (($k$056 | 0) >= ($wk_max$160 | 0)) { + $98 = $81; + break; + } else $wk$057 = $wk$057 + 4 | 0; + } + } else $98 = $81; + } else { + HEAP16[$pnt2$368 >> 1] = $78; + if (($78 | 0) < ($81 | 0) & ($wk_max$160 | 0) > 0) { + $k$153 = 0; + $wk$154 = $19; + while (1) { + if ((HEAP32[$wk$154 >> 2] | 0) == ($81 | 0)) HEAP32[$wk$154 >> 2] = $78; + $k$153 = $k$153 + 1 | 0; + if (($k$153 | 0) >= ($wk_max$160 | 0)) { + $98 = $78; + break; + } else $wk$154 = $wk$154 + 4 | 0; + } + } else $98 = $78; + } + $100 = ($98 << 16 >> 16) * 7 | 0; + $102 = $labelInfo + 1310736 + ($100 + -7 << 2) | 0; + HEAP32[$102 >> 2] = (HEAP32[$102 >> 2] | 0) + 1; + $106 = $labelInfo + 1310736 + ($100 + -6 << 2) | 0; + HEAP32[$106 >> 2] = (HEAP32[$106 >> 2] | 0) + $i$265; + $110 = $labelInfo + 1310736 + ($100 + -5 << 2) | 0; + HEAP32[$110 >> 2] = (HEAP32[$110 >> 2] | 0) + $j$076; + HEAP32[$labelInfo + 1310736 + ($100 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $116 = HEAP16[$pnt2$368 + -2 >> 1] | 0; + if ($116 << 16 >> 16 <= 0) { + HEAP16[$pnt2$368 >> 1] = $69; + $156 = $70 * 7 | 0; + $158 = $labelInfo + 1310736 + ($156 + -7 << 2) | 0; + HEAP32[$158 >> 2] = (HEAP32[$158 >> 2] | 0) + 1; + $162 = $labelInfo + 1310736 + ($156 + -6 << 2) | 0; + HEAP32[$162 >> 2] = (HEAP32[$162 >> 2] | 0) + $i$265; + $166 = $labelInfo + 1310736 + ($156 + -5 << 2) | 0; + HEAP32[$166 >> 2] = (HEAP32[$166 >> 2] | 0) + $j$076; + $170 = $labelInfo + 1310736 + ($156 + -4 << 2) | 0; + if ((HEAP32[$170 >> 2] | 0) > ($i$265 | 0)) HEAP32[$170 >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($156 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $121 = HEAP32[$labelInfo + 1179664 + ($70 + -1 << 2) >> 2] | 0; + $124 = HEAP32[$labelInfo + 1179664 + (($116 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($121 | 0) > ($124 | 0)) { + HEAP16[$pnt2$368 >> 1] = $124; + if (($wk_max$160 | 0) > 0) { + $k$249 = 0; + $wk$250 = $19; + while (1) { + if ((HEAP32[$wk$250 >> 2] | 0) == ($121 | 0)) HEAP32[$wk$250 >> 2] = $124; + $k$249 = $k$249 + 1 | 0; + if (($k$249 | 0) >= ($wk_max$160 | 0)) { + $141 = $124; + break; + } else $wk$250 = $wk$250 + 4 | 0; + } + } else $141 = $124; + } else { + HEAP16[$pnt2$368 >> 1] = $121; + if (($121 | 0) < ($124 | 0) & ($wk_max$160 | 0) > 0) { + $k$346 = 0; + $wk$347 = $19; + while (1) { + if ((HEAP32[$wk$347 >> 2] | 0) == ($124 | 0)) HEAP32[$wk$347 >> 2] = $121; + $k$346 = $k$346 + 1 | 0; + if (($k$346 | 0) >= ($wk_max$160 | 0)) { + $141 = $121; + break; + } else $wk$347 = $wk$347 + 4 | 0; + } + } else $141 = $121; + } + $143 = ($141 << 16 >> 16) * 7 | 0; + $145 = $labelInfo + 1310736 + ($143 + -7 << 2) | 0; + HEAP32[$145 >> 2] = (HEAP32[$145 >> 2] | 0) + 1; + $149 = $labelInfo + 1310736 + ($143 + -6 << 2) | 0; + HEAP32[$149 >> 2] = (HEAP32[$149 >> 2] | 0) + $i$265; + $153 = $labelInfo + 1310736 + ($143 + -5 << 2) | 0; + HEAP32[$153 >> 2] = (HEAP32[$153 >> 2] | 0) + $j$076; + $wk_max$2 = $wk_max$160; + } while (0); + $i$265 = $i$265 + 1 | 0; + $235 = $pnt$169 + 4 | 0; + $236 = $pnt2$368 + 2 | 0; + $237 = $dpnt$167 + 1 | 0; + if (($i$265 | 0) >= ($12 | 0)) { + $dpnt$1$lcssa = $237; + $pnt$1$lcssa = $235; + $pnt2$3$lcssa = $236; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $dpnt$167 = $237; + $pnt$169 = $235; + $pnt2$368 = $236; + $wk_max$160 = $wk_max$2; + } + } + } else { + $dpnt$1$lcssa = $dpnt$078; + $pnt$1$lcssa = $pnt$080; + $pnt2$3$lcssa = $pnt2$279; + $wk_max$1$lcssa = $wk_max$075; + } + $j$076 = $j$076 + 1 | 0; + if (($j$076 | 0) >= ($3 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $dpnt$078 = $dpnt$1$lcssa + 2 | 0; + $pnt$080 = $pnt$1$lcssa + $$sum | 0; + $pnt2$279 = $pnt2$3$lcssa + 4 | 0; + $wk_max$075 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $244 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$342 = 1; + $j$143 = 1; + $wk$444 = $19; + while (1) { + $246 = HEAP32[$wk$444 >> 2] | 0; + if (($246 | 0) == ($i$342 | 0)) { + $252 = $j$143; + $j$2 = $j$143 + 1 | 0; + } else { + $252 = HEAP32[$labelInfo + 1179664 + ($246 + -1 << 2) >> 2] | 0; + $j$2 = $j$143; + } + HEAP32[$wk$444 >> 2] = $252; + if (($i$342 | 0) < ($wk_max$0$lcssa | 0)) { + $i$342 = $i$342 + 1 | 0; + $j$143 = $j$2; + $wk$444 = $wk$444 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $256 = $labelInfo + 8 | 0; + $257 = $j$1$lcssa + -1 | 0; + HEAP32[$256 >> 2] = $257; + if (!$257) $$0 = 0; else { + _memset($244 | 0, 0, $257 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $257 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$440 = 0; + do { + $264 = $i$440 << 2; + HEAP32[$labelInfo + 131084 + ($264 << 2) >> 2] = $0; + HEAP32[$labelInfo + 131084 + (($264 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($264 | 2) << 2) >> 2] = $1; + HEAP32[$labelInfo + 131084 + (($264 | 3) << 2) >> 2] = 0; + $i$440 = $i$440 + 1 | 0; + } while (($i$440 | 0) < (HEAP32[$256 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$538 = 0; + do { + $278 = (HEAP32[$labelInfo + 1179664 + ($i$538 << 2) >> 2] | 0) + -1 | 0; + $279 = $i$538 * 7 | 0; + $282 = $labelInfo + 12 + ($278 << 2) | 0; + HEAP32[$282 >> 2] = (HEAP32[$282 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($279 << 2) >> 2] | 0); + $289 = $278 << 1; + $290 = $labelInfo + 655376 + ($289 << 3) | 0; + HEAPF64[$290 >> 3] = +HEAPF64[$290 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($279 + 1 << 2) >> 2] | 0); + $298 = $labelInfo + 655376 + (($289 | 1) << 3) | 0; + HEAPF64[$298 >> 3] = +HEAPF64[$298 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($279 + 2 << 2) >> 2] | 0); + $301 = $278 << 2; + $302 = $labelInfo + 131084 + ($301 << 2) | 0; + $306 = HEAP32[$labelInfo + 1310736 + ($279 + 3 << 2) >> 2] | 0; + if ((HEAP32[$302 >> 2] | 0) > ($306 | 0)) HEAP32[$302 >> 2] = $306; + $309 = $labelInfo + 131084 + (($301 | 1) << 2) | 0; + $313 = HEAP32[$labelInfo + 1310736 + ($279 + 4 << 2) >> 2] | 0; + if ((HEAP32[$309 >> 2] | 0) < ($313 | 0)) HEAP32[$309 >> 2] = $313; + $316 = $labelInfo + 131084 + (($301 | 2) << 2) | 0; + $320 = HEAP32[$labelInfo + 1310736 + ($279 + 5 << 2) >> 2] | 0; + if ((HEAP32[$316 >> 2] | 0) > ($320 | 0)) HEAP32[$316 >> 2] = $320; + $323 = $labelInfo + 131084 + (($301 | 3) << 2) | 0; + $327 = HEAP32[$labelInfo + 1310736 + ($279 + 6 << 2) >> 2] | 0; + if ((HEAP32[$323 >> 2] | 0) < ($327 | 0)) HEAP32[$323 >> 2] = $327; + $i$538 = $i$538 + 1 | 0; + } while (($i$538 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$256 >> 2] | 0) > 0) { + $i$637 = 0; + do { + $331 = $labelInfo + 12 + ($i$637 << 2) | 0; + $334 = $i$637 << 1; + $335 = $labelInfo + 655376 + ($334 << 3) | 0; + HEAPF64[$335 >> 3] = +HEAPF64[$335 >> 3] / +(HEAP32[$331 >> 2] | 0); + $341 = $labelInfo + 655376 + (($334 | 1) << 3) | 0; + HEAPF64[$341 >> 3] = +HEAPF64[$341 >> 3] / +(HEAP32[$331 >> 2] | 0); + $i$637 = $i$637 + 1 | 0; + } while (($i$637 | 0) < (HEAP32[$256 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubEWI3C565($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $$sum2 = 0, $0 = 0, $1 = 0, $100 = 0, $102 = 0, $106 = 0, $11 = 0, $110 = 0, $116 = 0, $12 = 0, $121 = 0, $124 = 0, $141 = 0, $143 = 0, $145 = 0, $149 = 0, $153 = 0, $156 = 0, $158 = 0, $162 = 0, $166 = 0, $170 = 0, $175 = 0, $177 = 0, $181 = 0, $185 = 0, $189 = 0, $19 = 0, $195 = 0, $198 = 0, $2 = 0, $20 = 0, $200 = 0, $204 = 0, $208 = 0, $212 = 0, $215 = 0, $22 = 0, $220 = 0, $235 = 0, $236 = 0, $237 = 0, $244 = 0, $246 = 0, $252 = 0, $256 = 0, $257 = 0, $264 = 0, $278 = 0, $279 = 0, $282 = 0, $289 = 0, $290 = 0, $298 = 0, $3 = 0, $301 = 0, $302 = 0, $306 = 0, $309 = 0, $31 = 0, $313 = 0, $316 = 0, $320 = 0, $323 = 0, $327 = 0, $33 = 0, $331 = 0, $334 = 0, $335 = 0, $341 = 0, $39 = 0, $50 = 0, $53 = 0, $55 = 0, $59 = 0, $63 = 0, $69 = 0, $70 = 0, $73 = 0, $74 = 0, $75 = 0, $78 = 0, $81 = 0, $98 = 0, $dpnt$078 = 0, $dpnt$1$lcssa = 0, $dpnt$167 = 0, $i$089 = 0, $i$183 = 0, $i$265 = 0, $i$342 = 0, $i$440 = 0, $i$538 = 0, $i$637 = 0, $j$076 = 0, $j$1$lcssa = 0, $j$143 = 0, $j$2 = 0, $k$056 = 0, $k$153 = 0, $k$249 = 0, $k$346 = 0, $pnt$080 = 0, $pnt$1$lcssa = 0, $pnt$169 = 0, $pnt1$091 = 0, $pnt1$185 = 0, $pnt2$090 = 0, $pnt2$184 = 0, $pnt2$279 = 0, $pnt2$3$lcssa = 0, $pnt2$368 = 0, $vararg_buffer = 0, $wk$057 = 0, $wk$154 = 0, $wk$250 = 0, $wk$347 = 0, $wk$444 = 0, $wk_max$0$lcssa = 0, $wk_max$075 = 0, $wk_max$1$lcssa = 0, $wk_max$160 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = ($xsize | 0) / 2 | 0; + $1 = ($ysize | 0) / 2 | 0; + $2 = HEAP32[$labelInfo >> 2] | 0; + $3 = $1 + -1 | 0; + if (($xsize | 0) > 1) { + $i$089 = 0; + $pnt1$091 = $2; + $pnt2$090 = $2 + ((Math_imul($3, $0) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$090 >> 1] = 0; + HEAP16[$pnt1$091 >> 1] = 0; + $i$089 = $i$089 + 1 | 0; + if (($i$089 | 0) >= ($0 | 0)) break; else { + $pnt1$091 = $pnt1$091 + 2 | 0; + $pnt2$090 = $pnt2$090 + 2 | 0; + } + } + } + $11 = $labelingThresh * 3 | 0; + $12 = $0 + -1 | 0; + if (($ysize | 0) > 1) { + $i$183 = 0; + $pnt1$185 = $2; + $pnt2$184 = $2 + ($12 << 1) | 0; + while (1) { + HEAP16[$pnt2$184 >> 1] = 0; + HEAP16[$pnt1$185 >> 1] = 0; + $i$183 = $i$183 + 1 | 0; + if (($i$183 | 0) >= ($1 | 0)) break; else { + $pnt1$185 = $pnt1$185 + ($0 << 1) | 0; + $pnt2$184 = $pnt2$184 + ($0 << 1) | 0; + } + } + } + $19 = $labelInfo + 1179664 | 0; + $20 = $0 + 1 | 0; + $22 = 0 - $0 | 0; + $$sum1 = 1 - $0 | 0; + $$sum2 = ~$0; + $$sum = ($xsize << 1) + 8 | 0; + L11 : do if (($3 | 0) > 1) { + $31 = ($12 | 0) > 1; + $dpnt$078 = (HEAP32[$labelInfo + 4 >> 2] | 0) + $20 | 0; + $j$076 = 1; + $pnt$080 = $image + (($xsize << 2) + 4) | 0; + $pnt2$279 = $2 + ($20 << 1) | 0; + $wk_max$075 = 0; + L13 : while (1) { + if ($31) { + $dpnt$167 = $dpnt$078; + $i$265 = 1; + $pnt$169 = $pnt$080; + $pnt2$368 = $pnt2$279; + $wk_max$160 = $wk_max$075; + while (1) { + $33 = HEAPU8[$pnt$169 >> 0] | 0; + $39 = HEAPU8[$pnt$169 + 1 >> 0] | 0; + do if ((($33 & 248) + 10 + ($33 << 5 & 224) + ($39 >>> 3 & 28) + ($39 << 3 & 248) | 0) > ($11 | 0)) { + HEAP8[$dpnt$167 >> 0] = -1; + $50 = HEAP16[$pnt2$368 + ($22 << 1) >> 1] | 0; + if ($50 << 16 >> 16 > 0) { + HEAP16[$pnt2$368 >> 1] = $50; + $53 = ($50 << 16 >> 16) * 7 | 0; + $55 = $labelInfo + 1310736 + ($53 + -7 << 2) | 0; + HEAP32[$55 >> 2] = (HEAP32[$55 >> 2] | 0) + 1; + $59 = $labelInfo + 1310736 + ($53 + -6 << 2) | 0; + HEAP32[$59 >> 2] = (HEAP32[$59 >> 2] | 0) + $i$265; + $63 = $labelInfo + 1310736 + ($53 + -5 << 2) | 0; + HEAP32[$63 >> 2] = (HEAP32[$63 >> 2] | 0) + $j$076; + HEAP32[$labelInfo + 1310736 + ($53 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $69 = HEAP16[$pnt2$368 + ($$sum1 << 1) >> 1] | 0; + $70 = $69 << 16 >> 16; + $73 = HEAP16[$pnt2$368 + ($$sum2 << 1) >> 1] | 0; + $74 = $73 << 16 >> 16; + $75 = $73 << 16 >> 16 > 0; + if ($69 << 16 >> 16 <= 0) { + if ($75) { + HEAP16[$pnt2$368 >> 1] = $73; + $175 = $74 * 7 | 0; + $177 = $labelInfo + 1310736 + ($175 + -7 << 2) | 0; + HEAP32[$177 >> 2] = (HEAP32[$177 >> 2] | 0) + 1; + $181 = $labelInfo + 1310736 + ($175 + -6 << 2) | 0; + HEAP32[$181 >> 2] = (HEAP32[$181 >> 2] | 0) + $i$265; + $185 = $labelInfo + 1310736 + ($175 + -5 << 2) | 0; + HEAP32[$185 >> 2] = (HEAP32[$185 >> 2] | 0) + $j$076; + $189 = $labelInfo + 1310736 + ($175 + -3 << 2) | 0; + if ((HEAP32[$189 >> 2] | 0) < ($i$265 | 0)) HEAP32[$189 >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($175 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $195 = HEAP16[$pnt2$368 + -2 >> 1] | 0; + if ($195 << 16 >> 16 > 0) { + HEAP16[$pnt2$368 >> 1] = $195; + $198 = ($195 << 16 >> 16) * 7 | 0; + $200 = $labelInfo + 1310736 + ($198 + -7 << 2) | 0; + HEAP32[$200 >> 2] = (HEAP32[$200 >> 2] | 0) + 1; + $204 = $labelInfo + 1310736 + ($198 + -6 << 2) | 0; + HEAP32[$204 >> 2] = (HEAP32[$204 >> 2] | 0) + $i$265; + $208 = $labelInfo + 1310736 + ($198 + -5 << 2) | 0; + HEAP32[$208 >> 2] = (HEAP32[$208 >> 2] | 0) + $j$076; + $212 = $labelInfo + 1310736 + ($198 + -3 << 2) | 0; + if ((HEAP32[$212 >> 2] | 0) >= ($i$265 | 0)) { + $wk_max$2 = $wk_max$160; + break; + } + HEAP32[$212 >> 2] = $i$265; + $wk_max$2 = $wk_max$160; + break; + } else { + $215 = $wk_max$160 + 1 | 0; + if (($wk_max$160 | 0) > 32767) break L13; + HEAP16[$pnt2$368 >> 1] = $215; + HEAP32[$labelInfo + 1179664 + ($wk_max$160 << 2) >> 2] = $215 << 16 >> 16; + $220 = $wk_max$160 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($220 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($220 + 1 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($220 + 2 << 2) >> 2] = $j$076; + HEAP32[$labelInfo + 1310736 + ($220 + 3 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($220 + 4 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($220 + 5 << 2) >> 2] = $j$076; + HEAP32[$labelInfo + 1310736 + ($220 + 6 << 2) >> 2] = $j$076; + $wk_max$2 = $215; + break; + } + } + if ($75) { + $78 = HEAP32[$labelInfo + 1179664 + ($70 + -1 << 2) >> 2] | 0; + $81 = HEAP32[$labelInfo + 1179664 + ($74 + -1 << 2) >> 2] | 0; + if (($78 | 0) > ($81 | 0)) { + HEAP16[$pnt2$368 >> 1] = $81; + if (($wk_max$160 | 0) > 0) { + $k$056 = 0; + $wk$057 = $19; + while (1) { + if ((HEAP32[$wk$057 >> 2] | 0) == ($78 | 0)) HEAP32[$wk$057 >> 2] = $81; + $k$056 = $k$056 + 1 | 0; + if (($k$056 | 0) >= ($wk_max$160 | 0)) { + $98 = $81; + break; + } else $wk$057 = $wk$057 + 4 | 0; + } + } else $98 = $81; + } else { + HEAP16[$pnt2$368 >> 1] = $78; + if (($78 | 0) < ($81 | 0) & ($wk_max$160 | 0) > 0) { + $k$153 = 0; + $wk$154 = $19; + while (1) { + if ((HEAP32[$wk$154 >> 2] | 0) == ($81 | 0)) HEAP32[$wk$154 >> 2] = $78; + $k$153 = $k$153 + 1 | 0; + if (($k$153 | 0) >= ($wk_max$160 | 0)) { + $98 = $78; + break; + } else $wk$154 = $wk$154 + 4 | 0; + } + } else $98 = $78; + } + $100 = ($98 << 16 >> 16) * 7 | 0; + $102 = $labelInfo + 1310736 + ($100 + -7 << 2) | 0; + HEAP32[$102 >> 2] = (HEAP32[$102 >> 2] | 0) + 1; + $106 = $labelInfo + 1310736 + ($100 + -6 << 2) | 0; + HEAP32[$106 >> 2] = (HEAP32[$106 >> 2] | 0) + $i$265; + $110 = $labelInfo + 1310736 + ($100 + -5 << 2) | 0; + HEAP32[$110 >> 2] = (HEAP32[$110 >> 2] | 0) + $j$076; + HEAP32[$labelInfo + 1310736 + ($100 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $116 = HEAP16[$pnt2$368 + -2 >> 1] | 0; + if ($116 << 16 >> 16 <= 0) { + HEAP16[$pnt2$368 >> 1] = $69; + $156 = $70 * 7 | 0; + $158 = $labelInfo + 1310736 + ($156 + -7 << 2) | 0; + HEAP32[$158 >> 2] = (HEAP32[$158 >> 2] | 0) + 1; + $162 = $labelInfo + 1310736 + ($156 + -6 << 2) | 0; + HEAP32[$162 >> 2] = (HEAP32[$162 >> 2] | 0) + $i$265; + $166 = $labelInfo + 1310736 + ($156 + -5 << 2) | 0; + HEAP32[$166 >> 2] = (HEAP32[$166 >> 2] | 0) + $j$076; + $170 = $labelInfo + 1310736 + ($156 + -4 << 2) | 0; + if ((HEAP32[$170 >> 2] | 0) > ($i$265 | 0)) HEAP32[$170 >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($156 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $121 = HEAP32[$labelInfo + 1179664 + ($70 + -1 << 2) >> 2] | 0; + $124 = HEAP32[$labelInfo + 1179664 + (($116 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($121 | 0) > ($124 | 0)) { + HEAP16[$pnt2$368 >> 1] = $124; + if (($wk_max$160 | 0) > 0) { + $k$249 = 0; + $wk$250 = $19; + while (1) { + if ((HEAP32[$wk$250 >> 2] | 0) == ($121 | 0)) HEAP32[$wk$250 >> 2] = $124; + $k$249 = $k$249 + 1 | 0; + if (($k$249 | 0) >= ($wk_max$160 | 0)) { + $141 = $124; + break; + } else $wk$250 = $wk$250 + 4 | 0; + } + } else $141 = $124; + } else { + HEAP16[$pnt2$368 >> 1] = $121; + if (($121 | 0) < ($124 | 0) & ($wk_max$160 | 0) > 0) { + $k$346 = 0; + $wk$347 = $19; + while (1) { + if ((HEAP32[$wk$347 >> 2] | 0) == ($124 | 0)) HEAP32[$wk$347 >> 2] = $121; + $k$346 = $k$346 + 1 | 0; + if (($k$346 | 0) >= ($wk_max$160 | 0)) { + $141 = $121; + break; + } else $wk$347 = $wk$347 + 4 | 0; + } + } else $141 = $121; + } + $143 = ($141 << 16 >> 16) * 7 | 0; + $145 = $labelInfo + 1310736 + ($143 + -7 << 2) | 0; + HEAP32[$145 >> 2] = (HEAP32[$145 >> 2] | 0) + 1; + $149 = $labelInfo + 1310736 + ($143 + -6 << 2) | 0; + HEAP32[$149 >> 2] = (HEAP32[$149 >> 2] | 0) + $i$265; + $153 = $labelInfo + 1310736 + ($143 + -5 << 2) | 0; + HEAP32[$153 >> 2] = (HEAP32[$153 >> 2] | 0) + $j$076; + $wk_max$2 = $wk_max$160; + } else { + HEAP16[$pnt2$368 >> 1] = 0; + HEAP8[$dpnt$167 >> 0] = 0; + $wk_max$2 = $wk_max$160; + } while (0); + $i$265 = $i$265 + 1 | 0; + $235 = $pnt$169 + 4 | 0; + $236 = $pnt2$368 + 2 | 0; + $237 = $dpnt$167 + 1 | 0; + if (($i$265 | 0) >= ($12 | 0)) { + $dpnt$1$lcssa = $237; + $pnt$1$lcssa = $235; + $pnt2$3$lcssa = $236; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $dpnt$167 = $237; + $pnt$169 = $235; + $pnt2$368 = $236; + $wk_max$160 = $wk_max$2; + } + } + } else { + $dpnt$1$lcssa = $dpnt$078; + $pnt$1$lcssa = $pnt$080; + $pnt2$3$lcssa = $pnt2$279; + $wk_max$1$lcssa = $wk_max$075; + } + $j$076 = $j$076 + 1 | 0; + if (($j$076 | 0) >= ($3 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $dpnt$078 = $dpnt$1$lcssa + 2 | 0; + $pnt$080 = $pnt$1$lcssa + $$sum | 0; + $pnt2$279 = $pnt2$3$lcssa + 4 | 0; + $wk_max$075 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $244 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$342 = 1; + $j$143 = 1; + $wk$444 = $19; + while (1) { + $246 = HEAP32[$wk$444 >> 2] | 0; + if (($246 | 0) == ($i$342 | 0)) { + $252 = $j$143; + $j$2 = $j$143 + 1 | 0; + } else { + $252 = HEAP32[$labelInfo + 1179664 + ($246 + -1 << 2) >> 2] | 0; + $j$2 = $j$143; + } + HEAP32[$wk$444 >> 2] = $252; + if (($i$342 | 0) < ($wk_max$0$lcssa | 0)) { + $i$342 = $i$342 + 1 | 0; + $j$143 = $j$2; + $wk$444 = $wk$444 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $256 = $labelInfo + 8 | 0; + $257 = $j$1$lcssa + -1 | 0; + HEAP32[$256 >> 2] = $257; + if (!$257) $$0 = 0; else { + _memset($244 | 0, 0, $257 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $257 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$440 = 0; + do { + $264 = $i$440 << 2; + HEAP32[$labelInfo + 131084 + ($264 << 2) >> 2] = $0; + HEAP32[$labelInfo + 131084 + (($264 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($264 | 2) << 2) >> 2] = $1; + HEAP32[$labelInfo + 131084 + (($264 | 3) << 2) >> 2] = 0; + $i$440 = $i$440 + 1 | 0; + } while (($i$440 | 0) < (HEAP32[$256 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$538 = 0; + do { + $278 = (HEAP32[$labelInfo + 1179664 + ($i$538 << 2) >> 2] | 0) + -1 | 0; + $279 = $i$538 * 7 | 0; + $282 = $labelInfo + 12 + ($278 << 2) | 0; + HEAP32[$282 >> 2] = (HEAP32[$282 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($279 << 2) >> 2] | 0); + $289 = $278 << 1; + $290 = $labelInfo + 655376 + ($289 << 3) | 0; + HEAPF64[$290 >> 3] = +HEAPF64[$290 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($279 + 1 << 2) >> 2] | 0); + $298 = $labelInfo + 655376 + (($289 | 1) << 3) | 0; + HEAPF64[$298 >> 3] = +HEAPF64[$298 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($279 + 2 << 2) >> 2] | 0); + $301 = $278 << 2; + $302 = $labelInfo + 131084 + ($301 << 2) | 0; + $306 = HEAP32[$labelInfo + 1310736 + ($279 + 3 << 2) >> 2] | 0; + if ((HEAP32[$302 >> 2] | 0) > ($306 | 0)) HEAP32[$302 >> 2] = $306; + $309 = $labelInfo + 131084 + (($301 | 1) << 2) | 0; + $313 = HEAP32[$labelInfo + 1310736 + ($279 + 4 << 2) >> 2] | 0; + if ((HEAP32[$309 >> 2] | 0) < ($313 | 0)) HEAP32[$309 >> 2] = $313; + $316 = $labelInfo + 131084 + (($301 | 2) << 2) | 0; + $320 = HEAP32[$labelInfo + 1310736 + ($279 + 5 << 2) >> 2] | 0; + if ((HEAP32[$316 >> 2] | 0) > ($320 | 0)) HEAP32[$316 >> 2] = $320; + $323 = $labelInfo + 131084 + (($301 | 3) << 2) | 0; + $327 = HEAP32[$labelInfo + 1310736 + ($279 + 6 << 2) >> 2] | 0; + if ((HEAP32[$323 >> 2] | 0) < ($327 | 0)) HEAP32[$323 >> 2] = $327; + $i$538 = $i$538 + 1 | 0; + } while (($i$538 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$256 >> 2] | 0) > 0) { + $i$637 = 0; + do { + $331 = $labelInfo + 12 + ($i$637 << 2) | 0; + $334 = $i$637 << 1; + $335 = $labelInfo + 655376 + ($334 << 3) | 0; + HEAPF64[$335 >> 3] = +HEAPF64[$335 >> 3] / +(HEAP32[$331 >> 2] | 0); + $341 = $labelInfo + 655376 + (($334 | 1) << 3) | 0; + HEAPF64[$341 >> 3] = +HEAPF64[$341 >> 3] / +(HEAP32[$331 >> 2] | 0); + $i$637 = $i$637 + 1 | 0; + } while (($i$637 | 0) < (HEAP32[$256 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubEBI3C565($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $$sum2 = 0, $0 = 0, $1 = 0, $100 = 0, $102 = 0, $106 = 0, $11 = 0, $110 = 0, $116 = 0, $12 = 0, $121 = 0, $124 = 0, $141 = 0, $143 = 0, $145 = 0, $149 = 0, $153 = 0, $156 = 0, $158 = 0, $162 = 0, $166 = 0, $170 = 0, $175 = 0, $177 = 0, $181 = 0, $185 = 0, $189 = 0, $19 = 0, $195 = 0, $198 = 0, $2 = 0, $20 = 0, $200 = 0, $204 = 0, $208 = 0, $212 = 0, $215 = 0, $22 = 0, $220 = 0, $235 = 0, $236 = 0, $237 = 0, $244 = 0, $246 = 0, $252 = 0, $256 = 0, $257 = 0, $264 = 0, $278 = 0, $279 = 0, $282 = 0, $289 = 0, $290 = 0, $298 = 0, $3 = 0, $301 = 0, $302 = 0, $306 = 0, $309 = 0, $31 = 0, $313 = 0, $316 = 0, $320 = 0, $323 = 0, $327 = 0, $33 = 0, $331 = 0, $334 = 0, $335 = 0, $341 = 0, $39 = 0, $50 = 0, $53 = 0, $55 = 0, $59 = 0, $63 = 0, $69 = 0, $70 = 0, $73 = 0, $74 = 0, $75 = 0, $78 = 0, $81 = 0, $98 = 0, $dpnt$078 = 0, $dpnt$1$lcssa = 0, $dpnt$167 = 0, $i$089 = 0, $i$183 = 0, $i$265 = 0, $i$342 = 0, $i$440 = 0, $i$538 = 0, $i$637 = 0, $j$076 = 0, $j$1$lcssa = 0, $j$143 = 0, $j$2 = 0, $k$056 = 0, $k$153 = 0, $k$249 = 0, $k$346 = 0, $pnt$080 = 0, $pnt$1$lcssa = 0, $pnt$169 = 0, $pnt1$091 = 0, $pnt1$185 = 0, $pnt2$090 = 0, $pnt2$184 = 0, $pnt2$279 = 0, $pnt2$3$lcssa = 0, $pnt2$368 = 0, $vararg_buffer = 0, $wk$057 = 0, $wk$154 = 0, $wk$250 = 0, $wk$347 = 0, $wk$444 = 0, $wk_max$0$lcssa = 0, $wk_max$075 = 0, $wk_max$1$lcssa = 0, $wk_max$160 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = ($xsize | 0) / 2 | 0; + $1 = ($ysize | 0) / 2 | 0; + $2 = HEAP32[$labelInfo >> 2] | 0; + $3 = $1 + -1 | 0; + if (($xsize | 0) > 1) { + $i$089 = 0; + $pnt1$091 = $2; + $pnt2$090 = $2 + ((Math_imul($3, $0) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$090 >> 1] = 0; + HEAP16[$pnt1$091 >> 1] = 0; + $i$089 = $i$089 + 1 | 0; + if (($i$089 | 0) >= ($0 | 0)) break; else { + $pnt1$091 = $pnt1$091 + 2 | 0; + $pnt2$090 = $pnt2$090 + 2 | 0; + } + } + } + $11 = $labelingThresh * 3 | 0; + $12 = $0 + -1 | 0; + if (($ysize | 0) > 1) { + $i$183 = 0; + $pnt1$185 = $2; + $pnt2$184 = $2 + ($12 << 1) | 0; + while (1) { + HEAP16[$pnt2$184 >> 1] = 0; + HEAP16[$pnt1$185 >> 1] = 0; + $i$183 = $i$183 + 1 | 0; + if (($i$183 | 0) >= ($1 | 0)) break; else { + $pnt1$185 = $pnt1$185 + ($0 << 1) | 0; + $pnt2$184 = $pnt2$184 + ($0 << 1) | 0; + } + } + } + $19 = $labelInfo + 1179664 | 0; + $20 = $0 + 1 | 0; + $22 = 0 - $0 | 0; + $$sum1 = 1 - $0 | 0; + $$sum2 = ~$0; + $$sum = ($xsize << 1) + 8 | 0; + L11 : do if (($3 | 0) > 1) { + $31 = ($12 | 0) > 1; + $dpnt$078 = (HEAP32[$labelInfo + 4 >> 2] | 0) + $20 | 0; + $j$076 = 1; + $pnt$080 = $image + (($xsize << 2) + 4) | 0; + $pnt2$279 = $2 + ($20 << 1) | 0; + $wk_max$075 = 0; + L13 : while (1) { + if ($31) { + $dpnt$167 = $dpnt$078; + $i$265 = 1; + $pnt$169 = $pnt$080; + $pnt2$368 = $pnt2$279; + $wk_max$160 = $wk_max$075; + while (1) { + $33 = HEAPU8[$pnt$169 >> 0] | 0; + $39 = HEAPU8[$pnt$169 + 1 >> 0] | 0; + do if ((($33 & 248) + 10 + ($33 << 5 & 224) + ($39 >>> 3 & 28) + ($39 << 3 & 248) | 0) > ($11 | 0)) { + HEAP16[$pnt2$368 >> 1] = 0; + HEAP8[$dpnt$167 >> 0] = 0; + $wk_max$2 = $wk_max$160; + } else { + HEAP8[$dpnt$167 >> 0] = -1; + $50 = HEAP16[$pnt2$368 + ($22 << 1) >> 1] | 0; + if ($50 << 16 >> 16 > 0) { + HEAP16[$pnt2$368 >> 1] = $50; + $53 = ($50 << 16 >> 16) * 7 | 0; + $55 = $labelInfo + 1310736 + ($53 + -7 << 2) | 0; + HEAP32[$55 >> 2] = (HEAP32[$55 >> 2] | 0) + 1; + $59 = $labelInfo + 1310736 + ($53 + -6 << 2) | 0; + HEAP32[$59 >> 2] = (HEAP32[$59 >> 2] | 0) + $i$265; + $63 = $labelInfo + 1310736 + ($53 + -5 << 2) | 0; + HEAP32[$63 >> 2] = (HEAP32[$63 >> 2] | 0) + $j$076; + HEAP32[$labelInfo + 1310736 + ($53 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $69 = HEAP16[$pnt2$368 + ($$sum1 << 1) >> 1] | 0; + $70 = $69 << 16 >> 16; + $73 = HEAP16[$pnt2$368 + ($$sum2 << 1) >> 1] | 0; + $74 = $73 << 16 >> 16; + $75 = $73 << 16 >> 16 > 0; + if ($69 << 16 >> 16 <= 0) { + if ($75) { + HEAP16[$pnt2$368 >> 1] = $73; + $175 = $74 * 7 | 0; + $177 = $labelInfo + 1310736 + ($175 + -7 << 2) | 0; + HEAP32[$177 >> 2] = (HEAP32[$177 >> 2] | 0) + 1; + $181 = $labelInfo + 1310736 + ($175 + -6 << 2) | 0; + HEAP32[$181 >> 2] = (HEAP32[$181 >> 2] | 0) + $i$265; + $185 = $labelInfo + 1310736 + ($175 + -5 << 2) | 0; + HEAP32[$185 >> 2] = (HEAP32[$185 >> 2] | 0) + $j$076; + $189 = $labelInfo + 1310736 + ($175 + -3 << 2) | 0; + if ((HEAP32[$189 >> 2] | 0) < ($i$265 | 0)) HEAP32[$189 >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($175 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $195 = HEAP16[$pnt2$368 + -2 >> 1] | 0; + if ($195 << 16 >> 16 > 0) { + HEAP16[$pnt2$368 >> 1] = $195; + $198 = ($195 << 16 >> 16) * 7 | 0; + $200 = $labelInfo + 1310736 + ($198 + -7 << 2) | 0; + HEAP32[$200 >> 2] = (HEAP32[$200 >> 2] | 0) + 1; + $204 = $labelInfo + 1310736 + ($198 + -6 << 2) | 0; + HEAP32[$204 >> 2] = (HEAP32[$204 >> 2] | 0) + $i$265; + $208 = $labelInfo + 1310736 + ($198 + -5 << 2) | 0; + HEAP32[$208 >> 2] = (HEAP32[$208 >> 2] | 0) + $j$076; + $212 = $labelInfo + 1310736 + ($198 + -3 << 2) | 0; + if ((HEAP32[$212 >> 2] | 0) >= ($i$265 | 0)) { + $wk_max$2 = $wk_max$160; + break; + } + HEAP32[$212 >> 2] = $i$265; + $wk_max$2 = $wk_max$160; + break; + } else { + $215 = $wk_max$160 + 1 | 0; + if (($wk_max$160 | 0) > 32767) break L13; + HEAP16[$pnt2$368 >> 1] = $215; + HEAP32[$labelInfo + 1179664 + ($wk_max$160 << 2) >> 2] = $215 << 16 >> 16; + $220 = $wk_max$160 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($220 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($220 + 1 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($220 + 2 << 2) >> 2] = $j$076; + HEAP32[$labelInfo + 1310736 + ($220 + 3 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($220 + 4 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($220 + 5 << 2) >> 2] = $j$076; + HEAP32[$labelInfo + 1310736 + ($220 + 6 << 2) >> 2] = $j$076; + $wk_max$2 = $215; + break; + } + } + if ($75) { + $78 = HEAP32[$labelInfo + 1179664 + ($70 + -1 << 2) >> 2] | 0; + $81 = HEAP32[$labelInfo + 1179664 + ($74 + -1 << 2) >> 2] | 0; + if (($78 | 0) > ($81 | 0)) { + HEAP16[$pnt2$368 >> 1] = $81; + if (($wk_max$160 | 0) > 0) { + $k$056 = 0; + $wk$057 = $19; + while (1) { + if ((HEAP32[$wk$057 >> 2] | 0) == ($78 | 0)) HEAP32[$wk$057 >> 2] = $81; + $k$056 = $k$056 + 1 | 0; + if (($k$056 | 0) >= ($wk_max$160 | 0)) { + $98 = $81; + break; + } else $wk$057 = $wk$057 + 4 | 0; + } + } else $98 = $81; + } else { + HEAP16[$pnt2$368 >> 1] = $78; + if (($78 | 0) < ($81 | 0) & ($wk_max$160 | 0) > 0) { + $k$153 = 0; + $wk$154 = $19; + while (1) { + if ((HEAP32[$wk$154 >> 2] | 0) == ($81 | 0)) HEAP32[$wk$154 >> 2] = $78; + $k$153 = $k$153 + 1 | 0; + if (($k$153 | 0) >= ($wk_max$160 | 0)) { + $98 = $78; + break; + } else $wk$154 = $wk$154 + 4 | 0; + } + } else $98 = $78; + } + $100 = ($98 << 16 >> 16) * 7 | 0; + $102 = $labelInfo + 1310736 + ($100 + -7 << 2) | 0; + HEAP32[$102 >> 2] = (HEAP32[$102 >> 2] | 0) + 1; + $106 = $labelInfo + 1310736 + ($100 + -6 << 2) | 0; + HEAP32[$106 >> 2] = (HEAP32[$106 >> 2] | 0) + $i$265; + $110 = $labelInfo + 1310736 + ($100 + -5 << 2) | 0; + HEAP32[$110 >> 2] = (HEAP32[$110 >> 2] | 0) + $j$076; + HEAP32[$labelInfo + 1310736 + ($100 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $116 = HEAP16[$pnt2$368 + -2 >> 1] | 0; + if ($116 << 16 >> 16 <= 0) { + HEAP16[$pnt2$368 >> 1] = $69; + $156 = $70 * 7 | 0; + $158 = $labelInfo + 1310736 + ($156 + -7 << 2) | 0; + HEAP32[$158 >> 2] = (HEAP32[$158 >> 2] | 0) + 1; + $162 = $labelInfo + 1310736 + ($156 + -6 << 2) | 0; + HEAP32[$162 >> 2] = (HEAP32[$162 >> 2] | 0) + $i$265; + $166 = $labelInfo + 1310736 + ($156 + -5 << 2) | 0; + HEAP32[$166 >> 2] = (HEAP32[$166 >> 2] | 0) + $j$076; + $170 = $labelInfo + 1310736 + ($156 + -4 << 2) | 0; + if ((HEAP32[$170 >> 2] | 0) > ($i$265 | 0)) HEAP32[$170 >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($156 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $121 = HEAP32[$labelInfo + 1179664 + ($70 + -1 << 2) >> 2] | 0; + $124 = HEAP32[$labelInfo + 1179664 + (($116 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($121 | 0) > ($124 | 0)) { + HEAP16[$pnt2$368 >> 1] = $124; + if (($wk_max$160 | 0) > 0) { + $k$249 = 0; + $wk$250 = $19; + while (1) { + if ((HEAP32[$wk$250 >> 2] | 0) == ($121 | 0)) HEAP32[$wk$250 >> 2] = $124; + $k$249 = $k$249 + 1 | 0; + if (($k$249 | 0) >= ($wk_max$160 | 0)) { + $141 = $124; + break; + } else $wk$250 = $wk$250 + 4 | 0; + } + } else $141 = $124; + } else { + HEAP16[$pnt2$368 >> 1] = $121; + if (($121 | 0) < ($124 | 0) & ($wk_max$160 | 0) > 0) { + $k$346 = 0; + $wk$347 = $19; + while (1) { + if ((HEAP32[$wk$347 >> 2] | 0) == ($124 | 0)) HEAP32[$wk$347 >> 2] = $121; + $k$346 = $k$346 + 1 | 0; + if (($k$346 | 0) >= ($wk_max$160 | 0)) { + $141 = $121; + break; + } else $wk$347 = $wk$347 + 4 | 0; + } + } else $141 = $121; + } + $143 = ($141 << 16 >> 16) * 7 | 0; + $145 = $labelInfo + 1310736 + ($143 + -7 << 2) | 0; + HEAP32[$145 >> 2] = (HEAP32[$145 >> 2] | 0) + 1; + $149 = $labelInfo + 1310736 + ($143 + -6 << 2) | 0; + HEAP32[$149 >> 2] = (HEAP32[$149 >> 2] | 0) + $i$265; + $153 = $labelInfo + 1310736 + ($143 + -5 << 2) | 0; + HEAP32[$153 >> 2] = (HEAP32[$153 >> 2] | 0) + $j$076; + $wk_max$2 = $wk_max$160; + } while (0); + $i$265 = $i$265 + 1 | 0; + $235 = $pnt$169 + 4 | 0; + $236 = $pnt2$368 + 2 | 0; + $237 = $dpnt$167 + 1 | 0; + if (($i$265 | 0) >= ($12 | 0)) { + $dpnt$1$lcssa = $237; + $pnt$1$lcssa = $235; + $pnt2$3$lcssa = $236; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $dpnt$167 = $237; + $pnt$169 = $235; + $pnt2$368 = $236; + $wk_max$160 = $wk_max$2; + } + } + } else { + $dpnt$1$lcssa = $dpnt$078; + $pnt$1$lcssa = $pnt$080; + $pnt2$3$lcssa = $pnt2$279; + $wk_max$1$lcssa = $wk_max$075; + } + $j$076 = $j$076 + 1 | 0; + if (($j$076 | 0) >= ($3 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $dpnt$078 = $dpnt$1$lcssa + 2 | 0; + $pnt$080 = $pnt$1$lcssa + $$sum | 0; + $pnt2$279 = $pnt2$3$lcssa + 4 | 0; + $wk_max$075 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $244 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$342 = 1; + $j$143 = 1; + $wk$444 = $19; + while (1) { + $246 = HEAP32[$wk$444 >> 2] | 0; + if (($246 | 0) == ($i$342 | 0)) { + $252 = $j$143; + $j$2 = $j$143 + 1 | 0; + } else { + $252 = HEAP32[$labelInfo + 1179664 + ($246 + -1 << 2) >> 2] | 0; + $j$2 = $j$143; + } + HEAP32[$wk$444 >> 2] = $252; + if (($i$342 | 0) < ($wk_max$0$lcssa | 0)) { + $i$342 = $i$342 + 1 | 0; + $j$143 = $j$2; + $wk$444 = $wk$444 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $256 = $labelInfo + 8 | 0; + $257 = $j$1$lcssa + -1 | 0; + HEAP32[$256 >> 2] = $257; + if (!$257) $$0 = 0; else { + _memset($244 | 0, 0, $257 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $257 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$440 = 0; + do { + $264 = $i$440 << 2; + HEAP32[$labelInfo + 131084 + ($264 << 2) >> 2] = $0; + HEAP32[$labelInfo + 131084 + (($264 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($264 | 2) << 2) >> 2] = $1; + HEAP32[$labelInfo + 131084 + (($264 | 3) << 2) >> 2] = 0; + $i$440 = $i$440 + 1 | 0; + } while (($i$440 | 0) < (HEAP32[$256 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$538 = 0; + do { + $278 = (HEAP32[$labelInfo + 1179664 + ($i$538 << 2) >> 2] | 0) + -1 | 0; + $279 = $i$538 * 7 | 0; + $282 = $labelInfo + 12 + ($278 << 2) | 0; + HEAP32[$282 >> 2] = (HEAP32[$282 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($279 << 2) >> 2] | 0); + $289 = $278 << 1; + $290 = $labelInfo + 655376 + ($289 << 3) | 0; + HEAPF64[$290 >> 3] = +HEAPF64[$290 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($279 + 1 << 2) >> 2] | 0); + $298 = $labelInfo + 655376 + (($289 | 1) << 3) | 0; + HEAPF64[$298 >> 3] = +HEAPF64[$298 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($279 + 2 << 2) >> 2] | 0); + $301 = $278 << 2; + $302 = $labelInfo + 131084 + ($301 << 2) | 0; + $306 = HEAP32[$labelInfo + 1310736 + ($279 + 3 << 2) >> 2] | 0; + if ((HEAP32[$302 >> 2] | 0) > ($306 | 0)) HEAP32[$302 >> 2] = $306; + $309 = $labelInfo + 131084 + (($301 | 1) << 2) | 0; + $313 = HEAP32[$labelInfo + 1310736 + ($279 + 4 << 2) >> 2] | 0; + if ((HEAP32[$309 >> 2] | 0) < ($313 | 0)) HEAP32[$309 >> 2] = $313; + $316 = $labelInfo + 131084 + (($301 | 2) << 2) | 0; + $320 = HEAP32[$labelInfo + 1310736 + ($279 + 5 << 2) >> 2] | 0; + if ((HEAP32[$316 >> 2] | 0) > ($320 | 0)) HEAP32[$316 >> 2] = $320; + $323 = $labelInfo + 131084 + (($301 | 3) << 2) | 0; + $327 = HEAP32[$labelInfo + 1310736 + ($279 + 6 << 2) >> 2] | 0; + if ((HEAP32[$323 >> 2] | 0) < ($327 | 0)) HEAP32[$323 >> 2] = $327; + $i$538 = $i$538 + 1 | 0; + } while (($i$538 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$256 >> 2] | 0) > 0) { + $i$637 = 0; + do { + $331 = $labelInfo + 12 + ($i$637 << 2) | 0; + $334 = $i$637 << 1; + $335 = $labelInfo + 655376 + ($334 << 3) | 0; + HEAPF64[$335 >> 3] = +HEAPF64[$335 >> 3] / +(HEAP32[$331 >> 2] | 0); + $341 = $labelInfo + 655376 + (($334 | 1) << 3) | 0; + HEAPF64[$341 >> 3] = +HEAPF64[$341 >> 3] / +(HEAP32[$331 >> 2] | 0); + $i$637 = $i$637 + 1 | 0; + } while (($i$637 | 0) < (HEAP32[$256 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubEWI3CA4444($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $$sum2 = 0, $0 = 0, $1 = 0, $102 = 0, $106 = 0, $11 = 0, $112 = 0, $117 = 0, $12 = 0, $120 = 0, $137 = 0, $139 = 0, $141 = 0, $145 = 0, $149 = 0, $152 = 0, $154 = 0, $158 = 0, $162 = 0, $166 = 0, $171 = 0, $173 = 0, $177 = 0, $181 = 0, $185 = 0, $19 = 0, $191 = 0, $194 = 0, $196 = 0, $2 = 0, $20 = 0, $200 = 0, $204 = 0, $208 = 0, $211 = 0, $216 = 0, $22 = 0, $231 = 0, $232 = 0, $233 = 0, $240 = 0, $242 = 0, $248 = 0, $252 = 0, $253 = 0, $260 = 0, $274 = 0, $275 = 0, $278 = 0, $285 = 0, $286 = 0, $294 = 0, $297 = 0, $298 = 0, $3 = 0, $302 = 0, $305 = 0, $309 = 0, $31 = 0, $312 = 0, $316 = 0, $319 = 0, $323 = 0, $327 = 0, $33 = 0, $330 = 0, $331 = 0, $337 = 0, $46 = 0, $49 = 0, $51 = 0, $55 = 0, $59 = 0, $65 = 0, $66 = 0, $69 = 0, $70 = 0, $71 = 0, $74 = 0, $77 = 0, $94 = 0, $96 = 0, $98 = 0, $dpnt$078 = 0, $dpnt$1$lcssa = 0, $dpnt$167 = 0, $i$089 = 0, $i$183 = 0, $i$265 = 0, $i$342 = 0, $i$440 = 0, $i$538 = 0, $i$637 = 0, $j$076 = 0, $j$1$lcssa = 0, $j$143 = 0, $j$2 = 0, $k$056 = 0, $k$153 = 0, $k$249 = 0, $k$346 = 0, $pnt$080 = 0, $pnt$1$lcssa = 0, $pnt$169 = 0, $pnt1$091 = 0, $pnt1$185 = 0, $pnt2$090 = 0, $pnt2$184 = 0, $pnt2$279 = 0, $pnt2$3$lcssa = 0, $pnt2$368 = 0, $vararg_buffer = 0, $wk$057 = 0, $wk$154 = 0, $wk$250 = 0, $wk$347 = 0, $wk$444 = 0, $wk_max$0$lcssa = 0, $wk_max$075 = 0, $wk_max$1$lcssa = 0, $wk_max$160 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = ($xsize | 0) / 2 | 0; + $1 = ($ysize | 0) / 2 | 0; + $2 = HEAP32[$labelInfo >> 2] | 0; + $3 = $1 + -1 | 0; + if (($xsize | 0) > 1) { + $i$089 = 0; + $pnt1$091 = $2; + $pnt2$090 = $2 + ((Math_imul($3, $0) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$090 >> 1] = 0; + HEAP16[$pnt1$091 >> 1] = 0; + $i$089 = $i$089 + 1 | 0; + if (($i$089 | 0) >= ($0 | 0)) break; else { + $pnt1$091 = $pnt1$091 + 2 | 0; + $pnt2$090 = $pnt2$090 + 2 | 0; + } + } + } + $11 = $labelingThresh * 3 | 0; + $12 = $0 + -1 | 0; + if (($ysize | 0) > 1) { + $i$183 = 0; + $pnt1$185 = $2; + $pnt2$184 = $2 + ($12 << 1) | 0; + while (1) { + HEAP16[$pnt2$184 >> 1] = 0; + HEAP16[$pnt1$185 >> 1] = 0; + $i$183 = $i$183 + 1 | 0; + if (($i$183 | 0) >= ($1 | 0)) break; else { + $pnt1$185 = $pnt1$185 + ($0 << 1) | 0; + $pnt2$184 = $pnt2$184 + ($0 << 1) | 0; + } + } + } + $19 = $labelInfo + 1179664 | 0; + $20 = $0 + 1 | 0; + $22 = 0 - $0 | 0; + $$sum1 = 1 - $0 | 0; + $$sum2 = ~$0; + $$sum = ($xsize << 1) + 8 | 0; + L11 : do if (($3 | 0) > 1) { + $31 = ($12 | 0) > 1; + $dpnt$078 = (HEAP32[$labelInfo + 4 >> 2] | 0) + $20 | 0; + $j$076 = 1; + $pnt$080 = $image + (($xsize << 2) + 4) | 0; + $pnt2$279 = $2 + ($20 << 1) | 0; + $wk_max$075 = 0; + L13 : while (1) { + if ($31) { + $dpnt$167 = $dpnt$078; + $i$265 = 1; + $pnt$169 = $pnt$080; + $pnt2$368 = $pnt2$279; + $wk_max$160 = $wk_max$075; + while (1) { + $33 = HEAPU8[$pnt$169 >> 0] | 0; + do if ((($33 & 240) + 24 + ($33 << 4 & 240) + ((HEAPU8[$pnt$169 + 1 >> 0] | 0) & 240) | 0) > ($11 | 0)) { + HEAP8[$dpnt$167 >> 0] = -1; + $46 = HEAP16[$pnt2$368 + ($22 << 1) >> 1] | 0; + if ($46 << 16 >> 16 > 0) { + HEAP16[$pnt2$368 >> 1] = $46; + $49 = ($46 << 16 >> 16) * 7 | 0; + $51 = $labelInfo + 1310736 + ($49 + -7 << 2) | 0; + HEAP32[$51 >> 2] = (HEAP32[$51 >> 2] | 0) + 1; + $55 = $labelInfo + 1310736 + ($49 + -6 << 2) | 0; + HEAP32[$55 >> 2] = (HEAP32[$55 >> 2] | 0) + $i$265; + $59 = $labelInfo + 1310736 + ($49 + -5 << 2) | 0; + HEAP32[$59 >> 2] = (HEAP32[$59 >> 2] | 0) + $j$076; + HEAP32[$labelInfo + 1310736 + ($49 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $65 = HEAP16[$pnt2$368 + ($$sum1 << 1) >> 1] | 0; + $66 = $65 << 16 >> 16; + $69 = HEAP16[$pnt2$368 + ($$sum2 << 1) >> 1] | 0; + $70 = $69 << 16 >> 16; + $71 = $69 << 16 >> 16 > 0; + if ($65 << 16 >> 16 <= 0) { + if ($71) { + HEAP16[$pnt2$368 >> 1] = $69; + $171 = $70 * 7 | 0; + $173 = $labelInfo + 1310736 + ($171 + -7 << 2) | 0; + HEAP32[$173 >> 2] = (HEAP32[$173 >> 2] | 0) + 1; + $177 = $labelInfo + 1310736 + ($171 + -6 << 2) | 0; + HEAP32[$177 >> 2] = (HEAP32[$177 >> 2] | 0) + $i$265; + $181 = $labelInfo + 1310736 + ($171 + -5 << 2) | 0; + HEAP32[$181 >> 2] = (HEAP32[$181 >> 2] | 0) + $j$076; + $185 = $labelInfo + 1310736 + ($171 + -3 << 2) | 0; + if ((HEAP32[$185 >> 2] | 0) < ($i$265 | 0)) HEAP32[$185 >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($171 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $191 = HEAP16[$pnt2$368 + -2 >> 1] | 0; + if ($191 << 16 >> 16 > 0) { + HEAP16[$pnt2$368 >> 1] = $191; + $194 = ($191 << 16 >> 16) * 7 | 0; + $196 = $labelInfo + 1310736 + ($194 + -7 << 2) | 0; + HEAP32[$196 >> 2] = (HEAP32[$196 >> 2] | 0) + 1; + $200 = $labelInfo + 1310736 + ($194 + -6 << 2) | 0; + HEAP32[$200 >> 2] = (HEAP32[$200 >> 2] | 0) + $i$265; + $204 = $labelInfo + 1310736 + ($194 + -5 << 2) | 0; + HEAP32[$204 >> 2] = (HEAP32[$204 >> 2] | 0) + $j$076; + $208 = $labelInfo + 1310736 + ($194 + -3 << 2) | 0; + if ((HEAP32[$208 >> 2] | 0) >= ($i$265 | 0)) { + $wk_max$2 = $wk_max$160; + break; + } + HEAP32[$208 >> 2] = $i$265; + $wk_max$2 = $wk_max$160; + break; + } else { + $211 = $wk_max$160 + 1 | 0; + if (($wk_max$160 | 0) > 32767) break L13; + HEAP16[$pnt2$368 >> 1] = $211; + HEAP32[$labelInfo + 1179664 + ($wk_max$160 << 2) >> 2] = $211 << 16 >> 16; + $216 = $wk_max$160 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($216 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($216 + 1 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($216 + 2 << 2) >> 2] = $j$076; + HEAP32[$labelInfo + 1310736 + ($216 + 3 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($216 + 4 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($216 + 5 << 2) >> 2] = $j$076; + HEAP32[$labelInfo + 1310736 + ($216 + 6 << 2) >> 2] = $j$076; + $wk_max$2 = $211; + break; + } + } + if ($71) { + $74 = HEAP32[$labelInfo + 1179664 + ($66 + -1 << 2) >> 2] | 0; + $77 = HEAP32[$labelInfo + 1179664 + ($70 + -1 << 2) >> 2] | 0; + if (($74 | 0) > ($77 | 0)) { + HEAP16[$pnt2$368 >> 1] = $77; + if (($wk_max$160 | 0) > 0) { + $k$056 = 0; + $wk$057 = $19; + while (1) { + if ((HEAP32[$wk$057 >> 2] | 0) == ($74 | 0)) HEAP32[$wk$057 >> 2] = $77; + $k$056 = $k$056 + 1 | 0; + if (($k$056 | 0) >= ($wk_max$160 | 0)) { + $94 = $77; + break; + } else $wk$057 = $wk$057 + 4 | 0; + } + } else $94 = $77; + } else { + HEAP16[$pnt2$368 >> 1] = $74; + if (($74 | 0) < ($77 | 0) & ($wk_max$160 | 0) > 0) { + $k$153 = 0; + $wk$154 = $19; + while (1) { + if ((HEAP32[$wk$154 >> 2] | 0) == ($77 | 0)) HEAP32[$wk$154 >> 2] = $74; + $k$153 = $k$153 + 1 | 0; + if (($k$153 | 0) >= ($wk_max$160 | 0)) { + $94 = $74; + break; + } else $wk$154 = $wk$154 + 4 | 0; + } + } else $94 = $74; + } + $96 = ($94 << 16 >> 16) * 7 | 0; + $98 = $labelInfo + 1310736 + ($96 + -7 << 2) | 0; + HEAP32[$98 >> 2] = (HEAP32[$98 >> 2] | 0) + 1; + $102 = $labelInfo + 1310736 + ($96 + -6 << 2) | 0; + HEAP32[$102 >> 2] = (HEAP32[$102 >> 2] | 0) + $i$265; + $106 = $labelInfo + 1310736 + ($96 + -5 << 2) | 0; + HEAP32[$106 >> 2] = (HEAP32[$106 >> 2] | 0) + $j$076; + HEAP32[$labelInfo + 1310736 + ($96 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $112 = HEAP16[$pnt2$368 + -2 >> 1] | 0; + if ($112 << 16 >> 16 <= 0) { + HEAP16[$pnt2$368 >> 1] = $65; + $152 = $66 * 7 | 0; + $154 = $labelInfo + 1310736 + ($152 + -7 << 2) | 0; + HEAP32[$154 >> 2] = (HEAP32[$154 >> 2] | 0) + 1; + $158 = $labelInfo + 1310736 + ($152 + -6 << 2) | 0; + HEAP32[$158 >> 2] = (HEAP32[$158 >> 2] | 0) + $i$265; + $162 = $labelInfo + 1310736 + ($152 + -5 << 2) | 0; + HEAP32[$162 >> 2] = (HEAP32[$162 >> 2] | 0) + $j$076; + $166 = $labelInfo + 1310736 + ($152 + -4 << 2) | 0; + if ((HEAP32[$166 >> 2] | 0) > ($i$265 | 0)) HEAP32[$166 >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($152 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $117 = HEAP32[$labelInfo + 1179664 + ($66 + -1 << 2) >> 2] | 0; + $120 = HEAP32[$labelInfo + 1179664 + (($112 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($117 | 0) > ($120 | 0)) { + HEAP16[$pnt2$368 >> 1] = $120; + if (($wk_max$160 | 0) > 0) { + $k$249 = 0; + $wk$250 = $19; + while (1) { + if ((HEAP32[$wk$250 >> 2] | 0) == ($117 | 0)) HEAP32[$wk$250 >> 2] = $120; + $k$249 = $k$249 + 1 | 0; + if (($k$249 | 0) >= ($wk_max$160 | 0)) { + $137 = $120; + break; + } else $wk$250 = $wk$250 + 4 | 0; + } + } else $137 = $120; + } else { + HEAP16[$pnt2$368 >> 1] = $117; + if (($117 | 0) < ($120 | 0) & ($wk_max$160 | 0) > 0) { + $k$346 = 0; + $wk$347 = $19; + while (1) { + if ((HEAP32[$wk$347 >> 2] | 0) == ($120 | 0)) HEAP32[$wk$347 >> 2] = $117; + $k$346 = $k$346 + 1 | 0; + if (($k$346 | 0) >= ($wk_max$160 | 0)) { + $137 = $117; + break; + } else $wk$347 = $wk$347 + 4 | 0; + } + } else $137 = $117; + } + $139 = ($137 << 16 >> 16) * 7 | 0; + $141 = $labelInfo + 1310736 + ($139 + -7 << 2) | 0; + HEAP32[$141 >> 2] = (HEAP32[$141 >> 2] | 0) + 1; + $145 = $labelInfo + 1310736 + ($139 + -6 << 2) | 0; + HEAP32[$145 >> 2] = (HEAP32[$145 >> 2] | 0) + $i$265; + $149 = $labelInfo + 1310736 + ($139 + -5 << 2) | 0; + HEAP32[$149 >> 2] = (HEAP32[$149 >> 2] | 0) + $j$076; + $wk_max$2 = $wk_max$160; + } else { + HEAP16[$pnt2$368 >> 1] = 0; + HEAP8[$dpnt$167 >> 0] = 0; + $wk_max$2 = $wk_max$160; + } while (0); + $i$265 = $i$265 + 1 | 0; + $231 = $pnt$169 + 4 | 0; + $232 = $pnt2$368 + 2 | 0; + $233 = $dpnt$167 + 1 | 0; + if (($i$265 | 0) >= ($12 | 0)) { + $dpnt$1$lcssa = $233; + $pnt$1$lcssa = $231; + $pnt2$3$lcssa = $232; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $dpnt$167 = $233; + $pnt$169 = $231; + $pnt2$368 = $232; + $wk_max$160 = $wk_max$2; + } + } + } else { + $dpnt$1$lcssa = $dpnt$078; + $pnt$1$lcssa = $pnt$080; + $pnt2$3$lcssa = $pnt2$279; + $wk_max$1$lcssa = $wk_max$075; + } + $j$076 = $j$076 + 1 | 0; + if (($j$076 | 0) >= ($3 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $dpnt$078 = $dpnt$1$lcssa + 2 | 0; + $pnt$080 = $pnt$1$lcssa + $$sum | 0; + $pnt2$279 = $pnt2$3$lcssa + 4 | 0; + $wk_max$075 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $240 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$342 = 1; + $j$143 = 1; + $wk$444 = $19; + while (1) { + $242 = HEAP32[$wk$444 >> 2] | 0; + if (($242 | 0) == ($i$342 | 0)) { + $248 = $j$143; + $j$2 = $j$143 + 1 | 0; + } else { + $248 = HEAP32[$labelInfo + 1179664 + ($242 + -1 << 2) >> 2] | 0; + $j$2 = $j$143; + } + HEAP32[$wk$444 >> 2] = $248; + if (($i$342 | 0) < ($wk_max$0$lcssa | 0)) { + $i$342 = $i$342 + 1 | 0; + $j$143 = $j$2; + $wk$444 = $wk$444 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $252 = $labelInfo + 8 | 0; + $253 = $j$1$lcssa + -1 | 0; + HEAP32[$252 >> 2] = $253; + if (!$253) $$0 = 0; else { + _memset($240 | 0, 0, $253 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $253 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$440 = 0; + do { + $260 = $i$440 << 2; + HEAP32[$labelInfo + 131084 + ($260 << 2) >> 2] = $0; + HEAP32[$labelInfo + 131084 + (($260 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($260 | 2) << 2) >> 2] = $1; + HEAP32[$labelInfo + 131084 + (($260 | 3) << 2) >> 2] = 0; + $i$440 = $i$440 + 1 | 0; + } while (($i$440 | 0) < (HEAP32[$252 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$538 = 0; + do { + $274 = (HEAP32[$labelInfo + 1179664 + ($i$538 << 2) >> 2] | 0) + -1 | 0; + $275 = $i$538 * 7 | 0; + $278 = $labelInfo + 12 + ($274 << 2) | 0; + HEAP32[$278 >> 2] = (HEAP32[$278 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($275 << 2) >> 2] | 0); + $285 = $274 << 1; + $286 = $labelInfo + 655376 + ($285 << 3) | 0; + HEAPF64[$286 >> 3] = +HEAPF64[$286 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($275 + 1 << 2) >> 2] | 0); + $294 = $labelInfo + 655376 + (($285 | 1) << 3) | 0; + HEAPF64[$294 >> 3] = +HEAPF64[$294 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($275 + 2 << 2) >> 2] | 0); + $297 = $274 << 2; + $298 = $labelInfo + 131084 + ($297 << 2) | 0; + $302 = HEAP32[$labelInfo + 1310736 + ($275 + 3 << 2) >> 2] | 0; + if ((HEAP32[$298 >> 2] | 0) > ($302 | 0)) HEAP32[$298 >> 2] = $302; + $305 = $labelInfo + 131084 + (($297 | 1) << 2) | 0; + $309 = HEAP32[$labelInfo + 1310736 + ($275 + 4 << 2) >> 2] | 0; + if ((HEAP32[$305 >> 2] | 0) < ($309 | 0)) HEAP32[$305 >> 2] = $309; + $312 = $labelInfo + 131084 + (($297 | 2) << 2) | 0; + $316 = HEAP32[$labelInfo + 1310736 + ($275 + 5 << 2) >> 2] | 0; + if ((HEAP32[$312 >> 2] | 0) > ($316 | 0)) HEAP32[$312 >> 2] = $316; + $319 = $labelInfo + 131084 + (($297 | 3) << 2) | 0; + $323 = HEAP32[$labelInfo + 1310736 + ($275 + 6 << 2) >> 2] | 0; + if ((HEAP32[$319 >> 2] | 0) < ($323 | 0)) HEAP32[$319 >> 2] = $323; + $i$538 = $i$538 + 1 | 0; + } while (($i$538 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$252 >> 2] | 0) > 0) { + $i$637 = 0; + do { + $327 = $labelInfo + 12 + ($i$637 << 2) | 0; + $330 = $i$637 << 1; + $331 = $labelInfo + 655376 + ($330 << 3) | 0; + HEAPF64[$331 >> 3] = +HEAPF64[$331 >> 3] / +(HEAP32[$327 >> 2] | 0); + $337 = $labelInfo + 655376 + (($330 | 1) << 3) | 0; + HEAPF64[$337 >> 3] = +HEAPF64[$337 >> 3] / +(HEAP32[$327 >> 2] | 0); + $i$637 = $i$637 + 1 | 0; + } while (($i$637 | 0) < (HEAP32[$252 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubEBI3CA4444($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $$sum2 = 0, $0 = 0, $1 = 0, $102 = 0, $106 = 0, $11 = 0, $112 = 0, $117 = 0, $12 = 0, $120 = 0, $137 = 0, $139 = 0, $141 = 0, $145 = 0, $149 = 0, $152 = 0, $154 = 0, $158 = 0, $162 = 0, $166 = 0, $171 = 0, $173 = 0, $177 = 0, $181 = 0, $185 = 0, $19 = 0, $191 = 0, $194 = 0, $196 = 0, $2 = 0, $20 = 0, $200 = 0, $204 = 0, $208 = 0, $211 = 0, $216 = 0, $22 = 0, $231 = 0, $232 = 0, $233 = 0, $240 = 0, $242 = 0, $248 = 0, $252 = 0, $253 = 0, $260 = 0, $274 = 0, $275 = 0, $278 = 0, $285 = 0, $286 = 0, $294 = 0, $297 = 0, $298 = 0, $3 = 0, $302 = 0, $305 = 0, $309 = 0, $31 = 0, $312 = 0, $316 = 0, $319 = 0, $323 = 0, $327 = 0, $33 = 0, $330 = 0, $331 = 0, $337 = 0, $46 = 0, $49 = 0, $51 = 0, $55 = 0, $59 = 0, $65 = 0, $66 = 0, $69 = 0, $70 = 0, $71 = 0, $74 = 0, $77 = 0, $94 = 0, $96 = 0, $98 = 0, $dpnt$078 = 0, $dpnt$1$lcssa = 0, $dpnt$167 = 0, $i$089 = 0, $i$183 = 0, $i$265 = 0, $i$342 = 0, $i$440 = 0, $i$538 = 0, $i$637 = 0, $j$076 = 0, $j$1$lcssa = 0, $j$143 = 0, $j$2 = 0, $k$056 = 0, $k$153 = 0, $k$249 = 0, $k$346 = 0, $pnt$080 = 0, $pnt$1$lcssa = 0, $pnt$169 = 0, $pnt1$091 = 0, $pnt1$185 = 0, $pnt2$090 = 0, $pnt2$184 = 0, $pnt2$279 = 0, $pnt2$3$lcssa = 0, $pnt2$368 = 0, $vararg_buffer = 0, $wk$057 = 0, $wk$154 = 0, $wk$250 = 0, $wk$347 = 0, $wk$444 = 0, $wk_max$0$lcssa = 0, $wk_max$075 = 0, $wk_max$1$lcssa = 0, $wk_max$160 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = ($xsize | 0) / 2 | 0; + $1 = ($ysize | 0) / 2 | 0; + $2 = HEAP32[$labelInfo >> 2] | 0; + $3 = $1 + -1 | 0; + if (($xsize | 0) > 1) { + $i$089 = 0; + $pnt1$091 = $2; + $pnt2$090 = $2 + ((Math_imul($3, $0) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$090 >> 1] = 0; + HEAP16[$pnt1$091 >> 1] = 0; + $i$089 = $i$089 + 1 | 0; + if (($i$089 | 0) >= ($0 | 0)) break; else { + $pnt1$091 = $pnt1$091 + 2 | 0; + $pnt2$090 = $pnt2$090 + 2 | 0; + } + } + } + $11 = $labelingThresh * 3 | 0; + $12 = $0 + -1 | 0; + if (($ysize | 0) > 1) { + $i$183 = 0; + $pnt1$185 = $2; + $pnt2$184 = $2 + ($12 << 1) | 0; + while (1) { + HEAP16[$pnt2$184 >> 1] = 0; + HEAP16[$pnt1$185 >> 1] = 0; + $i$183 = $i$183 + 1 | 0; + if (($i$183 | 0) >= ($1 | 0)) break; else { + $pnt1$185 = $pnt1$185 + ($0 << 1) | 0; + $pnt2$184 = $pnt2$184 + ($0 << 1) | 0; + } + } + } + $19 = $labelInfo + 1179664 | 0; + $20 = $0 + 1 | 0; + $22 = 0 - $0 | 0; + $$sum1 = 1 - $0 | 0; + $$sum2 = ~$0; + $$sum = ($xsize << 1) + 8 | 0; + L11 : do if (($3 | 0) > 1) { + $31 = ($12 | 0) > 1; + $dpnt$078 = (HEAP32[$labelInfo + 4 >> 2] | 0) + $20 | 0; + $j$076 = 1; + $pnt$080 = $image + (($xsize << 2) + 4) | 0; + $pnt2$279 = $2 + ($20 << 1) | 0; + $wk_max$075 = 0; + L13 : while (1) { + if ($31) { + $dpnt$167 = $dpnt$078; + $i$265 = 1; + $pnt$169 = $pnt$080; + $pnt2$368 = $pnt2$279; + $wk_max$160 = $wk_max$075; + while (1) { + $33 = HEAPU8[$pnt$169 >> 0] | 0; + do if ((($33 & 240) + 24 + ($33 << 4 & 240) + ((HEAPU8[$pnt$169 + 1 >> 0] | 0) & 240) | 0) > ($11 | 0)) { + HEAP16[$pnt2$368 >> 1] = 0; + HEAP8[$dpnt$167 >> 0] = 0; + $wk_max$2 = $wk_max$160; + } else { + HEAP8[$dpnt$167 >> 0] = -1; + $46 = HEAP16[$pnt2$368 + ($22 << 1) >> 1] | 0; + if ($46 << 16 >> 16 > 0) { + HEAP16[$pnt2$368 >> 1] = $46; + $49 = ($46 << 16 >> 16) * 7 | 0; + $51 = $labelInfo + 1310736 + ($49 + -7 << 2) | 0; + HEAP32[$51 >> 2] = (HEAP32[$51 >> 2] | 0) + 1; + $55 = $labelInfo + 1310736 + ($49 + -6 << 2) | 0; + HEAP32[$55 >> 2] = (HEAP32[$55 >> 2] | 0) + $i$265; + $59 = $labelInfo + 1310736 + ($49 + -5 << 2) | 0; + HEAP32[$59 >> 2] = (HEAP32[$59 >> 2] | 0) + $j$076; + HEAP32[$labelInfo + 1310736 + ($49 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $65 = HEAP16[$pnt2$368 + ($$sum1 << 1) >> 1] | 0; + $66 = $65 << 16 >> 16; + $69 = HEAP16[$pnt2$368 + ($$sum2 << 1) >> 1] | 0; + $70 = $69 << 16 >> 16; + $71 = $69 << 16 >> 16 > 0; + if ($65 << 16 >> 16 <= 0) { + if ($71) { + HEAP16[$pnt2$368 >> 1] = $69; + $171 = $70 * 7 | 0; + $173 = $labelInfo + 1310736 + ($171 + -7 << 2) | 0; + HEAP32[$173 >> 2] = (HEAP32[$173 >> 2] | 0) + 1; + $177 = $labelInfo + 1310736 + ($171 + -6 << 2) | 0; + HEAP32[$177 >> 2] = (HEAP32[$177 >> 2] | 0) + $i$265; + $181 = $labelInfo + 1310736 + ($171 + -5 << 2) | 0; + HEAP32[$181 >> 2] = (HEAP32[$181 >> 2] | 0) + $j$076; + $185 = $labelInfo + 1310736 + ($171 + -3 << 2) | 0; + if ((HEAP32[$185 >> 2] | 0) < ($i$265 | 0)) HEAP32[$185 >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($171 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $191 = HEAP16[$pnt2$368 + -2 >> 1] | 0; + if ($191 << 16 >> 16 > 0) { + HEAP16[$pnt2$368 >> 1] = $191; + $194 = ($191 << 16 >> 16) * 7 | 0; + $196 = $labelInfo + 1310736 + ($194 + -7 << 2) | 0; + HEAP32[$196 >> 2] = (HEAP32[$196 >> 2] | 0) + 1; + $200 = $labelInfo + 1310736 + ($194 + -6 << 2) | 0; + HEAP32[$200 >> 2] = (HEAP32[$200 >> 2] | 0) + $i$265; + $204 = $labelInfo + 1310736 + ($194 + -5 << 2) | 0; + HEAP32[$204 >> 2] = (HEAP32[$204 >> 2] | 0) + $j$076; + $208 = $labelInfo + 1310736 + ($194 + -3 << 2) | 0; + if ((HEAP32[$208 >> 2] | 0) >= ($i$265 | 0)) { + $wk_max$2 = $wk_max$160; + break; + } + HEAP32[$208 >> 2] = $i$265; + $wk_max$2 = $wk_max$160; + break; + } else { + $211 = $wk_max$160 + 1 | 0; + if (($wk_max$160 | 0) > 32767) break L13; + HEAP16[$pnt2$368 >> 1] = $211; + HEAP32[$labelInfo + 1179664 + ($wk_max$160 << 2) >> 2] = $211 << 16 >> 16; + $216 = $wk_max$160 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($216 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($216 + 1 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($216 + 2 << 2) >> 2] = $j$076; + HEAP32[$labelInfo + 1310736 + ($216 + 3 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($216 + 4 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($216 + 5 << 2) >> 2] = $j$076; + HEAP32[$labelInfo + 1310736 + ($216 + 6 << 2) >> 2] = $j$076; + $wk_max$2 = $211; + break; + } + } + if ($71) { + $74 = HEAP32[$labelInfo + 1179664 + ($66 + -1 << 2) >> 2] | 0; + $77 = HEAP32[$labelInfo + 1179664 + ($70 + -1 << 2) >> 2] | 0; + if (($74 | 0) > ($77 | 0)) { + HEAP16[$pnt2$368 >> 1] = $77; + if (($wk_max$160 | 0) > 0) { + $k$056 = 0; + $wk$057 = $19; + while (1) { + if ((HEAP32[$wk$057 >> 2] | 0) == ($74 | 0)) HEAP32[$wk$057 >> 2] = $77; + $k$056 = $k$056 + 1 | 0; + if (($k$056 | 0) >= ($wk_max$160 | 0)) { + $94 = $77; + break; + } else $wk$057 = $wk$057 + 4 | 0; + } + } else $94 = $77; + } else { + HEAP16[$pnt2$368 >> 1] = $74; + if (($74 | 0) < ($77 | 0) & ($wk_max$160 | 0) > 0) { + $k$153 = 0; + $wk$154 = $19; + while (1) { + if ((HEAP32[$wk$154 >> 2] | 0) == ($77 | 0)) HEAP32[$wk$154 >> 2] = $74; + $k$153 = $k$153 + 1 | 0; + if (($k$153 | 0) >= ($wk_max$160 | 0)) { + $94 = $74; + break; + } else $wk$154 = $wk$154 + 4 | 0; + } + } else $94 = $74; + } + $96 = ($94 << 16 >> 16) * 7 | 0; + $98 = $labelInfo + 1310736 + ($96 + -7 << 2) | 0; + HEAP32[$98 >> 2] = (HEAP32[$98 >> 2] | 0) + 1; + $102 = $labelInfo + 1310736 + ($96 + -6 << 2) | 0; + HEAP32[$102 >> 2] = (HEAP32[$102 >> 2] | 0) + $i$265; + $106 = $labelInfo + 1310736 + ($96 + -5 << 2) | 0; + HEAP32[$106 >> 2] = (HEAP32[$106 >> 2] | 0) + $j$076; + HEAP32[$labelInfo + 1310736 + ($96 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $112 = HEAP16[$pnt2$368 + -2 >> 1] | 0; + if ($112 << 16 >> 16 <= 0) { + HEAP16[$pnt2$368 >> 1] = $65; + $152 = $66 * 7 | 0; + $154 = $labelInfo + 1310736 + ($152 + -7 << 2) | 0; + HEAP32[$154 >> 2] = (HEAP32[$154 >> 2] | 0) + 1; + $158 = $labelInfo + 1310736 + ($152 + -6 << 2) | 0; + HEAP32[$158 >> 2] = (HEAP32[$158 >> 2] | 0) + $i$265; + $162 = $labelInfo + 1310736 + ($152 + -5 << 2) | 0; + HEAP32[$162 >> 2] = (HEAP32[$162 >> 2] | 0) + $j$076; + $166 = $labelInfo + 1310736 + ($152 + -4 << 2) | 0; + if ((HEAP32[$166 >> 2] | 0) > ($i$265 | 0)) HEAP32[$166 >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($152 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $117 = HEAP32[$labelInfo + 1179664 + ($66 + -1 << 2) >> 2] | 0; + $120 = HEAP32[$labelInfo + 1179664 + (($112 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($117 | 0) > ($120 | 0)) { + HEAP16[$pnt2$368 >> 1] = $120; + if (($wk_max$160 | 0) > 0) { + $k$249 = 0; + $wk$250 = $19; + while (1) { + if ((HEAP32[$wk$250 >> 2] | 0) == ($117 | 0)) HEAP32[$wk$250 >> 2] = $120; + $k$249 = $k$249 + 1 | 0; + if (($k$249 | 0) >= ($wk_max$160 | 0)) { + $137 = $120; + break; + } else $wk$250 = $wk$250 + 4 | 0; + } + } else $137 = $120; + } else { + HEAP16[$pnt2$368 >> 1] = $117; + if (($117 | 0) < ($120 | 0) & ($wk_max$160 | 0) > 0) { + $k$346 = 0; + $wk$347 = $19; + while (1) { + if ((HEAP32[$wk$347 >> 2] | 0) == ($120 | 0)) HEAP32[$wk$347 >> 2] = $117; + $k$346 = $k$346 + 1 | 0; + if (($k$346 | 0) >= ($wk_max$160 | 0)) { + $137 = $117; + break; + } else $wk$347 = $wk$347 + 4 | 0; + } + } else $137 = $117; + } + $139 = ($137 << 16 >> 16) * 7 | 0; + $141 = $labelInfo + 1310736 + ($139 + -7 << 2) | 0; + HEAP32[$141 >> 2] = (HEAP32[$141 >> 2] | 0) + 1; + $145 = $labelInfo + 1310736 + ($139 + -6 << 2) | 0; + HEAP32[$145 >> 2] = (HEAP32[$145 >> 2] | 0) + $i$265; + $149 = $labelInfo + 1310736 + ($139 + -5 << 2) | 0; + HEAP32[$149 >> 2] = (HEAP32[$149 >> 2] | 0) + $j$076; + $wk_max$2 = $wk_max$160; + } while (0); + $i$265 = $i$265 + 1 | 0; + $231 = $pnt$169 + 4 | 0; + $232 = $pnt2$368 + 2 | 0; + $233 = $dpnt$167 + 1 | 0; + if (($i$265 | 0) >= ($12 | 0)) { + $dpnt$1$lcssa = $233; + $pnt$1$lcssa = $231; + $pnt2$3$lcssa = $232; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $dpnt$167 = $233; + $pnt$169 = $231; + $pnt2$368 = $232; + $wk_max$160 = $wk_max$2; + } + } + } else { + $dpnt$1$lcssa = $dpnt$078; + $pnt$1$lcssa = $pnt$080; + $pnt2$3$lcssa = $pnt2$279; + $wk_max$1$lcssa = $wk_max$075; + } + $j$076 = $j$076 + 1 | 0; + if (($j$076 | 0) >= ($3 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $dpnt$078 = $dpnt$1$lcssa + 2 | 0; + $pnt$080 = $pnt$1$lcssa + $$sum | 0; + $pnt2$279 = $pnt2$3$lcssa + 4 | 0; + $wk_max$075 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $240 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$342 = 1; + $j$143 = 1; + $wk$444 = $19; + while (1) { + $242 = HEAP32[$wk$444 >> 2] | 0; + if (($242 | 0) == ($i$342 | 0)) { + $248 = $j$143; + $j$2 = $j$143 + 1 | 0; + } else { + $248 = HEAP32[$labelInfo + 1179664 + ($242 + -1 << 2) >> 2] | 0; + $j$2 = $j$143; + } + HEAP32[$wk$444 >> 2] = $248; + if (($i$342 | 0) < ($wk_max$0$lcssa | 0)) { + $i$342 = $i$342 + 1 | 0; + $j$143 = $j$2; + $wk$444 = $wk$444 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $252 = $labelInfo + 8 | 0; + $253 = $j$1$lcssa + -1 | 0; + HEAP32[$252 >> 2] = $253; + if (!$253) $$0 = 0; else { + _memset($240 | 0, 0, $253 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $253 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$440 = 0; + do { + $260 = $i$440 << 2; + HEAP32[$labelInfo + 131084 + ($260 << 2) >> 2] = $0; + HEAP32[$labelInfo + 131084 + (($260 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($260 | 2) << 2) >> 2] = $1; + HEAP32[$labelInfo + 131084 + (($260 | 3) << 2) >> 2] = 0; + $i$440 = $i$440 + 1 | 0; + } while (($i$440 | 0) < (HEAP32[$252 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$538 = 0; + do { + $274 = (HEAP32[$labelInfo + 1179664 + ($i$538 << 2) >> 2] | 0) + -1 | 0; + $275 = $i$538 * 7 | 0; + $278 = $labelInfo + 12 + ($274 << 2) | 0; + HEAP32[$278 >> 2] = (HEAP32[$278 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($275 << 2) >> 2] | 0); + $285 = $274 << 1; + $286 = $labelInfo + 655376 + ($285 << 3) | 0; + HEAPF64[$286 >> 3] = +HEAPF64[$286 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($275 + 1 << 2) >> 2] | 0); + $294 = $labelInfo + 655376 + (($285 | 1) << 3) | 0; + HEAPF64[$294 >> 3] = +HEAPF64[$294 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($275 + 2 << 2) >> 2] | 0); + $297 = $274 << 2; + $298 = $labelInfo + 131084 + ($297 << 2) | 0; + $302 = HEAP32[$labelInfo + 1310736 + ($275 + 3 << 2) >> 2] | 0; + if ((HEAP32[$298 >> 2] | 0) > ($302 | 0)) HEAP32[$298 >> 2] = $302; + $305 = $labelInfo + 131084 + (($297 | 1) << 2) | 0; + $309 = HEAP32[$labelInfo + 1310736 + ($275 + 4 << 2) >> 2] | 0; + if ((HEAP32[$305 >> 2] | 0) < ($309 | 0)) HEAP32[$305 >> 2] = $309; + $312 = $labelInfo + 131084 + (($297 | 2) << 2) | 0; + $316 = HEAP32[$labelInfo + 1310736 + ($275 + 5 << 2) >> 2] | 0; + if ((HEAP32[$312 >> 2] | 0) > ($316 | 0)) HEAP32[$312 >> 2] = $316; + $319 = $labelInfo + 131084 + (($297 | 3) << 2) | 0; + $323 = HEAP32[$labelInfo + 1310736 + ($275 + 6 << 2) >> 2] | 0; + if ((HEAP32[$319 >> 2] | 0) < ($323 | 0)) HEAP32[$319 >> 2] = $323; + $i$538 = $i$538 + 1 | 0; + } while (($i$538 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$252 >> 2] | 0) > 0) { + $i$637 = 0; + do { + $327 = $labelInfo + 12 + ($i$637 << 2) | 0; + $330 = $i$637 << 1; + $331 = $labelInfo + 655376 + ($330 << 3) | 0; + HEAPF64[$331 >> 3] = +HEAPF64[$331 >> 3] / +(HEAP32[$327 >> 2] | 0); + $337 = $labelInfo + 655376 + (($330 | 1) << 3) | 0; + HEAPF64[$337 >> 3] = +HEAPF64[$337 >> 3] / +(HEAP32[$327 >> 2] | 0); + $i$637 = $i$637 + 1 | 0; + } while (($i$637 | 0) < (HEAP32[$252 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubEWI3C($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $$sum2 = 0, $0 = 0, $1 = 0, $100 = 0, $104 = 0, $11 = 0, $110 = 0, $115 = 0, $118 = 0, $12 = 0, $135 = 0, $137 = 0, $139 = 0, $143 = 0, $147 = 0, $150 = 0, $152 = 0, $156 = 0, $160 = 0, $164 = 0, $169 = 0, $171 = 0, $175 = 0, $179 = 0, $183 = 0, $189 = 0, $19 = 0, $192 = 0, $194 = 0, $198 = 0, $2 = 0, $20 = 0, $202 = 0, $206 = 0, $209 = 0, $21 = 0, $214 = 0, $229 = 0, $230 = 0, $231 = 0, $238 = 0, $240 = 0, $246 = 0, $250 = 0, $251 = 0, $258 = 0, $272 = 0, $273 = 0, $276 = 0, $283 = 0, $284 = 0, $292 = 0, $295 = 0, $296 = 0, $3 = 0, $300 = 0, $303 = 0, $307 = 0, $31 = 0, $310 = 0, $314 = 0, $317 = 0, $321 = 0, $325 = 0, $328 = 0, $329 = 0, $335 = 0, $44 = 0, $47 = 0, $49 = 0, $53 = 0, $57 = 0, $63 = 0, $64 = 0, $67 = 0, $68 = 0, $69 = 0, $72 = 0, $75 = 0, $92 = 0, $94 = 0, $96 = 0, $dpnt$078 = 0, $dpnt$1$lcssa = 0, $dpnt$167 = 0, $i$089 = 0, $i$183 = 0, $i$265 = 0, $i$342 = 0, $i$440 = 0, $i$538 = 0, $i$637 = 0, $j$076 = 0, $j$1$lcssa = 0, $j$143 = 0, $j$2 = 0, $k$056 = 0, $k$153 = 0, $k$249 = 0, $k$346 = 0, $pnt$080 = 0, $pnt$1$lcssa = 0, $pnt$169 = 0, $pnt1$091 = 0, $pnt1$185 = 0, $pnt2$090 = 0, $pnt2$184 = 0, $pnt2$279 = 0, $pnt2$3$lcssa = 0, $pnt2$368 = 0, $vararg_buffer = 0, $wk$057 = 0, $wk$154 = 0, $wk$250 = 0, $wk$347 = 0, $wk$444 = 0, $wk_max$0$lcssa = 0, $wk_max$075 = 0, $wk_max$1$lcssa = 0, $wk_max$160 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = ($xsize | 0) / 2 | 0; + $1 = ($ysize | 0) / 2 | 0; + $2 = HEAP32[$labelInfo >> 2] | 0; + $3 = $1 + -1 | 0; + if (($xsize | 0) > 1) { + $i$089 = 0; + $pnt1$091 = $2; + $pnt2$090 = $2 + ((Math_imul($3, $0) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$090 >> 1] = 0; + HEAP16[$pnt1$091 >> 1] = 0; + $i$089 = $i$089 + 1 | 0; + if (($i$089 | 0) >= ($0 | 0)) break; else { + $pnt1$091 = $pnt1$091 + 2 | 0; + $pnt2$090 = $pnt2$090 + 2 | 0; + } + } + } + $11 = $labelingThresh * 3 | 0; + $12 = $0 + -1 | 0; + if (($ysize | 0) > 1) { + $i$183 = 0; + $pnt1$185 = $2; + $pnt2$184 = $2 + ($12 << 1) | 0; + while (1) { + HEAP16[$pnt2$184 >> 1] = 0; + HEAP16[$pnt1$185 >> 1] = 0; + $i$183 = $i$183 + 1 | 0; + if (($i$183 | 0) >= ($1 | 0)) break; else { + $pnt1$185 = $pnt1$185 + ($0 << 1) | 0; + $pnt2$184 = $pnt2$184 + ($0 << 1) | 0; + } + } + } + $19 = $labelInfo + 1179664 | 0; + $20 = $0 + 1 | 0; + $21 = 0 - $0 | 0; + $$sum1 = 1 - $0 | 0; + $$sum2 = ~$0; + $$sum = ($xsize * 3 | 0) + 12 | 0; + L11 : do if (($3 | 0) > 1) { + $31 = ($12 | 0) > 1; + $dpnt$078 = (HEAP32[$labelInfo + 4 >> 2] | 0) + $20 | 0; + $j$076 = 1; + $pnt$080 = $image + (($xsize * 6 | 0) + 6) | 0; + $pnt2$279 = $2 + ($20 << 1) | 0; + $wk_max$075 = 0; + L13 : while (1) { + if ($31) { + $dpnt$167 = $dpnt$078; + $i$265 = 1; + $pnt$169 = $pnt$080; + $pnt2$368 = $pnt2$279; + $wk_max$160 = $wk_max$075; + while (1) { + do if (((HEAPU8[$pnt$169 + 1 >> 0] | 0) + (HEAPU8[$pnt$169 >> 0] | 0) + (HEAPU8[$pnt$169 + 2 >> 0] | 0) | 0) > ($11 | 0)) { + HEAP8[$dpnt$167 >> 0] = -1; + $44 = HEAP16[$pnt2$368 + ($21 << 1) >> 1] | 0; + if ($44 << 16 >> 16 > 0) { + HEAP16[$pnt2$368 >> 1] = $44; + $47 = ($44 << 16 >> 16) * 7 | 0; + $49 = $labelInfo + 1310736 + ($47 + -7 << 2) | 0; + HEAP32[$49 >> 2] = (HEAP32[$49 >> 2] | 0) + 1; + $53 = $labelInfo + 1310736 + ($47 + -6 << 2) | 0; + HEAP32[$53 >> 2] = (HEAP32[$53 >> 2] | 0) + $i$265; + $57 = $labelInfo + 1310736 + ($47 + -5 << 2) | 0; + HEAP32[$57 >> 2] = (HEAP32[$57 >> 2] | 0) + $j$076; + HEAP32[$labelInfo + 1310736 + ($47 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $63 = HEAP16[$pnt2$368 + ($$sum1 << 1) >> 1] | 0; + $64 = $63 << 16 >> 16; + $67 = HEAP16[$pnt2$368 + ($$sum2 << 1) >> 1] | 0; + $68 = $67 << 16 >> 16; + $69 = $67 << 16 >> 16 > 0; + if ($63 << 16 >> 16 <= 0) { + if ($69) { + HEAP16[$pnt2$368 >> 1] = $67; + $169 = $68 * 7 | 0; + $171 = $labelInfo + 1310736 + ($169 + -7 << 2) | 0; + HEAP32[$171 >> 2] = (HEAP32[$171 >> 2] | 0) + 1; + $175 = $labelInfo + 1310736 + ($169 + -6 << 2) | 0; + HEAP32[$175 >> 2] = (HEAP32[$175 >> 2] | 0) + $i$265; + $179 = $labelInfo + 1310736 + ($169 + -5 << 2) | 0; + HEAP32[$179 >> 2] = (HEAP32[$179 >> 2] | 0) + $j$076; + $183 = $labelInfo + 1310736 + ($169 + -3 << 2) | 0; + if ((HEAP32[$183 >> 2] | 0) < ($i$265 | 0)) HEAP32[$183 >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($169 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $189 = HEAP16[$pnt2$368 + -2 >> 1] | 0; + if ($189 << 16 >> 16 > 0) { + HEAP16[$pnt2$368 >> 1] = $189; + $192 = ($189 << 16 >> 16) * 7 | 0; + $194 = $labelInfo + 1310736 + ($192 + -7 << 2) | 0; + HEAP32[$194 >> 2] = (HEAP32[$194 >> 2] | 0) + 1; + $198 = $labelInfo + 1310736 + ($192 + -6 << 2) | 0; + HEAP32[$198 >> 2] = (HEAP32[$198 >> 2] | 0) + $i$265; + $202 = $labelInfo + 1310736 + ($192 + -5 << 2) | 0; + HEAP32[$202 >> 2] = (HEAP32[$202 >> 2] | 0) + $j$076; + $206 = $labelInfo + 1310736 + ($192 + -3 << 2) | 0; + if ((HEAP32[$206 >> 2] | 0) >= ($i$265 | 0)) { + $wk_max$2 = $wk_max$160; + break; + } + HEAP32[$206 >> 2] = $i$265; + $wk_max$2 = $wk_max$160; + break; + } else { + $209 = $wk_max$160 + 1 | 0; + if (($wk_max$160 | 0) > 32767) break L13; + HEAP16[$pnt2$368 >> 1] = $209; + HEAP32[$labelInfo + 1179664 + ($wk_max$160 << 2) >> 2] = $209 << 16 >> 16; + $214 = $wk_max$160 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($214 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($214 + 1 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($214 + 2 << 2) >> 2] = $j$076; + HEAP32[$labelInfo + 1310736 + ($214 + 3 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($214 + 4 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($214 + 5 << 2) >> 2] = $j$076; + HEAP32[$labelInfo + 1310736 + ($214 + 6 << 2) >> 2] = $j$076; + $wk_max$2 = $209; + break; + } + } + if ($69) { + $72 = HEAP32[$labelInfo + 1179664 + ($64 + -1 << 2) >> 2] | 0; + $75 = HEAP32[$labelInfo + 1179664 + ($68 + -1 << 2) >> 2] | 0; + if (($72 | 0) > ($75 | 0)) { + HEAP16[$pnt2$368 >> 1] = $75; + if (($wk_max$160 | 0) > 0) { + $k$056 = 0; + $wk$057 = $19; + while (1) { + if ((HEAP32[$wk$057 >> 2] | 0) == ($72 | 0)) HEAP32[$wk$057 >> 2] = $75; + $k$056 = $k$056 + 1 | 0; + if (($k$056 | 0) >= ($wk_max$160 | 0)) { + $92 = $75; + break; + } else $wk$057 = $wk$057 + 4 | 0; + } + } else $92 = $75; + } else { + HEAP16[$pnt2$368 >> 1] = $72; + if (($72 | 0) < ($75 | 0) & ($wk_max$160 | 0) > 0) { + $k$153 = 0; + $wk$154 = $19; + while (1) { + if ((HEAP32[$wk$154 >> 2] | 0) == ($75 | 0)) HEAP32[$wk$154 >> 2] = $72; + $k$153 = $k$153 + 1 | 0; + if (($k$153 | 0) >= ($wk_max$160 | 0)) { + $92 = $72; + break; + } else $wk$154 = $wk$154 + 4 | 0; + } + } else $92 = $72; + } + $94 = ($92 << 16 >> 16) * 7 | 0; + $96 = $labelInfo + 1310736 + ($94 + -7 << 2) | 0; + HEAP32[$96 >> 2] = (HEAP32[$96 >> 2] | 0) + 1; + $100 = $labelInfo + 1310736 + ($94 + -6 << 2) | 0; + HEAP32[$100 >> 2] = (HEAP32[$100 >> 2] | 0) + $i$265; + $104 = $labelInfo + 1310736 + ($94 + -5 << 2) | 0; + HEAP32[$104 >> 2] = (HEAP32[$104 >> 2] | 0) + $j$076; + HEAP32[$labelInfo + 1310736 + ($94 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $110 = HEAP16[$pnt2$368 + -2 >> 1] | 0; + if ($110 << 16 >> 16 <= 0) { + HEAP16[$pnt2$368 >> 1] = $63; + $150 = $64 * 7 | 0; + $152 = $labelInfo + 1310736 + ($150 + -7 << 2) | 0; + HEAP32[$152 >> 2] = (HEAP32[$152 >> 2] | 0) + 1; + $156 = $labelInfo + 1310736 + ($150 + -6 << 2) | 0; + HEAP32[$156 >> 2] = (HEAP32[$156 >> 2] | 0) + $i$265; + $160 = $labelInfo + 1310736 + ($150 + -5 << 2) | 0; + HEAP32[$160 >> 2] = (HEAP32[$160 >> 2] | 0) + $j$076; + $164 = $labelInfo + 1310736 + ($150 + -4 << 2) | 0; + if ((HEAP32[$164 >> 2] | 0) > ($i$265 | 0)) HEAP32[$164 >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($150 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $115 = HEAP32[$labelInfo + 1179664 + ($64 + -1 << 2) >> 2] | 0; + $118 = HEAP32[$labelInfo + 1179664 + (($110 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($115 | 0) > ($118 | 0)) { + HEAP16[$pnt2$368 >> 1] = $118; + if (($wk_max$160 | 0) > 0) { + $k$249 = 0; + $wk$250 = $19; + while (1) { + if ((HEAP32[$wk$250 >> 2] | 0) == ($115 | 0)) HEAP32[$wk$250 >> 2] = $118; + $k$249 = $k$249 + 1 | 0; + if (($k$249 | 0) >= ($wk_max$160 | 0)) { + $135 = $118; + break; + } else $wk$250 = $wk$250 + 4 | 0; + } + } else $135 = $118; + } else { + HEAP16[$pnt2$368 >> 1] = $115; + if (($115 | 0) < ($118 | 0) & ($wk_max$160 | 0) > 0) { + $k$346 = 0; + $wk$347 = $19; + while (1) { + if ((HEAP32[$wk$347 >> 2] | 0) == ($118 | 0)) HEAP32[$wk$347 >> 2] = $115; + $k$346 = $k$346 + 1 | 0; + if (($k$346 | 0) >= ($wk_max$160 | 0)) { + $135 = $115; + break; + } else $wk$347 = $wk$347 + 4 | 0; + } + } else $135 = $115; + } + $137 = ($135 << 16 >> 16) * 7 | 0; + $139 = $labelInfo + 1310736 + ($137 + -7 << 2) | 0; + HEAP32[$139 >> 2] = (HEAP32[$139 >> 2] | 0) + 1; + $143 = $labelInfo + 1310736 + ($137 + -6 << 2) | 0; + HEAP32[$143 >> 2] = (HEAP32[$143 >> 2] | 0) + $i$265; + $147 = $labelInfo + 1310736 + ($137 + -5 << 2) | 0; + HEAP32[$147 >> 2] = (HEAP32[$147 >> 2] | 0) + $j$076; + $wk_max$2 = $wk_max$160; + } else { + HEAP16[$pnt2$368 >> 1] = 0; + HEAP8[$dpnt$167 >> 0] = 0; + $wk_max$2 = $wk_max$160; + } while (0); + $i$265 = $i$265 + 1 | 0; + $229 = $pnt$169 + 6 | 0; + $230 = $pnt2$368 + 2 | 0; + $231 = $dpnt$167 + 1 | 0; + if (($i$265 | 0) >= ($12 | 0)) { + $dpnt$1$lcssa = $231; + $pnt$1$lcssa = $229; + $pnt2$3$lcssa = $230; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $dpnt$167 = $231; + $pnt$169 = $229; + $pnt2$368 = $230; + $wk_max$160 = $wk_max$2; + } + } + } else { + $dpnt$1$lcssa = $dpnt$078; + $pnt$1$lcssa = $pnt$080; + $pnt2$3$lcssa = $pnt2$279; + $wk_max$1$lcssa = $wk_max$075; + } + $j$076 = $j$076 + 1 | 0; + if (($j$076 | 0) >= ($3 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $dpnt$078 = $dpnt$1$lcssa + 2 | 0; + $pnt$080 = $pnt$1$lcssa + $$sum | 0; + $pnt2$279 = $pnt2$3$lcssa + 4 | 0; + $wk_max$075 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $238 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$342 = 1; + $j$143 = 1; + $wk$444 = $19; + while (1) { + $240 = HEAP32[$wk$444 >> 2] | 0; + if (($240 | 0) == ($i$342 | 0)) { + $246 = $j$143; + $j$2 = $j$143 + 1 | 0; + } else { + $246 = HEAP32[$labelInfo + 1179664 + ($240 + -1 << 2) >> 2] | 0; + $j$2 = $j$143; + } + HEAP32[$wk$444 >> 2] = $246; + if (($i$342 | 0) < ($wk_max$0$lcssa | 0)) { + $i$342 = $i$342 + 1 | 0; + $j$143 = $j$2; + $wk$444 = $wk$444 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $250 = $labelInfo + 8 | 0; + $251 = $j$1$lcssa + -1 | 0; + HEAP32[$250 >> 2] = $251; + if (!$251) $$0 = 0; else { + _memset($238 | 0, 0, $251 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $251 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$440 = 0; + do { + $258 = $i$440 << 2; + HEAP32[$labelInfo + 131084 + ($258 << 2) >> 2] = $0; + HEAP32[$labelInfo + 131084 + (($258 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($258 | 2) << 2) >> 2] = $1; + HEAP32[$labelInfo + 131084 + (($258 | 3) << 2) >> 2] = 0; + $i$440 = $i$440 + 1 | 0; + } while (($i$440 | 0) < (HEAP32[$250 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$538 = 0; + do { + $272 = (HEAP32[$labelInfo + 1179664 + ($i$538 << 2) >> 2] | 0) + -1 | 0; + $273 = $i$538 * 7 | 0; + $276 = $labelInfo + 12 + ($272 << 2) | 0; + HEAP32[$276 >> 2] = (HEAP32[$276 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($273 << 2) >> 2] | 0); + $283 = $272 << 1; + $284 = $labelInfo + 655376 + ($283 << 3) | 0; + HEAPF64[$284 >> 3] = +HEAPF64[$284 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($273 + 1 << 2) >> 2] | 0); + $292 = $labelInfo + 655376 + (($283 | 1) << 3) | 0; + HEAPF64[$292 >> 3] = +HEAPF64[$292 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($273 + 2 << 2) >> 2] | 0); + $295 = $272 << 2; + $296 = $labelInfo + 131084 + ($295 << 2) | 0; + $300 = HEAP32[$labelInfo + 1310736 + ($273 + 3 << 2) >> 2] | 0; + if ((HEAP32[$296 >> 2] | 0) > ($300 | 0)) HEAP32[$296 >> 2] = $300; + $303 = $labelInfo + 131084 + (($295 | 1) << 2) | 0; + $307 = HEAP32[$labelInfo + 1310736 + ($273 + 4 << 2) >> 2] | 0; + if ((HEAP32[$303 >> 2] | 0) < ($307 | 0)) HEAP32[$303 >> 2] = $307; + $310 = $labelInfo + 131084 + (($295 | 2) << 2) | 0; + $314 = HEAP32[$labelInfo + 1310736 + ($273 + 5 << 2) >> 2] | 0; + if ((HEAP32[$310 >> 2] | 0) > ($314 | 0)) HEAP32[$310 >> 2] = $314; + $317 = $labelInfo + 131084 + (($295 | 3) << 2) | 0; + $321 = HEAP32[$labelInfo + 1310736 + ($273 + 6 << 2) >> 2] | 0; + if ((HEAP32[$317 >> 2] | 0) < ($321 | 0)) HEAP32[$317 >> 2] = $321; + $i$538 = $i$538 + 1 | 0; + } while (($i$538 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$250 >> 2] | 0) > 0) { + $i$637 = 0; + do { + $325 = $labelInfo + 12 + ($i$637 << 2) | 0; + $328 = $i$637 << 1; + $329 = $labelInfo + 655376 + ($328 << 3) | 0; + HEAPF64[$329 >> 3] = +HEAPF64[$329 >> 3] / +(HEAP32[$325 >> 2] | 0); + $335 = $labelInfo + 655376 + (($328 | 1) << 3) | 0; + HEAPF64[$335 >> 3] = +HEAPF64[$335 >> 3] / +(HEAP32[$325 >> 2] | 0); + $i$637 = $i$637 + 1 | 0; + } while (($i$637 | 0) < (HEAP32[$250 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubEBI3C($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $$sum2 = 0, $0 = 0, $1 = 0, $100 = 0, $104 = 0, $11 = 0, $110 = 0, $115 = 0, $118 = 0, $12 = 0, $135 = 0, $137 = 0, $139 = 0, $143 = 0, $147 = 0, $150 = 0, $152 = 0, $156 = 0, $160 = 0, $164 = 0, $169 = 0, $171 = 0, $175 = 0, $179 = 0, $183 = 0, $189 = 0, $19 = 0, $192 = 0, $194 = 0, $198 = 0, $2 = 0, $20 = 0, $202 = 0, $206 = 0, $209 = 0, $21 = 0, $214 = 0, $229 = 0, $230 = 0, $231 = 0, $238 = 0, $240 = 0, $246 = 0, $250 = 0, $251 = 0, $258 = 0, $272 = 0, $273 = 0, $276 = 0, $283 = 0, $284 = 0, $292 = 0, $295 = 0, $296 = 0, $3 = 0, $300 = 0, $303 = 0, $307 = 0, $31 = 0, $310 = 0, $314 = 0, $317 = 0, $321 = 0, $325 = 0, $328 = 0, $329 = 0, $335 = 0, $44 = 0, $47 = 0, $49 = 0, $53 = 0, $57 = 0, $63 = 0, $64 = 0, $67 = 0, $68 = 0, $69 = 0, $72 = 0, $75 = 0, $92 = 0, $94 = 0, $96 = 0, $dpnt$078 = 0, $dpnt$1$lcssa = 0, $dpnt$167 = 0, $i$089 = 0, $i$183 = 0, $i$265 = 0, $i$342 = 0, $i$440 = 0, $i$538 = 0, $i$637 = 0, $j$076 = 0, $j$1$lcssa = 0, $j$143 = 0, $j$2 = 0, $k$056 = 0, $k$153 = 0, $k$249 = 0, $k$346 = 0, $pnt$080 = 0, $pnt$1$lcssa = 0, $pnt$169 = 0, $pnt1$091 = 0, $pnt1$185 = 0, $pnt2$090 = 0, $pnt2$184 = 0, $pnt2$279 = 0, $pnt2$3$lcssa = 0, $pnt2$368 = 0, $vararg_buffer = 0, $wk$057 = 0, $wk$154 = 0, $wk$250 = 0, $wk$347 = 0, $wk$444 = 0, $wk_max$0$lcssa = 0, $wk_max$075 = 0, $wk_max$1$lcssa = 0, $wk_max$160 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = ($xsize | 0) / 2 | 0; + $1 = ($ysize | 0) / 2 | 0; + $2 = HEAP32[$labelInfo >> 2] | 0; + $3 = $1 + -1 | 0; + if (($xsize | 0) > 1) { + $i$089 = 0; + $pnt1$091 = $2; + $pnt2$090 = $2 + ((Math_imul($3, $0) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$090 >> 1] = 0; + HEAP16[$pnt1$091 >> 1] = 0; + $i$089 = $i$089 + 1 | 0; + if (($i$089 | 0) >= ($0 | 0)) break; else { + $pnt1$091 = $pnt1$091 + 2 | 0; + $pnt2$090 = $pnt2$090 + 2 | 0; + } + } + } + $11 = $labelingThresh * 3 | 0; + $12 = $0 + -1 | 0; + if (($ysize | 0) > 1) { + $i$183 = 0; + $pnt1$185 = $2; + $pnt2$184 = $2 + ($12 << 1) | 0; + while (1) { + HEAP16[$pnt2$184 >> 1] = 0; + HEAP16[$pnt1$185 >> 1] = 0; + $i$183 = $i$183 + 1 | 0; + if (($i$183 | 0) >= ($1 | 0)) break; else { + $pnt1$185 = $pnt1$185 + ($0 << 1) | 0; + $pnt2$184 = $pnt2$184 + ($0 << 1) | 0; + } + } + } + $19 = $labelInfo + 1179664 | 0; + $20 = $0 + 1 | 0; + $21 = 0 - $0 | 0; + $$sum1 = 1 - $0 | 0; + $$sum2 = ~$0; + $$sum = ($xsize * 3 | 0) + 12 | 0; + L11 : do if (($3 | 0) > 1) { + $31 = ($12 | 0) > 1; + $dpnt$078 = (HEAP32[$labelInfo + 4 >> 2] | 0) + $20 | 0; + $j$076 = 1; + $pnt$080 = $image + (($xsize * 6 | 0) + 6) | 0; + $pnt2$279 = $2 + ($20 << 1) | 0; + $wk_max$075 = 0; + L13 : while (1) { + if ($31) { + $dpnt$167 = $dpnt$078; + $i$265 = 1; + $pnt$169 = $pnt$080; + $pnt2$368 = $pnt2$279; + $wk_max$160 = $wk_max$075; + while (1) { + do if (((HEAPU8[$pnt$169 + 1 >> 0] | 0) + (HEAPU8[$pnt$169 >> 0] | 0) + (HEAPU8[$pnt$169 + 2 >> 0] | 0) | 0) > ($11 | 0)) { + HEAP16[$pnt2$368 >> 1] = 0; + HEAP8[$dpnt$167 >> 0] = 0; + $wk_max$2 = $wk_max$160; + } else { + HEAP8[$dpnt$167 >> 0] = -1; + $44 = HEAP16[$pnt2$368 + ($21 << 1) >> 1] | 0; + if ($44 << 16 >> 16 > 0) { + HEAP16[$pnt2$368 >> 1] = $44; + $47 = ($44 << 16 >> 16) * 7 | 0; + $49 = $labelInfo + 1310736 + ($47 + -7 << 2) | 0; + HEAP32[$49 >> 2] = (HEAP32[$49 >> 2] | 0) + 1; + $53 = $labelInfo + 1310736 + ($47 + -6 << 2) | 0; + HEAP32[$53 >> 2] = (HEAP32[$53 >> 2] | 0) + $i$265; + $57 = $labelInfo + 1310736 + ($47 + -5 << 2) | 0; + HEAP32[$57 >> 2] = (HEAP32[$57 >> 2] | 0) + $j$076; + HEAP32[$labelInfo + 1310736 + ($47 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $63 = HEAP16[$pnt2$368 + ($$sum1 << 1) >> 1] | 0; + $64 = $63 << 16 >> 16; + $67 = HEAP16[$pnt2$368 + ($$sum2 << 1) >> 1] | 0; + $68 = $67 << 16 >> 16; + $69 = $67 << 16 >> 16 > 0; + if ($63 << 16 >> 16 <= 0) { + if ($69) { + HEAP16[$pnt2$368 >> 1] = $67; + $169 = $68 * 7 | 0; + $171 = $labelInfo + 1310736 + ($169 + -7 << 2) | 0; + HEAP32[$171 >> 2] = (HEAP32[$171 >> 2] | 0) + 1; + $175 = $labelInfo + 1310736 + ($169 + -6 << 2) | 0; + HEAP32[$175 >> 2] = (HEAP32[$175 >> 2] | 0) + $i$265; + $179 = $labelInfo + 1310736 + ($169 + -5 << 2) | 0; + HEAP32[$179 >> 2] = (HEAP32[$179 >> 2] | 0) + $j$076; + $183 = $labelInfo + 1310736 + ($169 + -3 << 2) | 0; + if ((HEAP32[$183 >> 2] | 0) < ($i$265 | 0)) HEAP32[$183 >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($169 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $189 = HEAP16[$pnt2$368 + -2 >> 1] | 0; + if ($189 << 16 >> 16 > 0) { + HEAP16[$pnt2$368 >> 1] = $189; + $192 = ($189 << 16 >> 16) * 7 | 0; + $194 = $labelInfo + 1310736 + ($192 + -7 << 2) | 0; + HEAP32[$194 >> 2] = (HEAP32[$194 >> 2] | 0) + 1; + $198 = $labelInfo + 1310736 + ($192 + -6 << 2) | 0; + HEAP32[$198 >> 2] = (HEAP32[$198 >> 2] | 0) + $i$265; + $202 = $labelInfo + 1310736 + ($192 + -5 << 2) | 0; + HEAP32[$202 >> 2] = (HEAP32[$202 >> 2] | 0) + $j$076; + $206 = $labelInfo + 1310736 + ($192 + -3 << 2) | 0; + if ((HEAP32[$206 >> 2] | 0) >= ($i$265 | 0)) { + $wk_max$2 = $wk_max$160; + break; + } + HEAP32[$206 >> 2] = $i$265; + $wk_max$2 = $wk_max$160; + break; + } else { + $209 = $wk_max$160 + 1 | 0; + if (($wk_max$160 | 0) > 32767) break L13; + HEAP16[$pnt2$368 >> 1] = $209; + HEAP32[$labelInfo + 1179664 + ($wk_max$160 << 2) >> 2] = $209 << 16 >> 16; + $214 = $wk_max$160 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($214 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($214 + 1 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($214 + 2 << 2) >> 2] = $j$076; + HEAP32[$labelInfo + 1310736 + ($214 + 3 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($214 + 4 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($214 + 5 << 2) >> 2] = $j$076; + HEAP32[$labelInfo + 1310736 + ($214 + 6 << 2) >> 2] = $j$076; + $wk_max$2 = $209; + break; + } + } + if ($69) { + $72 = HEAP32[$labelInfo + 1179664 + ($64 + -1 << 2) >> 2] | 0; + $75 = HEAP32[$labelInfo + 1179664 + ($68 + -1 << 2) >> 2] | 0; + if (($72 | 0) > ($75 | 0)) { + HEAP16[$pnt2$368 >> 1] = $75; + if (($wk_max$160 | 0) > 0) { + $k$056 = 0; + $wk$057 = $19; + while (1) { + if ((HEAP32[$wk$057 >> 2] | 0) == ($72 | 0)) HEAP32[$wk$057 >> 2] = $75; + $k$056 = $k$056 + 1 | 0; + if (($k$056 | 0) >= ($wk_max$160 | 0)) { + $92 = $75; + break; + } else $wk$057 = $wk$057 + 4 | 0; + } + } else $92 = $75; + } else { + HEAP16[$pnt2$368 >> 1] = $72; + if (($72 | 0) < ($75 | 0) & ($wk_max$160 | 0) > 0) { + $k$153 = 0; + $wk$154 = $19; + while (1) { + if ((HEAP32[$wk$154 >> 2] | 0) == ($75 | 0)) HEAP32[$wk$154 >> 2] = $72; + $k$153 = $k$153 + 1 | 0; + if (($k$153 | 0) >= ($wk_max$160 | 0)) { + $92 = $72; + break; + } else $wk$154 = $wk$154 + 4 | 0; + } + } else $92 = $72; + } + $94 = ($92 << 16 >> 16) * 7 | 0; + $96 = $labelInfo + 1310736 + ($94 + -7 << 2) | 0; + HEAP32[$96 >> 2] = (HEAP32[$96 >> 2] | 0) + 1; + $100 = $labelInfo + 1310736 + ($94 + -6 << 2) | 0; + HEAP32[$100 >> 2] = (HEAP32[$100 >> 2] | 0) + $i$265; + $104 = $labelInfo + 1310736 + ($94 + -5 << 2) | 0; + HEAP32[$104 >> 2] = (HEAP32[$104 >> 2] | 0) + $j$076; + HEAP32[$labelInfo + 1310736 + ($94 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $110 = HEAP16[$pnt2$368 + -2 >> 1] | 0; + if ($110 << 16 >> 16 <= 0) { + HEAP16[$pnt2$368 >> 1] = $63; + $150 = $64 * 7 | 0; + $152 = $labelInfo + 1310736 + ($150 + -7 << 2) | 0; + HEAP32[$152 >> 2] = (HEAP32[$152 >> 2] | 0) + 1; + $156 = $labelInfo + 1310736 + ($150 + -6 << 2) | 0; + HEAP32[$156 >> 2] = (HEAP32[$156 >> 2] | 0) + $i$265; + $160 = $labelInfo + 1310736 + ($150 + -5 << 2) | 0; + HEAP32[$160 >> 2] = (HEAP32[$160 >> 2] | 0) + $j$076; + $164 = $labelInfo + 1310736 + ($150 + -4 << 2) | 0; + if ((HEAP32[$164 >> 2] | 0) > ($i$265 | 0)) HEAP32[$164 >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($150 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $115 = HEAP32[$labelInfo + 1179664 + ($64 + -1 << 2) >> 2] | 0; + $118 = HEAP32[$labelInfo + 1179664 + (($110 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($115 | 0) > ($118 | 0)) { + HEAP16[$pnt2$368 >> 1] = $118; + if (($wk_max$160 | 0) > 0) { + $k$249 = 0; + $wk$250 = $19; + while (1) { + if ((HEAP32[$wk$250 >> 2] | 0) == ($115 | 0)) HEAP32[$wk$250 >> 2] = $118; + $k$249 = $k$249 + 1 | 0; + if (($k$249 | 0) >= ($wk_max$160 | 0)) { + $135 = $118; + break; + } else $wk$250 = $wk$250 + 4 | 0; + } + } else $135 = $118; + } else { + HEAP16[$pnt2$368 >> 1] = $115; + if (($115 | 0) < ($118 | 0) & ($wk_max$160 | 0) > 0) { + $k$346 = 0; + $wk$347 = $19; + while (1) { + if ((HEAP32[$wk$347 >> 2] | 0) == ($118 | 0)) HEAP32[$wk$347 >> 2] = $115; + $k$346 = $k$346 + 1 | 0; + if (($k$346 | 0) >= ($wk_max$160 | 0)) { + $135 = $115; + break; + } else $wk$347 = $wk$347 + 4 | 0; + } + } else $135 = $115; + } + $137 = ($135 << 16 >> 16) * 7 | 0; + $139 = $labelInfo + 1310736 + ($137 + -7 << 2) | 0; + HEAP32[$139 >> 2] = (HEAP32[$139 >> 2] | 0) + 1; + $143 = $labelInfo + 1310736 + ($137 + -6 << 2) | 0; + HEAP32[$143 >> 2] = (HEAP32[$143 >> 2] | 0) + $i$265; + $147 = $labelInfo + 1310736 + ($137 + -5 << 2) | 0; + HEAP32[$147 >> 2] = (HEAP32[$147 >> 2] | 0) + $j$076; + $wk_max$2 = $wk_max$160; + } while (0); + $i$265 = $i$265 + 1 | 0; + $229 = $pnt$169 + 6 | 0; + $230 = $pnt2$368 + 2 | 0; + $231 = $dpnt$167 + 1 | 0; + if (($i$265 | 0) >= ($12 | 0)) { + $dpnt$1$lcssa = $231; + $pnt$1$lcssa = $229; + $pnt2$3$lcssa = $230; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $dpnt$167 = $231; + $pnt$169 = $229; + $pnt2$368 = $230; + $wk_max$160 = $wk_max$2; + } + } + } else { + $dpnt$1$lcssa = $dpnt$078; + $pnt$1$lcssa = $pnt$080; + $pnt2$3$lcssa = $pnt2$279; + $wk_max$1$lcssa = $wk_max$075; + } + $j$076 = $j$076 + 1 | 0; + if (($j$076 | 0) >= ($3 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $dpnt$078 = $dpnt$1$lcssa + 2 | 0; + $pnt$080 = $pnt$1$lcssa + $$sum | 0; + $pnt2$279 = $pnt2$3$lcssa + 4 | 0; + $wk_max$075 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $238 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$342 = 1; + $j$143 = 1; + $wk$444 = $19; + while (1) { + $240 = HEAP32[$wk$444 >> 2] | 0; + if (($240 | 0) == ($i$342 | 0)) { + $246 = $j$143; + $j$2 = $j$143 + 1 | 0; + } else { + $246 = HEAP32[$labelInfo + 1179664 + ($240 + -1 << 2) >> 2] | 0; + $j$2 = $j$143; + } + HEAP32[$wk$444 >> 2] = $246; + if (($i$342 | 0) < ($wk_max$0$lcssa | 0)) { + $i$342 = $i$342 + 1 | 0; + $j$143 = $j$2; + $wk$444 = $wk$444 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $250 = $labelInfo + 8 | 0; + $251 = $j$1$lcssa + -1 | 0; + HEAP32[$250 >> 2] = $251; + if (!$251) $$0 = 0; else { + _memset($238 | 0, 0, $251 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $251 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$440 = 0; + do { + $258 = $i$440 << 2; + HEAP32[$labelInfo + 131084 + ($258 << 2) >> 2] = $0; + HEAP32[$labelInfo + 131084 + (($258 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($258 | 2) << 2) >> 2] = $1; + HEAP32[$labelInfo + 131084 + (($258 | 3) << 2) >> 2] = 0; + $i$440 = $i$440 + 1 | 0; + } while (($i$440 | 0) < (HEAP32[$250 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$538 = 0; + do { + $272 = (HEAP32[$labelInfo + 1179664 + ($i$538 << 2) >> 2] | 0) + -1 | 0; + $273 = $i$538 * 7 | 0; + $276 = $labelInfo + 12 + ($272 << 2) | 0; + HEAP32[$276 >> 2] = (HEAP32[$276 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($273 << 2) >> 2] | 0); + $283 = $272 << 1; + $284 = $labelInfo + 655376 + ($283 << 3) | 0; + HEAPF64[$284 >> 3] = +HEAPF64[$284 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($273 + 1 << 2) >> 2] | 0); + $292 = $labelInfo + 655376 + (($283 | 1) << 3) | 0; + HEAPF64[$292 >> 3] = +HEAPF64[$292 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($273 + 2 << 2) >> 2] | 0); + $295 = $272 << 2; + $296 = $labelInfo + 131084 + ($295 << 2) | 0; + $300 = HEAP32[$labelInfo + 1310736 + ($273 + 3 << 2) >> 2] | 0; + if ((HEAP32[$296 >> 2] | 0) > ($300 | 0)) HEAP32[$296 >> 2] = $300; + $303 = $labelInfo + 131084 + (($295 | 1) << 2) | 0; + $307 = HEAP32[$labelInfo + 1310736 + ($273 + 4 << 2) >> 2] | 0; + if ((HEAP32[$303 >> 2] | 0) < ($307 | 0)) HEAP32[$303 >> 2] = $307; + $310 = $labelInfo + 131084 + (($295 | 2) << 2) | 0; + $314 = HEAP32[$labelInfo + 1310736 + ($273 + 5 << 2) >> 2] | 0; + if ((HEAP32[$310 >> 2] | 0) > ($314 | 0)) HEAP32[$310 >> 2] = $314; + $317 = $labelInfo + 131084 + (($295 | 3) << 2) | 0; + $321 = HEAP32[$labelInfo + 1310736 + ($273 + 6 << 2) >> 2] | 0; + if ((HEAP32[$317 >> 2] | 0) < ($321 | 0)) HEAP32[$317 >> 2] = $321; + $i$538 = $i$538 + 1 | 0; + } while (($i$538 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$250 >> 2] | 0) > 0) { + $i$637 = 0; + do { + $325 = $labelInfo + 12 + ($i$637 << 2) | 0; + $328 = $i$637 << 1; + $329 = $labelInfo + 655376 + ($328 << 3) | 0; + HEAPF64[$329 >> 3] = +HEAPF64[$329 >> 3] / +(HEAP32[$325 >> 2] | 0); + $335 = $labelInfo + 655376 + (($328 | 1) << 3) | 0; + HEAPF64[$335 >> 3] = +HEAPF64[$335 >> 3] / +(HEAP32[$325 >> 2] | 0); + $i$637 = $i$637 + 1 | 0; + } while (($i$637 | 0) < (HEAP32[$250 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubEWIA3C($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $$sum2 = 0, $0 = 0, $1 = 0, $101 = 0, $105 = 0, $11 = 0, $111 = 0, $116 = 0, $119 = 0, $12 = 0, $136 = 0, $138 = 0, $140 = 0, $144 = 0, $148 = 0, $151 = 0, $153 = 0, $157 = 0, $161 = 0, $165 = 0, $170 = 0, $172 = 0, $176 = 0, $180 = 0, $184 = 0, $19 = 0, $190 = 0, $193 = 0, $195 = 0, $199 = 0, $2 = 0, $20 = 0, $203 = 0, $207 = 0, $21 = 0, $210 = 0, $215 = 0, $230 = 0, $231 = 0, $232 = 0, $239 = 0, $241 = 0, $247 = 0, $251 = 0, $252 = 0, $259 = 0, $273 = 0, $274 = 0, $277 = 0, $284 = 0, $285 = 0, $293 = 0, $296 = 0, $297 = 0, $3 = 0, $301 = 0, $304 = 0, $308 = 0, $31 = 0, $311 = 0, $315 = 0, $318 = 0, $322 = 0, $326 = 0, $329 = 0, $330 = 0, $336 = 0, $45 = 0, $48 = 0, $50 = 0, $54 = 0, $58 = 0, $64 = 0, $65 = 0, $68 = 0, $69 = 0, $70 = 0, $73 = 0, $76 = 0, $93 = 0, $95 = 0, $97 = 0, $dpnt$078 = 0, $dpnt$1$lcssa = 0, $dpnt$167 = 0, $i$089 = 0, $i$183 = 0, $i$265 = 0, $i$342 = 0, $i$440 = 0, $i$538 = 0, $i$637 = 0, $j$076 = 0, $j$1$lcssa = 0, $j$143 = 0, $j$2 = 0, $k$056 = 0, $k$153 = 0, $k$249 = 0, $k$346 = 0, $pnt$080 = 0, $pnt$1$lcssa = 0, $pnt$169 = 0, $pnt1$091 = 0, $pnt1$185 = 0, $pnt2$090 = 0, $pnt2$184 = 0, $pnt2$279 = 0, $pnt2$3$lcssa = 0, $pnt2$368 = 0, $vararg_buffer = 0, $wk$057 = 0, $wk$154 = 0, $wk$250 = 0, $wk$347 = 0, $wk$444 = 0, $wk_max$0$lcssa = 0, $wk_max$075 = 0, $wk_max$1$lcssa = 0, $wk_max$160 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = ($xsize | 0) / 2 | 0; + $1 = ($ysize | 0) / 2 | 0; + $2 = HEAP32[$labelInfo >> 2] | 0; + $3 = $1 + -1 | 0; + if (($xsize | 0) > 1) { + $i$089 = 0; + $pnt1$091 = $2; + $pnt2$090 = $2 + ((Math_imul($3, $0) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$090 >> 1] = 0; + HEAP16[$pnt1$091 >> 1] = 0; + $i$089 = $i$089 + 1 | 0; + if (($i$089 | 0) >= ($0 | 0)) break; else { + $pnt1$091 = $pnt1$091 + 2 | 0; + $pnt2$090 = $pnt2$090 + 2 | 0; + } + } + } + $11 = $labelingThresh * 3 | 0; + $12 = $0 + -1 | 0; + if (($ysize | 0) > 1) { + $i$183 = 0; + $pnt1$185 = $2; + $pnt2$184 = $2 + ($12 << 1) | 0; + while (1) { + HEAP16[$pnt2$184 >> 1] = 0; + HEAP16[$pnt1$185 >> 1] = 0; + $i$183 = $i$183 + 1 | 0; + if (($i$183 | 0) >= ($1 | 0)) break; else { + $pnt1$185 = $pnt1$185 + ($0 << 1) | 0; + $pnt2$184 = $pnt2$184 + ($0 << 1) | 0; + } + } + } + $19 = $labelInfo + 1179664 | 0; + $20 = $0 + 1 | 0; + $21 = 0 - $0 | 0; + $$sum1 = 1 - $0 | 0; + $$sum2 = ~$0; + $$sum = ($xsize << 2) + 16 | 0; + L11 : do if (($3 | 0) > 1) { + $31 = ($12 | 0) > 1; + $dpnt$078 = (HEAP32[$labelInfo + 4 >> 2] | 0) + $20 | 0; + $j$076 = 1; + $pnt$080 = $image + (($xsize << 3) + 8) | 0; + $pnt2$279 = $2 + ($20 << 1) | 0; + $wk_max$075 = 0; + L13 : while (1) { + if ($31) { + $dpnt$167 = $dpnt$078; + $i$265 = 1; + $pnt$169 = $pnt$080; + $pnt2$368 = $pnt2$279; + $wk_max$160 = $wk_max$075; + while (1) { + do if (((HEAPU8[$pnt$169 + 2 >> 0] | 0) + (HEAPU8[$pnt$169 + 1 >> 0] | 0) + (HEAPU8[$pnt$169 + 3 >> 0] | 0) | 0) > ($11 | 0)) { + HEAP8[$dpnt$167 >> 0] = -1; + $45 = HEAP16[$pnt2$368 + ($21 << 1) >> 1] | 0; + if ($45 << 16 >> 16 > 0) { + HEAP16[$pnt2$368 >> 1] = $45; + $48 = ($45 << 16 >> 16) * 7 | 0; + $50 = $labelInfo + 1310736 + ($48 + -7 << 2) | 0; + HEAP32[$50 >> 2] = (HEAP32[$50 >> 2] | 0) + 1; + $54 = $labelInfo + 1310736 + ($48 + -6 << 2) | 0; + HEAP32[$54 >> 2] = (HEAP32[$54 >> 2] | 0) + $i$265; + $58 = $labelInfo + 1310736 + ($48 + -5 << 2) | 0; + HEAP32[$58 >> 2] = (HEAP32[$58 >> 2] | 0) + $j$076; + HEAP32[$labelInfo + 1310736 + ($48 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $64 = HEAP16[$pnt2$368 + ($$sum1 << 1) >> 1] | 0; + $65 = $64 << 16 >> 16; + $68 = HEAP16[$pnt2$368 + ($$sum2 << 1) >> 1] | 0; + $69 = $68 << 16 >> 16; + $70 = $68 << 16 >> 16 > 0; + if ($64 << 16 >> 16 <= 0) { + if ($70) { + HEAP16[$pnt2$368 >> 1] = $68; + $170 = $69 * 7 | 0; + $172 = $labelInfo + 1310736 + ($170 + -7 << 2) | 0; + HEAP32[$172 >> 2] = (HEAP32[$172 >> 2] | 0) + 1; + $176 = $labelInfo + 1310736 + ($170 + -6 << 2) | 0; + HEAP32[$176 >> 2] = (HEAP32[$176 >> 2] | 0) + $i$265; + $180 = $labelInfo + 1310736 + ($170 + -5 << 2) | 0; + HEAP32[$180 >> 2] = (HEAP32[$180 >> 2] | 0) + $j$076; + $184 = $labelInfo + 1310736 + ($170 + -3 << 2) | 0; + if ((HEAP32[$184 >> 2] | 0) < ($i$265 | 0)) HEAP32[$184 >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($170 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $190 = HEAP16[$pnt2$368 + -2 >> 1] | 0; + if ($190 << 16 >> 16 > 0) { + HEAP16[$pnt2$368 >> 1] = $190; + $193 = ($190 << 16 >> 16) * 7 | 0; + $195 = $labelInfo + 1310736 + ($193 + -7 << 2) | 0; + HEAP32[$195 >> 2] = (HEAP32[$195 >> 2] | 0) + 1; + $199 = $labelInfo + 1310736 + ($193 + -6 << 2) | 0; + HEAP32[$199 >> 2] = (HEAP32[$199 >> 2] | 0) + $i$265; + $203 = $labelInfo + 1310736 + ($193 + -5 << 2) | 0; + HEAP32[$203 >> 2] = (HEAP32[$203 >> 2] | 0) + $j$076; + $207 = $labelInfo + 1310736 + ($193 + -3 << 2) | 0; + if ((HEAP32[$207 >> 2] | 0) >= ($i$265 | 0)) { + $wk_max$2 = $wk_max$160; + break; + } + HEAP32[$207 >> 2] = $i$265; + $wk_max$2 = $wk_max$160; + break; + } else { + $210 = $wk_max$160 + 1 | 0; + if (($wk_max$160 | 0) > 32767) break L13; + HEAP16[$pnt2$368 >> 1] = $210; + HEAP32[$labelInfo + 1179664 + ($wk_max$160 << 2) >> 2] = $210 << 16 >> 16; + $215 = $wk_max$160 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($215 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($215 + 1 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($215 + 2 << 2) >> 2] = $j$076; + HEAP32[$labelInfo + 1310736 + ($215 + 3 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($215 + 4 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($215 + 5 << 2) >> 2] = $j$076; + HEAP32[$labelInfo + 1310736 + ($215 + 6 << 2) >> 2] = $j$076; + $wk_max$2 = $210; + break; + } + } + if ($70) { + $73 = HEAP32[$labelInfo + 1179664 + ($65 + -1 << 2) >> 2] | 0; + $76 = HEAP32[$labelInfo + 1179664 + ($69 + -1 << 2) >> 2] | 0; + if (($73 | 0) > ($76 | 0)) { + HEAP16[$pnt2$368 >> 1] = $76; + if (($wk_max$160 | 0) > 0) { + $k$056 = 0; + $wk$057 = $19; + while (1) { + if ((HEAP32[$wk$057 >> 2] | 0) == ($73 | 0)) HEAP32[$wk$057 >> 2] = $76; + $k$056 = $k$056 + 1 | 0; + if (($k$056 | 0) >= ($wk_max$160 | 0)) { + $93 = $76; + break; + } else $wk$057 = $wk$057 + 4 | 0; + } + } else $93 = $76; + } else { + HEAP16[$pnt2$368 >> 1] = $73; + if (($73 | 0) < ($76 | 0) & ($wk_max$160 | 0) > 0) { + $k$153 = 0; + $wk$154 = $19; + while (1) { + if ((HEAP32[$wk$154 >> 2] | 0) == ($76 | 0)) HEAP32[$wk$154 >> 2] = $73; + $k$153 = $k$153 + 1 | 0; + if (($k$153 | 0) >= ($wk_max$160 | 0)) { + $93 = $73; + break; + } else $wk$154 = $wk$154 + 4 | 0; + } + } else $93 = $73; + } + $95 = ($93 << 16 >> 16) * 7 | 0; + $97 = $labelInfo + 1310736 + ($95 + -7 << 2) | 0; + HEAP32[$97 >> 2] = (HEAP32[$97 >> 2] | 0) + 1; + $101 = $labelInfo + 1310736 + ($95 + -6 << 2) | 0; + HEAP32[$101 >> 2] = (HEAP32[$101 >> 2] | 0) + $i$265; + $105 = $labelInfo + 1310736 + ($95 + -5 << 2) | 0; + HEAP32[$105 >> 2] = (HEAP32[$105 >> 2] | 0) + $j$076; + HEAP32[$labelInfo + 1310736 + ($95 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $111 = HEAP16[$pnt2$368 + -2 >> 1] | 0; + if ($111 << 16 >> 16 <= 0) { + HEAP16[$pnt2$368 >> 1] = $64; + $151 = $65 * 7 | 0; + $153 = $labelInfo + 1310736 + ($151 + -7 << 2) | 0; + HEAP32[$153 >> 2] = (HEAP32[$153 >> 2] | 0) + 1; + $157 = $labelInfo + 1310736 + ($151 + -6 << 2) | 0; + HEAP32[$157 >> 2] = (HEAP32[$157 >> 2] | 0) + $i$265; + $161 = $labelInfo + 1310736 + ($151 + -5 << 2) | 0; + HEAP32[$161 >> 2] = (HEAP32[$161 >> 2] | 0) + $j$076; + $165 = $labelInfo + 1310736 + ($151 + -4 << 2) | 0; + if ((HEAP32[$165 >> 2] | 0) > ($i$265 | 0)) HEAP32[$165 >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($151 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $116 = HEAP32[$labelInfo + 1179664 + ($65 + -1 << 2) >> 2] | 0; + $119 = HEAP32[$labelInfo + 1179664 + (($111 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($116 | 0) > ($119 | 0)) { + HEAP16[$pnt2$368 >> 1] = $119; + if (($wk_max$160 | 0) > 0) { + $k$249 = 0; + $wk$250 = $19; + while (1) { + if ((HEAP32[$wk$250 >> 2] | 0) == ($116 | 0)) HEAP32[$wk$250 >> 2] = $119; + $k$249 = $k$249 + 1 | 0; + if (($k$249 | 0) >= ($wk_max$160 | 0)) { + $136 = $119; + break; + } else $wk$250 = $wk$250 + 4 | 0; + } + } else $136 = $119; + } else { + HEAP16[$pnt2$368 >> 1] = $116; + if (($116 | 0) < ($119 | 0) & ($wk_max$160 | 0) > 0) { + $k$346 = 0; + $wk$347 = $19; + while (1) { + if ((HEAP32[$wk$347 >> 2] | 0) == ($119 | 0)) HEAP32[$wk$347 >> 2] = $116; + $k$346 = $k$346 + 1 | 0; + if (($k$346 | 0) >= ($wk_max$160 | 0)) { + $136 = $116; + break; + } else $wk$347 = $wk$347 + 4 | 0; + } + } else $136 = $116; + } + $138 = ($136 << 16 >> 16) * 7 | 0; + $140 = $labelInfo + 1310736 + ($138 + -7 << 2) | 0; + HEAP32[$140 >> 2] = (HEAP32[$140 >> 2] | 0) + 1; + $144 = $labelInfo + 1310736 + ($138 + -6 << 2) | 0; + HEAP32[$144 >> 2] = (HEAP32[$144 >> 2] | 0) + $i$265; + $148 = $labelInfo + 1310736 + ($138 + -5 << 2) | 0; + HEAP32[$148 >> 2] = (HEAP32[$148 >> 2] | 0) + $j$076; + $wk_max$2 = $wk_max$160; + } else { + HEAP16[$pnt2$368 >> 1] = 0; + HEAP8[$dpnt$167 >> 0] = 0; + $wk_max$2 = $wk_max$160; + } while (0); + $i$265 = $i$265 + 1 | 0; + $230 = $pnt$169 + 8 | 0; + $231 = $pnt2$368 + 2 | 0; + $232 = $dpnt$167 + 1 | 0; + if (($i$265 | 0) >= ($12 | 0)) { + $dpnt$1$lcssa = $232; + $pnt$1$lcssa = $230; + $pnt2$3$lcssa = $231; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $dpnt$167 = $232; + $pnt$169 = $230; + $pnt2$368 = $231; + $wk_max$160 = $wk_max$2; + } + } + } else { + $dpnt$1$lcssa = $dpnt$078; + $pnt$1$lcssa = $pnt$080; + $pnt2$3$lcssa = $pnt2$279; + $wk_max$1$lcssa = $wk_max$075; + } + $j$076 = $j$076 + 1 | 0; + if (($j$076 | 0) >= ($3 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $dpnt$078 = $dpnt$1$lcssa + 2 | 0; + $pnt$080 = $pnt$1$lcssa + $$sum | 0; + $pnt2$279 = $pnt2$3$lcssa + 4 | 0; + $wk_max$075 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $239 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$342 = 1; + $j$143 = 1; + $wk$444 = $19; + while (1) { + $241 = HEAP32[$wk$444 >> 2] | 0; + if (($241 | 0) == ($i$342 | 0)) { + $247 = $j$143; + $j$2 = $j$143 + 1 | 0; + } else { + $247 = HEAP32[$labelInfo + 1179664 + ($241 + -1 << 2) >> 2] | 0; + $j$2 = $j$143; + } + HEAP32[$wk$444 >> 2] = $247; + if (($i$342 | 0) < ($wk_max$0$lcssa | 0)) { + $i$342 = $i$342 + 1 | 0; + $j$143 = $j$2; + $wk$444 = $wk$444 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $251 = $labelInfo + 8 | 0; + $252 = $j$1$lcssa + -1 | 0; + HEAP32[$251 >> 2] = $252; + if (!$252) $$0 = 0; else { + _memset($239 | 0, 0, $252 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $252 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$440 = 0; + do { + $259 = $i$440 << 2; + HEAP32[$labelInfo + 131084 + ($259 << 2) >> 2] = $0; + HEAP32[$labelInfo + 131084 + (($259 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($259 | 2) << 2) >> 2] = $1; + HEAP32[$labelInfo + 131084 + (($259 | 3) << 2) >> 2] = 0; + $i$440 = $i$440 + 1 | 0; + } while (($i$440 | 0) < (HEAP32[$251 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$538 = 0; + do { + $273 = (HEAP32[$labelInfo + 1179664 + ($i$538 << 2) >> 2] | 0) + -1 | 0; + $274 = $i$538 * 7 | 0; + $277 = $labelInfo + 12 + ($273 << 2) | 0; + HEAP32[$277 >> 2] = (HEAP32[$277 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($274 << 2) >> 2] | 0); + $284 = $273 << 1; + $285 = $labelInfo + 655376 + ($284 << 3) | 0; + HEAPF64[$285 >> 3] = +HEAPF64[$285 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($274 + 1 << 2) >> 2] | 0); + $293 = $labelInfo + 655376 + (($284 | 1) << 3) | 0; + HEAPF64[$293 >> 3] = +HEAPF64[$293 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($274 + 2 << 2) >> 2] | 0); + $296 = $273 << 2; + $297 = $labelInfo + 131084 + ($296 << 2) | 0; + $301 = HEAP32[$labelInfo + 1310736 + ($274 + 3 << 2) >> 2] | 0; + if ((HEAP32[$297 >> 2] | 0) > ($301 | 0)) HEAP32[$297 >> 2] = $301; + $304 = $labelInfo + 131084 + (($296 | 1) << 2) | 0; + $308 = HEAP32[$labelInfo + 1310736 + ($274 + 4 << 2) >> 2] | 0; + if ((HEAP32[$304 >> 2] | 0) < ($308 | 0)) HEAP32[$304 >> 2] = $308; + $311 = $labelInfo + 131084 + (($296 | 2) << 2) | 0; + $315 = HEAP32[$labelInfo + 1310736 + ($274 + 5 << 2) >> 2] | 0; + if ((HEAP32[$311 >> 2] | 0) > ($315 | 0)) HEAP32[$311 >> 2] = $315; + $318 = $labelInfo + 131084 + (($296 | 3) << 2) | 0; + $322 = HEAP32[$labelInfo + 1310736 + ($274 + 6 << 2) >> 2] | 0; + if ((HEAP32[$318 >> 2] | 0) < ($322 | 0)) HEAP32[$318 >> 2] = $322; + $i$538 = $i$538 + 1 | 0; + } while (($i$538 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$251 >> 2] | 0) > 0) { + $i$637 = 0; + do { + $326 = $labelInfo + 12 + ($i$637 << 2) | 0; + $329 = $i$637 << 1; + $330 = $labelInfo + 655376 + ($329 << 3) | 0; + HEAPF64[$330 >> 3] = +HEAPF64[$330 >> 3] / +(HEAP32[$326 >> 2] | 0); + $336 = $labelInfo + 655376 + (($329 | 1) << 3) | 0; + HEAPF64[$336 >> 3] = +HEAPF64[$336 >> 3] / +(HEAP32[$326 >> 2] | 0); + $i$637 = $i$637 + 1 | 0; + } while (($i$637 | 0) < (HEAP32[$251 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubEBIA3C($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $$sum2 = 0, $0 = 0, $1 = 0, $101 = 0, $105 = 0, $11 = 0, $111 = 0, $116 = 0, $119 = 0, $12 = 0, $136 = 0, $138 = 0, $140 = 0, $144 = 0, $148 = 0, $151 = 0, $153 = 0, $157 = 0, $161 = 0, $165 = 0, $170 = 0, $172 = 0, $176 = 0, $180 = 0, $184 = 0, $19 = 0, $190 = 0, $193 = 0, $195 = 0, $199 = 0, $2 = 0, $20 = 0, $203 = 0, $207 = 0, $21 = 0, $210 = 0, $215 = 0, $230 = 0, $231 = 0, $232 = 0, $239 = 0, $241 = 0, $247 = 0, $251 = 0, $252 = 0, $259 = 0, $273 = 0, $274 = 0, $277 = 0, $284 = 0, $285 = 0, $293 = 0, $296 = 0, $297 = 0, $3 = 0, $301 = 0, $304 = 0, $308 = 0, $31 = 0, $311 = 0, $315 = 0, $318 = 0, $322 = 0, $326 = 0, $329 = 0, $330 = 0, $336 = 0, $45 = 0, $48 = 0, $50 = 0, $54 = 0, $58 = 0, $64 = 0, $65 = 0, $68 = 0, $69 = 0, $70 = 0, $73 = 0, $76 = 0, $93 = 0, $95 = 0, $97 = 0, $dpnt$078 = 0, $dpnt$1$lcssa = 0, $dpnt$167 = 0, $i$089 = 0, $i$183 = 0, $i$265 = 0, $i$342 = 0, $i$440 = 0, $i$538 = 0, $i$637 = 0, $j$076 = 0, $j$1$lcssa = 0, $j$143 = 0, $j$2 = 0, $k$056 = 0, $k$153 = 0, $k$249 = 0, $k$346 = 0, $pnt$080 = 0, $pnt$1$lcssa = 0, $pnt$169 = 0, $pnt1$091 = 0, $pnt1$185 = 0, $pnt2$090 = 0, $pnt2$184 = 0, $pnt2$279 = 0, $pnt2$3$lcssa = 0, $pnt2$368 = 0, $vararg_buffer = 0, $wk$057 = 0, $wk$154 = 0, $wk$250 = 0, $wk$347 = 0, $wk$444 = 0, $wk_max$0$lcssa = 0, $wk_max$075 = 0, $wk_max$1$lcssa = 0, $wk_max$160 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = ($xsize | 0) / 2 | 0; + $1 = ($ysize | 0) / 2 | 0; + $2 = HEAP32[$labelInfo >> 2] | 0; + $3 = $1 + -1 | 0; + if (($xsize | 0) > 1) { + $i$089 = 0; + $pnt1$091 = $2; + $pnt2$090 = $2 + ((Math_imul($3, $0) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$090 >> 1] = 0; + HEAP16[$pnt1$091 >> 1] = 0; + $i$089 = $i$089 + 1 | 0; + if (($i$089 | 0) >= ($0 | 0)) break; else { + $pnt1$091 = $pnt1$091 + 2 | 0; + $pnt2$090 = $pnt2$090 + 2 | 0; + } + } + } + $11 = $labelingThresh * 3 | 0; + $12 = $0 + -1 | 0; + if (($ysize | 0) > 1) { + $i$183 = 0; + $pnt1$185 = $2; + $pnt2$184 = $2 + ($12 << 1) | 0; + while (1) { + HEAP16[$pnt2$184 >> 1] = 0; + HEAP16[$pnt1$185 >> 1] = 0; + $i$183 = $i$183 + 1 | 0; + if (($i$183 | 0) >= ($1 | 0)) break; else { + $pnt1$185 = $pnt1$185 + ($0 << 1) | 0; + $pnt2$184 = $pnt2$184 + ($0 << 1) | 0; + } + } + } + $19 = $labelInfo + 1179664 | 0; + $20 = $0 + 1 | 0; + $21 = 0 - $0 | 0; + $$sum1 = 1 - $0 | 0; + $$sum2 = ~$0; + $$sum = ($xsize << 2) + 16 | 0; + L11 : do if (($3 | 0) > 1) { + $31 = ($12 | 0) > 1; + $dpnt$078 = (HEAP32[$labelInfo + 4 >> 2] | 0) + $20 | 0; + $j$076 = 1; + $pnt$080 = $image + (($xsize << 3) + 8) | 0; + $pnt2$279 = $2 + ($20 << 1) | 0; + $wk_max$075 = 0; + L13 : while (1) { + if ($31) { + $dpnt$167 = $dpnt$078; + $i$265 = 1; + $pnt$169 = $pnt$080; + $pnt2$368 = $pnt2$279; + $wk_max$160 = $wk_max$075; + while (1) { + do if (((HEAPU8[$pnt$169 + 2 >> 0] | 0) + (HEAPU8[$pnt$169 + 1 >> 0] | 0) + (HEAPU8[$pnt$169 + 3 >> 0] | 0) | 0) > ($11 | 0)) { + HEAP16[$pnt2$368 >> 1] = 0; + HEAP8[$dpnt$167 >> 0] = 0; + $wk_max$2 = $wk_max$160; + } else { + HEAP8[$dpnt$167 >> 0] = -1; + $45 = HEAP16[$pnt2$368 + ($21 << 1) >> 1] | 0; + if ($45 << 16 >> 16 > 0) { + HEAP16[$pnt2$368 >> 1] = $45; + $48 = ($45 << 16 >> 16) * 7 | 0; + $50 = $labelInfo + 1310736 + ($48 + -7 << 2) | 0; + HEAP32[$50 >> 2] = (HEAP32[$50 >> 2] | 0) + 1; + $54 = $labelInfo + 1310736 + ($48 + -6 << 2) | 0; + HEAP32[$54 >> 2] = (HEAP32[$54 >> 2] | 0) + $i$265; + $58 = $labelInfo + 1310736 + ($48 + -5 << 2) | 0; + HEAP32[$58 >> 2] = (HEAP32[$58 >> 2] | 0) + $j$076; + HEAP32[$labelInfo + 1310736 + ($48 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $64 = HEAP16[$pnt2$368 + ($$sum1 << 1) >> 1] | 0; + $65 = $64 << 16 >> 16; + $68 = HEAP16[$pnt2$368 + ($$sum2 << 1) >> 1] | 0; + $69 = $68 << 16 >> 16; + $70 = $68 << 16 >> 16 > 0; + if ($64 << 16 >> 16 <= 0) { + if ($70) { + HEAP16[$pnt2$368 >> 1] = $68; + $170 = $69 * 7 | 0; + $172 = $labelInfo + 1310736 + ($170 + -7 << 2) | 0; + HEAP32[$172 >> 2] = (HEAP32[$172 >> 2] | 0) + 1; + $176 = $labelInfo + 1310736 + ($170 + -6 << 2) | 0; + HEAP32[$176 >> 2] = (HEAP32[$176 >> 2] | 0) + $i$265; + $180 = $labelInfo + 1310736 + ($170 + -5 << 2) | 0; + HEAP32[$180 >> 2] = (HEAP32[$180 >> 2] | 0) + $j$076; + $184 = $labelInfo + 1310736 + ($170 + -3 << 2) | 0; + if ((HEAP32[$184 >> 2] | 0) < ($i$265 | 0)) HEAP32[$184 >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($170 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $190 = HEAP16[$pnt2$368 + -2 >> 1] | 0; + if ($190 << 16 >> 16 > 0) { + HEAP16[$pnt2$368 >> 1] = $190; + $193 = ($190 << 16 >> 16) * 7 | 0; + $195 = $labelInfo + 1310736 + ($193 + -7 << 2) | 0; + HEAP32[$195 >> 2] = (HEAP32[$195 >> 2] | 0) + 1; + $199 = $labelInfo + 1310736 + ($193 + -6 << 2) | 0; + HEAP32[$199 >> 2] = (HEAP32[$199 >> 2] | 0) + $i$265; + $203 = $labelInfo + 1310736 + ($193 + -5 << 2) | 0; + HEAP32[$203 >> 2] = (HEAP32[$203 >> 2] | 0) + $j$076; + $207 = $labelInfo + 1310736 + ($193 + -3 << 2) | 0; + if ((HEAP32[$207 >> 2] | 0) >= ($i$265 | 0)) { + $wk_max$2 = $wk_max$160; + break; + } + HEAP32[$207 >> 2] = $i$265; + $wk_max$2 = $wk_max$160; + break; + } else { + $210 = $wk_max$160 + 1 | 0; + if (($wk_max$160 | 0) > 32767) break L13; + HEAP16[$pnt2$368 >> 1] = $210; + HEAP32[$labelInfo + 1179664 + ($wk_max$160 << 2) >> 2] = $210 << 16 >> 16; + $215 = $wk_max$160 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($215 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($215 + 1 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($215 + 2 << 2) >> 2] = $j$076; + HEAP32[$labelInfo + 1310736 + ($215 + 3 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($215 + 4 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($215 + 5 << 2) >> 2] = $j$076; + HEAP32[$labelInfo + 1310736 + ($215 + 6 << 2) >> 2] = $j$076; + $wk_max$2 = $210; + break; + } + } + if ($70) { + $73 = HEAP32[$labelInfo + 1179664 + ($65 + -1 << 2) >> 2] | 0; + $76 = HEAP32[$labelInfo + 1179664 + ($69 + -1 << 2) >> 2] | 0; + if (($73 | 0) > ($76 | 0)) { + HEAP16[$pnt2$368 >> 1] = $76; + if (($wk_max$160 | 0) > 0) { + $k$056 = 0; + $wk$057 = $19; + while (1) { + if ((HEAP32[$wk$057 >> 2] | 0) == ($73 | 0)) HEAP32[$wk$057 >> 2] = $76; + $k$056 = $k$056 + 1 | 0; + if (($k$056 | 0) >= ($wk_max$160 | 0)) { + $93 = $76; + break; + } else $wk$057 = $wk$057 + 4 | 0; + } + } else $93 = $76; + } else { + HEAP16[$pnt2$368 >> 1] = $73; + if (($73 | 0) < ($76 | 0) & ($wk_max$160 | 0) > 0) { + $k$153 = 0; + $wk$154 = $19; + while (1) { + if ((HEAP32[$wk$154 >> 2] | 0) == ($76 | 0)) HEAP32[$wk$154 >> 2] = $73; + $k$153 = $k$153 + 1 | 0; + if (($k$153 | 0) >= ($wk_max$160 | 0)) { + $93 = $73; + break; + } else $wk$154 = $wk$154 + 4 | 0; + } + } else $93 = $73; + } + $95 = ($93 << 16 >> 16) * 7 | 0; + $97 = $labelInfo + 1310736 + ($95 + -7 << 2) | 0; + HEAP32[$97 >> 2] = (HEAP32[$97 >> 2] | 0) + 1; + $101 = $labelInfo + 1310736 + ($95 + -6 << 2) | 0; + HEAP32[$101 >> 2] = (HEAP32[$101 >> 2] | 0) + $i$265; + $105 = $labelInfo + 1310736 + ($95 + -5 << 2) | 0; + HEAP32[$105 >> 2] = (HEAP32[$105 >> 2] | 0) + $j$076; + HEAP32[$labelInfo + 1310736 + ($95 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $111 = HEAP16[$pnt2$368 + -2 >> 1] | 0; + if ($111 << 16 >> 16 <= 0) { + HEAP16[$pnt2$368 >> 1] = $64; + $151 = $65 * 7 | 0; + $153 = $labelInfo + 1310736 + ($151 + -7 << 2) | 0; + HEAP32[$153 >> 2] = (HEAP32[$153 >> 2] | 0) + 1; + $157 = $labelInfo + 1310736 + ($151 + -6 << 2) | 0; + HEAP32[$157 >> 2] = (HEAP32[$157 >> 2] | 0) + $i$265; + $161 = $labelInfo + 1310736 + ($151 + -5 << 2) | 0; + HEAP32[$161 >> 2] = (HEAP32[$161 >> 2] | 0) + $j$076; + $165 = $labelInfo + 1310736 + ($151 + -4 << 2) | 0; + if ((HEAP32[$165 >> 2] | 0) > ($i$265 | 0)) HEAP32[$165 >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($151 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $116 = HEAP32[$labelInfo + 1179664 + ($65 + -1 << 2) >> 2] | 0; + $119 = HEAP32[$labelInfo + 1179664 + (($111 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($116 | 0) > ($119 | 0)) { + HEAP16[$pnt2$368 >> 1] = $119; + if (($wk_max$160 | 0) > 0) { + $k$249 = 0; + $wk$250 = $19; + while (1) { + if ((HEAP32[$wk$250 >> 2] | 0) == ($116 | 0)) HEAP32[$wk$250 >> 2] = $119; + $k$249 = $k$249 + 1 | 0; + if (($k$249 | 0) >= ($wk_max$160 | 0)) { + $136 = $119; + break; + } else $wk$250 = $wk$250 + 4 | 0; + } + } else $136 = $119; + } else { + HEAP16[$pnt2$368 >> 1] = $116; + if (($116 | 0) < ($119 | 0) & ($wk_max$160 | 0) > 0) { + $k$346 = 0; + $wk$347 = $19; + while (1) { + if ((HEAP32[$wk$347 >> 2] | 0) == ($119 | 0)) HEAP32[$wk$347 >> 2] = $116; + $k$346 = $k$346 + 1 | 0; + if (($k$346 | 0) >= ($wk_max$160 | 0)) { + $136 = $116; + break; + } else $wk$347 = $wk$347 + 4 | 0; + } + } else $136 = $116; + } + $138 = ($136 << 16 >> 16) * 7 | 0; + $140 = $labelInfo + 1310736 + ($138 + -7 << 2) | 0; + HEAP32[$140 >> 2] = (HEAP32[$140 >> 2] | 0) + 1; + $144 = $labelInfo + 1310736 + ($138 + -6 << 2) | 0; + HEAP32[$144 >> 2] = (HEAP32[$144 >> 2] | 0) + $i$265; + $148 = $labelInfo + 1310736 + ($138 + -5 << 2) | 0; + HEAP32[$148 >> 2] = (HEAP32[$148 >> 2] | 0) + $j$076; + $wk_max$2 = $wk_max$160; + } while (0); + $i$265 = $i$265 + 1 | 0; + $230 = $pnt$169 + 8 | 0; + $231 = $pnt2$368 + 2 | 0; + $232 = $dpnt$167 + 1 | 0; + if (($i$265 | 0) >= ($12 | 0)) { + $dpnt$1$lcssa = $232; + $pnt$1$lcssa = $230; + $pnt2$3$lcssa = $231; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $dpnt$167 = $232; + $pnt$169 = $230; + $pnt2$368 = $231; + $wk_max$160 = $wk_max$2; + } + } + } else { + $dpnt$1$lcssa = $dpnt$078; + $pnt$1$lcssa = $pnt$080; + $pnt2$3$lcssa = $pnt2$279; + $wk_max$1$lcssa = $wk_max$075; + } + $j$076 = $j$076 + 1 | 0; + if (($j$076 | 0) >= ($3 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $dpnt$078 = $dpnt$1$lcssa + 2 | 0; + $pnt$080 = $pnt$1$lcssa + $$sum | 0; + $pnt2$279 = $pnt2$3$lcssa + 4 | 0; + $wk_max$075 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $239 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$342 = 1; + $j$143 = 1; + $wk$444 = $19; + while (1) { + $241 = HEAP32[$wk$444 >> 2] | 0; + if (($241 | 0) == ($i$342 | 0)) { + $247 = $j$143; + $j$2 = $j$143 + 1 | 0; + } else { + $247 = HEAP32[$labelInfo + 1179664 + ($241 + -1 << 2) >> 2] | 0; + $j$2 = $j$143; + } + HEAP32[$wk$444 >> 2] = $247; + if (($i$342 | 0) < ($wk_max$0$lcssa | 0)) { + $i$342 = $i$342 + 1 | 0; + $j$143 = $j$2; + $wk$444 = $wk$444 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $251 = $labelInfo + 8 | 0; + $252 = $j$1$lcssa + -1 | 0; + HEAP32[$251 >> 2] = $252; + if (!$252) $$0 = 0; else { + _memset($239 | 0, 0, $252 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $252 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$440 = 0; + do { + $259 = $i$440 << 2; + HEAP32[$labelInfo + 131084 + ($259 << 2) >> 2] = $0; + HEAP32[$labelInfo + 131084 + (($259 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($259 | 2) << 2) >> 2] = $1; + HEAP32[$labelInfo + 131084 + (($259 | 3) << 2) >> 2] = 0; + $i$440 = $i$440 + 1 | 0; + } while (($i$440 | 0) < (HEAP32[$251 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$538 = 0; + do { + $273 = (HEAP32[$labelInfo + 1179664 + ($i$538 << 2) >> 2] | 0) + -1 | 0; + $274 = $i$538 * 7 | 0; + $277 = $labelInfo + 12 + ($273 << 2) | 0; + HEAP32[$277 >> 2] = (HEAP32[$277 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($274 << 2) >> 2] | 0); + $284 = $273 << 1; + $285 = $labelInfo + 655376 + ($284 << 3) | 0; + HEAPF64[$285 >> 3] = +HEAPF64[$285 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($274 + 1 << 2) >> 2] | 0); + $293 = $labelInfo + 655376 + (($284 | 1) << 3) | 0; + HEAPF64[$293 >> 3] = +HEAPF64[$293 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($274 + 2 << 2) >> 2] | 0); + $296 = $273 << 2; + $297 = $labelInfo + 131084 + ($296 << 2) | 0; + $301 = HEAP32[$labelInfo + 1310736 + ($274 + 3 << 2) >> 2] | 0; + if ((HEAP32[$297 >> 2] | 0) > ($301 | 0)) HEAP32[$297 >> 2] = $301; + $304 = $labelInfo + 131084 + (($296 | 1) << 2) | 0; + $308 = HEAP32[$labelInfo + 1310736 + ($274 + 4 << 2) >> 2] | 0; + if ((HEAP32[$304 >> 2] | 0) < ($308 | 0)) HEAP32[$304 >> 2] = $308; + $311 = $labelInfo + 131084 + (($296 | 2) << 2) | 0; + $315 = HEAP32[$labelInfo + 1310736 + ($274 + 5 << 2) >> 2] | 0; + if ((HEAP32[$311 >> 2] | 0) > ($315 | 0)) HEAP32[$311 >> 2] = $315; + $318 = $labelInfo + 131084 + (($296 | 3) << 2) | 0; + $322 = HEAP32[$labelInfo + 1310736 + ($274 + 6 << 2) >> 2] | 0; + if ((HEAP32[$318 >> 2] | 0) < ($322 | 0)) HEAP32[$318 >> 2] = $322; + $i$538 = $i$538 + 1 | 0; + } while (($i$538 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$251 >> 2] | 0) > 0) { + $i$637 = 0; + do { + $326 = $labelInfo + 12 + ($i$637 << 2) | 0; + $329 = $i$637 << 1; + $330 = $labelInfo + 655376 + ($329 << 3) | 0; + HEAPF64[$330 >> 3] = +HEAPF64[$330 >> 3] / +(HEAP32[$326 >> 2] | 0); + $336 = $labelInfo + 655376 + (($329 | 1) << 3) | 0; + HEAPF64[$336 >> 3] = +HEAPF64[$336 >> 3] / +(HEAP32[$326 >> 2] | 0); + $i$637 = $i$637 + 1 | 0; + } while (($i$637 | 0) < (HEAP32[$251 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubEWI3CA($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $$sum2 = 0, $0 = 0, $1 = 0, $100 = 0, $104 = 0, $11 = 0, $110 = 0, $115 = 0, $118 = 0, $12 = 0, $135 = 0, $137 = 0, $139 = 0, $143 = 0, $147 = 0, $150 = 0, $152 = 0, $156 = 0, $160 = 0, $164 = 0, $169 = 0, $171 = 0, $175 = 0, $179 = 0, $183 = 0, $189 = 0, $19 = 0, $192 = 0, $194 = 0, $198 = 0, $2 = 0, $20 = 0, $202 = 0, $206 = 0, $209 = 0, $21 = 0, $214 = 0, $229 = 0, $230 = 0, $231 = 0, $238 = 0, $240 = 0, $246 = 0, $250 = 0, $251 = 0, $258 = 0, $272 = 0, $273 = 0, $276 = 0, $283 = 0, $284 = 0, $292 = 0, $295 = 0, $296 = 0, $3 = 0, $300 = 0, $303 = 0, $307 = 0, $31 = 0, $310 = 0, $314 = 0, $317 = 0, $321 = 0, $325 = 0, $328 = 0, $329 = 0, $335 = 0, $44 = 0, $47 = 0, $49 = 0, $53 = 0, $57 = 0, $63 = 0, $64 = 0, $67 = 0, $68 = 0, $69 = 0, $72 = 0, $75 = 0, $92 = 0, $94 = 0, $96 = 0, $dpnt$078 = 0, $dpnt$1$lcssa = 0, $dpnt$167 = 0, $i$089 = 0, $i$183 = 0, $i$265 = 0, $i$342 = 0, $i$440 = 0, $i$538 = 0, $i$637 = 0, $j$076 = 0, $j$1$lcssa = 0, $j$143 = 0, $j$2 = 0, $k$056 = 0, $k$153 = 0, $k$249 = 0, $k$346 = 0, $pnt$080 = 0, $pnt$1$lcssa = 0, $pnt$169 = 0, $pnt1$091 = 0, $pnt1$185 = 0, $pnt2$090 = 0, $pnt2$184 = 0, $pnt2$279 = 0, $pnt2$3$lcssa = 0, $pnt2$368 = 0, $vararg_buffer = 0, $wk$057 = 0, $wk$154 = 0, $wk$250 = 0, $wk$347 = 0, $wk$444 = 0, $wk_max$0$lcssa = 0, $wk_max$075 = 0, $wk_max$1$lcssa = 0, $wk_max$160 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = ($xsize | 0) / 2 | 0; + $1 = ($ysize | 0) / 2 | 0; + $2 = HEAP32[$labelInfo >> 2] | 0; + $3 = $1 + -1 | 0; + if (($xsize | 0) > 1) { + $i$089 = 0; + $pnt1$091 = $2; + $pnt2$090 = $2 + ((Math_imul($3, $0) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$090 >> 1] = 0; + HEAP16[$pnt1$091 >> 1] = 0; + $i$089 = $i$089 + 1 | 0; + if (($i$089 | 0) >= ($0 | 0)) break; else { + $pnt1$091 = $pnt1$091 + 2 | 0; + $pnt2$090 = $pnt2$090 + 2 | 0; + } + } + } + $11 = $labelingThresh * 3 | 0; + $12 = $0 + -1 | 0; + if (($ysize | 0) > 1) { + $i$183 = 0; + $pnt1$185 = $2; + $pnt2$184 = $2 + ($12 << 1) | 0; + while (1) { + HEAP16[$pnt2$184 >> 1] = 0; + HEAP16[$pnt1$185 >> 1] = 0; + $i$183 = $i$183 + 1 | 0; + if (($i$183 | 0) >= ($1 | 0)) break; else { + $pnt1$185 = $pnt1$185 + ($0 << 1) | 0; + $pnt2$184 = $pnt2$184 + ($0 << 1) | 0; + } + } + } + $19 = $labelInfo + 1179664 | 0; + $20 = $0 + 1 | 0; + $21 = 0 - $0 | 0; + $$sum1 = 1 - $0 | 0; + $$sum2 = ~$0; + $$sum = ($xsize << 2) + 16 | 0; + L11 : do if (($3 | 0) > 1) { + $31 = ($12 | 0) > 1; + $dpnt$078 = (HEAP32[$labelInfo + 4 >> 2] | 0) + $20 | 0; + $j$076 = 1; + $pnt$080 = $image + (($xsize << 3) + 8) | 0; + $pnt2$279 = $2 + ($20 << 1) | 0; + $wk_max$075 = 0; + L13 : while (1) { + if ($31) { + $dpnt$167 = $dpnt$078; + $i$265 = 1; + $pnt$169 = $pnt$080; + $pnt2$368 = $pnt2$279; + $wk_max$160 = $wk_max$075; + while (1) { + do if (((HEAPU8[$pnt$169 + 1 >> 0] | 0) + (HEAPU8[$pnt$169 >> 0] | 0) + (HEAPU8[$pnt$169 + 2 >> 0] | 0) | 0) > ($11 | 0)) { + HEAP8[$dpnt$167 >> 0] = -1; + $44 = HEAP16[$pnt2$368 + ($21 << 1) >> 1] | 0; + if ($44 << 16 >> 16 > 0) { + HEAP16[$pnt2$368 >> 1] = $44; + $47 = ($44 << 16 >> 16) * 7 | 0; + $49 = $labelInfo + 1310736 + ($47 + -7 << 2) | 0; + HEAP32[$49 >> 2] = (HEAP32[$49 >> 2] | 0) + 1; + $53 = $labelInfo + 1310736 + ($47 + -6 << 2) | 0; + HEAP32[$53 >> 2] = (HEAP32[$53 >> 2] | 0) + $i$265; + $57 = $labelInfo + 1310736 + ($47 + -5 << 2) | 0; + HEAP32[$57 >> 2] = (HEAP32[$57 >> 2] | 0) + $j$076; + HEAP32[$labelInfo + 1310736 + ($47 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $63 = HEAP16[$pnt2$368 + ($$sum1 << 1) >> 1] | 0; + $64 = $63 << 16 >> 16; + $67 = HEAP16[$pnt2$368 + ($$sum2 << 1) >> 1] | 0; + $68 = $67 << 16 >> 16; + $69 = $67 << 16 >> 16 > 0; + if ($63 << 16 >> 16 <= 0) { + if ($69) { + HEAP16[$pnt2$368 >> 1] = $67; + $169 = $68 * 7 | 0; + $171 = $labelInfo + 1310736 + ($169 + -7 << 2) | 0; + HEAP32[$171 >> 2] = (HEAP32[$171 >> 2] | 0) + 1; + $175 = $labelInfo + 1310736 + ($169 + -6 << 2) | 0; + HEAP32[$175 >> 2] = (HEAP32[$175 >> 2] | 0) + $i$265; + $179 = $labelInfo + 1310736 + ($169 + -5 << 2) | 0; + HEAP32[$179 >> 2] = (HEAP32[$179 >> 2] | 0) + $j$076; + $183 = $labelInfo + 1310736 + ($169 + -3 << 2) | 0; + if ((HEAP32[$183 >> 2] | 0) < ($i$265 | 0)) HEAP32[$183 >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($169 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $189 = HEAP16[$pnt2$368 + -2 >> 1] | 0; + if ($189 << 16 >> 16 > 0) { + HEAP16[$pnt2$368 >> 1] = $189; + $192 = ($189 << 16 >> 16) * 7 | 0; + $194 = $labelInfo + 1310736 + ($192 + -7 << 2) | 0; + HEAP32[$194 >> 2] = (HEAP32[$194 >> 2] | 0) + 1; + $198 = $labelInfo + 1310736 + ($192 + -6 << 2) | 0; + HEAP32[$198 >> 2] = (HEAP32[$198 >> 2] | 0) + $i$265; + $202 = $labelInfo + 1310736 + ($192 + -5 << 2) | 0; + HEAP32[$202 >> 2] = (HEAP32[$202 >> 2] | 0) + $j$076; + $206 = $labelInfo + 1310736 + ($192 + -3 << 2) | 0; + if ((HEAP32[$206 >> 2] | 0) >= ($i$265 | 0)) { + $wk_max$2 = $wk_max$160; + break; + } + HEAP32[$206 >> 2] = $i$265; + $wk_max$2 = $wk_max$160; + break; + } else { + $209 = $wk_max$160 + 1 | 0; + if (($wk_max$160 | 0) > 32767) break L13; + HEAP16[$pnt2$368 >> 1] = $209; + HEAP32[$labelInfo + 1179664 + ($wk_max$160 << 2) >> 2] = $209 << 16 >> 16; + $214 = $wk_max$160 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($214 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($214 + 1 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($214 + 2 << 2) >> 2] = $j$076; + HEAP32[$labelInfo + 1310736 + ($214 + 3 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($214 + 4 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($214 + 5 << 2) >> 2] = $j$076; + HEAP32[$labelInfo + 1310736 + ($214 + 6 << 2) >> 2] = $j$076; + $wk_max$2 = $209; + break; + } + } + if ($69) { + $72 = HEAP32[$labelInfo + 1179664 + ($64 + -1 << 2) >> 2] | 0; + $75 = HEAP32[$labelInfo + 1179664 + ($68 + -1 << 2) >> 2] | 0; + if (($72 | 0) > ($75 | 0)) { + HEAP16[$pnt2$368 >> 1] = $75; + if (($wk_max$160 | 0) > 0) { + $k$056 = 0; + $wk$057 = $19; + while (1) { + if ((HEAP32[$wk$057 >> 2] | 0) == ($72 | 0)) HEAP32[$wk$057 >> 2] = $75; + $k$056 = $k$056 + 1 | 0; + if (($k$056 | 0) >= ($wk_max$160 | 0)) { + $92 = $75; + break; + } else $wk$057 = $wk$057 + 4 | 0; + } + } else $92 = $75; + } else { + HEAP16[$pnt2$368 >> 1] = $72; + if (($72 | 0) < ($75 | 0) & ($wk_max$160 | 0) > 0) { + $k$153 = 0; + $wk$154 = $19; + while (1) { + if ((HEAP32[$wk$154 >> 2] | 0) == ($75 | 0)) HEAP32[$wk$154 >> 2] = $72; + $k$153 = $k$153 + 1 | 0; + if (($k$153 | 0) >= ($wk_max$160 | 0)) { + $92 = $72; + break; + } else $wk$154 = $wk$154 + 4 | 0; + } + } else $92 = $72; + } + $94 = ($92 << 16 >> 16) * 7 | 0; + $96 = $labelInfo + 1310736 + ($94 + -7 << 2) | 0; + HEAP32[$96 >> 2] = (HEAP32[$96 >> 2] | 0) + 1; + $100 = $labelInfo + 1310736 + ($94 + -6 << 2) | 0; + HEAP32[$100 >> 2] = (HEAP32[$100 >> 2] | 0) + $i$265; + $104 = $labelInfo + 1310736 + ($94 + -5 << 2) | 0; + HEAP32[$104 >> 2] = (HEAP32[$104 >> 2] | 0) + $j$076; + HEAP32[$labelInfo + 1310736 + ($94 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $110 = HEAP16[$pnt2$368 + -2 >> 1] | 0; + if ($110 << 16 >> 16 <= 0) { + HEAP16[$pnt2$368 >> 1] = $63; + $150 = $64 * 7 | 0; + $152 = $labelInfo + 1310736 + ($150 + -7 << 2) | 0; + HEAP32[$152 >> 2] = (HEAP32[$152 >> 2] | 0) + 1; + $156 = $labelInfo + 1310736 + ($150 + -6 << 2) | 0; + HEAP32[$156 >> 2] = (HEAP32[$156 >> 2] | 0) + $i$265; + $160 = $labelInfo + 1310736 + ($150 + -5 << 2) | 0; + HEAP32[$160 >> 2] = (HEAP32[$160 >> 2] | 0) + $j$076; + $164 = $labelInfo + 1310736 + ($150 + -4 << 2) | 0; + if ((HEAP32[$164 >> 2] | 0) > ($i$265 | 0)) HEAP32[$164 >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($150 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $115 = HEAP32[$labelInfo + 1179664 + ($64 + -1 << 2) >> 2] | 0; + $118 = HEAP32[$labelInfo + 1179664 + (($110 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($115 | 0) > ($118 | 0)) { + HEAP16[$pnt2$368 >> 1] = $118; + if (($wk_max$160 | 0) > 0) { + $k$249 = 0; + $wk$250 = $19; + while (1) { + if ((HEAP32[$wk$250 >> 2] | 0) == ($115 | 0)) HEAP32[$wk$250 >> 2] = $118; + $k$249 = $k$249 + 1 | 0; + if (($k$249 | 0) >= ($wk_max$160 | 0)) { + $135 = $118; + break; + } else $wk$250 = $wk$250 + 4 | 0; + } + } else $135 = $118; + } else { + HEAP16[$pnt2$368 >> 1] = $115; + if (($115 | 0) < ($118 | 0) & ($wk_max$160 | 0) > 0) { + $k$346 = 0; + $wk$347 = $19; + while (1) { + if ((HEAP32[$wk$347 >> 2] | 0) == ($118 | 0)) HEAP32[$wk$347 >> 2] = $115; + $k$346 = $k$346 + 1 | 0; + if (($k$346 | 0) >= ($wk_max$160 | 0)) { + $135 = $115; + break; + } else $wk$347 = $wk$347 + 4 | 0; + } + } else $135 = $115; + } + $137 = ($135 << 16 >> 16) * 7 | 0; + $139 = $labelInfo + 1310736 + ($137 + -7 << 2) | 0; + HEAP32[$139 >> 2] = (HEAP32[$139 >> 2] | 0) + 1; + $143 = $labelInfo + 1310736 + ($137 + -6 << 2) | 0; + HEAP32[$143 >> 2] = (HEAP32[$143 >> 2] | 0) + $i$265; + $147 = $labelInfo + 1310736 + ($137 + -5 << 2) | 0; + HEAP32[$147 >> 2] = (HEAP32[$147 >> 2] | 0) + $j$076; + $wk_max$2 = $wk_max$160; + } else { + HEAP16[$pnt2$368 >> 1] = 0; + HEAP8[$dpnt$167 >> 0] = 0; + $wk_max$2 = $wk_max$160; + } while (0); + $i$265 = $i$265 + 1 | 0; + $229 = $pnt$169 + 8 | 0; + $230 = $pnt2$368 + 2 | 0; + $231 = $dpnt$167 + 1 | 0; + if (($i$265 | 0) >= ($12 | 0)) { + $dpnt$1$lcssa = $231; + $pnt$1$lcssa = $229; + $pnt2$3$lcssa = $230; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $dpnt$167 = $231; + $pnt$169 = $229; + $pnt2$368 = $230; + $wk_max$160 = $wk_max$2; + } + } + } else { + $dpnt$1$lcssa = $dpnt$078; + $pnt$1$lcssa = $pnt$080; + $pnt2$3$lcssa = $pnt2$279; + $wk_max$1$lcssa = $wk_max$075; + } + $j$076 = $j$076 + 1 | 0; + if (($j$076 | 0) >= ($3 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $dpnt$078 = $dpnt$1$lcssa + 2 | 0; + $pnt$080 = $pnt$1$lcssa + $$sum | 0; + $pnt2$279 = $pnt2$3$lcssa + 4 | 0; + $wk_max$075 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $238 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$342 = 1; + $j$143 = 1; + $wk$444 = $19; + while (1) { + $240 = HEAP32[$wk$444 >> 2] | 0; + if (($240 | 0) == ($i$342 | 0)) { + $246 = $j$143; + $j$2 = $j$143 + 1 | 0; + } else { + $246 = HEAP32[$labelInfo + 1179664 + ($240 + -1 << 2) >> 2] | 0; + $j$2 = $j$143; + } + HEAP32[$wk$444 >> 2] = $246; + if (($i$342 | 0) < ($wk_max$0$lcssa | 0)) { + $i$342 = $i$342 + 1 | 0; + $j$143 = $j$2; + $wk$444 = $wk$444 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $250 = $labelInfo + 8 | 0; + $251 = $j$1$lcssa + -1 | 0; + HEAP32[$250 >> 2] = $251; + if (!$251) $$0 = 0; else { + _memset($238 | 0, 0, $251 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $251 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$440 = 0; + do { + $258 = $i$440 << 2; + HEAP32[$labelInfo + 131084 + ($258 << 2) >> 2] = $0; + HEAP32[$labelInfo + 131084 + (($258 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($258 | 2) << 2) >> 2] = $1; + HEAP32[$labelInfo + 131084 + (($258 | 3) << 2) >> 2] = 0; + $i$440 = $i$440 + 1 | 0; + } while (($i$440 | 0) < (HEAP32[$250 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$538 = 0; + do { + $272 = (HEAP32[$labelInfo + 1179664 + ($i$538 << 2) >> 2] | 0) + -1 | 0; + $273 = $i$538 * 7 | 0; + $276 = $labelInfo + 12 + ($272 << 2) | 0; + HEAP32[$276 >> 2] = (HEAP32[$276 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($273 << 2) >> 2] | 0); + $283 = $272 << 1; + $284 = $labelInfo + 655376 + ($283 << 3) | 0; + HEAPF64[$284 >> 3] = +HEAPF64[$284 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($273 + 1 << 2) >> 2] | 0); + $292 = $labelInfo + 655376 + (($283 | 1) << 3) | 0; + HEAPF64[$292 >> 3] = +HEAPF64[$292 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($273 + 2 << 2) >> 2] | 0); + $295 = $272 << 2; + $296 = $labelInfo + 131084 + ($295 << 2) | 0; + $300 = HEAP32[$labelInfo + 1310736 + ($273 + 3 << 2) >> 2] | 0; + if ((HEAP32[$296 >> 2] | 0) > ($300 | 0)) HEAP32[$296 >> 2] = $300; + $303 = $labelInfo + 131084 + (($295 | 1) << 2) | 0; + $307 = HEAP32[$labelInfo + 1310736 + ($273 + 4 << 2) >> 2] | 0; + if ((HEAP32[$303 >> 2] | 0) < ($307 | 0)) HEAP32[$303 >> 2] = $307; + $310 = $labelInfo + 131084 + (($295 | 2) << 2) | 0; + $314 = HEAP32[$labelInfo + 1310736 + ($273 + 5 << 2) >> 2] | 0; + if ((HEAP32[$310 >> 2] | 0) > ($314 | 0)) HEAP32[$310 >> 2] = $314; + $317 = $labelInfo + 131084 + (($295 | 3) << 2) | 0; + $321 = HEAP32[$labelInfo + 1310736 + ($273 + 6 << 2) >> 2] | 0; + if ((HEAP32[$317 >> 2] | 0) < ($321 | 0)) HEAP32[$317 >> 2] = $321; + $i$538 = $i$538 + 1 | 0; + } while (($i$538 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$250 >> 2] | 0) > 0) { + $i$637 = 0; + do { + $325 = $labelInfo + 12 + ($i$637 << 2) | 0; + $328 = $i$637 << 1; + $329 = $labelInfo + 655376 + ($328 << 3) | 0; + HEAPF64[$329 >> 3] = +HEAPF64[$329 >> 3] / +(HEAP32[$325 >> 2] | 0); + $335 = $labelInfo + 655376 + (($328 | 1) << 3) | 0; + HEAPF64[$335 >> 3] = +HEAPF64[$335 >> 3] / +(HEAP32[$325 >> 2] | 0); + $i$637 = $i$637 + 1 | 0; + } while (($i$637 | 0) < (HEAP32[$250 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubEBI3CA($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $$sum2 = 0, $0 = 0, $1 = 0, $100 = 0, $104 = 0, $11 = 0, $110 = 0, $115 = 0, $118 = 0, $12 = 0, $135 = 0, $137 = 0, $139 = 0, $143 = 0, $147 = 0, $150 = 0, $152 = 0, $156 = 0, $160 = 0, $164 = 0, $169 = 0, $171 = 0, $175 = 0, $179 = 0, $183 = 0, $189 = 0, $19 = 0, $192 = 0, $194 = 0, $198 = 0, $2 = 0, $20 = 0, $202 = 0, $206 = 0, $209 = 0, $21 = 0, $214 = 0, $229 = 0, $230 = 0, $231 = 0, $238 = 0, $240 = 0, $246 = 0, $250 = 0, $251 = 0, $258 = 0, $272 = 0, $273 = 0, $276 = 0, $283 = 0, $284 = 0, $292 = 0, $295 = 0, $296 = 0, $3 = 0, $300 = 0, $303 = 0, $307 = 0, $31 = 0, $310 = 0, $314 = 0, $317 = 0, $321 = 0, $325 = 0, $328 = 0, $329 = 0, $335 = 0, $44 = 0, $47 = 0, $49 = 0, $53 = 0, $57 = 0, $63 = 0, $64 = 0, $67 = 0, $68 = 0, $69 = 0, $72 = 0, $75 = 0, $92 = 0, $94 = 0, $96 = 0, $dpnt$078 = 0, $dpnt$1$lcssa = 0, $dpnt$167 = 0, $i$089 = 0, $i$183 = 0, $i$265 = 0, $i$342 = 0, $i$440 = 0, $i$538 = 0, $i$637 = 0, $j$076 = 0, $j$1$lcssa = 0, $j$143 = 0, $j$2 = 0, $k$056 = 0, $k$153 = 0, $k$249 = 0, $k$346 = 0, $pnt$080 = 0, $pnt$1$lcssa = 0, $pnt$169 = 0, $pnt1$091 = 0, $pnt1$185 = 0, $pnt2$090 = 0, $pnt2$184 = 0, $pnt2$279 = 0, $pnt2$3$lcssa = 0, $pnt2$368 = 0, $vararg_buffer = 0, $wk$057 = 0, $wk$154 = 0, $wk$250 = 0, $wk$347 = 0, $wk$444 = 0, $wk_max$0$lcssa = 0, $wk_max$075 = 0, $wk_max$1$lcssa = 0, $wk_max$160 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = ($xsize | 0) / 2 | 0; + $1 = ($ysize | 0) / 2 | 0; + $2 = HEAP32[$labelInfo >> 2] | 0; + $3 = $1 + -1 | 0; + if (($xsize | 0) > 1) { + $i$089 = 0; + $pnt1$091 = $2; + $pnt2$090 = $2 + ((Math_imul($3, $0) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$090 >> 1] = 0; + HEAP16[$pnt1$091 >> 1] = 0; + $i$089 = $i$089 + 1 | 0; + if (($i$089 | 0) >= ($0 | 0)) break; else { + $pnt1$091 = $pnt1$091 + 2 | 0; + $pnt2$090 = $pnt2$090 + 2 | 0; + } + } + } + $11 = $labelingThresh * 3 | 0; + $12 = $0 + -1 | 0; + if (($ysize | 0) > 1) { + $i$183 = 0; + $pnt1$185 = $2; + $pnt2$184 = $2 + ($12 << 1) | 0; + while (1) { + HEAP16[$pnt2$184 >> 1] = 0; + HEAP16[$pnt1$185 >> 1] = 0; + $i$183 = $i$183 + 1 | 0; + if (($i$183 | 0) >= ($1 | 0)) break; else { + $pnt1$185 = $pnt1$185 + ($0 << 1) | 0; + $pnt2$184 = $pnt2$184 + ($0 << 1) | 0; + } + } + } + $19 = $labelInfo + 1179664 | 0; + $20 = $0 + 1 | 0; + $21 = 0 - $0 | 0; + $$sum1 = 1 - $0 | 0; + $$sum2 = ~$0; + $$sum = ($xsize << 2) + 16 | 0; + L11 : do if (($3 | 0) > 1) { + $31 = ($12 | 0) > 1; + $dpnt$078 = (HEAP32[$labelInfo + 4 >> 2] | 0) + $20 | 0; + $j$076 = 1; + $pnt$080 = $image + (($xsize << 3) + 8) | 0; + $pnt2$279 = $2 + ($20 << 1) | 0; + $wk_max$075 = 0; + L13 : while (1) { + if ($31) { + $dpnt$167 = $dpnt$078; + $i$265 = 1; + $pnt$169 = $pnt$080; + $pnt2$368 = $pnt2$279; + $wk_max$160 = $wk_max$075; + while (1) { + do if (((HEAPU8[$pnt$169 + 1 >> 0] | 0) + (HEAPU8[$pnt$169 >> 0] | 0) + (HEAPU8[$pnt$169 + 2 >> 0] | 0) | 0) > ($11 | 0)) { + HEAP16[$pnt2$368 >> 1] = 0; + HEAP8[$dpnt$167 >> 0] = 0; + $wk_max$2 = $wk_max$160; + } else { + HEAP8[$dpnt$167 >> 0] = -1; + $44 = HEAP16[$pnt2$368 + ($21 << 1) >> 1] | 0; + if ($44 << 16 >> 16 > 0) { + HEAP16[$pnt2$368 >> 1] = $44; + $47 = ($44 << 16 >> 16) * 7 | 0; + $49 = $labelInfo + 1310736 + ($47 + -7 << 2) | 0; + HEAP32[$49 >> 2] = (HEAP32[$49 >> 2] | 0) + 1; + $53 = $labelInfo + 1310736 + ($47 + -6 << 2) | 0; + HEAP32[$53 >> 2] = (HEAP32[$53 >> 2] | 0) + $i$265; + $57 = $labelInfo + 1310736 + ($47 + -5 << 2) | 0; + HEAP32[$57 >> 2] = (HEAP32[$57 >> 2] | 0) + $j$076; + HEAP32[$labelInfo + 1310736 + ($47 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $63 = HEAP16[$pnt2$368 + ($$sum1 << 1) >> 1] | 0; + $64 = $63 << 16 >> 16; + $67 = HEAP16[$pnt2$368 + ($$sum2 << 1) >> 1] | 0; + $68 = $67 << 16 >> 16; + $69 = $67 << 16 >> 16 > 0; + if ($63 << 16 >> 16 <= 0) { + if ($69) { + HEAP16[$pnt2$368 >> 1] = $67; + $169 = $68 * 7 | 0; + $171 = $labelInfo + 1310736 + ($169 + -7 << 2) | 0; + HEAP32[$171 >> 2] = (HEAP32[$171 >> 2] | 0) + 1; + $175 = $labelInfo + 1310736 + ($169 + -6 << 2) | 0; + HEAP32[$175 >> 2] = (HEAP32[$175 >> 2] | 0) + $i$265; + $179 = $labelInfo + 1310736 + ($169 + -5 << 2) | 0; + HEAP32[$179 >> 2] = (HEAP32[$179 >> 2] | 0) + $j$076; + $183 = $labelInfo + 1310736 + ($169 + -3 << 2) | 0; + if ((HEAP32[$183 >> 2] | 0) < ($i$265 | 0)) HEAP32[$183 >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($169 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $189 = HEAP16[$pnt2$368 + -2 >> 1] | 0; + if ($189 << 16 >> 16 > 0) { + HEAP16[$pnt2$368 >> 1] = $189; + $192 = ($189 << 16 >> 16) * 7 | 0; + $194 = $labelInfo + 1310736 + ($192 + -7 << 2) | 0; + HEAP32[$194 >> 2] = (HEAP32[$194 >> 2] | 0) + 1; + $198 = $labelInfo + 1310736 + ($192 + -6 << 2) | 0; + HEAP32[$198 >> 2] = (HEAP32[$198 >> 2] | 0) + $i$265; + $202 = $labelInfo + 1310736 + ($192 + -5 << 2) | 0; + HEAP32[$202 >> 2] = (HEAP32[$202 >> 2] | 0) + $j$076; + $206 = $labelInfo + 1310736 + ($192 + -3 << 2) | 0; + if ((HEAP32[$206 >> 2] | 0) >= ($i$265 | 0)) { + $wk_max$2 = $wk_max$160; + break; + } + HEAP32[$206 >> 2] = $i$265; + $wk_max$2 = $wk_max$160; + break; + } else { + $209 = $wk_max$160 + 1 | 0; + if (($wk_max$160 | 0) > 32767) break L13; + HEAP16[$pnt2$368 >> 1] = $209; + HEAP32[$labelInfo + 1179664 + ($wk_max$160 << 2) >> 2] = $209 << 16 >> 16; + $214 = $wk_max$160 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($214 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($214 + 1 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($214 + 2 << 2) >> 2] = $j$076; + HEAP32[$labelInfo + 1310736 + ($214 + 3 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($214 + 4 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($214 + 5 << 2) >> 2] = $j$076; + HEAP32[$labelInfo + 1310736 + ($214 + 6 << 2) >> 2] = $j$076; + $wk_max$2 = $209; + break; + } + } + if ($69) { + $72 = HEAP32[$labelInfo + 1179664 + ($64 + -1 << 2) >> 2] | 0; + $75 = HEAP32[$labelInfo + 1179664 + ($68 + -1 << 2) >> 2] | 0; + if (($72 | 0) > ($75 | 0)) { + HEAP16[$pnt2$368 >> 1] = $75; + if (($wk_max$160 | 0) > 0) { + $k$056 = 0; + $wk$057 = $19; + while (1) { + if ((HEAP32[$wk$057 >> 2] | 0) == ($72 | 0)) HEAP32[$wk$057 >> 2] = $75; + $k$056 = $k$056 + 1 | 0; + if (($k$056 | 0) >= ($wk_max$160 | 0)) { + $92 = $75; + break; + } else $wk$057 = $wk$057 + 4 | 0; + } + } else $92 = $75; + } else { + HEAP16[$pnt2$368 >> 1] = $72; + if (($72 | 0) < ($75 | 0) & ($wk_max$160 | 0) > 0) { + $k$153 = 0; + $wk$154 = $19; + while (1) { + if ((HEAP32[$wk$154 >> 2] | 0) == ($75 | 0)) HEAP32[$wk$154 >> 2] = $72; + $k$153 = $k$153 + 1 | 0; + if (($k$153 | 0) >= ($wk_max$160 | 0)) { + $92 = $72; + break; + } else $wk$154 = $wk$154 + 4 | 0; + } + } else $92 = $72; + } + $94 = ($92 << 16 >> 16) * 7 | 0; + $96 = $labelInfo + 1310736 + ($94 + -7 << 2) | 0; + HEAP32[$96 >> 2] = (HEAP32[$96 >> 2] | 0) + 1; + $100 = $labelInfo + 1310736 + ($94 + -6 << 2) | 0; + HEAP32[$100 >> 2] = (HEAP32[$100 >> 2] | 0) + $i$265; + $104 = $labelInfo + 1310736 + ($94 + -5 << 2) | 0; + HEAP32[$104 >> 2] = (HEAP32[$104 >> 2] | 0) + $j$076; + HEAP32[$labelInfo + 1310736 + ($94 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $110 = HEAP16[$pnt2$368 + -2 >> 1] | 0; + if ($110 << 16 >> 16 <= 0) { + HEAP16[$pnt2$368 >> 1] = $63; + $150 = $64 * 7 | 0; + $152 = $labelInfo + 1310736 + ($150 + -7 << 2) | 0; + HEAP32[$152 >> 2] = (HEAP32[$152 >> 2] | 0) + 1; + $156 = $labelInfo + 1310736 + ($150 + -6 << 2) | 0; + HEAP32[$156 >> 2] = (HEAP32[$156 >> 2] | 0) + $i$265; + $160 = $labelInfo + 1310736 + ($150 + -5 << 2) | 0; + HEAP32[$160 >> 2] = (HEAP32[$160 >> 2] | 0) + $j$076; + $164 = $labelInfo + 1310736 + ($150 + -4 << 2) | 0; + if ((HEAP32[$164 >> 2] | 0) > ($i$265 | 0)) HEAP32[$164 >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($150 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $115 = HEAP32[$labelInfo + 1179664 + ($64 + -1 << 2) >> 2] | 0; + $118 = HEAP32[$labelInfo + 1179664 + (($110 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($115 | 0) > ($118 | 0)) { + HEAP16[$pnt2$368 >> 1] = $118; + if (($wk_max$160 | 0) > 0) { + $k$249 = 0; + $wk$250 = $19; + while (1) { + if ((HEAP32[$wk$250 >> 2] | 0) == ($115 | 0)) HEAP32[$wk$250 >> 2] = $118; + $k$249 = $k$249 + 1 | 0; + if (($k$249 | 0) >= ($wk_max$160 | 0)) { + $135 = $118; + break; + } else $wk$250 = $wk$250 + 4 | 0; + } + } else $135 = $118; + } else { + HEAP16[$pnt2$368 >> 1] = $115; + if (($115 | 0) < ($118 | 0) & ($wk_max$160 | 0) > 0) { + $k$346 = 0; + $wk$347 = $19; + while (1) { + if ((HEAP32[$wk$347 >> 2] | 0) == ($118 | 0)) HEAP32[$wk$347 >> 2] = $115; + $k$346 = $k$346 + 1 | 0; + if (($k$346 | 0) >= ($wk_max$160 | 0)) { + $135 = $115; + break; + } else $wk$347 = $wk$347 + 4 | 0; + } + } else $135 = $115; + } + $137 = ($135 << 16 >> 16) * 7 | 0; + $139 = $labelInfo + 1310736 + ($137 + -7 << 2) | 0; + HEAP32[$139 >> 2] = (HEAP32[$139 >> 2] | 0) + 1; + $143 = $labelInfo + 1310736 + ($137 + -6 << 2) | 0; + HEAP32[$143 >> 2] = (HEAP32[$143 >> 2] | 0) + $i$265; + $147 = $labelInfo + 1310736 + ($137 + -5 << 2) | 0; + HEAP32[$147 >> 2] = (HEAP32[$147 >> 2] | 0) + $j$076; + $wk_max$2 = $wk_max$160; + } while (0); + $i$265 = $i$265 + 1 | 0; + $229 = $pnt$169 + 8 | 0; + $230 = $pnt2$368 + 2 | 0; + $231 = $dpnt$167 + 1 | 0; + if (($i$265 | 0) >= ($12 | 0)) { + $dpnt$1$lcssa = $231; + $pnt$1$lcssa = $229; + $pnt2$3$lcssa = $230; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $dpnt$167 = $231; + $pnt$169 = $229; + $pnt2$368 = $230; + $wk_max$160 = $wk_max$2; + } + } + } else { + $dpnt$1$lcssa = $dpnt$078; + $pnt$1$lcssa = $pnt$080; + $pnt2$3$lcssa = $pnt2$279; + $wk_max$1$lcssa = $wk_max$075; + } + $j$076 = $j$076 + 1 | 0; + if (($j$076 | 0) >= ($3 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $dpnt$078 = $dpnt$1$lcssa + 2 | 0; + $pnt$080 = $pnt$1$lcssa + $$sum | 0; + $pnt2$279 = $pnt2$3$lcssa + 4 | 0; + $wk_max$075 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $238 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$342 = 1; + $j$143 = 1; + $wk$444 = $19; + while (1) { + $240 = HEAP32[$wk$444 >> 2] | 0; + if (($240 | 0) == ($i$342 | 0)) { + $246 = $j$143; + $j$2 = $j$143 + 1 | 0; + } else { + $246 = HEAP32[$labelInfo + 1179664 + ($240 + -1 << 2) >> 2] | 0; + $j$2 = $j$143; + } + HEAP32[$wk$444 >> 2] = $246; + if (($i$342 | 0) < ($wk_max$0$lcssa | 0)) { + $i$342 = $i$342 + 1 | 0; + $j$143 = $j$2; + $wk$444 = $wk$444 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $250 = $labelInfo + 8 | 0; + $251 = $j$1$lcssa + -1 | 0; + HEAP32[$250 >> 2] = $251; + if (!$251) $$0 = 0; else { + _memset($238 | 0, 0, $251 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $251 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$440 = 0; + do { + $258 = $i$440 << 2; + HEAP32[$labelInfo + 131084 + ($258 << 2) >> 2] = $0; + HEAP32[$labelInfo + 131084 + (($258 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($258 | 2) << 2) >> 2] = $1; + HEAP32[$labelInfo + 131084 + (($258 | 3) << 2) >> 2] = 0; + $i$440 = $i$440 + 1 | 0; + } while (($i$440 | 0) < (HEAP32[$250 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$538 = 0; + do { + $272 = (HEAP32[$labelInfo + 1179664 + ($i$538 << 2) >> 2] | 0) + -1 | 0; + $273 = $i$538 * 7 | 0; + $276 = $labelInfo + 12 + ($272 << 2) | 0; + HEAP32[$276 >> 2] = (HEAP32[$276 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($273 << 2) >> 2] | 0); + $283 = $272 << 1; + $284 = $labelInfo + 655376 + ($283 << 3) | 0; + HEAPF64[$284 >> 3] = +HEAPF64[$284 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($273 + 1 << 2) >> 2] | 0); + $292 = $labelInfo + 655376 + (($283 | 1) << 3) | 0; + HEAPF64[$292 >> 3] = +HEAPF64[$292 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($273 + 2 << 2) >> 2] | 0); + $295 = $272 << 2; + $296 = $labelInfo + 131084 + ($295 << 2) | 0; + $300 = HEAP32[$labelInfo + 1310736 + ($273 + 3 << 2) >> 2] | 0; + if ((HEAP32[$296 >> 2] | 0) > ($300 | 0)) HEAP32[$296 >> 2] = $300; + $303 = $labelInfo + 131084 + (($295 | 1) << 2) | 0; + $307 = HEAP32[$labelInfo + 1310736 + ($273 + 4 << 2) >> 2] | 0; + if ((HEAP32[$303 >> 2] | 0) < ($307 | 0)) HEAP32[$303 >> 2] = $307; + $310 = $labelInfo + 131084 + (($295 | 2) << 2) | 0; + $314 = HEAP32[$labelInfo + 1310736 + ($273 + 5 << 2) >> 2] | 0; + if ((HEAP32[$310 >> 2] | 0) > ($314 | 0)) HEAP32[$310 >> 2] = $314; + $317 = $labelInfo + 131084 + (($295 | 3) << 2) | 0; + $321 = HEAP32[$labelInfo + 1310736 + ($273 + 6 << 2) >> 2] | 0; + if ((HEAP32[$317 >> 2] | 0) < ($321 | 0)) HEAP32[$317 >> 2] = $321; + $i$538 = $i$538 + 1 | 0; + } while (($i$538 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$250 >> 2] | 0) > 0) { + $i$637 = 0; + do { + $325 = $labelInfo + 12 + ($i$637 << 2) | 0; + $328 = $i$637 << 1; + $329 = $labelInfo + 655376 + ($328 << 3) | 0; + HEAPF64[$329 >> 3] = +HEAPF64[$329 >> 3] / +(HEAP32[$325 >> 2] | 0); + $335 = $labelInfo + 655376 + (($328 | 1) << 3) | 0; + HEAPF64[$335 >> 3] = +HEAPF64[$335 >> 3] / +(HEAP32[$325 >> 2] | 0); + $i$637 = $i$637 + 1 | 0; + } while (($i$637 | 0) < (HEAP32[$250 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubEWR3CA5551($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $0 = 0, $1 = 0, $10 = 0, $102 = 0, $106 = 0, $112 = 0, $117 = 0, $120 = 0, $137 = 0, $139 = 0, $141 = 0, $145 = 0, $149 = 0, $152 = 0, $154 = 0, $158 = 0, $162 = 0, $166 = 0, $17 = 0, $171 = 0, $173 = 0, $177 = 0, $18 = 0, $181 = 0, $185 = 0, $19 = 0, $191 = 0, $194 = 0, $196 = 0, $200 = 0, $204 = 0, $208 = 0, $211 = 0, $216 = 0, $231 = 0, $232 = 0, $233 = 0, $240 = 0, $242 = 0, $248 = 0, $252 = 0, $253 = 0, $260 = 0, $27 = 0, $274 = 0, $275 = 0, $278 = 0, $285 = 0, $286 = 0, $29 = 0, $294 = 0, $297 = 0, $298 = 0, $302 = 0, $305 = 0, $309 = 0, $312 = 0, $316 = 0, $319 = 0, $323 = 0, $327 = 0, $330 = 0, $331 = 0, $337 = 0, $35 = 0, $46 = 0, $49 = 0, $51 = 0, $55 = 0, $59 = 0, $65 = 0, $66 = 0, $69 = 0, $70 = 0, $71 = 0, $74 = 0, $77 = 0, $9 = 0, $94 = 0, $96 = 0, $98 = 0, $dpnt$077 = 0, $dpnt$1$lcssa = 0, $dpnt$166 = 0, $i$088 = 0, $i$182 = 0, $i$264 = 0, $i$341 = 0, $i$439 = 0, $i$537 = 0, $i$636 = 0, $j$075 = 0, $j$1$lcssa = 0, $j$142 = 0, $j$2 = 0, $k$055 = 0, $k$152 = 0, $k$248 = 0, $k$345 = 0, $pnt$079 = 0, $pnt$1$lcssa = 0, $pnt$168 = 0, $pnt1$090 = 0, $pnt1$184 = 0, $pnt2$089 = 0, $pnt2$183 = 0, $pnt2$278 = 0, $pnt2$3$lcssa = 0, $pnt2$367 = 0, $vararg_buffer = 0, $wk$056 = 0, $wk$153 = 0, $wk$249 = 0, $wk$346 = 0, $wk$443 = 0, $wk_max$0$lcssa = 0, $wk_max$074 = 0, $wk_max$1$lcssa = 0, $wk_max$159 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = HEAP32[$labelInfo >> 2] | 0; + $1 = $ysize + -1 | 0; + if (($xsize | 0) > 0) { + $i$088 = 0; + $pnt1$090 = $0; + $pnt2$089 = $0 + ((Math_imul($1, $xsize) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$089 >> 1] = 0; + HEAP16[$pnt1$090 >> 1] = 0; + $i$088 = $i$088 + 1 | 0; + if (($i$088 | 0) >= ($xsize | 0)) break; else { + $pnt1$090 = $pnt1$090 + 2 | 0; + $pnt2$089 = $pnt2$089 + 2 | 0; + } + } + } + $9 = $labelingThresh * 3 | 0; + $10 = $xsize + -1 | 0; + if (($ysize | 0) > 0) { + $i$182 = 0; + $pnt1$184 = $0; + $pnt2$183 = $0 + ($10 << 1) | 0; + while (1) { + HEAP16[$pnt2$183 >> 1] = 0; + HEAP16[$pnt1$184 >> 1] = 0; + $i$182 = $i$182 + 1 | 0; + if (($i$182 | 0) >= ($ysize | 0)) break; else { + $pnt1$184 = $pnt1$184 + ($xsize << 1) | 0; + $pnt2$183 = $pnt2$183 + ($xsize << 1) | 0; + } + } + } + $17 = $labelInfo + 1179664 | 0; + $18 = $xsize + 1 | 0; + $19 = 0 - $xsize | 0; + $$sum = 1 - $xsize | 0; + $$sum1 = ~$xsize; + L11 : do if (($1 | 0) > 1) { + $27 = ($10 | 0) > 1; + $dpnt$077 = (HEAP32[$labelInfo + 4 >> 2] | 0) + $18 | 0; + $j$075 = 1; + $pnt$079 = $image + ($18 << 1) | 0; + $pnt2$278 = $0 + ($18 << 1) | 0; + $wk_max$074 = 0; + L13 : while (1) { + if ($27) { + $dpnt$166 = $dpnt$077; + $i$264 = 1; + $pnt$168 = $pnt$079; + $pnt2$367 = $pnt2$278; + $wk_max$159 = $wk_max$074; + while (1) { + $29 = HEAPU8[$pnt$168 >> 0] | 0; + $35 = HEAPU8[$pnt$168 + 1 >> 0] | 0; + do if ((($29 & 248) + 12 + ($29 << 5 & 224) + ($35 >>> 3 & 24) + ($35 << 2 & 248) | 0) > ($9 | 0)) { + HEAP8[$dpnt$166 >> 0] = -1; + $46 = HEAP16[$pnt2$367 + ($19 << 1) >> 1] | 0; + if ($46 << 16 >> 16 > 0) { + HEAP16[$pnt2$367 >> 1] = $46; + $49 = ($46 << 16 >> 16) * 7 | 0; + $51 = $labelInfo + 1310736 + ($49 + -7 << 2) | 0; + HEAP32[$51 >> 2] = (HEAP32[$51 >> 2] | 0) + 1; + $55 = $labelInfo + 1310736 + ($49 + -6 << 2) | 0; + HEAP32[$55 >> 2] = (HEAP32[$55 >> 2] | 0) + $i$264; + $59 = $labelInfo + 1310736 + ($49 + -5 << 2) | 0; + HEAP32[$59 >> 2] = (HEAP32[$59 >> 2] | 0) + $j$075; + HEAP32[$labelInfo + 1310736 + ($49 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $65 = HEAP16[$pnt2$367 + ($$sum << 1) >> 1] | 0; + $66 = $65 << 16 >> 16; + $69 = HEAP16[$pnt2$367 + ($$sum1 << 1) >> 1] | 0; + $70 = $69 << 16 >> 16; + $71 = $69 << 16 >> 16 > 0; + if ($65 << 16 >> 16 <= 0) { + if ($71) { + HEAP16[$pnt2$367 >> 1] = $69; + $171 = $70 * 7 | 0; + $173 = $labelInfo + 1310736 + ($171 + -7 << 2) | 0; + HEAP32[$173 >> 2] = (HEAP32[$173 >> 2] | 0) + 1; + $177 = $labelInfo + 1310736 + ($171 + -6 << 2) | 0; + HEAP32[$177 >> 2] = (HEAP32[$177 >> 2] | 0) + $i$264; + $181 = $labelInfo + 1310736 + ($171 + -5 << 2) | 0; + HEAP32[$181 >> 2] = (HEAP32[$181 >> 2] | 0) + $j$075; + $185 = $labelInfo + 1310736 + ($171 + -3 << 2) | 0; + if ((HEAP32[$185 >> 2] | 0) < ($i$264 | 0)) HEAP32[$185 >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($171 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $191 = HEAP16[$pnt2$367 + -2 >> 1] | 0; + if ($191 << 16 >> 16 > 0) { + HEAP16[$pnt2$367 >> 1] = $191; + $194 = ($191 << 16 >> 16) * 7 | 0; + $196 = $labelInfo + 1310736 + ($194 + -7 << 2) | 0; + HEAP32[$196 >> 2] = (HEAP32[$196 >> 2] | 0) + 1; + $200 = $labelInfo + 1310736 + ($194 + -6 << 2) | 0; + HEAP32[$200 >> 2] = (HEAP32[$200 >> 2] | 0) + $i$264; + $204 = $labelInfo + 1310736 + ($194 + -5 << 2) | 0; + HEAP32[$204 >> 2] = (HEAP32[$204 >> 2] | 0) + $j$075; + $208 = $labelInfo + 1310736 + ($194 + -3 << 2) | 0; + if ((HEAP32[$208 >> 2] | 0) >= ($i$264 | 0)) { + $wk_max$2 = $wk_max$159; + break; + } + HEAP32[$208 >> 2] = $i$264; + $wk_max$2 = $wk_max$159; + break; + } else { + $211 = $wk_max$159 + 1 | 0; + if (($wk_max$159 | 0) > 32767) break L13; + HEAP16[$pnt2$367 >> 1] = $211; + HEAP32[$labelInfo + 1179664 + ($wk_max$159 << 2) >> 2] = $211 << 16 >> 16; + $216 = $wk_max$159 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($216 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($216 + 1 << 2) >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($216 + 2 << 2) >> 2] = $j$075; + HEAP32[$labelInfo + 1310736 + ($216 + 3 << 2) >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($216 + 4 << 2) >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($216 + 5 << 2) >> 2] = $j$075; + HEAP32[$labelInfo + 1310736 + ($216 + 6 << 2) >> 2] = $j$075; + $wk_max$2 = $211; + break; + } + } + if ($71) { + $74 = HEAP32[$labelInfo + 1179664 + ($66 + -1 << 2) >> 2] | 0; + $77 = HEAP32[$labelInfo + 1179664 + ($70 + -1 << 2) >> 2] | 0; + if (($74 | 0) > ($77 | 0)) { + HEAP16[$pnt2$367 >> 1] = $77; + if (($wk_max$159 | 0) > 0) { + $k$055 = 0; + $wk$056 = $17; + while (1) { + if ((HEAP32[$wk$056 >> 2] | 0) == ($74 | 0)) HEAP32[$wk$056 >> 2] = $77; + $k$055 = $k$055 + 1 | 0; + if (($k$055 | 0) >= ($wk_max$159 | 0)) { + $94 = $77; + break; + } else $wk$056 = $wk$056 + 4 | 0; + } + } else $94 = $77; + } else { + HEAP16[$pnt2$367 >> 1] = $74; + if (($74 | 0) < ($77 | 0) & ($wk_max$159 | 0) > 0) { + $k$152 = 0; + $wk$153 = $17; + while (1) { + if ((HEAP32[$wk$153 >> 2] | 0) == ($77 | 0)) HEAP32[$wk$153 >> 2] = $74; + $k$152 = $k$152 + 1 | 0; + if (($k$152 | 0) >= ($wk_max$159 | 0)) { + $94 = $74; + break; + } else $wk$153 = $wk$153 + 4 | 0; + } + } else $94 = $74; + } + $96 = ($94 << 16 >> 16) * 7 | 0; + $98 = $labelInfo + 1310736 + ($96 + -7 << 2) | 0; + HEAP32[$98 >> 2] = (HEAP32[$98 >> 2] | 0) + 1; + $102 = $labelInfo + 1310736 + ($96 + -6 << 2) | 0; + HEAP32[$102 >> 2] = (HEAP32[$102 >> 2] | 0) + $i$264; + $106 = $labelInfo + 1310736 + ($96 + -5 << 2) | 0; + HEAP32[$106 >> 2] = (HEAP32[$106 >> 2] | 0) + $j$075; + HEAP32[$labelInfo + 1310736 + ($96 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $112 = HEAP16[$pnt2$367 + -2 >> 1] | 0; + if ($112 << 16 >> 16 <= 0) { + HEAP16[$pnt2$367 >> 1] = $65; + $152 = $66 * 7 | 0; + $154 = $labelInfo + 1310736 + ($152 + -7 << 2) | 0; + HEAP32[$154 >> 2] = (HEAP32[$154 >> 2] | 0) + 1; + $158 = $labelInfo + 1310736 + ($152 + -6 << 2) | 0; + HEAP32[$158 >> 2] = (HEAP32[$158 >> 2] | 0) + $i$264; + $162 = $labelInfo + 1310736 + ($152 + -5 << 2) | 0; + HEAP32[$162 >> 2] = (HEAP32[$162 >> 2] | 0) + $j$075; + $166 = $labelInfo + 1310736 + ($152 + -4 << 2) | 0; + if ((HEAP32[$166 >> 2] | 0) > ($i$264 | 0)) HEAP32[$166 >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($152 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $117 = HEAP32[$labelInfo + 1179664 + ($66 + -1 << 2) >> 2] | 0; + $120 = HEAP32[$labelInfo + 1179664 + (($112 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($117 | 0) > ($120 | 0)) { + HEAP16[$pnt2$367 >> 1] = $120; + if (($wk_max$159 | 0) > 0) { + $k$248 = 0; + $wk$249 = $17; + while (1) { + if ((HEAP32[$wk$249 >> 2] | 0) == ($117 | 0)) HEAP32[$wk$249 >> 2] = $120; + $k$248 = $k$248 + 1 | 0; + if (($k$248 | 0) >= ($wk_max$159 | 0)) { + $137 = $120; + break; + } else $wk$249 = $wk$249 + 4 | 0; + } + } else $137 = $120; + } else { + HEAP16[$pnt2$367 >> 1] = $117; + if (($117 | 0) < ($120 | 0) & ($wk_max$159 | 0) > 0) { + $k$345 = 0; + $wk$346 = $17; + while (1) { + if ((HEAP32[$wk$346 >> 2] | 0) == ($120 | 0)) HEAP32[$wk$346 >> 2] = $117; + $k$345 = $k$345 + 1 | 0; + if (($k$345 | 0) >= ($wk_max$159 | 0)) { + $137 = $117; + break; + } else $wk$346 = $wk$346 + 4 | 0; + } + } else $137 = $117; + } + $139 = ($137 << 16 >> 16) * 7 | 0; + $141 = $labelInfo + 1310736 + ($139 + -7 << 2) | 0; + HEAP32[$141 >> 2] = (HEAP32[$141 >> 2] | 0) + 1; + $145 = $labelInfo + 1310736 + ($139 + -6 << 2) | 0; + HEAP32[$145 >> 2] = (HEAP32[$145 >> 2] | 0) + $i$264; + $149 = $labelInfo + 1310736 + ($139 + -5 << 2) | 0; + HEAP32[$149 >> 2] = (HEAP32[$149 >> 2] | 0) + $j$075; + $wk_max$2 = $wk_max$159; + } else { + HEAP16[$pnt2$367 >> 1] = 0; + HEAP8[$dpnt$166 >> 0] = 0; + $wk_max$2 = $wk_max$159; + } while (0); + $i$264 = $i$264 + 1 | 0; + $231 = $pnt$168 + 2 | 0; + $232 = $pnt2$367 + 2 | 0; + $233 = $dpnt$166 + 1 | 0; + if (($i$264 | 0) >= ($10 | 0)) { + $dpnt$1$lcssa = $233; + $pnt$1$lcssa = $231; + $pnt2$3$lcssa = $232; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $dpnt$166 = $233; + $pnt$168 = $231; + $pnt2$367 = $232; + $wk_max$159 = $wk_max$2; + } + } + } else { + $dpnt$1$lcssa = $dpnt$077; + $pnt$1$lcssa = $pnt$079; + $pnt2$3$lcssa = $pnt2$278; + $wk_max$1$lcssa = $wk_max$074; + } + $j$075 = $j$075 + 1 | 0; + if (($j$075 | 0) >= ($1 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $dpnt$077 = $dpnt$1$lcssa + 2 | 0; + $pnt$079 = $pnt$1$lcssa + 4 | 0; + $pnt2$278 = $pnt2$3$lcssa + 4 | 0; + $wk_max$074 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $240 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$341 = 1; + $j$142 = 1; + $wk$443 = $17; + while (1) { + $242 = HEAP32[$wk$443 >> 2] | 0; + if (($242 | 0) == ($i$341 | 0)) { + $248 = $j$142; + $j$2 = $j$142 + 1 | 0; + } else { + $248 = HEAP32[$labelInfo + 1179664 + ($242 + -1 << 2) >> 2] | 0; + $j$2 = $j$142; + } + HEAP32[$wk$443 >> 2] = $248; + if (($i$341 | 0) < ($wk_max$0$lcssa | 0)) { + $i$341 = $i$341 + 1 | 0; + $j$142 = $j$2; + $wk$443 = $wk$443 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $252 = $labelInfo + 8 | 0; + $253 = $j$1$lcssa + -1 | 0; + HEAP32[$252 >> 2] = $253; + if (!$253) $$0 = 0; else { + _memset($240 | 0, 0, $253 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $253 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$439 = 0; + do { + $260 = $i$439 << 2; + HEAP32[$labelInfo + 131084 + ($260 << 2) >> 2] = $xsize; + HEAP32[$labelInfo + 131084 + (($260 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($260 | 2) << 2) >> 2] = $ysize; + HEAP32[$labelInfo + 131084 + (($260 | 3) << 2) >> 2] = 0; + $i$439 = $i$439 + 1 | 0; + } while (($i$439 | 0) < (HEAP32[$252 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$537 = 0; + do { + $274 = (HEAP32[$labelInfo + 1179664 + ($i$537 << 2) >> 2] | 0) + -1 | 0; + $275 = $i$537 * 7 | 0; + $278 = $labelInfo + 12 + ($274 << 2) | 0; + HEAP32[$278 >> 2] = (HEAP32[$278 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($275 << 2) >> 2] | 0); + $285 = $274 << 1; + $286 = $labelInfo + 655376 + ($285 << 3) | 0; + HEAPF64[$286 >> 3] = +HEAPF64[$286 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($275 + 1 << 2) >> 2] | 0); + $294 = $labelInfo + 655376 + (($285 | 1) << 3) | 0; + HEAPF64[$294 >> 3] = +HEAPF64[$294 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($275 + 2 << 2) >> 2] | 0); + $297 = $274 << 2; + $298 = $labelInfo + 131084 + ($297 << 2) | 0; + $302 = HEAP32[$labelInfo + 1310736 + ($275 + 3 << 2) >> 2] | 0; + if ((HEAP32[$298 >> 2] | 0) > ($302 | 0)) HEAP32[$298 >> 2] = $302; + $305 = $labelInfo + 131084 + (($297 | 1) << 2) | 0; + $309 = HEAP32[$labelInfo + 1310736 + ($275 + 4 << 2) >> 2] | 0; + if ((HEAP32[$305 >> 2] | 0) < ($309 | 0)) HEAP32[$305 >> 2] = $309; + $312 = $labelInfo + 131084 + (($297 | 2) << 2) | 0; + $316 = HEAP32[$labelInfo + 1310736 + ($275 + 5 << 2) >> 2] | 0; + if ((HEAP32[$312 >> 2] | 0) > ($316 | 0)) HEAP32[$312 >> 2] = $316; + $319 = $labelInfo + 131084 + (($297 | 3) << 2) | 0; + $323 = HEAP32[$labelInfo + 1310736 + ($275 + 6 << 2) >> 2] | 0; + if ((HEAP32[$319 >> 2] | 0) < ($323 | 0)) HEAP32[$319 >> 2] = $323; + $i$537 = $i$537 + 1 | 0; + } while (($i$537 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$252 >> 2] | 0) > 0) { + $i$636 = 0; + do { + $327 = $labelInfo + 12 + ($i$636 << 2) | 0; + $330 = $i$636 << 1; + $331 = $labelInfo + 655376 + ($330 << 3) | 0; + HEAPF64[$331 >> 3] = +HEAPF64[$331 >> 3] / +(HEAP32[$327 >> 2] | 0); + $337 = $labelInfo + 655376 + (($330 | 1) << 3) | 0; + HEAPF64[$337 >> 3] = +HEAPF64[$337 >> 3] / +(HEAP32[$327 >> 2] | 0); + $i$636 = $i$636 + 1 | 0; + } while (($i$636 | 0) < (HEAP32[$252 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubEBR3CA5551($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $0 = 0, $1 = 0, $10 = 0, $102 = 0, $106 = 0, $112 = 0, $117 = 0, $120 = 0, $137 = 0, $139 = 0, $141 = 0, $145 = 0, $149 = 0, $152 = 0, $154 = 0, $158 = 0, $162 = 0, $166 = 0, $17 = 0, $171 = 0, $173 = 0, $177 = 0, $18 = 0, $181 = 0, $185 = 0, $19 = 0, $191 = 0, $194 = 0, $196 = 0, $200 = 0, $204 = 0, $208 = 0, $211 = 0, $216 = 0, $231 = 0, $232 = 0, $233 = 0, $240 = 0, $242 = 0, $248 = 0, $252 = 0, $253 = 0, $260 = 0, $27 = 0, $274 = 0, $275 = 0, $278 = 0, $285 = 0, $286 = 0, $29 = 0, $294 = 0, $297 = 0, $298 = 0, $302 = 0, $305 = 0, $309 = 0, $312 = 0, $316 = 0, $319 = 0, $323 = 0, $327 = 0, $330 = 0, $331 = 0, $337 = 0, $35 = 0, $46 = 0, $49 = 0, $51 = 0, $55 = 0, $59 = 0, $65 = 0, $66 = 0, $69 = 0, $70 = 0, $71 = 0, $74 = 0, $77 = 0, $9 = 0, $94 = 0, $96 = 0, $98 = 0, $dpnt$077 = 0, $dpnt$1$lcssa = 0, $dpnt$166 = 0, $i$088 = 0, $i$182 = 0, $i$264 = 0, $i$341 = 0, $i$439 = 0, $i$537 = 0, $i$636 = 0, $j$075 = 0, $j$1$lcssa = 0, $j$142 = 0, $j$2 = 0, $k$055 = 0, $k$152 = 0, $k$248 = 0, $k$345 = 0, $pnt$079 = 0, $pnt$1$lcssa = 0, $pnt$168 = 0, $pnt1$090 = 0, $pnt1$184 = 0, $pnt2$089 = 0, $pnt2$183 = 0, $pnt2$278 = 0, $pnt2$3$lcssa = 0, $pnt2$367 = 0, $vararg_buffer = 0, $wk$056 = 0, $wk$153 = 0, $wk$249 = 0, $wk$346 = 0, $wk$443 = 0, $wk_max$0$lcssa = 0, $wk_max$074 = 0, $wk_max$1$lcssa = 0, $wk_max$159 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = HEAP32[$labelInfo >> 2] | 0; + $1 = $ysize + -1 | 0; + if (($xsize | 0) > 0) { + $i$088 = 0; + $pnt1$090 = $0; + $pnt2$089 = $0 + ((Math_imul($1, $xsize) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$089 >> 1] = 0; + HEAP16[$pnt1$090 >> 1] = 0; + $i$088 = $i$088 + 1 | 0; + if (($i$088 | 0) >= ($xsize | 0)) break; else { + $pnt1$090 = $pnt1$090 + 2 | 0; + $pnt2$089 = $pnt2$089 + 2 | 0; + } + } + } + $9 = $labelingThresh * 3 | 0; + $10 = $xsize + -1 | 0; + if (($ysize | 0) > 0) { + $i$182 = 0; + $pnt1$184 = $0; + $pnt2$183 = $0 + ($10 << 1) | 0; + while (1) { + HEAP16[$pnt2$183 >> 1] = 0; + HEAP16[$pnt1$184 >> 1] = 0; + $i$182 = $i$182 + 1 | 0; + if (($i$182 | 0) >= ($ysize | 0)) break; else { + $pnt1$184 = $pnt1$184 + ($xsize << 1) | 0; + $pnt2$183 = $pnt2$183 + ($xsize << 1) | 0; + } + } + } + $17 = $labelInfo + 1179664 | 0; + $18 = $xsize + 1 | 0; + $19 = 0 - $xsize | 0; + $$sum = 1 - $xsize | 0; + $$sum1 = ~$xsize; + L11 : do if (($1 | 0) > 1) { + $27 = ($10 | 0) > 1; + $dpnt$077 = (HEAP32[$labelInfo + 4 >> 2] | 0) + $18 | 0; + $j$075 = 1; + $pnt$079 = $image + ($18 << 1) | 0; + $pnt2$278 = $0 + ($18 << 1) | 0; + $wk_max$074 = 0; + L13 : while (1) { + if ($27) { + $dpnt$166 = $dpnt$077; + $i$264 = 1; + $pnt$168 = $pnt$079; + $pnt2$367 = $pnt2$278; + $wk_max$159 = $wk_max$074; + while (1) { + $29 = HEAPU8[$pnt$168 >> 0] | 0; + $35 = HEAPU8[$pnt$168 + 1 >> 0] | 0; + do if ((($29 & 248) + 12 + ($29 << 5 & 224) + ($35 >>> 3 & 24) + ($35 << 2 & 248) | 0) > ($9 | 0)) { + HEAP16[$pnt2$367 >> 1] = 0; + HEAP8[$dpnt$166 >> 0] = 0; + $wk_max$2 = $wk_max$159; + } else { + HEAP8[$dpnt$166 >> 0] = -1; + $46 = HEAP16[$pnt2$367 + ($19 << 1) >> 1] | 0; + if ($46 << 16 >> 16 > 0) { + HEAP16[$pnt2$367 >> 1] = $46; + $49 = ($46 << 16 >> 16) * 7 | 0; + $51 = $labelInfo + 1310736 + ($49 + -7 << 2) | 0; + HEAP32[$51 >> 2] = (HEAP32[$51 >> 2] | 0) + 1; + $55 = $labelInfo + 1310736 + ($49 + -6 << 2) | 0; + HEAP32[$55 >> 2] = (HEAP32[$55 >> 2] | 0) + $i$264; + $59 = $labelInfo + 1310736 + ($49 + -5 << 2) | 0; + HEAP32[$59 >> 2] = (HEAP32[$59 >> 2] | 0) + $j$075; + HEAP32[$labelInfo + 1310736 + ($49 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $65 = HEAP16[$pnt2$367 + ($$sum << 1) >> 1] | 0; + $66 = $65 << 16 >> 16; + $69 = HEAP16[$pnt2$367 + ($$sum1 << 1) >> 1] | 0; + $70 = $69 << 16 >> 16; + $71 = $69 << 16 >> 16 > 0; + if ($65 << 16 >> 16 <= 0) { + if ($71) { + HEAP16[$pnt2$367 >> 1] = $69; + $171 = $70 * 7 | 0; + $173 = $labelInfo + 1310736 + ($171 + -7 << 2) | 0; + HEAP32[$173 >> 2] = (HEAP32[$173 >> 2] | 0) + 1; + $177 = $labelInfo + 1310736 + ($171 + -6 << 2) | 0; + HEAP32[$177 >> 2] = (HEAP32[$177 >> 2] | 0) + $i$264; + $181 = $labelInfo + 1310736 + ($171 + -5 << 2) | 0; + HEAP32[$181 >> 2] = (HEAP32[$181 >> 2] | 0) + $j$075; + $185 = $labelInfo + 1310736 + ($171 + -3 << 2) | 0; + if ((HEAP32[$185 >> 2] | 0) < ($i$264 | 0)) HEAP32[$185 >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($171 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $191 = HEAP16[$pnt2$367 + -2 >> 1] | 0; + if ($191 << 16 >> 16 > 0) { + HEAP16[$pnt2$367 >> 1] = $191; + $194 = ($191 << 16 >> 16) * 7 | 0; + $196 = $labelInfo + 1310736 + ($194 + -7 << 2) | 0; + HEAP32[$196 >> 2] = (HEAP32[$196 >> 2] | 0) + 1; + $200 = $labelInfo + 1310736 + ($194 + -6 << 2) | 0; + HEAP32[$200 >> 2] = (HEAP32[$200 >> 2] | 0) + $i$264; + $204 = $labelInfo + 1310736 + ($194 + -5 << 2) | 0; + HEAP32[$204 >> 2] = (HEAP32[$204 >> 2] | 0) + $j$075; + $208 = $labelInfo + 1310736 + ($194 + -3 << 2) | 0; + if ((HEAP32[$208 >> 2] | 0) >= ($i$264 | 0)) { + $wk_max$2 = $wk_max$159; + break; + } + HEAP32[$208 >> 2] = $i$264; + $wk_max$2 = $wk_max$159; + break; + } else { + $211 = $wk_max$159 + 1 | 0; + if (($wk_max$159 | 0) > 32767) break L13; + HEAP16[$pnt2$367 >> 1] = $211; + HEAP32[$labelInfo + 1179664 + ($wk_max$159 << 2) >> 2] = $211 << 16 >> 16; + $216 = $wk_max$159 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($216 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($216 + 1 << 2) >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($216 + 2 << 2) >> 2] = $j$075; + HEAP32[$labelInfo + 1310736 + ($216 + 3 << 2) >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($216 + 4 << 2) >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($216 + 5 << 2) >> 2] = $j$075; + HEAP32[$labelInfo + 1310736 + ($216 + 6 << 2) >> 2] = $j$075; + $wk_max$2 = $211; + break; + } + } + if ($71) { + $74 = HEAP32[$labelInfo + 1179664 + ($66 + -1 << 2) >> 2] | 0; + $77 = HEAP32[$labelInfo + 1179664 + ($70 + -1 << 2) >> 2] | 0; + if (($74 | 0) > ($77 | 0)) { + HEAP16[$pnt2$367 >> 1] = $77; + if (($wk_max$159 | 0) > 0) { + $k$055 = 0; + $wk$056 = $17; + while (1) { + if ((HEAP32[$wk$056 >> 2] | 0) == ($74 | 0)) HEAP32[$wk$056 >> 2] = $77; + $k$055 = $k$055 + 1 | 0; + if (($k$055 | 0) >= ($wk_max$159 | 0)) { + $94 = $77; + break; + } else $wk$056 = $wk$056 + 4 | 0; + } + } else $94 = $77; + } else { + HEAP16[$pnt2$367 >> 1] = $74; + if (($74 | 0) < ($77 | 0) & ($wk_max$159 | 0) > 0) { + $k$152 = 0; + $wk$153 = $17; + while (1) { + if ((HEAP32[$wk$153 >> 2] | 0) == ($77 | 0)) HEAP32[$wk$153 >> 2] = $74; + $k$152 = $k$152 + 1 | 0; + if (($k$152 | 0) >= ($wk_max$159 | 0)) { + $94 = $74; + break; + } else $wk$153 = $wk$153 + 4 | 0; + } + } else $94 = $74; + } + $96 = ($94 << 16 >> 16) * 7 | 0; + $98 = $labelInfo + 1310736 + ($96 + -7 << 2) | 0; + HEAP32[$98 >> 2] = (HEAP32[$98 >> 2] | 0) + 1; + $102 = $labelInfo + 1310736 + ($96 + -6 << 2) | 0; + HEAP32[$102 >> 2] = (HEAP32[$102 >> 2] | 0) + $i$264; + $106 = $labelInfo + 1310736 + ($96 + -5 << 2) | 0; + HEAP32[$106 >> 2] = (HEAP32[$106 >> 2] | 0) + $j$075; + HEAP32[$labelInfo + 1310736 + ($96 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $112 = HEAP16[$pnt2$367 + -2 >> 1] | 0; + if ($112 << 16 >> 16 <= 0) { + HEAP16[$pnt2$367 >> 1] = $65; + $152 = $66 * 7 | 0; + $154 = $labelInfo + 1310736 + ($152 + -7 << 2) | 0; + HEAP32[$154 >> 2] = (HEAP32[$154 >> 2] | 0) + 1; + $158 = $labelInfo + 1310736 + ($152 + -6 << 2) | 0; + HEAP32[$158 >> 2] = (HEAP32[$158 >> 2] | 0) + $i$264; + $162 = $labelInfo + 1310736 + ($152 + -5 << 2) | 0; + HEAP32[$162 >> 2] = (HEAP32[$162 >> 2] | 0) + $j$075; + $166 = $labelInfo + 1310736 + ($152 + -4 << 2) | 0; + if ((HEAP32[$166 >> 2] | 0) > ($i$264 | 0)) HEAP32[$166 >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($152 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $117 = HEAP32[$labelInfo + 1179664 + ($66 + -1 << 2) >> 2] | 0; + $120 = HEAP32[$labelInfo + 1179664 + (($112 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($117 | 0) > ($120 | 0)) { + HEAP16[$pnt2$367 >> 1] = $120; + if (($wk_max$159 | 0) > 0) { + $k$248 = 0; + $wk$249 = $17; + while (1) { + if ((HEAP32[$wk$249 >> 2] | 0) == ($117 | 0)) HEAP32[$wk$249 >> 2] = $120; + $k$248 = $k$248 + 1 | 0; + if (($k$248 | 0) >= ($wk_max$159 | 0)) { + $137 = $120; + break; + } else $wk$249 = $wk$249 + 4 | 0; + } + } else $137 = $120; + } else { + HEAP16[$pnt2$367 >> 1] = $117; + if (($117 | 0) < ($120 | 0) & ($wk_max$159 | 0) > 0) { + $k$345 = 0; + $wk$346 = $17; + while (1) { + if ((HEAP32[$wk$346 >> 2] | 0) == ($120 | 0)) HEAP32[$wk$346 >> 2] = $117; + $k$345 = $k$345 + 1 | 0; + if (($k$345 | 0) >= ($wk_max$159 | 0)) { + $137 = $117; + break; + } else $wk$346 = $wk$346 + 4 | 0; + } + } else $137 = $117; + } + $139 = ($137 << 16 >> 16) * 7 | 0; + $141 = $labelInfo + 1310736 + ($139 + -7 << 2) | 0; + HEAP32[$141 >> 2] = (HEAP32[$141 >> 2] | 0) + 1; + $145 = $labelInfo + 1310736 + ($139 + -6 << 2) | 0; + HEAP32[$145 >> 2] = (HEAP32[$145 >> 2] | 0) + $i$264; + $149 = $labelInfo + 1310736 + ($139 + -5 << 2) | 0; + HEAP32[$149 >> 2] = (HEAP32[$149 >> 2] | 0) + $j$075; + $wk_max$2 = $wk_max$159; + } while (0); + $i$264 = $i$264 + 1 | 0; + $231 = $pnt$168 + 2 | 0; + $232 = $pnt2$367 + 2 | 0; + $233 = $dpnt$166 + 1 | 0; + if (($i$264 | 0) >= ($10 | 0)) { + $dpnt$1$lcssa = $233; + $pnt$1$lcssa = $231; + $pnt2$3$lcssa = $232; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $dpnt$166 = $233; + $pnt$168 = $231; + $pnt2$367 = $232; + $wk_max$159 = $wk_max$2; + } + } + } else { + $dpnt$1$lcssa = $dpnt$077; + $pnt$1$lcssa = $pnt$079; + $pnt2$3$lcssa = $pnt2$278; + $wk_max$1$lcssa = $wk_max$074; + } + $j$075 = $j$075 + 1 | 0; + if (($j$075 | 0) >= ($1 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $dpnt$077 = $dpnt$1$lcssa + 2 | 0; + $pnt$079 = $pnt$1$lcssa + 4 | 0; + $pnt2$278 = $pnt2$3$lcssa + 4 | 0; + $wk_max$074 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $240 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$341 = 1; + $j$142 = 1; + $wk$443 = $17; + while (1) { + $242 = HEAP32[$wk$443 >> 2] | 0; + if (($242 | 0) == ($i$341 | 0)) { + $248 = $j$142; + $j$2 = $j$142 + 1 | 0; + } else { + $248 = HEAP32[$labelInfo + 1179664 + ($242 + -1 << 2) >> 2] | 0; + $j$2 = $j$142; + } + HEAP32[$wk$443 >> 2] = $248; + if (($i$341 | 0) < ($wk_max$0$lcssa | 0)) { + $i$341 = $i$341 + 1 | 0; + $j$142 = $j$2; + $wk$443 = $wk$443 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $252 = $labelInfo + 8 | 0; + $253 = $j$1$lcssa + -1 | 0; + HEAP32[$252 >> 2] = $253; + if (!$253) $$0 = 0; else { + _memset($240 | 0, 0, $253 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $253 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$439 = 0; + do { + $260 = $i$439 << 2; + HEAP32[$labelInfo + 131084 + ($260 << 2) >> 2] = $xsize; + HEAP32[$labelInfo + 131084 + (($260 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($260 | 2) << 2) >> 2] = $ysize; + HEAP32[$labelInfo + 131084 + (($260 | 3) << 2) >> 2] = 0; + $i$439 = $i$439 + 1 | 0; + } while (($i$439 | 0) < (HEAP32[$252 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$537 = 0; + do { + $274 = (HEAP32[$labelInfo + 1179664 + ($i$537 << 2) >> 2] | 0) + -1 | 0; + $275 = $i$537 * 7 | 0; + $278 = $labelInfo + 12 + ($274 << 2) | 0; + HEAP32[$278 >> 2] = (HEAP32[$278 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($275 << 2) >> 2] | 0); + $285 = $274 << 1; + $286 = $labelInfo + 655376 + ($285 << 3) | 0; + HEAPF64[$286 >> 3] = +HEAPF64[$286 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($275 + 1 << 2) >> 2] | 0); + $294 = $labelInfo + 655376 + (($285 | 1) << 3) | 0; + HEAPF64[$294 >> 3] = +HEAPF64[$294 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($275 + 2 << 2) >> 2] | 0); + $297 = $274 << 2; + $298 = $labelInfo + 131084 + ($297 << 2) | 0; + $302 = HEAP32[$labelInfo + 1310736 + ($275 + 3 << 2) >> 2] | 0; + if ((HEAP32[$298 >> 2] | 0) > ($302 | 0)) HEAP32[$298 >> 2] = $302; + $305 = $labelInfo + 131084 + (($297 | 1) << 2) | 0; + $309 = HEAP32[$labelInfo + 1310736 + ($275 + 4 << 2) >> 2] | 0; + if ((HEAP32[$305 >> 2] | 0) < ($309 | 0)) HEAP32[$305 >> 2] = $309; + $312 = $labelInfo + 131084 + (($297 | 2) << 2) | 0; + $316 = HEAP32[$labelInfo + 1310736 + ($275 + 5 << 2) >> 2] | 0; + if ((HEAP32[$312 >> 2] | 0) > ($316 | 0)) HEAP32[$312 >> 2] = $316; + $319 = $labelInfo + 131084 + (($297 | 3) << 2) | 0; + $323 = HEAP32[$labelInfo + 1310736 + ($275 + 6 << 2) >> 2] | 0; + if ((HEAP32[$319 >> 2] | 0) < ($323 | 0)) HEAP32[$319 >> 2] = $323; + $i$537 = $i$537 + 1 | 0; + } while (($i$537 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$252 >> 2] | 0) > 0) { + $i$636 = 0; + do { + $327 = $labelInfo + 12 + ($i$636 << 2) | 0; + $330 = $i$636 << 1; + $331 = $labelInfo + 655376 + ($330 << 3) | 0; + HEAPF64[$331 >> 3] = +HEAPF64[$331 >> 3] / +(HEAP32[$327 >> 2] | 0); + $337 = $labelInfo + 655376 + (($330 | 1) << 3) | 0; + HEAPF64[$337 >> 3] = +HEAPF64[$337 >> 3] / +(HEAP32[$327 >> 2] | 0); + $i$636 = $i$636 + 1 | 0; + } while (($i$636 | 0) < (HEAP32[$252 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubEWR3C565($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $0 = 0, $1 = 0, $10 = 0, $102 = 0, $106 = 0, $112 = 0, $117 = 0, $120 = 0, $137 = 0, $139 = 0, $141 = 0, $145 = 0, $149 = 0, $152 = 0, $154 = 0, $158 = 0, $162 = 0, $166 = 0, $17 = 0, $171 = 0, $173 = 0, $177 = 0, $18 = 0, $181 = 0, $185 = 0, $19 = 0, $191 = 0, $194 = 0, $196 = 0, $200 = 0, $204 = 0, $208 = 0, $211 = 0, $216 = 0, $231 = 0, $232 = 0, $233 = 0, $240 = 0, $242 = 0, $248 = 0, $252 = 0, $253 = 0, $260 = 0, $27 = 0, $274 = 0, $275 = 0, $278 = 0, $285 = 0, $286 = 0, $29 = 0, $294 = 0, $297 = 0, $298 = 0, $302 = 0, $305 = 0, $309 = 0, $312 = 0, $316 = 0, $319 = 0, $323 = 0, $327 = 0, $330 = 0, $331 = 0, $337 = 0, $35 = 0, $46 = 0, $49 = 0, $51 = 0, $55 = 0, $59 = 0, $65 = 0, $66 = 0, $69 = 0, $70 = 0, $71 = 0, $74 = 0, $77 = 0, $9 = 0, $94 = 0, $96 = 0, $98 = 0, $dpnt$077 = 0, $dpnt$1$lcssa = 0, $dpnt$166 = 0, $i$088 = 0, $i$182 = 0, $i$264 = 0, $i$341 = 0, $i$439 = 0, $i$537 = 0, $i$636 = 0, $j$075 = 0, $j$1$lcssa = 0, $j$142 = 0, $j$2 = 0, $k$055 = 0, $k$152 = 0, $k$248 = 0, $k$345 = 0, $pnt$079 = 0, $pnt$1$lcssa = 0, $pnt$168 = 0, $pnt1$090 = 0, $pnt1$184 = 0, $pnt2$089 = 0, $pnt2$183 = 0, $pnt2$278 = 0, $pnt2$3$lcssa = 0, $pnt2$367 = 0, $vararg_buffer = 0, $wk$056 = 0, $wk$153 = 0, $wk$249 = 0, $wk$346 = 0, $wk$443 = 0, $wk_max$0$lcssa = 0, $wk_max$074 = 0, $wk_max$1$lcssa = 0, $wk_max$159 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = HEAP32[$labelInfo >> 2] | 0; + $1 = $ysize + -1 | 0; + if (($xsize | 0) > 0) { + $i$088 = 0; + $pnt1$090 = $0; + $pnt2$089 = $0 + ((Math_imul($1, $xsize) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$089 >> 1] = 0; + HEAP16[$pnt1$090 >> 1] = 0; + $i$088 = $i$088 + 1 | 0; + if (($i$088 | 0) >= ($xsize | 0)) break; else { + $pnt1$090 = $pnt1$090 + 2 | 0; + $pnt2$089 = $pnt2$089 + 2 | 0; + } + } + } + $9 = $labelingThresh * 3 | 0; + $10 = $xsize + -1 | 0; + if (($ysize | 0) > 0) { + $i$182 = 0; + $pnt1$184 = $0; + $pnt2$183 = $0 + ($10 << 1) | 0; + while (1) { + HEAP16[$pnt2$183 >> 1] = 0; + HEAP16[$pnt1$184 >> 1] = 0; + $i$182 = $i$182 + 1 | 0; + if (($i$182 | 0) >= ($ysize | 0)) break; else { + $pnt1$184 = $pnt1$184 + ($xsize << 1) | 0; + $pnt2$183 = $pnt2$183 + ($xsize << 1) | 0; + } + } + } + $17 = $labelInfo + 1179664 | 0; + $18 = $xsize + 1 | 0; + $19 = 0 - $xsize | 0; + $$sum = 1 - $xsize | 0; + $$sum1 = ~$xsize; + L11 : do if (($1 | 0) > 1) { + $27 = ($10 | 0) > 1; + $dpnt$077 = (HEAP32[$labelInfo + 4 >> 2] | 0) + $18 | 0; + $j$075 = 1; + $pnt$079 = $image + ($18 << 1) | 0; + $pnt2$278 = $0 + ($18 << 1) | 0; + $wk_max$074 = 0; + L13 : while (1) { + if ($27) { + $dpnt$166 = $dpnt$077; + $i$264 = 1; + $pnt$168 = $pnt$079; + $pnt2$367 = $pnt2$278; + $wk_max$159 = $wk_max$074; + while (1) { + $29 = HEAPU8[$pnt$168 >> 0] | 0; + $35 = HEAPU8[$pnt$168 + 1 >> 0] | 0; + do if ((($29 & 248) + 10 + ($29 << 5 & 224) + ($35 >>> 3 & 28) + ($35 << 3 & 248) | 0) > ($9 | 0)) { + HEAP8[$dpnt$166 >> 0] = -1; + $46 = HEAP16[$pnt2$367 + ($19 << 1) >> 1] | 0; + if ($46 << 16 >> 16 > 0) { + HEAP16[$pnt2$367 >> 1] = $46; + $49 = ($46 << 16 >> 16) * 7 | 0; + $51 = $labelInfo + 1310736 + ($49 + -7 << 2) | 0; + HEAP32[$51 >> 2] = (HEAP32[$51 >> 2] | 0) + 1; + $55 = $labelInfo + 1310736 + ($49 + -6 << 2) | 0; + HEAP32[$55 >> 2] = (HEAP32[$55 >> 2] | 0) + $i$264; + $59 = $labelInfo + 1310736 + ($49 + -5 << 2) | 0; + HEAP32[$59 >> 2] = (HEAP32[$59 >> 2] | 0) + $j$075; + HEAP32[$labelInfo + 1310736 + ($49 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $65 = HEAP16[$pnt2$367 + ($$sum << 1) >> 1] | 0; + $66 = $65 << 16 >> 16; + $69 = HEAP16[$pnt2$367 + ($$sum1 << 1) >> 1] | 0; + $70 = $69 << 16 >> 16; + $71 = $69 << 16 >> 16 > 0; + if ($65 << 16 >> 16 <= 0) { + if ($71) { + HEAP16[$pnt2$367 >> 1] = $69; + $171 = $70 * 7 | 0; + $173 = $labelInfo + 1310736 + ($171 + -7 << 2) | 0; + HEAP32[$173 >> 2] = (HEAP32[$173 >> 2] | 0) + 1; + $177 = $labelInfo + 1310736 + ($171 + -6 << 2) | 0; + HEAP32[$177 >> 2] = (HEAP32[$177 >> 2] | 0) + $i$264; + $181 = $labelInfo + 1310736 + ($171 + -5 << 2) | 0; + HEAP32[$181 >> 2] = (HEAP32[$181 >> 2] | 0) + $j$075; + $185 = $labelInfo + 1310736 + ($171 + -3 << 2) | 0; + if ((HEAP32[$185 >> 2] | 0) < ($i$264 | 0)) HEAP32[$185 >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($171 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $191 = HEAP16[$pnt2$367 + -2 >> 1] | 0; + if ($191 << 16 >> 16 > 0) { + HEAP16[$pnt2$367 >> 1] = $191; + $194 = ($191 << 16 >> 16) * 7 | 0; + $196 = $labelInfo + 1310736 + ($194 + -7 << 2) | 0; + HEAP32[$196 >> 2] = (HEAP32[$196 >> 2] | 0) + 1; + $200 = $labelInfo + 1310736 + ($194 + -6 << 2) | 0; + HEAP32[$200 >> 2] = (HEAP32[$200 >> 2] | 0) + $i$264; + $204 = $labelInfo + 1310736 + ($194 + -5 << 2) | 0; + HEAP32[$204 >> 2] = (HEAP32[$204 >> 2] | 0) + $j$075; + $208 = $labelInfo + 1310736 + ($194 + -3 << 2) | 0; + if ((HEAP32[$208 >> 2] | 0) >= ($i$264 | 0)) { + $wk_max$2 = $wk_max$159; + break; + } + HEAP32[$208 >> 2] = $i$264; + $wk_max$2 = $wk_max$159; + break; + } else { + $211 = $wk_max$159 + 1 | 0; + if (($wk_max$159 | 0) > 32767) break L13; + HEAP16[$pnt2$367 >> 1] = $211; + HEAP32[$labelInfo + 1179664 + ($wk_max$159 << 2) >> 2] = $211 << 16 >> 16; + $216 = $wk_max$159 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($216 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($216 + 1 << 2) >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($216 + 2 << 2) >> 2] = $j$075; + HEAP32[$labelInfo + 1310736 + ($216 + 3 << 2) >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($216 + 4 << 2) >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($216 + 5 << 2) >> 2] = $j$075; + HEAP32[$labelInfo + 1310736 + ($216 + 6 << 2) >> 2] = $j$075; + $wk_max$2 = $211; + break; + } + } + if ($71) { + $74 = HEAP32[$labelInfo + 1179664 + ($66 + -1 << 2) >> 2] | 0; + $77 = HEAP32[$labelInfo + 1179664 + ($70 + -1 << 2) >> 2] | 0; + if (($74 | 0) > ($77 | 0)) { + HEAP16[$pnt2$367 >> 1] = $77; + if (($wk_max$159 | 0) > 0) { + $k$055 = 0; + $wk$056 = $17; + while (1) { + if ((HEAP32[$wk$056 >> 2] | 0) == ($74 | 0)) HEAP32[$wk$056 >> 2] = $77; + $k$055 = $k$055 + 1 | 0; + if (($k$055 | 0) >= ($wk_max$159 | 0)) { + $94 = $77; + break; + } else $wk$056 = $wk$056 + 4 | 0; + } + } else $94 = $77; + } else { + HEAP16[$pnt2$367 >> 1] = $74; + if (($74 | 0) < ($77 | 0) & ($wk_max$159 | 0) > 0) { + $k$152 = 0; + $wk$153 = $17; + while (1) { + if ((HEAP32[$wk$153 >> 2] | 0) == ($77 | 0)) HEAP32[$wk$153 >> 2] = $74; + $k$152 = $k$152 + 1 | 0; + if (($k$152 | 0) >= ($wk_max$159 | 0)) { + $94 = $74; + break; + } else $wk$153 = $wk$153 + 4 | 0; + } + } else $94 = $74; + } + $96 = ($94 << 16 >> 16) * 7 | 0; + $98 = $labelInfo + 1310736 + ($96 + -7 << 2) | 0; + HEAP32[$98 >> 2] = (HEAP32[$98 >> 2] | 0) + 1; + $102 = $labelInfo + 1310736 + ($96 + -6 << 2) | 0; + HEAP32[$102 >> 2] = (HEAP32[$102 >> 2] | 0) + $i$264; + $106 = $labelInfo + 1310736 + ($96 + -5 << 2) | 0; + HEAP32[$106 >> 2] = (HEAP32[$106 >> 2] | 0) + $j$075; + HEAP32[$labelInfo + 1310736 + ($96 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $112 = HEAP16[$pnt2$367 + -2 >> 1] | 0; + if ($112 << 16 >> 16 <= 0) { + HEAP16[$pnt2$367 >> 1] = $65; + $152 = $66 * 7 | 0; + $154 = $labelInfo + 1310736 + ($152 + -7 << 2) | 0; + HEAP32[$154 >> 2] = (HEAP32[$154 >> 2] | 0) + 1; + $158 = $labelInfo + 1310736 + ($152 + -6 << 2) | 0; + HEAP32[$158 >> 2] = (HEAP32[$158 >> 2] | 0) + $i$264; + $162 = $labelInfo + 1310736 + ($152 + -5 << 2) | 0; + HEAP32[$162 >> 2] = (HEAP32[$162 >> 2] | 0) + $j$075; + $166 = $labelInfo + 1310736 + ($152 + -4 << 2) | 0; + if ((HEAP32[$166 >> 2] | 0) > ($i$264 | 0)) HEAP32[$166 >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($152 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $117 = HEAP32[$labelInfo + 1179664 + ($66 + -1 << 2) >> 2] | 0; + $120 = HEAP32[$labelInfo + 1179664 + (($112 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($117 | 0) > ($120 | 0)) { + HEAP16[$pnt2$367 >> 1] = $120; + if (($wk_max$159 | 0) > 0) { + $k$248 = 0; + $wk$249 = $17; + while (1) { + if ((HEAP32[$wk$249 >> 2] | 0) == ($117 | 0)) HEAP32[$wk$249 >> 2] = $120; + $k$248 = $k$248 + 1 | 0; + if (($k$248 | 0) >= ($wk_max$159 | 0)) { + $137 = $120; + break; + } else $wk$249 = $wk$249 + 4 | 0; + } + } else $137 = $120; + } else { + HEAP16[$pnt2$367 >> 1] = $117; + if (($117 | 0) < ($120 | 0) & ($wk_max$159 | 0) > 0) { + $k$345 = 0; + $wk$346 = $17; + while (1) { + if ((HEAP32[$wk$346 >> 2] | 0) == ($120 | 0)) HEAP32[$wk$346 >> 2] = $117; + $k$345 = $k$345 + 1 | 0; + if (($k$345 | 0) >= ($wk_max$159 | 0)) { + $137 = $117; + break; + } else $wk$346 = $wk$346 + 4 | 0; + } + } else $137 = $117; + } + $139 = ($137 << 16 >> 16) * 7 | 0; + $141 = $labelInfo + 1310736 + ($139 + -7 << 2) | 0; + HEAP32[$141 >> 2] = (HEAP32[$141 >> 2] | 0) + 1; + $145 = $labelInfo + 1310736 + ($139 + -6 << 2) | 0; + HEAP32[$145 >> 2] = (HEAP32[$145 >> 2] | 0) + $i$264; + $149 = $labelInfo + 1310736 + ($139 + -5 << 2) | 0; + HEAP32[$149 >> 2] = (HEAP32[$149 >> 2] | 0) + $j$075; + $wk_max$2 = $wk_max$159; + } else { + HEAP16[$pnt2$367 >> 1] = 0; + HEAP8[$dpnt$166 >> 0] = 0; + $wk_max$2 = $wk_max$159; + } while (0); + $i$264 = $i$264 + 1 | 0; + $231 = $pnt$168 + 2 | 0; + $232 = $pnt2$367 + 2 | 0; + $233 = $dpnt$166 + 1 | 0; + if (($i$264 | 0) >= ($10 | 0)) { + $dpnt$1$lcssa = $233; + $pnt$1$lcssa = $231; + $pnt2$3$lcssa = $232; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $dpnt$166 = $233; + $pnt$168 = $231; + $pnt2$367 = $232; + $wk_max$159 = $wk_max$2; + } + } + } else { + $dpnt$1$lcssa = $dpnt$077; + $pnt$1$lcssa = $pnt$079; + $pnt2$3$lcssa = $pnt2$278; + $wk_max$1$lcssa = $wk_max$074; + } + $j$075 = $j$075 + 1 | 0; + if (($j$075 | 0) >= ($1 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $dpnt$077 = $dpnt$1$lcssa + 2 | 0; + $pnt$079 = $pnt$1$lcssa + 4 | 0; + $pnt2$278 = $pnt2$3$lcssa + 4 | 0; + $wk_max$074 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $240 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$341 = 1; + $j$142 = 1; + $wk$443 = $17; + while (1) { + $242 = HEAP32[$wk$443 >> 2] | 0; + if (($242 | 0) == ($i$341 | 0)) { + $248 = $j$142; + $j$2 = $j$142 + 1 | 0; + } else { + $248 = HEAP32[$labelInfo + 1179664 + ($242 + -1 << 2) >> 2] | 0; + $j$2 = $j$142; + } + HEAP32[$wk$443 >> 2] = $248; + if (($i$341 | 0) < ($wk_max$0$lcssa | 0)) { + $i$341 = $i$341 + 1 | 0; + $j$142 = $j$2; + $wk$443 = $wk$443 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $252 = $labelInfo + 8 | 0; + $253 = $j$1$lcssa + -1 | 0; + HEAP32[$252 >> 2] = $253; + if (!$253) $$0 = 0; else { + _memset($240 | 0, 0, $253 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $253 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$439 = 0; + do { + $260 = $i$439 << 2; + HEAP32[$labelInfo + 131084 + ($260 << 2) >> 2] = $xsize; + HEAP32[$labelInfo + 131084 + (($260 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($260 | 2) << 2) >> 2] = $ysize; + HEAP32[$labelInfo + 131084 + (($260 | 3) << 2) >> 2] = 0; + $i$439 = $i$439 + 1 | 0; + } while (($i$439 | 0) < (HEAP32[$252 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$537 = 0; + do { + $274 = (HEAP32[$labelInfo + 1179664 + ($i$537 << 2) >> 2] | 0) + -1 | 0; + $275 = $i$537 * 7 | 0; + $278 = $labelInfo + 12 + ($274 << 2) | 0; + HEAP32[$278 >> 2] = (HEAP32[$278 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($275 << 2) >> 2] | 0); + $285 = $274 << 1; + $286 = $labelInfo + 655376 + ($285 << 3) | 0; + HEAPF64[$286 >> 3] = +HEAPF64[$286 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($275 + 1 << 2) >> 2] | 0); + $294 = $labelInfo + 655376 + (($285 | 1) << 3) | 0; + HEAPF64[$294 >> 3] = +HEAPF64[$294 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($275 + 2 << 2) >> 2] | 0); + $297 = $274 << 2; + $298 = $labelInfo + 131084 + ($297 << 2) | 0; + $302 = HEAP32[$labelInfo + 1310736 + ($275 + 3 << 2) >> 2] | 0; + if ((HEAP32[$298 >> 2] | 0) > ($302 | 0)) HEAP32[$298 >> 2] = $302; + $305 = $labelInfo + 131084 + (($297 | 1) << 2) | 0; + $309 = HEAP32[$labelInfo + 1310736 + ($275 + 4 << 2) >> 2] | 0; + if ((HEAP32[$305 >> 2] | 0) < ($309 | 0)) HEAP32[$305 >> 2] = $309; + $312 = $labelInfo + 131084 + (($297 | 2) << 2) | 0; + $316 = HEAP32[$labelInfo + 1310736 + ($275 + 5 << 2) >> 2] | 0; + if ((HEAP32[$312 >> 2] | 0) > ($316 | 0)) HEAP32[$312 >> 2] = $316; + $319 = $labelInfo + 131084 + (($297 | 3) << 2) | 0; + $323 = HEAP32[$labelInfo + 1310736 + ($275 + 6 << 2) >> 2] | 0; + if ((HEAP32[$319 >> 2] | 0) < ($323 | 0)) HEAP32[$319 >> 2] = $323; + $i$537 = $i$537 + 1 | 0; + } while (($i$537 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$252 >> 2] | 0) > 0) { + $i$636 = 0; + do { + $327 = $labelInfo + 12 + ($i$636 << 2) | 0; + $330 = $i$636 << 1; + $331 = $labelInfo + 655376 + ($330 << 3) | 0; + HEAPF64[$331 >> 3] = +HEAPF64[$331 >> 3] / +(HEAP32[$327 >> 2] | 0); + $337 = $labelInfo + 655376 + (($330 | 1) << 3) | 0; + HEAPF64[$337 >> 3] = +HEAPF64[$337 >> 3] / +(HEAP32[$327 >> 2] | 0); + $i$636 = $i$636 + 1 | 0; + } while (($i$636 | 0) < (HEAP32[$252 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubEBR3C565($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $0 = 0, $1 = 0, $10 = 0, $102 = 0, $106 = 0, $112 = 0, $117 = 0, $120 = 0, $137 = 0, $139 = 0, $141 = 0, $145 = 0, $149 = 0, $152 = 0, $154 = 0, $158 = 0, $162 = 0, $166 = 0, $17 = 0, $171 = 0, $173 = 0, $177 = 0, $18 = 0, $181 = 0, $185 = 0, $19 = 0, $191 = 0, $194 = 0, $196 = 0, $200 = 0, $204 = 0, $208 = 0, $211 = 0, $216 = 0, $231 = 0, $232 = 0, $233 = 0, $240 = 0, $242 = 0, $248 = 0, $252 = 0, $253 = 0, $260 = 0, $27 = 0, $274 = 0, $275 = 0, $278 = 0, $285 = 0, $286 = 0, $29 = 0, $294 = 0, $297 = 0, $298 = 0, $302 = 0, $305 = 0, $309 = 0, $312 = 0, $316 = 0, $319 = 0, $323 = 0, $327 = 0, $330 = 0, $331 = 0, $337 = 0, $35 = 0, $46 = 0, $49 = 0, $51 = 0, $55 = 0, $59 = 0, $65 = 0, $66 = 0, $69 = 0, $70 = 0, $71 = 0, $74 = 0, $77 = 0, $9 = 0, $94 = 0, $96 = 0, $98 = 0, $dpnt$077 = 0, $dpnt$1$lcssa = 0, $dpnt$166 = 0, $i$088 = 0, $i$182 = 0, $i$264 = 0, $i$341 = 0, $i$439 = 0, $i$537 = 0, $i$636 = 0, $j$075 = 0, $j$1$lcssa = 0, $j$142 = 0, $j$2 = 0, $k$055 = 0, $k$152 = 0, $k$248 = 0, $k$345 = 0, $pnt$079 = 0, $pnt$1$lcssa = 0, $pnt$168 = 0, $pnt1$090 = 0, $pnt1$184 = 0, $pnt2$089 = 0, $pnt2$183 = 0, $pnt2$278 = 0, $pnt2$3$lcssa = 0, $pnt2$367 = 0, $vararg_buffer = 0, $wk$056 = 0, $wk$153 = 0, $wk$249 = 0, $wk$346 = 0, $wk$443 = 0, $wk_max$0$lcssa = 0, $wk_max$074 = 0, $wk_max$1$lcssa = 0, $wk_max$159 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = HEAP32[$labelInfo >> 2] | 0; + $1 = $ysize + -1 | 0; + if (($xsize | 0) > 0) { + $i$088 = 0; + $pnt1$090 = $0; + $pnt2$089 = $0 + ((Math_imul($1, $xsize) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$089 >> 1] = 0; + HEAP16[$pnt1$090 >> 1] = 0; + $i$088 = $i$088 + 1 | 0; + if (($i$088 | 0) >= ($xsize | 0)) break; else { + $pnt1$090 = $pnt1$090 + 2 | 0; + $pnt2$089 = $pnt2$089 + 2 | 0; + } + } + } + $9 = $labelingThresh * 3 | 0; + $10 = $xsize + -1 | 0; + if (($ysize | 0) > 0) { + $i$182 = 0; + $pnt1$184 = $0; + $pnt2$183 = $0 + ($10 << 1) | 0; + while (1) { + HEAP16[$pnt2$183 >> 1] = 0; + HEAP16[$pnt1$184 >> 1] = 0; + $i$182 = $i$182 + 1 | 0; + if (($i$182 | 0) >= ($ysize | 0)) break; else { + $pnt1$184 = $pnt1$184 + ($xsize << 1) | 0; + $pnt2$183 = $pnt2$183 + ($xsize << 1) | 0; + } + } + } + $17 = $labelInfo + 1179664 | 0; + $18 = $xsize + 1 | 0; + $19 = 0 - $xsize | 0; + $$sum = 1 - $xsize | 0; + $$sum1 = ~$xsize; + L11 : do if (($1 | 0) > 1) { + $27 = ($10 | 0) > 1; + $dpnt$077 = (HEAP32[$labelInfo + 4 >> 2] | 0) + $18 | 0; + $j$075 = 1; + $pnt$079 = $image + ($18 << 1) | 0; + $pnt2$278 = $0 + ($18 << 1) | 0; + $wk_max$074 = 0; + L13 : while (1) { + if ($27) { + $dpnt$166 = $dpnt$077; + $i$264 = 1; + $pnt$168 = $pnt$079; + $pnt2$367 = $pnt2$278; + $wk_max$159 = $wk_max$074; + while (1) { + $29 = HEAPU8[$pnt$168 >> 0] | 0; + $35 = HEAPU8[$pnt$168 + 1 >> 0] | 0; + do if ((($29 & 248) + 10 + ($29 << 5 & 224) + ($35 >>> 3 & 28) + ($35 << 3 & 248) | 0) > ($9 | 0)) { + HEAP16[$pnt2$367 >> 1] = 0; + HEAP8[$dpnt$166 >> 0] = 0; + $wk_max$2 = $wk_max$159; + } else { + HEAP8[$dpnt$166 >> 0] = -1; + $46 = HEAP16[$pnt2$367 + ($19 << 1) >> 1] | 0; + if ($46 << 16 >> 16 > 0) { + HEAP16[$pnt2$367 >> 1] = $46; + $49 = ($46 << 16 >> 16) * 7 | 0; + $51 = $labelInfo + 1310736 + ($49 + -7 << 2) | 0; + HEAP32[$51 >> 2] = (HEAP32[$51 >> 2] | 0) + 1; + $55 = $labelInfo + 1310736 + ($49 + -6 << 2) | 0; + HEAP32[$55 >> 2] = (HEAP32[$55 >> 2] | 0) + $i$264; + $59 = $labelInfo + 1310736 + ($49 + -5 << 2) | 0; + HEAP32[$59 >> 2] = (HEAP32[$59 >> 2] | 0) + $j$075; + HEAP32[$labelInfo + 1310736 + ($49 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $65 = HEAP16[$pnt2$367 + ($$sum << 1) >> 1] | 0; + $66 = $65 << 16 >> 16; + $69 = HEAP16[$pnt2$367 + ($$sum1 << 1) >> 1] | 0; + $70 = $69 << 16 >> 16; + $71 = $69 << 16 >> 16 > 0; + if ($65 << 16 >> 16 <= 0) { + if ($71) { + HEAP16[$pnt2$367 >> 1] = $69; + $171 = $70 * 7 | 0; + $173 = $labelInfo + 1310736 + ($171 + -7 << 2) | 0; + HEAP32[$173 >> 2] = (HEAP32[$173 >> 2] | 0) + 1; + $177 = $labelInfo + 1310736 + ($171 + -6 << 2) | 0; + HEAP32[$177 >> 2] = (HEAP32[$177 >> 2] | 0) + $i$264; + $181 = $labelInfo + 1310736 + ($171 + -5 << 2) | 0; + HEAP32[$181 >> 2] = (HEAP32[$181 >> 2] | 0) + $j$075; + $185 = $labelInfo + 1310736 + ($171 + -3 << 2) | 0; + if ((HEAP32[$185 >> 2] | 0) < ($i$264 | 0)) HEAP32[$185 >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($171 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $191 = HEAP16[$pnt2$367 + -2 >> 1] | 0; + if ($191 << 16 >> 16 > 0) { + HEAP16[$pnt2$367 >> 1] = $191; + $194 = ($191 << 16 >> 16) * 7 | 0; + $196 = $labelInfo + 1310736 + ($194 + -7 << 2) | 0; + HEAP32[$196 >> 2] = (HEAP32[$196 >> 2] | 0) + 1; + $200 = $labelInfo + 1310736 + ($194 + -6 << 2) | 0; + HEAP32[$200 >> 2] = (HEAP32[$200 >> 2] | 0) + $i$264; + $204 = $labelInfo + 1310736 + ($194 + -5 << 2) | 0; + HEAP32[$204 >> 2] = (HEAP32[$204 >> 2] | 0) + $j$075; + $208 = $labelInfo + 1310736 + ($194 + -3 << 2) | 0; + if ((HEAP32[$208 >> 2] | 0) >= ($i$264 | 0)) { + $wk_max$2 = $wk_max$159; + break; + } + HEAP32[$208 >> 2] = $i$264; + $wk_max$2 = $wk_max$159; + break; + } else { + $211 = $wk_max$159 + 1 | 0; + if (($wk_max$159 | 0) > 32767) break L13; + HEAP16[$pnt2$367 >> 1] = $211; + HEAP32[$labelInfo + 1179664 + ($wk_max$159 << 2) >> 2] = $211 << 16 >> 16; + $216 = $wk_max$159 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($216 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($216 + 1 << 2) >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($216 + 2 << 2) >> 2] = $j$075; + HEAP32[$labelInfo + 1310736 + ($216 + 3 << 2) >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($216 + 4 << 2) >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($216 + 5 << 2) >> 2] = $j$075; + HEAP32[$labelInfo + 1310736 + ($216 + 6 << 2) >> 2] = $j$075; + $wk_max$2 = $211; + break; + } + } + if ($71) { + $74 = HEAP32[$labelInfo + 1179664 + ($66 + -1 << 2) >> 2] | 0; + $77 = HEAP32[$labelInfo + 1179664 + ($70 + -1 << 2) >> 2] | 0; + if (($74 | 0) > ($77 | 0)) { + HEAP16[$pnt2$367 >> 1] = $77; + if (($wk_max$159 | 0) > 0) { + $k$055 = 0; + $wk$056 = $17; + while (1) { + if ((HEAP32[$wk$056 >> 2] | 0) == ($74 | 0)) HEAP32[$wk$056 >> 2] = $77; + $k$055 = $k$055 + 1 | 0; + if (($k$055 | 0) >= ($wk_max$159 | 0)) { + $94 = $77; + break; + } else $wk$056 = $wk$056 + 4 | 0; + } + } else $94 = $77; + } else { + HEAP16[$pnt2$367 >> 1] = $74; + if (($74 | 0) < ($77 | 0) & ($wk_max$159 | 0) > 0) { + $k$152 = 0; + $wk$153 = $17; + while (1) { + if ((HEAP32[$wk$153 >> 2] | 0) == ($77 | 0)) HEAP32[$wk$153 >> 2] = $74; + $k$152 = $k$152 + 1 | 0; + if (($k$152 | 0) >= ($wk_max$159 | 0)) { + $94 = $74; + break; + } else $wk$153 = $wk$153 + 4 | 0; + } + } else $94 = $74; + } + $96 = ($94 << 16 >> 16) * 7 | 0; + $98 = $labelInfo + 1310736 + ($96 + -7 << 2) | 0; + HEAP32[$98 >> 2] = (HEAP32[$98 >> 2] | 0) + 1; + $102 = $labelInfo + 1310736 + ($96 + -6 << 2) | 0; + HEAP32[$102 >> 2] = (HEAP32[$102 >> 2] | 0) + $i$264; + $106 = $labelInfo + 1310736 + ($96 + -5 << 2) | 0; + HEAP32[$106 >> 2] = (HEAP32[$106 >> 2] | 0) + $j$075; + HEAP32[$labelInfo + 1310736 + ($96 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $112 = HEAP16[$pnt2$367 + -2 >> 1] | 0; + if ($112 << 16 >> 16 <= 0) { + HEAP16[$pnt2$367 >> 1] = $65; + $152 = $66 * 7 | 0; + $154 = $labelInfo + 1310736 + ($152 + -7 << 2) | 0; + HEAP32[$154 >> 2] = (HEAP32[$154 >> 2] | 0) + 1; + $158 = $labelInfo + 1310736 + ($152 + -6 << 2) | 0; + HEAP32[$158 >> 2] = (HEAP32[$158 >> 2] | 0) + $i$264; + $162 = $labelInfo + 1310736 + ($152 + -5 << 2) | 0; + HEAP32[$162 >> 2] = (HEAP32[$162 >> 2] | 0) + $j$075; + $166 = $labelInfo + 1310736 + ($152 + -4 << 2) | 0; + if ((HEAP32[$166 >> 2] | 0) > ($i$264 | 0)) HEAP32[$166 >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($152 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $117 = HEAP32[$labelInfo + 1179664 + ($66 + -1 << 2) >> 2] | 0; + $120 = HEAP32[$labelInfo + 1179664 + (($112 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($117 | 0) > ($120 | 0)) { + HEAP16[$pnt2$367 >> 1] = $120; + if (($wk_max$159 | 0) > 0) { + $k$248 = 0; + $wk$249 = $17; + while (1) { + if ((HEAP32[$wk$249 >> 2] | 0) == ($117 | 0)) HEAP32[$wk$249 >> 2] = $120; + $k$248 = $k$248 + 1 | 0; + if (($k$248 | 0) >= ($wk_max$159 | 0)) { + $137 = $120; + break; + } else $wk$249 = $wk$249 + 4 | 0; + } + } else $137 = $120; + } else { + HEAP16[$pnt2$367 >> 1] = $117; + if (($117 | 0) < ($120 | 0) & ($wk_max$159 | 0) > 0) { + $k$345 = 0; + $wk$346 = $17; + while (1) { + if ((HEAP32[$wk$346 >> 2] | 0) == ($120 | 0)) HEAP32[$wk$346 >> 2] = $117; + $k$345 = $k$345 + 1 | 0; + if (($k$345 | 0) >= ($wk_max$159 | 0)) { + $137 = $117; + break; + } else $wk$346 = $wk$346 + 4 | 0; + } + } else $137 = $117; + } + $139 = ($137 << 16 >> 16) * 7 | 0; + $141 = $labelInfo + 1310736 + ($139 + -7 << 2) | 0; + HEAP32[$141 >> 2] = (HEAP32[$141 >> 2] | 0) + 1; + $145 = $labelInfo + 1310736 + ($139 + -6 << 2) | 0; + HEAP32[$145 >> 2] = (HEAP32[$145 >> 2] | 0) + $i$264; + $149 = $labelInfo + 1310736 + ($139 + -5 << 2) | 0; + HEAP32[$149 >> 2] = (HEAP32[$149 >> 2] | 0) + $j$075; + $wk_max$2 = $wk_max$159; + } while (0); + $i$264 = $i$264 + 1 | 0; + $231 = $pnt$168 + 2 | 0; + $232 = $pnt2$367 + 2 | 0; + $233 = $dpnt$166 + 1 | 0; + if (($i$264 | 0) >= ($10 | 0)) { + $dpnt$1$lcssa = $233; + $pnt$1$lcssa = $231; + $pnt2$3$lcssa = $232; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $dpnt$166 = $233; + $pnt$168 = $231; + $pnt2$367 = $232; + $wk_max$159 = $wk_max$2; + } + } + } else { + $dpnt$1$lcssa = $dpnt$077; + $pnt$1$lcssa = $pnt$079; + $pnt2$3$lcssa = $pnt2$278; + $wk_max$1$lcssa = $wk_max$074; + } + $j$075 = $j$075 + 1 | 0; + if (($j$075 | 0) >= ($1 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $dpnt$077 = $dpnt$1$lcssa + 2 | 0; + $pnt$079 = $pnt$1$lcssa + 4 | 0; + $pnt2$278 = $pnt2$3$lcssa + 4 | 0; + $wk_max$074 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $240 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$341 = 1; + $j$142 = 1; + $wk$443 = $17; + while (1) { + $242 = HEAP32[$wk$443 >> 2] | 0; + if (($242 | 0) == ($i$341 | 0)) { + $248 = $j$142; + $j$2 = $j$142 + 1 | 0; + } else { + $248 = HEAP32[$labelInfo + 1179664 + ($242 + -1 << 2) >> 2] | 0; + $j$2 = $j$142; + } + HEAP32[$wk$443 >> 2] = $248; + if (($i$341 | 0) < ($wk_max$0$lcssa | 0)) { + $i$341 = $i$341 + 1 | 0; + $j$142 = $j$2; + $wk$443 = $wk$443 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $252 = $labelInfo + 8 | 0; + $253 = $j$1$lcssa + -1 | 0; + HEAP32[$252 >> 2] = $253; + if (!$253) $$0 = 0; else { + _memset($240 | 0, 0, $253 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $253 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$439 = 0; + do { + $260 = $i$439 << 2; + HEAP32[$labelInfo + 131084 + ($260 << 2) >> 2] = $xsize; + HEAP32[$labelInfo + 131084 + (($260 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($260 | 2) << 2) >> 2] = $ysize; + HEAP32[$labelInfo + 131084 + (($260 | 3) << 2) >> 2] = 0; + $i$439 = $i$439 + 1 | 0; + } while (($i$439 | 0) < (HEAP32[$252 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$537 = 0; + do { + $274 = (HEAP32[$labelInfo + 1179664 + ($i$537 << 2) >> 2] | 0) + -1 | 0; + $275 = $i$537 * 7 | 0; + $278 = $labelInfo + 12 + ($274 << 2) | 0; + HEAP32[$278 >> 2] = (HEAP32[$278 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($275 << 2) >> 2] | 0); + $285 = $274 << 1; + $286 = $labelInfo + 655376 + ($285 << 3) | 0; + HEAPF64[$286 >> 3] = +HEAPF64[$286 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($275 + 1 << 2) >> 2] | 0); + $294 = $labelInfo + 655376 + (($285 | 1) << 3) | 0; + HEAPF64[$294 >> 3] = +HEAPF64[$294 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($275 + 2 << 2) >> 2] | 0); + $297 = $274 << 2; + $298 = $labelInfo + 131084 + ($297 << 2) | 0; + $302 = HEAP32[$labelInfo + 1310736 + ($275 + 3 << 2) >> 2] | 0; + if ((HEAP32[$298 >> 2] | 0) > ($302 | 0)) HEAP32[$298 >> 2] = $302; + $305 = $labelInfo + 131084 + (($297 | 1) << 2) | 0; + $309 = HEAP32[$labelInfo + 1310736 + ($275 + 4 << 2) >> 2] | 0; + if ((HEAP32[$305 >> 2] | 0) < ($309 | 0)) HEAP32[$305 >> 2] = $309; + $312 = $labelInfo + 131084 + (($297 | 2) << 2) | 0; + $316 = HEAP32[$labelInfo + 1310736 + ($275 + 5 << 2) >> 2] | 0; + if ((HEAP32[$312 >> 2] | 0) > ($316 | 0)) HEAP32[$312 >> 2] = $316; + $319 = $labelInfo + 131084 + (($297 | 3) << 2) | 0; + $323 = HEAP32[$labelInfo + 1310736 + ($275 + 6 << 2) >> 2] | 0; + if ((HEAP32[$319 >> 2] | 0) < ($323 | 0)) HEAP32[$319 >> 2] = $323; + $i$537 = $i$537 + 1 | 0; + } while (($i$537 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$252 >> 2] | 0) > 0) { + $i$636 = 0; + do { + $327 = $labelInfo + 12 + ($i$636 << 2) | 0; + $330 = $i$636 << 1; + $331 = $labelInfo + 655376 + ($330 << 3) | 0; + HEAPF64[$331 >> 3] = +HEAPF64[$331 >> 3] / +(HEAP32[$327 >> 2] | 0); + $337 = $labelInfo + 655376 + (($330 | 1) << 3) | 0; + HEAPF64[$337 >> 3] = +HEAPF64[$337 >> 3] / +(HEAP32[$327 >> 2] | 0); + $i$636 = $i$636 + 1 | 0; + } while (($i$636 | 0) < (HEAP32[$252 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arPattGetIDGlobal($pattHandle, $imageProcMode, $pattDetectMode, $image, $xsize, $ysize, $pixelFormat, $paramLTf, $vertex, $pattRatio, $codePatt, $dirPatt, $cfPatt, $codeMatrix, $dirMatrix, $cfMatrix, $matrixCodeType, $errorCorrected, $codeGlobalID_p) { + $pattHandle = $pattHandle | 0; + $imageProcMode = $imageProcMode | 0; + $pattDetectMode = $pattDetectMode | 0; + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $pixelFormat = $pixelFormat | 0; + $paramLTf = $paramLTf | 0; + $vertex = $vertex | 0; + $pattRatio = +$pattRatio; + $codePatt = $codePatt | 0; + $dirPatt = $dirPatt | 0; + $cfPatt = $cfPatt | 0; + $codeMatrix = $codeMatrix | 0; + $dirMatrix = $dirMatrix | 0; + $cfMatrix = $cfMatrix | 0; + $matrixCodeType = $matrixCodeType | 0; + $errorCorrected = $errorCorrected | 0; + $codeGlobalID_p = $codeGlobalID_p | 0; + var $$0 = 0, $$0$i = 0, $$max$0$i = 0, $$max$0$i$1 = 0, $$max$0$i$2 = 0, $100 = 0, $101 = 0, $102 = 0, $103 = 0, $107 = 0, $114 = 0, $118 = 0, $122 = 0, $126 = 0, $137 = 0, $14 = 0, $141 = 0, $147 = 0, $148 = 0, $149 = 0, $162 = 0, $166 = 0, $175 = 0, $178 = 0, $186 = 0, $188 = 0, $196 = 0, $20 = 0, $200 = 0, $204 = 0, $206 = 0, $211 = 0, $212 = 0, $213 = 0, $26 = 0, $29 = 0, $30 = 0, $34 = 0, $68 = 0, $8 = 0, $80 = 0, $81 = 0, $84 = 0, $93 = 0, $97 = 0, $bit$0$i28 = 0, $bit$1$i25 = 0, $bit$10$i43 = 0, $bit$11$i = 0, $bit$11$i$lcssa = 0, $bit$2$i = 0, $bit$2$i$lcssa = 0, $bit$3$i34 = 0, $bit$4$i31 = 0, $bit$5$i = 0, $bit$5$i$lcssa = 0, $bit$6$i40 = 0, $bit$7$i37 = 0, $bit$8$i = 0, $bit$8$i$lcssa = 0, $bit$9$i46 = 0, $code$i = 0, $contrastMin$0$i26 = 0, $contrastMin$1$i23 = 0, $contrastMin$10$i41 = 0, $contrastMin$11$i = 0, $contrastMin$11$i$lcssa = 0, $contrastMin$12$i = 0, $contrastMin$2$i = 0, $contrastMin$2$i$lcssa = 0, $contrastMin$3$i32 = 0, $contrastMin$4$i29 = 0, $contrastMin$5$i = 0, $contrastMin$5$i$lcssa = 0, $contrastMin$6$i38 = 0, $contrastMin$7$i35 = 0, $contrastMin$8$i = 0, $contrastMin$8$i$lcssa = 0, $contrastMin$9$i44 = 0, $corner$i = 0, $dirCode$i = 0, $errorCodeMtx$0 = 0, $errorCodePatt$0 = 0, $ext_patt = 0, $i$2$i$lcssa = 0, $i$2$i47 = 0, $i$3$i24 = 0, $i$4$i33 = 0, $i$4$off$i = 0, $i$5$i36 = 0, $i$6$i45 = 0, $i$6$off$i = 0, $j$0$i27 = 0, $j$0$off$i = 0, $j$1$i30 = 0, $j$2$i39 = 0, $j$2$off$i = 0, $j$3$i42 = 0, $min$1$i = 0, $min$1$i$1 = 0, $min$1$i$2 = 0, $or$cond4454$i = 0, $recd127$i = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 12448 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $dirCode$i = sp + 12440 | 0; + $corner$i = sp + 8 | 0; + $code$i = sp; + $recd127$i = sp + 12312 | 0; + $ext_patt = sp + 24 | 0; + do if (($pattDetectMode + -2 | 0) >>> 0 < 3) { + if (($matrixCodeType | 0) != 2830) { + $200 = $matrixCodeType & 255; + if ((_arPattGetImage2($imageProcMode, 2, $200, $200 * 3 | 0, $image, $xsize, $ysize, $pixelFormat, $paramLTf, $vertex, $pattRatio, $ext_patt) | 0) < 0) { + HEAP32[$codeMatrix >> 2] = -1; + $errorCodeMtx$0 = -6; + break; + } + $204 = _get_matrix_code($ext_patt, $200, $codeMatrix, $dirMatrix, $cfMatrix, $matrixCodeType, $errorCorrected) | 0; + if (!$codeGlobalID_p) { + $errorCodeMtx$0 = $204; + break; + } + $206 = $codeGlobalID_p; + HEAP32[$206 >> 2] = 0; + HEAP32[$206 + 4 >> 2] = 0; + $errorCodeMtx$0 = $204; + break; + } + if ((_arPattGetImage2($imageProcMode, 2, 14, 42, $image, $xsize, $ysize, $pixelFormat, $paramLTf, $vertex, .875, $ext_patt) | 0) < 0) { + HEAP32[$codeMatrix >> 2] = -1; + $errorCodeMtx$0 = -6; + break; + } + HEAP32[$corner$i >> 2] = 0; + HEAP32[$corner$i + 4 >> 2] = 182; + HEAP32[$corner$i + 8 >> 2] = 195; + HEAP32[$corner$i + 12 >> 2] = 13; + $8 = HEAP8[$ext_patt + (HEAP32[$corner$i >> 2] | 0) >> 0] | 0; + $$max$0$i = ($8 & 255) > 0 ? $8 : 0; + $min$1$i = ($8 & 255) < 255 ? $8 : -1; + $14 = HEAP8[$ext_patt + (HEAP32[$corner$i + 4 >> 2] | 0) >> 0] | 0; + $$max$0$i$1 = ($14 & 255) > ($$max$0$i & 255) ? $14 : $$max$0$i; + $min$1$i$1 = ($14 & 255) < ($min$1$i & 255) ? $14 : $min$1$i; + $20 = HEAP8[$ext_patt + (HEAP32[$corner$i + 8 >> 2] | 0) >> 0] | 0; + $$max$0$i$2 = ($20 & 255) > ($$max$0$i$1 & 255) ? $20 : $$max$0$i$1; + $min$1$i$2 = ($20 & 255) < ($min$1$i$1 & 255) ? $20 : $min$1$i$1; + $26 = HEAP8[$ext_patt + (HEAP32[$corner$i + 12 >> 2] | 0) >> 0] | 0; + $29 = (($26 & 255) > ($$max$0$i$2 & 255) ? $26 : $$max$0$i$2) & 255; + $30 = (($26 & 255) < ($min$1$i$2 & 255) ? $26 : $min$1$i$2) & 255; + L13 : do if (($29 - $30 | 0) < 30) { + HEAP32[$dirMatrix >> 2] = 0; + HEAPF64[$cfMatrix >> 3] = -1.0; + $$0$i = -2; + $186 = 0; + $188 = 0; + } else { + $34 = ($29 + $30 | 0) >>> 1; + HEAP8[$dirCode$i >> 0] = (HEAPU8[$ext_patt + (HEAP32[$corner$i >> 2] | 0) >> 0] | 0) >>> 0 < $34 >>> 0 & 1; + HEAP8[$dirCode$i + 1 >> 0] = (HEAPU8[$ext_patt + (HEAP32[$corner$i + 4 >> 2] | 0) >> 0] | 0) >>> 0 < $34 >>> 0 & 1; + HEAP8[$dirCode$i + 2 >> 0] = (HEAPU8[$ext_patt + (HEAP32[$corner$i + 8 >> 2] | 0) >> 0] | 0) >>> 0 < $34 >>> 0 & 1; + HEAP8[$dirCode$i + 3 >> 0] = (HEAPU8[$ext_patt + (HEAP32[$corner$i + 12 >> 2] | 0) >> 0] | 0) >>> 0 < $34 >>> 0 & 1; + $i$2$i47 = 0; + while (1) { + $68 = $i$2$i47 + 1 | 0; + if ((HEAP8[$dirCode$i + $i$2$i47 >> 0] | 0) == 1) if ((HEAP8[$dirCode$i + (($68 | 0) % 4 | 0) >> 0] | 0) == 1) if (!(HEAP8[$dirCode$i + (($i$2$i47 + 2 | 0) % 4 | 0) >> 0] | 0)) { + $i$2$i$lcssa = $i$2$i47; + break; + } + if (($68 | 0) < 4) $i$2$i47 = $68; else { + $i$2$i$lcssa = $68; + break; + } + } + switch ($i$2$i$lcssa | 0) { + case 4: + { + HEAP32[$dirMatrix >> 2] = 0; + HEAPF64[$cfMatrix >> 3] = -1.0; + $$0$i = -3; + $186 = 0; + $188 = 0; + break L13; + break; + } + case 0: + { + $bit$0$i28 = 119; + $contrastMin$0$i26 = 255; + $j$0$i27 = 0; + while (1) { + $j$0$off$i = $j$0$i27 + -3 | 0; + $80 = ($j$0$i27 & -2 | 0) == 12; + $81 = $j$0$i27 * 14 | 0; + $bit$1$i25 = $bit$0$i28; + $contrastMin$1$i23 = $contrastMin$0$i26; + $i$3$i24 = 0; + while (1) { + if (($i$3$i24 + -3 | $j$0$off$i) >>> 0 < 8) { + $bit$2$i = $bit$1$i25; + $contrastMin$2$i = $contrastMin$1$i23; + } else { + $84 = $i$3$i24 & -2; + if (($i$3$i24 | $j$0$i27) >>> 0 < 2) { + $bit$2$i = $bit$1$i25; + $contrastMin$2$i = $contrastMin$1$i23; + } else if ($80 & (($84 | 0) == 0 | ($84 | 0) == 12)) { + $bit$2$i = $bit$1$i25; + $contrastMin$2$i = $contrastMin$1$i23; + } else { + $93 = (HEAPU8[$ext_patt + ($i$3$i24 + $81) >> 0] | 0) - $34 | 0; + HEAP8[$recd127$i + $bit$1$i25 >> 0] = $93 >>> 31; + $97 = ($93 | 0) > -1 ? $93 : 0 - $93 | 0; + $bit$2$i = $bit$1$i25 + -1 | 0; + $contrastMin$2$i = ($97 | 0) < ($contrastMin$1$i23 | 0) ? $97 : $contrastMin$1$i23; + } + } + $i$3$i24 = $i$3$i24 + 1 | 0; + if (($i$3$i24 | 0) == 14) { + $bit$2$i$lcssa = $bit$2$i; + $contrastMin$2$i$lcssa = $contrastMin$2$i; + break; + } else { + $bit$1$i25 = $bit$2$i; + $contrastMin$1$i23 = $contrastMin$2$i; + } + } + $100 = $j$0$i27 + 1 | 0; + if (($100 | 0) == 14) { + $contrastMin$12$i = $contrastMin$2$i$lcssa; + break; + } else { + $bit$0$i28 = $bit$2$i$lcssa; + $contrastMin$0$i26 = $contrastMin$2$i$lcssa; + $j$0$i27 = $100; + } + } + break; + } + case 1: + { + $bit$3$i34 = 119; + $contrastMin$3$i32 = 255; + $i$4$i33 = 0; + while (1) { + $i$4$off$i = $i$4$i33 + -3 | 0; + $101 = $i$4$i33 & -2; + $102 = ($101 | 0) == 0; + $103 = ($101 | 0) == 12; + $bit$4$i31 = $bit$3$i34; + $contrastMin$4$i29 = $contrastMin$3$i32; + $j$1$i30 = 13; + while (1) { + if (($j$1$i30 + -3 | $i$4$off$i) >>> 0 < 8) { + $bit$5$i = $bit$4$i31; + $contrastMin$5$i = $contrastMin$4$i29; + } else { + $107 = ($j$1$i30 & -2 | 0) == 12; + if ($102 & $107) { + $bit$5$i = $bit$4$i31; + $contrastMin$5$i = $contrastMin$4$i29; + } else if ($103 & ($j$1$i30 >>> 0 < 2 | $107)) { + $bit$5$i = $bit$4$i31; + $contrastMin$5$i = $contrastMin$4$i29; + } else { + $114 = (HEAPU8[$ext_patt + (($j$1$i30 * 14 | 0) + $i$4$i33) >> 0] | 0) - $34 | 0; + HEAP8[$recd127$i + $bit$4$i31 >> 0] = $114 >>> 31; + $118 = ($114 | 0) > -1 ? $114 : 0 - $114 | 0; + $bit$5$i = $bit$4$i31 + -1 | 0; + $contrastMin$5$i = ($118 | 0) < ($contrastMin$4$i29 | 0) ? $118 : $contrastMin$4$i29; + } + } + if (($j$1$i30 | 0) > 0) { + $bit$4$i31 = $bit$5$i; + $contrastMin$4$i29 = $contrastMin$5$i; + $j$1$i30 = $j$1$i30 + -1 | 0; + } else { + $bit$5$i$lcssa = $bit$5$i; + $contrastMin$5$i$lcssa = $contrastMin$5$i; + break; + } + } + $122 = $i$4$i33 + 1 | 0; + if (($122 | 0) == 14) { + $contrastMin$12$i = $contrastMin$5$i$lcssa; + break; + } else { + $bit$3$i34 = $bit$5$i$lcssa; + $contrastMin$3$i32 = $contrastMin$5$i$lcssa; + $i$4$i33 = $122; + } + } + break; + } + case 2: + { + $bit$6$i40 = 119; + $contrastMin$6$i38 = 255; + $j$2$i39 = 13; + while (1) { + $j$2$off$i = $j$2$i39 + -3 | 0; + $or$cond4454$i = $j$2$i39 >>> 0 < 2 | ($j$2$i39 & -2 | 0) == 12; + $126 = $j$2$i39 * 14 | 0; + $bit$7$i37 = $bit$6$i40; + $contrastMin$7$i35 = $contrastMin$6$i38; + $i$5$i36 = 13; + while (1) { + if (($i$5$i36 + -3 | $j$2$off$i) >>> 0 < 8) { + $bit$8$i = $bit$7$i37; + $contrastMin$8$i = $contrastMin$7$i35; + } else if (($i$5$i36 | $j$2$i39) >>> 0 < 2 | $or$cond4454$i & ($i$5$i36 & -2 | 0) == 12) { + $bit$8$i = $bit$7$i37; + $contrastMin$8$i = $contrastMin$7$i35; + } else { + $137 = (HEAPU8[$ext_patt + ($i$5$i36 + $126) >> 0] | 0) - $34 | 0; + HEAP8[$recd127$i + $bit$7$i37 >> 0] = $137 >>> 31; + $141 = ($137 | 0) > -1 ? $137 : 0 - $137 | 0; + $bit$8$i = $bit$7$i37 + -1 | 0; + $contrastMin$8$i = ($141 | 0) < ($contrastMin$7$i35 | 0) ? $141 : $contrastMin$7$i35; + } + if (($i$5$i36 | 0) > 0) { + $bit$7$i37 = $bit$8$i; + $contrastMin$7$i35 = $contrastMin$8$i; + $i$5$i36 = $i$5$i36 + -1 | 0; + } else { + $bit$8$i$lcssa = $bit$8$i; + $contrastMin$8$i$lcssa = $contrastMin$8$i; + break; + } + } + if (($j$2$i39 | 0) > 0) { + $bit$6$i40 = $bit$8$i$lcssa; + $contrastMin$6$i38 = $contrastMin$8$i$lcssa; + $j$2$i39 = $j$2$i39 + -1 | 0; + } else { + $contrastMin$12$i = $contrastMin$8$i$lcssa; + break; + } + } + break; + } + case 3: + { + $bit$9$i46 = 119; + $contrastMin$9$i44 = 255; + $i$6$i45 = 13; + while (1) { + $i$6$off$i = $i$6$i45 + -3 | 0; + $147 = $i$6$i45 & -2; + $148 = ($147 | 0) == 12; + $149 = ($147 | 0) == 0; + $bit$10$i43 = $bit$9$i46; + $contrastMin$10$i41 = $contrastMin$9$i44; + $j$3$i42 = 0; + while (1) { + if (($j$3$i42 + -3 | $i$6$off$i) >>> 0 < 8) { + $bit$11$i = $bit$10$i43; + $contrastMin$11$i = $contrastMin$10$i41; + } else if ($148 & $j$3$i42 >>> 0 < 2 | ($j$3$i42 | $i$6$i45) >>> 0 < 2) { + $bit$11$i = $bit$10$i43; + $contrastMin$11$i = $contrastMin$10$i41; + } else if ($149 & ($j$3$i42 & -2 | 0) == 12) { + $bit$11$i = $bit$10$i43; + $contrastMin$11$i = $contrastMin$10$i41; + } else { + $162 = (HEAPU8[$ext_patt + (($j$3$i42 * 14 | 0) + $i$6$i45) >> 0] | 0) - $34 | 0; + HEAP8[$recd127$i + $bit$10$i43 >> 0] = $162 >>> 31; + $166 = ($162 | 0) > -1 ? $162 : 0 - $162 | 0; + $bit$11$i = $bit$10$i43 + -1 | 0; + $contrastMin$11$i = ($166 | 0) < ($contrastMin$10$i41 | 0) ? $166 : $contrastMin$10$i41; + } + $j$3$i42 = $j$3$i42 + 1 | 0; + if (($j$3$i42 | 0) == 14) { + $bit$11$i$lcssa = $bit$11$i; + $contrastMin$11$i$lcssa = $contrastMin$11$i; + break; + } else { + $bit$10$i43 = $bit$11$i; + $contrastMin$10$i41 = $contrastMin$11$i; + } + } + if (($i$6$i45 | 0) > 0) { + $bit$9$i46 = $bit$11$i$lcssa; + $contrastMin$9$i44 = $contrastMin$11$i$lcssa; + $i$6$i45 = $i$6$i45 + -1 | 0; + } else { + $contrastMin$12$i = $contrastMin$11$i$lcssa; + break; + } + } + break; + } + default: + $contrastMin$12$i = 255; + } + HEAP32[$dirMatrix >> 2] = $i$2$i$lcssa; + HEAPF64[$cfMatrix >> 3] = ($contrastMin$12$i | 0) > 30 ? 1.0 : +($contrastMin$12$i | 0) / 30.0; + $175 = _decode_bch(2830, 0, 0, $recd127$i, $code$i) | 0; + if (($175 | 0) < 0) { + $$0$i = -4; + $186 = 0; + $188 = 0; + } else { + if ($errorCorrected) HEAP32[$errorCorrected >> 2] = $175; + $178 = $code$i; + $$0$i = 0; + $186 = HEAP32[$178 >> 2] | 0; + $188 = HEAP32[$178 + 4 >> 2] | 0; + } + } while (0); + if (($$0$i | 0) < 0) { + HEAP32[$codeMatrix >> 2] = -1; + $errorCodeMtx$0 = $$0$i; + break; + } + if (($186 | 0) == -1 & ($188 | 0) == -1) { + HEAP32[$codeMatrix >> 2] = -1; + $errorCodeMtx$0 = -5; + break; + } + HEAP32[$codeMatrix >> 2] = ($186 & -32768 | 0) == 0 & 0 == 0 ? $186 & 32767 : 0; + if (!$codeGlobalID_p) $errorCodeMtx$0 = 0; else { + $196 = $codeGlobalID_p; + HEAP32[$196 >> 2] = $186; + HEAP32[$196 + 4 >> 2] = $188; + $errorCodeMtx$0 = 0; + } + } else $errorCodeMtx$0 = 1; while (0); + L78 : do switch ($pattDetectMode | 0) { + case 0: + case 1: + case 3: + case 4: + { + if (!$pattHandle) { + HEAP32[$codePatt >> 2] = -1; + $errorCodePatt$0 = -1; + break L78; + } + $211 = $pattHandle + 28 | 0; + $212 = HEAP32[$211 >> 2] | 0; + $213 = $212 << 2; + switch ($pattDetectMode | 0) { + case 0: + case 3: + { + if ((_arPattGetImage2($imageProcMode, 0, $212, $213, $image, $xsize, $ysize, $pixelFormat, $paramLTf, $vertex, $pattRatio, $ext_patt) | 0) < 0) { + HEAP32[$codePatt >> 2] = -1; + $errorCodePatt$0 = -6; + break L78; + } else { + $errorCodePatt$0 = _pattern_match($pattHandle, 0, $ext_patt, HEAP32[$211 >> 2] | 0, $codePatt, $dirPatt, $cfPatt) | 0; + break L78; + } + break; + } + default: + if ((_arPattGetImage2($imageProcMode, 1, $212, $213, $image, $xsize, $ysize, $pixelFormat, $paramLTf, $vertex, $pattRatio, $ext_patt) | 0) < 0) { + HEAP32[$codePatt >> 2] = -1; + $errorCodePatt$0 = -6; + break L78; + } else { + $errorCodePatt$0 = _pattern_match($pattHandle, 1, $ext_patt, HEAP32[$211 >> 2] | 0, $codePatt, $dirPatt, $cfPatt) | 0; + break L78; + } + } + break; + } + default: + $errorCodePatt$0 = 1; + } while (0); + if (($errorCodeMtx$0 | 0) == 1) $$0 = $errorCodePatt$0; else if (($errorCodePatt$0 | 0) == 1) $$0 = $errorCodeMtx$0; else $$0 = ($errorCodePatt$0 & $errorCodeMtx$0 | 0) < 0 ? $errorCodePatt$0 : 0; + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubEWR3CA4444($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $0 = 0, $1 = 0, $10 = 0, $102 = 0, $108 = 0, $113 = 0, $116 = 0, $133 = 0, $135 = 0, $137 = 0, $141 = 0, $145 = 0, $148 = 0, $150 = 0, $154 = 0, $158 = 0, $162 = 0, $167 = 0, $169 = 0, $17 = 0, $173 = 0, $177 = 0, $18 = 0, $181 = 0, $187 = 0, $19 = 0, $190 = 0, $192 = 0, $196 = 0, $200 = 0, $204 = 0, $207 = 0, $212 = 0, $227 = 0, $228 = 0, $229 = 0, $236 = 0, $238 = 0, $244 = 0, $248 = 0, $249 = 0, $256 = 0, $27 = 0, $270 = 0, $271 = 0, $274 = 0, $281 = 0, $282 = 0, $29 = 0, $290 = 0, $293 = 0, $294 = 0, $298 = 0, $301 = 0, $305 = 0, $308 = 0, $312 = 0, $315 = 0, $319 = 0, $323 = 0, $326 = 0, $327 = 0, $333 = 0, $42 = 0, $45 = 0, $47 = 0, $51 = 0, $55 = 0, $61 = 0, $62 = 0, $65 = 0, $66 = 0, $67 = 0, $70 = 0, $73 = 0, $9 = 0, $90 = 0, $92 = 0, $94 = 0, $98 = 0, $dpnt$077 = 0, $dpnt$1$lcssa = 0, $dpnt$166 = 0, $i$088 = 0, $i$182 = 0, $i$264 = 0, $i$341 = 0, $i$439 = 0, $i$537 = 0, $i$636 = 0, $j$075 = 0, $j$1$lcssa = 0, $j$142 = 0, $j$2 = 0, $k$055 = 0, $k$152 = 0, $k$248 = 0, $k$345 = 0, $pnt$079 = 0, $pnt$1$lcssa = 0, $pnt$168 = 0, $pnt1$090 = 0, $pnt1$184 = 0, $pnt2$089 = 0, $pnt2$183 = 0, $pnt2$278 = 0, $pnt2$3$lcssa = 0, $pnt2$367 = 0, $vararg_buffer = 0, $wk$056 = 0, $wk$153 = 0, $wk$249 = 0, $wk$346 = 0, $wk$443 = 0, $wk_max$0$lcssa = 0, $wk_max$074 = 0, $wk_max$1$lcssa = 0, $wk_max$159 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = HEAP32[$labelInfo >> 2] | 0; + $1 = $ysize + -1 | 0; + if (($xsize | 0) > 0) { + $i$088 = 0; + $pnt1$090 = $0; + $pnt2$089 = $0 + ((Math_imul($1, $xsize) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$089 >> 1] = 0; + HEAP16[$pnt1$090 >> 1] = 0; + $i$088 = $i$088 + 1 | 0; + if (($i$088 | 0) >= ($xsize | 0)) break; else { + $pnt1$090 = $pnt1$090 + 2 | 0; + $pnt2$089 = $pnt2$089 + 2 | 0; + } + } + } + $9 = $labelingThresh * 3 | 0; + $10 = $xsize + -1 | 0; + if (($ysize | 0) > 0) { + $i$182 = 0; + $pnt1$184 = $0; + $pnt2$183 = $0 + ($10 << 1) | 0; + while (1) { + HEAP16[$pnt2$183 >> 1] = 0; + HEAP16[$pnt1$184 >> 1] = 0; + $i$182 = $i$182 + 1 | 0; + if (($i$182 | 0) >= ($ysize | 0)) break; else { + $pnt1$184 = $pnt1$184 + ($xsize << 1) | 0; + $pnt2$183 = $pnt2$183 + ($xsize << 1) | 0; + } + } + } + $17 = $labelInfo + 1179664 | 0; + $18 = $xsize + 1 | 0; + $19 = 0 - $xsize | 0; + $$sum = 1 - $xsize | 0; + $$sum1 = ~$xsize; + L11 : do if (($1 | 0) > 1) { + $27 = ($10 | 0) > 1; + $dpnt$077 = (HEAP32[$labelInfo + 4 >> 2] | 0) + $18 | 0; + $j$075 = 1; + $pnt$079 = $image + ($18 << 1) | 0; + $pnt2$278 = $0 + ($18 << 1) | 0; + $wk_max$074 = 0; + L13 : while (1) { + if ($27) { + $dpnt$166 = $dpnt$077; + $i$264 = 1; + $pnt$168 = $pnt$079; + $pnt2$367 = $pnt2$278; + $wk_max$159 = $wk_max$074; + while (1) { + $29 = HEAPU8[$pnt$168 >> 0] | 0; + do if ((($29 & 240) + 24 + ($29 << 4 & 240) + ((HEAPU8[$pnt$168 + 1 >> 0] | 0) & 240) | 0) > ($9 | 0)) { + HEAP8[$dpnt$166 >> 0] = -1; + $42 = HEAP16[$pnt2$367 + ($19 << 1) >> 1] | 0; + if ($42 << 16 >> 16 > 0) { + HEAP16[$pnt2$367 >> 1] = $42; + $45 = ($42 << 16 >> 16) * 7 | 0; + $47 = $labelInfo + 1310736 + ($45 + -7 << 2) | 0; + HEAP32[$47 >> 2] = (HEAP32[$47 >> 2] | 0) + 1; + $51 = $labelInfo + 1310736 + ($45 + -6 << 2) | 0; + HEAP32[$51 >> 2] = (HEAP32[$51 >> 2] | 0) + $i$264; + $55 = $labelInfo + 1310736 + ($45 + -5 << 2) | 0; + HEAP32[$55 >> 2] = (HEAP32[$55 >> 2] | 0) + $j$075; + HEAP32[$labelInfo + 1310736 + ($45 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $61 = HEAP16[$pnt2$367 + ($$sum << 1) >> 1] | 0; + $62 = $61 << 16 >> 16; + $65 = HEAP16[$pnt2$367 + ($$sum1 << 1) >> 1] | 0; + $66 = $65 << 16 >> 16; + $67 = $65 << 16 >> 16 > 0; + if ($61 << 16 >> 16 <= 0) { + if ($67) { + HEAP16[$pnt2$367 >> 1] = $65; + $167 = $66 * 7 | 0; + $169 = $labelInfo + 1310736 + ($167 + -7 << 2) | 0; + HEAP32[$169 >> 2] = (HEAP32[$169 >> 2] | 0) + 1; + $173 = $labelInfo + 1310736 + ($167 + -6 << 2) | 0; + HEAP32[$173 >> 2] = (HEAP32[$173 >> 2] | 0) + $i$264; + $177 = $labelInfo + 1310736 + ($167 + -5 << 2) | 0; + HEAP32[$177 >> 2] = (HEAP32[$177 >> 2] | 0) + $j$075; + $181 = $labelInfo + 1310736 + ($167 + -3 << 2) | 0; + if ((HEAP32[$181 >> 2] | 0) < ($i$264 | 0)) HEAP32[$181 >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($167 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $187 = HEAP16[$pnt2$367 + -2 >> 1] | 0; + if ($187 << 16 >> 16 > 0) { + HEAP16[$pnt2$367 >> 1] = $187; + $190 = ($187 << 16 >> 16) * 7 | 0; + $192 = $labelInfo + 1310736 + ($190 + -7 << 2) | 0; + HEAP32[$192 >> 2] = (HEAP32[$192 >> 2] | 0) + 1; + $196 = $labelInfo + 1310736 + ($190 + -6 << 2) | 0; + HEAP32[$196 >> 2] = (HEAP32[$196 >> 2] | 0) + $i$264; + $200 = $labelInfo + 1310736 + ($190 + -5 << 2) | 0; + HEAP32[$200 >> 2] = (HEAP32[$200 >> 2] | 0) + $j$075; + $204 = $labelInfo + 1310736 + ($190 + -3 << 2) | 0; + if ((HEAP32[$204 >> 2] | 0) >= ($i$264 | 0)) { + $wk_max$2 = $wk_max$159; + break; + } + HEAP32[$204 >> 2] = $i$264; + $wk_max$2 = $wk_max$159; + break; + } else { + $207 = $wk_max$159 + 1 | 0; + if (($wk_max$159 | 0) > 32767) break L13; + HEAP16[$pnt2$367 >> 1] = $207; + HEAP32[$labelInfo + 1179664 + ($wk_max$159 << 2) >> 2] = $207 << 16 >> 16; + $212 = $wk_max$159 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($212 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($212 + 1 << 2) >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($212 + 2 << 2) >> 2] = $j$075; + HEAP32[$labelInfo + 1310736 + ($212 + 3 << 2) >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($212 + 4 << 2) >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($212 + 5 << 2) >> 2] = $j$075; + HEAP32[$labelInfo + 1310736 + ($212 + 6 << 2) >> 2] = $j$075; + $wk_max$2 = $207; + break; + } + } + if ($67) { + $70 = HEAP32[$labelInfo + 1179664 + ($62 + -1 << 2) >> 2] | 0; + $73 = HEAP32[$labelInfo + 1179664 + ($66 + -1 << 2) >> 2] | 0; + if (($70 | 0) > ($73 | 0)) { + HEAP16[$pnt2$367 >> 1] = $73; + if (($wk_max$159 | 0) > 0) { + $k$055 = 0; + $wk$056 = $17; + while (1) { + if ((HEAP32[$wk$056 >> 2] | 0) == ($70 | 0)) HEAP32[$wk$056 >> 2] = $73; + $k$055 = $k$055 + 1 | 0; + if (($k$055 | 0) >= ($wk_max$159 | 0)) { + $90 = $73; + break; + } else $wk$056 = $wk$056 + 4 | 0; + } + } else $90 = $73; + } else { + HEAP16[$pnt2$367 >> 1] = $70; + if (($70 | 0) < ($73 | 0) & ($wk_max$159 | 0) > 0) { + $k$152 = 0; + $wk$153 = $17; + while (1) { + if ((HEAP32[$wk$153 >> 2] | 0) == ($73 | 0)) HEAP32[$wk$153 >> 2] = $70; + $k$152 = $k$152 + 1 | 0; + if (($k$152 | 0) >= ($wk_max$159 | 0)) { + $90 = $70; + break; + } else $wk$153 = $wk$153 + 4 | 0; + } + } else $90 = $70; + } + $92 = ($90 << 16 >> 16) * 7 | 0; + $94 = $labelInfo + 1310736 + ($92 + -7 << 2) | 0; + HEAP32[$94 >> 2] = (HEAP32[$94 >> 2] | 0) + 1; + $98 = $labelInfo + 1310736 + ($92 + -6 << 2) | 0; + HEAP32[$98 >> 2] = (HEAP32[$98 >> 2] | 0) + $i$264; + $102 = $labelInfo + 1310736 + ($92 + -5 << 2) | 0; + HEAP32[$102 >> 2] = (HEAP32[$102 >> 2] | 0) + $j$075; + HEAP32[$labelInfo + 1310736 + ($92 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $108 = HEAP16[$pnt2$367 + -2 >> 1] | 0; + if ($108 << 16 >> 16 <= 0) { + HEAP16[$pnt2$367 >> 1] = $61; + $148 = $62 * 7 | 0; + $150 = $labelInfo + 1310736 + ($148 + -7 << 2) | 0; + HEAP32[$150 >> 2] = (HEAP32[$150 >> 2] | 0) + 1; + $154 = $labelInfo + 1310736 + ($148 + -6 << 2) | 0; + HEAP32[$154 >> 2] = (HEAP32[$154 >> 2] | 0) + $i$264; + $158 = $labelInfo + 1310736 + ($148 + -5 << 2) | 0; + HEAP32[$158 >> 2] = (HEAP32[$158 >> 2] | 0) + $j$075; + $162 = $labelInfo + 1310736 + ($148 + -4 << 2) | 0; + if ((HEAP32[$162 >> 2] | 0) > ($i$264 | 0)) HEAP32[$162 >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($148 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $113 = HEAP32[$labelInfo + 1179664 + ($62 + -1 << 2) >> 2] | 0; + $116 = HEAP32[$labelInfo + 1179664 + (($108 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($113 | 0) > ($116 | 0)) { + HEAP16[$pnt2$367 >> 1] = $116; + if (($wk_max$159 | 0) > 0) { + $k$248 = 0; + $wk$249 = $17; + while (1) { + if ((HEAP32[$wk$249 >> 2] | 0) == ($113 | 0)) HEAP32[$wk$249 >> 2] = $116; + $k$248 = $k$248 + 1 | 0; + if (($k$248 | 0) >= ($wk_max$159 | 0)) { + $133 = $116; + break; + } else $wk$249 = $wk$249 + 4 | 0; + } + } else $133 = $116; + } else { + HEAP16[$pnt2$367 >> 1] = $113; + if (($113 | 0) < ($116 | 0) & ($wk_max$159 | 0) > 0) { + $k$345 = 0; + $wk$346 = $17; + while (1) { + if ((HEAP32[$wk$346 >> 2] | 0) == ($116 | 0)) HEAP32[$wk$346 >> 2] = $113; + $k$345 = $k$345 + 1 | 0; + if (($k$345 | 0) >= ($wk_max$159 | 0)) { + $133 = $113; + break; + } else $wk$346 = $wk$346 + 4 | 0; + } + } else $133 = $113; + } + $135 = ($133 << 16 >> 16) * 7 | 0; + $137 = $labelInfo + 1310736 + ($135 + -7 << 2) | 0; + HEAP32[$137 >> 2] = (HEAP32[$137 >> 2] | 0) + 1; + $141 = $labelInfo + 1310736 + ($135 + -6 << 2) | 0; + HEAP32[$141 >> 2] = (HEAP32[$141 >> 2] | 0) + $i$264; + $145 = $labelInfo + 1310736 + ($135 + -5 << 2) | 0; + HEAP32[$145 >> 2] = (HEAP32[$145 >> 2] | 0) + $j$075; + $wk_max$2 = $wk_max$159; + } else { + HEAP16[$pnt2$367 >> 1] = 0; + HEAP8[$dpnt$166 >> 0] = 0; + $wk_max$2 = $wk_max$159; + } while (0); + $i$264 = $i$264 + 1 | 0; + $227 = $pnt$168 + 2 | 0; + $228 = $pnt2$367 + 2 | 0; + $229 = $dpnt$166 + 1 | 0; + if (($i$264 | 0) >= ($10 | 0)) { + $dpnt$1$lcssa = $229; + $pnt$1$lcssa = $227; + $pnt2$3$lcssa = $228; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $dpnt$166 = $229; + $pnt$168 = $227; + $pnt2$367 = $228; + $wk_max$159 = $wk_max$2; + } + } + } else { + $dpnt$1$lcssa = $dpnt$077; + $pnt$1$lcssa = $pnt$079; + $pnt2$3$lcssa = $pnt2$278; + $wk_max$1$lcssa = $wk_max$074; + } + $j$075 = $j$075 + 1 | 0; + if (($j$075 | 0) >= ($1 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $dpnt$077 = $dpnt$1$lcssa + 2 | 0; + $pnt$079 = $pnt$1$lcssa + 4 | 0; + $pnt2$278 = $pnt2$3$lcssa + 4 | 0; + $wk_max$074 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $236 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$341 = 1; + $j$142 = 1; + $wk$443 = $17; + while (1) { + $238 = HEAP32[$wk$443 >> 2] | 0; + if (($238 | 0) == ($i$341 | 0)) { + $244 = $j$142; + $j$2 = $j$142 + 1 | 0; + } else { + $244 = HEAP32[$labelInfo + 1179664 + ($238 + -1 << 2) >> 2] | 0; + $j$2 = $j$142; + } + HEAP32[$wk$443 >> 2] = $244; + if (($i$341 | 0) < ($wk_max$0$lcssa | 0)) { + $i$341 = $i$341 + 1 | 0; + $j$142 = $j$2; + $wk$443 = $wk$443 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $248 = $labelInfo + 8 | 0; + $249 = $j$1$lcssa + -1 | 0; + HEAP32[$248 >> 2] = $249; + if (!$249) $$0 = 0; else { + _memset($236 | 0, 0, $249 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $249 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$439 = 0; + do { + $256 = $i$439 << 2; + HEAP32[$labelInfo + 131084 + ($256 << 2) >> 2] = $xsize; + HEAP32[$labelInfo + 131084 + (($256 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($256 | 2) << 2) >> 2] = $ysize; + HEAP32[$labelInfo + 131084 + (($256 | 3) << 2) >> 2] = 0; + $i$439 = $i$439 + 1 | 0; + } while (($i$439 | 0) < (HEAP32[$248 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$537 = 0; + do { + $270 = (HEAP32[$labelInfo + 1179664 + ($i$537 << 2) >> 2] | 0) + -1 | 0; + $271 = $i$537 * 7 | 0; + $274 = $labelInfo + 12 + ($270 << 2) | 0; + HEAP32[$274 >> 2] = (HEAP32[$274 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($271 << 2) >> 2] | 0); + $281 = $270 << 1; + $282 = $labelInfo + 655376 + ($281 << 3) | 0; + HEAPF64[$282 >> 3] = +HEAPF64[$282 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($271 + 1 << 2) >> 2] | 0); + $290 = $labelInfo + 655376 + (($281 | 1) << 3) | 0; + HEAPF64[$290 >> 3] = +HEAPF64[$290 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($271 + 2 << 2) >> 2] | 0); + $293 = $270 << 2; + $294 = $labelInfo + 131084 + ($293 << 2) | 0; + $298 = HEAP32[$labelInfo + 1310736 + ($271 + 3 << 2) >> 2] | 0; + if ((HEAP32[$294 >> 2] | 0) > ($298 | 0)) HEAP32[$294 >> 2] = $298; + $301 = $labelInfo + 131084 + (($293 | 1) << 2) | 0; + $305 = HEAP32[$labelInfo + 1310736 + ($271 + 4 << 2) >> 2] | 0; + if ((HEAP32[$301 >> 2] | 0) < ($305 | 0)) HEAP32[$301 >> 2] = $305; + $308 = $labelInfo + 131084 + (($293 | 2) << 2) | 0; + $312 = HEAP32[$labelInfo + 1310736 + ($271 + 5 << 2) >> 2] | 0; + if ((HEAP32[$308 >> 2] | 0) > ($312 | 0)) HEAP32[$308 >> 2] = $312; + $315 = $labelInfo + 131084 + (($293 | 3) << 2) | 0; + $319 = HEAP32[$labelInfo + 1310736 + ($271 + 6 << 2) >> 2] | 0; + if ((HEAP32[$315 >> 2] | 0) < ($319 | 0)) HEAP32[$315 >> 2] = $319; + $i$537 = $i$537 + 1 | 0; + } while (($i$537 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$248 >> 2] | 0) > 0) { + $i$636 = 0; + do { + $323 = $labelInfo + 12 + ($i$636 << 2) | 0; + $326 = $i$636 << 1; + $327 = $labelInfo + 655376 + ($326 << 3) | 0; + HEAPF64[$327 >> 3] = +HEAPF64[$327 >> 3] / +(HEAP32[$323 >> 2] | 0); + $333 = $labelInfo + 655376 + (($326 | 1) << 3) | 0; + HEAPF64[$333 >> 3] = +HEAPF64[$333 >> 3] / +(HEAP32[$323 >> 2] | 0); + $i$636 = $i$636 + 1 | 0; + } while (($i$636 | 0) < (HEAP32[$248 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubEBR3CA4444($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $0 = 0, $1 = 0, $10 = 0, $102 = 0, $108 = 0, $113 = 0, $116 = 0, $133 = 0, $135 = 0, $137 = 0, $141 = 0, $145 = 0, $148 = 0, $150 = 0, $154 = 0, $158 = 0, $162 = 0, $167 = 0, $169 = 0, $17 = 0, $173 = 0, $177 = 0, $18 = 0, $181 = 0, $187 = 0, $19 = 0, $190 = 0, $192 = 0, $196 = 0, $200 = 0, $204 = 0, $207 = 0, $212 = 0, $227 = 0, $228 = 0, $229 = 0, $236 = 0, $238 = 0, $244 = 0, $248 = 0, $249 = 0, $256 = 0, $27 = 0, $270 = 0, $271 = 0, $274 = 0, $281 = 0, $282 = 0, $29 = 0, $290 = 0, $293 = 0, $294 = 0, $298 = 0, $301 = 0, $305 = 0, $308 = 0, $312 = 0, $315 = 0, $319 = 0, $323 = 0, $326 = 0, $327 = 0, $333 = 0, $42 = 0, $45 = 0, $47 = 0, $51 = 0, $55 = 0, $61 = 0, $62 = 0, $65 = 0, $66 = 0, $67 = 0, $70 = 0, $73 = 0, $9 = 0, $90 = 0, $92 = 0, $94 = 0, $98 = 0, $dpnt$077 = 0, $dpnt$1$lcssa = 0, $dpnt$166 = 0, $i$088 = 0, $i$182 = 0, $i$264 = 0, $i$341 = 0, $i$439 = 0, $i$537 = 0, $i$636 = 0, $j$075 = 0, $j$1$lcssa = 0, $j$142 = 0, $j$2 = 0, $k$055 = 0, $k$152 = 0, $k$248 = 0, $k$345 = 0, $pnt$079 = 0, $pnt$1$lcssa = 0, $pnt$168 = 0, $pnt1$090 = 0, $pnt1$184 = 0, $pnt2$089 = 0, $pnt2$183 = 0, $pnt2$278 = 0, $pnt2$3$lcssa = 0, $pnt2$367 = 0, $vararg_buffer = 0, $wk$056 = 0, $wk$153 = 0, $wk$249 = 0, $wk$346 = 0, $wk$443 = 0, $wk_max$0$lcssa = 0, $wk_max$074 = 0, $wk_max$1$lcssa = 0, $wk_max$159 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = HEAP32[$labelInfo >> 2] | 0; + $1 = $ysize + -1 | 0; + if (($xsize | 0) > 0) { + $i$088 = 0; + $pnt1$090 = $0; + $pnt2$089 = $0 + ((Math_imul($1, $xsize) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$089 >> 1] = 0; + HEAP16[$pnt1$090 >> 1] = 0; + $i$088 = $i$088 + 1 | 0; + if (($i$088 | 0) >= ($xsize | 0)) break; else { + $pnt1$090 = $pnt1$090 + 2 | 0; + $pnt2$089 = $pnt2$089 + 2 | 0; + } + } + } + $9 = $labelingThresh * 3 | 0; + $10 = $xsize + -1 | 0; + if (($ysize | 0) > 0) { + $i$182 = 0; + $pnt1$184 = $0; + $pnt2$183 = $0 + ($10 << 1) | 0; + while (1) { + HEAP16[$pnt2$183 >> 1] = 0; + HEAP16[$pnt1$184 >> 1] = 0; + $i$182 = $i$182 + 1 | 0; + if (($i$182 | 0) >= ($ysize | 0)) break; else { + $pnt1$184 = $pnt1$184 + ($xsize << 1) | 0; + $pnt2$183 = $pnt2$183 + ($xsize << 1) | 0; + } + } + } + $17 = $labelInfo + 1179664 | 0; + $18 = $xsize + 1 | 0; + $19 = 0 - $xsize | 0; + $$sum = 1 - $xsize | 0; + $$sum1 = ~$xsize; + L11 : do if (($1 | 0) > 1) { + $27 = ($10 | 0) > 1; + $dpnt$077 = (HEAP32[$labelInfo + 4 >> 2] | 0) + $18 | 0; + $j$075 = 1; + $pnt$079 = $image + ($18 << 1) | 0; + $pnt2$278 = $0 + ($18 << 1) | 0; + $wk_max$074 = 0; + L13 : while (1) { + if ($27) { + $dpnt$166 = $dpnt$077; + $i$264 = 1; + $pnt$168 = $pnt$079; + $pnt2$367 = $pnt2$278; + $wk_max$159 = $wk_max$074; + while (1) { + $29 = HEAPU8[$pnt$168 >> 0] | 0; + do if ((($29 & 240) + 24 + ($29 << 4 & 240) + ((HEAPU8[$pnt$168 + 1 >> 0] | 0) & 240) | 0) > ($9 | 0)) { + HEAP16[$pnt2$367 >> 1] = 0; + HEAP8[$dpnt$166 >> 0] = 0; + $wk_max$2 = $wk_max$159; + } else { + HEAP8[$dpnt$166 >> 0] = -1; + $42 = HEAP16[$pnt2$367 + ($19 << 1) >> 1] | 0; + if ($42 << 16 >> 16 > 0) { + HEAP16[$pnt2$367 >> 1] = $42; + $45 = ($42 << 16 >> 16) * 7 | 0; + $47 = $labelInfo + 1310736 + ($45 + -7 << 2) | 0; + HEAP32[$47 >> 2] = (HEAP32[$47 >> 2] | 0) + 1; + $51 = $labelInfo + 1310736 + ($45 + -6 << 2) | 0; + HEAP32[$51 >> 2] = (HEAP32[$51 >> 2] | 0) + $i$264; + $55 = $labelInfo + 1310736 + ($45 + -5 << 2) | 0; + HEAP32[$55 >> 2] = (HEAP32[$55 >> 2] | 0) + $j$075; + HEAP32[$labelInfo + 1310736 + ($45 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $61 = HEAP16[$pnt2$367 + ($$sum << 1) >> 1] | 0; + $62 = $61 << 16 >> 16; + $65 = HEAP16[$pnt2$367 + ($$sum1 << 1) >> 1] | 0; + $66 = $65 << 16 >> 16; + $67 = $65 << 16 >> 16 > 0; + if ($61 << 16 >> 16 <= 0) { + if ($67) { + HEAP16[$pnt2$367 >> 1] = $65; + $167 = $66 * 7 | 0; + $169 = $labelInfo + 1310736 + ($167 + -7 << 2) | 0; + HEAP32[$169 >> 2] = (HEAP32[$169 >> 2] | 0) + 1; + $173 = $labelInfo + 1310736 + ($167 + -6 << 2) | 0; + HEAP32[$173 >> 2] = (HEAP32[$173 >> 2] | 0) + $i$264; + $177 = $labelInfo + 1310736 + ($167 + -5 << 2) | 0; + HEAP32[$177 >> 2] = (HEAP32[$177 >> 2] | 0) + $j$075; + $181 = $labelInfo + 1310736 + ($167 + -3 << 2) | 0; + if ((HEAP32[$181 >> 2] | 0) < ($i$264 | 0)) HEAP32[$181 >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($167 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $187 = HEAP16[$pnt2$367 + -2 >> 1] | 0; + if ($187 << 16 >> 16 > 0) { + HEAP16[$pnt2$367 >> 1] = $187; + $190 = ($187 << 16 >> 16) * 7 | 0; + $192 = $labelInfo + 1310736 + ($190 + -7 << 2) | 0; + HEAP32[$192 >> 2] = (HEAP32[$192 >> 2] | 0) + 1; + $196 = $labelInfo + 1310736 + ($190 + -6 << 2) | 0; + HEAP32[$196 >> 2] = (HEAP32[$196 >> 2] | 0) + $i$264; + $200 = $labelInfo + 1310736 + ($190 + -5 << 2) | 0; + HEAP32[$200 >> 2] = (HEAP32[$200 >> 2] | 0) + $j$075; + $204 = $labelInfo + 1310736 + ($190 + -3 << 2) | 0; + if ((HEAP32[$204 >> 2] | 0) >= ($i$264 | 0)) { + $wk_max$2 = $wk_max$159; + break; + } + HEAP32[$204 >> 2] = $i$264; + $wk_max$2 = $wk_max$159; + break; + } else { + $207 = $wk_max$159 + 1 | 0; + if (($wk_max$159 | 0) > 32767) break L13; + HEAP16[$pnt2$367 >> 1] = $207; + HEAP32[$labelInfo + 1179664 + ($wk_max$159 << 2) >> 2] = $207 << 16 >> 16; + $212 = $wk_max$159 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($212 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($212 + 1 << 2) >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($212 + 2 << 2) >> 2] = $j$075; + HEAP32[$labelInfo + 1310736 + ($212 + 3 << 2) >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($212 + 4 << 2) >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($212 + 5 << 2) >> 2] = $j$075; + HEAP32[$labelInfo + 1310736 + ($212 + 6 << 2) >> 2] = $j$075; + $wk_max$2 = $207; + break; + } + } + if ($67) { + $70 = HEAP32[$labelInfo + 1179664 + ($62 + -1 << 2) >> 2] | 0; + $73 = HEAP32[$labelInfo + 1179664 + ($66 + -1 << 2) >> 2] | 0; + if (($70 | 0) > ($73 | 0)) { + HEAP16[$pnt2$367 >> 1] = $73; + if (($wk_max$159 | 0) > 0) { + $k$055 = 0; + $wk$056 = $17; + while (1) { + if ((HEAP32[$wk$056 >> 2] | 0) == ($70 | 0)) HEAP32[$wk$056 >> 2] = $73; + $k$055 = $k$055 + 1 | 0; + if (($k$055 | 0) >= ($wk_max$159 | 0)) { + $90 = $73; + break; + } else $wk$056 = $wk$056 + 4 | 0; + } + } else $90 = $73; + } else { + HEAP16[$pnt2$367 >> 1] = $70; + if (($70 | 0) < ($73 | 0) & ($wk_max$159 | 0) > 0) { + $k$152 = 0; + $wk$153 = $17; + while (1) { + if ((HEAP32[$wk$153 >> 2] | 0) == ($73 | 0)) HEAP32[$wk$153 >> 2] = $70; + $k$152 = $k$152 + 1 | 0; + if (($k$152 | 0) >= ($wk_max$159 | 0)) { + $90 = $70; + break; + } else $wk$153 = $wk$153 + 4 | 0; + } + } else $90 = $70; + } + $92 = ($90 << 16 >> 16) * 7 | 0; + $94 = $labelInfo + 1310736 + ($92 + -7 << 2) | 0; + HEAP32[$94 >> 2] = (HEAP32[$94 >> 2] | 0) + 1; + $98 = $labelInfo + 1310736 + ($92 + -6 << 2) | 0; + HEAP32[$98 >> 2] = (HEAP32[$98 >> 2] | 0) + $i$264; + $102 = $labelInfo + 1310736 + ($92 + -5 << 2) | 0; + HEAP32[$102 >> 2] = (HEAP32[$102 >> 2] | 0) + $j$075; + HEAP32[$labelInfo + 1310736 + ($92 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $108 = HEAP16[$pnt2$367 + -2 >> 1] | 0; + if ($108 << 16 >> 16 <= 0) { + HEAP16[$pnt2$367 >> 1] = $61; + $148 = $62 * 7 | 0; + $150 = $labelInfo + 1310736 + ($148 + -7 << 2) | 0; + HEAP32[$150 >> 2] = (HEAP32[$150 >> 2] | 0) + 1; + $154 = $labelInfo + 1310736 + ($148 + -6 << 2) | 0; + HEAP32[$154 >> 2] = (HEAP32[$154 >> 2] | 0) + $i$264; + $158 = $labelInfo + 1310736 + ($148 + -5 << 2) | 0; + HEAP32[$158 >> 2] = (HEAP32[$158 >> 2] | 0) + $j$075; + $162 = $labelInfo + 1310736 + ($148 + -4 << 2) | 0; + if ((HEAP32[$162 >> 2] | 0) > ($i$264 | 0)) HEAP32[$162 >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($148 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $113 = HEAP32[$labelInfo + 1179664 + ($62 + -1 << 2) >> 2] | 0; + $116 = HEAP32[$labelInfo + 1179664 + (($108 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($113 | 0) > ($116 | 0)) { + HEAP16[$pnt2$367 >> 1] = $116; + if (($wk_max$159 | 0) > 0) { + $k$248 = 0; + $wk$249 = $17; + while (1) { + if ((HEAP32[$wk$249 >> 2] | 0) == ($113 | 0)) HEAP32[$wk$249 >> 2] = $116; + $k$248 = $k$248 + 1 | 0; + if (($k$248 | 0) >= ($wk_max$159 | 0)) { + $133 = $116; + break; + } else $wk$249 = $wk$249 + 4 | 0; + } + } else $133 = $116; + } else { + HEAP16[$pnt2$367 >> 1] = $113; + if (($113 | 0) < ($116 | 0) & ($wk_max$159 | 0) > 0) { + $k$345 = 0; + $wk$346 = $17; + while (1) { + if ((HEAP32[$wk$346 >> 2] | 0) == ($116 | 0)) HEAP32[$wk$346 >> 2] = $113; + $k$345 = $k$345 + 1 | 0; + if (($k$345 | 0) >= ($wk_max$159 | 0)) { + $133 = $113; + break; + } else $wk$346 = $wk$346 + 4 | 0; + } + } else $133 = $113; + } + $135 = ($133 << 16 >> 16) * 7 | 0; + $137 = $labelInfo + 1310736 + ($135 + -7 << 2) | 0; + HEAP32[$137 >> 2] = (HEAP32[$137 >> 2] | 0) + 1; + $141 = $labelInfo + 1310736 + ($135 + -6 << 2) | 0; + HEAP32[$141 >> 2] = (HEAP32[$141 >> 2] | 0) + $i$264; + $145 = $labelInfo + 1310736 + ($135 + -5 << 2) | 0; + HEAP32[$145 >> 2] = (HEAP32[$145 >> 2] | 0) + $j$075; + $wk_max$2 = $wk_max$159; + } while (0); + $i$264 = $i$264 + 1 | 0; + $227 = $pnt$168 + 2 | 0; + $228 = $pnt2$367 + 2 | 0; + $229 = $dpnt$166 + 1 | 0; + if (($i$264 | 0) >= ($10 | 0)) { + $dpnt$1$lcssa = $229; + $pnt$1$lcssa = $227; + $pnt2$3$lcssa = $228; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $dpnt$166 = $229; + $pnt$168 = $227; + $pnt2$367 = $228; + $wk_max$159 = $wk_max$2; + } + } + } else { + $dpnt$1$lcssa = $dpnt$077; + $pnt$1$lcssa = $pnt$079; + $pnt2$3$lcssa = $pnt2$278; + $wk_max$1$lcssa = $wk_max$074; + } + $j$075 = $j$075 + 1 | 0; + if (($j$075 | 0) >= ($1 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $dpnt$077 = $dpnt$1$lcssa + 2 | 0; + $pnt$079 = $pnt$1$lcssa + 4 | 0; + $pnt2$278 = $pnt2$3$lcssa + 4 | 0; + $wk_max$074 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $236 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$341 = 1; + $j$142 = 1; + $wk$443 = $17; + while (1) { + $238 = HEAP32[$wk$443 >> 2] | 0; + if (($238 | 0) == ($i$341 | 0)) { + $244 = $j$142; + $j$2 = $j$142 + 1 | 0; + } else { + $244 = HEAP32[$labelInfo + 1179664 + ($238 + -1 << 2) >> 2] | 0; + $j$2 = $j$142; + } + HEAP32[$wk$443 >> 2] = $244; + if (($i$341 | 0) < ($wk_max$0$lcssa | 0)) { + $i$341 = $i$341 + 1 | 0; + $j$142 = $j$2; + $wk$443 = $wk$443 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $248 = $labelInfo + 8 | 0; + $249 = $j$1$lcssa + -1 | 0; + HEAP32[$248 >> 2] = $249; + if (!$249) $$0 = 0; else { + _memset($236 | 0, 0, $249 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $249 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$439 = 0; + do { + $256 = $i$439 << 2; + HEAP32[$labelInfo + 131084 + ($256 << 2) >> 2] = $xsize; + HEAP32[$labelInfo + 131084 + (($256 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($256 | 2) << 2) >> 2] = $ysize; + HEAP32[$labelInfo + 131084 + (($256 | 3) << 2) >> 2] = 0; + $i$439 = $i$439 + 1 | 0; + } while (($i$439 | 0) < (HEAP32[$248 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$537 = 0; + do { + $270 = (HEAP32[$labelInfo + 1179664 + ($i$537 << 2) >> 2] | 0) + -1 | 0; + $271 = $i$537 * 7 | 0; + $274 = $labelInfo + 12 + ($270 << 2) | 0; + HEAP32[$274 >> 2] = (HEAP32[$274 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($271 << 2) >> 2] | 0); + $281 = $270 << 1; + $282 = $labelInfo + 655376 + ($281 << 3) | 0; + HEAPF64[$282 >> 3] = +HEAPF64[$282 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($271 + 1 << 2) >> 2] | 0); + $290 = $labelInfo + 655376 + (($281 | 1) << 3) | 0; + HEAPF64[$290 >> 3] = +HEAPF64[$290 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($271 + 2 << 2) >> 2] | 0); + $293 = $270 << 2; + $294 = $labelInfo + 131084 + ($293 << 2) | 0; + $298 = HEAP32[$labelInfo + 1310736 + ($271 + 3 << 2) >> 2] | 0; + if ((HEAP32[$294 >> 2] | 0) > ($298 | 0)) HEAP32[$294 >> 2] = $298; + $301 = $labelInfo + 131084 + (($293 | 1) << 2) | 0; + $305 = HEAP32[$labelInfo + 1310736 + ($271 + 4 << 2) >> 2] | 0; + if ((HEAP32[$301 >> 2] | 0) < ($305 | 0)) HEAP32[$301 >> 2] = $305; + $308 = $labelInfo + 131084 + (($293 | 2) << 2) | 0; + $312 = HEAP32[$labelInfo + 1310736 + ($271 + 5 << 2) >> 2] | 0; + if ((HEAP32[$308 >> 2] | 0) > ($312 | 0)) HEAP32[$308 >> 2] = $312; + $315 = $labelInfo + 131084 + (($293 | 3) << 2) | 0; + $319 = HEAP32[$labelInfo + 1310736 + ($271 + 6 << 2) >> 2] | 0; + if ((HEAP32[$315 >> 2] | 0) < ($319 | 0)) HEAP32[$315 >> 2] = $319; + $i$537 = $i$537 + 1 | 0; + } while (($i$537 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$248 >> 2] | 0) > 0) { + $i$636 = 0; + do { + $323 = $labelInfo + 12 + ($i$636 << 2) | 0; + $326 = $i$636 << 1; + $327 = $labelInfo + 655376 + ($326 << 3) | 0; + HEAPF64[$327 >> 3] = +HEAPF64[$327 >> 3] / +(HEAP32[$323 >> 2] | 0); + $333 = $labelInfo + 655376 + (($326 | 1) << 3) | 0; + HEAPF64[$333 >> 3] = +HEAPF64[$333 >> 3] / +(HEAP32[$323 >> 2] | 0); + $i$636 = $i$636 + 1 | 0; + } while (($i$636 | 0) < (HEAP32[$248 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabeling($image, $xsize, $ysize, $pixFormat, $debugMode, $labelingMode, $labelingThresh, $imageProcMode, $labelInfo, $image_thresh) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $pixFormat = $pixFormat | 0; + $debugMode = $debugMode | 0; + $labelingMode = $labelingMode | 0; + $labelingThresh = $labelingThresh | 0; + $imageProcMode = $imageProcMode | 0; + $labelInfo = $labelInfo | 0; + $image_thresh = $image_thresh | 0; + var $$0 = 0; + L1 : do switch ($debugMode | 0) { + case 0: + { + switch ($labelingMode | 0) { + case 1: + { + if ($image_thresh) { + $$0 = _arLabelingSubDBZ($image, $xsize, $ysize, $image_thresh, $labelInfo) | 0; + break L1; + } + switch ($imageProcMode | 0) { + case 0: + { + if ($pixFormat >>> 0 < 2) { + $$0 = _arLabelingSubDBR3C($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + } + if (($pixFormat & -2 | 0) == 2) { + $$0 = _arLabelingSubDBR3CA($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + } + if (($pixFormat & -3 | 0) == 4) { + $$0 = _arLabelingSubDBRA3C($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + } + switch ($pixFormat | 0) { + case 5: + case 12: + case 13: + case 14: + { + $$0 = _arLabelingSubDBRC($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + break; + } + case 8: + { + $$0 = _arLabelingSubDBRYC($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + break; + } + case 7: + { + $$0 = _arLabelingSubDBRCY($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + break; + } + case 9: + { + $$0 = _arLabelingSubDBR3C565($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + break; + } + case 10: + { + $$0 = _arLabelingSubDBR3CA5551($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + break; + } + case 11: + { + $$0 = _arLabelingSubDBR3CA4444($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + break; + } + default: + _exit(0); + } + break; + } + case 1: + { + if ($pixFormat >>> 0 < 2) { + $$0 = _arLabelingSubDBI3C($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + } + if (($pixFormat & -2 | 0) == 2) { + $$0 = _arLabelingSubDBI3CA($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + } + if (($pixFormat & -3 | 0) == 4) { + $$0 = _arLabelingSubDBIA3C($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + } + switch ($pixFormat | 0) { + case 5: + case 12: + case 13: + case 14: + { + $$0 = _arLabelingSubDBIC($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + break; + } + case 8: + { + $$0 = _arLabelingSubDBIYC($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + break; + } + case 7: + { + $$0 = _arLabelingSubDBICY($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + break; + } + case 9: + { + $$0 = _arLabelingSubDBI3C565($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + break; + } + case 10: + { + $$0 = _arLabelingSubDBI3CA5551($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + break; + } + case 11: + { + $$0 = _arLabelingSubDBI3CA4444($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + break; + } + default: + _exit(0); + } + break; + } + default: + _exit(0); + } + break; + } + case 0: + { + if ($image_thresh) { + $$0 = _arLabelingSubDWZ($image, $xsize, $ysize, $image_thresh, $labelInfo) | 0; + break L1; + } + switch ($imageProcMode | 0) { + case 0: + { + if ($pixFormat >>> 0 < 2) { + $$0 = _arLabelingSubDWR3C($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + } + if (($pixFormat & -2 | 0) == 2) { + $$0 = _arLabelingSubDWR3CA($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + } + if (($pixFormat & -3 | 0) == 4) { + $$0 = _arLabelingSubDWRA3C($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + } + switch ($pixFormat | 0) { + case 5: + case 12: + case 13: + case 14: + { + $$0 = _arLabelingSubDWRC($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + break; + } + case 8: + { + $$0 = _arLabelingSubDWRYC($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + break; + } + case 7: + { + $$0 = _arLabelingSubDWRCY($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + break; + } + case 9: + { + $$0 = _arLabelingSubDWR3C565($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + break; + } + case 10: + { + $$0 = _arLabelingSubDWR3CA5551($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + break; + } + case 11: + { + $$0 = _arLabelingSubDWR3CA4444($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + break; + } + default: + _exit(0); + } + break; + } + case 1: + { + if ($pixFormat >>> 0 < 2) { + $$0 = _arLabelingSubDWI3C($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + } + if (($pixFormat & -2 | 0) == 2) { + $$0 = _arLabelingSubDWI3CA($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + } + if (($pixFormat & -3 | 0) == 4) { + $$0 = _arLabelingSubDWIA3C($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + } + switch ($pixFormat | 0) { + case 5: + case 12: + case 13: + case 14: + { + $$0 = _arLabelingSubDWIC($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + break; + } + case 8: + { + $$0 = _arLabelingSubDWIYC($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + break; + } + case 7: + { + $$0 = _arLabelingSubDWICY($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + break; + } + case 9: + { + $$0 = _arLabelingSubDWI3C565($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + break; + } + case 10: + { + $$0 = _arLabelingSubDWI3CA5551($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + break; + } + case 11: + { + $$0 = _arLabelingSubDWI3CA4444($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + break; + } + default: + _exit(0); + } + break; + } + default: + _exit(0); + } + break; + } + default: + _exit(0); + } + break; + } + case 1: + { + switch ($labelingMode | 0) { + case 1: + { + if ($image_thresh) { + $$0 = _arLabelingSubEBZ($image, $xsize, $ysize, $image_thresh, $labelInfo) | 0; + break L1; + } + switch ($imageProcMode | 0) { + case 0: + { + if ($pixFormat >>> 0 < 2) { + $$0 = _arLabelingSubEBR3C($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + } + if (($pixFormat & -2 | 0) == 2) { + $$0 = _arLabelingSubEBR3CA($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + } + if (($pixFormat & -3 | 0) == 4) { + $$0 = _arLabelingSubEBRA3C($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + } + switch ($pixFormat | 0) { + case 5: + case 12: + case 13: + case 14: + { + $$0 = _arLabelingSubEBRC($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + break; + } + case 8: + { + $$0 = _arLabelingSubEBRYC($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + break; + } + case 7: + { + $$0 = _arLabelingSubEBRCY($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + break; + } + case 9: + { + $$0 = _arLabelingSubEBR3C565($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + break; + } + case 10: + { + $$0 = _arLabelingSubEBR3CA5551($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + break; + } + case 11: + { + $$0 = _arLabelingSubEBR3CA4444($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + break; + } + default: + _exit(0); + } + break; + } + case 1: + { + if ($pixFormat >>> 0 < 2) { + $$0 = _arLabelingSubEBI3C($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + } + if (($pixFormat & -2 | 0) == 2) { + $$0 = _arLabelingSubEBI3CA($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + } + if (($pixFormat & -3 | 0) == 4) { + $$0 = _arLabelingSubEBIA3C($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + } + switch ($pixFormat | 0) { + case 5: + case 12: + case 13: + case 14: + { + $$0 = _arLabelingSubEBIC($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + break; + } + case 8: + { + $$0 = _arLabelingSubEBIYC($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + break; + } + case 7: + { + $$0 = _arLabelingSubEBICY($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + break; + } + case 9: + { + $$0 = _arLabelingSubEBI3C565($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + break; + } + case 10: + { + $$0 = _arLabelingSubEBI3CA5551($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + break; + } + case 11: + { + $$0 = _arLabelingSubEBI3CA4444($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + break; + } + default: + _exit(0); + } + break; + } + default: + _exit(0); + } + break; + } + case 0: + { + if ($image_thresh) { + $$0 = _arLabelingSubEWZ($image, $xsize, $ysize, $image_thresh, $labelInfo) | 0; + break L1; + } + switch ($imageProcMode | 0) { + case 0: + { + if ($pixFormat >>> 0 < 2) { + $$0 = _arLabelingSubEWR3C($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + } + if (($pixFormat & -2 | 0) == 2) { + $$0 = _arLabelingSubEWR3CA($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + } + if (($pixFormat & -3 | 0) == 4) { + $$0 = _arLabelingSubEWRA3C($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + } + switch ($pixFormat | 0) { + case 5: + case 12: + case 13: + case 14: + { + $$0 = _arLabelingSubEWRC($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + break; + } + case 8: + { + $$0 = _arLabelingSubEWRYC($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + break; + } + case 7: + { + $$0 = _arLabelingSubEWRCY($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + break; + } + case 9: + { + $$0 = _arLabelingSubEWR3C565($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + break; + } + case 10: + { + $$0 = _arLabelingSubEWR3CA5551($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + break; + } + case 11: + { + $$0 = _arLabelingSubEWR3CA4444($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + break; + } + default: + _exit(0); + } + break; + } + case 1: + { + if ($pixFormat >>> 0 < 2) { + $$0 = _arLabelingSubEWI3C($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + } + if (($pixFormat & -2 | 0) == 2) { + $$0 = _arLabelingSubEWI3CA($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + } + if (($pixFormat & -3 | 0) == 4) { + $$0 = _arLabelingSubEWIA3C($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + } + switch ($pixFormat | 0) { + case 5: + case 12: + case 13: + case 14: + { + $$0 = _arLabelingSubEWIC($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + break; + } + case 8: + { + $$0 = _arLabelingSubEWIYC($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + break; + } + case 7: + { + $$0 = _arLabelingSubEWICY($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + break; + } + case 9: + { + $$0 = _arLabelingSubEWI3C565($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + break; + } + case 10: + { + $$0 = _arLabelingSubEWI3CA5551($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + break; + } + case 11: + { + $$0 = _arLabelingSubEWI3CA4444($image, $xsize, $ysize, $labelingThresh, $labelInfo) | 0; + break L1; + break; + } + default: + _exit(0); + } + break; + } + default: + _exit(0); + } + break; + } + default: + _exit(0); + } + break; + } + default: + _exit(0); + } while (0); + return $$0 | 0; +} + +function _arLabelingSubEWRA3C($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $0 = 0, $1 = 0, $10 = 0, $101 = 0, $107 = 0, $112 = 0, $115 = 0, $132 = 0, $134 = 0, $136 = 0, $140 = 0, $144 = 0, $147 = 0, $149 = 0, $153 = 0, $157 = 0, $161 = 0, $166 = 0, $168 = 0, $17 = 0, $172 = 0, $176 = 0, $18 = 0, $180 = 0, $186 = 0, $189 = 0, $19 = 0, $191 = 0, $195 = 0, $199 = 0, $203 = 0, $206 = 0, $211 = 0, $226 = 0, $227 = 0, $228 = 0, $235 = 0, $237 = 0, $243 = 0, $247 = 0, $248 = 0, $255 = 0, $269 = 0, $27 = 0, $270 = 0, $273 = 0, $280 = 0, $281 = 0, $289 = 0, $292 = 0, $293 = 0, $297 = 0, $300 = 0, $304 = 0, $307 = 0, $311 = 0, $314 = 0, $318 = 0, $322 = 0, $325 = 0, $326 = 0, $332 = 0, $41 = 0, $44 = 0, $46 = 0, $50 = 0, $54 = 0, $60 = 0, $61 = 0, $64 = 0, $65 = 0, $66 = 0, $69 = 0, $72 = 0, $89 = 0, $9 = 0, $91 = 0, $93 = 0, $97 = 0, $dpnt$077 = 0, $dpnt$1$lcssa = 0, $dpnt$166 = 0, $i$088 = 0, $i$182 = 0, $i$264 = 0, $i$341 = 0, $i$439 = 0, $i$537 = 0, $i$636 = 0, $j$075 = 0, $j$1$lcssa = 0, $j$142 = 0, $j$2 = 0, $k$055 = 0, $k$152 = 0, $k$248 = 0, $k$345 = 0, $pnt$079 = 0, $pnt$1$lcssa = 0, $pnt$168 = 0, $pnt1$090 = 0, $pnt1$184 = 0, $pnt2$089 = 0, $pnt2$183 = 0, $pnt2$278 = 0, $pnt2$3$lcssa = 0, $pnt2$367 = 0, $vararg_buffer = 0, $wk$056 = 0, $wk$153 = 0, $wk$249 = 0, $wk$346 = 0, $wk$443 = 0, $wk_max$0$lcssa = 0, $wk_max$074 = 0, $wk_max$1$lcssa = 0, $wk_max$159 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = HEAP32[$labelInfo >> 2] | 0; + $1 = $ysize + -1 | 0; + if (($xsize | 0) > 0) { + $i$088 = 0; + $pnt1$090 = $0; + $pnt2$089 = $0 + ((Math_imul($1, $xsize) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$089 >> 1] = 0; + HEAP16[$pnt1$090 >> 1] = 0; + $i$088 = $i$088 + 1 | 0; + if (($i$088 | 0) >= ($xsize | 0)) break; else { + $pnt1$090 = $pnt1$090 + 2 | 0; + $pnt2$089 = $pnt2$089 + 2 | 0; + } + } + } + $9 = $labelingThresh * 3 | 0; + $10 = $xsize + -1 | 0; + if (($ysize | 0) > 0) { + $i$182 = 0; + $pnt1$184 = $0; + $pnt2$183 = $0 + ($10 << 1) | 0; + while (1) { + HEAP16[$pnt2$183 >> 1] = 0; + HEAP16[$pnt1$184 >> 1] = 0; + $i$182 = $i$182 + 1 | 0; + if (($i$182 | 0) >= ($ysize | 0)) break; else { + $pnt1$184 = $pnt1$184 + ($xsize << 1) | 0; + $pnt2$183 = $pnt2$183 + ($xsize << 1) | 0; + } + } + } + $17 = $labelInfo + 1179664 | 0; + $18 = $xsize + 1 | 0; + $19 = 0 - $xsize | 0; + $$sum = 1 - $xsize | 0; + $$sum1 = ~$xsize; + L11 : do if (($1 | 0) > 1) { + $27 = ($10 | 0) > 1; + $dpnt$077 = (HEAP32[$labelInfo + 4 >> 2] | 0) + $18 | 0; + $j$075 = 1; + $pnt$079 = $image + ($18 << 2) | 0; + $pnt2$278 = $0 + ($18 << 1) | 0; + $wk_max$074 = 0; + L13 : while (1) { + if ($27) { + $dpnt$166 = $dpnt$077; + $i$264 = 1; + $pnt$168 = $pnt$079; + $pnt2$367 = $pnt2$278; + $wk_max$159 = $wk_max$074; + while (1) { + do if (((HEAPU8[$pnt$168 + 2 >> 0] | 0) + (HEAPU8[$pnt$168 + 1 >> 0] | 0) + (HEAPU8[$pnt$168 + 3 >> 0] | 0) | 0) > ($9 | 0)) { + HEAP8[$dpnt$166 >> 0] = -1; + $41 = HEAP16[$pnt2$367 + ($19 << 1) >> 1] | 0; + if ($41 << 16 >> 16 > 0) { + HEAP16[$pnt2$367 >> 1] = $41; + $44 = ($41 << 16 >> 16) * 7 | 0; + $46 = $labelInfo + 1310736 + ($44 + -7 << 2) | 0; + HEAP32[$46 >> 2] = (HEAP32[$46 >> 2] | 0) + 1; + $50 = $labelInfo + 1310736 + ($44 + -6 << 2) | 0; + HEAP32[$50 >> 2] = (HEAP32[$50 >> 2] | 0) + $i$264; + $54 = $labelInfo + 1310736 + ($44 + -5 << 2) | 0; + HEAP32[$54 >> 2] = (HEAP32[$54 >> 2] | 0) + $j$075; + HEAP32[$labelInfo + 1310736 + ($44 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $60 = HEAP16[$pnt2$367 + ($$sum << 1) >> 1] | 0; + $61 = $60 << 16 >> 16; + $64 = HEAP16[$pnt2$367 + ($$sum1 << 1) >> 1] | 0; + $65 = $64 << 16 >> 16; + $66 = $64 << 16 >> 16 > 0; + if ($60 << 16 >> 16 <= 0) { + if ($66) { + HEAP16[$pnt2$367 >> 1] = $64; + $166 = $65 * 7 | 0; + $168 = $labelInfo + 1310736 + ($166 + -7 << 2) | 0; + HEAP32[$168 >> 2] = (HEAP32[$168 >> 2] | 0) + 1; + $172 = $labelInfo + 1310736 + ($166 + -6 << 2) | 0; + HEAP32[$172 >> 2] = (HEAP32[$172 >> 2] | 0) + $i$264; + $176 = $labelInfo + 1310736 + ($166 + -5 << 2) | 0; + HEAP32[$176 >> 2] = (HEAP32[$176 >> 2] | 0) + $j$075; + $180 = $labelInfo + 1310736 + ($166 + -3 << 2) | 0; + if ((HEAP32[$180 >> 2] | 0) < ($i$264 | 0)) HEAP32[$180 >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($166 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $186 = HEAP16[$pnt2$367 + -2 >> 1] | 0; + if ($186 << 16 >> 16 > 0) { + HEAP16[$pnt2$367 >> 1] = $186; + $189 = ($186 << 16 >> 16) * 7 | 0; + $191 = $labelInfo + 1310736 + ($189 + -7 << 2) | 0; + HEAP32[$191 >> 2] = (HEAP32[$191 >> 2] | 0) + 1; + $195 = $labelInfo + 1310736 + ($189 + -6 << 2) | 0; + HEAP32[$195 >> 2] = (HEAP32[$195 >> 2] | 0) + $i$264; + $199 = $labelInfo + 1310736 + ($189 + -5 << 2) | 0; + HEAP32[$199 >> 2] = (HEAP32[$199 >> 2] | 0) + $j$075; + $203 = $labelInfo + 1310736 + ($189 + -3 << 2) | 0; + if ((HEAP32[$203 >> 2] | 0) >= ($i$264 | 0)) { + $wk_max$2 = $wk_max$159; + break; + } + HEAP32[$203 >> 2] = $i$264; + $wk_max$2 = $wk_max$159; + break; + } else { + $206 = $wk_max$159 + 1 | 0; + if (($wk_max$159 | 0) > 32767) break L13; + HEAP16[$pnt2$367 >> 1] = $206; + HEAP32[$labelInfo + 1179664 + ($wk_max$159 << 2) >> 2] = $206 << 16 >> 16; + $211 = $wk_max$159 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($211 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($211 + 1 << 2) >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($211 + 2 << 2) >> 2] = $j$075; + HEAP32[$labelInfo + 1310736 + ($211 + 3 << 2) >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($211 + 4 << 2) >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($211 + 5 << 2) >> 2] = $j$075; + HEAP32[$labelInfo + 1310736 + ($211 + 6 << 2) >> 2] = $j$075; + $wk_max$2 = $206; + break; + } + } + if ($66) { + $69 = HEAP32[$labelInfo + 1179664 + ($61 + -1 << 2) >> 2] | 0; + $72 = HEAP32[$labelInfo + 1179664 + ($65 + -1 << 2) >> 2] | 0; + if (($69 | 0) > ($72 | 0)) { + HEAP16[$pnt2$367 >> 1] = $72; + if (($wk_max$159 | 0) > 0) { + $k$055 = 0; + $wk$056 = $17; + while (1) { + if ((HEAP32[$wk$056 >> 2] | 0) == ($69 | 0)) HEAP32[$wk$056 >> 2] = $72; + $k$055 = $k$055 + 1 | 0; + if (($k$055 | 0) >= ($wk_max$159 | 0)) { + $89 = $72; + break; + } else $wk$056 = $wk$056 + 4 | 0; + } + } else $89 = $72; + } else { + HEAP16[$pnt2$367 >> 1] = $69; + if (($69 | 0) < ($72 | 0) & ($wk_max$159 | 0) > 0) { + $k$152 = 0; + $wk$153 = $17; + while (1) { + if ((HEAP32[$wk$153 >> 2] | 0) == ($72 | 0)) HEAP32[$wk$153 >> 2] = $69; + $k$152 = $k$152 + 1 | 0; + if (($k$152 | 0) >= ($wk_max$159 | 0)) { + $89 = $69; + break; + } else $wk$153 = $wk$153 + 4 | 0; + } + } else $89 = $69; + } + $91 = ($89 << 16 >> 16) * 7 | 0; + $93 = $labelInfo + 1310736 + ($91 + -7 << 2) | 0; + HEAP32[$93 >> 2] = (HEAP32[$93 >> 2] | 0) + 1; + $97 = $labelInfo + 1310736 + ($91 + -6 << 2) | 0; + HEAP32[$97 >> 2] = (HEAP32[$97 >> 2] | 0) + $i$264; + $101 = $labelInfo + 1310736 + ($91 + -5 << 2) | 0; + HEAP32[$101 >> 2] = (HEAP32[$101 >> 2] | 0) + $j$075; + HEAP32[$labelInfo + 1310736 + ($91 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $107 = HEAP16[$pnt2$367 + -2 >> 1] | 0; + if ($107 << 16 >> 16 <= 0) { + HEAP16[$pnt2$367 >> 1] = $60; + $147 = $61 * 7 | 0; + $149 = $labelInfo + 1310736 + ($147 + -7 << 2) | 0; + HEAP32[$149 >> 2] = (HEAP32[$149 >> 2] | 0) + 1; + $153 = $labelInfo + 1310736 + ($147 + -6 << 2) | 0; + HEAP32[$153 >> 2] = (HEAP32[$153 >> 2] | 0) + $i$264; + $157 = $labelInfo + 1310736 + ($147 + -5 << 2) | 0; + HEAP32[$157 >> 2] = (HEAP32[$157 >> 2] | 0) + $j$075; + $161 = $labelInfo + 1310736 + ($147 + -4 << 2) | 0; + if ((HEAP32[$161 >> 2] | 0) > ($i$264 | 0)) HEAP32[$161 >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($147 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $112 = HEAP32[$labelInfo + 1179664 + ($61 + -1 << 2) >> 2] | 0; + $115 = HEAP32[$labelInfo + 1179664 + (($107 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($112 | 0) > ($115 | 0)) { + HEAP16[$pnt2$367 >> 1] = $115; + if (($wk_max$159 | 0) > 0) { + $k$248 = 0; + $wk$249 = $17; + while (1) { + if ((HEAP32[$wk$249 >> 2] | 0) == ($112 | 0)) HEAP32[$wk$249 >> 2] = $115; + $k$248 = $k$248 + 1 | 0; + if (($k$248 | 0) >= ($wk_max$159 | 0)) { + $132 = $115; + break; + } else $wk$249 = $wk$249 + 4 | 0; + } + } else $132 = $115; + } else { + HEAP16[$pnt2$367 >> 1] = $112; + if (($112 | 0) < ($115 | 0) & ($wk_max$159 | 0) > 0) { + $k$345 = 0; + $wk$346 = $17; + while (1) { + if ((HEAP32[$wk$346 >> 2] | 0) == ($115 | 0)) HEAP32[$wk$346 >> 2] = $112; + $k$345 = $k$345 + 1 | 0; + if (($k$345 | 0) >= ($wk_max$159 | 0)) { + $132 = $112; + break; + } else $wk$346 = $wk$346 + 4 | 0; + } + } else $132 = $112; + } + $134 = ($132 << 16 >> 16) * 7 | 0; + $136 = $labelInfo + 1310736 + ($134 + -7 << 2) | 0; + HEAP32[$136 >> 2] = (HEAP32[$136 >> 2] | 0) + 1; + $140 = $labelInfo + 1310736 + ($134 + -6 << 2) | 0; + HEAP32[$140 >> 2] = (HEAP32[$140 >> 2] | 0) + $i$264; + $144 = $labelInfo + 1310736 + ($134 + -5 << 2) | 0; + HEAP32[$144 >> 2] = (HEAP32[$144 >> 2] | 0) + $j$075; + $wk_max$2 = $wk_max$159; + } else { + HEAP16[$pnt2$367 >> 1] = 0; + HEAP8[$dpnt$166 >> 0] = 0; + $wk_max$2 = $wk_max$159; + } while (0); + $i$264 = $i$264 + 1 | 0; + $226 = $pnt$168 + 4 | 0; + $227 = $pnt2$367 + 2 | 0; + $228 = $dpnt$166 + 1 | 0; + if (($i$264 | 0) >= ($10 | 0)) { + $dpnt$1$lcssa = $228; + $pnt$1$lcssa = $226; + $pnt2$3$lcssa = $227; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $dpnt$166 = $228; + $pnt$168 = $226; + $pnt2$367 = $227; + $wk_max$159 = $wk_max$2; + } + } + } else { + $dpnt$1$lcssa = $dpnt$077; + $pnt$1$lcssa = $pnt$079; + $pnt2$3$lcssa = $pnt2$278; + $wk_max$1$lcssa = $wk_max$074; + } + $j$075 = $j$075 + 1 | 0; + if (($j$075 | 0) >= ($1 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $dpnt$077 = $dpnt$1$lcssa + 2 | 0; + $pnt$079 = $pnt$1$lcssa + 8 | 0; + $pnt2$278 = $pnt2$3$lcssa + 4 | 0; + $wk_max$074 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $235 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$341 = 1; + $j$142 = 1; + $wk$443 = $17; + while (1) { + $237 = HEAP32[$wk$443 >> 2] | 0; + if (($237 | 0) == ($i$341 | 0)) { + $243 = $j$142; + $j$2 = $j$142 + 1 | 0; + } else { + $243 = HEAP32[$labelInfo + 1179664 + ($237 + -1 << 2) >> 2] | 0; + $j$2 = $j$142; + } + HEAP32[$wk$443 >> 2] = $243; + if (($i$341 | 0) < ($wk_max$0$lcssa | 0)) { + $i$341 = $i$341 + 1 | 0; + $j$142 = $j$2; + $wk$443 = $wk$443 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $247 = $labelInfo + 8 | 0; + $248 = $j$1$lcssa + -1 | 0; + HEAP32[$247 >> 2] = $248; + if (!$248) $$0 = 0; else { + _memset($235 | 0, 0, $248 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $248 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$439 = 0; + do { + $255 = $i$439 << 2; + HEAP32[$labelInfo + 131084 + ($255 << 2) >> 2] = $xsize; + HEAP32[$labelInfo + 131084 + (($255 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($255 | 2) << 2) >> 2] = $ysize; + HEAP32[$labelInfo + 131084 + (($255 | 3) << 2) >> 2] = 0; + $i$439 = $i$439 + 1 | 0; + } while (($i$439 | 0) < (HEAP32[$247 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$537 = 0; + do { + $269 = (HEAP32[$labelInfo + 1179664 + ($i$537 << 2) >> 2] | 0) + -1 | 0; + $270 = $i$537 * 7 | 0; + $273 = $labelInfo + 12 + ($269 << 2) | 0; + HEAP32[$273 >> 2] = (HEAP32[$273 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($270 << 2) >> 2] | 0); + $280 = $269 << 1; + $281 = $labelInfo + 655376 + ($280 << 3) | 0; + HEAPF64[$281 >> 3] = +HEAPF64[$281 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($270 + 1 << 2) >> 2] | 0); + $289 = $labelInfo + 655376 + (($280 | 1) << 3) | 0; + HEAPF64[$289 >> 3] = +HEAPF64[$289 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($270 + 2 << 2) >> 2] | 0); + $292 = $269 << 2; + $293 = $labelInfo + 131084 + ($292 << 2) | 0; + $297 = HEAP32[$labelInfo + 1310736 + ($270 + 3 << 2) >> 2] | 0; + if ((HEAP32[$293 >> 2] | 0) > ($297 | 0)) HEAP32[$293 >> 2] = $297; + $300 = $labelInfo + 131084 + (($292 | 1) << 2) | 0; + $304 = HEAP32[$labelInfo + 1310736 + ($270 + 4 << 2) >> 2] | 0; + if ((HEAP32[$300 >> 2] | 0) < ($304 | 0)) HEAP32[$300 >> 2] = $304; + $307 = $labelInfo + 131084 + (($292 | 2) << 2) | 0; + $311 = HEAP32[$labelInfo + 1310736 + ($270 + 5 << 2) >> 2] | 0; + if ((HEAP32[$307 >> 2] | 0) > ($311 | 0)) HEAP32[$307 >> 2] = $311; + $314 = $labelInfo + 131084 + (($292 | 3) << 2) | 0; + $318 = HEAP32[$labelInfo + 1310736 + ($270 + 6 << 2) >> 2] | 0; + if ((HEAP32[$314 >> 2] | 0) < ($318 | 0)) HEAP32[$314 >> 2] = $318; + $i$537 = $i$537 + 1 | 0; + } while (($i$537 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$247 >> 2] | 0) > 0) { + $i$636 = 0; + do { + $322 = $labelInfo + 12 + ($i$636 << 2) | 0; + $325 = $i$636 << 1; + $326 = $labelInfo + 655376 + ($325 << 3) | 0; + HEAPF64[$326 >> 3] = +HEAPF64[$326 >> 3] / +(HEAP32[$322 >> 2] | 0); + $332 = $labelInfo + 655376 + (($325 | 1) << 3) | 0; + HEAPF64[$332 >> 3] = +HEAPF64[$332 >> 3] / +(HEAP32[$322 >> 2] | 0); + $i$636 = $i$636 + 1 | 0; + } while (($i$636 | 0) < (HEAP32[$247 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubEBRA3C($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $0 = 0, $1 = 0, $10 = 0, $101 = 0, $107 = 0, $112 = 0, $115 = 0, $132 = 0, $134 = 0, $136 = 0, $140 = 0, $144 = 0, $147 = 0, $149 = 0, $153 = 0, $157 = 0, $161 = 0, $166 = 0, $168 = 0, $17 = 0, $172 = 0, $176 = 0, $18 = 0, $180 = 0, $186 = 0, $189 = 0, $19 = 0, $191 = 0, $195 = 0, $199 = 0, $203 = 0, $206 = 0, $211 = 0, $226 = 0, $227 = 0, $228 = 0, $235 = 0, $237 = 0, $243 = 0, $247 = 0, $248 = 0, $255 = 0, $269 = 0, $27 = 0, $270 = 0, $273 = 0, $280 = 0, $281 = 0, $289 = 0, $292 = 0, $293 = 0, $297 = 0, $300 = 0, $304 = 0, $307 = 0, $311 = 0, $314 = 0, $318 = 0, $322 = 0, $325 = 0, $326 = 0, $332 = 0, $41 = 0, $44 = 0, $46 = 0, $50 = 0, $54 = 0, $60 = 0, $61 = 0, $64 = 0, $65 = 0, $66 = 0, $69 = 0, $72 = 0, $89 = 0, $9 = 0, $91 = 0, $93 = 0, $97 = 0, $dpnt$077 = 0, $dpnt$1$lcssa = 0, $dpnt$166 = 0, $i$088 = 0, $i$182 = 0, $i$264 = 0, $i$341 = 0, $i$439 = 0, $i$537 = 0, $i$636 = 0, $j$075 = 0, $j$1$lcssa = 0, $j$142 = 0, $j$2 = 0, $k$055 = 0, $k$152 = 0, $k$248 = 0, $k$345 = 0, $pnt$079 = 0, $pnt$1$lcssa = 0, $pnt$168 = 0, $pnt1$090 = 0, $pnt1$184 = 0, $pnt2$089 = 0, $pnt2$183 = 0, $pnt2$278 = 0, $pnt2$3$lcssa = 0, $pnt2$367 = 0, $vararg_buffer = 0, $wk$056 = 0, $wk$153 = 0, $wk$249 = 0, $wk$346 = 0, $wk$443 = 0, $wk_max$0$lcssa = 0, $wk_max$074 = 0, $wk_max$1$lcssa = 0, $wk_max$159 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = HEAP32[$labelInfo >> 2] | 0; + $1 = $ysize + -1 | 0; + if (($xsize | 0) > 0) { + $i$088 = 0; + $pnt1$090 = $0; + $pnt2$089 = $0 + ((Math_imul($1, $xsize) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$089 >> 1] = 0; + HEAP16[$pnt1$090 >> 1] = 0; + $i$088 = $i$088 + 1 | 0; + if (($i$088 | 0) >= ($xsize | 0)) break; else { + $pnt1$090 = $pnt1$090 + 2 | 0; + $pnt2$089 = $pnt2$089 + 2 | 0; + } + } + } + $9 = $labelingThresh * 3 | 0; + $10 = $xsize + -1 | 0; + if (($ysize | 0) > 0) { + $i$182 = 0; + $pnt1$184 = $0; + $pnt2$183 = $0 + ($10 << 1) | 0; + while (1) { + HEAP16[$pnt2$183 >> 1] = 0; + HEAP16[$pnt1$184 >> 1] = 0; + $i$182 = $i$182 + 1 | 0; + if (($i$182 | 0) >= ($ysize | 0)) break; else { + $pnt1$184 = $pnt1$184 + ($xsize << 1) | 0; + $pnt2$183 = $pnt2$183 + ($xsize << 1) | 0; + } + } + } + $17 = $labelInfo + 1179664 | 0; + $18 = $xsize + 1 | 0; + $19 = 0 - $xsize | 0; + $$sum = 1 - $xsize | 0; + $$sum1 = ~$xsize; + L11 : do if (($1 | 0) > 1) { + $27 = ($10 | 0) > 1; + $dpnt$077 = (HEAP32[$labelInfo + 4 >> 2] | 0) + $18 | 0; + $j$075 = 1; + $pnt$079 = $image + ($18 << 2) | 0; + $pnt2$278 = $0 + ($18 << 1) | 0; + $wk_max$074 = 0; + L13 : while (1) { + if ($27) { + $dpnt$166 = $dpnt$077; + $i$264 = 1; + $pnt$168 = $pnt$079; + $pnt2$367 = $pnt2$278; + $wk_max$159 = $wk_max$074; + while (1) { + do if (((HEAPU8[$pnt$168 + 2 >> 0] | 0) + (HEAPU8[$pnt$168 + 1 >> 0] | 0) + (HEAPU8[$pnt$168 + 3 >> 0] | 0) | 0) > ($9 | 0)) { + HEAP16[$pnt2$367 >> 1] = 0; + HEAP8[$dpnt$166 >> 0] = 0; + $wk_max$2 = $wk_max$159; + } else { + HEAP8[$dpnt$166 >> 0] = -1; + $41 = HEAP16[$pnt2$367 + ($19 << 1) >> 1] | 0; + if ($41 << 16 >> 16 > 0) { + HEAP16[$pnt2$367 >> 1] = $41; + $44 = ($41 << 16 >> 16) * 7 | 0; + $46 = $labelInfo + 1310736 + ($44 + -7 << 2) | 0; + HEAP32[$46 >> 2] = (HEAP32[$46 >> 2] | 0) + 1; + $50 = $labelInfo + 1310736 + ($44 + -6 << 2) | 0; + HEAP32[$50 >> 2] = (HEAP32[$50 >> 2] | 0) + $i$264; + $54 = $labelInfo + 1310736 + ($44 + -5 << 2) | 0; + HEAP32[$54 >> 2] = (HEAP32[$54 >> 2] | 0) + $j$075; + HEAP32[$labelInfo + 1310736 + ($44 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $60 = HEAP16[$pnt2$367 + ($$sum << 1) >> 1] | 0; + $61 = $60 << 16 >> 16; + $64 = HEAP16[$pnt2$367 + ($$sum1 << 1) >> 1] | 0; + $65 = $64 << 16 >> 16; + $66 = $64 << 16 >> 16 > 0; + if ($60 << 16 >> 16 <= 0) { + if ($66) { + HEAP16[$pnt2$367 >> 1] = $64; + $166 = $65 * 7 | 0; + $168 = $labelInfo + 1310736 + ($166 + -7 << 2) | 0; + HEAP32[$168 >> 2] = (HEAP32[$168 >> 2] | 0) + 1; + $172 = $labelInfo + 1310736 + ($166 + -6 << 2) | 0; + HEAP32[$172 >> 2] = (HEAP32[$172 >> 2] | 0) + $i$264; + $176 = $labelInfo + 1310736 + ($166 + -5 << 2) | 0; + HEAP32[$176 >> 2] = (HEAP32[$176 >> 2] | 0) + $j$075; + $180 = $labelInfo + 1310736 + ($166 + -3 << 2) | 0; + if ((HEAP32[$180 >> 2] | 0) < ($i$264 | 0)) HEAP32[$180 >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($166 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $186 = HEAP16[$pnt2$367 + -2 >> 1] | 0; + if ($186 << 16 >> 16 > 0) { + HEAP16[$pnt2$367 >> 1] = $186; + $189 = ($186 << 16 >> 16) * 7 | 0; + $191 = $labelInfo + 1310736 + ($189 + -7 << 2) | 0; + HEAP32[$191 >> 2] = (HEAP32[$191 >> 2] | 0) + 1; + $195 = $labelInfo + 1310736 + ($189 + -6 << 2) | 0; + HEAP32[$195 >> 2] = (HEAP32[$195 >> 2] | 0) + $i$264; + $199 = $labelInfo + 1310736 + ($189 + -5 << 2) | 0; + HEAP32[$199 >> 2] = (HEAP32[$199 >> 2] | 0) + $j$075; + $203 = $labelInfo + 1310736 + ($189 + -3 << 2) | 0; + if ((HEAP32[$203 >> 2] | 0) >= ($i$264 | 0)) { + $wk_max$2 = $wk_max$159; + break; + } + HEAP32[$203 >> 2] = $i$264; + $wk_max$2 = $wk_max$159; + break; + } else { + $206 = $wk_max$159 + 1 | 0; + if (($wk_max$159 | 0) > 32767) break L13; + HEAP16[$pnt2$367 >> 1] = $206; + HEAP32[$labelInfo + 1179664 + ($wk_max$159 << 2) >> 2] = $206 << 16 >> 16; + $211 = $wk_max$159 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($211 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($211 + 1 << 2) >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($211 + 2 << 2) >> 2] = $j$075; + HEAP32[$labelInfo + 1310736 + ($211 + 3 << 2) >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($211 + 4 << 2) >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($211 + 5 << 2) >> 2] = $j$075; + HEAP32[$labelInfo + 1310736 + ($211 + 6 << 2) >> 2] = $j$075; + $wk_max$2 = $206; + break; + } + } + if ($66) { + $69 = HEAP32[$labelInfo + 1179664 + ($61 + -1 << 2) >> 2] | 0; + $72 = HEAP32[$labelInfo + 1179664 + ($65 + -1 << 2) >> 2] | 0; + if (($69 | 0) > ($72 | 0)) { + HEAP16[$pnt2$367 >> 1] = $72; + if (($wk_max$159 | 0) > 0) { + $k$055 = 0; + $wk$056 = $17; + while (1) { + if ((HEAP32[$wk$056 >> 2] | 0) == ($69 | 0)) HEAP32[$wk$056 >> 2] = $72; + $k$055 = $k$055 + 1 | 0; + if (($k$055 | 0) >= ($wk_max$159 | 0)) { + $89 = $72; + break; + } else $wk$056 = $wk$056 + 4 | 0; + } + } else $89 = $72; + } else { + HEAP16[$pnt2$367 >> 1] = $69; + if (($69 | 0) < ($72 | 0) & ($wk_max$159 | 0) > 0) { + $k$152 = 0; + $wk$153 = $17; + while (1) { + if ((HEAP32[$wk$153 >> 2] | 0) == ($72 | 0)) HEAP32[$wk$153 >> 2] = $69; + $k$152 = $k$152 + 1 | 0; + if (($k$152 | 0) >= ($wk_max$159 | 0)) { + $89 = $69; + break; + } else $wk$153 = $wk$153 + 4 | 0; + } + } else $89 = $69; + } + $91 = ($89 << 16 >> 16) * 7 | 0; + $93 = $labelInfo + 1310736 + ($91 + -7 << 2) | 0; + HEAP32[$93 >> 2] = (HEAP32[$93 >> 2] | 0) + 1; + $97 = $labelInfo + 1310736 + ($91 + -6 << 2) | 0; + HEAP32[$97 >> 2] = (HEAP32[$97 >> 2] | 0) + $i$264; + $101 = $labelInfo + 1310736 + ($91 + -5 << 2) | 0; + HEAP32[$101 >> 2] = (HEAP32[$101 >> 2] | 0) + $j$075; + HEAP32[$labelInfo + 1310736 + ($91 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $107 = HEAP16[$pnt2$367 + -2 >> 1] | 0; + if ($107 << 16 >> 16 <= 0) { + HEAP16[$pnt2$367 >> 1] = $60; + $147 = $61 * 7 | 0; + $149 = $labelInfo + 1310736 + ($147 + -7 << 2) | 0; + HEAP32[$149 >> 2] = (HEAP32[$149 >> 2] | 0) + 1; + $153 = $labelInfo + 1310736 + ($147 + -6 << 2) | 0; + HEAP32[$153 >> 2] = (HEAP32[$153 >> 2] | 0) + $i$264; + $157 = $labelInfo + 1310736 + ($147 + -5 << 2) | 0; + HEAP32[$157 >> 2] = (HEAP32[$157 >> 2] | 0) + $j$075; + $161 = $labelInfo + 1310736 + ($147 + -4 << 2) | 0; + if ((HEAP32[$161 >> 2] | 0) > ($i$264 | 0)) HEAP32[$161 >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($147 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $112 = HEAP32[$labelInfo + 1179664 + ($61 + -1 << 2) >> 2] | 0; + $115 = HEAP32[$labelInfo + 1179664 + (($107 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($112 | 0) > ($115 | 0)) { + HEAP16[$pnt2$367 >> 1] = $115; + if (($wk_max$159 | 0) > 0) { + $k$248 = 0; + $wk$249 = $17; + while (1) { + if ((HEAP32[$wk$249 >> 2] | 0) == ($112 | 0)) HEAP32[$wk$249 >> 2] = $115; + $k$248 = $k$248 + 1 | 0; + if (($k$248 | 0) >= ($wk_max$159 | 0)) { + $132 = $115; + break; + } else $wk$249 = $wk$249 + 4 | 0; + } + } else $132 = $115; + } else { + HEAP16[$pnt2$367 >> 1] = $112; + if (($112 | 0) < ($115 | 0) & ($wk_max$159 | 0) > 0) { + $k$345 = 0; + $wk$346 = $17; + while (1) { + if ((HEAP32[$wk$346 >> 2] | 0) == ($115 | 0)) HEAP32[$wk$346 >> 2] = $112; + $k$345 = $k$345 + 1 | 0; + if (($k$345 | 0) >= ($wk_max$159 | 0)) { + $132 = $112; + break; + } else $wk$346 = $wk$346 + 4 | 0; + } + } else $132 = $112; + } + $134 = ($132 << 16 >> 16) * 7 | 0; + $136 = $labelInfo + 1310736 + ($134 + -7 << 2) | 0; + HEAP32[$136 >> 2] = (HEAP32[$136 >> 2] | 0) + 1; + $140 = $labelInfo + 1310736 + ($134 + -6 << 2) | 0; + HEAP32[$140 >> 2] = (HEAP32[$140 >> 2] | 0) + $i$264; + $144 = $labelInfo + 1310736 + ($134 + -5 << 2) | 0; + HEAP32[$144 >> 2] = (HEAP32[$144 >> 2] | 0) + $j$075; + $wk_max$2 = $wk_max$159; + } while (0); + $i$264 = $i$264 + 1 | 0; + $226 = $pnt$168 + 4 | 0; + $227 = $pnt2$367 + 2 | 0; + $228 = $dpnt$166 + 1 | 0; + if (($i$264 | 0) >= ($10 | 0)) { + $dpnt$1$lcssa = $228; + $pnt$1$lcssa = $226; + $pnt2$3$lcssa = $227; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $dpnt$166 = $228; + $pnt$168 = $226; + $pnt2$367 = $227; + $wk_max$159 = $wk_max$2; + } + } + } else { + $dpnt$1$lcssa = $dpnt$077; + $pnt$1$lcssa = $pnt$079; + $pnt2$3$lcssa = $pnt2$278; + $wk_max$1$lcssa = $wk_max$074; + } + $j$075 = $j$075 + 1 | 0; + if (($j$075 | 0) >= ($1 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $dpnt$077 = $dpnt$1$lcssa + 2 | 0; + $pnt$079 = $pnt$1$lcssa + 8 | 0; + $pnt2$278 = $pnt2$3$lcssa + 4 | 0; + $wk_max$074 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $235 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$341 = 1; + $j$142 = 1; + $wk$443 = $17; + while (1) { + $237 = HEAP32[$wk$443 >> 2] | 0; + if (($237 | 0) == ($i$341 | 0)) { + $243 = $j$142; + $j$2 = $j$142 + 1 | 0; + } else { + $243 = HEAP32[$labelInfo + 1179664 + ($237 + -1 << 2) >> 2] | 0; + $j$2 = $j$142; + } + HEAP32[$wk$443 >> 2] = $243; + if (($i$341 | 0) < ($wk_max$0$lcssa | 0)) { + $i$341 = $i$341 + 1 | 0; + $j$142 = $j$2; + $wk$443 = $wk$443 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $247 = $labelInfo + 8 | 0; + $248 = $j$1$lcssa + -1 | 0; + HEAP32[$247 >> 2] = $248; + if (!$248) $$0 = 0; else { + _memset($235 | 0, 0, $248 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $248 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$439 = 0; + do { + $255 = $i$439 << 2; + HEAP32[$labelInfo + 131084 + ($255 << 2) >> 2] = $xsize; + HEAP32[$labelInfo + 131084 + (($255 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($255 | 2) << 2) >> 2] = $ysize; + HEAP32[$labelInfo + 131084 + (($255 | 3) << 2) >> 2] = 0; + $i$439 = $i$439 + 1 | 0; + } while (($i$439 | 0) < (HEAP32[$247 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$537 = 0; + do { + $269 = (HEAP32[$labelInfo + 1179664 + ($i$537 << 2) >> 2] | 0) + -1 | 0; + $270 = $i$537 * 7 | 0; + $273 = $labelInfo + 12 + ($269 << 2) | 0; + HEAP32[$273 >> 2] = (HEAP32[$273 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($270 << 2) >> 2] | 0); + $280 = $269 << 1; + $281 = $labelInfo + 655376 + ($280 << 3) | 0; + HEAPF64[$281 >> 3] = +HEAPF64[$281 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($270 + 1 << 2) >> 2] | 0); + $289 = $labelInfo + 655376 + (($280 | 1) << 3) | 0; + HEAPF64[$289 >> 3] = +HEAPF64[$289 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($270 + 2 << 2) >> 2] | 0); + $292 = $269 << 2; + $293 = $labelInfo + 131084 + ($292 << 2) | 0; + $297 = HEAP32[$labelInfo + 1310736 + ($270 + 3 << 2) >> 2] | 0; + if ((HEAP32[$293 >> 2] | 0) > ($297 | 0)) HEAP32[$293 >> 2] = $297; + $300 = $labelInfo + 131084 + (($292 | 1) << 2) | 0; + $304 = HEAP32[$labelInfo + 1310736 + ($270 + 4 << 2) >> 2] | 0; + if ((HEAP32[$300 >> 2] | 0) < ($304 | 0)) HEAP32[$300 >> 2] = $304; + $307 = $labelInfo + 131084 + (($292 | 2) << 2) | 0; + $311 = HEAP32[$labelInfo + 1310736 + ($270 + 5 << 2) >> 2] | 0; + if ((HEAP32[$307 >> 2] | 0) > ($311 | 0)) HEAP32[$307 >> 2] = $311; + $314 = $labelInfo + 131084 + (($292 | 3) << 2) | 0; + $318 = HEAP32[$labelInfo + 1310736 + ($270 + 6 << 2) >> 2] | 0; + if ((HEAP32[$314 >> 2] | 0) < ($318 | 0)) HEAP32[$314 >> 2] = $318; + $i$537 = $i$537 + 1 | 0; + } while (($i$537 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$247 >> 2] | 0) > 0) { + $i$636 = 0; + do { + $322 = $labelInfo + 12 + ($i$636 << 2) | 0; + $325 = $i$636 << 1; + $326 = $labelInfo + 655376 + ($325 << 3) | 0; + HEAPF64[$326 >> 3] = +HEAPF64[$326 >> 3] / +(HEAP32[$322 >> 2] | 0); + $332 = $labelInfo + 655376 + (($325 | 1) << 3) | 0; + HEAPF64[$332 >> 3] = +HEAPF64[$332 >> 3] / +(HEAP32[$322 >> 2] | 0); + $i$636 = $i$636 + 1 | 0; + } while (($i$636 | 0) < (HEAP32[$247 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubEWR3C($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $0 = 0, $1 = 0, $10 = 0, $100 = 0, $106 = 0, $111 = 0, $114 = 0, $131 = 0, $133 = 0, $135 = 0, $139 = 0, $143 = 0, $146 = 0, $148 = 0, $152 = 0, $156 = 0, $160 = 0, $165 = 0, $167 = 0, $17 = 0, $171 = 0, $175 = 0, $179 = 0, $18 = 0, $185 = 0, $188 = 0, $19 = 0, $190 = 0, $194 = 0, $198 = 0, $202 = 0, $205 = 0, $210 = 0, $225 = 0, $226 = 0, $227 = 0, $234 = 0, $236 = 0, $242 = 0, $246 = 0, $247 = 0, $254 = 0, $268 = 0, $269 = 0, $27 = 0, $272 = 0, $279 = 0, $280 = 0, $288 = 0, $291 = 0, $292 = 0, $296 = 0, $299 = 0, $303 = 0, $306 = 0, $310 = 0, $313 = 0, $317 = 0, $321 = 0, $324 = 0, $325 = 0, $331 = 0, $40 = 0, $43 = 0, $45 = 0, $49 = 0, $53 = 0, $59 = 0, $60 = 0, $63 = 0, $64 = 0, $65 = 0, $68 = 0, $71 = 0, $88 = 0, $9 = 0, $90 = 0, $92 = 0, $96 = 0, $dpnt$077 = 0, $dpnt$1$lcssa = 0, $dpnt$166 = 0, $i$088 = 0, $i$182 = 0, $i$264 = 0, $i$341 = 0, $i$439 = 0, $i$537 = 0, $i$636 = 0, $j$075 = 0, $j$1$lcssa = 0, $j$142 = 0, $j$2 = 0, $k$055 = 0, $k$152 = 0, $k$248 = 0, $k$345 = 0, $pnt$079 = 0, $pnt$1$lcssa = 0, $pnt$168 = 0, $pnt1$090 = 0, $pnt1$184 = 0, $pnt2$089 = 0, $pnt2$183 = 0, $pnt2$278 = 0, $pnt2$3$lcssa = 0, $pnt2$367 = 0, $vararg_buffer = 0, $wk$056 = 0, $wk$153 = 0, $wk$249 = 0, $wk$346 = 0, $wk$443 = 0, $wk_max$0$lcssa = 0, $wk_max$074 = 0, $wk_max$1$lcssa = 0, $wk_max$159 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = HEAP32[$labelInfo >> 2] | 0; + $1 = $ysize + -1 | 0; + if (($xsize | 0) > 0) { + $i$088 = 0; + $pnt1$090 = $0; + $pnt2$089 = $0 + ((Math_imul($1, $xsize) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$089 >> 1] = 0; + HEAP16[$pnt1$090 >> 1] = 0; + $i$088 = $i$088 + 1 | 0; + if (($i$088 | 0) >= ($xsize | 0)) break; else { + $pnt1$090 = $pnt1$090 + 2 | 0; + $pnt2$089 = $pnt2$089 + 2 | 0; + } + } + } + $9 = $labelingThresh * 3 | 0; + $10 = $xsize + -1 | 0; + if (($ysize | 0) > 0) { + $i$182 = 0; + $pnt1$184 = $0; + $pnt2$183 = $0 + ($10 << 1) | 0; + while (1) { + HEAP16[$pnt2$183 >> 1] = 0; + HEAP16[$pnt1$184 >> 1] = 0; + $i$182 = $i$182 + 1 | 0; + if (($i$182 | 0) >= ($ysize | 0)) break; else { + $pnt1$184 = $pnt1$184 + ($xsize << 1) | 0; + $pnt2$183 = $pnt2$183 + ($xsize << 1) | 0; + } + } + } + $17 = $labelInfo + 1179664 | 0; + $18 = $xsize + 1 | 0; + $19 = 0 - $xsize | 0; + $$sum = 1 - $xsize | 0; + $$sum1 = ~$xsize; + L11 : do if (($1 | 0) > 1) { + $27 = ($10 | 0) > 1; + $dpnt$077 = (HEAP32[$labelInfo + 4 >> 2] | 0) + $18 | 0; + $j$075 = 1; + $pnt$079 = $image + ($18 * 3 | 0) | 0; + $pnt2$278 = $0 + ($18 << 1) | 0; + $wk_max$074 = 0; + L13 : while (1) { + if ($27) { + $dpnt$166 = $dpnt$077; + $i$264 = 1; + $pnt$168 = $pnt$079; + $pnt2$367 = $pnt2$278; + $wk_max$159 = $wk_max$074; + while (1) { + do if (((HEAPU8[$pnt$168 + 1 >> 0] | 0) + (HEAPU8[$pnt$168 >> 0] | 0) + (HEAPU8[$pnt$168 + 2 >> 0] | 0) | 0) > ($9 | 0)) { + HEAP8[$dpnt$166 >> 0] = -1; + $40 = HEAP16[$pnt2$367 + ($19 << 1) >> 1] | 0; + if ($40 << 16 >> 16 > 0) { + HEAP16[$pnt2$367 >> 1] = $40; + $43 = ($40 << 16 >> 16) * 7 | 0; + $45 = $labelInfo + 1310736 + ($43 + -7 << 2) | 0; + HEAP32[$45 >> 2] = (HEAP32[$45 >> 2] | 0) + 1; + $49 = $labelInfo + 1310736 + ($43 + -6 << 2) | 0; + HEAP32[$49 >> 2] = (HEAP32[$49 >> 2] | 0) + $i$264; + $53 = $labelInfo + 1310736 + ($43 + -5 << 2) | 0; + HEAP32[$53 >> 2] = (HEAP32[$53 >> 2] | 0) + $j$075; + HEAP32[$labelInfo + 1310736 + ($43 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $59 = HEAP16[$pnt2$367 + ($$sum << 1) >> 1] | 0; + $60 = $59 << 16 >> 16; + $63 = HEAP16[$pnt2$367 + ($$sum1 << 1) >> 1] | 0; + $64 = $63 << 16 >> 16; + $65 = $63 << 16 >> 16 > 0; + if ($59 << 16 >> 16 <= 0) { + if ($65) { + HEAP16[$pnt2$367 >> 1] = $63; + $165 = $64 * 7 | 0; + $167 = $labelInfo + 1310736 + ($165 + -7 << 2) | 0; + HEAP32[$167 >> 2] = (HEAP32[$167 >> 2] | 0) + 1; + $171 = $labelInfo + 1310736 + ($165 + -6 << 2) | 0; + HEAP32[$171 >> 2] = (HEAP32[$171 >> 2] | 0) + $i$264; + $175 = $labelInfo + 1310736 + ($165 + -5 << 2) | 0; + HEAP32[$175 >> 2] = (HEAP32[$175 >> 2] | 0) + $j$075; + $179 = $labelInfo + 1310736 + ($165 + -3 << 2) | 0; + if ((HEAP32[$179 >> 2] | 0) < ($i$264 | 0)) HEAP32[$179 >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($165 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $185 = HEAP16[$pnt2$367 + -2 >> 1] | 0; + if ($185 << 16 >> 16 > 0) { + HEAP16[$pnt2$367 >> 1] = $185; + $188 = ($185 << 16 >> 16) * 7 | 0; + $190 = $labelInfo + 1310736 + ($188 + -7 << 2) | 0; + HEAP32[$190 >> 2] = (HEAP32[$190 >> 2] | 0) + 1; + $194 = $labelInfo + 1310736 + ($188 + -6 << 2) | 0; + HEAP32[$194 >> 2] = (HEAP32[$194 >> 2] | 0) + $i$264; + $198 = $labelInfo + 1310736 + ($188 + -5 << 2) | 0; + HEAP32[$198 >> 2] = (HEAP32[$198 >> 2] | 0) + $j$075; + $202 = $labelInfo + 1310736 + ($188 + -3 << 2) | 0; + if ((HEAP32[$202 >> 2] | 0) >= ($i$264 | 0)) { + $wk_max$2 = $wk_max$159; + break; + } + HEAP32[$202 >> 2] = $i$264; + $wk_max$2 = $wk_max$159; + break; + } else { + $205 = $wk_max$159 + 1 | 0; + if (($wk_max$159 | 0) > 32767) break L13; + HEAP16[$pnt2$367 >> 1] = $205; + HEAP32[$labelInfo + 1179664 + ($wk_max$159 << 2) >> 2] = $205 << 16 >> 16; + $210 = $wk_max$159 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($210 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($210 + 1 << 2) >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($210 + 2 << 2) >> 2] = $j$075; + HEAP32[$labelInfo + 1310736 + ($210 + 3 << 2) >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($210 + 4 << 2) >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($210 + 5 << 2) >> 2] = $j$075; + HEAP32[$labelInfo + 1310736 + ($210 + 6 << 2) >> 2] = $j$075; + $wk_max$2 = $205; + break; + } + } + if ($65) { + $68 = HEAP32[$labelInfo + 1179664 + ($60 + -1 << 2) >> 2] | 0; + $71 = HEAP32[$labelInfo + 1179664 + ($64 + -1 << 2) >> 2] | 0; + if (($68 | 0) > ($71 | 0)) { + HEAP16[$pnt2$367 >> 1] = $71; + if (($wk_max$159 | 0) > 0) { + $k$055 = 0; + $wk$056 = $17; + while (1) { + if ((HEAP32[$wk$056 >> 2] | 0) == ($68 | 0)) HEAP32[$wk$056 >> 2] = $71; + $k$055 = $k$055 + 1 | 0; + if (($k$055 | 0) >= ($wk_max$159 | 0)) { + $88 = $71; + break; + } else $wk$056 = $wk$056 + 4 | 0; + } + } else $88 = $71; + } else { + HEAP16[$pnt2$367 >> 1] = $68; + if (($68 | 0) < ($71 | 0) & ($wk_max$159 | 0) > 0) { + $k$152 = 0; + $wk$153 = $17; + while (1) { + if ((HEAP32[$wk$153 >> 2] | 0) == ($71 | 0)) HEAP32[$wk$153 >> 2] = $68; + $k$152 = $k$152 + 1 | 0; + if (($k$152 | 0) >= ($wk_max$159 | 0)) { + $88 = $68; + break; + } else $wk$153 = $wk$153 + 4 | 0; + } + } else $88 = $68; + } + $90 = ($88 << 16 >> 16) * 7 | 0; + $92 = $labelInfo + 1310736 + ($90 + -7 << 2) | 0; + HEAP32[$92 >> 2] = (HEAP32[$92 >> 2] | 0) + 1; + $96 = $labelInfo + 1310736 + ($90 + -6 << 2) | 0; + HEAP32[$96 >> 2] = (HEAP32[$96 >> 2] | 0) + $i$264; + $100 = $labelInfo + 1310736 + ($90 + -5 << 2) | 0; + HEAP32[$100 >> 2] = (HEAP32[$100 >> 2] | 0) + $j$075; + HEAP32[$labelInfo + 1310736 + ($90 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $106 = HEAP16[$pnt2$367 + -2 >> 1] | 0; + if ($106 << 16 >> 16 <= 0) { + HEAP16[$pnt2$367 >> 1] = $59; + $146 = $60 * 7 | 0; + $148 = $labelInfo + 1310736 + ($146 + -7 << 2) | 0; + HEAP32[$148 >> 2] = (HEAP32[$148 >> 2] | 0) + 1; + $152 = $labelInfo + 1310736 + ($146 + -6 << 2) | 0; + HEAP32[$152 >> 2] = (HEAP32[$152 >> 2] | 0) + $i$264; + $156 = $labelInfo + 1310736 + ($146 + -5 << 2) | 0; + HEAP32[$156 >> 2] = (HEAP32[$156 >> 2] | 0) + $j$075; + $160 = $labelInfo + 1310736 + ($146 + -4 << 2) | 0; + if ((HEAP32[$160 >> 2] | 0) > ($i$264 | 0)) HEAP32[$160 >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($146 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $111 = HEAP32[$labelInfo + 1179664 + ($60 + -1 << 2) >> 2] | 0; + $114 = HEAP32[$labelInfo + 1179664 + (($106 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($111 | 0) > ($114 | 0)) { + HEAP16[$pnt2$367 >> 1] = $114; + if (($wk_max$159 | 0) > 0) { + $k$248 = 0; + $wk$249 = $17; + while (1) { + if ((HEAP32[$wk$249 >> 2] | 0) == ($111 | 0)) HEAP32[$wk$249 >> 2] = $114; + $k$248 = $k$248 + 1 | 0; + if (($k$248 | 0) >= ($wk_max$159 | 0)) { + $131 = $114; + break; + } else $wk$249 = $wk$249 + 4 | 0; + } + } else $131 = $114; + } else { + HEAP16[$pnt2$367 >> 1] = $111; + if (($111 | 0) < ($114 | 0) & ($wk_max$159 | 0) > 0) { + $k$345 = 0; + $wk$346 = $17; + while (1) { + if ((HEAP32[$wk$346 >> 2] | 0) == ($114 | 0)) HEAP32[$wk$346 >> 2] = $111; + $k$345 = $k$345 + 1 | 0; + if (($k$345 | 0) >= ($wk_max$159 | 0)) { + $131 = $111; + break; + } else $wk$346 = $wk$346 + 4 | 0; + } + } else $131 = $111; + } + $133 = ($131 << 16 >> 16) * 7 | 0; + $135 = $labelInfo + 1310736 + ($133 + -7 << 2) | 0; + HEAP32[$135 >> 2] = (HEAP32[$135 >> 2] | 0) + 1; + $139 = $labelInfo + 1310736 + ($133 + -6 << 2) | 0; + HEAP32[$139 >> 2] = (HEAP32[$139 >> 2] | 0) + $i$264; + $143 = $labelInfo + 1310736 + ($133 + -5 << 2) | 0; + HEAP32[$143 >> 2] = (HEAP32[$143 >> 2] | 0) + $j$075; + $wk_max$2 = $wk_max$159; + } else { + HEAP16[$pnt2$367 >> 1] = 0; + HEAP8[$dpnt$166 >> 0] = 0; + $wk_max$2 = $wk_max$159; + } while (0); + $i$264 = $i$264 + 1 | 0; + $225 = $pnt$168 + 3 | 0; + $226 = $pnt2$367 + 2 | 0; + $227 = $dpnt$166 + 1 | 0; + if (($i$264 | 0) >= ($10 | 0)) { + $dpnt$1$lcssa = $227; + $pnt$1$lcssa = $225; + $pnt2$3$lcssa = $226; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $dpnt$166 = $227; + $pnt$168 = $225; + $pnt2$367 = $226; + $wk_max$159 = $wk_max$2; + } + } + } else { + $dpnt$1$lcssa = $dpnt$077; + $pnt$1$lcssa = $pnt$079; + $pnt2$3$lcssa = $pnt2$278; + $wk_max$1$lcssa = $wk_max$074; + } + $j$075 = $j$075 + 1 | 0; + if (($j$075 | 0) >= ($1 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $dpnt$077 = $dpnt$1$lcssa + 2 | 0; + $pnt$079 = $pnt$1$lcssa + 6 | 0; + $pnt2$278 = $pnt2$3$lcssa + 4 | 0; + $wk_max$074 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $234 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$341 = 1; + $j$142 = 1; + $wk$443 = $17; + while (1) { + $236 = HEAP32[$wk$443 >> 2] | 0; + if (($236 | 0) == ($i$341 | 0)) { + $242 = $j$142; + $j$2 = $j$142 + 1 | 0; + } else { + $242 = HEAP32[$labelInfo + 1179664 + ($236 + -1 << 2) >> 2] | 0; + $j$2 = $j$142; + } + HEAP32[$wk$443 >> 2] = $242; + if (($i$341 | 0) < ($wk_max$0$lcssa | 0)) { + $i$341 = $i$341 + 1 | 0; + $j$142 = $j$2; + $wk$443 = $wk$443 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $246 = $labelInfo + 8 | 0; + $247 = $j$1$lcssa + -1 | 0; + HEAP32[$246 >> 2] = $247; + if (!$247) $$0 = 0; else { + _memset($234 | 0, 0, $247 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $247 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$439 = 0; + do { + $254 = $i$439 << 2; + HEAP32[$labelInfo + 131084 + ($254 << 2) >> 2] = $xsize; + HEAP32[$labelInfo + 131084 + (($254 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($254 | 2) << 2) >> 2] = $ysize; + HEAP32[$labelInfo + 131084 + (($254 | 3) << 2) >> 2] = 0; + $i$439 = $i$439 + 1 | 0; + } while (($i$439 | 0) < (HEAP32[$246 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$537 = 0; + do { + $268 = (HEAP32[$labelInfo + 1179664 + ($i$537 << 2) >> 2] | 0) + -1 | 0; + $269 = $i$537 * 7 | 0; + $272 = $labelInfo + 12 + ($268 << 2) | 0; + HEAP32[$272 >> 2] = (HEAP32[$272 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($269 << 2) >> 2] | 0); + $279 = $268 << 1; + $280 = $labelInfo + 655376 + ($279 << 3) | 0; + HEAPF64[$280 >> 3] = +HEAPF64[$280 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($269 + 1 << 2) >> 2] | 0); + $288 = $labelInfo + 655376 + (($279 | 1) << 3) | 0; + HEAPF64[$288 >> 3] = +HEAPF64[$288 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($269 + 2 << 2) >> 2] | 0); + $291 = $268 << 2; + $292 = $labelInfo + 131084 + ($291 << 2) | 0; + $296 = HEAP32[$labelInfo + 1310736 + ($269 + 3 << 2) >> 2] | 0; + if ((HEAP32[$292 >> 2] | 0) > ($296 | 0)) HEAP32[$292 >> 2] = $296; + $299 = $labelInfo + 131084 + (($291 | 1) << 2) | 0; + $303 = HEAP32[$labelInfo + 1310736 + ($269 + 4 << 2) >> 2] | 0; + if ((HEAP32[$299 >> 2] | 0) < ($303 | 0)) HEAP32[$299 >> 2] = $303; + $306 = $labelInfo + 131084 + (($291 | 2) << 2) | 0; + $310 = HEAP32[$labelInfo + 1310736 + ($269 + 5 << 2) >> 2] | 0; + if ((HEAP32[$306 >> 2] | 0) > ($310 | 0)) HEAP32[$306 >> 2] = $310; + $313 = $labelInfo + 131084 + (($291 | 3) << 2) | 0; + $317 = HEAP32[$labelInfo + 1310736 + ($269 + 6 << 2) >> 2] | 0; + if ((HEAP32[$313 >> 2] | 0) < ($317 | 0)) HEAP32[$313 >> 2] = $317; + $i$537 = $i$537 + 1 | 0; + } while (($i$537 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$246 >> 2] | 0) > 0) { + $i$636 = 0; + do { + $321 = $labelInfo + 12 + ($i$636 << 2) | 0; + $324 = $i$636 << 1; + $325 = $labelInfo + 655376 + ($324 << 3) | 0; + HEAPF64[$325 >> 3] = +HEAPF64[$325 >> 3] / +(HEAP32[$321 >> 2] | 0); + $331 = $labelInfo + 655376 + (($324 | 1) << 3) | 0; + HEAPF64[$331 >> 3] = +HEAPF64[$331 >> 3] / +(HEAP32[$321 >> 2] | 0); + $i$636 = $i$636 + 1 | 0; + } while (($i$636 | 0) < (HEAP32[$246 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubEBR3C($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $0 = 0, $1 = 0, $10 = 0, $100 = 0, $106 = 0, $111 = 0, $114 = 0, $131 = 0, $133 = 0, $135 = 0, $139 = 0, $143 = 0, $146 = 0, $148 = 0, $152 = 0, $156 = 0, $160 = 0, $165 = 0, $167 = 0, $17 = 0, $171 = 0, $175 = 0, $179 = 0, $18 = 0, $185 = 0, $188 = 0, $19 = 0, $190 = 0, $194 = 0, $198 = 0, $202 = 0, $205 = 0, $210 = 0, $225 = 0, $226 = 0, $227 = 0, $234 = 0, $236 = 0, $242 = 0, $246 = 0, $247 = 0, $254 = 0, $268 = 0, $269 = 0, $27 = 0, $272 = 0, $279 = 0, $280 = 0, $288 = 0, $291 = 0, $292 = 0, $296 = 0, $299 = 0, $303 = 0, $306 = 0, $310 = 0, $313 = 0, $317 = 0, $321 = 0, $324 = 0, $325 = 0, $331 = 0, $40 = 0, $43 = 0, $45 = 0, $49 = 0, $53 = 0, $59 = 0, $60 = 0, $63 = 0, $64 = 0, $65 = 0, $68 = 0, $71 = 0, $88 = 0, $9 = 0, $90 = 0, $92 = 0, $96 = 0, $dpnt$077 = 0, $dpnt$1$lcssa = 0, $dpnt$166 = 0, $i$088 = 0, $i$182 = 0, $i$264 = 0, $i$341 = 0, $i$439 = 0, $i$537 = 0, $i$636 = 0, $j$075 = 0, $j$1$lcssa = 0, $j$142 = 0, $j$2 = 0, $k$055 = 0, $k$152 = 0, $k$248 = 0, $k$345 = 0, $pnt$079 = 0, $pnt$1$lcssa = 0, $pnt$168 = 0, $pnt1$090 = 0, $pnt1$184 = 0, $pnt2$089 = 0, $pnt2$183 = 0, $pnt2$278 = 0, $pnt2$3$lcssa = 0, $pnt2$367 = 0, $vararg_buffer = 0, $wk$056 = 0, $wk$153 = 0, $wk$249 = 0, $wk$346 = 0, $wk$443 = 0, $wk_max$0$lcssa = 0, $wk_max$074 = 0, $wk_max$1$lcssa = 0, $wk_max$159 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = HEAP32[$labelInfo >> 2] | 0; + $1 = $ysize + -1 | 0; + if (($xsize | 0) > 0) { + $i$088 = 0; + $pnt1$090 = $0; + $pnt2$089 = $0 + ((Math_imul($1, $xsize) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$089 >> 1] = 0; + HEAP16[$pnt1$090 >> 1] = 0; + $i$088 = $i$088 + 1 | 0; + if (($i$088 | 0) >= ($xsize | 0)) break; else { + $pnt1$090 = $pnt1$090 + 2 | 0; + $pnt2$089 = $pnt2$089 + 2 | 0; + } + } + } + $9 = $labelingThresh * 3 | 0; + $10 = $xsize + -1 | 0; + if (($ysize | 0) > 0) { + $i$182 = 0; + $pnt1$184 = $0; + $pnt2$183 = $0 + ($10 << 1) | 0; + while (1) { + HEAP16[$pnt2$183 >> 1] = 0; + HEAP16[$pnt1$184 >> 1] = 0; + $i$182 = $i$182 + 1 | 0; + if (($i$182 | 0) >= ($ysize | 0)) break; else { + $pnt1$184 = $pnt1$184 + ($xsize << 1) | 0; + $pnt2$183 = $pnt2$183 + ($xsize << 1) | 0; + } + } + } + $17 = $labelInfo + 1179664 | 0; + $18 = $xsize + 1 | 0; + $19 = 0 - $xsize | 0; + $$sum = 1 - $xsize | 0; + $$sum1 = ~$xsize; + L11 : do if (($1 | 0) > 1) { + $27 = ($10 | 0) > 1; + $dpnt$077 = (HEAP32[$labelInfo + 4 >> 2] | 0) + $18 | 0; + $j$075 = 1; + $pnt$079 = $image + ($18 * 3 | 0) | 0; + $pnt2$278 = $0 + ($18 << 1) | 0; + $wk_max$074 = 0; + L13 : while (1) { + if ($27) { + $dpnt$166 = $dpnt$077; + $i$264 = 1; + $pnt$168 = $pnt$079; + $pnt2$367 = $pnt2$278; + $wk_max$159 = $wk_max$074; + while (1) { + do if (((HEAPU8[$pnt$168 + 1 >> 0] | 0) + (HEAPU8[$pnt$168 >> 0] | 0) + (HEAPU8[$pnt$168 + 2 >> 0] | 0) | 0) > ($9 | 0)) { + HEAP16[$pnt2$367 >> 1] = 0; + HEAP8[$dpnt$166 >> 0] = 0; + $wk_max$2 = $wk_max$159; + } else { + HEAP8[$dpnt$166 >> 0] = -1; + $40 = HEAP16[$pnt2$367 + ($19 << 1) >> 1] | 0; + if ($40 << 16 >> 16 > 0) { + HEAP16[$pnt2$367 >> 1] = $40; + $43 = ($40 << 16 >> 16) * 7 | 0; + $45 = $labelInfo + 1310736 + ($43 + -7 << 2) | 0; + HEAP32[$45 >> 2] = (HEAP32[$45 >> 2] | 0) + 1; + $49 = $labelInfo + 1310736 + ($43 + -6 << 2) | 0; + HEAP32[$49 >> 2] = (HEAP32[$49 >> 2] | 0) + $i$264; + $53 = $labelInfo + 1310736 + ($43 + -5 << 2) | 0; + HEAP32[$53 >> 2] = (HEAP32[$53 >> 2] | 0) + $j$075; + HEAP32[$labelInfo + 1310736 + ($43 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $59 = HEAP16[$pnt2$367 + ($$sum << 1) >> 1] | 0; + $60 = $59 << 16 >> 16; + $63 = HEAP16[$pnt2$367 + ($$sum1 << 1) >> 1] | 0; + $64 = $63 << 16 >> 16; + $65 = $63 << 16 >> 16 > 0; + if ($59 << 16 >> 16 <= 0) { + if ($65) { + HEAP16[$pnt2$367 >> 1] = $63; + $165 = $64 * 7 | 0; + $167 = $labelInfo + 1310736 + ($165 + -7 << 2) | 0; + HEAP32[$167 >> 2] = (HEAP32[$167 >> 2] | 0) + 1; + $171 = $labelInfo + 1310736 + ($165 + -6 << 2) | 0; + HEAP32[$171 >> 2] = (HEAP32[$171 >> 2] | 0) + $i$264; + $175 = $labelInfo + 1310736 + ($165 + -5 << 2) | 0; + HEAP32[$175 >> 2] = (HEAP32[$175 >> 2] | 0) + $j$075; + $179 = $labelInfo + 1310736 + ($165 + -3 << 2) | 0; + if ((HEAP32[$179 >> 2] | 0) < ($i$264 | 0)) HEAP32[$179 >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($165 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $185 = HEAP16[$pnt2$367 + -2 >> 1] | 0; + if ($185 << 16 >> 16 > 0) { + HEAP16[$pnt2$367 >> 1] = $185; + $188 = ($185 << 16 >> 16) * 7 | 0; + $190 = $labelInfo + 1310736 + ($188 + -7 << 2) | 0; + HEAP32[$190 >> 2] = (HEAP32[$190 >> 2] | 0) + 1; + $194 = $labelInfo + 1310736 + ($188 + -6 << 2) | 0; + HEAP32[$194 >> 2] = (HEAP32[$194 >> 2] | 0) + $i$264; + $198 = $labelInfo + 1310736 + ($188 + -5 << 2) | 0; + HEAP32[$198 >> 2] = (HEAP32[$198 >> 2] | 0) + $j$075; + $202 = $labelInfo + 1310736 + ($188 + -3 << 2) | 0; + if ((HEAP32[$202 >> 2] | 0) >= ($i$264 | 0)) { + $wk_max$2 = $wk_max$159; + break; + } + HEAP32[$202 >> 2] = $i$264; + $wk_max$2 = $wk_max$159; + break; + } else { + $205 = $wk_max$159 + 1 | 0; + if (($wk_max$159 | 0) > 32767) break L13; + HEAP16[$pnt2$367 >> 1] = $205; + HEAP32[$labelInfo + 1179664 + ($wk_max$159 << 2) >> 2] = $205 << 16 >> 16; + $210 = $wk_max$159 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($210 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($210 + 1 << 2) >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($210 + 2 << 2) >> 2] = $j$075; + HEAP32[$labelInfo + 1310736 + ($210 + 3 << 2) >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($210 + 4 << 2) >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($210 + 5 << 2) >> 2] = $j$075; + HEAP32[$labelInfo + 1310736 + ($210 + 6 << 2) >> 2] = $j$075; + $wk_max$2 = $205; + break; + } + } + if ($65) { + $68 = HEAP32[$labelInfo + 1179664 + ($60 + -1 << 2) >> 2] | 0; + $71 = HEAP32[$labelInfo + 1179664 + ($64 + -1 << 2) >> 2] | 0; + if (($68 | 0) > ($71 | 0)) { + HEAP16[$pnt2$367 >> 1] = $71; + if (($wk_max$159 | 0) > 0) { + $k$055 = 0; + $wk$056 = $17; + while (1) { + if ((HEAP32[$wk$056 >> 2] | 0) == ($68 | 0)) HEAP32[$wk$056 >> 2] = $71; + $k$055 = $k$055 + 1 | 0; + if (($k$055 | 0) >= ($wk_max$159 | 0)) { + $88 = $71; + break; + } else $wk$056 = $wk$056 + 4 | 0; + } + } else $88 = $71; + } else { + HEAP16[$pnt2$367 >> 1] = $68; + if (($68 | 0) < ($71 | 0) & ($wk_max$159 | 0) > 0) { + $k$152 = 0; + $wk$153 = $17; + while (1) { + if ((HEAP32[$wk$153 >> 2] | 0) == ($71 | 0)) HEAP32[$wk$153 >> 2] = $68; + $k$152 = $k$152 + 1 | 0; + if (($k$152 | 0) >= ($wk_max$159 | 0)) { + $88 = $68; + break; + } else $wk$153 = $wk$153 + 4 | 0; + } + } else $88 = $68; + } + $90 = ($88 << 16 >> 16) * 7 | 0; + $92 = $labelInfo + 1310736 + ($90 + -7 << 2) | 0; + HEAP32[$92 >> 2] = (HEAP32[$92 >> 2] | 0) + 1; + $96 = $labelInfo + 1310736 + ($90 + -6 << 2) | 0; + HEAP32[$96 >> 2] = (HEAP32[$96 >> 2] | 0) + $i$264; + $100 = $labelInfo + 1310736 + ($90 + -5 << 2) | 0; + HEAP32[$100 >> 2] = (HEAP32[$100 >> 2] | 0) + $j$075; + HEAP32[$labelInfo + 1310736 + ($90 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $106 = HEAP16[$pnt2$367 + -2 >> 1] | 0; + if ($106 << 16 >> 16 <= 0) { + HEAP16[$pnt2$367 >> 1] = $59; + $146 = $60 * 7 | 0; + $148 = $labelInfo + 1310736 + ($146 + -7 << 2) | 0; + HEAP32[$148 >> 2] = (HEAP32[$148 >> 2] | 0) + 1; + $152 = $labelInfo + 1310736 + ($146 + -6 << 2) | 0; + HEAP32[$152 >> 2] = (HEAP32[$152 >> 2] | 0) + $i$264; + $156 = $labelInfo + 1310736 + ($146 + -5 << 2) | 0; + HEAP32[$156 >> 2] = (HEAP32[$156 >> 2] | 0) + $j$075; + $160 = $labelInfo + 1310736 + ($146 + -4 << 2) | 0; + if ((HEAP32[$160 >> 2] | 0) > ($i$264 | 0)) HEAP32[$160 >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($146 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $111 = HEAP32[$labelInfo + 1179664 + ($60 + -1 << 2) >> 2] | 0; + $114 = HEAP32[$labelInfo + 1179664 + (($106 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($111 | 0) > ($114 | 0)) { + HEAP16[$pnt2$367 >> 1] = $114; + if (($wk_max$159 | 0) > 0) { + $k$248 = 0; + $wk$249 = $17; + while (1) { + if ((HEAP32[$wk$249 >> 2] | 0) == ($111 | 0)) HEAP32[$wk$249 >> 2] = $114; + $k$248 = $k$248 + 1 | 0; + if (($k$248 | 0) >= ($wk_max$159 | 0)) { + $131 = $114; + break; + } else $wk$249 = $wk$249 + 4 | 0; + } + } else $131 = $114; + } else { + HEAP16[$pnt2$367 >> 1] = $111; + if (($111 | 0) < ($114 | 0) & ($wk_max$159 | 0) > 0) { + $k$345 = 0; + $wk$346 = $17; + while (1) { + if ((HEAP32[$wk$346 >> 2] | 0) == ($114 | 0)) HEAP32[$wk$346 >> 2] = $111; + $k$345 = $k$345 + 1 | 0; + if (($k$345 | 0) >= ($wk_max$159 | 0)) { + $131 = $111; + break; + } else $wk$346 = $wk$346 + 4 | 0; + } + } else $131 = $111; + } + $133 = ($131 << 16 >> 16) * 7 | 0; + $135 = $labelInfo + 1310736 + ($133 + -7 << 2) | 0; + HEAP32[$135 >> 2] = (HEAP32[$135 >> 2] | 0) + 1; + $139 = $labelInfo + 1310736 + ($133 + -6 << 2) | 0; + HEAP32[$139 >> 2] = (HEAP32[$139 >> 2] | 0) + $i$264; + $143 = $labelInfo + 1310736 + ($133 + -5 << 2) | 0; + HEAP32[$143 >> 2] = (HEAP32[$143 >> 2] | 0) + $j$075; + $wk_max$2 = $wk_max$159; + } while (0); + $i$264 = $i$264 + 1 | 0; + $225 = $pnt$168 + 3 | 0; + $226 = $pnt2$367 + 2 | 0; + $227 = $dpnt$166 + 1 | 0; + if (($i$264 | 0) >= ($10 | 0)) { + $dpnt$1$lcssa = $227; + $pnt$1$lcssa = $225; + $pnt2$3$lcssa = $226; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $dpnt$166 = $227; + $pnt$168 = $225; + $pnt2$367 = $226; + $wk_max$159 = $wk_max$2; + } + } + } else { + $dpnt$1$lcssa = $dpnt$077; + $pnt$1$lcssa = $pnt$079; + $pnt2$3$lcssa = $pnt2$278; + $wk_max$1$lcssa = $wk_max$074; + } + $j$075 = $j$075 + 1 | 0; + if (($j$075 | 0) >= ($1 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $dpnt$077 = $dpnt$1$lcssa + 2 | 0; + $pnt$079 = $pnt$1$lcssa + 6 | 0; + $pnt2$278 = $pnt2$3$lcssa + 4 | 0; + $wk_max$074 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $234 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$341 = 1; + $j$142 = 1; + $wk$443 = $17; + while (1) { + $236 = HEAP32[$wk$443 >> 2] | 0; + if (($236 | 0) == ($i$341 | 0)) { + $242 = $j$142; + $j$2 = $j$142 + 1 | 0; + } else { + $242 = HEAP32[$labelInfo + 1179664 + ($236 + -1 << 2) >> 2] | 0; + $j$2 = $j$142; + } + HEAP32[$wk$443 >> 2] = $242; + if (($i$341 | 0) < ($wk_max$0$lcssa | 0)) { + $i$341 = $i$341 + 1 | 0; + $j$142 = $j$2; + $wk$443 = $wk$443 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $246 = $labelInfo + 8 | 0; + $247 = $j$1$lcssa + -1 | 0; + HEAP32[$246 >> 2] = $247; + if (!$247) $$0 = 0; else { + _memset($234 | 0, 0, $247 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $247 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$439 = 0; + do { + $254 = $i$439 << 2; + HEAP32[$labelInfo + 131084 + ($254 << 2) >> 2] = $xsize; + HEAP32[$labelInfo + 131084 + (($254 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($254 | 2) << 2) >> 2] = $ysize; + HEAP32[$labelInfo + 131084 + (($254 | 3) << 2) >> 2] = 0; + $i$439 = $i$439 + 1 | 0; + } while (($i$439 | 0) < (HEAP32[$246 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$537 = 0; + do { + $268 = (HEAP32[$labelInfo + 1179664 + ($i$537 << 2) >> 2] | 0) + -1 | 0; + $269 = $i$537 * 7 | 0; + $272 = $labelInfo + 12 + ($268 << 2) | 0; + HEAP32[$272 >> 2] = (HEAP32[$272 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($269 << 2) >> 2] | 0); + $279 = $268 << 1; + $280 = $labelInfo + 655376 + ($279 << 3) | 0; + HEAPF64[$280 >> 3] = +HEAPF64[$280 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($269 + 1 << 2) >> 2] | 0); + $288 = $labelInfo + 655376 + (($279 | 1) << 3) | 0; + HEAPF64[$288 >> 3] = +HEAPF64[$288 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($269 + 2 << 2) >> 2] | 0); + $291 = $268 << 2; + $292 = $labelInfo + 131084 + ($291 << 2) | 0; + $296 = HEAP32[$labelInfo + 1310736 + ($269 + 3 << 2) >> 2] | 0; + if ((HEAP32[$292 >> 2] | 0) > ($296 | 0)) HEAP32[$292 >> 2] = $296; + $299 = $labelInfo + 131084 + (($291 | 1) << 2) | 0; + $303 = HEAP32[$labelInfo + 1310736 + ($269 + 4 << 2) >> 2] | 0; + if ((HEAP32[$299 >> 2] | 0) < ($303 | 0)) HEAP32[$299 >> 2] = $303; + $306 = $labelInfo + 131084 + (($291 | 2) << 2) | 0; + $310 = HEAP32[$labelInfo + 1310736 + ($269 + 5 << 2) >> 2] | 0; + if ((HEAP32[$306 >> 2] | 0) > ($310 | 0)) HEAP32[$306 >> 2] = $310; + $313 = $labelInfo + 131084 + (($291 | 3) << 2) | 0; + $317 = HEAP32[$labelInfo + 1310736 + ($269 + 6 << 2) >> 2] | 0; + if ((HEAP32[$313 >> 2] | 0) < ($317 | 0)) HEAP32[$313 >> 2] = $317; + $i$537 = $i$537 + 1 | 0; + } while (($i$537 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$246 >> 2] | 0) > 0) { + $i$636 = 0; + do { + $321 = $labelInfo + 12 + ($i$636 << 2) | 0; + $324 = $i$636 << 1; + $325 = $labelInfo + 655376 + ($324 << 3) | 0; + HEAPF64[$325 >> 3] = +HEAPF64[$325 >> 3] / +(HEAP32[$321 >> 2] | 0); + $331 = $labelInfo + 655376 + (($324 | 1) << 3) | 0; + HEAPF64[$331 >> 3] = +HEAPF64[$331 >> 3] / +(HEAP32[$321 >> 2] | 0); + $i$636 = $i$636 + 1 | 0; + } while (($i$636 | 0) < (HEAP32[$246 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubEWR3CA($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $0 = 0, $1 = 0, $10 = 0, $100 = 0, $106 = 0, $111 = 0, $114 = 0, $131 = 0, $133 = 0, $135 = 0, $139 = 0, $143 = 0, $146 = 0, $148 = 0, $152 = 0, $156 = 0, $160 = 0, $165 = 0, $167 = 0, $17 = 0, $171 = 0, $175 = 0, $179 = 0, $18 = 0, $185 = 0, $188 = 0, $19 = 0, $190 = 0, $194 = 0, $198 = 0, $202 = 0, $205 = 0, $210 = 0, $225 = 0, $226 = 0, $227 = 0, $234 = 0, $236 = 0, $242 = 0, $246 = 0, $247 = 0, $254 = 0, $268 = 0, $269 = 0, $27 = 0, $272 = 0, $279 = 0, $280 = 0, $288 = 0, $291 = 0, $292 = 0, $296 = 0, $299 = 0, $303 = 0, $306 = 0, $310 = 0, $313 = 0, $317 = 0, $321 = 0, $324 = 0, $325 = 0, $331 = 0, $40 = 0, $43 = 0, $45 = 0, $49 = 0, $53 = 0, $59 = 0, $60 = 0, $63 = 0, $64 = 0, $65 = 0, $68 = 0, $71 = 0, $88 = 0, $9 = 0, $90 = 0, $92 = 0, $96 = 0, $dpnt$077 = 0, $dpnt$1$lcssa = 0, $dpnt$166 = 0, $i$088 = 0, $i$182 = 0, $i$264 = 0, $i$341 = 0, $i$439 = 0, $i$537 = 0, $i$636 = 0, $j$075 = 0, $j$1$lcssa = 0, $j$142 = 0, $j$2 = 0, $k$055 = 0, $k$152 = 0, $k$248 = 0, $k$345 = 0, $pnt$079 = 0, $pnt$1$lcssa = 0, $pnt$168 = 0, $pnt1$090 = 0, $pnt1$184 = 0, $pnt2$089 = 0, $pnt2$183 = 0, $pnt2$278 = 0, $pnt2$3$lcssa = 0, $pnt2$367 = 0, $vararg_buffer = 0, $wk$056 = 0, $wk$153 = 0, $wk$249 = 0, $wk$346 = 0, $wk$443 = 0, $wk_max$0$lcssa = 0, $wk_max$074 = 0, $wk_max$1$lcssa = 0, $wk_max$159 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = HEAP32[$labelInfo >> 2] | 0; + $1 = $ysize + -1 | 0; + if (($xsize | 0) > 0) { + $i$088 = 0; + $pnt1$090 = $0; + $pnt2$089 = $0 + ((Math_imul($1, $xsize) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$089 >> 1] = 0; + HEAP16[$pnt1$090 >> 1] = 0; + $i$088 = $i$088 + 1 | 0; + if (($i$088 | 0) >= ($xsize | 0)) break; else { + $pnt1$090 = $pnt1$090 + 2 | 0; + $pnt2$089 = $pnt2$089 + 2 | 0; + } + } + } + $9 = $labelingThresh * 3 | 0; + $10 = $xsize + -1 | 0; + if (($ysize | 0) > 0) { + $i$182 = 0; + $pnt1$184 = $0; + $pnt2$183 = $0 + ($10 << 1) | 0; + while (1) { + HEAP16[$pnt2$183 >> 1] = 0; + HEAP16[$pnt1$184 >> 1] = 0; + $i$182 = $i$182 + 1 | 0; + if (($i$182 | 0) >= ($ysize | 0)) break; else { + $pnt1$184 = $pnt1$184 + ($xsize << 1) | 0; + $pnt2$183 = $pnt2$183 + ($xsize << 1) | 0; + } + } + } + $17 = $labelInfo + 1179664 | 0; + $18 = $xsize + 1 | 0; + $19 = 0 - $xsize | 0; + $$sum = 1 - $xsize | 0; + $$sum1 = ~$xsize; + L11 : do if (($1 | 0) > 1) { + $27 = ($10 | 0) > 1; + $dpnt$077 = (HEAP32[$labelInfo + 4 >> 2] | 0) + $18 | 0; + $j$075 = 1; + $pnt$079 = $image + ($18 << 2) | 0; + $pnt2$278 = $0 + ($18 << 1) | 0; + $wk_max$074 = 0; + L13 : while (1) { + if ($27) { + $dpnt$166 = $dpnt$077; + $i$264 = 1; + $pnt$168 = $pnt$079; + $pnt2$367 = $pnt2$278; + $wk_max$159 = $wk_max$074; + while (1) { + do if (((HEAPU8[$pnt$168 + 1 >> 0] | 0) + (HEAPU8[$pnt$168 >> 0] | 0) + (HEAPU8[$pnt$168 + 2 >> 0] | 0) | 0) > ($9 | 0)) { + HEAP8[$dpnt$166 >> 0] = -1; + $40 = HEAP16[$pnt2$367 + ($19 << 1) >> 1] | 0; + if ($40 << 16 >> 16 > 0) { + HEAP16[$pnt2$367 >> 1] = $40; + $43 = ($40 << 16 >> 16) * 7 | 0; + $45 = $labelInfo + 1310736 + ($43 + -7 << 2) | 0; + HEAP32[$45 >> 2] = (HEAP32[$45 >> 2] | 0) + 1; + $49 = $labelInfo + 1310736 + ($43 + -6 << 2) | 0; + HEAP32[$49 >> 2] = (HEAP32[$49 >> 2] | 0) + $i$264; + $53 = $labelInfo + 1310736 + ($43 + -5 << 2) | 0; + HEAP32[$53 >> 2] = (HEAP32[$53 >> 2] | 0) + $j$075; + HEAP32[$labelInfo + 1310736 + ($43 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $59 = HEAP16[$pnt2$367 + ($$sum << 1) >> 1] | 0; + $60 = $59 << 16 >> 16; + $63 = HEAP16[$pnt2$367 + ($$sum1 << 1) >> 1] | 0; + $64 = $63 << 16 >> 16; + $65 = $63 << 16 >> 16 > 0; + if ($59 << 16 >> 16 <= 0) { + if ($65) { + HEAP16[$pnt2$367 >> 1] = $63; + $165 = $64 * 7 | 0; + $167 = $labelInfo + 1310736 + ($165 + -7 << 2) | 0; + HEAP32[$167 >> 2] = (HEAP32[$167 >> 2] | 0) + 1; + $171 = $labelInfo + 1310736 + ($165 + -6 << 2) | 0; + HEAP32[$171 >> 2] = (HEAP32[$171 >> 2] | 0) + $i$264; + $175 = $labelInfo + 1310736 + ($165 + -5 << 2) | 0; + HEAP32[$175 >> 2] = (HEAP32[$175 >> 2] | 0) + $j$075; + $179 = $labelInfo + 1310736 + ($165 + -3 << 2) | 0; + if ((HEAP32[$179 >> 2] | 0) < ($i$264 | 0)) HEAP32[$179 >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($165 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $185 = HEAP16[$pnt2$367 + -2 >> 1] | 0; + if ($185 << 16 >> 16 > 0) { + HEAP16[$pnt2$367 >> 1] = $185; + $188 = ($185 << 16 >> 16) * 7 | 0; + $190 = $labelInfo + 1310736 + ($188 + -7 << 2) | 0; + HEAP32[$190 >> 2] = (HEAP32[$190 >> 2] | 0) + 1; + $194 = $labelInfo + 1310736 + ($188 + -6 << 2) | 0; + HEAP32[$194 >> 2] = (HEAP32[$194 >> 2] | 0) + $i$264; + $198 = $labelInfo + 1310736 + ($188 + -5 << 2) | 0; + HEAP32[$198 >> 2] = (HEAP32[$198 >> 2] | 0) + $j$075; + $202 = $labelInfo + 1310736 + ($188 + -3 << 2) | 0; + if ((HEAP32[$202 >> 2] | 0) >= ($i$264 | 0)) { + $wk_max$2 = $wk_max$159; + break; + } + HEAP32[$202 >> 2] = $i$264; + $wk_max$2 = $wk_max$159; + break; + } else { + $205 = $wk_max$159 + 1 | 0; + if (($wk_max$159 | 0) > 32767) break L13; + HEAP16[$pnt2$367 >> 1] = $205; + HEAP32[$labelInfo + 1179664 + ($wk_max$159 << 2) >> 2] = $205 << 16 >> 16; + $210 = $wk_max$159 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($210 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($210 + 1 << 2) >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($210 + 2 << 2) >> 2] = $j$075; + HEAP32[$labelInfo + 1310736 + ($210 + 3 << 2) >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($210 + 4 << 2) >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($210 + 5 << 2) >> 2] = $j$075; + HEAP32[$labelInfo + 1310736 + ($210 + 6 << 2) >> 2] = $j$075; + $wk_max$2 = $205; + break; + } + } + if ($65) { + $68 = HEAP32[$labelInfo + 1179664 + ($60 + -1 << 2) >> 2] | 0; + $71 = HEAP32[$labelInfo + 1179664 + ($64 + -1 << 2) >> 2] | 0; + if (($68 | 0) > ($71 | 0)) { + HEAP16[$pnt2$367 >> 1] = $71; + if (($wk_max$159 | 0) > 0) { + $k$055 = 0; + $wk$056 = $17; + while (1) { + if ((HEAP32[$wk$056 >> 2] | 0) == ($68 | 0)) HEAP32[$wk$056 >> 2] = $71; + $k$055 = $k$055 + 1 | 0; + if (($k$055 | 0) >= ($wk_max$159 | 0)) { + $88 = $71; + break; + } else $wk$056 = $wk$056 + 4 | 0; + } + } else $88 = $71; + } else { + HEAP16[$pnt2$367 >> 1] = $68; + if (($68 | 0) < ($71 | 0) & ($wk_max$159 | 0) > 0) { + $k$152 = 0; + $wk$153 = $17; + while (1) { + if ((HEAP32[$wk$153 >> 2] | 0) == ($71 | 0)) HEAP32[$wk$153 >> 2] = $68; + $k$152 = $k$152 + 1 | 0; + if (($k$152 | 0) >= ($wk_max$159 | 0)) { + $88 = $68; + break; + } else $wk$153 = $wk$153 + 4 | 0; + } + } else $88 = $68; + } + $90 = ($88 << 16 >> 16) * 7 | 0; + $92 = $labelInfo + 1310736 + ($90 + -7 << 2) | 0; + HEAP32[$92 >> 2] = (HEAP32[$92 >> 2] | 0) + 1; + $96 = $labelInfo + 1310736 + ($90 + -6 << 2) | 0; + HEAP32[$96 >> 2] = (HEAP32[$96 >> 2] | 0) + $i$264; + $100 = $labelInfo + 1310736 + ($90 + -5 << 2) | 0; + HEAP32[$100 >> 2] = (HEAP32[$100 >> 2] | 0) + $j$075; + HEAP32[$labelInfo + 1310736 + ($90 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $106 = HEAP16[$pnt2$367 + -2 >> 1] | 0; + if ($106 << 16 >> 16 <= 0) { + HEAP16[$pnt2$367 >> 1] = $59; + $146 = $60 * 7 | 0; + $148 = $labelInfo + 1310736 + ($146 + -7 << 2) | 0; + HEAP32[$148 >> 2] = (HEAP32[$148 >> 2] | 0) + 1; + $152 = $labelInfo + 1310736 + ($146 + -6 << 2) | 0; + HEAP32[$152 >> 2] = (HEAP32[$152 >> 2] | 0) + $i$264; + $156 = $labelInfo + 1310736 + ($146 + -5 << 2) | 0; + HEAP32[$156 >> 2] = (HEAP32[$156 >> 2] | 0) + $j$075; + $160 = $labelInfo + 1310736 + ($146 + -4 << 2) | 0; + if ((HEAP32[$160 >> 2] | 0) > ($i$264 | 0)) HEAP32[$160 >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($146 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $111 = HEAP32[$labelInfo + 1179664 + ($60 + -1 << 2) >> 2] | 0; + $114 = HEAP32[$labelInfo + 1179664 + (($106 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($111 | 0) > ($114 | 0)) { + HEAP16[$pnt2$367 >> 1] = $114; + if (($wk_max$159 | 0) > 0) { + $k$248 = 0; + $wk$249 = $17; + while (1) { + if ((HEAP32[$wk$249 >> 2] | 0) == ($111 | 0)) HEAP32[$wk$249 >> 2] = $114; + $k$248 = $k$248 + 1 | 0; + if (($k$248 | 0) >= ($wk_max$159 | 0)) { + $131 = $114; + break; + } else $wk$249 = $wk$249 + 4 | 0; + } + } else $131 = $114; + } else { + HEAP16[$pnt2$367 >> 1] = $111; + if (($111 | 0) < ($114 | 0) & ($wk_max$159 | 0) > 0) { + $k$345 = 0; + $wk$346 = $17; + while (1) { + if ((HEAP32[$wk$346 >> 2] | 0) == ($114 | 0)) HEAP32[$wk$346 >> 2] = $111; + $k$345 = $k$345 + 1 | 0; + if (($k$345 | 0) >= ($wk_max$159 | 0)) { + $131 = $111; + break; + } else $wk$346 = $wk$346 + 4 | 0; + } + } else $131 = $111; + } + $133 = ($131 << 16 >> 16) * 7 | 0; + $135 = $labelInfo + 1310736 + ($133 + -7 << 2) | 0; + HEAP32[$135 >> 2] = (HEAP32[$135 >> 2] | 0) + 1; + $139 = $labelInfo + 1310736 + ($133 + -6 << 2) | 0; + HEAP32[$139 >> 2] = (HEAP32[$139 >> 2] | 0) + $i$264; + $143 = $labelInfo + 1310736 + ($133 + -5 << 2) | 0; + HEAP32[$143 >> 2] = (HEAP32[$143 >> 2] | 0) + $j$075; + $wk_max$2 = $wk_max$159; + } else { + HEAP16[$pnt2$367 >> 1] = 0; + HEAP8[$dpnt$166 >> 0] = 0; + $wk_max$2 = $wk_max$159; + } while (0); + $i$264 = $i$264 + 1 | 0; + $225 = $pnt$168 + 4 | 0; + $226 = $pnt2$367 + 2 | 0; + $227 = $dpnt$166 + 1 | 0; + if (($i$264 | 0) >= ($10 | 0)) { + $dpnt$1$lcssa = $227; + $pnt$1$lcssa = $225; + $pnt2$3$lcssa = $226; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $dpnt$166 = $227; + $pnt$168 = $225; + $pnt2$367 = $226; + $wk_max$159 = $wk_max$2; + } + } + } else { + $dpnt$1$lcssa = $dpnt$077; + $pnt$1$lcssa = $pnt$079; + $pnt2$3$lcssa = $pnt2$278; + $wk_max$1$lcssa = $wk_max$074; + } + $j$075 = $j$075 + 1 | 0; + if (($j$075 | 0) >= ($1 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $dpnt$077 = $dpnt$1$lcssa + 2 | 0; + $pnt$079 = $pnt$1$lcssa + 8 | 0; + $pnt2$278 = $pnt2$3$lcssa + 4 | 0; + $wk_max$074 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $234 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$341 = 1; + $j$142 = 1; + $wk$443 = $17; + while (1) { + $236 = HEAP32[$wk$443 >> 2] | 0; + if (($236 | 0) == ($i$341 | 0)) { + $242 = $j$142; + $j$2 = $j$142 + 1 | 0; + } else { + $242 = HEAP32[$labelInfo + 1179664 + ($236 + -1 << 2) >> 2] | 0; + $j$2 = $j$142; + } + HEAP32[$wk$443 >> 2] = $242; + if (($i$341 | 0) < ($wk_max$0$lcssa | 0)) { + $i$341 = $i$341 + 1 | 0; + $j$142 = $j$2; + $wk$443 = $wk$443 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $246 = $labelInfo + 8 | 0; + $247 = $j$1$lcssa + -1 | 0; + HEAP32[$246 >> 2] = $247; + if (!$247) $$0 = 0; else { + _memset($234 | 0, 0, $247 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $247 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$439 = 0; + do { + $254 = $i$439 << 2; + HEAP32[$labelInfo + 131084 + ($254 << 2) >> 2] = $xsize; + HEAP32[$labelInfo + 131084 + (($254 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($254 | 2) << 2) >> 2] = $ysize; + HEAP32[$labelInfo + 131084 + (($254 | 3) << 2) >> 2] = 0; + $i$439 = $i$439 + 1 | 0; + } while (($i$439 | 0) < (HEAP32[$246 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$537 = 0; + do { + $268 = (HEAP32[$labelInfo + 1179664 + ($i$537 << 2) >> 2] | 0) + -1 | 0; + $269 = $i$537 * 7 | 0; + $272 = $labelInfo + 12 + ($268 << 2) | 0; + HEAP32[$272 >> 2] = (HEAP32[$272 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($269 << 2) >> 2] | 0); + $279 = $268 << 1; + $280 = $labelInfo + 655376 + ($279 << 3) | 0; + HEAPF64[$280 >> 3] = +HEAPF64[$280 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($269 + 1 << 2) >> 2] | 0); + $288 = $labelInfo + 655376 + (($279 | 1) << 3) | 0; + HEAPF64[$288 >> 3] = +HEAPF64[$288 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($269 + 2 << 2) >> 2] | 0); + $291 = $268 << 2; + $292 = $labelInfo + 131084 + ($291 << 2) | 0; + $296 = HEAP32[$labelInfo + 1310736 + ($269 + 3 << 2) >> 2] | 0; + if ((HEAP32[$292 >> 2] | 0) > ($296 | 0)) HEAP32[$292 >> 2] = $296; + $299 = $labelInfo + 131084 + (($291 | 1) << 2) | 0; + $303 = HEAP32[$labelInfo + 1310736 + ($269 + 4 << 2) >> 2] | 0; + if ((HEAP32[$299 >> 2] | 0) < ($303 | 0)) HEAP32[$299 >> 2] = $303; + $306 = $labelInfo + 131084 + (($291 | 2) << 2) | 0; + $310 = HEAP32[$labelInfo + 1310736 + ($269 + 5 << 2) >> 2] | 0; + if ((HEAP32[$306 >> 2] | 0) > ($310 | 0)) HEAP32[$306 >> 2] = $310; + $313 = $labelInfo + 131084 + (($291 | 3) << 2) | 0; + $317 = HEAP32[$labelInfo + 1310736 + ($269 + 6 << 2) >> 2] | 0; + if ((HEAP32[$313 >> 2] | 0) < ($317 | 0)) HEAP32[$313 >> 2] = $317; + $i$537 = $i$537 + 1 | 0; + } while (($i$537 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$246 >> 2] | 0) > 0) { + $i$636 = 0; + do { + $321 = $labelInfo + 12 + ($i$636 << 2) | 0; + $324 = $i$636 << 1; + $325 = $labelInfo + 655376 + ($324 << 3) | 0; + HEAPF64[$325 >> 3] = +HEAPF64[$325 >> 3] / +(HEAP32[$321 >> 2] | 0); + $331 = $labelInfo + 655376 + (($324 | 1) << 3) | 0; + HEAPF64[$331 >> 3] = +HEAPF64[$331 >> 3] / +(HEAP32[$321 >> 2] | 0); + $i$636 = $i$636 + 1 | 0; + } while (($i$636 | 0) < (HEAP32[$246 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubEBR3CA($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $0 = 0, $1 = 0, $10 = 0, $100 = 0, $106 = 0, $111 = 0, $114 = 0, $131 = 0, $133 = 0, $135 = 0, $139 = 0, $143 = 0, $146 = 0, $148 = 0, $152 = 0, $156 = 0, $160 = 0, $165 = 0, $167 = 0, $17 = 0, $171 = 0, $175 = 0, $179 = 0, $18 = 0, $185 = 0, $188 = 0, $19 = 0, $190 = 0, $194 = 0, $198 = 0, $202 = 0, $205 = 0, $210 = 0, $225 = 0, $226 = 0, $227 = 0, $234 = 0, $236 = 0, $242 = 0, $246 = 0, $247 = 0, $254 = 0, $268 = 0, $269 = 0, $27 = 0, $272 = 0, $279 = 0, $280 = 0, $288 = 0, $291 = 0, $292 = 0, $296 = 0, $299 = 0, $303 = 0, $306 = 0, $310 = 0, $313 = 0, $317 = 0, $321 = 0, $324 = 0, $325 = 0, $331 = 0, $40 = 0, $43 = 0, $45 = 0, $49 = 0, $53 = 0, $59 = 0, $60 = 0, $63 = 0, $64 = 0, $65 = 0, $68 = 0, $71 = 0, $88 = 0, $9 = 0, $90 = 0, $92 = 0, $96 = 0, $dpnt$077 = 0, $dpnt$1$lcssa = 0, $dpnt$166 = 0, $i$088 = 0, $i$182 = 0, $i$264 = 0, $i$341 = 0, $i$439 = 0, $i$537 = 0, $i$636 = 0, $j$075 = 0, $j$1$lcssa = 0, $j$142 = 0, $j$2 = 0, $k$055 = 0, $k$152 = 0, $k$248 = 0, $k$345 = 0, $pnt$079 = 0, $pnt$1$lcssa = 0, $pnt$168 = 0, $pnt1$090 = 0, $pnt1$184 = 0, $pnt2$089 = 0, $pnt2$183 = 0, $pnt2$278 = 0, $pnt2$3$lcssa = 0, $pnt2$367 = 0, $vararg_buffer = 0, $wk$056 = 0, $wk$153 = 0, $wk$249 = 0, $wk$346 = 0, $wk$443 = 0, $wk_max$0$lcssa = 0, $wk_max$074 = 0, $wk_max$1$lcssa = 0, $wk_max$159 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = HEAP32[$labelInfo >> 2] | 0; + $1 = $ysize + -1 | 0; + if (($xsize | 0) > 0) { + $i$088 = 0; + $pnt1$090 = $0; + $pnt2$089 = $0 + ((Math_imul($1, $xsize) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$089 >> 1] = 0; + HEAP16[$pnt1$090 >> 1] = 0; + $i$088 = $i$088 + 1 | 0; + if (($i$088 | 0) >= ($xsize | 0)) break; else { + $pnt1$090 = $pnt1$090 + 2 | 0; + $pnt2$089 = $pnt2$089 + 2 | 0; + } + } + } + $9 = $labelingThresh * 3 | 0; + $10 = $xsize + -1 | 0; + if (($ysize | 0) > 0) { + $i$182 = 0; + $pnt1$184 = $0; + $pnt2$183 = $0 + ($10 << 1) | 0; + while (1) { + HEAP16[$pnt2$183 >> 1] = 0; + HEAP16[$pnt1$184 >> 1] = 0; + $i$182 = $i$182 + 1 | 0; + if (($i$182 | 0) >= ($ysize | 0)) break; else { + $pnt1$184 = $pnt1$184 + ($xsize << 1) | 0; + $pnt2$183 = $pnt2$183 + ($xsize << 1) | 0; + } + } + } + $17 = $labelInfo + 1179664 | 0; + $18 = $xsize + 1 | 0; + $19 = 0 - $xsize | 0; + $$sum = 1 - $xsize | 0; + $$sum1 = ~$xsize; + L11 : do if (($1 | 0) > 1) { + $27 = ($10 | 0) > 1; + $dpnt$077 = (HEAP32[$labelInfo + 4 >> 2] | 0) + $18 | 0; + $j$075 = 1; + $pnt$079 = $image + ($18 << 2) | 0; + $pnt2$278 = $0 + ($18 << 1) | 0; + $wk_max$074 = 0; + L13 : while (1) { + if ($27) { + $dpnt$166 = $dpnt$077; + $i$264 = 1; + $pnt$168 = $pnt$079; + $pnt2$367 = $pnt2$278; + $wk_max$159 = $wk_max$074; + while (1) { + do if (((HEAPU8[$pnt$168 + 1 >> 0] | 0) + (HEAPU8[$pnt$168 >> 0] | 0) + (HEAPU8[$pnt$168 + 2 >> 0] | 0) | 0) > ($9 | 0)) { + HEAP16[$pnt2$367 >> 1] = 0; + HEAP8[$dpnt$166 >> 0] = 0; + $wk_max$2 = $wk_max$159; + } else { + HEAP8[$dpnt$166 >> 0] = -1; + $40 = HEAP16[$pnt2$367 + ($19 << 1) >> 1] | 0; + if ($40 << 16 >> 16 > 0) { + HEAP16[$pnt2$367 >> 1] = $40; + $43 = ($40 << 16 >> 16) * 7 | 0; + $45 = $labelInfo + 1310736 + ($43 + -7 << 2) | 0; + HEAP32[$45 >> 2] = (HEAP32[$45 >> 2] | 0) + 1; + $49 = $labelInfo + 1310736 + ($43 + -6 << 2) | 0; + HEAP32[$49 >> 2] = (HEAP32[$49 >> 2] | 0) + $i$264; + $53 = $labelInfo + 1310736 + ($43 + -5 << 2) | 0; + HEAP32[$53 >> 2] = (HEAP32[$53 >> 2] | 0) + $j$075; + HEAP32[$labelInfo + 1310736 + ($43 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $59 = HEAP16[$pnt2$367 + ($$sum << 1) >> 1] | 0; + $60 = $59 << 16 >> 16; + $63 = HEAP16[$pnt2$367 + ($$sum1 << 1) >> 1] | 0; + $64 = $63 << 16 >> 16; + $65 = $63 << 16 >> 16 > 0; + if ($59 << 16 >> 16 <= 0) { + if ($65) { + HEAP16[$pnt2$367 >> 1] = $63; + $165 = $64 * 7 | 0; + $167 = $labelInfo + 1310736 + ($165 + -7 << 2) | 0; + HEAP32[$167 >> 2] = (HEAP32[$167 >> 2] | 0) + 1; + $171 = $labelInfo + 1310736 + ($165 + -6 << 2) | 0; + HEAP32[$171 >> 2] = (HEAP32[$171 >> 2] | 0) + $i$264; + $175 = $labelInfo + 1310736 + ($165 + -5 << 2) | 0; + HEAP32[$175 >> 2] = (HEAP32[$175 >> 2] | 0) + $j$075; + $179 = $labelInfo + 1310736 + ($165 + -3 << 2) | 0; + if ((HEAP32[$179 >> 2] | 0) < ($i$264 | 0)) HEAP32[$179 >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($165 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $185 = HEAP16[$pnt2$367 + -2 >> 1] | 0; + if ($185 << 16 >> 16 > 0) { + HEAP16[$pnt2$367 >> 1] = $185; + $188 = ($185 << 16 >> 16) * 7 | 0; + $190 = $labelInfo + 1310736 + ($188 + -7 << 2) | 0; + HEAP32[$190 >> 2] = (HEAP32[$190 >> 2] | 0) + 1; + $194 = $labelInfo + 1310736 + ($188 + -6 << 2) | 0; + HEAP32[$194 >> 2] = (HEAP32[$194 >> 2] | 0) + $i$264; + $198 = $labelInfo + 1310736 + ($188 + -5 << 2) | 0; + HEAP32[$198 >> 2] = (HEAP32[$198 >> 2] | 0) + $j$075; + $202 = $labelInfo + 1310736 + ($188 + -3 << 2) | 0; + if ((HEAP32[$202 >> 2] | 0) >= ($i$264 | 0)) { + $wk_max$2 = $wk_max$159; + break; + } + HEAP32[$202 >> 2] = $i$264; + $wk_max$2 = $wk_max$159; + break; + } else { + $205 = $wk_max$159 + 1 | 0; + if (($wk_max$159 | 0) > 32767) break L13; + HEAP16[$pnt2$367 >> 1] = $205; + HEAP32[$labelInfo + 1179664 + ($wk_max$159 << 2) >> 2] = $205 << 16 >> 16; + $210 = $wk_max$159 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($210 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($210 + 1 << 2) >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($210 + 2 << 2) >> 2] = $j$075; + HEAP32[$labelInfo + 1310736 + ($210 + 3 << 2) >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($210 + 4 << 2) >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($210 + 5 << 2) >> 2] = $j$075; + HEAP32[$labelInfo + 1310736 + ($210 + 6 << 2) >> 2] = $j$075; + $wk_max$2 = $205; + break; + } + } + if ($65) { + $68 = HEAP32[$labelInfo + 1179664 + ($60 + -1 << 2) >> 2] | 0; + $71 = HEAP32[$labelInfo + 1179664 + ($64 + -1 << 2) >> 2] | 0; + if (($68 | 0) > ($71 | 0)) { + HEAP16[$pnt2$367 >> 1] = $71; + if (($wk_max$159 | 0) > 0) { + $k$055 = 0; + $wk$056 = $17; + while (1) { + if ((HEAP32[$wk$056 >> 2] | 0) == ($68 | 0)) HEAP32[$wk$056 >> 2] = $71; + $k$055 = $k$055 + 1 | 0; + if (($k$055 | 0) >= ($wk_max$159 | 0)) { + $88 = $71; + break; + } else $wk$056 = $wk$056 + 4 | 0; + } + } else $88 = $71; + } else { + HEAP16[$pnt2$367 >> 1] = $68; + if (($68 | 0) < ($71 | 0) & ($wk_max$159 | 0) > 0) { + $k$152 = 0; + $wk$153 = $17; + while (1) { + if ((HEAP32[$wk$153 >> 2] | 0) == ($71 | 0)) HEAP32[$wk$153 >> 2] = $68; + $k$152 = $k$152 + 1 | 0; + if (($k$152 | 0) >= ($wk_max$159 | 0)) { + $88 = $68; + break; + } else $wk$153 = $wk$153 + 4 | 0; + } + } else $88 = $68; + } + $90 = ($88 << 16 >> 16) * 7 | 0; + $92 = $labelInfo + 1310736 + ($90 + -7 << 2) | 0; + HEAP32[$92 >> 2] = (HEAP32[$92 >> 2] | 0) + 1; + $96 = $labelInfo + 1310736 + ($90 + -6 << 2) | 0; + HEAP32[$96 >> 2] = (HEAP32[$96 >> 2] | 0) + $i$264; + $100 = $labelInfo + 1310736 + ($90 + -5 << 2) | 0; + HEAP32[$100 >> 2] = (HEAP32[$100 >> 2] | 0) + $j$075; + HEAP32[$labelInfo + 1310736 + ($90 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $106 = HEAP16[$pnt2$367 + -2 >> 1] | 0; + if ($106 << 16 >> 16 <= 0) { + HEAP16[$pnt2$367 >> 1] = $59; + $146 = $60 * 7 | 0; + $148 = $labelInfo + 1310736 + ($146 + -7 << 2) | 0; + HEAP32[$148 >> 2] = (HEAP32[$148 >> 2] | 0) + 1; + $152 = $labelInfo + 1310736 + ($146 + -6 << 2) | 0; + HEAP32[$152 >> 2] = (HEAP32[$152 >> 2] | 0) + $i$264; + $156 = $labelInfo + 1310736 + ($146 + -5 << 2) | 0; + HEAP32[$156 >> 2] = (HEAP32[$156 >> 2] | 0) + $j$075; + $160 = $labelInfo + 1310736 + ($146 + -4 << 2) | 0; + if ((HEAP32[$160 >> 2] | 0) > ($i$264 | 0)) HEAP32[$160 >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($146 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $111 = HEAP32[$labelInfo + 1179664 + ($60 + -1 << 2) >> 2] | 0; + $114 = HEAP32[$labelInfo + 1179664 + (($106 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($111 | 0) > ($114 | 0)) { + HEAP16[$pnt2$367 >> 1] = $114; + if (($wk_max$159 | 0) > 0) { + $k$248 = 0; + $wk$249 = $17; + while (1) { + if ((HEAP32[$wk$249 >> 2] | 0) == ($111 | 0)) HEAP32[$wk$249 >> 2] = $114; + $k$248 = $k$248 + 1 | 0; + if (($k$248 | 0) >= ($wk_max$159 | 0)) { + $131 = $114; + break; + } else $wk$249 = $wk$249 + 4 | 0; + } + } else $131 = $114; + } else { + HEAP16[$pnt2$367 >> 1] = $111; + if (($111 | 0) < ($114 | 0) & ($wk_max$159 | 0) > 0) { + $k$345 = 0; + $wk$346 = $17; + while (1) { + if ((HEAP32[$wk$346 >> 2] | 0) == ($114 | 0)) HEAP32[$wk$346 >> 2] = $111; + $k$345 = $k$345 + 1 | 0; + if (($k$345 | 0) >= ($wk_max$159 | 0)) { + $131 = $111; + break; + } else $wk$346 = $wk$346 + 4 | 0; + } + } else $131 = $111; + } + $133 = ($131 << 16 >> 16) * 7 | 0; + $135 = $labelInfo + 1310736 + ($133 + -7 << 2) | 0; + HEAP32[$135 >> 2] = (HEAP32[$135 >> 2] | 0) + 1; + $139 = $labelInfo + 1310736 + ($133 + -6 << 2) | 0; + HEAP32[$139 >> 2] = (HEAP32[$139 >> 2] | 0) + $i$264; + $143 = $labelInfo + 1310736 + ($133 + -5 << 2) | 0; + HEAP32[$143 >> 2] = (HEAP32[$143 >> 2] | 0) + $j$075; + $wk_max$2 = $wk_max$159; + } while (0); + $i$264 = $i$264 + 1 | 0; + $225 = $pnt$168 + 4 | 0; + $226 = $pnt2$367 + 2 | 0; + $227 = $dpnt$166 + 1 | 0; + if (($i$264 | 0) >= ($10 | 0)) { + $dpnt$1$lcssa = $227; + $pnt$1$lcssa = $225; + $pnt2$3$lcssa = $226; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $dpnt$166 = $227; + $pnt$168 = $225; + $pnt2$367 = $226; + $wk_max$159 = $wk_max$2; + } + } + } else { + $dpnt$1$lcssa = $dpnt$077; + $pnt$1$lcssa = $pnt$079; + $pnt2$3$lcssa = $pnt2$278; + $wk_max$1$lcssa = $wk_max$074; + } + $j$075 = $j$075 + 1 | 0; + if (($j$075 | 0) >= ($1 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $dpnt$077 = $dpnt$1$lcssa + 2 | 0; + $pnt$079 = $pnt$1$lcssa + 8 | 0; + $pnt2$278 = $pnt2$3$lcssa + 4 | 0; + $wk_max$074 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $234 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$341 = 1; + $j$142 = 1; + $wk$443 = $17; + while (1) { + $236 = HEAP32[$wk$443 >> 2] | 0; + if (($236 | 0) == ($i$341 | 0)) { + $242 = $j$142; + $j$2 = $j$142 + 1 | 0; + } else { + $242 = HEAP32[$labelInfo + 1179664 + ($236 + -1 << 2) >> 2] | 0; + $j$2 = $j$142; + } + HEAP32[$wk$443 >> 2] = $242; + if (($i$341 | 0) < ($wk_max$0$lcssa | 0)) { + $i$341 = $i$341 + 1 | 0; + $j$142 = $j$2; + $wk$443 = $wk$443 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $246 = $labelInfo + 8 | 0; + $247 = $j$1$lcssa + -1 | 0; + HEAP32[$246 >> 2] = $247; + if (!$247) $$0 = 0; else { + _memset($234 | 0, 0, $247 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $247 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$439 = 0; + do { + $254 = $i$439 << 2; + HEAP32[$labelInfo + 131084 + ($254 << 2) >> 2] = $xsize; + HEAP32[$labelInfo + 131084 + (($254 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($254 | 2) << 2) >> 2] = $ysize; + HEAP32[$labelInfo + 131084 + (($254 | 3) << 2) >> 2] = 0; + $i$439 = $i$439 + 1 | 0; + } while (($i$439 | 0) < (HEAP32[$246 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$537 = 0; + do { + $268 = (HEAP32[$labelInfo + 1179664 + ($i$537 << 2) >> 2] | 0) + -1 | 0; + $269 = $i$537 * 7 | 0; + $272 = $labelInfo + 12 + ($268 << 2) | 0; + HEAP32[$272 >> 2] = (HEAP32[$272 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($269 << 2) >> 2] | 0); + $279 = $268 << 1; + $280 = $labelInfo + 655376 + ($279 << 3) | 0; + HEAPF64[$280 >> 3] = +HEAPF64[$280 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($269 + 1 << 2) >> 2] | 0); + $288 = $labelInfo + 655376 + (($279 | 1) << 3) | 0; + HEAPF64[$288 >> 3] = +HEAPF64[$288 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($269 + 2 << 2) >> 2] | 0); + $291 = $268 << 2; + $292 = $labelInfo + 131084 + ($291 << 2) | 0; + $296 = HEAP32[$labelInfo + 1310736 + ($269 + 3 << 2) >> 2] | 0; + if ((HEAP32[$292 >> 2] | 0) > ($296 | 0)) HEAP32[$292 >> 2] = $296; + $299 = $labelInfo + 131084 + (($291 | 1) << 2) | 0; + $303 = HEAP32[$labelInfo + 1310736 + ($269 + 4 << 2) >> 2] | 0; + if ((HEAP32[$299 >> 2] | 0) < ($303 | 0)) HEAP32[$299 >> 2] = $303; + $306 = $labelInfo + 131084 + (($291 | 2) << 2) | 0; + $310 = HEAP32[$labelInfo + 1310736 + ($269 + 5 << 2) >> 2] | 0; + if ((HEAP32[$306 >> 2] | 0) > ($310 | 0)) HEAP32[$306 >> 2] = $310; + $313 = $labelInfo + 131084 + (($291 | 3) << 2) | 0; + $317 = HEAP32[$labelInfo + 1310736 + ($269 + 6 << 2) >> 2] | 0; + if ((HEAP32[$313 >> 2] | 0) < ($317 | 0)) HEAP32[$313 >> 2] = $317; + $i$537 = $i$537 + 1 | 0; + } while (($i$537 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$246 >> 2] | 0) > 0) { + $i$636 = 0; + do { + $321 = $labelInfo + 12 + ($i$636 << 2) | 0; + $324 = $i$636 << 1; + $325 = $labelInfo + 655376 + ($324 << 3) | 0; + HEAPF64[$325 >> 3] = +HEAPF64[$325 >> 3] / +(HEAP32[$321 >> 2] | 0); + $331 = $labelInfo + 655376 + (($324 | 1) << 3) | 0; + HEAPF64[$331 >> 3] = +HEAPF64[$331 >> 3] / +(HEAP32[$321 >> 2] | 0); + $i$636 = $i$636 + 1 | 0; + } while (($i$636 | 0) < (HEAP32[$246 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubEWICY($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $$sum2 = 0, $0 = 0, $1 = 0, $102 = 0, $107 = 0, $11 = 0, $110 = 0, $127 = 0, $129 = 0, $131 = 0, $135 = 0, $139 = 0, $142 = 0, $144 = 0, $148 = 0, $152 = 0, $156 = 0, $161 = 0, $163 = 0, $167 = 0, $171 = 0, $175 = 0, $18 = 0, $181 = 0, $184 = 0, $186 = 0, $19 = 0, $190 = 0, $194 = 0, $198 = 0, $2 = 0, $201 = 0, $206 = 0, $21 = 0, $221 = 0, $222 = 0, $223 = 0, $230 = 0, $232 = 0, $238 = 0, $242 = 0, $243 = 0, $250 = 0, $264 = 0, $265 = 0, $268 = 0, $275 = 0, $276 = 0, $284 = 0, $287 = 0, $288 = 0, $292 = 0, $295 = 0, $299 = 0, $3 = 0, $30 = 0, $302 = 0, $306 = 0, $309 = 0, $313 = 0, $317 = 0, $320 = 0, $321 = 0, $327 = 0, $36 = 0, $39 = 0, $41 = 0, $45 = 0, $49 = 0, $55 = 0, $56 = 0, $59 = 0, $60 = 0, $61 = 0, $64 = 0, $67 = 0, $84 = 0, $86 = 0, $88 = 0, $92 = 0, $96 = 0, $dpnt$078 = 0, $dpnt$1$lcssa = 0, $dpnt$167 = 0, $i$089 = 0, $i$183 = 0, $i$265 = 0, $i$342 = 0, $i$440 = 0, $i$538 = 0, $i$637 = 0, $j$076 = 0, $j$1$lcssa = 0, $j$143 = 0, $j$2 = 0, $k$056 = 0, $k$153 = 0, $k$249 = 0, $k$346 = 0, $pnt$080 = 0, $pnt$1$lcssa = 0, $pnt$169 = 0, $pnt1$091 = 0, $pnt1$185 = 0, $pnt2$090 = 0, $pnt2$184 = 0, $pnt2$279 = 0, $pnt2$3$lcssa = 0, $pnt2$368 = 0, $vararg_buffer = 0, $wk$057 = 0, $wk$154 = 0, $wk$250 = 0, $wk$347 = 0, $wk$444 = 0, $wk_max$0$lcssa = 0, $wk_max$075 = 0, $wk_max$1$lcssa = 0, $wk_max$160 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = ($xsize | 0) / 2 | 0; + $1 = ($ysize | 0) / 2 | 0; + $2 = HEAP32[$labelInfo >> 2] | 0; + $3 = $1 + -1 | 0; + if (($xsize | 0) > 1) { + $i$089 = 0; + $pnt1$091 = $2; + $pnt2$090 = $2 + ((Math_imul($3, $0) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$090 >> 1] = 0; + HEAP16[$pnt1$091 >> 1] = 0; + $i$089 = $i$089 + 1 | 0; + if (($i$089 | 0) >= ($0 | 0)) break; else { + $pnt1$091 = $pnt1$091 + 2 | 0; + $pnt2$090 = $pnt2$090 + 2 | 0; + } + } + } + $11 = $0 + -1 | 0; + if (($ysize | 0) > 1) { + $i$183 = 0; + $pnt1$185 = $2; + $pnt2$184 = $2 + ($11 << 1) | 0; + while (1) { + HEAP16[$pnt2$184 >> 1] = 0; + HEAP16[$pnt1$185 >> 1] = 0; + $i$183 = $i$183 + 1 | 0; + if (($i$183 | 0) >= ($1 | 0)) break; else { + $pnt1$185 = $pnt1$185 + ($0 << 1) | 0; + $pnt2$184 = $pnt2$184 + ($0 << 1) | 0; + } + } + } + $18 = $labelInfo + 1179664 | 0; + $19 = $0 + 1 | 0; + $21 = 0 - $0 | 0; + $$sum1 = 1 - $0 | 0; + $$sum2 = ~$0; + $$sum = ($xsize << 1) + 8 | 0; + L11 : do if (($3 | 0) > 1) { + $30 = ($11 | 0) > 1; + $dpnt$078 = (HEAP32[$labelInfo + 4 >> 2] | 0) + $19 | 0; + $j$076 = 1; + $pnt$080 = $image + (($xsize << 2) + 4) | 0; + $pnt2$279 = $2 + ($19 << 1) | 0; + $wk_max$075 = 0; + L13 : while (1) { + if ($30) { + $dpnt$167 = $dpnt$078; + $i$265 = 1; + $pnt$169 = $pnt$080; + $pnt2$368 = $pnt2$279; + $wk_max$160 = $wk_max$075; + while (1) { + do if ((HEAPU8[$pnt$169 + 1 >> 0] | 0 | 0) > ($labelingThresh | 0)) { + HEAP8[$dpnt$167 >> 0] = -1; + $36 = HEAP16[$pnt2$368 + ($21 << 1) >> 1] | 0; + if ($36 << 16 >> 16 > 0) { + HEAP16[$pnt2$368 >> 1] = $36; + $39 = ($36 << 16 >> 16) * 7 | 0; + $41 = $labelInfo + 1310736 + ($39 + -7 << 2) | 0; + HEAP32[$41 >> 2] = (HEAP32[$41 >> 2] | 0) + 1; + $45 = $labelInfo + 1310736 + ($39 + -6 << 2) | 0; + HEAP32[$45 >> 2] = (HEAP32[$45 >> 2] | 0) + $i$265; + $49 = $labelInfo + 1310736 + ($39 + -5 << 2) | 0; + HEAP32[$49 >> 2] = (HEAP32[$49 >> 2] | 0) + $j$076; + HEAP32[$labelInfo + 1310736 + ($39 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $55 = HEAP16[$pnt2$368 + ($$sum1 << 1) >> 1] | 0; + $56 = $55 << 16 >> 16; + $59 = HEAP16[$pnt2$368 + ($$sum2 << 1) >> 1] | 0; + $60 = $59 << 16 >> 16; + $61 = $59 << 16 >> 16 > 0; + if ($55 << 16 >> 16 <= 0) { + if ($61) { + HEAP16[$pnt2$368 >> 1] = $59; + $161 = $60 * 7 | 0; + $163 = $labelInfo + 1310736 + ($161 + -7 << 2) | 0; + HEAP32[$163 >> 2] = (HEAP32[$163 >> 2] | 0) + 1; + $167 = $labelInfo + 1310736 + ($161 + -6 << 2) | 0; + HEAP32[$167 >> 2] = (HEAP32[$167 >> 2] | 0) + $i$265; + $171 = $labelInfo + 1310736 + ($161 + -5 << 2) | 0; + HEAP32[$171 >> 2] = (HEAP32[$171 >> 2] | 0) + $j$076; + $175 = $labelInfo + 1310736 + ($161 + -3 << 2) | 0; + if ((HEAP32[$175 >> 2] | 0) < ($i$265 | 0)) HEAP32[$175 >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($161 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $181 = HEAP16[$pnt2$368 + -2 >> 1] | 0; + if ($181 << 16 >> 16 > 0) { + HEAP16[$pnt2$368 >> 1] = $181; + $184 = ($181 << 16 >> 16) * 7 | 0; + $186 = $labelInfo + 1310736 + ($184 + -7 << 2) | 0; + HEAP32[$186 >> 2] = (HEAP32[$186 >> 2] | 0) + 1; + $190 = $labelInfo + 1310736 + ($184 + -6 << 2) | 0; + HEAP32[$190 >> 2] = (HEAP32[$190 >> 2] | 0) + $i$265; + $194 = $labelInfo + 1310736 + ($184 + -5 << 2) | 0; + HEAP32[$194 >> 2] = (HEAP32[$194 >> 2] | 0) + $j$076; + $198 = $labelInfo + 1310736 + ($184 + -3 << 2) | 0; + if ((HEAP32[$198 >> 2] | 0) >= ($i$265 | 0)) { + $wk_max$2 = $wk_max$160; + break; + } + HEAP32[$198 >> 2] = $i$265; + $wk_max$2 = $wk_max$160; + break; + } else { + $201 = $wk_max$160 + 1 | 0; + if (($wk_max$160 | 0) > 32767) break L13; + HEAP16[$pnt2$368 >> 1] = $201; + HEAP32[$labelInfo + 1179664 + ($wk_max$160 << 2) >> 2] = $201 << 16 >> 16; + $206 = $wk_max$160 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($206 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($206 + 1 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($206 + 2 << 2) >> 2] = $j$076; + HEAP32[$labelInfo + 1310736 + ($206 + 3 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($206 + 4 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($206 + 5 << 2) >> 2] = $j$076; + HEAP32[$labelInfo + 1310736 + ($206 + 6 << 2) >> 2] = $j$076; + $wk_max$2 = $201; + break; + } + } + if ($61) { + $64 = HEAP32[$labelInfo + 1179664 + ($56 + -1 << 2) >> 2] | 0; + $67 = HEAP32[$labelInfo + 1179664 + ($60 + -1 << 2) >> 2] | 0; + if (($64 | 0) > ($67 | 0)) { + HEAP16[$pnt2$368 >> 1] = $67; + if (($wk_max$160 | 0) > 0) { + $k$056 = 0; + $wk$057 = $18; + while (1) { + if ((HEAP32[$wk$057 >> 2] | 0) == ($64 | 0)) HEAP32[$wk$057 >> 2] = $67; + $k$056 = $k$056 + 1 | 0; + if (($k$056 | 0) >= ($wk_max$160 | 0)) { + $84 = $67; + break; + } else $wk$057 = $wk$057 + 4 | 0; + } + } else $84 = $67; + } else { + HEAP16[$pnt2$368 >> 1] = $64; + if (($64 | 0) < ($67 | 0) & ($wk_max$160 | 0) > 0) { + $k$153 = 0; + $wk$154 = $18; + while (1) { + if ((HEAP32[$wk$154 >> 2] | 0) == ($67 | 0)) HEAP32[$wk$154 >> 2] = $64; + $k$153 = $k$153 + 1 | 0; + if (($k$153 | 0) >= ($wk_max$160 | 0)) { + $84 = $64; + break; + } else $wk$154 = $wk$154 + 4 | 0; + } + } else $84 = $64; + } + $86 = ($84 << 16 >> 16) * 7 | 0; + $88 = $labelInfo + 1310736 + ($86 + -7 << 2) | 0; + HEAP32[$88 >> 2] = (HEAP32[$88 >> 2] | 0) + 1; + $92 = $labelInfo + 1310736 + ($86 + -6 << 2) | 0; + HEAP32[$92 >> 2] = (HEAP32[$92 >> 2] | 0) + $i$265; + $96 = $labelInfo + 1310736 + ($86 + -5 << 2) | 0; + HEAP32[$96 >> 2] = (HEAP32[$96 >> 2] | 0) + $j$076; + HEAP32[$labelInfo + 1310736 + ($86 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $102 = HEAP16[$pnt2$368 + -2 >> 1] | 0; + if ($102 << 16 >> 16 <= 0) { + HEAP16[$pnt2$368 >> 1] = $55; + $142 = $56 * 7 | 0; + $144 = $labelInfo + 1310736 + ($142 + -7 << 2) | 0; + HEAP32[$144 >> 2] = (HEAP32[$144 >> 2] | 0) + 1; + $148 = $labelInfo + 1310736 + ($142 + -6 << 2) | 0; + HEAP32[$148 >> 2] = (HEAP32[$148 >> 2] | 0) + $i$265; + $152 = $labelInfo + 1310736 + ($142 + -5 << 2) | 0; + HEAP32[$152 >> 2] = (HEAP32[$152 >> 2] | 0) + $j$076; + $156 = $labelInfo + 1310736 + ($142 + -4 << 2) | 0; + if ((HEAP32[$156 >> 2] | 0) > ($i$265 | 0)) HEAP32[$156 >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($142 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $107 = HEAP32[$labelInfo + 1179664 + ($56 + -1 << 2) >> 2] | 0; + $110 = HEAP32[$labelInfo + 1179664 + (($102 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($107 | 0) > ($110 | 0)) { + HEAP16[$pnt2$368 >> 1] = $110; + if (($wk_max$160 | 0) > 0) { + $k$249 = 0; + $wk$250 = $18; + while (1) { + if ((HEAP32[$wk$250 >> 2] | 0) == ($107 | 0)) HEAP32[$wk$250 >> 2] = $110; + $k$249 = $k$249 + 1 | 0; + if (($k$249 | 0) >= ($wk_max$160 | 0)) { + $127 = $110; + break; + } else $wk$250 = $wk$250 + 4 | 0; + } + } else $127 = $110; + } else { + HEAP16[$pnt2$368 >> 1] = $107; + if (($107 | 0) < ($110 | 0) & ($wk_max$160 | 0) > 0) { + $k$346 = 0; + $wk$347 = $18; + while (1) { + if ((HEAP32[$wk$347 >> 2] | 0) == ($110 | 0)) HEAP32[$wk$347 >> 2] = $107; + $k$346 = $k$346 + 1 | 0; + if (($k$346 | 0) >= ($wk_max$160 | 0)) { + $127 = $107; + break; + } else $wk$347 = $wk$347 + 4 | 0; + } + } else $127 = $107; + } + $129 = ($127 << 16 >> 16) * 7 | 0; + $131 = $labelInfo + 1310736 + ($129 + -7 << 2) | 0; + HEAP32[$131 >> 2] = (HEAP32[$131 >> 2] | 0) + 1; + $135 = $labelInfo + 1310736 + ($129 + -6 << 2) | 0; + HEAP32[$135 >> 2] = (HEAP32[$135 >> 2] | 0) + $i$265; + $139 = $labelInfo + 1310736 + ($129 + -5 << 2) | 0; + HEAP32[$139 >> 2] = (HEAP32[$139 >> 2] | 0) + $j$076; + $wk_max$2 = $wk_max$160; + } else { + HEAP16[$pnt2$368 >> 1] = 0; + HEAP8[$dpnt$167 >> 0] = 0; + $wk_max$2 = $wk_max$160; + } while (0); + $i$265 = $i$265 + 1 | 0; + $221 = $pnt$169 + 4 | 0; + $222 = $pnt2$368 + 2 | 0; + $223 = $dpnt$167 + 1 | 0; + if (($i$265 | 0) >= ($11 | 0)) { + $dpnt$1$lcssa = $223; + $pnt$1$lcssa = $221; + $pnt2$3$lcssa = $222; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $dpnt$167 = $223; + $pnt$169 = $221; + $pnt2$368 = $222; + $wk_max$160 = $wk_max$2; + } + } + } else { + $dpnt$1$lcssa = $dpnt$078; + $pnt$1$lcssa = $pnt$080; + $pnt2$3$lcssa = $pnt2$279; + $wk_max$1$lcssa = $wk_max$075; + } + $j$076 = $j$076 + 1 | 0; + if (($j$076 | 0) >= ($3 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $dpnt$078 = $dpnt$1$lcssa + 2 | 0; + $pnt$080 = $pnt$1$lcssa + $$sum | 0; + $pnt2$279 = $pnt2$3$lcssa + 4 | 0; + $wk_max$075 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $230 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$342 = 1; + $j$143 = 1; + $wk$444 = $18; + while (1) { + $232 = HEAP32[$wk$444 >> 2] | 0; + if (($232 | 0) == ($i$342 | 0)) { + $238 = $j$143; + $j$2 = $j$143 + 1 | 0; + } else { + $238 = HEAP32[$labelInfo + 1179664 + ($232 + -1 << 2) >> 2] | 0; + $j$2 = $j$143; + } + HEAP32[$wk$444 >> 2] = $238; + if (($i$342 | 0) < ($wk_max$0$lcssa | 0)) { + $i$342 = $i$342 + 1 | 0; + $j$143 = $j$2; + $wk$444 = $wk$444 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $242 = $labelInfo + 8 | 0; + $243 = $j$1$lcssa + -1 | 0; + HEAP32[$242 >> 2] = $243; + if (!$243) $$0 = 0; else { + _memset($230 | 0, 0, $243 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $243 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$440 = 0; + do { + $250 = $i$440 << 2; + HEAP32[$labelInfo + 131084 + ($250 << 2) >> 2] = $0; + HEAP32[$labelInfo + 131084 + (($250 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($250 | 2) << 2) >> 2] = $1; + HEAP32[$labelInfo + 131084 + (($250 | 3) << 2) >> 2] = 0; + $i$440 = $i$440 + 1 | 0; + } while (($i$440 | 0) < (HEAP32[$242 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$538 = 0; + do { + $264 = (HEAP32[$labelInfo + 1179664 + ($i$538 << 2) >> 2] | 0) + -1 | 0; + $265 = $i$538 * 7 | 0; + $268 = $labelInfo + 12 + ($264 << 2) | 0; + HEAP32[$268 >> 2] = (HEAP32[$268 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($265 << 2) >> 2] | 0); + $275 = $264 << 1; + $276 = $labelInfo + 655376 + ($275 << 3) | 0; + HEAPF64[$276 >> 3] = +HEAPF64[$276 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($265 + 1 << 2) >> 2] | 0); + $284 = $labelInfo + 655376 + (($275 | 1) << 3) | 0; + HEAPF64[$284 >> 3] = +HEAPF64[$284 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($265 + 2 << 2) >> 2] | 0); + $287 = $264 << 2; + $288 = $labelInfo + 131084 + ($287 << 2) | 0; + $292 = HEAP32[$labelInfo + 1310736 + ($265 + 3 << 2) >> 2] | 0; + if ((HEAP32[$288 >> 2] | 0) > ($292 | 0)) HEAP32[$288 >> 2] = $292; + $295 = $labelInfo + 131084 + (($287 | 1) << 2) | 0; + $299 = HEAP32[$labelInfo + 1310736 + ($265 + 4 << 2) >> 2] | 0; + if ((HEAP32[$295 >> 2] | 0) < ($299 | 0)) HEAP32[$295 >> 2] = $299; + $302 = $labelInfo + 131084 + (($287 | 2) << 2) | 0; + $306 = HEAP32[$labelInfo + 1310736 + ($265 + 5 << 2) >> 2] | 0; + if ((HEAP32[$302 >> 2] | 0) > ($306 | 0)) HEAP32[$302 >> 2] = $306; + $309 = $labelInfo + 131084 + (($287 | 3) << 2) | 0; + $313 = HEAP32[$labelInfo + 1310736 + ($265 + 6 << 2) >> 2] | 0; + if ((HEAP32[$309 >> 2] | 0) < ($313 | 0)) HEAP32[$309 >> 2] = $313; + $i$538 = $i$538 + 1 | 0; + } while (($i$538 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$242 >> 2] | 0) > 0) { + $i$637 = 0; + do { + $317 = $labelInfo + 12 + ($i$637 << 2) | 0; + $320 = $i$637 << 1; + $321 = $labelInfo + 655376 + ($320 << 3) | 0; + HEAPF64[$321 >> 3] = +HEAPF64[$321 >> 3] / +(HEAP32[$317 >> 2] | 0); + $327 = $labelInfo + 655376 + (($320 | 1) << 3) | 0; + HEAPF64[$327 >> 3] = +HEAPF64[$327 >> 3] / +(HEAP32[$317 >> 2] | 0); + $i$637 = $i$637 + 1 | 0; + } while (($i$637 | 0) < (HEAP32[$242 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubEBICY($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $$sum2 = 0, $0 = 0, $1 = 0, $102 = 0, $107 = 0, $11 = 0, $110 = 0, $127 = 0, $129 = 0, $131 = 0, $135 = 0, $139 = 0, $142 = 0, $144 = 0, $148 = 0, $152 = 0, $156 = 0, $161 = 0, $163 = 0, $167 = 0, $171 = 0, $175 = 0, $18 = 0, $181 = 0, $184 = 0, $186 = 0, $19 = 0, $190 = 0, $194 = 0, $198 = 0, $2 = 0, $201 = 0, $206 = 0, $21 = 0, $221 = 0, $222 = 0, $223 = 0, $230 = 0, $232 = 0, $238 = 0, $242 = 0, $243 = 0, $250 = 0, $264 = 0, $265 = 0, $268 = 0, $275 = 0, $276 = 0, $284 = 0, $287 = 0, $288 = 0, $292 = 0, $295 = 0, $299 = 0, $3 = 0, $30 = 0, $302 = 0, $306 = 0, $309 = 0, $313 = 0, $317 = 0, $320 = 0, $321 = 0, $327 = 0, $36 = 0, $39 = 0, $41 = 0, $45 = 0, $49 = 0, $55 = 0, $56 = 0, $59 = 0, $60 = 0, $61 = 0, $64 = 0, $67 = 0, $84 = 0, $86 = 0, $88 = 0, $92 = 0, $96 = 0, $dpnt$078 = 0, $dpnt$1$lcssa = 0, $dpnt$167 = 0, $i$089 = 0, $i$183 = 0, $i$265 = 0, $i$342 = 0, $i$440 = 0, $i$538 = 0, $i$637 = 0, $j$076 = 0, $j$1$lcssa = 0, $j$143 = 0, $j$2 = 0, $k$056 = 0, $k$153 = 0, $k$249 = 0, $k$346 = 0, $pnt$080 = 0, $pnt$1$lcssa = 0, $pnt$169 = 0, $pnt1$091 = 0, $pnt1$185 = 0, $pnt2$090 = 0, $pnt2$184 = 0, $pnt2$279 = 0, $pnt2$3$lcssa = 0, $pnt2$368 = 0, $vararg_buffer = 0, $wk$057 = 0, $wk$154 = 0, $wk$250 = 0, $wk$347 = 0, $wk$444 = 0, $wk_max$0$lcssa = 0, $wk_max$075 = 0, $wk_max$1$lcssa = 0, $wk_max$160 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = ($xsize | 0) / 2 | 0; + $1 = ($ysize | 0) / 2 | 0; + $2 = HEAP32[$labelInfo >> 2] | 0; + $3 = $1 + -1 | 0; + if (($xsize | 0) > 1) { + $i$089 = 0; + $pnt1$091 = $2; + $pnt2$090 = $2 + ((Math_imul($3, $0) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$090 >> 1] = 0; + HEAP16[$pnt1$091 >> 1] = 0; + $i$089 = $i$089 + 1 | 0; + if (($i$089 | 0) >= ($0 | 0)) break; else { + $pnt1$091 = $pnt1$091 + 2 | 0; + $pnt2$090 = $pnt2$090 + 2 | 0; + } + } + } + $11 = $0 + -1 | 0; + if (($ysize | 0) > 1) { + $i$183 = 0; + $pnt1$185 = $2; + $pnt2$184 = $2 + ($11 << 1) | 0; + while (1) { + HEAP16[$pnt2$184 >> 1] = 0; + HEAP16[$pnt1$185 >> 1] = 0; + $i$183 = $i$183 + 1 | 0; + if (($i$183 | 0) >= ($1 | 0)) break; else { + $pnt1$185 = $pnt1$185 + ($0 << 1) | 0; + $pnt2$184 = $pnt2$184 + ($0 << 1) | 0; + } + } + } + $18 = $labelInfo + 1179664 | 0; + $19 = $0 + 1 | 0; + $21 = 0 - $0 | 0; + $$sum1 = 1 - $0 | 0; + $$sum2 = ~$0; + $$sum = ($xsize << 1) + 8 | 0; + L11 : do if (($3 | 0) > 1) { + $30 = ($11 | 0) > 1; + $dpnt$078 = (HEAP32[$labelInfo + 4 >> 2] | 0) + $19 | 0; + $j$076 = 1; + $pnt$080 = $image + (($xsize << 2) + 4) | 0; + $pnt2$279 = $2 + ($19 << 1) | 0; + $wk_max$075 = 0; + L13 : while (1) { + if ($30) { + $dpnt$167 = $dpnt$078; + $i$265 = 1; + $pnt$169 = $pnt$080; + $pnt2$368 = $pnt2$279; + $wk_max$160 = $wk_max$075; + while (1) { + do if ((HEAPU8[$pnt$169 + 1 >> 0] | 0 | 0) > ($labelingThresh | 0)) { + HEAP16[$pnt2$368 >> 1] = 0; + HEAP8[$dpnt$167 >> 0] = 0; + $wk_max$2 = $wk_max$160; + } else { + HEAP8[$dpnt$167 >> 0] = -1; + $36 = HEAP16[$pnt2$368 + ($21 << 1) >> 1] | 0; + if ($36 << 16 >> 16 > 0) { + HEAP16[$pnt2$368 >> 1] = $36; + $39 = ($36 << 16 >> 16) * 7 | 0; + $41 = $labelInfo + 1310736 + ($39 + -7 << 2) | 0; + HEAP32[$41 >> 2] = (HEAP32[$41 >> 2] | 0) + 1; + $45 = $labelInfo + 1310736 + ($39 + -6 << 2) | 0; + HEAP32[$45 >> 2] = (HEAP32[$45 >> 2] | 0) + $i$265; + $49 = $labelInfo + 1310736 + ($39 + -5 << 2) | 0; + HEAP32[$49 >> 2] = (HEAP32[$49 >> 2] | 0) + $j$076; + HEAP32[$labelInfo + 1310736 + ($39 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $55 = HEAP16[$pnt2$368 + ($$sum1 << 1) >> 1] | 0; + $56 = $55 << 16 >> 16; + $59 = HEAP16[$pnt2$368 + ($$sum2 << 1) >> 1] | 0; + $60 = $59 << 16 >> 16; + $61 = $59 << 16 >> 16 > 0; + if ($55 << 16 >> 16 <= 0) { + if ($61) { + HEAP16[$pnt2$368 >> 1] = $59; + $161 = $60 * 7 | 0; + $163 = $labelInfo + 1310736 + ($161 + -7 << 2) | 0; + HEAP32[$163 >> 2] = (HEAP32[$163 >> 2] | 0) + 1; + $167 = $labelInfo + 1310736 + ($161 + -6 << 2) | 0; + HEAP32[$167 >> 2] = (HEAP32[$167 >> 2] | 0) + $i$265; + $171 = $labelInfo + 1310736 + ($161 + -5 << 2) | 0; + HEAP32[$171 >> 2] = (HEAP32[$171 >> 2] | 0) + $j$076; + $175 = $labelInfo + 1310736 + ($161 + -3 << 2) | 0; + if ((HEAP32[$175 >> 2] | 0) < ($i$265 | 0)) HEAP32[$175 >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($161 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $181 = HEAP16[$pnt2$368 + -2 >> 1] | 0; + if ($181 << 16 >> 16 > 0) { + HEAP16[$pnt2$368 >> 1] = $181; + $184 = ($181 << 16 >> 16) * 7 | 0; + $186 = $labelInfo + 1310736 + ($184 + -7 << 2) | 0; + HEAP32[$186 >> 2] = (HEAP32[$186 >> 2] | 0) + 1; + $190 = $labelInfo + 1310736 + ($184 + -6 << 2) | 0; + HEAP32[$190 >> 2] = (HEAP32[$190 >> 2] | 0) + $i$265; + $194 = $labelInfo + 1310736 + ($184 + -5 << 2) | 0; + HEAP32[$194 >> 2] = (HEAP32[$194 >> 2] | 0) + $j$076; + $198 = $labelInfo + 1310736 + ($184 + -3 << 2) | 0; + if ((HEAP32[$198 >> 2] | 0) >= ($i$265 | 0)) { + $wk_max$2 = $wk_max$160; + break; + } + HEAP32[$198 >> 2] = $i$265; + $wk_max$2 = $wk_max$160; + break; + } else { + $201 = $wk_max$160 + 1 | 0; + if (($wk_max$160 | 0) > 32767) break L13; + HEAP16[$pnt2$368 >> 1] = $201; + HEAP32[$labelInfo + 1179664 + ($wk_max$160 << 2) >> 2] = $201 << 16 >> 16; + $206 = $wk_max$160 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($206 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($206 + 1 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($206 + 2 << 2) >> 2] = $j$076; + HEAP32[$labelInfo + 1310736 + ($206 + 3 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($206 + 4 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($206 + 5 << 2) >> 2] = $j$076; + HEAP32[$labelInfo + 1310736 + ($206 + 6 << 2) >> 2] = $j$076; + $wk_max$2 = $201; + break; + } + } + if ($61) { + $64 = HEAP32[$labelInfo + 1179664 + ($56 + -1 << 2) >> 2] | 0; + $67 = HEAP32[$labelInfo + 1179664 + ($60 + -1 << 2) >> 2] | 0; + if (($64 | 0) > ($67 | 0)) { + HEAP16[$pnt2$368 >> 1] = $67; + if (($wk_max$160 | 0) > 0) { + $k$056 = 0; + $wk$057 = $18; + while (1) { + if ((HEAP32[$wk$057 >> 2] | 0) == ($64 | 0)) HEAP32[$wk$057 >> 2] = $67; + $k$056 = $k$056 + 1 | 0; + if (($k$056 | 0) >= ($wk_max$160 | 0)) { + $84 = $67; + break; + } else $wk$057 = $wk$057 + 4 | 0; + } + } else $84 = $67; + } else { + HEAP16[$pnt2$368 >> 1] = $64; + if (($64 | 0) < ($67 | 0) & ($wk_max$160 | 0) > 0) { + $k$153 = 0; + $wk$154 = $18; + while (1) { + if ((HEAP32[$wk$154 >> 2] | 0) == ($67 | 0)) HEAP32[$wk$154 >> 2] = $64; + $k$153 = $k$153 + 1 | 0; + if (($k$153 | 0) >= ($wk_max$160 | 0)) { + $84 = $64; + break; + } else $wk$154 = $wk$154 + 4 | 0; + } + } else $84 = $64; + } + $86 = ($84 << 16 >> 16) * 7 | 0; + $88 = $labelInfo + 1310736 + ($86 + -7 << 2) | 0; + HEAP32[$88 >> 2] = (HEAP32[$88 >> 2] | 0) + 1; + $92 = $labelInfo + 1310736 + ($86 + -6 << 2) | 0; + HEAP32[$92 >> 2] = (HEAP32[$92 >> 2] | 0) + $i$265; + $96 = $labelInfo + 1310736 + ($86 + -5 << 2) | 0; + HEAP32[$96 >> 2] = (HEAP32[$96 >> 2] | 0) + $j$076; + HEAP32[$labelInfo + 1310736 + ($86 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $102 = HEAP16[$pnt2$368 + -2 >> 1] | 0; + if ($102 << 16 >> 16 <= 0) { + HEAP16[$pnt2$368 >> 1] = $55; + $142 = $56 * 7 | 0; + $144 = $labelInfo + 1310736 + ($142 + -7 << 2) | 0; + HEAP32[$144 >> 2] = (HEAP32[$144 >> 2] | 0) + 1; + $148 = $labelInfo + 1310736 + ($142 + -6 << 2) | 0; + HEAP32[$148 >> 2] = (HEAP32[$148 >> 2] | 0) + $i$265; + $152 = $labelInfo + 1310736 + ($142 + -5 << 2) | 0; + HEAP32[$152 >> 2] = (HEAP32[$152 >> 2] | 0) + $j$076; + $156 = $labelInfo + 1310736 + ($142 + -4 << 2) | 0; + if ((HEAP32[$156 >> 2] | 0) > ($i$265 | 0)) HEAP32[$156 >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($142 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $107 = HEAP32[$labelInfo + 1179664 + ($56 + -1 << 2) >> 2] | 0; + $110 = HEAP32[$labelInfo + 1179664 + (($102 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($107 | 0) > ($110 | 0)) { + HEAP16[$pnt2$368 >> 1] = $110; + if (($wk_max$160 | 0) > 0) { + $k$249 = 0; + $wk$250 = $18; + while (1) { + if ((HEAP32[$wk$250 >> 2] | 0) == ($107 | 0)) HEAP32[$wk$250 >> 2] = $110; + $k$249 = $k$249 + 1 | 0; + if (($k$249 | 0) >= ($wk_max$160 | 0)) { + $127 = $110; + break; + } else $wk$250 = $wk$250 + 4 | 0; + } + } else $127 = $110; + } else { + HEAP16[$pnt2$368 >> 1] = $107; + if (($107 | 0) < ($110 | 0) & ($wk_max$160 | 0) > 0) { + $k$346 = 0; + $wk$347 = $18; + while (1) { + if ((HEAP32[$wk$347 >> 2] | 0) == ($110 | 0)) HEAP32[$wk$347 >> 2] = $107; + $k$346 = $k$346 + 1 | 0; + if (($k$346 | 0) >= ($wk_max$160 | 0)) { + $127 = $107; + break; + } else $wk$347 = $wk$347 + 4 | 0; + } + } else $127 = $107; + } + $129 = ($127 << 16 >> 16) * 7 | 0; + $131 = $labelInfo + 1310736 + ($129 + -7 << 2) | 0; + HEAP32[$131 >> 2] = (HEAP32[$131 >> 2] | 0) + 1; + $135 = $labelInfo + 1310736 + ($129 + -6 << 2) | 0; + HEAP32[$135 >> 2] = (HEAP32[$135 >> 2] | 0) + $i$265; + $139 = $labelInfo + 1310736 + ($129 + -5 << 2) | 0; + HEAP32[$139 >> 2] = (HEAP32[$139 >> 2] | 0) + $j$076; + $wk_max$2 = $wk_max$160; + } while (0); + $i$265 = $i$265 + 1 | 0; + $221 = $pnt$169 + 4 | 0; + $222 = $pnt2$368 + 2 | 0; + $223 = $dpnt$167 + 1 | 0; + if (($i$265 | 0) >= ($11 | 0)) { + $dpnt$1$lcssa = $223; + $pnt$1$lcssa = $221; + $pnt2$3$lcssa = $222; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $dpnt$167 = $223; + $pnt$169 = $221; + $pnt2$368 = $222; + $wk_max$160 = $wk_max$2; + } + } + } else { + $dpnt$1$lcssa = $dpnt$078; + $pnt$1$lcssa = $pnt$080; + $pnt2$3$lcssa = $pnt2$279; + $wk_max$1$lcssa = $wk_max$075; + } + $j$076 = $j$076 + 1 | 0; + if (($j$076 | 0) >= ($3 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $dpnt$078 = $dpnt$1$lcssa + 2 | 0; + $pnt$080 = $pnt$1$lcssa + $$sum | 0; + $pnt2$279 = $pnt2$3$lcssa + 4 | 0; + $wk_max$075 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $230 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$342 = 1; + $j$143 = 1; + $wk$444 = $18; + while (1) { + $232 = HEAP32[$wk$444 >> 2] | 0; + if (($232 | 0) == ($i$342 | 0)) { + $238 = $j$143; + $j$2 = $j$143 + 1 | 0; + } else { + $238 = HEAP32[$labelInfo + 1179664 + ($232 + -1 << 2) >> 2] | 0; + $j$2 = $j$143; + } + HEAP32[$wk$444 >> 2] = $238; + if (($i$342 | 0) < ($wk_max$0$lcssa | 0)) { + $i$342 = $i$342 + 1 | 0; + $j$143 = $j$2; + $wk$444 = $wk$444 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $242 = $labelInfo + 8 | 0; + $243 = $j$1$lcssa + -1 | 0; + HEAP32[$242 >> 2] = $243; + if (!$243) $$0 = 0; else { + _memset($230 | 0, 0, $243 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $243 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$440 = 0; + do { + $250 = $i$440 << 2; + HEAP32[$labelInfo + 131084 + ($250 << 2) >> 2] = $0; + HEAP32[$labelInfo + 131084 + (($250 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($250 | 2) << 2) >> 2] = $1; + HEAP32[$labelInfo + 131084 + (($250 | 3) << 2) >> 2] = 0; + $i$440 = $i$440 + 1 | 0; + } while (($i$440 | 0) < (HEAP32[$242 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$538 = 0; + do { + $264 = (HEAP32[$labelInfo + 1179664 + ($i$538 << 2) >> 2] | 0) + -1 | 0; + $265 = $i$538 * 7 | 0; + $268 = $labelInfo + 12 + ($264 << 2) | 0; + HEAP32[$268 >> 2] = (HEAP32[$268 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($265 << 2) >> 2] | 0); + $275 = $264 << 1; + $276 = $labelInfo + 655376 + ($275 << 3) | 0; + HEAPF64[$276 >> 3] = +HEAPF64[$276 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($265 + 1 << 2) >> 2] | 0); + $284 = $labelInfo + 655376 + (($275 | 1) << 3) | 0; + HEAPF64[$284 >> 3] = +HEAPF64[$284 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($265 + 2 << 2) >> 2] | 0); + $287 = $264 << 2; + $288 = $labelInfo + 131084 + ($287 << 2) | 0; + $292 = HEAP32[$labelInfo + 1310736 + ($265 + 3 << 2) >> 2] | 0; + if ((HEAP32[$288 >> 2] | 0) > ($292 | 0)) HEAP32[$288 >> 2] = $292; + $295 = $labelInfo + 131084 + (($287 | 1) << 2) | 0; + $299 = HEAP32[$labelInfo + 1310736 + ($265 + 4 << 2) >> 2] | 0; + if ((HEAP32[$295 >> 2] | 0) < ($299 | 0)) HEAP32[$295 >> 2] = $299; + $302 = $labelInfo + 131084 + (($287 | 2) << 2) | 0; + $306 = HEAP32[$labelInfo + 1310736 + ($265 + 5 << 2) >> 2] | 0; + if ((HEAP32[$302 >> 2] | 0) > ($306 | 0)) HEAP32[$302 >> 2] = $306; + $309 = $labelInfo + 131084 + (($287 | 3) << 2) | 0; + $313 = HEAP32[$labelInfo + 1310736 + ($265 + 6 << 2) >> 2] | 0; + if ((HEAP32[$309 >> 2] | 0) < ($313 | 0)) HEAP32[$309 >> 2] = $313; + $i$538 = $i$538 + 1 | 0; + } while (($i$538 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$242 >> 2] | 0) > 0) { + $i$637 = 0; + do { + $317 = $labelInfo + 12 + ($i$637 << 2) | 0; + $320 = $i$637 << 1; + $321 = $labelInfo + 655376 + ($320 << 3) | 0; + HEAPF64[$321 >> 3] = +HEAPF64[$321 >> 3] / +(HEAP32[$317 >> 2] | 0); + $327 = $labelInfo + 655376 + (($320 | 1) << 3) | 0; + HEAPF64[$327 >> 3] = +HEAPF64[$327 >> 3] / +(HEAP32[$317 >> 2] | 0); + $i$637 = $i$637 + 1 | 0; + } while (($i$637 | 0) < (HEAP32[$242 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubEBIYC($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $$sum2 = 0, $0 = 0, $1 = 0, $101 = 0, $106 = 0, $109 = 0, $11 = 0, $126 = 0, $128 = 0, $130 = 0, $134 = 0, $138 = 0, $141 = 0, $143 = 0, $147 = 0, $151 = 0, $155 = 0, $160 = 0, $162 = 0, $166 = 0, $170 = 0, $174 = 0, $18 = 0, $180 = 0, $183 = 0, $185 = 0, $189 = 0, $19 = 0, $193 = 0, $197 = 0, $2 = 0, $200 = 0, $205 = 0, $21 = 0, $220 = 0, $221 = 0, $222 = 0, $229 = 0, $231 = 0, $237 = 0, $241 = 0, $242 = 0, $249 = 0, $263 = 0, $264 = 0, $267 = 0, $274 = 0, $275 = 0, $283 = 0, $286 = 0, $287 = 0, $291 = 0, $294 = 0, $298 = 0, $3 = 0, $30 = 0, $301 = 0, $305 = 0, $308 = 0, $312 = 0, $316 = 0, $319 = 0, $320 = 0, $326 = 0, $35 = 0, $38 = 0, $40 = 0, $44 = 0, $48 = 0, $54 = 0, $55 = 0, $58 = 0, $59 = 0, $60 = 0, $63 = 0, $66 = 0, $83 = 0, $85 = 0, $87 = 0, $91 = 0, $95 = 0, $dpnt$078 = 0, $dpnt$1$lcssa = 0, $dpnt$167 = 0, $i$089 = 0, $i$183 = 0, $i$265 = 0, $i$342 = 0, $i$440 = 0, $i$538 = 0, $i$637 = 0, $j$076 = 0, $j$1$lcssa = 0, $j$143 = 0, $j$2 = 0, $k$056 = 0, $k$153 = 0, $k$249 = 0, $k$346 = 0, $pnt$080 = 0, $pnt$1$lcssa = 0, $pnt$169 = 0, $pnt1$091 = 0, $pnt1$185 = 0, $pnt2$090 = 0, $pnt2$184 = 0, $pnt2$279 = 0, $pnt2$3$lcssa = 0, $pnt2$368 = 0, $vararg_buffer = 0, $wk$057 = 0, $wk$154 = 0, $wk$250 = 0, $wk$347 = 0, $wk$444 = 0, $wk_max$0$lcssa = 0, $wk_max$075 = 0, $wk_max$1$lcssa = 0, $wk_max$160 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = ($xsize | 0) / 2 | 0; + $1 = ($ysize | 0) / 2 | 0; + $2 = HEAP32[$labelInfo >> 2] | 0; + $3 = $1 + -1 | 0; + if (($xsize | 0) > 1) { + $i$089 = 0; + $pnt1$091 = $2; + $pnt2$090 = $2 + ((Math_imul($3, $0) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$090 >> 1] = 0; + HEAP16[$pnt1$091 >> 1] = 0; + $i$089 = $i$089 + 1 | 0; + if (($i$089 | 0) >= ($0 | 0)) break; else { + $pnt1$091 = $pnt1$091 + 2 | 0; + $pnt2$090 = $pnt2$090 + 2 | 0; + } + } + } + $11 = $0 + -1 | 0; + if (($ysize | 0) > 1) { + $i$183 = 0; + $pnt1$185 = $2; + $pnt2$184 = $2 + ($11 << 1) | 0; + while (1) { + HEAP16[$pnt2$184 >> 1] = 0; + HEAP16[$pnt1$185 >> 1] = 0; + $i$183 = $i$183 + 1 | 0; + if (($i$183 | 0) >= ($1 | 0)) break; else { + $pnt1$185 = $pnt1$185 + ($0 << 1) | 0; + $pnt2$184 = $pnt2$184 + ($0 << 1) | 0; + } + } + } + $18 = $labelInfo + 1179664 | 0; + $19 = $0 + 1 | 0; + $21 = 0 - $0 | 0; + $$sum1 = 1 - $0 | 0; + $$sum2 = ~$0; + $$sum = ($xsize << 1) + 8 | 0; + L11 : do if (($3 | 0) > 1) { + $30 = ($11 | 0) > 1; + $dpnt$078 = (HEAP32[$labelInfo + 4 >> 2] | 0) + $19 | 0; + $j$076 = 1; + $pnt$080 = $image + (($xsize << 2) + 4) | 0; + $pnt2$279 = $2 + ($19 << 1) | 0; + $wk_max$075 = 0; + L13 : while (1) { + if ($30) { + $dpnt$167 = $dpnt$078; + $i$265 = 1; + $pnt$169 = $pnt$080; + $pnt2$368 = $pnt2$279; + $wk_max$160 = $wk_max$075; + while (1) { + do if ((HEAPU8[$pnt$169 >> 0] | 0 | 0) > ($labelingThresh | 0)) { + HEAP16[$pnt2$368 >> 1] = 0; + HEAP8[$dpnt$167 >> 0] = 0; + $wk_max$2 = $wk_max$160; + } else { + HEAP8[$dpnt$167 >> 0] = -1; + $35 = HEAP16[$pnt2$368 + ($21 << 1) >> 1] | 0; + if ($35 << 16 >> 16 > 0) { + HEAP16[$pnt2$368 >> 1] = $35; + $38 = ($35 << 16 >> 16) * 7 | 0; + $40 = $labelInfo + 1310736 + ($38 + -7 << 2) | 0; + HEAP32[$40 >> 2] = (HEAP32[$40 >> 2] | 0) + 1; + $44 = $labelInfo + 1310736 + ($38 + -6 << 2) | 0; + HEAP32[$44 >> 2] = (HEAP32[$44 >> 2] | 0) + $i$265; + $48 = $labelInfo + 1310736 + ($38 + -5 << 2) | 0; + HEAP32[$48 >> 2] = (HEAP32[$48 >> 2] | 0) + $j$076; + HEAP32[$labelInfo + 1310736 + ($38 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $54 = HEAP16[$pnt2$368 + ($$sum1 << 1) >> 1] | 0; + $55 = $54 << 16 >> 16; + $58 = HEAP16[$pnt2$368 + ($$sum2 << 1) >> 1] | 0; + $59 = $58 << 16 >> 16; + $60 = $58 << 16 >> 16 > 0; + if ($54 << 16 >> 16 <= 0) { + if ($60) { + HEAP16[$pnt2$368 >> 1] = $58; + $160 = $59 * 7 | 0; + $162 = $labelInfo + 1310736 + ($160 + -7 << 2) | 0; + HEAP32[$162 >> 2] = (HEAP32[$162 >> 2] | 0) + 1; + $166 = $labelInfo + 1310736 + ($160 + -6 << 2) | 0; + HEAP32[$166 >> 2] = (HEAP32[$166 >> 2] | 0) + $i$265; + $170 = $labelInfo + 1310736 + ($160 + -5 << 2) | 0; + HEAP32[$170 >> 2] = (HEAP32[$170 >> 2] | 0) + $j$076; + $174 = $labelInfo + 1310736 + ($160 + -3 << 2) | 0; + if ((HEAP32[$174 >> 2] | 0) < ($i$265 | 0)) HEAP32[$174 >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($160 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $180 = HEAP16[$pnt2$368 + -2 >> 1] | 0; + if ($180 << 16 >> 16 > 0) { + HEAP16[$pnt2$368 >> 1] = $180; + $183 = ($180 << 16 >> 16) * 7 | 0; + $185 = $labelInfo + 1310736 + ($183 + -7 << 2) | 0; + HEAP32[$185 >> 2] = (HEAP32[$185 >> 2] | 0) + 1; + $189 = $labelInfo + 1310736 + ($183 + -6 << 2) | 0; + HEAP32[$189 >> 2] = (HEAP32[$189 >> 2] | 0) + $i$265; + $193 = $labelInfo + 1310736 + ($183 + -5 << 2) | 0; + HEAP32[$193 >> 2] = (HEAP32[$193 >> 2] | 0) + $j$076; + $197 = $labelInfo + 1310736 + ($183 + -3 << 2) | 0; + if ((HEAP32[$197 >> 2] | 0) >= ($i$265 | 0)) { + $wk_max$2 = $wk_max$160; + break; + } + HEAP32[$197 >> 2] = $i$265; + $wk_max$2 = $wk_max$160; + break; + } else { + $200 = $wk_max$160 + 1 | 0; + if (($wk_max$160 | 0) > 32767) break L13; + HEAP16[$pnt2$368 >> 1] = $200; + HEAP32[$labelInfo + 1179664 + ($wk_max$160 << 2) >> 2] = $200 << 16 >> 16; + $205 = $wk_max$160 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($205 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($205 + 1 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($205 + 2 << 2) >> 2] = $j$076; + HEAP32[$labelInfo + 1310736 + ($205 + 3 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($205 + 4 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($205 + 5 << 2) >> 2] = $j$076; + HEAP32[$labelInfo + 1310736 + ($205 + 6 << 2) >> 2] = $j$076; + $wk_max$2 = $200; + break; + } + } + if ($60) { + $63 = HEAP32[$labelInfo + 1179664 + ($55 + -1 << 2) >> 2] | 0; + $66 = HEAP32[$labelInfo + 1179664 + ($59 + -1 << 2) >> 2] | 0; + if (($63 | 0) > ($66 | 0)) { + HEAP16[$pnt2$368 >> 1] = $66; + if (($wk_max$160 | 0) > 0) { + $k$056 = 0; + $wk$057 = $18; + while (1) { + if ((HEAP32[$wk$057 >> 2] | 0) == ($63 | 0)) HEAP32[$wk$057 >> 2] = $66; + $k$056 = $k$056 + 1 | 0; + if (($k$056 | 0) >= ($wk_max$160 | 0)) { + $83 = $66; + break; + } else $wk$057 = $wk$057 + 4 | 0; + } + } else $83 = $66; + } else { + HEAP16[$pnt2$368 >> 1] = $63; + if (($63 | 0) < ($66 | 0) & ($wk_max$160 | 0) > 0) { + $k$153 = 0; + $wk$154 = $18; + while (1) { + if ((HEAP32[$wk$154 >> 2] | 0) == ($66 | 0)) HEAP32[$wk$154 >> 2] = $63; + $k$153 = $k$153 + 1 | 0; + if (($k$153 | 0) >= ($wk_max$160 | 0)) { + $83 = $63; + break; + } else $wk$154 = $wk$154 + 4 | 0; + } + } else $83 = $63; + } + $85 = ($83 << 16 >> 16) * 7 | 0; + $87 = $labelInfo + 1310736 + ($85 + -7 << 2) | 0; + HEAP32[$87 >> 2] = (HEAP32[$87 >> 2] | 0) + 1; + $91 = $labelInfo + 1310736 + ($85 + -6 << 2) | 0; + HEAP32[$91 >> 2] = (HEAP32[$91 >> 2] | 0) + $i$265; + $95 = $labelInfo + 1310736 + ($85 + -5 << 2) | 0; + HEAP32[$95 >> 2] = (HEAP32[$95 >> 2] | 0) + $j$076; + HEAP32[$labelInfo + 1310736 + ($85 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $101 = HEAP16[$pnt2$368 + -2 >> 1] | 0; + if ($101 << 16 >> 16 <= 0) { + HEAP16[$pnt2$368 >> 1] = $54; + $141 = $55 * 7 | 0; + $143 = $labelInfo + 1310736 + ($141 + -7 << 2) | 0; + HEAP32[$143 >> 2] = (HEAP32[$143 >> 2] | 0) + 1; + $147 = $labelInfo + 1310736 + ($141 + -6 << 2) | 0; + HEAP32[$147 >> 2] = (HEAP32[$147 >> 2] | 0) + $i$265; + $151 = $labelInfo + 1310736 + ($141 + -5 << 2) | 0; + HEAP32[$151 >> 2] = (HEAP32[$151 >> 2] | 0) + $j$076; + $155 = $labelInfo + 1310736 + ($141 + -4 << 2) | 0; + if ((HEAP32[$155 >> 2] | 0) > ($i$265 | 0)) HEAP32[$155 >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($141 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $106 = HEAP32[$labelInfo + 1179664 + ($55 + -1 << 2) >> 2] | 0; + $109 = HEAP32[$labelInfo + 1179664 + (($101 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($106 | 0) > ($109 | 0)) { + HEAP16[$pnt2$368 >> 1] = $109; + if (($wk_max$160 | 0) > 0) { + $k$249 = 0; + $wk$250 = $18; + while (1) { + if ((HEAP32[$wk$250 >> 2] | 0) == ($106 | 0)) HEAP32[$wk$250 >> 2] = $109; + $k$249 = $k$249 + 1 | 0; + if (($k$249 | 0) >= ($wk_max$160 | 0)) { + $126 = $109; + break; + } else $wk$250 = $wk$250 + 4 | 0; + } + } else $126 = $109; + } else { + HEAP16[$pnt2$368 >> 1] = $106; + if (($106 | 0) < ($109 | 0) & ($wk_max$160 | 0) > 0) { + $k$346 = 0; + $wk$347 = $18; + while (1) { + if ((HEAP32[$wk$347 >> 2] | 0) == ($109 | 0)) HEAP32[$wk$347 >> 2] = $106; + $k$346 = $k$346 + 1 | 0; + if (($k$346 | 0) >= ($wk_max$160 | 0)) { + $126 = $106; + break; + } else $wk$347 = $wk$347 + 4 | 0; + } + } else $126 = $106; + } + $128 = ($126 << 16 >> 16) * 7 | 0; + $130 = $labelInfo + 1310736 + ($128 + -7 << 2) | 0; + HEAP32[$130 >> 2] = (HEAP32[$130 >> 2] | 0) + 1; + $134 = $labelInfo + 1310736 + ($128 + -6 << 2) | 0; + HEAP32[$134 >> 2] = (HEAP32[$134 >> 2] | 0) + $i$265; + $138 = $labelInfo + 1310736 + ($128 + -5 << 2) | 0; + HEAP32[$138 >> 2] = (HEAP32[$138 >> 2] | 0) + $j$076; + $wk_max$2 = $wk_max$160; + } while (0); + $i$265 = $i$265 + 1 | 0; + $220 = $pnt$169 + 4 | 0; + $221 = $pnt2$368 + 2 | 0; + $222 = $dpnt$167 + 1 | 0; + if (($i$265 | 0) >= ($11 | 0)) { + $dpnt$1$lcssa = $222; + $pnt$1$lcssa = $220; + $pnt2$3$lcssa = $221; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $dpnt$167 = $222; + $pnt$169 = $220; + $pnt2$368 = $221; + $wk_max$160 = $wk_max$2; + } + } + } else { + $dpnt$1$lcssa = $dpnt$078; + $pnt$1$lcssa = $pnt$080; + $pnt2$3$lcssa = $pnt2$279; + $wk_max$1$lcssa = $wk_max$075; + } + $j$076 = $j$076 + 1 | 0; + if (($j$076 | 0) >= ($3 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $dpnt$078 = $dpnt$1$lcssa + 2 | 0; + $pnt$080 = $pnt$1$lcssa + $$sum | 0; + $pnt2$279 = $pnt2$3$lcssa + 4 | 0; + $wk_max$075 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $229 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$342 = 1; + $j$143 = 1; + $wk$444 = $18; + while (1) { + $231 = HEAP32[$wk$444 >> 2] | 0; + if (($231 | 0) == ($i$342 | 0)) { + $237 = $j$143; + $j$2 = $j$143 + 1 | 0; + } else { + $237 = HEAP32[$labelInfo + 1179664 + ($231 + -1 << 2) >> 2] | 0; + $j$2 = $j$143; + } + HEAP32[$wk$444 >> 2] = $237; + if (($i$342 | 0) < ($wk_max$0$lcssa | 0)) { + $i$342 = $i$342 + 1 | 0; + $j$143 = $j$2; + $wk$444 = $wk$444 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $241 = $labelInfo + 8 | 0; + $242 = $j$1$lcssa + -1 | 0; + HEAP32[$241 >> 2] = $242; + if (!$242) $$0 = 0; else { + _memset($229 | 0, 0, $242 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $242 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$440 = 0; + do { + $249 = $i$440 << 2; + HEAP32[$labelInfo + 131084 + ($249 << 2) >> 2] = $0; + HEAP32[$labelInfo + 131084 + (($249 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($249 | 2) << 2) >> 2] = $1; + HEAP32[$labelInfo + 131084 + (($249 | 3) << 2) >> 2] = 0; + $i$440 = $i$440 + 1 | 0; + } while (($i$440 | 0) < (HEAP32[$241 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$538 = 0; + do { + $263 = (HEAP32[$labelInfo + 1179664 + ($i$538 << 2) >> 2] | 0) + -1 | 0; + $264 = $i$538 * 7 | 0; + $267 = $labelInfo + 12 + ($263 << 2) | 0; + HEAP32[$267 >> 2] = (HEAP32[$267 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($264 << 2) >> 2] | 0); + $274 = $263 << 1; + $275 = $labelInfo + 655376 + ($274 << 3) | 0; + HEAPF64[$275 >> 3] = +HEAPF64[$275 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($264 + 1 << 2) >> 2] | 0); + $283 = $labelInfo + 655376 + (($274 | 1) << 3) | 0; + HEAPF64[$283 >> 3] = +HEAPF64[$283 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($264 + 2 << 2) >> 2] | 0); + $286 = $263 << 2; + $287 = $labelInfo + 131084 + ($286 << 2) | 0; + $291 = HEAP32[$labelInfo + 1310736 + ($264 + 3 << 2) >> 2] | 0; + if ((HEAP32[$287 >> 2] | 0) > ($291 | 0)) HEAP32[$287 >> 2] = $291; + $294 = $labelInfo + 131084 + (($286 | 1) << 2) | 0; + $298 = HEAP32[$labelInfo + 1310736 + ($264 + 4 << 2) >> 2] | 0; + if ((HEAP32[$294 >> 2] | 0) < ($298 | 0)) HEAP32[$294 >> 2] = $298; + $301 = $labelInfo + 131084 + (($286 | 2) << 2) | 0; + $305 = HEAP32[$labelInfo + 1310736 + ($264 + 5 << 2) >> 2] | 0; + if ((HEAP32[$301 >> 2] | 0) > ($305 | 0)) HEAP32[$301 >> 2] = $305; + $308 = $labelInfo + 131084 + (($286 | 3) << 2) | 0; + $312 = HEAP32[$labelInfo + 1310736 + ($264 + 6 << 2) >> 2] | 0; + if ((HEAP32[$308 >> 2] | 0) < ($312 | 0)) HEAP32[$308 >> 2] = $312; + $i$538 = $i$538 + 1 | 0; + } while (($i$538 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$241 >> 2] | 0) > 0) { + $i$637 = 0; + do { + $316 = $labelInfo + 12 + ($i$637 << 2) | 0; + $319 = $i$637 << 1; + $320 = $labelInfo + 655376 + ($319 << 3) | 0; + HEAPF64[$320 >> 3] = +HEAPF64[$320 >> 3] / +(HEAP32[$316 >> 2] | 0); + $326 = $labelInfo + 655376 + (($319 | 1) << 3) | 0; + HEAPF64[$326 >> 3] = +HEAPF64[$326 >> 3] / +(HEAP32[$316 >> 2] | 0); + $i$637 = $i$637 + 1 | 0; + } while (($i$637 | 0) < (HEAP32[$241 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} +function _arLabelingSubEWIYC($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $$sum2 = 0, $0 = 0, $1 = 0, $101 = 0, $106 = 0, $109 = 0, $11 = 0, $126 = 0, $128 = 0, $130 = 0, $134 = 0, $138 = 0, $141 = 0, $143 = 0, $147 = 0, $151 = 0, $155 = 0, $160 = 0, $162 = 0, $166 = 0, $170 = 0, $174 = 0, $18 = 0, $180 = 0, $183 = 0, $185 = 0, $189 = 0, $19 = 0, $193 = 0, $197 = 0, $2 = 0, $200 = 0, $205 = 0, $21 = 0, $220 = 0, $221 = 0, $222 = 0, $229 = 0, $231 = 0, $237 = 0, $241 = 0, $242 = 0, $249 = 0, $263 = 0, $264 = 0, $267 = 0, $274 = 0, $275 = 0, $283 = 0, $286 = 0, $287 = 0, $291 = 0, $294 = 0, $298 = 0, $3 = 0, $30 = 0, $301 = 0, $305 = 0, $308 = 0, $312 = 0, $316 = 0, $319 = 0, $320 = 0, $326 = 0, $35 = 0, $38 = 0, $40 = 0, $44 = 0, $48 = 0, $54 = 0, $55 = 0, $58 = 0, $59 = 0, $60 = 0, $63 = 0, $66 = 0, $83 = 0, $85 = 0, $87 = 0, $91 = 0, $95 = 0, $dpnt$078 = 0, $dpnt$1$lcssa = 0, $dpnt$167 = 0, $i$089 = 0, $i$183 = 0, $i$265 = 0, $i$342 = 0, $i$440 = 0, $i$538 = 0, $i$637 = 0, $j$076 = 0, $j$1$lcssa = 0, $j$143 = 0, $j$2 = 0, $k$056 = 0, $k$153 = 0, $k$249 = 0, $k$346 = 0, $pnt$080 = 0, $pnt$1$lcssa = 0, $pnt$169 = 0, $pnt1$091 = 0, $pnt1$185 = 0, $pnt2$090 = 0, $pnt2$184 = 0, $pnt2$279 = 0, $pnt2$3$lcssa = 0, $pnt2$368 = 0, $vararg_buffer = 0, $wk$057 = 0, $wk$154 = 0, $wk$250 = 0, $wk$347 = 0, $wk$444 = 0, $wk_max$0$lcssa = 0, $wk_max$075 = 0, $wk_max$1$lcssa = 0, $wk_max$160 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = ($xsize | 0) / 2 | 0; + $1 = ($ysize | 0) / 2 | 0; + $2 = HEAP32[$labelInfo >> 2] | 0; + $3 = $1 + -1 | 0; + if (($xsize | 0) > 1) { + $i$089 = 0; + $pnt1$091 = $2; + $pnt2$090 = $2 + ((Math_imul($3, $0) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$090 >> 1] = 0; + HEAP16[$pnt1$091 >> 1] = 0; + $i$089 = $i$089 + 1 | 0; + if (($i$089 | 0) >= ($0 | 0)) break; else { + $pnt1$091 = $pnt1$091 + 2 | 0; + $pnt2$090 = $pnt2$090 + 2 | 0; + } + } + } + $11 = $0 + -1 | 0; + if (($ysize | 0) > 1) { + $i$183 = 0; + $pnt1$185 = $2; + $pnt2$184 = $2 + ($11 << 1) | 0; + while (1) { + HEAP16[$pnt2$184 >> 1] = 0; + HEAP16[$pnt1$185 >> 1] = 0; + $i$183 = $i$183 + 1 | 0; + if (($i$183 | 0) >= ($1 | 0)) break; else { + $pnt1$185 = $pnt1$185 + ($0 << 1) | 0; + $pnt2$184 = $pnt2$184 + ($0 << 1) | 0; + } + } + } + $18 = $labelInfo + 1179664 | 0; + $19 = $0 + 1 | 0; + $21 = 0 - $0 | 0; + $$sum1 = 1 - $0 | 0; + $$sum2 = ~$0; + $$sum = ($xsize << 1) + 8 | 0; + L11 : do if (($3 | 0) > 1) { + $30 = ($11 | 0) > 1; + $dpnt$078 = (HEAP32[$labelInfo + 4 >> 2] | 0) + $19 | 0; + $j$076 = 1; + $pnt$080 = $image + (($xsize << 2) + 4) | 0; + $pnt2$279 = $2 + ($19 << 1) | 0; + $wk_max$075 = 0; + L13 : while (1) { + if ($30) { + $dpnt$167 = $dpnt$078; + $i$265 = 1; + $pnt$169 = $pnt$080; + $pnt2$368 = $pnt2$279; + $wk_max$160 = $wk_max$075; + while (1) { + do if ((HEAPU8[$pnt$169 >> 0] | 0 | 0) > ($labelingThresh | 0)) { + HEAP8[$dpnt$167 >> 0] = -1; + $35 = HEAP16[$pnt2$368 + ($21 << 1) >> 1] | 0; + if ($35 << 16 >> 16 > 0) { + HEAP16[$pnt2$368 >> 1] = $35; + $38 = ($35 << 16 >> 16) * 7 | 0; + $40 = $labelInfo + 1310736 + ($38 + -7 << 2) | 0; + HEAP32[$40 >> 2] = (HEAP32[$40 >> 2] | 0) + 1; + $44 = $labelInfo + 1310736 + ($38 + -6 << 2) | 0; + HEAP32[$44 >> 2] = (HEAP32[$44 >> 2] | 0) + $i$265; + $48 = $labelInfo + 1310736 + ($38 + -5 << 2) | 0; + HEAP32[$48 >> 2] = (HEAP32[$48 >> 2] | 0) + $j$076; + HEAP32[$labelInfo + 1310736 + ($38 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $54 = HEAP16[$pnt2$368 + ($$sum1 << 1) >> 1] | 0; + $55 = $54 << 16 >> 16; + $58 = HEAP16[$pnt2$368 + ($$sum2 << 1) >> 1] | 0; + $59 = $58 << 16 >> 16; + $60 = $58 << 16 >> 16 > 0; + if ($54 << 16 >> 16 <= 0) { + if ($60) { + HEAP16[$pnt2$368 >> 1] = $58; + $160 = $59 * 7 | 0; + $162 = $labelInfo + 1310736 + ($160 + -7 << 2) | 0; + HEAP32[$162 >> 2] = (HEAP32[$162 >> 2] | 0) + 1; + $166 = $labelInfo + 1310736 + ($160 + -6 << 2) | 0; + HEAP32[$166 >> 2] = (HEAP32[$166 >> 2] | 0) + $i$265; + $170 = $labelInfo + 1310736 + ($160 + -5 << 2) | 0; + HEAP32[$170 >> 2] = (HEAP32[$170 >> 2] | 0) + $j$076; + $174 = $labelInfo + 1310736 + ($160 + -3 << 2) | 0; + if ((HEAP32[$174 >> 2] | 0) < ($i$265 | 0)) HEAP32[$174 >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($160 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $180 = HEAP16[$pnt2$368 + -2 >> 1] | 0; + if ($180 << 16 >> 16 > 0) { + HEAP16[$pnt2$368 >> 1] = $180; + $183 = ($180 << 16 >> 16) * 7 | 0; + $185 = $labelInfo + 1310736 + ($183 + -7 << 2) | 0; + HEAP32[$185 >> 2] = (HEAP32[$185 >> 2] | 0) + 1; + $189 = $labelInfo + 1310736 + ($183 + -6 << 2) | 0; + HEAP32[$189 >> 2] = (HEAP32[$189 >> 2] | 0) + $i$265; + $193 = $labelInfo + 1310736 + ($183 + -5 << 2) | 0; + HEAP32[$193 >> 2] = (HEAP32[$193 >> 2] | 0) + $j$076; + $197 = $labelInfo + 1310736 + ($183 + -3 << 2) | 0; + if ((HEAP32[$197 >> 2] | 0) >= ($i$265 | 0)) { + $wk_max$2 = $wk_max$160; + break; + } + HEAP32[$197 >> 2] = $i$265; + $wk_max$2 = $wk_max$160; + break; + } else { + $200 = $wk_max$160 + 1 | 0; + if (($wk_max$160 | 0) > 32767) break L13; + HEAP16[$pnt2$368 >> 1] = $200; + HEAP32[$labelInfo + 1179664 + ($wk_max$160 << 2) >> 2] = $200 << 16 >> 16; + $205 = $wk_max$160 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($205 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($205 + 1 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($205 + 2 << 2) >> 2] = $j$076; + HEAP32[$labelInfo + 1310736 + ($205 + 3 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($205 + 4 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($205 + 5 << 2) >> 2] = $j$076; + HEAP32[$labelInfo + 1310736 + ($205 + 6 << 2) >> 2] = $j$076; + $wk_max$2 = $200; + break; + } + } + if ($60) { + $63 = HEAP32[$labelInfo + 1179664 + ($55 + -1 << 2) >> 2] | 0; + $66 = HEAP32[$labelInfo + 1179664 + ($59 + -1 << 2) >> 2] | 0; + if (($63 | 0) > ($66 | 0)) { + HEAP16[$pnt2$368 >> 1] = $66; + if (($wk_max$160 | 0) > 0) { + $k$056 = 0; + $wk$057 = $18; + while (1) { + if ((HEAP32[$wk$057 >> 2] | 0) == ($63 | 0)) HEAP32[$wk$057 >> 2] = $66; + $k$056 = $k$056 + 1 | 0; + if (($k$056 | 0) >= ($wk_max$160 | 0)) { + $83 = $66; + break; + } else $wk$057 = $wk$057 + 4 | 0; + } + } else $83 = $66; + } else { + HEAP16[$pnt2$368 >> 1] = $63; + if (($63 | 0) < ($66 | 0) & ($wk_max$160 | 0) > 0) { + $k$153 = 0; + $wk$154 = $18; + while (1) { + if ((HEAP32[$wk$154 >> 2] | 0) == ($66 | 0)) HEAP32[$wk$154 >> 2] = $63; + $k$153 = $k$153 + 1 | 0; + if (($k$153 | 0) >= ($wk_max$160 | 0)) { + $83 = $63; + break; + } else $wk$154 = $wk$154 + 4 | 0; + } + } else $83 = $63; + } + $85 = ($83 << 16 >> 16) * 7 | 0; + $87 = $labelInfo + 1310736 + ($85 + -7 << 2) | 0; + HEAP32[$87 >> 2] = (HEAP32[$87 >> 2] | 0) + 1; + $91 = $labelInfo + 1310736 + ($85 + -6 << 2) | 0; + HEAP32[$91 >> 2] = (HEAP32[$91 >> 2] | 0) + $i$265; + $95 = $labelInfo + 1310736 + ($85 + -5 << 2) | 0; + HEAP32[$95 >> 2] = (HEAP32[$95 >> 2] | 0) + $j$076; + HEAP32[$labelInfo + 1310736 + ($85 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $101 = HEAP16[$pnt2$368 + -2 >> 1] | 0; + if ($101 << 16 >> 16 <= 0) { + HEAP16[$pnt2$368 >> 1] = $54; + $141 = $55 * 7 | 0; + $143 = $labelInfo + 1310736 + ($141 + -7 << 2) | 0; + HEAP32[$143 >> 2] = (HEAP32[$143 >> 2] | 0) + 1; + $147 = $labelInfo + 1310736 + ($141 + -6 << 2) | 0; + HEAP32[$147 >> 2] = (HEAP32[$147 >> 2] | 0) + $i$265; + $151 = $labelInfo + 1310736 + ($141 + -5 << 2) | 0; + HEAP32[$151 >> 2] = (HEAP32[$151 >> 2] | 0) + $j$076; + $155 = $labelInfo + 1310736 + ($141 + -4 << 2) | 0; + if ((HEAP32[$155 >> 2] | 0) > ($i$265 | 0)) HEAP32[$155 >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($141 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $106 = HEAP32[$labelInfo + 1179664 + ($55 + -1 << 2) >> 2] | 0; + $109 = HEAP32[$labelInfo + 1179664 + (($101 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($106 | 0) > ($109 | 0)) { + HEAP16[$pnt2$368 >> 1] = $109; + if (($wk_max$160 | 0) > 0) { + $k$249 = 0; + $wk$250 = $18; + while (1) { + if ((HEAP32[$wk$250 >> 2] | 0) == ($106 | 0)) HEAP32[$wk$250 >> 2] = $109; + $k$249 = $k$249 + 1 | 0; + if (($k$249 | 0) >= ($wk_max$160 | 0)) { + $126 = $109; + break; + } else $wk$250 = $wk$250 + 4 | 0; + } + } else $126 = $109; + } else { + HEAP16[$pnt2$368 >> 1] = $106; + if (($106 | 0) < ($109 | 0) & ($wk_max$160 | 0) > 0) { + $k$346 = 0; + $wk$347 = $18; + while (1) { + if ((HEAP32[$wk$347 >> 2] | 0) == ($109 | 0)) HEAP32[$wk$347 >> 2] = $106; + $k$346 = $k$346 + 1 | 0; + if (($k$346 | 0) >= ($wk_max$160 | 0)) { + $126 = $106; + break; + } else $wk$347 = $wk$347 + 4 | 0; + } + } else $126 = $106; + } + $128 = ($126 << 16 >> 16) * 7 | 0; + $130 = $labelInfo + 1310736 + ($128 + -7 << 2) | 0; + HEAP32[$130 >> 2] = (HEAP32[$130 >> 2] | 0) + 1; + $134 = $labelInfo + 1310736 + ($128 + -6 << 2) | 0; + HEAP32[$134 >> 2] = (HEAP32[$134 >> 2] | 0) + $i$265; + $138 = $labelInfo + 1310736 + ($128 + -5 << 2) | 0; + HEAP32[$138 >> 2] = (HEAP32[$138 >> 2] | 0) + $j$076; + $wk_max$2 = $wk_max$160; + } else { + HEAP16[$pnt2$368 >> 1] = 0; + HEAP8[$dpnt$167 >> 0] = 0; + $wk_max$2 = $wk_max$160; + } while (0); + $i$265 = $i$265 + 1 | 0; + $220 = $pnt$169 + 4 | 0; + $221 = $pnt2$368 + 2 | 0; + $222 = $dpnt$167 + 1 | 0; + if (($i$265 | 0) >= ($11 | 0)) { + $dpnt$1$lcssa = $222; + $pnt$1$lcssa = $220; + $pnt2$3$lcssa = $221; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $dpnt$167 = $222; + $pnt$169 = $220; + $pnt2$368 = $221; + $wk_max$160 = $wk_max$2; + } + } + } else { + $dpnt$1$lcssa = $dpnt$078; + $pnt$1$lcssa = $pnt$080; + $pnt2$3$lcssa = $pnt2$279; + $wk_max$1$lcssa = $wk_max$075; + } + $j$076 = $j$076 + 1 | 0; + if (($j$076 | 0) >= ($3 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $dpnt$078 = $dpnt$1$lcssa + 2 | 0; + $pnt$080 = $pnt$1$lcssa + $$sum | 0; + $pnt2$279 = $pnt2$3$lcssa + 4 | 0; + $wk_max$075 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $229 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$342 = 1; + $j$143 = 1; + $wk$444 = $18; + while (1) { + $231 = HEAP32[$wk$444 >> 2] | 0; + if (($231 | 0) == ($i$342 | 0)) { + $237 = $j$143; + $j$2 = $j$143 + 1 | 0; + } else { + $237 = HEAP32[$labelInfo + 1179664 + ($231 + -1 << 2) >> 2] | 0; + $j$2 = $j$143; + } + HEAP32[$wk$444 >> 2] = $237; + if (($i$342 | 0) < ($wk_max$0$lcssa | 0)) { + $i$342 = $i$342 + 1 | 0; + $j$143 = $j$2; + $wk$444 = $wk$444 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $241 = $labelInfo + 8 | 0; + $242 = $j$1$lcssa + -1 | 0; + HEAP32[$241 >> 2] = $242; + if (!$242) $$0 = 0; else { + _memset($229 | 0, 0, $242 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $242 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$440 = 0; + do { + $249 = $i$440 << 2; + HEAP32[$labelInfo + 131084 + ($249 << 2) >> 2] = $0; + HEAP32[$labelInfo + 131084 + (($249 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($249 | 2) << 2) >> 2] = $1; + HEAP32[$labelInfo + 131084 + (($249 | 3) << 2) >> 2] = 0; + $i$440 = $i$440 + 1 | 0; + } while (($i$440 | 0) < (HEAP32[$241 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$538 = 0; + do { + $263 = (HEAP32[$labelInfo + 1179664 + ($i$538 << 2) >> 2] | 0) + -1 | 0; + $264 = $i$538 * 7 | 0; + $267 = $labelInfo + 12 + ($263 << 2) | 0; + HEAP32[$267 >> 2] = (HEAP32[$267 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($264 << 2) >> 2] | 0); + $274 = $263 << 1; + $275 = $labelInfo + 655376 + ($274 << 3) | 0; + HEAPF64[$275 >> 3] = +HEAPF64[$275 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($264 + 1 << 2) >> 2] | 0); + $283 = $labelInfo + 655376 + (($274 | 1) << 3) | 0; + HEAPF64[$283 >> 3] = +HEAPF64[$283 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($264 + 2 << 2) >> 2] | 0); + $286 = $263 << 2; + $287 = $labelInfo + 131084 + ($286 << 2) | 0; + $291 = HEAP32[$labelInfo + 1310736 + ($264 + 3 << 2) >> 2] | 0; + if ((HEAP32[$287 >> 2] | 0) > ($291 | 0)) HEAP32[$287 >> 2] = $291; + $294 = $labelInfo + 131084 + (($286 | 1) << 2) | 0; + $298 = HEAP32[$labelInfo + 1310736 + ($264 + 4 << 2) >> 2] | 0; + if ((HEAP32[$294 >> 2] | 0) < ($298 | 0)) HEAP32[$294 >> 2] = $298; + $301 = $labelInfo + 131084 + (($286 | 2) << 2) | 0; + $305 = HEAP32[$labelInfo + 1310736 + ($264 + 5 << 2) >> 2] | 0; + if ((HEAP32[$301 >> 2] | 0) > ($305 | 0)) HEAP32[$301 >> 2] = $305; + $308 = $labelInfo + 131084 + (($286 | 3) << 2) | 0; + $312 = HEAP32[$labelInfo + 1310736 + ($264 + 6 << 2) >> 2] | 0; + if ((HEAP32[$308 >> 2] | 0) < ($312 | 0)) HEAP32[$308 >> 2] = $312; + $i$538 = $i$538 + 1 | 0; + } while (($i$538 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$241 >> 2] | 0) > 0) { + $i$637 = 0; + do { + $316 = $labelInfo + 12 + ($i$637 << 2) | 0; + $319 = $i$637 << 1; + $320 = $labelInfo + 655376 + ($319 << 3) | 0; + HEAPF64[$320 >> 3] = +HEAPF64[$320 >> 3] / +(HEAP32[$316 >> 2] | 0); + $326 = $labelInfo + 655376 + (($319 | 1) << 3) | 0; + HEAPF64[$326 >> 3] = +HEAPF64[$326 >> 3] / +(HEAP32[$316 >> 2] | 0); + $i$637 = $i$637 + 1 | 0; + } while (($i$637 | 0) < (HEAP32[$241 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubEWIC($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $$sum2 = 0, $0 = 0, $1 = 0, $100 = 0, $105 = 0, $108 = 0, $11 = 0, $125 = 0, $127 = 0, $129 = 0, $133 = 0, $137 = 0, $140 = 0, $142 = 0, $146 = 0, $150 = 0, $154 = 0, $159 = 0, $161 = 0, $165 = 0, $169 = 0, $173 = 0, $179 = 0, $18 = 0, $182 = 0, $184 = 0, $188 = 0, $19 = 0, $192 = 0, $196 = 0, $199 = 0, $2 = 0, $20 = 0, $204 = 0, $219 = 0, $220 = 0, $221 = 0, $228 = 0, $230 = 0, $236 = 0, $240 = 0, $241 = 0, $248 = 0, $262 = 0, $263 = 0, $266 = 0, $273 = 0, $274 = 0, $282 = 0, $285 = 0, $286 = 0, $29 = 0, $290 = 0, $293 = 0, $297 = 0, $3 = 0, $300 = 0, $304 = 0, $307 = 0, $311 = 0, $315 = 0, $318 = 0, $319 = 0, $325 = 0, $34 = 0, $37 = 0, $39 = 0, $43 = 0, $47 = 0, $53 = 0, $54 = 0, $57 = 0, $58 = 0, $59 = 0, $62 = 0, $65 = 0, $82 = 0, $84 = 0, $86 = 0, $90 = 0, $94 = 0, $dpnt$078 = 0, $dpnt$1$lcssa = 0, $dpnt$167 = 0, $i$089 = 0, $i$183 = 0, $i$265 = 0, $i$342 = 0, $i$440 = 0, $i$538 = 0, $i$637 = 0, $j$076 = 0, $j$1$lcssa = 0, $j$143 = 0, $j$2 = 0, $k$056 = 0, $k$153 = 0, $k$249 = 0, $k$346 = 0, $pnt$080 = 0, $pnt$1$lcssa = 0, $pnt$169 = 0, $pnt1$091 = 0, $pnt1$185 = 0, $pnt2$090 = 0, $pnt2$184 = 0, $pnt2$279 = 0, $pnt2$3$lcssa = 0, $pnt2$368 = 0, $vararg_buffer = 0, $wk$057 = 0, $wk$154 = 0, $wk$250 = 0, $wk$347 = 0, $wk$444 = 0, $wk_max$0$lcssa = 0, $wk_max$075 = 0, $wk_max$1$lcssa = 0, $wk_max$160 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = ($xsize | 0) / 2 | 0; + $1 = ($ysize | 0) / 2 | 0; + $2 = HEAP32[$labelInfo >> 2] | 0; + $3 = $1 + -1 | 0; + if (($xsize | 0) > 1) { + $i$089 = 0; + $pnt1$091 = $2; + $pnt2$090 = $2 + ((Math_imul($3, $0) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$090 >> 1] = 0; + HEAP16[$pnt1$091 >> 1] = 0; + $i$089 = $i$089 + 1 | 0; + if (($i$089 | 0) >= ($0 | 0)) break; else { + $pnt1$091 = $pnt1$091 + 2 | 0; + $pnt2$090 = $pnt2$090 + 2 | 0; + } + } + } + $11 = $0 + -1 | 0; + if (($ysize | 0) > 1) { + $i$183 = 0; + $pnt1$185 = $2; + $pnt2$184 = $2 + ($11 << 1) | 0; + while (1) { + HEAP16[$pnt2$184 >> 1] = 0; + HEAP16[$pnt1$185 >> 1] = 0; + $i$183 = $i$183 + 1 | 0; + if (($i$183 | 0) >= ($1 | 0)) break; else { + $pnt1$185 = $pnt1$185 + ($0 << 1) | 0; + $pnt2$184 = $pnt2$184 + ($0 << 1) | 0; + } + } + } + $18 = $labelInfo + 1179664 | 0; + $19 = $0 + 1 | 0; + $20 = 0 - $0 | 0; + $$sum1 = 1 - $0 | 0; + $$sum2 = ~$0; + $$sum = $xsize + 4 | 0; + L11 : do if (($3 | 0) > 1) { + $29 = ($11 | 0) > 1; + $dpnt$078 = (HEAP32[$labelInfo + 4 >> 2] | 0) + $19 | 0; + $j$076 = 1; + $pnt$080 = $image + (($xsize << 1) + 2) | 0; + $pnt2$279 = $2 + ($19 << 1) | 0; + $wk_max$075 = 0; + L13 : while (1) { + if ($29) { + $dpnt$167 = $dpnt$078; + $i$265 = 1; + $pnt$169 = $pnt$080; + $pnt2$368 = $pnt2$279; + $wk_max$160 = $wk_max$075; + while (1) { + do if ((HEAPU8[$pnt$169 >> 0] | 0 | 0) > ($labelingThresh | 0)) { + HEAP8[$dpnt$167 >> 0] = -1; + $34 = HEAP16[$pnt2$368 + ($20 << 1) >> 1] | 0; + if ($34 << 16 >> 16 > 0) { + HEAP16[$pnt2$368 >> 1] = $34; + $37 = ($34 << 16 >> 16) * 7 | 0; + $39 = $labelInfo + 1310736 + ($37 + -7 << 2) | 0; + HEAP32[$39 >> 2] = (HEAP32[$39 >> 2] | 0) + 1; + $43 = $labelInfo + 1310736 + ($37 + -6 << 2) | 0; + HEAP32[$43 >> 2] = (HEAP32[$43 >> 2] | 0) + $i$265; + $47 = $labelInfo + 1310736 + ($37 + -5 << 2) | 0; + HEAP32[$47 >> 2] = (HEAP32[$47 >> 2] | 0) + $j$076; + HEAP32[$labelInfo + 1310736 + ($37 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $53 = HEAP16[$pnt2$368 + ($$sum1 << 1) >> 1] | 0; + $54 = $53 << 16 >> 16; + $57 = HEAP16[$pnt2$368 + ($$sum2 << 1) >> 1] | 0; + $58 = $57 << 16 >> 16; + $59 = $57 << 16 >> 16 > 0; + if ($53 << 16 >> 16 <= 0) { + if ($59) { + HEAP16[$pnt2$368 >> 1] = $57; + $159 = $58 * 7 | 0; + $161 = $labelInfo + 1310736 + ($159 + -7 << 2) | 0; + HEAP32[$161 >> 2] = (HEAP32[$161 >> 2] | 0) + 1; + $165 = $labelInfo + 1310736 + ($159 + -6 << 2) | 0; + HEAP32[$165 >> 2] = (HEAP32[$165 >> 2] | 0) + $i$265; + $169 = $labelInfo + 1310736 + ($159 + -5 << 2) | 0; + HEAP32[$169 >> 2] = (HEAP32[$169 >> 2] | 0) + $j$076; + $173 = $labelInfo + 1310736 + ($159 + -3 << 2) | 0; + if ((HEAP32[$173 >> 2] | 0) < ($i$265 | 0)) HEAP32[$173 >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($159 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $179 = HEAP16[$pnt2$368 + -2 >> 1] | 0; + if ($179 << 16 >> 16 > 0) { + HEAP16[$pnt2$368 >> 1] = $179; + $182 = ($179 << 16 >> 16) * 7 | 0; + $184 = $labelInfo + 1310736 + ($182 + -7 << 2) | 0; + HEAP32[$184 >> 2] = (HEAP32[$184 >> 2] | 0) + 1; + $188 = $labelInfo + 1310736 + ($182 + -6 << 2) | 0; + HEAP32[$188 >> 2] = (HEAP32[$188 >> 2] | 0) + $i$265; + $192 = $labelInfo + 1310736 + ($182 + -5 << 2) | 0; + HEAP32[$192 >> 2] = (HEAP32[$192 >> 2] | 0) + $j$076; + $196 = $labelInfo + 1310736 + ($182 + -3 << 2) | 0; + if ((HEAP32[$196 >> 2] | 0) >= ($i$265 | 0)) { + $wk_max$2 = $wk_max$160; + break; + } + HEAP32[$196 >> 2] = $i$265; + $wk_max$2 = $wk_max$160; + break; + } else { + $199 = $wk_max$160 + 1 | 0; + if (($wk_max$160 | 0) > 32767) break L13; + HEAP16[$pnt2$368 >> 1] = $199; + HEAP32[$labelInfo + 1179664 + ($wk_max$160 << 2) >> 2] = $199 << 16 >> 16; + $204 = $wk_max$160 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($204 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($204 + 1 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($204 + 2 << 2) >> 2] = $j$076; + HEAP32[$labelInfo + 1310736 + ($204 + 3 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($204 + 4 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($204 + 5 << 2) >> 2] = $j$076; + HEAP32[$labelInfo + 1310736 + ($204 + 6 << 2) >> 2] = $j$076; + $wk_max$2 = $199; + break; + } + } + if ($59) { + $62 = HEAP32[$labelInfo + 1179664 + ($54 + -1 << 2) >> 2] | 0; + $65 = HEAP32[$labelInfo + 1179664 + ($58 + -1 << 2) >> 2] | 0; + if (($62 | 0) > ($65 | 0)) { + HEAP16[$pnt2$368 >> 1] = $65; + if (($wk_max$160 | 0) > 0) { + $k$056 = 0; + $wk$057 = $18; + while (1) { + if ((HEAP32[$wk$057 >> 2] | 0) == ($62 | 0)) HEAP32[$wk$057 >> 2] = $65; + $k$056 = $k$056 + 1 | 0; + if (($k$056 | 0) >= ($wk_max$160 | 0)) { + $82 = $65; + break; + } else $wk$057 = $wk$057 + 4 | 0; + } + } else $82 = $65; + } else { + HEAP16[$pnt2$368 >> 1] = $62; + if (($62 | 0) < ($65 | 0) & ($wk_max$160 | 0) > 0) { + $k$153 = 0; + $wk$154 = $18; + while (1) { + if ((HEAP32[$wk$154 >> 2] | 0) == ($65 | 0)) HEAP32[$wk$154 >> 2] = $62; + $k$153 = $k$153 + 1 | 0; + if (($k$153 | 0) >= ($wk_max$160 | 0)) { + $82 = $62; + break; + } else $wk$154 = $wk$154 + 4 | 0; + } + } else $82 = $62; + } + $84 = ($82 << 16 >> 16) * 7 | 0; + $86 = $labelInfo + 1310736 + ($84 + -7 << 2) | 0; + HEAP32[$86 >> 2] = (HEAP32[$86 >> 2] | 0) + 1; + $90 = $labelInfo + 1310736 + ($84 + -6 << 2) | 0; + HEAP32[$90 >> 2] = (HEAP32[$90 >> 2] | 0) + $i$265; + $94 = $labelInfo + 1310736 + ($84 + -5 << 2) | 0; + HEAP32[$94 >> 2] = (HEAP32[$94 >> 2] | 0) + $j$076; + HEAP32[$labelInfo + 1310736 + ($84 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $100 = HEAP16[$pnt2$368 + -2 >> 1] | 0; + if ($100 << 16 >> 16 <= 0) { + HEAP16[$pnt2$368 >> 1] = $53; + $140 = $54 * 7 | 0; + $142 = $labelInfo + 1310736 + ($140 + -7 << 2) | 0; + HEAP32[$142 >> 2] = (HEAP32[$142 >> 2] | 0) + 1; + $146 = $labelInfo + 1310736 + ($140 + -6 << 2) | 0; + HEAP32[$146 >> 2] = (HEAP32[$146 >> 2] | 0) + $i$265; + $150 = $labelInfo + 1310736 + ($140 + -5 << 2) | 0; + HEAP32[$150 >> 2] = (HEAP32[$150 >> 2] | 0) + $j$076; + $154 = $labelInfo + 1310736 + ($140 + -4 << 2) | 0; + if ((HEAP32[$154 >> 2] | 0) > ($i$265 | 0)) HEAP32[$154 >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($140 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $105 = HEAP32[$labelInfo + 1179664 + ($54 + -1 << 2) >> 2] | 0; + $108 = HEAP32[$labelInfo + 1179664 + (($100 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($105 | 0) > ($108 | 0)) { + HEAP16[$pnt2$368 >> 1] = $108; + if (($wk_max$160 | 0) > 0) { + $k$249 = 0; + $wk$250 = $18; + while (1) { + if ((HEAP32[$wk$250 >> 2] | 0) == ($105 | 0)) HEAP32[$wk$250 >> 2] = $108; + $k$249 = $k$249 + 1 | 0; + if (($k$249 | 0) >= ($wk_max$160 | 0)) { + $125 = $108; + break; + } else $wk$250 = $wk$250 + 4 | 0; + } + } else $125 = $108; + } else { + HEAP16[$pnt2$368 >> 1] = $105; + if (($105 | 0) < ($108 | 0) & ($wk_max$160 | 0) > 0) { + $k$346 = 0; + $wk$347 = $18; + while (1) { + if ((HEAP32[$wk$347 >> 2] | 0) == ($108 | 0)) HEAP32[$wk$347 >> 2] = $105; + $k$346 = $k$346 + 1 | 0; + if (($k$346 | 0) >= ($wk_max$160 | 0)) { + $125 = $105; + break; + } else $wk$347 = $wk$347 + 4 | 0; + } + } else $125 = $105; + } + $127 = ($125 << 16 >> 16) * 7 | 0; + $129 = $labelInfo + 1310736 + ($127 + -7 << 2) | 0; + HEAP32[$129 >> 2] = (HEAP32[$129 >> 2] | 0) + 1; + $133 = $labelInfo + 1310736 + ($127 + -6 << 2) | 0; + HEAP32[$133 >> 2] = (HEAP32[$133 >> 2] | 0) + $i$265; + $137 = $labelInfo + 1310736 + ($127 + -5 << 2) | 0; + HEAP32[$137 >> 2] = (HEAP32[$137 >> 2] | 0) + $j$076; + $wk_max$2 = $wk_max$160; + } else { + HEAP16[$pnt2$368 >> 1] = 0; + HEAP8[$dpnt$167 >> 0] = 0; + $wk_max$2 = $wk_max$160; + } while (0); + $i$265 = $i$265 + 1 | 0; + $219 = $pnt$169 + 2 | 0; + $220 = $pnt2$368 + 2 | 0; + $221 = $dpnt$167 + 1 | 0; + if (($i$265 | 0) >= ($11 | 0)) { + $dpnt$1$lcssa = $221; + $pnt$1$lcssa = $219; + $pnt2$3$lcssa = $220; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $dpnt$167 = $221; + $pnt$169 = $219; + $pnt2$368 = $220; + $wk_max$160 = $wk_max$2; + } + } + } else { + $dpnt$1$lcssa = $dpnt$078; + $pnt$1$lcssa = $pnt$080; + $pnt2$3$lcssa = $pnt2$279; + $wk_max$1$lcssa = $wk_max$075; + } + $j$076 = $j$076 + 1 | 0; + if (($j$076 | 0) >= ($3 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $dpnt$078 = $dpnt$1$lcssa + 2 | 0; + $pnt$080 = $pnt$1$lcssa + $$sum | 0; + $pnt2$279 = $pnt2$3$lcssa + 4 | 0; + $wk_max$075 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $228 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$342 = 1; + $j$143 = 1; + $wk$444 = $18; + while (1) { + $230 = HEAP32[$wk$444 >> 2] | 0; + if (($230 | 0) == ($i$342 | 0)) { + $236 = $j$143; + $j$2 = $j$143 + 1 | 0; + } else { + $236 = HEAP32[$labelInfo + 1179664 + ($230 + -1 << 2) >> 2] | 0; + $j$2 = $j$143; + } + HEAP32[$wk$444 >> 2] = $236; + if (($i$342 | 0) < ($wk_max$0$lcssa | 0)) { + $i$342 = $i$342 + 1 | 0; + $j$143 = $j$2; + $wk$444 = $wk$444 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $240 = $labelInfo + 8 | 0; + $241 = $j$1$lcssa + -1 | 0; + HEAP32[$240 >> 2] = $241; + if (!$241) $$0 = 0; else { + _memset($228 | 0, 0, $241 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $241 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$440 = 0; + do { + $248 = $i$440 << 2; + HEAP32[$labelInfo + 131084 + ($248 << 2) >> 2] = $0; + HEAP32[$labelInfo + 131084 + (($248 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($248 | 2) << 2) >> 2] = $1; + HEAP32[$labelInfo + 131084 + (($248 | 3) << 2) >> 2] = 0; + $i$440 = $i$440 + 1 | 0; + } while (($i$440 | 0) < (HEAP32[$240 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$538 = 0; + do { + $262 = (HEAP32[$labelInfo + 1179664 + ($i$538 << 2) >> 2] | 0) + -1 | 0; + $263 = $i$538 * 7 | 0; + $266 = $labelInfo + 12 + ($262 << 2) | 0; + HEAP32[$266 >> 2] = (HEAP32[$266 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($263 << 2) >> 2] | 0); + $273 = $262 << 1; + $274 = $labelInfo + 655376 + ($273 << 3) | 0; + HEAPF64[$274 >> 3] = +HEAPF64[$274 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($263 + 1 << 2) >> 2] | 0); + $282 = $labelInfo + 655376 + (($273 | 1) << 3) | 0; + HEAPF64[$282 >> 3] = +HEAPF64[$282 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($263 + 2 << 2) >> 2] | 0); + $285 = $262 << 2; + $286 = $labelInfo + 131084 + ($285 << 2) | 0; + $290 = HEAP32[$labelInfo + 1310736 + ($263 + 3 << 2) >> 2] | 0; + if ((HEAP32[$286 >> 2] | 0) > ($290 | 0)) HEAP32[$286 >> 2] = $290; + $293 = $labelInfo + 131084 + (($285 | 1) << 2) | 0; + $297 = HEAP32[$labelInfo + 1310736 + ($263 + 4 << 2) >> 2] | 0; + if ((HEAP32[$293 >> 2] | 0) < ($297 | 0)) HEAP32[$293 >> 2] = $297; + $300 = $labelInfo + 131084 + (($285 | 2) << 2) | 0; + $304 = HEAP32[$labelInfo + 1310736 + ($263 + 5 << 2) >> 2] | 0; + if ((HEAP32[$300 >> 2] | 0) > ($304 | 0)) HEAP32[$300 >> 2] = $304; + $307 = $labelInfo + 131084 + (($285 | 3) << 2) | 0; + $311 = HEAP32[$labelInfo + 1310736 + ($263 + 6 << 2) >> 2] | 0; + if ((HEAP32[$307 >> 2] | 0) < ($311 | 0)) HEAP32[$307 >> 2] = $311; + $i$538 = $i$538 + 1 | 0; + } while (($i$538 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$240 >> 2] | 0) > 0) { + $i$637 = 0; + do { + $315 = $labelInfo + 12 + ($i$637 << 2) | 0; + $318 = $i$637 << 1; + $319 = $labelInfo + 655376 + ($318 << 3) | 0; + HEAPF64[$319 >> 3] = +HEAPF64[$319 >> 3] / +(HEAP32[$315 >> 2] | 0); + $325 = $labelInfo + 655376 + (($318 | 1) << 3) | 0; + HEAPF64[$325 >> 3] = +HEAPF64[$325 >> 3] / +(HEAP32[$315 >> 2] | 0); + $i$637 = $i$637 + 1 | 0; + } while (($i$637 | 0) < (HEAP32[$240 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} +function _arLabelingSubEBIC($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $$sum2 = 0, $0 = 0, $1 = 0, $100 = 0, $105 = 0, $108 = 0, $11 = 0, $125 = 0, $127 = 0, $129 = 0, $133 = 0, $137 = 0, $140 = 0, $142 = 0, $146 = 0, $150 = 0, $154 = 0, $159 = 0, $161 = 0, $165 = 0, $169 = 0, $173 = 0, $179 = 0, $18 = 0, $182 = 0, $184 = 0, $188 = 0, $19 = 0, $192 = 0, $196 = 0, $199 = 0, $2 = 0, $20 = 0, $204 = 0, $219 = 0, $220 = 0, $221 = 0, $228 = 0, $230 = 0, $236 = 0, $240 = 0, $241 = 0, $248 = 0, $262 = 0, $263 = 0, $266 = 0, $273 = 0, $274 = 0, $282 = 0, $285 = 0, $286 = 0, $29 = 0, $290 = 0, $293 = 0, $297 = 0, $3 = 0, $300 = 0, $304 = 0, $307 = 0, $311 = 0, $315 = 0, $318 = 0, $319 = 0, $325 = 0, $34 = 0, $37 = 0, $39 = 0, $43 = 0, $47 = 0, $53 = 0, $54 = 0, $57 = 0, $58 = 0, $59 = 0, $62 = 0, $65 = 0, $82 = 0, $84 = 0, $86 = 0, $90 = 0, $94 = 0, $dpnt$078 = 0, $dpnt$1$lcssa = 0, $dpnt$167 = 0, $i$089 = 0, $i$183 = 0, $i$265 = 0, $i$342 = 0, $i$440 = 0, $i$538 = 0, $i$637 = 0, $j$076 = 0, $j$1$lcssa = 0, $j$143 = 0, $j$2 = 0, $k$056 = 0, $k$153 = 0, $k$249 = 0, $k$346 = 0, $pnt$080 = 0, $pnt$1$lcssa = 0, $pnt$169 = 0, $pnt1$091 = 0, $pnt1$185 = 0, $pnt2$090 = 0, $pnt2$184 = 0, $pnt2$279 = 0, $pnt2$3$lcssa = 0, $pnt2$368 = 0, $vararg_buffer = 0, $wk$057 = 0, $wk$154 = 0, $wk$250 = 0, $wk$347 = 0, $wk$444 = 0, $wk_max$0$lcssa = 0, $wk_max$075 = 0, $wk_max$1$lcssa = 0, $wk_max$160 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = ($xsize | 0) / 2 | 0; + $1 = ($ysize | 0) / 2 | 0; + $2 = HEAP32[$labelInfo >> 2] | 0; + $3 = $1 + -1 | 0; + if (($xsize | 0) > 1) { + $i$089 = 0; + $pnt1$091 = $2; + $pnt2$090 = $2 + ((Math_imul($3, $0) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$090 >> 1] = 0; + HEAP16[$pnt1$091 >> 1] = 0; + $i$089 = $i$089 + 1 | 0; + if (($i$089 | 0) >= ($0 | 0)) break; else { + $pnt1$091 = $pnt1$091 + 2 | 0; + $pnt2$090 = $pnt2$090 + 2 | 0; + } + } + } + $11 = $0 + -1 | 0; + if (($ysize | 0) > 1) { + $i$183 = 0; + $pnt1$185 = $2; + $pnt2$184 = $2 + ($11 << 1) | 0; + while (1) { + HEAP16[$pnt2$184 >> 1] = 0; + HEAP16[$pnt1$185 >> 1] = 0; + $i$183 = $i$183 + 1 | 0; + if (($i$183 | 0) >= ($1 | 0)) break; else { + $pnt1$185 = $pnt1$185 + ($0 << 1) | 0; + $pnt2$184 = $pnt2$184 + ($0 << 1) | 0; + } + } + } + $18 = $labelInfo + 1179664 | 0; + $19 = $0 + 1 | 0; + $20 = 0 - $0 | 0; + $$sum1 = 1 - $0 | 0; + $$sum2 = ~$0; + $$sum = $xsize + 4 | 0; + L11 : do if (($3 | 0) > 1) { + $29 = ($11 | 0) > 1; + $dpnt$078 = (HEAP32[$labelInfo + 4 >> 2] | 0) + $19 | 0; + $j$076 = 1; + $pnt$080 = $image + (($xsize << 1) + 2) | 0; + $pnt2$279 = $2 + ($19 << 1) | 0; + $wk_max$075 = 0; + L13 : while (1) { + if ($29) { + $dpnt$167 = $dpnt$078; + $i$265 = 1; + $pnt$169 = $pnt$080; + $pnt2$368 = $pnt2$279; + $wk_max$160 = $wk_max$075; + while (1) { + do if ((HEAPU8[$pnt$169 >> 0] | 0 | 0) > ($labelingThresh | 0)) { + HEAP16[$pnt2$368 >> 1] = 0; + HEAP8[$dpnt$167 >> 0] = 0; + $wk_max$2 = $wk_max$160; + } else { + HEAP8[$dpnt$167 >> 0] = -1; + $34 = HEAP16[$pnt2$368 + ($20 << 1) >> 1] | 0; + if ($34 << 16 >> 16 > 0) { + HEAP16[$pnt2$368 >> 1] = $34; + $37 = ($34 << 16 >> 16) * 7 | 0; + $39 = $labelInfo + 1310736 + ($37 + -7 << 2) | 0; + HEAP32[$39 >> 2] = (HEAP32[$39 >> 2] | 0) + 1; + $43 = $labelInfo + 1310736 + ($37 + -6 << 2) | 0; + HEAP32[$43 >> 2] = (HEAP32[$43 >> 2] | 0) + $i$265; + $47 = $labelInfo + 1310736 + ($37 + -5 << 2) | 0; + HEAP32[$47 >> 2] = (HEAP32[$47 >> 2] | 0) + $j$076; + HEAP32[$labelInfo + 1310736 + ($37 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $53 = HEAP16[$pnt2$368 + ($$sum1 << 1) >> 1] | 0; + $54 = $53 << 16 >> 16; + $57 = HEAP16[$pnt2$368 + ($$sum2 << 1) >> 1] | 0; + $58 = $57 << 16 >> 16; + $59 = $57 << 16 >> 16 > 0; + if ($53 << 16 >> 16 <= 0) { + if ($59) { + HEAP16[$pnt2$368 >> 1] = $57; + $159 = $58 * 7 | 0; + $161 = $labelInfo + 1310736 + ($159 + -7 << 2) | 0; + HEAP32[$161 >> 2] = (HEAP32[$161 >> 2] | 0) + 1; + $165 = $labelInfo + 1310736 + ($159 + -6 << 2) | 0; + HEAP32[$165 >> 2] = (HEAP32[$165 >> 2] | 0) + $i$265; + $169 = $labelInfo + 1310736 + ($159 + -5 << 2) | 0; + HEAP32[$169 >> 2] = (HEAP32[$169 >> 2] | 0) + $j$076; + $173 = $labelInfo + 1310736 + ($159 + -3 << 2) | 0; + if ((HEAP32[$173 >> 2] | 0) < ($i$265 | 0)) HEAP32[$173 >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($159 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $179 = HEAP16[$pnt2$368 + -2 >> 1] | 0; + if ($179 << 16 >> 16 > 0) { + HEAP16[$pnt2$368 >> 1] = $179; + $182 = ($179 << 16 >> 16) * 7 | 0; + $184 = $labelInfo + 1310736 + ($182 + -7 << 2) | 0; + HEAP32[$184 >> 2] = (HEAP32[$184 >> 2] | 0) + 1; + $188 = $labelInfo + 1310736 + ($182 + -6 << 2) | 0; + HEAP32[$188 >> 2] = (HEAP32[$188 >> 2] | 0) + $i$265; + $192 = $labelInfo + 1310736 + ($182 + -5 << 2) | 0; + HEAP32[$192 >> 2] = (HEAP32[$192 >> 2] | 0) + $j$076; + $196 = $labelInfo + 1310736 + ($182 + -3 << 2) | 0; + if ((HEAP32[$196 >> 2] | 0) >= ($i$265 | 0)) { + $wk_max$2 = $wk_max$160; + break; + } + HEAP32[$196 >> 2] = $i$265; + $wk_max$2 = $wk_max$160; + break; + } else { + $199 = $wk_max$160 + 1 | 0; + if (($wk_max$160 | 0) > 32767) break L13; + HEAP16[$pnt2$368 >> 1] = $199; + HEAP32[$labelInfo + 1179664 + ($wk_max$160 << 2) >> 2] = $199 << 16 >> 16; + $204 = $wk_max$160 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($204 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($204 + 1 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($204 + 2 << 2) >> 2] = $j$076; + HEAP32[$labelInfo + 1310736 + ($204 + 3 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($204 + 4 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($204 + 5 << 2) >> 2] = $j$076; + HEAP32[$labelInfo + 1310736 + ($204 + 6 << 2) >> 2] = $j$076; + $wk_max$2 = $199; + break; + } + } + if ($59) { + $62 = HEAP32[$labelInfo + 1179664 + ($54 + -1 << 2) >> 2] | 0; + $65 = HEAP32[$labelInfo + 1179664 + ($58 + -1 << 2) >> 2] | 0; + if (($62 | 0) > ($65 | 0)) { + HEAP16[$pnt2$368 >> 1] = $65; + if (($wk_max$160 | 0) > 0) { + $k$056 = 0; + $wk$057 = $18; + while (1) { + if ((HEAP32[$wk$057 >> 2] | 0) == ($62 | 0)) HEAP32[$wk$057 >> 2] = $65; + $k$056 = $k$056 + 1 | 0; + if (($k$056 | 0) >= ($wk_max$160 | 0)) { + $82 = $65; + break; + } else $wk$057 = $wk$057 + 4 | 0; + } + } else $82 = $65; + } else { + HEAP16[$pnt2$368 >> 1] = $62; + if (($62 | 0) < ($65 | 0) & ($wk_max$160 | 0) > 0) { + $k$153 = 0; + $wk$154 = $18; + while (1) { + if ((HEAP32[$wk$154 >> 2] | 0) == ($65 | 0)) HEAP32[$wk$154 >> 2] = $62; + $k$153 = $k$153 + 1 | 0; + if (($k$153 | 0) >= ($wk_max$160 | 0)) { + $82 = $62; + break; + } else $wk$154 = $wk$154 + 4 | 0; + } + } else $82 = $62; + } + $84 = ($82 << 16 >> 16) * 7 | 0; + $86 = $labelInfo + 1310736 + ($84 + -7 << 2) | 0; + HEAP32[$86 >> 2] = (HEAP32[$86 >> 2] | 0) + 1; + $90 = $labelInfo + 1310736 + ($84 + -6 << 2) | 0; + HEAP32[$90 >> 2] = (HEAP32[$90 >> 2] | 0) + $i$265; + $94 = $labelInfo + 1310736 + ($84 + -5 << 2) | 0; + HEAP32[$94 >> 2] = (HEAP32[$94 >> 2] | 0) + $j$076; + HEAP32[$labelInfo + 1310736 + ($84 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $100 = HEAP16[$pnt2$368 + -2 >> 1] | 0; + if ($100 << 16 >> 16 <= 0) { + HEAP16[$pnt2$368 >> 1] = $53; + $140 = $54 * 7 | 0; + $142 = $labelInfo + 1310736 + ($140 + -7 << 2) | 0; + HEAP32[$142 >> 2] = (HEAP32[$142 >> 2] | 0) + 1; + $146 = $labelInfo + 1310736 + ($140 + -6 << 2) | 0; + HEAP32[$146 >> 2] = (HEAP32[$146 >> 2] | 0) + $i$265; + $150 = $labelInfo + 1310736 + ($140 + -5 << 2) | 0; + HEAP32[$150 >> 2] = (HEAP32[$150 >> 2] | 0) + $j$076; + $154 = $labelInfo + 1310736 + ($140 + -4 << 2) | 0; + if ((HEAP32[$154 >> 2] | 0) > ($i$265 | 0)) HEAP32[$154 >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($140 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $105 = HEAP32[$labelInfo + 1179664 + ($54 + -1 << 2) >> 2] | 0; + $108 = HEAP32[$labelInfo + 1179664 + (($100 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($105 | 0) > ($108 | 0)) { + HEAP16[$pnt2$368 >> 1] = $108; + if (($wk_max$160 | 0) > 0) { + $k$249 = 0; + $wk$250 = $18; + while (1) { + if ((HEAP32[$wk$250 >> 2] | 0) == ($105 | 0)) HEAP32[$wk$250 >> 2] = $108; + $k$249 = $k$249 + 1 | 0; + if (($k$249 | 0) >= ($wk_max$160 | 0)) { + $125 = $108; + break; + } else $wk$250 = $wk$250 + 4 | 0; + } + } else $125 = $108; + } else { + HEAP16[$pnt2$368 >> 1] = $105; + if (($105 | 0) < ($108 | 0) & ($wk_max$160 | 0) > 0) { + $k$346 = 0; + $wk$347 = $18; + while (1) { + if ((HEAP32[$wk$347 >> 2] | 0) == ($108 | 0)) HEAP32[$wk$347 >> 2] = $105; + $k$346 = $k$346 + 1 | 0; + if (($k$346 | 0) >= ($wk_max$160 | 0)) { + $125 = $105; + break; + } else $wk$347 = $wk$347 + 4 | 0; + } + } else $125 = $105; + } + $127 = ($125 << 16 >> 16) * 7 | 0; + $129 = $labelInfo + 1310736 + ($127 + -7 << 2) | 0; + HEAP32[$129 >> 2] = (HEAP32[$129 >> 2] | 0) + 1; + $133 = $labelInfo + 1310736 + ($127 + -6 << 2) | 0; + HEAP32[$133 >> 2] = (HEAP32[$133 >> 2] | 0) + $i$265; + $137 = $labelInfo + 1310736 + ($127 + -5 << 2) | 0; + HEAP32[$137 >> 2] = (HEAP32[$137 >> 2] | 0) + $j$076; + $wk_max$2 = $wk_max$160; + } while (0); + $i$265 = $i$265 + 1 | 0; + $219 = $pnt$169 + 2 | 0; + $220 = $pnt2$368 + 2 | 0; + $221 = $dpnt$167 + 1 | 0; + if (($i$265 | 0) >= ($11 | 0)) { + $dpnt$1$lcssa = $221; + $pnt$1$lcssa = $219; + $pnt2$3$lcssa = $220; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $dpnt$167 = $221; + $pnt$169 = $219; + $pnt2$368 = $220; + $wk_max$160 = $wk_max$2; + } + } + } else { + $dpnt$1$lcssa = $dpnt$078; + $pnt$1$lcssa = $pnt$080; + $pnt2$3$lcssa = $pnt2$279; + $wk_max$1$lcssa = $wk_max$075; + } + $j$076 = $j$076 + 1 | 0; + if (($j$076 | 0) >= ($3 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $dpnt$078 = $dpnt$1$lcssa + 2 | 0; + $pnt$080 = $pnt$1$lcssa + $$sum | 0; + $pnt2$279 = $pnt2$3$lcssa + 4 | 0; + $wk_max$075 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $228 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$342 = 1; + $j$143 = 1; + $wk$444 = $18; + while (1) { + $230 = HEAP32[$wk$444 >> 2] | 0; + if (($230 | 0) == ($i$342 | 0)) { + $236 = $j$143; + $j$2 = $j$143 + 1 | 0; + } else { + $236 = HEAP32[$labelInfo + 1179664 + ($230 + -1 << 2) >> 2] | 0; + $j$2 = $j$143; + } + HEAP32[$wk$444 >> 2] = $236; + if (($i$342 | 0) < ($wk_max$0$lcssa | 0)) { + $i$342 = $i$342 + 1 | 0; + $j$143 = $j$2; + $wk$444 = $wk$444 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $240 = $labelInfo + 8 | 0; + $241 = $j$1$lcssa + -1 | 0; + HEAP32[$240 >> 2] = $241; + if (!$241) $$0 = 0; else { + _memset($228 | 0, 0, $241 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $241 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$440 = 0; + do { + $248 = $i$440 << 2; + HEAP32[$labelInfo + 131084 + ($248 << 2) >> 2] = $0; + HEAP32[$labelInfo + 131084 + (($248 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($248 | 2) << 2) >> 2] = $1; + HEAP32[$labelInfo + 131084 + (($248 | 3) << 2) >> 2] = 0; + $i$440 = $i$440 + 1 | 0; + } while (($i$440 | 0) < (HEAP32[$240 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$538 = 0; + do { + $262 = (HEAP32[$labelInfo + 1179664 + ($i$538 << 2) >> 2] | 0) + -1 | 0; + $263 = $i$538 * 7 | 0; + $266 = $labelInfo + 12 + ($262 << 2) | 0; + HEAP32[$266 >> 2] = (HEAP32[$266 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($263 << 2) >> 2] | 0); + $273 = $262 << 1; + $274 = $labelInfo + 655376 + ($273 << 3) | 0; + HEAPF64[$274 >> 3] = +HEAPF64[$274 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($263 + 1 << 2) >> 2] | 0); + $282 = $labelInfo + 655376 + (($273 | 1) << 3) | 0; + HEAPF64[$282 >> 3] = +HEAPF64[$282 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($263 + 2 << 2) >> 2] | 0); + $285 = $262 << 2; + $286 = $labelInfo + 131084 + ($285 << 2) | 0; + $290 = HEAP32[$labelInfo + 1310736 + ($263 + 3 << 2) >> 2] | 0; + if ((HEAP32[$286 >> 2] | 0) > ($290 | 0)) HEAP32[$286 >> 2] = $290; + $293 = $labelInfo + 131084 + (($285 | 1) << 2) | 0; + $297 = HEAP32[$labelInfo + 1310736 + ($263 + 4 << 2) >> 2] | 0; + if ((HEAP32[$293 >> 2] | 0) < ($297 | 0)) HEAP32[$293 >> 2] = $297; + $300 = $labelInfo + 131084 + (($285 | 2) << 2) | 0; + $304 = HEAP32[$labelInfo + 1310736 + ($263 + 5 << 2) >> 2] | 0; + if ((HEAP32[$300 >> 2] | 0) > ($304 | 0)) HEAP32[$300 >> 2] = $304; + $307 = $labelInfo + 131084 + (($285 | 3) << 2) | 0; + $311 = HEAP32[$labelInfo + 1310736 + ($263 + 6 << 2) >> 2] | 0; + if ((HEAP32[$307 >> 2] | 0) < ($311 | 0)) HEAP32[$307 >> 2] = $311; + $i$538 = $i$538 + 1 | 0; + } while (($i$538 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$240 >> 2] | 0) > 0) { + $i$637 = 0; + do { + $315 = $labelInfo + 12 + ($i$637 << 2) | 0; + $318 = $i$637 << 1; + $319 = $labelInfo + 655376 + ($318 << 3) | 0; + HEAPF64[$319 >> 3] = +HEAPF64[$319 >> 3] / +(HEAP32[$315 >> 2] | 0); + $325 = $labelInfo + 655376 + (($318 | 1) << 3) | 0; + HEAPF64[$325 >> 3] = +HEAPF64[$325 >> 3] / +(HEAP32[$315 >> 2] | 0); + $i$637 = $i$637 + 1 | 0; + } while (($i$637 | 0) < (HEAP32[$240 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubEWRCY($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $0 = 0, $1 = 0, $103 = 0, $106 = 0, $123 = 0, $125 = 0, $127 = 0, $131 = 0, $135 = 0, $138 = 0, $140 = 0, $144 = 0, $148 = 0, $152 = 0, $157 = 0, $159 = 0, $16 = 0, $163 = 0, $167 = 0, $17 = 0, $171 = 0, $177 = 0, $18 = 0, $180 = 0, $182 = 0, $186 = 0, $190 = 0, $194 = 0, $197 = 0, $202 = 0, $217 = 0, $218 = 0, $219 = 0, $226 = 0, $228 = 0, $234 = 0, $238 = 0, $239 = 0, $246 = 0, $26 = 0, $260 = 0, $261 = 0, $264 = 0, $271 = 0, $272 = 0, $280 = 0, $283 = 0, $284 = 0, $288 = 0, $291 = 0, $295 = 0, $298 = 0, $302 = 0, $305 = 0, $309 = 0, $313 = 0, $316 = 0, $317 = 0, $32 = 0, $323 = 0, $35 = 0, $37 = 0, $41 = 0, $45 = 0, $51 = 0, $52 = 0, $55 = 0, $56 = 0, $57 = 0, $60 = 0, $63 = 0, $80 = 0, $82 = 0, $84 = 0, $88 = 0, $9 = 0, $92 = 0, $98 = 0, $dpnt$077 = 0, $dpnt$1$lcssa = 0, $dpnt$166 = 0, $i$088 = 0, $i$182 = 0, $i$264 = 0, $i$341 = 0, $i$439 = 0, $i$537 = 0, $i$636 = 0, $j$075 = 0, $j$1$lcssa = 0, $j$142 = 0, $j$2 = 0, $k$055 = 0, $k$152 = 0, $k$248 = 0, $k$345 = 0, $pnt$079 = 0, $pnt$1$lcssa = 0, $pnt$168 = 0, $pnt1$090 = 0, $pnt1$184 = 0, $pnt2$089 = 0, $pnt2$183 = 0, $pnt2$278 = 0, $pnt2$3$lcssa = 0, $pnt2$367 = 0, $vararg_buffer = 0, $wk$056 = 0, $wk$153 = 0, $wk$249 = 0, $wk$346 = 0, $wk$443 = 0, $wk_max$0$lcssa = 0, $wk_max$074 = 0, $wk_max$1$lcssa = 0, $wk_max$159 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = HEAP32[$labelInfo >> 2] | 0; + $1 = $ysize + -1 | 0; + if (($xsize | 0) > 0) { + $i$088 = 0; + $pnt1$090 = $0; + $pnt2$089 = $0 + ((Math_imul($1, $xsize) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$089 >> 1] = 0; + HEAP16[$pnt1$090 >> 1] = 0; + $i$088 = $i$088 + 1 | 0; + if (($i$088 | 0) >= ($xsize | 0)) break; else { + $pnt1$090 = $pnt1$090 + 2 | 0; + $pnt2$089 = $pnt2$089 + 2 | 0; + } + } + } + $9 = $xsize + -1 | 0; + if (($ysize | 0) > 0) { + $i$182 = 0; + $pnt1$184 = $0; + $pnt2$183 = $0 + ($9 << 1) | 0; + while (1) { + HEAP16[$pnt2$183 >> 1] = 0; + HEAP16[$pnt1$184 >> 1] = 0; + $i$182 = $i$182 + 1 | 0; + if (($i$182 | 0) >= ($ysize | 0)) break; else { + $pnt1$184 = $pnt1$184 + ($xsize << 1) | 0; + $pnt2$183 = $pnt2$183 + ($xsize << 1) | 0; + } + } + } + $16 = $labelInfo + 1179664 | 0; + $17 = $xsize + 1 | 0; + $18 = 0 - $xsize | 0; + $$sum = 1 - $xsize | 0; + $$sum1 = ~$xsize; + L11 : do if (($1 | 0) > 1) { + $26 = ($9 | 0) > 1; + $dpnt$077 = (HEAP32[$labelInfo + 4 >> 2] | 0) + $17 | 0; + $j$075 = 1; + $pnt$079 = $image + ($17 << 1) | 0; + $pnt2$278 = $0 + ($17 << 1) | 0; + $wk_max$074 = 0; + L13 : while (1) { + if ($26) { + $dpnt$166 = $dpnt$077; + $i$264 = 1; + $pnt$168 = $pnt$079; + $pnt2$367 = $pnt2$278; + $wk_max$159 = $wk_max$074; + while (1) { + do if ((HEAPU8[$pnt$168 + 1 >> 0] | 0 | 0) > ($labelingThresh | 0)) { + HEAP8[$dpnt$166 >> 0] = -1; + $32 = HEAP16[$pnt2$367 + ($18 << 1) >> 1] | 0; + if ($32 << 16 >> 16 > 0) { + HEAP16[$pnt2$367 >> 1] = $32; + $35 = ($32 << 16 >> 16) * 7 | 0; + $37 = $labelInfo + 1310736 + ($35 + -7 << 2) | 0; + HEAP32[$37 >> 2] = (HEAP32[$37 >> 2] | 0) + 1; + $41 = $labelInfo + 1310736 + ($35 + -6 << 2) | 0; + HEAP32[$41 >> 2] = (HEAP32[$41 >> 2] | 0) + $i$264; + $45 = $labelInfo + 1310736 + ($35 + -5 << 2) | 0; + HEAP32[$45 >> 2] = (HEAP32[$45 >> 2] | 0) + $j$075; + HEAP32[$labelInfo + 1310736 + ($35 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $51 = HEAP16[$pnt2$367 + ($$sum << 1) >> 1] | 0; + $52 = $51 << 16 >> 16; + $55 = HEAP16[$pnt2$367 + ($$sum1 << 1) >> 1] | 0; + $56 = $55 << 16 >> 16; + $57 = $55 << 16 >> 16 > 0; + if ($51 << 16 >> 16 <= 0) { + if ($57) { + HEAP16[$pnt2$367 >> 1] = $55; + $157 = $56 * 7 | 0; + $159 = $labelInfo + 1310736 + ($157 + -7 << 2) | 0; + HEAP32[$159 >> 2] = (HEAP32[$159 >> 2] | 0) + 1; + $163 = $labelInfo + 1310736 + ($157 + -6 << 2) | 0; + HEAP32[$163 >> 2] = (HEAP32[$163 >> 2] | 0) + $i$264; + $167 = $labelInfo + 1310736 + ($157 + -5 << 2) | 0; + HEAP32[$167 >> 2] = (HEAP32[$167 >> 2] | 0) + $j$075; + $171 = $labelInfo + 1310736 + ($157 + -3 << 2) | 0; + if ((HEAP32[$171 >> 2] | 0) < ($i$264 | 0)) HEAP32[$171 >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($157 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $177 = HEAP16[$pnt2$367 + -2 >> 1] | 0; + if ($177 << 16 >> 16 > 0) { + HEAP16[$pnt2$367 >> 1] = $177; + $180 = ($177 << 16 >> 16) * 7 | 0; + $182 = $labelInfo + 1310736 + ($180 + -7 << 2) | 0; + HEAP32[$182 >> 2] = (HEAP32[$182 >> 2] | 0) + 1; + $186 = $labelInfo + 1310736 + ($180 + -6 << 2) | 0; + HEAP32[$186 >> 2] = (HEAP32[$186 >> 2] | 0) + $i$264; + $190 = $labelInfo + 1310736 + ($180 + -5 << 2) | 0; + HEAP32[$190 >> 2] = (HEAP32[$190 >> 2] | 0) + $j$075; + $194 = $labelInfo + 1310736 + ($180 + -3 << 2) | 0; + if ((HEAP32[$194 >> 2] | 0) >= ($i$264 | 0)) { + $wk_max$2 = $wk_max$159; + break; + } + HEAP32[$194 >> 2] = $i$264; + $wk_max$2 = $wk_max$159; + break; + } else { + $197 = $wk_max$159 + 1 | 0; + if (($wk_max$159 | 0) > 32767) break L13; + HEAP16[$pnt2$367 >> 1] = $197; + HEAP32[$labelInfo + 1179664 + ($wk_max$159 << 2) >> 2] = $197 << 16 >> 16; + $202 = $wk_max$159 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($202 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($202 + 1 << 2) >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($202 + 2 << 2) >> 2] = $j$075; + HEAP32[$labelInfo + 1310736 + ($202 + 3 << 2) >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($202 + 4 << 2) >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($202 + 5 << 2) >> 2] = $j$075; + HEAP32[$labelInfo + 1310736 + ($202 + 6 << 2) >> 2] = $j$075; + $wk_max$2 = $197; + break; + } + } + if ($57) { + $60 = HEAP32[$labelInfo + 1179664 + ($52 + -1 << 2) >> 2] | 0; + $63 = HEAP32[$labelInfo + 1179664 + ($56 + -1 << 2) >> 2] | 0; + if (($60 | 0) > ($63 | 0)) { + HEAP16[$pnt2$367 >> 1] = $63; + if (($wk_max$159 | 0) > 0) { + $k$055 = 0; + $wk$056 = $16; + while (1) { + if ((HEAP32[$wk$056 >> 2] | 0) == ($60 | 0)) HEAP32[$wk$056 >> 2] = $63; + $k$055 = $k$055 + 1 | 0; + if (($k$055 | 0) >= ($wk_max$159 | 0)) { + $80 = $63; + break; + } else $wk$056 = $wk$056 + 4 | 0; + } + } else $80 = $63; + } else { + HEAP16[$pnt2$367 >> 1] = $60; + if (($60 | 0) < ($63 | 0) & ($wk_max$159 | 0) > 0) { + $k$152 = 0; + $wk$153 = $16; + while (1) { + if ((HEAP32[$wk$153 >> 2] | 0) == ($63 | 0)) HEAP32[$wk$153 >> 2] = $60; + $k$152 = $k$152 + 1 | 0; + if (($k$152 | 0) >= ($wk_max$159 | 0)) { + $80 = $60; + break; + } else $wk$153 = $wk$153 + 4 | 0; + } + } else $80 = $60; + } + $82 = ($80 << 16 >> 16) * 7 | 0; + $84 = $labelInfo + 1310736 + ($82 + -7 << 2) | 0; + HEAP32[$84 >> 2] = (HEAP32[$84 >> 2] | 0) + 1; + $88 = $labelInfo + 1310736 + ($82 + -6 << 2) | 0; + HEAP32[$88 >> 2] = (HEAP32[$88 >> 2] | 0) + $i$264; + $92 = $labelInfo + 1310736 + ($82 + -5 << 2) | 0; + HEAP32[$92 >> 2] = (HEAP32[$92 >> 2] | 0) + $j$075; + HEAP32[$labelInfo + 1310736 + ($82 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $98 = HEAP16[$pnt2$367 + -2 >> 1] | 0; + if ($98 << 16 >> 16 <= 0) { + HEAP16[$pnt2$367 >> 1] = $51; + $138 = $52 * 7 | 0; + $140 = $labelInfo + 1310736 + ($138 + -7 << 2) | 0; + HEAP32[$140 >> 2] = (HEAP32[$140 >> 2] | 0) + 1; + $144 = $labelInfo + 1310736 + ($138 + -6 << 2) | 0; + HEAP32[$144 >> 2] = (HEAP32[$144 >> 2] | 0) + $i$264; + $148 = $labelInfo + 1310736 + ($138 + -5 << 2) | 0; + HEAP32[$148 >> 2] = (HEAP32[$148 >> 2] | 0) + $j$075; + $152 = $labelInfo + 1310736 + ($138 + -4 << 2) | 0; + if ((HEAP32[$152 >> 2] | 0) > ($i$264 | 0)) HEAP32[$152 >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($138 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $103 = HEAP32[$labelInfo + 1179664 + ($52 + -1 << 2) >> 2] | 0; + $106 = HEAP32[$labelInfo + 1179664 + (($98 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($103 | 0) > ($106 | 0)) { + HEAP16[$pnt2$367 >> 1] = $106; + if (($wk_max$159 | 0) > 0) { + $k$248 = 0; + $wk$249 = $16; + while (1) { + if ((HEAP32[$wk$249 >> 2] | 0) == ($103 | 0)) HEAP32[$wk$249 >> 2] = $106; + $k$248 = $k$248 + 1 | 0; + if (($k$248 | 0) >= ($wk_max$159 | 0)) { + $123 = $106; + break; + } else $wk$249 = $wk$249 + 4 | 0; + } + } else $123 = $106; + } else { + HEAP16[$pnt2$367 >> 1] = $103; + if (($103 | 0) < ($106 | 0) & ($wk_max$159 | 0) > 0) { + $k$345 = 0; + $wk$346 = $16; + while (1) { + if ((HEAP32[$wk$346 >> 2] | 0) == ($106 | 0)) HEAP32[$wk$346 >> 2] = $103; + $k$345 = $k$345 + 1 | 0; + if (($k$345 | 0) >= ($wk_max$159 | 0)) { + $123 = $103; + break; + } else $wk$346 = $wk$346 + 4 | 0; + } + } else $123 = $103; + } + $125 = ($123 << 16 >> 16) * 7 | 0; + $127 = $labelInfo + 1310736 + ($125 + -7 << 2) | 0; + HEAP32[$127 >> 2] = (HEAP32[$127 >> 2] | 0) + 1; + $131 = $labelInfo + 1310736 + ($125 + -6 << 2) | 0; + HEAP32[$131 >> 2] = (HEAP32[$131 >> 2] | 0) + $i$264; + $135 = $labelInfo + 1310736 + ($125 + -5 << 2) | 0; + HEAP32[$135 >> 2] = (HEAP32[$135 >> 2] | 0) + $j$075; + $wk_max$2 = $wk_max$159; + } else { + HEAP16[$pnt2$367 >> 1] = 0; + HEAP8[$dpnt$166 >> 0] = 0; + $wk_max$2 = $wk_max$159; + } while (0); + $i$264 = $i$264 + 1 | 0; + $217 = $pnt$168 + 2 | 0; + $218 = $pnt2$367 + 2 | 0; + $219 = $dpnt$166 + 1 | 0; + if (($i$264 | 0) >= ($9 | 0)) { + $dpnt$1$lcssa = $219; + $pnt$1$lcssa = $217; + $pnt2$3$lcssa = $218; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $dpnt$166 = $219; + $pnt$168 = $217; + $pnt2$367 = $218; + $wk_max$159 = $wk_max$2; + } + } + } else { + $dpnt$1$lcssa = $dpnt$077; + $pnt$1$lcssa = $pnt$079; + $pnt2$3$lcssa = $pnt2$278; + $wk_max$1$lcssa = $wk_max$074; + } + $j$075 = $j$075 + 1 | 0; + if (($j$075 | 0) >= ($1 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $dpnt$077 = $dpnt$1$lcssa + 2 | 0; + $pnt$079 = $pnt$1$lcssa + 4 | 0; + $pnt2$278 = $pnt2$3$lcssa + 4 | 0; + $wk_max$074 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $226 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$341 = 1; + $j$142 = 1; + $wk$443 = $16; + while (1) { + $228 = HEAP32[$wk$443 >> 2] | 0; + if (($228 | 0) == ($i$341 | 0)) { + $234 = $j$142; + $j$2 = $j$142 + 1 | 0; + } else { + $234 = HEAP32[$labelInfo + 1179664 + ($228 + -1 << 2) >> 2] | 0; + $j$2 = $j$142; + } + HEAP32[$wk$443 >> 2] = $234; + if (($i$341 | 0) < ($wk_max$0$lcssa | 0)) { + $i$341 = $i$341 + 1 | 0; + $j$142 = $j$2; + $wk$443 = $wk$443 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $238 = $labelInfo + 8 | 0; + $239 = $j$1$lcssa + -1 | 0; + HEAP32[$238 >> 2] = $239; + if (!$239) $$0 = 0; else { + _memset($226 | 0, 0, $239 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $239 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$439 = 0; + do { + $246 = $i$439 << 2; + HEAP32[$labelInfo + 131084 + ($246 << 2) >> 2] = $xsize; + HEAP32[$labelInfo + 131084 + (($246 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($246 | 2) << 2) >> 2] = $ysize; + HEAP32[$labelInfo + 131084 + (($246 | 3) << 2) >> 2] = 0; + $i$439 = $i$439 + 1 | 0; + } while (($i$439 | 0) < (HEAP32[$238 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$537 = 0; + do { + $260 = (HEAP32[$labelInfo + 1179664 + ($i$537 << 2) >> 2] | 0) + -1 | 0; + $261 = $i$537 * 7 | 0; + $264 = $labelInfo + 12 + ($260 << 2) | 0; + HEAP32[$264 >> 2] = (HEAP32[$264 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($261 << 2) >> 2] | 0); + $271 = $260 << 1; + $272 = $labelInfo + 655376 + ($271 << 3) | 0; + HEAPF64[$272 >> 3] = +HEAPF64[$272 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($261 + 1 << 2) >> 2] | 0); + $280 = $labelInfo + 655376 + (($271 | 1) << 3) | 0; + HEAPF64[$280 >> 3] = +HEAPF64[$280 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($261 + 2 << 2) >> 2] | 0); + $283 = $260 << 2; + $284 = $labelInfo + 131084 + ($283 << 2) | 0; + $288 = HEAP32[$labelInfo + 1310736 + ($261 + 3 << 2) >> 2] | 0; + if ((HEAP32[$284 >> 2] | 0) > ($288 | 0)) HEAP32[$284 >> 2] = $288; + $291 = $labelInfo + 131084 + (($283 | 1) << 2) | 0; + $295 = HEAP32[$labelInfo + 1310736 + ($261 + 4 << 2) >> 2] | 0; + if ((HEAP32[$291 >> 2] | 0) < ($295 | 0)) HEAP32[$291 >> 2] = $295; + $298 = $labelInfo + 131084 + (($283 | 2) << 2) | 0; + $302 = HEAP32[$labelInfo + 1310736 + ($261 + 5 << 2) >> 2] | 0; + if ((HEAP32[$298 >> 2] | 0) > ($302 | 0)) HEAP32[$298 >> 2] = $302; + $305 = $labelInfo + 131084 + (($283 | 3) << 2) | 0; + $309 = HEAP32[$labelInfo + 1310736 + ($261 + 6 << 2) >> 2] | 0; + if ((HEAP32[$305 >> 2] | 0) < ($309 | 0)) HEAP32[$305 >> 2] = $309; + $i$537 = $i$537 + 1 | 0; + } while (($i$537 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$238 >> 2] | 0) > 0) { + $i$636 = 0; + do { + $313 = $labelInfo + 12 + ($i$636 << 2) | 0; + $316 = $i$636 << 1; + $317 = $labelInfo + 655376 + ($316 << 3) | 0; + HEAPF64[$317 >> 3] = +HEAPF64[$317 >> 3] / +(HEAP32[$313 >> 2] | 0); + $323 = $labelInfo + 655376 + (($316 | 1) << 3) | 0; + HEAPF64[$323 >> 3] = +HEAPF64[$323 >> 3] / +(HEAP32[$313 >> 2] | 0); + $i$636 = $i$636 + 1 | 0; + } while (($i$636 | 0) < (HEAP32[$238 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubEBRCY($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $0 = 0, $1 = 0, $103 = 0, $106 = 0, $123 = 0, $125 = 0, $127 = 0, $131 = 0, $135 = 0, $138 = 0, $140 = 0, $144 = 0, $148 = 0, $152 = 0, $157 = 0, $159 = 0, $16 = 0, $163 = 0, $167 = 0, $17 = 0, $171 = 0, $177 = 0, $18 = 0, $180 = 0, $182 = 0, $186 = 0, $190 = 0, $194 = 0, $197 = 0, $202 = 0, $217 = 0, $218 = 0, $219 = 0, $226 = 0, $228 = 0, $234 = 0, $238 = 0, $239 = 0, $246 = 0, $26 = 0, $260 = 0, $261 = 0, $264 = 0, $271 = 0, $272 = 0, $280 = 0, $283 = 0, $284 = 0, $288 = 0, $291 = 0, $295 = 0, $298 = 0, $302 = 0, $305 = 0, $309 = 0, $313 = 0, $316 = 0, $317 = 0, $32 = 0, $323 = 0, $35 = 0, $37 = 0, $41 = 0, $45 = 0, $51 = 0, $52 = 0, $55 = 0, $56 = 0, $57 = 0, $60 = 0, $63 = 0, $80 = 0, $82 = 0, $84 = 0, $88 = 0, $9 = 0, $92 = 0, $98 = 0, $dpnt$077 = 0, $dpnt$1$lcssa = 0, $dpnt$166 = 0, $i$088 = 0, $i$182 = 0, $i$264 = 0, $i$341 = 0, $i$439 = 0, $i$537 = 0, $i$636 = 0, $j$075 = 0, $j$1$lcssa = 0, $j$142 = 0, $j$2 = 0, $k$055 = 0, $k$152 = 0, $k$248 = 0, $k$345 = 0, $pnt$079 = 0, $pnt$1$lcssa = 0, $pnt$168 = 0, $pnt1$090 = 0, $pnt1$184 = 0, $pnt2$089 = 0, $pnt2$183 = 0, $pnt2$278 = 0, $pnt2$3$lcssa = 0, $pnt2$367 = 0, $vararg_buffer = 0, $wk$056 = 0, $wk$153 = 0, $wk$249 = 0, $wk$346 = 0, $wk$443 = 0, $wk_max$0$lcssa = 0, $wk_max$074 = 0, $wk_max$1$lcssa = 0, $wk_max$159 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = HEAP32[$labelInfo >> 2] | 0; + $1 = $ysize + -1 | 0; + if (($xsize | 0) > 0) { + $i$088 = 0; + $pnt1$090 = $0; + $pnt2$089 = $0 + ((Math_imul($1, $xsize) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$089 >> 1] = 0; + HEAP16[$pnt1$090 >> 1] = 0; + $i$088 = $i$088 + 1 | 0; + if (($i$088 | 0) >= ($xsize | 0)) break; else { + $pnt1$090 = $pnt1$090 + 2 | 0; + $pnt2$089 = $pnt2$089 + 2 | 0; + } + } + } + $9 = $xsize + -1 | 0; + if (($ysize | 0) > 0) { + $i$182 = 0; + $pnt1$184 = $0; + $pnt2$183 = $0 + ($9 << 1) | 0; + while (1) { + HEAP16[$pnt2$183 >> 1] = 0; + HEAP16[$pnt1$184 >> 1] = 0; + $i$182 = $i$182 + 1 | 0; + if (($i$182 | 0) >= ($ysize | 0)) break; else { + $pnt1$184 = $pnt1$184 + ($xsize << 1) | 0; + $pnt2$183 = $pnt2$183 + ($xsize << 1) | 0; + } + } + } + $16 = $labelInfo + 1179664 | 0; + $17 = $xsize + 1 | 0; + $18 = 0 - $xsize | 0; + $$sum = 1 - $xsize | 0; + $$sum1 = ~$xsize; + L11 : do if (($1 | 0) > 1) { + $26 = ($9 | 0) > 1; + $dpnt$077 = (HEAP32[$labelInfo + 4 >> 2] | 0) + $17 | 0; + $j$075 = 1; + $pnt$079 = $image + ($17 << 1) | 0; + $pnt2$278 = $0 + ($17 << 1) | 0; + $wk_max$074 = 0; + L13 : while (1) { + if ($26) { + $dpnt$166 = $dpnt$077; + $i$264 = 1; + $pnt$168 = $pnt$079; + $pnt2$367 = $pnt2$278; + $wk_max$159 = $wk_max$074; + while (1) { + do if ((HEAPU8[$pnt$168 + 1 >> 0] | 0 | 0) > ($labelingThresh | 0)) { + HEAP16[$pnt2$367 >> 1] = 0; + HEAP8[$dpnt$166 >> 0] = 0; + $wk_max$2 = $wk_max$159; + } else { + HEAP8[$dpnt$166 >> 0] = -1; + $32 = HEAP16[$pnt2$367 + ($18 << 1) >> 1] | 0; + if ($32 << 16 >> 16 > 0) { + HEAP16[$pnt2$367 >> 1] = $32; + $35 = ($32 << 16 >> 16) * 7 | 0; + $37 = $labelInfo + 1310736 + ($35 + -7 << 2) | 0; + HEAP32[$37 >> 2] = (HEAP32[$37 >> 2] | 0) + 1; + $41 = $labelInfo + 1310736 + ($35 + -6 << 2) | 0; + HEAP32[$41 >> 2] = (HEAP32[$41 >> 2] | 0) + $i$264; + $45 = $labelInfo + 1310736 + ($35 + -5 << 2) | 0; + HEAP32[$45 >> 2] = (HEAP32[$45 >> 2] | 0) + $j$075; + HEAP32[$labelInfo + 1310736 + ($35 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $51 = HEAP16[$pnt2$367 + ($$sum << 1) >> 1] | 0; + $52 = $51 << 16 >> 16; + $55 = HEAP16[$pnt2$367 + ($$sum1 << 1) >> 1] | 0; + $56 = $55 << 16 >> 16; + $57 = $55 << 16 >> 16 > 0; + if ($51 << 16 >> 16 <= 0) { + if ($57) { + HEAP16[$pnt2$367 >> 1] = $55; + $157 = $56 * 7 | 0; + $159 = $labelInfo + 1310736 + ($157 + -7 << 2) | 0; + HEAP32[$159 >> 2] = (HEAP32[$159 >> 2] | 0) + 1; + $163 = $labelInfo + 1310736 + ($157 + -6 << 2) | 0; + HEAP32[$163 >> 2] = (HEAP32[$163 >> 2] | 0) + $i$264; + $167 = $labelInfo + 1310736 + ($157 + -5 << 2) | 0; + HEAP32[$167 >> 2] = (HEAP32[$167 >> 2] | 0) + $j$075; + $171 = $labelInfo + 1310736 + ($157 + -3 << 2) | 0; + if ((HEAP32[$171 >> 2] | 0) < ($i$264 | 0)) HEAP32[$171 >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($157 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $177 = HEAP16[$pnt2$367 + -2 >> 1] | 0; + if ($177 << 16 >> 16 > 0) { + HEAP16[$pnt2$367 >> 1] = $177; + $180 = ($177 << 16 >> 16) * 7 | 0; + $182 = $labelInfo + 1310736 + ($180 + -7 << 2) | 0; + HEAP32[$182 >> 2] = (HEAP32[$182 >> 2] | 0) + 1; + $186 = $labelInfo + 1310736 + ($180 + -6 << 2) | 0; + HEAP32[$186 >> 2] = (HEAP32[$186 >> 2] | 0) + $i$264; + $190 = $labelInfo + 1310736 + ($180 + -5 << 2) | 0; + HEAP32[$190 >> 2] = (HEAP32[$190 >> 2] | 0) + $j$075; + $194 = $labelInfo + 1310736 + ($180 + -3 << 2) | 0; + if ((HEAP32[$194 >> 2] | 0) >= ($i$264 | 0)) { + $wk_max$2 = $wk_max$159; + break; + } + HEAP32[$194 >> 2] = $i$264; + $wk_max$2 = $wk_max$159; + break; + } else { + $197 = $wk_max$159 + 1 | 0; + if (($wk_max$159 | 0) > 32767) break L13; + HEAP16[$pnt2$367 >> 1] = $197; + HEAP32[$labelInfo + 1179664 + ($wk_max$159 << 2) >> 2] = $197 << 16 >> 16; + $202 = $wk_max$159 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($202 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($202 + 1 << 2) >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($202 + 2 << 2) >> 2] = $j$075; + HEAP32[$labelInfo + 1310736 + ($202 + 3 << 2) >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($202 + 4 << 2) >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($202 + 5 << 2) >> 2] = $j$075; + HEAP32[$labelInfo + 1310736 + ($202 + 6 << 2) >> 2] = $j$075; + $wk_max$2 = $197; + break; + } + } + if ($57) { + $60 = HEAP32[$labelInfo + 1179664 + ($52 + -1 << 2) >> 2] | 0; + $63 = HEAP32[$labelInfo + 1179664 + ($56 + -1 << 2) >> 2] | 0; + if (($60 | 0) > ($63 | 0)) { + HEAP16[$pnt2$367 >> 1] = $63; + if (($wk_max$159 | 0) > 0) { + $k$055 = 0; + $wk$056 = $16; + while (1) { + if ((HEAP32[$wk$056 >> 2] | 0) == ($60 | 0)) HEAP32[$wk$056 >> 2] = $63; + $k$055 = $k$055 + 1 | 0; + if (($k$055 | 0) >= ($wk_max$159 | 0)) { + $80 = $63; + break; + } else $wk$056 = $wk$056 + 4 | 0; + } + } else $80 = $63; + } else { + HEAP16[$pnt2$367 >> 1] = $60; + if (($60 | 0) < ($63 | 0) & ($wk_max$159 | 0) > 0) { + $k$152 = 0; + $wk$153 = $16; + while (1) { + if ((HEAP32[$wk$153 >> 2] | 0) == ($63 | 0)) HEAP32[$wk$153 >> 2] = $60; + $k$152 = $k$152 + 1 | 0; + if (($k$152 | 0) >= ($wk_max$159 | 0)) { + $80 = $60; + break; + } else $wk$153 = $wk$153 + 4 | 0; + } + } else $80 = $60; + } + $82 = ($80 << 16 >> 16) * 7 | 0; + $84 = $labelInfo + 1310736 + ($82 + -7 << 2) | 0; + HEAP32[$84 >> 2] = (HEAP32[$84 >> 2] | 0) + 1; + $88 = $labelInfo + 1310736 + ($82 + -6 << 2) | 0; + HEAP32[$88 >> 2] = (HEAP32[$88 >> 2] | 0) + $i$264; + $92 = $labelInfo + 1310736 + ($82 + -5 << 2) | 0; + HEAP32[$92 >> 2] = (HEAP32[$92 >> 2] | 0) + $j$075; + HEAP32[$labelInfo + 1310736 + ($82 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $98 = HEAP16[$pnt2$367 + -2 >> 1] | 0; + if ($98 << 16 >> 16 <= 0) { + HEAP16[$pnt2$367 >> 1] = $51; + $138 = $52 * 7 | 0; + $140 = $labelInfo + 1310736 + ($138 + -7 << 2) | 0; + HEAP32[$140 >> 2] = (HEAP32[$140 >> 2] | 0) + 1; + $144 = $labelInfo + 1310736 + ($138 + -6 << 2) | 0; + HEAP32[$144 >> 2] = (HEAP32[$144 >> 2] | 0) + $i$264; + $148 = $labelInfo + 1310736 + ($138 + -5 << 2) | 0; + HEAP32[$148 >> 2] = (HEAP32[$148 >> 2] | 0) + $j$075; + $152 = $labelInfo + 1310736 + ($138 + -4 << 2) | 0; + if ((HEAP32[$152 >> 2] | 0) > ($i$264 | 0)) HEAP32[$152 >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($138 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $103 = HEAP32[$labelInfo + 1179664 + ($52 + -1 << 2) >> 2] | 0; + $106 = HEAP32[$labelInfo + 1179664 + (($98 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($103 | 0) > ($106 | 0)) { + HEAP16[$pnt2$367 >> 1] = $106; + if (($wk_max$159 | 0) > 0) { + $k$248 = 0; + $wk$249 = $16; + while (1) { + if ((HEAP32[$wk$249 >> 2] | 0) == ($103 | 0)) HEAP32[$wk$249 >> 2] = $106; + $k$248 = $k$248 + 1 | 0; + if (($k$248 | 0) >= ($wk_max$159 | 0)) { + $123 = $106; + break; + } else $wk$249 = $wk$249 + 4 | 0; + } + } else $123 = $106; + } else { + HEAP16[$pnt2$367 >> 1] = $103; + if (($103 | 0) < ($106 | 0) & ($wk_max$159 | 0) > 0) { + $k$345 = 0; + $wk$346 = $16; + while (1) { + if ((HEAP32[$wk$346 >> 2] | 0) == ($106 | 0)) HEAP32[$wk$346 >> 2] = $103; + $k$345 = $k$345 + 1 | 0; + if (($k$345 | 0) >= ($wk_max$159 | 0)) { + $123 = $103; + break; + } else $wk$346 = $wk$346 + 4 | 0; + } + } else $123 = $103; + } + $125 = ($123 << 16 >> 16) * 7 | 0; + $127 = $labelInfo + 1310736 + ($125 + -7 << 2) | 0; + HEAP32[$127 >> 2] = (HEAP32[$127 >> 2] | 0) + 1; + $131 = $labelInfo + 1310736 + ($125 + -6 << 2) | 0; + HEAP32[$131 >> 2] = (HEAP32[$131 >> 2] | 0) + $i$264; + $135 = $labelInfo + 1310736 + ($125 + -5 << 2) | 0; + HEAP32[$135 >> 2] = (HEAP32[$135 >> 2] | 0) + $j$075; + $wk_max$2 = $wk_max$159; + } while (0); + $i$264 = $i$264 + 1 | 0; + $217 = $pnt$168 + 2 | 0; + $218 = $pnt2$367 + 2 | 0; + $219 = $dpnt$166 + 1 | 0; + if (($i$264 | 0) >= ($9 | 0)) { + $dpnt$1$lcssa = $219; + $pnt$1$lcssa = $217; + $pnt2$3$lcssa = $218; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $dpnt$166 = $219; + $pnt$168 = $217; + $pnt2$367 = $218; + $wk_max$159 = $wk_max$2; + } + } + } else { + $dpnt$1$lcssa = $dpnt$077; + $pnt$1$lcssa = $pnt$079; + $pnt2$3$lcssa = $pnt2$278; + $wk_max$1$lcssa = $wk_max$074; + } + $j$075 = $j$075 + 1 | 0; + if (($j$075 | 0) >= ($1 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $dpnt$077 = $dpnt$1$lcssa + 2 | 0; + $pnt$079 = $pnt$1$lcssa + 4 | 0; + $pnt2$278 = $pnt2$3$lcssa + 4 | 0; + $wk_max$074 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $226 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$341 = 1; + $j$142 = 1; + $wk$443 = $16; + while (1) { + $228 = HEAP32[$wk$443 >> 2] | 0; + if (($228 | 0) == ($i$341 | 0)) { + $234 = $j$142; + $j$2 = $j$142 + 1 | 0; + } else { + $234 = HEAP32[$labelInfo + 1179664 + ($228 + -1 << 2) >> 2] | 0; + $j$2 = $j$142; + } + HEAP32[$wk$443 >> 2] = $234; + if (($i$341 | 0) < ($wk_max$0$lcssa | 0)) { + $i$341 = $i$341 + 1 | 0; + $j$142 = $j$2; + $wk$443 = $wk$443 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $238 = $labelInfo + 8 | 0; + $239 = $j$1$lcssa + -1 | 0; + HEAP32[$238 >> 2] = $239; + if (!$239) $$0 = 0; else { + _memset($226 | 0, 0, $239 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $239 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$439 = 0; + do { + $246 = $i$439 << 2; + HEAP32[$labelInfo + 131084 + ($246 << 2) >> 2] = $xsize; + HEAP32[$labelInfo + 131084 + (($246 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($246 | 2) << 2) >> 2] = $ysize; + HEAP32[$labelInfo + 131084 + (($246 | 3) << 2) >> 2] = 0; + $i$439 = $i$439 + 1 | 0; + } while (($i$439 | 0) < (HEAP32[$238 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$537 = 0; + do { + $260 = (HEAP32[$labelInfo + 1179664 + ($i$537 << 2) >> 2] | 0) + -1 | 0; + $261 = $i$537 * 7 | 0; + $264 = $labelInfo + 12 + ($260 << 2) | 0; + HEAP32[$264 >> 2] = (HEAP32[$264 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($261 << 2) >> 2] | 0); + $271 = $260 << 1; + $272 = $labelInfo + 655376 + ($271 << 3) | 0; + HEAPF64[$272 >> 3] = +HEAPF64[$272 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($261 + 1 << 2) >> 2] | 0); + $280 = $labelInfo + 655376 + (($271 | 1) << 3) | 0; + HEAPF64[$280 >> 3] = +HEAPF64[$280 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($261 + 2 << 2) >> 2] | 0); + $283 = $260 << 2; + $284 = $labelInfo + 131084 + ($283 << 2) | 0; + $288 = HEAP32[$labelInfo + 1310736 + ($261 + 3 << 2) >> 2] | 0; + if ((HEAP32[$284 >> 2] | 0) > ($288 | 0)) HEAP32[$284 >> 2] = $288; + $291 = $labelInfo + 131084 + (($283 | 1) << 2) | 0; + $295 = HEAP32[$labelInfo + 1310736 + ($261 + 4 << 2) >> 2] | 0; + if ((HEAP32[$291 >> 2] | 0) < ($295 | 0)) HEAP32[$291 >> 2] = $295; + $298 = $labelInfo + 131084 + (($283 | 2) << 2) | 0; + $302 = HEAP32[$labelInfo + 1310736 + ($261 + 5 << 2) >> 2] | 0; + if ((HEAP32[$298 >> 2] | 0) > ($302 | 0)) HEAP32[$298 >> 2] = $302; + $305 = $labelInfo + 131084 + (($283 | 3) << 2) | 0; + $309 = HEAP32[$labelInfo + 1310736 + ($261 + 6 << 2) >> 2] | 0; + if ((HEAP32[$305 >> 2] | 0) < ($309 | 0)) HEAP32[$305 >> 2] = $309; + $i$537 = $i$537 + 1 | 0; + } while (($i$537 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$238 >> 2] | 0) > 0) { + $i$636 = 0; + do { + $313 = $labelInfo + 12 + ($i$636 << 2) | 0; + $316 = $i$636 << 1; + $317 = $labelInfo + 655376 + ($316 << 3) | 0; + HEAPF64[$317 >> 3] = +HEAPF64[$317 >> 3] / +(HEAP32[$313 >> 2] | 0); + $323 = $labelInfo + 655376 + (($316 | 1) << 3) | 0; + HEAPF64[$323 >> 3] = +HEAPF64[$323 >> 3] / +(HEAP32[$313 >> 2] | 0); + $i$636 = $i$636 + 1 | 0; + } while (($i$636 | 0) < (HEAP32[$238 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubEWRYC($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $0 = 0, $1 = 0, $102 = 0, $105 = 0, $122 = 0, $124 = 0, $126 = 0, $130 = 0, $134 = 0, $137 = 0, $139 = 0, $143 = 0, $147 = 0, $151 = 0, $156 = 0, $158 = 0, $16 = 0, $162 = 0, $166 = 0, $17 = 0, $170 = 0, $176 = 0, $179 = 0, $18 = 0, $181 = 0, $185 = 0, $189 = 0, $193 = 0, $196 = 0, $201 = 0, $216 = 0, $217 = 0, $218 = 0, $225 = 0, $227 = 0, $233 = 0, $237 = 0, $238 = 0, $245 = 0, $259 = 0, $26 = 0, $260 = 0, $263 = 0, $270 = 0, $271 = 0, $279 = 0, $282 = 0, $283 = 0, $287 = 0, $290 = 0, $294 = 0, $297 = 0, $301 = 0, $304 = 0, $308 = 0, $31 = 0, $312 = 0, $315 = 0, $316 = 0, $322 = 0, $34 = 0, $36 = 0, $40 = 0, $44 = 0, $50 = 0, $51 = 0, $54 = 0, $55 = 0, $56 = 0, $59 = 0, $62 = 0, $79 = 0, $81 = 0, $83 = 0, $87 = 0, $9 = 0, $91 = 0, $97 = 0, $dpnt$077 = 0, $dpnt$1$lcssa = 0, $dpnt$166 = 0, $i$088 = 0, $i$182 = 0, $i$264 = 0, $i$341 = 0, $i$439 = 0, $i$537 = 0, $i$636 = 0, $j$075 = 0, $j$1$lcssa = 0, $j$142 = 0, $j$2 = 0, $k$055 = 0, $k$152 = 0, $k$248 = 0, $k$345 = 0, $pnt$079 = 0, $pnt$1$lcssa = 0, $pnt$168 = 0, $pnt1$090 = 0, $pnt1$184 = 0, $pnt2$089 = 0, $pnt2$183 = 0, $pnt2$278 = 0, $pnt2$3$lcssa = 0, $pnt2$367 = 0, $vararg_buffer = 0, $wk$056 = 0, $wk$153 = 0, $wk$249 = 0, $wk$346 = 0, $wk$443 = 0, $wk_max$0$lcssa = 0, $wk_max$074 = 0, $wk_max$1$lcssa = 0, $wk_max$159 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = HEAP32[$labelInfo >> 2] | 0; + $1 = $ysize + -1 | 0; + if (($xsize | 0) > 0) { + $i$088 = 0; + $pnt1$090 = $0; + $pnt2$089 = $0 + ((Math_imul($1, $xsize) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$089 >> 1] = 0; + HEAP16[$pnt1$090 >> 1] = 0; + $i$088 = $i$088 + 1 | 0; + if (($i$088 | 0) >= ($xsize | 0)) break; else { + $pnt1$090 = $pnt1$090 + 2 | 0; + $pnt2$089 = $pnt2$089 + 2 | 0; + } + } + } + $9 = $xsize + -1 | 0; + if (($ysize | 0) > 0) { + $i$182 = 0; + $pnt1$184 = $0; + $pnt2$183 = $0 + ($9 << 1) | 0; + while (1) { + HEAP16[$pnt2$183 >> 1] = 0; + HEAP16[$pnt1$184 >> 1] = 0; + $i$182 = $i$182 + 1 | 0; + if (($i$182 | 0) >= ($ysize | 0)) break; else { + $pnt1$184 = $pnt1$184 + ($xsize << 1) | 0; + $pnt2$183 = $pnt2$183 + ($xsize << 1) | 0; + } + } + } + $16 = $labelInfo + 1179664 | 0; + $17 = $xsize + 1 | 0; + $18 = 0 - $xsize | 0; + $$sum = 1 - $xsize | 0; + $$sum1 = ~$xsize; + L11 : do if (($1 | 0) > 1) { + $26 = ($9 | 0) > 1; + $dpnt$077 = (HEAP32[$labelInfo + 4 >> 2] | 0) + $17 | 0; + $j$075 = 1; + $pnt$079 = $image + ($17 << 1) | 0; + $pnt2$278 = $0 + ($17 << 1) | 0; + $wk_max$074 = 0; + L13 : while (1) { + if ($26) { + $dpnt$166 = $dpnt$077; + $i$264 = 1; + $pnt$168 = $pnt$079; + $pnt2$367 = $pnt2$278; + $wk_max$159 = $wk_max$074; + while (1) { + do if ((HEAPU8[$pnt$168 >> 0] | 0 | 0) > ($labelingThresh | 0)) { + HEAP8[$dpnt$166 >> 0] = -1; + $31 = HEAP16[$pnt2$367 + ($18 << 1) >> 1] | 0; + if ($31 << 16 >> 16 > 0) { + HEAP16[$pnt2$367 >> 1] = $31; + $34 = ($31 << 16 >> 16) * 7 | 0; + $36 = $labelInfo + 1310736 + ($34 + -7 << 2) | 0; + HEAP32[$36 >> 2] = (HEAP32[$36 >> 2] | 0) + 1; + $40 = $labelInfo + 1310736 + ($34 + -6 << 2) | 0; + HEAP32[$40 >> 2] = (HEAP32[$40 >> 2] | 0) + $i$264; + $44 = $labelInfo + 1310736 + ($34 + -5 << 2) | 0; + HEAP32[$44 >> 2] = (HEAP32[$44 >> 2] | 0) + $j$075; + HEAP32[$labelInfo + 1310736 + ($34 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $50 = HEAP16[$pnt2$367 + ($$sum << 1) >> 1] | 0; + $51 = $50 << 16 >> 16; + $54 = HEAP16[$pnt2$367 + ($$sum1 << 1) >> 1] | 0; + $55 = $54 << 16 >> 16; + $56 = $54 << 16 >> 16 > 0; + if ($50 << 16 >> 16 <= 0) { + if ($56) { + HEAP16[$pnt2$367 >> 1] = $54; + $156 = $55 * 7 | 0; + $158 = $labelInfo + 1310736 + ($156 + -7 << 2) | 0; + HEAP32[$158 >> 2] = (HEAP32[$158 >> 2] | 0) + 1; + $162 = $labelInfo + 1310736 + ($156 + -6 << 2) | 0; + HEAP32[$162 >> 2] = (HEAP32[$162 >> 2] | 0) + $i$264; + $166 = $labelInfo + 1310736 + ($156 + -5 << 2) | 0; + HEAP32[$166 >> 2] = (HEAP32[$166 >> 2] | 0) + $j$075; + $170 = $labelInfo + 1310736 + ($156 + -3 << 2) | 0; + if ((HEAP32[$170 >> 2] | 0) < ($i$264 | 0)) HEAP32[$170 >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($156 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $176 = HEAP16[$pnt2$367 + -2 >> 1] | 0; + if ($176 << 16 >> 16 > 0) { + HEAP16[$pnt2$367 >> 1] = $176; + $179 = ($176 << 16 >> 16) * 7 | 0; + $181 = $labelInfo + 1310736 + ($179 + -7 << 2) | 0; + HEAP32[$181 >> 2] = (HEAP32[$181 >> 2] | 0) + 1; + $185 = $labelInfo + 1310736 + ($179 + -6 << 2) | 0; + HEAP32[$185 >> 2] = (HEAP32[$185 >> 2] | 0) + $i$264; + $189 = $labelInfo + 1310736 + ($179 + -5 << 2) | 0; + HEAP32[$189 >> 2] = (HEAP32[$189 >> 2] | 0) + $j$075; + $193 = $labelInfo + 1310736 + ($179 + -3 << 2) | 0; + if ((HEAP32[$193 >> 2] | 0) >= ($i$264 | 0)) { + $wk_max$2 = $wk_max$159; + break; + } + HEAP32[$193 >> 2] = $i$264; + $wk_max$2 = $wk_max$159; + break; + } else { + $196 = $wk_max$159 + 1 | 0; + if (($wk_max$159 | 0) > 32767) break L13; + HEAP16[$pnt2$367 >> 1] = $196; + HEAP32[$labelInfo + 1179664 + ($wk_max$159 << 2) >> 2] = $196 << 16 >> 16; + $201 = $wk_max$159 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($201 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($201 + 1 << 2) >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($201 + 2 << 2) >> 2] = $j$075; + HEAP32[$labelInfo + 1310736 + ($201 + 3 << 2) >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($201 + 4 << 2) >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($201 + 5 << 2) >> 2] = $j$075; + HEAP32[$labelInfo + 1310736 + ($201 + 6 << 2) >> 2] = $j$075; + $wk_max$2 = $196; + break; + } + } + if ($56) { + $59 = HEAP32[$labelInfo + 1179664 + ($51 + -1 << 2) >> 2] | 0; + $62 = HEAP32[$labelInfo + 1179664 + ($55 + -1 << 2) >> 2] | 0; + if (($59 | 0) > ($62 | 0)) { + HEAP16[$pnt2$367 >> 1] = $62; + if (($wk_max$159 | 0) > 0) { + $k$055 = 0; + $wk$056 = $16; + while (1) { + if ((HEAP32[$wk$056 >> 2] | 0) == ($59 | 0)) HEAP32[$wk$056 >> 2] = $62; + $k$055 = $k$055 + 1 | 0; + if (($k$055 | 0) >= ($wk_max$159 | 0)) { + $79 = $62; + break; + } else $wk$056 = $wk$056 + 4 | 0; + } + } else $79 = $62; + } else { + HEAP16[$pnt2$367 >> 1] = $59; + if (($59 | 0) < ($62 | 0) & ($wk_max$159 | 0) > 0) { + $k$152 = 0; + $wk$153 = $16; + while (1) { + if ((HEAP32[$wk$153 >> 2] | 0) == ($62 | 0)) HEAP32[$wk$153 >> 2] = $59; + $k$152 = $k$152 + 1 | 0; + if (($k$152 | 0) >= ($wk_max$159 | 0)) { + $79 = $59; + break; + } else $wk$153 = $wk$153 + 4 | 0; + } + } else $79 = $59; + } + $81 = ($79 << 16 >> 16) * 7 | 0; + $83 = $labelInfo + 1310736 + ($81 + -7 << 2) | 0; + HEAP32[$83 >> 2] = (HEAP32[$83 >> 2] | 0) + 1; + $87 = $labelInfo + 1310736 + ($81 + -6 << 2) | 0; + HEAP32[$87 >> 2] = (HEAP32[$87 >> 2] | 0) + $i$264; + $91 = $labelInfo + 1310736 + ($81 + -5 << 2) | 0; + HEAP32[$91 >> 2] = (HEAP32[$91 >> 2] | 0) + $j$075; + HEAP32[$labelInfo + 1310736 + ($81 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $97 = HEAP16[$pnt2$367 + -2 >> 1] | 0; + if ($97 << 16 >> 16 <= 0) { + HEAP16[$pnt2$367 >> 1] = $50; + $137 = $51 * 7 | 0; + $139 = $labelInfo + 1310736 + ($137 + -7 << 2) | 0; + HEAP32[$139 >> 2] = (HEAP32[$139 >> 2] | 0) + 1; + $143 = $labelInfo + 1310736 + ($137 + -6 << 2) | 0; + HEAP32[$143 >> 2] = (HEAP32[$143 >> 2] | 0) + $i$264; + $147 = $labelInfo + 1310736 + ($137 + -5 << 2) | 0; + HEAP32[$147 >> 2] = (HEAP32[$147 >> 2] | 0) + $j$075; + $151 = $labelInfo + 1310736 + ($137 + -4 << 2) | 0; + if ((HEAP32[$151 >> 2] | 0) > ($i$264 | 0)) HEAP32[$151 >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($137 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $102 = HEAP32[$labelInfo + 1179664 + ($51 + -1 << 2) >> 2] | 0; + $105 = HEAP32[$labelInfo + 1179664 + (($97 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($102 | 0) > ($105 | 0)) { + HEAP16[$pnt2$367 >> 1] = $105; + if (($wk_max$159 | 0) > 0) { + $k$248 = 0; + $wk$249 = $16; + while (1) { + if ((HEAP32[$wk$249 >> 2] | 0) == ($102 | 0)) HEAP32[$wk$249 >> 2] = $105; + $k$248 = $k$248 + 1 | 0; + if (($k$248 | 0) >= ($wk_max$159 | 0)) { + $122 = $105; + break; + } else $wk$249 = $wk$249 + 4 | 0; + } + } else $122 = $105; + } else { + HEAP16[$pnt2$367 >> 1] = $102; + if (($102 | 0) < ($105 | 0) & ($wk_max$159 | 0) > 0) { + $k$345 = 0; + $wk$346 = $16; + while (1) { + if ((HEAP32[$wk$346 >> 2] | 0) == ($105 | 0)) HEAP32[$wk$346 >> 2] = $102; + $k$345 = $k$345 + 1 | 0; + if (($k$345 | 0) >= ($wk_max$159 | 0)) { + $122 = $102; + break; + } else $wk$346 = $wk$346 + 4 | 0; + } + } else $122 = $102; + } + $124 = ($122 << 16 >> 16) * 7 | 0; + $126 = $labelInfo + 1310736 + ($124 + -7 << 2) | 0; + HEAP32[$126 >> 2] = (HEAP32[$126 >> 2] | 0) + 1; + $130 = $labelInfo + 1310736 + ($124 + -6 << 2) | 0; + HEAP32[$130 >> 2] = (HEAP32[$130 >> 2] | 0) + $i$264; + $134 = $labelInfo + 1310736 + ($124 + -5 << 2) | 0; + HEAP32[$134 >> 2] = (HEAP32[$134 >> 2] | 0) + $j$075; + $wk_max$2 = $wk_max$159; + } else { + HEAP16[$pnt2$367 >> 1] = 0; + HEAP8[$dpnt$166 >> 0] = 0; + $wk_max$2 = $wk_max$159; + } while (0); + $i$264 = $i$264 + 1 | 0; + $216 = $pnt$168 + 2 | 0; + $217 = $pnt2$367 + 2 | 0; + $218 = $dpnt$166 + 1 | 0; + if (($i$264 | 0) >= ($9 | 0)) { + $dpnt$1$lcssa = $218; + $pnt$1$lcssa = $216; + $pnt2$3$lcssa = $217; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $dpnt$166 = $218; + $pnt$168 = $216; + $pnt2$367 = $217; + $wk_max$159 = $wk_max$2; + } + } + } else { + $dpnt$1$lcssa = $dpnt$077; + $pnt$1$lcssa = $pnt$079; + $pnt2$3$lcssa = $pnt2$278; + $wk_max$1$lcssa = $wk_max$074; + } + $j$075 = $j$075 + 1 | 0; + if (($j$075 | 0) >= ($1 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $dpnt$077 = $dpnt$1$lcssa + 2 | 0; + $pnt$079 = $pnt$1$lcssa + 4 | 0; + $pnt2$278 = $pnt2$3$lcssa + 4 | 0; + $wk_max$074 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $225 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$341 = 1; + $j$142 = 1; + $wk$443 = $16; + while (1) { + $227 = HEAP32[$wk$443 >> 2] | 0; + if (($227 | 0) == ($i$341 | 0)) { + $233 = $j$142; + $j$2 = $j$142 + 1 | 0; + } else { + $233 = HEAP32[$labelInfo + 1179664 + ($227 + -1 << 2) >> 2] | 0; + $j$2 = $j$142; + } + HEAP32[$wk$443 >> 2] = $233; + if (($i$341 | 0) < ($wk_max$0$lcssa | 0)) { + $i$341 = $i$341 + 1 | 0; + $j$142 = $j$2; + $wk$443 = $wk$443 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $237 = $labelInfo + 8 | 0; + $238 = $j$1$lcssa + -1 | 0; + HEAP32[$237 >> 2] = $238; + if (!$238) $$0 = 0; else { + _memset($225 | 0, 0, $238 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $238 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$439 = 0; + do { + $245 = $i$439 << 2; + HEAP32[$labelInfo + 131084 + ($245 << 2) >> 2] = $xsize; + HEAP32[$labelInfo + 131084 + (($245 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($245 | 2) << 2) >> 2] = $ysize; + HEAP32[$labelInfo + 131084 + (($245 | 3) << 2) >> 2] = 0; + $i$439 = $i$439 + 1 | 0; + } while (($i$439 | 0) < (HEAP32[$237 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$537 = 0; + do { + $259 = (HEAP32[$labelInfo + 1179664 + ($i$537 << 2) >> 2] | 0) + -1 | 0; + $260 = $i$537 * 7 | 0; + $263 = $labelInfo + 12 + ($259 << 2) | 0; + HEAP32[$263 >> 2] = (HEAP32[$263 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($260 << 2) >> 2] | 0); + $270 = $259 << 1; + $271 = $labelInfo + 655376 + ($270 << 3) | 0; + HEAPF64[$271 >> 3] = +HEAPF64[$271 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($260 + 1 << 2) >> 2] | 0); + $279 = $labelInfo + 655376 + (($270 | 1) << 3) | 0; + HEAPF64[$279 >> 3] = +HEAPF64[$279 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($260 + 2 << 2) >> 2] | 0); + $282 = $259 << 2; + $283 = $labelInfo + 131084 + ($282 << 2) | 0; + $287 = HEAP32[$labelInfo + 1310736 + ($260 + 3 << 2) >> 2] | 0; + if ((HEAP32[$283 >> 2] | 0) > ($287 | 0)) HEAP32[$283 >> 2] = $287; + $290 = $labelInfo + 131084 + (($282 | 1) << 2) | 0; + $294 = HEAP32[$labelInfo + 1310736 + ($260 + 4 << 2) >> 2] | 0; + if ((HEAP32[$290 >> 2] | 0) < ($294 | 0)) HEAP32[$290 >> 2] = $294; + $297 = $labelInfo + 131084 + (($282 | 2) << 2) | 0; + $301 = HEAP32[$labelInfo + 1310736 + ($260 + 5 << 2) >> 2] | 0; + if ((HEAP32[$297 >> 2] | 0) > ($301 | 0)) HEAP32[$297 >> 2] = $301; + $304 = $labelInfo + 131084 + (($282 | 3) << 2) | 0; + $308 = HEAP32[$labelInfo + 1310736 + ($260 + 6 << 2) >> 2] | 0; + if ((HEAP32[$304 >> 2] | 0) < ($308 | 0)) HEAP32[$304 >> 2] = $308; + $i$537 = $i$537 + 1 | 0; + } while (($i$537 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$237 >> 2] | 0) > 0) { + $i$636 = 0; + do { + $312 = $labelInfo + 12 + ($i$636 << 2) | 0; + $315 = $i$636 << 1; + $316 = $labelInfo + 655376 + ($315 << 3) | 0; + HEAPF64[$316 >> 3] = +HEAPF64[$316 >> 3] / +(HEAP32[$312 >> 2] | 0); + $322 = $labelInfo + 655376 + (($315 | 1) << 3) | 0; + HEAPF64[$322 >> 3] = +HEAPF64[$322 >> 3] / +(HEAP32[$312 >> 2] | 0); + $i$636 = $i$636 + 1 | 0; + } while (($i$636 | 0) < (HEAP32[$237 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubEBRYC($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $0 = 0, $1 = 0, $102 = 0, $105 = 0, $122 = 0, $124 = 0, $126 = 0, $130 = 0, $134 = 0, $137 = 0, $139 = 0, $143 = 0, $147 = 0, $151 = 0, $156 = 0, $158 = 0, $16 = 0, $162 = 0, $166 = 0, $17 = 0, $170 = 0, $176 = 0, $179 = 0, $18 = 0, $181 = 0, $185 = 0, $189 = 0, $193 = 0, $196 = 0, $201 = 0, $216 = 0, $217 = 0, $218 = 0, $225 = 0, $227 = 0, $233 = 0, $237 = 0, $238 = 0, $245 = 0, $259 = 0, $26 = 0, $260 = 0, $263 = 0, $270 = 0, $271 = 0, $279 = 0, $282 = 0, $283 = 0, $287 = 0, $290 = 0, $294 = 0, $297 = 0, $301 = 0, $304 = 0, $308 = 0, $31 = 0, $312 = 0, $315 = 0, $316 = 0, $322 = 0, $34 = 0, $36 = 0, $40 = 0, $44 = 0, $50 = 0, $51 = 0, $54 = 0, $55 = 0, $56 = 0, $59 = 0, $62 = 0, $79 = 0, $81 = 0, $83 = 0, $87 = 0, $9 = 0, $91 = 0, $97 = 0, $dpnt$077 = 0, $dpnt$1$lcssa = 0, $dpnt$166 = 0, $i$088 = 0, $i$182 = 0, $i$264 = 0, $i$341 = 0, $i$439 = 0, $i$537 = 0, $i$636 = 0, $j$075 = 0, $j$1$lcssa = 0, $j$142 = 0, $j$2 = 0, $k$055 = 0, $k$152 = 0, $k$248 = 0, $k$345 = 0, $pnt$079 = 0, $pnt$1$lcssa = 0, $pnt$168 = 0, $pnt1$090 = 0, $pnt1$184 = 0, $pnt2$089 = 0, $pnt2$183 = 0, $pnt2$278 = 0, $pnt2$3$lcssa = 0, $pnt2$367 = 0, $vararg_buffer = 0, $wk$056 = 0, $wk$153 = 0, $wk$249 = 0, $wk$346 = 0, $wk$443 = 0, $wk_max$0$lcssa = 0, $wk_max$074 = 0, $wk_max$1$lcssa = 0, $wk_max$159 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = HEAP32[$labelInfo >> 2] | 0; + $1 = $ysize + -1 | 0; + if (($xsize | 0) > 0) { + $i$088 = 0; + $pnt1$090 = $0; + $pnt2$089 = $0 + ((Math_imul($1, $xsize) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$089 >> 1] = 0; + HEAP16[$pnt1$090 >> 1] = 0; + $i$088 = $i$088 + 1 | 0; + if (($i$088 | 0) >= ($xsize | 0)) break; else { + $pnt1$090 = $pnt1$090 + 2 | 0; + $pnt2$089 = $pnt2$089 + 2 | 0; + } + } + } + $9 = $xsize + -1 | 0; + if (($ysize | 0) > 0) { + $i$182 = 0; + $pnt1$184 = $0; + $pnt2$183 = $0 + ($9 << 1) | 0; + while (1) { + HEAP16[$pnt2$183 >> 1] = 0; + HEAP16[$pnt1$184 >> 1] = 0; + $i$182 = $i$182 + 1 | 0; + if (($i$182 | 0) >= ($ysize | 0)) break; else { + $pnt1$184 = $pnt1$184 + ($xsize << 1) | 0; + $pnt2$183 = $pnt2$183 + ($xsize << 1) | 0; + } + } + } + $16 = $labelInfo + 1179664 | 0; + $17 = $xsize + 1 | 0; + $18 = 0 - $xsize | 0; + $$sum = 1 - $xsize | 0; + $$sum1 = ~$xsize; + L11 : do if (($1 | 0) > 1) { + $26 = ($9 | 0) > 1; + $dpnt$077 = (HEAP32[$labelInfo + 4 >> 2] | 0) + $17 | 0; + $j$075 = 1; + $pnt$079 = $image + ($17 << 1) | 0; + $pnt2$278 = $0 + ($17 << 1) | 0; + $wk_max$074 = 0; + L13 : while (1) { + if ($26) { + $dpnt$166 = $dpnt$077; + $i$264 = 1; + $pnt$168 = $pnt$079; + $pnt2$367 = $pnt2$278; + $wk_max$159 = $wk_max$074; + while (1) { + do if ((HEAPU8[$pnt$168 >> 0] | 0 | 0) > ($labelingThresh | 0)) { + HEAP16[$pnt2$367 >> 1] = 0; + HEAP8[$dpnt$166 >> 0] = 0; + $wk_max$2 = $wk_max$159; + } else { + HEAP8[$dpnt$166 >> 0] = -1; + $31 = HEAP16[$pnt2$367 + ($18 << 1) >> 1] | 0; + if ($31 << 16 >> 16 > 0) { + HEAP16[$pnt2$367 >> 1] = $31; + $34 = ($31 << 16 >> 16) * 7 | 0; + $36 = $labelInfo + 1310736 + ($34 + -7 << 2) | 0; + HEAP32[$36 >> 2] = (HEAP32[$36 >> 2] | 0) + 1; + $40 = $labelInfo + 1310736 + ($34 + -6 << 2) | 0; + HEAP32[$40 >> 2] = (HEAP32[$40 >> 2] | 0) + $i$264; + $44 = $labelInfo + 1310736 + ($34 + -5 << 2) | 0; + HEAP32[$44 >> 2] = (HEAP32[$44 >> 2] | 0) + $j$075; + HEAP32[$labelInfo + 1310736 + ($34 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $50 = HEAP16[$pnt2$367 + ($$sum << 1) >> 1] | 0; + $51 = $50 << 16 >> 16; + $54 = HEAP16[$pnt2$367 + ($$sum1 << 1) >> 1] | 0; + $55 = $54 << 16 >> 16; + $56 = $54 << 16 >> 16 > 0; + if ($50 << 16 >> 16 <= 0) { + if ($56) { + HEAP16[$pnt2$367 >> 1] = $54; + $156 = $55 * 7 | 0; + $158 = $labelInfo + 1310736 + ($156 + -7 << 2) | 0; + HEAP32[$158 >> 2] = (HEAP32[$158 >> 2] | 0) + 1; + $162 = $labelInfo + 1310736 + ($156 + -6 << 2) | 0; + HEAP32[$162 >> 2] = (HEAP32[$162 >> 2] | 0) + $i$264; + $166 = $labelInfo + 1310736 + ($156 + -5 << 2) | 0; + HEAP32[$166 >> 2] = (HEAP32[$166 >> 2] | 0) + $j$075; + $170 = $labelInfo + 1310736 + ($156 + -3 << 2) | 0; + if ((HEAP32[$170 >> 2] | 0) < ($i$264 | 0)) HEAP32[$170 >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($156 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $176 = HEAP16[$pnt2$367 + -2 >> 1] | 0; + if ($176 << 16 >> 16 > 0) { + HEAP16[$pnt2$367 >> 1] = $176; + $179 = ($176 << 16 >> 16) * 7 | 0; + $181 = $labelInfo + 1310736 + ($179 + -7 << 2) | 0; + HEAP32[$181 >> 2] = (HEAP32[$181 >> 2] | 0) + 1; + $185 = $labelInfo + 1310736 + ($179 + -6 << 2) | 0; + HEAP32[$185 >> 2] = (HEAP32[$185 >> 2] | 0) + $i$264; + $189 = $labelInfo + 1310736 + ($179 + -5 << 2) | 0; + HEAP32[$189 >> 2] = (HEAP32[$189 >> 2] | 0) + $j$075; + $193 = $labelInfo + 1310736 + ($179 + -3 << 2) | 0; + if ((HEAP32[$193 >> 2] | 0) >= ($i$264 | 0)) { + $wk_max$2 = $wk_max$159; + break; + } + HEAP32[$193 >> 2] = $i$264; + $wk_max$2 = $wk_max$159; + break; + } else { + $196 = $wk_max$159 + 1 | 0; + if (($wk_max$159 | 0) > 32767) break L13; + HEAP16[$pnt2$367 >> 1] = $196; + HEAP32[$labelInfo + 1179664 + ($wk_max$159 << 2) >> 2] = $196 << 16 >> 16; + $201 = $wk_max$159 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($201 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($201 + 1 << 2) >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($201 + 2 << 2) >> 2] = $j$075; + HEAP32[$labelInfo + 1310736 + ($201 + 3 << 2) >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($201 + 4 << 2) >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($201 + 5 << 2) >> 2] = $j$075; + HEAP32[$labelInfo + 1310736 + ($201 + 6 << 2) >> 2] = $j$075; + $wk_max$2 = $196; + break; + } + } + if ($56) { + $59 = HEAP32[$labelInfo + 1179664 + ($51 + -1 << 2) >> 2] | 0; + $62 = HEAP32[$labelInfo + 1179664 + ($55 + -1 << 2) >> 2] | 0; + if (($59 | 0) > ($62 | 0)) { + HEAP16[$pnt2$367 >> 1] = $62; + if (($wk_max$159 | 0) > 0) { + $k$055 = 0; + $wk$056 = $16; + while (1) { + if ((HEAP32[$wk$056 >> 2] | 0) == ($59 | 0)) HEAP32[$wk$056 >> 2] = $62; + $k$055 = $k$055 + 1 | 0; + if (($k$055 | 0) >= ($wk_max$159 | 0)) { + $79 = $62; + break; + } else $wk$056 = $wk$056 + 4 | 0; + } + } else $79 = $62; + } else { + HEAP16[$pnt2$367 >> 1] = $59; + if (($59 | 0) < ($62 | 0) & ($wk_max$159 | 0) > 0) { + $k$152 = 0; + $wk$153 = $16; + while (1) { + if ((HEAP32[$wk$153 >> 2] | 0) == ($62 | 0)) HEAP32[$wk$153 >> 2] = $59; + $k$152 = $k$152 + 1 | 0; + if (($k$152 | 0) >= ($wk_max$159 | 0)) { + $79 = $59; + break; + } else $wk$153 = $wk$153 + 4 | 0; + } + } else $79 = $59; + } + $81 = ($79 << 16 >> 16) * 7 | 0; + $83 = $labelInfo + 1310736 + ($81 + -7 << 2) | 0; + HEAP32[$83 >> 2] = (HEAP32[$83 >> 2] | 0) + 1; + $87 = $labelInfo + 1310736 + ($81 + -6 << 2) | 0; + HEAP32[$87 >> 2] = (HEAP32[$87 >> 2] | 0) + $i$264; + $91 = $labelInfo + 1310736 + ($81 + -5 << 2) | 0; + HEAP32[$91 >> 2] = (HEAP32[$91 >> 2] | 0) + $j$075; + HEAP32[$labelInfo + 1310736 + ($81 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $97 = HEAP16[$pnt2$367 + -2 >> 1] | 0; + if ($97 << 16 >> 16 <= 0) { + HEAP16[$pnt2$367 >> 1] = $50; + $137 = $51 * 7 | 0; + $139 = $labelInfo + 1310736 + ($137 + -7 << 2) | 0; + HEAP32[$139 >> 2] = (HEAP32[$139 >> 2] | 0) + 1; + $143 = $labelInfo + 1310736 + ($137 + -6 << 2) | 0; + HEAP32[$143 >> 2] = (HEAP32[$143 >> 2] | 0) + $i$264; + $147 = $labelInfo + 1310736 + ($137 + -5 << 2) | 0; + HEAP32[$147 >> 2] = (HEAP32[$147 >> 2] | 0) + $j$075; + $151 = $labelInfo + 1310736 + ($137 + -4 << 2) | 0; + if ((HEAP32[$151 >> 2] | 0) > ($i$264 | 0)) HEAP32[$151 >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($137 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $102 = HEAP32[$labelInfo + 1179664 + ($51 + -1 << 2) >> 2] | 0; + $105 = HEAP32[$labelInfo + 1179664 + (($97 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($102 | 0) > ($105 | 0)) { + HEAP16[$pnt2$367 >> 1] = $105; + if (($wk_max$159 | 0) > 0) { + $k$248 = 0; + $wk$249 = $16; + while (1) { + if ((HEAP32[$wk$249 >> 2] | 0) == ($102 | 0)) HEAP32[$wk$249 >> 2] = $105; + $k$248 = $k$248 + 1 | 0; + if (($k$248 | 0) >= ($wk_max$159 | 0)) { + $122 = $105; + break; + } else $wk$249 = $wk$249 + 4 | 0; + } + } else $122 = $105; + } else { + HEAP16[$pnt2$367 >> 1] = $102; + if (($102 | 0) < ($105 | 0) & ($wk_max$159 | 0) > 0) { + $k$345 = 0; + $wk$346 = $16; + while (1) { + if ((HEAP32[$wk$346 >> 2] | 0) == ($105 | 0)) HEAP32[$wk$346 >> 2] = $102; + $k$345 = $k$345 + 1 | 0; + if (($k$345 | 0) >= ($wk_max$159 | 0)) { + $122 = $102; + break; + } else $wk$346 = $wk$346 + 4 | 0; + } + } else $122 = $102; + } + $124 = ($122 << 16 >> 16) * 7 | 0; + $126 = $labelInfo + 1310736 + ($124 + -7 << 2) | 0; + HEAP32[$126 >> 2] = (HEAP32[$126 >> 2] | 0) + 1; + $130 = $labelInfo + 1310736 + ($124 + -6 << 2) | 0; + HEAP32[$130 >> 2] = (HEAP32[$130 >> 2] | 0) + $i$264; + $134 = $labelInfo + 1310736 + ($124 + -5 << 2) | 0; + HEAP32[$134 >> 2] = (HEAP32[$134 >> 2] | 0) + $j$075; + $wk_max$2 = $wk_max$159; + } while (0); + $i$264 = $i$264 + 1 | 0; + $216 = $pnt$168 + 2 | 0; + $217 = $pnt2$367 + 2 | 0; + $218 = $dpnt$166 + 1 | 0; + if (($i$264 | 0) >= ($9 | 0)) { + $dpnt$1$lcssa = $218; + $pnt$1$lcssa = $216; + $pnt2$3$lcssa = $217; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $dpnt$166 = $218; + $pnt$168 = $216; + $pnt2$367 = $217; + $wk_max$159 = $wk_max$2; + } + } + } else { + $dpnt$1$lcssa = $dpnt$077; + $pnt$1$lcssa = $pnt$079; + $pnt2$3$lcssa = $pnt2$278; + $wk_max$1$lcssa = $wk_max$074; + } + $j$075 = $j$075 + 1 | 0; + if (($j$075 | 0) >= ($1 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $dpnt$077 = $dpnt$1$lcssa + 2 | 0; + $pnt$079 = $pnt$1$lcssa + 4 | 0; + $pnt2$278 = $pnt2$3$lcssa + 4 | 0; + $wk_max$074 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $225 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$341 = 1; + $j$142 = 1; + $wk$443 = $16; + while (1) { + $227 = HEAP32[$wk$443 >> 2] | 0; + if (($227 | 0) == ($i$341 | 0)) { + $233 = $j$142; + $j$2 = $j$142 + 1 | 0; + } else { + $233 = HEAP32[$labelInfo + 1179664 + ($227 + -1 << 2) >> 2] | 0; + $j$2 = $j$142; + } + HEAP32[$wk$443 >> 2] = $233; + if (($i$341 | 0) < ($wk_max$0$lcssa | 0)) { + $i$341 = $i$341 + 1 | 0; + $j$142 = $j$2; + $wk$443 = $wk$443 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $237 = $labelInfo + 8 | 0; + $238 = $j$1$lcssa + -1 | 0; + HEAP32[$237 >> 2] = $238; + if (!$238) $$0 = 0; else { + _memset($225 | 0, 0, $238 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $238 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$439 = 0; + do { + $245 = $i$439 << 2; + HEAP32[$labelInfo + 131084 + ($245 << 2) >> 2] = $xsize; + HEAP32[$labelInfo + 131084 + (($245 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($245 | 2) << 2) >> 2] = $ysize; + HEAP32[$labelInfo + 131084 + (($245 | 3) << 2) >> 2] = 0; + $i$439 = $i$439 + 1 | 0; + } while (($i$439 | 0) < (HEAP32[$237 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$537 = 0; + do { + $259 = (HEAP32[$labelInfo + 1179664 + ($i$537 << 2) >> 2] | 0) + -1 | 0; + $260 = $i$537 * 7 | 0; + $263 = $labelInfo + 12 + ($259 << 2) | 0; + HEAP32[$263 >> 2] = (HEAP32[$263 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($260 << 2) >> 2] | 0); + $270 = $259 << 1; + $271 = $labelInfo + 655376 + ($270 << 3) | 0; + HEAPF64[$271 >> 3] = +HEAPF64[$271 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($260 + 1 << 2) >> 2] | 0); + $279 = $labelInfo + 655376 + (($270 | 1) << 3) | 0; + HEAPF64[$279 >> 3] = +HEAPF64[$279 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($260 + 2 << 2) >> 2] | 0); + $282 = $259 << 2; + $283 = $labelInfo + 131084 + ($282 << 2) | 0; + $287 = HEAP32[$labelInfo + 1310736 + ($260 + 3 << 2) >> 2] | 0; + if ((HEAP32[$283 >> 2] | 0) > ($287 | 0)) HEAP32[$283 >> 2] = $287; + $290 = $labelInfo + 131084 + (($282 | 1) << 2) | 0; + $294 = HEAP32[$labelInfo + 1310736 + ($260 + 4 << 2) >> 2] | 0; + if ((HEAP32[$290 >> 2] | 0) < ($294 | 0)) HEAP32[$290 >> 2] = $294; + $297 = $labelInfo + 131084 + (($282 | 2) << 2) | 0; + $301 = HEAP32[$labelInfo + 1310736 + ($260 + 5 << 2) >> 2] | 0; + if ((HEAP32[$297 >> 2] | 0) > ($301 | 0)) HEAP32[$297 >> 2] = $301; + $304 = $labelInfo + 131084 + (($282 | 3) << 2) | 0; + $308 = HEAP32[$labelInfo + 1310736 + ($260 + 6 << 2) >> 2] | 0; + if ((HEAP32[$304 >> 2] | 0) < ($308 | 0)) HEAP32[$304 >> 2] = $308; + $i$537 = $i$537 + 1 | 0; + } while (($i$537 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$237 >> 2] | 0) > 0) { + $i$636 = 0; + do { + $312 = $labelInfo + 12 + ($i$636 << 2) | 0; + $315 = $i$636 << 1; + $316 = $labelInfo + 655376 + ($315 << 3) | 0; + HEAPF64[$316 >> 3] = +HEAPF64[$316 >> 3] / +(HEAP32[$312 >> 2] | 0); + $322 = $labelInfo + 655376 + (($315 | 1) << 3) | 0; + HEAPF64[$322 >> 3] = +HEAPF64[$322 >> 3] / +(HEAP32[$312 >> 2] | 0); + $i$636 = $i$636 + 1 | 0; + } while (($i$636 | 0) < (HEAP32[$237 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubEWRC($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $0 = 0, $1 = 0, $101 = 0, $104 = 0, $121 = 0, $123 = 0, $125 = 0, $129 = 0, $133 = 0, $136 = 0, $138 = 0, $142 = 0, $146 = 0, $150 = 0, $155 = 0, $157 = 0, $16 = 0, $161 = 0, $165 = 0, $169 = 0, $17 = 0, $175 = 0, $178 = 0, $18 = 0, $180 = 0, $184 = 0, $188 = 0, $192 = 0, $195 = 0, $200 = 0, $215 = 0, $216 = 0, $217 = 0, $224 = 0, $226 = 0, $232 = 0, $236 = 0, $237 = 0, $244 = 0, $25 = 0, $258 = 0, $259 = 0, $262 = 0, $269 = 0, $270 = 0, $278 = 0, $281 = 0, $282 = 0, $286 = 0, $289 = 0, $293 = 0, $296 = 0, $30 = 0, $300 = 0, $303 = 0, $307 = 0, $311 = 0, $314 = 0, $315 = 0, $321 = 0, $33 = 0, $35 = 0, $39 = 0, $43 = 0, $49 = 0, $50 = 0, $53 = 0, $54 = 0, $55 = 0, $58 = 0, $61 = 0, $78 = 0, $80 = 0, $82 = 0, $86 = 0, $9 = 0, $90 = 0, $96 = 0, $dpnt$077 = 0, $dpnt$1$lcssa = 0, $dpnt$166 = 0, $i$088 = 0, $i$182 = 0, $i$264 = 0, $i$341 = 0, $i$439 = 0, $i$537 = 0, $i$636 = 0, $j$075 = 0, $j$1$lcssa = 0, $j$142 = 0, $j$2 = 0, $k$055 = 0, $k$152 = 0, $k$248 = 0, $k$345 = 0, $pnt$079 = 0, $pnt$1$lcssa = 0, $pnt$168 = 0, $pnt1$090 = 0, $pnt1$184 = 0, $pnt2$089 = 0, $pnt2$183 = 0, $pnt2$278 = 0, $pnt2$3$lcssa = 0, $pnt2$367 = 0, $vararg_buffer = 0, $wk$056 = 0, $wk$153 = 0, $wk$249 = 0, $wk$346 = 0, $wk$443 = 0, $wk_max$0$lcssa = 0, $wk_max$074 = 0, $wk_max$1$lcssa = 0, $wk_max$159 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = HEAP32[$labelInfo >> 2] | 0; + $1 = $ysize + -1 | 0; + if (($xsize | 0) > 0) { + $i$088 = 0; + $pnt1$090 = $0; + $pnt2$089 = $0 + ((Math_imul($1, $xsize) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$089 >> 1] = 0; + HEAP16[$pnt1$090 >> 1] = 0; + $i$088 = $i$088 + 1 | 0; + if (($i$088 | 0) >= ($xsize | 0)) break; else { + $pnt1$090 = $pnt1$090 + 2 | 0; + $pnt2$089 = $pnt2$089 + 2 | 0; + } + } + } + $9 = $xsize + -1 | 0; + if (($ysize | 0) > 0) { + $i$182 = 0; + $pnt1$184 = $0; + $pnt2$183 = $0 + ($9 << 1) | 0; + while (1) { + HEAP16[$pnt2$183 >> 1] = 0; + HEAP16[$pnt1$184 >> 1] = 0; + $i$182 = $i$182 + 1 | 0; + if (($i$182 | 0) >= ($ysize | 0)) break; else { + $pnt1$184 = $pnt1$184 + ($xsize << 1) | 0; + $pnt2$183 = $pnt2$183 + ($xsize << 1) | 0; + } + } + } + $16 = $labelInfo + 1179664 | 0; + $17 = $xsize + 1 | 0; + $18 = 0 - $xsize | 0; + $$sum = 1 - $xsize | 0; + $$sum1 = ~$xsize; + L11 : do if (($1 | 0) > 1) { + $25 = ($9 | 0) > 1; + $dpnt$077 = (HEAP32[$labelInfo + 4 >> 2] | 0) + $17 | 0; + $j$075 = 1; + $pnt$079 = $image + $17 | 0; + $pnt2$278 = $0 + ($17 << 1) | 0; + $wk_max$074 = 0; + L13 : while (1) { + if ($25) { + $dpnt$166 = $dpnt$077; + $i$264 = 1; + $pnt$168 = $pnt$079; + $pnt2$367 = $pnt2$278; + $wk_max$159 = $wk_max$074; + while (1) { + do if ((HEAPU8[$pnt$168 >> 0] | 0 | 0) > ($labelingThresh | 0)) { + HEAP8[$dpnt$166 >> 0] = -1; + $30 = HEAP16[$pnt2$367 + ($18 << 1) >> 1] | 0; + if ($30 << 16 >> 16 > 0) { + HEAP16[$pnt2$367 >> 1] = $30; + $33 = ($30 << 16 >> 16) * 7 | 0; + $35 = $labelInfo + 1310736 + ($33 + -7 << 2) | 0; + HEAP32[$35 >> 2] = (HEAP32[$35 >> 2] | 0) + 1; + $39 = $labelInfo + 1310736 + ($33 + -6 << 2) | 0; + HEAP32[$39 >> 2] = (HEAP32[$39 >> 2] | 0) + $i$264; + $43 = $labelInfo + 1310736 + ($33 + -5 << 2) | 0; + HEAP32[$43 >> 2] = (HEAP32[$43 >> 2] | 0) + $j$075; + HEAP32[$labelInfo + 1310736 + ($33 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $49 = HEAP16[$pnt2$367 + ($$sum << 1) >> 1] | 0; + $50 = $49 << 16 >> 16; + $53 = HEAP16[$pnt2$367 + ($$sum1 << 1) >> 1] | 0; + $54 = $53 << 16 >> 16; + $55 = $53 << 16 >> 16 > 0; + if ($49 << 16 >> 16 <= 0) { + if ($55) { + HEAP16[$pnt2$367 >> 1] = $53; + $155 = $54 * 7 | 0; + $157 = $labelInfo + 1310736 + ($155 + -7 << 2) | 0; + HEAP32[$157 >> 2] = (HEAP32[$157 >> 2] | 0) + 1; + $161 = $labelInfo + 1310736 + ($155 + -6 << 2) | 0; + HEAP32[$161 >> 2] = (HEAP32[$161 >> 2] | 0) + $i$264; + $165 = $labelInfo + 1310736 + ($155 + -5 << 2) | 0; + HEAP32[$165 >> 2] = (HEAP32[$165 >> 2] | 0) + $j$075; + $169 = $labelInfo + 1310736 + ($155 + -3 << 2) | 0; + if ((HEAP32[$169 >> 2] | 0) < ($i$264 | 0)) HEAP32[$169 >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($155 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $175 = HEAP16[$pnt2$367 + -2 >> 1] | 0; + if ($175 << 16 >> 16 > 0) { + HEAP16[$pnt2$367 >> 1] = $175; + $178 = ($175 << 16 >> 16) * 7 | 0; + $180 = $labelInfo + 1310736 + ($178 + -7 << 2) | 0; + HEAP32[$180 >> 2] = (HEAP32[$180 >> 2] | 0) + 1; + $184 = $labelInfo + 1310736 + ($178 + -6 << 2) | 0; + HEAP32[$184 >> 2] = (HEAP32[$184 >> 2] | 0) + $i$264; + $188 = $labelInfo + 1310736 + ($178 + -5 << 2) | 0; + HEAP32[$188 >> 2] = (HEAP32[$188 >> 2] | 0) + $j$075; + $192 = $labelInfo + 1310736 + ($178 + -3 << 2) | 0; + if ((HEAP32[$192 >> 2] | 0) >= ($i$264 | 0)) { + $wk_max$2 = $wk_max$159; + break; + } + HEAP32[$192 >> 2] = $i$264; + $wk_max$2 = $wk_max$159; + break; + } else { + $195 = $wk_max$159 + 1 | 0; + if (($wk_max$159 | 0) > 32767) break L13; + HEAP16[$pnt2$367 >> 1] = $195; + HEAP32[$labelInfo + 1179664 + ($wk_max$159 << 2) >> 2] = $195 << 16 >> 16; + $200 = $wk_max$159 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($200 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($200 + 1 << 2) >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($200 + 2 << 2) >> 2] = $j$075; + HEAP32[$labelInfo + 1310736 + ($200 + 3 << 2) >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($200 + 4 << 2) >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($200 + 5 << 2) >> 2] = $j$075; + HEAP32[$labelInfo + 1310736 + ($200 + 6 << 2) >> 2] = $j$075; + $wk_max$2 = $195; + break; + } + } + if ($55) { + $58 = HEAP32[$labelInfo + 1179664 + ($50 + -1 << 2) >> 2] | 0; + $61 = HEAP32[$labelInfo + 1179664 + ($54 + -1 << 2) >> 2] | 0; + if (($58 | 0) > ($61 | 0)) { + HEAP16[$pnt2$367 >> 1] = $61; + if (($wk_max$159 | 0) > 0) { + $k$055 = 0; + $wk$056 = $16; + while (1) { + if ((HEAP32[$wk$056 >> 2] | 0) == ($58 | 0)) HEAP32[$wk$056 >> 2] = $61; + $k$055 = $k$055 + 1 | 0; + if (($k$055 | 0) >= ($wk_max$159 | 0)) { + $78 = $61; + break; + } else $wk$056 = $wk$056 + 4 | 0; + } + } else $78 = $61; + } else { + HEAP16[$pnt2$367 >> 1] = $58; + if (($58 | 0) < ($61 | 0) & ($wk_max$159 | 0) > 0) { + $k$152 = 0; + $wk$153 = $16; + while (1) { + if ((HEAP32[$wk$153 >> 2] | 0) == ($61 | 0)) HEAP32[$wk$153 >> 2] = $58; + $k$152 = $k$152 + 1 | 0; + if (($k$152 | 0) >= ($wk_max$159 | 0)) { + $78 = $58; + break; + } else $wk$153 = $wk$153 + 4 | 0; + } + } else $78 = $58; + } + $80 = ($78 << 16 >> 16) * 7 | 0; + $82 = $labelInfo + 1310736 + ($80 + -7 << 2) | 0; + HEAP32[$82 >> 2] = (HEAP32[$82 >> 2] | 0) + 1; + $86 = $labelInfo + 1310736 + ($80 + -6 << 2) | 0; + HEAP32[$86 >> 2] = (HEAP32[$86 >> 2] | 0) + $i$264; + $90 = $labelInfo + 1310736 + ($80 + -5 << 2) | 0; + HEAP32[$90 >> 2] = (HEAP32[$90 >> 2] | 0) + $j$075; + HEAP32[$labelInfo + 1310736 + ($80 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $96 = HEAP16[$pnt2$367 + -2 >> 1] | 0; + if ($96 << 16 >> 16 <= 0) { + HEAP16[$pnt2$367 >> 1] = $49; + $136 = $50 * 7 | 0; + $138 = $labelInfo + 1310736 + ($136 + -7 << 2) | 0; + HEAP32[$138 >> 2] = (HEAP32[$138 >> 2] | 0) + 1; + $142 = $labelInfo + 1310736 + ($136 + -6 << 2) | 0; + HEAP32[$142 >> 2] = (HEAP32[$142 >> 2] | 0) + $i$264; + $146 = $labelInfo + 1310736 + ($136 + -5 << 2) | 0; + HEAP32[$146 >> 2] = (HEAP32[$146 >> 2] | 0) + $j$075; + $150 = $labelInfo + 1310736 + ($136 + -4 << 2) | 0; + if ((HEAP32[$150 >> 2] | 0) > ($i$264 | 0)) HEAP32[$150 >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($136 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $101 = HEAP32[$labelInfo + 1179664 + ($50 + -1 << 2) >> 2] | 0; + $104 = HEAP32[$labelInfo + 1179664 + (($96 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($101 | 0) > ($104 | 0)) { + HEAP16[$pnt2$367 >> 1] = $104; + if (($wk_max$159 | 0) > 0) { + $k$248 = 0; + $wk$249 = $16; + while (1) { + if ((HEAP32[$wk$249 >> 2] | 0) == ($101 | 0)) HEAP32[$wk$249 >> 2] = $104; + $k$248 = $k$248 + 1 | 0; + if (($k$248 | 0) >= ($wk_max$159 | 0)) { + $121 = $104; + break; + } else $wk$249 = $wk$249 + 4 | 0; + } + } else $121 = $104; + } else { + HEAP16[$pnt2$367 >> 1] = $101; + if (($101 | 0) < ($104 | 0) & ($wk_max$159 | 0) > 0) { + $k$345 = 0; + $wk$346 = $16; + while (1) { + if ((HEAP32[$wk$346 >> 2] | 0) == ($104 | 0)) HEAP32[$wk$346 >> 2] = $101; + $k$345 = $k$345 + 1 | 0; + if (($k$345 | 0) >= ($wk_max$159 | 0)) { + $121 = $101; + break; + } else $wk$346 = $wk$346 + 4 | 0; + } + } else $121 = $101; + } + $123 = ($121 << 16 >> 16) * 7 | 0; + $125 = $labelInfo + 1310736 + ($123 + -7 << 2) | 0; + HEAP32[$125 >> 2] = (HEAP32[$125 >> 2] | 0) + 1; + $129 = $labelInfo + 1310736 + ($123 + -6 << 2) | 0; + HEAP32[$129 >> 2] = (HEAP32[$129 >> 2] | 0) + $i$264; + $133 = $labelInfo + 1310736 + ($123 + -5 << 2) | 0; + HEAP32[$133 >> 2] = (HEAP32[$133 >> 2] | 0) + $j$075; + $wk_max$2 = $wk_max$159; + } else { + HEAP16[$pnt2$367 >> 1] = 0; + HEAP8[$dpnt$166 >> 0] = 0; + $wk_max$2 = $wk_max$159; + } while (0); + $i$264 = $i$264 + 1 | 0; + $215 = $pnt$168 + 1 | 0; + $216 = $pnt2$367 + 2 | 0; + $217 = $dpnt$166 + 1 | 0; + if (($i$264 | 0) >= ($9 | 0)) { + $dpnt$1$lcssa = $217; + $pnt$1$lcssa = $215; + $pnt2$3$lcssa = $216; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $dpnt$166 = $217; + $pnt$168 = $215; + $pnt2$367 = $216; + $wk_max$159 = $wk_max$2; + } + } + } else { + $dpnt$1$lcssa = $dpnt$077; + $pnt$1$lcssa = $pnt$079; + $pnt2$3$lcssa = $pnt2$278; + $wk_max$1$lcssa = $wk_max$074; + } + $j$075 = $j$075 + 1 | 0; + if (($j$075 | 0) >= ($1 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $dpnt$077 = $dpnt$1$lcssa + 2 | 0; + $pnt$079 = $pnt$1$lcssa + 2 | 0; + $pnt2$278 = $pnt2$3$lcssa + 4 | 0; + $wk_max$074 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $224 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$341 = 1; + $j$142 = 1; + $wk$443 = $16; + while (1) { + $226 = HEAP32[$wk$443 >> 2] | 0; + if (($226 | 0) == ($i$341 | 0)) { + $232 = $j$142; + $j$2 = $j$142 + 1 | 0; + } else { + $232 = HEAP32[$labelInfo + 1179664 + ($226 + -1 << 2) >> 2] | 0; + $j$2 = $j$142; + } + HEAP32[$wk$443 >> 2] = $232; + if (($i$341 | 0) < ($wk_max$0$lcssa | 0)) { + $i$341 = $i$341 + 1 | 0; + $j$142 = $j$2; + $wk$443 = $wk$443 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $236 = $labelInfo + 8 | 0; + $237 = $j$1$lcssa + -1 | 0; + HEAP32[$236 >> 2] = $237; + if (!$237) $$0 = 0; else { + _memset($224 | 0, 0, $237 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $237 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$439 = 0; + do { + $244 = $i$439 << 2; + HEAP32[$labelInfo + 131084 + ($244 << 2) >> 2] = $xsize; + HEAP32[$labelInfo + 131084 + (($244 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($244 | 2) << 2) >> 2] = $ysize; + HEAP32[$labelInfo + 131084 + (($244 | 3) << 2) >> 2] = 0; + $i$439 = $i$439 + 1 | 0; + } while (($i$439 | 0) < (HEAP32[$236 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$537 = 0; + do { + $258 = (HEAP32[$labelInfo + 1179664 + ($i$537 << 2) >> 2] | 0) + -1 | 0; + $259 = $i$537 * 7 | 0; + $262 = $labelInfo + 12 + ($258 << 2) | 0; + HEAP32[$262 >> 2] = (HEAP32[$262 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($259 << 2) >> 2] | 0); + $269 = $258 << 1; + $270 = $labelInfo + 655376 + ($269 << 3) | 0; + HEAPF64[$270 >> 3] = +HEAPF64[$270 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($259 + 1 << 2) >> 2] | 0); + $278 = $labelInfo + 655376 + (($269 | 1) << 3) | 0; + HEAPF64[$278 >> 3] = +HEAPF64[$278 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($259 + 2 << 2) >> 2] | 0); + $281 = $258 << 2; + $282 = $labelInfo + 131084 + ($281 << 2) | 0; + $286 = HEAP32[$labelInfo + 1310736 + ($259 + 3 << 2) >> 2] | 0; + if ((HEAP32[$282 >> 2] | 0) > ($286 | 0)) HEAP32[$282 >> 2] = $286; + $289 = $labelInfo + 131084 + (($281 | 1) << 2) | 0; + $293 = HEAP32[$labelInfo + 1310736 + ($259 + 4 << 2) >> 2] | 0; + if ((HEAP32[$289 >> 2] | 0) < ($293 | 0)) HEAP32[$289 >> 2] = $293; + $296 = $labelInfo + 131084 + (($281 | 2) << 2) | 0; + $300 = HEAP32[$labelInfo + 1310736 + ($259 + 5 << 2) >> 2] | 0; + if ((HEAP32[$296 >> 2] | 0) > ($300 | 0)) HEAP32[$296 >> 2] = $300; + $303 = $labelInfo + 131084 + (($281 | 3) << 2) | 0; + $307 = HEAP32[$labelInfo + 1310736 + ($259 + 6 << 2) >> 2] | 0; + if ((HEAP32[$303 >> 2] | 0) < ($307 | 0)) HEAP32[$303 >> 2] = $307; + $i$537 = $i$537 + 1 | 0; + } while (($i$537 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$236 >> 2] | 0) > 0) { + $i$636 = 0; + do { + $311 = $labelInfo + 12 + ($i$636 << 2) | 0; + $314 = $i$636 << 1; + $315 = $labelInfo + 655376 + ($314 << 3) | 0; + HEAPF64[$315 >> 3] = +HEAPF64[$315 >> 3] / +(HEAP32[$311 >> 2] | 0); + $321 = $labelInfo + 655376 + (($314 | 1) << 3) | 0; + HEAPF64[$321 >> 3] = +HEAPF64[$321 >> 3] / +(HEAP32[$311 >> 2] | 0); + $i$636 = $i$636 + 1 | 0; + } while (($i$636 | 0) < (HEAP32[$236 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubEBRC($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $0 = 0, $1 = 0, $101 = 0, $104 = 0, $121 = 0, $123 = 0, $125 = 0, $129 = 0, $133 = 0, $136 = 0, $138 = 0, $142 = 0, $146 = 0, $150 = 0, $155 = 0, $157 = 0, $16 = 0, $161 = 0, $165 = 0, $169 = 0, $17 = 0, $175 = 0, $178 = 0, $18 = 0, $180 = 0, $184 = 0, $188 = 0, $192 = 0, $195 = 0, $200 = 0, $215 = 0, $216 = 0, $217 = 0, $224 = 0, $226 = 0, $232 = 0, $236 = 0, $237 = 0, $244 = 0, $25 = 0, $258 = 0, $259 = 0, $262 = 0, $269 = 0, $270 = 0, $278 = 0, $281 = 0, $282 = 0, $286 = 0, $289 = 0, $293 = 0, $296 = 0, $30 = 0, $300 = 0, $303 = 0, $307 = 0, $311 = 0, $314 = 0, $315 = 0, $321 = 0, $33 = 0, $35 = 0, $39 = 0, $43 = 0, $49 = 0, $50 = 0, $53 = 0, $54 = 0, $55 = 0, $58 = 0, $61 = 0, $78 = 0, $80 = 0, $82 = 0, $86 = 0, $9 = 0, $90 = 0, $96 = 0, $dpnt$077 = 0, $dpnt$1$lcssa = 0, $dpnt$166 = 0, $i$088 = 0, $i$182 = 0, $i$264 = 0, $i$341 = 0, $i$439 = 0, $i$537 = 0, $i$636 = 0, $j$075 = 0, $j$1$lcssa = 0, $j$142 = 0, $j$2 = 0, $k$055 = 0, $k$152 = 0, $k$248 = 0, $k$345 = 0, $pnt$079 = 0, $pnt$1$lcssa = 0, $pnt$168 = 0, $pnt1$090 = 0, $pnt1$184 = 0, $pnt2$089 = 0, $pnt2$183 = 0, $pnt2$278 = 0, $pnt2$3$lcssa = 0, $pnt2$367 = 0, $vararg_buffer = 0, $wk$056 = 0, $wk$153 = 0, $wk$249 = 0, $wk$346 = 0, $wk$443 = 0, $wk_max$0$lcssa = 0, $wk_max$074 = 0, $wk_max$1$lcssa = 0, $wk_max$159 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = HEAP32[$labelInfo >> 2] | 0; + $1 = $ysize + -1 | 0; + if (($xsize | 0) > 0) { + $i$088 = 0; + $pnt1$090 = $0; + $pnt2$089 = $0 + ((Math_imul($1, $xsize) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$089 >> 1] = 0; + HEAP16[$pnt1$090 >> 1] = 0; + $i$088 = $i$088 + 1 | 0; + if (($i$088 | 0) >= ($xsize | 0)) break; else { + $pnt1$090 = $pnt1$090 + 2 | 0; + $pnt2$089 = $pnt2$089 + 2 | 0; + } + } + } + $9 = $xsize + -1 | 0; + if (($ysize | 0) > 0) { + $i$182 = 0; + $pnt1$184 = $0; + $pnt2$183 = $0 + ($9 << 1) | 0; + while (1) { + HEAP16[$pnt2$183 >> 1] = 0; + HEAP16[$pnt1$184 >> 1] = 0; + $i$182 = $i$182 + 1 | 0; + if (($i$182 | 0) >= ($ysize | 0)) break; else { + $pnt1$184 = $pnt1$184 + ($xsize << 1) | 0; + $pnt2$183 = $pnt2$183 + ($xsize << 1) | 0; + } + } + } + $16 = $labelInfo + 1179664 | 0; + $17 = $xsize + 1 | 0; + $18 = 0 - $xsize | 0; + $$sum = 1 - $xsize | 0; + $$sum1 = ~$xsize; + L11 : do if (($1 | 0) > 1) { + $25 = ($9 | 0) > 1; + $dpnt$077 = (HEAP32[$labelInfo + 4 >> 2] | 0) + $17 | 0; + $j$075 = 1; + $pnt$079 = $image + $17 | 0; + $pnt2$278 = $0 + ($17 << 1) | 0; + $wk_max$074 = 0; + L13 : while (1) { + if ($25) { + $dpnt$166 = $dpnt$077; + $i$264 = 1; + $pnt$168 = $pnt$079; + $pnt2$367 = $pnt2$278; + $wk_max$159 = $wk_max$074; + while (1) { + do if ((HEAPU8[$pnt$168 >> 0] | 0 | 0) > ($labelingThresh | 0)) { + HEAP16[$pnt2$367 >> 1] = 0; + HEAP8[$dpnt$166 >> 0] = 0; + $wk_max$2 = $wk_max$159; + } else { + HEAP8[$dpnt$166 >> 0] = -1; + $30 = HEAP16[$pnt2$367 + ($18 << 1) >> 1] | 0; + if ($30 << 16 >> 16 > 0) { + HEAP16[$pnt2$367 >> 1] = $30; + $33 = ($30 << 16 >> 16) * 7 | 0; + $35 = $labelInfo + 1310736 + ($33 + -7 << 2) | 0; + HEAP32[$35 >> 2] = (HEAP32[$35 >> 2] | 0) + 1; + $39 = $labelInfo + 1310736 + ($33 + -6 << 2) | 0; + HEAP32[$39 >> 2] = (HEAP32[$39 >> 2] | 0) + $i$264; + $43 = $labelInfo + 1310736 + ($33 + -5 << 2) | 0; + HEAP32[$43 >> 2] = (HEAP32[$43 >> 2] | 0) + $j$075; + HEAP32[$labelInfo + 1310736 + ($33 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $49 = HEAP16[$pnt2$367 + ($$sum << 1) >> 1] | 0; + $50 = $49 << 16 >> 16; + $53 = HEAP16[$pnt2$367 + ($$sum1 << 1) >> 1] | 0; + $54 = $53 << 16 >> 16; + $55 = $53 << 16 >> 16 > 0; + if ($49 << 16 >> 16 <= 0) { + if ($55) { + HEAP16[$pnt2$367 >> 1] = $53; + $155 = $54 * 7 | 0; + $157 = $labelInfo + 1310736 + ($155 + -7 << 2) | 0; + HEAP32[$157 >> 2] = (HEAP32[$157 >> 2] | 0) + 1; + $161 = $labelInfo + 1310736 + ($155 + -6 << 2) | 0; + HEAP32[$161 >> 2] = (HEAP32[$161 >> 2] | 0) + $i$264; + $165 = $labelInfo + 1310736 + ($155 + -5 << 2) | 0; + HEAP32[$165 >> 2] = (HEAP32[$165 >> 2] | 0) + $j$075; + $169 = $labelInfo + 1310736 + ($155 + -3 << 2) | 0; + if ((HEAP32[$169 >> 2] | 0) < ($i$264 | 0)) HEAP32[$169 >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($155 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $175 = HEAP16[$pnt2$367 + -2 >> 1] | 0; + if ($175 << 16 >> 16 > 0) { + HEAP16[$pnt2$367 >> 1] = $175; + $178 = ($175 << 16 >> 16) * 7 | 0; + $180 = $labelInfo + 1310736 + ($178 + -7 << 2) | 0; + HEAP32[$180 >> 2] = (HEAP32[$180 >> 2] | 0) + 1; + $184 = $labelInfo + 1310736 + ($178 + -6 << 2) | 0; + HEAP32[$184 >> 2] = (HEAP32[$184 >> 2] | 0) + $i$264; + $188 = $labelInfo + 1310736 + ($178 + -5 << 2) | 0; + HEAP32[$188 >> 2] = (HEAP32[$188 >> 2] | 0) + $j$075; + $192 = $labelInfo + 1310736 + ($178 + -3 << 2) | 0; + if ((HEAP32[$192 >> 2] | 0) >= ($i$264 | 0)) { + $wk_max$2 = $wk_max$159; + break; + } + HEAP32[$192 >> 2] = $i$264; + $wk_max$2 = $wk_max$159; + break; + } else { + $195 = $wk_max$159 + 1 | 0; + if (($wk_max$159 | 0) > 32767) break L13; + HEAP16[$pnt2$367 >> 1] = $195; + HEAP32[$labelInfo + 1179664 + ($wk_max$159 << 2) >> 2] = $195 << 16 >> 16; + $200 = $wk_max$159 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($200 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($200 + 1 << 2) >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($200 + 2 << 2) >> 2] = $j$075; + HEAP32[$labelInfo + 1310736 + ($200 + 3 << 2) >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($200 + 4 << 2) >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($200 + 5 << 2) >> 2] = $j$075; + HEAP32[$labelInfo + 1310736 + ($200 + 6 << 2) >> 2] = $j$075; + $wk_max$2 = $195; + break; + } + } + if ($55) { + $58 = HEAP32[$labelInfo + 1179664 + ($50 + -1 << 2) >> 2] | 0; + $61 = HEAP32[$labelInfo + 1179664 + ($54 + -1 << 2) >> 2] | 0; + if (($58 | 0) > ($61 | 0)) { + HEAP16[$pnt2$367 >> 1] = $61; + if (($wk_max$159 | 0) > 0) { + $k$055 = 0; + $wk$056 = $16; + while (1) { + if ((HEAP32[$wk$056 >> 2] | 0) == ($58 | 0)) HEAP32[$wk$056 >> 2] = $61; + $k$055 = $k$055 + 1 | 0; + if (($k$055 | 0) >= ($wk_max$159 | 0)) { + $78 = $61; + break; + } else $wk$056 = $wk$056 + 4 | 0; + } + } else $78 = $61; + } else { + HEAP16[$pnt2$367 >> 1] = $58; + if (($58 | 0) < ($61 | 0) & ($wk_max$159 | 0) > 0) { + $k$152 = 0; + $wk$153 = $16; + while (1) { + if ((HEAP32[$wk$153 >> 2] | 0) == ($61 | 0)) HEAP32[$wk$153 >> 2] = $58; + $k$152 = $k$152 + 1 | 0; + if (($k$152 | 0) >= ($wk_max$159 | 0)) { + $78 = $58; + break; + } else $wk$153 = $wk$153 + 4 | 0; + } + } else $78 = $58; + } + $80 = ($78 << 16 >> 16) * 7 | 0; + $82 = $labelInfo + 1310736 + ($80 + -7 << 2) | 0; + HEAP32[$82 >> 2] = (HEAP32[$82 >> 2] | 0) + 1; + $86 = $labelInfo + 1310736 + ($80 + -6 << 2) | 0; + HEAP32[$86 >> 2] = (HEAP32[$86 >> 2] | 0) + $i$264; + $90 = $labelInfo + 1310736 + ($80 + -5 << 2) | 0; + HEAP32[$90 >> 2] = (HEAP32[$90 >> 2] | 0) + $j$075; + HEAP32[$labelInfo + 1310736 + ($80 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $96 = HEAP16[$pnt2$367 + -2 >> 1] | 0; + if ($96 << 16 >> 16 <= 0) { + HEAP16[$pnt2$367 >> 1] = $49; + $136 = $50 * 7 | 0; + $138 = $labelInfo + 1310736 + ($136 + -7 << 2) | 0; + HEAP32[$138 >> 2] = (HEAP32[$138 >> 2] | 0) + 1; + $142 = $labelInfo + 1310736 + ($136 + -6 << 2) | 0; + HEAP32[$142 >> 2] = (HEAP32[$142 >> 2] | 0) + $i$264; + $146 = $labelInfo + 1310736 + ($136 + -5 << 2) | 0; + HEAP32[$146 >> 2] = (HEAP32[$146 >> 2] | 0) + $j$075; + $150 = $labelInfo + 1310736 + ($136 + -4 << 2) | 0; + if ((HEAP32[$150 >> 2] | 0) > ($i$264 | 0)) HEAP32[$150 >> 2] = $i$264; + HEAP32[$labelInfo + 1310736 + ($136 + -1 << 2) >> 2] = $j$075; + $wk_max$2 = $wk_max$159; + break; + } + $101 = HEAP32[$labelInfo + 1179664 + ($50 + -1 << 2) >> 2] | 0; + $104 = HEAP32[$labelInfo + 1179664 + (($96 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($101 | 0) > ($104 | 0)) { + HEAP16[$pnt2$367 >> 1] = $104; + if (($wk_max$159 | 0) > 0) { + $k$248 = 0; + $wk$249 = $16; + while (1) { + if ((HEAP32[$wk$249 >> 2] | 0) == ($101 | 0)) HEAP32[$wk$249 >> 2] = $104; + $k$248 = $k$248 + 1 | 0; + if (($k$248 | 0) >= ($wk_max$159 | 0)) { + $121 = $104; + break; + } else $wk$249 = $wk$249 + 4 | 0; + } + } else $121 = $104; + } else { + HEAP16[$pnt2$367 >> 1] = $101; + if (($101 | 0) < ($104 | 0) & ($wk_max$159 | 0) > 0) { + $k$345 = 0; + $wk$346 = $16; + while (1) { + if ((HEAP32[$wk$346 >> 2] | 0) == ($104 | 0)) HEAP32[$wk$346 >> 2] = $101; + $k$345 = $k$345 + 1 | 0; + if (($k$345 | 0) >= ($wk_max$159 | 0)) { + $121 = $101; + break; + } else $wk$346 = $wk$346 + 4 | 0; + } + } else $121 = $101; + } + $123 = ($121 << 16 >> 16) * 7 | 0; + $125 = $labelInfo + 1310736 + ($123 + -7 << 2) | 0; + HEAP32[$125 >> 2] = (HEAP32[$125 >> 2] | 0) + 1; + $129 = $labelInfo + 1310736 + ($123 + -6 << 2) | 0; + HEAP32[$129 >> 2] = (HEAP32[$129 >> 2] | 0) + $i$264; + $133 = $labelInfo + 1310736 + ($123 + -5 << 2) | 0; + HEAP32[$133 >> 2] = (HEAP32[$133 >> 2] | 0) + $j$075; + $wk_max$2 = $wk_max$159; + } while (0); + $i$264 = $i$264 + 1 | 0; + $215 = $pnt$168 + 1 | 0; + $216 = $pnt2$367 + 2 | 0; + $217 = $dpnt$166 + 1 | 0; + if (($i$264 | 0) >= ($9 | 0)) { + $dpnt$1$lcssa = $217; + $pnt$1$lcssa = $215; + $pnt2$3$lcssa = $216; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $dpnt$166 = $217; + $pnt$168 = $215; + $pnt2$367 = $216; + $wk_max$159 = $wk_max$2; + } + } + } else { + $dpnt$1$lcssa = $dpnt$077; + $pnt$1$lcssa = $pnt$079; + $pnt2$3$lcssa = $pnt2$278; + $wk_max$1$lcssa = $wk_max$074; + } + $j$075 = $j$075 + 1 | 0; + if (($j$075 | 0) >= ($1 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $dpnt$077 = $dpnt$1$lcssa + 2 | 0; + $pnt$079 = $pnt$1$lcssa + 2 | 0; + $pnt2$278 = $pnt2$3$lcssa + 4 | 0; + $wk_max$074 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $224 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$341 = 1; + $j$142 = 1; + $wk$443 = $16; + while (1) { + $226 = HEAP32[$wk$443 >> 2] | 0; + if (($226 | 0) == ($i$341 | 0)) { + $232 = $j$142; + $j$2 = $j$142 + 1 | 0; + } else { + $232 = HEAP32[$labelInfo + 1179664 + ($226 + -1 << 2) >> 2] | 0; + $j$2 = $j$142; + } + HEAP32[$wk$443 >> 2] = $232; + if (($i$341 | 0) < ($wk_max$0$lcssa | 0)) { + $i$341 = $i$341 + 1 | 0; + $j$142 = $j$2; + $wk$443 = $wk$443 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $236 = $labelInfo + 8 | 0; + $237 = $j$1$lcssa + -1 | 0; + HEAP32[$236 >> 2] = $237; + if (!$237) $$0 = 0; else { + _memset($224 | 0, 0, $237 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $237 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$439 = 0; + do { + $244 = $i$439 << 2; + HEAP32[$labelInfo + 131084 + ($244 << 2) >> 2] = $xsize; + HEAP32[$labelInfo + 131084 + (($244 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($244 | 2) << 2) >> 2] = $ysize; + HEAP32[$labelInfo + 131084 + (($244 | 3) << 2) >> 2] = 0; + $i$439 = $i$439 + 1 | 0; + } while (($i$439 | 0) < (HEAP32[$236 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$537 = 0; + do { + $258 = (HEAP32[$labelInfo + 1179664 + ($i$537 << 2) >> 2] | 0) + -1 | 0; + $259 = $i$537 * 7 | 0; + $262 = $labelInfo + 12 + ($258 << 2) | 0; + HEAP32[$262 >> 2] = (HEAP32[$262 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($259 << 2) >> 2] | 0); + $269 = $258 << 1; + $270 = $labelInfo + 655376 + ($269 << 3) | 0; + HEAPF64[$270 >> 3] = +HEAPF64[$270 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($259 + 1 << 2) >> 2] | 0); + $278 = $labelInfo + 655376 + (($269 | 1) << 3) | 0; + HEAPF64[$278 >> 3] = +HEAPF64[$278 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($259 + 2 << 2) >> 2] | 0); + $281 = $258 << 2; + $282 = $labelInfo + 131084 + ($281 << 2) | 0; + $286 = HEAP32[$labelInfo + 1310736 + ($259 + 3 << 2) >> 2] | 0; + if ((HEAP32[$282 >> 2] | 0) > ($286 | 0)) HEAP32[$282 >> 2] = $286; + $289 = $labelInfo + 131084 + (($281 | 1) << 2) | 0; + $293 = HEAP32[$labelInfo + 1310736 + ($259 + 4 << 2) >> 2] | 0; + if ((HEAP32[$289 >> 2] | 0) < ($293 | 0)) HEAP32[$289 >> 2] = $293; + $296 = $labelInfo + 131084 + (($281 | 2) << 2) | 0; + $300 = HEAP32[$labelInfo + 1310736 + ($259 + 5 << 2) >> 2] | 0; + if ((HEAP32[$296 >> 2] | 0) > ($300 | 0)) HEAP32[$296 >> 2] = $300; + $303 = $labelInfo + 131084 + (($281 | 3) << 2) | 0; + $307 = HEAP32[$labelInfo + 1310736 + ($259 + 6 << 2) >> 2] | 0; + if ((HEAP32[$303 >> 2] | 0) < ($307 | 0)) HEAP32[$303 >> 2] = $307; + $i$537 = $i$537 + 1 | 0; + } while (($i$537 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$236 >> 2] | 0) > 0) { + $i$636 = 0; + do { + $311 = $labelInfo + 12 + ($i$636 << 2) | 0; + $314 = $i$636 << 1; + $315 = $labelInfo + 655376 + ($314 << 3) | 0; + HEAPF64[$315 >> 3] = +HEAPF64[$315 >> 3] / +(HEAP32[$311 >> 2] | 0); + $321 = $labelInfo + 655376 + (($314 | 1) << 3) | 0; + HEAPF64[$321 >> 3] = +HEAPF64[$321 >> 3] / +(HEAP32[$311 >> 2] | 0); + $i$636 = $i$636 + 1 | 0; + } while (($i$636 | 0) < (HEAP32[$236 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubDWZ($image, $xsize, $ysize, $image_thresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $image_thresh = $image_thresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $0 = 0, $1 = 0, $102 = 0, $119 = 0, $121 = 0, $123 = 0, $127 = 0, $131 = 0, $134 = 0, $136 = 0, $140 = 0, $144 = 0, $148 = 0, $153 = 0, $155 = 0, $159 = 0, $16 = 0, $163 = 0, $167 = 0, $17 = 0, $173 = 0, $176 = 0, $178 = 0, $18 = 0, $182 = 0, $186 = 0, $190 = 0, $193 = 0, $198 = 0, $213 = 0, $214 = 0, $215 = 0, $222 = 0, $224 = 0, $23 = 0, $230 = 0, $234 = 0, $235 = 0, $242 = 0, $256 = 0, $257 = 0, $260 = 0, $267 = 0, $268 = 0, $276 = 0, $279 = 0, $28 = 0, $280 = 0, $284 = 0, $287 = 0, $291 = 0, $294 = 0, $298 = 0, $301 = 0, $305 = 0, $309 = 0, $31 = 0, $312 = 0, $313 = 0, $319 = 0, $33 = 0, $37 = 0, $41 = 0, $47 = 0, $48 = 0, $51 = 0, $52 = 0, $53 = 0, $56 = 0, $59 = 0, $76 = 0, $78 = 0, $80 = 0, $84 = 0, $88 = 0, $9 = 0, $94 = 0, $99 = 0, $i$089 = 0, $i$183 = 0, $i$265 = 0, $i$341 = 0, $i$439 = 0, $i$537 = 0, $i$636 = 0, $j$076 = 0, $j$1$lcssa = 0, $j$142 = 0, $j$2 = 0, $k$055 = 0, $k$152 = 0, $k$248 = 0, $k$345 = 0, $pnt$079 = 0, $pnt$1$lcssa = 0, $pnt$168 = 0, $pnt1$090 = 0, $pnt1$184 = 0, $pnt2$088 = 0, $pnt2$182 = 0, $pnt2$274 = 0, $pnt2$3$lcssa = 0, $pnt2$359 = 0, $pnt_thresh$078 = 0, $pnt_thresh$1$lcssa = 0, $pnt_thresh$167 = 0, $vararg_buffer = 0, $wk$056 = 0, $wk$153 = 0, $wk$249 = 0, $wk$346 = 0, $wk$443 = 0, $wk_max$0$lcssa = 0, $wk_max$075 = 0, $wk_max$1$lcssa = 0, $wk_max$160 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = HEAP32[$labelInfo >> 2] | 0; + $1 = $ysize + -1 | 0; + if (($xsize | 0) > 0) { + $i$089 = 0; + $pnt1$090 = $0; + $pnt2$088 = $0 + ((Math_imul($1, $xsize) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$088 >> 1] = 0; + HEAP16[$pnt1$090 >> 1] = 0; + $i$089 = $i$089 + 1 | 0; + if (($i$089 | 0) >= ($xsize | 0)) break; else { + $pnt1$090 = $pnt1$090 + 2 | 0; + $pnt2$088 = $pnt2$088 + 2 | 0; + } + } + } + $9 = $xsize + -1 | 0; + if (($ysize | 0) > 0) { + $i$183 = 0; + $pnt1$184 = $0; + $pnt2$182 = $0 + ($9 << 1) | 0; + while (1) { + HEAP16[$pnt2$182 >> 1] = 0; + HEAP16[$pnt1$184 >> 1] = 0; + $i$183 = $i$183 + 1 | 0; + if (($i$183 | 0) >= ($ysize | 0)) break; else { + $pnt1$184 = $pnt1$184 + ($xsize << 1) | 0; + $pnt2$182 = $pnt2$182 + ($xsize << 1) | 0; + } + } + } + $16 = $labelInfo + 1179664 | 0; + $17 = $xsize + 1 | 0; + $18 = 0 - $xsize | 0; + $$sum = 1 - $xsize | 0; + $$sum1 = ~$xsize; + L11 : do if (($1 | 0) > 1) { + $23 = ($9 | 0) > 1; + $j$076 = 1; + $pnt$079 = $image + $17 | 0; + $pnt2$274 = $0 + ($17 << 1) | 0; + $pnt_thresh$078 = $image_thresh + $17 | 0; + $wk_max$075 = 0; + L13 : while (1) { + if ($23) { + $i$265 = 1; + $pnt$168 = $pnt$079; + $pnt2$359 = $pnt2$274; + $pnt_thresh$167 = $pnt_thresh$078; + $wk_max$160 = $wk_max$075; + while (1) { + do if ((HEAPU8[$pnt$168 >> 0] | 0) > (HEAPU8[$pnt_thresh$167 >> 0] | 0)) { + $28 = HEAP16[$pnt2$359 + ($18 << 1) >> 1] | 0; + if ($28 << 16 >> 16 > 0) { + HEAP16[$pnt2$359 >> 1] = $28; + $31 = ($28 << 16 >> 16) * 7 | 0; + $33 = $labelInfo + 1310736 + ($31 + -7 << 2) | 0; + HEAP32[$33 >> 2] = (HEAP32[$33 >> 2] | 0) + 1; + $37 = $labelInfo + 1310736 + ($31 + -6 << 2) | 0; + HEAP32[$37 >> 2] = (HEAP32[$37 >> 2] | 0) + $i$265; + $41 = $labelInfo + 1310736 + ($31 + -5 << 2) | 0; + HEAP32[$41 >> 2] = (HEAP32[$41 >> 2] | 0) + $j$076; + HEAP32[$labelInfo + 1310736 + ($31 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $47 = HEAP16[$pnt2$359 + ($$sum << 1) >> 1] | 0; + $48 = $47 << 16 >> 16; + $51 = HEAP16[$pnt2$359 + ($$sum1 << 1) >> 1] | 0; + $52 = $51 << 16 >> 16; + $53 = $51 << 16 >> 16 > 0; + if ($47 << 16 >> 16 <= 0) { + if ($53) { + HEAP16[$pnt2$359 >> 1] = $51; + $153 = $52 * 7 | 0; + $155 = $labelInfo + 1310736 + ($153 + -7 << 2) | 0; + HEAP32[$155 >> 2] = (HEAP32[$155 >> 2] | 0) + 1; + $159 = $labelInfo + 1310736 + ($153 + -6 << 2) | 0; + HEAP32[$159 >> 2] = (HEAP32[$159 >> 2] | 0) + $i$265; + $163 = $labelInfo + 1310736 + ($153 + -5 << 2) | 0; + HEAP32[$163 >> 2] = (HEAP32[$163 >> 2] | 0) + $j$076; + $167 = $labelInfo + 1310736 + ($153 + -3 << 2) | 0; + if ((HEAP32[$167 >> 2] | 0) < ($i$265 | 0)) HEAP32[$167 >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($153 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $173 = HEAP16[$pnt2$359 + -2 >> 1] | 0; + if ($173 << 16 >> 16 > 0) { + HEAP16[$pnt2$359 >> 1] = $173; + $176 = ($173 << 16 >> 16) * 7 | 0; + $178 = $labelInfo + 1310736 + ($176 + -7 << 2) | 0; + HEAP32[$178 >> 2] = (HEAP32[$178 >> 2] | 0) + 1; + $182 = $labelInfo + 1310736 + ($176 + -6 << 2) | 0; + HEAP32[$182 >> 2] = (HEAP32[$182 >> 2] | 0) + $i$265; + $186 = $labelInfo + 1310736 + ($176 + -5 << 2) | 0; + HEAP32[$186 >> 2] = (HEAP32[$186 >> 2] | 0) + $j$076; + $190 = $labelInfo + 1310736 + ($176 + -3 << 2) | 0; + if ((HEAP32[$190 >> 2] | 0) >= ($i$265 | 0)) { + $wk_max$2 = $wk_max$160; + break; + } + HEAP32[$190 >> 2] = $i$265; + $wk_max$2 = $wk_max$160; + break; + } else { + $193 = $wk_max$160 + 1 | 0; + if (($wk_max$160 | 0) > 32767) break L13; + HEAP16[$pnt2$359 >> 1] = $193; + HEAP32[$labelInfo + 1179664 + ($wk_max$160 << 2) >> 2] = $193 << 16 >> 16; + $198 = $wk_max$160 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($198 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($198 + 1 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($198 + 2 << 2) >> 2] = $j$076; + HEAP32[$labelInfo + 1310736 + ($198 + 3 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($198 + 4 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($198 + 5 << 2) >> 2] = $j$076; + HEAP32[$labelInfo + 1310736 + ($198 + 6 << 2) >> 2] = $j$076; + $wk_max$2 = $193; + break; + } + } + if ($53) { + $56 = HEAP32[$labelInfo + 1179664 + ($48 + -1 << 2) >> 2] | 0; + $59 = HEAP32[$labelInfo + 1179664 + ($52 + -1 << 2) >> 2] | 0; + if (($56 | 0) > ($59 | 0)) { + HEAP16[$pnt2$359 >> 1] = $59; + if (($wk_max$160 | 0) > 0) { + $k$055 = 0; + $wk$056 = $16; + while (1) { + if ((HEAP32[$wk$056 >> 2] | 0) == ($56 | 0)) HEAP32[$wk$056 >> 2] = $59; + $k$055 = $k$055 + 1 | 0; + if (($k$055 | 0) >= ($wk_max$160 | 0)) { + $76 = $59; + break; + } else $wk$056 = $wk$056 + 4 | 0; + } + } else $76 = $59; + } else { + HEAP16[$pnt2$359 >> 1] = $56; + if (($56 | 0) < ($59 | 0) & ($wk_max$160 | 0) > 0) { + $k$152 = 0; + $wk$153 = $16; + while (1) { + if ((HEAP32[$wk$153 >> 2] | 0) == ($59 | 0)) HEAP32[$wk$153 >> 2] = $56; + $k$152 = $k$152 + 1 | 0; + if (($k$152 | 0) >= ($wk_max$160 | 0)) { + $76 = $56; + break; + } else $wk$153 = $wk$153 + 4 | 0; + } + } else $76 = $56; + } + $78 = ($76 << 16 >> 16) * 7 | 0; + $80 = $labelInfo + 1310736 + ($78 + -7 << 2) | 0; + HEAP32[$80 >> 2] = (HEAP32[$80 >> 2] | 0) + 1; + $84 = $labelInfo + 1310736 + ($78 + -6 << 2) | 0; + HEAP32[$84 >> 2] = (HEAP32[$84 >> 2] | 0) + $i$265; + $88 = $labelInfo + 1310736 + ($78 + -5 << 2) | 0; + HEAP32[$88 >> 2] = (HEAP32[$88 >> 2] | 0) + $j$076; + HEAP32[$labelInfo + 1310736 + ($78 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $94 = HEAP16[$pnt2$359 + -2 >> 1] | 0; + if ($94 << 16 >> 16 <= 0) { + HEAP16[$pnt2$359 >> 1] = $47; + $134 = $48 * 7 | 0; + $136 = $labelInfo + 1310736 + ($134 + -7 << 2) | 0; + HEAP32[$136 >> 2] = (HEAP32[$136 >> 2] | 0) + 1; + $140 = $labelInfo + 1310736 + ($134 + -6 << 2) | 0; + HEAP32[$140 >> 2] = (HEAP32[$140 >> 2] | 0) + $i$265; + $144 = $labelInfo + 1310736 + ($134 + -5 << 2) | 0; + HEAP32[$144 >> 2] = (HEAP32[$144 >> 2] | 0) + $j$076; + $148 = $labelInfo + 1310736 + ($134 + -4 << 2) | 0; + if ((HEAP32[$148 >> 2] | 0) > ($i$265 | 0)) HEAP32[$148 >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($134 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $99 = HEAP32[$labelInfo + 1179664 + ($48 + -1 << 2) >> 2] | 0; + $102 = HEAP32[$labelInfo + 1179664 + (($94 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($99 | 0) > ($102 | 0)) { + HEAP16[$pnt2$359 >> 1] = $102; + if (($wk_max$160 | 0) > 0) { + $k$248 = 0; + $wk$249 = $16; + while (1) { + if ((HEAP32[$wk$249 >> 2] | 0) == ($99 | 0)) HEAP32[$wk$249 >> 2] = $102; + $k$248 = $k$248 + 1 | 0; + if (($k$248 | 0) >= ($wk_max$160 | 0)) { + $119 = $102; + break; + } else $wk$249 = $wk$249 + 4 | 0; + } + } else $119 = $102; + } else { + HEAP16[$pnt2$359 >> 1] = $99; + if (($99 | 0) < ($102 | 0) & ($wk_max$160 | 0) > 0) { + $k$345 = 0; + $wk$346 = $16; + while (1) { + if ((HEAP32[$wk$346 >> 2] | 0) == ($102 | 0)) HEAP32[$wk$346 >> 2] = $99; + $k$345 = $k$345 + 1 | 0; + if (($k$345 | 0) >= ($wk_max$160 | 0)) { + $119 = $99; + break; + } else $wk$346 = $wk$346 + 4 | 0; + } + } else $119 = $99; + } + $121 = ($119 << 16 >> 16) * 7 | 0; + $123 = $labelInfo + 1310736 + ($121 + -7 << 2) | 0; + HEAP32[$123 >> 2] = (HEAP32[$123 >> 2] | 0) + 1; + $127 = $labelInfo + 1310736 + ($121 + -6 << 2) | 0; + HEAP32[$127 >> 2] = (HEAP32[$127 >> 2] | 0) + $i$265; + $131 = $labelInfo + 1310736 + ($121 + -5 << 2) | 0; + HEAP32[$131 >> 2] = (HEAP32[$131 >> 2] | 0) + $j$076; + $wk_max$2 = $wk_max$160; + } else { + HEAP16[$pnt2$359 >> 1] = 0; + $wk_max$2 = $wk_max$160; + } while (0); + $i$265 = $i$265 + 1 | 0; + $213 = $pnt$168 + 1 | 0; + $214 = $pnt_thresh$167 + 1 | 0; + $215 = $pnt2$359 + 2 | 0; + if (($i$265 | 0) >= ($9 | 0)) { + $pnt$1$lcssa = $213; + $pnt2$3$lcssa = $215; + $pnt_thresh$1$lcssa = $214; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $pnt$168 = $213; + $pnt2$359 = $215; + $pnt_thresh$167 = $214; + $wk_max$160 = $wk_max$2; + } + } + } else { + $pnt$1$lcssa = $pnt$079; + $pnt2$3$lcssa = $pnt2$274; + $pnt_thresh$1$lcssa = $pnt_thresh$078; + $wk_max$1$lcssa = $wk_max$075; + } + $j$076 = $j$076 + 1 | 0; + if (($j$076 | 0) >= ($1 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $pnt$079 = $pnt$1$lcssa + 2 | 0; + $pnt2$274 = $pnt2$3$lcssa + 4 | 0; + $pnt_thresh$078 = $pnt_thresh$1$lcssa + 2 | 0; + $wk_max$075 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $222 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$341 = 1; + $j$142 = 1; + $wk$443 = $16; + while (1) { + $224 = HEAP32[$wk$443 >> 2] | 0; + if (($224 | 0) == ($i$341 | 0)) { + $230 = $j$142; + $j$2 = $j$142 + 1 | 0; + } else { + $230 = HEAP32[$labelInfo + 1179664 + ($224 + -1 << 2) >> 2] | 0; + $j$2 = $j$142; + } + HEAP32[$wk$443 >> 2] = $230; + if (($i$341 | 0) < ($wk_max$0$lcssa | 0)) { + $i$341 = $i$341 + 1 | 0; + $j$142 = $j$2; + $wk$443 = $wk$443 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $234 = $labelInfo + 8 | 0; + $235 = $j$1$lcssa + -1 | 0; + HEAP32[$234 >> 2] = $235; + if (!$235) $$0 = 0; else { + _memset($222 | 0, 0, $235 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $235 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$439 = 0; + do { + $242 = $i$439 << 2; + HEAP32[$labelInfo + 131084 + ($242 << 2) >> 2] = $xsize; + HEAP32[$labelInfo + 131084 + (($242 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($242 | 2) << 2) >> 2] = $ysize; + HEAP32[$labelInfo + 131084 + (($242 | 3) << 2) >> 2] = 0; + $i$439 = $i$439 + 1 | 0; + } while (($i$439 | 0) < (HEAP32[$234 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$537 = 0; + do { + $256 = (HEAP32[$labelInfo + 1179664 + ($i$537 << 2) >> 2] | 0) + -1 | 0; + $257 = $i$537 * 7 | 0; + $260 = $labelInfo + 12 + ($256 << 2) | 0; + HEAP32[$260 >> 2] = (HEAP32[$260 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($257 << 2) >> 2] | 0); + $267 = $256 << 1; + $268 = $labelInfo + 655376 + ($267 << 3) | 0; + HEAPF64[$268 >> 3] = +HEAPF64[$268 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($257 + 1 << 2) >> 2] | 0); + $276 = $labelInfo + 655376 + (($267 | 1) << 3) | 0; + HEAPF64[$276 >> 3] = +HEAPF64[$276 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($257 + 2 << 2) >> 2] | 0); + $279 = $256 << 2; + $280 = $labelInfo + 131084 + ($279 << 2) | 0; + $284 = HEAP32[$labelInfo + 1310736 + ($257 + 3 << 2) >> 2] | 0; + if ((HEAP32[$280 >> 2] | 0) > ($284 | 0)) HEAP32[$280 >> 2] = $284; + $287 = $labelInfo + 131084 + (($279 | 1) << 2) | 0; + $291 = HEAP32[$labelInfo + 1310736 + ($257 + 4 << 2) >> 2] | 0; + if ((HEAP32[$287 >> 2] | 0) < ($291 | 0)) HEAP32[$287 >> 2] = $291; + $294 = $labelInfo + 131084 + (($279 | 2) << 2) | 0; + $298 = HEAP32[$labelInfo + 1310736 + ($257 + 5 << 2) >> 2] | 0; + if ((HEAP32[$294 >> 2] | 0) > ($298 | 0)) HEAP32[$294 >> 2] = $298; + $301 = $labelInfo + 131084 + (($279 | 3) << 2) | 0; + $305 = HEAP32[$labelInfo + 1310736 + ($257 + 6 << 2) >> 2] | 0; + if ((HEAP32[$301 >> 2] | 0) < ($305 | 0)) HEAP32[$301 >> 2] = $305; + $i$537 = $i$537 + 1 | 0; + } while (($i$537 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$234 >> 2] | 0) > 0) { + $i$636 = 0; + do { + $309 = $labelInfo + 12 + ($i$636 << 2) | 0; + $312 = $i$636 << 1; + $313 = $labelInfo + 655376 + ($312 << 3) | 0; + HEAPF64[$313 >> 3] = +HEAPF64[$313 >> 3] / +(HEAP32[$309 >> 2] | 0); + $319 = $labelInfo + 655376 + (($312 | 1) << 3) | 0; + HEAPF64[$319 >> 3] = +HEAPF64[$319 >> 3] / +(HEAP32[$309 >> 2] | 0); + $i$636 = $i$636 + 1 | 0; + } while (($i$636 | 0) < (HEAP32[$234 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubDBZ($image, $xsize, $ysize, $image_thresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $image_thresh = $image_thresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $0 = 0, $1 = 0, $102 = 0, $119 = 0, $121 = 0, $123 = 0, $127 = 0, $131 = 0, $134 = 0, $136 = 0, $140 = 0, $144 = 0, $148 = 0, $153 = 0, $155 = 0, $159 = 0, $16 = 0, $163 = 0, $167 = 0, $17 = 0, $173 = 0, $176 = 0, $178 = 0, $18 = 0, $182 = 0, $186 = 0, $190 = 0, $193 = 0, $198 = 0, $213 = 0, $214 = 0, $215 = 0, $222 = 0, $224 = 0, $23 = 0, $230 = 0, $234 = 0, $235 = 0, $242 = 0, $256 = 0, $257 = 0, $260 = 0, $267 = 0, $268 = 0, $276 = 0, $279 = 0, $28 = 0, $280 = 0, $284 = 0, $287 = 0, $291 = 0, $294 = 0, $298 = 0, $301 = 0, $305 = 0, $309 = 0, $31 = 0, $312 = 0, $313 = 0, $319 = 0, $33 = 0, $37 = 0, $41 = 0, $47 = 0, $48 = 0, $51 = 0, $52 = 0, $53 = 0, $56 = 0, $59 = 0, $76 = 0, $78 = 0, $80 = 0, $84 = 0, $88 = 0, $9 = 0, $94 = 0, $99 = 0, $i$089 = 0, $i$183 = 0, $i$265 = 0, $i$341 = 0, $i$439 = 0, $i$537 = 0, $i$636 = 0, $j$076 = 0, $j$1$lcssa = 0, $j$142 = 0, $j$2 = 0, $k$055 = 0, $k$152 = 0, $k$248 = 0, $k$345 = 0, $pnt$079 = 0, $pnt$1$lcssa = 0, $pnt$168 = 0, $pnt1$090 = 0, $pnt1$184 = 0, $pnt2$088 = 0, $pnt2$182 = 0, $pnt2$274 = 0, $pnt2$3$lcssa = 0, $pnt2$359 = 0, $pnt_thresh$078 = 0, $pnt_thresh$1$lcssa = 0, $pnt_thresh$167 = 0, $vararg_buffer = 0, $wk$056 = 0, $wk$153 = 0, $wk$249 = 0, $wk$346 = 0, $wk$443 = 0, $wk_max$0$lcssa = 0, $wk_max$075 = 0, $wk_max$1$lcssa = 0, $wk_max$160 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = HEAP32[$labelInfo >> 2] | 0; + $1 = $ysize + -1 | 0; + if (($xsize | 0) > 0) { + $i$089 = 0; + $pnt1$090 = $0; + $pnt2$088 = $0 + ((Math_imul($1, $xsize) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$088 >> 1] = 0; + HEAP16[$pnt1$090 >> 1] = 0; + $i$089 = $i$089 + 1 | 0; + if (($i$089 | 0) >= ($xsize | 0)) break; else { + $pnt1$090 = $pnt1$090 + 2 | 0; + $pnt2$088 = $pnt2$088 + 2 | 0; + } + } + } + $9 = $xsize + -1 | 0; + if (($ysize | 0) > 0) { + $i$183 = 0; + $pnt1$184 = $0; + $pnt2$182 = $0 + ($9 << 1) | 0; + while (1) { + HEAP16[$pnt2$182 >> 1] = 0; + HEAP16[$pnt1$184 >> 1] = 0; + $i$183 = $i$183 + 1 | 0; + if (($i$183 | 0) >= ($ysize | 0)) break; else { + $pnt1$184 = $pnt1$184 + ($xsize << 1) | 0; + $pnt2$182 = $pnt2$182 + ($xsize << 1) | 0; + } + } + } + $16 = $labelInfo + 1179664 | 0; + $17 = $xsize + 1 | 0; + $18 = 0 - $xsize | 0; + $$sum = 1 - $xsize | 0; + $$sum1 = ~$xsize; + L11 : do if (($1 | 0) > 1) { + $23 = ($9 | 0) > 1; + $j$076 = 1; + $pnt$079 = $image + $17 | 0; + $pnt2$274 = $0 + ($17 << 1) | 0; + $pnt_thresh$078 = $image_thresh + $17 | 0; + $wk_max$075 = 0; + L13 : while (1) { + if ($23) { + $i$265 = 1; + $pnt$168 = $pnt$079; + $pnt2$359 = $pnt2$274; + $pnt_thresh$167 = $pnt_thresh$078; + $wk_max$160 = $wk_max$075; + while (1) { + do if ((HEAPU8[$pnt$168 >> 0] | 0) > (HEAPU8[$pnt_thresh$167 >> 0] | 0)) { + HEAP16[$pnt2$359 >> 1] = 0; + $wk_max$2 = $wk_max$160; + } else { + $28 = HEAP16[$pnt2$359 + ($18 << 1) >> 1] | 0; + if ($28 << 16 >> 16 > 0) { + HEAP16[$pnt2$359 >> 1] = $28; + $31 = ($28 << 16 >> 16) * 7 | 0; + $33 = $labelInfo + 1310736 + ($31 + -7 << 2) | 0; + HEAP32[$33 >> 2] = (HEAP32[$33 >> 2] | 0) + 1; + $37 = $labelInfo + 1310736 + ($31 + -6 << 2) | 0; + HEAP32[$37 >> 2] = (HEAP32[$37 >> 2] | 0) + $i$265; + $41 = $labelInfo + 1310736 + ($31 + -5 << 2) | 0; + HEAP32[$41 >> 2] = (HEAP32[$41 >> 2] | 0) + $j$076; + HEAP32[$labelInfo + 1310736 + ($31 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $47 = HEAP16[$pnt2$359 + ($$sum << 1) >> 1] | 0; + $48 = $47 << 16 >> 16; + $51 = HEAP16[$pnt2$359 + ($$sum1 << 1) >> 1] | 0; + $52 = $51 << 16 >> 16; + $53 = $51 << 16 >> 16 > 0; + if ($47 << 16 >> 16 <= 0) { + if ($53) { + HEAP16[$pnt2$359 >> 1] = $51; + $153 = $52 * 7 | 0; + $155 = $labelInfo + 1310736 + ($153 + -7 << 2) | 0; + HEAP32[$155 >> 2] = (HEAP32[$155 >> 2] | 0) + 1; + $159 = $labelInfo + 1310736 + ($153 + -6 << 2) | 0; + HEAP32[$159 >> 2] = (HEAP32[$159 >> 2] | 0) + $i$265; + $163 = $labelInfo + 1310736 + ($153 + -5 << 2) | 0; + HEAP32[$163 >> 2] = (HEAP32[$163 >> 2] | 0) + $j$076; + $167 = $labelInfo + 1310736 + ($153 + -3 << 2) | 0; + if ((HEAP32[$167 >> 2] | 0) < ($i$265 | 0)) HEAP32[$167 >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($153 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $173 = HEAP16[$pnt2$359 + -2 >> 1] | 0; + if ($173 << 16 >> 16 > 0) { + HEAP16[$pnt2$359 >> 1] = $173; + $176 = ($173 << 16 >> 16) * 7 | 0; + $178 = $labelInfo + 1310736 + ($176 + -7 << 2) | 0; + HEAP32[$178 >> 2] = (HEAP32[$178 >> 2] | 0) + 1; + $182 = $labelInfo + 1310736 + ($176 + -6 << 2) | 0; + HEAP32[$182 >> 2] = (HEAP32[$182 >> 2] | 0) + $i$265; + $186 = $labelInfo + 1310736 + ($176 + -5 << 2) | 0; + HEAP32[$186 >> 2] = (HEAP32[$186 >> 2] | 0) + $j$076; + $190 = $labelInfo + 1310736 + ($176 + -3 << 2) | 0; + if ((HEAP32[$190 >> 2] | 0) >= ($i$265 | 0)) { + $wk_max$2 = $wk_max$160; + break; + } + HEAP32[$190 >> 2] = $i$265; + $wk_max$2 = $wk_max$160; + break; + } else { + $193 = $wk_max$160 + 1 | 0; + if (($wk_max$160 | 0) > 32767) break L13; + HEAP16[$pnt2$359 >> 1] = $193; + HEAP32[$labelInfo + 1179664 + ($wk_max$160 << 2) >> 2] = $193 << 16 >> 16; + $198 = $wk_max$160 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($198 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($198 + 1 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($198 + 2 << 2) >> 2] = $j$076; + HEAP32[$labelInfo + 1310736 + ($198 + 3 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($198 + 4 << 2) >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($198 + 5 << 2) >> 2] = $j$076; + HEAP32[$labelInfo + 1310736 + ($198 + 6 << 2) >> 2] = $j$076; + $wk_max$2 = $193; + break; + } + } + if ($53) { + $56 = HEAP32[$labelInfo + 1179664 + ($48 + -1 << 2) >> 2] | 0; + $59 = HEAP32[$labelInfo + 1179664 + ($52 + -1 << 2) >> 2] | 0; + if (($56 | 0) > ($59 | 0)) { + HEAP16[$pnt2$359 >> 1] = $59; + if (($wk_max$160 | 0) > 0) { + $k$055 = 0; + $wk$056 = $16; + while (1) { + if ((HEAP32[$wk$056 >> 2] | 0) == ($56 | 0)) HEAP32[$wk$056 >> 2] = $59; + $k$055 = $k$055 + 1 | 0; + if (($k$055 | 0) >= ($wk_max$160 | 0)) { + $76 = $59; + break; + } else $wk$056 = $wk$056 + 4 | 0; + } + } else $76 = $59; + } else { + HEAP16[$pnt2$359 >> 1] = $56; + if (($56 | 0) < ($59 | 0) & ($wk_max$160 | 0) > 0) { + $k$152 = 0; + $wk$153 = $16; + while (1) { + if ((HEAP32[$wk$153 >> 2] | 0) == ($59 | 0)) HEAP32[$wk$153 >> 2] = $56; + $k$152 = $k$152 + 1 | 0; + if (($k$152 | 0) >= ($wk_max$160 | 0)) { + $76 = $56; + break; + } else $wk$153 = $wk$153 + 4 | 0; + } + } else $76 = $56; + } + $78 = ($76 << 16 >> 16) * 7 | 0; + $80 = $labelInfo + 1310736 + ($78 + -7 << 2) | 0; + HEAP32[$80 >> 2] = (HEAP32[$80 >> 2] | 0) + 1; + $84 = $labelInfo + 1310736 + ($78 + -6 << 2) | 0; + HEAP32[$84 >> 2] = (HEAP32[$84 >> 2] | 0) + $i$265; + $88 = $labelInfo + 1310736 + ($78 + -5 << 2) | 0; + HEAP32[$88 >> 2] = (HEAP32[$88 >> 2] | 0) + $j$076; + HEAP32[$labelInfo + 1310736 + ($78 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $94 = HEAP16[$pnt2$359 + -2 >> 1] | 0; + if ($94 << 16 >> 16 <= 0) { + HEAP16[$pnt2$359 >> 1] = $47; + $134 = $48 * 7 | 0; + $136 = $labelInfo + 1310736 + ($134 + -7 << 2) | 0; + HEAP32[$136 >> 2] = (HEAP32[$136 >> 2] | 0) + 1; + $140 = $labelInfo + 1310736 + ($134 + -6 << 2) | 0; + HEAP32[$140 >> 2] = (HEAP32[$140 >> 2] | 0) + $i$265; + $144 = $labelInfo + 1310736 + ($134 + -5 << 2) | 0; + HEAP32[$144 >> 2] = (HEAP32[$144 >> 2] | 0) + $j$076; + $148 = $labelInfo + 1310736 + ($134 + -4 << 2) | 0; + if ((HEAP32[$148 >> 2] | 0) > ($i$265 | 0)) HEAP32[$148 >> 2] = $i$265; + HEAP32[$labelInfo + 1310736 + ($134 + -1 << 2) >> 2] = $j$076; + $wk_max$2 = $wk_max$160; + break; + } + $99 = HEAP32[$labelInfo + 1179664 + ($48 + -1 << 2) >> 2] | 0; + $102 = HEAP32[$labelInfo + 1179664 + (($94 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($99 | 0) > ($102 | 0)) { + HEAP16[$pnt2$359 >> 1] = $102; + if (($wk_max$160 | 0) > 0) { + $k$248 = 0; + $wk$249 = $16; + while (1) { + if ((HEAP32[$wk$249 >> 2] | 0) == ($99 | 0)) HEAP32[$wk$249 >> 2] = $102; + $k$248 = $k$248 + 1 | 0; + if (($k$248 | 0) >= ($wk_max$160 | 0)) { + $119 = $102; + break; + } else $wk$249 = $wk$249 + 4 | 0; + } + } else $119 = $102; + } else { + HEAP16[$pnt2$359 >> 1] = $99; + if (($99 | 0) < ($102 | 0) & ($wk_max$160 | 0) > 0) { + $k$345 = 0; + $wk$346 = $16; + while (1) { + if ((HEAP32[$wk$346 >> 2] | 0) == ($102 | 0)) HEAP32[$wk$346 >> 2] = $99; + $k$345 = $k$345 + 1 | 0; + if (($k$345 | 0) >= ($wk_max$160 | 0)) { + $119 = $99; + break; + } else $wk$346 = $wk$346 + 4 | 0; + } + } else $119 = $99; + } + $121 = ($119 << 16 >> 16) * 7 | 0; + $123 = $labelInfo + 1310736 + ($121 + -7 << 2) | 0; + HEAP32[$123 >> 2] = (HEAP32[$123 >> 2] | 0) + 1; + $127 = $labelInfo + 1310736 + ($121 + -6 << 2) | 0; + HEAP32[$127 >> 2] = (HEAP32[$127 >> 2] | 0) + $i$265; + $131 = $labelInfo + 1310736 + ($121 + -5 << 2) | 0; + HEAP32[$131 >> 2] = (HEAP32[$131 >> 2] | 0) + $j$076; + $wk_max$2 = $wk_max$160; + } while (0); + $i$265 = $i$265 + 1 | 0; + $213 = $pnt$168 + 1 | 0; + $214 = $pnt_thresh$167 + 1 | 0; + $215 = $pnt2$359 + 2 | 0; + if (($i$265 | 0) >= ($9 | 0)) { + $pnt$1$lcssa = $213; + $pnt2$3$lcssa = $215; + $pnt_thresh$1$lcssa = $214; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $pnt$168 = $213; + $pnt2$359 = $215; + $pnt_thresh$167 = $214; + $wk_max$160 = $wk_max$2; + } + } + } else { + $pnt$1$lcssa = $pnt$079; + $pnt2$3$lcssa = $pnt2$274; + $pnt_thresh$1$lcssa = $pnt_thresh$078; + $wk_max$1$lcssa = $wk_max$075; + } + $j$076 = $j$076 + 1 | 0; + if (($j$076 | 0) >= ($1 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $pnt$079 = $pnt$1$lcssa + 2 | 0; + $pnt2$274 = $pnt2$3$lcssa + 4 | 0; + $pnt_thresh$078 = $pnt_thresh$1$lcssa + 2 | 0; + $wk_max$075 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $222 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$341 = 1; + $j$142 = 1; + $wk$443 = $16; + while (1) { + $224 = HEAP32[$wk$443 >> 2] | 0; + if (($224 | 0) == ($i$341 | 0)) { + $230 = $j$142; + $j$2 = $j$142 + 1 | 0; + } else { + $230 = HEAP32[$labelInfo + 1179664 + ($224 + -1 << 2) >> 2] | 0; + $j$2 = $j$142; + } + HEAP32[$wk$443 >> 2] = $230; + if (($i$341 | 0) < ($wk_max$0$lcssa | 0)) { + $i$341 = $i$341 + 1 | 0; + $j$142 = $j$2; + $wk$443 = $wk$443 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $234 = $labelInfo + 8 | 0; + $235 = $j$1$lcssa + -1 | 0; + HEAP32[$234 >> 2] = $235; + if (!$235) $$0 = 0; else { + _memset($222 | 0, 0, $235 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $235 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$439 = 0; + do { + $242 = $i$439 << 2; + HEAP32[$labelInfo + 131084 + ($242 << 2) >> 2] = $xsize; + HEAP32[$labelInfo + 131084 + (($242 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($242 | 2) << 2) >> 2] = $ysize; + HEAP32[$labelInfo + 131084 + (($242 | 3) << 2) >> 2] = 0; + $i$439 = $i$439 + 1 | 0; + } while (($i$439 | 0) < (HEAP32[$234 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$537 = 0; + do { + $256 = (HEAP32[$labelInfo + 1179664 + ($i$537 << 2) >> 2] | 0) + -1 | 0; + $257 = $i$537 * 7 | 0; + $260 = $labelInfo + 12 + ($256 << 2) | 0; + HEAP32[$260 >> 2] = (HEAP32[$260 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($257 << 2) >> 2] | 0); + $267 = $256 << 1; + $268 = $labelInfo + 655376 + ($267 << 3) | 0; + HEAPF64[$268 >> 3] = +HEAPF64[$268 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($257 + 1 << 2) >> 2] | 0); + $276 = $labelInfo + 655376 + (($267 | 1) << 3) | 0; + HEAPF64[$276 >> 3] = +HEAPF64[$276 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($257 + 2 << 2) >> 2] | 0); + $279 = $256 << 2; + $280 = $labelInfo + 131084 + ($279 << 2) | 0; + $284 = HEAP32[$labelInfo + 1310736 + ($257 + 3 << 2) >> 2] | 0; + if ((HEAP32[$280 >> 2] | 0) > ($284 | 0)) HEAP32[$280 >> 2] = $284; + $287 = $labelInfo + 131084 + (($279 | 1) << 2) | 0; + $291 = HEAP32[$labelInfo + 1310736 + ($257 + 4 << 2) >> 2] | 0; + if ((HEAP32[$287 >> 2] | 0) < ($291 | 0)) HEAP32[$287 >> 2] = $291; + $294 = $labelInfo + 131084 + (($279 | 2) << 2) | 0; + $298 = HEAP32[$labelInfo + 1310736 + ($257 + 5 << 2) >> 2] | 0; + if ((HEAP32[$294 >> 2] | 0) > ($298 | 0)) HEAP32[$294 >> 2] = $298; + $301 = $labelInfo + 131084 + (($279 | 3) << 2) | 0; + $305 = HEAP32[$labelInfo + 1310736 + ($257 + 6 << 2) >> 2] | 0; + if ((HEAP32[$301 >> 2] | 0) < ($305 | 0)) HEAP32[$301 >> 2] = $305; + $i$537 = $i$537 + 1 | 0; + } while (($i$537 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$234 >> 2] | 0) > 0) { + $i$636 = 0; + do { + $309 = $labelInfo + 12 + ($i$636 << 2) | 0; + $312 = $i$636 << 1; + $313 = $labelInfo + 655376 + ($312 << 3) | 0; + HEAPF64[$313 >> 3] = +HEAPF64[$313 >> 3] / +(HEAP32[$309 >> 2] | 0); + $319 = $labelInfo + 655376 + (($312 | 1) << 3) | 0; + HEAPF64[$319 >> 3] = +HEAPF64[$319 >> 3] / +(HEAP32[$309 >> 2] | 0); + $i$636 = $i$636 + 1 | 0; + } while (($i$636 | 0) < (HEAP32[$234 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubDWI3CA5551($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $$sum2 = 0, $0 = 0, $1 = 0, $103 = 0, $107 = 0, $11 = 0, $113 = 0, $118 = 0, $12 = 0, $121 = 0, $138 = 0, $140 = 0, $142 = 0, $146 = 0, $150 = 0, $153 = 0, $155 = 0, $159 = 0, $163 = 0, $167 = 0, $172 = 0, $174 = 0, $178 = 0, $182 = 0, $186 = 0, $19 = 0, $192 = 0, $195 = 0, $197 = 0, $2 = 0, $201 = 0, $205 = 0, $209 = 0, $21 = 0, $212 = 0, $217 = 0, $232 = 0, $233 = 0, $239 = 0, $241 = 0, $247 = 0, $251 = 0, $252 = 0, $259 = 0, $273 = 0, $274 = 0, $277 = 0, $28 = 0, $284 = 0, $285 = 0, $293 = 0, $296 = 0, $297 = 0, $3 = 0, $30 = 0, $301 = 0, $304 = 0, $308 = 0, $311 = 0, $315 = 0, $318 = 0, $322 = 0, $326 = 0, $329 = 0, $330 = 0, $336 = 0, $36 = 0, $47 = 0, $50 = 0, $52 = 0, $56 = 0, $60 = 0, $66 = 0, $67 = 0, $70 = 0, $71 = 0, $72 = 0, $75 = 0, $78 = 0, $95 = 0, $97 = 0, $99 = 0, $i$082 = 0, $i$176 = 0, $i$256 = 0, $i$338 = 0, $i$436 = 0, $i$534 = 0, $i$633 = 0, $j$069 = 0, $j$1$lcssa = 0, $j$139 = 0, $j$2 = 0, $k$052 = 0, $k$149 = 0, $k$245 = 0, $k$342 = 0, $pnt$073 = 0, $pnt$1$lcssa = 0, $pnt$164 = 0, $pnt1$084 = 0, $pnt1$178 = 0, $pnt2$083 = 0, $pnt2$177 = 0, $pnt2$272 = 0, $pnt2$3$lcssa = 0, $pnt2$363 = 0, $vararg_buffer = 0, $wk$053 = 0, $wk$150 = 0, $wk$246 = 0, $wk$343 = 0, $wk$440 = 0, $wk_max$0$lcssa = 0, $wk_max$071 = 0, $wk_max$1$lcssa = 0, $wk_max$158 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = ($xsize | 0) / 2 | 0; + $1 = ($ysize | 0) / 2 | 0; + $2 = HEAP32[$labelInfo >> 2] | 0; + $3 = $1 + -1 | 0; + if (($xsize | 0) > 1) { + $i$082 = 0; + $pnt1$084 = $2; + $pnt2$083 = $2 + ((Math_imul($3, $0) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$083 >> 1] = 0; + HEAP16[$pnt1$084 >> 1] = 0; + $i$082 = $i$082 + 1 | 0; + if (($i$082 | 0) >= ($0 | 0)) break; else { + $pnt1$084 = $pnt1$084 + 2 | 0; + $pnt2$083 = $pnt2$083 + 2 | 0; + } + } + } + $11 = $labelingThresh * 3 | 0; + $12 = $0 + -1 | 0; + if (($ysize | 0) > 1) { + $i$176 = 0; + $pnt1$178 = $2; + $pnt2$177 = $2 + ($12 << 1) | 0; + while (1) { + HEAP16[$pnt2$177 >> 1] = 0; + HEAP16[$pnt1$178 >> 1] = 0; + $i$176 = $i$176 + 1 | 0; + if (($i$176 | 0) >= ($1 | 0)) break; else { + $pnt1$178 = $pnt1$178 + ($0 << 1) | 0; + $pnt2$177 = $pnt2$177 + ($0 << 1) | 0; + } + } + } + $19 = $labelInfo + 1179664 | 0; + $21 = 0 - $0 | 0; + $$sum1 = 1 - $0 | 0; + $$sum2 = ~$0; + $$sum = ($xsize << 1) + 8 | 0; + L11 : do if (($3 | 0) > 1) { + $28 = ($12 | 0) > 1; + $j$069 = 1; + $pnt$073 = $image + (($xsize << 2) + 4) | 0; + $pnt2$272 = $2 + ($0 + 1 << 1) | 0; + $wk_max$071 = 0; + L13 : while (1) { + if ($28) { + $i$256 = 1; + $pnt$164 = $pnt$073; + $pnt2$363 = $pnt2$272; + $wk_max$158 = $wk_max$071; + while (1) { + $30 = HEAPU8[$pnt$164 >> 0] | 0; + $36 = HEAPU8[$pnt$164 + 1 >> 0] | 0; + do if ((($30 & 248) + 12 + ($30 << 5 & 224) + ($36 >>> 3 & 24) + ($36 << 2 & 248) | 0) > ($11 | 0)) { + $47 = HEAP16[$pnt2$363 + ($21 << 1) >> 1] | 0; + if ($47 << 16 >> 16 > 0) { + HEAP16[$pnt2$363 >> 1] = $47; + $50 = ($47 << 16 >> 16) * 7 | 0; + $52 = $labelInfo + 1310736 + ($50 + -7 << 2) | 0; + HEAP32[$52 >> 2] = (HEAP32[$52 >> 2] | 0) + 1; + $56 = $labelInfo + 1310736 + ($50 + -6 << 2) | 0; + HEAP32[$56 >> 2] = (HEAP32[$56 >> 2] | 0) + $i$256; + $60 = $labelInfo + 1310736 + ($50 + -5 << 2) | 0; + HEAP32[$60 >> 2] = (HEAP32[$60 >> 2] | 0) + $j$069; + HEAP32[$labelInfo + 1310736 + ($50 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $66 = HEAP16[$pnt2$363 + ($$sum1 << 1) >> 1] | 0; + $67 = $66 << 16 >> 16; + $70 = HEAP16[$pnt2$363 + ($$sum2 << 1) >> 1] | 0; + $71 = $70 << 16 >> 16; + $72 = $70 << 16 >> 16 > 0; + if ($66 << 16 >> 16 <= 0) { + if ($72) { + HEAP16[$pnt2$363 >> 1] = $70; + $172 = $71 * 7 | 0; + $174 = $labelInfo + 1310736 + ($172 + -7 << 2) | 0; + HEAP32[$174 >> 2] = (HEAP32[$174 >> 2] | 0) + 1; + $178 = $labelInfo + 1310736 + ($172 + -6 << 2) | 0; + HEAP32[$178 >> 2] = (HEAP32[$178 >> 2] | 0) + $i$256; + $182 = $labelInfo + 1310736 + ($172 + -5 << 2) | 0; + HEAP32[$182 >> 2] = (HEAP32[$182 >> 2] | 0) + $j$069; + $186 = $labelInfo + 1310736 + ($172 + -3 << 2) | 0; + if ((HEAP32[$186 >> 2] | 0) < ($i$256 | 0)) HEAP32[$186 >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($172 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $192 = HEAP16[$pnt2$363 + -2 >> 1] | 0; + if ($192 << 16 >> 16 > 0) { + HEAP16[$pnt2$363 >> 1] = $192; + $195 = ($192 << 16 >> 16) * 7 | 0; + $197 = $labelInfo + 1310736 + ($195 + -7 << 2) | 0; + HEAP32[$197 >> 2] = (HEAP32[$197 >> 2] | 0) + 1; + $201 = $labelInfo + 1310736 + ($195 + -6 << 2) | 0; + HEAP32[$201 >> 2] = (HEAP32[$201 >> 2] | 0) + $i$256; + $205 = $labelInfo + 1310736 + ($195 + -5 << 2) | 0; + HEAP32[$205 >> 2] = (HEAP32[$205 >> 2] | 0) + $j$069; + $209 = $labelInfo + 1310736 + ($195 + -3 << 2) | 0; + if ((HEAP32[$209 >> 2] | 0) >= ($i$256 | 0)) { + $wk_max$2 = $wk_max$158; + break; + } + HEAP32[$209 >> 2] = $i$256; + $wk_max$2 = $wk_max$158; + break; + } else { + $212 = $wk_max$158 + 1 | 0; + if (($wk_max$158 | 0) > 32767) break L13; + HEAP16[$pnt2$363 >> 1] = $212; + HEAP32[$labelInfo + 1179664 + ($wk_max$158 << 2) >> 2] = $212 << 16 >> 16; + $217 = $wk_max$158 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($217 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($217 + 1 << 2) >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($217 + 2 << 2) >> 2] = $j$069; + HEAP32[$labelInfo + 1310736 + ($217 + 3 << 2) >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($217 + 4 << 2) >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($217 + 5 << 2) >> 2] = $j$069; + HEAP32[$labelInfo + 1310736 + ($217 + 6 << 2) >> 2] = $j$069; + $wk_max$2 = $212; + break; + } + } + if ($72) { + $75 = HEAP32[$labelInfo + 1179664 + ($67 + -1 << 2) >> 2] | 0; + $78 = HEAP32[$labelInfo + 1179664 + ($71 + -1 << 2) >> 2] | 0; + if (($75 | 0) > ($78 | 0)) { + HEAP16[$pnt2$363 >> 1] = $78; + if (($wk_max$158 | 0) > 0) { + $k$052 = 0; + $wk$053 = $19; + while (1) { + if ((HEAP32[$wk$053 >> 2] | 0) == ($75 | 0)) HEAP32[$wk$053 >> 2] = $78; + $k$052 = $k$052 + 1 | 0; + if (($k$052 | 0) >= ($wk_max$158 | 0)) { + $95 = $78; + break; + } else $wk$053 = $wk$053 + 4 | 0; + } + } else $95 = $78; + } else { + HEAP16[$pnt2$363 >> 1] = $75; + if (($75 | 0) < ($78 | 0) & ($wk_max$158 | 0) > 0) { + $k$149 = 0; + $wk$150 = $19; + while (1) { + if ((HEAP32[$wk$150 >> 2] | 0) == ($78 | 0)) HEAP32[$wk$150 >> 2] = $75; + $k$149 = $k$149 + 1 | 0; + if (($k$149 | 0) >= ($wk_max$158 | 0)) { + $95 = $75; + break; + } else $wk$150 = $wk$150 + 4 | 0; + } + } else $95 = $75; + } + $97 = ($95 << 16 >> 16) * 7 | 0; + $99 = $labelInfo + 1310736 + ($97 + -7 << 2) | 0; + HEAP32[$99 >> 2] = (HEAP32[$99 >> 2] | 0) + 1; + $103 = $labelInfo + 1310736 + ($97 + -6 << 2) | 0; + HEAP32[$103 >> 2] = (HEAP32[$103 >> 2] | 0) + $i$256; + $107 = $labelInfo + 1310736 + ($97 + -5 << 2) | 0; + HEAP32[$107 >> 2] = (HEAP32[$107 >> 2] | 0) + $j$069; + HEAP32[$labelInfo + 1310736 + ($97 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $113 = HEAP16[$pnt2$363 + -2 >> 1] | 0; + if ($113 << 16 >> 16 <= 0) { + HEAP16[$pnt2$363 >> 1] = $66; + $153 = $67 * 7 | 0; + $155 = $labelInfo + 1310736 + ($153 + -7 << 2) | 0; + HEAP32[$155 >> 2] = (HEAP32[$155 >> 2] | 0) + 1; + $159 = $labelInfo + 1310736 + ($153 + -6 << 2) | 0; + HEAP32[$159 >> 2] = (HEAP32[$159 >> 2] | 0) + $i$256; + $163 = $labelInfo + 1310736 + ($153 + -5 << 2) | 0; + HEAP32[$163 >> 2] = (HEAP32[$163 >> 2] | 0) + $j$069; + $167 = $labelInfo + 1310736 + ($153 + -4 << 2) | 0; + if ((HEAP32[$167 >> 2] | 0) > ($i$256 | 0)) HEAP32[$167 >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($153 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $118 = HEAP32[$labelInfo + 1179664 + ($67 + -1 << 2) >> 2] | 0; + $121 = HEAP32[$labelInfo + 1179664 + (($113 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($118 | 0) > ($121 | 0)) { + HEAP16[$pnt2$363 >> 1] = $121; + if (($wk_max$158 | 0) > 0) { + $k$245 = 0; + $wk$246 = $19; + while (1) { + if ((HEAP32[$wk$246 >> 2] | 0) == ($118 | 0)) HEAP32[$wk$246 >> 2] = $121; + $k$245 = $k$245 + 1 | 0; + if (($k$245 | 0) >= ($wk_max$158 | 0)) { + $138 = $121; + break; + } else $wk$246 = $wk$246 + 4 | 0; + } + } else $138 = $121; + } else { + HEAP16[$pnt2$363 >> 1] = $118; + if (($118 | 0) < ($121 | 0) & ($wk_max$158 | 0) > 0) { + $k$342 = 0; + $wk$343 = $19; + while (1) { + if ((HEAP32[$wk$343 >> 2] | 0) == ($121 | 0)) HEAP32[$wk$343 >> 2] = $118; + $k$342 = $k$342 + 1 | 0; + if (($k$342 | 0) >= ($wk_max$158 | 0)) { + $138 = $118; + break; + } else $wk$343 = $wk$343 + 4 | 0; + } + } else $138 = $118; + } + $140 = ($138 << 16 >> 16) * 7 | 0; + $142 = $labelInfo + 1310736 + ($140 + -7 << 2) | 0; + HEAP32[$142 >> 2] = (HEAP32[$142 >> 2] | 0) + 1; + $146 = $labelInfo + 1310736 + ($140 + -6 << 2) | 0; + HEAP32[$146 >> 2] = (HEAP32[$146 >> 2] | 0) + $i$256; + $150 = $labelInfo + 1310736 + ($140 + -5 << 2) | 0; + HEAP32[$150 >> 2] = (HEAP32[$150 >> 2] | 0) + $j$069; + $wk_max$2 = $wk_max$158; + } else { + HEAP16[$pnt2$363 >> 1] = 0; + $wk_max$2 = $wk_max$158; + } while (0); + $i$256 = $i$256 + 1 | 0; + $232 = $pnt$164 + 4 | 0; + $233 = $pnt2$363 + 2 | 0; + if (($i$256 | 0) >= ($12 | 0)) { + $pnt$1$lcssa = $232; + $pnt2$3$lcssa = $233; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $pnt$164 = $232; + $pnt2$363 = $233; + $wk_max$158 = $wk_max$2; + } + } + } else { + $pnt$1$lcssa = $pnt$073; + $pnt2$3$lcssa = $pnt2$272; + $wk_max$1$lcssa = $wk_max$071; + } + $j$069 = $j$069 + 1 | 0; + if (($j$069 | 0) >= ($3 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $pnt$073 = $pnt$1$lcssa + $$sum | 0; + $pnt2$272 = $pnt2$3$lcssa + 4 | 0; + $wk_max$071 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $239 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$338 = 1; + $j$139 = 1; + $wk$440 = $19; + while (1) { + $241 = HEAP32[$wk$440 >> 2] | 0; + if (($241 | 0) == ($i$338 | 0)) { + $247 = $j$139; + $j$2 = $j$139 + 1 | 0; + } else { + $247 = HEAP32[$labelInfo + 1179664 + ($241 + -1 << 2) >> 2] | 0; + $j$2 = $j$139; + } + HEAP32[$wk$440 >> 2] = $247; + if (($i$338 | 0) < ($wk_max$0$lcssa | 0)) { + $i$338 = $i$338 + 1 | 0; + $j$139 = $j$2; + $wk$440 = $wk$440 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $251 = $labelInfo + 8 | 0; + $252 = $j$1$lcssa + -1 | 0; + HEAP32[$251 >> 2] = $252; + if (!$252) $$0 = 0; else { + _memset($239 | 0, 0, $252 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $252 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$436 = 0; + do { + $259 = $i$436 << 2; + HEAP32[$labelInfo + 131084 + ($259 << 2) >> 2] = $0; + HEAP32[$labelInfo + 131084 + (($259 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($259 | 2) << 2) >> 2] = $1; + HEAP32[$labelInfo + 131084 + (($259 | 3) << 2) >> 2] = 0; + $i$436 = $i$436 + 1 | 0; + } while (($i$436 | 0) < (HEAP32[$251 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$534 = 0; + do { + $273 = (HEAP32[$labelInfo + 1179664 + ($i$534 << 2) >> 2] | 0) + -1 | 0; + $274 = $i$534 * 7 | 0; + $277 = $labelInfo + 12 + ($273 << 2) | 0; + HEAP32[$277 >> 2] = (HEAP32[$277 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($274 << 2) >> 2] | 0); + $284 = $273 << 1; + $285 = $labelInfo + 655376 + ($284 << 3) | 0; + HEAPF64[$285 >> 3] = +HEAPF64[$285 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($274 + 1 << 2) >> 2] | 0); + $293 = $labelInfo + 655376 + (($284 | 1) << 3) | 0; + HEAPF64[$293 >> 3] = +HEAPF64[$293 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($274 + 2 << 2) >> 2] | 0); + $296 = $273 << 2; + $297 = $labelInfo + 131084 + ($296 << 2) | 0; + $301 = HEAP32[$labelInfo + 1310736 + ($274 + 3 << 2) >> 2] | 0; + if ((HEAP32[$297 >> 2] | 0) > ($301 | 0)) HEAP32[$297 >> 2] = $301; + $304 = $labelInfo + 131084 + (($296 | 1) << 2) | 0; + $308 = HEAP32[$labelInfo + 1310736 + ($274 + 4 << 2) >> 2] | 0; + if ((HEAP32[$304 >> 2] | 0) < ($308 | 0)) HEAP32[$304 >> 2] = $308; + $311 = $labelInfo + 131084 + (($296 | 2) << 2) | 0; + $315 = HEAP32[$labelInfo + 1310736 + ($274 + 5 << 2) >> 2] | 0; + if ((HEAP32[$311 >> 2] | 0) > ($315 | 0)) HEAP32[$311 >> 2] = $315; + $318 = $labelInfo + 131084 + (($296 | 3) << 2) | 0; + $322 = HEAP32[$labelInfo + 1310736 + ($274 + 6 << 2) >> 2] | 0; + if ((HEAP32[$318 >> 2] | 0) < ($322 | 0)) HEAP32[$318 >> 2] = $322; + $i$534 = $i$534 + 1 | 0; + } while (($i$534 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$251 >> 2] | 0) > 0) { + $i$633 = 0; + do { + $326 = $labelInfo + 12 + ($i$633 << 2) | 0; + $329 = $i$633 << 1; + $330 = $labelInfo + 655376 + ($329 << 3) | 0; + HEAPF64[$330 >> 3] = +HEAPF64[$330 >> 3] / +(HEAP32[$326 >> 2] | 0); + $336 = $labelInfo + 655376 + (($329 | 1) << 3) | 0; + HEAPF64[$336 >> 3] = +HEAPF64[$336 >> 3] / +(HEAP32[$326 >> 2] | 0); + $i$633 = $i$633 + 1 | 0; + } while (($i$633 | 0) < (HEAP32[$251 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubDBI3CA5551($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $$sum2 = 0, $0 = 0, $1 = 0, $103 = 0, $107 = 0, $11 = 0, $113 = 0, $118 = 0, $12 = 0, $121 = 0, $138 = 0, $140 = 0, $142 = 0, $146 = 0, $150 = 0, $153 = 0, $155 = 0, $159 = 0, $163 = 0, $167 = 0, $172 = 0, $174 = 0, $178 = 0, $182 = 0, $186 = 0, $19 = 0, $192 = 0, $195 = 0, $197 = 0, $2 = 0, $201 = 0, $205 = 0, $209 = 0, $21 = 0, $212 = 0, $217 = 0, $232 = 0, $233 = 0, $239 = 0, $241 = 0, $247 = 0, $251 = 0, $252 = 0, $259 = 0, $273 = 0, $274 = 0, $277 = 0, $28 = 0, $284 = 0, $285 = 0, $293 = 0, $296 = 0, $297 = 0, $3 = 0, $30 = 0, $301 = 0, $304 = 0, $308 = 0, $311 = 0, $315 = 0, $318 = 0, $322 = 0, $326 = 0, $329 = 0, $330 = 0, $336 = 0, $36 = 0, $47 = 0, $50 = 0, $52 = 0, $56 = 0, $60 = 0, $66 = 0, $67 = 0, $70 = 0, $71 = 0, $72 = 0, $75 = 0, $78 = 0, $95 = 0, $97 = 0, $99 = 0, $i$082 = 0, $i$176 = 0, $i$256 = 0, $i$338 = 0, $i$436 = 0, $i$534 = 0, $i$633 = 0, $j$069 = 0, $j$1$lcssa = 0, $j$139 = 0, $j$2 = 0, $k$052 = 0, $k$149 = 0, $k$245 = 0, $k$342 = 0, $pnt$073 = 0, $pnt$1$lcssa = 0, $pnt$164 = 0, $pnt1$084 = 0, $pnt1$178 = 0, $pnt2$083 = 0, $pnt2$177 = 0, $pnt2$272 = 0, $pnt2$3$lcssa = 0, $pnt2$363 = 0, $vararg_buffer = 0, $wk$053 = 0, $wk$150 = 0, $wk$246 = 0, $wk$343 = 0, $wk$440 = 0, $wk_max$0$lcssa = 0, $wk_max$071 = 0, $wk_max$1$lcssa = 0, $wk_max$158 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = ($xsize | 0) / 2 | 0; + $1 = ($ysize | 0) / 2 | 0; + $2 = HEAP32[$labelInfo >> 2] | 0; + $3 = $1 + -1 | 0; + if (($xsize | 0) > 1) { + $i$082 = 0; + $pnt1$084 = $2; + $pnt2$083 = $2 + ((Math_imul($3, $0) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$083 >> 1] = 0; + HEAP16[$pnt1$084 >> 1] = 0; + $i$082 = $i$082 + 1 | 0; + if (($i$082 | 0) >= ($0 | 0)) break; else { + $pnt1$084 = $pnt1$084 + 2 | 0; + $pnt2$083 = $pnt2$083 + 2 | 0; + } + } + } + $11 = $labelingThresh * 3 | 0; + $12 = $0 + -1 | 0; + if (($ysize | 0) > 1) { + $i$176 = 0; + $pnt1$178 = $2; + $pnt2$177 = $2 + ($12 << 1) | 0; + while (1) { + HEAP16[$pnt2$177 >> 1] = 0; + HEAP16[$pnt1$178 >> 1] = 0; + $i$176 = $i$176 + 1 | 0; + if (($i$176 | 0) >= ($1 | 0)) break; else { + $pnt1$178 = $pnt1$178 + ($0 << 1) | 0; + $pnt2$177 = $pnt2$177 + ($0 << 1) | 0; + } + } + } + $19 = $labelInfo + 1179664 | 0; + $21 = 0 - $0 | 0; + $$sum1 = 1 - $0 | 0; + $$sum2 = ~$0; + $$sum = ($xsize << 1) + 8 | 0; + L11 : do if (($3 | 0) > 1) { + $28 = ($12 | 0) > 1; + $j$069 = 1; + $pnt$073 = $image + (($xsize << 2) + 4) | 0; + $pnt2$272 = $2 + ($0 + 1 << 1) | 0; + $wk_max$071 = 0; + L13 : while (1) { + if ($28) { + $i$256 = 1; + $pnt$164 = $pnt$073; + $pnt2$363 = $pnt2$272; + $wk_max$158 = $wk_max$071; + while (1) { + $30 = HEAPU8[$pnt$164 >> 0] | 0; + $36 = HEAPU8[$pnt$164 + 1 >> 0] | 0; + do if ((($30 & 248) + 12 + ($30 << 5 & 224) + ($36 >>> 3 & 24) + ($36 << 2 & 248) | 0) > ($11 | 0)) { + HEAP16[$pnt2$363 >> 1] = 0; + $wk_max$2 = $wk_max$158; + } else { + $47 = HEAP16[$pnt2$363 + ($21 << 1) >> 1] | 0; + if ($47 << 16 >> 16 > 0) { + HEAP16[$pnt2$363 >> 1] = $47; + $50 = ($47 << 16 >> 16) * 7 | 0; + $52 = $labelInfo + 1310736 + ($50 + -7 << 2) | 0; + HEAP32[$52 >> 2] = (HEAP32[$52 >> 2] | 0) + 1; + $56 = $labelInfo + 1310736 + ($50 + -6 << 2) | 0; + HEAP32[$56 >> 2] = (HEAP32[$56 >> 2] | 0) + $i$256; + $60 = $labelInfo + 1310736 + ($50 + -5 << 2) | 0; + HEAP32[$60 >> 2] = (HEAP32[$60 >> 2] | 0) + $j$069; + HEAP32[$labelInfo + 1310736 + ($50 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $66 = HEAP16[$pnt2$363 + ($$sum1 << 1) >> 1] | 0; + $67 = $66 << 16 >> 16; + $70 = HEAP16[$pnt2$363 + ($$sum2 << 1) >> 1] | 0; + $71 = $70 << 16 >> 16; + $72 = $70 << 16 >> 16 > 0; + if ($66 << 16 >> 16 <= 0) { + if ($72) { + HEAP16[$pnt2$363 >> 1] = $70; + $172 = $71 * 7 | 0; + $174 = $labelInfo + 1310736 + ($172 + -7 << 2) | 0; + HEAP32[$174 >> 2] = (HEAP32[$174 >> 2] | 0) + 1; + $178 = $labelInfo + 1310736 + ($172 + -6 << 2) | 0; + HEAP32[$178 >> 2] = (HEAP32[$178 >> 2] | 0) + $i$256; + $182 = $labelInfo + 1310736 + ($172 + -5 << 2) | 0; + HEAP32[$182 >> 2] = (HEAP32[$182 >> 2] | 0) + $j$069; + $186 = $labelInfo + 1310736 + ($172 + -3 << 2) | 0; + if ((HEAP32[$186 >> 2] | 0) < ($i$256 | 0)) HEAP32[$186 >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($172 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $192 = HEAP16[$pnt2$363 + -2 >> 1] | 0; + if ($192 << 16 >> 16 > 0) { + HEAP16[$pnt2$363 >> 1] = $192; + $195 = ($192 << 16 >> 16) * 7 | 0; + $197 = $labelInfo + 1310736 + ($195 + -7 << 2) | 0; + HEAP32[$197 >> 2] = (HEAP32[$197 >> 2] | 0) + 1; + $201 = $labelInfo + 1310736 + ($195 + -6 << 2) | 0; + HEAP32[$201 >> 2] = (HEAP32[$201 >> 2] | 0) + $i$256; + $205 = $labelInfo + 1310736 + ($195 + -5 << 2) | 0; + HEAP32[$205 >> 2] = (HEAP32[$205 >> 2] | 0) + $j$069; + $209 = $labelInfo + 1310736 + ($195 + -3 << 2) | 0; + if ((HEAP32[$209 >> 2] | 0) >= ($i$256 | 0)) { + $wk_max$2 = $wk_max$158; + break; + } + HEAP32[$209 >> 2] = $i$256; + $wk_max$2 = $wk_max$158; + break; + } else { + $212 = $wk_max$158 + 1 | 0; + if (($wk_max$158 | 0) > 32767) break L13; + HEAP16[$pnt2$363 >> 1] = $212; + HEAP32[$labelInfo + 1179664 + ($wk_max$158 << 2) >> 2] = $212 << 16 >> 16; + $217 = $wk_max$158 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($217 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($217 + 1 << 2) >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($217 + 2 << 2) >> 2] = $j$069; + HEAP32[$labelInfo + 1310736 + ($217 + 3 << 2) >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($217 + 4 << 2) >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($217 + 5 << 2) >> 2] = $j$069; + HEAP32[$labelInfo + 1310736 + ($217 + 6 << 2) >> 2] = $j$069; + $wk_max$2 = $212; + break; + } + } + if ($72) { + $75 = HEAP32[$labelInfo + 1179664 + ($67 + -1 << 2) >> 2] | 0; + $78 = HEAP32[$labelInfo + 1179664 + ($71 + -1 << 2) >> 2] | 0; + if (($75 | 0) > ($78 | 0)) { + HEAP16[$pnt2$363 >> 1] = $78; + if (($wk_max$158 | 0) > 0) { + $k$052 = 0; + $wk$053 = $19; + while (1) { + if ((HEAP32[$wk$053 >> 2] | 0) == ($75 | 0)) HEAP32[$wk$053 >> 2] = $78; + $k$052 = $k$052 + 1 | 0; + if (($k$052 | 0) >= ($wk_max$158 | 0)) { + $95 = $78; + break; + } else $wk$053 = $wk$053 + 4 | 0; + } + } else $95 = $78; + } else { + HEAP16[$pnt2$363 >> 1] = $75; + if (($75 | 0) < ($78 | 0) & ($wk_max$158 | 0) > 0) { + $k$149 = 0; + $wk$150 = $19; + while (1) { + if ((HEAP32[$wk$150 >> 2] | 0) == ($78 | 0)) HEAP32[$wk$150 >> 2] = $75; + $k$149 = $k$149 + 1 | 0; + if (($k$149 | 0) >= ($wk_max$158 | 0)) { + $95 = $75; + break; + } else $wk$150 = $wk$150 + 4 | 0; + } + } else $95 = $75; + } + $97 = ($95 << 16 >> 16) * 7 | 0; + $99 = $labelInfo + 1310736 + ($97 + -7 << 2) | 0; + HEAP32[$99 >> 2] = (HEAP32[$99 >> 2] | 0) + 1; + $103 = $labelInfo + 1310736 + ($97 + -6 << 2) | 0; + HEAP32[$103 >> 2] = (HEAP32[$103 >> 2] | 0) + $i$256; + $107 = $labelInfo + 1310736 + ($97 + -5 << 2) | 0; + HEAP32[$107 >> 2] = (HEAP32[$107 >> 2] | 0) + $j$069; + HEAP32[$labelInfo + 1310736 + ($97 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $113 = HEAP16[$pnt2$363 + -2 >> 1] | 0; + if ($113 << 16 >> 16 <= 0) { + HEAP16[$pnt2$363 >> 1] = $66; + $153 = $67 * 7 | 0; + $155 = $labelInfo + 1310736 + ($153 + -7 << 2) | 0; + HEAP32[$155 >> 2] = (HEAP32[$155 >> 2] | 0) + 1; + $159 = $labelInfo + 1310736 + ($153 + -6 << 2) | 0; + HEAP32[$159 >> 2] = (HEAP32[$159 >> 2] | 0) + $i$256; + $163 = $labelInfo + 1310736 + ($153 + -5 << 2) | 0; + HEAP32[$163 >> 2] = (HEAP32[$163 >> 2] | 0) + $j$069; + $167 = $labelInfo + 1310736 + ($153 + -4 << 2) | 0; + if ((HEAP32[$167 >> 2] | 0) > ($i$256 | 0)) HEAP32[$167 >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($153 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $118 = HEAP32[$labelInfo + 1179664 + ($67 + -1 << 2) >> 2] | 0; + $121 = HEAP32[$labelInfo + 1179664 + (($113 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($118 | 0) > ($121 | 0)) { + HEAP16[$pnt2$363 >> 1] = $121; + if (($wk_max$158 | 0) > 0) { + $k$245 = 0; + $wk$246 = $19; + while (1) { + if ((HEAP32[$wk$246 >> 2] | 0) == ($118 | 0)) HEAP32[$wk$246 >> 2] = $121; + $k$245 = $k$245 + 1 | 0; + if (($k$245 | 0) >= ($wk_max$158 | 0)) { + $138 = $121; + break; + } else $wk$246 = $wk$246 + 4 | 0; + } + } else $138 = $121; + } else { + HEAP16[$pnt2$363 >> 1] = $118; + if (($118 | 0) < ($121 | 0) & ($wk_max$158 | 0) > 0) { + $k$342 = 0; + $wk$343 = $19; + while (1) { + if ((HEAP32[$wk$343 >> 2] | 0) == ($121 | 0)) HEAP32[$wk$343 >> 2] = $118; + $k$342 = $k$342 + 1 | 0; + if (($k$342 | 0) >= ($wk_max$158 | 0)) { + $138 = $118; + break; + } else $wk$343 = $wk$343 + 4 | 0; + } + } else $138 = $118; + } + $140 = ($138 << 16 >> 16) * 7 | 0; + $142 = $labelInfo + 1310736 + ($140 + -7 << 2) | 0; + HEAP32[$142 >> 2] = (HEAP32[$142 >> 2] | 0) + 1; + $146 = $labelInfo + 1310736 + ($140 + -6 << 2) | 0; + HEAP32[$146 >> 2] = (HEAP32[$146 >> 2] | 0) + $i$256; + $150 = $labelInfo + 1310736 + ($140 + -5 << 2) | 0; + HEAP32[$150 >> 2] = (HEAP32[$150 >> 2] | 0) + $j$069; + $wk_max$2 = $wk_max$158; + } while (0); + $i$256 = $i$256 + 1 | 0; + $232 = $pnt$164 + 4 | 0; + $233 = $pnt2$363 + 2 | 0; + if (($i$256 | 0) >= ($12 | 0)) { + $pnt$1$lcssa = $232; + $pnt2$3$lcssa = $233; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $pnt$164 = $232; + $pnt2$363 = $233; + $wk_max$158 = $wk_max$2; + } + } + } else { + $pnt$1$lcssa = $pnt$073; + $pnt2$3$lcssa = $pnt2$272; + $wk_max$1$lcssa = $wk_max$071; + } + $j$069 = $j$069 + 1 | 0; + if (($j$069 | 0) >= ($3 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $pnt$073 = $pnt$1$lcssa + $$sum | 0; + $pnt2$272 = $pnt2$3$lcssa + 4 | 0; + $wk_max$071 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $239 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$338 = 1; + $j$139 = 1; + $wk$440 = $19; + while (1) { + $241 = HEAP32[$wk$440 >> 2] | 0; + if (($241 | 0) == ($i$338 | 0)) { + $247 = $j$139; + $j$2 = $j$139 + 1 | 0; + } else { + $247 = HEAP32[$labelInfo + 1179664 + ($241 + -1 << 2) >> 2] | 0; + $j$2 = $j$139; + } + HEAP32[$wk$440 >> 2] = $247; + if (($i$338 | 0) < ($wk_max$0$lcssa | 0)) { + $i$338 = $i$338 + 1 | 0; + $j$139 = $j$2; + $wk$440 = $wk$440 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $251 = $labelInfo + 8 | 0; + $252 = $j$1$lcssa + -1 | 0; + HEAP32[$251 >> 2] = $252; + if (!$252) $$0 = 0; else { + _memset($239 | 0, 0, $252 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $252 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$436 = 0; + do { + $259 = $i$436 << 2; + HEAP32[$labelInfo + 131084 + ($259 << 2) >> 2] = $0; + HEAP32[$labelInfo + 131084 + (($259 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($259 | 2) << 2) >> 2] = $1; + HEAP32[$labelInfo + 131084 + (($259 | 3) << 2) >> 2] = 0; + $i$436 = $i$436 + 1 | 0; + } while (($i$436 | 0) < (HEAP32[$251 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$534 = 0; + do { + $273 = (HEAP32[$labelInfo + 1179664 + ($i$534 << 2) >> 2] | 0) + -1 | 0; + $274 = $i$534 * 7 | 0; + $277 = $labelInfo + 12 + ($273 << 2) | 0; + HEAP32[$277 >> 2] = (HEAP32[$277 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($274 << 2) >> 2] | 0); + $284 = $273 << 1; + $285 = $labelInfo + 655376 + ($284 << 3) | 0; + HEAPF64[$285 >> 3] = +HEAPF64[$285 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($274 + 1 << 2) >> 2] | 0); + $293 = $labelInfo + 655376 + (($284 | 1) << 3) | 0; + HEAPF64[$293 >> 3] = +HEAPF64[$293 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($274 + 2 << 2) >> 2] | 0); + $296 = $273 << 2; + $297 = $labelInfo + 131084 + ($296 << 2) | 0; + $301 = HEAP32[$labelInfo + 1310736 + ($274 + 3 << 2) >> 2] | 0; + if ((HEAP32[$297 >> 2] | 0) > ($301 | 0)) HEAP32[$297 >> 2] = $301; + $304 = $labelInfo + 131084 + (($296 | 1) << 2) | 0; + $308 = HEAP32[$labelInfo + 1310736 + ($274 + 4 << 2) >> 2] | 0; + if ((HEAP32[$304 >> 2] | 0) < ($308 | 0)) HEAP32[$304 >> 2] = $308; + $311 = $labelInfo + 131084 + (($296 | 2) << 2) | 0; + $315 = HEAP32[$labelInfo + 1310736 + ($274 + 5 << 2) >> 2] | 0; + if ((HEAP32[$311 >> 2] | 0) > ($315 | 0)) HEAP32[$311 >> 2] = $315; + $318 = $labelInfo + 131084 + (($296 | 3) << 2) | 0; + $322 = HEAP32[$labelInfo + 1310736 + ($274 + 6 << 2) >> 2] | 0; + if ((HEAP32[$318 >> 2] | 0) < ($322 | 0)) HEAP32[$318 >> 2] = $322; + $i$534 = $i$534 + 1 | 0; + } while (($i$534 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$251 >> 2] | 0) > 0) { + $i$633 = 0; + do { + $326 = $labelInfo + 12 + ($i$633 << 2) | 0; + $329 = $i$633 << 1; + $330 = $labelInfo + 655376 + ($329 << 3) | 0; + HEAPF64[$330 >> 3] = +HEAPF64[$330 >> 3] / +(HEAP32[$326 >> 2] | 0); + $336 = $labelInfo + 655376 + (($329 | 1) << 3) | 0; + HEAPF64[$336 >> 3] = +HEAPF64[$336 >> 3] / +(HEAP32[$326 >> 2] | 0); + $i$633 = $i$633 + 1 | 0; + } while (($i$633 | 0) < (HEAP32[$251 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubDWI3C565($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $$sum2 = 0, $0 = 0, $1 = 0, $103 = 0, $107 = 0, $11 = 0, $113 = 0, $118 = 0, $12 = 0, $121 = 0, $138 = 0, $140 = 0, $142 = 0, $146 = 0, $150 = 0, $153 = 0, $155 = 0, $159 = 0, $163 = 0, $167 = 0, $172 = 0, $174 = 0, $178 = 0, $182 = 0, $186 = 0, $19 = 0, $192 = 0, $195 = 0, $197 = 0, $2 = 0, $201 = 0, $205 = 0, $209 = 0, $21 = 0, $212 = 0, $217 = 0, $232 = 0, $233 = 0, $239 = 0, $241 = 0, $247 = 0, $251 = 0, $252 = 0, $259 = 0, $273 = 0, $274 = 0, $277 = 0, $28 = 0, $284 = 0, $285 = 0, $293 = 0, $296 = 0, $297 = 0, $3 = 0, $30 = 0, $301 = 0, $304 = 0, $308 = 0, $311 = 0, $315 = 0, $318 = 0, $322 = 0, $326 = 0, $329 = 0, $330 = 0, $336 = 0, $36 = 0, $47 = 0, $50 = 0, $52 = 0, $56 = 0, $60 = 0, $66 = 0, $67 = 0, $70 = 0, $71 = 0, $72 = 0, $75 = 0, $78 = 0, $95 = 0, $97 = 0, $99 = 0, $i$082 = 0, $i$176 = 0, $i$256 = 0, $i$338 = 0, $i$436 = 0, $i$534 = 0, $i$633 = 0, $j$069 = 0, $j$1$lcssa = 0, $j$139 = 0, $j$2 = 0, $k$052 = 0, $k$149 = 0, $k$245 = 0, $k$342 = 0, $pnt$073 = 0, $pnt$1$lcssa = 0, $pnt$164 = 0, $pnt1$084 = 0, $pnt1$178 = 0, $pnt2$083 = 0, $pnt2$177 = 0, $pnt2$272 = 0, $pnt2$3$lcssa = 0, $pnt2$363 = 0, $vararg_buffer = 0, $wk$053 = 0, $wk$150 = 0, $wk$246 = 0, $wk$343 = 0, $wk$440 = 0, $wk_max$0$lcssa = 0, $wk_max$071 = 0, $wk_max$1$lcssa = 0, $wk_max$158 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = ($xsize | 0) / 2 | 0; + $1 = ($ysize | 0) / 2 | 0; + $2 = HEAP32[$labelInfo >> 2] | 0; + $3 = $1 + -1 | 0; + if (($xsize | 0) > 1) { + $i$082 = 0; + $pnt1$084 = $2; + $pnt2$083 = $2 + ((Math_imul($3, $0) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$083 >> 1] = 0; + HEAP16[$pnt1$084 >> 1] = 0; + $i$082 = $i$082 + 1 | 0; + if (($i$082 | 0) >= ($0 | 0)) break; else { + $pnt1$084 = $pnt1$084 + 2 | 0; + $pnt2$083 = $pnt2$083 + 2 | 0; + } + } + } + $11 = $labelingThresh * 3 | 0; + $12 = $0 + -1 | 0; + if (($ysize | 0) > 1) { + $i$176 = 0; + $pnt1$178 = $2; + $pnt2$177 = $2 + ($12 << 1) | 0; + while (1) { + HEAP16[$pnt2$177 >> 1] = 0; + HEAP16[$pnt1$178 >> 1] = 0; + $i$176 = $i$176 + 1 | 0; + if (($i$176 | 0) >= ($1 | 0)) break; else { + $pnt1$178 = $pnt1$178 + ($0 << 1) | 0; + $pnt2$177 = $pnt2$177 + ($0 << 1) | 0; + } + } + } + $19 = $labelInfo + 1179664 | 0; + $21 = 0 - $0 | 0; + $$sum1 = 1 - $0 | 0; + $$sum2 = ~$0; + $$sum = ($xsize << 1) + 8 | 0; + L11 : do if (($3 | 0) > 1) { + $28 = ($12 | 0) > 1; + $j$069 = 1; + $pnt$073 = $image + (($xsize << 2) + 4) | 0; + $pnt2$272 = $2 + ($0 + 1 << 1) | 0; + $wk_max$071 = 0; + L13 : while (1) { + if ($28) { + $i$256 = 1; + $pnt$164 = $pnt$073; + $pnt2$363 = $pnt2$272; + $wk_max$158 = $wk_max$071; + while (1) { + $30 = HEAPU8[$pnt$164 >> 0] | 0; + $36 = HEAPU8[$pnt$164 + 1 >> 0] | 0; + do if ((($30 & 248) + 10 + ($30 << 5 & 224) + ($36 >>> 3 & 28) + ($36 << 3 & 248) | 0) > ($11 | 0)) { + $47 = HEAP16[$pnt2$363 + ($21 << 1) >> 1] | 0; + if ($47 << 16 >> 16 > 0) { + HEAP16[$pnt2$363 >> 1] = $47; + $50 = ($47 << 16 >> 16) * 7 | 0; + $52 = $labelInfo + 1310736 + ($50 + -7 << 2) | 0; + HEAP32[$52 >> 2] = (HEAP32[$52 >> 2] | 0) + 1; + $56 = $labelInfo + 1310736 + ($50 + -6 << 2) | 0; + HEAP32[$56 >> 2] = (HEAP32[$56 >> 2] | 0) + $i$256; + $60 = $labelInfo + 1310736 + ($50 + -5 << 2) | 0; + HEAP32[$60 >> 2] = (HEAP32[$60 >> 2] | 0) + $j$069; + HEAP32[$labelInfo + 1310736 + ($50 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $66 = HEAP16[$pnt2$363 + ($$sum1 << 1) >> 1] | 0; + $67 = $66 << 16 >> 16; + $70 = HEAP16[$pnt2$363 + ($$sum2 << 1) >> 1] | 0; + $71 = $70 << 16 >> 16; + $72 = $70 << 16 >> 16 > 0; + if ($66 << 16 >> 16 <= 0) { + if ($72) { + HEAP16[$pnt2$363 >> 1] = $70; + $172 = $71 * 7 | 0; + $174 = $labelInfo + 1310736 + ($172 + -7 << 2) | 0; + HEAP32[$174 >> 2] = (HEAP32[$174 >> 2] | 0) + 1; + $178 = $labelInfo + 1310736 + ($172 + -6 << 2) | 0; + HEAP32[$178 >> 2] = (HEAP32[$178 >> 2] | 0) + $i$256; + $182 = $labelInfo + 1310736 + ($172 + -5 << 2) | 0; + HEAP32[$182 >> 2] = (HEAP32[$182 >> 2] | 0) + $j$069; + $186 = $labelInfo + 1310736 + ($172 + -3 << 2) | 0; + if ((HEAP32[$186 >> 2] | 0) < ($i$256 | 0)) HEAP32[$186 >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($172 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $192 = HEAP16[$pnt2$363 + -2 >> 1] | 0; + if ($192 << 16 >> 16 > 0) { + HEAP16[$pnt2$363 >> 1] = $192; + $195 = ($192 << 16 >> 16) * 7 | 0; + $197 = $labelInfo + 1310736 + ($195 + -7 << 2) | 0; + HEAP32[$197 >> 2] = (HEAP32[$197 >> 2] | 0) + 1; + $201 = $labelInfo + 1310736 + ($195 + -6 << 2) | 0; + HEAP32[$201 >> 2] = (HEAP32[$201 >> 2] | 0) + $i$256; + $205 = $labelInfo + 1310736 + ($195 + -5 << 2) | 0; + HEAP32[$205 >> 2] = (HEAP32[$205 >> 2] | 0) + $j$069; + $209 = $labelInfo + 1310736 + ($195 + -3 << 2) | 0; + if ((HEAP32[$209 >> 2] | 0) >= ($i$256 | 0)) { + $wk_max$2 = $wk_max$158; + break; + } + HEAP32[$209 >> 2] = $i$256; + $wk_max$2 = $wk_max$158; + break; + } else { + $212 = $wk_max$158 + 1 | 0; + if (($wk_max$158 | 0) > 32767) break L13; + HEAP16[$pnt2$363 >> 1] = $212; + HEAP32[$labelInfo + 1179664 + ($wk_max$158 << 2) >> 2] = $212 << 16 >> 16; + $217 = $wk_max$158 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($217 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($217 + 1 << 2) >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($217 + 2 << 2) >> 2] = $j$069; + HEAP32[$labelInfo + 1310736 + ($217 + 3 << 2) >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($217 + 4 << 2) >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($217 + 5 << 2) >> 2] = $j$069; + HEAP32[$labelInfo + 1310736 + ($217 + 6 << 2) >> 2] = $j$069; + $wk_max$2 = $212; + break; + } + } + if ($72) { + $75 = HEAP32[$labelInfo + 1179664 + ($67 + -1 << 2) >> 2] | 0; + $78 = HEAP32[$labelInfo + 1179664 + ($71 + -1 << 2) >> 2] | 0; + if (($75 | 0) > ($78 | 0)) { + HEAP16[$pnt2$363 >> 1] = $78; + if (($wk_max$158 | 0) > 0) { + $k$052 = 0; + $wk$053 = $19; + while (1) { + if ((HEAP32[$wk$053 >> 2] | 0) == ($75 | 0)) HEAP32[$wk$053 >> 2] = $78; + $k$052 = $k$052 + 1 | 0; + if (($k$052 | 0) >= ($wk_max$158 | 0)) { + $95 = $78; + break; + } else $wk$053 = $wk$053 + 4 | 0; + } + } else $95 = $78; + } else { + HEAP16[$pnt2$363 >> 1] = $75; + if (($75 | 0) < ($78 | 0) & ($wk_max$158 | 0) > 0) { + $k$149 = 0; + $wk$150 = $19; + while (1) { + if ((HEAP32[$wk$150 >> 2] | 0) == ($78 | 0)) HEAP32[$wk$150 >> 2] = $75; + $k$149 = $k$149 + 1 | 0; + if (($k$149 | 0) >= ($wk_max$158 | 0)) { + $95 = $75; + break; + } else $wk$150 = $wk$150 + 4 | 0; + } + } else $95 = $75; + } + $97 = ($95 << 16 >> 16) * 7 | 0; + $99 = $labelInfo + 1310736 + ($97 + -7 << 2) | 0; + HEAP32[$99 >> 2] = (HEAP32[$99 >> 2] | 0) + 1; + $103 = $labelInfo + 1310736 + ($97 + -6 << 2) | 0; + HEAP32[$103 >> 2] = (HEAP32[$103 >> 2] | 0) + $i$256; + $107 = $labelInfo + 1310736 + ($97 + -5 << 2) | 0; + HEAP32[$107 >> 2] = (HEAP32[$107 >> 2] | 0) + $j$069; + HEAP32[$labelInfo + 1310736 + ($97 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $113 = HEAP16[$pnt2$363 + -2 >> 1] | 0; + if ($113 << 16 >> 16 <= 0) { + HEAP16[$pnt2$363 >> 1] = $66; + $153 = $67 * 7 | 0; + $155 = $labelInfo + 1310736 + ($153 + -7 << 2) | 0; + HEAP32[$155 >> 2] = (HEAP32[$155 >> 2] | 0) + 1; + $159 = $labelInfo + 1310736 + ($153 + -6 << 2) | 0; + HEAP32[$159 >> 2] = (HEAP32[$159 >> 2] | 0) + $i$256; + $163 = $labelInfo + 1310736 + ($153 + -5 << 2) | 0; + HEAP32[$163 >> 2] = (HEAP32[$163 >> 2] | 0) + $j$069; + $167 = $labelInfo + 1310736 + ($153 + -4 << 2) | 0; + if ((HEAP32[$167 >> 2] | 0) > ($i$256 | 0)) HEAP32[$167 >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($153 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $118 = HEAP32[$labelInfo + 1179664 + ($67 + -1 << 2) >> 2] | 0; + $121 = HEAP32[$labelInfo + 1179664 + (($113 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($118 | 0) > ($121 | 0)) { + HEAP16[$pnt2$363 >> 1] = $121; + if (($wk_max$158 | 0) > 0) { + $k$245 = 0; + $wk$246 = $19; + while (1) { + if ((HEAP32[$wk$246 >> 2] | 0) == ($118 | 0)) HEAP32[$wk$246 >> 2] = $121; + $k$245 = $k$245 + 1 | 0; + if (($k$245 | 0) >= ($wk_max$158 | 0)) { + $138 = $121; + break; + } else $wk$246 = $wk$246 + 4 | 0; + } + } else $138 = $121; + } else { + HEAP16[$pnt2$363 >> 1] = $118; + if (($118 | 0) < ($121 | 0) & ($wk_max$158 | 0) > 0) { + $k$342 = 0; + $wk$343 = $19; + while (1) { + if ((HEAP32[$wk$343 >> 2] | 0) == ($121 | 0)) HEAP32[$wk$343 >> 2] = $118; + $k$342 = $k$342 + 1 | 0; + if (($k$342 | 0) >= ($wk_max$158 | 0)) { + $138 = $118; + break; + } else $wk$343 = $wk$343 + 4 | 0; + } + } else $138 = $118; + } + $140 = ($138 << 16 >> 16) * 7 | 0; + $142 = $labelInfo + 1310736 + ($140 + -7 << 2) | 0; + HEAP32[$142 >> 2] = (HEAP32[$142 >> 2] | 0) + 1; + $146 = $labelInfo + 1310736 + ($140 + -6 << 2) | 0; + HEAP32[$146 >> 2] = (HEAP32[$146 >> 2] | 0) + $i$256; + $150 = $labelInfo + 1310736 + ($140 + -5 << 2) | 0; + HEAP32[$150 >> 2] = (HEAP32[$150 >> 2] | 0) + $j$069; + $wk_max$2 = $wk_max$158; + } else { + HEAP16[$pnt2$363 >> 1] = 0; + $wk_max$2 = $wk_max$158; + } while (0); + $i$256 = $i$256 + 1 | 0; + $232 = $pnt$164 + 4 | 0; + $233 = $pnt2$363 + 2 | 0; + if (($i$256 | 0) >= ($12 | 0)) { + $pnt$1$lcssa = $232; + $pnt2$3$lcssa = $233; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $pnt$164 = $232; + $pnt2$363 = $233; + $wk_max$158 = $wk_max$2; + } + } + } else { + $pnt$1$lcssa = $pnt$073; + $pnt2$3$lcssa = $pnt2$272; + $wk_max$1$lcssa = $wk_max$071; + } + $j$069 = $j$069 + 1 | 0; + if (($j$069 | 0) >= ($3 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $pnt$073 = $pnt$1$lcssa + $$sum | 0; + $pnt2$272 = $pnt2$3$lcssa + 4 | 0; + $wk_max$071 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $239 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$338 = 1; + $j$139 = 1; + $wk$440 = $19; + while (1) { + $241 = HEAP32[$wk$440 >> 2] | 0; + if (($241 | 0) == ($i$338 | 0)) { + $247 = $j$139; + $j$2 = $j$139 + 1 | 0; + } else { + $247 = HEAP32[$labelInfo + 1179664 + ($241 + -1 << 2) >> 2] | 0; + $j$2 = $j$139; + } + HEAP32[$wk$440 >> 2] = $247; + if (($i$338 | 0) < ($wk_max$0$lcssa | 0)) { + $i$338 = $i$338 + 1 | 0; + $j$139 = $j$2; + $wk$440 = $wk$440 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $251 = $labelInfo + 8 | 0; + $252 = $j$1$lcssa + -1 | 0; + HEAP32[$251 >> 2] = $252; + if (!$252) $$0 = 0; else { + _memset($239 | 0, 0, $252 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $252 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$436 = 0; + do { + $259 = $i$436 << 2; + HEAP32[$labelInfo + 131084 + ($259 << 2) >> 2] = $0; + HEAP32[$labelInfo + 131084 + (($259 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($259 | 2) << 2) >> 2] = $1; + HEAP32[$labelInfo + 131084 + (($259 | 3) << 2) >> 2] = 0; + $i$436 = $i$436 + 1 | 0; + } while (($i$436 | 0) < (HEAP32[$251 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$534 = 0; + do { + $273 = (HEAP32[$labelInfo + 1179664 + ($i$534 << 2) >> 2] | 0) + -1 | 0; + $274 = $i$534 * 7 | 0; + $277 = $labelInfo + 12 + ($273 << 2) | 0; + HEAP32[$277 >> 2] = (HEAP32[$277 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($274 << 2) >> 2] | 0); + $284 = $273 << 1; + $285 = $labelInfo + 655376 + ($284 << 3) | 0; + HEAPF64[$285 >> 3] = +HEAPF64[$285 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($274 + 1 << 2) >> 2] | 0); + $293 = $labelInfo + 655376 + (($284 | 1) << 3) | 0; + HEAPF64[$293 >> 3] = +HEAPF64[$293 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($274 + 2 << 2) >> 2] | 0); + $296 = $273 << 2; + $297 = $labelInfo + 131084 + ($296 << 2) | 0; + $301 = HEAP32[$labelInfo + 1310736 + ($274 + 3 << 2) >> 2] | 0; + if ((HEAP32[$297 >> 2] | 0) > ($301 | 0)) HEAP32[$297 >> 2] = $301; + $304 = $labelInfo + 131084 + (($296 | 1) << 2) | 0; + $308 = HEAP32[$labelInfo + 1310736 + ($274 + 4 << 2) >> 2] | 0; + if ((HEAP32[$304 >> 2] | 0) < ($308 | 0)) HEAP32[$304 >> 2] = $308; + $311 = $labelInfo + 131084 + (($296 | 2) << 2) | 0; + $315 = HEAP32[$labelInfo + 1310736 + ($274 + 5 << 2) >> 2] | 0; + if ((HEAP32[$311 >> 2] | 0) > ($315 | 0)) HEAP32[$311 >> 2] = $315; + $318 = $labelInfo + 131084 + (($296 | 3) << 2) | 0; + $322 = HEAP32[$labelInfo + 1310736 + ($274 + 6 << 2) >> 2] | 0; + if ((HEAP32[$318 >> 2] | 0) < ($322 | 0)) HEAP32[$318 >> 2] = $322; + $i$534 = $i$534 + 1 | 0; + } while (($i$534 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$251 >> 2] | 0) > 0) { + $i$633 = 0; + do { + $326 = $labelInfo + 12 + ($i$633 << 2) | 0; + $329 = $i$633 << 1; + $330 = $labelInfo + 655376 + ($329 << 3) | 0; + HEAPF64[$330 >> 3] = +HEAPF64[$330 >> 3] / +(HEAP32[$326 >> 2] | 0); + $336 = $labelInfo + 655376 + (($329 | 1) << 3) | 0; + HEAPF64[$336 >> 3] = +HEAPF64[$336 >> 3] / +(HEAP32[$326 >> 2] | 0); + $i$633 = $i$633 + 1 | 0; + } while (($i$633 | 0) < (HEAP32[$251 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubDBI3C565($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $$sum2 = 0, $0 = 0, $1 = 0, $103 = 0, $107 = 0, $11 = 0, $113 = 0, $118 = 0, $12 = 0, $121 = 0, $138 = 0, $140 = 0, $142 = 0, $146 = 0, $150 = 0, $153 = 0, $155 = 0, $159 = 0, $163 = 0, $167 = 0, $172 = 0, $174 = 0, $178 = 0, $182 = 0, $186 = 0, $19 = 0, $192 = 0, $195 = 0, $197 = 0, $2 = 0, $201 = 0, $205 = 0, $209 = 0, $21 = 0, $212 = 0, $217 = 0, $232 = 0, $233 = 0, $239 = 0, $241 = 0, $247 = 0, $251 = 0, $252 = 0, $259 = 0, $273 = 0, $274 = 0, $277 = 0, $28 = 0, $284 = 0, $285 = 0, $293 = 0, $296 = 0, $297 = 0, $3 = 0, $30 = 0, $301 = 0, $304 = 0, $308 = 0, $311 = 0, $315 = 0, $318 = 0, $322 = 0, $326 = 0, $329 = 0, $330 = 0, $336 = 0, $36 = 0, $47 = 0, $50 = 0, $52 = 0, $56 = 0, $60 = 0, $66 = 0, $67 = 0, $70 = 0, $71 = 0, $72 = 0, $75 = 0, $78 = 0, $95 = 0, $97 = 0, $99 = 0, $i$082 = 0, $i$176 = 0, $i$256 = 0, $i$338 = 0, $i$436 = 0, $i$534 = 0, $i$633 = 0, $j$069 = 0, $j$1$lcssa = 0, $j$139 = 0, $j$2 = 0, $k$052 = 0, $k$149 = 0, $k$245 = 0, $k$342 = 0, $pnt$073 = 0, $pnt$1$lcssa = 0, $pnt$164 = 0, $pnt1$084 = 0, $pnt1$178 = 0, $pnt2$083 = 0, $pnt2$177 = 0, $pnt2$272 = 0, $pnt2$3$lcssa = 0, $pnt2$363 = 0, $vararg_buffer = 0, $wk$053 = 0, $wk$150 = 0, $wk$246 = 0, $wk$343 = 0, $wk$440 = 0, $wk_max$0$lcssa = 0, $wk_max$071 = 0, $wk_max$1$lcssa = 0, $wk_max$158 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = ($xsize | 0) / 2 | 0; + $1 = ($ysize | 0) / 2 | 0; + $2 = HEAP32[$labelInfo >> 2] | 0; + $3 = $1 + -1 | 0; + if (($xsize | 0) > 1) { + $i$082 = 0; + $pnt1$084 = $2; + $pnt2$083 = $2 + ((Math_imul($3, $0) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$083 >> 1] = 0; + HEAP16[$pnt1$084 >> 1] = 0; + $i$082 = $i$082 + 1 | 0; + if (($i$082 | 0) >= ($0 | 0)) break; else { + $pnt1$084 = $pnt1$084 + 2 | 0; + $pnt2$083 = $pnt2$083 + 2 | 0; + } + } + } + $11 = $labelingThresh * 3 | 0; + $12 = $0 + -1 | 0; + if (($ysize | 0) > 1) { + $i$176 = 0; + $pnt1$178 = $2; + $pnt2$177 = $2 + ($12 << 1) | 0; + while (1) { + HEAP16[$pnt2$177 >> 1] = 0; + HEAP16[$pnt1$178 >> 1] = 0; + $i$176 = $i$176 + 1 | 0; + if (($i$176 | 0) >= ($1 | 0)) break; else { + $pnt1$178 = $pnt1$178 + ($0 << 1) | 0; + $pnt2$177 = $pnt2$177 + ($0 << 1) | 0; + } + } + } + $19 = $labelInfo + 1179664 | 0; + $21 = 0 - $0 | 0; + $$sum1 = 1 - $0 | 0; + $$sum2 = ~$0; + $$sum = ($xsize << 1) + 8 | 0; + L11 : do if (($3 | 0) > 1) { + $28 = ($12 | 0) > 1; + $j$069 = 1; + $pnt$073 = $image + (($xsize << 2) + 4) | 0; + $pnt2$272 = $2 + ($0 + 1 << 1) | 0; + $wk_max$071 = 0; + L13 : while (1) { + if ($28) { + $i$256 = 1; + $pnt$164 = $pnt$073; + $pnt2$363 = $pnt2$272; + $wk_max$158 = $wk_max$071; + while (1) { + $30 = HEAPU8[$pnt$164 >> 0] | 0; + $36 = HEAPU8[$pnt$164 + 1 >> 0] | 0; + do if ((($30 & 248) + 10 + ($30 << 5 & 224) + ($36 >>> 3 & 28) + ($36 << 3 & 248) | 0) > ($11 | 0)) { + HEAP16[$pnt2$363 >> 1] = 0; + $wk_max$2 = $wk_max$158; + } else { + $47 = HEAP16[$pnt2$363 + ($21 << 1) >> 1] | 0; + if ($47 << 16 >> 16 > 0) { + HEAP16[$pnt2$363 >> 1] = $47; + $50 = ($47 << 16 >> 16) * 7 | 0; + $52 = $labelInfo + 1310736 + ($50 + -7 << 2) | 0; + HEAP32[$52 >> 2] = (HEAP32[$52 >> 2] | 0) + 1; + $56 = $labelInfo + 1310736 + ($50 + -6 << 2) | 0; + HEAP32[$56 >> 2] = (HEAP32[$56 >> 2] | 0) + $i$256; + $60 = $labelInfo + 1310736 + ($50 + -5 << 2) | 0; + HEAP32[$60 >> 2] = (HEAP32[$60 >> 2] | 0) + $j$069; + HEAP32[$labelInfo + 1310736 + ($50 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $66 = HEAP16[$pnt2$363 + ($$sum1 << 1) >> 1] | 0; + $67 = $66 << 16 >> 16; + $70 = HEAP16[$pnt2$363 + ($$sum2 << 1) >> 1] | 0; + $71 = $70 << 16 >> 16; + $72 = $70 << 16 >> 16 > 0; + if ($66 << 16 >> 16 <= 0) { + if ($72) { + HEAP16[$pnt2$363 >> 1] = $70; + $172 = $71 * 7 | 0; + $174 = $labelInfo + 1310736 + ($172 + -7 << 2) | 0; + HEAP32[$174 >> 2] = (HEAP32[$174 >> 2] | 0) + 1; + $178 = $labelInfo + 1310736 + ($172 + -6 << 2) | 0; + HEAP32[$178 >> 2] = (HEAP32[$178 >> 2] | 0) + $i$256; + $182 = $labelInfo + 1310736 + ($172 + -5 << 2) | 0; + HEAP32[$182 >> 2] = (HEAP32[$182 >> 2] | 0) + $j$069; + $186 = $labelInfo + 1310736 + ($172 + -3 << 2) | 0; + if ((HEAP32[$186 >> 2] | 0) < ($i$256 | 0)) HEAP32[$186 >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($172 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $192 = HEAP16[$pnt2$363 + -2 >> 1] | 0; + if ($192 << 16 >> 16 > 0) { + HEAP16[$pnt2$363 >> 1] = $192; + $195 = ($192 << 16 >> 16) * 7 | 0; + $197 = $labelInfo + 1310736 + ($195 + -7 << 2) | 0; + HEAP32[$197 >> 2] = (HEAP32[$197 >> 2] | 0) + 1; + $201 = $labelInfo + 1310736 + ($195 + -6 << 2) | 0; + HEAP32[$201 >> 2] = (HEAP32[$201 >> 2] | 0) + $i$256; + $205 = $labelInfo + 1310736 + ($195 + -5 << 2) | 0; + HEAP32[$205 >> 2] = (HEAP32[$205 >> 2] | 0) + $j$069; + $209 = $labelInfo + 1310736 + ($195 + -3 << 2) | 0; + if ((HEAP32[$209 >> 2] | 0) >= ($i$256 | 0)) { + $wk_max$2 = $wk_max$158; + break; + } + HEAP32[$209 >> 2] = $i$256; + $wk_max$2 = $wk_max$158; + break; + } else { + $212 = $wk_max$158 + 1 | 0; + if (($wk_max$158 | 0) > 32767) break L13; + HEAP16[$pnt2$363 >> 1] = $212; + HEAP32[$labelInfo + 1179664 + ($wk_max$158 << 2) >> 2] = $212 << 16 >> 16; + $217 = $wk_max$158 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($217 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($217 + 1 << 2) >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($217 + 2 << 2) >> 2] = $j$069; + HEAP32[$labelInfo + 1310736 + ($217 + 3 << 2) >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($217 + 4 << 2) >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($217 + 5 << 2) >> 2] = $j$069; + HEAP32[$labelInfo + 1310736 + ($217 + 6 << 2) >> 2] = $j$069; + $wk_max$2 = $212; + break; + } + } + if ($72) { + $75 = HEAP32[$labelInfo + 1179664 + ($67 + -1 << 2) >> 2] | 0; + $78 = HEAP32[$labelInfo + 1179664 + ($71 + -1 << 2) >> 2] | 0; + if (($75 | 0) > ($78 | 0)) { + HEAP16[$pnt2$363 >> 1] = $78; + if (($wk_max$158 | 0) > 0) { + $k$052 = 0; + $wk$053 = $19; + while (1) { + if ((HEAP32[$wk$053 >> 2] | 0) == ($75 | 0)) HEAP32[$wk$053 >> 2] = $78; + $k$052 = $k$052 + 1 | 0; + if (($k$052 | 0) >= ($wk_max$158 | 0)) { + $95 = $78; + break; + } else $wk$053 = $wk$053 + 4 | 0; + } + } else $95 = $78; + } else { + HEAP16[$pnt2$363 >> 1] = $75; + if (($75 | 0) < ($78 | 0) & ($wk_max$158 | 0) > 0) { + $k$149 = 0; + $wk$150 = $19; + while (1) { + if ((HEAP32[$wk$150 >> 2] | 0) == ($78 | 0)) HEAP32[$wk$150 >> 2] = $75; + $k$149 = $k$149 + 1 | 0; + if (($k$149 | 0) >= ($wk_max$158 | 0)) { + $95 = $75; + break; + } else $wk$150 = $wk$150 + 4 | 0; + } + } else $95 = $75; + } + $97 = ($95 << 16 >> 16) * 7 | 0; + $99 = $labelInfo + 1310736 + ($97 + -7 << 2) | 0; + HEAP32[$99 >> 2] = (HEAP32[$99 >> 2] | 0) + 1; + $103 = $labelInfo + 1310736 + ($97 + -6 << 2) | 0; + HEAP32[$103 >> 2] = (HEAP32[$103 >> 2] | 0) + $i$256; + $107 = $labelInfo + 1310736 + ($97 + -5 << 2) | 0; + HEAP32[$107 >> 2] = (HEAP32[$107 >> 2] | 0) + $j$069; + HEAP32[$labelInfo + 1310736 + ($97 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $113 = HEAP16[$pnt2$363 + -2 >> 1] | 0; + if ($113 << 16 >> 16 <= 0) { + HEAP16[$pnt2$363 >> 1] = $66; + $153 = $67 * 7 | 0; + $155 = $labelInfo + 1310736 + ($153 + -7 << 2) | 0; + HEAP32[$155 >> 2] = (HEAP32[$155 >> 2] | 0) + 1; + $159 = $labelInfo + 1310736 + ($153 + -6 << 2) | 0; + HEAP32[$159 >> 2] = (HEAP32[$159 >> 2] | 0) + $i$256; + $163 = $labelInfo + 1310736 + ($153 + -5 << 2) | 0; + HEAP32[$163 >> 2] = (HEAP32[$163 >> 2] | 0) + $j$069; + $167 = $labelInfo + 1310736 + ($153 + -4 << 2) | 0; + if ((HEAP32[$167 >> 2] | 0) > ($i$256 | 0)) HEAP32[$167 >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($153 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $118 = HEAP32[$labelInfo + 1179664 + ($67 + -1 << 2) >> 2] | 0; + $121 = HEAP32[$labelInfo + 1179664 + (($113 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($118 | 0) > ($121 | 0)) { + HEAP16[$pnt2$363 >> 1] = $121; + if (($wk_max$158 | 0) > 0) { + $k$245 = 0; + $wk$246 = $19; + while (1) { + if ((HEAP32[$wk$246 >> 2] | 0) == ($118 | 0)) HEAP32[$wk$246 >> 2] = $121; + $k$245 = $k$245 + 1 | 0; + if (($k$245 | 0) >= ($wk_max$158 | 0)) { + $138 = $121; + break; + } else $wk$246 = $wk$246 + 4 | 0; + } + } else $138 = $121; + } else { + HEAP16[$pnt2$363 >> 1] = $118; + if (($118 | 0) < ($121 | 0) & ($wk_max$158 | 0) > 0) { + $k$342 = 0; + $wk$343 = $19; + while (1) { + if ((HEAP32[$wk$343 >> 2] | 0) == ($121 | 0)) HEAP32[$wk$343 >> 2] = $118; + $k$342 = $k$342 + 1 | 0; + if (($k$342 | 0) >= ($wk_max$158 | 0)) { + $138 = $118; + break; + } else $wk$343 = $wk$343 + 4 | 0; + } + } else $138 = $118; + } + $140 = ($138 << 16 >> 16) * 7 | 0; + $142 = $labelInfo + 1310736 + ($140 + -7 << 2) | 0; + HEAP32[$142 >> 2] = (HEAP32[$142 >> 2] | 0) + 1; + $146 = $labelInfo + 1310736 + ($140 + -6 << 2) | 0; + HEAP32[$146 >> 2] = (HEAP32[$146 >> 2] | 0) + $i$256; + $150 = $labelInfo + 1310736 + ($140 + -5 << 2) | 0; + HEAP32[$150 >> 2] = (HEAP32[$150 >> 2] | 0) + $j$069; + $wk_max$2 = $wk_max$158; + } while (0); + $i$256 = $i$256 + 1 | 0; + $232 = $pnt$164 + 4 | 0; + $233 = $pnt2$363 + 2 | 0; + if (($i$256 | 0) >= ($12 | 0)) { + $pnt$1$lcssa = $232; + $pnt2$3$lcssa = $233; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $pnt$164 = $232; + $pnt2$363 = $233; + $wk_max$158 = $wk_max$2; + } + } + } else { + $pnt$1$lcssa = $pnt$073; + $pnt2$3$lcssa = $pnt2$272; + $wk_max$1$lcssa = $wk_max$071; + } + $j$069 = $j$069 + 1 | 0; + if (($j$069 | 0) >= ($3 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $pnt$073 = $pnt$1$lcssa + $$sum | 0; + $pnt2$272 = $pnt2$3$lcssa + 4 | 0; + $wk_max$071 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $239 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$338 = 1; + $j$139 = 1; + $wk$440 = $19; + while (1) { + $241 = HEAP32[$wk$440 >> 2] | 0; + if (($241 | 0) == ($i$338 | 0)) { + $247 = $j$139; + $j$2 = $j$139 + 1 | 0; + } else { + $247 = HEAP32[$labelInfo + 1179664 + ($241 + -1 << 2) >> 2] | 0; + $j$2 = $j$139; + } + HEAP32[$wk$440 >> 2] = $247; + if (($i$338 | 0) < ($wk_max$0$lcssa | 0)) { + $i$338 = $i$338 + 1 | 0; + $j$139 = $j$2; + $wk$440 = $wk$440 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $251 = $labelInfo + 8 | 0; + $252 = $j$1$lcssa + -1 | 0; + HEAP32[$251 >> 2] = $252; + if (!$252) $$0 = 0; else { + _memset($239 | 0, 0, $252 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $252 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$436 = 0; + do { + $259 = $i$436 << 2; + HEAP32[$labelInfo + 131084 + ($259 << 2) >> 2] = $0; + HEAP32[$labelInfo + 131084 + (($259 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($259 | 2) << 2) >> 2] = $1; + HEAP32[$labelInfo + 131084 + (($259 | 3) << 2) >> 2] = 0; + $i$436 = $i$436 + 1 | 0; + } while (($i$436 | 0) < (HEAP32[$251 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$534 = 0; + do { + $273 = (HEAP32[$labelInfo + 1179664 + ($i$534 << 2) >> 2] | 0) + -1 | 0; + $274 = $i$534 * 7 | 0; + $277 = $labelInfo + 12 + ($273 << 2) | 0; + HEAP32[$277 >> 2] = (HEAP32[$277 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($274 << 2) >> 2] | 0); + $284 = $273 << 1; + $285 = $labelInfo + 655376 + ($284 << 3) | 0; + HEAPF64[$285 >> 3] = +HEAPF64[$285 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($274 + 1 << 2) >> 2] | 0); + $293 = $labelInfo + 655376 + (($284 | 1) << 3) | 0; + HEAPF64[$293 >> 3] = +HEAPF64[$293 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($274 + 2 << 2) >> 2] | 0); + $296 = $273 << 2; + $297 = $labelInfo + 131084 + ($296 << 2) | 0; + $301 = HEAP32[$labelInfo + 1310736 + ($274 + 3 << 2) >> 2] | 0; + if ((HEAP32[$297 >> 2] | 0) > ($301 | 0)) HEAP32[$297 >> 2] = $301; + $304 = $labelInfo + 131084 + (($296 | 1) << 2) | 0; + $308 = HEAP32[$labelInfo + 1310736 + ($274 + 4 << 2) >> 2] | 0; + if ((HEAP32[$304 >> 2] | 0) < ($308 | 0)) HEAP32[$304 >> 2] = $308; + $311 = $labelInfo + 131084 + (($296 | 2) << 2) | 0; + $315 = HEAP32[$labelInfo + 1310736 + ($274 + 5 << 2) >> 2] | 0; + if ((HEAP32[$311 >> 2] | 0) > ($315 | 0)) HEAP32[$311 >> 2] = $315; + $318 = $labelInfo + 131084 + (($296 | 3) << 2) | 0; + $322 = HEAP32[$labelInfo + 1310736 + ($274 + 6 << 2) >> 2] | 0; + if ((HEAP32[$318 >> 2] | 0) < ($322 | 0)) HEAP32[$318 >> 2] = $322; + $i$534 = $i$534 + 1 | 0; + } while (($i$534 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$251 >> 2] | 0) > 0) { + $i$633 = 0; + do { + $326 = $labelInfo + 12 + ($i$633 << 2) | 0; + $329 = $i$633 << 1; + $330 = $labelInfo + 655376 + ($329 << 3) | 0; + HEAPF64[$330 >> 3] = +HEAPF64[$330 >> 3] / +(HEAP32[$326 >> 2] | 0); + $336 = $labelInfo + 655376 + (($329 | 1) << 3) | 0; + HEAPF64[$336 >> 3] = +HEAPF64[$336 >> 3] / +(HEAP32[$326 >> 2] | 0); + $i$633 = $i$633 + 1 | 0; + } while (($i$633 | 0) < (HEAP32[$251 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubDBI3CA4444($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $$sum2 = 0, $0 = 0, $1 = 0, $103 = 0, $109 = 0, $11 = 0, $114 = 0, $117 = 0, $12 = 0, $134 = 0, $136 = 0, $138 = 0, $142 = 0, $146 = 0, $149 = 0, $151 = 0, $155 = 0, $159 = 0, $163 = 0, $168 = 0, $170 = 0, $174 = 0, $178 = 0, $182 = 0, $188 = 0, $19 = 0, $191 = 0, $193 = 0, $197 = 0, $2 = 0, $201 = 0, $205 = 0, $208 = 0, $21 = 0, $213 = 0, $228 = 0, $229 = 0, $235 = 0, $237 = 0, $243 = 0, $247 = 0, $248 = 0, $255 = 0, $269 = 0, $270 = 0, $273 = 0, $28 = 0, $280 = 0, $281 = 0, $289 = 0, $292 = 0, $293 = 0, $297 = 0, $3 = 0, $30 = 0, $300 = 0, $304 = 0, $307 = 0, $311 = 0, $314 = 0, $318 = 0, $322 = 0, $325 = 0, $326 = 0, $332 = 0, $43 = 0, $46 = 0, $48 = 0, $52 = 0, $56 = 0, $62 = 0, $63 = 0, $66 = 0, $67 = 0, $68 = 0, $71 = 0, $74 = 0, $91 = 0, $93 = 0, $95 = 0, $99 = 0, $i$082 = 0, $i$176 = 0, $i$256 = 0, $i$338 = 0, $i$436 = 0, $i$534 = 0, $i$633 = 0, $j$069 = 0, $j$1$lcssa = 0, $j$139 = 0, $j$2 = 0, $k$052 = 0, $k$149 = 0, $k$245 = 0, $k$342 = 0, $pnt$073 = 0, $pnt$1$lcssa = 0, $pnt$164 = 0, $pnt1$084 = 0, $pnt1$178 = 0, $pnt2$083 = 0, $pnt2$177 = 0, $pnt2$272 = 0, $pnt2$3$lcssa = 0, $pnt2$363 = 0, $vararg_buffer = 0, $wk$053 = 0, $wk$150 = 0, $wk$246 = 0, $wk$343 = 0, $wk$440 = 0, $wk_max$0$lcssa = 0, $wk_max$071 = 0, $wk_max$1$lcssa = 0, $wk_max$158 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = ($xsize | 0) / 2 | 0; + $1 = ($ysize | 0) / 2 | 0; + $2 = HEAP32[$labelInfo >> 2] | 0; + $3 = $1 + -1 | 0; + if (($xsize | 0) > 1) { + $i$082 = 0; + $pnt1$084 = $2; + $pnt2$083 = $2 + ((Math_imul($3, $0) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$083 >> 1] = 0; + HEAP16[$pnt1$084 >> 1] = 0; + $i$082 = $i$082 + 1 | 0; + if (($i$082 | 0) >= ($0 | 0)) break; else { + $pnt1$084 = $pnt1$084 + 2 | 0; + $pnt2$083 = $pnt2$083 + 2 | 0; + } + } + } + $11 = $labelingThresh * 3 | 0; + $12 = $0 + -1 | 0; + if (($ysize | 0) > 1) { + $i$176 = 0; + $pnt1$178 = $2; + $pnt2$177 = $2 + ($12 << 1) | 0; + while (1) { + HEAP16[$pnt2$177 >> 1] = 0; + HEAP16[$pnt1$178 >> 1] = 0; + $i$176 = $i$176 + 1 | 0; + if (($i$176 | 0) >= ($1 | 0)) break; else { + $pnt1$178 = $pnt1$178 + ($0 << 1) | 0; + $pnt2$177 = $pnt2$177 + ($0 << 1) | 0; + } + } + } + $19 = $labelInfo + 1179664 | 0; + $21 = 0 - $0 | 0; + $$sum1 = 1 - $0 | 0; + $$sum2 = ~$0; + $$sum = ($xsize << 1) + 8 | 0; + L11 : do if (($3 | 0) > 1) { + $28 = ($12 | 0) > 1; + $j$069 = 1; + $pnt$073 = $image + (($xsize << 2) + 4) | 0; + $pnt2$272 = $2 + ($0 + 1 << 1) | 0; + $wk_max$071 = 0; + L13 : while (1) { + if ($28) { + $i$256 = 1; + $pnt$164 = $pnt$073; + $pnt2$363 = $pnt2$272; + $wk_max$158 = $wk_max$071; + while (1) { + $30 = HEAPU8[$pnt$164 >> 0] | 0; + do if ((($30 & 240) + 24 + ($30 << 4 & 240) + ((HEAPU8[$pnt$164 + 1 >> 0] | 0) & 240) | 0) > ($11 | 0)) { + HEAP16[$pnt2$363 >> 1] = 0; + $wk_max$2 = $wk_max$158; + } else { + $43 = HEAP16[$pnt2$363 + ($21 << 1) >> 1] | 0; + if ($43 << 16 >> 16 > 0) { + HEAP16[$pnt2$363 >> 1] = $43; + $46 = ($43 << 16 >> 16) * 7 | 0; + $48 = $labelInfo + 1310736 + ($46 + -7 << 2) | 0; + HEAP32[$48 >> 2] = (HEAP32[$48 >> 2] | 0) + 1; + $52 = $labelInfo + 1310736 + ($46 + -6 << 2) | 0; + HEAP32[$52 >> 2] = (HEAP32[$52 >> 2] | 0) + $i$256; + $56 = $labelInfo + 1310736 + ($46 + -5 << 2) | 0; + HEAP32[$56 >> 2] = (HEAP32[$56 >> 2] | 0) + $j$069; + HEAP32[$labelInfo + 1310736 + ($46 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $62 = HEAP16[$pnt2$363 + ($$sum1 << 1) >> 1] | 0; + $63 = $62 << 16 >> 16; + $66 = HEAP16[$pnt2$363 + ($$sum2 << 1) >> 1] | 0; + $67 = $66 << 16 >> 16; + $68 = $66 << 16 >> 16 > 0; + if ($62 << 16 >> 16 <= 0) { + if ($68) { + HEAP16[$pnt2$363 >> 1] = $66; + $168 = $67 * 7 | 0; + $170 = $labelInfo + 1310736 + ($168 + -7 << 2) | 0; + HEAP32[$170 >> 2] = (HEAP32[$170 >> 2] | 0) + 1; + $174 = $labelInfo + 1310736 + ($168 + -6 << 2) | 0; + HEAP32[$174 >> 2] = (HEAP32[$174 >> 2] | 0) + $i$256; + $178 = $labelInfo + 1310736 + ($168 + -5 << 2) | 0; + HEAP32[$178 >> 2] = (HEAP32[$178 >> 2] | 0) + $j$069; + $182 = $labelInfo + 1310736 + ($168 + -3 << 2) | 0; + if ((HEAP32[$182 >> 2] | 0) < ($i$256 | 0)) HEAP32[$182 >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($168 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $188 = HEAP16[$pnt2$363 + -2 >> 1] | 0; + if ($188 << 16 >> 16 > 0) { + HEAP16[$pnt2$363 >> 1] = $188; + $191 = ($188 << 16 >> 16) * 7 | 0; + $193 = $labelInfo + 1310736 + ($191 + -7 << 2) | 0; + HEAP32[$193 >> 2] = (HEAP32[$193 >> 2] | 0) + 1; + $197 = $labelInfo + 1310736 + ($191 + -6 << 2) | 0; + HEAP32[$197 >> 2] = (HEAP32[$197 >> 2] | 0) + $i$256; + $201 = $labelInfo + 1310736 + ($191 + -5 << 2) | 0; + HEAP32[$201 >> 2] = (HEAP32[$201 >> 2] | 0) + $j$069; + $205 = $labelInfo + 1310736 + ($191 + -3 << 2) | 0; + if ((HEAP32[$205 >> 2] | 0) >= ($i$256 | 0)) { + $wk_max$2 = $wk_max$158; + break; + } + HEAP32[$205 >> 2] = $i$256; + $wk_max$2 = $wk_max$158; + break; + } else { + $208 = $wk_max$158 + 1 | 0; + if (($wk_max$158 | 0) > 32767) break L13; + HEAP16[$pnt2$363 >> 1] = $208; + HEAP32[$labelInfo + 1179664 + ($wk_max$158 << 2) >> 2] = $208 << 16 >> 16; + $213 = $wk_max$158 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($213 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($213 + 1 << 2) >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($213 + 2 << 2) >> 2] = $j$069; + HEAP32[$labelInfo + 1310736 + ($213 + 3 << 2) >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($213 + 4 << 2) >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($213 + 5 << 2) >> 2] = $j$069; + HEAP32[$labelInfo + 1310736 + ($213 + 6 << 2) >> 2] = $j$069; + $wk_max$2 = $208; + break; + } + } + if ($68) { + $71 = HEAP32[$labelInfo + 1179664 + ($63 + -1 << 2) >> 2] | 0; + $74 = HEAP32[$labelInfo + 1179664 + ($67 + -1 << 2) >> 2] | 0; + if (($71 | 0) > ($74 | 0)) { + HEAP16[$pnt2$363 >> 1] = $74; + if (($wk_max$158 | 0) > 0) { + $k$052 = 0; + $wk$053 = $19; + while (1) { + if ((HEAP32[$wk$053 >> 2] | 0) == ($71 | 0)) HEAP32[$wk$053 >> 2] = $74; + $k$052 = $k$052 + 1 | 0; + if (($k$052 | 0) >= ($wk_max$158 | 0)) { + $91 = $74; + break; + } else $wk$053 = $wk$053 + 4 | 0; + } + } else $91 = $74; + } else { + HEAP16[$pnt2$363 >> 1] = $71; + if (($71 | 0) < ($74 | 0) & ($wk_max$158 | 0) > 0) { + $k$149 = 0; + $wk$150 = $19; + while (1) { + if ((HEAP32[$wk$150 >> 2] | 0) == ($74 | 0)) HEAP32[$wk$150 >> 2] = $71; + $k$149 = $k$149 + 1 | 0; + if (($k$149 | 0) >= ($wk_max$158 | 0)) { + $91 = $71; + break; + } else $wk$150 = $wk$150 + 4 | 0; + } + } else $91 = $71; + } + $93 = ($91 << 16 >> 16) * 7 | 0; + $95 = $labelInfo + 1310736 + ($93 + -7 << 2) | 0; + HEAP32[$95 >> 2] = (HEAP32[$95 >> 2] | 0) + 1; + $99 = $labelInfo + 1310736 + ($93 + -6 << 2) | 0; + HEAP32[$99 >> 2] = (HEAP32[$99 >> 2] | 0) + $i$256; + $103 = $labelInfo + 1310736 + ($93 + -5 << 2) | 0; + HEAP32[$103 >> 2] = (HEAP32[$103 >> 2] | 0) + $j$069; + HEAP32[$labelInfo + 1310736 + ($93 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $109 = HEAP16[$pnt2$363 + -2 >> 1] | 0; + if ($109 << 16 >> 16 <= 0) { + HEAP16[$pnt2$363 >> 1] = $62; + $149 = $63 * 7 | 0; + $151 = $labelInfo + 1310736 + ($149 + -7 << 2) | 0; + HEAP32[$151 >> 2] = (HEAP32[$151 >> 2] | 0) + 1; + $155 = $labelInfo + 1310736 + ($149 + -6 << 2) | 0; + HEAP32[$155 >> 2] = (HEAP32[$155 >> 2] | 0) + $i$256; + $159 = $labelInfo + 1310736 + ($149 + -5 << 2) | 0; + HEAP32[$159 >> 2] = (HEAP32[$159 >> 2] | 0) + $j$069; + $163 = $labelInfo + 1310736 + ($149 + -4 << 2) | 0; + if ((HEAP32[$163 >> 2] | 0) > ($i$256 | 0)) HEAP32[$163 >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($149 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $114 = HEAP32[$labelInfo + 1179664 + ($63 + -1 << 2) >> 2] | 0; + $117 = HEAP32[$labelInfo + 1179664 + (($109 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($114 | 0) > ($117 | 0)) { + HEAP16[$pnt2$363 >> 1] = $117; + if (($wk_max$158 | 0) > 0) { + $k$245 = 0; + $wk$246 = $19; + while (1) { + if ((HEAP32[$wk$246 >> 2] | 0) == ($114 | 0)) HEAP32[$wk$246 >> 2] = $117; + $k$245 = $k$245 + 1 | 0; + if (($k$245 | 0) >= ($wk_max$158 | 0)) { + $134 = $117; + break; + } else $wk$246 = $wk$246 + 4 | 0; + } + } else $134 = $117; + } else { + HEAP16[$pnt2$363 >> 1] = $114; + if (($114 | 0) < ($117 | 0) & ($wk_max$158 | 0) > 0) { + $k$342 = 0; + $wk$343 = $19; + while (1) { + if ((HEAP32[$wk$343 >> 2] | 0) == ($117 | 0)) HEAP32[$wk$343 >> 2] = $114; + $k$342 = $k$342 + 1 | 0; + if (($k$342 | 0) >= ($wk_max$158 | 0)) { + $134 = $114; + break; + } else $wk$343 = $wk$343 + 4 | 0; + } + } else $134 = $114; + } + $136 = ($134 << 16 >> 16) * 7 | 0; + $138 = $labelInfo + 1310736 + ($136 + -7 << 2) | 0; + HEAP32[$138 >> 2] = (HEAP32[$138 >> 2] | 0) + 1; + $142 = $labelInfo + 1310736 + ($136 + -6 << 2) | 0; + HEAP32[$142 >> 2] = (HEAP32[$142 >> 2] | 0) + $i$256; + $146 = $labelInfo + 1310736 + ($136 + -5 << 2) | 0; + HEAP32[$146 >> 2] = (HEAP32[$146 >> 2] | 0) + $j$069; + $wk_max$2 = $wk_max$158; + } while (0); + $i$256 = $i$256 + 1 | 0; + $228 = $pnt$164 + 4 | 0; + $229 = $pnt2$363 + 2 | 0; + if (($i$256 | 0) >= ($12 | 0)) { + $pnt$1$lcssa = $228; + $pnt2$3$lcssa = $229; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $pnt$164 = $228; + $pnt2$363 = $229; + $wk_max$158 = $wk_max$2; + } + } + } else { + $pnt$1$lcssa = $pnt$073; + $pnt2$3$lcssa = $pnt2$272; + $wk_max$1$lcssa = $wk_max$071; + } + $j$069 = $j$069 + 1 | 0; + if (($j$069 | 0) >= ($3 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $pnt$073 = $pnt$1$lcssa + $$sum | 0; + $pnt2$272 = $pnt2$3$lcssa + 4 | 0; + $wk_max$071 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $235 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$338 = 1; + $j$139 = 1; + $wk$440 = $19; + while (1) { + $237 = HEAP32[$wk$440 >> 2] | 0; + if (($237 | 0) == ($i$338 | 0)) { + $243 = $j$139; + $j$2 = $j$139 + 1 | 0; + } else { + $243 = HEAP32[$labelInfo + 1179664 + ($237 + -1 << 2) >> 2] | 0; + $j$2 = $j$139; + } + HEAP32[$wk$440 >> 2] = $243; + if (($i$338 | 0) < ($wk_max$0$lcssa | 0)) { + $i$338 = $i$338 + 1 | 0; + $j$139 = $j$2; + $wk$440 = $wk$440 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $247 = $labelInfo + 8 | 0; + $248 = $j$1$lcssa + -1 | 0; + HEAP32[$247 >> 2] = $248; + if (!$248) $$0 = 0; else { + _memset($235 | 0, 0, $248 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $248 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$436 = 0; + do { + $255 = $i$436 << 2; + HEAP32[$labelInfo + 131084 + ($255 << 2) >> 2] = $0; + HEAP32[$labelInfo + 131084 + (($255 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($255 | 2) << 2) >> 2] = $1; + HEAP32[$labelInfo + 131084 + (($255 | 3) << 2) >> 2] = 0; + $i$436 = $i$436 + 1 | 0; + } while (($i$436 | 0) < (HEAP32[$247 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$534 = 0; + do { + $269 = (HEAP32[$labelInfo + 1179664 + ($i$534 << 2) >> 2] | 0) + -1 | 0; + $270 = $i$534 * 7 | 0; + $273 = $labelInfo + 12 + ($269 << 2) | 0; + HEAP32[$273 >> 2] = (HEAP32[$273 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($270 << 2) >> 2] | 0); + $280 = $269 << 1; + $281 = $labelInfo + 655376 + ($280 << 3) | 0; + HEAPF64[$281 >> 3] = +HEAPF64[$281 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($270 + 1 << 2) >> 2] | 0); + $289 = $labelInfo + 655376 + (($280 | 1) << 3) | 0; + HEAPF64[$289 >> 3] = +HEAPF64[$289 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($270 + 2 << 2) >> 2] | 0); + $292 = $269 << 2; + $293 = $labelInfo + 131084 + ($292 << 2) | 0; + $297 = HEAP32[$labelInfo + 1310736 + ($270 + 3 << 2) >> 2] | 0; + if ((HEAP32[$293 >> 2] | 0) > ($297 | 0)) HEAP32[$293 >> 2] = $297; + $300 = $labelInfo + 131084 + (($292 | 1) << 2) | 0; + $304 = HEAP32[$labelInfo + 1310736 + ($270 + 4 << 2) >> 2] | 0; + if ((HEAP32[$300 >> 2] | 0) < ($304 | 0)) HEAP32[$300 >> 2] = $304; + $307 = $labelInfo + 131084 + (($292 | 2) << 2) | 0; + $311 = HEAP32[$labelInfo + 1310736 + ($270 + 5 << 2) >> 2] | 0; + if ((HEAP32[$307 >> 2] | 0) > ($311 | 0)) HEAP32[$307 >> 2] = $311; + $314 = $labelInfo + 131084 + (($292 | 3) << 2) | 0; + $318 = HEAP32[$labelInfo + 1310736 + ($270 + 6 << 2) >> 2] | 0; + if ((HEAP32[$314 >> 2] | 0) < ($318 | 0)) HEAP32[$314 >> 2] = $318; + $i$534 = $i$534 + 1 | 0; + } while (($i$534 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$247 >> 2] | 0) > 0) { + $i$633 = 0; + do { + $322 = $labelInfo + 12 + ($i$633 << 2) | 0; + $325 = $i$633 << 1; + $326 = $labelInfo + 655376 + ($325 << 3) | 0; + HEAPF64[$326 >> 3] = +HEAPF64[$326 >> 3] / +(HEAP32[$322 >> 2] | 0); + $332 = $labelInfo + 655376 + (($325 | 1) << 3) | 0; + HEAPF64[$332 >> 3] = +HEAPF64[$332 >> 3] / +(HEAP32[$322 >> 2] | 0); + $i$633 = $i$633 + 1 | 0; + } while (($i$633 | 0) < (HEAP32[$247 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} +function _arLabelingSubDWI3CA4444($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $$sum2 = 0, $0 = 0, $1 = 0, $103 = 0, $109 = 0, $11 = 0, $114 = 0, $117 = 0, $12 = 0, $134 = 0, $136 = 0, $138 = 0, $142 = 0, $146 = 0, $149 = 0, $151 = 0, $155 = 0, $159 = 0, $163 = 0, $168 = 0, $170 = 0, $174 = 0, $178 = 0, $182 = 0, $188 = 0, $19 = 0, $191 = 0, $193 = 0, $197 = 0, $2 = 0, $201 = 0, $205 = 0, $208 = 0, $21 = 0, $213 = 0, $228 = 0, $229 = 0, $235 = 0, $237 = 0, $243 = 0, $247 = 0, $248 = 0, $255 = 0, $269 = 0, $270 = 0, $273 = 0, $28 = 0, $280 = 0, $281 = 0, $289 = 0, $292 = 0, $293 = 0, $297 = 0, $3 = 0, $30 = 0, $300 = 0, $304 = 0, $307 = 0, $311 = 0, $314 = 0, $318 = 0, $322 = 0, $325 = 0, $326 = 0, $332 = 0, $43 = 0, $46 = 0, $48 = 0, $52 = 0, $56 = 0, $62 = 0, $63 = 0, $66 = 0, $67 = 0, $68 = 0, $71 = 0, $74 = 0, $91 = 0, $93 = 0, $95 = 0, $99 = 0, $i$082 = 0, $i$176 = 0, $i$256 = 0, $i$338 = 0, $i$436 = 0, $i$534 = 0, $i$633 = 0, $j$069 = 0, $j$1$lcssa = 0, $j$139 = 0, $j$2 = 0, $k$052 = 0, $k$149 = 0, $k$245 = 0, $k$342 = 0, $pnt$073 = 0, $pnt$1$lcssa = 0, $pnt$164 = 0, $pnt1$084 = 0, $pnt1$178 = 0, $pnt2$083 = 0, $pnt2$177 = 0, $pnt2$272 = 0, $pnt2$3$lcssa = 0, $pnt2$363 = 0, $vararg_buffer = 0, $wk$053 = 0, $wk$150 = 0, $wk$246 = 0, $wk$343 = 0, $wk$440 = 0, $wk_max$0$lcssa = 0, $wk_max$071 = 0, $wk_max$1$lcssa = 0, $wk_max$158 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = ($xsize | 0) / 2 | 0; + $1 = ($ysize | 0) / 2 | 0; + $2 = HEAP32[$labelInfo >> 2] | 0; + $3 = $1 + -1 | 0; + if (($xsize | 0) > 1) { + $i$082 = 0; + $pnt1$084 = $2; + $pnt2$083 = $2 + ((Math_imul($3, $0) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$083 >> 1] = 0; + HEAP16[$pnt1$084 >> 1] = 0; + $i$082 = $i$082 + 1 | 0; + if (($i$082 | 0) >= ($0 | 0)) break; else { + $pnt1$084 = $pnt1$084 + 2 | 0; + $pnt2$083 = $pnt2$083 + 2 | 0; + } + } + } + $11 = $labelingThresh * 3 | 0; + $12 = $0 + -1 | 0; + if (($ysize | 0) > 1) { + $i$176 = 0; + $pnt1$178 = $2; + $pnt2$177 = $2 + ($12 << 1) | 0; + while (1) { + HEAP16[$pnt2$177 >> 1] = 0; + HEAP16[$pnt1$178 >> 1] = 0; + $i$176 = $i$176 + 1 | 0; + if (($i$176 | 0) >= ($1 | 0)) break; else { + $pnt1$178 = $pnt1$178 + ($0 << 1) | 0; + $pnt2$177 = $pnt2$177 + ($0 << 1) | 0; + } + } + } + $19 = $labelInfo + 1179664 | 0; + $21 = 0 - $0 | 0; + $$sum1 = 1 - $0 | 0; + $$sum2 = ~$0; + $$sum = ($xsize << 1) + 8 | 0; + L11 : do if (($3 | 0) > 1) { + $28 = ($12 | 0) > 1; + $j$069 = 1; + $pnt$073 = $image + (($xsize << 2) + 4) | 0; + $pnt2$272 = $2 + ($0 + 1 << 1) | 0; + $wk_max$071 = 0; + L13 : while (1) { + if ($28) { + $i$256 = 1; + $pnt$164 = $pnt$073; + $pnt2$363 = $pnt2$272; + $wk_max$158 = $wk_max$071; + while (1) { + $30 = HEAPU8[$pnt$164 >> 0] | 0; + do if ((($30 & 240) + 24 + ($30 << 4 & 240) + ((HEAPU8[$pnt$164 + 1 >> 0] | 0) & 240) | 0) > ($11 | 0)) { + $43 = HEAP16[$pnt2$363 + ($21 << 1) >> 1] | 0; + if ($43 << 16 >> 16 > 0) { + HEAP16[$pnt2$363 >> 1] = $43; + $46 = ($43 << 16 >> 16) * 7 | 0; + $48 = $labelInfo + 1310736 + ($46 + -7 << 2) | 0; + HEAP32[$48 >> 2] = (HEAP32[$48 >> 2] | 0) + 1; + $52 = $labelInfo + 1310736 + ($46 + -6 << 2) | 0; + HEAP32[$52 >> 2] = (HEAP32[$52 >> 2] | 0) + $i$256; + $56 = $labelInfo + 1310736 + ($46 + -5 << 2) | 0; + HEAP32[$56 >> 2] = (HEAP32[$56 >> 2] | 0) + $j$069; + HEAP32[$labelInfo + 1310736 + ($46 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $62 = HEAP16[$pnt2$363 + ($$sum1 << 1) >> 1] | 0; + $63 = $62 << 16 >> 16; + $66 = HEAP16[$pnt2$363 + ($$sum2 << 1) >> 1] | 0; + $67 = $66 << 16 >> 16; + $68 = $66 << 16 >> 16 > 0; + if ($62 << 16 >> 16 <= 0) { + if ($68) { + HEAP16[$pnt2$363 >> 1] = $66; + $168 = $67 * 7 | 0; + $170 = $labelInfo + 1310736 + ($168 + -7 << 2) | 0; + HEAP32[$170 >> 2] = (HEAP32[$170 >> 2] | 0) + 1; + $174 = $labelInfo + 1310736 + ($168 + -6 << 2) | 0; + HEAP32[$174 >> 2] = (HEAP32[$174 >> 2] | 0) + $i$256; + $178 = $labelInfo + 1310736 + ($168 + -5 << 2) | 0; + HEAP32[$178 >> 2] = (HEAP32[$178 >> 2] | 0) + $j$069; + $182 = $labelInfo + 1310736 + ($168 + -3 << 2) | 0; + if ((HEAP32[$182 >> 2] | 0) < ($i$256 | 0)) HEAP32[$182 >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($168 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $188 = HEAP16[$pnt2$363 + -2 >> 1] | 0; + if ($188 << 16 >> 16 > 0) { + HEAP16[$pnt2$363 >> 1] = $188; + $191 = ($188 << 16 >> 16) * 7 | 0; + $193 = $labelInfo + 1310736 + ($191 + -7 << 2) | 0; + HEAP32[$193 >> 2] = (HEAP32[$193 >> 2] | 0) + 1; + $197 = $labelInfo + 1310736 + ($191 + -6 << 2) | 0; + HEAP32[$197 >> 2] = (HEAP32[$197 >> 2] | 0) + $i$256; + $201 = $labelInfo + 1310736 + ($191 + -5 << 2) | 0; + HEAP32[$201 >> 2] = (HEAP32[$201 >> 2] | 0) + $j$069; + $205 = $labelInfo + 1310736 + ($191 + -3 << 2) | 0; + if ((HEAP32[$205 >> 2] | 0) >= ($i$256 | 0)) { + $wk_max$2 = $wk_max$158; + break; + } + HEAP32[$205 >> 2] = $i$256; + $wk_max$2 = $wk_max$158; + break; + } else { + $208 = $wk_max$158 + 1 | 0; + if (($wk_max$158 | 0) > 32767) break L13; + HEAP16[$pnt2$363 >> 1] = $208; + HEAP32[$labelInfo + 1179664 + ($wk_max$158 << 2) >> 2] = $208 << 16 >> 16; + $213 = $wk_max$158 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($213 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($213 + 1 << 2) >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($213 + 2 << 2) >> 2] = $j$069; + HEAP32[$labelInfo + 1310736 + ($213 + 3 << 2) >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($213 + 4 << 2) >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($213 + 5 << 2) >> 2] = $j$069; + HEAP32[$labelInfo + 1310736 + ($213 + 6 << 2) >> 2] = $j$069; + $wk_max$2 = $208; + break; + } + } + if ($68) { + $71 = HEAP32[$labelInfo + 1179664 + ($63 + -1 << 2) >> 2] | 0; + $74 = HEAP32[$labelInfo + 1179664 + ($67 + -1 << 2) >> 2] | 0; + if (($71 | 0) > ($74 | 0)) { + HEAP16[$pnt2$363 >> 1] = $74; + if (($wk_max$158 | 0) > 0) { + $k$052 = 0; + $wk$053 = $19; + while (1) { + if ((HEAP32[$wk$053 >> 2] | 0) == ($71 | 0)) HEAP32[$wk$053 >> 2] = $74; + $k$052 = $k$052 + 1 | 0; + if (($k$052 | 0) >= ($wk_max$158 | 0)) { + $91 = $74; + break; + } else $wk$053 = $wk$053 + 4 | 0; + } + } else $91 = $74; + } else { + HEAP16[$pnt2$363 >> 1] = $71; + if (($71 | 0) < ($74 | 0) & ($wk_max$158 | 0) > 0) { + $k$149 = 0; + $wk$150 = $19; + while (1) { + if ((HEAP32[$wk$150 >> 2] | 0) == ($74 | 0)) HEAP32[$wk$150 >> 2] = $71; + $k$149 = $k$149 + 1 | 0; + if (($k$149 | 0) >= ($wk_max$158 | 0)) { + $91 = $71; + break; + } else $wk$150 = $wk$150 + 4 | 0; + } + } else $91 = $71; + } + $93 = ($91 << 16 >> 16) * 7 | 0; + $95 = $labelInfo + 1310736 + ($93 + -7 << 2) | 0; + HEAP32[$95 >> 2] = (HEAP32[$95 >> 2] | 0) + 1; + $99 = $labelInfo + 1310736 + ($93 + -6 << 2) | 0; + HEAP32[$99 >> 2] = (HEAP32[$99 >> 2] | 0) + $i$256; + $103 = $labelInfo + 1310736 + ($93 + -5 << 2) | 0; + HEAP32[$103 >> 2] = (HEAP32[$103 >> 2] | 0) + $j$069; + HEAP32[$labelInfo + 1310736 + ($93 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $109 = HEAP16[$pnt2$363 + -2 >> 1] | 0; + if ($109 << 16 >> 16 <= 0) { + HEAP16[$pnt2$363 >> 1] = $62; + $149 = $63 * 7 | 0; + $151 = $labelInfo + 1310736 + ($149 + -7 << 2) | 0; + HEAP32[$151 >> 2] = (HEAP32[$151 >> 2] | 0) + 1; + $155 = $labelInfo + 1310736 + ($149 + -6 << 2) | 0; + HEAP32[$155 >> 2] = (HEAP32[$155 >> 2] | 0) + $i$256; + $159 = $labelInfo + 1310736 + ($149 + -5 << 2) | 0; + HEAP32[$159 >> 2] = (HEAP32[$159 >> 2] | 0) + $j$069; + $163 = $labelInfo + 1310736 + ($149 + -4 << 2) | 0; + if ((HEAP32[$163 >> 2] | 0) > ($i$256 | 0)) HEAP32[$163 >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($149 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $114 = HEAP32[$labelInfo + 1179664 + ($63 + -1 << 2) >> 2] | 0; + $117 = HEAP32[$labelInfo + 1179664 + (($109 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($114 | 0) > ($117 | 0)) { + HEAP16[$pnt2$363 >> 1] = $117; + if (($wk_max$158 | 0) > 0) { + $k$245 = 0; + $wk$246 = $19; + while (1) { + if ((HEAP32[$wk$246 >> 2] | 0) == ($114 | 0)) HEAP32[$wk$246 >> 2] = $117; + $k$245 = $k$245 + 1 | 0; + if (($k$245 | 0) >= ($wk_max$158 | 0)) { + $134 = $117; + break; + } else $wk$246 = $wk$246 + 4 | 0; + } + } else $134 = $117; + } else { + HEAP16[$pnt2$363 >> 1] = $114; + if (($114 | 0) < ($117 | 0) & ($wk_max$158 | 0) > 0) { + $k$342 = 0; + $wk$343 = $19; + while (1) { + if ((HEAP32[$wk$343 >> 2] | 0) == ($117 | 0)) HEAP32[$wk$343 >> 2] = $114; + $k$342 = $k$342 + 1 | 0; + if (($k$342 | 0) >= ($wk_max$158 | 0)) { + $134 = $114; + break; + } else $wk$343 = $wk$343 + 4 | 0; + } + } else $134 = $114; + } + $136 = ($134 << 16 >> 16) * 7 | 0; + $138 = $labelInfo + 1310736 + ($136 + -7 << 2) | 0; + HEAP32[$138 >> 2] = (HEAP32[$138 >> 2] | 0) + 1; + $142 = $labelInfo + 1310736 + ($136 + -6 << 2) | 0; + HEAP32[$142 >> 2] = (HEAP32[$142 >> 2] | 0) + $i$256; + $146 = $labelInfo + 1310736 + ($136 + -5 << 2) | 0; + HEAP32[$146 >> 2] = (HEAP32[$146 >> 2] | 0) + $j$069; + $wk_max$2 = $wk_max$158; + } else { + HEAP16[$pnt2$363 >> 1] = 0; + $wk_max$2 = $wk_max$158; + } while (0); + $i$256 = $i$256 + 1 | 0; + $228 = $pnt$164 + 4 | 0; + $229 = $pnt2$363 + 2 | 0; + if (($i$256 | 0) >= ($12 | 0)) { + $pnt$1$lcssa = $228; + $pnt2$3$lcssa = $229; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $pnt$164 = $228; + $pnt2$363 = $229; + $wk_max$158 = $wk_max$2; + } + } + } else { + $pnt$1$lcssa = $pnt$073; + $pnt2$3$lcssa = $pnt2$272; + $wk_max$1$lcssa = $wk_max$071; + } + $j$069 = $j$069 + 1 | 0; + if (($j$069 | 0) >= ($3 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $pnt$073 = $pnt$1$lcssa + $$sum | 0; + $pnt2$272 = $pnt2$3$lcssa + 4 | 0; + $wk_max$071 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $235 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$338 = 1; + $j$139 = 1; + $wk$440 = $19; + while (1) { + $237 = HEAP32[$wk$440 >> 2] | 0; + if (($237 | 0) == ($i$338 | 0)) { + $243 = $j$139; + $j$2 = $j$139 + 1 | 0; + } else { + $243 = HEAP32[$labelInfo + 1179664 + ($237 + -1 << 2) >> 2] | 0; + $j$2 = $j$139; + } + HEAP32[$wk$440 >> 2] = $243; + if (($i$338 | 0) < ($wk_max$0$lcssa | 0)) { + $i$338 = $i$338 + 1 | 0; + $j$139 = $j$2; + $wk$440 = $wk$440 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $247 = $labelInfo + 8 | 0; + $248 = $j$1$lcssa + -1 | 0; + HEAP32[$247 >> 2] = $248; + if (!$248) $$0 = 0; else { + _memset($235 | 0, 0, $248 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $248 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$436 = 0; + do { + $255 = $i$436 << 2; + HEAP32[$labelInfo + 131084 + ($255 << 2) >> 2] = $0; + HEAP32[$labelInfo + 131084 + (($255 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($255 | 2) << 2) >> 2] = $1; + HEAP32[$labelInfo + 131084 + (($255 | 3) << 2) >> 2] = 0; + $i$436 = $i$436 + 1 | 0; + } while (($i$436 | 0) < (HEAP32[$247 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$534 = 0; + do { + $269 = (HEAP32[$labelInfo + 1179664 + ($i$534 << 2) >> 2] | 0) + -1 | 0; + $270 = $i$534 * 7 | 0; + $273 = $labelInfo + 12 + ($269 << 2) | 0; + HEAP32[$273 >> 2] = (HEAP32[$273 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($270 << 2) >> 2] | 0); + $280 = $269 << 1; + $281 = $labelInfo + 655376 + ($280 << 3) | 0; + HEAPF64[$281 >> 3] = +HEAPF64[$281 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($270 + 1 << 2) >> 2] | 0); + $289 = $labelInfo + 655376 + (($280 | 1) << 3) | 0; + HEAPF64[$289 >> 3] = +HEAPF64[$289 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($270 + 2 << 2) >> 2] | 0); + $292 = $269 << 2; + $293 = $labelInfo + 131084 + ($292 << 2) | 0; + $297 = HEAP32[$labelInfo + 1310736 + ($270 + 3 << 2) >> 2] | 0; + if ((HEAP32[$293 >> 2] | 0) > ($297 | 0)) HEAP32[$293 >> 2] = $297; + $300 = $labelInfo + 131084 + (($292 | 1) << 2) | 0; + $304 = HEAP32[$labelInfo + 1310736 + ($270 + 4 << 2) >> 2] | 0; + if ((HEAP32[$300 >> 2] | 0) < ($304 | 0)) HEAP32[$300 >> 2] = $304; + $307 = $labelInfo + 131084 + (($292 | 2) << 2) | 0; + $311 = HEAP32[$labelInfo + 1310736 + ($270 + 5 << 2) >> 2] | 0; + if ((HEAP32[$307 >> 2] | 0) > ($311 | 0)) HEAP32[$307 >> 2] = $311; + $314 = $labelInfo + 131084 + (($292 | 3) << 2) | 0; + $318 = HEAP32[$labelInfo + 1310736 + ($270 + 6 << 2) >> 2] | 0; + if ((HEAP32[$314 >> 2] | 0) < ($318 | 0)) HEAP32[$314 >> 2] = $318; + $i$534 = $i$534 + 1 | 0; + } while (($i$534 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$247 >> 2] | 0) > 0) { + $i$633 = 0; + do { + $322 = $labelInfo + 12 + ($i$633 << 2) | 0; + $325 = $i$633 << 1; + $326 = $labelInfo + 655376 + ($325 << 3) | 0; + HEAPF64[$326 >> 3] = +HEAPF64[$326 >> 3] / +(HEAP32[$322 >> 2] | 0); + $332 = $labelInfo + 655376 + (($325 | 1) << 3) | 0; + HEAPF64[$332 >> 3] = +HEAPF64[$332 >> 3] / +(HEAP32[$322 >> 2] | 0); + $i$633 = $i$633 + 1 | 0; + } while (($i$633 | 0) < (HEAP32[$247 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubDWR3CA5551($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $0 = 0, $1 = 0, $10 = 0, $103 = 0, $109 = 0, $114 = 0, $117 = 0, $134 = 0, $136 = 0, $138 = 0, $142 = 0, $146 = 0, $149 = 0, $151 = 0, $155 = 0, $159 = 0, $163 = 0, $168 = 0, $17 = 0, $170 = 0, $174 = 0, $178 = 0, $18 = 0, $182 = 0, $188 = 0, $19 = 0, $191 = 0, $193 = 0, $197 = 0, $201 = 0, $205 = 0, $208 = 0, $213 = 0, $228 = 0, $229 = 0, $235 = 0, $237 = 0, $24 = 0, $243 = 0, $247 = 0, $248 = 0, $255 = 0, $26 = 0, $269 = 0, $270 = 0, $273 = 0, $280 = 0, $281 = 0, $289 = 0, $292 = 0, $293 = 0, $297 = 0, $300 = 0, $304 = 0, $307 = 0, $311 = 0, $314 = 0, $318 = 0, $32 = 0, $322 = 0, $325 = 0, $326 = 0, $332 = 0, $43 = 0, $46 = 0, $48 = 0, $52 = 0, $56 = 0, $62 = 0, $63 = 0, $66 = 0, $67 = 0, $68 = 0, $71 = 0, $74 = 0, $9 = 0, $91 = 0, $93 = 0, $95 = 0, $99 = 0, $i$081 = 0, $i$175 = 0, $i$255 = 0, $i$337 = 0, $i$435 = 0, $i$533 = 0, $i$632 = 0, $j$068 = 0, $j$1$lcssa = 0, $j$138 = 0, $j$2 = 0, $k$051 = 0, $k$148 = 0, $k$244 = 0, $k$341 = 0, $pnt$072 = 0, $pnt$1$lcssa = 0, $pnt$163 = 0, $pnt1$083 = 0, $pnt1$177 = 0, $pnt2$082 = 0, $pnt2$176 = 0, $pnt2$271 = 0, $pnt2$3$lcssa = 0, $pnt2$362 = 0, $vararg_buffer = 0, $wk$052 = 0, $wk$149 = 0, $wk$245 = 0, $wk$342 = 0, $wk$439 = 0, $wk_max$0$lcssa = 0, $wk_max$070 = 0, $wk_max$1$lcssa = 0, $wk_max$157 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = HEAP32[$labelInfo >> 2] | 0; + $1 = $ysize + -1 | 0; + if (($xsize | 0) > 0) { + $i$081 = 0; + $pnt1$083 = $0; + $pnt2$082 = $0 + ((Math_imul($1, $xsize) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$082 >> 1] = 0; + HEAP16[$pnt1$083 >> 1] = 0; + $i$081 = $i$081 + 1 | 0; + if (($i$081 | 0) >= ($xsize | 0)) break; else { + $pnt1$083 = $pnt1$083 + 2 | 0; + $pnt2$082 = $pnt2$082 + 2 | 0; + } + } + } + $9 = $labelingThresh * 3 | 0; + $10 = $xsize + -1 | 0; + if (($ysize | 0) > 0) { + $i$175 = 0; + $pnt1$177 = $0; + $pnt2$176 = $0 + ($10 << 1) | 0; + while (1) { + HEAP16[$pnt2$176 >> 1] = 0; + HEAP16[$pnt1$177 >> 1] = 0; + $i$175 = $i$175 + 1 | 0; + if (($i$175 | 0) >= ($ysize | 0)) break; else { + $pnt1$177 = $pnt1$177 + ($xsize << 1) | 0; + $pnt2$176 = $pnt2$176 + ($xsize << 1) | 0; + } + } + } + $17 = $labelInfo + 1179664 | 0; + $18 = $xsize + 1 | 0; + $19 = 0 - $xsize | 0; + $$sum = 1 - $xsize | 0; + $$sum1 = ~$xsize; + L11 : do if (($1 | 0) > 1) { + $24 = ($10 | 0) > 1; + $j$068 = 1; + $pnt$072 = $image + ($18 << 1) | 0; + $pnt2$271 = $0 + ($18 << 1) | 0; + $wk_max$070 = 0; + L13 : while (1) { + if ($24) { + $i$255 = 1; + $pnt$163 = $pnt$072; + $pnt2$362 = $pnt2$271; + $wk_max$157 = $wk_max$070; + while (1) { + $26 = HEAPU8[$pnt$163 >> 0] | 0; + $32 = HEAPU8[$pnt$163 + 1 >> 0] | 0; + do if ((($26 & 248) + 12 + ($26 << 5 & 224) + ($32 >>> 3 & 24) + ($32 << 2 & 248) | 0) > ($9 | 0)) { + $43 = HEAP16[$pnt2$362 + ($19 << 1) >> 1] | 0; + if ($43 << 16 >> 16 > 0) { + HEAP16[$pnt2$362 >> 1] = $43; + $46 = ($43 << 16 >> 16) * 7 | 0; + $48 = $labelInfo + 1310736 + ($46 + -7 << 2) | 0; + HEAP32[$48 >> 2] = (HEAP32[$48 >> 2] | 0) + 1; + $52 = $labelInfo + 1310736 + ($46 + -6 << 2) | 0; + HEAP32[$52 >> 2] = (HEAP32[$52 >> 2] | 0) + $i$255; + $56 = $labelInfo + 1310736 + ($46 + -5 << 2) | 0; + HEAP32[$56 >> 2] = (HEAP32[$56 >> 2] | 0) + $j$068; + HEAP32[$labelInfo + 1310736 + ($46 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $62 = HEAP16[$pnt2$362 + ($$sum << 1) >> 1] | 0; + $63 = $62 << 16 >> 16; + $66 = HEAP16[$pnt2$362 + ($$sum1 << 1) >> 1] | 0; + $67 = $66 << 16 >> 16; + $68 = $66 << 16 >> 16 > 0; + if ($62 << 16 >> 16 <= 0) { + if ($68) { + HEAP16[$pnt2$362 >> 1] = $66; + $168 = $67 * 7 | 0; + $170 = $labelInfo + 1310736 + ($168 + -7 << 2) | 0; + HEAP32[$170 >> 2] = (HEAP32[$170 >> 2] | 0) + 1; + $174 = $labelInfo + 1310736 + ($168 + -6 << 2) | 0; + HEAP32[$174 >> 2] = (HEAP32[$174 >> 2] | 0) + $i$255; + $178 = $labelInfo + 1310736 + ($168 + -5 << 2) | 0; + HEAP32[$178 >> 2] = (HEAP32[$178 >> 2] | 0) + $j$068; + $182 = $labelInfo + 1310736 + ($168 + -3 << 2) | 0; + if ((HEAP32[$182 >> 2] | 0) < ($i$255 | 0)) HEAP32[$182 >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($168 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $188 = HEAP16[$pnt2$362 + -2 >> 1] | 0; + if ($188 << 16 >> 16 > 0) { + HEAP16[$pnt2$362 >> 1] = $188; + $191 = ($188 << 16 >> 16) * 7 | 0; + $193 = $labelInfo + 1310736 + ($191 + -7 << 2) | 0; + HEAP32[$193 >> 2] = (HEAP32[$193 >> 2] | 0) + 1; + $197 = $labelInfo + 1310736 + ($191 + -6 << 2) | 0; + HEAP32[$197 >> 2] = (HEAP32[$197 >> 2] | 0) + $i$255; + $201 = $labelInfo + 1310736 + ($191 + -5 << 2) | 0; + HEAP32[$201 >> 2] = (HEAP32[$201 >> 2] | 0) + $j$068; + $205 = $labelInfo + 1310736 + ($191 + -3 << 2) | 0; + if ((HEAP32[$205 >> 2] | 0) >= ($i$255 | 0)) { + $wk_max$2 = $wk_max$157; + break; + } + HEAP32[$205 >> 2] = $i$255; + $wk_max$2 = $wk_max$157; + break; + } else { + $208 = $wk_max$157 + 1 | 0; + if (($wk_max$157 | 0) > 32767) break L13; + HEAP16[$pnt2$362 >> 1] = $208; + HEAP32[$labelInfo + 1179664 + ($wk_max$157 << 2) >> 2] = $208 << 16 >> 16; + $213 = $wk_max$157 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($213 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($213 + 1 << 2) >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($213 + 2 << 2) >> 2] = $j$068; + HEAP32[$labelInfo + 1310736 + ($213 + 3 << 2) >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($213 + 4 << 2) >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($213 + 5 << 2) >> 2] = $j$068; + HEAP32[$labelInfo + 1310736 + ($213 + 6 << 2) >> 2] = $j$068; + $wk_max$2 = $208; + break; + } + } + if ($68) { + $71 = HEAP32[$labelInfo + 1179664 + ($63 + -1 << 2) >> 2] | 0; + $74 = HEAP32[$labelInfo + 1179664 + ($67 + -1 << 2) >> 2] | 0; + if (($71 | 0) > ($74 | 0)) { + HEAP16[$pnt2$362 >> 1] = $74; + if (($wk_max$157 | 0) > 0) { + $k$051 = 0; + $wk$052 = $17; + while (1) { + if ((HEAP32[$wk$052 >> 2] | 0) == ($71 | 0)) HEAP32[$wk$052 >> 2] = $74; + $k$051 = $k$051 + 1 | 0; + if (($k$051 | 0) >= ($wk_max$157 | 0)) { + $91 = $74; + break; + } else $wk$052 = $wk$052 + 4 | 0; + } + } else $91 = $74; + } else { + HEAP16[$pnt2$362 >> 1] = $71; + if (($71 | 0) < ($74 | 0) & ($wk_max$157 | 0) > 0) { + $k$148 = 0; + $wk$149 = $17; + while (1) { + if ((HEAP32[$wk$149 >> 2] | 0) == ($74 | 0)) HEAP32[$wk$149 >> 2] = $71; + $k$148 = $k$148 + 1 | 0; + if (($k$148 | 0) >= ($wk_max$157 | 0)) { + $91 = $71; + break; + } else $wk$149 = $wk$149 + 4 | 0; + } + } else $91 = $71; + } + $93 = ($91 << 16 >> 16) * 7 | 0; + $95 = $labelInfo + 1310736 + ($93 + -7 << 2) | 0; + HEAP32[$95 >> 2] = (HEAP32[$95 >> 2] | 0) + 1; + $99 = $labelInfo + 1310736 + ($93 + -6 << 2) | 0; + HEAP32[$99 >> 2] = (HEAP32[$99 >> 2] | 0) + $i$255; + $103 = $labelInfo + 1310736 + ($93 + -5 << 2) | 0; + HEAP32[$103 >> 2] = (HEAP32[$103 >> 2] | 0) + $j$068; + HEAP32[$labelInfo + 1310736 + ($93 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $109 = HEAP16[$pnt2$362 + -2 >> 1] | 0; + if ($109 << 16 >> 16 <= 0) { + HEAP16[$pnt2$362 >> 1] = $62; + $149 = $63 * 7 | 0; + $151 = $labelInfo + 1310736 + ($149 + -7 << 2) | 0; + HEAP32[$151 >> 2] = (HEAP32[$151 >> 2] | 0) + 1; + $155 = $labelInfo + 1310736 + ($149 + -6 << 2) | 0; + HEAP32[$155 >> 2] = (HEAP32[$155 >> 2] | 0) + $i$255; + $159 = $labelInfo + 1310736 + ($149 + -5 << 2) | 0; + HEAP32[$159 >> 2] = (HEAP32[$159 >> 2] | 0) + $j$068; + $163 = $labelInfo + 1310736 + ($149 + -4 << 2) | 0; + if ((HEAP32[$163 >> 2] | 0) > ($i$255 | 0)) HEAP32[$163 >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($149 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $114 = HEAP32[$labelInfo + 1179664 + ($63 + -1 << 2) >> 2] | 0; + $117 = HEAP32[$labelInfo + 1179664 + (($109 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($114 | 0) > ($117 | 0)) { + HEAP16[$pnt2$362 >> 1] = $117; + if (($wk_max$157 | 0) > 0) { + $k$244 = 0; + $wk$245 = $17; + while (1) { + if ((HEAP32[$wk$245 >> 2] | 0) == ($114 | 0)) HEAP32[$wk$245 >> 2] = $117; + $k$244 = $k$244 + 1 | 0; + if (($k$244 | 0) >= ($wk_max$157 | 0)) { + $134 = $117; + break; + } else $wk$245 = $wk$245 + 4 | 0; + } + } else $134 = $117; + } else { + HEAP16[$pnt2$362 >> 1] = $114; + if (($114 | 0) < ($117 | 0) & ($wk_max$157 | 0) > 0) { + $k$341 = 0; + $wk$342 = $17; + while (1) { + if ((HEAP32[$wk$342 >> 2] | 0) == ($117 | 0)) HEAP32[$wk$342 >> 2] = $114; + $k$341 = $k$341 + 1 | 0; + if (($k$341 | 0) >= ($wk_max$157 | 0)) { + $134 = $114; + break; + } else $wk$342 = $wk$342 + 4 | 0; + } + } else $134 = $114; + } + $136 = ($134 << 16 >> 16) * 7 | 0; + $138 = $labelInfo + 1310736 + ($136 + -7 << 2) | 0; + HEAP32[$138 >> 2] = (HEAP32[$138 >> 2] | 0) + 1; + $142 = $labelInfo + 1310736 + ($136 + -6 << 2) | 0; + HEAP32[$142 >> 2] = (HEAP32[$142 >> 2] | 0) + $i$255; + $146 = $labelInfo + 1310736 + ($136 + -5 << 2) | 0; + HEAP32[$146 >> 2] = (HEAP32[$146 >> 2] | 0) + $j$068; + $wk_max$2 = $wk_max$157; + } else { + HEAP16[$pnt2$362 >> 1] = 0; + $wk_max$2 = $wk_max$157; + } while (0); + $i$255 = $i$255 + 1 | 0; + $228 = $pnt$163 + 2 | 0; + $229 = $pnt2$362 + 2 | 0; + if (($i$255 | 0) >= ($10 | 0)) { + $pnt$1$lcssa = $228; + $pnt2$3$lcssa = $229; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $pnt$163 = $228; + $pnt2$362 = $229; + $wk_max$157 = $wk_max$2; + } + } + } else { + $pnt$1$lcssa = $pnt$072; + $pnt2$3$lcssa = $pnt2$271; + $wk_max$1$lcssa = $wk_max$070; + } + $j$068 = $j$068 + 1 | 0; + if (($j$068 | 0) >= ($1 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $pnt$072 = $pnt$1$lcssa + 4 | 0; + $pnt2$271 = $pnt2$3$lcssa + 4 | 0; + $wk_max$070 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $235 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$337 = 1; + $j$138 = 1; + $wk$439 = $17; + while (1) { + $237 = HEAP32[$wk$439 >> 2] | 0; + if (($237 | 0) == ($i$337 | 0)) { + $243 = $j$138; + $j$2 = $j$138 + 1 | 0; + } else { + $243 = HEAP32[$labelInfo + 1179664 + ($237 + -1 << 2) >> 2] | 0; + $j$2 = $j$138; + } + HEAP32[$wk$439 >> 2] = $243; + if (($i$337 | 0) < ($wk_max$0$lcssa | 0)) { + $i$337 = $i$337 + 1 | 0; + $j$138 = $j$2; + $wk$439 = $wk$439 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $247 = $labelInfo + 8 | 0; + $248 = $j$1$lcssa + -1 | 0; + HEAP32[$247 >> 2] = $248; + if (!$248) $$0 = 0; else { + _memset($235 | 0, 0, $248 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $248 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$435 = 0; + do { + $255 = $i$435 << 2; + HEAP32[$labelInfo + 131084 + ($255 << 2) >> 2] = $xsize; + HEAP32[$labelInfo + 131084 + (($255 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($255 | 2) << 2) >> 2] = $ysize; + HEAP32[$labelInfo + 131084 + (($255 | 3) << 2) >> 2] = 0; + $i$435 = $i$435 + 1 | 0; + } while (($i$435 | 0) < (HEAP32[$247 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$533 = 0; + do { + $269 = (HEAP32[$labelInfo + 1179664 + ($i$533 << 2) >> 2] | 0) + -1 | 0; + $270 = $i$533 * 7 | 0; + $273 = $labelInfo + 12 + ($269 << 2) | 0; + HEAP32[$273 >> 2] = (HEAP32[$273 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($270 << 2) >> 2] | 0); + $280 = $269 << 1; + $281 = $labelInfo + 655376 + ($280 << 3) | 0; + HEAPF64[$281 >> 3] = +HEAPF64[$281 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($270 + 1 << 2) >> 2] | 0); + $289 = $labelInfo + 655376 + (($280 | 1) << 3) | 0; + HEAPF64[$289 >> 3] = +HEAPF64[$289 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($270 + 2 << 2) >> 2] | 0); + $292 = $269 << 2; + $293 = $labelInfo + 131084 + ($292 << 2) | 0; + $297 = HEAP32[$labelInfo + 1310736 + ($270 + 3 << 2) >> 2] | 0; + if ((HEAP32[$293 >> 2] | 0) > ($297 | 0)) HEAP32[$293 >> 2] = $297; + $300 = $labelInfo + 131084 + (($292 | 1) << 2) | 0; + $304 = HEAP32[$labelInfo + 1310736 + ($270 + 4 << 2) >> 2] | 0; + if ((HEAP32[$300 >> 2] | 0) < ($304 | 0)) HEAP32[$300 >> 2] = $304; + $307 = $labelInfo + 131084 + (($292 | 2) << 2) | 0; + $311 = HEAP32[$labelInfo + 1310736 + ($270 + 5 << 2) >> 2] | 0; + if ((HEAP32[$307 >> 2] | 0) > ($311 | 0)) HEAP32[$307 >> 2] = $311; + $314 = $labelInfo + 131084 + (($292 | 3) << 2) | 0; + $318 = HEAP32[$labelInfo + 1310736 + ($270 + 6 << 2) >> 2] | 0; + if ((HEAP32[$314 >> 2] | 0) < ($318 | 0)) HEAP32[$314 >> 2] = $318; + $i$533 = $i$533 + 1 | 0; + } while (($i$533 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$247 >> 2] | 0) > 0) { + $i$632 = 0; + do { + $322 = $labelInfo + 12 + ($i$632 << 2) | 0; + $325 = $i$632 << 1; + $326 = $labelInfo + 655376 + ($325 << 3) | 0; + HEAPF64[$326 >> 3] = +HEAPF64[$326 >> 3] / +(HEAP32[$322 >> 2] | 0); + $332 = $labelInfo + 655376 + (($325 | 1) << 3) | 0; + HEAPF64[$332 >> 3] = +HEAPF64[$332 >> 3] / +(HEAP32[$322 >> 2] | 0); + $i$632 = $i$632 + 1 | 0; + } while (($i$632 | 0) < (HEAP32[$247 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubDBR3CA5551($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $0 = 0, $1 = 0, $10 = 0, $103 = 0, $109 = 0, $114 = 0, $117 = 0, $134 = 0, $136 = 0, $138 = 0, $142 = 0, $146 = 0, $149 = 0, $151 = 0, $155 = 0, $159 = 0, $163 = 0, $168 = 0, $17 = 0, $170 = 0, $174 = 0, $178 = 0, $18 = 0, $182 = 0, $188 = 0, $19 = 0, $191 = 0, $193 = 0, $197 = 0, $201 = 0, $205 = 0, $208 = 0, $213 = 0, $228 = 0, $229 = 0, $235 = 0, $237 = 0, $24 = 0, $243 = 0, $247 = 0, $248 = 0, $255 = 0, $26 = 0, $269 = 0, $270 = 0, $273 = 0, $280 = 0, $281 = 0, $289 = 0, $292 = 0, $293 = 0, $297 = 0, $300 = 0, $304 = 0, $307 = 0, $311 = 0, $314 = 0, $318 = 0, $32 = 0, $322 = 0, $325 = 0, $326 = 0, $332 = 0, $43 = 0, $46 = 0, $48 = 0, $52 = 0, $56 = 0, $62 = 0, $63 = 0, $66 = 0, $67 = 0, $68 = 0, $71 = 0, $74 = 0, $9 = 0, $91 = 0, $93 = 0, $95 = 0, $99 = 0, $i$081 = 0, $i$175 = 0, $i$255 = 0, $i$337 = 0, $i$435 = 0, $i$533 = 0, $i$632 = 0, $j$068 = 0, $j$1$lcssa = 0, $j$138 = 0, $j$2 = 0, $k$051 = 0, $k$148 = 0, $k$244 = 0, $k$341 = 0, $pnt$072 = 0, $pnt$1$lcssa = 0, $pnt$163 = 0, $pnt1$083 = 0, $pnt1$177 = 0, $pnt2$082 = 0, $pnt2$176 = 0, $pnt2$271 = 0, $pnt2$3$lcssa = 0, $pnt2$362 = 0, $vararg_buffer = 0, $wk$052 = 0, $wk$149 = 0, $wk$245 = 0, $wk$342 = 0, $wk$439 = 0, $wk_max$0$lcssa = 0, $wk_max$070 = 0, $wk_max$1$lcssa = 0, $wk_max$157 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = HEAP32[$labelInfo >> 2] | 0; + $1 = $ysize + -1 | 0; + if (($xsize | 0) > 0) { + $i$081 = 0; + $pnt1$083 = $0; + $pnt2$082 = $0 + ((Math_imul($1, $xsize) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$082 >> 1] = 0; + HEAP16[$pnt1$083 >> 1] = 0; + $i$081 = $i$081 + 1 | 0; + if (($i$081 | 0) >= ($xsize | 0)) break; else { + $pnt1$083 = $pnt1$083 + 2 | 0; + $pnt2$082 = $pnt2$082 + 2 | 0; + } + } + } + $9 = $labelingThresh * 3 | 0; + $10 = $xsize + -1 | 0; + if (($ysize | 0) > 0) { + $i$175 = 0; + $pnt1$177 = $0; + $pnt2$176 = $0 + ($10 << 1) | 0; + while (1) { + HEAP16[$pnt2$176 >> 1] = 0; + HEAP16[$pnt1$177 >> 1] = 0; + $i$175 = $i$175 + 1 | 0; + if (($i$175 | 0) >= ($ysize | 0)) break; else { + $pnt1$177 = $pnt1$177 + ($xsize << 1) | 0; + $pnt2$176 = $pnt2$176 + ($xsize << 1) | 0; + } + } + } + $17 = $labelInfo + 1179664 | 0; + $18 = $xsize + 1 | 0; + $19 = 0 - $xsize | 0; + $$sum = 1 - $xsize | 0; + $$sum1 = ~$xsize; + L11 : do if (($1 | 0) > 1) { + $24 = ($10 | 0) > 1; + $j$068 = 1; + $pnt$072 = $image + ($18 << 1) | 0; + $pnt2$271 = $0 + ($18 << 1) | 0; + $wk_max$070 = 0; + L13 : while (1) { + if ($24) { + $i$255 = 1; + $pnt$163 = $pnt$072; + $pnt2$362 = $pnt2$271; + $wk_max$157 = $wk_max$070; + while (1) { + $26 = HEAPU8[$pnt$163 >> 0] | 0; + $32 = HEAPU8[$pnt$163 + 1 >> 0] | 0; + do if ((($26 & 248) + 12 + ($26 << 5 & 224) + ($32 >>> 3 & 24) + ($32 << 2 & 248) | 0) > ($9 | 0)) { + HEAP16[$pnt2$362 >> 1] = 0; + $wk_max$2 = $wk_max$157; + } else { + $43 = HEAP16[$pnt2$362 + ($19 << 1) >> 1] | 0; + if ($43 << 16 >> 16 > 0) { + HEAP16[$pnt2$362 >> 1] = $43; + $46 = ($43 << 16 >> 16) * 7 | 0; + $48 = $labelInfo + 1310736 + ($46 + -7 << 2) | 0; + HEAP32[$48 >> 2] = (HEAP32[$48 >> 2] | 0) + 1; + $52 = $labelInfo + 1310736 + ($46 + -6 << 2) | 0; + HEAP32[$52 >> 2] = (HEAP32[$52 >> 2] | 0) + $i$255; + $56 = $labelInfo + 1310736 + ($46 + -5 << 2) | 0; + HEAP32[$56 >> 2] = (HEAP32[$56 >> 2] | 0) + $j$068; + HEAP32[$labelInfo + 1310736 + ($46 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $62 = HEAP16[$pnt2$362 + ($$sum << 1) >> 1] | 0; + $63 = $62 << 16 >> 16; + $66 = HEAP16[$pnt2$362 + ($$sum1 << 1) >> 1] | 0; + $67 = $66 << 16 >> 16; + $68 = $66 << 16 >> 16 > 0; + if ($62 << 16 >> 16 <= 0) { + if ($68) { + HEAP16[$pnt2$362 >> 1] = $66; + $168 = $67 * 7 | 0; + $170 = $labelInfo + 1310736 + ($168 + -7 << 2) | 0; + HEAP32[$170 >> 2] = (HEAP32[$170 >> 2] | 0) + 1; + $174 = $labelInfo + 1310736 + ($168 + -6 << 2) | 0; + HEAP32[$174 >> 2] = (HEAP32[$174 >> 2] | 0) + $i$255; + $178 = $labelInfo + 1310736 + ($168 + -5 << 2) | 0; + HEAP32[$178 >> 2] = (HEAP32[$178 >> 2] | 0) + $j$068; + $182 = $labelInfo + 1310736 + ($168 + -3 << 2) | 0; + if ((HEAP32[$182 >> 2] | 0) < ($i$255 | 0)) HEAP32[$182 >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($168 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $188 = HEAP16[$pnt2$362 + -2 >> 1] | 0; + if ($188 << 16 >> 16 > 0) { + HEAP16[$pnt2$362 >> 1] = $188; + $191 = ($188 << 16 >> 16) * 7 | 0; + $193 = $labelInfo + 1310736 + ($191 + -7 << 2) | 0; + HEAP32[$193 >> 2] = (HEAP32[$193 >> 2] | 0) + 1; + $197 = $labelInfo + 1310736 + ($191 + -6 << 2) | 0; + HEAP32[$197 >> 2] = (HEAP32[$197 >> 2] | 0) + $i$255; + $201 = $labelInfo + 1310736 + ($191 + -5 << 2) | 0; + HEAP32[$201 >> 2] = (HEAP32[$201 >> 2] | 0) + $j$068; + $205 = $labelInfo + 1310736 + ($191 + -3 << 2) | 0; + if ((HEAP32[$205 >> 2] | 0) >= ($i$255 | 0)) { + $wk_max$2 = $wk_max$157; + break; + } + HEAP32[$205 >> 2] = $i$255; + $wk_max$2 = $wk_max$157; + break; + } else { + $208 = $wk_max$157 + 1 | 0; + if (($wk_max$157 | 0) > 32767) break L13; + HEAP16[$pnt2$362 >> 1] = $208; + HEAP32[$labelInfo + 1179664 + ($wk_max$157 << 2) >> 2] = $208 << 16 >> 16; + $213 = $wk_max$157 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($213 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($213 + 1 << 2) >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($213 + 2 << 2) >> 2] = $j$068; + HEAP32[$labelInfo + 1310736 + ($213 + 3 << 2) >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($213 + 4 << 2) >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($213 + 5 << 2) >> 2] = $j$068; + HEAP32[$labelInfo + 1310736 + ($213 + 6 << 2) >> 2] = $j$068; + $wk_max$2 = $208; + break; + } + } + if ($68) { + $71 = HEAP32[$labelInfo + 1179664 + ($63 + -1 << 2) >> 2] | 0; + $74 = HEAP32[$labelInfo + 1179664 + ($67 + -1 << 2) >> 2] | 0; + if (($71 | 0) > ($74 | 0)) { + HEAP16[$pnt2$362 >> 1] = $74; + if (($wk_max$157 | 0) > 0) { + $k$051 = 0; + $wk$052 = $17; + while (1) { + if ((HEAP32[$wk$052 >> 2] | 0) == ($71 | 0)) HEAP32[$wk$052 >> 2] = $74; + $k$051 = $k$051 + 1 | 0; + if (($k$051 | 0) >= ($wk_max$157 | 0)) { + $91 = $74; + break; + } else $wk$052 = $wk$052 + 4 | 0; + } + } else $91 = $74; + } else { + HEAP16[$pnt2$362 >> 1] = $71; + if (($71 | 0) < ($74 | 0) & ($wk_max$157 | 0) > 0) { + $k$148 = 0; + $wk$149 = $17; + while (1) { + if ((HEAP32[$wk$149 >> 2] | 0) == ($74 | 0)) HEAP32[$wk$149 >> 2] = $71; + $k$148 = $k$148 + 1 | 0; + if (($k$148 | 0) >= ($wk_max$157 | 0)) { + $91 = $71; + break; + } else $wk$149 = $wk$149 + 4 | 0; + } + } else $91 = $71; + } + $93 = ($91 << 16 >> 16) * 7 | 0; + $95 = $labelInfo + 1310736 + ($93 + -7 << 2) | 0; + HEAP32[$95 >> 2] = (HEAP32[$95 >> 2] | 0) + 1; + $99 = $labelInfo + 1310736 + ($93 + -6 << 2) | 0; + HEAP32[$99 >> 2] = (HEAP32[$99 >> 2] | 0) + $i$255; + $103 = $labelInfo + 1310736 + ($93 + -5 << 2) | 0; + HEAP32[$103 >> 2] = (HEAP32[$103 >> 2] | 0) + $j$068; + HEAP32[$labelInfo + 1310736 + ($93 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $109 = HEAP16[$pnt2$362 + -2 >> 1] | 0; + if ($109 << 16 >> 16 <= 0) { + HEAP16[$pnt2$362 >> 1] = $62; + $149 = $63 * 7 | 0; + $151 = $labelInfo + 1310736 + ($149 + -7 << 2) | 0; + HEAP32[$151 >> 2] = (HEAP32[$151 >> 2] | 0) + 1; + $155 = $labelInfo + 1310736 + ($149 + -6 << 2) | 0; + HEAP32[$155 >> 2] = (HEAP32[$155 >> 2] | 0) + $i$255; + $159 = $labelInfo + 1310736 + ($149 + -5 << 2) | 0; + HEAP32[$159 >> 2] = (HEAP32[$159 >> 2] | 0) + $j$068; + $163 = $labelInfo + 1310736 + ($149 + -4 << 2) | 0; + if ((HEAP32[$163 >> 2] | 0) > ($i$255 | 0)) HEAP32[$163 >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($149 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $114 = HEAP32[$labelInfo + 1179664 + ($63 + -1 << 2) >> 2] | 0; + $117 = HEAP32[$labelInfo + 1179664 + (($109 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($114 | 0) > ($117 | 0)) { + HEAP16[$pnt2$362 >> 1] = $117; + if (($wk_max$157 | 0) > 0) { + $k$244 = 0; + $wk$245 = $17; + while (1) { + if ((HEAP32[$wk$245 >> 2] | 0) == ($114 | 0)) HEAP32[$wk$245 >> 2] = $117; + $k$244 = $k$244 + 1 | 0; + if (($k$244 | 0) >= ($wk_max$157 | 0)) { + $134 = $117; + break; + } else $wk$245 = $wk$245 + 4 | 0; + } + } else $134 = $117; + } else { + HEAP16[$pnt2$362 >> 1] = $114; + if (($114 | 0) < ($117 | 0) & ($wk_max$157 | 0) > 0) { + $k$341 = 0; + $wk$342 = $17; + while (1) { + if ((HEAP32[$wk$342 >> 2] | 0) == ($117 | 0)) HEAP32[$wk$342 >> 2] = $114; + $k$341 = $k$341 + 1 | 0; + if (($k$341 | 0) >= ($wk_max$157 | 0)) { + $134 = $114; + break; + } else $wk$342 = $wk$342 + 4 | 0; + } + } else $134 = $114; + } + $136 = ($134 << 16 >> 16) * 7 | 0; + $138 = $labelInfo + 1310736 + ($136 + -7 << 2) | 0; + HEAP32[$138 >> 2] = (HEAP32[$138 >> 2] | 0) + 1; + $142 = $labelInfo + 1310736 + ($136 + -6 << 2) | 0; + HEAP32[$142 >> 2] = (HEAP32[$142 >> 2] | 0) + $i$255; + $146 = $labelInfo + 1310736 + ($136 + -5 << 2) | 0; + HEAP32[$146 >> 2] = (HEAP32[$146 >> 2] | 0) + $j$068; + $wk_max$2 = $wk_max$157; + } while (0); + $i$255 = $i$255 + 1 | 0; + $228 = $pnt$163 + 2 | 0; + $229 = $pnt2$362 + 2 | 0; + if (($i$255 | 0) >= ($10 | 0)) { + $pnt$1$lcssa = $228; + $pnt2$3$lcssa = $229; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $pnt$163 = $228; + $pnt2$362 = $229; + $wk_max$157 = $wk_max$2; + } + } + } else { + $pnt$1$lcssa = $pnt$072; + $pnt2$3$lcssa = $pnt2$271; + $wk_max$1$lcssa = $wk_max$070; + } + $j$068 = $j$068 + 1 | 0; + if (($j$068 | 0) >= ($1 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $pnt$072 = $pnt$1$lcssa + 4 | 0; + $pnt2$271 = $pnt2$3$lcssa + 4 | 0; + $wk_max$070 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $235 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$337 = 1; + $j$138 = 1; + $wk$439 = $17; + while (1) { + $237 = HEAP32[$wk$439 >> 2] | 0; + if (($237 | 0) == ($i$337 | 0)) { + $243 = $j$138; + $j$2 = $j$138 + 1 | 0; + } else { + $243 = HEAP32[$labelInfo + 1179664 + ($237 + -1 << 2) >> 2] | 0; + $j$2 = $j$138; + } + HEAP32[$wk$439 >> 2] = $243; + if (($i$337 | 0) < ($wk_max$0$lcssa | 0)) { + $i$337 = $i$337 + 1 | 0; + $j$138 = $j$2; + $wk$439 = $wk$439 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $247 = $labelInfo + 8 | 0; + $248 = $j$1$lcssa + -1 | 0; + HEAP32[$247 >> 2] = $248; + if (!$248) $$0 = 0; else { + _memset($235 | 0, 0, $248 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $248 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$435 = 0; + do { + $255 = $i$435 << 2; + HEAP32[$labelInfo + 131084 + ($255 << 2) >> 2] = $xsize; + HEAP32[$labelInfo + 131084 + (($255 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($255 | 2) << 2) >> 2] = $ysize; + HEAP32[$labelInfo + 131084 + (($255 | 3) << 2) >> 2] = 0; + $i$435 = $i$435 + 1 | 0; + } while (($i$435 | 0) < (HEAP32[$247 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$533 = 0; + do { + $269 = (HEAP32[$labelInfo + 1179664 + ($i$533 << 2) >> 2] | 0) + -1 | 0; + $270 = $i$533 * 7 | 0; + $273 = $labelInfo + 12 + ($269 << 2) | 0; + HEAP32[$273 >> 2] = (HEAP32[$273 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($270 << 2) >> 2] | 0); + $280 = $269 << 1; + $281 = $labelInfo + 655376 + ($280 << 3) | 0; + HEAPF64[$281 >> 3] = +HEAPF64[$281 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($270 + 1 << 2) >> 2] | 0); + $289 = $labelInfo + 655376 + (($280 | 1) << 3) | 0; + HEAPF64[$289 >> 3] = +HEAPF64[$289 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($270 + 2 << 2) >> 2] | 0); + $292 = $269 << 2; + $293 = $labelInfo + 131084 + ($292 << 2) | 0; + $297 = HEAP32[$labelInfo + 1310736 + ($270 + 3 << 2) >> 2] | 0; + if ((HEAP32[$293 >> 2] | 0) > ($297 | 0)) HEAP32[$293 >> 2] = $297; + $300 = $labelInfo + 131084 + (($292 | 1) << 2) | 0; + $304 = HEAP32[$labelInfo + 1310736 + ($270 + 4 << 2) >> 2] | 0; + if ((HEAP32[$300 >> 2] | 0) < ($304 | 0)) HEAP32[$300 >> 2] = $304; + $307 = $labelInfo + 131084 + (($292 | 2) << 2) | 0; + $311 = HEAP32[$labelInfo + 1310736 + ($270 + 5 << 2) >> 2] | 0; + if ((HEAP32[$307 >> 2] | 0) > ($311 | 0)) HEAP32[$307 >> 2] = $311; + $314 = $labelInfo + 131084 + (($292 | 3) << 2) | 0; + $318 = HEAP32[$labelInfo + 1310736 + ($270 + 6 << 2) >> 2] | 0; + if ((HEAP32[$314 >> 2] | 0) < ($318 | 0)) HEAP32[$314 >> 2] = $318; + $i$533 = $i$533 + 1 | 0; + } while (($i$533 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$247 >> 2] | 0) > 0) { + $i$632 = 0; + do { + $322 = $labelInfo + 12 + ($i$632 << 2) | 0; + $325 = $i$632 << 1; + $326 = $labelInfo + 655376 + ($325 << 3) | 0; + HEAPF64[$326 >> 3] = +HEAPF64[$326 >> 3] / +(HEAP32[$322 >> 2] | 0); + $332 = $labelInfo + 655376 + (($325 | 1) << 3) | 0; + HEAPF64[$332 >> 3] = +HEAPF64[$332 >> 3] / +(HEAP32[$322 >> 2] | 0); + $i$632 = $i$632 + 1 | 0; + } while (($i$632 | 0) < (HEAP32[$247 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubDWR3C565($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $0 = 0, $1 = 0, $10 = 0, $103 = 0, $109 = 0, $114 = 0, $117 = 0, $134 = 0, $136 = 0, $138 = 0, $142 = 0, $146 = 0, $149 = 0, $151 = 0, $155 = 0, $159 = 0, $163 = 0, $168 = 0, $17 = 0, $170 = 0, $174 = 0, $178 = 0, $18 = 0, $182 = 0, $188 = 0, $19 = 0, $191 = 0, $193 = 0, $197 = 0, $201 = 0, $205 = 0, $208 = 0, $213 = 0, $228 = 0, $229 = 0, $235 = 0, $237 = 0, $24 = 0, $243 = 0, $247 = 0, $248 = 0, $255 = 0, $26 = 0, $269 = 0, $270 = 0, $273 = 0, $280 = 0, $281 = 0, $289 = 0, $292 = 0, $293 = 0, $297 = 0, $300 = 0, $304 = 0, $307 = 0, $311 = 0, $314 = 0, $318 = 0, $32 = 0, $322 = 0, $325 = 0, $326 = 0, $332 = 0, $43 = 0, $46 = 0, $48 = 0, $52 = 0, $56 = 0, $62 = 0, $63 = 0, $66 = 0, $67 = 0, $68 = 0, $71 = 0, $74 = 0, $9 = 0, $91 = 0, $93 = 0, $95 = 0, $99 = 0, $i$081 = 0, $i$175 = 0, $i$255 = 0, $i$337 = 0, $i$435 = 0, $i$533 = 0, $i$632 = 0, $j$068 = 0, $j$1$lcssa = 0, $j$138 = 0, $j$2 = 0, $k$051 = 0, $k$148 = 0, $k$244 = 0, $k$341 = 0, $pnt$072 = 0, $pnt$1$lcssa = 0, $pnt$163 = 0, $pnt1$083 = 0, $pnt1$177 = 0, $pnt2$082 = 0, $pnt2$176 = 0, $pnt2$271 = 0, $pnt2$3$lcssa = 0, $pnt2$362 = 0, $vararg_buffer = 0, $wk$052 = 0, $wk$149 = 0, $wk$245 = 0, $wk$342 = 0, $wk$439 = 0, $wk_max$0$lcssa = 0, $wk_max$070 = 0, $wk_max$1$lcssa = 0, $wk_max$157 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = HEAP32[$labelInfo >> 2] | 0; + $1 = $ysize + -1 | 0; + if (($xsize | 0) > 0) { + $i$081 = 0; + $pnt1$083 = $0; + $pnt2$082 = $0 + ((Math_imul($1, $xsize) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$082 >> 1] = 0; + HEAP16[$pnt1$083 >> 1] = 0; + $i$081 = $i$081 + 1 | 0; + if (($i$081 | 0) >= ($xsize | 0)) break; else { + $pnt1$083 = $pnt1$083 + 2 | 0; + $pnt2$082 = $pnt2$082 + 2 | 0; + } + } + } + $9 = $labelingThresh * 3 | 0; + $10 = $xsize + -1 | 0; + if (($ysize | 0) > 0) { + $i$175 = 0; + $pnt1$177 = $0; + $pnt2$176 = $0 + ($10 << 1) | 0; + while (1) { + HEAP16[$pnt2$176 >> 1] = 0; + HEAP16[$pnt1$177 >> 1] = 0; + $i$175 = $i$175 + 1 | 0; + if (($i$175 | 0) >= ($ysize | 0)) break; else { + $pnt1$177 = $pnt1$177 + ($xsize << 1) | 0; + $pnt2$176 = $pnt2$176 + ($xsize << 1) | 0; + } + } + } + $17 = $labelInfo + 1179664 | 0; + $18 = $xsize + 1 | 0; + $19 = 0 - $xsize | 0; + $$sum = 1 - $xsize | 0; + $$sum1 = ~$xsize; + L11 : do if (($1 | 0) > 1) { + $24 = ($10 | 0) > 1; + $j$068 = 1; + $pnt$072 = $image + ($18 << 1) | 0; + $pnt2$271 = $0 + ($18 << 1) | 0; + $wk_max$070 = 0; + L13 : while (1) { + if ($24) { + $i$255 = 1; + $pnt$163 = $pnt$072; + $pnt2$362 = $pnt2$271; + $wk_max$157 = $wk_max$070; + while (1) { + $26 = HEAPU8[$pnt$163 >> 0] | 0; + $32 = HEAPU8[$pnt$163 + 1 >> 0] | 0; + do if ((($26 & 248) + 10 + ($26 << 5 & 224) + ($32 >>> 3 & 28) + ($32 << 3 & 248) | 0) > ($9 | 0)) { + $43 = HEAP16[$pnt2$362 + ($19 << 1) >> 1] | 0; + if ($43 << 16 >> 16 > 0) { + HEAP16[$pnt2$362 >> 1] = $43; + $46 = ($43 << 16 >> 16) * 7 | 0; + $48 = $labelInfo + 1310736 + ($46 + -7 << 2) | 0; + HEAP32[$48 >> 2] = (HEAP32[$48 >> 2] | 0) + 1; + $52 = $labelInfo + 1310736 + ($46 + -6 << 2) | 0; + HEAP32[$52 >> 2] = (HEAP32[$52 >> 2] | 0) + $i$255; + $56 = $labelInfo + 1310736 + ($46 + -5 << 2) | 0; + HEAP32[$56 >> 2] = (HEAP32[$56 >> 2] | 0) + $j$068; + HEAP32[$labelInfo + 1310736 + ($46 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $62 = HEAP16[$pnt2$362 + ($$sum << 1) >> 1] | 0; + $63 = $62 << 16 >> 16; + $66 = HEAP16[$pnt2$362 + ($$sum1 << 1) >> 1] | 0; + $67 = $66 << 16 >> 16; + $68 = $66 << 16 >> 16 > 0; + if ($62 << 16 >> 16 <= 0) { + if ($68) { + HEAP16[$pnt2$362 >> 1] = $66; + $168 = $67 * 7 | 0; + $170 = $labelInfo + 1310736 + ($168 + -7 << 2) | 0; + HEAP32[$170 >> 2] = (HEAP32[$170 >> 2] | 0) + 1; + $174 = $labelInfo + 1310736 + ($168 + -6 << 2) | 0; + HEAP32[$174 >> 2] = (HEAP32[$174 >> 2] | 0) + $i$255; + $178 = $labelInfo + 1310736 + ($168 + -5 << 2) | 0; + HEAP32[$178 >> 2] = (HEAP32[$178 >> 2] | 0) + $j$068; + $182 = $labelInfo + 1310736 + ($168 + -3 << 2) | 0; + if ((HEAP32[$182 >> 2] | 0) < ($i$255 | 0)) HEAP32[$182 >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($168 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $188 = HEAP16[$pnt2$362 + -2 >> 1] | 0; + if ($188 << 16 >> 16 > 0) { + HEAP16[$pnt2$362 >> 1] = $188; + $191 = ($188 << 16 >> 16) * 7 | 0; + $193 = $labelInfo + 1310736 + ($191 + -7 << 2) | 0; + HEAP32[$193 >> 2] = (HEAP32[$193 >> 2] | 0) + 1; + $197 = $labelInfo + 1310736 + ($191 + -6 << 2) | 0; + HEAP32[$197 >> 2] = (HEAP32[$197 >> 2] | 0) + $i$255; + $201 = $labelInfo + 1310736 + ($191 + -5 << 2) | 0; + HEAP32[$201 >> 2] = (HEAP32[$201 >> 2] | 0) + $j$068; + $205 = $labelInfo + 1310736 + ($191 + -3 << 2) | 0; + if ((HEAP32[$205 >> 2] | 0) >= ($i$255 | 0)) { + $wk_max$2 = $wk_max$157; + break; + } + HEAP32[$205 >> 2] = $i$255; + $wk_max$2 = $wk_max$157; + break; + } else { + $208 = $wk_max$157 + 1 | 0; + if (($wk_max$157 | 0) > 32767) break L13; + HEAP16[$pnt2$362 >> 1] = $208; + HEAP32[$labelInfo + 1179664 + ($wk_max$157 << 2) >> 2] = $208 << 16 >> 16; + $213 = $wk_max$157 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($213 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($213 + 1 << 2) >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($213 + 2 << 2) >> 2] = $j$068; + HEAP32[$labelInfo + 1310736 + ($213 + 3 << 2) >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($213 + 4 << 2) >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($213 + 5 << 2) >> 2] = $j$068; + HEAP32[$labelInfo + 1310736 + ($213 + 6 << 2) >> 2] = $j$068; + $wk_max$2 = $208; + break; + } + } + if ($68) { + $71 = HEAP32[$labelInfo + 1179664 + ($63 + -1 << 2) >> 2] | 0; + $74 = HEAP32[$labelInfo + 1179664 + ($67 + -1 << 2) >> 2] | 0; + if (($71 | 0) > ($74 | 0)) { + HEAP16[$pnt2$362 >> 1] = $74; + if (($wk_max$157 | 0) > 0) { + $k$051 = 0; + $wk$052 = $17; + while (1) { + if ((HEAP32[$wk$052 >> 2] | 0) == ($71 | 0)) HEAP32[$wk$052 >> 2] = $74; + $k$051 = $k$051 + 1 | 0; + if (($k$051 | 0) >= ($wk_max$157 | 0)) { + $91 = $74; + break; + } else $wk$052 = $wk$052 + 4 | 0; + } + } else $91 = $74; + } else { + HEAP16[$pnt2$362 >> 1] = $71; + if (($71 | 0) < ($74 | 0) & ($wk_max$157 | 0) > 0) { + $k$148 = 0; + $wk$149 = $17; + while (1) { + if ((HEAP32[$wk$149 >> 2] | 0) == ($74 | 0)) HEAP32[$wk$149 >> 2] = $71; + $k$148 = $k$148 + 1 | 0; + if (($k$148 | 0) >= ($wk_max$157 | 0)) { + $91 = $71; + break; + } else $wk$149 = $wk$149 + 4 | 0; + } + } else $91 = $71; + } + $93 = ($91 << 16 >> 16) * 7 | 0; + $95 = $labelInfo + 1310736 + ($93 + -7 << 2) | 0; + HEAP32[$95 >> 2] = (HEAP32[$95 >> 2] | 0) + 1; + $99 = $labelInfo + 1310736 + ($93 + -6 << 2) | 0; + HEAP32[$99 >> 2] = (HEAP32[$99 >> 2] | 0) + $i$255; + $103 = $labelInfo + 1310736 + ($93 + -5 << 2) | 0; + HEAP32[$103 >> 2] = (HEAP32[$103 >> 2] | 0) + $j$068; + HEAP32[$labelInfo + 1310736 + ($93 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $109 = HEAP16[$pnt2$362 + -2 >> 1] | 0; + if ($109 << 16 >> 16 <= 0) { + HEAP16[$pnt2$362 >> 1] = $62; + $149 = $63 * 7 | 0; + $151 = $labelInfo + 1310736 + ($149 + -7 << 2) | 0; + HEAP32[$151 >> 2] = (HEAP32[$151 >> 2] | 0) + 1; + $155 = $labelInfo + 1310736 + ($149 + -6 << 2) | 0; + HEAP32[$155 >> 2] = (HEAP32[$155 >> 2] | 0) + $i$255; + $159 = $labelInfo + 1310736 + ($149 + -5 << 2) | 0; + HEAP32[$159 >> 2] = (HEAP32[$159 >> 2] | 0) + $j$068; + $163 = $labelInfo + 1310736 + ($149 + -4 << 2) | 0; + if ((HEAP32[$163 >> 2] | 0) > ($i$255 | 0)) HEAP32[$163 >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($149 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $114 = HEAP32[$labelInfo + 1179664 + ($63 + -1 << 2) >> 2] | 0; + $117 = HEAP32[$labelInfo + 1179664 + (($109 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($114 | 0) > ($117 | 0)) { + HEAP16[$pnt2$362 >> 1] = $117; + if (($wk_max$157 | 0) > 0) { + $k$244 = 0; + $wk$245 = $17; + while (1) { + if ((HEAP32[$wk$245 >> 2] | 0) == ($114 | 0)) HEAP32[$wk$245 >> 2] = $117; + $k$244 = $k$244 + 1 | 0; + if (($k$244 | 0) >= ($wk_max$157 | 0)) { + $134 = $117; + break; + } else $wk$245 = $wk$245 + 4 | 0; + } + } else $134 = $117; + } else { + HEAP16[$pnt2$362 >> 1] = $114; + if (($114 | 0) < ($117 | 0) & ($wk_max$157 | 0) > 0) { + $k$341 = 0; + $wk$342 = $17; + while (1) { + if ((HEAP32[$wk$342 >> 2] | 0) == ($117 | 0)) HEAP32[$wk$342 >> 2] = $114; + $k$341 = $k$341 + 1 | 0; + if (($k$341 | 0) >= ($wk_max$157 | 0)) { + $134 = $114; + break; + } else $wk$342 = $wk$342 + 4 | 0; + } + } else $134 = $114; + } + $136 = ($134 << 16 >> 16) * 7 | 0; + $138 = $labelInfo + 1310736 + ($136 + -7 << 2) | 0; + HEAP32[$138 >> 2] = (HEAP32[$138 >> 2] | 0) + 1; + $142 = $labelInfo + 1310736 + ($136 + -6 << 2) | 0; + HEAP32[$142 >> 2] = (HEAP32[$142 >> 2] | 0) + $i$255; + $146 = $labelInfo + 1310736 + ($136 + -5 << 2) | 0; + HEAP32[$146 >> 2] = (HEAP32[$146 >> 2] | 0) + $j$068; + $wk_max$2 = $wk_max$157; + } else { + HEAP16[$pnt2$362 >> 1] = 0; + $wk_max$2 = $wk_max$157; + } while (0); + $i$255 = $i$255 + 1 | 0; + $228 = $pnt$163 + 2 | 0; + $229 = $pnt2$362 + 2 | 0; + if (($i$255 | 0) >= ($10 | 0)) { + $pnt$1$lcssa = $228; + $pnt2$3$lcssa = $229; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $pnt$163 = $228; + $pnt2$362 = $229; + $wk_max$157 = $wk_max$2; + } + } + } else { + $pnt$1$lcssa = $pnt$072; + $pnt2$3$lcssa = $pnt2$271; + $wk_max$1$lcssa = $wk_max$070; + } + $j$068 = $j$068 + 1 | 0; + if (($j$068 | 0) >= ($1 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $pnt$072 = $pnt$1$lcssa + 4 | 0; + $pnt2$271 = $pnt2$3$lcssa + 4 | 0; + $wk_max$070 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $235 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$337 = 1; + $j$138 = 1; + $wk$439 = $17; + while (1) { + $237 = HEAP32[$wk$439 >> 2] | 0; + if (($237 | 0) == ($i$337 | 0)) { + $243 = $j$138; + $j$2 = $j$138 + 1 | 0; + } else { + $243 = HEAP32[$labelInfo + 1179664 + ($237 + -1 << 2) >> 2] | 0; + $j$2 = $j$138; + } + HEAP32[$wk$439 >> 2] = $243; + if (($i$337 | 0) < ($wk_max$0$lcssa | 0)) { + $i$337 = $i$337 + 1 | 0; + $j$138 = $j$2; + $wk$439 = $wk$439 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $247 = $labelInfo + 8 | 0; + $248 = $j$1$lcssa + -1 | 0; + HEAP32[$247 >> 2] = $248; + if (!$248) $$0 = 0; else { + _memset($235 | 0, 0, $248 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $248 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$435 = 0; + do { + $255 = $i$435 << 2; + HEAP32[$labelInfo + 131084 + ($255 << 2) >> 2] = $xsize; + HEAP32[$labelInfo + 131084 + (($255 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($255 | 2) << 2) >> 2] = $ysize; + HEAP32[$labelInfo + 131084 + (($255 | 3) << 2) >> 2] = 0; + $i$435 = $i$435 + 1 | 0; + } while (($i$435 | 0) < (HEAP32[$247 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$533 = 0; + do { + $269 = (HEAP32[$labelInfo + 1179664 + ($i$533 << 2) >> 2] | 0) + -1 | 0; + $270 = $i$533 * 7 | 0; + $273 = $labelInfo + 12 + ($269 << 2) | 0; + HEAP32[$273 >> 2] = (HEAP32[$273 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($270 << 2) >> 2] | 0); + $280 = $269 << 1; + $281 = $labelInfo + 655376 + ($280 << 3) | 0; + HEAPF64[$281 >> 3] = +HEAPF64[$281 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($270 + 1 << 2) >> 2] | 0); + $289 = $labelInfo + 655376 + (($280 | 1) << 3) | 0; + HEAPF64[$289 >> 3] = +HEAPF64[$289 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($270 + 2 << 2) >> 2] | 0); + $292 = $269 << 2; + $293 = $labelInfo + 131084 + ($292 << 2) | 0; + $297 = HEAP32[$labelInfo + 1310736 + ($270 + 3 << 2) >> 2] | 0; + if ((HEAP32[$293 >> 2] | 0) > ($297 | 0)) HEAP32[$293 >> 2] = $297; + $300 = $labelInfo + 131084 + (($292 | 1) << 2) | 0; + $304 = HEAP32[$labelInfo + 1310736 + ($270 + 4 << 2) >> 2] | 0; + if ((HEAP32[$300 >> 2] | 0) < ($304 | 0)) HEAP32[$300 >> 2] = $304; + $307 = $labelInfo + 131084 + (($292 | 2) << 2) | 0; + $311 = HEAP32[$labelInfo + 1310736 + ($270 + 5 << 2) >> 2] | 0; + if ((HEAP32[$307 >> 2] | 0) > ($311 | 0)) HEAP32[$307 >> 2] = $311; + $314 = $labelInfo + 131084 + (($292 | 3) << 2) | 0; + $318 = HEAP32[$labelInfo + 1310736 + ($270 + 6 << 2) >> 2] | 0; + if ((HEAP32[$314 >> 2] | 0) < ($318 | 0)) HEAP32[$314 >> 2] = $318; + $i$533 = $i$533 + 1 | 0; + } while (($i$533 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$247 >> 2] | 0) > 0) { + $i$632 = 0; + do { + $322 = $labelInfo + 12 + ($i$632 << 2) | 0; + $325 = $i$632 << 1; + $326 = $labelInfo + 655376 + ($325 << 3) | 0; + HEAPF64[$326 >> 3] = +HEAPF64[$326 >> 3] / +(HEAP32[$322 >> 2] | 0); + $332 = $labelInfo + 655376 + (($325 | 1) << 3) | 0; + HEAPF64[$332 >> 3] = +HEAPF64[$332 >> 3] / +(HEAP32[$322 >> 2] | 0); + $i$632 = $i$632 + 1 | 0; + } while (($i$632 | 0) < (HEAP32[$247 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubDBR3C565($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $0 = 0, $1 = 0, $10 = 0, $103 = 0, $109 = 0, $114 = 0, $117 = 0, $134 = 0, $136 = 0, $138 = 0, $142 = 0, $146 = 0, $149 = 0, $151 = 0, $155 = 0, $159 = 0, $163 = 0, $168 = 0, $17 = 0, $170 = 0, $174 = 0, $178 = 0, $18 = 0, $182 = 0, $188 = 0, $19 = 0, $191 = 0, $193 = 0, $197 = 0, $201 = 0, $205 = 0, $208 = 0, $213 = 0, $228 = 0, $229 = 0, $235 = 0, $237 = 0, $24 = 0, $243 = 0, $247 = 0, $248 = 0, $255 = 0, $26 = 0, $269 = 0, $270 = 0, $273 = 0, $280 = 0, $281 = 0, $289 = 0, $292 = 0, $293 = 0, $297 = 0, $300 = 0, $304 = 0, $307 = 0, $311 = 0, $314 = 0, $318 = 0, $32 = 0, $322 = 0, $325 = 0, $326 = 0, $332 = 0, $43 = 0, $46 = 0, $48 = 0, $52 = 0, $56 = 0, $62 = 0, $63 = 0, $66 = 0, $67 = 0, $68 = 0, $71 = 0, $74 = 0, $9 = 0, $91 = 0, $93 = 0, $95 = 0, $99 = 0, $i$081 = 0, $i$175 = 0, $i$255 = 0, $i$337 = 0, $i$435 = 0, $i$533 = 0, $i$632 = 0, $j$068 = 0, $j$1$lcssa = 0, $j$138 = 0, $j$2 = 0, $k$051 = 0, $k$148 = 0, $k$244 = 0, $k$341 = 0, $pnt$072 = 0, $pnt$1$lcssa = 0, $pnt$163 = 0, $pnt1$083 = 0, $pnt1$177 = 0, $pnt2$082 = 0, $pnt2$176 = 0, $pnt2$271 = 0, $pnt2$3$lcssa = 0, $pnt2$362 = 0, $vararg_buffer = 0, $wk$052 = 0, $wk$149 = 0, $wk$245 = 0, $wk$342 = 0, $wk$439 = 0, $wk_max$0$lcssa = 0, $wk_max$070 = 0, $wk_max$1$lcssa = 0, $wk_max$157 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = HEAP32[$labelInfo >> 2] | 0; + $1 = $ysize + -1 | 0; + if (($xsize | 0) > 0) { + $i$081 = 0; + $pnt1$083 = $0; + $pnt2$082 = $0 + ((Math_imul($1, $xsize) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$082 >> 1] = 0; + HEAP16[$pnt1$083 >> 1] = 0; + $i$081 = $i$081 + 1 | 0; + if (($i$081 | 0) >= ($xsize | 0)) break; else { + $pnt1$083 = $pnt1$083 + 2 | 0; + $pnt2$082 = $pnt2$082 + 2 | 0; + } + } + } + $9 = $labelingThresh * 3 | 0; + $10 = $xsize + -1 | 0; + if (($ysize | 0) > 0) { + $i$175 = 0; + $pnt1$177 = $0; + $pnt2$176 = $0 + ($10 << 1) | 0; + while (1) { + HEAP16[$pnt2$176 >> 1] = 0; + HEAP16[$pnt1$177 >> 1] = 0; + $i$175 = $i$175 + 1 | 0; + if (($i$175 | 0) >= ($ysize | 0)) break; else { + $pnt1$177 = $pnt1$177 + ($xsize << 1) | 0; + $pnt2$176 = $pnt2$176 + ($xsize << 1) | 0; + } + } + } + $17 = $labelInfo + 1179664 | 0; + $18 = $xsize + 1 | 0; + $19 = 0 - $xsize | 0; + $$sum = 1 - $xsize | 0; + $$sum1 = ~$xsize; + L11 : do if (($1 | 0) > 1) { + $24 = ($10 | 0) > 1; + $j$068 = 1; + $pnt$072 = $image + ($18 << 1) | 0; + $pnt2$271 = $0 + ($18 << 1) | 0; + $wk_max$070 = 0; + L13 : while (1) { + if ($24) { + $i$255 = 1; + $pnt$163 = $pnt$072; + $pnt2$362 = $pnt2$271; + $wk_max$157 = $wk_max$070; + while (1) { + $26 = HEAPU8[$pnt$163 >> 0] | 0; + $32 = HEAPU8[$pnt$163 + 1 >> 0] | 0; + do if ((($26 & 248) + 10 + ($26 << 5 & 224) + ($32 >>> 3 & 28) + ($32 << 3 & 248) | 0) > ($9 | 0)) { + HEAP16[$pnt2$362 >> 1] = 0; + $wk_max$2 = $wk_max$157; + } else { + $43 = HEAP16[$pnt2$362 + ($19 << 1) >> 1] | 0; + if ($43 << 16 >> 16 > 0) { + HEAP16[$pnt2$362 >> 1] = $43; + $46 = ($43 << 16 >> 16) * 7 | 0; + $48 = $labelInfo + 1310736 + ($46 + -7 << 2) | 0; + HEAP32[$48 >> 2] = (HEAP32[$48 >> 2] | 0) + 1; + $52 = $labelInfo + 1310736 + ($46 + -6 << 2) | 0; + HEAP32[$52 >> 2] = (HEAP32[$52 >> 2] | 0) + $i$255; + $56 = $labelInfo + 1310736 + ($46 + -5 << 2) | 0; + HEAP32[$56 >> 2] = (HEAP32[$56 >> 2] | 0) + $j$068; + HEAP32[$labelInfo + 1310736 + ($46 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $62 = HEAP16[$pnt2$362 + ($$sum << 1) >> 1] | 0; + $63 = $62 << 16 >> 16; + $66 = HEAP16[$pnt2$362 + ($$sum1 << 1) >> 1] | 0; + $67 = $66 << 16 >> 16; + $68 = $66 << 16 >> 16 > 0; + if ($62 << 16 >> 16 <= 0) { + if ($68) { + HEAP16[$pnt2$362 >> 1] = $66; + $168 = $67 * 7 | 0; + $170 = $labelInfo + 1310736 + ($168 + -7 << 2) | 0; + HEAP32[$170 >> 2] = (HEAP32[$170 >> 2] | 0) + 1; + $174 = $labelInfo + 1310736 + ($168 + -6 << 2) | 0; + HEAP32[$174 >> 2] = (HEAP32[$174 >> 2] | 0) + $i$255; + $178 = $labelInfo + 1310736 + ($168 + -5 << 2) | 0; + HEAP32[$178 >> 2] = (HEAP32[$178 >> 2] | 0) + $j$068; + $182 = $labelInfo + 1310736 + ($168 + -3 << 2) | 0; + if ((HEAP32[$182 >> 2] | 0) < ($i$255 | 0)) HEAP32[$182 >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($168 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $188 = HEAP16[$pnt2$362 + -2 >> 1] | 0; + if ($188 << 16 >> 16 > 0) { + HEAP16[$pnt2$362 >> 1] = $188; + $191 = ($188 << 16 >> 16) * 7 | 0; + $193 = $labelInfo + 1310736 + ($191 + -7 << 2) | 0; + HEAP32[$193 >> 2] = (HEAP32[$193 >> 2] | 0) + 1; + $197 = $labelInfo + 1310736 + ($191 + -6 << 2) | 0; + HEAP32[$197 >> 2] = (HEAP32[$197 >> 2] | 0) + $i$255; + $201 = $labelInfo + 1310736 + ($191 + -5 << 2) | 0; + HEAP32[$201 >> 2] = (HEAP32[$201 >> 2] | 0) + $j$068; + $205 = $labelInfo + 1310736 + ($191 + -3 << 2) | 0; + if ((HEAP32[$205 >> 2] | 0) >= ($i$255 | 0)) { + $wk_max$2 = $wk_max$157; + break; + } + HEAP32[$205 >> 2] = $i$255; + $wk_max$2 = $wk_max$157; + break; + } else { + $208 = $wk_max$157 + 1 | 0; + if (($wk_max$157 | 0) > 32767) break L13; + HEAP16[$pnt2$362 >> 1] = $208; + HEAP32[$labelInfo + 1179664 + ($wk_max$157 << 2) >> 2] = $208 << 16 >> 16; + $213 = $wk_max$157 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($213 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($213 + 1 << 2) >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($213 + 2 << 2) >> 2] = $j$068; + HEAP32[$labelInfo + 1310736 + ($213 + 3 << 2) >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($213 + 4 << 2) >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($213 + 5 << 2) >> 2] = $j$068; + HEAP32[$labelInfo + 1310736 + ($213 + 6 << 2) >> 2] = $j$068; + $wk_max$2 = $208; + break; + } + } + if ($68) { + $71 = HEAP32[$labelInfo + 1179664 + ($63 + -1 << 2) >> 2] | 0; + $74 = HEAP32[$labelInfo + 1179664 + ($67 + -1 << 2) >> 2] | 0; + if (($71 | 0) > ($74 | 0)) { + HEAP16[$pnt2$362 >> 1] = $74; + if (($wk_max$157 | 0) > 0) { + $k$051 = 0; + $wk$052 = $17; + while (1) { + if ((HEAP32[$wk$052 >> 2] | 0) == ($71 | 0)) HEAP32[$wk$052 >> 2] = $74; + $k$051 = $k$051 + 1 | 0; + if (($k$051 | 0) >= ($wk_max$157 | 0)) { + $91 = $74; + break; + } else $wk$052 = $wk$052 + 4 | 0; + } + } else $91 = $74; + } else { + HEAP16[$pnt2$362 >> 1] = $71; + if (($71 | 0) < ($74 | 0) & ($wk_max$157 | 0) > 0) { + $k$148 = 0; + $wk$149 = $17; + while (1) { + if ((HEAP32[$wk$149 >> 2] | 0) == ($74 | 0)) HEAP32[$wk$149 >> 2] = $71; + $k$148 = $k$148 + 1 | 0; + if (($k$148 | 0) >= ($wk_max$157 | 0)) { + $91 = $71; + break; + } else $wk$149 = $wk$149 + 4 | 0; + } + } else $91 = $71; + } + $93 = ($91 << 16 >> 16) * 7 | 0; + $95 = $labelInfo + 1310736 + ($93 + -7 << 2) | 0; + HEAP32[$95 >> 2] = (HEAP32[$95 >> 2] | 0) + 1; + $99 = $labelInfo + 1310736 + ($93 + -6 << 2) | 0; + HEAP32[$99 >> 2] = (HEAP32[$99 >> 2] | 0) + $i$255; + $103 = $labelInfo + 1310736 + ($93 + -5 << 2) | 0; + HEAP32[$103 >> 2] = (HEAP32[$103 >> 2] | 0) + $j$068; + HEAP32[$labelInfo + 1310736 + ($93 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $109 = HEAP16[$pnt2$362 + -2 >> 1] | 0; + if ($109 << 16 >> 16 <= 0) { + HEAP16[$pnt2$362 >> 1] = $62; + $149 = $63 * 7 | 0; + $151 = $labelInfo + 1310736 + ($149 + -7 << 2) | 0; + HEAP32[$151 >> 2] = (HEAP32[$151 >> 2] | 0) + 1; + $155 = $labelInfo + 1310736 + ($149 + -6 << 2) | 0; + HEAP32[$155 >> 2] = (HEAP32[$155 >> 2] | 0) + $i$255; + $159 = $labelInfo + 1310736 + ($149 + -5 << 2) | 0; + HEAP32[$159 >> 2] = (HEAP32[$159 >> 2] | 0) + $j$068; + $163 = $labelInfo + 1310736 + ($149 + -4 << 2) | 0; + if ((HEAP32[$163 >> 2] | 0) > ($i$255 | 0)) HEAP32[$163 >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($149 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $114 = HEAP32[$labelInfo + 1179664 + ($63 + -1 << 2) >> 2] | 0; + $117 = HEAP32[$labelInfo + 1179664 + (($109 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($114 | 0) > ($117 | 0)) { + HEAP16[$pnt2$362 >> 1] = $117; + if (($wk_max$157 | 0) > 0) { + $k$244 = 0; + $wk$245 = $17; + while (1) { + if ((HEAP32[$wk$245 >> 2] | 0) == ($114 | 0)) HEAP32[$wk$245 >> 2] = $117; + $k$244 = $k$244 + 1 | 0; + if (($k$244 | 0) >= ($wk_max$157 | 0)) { + $134 = $117; + break; + } else $wk$245 = $wk$245 + 4 | 0; + } + } else $134 = $117; + } else { + HEAP16[$pnt2$362 >> 1] = $114; + if (($114 | 0) < ($117 | 0) & ($wk_max$157 | 0) > 0) { + $k$341 = 0; + $wk$342 = $17; + while (1) { + if ((HEAP32[$wk$342 >> 2] | 0) == ($117 | 0)) HEAP32[$wk$342 >> 2] = $114; + $k$341 = $k$341 + 1 | 0; + if (($k$341 | 0) >= ($wk_max$157 | 0)) { + $134 = $114; + break; + } else $wk$342 = $wk$342 + 4 | 0; + } + } else $134 = $114; + } + $136 = ($134 << 16 >> 16) * 7 | 0; + $138 = $labelInfo + 1310736 + ($136 + -7 << 2) | 0; + HEAP32[$138 >> 2] = (HEAP32[$138 >> 2] | 0) + 1; + $142 = $labelInfo + 1310736 + ($136 + -6 << 2) | 0; + HEAP32[$142 >> 2] = (HEAP32[$142 >> 2] | 0) + $i$255; + $146 = $labelInfo + 1310736 + ($136 + -5 << 2) | 0; + HEAP32[$146 >> 2] = (HEAP32[$146 >> 2] | 0) + $j$068; + $wk_max$2 = $wk_max$157; + } while (0); + $i$255 = $i$255 + 1 | 0; + $228 = $pnt$163 + 2 | 0; + $229 = $pnt2$362 + 2 | 0; + if (($i$255 | 0) >= ($10 | 0)) { + $pnt$1$lcssa = $228; + $pnt2$3$lcssa = $229; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $pnt$163 = $228; + $pnt2$362 = $229; + $wk_max$157 = $wk_max$2; + } + } + } else { + $pnt$1$lcssa = $pnt$072; + $pnt2$3$lcssa = $pnt2$271; + $wk_max$1$lcssa = $wk_max$070; + } + $j$068 = $j$068 + 1 | 0; + if (($j$068 | 0) >= ($1 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $pnt$072 = $pnt$1$lcssa + 4 | 0; + $pnt2$271 = $pnt2$3$lcssa + 4 | 0; + $wk_max$070 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $235 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$337 = 1; + $j$138 = 1; + $wk$439 = $17; + while (1) { + $237 = HEAP32[$wk$439 >> 2] | 0; + if (($237 | 0) == ($i$337 | 0)) { + $243 = $j$138; + $j$2 = $j$138 + 1 | 0; + } else { + $243 = HEAP32[$labelInfo + 1179664 + ($237 + -1 << 2) >> 2] | 0; + $j$2 = $j$138; + } + HEAP32[$wk$439 >> 2] = $243; + if (($i$337 | 0) < ($wk_max$0$lcssa | 0)) { + $i$337 = $i$337 + 1 | 0; + $j$138 = $j$2; + $wk$439 = $wk$439 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $247 = $labelInfo + 8 | 0; + $248 = $j$1$lcssa + -1 | 0; + HEAP32[$247 >> 2] = $248; + if (!$248) $$0 = 0; else { + _memset($235 | 0, 0, $248 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $248 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$435 = 0; + do { + $255 = $i$435 << 2; + HEAP32[$labelInfo + 131084 + ($255 << 2) >> 2] = $xsize; + HEAP32[$labelInfo + 131084 + (($255 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($255 | 2) << 2) >> 2] = $ysize; + HEAP32[$labelInfo + 131084 + (($255 | 3) << 2) >> 2] = 0; + $i$435 = $i$435 + 1 | 0; + } while (($i$435 | 0) < (HEAP32[$247 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$533 = 0; + do { + $269 = (HEAP32[$labelInfo + 1179664 + ($i$533 << 2) >> 2] | 0) + -1 | 0; + $270 = $i$533 * 7 | 0; + $273 = $labelInfo + 12 + ($269 << 2) | 0; + HEAP32[$273 >> 2] = (HEAP32[$273 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($270 << 2) >> 2] | 0); + $280 = $269 << 1; + $281 = $labelInfo + 655376 + ($280 << 3) | 0; + HEAPF64[$281 >> 3] = +HEAPF64[$281 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($270 + 1 << 2) >> 2] | 0); + $289 = $labelInfo + 655376 + (($280 | 1) << 3) | 0; + HEAPF64[$289 >> 3] = +HEAPF64[$289 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($270 + 2 << 2) >> 2] | 0); + $292 = $269 << 2; + $293 = $labelInfo + 131084 + ($292 << 2) | 0; + $297 = HEAP32[$labelInfo + 1310736 + ($270 + 3 << 2) >> 2] | 0; + if ((HEAP32[$293 >> 2] | 0) > ($297 | 0)) HEAP32[$293 >> 2] = $297; + $300 = $labelInfo + 131084 + (($292 | 1) << 2) | 0; + $304 = HEAP32[$labelInfo + 1310736 + ($270 + 4 << 2) >> 2] | 0; + if ((HEAP32[$300 >> 2] | 0) < ($304 | 0)) HEAP32[$300 >> 2] = $304; + $307 = $labelInfo + 131084 + (($292 | 2) << 2) | 0; + $311 = HEAP32[$labelInfo + 1310736 + ($270 + 5 << 2) >> 2] | 0; + if ((HEAP32[$307 >> 2] | 0) > ($311 | 0)) HEAP32[$307 >> 2] = $311; + $314 = $labelInfo + 131084 + (($292 | 3) << 2) | 0; + $318 = HEAP32[$labelInfo + 1310736 + ($270 + 6 << 2) >> 2] | 0; + if ((HEAP32[$314 >> 2] | 0) < ($318 | 0)) HEAP32[$314 >> 2] = $318; + $i$533 = $i$533 + 1 | 0; + } while (($i$533 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$247 >> 2] | 0) > 0) { + $i$632 = 0; + do { + $322 = $labelInfo + 12 + ($i$632 << 2) | 0; + $325 = $i$632 << 1; + $326 = $labelInfo + 655376 + ($325 << 3) | 0; + HEAPF64[$326 >> 3] = +HEAPF64[$326 >> 3] / +(HEAP32[$322 >> 2] | 0); + $332 = $labelInfo + 655376 + (($325 | 1) << 3) | 0; + HEAPF64[$332 >> 3] = +HEAPF64[$332 >> 3] / +(HEAP32[$322 >> 2] | 0); + $i$632 = $i$632 + 1 | 0; + } while (($i$632 | 0) < (HEAP32[$247 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubDWI3C($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $$sum2 = 0, $0 = 0, $1 = 0, $101 = 0, $107 = 0, $11 = 0, $112 = 0, $115 = 0, $12 = 0, $132 = 0, $134 = 0, $136 = 0, $140 = 0, $144 = 0, $147 = 0, $149 = 0, $153 = 0, $157 = 0, $161 = 0, $166 = 0, $168 = 0, $172 = 0, $176 = 0, $180 = 0, $186 = 0, $189 = 0, $19 = 0, $191 = 0, $195 = 0, $199 = 0, $2 = 0, $20 = 0, $203 = 0, $206 = 0, $211 = 0, $226 = 0, $227 = 0, $233 = 0, $235 = 0, $241 = 0, $245 = 0, $246 = 0, $253 = 0, $267 = 0, $268 = 0, $271 = 0, $278 = 0, $279 = 0, $28 = 0, $287 = 0, $290 = 0, $291 = 0, $295 = 0, $298 = 0, $3 = 0, $302 = 0, $305 = 0, $309 = 0, $312 = 0, $316 = 0, $320 = 0, $323 = 0, $324 = 0, $330 = 0, $41 = 0, $44 = 0, $46 = 0, $50 = 0, $54 = 0, $60 = 0, $61 = 0, $64 = 0, $65 = 0, $66 = 0, $69 = 0, $72 = 0, $89 = 0, $91 = 0, $93 = 0, $97 = 0, $i$082 = 0, $i$176 = 0, $i$256 = 0, $i$338 = 0, $i$436 = 0, $i$534 = 0, $i$633 = 0, $j$069 = 0, $j$1$lcssa = 0, $j$139 = 0, $j$2 = 0, $k$052 = 0, $k$149 = 0, $k$245 = 0, $k$342 = 0, $pnt$073 = 0, $pnt$1$lcssa = 0, $pnt$164 = 0, $pnt1$084 = 0, $pnt1$178 = 0, $pnt2$083 = 0, $pnt2$177 = 0, $pnt2$272 = 0, $pnt2$3$lcssa = 0, $pnt2$363 = 0, $vararg_buffer = 0, $wk$053 = 0, $wk$150 = 0, $wk$246 = 0, $wk$343 = 0, $wk$440 = 0, $wk_max$0$lcssa = 0, $wk_max$071 = 0, $wk_max$1$lcssa = 0, $wk_max$158 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = ($xsize | 0) / 2 | 0; + $1 = ($ysize | 0) / 2 | 0; + $2 = HEAP32[$labelInfo >> 2] | 0; + $3 = $1 + -1 | 0; + if (($xsize | 0) > 1) { + $i$082 = 0; + $pnt1$084 = $2; + $pnt2$083 = $2 + ((Math_imul($3, $0) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$083 >> 1] = 0; + HEAP16[$pnt1$084 >> 1] = 0; + $i$082 = $i$082 + 1 | 0; + if (($i$082 | 0) >= ($0 | 0)) break; else { + $pnt1$084 = $pnt1$084 + 2 | 0; + $pnt2$083 = $pnt2$083 + 2 | 0; + } + } + } + $11 = $labelingThresh * 3 | 0; + $12 = $0 + -1 | 0; + if (($ysize | 0) > 1) { + $i$176 = 0; + $pnt1$178 = $2; + $pnt2$177 = $2 + ($12 << 1) | 0; + while (1) { + HEAP16[$pnt2$177 >> 1] = 0; + HEAP16[$pnt1$178 >> 1] = 0; + $i$176 = $i$176 + 1 | 0; + if (($i$176 | 0) >= ($1 | 0)) break; else { + $pnt1$178 = $pnt1$178 + ($0 << 1) | 0; + $pnt2$177 = $pnt2$177 + ($0 << 1) | 0; + } + } + } + $19 = $labelInfo + 1179664 | 0; + $20 = 0 - $0 | 0; + $$sum1 = 1 - $0 | 0; + $$sum2 = ~$0; + $$sum = ($xsize * 3 | 0) + 12 | 0; + L11 : do if (($3 | 0) > 1) { + $28 = ($12 | 0) > 1; + $j$069 = 1; + $pnt$073 = $image + (($xsize * 6 | 0) + 6) | 0; + $pnt2$272 = $2 + ($0 + 1 << 1) | 0; + $wk_max$071 = 0; + L13 : while (1) { + if ($28) { + $i$256 = 1; + $pnt$164 = $pnt$073; + $pnt2$363 = $pnt2$272; + $wk_max$158 = $wk_max$071; + while (1) { + do if (((HEAPU8[$pnt$164 + 1 >> 0] | 0) + (HEAPU8[$pnt$164 >> 0] | 0) + (HEAPU8[$pnt$164 + 2 >> 0] | 0) | 0) > ($11 | 0)) { + $41 = HEAP16[$pnt2$363 + ($20 << 1) >> 1] | 0; + if ($41 << 16 >> 16 > 0) { + HEAP16[$pnt2$363 >> 1] = $41; + $44 = ($41 << 16 >> 16) * 7 | 0; + $46 = $labelInfo + 1310736 + ($44 + -7 << 2) | 0; + HEAP32[$46 >> 2] = (HEAP32[$46 >> 2] | 0) + 1; + $50 = $labelInfo + 1310736 + ($44 + -6 << 2) | 0; + HEAP32[$50 >> 2] = (HEAP32[$50 >> 2] | 0) + $i$256; + $54 = $labelInfo + 1310736 + ($44 + -5 << 2) | 0; + HEAP32[$54 >> 2] = (HEAP32[$54 >> 2] | 0) + $j$069; + HEAP32[$labelInfo + 1310736 + ($44 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $60 = HEAP16[$pnt2$363 + ($$sum1 << 1) >> 1] | 0; + $61 = $60 << 16 >> 16; + $64 = HEAP16[$pnt2$363 + ($$sum2 << 1) >> 1] | 0; + $65 = $64 << 16 >> 16; + $66 = $64 << 16 >> 16 > 0; + if ($60 << 16 >> 16 <= 0) { + if ($66) { + HEAP16[$pnt2$363 >> 1] = $64; + $166 = $65 * 7 | 0; + $168 = $labelInfo + 1310736 + ($166 + -7 << 2) | 0; + HEAP32[$168 >> 2] = (HEAP32[$168 >> 2] | 0) + 1; + $172 = $labelInfo + 1310736 + ($166 + -6 << 2) | 0; + HEAP32[$172 >> 2] = (HEAP32[$172 >> 2] | 0) + $i$256; + $176 = $labelInfo + 1310736 + ($166 + -5 << 2) | 0; + HEAP32[$176 >> 2] = (HEAP32[$176 >> 2] | 0) + $j$069; + $180 = $labelInfo + 1310736 + ($166 + -3 << 2) | 0; + if ((HEAP32[$180 >> 2] | 0) < ($i$256 | 0)) HEAP32[$180 >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($166 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $186 = HEAP16[$pnt2$363 + -2 >> 1] | 0; + if ($186 << 16 >> 16 > 0) { + HEAP16[$pnt2$363 >> 1] = $186; + $189 = ($186 << 16 >> 16) * 7 | 0; + $191 = $labelInfo + 1310736 + ($189 + -7 << 2) | 0; + HEAP32[$191 >> 2] = (HEAP32[$191 >> 2] | 0) + 1; + $195 = $labelInfo + 1310736 + ($189 + -6 << 2) | 0; + HEAP32[$195 >> 2] = (HEAP32[$195 >> 2] | 0) + $i$256; + $199 = $labelInfo + 1310736 + ($189 + -5 << 2) | 0; + HEAP32[$199 >> 2] = (HEAP32[$199 >> 2] | 0) + $j$069; + $203 = $labelInfo + 1310736 + ($189 + -3 << 2) | 0; + if ((HEAP32[$203 >> 2] | 0) >= ($i$256 | 0)) { + $wk_max$2 = $wk_max$158; + break; + } + HEAP32[$203 >> 2] = $i$256; + $wk_max$2 = $wk_max$158; + break; + } else { + $206 = $wk_max$158 + 1 | 0; + if (($wk_max$158 | 0) > 32767) break L13; + HEAP16[$pnt2$363 >> 1] = $206; + HEAP32[$labelInfo + 1179664 + ($wk_max$158 << 2) >> 2] = $206 << 16 >> 16; + $211 = $wk_max$158 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($211 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($211 + 1 << 2) >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($211 + 2 << 2) >> 2] = $j$069; + HEAP32[$labelInfo + 1310736 + ($211 + 3 << 2) >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($211 + 4 << 2) >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($211 + 5 << 2) >> 2] = $j$069; + HEAP32[$labelInfo + 1310736 + ($211 + 6 << 2) >> 2] = $j$069; + $wk_max$2 = $206; + break; + } + } + if ($66) { + $69 = HEAP32[$labelInfo + 1179664 + ($61 + -1 << 2) >> 2] | 0; + $72 = HEAP32[$labelInfo + 1179664 + ($65 + -1 << 2) >> 2] | 0; + if (($69 | 0) > ($72 | 0)) { + HEAP16[$pnt2$363 >> 1] = $72; + if (($wk_max$158 | 0) > 0) { + $k$052 = 0; + $wk$053 = $19; + while (1) { + if ((HEAP32[$wk$053 >> 2] | 0) == ($69 | 0)) HEAP32[$wk$053 >> 2] = $72; + $k$052 = $k$052 + 1 | 0; + if (($k$052 | 0) >= ($wk_max$158 | 0)) { + $89 = $72; + break; + } else $wk$053 = $wk$053 + 4 | 0; + } + } else $89 = $72; + } else { + HEAP16[$pnt2$363 >> 1] = $69; + if (($69 | 0) < ($72 | 0) & ($wk_max$158 | 0) > 0) { + $k$149 = 0; + $wk$150 = $19; + while (1) { + if ((HEAP32[$wk$150 >> 2] | 0) == ($72 | 0)) HEAP32[$wk$150 >> 2] = $69; + $k$149 = $k$149 + 1 | 0; + if (($k$149 | 0) >= ($wk_max$158 | 0)) { + $89 = $69; + break; + } else $wk$150 = $wk$150 + 4 | 0; + } + } else $89 = $69; + } + $91 = ($89 << 16 >> 16) * 7 | 0; + $93 = $labelInfo + 1310736 + ($91 + -7 << 2) | 0; + HEAP32[$93 >> 2] = (HEAP32[$93 >> 2] | 0) + 1; + $97 = $labelInfo + 1310736 + ($91 + -6 << 2) | 0; + HEAP32[$97 >> 2] = (HEAP32[$97 >> 2] | 0) + $i$256; + $101 = $labelInfo + 1310736 + ($91 + -5 << 2) | 0; + HEAP32[$101 >> 2] = (HEAP32[$101 >> 2] | 0) + $j$069; + HEAP32[$labelInfo + 1310736 + ($91 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $107 = HEAP16[$pnt2$363 + -2 >> 1] | 0; + if ($107 << 16 >> 16 <= 0) { + HEAP16[$pnt2$363 >> 1] = $60; + $147 = $61 * 7 | 0; + $149 = $labelInfo + 1310736 + ($147 + -7 << 2) | 0; + HEAP32[$149 >> 2] = (HEAP32[$149 >> 2] | 0) + 1; + $153 = $labelInfo + 1310736 + ($147 + -6 << 2) | 0; + HEAP32[$153 >> 2] = (HEAP32[$153 >> 2] | 0) + $i$256; + $157 = $labelInfo + 1310736 + ($147 + -5 << 2) | 0; + HEAP32[$157 >> 2] = (HEAP32[$157 >> 2] | 0) + $j$069; + $161 = $labelInfo + 1310736 + ($147 + -4 << 2) | 0; + if ((HEAP32[$161 >> 2] | 0) > ($i$256 | 0)) HEAP32[$161 >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($147 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $112 = HEAP32[$labelInfo + 1179664 + ($61 + -1 << 2) >> 2] | 0; + $115 = HEAP32[$labelInfo + 1179664 + (($107 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($112 | 0) > ($115 | 0)) { + HEAP16[$pnt2$363 >> 1] = $115; + if (($wk_max$158 | 0) > 0) { + $k$245 = 0; + $wk$246 = $19; + while (1) { + if ((HEAP32[$wk$246 >> 2] | 0) == ($112 | 0)) HEAP32[$wk$246 >> 2] = $115; + $k$245 = $k$245 + 1 | 0; + if (($k$245 | 0) >= ($wk_max$158 | 0)) { + $132 = $115; + break; + } else $wk$246 = $wk$246 + 4 | 0; + } + } else $132 = $115; + } else { + HEAP16[$pnt2$363 >> 1] = $112; + if (($112 | 0) < ($115 | 0) & ($wk_max$158 | 0) > 0) { + $k$342 = 0; + $wk$343 = $19; + while (1) { + if ((HEAP32[$wk$343 >> 2] | 0) == ($115 | 0)) HEAP32[$wk$343 >> 2] = $112; + $k$342 = $k$342 + 1 | 0; + if (($k$342 | 0) >= ($wk_max$158 | 0)) { + $132 = $112; + break; + } else $wk$343 = $wk$343 + 4 | 0; + } + } else $132 = $112; + } + $134 = ($132 << 16 >> 16) * 7 | 0; + $136 = $labelInfo + 1310736 + ($134 + -7 << 2) | 0; + HEAP32[$136 >> 2] = (HEAP32[$136 >> 2] | 0) + 1; + $140 = $labelInfo + 1310736 + ($134 + -6 << 2) | 0; + HEAP32[$140 >> 2] = (HEAP32[$140 >> 2] | 0) + $i$256; + $144 = $labelInfo + 1310736 + ($134 + -5 << 2) | 0; + HEAP32[$144 >> 2] = (HEAP32[$144 >> 2] | 0) + $j$069; + $wk_max$2 = $wk_max$158; + } else { + HEAP16[$pnt2$363 >> 1] = 0; + $wk_max$2 = $wk_max$158; + } while (0); + $i$256 = $i$256 + 1 | 0; + $226 = $pnt$164 + 6 | 0; + $227 = $pnt2$363 + 2 | 0; + if (($i$256 | 0) >= ($12 | 0)) { + $pnt$1$lcssa = $226; + $pnt2$3$lcssa = $227; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $pnt$164 = $226; + $pnt2$363 = $227; + $wk_max$158 = $wk_max$2; + } + } + } else { + $pnt$1$lcssa = $pnt$073; + $pnt2$3$lcssa = $pnt2$272; + $wk_max$1$lcssa = $wk_max$071; + } + $j$069 = $j$069 + 1 | 0; + if (($j$069 | 0) >= ($3 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $pnt$073 = $pnt$1$lcssa + $$sum | 0; + $pnt2$272 = $pnt2$3$lcssa + 4 | 0; + $wk_max$071 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $233 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$338 = 1; + $j$139 = 1; + $wk$440 = $19; + while (1) { + $235 = HEAP32[$wk$440 >> 2] | 0; + if (($235 | 0) == ($i$338 | 0)) { + $241 = $j$139; + $j$2 = $j$139 + 1 | 0; + } else { + $241 = HEAP32[$labelInfo + 1179664 + ($235 + -1 << 2) >> 2] | 0; + $j$2 = $j$139; + } + HEAP32[$wk$440 >> 2] = $241; + if (($i$338 | 0) < ($wk_max$0$lcssa | 0)) { + $i$338 = $i$338 + 1 | 0; + $j$139 = $j$2; + $wk$440 = $wk$440 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $245 = $labelInfo + 8 | 0; + $246 = $j$1$lcssa + -1 | 0; + HEAP32[$245 >> 2] = $246; + if (!$246) $$0 = 0; else { + _memset($233 | 0, 0, $246 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $246 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$436 = 0; + do { + $253 = $i$436 << 2; + HEAP32[$labelInfo + 131084 + ($253 << 2) >> 2] = $0; + HEAP32[$labelInfo + 131084 + (($253 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($253 | 2) << 2) >> 2] = $1; + HEAP32[$labelInfo + 131084 + (($253 | 3) << 2) >> 2] = 0; + $i$436 = $i$436 + 1 | 0; + } while (($i$436 | 0) < (HEAP32[$245 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$534 = 0; + do { + $267 = (HEAP32[$labelInfo + 1179664 + ($i$534 << 2) >> 2] | 0) + -1 | 0; + $268 = $i$534 * 7 | 0; + $271 = $labelInfo + 12 + ($267 << 2) | 0; + HEAP32[$271 >> 2] = (HEAP32[$271 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($268 << 2) >> 2] | 0); + $278 = $267 << 1; + $279 = $labelInfo + 655376 + ($278 << 3) | 0; + HEAPF64[$279 >> 3] = +HEAPF64[$279 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($268 + 1 << 2) >> 2] | 0); + $287 = $labelInfo + 655376 + (($278 | 1) << 3) | 0; + HEAPF64[$287 >> 3] = +HEAPF64[$287 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($268 + 2 << 2) >> 2] | 0); + $290 = $267 << 2; + $291 = $labelInfo + 131084 + ($290 << 2) | 0; + $295 = HEAP32[$labelInfo + 1310736 + ($268 + 3 << 2) >> 2] | 0; + if ((HEAP32[$291 >> 2] | 0) > ($295 | 0)) HEAP32[$291 >> 2] = $295; + $298 = $labelInfo + 131084 + (($290 | 1) << 2) | 0; + $302 = HEAP32[$labelInfo + 1310736 + ($268 + 4 << 2) >> 2] | 0; + if ((HEAP32[$298 >> 2] | 0) < ($302 | 0)) HEAP32[$298 >> 2] = $302; + $305 = $labelInfo + 131084 + (($290 | 2) << 2) | 0; + $309 = HEAP32[$labelInfo + 1310736 + ($268 + 5 << 2) >> 2] | 0; + if ((HEAP32[$305 >> 2] | 0) > ($309 | 0)) HEAP32[$305 >> 2] = $309; + $312 = $labelInfo + 131084 + (($290 | 3) << 2) | 0; + $316 = HEAP32[$labelInfo + 1310736 + ($268 + 6 << 2) >> 2] | 0; + if ((HEAP32[$312 >> 2] | 0) < ($316 | 0)) HEAP32[$312 >> 2] = $316; + $i$534 = $i$534 + 1 | 0; + } while (($i$534 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$245 >> 2] | 0) > 0) { + $i$633 = 0; + do { + $320 = $labelInfo + 12 + ($i$633 << 2) | 0; + $323 = $i$633 << 1; + $324 = $labelInfo + 655376 + ($323 << 3) | 0; + HEAPF64[$324 >> 3] = +HEAPF64[$324 >> 3] / +(HEAP32[$320 >> 2] | 0); + $330 = $labelInfo + 655376 + (($323 | 1) << 3) | 0; + HEAPF64[$330 >> 3] = +HEAPF64[$330 >> 3] / +(HEAP32[$320 >> 2] | 0); + $i$633 = $i$633 + 1 | 0; + } while (($i$633 | 0) < (HEAP32[$245 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubDBI3C($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $$sum2 = 0, $0 = 0, $1 = 0, $101 = 0, $107 = 0, $11 = 0, $112 = 0, $115 = 0, $12 = 0, $132 = 0, $134 = 0, $136 = 0, $140 = 0, $144 = 0, $147 = 0, $149 = 0, $153 = 0, $157 = 0, $161 = 0, $166 = 0, $168 = 0, $172 = 0, $176 = 0, $180 = 0, $186 = 0, $189 = 0, $19 = 0, $191 = 0, $195 = 0, $199 = 0, $2 = 0, $20 = 0, $203 = 0, $206 = 0, $211 = 0, $226 = 0, $227 = 0, $233 = 0, $235 = 0, $241 = 0, $245 = 0, $246 = 0, $253 = 0, $267 = 0, $268 = 0, $271 = 0, $278 = 0, $279 = 0, $28 = 0, $287 = 0, $290 = 0, $291 = 0, $295 = 0, $298 = 0, $3 = 0, $302 = 0, $305 = 0, $309 = 0, $312 = 0, $316 = 0, $320 = 0, $323 = 0, $324 = 0, $330 = 0, $41 = 0, $44 = 0, $46 = 0, $50 = 0, $54 = 0, $60 = 0, $61 = 0, $64 = 0, $65 = 0, $66 = 0, $69 = 0, $72 = 0, $89 = 0, $91 = 0, $93 = 0, $97 = 0, $i$082 = 0, $i$176 = 0, $i$256 = 0, $i$338 = 0, $i$436 = 0, $i$534 = 0, $i$633 = 0, $j$069 = 0, $j$1$lcssa = 0, $j$139 = 0, $j$2 = 0, $k$052 = 0, $k$149 = 0, $k$245 = 0, $k$342 = 0, $pnt$073 = 0, $pnt$1$lcssa = 0, $pnt$164 = 0, $pnt1$084 = 0, $pnt1$178 = 0, $pnt2$083 = 0, $pnt2$177 = 0, $pnt2$272 = 0, $pnt2$3$lcssa = 0, $pnt2$363 = 0, $vararg_buffer = 0, $wk$053 = 0, $wk$150 = 0, $wk$246 = 0, $wk$343 = 0, $wk$440 = 0, $wk_max$0$lcssa = 0, $wk_max$071 = 0, $wk_max$1$lcssa = 0, $wk_max$158 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = ($xsize | 0) / 2 | 0; + $1 = ($ysize | 0) / 2 | 0; + $2 = HEAP32[$labelInfo >> 2] | 0; + $3 = $1 + -1 | 0; + if (($xsize | 0) > 1) { + $i$082 = 0; + $pnt1$084 = $2; + $pnt2$083 = $2 + ((Math_imul($3, $0) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$083 >> 1] = 0; + HEAP16[$pnt1$084 >> 1] = 0; + $i$082 = $i$082 + 1 | 0; + if (($i$082 | 0) >= ($0 | 0)) break; else { + $pnt1$084 = $pnt1$084 + 2 | 0; + $pnt2$083 = $pnt2$083 + 2 | 0; + } + } + } + $11 = $labelingThresh * 3 | 0; + $12 = $0 + -1 | 0; + if (($ysize | 0) > 1) { + $i$176 = 0; + $pnt1$178 = $2; + $pnt2$177 = $2 + ($12 << 1) | 0; + while (1) { + HEAP16[$pnt2$177 >> 1] = 0; + HEAP16[$pnt1$178 >> 1] = 0; + $i$176 = $i$176 + 1 | 0; + if (($i$176 | 0) >= ($1 | 0)) break; else { + $pnt1$178 = $pnt1$178 + ($0 << 1) | 0; + $pnt2$177 = $pnt2$177 + ($0 << 1) | 0; + } + } + } + $19 = $labelInfo + 1179664 | 0; + $20 = 0 - $0 | 0; + $$sum1 = 1 - $0 | 0; + $$sum2 = ~$0; + $$sum = ($xsize * 3 | 0) + 12 | 0; + L11 : do if (($3 | 0) > 1) { + $28 = ($12 | 0) > 1; + $j$069 = 1; + $pnt$073 = $image + (($xsize * 6 | 0) + 6) | 0; + $pnt2$272 = $2 + ($0 + 1 << 1) | 0; + $wk_max$071 = 0; + L13 : while (1) { + if ($28) { + $i$256 = 1; + $pnt$164 = $pnt$073; + $pnt2$363 = $pnt2$272; + $wk_max$158 = $wk_max$071; + while (1) { + do if (((HEAPU8[$pnt$164 + 1 >> 0] | 0) + (HEAPU8[$pnt$164 >> 0] | 0) + (HEAPU8[$pnt$164 + 2 >> 0] | 0) | 0) > ($11 | 0)) { + HEAP16[$pnt2$363 >> 1] = 0; + $wk_max$2 = $wk_max$158; + } else { + $41 = HEAP16[$pnt2$363 + ($20 << 1) >> 1] | 0; + if ($41 << 16 >> 16 > 0) { + HEAP16[$pnt2$363 >> 1] = $41; + $44 = ($41 << 16 >> 16) * 7 | 0; + $46 = $labelInfo + 1310736 + ($44 + -7 << 2) | 0; + HEAP32[$46 >> 2] = (HEAP32[$46 >> 2] | 0) + 1; + $50 = $labelInfo + 1310736 + ($44 + -6 << 2) | 0; + HEAP32[$50 >> 2] = (HEAP32[$50 >> 2] | 0) + $i$256; + $54 = $labelInfo + 1310736 + ($44 + -5 << 2) | 0; + HEAP32[$54 >> 2] = (HEAP32[$54 >> 2] | 0) + $j$069; + HEAP32[$labelInfo + 1310736 + ($44 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $60 = HEAP16[$pnt2$363 + ($$sum1 << 1) >> 1] | 0; + $61 = $60 << 16 >> 16; + $64 = HEAP16[$pnt2$363 + ($$sum2 << 1) >> 1] | 0; + $65 = $64 << 16 >> 16; + $66 = $64 << 16 >> 16 > 0; + if ($60 << 16 >> 16 <= 0) { + if ($66) { + HEAP16[$pnt2$363 >> 1] = $64; + $166 = $65 * 7 | 0; + $168 = $labelInfo + 1310736 + ($166 + -7 << 2) | 0; + HEAP32[$168 >> 2] = (HEAP32[$168 >> 2] | 0) + 1; + $172 = $labelInfo + 1310736 + ($166 + -6 << 2) | 0; + HEAP32[$172 >> 2] = (HEAP32[$172 >> 2] | 0) + $i$256; + $176 = $labelInfo + 1310736 + ($166 + -5 << 2) | 0; + HEAP32[$176 >> 2] = (HEAP32[$176 >> 2] | 0) + $j$069; + $180 = $labelInfo + 1310736 + ($166 + -3 << 2) | 0; + if ((HEAP32[$180 >> 2] | 0) < ($i$256 | 0)) HEAP32[$180 >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($166 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $186 = HEAP16[$pnt2$363 + -2 >> 1] | 0; + if ($186 << 16 >> 16 > 0) { + HEAP16[$pnt2$363 >> 1] = $186; + $189 = ($186 << 16 >> 16) * 7 | 0; + $191 = $labelInfo + 1310736 + ($189 + -7 << 2) | 0; + HEAP32[$191 >> 2] = (HEAP32[$191 >> 2] | 0) + 1; + $195 = $labelInfo + 1310736 + ($189 + -6 << 2) | 0; + HEAP32[$195 >> 2] = (HEAP32[$195 >> 2] | 0) + $i$256; + $199 = $labelInfo + 1310736 + ($189 + -5 << 2) | 0; + HEAP32[$199 >> 2] = (HEAP32[$199 >> 2] | 0) + $j$069; + $203 = $labelInfo + 1310736 + ($189 + -3 << 2) | 0; + if ((HEAP32[$203 >> 2] | 0) >= ($i$256 | 0)) { + $wk_max$2 = $wk_max$158; + break; + } + HEAP32[$203 >> 2] = $i$256; + $wk_max$2 = $wk_max$158; + break; + } else { + $206 = $wk_max$158 + 1 | 0; + if (($wk_max$158 | 0) > 32767) break L13; + HEAP16[$pnt2$363 >> 1] = $206; + HEAP32[$labelInfo + 1179664 + ($wk_max$158 << 2) >> 2] = $206 << 16 >> 16; + $211 = $wk_max$158 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($211 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($211 + 1 << 2) >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($211 + 2 << 2) >> 2] = $j$069; + HEAP32[$labelInfo + 1310736 + ($211 + 3 << 2) >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($211 + 4 << 2) >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($211 + 5 << 2) >> 2] = $j$069; + HEAP32[$labelInfo + 1310736 + ($211 + 6 << 2) >> 2] = $j$069; + $wk_max$2 = $206; + break; + } + } + if ($66) { + $69 = HEAP32[$labelInfo + 1179664 + ($61 + -1 << 2) >> 2] | 0; + $72 = HEAP32[$labelInfo + 1179664 + ($65 + -1 << 2) >> 2] | 0; + if (($69 | 0) > ($72 | 0)) { + HEAP16[$pnt2$363 >> 1] = $72; + if (($wk_max$158 | 0) > 0) { + $k$052 = 0; + $wk$053 = $19; + while (1) { + if ((HEAP32[$wk$053 >> 2] | 0) == ($69 | 0)) HEAP32[$wk$053 >> 2] = $72; + $k$052 = $k$052 + 1 | 0; + if (($k$052 | 0) >= ($wk_max$158 | 0)) { + $89 = $72; + break; + } else $wk$053 = $wk$053 + 4 | 0; + } + } else $89 = $72; + } else { + HEAP16[$pnt2$363 >> 1] = $69; + if (($69 | 0) < ($72 | 0) & ($wk_max$158 | 0) > 0) { + $k$149 = 0; + $wk$150 = $19; + while (1) { + if ((HEAP32[$wk$150 >> 2] | 0) == ($72 | 0)) HEAP32[$wk$150 >> 2] = $69; + $k$149 = $k$149 + 1 | 0; + if (($k$149 | 0) >= ($wk_max$158 | 0)) { + $89 = $69; + break; + } else $wk$150 = $wk$150 + 4 | 0; + } + } else $89 = $69; + } + $91 = ($89 << 16 >> 16) * 7 | 0; + $93 = $labelInfo + 1310736 + ($91 + -7 << 2) | 0; + HEAP32[$93 >> 2] = (HEAP32[$93 >> 2] | 0) + 1; + $97 = $labelInfo + 1310736 + ($91 + -6 << 2) | 0; + HEAP32[$97 >> 2] = (HEAP32[$97 >> 2] | 0) + $i$256; + $101 = $labelInfo + 1310736 + ($91 + -5 << 2) | 0; + HEAP32[$101 >> 2] = (HEAP32[$101 >> 2] | 0) + $j$069; + HEAP32[$labelInfo + 1310736 + ($91 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $107 = HEAP16[$pnt2$363 + -2 >> 1] | 0; + if ($107 << 16 >> 16 <= 0) { + HEAP16[$pnt2$363 >> 1] = $60; + $147 = $61 * 7 | 0; + $149 = $labelInfo + 1310736 + ($147 + -7 << 2) | 0; + HEAP32[$149 >> 2] = (HEAP32[$149 >> 2] | 0) + 1; + $153 = $labelInfo + 1310736 + ($147 + -6 << 2) | 0; + HEAP32[$153 >> 2] = (HEAP32[$153 >> 2] | 0) + $i$256; + $157 = $labelInfo + 1310736 + ($147 + -5 << 2) | 0; + HEAP32[$157 >> 2] = (HEAP32[$157 >> 2] | 0) + $j$069; + $161 = $labelInfo + 1310736 + ($147 + -4 << 2) | 0; + if ((HEAP32[$161 >> 2] | 0) > ($i$256 | 0)) HEAP32[$161 >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($147 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $112 = HEAP32[$labelInfo + 1179664 + ($61 + -1 << 2) >> 2] | 0; + $115 = HEAP32[$labelInfo + 1179664 + (($107 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($112 | 0) > ($115 | 0)) { + HEAP16[$pnt2$363 >> 1] = $115; + if (($wk_max$158 | 0) > 0) { + $k$245 = 0; + $wk$246 = $19; + while (1) { + if ((HEAP32[$wk$246 >> 2] | 0) == ($112 | 0)) HEAP32[$wk$246 >> 2] = $115; + $k$245 = $k$245 + 1 | 0; + if (($k$245 | 0) >= ($wk_max$158 | 0)) { + $132 = $115; + break; + } else $wk$246 = $wk$246 + 4 | 0; + } + } else $132 = $115; + } else { + HEAP16[$pnt2$363 >> 1] = $112; + if (($112 | 0) < ($115 | 0) & ($wk_max$158 | 0) > 0) { + $k$342 = 0; + $wk$343 = $19; + while (1) { + if ((HEAP32[$wk$343 >> 2] | 0) == ($115 | 0)) HEAP32[$wk$343 >> 2] = $112; + $k$342 = $k$342 + 1 | 0; + if (($k$342 | 0) >= ($wk_max$158 | 0)) { + $132 = $112; + break; + } else $wk$343 = $wk$343 + 4 | 0; + } + } else $132 = $112; + } + $134 = ($132 << 16 >> 16) * 7 | 0; + $136 = $labelInfo + 1310736 + ($134 + -7 << 2) | 0; + HEAP32[$136 >> 2] = (HEAP32[$136 >> 2] | 0) + 1; + $140 = $labelInfo + 1310736 + ($134 + -6 << 2) | 0; + HEAP32[$140 >> 2] = (HEAP32[$140 >> 2] | 0) + $i$256; + $144 = $labelInfo + 1310736 + ($134 + -5 << 2) | 0; + HEAP32[$144 >> 2] = (HEAP32[$144 >> 2] | 0) + $j$069; + $wk_max$2 = $wk_max$158; + } while (0); + $i$256 = $i$256 + 1 | 0; + $226 = $pnt$164 + 6 | 0; + $227 = $pnt2$363 + 2 | 0; + if (($i$256 | 0) >= ($12 | 0)) { + $pnt$1$lcssa = $226; + $pnt2$3$lcssa = $227; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $pnt$164 = $226; + $pnt2$363 = $227; + $wk_max$158 = $wk_max$2; + } + } + } else { + $pnt$1$lcssa = $pnt$073; + $pnt2$3$lcssa = $pnt2$272; + $wk_max$1$lcssa = $wk_max$071; + } + $j$069 = $j$069 + 1 | 0; + if (($j$069 | 0) >= ($3 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $pnt$073 = $pnt$1$lcssa + $$sum | 0; + $pnt2$272 = $pnt2$3$lcssa + 4 | 0; + $wk_max$071 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $233 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$338 = 1; + $j$139 = 1; + $wk$440 = $19; + while (1) { + $235 = HEAP32[$wk$440 >> 2] | 0; + if (($235 | 0) == ($i$338 | 0)) { + $241 = $j$139; + $j$2 = $j$139 + 1 | 0; + } else { + $241 = HEAP32[$labelInfo + 1179664 + ($235 + -1 << 2) >> 2] | 0; + $j$2 = $j$139; + } + HEAP32[$wk$440 >> 2] = $241; + if (($i$338 | 0) < ($wk_max$0$lcssa | 0)) { + $i$338 = $i$338 + 1 | 0; + $j$139 = $j$2; + $wk$440 = $wk$440 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $245 = $labelInfo + 8 | 0; + $246 = $j$1$lcssa + -1 | 0; + HEAP32[$245 >> 2] = $246; + if (!$246) $$0 = 0; else { + _memset($233 | 0, 0, $246 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $246 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$436 = 0; + do { + $253 = $i$436 << 2; + HEAP32[$labelInfo + 131084 + ($253 << 2) >> 2] = $0; + HEAP32[$labelInfo + 131084 + (($253 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($253 | 2) << 2) >> 2] = $1; + HEAP32[$labelInfo + 131084 + (($253 | 3) << 2) >> 2] = 0; + $i$436 = $i$436 + 1 | 0; + } while (($i$436 | 0) < (HEAP32[$245 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$534 = 0; + do { + $267 = (HEAP32[$labelInfo + 1179664 + ($i$534 << 2) >> 2] | 0) + -1 | 0; + $268 = $i$534 * 7 | 0; + $271 = $labelInfo + 12 + ($267 << 2) | 0; + HEAP32[$271 >> 2] = (HEAP32[$271 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($268 << 2) >> 2] | 0); + $278 = $267 << 1; + $279 = $labelInfo + 655376 + ($278 << 3) | 0; + HEAPF64[$279 >> 3] = +HEAPF64[$279 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($268 + 1 << 2) >> 2] | 0); + $287 = $labelInfo + 655376 + (($278 | 1) << 3) | 0; + HEAPF64[$287 >> 3] = +HEAPF64[$287 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($268 + 2 << 2) >> 2] | 0); + $290 = $267 << 2; + $291 = $labelInfo + 131084 + ($290 << 2) | 0; + $295 = HEAP32[$labelInfo + 1310736 + ($268 + 3 << 2) >> 2] | 0; + if ((HEAP32[$291 >> 2] | 0) > ($295 | 0)) HEAP32[$291 >> 2] = $295; + $298 = $labelInfo + 131084 + (($290 | 1) << 2) | 0; + $302 = HEAP32[$labelInfo + 1310736 + ($268 + 4 << 2) >> 2] | 0; + if ((HEAP32[$298 >> 2] | 0) < ($302 | 0)) HEAP32[$298 >> 2] = $302; + $305 = $labelInfo + 131084 + (($290 | 2) << 2) | 0; + $309 = HEAP32[$labelInfo + 1310736 + ($268 + 5 << 2) >> 2] | 0; + if ((HEAP32[$305 >> 2] | 0) > ($309 | 0)) HEAP32[$305 >> 2] = $309; + $312 = $labelInfo + 131084 + (($290 | 3) << 2) | 0; + $316 = HEAP32[$labelInfo + 1310736 + ($268 + 6 << 2) >> 2] | 0; + if ((HEAP32[$312 >> 2] | 0) < ($316 | 0)) HEAP32[$312 >> 2] = $316; + $i$534 = $i$534 + 1 | 0; + } while (($i$534 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$245 >> 2] | 0) > 0) { + $i$633 = 0; + do { + $320 = $labelInfo + 12 + ($i$633 << 2) | 0; + $323 = $i$633 << 1; + $324 = $labelInfo + 655376 + ($323 << 3) | 0; + HEAPF64[$324 >> 3] = +HEAPF64[$324 >> 3] / +(HEAP32[$320 >> 2] | 0); + $330 = $labelInfo + 655376 + (($323 | 1) << 3) | 0; + HEAPF64[$330 >> 3] = +HEAPF64[$330 >> 3] / +(HEAP32[$320 >> 2] | 0); + $i$633 = $i$633 + 1 | 0; + } while (($i$633 | 0) < (HEAP32[$245 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubDWIA3C($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $$sum2 = 0, $0 = 0, $1 = 0, $102 = 0, $108 = 0, $11 = 0, $113 = 0, $116 = 0, $12 = 0, $133 = 0, $135 = 0, $137 = 0, $141 = 0, $145 = 0, $148 = 0, $150 = 0, $154 = 0, $158 = 0, $162 = 0, $167 = 0, $169 = 0, $173 = 0, $177 = 0, $181 = 0, $187 = 0, $19 = 0, $190 = 0, $192 = 0, $196 = 0, $2 = 0, $20 = 0, $200 = 0, $204 = 0, $207 = 0, $212 = 0, $227 = 0, $228 = 0, $234 = 0, $236 = 0, $242 = 0, $246 = 0, $247 = 0, $254 = 0, $268 = 0, $269 = 0, $272 = 0, $279 = 0, $28 = 0, $280 = 0, $288 = 0, $291 = 0, $292 = 0, $296 = 0, $299 = 0, $3 = 0, $303 = 0, $306 = 0, $310 = 0, $313 = 0, $317 = 0, $321 = 0, $324 = 0, $325 = 0, $331 = 0, $42 = 0, $45 = 0, $47 = 0, $51 = 0, $55 = 0, $61 = 0, $62 = 0, $65 = 0, $66 = 0, $67 = 0, $70 = 0, $73 = 0, $90 = 0, $92 = 0, $94 = 0, $98 = 0, $i$082 = 0, $i$176 = 0, $i$256 = 0, $i$338 = 0, $i$436 = 0, $i$534 = 0, $i$633 = 0, $j$069 = 0, $j$1$lcssa = 0, $j$139 = 0, $j$2 = 0, $k$052 = 0, $k$149 = 0, $k$245 = 0, $k$342 = 0, $pnt$073 = 0, $pnt$1$lcssa = 0, $pnt$164 = 0, $pnt1$084 = 0, $pnt1$178 = 0, $pnt2$083 = 0, $pnt2$177 = 0, $pnt2$272 = 0, $pnt2$3$lcssa = 0, $pnt2$363 = 0, $vararg_buffer = 0, $wk$053 = 0, $wk$150 = 0, $wk$246 = 0, $wk$343 = 0, $wk$440 = 0, $wk_max$0$lcssa = 0, $wk_max$071 = 0, $wk_max$1$lcssa = 0, $wk_max$158 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = ($xsize | 0) / 2 | 0; + $1 = ($ysize | 0) / 2 | 0; + $2 = HEAP32[$labelInfo >> 2] | 0; + $3 = $1 + -1 | 0; + if (($xsize | 0) > 1) { + $i$082 = 0; + $pnt1$084 = $2; + $pnt2$083 = $2 + ((Math_imul($3, $0) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$083 >> 1] = 0; + HEAP16[$pnt1$084 >> 1] = 0; + $i$082 = $i$082 + 1 | 0; + if (($i$082 | 0) >= ($0 | 0)) break; else { + $pnt1$084 = $pnt1$084 + 2 | 0; + $pnt2$083 = $pnt2$083 + 2 | 0; + } + } + } + $11 = $labelingThresh * 3 | 0; + $12 = $0 + -1 | 0; + if (($ysize | 0) > 1) { + $i$176 = 0; + $pnt1$178 = $2; + $pnt2$177 = $2 + ($12 << 1) | 0; + while (1) { + HEAP16[$pnt2$177 >> 1] = 0; + HEAP16[$pnt1$178 >> 1] = 0; + $i$176 = $i$176 + 1 | 0; + if (($i$176 | 0) >= ($1 | 0)) break; else { + $pnt1$178 = $pnt1$178 + ($0 << 1) | 0; + $pnt2$177 = $pnt2$177 + ($0 << 1) | 0; + } + } + } + $19 = $labelInfo + 1179664 | 0; + $20 = 0 - $0 | 0; + $$sum1 = 1 - $0 | 0; + $$sum2 = ~$0; + $$sum = ($xsize << 2) + 16 | 0; + L11 : do if (($3 | 0) > 1) { + $28 = ($12 | 0) > 1; + $j$069 = 1; + $pnt$073 = $image + (($xsize << 3) + 8) | 0; + $pnt2$272 = $2 + ($0 + 1 << 1) | 0; + $wk_max$071 = 0; + L13 : while (1) { + if ($28) { + $i$256 = 1; + $pnt$164 = $pnt$073; + $pnt2$363 = $pnt2$272; + $wk_max$158 = $wk_max$071; + while (1) { + do if (((HEAPU8[$pnt$164 + 2 >> 0] | 0) + (HEAPU8[$pnt$164 + 1 >> 0] | 0) + (HEAPU8[$pnt$164 + 3 >> 0] | 0) | 0) > ($11 | 0)) { + $42 = HEAP16[$pnt2$363 + ($20 << 1) >> 1] | 0; + if ($42 << 16 >> 16 > 0) { + HEAP16[$pnt2$363 >> 1] = $42; + $45 = ($42 << 16 >> 16) * 7 | 0; + $47 = $labelInfo + 1310736 + ($45 + -7 << 2) | 0; + HEAP32[$47 >> 2] = (HEAP32[$47 >> 2] | 0) + 1; + $51 = $labelInfo + 1310736 + ($45 + -6 << 2) | 0; + HEAP32[$51 >> 2] = (HEAP32[$51 >> 2] | 0) + $i$256; + $55 = $labelInfo + 1310736 + ($45 + -5 << 2) | 0; + HEAP32[$55 >> 2] = (HEAP32[$55 >> 2] | 0) + $j$069; + HEAP32[$labelInfo + 1310736 + ($45 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $61 = HEAP16[$pnt2$363 + ($$sum1 << 1) >> 1] | 0; + $62 = $61 << 16 >> 16; + $65 = HEAP16[$pnt2$363 + ($$sum2 << 1) >> 1] | 0; + $66 = $65 << 16 >> 16; + $67 = $65 << 16 >> 16 > 0; + if ($61 << 16 >> 16 <= 0) { + if ($67) { + HEAP16[$pnt2$363 >> 1] = $65; + $167 = $66 * 7 | 0; + $169 = $labelInfo + 1310736 + ($167 + -7 << 2) | 0; + HEAP32[$169 >> 2] = (HEAP32[$169 >> 2] | 0) + 1; + $173 = $labelInfo + 1310736 + ($167 + -6 << 2) | 0; + HEAP32[$173 >> 2] = (HEAP32[$173 >> 2] | 0) + $i$256; + $177 = $labelInfo + 1310736 + ($167 + -5 << 2) | 0; + HEAP32[$177 >> 2] = (HEAP32[$177 >> 2] | 0) + $j$069; + $181 = $labelInfo + 1310736 + ($167 + -3 << 2) | 0; + if ((HEAP32[$181 >> 2] | 0) < ($i$256 | 0)) HEAP32[$181 >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($167 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $187 = HEAP16[$pnt2$363 + -2 >> 1] | 0; + if ($187 << 16 >> 16 > 0) { + HEAP16[$pnt2$363 >> 1] = $187; + $190 = ($187 << 16 >> 16) * 7 | 0; + $192 = $labelInfo + 1310736 + ($190 + -7 << 2) | 0; + HEAP32[$192 >> 2] = (HEAP32[$192 >> 2] | 0) + 1; + $196 = $labelInfo + 1310736 + ($190 + -6 << 2) | 0; + HEAP32[$196 >> 2] = (HEAP32[$196 >> 2] | 0) + $i$256; + $200 = $labelInfo + 1310736 + ($190 + -5 << 2) | 0; + HEAP32[$200 >> 2] = (HEAP32[$200 >> 2] | 0) + $j$069; + $204 = $labelInfo + 1310736 + ($190 + -3 << 2) | 0; + if ((HEAP32[$204 >> 2] | 0) >= ($i$256 | 0)) { + $wk_max$2 = $wk_max$158; + break; + } + HEAP32[$204 >> 2] = $i$256; + $wk_max$2 = $wk_max$158; + break; + } else { + $207 = $wk_max$158 + 1 | 0; + if (($wk_max$158 | 0) > 32767) break L13; + HEAP16[$pnt2$363 >> 1] = $207; + HEAP32[$labelInfo + 1179664 + ($wk_max$158 << 2) >> 2] = $207 << 16 >> 16; + $212 = $wk_max$158 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($212 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($212 + 1 << 2) >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($212 + 2 << 2) >> 2] = $j$069; + HEAP32[$labelInfo + 1310736 + ($212 + 3 << 2) >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($212 + 4 << 2) >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($212 + 5 << 2) >> 2] = $j$069; + HEAP32[$labelInfo + 1310736 + ($212 + 6 << 2) >> 2] = $j$069; + $wk_max$2 = $207; + break; + } + } + if ($67) { + $70 = HEAP32[$labelInfo + 1179664 + ($62 + -1 << 2) >> 2] | 0; + $73 = HEAP32[$labelInfo + 1179664 + ($66 + -1 << 2) >> 2] | 0; + if (($70 | 0) > ($73 | 0)) { + HEAP16[$pnt2$363 >> 1] = $73; + if (($wk_max$158 | 0) > 0) { + $k$052 = 0; + $wk$053 = $19; + while (1) { + if ((HEAP32[$wk$053 >> 2] | 0) == ($70 | 0)) HEAP32[$wk$053 >> 2] = $73; + $k$052 = $k$052 + 1 | 0; + if (($k$052 | 0) >= ($wk_max$158 | 0)) { + $90 = $73; + break; + } else $wk$053 = $wk$053 + 4 | 0; + } + } else $90 = $73; + } else { + HEAP16[$pnt2$363 >> 1] = $70; + if (($70 | 0) < ($73 | 0) & ($wk_max$158 | 0) > 0) { + $k$149 = 0; + $wk$150 = $19; + while (1) { + if ((HEAP32[$wk$150 >> 2] | 0) == ($73 | 0)) HEAP32[$wk$150 >> 2] = $70; + $k$149 = $k$149 + 1 | 0; + if (($k$149 | 0) >= ($wk_max$158 | 0)) { + $90 = $70; + break; + } else $wk$150 = $wk$150 + 4 | 0; + } + } else $90 = $70; + } + $92 = ($90 << 16 >> 16) * 7 | 0; + $94 = $labelInfo + 1310736 + ($92 + -7 << 2) | 0; + HEAP32[$94 >> 2] = (HEAP32[$94 >> 2] | 0) + 1; + $98 = $labelInfo + 1310736 + ($92 + -6 << 2) | 0; + HEAP32[$98 >> 2] = (HEAP32[$98 >> 2] | 0) + $i$256; + $102 = $labelInfo + 1310736 + ($92 + -5 << 2) | 0; + HEAP32[$102 >> 2] = (HEAP32[$102 >> 2] | 0) + $j$069; + HEAP32[$labelInfo + 1310736 + ($92 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $108 = HEAP16[$pnt2$363 + -2 >> 1] | 0; + if ($108 << 16 >> 16 <= 0) { + HEAP16[$pnt2$363 >> 1] = $61; + $148 = $62 * 7 | 0; + $150 = $labelInfo + 1310736 + ($148 + -7 << 2) | 0; + HEAP32[$150 >> 2] = (HEAP32[$150 >> 2] | 0) + 1; + $154 = $labelInfo + 1310736 + ($148 + -6 << 2) | 0; + HEAP32[$154 >> 2] = (HEAP32[$154 >> 2] | 0) + $i$256; + $158 = $labelInfo + 1310736 + ($148 + -5 << 2) | 0; + HEAP32[$158 >> 2] = (HEAP32[$158 >> 2] | 0) + $j$069; + $162 = $labelInfo + 1310736 + ($148 + -4 << 2) | 0; + if ((HEAP32[$162 >> 2] | 0) > ($i$256 | 0)) HEAP32[$162 >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($148 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $113 = HEAP32[$labelInfo + 1179664 + ($62 + -1 << 2) >> 2] | 0; + $116 = HEAP32[$labelInfo + 1179664 + (($108 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($113 | 0) > ($116 | 0)) { + HEAP16[$pnt2$363 >> 1] = $116; + if (($wk_max$158 | 0) > 0) { + $k$245 = 0; + $wk$246 = $19; + while (1) { + if ((HEAP32[$wk$246 >> 2] | 0) == ($113 | 0)) HEAP32[$wk$246 >> 2] = $116; + $k$245 = $k$245 + 1 | 0; + if (($k$245 | 0) >= ($wk_max$158 | 0)) { + $133 = $116; + break; + } else $wk$246 = $wk$246 + 4 | 0; + } + } else $133 = $116; + } else { + HEAP16[$pnt2$363 >> 1] = $113; + if (($113 | 0) < ($116 | 0) & ($wk_max$158 | 0) > 0) { + $k$342 = 0; + $wk$343 = $19; + while (1) { + if ((HEAP32[$wk$343 >> 2] | 0) == ($116 | 0)) HEAP32[$wk$343 >> 2] = $113; + $k$342 = $k$342 + 1 | 0; + if (($k$342 | 0) >= ($wk_max$158 | 0)) { + $133 = $113; + break; + } else $wk$343 = $wk$343 + 4 | 0; + } + } else $133 = $113; + } + $135 = ($133 << 16 >> 16) * 7 | 0; + $137 = $labelInfo + 1310736 + ($135 + -7 << 2) | 0; + HEAP32[$137 >> 2] = (HEAP32[$137 >> 2] | 0) + 1; + $141 = $labelInfo + 1310736 + ($135 + -6 << 2) | 0; + HEAP32[$141 >> 2] = (HEAP32[$141 >> 2] | 0) + $i$256; + $145 = $labelInfo + 1310736 + ($135 + -5 << 2) | 0; + HEAP32[$145 >> 2] = (HEAP32[$145 >> 2] | 0) + $j$069; + $wk_max$2 = $wk_max$158; + } else { + HEAP16[$pnt2$363 >> 1] = 0; + $wk_max$2 = $wk_max$158; + } while (0); + $i$256 = $i$256 + 1 | 0; + $227 = $pnt$164 + 8 | 0; + $228 = $pnt2$363 + 2 | 0; + if (($i$256 | 0) >= ($12 | 0)) { + $pnt$1$lcssa = $227; + $pnt2$3$lcssa = $228; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $pnt$164 = $227; + $pnt2$363 = $228; + $wk_max$158 = $wk_max$2; + } + } + } else { + $pnt$1$lcssa = $pnt$073; + $pnt2$3$lcssa = $pnt2$272; + $wk_max$1$lcssa = $wk_max$071; + } + $j$069 = $j$069 + 1 | 0; + if (($j$069 | 0) >= ($3 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $pnt$073 = $pnt$1$lcssa + $$sum | 0; + $pnt2$272 = $pnt2$3$lcssa + 4 | 0; + $wk_max$071 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $234 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$338 = 1; + $j$139 = 1; + $wk$440 = $19; + while (1) { + $236 = HEAP32[$wk$440 >> 2] | 0; + if (($236 | 0) == ($i$338 | 0)) { + $242 = $j$139; + $j$2 = $j$139 + 1 | 0; + } else { + $242 = HEAP32[$labelInfo + 1179664 + ($236 + -1 << 2) >> 2] | 0; + $j$2 = $j$139; + } + HEAP32[$wk$440 >> 2] = $242; + if (($i$338 | 0) < ($wk_max$0$lcssa | 0)) { + $i$338 = $i$338 + 1 | 0; + $j$139 = $j$2; + $wk$440 = $wk$440 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $246 = $labelInfo + 8 | 0; + $247 = $j$1$lcssa + -1 | 0; + HEAP32[$246 >> 2] = $247; + if (!$247) $$0 = 0; else { + _memset($234 | 0, 0, $247 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $247 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$436 = 0; + do { + $254 = $i$436 << 2; + HEAP32[$labelInfo + 131084 + ($254 << 2) >> 2] = $0; + HEAP32[$labelInfo + 131084 + (($254 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($254 | 2) << 2) >> 2] = $1; + HEAP32[$labelInfo + 131084 + (($254 | 3) << 2) >> 2] = 0; + $i$436 = $i$436 + 1 | 0; + } while (($i$436 | 0) < (HEAP32[$246 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$534 = 0; + do { + $268 = (HEAP32[$labelInfo + 1179664 + ($i$534 << 2) >> 2] | 0) + -1 | 0; + $269 = $i$534 * 7 | 0; + $272 = $labelInfo + 12 + ($268 << 2) | 0; + HEAP32[$272 >> 2] = (HEAP32[$272 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($269 << 2) >> 2] | 0); + $279 = $268 << 1; + $280 = $labelInfo + 655376 + ($279 << 3) | 0; + HEAPF64[$280 >> 3] = +HEAPF64[$280 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($269 + 1 << 2) >> 2] | 0); + $288 = $labelInfo + 655376 + (($279 | 1) << 3) | 0; + HEAPF64[$288 >> 3] = +HEAPF64[$288 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($269 + 2 << 2) >> 2] | 0); + $291 = $268 << 2; + $292 = $labelInfo + 131084 + ($291 << 2) | 0; + $296 = HEAP32[$labelInfo + 1310736 + ($269 + 3 << 2) >> 2] | 0; + if ((HEAP32[$292 >> 2] | 0) > ($296 | 0)) HEAP32[$292 >> 2] = $296; + $299 = $labelInfo + 131084 + (($291 | 1) << 2) | 0; + $303 = HEAP32[$labelInfo + 1310736 + ($269 + 4 << 2) >> 2] | 0; + if ((HEAP32[$299 >> 2] | 0) < ($303 | 0)) HEAP32[$299 >> 2] = $303; + $306 = $labelInfo + 131084 + (($291 | 2) << 2) | 0; + $310 = HEAP32[$labelInfo + 1310736 + ($269 + 5 << 2) >> 2] | 0; + if ((HEAP32[$306 >> 2] | 0) > ($310 | 0)) HEAP32[$306 >> 2] = $310; + $313 = $labelInfo + 131084 + (($291 | 3) << 2) | 0; + $317 = HEAP32[$labelInfo + 1310736 + ($269 + 6 << 2) >> 2] | 0; + if ((HEAP32[$313 >> 2] | 0) < ($317 | 0)) HEAP32[$313 >> 2] = $317; + $i$534 = $i$534 + 1 | 0; + } while (($i$534 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$246 >> 2] | 0) > 0) { + $i$633 = 0; + do { + $321 = $labelInfo + 12 + ($i$633 << 2) | 0; + $324 = $i$633 << 1; + $325 = $labelInfo + 655376 + ($324 << 3) | 0; + HEAPF64[$325 >> 3] = +HEAPF64[$325 >> 3] / +(HEAP32[$321 >> 2] | 0); + $331 = $labelInfo + 655376 + (($324 | 1) << 3) | 0; + HEAPF64[$331 >> 3] = +HEAPF64[$331 >> 3] / +(HEAP32[$321 >> 2] | 0); + $i$633 = $i$633 + 1 | 0; + } while (($i$633 | 0) < (HEAP32[$246 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubDBIA3C($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $$sum2 = 0, $0 = 0, $1 = 0, $102 = 0, $108 = 0, $11 = 0, $113 = 0, $116 = 0, $12 = 0, $133 = 0, $135 = 0, $137 = 0, $141 = 0, $145 = 0, $148 = 0, $150 = 0, $154 = 0, $158 = 0, $162 = 0, $167 = 0, $169 = 0, $173 = 0, $177 = 0, $181 = 0, $187 = 0, $19 = 0, $190 = 0, $192 = 0, $196 = 0, $2 = 0, $20 = 0, $200 = 0, $204 = 0, $207 = 0, $212 = 0, $227 = 0, $228 = 0, $234 = 0, $236 = 0, $242 = 0, $246 = 0, $247 = 0, $254 = 0, $268 = 0, $269 = 0, $272 = 0, $279 = 0, $28 = 0, $280 = 0, $288 = 0, $291 = 0, $292 = 0, $296 = 0, $299 = 0, $3 = 0, $303 = 0, $306 = 0, $310 = 0, $313 = 0, $317 = 0, $321 = 0, $324 = 0, $325 = 0, $331 = 0, $42 = 0, $45 = 0, $47 = 0, $51 = 0, $55 = 0, $61 = 0, $62 = 0, $65 = 0, $66 = 0, $67 = 0, $70 = 0, $73 = 0, $90 = 0, $92 = 0, $94 = 0, $98 = 0, $i$082 = 0, $i$176 = 0, $i$256 = 0, $i$338 = 0, $i$436 = 0, $i$534 = 0, $i$633 = 0, $j$069 = 0, $j$1$lcssa = 0, $j$139 = 0, $j$2 = 0, $k$052 = 0, $k$149 = 0, $k$245 = 0, $k$342 = 0, $pnt$073 = 0, $pnt$1$lcssa = 0, $pnt$164 = 0, $pnt1$084 = 0, $pnt1$178 = 0, $pnt2$083 = 0, $pnt2$177 = 0, $pnt2$272 = 0, $pnt2$3$lcssa = 0, $pnt2$363 = 0, $vararg_buffer = 0, $wk$053 = 0, $wk$150 = 0, $wk$246 = 0, $wk$343 = 0, $wk$440 = 0, $wk_max$0$lcssa = 0, $wk_max$071 = 0, $wk_max$1$lcssa = 0, $wk_max$158 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = ($xsize | 0) / 2 | 0; + $1 = ($ysize | 0) / 2 | 0; + $2 = HEAP32[$labelInfo >> 2] | 0; + $3 = $1 + -1 | 0; + if (($xsize | 0) > 1) { + $i$082 = 0; + $pnt1$084 = $2; + $pnt2$083 = $2 + ((Math_imul($3, $0) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$083 >> 1] = 0; + HEAP16[$pnt1$084 >> 1] = 0; + $i$082 = $i$082 + 1 | 0; + if (($i$082 | 0) >= ($0 | 0)) break; else { + $pnt1$084 = $pnt1$084 + 2 | 0; + $pnt2$083 = $pnt2$083 + 2 | 0; + } + } + } + $11 = $labelingThresh * 3 | 0; + $12 = $0 + -1 | 0; + if (($ysize | 0) > 1) { + $i$176 = 0; + $pnt1$178 = $2; + $pnt2$177 = $2 + ($12 << 1) | 0; + while (1) { + HEAP16[$pnt2$177 >> 1] = 0; + HEAP16[$pnt1$178 >> 1] = 0; + $i$176 = $i$176 + 1 | 0; + if (($i$176 | 0) >= ($1 | 0)) break; else { + $pnt1$178 = $pnt1$178 + ($0 << 1) | 0; + $pnt2$177 = $pnt2$177 + ($0 << 1) | 0; + } + } + } + $19 = $labelInfo + 1179664 | 0; + $20 = 0 - $0 | 0; + $$sum1 = 1 - $0 | 0; + $$sum2 = ~$0; + $$sum = ($xsize << 2) + 16 | 0; + L11 : do if (($3 | 0) > 1) { + $28 = ($12 | 0) > 1; + $j$069 = 1; + $pnt$073 = $image + (($xsize << 3) + 8) | 0; + $pnt2$272 = $2 + ($0 + 1 << 1) | 0; + $wk_max$071 = 0; + L13 : while (1) { + if ($28) { + $i$256 = 1; + $pnt$164 = $pnt$073; + $pnt2$363 = $pnt2$272; + $wk_max$158 = $wk_max$071; + while (1) { + do if (((HEAPU8[$pnt$164 + 2 >> 0] | 0) + (HEAPU8[$pnt$164 + 1 >> 0] | 0) + (HEAPU8[$pnt$164 + 3 >> 0] | 0) | 0) > ($11 | 0)) { + HEAP16[$pnt2$363 >> 1] = 0; + $wk_max$2 = $wk_max$158; + } else { + $42 = HEAP16[$pnt2$363 + ($20 << 1) >> 1] | 0; + if ($42 << 16 >> 16 > 0) { + HEAP16[$pnt2$363 >> 1] = $42; + $45 = ($42 << 16 >> 16) * 7 | 0; + $47 = $labelInfo + 1310736 + ($45 + -7 << 2) | 0; + HEAP32[$47 >> 2] = (HEAP32[$47 >> 2] | 0) + 1; + $51 = $labelInfo + 1310736 + ($45 + -6 << 2) | 0; + HEAP32[$51 >> 2] = (HEAP32[$51 >> 2] | 0) + $i$256; + $55 = $labelInfo + 1310736 + ($45 + -5 << 2) | 0; + HEAP32[$55 >> 2] = (HEAP32[$55 >> 2] | 0) + $j$069; + HEAP32[$labelInfo + 1310736 + ($45 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $61 = HEAP16[$pnt2$363 + ($$sum1 << 1) >> 1] | 0; + $62 = $61 << 16 >> 16; + $65 = HEAP16[$pnt2$363 + ($$sum2 << 1) >> 1] | 0; + $66 = $65 << 16 >> 16; + $67 = $65 << 16 >> 16 > 0; + if ($61 << 16 >> 16 <= 0) { + if ($67) { + HEAP16[$pnt2$363 >> 1] = $65; + $167 = $66 * 7 | 0; + $169 = $labelInfo + 1310736 + ($167 + -7 << 2) | 0; + HEAP32[$169 >> 2] = (HEAP32[$169 >> 2] | 0) + 1; + $173 = $labelInfo + 1310736 + ($167 + -6 << 2) | 0; + HEAP32[$173 >> 2] = (HEAP32[$173 >> 2] | 0) + $i$256; + $177 = $labelInfo + 1310736 + ($167 + -5 << 2) | 0; + HEAP32[$177 >> 2] = (HEAP32[$177 >> 2] | 0) + $j$069; + $181 = $labelInfo + 1310736 + ($167 + -3 << 2) | 0; + if ((HEAP32[$181 >> 2] | 0) < ($i$256 | 0)) HEAP32[$181 >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($167 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $187 = HEAP16[$pnt2$363 + -2 >> 1] | 0; + if ($187 << 16 >> 16 > 0) { + HEAP16[$pnt2$363 >> 1] = $187; + $190 = ($187 << 16 >> 16) * 7 | 0; + $192 = $labelInfo + 1310736 + ($190 + -7 << 2) | 0; + HEAP32[$192 >> 2] = (HEAP32[$192 >> 2] | 0) + 1; + $196 = $labelInfo + 1310736 + ($190 + -6 << 2) | 0; + HEAP32[$196 >> 2] = (HEAP32[$196 >> 2] | 0) + $i$256; + $200 = $labelInfo + 1310736 + ($190 + -5 << 2) | 0; + HEAP32[$200 >> 2] = (HEAP32[$200 >> 2] | 0) + $j$069; + $204 = $labelInfo + 1310736 + ($190 + -3 << 2) | 0; + if ((HEAP32[$204 >> 2] | 0) >= ($i$256 | 0)) { + $wk_max$2 = $wk_max$158; + break; + } + HEAP32[$204 >> 2] = $i$256; + $wk_max$2 = $wk_max$158; + break; + } else { + $207 = $wk_max$158 + 1 | 0; + if (($wk_max$158 | 0) > 32767) break L13; + HEAP16[$pnt2$363 >> 1] = $207; + HEAP32[$labelInfo + 1179664 + ($wk_max$158 << 2) >> 2] = $207 << 16 >> 16; + $212 = $wk_max$158 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($212 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($212 + 1 << 2) >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($212 + 2 << 2) >> 2] = $j$069; + HEAP32[$labelInfo + 1310736 + ($212 + 3 << 2) >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($212 + 4 << 2) >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($212 + 5 << 2) >> 2] = $j$069; + HEAP32[$labelInfo + 1310736 + ($212 + 6 << 2) >> 2] = $j$069; + $wk_max$2 = $207; + break; + } + } + if ($67) { + $70 = HEAP32[$labelInfo + 1179664 + ($62 + -1 << 2) >> 2] | 0; + $73 = HEAP32[$labelInfo + 1179664 + ($66 + -1 << 2) >> 2] | 0; + if (($70 | 0) > ($73 | 0)) { + HEAP16[$pnt2$363 >> 1] = $73; + if (($wk_max$158 | 0) > 0) { + $k$052 = 0; + $wk$053 = $19; + while (1) { + if ((HEAP32[$wk$053 >> 2] | 0) == ($70 | 0)) HEAP32[$wk$053 >> 2] = $73; + $k$052 = $k$052 + 1 | 0; + if (($k$052 | 0) >= ($wk_max$158 | 0)) { + $90 = $73; + break; + } else $wk$053 = $wk$053 + 4 | 0; + } + } else $90 = $73; + } else { + HEAP16[$pnt2$363 >> 1] = $70; + if (($70 | 0) < ($73 | 0) & ($wk_max$158 | 0) > 0) { + $k$149 = 0; + $wk$150 = $19; + while (1) { + if ((HEAP32[$wk$150 >> 2] | 0) == ($73 | 0)) HEAP32[$wk$150 >> 2] = $70; + $k$149 = $k$149 + 1 | 0; + if (($k$149 | 0) >= ($wk_max$158 | 0)) { + $90 = $70; + break; + } else $wk$150 = $wk$150 + 4 | 0; + } + } else $90 = $70; + } + $92 = ($90 << 16 >> 16) * 7 | 0; + $94 = $labelInfo + 1310736 + ($92 + -7 << 2) | 0; + HEAP32[$94 >> 2] = (HEAP32[$94 >> 2] | 0) + 1; + $98 = $labelInfo + 1310736 + ($92 + -6 << 2) | 0; + HEAP32[$98 >> 2] = (HEAP32[$98 >> 2] | 0) + $i$256; + $102 = $labelInfo + 1310736 + ($92 + -5 << 2) | 0; + HEAP32[$102 >> 2] = (HEAP32[$102 >> 2] | 0) + $j$069; + HEAP32[$labelInfo + 1310736 + ($92 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $108 = HEAP16[$pnt2$363 + -2 >> 1] | 0; + if ($108 << 16 >> 16 <= 0) { + HEAP16[$pnt2$363 >> 1] = $61; + $148 = $62 * 7 | 0; + $150 = $labelInfo + 1310736 + ($148 + -7 << 2) | 0; + HEAP32[$150 >> 2] = (HEAP32[$150 >> 2] | 0) + 1; + $154 = $labelInfo + 1310736 + ($148 + -6 << 2) | 0; + HEAP32[$154 >> 2] = (HEAP32[$154 >> 2] | 0) + $i$256; + $158 = $labelInfo + 1310736 + ($148 + -5 << 2) | 0; + HEAP32[$158 >> 2] = (HEAP32[$158 >> 2] | 0) + $j$069; + $162 = $labelInfo + 1310736 + ($148 + -4 << 2) | 0; + if ((HEAP32[$162 >> 2] | 0) > ($i$256 | 0)) HEAP32[$162 >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($148 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $113 = HEAP32[$labelInfo + 1179664 + ($62 + -1 << 2) >> 2] | 0; + $116 = HEAP32[$labelInfo + 1179664 + (($108 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($113 | 0) > ($116 | 0)) { + HEAP16[$pnt2$363 >> 1] = $116; + if (($wk_max$158 | 0) > 0) { + $k$245 = 0; + $wk$246 = $19; + while (1) { + if ((HEAP32[$wk$246 >> 2] | 0) == ($113 | 0)) HEAP32[$wk$246 >> 2] = $116; + $k$245 = $k$245 + 1 | 0; + if (($k$245 | 0) >= ($wk_max$158 | 0)) { + $133 = $116; + break; + } else $wk$246 = $wk$246 + 4 | 0; + } + } else $133 = $116; + } else { + HEAP16[$pnt2$363 >> 1] = $113; + if (($113 | 0) < ($116 | 0) & ($wk_max$158 | 0) > 0) { + $k$342 = 0; + $wk$343 = $19; + while (1) { + if ((HEAP32[$wk$343 >> 2] | 0) == ($116 | 0)) HEAP32[$wk$343 >> 2] = $113; + $k$342 = $k$342 + 1 | 0; + if (($k$342 | 0) >= ($wk_max$158 | 0)) { + $133 = $113; + break; + } else $wk$343 = $wk$343 + 4 | 0; + } + } else $133 = $113; + } + $135 = ($133 << 16 >> 16) * 7 | 0; + $137 = $labelInfo + 1310736 + ($135 + -7 << 2) | 0; + HEAP32[$137 >> 2] = (HEAP32[$137 >> 2] | 0) + 1; + $141 = $labelInfo + 1310736 + ($135 + -6 << 2) | 0; + HEAP32[$141 >> 2] = (HEAP32[$141 >> 2] | 0) + $i$256; + $145 = $labelInfo + 1310736 + ($135 + -5 << 2) | 0; + HEAP32[$145 >> 2] = (HEAP32[$145 >> 2] | 0) + $j$069; + $wk_max$2 = $wk_max$158; + } while (0); + $i$256 = $i$256 + 1 | 0; + $227 = $pnt$164 + 8 | 0; + $228 = $pnt2$363 + 2 | 0; + if (($i$256 | 0) >= ($12 | 0)) { + $pnt$1$lcssa = $227; + $pnt2$3$lcssa = $228; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $pnt$164 = $227; + $pnt2$363 = $228; + $wk_max$158 = $wk_max$2; + } + } + } else { + $pnt$1$lcssa = $pnt$073; + $pnt2$3$lcssa = $pnt2$272; + $wk_max$1$lcssa = $wk_max$071; + } + $j$069 = $j$069 + 1 | 0; + if (($j$069 | 0) >= ($3 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $pnt$073 = $pnt$1$lcssa + $$sum | 0; + $pnt2$272 = $pnt2$3$lcssa + 4 | 0; + $wk_max$071 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $234 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$338 = 1; + $j$139 = 1; + $wk$440 = $19; + while (1) { + $236 = HEAP32[$wk$440 >> 2] | 0; + if (($236 | 0) == ($i$338 | 0)) { + $242 = $j$139; + $j$2 = $j$139 + 1 | 0; + } else { + $242 = HEAP32[$labelInfo + 1179664 + ($236 + -1 << 2) >> 2] | 0; + $j$2 = $j$139; + } + HEAP32[$wk$440 >> 2] = $242; + if (($i$338 | 0) < ($wk_max$0$lcssa | 0)) { + $i$338 = $i$338 + 1 | 0; + $j$139 = $j$2; + $wk$440 = $wk$440 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $246 = $labelInfo + 8 | 0; + $247 = $j$1$lcssa + -1 | 0; + HEAP32[$246 >> 2] = $247; + if (!$247) $$0 = 0; else { + _memset($234 | 0, 0, $247 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $247 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$436 = 0; + do { + $254 = $i$436 << 2; + HEAP32[$labelInfo + 131084 + ($254 << 2) >> 2] = $0; + HEAP32[$labelInfo + 131084 + (($254 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($254 | 2) << 2) >> 2] = $1; + HEAP32[$labelInfo + 131084 + (($254 | 3) << 2) >> 2] = 0; + $i$436 = $i$436 + 1 | 0; + } while (($i$436 | 0) < (HEAP32[$246 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$534 = 0; + do { + $268 = (HEAP32[$labelInfo + 1179664 + ($i$534 << 2) >> 2] | 0) + -1 | 0; + $269 = $i$534 * 7 | 0; + $272 = $labelInfo + 12 + ($268 << 2) | 0; + HEAP32[$272 >> 2] = (HEAP32[$272 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($269 << 2) >> 2] | 0); + $279 = $268 << 1; + $280 = $labelInfo + 655376 + ($279 << 3) | 0; + HEAPF64[$280 >> 3] = +HEAPF64[$280 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($269 + 1 << 2) >> 2] | 0); + $288 = $labelInfo + 655376 + (($279 | 1) << 3) | 0; + HEAPF64[$288 >> 3] = +HEAPF64[$288 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($269 + 2 << 2) >> 2] | 0); + $291 = $268 << 2; + $292 = $labelInfo + 131084 + ($291 << 2) | 0; + $296 = HEAP32[$labelInfo + 1310736 + ($269 + 3 << 2) >> 2] | 0; + if ((HEAP32[$292 >> 2] | 0) > ($296 | 0)) HEAP32[$292 >> 2] = $296; + $299 = $labelInfo + 131084 + (($291 | 1) << 2) | 0; + $303 = HEAP32[$labelInfo + 1310736 + ($269 + 4 << 2) >> 2] | 0; + if ((HEAP32[$299 >> 2] | 0) < ($303 | 0)) HEAP32[$299 >> 2] = $303; + $306 = $labelInfo + 131084 + (($291 | 2) << 2) | 0; + $310 = HEAP32[$labelInfo + 1310736 + ($269 + 5 << 2) >> 2] | 0; + if ((HEAP32[$306 >> 2] | 0) > ($310 | 0)) HEAP32[$306 >> 2] = $310; + $313 = $labelInfo + 131084 + (($291 | 3) << 2) | 0; + $317 = HEAP32[$labelInfo + 1310736 + ($269 + 6 << 2) >> 2] | 0; + if ((HEAP32[$313 >> 2] | 0) < ($317 | 0)) HEAP32[$313 >> 2] = $317; + $i$534 = $i$534 + 1 | 0; + } while (($i$534 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$246 >> 2] | 0) > 0) { + $i$633 = 0; + do { + $321 = $labelInfo + 12 + ($i$633 << 2) | 0; + $324 = $i$633 << 1; + $325 = $labelInfo + 655376 + ($324 << 3) | 0; + HEAPF64[$325 >> 3] = +HEAPF64[$325 >> 3] / +(HEAP32[$321 >> 2] | 0); + $331 = $labelInfo + 655376 + (($324 | 1) << 3) | 0; + HEAPF64[$331 >> 3] = +HEAPF64[$331 >> 3] / +(HEAP32[$321 >> 2] | 0); + $i$633 = $i$633 + 1 | 0; + } while (($i$633 | 0) < (HEAP32[$246 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubDWI3CA($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $$sum2 = 0, $0 = 0, $1 = 0, $101 = 0, $107 = 0, $11 = 0, $112 = 0, $115 = 0, $12 = 0, $132 = 0, $134 = 0, $136 = 0, $140 = 0, $144 = 0, $147 = 0, $149 = 0, $153 = 0, $157 = 0, $161 = 0, $166 = 0, $168 = 0, $172 = 0, $176 = 0, $180 = 0, $186 = 0, $189 = 0, $19 = 0, $191 = 0, $195 = 0, $199 = 0, $2 = 0, $20 = 0, $203 = 0, $206 = 0, $211 = 0, $226 = 0, $227 = 0, $233 = 0, $235 = 0, $241 = 0, $245 = 0, $246 = 0, $253 = 0, $267 = 0, $268 = 0, $271 = 0, $278 = 0, $279 = 0, $28 = 0, $287 = 0, $290 = 0, $291 = 0, $295 = 0, $298 = 0, $3 = 0, $302 = 0, $305 = 0, $309 = 0, $312 = 0, $316 = 0, $320 = 0, $323 = 0, $324 = 0, $330 = 0, $41 = 0, $44 = 0, $46 = 0, $50 = 0, $54 = 0, $60 = 0, $61 = 0, $64 = 0, $65 = 0, $66 = 0, $69 = 0, $72 = 0, $89 = 0, $91 = 0, $93 = 0, $97 = 0, $i$082 = 0, $i$176 = 0, $i$256 = 0, $i$338 = 0, $i$436 = 0, $i$534 = 0, $i$633 = 0, $j$069 = 0, $j$1$lcssa = 0, $j$139 = 0, $j$2 = 0, $k$052 = 0, $k$149 = 0, $k$245 = 0, $k$342 = 0, $pnt$073 = 0, $pnt$1$lcssa = 0, $pnt$164 = 0, $pnt1$084 = 0, $pnt1$178 = 0, $pnt2$083 = 0, $pnt2$177 = 0, $pnt2$272 = 0, $pnt2$3$lcssa = 0, $pnt2$363 = 0, $vararg_buffer = 0, $wk$053 = 0, $wk$150 = 0, $wk$246 = 0, $wk$343 = 0, $wk$440 = 0, $wk_max$0$lcssa = 0, $wk_max$071 = 0, $wk_max$1$lcssa = 0, $wk_max$158 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = ($xsize | 0) / 2 | 0; + $1 = ($ysize | 0) / 2 | 0; + $2 = HEAP32[$labelInfo >> 2] | 0; + $3 = $1 + -1 | 0; + if (($xsize | 0) > 1) { + $i$082 = 0; + $pnt1$084 = $2; + $pnt2$083 = $2 + ((Math_imul($3, $0) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$083 >> 1] = 0; + HEAP16[$pnt1$084 >> 1] = 0; + $i$082 = $i$082 + 1 | 0; + if (($i$082 | 0) >= ($0 | 0)) break; else { + $pnt1$084 = $pnt1$084 + 2 | 0; + $pnt2$083 = $pnt2$083 + 2 | 0; + } + } + } + $11 = $labelingThresh * 3 | 0; + $12 = $0 + -1 | 0; + if (($ysize | 0) > 1) { + $i$176 = 0; + $pnt1$178 = $2; + $pnt2$177 = $2 + ($12 << 1) | 0; + while (1) { + HEAP16[$pnt2$177 >> 1] = 0; + HEAP16[$pnt1$178 >> 1] = 0; + $i$176 = $i$176 + 1 | 0; + if (($i$176 | 0) >= ($1 | 0)) break; else { + $pnt1$178 = $pnt1$178 + ($0 << 1) | 0; + $pnt2$177 = $pnt2$177 + ($0 << 1) | 0; + } + } + } + $19 = $labelInfo + 1179664 | 0; + $20 = 0 - $0 | 0; + $$sum1 = 1 - $0 | 0; + $$sum2 = ~$0; + $$sum = ($xsize << 2) + 16 | 0; + L11 : do if (($3 | 0) > 1) { + $28 = ($12 | 0) > 1; + $j$069 = 1; + $pnt$073 = $image + (($xsize << 3) + 8) | 0; + $pnt2$272 = $2 + ($0 + 1 << 1) | 0; + $wk_max$071 = 0; + L13 : while (1) { + if ($28) { + $i$256 = 1; + $pnt$164 = $pnt$073; + $pnt2$363 = $pnt2$272; + $wk_max$158 = $wk_max$071; + while (1) { + do if (((HEAPU8[$pnt$164 + 1 >> 0] | 0) + (HEAPU8[$pnt$164 >> 0] | 0) + (HEAPU8[$pnt$164 + 2 >> 0] | 0) | 0) > ($11 | 0)) { + $41 = HEAP16[$pnt2$363 + ($20 << 1) >> 1] | 0; + if ($41 << 16 >> 16 > 0) { + HEAP16[$pnt2$363 >> 1] = $41; + $44 = ($41 << 16 >> 16) * 7 | 0; + $46 = $labelInfo + 1310736 + ($44 + -7 << 2) | 0; + HEAP32[$46 >> 2] = (HEAP32[$46 >> 2] | 0) + 1; + $50 = $labelInfo + 1310736 + ($44 + -6 << 2) | 0; + HEAP32[$50 >> 2] = (HEAP32[$50 >> 2] | 0) + $i$256; + $54 = $labelInfo + 1310736 + ($44 + -5 << 2) | 0; + HEAP32[$54 >> 2] = (HEAP32[$54 >> 2] | 0) + $j$069; + HEAP32[$labelInfo + 1310736 + ($44 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $60 = HEAP16[$pnt2$363 + ($$sum1 << 1) >> 1] | 0; + $61 = $60 << 16 >> 16; + $64 = HEAP16[$pnt2$363 + ($$sum2 << 1) >> 1] | 0; + $65 = $64 << 16 >> 16; + $66 = $64 << 16 >> 16 > 0; + if ($60 << 16 >> 16 <= 0) { + if ($66) { + HEAP16[$pnt2$363 >> 1] = $64; + $166 = $65 * 7 | 0; + $168 = $labelInfo + 1310736 + ($166 + -7 << 2) | 0; + HEAP32[$168 >> 2] = (HEAP32[$168 >> 2] | 0) + 1; + $172 = $labelInfo + 1310736 + ($166 + -6 << 2) | 0; + HEAP32[$172 >> 2] = (HEAP32[$172 >> 2] | 0) + $i$256; + $176 = $labelInfo + 1310736 + ($166 + -5 << 2) | 0; + HEAP32[$176 >> 2] = (HEAP32[$176 >> 2] | 0) + $j$069; + $180 = $labelInfo + 1310736 + ($166 + -3 << 2) | 0; + if ((HEAP32[$180 >> 2] | 0) < ($i$256 | 0)) HEAP32[$180 >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($166 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $186 = HEAP16[$pnt2$363 + -2 >> 1] | 0; + if ($186 << 16 >> 16 > 0) { + HEAP16[$pnt2$363 >> 1] = $186; + $189 = ($186 << 16 >> 16) * 7 | 0; + $191 = $labelInfo + 1310736 + ($189 + -7 << 2) | 0; + HEAP32[$191 >> 2] = (HEAP32[$191 >> 2] | 0) + 1; + $195 = $labelInfo + 1310736 + ($189 + -6 << 2) | 0; + HEAP32[$195 >> 2] = (HEAP32[$195 >> 2] | 0) + $i$256; + $199 = $labelInfo + 1310736 + ($189 + -5 << 2) | 0; + HEAP32[$199 >> 2] = (HEAP32[$199 >> 2] | 0) + $j$069; + $203 = $labelInfo + 1310736 + ($189 + -3 << 2) | 0; + if ((HEAP32[$203 >> 2] | 0) >= ($i$256 | 0)) { + $wk_max$2 = $wk_max$158; + break; + } + HEAP32[$203 >> 2] = $i$256; + $wk_max$2 = $wk_max$158; + break; + } else { + $206 = $wk_max$158 + 1 | 0; + if (($wk_max$158 | 0) > 32767) break L13; + HEAP16[$pnt2$363 >> 1] = $206; + HEAP32[$labelInfo + 1179664 + ($wk_max$158 << 2) >> 2] = $206 << 16 >> 16; + $211 = $wk_max$158 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($211 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($211 + 1 << 2) >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($211 + 2 << 2) >> 2] = $j$069; + HEAP32[$labelInfo + 1310736 + ($211 + 3 << 2) >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($211 + 4 << 2) >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($211 + 5 << 2) >> 2] = $j$069; + HEAP32[$labelInfo + 1310736 + ($211 + 6 << 2) >> 2] = $j$069; + $wk_max$2 = $206; + break; + } + } + if ($66) { + $69 = HEAP32[$labelInfo + 1179664 + ($61 + -1 << 2) >> 2] | 0; + $72 = HEAP32[$labelInfo + 1179664 + ($65 + -1 << 2) >> 2] | 0; + if (($69 | 0) > ($72 | 0)) { + HEAP16[$pnt2$363 >> 1] = $72; + if (($wk_max$158 | 0) > 0) { + $k$052 = 0; + $wk$053 = $19; + while (1) { + if ((HEAP32[$wk$053 >> 2] | 0) == ($69 | 0)) HEAP32[$wk$053 >> 2] = $72; + $k$052 = $k$052 + 1 | 0; + if (($k$052 | 0) >= ($wk_max$158 | 0)) { + $89 = $72; + break; + } else $wk$053 = $wk$053 + 4 | 0; + } + } else $89 = $72; + } else { + HEAP16[$pnt2$363 >> 1] = $69; + if (($69 | 0) < ($72 | 0) & ($wk_max$158 | 0) > 0) { + $k$149 = 0; + $wk$150 = $19; + while (1) { + if ((HEAP32[$wk$150 >> 2] | 0) == ($72 | 0)) HEAP32[$wk$150 >> 2] = $69; + $k$149 = $k$149 + 1 | 0; + if (($k$149 | 0) >= ($wk_max$158 | 0)) { + $89 = $69; + break; + } else $wk$150 = $wk$150 + 4 | 0; + } + } else $89 = $69; + } + $91 = ($89 << 16 >> 16) * 7 | 0; + $93 = $labelInfo + 1310736 + ($91 + -7 << 2) | 0; + HEAP32[$93 >> 2] = (HEAP32[$93 >> 2] | 0) + 1; + $97 = $labelInfo + 1310736 + ($91 + -6 << 2) | 0; + HEAP32[$97 >> 2] = (HEAP32[$97 >> 2] | 0) + $i$256; + $101 = $labelInfo + 1310736 + ($91 + -5 << 2) | 0; + HEAP32[$101 >> 2] = (HEAP32[$101 >> 2] | 0) + $j$069; + HEAP32[$labelInfo + 1310736 + ($91 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $107 = HEAP16[$pnt2$363 + -2 >> 1] | 0; + if ($107 << 16 >> 16 <= 0) { + HEAP16[$pnt2$363 >> 1] = $60; + $147 = $61 * 7 | 0; + $149 = $labelInfo + 1310736 + ($147 + -7 << 2) | 0; + HEAP32[$149 >> 2] = (HEAP32[$149 >> 2] | 0) + 1; + $153 = $labelInfo + 1310736 + ($147 + -6 << 2) | 0; + HEAP32[$153 >> 2] = (HEAP32[$153 >> 2] | 0) + $i$256; + $157 = $labelInfo + 1310736 + ($147 + -5 << 2) | 0; + HEAP32[$157 >> 2] = (HEAP32[$157 >> 2] | 0) + $j$069; + $161 = $labelInfo + 1310736 + ($147 + -4 << 2) | 0; + if ((HEAP32[$161 >> 2] | 0) > ($i$256 | 0)) HEAP32[$161 >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($147 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $112 = HEAP32[$labelInfo + 1179664 + ($61 + -1 << 2) >> 2] | 0; + $115 = HEAP32[$labelInfo + 1179664 + (($107 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($112 | 0) > ($115 | 0)) { + HEAP16[$pnt2$363 >> 1] = $115; + if (($wk_max$158 | 0) > 0) { + $k$245 = 0; + $wk$246 = $19; + while (1) { + if ((HEAP32[$wk$246 >> 2] | 0) == ($112 | 0)) HEAP32[$wk$246 >> 2] = $115; + $k$245 = $k$245 + 1 | 0; + if (($k$245 | 0) >= ($wk_max$158 | 0)) { + $132 = $115; + break; + } else $wk$246 = $wk$246 + 4 | 0; + } + } else $132 = $115; + } else { + HEAP16[$pnt2$363 >> 1] = $112; + if (($112 | 0) < ($115 | 0) & ($wk_max$158 | 0) > 0) { + $k$342 = 0; + $wk$343 = $19; + while (1) { + if ((HEAP32[$wk$343 >> 2] | 0) == ($115 | 0)) HEAP32[$wk$343 >> 2] = $112; + $k$342 = $k$342 + 1 | 0; + if (($k$342 | 0) >= ($wk_max$158 | 0)) { + $132 = $112; + break; + } else $wk$343 = $wk$343 + 4 | 0; + } + } else $132 = $112; + } + $134 = ($132 << 16 >> 16) * 7 | 0; + $136 = $labelInfo + 1310736 + ($134 + -7 << 2) | 0; + HEAP32[$136 >> 2] = (HEAP32[$136 >> 2] | 0) + 1; + $140 = $labelInfo + 1310736 + ($134 + -6 << 2) | 0; + HEAP32[$140 >> 2] = (HEAP32[$140 >> 2] | 0) + $i$256; + $144 = $labelInfo + 1310736 + ($134 + -5 << 2) | 0; + HEAP32[$144 >> 2] = (HEAP32[$144 >> 2] | 0) + $j$069; + $wk_max$2 = $wk_max$158; + } else { + HEAP16[$pnt2$363 >> 1] = 0; + $wk_max$2 = $wk_max$158; + } while (0); + $i$256 = $i$256 + 1 | 0; + $226 = $pnt$164 + 8 | 0; + $227 = $pnt2$363 + 2 | 0; + if (($i$256 | 0) >= ($12 | 0)) { + $pnt$1$lcssa = $226; + $pnt2$3$lcssa = $227; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $pnt$164 = $226; + $pnt2$363 = $227; + $wk_max$158 = $wk_max$2; + } + } + } else { + $pnt$1$lcssa = $pnt$073; + $pnt2$3$lcssa = $pnt2$272; + $wk_max$1$lcssa = $wk_max$071; + } + $j$069 = $j$069 + 1 | 0; + if (($j$069 | 0) >= ($3 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $pnt$073 = $pnt$1$lcssa + $$sum | 0; + $pnt2$272 = $pnt2$3$lcssa + 4 | 0; + $wk_max$071 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $233 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$338 = 1; + $j$139 = 1; + $wk$440 = $19; + while (1) { + $235 = HEAP32[$wk$440 >> 2] | 0; + if (($235 | 0) == ($i$338 | 0)) { + $241 = $j$139; + $j$2 = $j$139 + 1 | 0; + } else { + $241 = HEAP32[$labelInfo + 1179664 + ($235 + -1 << 2) >> 2] | 0; + $j$2 = $j$139; + } + HEAP32[$wk$440 >> 2] = $241; + if (($i$338 | 0) < ($wk_max$0$lcssa | 0)) { + $i$338 = $i$338 + 1 | 0; + $j$139 = $j$2; + $wk$440 = $wk$440 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $245 = $labelInfo + 8 | 0; + $246 = $j$1$lcssa + -1 | 0; + HEAP32[$245 >> 2] = $246; + if (!$246) $$0 = 0; else { + _memset($233 | 0, 0, $246 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $246 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$436 = 0; + do { + $253 = $i$436 << 2; + HEAP32[$labelInfo + 131084 + ($253 << 2) >> 2] = $0; + HEAP32[$labelInfo + 131084 + (($253 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($253 | 2) << 2) >> 2] = $1; + HEAP32[$labelInfo + 131084 + (($253 | 3) << 2) >> 2] = 0; + $i$436 = $i$436 + 1 | 0; + } while (($i$436 | 0) < (HEAP32[$245 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$534 = 0; + do { + $267 = (HEAP32[$labelInfo + 1179664 + ($i$534 << 2) >> 2] | 0) + -1 | 0; + $268 = $i$534 * 7 | 0; + $271 = $labelInfo + 12 + ($267 << 2) | 0; + HEAP32[$271 >> 2] = (HEAP32[$271 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($268 << 2) >> 2] | 0); + $278 = $267 << 1; + $279 = $labelInfo + 655376 + ($278 << 3) | 0; + HEAPF64[$279 >> 3] = +HEAPF64[$279 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($268 + 1 << 2) >> 2] | 0); + $287 = $labelInfo + 655376 + (($278 | 1) << 3) | 0; + HEAPF64[$287 >> 3] = +HEAPF64[$287 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($268 + 2 << 2) >> 2] | 0); + $290 = $267 << 2; + $291 = $labelInfo + 131084 + ($290 << 2) | 0; + $295 = HEAP32[$labelInfo + 1310736 + ($268 + 3 << 2) >> 2] | 0; + if ((HEAP32[$291 >> 2] | 0) > ($295 | 0)) HEAP32[$291 >> 2] = $295; + $298 = $labelInfo + 131084 + (($290 | 1) << 2) | 0; + $302 = HEAP32[$labelInfo + 1310736 + ($268 + 4 << 2) >> 2] | 0; + if ((HEAP32[$298 >> 2] | 0) < ($302 | 0)) HEAP32[$298 >> 2] = $302; + $305 = $labelInfo + 131084 + (($290 | 2) << 2) | 0; + $309 = HEAP32[$labelInfo + 1310736 + ($268 + 5 << 2) >> 2] | 0; + if ((HEAP32[$305 >> 2] | 0) > ($309 | 0)) HEAP32[$305 >> 2] = $309; + $312 = $labelInfo + 131084 + (($290 | 3) << 2) | 0; + $316 = HEAP32[$labelInfo + 1310736 + ($268 + 6 << 2) >> 2] | 0; + if ((HEAP32[$312 >> 2] | 0) < ($316 | 0)) HEAP32[$312 >> 2] = $316; + $i$534 = $i$534 + 1 | 0; + } while (($i$534 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$245 >> 2] | 0) > 0) { + $i$633 = 0; + do { + $320 = $labelInfo + 12 + ($i$633 << 2) | 0; + $323 = $i$633 << 1; + $324 = $labelInfo + 655376 + ($323 << 3) | 0; + HEAPF64[$324 >> 3] = +HEAPF64[$324 >> 3] / +(HEAP32[$320 >> 2] | 0); + $330 = $labelInfo + 655376 + (($323 | 1) << 3) | 0; + HEAPF64[$330 >> 3] = +HEAPF64[$330 >> 3] / +(HEAP32[$320 >> 2] | 0); + $i$633 = $i$633 + 1 | 0; + } while (($i$633 | 0) < (HEAP32[$245 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubDBI3CA($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $$sum2 = 0, $0 = 0, $1 = 0, $101 = 0, $107 = 0, $11 = 0, $112 = 0, $115 = 0, $12 = 0, $132 = 0, $134 = 0, $136 = 0, $140 = 0, $144 = 0, $147 = 0, $149 = 0, $153 = 0, $157 = 0, $161 = 0, $166 = 0, $168 = 0, $172 = 0, $176 = 0, $180 = 0, $186 = 0, $189 = 0, $19 = 0, $191 = 0, $195 = 0, $199 = 0, $2 = 0, $20 = 0, $203 = 0, $206 = 0, $211 = 0, $226 = 0, $227 = 0, $233 = 0, $235 = 0, $241 = 0, $245 = 0, $246 = 0, $253 = 0, $267 = 0, $268 = 0, $271 = 0, $278 = 0, $279 = 0, $28 = 0, $287 = 0, $290 = 0, $291 = 0, $295 = 0, $298 = 0, $3 = 0, $302 = 0, $305 = 0, $309 = 0, $312 = 0, $316 = 0, $320 = 0, $323 = 0, $324 = 0, $330 = 0, $41 = 0, $44 = 0, $46 = 0, $50 = 0, $54 = 0, $60 = 0, $61 = 0, $64 = 0, $65 = 0, $66 = 0, $69 = 0, $72 = 0, $89 = 0, $91 = 0, $93 = 0, $97 = 0, $i$082 = 0, $i$176 = 0, $i$256 = 0, $i$338 = 0, $i$436 = 0, $i$534 = 0, $i$633 = 0, $j$069 = 0, $j$1$lcssa = 0, $j$139 = 0, $j$2 = 0, $k$052 = 0, $k$149 = 0, $k$245 = 0, $k$342 = 0, $pnt$073 = 0, $pnt$1$lcssa = 0, $pnt$164 = 0, $pnt1$084 = 0, $pnt1$178 = 0, $pnt2$083 = 0, $pnt2$177 = 0, $pnt2$272 = 0, $pnt2$3$lcssa = 0, $pnt2$363 = 0, $vararg_buffer = 0, $wk$053 = 0, $wk$150 = 0, $wk$246 = 0, $wk$343 = 0, $wk$440 = 0, $wk_max$0$lcssa = 0, $wk_max$071 = 0, $wk_max$1$lcssa = 0, $wk_max$158 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = ($xsize | 0) / 2 | 0; + $1 = ($ysize | 0) / 2 | 0; + $2 = HEAP32[$labelInfo >> 2] | 0; + $3 = $1 + -1 | 0; + if (($xsize | 0) > 1) { + $i$082 = 0; + $pnt1$084 = $2; + $pnt2$083 = $2 + ((Math_imul($3, $0) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$083 >> 1] = 0; + HEAP16[$pnt1$084 >> 1] = 0; + $i$082 = $i$082 + 1 | 0; + if (($i$082 | 0) >= ($0 | 0)) break; else { + $pnt1$084 = $pnt1$084 + 2 | 0; + $pnt2$083 = $pnt2$083 + 2 | 0; + } + } + } + $11 = $labelingThresh * 3 | 0; + $12 = $0 + -1 | 0; + if (($ysize | 0) > 1) { + $i$176 = 0; + $pnt1$178 = $2; + $pnt2$177 = $2 + ($12 << 1) | 0; + while (1) { + HEAP16[$pnt2$177 >> 1] = 0; + HEAP16[$pnt1$178 >> 1] = 0; + $i$176 = $i$176 + 1 | 0; + if (($i$176 | 0) >= ($1 | 0)) break; else { + $pnt1$178 = $pnt1$178 + ($0 << 1) | 0; + $pnt2$177 = $pnt2$177 + ($0 << 1) | 0; + } + } + } + $19 = $labelInfo + 1179664 | 0; + $20 = 0 - $0 | 0; + $$sum1 = 1 - $0 | 0; + $$sum2 = ~$0; + $$sum = ($xsize << 2) + 16 | 0; + L11 : do if (($3 | 0) > 1) { + $28 = ($12 | 0) > 1; + $j$069 = 1; + $pnt$073 = $image + (($xsize << 3) + 8) | 0; + $pnt2$272 = $2 + ($0 + 1 << 1) | 0; + $wk_max$071 = 0; + L13 : while (1) { + if ($28) { + $i$256 = 1; + $pnt$164 = $pnt$073; + $pnt2$363 = $pnt2$272; + $wk_max$158 = $wk_max$071; + while (1) { + do if (((HEAPU8[$pnt$164 + 1 >> 0] | 0) + (HEAPU8[$pnt$164 >> 0] | 0) + (HEAPU8[$pnt$164 + 2 >> 0] | 0) | 0) > ($11 | 0)) { + HEAP16[$pnt2$363 >> 1] = 0; + $wk_max$2 = $wk_max$158; + } else { + $41 = HEAP16[$pnt2$363 + ($20 << 1) >> 1] | 0; + if ($41 << 16 >> 16 > 0) { + HEAP16[$pnt2$363 >> 1] = $41; + $44 = ($41 << 16 >> 16) * 7 | 0; + $46 = $labelInfo + 1310736 + ($44 + -7 << 2) | 0; + HEAP32[$46 >> 2] = (HEAP32[$46 >> 2] | 0) + 1; + $50 = $labelInfo + 1310736 + ($44 + -6 << 2) | 0; + HEAP32[$50 >> 2] = (HEAP32[$50 >> 2] | 0) + $i$256; + $54 = $labelInfo + 1310736 + ($44 + -5 << 2) | 0; + HEAP32[$54 >> 2] = (HEAP32[$54 >> 2] | 0) + $j$069; + HEAP32[$labelInfo + 1310736 + ($44 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $60 = HEAP16[$pnt2$363 + ($$sum1 << 1) >> 1] | 0; + $61 = $60 << 16 >> 16; + $64 = HEAP16[$pnt2$363 + ($$sum2 << 1) >> 1] | 0; + $65 = $64 << 16 >> 16; + $66 = $64 << 16 >> 16 > 0; + if ($60 << 16 >> 16 <= 0) { + if ($66) { + HEAP16[$pnt2$363 >> 1] = $64; + $166 = $65 * 7 | 0; + $168 = $labelInfo + 1310736 + ($166 + -7 << 2) | 0; + HEAP32[$168 >> 2] = (HEAP32[$168 >> 2] | 0) + 1; + $172 = $labelInfo + 1310736 + ($166 + -6 << 2) | 0; + HEAP32[$172 >> 2] = (HEAP32[$172 >> 2] | 0) + $i$256; + $176 = $labelInfo + 1310736 + ($166 + -5 << 2) | 0; + HEAP32[$176 >> 2] = (HEAP32[$176 >> 2] | 0) + $j$069; + $180 = $labelInfo + 1310736 + ($166 + -3 << 2) | 0; + if ((HEAP32[$180 >> 2] | 0) < ($i$256 | 0)) HEAP32[$180 >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($166 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $186 = HEAP16[$pnt2$363 + -2 >> 1] | 0; + if ($186 << 16 >> 16 > 0) { + HEAP16[$pnt2$363 >> 1] = $186; + $189 = ($186 << 16 >> 16) * 7 | 0; + $191 = $labelInfo + 1310736 + ($189 + -7 << 2) | 0; + HEAP32[$191 >> 2] = (HEAP32[$191 >> 2] | 0) + 1; + $195 = $labelInfo + 1310736 + ($189 + -6 << 2) | 0; + HEAP32[$195 >> 2] = (HEAP32[$195 >> 2] | 0) + $i$256; + $199 = $labelInfo + 1310736 + ($189 + -5 << 2) | 0; + HEAP32[$199 >> 2] = (HEAP32[$199 >> 2] | 0) + $j$069; + $203 = $labelInfo + 1310736 + ($189 + -3 << 2) | 0; + if ((HEAP32[$203 >> 2] | 0) >= ($i$256 | 0)) { + $wk_max$2 = $wk_max$158; + break; + } + HEAP32[$203 >> 2] = $i$256; + $wk_max$2 = $wk_max$158; + break; + } else { + $206 = $wk_max$158 + 1 | 0; + if (($wk_max$158 | 0) > 32767) break L13; + HEAP16[$pnt2$363 >> 1] = $206; + HEAP32[$labelInfo + 1179664 + ($wk_max$158 << 2) >> 2] = $206 << 16 >> 16; + $211 = $wk_max$158 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($211 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($211 + 1 << 2) >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($211 + 2 << 2) >> 2] = $j$069; + HEAP32[$labelInfo + 1310736 + ($211 + 3 << 2) >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($211 + 4 << 2) >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($211 + 5 << 2) >> 2] = $j$069; + HEAP32[$labelInfo + 1310736 + ($211 + 6 << 2) >> 2] = $j$069; + $wk_max$2 = $206; + break; + } + } + if ($66) { + $69 = HEAP32[$labelInfo + 1179664 + ($61 + -1 << 2) >> 2] | 0; + $72 = HEAP32[$labelInfo + 1179664 + ($65 + -1 << 2) >> 2] | 0; + if (($69 | 0) > ($72 | 0)) { + HEAP16[$pnt2$363 >> 1] = $72; + if (($wk_max$158 | 0) > 0) { + $k$052 = 0; + $wk$053 = $19; + while (1) { + if ((HEAP32[$wk$053 >> 2] | 0) == ($69 | 0)) HEAP32[$wk$053 >> 2] = $72; + $k$052 = $k$052 + 1 | 0; + if (($k$052 | 0) >= ($wk_max$158 | 0)) { + $89 = $72; + break; + } else $wk$053 = $wk$053 + 4 | 0; + } + } else $89 = $72; + } else { + HEAP16[$pnt2$363 >> 1] = $69; + if (($69 | 0) < ($72 | 0) & ($wk_max$158 | 0) > 0) { + $k$149 = 0; + $wk$150 = $19; + while (1) { + if ((HEAP32[$wk$150 >> 2] | 0) == ($72 | 0)) HEAP32[$wk$150 >> 2] = $69; + $k$149 = $k$149 + 1 | 0; + if (($k$149 | 0) >= ($wk_max$158 | 0)) { + $89 = $69; + break; + } else $wk$150 = $wk$150 + 4 | 0; + } + } else $89 = $69; + } + $91 = ($89 << 16 >> 16) * 7 | 0; + $93 = $labelInfo + 1310736 + ($91 + -7 << 2) | 0; + HEAP32[$93 >> 2] = (HEAP32[$93 >> 2] | 0) + 1; + $97 = $labelInfo + 1310736 + ($91 + -6 << 2) | 0; + HEAP32[$97 >> 2] = (HEAP32[$97 >> 2] | 0) + $i$256; + $101 = $labelInfo + 1310736 + ($91 + -5 << 2) | 0; + HEAP32[$101 >> 2] = (HEAP32[$101 >> 2] | 0) + $j$069; + HEAP32[$labelInfo + 1310736 + ($91 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $107 = HEAP16[$pnt2$363 + -2 >> 1] | 0; + if ($107 << 16 >> 16 <= 0) { + HEAP16[$pnt2$363 >> 1] = $60; + $147 = $61 * 7 | 0; + $149 = $labelInfo + 1310736 + ($147 + -7 << 2) | 0; + HEAP32[$149 >> 2] = (HEAP32[$149 >> 2] | 0) + 1; + $153 = $labelInfo + 1310736 + ($147 + -6 << 2) | 0; + HEAP32[$153 >> 2] = (HEAP32[$153 >> 2] | 0) + $i$256; + $157 = $labelInfo + 1310736 + ($147 + -5 << 2) | 0; + HEAP32[$157 >> 2] = (HEAP32[$157 >> 2] | 0) + $j$069; + $161 = $labelInfo + 1310736 + ($147 + -4 << 2) | 0; + if ((HEAP32[$161 >> 2] | 0) > ($i$256 | 0)) HEAP32[$161 >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($147 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $112 = HEAP32[$labelInfo + 1179664 + ($61 + -1 << 2) >> 2] | 0; + $115 = HEAP32[$labelInfo + 1179664 + (($107 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($112 | 0) > ($115 | 0)) { + HEAP16[$pnt2$363 >> 1] = $115; + if (($wk_max$158 | 0) > 0) { + $k$245 = 0; + $wk$246 = $19; + while (1) { + if ((HEAP32[$wk$246 >> 2] | 0) == ($112 | 0)) HEAP32[$wk$246 >> 2] = $115; + $k$245 = $k$245 + 1 | 0; + if (($k$245 | 0) >= ($wk_max$158 | 0)) { + $132 = $115; + break; + } else $wk$246 = $wk$246 + 4 | 0; + } + } else $132 = $115; + } else { + HEAP16[$pnt2$363 >> 1] = $112; + if (($112 | 0) < ($115 | 0) & ($wk_max$158 | 0) > 0) { + $k$342 = 0; + $wk$343 = $19; + while (1) { + if ((HEAP32[$wk$343 >> 2] | 0) == ($115 | 0)) HEAP32[$wk$343 >> 2] = $112; + $k$342 = $k$342 + 1 | 0; + if (($k$342 | 0) >= ($wk_max$158 | 0)) { + $132 = $112; + break; + } else $wk$343 = $wk$343 + 4 | 0; + } + } else $132 = $112; + } + $134 = ($132 << 16 >> 16) * 7 | 0; + $136 = $labelInfo + 1310736 + ($134 + -7 << 2) | 0; + HEAP32[$136 >> 2] = (HEAP32[$136 >> 2] | 0) + 1; + $140 = $labelInfo + 1310736 + ($134 + -6 << 2) | 0; + HEAP32[$140 >> 2] = (HEAP32[$140 >> 2] | 0) + $i$256; + $144 = $labelInfo + 1310736 + ($134 + -5 << 2) | 0; + HEAP32[$144 >> 2] = (HEAP32[$144 >> 2] | 0) + $j$069; + $wk_max$2 = $wk_max$158; + } while (0); + $i$256 = $i$256 + 1 | 0; + $226 = $pnt$164 + 8 | 0; + $227 = $pnt2$363 + 2 | 0; + if (($i$256 | 0) >= ($12 | 0)) { + $pnt$1$lcssa = $226; + $pnt2$3$lcssa = $227; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $pnt$164 = $226; + $pnt2$363 = $227; + $wk_max$158 = $wk_max$2; + } + } + } else { + $pnt$1$lcssa = $pnt$073; + $pnt2$3$lcssa = $pnt2$272; + $wk_max$1$lcssa = $wk_max$071; + } + $j$069 = $j$069 + 1 | 0; + if (($j$069 | 0) >= ($3 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $pnt$073 = $pnt$1$lcssa + $$sum | 0; + $pnt2$272 = $pnt2$3$lcssa + 4 | 0; + $wk_max$071 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $233 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$338 = 1; + $j$139 = 1; + $wk$440 = $19; + while (1) { + $235 = HEAP32[$wk$440 >> 2] | 0; + if (($235 | 0) == ($i$338 | 0)) { + $241 = $j$139; + $j$2 = $j$139 + 1 | 0; + } else { + $241 = HEAP32[$labelInfo + 1179664 + ($235 + -1 << 2) >> 2] | 0; + $j$2 = $j$139; + } + HEAP32[$wk$440 >> 2] = $241; + if (($i$338 | 0) < ($wk_max$0$lcssa | 0)) { + $i$338 = $i$338 + 1 | 0; + $j$139 = $j$2; + $wk$440 = $wk$440 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $245 = $labelInfo + 8 | 0; + $246 = $j$1$lcssa + -1 | 0; + HEAP32[$245 >> 2] = $246; + if (!$246) $$0 = 0; else { + _memset($233 | 0, 0, $246 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $246 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$436 = 0; + do { + $253 = $i$436 << 2; + HEAP32[$labelInfo + 131084 + ($253 << 2) >> 2] = $0; + HEAP32[$labelInfo + 131084 + (($253 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($253 | 2) << 2) >> 2] = $1; + HEAP32[$labelInfo + 131084 + (($253 | 3) << 2) >> 2] = 0; + $i$436 = $i$436 + 1 | 0; + } while (($i$436 | 0) < (HEAP32[$245 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$534 = 0; + do { + $267 = (HEAP32[$labelInfo + 1179664 + ($i$534 << 2) >> 2] | 0) + -1 | 0; + $268 = $i$534 * 7 | 0; + $271 = $labelInfo + 12 + ($267 << 2) | 0; + HEAP32[$271 >> 2] = (HEAP32[$271 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($268 << 2) >> 2] | 0); + $278 = $267 << 1; + $279 = $labelInfo + 655376 + ($278 << 3) | 0; + HEAPF64[$279 >> 3] = +HEAPF64[$279 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($268 + 1 << 2) >> 2] | 0); + $287 = $labelInfo + 655376 + (($278 | 1) << 3) | 0; + HEAPF64[$287 >> 3] = +HEAPF64[$287 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($268 + 2 << 2) >> 2] | 0); + $290 = $267 << 2; + $291 = $labelInfo + 131084 + ($290 << 2) | 0; + $295 = HEAP32[$labelInfo + 1310736 + ($268 + 3 << 2) >> 2] | 0; + if ((HEAP32[$291 >> 2] | 0) > ($295 | 0)) HEAP32[$291 >> 2] = $295; + $298 = $labelInfo + 131084 + (($290 | 1) << 2) | 0; + $302 = HEAP32[$labelInfo + 1310736 + ($268 + 4 << 2) >> 2] | 0; + if ((HEAP32[$298 >> 2] | 0) < ($302 | 0)) HEAP32[$298 >> 2] = $302; + $305 = $labelInfo + 131084 + (($290 | 2) << 2) | 0; + $309 = HEAP32[$labelInfo + 1310736 + ($268 + 5 << 2) >> 2] | 0; + if ((HEAP32[$305 >> 2] | 0) > ($309 | 0)) HEAP32[$305 >> 2] = $309; + $312 = $labelInfo + 131084 + (($290 | 3) << 2) | 0; + $316 = HEAP32[$labelInfo + 1310736 + ($268 + 6 << 2) >> 2] | 0; + if ((HEAP32[$312 >> 2] | 0) < ($316 | 0)) HEAP32[$312 >> 2] = $316; + $i$534 = $i$534 + 1 | 0; + } while (($i$534 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$245 >> 2] | 0) > 0) { + $i$633 = 0; + do { + $320 = $labelInfo + 12 + ($i$633 << 2) | 0; + $323 = $i$633 << 1; + $324 = $labelInfo + 655376 + ($323 << 3) | 0; + HEAPF64[$324 >> 3] = +HEAPF64[$324 >> 3] / +(HEAP32[$320 >> 2] | 0); + $330 = $labelInfo + 655376 + (($323 | 1) << 3) | 0; + HEAPF64[$330 >> 3] = +HEAPF64[$330 >> 3] / +(HEAP32[$320 >> 2] | 0); + $i$633 = $i$633 + 1 | 0; + } while (($i$633 | 0) < (HEAP32[$245 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubDWR3CA4444($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $0 = 0, $1 = 0, $10 = 0, $105 = 0, $110 = 0, $113 = 0, $130 = 0, $132 = 0, $134 = 0, $138 = 0, $142 = 0, $145 = 0, $147 = 0, $151 = 0, $155 = 0, $159 = 0, $164 = 0, $166 = 0, $17 = 0, $170 = 0, $174 = 0, $178 = 0, $18 = 0, $184 = 0, $187 = 0, $189 = 0, $19 = 0, $193 = 0, $197 = 0, $201 = 0, $204 = 0, $209 = 0, $224 = 0, $225 = 0, $231 = 0, $233 = 0, $239 = 0, $24 = 0, $243 = 0, $244 = 0, $251 = 0, $26 = 0, $265 = 0, $266 = 0, $269 = 0, $276 = 0, $277 = 0, $285 = 0, $288 = 0, $289 = 0, $293 = 0, $296 = 0, $300 = 0, $303 = 0, $307 = 0, $310 = 0, $314 = 0, $318 = 0, $321 = 0, $322 = 0, $328 = 0, $39 = 0, $42 = 0, $44 = 0, $48 = 0, $52 = 0, $58 = 0, $59 = 0, $62 = 0, $63 = 0, $64 = 0, $67 = 0, $70 = 0, $87 = 0, $89 = 0, $9 = 0, $91 = 0, $95 = 0, $99 = 0, $i$081 = 0, $i$175 = 0, $i$255 = 0, $i$337 = 0, $i$435 = 0, $i$533 = 0, $i$632 = 0, $j$068 = 0, $j$1$lcssa = 0, $j$138 = 0, $j$2 = 0, $k$051 = 0, $k$148 = 0, $k$244 = 0, $k$341 = 0, $pnt$072 = 0, $pnt$1$lcssa = 0, $pnt$163 = 0, $pnt1$083 = 0, $pnt1$177 = 0, $pnt2$082 = 0, $pnt2$176 = 0, $pnt2$271 = 0, $pnt2$3$lcssa = 0, $pnt2$362 = 0, $vararg_buffer = 0, $wk$052 = 0, $wk$149 = 0, $wk$245 = 0, $wk$342 = 0, $wk$439 = 0, $wk_max$0$lcssa = 0, $wk_max$070 = 0, $wk_max$1$lcssa = 0, $wk_max$157 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = HEAP32[$labelInfo >> 2] | 0; + $1 = $ysize + -1 | 0; + if (($xsize | 0) > 0) { + $i$081 = 0; + $pnt1$083 = $0; + $pnt2$082 = $0 + ((Math_imul($1, $xsize) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$082 >> 1] = 0; + HEAP16[$pnt1$083 >> 1] = 0; + $i$081 = $i$081 + 1 | 0; + if (($i$081 | 0) >= ($xsize | 0)) break; else { + $pnt1$083 = $pnt1$083 + 2 | 0; + $pnt2$082 = $pnt2$082 + 2 | 0; + } + } + } + $9 = $labelingThresh * 3 | 0; + $10 = $xsize + -1 | 0; + if (($ysize | 0) > 0) { + $i$175 = 0; + $pnt1$177 = $0; + $pnt2$176 = $0 + ($10 << 1) | 0; + while (1) { + HEAP16[$pnt2$176 >> 1] = 0; + HEAP16[$pnt1$177 >> 1] = 0; + $i$175 = $i$175 + 1 | 0; + if (($i$175 | 0) >= ($ysize | 0)) break; else { + $pnt1$177 = $pnt1$177 + ($xsize << 1) | 0; + $pnt2$176 = $pnt2$176 + ($xsize << 1) | 0; + } + } + } + $17 = $labelInfo + 1179664 | 0; + $18 = $xsize + 1 | 0; + $19 = 0 - $xsize | 0; + $$sum = 1 - $xsize | 0; + $$sum1 = ~$xsize; + L11 : do if (($1 | 0) > 1) { + $24 = ($10 | 0) > 1; + $j$068 = 1; + $pnt$072 = $image + ($18 << 1) | 0; + $pnt2$271 = $0 + ($18 << 1) | 0; + $wk_max$070 = 0; + L13 : while (1) { + if ($24) { + $i$255 = 1; + $pnt$163 = $pnt$072; + $pnt2$362 = $pnt2$271; + $wk_max$157 = $wk_max$070; + while (1) { + $26 = HEAPU8[$pnt$163 >> 0] | 0; + do if ((($26 & 240) + 24 + ($26 << 4 & 240) + ((HEAPU8[$pnt$163 + 1 >> 0] | 0) & 240) | 0) > ($9 | 0)) { + $39 = HEAP16[$pnt2$362 + ($19 << 1) >> 1] | 0; + if ($39 << 16 >> 16 > 0) { + HEAP16[$pnt2$362 >> 1] = $39; + $42 = ($39 << 16 >> 16) * 7 | 0; + $44 = $labelInfo + 1310736 + ($42 + -7 << 2) | 0; + HEAP32[$44 >> 2] = (HEAP32[$44 >> 2] | 0) + 1; + $48 = $labelInfo + 1310736 + ($42 + -6 << 2) | 0; + HEAP32[$48 >> 2] = (HEAP32[$48 >> 2] | 0) + $i$255; + $52 = $labelInfo + 1310736 + ($42 + -5 << 2) | 0; + HEAP32[$52 >> 2] = (HEAP32[$52 >> 2] | 0) + $j$068; + HEAP32[$labelInfo + 1310736 + ($42 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $58 = HEAP16[$pnt2$362 + ($$sum << 1) >> 1] | 0; + $59 = $58 << 16 >> 16; + $62 = HEAP16[$pnt2$362 + ($$sum1 << 1) >> 1] | 0; + $63 = $62 << 16 >> 16; + $64 = $62 << 16 >> 16 > 0; + if ($58 << 16 >> 16 <= 0) { + if ($64) { + HEAP16[$pnt2$362 >> 1] = $62; + $164 = $63 * 7 | 0; + $166 = $labelInfo + 1310736 + ($164 + -7 << 2) | 0; + HEAP32[$166 >> 2] = (HEAP32[$166 >> 2] | 0) + 1; + $170 = $labelInfo + 1310736 + ($164 + -6 << 2) | 0; + HEAP32[$170 >> 2] = (HEAP32[$170 >> 2] | 0) + $i$255; + $174 = $labelInfo + 1310736 + ($164 + -5 << 2) | 0; + HEAP32[$174 >> 2] = (HEAP32[$174 >> 2] | 0) + $j$068; + $178 = $labelInfo + 1310736 + ($164 + -3 << 2) | 0; + if ((HEAP32[$178 >> 2] | 0) < ($i$255 | 0)) HEAP32[$178 >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($164 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $184 = HEAP16[$pnt2$362 + -2 >> 1] | 0; + if ($184 << 16 >> 16 > 0) { + HEAP16[$pnt2$362 >> 1] = $184; + $187 = ($184 << 16 >> 16) * 7 | 0; + $189 = $labelInfo + 1310736 + ($187 + -7 << 2) | 0; + HEAP32[$189 >> 2] = (HEAP32[$189 >> 2] | 0) + 1; + $193 = $labelInfo + 1310736 + ($187 + -6 << 2) | 0; + HEAP32[$193 >> 2] = (HEAP32[$193 >> 2] | 0) + $i$255; + $197 = $labelInfo + 1310736 + ($187 + -5 << 2) | 0; + HEAP32[$197 >> 2] = (HEAP32[$197 >> 2] | 0) + $j$068; + $201 = $labelInfo + 1310736 + ($187 + -3 << 2) | 0; + if ((HEAP32[$201 >> 2] | 0) >= ($i$255 | 0)) { + $wk_max$2 = $wk_max$157; + break; + } + HEAP32[$201 >> 2] = $i$255; + $wk_max$2 = $wk_max$157; + break; + } else { + $204 = $wk_max$157 + 1 | 0; + if (($wk_max$157 | 0) > 32767) break L13; + HEAP16[$pnt2$362 >> 1] = $204; + HEAP32[$labelInfo + 1179664 + ($wk_max$157 << 2) >> 2] = $204 << 16 >> 16; + $209 = $wk_max$157 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($209 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($209 + 1 << 2) >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($209 + 2 << 2) >> 2] = $j$068; + HEAP32[$labelInfo + 1310736 + ($209 + 3 << 2) >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($209 + 4 << 2) >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($209 + 5 << 2) >> 2] = $j$068; + HEAP32[$labelInfo + 1310736 + ($209 + 6 << 2) >> 2] = $j$068; + $wk_max$2 = $204; + break; + } + } + if ($64) { + $67 = HEAP32[$labelInfo + 1179664 + ($59 + -1 << 2) >> 2] | 0; + $70 = HEAP32[$labelInfo + 1179664 + ($63 + -1 << 2) >> 2] | 0; + if (($67 | 0) > ($70 | 0)) { + HEAP16[$pnt2$362 >> 1] = $70; + if (($wk_max$157 | 0) > 0) { + $k$051 = 0; + $wk$052 = $17; + while (1) { + if ((HEAP32[$wk$052 >> 2] | 0) == ($67 | 0)) HEAP32[$wk$052 >> 2] = $70; + $k$051 = $k$051 + 1 | 0; + if (($k$051 | 0) >= ($wk_max$157 | 0)) { + $87 = $70; + break; + } else $wk$052 = $wk$052 + 4 | 0; + } + } else $87 = $70; + } else { + HEAP16[$pnt2$362 >> 1] = $67; + if (($67 | 0) < ($70 | 0) & ($wk_max$157 | 0) > 0) { + $k$148 = 0; + $wk$149 = $17; + while (1) { + if ((HEAP32[$wk$149 >> 2] | 0) == ($70 | 0)) HEAP32[$wk$149 >> 2] = $67; + $k$148 = $k$148 + 1 | 0; + if (($k$148 | 0) >= ($wk_max$157 | 0)) { + $87 = $67; + break; + } else $wk$149 = $wk$149 + 4 | 0; + } + } else $87 = $67; + } + $89 = ($87 << 16 >> 16) * 7 | 0; + $91 = $labelInfo + 1310736 + ($89 + -7 << 2) | 0; + HEAP32[$91 >> 2] = (HEAP32[$91 >> 2] | 0) + 1; + $95 = $labelInfo + 1310736 + ($89 + -6 << 2) | 0; + HEAP32[$95 >> 2] = (HEAP32[$95 >> 2] | 0) + $i$255; + $99 = $labelInfo + 1310736 + ($89 + -5 << 2) | 0; + HEAP32[$99 >> 2] = (HEAP32[$99 >> 2] | 0) + $j$068; + HEAP32[$labelInfo + 1310736 + ($89 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $105 = HEAP16[$pnt2$362 + -2 >> 1] | 0; + if ($105 << 16 >> 16 <= 0) { + HEAP16[$pnt2$362 >> 1] = $58; + $145 = $59 * 7 | 0; + $147 = $labelInfo + 1310736 + ($145 + -7 << 2) | 0; + HEAP32[$147 >> 2] = (HEAP32[$147 >> 2] | 0) + 1; + $151 = $labelInfo + 1310736 + ($145 + -6 << 2) | 0; + HEAP32[$151 >> 2] = (HEAP32[$151 >> 2] | 0) + $i$255; + $155 = $labelInfo + 1310736 + ($145 + -5 << 2) | 0; + HEAP32[$155 >> 2] = (HEAP32[$155 >> 2] | 0) + $j$068; + $159 = $labelInfo + 1310736 + ($145 + -4 << 2) | 0; + if ((HEAP32[$159 >> 2] | 0) > ($i$255 | 0)) HEAP32[$159 >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($145 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $110 = HEAP32[$labelInfo + 1179664 + ($59 + -1 << 2) >> 2] | 0; + $113 = HEAP32[$labelInfo + 1179664 + (($105 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($110 | 0) > ($113 | 0)) { + HEAP16[$pnt2$362 >> 1] = $113; + if (($wk_max$157 | 0) > 0) { + $k$244 = 0; + $wk$245 = $17; + while (1) { + if ((HEAP32[$wk$245 >> 2] | 0) == ($110 | 0)) HEAP32[$wk$245 >> 2] = $113; + $k$244 = $k$244 + 1 | 0; + if (($k$244 | 0) >= ($wk_max$157 | 0)) { + $130 = $113; + break; + } else $wk$245 = $wk$245 + 4 | 0; + } + } else $130 = $113; + } else { + HEAP16[$pnt2$362 >> 1] = $110; + if (($110 | 0) < ($113 | 0) & ($wk_max$157 | 0) > 0) { + $k$341 = 0; + $wk$342 = $17; + while (1) { + if ((HEAP32[$wk$342 >> 2] | 0) == ($113 | 0)) HEAP32[$wk$342 >> 2] = $110; + $k$341 = $k$341 + 1 | 0; + if (($k$341 | 0) >= ($wk_max$157 | 0)) { + $130 = $110; + break; + } else $wk$342 = $wk$342 + 4 | 0; + } + } else $130 = $110; + } + $132 = ($130 << 16 >> 16) * 7 | 0; + $134 = $labelInfo + 1310736 + ($132 + -7 << 2) | 0; + HEAP32[$134 >> 2] = (HEAP32[$134 >> 2] | 0) + 1; + $138 = $labelInfo + 1310736 + ($132 + -6 << 2) | 0; + HEAP32[$138 >> 2] = (HEAP32[$138 >> 2] | 0) + $i$255; + $142 = $labelInfo + 1310736 + ($132 + -5 << 2) | 0; + HEAP32[$142 >> 2] = (HEAP32[$142 >> 2] | 0) + $j$068; + $wk_max$2 = $wk_max$157; + } else { + HEAP16[$pnt2$362 >> 1] = 0; + $wk_max$2 = $wk_max$157; + } while (0); + $i$255 = $i$255 + 1 | 0; + $224 = $pnt$163 + 2 | 0; + $225 = $pnt2$362 + 2 | 0; + if (($i$255 | 0) >= ($10 | 0)) { + $pnt$1$lcssa = $224; + $pnt2$3$lcssa = $225; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $pnt$163 = $224; + $pnt2$362 = $225; + $wk_max$157 = $wk_max$2; + } + } + } else { + $pnt$1$lcssa = $pnt$072; + $pnt2$3$lcssa = $pnt2$271; + $wk_max$1$lcssa = $wk_max$070; + } + $j$068 = $j$068 + 1 | 0; + if (($j$068 | 0) >= ($1 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $pnt$072 = $pnt$1$lcssa + 4 | 0; + $pnt2$271 = $pnt2$3$lcssa + 4 | 0; + $wk_max$070 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $231 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$337 = 1; + $j$138 = 1; + $wk$439 = $17; + while (1) { + $233 = HEAP32[$wk$439 >> 2] | 0; + if (($233 | 0) == ($i$337 | 0)) { + $239 = $j$138; + $j$2 = $j$138 + 1 | 0; + } else { + $239 = HEAP32[$labelInfo + 1179664 + ($233 + -1 << 2) >> 2] | 0; + $j$2 = $j$138; + } + HEAP32[$wk$439 >> 2] = $239; + if (($i$337 | 0) < ($wk_max$0$lcssa | 0)) { + $i$337 = $i$337 + 1 | 0; + $j$138 = $j$2; + $wk$439 = $wk$439 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $243 = $labelInfo + 8 | 0; + $244 = $j$1$lcssa + -1 | 0; + HEAP32[$243 >> 2] = $244; + if (!$244) $$0 = 0; else { + _memset($231 | 0, 0, $244 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $244 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$435 = 0; + do { + $251 = $i$435 << 2; + HEAP32[$labelInfo + 131084 + ($251 << 2) >> 2] = $xsize; + HEAP32[$labelInfo + 131084 + (($251 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($251 | 2) << 2) >> 2] = $ysize; + HEAP32[$labelInfo + 131084 + (($251 | 3) << 2) >> 2] = 0; + $i$435 = $i$435 + 1 | 0; + } while (($i$435 | 0) < (HEAP32[$243 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$533 = 0; + do { + $265 = (HEAP32[$labelInfo + 1179664 + ($i$533 << 2) >> 2] | 0) + -1 | 0; + $266 = $i$533 * 7 | 0; + $269 = $labelInfo + 12 + ($265 << 2) | 0; + HEAP32[$269 >> 2] = (HEAP32[$269 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($266 << 2) >> 2] | 0); + $276 = $265 << 1; + $277 = $labelInfo + 655376 + ($276 << 3) | 0; + HEAPF64[$277 >> 3] = +HEAPF64[$277 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($266 + 1 << 2) >> 2] | 0); + $285 = $labelInfo + 655376 + (($276 | 1) << 3) | 0; + HEAPF64[$285 >> 3] = +HEAPF64[$285 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($266 + 2 << 2) >> 2] | 0); + $288 = $265 << 2; + $289 = $labelInfo + 131084 + ($288 << 2) | 0; + $293 = HEAP32[$labelInfo + 1310736 + ($266 + 3 << 2) >> 2] | 0; + if ((HEAP32[$289 >> 2] | 0) > ($293 | 0)) HEAP32[$289 >> 2] = $293; + $296 = $labelInfo + 131084 + (($288 | 1) << 2) | 0; + $300 = HEAP32[$labelInfo + 1310736 + ($266 + 4 << 2) >> 2] | 0; + if ((HEAP32[$296 >> 2] | 0) < ($300 | 0)) HEAP32[$296 >> 2] = $300; + $303 = $labelInfo + 131084 + (($288 | 2) << 2) | 0; + $307 = HEAP32[$labelInfo + 1310736 + ($266 + 5 << 2) >> 2] | 0; + if ((HEAP32[$303 >> 2] | 0) > ($307 | 0)) HEAP32[$303 >> 2] = $307; + $310 = $labelInfo + 131084 + (($288 | 3) << 2) | 0; + $314 = HEAP32[$labelInfo + 1310736 + ($266 + 6 << 2) >> 2] | 0; + if ((HEAP32[$310 >> 2] | 0) < ($314 | 0)) HEAP32[$310 >> 2] = $314; + $i$533 = $i$533 + 1 | 0; + } while (($i$533 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$243 >> 2] | 0) > 0) { + $i$632 = 0; + do { + $318 = $labelInfo + 12 + ($i$632 << 2) | 0; + $321 = $i$632 << 1; + $322 = $labelInfo + 655376 + ($321 << 3) | 0; + HEAPF64[$322 >> 3] = +HEAPF64[$322 >> 3] / +(HEAP32[$318 >> 2] | 0); + $328 = $labelInfo + 655376 + (($321 | 1) << 3) | 0; + HEAPF64[$328 >> 3] = +HEAPF64[$328 >> 3] / +(HEAP32[$318 >> 2] | 0); + $i$632 = $i$632 + 1 | 0; + } while (($i$632 | 0) < (HEAP32[$243 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubDBR3CA4444($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $0 = 0, $1 = 0, $10 = 0, $105 = 0, $110 = 0, $113 = 0, $130 = 0, $132 = 0, $134 = 0, $138 = 0, $142 = 0, $145 = 0, $147 = 0, $151 = 0, $155 = 0, $159 = 0, $164 = 0, $166 = 0, $17 = 0, $170 = 0, $174 = 0, $178 = 0, $18 = 0, $184 = 0, $187 = 0, $189 = 0, $19 = 0, $193 = 0, $197 = 0, $201 = 0, $204 = 0, $209 = 0, $224 = 0, $225 = 0, $231 = 0, $233 = 0, $239 = 0, $24 = 0, $243 = 0, $244 = 0, $251 = 0, $26 = 0, $265 = 0, $266 = 0, $269 = 0, $276 = 0, $277 = 0, $285 = 0, $288 = 0, $289 = 0, $293 = 0, $296 = 0, $300 = 0, $303 = 0, $307 = 0, $310 = 0, $314 = 0, $318 = 0, $321 = 0, $322 = 0, $328 = 0, $39 = 0, $42 = 0, $44 = 0, $48 = 0, $52 = 0, $58 = 0, $59 = 0, $62 = 0, $63 = 0, $64 = 0, $67 = 0, $70 = 0, $87 = 0, $89 = 0, $9 = 0, $91 = 0, $95 = 0, $99 = 0, $i$081 = 0, $i$175 = 0, $i$255 = 0, $i$337 = 0, $i$435 = 0, $i$533 = 0, $i$632 = 0, $j$068 = 0, $j$1$lcssa = 0, $j$138 = 0, $j$2 = 0, $k$051 = 0, $k$148 = 0, $k$244 = 0, $k$341 = 0, $pnt$072 = 0, $pnt$1$lcssa = 0, $pnt$163 = 0, $pnt1$083 = 0, $pnt1$177 = 0, $pnt2$082 = 0, $pnt2$176 = 0, $pnt2$271 = 0, $pnt2$3$lcssa = 0, $pnt2$362 = 0, $vararg_buffer = 0, $wk$052 = 0, $wk$149 = 0, $wk$245 = 0, $wk$342 = 0, $wk$439 = 0, $wk_max$0$lcssa = 0, $wk_max$070 = 0, $wk_max$1$lcssa = 0, $wk_max$157 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = HEAP32[$labelInfo >> 2] | 0; + $1 = $ysize + -1 | 0; + if (($xsize | 0) > 0) { + $i$081 = 0; + $pnt1$083 = $0; + $pnt2$082 = $0 + ((Math_imul($1, $xsize) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$082 >> 1] = 0; + HEAP16[$pnt1$083 >> 1] = 0; + $i$081 = $i$081 + 1 | 0; + if (($i$081 | 0) >= ($xsize | 0)) break; else { + $pnt1$083 = $pnt1$083 + 2 | 0; + $pnt2$082 = $pnt2$082 + 2 | 0; + } + } + } + $9 = $labelingThresh * 3 | 0; + $10 = $xsize + -1 | 0; + if (($ysize | 0) > 0) { + $i$175 = 0; + $pnt1$177 = $0; + $pnt2$176 = $0 + ($10 << 1) | 0; + while (1) { + HEAP16[$pnt2$176 >> 1] = 0; + HEAP16[$pnt1$177 >> 1] = 0; + $i$175 = $i$175 + 1 | 0; + if (($i$175 | 0) >= ($ysize | 0)) break; else { + $pnt1$177 = $pnt1$177 + ($xsize << 1) | 0; + $pnt2$176 = $pnt2$176 + ($xsize << 1) | 0; + } + } + } + $17 = $labelInfo + 1179664 | 0; + $18 = $xsize + 1 | 0; + $19 = 0 - $xsize | 0; + $$sum = 1 - $xsize | 0; + $$sum1 = ~$xsize; + L11 : do if (($1 | 0) > 1) { + $24 = ($10 | 0) > 1; + $j$068 = 1; + $pnt$072 = $image + ($18 << 1) | 0; + $pnt2$271 = $0 + ($18 << 1) | 0; + $wk_max$070 = 0; + L13 : while (1) { + if ($24) { + $i$255 = 1; + $pnt$163 = $pnt$072; + $pnt2$362 = $pnt2$271; + $wk_max$157 = $wk_max$070; + while (1) { + $26 = HEAPU8[$pnt$163 >> 0] | 0; + do if ((($26 & 240) + 24 + ($26 << 4 & 240) + ((HEAPU8[$pnt$163 + 1 >> 0] | 0) & 240) | 0) > ($9 | 0)) { + HEAP16[$pnt2$362 >> 1] = 0; + $wk_max$2 = $wk_max$157; + } else { + $39 = HEAP16[$pnt2$362 + ($19 << 1) >> 1] | 0; + if ($39 << 16 >> 16 > 0) { + HEAP16[$pnt2$362 >> 1] = $39; + $42 = ($39 << 16 >> 16) * 7 | 0; + $44 = $labelInfo + 1310736 + ($42 + -7 << 2) | 0; + HEAP32[$44 >> 2] = (HEAP32[$44 >> 2] | 0) + 1; + $48 = $labelInfo + 1310736 + ($42 + -6 << 2) | 0; + HEAP32[$48 >> 2] = (HEAP32[$48 >> 2] | 0) + $i$255; + $52 = $labelInfo + 1310736 + ($42 + -5 << 2) | 0; + HEAP32[$52 >> 2] = (HEAP32[$52 >> 2] | 0) + $j$068; + HEAP32[$labelInfo + 1310736 + ($42 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $58 = HEAP16[$pnt2$362 + ($$sum << 1) >> 1] | 0; + $59 = $58 << 16 >> 16; + $62 = HEAP16[$pnt2$362 + ($$sum1 << 1) >> 1] | 0; + $63 = $62 << 16 >> 16; + $64 = $62 << 16 >> 16 > 0; + if ($58 << 16 >> 16 <= 0) { + if ($64) { + HEAP16[$pnt2$362 >> 1] = $62; + $164 = $63 * 7 | 0; + $166 = $labelInfo + 1310736 + ($164 + -7 << 2) | 0; + HEAP32[$166 >> 2] = (HEAP32[$166 >> 2] | 0) + 1; + $170 = $labelInfo + 1310736 + ($164 + -6 << 2) | 0; + HEAP32[$170 >> 2] = (HEAP32[$170 >> 2] | 0) + $i$255; + $174 = $labelInfo + 1310736 + ($164 + -5 << 2) | 0; + HEAP32[$174 >> 2] = (HEAP32[$174 >> 2] | 0) + $j$068; + $178 = $labelInfo + 1310736 + ($164 + -3 << 2) | 0; + if ((HEAP32[$178 >> 2] | 0) < ($i$255 | 0)) HEAP32[$178 >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($164 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $184 = HEAP16[$pnt2$362 + -2 >> 1] | 0; + if ($184 << 16 >> 16 > 0) { + HEAP16[$pnt2$362 >> 1] = $184; + $187 = ($184 << 16 >> 16) * 7 | 0; + $189 = $labelInfo + 1310736 + ($187 + -7 << 2) | 0; + HEAP32[$189 >> 2] = (HEAP32[$189 >> 2] | 0) + 1; + $193 = $labelInfo + 1310736 + ($187 + -6 << 2) | 0; + HEAP32[$193 >> 2] = (HEAP32[$193 >> 2] | 0) + $i$255; + $197 = $labelInfo + 1310736 + ($187 + -5 << 2) | 0; + HEAP32[$197 >> 2] = (HEAP32[$197 >> 2] | 0) + $j$068; + $201 = $labelInfo + 1310736 + ($187 + -3 << 2) | 0; + if ((HEAP32[$201 >> 2] | 0) >= ($i$255 | 0)) { + $wk_max$2 = $wk_max$157; + break; + } + HEAP32[$201 >> 2] = $i$255; + $wk_max$2 = $wk_max$157; + break; + } else { + $204 = $wk_max$157 + 1 | 0; + if (($wk_max$157 | 0) > 32767) break L13; + HEAP16[$pnt2$362 >> 1] = $204; + HEAP32[$labelInfo + 1179664 + ($wk_max$157 << 2) >> 2] = $204 << 16 >> 16; + $209 = $wk_max$157 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($209 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($209 + 1 << 2) >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($209 + 2 << 2) >> 2] = $j$068; + HEAP32[$labelInfo + 1310736 + ($209 + 3 << 2) >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($209 + 4 << 2) >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($209 + 5 << 2) >> 2] = $j$068; + HEAP32[$labelInfo + 1310736 + ($209 + 6 << 2) >> 2] = $j$068; + $wk_max$2 = $204; + break; + } + } + if ($64) { + $67 = HEAP32[$labelInfo + 1179664 + ($59 + -1 << 2) >> 2] | 0; + $70 = HEAP32[$labelInfo + 1179664 + ($63 + -1 << 2) >> 2] | 0; + if (($67 | 0) > ($70 | 0)) { + HEAP16[$pnt2$362 >> 1] = $70; + if (($wk_max$157 | 0) > 0) { + $k$051 = 0; + $wk$052 = $17; + while (1) { + if ((HEAP32[$wk$052 >> 2] | 0) == ($67 | 0)) HEAP32[$wk$052 >> 2] = $70; + $k$051 = $k$051 + 1 | 0; + if (($k$051 | 0) >= ($wk_max$157 | 0)) { + $87 = $70; + break; + } else $wk$052 = $wk$052 + 4 | 0; + } + } else $87 = $70; + } else { + HEAP16[$pnt2$362 >> 1] = $67; + if (($67 | 0) < ($70 | 0) & ($wk_max$157 | 0) > 0) { + $k$148 = 0; + $wk$149 = $17; + while (1) { + if ((HEAP32[$wk$149 >> 2] | 0) == ($70 | 0)) HEAP32[$wk$149 >> 2] = $67; + $k$148 = $k$148 + 1 | 0; + if (($k$148 | 0) >= ($wk_max$157 | 0)) { + $87 = $67; + break; + } else $wk$149 = $wk$149 + 4 | 0; + } + } else $87 = $67; + } + $89 = ($87 << 16 >> 16) * 7 | 0; + $91 = $labelInfo + 1310736 + ($89 + -7 << 2) | 0; + HEAP32[$91 >> 2] = (HEAP32[$91 >> 2] | 0) + 1; + $95 = $labelInfo + 1310736 + ($89 + -6 << 2) | 0; + HEAP32[$95 >> 2] = (HEAP32[$95 >> 2] | 0) + $i$255; + $99 = $labelInfo + 1310736 + ($89 + -5 << 2) | 0; + HEAP32[$99 >> 2] = (HEAP32[$99 >> 2] | 0) + $j$068; + HEAP32[$labelInfo + 1310736 + ($89 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $105 = HEAP16[$pnt2$362 + -2 >> 1] | 0; + if ($105 << 16 >> 16 <= 0) { + HEAP16[$pnt2$362 >> 1] = $58; + $145 = $59 * 7 | 0; + $147 = $labelInfo + 1310736 + ($145 + -7 << 2) | 0; + HEAP32[$147 >> 2] = (HEAP32[$147 >> 2] | 0) + 1; + $151 = $labelInfo + 1310736 + ($145 + -6 << 2) | 0; + HEAP32[$151 >> 2] = (HEAP32[$151 >> 2] | 0) + $i$255; + $155 = $labelInfo + 1310736 + ($145 + -5 << 2) | 0; + HEAP32[$155 >> 2] = (HEAP32[$155 >> 2] | 0) + $j$068; + $159 = $labelInfo + 1310736 + ($145 + -4 << 2) | 0; + if ((HEAP32[$159 >> 2] | 0) > ($i$255 | 0)) HEAP32[$159 >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($145 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $110 = HEAP32[$labelInfo + 1179664 + ($59 + -1 << 2) >> 2] | 0; + $113 = HEAP32[$labelInfo + 1179664 + (($105 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($110 | 0) > ($113 | 0)) { + HEAP16[$pnt2$362 >> 1] = $113; + if (($wk_max$157 | 0) > 0) { + $k$244 = 0; + $wk$245 = $17; + while (1) { + if ((HEAP32[$wk$245 >> 2] | 0) == ($110 | 0)) HEAP32[$wk$245 >> 2] = $113; + $k$244 = $k$244 + 1 | 0; + if (($k$244 | 0) >= ($wk_max$157 | 0)) { + $130 = $113; + break; + } else $wk$245 = $wk$245 + 4 | 0; + } + } else $130 = $113; + } else { + HEAP16[$pnt2$362 >> 1] = $110; + if (($110 | 0) < ($113 | 0) & ($wk_max$157 | 0) > 0) { + $k$341 = 0; + $wk$342 = $17; + while (1) { + if ((HEAP32[$wk$342 >> 2] | 0) == ($113 | 0)) HEAP32[$wk$342 >> 2] = $110; + $k$341 = $k$341 + 1 | 0; + if (($k$341 | 0) >= ($wk_max$157 | 0)) { + $130 = $110; + break; + } else $wk$342 = $wk$342 + 4 | 0; + } + } else $130 = $110; + } + $132 = ($130 << 16 >> 16) * 7 | 0; + $134 = $labelInfo + 1310736 + ($132 + -7 << 2) | 0; + HEAP32[$134 >> 2] = (HEAP32[$134 >> 2] | 0) + 1; + $138 = $labelInfo + 1310736 + ($132 + -6 << 2) | 0; + HEAP32[$138 >> 2] = (HEAP32[$138 >> 2] | 0) + $i$255; + $142 = $labelInfo + 1310736 + ($132 + -5 << 2) | 0; + HEAP32[$142 >> 2] = (HEAP32[$142 >> 2] | 0) + $j$068; + $wk_max$2 = $wk_max$157; + } while (0); + $i$255 = $i$255 + 1 | 0; + $224 = $pnt$163 + 2 | 0; + $225 = $pnt2$362 + 2 | 0; + if (($i$255 | 0) >= ($10 | 0)) { + $pnt$1$lcssa = $224; + $pnt2$3$lcssa = $225; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $pnt$163 = $224; + $pnt2$362 = $225; + $wk_max$157 = $wk_max$2; + } + } + } else { + $pnt$1$lcssa = $pnt$072; + $pnt2$3$lcssa = $pnt2$271; + $wk_max$1$lcssa = $wk_max$070; + } + $j$068 = $j$068 + 1 | 0; + if (($j$068 | 0) >= ($1 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $pnt$072 = $pnt$1$lcssa + 4 | 0; + $pnt2$271 = $pnt2$3$lcssa + 4 | 0; + $wk_max$070 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $231 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$337 = 1; + $j$138 = 1; + $wk$439 = $17; + while (1) { + $233 = HEAP32[$wk$439 >> 2] | 0; + if (($233 | 0) == ($i$337 | 0)) { + $239 = $j$138; + $j$2 = $j$138 + 1 | 0; + } else { + $239 = HEAP32[$labelInfo + 1179664 + ($233 + -1 << 2) >> 2] | 0; + $j$2 = $j$138; + } + HEAP32[$wk$439 >> 2] = $239; + if (($i$337 | 0) < ($wk_max$0$lcssa | 0)) { + $i$337 = $i$337 + 1 | 0; + $j$138 = $j$2; + $wk$439 = $wk$439 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $243 = $labelInfo + 8 | 0; + $244 = $j$1$lcssa + -1 | 0; + HEAP32[$243 >> 2] = $244; + if (!$244) $$0 = 0; else { + _memset($231 | 0, 0, $244 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $244 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$435 = 0; + do { + $251 = $i$435 << 2; + HEAP32[$labelInfo + 131084 + ($251 << 2) >> 2] = $xsize; + HEAP32[$labelInfo + 131084 + (($251 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($251 | 2) << 2) >> 2] = $ysize; + HEAP32[$labelInfo + 131084 + (($251 | 3) << 2) >> 2] = 0; + $i$435 = $i$435 + 1 | 0; + } while (($i$435 | 0) < (HEAP32[$243 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$533 = 0; + do { + $265 = (HEAP32[$labelInfo + 1179664 + ($i$533 << 2) >> 2] | 0) + -1 | 0; + $266 = $i$533 * 7 | 0; + $269 = $labelInfo + 12 + ($265 << 2) | 0; + HEAP32[$269 >> 2] = (HEAP32[$269 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($266 << 2) >> 2] | 0); + $276 = $265 << 1; + $277 = $labelInfo + 655376 + ($276 << 3) | 0; + HEAPF64[$277 >> 3] = +HEAPF64[$277 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($266 + 1 << 2) >> 2] | 0); + $285 = $labelInfo + 655376 + (($276 | 1) << 3) | 0; + HEAPF64[$285 >> 3] = +HEAPF64[$285 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($266 + 2 << 2) >> 2] | 0); + $288 = $265 << 2; + $289 = $labelInfo + 131084 + ($288 << 2) | 0; + $293 = HEAP32[$labelInfo + 1310736 + ($266 + 3 << 2) >> 2] | 0; + if ((HEAP32[$289 >> 2] | 0) > ($293 | 0)) HEAP32[$289 >> 2] = $293; + $296 = $labelInfo + 131084 + (($288 | 1) << 2) | 0; + $300 = HEAP32[$labelInfo + 1310736 + ($266 + 4 << 2) >> 2] | 0; + if ((HEAP32[$296 >> 2] | 0) < ($300 | 0)) HEAP32[$296 >> 2] = $300; + $303 = $labelInfo + 131084 + (($288 | 2) << 2) | 0; + $307 = HEAP32[$labelInfo + 1310736 + ($266 + 5 << 2) >> 2] | 0; + if ((HEAP32[$303 >> 2] | 0) > ($307 | 0)) HEAP32[$303 >> 2] = $307; + $310 = $labelInfo + 131084 + (($288 | 3) << 2) | 0; + $314 = HEAP32[$labelInfo + 1310736 + ($266 + 6 << 2) >> 2] | 0; + if ((HEAP32[$310 >> 2] | 0) < ($314 | 0)) HEAP32[$310 >> 2] = $314; + $i$533 = $i$533 + 1 | 0; + } while (($i$533 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$243 >> 2] | 0) > 0) { + $i$632 = 0; + do { + $318 = $labelInfo + 12 + ($i$632 << 2) | 0; + $321 = $i$632 << 1; + $322 = $labelInfo + 655376 + ($321 << 3) | 0; + HEAPF64[$322 >> 3] = +HEAPF64[$322 >> 3] / +(HEAP32[$318 >> 2] | 0); + $328 = $labelInfo + 655376 + (($321 | 1) << 3) | 0; + HEAPF64[$328 >> 3] = +HEAPF64[$328 >> 3] / +(HEAP32[$318 >> 2] | 0); + $i$632 = $i$632 + 1 | 0; + } while (($i$632 | 0) < (HEAP32[$243 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubDWRA3C($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $0 = 0, $1 = 0, $10 = 0, $104 = 0, $109 = 0, $112 = 0, $129 = 0, $131 = 0, $133 = 0, $137 = 0, $141 = 0, $144 = 0, $146 = 0, $150 = 0, $154 = 0, $158 = 0, $163 = 0, $165 = 0, $169 = 0, $17 = 0, $173 = 0, $177 = 0, $18 = 0, $183 = 0, $186 = 0, $188 = 0, $19 = 0, $192 = 0, $196 = 0, $200 = 0, $203 = 0, $208 = 0, $223 = 0, $224 = 0, $230 = 0, $232 = 0, $238 = 0, $24 = 0, $242 = 0, $243 = 0, $250 = 0, $264 = 0, $265 = 0, $268 = 0, $275 = 0, $276 = 0, $284 = 0, $287 = 0, $288 = 0, $292 = 0, $295 = 0, $299 = 0, $302 = 0, $306 = 0, $309 = 0, $313 = 0, $317 = 0, $320 = 0, $321 = 0, $327 = 0, $38 = 0, $41 = 0, $43 = 0, $47 = 0, $51 = 0, $57 = 0, $58 = 0, $61 = 0, $62 = 0, $63 = 0, $66 = 0, $69 = 0, $86 = 0, $88 = 0, $9 = 0, $90 = 0, $94 = 0, $98 = 0, $i$081 = 0, $i$175 = 0, $i$255 = 0, $i$337 = 0, $i$435 = 0, $i$533 = 0, $i$632 = 0, $j$068 = 0, $j$1$lcssa = 0, $j$138 = 0, $j$2 = 0, $k$051 = 0, $k$148 = 0, $k$244 = 0, $k$341 = 0, $pnt$072 = 0, $pnt$1$lcssa = 0, $pnt$163 = 0, $pnt1$083 = 0, $pnt1$177 = 0, $pnt2$082 = 0, $pnt2$176 = 0, $pnt2$271 = 0, $pnt2$3$lcssa = 0, $pnt2$362 = 0, $vararg_buffer = 0, $wk$052 = 0, $wk$149 = 0, $wk$245 = 0, $wk$342 = 0, $wk$439 = 0, $wk_max$0$lcssa = 0, $wk_max$070 = 0, $wk_max$1$lcssa = 0, $wk_max$157 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = HEAP32[$labelInfo >> 2] | 0; + $1 = $ysize + -1 | 0; + if (($xsize | 0) > 0) { + $i$081 = 0; + $pnt1$083 = $0; + $pnt2$082 = $0 + ((Math_imul($1, $xsize) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$082 >> 1] = 0; + HEAP16[$pnt1$083 >> 1] = 0; + $i$081 = $i$081 + 1 | 0; + if (($i$081 | 0) >= ($xsize | 0)) break; else { + $pnt1$083 = $pnt1$083 + 2 | 0; + $pnt2$082 = $pnt2$082 + 2 | 0; + } + } + } + $9 = $labelingThresh * 3 | 0; + $10 = $xsize + -1 | 0; + if (($ysize | 0) > 0) { + $i$175 = 0; + $pnt1$177 = $0; + $pnt2$176 = $0 + ($10 << 1) | 0; + while (1) { + HEAP16[$pnt2$176 >> 1] = 0; + HEAP16[$pnt1$177 >> 1] = 0; + $i$175 = $i$175 + 1 | 0; + if (($i$175 | 0) >= ($ysize | 0)) break; else { + $pnt1$177 = $pnt1$177 + ($xsize << 1) | 0; + $pnt2$176 = $pnt2$176 + ($xsize << 1) | 0; + } + } + } + $17 = $labelInfo + 1179664 | 0; + $18 = $xsize + 1 | 0; + $19 = 0 - $xsize | 0; + $$sum = 1 - $xsize | 0; + $$sum1 = ~$xsize; + L11 : do if (($1 | 0) > 1) { + $24 = ($10 | 0) > 1; + $j$068 = 1; + $pnt$072 = $image + ($18 << 2) | 0; + $pnt2$271 = $0 + ($18 << 1) | 0; + $wk_max$070 = 0; + L13 : while (1) { + if ($24) { + $i$255 = 1; + $pnt$163 = $pnt$072; + $pnt2$362 = $pnt2$271; + $wk_max$157 = $wk_max$070; + while (1) { + do if (((HEAPU8[$pnt$163 + 2 >> 0] | 0) + (HEAPU8[$pnt$163 + 1 >> 0] | 0) + (HEAPU8[$pnt$163 + 3 >> 0] | 0) | 0) > ($9 | 0)) { + $38 = HEAP16[$pnt2$362 + ($19 << 1) >> 1] | 0; + if ($38 << 16 >> 16 > 0) { + HEAP16[$pnt2$362 >> 1] = $38; + $41 = ($38 << 16 >> 16) * 7 | 0; + $43 = $labelInfo + 1310736 + ($41 + -7 << 2) | 0; + HEAP32[$43 >> 2] = (HEAP32[$43 >> 2] | 0) + 1; + $47 = $labelInfo + 1310736 + ($41 + -6 << 2) | 0; + HEAP32[$47 >> 2] = (HEAP32[$47 >> 2] | 0) + $i$255; + $51 = $labelInfo + 1310736 + ($41 + -5 << 2) | 0; + HEAP32[$51 >> 2] = (HEAP32[$51 >> 2] | 0) + $j$068; + HEAP32[$labelInfo + 1310736 + ($41 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $57 = HEAP16[$pnt2$362 + ($$sum << 1) >> 1] | 0; + $58 = $57 << 16 >> 16; + $61 = HEAP16[$pnt2$362 + ($$sum1 << 1) >> 1] | 0; + $62 = $61 << 16 >> 16; + $63 = $61 << 16 >> 16 > 0; + if ($57 << 16 >> 16 <= 0) { + if ($63) { + HEAP16[$pnt2$362 >> 1] = $61; + $163 = $62 * 7 | 0; + $165 = $labelInfo + 1310736 + ($163 + -7 << 2) | 0; + HEAP32[$165 >> 2] = (HEAP32[$165 >> 2] | 0) + 1; + $169 = $labelInfo + 1310736 + ($163 + -6 << 2) | 0; + HEAP32[$169 >> 2] = (HEAP32[$169 >> 2] | 0) + $i$255; + $173 = $labelInfo + 1310736 + ($163 + -5 << 2) | 0; + HEAP32[$173 >> 2] = (HEAP32[$173 >> 2] | 0) + $j$068; + $177 = $labelInfo + 1310736 + ($163 + -3 << 2) | 0; + if ((HEAP32[$177 >> 2] | 0) < ($i$255 | 0)) HEAP32[$177 >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($163 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $183 = HEAP16[$pnt2$362 + -2 >> 1] | 0; + if ($183 << 16 >> 16 > 0) { + HEAP16[$pnt2$362 >> 1] = $183; + $186 = ($183 << 16 >> 16) * 7 | 0; + $188 = $labelInfo + 1310736 + ($186 + -7 << 2) | 0; + HEAP32[$188 >> 2] = (HEAP32[$188 >> 2] | 0) + 1; + $192 = $labelInfo + 1310736 + ($186 + -6 << 2) | 0; + HEAP32[$192 >> 2] = (HEAP32[$192 >> 2] | 0) + $i$255; + $196 = $labelInfo + 1310736 + ($186 + -5 << 2) | 0; + HEAP32[$196 >> 2] = (HEAP32[$196 >> 2] | 0) + $j$068; + $200 = $labelInfo + 1310736 + ($186 + -3 << 2) | 0; + if ((HEAP32[$200 >> 2] | 0) >= ($i$255 | 0)) { + $wk_max$2 = $wk_max$157; + break; + } + HEAP32[$200 >> 2] = $i$255; + $wk_max$2 = $wk_max$157; + break; + } else { + $203 = $wk_max$157 + 1 | 0; + if (($wk_max$157 | 0) > 32767) break L13; + HEAP16[$pnt2$362 >> 1] = $203; + HEAP32[$labelInfo + 1179664 + ($wk_max$157 << 2) >> 2] = $203 << 16 >> 16; + $208 = $wk_max$157 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($208 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($208 + 1 << 2) >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($208 + 2 << 2) >> 2] = $j$068; + HEAP32[$labelInfo + 1310736 + ($208 + 3 << 2) >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($208 + 4 << 2) >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($208 + 5 << 2) >> 2] = $j$068; + HEAP32[$labelInfo + 1310736 + ($208 + 6 << 2) >> 2] = $j$068; + $wk_max$2 = $203; + break; + } + } + if ($63) { + $66 = HEAP32[$labelInfo + 1179664 + ($58 + -1 << 2) >> 2] | 0; + $69 = HEAP32[$labelInfo + 1179664 + ($62 + -1 << 2) >> 2] | 0; + if (($66 | 0) > ($69 | 0)) { + HEAP16[$pnt2$362 >> 1] = $69; + if (($wk_max$157 | 0) > 0) { + $k$051 = 0; + $wk$052 = $17; + while (1) { + if ((HEAP32[$wk$052 >> 2] | 0) == ($66 | 0)) HEAP32[$wk$052 >> 2] = $69; + $k$051 = $k$051 + 1 | 0; + if (($k$051 | 0) >= ($wk_max$157 | 0)) { + $86 = $69; + break; + } else $wk$052 = $wk$052 + 4 | 0; + } + } else $86 = $69; + } else { + HEAP16[$pnt2$362 >> 1] = $66; + if (($66 | 0) < ($69 | 0) & ($wk_max$157 | 0) > 0) { + $k$148 = 0; + $wk$149 = $17; + while (1) { + if ((HEAP32[$wk$149 >> 2] | 0) == ($69 | 0)) HEAP32[$wk$149 >> 2] = $66; + $k$148 = $k$148 + 1 | 0; + if (($k$148 | 0) >= ($wk_max$157 | 0)) { + $86 = $66; + break; + } else $wk$149 = $wk$149 + 4 | 0; + } + } else $86 = $66; + } + $88 = ($86 << 16 >> 16) * 7 | 0; + $90 = $labelInfo + 1310736 + ($88 + -7 << 2) | 0; + HEAP32[$90 >> 2] = (HEAP32[$90 >> 2] | 0) + 1; + $94 = $labelInfo + 1310736 + ($88 + -6 << 2) | 0; + HEAP32[$94 >> 2] = (HEAP32[$94 >> 2] | 0) + $i$255; + $98 = $labelInfo + 1310736 + ($88 + -5 << 2) | 0; + HEAP32[$98 >> 2] = (HEAP32[$98 >> 2] | 0) + $j$068; + HEAP32[$labelInfo + 1310736 + ($88 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $104 = HEAP16[$pnt2$362 + -2 >> 1] | 0; + if ($104 << 16 >> 16 <= 0) { + HEAP16[$pnt2$362 >> 1] = $57; + $144 = $58 * 7 | 0; + $146 = $labelInfo + 1310736 + ($144 + -7 << 2) | 0; + HEAP32[$146 >> 2] = (HEAP32[$146 >> 2] | 0) + 1; + $150 = $labelInfo + 1310736 + ($144 + -6 << 2) | 0; + HEAP32[$150 >> 2] = (HEAP32[$150 >> 2] | 0) + $i$255; + $154 = $labelInfo + 1310736 + ($144 + -5 << 2) | 0; + HEAP32[$154 >> 2] = (HEAP32[$154 >> 2] | 0) + $j$068; + $158 = $labelInfo + 1310736 + ($144 + -4 << 2) | 0; + if ((HEAP32[$158 >> 2] | 0) > ($i$255 | 0)) HEAP32[$158 >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($144 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $109 = HEAP32[$labelInfo + 1179664 + ($58 + -1 << 2) >> 2] | 0; + $112 = HEAP32[$labelInfo + 1179664 + (($104 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($109 | 0) > ($112 | 0)) { + HEAP16[$pnt2$362 >> 1] = $112; + if (($wk_max$157 | 0) > 0) { + $k$244 = 0; + $wk$245 = $17; + while (1) { + if ((HEAP32[$wk$245 >> 2] | 0) == ($109 | 0)) HEAP32[$wk$245 >> 2] = $112; + $k$244 = $k$244 + 1 | 0; + if (($k$244 | 0) >= ($wk_max$157 | 0)) { + $129 = $112; + break; + } else $wk$245 = $wk$245 + 4 | 0; + } + } else $129 = $112; + } else { + HEAP16[$pnt2$362 >> 1] = $109; + if (($109 | 0) < ($112 | 0) & ($wk_max$157 | 0) > 0) { + $k$341 = 0; + $wk$342 = $17; + while (1) { + if ((HEAP32[$wk$342 >> 2] | 0) == ($112 | 0)) HEAP32[$wk$342 >> 2] = $109; + $k$341 = $k$341 + 1 | 0; + if (($k$341 | 0) >= ($wk_max$157 | 0)) { + $129 = $109; + break; + } else $wk$342 = $wk$342 + 4 | 0; + } + } else $129 = $109; + } + $131 = ($129 << 16 >> 16) * 7 | 0; + $133 = $labelInfo + 1310736 + ($131 + -7 << 2) | 0; + HEAP32[$133 >> 2] = (HEAP32[$133 >> 2] | 0) + 1; + $137 = $labelInfo + 1310736 + ($131 + -6 << 2) | 0; + HEAP32[$137 >> 2] = (HEAP32[$137 >> 2] | 0) + $i$255; + $141 = $labelInfo + 1310736 + ($131 + -5 << 2) | 0; + HEAP32[$141 >> 2] = (HEAP32[$141 >> 2] | 0) + $j$068; + $wk_max$2 = $wk_max$157; + } else { + HEAP16[$pnt2$362 >> 1] = 0; + $wk_max$2 = $wk_max$157; + } while (0); + $i$255 = $i$255 + 1 | 0; + $223 = $pnt$163 + 4 | 0; + $224 = $pnt2$362 + 2 | 0; + if (($i$255 | 0) >= ($10 | 0)) { + $pnt$1$lcssa = $223; + $pnt2$3$lcssa = $224; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $pnt$163 = $223; + $pnt2$362 = $224; + $wk_max$157 = $wk_max$2; + } + } + } else { + $pnt$1$lcssa = $pnt$072; + $pnt2$3$lcssa = $pnt2$271; + $wk_max$1$lcssa = $wk_max$070; + } + $j$068 = $j$068 + 1 | 0; + if (($j$068 | 0) >= ($1 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $pnt$072 = $pnt$1$lcssa + 8 | 0; + $pnt2$271 = $pnt2$3$lcssa + 4 | 0; + $wk_max$070 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $230 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$337 = 1; + $j$138 = 1; + $wk$439 = $17; + while (1) { + $232 = HEAP32[$wk$439 >> 2] | 0; + if (($232 | 0) == ($i$337 | 0)) { + $238 = $j$138; + $j$2 = $j$138 + 1 | 0; + } else { + $238 = HEAP32[$labelInfo + 1179664 + ($232 + -1 << 2) >> 2] | 0; + $j$2 = $j$138; + } + HEAP32[$wk$439 >> 2] = $238; + if (($i$337 | 0) < ($wk_max$0$lcssa | 0)) { + $i$337 = $i$337 + 1 | 0; + $j$138 = $j$2; + $wk$439 = $wk$439 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $242 = $labelInfo + 8 | 0; + $243 = $j$1$lcssa + -1 | 0; + HEAP32[$242 >> 2] = $243; + if (!$243) $$0 = 0; else { + _memset($230 | 0, 0, $243 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $243 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$435 = 0; + do { + $250 = $i$435 << 2; + HEAP32[$labelInfo + 131084 + ($250 << 2) >> 2] = $xsize; + HEAP32[$labelInfo + 131084 + (($250 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($250 | 2) << 2) >> 2] = $ysize; + HEAP32[$labelInfo + 131084 + (($250 | 3) << 2) >> 2] = 0; + $i$435 = $i$435 + 1 | 0; + } while (($i$435 | 0) < (HEAP32[$242 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$533 = 0; + do { + $264 = (HEAP32[$labelInfo + 1179664 + ($i$533 << 2) >> 2] | 0) + -1 | 0; + $265 = $i$533 * 7 | 0; + $268 = $labelInfo + 12 + ($264 << 2) | 0; + HEAP32[$268 >> 2] = (HEAP32[$268 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($265 << 2) >> 2] | 0); + $275 = $264 << 1; + $276 = $labelInfo + 655376 + ($275 << 3) | 0; + HEAPF64[$276 >> 3] = +HEAPF64[$276 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($265 + 1 << 2) >> 2] | 0); + $284 = $labelInfo + 655376 + (($275 | 1) << 3) | 0; + HEAPF64[$284 >> 3] = +HEAPF64[$284 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($265 + 2 << 2) >> 2] | 0); + $287 = $264 << 2; + $288 = $labelInfo + 131084 + ($287 << 2) | 0; + $292 = HEAP32[$labelInfo + 1310736 + ($265 + 3 << 2) >> 2] | 0; + if ((HEAP32[$288 >> 2] | 0) > ($292 | 0)) HEAP32[$288 >> 2] = $292; + $295 = $labelInfo + 131084 + (($287 | 1) << 2) | 0; + $299 = HEAP32[$labelInfo + 1310736 + ($265 + 4 << 2) >> 2] | 0; + if ((HEAP32[$295 >> 2] | 0) < ($299 | 0)) HEAP32[$295 >> 2] = $299; + $302 = $labelInfo + 131084 + (($287 | 2) << 2) | 0; + $306 = HEAP32[$labelInfo + 1310736 + ($265 + 5 << 2) >> 2] | 0; + if ((HEAP32[$302 >> 2] | 0) > ($306 | 0)) HEAP32[$302 >> 2] = $306; + $309 = $labelInfo + 131084 + (($287 | 3) << 2) | 0; + $313 = HEAP32[$labelInfo + 1310736 + ($265 + 6 << 2) >> 2] | 0; + if ((HEAP32[$309 >> 2] | 0) < ($313 | 0)) HEAP32[$309 >> 2] = $313; + $i$533 = $i$533 + 1 | 0; + } while (($i$533 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$242 >> 2] | 0) > 0) { + $i$632 = 0; + do { + $317 = $labelInfo + 12 + ($i$632 << 2) | 0; + $320 = $i$632 << 1; + $321 = $labelInfo + 655376 + ($320 << 3) | 0; + HEAPF64[$321 >> 3] = +HEAPF64[$321 >> 3] / +(HEAP32[$317 >> 2] | 0); + $327 = $labelInfo + 655376 + (($320 | 1) << 3) | 0; + HEAPF64[$327 >> 3] = +HEAPF64[$327 >> 3] / +(HEAP32[$317 >> 2] | 0); + $i$632 = $i$632 + 1 | 0; + } while (($i$632 | 0) < (HEAP32[$242 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubDBRA3C($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $0 = 0, $1 = 0, $10 = 0, $104 = 0, $109 = 0, $112 = 0, $129 = 0, $131 = 0, $133 = 0, $137 = 0, $141 = 0, $144 = 0, $146 = 0, $150 = 0, $154 = 0, $158 = 0, $163 = 0, $165 = 0, $169 = 0, $17 = 0, $173 = 0, $177 = 0, $18 = 0, $183 = 0, $186 = 0, $188 = 0, $19 = 0, $192 = 0, $196 = 0, $200 = 0, $203 = 0, $208 = 0, $223 = 0, $224 = 0, $230 = 0, $232 = 0, $238 = 0, $24 = 0, $242 = 0, $243 = 0, $250 = 0, $264 = 0, $265 = 0, $268 = 0, $275 = 0, $276 = 0, $284 = 0, $287 = 0, $288 = 0, $292 = 0, $295 = 0, $299 = 0, $302 = 0, $306 = 0, $309 = 0, $313 = 0, $317 = 0, $320 = 0, $321 = 0, $327 = 0, $38 = 0, $41 = 0, $43 = 0, $47 = 0, $51 = 0, $57 = 0, $58 = 0, $61 = 0, $62 = 0, $63 = 0, $66 = 0, $69 = 0, $86 = 0, $88 = 0, $9 = 0, $90 = 0, $94 = 0, $98 = 0, $i$081 = 0, $i$175 = 0, $i$255 = 0, $i$337 = 0, $i$435 = 0, $i$533 = 0, $i$632 = 0, $j$068 = 0, $j$1$lcssa = 0, $j$138 = 0, $j$2 = 0, $k$051 = 0, $k$148 = 0, $k$244 = 0, $k$341 = 0, $pnt$072 = 0, $pnt$1$lcssa = 0, $pnt$163 = 0, $pnt1$083 = 0, $pnt1$177 = 0, $pnt2$082 = 0, $pnt2$176 = 0, $pnt2$271 = 0, $pnt2$3$lcssa = 0, $pnt2$362 = 0, $vararg_buffer = 0, $wk$052 = 0, $wk$149 = 0, $wk$245 = 0, $wk$342 = 0, $wk$439 = 0, $wk_max$0$lcssa = 0, $wk_max$070 = 0, $wk_max$1$lcssa = 0, $wk_max$157 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = HEAP32[$labelInfo >> 2] | 0; + $1 = $ysize + -1 | 0; + if (($xsize | 0) > 0) { + $i$081 = 0; + $pnt1$083 = $0; + $pnt2$082 = $0 + ((Math_imul($1, $xsize) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$082 >> 1] = 0; + HEAP16[$pnt1$083 >> 1] = 0; + $i$081 = $i$081 + 1 | 0; + if (($i$081 | 0) >= ($xsize | 0)) break; else { + $pnt1$083 = $pnt1$083 + 2 | 0; + $pnt2$082 = $pnt2$082 + 2 | 0; + } + } + } + $9 = $labelingThresh * 3 | 0; + $10 = $xsize + -1 | 0; + if (($ysize | 0) > 0) { + $i$175 = 0; + $pnt1$177 = $0; + $pnt2$176 = $0 + ($10 << 1) | 0; + while (1) { + HEAP16[$pnt2$176 >> 1] = 0; + HEAP16[$pnt1$177 >> 1] = 0; + $i$175 = $i$175 + 1 | 0; + if (($i$175 | 0) >= ($ysize | 0)) break; else { + $pnt1$177 = $pnt1$177 + ($xsize << 1) | 0; + $pnt2$176 = $pnt2$176 + ($xsize << 1) | 0; + } + } + } + $17 = $labelInfo + 1179664 | 0; + $18 = $xsize + 1 | 0; + $19 = 0 - $xsize | 0; + $$sum = 1 - $xsize | 0; + $$sum1 = ~$xsize; + L11 : do if (($1 | 0) > 1) { + $24 = ($10 | 0) > 1; + $j$068 = 1; + $pnt$072 = $image + ($18 << 2) | 0; + $pnt2$271 = $0 + ($18 << 1) | 0; + $wk_max$070 = 0; + L13 : while (1) { + if ($24) { + $i$255 = 1; + $pnt$163 = $pnt$072; + $pnt2$362 = $pnt2$271; + $wk_max$157 = $wk_max$070; + while (1) { + do if (((HEAPU8[$pnt$163 + 2 >> 0] | 0) + (HEAPU8[$pnt$163 + 1 >> 0] | 0) + (HEAPU8[$pnt$163 + 3 >> 0] | 0) | 0) > ($9 | 0)) { + HEAP16[$pnt2$362 >> 1] = 0; + $wk_max$2 = $wk_max$157; + } else { + $38 = HEAP16[$pnt2$362 + ($19 << 1) >> 1] | 0; + if ($38 << 16 >> 16 > 0) { + HEAP16[$pnt2$362 >> 1] = $38; + $41 = ($38 << 16 >> 16) * 7 | 0; + $43 = $labelInfo + 1310736 + ($41 + -7 << 2) | 0; + HEAP32[$43 >> 2] = (HEAP32[$43 >> 2] | 0) + 1; + $47 = $labelInfo + 1310736 + ($41 + -6 << 2) | 0; + HEAP32[$47 >> 2] = (HEAP32[$47 >> 2] | 0) + $i$255; + $51 = $labelInfo + 1310736 + ($41 + -5 << 2) | 0; + HEAP32[$51 >> 2] = (HEAP32[$51 >> 2] | 0) + $j$068; + HEAP32[$labelInfo + 1310736 + ($41 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $57 = HEAP16[$pnt2$362 + ($$sum << 1) >> 1] | 0; + $58 = $57 << 16 >> 16; + $61 = HEAP16[$pnt2$362 + ($$sum1 << 1) >> 1] | 0; + $62 = $61 << 16 >> 16; + $63 = $61 << 16 >> 16 > 0; + if ($57 << 16 >> 16 <= 0) { + if ($63) { + HEAP16[$pnt2$362 >> 1] = $61; + $163 = $62 * 7 | 0; + $165 = $labelInfo + 1310736 + ($163 + -7 << 2) | 0; + HEAP32[$165 >> 2] = (HEAP32[$165 >> 2] | 0) + 1; + $169 = $labelInfo + 1310736 + ($163 + -6 << 2) | 0; + HEAP32[$169 >> 2] = (HEAP32[$169 >> 2] | 0) + $i$255; + $173 = $labelInfo + 1310736 + ($163 + -5 << 2) | 0; + HEAP32[$173 >> 2] = (HEAP32[$173 >> 2] | 0) + $j$068; + $177 = $labelInfo + 1310736 + ($163 + -3 << 2) | 0; + if ((HEAP32[$177 >> 2] | 0) < ($i$255 | 0)) HEAP32[$177 >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($163 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $183 = HEAP16[$pnt2$362 + -2 >> 1] | 0; + if ($183 << 16 >> 16 > 0) { + HEAP16[$pnt2$362 >> 1] = $183; + $186 = ($183 << 16 >> 16) * 7 | 0; + $188 = $labelInfo + 1310736 + ($186 + -7 << 2) | 0; + HEAP32[$188 >> 2] = (HEAP32[$188 >> 2] | 0) + 1; + $192 = $labelInfo + 1310736 + ($186 + -6 << 2) | 0; + HEAP32[$192 >> 2] = (HEAP32[$192 >> 2] | 0) + $i$255; + $196 = $labelInfo + 1310736 + ($186 + -5 << 2) | 0; + HEAP32[$196 >> 2] = (HEAP32[$196 >> 2] | 0) + $j$068; + $200 = $labelInfo + 1310736 + ($186 + -3 << 2) | 0; + if ((HEAP32[$200 >> 2] | 0) >= ($i$255 | 0)) { + $wk_max$2 = $wk_max$157; + break; + } + HEAP32[$200 >> 2] = $i$255; + $wk_max$2 = $wk_max$157; + break; + } else { + $203 = $wk_max$157 + 1 | 0; + if (($wk_max$157 | 0) > 32767) break L13; + HEAP16[$pnt2$362 >> 1] = $203; + HEAP32[$labelInfo + 1179664 + ($wk_max$157 << 2) >> 2] = $203 << 16 >> 16; + $208 = $wk_max$157 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($208 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($208 + 1 << 2) >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($208 + 2 << 2) >> 2] = $j$068; + HEAP32[$labelInfo + 1310736 + ($208 + 3 << 2) >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($208 + 4 << 2) >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($208 + 5 << 2) >> 2] = $j$068; + HEAP32[$labelInfo + 1310736 + ($208 + 6 << 2) >> 2] = $j$068; + $wk_max$2 = $203; + break; + } + } + if ($63) { + $66 = HEAP32[$labelInfo + 1179664 + ($58 + -1 << 2) >> 2] | 0; + $69 = HEAP32[$labelInfo + 1179664 + ($62 + -1 << 2) >> 2] | 0; + if (($66 | 0) > ($69 | 0)) { + HEAP16[$pnt2$362 >> 1] = $69; + if (($wk_max$157 | 0) > 0) { + $k$051 = 0; + $wk$052 = $17; + while (1) { + if ((HEAP32[$wk$052 >> 2] | 0) == ($66 | 0)) HEAP32[$wk$052 >> 2] = $69; + $k$051 = $k$051 + 1 | 0; + if (($k$051 | 0) >= ($wk_max$157 | 0)) { + $86 = $69; + break; + } else $wk$052 = $wk$052 + 4 | 0; + } + } else $86 = $69; + } else { + HEAP16[$pnt2$362 >> 1] = $66; + if (($66 | 0) < ($69 | 0) & ($wk_max$157 | 0) > 0) { + $k$148 = 0; + $wk$149 = $17; + while (1) { + if ((HEAP32[$wk$149 >> 2] | 0) == ($69 | 0)) HEAP32[$wk$149 >> 2] = $66; + $k$148 = $k$148 + 1 | 0; + if (($k$148 | 0) >= ($wk_max$157 | 0)) { + $86 = $66; + break; + } else $wk$149 = $wk$149 + 4 | 0; + } + } else $86 = $66; + } + $88 = ($86 << 16 >> 16) * 7 | 0; + $90 = $labelInfo + 1310736 + ($88 + -7 << 2) | 0; + HEAP32[$90 >> 2] = (HEAP32[$90 >> 2] | 0) + 1; + $94 = $labelInfo + 1310736 + ($88 + -6 << 2) | 0; + HEAP32[$94 >> 2] = (HEAP32[$94 >> 2] | 0) + $i$255; + $98 = $labelInfo + 1310736 + ($88 + -5 << 2) | 0; + HEAP32[$98 >> 2] = (HEAP32[$98 >> 2] | 0) + $j$068; + HEAP32[$labelInfo + 1310736 + ($88 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $104 = HEAP16[$pnt2$362 + -2 >> 1] | 0; + if ($104 << 16 >> 16 <= 0) { + HEAP16[$pnt2$362 >> 1] = $57; + $144 = $58 * 7 | 0; + $146 = $labelInfo + 1310736 + ($144 + -7 << 2) | 0; + HEAP32[$146 >> 2] = (HEAP32[$146 >> 2] | 0) + 1; + $150 = $labelInfo + 1310736 + ($144 + -6 << 2) | 0; + HEAP32[$150 >> 2] = (HEAP32[$150 >> 2] | 0) + $i$255; + $154 = $labelInfo + 1310736 + ($144 + -5 << 2) | 0; + HEAP32[$154 >> 2] = (HEAP32[$154 >> 2] | 0) + $j$068; + $158 = $labelInfo + 1310736 + ($144 + -4 << 2) | 0; + if ((HEAP32[$158 >> 2] | 0) > ($i$255 | 0)) HEAP32[$158 >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($144 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $109 = HEAP32[$labelInfo + 1179664 + ($58 + -1 << 2) >> 2] | 0; + $112 = HEAP32[$labelInfo + 1179664 + (($104 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($109 | 0) > ($112 | 0)) { + HEAP16[$pnt2$362 >> 1] = $112; + if (($wk_max$157 | 0) > 0) { + $k$244 = 0; + $wk$245 = $17; + while (1) { + if ((HEAP32[$wk$245 >> 2] | 0) == ($109 | 0)) HEAP32[$wk$245 >> 2] = $112; + $k$244 = $k$244 + 1 | 0; + if (($k$244 | 0) >= ($wk_max$157 | 0)) { + $129 = $112; + break; + } else $wk$245 = $wk$245 + 4 | 0; + } + } else $129 = $112; + } else { + HEAP16[$pnt2$362 >> 1] = $109; + if (($109 | 0) < ($112 | 0) & ($wk_max$157 | 0) > 0) { + $k$341 = 0; + $wk$342 = $17; + while (1) { + if ((HEAP32[$wk$342 >> 2] | 0) == ($112 | 0)) HEAP32[$wk$342 >> 2] = $109; + $k$341 = $k$341 + 1 | 0; + if (($k$341 | 0) >= ($wk_max$157 | 0)) { + $129 = $109; + break; + } else $wk$342 = $wk$342 + 4 | 0; + } + } else $129 = $109; + } + $131 = ($129 << 16 >> 16) * 7 | 0; + $133 = $labelInfo + 1310736 + ($131 + -7 << 2) | 0; + HEAP32[$133 >> 2] = (HEAP32[$133 >> 2] | 0) + 1; + $137 = $labelInfo + 1310736 + ($131 + -6 << 2) | 0; + HEAP32[$137 >> 2] = (HEAP32[$137 >> 2] | 0) + $i$255; + $141 = $labelInfo + 1310736 + ($131 + -5 << 2) | 0; + HEAP32[$141 >> 2] = (HEAP32[$141 >> 2] | 0) + $j$068; + $wk_max$2 = $wk_max$157; + } while (0); + $i$255 = $i$255 + 1 | 0; + $223 = $pnt$163 + 4 | 0; + $224 = $pnt2$362 + 2 | 0; + if (($i$255 | 0) >= ($10 | 0)) { + $pnt$1$lcssa = $223; + $pnt2$3$lcssa = $224; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $pnt$163 = $223; + $pnt2$362 = $224; + $wk_max$157 = $wk_max$2; + } + } + } else { + $pnt$1$lcssa = $pnt$072; + $pnt2$3$lcssa = $pnt2$271; + $wk_max$1$lcssa = $wk_max$070; + } + $j$068 = $j$068 + 1 | 0; + if (($j$068 | 0) >= ($1 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $pnt$072 = $pnt$1$lcssa + 8 | 0; + $pnt2$271 = $pnt2$3$lcssa + 4 | 0; + $wk_max$070 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $230 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$337 = 1; + $j$138 = 1; + $wk$439 = $17; + while (1) { + $232 = HEAP32[$wk$439 >> 2] | 0; + if (($232 | 0) == ($i$337 | 0)) { + $238 = $j$138; + $j$2 = $j$138 + 1 | 0; + } else { + $238 = HEAP32[$labelInfo + 1179664 + ($232 + -1 << 2) >> 2] | 0; + $j$2 = $j$138; + } + HEAP32[$wk$439 >> 2] = $238; + if (($i$337 | 0) < ($wk_max$0$lcssa | 0)) { + $i$337 = $i$337 + 1 | 0; + $j$138 = $j$2; + $wk$439 = $wk$439 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $242 = $labelInfo + 8 | 0; + $243 = $j$1$lcssa + -1 | 0; + HEAP32[$242 >> 2] = $243; + if (!$243) $$0 = 0; else { + _memset($230 | 0, 0, $243 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $243 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$435 = 0; + do { + $250 = $i$435 << 2; + HEAP32[$labelInfo + 131084 + ($250 << 2) >> 2] = $xsize; + HEAP32[$labelInfo + 131084 + (($250 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($250 | 2) << 2) >> 2] = $ysize; + HEAP32[$labelInfo + 131084 + (($250 | 3) << 2) >> 2] = 0; + $i$435 = $i$435 + 1 | 0; + } while (($i$435 | 0) < (HEAP32[$242 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$533 = 0; + do { + $264 = (HEAP32[$labelInfo + 1179664 + ($i$533 << 2) >> 2] | 0) + -1 | 0; + $265 = $i$533 * 7 | 0; + $268 = $labelInfo + 12 + ($264 << 2) | 0; + HEAP32[$268 >> 2] = (HEAP32[$268 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($265 << 2) >> 2] | 0); + $275 = $264 << 1; + $276 = $labelInfo + 655376 + ($275 << 3) | 0; + HEAPF64[$276 >> 3] = +HEAPF64[$276 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($265 + 1 << 2) >> 2] | 0); + $284 = $labelInfo + 655376 + (($275 | 1) << 3) | 0; + HEAPF64[$284 >> 3] = +HEAPF64[$284 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($265 + 2 << 2) >> 2] | 0); + $287 = $264 << 2; + $288 = $labelInfo + 131084 + ($287 << 2) | 0; + $292 = HEAP32[$labelInfo + 1310736 + ($265 + 3 << 2) >> 2] | 0; + if ((HEAP32[$288 >> 2] | 0) > ($292 | 0)) HEAP32[$288 >> 2] = $292; + $295 = $labelInfo + 131084 + (($287 | 1) << 2) | 0; + $299 = HEAP32[$labelInfo + 1310736 + ($265 + 4 << 2) >> 2] | 0; + if ((HEAP32[$295 >> 2] | 0) < ($299 | 0)) HEAP32[$295 >> 2] = $299; + $302 = $labelInfo + 131084 + (($287 | 2) << 2) | 0; + $306 = HEAP32[$labelInfo + 1310736 + ($265 + 5 << 2) >> 2] | 0; + if ((HEAP32[$302 >> 2] | 0) > ($306 | 0)) HEAP32[$302 >> 2] = $306; + $309 = $labelInfo + 131084 + (($287 | 3) << 2) | 0; + $313 = HEAP32[$labelInfo + 1310736 + ($265 + 6 << 2) >> 2] | 0; + if ((HEAP32[$309 >> 2] | 0) < ($313 | 0)) HEAP32[$309 >> 2] = $313; + $i$533 = $i$533 + 1 | 0; + } while (($i$533 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$242 >> 2] | 0) > 0) { + $i$632 = 0; + do { + $317 = $labelInfo + 12 + ($i$632 << 2) | 0; + $320 = $i$632 << 1; + $321 = $labelInfo + 655376 + ($320 << 3) | 0; + HEAPF64[$321 >> 3] = +HEAPF64[$321 >> 3] / +(HEAP32[$317 >> 2] | 0); + $327 = $labelInfo + 655376 + (($320 | 1) << 3) | 0; + HEAPF64[$327 >> 3] = +HEAPF64[$327 >> 3] / +(HEAP32[$317 >> 2] | 0); + $i$632 = $i$632 + 1 | 0; + } while (($i$632 | 0) < (HEAP32[$242 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubDWR3C($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $0 = 0, $1 = 0, $10 = 0, $103 = 0, $108 = 0, $111 = 0, $128 = 0, $130 = 0, $132 = 0, $136 = 0, $140 = 0, $143 = 0, $145 = 0, $149 = 0, $153 = 0, $157 = 0, $162 = 0, $164 = 0, $168 = 0, $17 = 0, $172 = 0, $176 = 0, $18 = 0, $182 = 0, $185 = 0, $187 = 0, $19 = 0, $191 = 0, $195 = 0, $199 = 0, $202 = 0, $207 = 0, $222 = 0, $223 = 0, $229 = 0, $231 = 0, $237 = 0, $24 = 0, $241 = 0, $242 = 0, $249 = 0, $263 = 0, $264 = 0, $267 = 0, $274 = 0, $275 = 0, $283 = 0, $286 = 0, $287 = 0, $291 = 0, $294 = 0, $298 = 0, $301 = 0, $305 = 0, $308 = 0, $312 = 0, $316 = 0, $319 = 0, $320 = 0, $326 = 0, $37 = 0, $40 = 0, $42 = 0, $46 = 0, $50 = 0, $56 = 0, $57 = 0, $60 = 0, $61 = 0, $62 = 0, $65 = 0, $68 = 0, $85 = 0, $87 = 0, $89 = 0, $9 = 0, $93 = 0, $97 = 0, $i$081 = 0, $i$175 = 0, $i$255 = 0, $i$337 = 0, $i$435 = 0, $i$533 = 0, $i$632 = 0, $j$068 = 0, $j$1$lcssa = 0, $j$138 = 0, $j$2 = 0, $k$051 = 0, $k$148 = 0, $k$244 = 0, $k$341 = 0, $pnt$072 = 0, $pnt$1$lcssa = 0, $pnt$163 = 0, $pnt1$083 = 0, $pnt1$177 = 0, $pnt2$082 = 0, $pnt2$176 = 0, $pnt2$271 = 0, $pnt2$3$lcssa = 0, $pnt2$362 = 0, $vararg_buffer = 0, $wk$052 = 0, $wk$149 = 0, $wk$245 = 0, $wk$342 = 0, $wk$439 = 0, $wk_max$0$lcssa = 0, $wk_max$070 = 0, $wk_max$1$lcssa = 0, $wk_max$157 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = HEAP32[$labelInfo >> 2] | 0; + $1 = $ysize + -1 | 0; + if (($xsize | 0) > 0) { + $i$081 = 0; + $pnt1$083 = $0; + $pnt2$082 = $0 + ((Math_imul($1, $xsize) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$082 >> 1] = 0; + HEAP16[$pnt1$083 >> 1] = 0; + $i$081 = $i$081 + 1 | 0; + if (($i$081 | 0) >= ($xsize | 0)) break; else { + $pnt1$083 = $pnt1$083 + 2 | 0; + $pnt2$082 = $pnt2$082 + 2 | 0; + } + } + } + $9 = $labelingThresh * 3 | 0; + $10 = $xsize + -1 | 0; + if (($ysize | 0) > 0) { + $i$175 = 0; + $pnt1$177 = $0; + $pnt2$176 = $0 + ($10 << 1) | 0; + while (1) { + HEAP16[$pnt2$176 >> 1] = 0; + HEAP16[$pnt1$177 >> 1] = 0; + $i$175 = $i$175 + 1 | 0; + if (($i$175 | 0) >= ($ysize | 0)) break; else { + $pnt1$177 = $pnt1$177 + ($xsize << 1) | 0; + $pnt2$176 = $pnt2$176 + ($xsize << 1) | 0; + } + } + } + $17 = $labelInfo + 1179664 | 0; + $18 = $xsize + 1 | 0; + $19 = 0 - $xsize | 0; + $$sum = 1 - $xsize | 0; + $$sum1 = ~$xsize; + L11 : do if (($1 | 0) > 1) { + $24 = ($10 | 0) > 1; + $j$068 = 1; + $pnt$072 = $image + ($18 * 3 | 0) | 0; + $pnt2$271 = $0 + ($18 << 1) | 0; + $wk_max$070 = 0; + L13 : while (1) { + if ($24) { + $i$255 = 1; + $pnt$163 = $pnt$072; + $pnt2$362 = $pnt2$271; + $wk_max$157 = $wk_max$070; + while (1) { + do if (((HEAPU8[$pnt$163 + 1 >> 0] | 0) + (HEAPU8[$pnt$163 >> 0] | 0) + (HEAPU8[$pnt$163 + 2 >> 0] | 0) | 0) > ($9 | 0)) { + $37 = HEAP16[$pnt2$362 + ($19 << 1) >> 1] | 0; + if ($37 << 16 >> 16 > 0) { + HEAP16[$pnt2$362 >> 1] = $37; + $40 = ($37 << 16 >> 16) * 7 | 0; + $42 = $labelInfo + 1310736 + ($40 + -7 << 2) | 0; + HEAP32[$42 >> 2] = (HEAP32[$42 >> 2] | 0) + 1; + $46 = $labelInfo + 1310736 + ($40 + -6 << 2) | 0; + HEAP32[$46 >> 2] = (HEAP32[$46 >> 2] | 0) + $i$255; + $50 = $labelInfo + 1310736 + ($40 + -5 << 2) | 0; + HEAP32[$50 >> 2] = (HEAP32[$50 >> 2] | 0) + $j$068; + HEAP32[$labelInfo + 1310736 + ($40 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $56 = HEAP16[$pnt2$362 + ($$sum << 1) >> 1] | 0; + $57 = $56 << 16 >> 16; + $60 = HEAP16[$pnt2$362 + ($$sum1 << 1) >> 1] | 0; + $61 = $60 << 16 >> 16; + $62 = $60 << 16 >> 16 > 0; + if ($56 << 16 >> 16 <= 0) { + if ($62) { + HEAP16[$pnt2$362 >> 1] = $60; + $162 = $61 * 7 | 0; + $164 = $labelInfo + 1310736 + ($162 + -7 << 2) | 0; + HEAP32[$164 >> 2] = (HEAP32[$164 >> 2] | 0) + 1; + $168 = $labelInfo + 1310736 + ($162 + -6 << 2) | 0; + HEAP32[$168 >> 2] = (HEAP32[$168 >> 2] | 0) + $i$255; + $172 = $labelInfo + 1310736 + ($162 + -5 << 2) | 0; + HEAP32[$172 >> 2] = (HEAP32[$172 >> 2] | 0) + $j$068; + $176 = $labelInfo + 1310736 + ($162 + -3 << 2) | 0; + if ((HEAP32[$176 >> 2] | 0) < ($i$255 | 0)) HEAP32[$176 >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($162 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $182 = HEAP16[$pnt2$362 + -2 >> 1] | 0; + if ($182 << 16 >> 16 > 0) { + HEAP16[$pnt2$362 >> 1] = $182; + $185 = ($182 << 16 >> 16) * 7 | 0; + $187 = $labelInfo + 1310736 + ($185 + -7 << 2) | 0; + HEAP32[$187 >> 2] = (HEAP32[$187 >> 2] | 0) + 1; + $191 = $labelInfo + 1310736 + ($185 + -6 << 2) | 0; + HEAP32[$191 >> 2] = (HEAP32[$191 >> 2] | 0) + $i$255; + $195 = $labelInfo + 1310736 + ($185 + -5 << 2) | 0; + HEAP32[$195 >> 2] = (HEAP32[$195 >> 2] | 0) + $j$068; + $199 = $labelInfo + 1310736 + ($185 + -3 << 2) | 0; + if ((HEAP32[$199 >> 2] | 0) >= ($i$255 | 0)) { + $wk_max$2 = $wk_max$157; + break; + } + HEAP32[$199 >> 2] = $i$255; + $wk_max$2 = $wk_max$157; + break; + } else { + $202 = $wk_max$157 + 1 | 0; + if (($wk_max$157 | 0) > 32767) break L13; + HEAP16[$pnt2$362 >> 1] = $202; + HEAP32[$labelInfo + 1179664 + ($wk_max$157 << 2) >> 2] = $202 << 16 >> 16; + $207 = $wk_max$157 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($207 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($207 + 1 << 2) >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($207 + 2 << 2) >> 2] = $j$068; + HEAP32[$labelInfo + 1310736 + ($207 + 3 << 2) >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($207 + 4 << 2) >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($207 + 5 << 2) >> 2] = $j$068; + HEAP32[$labelInfo + 1310736 + ($207 + 6 << 2) >> 2] = $j$068; + $wk_max$2 = $202; + break; + } + } + if ($62) { + $65 = HEAP32[$labelInfo + 1179664 + ($57 + -1 << 2) >> 2] | 0; + $68 = HEAP32[$labelInfo + 1179664 + ($61 + -1 << 2) >> 2] | 0; + if (($65 | 0) > ($68 | 0)) { + HEAP16[$pnt2$362 >> 1] = $68; + if (($wk_max$157 | 0) > 0) { + $k$051 = 0; + $wk$052 = $17; + while (1) { + if ((HEAP32[$wk$052 >> 2] | 0) == ($65 | 0)) HEAP32[$wk$052 >> 2] = $68; + $k$051 = $k$051 + 1 | 0; + if (($k$051 | 0) >= ($wk_max$157 | 0)) { + $85 = $68; + break; + } else $wk$052 = $wk$052 + 4 | 0; + } + } else $85 = $68; + } else { + HEAP16[$pnt2$362 >> 1] = $65; + if (($65 | 0) < ($68 | 0) & ($wk_max$157 | 0) > 0) { + $k$148 = 0; + $wk$149 = $17; + while (1) { + if ((HEAP32[$wk$149 >> 2] | 0) == ($68 | 0)) HEAP32[$wk$149 >> 2] = $65; + $k$148 = $k$148 + 1 | 0; + if (($k$148 | 0) >= ($wk_max$157 | 0)) { + $85 = $65; + break; + } else $wk$149 = $wk$149 + 4 | 0; + } + } else $85 = $65; + } + $87 = ($85 << 16 >> 16) * 7 | 0; + $89 = $labelInfo + 1310736 + ($87 + -7 << 2) | 0; + HEAP32[$89 >> 2] = (HEAP32[$89 >> 2] | 0) + 1; + $93 = $labelInfo + 1310736 + ($87 + -6 << 2) | 0; + HEAP32[$93 >> 2] = (HEAP32[$93 >> 2] | 0) + $i$255; + $97 = $labelInfo + 1310736 + ($87 + -5 << 2) | 0; + HEAP32[$97 >> 2] = (HEAP32[$97 >> 2] | 0) + $j$068; + HEAP32[$labelInfo + 1310736 + ($87 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $103 = HEAP16[$pnt2$362 + -2 >> 1] | 0; + if ($103 << 16 >> 16 <= 0) { + HEAP16[$pnt2$362 >> 1] = $56; + $143 = $57 * 7 | 0; + $145 = $labelInfo + 1310736 + ($143 + -7 << 2) | 0; + HEAP32[$145 >> 2] = (HEAP32[$145 >> 2] | 0) + 1; + $149 = $labelInfo + 1310736 + ($143 + -6 << 2) | 0; + HEAP32[$149 >> 2] = (HEAP32[$149 >> 2] | 0) + $i$255; + $153 = $labelInfo + 1310736 + ($143 + -5 << 2) | 0; + HEAP32[$153 >> 2] = (HEAP32[$153 >> 2] | 0) + $j$068; + $157 = $labelInfo + 1310736 + ($143 + -4 << 2) | 0; + if ((HEAP32[$157 >> 2] | 0) > ($i$255 | 0)) HEAP32[$157 >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($143 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $108 = HEAP32[$labelInfo + 1179664 + ($57 + -1 << 2) >> 2] | 0; + $111 = HEAP32[$labelInfo + 1179664 + (($103 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($108 | 0) > ($111 | 0)) { + HEAP16[$pnt2$362 >> 1] = $111; + if (($wk_max$157 | 0) > 0) { + $k$244 = 0; + $wk$245 = $17; + while (1) { + if ((HEAP32[$wk$245 >> 2] | 0) == ($108 | 0)) HEAP32[$wk$245 >> 2] = $111; + $k$244 = $k$244 + 1 | 0; + if (($k$244 | 0) >= ($wk_max$157 | 0)) { + $128 = $111; + break; + } else $wk$245 = $wk$245 + 4 | 0; + } + } else $128 = $111; + } else { + HEAP16[$pnt2$362 >> 1] = $108; + if (($108 | 0) < ($111 | 0) & ($wk_max$157 | 0) > 0) { + $k$341 = 0; + $wk$342 = $17; + while (1) { + if ((HEAP32[$wk$342 >> 2] | 0) == ($111 | 0)) HEAP32[$wk$342 >> 2] = $108; + $k$341 = $k$341 + 1 | 0; + if (($k$341 | 0) >= ($wk_max$157 | 0)) { + $128 = $108; + break; + } else $wk$342 = $wk$342 + 4 | 0; + } + } else $128 = $108; + } + $130 = ($128 << 16 >> 16) * 7 | 0; + $132 = $labelInfo + 1310736 + ($130 + -7 << 2) | 0; + HEAP32[$132 >> 2] = (HEAP32[$132 >> 2] | 0) + 1; + $136 = $labelInfo + 1310736 + ($130 + -6 << 2) | 0; + HEAP32[$136 >> 2] = (HEAP32[$136 >> 2] | 0) + $i$255; + $140 = $labelInfo + 1310736 + ($130 + -5 << 2) | 0; + HEAP32[$140 >> 2] = (HEAP32[$140 >> 2] | 0) + $j$068; + $wk_max$2 = $wk_max$157; + } else { + HEAP16[$pnt2$362 >> 1] = 0; + $wk_max$2 = $wk_max$157; + } while (0); + $i$255 = $i$255 + 1 | 0; + $222 = $pnt$163 + 3 | 0; + $223 = $pnt2$362 + 2 | 0; + if (($i$255 | 0) >= ($10 | 0)) { + $pnt$1$lcssa = $222; + $pnt2$3$lcssa = $223; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $pnt$163 = $222; + $pnt2$362 = $223; + $wk_max$157 = $wk_max$2; + } + } + } else { + $pnt$1$lcssa = $pnt$072; + $pnt2$3$lcssa = $pnt2$271; + $wk_max$1$lcssa = $wk_max$070; + } + $j$068 = $j$068 + 1 | 0; + if (($j$068 | 0) >= ($1 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $pnt$072 = $pnt$1$lcssa + 6 | 0; + $pnt2$271 = $pnt2$3$lcssa + 4 | 0; + $wk_max$070 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $229 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$337 = 1; + $j$138 = 1; + $wk$439 = $17; + while (1) { + $231 = HEAP32[$wk$439 >> 2] | 0; + if (($231 | 0) == ($i$337 | 0)) { + $237 = $j$138; + $j$2 = $j$138 + 1 | 0; + } else { + $237 = HEAP32[$labelInfo + 1179664 + ($231 + -1 << 2) >> 2] | 0; + $j$2 = $j$138; + } + HEAP32[$wk$439 >> 2] = $237; + if (($i$337 | 0) < ($wk_max$0$lcssa | 0)) { + $i$337 = $i$337 + 1 | 0; + $j$138 = $j$2; + $wk$439 = $wk$439 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $241 = $labelInfo + 8 | 0; + $242 = $j$1$lcssa + -1 | 0; + HEAP32[$241 >> 2] = $242; + if (!$242) $$0 = 0; else { + _memset($229 | 0, 0, $242 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $242 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$435 = 0; + do { + $249 = $i$435 << 2; + HEAP32[$labelInfo + 131084 + ($249 << 2) >> 2] = $xsize; + HEAP32[$labelInfo + 131084 + (($249 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($249 | 2) << 2) >> 2] = $ysize; + HEAP32[$labelInfo + 131084 + (($249 | 3) << 2) >> 2] = 0; + $i$435 = $i$435 + 1 | 0; + } while (($i$435 | 0) < (HEAP32[$241 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$533 = 0; + do { + $263 = (HEAP32[$labelInfo + 1179664 + ($i$533 << 2) >> 2] | 0) + -1 | 0; + $264 = $i$533 * 7 | 0; + $267 = $labelInfo + 12 + ($263 << 2) | 0; + HEAP32[$267 >> 2] = (HEAP32[$267 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($264 << 2) >> 2] | 0); + $274 = $263 << 1; + $275 = $labelInfo + 655376 + ($274 << 3) | 0; + HEAPF64[$275 >> 3] = +HEAPF64[$275 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($264 + 1 << 2) >> 2] | 0); + $283 = $labelInfo + 655376 + (($274 | 1) << 3) | 0; + HEAPF64[$283 >> 3] = +HEAPF64[$283 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($264 + 2 << 2) >> 2] | 0); + $286 = $263 << 2; + $287 = $labelInfo + 131084 + ($286 << 2) | 0; + $291 = HEAP32[$labelInfo + 1310736 + ($264 + 3 << 2) >> 2] | 0; + if ((HEAP32[$287 >> 2] | 0) > ($291 | 0)) HEAP32[$287 >> 2] = $291; + $294 = $labelInfo + 131084 + (($286 | 1) << 2) | 0; + $298 = HEAP32[$labelInfo + 1310736 + ($264 + 4 << 2) >> 2] | 0; + if ((HEAP32[$294 >> 2] | 0) < ($298 | 0)) HEAP32[$294 >> 2] = $298; + $301 = $labelInfo + 131084 + (($286 | 2) << 2) | 0; + $305 = HEAP32[$labelInfo + 1310736 + ($264 + 5 << 2) >> 2] | 0; + if ((HEAP32[$301 >> 2] | 0) > ($305 | 0)) HEAP32[$301 >> 2] = $305; + $308 = $labelInfo + 131084 + (($286 | 3) << 2) | 0; + $312 = HEAP32[$labelInfo + 1310736 + ($264 + 6 << 2) >> 2] | 0; + if ((HEAP32[$308 >> 2] | 0) < ($312 | 0)) HEAP32[$308 >> 2] = $312; + $i$533 = $i$533 + 1 | 0; + } while (($i$533 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$241 >> 2] | 0) > 0) { + $i$632 = 0; + do { + $316 = $labelInfo + 12 + ($i$632 << 2) | 0; + $319 = $i$632 << 1; + $320 = $labelInfo + 655376 + ($319 << 3) | 0; + HEAPF64[$320 >> 3] = +HEAPF64[$320 >> 3] / +(HEAP32[$316 >> 2] | 0); + $326 = $labelInfo + 655376 + (($319 | 1) << 3) | 0; + HEAPF64[$326 >> 3] = +HEAPF64[$326 >> 3] / +(HEAP32[$316 >> 2] | 0); + $i$632 = $i$632 + 1 | 0; + } while (($i$632 | 0) < (HEAP32[$241 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubDBR3C($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $0 = 0, $1 = 0, $10 = 0, $103 = 0, $108 = 0, $111 = 0, $128 = 0, $130 = 0, $132 = 0, $136 = 0, $140 = 0, $143 = 0, $145 = 0, $149 = 0, $153 = 0, $157 = 0, $162 = 0, $164 = 0, $168 = 0, $17 = 0, $172 = 0, $176 = 0, $18 = 0, $182 = 0, $185 = 0, $187 = 0, $19 = 0, $191 = 0, $195 = 0, $199 = 0, $202 = 0, $207 = 0, $222 = 0, $223 = 0, $229 = 0, $231 = 0, $237 = 0, $24 = 0, $241 = 0, $242 = 0, $249 = 0, $263 = 0, $264 = 0, $267 = 0, $274 = 0, $275 = 0, $283 = 0, $286 = 0, $287 = 0, $291 = 0, $294 = 0, $298 = 0, $301 = 0, $305 = 0, $308 = 0, $312 = 0, $316 = 0, $319 = 0, $320 = 0, $326 = 0, $37 = 0, $40 = 0, $42 = 0, $46 = 0, $50 = 0, $56 = 0, $57 = 0, $60 = 0, $61 = 0, $62 = 0, $65 = 0, $68 = 0, $85 = 0, $87 = 0, $89 = 0, $9 = 0, $93 = 0, $97 = 0, $i$081 = 0, $i$175 = 0, $i$255 = 0, $i$337 = 0, $i$435 = 0, $i$533 = 0, $i$632 = 0, $j$068 = 0, $j$1$lcssa = 0, $j$138 = 0, $j$2 = 0, $k$051 = 0, $k$148 = 0, $k$244 = 0, $k$341 = 0, $pnt$072 = 0, $pnt$1$lcssa = 0, $pnt$163 = 0, $pnt1$083 = 0, $pnt1$177 = 0, $pnt2$082 = 0, $pnt2$176 = 0, $pnt2$271 = 0, $pnt2$3$lcssa = 0, $pnt2$362 = 0, $vararg_buffer = 0, $wk$052 = 0, $wk$149 = 0, $wk$245 = 0, $wk$342 = 0, $wk$439 = 0, $wk_max$0$lcssa = 0, $wk_max$070 = 0, $wk_max$1$lcssa = 0, $wk_max$157 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = HEAP32[$labelInfo >> 2] | 0; + $1 = $ysize + -1 | 0; + if (($xsize | 0) > 0) { + $i$081 = 0; + $pnt1$083 = $0; + $pnt2$082 = $0 + ((Math_imul($1, $xsize) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$082 >> 1] = 0; + HEAP16[$pnt1$083 >> 1] = 0; + $i$081 = $i$081 + 1 | 0; + if (($i$081 | 0) >= ($xsize | 0)) break; else { + $pnt1$083 = $pnt1$083 + 2 | 0; + $pnt2$082 = $pnt2$082 + 2 | 0; + } + } + } + $9 = $labelingThresh * 3 | 0; + $10 = $xsize + -1 | 0; + if (($ysize | 0) > 0) { + $i$175 = 0; + $pnt1$177 = $0; + $pnt2$176 = $0 + ($10 << 1) | 0; + while (1) { + HEAP16[$pnt2$176 >> 1] = 0; + HEAP16[$pnt1$177 >> 1] = 0; + $i$175 = $i$175 + 1 | 0; + if (($i$175 | 0) >= ($ysize | 0)) break; else { + $pnt1$177 = $pnt1$177 + ($xsize << 1) | 0; + $pnt2$176 = $pnt2$176 + ($xsize << 1) | 0; + } + } + } + $17 = $labelInfo + 1179664 | 0; + $18 = $xsize + 1 | 0; + $19 = 0 - $xsize | 0; + $$sum = 1 - $xsize | 0; + $$sum1 = ~$xsize; + L11 : do if (($1 | 0) > 1) { + $24 = ($10 | 0) > 1; + $j$068 = 1; + $pnt$072 = $image + ($18 * 3 | 0) | 0; + $pnt2$271 = $0 + ($18 << 1) | 0; + $wk_max$070 = 0; + L13 : while (1) { + if ($24) { + $i$255 = 1; + $pnt$163 = $pnt$072; + $pnt2$362 = $pnt2$271; + $wk_max$157 = $wk_max$070; + while (1) { + do if (((HEAPU8[$pnt$163 + 1 >> 0] | 0) + (HEAPU8[$pnt$163 >> 0] | 0) + (HEAPU8[$pnt$163 + 2 >> 0] | 0) | 0) > ($9 | 0)) { + HEAP16[$pnt2$362 >> 1] = 0; + $wk_max$2 = $wk_max$157; + } else { + $37 = HEAP16[$pnt2$362 + ($19 << 1) >> 1] | 0; + if ($37 << 16 >> 16 > 0) { + HEAP16[$pnt2$362 >> 1] = $37; + $40 = ($37 << 16 >> 16) * 7 | 0; + $42 = $labelInfo + 1310736 + ($40 + -7 << 2) | 0; + HEAP32[$42 >> 2] = (HEAP32[$42 >> 2] | 0) + 1; + $46 = $labelInfo + 1310736 + ($40 + -6 << 2) | 0; + HEAP32[$46 >> 2] = (HEAP32[$46 >> 2] | 0) + $i$255; + $50 = $labelInfo + 1310736 + ($40 + -5 << 2) | 0; + HEAP32[$50 >> 2] = (HEAP32[$50 >> 2] | 0) + $j$068; + HEAP32[$labelInfo + 1310736 + ($40 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $56 = HEAP16[$pnt2$362 + ($$sum << 1) >> 1] | 0; + $57 = $56 << 16 >> 16; + $60 = HEAP16[$pnt2$362 + ($$sum1 << 1) >> 1] | 0; + $61 = $60 << 16 >> 16; + $62 = $60 << 16 >> 16 > 0; + if ($56 << 16 >> 16 <= 0) { + if ($62) { + HEAP16[$pnt2$362 >> 1] = $60; + $162 = $61 * 7 | 0; + $164 = $labelInfo + 1310736 + ($162 + -7 << 2) | 0; + HEAP32[$164 >> 2] = (HEAP32[$164 >> 2] | 0) + 1; + $168 = $labelInfo + 1310736 + ($162 + -6 << 2) | 0; + HEAP32[$168 >> 2] = (HEAP32[$168 >> 2] | 0) + $i$255; + $172 = $labelInfo + 1310736 + ($162 + -5 << 2) | 0; + HEAP32[$172 >> 2] = (HEAP32[$172 >> 2] | 0) + $j$068; + $176 = $labelInfo + 1310736 + ($162 + -3 << 2) | 0; + if ((HEAP32[$176 >> 2] | 0) < ($i$255 | 0)) HEAP32[$176 >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($162 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $182 = HEAP16[$pnt2$362 + -2 >> 1] | 0; + if ($182 << 16 >> 16 > 0) { + HEAP16[$pnt2$362 >> 1] = $182; + $185 = ($182 << 16 >> 16) * 7 | 0; + $187 = $labelInfo + 1310736 + ($185 + -7 << 2) | 0; + HEAP32[$187 >> 2] = (HEAP32[$187 >> 2] | 0) + 1; + $191 = $labelInfo + 1310736 + ($185 + -6 << 2) | 0; + HEAP32[$191 >> 2] = (HEAP32[$191 >> 2] | 0) + $i$255; + $195 = $labelInfo + 1310736 + ($185 + -5 << 2) | 0; + HEAP32[$195 >> 2] = (HEAP32[$195 >> 2] | 0) + $j$068; + $199 = $labelInfo + 1310736 + ($185 + -3 << 2) | 0; + if ((HEAP32[$199 >> 2] | 0) >= ($i$255 | 0)) { + $wk_max$2 = $wk_max$157; + break; + } + HEAP32[$199 >> 2] = $i$255; + $wk_max$2 = $wk_max$157; + break; + } else { + $202 = $wk_max$157 + 1 | 0; + if (($wk_max$157 | 0) > 32767) break L13; + HEAP16[$pnt2$362 >> 1] = $202; + HEAP32[$labelInfo + 1179664 + ($wk_max$157 << 2) >> 2] = $202 << 16 >> 16; + $207 = $wk_max$157 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($207 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($207 + 1 << 2) >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($207 + 2 << 2) >> 2] = $j$068; + HEAP32[$labelInfo + 1310736 + ($207 + 3 << 2) >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($207 + 4 << 2) >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($207 + 5 << 2) >> 2] = $j$068; + HEAP32[$labelInfo + 1310736 + ($207 + 6 << 2) >> 2] = $j$068; + $wk_max$2 = $202; + break; + } + } + if ($62) { + $65 = HEAP32[$labelInfo + 1179664 + ($57 + -1 << 2) >> 2] | 0; + $68 = HEAP32[$labelInfo + 1179664 + ($61 + -1 << 2) >> 2] | 0; + if (($65 | 0) > ($68 | 0)) { + HEAP16[$pnt2$362 >> 1] = $68; + if (($wk_max$157 | 0) > 0) { + $k$051 = 0; + $wk$052 = $17; + while (1) { + if ((HEAP32[$wk$052 >> 2] | 0) == ($65 | 0)) HEAP32[$wk$052 >> 2] = $68; + $k$051 = $k$051 + 1 | 0; + if (($k$051 | 0) >= ($wk_max$157 | 0)) { + $85 = $68; + break; + } else $wk$052 = $wk$052 + 4 | 0; + } + } else $85 = $68; + } else { + HEAP16[$pnt2$362 >> 1] = $65; + if (($65 | 0) < ($68 | 0) & ($wk_max$157 | 0) > 0) { + $k$148 = 0; + $wk$149 = $17; + while (1) { + if ((HEAP32[$wk$149 >> 2] | 0) == ($68 | 0)) HEAP32[$wk$149 >> 2] = $65; + $k$148 = $k$148 + 1 | 0; + if (($k$148 | 0) >= ($wk_max$157 | 0)) { + $85 = $65; + break; + } else $wk$149 = $wk$149 + 4 | 0; + } + } else $85 = $65; + } + $87 = ($85 << 16 >> 16) * 7 | 0; + $89 = $labelInfo + 1310736 + ($87 + -7 << 2) | 0; + HEAP32[$89 >> 2] = (HEAP32[$89 >> 2] | 0) + 1; + $93 = $labelInfo + 1310736 + ($87 + -6 << 2) | 0; + HEAP32[$93 >> 2] = (HEAP32[$93 >> 2] | 0) + $i$255; + $97 = $labelInfo + 1310736 + ($87 + -5 << 2) | 0; + HEAP32[$97 >> 2] = (HEAP32[$97 >> 2] | 0) + $j$068; + HEAP32[$labelInfo + 1310736 + ($87 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $103 = HEAP16[$pnt2$362 + -2 >> 1] | 0; + if ($103 << 16 >> 16 <= 0) { + HEAP16[$pnt2$362 >> 1] = $56; + $143 = $57 * 7 | 0; + $145 = $labelInfo + 1310736 + ($143 + -7 << 2) | 0; + HEAP32[$145 >> 2] = (HEAP32[$145 >> 2] | 0) + 1; + $149 = $labelInfo + 1310736 + ($143 + -6 << 2) | 0; + HEAP32[$149 >> 2] = (HEAP32[$149 >> 2] | 0) + $i$255; + $153 = $labelInfo + 1310736 + ($143 + -5 << 2) | 0; + HEAP32[$153 >> 2] = (HEAP32[$153 >> 2] | 0) + $j$068; + $157 = $labelInfo + 1310736 + ($143 + -4 << 2) | 0; + if ((HEAP32[$157 >> 2] | 0) > ($i$255 | 0)) HEAP32[$157 >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($143 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $108 = HEAP32[$labelInfo + 1179664 + ($57 + -1 << 2) >> 2] | 0; + $111 = HEAP32[$labelInfo + 1179664 + (($103 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($108 | 0) > ($111 | 0)) { + HEAP16[$pnt2$362 >> 1] = $111; + if (($wk_max$157 | 0) > 0) { + $k$244 = 0; + $wk$245 = $17; + while (1) { + if ((HEAP32[$wk$245 >> 2] | 0) == ($108 | 0)) HEAP32[$wk$245 >> 2] = $111; + $k$244 = $k$244 + 1 | 0; + if (($k$244 | 0) >= ($wk_max$157 | 0)) { + $128 = $111; + break; + } else $wk$245 = $wk$245 + 4 | 0; + } + } else $128 = $111; + } else { + HEAP16[$pnt2$362 >> 1] = $108; + if (($108 | 0) < ($111 | 0) & ($wk_max$157 | 0) > 0) { + $k$341 = 0; + $wk$342 = $17; + while (1) { + if ((HEAP32[$wk$342 >> 2] | 0) == ($111 | 0)) HEAP32[$wk$342 >> 2] = $108; + $k$341 = $k$341 + 1 | 0; + if (($k$341 | 0) >= ($wk_max$157 | 0)) { + $128 = $108; + break; + } else $wk$342 = $wk$342 + 4 | 0; + } + } else $128 = $108; + } + $130 = ($128 << 16 >> 16) * 7 | 0; + $132 = $labelInfo + 1310736 + ($130 + -7 << 2) | 0; + HEAP32[$132 >> 2] = (HEAP32[$132 >> 2] | 0) + 1; + $136 = $labelInfo + 1310736 + ($130 + -6 << 2) | 0; + HEAP32[$136 >> 2] = (HEAP32[$136 >> 2] | 0) + $i$255; + $140 = $labelInfo + 1310736 + ($130 + -5 << 2) | 0; + HEAP32[$140 >> 2] = (HEAP32[$140 >> 2] | 0) + $j$068; + $wk_max$2 = $wk_max$157; + } while (0); + $i$255 = $i$255 + 1 | 0; + $222 = $pnt$163 + 3 | 0; + $223 = $pnt2$362 + 2 | 0; + if (($i$255 | 0) >= ($10 | 0)) { + $pnt$1$lcssa = $222; + $pnt2$3$lcssa = $223; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $pnt$163 = $222; + $pnt2$362 = $223; + $wk_max$157 = $wk_max$2; + } + } + } else { + $pnt$1$lcssa = $pnt$072; + $pnt2$3$lcssa = $pnt2$271; + $wk_max$1$lcssa = $wk_max$070; + } + $j$068 = $j$068 + 1 | 0; + if (($j$068 | 0) >= ($1 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $pnt$072 = $pnt$1$lcssa + 6 | 0; + $pnt2$271 = $pnt2$3$lcssa + 4 | 0; + $wk_max$070 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $229 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$337 = 1; + $j$138 = 1; + $wk$439 = $17; + while (1) { + $231 = HEAP32[$wk$439 >> 2] | 0; + if (($231 | 0) == ($i$337 | 0)) { + $237 = $j$138; + $j$2 = $j$138 + 1 | 0; + } else { + $237 = HEAP32[$labelInfo + 1179664 + ($231 + -1 << 2) >> 2] | 0; + $j$2 = $j$138; + } + HEAP32[$wk$439 >> 2] = $237; + if (($i$337 | 0) < ($wk_max$0$lcssa | 0)) { + $i$337 = $i$337 + 1 | 0; + $j$138 = $j$2; + $wk$439 = $wk$439 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $241 = $labelInfo + 8 | 0; + $242 = $j$1$lcssa + -1 | 0; + HEAP32[$241 >> 2] = $242; + if (!$242) $$0 = 0; else { + _memset($229 | 0, 0, $242 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $242 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$435 = 0; + do { + $249 = $i$435 << 2; + HEAP32[$labelInfo + 131084 + ($249 << 2) >> 2] = $xsize; + HEAP32[$labelInfo + 131084 + (($249 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($249 | 2) << 2) >> 2] = $ysize; + HEAP32[$labelInfo + 131084 + (($249 | 3) << 2) >> 2] = 0; + $i$435 = $i$435 + 1 | 0; + } while (($i$435 | 0) < (HEAP32[$241 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$533 = 0; + do { + $263 = (HEAP32[$labelInfo + 1179664 + ($i$533 << 2) >> 2] | 0) + -1 | 0; + $264 = $i$533 * 7 | 0; + $267 = $labelInfo + 12 + ($263 << 2) | 0; + HEAP32[$267 >> 2] = (HEAP32[$267 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($264 << 2) >> 2] | 0); + $274 = $263 << 1; + $275 = $labelInfo + 655376 + ($274 << 3) | 0; + HEAPF64[$275 >> 3] = +HEAPF64[$275 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($264 + 1 << 2) >> 2] | 0); + $283 = $labelInfo + 655376 + (($274 | 1) << 3) | 0; + HEAPF64[$283 >> 3] = +HEAPF64[$283 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($264 + 2 << 2) >> 2] | 0); + $286 = $263 << 2; + $287 = $labelInfo + 131084 + ($286 << 2) | 0; + $291 = HEAP32[$labelInfo + 1310736 + ($264 + 3 << 2) >> 2] | 0; + if ((HEAP32[$287 >> 2] | 0) > ($291 | 0)) HEAP32[$287 >> 2] = $291; + $294 = $labelInfo + 131084 + (($286 | 1) << 2) | 0; + $298 = HEAP32[$labelInfo + 1310736 + ($264 + 4 << 2) >> 2] | 0; + if ((HEAP32[$294 >> 2] | 0) < ($298 | 0)) HEAP32[$294 >> 2] = $298; + $301 = $labelInfo + 131084 + (($286 | 2) << 2) | 0; + $305 = HEAP32[$labelInfo + 1310736 + ($264 + 5 << 2) >> 2] | 0; + if ((HEAP32[$301 >> 2] | 0) > ($305 | 0)) HEAP32[$301 >> 2] = $305; + $308 = $labelInfo + 131084 + (($286 | 3) << 2) | 0; + $312 = HEAP32[$labelInfo + 1310736 + ($264 + 6 << 2) >> 2] | 0; + if ((HEAP32[$308 >> 2] | 0) < ($312 | 0)) HEAP32[$308 >> 2] = $312; + $i$533 = $i$533 + 1 | 0; + } while (($i$533 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$241 >> 2] | 0) > 0) { + $i$632 = 0; + do { + $316 = $labelInfo + 12 + ($i$632 << 2) | 0; + $319 = $i$632 << 1; + $320 = $labelInfo + 655376 + ($319 << 3) | 0; + HEAPF64[$320 >> 3] = +HEAPF64[$320 >> 3] / +(HEAP32[$316 >> 2] | 0); + $326 = $labelInfo + 655376 + (($319 | 1) << 3) | 0; + HEAPF64[$326 >> 3] = +HEAPF64[$326 >> 3] / +(HEAP32[$316 >> 2] | 0); + $i$632 = $i$632 + 1 | 0; + } while (($i$632 | 0) < (HEAP32[$241 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubDWR3CA($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $0 = 0, $1 = 0, $10 = 0, $103 = 0, $108 = 0, $111 = 0, $128 = 0, $130 = 0, $132 = 0, $136 = 0, $140 = 0, $143 = 0, $145 = 0, $149 = 0, $153 = 0, $157 = 0, $162 = 0, $164 = 0, $168 = 0, $17 = 0, $172 = 0, $176 = 0, $18 = 0, $182 = 0, $185 = 0, $187 = 0, $19 = 0, $191 = 0, $195 = 0, $199 = 0, $202 = 0, $207 = 0, $222 = 0, $223 = 0, $229 = 0, $231 = 0, $237 = 0, $24 = 0, $241 = 0, $242 = 0, $249 = 0, $263 = 0, $264 = 0, $267 = 0, $274 = 0, $275 = 0, $283 = 0, $286 = 0, $287 = 0, $291 = 0, $294 = 0, $298 = 0, $301 = 0, $305 = 0, $308 = 0, $312 = 0, $316 = 0, $319 = 0, $320 = 0, $326 = 0, $37 = 0, $40 = 0, $42 = 0, $46 = 0, $50 = 0, $56 = 0, $57 = 0, $60 = 0, $61 = 0, $62 = 0, $65 = 0, $68 = 0, $85 = 0, $87 = 0, $89 = 0, $9 = 0, $93 = 0, $97 = 0, $i$081 = 0, $i$175 = 0, $i$255 = 0, $i$337 = 0, $i$435 = 0, $i$533 = 0, $i$632 = 0, $j$068 = 0, $j$1$lcssa = 0, $j$138 = 0, $j$2 = 0, $k$051 = 0, $k$148 = 0, $k$244 = 0, $k$341 = 0, $pnt$072 = 0, $pnt$1$lcssa = 0, $pnt$163 = 0, $pnt1$083 = 0, $pnt1$177 = 0, $pnt2$082 = 0, $pnt2$176 = 0, $pnt2$271 = 0, $pnt2$3$lcssa = 0, $pnt2$362 = 0, $vararg_buffer = 0, $wk$052 = 0, $wk$149 = 0, $wk$245 = 0, $wk$342 = 0, $wk$439 = 0, $wk_max$0$lcssa = 0, $wk_max$070 = 0, $wk_max$1$lcssa = 0, $wk_max$157 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = HEAP32[$labelInfo >> 2] | 0; + $1 = $ysize + -1 | 0; + if (($xsize | 0) > 0) { + $i$081 = 0; + $pnt1$083 = $0; + $pnt2$082 = $0 + ((Math_imul($1, $xsize) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$082 >> 1] = 0; + HEAP16[$pnt1$083 >> 1] = 0; + $i$081 = $i$081 + 1 | 0; + if (($i$081 | 0) >= ($xsize | 0)) break; else { + $pnt1$083 = $pnt1$083 + 2 | 0; + $pnt2$082 = $pnt2$082 + 2 | 0; + } + } + } + $9 = $labelingThresh * 3 | 0; + $10 = $xsize + -1 | 0; + if (($ysize | 0) > 0) { + $i$175 = 0; + $pnt1$177 = $0; + $pnt2$176 = $0 + ($10 << 1) | 0; + while (1) { + HEAP16[$pnt2$176 >> 1] = 0; + HEAP16[$pnt1$177 >> 1] = 0; + $i$175 = $i$175 + 1 | 0; + if (($i$175 | 0) >= ($ysize | 0)) break; else { + $pnt1$177 = $pnt1$177 + ($xsize << 1) | 0; + $pnt2$176 = $pnt2$176 + ($xsize << 1) | 0; + } + } + } + $17 = $labelInfo + 1179664 | 0; + $18 = $xsize + 1 | 0; + $19 = 0 - $xsize | 0; + $$sum = 1 - $xsize | 0; + $$sum1 = ~$xsize; + L11 : do if (($1 | 0) > 1) { + $24 = ($10 | 0) > 1; + $j$068 = 1; + $pnt$072 = $image + ($18 << 2) | 0; + $pnt2$271 = $0 + ($18 << 1) | 0; + $wk_max$070 = 0; + L13 : while (1) { + if ($24) { + $i$255 = 1; + $pnt$163 = $pnt$072; + $pnt2$362 = $pnt2$271; + $wk_max$157 = $wk_max$070; + while (1) { + do if (((HEAPU8[$pnt$163 + 1 >> 0] | 0) + (HEAPU8[$pnt$163 >> 0] | 0) + (HEAPU8[$pnt$163 + 2 >> 0] | 0) | 0) > ($9 | 0)) { + $37 = HEAP16[$pnt2$362 + ($19 << 1) >> 1] | 0; + if ($37 << 16 >> 16 > 0) { + HEAP16[$pnt2$362 >> 1] = $37; + $40 = ($37 << 16 >> 16) * 7 | 0; + $42 = $labelInfo + 1310736 + ($40 + -7 << 2) | 0; + HEAP32[$42 >> 2] = (HEAP32[$42 >> 2] | 0) + 1; + $46 = $labelInfo + 1310736 + ($40 + -6 << 2) | 0; + HEAP32[$46 >> 2] = (HEAP32[$46 >> 2] | 0) + $i$255; + $50 = $labelInfo + 1310736 + ($40 + -5 << 2) | 0; + HEAP32[$50 >> 2] = (HEAP32[$50 >> 2] | 0) + $j$068; + HEAP32[$labelInfo + 1310736 + ($40 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $56 = HEAP16[$pnt2$362 + ($$sum << 1) >> 1] | 0; + $57 = $56 << 16 >> 16; + $60 = HEAP16[$pnt2$362 + ($$sum1 << 1) >> 1] | 0; + $61 = $60 << 16 >> 16; + $62 = $60 << 16 >> 16 > 0; + if ($56 << 16 >> 16 <= 0) { + if ($62) { + HEAP16[$pnt2$362 >> 1] = $60; + $162 = $61 * 7 | 0; + $164 = $labelInfo + 1310736 + ($162 + -7 << 2) | 0; + HEAP32[$164 >> 2] = (HEAP32[$164 >> 2] | 0) + 1; + $168 = $labelInfo + 1310736 + ($162 + -6 << 2) | 0; + HEAP32[$168 >> 2] = (HEAP32[$168 >> 2] | 0) + $i$255; + $172 = $labelInfo + 1310736 + ($162 + -5 << 2) | 0; + HEAP32[$172 >> 2] = (HEAP32[$172 >> 2] | 0) + $j$068; + $176 = $labelInfo + 1310736 + ($162 + -3 << 2) | 0; + if ((HEAP32[$176 >> 2] | 0) < ($i$255 | 0)) HEAP32[$176 >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($162 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $182 = HEAP16[$pnt2$362 + -2 >> 1] | 0; + if ($182 << 16 >> 16 > 0) { + HEAP16[$pnt2$362 >> 1] = $182; + $185 = ($182 << 16 >> 16) * 7 | 0; + $187 = $labelInfo + 1310736 + ($185 + -7 << 2) | 0; + HEAP32[$187 >> 2] = (HEAP32[$187 >> 2] | 0) + 1; + $191 = $labelInfo + 1310736 + ($185 + -6 << 2) | 0; + HEAP32[$191 >> 2] = (HEAP32[$191 >> 2] | 0) + $i$255; + $195 = $labelInfo + 1310736 + ($185 + -5 << 2) | 0; + HEAP32[$195 >> 2] = (HEAP32[$195 >> 2] | 0) + $j$068; + $199 = $labelInfo + 1310736 + ($185 + -3 << 2) | 0; + if ((HEAP32[$199 >> 2] | 0) >= ($i$255 | 0)) { + $wk_max$2 = $wk_max$157; + break; + } + HEAP32[$199 >> 2] = $i$255; + $wk_max$2 = $wk_max$157; + break; + } else { + $202 = $wk_max$157 + 1 | 0; + if (($wk_max$157 | 0) > 32767) break L13; + HEAP16[$pnt2$362 >> 1] = $202; + HEAP32[$labelInfo + 1179664 + ($wk_max$157 << 2) >> 2] = $202 << 16 >> 16; + $207 = $wk_max$157 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($207 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($207 + 1 << 2) >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($207 + 2 << 2) >> 2] = $j$068; + HEAP32[$labelInfo + 1310736 + ($207 + 3 << 2) >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($207 + 4 << 2) >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($207 + 5 << 2) >> 2] = $j$068; + HEAP32[$labelInfo + 1310736 + ($207 + 6 << 2) >> 2] = $j$068; + $wk_max$2 = $202; + break; + } + } + if ($62) { + $65 = HEAP32[$labelInfo + 1179664 + ($57 + -1 << 2) >> 2] | 0; + $68 = HEAP32[$labelInfo + 1179664 + ($61 + -1 << 2) >> 2] | 0; + if (($65 | 0) > ($68 | 0)) { + HEAP16[$pnt2$362 >> 1] = $68; + if (($wk_max$157 | 0) > 0) { + $k$051 = 0; + $wk$052 = $17; + while (1) { + if ((HEAP32[$wk$052 >> 2] | 0) == ($65 | 0)) HEAP32[$wk$052 >> 2] = $68; + $k$051 = $k$051 + 1 | 0; + if (($k$051 | 0) >= ($wk_max$157 | 0)) { + $85 = $68; + break; + } else $wk$052 = $wk$052 + 4 | 0; + } + } else $85 = $68; + } else { + HEAP16[$pnt2$362 >> 1] = $65; + if (($65 | 0) < ($68 | 0) & ($wk_max$157 | 0) > 0) { + $k$148 = 0; + $wk$149 = $17; + while (1) { + if ((HEAP32[$wk$149 >> 2] | 0) == ($68 | 0)) HEAP32[$wk$149 >> 2] = $65; + $k$148 = $k$148 + 1 | 0; + if (($k$148 | 0) >= ($wk_max$157 | 0)) { + $85 = $65; + break; + } else $wk$149 = $wk$149 + 4 | 0; + } + } else $85 = $65; + } + $87 = ($85 << 16 >> 16) * 7 | 0; + $89 = $labelInfo + 1310736 + ($87 + -7 << 2) | 0; + HEAP32[$89 >> 2] = (HEAP32[$89 >> 2] | 0) + 1; + $93 = $labelInfo + 1310736 + ($87 + -6 << 2) | 0; + HEAP32[$93 >> 2] = (HEAP32[$93 >> 2] | 0) + $i$255; + $97 = $labelInfo + 1310736 + ($87 + -5 << 2) | 0; + HEAP32[$97 >> 2] = (HEAP32[$97 >> 2] | 0) + $j$068; + HEAP32[$labelInfo + 1310736 + ($87 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $103 = HEAP16[$pnt2$362 + -2 >> 1] | 0; + if ($103 << 16 >> 16 <= 0) { + HEAP16[$pnt2$362 >> 1] = $56; + $143 = $57 * 7 | 0; + $145 = $labelInfo + 1310736 + ($143 + -7 << 2) | 0; + HEAP32[$145 >> 2] = (HEAP32[$145 >> 2] | 0) + 1; + $149 = $labelInfo + 1310736 + ($143 + -6 << 2) | 0; + HEAP32[$149 >> 2] = (HEAP32[$149 >> 2] | 0) + $i$255; + $153 = $labelInfo + 1310736 + ($143 + -5 << 2) | 0; + HEAP32[$153 >> 2] = (HEAP32[$153 >> 2] | 0) + $j$068; + $157 = $labelInfo + 1310736 + ($143 + -4 << 2) | 0; + if ((HEAP32[$157 >> 2] | 0) > ($i$255 | 0)) HEAP32[$157 >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($143 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $108 = HEAP32[$labelInfo + 1179664 + ($57 + -1 << 2) >> 2] | 0; + $111 = HEAP32[$labelInfo + 1179664 + (($103 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($108 | 0) > ($111 | 0)) { + HEAP16[$pnt2$362 >> 1] = $111; + if (($wk_max$157 | 0) > 0) { + $k$244 = 0; + $wk$245 = $17; + while (1) { + if ((HEAP32[$wk$245 >> 2] | 0) == ($108 | 0)) HEAP32[$wk$245 >> 2] = $111; + $k$244 = $k$244 + 1 | 0; + if (($k$244 | 0) >= ($wk_max$157 | 0)) { + $128 = $111; + break; + } else $wk$245 = $wk$245 + 4 | 0; + } + } else $128 = $111; + } else { + HEAP16[$pnt2$362 >> 1] = $108; + if (($108 | 0) < ($111 | 0) & ($wk_max$157 | 0) > 0) { + $k$341 = 0; + $wk$342 = $17; + while (1) { + if ((HEAP32[$wk$342 >> 2] | 0) == ($111 | 0)) HEAP32[$wk$342 >> 2] = $108; + $k$341 = $k$341 + 1 | 0; + if (($k$341 | 0) >= ($wk_max$157 | 0)) { + $128 = $108; + break; + } else $wk$342 = $wk$342 + 4 | 0; + } + } else $128 = $108; + } + $130 = ($128 << 16 >> 16) * 7 | 0; + $132 = $labelInfo + 1310736 + ($130 + -7 << 2) | 0; + HEAP32[$132 >> 2] = (HEAP32[$132 >> 2] | 0) + 1; + $136 = $labelInfo + 1310736 + ($130 + -6 << 2) | 0; + HEAP32[$136 >> 2] = (HEAP32[$136 >> 2] | 0) + $i$255; + $140 = $labelInfo + 1310736 + ($130 + -5 << 2) | 0; + HEAP32[$140 >> 2] = (HEAP32[$140 >> 2] | 0) + $j$068; + $wk_max$2 = $wk_max$157; + } else { + HEAP16[$pnt2$362 >> 1] = 0; + $wk_max$2 = $wk_max$157; + } while (0); + $i$255 = $i$255 + 1 | 0; + $222 = $pnt$163 + 4 | 0; + $223 = $pnt2$362 + 2 | 0; + if (($i$255 | 0) >= ($10 | 0)) { + $pnt$1$lcssa = $222; + $pnt2$3$lcssa = $223; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $pnt$163 = $222; + $pnt2$362 = $223; + $wk_max$157 = $wk_max$2; + } + } + } else { + $pnt$1$lcssa = $pnt$072; + $pnt2$3$lcssa = $pnt2$271; + $wk_max$1$lcssa = $wk_max$070; + } + $j$068 = $j$068 + 1 | 0; + if (($j$068 | 0) >= ($1 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $pnt$072 = $pnt$1$lcssa + 8 | 0; + $pnt2$271 = $pnt2$3$lcssa + 4 | 0; + $wk_max$070 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $229 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$337 = 1; + $j$138 = 1; + $wk$439 = $17; + while (1) { + $231 = HEAP32[$wk$439 >> 2] | 0; + if (($231 | 0) == ($i$337 | 0)) { + $237 = $j$138; + $j$2 = $j$138 + 1 | 0; + } else { + $237 = HEAP32[$labelInfo + 1179664 + ($231 + -1 << 2) >> 2] | 0; + $j$2 = $j$138; + } + HEAP32[$wk$439 >> 2] = $237; + if (($i$337 | 0) < ($wk_max$0$lcssa | 0)) { + $i$337 = $i$337 + 1 | 0; + $j$138 = $j$2; + $wk$439 = $wk$439 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $241 = $labelInfo + 8 | 0; + $242 = $j$1$lcssa + -1 | 0; + HEAP32[$241 >> 2] = $242; + if (!$242) $$0 = 0; else { + _memset($229 | 0, 0, $242 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $242 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$435 = 0; + do { + $249 = $i$435 << 2; + HEAP32[$labelInfo + 131084 + ($249 << 2) >> 2] = $xsize; + HEAP32[$labelInfo + 131084 + (($249 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($249 | 2) << 2) >> 2] = $ysize; + HEAP32[$labelInfo + 131084 + (($249 | 3) << 2) >> 2] = 0; + $i$435 = $i$435 + 1 | 0; + } while (($i$435 | 0) < (HEAP32[$241 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$533 = 0; + do { + $263 = (HEAP32[$labelInfo + 1179664 + ($i$533 << 2) >> 2] | 0) + -1 | 0; + $264 = $i$533 * 7 | 0; + $267 = $labelInfo + 12 + ($263 << 2) | 0; + HEAP32[$267 >> 2] = (HEAP32[$267 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($264 << 2) >> 2] | 0); + $274 = $263 << 1; + $275 = $labelInfo + 655376 + ($274 << 3) | 0; + HEAPF64[$275 >> 3] = +HEAPF64[$275 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($264 + 1 << 2) >> 2] | 0); + $283 = $labelInfo + 655376 + (($274 | 1) << 3) | 0; + HEAPF64[$283 >> 3] = +HEAPF64[$283 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($264 + 2 << 2) >> 2] | 0); + $286 = $263 << 2; + $287 = $labelInfo + 131084 + ($286 << 2) | 0; + $291 = HEAP32[$labelInfo + 1310736 + ($264 + 3 << 2) >> 2] | 0; + if ((HEAP32[$287 >> 2] | 0) > ($291 | 0)) HEAP32[$287 >> 2] = $291; + $294 = $labelInfo + 131084 + (($286 | 1) << 2) | 0; + $298 = HEAP32[$labelInfo + 1310736 + ($264 + 4 << 2) >> 2] | 0; + if ((HEAP32[$294 >> 2] | 0) < ($298 | 0)) HEAP32[$294 >> 2] = $298; + $301 = $labelInfo + 131084 + (($286 | 2) << 2) | 0; + $305 = HEAP32[$labelInfo + 1310736 + ($264 + 5 << 2) >> 2] | 0; + if ((HEAP32[$301 >> 2] | 0) > ($305 | 0)) HEAP32[$301 >> 2] = $305; + $308 = $labelInfo + 131084 + (($286 | 3) << 2) | 0; + $312 = HEAP32[$labelInfo + 1310736 + ($264 + 6 << 2) >> 2] | 0; + if ((HEAP32[$308 >> 2] | 0) < ($312 | 0)) HEAP32[$308 >> 2] = $312; + $i$533 = $i$533 + 1 | 0; + } while (($i$533 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$241 >> 2] | 0) > 0) { + $i$632 = 0; + do { + $316 = $labelInfo + 12 + ($i$632 << 2) | 0; + $319 = $i$632 << 1; + $320 = $labelInfo + 655376 + ($319 << 3) | 0; + HEAPF64[$320 >> 3] = +HEAPF64[$320 >> 3] / +(HEAP32[$316 >> 2] | 0); + $326 = $labelInfo + 655376 + (($319 | 1) << 3) | 0; + HEAPF64[$326 >> 3] = +HEAPF64[$326 >> 3] / +(HEAP32[$316 >> 2] | 0); + $i$632 = $i$632 + 1 | 0; + } while (($i$632 | 0) < (HEAP32[$241 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubDBR3CA($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $0 = 0, $1 = 0, $10 = 0, $103 = 0, $108 = 0, $111 = 0, $128 = 0, $130 = 0, $132 = 0, $136 = 0, $140 = 0, $143 = 0, $145 = 0, $149 = 0, $153 = 0, $157 = 0, $162 = 0, $164 = 0, $168 = 0, $17 = 0, $172 = 0, $176 = 0, $18 = 0, $182 = 0, $185 = 0, $187 = 0, $19 = 0, $191 = 0, $195 = 0, $199 = 0, $202 = 0, $207 = 0, $222 = 0, $223 = 0, $229 = 0, $231 = 0, $237 = 0, $24 = 0, $241 = 0, $242 = 0, $249 = 0, $263 = 0, $264 = 0, $267 = 0, $274 = 0, $275 = 0, $283 = 0, $286 = 0, $287 = 0, $291 = 0, $294 = 0, $298 = 0, $301 = 0, $305 = 0, $308 = 0, $312 = 0, $316 = 0, $319 = 0, $320 = 0, $326 = 0, $37 = 0, $40 = 0, $42 = 0, $46 = 0, $50 = 0, $56 = 0, $57 = 0, $60 = 0, $61 = 0, $62 = 0, $65 = 0, $68 = 0, $85 = 0, $87 = 0, $89 = 0, $9 = 0, $93 = 0, $97 = 0, $i$081 = 0, $i$175 = 0, $i$255 = 0, $i$337 = 0, $i$435 = 0, $i$533 = 0, $i$632 = 0, $j$068 = 0, $j$1$lcssa = 0, $j$138 = 0, $j$2 = 0, $k$051 = 0, $k$148 = 0, $k$244 = 0, $k$341 = 0, $pnt$072 = 0, $pnt$1$lcssa = 0, $pnt$163 = 0, $pnt1$083 = 0, $pnt1$177 = 0, $pnt2$082 = 0, $pnt2$176 = 0, $pnt2$271 = 0, $pnt2$3$lcssa = 0, $pnt2$362 = 0, $vararg_buffer = 0, $wk$052 = 0, $wk$149 = 0, $wk$245 = 0, $wk$342 = 0, $wk$439 = 0, $wk_max$0$lcssa = 0, $wk_max$070 = 0, $wk_max$1$lcssa = 0, $wk_max$157 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = HEAP32[$labelInfo >> 2] | 0; + $1 = $ysize + -1 | 0; + if (($xsize | 0) > 0) { + $i$081 = 0; + $pnt1$083 = $0; + $pnt2$082 = $0 + ((Math_imul($1, $xsize) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$082 >> 1] = 0; + HEAP16[$pnt1$083 >> 1] = 0; + $i$081 = $i$081 + 1 | 0; + if (($i$081 | 0) >= ($xsize | 0)) break; else { + $pnt1$083 = $pnt1$083 + 2 | 0; + $pnt2$082 = $pnt2$082 + 2 | 0; + } + } + } + $9 = $labelingThresh * 3 | 0; + $10 = $xsize + -1 | 0; + if (($ysize | 0) > 0) { + $i$175 = 0; + $pnt1$177 = $0; + $pnt2$176 = $0 + ($10 << 1) | 0; + while (1) { + HEAP16[$pnt2$176 >> 1] = 0; + HEAP16[$pnt1$177 >> 1] = 0; + $i$175 = $i$175 + 1 | 0; + if (($i$175 | 0) >= ($ysize | 0)) break; else { + $pnt1$177 = $pnt1$177 + ($xsize << 1) | 0; + $pnt2$176 = $pnt2$176 + ($xsize << 1) | 0; + } + } + } + $17 = $labelInfo + 1179664 | 0; + $18 = $xsize + 1 | 0; + $19 = 0 - $xsize | 0; + $$sum = 1 - $xsize | 0; + $$sum1 = ~$xsize; + L11 : do if (($1 | 0) > 1) { + $24 = ($10 | 0) > 1; + $j$068 = 1; + $pnt$072 = $image + ($18 << 2) | 0; + $pnt2$271 = $0 + ($18 << 1) | 0; + $wk_max$070 = 0; + L13 : while (1) { + if ($24) { + $i$255 = 1; + $pnt$163 = $pnt$072; + $pnt2$362 = $pnt2$271; + $wk_max$157 = $wk_max$070; + while (1) { + do if (((HEAPU8[$pnt$163 + 1 >> 0] | 0) + (HEAPU8[$pnt$163 >> 0] | 0) + (HEAPU8[$pnt$163 + 2 >> 0] | 0) | 0) > ($9 | 0)) { + HEAP16[$pnt2$362 >> 1] = 0; + $wk_max$2 = $wk_max$157; + } else { + $37 = HEAP16[$pnt2$362 + ($19 << 1) >> 1] | 0; + if ($37 << 16 >> 16 > 0) { + HEAP16[$pnt2$362 >> 1] = $37; + $40 = ($37 << 16 >> 16) * 7 | 0; + $42 = $labelInfo + 1310736 + ($40 + -7 << 2) | 0; + HEAP32[$42 >> 2] = (HEAP32[$42 >> 2] | 0) + 1; + $46 = $labelInfo + 1310736 + ($40 + -6 << 2) | 0; + HEAP32[$46 >> 2] = (HEAP32[$46 >> 2] | 0) + $i$255; + $50 = $labelInfo + 1310736 + ($40 + -5 << 2) | 0; + HEAP32[$50 >> 2] = (HEAP32[$50 >> 2] | 0) + $j$068; + HEAP32[$labelInfo + 1310736 + ($40 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $56 = HEAP16[$pnt2$362 + ($$sum << 1) >> 1] | 0; + $57 = $56 << 16 >> 16; + $60 = HEAP16[$pnt2$362 + ($$sum1 << 1) >> 1] | 0; + $61 = $60 << 16 >> 16; + $62 = $60 << 16 >> 16 > 0; + if ($56 << 16 >> 16 <= 0) { + if ($62) { + HEAP16[$pnt2$362 >> 1] = $60; + $162 = $61 * 7 | 0; + $164 = $labelInfo + 1310736 + ($162 + -7 << 2) | 0; + HEAP32[$164 >> 2] = (HEAP32[$164 >> 2] | 0) + 1; + $168 = $labelInfo + 1310736 + ($162 + -6 << 2) | 0; + HEAP32[$168 >> 2] = (HEAP32[$168 >> 2] | 0) + $i$255; + $172 = $labelInfo + 1310736 + ($162 + -5 << 2) | 0; + HEAP32[$172 >> 2] = (HEAP32[$172 >> 2] | 0) + $j$068; + $176 = $labelInfo + 1310736 + ($162 + -3 << 2) | 0; + if ((HEAP32[$176 >> 2] | 0) < ($i$255 | 0)) HEAP32[$176 >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($162 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $182 = HEAP16[$pnt2$362 + -2 >> 1] | 0; + if ($182 << 16 >> 16 > 0) { + HEAP16[$pnt2$362 >> 1] = $182; + $185 = ($182 << 16 >> 16) * 7 | 0; + $187 = $labelInfo + 1310736 + ($185 + -7 << 2) | 0; + HEAP32[$187 >> 2] = (HEAP32[$187 >> 2] | 0) + 1; + $191 = $labelInfo + 1310736 + ($185 + -6 << 2) | 0; + HEAP32[$191 >> 2] = (HEAP32[$191 >> 2] | 0) + $i$255; + $195 = $labelInfo + 1310736 + ($185 + -5 << 2) | 0; + HEAP32[$195 >> 2] = (HEAP32[$195 >> 2] | 0) + $j$068; + $199 = $labelInfo + 1310736 + ($185 + -3 << 2) | 0; + if ((HEAP32[$199 >> 2] | 0) >= ($i$255 | 0)) { + $wk_max$2 = $wk_max$157; + break; + } + HEAP32[$199 >> 2] = $i$255; + $wk_max$2 = $wk_max$157; + break; + } else { + $202 = $wk_max$157 + 1 | 0; + if (($wk_max$157 | 0) > 32767) break L13; + HEAP16[$pnt2$362 >> 1] = $202; + HEAP32[$labelInfo + 1179664 + ($wk_max$157 << 2) >> 2] = $202 << 16 >> 16; + $207 = $wk_max$157 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($207 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($207 + 1 << 2) >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($207 + 2 << 2) >> 2] = $j$068; + HEAP32[$labelInfo + 1310736 + ($207 + 3 << 2) >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($207 + 4 << 2) >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($207 + 5 << 2) >> 2] = $j$068; + HEAP32[$labelInfo + 1310736 + ($207 + 6 << 2) >> 2] = $j$068; + $wk_max$2 = $202; + break; + } + } + if ($62) { + $65 = HEAP32[$labelInfo + 1179664 + ($57 + -1 << 2) >> 2] | 0; + $68 = HEAP32[$labelInfo + 1179664 + ($61 + -1 << 2) >> 2] | 0; + if (($65 | 0) > ($68 | 0)) { + HEAP16[$pnt2$362 >> 1] = $68; + if (($wk_max$157 | 0) > 0) { + $k$051 = 0; + $wk$052 = $17; + while (1) { + if ((HEAP32[$wk$052 >> 2] | 0) == ($65 | 0)) HEAP32[$wk$052 >> 2] = $68; + $k$051 = $k$051 + 1 | 0; + if (($k$051 | 0) >= ($wk_max$157 | 0)) { + $85 = $68; + break; + } else $wk$052 = $wk$052 + 4 | 0; + } + } else $85 = $68; + } else { + HEAP16[$pnt2$362 >> 1] = $65; + if (($65 | 0) < ($68 | 0) & ($wk_max$157 | 0) > 0) { + $k$148 = 0; + $wk$149 = $17; + while (1) { + if ((HEAP32[$wk$149 >> 2] | 0) == ($68 | 0)) HEAP32[$wk$149 >> 2] = $65; + $k$148 = $k$148 + 1 | 0; + if (($k$148 | 0) >= ($wk_max$157 | 0)) { + $85 = $65; + break; + } else $wk$149 = $wk$149 + 4 | 0; + } + } else $85 = $65; + } + $87 = ($85 << 16 >> 16) * 7 | 0; + $89 = $labelInfo + 1310736 + ($87 + -7 << 2) | 0; + HEAP32[$89 >> 2] = (HEAP32[$89 >> 2] | 0) + 1; + $93 = $labelInfo + 1310736 + ($87 + -6 << 2) | 0; + HEAP32[$93 >> 2] = (HEAP32[$93 >> 2] | 0) + $i$255; + $97 = $labelInfo + 1310736 + ($87 + -5 << 2) | 0; + HEAP32[$97 >> 2] = (HEAP32[$97 >> 2] | 0) + $j$068; + HEAP32[$labelInfo + 1310736 + ($87 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $103 = HEAP16[$pnt2$362 + -2 >> 1] | 0; + if ($103 << 16 >> 16 <= 0) { + HEAP16[$pnt2$362 >> 1] = $56; + $143 = $57 * 7 | 0; + $145 = $labelInfo + 1310736 + ($143 + -7 << 2) | 0; + HEAP32[$145 >> 2] = (HEAP32[$145 >> 2] | 0) + 1; + $149 = $labelInfo + 1310736 + ($143 + -6 << 2) | 0; + HEAP32[$149 >> 2] = (HEAP32[$149 >> 2] | 0) + $i$255; + $153 = $labelInfo + 1310736 + ($143 + -5 << 2) | 0; + HEAP32[$153 >> 2] = (HEAP32[$153 >> 2] | 0) + $j$068; + $157 = $labelInfo + 1310736 + ($143 + -4 << 2) | 0; + if ((HEAP32[$157 >> 2] | 0) > ($i$255 | 0)) HEAP32[$157 >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($143 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $108 = HEAP32[$labelInfo + 1179664 + ($57 + -1 << 2) >> 2] | 0; + $111 = HEAP32[$labelInfo + 1179664 + (($103 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($108 | 0) > ($111 | 0)) { + HEAP16[$pnt2$362 >> 1] = $111; + if (($wk_max$157 | 0) > 0) { + $k$244 = 0; + $wk$245 = $17; + while (1) { + if ((HEAP32[$wk$245 >> 2] | 0) == ($108 | 0)) HEAP32[$wk$245 >> 2] = $111; + $k$244 = $k$244 + 1 | 0; + if (($k$244 | 0) >= ($wk_max$157 | 0)) { + $128 = $111; + break; + } else $wk$245 = $wk$245 + 4 | 0; + } + } else $128 = $111; + } else { + HEAP16[$pnt2$362 >> 1] = $108; + if (($108 | 0) < ($111 | 0) & ($wk_max$157 | 0) > 0) { + $k$341 = 0; + $wk$342 = $17; + while (1) { + if ((HEAP32[$wk$342 >> 2] | 0) == ($111 | 0)) HEAP32[$wk$342 >> 2] = $108; + $k$341 = $k$341 + 1 | 0; + if (($k$341 | 0) >= ($wk_max$157 | 0)) { + $128 = $108; + break; + } else $wk$342 = $wk$342 + 4 | 0; + } + } else $128 = $108; + } + $130 = ($128 << 16 >> 16) * 7 | 0; + $132 = $labelInfo + 1310736 + ($130 + -7 << 2) | 0; + HEAP32[$132 >> 2] = (HEAP32[$132 >> 2] | 0) + 1; + $136 = $labelInfo + 1310736 + ($130 + -6 << 2) | 0; + HEAP32[$136 >> 2] = (HEAP32[$136 >> 2] | 0) + $i$255; + $140 = $labelInfo + 1310736 + ($130 + -5 << 2) | 0; + HEAP32[$140 >> 2] = (HEAP32[$140 >> 2] | 0) + $j$068; + $wk_max$2 = $wk_max$157; + } while (0); + $i$255 = $i$255 + 1 | 0; + $222 = $pnt$163 + 4 | 0; + $223 = $pnt2$362 + 2 | 0; + if (($i$255 | 0) >= ($10 | 0)) { + $pnt$1$lcssa = $222; + $pnt2$3$lcssa = $223; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $pnt$163 = $222; + $pnt2$362 = $223; + $wk_max$157 = $wk_max$2; + } + } + } else { + $pnt$1$lcssa = $pnt$072; + $pnt2$3$lcssa = $pnt2$271; + $wk_max$1$lcssa = $wk_max$070; + } + $j$068 = $j$068 + 1 | 0; + if (($j$068 | 0) >= ($1 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $pnt$072 = $pnt$1$lcssa + 8 | 0; + $pnt2$271 = $pnt2$3$lcssa + 4 | 0; + $wk_max$070 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $229 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$337 = 1; + $j$138 = 1; + $wk$439 = $17; + while (1) { + $231 = HEAP32[$wk$439 >> 2] | 0; + if (($231 | 0) == ($i$337 | 0)) { + $237 = $j$138; + $j$2 = $j$138 + 1 | 0; + } else { + $237 = HEAP32[$labelInfo + 1179664 + ($231 + -1 << 2) >> 2] | 0; + $j$2 = $j$138; + } + HEAP32[$wk$439 >> 2] = $237; + if (($i$337 | 0) < ($wk_max$0$lcssa | 0)) { + $i$337 = $i$337 + 1 | 0; + $j$138 = $j$2; + $wk$439 = $wk$439 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $241 = $labelInfo + 8 | 0; + $242 = $j$1$lcssa + -1 | 0; + HEAP32[$241 >> 2] = $242; + if (!$242) $$0 = 0; else { + _memset($229 | 0, 0, $242 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $242 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$435 = 0; + do { + $249 = $i$435 << 2; + HEAP32[$labelInfo + 131084 + ($249 << 2) >> 2] = $xsize; + HEAP32[$labelInfo + 131084 + (($249 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($249 | 2) << 2) >> 2] = $ysize; + HEAP32[$labelInfo + 131084 + (($249 | 3) << 2) >> 2] = 0; + $i$435 = $i$435 + 1 | 0; + } while (($i$435 | 0) < (HEAP32[$241 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$533 = 0; + do { + $263 = (HEAP32[$labelInfo + 1179664 + ($i$533 << 2) >> 2] | 0) + -1 | 0; + $264 = $i$533 * 7 | 0; + $267 = $labelInfo + 12 + ($263 << 2) | 0; + HEAP32[$267 >> 2] = (HEAP32[$267 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($264 << 2) >> 2] | 0); + $274 = $263 << 1; + $275 = $labelInfo + 655376 + ($274 << 3) | 0; + HEAPF64[$275 >> 3] = +HEAPF64[$275 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($264 + 1 << 2) >> 2] | 0); + $283 = $labelInfo + 655376 + (($274 | 1) << 3) | 0; + HEAPF64[$283 >> 3] = +HEAPF64[$283 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($264 + 2 << 2) >> 2] | 0); + $286 = $263 << 2; + $287 = $labelInfo + 131084 + ($286 << 2) | 0; + $291 = HEAP32[$labelInfo + 1310736 + ($264 + 3 << 2) >> 2] | 0; + if ((HEAP32[$287 >> 2] | 0) > ($291 | 0)) HEAP32[$287 >> 2] = $291; + $294 = $labelInfo + 131084 + (($286 | 1) << 2) | 0; + $298 = HEAP32[$labelInfo + 1310736 + ($264 + 4 << 2) >> 2] | 0; + if ((HEAP32[$294 >> 2] | 0) < ($298 | 0)) HEAP32[$294 >> 2] = $298; + $301 = $labelInfo + 131084 + (($286 | 2) << 2) | 0; + $305 = HEAP32[$labelInfo + 1310736 + ($264 + 5 << 2) >> 2] | 0; + if ((HEAP32[$301 >> 2] | 0) > ($305 | 0)) HEAP32[$301 >> 2] = $305; + $308 = $labelInfo + 131084 + (($286 | 3) << 2) | 0; + $312 = HEAP32[$labelInfo + 1310736 + ($264 + 6 << 2) >> 2] | 0; + if ((HEAP32[$308 >> 2] | 0) < ($312 | 0)) HEAP32[$308 >> 2] = $312; + $i$533 = $i$533 + 1 | 0; + } while (($i$533 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$241 >> 2] | 0) > 0) { + $i$632 = 0; + do { + $316 = $labelInfo + 12 + ($i$632 << 2) | 0; + $319 = $i$632 << 1; + $320 = $labelInfo + 655376 + ($319 << 3) | 0; + HEAPF64[$320 >> 3] = +HEAPF64[$320 >> 3] / +(HEAP32[$316 >> 2] | 0); + $326 = $labelInfo + 655376 + (($319 | 1) << 3) | 0; + HEAPF64[$326 >> 3] = +HEAPF64[$326 >> 3] / +(HEAP32[$316 >> 2] | 0); + $i$632 = $i$632 + 1 | 0; + } while (($i$632 | 0) < (HEAP32[$241 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubDWICY($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $$sum2 = 0, $0 = 0, $1 = 0, $104 = 0, $107 = 0, $11 = 0, $124 = 0, $126 = 0, $128 = 0, $132 = 0, $136 = 0, $139 = 0, $141 = 0, $145 = 0, $149 = 0, $153 = 0, $158 = 0, $160 = 0, $164 = 0, $168 = 0, $172 = 0, $178 = 0, $18 = 0, $181 = 0, $183 = 0, $187 = 0, $191 = 0, $195 = 0, $198 = 0, $2 = 0, $20 = 0, $203 = 0, $218 = 0, $219 = 0, $225 = 0, $227 = 0, $233 = 0, $237 = 0, $238 = 0, $245 = 0, $259 = 0, $260 = 0, $263 = 0, $27 = 0, $270 = 0, $271 = 0, $279 = 0, $282 = 0, $283 = 0, $287 = 0, $290 = 0, $294 = 0, $297 = 0, $3 = 0, $301 = 0, $304 = 0, $308 = 0, $312 = 0, $315 = 0, $316 = 0, $322 = 0, $33 = 0, $36 = 0, $38 = 0, $42 = 0, $46 = 0, $52 = 0, $53 = 0, $56 = 0, $57 = 0, $58 = 0, $61 = 0, $64 = 0, $81 = 0, $83 = 0, $85 = 0, $89 = 0, $93 = 0, $99 = 0, $i$082 = 0, $i$176 = 0, $i$256 = 0, $i$338 = 0, $i$436 = 0, $i$534 = 0, $i$633 = 0, $j$069 = 0, $j$1$lcssa = 0, $j$139 = 0, $j$2 = 0, $k$052 = 0, $k$149 = 0, $k$245 = 0, $k$342 = 0, $pnt$073 = 0, $pnt$1$lcssa = 0, $pnt$164 = 0, $pnt1$084 = 0, $pnt1$178 = 0, $pnt2$083 = 0, $pnt2$177 = 0, $pnt2$272 = 0, $pnt2$3$lcssa = 0, $pnt2$363 = 0, $vararg_buffer = 0, $wk$053 = 0, $wk$150 = 0, $wk$246 = 0, $wk$343 = 0, $wk$440 = 0, $wk_max$0$lcssa = 0, $wk_max$071 = 0, $wk_max$1$lcssa = 0, $wk_max$158 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = ($xsize | 0) / 2 | 0; + $1 = ($ysize | 0) / 2 | 0; + $2 = HEAP32[$labelInfo >> 2] | 0; + $3 = $1 + -1 | 0; + if (($xsize | 0) > 1) { + $i$082 = 0; + $pnt1$084 = $2; + $pnt2$083 = $2 + ((Math_imul($3, $0) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$083 >> 1] = 0; + HEAP16[$pnt1$084 >> 1] = 0; + $i$082 = $i$082 + 1 | 0; + if (($i$082 | 0) >= ($0 | 0)) break; else { + $pnt1$084 = $pnt1$084 + 2 | 0; + $pnt2$083 = $pnt2$083 + 2 | 0; + } + } + } + $11 = $0 + -1 | 0; + if (($ysize | 0) > 1) { + $i$176 = 0; + $pnt1$178 = $2; + $pnt2$177 = $2 + ($11 << 1) | 0; + while (1) { + HEAP16[$pnt2$177 >> 1] = 0; + HEAP16[$pnt1$178 >> 1] = 0; + $i$176 = $i$176 + 1 | 0; + if (($i$176 | 0) >= ($1 | 0)) break; else { + $pnt1$178 = $pnt1$178 + ($0 << 1) | 0; + $pnt2$177 = $pnt2$177 + ($0 << 1) | 0; + } + } + } + $18 = $labelInfo + 1179664 | 0; + $20 = 0 - $0 | 0; + $$sum1 = 1 - $0 | 0; + $$sum2 = ~$0; + $$sum = ($xsize << 1) + 8 | 0; + L11 : do if (($3 | 0) > 1) { + $27 = ($11 | 0) > 1; + $j$069 = 1; + $pnt$073 = $image + (($xsize << 2) + 4) | 0; + $pnt2$272 = $2 + ($0 + 1 << 1) | 0; + $wk_max$071 = 0; + L13 : while (1) { + if ($27) { + $i$256 = 1; + $pnt$164 = $pnt$073; + $pnt2$363 = $pnt2$272; + $wk_max$158 = $wk_max$071; + while (1) { + do if ((HEAPU8[$pnt$164 + 1 >> 0] | 0 | 0) > ($labelingThresh | 0)) { + $33 = HEAP16[$pnt2$363 + ($20 << 1) >> 1] | 0; + if ($33 << 16 >> 16 > 0) { + HEAP16[$pnt2$363 >> 1] = $33; + $36 = ($33 << 16 >> 16) * 7 | 0; + $38 = $labelInfo + 1310736 + ($36 + -7 << 2) | 0; + HEAP32[$38 >> 2] = (HEAP32[$38 >> 2] | 0) + 1; + $42 = $labelInfo + 1310736 + ($36 + -6 << 2) | 0; + HEAP32[$42 >> 2] = (HEAP32[$42 >> 2] | 0) + $i$256; + $46 = $labelInfo + 1310736 + ($36 + -5 << 2) | 0; + HEAP32[$46 >> 2] = (HEAP32[$46 >> 2] | 0) + $j$069; + HEAP32[$labelInfo + 1310736 + ($36 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $52 = HEAP16[$pnt2$363 + ($$sum1 << 1) >> 1] | 0; + $53 = $52 << 16 >> 16; + $56 = HEAP16[$pnt2$363 + ($$sum2 << 1) >> 1] | 0; + $57 = $56 << 16 >> 16; + $58 = $56 << 16 >> 16 > 0; + if ($52 << 16 >> 16 <= 0) { + if ($58) { + HEAP16[$pnt2$363 >> 1] = $56; + $158 = $57 * 7 | 0; + $160 = $labelInfo + 1310736 + ($158 + -7 << 2) | 0; + HEAP32[$160 >> 2] = (HEAP32[$160 >> 2] | 0) + 1; + $164 = $labelInfo + 1310736 + ($158 + -6 << 2) | 0; + HEAP32[$164 >> 2] = (HEAP32[$164 >> 2] | 0) + $i$256; + $168 = $labelInfo + 1310736 + ($158 + -5 << 2) | 0; + HEAP32[$168 >> 2] = (HEAP32[$168 >> 2] | 0) + $j$069; + $172 = $labelInfo + 1310736 + ($158 + -3 << 2) | 0; + if ((HEAP32[$172 >> 2] | 0) < ($i$256 | 0)) HEAP32[$172 >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($158 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $178 = HEAP16[$pnt2$363 + -2 >> 1] | 0; + if ($178 << 16 >> 16 > 0) { + HEAP16[$pnt2$363 >> 1] = $178; + $181 = ($178 << 16 >> 16) * 7 | 0; + $183 = $labelInfo + 1310736 + ($181 + -7 << 2) | 0; + HEAP32[$183 >> 2] = (HEAP32[$183 >> 2] | 0) + 1; + $187 = $labelInfo + 1310736 + ($181 + -6 << 2) | 0; + HEAP32[$187 >> 2] = (HEAP32[$187 >> 2] | 0) + $i$256; + $191 = $labelInfo + 1310736 + ($181 + -5 << 2) | 0; + HEAP32[$191 >> 2] = (HEAP32[$191 >> 2] | 0) + $j$069; + $195 = $labelInfo + 1310736 + ($181 + -3 << 2) | 0; + if ((HEAP32[$195 >> 2] | 0) >= ($i$256 | 0)) { + $wk_max$2 = $wk_max$158; + break; + } + HEAP32[$195 >> 2] = $i$256; + $wk_max$2 = $wk_max$158; + break; + } else { + $198 = $wk_max$158 + 1 | 0; + if (($wk_max$158 | 0) > 32767) break L13; + HEAP16[$pnt2$363 >> 1] = $198; + HEAP32[$labelInfo + 1179664 + ($wk_max$158 << 2) >> 2] = $198 << 16 >> 16; + $203 = $wk_max$158 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($203 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($203 + 1 << 2) >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($203 + 2 << 2) >> 2] = $j$069; + HEAP32[$labelInfo + 1310736 + ($203 + 3 << 2) >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($203 + 4 << 2) >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($203 + 5 << 2) >> 2] = $j$069; + HEAP32[$labelInfo + 1310736 + ($203 + 6 << 2) >> 2] = $j$069; + $wk_max$2 = $198; + break; + } + } + if ($58) { + $61 = HEAP32[$labelInfo + 1179664 + ($53 + -1 << 2) >> 2] | 0; + $64 = HEAP32[$labelInfo + 1179664 + ($57 + -1 << 2) >> 2] | 0; + if (($61 | 0) > ($64 | 0)) { + HEAP16[$pnt2$363 >> 1] = $64; + if (($wk_max$158 | 0) > 0) { + $k$052 = 0; + $wk$053 = $18; + while (1) { + if ((HEAP32[$wk$053 >> 2] | 0) == ($61 | 0)) HEAP32[$wk$053 >> 2] = $64; + $k$052 = $k$052 + 1 | 0; + if (($k$052 | 0) >= ($wk_max$158 | 0)) { + $81 = $64; + break; + } else $wk$053 = $wk$053 + 4 | 0; + } + } else $81 = $64; + } else { + HEAP16[$pnt2$363 >> 1] = $61; + if (($61 | 0) < ($64 | 0) & ($wk_max$158 | 0) > 0) { + $k$149 = 0; + $wk$150 = $18; + while (1) { + if ((HEAP32[$wk$150 >> 2] | 0) == ($64 | 0)) HEAP32[$wk$150 >> 2] = $61; + $k$149 = $k$149 + 1 | 0; + if (($k$149 | 0) >= ($wk_max$158 | 0)) { + $81 = $61; + break; + } else $wk$150 = $wk$150 + 4 | 0; + } + } else $81 = $61; + } + $83 = ($81 << 16 >> 16) * 7 | 0; + $85 = $labelInfo + 1310736 + ($83 + -7 << 2) | 0; + HEAP32[$85 >> 2] = (HEAP32[$85 >> 2] | 0) + 1; + $89 = $labelInfo + 1310736 + ($83 + -6 << 2) | 0; + HEAP32[$89 >> 2] = (HEAP32[$89 >> 2] | 0) + $i$256; + $93 = $labelInfo + 1310736 + ($83 + -5 << 2) | 0; + HEAP32[$93 >> 2] = (HEAP32[$93 >> 2] | 0) + $j$069; + HEAP32[$labelInfo + 1310736 + ($83 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $99 = HEAP16[$pnt2$363 + -2 >> 1] | 0; + if ($99 << 16 >> 16 <= 0) { + HEAP16[$pnt2$363 >> 1] = $52; + $139 = $53 * 7 | 0; + $141 = $labelInfo + 1310736 + ($139 + -7 << 2) | 0; + HEAP32[$141 >> 2] = (HEAP32[$141 >> 2] | 0) + 1; + $145 = $labelInfo + 1310736 + ($139 + -6 << 2) | 0; + HEAP32[$145 >> 2] = (HEAP32[$145 >> 2] | 0) + $i$256; + $149 = $labelInfo + 1310736 + ($139 + -5 << 2) | 0; + HEAP32[$149 >> 2] = (HEAP32[$149 >> 2] | 0) + $j$069; + $153 = $labelInfo + 1310736 + ($139 + -4 << 2) | 0; + if ((HEAP32[$153 >> 2] | 0) > ($i$256 | 0)) HEAP32[$153 >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($139 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $104 = HEAP32[$labelInfo + 1179664 + ($53 + -1 << 2) >> 2] | 0; + $107 = HEAP32[$labelInfo + 1179664 + (($99 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($104 | 0) > ($107 | 0)) { + HEAP16[$pnt2$363 >> 1] = $107; + if (($wk_max$158 | 0) > 0) { + $k$245 = 0; + $wk$246 = $18; + while (1) { + if ((HEAP32[$wk$246 >> 2] | 0) == ($104 | 0)) HEAP32[$wk$246 >> 2] = $107; + $k$245 = $k$245 + 1 | 0; + if (($k$245 | 0) >= ($wk_max$158 | 0)) { + $124 = $107; + break; + } else $wk$246 = $wk$246 + 4 | 0; + } + } else $124 = $107; + } else { + HEAP16[$pnt2$363 >> 1] = $104; + if (($104 | 0) < ($107 | 0) & ($wk_max$158 | 0) > 0) { + $k$342 = 0; + $wk$343 = $18; + while (1) { + if ((HEAP32[$wk$343 >> 2] | 0) == ($107 | 0)) HEAP32[$wk$343 >> 2] = $104; + $k$342 = $k$342 + 1 | 0; + if (($k$342 | 0) >= ($wk_max$158 | 0)) { + $124 = $104; + break; + } else $wk$343 = $wk$343 + 4 | 0; + } + } else $124 = $104; + } + $126 = ($124 << 16 >> 16) * 7 | 0; + $128 = $labelInfo + 1310736 + ($126 + -7 << 2) | 0; + HEAP32[$128 >> 2] = (HEAP32[$128 >> 2] | 0) + 1; + $132 = $labelInfo + 1310736 + ($126 + -6 << 2) | 0; + HEAP32[$132 >> 2] = (HEAP32[$132 >> 2] | 0) + $i$256; + $136 = $labelInfo + 1310736 + ($126 + -5 << 2) | 0; + HEAP32[$136 >> 2] = (HEAP32[$136 >> 2] | 0) + $j$069; + $wk_max$2 = $wk_max$158; + } else { + HEAP16[$pnt2$363 >> 1] = 0; + $wk_max$2 = $wk_max$158; + } while (0); + $i$256 = $i$256 + 1 | 0; + $218 = $pnt$164 + 4 | 0; + $219 = $pnt2$363 + 2 | 0; + if (($i$256 | 0) >= ($11 | 0)) { + $pnt$1$lcssa = $218; + $pnt2$3$lcssa = $219; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $pnt$164 = $218; + $pnt2$363 = $219; + $wk_max$158 = $wk_max$2; + } + } + } else { + $pnt$1$lcssa = $pnt$073; + $pnt2$3$lcssa = $pnt2$272; + $wk_max$1$lcssa = $wk_max$071; + } + $j$069 = $j$069 + 1 | 0; + if (($j$069 | 0) >= ($3 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $pnt$073 = $pnt$1$lcssa + $$sum | 0; + $pnt2$272 = $pnt2$3$lcssa + 4 | 0; + $wk_max$071 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $225 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$338 = 1; + $j$139 = 1; + $wk$440 = $18; + while (1) { + $227 = HEAP32[$wk$440 >> 2] | 0; + if (($227 | 0) == ($i$338 | 0)) { + $233 = $j$139; + $j$2 = $j$139 + 1 | 0; + } else { + $233 = HEAP32[$labelInfo + 1179664 + ($227 + -1 << 2) >> 2] | 0; + $j$2 = $j$139; + } + HEAP32[$wk$440 >> 2] = $233; + if (($i$338 | 0) < ($wk_max$0$lcssa | 0)) { + $i$338 = $i$338 + 1 | 0; + $j$139 = $j$2; + $wk$440 = $wk$440 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $237 = $labelInfo + 8 | 0; + $238 = $j$1$lcssa + -1 | 0; + HEAP32[$237 >> 2] = $238; + if (!$238) $$0 = 0; else { + _memset($225 | 0, 0, $238 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $238 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$436 = 0; + do { + $245 = $i$436 << 2; + HEAP32[$labelInfo + 131084 + ($245 << 2) >> 2] = $0; + HEAP32[$labelInfo + 131084 + (($245 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($245 | 2) << 2) >> 2] = $1; + HEAP32[$labelInfo + 131084 + (($245 | 3) << 2) >> 2] = 0; + $i$436 = $i$436 + 1 | 0; + } while (($i$436 | 0) < (HEAP32[$237 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$534 = 0; + do { + $259 = (HEAP32[$labelInfo + 1179664 + ($i$534 << 2) >> 2] | 0) + -1 | 0; + $260 = $i$534 * 7 | 0; + $263 = $labelInfo + 12 + ($259 << 2) | 0; + HEAP32[$263 >> 2] = (HEAP32[$263 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($260 << 2) >> 2] | 0); + $270 = $259 << 1; + $271 = $labelInfo + 655376 + ($270 << 3) | 0; + HEAPF64[$271 >> 3] = +HEAPF64[$271 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($260 + 1 << 2) >> 2] | 0); + $279 = $labelInfo + 655376 + (($270 | 1) << 3) | 0; + HEAPF64[$279 >> 3] = +HEAPF64[$279 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($260 + 2 << 2) >> 2] | 0); + $282 = $259 << 2; + $283 = $labelInfo + 131084 + ($282 << 2) | 0; + $287 = HEAP32[$labelInfo + 1310736 + ($260 + 3 << 2) >> 2] | 0; + if ((HEAP32[$283 >> 2] | 0) > ($287 | 0)) HEAP32[$283 >> 2] = $287; + $290 = $labelInfo + 131084 + (($282 | 1) << 2) | 0; + $294 = HEAP32[$labelInfo + 1310736 + ($260 + 4 << 2) >> 2] | 0; + if ((HEAP32[$290 >> 2] | 0) < ($294 | 0)) HEAP32[$290 >> 2] = $294; + $297 = $labelInfo + 131084 + (($282 | 2) << 2) | 0; + $301 = HEAP32[$labelInfo + 1310736 + ($260 + 5 << 2) >> 2] | 0; + if ((HEAP32[$297 >> 2] | 0) > ($301 | 0)) HEAP32[$297 >> 2] = $301; + $304 = $labelInfo + 131084 + (($282 | 3) << 2) | 0; + $308 = HEAP32[$labelInfo + 1310736 + ($260 + 6 << 2) >> 2] | 0; + if ((HEAP32[$304 >> 2] | 0) < ($308 | 0)) HEAP32[$304 >> 2] = $308; + $i$534 = $i$534 + 1 | 0; + } while (($i$534 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$237 >> 2] | 0) > 0) { + $i$633 = 0; + do { + $312 = $labelInfo + 12 + ($i$633 << 2) | 0; + $315 = $i$633 << 1; + $316 = $labelInfo + 655376 + ($315 << 3) | 0; + HEAPF64[$316 >> 3] = +HEAPF64[$316 >> 3] / +(HEAP32[$312 >> 2] | 0); + $322 = $labelInfo + 655376 + (($315 | 1) << 3) | 0; + HEAPF64[$322 >> 3] = +HEAPF64[$322 >> 3] / +(HEAP32[$312 >> 2] | 0); + $i$633 = $i$633 + 1 | 0; + } while (($i$633 | 0) < (HEAP32[$237 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubDBICY($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $$sum2 = 0, $0 = 0, $1 = 0, $104 = 0, $107 = 0, $11 = 0, $124 = 0, $126 = 0, $128 = 0, $132 = 0, $136 = 0, $139 = 0, $141 = 0, $145 = 0, $149 = 0, $153 = 0, $158 = 0, $160 = 0, $164 = 0, $168 = 0, $172 = 0, $178 = 0, $18 = 0, $181 = 0, $183 = 0, $187 = 0, $191 = 0, $195 = 0, $198 = 0, $2 = 0, $20 = 0, $203 = 0, $218 = 0, $219 = 0, $225 = 0, $227 = 0, $233 = 0, $237 = 0, $238 = 0, $245 = 0, $259 = 0, $260 = 0, $263 = 0, $27 = 0, $270 = 0, $271 = 0, $279 = 0, $282 = 0, $283 = 0, $287 = 0, $290 = 0, $294 = 0, $297 = 0, $3 = 0, $301 = 0, $304 = 0, $308 = 0, $312 = 0, $315 = 0, $316 = 0, $322 = 0, $33 = 0, $36 = 0, $38 = 0, $42 = 0, $46 = 0, $52 = 0, $53 = 0, $56 = 0, $57 = 0, $58 = 0, $61 = 0, $64 = 0, $81 = 0, $83 = 0, $85 = 0, $89 = 0, $93 = 0, $99 = 0, $i$082 = 0, $i$176 = 0, $i$256 = 0, $i$338 = 0, $i$436 = 0, $i$534 = 0, $i$633 = 0, $j$069 = 0, $j$1$lcssa = 0, $j$139 = 0, $j$2 = 0, $k$052 = 0, $k$149 = 0, $k$245 = 0, $k$342 = 0, $pnt$073 = 0, $pnt$1$lcssa = 0, $pnt$164 = 0, $pnt1$084 = 0, $pnt1$178 = 0, $pnt2$083 = 0, $pnt2$177 = 0, $pnt2$272 = 0, $pnt2$3$lcssa = 0, $pnt2$363 = 0, $vararg_buffer = 0, $wk$053 = 0, $wk$150 = 0, $wk$246 = 0, $wk$343 = 0, $wk$440 = 0, $wk_max$0$lcssa = 0, $wk_max$071 = 0, $wk_max$1$lcssa = 0, $wk_max$158 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = ($xsize | 0) / 2 | 0; + $1 = ($ysize | 0) / 2 | 0; + $2 = HEAP32[$labelInfo >> 2] | 0; + $3 = $1 + -1 | 0; + if (($xsize | 0) > 1) { + $i$082 = 0; + $pnt1$084 = $2; + $pnt2$083 = $2 + ((Math_imul($3, $0) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$083 >> 1] = 0; + HEAP16[$pnt1$084 >> 1] = 0; + $i$082 = $i$082 + 1 | 0; + if (($i$082 | 0) >= ($0 | 0)) break; else { + $pnt1$084 = $pnt1$084 + 2 | 0; + $pnt2$083 = $pnt2$083 + 2 | 0; + } + } + } + $11 = $0 + -1 | 0; + if (($ysize | 0) > 1) { + $i$176 = 0; + $pnt1$178 = $2; + $pnt2$177 = $2 + ($11 << 1) | 0; + while (1) { + HEAP16[$pnt2$177 >> 1] = 0; + HEAP16[$pnt1$178 >> 1] = 0; + $i$176 = $i$176 + 1 | 0; + if (($i$176 | 0) >= ($1 | 0)) break; else { + $pnt1$178 = $pnt1$178 + ($0 << 1) | 0; + $pnt2$177 = $pnt2$177 + ($0 << 1) | 0; + } + } + } + $18 = $labelInfo + 1179664 | 0; + $20 = 0 - $0 | 0; + $$sum1 = 1 - $0 | 0; + $$sum2 = ~$0; + $$sum = ($xsize << 1) + 8 | 0; + L11 : do if (($3 | 0) > 1) { + $27 = ($11 | 0) > 1; + $j$069 = 1; + $pnt$073 = $image + (($xsize << 2) + 4) | 0; + $pnt2$272 = $2 + ($0 + 1 << 1) | 0; + $wk_max$071 = 0; + L13 : while (1) { + if ($27) { + $i$256 = 1; + $pnt$164 = $pnt$073; + $pnt2$363 = $pnt2$272; + $wk_max$158 = $wk_max$071; + while (1) { + do if ((HEAPU8[$pnt$164 + 1 >> 0] | 0 | 0) > ($labelingThresh | 0)) { + HEAP16[$pnt2$363 >> 1] = 0; + $wk_max$2 = $wk_max$158; + } else { + $33 = HEAP16[$pnt2$363 + ($20 << 1) >> 1] | 0; + if ($33 << 16 >> 16 > 0) { + HEAP16[$pnt2$363 >> 1] = $33; + $36 = ($33 << 16 >> 16) * 7 | 0; + $38 = $labelInfo + 1310736 + ($36 + -7 << 2) | 0; + HEAP32[$38 >> 2] = (HEAP32[$38 >> 2] | 0) + 1; + $42 = $labelInfo + 1310736 + ($36 + -6 << 2) | 0; + HEAP32[$42 >> 2] = (HEAP32[$42 >> 2] | 0) + $i$256; + $46 = $labelInfo + 1310736 + ($36 + -5 << 2) | 0; + HEAP32[$46 >> 2] = (HEAP32[$46 >> 2] | 0) + $j$069; + HEAP32[$labelInfo + 1310736 + ($36 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $52 = HEAP16[$pnt2$363 + ($$sum1 << 1) >> 1] | 0; + $53 = $52 << 16 >> 16; + $56 = HEAP16[$pnt2$363 + ($$sum2 << 1) >> 1] | 0; + $57 = $56 << 16 >> 16; + $58 = $56 << 16 >> 16 > 0; + if ($52 << 16 >> 16 <= 0) { + if ($58) { + HEAP16[$pnt2$363 >> 1] = $56; + $158 = $57 * 7 | 0; + $160 = $labelInfo + 1310736 + ($158 + -7 << 2) | 0; + HEAP32[$160 >> 2] = (HEAP32[$160 >> 2] | 0) + 1; + $164 = $labelInfo + 1310736 + ($158 + -6 << 2) | 0; + HEAP32[$164 >> 2] = (HEAP32[$164 >> 2] | 0) + $i$256; + $168 = $labelInfo + 1310736 + ($158 + -5 << 2) | 0; + HEAP32[$168 >> 2] = (HEAP32[$168 >> 2] | 0) + $j$069; + $172 = $labelInfo + 1310736 + ($158 + -3 << 2) | 0; + if ((HEAP32[$172 >> 2] | 0) < ($i$256 | 0)) HEAP32[$172 >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($158 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $178 = HEAP16[$pnt2$363 + -2 >> 1] | 0; + if ($178 << 16 >> 16 > 0) { + HEAP16[$pnt2$363 >> 1] = $178; + $181 = ($178 << 16 >> 16) * 7 | 0; + $183 = $labelInfo + 1310736 + ($181 + -7 << 2) | 0; + HEAP32[$183 >> 2] = (HEAP32[$183 >> 2] | 0) + 1; + $187 = $labelInfo + 1310736 + ($181 + -6 << 2) | 0; + HEAP32[$187 >> 2] = (HEAP32[$187 >> 2] | 0) + $i$256; + $191 = $labelInfo + 1310736 + ($181 + -5 << 2) | 0; + HEAP32[$191 >> 2] = (HEAP32[$191 >> 2] | 0) + $j$069; + $195 = $labelInfo + 1310736 + ($181 + -3 << 2) | 0; + if ((HEAP32[$195 >> 2] | 0) >= ($i$256 | 0)) { + $wk_max$2 = $wk_max$158; + break; + } + HEAP32[$195 >> 2] = $i$256; + $wk_max$2 = $wk_max$158; + break; + } else { + $198 = $wk_max$158 + 1 | 0; + if (($wk_max$158 | 0) > 32767) break L13; + HEAP16[$pnt2$363 >> 1] = $198; + HEAP32[$labelInfo + 1179664 + ($wk_max$158 << 2) >> 2] = $198 << 16 >> 16; + $203 = $wk_max$158 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($203 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($203 + 1 << 2) >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($203 + 2 << 2) >> 2] = $j$069; + HEAP32[$labelInfo + 1310736 + ($203 + 3 << 2) >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($203 + 4 << 2) >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($203 + 5 << 2) >> 2] = $j$069; + HEAP32[$labelInfo + 1310736 + ($203 + 6 << 2) >> 2] = $j$069; + $wk_max$2 = $198; + break; + } + } + if ($58) { + $61 = HEAP32[$labelInfo + 1179664 + ($53 + -1 << 2) >> 2] | 0; + $64 = HEAP32[$labelInfo + 1179664 + ($57 + -1 << 2) >> 2] | 0; + if (($61 | 0) > ($64 | 0)) { + HEAP16[$pnt2$363 >> 1] = $64; + if (($wk_max$158 | 0) > 0) { + $k$052 = 0; + $wk$053 = $18; + while (1) { + if ((HEAP32[$wk$053 >> 2] | 0) == ($61 | 0)) HEAP32[$wk$053 >> 2] = $64; + $k$052 = $k$052 + 1 | 0; + if (($k$052 | 0) >= ($wk_max$158 | 0)) { + $81 = $64; + break; + } else $wk$053 = $wk$053 + 4 | 0; + } + } else $81 = $64; + } else { + HEAP16[$pnt2$363 >> 1] = $61; + if (($61 | 0) < ($64 | 0) & ($wk_max$158 | 0) > 0) { + $k$149 = 0; + $wk$150 = $18; + while (1) { + if ((HEAP32[$wk$150 >> 2] | 0) == ($64 | 0)) HEAP32[$wk$150 >> 2] = $61; + $k$149 = $k$149 + 1 | 0; + if (($k$149 | 0) >= ($wk_max$158 | 0)) { + $81 = $61; + break; + } else $wk$150 = $wk$150 + 4 | 0; + } + } else $81 = $61; + } + $83 = ($81 << 16 >> 16) * 7 | 0; + $85 = $labelInfo + 1310736 + ($83 + -7 << 2) | 0; + HEAP32[$85 >> 2] = (HEAP32[$85 >> 2] | 0) + 1; + $89 = $labelInfo + 1310736 + ($83 + -6 << 2) | 0; + HEAP32[$89 >> 2] = (HEAP32[$89 >> 2] | 0) + $i$256; + $93 = $labelInfo + 1310736 + ($83 + -5 << 2) | 0; + HEAP32[$93 >> 2] = (HEAP32[$93 >> 2] | 0) + $j$069; + HEAP32[$labelInfo + 1310736 + ($83 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $99 = HEAP16[$pnt2$363 + -2 >> 1] | 0; + if ($99 << 16 >> 16 <= 0) { + HEAP16[$pnt2$363 >> 1] = $52; + $139 = $53 * 7 | 0; + $141 = $labelInfo + 1310736 + ($139 + -7 << 2) | 0; + HEAP32[$141 >> 2] = (HEAP32[$141 >> 2] | 0) + 1; + $145 = $labelInfo + 1310736 + ($139 + -6 << 2) | 0; + HEAP32[$145 >> 2] = (HEAP32[$145 >> 2] | 0) + $i$256; + $149 = $labelInfo + 1310736 + ($139 + -5 << 2) | 0; + HEAP32[$149 >> 2] = (HEAP32[$149 >> 2] | 0) + $j$069; + $153 = $labelInfo + 1310736 + ($139 + -4 << 2) | 0; + if ((HEAP32[$153 >> 2] | 0) > ($i$256 | 0)) HEAP32[$153 >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($139 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $104 = HEAP32[$labelInfo + 1179664 + ($53 + -1 << 2) >> 2] | 0; + $107 = HEAP32[$labelInfo + 1179664 + (($99 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($104 | 0) > ($107 | 0)) { + HEAP16[$pnt2$363 >> 1] = $107; + if (($wk_max$158 | 0) > 0) { + $k$245 = 0; + $wk$246 = $18; + while (1) { + if ((HEAP32[$wk$246 >> 2] | 0) == ($104 | 0)) HEAP32[$wk$246 >> 2] = $107; + $k$245 = $k$245 + 1 | 0; + if (($k$245 | 0) >= ($wk_max$158 | 0)) { + $124 = $107; + break; + } else $wk$246 = $wk$246 + 4 | 0; + } + } else $124 = $107; + } else { + HEAP16[$pnt2$363 >> 1] = $104; + if (($104 | 0) < ($107 | 0) & ($wk_max$158 | 0) > 0) { + $k$342 = 0; + $wk$343 = $18; + while (1) { + if ((HEAP32[$wk$343 >> 2] | 0) == ($107 | 0)) HEAP32[$wk$343 >> 2] = $104; + $k$342 = $k$342 + 1 | 0; + if (($k$342 | 0) >= ($wk_max$158 | 0)) { + $124 = $104; + break; + } else $wk$343 = $wk$343 + 4 | 0; + } + } else $124 = $104; + } + $126 = ($124 << 16 >> 16) * 7 | 0; + $128 = $labelInfo + 1310736 + ($126 + -7 << 2) | 0; + HEAP32[$128 >> 2] = (HEAP32[$128 >> 2] | 0) + 1; + $132 = $labelInfo + 1310736 + ($126 + -6 << 2) | 0; + HEAP32[$132 >> 2] = (HEAP32[$132 >> 2] | 0) + $i$256; + $136 = $labelInfo + 1310736 + ($126 + -5 << 2) | 0; + HEAP32[$136 >> 2] = (HEAP32[$136 >> 2] | 0) + $j$069; + $wk_max$2 = $wk_max$158; + } while (0); + $i$256 = $i$256 + 1 | 0; + $218 = $pnt$164 + 4 | 0; + $219 = $pnt2$363 + 2 | 0; + if (($i$256 | 0) >= ($11 | 0)) { + $pnt$1$lcssa = $218; + $pnt2$3$lcssa = $219; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $pnt$164 = $218; + $pnt2$363 = $219; + $wk_max$158 = $wk_max$2; + } + } + } else { + $pnt$1$lcssa = $pnt$073; + $pnt2$3$lcssa = $pnt2$272; + $wk_max$1$lcssa = $wk_max$071; + } + $j$069 = $j$069 + 1 | 0; + if (($j$069 | 0) >= ($3 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $pnt$073 = $pnt$1$lcssa + $$sum | 0; + $pnt2$272 = $pnt2$3$lcssa + 4 | 0; + $wk_max$071 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $225 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$338 = 1; + $j$139 = 1; + $wk$440 = $18; + while (1) { + $227 = HEAP32[$wk$440 >> 2] | 0; + if (($227 | 0) == ($i$338 | 0)) { + $233 = $j$139; + $j$2 = $j$139 + 1 | 0; + } else { + $233 = HEAP32[$labelInfo + 1179664 + ($227 + -1 << 2) >> 2] | 0; + $j$2 = $j$139; + } + HEAP32[$wk$440 >> 2] = $233; + if (($i$338 | 0) < ($wk_max$0$lcssa | 0)) { + $i$338 = $i$338 + 1 | 0; + $j$139 = $j$2; + $wk$440 = $wk$440 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $237 = $labelInfo + 8 | 0; + $238 = $j$1$lcssa + -1 | 0; + HEAP32[$237 >> 2] = $238; + if (!$238) $$0 = 0; else { + _memset($225 | 0, 0, $238 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $238 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$436 = 0; + do { + $245 = $i$436 << 2; + HEAP32[$labelInfo + 131084 + ($245 << 2) >> 2] = $0; + HEAP32[$labelInfo + 131084 + (($245 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($245 | 2) << 2) >> 2] = $1; + HEAP32[$labelInfo + 131084 + (($245 | 3) << 2) >> 2] = 0; + $i$436 = $i$436 + 1 | 0; + } while (($i$436 | 0) < (HEAP32[$237 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$534 = 0; + do { + $259 = (HEAP32[$labelInfo + 1179664 + ($i$534 << 2) >> 2] | 0) + -1 | 0; + $260 = $i$534 * 7 | 0; + $263 = $labelInfo + 12 + ($259 << 2) | 0; + HEAP32[$263 >> 2] = (HEAP32[$263 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($260 << 2) >> 2] | 0); + $270 = $259 << 1; + $271 = $labelInfo + 655376 + ($270 << 3) | 0; + HEAPF64[$271 >> 3] = +HEAPF64[$271 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($260 + 1 << 2) >> 2] | 0); + $279 = $labelInfo + 655376 + (($270 | 1) << 3) | 0; + HEAPF64[$279 >> 3] = +HEAPF64[$279 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($260 + 2 << 2) >> 2] | 0); + $282 = $259 << 2; + $283 = $labelInfo + 131084 + ($282 << 2) | 0; + $287 = HEAP32[$labelInfo + 1310736 + ($260 + 3 << 2) >> 2] | 0; + if ((HEAP32[$283 >> 2] | 0) > ($287 | 0)) HEAP32[$283 >> 2] = $287; + $290 = $labelInfo + 131084 + (($282 | 1) << 2) | 0; + $294 = HEAP32[$labelInfo + 1310736 + ($260 + 4 << 2) >> 2] | 0; + if ((HEAP32[$290 >> 2] | 0) < ($294 | 0)) HEAP32[$290 >> 2] = $294; + $297 = $labelInfo + 131084 + (($282 | 2) << 2) | 0; + $301 = HEAP32[$labelInfo + 1310736 + ($260 + 5 << 2) >> 2] | 0; + if ((HEAP32[$297 >> 2] | 0) > ($301 | 0)) HEAP32[$297 >> 2] = $301; + $304 = $labelInfo + 131084 + (($282 | 3) << 2) | 0; + $308 = HEAP32[$labelInfo + 1310736 + ($260 + 6 << 2) >> 2] | 0; + if ((HEAP32[$304 >> 2] | 0) < ($308 | 0)) HEAP32[$304 >> 2] = $308; + $i$534 = $i$534 + 1 | 0; + } while (($i$534 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$237 >> 2] | 0) > 0) { + $i$633 = 0; + do { + $312 = $labelInfo + 12 + ($i$633 << 2) | 0; + $315 = $i$633 << 1; + $316 = $labelInfo + 655376 + ($315 << 3) | 0; + HEAPF64[$316 >> 3] = +HEAPF64[$316 >> 3] / +(HEAP32[$312 >> 2] | 0); + $322 = $labelInfo + 655376 + (($315 | 1) << 3) | 0; + HEAPF64[$322 >> 3] = +HEAPF64[$322 >> 3] / +(HEAP32[$312 >> 2] | 0); + $i$633 = $i$633 + 1 | 0; + } while (($i$633 | 0) < (HEAP32[$237 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubDWIYC($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $$sum2 = 0, $0 = 0, $1 = 0, $103 = 0, $106 = 0, $11 = 0, $123 = 0, $125 = 0, $127 = 0, $131 = 0, $135 = 0, $138 = 0, $140 = 0, $144 = 0, $148 = 0, $152 = 0, $157 = 0, $159 = 0, $163 = 0, $167 = 0, $171 = 0, $177 = 0, $18 = 0, $180 = 0, $182 = 0, $186 = 0, $190 = 0, $194 = 0, $197 = 0, $2 = 0, $20 = 0, $202 = 0, $217 = 0, $218 = 0, $224 = 0, $226 = 0, $232 = 0, $236 = 0, $237 = 0, $244 = 0, $258 = 0, $259 = 0, $262 = 0, $269 = 0, $27 = 0, $270 = 0, $278 = 0, $281 = 0, $282 = 0, $286 = 0, $289 = 0, $293 = 0, $296 = 0, $3 = 0, $300 = 0, $303 = 0, $307 = 0, $311 = 0, $314 = 0, $315 = 0, $32 = 0, $321 = 0, $35 = 0, $37 = 0, $41 = 0, $45 = 0, $51 = 0, $52 = 0, $55 = 0, $56 = 0, $57 = 0, $60 = 0, $63 = 0, $80 = 0, $82 = 0, $84 = 0, $88 = 0, $92 = 0, $98 = 0, $i$082 = 0, $i$176 = 0, $i$256 = 0, $i$338 = 0, $i$436 = 0, $i$534 = 0, $i$633 = 0, $j$069 = 0, $j$1$lcssa = 0, $j$139 = 0, $j$2 = 0, $k$052 = 0, $k$149 = 0, $k$245 = 0, $k$342 = 0, $pnt$073 = 0, $pnt$1$lcssa = 0, $pnt$164 = 0, $pnt1$084 = 0, $pnt1$178 = 0, $pnt2$083 = 0, $pnt2$177 = 0, $pnt2$272 = 0, $pnt2$3$lcssa = 0, $pnt2$363 = 0, $vararg_buffer = 0, $wk$053 = 0, $wk$150 = 0, $wk$246 = 0, $wk$343 = 0, $wk$440 = 0, $wk_max$0$lcssa = 0, $wk_max$071 = 0, $wk_max$1$lcssa = 0, $wk_max$158 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = ($xsize | 0) / 2 | 0; + $1 = ($ysize | 0) / 2 | 0; + $2 = HEAP32[$labelInfo >> 2] | 0; + $3 = $1 + -1 | 0; + if (($xsize | 0) > 1) { + $i$082 = 0; + $pnt1$084 = $2; + $pnt2$083 = $2 + ((Math_imul($3, $0) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$083 >> 1] = 0; + HEAP16[$pnt1$084 >> 1] = 0; + $i$082 = $i$082 + 1 | 0; + if (($i$082 | 0) >= ($0 | 0)) break; else { + $pnt1$084 = $pnt1$084 + 2 | 0; + $pnt2$083 = $pnt2$083 + 2 | 0; + } + } + } + $11 = $0 + -1 | 0; + if (($ysize | 0) > 1) { + $i$176 = 0; + $pnt1$178 = $2; + $pnt2$177 = $2 + ($11 << 1) | 0; + while (1) { + HEAP16[$pnt2$177 >> 1] = 0; + HEAP16[$pnt1$178 >> 1] = 0; + $i$176 = $i$176 + 1 | 0; + if (($i$176 | 0) >= ($1 | 0)) break; else { + $pnt1$178 = $pnt1$178 + ($0 << 1) | 0; + $pnt2$177 = $pnt2$177 + ($0 << 1) | 0; + } + } + } + $18 = $labelInfo + 1179664 | 0; + $20 = 0 - $0 | 0; + $$sum1 = 1 - $0 | 0; + $$sum2 = ~$0; + $$sum = ($xsize << 1) + 8 | 0; + L11 : do if (($3 | 0) > 1) { + $27 = ($11 | 0) > 1; + $j$069 = 1; + $pnt$073 = $image + (($xsize << 2) + 4) | 0; + $pnt2$272 = $2 + ($0 + 1 << 1) | 0; + $wk_max$071 = 0; + L13 : while (1) { + if ($27) { + $i$256 = 1; + $pnt$164 = $pnt$073; + $pnt2$363 = $pnt2$272; + $wk_max$158 = $wk_max$071; + while (1) { + do if ((HEAPU8[$pnt$164 >> 0] | 0 | 0) > ($labelingThresh | 0)) { + $32 = HEAP16[$pnt2$363 + ($20 << 1) >> 1] | 0; + if ($32 << 16 >> 16 > 0) { + HEAP16[$pnt2$363 >> 1] = $32; + $35 = ($32 << 16 >> 16) * 7 | 0; + $37 = $labelInfo + 1310736 + ($35 + -7 << 2) | 0; + HEAP32[$37 >> 2] = (HEAP32[$37 >> 2] | 0) + 1; + $41 = $labelInfo + 1310736 + ($35 + -6 << 2) | 0; + HEAP32[$41 >> 2] = (HEAP32[$41 >> 2] | 0) + $i$256; + $45 = $labelInfo + 1310736 + ($35 + -5 << 2) | 0; + HEAP32[$45 >> 2] = (HEAP32[$45 >> 2] | 0) + $j$069; + HEAP32[$labelInfo + 1310736 + ($35 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $51 = HEAP16[$pnt2$363 + ($$sum1 << 1) >> 1] | 0; + $52 = $51 << 16 >> 16; + $55 = HEAP16[$pnt2$363 + ($$sum2 << 1) >> 1] | 0; + $56 = $55 << 16 >> 16; + $57 = $55 << 16 >> 16 > 0; + if ($51 << 16 >> 16 <= 0) { + if ($57) { + HEAP16[$pnt2$363 >> 1] = $55; + $157 = $56 * 7 | 0; + $159 = $labelInfo + 1310736 + ($157 + -7 << 2) | 0; + HEAP32[$159 >> 2] = (HEAP32[$159 >> 2] | 0) + 1; + $163 = $labelInfo + 1310736 + ($157 + -6 << 2) | 0; + HEAP32[$163 >> 2] = (HEAP32[$163 >> 2] | 0) + $i$256; + $167 = $labelInfo + 1310736 + ($157 + -5 << 2) | 0; + HEAP32[$167 >> 2] = (HEAP32[$167 >> 2] | 0) + $j$069; + $171 = $labelInfo + 1310736 + ($157 + -3 << 2) | 0; + if ((HEAP32[$171 >> 2] | 0) < ($i$256 | 0)) HEAP32[$171 >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($157 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $177 = HEAP16[$pnt2$363 + -2 >> 1] | 0; + if ($177 << 16 >> 16 > 0) { + HEAP16[$pnt2$363 >> 1] = $177; + $180 = ($177 << 16 >> 16) * 7 | 0; + $182 = $labelInfo + 1310736 + ($180 + -7 << 2) | 0; + HEAP32[$182 >> 2] = (HEAP32[$182 >> 2] | 0) + 1; + $186 = $labelInfo + 1310736 + ($180 + -6 << 2) | 0; + HEAP32[$186 >> 2] = (HEAP32[$186 >> 2] | 0) + $i$256; + $190 = $labelInfo + 1310736 + ($180 + -5 << 2) | 0; + HEAP32[$190 >> 2] = (HEAP32[$190 >> 2] | 0) + $j$069; + $194 = $labelInfo + 1310736 + ($180 + -3 << 2) | 0; + if ((HEAP32[$194 >> 2] | 0) >= ($i$256 | 0)) { + $wk_max$2 = $wk_max$158; + break; + } + HEAP32[$194 >> 2] = $i$256; + $wk_max$2 = $wk_max$158; + break; + } else { + $197 = $wk_max$158 + 1 | 0; + if (($wk_max$158 | 0) > 32767) break L13; + HEAP16[$pnt2$363 >> 1] = $197; + HEAP32[$labelInfo + 1179664 + ($wk_max$158 << 2) >> 2] = $197 << 16 >> 16; + $202 = $wk_max$158 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($202 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($202 + 1 << 2) >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($202 + 2 << 2) >> 2] = $j$069; + HEAP32[$labelInfo + 1310736 + ($202 + 3 << 2) >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($202 + 4 << 2) >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($202 + 5 << 2) >> 2] = $j$069; + HEAP32[$labelInfo + 1310736 + ($202 + 6 << 2) >> 2] = $j$069; + $wk_max$2 = $197; + break; + } + } + if ($57) { + $60 = HEAP32[$labelInfo + 1179664 + ($52 + -1 << 2) >> 2] | 0; + $63 = HEAP32[$labelInfo + 1179664 + ($56 + -1 << 2) >> 2] | 0; + if (($60 | 0) > ($63 | 0)) { + HEAP16[$pnt2$363 >> 1] = $63; + if (($wk_max$158 | 0) > 0) { + $k$052 = 0; + $wk$053 = $18; + while (1) { + if ((HEAP32[$wk$053 >> 2] | 0) == ($60 | 0)) HEAP32[$wk$053 >> 2] = $63; + $k$052 = $k$052 + 1 | 0; + if (($k$052 | 0) >= ($wk_max$158 | 0)) { + $80 = $63; + break; + } else $wk$053 = $wk$053 + 4 | 0; + } + } else $80 = $63; + } else { + HEAP16[$pnt2$363 >> 1] = $60; + if (($60 | 0) < ($63 | 0) & ($wk_max$158 | 0) > 0) { + $k$149 = 0; + $wk$150 = $18; + while (1) { + if ((HEAP32[$wk$150 >> 2] | 0) == ($63 | 0)) HEAP32[$wk$150 >> 2] = $60; + $k$149 = $k$149 + 1 | 0; + if (($k$149 | 0) >= ($wk_max$158 | 0)) { + $80 = $60; + break; + } else $wk$150 = $wk$150 + 4 | 0; + } + } else $80 = $60; + } + $82 = ($80 << 16 >> 16) * 7 | 0; + $84 = $labelInfo + 1310736 + ($82 + -7 << 2) | 0; + HEAP32[$84 >> 2] = (HEAP32[$84 >> 2] | 0) + 1; + $88 = $labelInfo + 1310736 + ($82 + -6 << 2) | 0; + HEAP32[$88 >> 2] = (HEAP32[$88 >> 2] | 0) + $i$256; + $92 = $labelInfo + 1310736 + ($82 + -5 << 2) | 0; + HEAP32[$92 >> 2] = (HEAP32[$92 >> 2] | 0) + $j$069; + HEAP32[$labelInfo + 1310736 + ($82 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $98 = HEAP16[$pnt2$363 + -2 >> 1] | 0; + if ($98 << 16 >> 16 <= 0) { + HEAP16[$pnt2$363 >> 1] = $51; + $138 = $52 * 7 | 0; + $140 = $labelInfo + 1310736 + ($138 + -7 << 2) | 0; + HEAP32[$140 >> 2] = (HEAP32[$140 >> 2] | 0) + 1; + $144 = $labelInfo + 1310736 + ($138 + -6 << 2) | 0; + HEAP32[$144 >> 2] = (HEAP32[$144 >> 2] | 0) + $i$256; + $148 = $labelInfo + 1310736 + ($138 + -5 << 2) | 0; + HEAP32[$148 >> 2] = (HEAP32[$148 >> 2] | 0) + $j$069; + $152 = $labelInfo + 1310736 + ($138 + -4 << 2) | 0; + if ((HEAP32[$152 >> 2] | 0) > ($i$256 | 0)) HEAP32[$152 >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($138 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $103 = HEAP32[$labelInfo + 1179664 + ($52 + -1 << 2) >> 2] | 0; + $106 = HEAP32[$labelInfo + 1179664 + (($98 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($103 | 0) > ($106 | 0)) { + HEAP16[$pnt2$363 >> 1] = $106; + if (($wk_max$158 | 0) > 0) { + $k$245 = 0; + $wk$246 = $18; + while (1) { + if ((HEAP32[$wk$246 >> 2] | 0) == ($103 | 0)) HEAP32[$wk$246 >> 2] = $106; + $k$245 = $k$245 + 1 | 0; + if (($k$245 | 0) >= ($wk_max$158 | 0)) { + $123 = $106; + break; + } else $wk$246 = $wk$246 + 4 | 0; + } + } else $123 = $106; + } else { + HEAP16[$pnt2$363 >> 1] = $103; + if (($103 | 0) < ($106 | 0) & ($wk_max$158 | 0) > 0) { + $k$342 = 0; + $wk$343 = $18; + while (1) { + if ((HEAP32[$wk$343 >> 2] | 0) == ($106 | 0)) HEAP32[$wk$343 >> 2] = $103; + $k$342 = $k$342 + 1 | 0; + if (($k$342 | 0) >= ($wk_max$158 | 0)) { + $123 = $103; + break; + } else $wk$343 = $wk$343 + 4 | 0; + } + } else $123 = $103; + } + $125 = ($123 << 16 >> 16) * 7 | 0; + $127 = $labelInfo + 1310736 + ($125 + -7 << 2) | 0; + HEAP32[$127 >> 2] = (HEAP32[$127 >> 2] | 0) + 1; + $131 = $labelInfo + 1310736 + ($125 + -6 << 2) | 0; + HEAP32[$131 >> 2] = (HEAP32[$131 >> 2] | 0) + $i$256; + $135 = $labelInfo + 1310736 + ($125 + -5 << 2) | 0; + HEAP32[$135 >> 2] = (HEAP32[$135 >> 2] | 0) + $j$069; + $wk_max$2 = $wk_max$158; + } else { + HEAP16[$pnt2$363 >> 1] = 0; + $wk_max$2 = $wk_max$158; + } while (0); + $i$256 = $i$256 + 1 | 0; + $217 = $pnt$164 + 4 | 0; + $218 = $pnt2$363 + 2 | 0; + if (($i$256 | 0) >= ($11 | 0)) { + $pnt$1$lcssa = $217; + $pnt2$3$lcssa = $218; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $pnt$164 = $217; + $pnt2$363 = $218; + $wk_max$158 = $wk_max$2; + } + } + } else { + $pnt$1$lcssa = $pnt$073; + $pnt2$3$lcssa = $pnt2$272; + $wk_max$1$lcssa = $wk_max$071; + } + $j$069 = $j$069 + 1 | 0; + if (($j$069 | 0) >= ($3 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $pnt$073 = $pnt$1$lcssa + $$sum | 0; + $pnt2$272 = $pnt2$3$lcssa + 4 | 0; + $wk_max$071 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $224 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$338 = 1; + $j$139 = 1; + $wk$440 = $18; + while (1) { + $226 = HEAP32[$wk$440 >> 2] | 0; + if (($226 | 0) == ($i$338 | 0)) { + $232 = $j$139; + $j$2 = $j$139 + 1 | 0; + } else { + $232 = HEAP32[$labelInfo + 1179664 + ($226 + -1 << 2) >> 2] | 0; + $j$2 = $j$139; + } + HEAP32[$wk$440 >> 2] = $232; + if (($i$338 | 0) < ($wk_max$0$lcssa | 0)) { + $i$338 = $i$338 + 1 | 0; + $j$139 = $j$2; + $wk$440 = $wk$440 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $236 = $labelInfo + 8 | 0; + $237 = $j$1$lcssa + -1 | 0; + HEAP32[$236 >> 2] = $237; + if (!$237) $$0 = 0; else { + _memset($224 | 0, 0, $237 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $237 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$436 = 0; + do { + $244 = $i$436 << 2; + HEAP32[$labelInfo + 131084 + ($244 << 2) >> 2] = $0; + HEAP32[$labelInfo + 131084 + (($244 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($244 | 2) << 2) >> 2] = $1; + HEAP32[$labelInfo + 131084 + (($244 | 3) << 2) >> 2] = 0; + $i$436 = $i$436 + 1 | 0; + } while (($i$436 | 0) < (HEAP32[$236 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$534 = 0; + do { + $258 = (HEAP32[$labelInfo + 1179664 + ($i$534 << 2) >> 2] | 0) + -1 | 0; + $259 = $i$534 * 7 | 0; + $262 = $labelInfo + 12 + ($258 << 2) | 0; + HEAP32[$262 >> 2] = (HEAP32[$262 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($259 << 2) >> 2] | 0); + $269 = $258 << 1; + $270 = $labelInfo + 655376 + ($269 << 3) | 0; + HEAPF64[$270 >> 3] = +HEAPF64[$270 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($259 + 1 << 2) >> 2] | 0); + $278 = $labelInfo + 655376 + (($269 | 1) << 3) | 0; + HEAPF64[$278 >> 3] = +HEAPF64[$278 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($259 + 2 << 2) >> 2] | 0); + $281 = $258 << 2; + $282 = $labelInfo + 131084 + ($281 << 2) | 0; + $286 = HEAP32[$labelInfo + 1310736 + ($259 + 3 << 2) >> 2] | 0; + if ((HEAP32[$282 >> 2] | 0) > ($286 | 0)) HEAP32[$282 >> 2] = $286; + $289 = $labelInfo + 131084 + (($281 | 1) << 2) | 0; + $293 = HEAP32[$labelInfo + 1310736 + ($259 + 4 << 2) >> 2] | 0; + if ((HEAP32[$289 >> 2] | 0) < ($293 | 0)) HEAP32[$289 >> 2] = $293; + $296 = $labelInfo + 131084 + (($281 | 2) << 2) | 0; + $300 = HEAP32[$labelInfo + 1310736 + ($259 + 5 << 2) >> 2] | 0; + if ((HEAP32[$296 >> 2] | 0) > ($300 | 0)) HEAP32[$296 >> 2] = $300; + $303 = $labelInfo + 131084 + (($281 | 3) << 2) | 0; + $307 = HEAP32[$labelInfo + 1310736 + ($259 + 6 << 2) >> 2] | 0; + if ((HEAP32[$303 >> 2] | 0) < ($307 | 0)) HEAP32[$303 >> 2] = $307; + $i$534 = $i$534 + 1 | 0; + } while (($i$534 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$236 >> 2] | 0) > 0) { + $i$633 = 0; + do { + $311 = $labelInfo + 12 + ($i$633 << 2) | 0; + $314 = $i$633 << 1; + $315 = $labelInfo + 655376 + ($314 << 3) | 0; + HEAPF64[$315 >> 3] = +HEAPF64[$315 >> 3] / +(HEAP32[$311 >> 2] | 0); + $321 = $labelInfo + 655376 + (($314 | 1) << 3) | 0; + HEAPF64[$321 >> 3] = +HEAPF64[$321 >> 3] / +(HEAP32[$311 >> 2] | 0); + $i$633 = $i$633 + 1 | 0; + } while (($i$633 | 0) < (HEAP32[$236 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubDBIYC($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $$sum2 = 0, $0 = 0, $1 = 0, $103 = 0, $106 = 0, $11 = 0, $123 = 0, $125 = 0, $127 = 0, $131 = 0, $135 = 0, $138 = 0, $140 = 0, $144 = 0, $148 = 0, $152 = 0, $157 = 0, $159 = 0, $163 = 0, $167 = 0, $171 = 0, $177 = 0, $18 = 0, $180 = 0, $182 = 0, $186 = 0, $190 = 0, $194 = 0, $197 = 0, $2 = 0, $20 = 0, $202 = 0, $217 = 0, $218 = 0, $224 = 0, $226 = 0, $232 = 0, $236 = 0, $237 = 0, $244 = 0, $258 = 0, $259 = 0, $262 = 0, $269 = 0, $27 = 0, $270 = 0, $278 = 0, $281 = 0, $282 = 0, $286 = 0, $289 = 0, $293 = 0, $296 = 0, $3 = 0, $300 = 0, $303 = 0, $307 = 0, $311 = 0, $314 = 0, $315 = 0, $32 = 0, $321 = 0, $35 = 0, $37 = 0, $41 = 0, $45 = 0, $51 = 0, $52 = 0, $55 = 0, $56 = 0, $57 = 0, $60 = 0, $63 = 0, $80 = 0, $82 = 0, $84 = 0, $88 = 0, $92 = 0, $98 = 0, $i$082 = 0, $i$176 = 0, $i$256 = 0, $i$338 = 0, $i$436 = 0, $i$534 = 0, $i$633 = 0, $j$069 = 0, $j$1$lcssa = 0, $j$139 = 0, $j$2 = 0, $k$052 = 0, $k$149 = 0, $k$245 = 0, $k$342 = 0, $pnt$073 = 0, $pnt$1$lcssa = 0, $pnt$164 = 0, $pnt1$084 = 0, $pnt1$178 = 0, $pnt2$083 = 0, $pnt2$177 = 0, $pnt2$272 = 0, $pnt2$3$lcssa = 0, $pnt2$363 = 0, $vararg_buffer = 0, $wk$053 = 0, $wk$150 = 0, $wk$246 = 0, $wk$343 = 0, $wk$440 = 0, $wk_max$0$lcssa = 0, $wk_max$071 = 0, $wk_max$1$lcssa = 0, $wk_max$158 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = ($xsize | 0) / 2 | 0; + $1 = ($ysize | 0) / 2 | 0; + $2 = HEAP32[$labelInfo >> 2] | 0; + $3 = $1 + -1 | 0; + if (($xsize | 0) > 1) { + $i$082 = 0; + $pnt1$084 = $2; + $pnt2$083 = $2 + ((Math_imul($3, $0) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$083 >> 1] = 0; + HEAP16[$pnt1$084 >> 1] = 0; + $i$082 = $i$082 + 1 | 0; + if (($i$082 | 0) >= ($0 | 0)) break; else { + $pnt1$084 = $pnt1$084 + 2 | 0; + $pnt2$083 = $pnt2$083 + 2 | 0; + } + } + } + $11 = $0 + -1 | 0; + if (($ysize | 0) > 1) { + $i$176 = 0; + $pnt1$178 = $2; + $pnt2$177 = $2 + ($11 << 1) | 0; + while (1) { + HEAP16[$pnt2$177 >> 1] = 0; + HEAP16[$pnt1$178 >> 1] = 0; + $i$176 = $i$176 + 1 | 0; + if (($i$176 | 0) >= ($1 | 0)) break; else { + $pnt1$178 = $pnt1$178 + ($0 << 1) | 0; + $pnt2$177 = $pnt2$177 + ($0 << 1) | 0; + } + } + } + $18 = $labelInfo + 1179664 | 0; + $20 = 0 - $0 | 0; + $$sum1 = 1 - $0 | 0; + $$sum2 = ~$0; + $$sum = ($xsize << 1) + 8 | 0; + L11 : do if (($3 | 0) > 1) { + $27 = ($11 | 0) > 1; + $j$069 = 1; + $pnt$073 = $image + (($xsize << 2) + 4) | 0; + $pnt2$272 = $2 + ($0 + 1 << 1) | 0; + $wk_max$071 = 0; + L13 : while (1) { + if ($27) { + $i$256 = 1; + $pnt$164 = $pnt$073; + $pnt2$363 = $pnt2$272; + $wk_max$158 = $wk_max$071; + while (1) { + do if ((HEAPU8[$pnt$164 >> 0] | 0 | 0) > ($labelingThresh | 0)) { + HEAP16[$pnt2$363 >> 1] = 0; + $wk_max$2 = $wk_max$158; + } else { + $32 = HEAP16[$pnt2$363 + ($20 << 1) >> 1] | 0; + if ($32 << 16 >> 16 > 0) { + HEAP16[$pnt2$363 >> 1] = $32; + $35 = ($32 << 16 >> 16) * 7 | 0; + $37 = $labelInfo + 1310736 + ($35 + -7 << 2) | 0; + HEAP32[$37 >> 2] = (HEAP32[$37 >> 2] | 0) + 1; + $41 = $labelInfo + 1310736 + ($35 + -6 << 2) | 0; + HEAP32[$41 >> 2] = (HEAP32[$41 >> 2] | 0) + $i$256; + $45 = $labelInfo + 1310736 + ($35 + -5 << 2) | 0; + HEAP32[$45 >> 2] = (HEAP32[$45 >> 2] | 0) + $j$069; + HEAP32[$labelInfo + 1310736 + ($35 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $51 = HEAP16[$pnt2$363 + ($$sum1 << 1) >> 1] | 0; + $52 = $51 << 16 >> 16; + $55 = HEAP16[$pnt2$363 + ($$sum2 << 1) >> 1] | 0; + $56 = $55 << 16 >> 16; + $57 = $55 << 16 >> 16 > 0; + if ($51 << 16 >> 16 <= 0) { + if ($57) { + HEAP16[$pnt2$363 >> 1] = $55; + $157 = $56 * 7 | 0; + $159 = $labelInfo + 1310736 + ($157 + -7 << 2) | 0; + HEAP32[$159 >> 2] = (HEAP32[$159 >> 2] | 0) + 1; + $163 = $labelInfo + 1310736 + ($157 + -6 << 2) | 0; + HEAP32[$163 >> 2] = (HEAP32[$163 >> 2] | 0) + $i$256; + $167 = $labelInfo + 1310736 + ($157 + -5 << 2) | 0; + HEAP32[$167 >> 2] = (HEAP32[$167 >> 2] | 0) + $j$069; + $171 = $labelInfo + 1310736 + ($157 + -3 << 2) | 0; + if ((HEAP32[$171 >> 2] | 0) < ($i$256 | 0)) HEAP32[$171 >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($157 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $177 = HEAP16[$pnt2$363 + -2 >> 1] | 0; + if ($177 << 16 >> 16 > 0) { + HEAP16[$pnt2$363 >> 1] = $177; + $180 = ($177 << 16 >> 16) * 7 | 0; + $182 = $labelInfo + 1310736 + ($180 + -7 << 2) | 0; + HEAP32[$182 >> 2] = (HEAP32[$182 >> 2] | 0) + 1; + $186 = $labelInfo + 1310736 + ($180 + -6 << 2) | 0; + HEAP32[$186 >> 2] = (HEAP32[$186 >> 2] | 0) + $i$256; + $190 = $labelInfo + 1310736 + ($180 + -5 << 2) | 0; + HEAP32[$190 >> 2] = (HEAP32[$190 >> 2] | 0) + $j$069; + $194 = $labelInfo + 1310736 + ($180 + -3 << 2) | 0; + if ((HEAP32[$194 >> 2] | 0) >= ($i$256 | 0)) { + $wk_max$2 = $wk_max$158; + break; + } + HEAP32[$194 >> 2] = $i$256; + $wk_max$2 = $wk_max$158; + break; + } else { + $197 = $wk_max$158 + 1 | 0; + if (($wk_max$158 | 0) > 32767) break L13; + HEAP16[$pnt2$363 >> 1] = $197; + HEAP32[$labelInfo + 1179664 + ($wk_max$158 << 2) >> 2] = $197 << 16 >> 16; + $202 = $wk_max$158 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($202 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($202 + 1 << 2) >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($202 + 2 << 2) >> 2] = $j$069; + HEAP32[$labelInfo + 1310736 + ($202 + 3 << 2) >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($202 + 4 << 2) >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($202 + 5 << 2) >> 2] = $j$069; + HEAP32[$labelInfo + 1310736 + ($202 + 6 << 2) >> 2] = $j$069; + $wk_max$2 = $197; + break; + } + } + if ($57) { + $60 = HEAP32[$labelInfo + 1179664 + ($52 + -1 << 2) >> 2] | 0; + $63 = HEAP32[$labelInfo + 1179664 + ($56 + -1 << 2) >> 2] | 0; + if (($60 | 0) > ($63 | 0)) { + HEAP16[$pnt2$363 >> 1] = $63; + if (($wk_max$158 | 0) > 0) { + $k$052 = 0; + $wk$053 = $18; + while (1) { + if ((HEAP32[$wk$053 >> 2] | 0) == ($60 | 0)) HEAP32[$wk$053 >> 2] = $63; + $k$052 = $k$052 + 1 | 0; + if (($k$052 | 0) >= ($wk_max$158 | 0)) { + $80 = $63; + break; + } else $wk$053 = $wk$053 + 4 | 0; + } + } else $80 = $63; + } else { + HEAP16[$pnt2$363 >> 1] = $60; + if (($60 | 0) < ($63 | 0) & ($wk_max$158 | 0) > 0) { + $k$149 = 0; + $wk$150 = $18; + while (1) { + if ((HEAP32[$wk$150 >> 2] | 0) == ($63 | 0)) HEAP32[$wk$150 >> 2] = $60; + $k$149 = $k$149 + 1 | 0; + if (($k$149 | 0) >= ($wk_max$158 | 0)) { + $80 = $60; + break; + } else $wk$150 = $wk$150 + 4 | 0; + } + } else $80 = $60; + } + $82 = ($80 << 16 >> 16) * 7 | 0; + $84 = $labelInfo + 1310736 + ($82 + -7 << 2) | 0; + HEAP32[$84 >> 2] = (HEAP32[$84 >> 2] | 0) + 1; + $88 = $labelInfo + 1310736 + ($82 + -6 << 2) | 0; + HEAP32[$88 >> 2] = (HEAP32[$88 >> 2] | 0) + $i$256; + $92 = $labelInfo + 1310736 + ($82 + -5 << 2) | 0; + HEAP32[$92 >> 2] = (HEAP32[$92 >> 2] | 0) + $j$069; + HEAP32[$labelInfo + 1310736 + ($82 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $98 = HEAP16[$pnt2$363 + -2 >> 1] | 0; + if ($98 << 16 >> 16 <= 0) { + HEAP16[$pnt2$363 >> 1] = $51; + $138 = $52 * 7 | 0; + $140 = $labelInfo + 1310736 + ($138 + -7 << 2) | 0; + HEAP32[$140 >> 2] = (HEAP32[$140 >> 2] | 0) + 1; + $144 = $labelInfo + 1310736 + ($138 + -6 << 2) | 0; + HEAP32[$144 >> 2] = (HEAP32[$144 >> 2] | 0) + $i$256; + $148 = $labelInfo + 1310736 + ($138 + -5 << 2) | 0; + HEAP32[$148 >> 2] = (HEAP32[$148 >> 2] | 0) + $j$069; + $152 = $labelInfo + 1310736 + ($138 + -4 << 2) | 0; + if ((HEAP32[$152 >> 2] | 0) > ($i$256 | 0)) HEAP32[$152 >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($138 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $103 = HEAP32[$labelInfo + 1179664 + ($52 + -1 << 2) >> 2] | 0; + $106 = HEAP32[$labelInfo + 1179664 + (($98 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($103 | 0) > ($106 | 0)) { + HEAP16[$pnt2$363 >> 1] = $106; + if (($wk_max$158 | 0) > 0) { + $k$245 = 0; + $wk$246 = $18; + while (1) { + if ((HEAP32[$wk$246 >> 2] | 0) == ($103 | 0)) HEAP32[$wk$246 >> 2] = $106; + $k$245 = $k$245 + 1 | 0; + if (($k$245 | 0) >= ($wk_max$158 | 0)) { + $123 = $106; + break; + } else $wk$246 = $wk$246 + 4 | 0; + } + } else $123 = $106; + } else { + HEAP16[$pnt2$363 >> 1] = $103; + if (($103 | 0) < ($106 | 0) & ($wk_max$158 | 0) > 0) { + $k$342 = 0; + $wk$343 = $18; + while (1) { + if ((HEAP32[$wk$343 >> 2] | 0) == ($106 | 0)) HEAP32[$wk$343 >> 2] = $103; + $k$342 = $k$342 + 1 | 0; + if (($k$342 | 0) >= ($wk_max$158 | 0)) { + $123 = $103; + break; + } else $wk$343 = $wk$343 + 4 | 0; + } + } else $123 = $103; + } + $125 = ($123 << 16 >> 16) * 7 | 0; + $127 = $labelInfo + 1310736 + ($125 + -7 << 2) | 0; + HEAP32[$127 >> 2] = (HEAP32[$127 >> 2] | 0) + 1; + $131 = $labelInfo + 1310736 + ($125 + -6 << 2) | 0; + HEAP32[$131 >> 2] = (HEAP32[$131 >> 2] | 0) + $i$256; + $135 = $labelInfo + 1310736 + ($125 + -5 << 2) | 0; + HEAP32[$135 >> 2] = (HEAP32[$135 >> 2] | 0) + $j$069; + $wk_max$2 = $wk_max$158; + } while (0); + $i$256 = $i$256 + 1 | 0; + $217 = $pnt$164 + 4 | 0; + $218 = $pnt2$363 + 2 | 0; + if (($i$256 | 0) >= ($11 | 0)) { + $pnt$1$lcssa = $217; + $pnt2$3$lcssa = $218; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $pnt$164 = $217; + $pnt2$363 = $218; + $wk_max$158 = $wk_max$2; + } + } + } else { + $pnt$1$lcssa = $pnt$073; + $pnt2$3$lcssa = $pnt2$272; + $wk_max$1$lcssa = $wk_max$071; + } + $j$069 = $j$069 + 1 | 0; + if (($j$069 | 0) >= ($3 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $pnt$073 = $pnt$1$lcssa + $$sum | 0; + $pnt2$272 = $pnt2$3$lcssa + 4 | 0; + $wk_max$071 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $224 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$338 = 1; + $j$139 = 1; + $wk$440 = $18; + while (1) { + $226 = HEAP32[$wk$440 >> 2] | 0; + if (($226 | 0) == ($i$338 | 0)) { + $232 = $j$139; + $j$2 = $j$139 + 1 | 0; + } else { + $232 = HEAP32[$labelInfo + 1179664 + ($226 + -1 << 2) >> 2] | 0; + $j$2 = $j$139; + } + HEAP32[$wk$440 >> 2] = $232; + if (($i$338 | 0) < ($wk_max$0$lcssa | 0)) { + $i$338 = $i$338 + 1 | 0; + $j$139 = $j$2; + $wk$440 = $wk$440 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $236 = $labelInfo + 8 | 0; + $237 = $j$1$lcssa + -1 | 0; + HEAP32[$236 >> 2] = $237; + if (!$237) $$0 = 0; else { + _memset($224 | 0, 0, $237 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $237 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$436 = 0; + do { + $244 = $i$436 << 2; + HEAP32[$labelInfo + 131084 + ($244 << 2) >> 2] = $0; + HEAP32[$labelInfo + 131084 + (($244 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($244 | 2) << 2) >> 2] = $1; + HEAP32[$labelInfo + 131084 + (($244 | 3) << 2) >> 2] = 0; + $i$436 = $i$436 + 1 | 0; + } while (($i$436 | 0) < (HEAP32[$236 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$534 = 0; + do { + $258 = (HEAP32[$labelInfo + 1179664 + ($i$534 << 2) >> 2] | 0) + -1 | 0; + $259 = $i$534 * 7 | 0; + $262 = $labelInfo + 12 + ($258 << 2) | 0; + HEAP32[$262 >> 2] = (HEAP32[$262 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($259 << 2) >> 2] | 0); + $269 = $258 << 1; + $270 = $labelInfo + 655376 + ($269 << 3) | 0; + HEAPF64[$270 >> 3] = +HEAPF64[$270 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($259 + 1 << 2) >> 2] | 0); + $278 = $labelInfo + 655376 + (($269 | 1) << 3) | 0; + HEAPF64[$278 >> 3] = +HEAPF64[$278 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($259 + 2 << 2) >> 2] | 0); + $281 = $258 << 2; + $282 = $labelInfo + 131084 + ($281 << 2) | 0; + $286 = HEAP32[$labelInfo + 1310736 + ($259 + 3 << 2) >> 2] | 0; + if ((HEAP32[$282 >> 2] | 0) > ($286 | 0)) HEAP32[$282 >> 2] = $286; + $289 = $labelInfo + 131084 + (($281 | 1) << 2) | 0; + $293 = HEAP32[$labelInfo + 1310736 + ($259 + 4 << 2) >> 2] | 0; + if ((HEAP32[$289 >> 2] | 0) < ($293 | 0)) HEAP32[$289 >> 2] = $293; + $296 = $labelInfo + 131084 + (($281 | 2) << 2) | 0; + $300 = HEAP32[$labelInfo + 1310736 + ($259 + 5 << 2) >> 2] | 0; + if ((HEAP32[$296 >> 2] | 0) > ($300 | 0)) HEAP32[$296 >> 2] = $300; + $303 = $labelInfo + 131084 + (($281 | 3) << 2) | 0; + $307 = HEAP32[$labelInfo + 1310736 + ($259 + 6 << 2) >> 2] | 0; + if ((HEAP32[$303 >> 2] | 0) < ($307 | 0)) HEAP32[$303 >> 2] = $307; + $i$534 = $i$534 + 1 | 0; + } while (($i$534 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$236 >> 2] | 0) > 0) { + $i$633 = 0; + do { + $311 = $labelInfo + 12 + ($i$633 << 2) | 0; + $314 = $i$633 << 1; + $315 = $labelInfo + 655376 + ($314 << 3) | 0; + HEAPF64[$315 >> 3] = +HEAPF64[$315 >> 3] / +(HEAP32[$311 >> 2] | 0); + $321 = $labelInfo + 655376 + (($314 | 1) << 3) | 0; + HEAPF64[$321 >> 3] = +HEAPF64[$321 >> 3] / +(HEAP32[$311 >> 2] | 0); + $i$633 = $i$633 + 1 | 0; + } while (($i$633 | 0) < (HEAP32[$236 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubDWIC($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $$sum2 = 0, $0 = 0, $1 = 0, $102 = 0, $105 = 0, $11 = 0, $122 = 0, $124 = 0, $126 = 0, $130 = 0, $134 = 0, $137 = 0, $139 = 0, $143 = 0, $147 = 0, $151 = 0, $156 = 0, $158 = 0, $162 = 0, $166 = 0, $170 = 0, $176 = 0, $179 = 0, $18 = 0, $181 = 0, $185 = 0, $189 = 0, $19 = 0, $193 = 0, $196 = 0, $2 = 0, $201 = 0, $216 = 0, $217 = 0, $223 = 0, $225 = 0, $231 = 0, $235 = 0, $236 = 0, $243 = 0, $257 = 0, $258 = 0, $26 = 0, $261 = 0, $268 = 0, $269 = 0, $277 = 0, $280 = 0, $281 = 0, $285 = 0, $288 = 0, $292 = 0, $295 = 0, $299 = 0, $3 = 0, $302 = 0, $306 = 0, $31 = 0, $310 = 0, $313 = 0, $314 = 0, $320 = 0, $34 = 0, $36 = 0, $40 = 0, $44 = 0, $50 = 0, $51 = 0, $54 = 0, $55 = 0, $56 = 0, $59 = 0, $62 = 0, $79 = 0, $81 = 0, $83 = 0, $87 = 0, $91 = 0, $97 = 0, $i$082 = 0, $i$176 = 0, $i$256 = 0, $i$338 = 0, $i$436 = 0, $i$534 = 0, $i$633 = 0, $j$069 = 0, $j$1$lcssa = 0, $j$139 = 0, $j$2 = 0, $k$052 = 0, $k$149 = 0, $k$245 = 0, $k$342 = 0, $pnt$073 = 0, $pnt$1$lcssa = 0, $pnt$164 = 0, $pnt1$084 = 0, $pnt1$178 = 0, $pnt2$083 = 0, $pnt2$177 = 0, $pnt2$272 = 0, $pnt2$3$lcssa = 0, $pnt2$363 = 0, $vararg_buffer = 0, $wk$053 = 0, $wk$150 = 0, $wk$246 = 0, $wk$343 = 0, $wk$440 = 0, $wk_max$0$lcssa = 0, $wk_max$071 = 0, $wk_max$1$lcssa = 0, $wk_max$158 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = ($xsize | 0) / 2 | 0; + $1 = ($ysize | 0) / 2 | 0; + $2 = HEAP32[$labelInfo >> 2] | 0; + $3 = $1 + -1 | 0; + if (($xsize | 0) > 1) { + $i$082 = 0; + $pnt1$084 = $2; + $pnt2$083 = $2 + ((Math_imul($3, $0) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$083 >> 1] = 0; + HEAP16[$pnt1$084 >> 1] = 0; + $i$082 = $i$082 + 1 | 0; + if (($i$082 | 0) >= ($0 | 0)) break; else { + $pnt1$084 = $pnt1$084 + 2 | 0; + $pnt2$083 = $pnt2$083 + 2 | 0; + } + } + } + $11 = $0 + -1 | 0; + if (($ysize | 0) > 1) { + $i$176 = 0; + $pnt1$178 = $2; + $pnt2$177 = $2 + ($11 << 1) | 0; + while (1) { + HEAP16[$pnt2$177 >> 1] = 0; + HEAP16[$pnt1$178 >> 1] = 0; + $i$176 = $i$176 + 1 | 0; + if (($i$176 | 0) >= ($1 | 0)) break; else { + $pnt1$178 = $pnt1$178 + ($0 << 1) | 0; + $pnt2$177 = $pnt2$177 + ($0 << 1) | 0; + } + } + } + $18 = $labelInfo + 1179664 | 0; + $19 = 0 - $0 | 0; + $$sum1 = 1 - $0 | 0; + $$sum2 = ~$0; + $$sum = $xsize + 4 | 0; + L11 : do if (($3 | 0) > 1) { + $26 = ($11 | 0) > 1; + $j$069 = 1; + $pnt$073 = $image + (($xsize << 1) + 2) | 0; + $pnt2$272 = $2 + ($0 + 1 << 1) | 0; + $wk_max$071 = 0; + L13 : while (1) { + if ($26) { + $i$256 = 1; + $pnt$164 = $pnt$073; + $pnt2$363 = $pnt2$272; + $wk_max$158 = $wk_max$071; + while (1) { + do if ((HEAPU8[$pnt$164 >> 0] | 0 | 0) > ($labelingThresh | 0)) { + $31 = HEAP16[$pnt2$363 + ($19 << 1) >> 1] | 0; + if ($31 << 16 >> 16 > 0) { + HEAP16[$pnt2$363 >> 1] = $31; + $34 = ($31 << 16 >> 16) * 7 | 0; + $36 = $labelInfo + 1310736 + ($34 + -7 << 2) | 0; + HEAP32[$36 >> 2] = (HEAP32[$36 >> 2] | 0) + 1; + $40 = $labelInfo + 1310736 + ($34 + -6 << 2) | 0; + HEAP32[$40 >> 2] = (HEAP32[$40 >> 2] | 0) + $i$256; + $44 = $labelInfo + 1310736 + ($34 + -5 << 2) | 0; + HEAP32[$44 >> 2] = (HEAP32[$44 >> 2] | 0) + $j$069; + HEAP32[$labelInfo + 1310736 + ($34 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $50 = HEAP16[$pnt2$363 + ($$sum1 << 1) >> 1] | 0; + $51 = $50 << 16 >> 16; + $54 = HEAP16[$pnt2$363 + ($$sum2 << 1) >> 1] | 0; + $55 = $54 << 16 >> 16; + $56 = $54 << 16 >> 16 > 0; + if ($50 << 16 >> 16 <= 0) { + if ($56) { + HEAP16[$pnt2$363 >> 1] = $54; + $156 = $55 * 7 | 0; + $158 = $labelInfo + 1310736 + ($156 + -7 << 2) | 0; + HEAP32[$158 >> 2] = (HEAP32[$158 >> 2] | 0) + 1; + $162 = $labelInfo + 1310736 + ($156 + -6 << 2) | 0; + HEAP32[$162 >> 2] = (HEAP32[$162 >> 2] | 0) + $i$256; + $166 = $labelInfo + 1310736 + ($156 + -5 << 2) | 0; + HEAP32[$166 >> 2] = (HEAP32[$166 >> 2] | 0) + $j$069; + $170 = $labelInfo + 1310736 + ($156 + -3 << 2) | 0; + if ((HEAP32[$170 >> 2] | 0) < ($i$256 | 0)) HEAP32[$170 >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($156 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $176 = HEAP16[$pnt2$363 + -2 >> 1] | 0; + if ($176 << 16 >> 16 > 0) { + HEAP16[$pnt2$363 >> 1] = $176; + $179 = ($176 << 16 >> 16) * 7 | 0; + $181 = $labelInfo + 1310736 + ($179 + -7 << 2) | 0; + HEAP32[$181 >> 2] = (HEAP32[$181 >> 2] | 0) + 1; + $185 = $labelInfo + 1310736 + ($179 + -6 << 2) | 0; + HEAP32[$185 >> 2] = (HEAP32[$185 >> 2] | 0) + $i$256; + $189 = $labelInfo + 1310736 + ($179 + -5 << 2) | 0; + HEAP32[$189 >> 2] = (HEAP32[$189 >> 2] | 0) + $j$069; + $193 = $labelInfo + 1310736 + ($179 + -3 << 2) | 0; + if ((HEAP32[$193 >> 2] | 0) >= ($i$256 | 0)) { + $wk_max$2 = $wk_max$158; + break; + } + HEAP32[$193 >> 2] = $i$256; + $wk_max$2 = $wk_max$158; + break; + } else { + $196 = $wk_max$158 + 1 | 0; + if (($wk_max$158 | 0) > 32767) break L13; + HEAP16[$pnt2$363 >> 1] = $196; + HEAP32[$labelInfo + 1179664 + ($wk_max$158 << 2) >> 2] = $196 << 16 >> 16; + $201 = $wk_max$158 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($201 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($201 + 1 << 2) >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($201 + 2 << 2) >> 2] = $j$069; + HEAP32[$labelInfo + 1310736 + ($201 + 3 << 2) >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($201 + 4 << 2) >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($201 + 5 << 2) >> 2] = $j$069; + HEAP32[$labelInfo + 1310736 + ($201 + 6 << 2) >> 2] = $j$069; + $wk_max$2 = $196; + break; + } + } + if ($56) { + $59 = HEAP32[$labelInfo + 1179664 + ($51 + -1 << 2) >> 2] | 0; + $62 = HEAP32[$labelInfo + 1179664 + ($55 + -1 << 2) >> 2] | 0; + if (($59 | 0) > ($62 | 0)) { + HEAP16[$pnt2$363 >> 1] = $62; + if (($wk_max$158 | 0) > 0) { + $k$052 = 0; + $wk$053 = $18; + while (1) { + if ((HEAP32[$wk$053 >> 2] | 0) == ($59 | 0)) HEAP32[$wk$053 >> 2] = $62; + $k$052 = $k$052 + 1 | 0; + if (($k$052 | 0) >= ($wk_max$158 | 0)) { + $79 = $62; + break; + } else $wk$053 = $wk$053 + 4 | 0; + } + } else $79 = $62; + } else { + HEAP16[$pnt2$363 >> 1] = $59; + if (($59 | 0) < ($62 | 0) & ($wk_max$158 | 0) > 0) { + $k$149 = 0; + $wk$150 = $18; + while (1) { + if ((HEAP32[$wk$150 >> 2] | 0) == ($62 | 0)) HEAP32[$wk$150 >> 2] = $59; + $k$149 = $k$149 + 1 | 0; + if (($k$149 | 0) >= ($wk_max$158 | 0)) { + $79 = $59; + break; + } else $wk$150 = $wk$150 + 4 | 0; + } + } else $79 = $59; + } + $81 = ($79 << 16 >> 16) * 7 | 0; + $83 = $labelInfo + 1310736 + ($81 + -7 << 2) | 0; + HEAP32[$83 >> 2] = (HEAP32[$83 >> 2] | 0) + 1; + $87 = $labelInfo + 1310736 + ($81 + -6 << 2) | 0; + HEAP32[$87 >> 2] = (HEAP32[$87 >> 2] | 0) + $i$256; + $91 = $labelInfo + 1310736 + ($81 + -5 << 2) | 0; + HEAP32[$91 >> 2] = (HEAP32[$91 >> 2] | 0) + $j$069; + HEAP32[$labelInfo + 1310736 + ($81 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $97 = HEAP16[$pnt2$363 + -2 >> 1] | 0; + if ($97 << 16 >> 16 <= 0) { + HEAP16[$pnt2$363 >> 1] = $50; + $137 = $51 * 7 | 0; + $139 = $labelInfo + 1310736 + ($137 + -7 << 2) | 0; + HEAP32[$139 >> 2] = (HEAP32[$139 >> 2] | 0) + 1; + $143 = $labelInfo + 1310736 + ($137 + -6 << 2) | 0; + HEAP32[$143 >> 2] = (HEAP32[$143 >> 2] | 0) + $i$256; + $147 = $labelInfo + 1310736 + ($137 + -5 << 2) | 0; + HEAP32[$147 >> 2] = (HEAP32[$147 >> 2] | 0) + $j$069; + $151 = $labelInfo + 1310736 + ($137 + -4 << 2) | 0; + if ((HEAP32[$151 >> 2] | 0) > ($i$256 | 0)) HEAP32[$151 >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($137 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $102 = HEAP32[$labelInfo + 1179664 + ($51 + -1 << 2) >> 2] | 0; + $105 = HEAP32[$labelInfo + 1179664 + (($97 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($102 | 0) > ($105 | 0)) { + HEAP16[$pnt2$363 >> 1] = $105; + if (($wk_max$158 | 0) > 0) { + $k$245 = 0; + $wk$246 = $18; + while (1) { + if ((HEAP32[$wk$246 >> 2] | 0) == ($102 | 0)) HEAP32[$wk$246 >> 2] = $105; + $k$245 = $k$245 + 1 | 0; + if (($k$245 | 0) >= ($wk_max$158 | 0)) { + $122 = $105; + break; + } else $wk$246 = $wk$246 + 4 | 0; + } + } else $122 = $105; + } else { + HEAP16[$pnt2$363 >> 1] = $102; + if (($102 | 0) < ($105 | 0) & ($wk_max$158 | 0) > 0) { + $k$342 = 0; + $wk$343 = $18; + while (1) { + if ((HEAP32[$wk$343 >> 2] | 0) == ($105 | 0)) HEAP32[$wk$343 >> 2] = $102; + $k$342 = $k$342 + 1 | 0; + if (($k$342 | 0) >= ($wk_max$158 | 0)) { + $122 = $102; + break; + } else $wk$343 = $wk$343 + 4 | 0; + } + } else $122 = $102; + } + $124 = ($122 << 16 >> 16) * 7 | 0; + $126 = $labelInfo + 1310736 + ($124 + -7 << 2) | 0; + HEAP32[$126 >> 2] = (HEAP32[$126 >> 2] | 0) + 1; + $130 = $labelInfo + 1310736 + ($124 + -6 << 2) | 0; + HEAP32[$130 >> 2] = (HEAP32[$130 >> 2] | 0) + $i$256; + $134 = $labelInfo + 1310736 + ($124 + -5 << 2) | 0; + HEAP32[$134 >> 2] = (HEAP32[$134 >> 2] | 0) + $j$069; + $wk_max$2 = $wk_max$158; + } else { + HEAP16[$pnt2$363 >> 1] = 0; + $wk_max$2 = $wk_max$158; + } while (0); + $i$256 = $i$256 + 1 | 0; + $216 = $pnt$164 + 2 | 0; + $217 = $pnt2$363 + 2 | 0; + if (($i$256 | 0) >= ($11 | 0)) { + $pnt$1$lcssa = $216; + $pnt2$3$lcssa = $217; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $pnt$164 = $216; + $pnt2$363 = $217; + $wk_max$158 = $wk_max$2; + } + } + } else { + $pnt$1$lcssa = $pnt$073; + $pnt2$3$lcssa = $pnt2$272; + $wk_max$1$lcssa = $wk_max$071; + } + $j$069 = $j$069 + 1 | 0; + if (($j$069 | 0) >= ($3 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $pnt$073 = $pnt$1$lcssa + $$sum | 0; + $pnt2$272 = $pnt2$3$lcssa + 4 | 0; + $wk_max$071 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $223 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$338 = 1; + $j$139 = 1; + $wk$440 = $18; + while (1) { + $225 = HEAP32[$wk$440 >> 2] | 0; + if (($225 | 0) == ($i$338 | 0)) { + $231 = $j$139; + $j$2 = $j$139 + 1 | 0; + } else { + $231 = HEAP32[$labelInfo + 1179664 + ($225 + -1 << 2) >> 2] | 0; + $j$2 = $j$139; + } + HEAP32[$wk$440 >> 2] = $231; + if (($i$338 | 0) < ($wk_max$0$lcssa | 0)) { + $i$338 = $i$338 + 1 | 0; + $j$139 = $j$2; + $wk$440 = $wk$440 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $235 = $labelInfo + 8 | 0; + $236 = $j$1$lcssa + -1 | 0; + HEAP32[$235 >> 2] = $236; + if (!$236) $$0 = 0; else { + _memset($223 | 0, 0, $236 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $236 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$436 = 0; + do { + $243 = $i$436 << 2; + HEAP32[$labelInfo + 131084 + ($243 << 2) >> 2] = $0; + HEAP32[$labelInfo + 131084 + (($243 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($243 | 2) << 2) >> 2] = $1; + HEAP32[$labelInfo + 131084 + (($243 | 3) << 2) >> 2] = 0; + $i$436 = $i$436 + 1 | 0; + } while (($i$436 | 0) < (HEAP32[$235 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$534 = 0; + do { + $257 = (HEAP32[$labelInfo + 1179664 + ($i$534 << 2) >> 2] | 0) + -1 | 0; + $258 = $i$534 * 7 | 0; + $261 = $labelInfo + 12 + ($257 << 2) | 0; + HEAP32[$261 >> 2] = (HEAP32[$261 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($258 << 2) >> 2] | 0); + $268 = $257 << 1; + $269 = $labelInfo + 655376 + ($268 << 3) | 0; + HEAPF64[$269 >> 3] = +HEAPF64[$269 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($258 + 1 << 2) >> 2] | 0); + $277 = $labelInfo + 655376 + (($268 | 1) << 3) | 0; + HEAPF64[$277 >> 3] = +HEAPF64[$277 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($258 + 2 << 2) >> 2] | 0); + $280 = $257 << 2; + $281 = $labelInfo + 131084 + ($280 << 2) | 0; + $285 = HEAP32[$labelInfo + 1310736 + ($258 + 3 << 2) >> 2] | 0; + if ((HEAP32[$281 >> 2] | 0) > ($285 | 0)) HEAP32[$281 >> 2] = $285; + $288 = $labelInfo + 131084 + (($280 | 1) << 2) | 0; + $292 = HEAP32[$labelInfo + 1310736 + ($258 + 4 << 2) >> 2] | 0; + if ((HEAP32[$288 >> 2] | 0) < ($292 | 0)) HEAP32[$288 >> 2] = $292; + $295 = $labelInfo + 131084 + (($280 | 2) << 2) | 0; + $299 = HEAP32[$labelInfo + 1310736 + ($258 + 5 << 2) >> 2] | 0; + if ((HEAP32[$295 >> 2] | 0) > ($299 | 0)) HEAP32[$295 >> 2] = $299; + $302 = $labelInfo + 131084 + (($280 | 3) << 2) | 0; + $306 = HEAP32[$labelInfo + 1310736 + ($258 + 6 << 2) >> 2] | 0; + if ((HEAP32[$302 >> 2] | 0) < ($306 | 0)) HEAP32[$302 >> 2] = $306; + $i$534 = $i$534 + 1 | 0; + } while (($i$534 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$235 >> 2] | 0) > 0) { + $i$633 = 0; + do { + $310 = $labelInfo + 12 + ($i$633 << 2) | 0; + $313 = $i$633 << 1; + $314 = $labelInfo + 655376 + ($313 << 3) | 0; + HEAPF64[$314 >> 3] = +HEAPF64[$314 >> 3] / +(HEAP32[$310 >> 2] | 0); + $320 = $labelInfo + 655376 + (($313 | 1) << 3) | 0; + HEAPF64[$320 >> 3] = +HEAPF64[$320 >> 3] / +(HEAP32[$310 >> 2] | 0); + $i$633 = $i$633 + 1 | 0; + } while (($i$633 | 0) < (HEAP32[$235 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubDBIC($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $$sum2 = 0, $0 = 0, $1 = 0, $102 = 0, $105 = 0, $11 = 0, $122 = 0, $124 = 0, $126 = 0, $130 = 0, $134 = 0, $137 = 0, $139 = 0, $143 = 0, $147 = 0, $151 = 0, $156 = 0, $158 = 0, $162 = 0, $166 = 0, $170 = 0, $176 = 0, $179 = 0, $18 = 0, $181 = 0, $185 = 0, $189 = 0, $19 = 0, $193 = 0, $196 = 0, $2 = 0, $201 = 0, $216 = 0, $217 = 0, $223 = 0, $225 = 0, $231 = 0, $235 = 0, $236 = 0, $243 = 0, $257 = 0, $258 = 0, $26 = 0, $261 = 0, $268 = 0, $269 = 0, $277 = 0, $280 = 0, $281 = 0, $285 = 0, $288 = 0, $292 = 0, $295 = 0, $299 = 0, $3 = 0, $302 = 0, $306 = 0, $31 = 0, $310 = 0, $313 = 0, $314 = 0, $320 = 0, $34 = 0, $36 = 0, $40 = 0, $44 = 0, $50 = 0, $51 = 0, $54 = 0, $55 = 0, $56 = 0, $59 = 0, $62 = 0, $79 = 0, $81 = 0, $83 = 0, $87 = 0, $91 = 0, $97 = 0, $i$082 = 0, $i$176 = 0, $i$256 = 0, $i$338 = 0, $i$436 = 0, $i$534 = 0, $i$633 = 0, $j$069 = 0, $j$1$lcssa = 0, $j$139 = 0, $j$2 = 0, $k$052 = 0, $k$149 = 0, $k$245 = 0, $k$342 = 0, $pnt$073 = 0, $pnt$1$lcssa = 0, $pnt$164 = 0, $pnt1$084 = 0, $pnt1$178 = 0, $pnt2$083 = 0, $pnt2$177 = 0, $pnt2$272 = 0, $pnt2$3$lcssa = 0, $pnt2$363 = 0, $vararg_buffer = 0, $wk$053 = 0, $wk$150 = 0, $wk$246 = 0, $wk$343 = 0, $wk$440 = 0, $wk_max$0$lcssa = 0, $wk_max$071 = 0, $wk_max$1$lcssa = 0, $wk_max$158 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = ($xsize | 0) / 2 | 0; + $1 = ($ysize | 0) / 2 | 0; + $2 = HEAP32[$labelInfo >> 2] | 0; + $3 = $1 + -1 | 0; + if (($xsize | 0) > 1) { + $i$082 = 0; + $pnt1$084 = $2; + $pnt2$083 = $2 + ((Math_imul($3, $0) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$083 >> 1] = 0; + HEAP16[$pnt1$084 >> 1] = 0; + $i$082 = $i$082 + 1 | 0; + if (($i$082 | 0) >= ($0 | 0)) break; else { + $pnt1$084 = $pnt1$084 + 2 | 0; + $pnt2$083 = $pnt2$083 + 2 | 0; + } + } + } + $11 = $0 + -1 | 0; + if (($ysize | 0) > 1) { + $i$176 = 0; + $pnt1$178 = $2; + $pnt2$177 = $2 + ($11 << 1) | 0; + while (1) { + HEAP16[$pnt2$177 >> 1] = 0; + HEAP16[$pnt1$178 >> 1] = 0; + $i$176 = $i$176 + 1 | 0; + if (($i$176 | 0) >= ($1 | 0)) break; else { + $pnt1$178 = $pnt1$178 + ($0 << 1) | 0; + $pnt2$177 = $pnt2$177 + ($0 << 1) | 0; + } + } + } + $18 = $labelInfo + 1179664 | 0; + $19 = 0 - $0 | 0; + $$sum1 = 1 - $0 | 0; + $$sum2 = ~$0; + $$sum = $xsize + 4 | 0; + L11 : do if (($3 | 0) > 1) { + $26 = ($11 | 0) > 1; + $j$069 = 1; + $pnt$073 = $image + (($xsize << 1) + 2) | 0; + $pnt2$272 = $2 + ($0 + 1 << 1) | 0; + $wk_max$071 = 0; + L13 : while (1) { + if ($26) { + $i$256 = 1; + $pnt$164 = $pnt$073; + $pnt2$363 = $pnt2$272; + $wk_max$158 = $wk_max$071; + while (1) { + do if ((HEAPU8[$pnt$164 >> 0] | 0 | 0) > ($labelingThresh | 0)) { + HEAP16[$pnt2$363 >> 1] = 0; + $wk_max$2 = $wk_max$158; + } else { + $31 = HEAP16[$pnt2$363 + ($19 << 1) >> 1] | 0; + if ($31 << 16 >> 16 > 0) { + HEAP16[$pnt2$363 >> 1] = $31; + $34 = ($31 << 16 >> 16) * 7 | 0; + $36 = $labelInfo + 1310736 + ($34 + -7 << 2) | 0; + HEAP32[$36 >> 2] = (HEAP32[$36 >> 2] | 0) + 1; + $40 = $labelInfo + 1310736 + ($34 + -6 << 2) | 0; + HEAP32[$40 >> 2] = (HEAP32[$40 >> 2] | 0) + $i$256; + $44 = $labelInfo + 1310736 + ($34 + -5 << 2) | 0; + HEAP32[$44 >> 2] = (HEAP32[$44 >> 2] | 0) + $j$069; + HEAP32[$labelInfo + 1310736 + ($34 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $50 = HEAP16[$pnt2$363 + ($$sum1 << 1) >> 1] | 0; + $51 = $50 << 16 >> 16; + $54 = HEAP16[$pnt2$363 + ($$sum2 << 1) >> 1] | 0; + $55 = $54 << 16 >> 16; + $56 = $54 << 16 >> 16 > 0; + if ($50 << 16 >> 16 <= 0) { + if ($56) { + HEAP16[$pnt2$363 >> 1] = $54; + $156 = $55 * 7 | 0; + $158 = $labelInfo + 1310736 + ($156 + -7 << 2) | 0; + HEAP32[$158 >> 2] = (HEAP32[$158 >> 2] | 0) + 1; + $162 = $labelInfo + 1310736 + ($156 + -6 << 2) | 0; + HEAP32[$162 >> 2] = (HEAP32[$162 >> 2] | 0) + $i$256; + $166 = $labelInfo + 1310736 + ($156 + -5 << 2) | 0; + HEAP32[$166 >> 2] = (HEAP32[$166 >> 2] | 0) + $j$069; + $170 = $labelInfo + 1310736 + ($156 + -3 << 2) | 0; + if ((HEAP32[$170 >> 2] | 0) < ($i$256 | 0)) HEAP32[$170 >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($156 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $176 = HEAP16[$pnt2$363 + -2 >> 1] | 0; + if ($176 << 16 >> 16 > 0) { + HEAP16[$pnt2$363 >> 1] = $176; + $179 = ($176 << 16 >> 16) * 7 | 0; + $181 = $labelInfo + 1310736 + ($179 + -7 << 2) | 0; + HEAP32[$181 >> 2] = (HEAP32[$181 >> 2] | 0) + 1; + $185 = $labelInfo + 1310736 + ($179 + -6 << 2) | 0; + HEAP32[$185 >> 2] = (HEAP32[$185 >> 2] | 0) + $i$256; + $189 = $labelInfo + 1310736 + ($179 + -5 << 2) | 0; + HEAP32[$189 >> 2] = (HEAP32[$189 >> 2] | 0) + $j$069; + $193 = $labelInfo + 1310736 + ($179 + -3 << 2) | 0; + if ((HEAP32[$193 >> 2] | 0) >= ($i$256 | 0)) { + $wk_max$2 = $wk_max$158; + break; + } + HEAP32[$193 >> 2] = $i$256; + $wk_max$2 = $wk_max$158; + break; + } else { + $196 = $wk_max$158 + 1 | 0; + if (($wk_max$158 | 0) > 32767) break L13; + HEAP16[$pnt2$363 >> 1] = $196; + HEAP32[$labelInfo + 1179664 + ($wk_max$158 << 2) >> 2] = $196 << 16 >> 16; + $201 = $wk_max$158 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($201 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($201 + 1 << 2) >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($201 + 2 << 2) >> 2] = $j$069; + HEAP32[$labelInfo + 1310736 + ($201 + 3 << 2) >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($201 + 4 << 2) >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($201 + 5 << 2) >> 2] = $j$069; + HEAP32[$labelInfo + 1310736 + ($201 + 6 << 2) >> 2] = $j$069; + $wk_max$2 = $196; + break; + } + } + if ($56) { + $59 = HEAP32[$labelInfo + 1179664 + ($51 + -1 << 2) >> 2] | 0; + $62 = HEAP32[$labelInfo + 1179664 + ($55 + -1 << 2) >> 2] | 0; + if (($59 | 0) > ($62 | 0)) { + HEAP16[$pnt2$363 >> 1] = $62; + if (($wk_max$158 | 0) > 0) { + $k$052 = 0; + $wk$053 = $18; + while (1) { + if ((HEAP32[$wk$053 >> 2] | 0) == ($59 | 0)) HEAP32[$wk$053 >> 2] = $62; + $k$052 = $k$052 + 1 | 0; + if (($k$052 | 0) >= ($wk_max$158 | 0)) { + $79 = $62; + break; + } else $wk$053 = $wk$053 + 4 | 0; + } + } else $79 = $62; + } else { + HEAP16[$pnt2$363 >> 1] = $59; + if (($59 | 0) < ($62 | 0) & ($wk_max$158 | 0) > 0) { + $k$149 = 0; + $wk$150 = $18; + while (1) { + if ((HEAP32[$wk$150 >> 2] | 0) == ($62 | 0)) HEAP32[$wk$150 >> 2] = $59; + $k$149 = $k$149 + 1 | 0; + if (($k$149 | 0) >= ($wk_max$158 | 0)) { + $79 = $59; + break; + } else $wk$150 = $wk$150 + 4 | 0; + } + } else $79 = $59; + } + $81 = ($79 << 16 >> 16) * 7 | 0; + $83 = $labelInfo + 1310736 + ($81 + -7 << 2) | 0; + HEAP32[$83 >> 2] = (HEAP32[$83 >> 2] | 0) + 1; + $87 = $labelInfo + 1310736 + ($81 + -6 << 2) | 0; + HEAP32[$87 >> 2] = (HEAP32[$87 >> 2] | 0) + $i$256; + $91 = $labelInfo + 1310736 + ($81 + -5 << 2) | 0; + HEAP32[$91 >> 2] = (HEAP32[$91 >> 2] | 0) + $j$069; + HEAP32[$labelInfo + 1310736 + ($81 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $97 = HEAP16[$pnt2$363 + -2 >> 1] | 0; + if ($97 << 16 >> 16 <= 0) { + HEAP16[$pnt2$363 >> 1] = $50; + $137 = $51 * 7 | 0; + $139 = $labelInfo + 1310736 + ($137 + -7 << 2) | 0; + HEAP32[$139 >> 2] = (HEAP32[$139 >> 2] | 0) + 1; + $143 = $labelInfo + 1310736 + ($137 + -6 << 2) | 0; + HEAP32[$143 >> 2] = (HEAP32[$143 >> 2] | 0) + $i$256; + $147 = $labelInfo + 1310736 + ($137 + -5 << 2) | 0; + HEAP32[$147 >> 2] = (HEAP32[$147 >> 2] | 0) + $j$069; + $151 = $labelInfo + 1310736 + ($137 + -4 << 2) | 0; + if ((HEAP32[$151 >> 2] | 0) > ($i$256 | 0)) HEAP32[$151 >> 2] = $i$256; + HEAP32[$labelInfo + 1310736 + ($137 + -1 << 2) >> 2] = $j$069; + $wk_max$2 = $wk_max$158; + break; + } + $102 = HEAP32[$labelInfo + 1179664 + ($51 + -1 << 2) >> 2] | 0; + $105 = HEAP32[$labelInfo + 1179664 + (($97 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($102 | 0) > ($105 | 0)) { + HEAP16[$pnt2$363 >> 1] = $105; + if (($wk_max$158 | 0) > 0) { + $k$245 = 0; + $wk$246 = $18; + while (1) { + if ((HEAP32[$wk$246 >> 2] | 0) == ($102 | 0)) HEAP32[$wk$246 >> 2] = $105; + $k$245 = $k$245 + 1 | 0; + if (($k$245 | 0) >= ($wk_max$158 | 0)) { + $122 = $105; + break; + } else $wk$246 = $wk$246 + 4 | 0; + } + } else $122 = $105; + } else { + HEAP16[$pnt2$363 >> 1] = $102; + if (($102 | 0) < ($105 | 0) & ($wk_max$158 | 0) > 0) { + $k$342 = 0; + $wk$343 = $18; + while (1) { + if ((HEAP32[$wk$343 >> 2] | 0) == ($105 | 0)) HEAP32[$wk$343 >> 2] = $102; + $k$342 = $k$342 + 1 | 0; + if (($k$342 | 0) >= ($wk_max$158 | 0)) { + $122 = $102; + break; + } else $wk$343 = $wk$343 + 4 | 0; + } + } else $122 = $102; + } + $124 = ($122 << 16 >> 16) * 7 | 0; + $126 = $labelInfo + 1310736 + ($124 + -7 << 2) | 0; + HEAP32[$126 >> 2] = (HEAP32[$126 >> 2] | 0) + 1; + $130 = $labelInfo + 1310736 + ($124 + -6 << 2) | 0; + HEAP32[$130 >> 2] = (HEAP32[$130 >> 2] | 0) + $i$256; + $134 = $labelInfo + 1310736 + ($124 + -5 << 2) | 0; + HEAP32[$134 >> 2] = (HEAP32[$134 >> 2] | 0) + $j$069; + $wk_max$2 = $wk_max$158; + } while (0); + $i$256 = $i$256 + 1 | 0; + $216 = $pnt$164 + 2 | 0; + $217 = $pnt2$363 + 2 | 0; + if (($i$256 | 0) >= ($11 | 0)) { + $pnt$1$lcssa = $216; + $pnt2$3$lcssa = $217; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $pnt$164 = $216; + $pnt2$363 = $217; + $wk_max$158 = $wk_max$2; + } + } + } else { + $pnt$1$lcssa = $pnt$073; + $pnt2$3$lcssa = $pnt2$272; + $wk_max$1$lcssa = $wk_max$071; + } + $j$069 = $j$069 + 1 | 0; + if (($j$069 | 0) >= ($3 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $pnt$073 = $pnt$1$lcssa + $$sum | 0; + $pnt2$272 = $pnt2$3$lcssa + 4 | 0; + $wk_max$071 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $223 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$338 = 1; + $j$139 = 1; + $wk$440 = $18; + while (1) { + $225 = HEAP32[$wk$440 >> 2] | 0; + if (($225 | 0) == ($i$338 | 0)) { + $231 = $j$139; + $j$2 = $j$139 + 1 | 0; + } else { + $231 = HEAP32[$labelInfo + 1179664 + ($225 + -1 << 2) >> 2] | 0; + $j$2 = $j$139; + } + HEAP32[$wk$440 >> 2] = $231; + if (($i$338 | 0) < ($wk_max$0$lcssa | 0)) { + $i$338 = $i$338 + 1 | 0; + $j$139 = $j$2; + $wk$440 = $wk$440 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $235 = $labelInfo + 8 | 0; + $236 = $j$1$lcssa + -1 | 0; + HEAP32[$235 >> 2] = $236; + if (!$236) $$0 = 0; else { + _memset($223 | 0, 0, $236 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $236 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$436 = 0; + do { + $243 = $i$436 << 2; + HEAP32[$labelInfo + 131084 + ($243 << 2) >> 2] = $0; + HEAP32[$labelInfo + 131084 + (($243 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($243 | 2) << 2) >> 2] = $1; + HEAP32[$labelInfo + 131084 + (($243 | 3) << 2) >> 2] = 0; + $i$436 = $i$436 + 1 | 0; + } while (($i$436 | 0) < (HEAP32[$235 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$534 = 0; + do { + $257 = (HEAP32[$labelInfo + 1179664 + ($i$534 << 2) >> 2] | 0) + -1 | 0; + $258 = $i$534 * 7 | 0; + $261 = $labelInfo + 12 + ($257 << 2) | 0; + HEAP32[$261 >> 2] = (HEAP32[$261 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($258 << 2) >> 2] | 0); + $268 = $257 << 1; + $269 = $labelInfo + 655376 + ($268 << 3) | 0; + HEAPF64[$269 >> 3] = +HEAPF64[$269 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($258 + 1 << 2) >> 2] | 0); + $277 = $labelInfo + 655376 + (($268 | 1) << 3) | 0; + HEAPF64[$277 >> 3] = +HEAPF64[$277 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($258 + 2 << 2) >> 2] | 0); + $280 = $257 << 2; + $281 = $labelInfo + 131084 + ($280 << 2) | 0; + $285 = HEAP32[$labelInfo + 1310736 + ($258 + 3 << 2) >> 2] | 0; + if ((HEAP32[$281 >> 2] | 0) > ($285 | 0)) HEAP32[$281 >> 2] = $285; + $288 = $labelInfo + 131084 + (($280 | 1) << 2) | 0; + $292 = HEAP32[$labelInfo + 1310736 + ($258 + 4 << 2) >> 2] | 0; + if ((HEAP32[$288 >> 2] | 0) < ($292 | 0)) HEAP32[$288 >> 2] = $292; + $295 = $labelInfo + 131084 + (($280 | 2) << 2) | 0; + $299 = HEAP32[$labelInfo + 1310736 + ($258 + 5 << 2) >> 2] | 0; + if ((HEAP32[$295 >> 2] | 0) > ($299 | 0)) HEAP32[$295 >> 2] = $299; + $302 = $labelInfo + 131084 + (($280 | 3) << 2) | 0; + $306 = HEAP32[$labelInfo + 1310736 + ($258 + 6 << 2) >> 2] | 0; + if ((HEAP32[$302 >> 2] | 0) < ($306 | 0)) HEAP32[$302 >> 2] = $306; + $i$534 = $i$534 + 1 | 0; + } while (($i$534 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$235 >> 2] | 0) > 0) { + $i$633 = 0; + do { + $310 = $labelInfo + 12 + ($i$633 << 2) | 0; + $313 = $i$633 << 1; + $314 = $labelInfo + 655376 + ($313 << 3) | 0; + HEAPF64[$314 >> 3] = +HEAPF64[$314 >> 3] / +(HEAP32[$310 >> 2] | 0); + $320 = $labelInfo + 655376 + (($313 | 1) << 3) | 0; + HEAPF64[$320 >> 3] = +HEAPF64[$320 >> 3] / +(HEAP32[$310 >> 2] | 0); + $i$633 = $i$633 + 1 | 0; + } while (($i$633 | 0) < (HEAP32[$235 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubDWRCY($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $0 = 0, $1 = 0, $100 = 0, $103 = 0, $120 = 0, $122 = 0, $124 = 0, $128 = 0, $132 = 0, $135 = 0, $137 = 0, $141 = 0, $145 = 0, $149 = 0, $154 = 0, $156 = 0, $16 = 0, $160 = 0, $164 = 0, $168 = 0, $17 = 0, $174 = 0, $177 = 0, $179 = 0, $18 = 0, $183 = 0, $187 = 0, $191 = 0, $194 = 0, $199 = 0, $214 = 0, $215 = 0, $221 = 0, $223 = 0, $229 = 0, $23 = 0, $233 = 0, $234 = 0, $241 = 0, $255 = 0, $256 = 0, $259 = 0, $266 = 0, $267 = 0, $275 = 0, $278 = 0, $279 = 0, $283 = 0, $286 = 0, $29 = 0, $290 = 0, $293 = 0, $297 = 0, $300 = 0, $304 = 0, $308 = 0, $311 = 0, $312 = 0, $318 = 0, $32 = 0, $34 = 0, $38 = 0, $42 = 0, $48 = 0, $49 = 0, $52 = 0, $53 = 0, $54 = 0, $57 = 0, $60 = 0, $77 = 0, $79 = 0, $81 = 0, $85 = 0, $89 = 0, $9 = 0, $95 = 0, $i$081 = 0, $i$175 = 0, $i$255 = 0, $i$337 = 0, $i$435 = 0, $i$533 = 0, $i$632 = 0, $j$068 = 0, $j$1$lcssa = 0, $j$138 = 0, $j$2 = 0, $k$051 = 0, $k$148 = 0, $k$244 = 0, $k$341 = 0, $pnt$072 = 0, $pnt$1$lcssa = 0, $pnt$163 = 0, $pnt1$083 = 0, $pnt1$177 = 0, $pnt2$082 = 0, $pnt2$176 = 0, $pnt2$271 = 0, $pnt2$3$lcssa = 0, $pnt2$362 = 0, $vararg_buffer = 0, $wk$052 = 0, $wk$149 = 0, $wk$245 = 0, $wk$342 = 0, $wk$439 = 0, $wk_max$0$lcssa = 0, $wk_max$070 = 0, $wk_max$1$lcssa = 0, $wk_max$157 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = HEAP32[$labelInfo >> 2] | 0; + $1 = $ysize + -1 | 0; + if (($xsize | 0) > 0) { + $i$081 = 0; + $pnt1$083 = $0; + $pnt2$082 = $0 + ((Math_imul($1, $xsize) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$082 >> 1] = 0; + HEAP16[$pnt1$083 >> 1] = 0; + $i$081 = $i$081 + 1 | 0; + if (($i$081 | 0) >= ($xsize | 0)) break; else { + $pnt1$083 = $pnt1$083 + 2 | 0; + $pnt2$082 = $pnt2$082 + 2 | 0; + } + } + } + $9 = $xsize + -1 | 0; + if (($ysize | 0) > 0) { + $i$175 = 0; + $pnt1$177 = $0; + $pnt2$176 = $0 + ($9 << 1) | 0; + while (1) { + HEAP16[$pnt2$176 >> 1] = 0; + HEAP16[$pnt1$177 >> 1] = 0; + $i$175 = $i$175 + 1 | 0; + if (($i$175 | 0) >= ($ysize | 0)) break; else { + $pnt1$177 = $pnt1$177 + ($xsize << 1) | 0; + $pnt2$176 = $pnt2$176 + ($xsize << 1) | 0; + } + } + } + $16 = $labelInfo + 1179664 | 0; + $17 = $xsize + 1 | 0; + $18 = 0 - $xsize | 0; + $$sum = 1 - $xsize | 0; + $$sum1 = ~$xsize; + L11 : do if (($1 | 0) > 1) { + $23 = ($9 | 0) > 1; + $j$068 = 1; + $pnt$072 = $image + ($17 << 1) | 0; + $pnt2$271 = $0 + ($17 << 1) | 0; + $wk_max$070 = 0; + L13 : while (1) { + if ($23) { + $i$255 = 1; + $pnt$163 = $pnt$072; + $pnt2$362 = $pnt2$271; + $wk_max$157 = $wk_max$070; + while (1) { + do if ((HEAPU8[$pnt$163 + 1 >> 0] | 0 | 0) > ($labelingThresh | 0)) { + $29 = HEAP16[$pnt2$362 + ($18 << 1) >> 1] | 0; + if ($29 << 16 >> 16 > 0) { + HEAP16[$pnt2$362 >> 1] = $29; + $32 = ($29 << 16 >> 16) * 7 | 0; + $34 = $labelInfo + 1310736 + ($32 + -7 << 2) | 0; + HEAP32[$34 >> 2] = (HEAP32[$34 >> 2] | 0) + 1; + $38 = $labelInfo + 1310736 + ($32 + -6 << 2) | 0; + HEAP32[$38 >> 2] = (HEAP32[$38 >> 2] | 0) + $i$255; + $42 = $labelInfo + 1310736 + ($32 + -5 << 2) | 0; + HEAP32[$42 >> 2] = (HEAP32[$42 >> 2] | 0) + $j$068; + HEAP32[$labelInfo + 1310736 + ($32 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $48 = HEAP16[$pnt2$362 + ($$sum << 1) >> 1] | 0; + $49 = $48 << 16 >> 16; + $52 = HEAP16[$pnt2$362 + ($$sum1 << 1) >> 1] | 0; + $53 = $52 << 16 >> 16; + $54 = $52 << 16 >> 16 > 0; + if ($48 << 16 >> 16 <= 0) { + if ($54) { + HEAP16[$pnt2$362 >> 1] = $52; + $154 = $53 * 7 | 0; + $156 = $labelInfo + 1310736 + ($154 + -7 << 2) | 0; + HEAP32[$156 >> 2] = (HEAP32[$156 >> 2] | 0) + 1; + $160 = $labelInfo + 1310736 + ($154 + -6 << 2) | 0; + HEAP32[$160 >> 2] = (HEAP32[$160 >> 2] | 0) + $i$255; + $164 = $labelInfo + 1310736 + ($154 + -5 << 2) | 0; + HEAP32[$164 >> 2] = (HEAP32[$164 >> 2] | 0) + $j$068; + $168 = $labelInfo + 1310736 + ($154 + -3 << 2) | 0; + if ((HEAP32[$168 >> 2] | 0) < ($i$255 | 0)) HEAP32[$168 >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($154 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $174 = HEAP16[$pnt2$362 + -2 >> 1] | 0; + if ($174 << 16 >> 16 > 0) { + HEAP16[$pnt2$362 >> 1] = $174; + $177 = ($174 << 16 >> 16) * 7 | 0; + $179 = $labelInfo + 1310736 + ($177 + -7 << 2) | 0; + HEAP32[$179 >> 2] = (HEAP32[$179 >> 2] | 0) + 1; + $183 = $labelInfo + 1310736 + ($177 + -6 << 2) | 0; + HEAP32[$183 >> 2] = (HEAP32[$183 >> 2] | 0) + $i$255; + $187 = $labelInfo + 1310736 + ($177 + -5 << 2) | 0; + HEAP32[$187 >> 2] = (HEAP32[$187 >> 2] | 0) + $j$068; + $191 = $labelInfo + 1310736 + ($177 + -3 << 2) | 0; + if ((HEAP32[$191 >> 2] | 0) >= ($i$255 | 0)) { + $wk_max$2 = $wk_max$157; + break; + } + HEAP32[$191 >> 2] = $i$255; + $wk_max$2 = $wk_max$157; + break; + } else { + $194 = $wk_max$157 + 1 | 0; + if (($wk_max$157 | 0) > 32767) break L13; + HEAP16[$pnt2$362 >> 1] = $194; + HEAP32[$labelInfo + 1179664 + ($wk_max$157 << 2) >> 2] = $194 << 16 >> 16; + $199 = $wk_max$157 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($199 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($199 + 1 << 2) >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($199 + 2 << 2) >> 2] = $j$068; + HEAP32[$labelInfo + 1310736 + ($199 + 3 << 2) >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($199 + 4 << 2) >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($199 + 5 << 2) >> 2] = $j$068; + HEAP32[$labelInfo + 1310736 + ($199 + 6 << 2) >> 2] = $j$068; + $wk_max$2 = $194; + break; + } + } + if ($54) { + $57 = HEAP32[$labelInfo + 1179664 + ($49 + -1 << 2) >> 2] | 0; + $60 = HEAP32[$labelInfo + 1179664 + ($53 + -1 << 2) >> 2] | 0; + if (($57 | 0) > ($60 | 0)) { + HEAP16[$pnt2$362 >> 1] = $60; + if (($wk_max$157 | 0) > 0) { + $k$051 = 0; + $wk$052 = $16; + while (1) { + if ((HEAP32[$wk$052 >> 2] | 0) == ($57 | 0)) HEAP32[$wk$052 >> 2] = $60; + $k$051 = $k$051 + 1 | 0; + if (($k$051 | 0) >= ($wk_max$157 | 0)) { + $77 = $60; + break; + } else $wk$052 = $wk$052 + 4 | 0; + } + } else $77 = $60; + } else { + HEAP16[$pnt2$362 >> 1] = $57; + if (($57 | 0) < ($60 | 0) & ($wk_max$157 | 0) > 0) { + $k$148 = 0; + $wk$149 = $16; + while (1) { + if ((HEAP32[$wk$149 >> 2] | 0) == ($60 | 0)) HEAP32[$wk$149 >> 2] = $57; + $k$148 = $k$148 + 1 | 0; + if (($k$148 | 0) >= ($wk_max$157 | 0)) { + $77 = $57; + break; + } else $wk$149 = $wk$149 + 4 | 0; + } + } else $77 = $57; + } + $79 = ($77 << 16 >> 16) * 7 | 0; + $81 = $labelInfo + 1310736 + ($79 + -7 << 2) | 0; + HEAP32[$81 >> 2] = (HEAP32[$81 >> 2] | 0) + 1; + $85 = $labelInfo + 1310736 + ($79 + -6 << 2) | 0; + HEAP32[$85 >> 2] = (HEAP32[$85 >> 2] | 0) + $i$255; + $89 = $labelInfo + 1310736 + ($79 + -5 << 2) | 0; + HEAP32[$89 >> 2] = (HEAP32[$89 >> 2] | 0) + $j$068; + HEAP32[$labelInfo + 1310736 + ($79 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $95 = HEAP16[$pnt2$362 + -2 >> 1] | 0; + if ($95 << 16 >> 16 <= 0) { + HEAP16[$pnt2$362 >> 1] = $48; + $135 = $49 * 7 | 0; + $137 = $labelInfo + 1310736 + ($135 + -7 << 2) | 0; + HEAP32[$137 >> 2] = (HEAP32[$137 >> 2] | 0) + 1; + $141 = $labelInfo + 1310736 + ($135 + -6 << 2) | 0; + HEAP32[$141 >> 2] = (HEAP32[$141 >> 2] | 0) + $i$255; + $145 = $labelInfo + 1310736 + ($135 + -5 << 2) | 0; + HEAP32[$145 >> 2] = (HEAP32[$145 >> 2] | 0) + $j$068; + $149 = $labelInfo + 1310736 + ($135 + -4 << 2) | 0; + if ((HEAP32[$149 >> 2] | 0) > ($i$255 | 0)) HEAP32[$149 >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($135 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $100 = HEAP32[$labelInfo + 1179664 + ($49 + -1 << 2) >> 2] | 0; + $103 = HEAP32[$labelInfo + 1179664 + (($95 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($100 | 0) > ($103 | 0)) { + HEAP16[$pnt2$362 >> 1] = $103; + if (($wk_max$157 | 0) > 0) { + $k$244 = 0; + $wk$245 = $16; + while (1) { + if ((HEAP32[$wk$245 >> 2] | 0) == ($100 | 0)) HEAP32[$wk$245 >> 2] = $103; + $k$244 = $k$244 + 1 | 0; + if (($k$244 | 0) >= ($wk_max$157 | 0)) { + $120 = $103; + break; + } else $wk$245 = $wk$245 + 4 | 0; + } + } else $120 = $103; + } else { + HEAP16[$pnt2$362 >> 1] = $100; + if (($100 | 0) < ($103 | 0) & ($wk_max$157 | 0) > 0) { + $k$341 = 0; + $wk$342 = $16; + while (1) { + if ((HEAP32[$wk$342 >> 2] | 0) == ($103 | 0)) HEAP32[$wk$342 >> 2] = $100; + $k$341 = $k$341 + 1 | 0; + if (($k$341 | 0) >= ($wk_max$157 | 0)) { + $120 = $100; + break; + } else $wk$342 = $wk$342 + 4 | 0; + } + } else $120 = $100; + } + $122 = ($120 << 16 >> 16) * 7 | 0; + $124 = $labelInfo + 1310736 + ($122 + -7 << 2) | 0; + HEAP32[$124 >> 2] = (HEAP32[$124 >> 2] | 0) + 1; + $128 = $labelInfo + 1310736 + ($122 + -6 << 2) | 0; + HEAP32[$128 >> 2] = (HEAP32[$128 >> 2] | 0) + $i$255; + $132 = $labelInfo + 1310736 + ($122 + -5 << 2) | 0; + HEAP32[$132 >> 2] = (HEAP32[$132 >> 2] | 0) + $j$068; + $wk_max$2 = $wk_max$157; + } else { + HEAP16[$pnt2$362 >> 1] = 0; + $wk_max$2 = $wk_max$157; + } while (0); + $i$255 = $i$255 + 1 | 0; + $214 = $pnt$163 + 2 | 0; + $215 = $pnt2$362 + 2 | 0; + if (($i$255 | 0) >= ($9 | 0)) { + $pnt$1$lcssa = $214; + $pnt2$3$lcssa = $215; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $pnt$163 = $214; + $pnt2$362 = $215; + $wk_max$157 = $wk_max$2; + } + } + } else { + $pnt$1$lcssa = $pnt$072; + $pnt2$3$lcssa = $pnt2$271; + $wk_max$1$lcssa = $wk_max$070; + } + $j$068 = $j$068 + 1 | 0; + if (($j$068 | 0) >= ($1 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $pnt$072 = $pnt$1$lcssa + 4 | 0; + $pnt2$271 = $pnt2$3$lcssa + 4 | 0; + $wk_max$070 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $221 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$337 = 1; + $j$138 = 1; + $wk$439 = $16; + while (1) { + $223 = HEAP32[$wk$439 >> 2] | 0; + if (($223 | 0) == ($i$337 | 0)) { + $229 = $j$138; + $j$2 = $j$138 + 1 | 0; + } else { + $229 = HEAP32[$labelInfo + 1179664 + ($223 + -1 << 2) >> 2] | 0; + $j$2 = $j$138; + } + HEAP32[$wk$439 >> 2] = $229; + if (($i$337 | 0) < ($wk_max$0$lcssa | 0)) { + $i$337 = $i$337 + 1 | 0; + $j$138 = $j$2; + $wk$439 = $wk$439 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $233 = $labelInfo + 8 | 0; + $234 = $j$1$lcssa + -1 | 0; + HEAP32[$233 >> 2] = $234; + if (!$234) $$0 = 0; else { + _memset($221 | 0, 0, $234 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $234 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$435 = 0; + do { + $241 = $i$435 << 2; + HEAP32[$labelInfo + 131084 + ($241 << 2) >> 2] = $xsize; + HEAP32[$labelInfo + 131084 + (($241 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($241 | 2) << 2) >> 2] = $ysize; + HEAP32[$labelInfo + 131084 + (($241 | 3) << 2) >> 2] = 0; + $i$435 = $i$435 + 1 | 0; + } while (($i$435 | 0) < (HEAP32[$233 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$533 = 0; + do { + $255 = (HEAP32[$labelInfo + 1179664 + ($i$533 << 2) >> 2] | 0) + -1 | 0; + $256 = $i$533 * 7 | 0; + $259 = $labelInfo + 12 + ($255 << 2) | 0; + HEAP32[$259 >> 2] = (HEAP32[$259 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($256 << 2) >> 2] | 0); + $266 = $255 << 1; + $267 = $labelInfo + 655376 + ($266 << 3) | 0; + HEAPF64[$267 >> 3] = +HEAPF64[$267 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($256 + 1 << 2) >> 2] | 0); + $275 = $labelInfo + 655376 + (($266 | 1) << 3) | 0; + HEAPF64[$275 >> 3] = +HEAPF64[$275 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($256 + 2 << 2) >> 2] | 0); + $278 = $255 << 2; + $279 = $labelInfo + 131084 + ($278 << 2) | 0; + $283 = HEAP32[$labelInfo + 1310736 + ($256 + 3 << 2) >> 2] | 0; + if ((HEAP32[$279 >> 2] | 0) > ($283 | 0)) HEAP32[$279 >> 2] = $283; + $286 = $labelInfo + 131084 + (($278 | 1) << 2) | 0; + $290 = HEAP32[$labelInfo + 1310736 + ($256 + 4 << 2) >> 2] | 0; + if ((HEAP32[$286 >> 2] | 0) < ($290 | 0)) HEAP32[$286 >> 2] = $290; + $293 = $labelInfo + 131084 + (($278 | 2) << 2) | 0; + $297 = HEAP32[$labelInfo + 1310736 + ($256 + 5 << 2) >> 2] | 0; + if ((HEAP32[$293 >> 2] | 0) > ($297 | 0)) HEAP32[$293 >> 2] = $297; + $300 = $labelInfo + 131084 + (($278 | 3) << 2) | 0; + $304 = HEAP32[$labelInfo + 1310736 + ($256 + 6 << 2) >> 2] | 0; + if ((HEAP32[$300 >> 2] | 0) < ($304 | 0)) HEAP32[$300 >> 2] = $304; + $i$533 = $i$533 + 1 | 0; + } while (($i$533 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$233 >> 2] | 0) > 0) { + $i$632 = 0; + do { + $308 = $labelInfo + 12 + ($i$632 << 2) | 0; + $311 = $i$632 << 1; + $312 = $labelInfo + 655376 + ($311 << 3) | 0; + HEAPF64[$312 >> 3] = +HEAPF64[$312 >> 3] / +(HEAP32[$308 >> 2] | 0); + $318 = $labelInfo + 655376 + (($311 | 1) << 3) | 0; + HEAPF64[$318 >> 3] = +HEAPF64[$318 >> 3] / +(HEAP32[$308 >> 2] | 0); + $i$632 = $i$632 + 1 | 0; + } while (($i$632 | 0) < (HEAP32[$233 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubDBRCY($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $0 = 0, $1 = 0, $100 = 0, $103 = 0, $120 = 0, $122 = 0, $124 = 0, $128 = 0, $132 = 0, $135 = 0, $137 = 0, $141 = 0, $145 = 0, $149 = 0, $154 = 0, $156 = 0, $16 = 0, $160 = 0, $164 = 0, $168 = 0, $17 = 0, $174 = 0, $177 = 0, $179 = 0, $18 = 0, $183 = 0, $187 = 0, $191 = 0, $194 = 0, $199 = 0, $214 = 0, $215 = 0, $221 = 0, $223 = 0, $229 = 0, $23 = 0, $233 = 0, $234 = 0, $241 = 0, $255 = 0, $256 = 0, $259 = 0, $266 = 0, $267 = 0, $275 = 0, $278 = 0, $279 = 0, $283 = 0, $286 = 0, $29 = 0, $290 = 0, $293 = 0, $297 = 0, $300 = 0, $304 = 0, $308 = 0, $311 = 0, $312 = 0, $318 = 0, $32 = 0, $34 = 0, $38 = 0, $42 = 0, $48 = 0, $49 = 0, $52 = 0, $53 = 0, $54 = 0, $57 = 0, $60 = 0, $77 = 0, $79 = 0, $81 = 0, $85 = 0, $89 = 0, $9 = 0, $95 = 0, $i$081 = 0, $i$175 = 0, $i$255 = 0, $i$337 = 0, $i$435 = 0, $i$533 = 0, $i$632 = 0, $j$068 = 0, $j$1$lcssa = 0, $j$138 = 0, $j$2 = 0, $k$051 = 0, $k$148 = 0, $k$244 = 0, $k$341 = 0, $pnt$072 = 0, $pnt$1$lcssa = 0, $pnt$163 = 0, $pnt1$083 = 0, $pnt1$177 = 0, $pnt2$082 = 0, $pnt2$176 = 0, $pnt2$271 = 0, $pnt2$3$lcssa = 0, $pnt2$362 = 0, $vararg_buffer = 0, $wk$052 = 0, $wk$149 = 0, $wk$245 = 0, $wk$342 = 0, $wk$439 = 0, $wk_max$0$lcssa = 0, $wk_max$070 = 0, $wk_max$1$lcssa = 0, $wk_max$157 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = HEAP32[$labelInfo >> 2] | 0; + $1 = $ysize + -1 | 0; + if (($xsize | 0) > 0) { + $i$081 = 0; + $pnt1$083 = $0; + $pnt2$082 = $0 + ((Math_imul($1, $xsize) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$082 >> 1] = 0; + HEAP16[$pnt1$083 >> 1] = 0; + $i$081 = $i$081 + 1 | 0; + if (($i$081 | 0) >= ($xsize | 0)) break; else { + $pnt1$083 = $pnt1$083 + 2 | 0; + $pnt2$082 = $pnt2$082 + 2 | 0; + } + } + } + $9 = $xsize + -1 | 0; + if (($ysize | 0) > 0) { + $i$175 = 0; + $pnt1$177 = $0; + $pnt2$176 = $0 + ($9 << 1) | 0; + while (1) { + HEAP16[$pnt2$176 >> 1] = 0; + HEAP16[$pnt1$177 >> 1] = 0; + $i$175 = $i$175 + 1 | 0; + if (($i$175 | 0) >= ($ysize | 0)) break; else { + $pnt1$177 = $pnt1$177 + ($xsize << 1) | 0; + $pnt2$176 = $pnt2$176 + ($xsize << 1) | 0; + } + } + } + $16 = $labelInfo + 1179664 | 0; + $17 = $xsize + 1 | 0; + $18 = 0 - $xsize | 0; + $$sum = 1 - $xsize | 0; + $$sum1 = ~$xsize; + L11 : do if (($1 | 0) > 1) { + $23 = ($9 | 0) > 1; + $j$068 = 1; + $pnt$072 = $image + ($17 << 1) | 0; + $pnt2$271 = $0 + ($17 << 1) | 0; + $wk_max$070 = 0; + L13 : while (1) { + if ($23) { + $i$255 = 1; + $pnt$163 = $pnt$072; + $pnt2$362 = $pnt2$271; + $wk_max$157 = $wk_max$070; + while (1) { + do if ((HEAPU8[$pnt$163 + 1 >> 0] | 0 | 0) > ($labelingThresh | 0)) { + HEAP16[$pnt2$362 >> 1] = 0; + $wk_max$2 = $wk_max$157; + } else { + $29 = HEAP16[$pnt2$362 + ($18 << 1) >> 1] | 0; + if ($29 << 16 >> 16 > 0) { + HEAP16[$pnt2$362 >> 1] = $29; + $32 = ($29 << 16 >> 16) * 7 | 0; + $34 = $labelInfo + 1310736 + ($32 + -7 << 2) | 0; + HEAP32[$34 >> 2] = (HEAP32[$34 >> 2] | 0) + 1; + $38 = $labelInfo + 1310736 + ($32 + -6 << 2) | 0; + HEAP32[$38 >> 2] = (HEAP32[$38 >> 2] | 0) + $i$255; + $42 = $labelInfo + 1310736 + ($32 + -5 << 2) | 0; + HEAP32[$42 >> 2] = (HEAP32[$42 >> 2] | 0) + $j$068; + HEAP32[$labelInfo + 1310736 + ($32 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $48 = HEAP16[$pnt2$362 + ($$sum << 1) >> 1] | 0; + $49 = $48 << 16 >> 16; + $52 = HEAP16[$pnt2$362 + ($$sum1 << 1) >> 1] | 0; + $53 = $52 << 16 >> 16; + $54 = $52 << 16 >> 16 > 0; + if ($48 << 16 >> 16 <= 0) { + if ($54) { + HEAP16[$pnt2$362 >> 1] = $52; + $154 = $53 * 7 | 0; + $156 = $labelInfo + 1310736 + ($154 + -7 << 2) | 0; + HEAP32[$156 >> 2] = (HEAP32[$156 >> 2] | 0) + 1; + $160 = $labelInfo + 1310736 + ($154 + -6 << 2) | 0; + HEAP32[$160 >> 2] = (HEAP32[$160 >> 2] | 0) + $i$255; + $164 = $labelInfo + 1310736 + ($154 + -5 << 2) | 0; + HEAP32[$164 >> 2] = (HEAP32[$164 >> 2] | 0) + $j$068; + $168 = $labelInfo + 1310736 + ($154 + -3 << 2) | 0; + if ((HEAP32[$168 >> 2] | 0) < ($i$255 | 0)) HEAP32[$168 >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($154 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $174 = HEAP16[$pnt2$362 + -2 >> 1] | 0; + if ($174 << 16 >> 16 > 0) { + HEAP16[$pnt2$362 >> 1] = $174; + $177 = ($174 << 16 >> 16) * 7 | 0; + $179 = $labelInfo + 1310736 + ($177 + -7 << 2) | 0; + HEAP32[$179 >> 2] = (HEAP32[$179 >> 2] | 0) + 1; + $183 = $labelInfo + 1310736 + ($177 + -6 << 2) | 0; + HEAP32[$183 >> 2] = (HEAP32[$183 >> 2] | 0) + $i$255; + $187 = $labelInfo + 1310736 + ($177 + -5 << 2) | 0; + HEAP32[$187 >> 2] = (HEAP32[$187 >> 2] | 0) + $j$068; + $191 = $labelInfo + 1310736 + ($177 + -3 << 2) | 0; + if ((HEAP32[$191 >> 2] | 0) >= ($i$255 | 0)) { + $wk_max$2 = $wk_max$157; + break; + } + HEAP32[$191 >> 2] = $i$255; + $wk_max$2 = $wk_max$157; + break; + } else { + $194 = $wk_max$157 + 1 | 0; + if (($wk_max$157 | 0) > 32767) break L13; + HEAP16[$pnt2$362 >> 1] = $194; + HEAP32[$labelInfo + 1179664 + ($wk_max$157 << 2) >> 2] = $194 << 16 >> 16; + $199 = $wk_max$157 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($199 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($199 + 1 << 2) >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($199 + 2 << 2) >> 2] = $j$068; + HEAP32[$labelInfo + 1310736 + ($199 + 3 << 2) >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($199 + 4 << 2) >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($199 + 5 << 2) >> 2] = $j$068; + HEAP32[$labelInfo + 1310736 + ($199 + 6 << 2) >> 2] = $j$068; + $wk_max$2 = $194; + break; + } + } + if ($54) { + $57 = HEAP32[$labelInfo + 1179664 + ($49 + -1 << 2) >> 2] | 0; + $60 = HEAP32[$labelInfo + 1179664 + ($53 + -1 << 2) >> 2] | 0; + if (($57 | 0) > ($60 | 0)) { + HEAP16[$pnt2$362 >> 1] = $60; + if (($wk_max$157 | 0) > 0) { + $k$051 = 0; + $wk$052 = $16; + while (1) { + if ((HEAP32[$wk$052 >> 2] | 0) == ($57 | 0)) HEAP32[$wk$052 >> 2] = $60; + $k$051 = $k$051 + 1 | 0; + if (($k$051 | 0) >= ($wk_max$157 | 0)) { + $77 = $60; + break; + } else $wk$052 = $wk$052 + 4 | 0; + } + } else $77 = $60; + } else { + HEAP16[$pnt2$362 >> 1] = $57; + if (($57 | 0) < ($60 | 0) & ($wk_max$157 | 0) > 0) { + $k$148 = 0; + $wk$149 = $16; + while (1) { + if ((HEAP32[$wk$149 >> 2] | 0) == ($60 | 0)) HEAP32[$wk$149 >> 2] = $57; + $k$148 = $k$148 + 1 | 0; + if (($k$148 | 0) >= ($wk_max$157 | 0)) { + $77 = $57; + break; + } else $wk$149 = $wk$149 + 4 | 0; + } + } else $77 = $57; + } + $79 = ($77 << 16 >> 16) * 7 | 0; + $81 = $labelInfo + 1310736 + ($79 + -7 << 2) | 0; + HEAP32[$81 >> 2] = (HEAP32[$81 >> 2] | 0) + 1; + $85 = $labelInfo + 1310736 + ($79 + -6 << 2) | 0; + HEAP32[$85 >> 2] = (HEAP32[$85 >> 2] | 0) + $i$255; + $89 = $labelInfo + 1310736 + ($79 + -5 << 2) | 0; + HEAP32[$89 >> 2] = (HEAP32[$89 >> 2] | 0) + $j$068; + HEAP32[$labelInfo + 1310736 + ($79 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $95 = HEAP16[$pnt2$362 + -2 >> 1] | 0; + if ($95 << 16 >> 16 <= 0) { + HEAP16[$pnt2$362 >> 1] = $48; + $135 = $49 * 7 | 0; + $137 = $labelInfo + 1310736 + ($135 + -7 << 2) | 0; + HEAP32[$137 >> 2] = (HEAP32[$137 >> 2] | 0) + 1; + $141 = $labelInfo + 1310736 + ($135 + -6 << 2) | 0; + HEAP32[$141 >> 2] = (HEAP32[$141 >> 2] | 0) + $i$255; + $145 = $labelInfo + 1310736 + ($135 + -5 << 2) | 0; + HEAP32[$145 >> 2] = (HEAP32[$145 >> 2] | 0) + $j$068; + $149 = $labelInfo + 1310736 + ($135 + -4 << 2) | 0; + if ((HEAP32[$149 >> 2] | 0) > ($i$255 | 0)) HEAP32[$149 >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($135 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $100 = HEAP32[$labelInfo + 1179664 + ($49 + -1 << 2) >> 2] | 0; + $103 = HEAP32[$labelInfo + 1179664 + (($95 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($100 | 0) > ($103 | 0)) { + HEAP16[$pnt2$362 >> 1] = $103; + if (($wk_max$157 | 0) > 0) { + $k$244 = 0; + $wk$245 = $16; + while (1) { + if ((HEAP32[$wk$245 >> 2] | 0) == ($100 | 0)) HEAP32[$wk$245 >> 2] = $103; + $k$244 = $k$244 + 1 | 0; + if (($k$244 | 0) >= ($wk_max$157 | 0)) { + $120 = $103; + break; + } else $wk$245 = $wk$245 + 4 | 0; + } + } else $120 = $103; + } else { + HEAP16[$pnt2$362 >> 1] = $100; + if (($100 | 0) < ($103 | 0) & ($wk_max$157 | 0) > 0) { + $k$341 = 0; + $wk$342 = $16; + while (1) { + if ((HEAP32[$wk$342 >> 2] | 0) == ($103 | 0)) HEAP32[$wk$342 >> 2] = $100; + $k$341 = $k$341 + 1 | 0; + if (($k$341 | 0) >= ($wk_max$157 | 0)) { + $120 = $100; + break; + } else $wk$342 = $wk$342 + 4 | 0; + } + } else $120 = $100; + } + $122 = ($120 << 16 >> 16) * 7 | 0; + $124 = $labelInfo + 1310736 + ($122 + -7 << 2) | 0; + HEAP32[$124 >> 2] = (HEAP32[$124 >> 2] | 0) + 1; + $128 = $labelInfo + 1310736 + ($122 + -6 << 2) | 0; + HEAP32[$128 >> 2] = (HEAP32[$128 >> 2] | 0) + $i$255; + $132 = $labelInfo + 1310736 + ($122 + -5 << 2) | 0; + HEAP32[$132 >> 2] = (HEAP32[$132 >> 2] | 0) + $j$068; + $wk_max$2 = $wk_max$157; + } while (0); + $i$255 = $i$255 + 1 | 0; + $214 = $pnt$163 + 2 | 0; + $215 = $pnt2$362 + 2 | 0; + if (($i$255 | 0) >= ($9 | 0)) { + $pnt$1$lcssa = $214; + $pnt2$3$lcssa = $215; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $pnt$163 = $214; + $pnt2$362 = $215; + $wk_max$157 = $wk_max$2; + } + } + } else { + $pnt$1$lcssa = $pnt$072; + $pnt2$3$lcssa = $pnt2$271; + $wk_max$1$lcssa = $wk_max$070; + } + $j$068 = $j$068 + 1 | 0; + if (($j$068 | 0) >= ($1 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $pnt$072 = $pnt$1$lcssa + 4 | 0; + $pnt2$271 = $pnt2$3$lcssa + 4 | 0; + $wk_max$070 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $221 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$337 = 1; + $j$138 = 1; + $wk$439 = $16; + while (1) { + $223 = HEAP32[$wk$439 >> 2] | 0; + if (($223 | 0) == ($i$337 | 0)) { + $229 = $j$138; + $j$2 = $j$138 + 1 | 0; + } else { + $229 = HEAP32[$labelInfo + 1179664 + ($223 + -1 << 2) >> 2] | 0; + $j$2 = $j$138; + } + HEAP32[$wk$439 >> 2] = $229; + if (($i$337 | 0) < ($wk_max$0$lcssa | 0)) { + $i$337 = $i$337 + 1 | 0; + $j$138 = $j$2; + $wk$439 = $wk$439 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $233 = $labelInfo + 8 | 0; + $234 = $j$1$lcssa + -1 | 0; + HEAP32[$233 >> 2] = $234; + if (!$234) $$0 = 0; else { + _memset($221 | 0, 0, $234 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $234 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$435 = 0; + do { + $241 = $i$435 << 2; + HEAP32[$labelInfo + 131084 + ($241 << 2) >> 2] = $xsize; + HEAP32[$labelInfo + 131084 + (($241 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($241 | 2) << 2) >> 2] = $ysize; + HEAP32[$labelInfo + 131084 + (($241 | 3) << 2) >> 2] = 0; + $i$435 = $i$435 + 1 | 0; + } while (($i$435 | 0) < (HEAP32[$233 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$533 = 0; + do { + $255 = (HEAP32[$labelInfo + 1179664 + ($i$533 << 2) >> 2] | 0) + -1 | 0; + $256 = $i$533 * 7 | 0; + $259 = $labelInfo + 12 + ($255 << 2) | 0; + HEAP32[$259 >> 2] = (HEAP32[$259 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($256 << 2) >> 2] | 0); + $266 = $255 << 1; + $267 = $labelInfo + 655376 + ($266 << 3) | 0; + HEAPF64[$267 >> 3] = +HEAPF64[$267 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($256 + 1 << 2) >> 2] | 0); + $275 = $labelInfo + 655376 + (($266 | 1) << 3) | 0; + HEAPF64[$275 >> 3] = +HEAPF64[$275 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($256 + 2 << 2) >> 2] | 0); + $278 = $255 << 2; + $279 = $labelInfo + 131084 + ($278 << 2) | 0; + $283 = HEAP32[$labelInfo + 1310736 + ($256 + 3 << 2) >> 2] | 0; + if ((HEAP32[$279 >> 2] | 0) > ($283 | 0)) HEAP32[$279 >> 2] = $283; + $286 = $labelInfo + 131084 + (($278 | 1) << 2) | 0; + $290 = HEAP32[$labelInfo + 1310736 + ($256 + 4 << 2) >> 2] | 0; + if ((HEAP32[$286 >> 2] | 0) < ($290 | 0)) HEAP32[$286 >> 2] = $290; + $293 = $labelInfo + 131084 + (($278 | 2) << 2) | 0; + $297 = HEAP32[$labelInfo + 1310736 + ($256 + 5 << 2) >> 2] | 0; + if ((HEAP32[$293 >> 2] | 0) > ($297 | 0)) HEAP32[$293 >> 2] = $297; + $300 = $labelInfo + 131084 + (($278 | 3) << 2) | 0; + $304 = HEAP32[$labelInfo + 1310736 + ($256 + 6 << 2) >> 2] | 0; + if ((HEAP32[$300 >> 2] | 0) < ($304 | 0)) HEAP32[$300 >> 2] = $304; + $i$533 = $i$533 + 1 | 0; + } while (($i$533 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$233 >> 2] | 0) > 0) { + $i$632 = 0; + do { + $308 = $labelInfo + 12 + ($i$632 << 2) | 0; + $311 = $i$632 << 1; + $312 = $labelInfo + 655376 + ($311 << 3) | 0; + HEAPF64[$312 >> 3] = +HEAPF64[$312 >> 3] / +(HEAP32[$308 >> 2] | 0); + $318 = $labelInfo + 655376 + (($311 | 1) << 3) | 0; + HEAPF64[$318 >> 3] = +HEAPF64[$318 >> 3] / +(HEAP32[$308 >> 2] | 0); + $i$632 = $i$632 + 1 | 0; + } while (($i$632 | 0) < (HEAP32[$233 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubDWRYC($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $0 = 0, $1 = 0, $102 = 0, $119 = 0, $121 = 0, $123 = 0, $127 = 0, $131 = 0, $134 = 0, $136 = 0, $140 = 0, $144 = 0, $148 = 0, $153 = 0, $155 = 0, $159 = 0, $16 = 0, $163 = 0, $167 = 0, $17 = 0, $173 = 0, $176 = 0, $178 = 0, $18 = 0, $182 = 0, $186 = 0, $190 = 0, $193 = 0, $198 = 0, $213 = 0, $214 = 0, $220 = 0, $222 = 0, $228 = 0, $23 = 0, $232 = 0, $233 = 0, $240 = 0, $254 = 0, $255 = 0, $258 = 0, $265 = 0, $266 = 0, $274 = 0, $277 = 0, $278 = 0, $28 = 0, $282 = 0, $285 = 0, $289 = 0, $292 = 0, $296 = 0, $299 = 0, $303 = 0, $307 = 0, $31 = 0, $310 = 0, $311 = 0, $317 = 0, $33 = 0, $37 = 0, $41 = 0, $47 = 0, $48 = 0, $51 = 0, $52 = 0, $53 = 0, $56 = 0, $59 = 0, $76 = 0, $78 = 0, $80 = 0, $84 = 0, $88 = 0, $9 = 0, $94 = 0, $99 = 0, $i$081 = 0, $i$175 = 0, $i$255 = 0, $i$337 = 0, $i$435 = 0, $i$533 = 0, $i$632 = 0, $j$068 = 0, $j$1$lcssa = 0, $j$138 = 0, $j$2 = 0, $k$051 = 0, $k$148 = 0, $k$244 = 0, $k$341 = 0, $pnt$072 = 0, $pnt$1$lcssa = 0, $pnt$163 = 0, $pnt1$083 = 0, $pnt1$177 = 0, $pnt2$082 = 0, $pnt2$176 = 0, $pnt2$271 = 0, $pnt2$3$lcssa = 0, $pnt2$362 = 0, $vararg_buffer = 0, $wk$052 = 0, $wk$149 = 0, $wk$245 = 0, $wk$342 = 0, $wk$439 = 0, $wk_max$0$lcssa = 0, $wk_max$070 = 0, $wk_max$1$lcssa = 0, $wk_max$157 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = HEAP32[$labelInfo >> 2] | 0; + $1 = $ysize + -1 | 0; + if (($xsize | 0) > 0) { + $i$081 = 0; + $pnt1$083 = $0; + $pnt2$082 = $0 + ((Math_imul($1, $xsize) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$082 >> 1] = 0; + HEAP16[$pnt1$083 >> 1] = 0; + $i$081 = $i$081 + 1 | 0; + if (($i$081 | 0) >= ($xsize | 0)) break; else { + $pnt1$083 = $pnt1$083 + 2 | 0; + $pnt2$082 = $pnt2$082 + 2 | 0; + } + } + } + $9 = $xsize + -1 | 0; + if (($ysize | 0) > 0) { + $i$175 = 0; + $pnt1$177 = $0; + $pnt2$176 = $0 + ($9 << 1) | 0; + while (1) { + HEAP16[$pnt2$176 >> 1] = 0; + HEAP16[$pnt1$177 >> 1] = 0; + $i$175 = $i$175 + 1 | 0; + if (($i$175 | 0) >= ($ysize | 0)) break; else { + $pnt1$177 = $pnt1$177 + ($xsize << 1) | 0; + $pnt2$176 = $pnt2$176 + ($xsize << 1) | 0; + } + } + } + $16 = $labelInfo + 1179664 | 0; + $17 = $xsize + 1 | 0; + $18 = 0 - $xsize | 0; + $$sum = 1 - $xsize | 0; + $$sum1 = ~$xsize; + L11 : do if (($1 | 0) > 1) { + $23 = ($9 | 0) > 1; + $j$068 = 1; + $pnt$072 = $image + ($17 << 1) | 0; + $pnt2$271 = $0 + ($17 << 1) | 0; + $wk_max$070 = 0; + L13 : while (1) { + if ($23) { + $i$255 = 1; + $pnt$163 = $pnt$072; + $pnt2$362 = $pnt2$271; + $wk_max$157 = $wk_max$070; + while (1) { + do if ((HEAPU8[$pnt$163 >> 0] | 0 | 0) > ($labelingThresh | 0)) { + $28 = HEAP16[$pnt2$362 + ($18 << 1) >> 1] | 0; + if ($28 << 16 >> 16 > 0) { + HEAP16[$pnt2$362 >> 1] = $28; + $31 = ($28 << 16 >> 16) * 7 | 0; + $33 = $labelInfo + 1310736 + ($31 + -7 << 2) | 0; + HEAP32[$33 >> 2] = (HEAP32[$33 >> 2] | 0) + 1; + $37 = $labelInfo + 1310736 + ($31 + -6 << 2) | 0; + HEAP32[$37 >> 2] = (HEAP32[$37 >> 2] | 0) + $i$255; + $41 = $labelInfo + 1310736 + ($31 + -5 << 2) | 0; + HEAP32[$41 >> 2] = (HEAP32[$41 >> 2] | 0) + $j$068; + HEAP32[$labelInfo + 1310736 + ($31 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $47 = HEAP16[$pnt2$362 + ($$sum << 1) >> 1] | 0; + $48 = $47 << 16 >> 16; + $51 = HEAP16[$pnt2$362 + ($$sum1 << 1) >> 1] | 0; + $52 = $51 << 16 >> 16; + $53 = $51 << 16 >> 16 > 0; + if ($47 << 16 >> 16 <= 0) { + if ($53) { + HEAP16[$pnt2$362 >> 1] = $51; + $153 = $52 * 7 | 0; + $155 = $labelInfo + 1310736 + ($153 + -7 << 2) | 0; + HEAP32[$155 >> 2] = (HEAP32[$155 >> 2] | 0) + 1; + $159 = $labelInfo + 1310736 + ($153 + -6 << 2) | 0; + HEAP32[$159 >> 2] = (HEAP32[$159 >> 2] | 0) + $i$255; + $163 = $labelInfo + 1310736 + ($153 + -5 << 2) | 0; + HEAP32[$163 >> 2] = (HEAP32[$163 >> 2] | 0) + $j$068; + $167 = $labelInfo + 1310736 + ($153 + -3 << 2) | 0; + if ((HEAP32[$167 >> 2] | 0) < ($i$255 | 0)) HEAP32[$167 >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($153 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $173 = HEAP16[$pnt2$362 + -2 >> 1] | 0; + if ($173 << 16 >> 16 > 0) { + HEAP16[$pnt2$362 >> 1] = $173; + $176 = ($173 << 16 >> 16) * 7 | 0; + $178 = $labelInfo + 1310736 + ($176 + -7 << 2) | 0; + HEAP32[$178 >> 2] = (HEAP32[$178 >> 2] | 0) + 1; + $182 = $labelInfo + 1310736 + ($176 + -6 << 2) | 0; + HEAP32[$182 >> 2] = (HEAP32[$182 >> 2] | 0) + $i$255; + $186 = $labelInfo + 1310736 + ($176 + -5 << 2) | 0; + HEAP32[$186 >> 2] = (HEAP32[$186 >> 2] | 0) + $j$068; + $190 = $labelInfo + 1310736 + ($176 + -3 << 2) | 0; + if ((HEAP32[$190 >> 2] | 0) >= ($i$255 | 0)) { + $wk_max$2 = $wk_max$157; + break; + } + HEAP32[$190 >> 2] = $i$255; + $wk_max$2 = $wk_max$157; + break; + } else { + $193 = $wk_max$157 + 1 | 0; + if (($wk_max$157 | 0) > 32767) break L13; + HEAP16[$pnt2$362 >> 1] = $193; + HEAP32[$labelInfo + 1179664 + ($wk_max$157 << 2) >> 2] = $193 << 16 >> 16; + $198 = $wk_max$157 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($198 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($198 + 1 << 2) >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($198 + 2 << 2) >> 2] = $j$068; + HEAP32[$labelInfo + 1310736 + ($198 + 3 << 2) >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($198 + 4 << 2) >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($198 + 5 << 2) >> 2] = $j$068; + HEAP32[$labelInfo + 1310736 + ($198 + 6 << 2) >> 2] = $j$068; + $wk_max$2 = $193; + break; + } + } + if ($53) { + $56 = HEAP32[$labelInfo + 1179664 + ($48 + -1 << 2) >> 2] | 0; + $59 = HEAP32[$labelInfo + 1179664 + ($52 + -1 << 2) >> 2] | 0; + if (($56 | 0) > ($59 | 0)) { + HEAP16[$pnt2$362 >> 1] = $59; + if (($wk_max$157 | 0) > 0) { + $k$051 = 0; + $wk$052 = $16; + while (1) { + if ((HEAP32[$wk$052 >> 2] | 0) == ($56 | 0)) HEAP32[$wk$052 >> 2] = $59; + $k$051 = $k$051 + 1 | 0; + if (($k$051 | 0) >= ($wk_max$157 | 0)) { + $76 = $59; + break; + } else $wk$052 = $wk$052 + 4 | 0; + } + } else $76 = $59; + } else { + HEAP16[$pnt2$362 >> 1] = $56; + if (($56 | 0) < ($59 | 0) & ($wk_max$157 | 0) > 0) { + $k$148 = 0; + $wk$149 = $16; + while (1) { + if ((HEAP32[$wk$149 >> 2] | 0) == ($59 | 0)) HEAP32[$wk$149 >> 2] = $56; + $k$148 = $k$148 + 1 | 0; + if (($k$148 | 0) >= ($wk_max$157 | 0)) { + $76 = $56; + break; + } else $wk$149 = $wk$149 + 4 | 0; + } + } else $76 = $56; + } + $78 = ($76 << 16 >> 16) * 7 | 0; + $80 = $labelInfo + 1310736 + ($78 + -7 << 2) | 0; + HEAP32[$80 >> 2] = (HEAP32[$80 >> 2] | 0) + 1; + $84 = $labelInfo + 1310736 + ($78 + -6 << 2) | 0; + HEAP32[$84 >> 2] = (HEAP32[$84 >> 2] | 0) + $i$255; + $88 = $labelInfo + 1310736 + ($78 + -5 << 2) | 0; + HEAP32[$88 >> 2] = (HEAP32[$88 >> 2] | 0) + $j$068; + HEAP32[$labelInfo + 1310736 + ($78 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $94 = HEAP16[$pnt2$362 + -2 >> 1] | 0; + if ($94 << 16 >> 16 <= 0) { + HEAP16[$pnt2$362 >> 1] = $47; + $134 = $48 * 7 | 0; + $136 = $labelInfo + 1310736 + ($134 + -7 << 2) | 0; + HEAP32[$136 >> 2] = (HEAP32[$136 >> 2] | 0) + 1; + $140 = $labelInfo + 1310736 + ($134 + -6 << 2) | 0; + HEAP32[$140 >> 2] = (HEAP32[$140 >> 2] | 0) + $i$255; + $144 = $labelInfo + 1310736 + ($134 + -5 << 2) | 0; + HEAP32[$144 >> 2] = (HEAP32[$144 >> 2] | 0) + $j$068; + $148 = $labelInfo + 1310736 + ($134 + -4 << 2) | 0; + if ((HEAP32[$148 >> 2] | 0) > ($i$255 | 0)) HEAP32[$148 >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($134 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $99 = HEAP32[$labelInfo + 1179664 + ($48 + -1 << 2) >> 2] | 0; + $102 = HEAP32[$labelInfo + 1179664 + (($94 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($99 | 0) > ($102 | 0)) { + HEAP16[$pnt2$362 >> 1] = $102; + if (($wk_max$157 | 0) > 0) { + $k$244 = 0; + $wk$245 = $16; + while (1) { + if ((HEAP32[$wk$245 >> 2] | 0) == ($99 | 0)) HEAP32[$wk$245 >> 2] = $102; + $k$244 = $k$244 + 1 | 0; + if (($k$244 | 0) >= ($wk_max$157 | 0)) { + $119 = $102; + break; + } else $wk$245 = $wk$245 + 4 | 0; + } + } else $119 = $102; + } else { + HEAP16[$pnt2$362 >> 1] = $99; + if (($99 | 0) < ($102 | 0) & ($wk_max$157 | 0) > 0) { + $k$341 = 0; + $wk$342 = $16; + while (1) { + if ((HEAP32[$wk$342 >> 2] | 0) == ($102 | 0)) HEAP32[$wk$342 >> 2] = $99; + $k$341 = $k$341 + 1 | 0; + if (($k$341 | 0) >= ($wk_max$157 | 0)) { + $119 = $99; + break; + } else $wk$342 = $wk$342 + 4 | 0; + } + } else $119 = $99; + } + $121 = ($119 << 16 >> 16) * 7 | 0; + $123 = $labelInfo + 1310736 + ($121 + -7 << 2) | 0; + HEAP32[$123 >> 2] = (HEAP32[$123 >> 2] | 0) + 1; + $127 = $labelInfo + 1310736 + ($121 + -6 << 2) | 0; + HEAP32[$127 >> 2] = (HEAP32[$127 >> 2] | 0) + $i$255; + $131 = $labelInfo + 1310736 + ($121 + -5 << 2) | 0; + HEAP32[$131 >> 2] = (HEAP32[$131 >> 2] | 0) + $j$068; + $wk_max$2 = $wk_max$157; + } else { + HEAP16[$pnt2$362 >> 1] = 0; + $wk_max$2 = $wk_max$157; + } while (0); + $i$255 = $i$255 + 1 | 0; + $213 = $pnt$163 + 2 | 0; + $214 = $pnt2$362 + 2 | 0; + if (($i$255 | 0) >= ($9 | 0)) { + $pnt$1$lcssa = $213; + $pnt2$3$lcssa = $214; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $pnt$163 = $213; + $pnt2$362 = $214; + $wk_max$157 = $wk_max$2; + } + } + } else { + $pnt$1$lcssa = $pnt$072; + $pnt2$3$lcssa = $pnt2$271; + $wk_max$1$lcssa = $wk_max$070; + } + $j$068 = $j$068 + 1 | 0; + if (($j$068 | 0) >= ($1 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $pnt$072 = $pnt$1$lcssa + 4 | 0; + $pnt2$271 = $pnt2$3$lcssa + 4 | 0; + $wk_max$070 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $220 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$337 = 1; + $j$138 = 1; + $wk$439 = $16; + while (1) { + $222 = HEAP32[$wk$439 >> 2] | 0; + if (($222 | 0) == ($i$337 | 0)) { + $228 = $j$138; + $j$2 = $j$138 + 1 | 0; + } else { + $228 = HEAP32[$labelInfo + 1179664 + ($222 + -1 << 2) >> 2] | 0; + $j$2 = $j$138; + } + HEAP32[$wk$439 >> 2] = $228; + if (($i$337 | 0) < ($wk_max$0$lcssa | 0)) { + $i$337 = $i$337 + 1 | 0; + $j$138 = $j$2; + $wk$439 = $wk$439 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $232 = $labelInfo + 8 | 0; + $233 = $j$1$lcssa + -1 | 0; + HEAP32[$232 >> 2] = $233; + if (!$233) $$0 = 0; else { + _memset($220 | 0, 0, $233 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $233 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$435 = 0; + do { + $240 = $i$435 << 2; + HEAP32[$labelInfo + 131084 + ($240 << 2) >> 2] = $xsize; + HEAP32[$labelInfo + 131084 + (($240 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($240 | 2) << 2) >> 2] = $ysize; + HEAP32[$labelInfo + 131084 + (($240 | 3) << 2) >> 2] = 0; + $i$435 = $i$435 + 1 | 0; + } while (($i$435 | 0) < (HEAP32[$232 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$533 = 0; + do { + $254 = (HEAP32[$labelInfo + 1179664 + ($i$533 << 2) >> 2] | 0) + -1 | 0; + $255 = $i$533 * 7 | 0; + $258 = $labelInfo + 12 + ($254 << 2) | 0; + HEAP32[$258 >> 2] = (HEAP32[$258 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($255 << 2) >> 2] | 0); + $265 = $254 << 1; + $266 = $labelInfo + 655376 + ($265 << 3) | 0; + HEAPF64[$266 >> 3] = +HEAPF64[$266 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($255 + 1 << 2) >> 2] | 0); + $274 = $labelInfo + 655376 + (($265 | 1) << 3) | 0; + HEAPF64[$274 >> 3] = +HEAPF64[$274 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($255 + 2 << 2) >> 2] | 0); + $277 = $254 << 2; + $278 = $labelInfo + 131084 + ($277 << 2) | 0; + $282 = HEAP32[$labelInfo + 1310736 + ($255 + 3 << 2) >> 2] | 0; + if ((HEAP32[$278 >> 2] | 0) > ($282 | 0)) HEAP32[$278 >> 2] = $282; + $285 = $labelInfo + 131084 + (($277 | 1) << 2) | 0; + $289 = HEAP32[$labelInfo + 1310736 + ($255 + 4 << 2) >> 2] | 0; + if ((HEAP32[$285 >> 2] | 0) < ($289 | 0)) HEAP32[$285 >> 2] = $289; + $292 = $labelInfo + 131084 + (($277 | 2) << 2) | 0; + $296 = HEAP32[$labelInfo + 1310736 + ($255 + 5 << 2) >> 2] | 0; + if ((HEAP32[$292 >> 2] | 0) > ($296 | 0)) HEAP32[$292 >> 2] = $296; + $299 = $labelInfo + 131084 + (($277 | 3) << 2) | 0; + $303 = HEAP32[$labelInfo + 1310736 + ($255 + 6 << 2) >> 2] | 0; + if ((HEAP32[$299 >> 2] | 0) < ($303 | 0)) HEAP32[$299 >> 2] = $303; + $i$533 = $i$533 + 1 | 0; + } while (($i$533 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$232 >> 2] | 0) > 0) { + $i$632 = 0; + do { + $307 = $labelInfo + 12 + ($i$632 << 2) | 0; + $310 = $i$632 << 1; + $311 = $labelInfo + 655376 + ($310 << 3) | 0; + HEAPF64[$311 >> 3] = +HEAPF64[$311 >> 3] / +(HEAP32[$307 >> 2] | 0); + $317 = $labelInfo + 655376 + (($310 | 1) << 3) | 0; + HEAPF64[$317 >> 3] = +HEAPF64[$317 >> 3] / +(HEAP32[$307 >> 2] | 0); + $i$632 = $i$632 + 1 | 0; + } while (($i$632 | 0) < (HEAP32[$232 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubDBRYC($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $0 = 0, $1 = 0, $102 = 0, $119 = 0, $121 = 0, $123 = 0, $127 = 0, $131 = 0, $134 = 0, $136 = 0, $140 = 0, $144 = 0, $148 = 0, $153 = 0, $155 = 0, $159 = 0, $16 = 0, $163 = 0, $167 = 0, $17 = 0, $173 = 0, $176 = 0, $178 = 0, $18 = 0, $182 = 0, $186 = 0, $190 = 0, $193 = 0, $198 = 0, $213 = 0, $214 = 0, $220 = 0, $222 = 0, $228 = 0, $23 = 0, $232 = 0, $233 = 0, $240 = 0, $254 = 0, $255 = 0, $258 = 0, $265 = 0, $266 = 0, $274 = 0, $277 = 0, $278 = 0, $28 = 0, $282 = 0, $285 = 0, $289 = 0, $292 = 0, $296 = 0, $299 = 0, $303 = 0, $307 = 0, $31 = 0, $310 = 0, $311 = 0, $317 = 0, $33 = 0, $37 = 0, $41 = 0, $47 = 0, $48 = 0, $51 = 0, $52 = 0, $53 = 0, $56 = 0, $59 = 0, $76 = 0, $78 = 0, $80 = 0, $84 = 0, $88 = 0, $9 = 0, $94 = 0, $99 = 0, $i$081 = 0, $i$175 = 0, $i$255 = 0, $i$337 = 0, $i$435 = 0, $i$533 = 0, $i$632 = 0, $j$068 = 0, $j$1$lcssa = 0, $j$138 = 0, $j$2 = 0, $k$051 = 0, $k$148 = 0, $k$244 = 0, $k$341 = 0, $pnt$072 = 0, $pnt$1$lcssa = 0, $pnt$163 = 0, $pnt1$083 = 0, $pnt1$177 = 0, $pnt2$082 = 0, $pnt2$176 = 0, $pnt2$271 = 0, $pnt2$3$lcssa = 0, $pnt2$362 = 0, $vararg_buffer = 0, $wk$052 = 0, $wk$149 = 0, $wk$245 = 0, $wk$342 = 0, $wk$439 = 0, $wk_max$0$lcssa = 0, $wk_max$070 = 0, $wk_max$1$lcssa = 0, $wk_max$157 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = HEAP32[$labelInfo >> 2] | 0; + $1 = $ysize + -1 | 0; + if (($xsize | 0) > 0) { + $i$081 = 0; + $pnt1$083 = $0; + $pnt2$082 = $0 + ((Math_imul($1, $xsize) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$082 >> 1] = 0; + HEAP16[$pnt1$083 >> 1] = 0; + $i$081 = $i$081 + 1 | 0; + if (($i$081 | 0) >= ($xsize | 0)) break; else { + $pnt1$083 = $pnt1$083 + 2 | 0; + $pnt2$082 = $pnt2$082 + 2 | 0; + } + } + } + $9 = $xsize + -1 | 0; + if (($ysize | 0) > 0) { + $i$175 = 0; + $pnt1$177 = $0; + $pnt2$176 = $0 + ($9 << 1) | 0; + while (1) { + HEAP16[$pnt2$176 >> 1] = 0; + HEAP16[$pnt1$177 >> 1] = 0; + $i$175 = $i$175 + 1 | 0; + if (($i$175 | 0) >= ($ysize | 0)) break; else { + $pnt1$177 = $pnt1$177 + ($xsize << 1) | 0; + $pnt2$176 = $pnt2$176 + ($xsize << 1) | 0; + } + } + } + $16 = $labelInfo + 1179664 | 0; + $17 = $xsize + 1 | 0; + $18 = 0 - $xsize | 0; + $$sum = 1 - $xsize | 0; + $$sum1 = ~$xsize; + L11 : do if (($1 | 0) > 1) { + $23 = ($9 | 0) > 1; + $j$068 = 1; + $pnt$072 = $image + ($17 << 1) | 0; + $pnt2$271 = $0 + ($17 << 1) | 0; + $wk_max$070 = 0; + L13 : while (1) { + if ($23) { + $i$255 = 1; + $pnt$163 = $pnt$072; + $pnt2$362 = $pnt2$271; + $wk_max$157 = $wk_max$070; + while (1) { + do if ((HEAPU8[$pnt$163 >> 0] | 0 | 0) > ($labelingThresh | 0)) { + HEAP16[$pnt2$362 >> 1] = 0; + $wk_max$2 = $wk_max$157; + } else { + $28 = HEAP16[$pnt2$362 + ($18 << 1) >> 1] | 0; + if ($28 << 16 >> 16 > 0) { + HEAP16[$pnt2$362 >> 1] = $28; + $31 = ($28 << 16 >> 16) * 7 | 0; + $33 = $labelInfo + 1310736 + ($31 + -7 << 2) | 0; + HEAP32[$33 >> 2] = (HEAP32[$33 >> 2] | 0) + 1; + $37 = $labelInfo + 1310736 + ($31 + -6 << 2) | 0; + HEAP32[$37 >> 2] = (HEAP32[$37 >> 2] | 0) + $i$255; + $41 = $labelInfo + 1310736 + ($31 + -5 << 2) | 0; + HEAP32[$41 >> 2] = (HEAP32[$41 >> 2] | 0) + $j$068; + HEAP32[$labelInfo + 1310736 + ($31 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $47 = HEAP16[$pnt2$362 + ($$sum << 1) >> 1] | 0; + $48 = $47 << 16 >> 16; + $51 = HEAP16[$pnt2$362 + ($$sum1 << 1) >> 1] | 0; + $52 = $51 << 16 >> 16; + $53 = $51 << 16 >> 16 > 0; + if ($47 << 16 >> 16 <= 0) { + if ($53) { + HEAP16[$pnt2$362 >> 1] = $51; + $153 = $52 * 7 | 0; + $155 = $labelInfo + 1310736 + ($153 + -7 << 2) | 0; + HEAP32[$155 >> 2] = (HEAP32[$155 >> 2] | 0) + 1; + $159 = $labelInfo + 1310736 + ($153 + -6 << 2) | 0; + HEAP32[$159 >> 2] = (HEAP32[$159 >> 2] | 0) + $i$255; + $163 = $labelInfo + 1310736 + ($153 + -5 << 2) | 0; + HEAP32[$163 >> 2] = (HEAP32[$163 >> 2] | 0) + $j$068; + $167 = $labelInfo + 1310736 + ($153 + -3 << 2) | 0; + if ((HEAP32[$167 >> 2] | 0) < ($i$255 | 0)) HEAP32[$167 >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($153 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $173 = HEAP16[$pnt2$362 + -2 >> 1] | 0; + if ($173 << 16 >> 16 > 0) { + HEAP16[$pnt2$362 >> 1] = $173; + $176 = ($173 << 16 >> 16) * 7 | 0; + $178 = $labelInfo + 1310736 + ($176 + -7 << 2) | 0; + HEAP32[$178 >> 2] = (HEAP32[$178 >> 2] | 0) + 1; + $182 = $labelInfo + 1310736 + ($176 + -6 << 2) | 0; + HEAP32[$182 >> 2] = (HEAP32[$182 >> 2] | 0) + $i$255; + $186 = $labelInfo + 1310736 + ($176 + -5 << 2) | 0; + HEAP32[$186 >> 2] = (HEAP32[$186 >> 2] | 0) + $j$068; + $190 = $labelInfo + 1310736 + ($176 + -3 << 2) | 0; + if ((HEAP32[$190 >> 2] | 0) >= ($i$255 | 0)) { + $wk_max$2 = $wk_max$157; + break; + } + HEAP32[$190 >> 2] = $i$255; + $wk_max$2 = $wk_max$157; + break; + } else { + $193 = $wk_max$157 + 1 | 0; + if (($wk_max$157 | 0) > 32767) break L13; + HEAP16[$pnt2$362 >> 1] = $193; + HEAP32[$labelInfo + 1179664 + ($wk_max$157 << 2) >> 2] = $193 << 16 >> 16; + $198 = $wk_max$157 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($198 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($198 + 1 << 2) >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($198 + 2 << 2) >> 2] = $j$068; + HEAP32[$labelInfo + 1310736 + ($198 + 3 << 2) >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($198 + 4 << 2) >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($198 + 5 << 2) >> 2] = $j$068; + HEAP32[$labelInfo + 1310736 + ($198 + 6 << 2) >> 2] = $j$068; + $wk_max$2 = $193; + break; + } + } + if ($53) { + $56 = HEAP32[$labelInfo + 1179664 + ($48 + -1 << 2) >> 2] | 0; + $59 = HEAP32[$labelInfo + 1179664 + ($52 + -1 << 2) >> 2] | 0; + if (($56 | 0) > ($59 | 0)) { + HEAP16[$pnt2$362 >> 1] = $59; + if (($wk_max$157 | 0) > 0) { + $k$051 = 0; + $wk$052 = $16; + while (1) { + if ((HEAP32[$wk$052 >> 2] | 0) == ($56 | 0)) HEAP32[$wk$052 >> 2] = $59; + $k$051 = $k$051 + 1 | 0; + if (($k$051 | 0) >= ($wk_max$157 | 0)) { + $76 = $59; + break; + } else $wk$052 = $wk$052 + 4 | 0; + } + } else $76 = $59; + } else { + HEAP16[$pnt2$362 >> 1] = $56; + if (($56 | 0) < ($59 | 0) & ($wk_max$157 | 0) > 0) { + $k$148 = 0; + $wk$149 = $16; + while (1) { + if ((HEAP32[$wk$149 >> 2] | 0) == ($59 | 0)) HEAP32[$wk$149 >> 2] = $56; + $k$148 = $k$148 + 1 | 0; + if (($k$148 | 0) >= ($wk_max$157 | 0)) { + $76 = $56; + break; + } else $wk$149 = $wk$149 + 4 | 0; + } + } else $76 = $56; + } + $78 = ($76 << 16 >> 16) * 7 | 0; + $80 = $labelInfo + 1310736 + ($78 + -7 << 2) | 0; + HEAP32[$80 >> 2] = (HEAP32[$80 >> 2] | 0) + 1; + $84 = $labelInfo + 1310736 + ($78 + -6 << 2) | 0; + HEAP32[$84 >> 2] = (HEAP32[$84 >> 2] | 0) + $i$255; + $88 = $labelInfo + 1310736 + ($78 + -5 << 2) | 0; + HEAP32[$88 >> 2] = (HEAP32[$88 >> 2] | 0) + $j$068; + HEAP32[$labelInfo + 1310736 + ($78 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $94 = HEAP16[$pnt2$362 + -2 >> 1] | 0; + if ($94 << 16 >> 16 <= 0) { + HEAP16[$pnt2$362 >> 1] = $47; + $134 = $48 * 7 | 0; + $136 = $labelInfo + 1310736 + ($134 + -7 << 2) | 0; + HEAP32[$136 >> 2] = (HEAP32[$136 >> 2] | 0) + 1; + $140 = $labelInfo + 1310736 + ($134 + -6 << 2) | 0; + HEAP32[$140 >> 2] = (HEAP32[$140 >> 2] | 0) + $i$255; + $144 = $labelInfo + 1310736 + ($134 + -5 << 2) | 0; + HEAP32[$144 >> 2] = (HEAP32[$144 >> 2] | 0) + $j$068; + $148 = $labelInfo + 1310736 + ($134 + -4 << 2) | 0; + if ((HEAP32[$148 >> 2] | 0) > ($i$255 | 0)) HEAP32[$148 >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($134 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $99 = HEAP32[$labelInfo + 1179664 + ($48 + -1 << 2) >> 2] | 0; + $102 = HEAP32[$labelInfo + 1179664 + (($94 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($99 | 0) > ($102 | 0)) { + HEAP16[$pnt2$362 >> 1] = $102; + if (($wk_max$157 | 0) > 0) { + $k$244 = 0; + $wk$245 = $16; + while (1) { + if ((HEAP32[$wk$245 >> 2] | 0) == ($99 | 0)) HEAP32[$wk$245 >> 2] = $102; + $k$244 = $k$244 + 1 | 0; + if (($k$244 | 0) >= ($wk_max$157 | 0)) { + $119 = $102; + break; + } else $wk$245 = $wk$245 + 4 | 0; + } + } else $119 = $102; + } else { + HEAP16[$pnt2$362 >> 1] = $99; + if (($99 | 0) < ($102 | 0) & ($wk_max$157 | 0) > 0) { + $k$341 = 0; + $wk$342 = $16; + while (1) { + if ((HEAP32[$wk$342 >> 2] | 0) == ($102 | 0)) HEAP32[$wk$342 >> 2] = $99; + $k$341 = $k$341 + 1 | 0; + if (($k$341 | 0) >= ($wk_max$157 | 0)) { + $119 = $99; + break; + } else $wk$342 = $wk$342 + 4 | 0; + } + } else $119 = $99; + } + $121 = ($119 << 16 >> 16) * 7 | 0; + $123 = $labelInfo + 1310736 + ($121 + -7 << 2) | 0; + HEAP32[$123 >> 2] = (HEAP32[$123 >> 2] | 0) + 1; + $127 = $labelInfo + 1310736 + ($121 + -6 << 2) | 0; + HEAP32[$127 >> 2] = (HEAP32[$127 >> 2] | 0) + $i$255; + $131 = $labelInfo + 1310736 + ($121 + -5 << 2) | 0; + HEAP32[$131 >> 2] = (HEAP32[$131 >> 2] | 0) + $j$068; + $wk_max$2 = $wk_max$157; + } while (0); + $i$255 = $i$255 + 1 | 0; + $213 = $pnt$163 + 2 | 0; + $214 = $pnt2$362 + 2 | 0; + if (($i$255 | 0) >= ($9 | 0)) { + $pnt$1$lcssa = $213; + $pnt2$3$lcssa = $214; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $pnt$163 = $213; + $pnt2$362 = $214; + $wk_max$157 = $wk_max$2; + } + } + } else { + $pnt$1$lcssa = $pnt$072; + $pnt2$3$lcssa = $pnt2$271; + $wk_max$1$lcssa = $wk_max$070; + } + $j$068 = $j$068 + 1 | 0; + if (($j$068 | 0) >= ($1 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $pnt$072 = $pnt$1$lcssa + 4 | 0; + $pnt2$271 = $pnt2$3$lcssa + 4 | 0; + $wk_max$070 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $220 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$337 = 1; + $j$138 = 1; + $wk$439 = $16; + while (1) { + $222 = HEAP32[$wk$439 >> 2] | 0; + if (($222 | 0) == ($i$337 | 0)) { + $228 = $j$138; + $j$2 = $j$138 + 1 | 0; + } else { + $228 = HEAP32[$labelInfo + 1179664 + ($222 + -1 << 2) >> 2] | 0; + $j$2 = $j$138; + } + HEAP32[$wk$439 >> 2] = $228; + if (($i$337 | 0) < ($wk_max$0$lcssa | 0)) { + $i$337 = $i$337 + 1 | 0; + $j$138 = $j$2; + $wk$439 = $wk$439 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $232 = $labelInfo + 8 | 0; + $233 = $j$1$lcssa + -1 | 0; + HEAP32[$232 >> 2] = $233; + if (!$233) $$0 = 0; else { + _memset($220 | 0, 0, $233 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $233 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$435 = 0; + do { + $240 = $i$435 << 2; + HEAP32[$labelInfo + 131084 + ($240 << 2) >> 2] = $xsize; + HEAP32[$labelInfo + 131084 + (($240 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($240 | 2) << 2) >> 2] = $ysize; + HEAP32[$labelInfo + 131084 + (($240 | 3) << 2) >> 2] = 0; + $i$435 = $i$435 + 1 | 0; + } while (($i$435 | 0) < (HEAP32[$232 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$533 = 0; + do { + $254 = (HEAP32[$labelInfo + 1179664 + ($i$533 << 2) >> 2] | 0) + -1 | 0; + $255 = $i$533 * 7 | 0; + $258 = $labelInfo + 12 + ($254 << 2) | 0; + HEAP32[$258 >> 2] = (HEAP32[$258 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($255 << 2) >> 2] | 0); + $265 = $254 << 1; + $266 = $labelInfo + 655376 + ($265 << 3) | 0; + HEAPF64[$266 >> 3] = +HEAPF64[$266 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($255 + 1 << 2) >> 2] | 0); + $274 = $labelInfo + 655376 + (($265 | 1) << 3) | 0; + HEAPF64[$274 >> 3] = +HEAPF64[$274 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($255 + 2 << 2) >> 2] | 0); + $277 = $254 << 2; + $278 = $labelInfo + 131084 + ($277 << 2) | 0; + $282 = HEAP32[$labelInfo + 1310736 + ($255 + 3 << 2) >> 2] | 0; + if ((HEAP32[$278 >> 2] | 0) > ($282 | 0)) HEAP32[$278 >> 2] = $282; + $285 = $labelInfo + 131084 + (($277 | 1) << 2) | 0; + $289 = HEAP32[$labelInfo + 1310736 + ($255 + 4 << 2) >> 2] | 0; + if ((HEAP32[$285 >> 2] | 0) < ($289 | 0)) HEAP32[$285 >> 2] = $289; + $292 = $labelInfo + 131084 + (($277 | 2) << 2) | 0; + $296 = HEAP32[$labelInfo + 1310736 + ($255 + 5 << 2) >> 2] | 0; + if ((HEAP32[$292 >> 2] | 0) > ($296 | 0)) HEAP32[$292 >> 2] = $296; + $299 = $labelInfo + 131084 + (($277 | 3) << 2) | 0; + $303 = HEAP32[$labelInfo + 1310736 + ($255 + 6 << 2) >> 2] | 0; + if ((HEAP32[$299 >> 2] | 0) < ($303 | 0)) HEAP32[$299 >> 2] = $303; + $i$533 = $i$533 + 1 | 0; + } while (($i$533 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$232 >> 2] | 0) > 0) { + $i$632 = 0; + do { + $307 = $labelInfo + 12 + ($i$632 << 2) | 0; + $310 = $i$632 << 1; + $311 = $labelInfo + 655376 + ($310 << 3) | 0; + HEAPF64[$311 >> 3] = +HEAPF64[$311 >> 3] / +(HEAP32[$307 >> 2] | 0); + $317 = $labelInfo + 655376 + (($310 | 1) << 3) | 0; + HEAPF64[$317 >> 3] = +HEAPF64[$317 >> 3] / +(HEAP32[$307 >> 2] | 0); + $i$632 = $i$632 + 1 | 0; + } while (($i$632 | 0) < (HEAP32[$232 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubDWRC($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $0 = 0, $1 = 0, $101 = 0, $118 = 0, $120 = 0, $122 = 0, $126 = 0, $130 = 0, $133 = 0, $135 = 0, $139 = 0, $143 = 0, $147 = 0, $152 = 0, $154 = 0, $158 = 0, $16 = 0, $162 = 0, $166 = 0, $17 = 0, $172 = 0, $175 = 0, $177 = 0, $18 = 0, $181 = 0, $185 = 0, $189 = 0, $192 = 0, $197 = 0, $212 = 0, $213 = 0, $219 = 0, $22 = 0, $221 = 0, $227 = 0, $231 = 0, $232 = 0, $239 = 0, $253 = 0, $254 = 0, $257 = 0, $264 = 0, $265 = 0, $27 = 0, $273 = 0, $276 = 0, $277 = 0, $281 = 0, $284 = 0, $288 = 0, $291 = 0, $295 = 0, $298 = 0, $30 = 0, $302 = 0, $306 = 0, $309 = 0, $310 = 0, $316 = 0, $32 = 0, $36 = 0, $40 = 0, $46 = 0, $47 = 0, $50 = 0, $51 = 0, $52 = 0, $55 = 0, $58 = 0, $75 = 0, $77 = 0, $79 = 0, $83 = 0, $87 = 0, $9 = 0, $93 = 0, $98 = 0, $i$081 = 0, $i$175 = 0, $i$255 = 0, $i$337 = 0, $i$435 = 0, $i$533 = 0, $i$632 = 0, $j$068 = 0, $j$1$lcssa = 0, $j$138 = 0, $j$2 = 0, $k$051 = 0, $k$148 = 0, $k$244 = 0, $k$341 = 0, $pnt$072 = 0, $pnt$1$lcssa = 0, $pnt$163 = 0, $pnt1$083 = 0, $pnt1$177 = 0, $pnt2$082 = 0, $pnt2$176 = 0, $pnt2$271 = 0, $pnt2$3$lcssa = 0, $pnt2$362 = 0, $vararg_buffer = 0, $wk$052 = 0, $wk$149 = 0, $wk$245 = 0, $wk$342 = 0, $wk$439 = 0, $wk_max$0$lcssa = 0, $wk_max$070 = 0, $wk_max$1$lcssa = 0, $wk_max$157 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = HEAP32[$labelInfo >> 2] | 0; + $1 = $ysize + -1 | 0; + if (($xsize | 0) > 0) { + $i$081 = 0; + $pnt1$083 = $0; + $pnt2$082 = $0 + ((Math_imul($1, $xsize) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$082 >> 1] = 0; + HEAP16[$pnt1$083 >> 1] = 0; + $i$081 = $i$081 + 1 | 0; + if (($i$081 | 0) >= ($xsize | 0)) break; else { + $pnt1$083 = $pnt1$083 + 2 | 0; + $pnt2$082 = $pnt2$082 + 2 | 0; + } + } + } + $9 = $xsize + -1 | 0; + if (($ysize | 0) > 0) { + $i$175 = 0; + $pnt1$177 = $0; + $pnt2$176 = $0 + ($9 << 1) | 0; + while (1) { + HEAP16[$pnt2$176 >> 1] = 0; + HEAP16[$pnt1$177 >> 1] = 0; + $i$175 = $i$175 + 1 | 0; + if (($i$175 | 0) >= ($ysize | 0)) break; else { + $pnt1$177 = $pnt1$177 + ($xsize << 1) | 0; + $pnt2$176 = $pnt2$176 + ($xsize << 1) | 0; + } + } + } + $16 = $labelInfo + 1179664 | 0; + $17 = $xsize + 1 | 0; + $18 = 0 - $xsize | 0; + $$sum = 1 - $xsize | 0; + $$sum1 = ~$xsize; + L11 : do if (($1 | 0) > 1) { + $22 = ($9 | 0) > 1; + $j$068 = 1; + $pnt$072 = $image + $17 | 0; + $pnt2$271 = $0 + ($17 << 1) | 0; + $wk_max$070 = 0; + L13 : while (1) { + if ($22) { + $i$255 = 1; + $pnt$163 = $pnt$072; + $pnt2$362 = $pnt2$271; + $wk_max$157 = $wk_max$070; + while (1) { + do if ((HEAPU8[$pnt$163 >> 0] | 0 | 0) > ($labelingThresh | 0)) { + $27 = HEAP16[$pnt2$362 + ($18 << 1) >> 1] | 0; + if ($27 << 16 >> 16 > 0) { + HEAP16[$pnt2$362 >> 1] = $27; + $30 = ($27 << 16 >> 16) * 7 | 0; + $32 = $labelInfo + 1310736 + ($30 + -7 << 2) | 0; + HEAP32[$32 >> 2] = (HEAP32[$32 >> 2] | 0) + 1; + $36 = $labelInfo + 1310736 + ($30 + -6 << 2) | 0; + HEAP32[$36 >> 2] = (HEAP32[$36 >> 2] | 0) + $i$255; + $40 = $labelInfo + 1310736 + ($30 + -5 << 2) | 0; + HEAP32[$40 >> 2] = (HEAP32[$40 >> 2] | 0) + $j$068; + HEAP32[$labelInfo + 1310736 + ($30 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $46 = HEAP16[$pnt2$362 + ($$sum << 1) >> 1] | 0; + $47 = $46 << 16 >> 16; + $50 = HEAP16[$pnt2$362 + ($$sum1 << 1) >> 1] | 0; + $51 = $50 << 16 >> 16; + $52 = $50 << 16 >> 16 > 0; + if ($46 << 16 >> 16 <= 0) { + if ($52) { + HEAP16[$pnt2$362 >> 1] = $50; + $152 = $51 * 7 | 0; + $154 = $labelInfo + 1310736 + ($152 + -7 << 2) | 0; + HEAP32[$154 >> 2] = (HEAP32[$154 >> 2] | 0) + 1; + $158 = $labelInfo + 1310736 + ($152 + -6 << 2) | 0; + HEAP32[$158 >> 2] = (HEAP32[$158 >> 2] | 0) + $i$255; + $162 = $labelInfo + 1310736 + ($152 + -5 << 2) | 0; + HEAP32[$162 >> 2] = (HEAP32[$162 >> 2] | 0) + $j$068; + $166 = $labelInfo + 1310736 + ($152 + -3 << 2) | 0; + if ((HEAP32[$166 >> 2] | 0) < ($i$255 | 0)) HEAP32[$166 >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($152 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $172 = HEAP16[$pnt2$362 + -2 >> 1] | 0; + if ($172 << 16 >> 16 > 0) { + HEAP16[$pnt2$362 >> 1] = $172; + $175 = ($172 << 16 >> 16) * 7 | 0; + $177 = $labelInfo + 1310736 + ($175 + -7 << 2) | 0; + HEAP32[$177 >> 2] = (HEAP32[$177 >> 2] | 0) + 1; + $181 = $labelInfo + 1310736 + ($175 + -6 << 2) | 0; + HEAP32[$181 >> 2] = (HEAP32[$181 >> 2] | 0) + $i$255; + $185 = $labelInfo + 1310736 + ($175 + -5 << 2) | 0; + HEAP32[$185 >> 2] = (HEAP32[$185 >> 2] | 0) + $j$068; + $189 = $labelInfo + 1310736 + ($175 + -3 << 2) | 0; + if ((HEAP32[$189 >> 2] | 0) >= ($i$255 | 0)) { + $wk_max$2 = $wk_max$157; + break; + } + HEAP32[$189 >> 2] = $i$255; + $wk_max$2 = $wk_max$157; + break; + } else { + $192 = $wk_max$157 + 1 | 0; + if (($wk_max$157 | 0) > 32767) break L13; + HEAP16[$pnt2$362 >> 1] = $192; + HEAP32[$labelInfo + 1179664 + ($wk_max$157 << 2) >> 2] = $192 << 16 >> 16; + $197 = $wk_max$157 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($197 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($197 + 1 << 2) >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($197 + 2 << 2) >> 2] = $j$068; + HEAP32[$labelInfo + 1310736 + ($197 + 3 << 2) >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($197 + 4 << 2) >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($197 + 5 << 2) >> 2] = $j$068; + HEAP32[$labelInfo + 1310736 + ($197 + 6 << 2) >> 2] = $j$068; + $wk_max$2 = $192; + break; + } + } + if ($52) { + $55 = HEAP32[$labelInfo + 1179664 + ($47 + -1 << 2) >> 2] | 0; + $58 = HEAP32[$labelInfo + 1179664 + ($51 + -1 << 2) >> 2] | 0; + if (($55 | 0) > ($58 | 0)) { + HEAP16[$pnt2$362 >> 1] = $58; + if (($wk_max$157 | 0) > 0) { + $k$051 = 0; + $wk$052 = $16; + while (1) { + if ((HEAP32[$wk$052 >> 2] | 0) == ($55 | 0)) HEAP32[$wk$052 >> 2] = $58; + $k$051 = $k$051 + 1 | 0; + if (($k$051 | 0) >= ($wk_max$157 | 0)) { + $75 = $58; + break; + } else $wk$052 = $wk$052 + 4 | 0; + } + } else $75 = $58; + } else { + HEAP16[$pnt2$362 >> 1] = $55; + if (($55 | 0) < ($58 | 0) & ($wk_max$157 | 0) > 0) { + $k$148 = 0; + $wk$149 = $16; + while (1) { + if ((HEAP32[$wk$149 >> 2] | 0) == ($58 | 0)) HEAP32[$wk$149 >> 2] = $55; + $k$148 = $k$148 + 1 | 0; + if (($k$148 | 0) >= ($wk_max$157 | 0)) { + $75 = $55; + break; + } else $wk$149 = $wk$149 + 4 | 0; + } + } else $75 = $55; + } + $77 = ($75 << 16 >> 16) * 7 | 0; + $79 = $labelInfo + 1310736 + ($77 + -7 << 2) | 0; + HEAP32[$79 >> 2] = (HEAP32[$79 >> 2] | 0) + 1; + $83 = $labelInfo + 1310736 + ($77 + -6 << 2) | 0; + HEAP32[$83 >> 2] = (HEAP32[$83 >> 2] | 0) + $i$255; + $87 = $labelInfo + 1310736 + ($77 + -5 << 2) | 0; + HEAP32[$87 >> 2] = (HEAP32[$87 >> 2] | 0) + $j$068; + HEAP32[$labelInfo + 1310736 + ($77 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $93 = HEAP16[$pnt2$362 + -2 >> 1] | 0; + if ($93 << 16 >> 16 <= 0) { + HEAP16[$pnt2$362 >> 1] = $46; + $133 = $47 * 7 | 0; + $135 = $labelInfo + 1310736 + ($133 + -7 << 2) | 0; + HEAP32[$135 >> 2] = (HEAP32[$135 >> 2] | 0) + 1; + $139 = $labelInfo + 1310736 + ($133 + -6 << 2) | 0; + HEAP32[$139 >> 2] = (HEAP32[$139 >> 2] | 0) + $i$255; + $143 = $labelInfo + 1310736 + ($133 + -5 << 2) | 0; + HEAP32[$143 >> 2] = (HEAP32[$143 >> 2] | 0) + $j$068; + $147 = $labelInfo + 1310736 + ($133 + -4 << 2) | 0; + if ((HEAP32[$147 >> 2] | 0) > ($i$255 | 0)) HEAP32[$147 >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($133 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $98 = HEAP32[$labelInfo + 1179664 + ($47 + -1 << 2) >> 2] | 0; + $101 = HEAP32[$labelInfo + 1179664 + (($93 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($98 | 0) > ($101 | 0)) { + HEAP16[$pnt2$362 >> 1] = $101; + if (($wk_max$157 | 0) > 0) { + $k$244 = 0; + $wk$245 = $16; + while (1) { + if ((HEAP32[$wk$245 >> 2] | 0) == ($98 | 0)) HEAP32[$wk$245 >> 2] = $101; + $k$244 = $k$244 + 1 | 0; + if (($k$244 | 0) >= ($wk_max$157 | 0)) { + $118 = $101; + break; + } else $wk$245 = $wk$245 + 4 | 0; + } + } else $118 = $101; + } else { + HEAP16[$pnt2$362 >> 1] = $98; + if (($98 | 0) < ($101 | 0) & ($wk_max$157 | 0) > 0) { + $k$341 = 0; + $wk$342 = $16; + while (1) { + if ((HEAP32[$wk$342 >> 2] | 0) == ($101 | 0)) HEAP32[$wk$342 >> 2] = $98; + $k$341 = $k$341 + 1 | 0; + if (($k$341 | 0) >= ($wk_max$157 | 0)) { + $118 = $98; + break; + } else $wk$342 = $wk$342 + 4 | 0; + } + } else $118 = $98; + } + $120 = ($118 << 16 >> 16) * 7 | 0; + $122 = $labelInfo + 1310736 + ($120 + -7 << 2) | 0; + HEAP32[$122 >> 2] = (HEAP32[$122 >> 2] | 0) + 1; + $126 = $labelInfo + 1310736 + ($120 + -6 << 2) | 0; + HEAP32[$126 >> 2] = (HEAP32[$126 >> 2] | 0) + $i$255; + $130 = $labelInfo + 1310736 + ($120 + -5 << 2) | 0; + HEAP32[$130 >> 2] = (HEAP32[$130 >> 2] | 0) + $j$068; + $wk_max$2 = $wk_max$157; + } else { + HEAP16[$pnt2$362 >> 1] = 0; + $wk_max$2 = $wk_max$157; + } while (0); + $i$255 = $i$255 + 1 | 0; + $212 = $pnt$163 + 1 | 0; + $213 = $pnt2$362 + 2 | 0; + if (($i$255 | 0) >= ($9 | 0)) { + $pnt$1$lcssa = $212; + $pnt2$3$lcssa = $213; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $pnt$163 = $212; + $pnt2$362 = $213; + $wk_max$157 = $wk_max$2; + } + } + } else { + $pnt$1$lcssa = $pnt$072; + $pnt2$3$lcssa = $pnt2$271; + $wk_max$1$lcssa = $wk_max$070; + } + $j$068 = $j$068 + 1 | 0; + if (($j$068 | 0) >= ($1 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $pnt$072 = $pnt$1$lcssa + 2 | 0; + $pnt2$271 = $pnt2$3$lcssa + 4 | 0; + $wk_max$070 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $219 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$337 = 1; + $j$138 = 1; + $wk$439 = $16; + while (1) { + $221 = HEAP32[$wk$439 >> 2] | 0; + if (($221 | 0) == ($i$337 | 0)) { + $227 = $j$138; + $j$2 = $j$138 + 1 | 0; + } else { + $227 = HEAP32[$labelInfo + 1179664 + ($221 + -1 << 2) >> 2] | 0; + $j$2 = $j$138; + } + HEAP32[$wk$439 >> 2] = $227; + if (($i$337 | 0) < ($wk_max$0$lcssa | 0)) { + $i$337 = $i$337 + 1 | 0; + $j$138 = $j$2; + $wk$439 = $wk$439 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $231 = $labelInfo + 8 | 0; + $232 = $j$1$lcssa + -1 | 0; + HEAP32[$231 >> 2] = $232; + if (!$232) $$0 = 0; else { + _memset($219 | 0, 0, $232 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $232 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$435 = 0; + do { + $239 = $i$435 << 2; + HEAP32[$labelInfo + 131084 + ($239 << 2) >> 2] = $xsize; + HEAP32[$labelInfo + 131084 + (($239 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($239 | 2) << 2) >> 2] = $ysize; + HEAP32[$labelInfo + 131084 + (($239 | 3) << 2) >> 2] = 0; + $i$435 = $i$435 + 1 | 0; + } while (($i$435 | 0) < (HEAP32[$231 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$533 = 0; + do { + $253 = (HEAP32[$labelInfo + 1179664 + ($i$533 << 2) >> 2] | 0) + -1 | 0; + $254 = $i$533 * 7 | 0; + $257 = $labelInfo + 12 + ($253 << 2) | 0; + HEAP32[$257 >> 2] = (HEAP32[$257 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($254 << 2) >> 2] | 0); + $264 = $253 << 1; + $265 = $labelInfo + 655376 + ($264 << 3) | 0; + HEAPF64[$265 >> 3] = +HEAPF64[$265 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($254 + 1 << 2) >> 2] | 0); + $273 = $labelInfo + 655376 + (($264 | 1) << 3) | 0; + HEAPF64[$273 >> 3] = +HEAPF64[$273 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($254 + 2 << 2) >> 2] | 0); + $276 = $253 << 2; + $277 = $labelInfo + 131084 + ($276 << 2) | 0; + $281 = HEAP32[$labelInfo + 1310736 + ($254 + 3 << 2) >> 2] | 0; + if ((HEAP32[$277 >> 2] | 0) > ($281 | 0)) HEAP32[$277 >> 2] = $281; + $284 = $labelInfo + 131084 + (($276 | 1) << 2) | 0; + $288 = HEAP32[$labelInfo + 1310736 + ($254 + 4 << 2) >> 2] | 0; + if ((HEAP32[$284 >> 2] | 0) < ($288 | 0)) HEAP32[$284 >> 2] = $288; + $291 = $labelInfo + 131084 + (($276 | 2) << 2) | 0; + $295 = HEAP32[$labelInfo + 1310736 + ($254 + 5 << 2) >> 2] | 0; + if ((HEAP32[$291 >> 2] | 0) > ($295 | 0)) HEAP32[$291 >> 2] = $295; + $298 = $labelInfo + 131084 + (($276 | 3) << 2) | 0; + $302 = HEAP32[$labelInfo + 1310736 + ($254 + 6 << 2) >> 2] | 0; + if ((HEAP32[$298 >> 2] | 0) < ($302 | 0)) HEAP32[$298 >> 2] = $302; + $i$533 = $i$533 + 1 | 0; + } while (($i$533 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$231 >> 2] | 0) > 0) { + $i$632 = 0; + do { + $306 = $labelInfo + 12 + ($i$632 << 2) | 0; + $309 = $i$632 << 1; + $310 = $labelInfo + 655376 + ($309 << 3) | 0; + HEAPF64[$310 >> 3] = +HEAPF64[$310 >> 3] / +(HEAP32[$306 >> 2] | 0); + $316 = $labelInfo + 655376 + (($309 | 1) << 3) | 0; + HEAPF64[$316 >> 3] = +HEAPF64[$316 >> 3] / +(HEAP32[$306 >> 2] | 0); + $i$632 = $i$632 + 1 | 0; + } while (($i$632 | 0) < (HEAP32[$231 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arLabelingSubDBRC($image, $xsize, $ysize, $labelingThresh, $labelInfo) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelingThresh = $labelingThresh | 0; + $labelInfo = $labelInfo | 0; + var $$0 = 0, $$sum = 0, $$sum1 = 0, $0 = 0, $1 = 0, $101 = 0, $118 = 0, $120 = 0, $122 = 0, $126 = 0, $130 = 0, $133 = 0, $135 = 0, $139 = 0, $143 = 0, $147 = 0, $152 = 0, $154 = 0, $158 = 0, $16 = 0, $162 = 0, $166 = 0, $17 = 0, $172 = 0, $175 = 0, $177 = 0, $18 = 0, $181 = 0, $185 = 0, $189 = 0, $192 = 0, $197 = 0, $212 = 0, $213 = 0, $219 = 0, $22 = 0, $221 = 0, $227 = 0, $231 = 0, $232 = 0, $239 = 0, $253 = 0, $254 = 0, $257 = 0, $264 = 0, $265 = 0, $27 = 0, $273 = 0, $276 = 0, $277 = 0, $281 = 0, $284 = 0, $288 = 0, $291 = 0, $295 = 0, $298 = 0, $30 = 0, $302 = 0, $306 = 0, $309 = 0, $310 = 0, $316 = 0, $32 = 0, $36 = 0, $40 = 0, $46 = 0, $47 = 0, $50 = 0, $51 = 0, $52 = 0, $55 = 0, $58 = 0, $75 = 0, $77 = 0, $79 = 0, $83 = 0, $87 = 0, $9 = 0, $93 = 0, $98 = 0, $i$081 = 0, $i$175 = 0, $i$255 = 0, $i$337 = 0, $i$435 = 0, $i$533 = 0, $i$632 = 0, $j$068 = 0, $j$1$lcssa = 0, $j$138 = 0, $j$2 = 0, $k$051 = 0, $k$148 = 0, $k$244 = 0, $k$341 = 0, $pnt$072 = 0, $pnt$1$lcssa = 0, $pnt$163 = 0, $pnt1$083 = 0, $pnt1$177 = 0, $pnt2$082 = 0, $pnt2$176 = 0, $pnt2$271 = 0, $pnt2$3$lcssa = 0, $pnt2$362 = 0, $vararg_buffer = 0, $wk$052 = 0, $wk$149 = 0, $wk$245 = 0, $wk$342 = 0, $wk$439 = 0, $wk_max$0$lcssa = 0, $wk_max$070 = 0, $wk_max$1$lcssa = 0, $wk_max$157 = 0, $wk_max$2 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = HEAP32[$labelInfo >> 2] | 0; + $1 = $ysize + -1 | 0; + if (($xsize | 0) > 0) { + $i$081 = 0; + $pnt1$083 = $0; + $pnt2$082 = $0 + ((Math_imul($1, $xsize) | 0) << 1) | 0; + while (1) { + HEAP16[$pnt2$082 >> 1] = 0; + HEAP16[$pnt1$083 >> 1] = 0; + $i$081 = $i$081 + 1 | 0; + if (($i$081 | 0) >= ($xsize | 0)) break; else { + $pnt1$083 = $pnt1$083 + 2 | 0; + $pnt2$082 = $pnt2$082 + 2 | 0; + } + } + } + $9 = $xsize + -1 | 0; + if (($ysize | 0) > 0) { + $i$175 = 0; + $pnt1$177 = $0; + $pnt2$176 = $0 + ($9 << 1) | 0; + while (1) { + HEAP16[$pnt2$176 >> 1] = 0; + HEAP16[$pnt1$177 >> 1] = 0; + $i$175 = $i$175 + 1 | 0; + if (($i$175 | 0) >= ($ysize | 0)) break; else { + $pnt1$177 = $pnt1$177 + ($xsize << 1) | 0; + $pnt2$176 = $pnt2$176 + ($xsize << 1) | 0; + } + } + } + $16 = $labelInfo + 1179664 | 0; + $17 = $xsize + 1 | 0; + $18 = 0 - $xsize | 0; + $$sum = 1 - $xsize | 0; + $$sum1 = ~$xsize; + L11 : do if (($1 | 0) > 1) { + $22 = ($9 | 0) > 1; + $j$068 = 1; + $pnt$072 = $image + $17 | 0; + $pnt2$271 = $0 + ($17 << 1) | 0; + $wk_max$070 = 0; + L13 : while (1) { + if ($22) { + $i$255 = 1; + $pnt$163 = $pnt$072; + $pnt2$362 = $pnt2$271; + $wk_max$157 = $wk_max$070; + while (1) { + do if ((HEAPU8[$pnt$163 >> 0] | 0 | 0) > ($labelingThresh | 0)) { + HEAP16[$pnt2$362 >> 1] = 0; + $wk_max$2 = $wk_max$157; + } else { + $27 = HEAP16[$pnt2$362 + ($18 << 1) >> 1] | 0; + if ($27 << 16 >> 16 > 0) { + HEAP16[$pnt2$362 >> 1] = $27; + $30 = ($27 << 16 >> 16) * 7 | 0; + $32 = $labelInfo + 1310736 + ($30 + -7 << 2) | 0; + HEAP32[$32 >> 2] = (HEAP32[$32 >> 2] | 0) + 1; + $36 = $labelInfo + 1310736 + ($30 + -6 << 2) | 0; + HEAP32[$36 >> 2] = (HEAP32[$36 >> 2] | 0) + $i$255; + $40 = $labelInfo + 1310736 + ($30 + -5 << 2) | 0; + HEAP32[$40 >> 2] = (HEAP32[$40 >> 2] | 0) + $j$068; + HEAP32[$labelInfo + 1310736 + ($30 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $46 = HEAP16[$pnt2$362 + ($$sum << 1) >> 1] | 0; + $47 = $46 << 16 >> 16; + $50 = HEAP16[$pnt2$362 + ($$sum1 << 1) >> 1] | 0; + $51 = $50 << 16 >> 16; + $52 = $50 << 16 >> 16 > 0; + if ($46 << 16 >> 16 <= 0) { + if ($52) { + HEAP16[$pnt2$362 >> 1] = $50; + $152 = $51 * 7 | 0; + $154 = $labelInfo + 1310736 + ($152 + -7 << 2) | 0; + HEAP32[$154 >> 2] = (HEAP32[$154 >> 2] | 0) + 1; + $158 = $labelInfo + 1310736 + ($152 + -6 << 2) | 0; + HEAP32[$158 >> 2] = (HEAP32[$158 >> 2] | 0) + $i$255; + $162 = $labelInfo + 1310736 + ($152 + -5 << 2) | 0; + HEAP32[$162 >> 2] = (HEAP32[$162 >> 2] | 0) + $j$068; + $166 = $labelInfo + 1310736 + ($152 + -3 << 2) | 0; + if ((HEAP32[$166 >> 2] | 0) < ($i$255 | 0)) HEAP32[$166 >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($152 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $172 = HEAP16[$pnt2$362 + -2 >> 1] | 0; + if ($172 << 16 >> 16 > 0) { + HEAP16[$pnt2$362 >> 1] = $172; + $175 = ($172 << 16 >> 16) * 7 | 0; + $177 = $labelInfo + 1310736 + ($175 + -7 << 2) | 0; + HEAP32[$177 >> 2] = (HEAP32[$177 >> 2] | 0) + 1; + $181 = $labelInfo + 1310736 + ($175 + -6 << 2) | 0; + HEAP32[$181 >> 2] = (HEAP32[$181 >> 2] | 0) + $i$255; + $185 = $labelInfo + 1310736 + ($175 + -5 << 2) | 0; + HEAP32[$185 >> 2] = (HEAP32[$185 >> 2] | 0) + $j$068; + $189 = $labelInfo + 1310736 + ($175 + -3 << 2) | 0; + if ((HEAP32[$189 >> 2] | 0) >= ($i$255 | 0)) { + $wk_max$2 = $wk_max$157; + break; + } + HEAP32[$189 >> 2] = $i$255; + $wk_max$2 = $wk_max$157; + break; + } else { + $192 = $wk_max$157 + 1 | 0; + if (($wk_max$157 | 0) > 32767) break L13; + HEAP16[$pnt2$362 >> 1] = $192; + HEAP32[$labelInfo + 1179664 + ($wk_max$157 << 2) >> 2] = $192 << 16 >> 16; + $197 = $wk_max$157 * 7 | 0; + HEAP32[$labelInfo + 1310736 + ($197 << 2) >> 2] = 1; + HEAP32[$labelInfo + 1310736 + ($197 + 1 << 2) >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($197 + 2 << 2) >> 2] = $j$068; + HEAP32[$labelInfo + 1310736 + ($197 + 3 << 2) >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($197 + 4 << 2) >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($197 + 5 << 2) >> 2] = $j$068; + HEAP32[$labelInfo + 1310736 + ($197 + 6 << 2) >> 2] = $j$068; + $wk_max$2 = $192; + break; + } + } + if ($52) { + $55 = HEAP32[$labelInfo + 1179664 + ($47 + -1 << 2) >> 2] | 0; + $58 = HEAP32[$labelInfo + 1179664 + ($51 + -1 << 2) >> 2] | 0; + if (($55 | 0) > ($58 | 0)) { + HEAP16[$pnt2$362 >> 1] = $58; + if (($wk_max$157 | 0) > 0) { + $k$051 = 0; + $wk$052 = $16; + while (1) { + if ((HEAP32[$wk$052 >> 2] | 0) == ($55 | 0)) HEAP32[$wk$052 >> 2] = $58; + $k$051 = $k$051 + 1 | 0; + if (($k$051 | 0) >= ($wk_max$157 | 0)) { + $75 = $58; + break; + } else $wk$052 = $wk$052 + 4 | 0; + } + } else $75 = $58; + } else { + HEAP16[$pnt2$362 >> 1] = $55; + if (($55 | 0) < ($58 | 0) & ($wk_max$157 | 0) > 0) { + $k$148 = 0; + $wk$149 = $16; + while (1) { + if ((HEAP32[$wk$149 >> 2] | 0) == ($58 | 0)) HEAP32[$wk$149 >> 2] = $55; + $k$148 = $k$148 + 1 | 0; + if (($k$148 | 0) >= ($wk_max$157 | 0)) { + $75 = $55; + break; + } else $wk$149 = $wk$149 + 4 | 0; + } + } else $75 = $55; + } + $77 = ($75 << 16 >> 16) * 7 | 0; + $79 = $labelInfo + 1310736 + ($77 + -7 << 2) | 0; + HEAP32[$79 >> 2] = (HEAP32[$79 >> 2] | 0) + 1; + $83 = $labelInfo + 1310736 + ($77 + -6 << 2) | 0; + HEAP32[$83 >> 2] = (HEAP32[$83 >> 2] | 0) + $i$255; + $87 = $labelInfo + 1310736 + ($77 + -5 << 2) | 0; + HEAP32[$87 >> 2] = (HEAP32[$87 >> 2] | 0) + $j$068; + HEAP32[$labelInfo + 1310736 + ($77 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $93 = HEAP16[$pnt2$362 + -2 >> 1] | 0; + if ($93 << 16 >> 16 <= 0) { + HEAP16[$pnt2$362 >> 1] = $46; + $133 = $47 * 7 | 0; + $135 = $labelInfo + 1310736 + ($133 + -7 << 2) | 0; + HEAP32[$135 >> 2] = (HEAP32[$135 >> 2] | 0) + 1; + $139 = $labelInfo + 1310736 + ($133 + -6 << 2) | 0; + HEAP32[$139 >> 2] = (HEAP32[$139 >> 2] | 0) + $i$255; + $143 = $labelInfo + 1310736 + ($133 + -5 << 2) | 0; + HEAP32[$143 >> 2] = (HEAP32[$143 >> 2] | 0) + $j$068; + $147 = $labelInfo + 1310736 + ($133 + -4 << 2) | 0; + if ((HEAP32[$147 >> 2] | 0) > ($i$255 | 0)) HEAP32[$147 >> 2] = $i$255; + HEAP32[$labelInfo + 1310736 + ($133 + -1 << 2) >> 2] = $j$068; + $wk_max$2 = $wk_max$157; + break; + } + $98 = HEAP32[$labelInfo + 1179664 + ($47 + -1 << 2) >> 2] | 0; + $101 = HEAP32[$labelInfo + 1179664 + (($93 << 16 >> 16) + -1 << 2) >> 2] | 0; + if (($98 | 0) > ($101 | 0)) { + HEAP16[$pnt2$362 >> 1] = $101; + if (($wk_max$157 | 0) > 0) { + $k$244 = 0; + $wk$245 = $16; + while (1) { + if ((HEAP32[$wk$245 >> 2] | 0) == ($98 | 0)) HEAP32[$wk$245 >> 2] = $101; + $k$244 = $k$244 + 1 | 0; + if (($k$244 | 0) >= ($wk_max$157 | 0)) { + $118 = $101; + break; + } else $wk$245 = $wk$245 + 4 | 0; + } + } else $118 = $101; + } else { + HEAP16[$pnt2$362 >> 1] = $98; + if (($98 | 0) < ($101 | 0) & ($wk_max$157 | 0) > 0) { + $k$341 = 0; + $wk$342 = $16; + while (1) { + if ((HEAP32[$wk$342 >> 2] | 0) == ($101 | 0)) HEAP32[$wk$342 >> 2] = $98; + $k$341 = $k$341 + 1 | 0; + if (($k$341 | 0) >= ($wk_max$157 | 0)) { + $118 = $98; + break; + } else $wk$342 = $wk$342 + 4 | 0; + } + } else $118 = $98; + } + $120 = ($118 << 16 >> 16) * 7 | 0; + $122 = $labelInfo + 1310736 + ($120 + -7 << 2) | 0; + HEAP32[$122 >> 2] = (HEAP32[$122 >> 2] | 0) + 1; + $126 = $labelInfo + 1310736 + ($120 + -6 << 2) | 0; + HEAP32[$126 >> 2] = (HEAP32[$126 >> 2] | 0) + $i$255; + $130 = $labelInfo + 1310736 + ($120 + -5 << 2) | 0; + HEAP32[$130 >> 2] = (HEAP32[$130 >> 2] | 0) + $j$068; + $wk_max$2 = $wk_max$157; + } while (0); + $i$255 = $i$255 + 1 | 0; + $212 = $pnt$163 + 1 | 0; + $213 = $pnt2$362 + 2 | 0; + if (($i$255 | 0) >= ($9 | 0)) { + $pnt$1$lcssa = $212; + $pnt2$3$lcssa = $213; + $wk_max$1$lcssa = $wk_max$2; + break; + } else { + $pnt$163 = $212; + $pnt2$362 = $213; + $wk_max$157 = $wk_max$2; + } + } + } else { + $pnt$1$lcssa = $pnt$072; + $pnt2$3$lcssa = $pnt2$271; + $wk_max$1$lcssa = $wk_max$070; + } + $j$068 = $j$068 + 1 | 0; + if (($j$068 | 0) >= ($1 | 0)) { + $wk_max$0$lcssa = $wk_max$1$lcssa; + label = 52; + break L11; + } else { + $pnt$072 = $pnt$1$lcssa + 2 | 0; + $pnt2$271 = $pnt2$3$lcssa + 4 | 0; + $wk_max$070 = $wk_max$1$lcssa; + } + } + _arLog(3, 3904, $vararg_buffer); + $$0 = -1; + } else { + $wk_max$0$lcssa = 0; + label = 52; + } while (0); + if ((label | 0) == 52) { + $219 = $labelInfo + 12 | 0; + if (($wk_max$0$lcssa | 0) < 1) $j$1$lcssa = 1; else { + $i$337 = 1; + $j$138 = 1; + $wk$439 = $16; + while (1) { + $221 = HEAP32[$wk$439 >> 2] | 0; + if (($221 | 0) == ($i$337 | 0)) { + $227 = $j$138; + $j$2 = $j$138 + 1 | 0; + } else { + $227 = HEAP32[$labelInfo + 1179664 + ($221 + -1 << 2) >> 2] | 0; + $j$2 = $j$138; + } + HEAP32[$wk$439 >> 2] = $227; + if (($i$337 | 0) < ($wk_max$0$lcssa | 0)) { + $i$337 = $i$337 + 1 | 0; + $j$138 = $j$2; + $wk$439 = $wk$439 + 4 | 0; + } else { + $j$1$lcssa = $j$2; + break; + } + } + } + $231 = $labelInfo + 8 | 0; + $232 = $j$1$lcssa + -1 | 0; + HEAP32[$231 >> 2] = $232; + if (!$232) $$0 = 0; else { + _memset($219 | 0, 0, $232 << 2 | 0) | 0; + _memset($labelInfo + 655376 | 0, 0, $232 << 4 | 0) | 0; + if (($j$1$lcssa | 0) > 1) { + $i$435 = 0; + do { + $239 = $i$435 << 2; + HEAP32[$labelInfo + 131084 + ($239 << 2) >> 2] = $xsize; + HEAP32[$labelInfo + 131084 + (($239 | 1) << 2) >> 2] = 0; + HEAP32[$labelInfo + 131084 + (($239 | 2) << 2) >> 2] = $ysize; + HEAP32[$labelInfo + 131084 + (($239 | 3) << 2) >> 2] = 0; + $i$435 = $i$435 + 1 | 0; + } while (($i$435 | 0) < (HEAP32[$231 >> 2] | 0)); + } + if (($wk_max$0$lcssa | 0) > 0) { + $i$533 = 0; + do { + $253 = (HEAP32[$labelInfo + 1179664 + ($i$533 << 2) >> 2] | 0) + -1 | 0; + $254 = $i$533 * 7 | 0; + $257 = $labelInfo + 12 + ($253 << 2) | 0; + HEAP32[$257 >> 2] = (HEAP32[$257 >> 2] | 0) + (HEAP32[$labelInfo + 1310736 + ($254 << 2) >> 2] | 0); + $264 = $253 << 1; + $265 = $labelInfo + 655376 + ($264 << 3) | 0; + HEAPF64[$265 >> 3] = +HEAPF64[$265 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($254 + 1 << 2) >> 2] | 0); + $273 = $labelInfo + 655376 + (($264 | 1) << 3) | 0; + HEAPF64[$273 >> 3] = +HEAPF64[$273 >> 3] + +(HEAP32[$labelInfo + 1310736 + ($254 + 2 << 2) >> 2] | 0); + $276 = $253 << 2; + $277 = $labelInfo + 131084 + ($276 << 2) | 0; + $281 = HEAP32[$labelInfo + 1310736 + ($254 + 3 << 2) >> 2] | 0; + if ((HEAP32[$277 >> 2] | 0) > ($281 | 0)) HEAP32[$277 >> 2] = $281; + $284 = $labelInfo + 131084 + (($276 | 1) << 2) | 0; + $288 = HEAP32[$labelInfo + 1310736 + ($254 + 4 << 2) >> 2] | 0; + if ((HEAP32[$284 >> 2] | 0) < ($288 | 0)) HEAP32[$284 >> 2] = $288; + $291 = $labelInfo + 131084 + (($276 | 2) << 2) | 0; + $295 = HEAP32[$labelInfo + 1310736 + ($254 + 5 << 2) >> 2] | 0; + if ((HEAP32[$291 >> 2] | 0) > ($295 | 0)) HEAP32[$291 >> 2] = $295; + $298 = $labelInfo + 131084 + (($276 | 3) << 2) | 0; + $302 = HEAP32[$labelInfo + 1310736 + ($254 + 6 << 2) >> 2] | 0; + if ((HEAP32[$298 >> 2] | 0) < ($302 | 0)) HEAP32[$298 >> 2] = $302; + $i$533 = $i$533 + 1 | 0; + } while (($i$533 | 0) < ($wk_max$0$lcssa | 0)); + } + if ((HEAP32[$231 >> 2] | 0) > 0) { + $i$632 = 0; + do { + $306 = $labelInfo + 12 + ($i$632 << 2) | 0; + $309 = $i$632 << 1; + $310 = $labelInfo + 655376 + ($309 << 3) | 0; + HEAPF64[$310 >> 3] = +HEAPF64[$310 >> 3] / +(HEAP32[$306 >> 2] | 0); + $316 = $labelInfo + 655376 + (($309 | 1) << 3) | 0; + HEAPF64[$316 >> 3] = +HEAPF64[$316 >> 3] / +(HEAP32[$306 >> 2] | 0); + $i$632 = $i$632 + 1 | 0; + } while (($i$632 | 0) < (HEAP32[$231 >> 2] | 0)); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function __ZN10__cxxabiv112_GLOBAL__N_119parse_template_argsINS0_2DbEEEPKcS4_S4_RT_($first, $last, $db) { + $first = $first | 0; + $last = $last | 0; + $db = $db | 0; + var $$0$i$i$i = 0, $$0$i$i$i10 = 0, $$0$i$i$i21 = 0, $$0$i$i$i7 = 0, $$1 = 0, $$lcssa = 0, $$lcssa152 = 0, $$pre = 0, $0 = 0, $1 = 0, $100 = 0, $102 = 0, $112 = 0, $113 = 0, $114 = 0, $115 = 0, $118 = 0, $12 = 0, $121 = 0, $124 = 0, $132 = 0, $133 = 0, $134 = 0, $135 = 0, $136 = 0, $137 = 0, $14 = 0, $149 = 0, $15 = 0, $150 = 0, $151 = 0, $154 = 0, $157 = 0, $16 = 0, $164 = 0, $174 = 0, $176 = 0, $18 = 0, $185 = 0, $186 = 0, $187 = 0, $188 = 0, $19 = 0, $192 = 0, $193 = 0, $195 = 0, $2 = 0, $209 = 0, $211 = 0, $218 = 0, $219 = 0, $22 = 0, $220 = 0, $221 = 0, $225 = 0, $227 = 0, $23 = 0, $230 = 0, $231 = 0, $24 = 0, $25 = 0, $26 = 0, $27 = 0, $28 = 0, $29 = 0, $30 = 0, $31 = 0, $32 = 0, $33 = 0, $34 = 0, $38 = 0, $43 = 0, $44 = 0, $45 = 0, $54 = 0, $55 = 0, $56 = 0, $57 = 0, $60 = 0, $63 = 0, $66 = 0, $76 = 0, $82 = 0, $85 = 0, $86 = 0, $87 = 0, $88 = 0, $9 = 0, $95 = 0, $96 = 0, $98 = 0, $99 = 0, $__v$i$i20 = 0, $args = 0, $k$0121 = 0, $k1$0124 = 0, $k2$0123 = 0, $t$0$lcssa = 0, $t$0126 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 96 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $__v$i$i20 = sp + 64 | 0; + $args = sp + 52 | 0; + $0 = sp + 40 | 0; + $1 = sp + 16 | 0; + $2 = sp; + L1 : do if (($last - $first | 0) > 1) if ((HEAP8[$first >> 0] | 0) == 73) { + $9 = $db + 61 | 0; + $$pre = $db + 36 | 0; + if (HEAP8[$9 >> 0] | 0) { + $12 = HEAP32[$$pre >> 2] | 0; + $14 = HEAP32[$12 + -16 >> 2] | 0; + $15 = $12 + -12 | 0; + $16 = HEAP32[$15 >> 2] | 0; + if (($16 | 0) != ($14 | 0)) { + $19 = $16; + do { + $18 = $19 + -16 | 0; + HEAP32[$15 >> 2] = $18; + __ZNSt3__113__vector_baseIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEED2Ev($18); + $19 = HEAP32[$15 >> 2] | 0; + } while (($19 | 0) != ($14 | 0)); + } + } + $22 = $first + 1 | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($args, 12776, 1); + $23 = $db + 4 | 0; + $24 = $db + 12 | 0; + $25 = $__v$i$i20 + 8 | 0; + $26 = $__v$i$i20 + 8 | 0; + $27 = $args + 4 | 0; + $28 = $0 + 8 | 0; + $29 = $0 + 1 | 0; + $30 = $0 + 4 | 0; + $31 = $db + 32 | 0; + $32 = $db + 40 | 0; + $33 = $db + 44 | 0; + $34 = $__v$i$i20 + 8 | 0; + L9 : do if ((HEAP8[$22 >> 0] | 0) == 69) $t$0$lcssa = $22; else { + $t$0126 = $22; + L10 : while (1) { + do if (HEAP8[$9 >> 0] | 0) { + $43 = HEAP32[$24 >> 2] | 0; + $44 = HEAP32[$$pre >> 2] | 0; + $45 = HEAP32[$32 >> 2] | 0; + if ($44 >>> 0 < $45 >>> 0) { + HEAP32[$44 >> 2] = 0; + HEAP32[$44 + 4 >> 2] = 0; + HEAP32[$44 + 8 >> 2] = 0; + HEAP32[$44 + 12 >> 2] = $43; + HEAP32[$$pre >> 2] = (HEAP32[$$pre >> 2] | 0) + 16; + break; + } + $54 = HEAP32[$31 >> 2] | 0; + $55 = $44 - $54 | 0; + $56 = $55 >> 4; + $57 = $56 + 1 | 0; + if (($55 | 0) < -16) { + label = 12; + break L10; + } + $60 = $45 - $54 | 0; + if ($60 >> 4 >>> 0 < 1073741823) { + $63 = $60 >> 3; + $$0$i$i$i = $63 >>> 0 < $57 >>> 0 ? $57 : $63; + } else $$0$i$i$i = 2147483647; + __ZNSt3__114__split_bufferINS_6vectorINS1_IN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEENS5_IS7_Lj4096EEEEERNS5_IS9_Lj4096EEEEC2EjjSB_($__v$i$i20, $$0$i$i$i, $56, $33); + $66 = HEAP32[$34 >> 2] | 0; + HEAP32[$66 >> 2] = 0; + HEAP32[$66 + 4 >> 2] = 0; + HEAP32[$66 + 8 >> 2] = 0; + HEAP32[$66 + 12 >> 2] = $43; + HEAP32[$34 >> 2] = $66 + 16; + __ZNSt3__16vectorINS0_INS0_IN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEEENS4_IS6_Lj4096EEEEENS4_IS8_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS8_RS9_EE($31, $__v$i$i20); + __ZNSt3__114__split_bufferINS_6vectorINS1_IN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEENS5_IS7_Lj4096EEEEERNS5_IS9_Lj4096EEEED2Ev($__v$i$i20); + } while (0); + $76 = ((HEAP32[$23 >> 2] | 0) - (HEAP32[$db >> 2] | 0) | 0) / 24 | 0; + $38 = __ZN10__cxxabiv112_GLOBAL__N_118parse_template_argINS0_2DbEEEPKcS4_S4_RT_($t$0126, $last, $db) | 0; + $82 = ((HEAP32[$23 >> 2] | 0) - (HEAP32[$db >> 2] | 0) | 0) / 24 | 0; + if (HEAP8[$9 >> 0] | 0) { + $85 = HEAP32[$$pre >> 2] | 0; + $86 = $85 + -16 | 0; + $88 = $85; + do { + $87 = $88 + -16 | 0; + HEAP32[$$pre >> 2] = $87; + __ZNSt3__113__vector_baseINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEENS5_IS7_Lj4096EEEED2Ev($87); + $88 = HEAP32[$$pre >> 2] | 0; + } while (($88 | 0) != ($86 | 0)); + } + if (($38 | 0) == ($t$0126 | 0) | ($38 | 0) == ($last | 0)) { + label = 56; + break; + } + if (HEAP8[$9 >> 0] | 0) { + $95 = HEAP32[$$pre >> 2] | 0; + $96 = $95 + -16 | 0; + $98 = HEAP32[$24 >> 2] | 0; + $99 = $95 + -12 | 0; + $100 = HEAP32[$99 >> 2] | 0; + $102 = HEAP32[$95 + -8 >> 2] | 0; + if ($100 >>> 0 < $102 >>> 0) { + HEAP32[$100 >> 2] = 0; + HEAP32[$100 + 4 >> 2] = 0; + HEAP32[$100 + 8 >> 2] = 0; + HEAP32[$100 + 12 >> 2] = $98; + HEAP32[$99 >> 2] = (HEAP32[$99 >> 2] | 0) + 16; + } else { + $112 = HEAP32[$96 >> 2] | 0; + $113 = $100 - $112 | 0; + $114 = $113 >> 4; + $115 = $114 + 1 | 0; + if (($113 | 0) < -16) { + $$lcssa = $96; + label = 25; + break; + } + $118 = $102 - $112 | 0; + if ($118 >> 4 >>> 0 < 1073741823) { + $121 = $118 >> 3; + $$0$i$i$i7 = $121 >>> 0 < $115 >>> 0 ? $115 : $121; + } else $$0$i$i$i7 = 2147483647; + __ZNSt3__114__split_bufferINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEERNS5_IS7_Lj4096EEEEC2EjjS9_($__v$i$i20, $$0$i$i$i7, $114, $95 + -4 | 0); + $124 = HEAP32[$25 >> 2] | 0; + HEAP32[$124 >> 2] = 0; + HEAP32[$124 + 4 >> 2] = 0; + HEAP32[$124 + 8 >> 2] = 0; + HEAP32[$124 + 12 >> 2] = $98; + HEAP32[$25 >> 2] = $124 + 16; + __ZNSt3__16vectorINS0_IN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEEENS4_IS6_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS6_RS7_EE($96, $__v$i$i20); + __ZNSt3__114__split_bufferINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEERNS5_IS7_Lj4096EEEED2Ev($__v$i$i20); + } + if ($76 >>> 0 < $82 >>> 0) { + $k$0121 = $76; + do { + $132 = HEAP32[(HEAP32[$$pre >> 2] | 0) + -12 >> 2] | 0; + $133 = $132 + -16 | 0; + $134 = HEAP32[$db >> 2] | 0; + $135 = $134 + ($k$0121 * 24 | 0) | 0; + $136 = $132 + -12 | 0; + $137 = HEAP32[$136 >> 2] | 0; + if (($137 | 0) == (HEAP32[$132 + -8 >> 2] | 0)) { + $149 = $137 - (HEAP32[$133 >> 2] | 0) | 0; + $150 = ($149 | 0) / 24 | 0; + $151 = $150 + 1 | 0; + if (($149 | 0) < -24) { + $$lcssa152 = $133; + label = 33; + break L10; + } + if ($150 >>> 0 < 1073741823) { + $154 = $150 << 1; + $$0$i$i$i10 = $154 >>> 0 < $151 >>> 0 ? $151 : $154; + } else $$0$i$i$i10 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i20, $$0$i$i$i10, $150, $132 + -4 | 0); + $157 = HEAP32[$26 >> 2] | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEC2ERKS7_($157, $135); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEC2ERKS7_($157 + 12 | 0, $134 + ($k$0121 * 24 | 0) + 12 | 0); + HEAP32[$26 >> 2] = $157 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($133, $__v$i$i20); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i20); + } else { + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEC2ERKS7_($137, $135); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEC2ERKS7_($137 + 12 | 0, $134 + ($k$0121 * 24 | 0) + 12 | 0); + HEAP32[$136 >> 2] = (HEAP32[$136 >> 2] | 0) + 24; + } + $k$0121 = $k$0121 + 1 | 0; + } while ($k$0121 >>> 0 < $82 >>> 0); + } + } + if ($76 >>> 0 < $82 >>> 0) { + $k2$0123 = $76; + do { + $164 = HEAP8[$args >> 0] | 0; + if ((($164 & 1) == 0 ? ($164 & 255) >>> 1 : HEAP32[$27 >> 2] | 0) >>> 0 > 1) __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($args, 12716) | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($0, (HEAP32[$db >> 2] | 0) + ($k2$0123 * 24 | 0) | 0); + $174 = HEAP8[$0 >> 0] | 0; + $176 = ($174 & 1) == 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($args, $176 ? $29 : HEAP32[$28 >> 2] | 0, $176 ? ($174 & 255) >>> 1 : HEAP32[$30 >> 2] | 0) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($0); + $k2$0123 = $k2$0123 + 1 | 0; + } while ($k2$0123 >>> 0 < $82 >>> 0); + } + if (($82 | 0) != ($76 | 0)) { + $k1$0124 = $82; + do { + $185 = HEAP32[$23 >> 2] | 0; + $186 = $185 + -24 | 0; + $188 = $185; + do { + $187 = $188 + -24 | 0; + HEAP32[$23 >> 2] = $187; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($187); + $188 = HEAP32[$23 >> 2] | 0; + } while (($188 | 0) != ($186 | 0)); + $k1$0124 = $k1$0124 + -1 | 0; + } while (($k1$0124 | 0) != ($76 | 0)); + } + if ((HEAP8[$38 >> 0] | 0) == 69) { + $t$0$lcssa = $38; + break L9; + } else $t$0126 = $38; + } + if ((label | 0) == 12) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($31); else if ((label | 0) == 25) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($$lcssa); else if ((label | 0) == 33) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($$lcssa152); else if ((label | 0) == 56) { + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($args); + $$1 = $first; + break L1; + } + } while (0); + $192 = $t$0$lcssa + 1 | 0; + $193 = HEAP8[$args >> 0] | 0; + $195 = ($193 & 1) == 0; + if ((HEAP8[($195 ? $args + 1 | 0 : HEAP32[$args + 8 >> 2] | 0) + (($195 ? ($193 & 255) >>> 1 : HEAP32[$27 >> 2] | 0) + -1) >> 0] | 0) == 62) __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($args, 13761) | 0; else __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($args, 12778) | 0; + HEAP32[$2 >> 2] = HEAP32[$args >> 2]; + HEAP32[$2 + 4 >> 2] = HEAP32[$args + 4 >> 2]; + HEAP32[$2 + 8 >> 2] = HEAP32[$args + 8 >> 2]; + HEAP32[$args >> 2] = 0; + HEAP32[$args + 4 >> 2] = 0; + HEAP32[$args + 8 >> 2] = 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ENSt3__112basic_stringIcNS2_11char_traitsIcEENS0_12malloc_allocIcEEEE($1, $2); + $209 = HEAP32[$23 >> 2] | 0; + $211 = HEAP32[$db + 8 >> 2] | 0; + if ($209 >>> 0 < $211 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($209, $1); + HEAP32[$23 >> 2] = (HEAP32[$23 >> 2] | 0) + 24; + } else { + $218 = HEAP32[$db >> 2] | 0; + $219 = $209 - $218 | 0; + $220 = ($219 | 0) / 24 | 0; + $221 = $220 + 1 | 0; + if (($219 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $225 = ($211 - $218 | 0) / 24 | 0; + if ($225 >>> 0 < 1073741823) { + $227 = $225 << 1; + $$0$i$i$i21 = $227 >>> 0 < $221 >>> 0 ? $221 : $227; + } else $$0$i$i$i21 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i20, $$0$i$i$i21, $220, $db + 12 | 0); + $230 = $__v$i$i20 + 8 | 0; + $231 = HEAP32[$230 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($231, $1); + HEAP32[$230 >> 2] = $231 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i20); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i20); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($1); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($2); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($args); + $$1 = $192; + } else $$1 = $first; else $$1 = $first; while (0); + STACKTOP = sp; + return $$1 | 0; +} +function _free($mem) { + $mem = $mem | 0; + var $$lcssa = 0, $$pre$phi59Z2D = 0, $$pre$phi61Z2D = 0, $$pre$phiZ2D = 0, $$sum2 = 0, $1 = 0, $103 = 0, $104 = 0, $111 = 0, $112 = 0, $12 = 0, $120 = 0, $128 = 0, $133 = 0, $134 = 0, $137 = 0, $139 = 0, $14 = 0, $141 = 0, $15 = 0, $156 = 0, $161 = 0, $163 = 0, $166 = 0, $169 = 0, $172 = 0, $175 = 0, $176 = 0, $178 = 0, $179 = 0, $181 = 0, $182 = 0, $184 = 0, $185 = 0, $19 = 0, $191 = 0, $192 = 0, $2 = 0, $201 = 0, $206 = 0, $210 = 0, $216 = 0, $22 = 0, $231 = 0, $233 = 0, $234 = 0, $235 = 0, $236 = 0, $24 = 0, $240 = 0, $241 = 0, $247 = 0, $252 = 0, $253 = 0, $256 = 0, $258 = 0, $26 = 0, $261 = 0, $266 = 0, $272 = 0, $276 = 0, $277 = 0, $284 = 0, $296 = 0, $301 = 0, $308 = 0, $309 = 0, $310 = 0, $318 = 0, $39 = 0, $44 = 0, $46 = 0, $49 = 0, $5 = 0, $51 = 0, $54 = 0, $57 = 0, $58 = 0, $6 = 0, $60 = 0, $61 = 0, $63 = 0, $64 = 0, $66 = 0, $67 = 0, $72 = 0, $73 = 0, $8 = 0, $82 = 0, $87 = 0, $9 = 0, $91 = 0, $97 = 0, $F16$0 = 0, $I18$0 = 0, $K19$052 = 0, $R$0 = 0, $R$0$lcssa = 0, $R$1 = 0, $R7$0 = 0, $R7$0$lcssa = 0, $R7$1 = 0, $RP$0 = 0, $RP$0$lcssa = 0, $RP9$0 = 0, $RP9$0$lcssa = 0, $T$0$lcssa = 0, $T$051 = 0, $T$051$lcssa = 0, $p$0 = 0, $psize$0 = 0, $psize$1 = 0, $sp$0$i = 0, $sp$0$in$i = 0; + if (!$mem) return; + $1 = $mem + -8 | 0; + $2 = HEAP32[760] | 0; + if ($1 >>> 0 < $2 >>> 0) _abort(); + $5 = HEAP32[$mem + -4 >> 2] | 0; + $6 = $5 & 3; + if (($6 | 0) == 1) _abort(); + $8 = $5 & -8; + $9 = $mem + ($8 + -8) | 0; + do if (!($5 & 1)) { + $12 = HEAP32[$1 >> 2] | 0; + if (!$6) return; + $$sum2 = -8 - $12 | 0; + $14 = $mem + $$sum2 | 0; + $15 = $12 + $8 | 0; + if ($14 >>> 0 < $2 >>> 0) _abort(); + if (($14 | 0) == (HEAP32[761] | 0)) { + $103 = $mem + ($8 + -4) | 0; + $104 = HEAP32[$103 >> 2] | 0; + if (($104 & 3 | 0) != 3) { + $p$0 = $14; + $psize$0 = $15; + break; + } + HEAP32[758] = $15; + HEAP32[$103 >> 2] = $104 & -2; + HEAP32[$mem + ($$sum2 + 4) >> 2] = $15 | 1; + HEAP32[$9 >> 2] = $15; + return; + } + $19 = $12 >>> 3; + if ($12 >>> 0 < 256) { + $22 = HEAP32[$mem + ($$sum2 + 8) >> 2] | 0; + $24 = HEAP32[$mem + ($$sum2 + 12) >> 2] | 0; + $26 = 3064 + ($19 << 1 << 2) | 0; + if (($22 | 0) != ($26 | 0)) { + if ($22 >>> 0 < $2 >>> 0) _abort(); + if ((HEAP32[$22 + 12 >> 2] | 0) != ($14 | 0)) _abort(); + } + if (($24 | 0) == ($22 | 0)) { + HEAP32[756] = HEAP32[756] & ~(1 << $19); + $p$0 = $14; + $psize$0 = $15; + break; + } + if (($24 | 0) == ($26 | 0)) $$pre$phi61Z2D = $24 + 8 | 0; else { + if ($24 >>> 0 < $2 >>> 0) _abort(); + $39 = $24 + 8 | 0; + if ((HEAP32[$39 >> 2] | 0) == ($14 | 0)) $$pre$phi61Z2D = $39; else _abort(); + } + HEAP32[$22 + 12 >> 2] = $24; + HEAP32[$$pre$phi61Z2D >> 2] = $22; + $p$0 = $14; + $psize$0 = $15; + break; + } + $44 = HEAP32[$mem + ($$sum2 + 24) >> 2] | 0; + $46 = HEAP32[$mem + ($$sum2 + 12) >> 2] | 0; + do if (($46 | 0) == ($14 | 0)) { + $57 = $mem + ($$sum2 + 20) | 0; + $58 = HEAP32[$57 >> 2] | 0; + if (!$58) { + $60 = $mem + ($$sum2 + 16) | 0; + $61 = HEAP32[$60 >> 2] | 0; + if (!$61) { + $R$1 = 0; + break; + } else { + $R$0 = $61; + $RP$0 = $60; + } + } else { + $R$0 = $58; + $RP$0 = $57; + } + while (1) { + $63 = $R$0 + 20 | 0; + $64 = HEAP32[$63 >> 2] | 0; + if ($64) { + $R$0 = $64; + $RP$0 = $63; + continue; + } + $66 = $R$0 + 16 | 0; + $67 = HEAP32[$66 >> 2] | 0; + if (!$67) { + $R$0$lcssa = $R$0; + $RP$0$lcssa = $RP$0; + break; + } else { + $R$0 = $67; + $RP$0 = $66; + } + } + if ($RP$0$lcssa >>> 0 < $2 >>> 0) _abort(); else { + HEAP32[$RP$0$lcssa >> 2] = 0; + $R$1 = $R$0$lcssa; + break; + } + } else { + $49 = HEAP32[$mem + ($$sum2 + 8) >> 2] | 0; + if ($49 >>> 0 < $2 >>> 0) _abort(); + $51 = $49 + 12 | 0; + if ((HEAP32[$51 >> 2] | 0) != ($14 | 0)) _abort(); + $54 = $46 + 8 | 0; + if ((HEAP32[$54 >> 2] | 0) == ($14 | 0)) { + HEAP32[$51 >> 2] = $46; + HEAP32[$54 >> 2] = $49; + $R$1 = $46; + break; + } else _abort(); + } while (0); + if (!$44) { + $p$0 = $14; + $psize$0 = $15; + } else { + $72 = HEAP32[$mem + ($$sum2 + 28) >> 2] | 0; + $73 = 3328 + ($72 << 2) | 0; + if (($14 | 0) == (HEAP32[$73 >> 2] | 0)) { + HEAP32[$73 >> 2] = $R$1; + if (!$R$1) { + HEAP32[757] = HEAP32[757] & ~(1 << $72); + $p$0 = $14; + $psize$0 = $15; + break; + } + } else { + if ($44 >>> 0 < (HEAP32[760] | 0) >>> 0) _abort(); + $82 = $44 + 16 | 0; + if ((HEAP32[$82 >> 2] | 0) == ($14 | 0)) HEAP32[$82 >> 2] = $R$1; else HEAP32[$44 + 20 >> 2] = $R$1; + if (!$R$1) { + $p$0 = $14; + $psize$0 = $15; + break; + } + } + $87 = HEAP32[760] | 0; + if ($R$1 >>> 0 < $87 >>> 0) _abort(); + HEAP32[$R$1 + 24 >> 2] = $44; + $91 = HEAP32[$mem + ($$sum2 + 16) >> 2] | 0; + do if ($91) if ($91 >>> 0 < $87 >>> 0) _abort(); else { + HEAP32[$R$1 + 16 >> 2] = $91; + HEAP32[$91 + 24 >> 2] = $R$1; + break; + } while (0); + $97 = HEAP32[$mem + ($$sum2 + 20) >> 2] | 0; + if (!$97) { + $p$0 = $14; + $psize$0 = $15; + } else if ($97 >>> 0 < (HEAP32[760] | 0) >>> 0) _abort(); else { + HEAP32[$R$1 + 20 >> 2] = $97; + HEAP32[$97 + 24 >> 2] = $R$1; + $p$0 = $14; + $psize$0 = $15; + break; + } + } + } else { + $p$0 = $1; + $psize$0 = $8; + } while (0); + if ($p$0 >>> 0 >= $9 >>> 0) _abort(); + $111 = $mem + ($8 + -4) | 0; + $112 = HEAP32[$111 >> 2] | 0; + if (!($112 & 1)) _abort(); + if (!($112 & 2)) { + if (($9 | 0) == (HEAP32[762] | 0)) { + $120 = (HEAP32[759] | 0) + $psize$0 | 0; + HEAP32[759] = $120; + HEAP32[762] = $p$0; + HEAP32[$p$0 + 4 >> 2] = $120 | 1; + if (($p$0 | 0) != (HEAP32[761] | 0)) return; + HEAP32[761] = 0; + HEAP32[758] = 0; + return; + } + if (($9 | 0) == (HEAP32[761] | 0)) { + $128 = (HEAP32[758] | 0) + $psize$0 | 0; + HEAP32[758] = $128; + HEAP32[761] = $p$0; + HEAP32[$p$0 + 4 >> 2] = $128 | 1; + HEAP32[$p$0 + $128 >> 2] = $128; + return; + } + $133 = ($112 & -8) + $psize$0 | 0; + $134 = $112 >>> 3; + do if ($112 >>> 0 < 256) { + $137 = HEAP32[$mem + $8 >> 2] | 0; + $139 = HEAP32[$mem + ($8 | 4) >> 2] | 0; + $141 = 3064 + ($134 << 1 << 2) | 0; + if (($137 | 0) != ($141 | 0)) { + if ($137 >>> 0 < (HEAP32[760] | 0) >>> 0) _abort(); + if ((HEAP32[$137 + 12 >> 2] | 0) != ($9 | 0)) _abort(); + } + if (($139 | 0) == ($137 | 0)) { + HEAP32[756] = HEAP32[756] & ~(1 << $134); + break; + } + if (($139 | 0) == ($141 | 0)) $$pre$phi59Z2D = $139 + 8 | 0; else { + if ($139 >>> 0 < (HEAP32[760] | 0) >>> 0) _abort(); + $156 = $139 + 8 | 0; + if ((HEAP32[$156 >> 2] | 0) == ($9 | 0)) $$pre$phi59Z2D = $156; else _abort(); + } + HEAP32[$137 + 12 >> 2] = $139; + HEAP32[$$pre$phi59Z2D >> 2] = $137; + } else { + $161 = HEAP32[$mem + ($8 + 16) >> 2] | 0; + $163 = HEAP32[$mem + ($8 | 4) >> 2] | 0; + do if (($163 | 0) == ($9 | 0)) { + $175 = $mem + ($8 + 12) | 0; + $176 = HEAP32[$175 >> 2] | 0; + if (!$176) { + $178 = $mem + ($8 + 8) | 0; + $179 = HEAP32[$178 >> 2] | 0; + if (!$179) { + $R7$1 = 0; + break; + } else { + $R7$0 = $179; + $RP9$0 = $178; + } + } else { + $R7$0 = $176; + $RP9$0 = $175; + } + while (1) { + $181 = $R7$0 + 20 | 0; + $182 = HEAP32[$181 >> 2] | 0; + if ($182) { + $R7$0 = $182; + $RP9$0 = $181; + continue; + } + $184 = $R7$0 + 16 | 0; + $185 = HEAP32[$184 >> 2] | 0; + if (!$185) { + $R7$0$lcssa = $R7$0; + $RP9$0$lcssa = $RP9$0; + break; + } else { + $R7$0 = $185; + $RP9$0 = $184; + } + } + if ($RP9$0$lcssa >>> 0 < (HEAP32[760] | 0) >>> 0) _abort(); else { + HEAP32[$RP9$0$lcssa >> 2] = 0; + $R7$1 = $R7$0$lcssa; + break; + } + } else { + $166 = HEAP32[$mem + $8 >> 2] | 0; + if ($166 >>> 0 < (HEAP32[760] | 0) >>> 0) _abort(); + $169 = $166 + 12 | 0; + if ((HEAP32[$169 >> 2] | 0) != ($9 | 0)) _abort(); + $172 = $163 + 8 | 0; + if ((HEAP32[$172 >> 2] | 0) == ($9 | 0)) { + HEAP32[$169 >> 2] = $163; + HEAP32[$172 >> 2] = $166; + $R7$1 = $163; + break; + } else _abort(); + } while (0); + if ($161) { + $191 = HEAP32[$mem + ($8 + 20) >> 2] | 0; + $192 = 3328 + ($191 << 2) | 0; + if (($9 | 0) == (HEAP32[$192 >> 2] | 0)) { + HEAP32[$192 >> 2] = $R7$1; + if (!$R7$1) { + HEAP32[757] = HEAP32[757] & ~(1 << $191); + break; + } + } else { + if ($161 >>> 0 < (HEAP32[760] | 0) >>> 0) _abort(); + $201 = $161 + 16 | 0; + if ((HEAP32[$201 >> 2] | 0) == ($9 | 0)) HEAP32[$201 >> 2] = $R7$1; else HEAP32[$161 + 20 >> 2] = $R7$1; + if (!$R7$1) break; + } + $206 = HEAP32[760] | 0; + if ($R7$1 >>> 0 < $206 >>> 0) _abort(); + HEAP32[$R7$1 + 24 >> 2] = $161; + $210 = HEAP32[$mem + ($8 + 8) >> 2] | 0; + do if ($210) if ($210 >>> 0 < $206 >>> 0) _abort(); else { + HEAP32[$R7$1 + 16 >> 2] = $210; + HEAP32[$210 + 24 >> 2] = $R7$1; + break; + } while (0); + $216 = HEAP32[$mem + ($8 + 12) >> 2] | 0; + if ($216) if ($216 >>> 0 < (HEAP32[760] | 0) >>> 0) _abort(); else { + HEAP32[$R7$1 + 20 >> 2] = $216; + HEAP32[$216 + 24 >> 2] = $R7$1; + break; + } + } + } while (0); + HEAP32[$p$0 + 4 >> 2] = $133 | 1; + HEAP32[$p$0 + $133 >> 2] = $133; + if (($p$0 | 0) == (HEAP32[761] | 0)) { + HEAP32[758] = $133; + return; + } else $psize$1 = $133; + } else { + HEAP32[$111 >> 2] = $112 & -2; + HEAP32[$p$0 + 4 >> 2] = $psize$0 | 1; + HEAP32[$p$0 + $psize$0 >> 2] = $psize$0; + $psize$1 = $psize$0; + } + $231 = $psize$1 >>> 3; + if ($psize$1 >>> 0 < 256) { + $233 = $231 << 1; + $234 = 3064 + ($233 << 2) | 0; + $235 = HEAP32[756] | 0; + $236 = 1 << $231; + if (!($235 & $236)) { + HEAP32[756] = $235 | $236; + $$pre$phiZ2D = 3064 + ($233 + 2 << 2) | 0; + $F16$0 = $234; + } else { + $240 = 3064 + ($233 + 2 << 2) | 0; + $241 = HEAP32[$240 >> 2] | 0; + if ($241 >>> 0 < (HEAP32[760] | 0) >>> 0) _abort(); else { + $$pre$phiZ2D = $240; + $F16$0 = $241; + } + } + HEAP32[$$pre$phiZ2D >> 2] = $p$0; + HEAP32[$F16$0 + 12 >> 2] = $p$0; + HEAP32[$p$0 + 8 >> 2] = $F16$0; + HEAP32[$p$0 + 12 >> 2] = $234; + return; + } + $247 = $psize$1 >>> 8; + if (!$247) $I18$0 = 0; else if ($psize$1 >>> 0 > 16777215) $I18$0 = 31; else { + $252 = ($247 + 1048320 | 0) >>> 16 & 8; + $253 = $247 << $252; + $256 = ($253 + 520192 | 0) >>> 16 & 4; + $258 = $253 << $256; + $261 = ($258 + 245760 | 0) >>> 16 & 2; + $266 = 14 - ($256 | $252 | $261) + ($258 << $261 >>> 15) | 0; + $I18$0 = $psize$1 >>> ($266 + 7 | 0) & 1 | $266 << 1; + } + $272 = 3328 + ($I18$0 << 2) | 0; + HEAP32[$p$0 + 28 >> 2] = $I18$0; + HEAP32[$p$0 + 20 >> 2] = 0; + HEAP32[$p$0 + 16 >> 2] = 0; + $276 = HEAP32[757] | 0; + $277 = 1 << $I18$0; + L199 : do if (!($276 & $277)) { + HEAP32[757] = $276 | $277; + HEAP32[$272 >> 2] = $p$0; + HEAP32[$p$0 + 24 >> 2] = $272; + HEAP32[$p$0 + 12 >> 2] = $p$0; + HEAP32[$p$0 + 8 >> 2] = $p$0; + } else { + $284 = HEAP32[$272 >> 2] | 0; + L202 : do if ((HEAP32[$284 + 4 >> 2] & -8 | 0) == ($psize$1 | 0)) $T$0$lcssa = $284; else { + $K19$052 = $psize$1 << (($I18$0 | 0) == 31 ? 0 : 25 - ($I18$0 >>> 1) | 0); + $T$051 = $284; + while (1) { + $301 = $T$051 + 16 + ($K19$052 >>> 31 << 2) | 0; + $296 = HEAP32[$301 >> 2] | 0; + if (!$296) { + $$lcssa = $301; + $T$051$lcssa = $T$051; + break; + } + if ((HEAP32[$296 + 4 >> 2] & -8 | 0) == ($psize$1 | 0)) { + $T$0$lcssa = $296; + break L202; + } else { + $K19$052 = $K19$052 << 1; + $T$051 = $296; + } + } + if ($$lcssa >>> 0 < (HEAP32[760] | 0) >>> 0) _abort(); else { + HEAP32[$$lcssa >> 2] = $p$0; + HEAP32[$p$0 + 24 >> 2] = $T$051$lcssa; + HEAP32[$p$0 + 12 >> 2] = $p$0; + HEAP32[$p$0 + 8 >> 2] = $p$0; + break L199; + } + } while (0); + $308 = $T$0$lcssa + 8 | 0; + $309 = HEAP32[$308 >> 2] | 0; + $310 = HEAP32[760] | 0; + if ($309 >>> 0 >= $310 >>> 0 & $T$0$lcssa >>> 0 >= $310 >>> 0) { + HEAP32[$309 + 12 >> 2] = $p$0; + HEAP32[$308 >> 2] = $p$0; + HEAP32[$p$0 + 8 >> 2] = $309; + HEAP32[$p$0 + 12 >> 2] = $T$0$lcssa; + HEAP32[$p$0 + 24 >> 2] = 0; + break; + } else _abort(); + } while (0); + $318 = (HEAP32[764] | 0) + -1 | 0; + HEAP32[764] = $318; + if (!$318) $sp$0$in$i = 3480; else return; + while (1) { + $sp$0$i = HEAP32[$sp$0$in$i >> 2] | 0; + if (!$sp$0$i) break; else $sp$0$in$i = $sp$0$i + 8 | 0; + } + HEAP32[764] = -1; + return; +} + +function ___intscan($f, $base, $pok, $0, $1) { + $f = $f | 0; + $base = $base | 0; + $pok = $pok | 0; + $0 = $0 | 0; + $1 = $1 | 0; + var $$1 = 0, $$122 = 0, $$123 = 0, $$base21 = 0, $$lcssa = 0, $$lcssa130 = 0, $$lcssa131 = 0, $$lcssa132 = 0, $$lcssa133 = 0, $$lcssa134 = 0, $$lcssa135 = 0, $100 = 0, $101 = 0, $108 = 0, $120 = 0, $121 = 0, $128 = 0, $13 = 0, $130 = 0, $131 = 0, $134 = 0, $135 = 0, $136 = 0, $144 = 0, $149 = 0, $150 = 0, $152 = 0, $155 = 0, $157 = 0, $161 = 0, $162 = 0, $163 = 0, $164 = 0, $166 = 0, $167 = 0, $168 = 0, $17 = 0, $18 = 0, $185 = 0, $186 = 0, $187 = 0, $195 = 0, $201 = 0, $203 = 0, $204 = 0, $206 = 0, $208 = 0, $212 = 0, $213 = 0, $214 = 0, $215 = 0, $222 = 0, $223 = 0, $224 = 0, $239 = 0, $25 = 0, $250 = 0, $260 = 0, $262 = 0, $271 = 0, $272 = 0, $279 = 0, $281 = 0, $284 = 0, $286 = 0, $287 = 0, $288 = 0, $289 = 0, $29 = 0, $290 = 0, $291 = 0, $292 = 0, $293 = 0, $294 = 0, $295 = 0, $3 = 0, $37 = 0, $39 = 0, $4 = 0, $46 = 0, $5 = 0, $51 = 0, $6 = 0, $65 = 0, $67 = 0, $70 = 0, $71 = 0, $72 = 0, $83 = 0, $85 = 0, $86 = 0, $87 = 0, $88 = 0, $90 = 0, $91 = 0, $93 = 0, $99 = 0, $c$0 = 0, $c$1 = 0, $c$124 = 0, $c$2$be = 0, $c$2$be$lcssa = 0, $c$2$lcssa = 0, $c$3$be = 0, $c$3$lcssa = 0, $c$371 = 0, $c$4$be = 0, $c$4$be$lcssa = 0, $c$4$lcssa = 0, $c$5$be = 0, $c$6$be = 0, $c$6$be$lcssa = 0, $c$6$lcssa = 0, $c$7$be = 0, $c$753 = 0, $c$8 = 0, $c$9$be = 0, $neg$0 = 0, $neg$1 = 0, $x$082 = 0, $x$146 = 0, $x$266 = 0, label = 0; + L1 : do if ($base >>> 0 > 36) { + $5 = ___errno_location() | 0; + HEAP32[$5 >> 2] = 22; + $286 = 0; + $287 = 0; + } else { + $3 = $f + 4 | 0; + $4 = $f + 100 | 0; + do { + $6 = HEAP32[$3 >> 2] | 0; + if ($6 >>> 0 < (HEAP32[$4 >> 2] | 0) >>> 0) { + HEAP32[$3 >> 2] = $6 + 1; + $13 = HEAPU8[$6 >> 0] | 0; + } else $13 = ___shgetc($f) | 0; + } while ((_isspace($13) | 0) != 0); + $$lcssa135 = $13; + L11 : do switch ($$lcssa135 | 0) { + case 43: + case 45: + { + $17 = (($$lcssa135 | 0) == 45) << 31 >> 31; + $18 = HEAP32[$3 >> 2] | 0; + if ($18 >>> 0 < (HEAP32[$4 >> 2] | 0) >>> 0) { + HEAP32[$3 >> 2] = $18 + 1; + $c$0 = HEAPU8[$18 >> 0] | 0; + $neg$0 = $17; + break L11; + } else { + $c$0 = ___shgetc($f) | 0; + $neg$0 = $17; + break L11; + } + break; + } + default: + { + $c$0 = $$lcssa135; + $neg$0 = 0; + } + } while (0); + $25 = ($base | 0) == 0; + do if (($base & -17 | 0) == 0 & ($c$0 | 0) == 48) { + $29 = HEAP32[$3 >> 2] | 0; + if ($29 >>> 0 < (HEAP32[$4 >> 2] | 0) >>> 0) { + HEAP32[$3 >> 2] = $29 + 1; + $37 = HEAPU8[$29 >> 0] | 0; + } else $37 = ___shgetc($f) | 0; + if (($37 | 32 | 0) != 120) if ($25) { + $$123 = 8; + $c$124 = $37; + label = 46; + break; + } else { + $$1 = $base; + $c$1 = $37; + label = 32; + break; + } + $39 = HEAP32[$3 >> 2] | 0; + if ($39 >>> 0 < (HEAP32[$4 >> 2] | 0) >>> 0) { + HEAP32[$3 >> 2] = $39 + 1; + $46 = HEAPU8[$39 >> 0] | 0; + } else $46 = ___shgetc($f) | 0; + if ((HEAPU8[16493 + ($46 + 1) >> 0] | 0) > 15) { + $51 = (HEAP32[$4 >> 2] | 0) == 0; + if (!$51) HEAP32[$3 >> 2] = (HEAP32[$3 >> 2] | 0) + -1; + if (!$pok) { + ___shlim($f, 0); + $286 = 0; + $287 = 0; + break L1; + } + if ($51) { + $286 = 0; + $287 = 0; + break L1; + } + HEAP32[$3 >> 2] = (HEAP32[$3 >> 2] | 0) + -1; + $286 = 0; + $287 = 0; + break L1; + } else { + $$123 = 16; + $c$124 = $46; + label = 46; + } + } else { + $$base21 = $25 ? 10 : $base; + if ((HEAPU8[16493 + ($c$0 + 1) >> 0] | 0) >>> 0 < $$base21 >>> 0) { + $$1 = $$base21; + $c$1 = $c$0; + label = 32; + } else { + if (HEAP32[$4 >> 2] | 0) HEAP32[$3 >> 2] = (HEAP32[$3 >> 2] | 0) + -1; + ___shlim($f, 0); + $65 = ___errno_location() | 0; + HEAP32[$65 >> 2] = 22; + $286 = 0; + $287 = 0; + break L1; + } + } while (0); + if ((label | 0) == 32) if (($$1 | 0) == 10) { + $67 = $c$1 + -48 | 0; + if ($67 >>> 0 < 10) { + $71 = $67; + $x$082 = 0; + while (1) { + $70 = ($x$082 * 10 | 0) + $71 | 0; + $72 = HEAP32[$3 >> 2] | 0; + if ($72 >>> 0 < (HEAP32[$4 >> 2] | 0) >>> 0) { + HEAP32[$3 >> 2] = $72 + 1; + $c$2$be = HEAPU8[$72 >> 0] | 0; + } else $c$2$be = ___shgetc($f) | 0; + $71 = $c$2$be + -48 | 0; + if (!($71 >>> 0 < 10 & $70 >>> 0 < 429496729)) { + $$lcssa134 = $70; + $c$2$be$lcssa = $c$2$be; + break; + } else $x$082 = $70; + } + $288 = $$lcssa134; + $289 = 0; + $c$2$lcssa = $c$2$be$lcssa; + } else { + $288 = 0; + $289 = 0; + $c$2$lcssa = $c$1; + } + $83 = $c$2$lcssa + -48 | 0; + if ($83 >>> 0 < 10) { + $85 = $288; + $86 = $289; + $90 = $83; + $c$371 = $c$2$lcssa; + while (1) { + $87 = ___muldi3($85 | 0, $86 | 0, 10, 0) | 0; + $88 = tempRet0; + $91 = (($90 | 0) < 0) << 31 >> 31; + $93 = ~$91; + if ($88 >>> 0 > $93 >>> 0 | ($88 | 0) == ($93 | 0) & $87 >>> 0 > ~$90 >>> 0) { + $$lcssa = $90; + $290 = $85; + $291 = $86; + $c$3$lcssa = $c$371; + break; + } + $99 = _i64Add($87 | 0, $88 | 0, $90 | 0, $91 | 0) | 0; + $100 = tempRet0; + $101 = HEAP32[$3 >> 2] | 0; + if ($101 >>> 0 < (HEAP32[$4 >> 2] | 0) >>> 0) { + HEAP32[$3 >> 2] = $101 + 1; + $c$3$be = HEAPU8[$101 >> 0] | 0; + } else $c$3$be = ___shgetc($f) | 0; + $108 = $c$3$be + -48 | 0; + if ($108 >>> 0 < 10 & ($100 >>> 0 < 429496729 | ($100 | 0) == 429496729 & $99 >>> 0 < 2576980378)) { + $85 = $99; + $86 = $100; + $90 = $108; + $c$371 = $c$3$be; + } else { + $$lcssa = $108; + $290 = $99; + $291 = $100; + $c$3$lcssa = $c$3$be; + break; + } + } + if ($$lcssa >>> 0 > 9) { + $260 = $291; + $262 = $290; + $neg$1 = $neg$0; + } else { + $$122 = 10; + $292 = $290; + $293 = $291; + $c$8 = $c$3$lcssa; + label = 72; + } + } else { + $260 = $289; + $262 = $288; + $neg$1 = $neg$0; + } + } else { + $$123 = $$1; + $c$124 = $c$1; + label = 46; + } + L63 : do if ((label | 0) == 46) { + if (!($$123 + -1 & $$123)) { + $128 = HEAP8[16750 + (($$123 * 23 | 0) >>> 5 & 7) >> 0] | 0; + $130 = HEAP8[16493 + ($c$124 + 1) >> 0] | 0; + $131 = $130 & 255; + if ($131 >>> 0 < $$123 >>> 0) { + $135 = $131; + $x$146 = 0; + while (1) { + $134 = $135 | $x$146 << $128; + $136 = HEAP32[$3 >> 2] | 0; + if ($136 >>> 0 < (HEAP32[$4 >> 2] | 0) >>> 0) { + HEAP32[$3 >> 2] = $136 + 1; + $c$4$be = HEAPU8[$136 >> 0] | 0; + } else $c$4$be = ___shgetc($f) | 0; + $144 = HEAP8[16493 + ($c$4$be + 1) >> 0] | 0; + $135 = $144 & 255; + if (!($134 >>> 0 < 134217728 & $135 >>> 0 < $$123 >>> 0)) { + $$lcssa130 = $134; + $$lcssa131 = $144; + $c$4$be$lcssa = $c$4$be; + break; + } else $x$146 = $134; + } + $152 = $$lcssa131; + $155 = 0; + $157 = $$lcssa130; + $c$4$lcssa = $c$4$be$lcssa; + } else { + $152 = $130; + $155 = 0; + $157 = 0; + $c$4$lcssa = $c$124; + } + $149 = _bitshift64Lshr(-1, -1, $128 | 0) | 0; + $150 = tempRet0; + if (($152 & 255) >>> 0 >= $$123 >>> 0 | ($155 >>> 0 > $150 >>> 0 | ($155 | 0) == ($150 | 0) & $157 >>> 0 > $149 >>> 0)) { + $$122 = $$123; + $292 = $157; + $293 = $155; + $c$8 = $c$4$lcssa; + label = 72; + break; + } else { + $161 = $157; + $162 = $155; + $166 = $152; + } + while (1) { + $163 = _bitshift64Shl($161 | 0, $162 | 0, $128 | 0) | 0; + $164 = tempRet0; + $167 = $166 & 255 | $163; + $168 = HEAP32[$3 >> 2] | 0; + if ($168 >>> 0 < (HEAP32[$4 >> 2] | 0) >>> 0) { + HEAP32[$3 >> 2] = $168 + 1; + $c$5$be = HEAPU8[$168 >> 0] | 0; + } else $c$5$be = ___shgetc($f) | 0; + $166 = HEAP8[16493 + ($c$5$be + 1) >> 0] | 0; + if (($166 & 255) >>> 0 >= $$123 >>> 0 | ($164 >>> 0 > $150 >>> 0 | ($164 | 0) == ($150 | 0) & $167 >>> 0 > $149 >>> 0)) { + $$122 = $$123; + $292 = $167; + $293 = $164; + $c$8 = $c$5$be; + label = 72; + break L63; + } else { + $161 = $167; + $162 = $164; + } + } + } + $120 = HEAP8[16493 + ($c$124 + 1) >> 0] | 0; + $121 = $120 & 255; + if ($121 >>> 0 < $$123 >>> 0) { + $186 = $121; + $x$266 = 0; + while (1) { + $185 = $186 + (Math_imul($x$266, $$123) | 0) | 0; + $187 = HEAP32[$3 >> 2] | 0; + if ($187 >>> 0 < (HEAP32[$4 >> 2] | 0) >>> 0) { + HEAP32[$3 >> 2] = $187 + 1; + $c$6$be = HEAPU8[$187 >> 0] | 0; + } else $c$6$be = ___shgetc($f) | 0; + $195 = HEAP8[16493 + ($c$6$be + 1) >> 0] | 0; + $186 = $195 & 255; + if (!($185 >>> 0 < 119304647 & $186 >>> 0 < $$123 >>> 0)) { + $$lcssa132 = $185; + $$lcssa133 = $195; + $c$6$be$lcssa = $c$6$be; + break; + } else $x$266 = $185; + } + $201 = $$lcssa133; + $294 = $$lcssa132; + $295 = 0; + $c$6$lcssa = $c$6$be$lcssa; + } else { + $201 = $120; + $294 = 0; + $295 = 0; + $c$6$lcssa = $c$124; + } + if (($201 & 255) >>> 0 < $$123 >>> 0) { + $203 = ___udivdi3(-1, -1, $$123 | 0, 0) | 0; + $204 = tempRet0; + $206 = $295; + $208 = $294; + $215 = $201; + $c$753 = $c$6$lcssa; + while (1) { + if ($206 >>> 0 > $204 >>> 0 | ($206 | 0) == ($204 | 0) & $208 >>> 0 > $203 >>> 0) { + $$122 = $$123; + $292 = $208; + $293 = $206; + $c$8 = $c$753; + label = 72; + break L63; + } + $212 = ___muldi3($208 | 0, $206 | 0, $$123 | 0, 0) | 0; + $213 = tempRet0; + $214 = $215 & 255; + if ($213 >>> 0 > 4294967295 | ($213 | 0) == -1 & $212 >>> 0 > ~$214 >>> 0) { + $$122 = $$123; + $292 = $208; + $293 = $206; + $c$8 = $c$753; + label = 72; + break L63; + } + $222 = _i64Add($214 | 0, 0, $212 | 0, $213 | 0) | 0; + $223 = tempRet0; + $224 = HEAP32[$3 >> 2] | 0; + if ($224 >>> 0 < (HEAP32[$4 >> 2] | 0) >>> 0) { + HEAP32[$3 >> 2] = $224 + 1; + $c$7$be = HEAPU8[$224 >> 0] | 0; + } else $c$7$be = ___shgetc($f) | 0; + $215 = HEAP8[16493 + ($c$7$be + 1) >> 0] | 0; + if (($215 & 255) >>> 0 >= $$123 >>> 0) { + $$122 = $$123; + $292 = $222; + $293 = $223; + $c$8 = $c$7$be; + label = 72; + break; + } else { + $206 = $223; + $208 = $222; + $c$753 = $c$7$be; + } + } + } else { + $$122 = $$123; + $292 = $294; + $293 = $295; + $c$8 = $c$6$lcssa; + label = 72; + } + } while (0); + if ((label | 0) == 72) if ((HEAPU8[16493 + ($c$8 + 1) >> 0] | 0) >>> 0 < $$122 >>> 0) { + do { + $239 = HEAP32[$3 >> 2] | 0; + if ($239 >>> 0 < (HEAP32[$4 >> 2] | 0) >>> 0) { + HEAP32[$3 >> 2] = $239 + 1; + $c$9$be = HEAPU8[$239 >> 0] | 0; + } else $c$9$be = ___shgetc($f) | 0; + } while ((HEAPU8[16493 + ($c$9$be + 1) >> 0] | 0) >>> 0 < $$122 >>> 0); + $250 = ___errno_location() | 0; + HEAP32[$250 >> 2] = 34; + $260 = $1; + $262 = $0; + $neg$1 = ($0 & 1 | 0) == 0 & 0 == 0 ? $neg$0 : 0; + } else { + $260 = $293; + $262 = $292; + $neg$1 = $neg$0; + } + if (HEAP32[$4 >> 2] | 0) HEAP32[$3 >> 2] = (HEAP32[$3 >> 2] | 0) + -1; + if (!($260 >>> 0 < $1 >>> 0 | ($260 | 0) == ($1 | 0) & $262 >>> 0 < $0 >>> 0)) { + if (!(($0 & 1 | 0) != 0 | 0 != 0 | ($neg$1 | 0) != 0)) { + $271 = ___errno_location() | 0; + HEAP32[$271 >> 2] = 34; + $272 = _i64Add($0 | 0, $1 | 0, -1, -1) | 0; + $286 = tempRet0; + $287 = $272; + break; + } + if ($260 >>> 0 > $1 >>> 0 | ($260 | 0) == ($1 | 0) & $262 >>> 0 > $0 >>> 0) { + $279 = ___errno_location() | 0; + HEAP32[$279 >> 2] = 34; + $286 = $1; + $287 = $0; + break; + } + } + $281 = (($neg$1 | 0) < 0) << 31 >> 31; + $284 = _i64Subtract($262 ^ $neg$1 | 0, $260 ^ $281 | 0, $neg$1 | 0, $281 | 0) | 0; + $286 = tempRet0; + $287 = $284; + } while (0); + tempRet0 = $286; + return $287 | 0; +} + +function _dispose_chunk($p, $psize) { + $p = $p | 0; + $psize = $psize | 0; + var $$0 = 0, $$02 = 0, $$1 = 0, $$lcssa = 0, $$pre$phi50Z2D = 0, $$pre$phi52Z2D = 0, $$pre$phiZ2D = 0, $$sum18 = 0, $$sum21 = 0, $0 = 0, $10 = 0, $100 = 0, $106 = 0, $108 = 0, $109 = 0, $11 = 0, $115 = 0, $123 = 0, $128 = 0, $129 = 0, $132 = 0, $134 = 0, $136 = 0, $149 = 0, $15 = 0, $154 = 0, $156 = 0, $159 = 0, $161 = 0, $164 = 0, $167 = 0, $168 = 0, $170 = 0, $171 = 0, $173 = 0, $174 = 0, $176 = 0, $177 = 0, $18 = 0, $182 = 0, $183 = 0, $192 = 0, $197 = 0, $2 = 0, $20 = 0, $201 = 0, $207 = 0, $22 = 0, $222 = 0, $224 = 0, $225 = 0, $226 = 0, $227 = 0, $231 = 0, $232 = 0, $238 = 0, $243 = 0, $244 = 0, $247 = 0, $249 = 0, $252 = 0, $257 = 0, $263 = 0, $267 = 0, $268 = 0, $275 = 0, $287 = 0, $292 = 0, $299 = 0, $300 = 0, $301 = 0, $35 = 0, $40 = 0, $42 = 0, $45 = 0, $47 = 0, $5 = 0, $50 = 0, $53 = 0, $54 = 0, $56 = 0, $57 = 0, $59 = 0, $60 = 0, $62 = 0, $63 = 0, $68 = 0, $69 = 0, $78 = 0, $83 = 0, $87 = 0, $9 = 0, $93 = 0, $99 = 0, $F16$0 = 0, $I19$0 = 0, $K20$043 = 0, $R$0 = 0, $R$0$lcssa = 0, $R$1 = 0, $R7$0 = 0, $R7$0$lcssa = 0, $R7$1 = 0, $RP$0 = 0, $RP$0$lcssa = 0, $RP9$0 = 0, $RP9$0$lcssa = 0, $T$0$lcssa = 0, $T$042 = 0, $T$042$lcssa = 0; + $0 = $p + $psize | 0; + $2 = HEAP32[$p + 4 >> 2] | 0; + do if (!($2 & 1)) { + $5 = HEAP32[$p >> 2] | 0; + if (!($2 & 3)) return; + $9 = $p + (0 - $5) | 0; + $10 = $5 + $psize | 0; + $11 = HEAP32[760] | 0; + if ($9 >>> 0 < $11 >>> 0) _abort(); + if (($9 | 0) == (HEAP32[761] | 0)) { + $99 = $p + ($psize + 4) | 0; + $100 = HEAP32[$99 >> 2] | 0; + if (($100 & 3 | 0) != 3) { + $$0 = $9; + $$02 = $10; + break; + } + HEAP32[758] = $10; + HEAP32[$99 >> 2] = $100 & -2; + HEAP32[$p + (4 - $5) >> 2] = $10 | 1; + HEAP32[$0 >> 2] = $10; + return; + } + $15 = $5 >>> 3; + if ($5 >>> 0 < 256) { + $18 = HEAP32[$p + (8 - $5) >> 2] | 0; + $20 = HEAP32[$p + (12 - $5) >> 2] | 0; + $22 = 3064 + ($15 << 1 << 2) | 0; + if (($18 | 0) != ($22 | 0)) { + if ($18 >>> 0 < $11 >>> 0) _abort(); + if ((HEAP32[$18 + 12 >> 2] | 0) != ($9 | 0)) _abort(); + } + if (($20 | 0) == ($18 | 0)) { + HEAP32[756] = HEAP32[756] & ~(1 << $15); + $$0 = $9; + $$02 = $10; + break; + } + if (($20 | 0) == ($22 | 0)) $$pre$phi52Z2D = $20 + 8 | 0; else { + if ($20 >>> 0 < $11 >>> 0) _abort(); + $35 = $20 + 8 | 0; + if ((HEAP32[$35 >> 2] | 0) == ($9 | 0)) $$pre$phi52Z2D = $35; else _abort(); + } + HEAP32[$18 + 12 >> 2] = $20; + HEAP32[$$pre$phi52Z2D >> 2] = $18; + $$0 = $9; + $$02 = $10; + break; + } + $40 = HEAP32[$p + (24 - $5) >> 2] | 0; + $42 = HEAP32[$p + (12 - $5) >> 2] | 0; + do if (($42 | 0) == ($9 | 0)) { + $$sum18 = 16 - $5 | 0; + $53 = $p + ($$sum18 + 4) | 0; + $54 = HEAP32[$53 >> 2] | 0; + if (!$54) { + $56 = $p + $$sum18 | 0; + $57 = HEAP32[$56 >> 2] | 0; + if (!$57) { + $R$1 = 0; + break; + } else { + $R$0 = $57; + $RP$0 = $56; + } + } else { + $R$0 = $54; + $RP$0 = $53; + } + while (1) { + $59 = $R$0 + 20 | 0; + $60 = HEAP32[$59 >> 2] | 0; + if ($60) { + $R$0 = $60; + $RP$0 = $59; + continue; + } + $62 = $R$0 + 16 | 0; + $63 = HEAP32[$62 >> 2] | 0; + if (!$63) { + $R$0$lcssa = $R$0; + $RP$0$lcssa = $RP$0; + break; + } else { + $R$0 = $63; + $RP$0 = $62; + } + } + if ($RP$0$lcssa >>> 0 < $11 >>> 0) _abort(); else { + HEAP32[$RP$0$lcssa >> 2] = 0; + $R$1 = $R$0$lcssa; + break; + } + } else { + $45 = HEAP32[$p + (8 - $5) >> 2] | 0; + if ($45 >>> 0 < $11 >>> 0) _abort(); + $47 = $45 + 12 | 0; + if ((HEAP32[$47 >> 2] | 0) != ($9 | 0)) _abort(); + $50 = $42 + 8 | 0; + if ((HEAP32[$50 >> 2] | 0) == ($9 | 0)) { + HEAP32[$47 >> 2] = $42; + HEAP32[$50 >> 2] = $45; + $R$1 = $42; + break; + } else _abort(); + } while (0); + if (!$40) { + $$0 = $9; + $$02 = $10; + } else { + $68 = HEAP32[$p + (28 - $5) >> 2] | 0; + $69 = 3328 + ($68 << 2) | 0; + if (($9 | 0) == (HEAP32[$69 >> 2] | 0)) { + HEAP32[$69 >> 2] = $R$1; + if (!$R$1) { + HEAP32[757] = HEAP32[757] & ~(1 << $68); + $$0 = $9; + $$02 = $10; + break; + } + } else { + if ($40 >>> 0 < (HEAP32[760] | 0) >>> 0) _abort(); + $78 = $40 + 16 | 0; + if ((HEAP32[$78 >> 2] | 0) == ($9 | 0)) HEAP32[$78 >> 2] = $R$1; else HEAP32[$40 + 20 >> 2] = $R$1; + if (!$R$1) { + $$0 = $9; + $$02 = $10; + break; + } + } + $83 = HEAP32[760] | 0; + if ($R$1 >>> 0 < $83 >>> 0) _abort(); + HEAP32[$R$1 + 24 >> 2] = $40; + $$sum21 = 16 - $5 | 0; + $87 = HEAP32[$p + $$sum21 >> 2] | 0; + do if ($87) if ($87 >>> 0 < $83 >>> 0) _abort(); else { + HEAP32[$R$1 + 16 >> 2] = $87; + HEAP32[$87 + 24 >> 2] = $R$1; + break; + } while (0); + $93 = HEAP32[$p + ($$sum21 + 4) >> 2] | 0; + if (!$93) { + $$0 = $9; + $$02 = $10; + } else if ($93 >>> 0 < (HEAP32[760] | 0) >>> 0) _abort(); else { + HEAP32[$R$1 + 20 >> 2] = $93; + HEAP32[$93 + 24 >> 2] = $R$1; + $$0 = $9; + $$02 = $10; + break; + } + } + } else { + $$0 = $p; + $$02 = $psize; + } while (0); + $106 = HEAP32[760] | 0; + if ($0 >>> 0 < $106 >>> 0) _abort(); + $108 = $p + ($psize + 4) | 0; + $109 = HEAP32[$108 >> 2] | 0; + if (!($109 & 2)) { + if (($0 | 0) == (HEAP32[762] | 0)) { + $115 = (HEAP32[759] | 0) + $$02 | 0; + HEAP32[759] = $115; + HEAP32[762] = $$0; + HEAP32[$$0 + 4 >> 2] = $115 | 1; + if (($$0 | 0) != (HEAP32[761] | 0)) return; + HEAP32[761] = 0; + HEAP32[758] = 0; + return; + } + if (($0 | 0) == (HEAP32[761] | 0)) { + $123 = (HEAP32[758] | 0) + $$02 | 0; + HEAP32[758] = $123; + HEAP32[761] = $$0; + HEAP32[$$0 + 4 >> 2] = $123 | 1; + HEAP32[$$0 + $123 >> 2] = $123; + return; + } + $128 = ($109 & -8) + $$02 | 0; + $129 = $109 >>> 3; + do if ($109 >>> 0 < 256) { + $132 = HEAP32[$p + ($psize + 8) >> 2] | 0; + $134 = HEAP32[$p + ($psize + 12) >> 2] | 0; + $136 = 3064 + ($129 << 1 << 2) | 0; + if (($132 | 0) != ($136 | 0)) { + if ($132 >>> 0 < $106 >>> 0) _abort(); + if ((HEAP32[$132 + 12 >> 2] | 0) != ($0 | 0)) _abort(); + } + if (($134 | 0) == ($132 | 0)) { + HEAP32[756] = HEAP32[756] & ~(1 << $129); + break; + } + if (($134 | 0) == ($136 | 0)) $$pre$phi50Z2D = $134 + 8 | 0; else { + if ($134 >>> 0 < $106 >>> 0) _abort(); + $149 = $134 + 8 | 0; + if ((HEAP32[$149 >> 2] | 0) == ($0 | 0)) $$pre$phi50Z2D = $149; else _abort(); + } + HEAP32[$132 + 12 >> 2] = $134; + HEAP32[$$pre$phi50Z2D >> 2] = $132; + } else { + $154 = HEAP32[$p + ($psize + 24) >> 2] | 0; + $156 = HEAP32[$p + ($psize + 12) >> 2] | 0; + do if (($156 | 0) == ($0 | 0)) { + $167 = $p + ($psize + 20) | 0; + $168 = HEAP32[$167 >> 2] | 0; + if (!$168) { + $170 = $p + ($psize + 16) | 0; + $171 = HEAP32[$170 >> 2] | 0; + if (!$171) { + $R7$1 = 0; + break; + } else { + $R7$0 = $171; + $RP9$0 = $170; + } + } else { + $R7$0 = $168; + $RP9$0 = $167; + } + while (1) { + $173 = $R7$0 + 20 | 0; + $174 = HEAP32[$173 >> 2] | 0; + if ($174) { + $R7$0 = $174; + $RP9$0 = $173; + continue; + } + $176 = $R7$0 + 16 | 0; + $177 = HEAP32[$176 >> 2] | 0; + if (!$177) { + $R7$0$lcssa = $R7$0; + $RP9$0$lcssa = $RP9$0; + break; + } else { + $R7$0 = $177; + $RP9$0 = $176; + } + } + if ($RP9$0$lcssa >>> 0 < $106 >>> 0) _abort(); else { + HEAP32[$RP9$0$lcssa >> 2] = 0; + $R7$1 = $R7$0$lcssa; + break; + } + } else { + $159 = HEAP32[$p + ($psize + 8) >> 2] | 0; + if ($159 >>> 0 < $106 >>> 0) _abort(); + $161 = $159 + 12 | 0; + if ((HEAP32[$161 >> 2] | 0) != ($0 | 0)) _abort(); + $164 = $156 + 8 | 0; + if ((HEAP32[$164 >> 2] | 0) == ($0 | 0)) { + HEAP32[$161 >> 2] = $156; + HEAP32[$164 >> 2] = $159; + $R7$1 = $156; + break; + } else _abort(); + } while (0); + if ($154) { + $182 = HEAP32[$p + ($psize + 28) >> 2] | 0; + $183 = 3328 + ($182 << 2) | 0; + if (($0 | 0) == (HEAP32[$183 >> 2] | 0)) { + HEAP32[$183 >> 2] = $R7$1; + if (!$R7$1) { + HEAP32[757] = HEAP32[757] & ~(1 << $182); + break; + } + } else { + if ($154 >>> 0 < (HEAP32[760] | 0) >>> 0) _abort(); + $192 = $154 + 16 | 0; + if ((HEAP32[$192 >> 2] | 0) == ($0 | 0)) HEAP32[$192 >> 2] = $R7$1; else HEAP32[$154 + 20 >> 2] = $R7$1; + if (!$R7$1) break; + } + $197 = HEAP32[760] | 0; + if ($R7$1 >>> 0 < $197 >>> 0) _abort(); + HEAP32[$R7$1 + 24 >> 2] = $154; + $201 = HEAP32[$p + ($psize + 16) >> 2] | 0; + do if ($201) if ($201 >>> 0 < $197 >>> 0) _abort(); else { + HEAP32[$R7$1 + 16 >> 2] = $201; + HEAP32[$201 + 24 >> 2] = $R7$1; + break; + } while (0); + $207 = HEAP32[$p + ($psize + 20) >> 2] | 0; + if ($207) if ($207 >>> 0 < (HEAP32[760] | 0) >>> 0) _abort(); else { + HEAP32[$R7$1 + 20 >> 2] = $207; + HEAP32[$207 + 24 >> 2] = $R7$1; + break; + } + } + } while (0); + HEAP32[$$0 + 4 >> 2] = $128 | 1; + HEAP32[$$0 + $128 >> 2] = $128; + if (($$0 | 0) == (HEAP32[761] | 0)) { + HEAP32[758] = $128; + return; + } else $$1 = $128; + } else { + HEAP32[$108 >> 2] = $109 & -2; + HEAP32[$$0 + 4 >> 2] = $$02 | 1; + HEAP32[$$0 + $$02 >> 2] = $$02; + $$1 = $$02; + } + $222 = $$1 >>> 3; + if ($$1 >>> 0 < 256) { + $224 = $222 << 1; + $225 = 3064 + ($224 << 2) | 0; + $226 = HEAP32[756] | 0; + $227 = 1 << $222; + if (!($226 & $227)) { + HEAP32[756] = $226 | $227; + $$pre$phiZ2D = 3064 + ($224 + 2 << 2) | 0; + $F16$0 = $225; + } else { + $231 = 3064 + ($224 + 2 << 2) | 0; + $232 = HEAP32[$231 >> 2] | 0; + if ($232 >>> 0 < (HEAP32[760] | 0) >>> 0) _abort(); else { + $$pre$phiZ2D = $231; + $F16$0 = $232; + } + } + HEAP32[$$pre$phiZ2D >> 2] = $$0; + HEAP32[$F16$0 + 12 >> 2] = $$0; + HEAP32[$$0 + 8 >> 2] = $F16$0; + HEAP32[$$0 + 12 >> 2] = $225; + return; + } + $238 = $$1 >>> 8; + if (!$238) $I19$0 = 0; else if ($$1 >>> 0 > 16777215) $I19$0 = 31; else { + $243 = ($238 + 1048320 | 0) >>> 16 & 8; + $244 = $238 << $243; + $247 = ($244 + 520192 | 0) >>> 16 & 4; + $249 = $244 << $247; + $252 = ($249 + 245760 | 0) >>> 16 & 2; + $257 = 14 - ($247 | $243 | $252) + ($249 << $252 >>> 15) | 0; + $I19$0 = $$1 >>> ($257 + 7 | 0) & 1 | $257 << 1; + } + $263 = 3328 + ($I19$0 << 2) | 0; + HEAP32[$$0 + 28 >> 2] = $I19$0; + HEAP32[$$0 + 20 >> 2] = 0; + HEAP32[$$0 + 16 >> 2] = 0; + $267 = HEAP32[757] | 0; + $268 = 1 << $I19$0; + if (!($267 & $268)) { + HEAP32[757] = $267 | $268; + HEAP32[$263 >> 2] = $$0; + HEAP32[$$0 + 24 >> 2] = $263; + HEAP32[$$0 + 12 >> 2] = $$0; + HEAP32[$$0 + 8 >> 2] = $$0; + return; + } + $275 = HEAP32[$263 >> 2] | 0; + L191 : do if ((HEAP32[$275 + 4 >> 2] & -8 | 0) == ($$1 | 0)) $T$0$lcssa = $275; else { + $K20$043 = $$1 << (($I19$0 | 0) == 31 ? 0 : 25 - ($I19$0 >>> 1) | 0); + $T$042 = $275; + while (1) { + $292 = $T$042 + 16 + ($K20$043 >>> 31 << 2) | 0; + $287 = HEAP32[$292 >> 2] | 0; + if (!$287) { + $$lcssa = $292; + $T$042$lcssa = $T$042; + break; + } + if ((HEAP32[$287 + 4 >> 2] & -8 | 0) == ($$1 | 0)) { + $T$0$lcssa = $287; + break L191; + } else { + $K20$043 = $K20$043 << 1; + $T$042 = $287; + } + } + if ($$lcssa >>> 0 < (HEAP32[760] | 0) >>> 0) _abort(); + HEAP32[$$lcssa >> 2] = $$0; + HEAP32[$$0 + 24 >> 2] = $T$042$lcssa; + HEAP32[$$0 + 12 >> 2] = $$0; + HEAP32[$$0 + 8 >> 2] = $$0; + return; + } while (0); + $299 = $T$0$lcssa + 8 | 0; + $300 = HEAP32[$299 >> 2] | 0; + $301 = HEAP32[760] | 0; + if (!($300 >>> 0 >= $301 >>> 0 & $T$0$lcssa >>> 0 >= $301 >>> 0)) _abort(); + HEAP32[$300 + 12 >> 2] = $$0; + HEAP32[$299 >> 2] = $$0; + HEAP32[$$0 + 8 >> 2] = $300; + HEAP32[$$0 + 12 >> 2] = $T$0$lcssa; + HEAP32[$$0 + 24 >> 2] = 0; + return; +} + +function __ZN10__cxxabiv112_GLOBAL__N_120parse_template_paramINS0_2DbEEEPKcS4_S4_RT_($first, $last, $db) { + $first = $first | 0; + $last = $last | 0; + $db = $db | 0; + var $$0 = 0, $$0$i$i$i = 0, $$0$i$i$i15 = 0, $$0$i$i$i7 = 0, $$0$i$i$i9 = 0, $$0$i$i58 = 0, $$lcssa81 = 0, $0 = 0, $1 = 0, $10 = 0, $101 = 0, $103 = 0, $107 = 0, $114 = 0, $116 = 0, $117 = 0, $118 = 0, $119 = 0, $120 = 0, $122 = 0, $125 = 0, $133 = 0, $134 = 0, $135 = 0, $138 = 0, $141 = 0, $148 = 0, $15 = 0, $150 = 0, $157 = 0, $158 = 0, $167 = 0, $168 = 0, $170 = 0, $177 = 0, $178 = 0, $179 = 0, $18 = 0, $180 = 0, $184 = 0, $186 = 0, $189 = 0, $190 = 0, $2 = 0, $22 = 0, $24 = 0, $25 = 0, $26 = 0, $27 = 0, $28 = 0, $30 = 0, $33 = 0, $4 = 0, $41 = 0, $42 = 0, $43 = 0, $46 = 0, $49 = 0, $56 = 0, $58 = 0, $61 = 0, $62 = 0, $64 = 0, $71 = 0, $72 = 0, $73 = 0, $74 = 0, $78 = 0, $80 = 0, $83 = 0, $84 = 0, $89 = 0, $91 = 0, $__p$0$i$i57 = 0, $__p$0$ph$i$i = 0, $__v$i$i13 = 0, $isdigittmp = 0, $isdigittmp4 = 0, $sub$061 = 0, $sub$061$lcssa = 0, $t1$060 = 0, $t1$060$lcssa = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 96 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $__v$i$i13 = sp + 64 | 0; + $0 = sp + 40 | 0; + $1 = sp + 16 | 0; + $2 = sp; + $4 = $first; + L1 : do if (($last - $4 | 0) > 1) if ((HEAP8[$first >> 0] | 0) == 84) { + $10 = HEAP8[$first + 1 >> 0] | 0; + if ($10 << 24 >> 24 == 95) { + $15 = HEAP32[$db + 36 >> 2] | 0; + if ((HEAP32[$db + 32 >> 2] | 0) == ($15 | 0)) { + $$0 = $first; + break; + } + $18 = HEAP32[$15 + -16 >> 2] | 0; + if (($18 | 0) == (HEAP32[$15 + -12 >> 2] | 0)) { + HEAP8[$0 >> 0] = 4; + $56 = $0 + 1 | 0; + HEAP8[$56 >> 0] = 84; + HEAP8[$56 + 1 >> 0] = 95; + HEAP8[$0 + 3 >> 0] = 0; + $58 = $0 + 12 | 0; + HEAP32[$58 >> 2] = 0; + HEAP32[$58 + 4 >> 2] = 0; + HEAP32[$58 + 8 >> 2] = 0; + $61 = $db + 4 | 0; + $62 = HEAP32[$61 >> 2] | 0; + $64 = HEAP32[$db + 8 >> 2] | 0; + if ($62 >>> 0 < $64 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($62, $0); + HEAP32[$61 >> 2] = (HEAP32[$61 >> 2] | 0) + 24; + } else { + $71 = HEAP32[$db >> 2] | 0; + $72 = $62 - $71 | 0; + $73 = ($72 | 0) / 24 | 0; + $74 = $73 + 1 | 0; + if (($72 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $78 = ($64 - $71 | 0) / 24 | 0; + if ($78 >>> 0 < 1073741823) { + $80 = $78 << 1; + $$0$i$i$i9 = $80 >>> 0 < $74 >>> 0 ? $74 : $80; + } else $$0$i$i$i9 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i13, $$0$i$i$i9, $73, $db + 12 | 0); + $83 = $__v$i$i13 + 8 | 0; + $84 = HEAP32[$83 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($84, $0); + HEAP32[$83 >> 2] = $84 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i13); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i13); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($0); + HEAP8[$db + 62 >> 0] = 1; + $$0 = $first + 2 | 0; + break; + } + $22 = HEAP32[$18 >> 2] | 0; + $24 = HEAP32[$18 + 4 >> 2] | 0; + $25 = $db + 4 | 0; + $26 = $db + 8 | 0; + $27 = $db + 12 | 0; + $28 = $__v$i$i13 + 8 | 0; + L20 : do if (($22 | 0) != ($24 | 0)) { + $33 = $22; + while (1) { + $30 = HEAP32[$25 >> 2] | 0; + if (($30 | 0) == (HEAP32[$26 >> 2] | 0)) { + $41 = $30 - (HEAP32[$db >> 2] | 0) | 0; + $42 = ($41 | 0) / 24 | 0; + $43 = $42 + 1 | 0; + if (($41 | 0) < -24) break; + if ($42 >>> 0 < 1073741823) { + $46 = $42 << 1; + $$0$i$i$i7 = $46 >>> 0 < $43 >>> 0 ? $43 : $46; + } else $$0$i$i$i7 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i13, $$0$i$i$i7, $42, $27); + $49 = HEAP32[$28 >> 2] | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEC2ERKS7_($49, $33); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEC2ERKS7_($49 + 12 | 0, $33 + 12 | 0); + HEAP32[$28 >> 2] = $49 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i13); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i13); + } else { + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEC2ERKS7_($30, $33); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEC2ERKS7_($30 + 12 | 0, $33 + 12 | 0); + HEAP32[$25 >> 2] = (HEAP32[$25 >> 2] | 0) + 24; + } + $33 = $33 + 24 | 0; + if (($33 | 0) == ($24 | 0)) break L20; + } + __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + } while (0); + $$0 = $first + 2 | 0; + break; + } + $isdigittmp = ($10 << 24 >> 24) + -48 | 0; + if ($isdigittmp >>> 0 < 10) { + $89 = $first + 2 | 0; + if (($89 | 0) == ($last | 0)) $$0 = $first; else { + $sub$061 = $isdigittmp; + $t1$060 = $89; + while (1) { + $91 = HEAP8[$t1$060 >> 0] | 0; + $isdigittmp4 = ($91 << 24 >> 24) + -48 | 0; + if ($isdigittmp4 >>> 0 >= 10) { + $$lcssa81 = $91; + $sub$061$lcssa = $sub$061; + $t1$060$lcssa = $t1$060; + break; + } + $t1$060 = $t1$060 + 1 | 0; + if (($t1$060 | 0) == ($last | 0)) { + $$0 = $first; + break L1; + } else $sub$061 = $isdigittmp4 + ($sub$061 * 10 | 0) | 0; + } + if ($$lcssa81 << 24 >> 24 == 95) { + $101 = HEAP32[$db + 36 >> 2] | 0; + if ((HEAP32[$db + 32 >> 2] | 0) == ($101 | 0)) $$0 = $first; else { + $103 = $sub$061$lcssa + 1 | 0; + $107 = HEAP32[$101 + -16 >> 2] | 0; + if ($103 >>> 0 < (HEAP32[$101 + -12 >> 2] | 0) - $107 >> 4 >>> 0) { + $114 = HEAP32[$107 + ($103 << 4) >> 2] | 0; + $116 = HEAP32[$107 + ($103 << 4) + 4 >> 2] | 0; + $117 = $db + 4 | 0; + $118 = $db + 8 | 0; + $119 = $db + 12 | 0; + $120 = $__v$i$i13 + 8 | 0; + L43 : do if (($114 | 0) != ($116 | 0)) { + $125 = $114; + while (1) { + $122 = HEAP32[$117 >> 2] | 0; + if (($122 | 0) == (HEAP32[$118 >> 2] | 0)) { + $133 = $122 - (HEAP32[$db >> 2] | 0) | 0; + $134 = ($133 | 0) / 24 | 0; + $135 = $134 + 1 | 0; + if (($133 | 0) < -24) break; + if ($134 >>> 0 < 1073741823) { + $138 = $134 << 1; + $$0$i$i$i15 = $138 >>> 0 < $135 >>> 0 ? $135 : $138; + } else $$0$i$i$i15 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i13, $$0$i$i$i15, $134, $119); + $141 = HEAP32[$120 >> 2] | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEC2ERKS7_($141, $125); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEC2ERKS7_($141 + 12 | 0, $125 + 12 | 0); + HEAP32[$120 >> 2] = $141 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i13); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i13); + } else { + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEC2ERKS7_($122, $125); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEC2ERKS7_($122 + 12 | 0, $125 + 12 | 0); + HEAP32[$117 >> 2] = (HEAP32[$117 >> 2] | 0) + 24; + } + $125 = $125 + 24 | 0; + if (($125 | 0) == ($116 | 0)) break L43; + } + __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + } while (0); + $$0 = $t1$060$lcssa + 1 | 0; + break; + } + $148 = $t1$060$lcssa + 1 | 0; + $150 = $148 - $4 | 0; + if ($150 >>> 0 > 4294967279) __ZNKSt3__121__basic_string_commonILb1EE20__throw_length_errorEv($2); + if ($150 >>> 0 < 11) { + HEAP8[$2 >> 0] = $150 << 1; + $__p$0$ph$i$i = $2 + 1 | 0; + } else { + $157 = $150 + 16 & -16; + $158 = _malloc($157) | 0; + HEAP32[$2 + 8 >> 2] = $158; + HEAP32[$2 >> 2] = $157 | 1; + HEAP32[$2 + 4 >> 2] = $150; + $__p$0$ph$i$i = $158; + } + if (($148 | 0) != ($first | 0)) { + $$0$i$i58 = $first; + $__p$0$i$i57 = $__p$0$ph$i$i; + while (1) { + HEAP8[$__p$0$i$i57 >> 0] = HEAP8[$$0$i$i58 >> 0] | 0; + if (($$0$i$i58 | 0) == ($t1$060$lcssa | 0)) break; else { + $$0$i$i58 = $$0$i$i58 + 1 | 0; + $__p$0$i$i57 = $__p$0$i$i57 + 1 | 0; + } + } + } + HEAP8[$__p$0$ph$i$i + $150 >> 0] = 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ENSt3__112basic_stringIcNS2_11char_traitsIcEENS0_12malloc_allocIcEEEE($1, $2); + $167 = $db + 4 | 0; + $168 = HEAP32[$167 >> 2] | 0; + $170 = HEAP32[$db + 8 >> 2] | 0; + if ($168 >>> 0 < $170 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($168, $1); + HEAP32[$167 >> 2] = (HEAP32[$167 >> 2] | 0) + 24; + } else { + $177 = HEAP32[$db >> 2] | 0; + $178 = $168 - $177 | 0; + $179 = ($178 | 0) / 24 | 0; + $180 = $179 + 1 | 0; + if (($178 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $184 = ($170 - $177 | 0) / 24 | 0; + if ($184 >>> 0 < 1073741823) { + $186 = $184 << 1; + $$0$i$i$i = $186 >>> 0 < $180 >>> 0 ? $180 : $186; + } else $$0$i$i$i = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i13, $$0$i$i$i, $179, $db + 12 | 0); + $189 = $__v$i$i13 + 8 | 0; + $190 = HEAP32[$189 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($190, $1); + HEAP32[$189 >> 2] = $190 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i13); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i13); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($1); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($2); + HEAP8[$db + 62 >> 0] = 1; + $$0 = $148; + } + } else $$0 = $first; + } + } else $$0 = $first; + } else $$0 = $first; else $$0 = $first; while (0); + STACKTOP = sp; + return $$0 | 0; +} + +function _get_matrix_code($data, $size, $code_out_p, $dir, $cf, $matrixCodeType, $errorCorrected) { + $data = $data | 0; + $size = $size | 0; + $code_out_p = $code_out_p | 0; + $dir = $dir | 0; + $cf = $cf | 0; + $matrixCodeType = $matrixCodeType | 0; + $errorCorrected = $errorCorrected | 0; + var $$ = 0, $$0 = 0, $$lcssa115 = 0, $$max$0 = 0, $$max$0$1 = 0, $$max$0$2 = 0, $1 = 0, $10 = 0, $100 = 0, $102 = 0, $103 = 0, $108 = 0, $109 = 0, $110 = 0, $120 = 0, $121 = 0, $122 = 0, $124 = 0, $125 = 0, $126 = 0, $130 = 0, $140 = 0, $144 = 0, $145 = 0, $146 = 0, $157 = 0, $158 = 0, $16 = 0, $163 = 0, $164 = 0, $165 = 0, $169 = 0, $182 = 0, $183 = 0, $184 = 0, $187 = 0, $193 = 0, $194 = 0, $197 = 0, $2 = 0, $206 = 0, $207 = 0, $211 = 0, $22 = 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, $28 = 0, $31 = 0, $32 = 0, $36 = 0, $4 = 0, $70 = 0, $83 = 0, $85 = 0, $86 = 0, $96 = 0, $98 = 0, $code = 0, $contrastMin$0$lcssa = 0, $contrastMin$098 = 0, $contrastMin$1 = 0, $corner = 0, $dirCode = 0, $exitcond64 = 0, $i$2102 = 0, $i$2102$lcssa = 0, $i$399 = 0, $i$465 = 0, $i$576 = 0, $i$680 = 0, $i$794 = 0, $j$067 = 0, $j$171 = 0, $j$285 = 0, $j$389 = 0, $min$1 = 0, $min$1$1 = 0, $min$1$2 = 0, $or$cond734 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 32 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $dirCode = sp + 24 | 0; + $corner = sp + 8 | 0; + $code = sp; + L1 : do if (($size + -3 | 0) >>> 0 > 5) { + HEAP32[$code_out_p >> 2] = -1; + HEAP32[$dir >> 2] = 0; + HEAPF64[$cf >> 3] = -1.0; + $$0 = -1; + } else { + HEAP32[$corner >> 2] = 0; + $1 = $size + -1 | 0; + $2 = Math_imul($1, $size) | 0; + HEAP32[$corner + 4 >> 2] = $2; + $4 = Math_imul($size, $size) | 0; + HEAP32[$corner + 8 >> 2] = $4 + -1; + HEAP32[$corner + 12 >> 2] = $1; + $10 = HEAP8[$data + (HEAP32[$corner >> 2] | 0) >> 0] | 0; + $$max$0 = ($10 & 255) > 0 ? $10 : 0; + $min$1 = ($10 & 255) < 255 ? $10 : -1; + $16 = HEAP8[$data + (HEAP32[$corner + 4 >> 2] | 0) >> 0] | 0; + $$max$0$1 = ($16 & 255) > ($$max$0 & 255) ? $16 : $$max$0; + $min$1$1 = ($16 & 255) < ($min$1 & 255) ? $16 : $min$1; + $22 = HEAP8[$data + (HEAP32[$corner + 8 >> 2] | 0) >> 0] | 0; + $$max$0$2 = ($22 & 255) > ($$max$0$1 & 255) ? $22 : $$max$0$1; + $min$1$2 = ($22 & 255) < ($min$1$1 & 255) ? $22 : $min$1$1; + $28 = HEAP8[$data + (HEAP32[$corner + 12 >> 2] | 0) >> 0] | 0; + $31 = (($28 & 255) > ($$max$0$2 & 255) ? $28 : $$max$0$2) & 255; + $32 = (($28 & 255) < ($min$1$2 & 255) ? $28 : $min$1$2) & 255; + if (($31 - $32 | 0) < 30) { + HEAP32[$code_out_p >> 2] = -1; + HEAP32[$dir >> 2] = 0; + HEAPF64[$cf >> 3] = -1.0; + $$0 = -2; + break; + } + $36 = ($31 + $32 | 0) >>> 1; + HEAP8[$dirCode >> 0] = (HEAPU8[$data + (HEAP32[$corner >> 2] | 0) >> 0] | 0) >>> 0 < $36 >>> 0 & 1; + HEAP8[$dirCode + 1 >> 0] = (HEAPU8[$data + (HEAP32[$corner + 4 >> 2] | 0) >> 0] | 0) >>> 0 < $36 >>> 0 & 1; + HEAP8[$dirCode + 2 >> 0] = (HEAPU8[$data + (HEAP32[$corner + 8 >> 2] | 0) >> 0] | 0) >>> 0 < $36 >>> 0 & 1; + HEAP8[$dirCode + 3 >> 0] = (HEAPU8[$data + (HEAP32[$corner + 12 >> 2] | 0) >> 0] | 0) >>> 0 < $36 >>> 0 & 1; + $i$2102 = 0; + while (1) { + $70 = $i$2102 + 1 | 0; + if ((HEAP8[$dirCode + $i$2102 >> 0] | 0) == 1) if ((HEAP8[$dirCode + (($70 | 0) % 4 | 0) >> 0] | 0) == 1) if (!(HEAP8[$dirCode + (($i$2102 + 2 | 0) % 4 | 0) >> 0] | 0)) { + $i$2102$lcssa = $i$2102; + label = 10; + break; + } + if (($70 | 0) < 4) $i$2102 = $70; else { + $$lcssa115 = $70; + label = 12; + break; + } + } + if ((label | 0) == 10) HEAP32[$dir >> 2] = $i$2102$lcssa; else if ((label | 0) == 12) if (($$lcssa115 | 0) == 4) { + HEAP32[$code_out_p >> 2] = -1; + HEAP32[$dir >> 2] = 0; + HEAPF64[$cf >> 3] = -1.0; + $$0 = -3; + break; + } + if (!$4) $contrastMin$0$lcssa = 255; else { + $contrastMin$098 = 255; + $i$399 = 0; + while (1) { + $83 = $data + $i$399 | 0; + $85 = HEAPU8[$83 >> 0] | 0; + $86 = $85 - $36 | 0; + $$ = ($86 | 0) < 0 ? 0 - $86 | 0 : $86; + $contrastMin$1 = ($$ | 0) < ($contrastMin$098 | 0) ? $$ : $contrastMin$098; + HEAP8[$83 >> 0] = $85 >>> 0 < $36 >>> 0 & 1; + $i$399 = $i$399 + 1 | 0; + if (($i$399 | 0) >= ($4 | 0)) { + $contrastMin$0$lcssa = $contrastMin$1; + break; + } else $contrastMin$098 = $contrastMin$1; + } + } + switch (HEAP32[$dir >> 2] | 0) { + case 0: + { + if (($size | 0) > 0) { + $exitcond64 = ($size | 0) == 0; + $227 = 0; + $228 = 0; + $j$067 = 0; + while (1) { + $102 = ($j$067 | 0) == ($1 | 0); + $103 = Math_imul($j$067, $size) | 0; + if ($exitcond64) { + $229 = $227; + $230 = $228; + } else { + $108 = $227; + $109 = $228; + $i$465 = 0; + while (1) { + if (!($i$465 | $j$067)) { + $231 = $108; + $232 = $109; + } else if ($102 & (($i$465 | 0) == 0 | ($i$465 | 0) == ($1 | 0))) { + $231 = $108; + $232 = $109; + } else { + $110 = _bitshift64Shl($108 | 0, $109 | 0, 1) | 0; + $231 = (HEAP8[$data + ($i$465 + $103) >> 0] | 0) != 0 | $110; + $232 = tempRet0; + } + $i$465 = $i$465 + 1 | 0; + if (($i$465 | 0) == ($size | 0)) { + $229 = $231; + $230 = $232; + break; + } else { + $108 = $231; + $109 = $232; + } + } + } + $j$067 = $j$067 + 1 | 0; + if (($j$067 | 0) >= ($size | 0)) { + $182 = $229; + $206 = $230; + break; + } else { + $227 = $229; + $228 = $230; + } + } + } else { + $182 = 0; + $206 = 0; + } + break; + } + case 1: + { + if (($size | 0) > 0) { + $100 = ($size | 0) > 0; + $225 = 0; + $226 = 0; + $i$576 = 0; + while (1) { + $120 = ($i$576 | 0) == 0; + $121 = ($i$576 | 0) == ($1 | 0); + if ($100) { + $124 = $225; + $125 = $226; + $j$171 = $1; + while (1) { + $122 = ($j$171 | 0) == ($1 | 0); + if ($120 & $122) { + $235 = $124; + $236 = $125; + } else if ($121 & ($122 | ($j$171 | 0) == 0)) { + $235 = $124; + $236 = $125; + } else { + $126 = _bitshift64Shl($124 | 0, $125 | 0, 1) | 0; + $130 = $data + ((Math_imul($j$171, $size) | 0) + $i$576) | 0; + $235 = (HEAP8[$130 >> 0] | 0) != 0 | $126; + $236 = tempRet0; + } + if (($j$171 | 0) > 0) { + $124 = $235; + $125 = $236; + $j$171 = $j$171 + -1 | 0; + } else { + $233 = $235; + $234 = $236; + break; + } + } + } else { + $233 = $225; + $234 = $226; + } + $i$576 = $i$576 + 1 | 0; + if (($i$576 | 0) >= ($size | 0)) { + $182 = $233; + $206 = $234; + break; + } else { + $225 = $233; + $226 = $234; + } + } + } else { + $182 = 0; + $206 = 0; + } + break; + } + case 2: + { + if (($size | 0) > 0) { + $98 = ($size | 0) > 0; + $223 = 0; + $224 = 0; + $j$285 = $1; + while (1) { + $or$cond734 = ($j$285 | 0) == ($1 | 0) | ($j$285 | 0) == 0; + $140 = Math_imul($j$285, $size) | 0; + if ($98) { + $144 = $223; + $145 = $224; + $i$680 = $1; + while (1) { + if ($or$cond734 & ($i$680 | 0) == ($1 | 0) | ($i$680 | $j$285 | 0) == 0) { + $239 = $144; + $240 = $145; + } else { + $146 = _bitshift64Shl($144 | 0, $145 | 0, 1) | 0; + $239 = (HEAP8[$data + ($i$680 + $140) >> 0] | 0) != 0 | $146; + $240 = tempRet0; + } + if (($i$680 | 0) > 0) { + $144 = $239; + $145 = $240; + $i$680 = $i$680 + -1 | 0; + } else { + $237 = $239; + $238 = $240; + break; + } + } + } else { + $237 = $223; + $238 = $224; + } + if (($j$285 | 0) > 0) { + $223 = $237; + $224 = $238; + $j$285 = $j$285 + -1 | 0; + } else { + $182 = $237; + $206 = $238; + break; + } + } + } else { + $182 = 0; + $206 = 0; + } + break; + } + case 3: + { + if (($size | 0) > 0) { + $96 = ($size | 0) > 0; + $221 = 0; + $222 = 0; + $i$794 = $1; + while (1) { + $157 = ($i$794 | 0) == ($1 | 0); + $158 = ($i$794 | 0) == 0; + if ($96) { + $163 = $221; + $164 = $222; + $j$389 = 0; + while (1) { + if ($157 & ($j$389 | 0) == 0 | ($j$389 | $i$794 | 0) == 0 | $158 & ($j$389 | 0) == ($1 | 0)) { + $243 = $163; + $244 = $164; + } else { + $165 = _bitshift64Shl($163 | 0, $164 | 0, 1) | 0; + $169 = $data + ((Math_imul($j$389, $size) | 0) + $i$794) | 0; + $243 = (HEAP8[$169 >> 0] | 0) != 0 | $165; + $244 = tempRet0; + } + $j$389 = $j$389 + 1 | 0; + if (($j$389 | 0) >= ($size | 0)) { + $241 = $243; + $242 = $244; + break; + } else { + $163 = $243; + $164 = $244; + } + } + } else { + $241 = $221; + $242 = $222; + } + if (($i$794 | 0) > 0) { + $221 = $241; + $222 = $242; + $i$794 = $i$794 + -1 | 0; + } else { + $182 = $241; + $206 = $242; + break; + } + } + } else { + $182 = 0; + $206 = 0; + } + break; + } + default: + { + $182 = 0; + $206 = 0; + } + } + HEAPF64[$cf >> 3] = ($contrastMin$0$lcssa | 0) > 30 ? 1.0 : +($contrastMin$0$lcssa | 0) / 30.0; + switch ($matrixCodeType | 0) { + case 259: + { + $183 = HEAP8[4551 + $182 >> 0] | 0; + $184 = $183 << 24 >> 24; + $187 = $code; + HEAP32[$187 >> 2] = $184; + HEAP32[$187 + 4 >> 2] = (($184 | 0) < 0) << 31 >> 31; + if ($183 << 24 >> 24 < 0) { + HEAP32[$code_out_p >> 2] = -1; + HEAPF64[$cf >> 3] = -1.0; + $$0 = -4; + break L1; + } + break; + } + case 515: + { + $193 = HEAP8[4423 + $182 >> 0] | 0; + $194 = $193 << 24 >> 24; + $197 = $code; + HEAP32[$197 >> 2] = $194; + HEAP32[$197 + 4 >> 2] = (($194 | 0) < 0) << 31 >> 31; + if ($errorCorrected) HEAP32[$errorCorrected >> 2] = HEAPU8[4487 + $182 >> 0]; + if ($193 << 24 >> 24 < 0) { + HEAP32[$code_out_p >> 2] = -1; + HEAPF64[$cf >> 3] = -1.0; + $$0 = -4; + break L1; + } + break; + } + case 772: + case 1028: + { + $207 = _decode_bch($matrixCodeType, $182, $206, 0, $code) | 0; + if (($207 | 0) < 0) { + HEAP32[$code_out_p >> 2] = -1; + HEAPF64[$cf >> 3] = -1.0; + $$0 = -4; + break L1; + } + if (($errorCorrected | 0) != 0 & ($207 | 0) > 0) HEAP32[$errorCorrected >> 2] = $207; + break; + } + default: + { + $211 = $code; + HEAP32[$211 >> 2] = $182; + HEAP32[$211 + 4 >> 2] = $206; + } + } + HEAP32[$code_out_p >> 2] = HEAP32[$code >> 2]; + $$0 = 0; + } while (0); + STACKTOP = sp; + return $$0 | 0; +} + +function _decode_bch($matrixCodeType, $0, $1, $recd127, $out_p) { + $matrixCodeType = $matrixCodeType | 0; + $0 = $0 | 0; + $1 = $1 | 0; + $recd127 = $recd127 | 0; + $out_p = $out_p | 0; + var $$ = 0, $$0 = 0, $$lcssa24 = 0, $$lcssa76 = 0, $$lcssa77 = 0, $$pre$phi$lcssaZ2D = 0, $$pre$phiZ2D = 0, $$sink = 0, $10 = 0, $100 = 0, $101 = 0, $102 = 0, $11 = 0, $110 = 0, $114 = 0, $118 = 0, $122 = 0, $125 = 0, $133 = 0, $134 = 0, $143 = 0, $154 = 0, $155 = 0, $156 = 0, $159 = 0, $17 = 0, $175 = 0, $182 = 0, $19 = 0, $190 = 0, $191 = 0, $192 = 0, $194 = 0, $195 = 0, $198 = 0, $20 = 0, $208 = 0, $209 = 0, $28 = 0, $3 = 0, $30 = 0, $41 = 0, $43 = 0, $44 = 0, $46 = 0, $48 = 0, $49 = 0, $58 = 0, $6 = 0, $71 = 0, $73 = 0, $74 = 0, $76 = 0, $78 = 0, $79 = 0, $86 = 0, $alpha_to$0 = 0, $count$036 = 0, $count$1 = 0, $count$1$lcssa = 0, $d = 0, $elp = 0, $i$066 = 0, $i$1035 = 0, $i$1130 = 0, $i$1228 = 0, $i$159 = 0, $i$254 = 0, $i$347 = 0, $i$441 = 0, $i$543 = 0, $i$645 = 0, $i$750 = 0, $i$839 = 0, $i$937 = 0, $index_of$0 = 0, $j$058 = 0, $j$1 = 0, $j$232 = 0, $k$0 = 0, $k$1 = 0, $l = 0, $length$0 = 0, $loc = 0, $n$0 = 0, $q$0 = 0, $q$1 = 0, $q$2 = 0, $q$3 = 0, $q$4$lcssa = 0, $q$433 = 0, $q$5 = 0, $recd$0 = 0, $recd15 = 0, $reg = 0, $s = 0, $syn_error$0$ = 0, $syn_error$0$$lcssa = 0, $syn_error$060 = 0, $t$0 = 0, $t$1 = 0, $u$0 = 0, $u$1 = 0, $u_lu = 0, label = 0, sp = 0, $j$1$looptemp = 0, $u$0$looptemp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 2320 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $recd15 = sp + 2304 | 0; + $elp = sp + 864 | 0; + $d = sp + 784 | 0; + $l = sp + 704 | 0; + $u_lu = sp + 624 | 0; + $s = sp + 548 | 0; + $loc = sp + 40 | 0; + $reg = sp; + switch ($matrixCodeType | 0) { + case 772: + { + $k$0 = 9; + $t$0 = 1; + label = 3; + break; + } + case 1028: + { + $k$0 = 5; + $t$0 = 2; + label = 3; + break; + } + case 2830: + { + $alpha_to$0 = 900; + $index_of$0 = 1472; + $k$1 = 64; + $length$0 = 120; + $n$0 = 127; + $recd$0 = $recd127; + $t$1 = 9; + label = 6; + break; + } + default: + $$0 = -1; + } + if ((label | 0) == 3) { + $3 = $0; + $6 = $1; + $i$066 = 0; + while (1) { + HEAP8[$recd15 + $i$066 >> 0] = $3 & 1; + $3 = _bitshift64Lshr($3 | 0, $6 | 0, 1) | 0; + $i$066 = $i$066 + 1 | 0; + if (($i$066 | 0) == 13) break; else $6 = tempRet0; + } + $alpha_to$0 = 840; + $index_of$0 = 1408; + $k$1 = $k$0; + $length$0 = 13; + $n$0 = 15; + $recd$0 = $recd15; + $t$1 = $t$0; + label = 6; + } + do if ((label | 0) == 6) { + $10 = $t$1 << 1; + $i$159 = 1; + $syn_error$060 = 0; + while (1) { + $11 = $s + ($i$159 << 2) | 0; + HEAP32[$11 >> 2] = 0; + $20 = 0; + $j$058 = 0; + while (1) { + if (!(HEAP8[$recd$0 + $j$058 >> 0] | 0)) $208 = $20; else { + $17 = $alpha_to$0 + (((Math_imul($j$058, $i$159) | 0) % ($n$0 | 0) | 0) << 2) | 0; + $19 = $20 ^ HEAP32[$17 >> 2]; + HEAP32[$11 >> 2] = $19; + $208 = $19; + } + $j$058 = $j$058 + 1 | 0; + if (($j$058 | 0) >= ($length$0 | 0)) { + $$lcssa77 = $208; + break; + } else $20 = $208; + } + $syn_error$0$ = ($$lcssa77 | 0) == 0 ? $syn_error$060 : 1; + HEAP32[$11 >> 2] = HEAP32[$index_of$0 + ($$lcssa77 << 2) >> 2]; + if (($i$159 | 0) < ($10 | 0)) { + $i$159 = $i$159 + 1 | 0; + $syn_error$060 = $syn_error$0$; + } else { + $syn_error$0$$lcssa = $syn_error$0$; + break; + } + } + $28 = ($syn_error$0$$lcssa | 0) != 0; + if ($28) { + HEAP32[$d >> 2] = 0; + $30 = HEAP32[$s + 4 >> 2] | 0; + HEAP32[$d + 4 >> 2] = $30; + HEAP32[$elp >> 2] = 0; + HEAP32[$elp + 72 >> 2] = 1; + if (($10 | 0) > 1) { + $i$254 = 1; + do { + HEAP32[$elp + ($i$254 << 2) >> 2] = -1; + HEAP32[$elp + 72 + ($i$254 << 2) >> 2] = 0; + $i$254 = $i$254 + 1 | 0; + } while (($i$254 | 0) < ($10 | 0)); + } + HEAP32[$l >> 2] = 0; + HEAP32[$l + 4 >> 2] = 0; + HEAP32[$u_lu >> 2] = -1; + HEAP32[$u_lu + 4 >> 2] = 0; + $43 = $30; + $46 = 0; + $u$0 = 0; + while (1) { + $u$0$looptemp = $u$0; + $u$0 = $u$0 + 1 | 0; + $41 = $d + ($u$0 << 2) | 0; + if (($43 | 0) == -1) { + $44 = $u$0$looptemp + 2 | 0; + HEAP32[$l + ($44 << 2) >> 2] = $46; + if (($46 | 0) < 0) { + $$pre$phiZ2D = $44; + $110 = $46; + } else { + $i$347 = 0; + while (1) { + $48 = $elp + ($u$0 * 72 | 0) + ($i$347 << 2) | 0; + $49 = HEAP32[$48 >> 2] | 0; + HEAP32[$elp + ($44 * 72 | 0) + ($i$347 << 2) >> 2] = $49; + HEAP32[$48 >> 2] = HEAP32[$index_of$0 + ($49 << 2) >> 2]; + if (($i$347 | 0) < ($46 | 0)) $i$347 = $i$347 + 1 | 0; else { + $$pre$phiZ2D = $44; + $110 = $46; + break; + } + } + } + } else { + $q$0 = $u$0$looptemp; + while (1) { + $58 = ($q$0 | 0) > 0; + if ($58 & (HEAP32[$d + ($q$0 << 2) >> 2] | 0) == -1) $q$0 = $q$0 + -1 | 0; else break; + } + if ($58) { + $j$1 = $q$0; + $q$1 = $q$0; + while (1) { + $j$1$looptemp = $j$1; + $j$1 = $j$1 + -1 | 0; + if ((HEAP32[$d + ($j$1 << 2) >> 2] | 0) == -1) $q$2 = $q$1; else $q$2 = (HEAP32[$u_lu + ($q$1 << 2) >> 2] | 0) < (HEAP32[$u_lu + ($j$1 << 2) >> 2] | 0) ? $j$1 : $q$1; + if (($j$1$looptemp | 0) <= 1) { + $q$3 = $q$2; + break; + } else $q$1 = $q$2; + } + } else $q$3 = $q$0; + $71 = $l + ($q$3 << 2) | 0; + $73 = $u$0 - $q$3 | 0; + $74 = $73 + (HEAP32[$71 >> 2] | 0) | 0; + $76 = $u$0$looptemp + 2 | 0; + $$ = ($46 | 0) > ($74 | 0) ? $46 : $74; + HEAP32[$l + ($76 << 2) >> 2] = $$; + $i$441 = 0; + do { + HEAP32[$elp + ($76 * 72 | 0) + ($i$441 << 2) >> 2] = 0; + $i$441 = $i$441 + 1 | 0; + } while (($i$441 | 0) < ($10 | 0)); + $78 = HEAP32[$71 >> 2] | 0; + $79 = $d + ($q$3 << 2) | 0; + if (($78 | 0) >= 0) { + $i$543 = 0; + while (1) { + $86 = HEAP32[$elp + ($q$3 * 72 | 0) + ($i$543 << 2) >> 2] | 0; + if (($86 | 0) != -1) HEAP32[$elp + ($76 * 72 | 0) + ($73 + $i$543 << 2) >> 2] = HEAP32[$alpha_to$0 + ((($86 + $n$0 + (HEAP32[$41 >> 2] | 0) - (HEAP32[$79 >> 2] | 0) | 0) % ($n$0 | 0) | 0) << 2) >> 2]; + if (($i$543 | 0) < ($78 | 0)) $i$543 = $i$543 + 1 | 0; else break; + } + } + if (($46 | 0) < 0) { + $$pre$phiZ2D = $76; + $110 = $$; + } else { + $i$645 = 0; + while (1) { + $100 = $elp + ($u$0 * 72 | 0) + ($i$645 << 2) | 0; + $101 = HEAP32[$100 >> 2] | 0; + $102 = $elp + ($76 * 72 | 0) + ($i$645 << 2) | 0; + HEAP32[$102 >> 2] = HEAP32[$102 >> 2] ^ $101; + HEAP32[$100 >> 2] = HEAP32[$index_of$0 + ($101 << 2) >> 2]; + if (($i$645 | 0) < ($46 | 0)) $i$645 = $i$645 + 1 | 0; else { + $$pre$phiZ2D = $76; + $110 = $$; + break; + } + } + } + } + HEAP32[$u_lu + ($$pre$phiZ2D << 2) >> 2] = $u$0 - $110; + if (($u$0 | 0) >= ($10 | 0)) { + $$lcssa76 = $110; + $$pre$phi$lcssaZ2D = $$pre$phiZ2D; + break; + } + $114 = HEAP32[$s + ($$pre$phiZ2D << 2) >> 2] | 0; + if (($114 | 0) == -1) $$sink = 0; else $$sink = HEAP32[$alpha_to$0 + ($114 << 2) >> 2] | 0; + $118 = $d + ($$pre$phiZ2D << 2) | 0; + HEAP32[$118 >> 2] = $$sink; + if (($110 | 0) < 1) $$lcssa24 = $$sink; else { + $134 = $$sink; + $i$750 = 1; + while (1) { + $122 = HEAP32[$s + ($$pre$phiZ2D - $i$750 << 2) >> 2] | 0; + if (($122 | 0) == -1) $209 = $134; else { + $125 = HEAP32[$elp + ($$pre$phiZ2D * 72 | 0) + ($i$750 << 2) >> 2] | 0; + if (!$125) $209 = $134; else { + $133 = $134 ^ HEAP32[$alpha_to$0 + ((((HEAP32[$index_of$0 + ($125 << 2) >> 2] | 0) + $122 | 0) % ($n$0 | 0) | 0) << 2) >> 2]; + HEAP32[$118 >> 2] = $133; + $209 = $133; + } + } + if (($i$750 | 0) < ($110 | 0)) { + $134 = $209; + $i$750 = $i$750 + 1 | 0; + } else { + $$lcssa24 = $209; + break; + } + } + } + $43 = HEAP32[$index_of$0 + ($$lcssa24 << 2) >> 2] | 0; + HEAP32[$118 >> 2] = $43; + if (($110 | 0) > ($t$1 | 0)) { + $$lcssa76 = $110; + $$pre$phi$lcssaZ2D = $$pre$phiZ2D; + break; + } else $46 = $110; + } + if (($$lcssa76 | 0) > ($t$1 | 0)) { + $$0 = -1; + break; + } + if (($$lcssa76 | 0) >= 0) { + $i$839 = 0; + while (1) { + $143 = $elp + ($$pre$phi$lcssaZ2D * 72 | 0) + ($i$839 << 2) | 0; + HEAP32[$143 >> 2] = HEAP32[$index_of$0 + (HEAP32[$143 >> 2] << 2) >> 2]; + if (($i$839 | 0) < ($$lcssa76 | 0)) $i$839 = $i$839 + 1 | 0; else break; + } + } + if (($$lcssa76 | 0) >= 1) { + $i$937 = 1; + while (1) { + HEAP32[$reg + ($i$937 << 2) >> 2] = HEAP32[$elp + ($$pre$phi$lcssaZ2D * 72 | 0) + ($i$937 << 2) >> 2]; + if (($i$937 | 0) < ($$lcssa76 | 0)) $i$937 = $i$937 + 1 | 0; else break; + } + } + $154 = ($$lcssa76 | 0) < 1; + $count$036 = 0; + $i$1035 = 1; + while (1) { + if ($154) $q$4$lcssa = 1; else { + $j$232 = 1; + $q$433 = 1; + while (1) { + $155 = $reg + ($j$232 << 2) | 0; + $156 = HEAP32[$155 >> 2] | 0; + if (($156 | 0) == -1) $q$5 = $q$433; else { + $159 = ($156 + $j$232 | 0) % ($n$0 | 0) | 0; + HEAP32[$155 >> 2] = $159; + $q$5 = HEAP32[$alpha_to$0 + ($159 << 2) >> 2] ^ $q$433; + } + if (($j$232 | 0) < ($$lcssa76 | 0)) { + $j$232 = $j$232 + 1 | 0; + $q$433 = $q$5; + } else { + $q$4$lcssa = $q$5; + break; + } + } + } + if (!$q$4$lcssa) { + HEAP32[$loc + ($count$036 << 2) >> 2] = $n$0 - $i$1035; + $count$1 = $count$036 + 1 | 0; + } else $count$1 = $count$036; + $i$1035 = $i$1035 + 1 | 0; + if (($n$0 | 0) < ($i$1035 | 0)) { + $count$1$lcssa = $count$1; + break; + } else $count$036 = $count$1; + } + if (($count$1$lcssa | 0) != ($$lcssa76 | 0)) { + $$0 = -1; + break; + } + if (($$lcssa76 | 0) > 0) { + $i$1130 = 0; + do { + $175 = $recd$0 + (HEAP32[$loc + ($i$1130 << 2) >> 2] | 0) | 0; + HEAP8[$175 >> 0] = HEAPU8[$175 >> 0] ^ 1; + $i$1130 = $i$1130 + 1 | 0; + } while (($i$1130 | 0) < ($$lcssa76 | 0)); + $u$1 = $$pre$phi$lcssaZ2D; + } else $u$1 = $$pre$phi$lcssaZ2D; + } else $u$1 = 0; + $182 = $out_p; + HEAP32[$182 >> 2] = 0; + HEAP32[$182 + 4 >> 2] = 0; + $190 = 1; + $191 = 0; + $194 = 0; + $195 = 0; + $i$1228 = $length$0 - $k$1 | 0; + while (1) { + $192 = ___muldi3(HEAPU8[$recd$0 + $i$1228 >> 0] | 0, 0, $190 | 0, $191 | 0) | 0; + $194 = _i64Add($192 | 0, tempRet0 | 0, $194 | 0, $195 | 0) | 0; + $195 = tempRet0; + $198 = $out_p; + HEAP32[$198 >> 2] = $194; + HEAP32[$198 + 4 >> 2] = $195; + $190 = _bitshift64Shl($190 | 0, $191 | 0, 1) | 0; + $i$1228 = $i$1228 + 1 | 0; + if (($i$1228 | 0) >= ($length$0 | 0)) break; else $191 = tempRet0; + } + if ($28) $$0 = HEAP32[$l + ($u$1 << 2) >> 2] | 0; else $$0 = 0; + } while (0); + STACKTOP = sp; + return $$0 | 0; +} + +function __ZN10__cxxabiv112_GLOBAL__N_121parse_unresolved_typeINS0_2DbEEEPKcS4_S4_RT_($first, $last, $db) { + $first = $first | 0; + $last = $last | 0; + $db = $db | 0; + var $$0$i$i$i = 0, $$0$i$i$i11 = 0, $$0$i$i$i6 = 0, $$02 = 0, $0 = 0, $1 = 0, $103 = 0, $105 = 0, $113 = 0, $114 = 0, $115 = 0, $116 = 0, $119 = 0, $122 = 0, $125 = 0, $126 = 0, $132 = 0, $134 = 0, $138 = 0, $147 = 0, $148 = 0, $15 = 0, $151 = 0, $152 = 0, $155 = 0, $157 = 0, $16 = 0, $160 = 0, $161 = 0, $163 = 0, $17 = 0, $170 = 0, $172 = 0, $180 = 0, $181 = 0, $182 = 0, $183 = 0, $186 = 0, $189 = 0, $192 = 0, $193 = 0, $199 = 0, $2 = 0, $201 = 0, $22 = 0, $27 = 0, $3 = 0, $31 = 0, $32 = 0, $34 = 0, $4 = 0, $41 = 0, $43 = 0, $5 = 0, $51 = 0, $52 = 0, $53 = 0, $54 = 0, $57 = 0, $60 = 0, $63 = 0, $64 = 0, $70 = 0, $72 = 0, $77 = 0, $78 = 0, $79 = 0, $83 = 0, $87 = 0, $89 = 0, $9 = 0, $93 = 0, $94 = 0, $96 = 0, $__v$i$i10 = 0, $k1$015 = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 96 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $__v$i$i10 = sp + 72 | 0; + $0 = sp + 56 | 0; + $1 = sp + 48 | 0; + $2 = sp + 32 | 0; + $3 = sp + 24 | 0; + $4 = sp + 8 | 0; + $5 = sp; + L1 : do if (($first | 0) == ($last | 0)) $$02 = $first; else switch (HEAP8[$first >> 0] | 0) { + case 84: + { + $9 = $db + 4 | 0; + $15 = ((HEAP32[$9 >> 2] | 0) - (HEAP32[$db >> 2] | 0) | 0) / 24 | 0; + $16 = __ZN10__cxxabiv112_GLOBAL__N_120parse_template_paramINS0_2DbEEEPKcS4_S4_RT_($first, $last, $db) | 0; + $17 = HEAP32[$9 >> 2] | 0; + $22 = ($17 - (HEAP32[$db >> 2] | 0) | 0) / 24 | 0; + if (!(($16 | 0) != ($first | 0) & ($22 | 0) == ($15 + 1 | 0))) { + if (($22 | 0) == ($15 | 0)) { + $$02 = $first; + break L1; + } else { + $77 = $17; + $k1$015 = $22; + } + while (1) { + $79 = $77; + $77 = $77 + -24 | 0; + do { + $78 = $79 + -24 | 0; + HEAP32[$9 >> 2] = $78; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($78); + $79 = HEAP32[$9 >> 2] | 0; + } while (($79 | 0) != ($77 | 0)); + $k1$015 = $k1$015 + -1 | 0; + if (($k1$015 | 0) == ($15 | 0)) { + $$02 = $first; + break L1; + } + } + } + $27 = $db + 16 | 0; + HEAP32[$1 >> 2] = HEAP32[$db + 12 >> 2]; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEEC2EjRKS3_RKS5_($0, $17 + -24 | 0, $1); + $31 = $db + 20 | 0; + $32 = HEAP32[$31 >> 2] | 0; + $34 = HEAP32[$db + 24 >> 2] | 0; + if ($32 >>> 0 < $34 >>> 0) { + HEAP32[$32 + 12 >> 2] = HEAP32[$0 + 12 >> 2]; + HEAP32[$32 >> 2] = HEAP32[$0 >> 2]; + $41 = $0 + 4 | 0; + HEAP32[$32 + 4 >> 2] = HEAP32[$41 >> 2]; + $43 = $0 + 8 | 0; + HEAP32[$32 + 8 >> 2] = HEAP32[$43 >> 2]; + HEAP32[$43 >> 2] = 0; + HEAP32[$41 >> 2] = 0; + HEAP32[$0 >> 2] = 0; + HEAP32[$31 >> 2] = (HEAP32[$31 >> 2] | 0) + 16; + } else { + $51 = HEAP32[$27 >> 2] | 0; + $52 = $32 - $51 | 0; + $53 = $52 >> 4; + $54 = $53 + 1 | 0; + if (($52 | 0) < -16) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($27); + $57 = $34 - $51 | 0; + if ($57 >> 4 >>> 0 < 1073741823) { + $60 = $57 >> 3; + $$0$i$i$i = $60 >>> 0 < $54 >>> 0 ? $54 : $60; + } else $$0$i$i$i = 2147483647; + __ZNSt3__114__split_bufferINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEERNS5_IS7_Lj4096EEEEC2EjjS9_($__v$i$i10, $$0$i$i$i, $53, $db + 28 | 0); + $63 = $__v$i$i10 + 8 | 0; + $64 = HEAP32[$63 >> 2] | 0; + HEAP32[$64 + 12 >> 2] = HEAP32[$0 + 12 >> 2]; + HEAP32[$64 >> 2] = HEAP32[$0 >> 2]; + $70 = $0 + 4 | 0; + HEAP32[$64 + 4 >> 2] = HEAP32[$70 >> 2]; + $72 = $0 + 8 | 0; + HEAP32[$64 + 8 >> 2] = HEAP32[$72 >> 2]; + HEAP32[$72 >> 2] = 0; + HEAP32[$70 >> 2] = 0; + HEAP32[$0 >> 2] = 0; + HEAP32[$63 >> 2] = $64 + 16; + __ZNSt3__16vectorINS0_IN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEEENS4_IS6_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS6_RS7_EE($27, $__v$i$i10); + __ZNSt3__114__split_bufferINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEERNS5_IS7_Lj4096EEEED2Ev($__v$i$i10); + } + __ZNSt3__113__vector_baseIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEED2Ev($0); + $$02 = $16; + break L1; + break; + } + case 68: + { + $83 = __ZN10__cxxabiv112_GLOBAL__N_114parse_decltypeINS0_2DbEEEPKcS4_S4_RT_($first, $last, $db) | 0; + if (($83 | 0) == ($first | 0)) { + $$02 = $first; + break L1; + } + $87 = HEAP32[$db + 4 >> 2] | 0; + if ((HEAP32[$db >> 2] | 0) == ($87 | 0)) { + $$02 = $first; + break L1; + } + $89 = $db + 16 | 0; + HEAP32[$3 >> 2] = HEAP32[$db + 12 >> 2]; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEEC2EjRKS3_RKS5_($2, $87 + -24 | 0, $3); + $93 = $db + 20 | 0; + $94 = HEAP32[$93 >> 2] | 0; + $96 = HEAP32[$db + 24 >> 2] | 0; + if ($94 >>> 0 < $96 >>> 0) { + HEAP32[$94 + 12 >> 2] = HEAP32[$2 + 12 >> 2]; + HEAP32[$94 >> 2] = HEAP32[$2 >> 2]; + $103 = $2 + 4 | 0; + HEAP32[$94 + 4 >> 2] = HEAP32[$103 >> 2]; + $105 = $2 + 8 | 0; + HEAP32[$94 + 8 >> 2] = HEAP32[$105 >> 2]; + HEAP32[$105 >> 2] = 0; + HEAP32[$103 >> 2] = 0; + HEAP32[$2 >> 2] = 0; + HEAP32[$93 >> 2] = (HEAP32[$93 >> 2] | 0) + 16; + } else { + $113 = HEAP32[$89 >> 2] | 0; + $114 = $94 - $113 | 0; + $115 = $114 >> 4; + $116 = $115 + 1 | 0; + if (($114 | 0) < -16) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($89); + $119 = $96 - $113 | 0; + if ($119 >> 4 >>> 0 < 1073741823) { + $122 = $119 >> 3; + $$0$i$i$i6 = $122 >>> 0 < $116 >>> 0 ? $116 : $122; + } else $$0$i$i$i6 = 2147483647; + __ZNSt3__114__split_bufferINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEERNS5_IS7_Lj4096EEEEC2EjjS9_($__v$i$i10, $$0$i$i$i6, $115, $db + 28 | 0); + $125 = $__v$i$i10 + 8 | 0; + $126 = HEAP32[$125 >> 2] | 0; + HEAP32[$126 + 12 >> 2] = HEAP32[$2 + 12 >> 2]; + HEAP32[$126 >> 2] = HEAP32[$2 >> 2]; + $132 = $2 + 4 | 0; + HEAP32[$126 + 4 >> 2] = HEAP32[$132 >> 2]; + $134 = $2 + 8 | 0; + HEAP32[$126 + 8 >> 2] = HEAP32[$134 >> 2]; + HEAP32[$134 >> 2] = 0; + HEAP32[$132 >> 2] = 0; + HEAP32[$2 >> 2] = 0; + HEAP32[$125 >> 2] = $126 + 16; + __ZNSt3__16vectorINS0_IN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEEENS4_IS6_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS6_RS7_EE($89, $__v$i$i10); + __ZNSt3__114__split_bufferINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEERNS5_IS7_Lj4096EEEED2Ev($__v$i$i10); + } + __ZNSt3__113__vector_baseIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEED2Ev($2); + $$02 = $83; + break L1; + break; + } + case 83: + { + $138 = __ZN10__cxxabiv112_GLOBAL__N_118parse_substitutionINS0_2DbEEEPKcS4_S4_RT_($first, $last, $db) | 0; + if (($138 | 0) != ($first | 0)) { + $$02 = $138; + break L1; + } + if (($last - $first | 0) <= 2) { + $$02 = $first; + break L1; + } + if ((HEAP8[$first + 1 >> 0] | 0) != 116) { + $$02 = $first; + break L1; + } + $147 = $first + 2 | 0; + $148 = __ZN10__cxxabiv112_GLOBAL__N_122parse_unqualified_nameINS0_2DbEEEPKcS4_S4_RT_($147, $last, $db) | 0; + if (($148 | 0) == ($147 | 0)) { + $$02 = $first; + break L1; + } + $151 = $db + 4 | 0; + $152 = HEAP32[$151 >> 2] | 0; + if ((HEAP32[$db >> 2] | 0) == ($152 | 0)) { + $$02 = $first; + break L1; + } + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc($152 + -24 | 0, 0, 12922) | 0; + $155 = $db + 16 | 0; + $157 = (HEAP32[$151 >> 2] | 0) + -24 | 0; + HEAP32[$5 >> 2] = HEAP32[$db + 12 >> 2]; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEEC2EjRKS3_RKS5_($4, $157, $5); + $160 = $db + 20 | 0; + $161 = HEAP32[$160 >> 2] | 0; + $163 = HEAP32[$db + 24 >> 2] | 0; + if ($161 >>> 0 < $163 >>> 0) { + HEAP32[$161 + 12 >> 2] = HEAP32[$4 + 12 >> 2]; + HEAP32[$161 >> 2] = HEAP32[$4 >> 2]; + $170 = $4 + 4 | 0; + HEAP32[$161 + 4 >> 2] = HEAP32[$170 >> 2]; + $172 = $4 + 8 | 0; + HEAP32[$161 + 8 >> 2] = HEAP32[$172 >> 2]; + HEAP32[$172 >> 2] = 0; + HEAP32[$170 >> 2] = 0; + HEAP32[$4 >> 2] = 0; + HEAP32[$160 >> 2] = (HEAP32[$160 >> 2] | 0) + 16; + } else { + $180 = HEAP32[$155 >> 2] | 0; + $181 = $161 - $180 | 0; + $182 = $181 >> 4; + $183 = $182 + 1 | 0; + if (($181 | 0) < -16) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($155); + $186 = $163 - $180 | 0; + if ($186 >> 4 >>> 0 < 1073741823) { + $189 = $186 >> 3; + $$0$i$i$i11 = $189 >>> 0 < $183 >>> 0 ? $183 : $189; + } else $$0$i$i$i11 = 2147483647; + __ZNSt3__114__split_bufferINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEERNS5_IS7_Lj4096EEEEC2EjjS9_($__v$i$i10, $$0$i$i$i11, $182, $db + 28 | 0); + $192 = $__v$i$i10 + 8 | 0; + $193 = HEAP32[$192 >> 2] | 0; + HEAP32[$193 + 12 >> 2] = HEAP32[$4 + 12 >> 2]; + HEAP32[$193 >> 2] = HEAP32[$4 >> 2]; + $199 = $4 + 4 | 0; + HEAP32[$193 + 4 >> 2] = HEAP32[$199 >> 2]; + $201 = $4 + 8 | 0; + HEAP32[$193 + 8 >> 2] = HEAP32[$201 >> 2]; + HEAP32[$201 >> 2] = 0; + HEAP32[$199 >> 2] = 0; + HEAP32[$4 >> 2] = 0; + HEAP32[$192 >> 2] = $193 + 16; + __ZNSt3__16vectorINS0_IN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEEENS4_IS6_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS6_RS7_EE($155, $__v$i$i10); + __ZNSt3__114__split_bufferINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEERNS5_IS7_Lj4096EEEED2Ev($__v$i$i10); + } + __ZNSt3__113__vector_baseIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEED2Ev($4); + $$02 = $148; + break L1; + break; + } + default: + { + $$02 = $first; + break L1; + } + } while (0); + STACKTOP = sp; + return $$02 | 0; +} + +function _arDetectMarker2($xsize, $ysize, $labelInfo, $imageProcMode, $areaMax, $areaMin, $squareFitThresh, $markerInfo2, $marker2_num) { + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $labelInfo = $labelInfo | 0; + $imageProcMode = $imageProcMode | 0; + $areaMax = $areaMax | 0; + $areaMin = $areaMin | 0; + $squareFitThresh = +$squareFitThresh; + $markerInfo2 = $markerInfo2 | 0; + $marker2_num = $marker2_num | 0; + var $$0 = 0, $$01 = 0, $$02 = 0, $$03 = 0, $$lcssa = 0, $$lcssa15 = 0, $$lcssa16 = 0, $$lcssa17 = 0, $$ph = 0, $$pre10 = 0, $$pre9 = 0, $0 = 0, $115 = 0, $12 = 0, $120 = 0, $129 = 0, $13 = 0, $130 = 0, $132 = 0, $133 = 0.0, $136 = 0.0, $141 = 0.0, $143 = 0.0, $144 = 0, $145 = 0, $146 = 0, $16 = 0, $160 = 0, $164 = 0, $167 = 0, $171 = 0, $174 = 0, $177 = 0, $180 = 0, $183 = 0, $34 = 0, $35 = 0, $36 = 0, $37 = 0, $38 = 0, $39 = 0, $40 = 0, $42 = 0, $46 = 0, $47 = 0, $5 = 0, $50 = 0, $52 = 0, $53 = 0, $59 = 0.0, $6 = 0, $66 = 0, $68 = 0, $7 = 0, $74 = 0, $8 = 0, $90 = 0, $dmax$0$i38 = 0, $i$0$i39 = 0, $i$0$v1$0$i = 0, $i$044 = 0, $i$134 = 0, $i$227 = 0, $i$321 = 0, $j$030 = 0, $j$1 = 0, $j$1$in24 = 0, $j$1$in24$phi = 0, $j$123 = 0, $j$125 = 0, $j$218 = 0, $pm$019 = 0, $v1$0$i$lcssa = 0, $v1$0$i37 = 0, $vertex$sroa$12$0$i = 0, $vertex$sroa$4$0$i = 0, $vertex$sroa$8$0$i = 0, $wv1$i = 0, $wv2$i = 0, $wvnum1$i = 0, $wvnum2$i = 0, label = 0, sp = 0, $i$134$looptemp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 96 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $wv1$i = sp + 56 | 0; + $wvnum1$i = sp + 48 | 0; + $wv2$i = sp + 8 | 0; + $wvnum2$i = sp; + $0 = ($imageProcMode | 0) == 1; + if ($0) { + $$0 = ($xsize | 0) / 2 | 0; + $$01 = ($ysize | 0) / 2 | 0; + $$02 = ($areaMax | 0) / 4 | 0; + $$03 = ($areaMin | 0) / 4 | 0; + } else { + $$0 = $xsize; + $$01 = $ysize; + $$02 = $areaMax; + $$03 = $areaMin; + } + HEAP32[$marker2_num >> 2] = 0; + $5 = $labelInfo + 8 | 0; + $6 = $$0 + -2 | 0; + $7 = $$01 + -2 | 0; + $8 = $labelInfo + 1179664 | 0; + L4 : do if ((HEAP32[$5 >> 2] | 0) > 0) { + $i$044 = 0; + while (1) { + $12 = $labelInfo + 12 + ($i$044 << 2) | 0; + $13 = HEAP32[$12 >> 2] | 0; + L7 : do if (!(($13 | 0) < ($$03 | 0) | ($13 | 0) > ($$02 | 0))) { + $16 = $labelInfo + 131084 + ($i$044 << 4) | 0; + if ((HEAP32[$16 >> 2] | 0) != 1) if ((HEAP32[$labelInfo + 131084 + ($i$044 << 4) + 4 >> 2] | 0) != ($6 | 0)) if ((HEAP32[$labelInfo + 131084 + ($i$044 << 4) + 8 >> 2] | 0) != 1) if ((HEAP32[$labelInfo + 131084 + ($i$044 << 4) + 12 >> 2] | 0) != ($7 | 0)) if ((_arGetContour(HEAP32[$labelInfo >> 2] | 0, $$0, 0, $8, $i$044 + 1 | 0, $16, $markerInfo2 + ((HEAP32[$marker2_num >> 2] | 0) * 80048 | 0) | 0) | 0) >= 0) { + $34 = HEAP32[$12 >> 2] | 0; + $35 = HEAP32[$marker2_num >> 2] | 0; + $36 = $markerInfo2 + ($35 * 80048 | 0) + 28 | 0; + $37 = HEAP32[$36 >> 2] | 0; + $38 = $markerInfo2 + ($35 * 80048 | 0) + 40028 | 0; + $39 = HEAP32[$38 >> 2] | 0; + $40 = $markerInfo2 + ($35 * 80048 | 0) + 24 | 0; + $42 = (HEAP32[$40 >> 2] | 0) + -1 | 0; + if (($42 | 0) > 1) { + $dmax$0$i38 = 0; + $i$0$i39 = 1; + $v1$0$i37 = 0; + while (1) { + $46 = (HEAP32[$markerInfo2 + ($35 * 80048 | 0) + 28 + ($i$0$i39 << 2) >> 2] | 0) - $37 | 0; + $47 = Math_imul($46, $46) | 0; + $50 = (HEAP32[$markerInfo2 + ($35 * 80048 | 0) + 40028 + ($i$0$i39 << 2) >> 2] | 0) - $39 | 0; + $52 = (Math_imul($50, $50) | 0) + $47 | 0; + $53 = ($52 | 0) > ($dmax$0$i38 | 0); + $i$0$v1$0$i = $53 ? $i$0$i39 : $v1$0$i37; + $i$0$i39 = $i$0$i39 + 1 | 0; + if (($i$0$i39 | 0) >= ($42 | 0)) { + $v1$0$i$lcssa = $i$0$v1$0$i; + break; + } else { + $dmax$0$i38 = $53 ? $52 : $dmax$0$i38; + $v1$0$i37 = $i$0$v1$0$i; + } + } + } else $v1$0$i$lcssa = 0; + $59 = +($34 | 0) / .75 * .01 * $squareFitThresh; + HEAP32[$wvnum1$i >> 2] = 0; + HEAP32[$wvnum2$i >> 2] = 0; + L18 : do if ((_get_vertex($36, $38, 0, $v1$0$i$lcssa, $59, $wv1$i, $wvnum1$i) | 0) >= 0) if ((_get_vertex($36, $38, $v1$0$i$lcssa, (HEAP32[$40 >> 2] | 0) + -1 | 0, $59, $wv2$i, $wvnum2$i) | 0) >= 0) { + $66 = HEAP32[$wvnum1$i >> 2] | 0; + $68 = HEAP32[$wvnum2$i >> 2] | 0; + do if (($66 | 0) == 1 & ($68 | 0) == 1) { + $vertex$sroa$12$0$i = HEAP32[$wv2$i >> 2] | 0; + $vertex$sroa$4$0$i = HEAP32[$wv1$i >> 2] | 0; + $vertex$sroa$8$0$i = $v1$0$i$lcssa; + } else { + if (($66 | 0) > 1 & ($68 | 0) == 0) { + $74 = ($v1$0$i$lcssa | 0) / 2 | 0; + HEAP32[$wvnum2$i >> 2] = 0; + HEAP32[$wvnum1$i >> 2] = 0; + if ((_get_vertex($36, $38, 0, $74, $59, $wv1$i, $wvnum1$i) | 0) < 0) break L18; + if ((_get_vertex($36, $38, $74, $v1$0$i$lcssa, $59, $wv2$i, $wvnum2$i) | 0) < 0) break L18; + if (!((HEAP32[$wvnum1$i >> 2] | 0) == 1 & (HEAP32[$wvnum2$i >> 2] | 0) == 1)) break L18; + $vertex$sroa$12$0$i = $v1$0$i$lcssa; + $vertex$sroa$4$0$i = HEAP32[$wv1$i >> 2] | 0; + $vertex$sroa$8$0$i = HEAP32[$wv2$i >> 2] | 0; + break; + } + if (!(($66 | 0) == 0 & ($68 | 0) > 1)) break L18; + $90 = ($v1$0$i$lcssa + -1 + (HEAP32[$40 >> 2] | 0) | 0) / 2 | 0; + HEAP32[$wvnum2$i >> 2] = 0; + HEAP32[$wvnum1$i >> 2] = 0; + if ((_get_vertex($36, $38, $v1$0$i$lcssa, $90, $59, $wv1$i, $wvnum1$i) | 0) < 0) break L18; + if ((_get_vertex($36, $38, $90, (HEAP32[$40 >> 2] | 0) + -1 | 0, $59, $wv2$i, $wvnum2$i) | 0) < 0) break L18; + if (!((HEAP32[$wvnum1$i >> 2] | 0) == 1 & (HEAP32[$wvnum2$i >> 2] | 0) == 1)) break L18; + $vertex$sroa$12$0$i = HEAP32[$wv2$i >> 2] | 0; + $vertex$sroa$4$0$i = $v1$0$i$lcssa; + $vertex$sroa$8$0$i = HEAP32[$wv1$i >> 2] | 0; + } while (0); + HEAP32[$markerInfo2 + ($35 * 80048 | 0) + 80028 >> 2] = 0; + HEAP32[$markerInfo2 + ($35 * 80048 | 0) + 80032 >> 2] = $vertex$sroa$4$0$i; + HEAP32[$markerInfo2 + ($35 * 80048 | 0) + 80036 >> 2] = $vertex$sroa$8$0$i; + HEAP32[$markerInfo2 + ($35 * 80048 | 0) + 80040 >> 2] = $vertex$sroa$12$0$i; + HEAP32[$markerInfo2 + ($35 * 80048 | 0) + 80044 >> 2] = (HEAP32[$40 >> 2] | 0) + -1; + HEAP32[$markerInfo2 + ((HEAP32[$marker2_num >> 2] | 0) * 80048 | 0) >> 2] = HEAP32[$12 >> 2]; + $115 = HEAP32[$marker2_num >> 2] | 0; + HEAPF64[$markerInfo2 + ($115 * 80048 | 0) + 8 >> 3] = +HEAPF64[$labelInfo + 655376 + ($i$044 << 4) >> 3]; + HEAPF64[$markerInfo2 + ($115 * 80048 | 0) + 16 >> 3] = +HEAPF64[$labelInfo + 655376 + ($i$044 << 4) + 8 >> 3]; + $120 = $115 + 1 | 0; + HEAP32[$marker2_num >> 2] = $120; + if (($120 | 0) == 60) { + $$ph = 60; + break L4; + } else break L7; + } while (0); + } + } while (0); + $i$044 = $i$044 + 1 | 0; + if (($i$044 | 0) >= (HEAP32[$5 >> 2] | 0)) { + label = 4; + break; + } + } + } else label = 4; while (0); + if ((label | 0) == 4) $$ph = HEAP32[$marker2_num >> 2] | 0; + if (($$ph | 0) > 0) { + $132 = $$ph; + $i$134 = 0; + while (1) { + $i$134$looptemp = $i$134; + $i$134 = $i$134 + 1 | 0; + $129 = $markerInfo2 + ($i$134$looptemp * 80048 | 0) + 16 | 0; + $130 = $markerInfo2 + ($i$134$looptemp * 80048 | 0) | 0; + if (($i$134 | 0) < ($132 | 0)) { + $133 = +HEAPF64[$markerInfo2 + ($i$134$looptemp * 80048 | 0) + 8 >> 3]; + $j$030 = $i$134; + do { + $136 = $133 - +HEAPF64[$markerInfo2 + ($j$030 * 80048 | 0) + 8 >> 3]; + $141 = +HEAPF64[$129 >> 3] - +HEAPF64[$markerInfo2 + ($j$030 * 80048 | 0) + 16 >> 3]; + $143 = $136 * $136 + $141 * $141; + $144 = HEAP32[$130 >> 2] | 0; + $145 = $markerInfo2 + ($j$030 * 80048 | 0) | 0; + $146 = HEAP32[$145 >> 2] | 0; + if (($144 | 0) > ($146 | 0)) { + if ($143 < +(($144 | 0) / 4 | 0 | 0)) HEAP32[$145 >> 2] = 0; + } else if ($143 < +(($146 | 0) / 4 | 0 | 0)) HEAP32[$130 >> 2] = 0; + $j$030 = $j$030 + 1 | 0; + $$pre10 = HEAP32[$marker2_num >> 2] | 0; + } while (($j$030 | 0) < ($$pre10 | 0)); + $$lcssa16 = $$pre10; + } else $$lcssa16 = $132; + if (($i$134 | 0) >= ($$lcssa16 | 0)) { + $$lcssa17 = $$lcssa16; + break; + } else $132 = $$lcssa16; + } + } else $$lcssa17 = $$ph; + if (($$lcssa17 | 0) > 0) { + $160 = $$lcssa17; + $i$227 = 0; + while (1) { + if (!(HEAP32[$markerInfo2 + ($i$227 * 80048 | 0) >> 2] | 0)) { + $j$123 = $i$227 + 1 | 0; + if (($j$123 | 0) < ($160 | 0)) { + $j$1$in24 = $i$227; + $j$125 = $j$123; + while (1) { + _memcpy($markerInfo2 + ($j$1$in24 * 80048 | 0) | 0, $markerInfo2 + ($j$125 * 80048 | 0) | 0, 80048) | 0; + $$pre9 = HEAP32[$marker2_num >> 2] | 0; + $j$1 = $j$125 + 1 | 0; + if (($j$1 | 0) < ($$pre9 | 0)) { + $j$1$in24$phi = $j$125; + $j$125 = $j$1; + $j$1$in24 = $j$1$in24$phi; + } else { + $$lcssa = $$pre9; + break; + } + } + } else $$lcssa = $160; + $164 = $$lcssa + -1 | 0; + HEAP32[$marker2_num >> 2] = $164; + $167 = $164; + } else $167 = $160; + $i$227 = $i$227 + 1 | 0; + if (($i$227 | 0) >= ($167 | 0)) { + $$lcssa15 = $167; + break; + } else $160 = $167; + } + } else $$lcssa15 = $$lcssa17; + if ($0 & ($$lcssa15 | 0) > 0) { + $i$321 = 0; + $pm$019 = $markerInfo2; + while (1) { + HEAP32[$pm$019 >> 2] = HEAP32[$pm$019 >> 2] << 2; + $171 = $pm$019 + 8 | 0; + HEAPF64[$171 >> 3] = +HEAPF64[$171 >> 3] * 2.0; + $174 = $pm$019 + 16 | 0; + HEAPF64[$174 >> 3] = +HEAPF64[$174 >> 3] * 2.0; + $177 = $pm$019 + 24 | 0; + if ((HEAP32[$177 >> 2] | 0) > 0) { + $j$218 = 0; + do { + $180 = $pm$019 + 28 + ($j$218 << 2) | 0; + HEAP32[$180 >> 2] = HEAP32[$180 >> 2] << 1; + $183 = $pm$019 + 40028 + ($j$218 << 2) | 0; + HEAP32[$183 >> 2] = HEAP32[$183 >> 2] << 1; + $j$218 = $j$218 + 1 | 0; + } while (($j$218 | 0) < (HEAP32[$177 >> 2] | 0)); + } + $i$321 = $i$321 + 1 | 0; + if (($i$321 | 0) >= (HEAP32[$marker2_num >> 2] | 0)) break; else $pm$019 = $pm$019 + 80048 | 0; + } + } + STACKTOP = sp; + return 0; +} + +function _pattern_match($pattHandle, $mode, $data, $size, $code, $dir, $cf) { + $pattHandle = $pattHandle | 0; + $mode = $mode | 0; + $data = $data | 0; + $size = $size | 0; + $code = $code | 0; + $dir = $dir | 0; + $cf = $cf | 0; + var $$0 = 0, $$lcssa103 = 0, $$lcssa108 = 0, $1 = 0, $100 = 0, $101 = 0, $102 = 0, $105 = 0, $11 = 0, $111 = 0, $118 = 0.0, $119 = 0, $14 = 0, $2 = 0, $20 = 0, $23 = 0, $26 = 0.0, $31 = 0, $33 = 0, $34 = 0, $36 = 0, $37 = 0, $4 = 0, $40 = 0, $41 = 0, $42 = 0, $45 = 0, $51 = 0, $58 = 0.0, $59 = 0, $63 = 0, $65 = 0, $72 = 0, $75 = 0, $81 = 0, $84 = 0, $87 = 0.0, $91 = 0, $93 = 0, $94 = 0, $96 = 0, $97 = 0, $ave$0$lcssa = 0, $ave$055 = 0, $ave$1$lcssa = 0, $ave$183 = 0, $i$056 = 0, $i$150 = 0, $i$235 = 0, $i$384 = 0, $i$478 = 0, $i$560 = 0, $j$038 = 0, $j$166 = 0, $k$042 = 0, $k$1 = 0, $k$1$in = 0, $k$1$lcssa = 0, $k$1102 = 0, $k$270 = 0, $k$3 = 0, $k$3$in = 0, $k$3$lcssa = 0, $k$3106 = 0, $l$043 = 0, $l$171 = 0, $max$0$lcssa = 0.0, $max$044 = 0.0, $max$139 = 0.0, $max$2 = 0.0, $max$3 = 0.0, $max$4$lcssa = 0.0, $max$472 = 0.0, $max$567 = 0.0, $max$6 = 0.0, $max$7 = 0.0, $res1$0$lcssa = 0, $res1$040 = 0, $res1$136 = 0, $res1$2 = 0, $res1$3 = 0, $res1$4$lcssa = 0, $res1$468 = 0, $res1$564 = 0, $res1$6 = 0, $res1$7 = 0, $res2$0$lcssa = 0, $res2$041 = 0, $res2$137 = 0, $res2$2 = 0, $res2$3 = 0, $res2$4$lcssa = 0, $res2$469 = 0, $res2$565 = 0, $res2$6 = 0, $res2$7 = 0, $sum$0$lcssa = 0.0, $sum$049 = 0, $sum$1$lcssa = 0, $sum$134 = 0, $sum$2$lcssa = 0.0, $sum$277 = 0, $sum$3$lcssa = 0, $sum$359 = 0, $vararg_buffer = 0, $vararg_buffer1 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer1 = sp + 8 | 0; + $vararg_buffer = sp; + L1 : do if (!$pattHandle) { + HEAP32[$code >> 2] = 0; + HEAP32[$dir >> 2] = 0; + HEAPF64[$cf >> 3] = -1.0; + $$0 = -1; + } else switch ($mode | 0) { + case 0: + { + $1 = Math_imul($size, $size) | 0; + $2 = $1 * 3 | 0; + $4 = _malloc($1 * 12 | 0) | 0; + if (!$4) { + _arLog(3, 5471, $vararg_buffer); + _exit(1); + } + if (!$1) $ave$0$lcssa = 0; else { + $ave$055 = 0; + $i$056 = 0; + while (1) { + $11 = ((HEAPU8[$data + $i$056 >> 0] | 0) ^ 255) + $ave$055 | 0; + $i$056 = $i$056 + 1 | 0; + if (($i$056 | 0) >= ($2 | 0)) { + $ave$0$lcssa = $11; + break; + } else $ave$055 = $11; + } + } + $14 = ($ave$0$lcssa | 0) / ($2 | 0) | 0; + if (!$1) $sum$0$lcssa = 0.0; else { + $i$150 = 0; + $sum$049 = 0; + while (1) { + $20 = ((HEAPU8[$data + $i$150 >> 0] | 0) ^ 255) - $14 | 0; + HEAP32[$4 + ($i$150 << 2) >> 2] = $20; + $23 = (Math_imul($20, $20) | 0) + $sum$049 | 0; + $i$150 = $i$150 + 1 | 0; + if (($i$150 | 0) >= ($2 | 0)) { + $$lcssa103 = $23; + break; + } else $sum$049 = $23; + } + $sum$0$lcssa = +($$lcssa103 | 0); + } + $26 = +Math_sqrt(+$sum$0$lcssa); + if ($26 / (+($size | 0) * 1.7320508) < 15.0) { + HEAP32[$code >> 2] = 0; + HEAP32[$dir >> 2] = 0; + HEAPF64[$cf >> 3] = -1.0; + _free($4); + $$0 = -2; + break L1; + } + $31 = HEAP32[$pattHandle >> 2] | 0; + $33 = $pattHandle + 12 | 0; + $34 = $pattHandle + 16 | 0; + if (($31 | 0) > 0) { + $36 = HEAP32[$pattHandle + 8 >> 2] | 0; + $37 = ($1 | 0) == 0; + $k$042 = -1; + $l$043 = 0; + $max$044 = 0.0; + $res1$040 = -1; + $res2$041 = -1; + while (1) { + $k$1$in = $k$042; + L25 : while (1) { + $k$1 = $k$1$in + 1 | 0; + switch (HEAP32[$36 + ($k$1 << 2) >> 2] | 0) { + case 0: + { + $k$1$in = $k$1; + break; + } + case 2: + { + $k$1102 = $k$1; + $max$3 = $max$044; + $res1$3 = $res1$040; + $res2$3 = $res2$041; + break L25; + break; + } + default: + { + $k$1$lcssa = $k$1; + label = 17; + break L25; + } + } + } + if ((label | 0) == 17) { + label = 0; + $40 = $k$1$lcssa << 2; + $41 = HEAP32[$34 >> 2] | 0; + $j$038 = 0; + $max$139 = $max$044; + $res1$136 = $res1$040; + $res2$137 = $res2$041; + while (1) { + $42 = $j$038 + $40 | 0; + if ($37) $sum$1$lcssa = 0; else { + $45 = HEAP32[(HEAP32[$33 >> 2] | 0) + ($42 << 2) >> 2] | 0; + $i$235 = 0; + $sum$134 = 0; + while (1) { + $51 = (Math_imul(HEAP32[$45 + ($i$235 << 2) >> 2] | 0, HEAP32[$4 + ($i$235 << 2) >> 2] | 0) | 0) + $sum$134 | 0; + $i$235 = $i$235 + 1 | 0; + if (($i$235 | 0) >= ($2 | 0)) { + $sum$1$lcssa = $51; + break; + } else $sum$134 = $51; + } + } + $58 = +($sum$1$lcssa | 0) / +HEAPF64[$41 + ($42 << 3) >> 3] / $26; + $59 = $58 > $max$139; + $res1$2 = $59 ? $j$038 : $res1$136; + $res2$2 = $59 ? $k$1$lcssa : $res2$137; + $max$2 = $59 ? $58 : $max$139; + $j$038 = $j$038 + 1 | 0; + if (($j$038 | 0) == 4) { + $k$1102 = $k$1$lcssa; + $max$3 = $max$2; + $res1$3 = $res1$2; + $res2$3 = $res2$2; + break; + } else { + $max$139 = $max$2; + $res1$136 = $res1$2; + $res2$137 = $res2$2; + } + } + } + $l$043 = $l$043 + 1 | 0; + if (($l$043 | 0) >= ($31 | 0)) { + $max$0$lcssa = $max$3; + $res1$0$lcssa = $res1$3; + $res2$0$lcssa = $res2$3; + break; + } else { + $k$042 = $k$1102; + $max$044 = $max$3; + $res1$040 = $res1$3; + $res2$041 = $res2$3; + } + } + } else { + $max$0$lcssa = 0.0; + $res1$0$lcssa = -1; + $res2$0$lcssa = -1; + } + HEAP32[$dir >> 2] = $res1$0$lcssa; + HEAP32[$code >> 2] = $res2$0$lcssa; + HEAPF64[$cf >> 3] = $max$0$lcssa; + _free($4); + $$0 = 0; + break L1; + break; + } + case 1: + { + $63 = Math_imul($size, $size) | 0; + $65 = _malloc($63 << 2) | 0; + if (!$65) { + _arLog(3, 5471, $vararg_buffer1); + _exit(1); + } + if (!$63) $ave$1$lcssa = 0; else { + $ave$183 = 0; + $i$384 = 0; + while (1) { + $72 = ((HEAPU8[$data + $i$384 >> 0] | 0) ^ 255) + $ave$183 | 0; + $i$384 = $i$384 + 1 | 0; + if (($i$384 | 0) >= ($63 | 0)) { + $ave$1$lcssa = $72; + break; + } else $ave$183 = $72; + } + } + $75 = ($ave$1$lcssa | 0) / ($63 | 0) | 0; + if (!$63) $sum$2$lcssa = 0.0; else { + $i$478 = 0; + $sum$277 = 0; + while (1) { + $81 = ((HEAPU8[$data + $i$478 >> 0] | 0) ^ 255) - $75 | 0; + HEAP32[$65 + ($i$478 << 2) >> 2] = $81; + $84 = (Math_imul($81, $81) | 0) + $sum$277 | 0; + $i$478 = $i$478 + 1 | 0; + if (($i$478 | 0) >= ($63 | 0)) { + $$lcssa108 = $84; + break; + } else $sum$277 = $84; + } + $sum$2$lcssa = +($$lcssa108 | 0); + } + $87 = +Math_sqrt(+$sum$2$lcssa); + if ($87 / +($size | 0) < 15.0) { + HEAP32[$code >> 2] = 0; + HEAP32[$dir >> 2] = 0; + HEAPF64[$cf >> 3] = -1.0; + _free($65); + $$0 = -2; + break L1; + } + $91 = HEAP32[$pattHandle >> 2] | 0; + $93 = $pattHandle + 20 | 0; + $94 = $pattHandle + 24 | 0; + if (($91 | 0) > 0) { + $96 = HEAP32[$pattHandle + 8 >> 2] | 0; + $97 = ($63 | 0) == 0; + $k$270 = -1; + $l$171 = 0; + $max$472 = 0.0; + $res1$468 = -1; + $res2$469 = -1; + while (1) { + $k$3$in = $k$270; + L58 : while (1) { + $k$3 = $k$3$in + 1 | 0; + switch (HEAP32[$96 + ($k$3 << 2) >> 2] | 0) { + case 0: + { + $k$3$in = $k$3; + break; + } + case 2: + { + $k$3106 = $k$3; + $max$7 = $max$472; + $res1$7 = $res1$468; + $res2$7 = $res2$469; + break L58; + break; + } + default: + { + $k$3$lcssa = $k$3; + label = 37; + break L58; + } + } + } + if ((label | 0) == 37) { + label = 0; + $100 = $k$3$lcssa << 2; + $101 = HEAP32[$94 >> 2] | 0; + $j$166 = 0; + $max$567 = $max$472; + $res1$564 = $res1$468; + $res2$565 = $res2$469; + while (1) { + $102 = $j$166 + $100 | 0; + if ($97) $sum$3$lcssa = 0; else { + $105 = HEAP32[(HEAP32[$93 >> 2] | 0) + ($102 << 2) >> 2] | 0; + $i$560 = 0; + $sum$359 = 0; + while (1) { + $111 = (Math_imul(HEAP32[$105 + ($i$560 << 2) >> 2] | 0, HEAP32[$65 + ($i$560 << 2) >> 2] | 0) | 0) + $sum$359 | 0; + $i$560 = $i$560 + 1 | 0; + if (($i$560 | 0) >= ($63 | 0)) { + $sum$3$lcssa = $111; + break; + } else $sum$359 = $111; + } + } + $118 = +($sum$3$lcssa | 0) / +HEAPF64[$101 + ($102 << 3) >> 3] / $87; + $119 = $118 > $max$567; + $res1$6 = $119 ? $j$166 : $res1$564; + $res2$6 = $119 ? $k$3$lcssa : $res2$565; + $max$6 = $119 ? $118 : $max$567; + $j$166 = $j$166 + 1 | 0; + if (($j$166 | 0) == 4) { + $k$3106 = $k$3$lcssa; + $max$7 = $max$6; + $res1$7 = $res1$6; + $res2$7 = $res2$6; + break; + } else { + $max$567 = $max$6; + $res1$564 = $res1$6; + $res2$565 = $res2$6; + } + } + } + $l$171 = $l$171 + 1 | 0; + if (($l$171 | 0) >= ($91 | 0)) { + $max$4$lcssa = $max$7; + $res1$4$lcssa = $res1$7; + $res2$4$lcssa = $res2$7; + break; + } else { + $k$270 = $k$3106; + $max$472 = $max$7; + $res1$468 = $res1$7; + $res2$469 = $res2$7; + } + } + } else { + $max$4$lcssa = 0.0; + $res1$4$lcssa = -1; + $res2$4$lcssa = -1; + } + HEAP32[$dir >> 2] = $res1$4$lcssa; + HEAP32[$code >> 2] = $res2$4$lcssa; + HEAPF64[$cf >> 3] = $max$4$lcssa; + _free($65); + $$0 = 0; + break L1; + break; + } + default: + { + $$0 = -1; + break L1; + } + } while (0); + STACKTOP = sp; + return $$0 | 0; +} + +function _arMultiReadConfigFile($filename, $pattHandle) { + $filename = $filename | 0; + $pattHandle = $pattHandle | 0; + var $$0 = 0, $0 = 0, $108 = 0, $11 = 0, $118 = 0, $12 = 0, $13 = 0, $14 = 0, $15 = 0, $16 = 0, $17 = 0, $18 = 0, $2 = 0, $20 = 0, $21 = 0, $28 = 0, $34 = 0, $4 = 0, $45 = 0, $49 = 0, $50 = 0, $52 = 0, $68 = 0.0, $69 = 0.0, $7 = 0, $70 = 0.0, $71 = 0, $72 = 0, $73 = 0, $74 = 0, $75 = 0, $76 = 0, $79 = 0.0, $83 = 0.0, $9 = 0, $buf = 0, $dummy = 0, $i$052 = 0, $i$052$lcssa64 = 0, $i$052$lcssa65 = 0, $i$052$lcssa66 = 0, $j$0 = 0, $j$150 = 0, $num = 0, $pattPath = 0, $patt_type$0$lcssa = 0, $patt_type$051 = 0, $patt_type$1 = 0, $t1 = 0, $t2 = 0, $vararg_buffer = 0, $vararg_buffer1 = 0, $vararg_buffer11 = 0, $vararg_buffer13 = 0, $vararg_buffer17 = 0, $vararg_buffer21 = 0, $vararg_buffer24 = 0, $vararg_buffer28 = 0, $vararg_buffer31 = 0, $vararg_buffer35 = 0, $vararg_buffer41 = 0, $vararg_buffer45 = 0, $vararg_buffer49 = 0, $vararg_buffer5 = 0, $vararg_buffer55 = 0, $vararg_buffer59 = 0, $vararg_buffer8 = 0, $wpos3d = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 2544 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer59 = sp + 208 | 0; + $vararg_buffer55 = sp + 200 | 0; + $vararg_buffer49 = sp + 184 | 0; + $vararg_buffer45 = sp + 176 | 0; + $vararg_buffer41 = sp + 168 | 0; + $vararg_buffer35 = sp + 152 | 0; + $vararg_buffer31 = sp + 144 | 0; + $vararg_buffer28 = sp + 136 | 0; + $vararg_buffer24 = sp + 128 | 0; + $vararg_buffer21 = sp + 120 | 0; + $vararg_buffer17 = sp + 112 | 0; + $vararg_buffer13 = sp + 104 | 0; + $vararg_buffer11 = sp + 96 | 0; + $vararg_buffer8 = sp + 88 | 0; + $vararg_buffer5 = sp + 80 | 0; + $vararg_buffer1 = sp + 72 | 0; + $vararg_buffer = sp + 64 | 0; + $wpos3d = sp; + $buf = sp + 2280 | 0; + $pattPath = sp + 232 | 0; + $dummy = sp + 224 | 0; + $num = sp + 220 | 0; + $t1 = sp + 216 | 0; + $t2 = sp + 212 | 0; + $0 = _fopen($filename, 5306) | 0; + L1 : do if (!$0) { + HEAP32[$vararg_buffer >> 2] = $filename; + _arLog(3, 5308, $vararg_buffer); + $2 = ___errno_location() | 0; + $4 = _strerror(HEAP32[$2 >> 2] | 0) | 0; + HEAP32[$vararg_buffer1 >> 2] = 13835; + HEAP32[$vararg_buffer1 + 4 >> 2] = $4; + _arLog(3, 5361, $vararg_buffer1); + $$0 = 0; + } else { + _get_buff($buf, $0); + HEAP32[$vararg_buffer5 >> 2] = $num; + if ((_sscanf($buf, 5367, $vararg_buffer5) | 0) != 1) { + HEAP32[$vararg_buffer8 >> 2] = $filename; + _arLog(3, 5370, $vararg_buffer8); + _fclose($0) | 0; + $$0 = 0; + break; + } + $7 = HEAP32[$num >> 2] | 0; + $9 = _malloc($7 * 320 | 0) | 0; + if (!$9) { + _arLog(3, 5471, $vararg_buffer11); + _exit(1); + } + $11 = $wpos3d + 8 | 0; + $12 = $wpos3d + 16 | 0; + $13 = $wpos3d + 24 | 0; + $14 = $wpos3d + 32 | 0; + $15 = $wpos3d + 40 | 0; + $16 = $wpos3d + 48 | 0; + $17 = $wpos3d + 56 | 0; + $18 = ($pattHandle | 0) == 0; + L10 : do if (($7 | 0) > 0) { + $i$052 = 0; + $patt_type$051 = 0; + L11 : while (1) { + _get_buff($buf, $0); + $20 = $9 + ($i$052 * 320 | 0) | 0; + $21 = $9 + ($i$052 * 320 | 0) + 312 | 0; + HEAP32[$vararg_buffer13 >> 2] = $21; + HEAP32[$vararg_buffer13 + 4 >> 2] = $dummy; + if ((_sscanf($buf, 5488, $vararg_buffer13) | 0) == 1) { + $34 = HEAP32[$21 >> 2] | 0; + HEAP32[$20 >> 2] = ($34 & -32768 | 0) == 0 & 0 == 0 ? $34 & 32767 : 0; + HEAP32[$9 + ($i$052 * 320 | 0) + 4 >> 2] = 1; + $patt_type$1 = $patt_type$051 | 2; + } else { + if ($18) { + label = 10; + break; + } + if (!(_arUtilGetDirectoryNameFromPath($pattPath, $filename, 2048, 1) | 0)) { + label = 12; + break; + } + _strncat($pattPath, $buf, 2047 - (_strlen($pattPath) | 0) | 0) | 0; + $28 = _arPattLoad($pattHandle, $pattPath) | 0; + HEAP32[$20 >> 2] = $28; + if (($28 | 0) < 0) { + label = 14; + break; + } + HEAP32[$9 + ($i$052 * 320 | 0) + 4 >> 2] = 0; + $patt_type$1 = $patt_type$051 | 1; + } + _get_buff($buf, $0); + $45 = $9 + ($i$052 * 320 | 0) + 8 | 0; + HEAP32[$vararg_buffer28 >> 2] = $45; + if ((_sscanf($buf, 5784, $vararg_buffer28) | 0) != 1) { + $i$052$lcssa64 = $i$052; + label = 18; + break; + } + _get_buff($buf, $0); + $49 = $9 + ($i$052 * 320 | 0) + 16 | 0; + $50 = $9 + ($i$052 * 320 | 0) + 24 | 0; + $52 = $9 + ($i$052 * 320 | 0) + 40 | 0; + HEAP32[$vararg_buffer35 >> 2] = $49; + HEAP32[$vararg_buffer35 + 4 >> 2] = $50; + HEAP32[$vararg_buffer35 + 8 >> 2] = $9 + ($i$052 * 320 | 0) + 32; + HEAP32[$vararg_buffer35 + 12 >> 2] = $52; + if ((_sscanf($buf, 5893, $vararg_buffer35) | 0) == 4) $j$0 = 1; else { + HEAP32[$vararg_buffer41 >> 2] = $t1; + HEAP32[$vararg_buffer41 + 4 >> 2] = $t2; + if ((_sscanf($buf, 5909, $vararg_buffer41) | 0) == 2) $j$0 = 0; else { + $i$052$lcssa65 = $i$052; + label = 21; + break; + } + } + do { + _get_buff($buf, $0); + HEAP32[$vararg_buffer49 >> 2] = $9 + ($i$052 * 320 | 0) + 16 + ($j$0 << 5); + HEAP32[$vararg_buffer49 + 4 >> 2] = $9 + ($i$052 * 320 | 0) + 16 + ($j$0 << 5) + 8; + HEAP32[$vararg_buffer49 + 8 >> 2] = $9 + ($i$052 * 320 | 0) + 16 + ($j$0 << 5) + 16; + HEAP32[$vararg_buffer49 + 12 >> 2] = $9 + ($i$052 * 320 | 0) + 16 + ($j$0 << 5) + 24; + if ((_sscanf($buf, 5893, $vararg_buffer49) | 0) != 4) { + $i$052$lcssa66 = $i$052; + label = 23; + break L11; + } + $j$0 = $j$0 + 1 | 0; + } while (($j$0 | 0) < 3); + _arUtilMatInv($49, $9 + ($i$052 * 320 | 0) + 112 | 0) | 0; + $68 = +HEAPF64[$45 >> 3]; + $69 = $68 * -.5; + HEAPF64[$wpos3d >> 3] = $69; + $70 = $68 * .5; + HEAPF64[$11 >> 3] = $70; + HEAPF64[$12 >> 3] = $70; + HEAPF64[$13 >> 3] = $70; + HEAPF64[$14 >> 3] = $70; + HEAPF64[$15 >> 3] = $69; + HEAPF64[$16 >> 3] = $69; + HEAPF64[$17 >> 3] = $69; + $71 = $9 + ($i$052 * 320 | 0) + 48 | 0; + $72 = $9 + ($i$052 * 320 | 0) + 56 | 0; + $73 = $9 + ($i$052 * 320 | 0) + 72 | 0; + $74 = $9 + ($i$052 * 320 | 0) + 80 | 0; + $75 = $9 + ($i$052 * 320 | 0) + 88 | 0; + $76 = $9 + ($i$052 * 320 | 0) + 104 | 0; + $j$150 = 0; + do { + $79 = +HEAPF64[$wpos3d + ($j$150 << 4) >> 3]; + $83 = +HEAPF64[$wpos3d + ($j$150 << 4) + 8 >> 3]; + HEAPF64[$9 + ($i$052 * 320 | 0) + 208 + ($j$150 * 24 | 0) >> 3] = +HEAPF64[$52 >> 3] + (+HEAPF64[$49 >> 3] * $79 + +HEAPF64[$50 >> 3] * $83); + HEAPF64[$9 + ($i$052 * 320 | 0) + 208 + ($j$150 * 24 | 0) + 8 >> 3] = +HEAPF64[$73 >> 3] + (+HEAPF64[$71 >> 3] * $79 + +HEAPF64[$72 >> 3] * $83); + HEAPF64[$9 + ($i$052 * 320 | 0) + 208 + ($j$150 * 24 | 0) + 16 >> 3] = +HEAPF64[$76 >> 3] + (+HEAPF64[$74 >> 3] * $79 + +HEAPF64[$75 >> 3] * $83); + $j$150 = $j$150 + 1 | 0; + } while (($j$150 | 0) != 4); + $i$052 = $i$052 + 1 | 0; + if (($i$052 | 0) >= (HEAP32[$num >> 2] | 0)) { + $patt_type$0$lcssa = $patt_type$1; + break L10; + } else $patt_type$051 = $patt_type$1; + } + if ((label | 0) == 10) { + HEAP32[$vararg_buffer17 >> 2] = $filename; + HEAP32[$vararg_buffer17 + 4 >> 2] = $buf; + _arLog(3, 5495, $vararg_buffer17); + } else if ((label | 0) == 12) { + HEAP32[$vararg_buffer21 >> 2] = $filename; + _arLog(3, 5623, $vararg_buffer21); + } else if ((label | 0) == 14) { + HEAP32[$vararg_buffer24 >> 2] = $filename; + HEAP32[$vararg_buffer24 + 4 >> 2] = $pattPath; + _arLog(3, 5707, $vararg_buffer24); + } else if ((label | 0) == 18) { + HEAP32[$vararg_buffer31 >> 2] = $filename; + HEAP32[$vararg_buffer31 + 4 >> 2] = $i$052$lcssa64 + 1; + _arLog(3, 5788, $vararg_buffer31); + } else if ((label | 0) == 21) { + HEAP32[$vararg_buffer45 >> 2] = $filename; + HEAP32[$vararg_buffer45 + 4 >> 2] = $i$052$lcssa65 + 1; + _arLog(3, 5915, $vararg_buffer45); + } else if ((label | 0) == 23) { + HEAP32[$vararg_buffer55 >> 2] = $filename; + HEAP32[$vararg_buffer55 + 4 >> 2] = $i$052$lcssa66 + 1; + _arLog(3, 5915, $vararg_buffer55); + } + _fclose($0) | 0; + _free($9); + $$0 = 0; + break L1; + } else $patt_type$0$lcssa = 0; while (0); + _fclose($0) | 0; + $108 = _malloc(136) | 0; + if (!$108) { + _arLog(3, 5471, $vararg_buffer59); + _exit(1); + } + HEAP32[$108 >> 2] = $9; + HEAP32[$108 + 4 >> 2] = HEAP32[$num >> 2]; + HEAP32[$108 + 104 >> 2] = 0; + do if (($patt_type$0$lcssa & 3 | 0) == 3) HEAP32[$108 + 108 >> 2] = 2; else { + $118 = $108 + 108 | 0; + if (!($patt_type$0$lcssa & 1)) { + HEAP32[$118 >> 2] = 1; + break; + } else { + HEAP32[$118 >> 2] = 0; + break; + } + } while (0); + HEAPF64[$108 + 112 >> 3] = .5; + HEAPF64[$108 + 120 >> 3] = .5; + $$0 = $108; + } while (0); + STACKTOP = sp; + return $$0 | 0; +} + +function ___udivmoddi4($a$0, $a$1, $b$0, $b$1, $rem) { + $a$0 = $a$0 | 0; + $a$1 = $a$1 | 0; + $b$0 = $b$0 | 0; + $b$1 = $b$1 | 0; + $rem = $rem | 0; + var $n_sroa_0_0_extract_trunc = 0, $n_sroa_1_4_extract_shift$0 = 0, $n_sroa_1_4_extract_trunc = 0, $d_sroa_0_0_extract_trunc = 0, $d_sroa_1_4_extract_shift$0 = 0, $d_sroa_1_4_extract_trunc = 0, $4 = 0, $17 = 0, $37 = 0, $51 = 0, $57 = 0, $58 = 0, $66 = 0, $78 = 0, $88 = 0, $89 = 0, $91 = 0, $92 = 0, $95 = 0, $105 = 0, $119 = 0, $125 = 0, $126 = 0, $130 = 0, $q_sroa_1_1_ph = 0, $q_sroa_0_1_ph = 0, $r_sroa_1_1_ph = 0, $r_sroa_0_1_ph = 0, $sr_1_ph = 0, $d_sroa_0_0_insert_insert99$0 = 0, $d_sroa_0_0_insert_insert99$1 = 0, $137$0 = 0, $137$1 = 0, $carry_0203 = 0, $sr_1202 = 0, $r_sroa_0_1201 = 0, $r_sroa_1_1200 = 0, $q_sroa_0_1199 = 0, $q_sroa_1_1198 = 0, $r_sroa_0_0_insert_insert42$0 = 0, $r_sroa_0_0_insert_insert42$1 = 0, $150$1 = 0, $151$0 = 0, $carry_0_lcssa$0 = 0, $carry_0_lcssa$1 = 0, $r_sroa_0_1_lcssa = 0, $r_sroa_1_1_lcssa = 0, $q_sroa_0_1_lcssa = 0, $q_sroa_1_1_lcssa = 0, $q_sroa_0_0_insert_ext75$0 = 0, $q_sroa_0_0_insert_ext75$1 = 0, $_0$0 = 0, $_0$1 = 0, $q_sroa_1_1198$looptemp = 0; + $n_sroa_0_0_extract_trunc = $a$0; + $n_sroa_1_4_extract_shift$0 = $a$1; + $n_sroa_1_4_extract_trunc = $n_sroa_1_4_extract_shift$0; + $d_sroa_0_0_extract_trunc = $b$0; + $d_sroa_1_4_extract_shift$0 = $b$1; + $d_sroa_1_4_extract_trunc = $d_sroa_1_4_extract_shift$0; + if (!$n_sroa_1_4_extract_trunc) { + $4 = ($rem | 0) != 0; + if (!$d_sroa_1_4_extract_trunc) { + if ($4) { + HEAP32[$rem >> 2] = ($n_sroa_0_0_extract_trunc >>> 0) % ($d_sroa_0_0_extract_trunc >>> 0); + HEAP32[$rem + 4 >> 2] = 0; + } + $_0$1 = 0; + $_0$0 = ($n_sroa_0_0_extract_trunc >>> 0) / ($d_sroa_0_0_extract_trunc >>> 0) >>> 0; + return (tempRet0 = $_0$1, $_0$0) | 0; + } else { + if (!$4) { + $_0$1 = 0; + $_0$0 = 0; + return (tempRet0 = $_0$1, $_0$0) | 0; + } + HEAP32[$rem >> 2] = $a$0 | 0; + HEAP32[$rem + 4 >> 2] = $a$1 & 0; + $_0$1 = 0; + $_0$0 = 0; + return (tempRet0 = $_0$1, $_0$0) | 0; + } + } + $17 = ($d_sroa_1_4_extract_trunc | 0) == 0; + do if (!$d_sroa_0_0_extract_trunc) { + if ($17) { + if ($rem) { + HEAP32[$rem >> 2] = ($n_sroa_1_4_extract_trunc >>> 0) % ($d_sroa_0_0_extract_trunc >>> 0); + HEAP32[$rem + 4 >> 2] = 0; + } + $_0$1 = 0; + $_0$0 = ($n_sroa_1_4_extract_trunc >>> 0) / ($d_sroa_0_0_extract_trunc >>> 0) >>> 0; + return (tempRet0 = $_0$1, $_0$0) | 0; + } + if (!$n_sroa_0_0_extract_trunc) { + if ($rem) { + HEAP32[$rem >> 2] = 0; + HEAP32[$rem + 4 >> 2] = ($n_sroa_1_4_extract_trunc >>> 0) % ($d_sroa_1_4_extract_trunc >>> 0); + } + $_0$1 = 0; + $_0$0 = ($n_sroa_1_4_extract_trunc >>> 0) / ($d_sroa_1_4_extract_trunc >>> 0) >>> 0; + return (tempRet0 = $_0$1, $_0$0) | 0; + } + $37 = $d_sroa_1_4_extract_trunc - 1 | 0; + if (!($37 & $d_sroa_1_4_extract_trunc)) { + if ($rem) { + HEAP32[$rem >> 2] = $a$0 | 0; + HEAP32[$rem + 4 >> 2] = $37 & $n_sroa_1_4_extract_trunc | $a$1 & 0; + } + $_0$1 = 0; + $_0$0 = $n_sroa_1_4_extract_trunc >>> ((_llvm_cttz_i32($d_sroa_1_4_extract_trunc | 0) | 0) >>> 0); + return (tempRet0 = $_0$1, $_0$0) | 0; + } + $51 = (Math_clz32($d_sroa_1_4_extract_trunc | 0) | 0) - (Math_clz32($n_sroa_1_4_extract_trunc | 0) | 0) | 0; + if ($51 >>> 0 <= 30) { + $57 = $51 + 1 | 0; + $58 = 31 - $51 | 0; + $sr_1_ph = $57; + $r_sroa_0_1_ph = $n_sroa_1_4_extract_trunc << $58 | $n_sroa_0_0_extract_trunc >>> ($57 >>> 0); + $r_sroa_1_1_ph = $n_sroa_1_4_extract_trunc >>> ($57 >>> 0); + $q_sroa_0_1_ph = 0; + $q_sroa_1_1_ph = $n_sroa_0_0_extract_trunc << $58; + break; + } + if (!$rem) { + $_0$1 = 0; + $_0$0 = 0; + return (tempRet0 = $_0$1, $_0$0) | 0; + } + HEAP32[$rem >> 2] = $a$0 | 0; + HEAP32[$rem + 4 >> 2] = $n_sroa_1_4_extract_shift$0 | $a$1 & 0; + $_0$1 = 0; + $_0$0 = 0; + return (tempRet0 = $_0$1, $_0$0) | 0; + } else { + if (!$17) { + $119 = (Math_clz32($d_sroa_1_4_extract_trunc | 0) | 0) - (Math_clz32($n_sroa_1_4_extract_trunc | 0) | 0) | 0; + if ($119 >>> 0 <= 31) { + $125 = $119 + 1 | 0; + $126 = 31 - $119 | 0; + $130 = $119 - 31 >> 31; + $sr_1_ph = $125; + $r_sroa_0_1_ph = $n_sroa_0_0_extract_trunc >>> ($125 >>> 0) & $130 | $n_sroa_1_4_extract_trunc << $126; + $r_sroa_1_1_ph = $n_sroa_1_4_extract_trunc >>> ($125 >>> 0) & $130; + $q_sroa_0_1_ph = 0; + $q_sroa_1_1_ph = $n_sroa_0_0_extract_trunc << $126; + break; + } + if (!$rem) { + $_0$1 = 0; + $_0$0 = 0; + return (tempRet0 = $_0$1, $_0$0) | 0; + } + HEAP32[$rem >> 2] = $a$0 | 0; + HEAP32[$rem + 4 >> 2] = $n_sroa_1_4_extract_shift$0 | $a$1 & 0; + $_0$1 = 0; + $_0$0 = 0; + return (tempRet0 = $_0$1, $_0$0) | 0; + } + $66 = $d_sroa_0_0_extract_trunc - 1 | 0; + if ($66 & $d_sroa_0_0_extract_trunc) { + $88 = (Math_clz32($d_sroa_0_0_extract_trunc | 0) | 0) + 33 - (Math_clz32($n_sroa_1_4_extract_trunc | 0) | 0) | 0; + $89 = 64 - $88 | 0; + $91 = 32 - $88 | 0; + $92 = $91 >> 31; + $95 = $88 - 32 | 0; + $105 = $95 >> 31; + $sr_1_ph = $88; + $r_sroa_0_1_ph = $91 - 1 >> 31 & $n_sroa_1_4_extract_trunc >>> ($95 >>> 0) | ($n_sroa_1_4_extract_trunc << $91 | $n_sroa_0_0_extract_trunc >>> ($88 >>> 0)) & $105; + $r_sroa_1_1_ph = $105 & $n_sroa_1_4_extract_trunc >>> ($88 >>> 0); + $q_sroa_0_1_ph = $n_sroa_0_0_extract_trunc << $89 & $92; + $q_sroa_1_1_ph = ($n_sroa_1_4_extract_trunc << $89 | $n_sroa_0_0_extract_trunc >>> ($95 >>> 0)) & $92 | $n_sroa_0_0_extract_trunc << $91 & $88 - 33 >> 31; + break; + } + if ($rem) { + HEAP32[$rem >> 2] = $66 & $n_sroa_0_0_extract_trunc; + HEAP32[$rem + 4 >> 2] = 0; + } + if (($d_sroa_0_0_extract_trunc | 0) == 1) { + $_0$1 = $n_sroa_1_4_extract_shift$0 | $a$1 & 0; + $_0$0 = $a$0 | 0 | 0; + return (tempRet0 = $_0$1, $_0$0) | 0; + } else { + $78 = _llvm_cttz_i32($d_sroa_0_0_extract_trunc | 0) | 0; + $_0$1 = $n_sroa_1_4_extract_trunc >>> ($78 >>> 0) | 0; + $_0$0 = $n_sroa_1_4_extract_trunc << 32 - $78 | $n_sroa_0_0_extract_trunc >>> ($78 >>> 0) | 0; + return (tempRet0 = $_0$1, $_0$0) | 0; + } + } while (0); + if (!$sr_1_ph) { + $q_sroa_1_1_lcssa = $q_sroa_1_1_ph; + $q_sroa_0_1_lcssa = $q_sroa_0_1_ph; + $r_sroa_1_1_lcssa = $r_sroa_1_1_ph; + $r_sroa_0_1_lcssa = $r_sroa_0_1_ph; + $carry_0_lcssa$1 = 0; + $carry_0_lcssa$0 = 0; + } else { + $d_sroa_0_0_insert_insert99$0 = $b$0 | 0 | 0; + $d_sroa_0_0_insert_insert99$1 = $d_sroa_1_4_extract_shift$0 | $b$1 & 0; + $137$0 = _i64Add($d_sroa_0_0_insert_insert99$0 | 0, $d_sroa_0_0_insert_insert99$1 | 0, -1, -1) | 0; + $137$1 = tempRet0; + $q_sroa_1_1198 = $q_sroa_1_1_ph; + $q_sroa_0_1199 = $q_sroa_0_1_ph; + $r_sroa_1_1200 = $r_sroa_1_1_ph; + $r_sroa_0_1201 = $r_sroa_0_1_ph; + $sr_1202 = $sr_1_ph; + $carry_0203 = 0; + do { + $q_sroa_1_1198$looptemp = $q_sroa_1_1198; + $q_sroa_1_1198 = $q_sroa_0_1199 >>> 31 | $q_sroa_1_1198 << 1; + $q_sroa_0_1199 = $carry_0203 | $q_sroa_0_1199 << 1; + $r_sroa_0_0_insert_insert42$0 = $r_sroa_0_1201 << 1 | $q_sroa_1_1198$looptemp >>> 31 | 0; + $r_sroa_0_0_insert_insert42$1 = $r_sroa_0_1201 >>> 31 | $r_sroa_1_1200 << 1 | 0; + _i64Subtract($137$0, $137$1, $r_sroa_0_0_insert_insert42$0, $r_sroa_0_0_insert_insert42$1) | 0; + $150$1 = tempRet0; + $151$0 = $150$1 >> 31 | (($150$1 | 0) < 0 ? -1 : 0) << 1; + $carry_0203 = $151$0 & 1; + $r_sroa_0_1201 = _i64Subtract($r_sroa_0_0_insert_insert42$0, $r_sroa_0_0_insert_insert42$1, $151$0 & $d_sroa_0_0_insert_insert99$0, ((($150$1 | 0) < 0 ? -1 : 0) >> 31 | (($150$1 | 0) < 0 ? -1 : 0) << 1) & $d_sroa_0_0_insert_insert99$1) | 0; + $r_sroa_1_1200 = tempRet0; + $sr_1202 = $sr_1202 - 1 | 0; + } while (($sr_1202 | 0) != 0); + $q_sroa_1_1_lcssa = $q_sroa_1_1198; + $q_sroa_0_1_lcssa = $q_sroa_0_1199; + $r_sroa_1_1_lcssa = $r_sroa_1_1200; + $r_sroa_0_1_lcssa = $r_sroa_0_1201; + $carry_0_lcssa$1 = 0; + $carry_0_lcssa$0 = $carry_0203; + } + $q_sroa_0_0_insert_ext75$0 = $q_sroa_0_1_lcssa; + $q_sroa_0_0_insert_ext75$1 = 0; + if ($rem) { + HEAP32[$rem >> 2] = $r_sroa_0_1_lcssa; + HEAP32[$rem + 4 >> 2] = $r_sroa_1_1_lcssa; + } + $_0$1 = ($q_sroa_0_0_insert_ext75$0 | 0) >>> 31 | ($q_sroa_1_1_lcssa | $q_sroa_0_0_insert_ext75$1) << 1 | ($q_sroa_0_0_insert_ext75$1 << 1 | $q_sroa_0_0_insert_ext75$0 >>> 31) & 0 | $carry_0_lcssa$1; + $_0$0 = ($q_sroa_0_0_insert_ext75$0 << 1 | 0 >>> 31) & -2 | $carry_0_lcssa$0; + return (tempRet0 = $_0$1, $_0$0) | 0; +} + +function _icpGetJ_U_S($J_U_S, $matXc2U, $matXw2Xc, $worldCoord) { + $J_U_S = $J_U_S | 0; + $matXc2U = $matXc2U | 0; + $matXw2Xc = $matXw2Xc | 0; + $worldCoord = $worldCoord | 0; + var $$0 = 0, $$lcssa = 0.0, $0 = 0.0, $1 = 0.0, $100 = 0, $101 = 0, $104 = 0, $106 = 0, $108 = 0, $109 = 0, $11 = 0.0, $115 = 0.0, $116 = 0.0, $12 = 0.0, $122 = 0.0, $125 = 0.0, $128 = 0.0, $129 = 0.0, $132 = 0.0, $136 = 0.0, $14 = 0.0, $141 = 0.0, $143 = 0.0, $146 = 0.0, $150 = 0.0, $155 = 0.0, $157 = 0.0, $16 = 0.0, $160 = 0.0, $164 = 0.0, $169 = 0.0, $171 = 0.0, $18 = 0.0, $19 = 0.0, $2 = 0.0, $202 = 0.0, $204 = 0.0, $206 = 0.0, $207 = 0, $21 = 0.0, $211 = 0.0, $215 = 0.0, $22 = 0.0, $24 = 0.0, $26 = 0.0, $28 = 0.0, $29 = 0.0, $31 = 0.0, $32 = 0.0, $34 = 0.0, $4 = 0.0, $5 = 0, $52 = 0.0, $6 = 0.0, $7 = 0.0, $71 = 0.0, $79 = 0.0, $9 = 0.0, $92 = 0, $93 = 0, $96 = 0, $98 = 0, $J_T_S$i = 0, $J_U_Xc = 0, $J_Xc_S = 0, $J_Xc_T$i = 0, $i$0$i7 = 0, $i$04 = 0, $j$0$i8 = 0, $j$05 = 0, $k$0$i6 = 0, $vararg_buffer = 0, dest = 0, sp = 0, stop = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 1072 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp + 1056 | 0; + $J_Xc_T$i = sp + 768 | 0; + $J_T_S$i = sp + 192 | 0; + $J_Xc_S = sp + 48 | 0; + $J_U_Xc = sp; + $0 = +HEAPF64[$matXw2Xc >> 3]; + $1 = +HEAPF64[$worldCoord >> 3]; + $2 = $0 * $1; + $4 = +HEAPF64[$matXw2Xc + 8 >> 3]; + $5 = $worldCoord + 8 | 0; + $6 = +HEAPF64[$5 >> 3]; + $7 = $4 * $6; + $9 = +HEAPF64[$matXw2Xc + 16 >> 3]; + $11 = +HEAPF64[$worldCoord + 16 >> 3]; + $12 = $9 * $11; + $14 = +HEAPF64[$matXw2Xc + 24 >> 3]; + $16 = +HEAPF64[$matXw2Xc + 32 >> 3]; + $18 = +HEAPF64[$matXw2Xc + 40 >> 3]; + $19 = $6 * $18; + $21 = +HEAPF64[$matXw2Xc + 48 >> 3]; + $22 = $11 * $21; + $24 = +HEAPF64[$matXw2Xc + 56 >> 3]; + $26 = +HEAPF64[$matXw2Xc + 64 >> 3]; + $28 = +HEAPF64[$matXw2Xc + 72 >> 3]; + $29 = $6 * $28; + $31 = +HEAPF64[$matXw2Xc + 80 >> 3]; + $32 = $11 * $31; + $34 = +HEAPF64[$matXw2Xc + 88 >> 3]; + HEAPF64[$J_Xc_T$i >> 3] = $2; + HEAPF64[$J_Xc_T$i + 8 >> 3] = $0 * $6; + HEAPF64[$J_Xc_T$i + 16 >> 3] = $0 * $11; + HEAPF64[$J_Xc_T$i + 24 >> 3] = $1 * $4; + HEAPF64[$J_Xc_T$i + 32 >> 3] = $7; + HEAPF64[$J_Xc_T$i + 40 >> 3] = $11 * $4; + HEAPF64[$J_Xc_T$i + 48 >> 3] = $1 * $9; + HEAPF64[$J_Xc_T$i + 56 >> 3] = $6 * $9; + HEAPF64[$J_Xc_T$i + 64 >> 3] = $12; + HEAPF64[$J_Xc_T$i + 72 >> 3] = $0; + HEAPF64[$J_Xc_T$i + 80 >> 3] = $4; + HEAPF64[$J_Xc_T$i + 88 >> 3] = $9; + $52 = $1 * $16; + HEAPF64[$J_Xc_T$i + 96 >> 3] = $52; + HEAPF64[$J_Xc_T$i + 104 >> 3] = $6 * $16; + HEAPF64[$J_Xc_T$i + 112 >> 3] = $11 * $16; + HEAPF64[$J_Xc_T$i + 120 >> 3] = $1 * $18; + HEAPF64[$J_Xc_T$i + 128 >> 3] = $19; + HEAPF64[$J_Xc_T$i + 136 >> 3] = $11 * $18; + HEAPF64[$J_Xc_T$i + 144 >> 3] = $1 * $21; + HEAPF64[$J_Xc_T$i + 152 >> 3] = $6 * $21; + HEAPF64[$J_Xc_T$i + 160 >> 3] = $22; + HEAPF64[$J_Xc_T$i + 168 >> 3] = $16; + HEAPF64[$J_Xc_T$i + 176 >> 3] = $18; + HEAPF64[$J_Xc_T$i + 184 >> 3] = $21; + $71 = $26 * $1; + HEAPF64[$J_Xc_T$i + 192 >> 3] = $71; + HEAPF64[$J_Xc_T$i + 200 >> 3] = $6 * $26; + HEAPF64[$J_Xc_T$i + 208 >> 3] = $11 * $26; + HEAPF64[$J_Xc_T$i + 216 >> 3] = $1 * $28; + $79 = +HEAPF64[$5 >> 3]; + HEAPF64[$J_Xc_T$i + 224 >> 3] = $28 * $79; + HEAPF64[$J_Xc_T$i + 232 >> 3] = $11 * $28; + HEAPF64[$J_Xc_T$i + 240 >> 3] = $1 * $31; + HEAPF64[$J_Xc_T$i + 248 >> 3] = $79 * $31; + HEAPF64[$J_Xc_T$i + 256 >> 3] = $32; + HEAPF64[$J_Xc_T$i + 264 >> 3] = $26; + HEAPF64[$J_Xc_T$i + 272 >> 3] = $28; + HEAPF64[$J_Xc_T$i + 280 >> 3] = $31; + $92 = $J_T_S$i + 64 | 0; + dest = $J_T_S$i; + stop = dest + 64 | 0; + do { + HEAP32[dest >> 2] = 0; + dest = dest + 4 | 0; + } while ((dest | 0) < (stop | 0)); + HEAPF64[$92 >> 3] = -1.0; + $93 = $J_T_S$i + 72 | 0; + HEAP32[$93 >> 2] = 0; + HEAP32[$93 + 4 >> 2] = 0; + HEAP32[$93 + 8 >> 2] = 0; + HEAP32[$93 + 12 >> 2] = 0; + HEAP32[$93 + 16 >> 2] = 0; + HEAP32[$93 + 20 >> 2] = 0; + HEAP32[$93 + 24 >> 2] = 0; + HEAP32[$93 + 28 >> 2] = 0; + HEAPF64[$J_T_S$i + 104 >> 3] = 1.0; + $96 = $J_T_S$i + 160 | 0; + dest = $J_T_S$i + 112 | 0; + stop = dest + 48 | 0; + do { + HEAP32[dest >> 2] = 0; + dest = dest + 4 | 0; + } while ((dest | 0) < (stop | 0)); + HEAPF64[$96 >> 3] = 1.0; + $98 = $J_T_S$i + 240 | 0; + dest = $J_T_S$i + 168 | 0; + stop = dest + 72 | 0; + do { + HEAP32[dest >> 2] = 0; + dest = dest + 4 | 0; + } while ((dest | 0) < (stop | 0)); + HEAPF64[$98 >> 3] = -1.0; + $100 = $J_T_S$i + 296 | 0; + dest = $J_T_S$i + 248 | 0; + stop = dest + 48 | 0; + do { + HEAP32[dest >> 2] = 0; + dest = dest + 4 | 0; + } while ((dest | 0) < (stop | 0)); + HEAPF64[$100 >> 3] = -1.0; + $101 = $J_T_S$i + 304 | 0; + HEAP32[$101 >> 2] = 0; + HEAP32[$101 + 4 >> 2] = 0; + HEAP32[$101 + 8 >> 2] = 0; + HEAP32[$101 + 12 >> 2] = 0; + HEAP32[$101 + 16 >> 2] = 0; + HEAP32[$101 + 20 >> 2] = 0; + HEAP32[$101 + 24 >> 2] = 0; + HEAP32[$101 + 28 >> 2] = 0; + HEAPF64[$J_T_S$i + 336 >> 3] = 1.0; + $104 = $J_T_S$i + 456 | 0; + dest = $J_T_S$i + 344 | 0; + stop = dest + 112 | 0; + do { + HEAP32[dest >> 2] = 0; + dest = dest + 4 | 0; + } while ((dest | 0) < (stop | 0)); + HEAPF64[$104 >> 3] = 1.0; + $106 = $J_T_S$i + 512 | 0; + dest = $J_T_S$i + 464 | 0; + stop = dest + 48 | 0; + do { + HEAP32[dest >> 2] = 0; + dest = dest + 4 | 0; + } while ((dest | 0) < (stop | 0)); + HEAPF64[$106 >> 3] = 1.0; + $108 = $J_T_S$i + 568 | 0; + dest = $J_T_S$i + 520 | 0; + stop = dest + 48 | 0; + do { + HEAP32[dest >> 2] = 0; + dest = dest + 4 | 0; + } while ((dest | 0) < (stop | 0)); + HEAPF64[$108 >> 3] = 1.0; + $j$0$i8 = 0; + do { + $i$0$i7 = 0; + do { + $109 = $J_Xc_S + ($j$0$i8 * 48 | 0) + ($i$0$i7 << 3) | 0; + HEAPF64[$109 >> 3] = 0.0; + $116 = 0.0; + $k$0$i6 = 0; + while (1) { + $115 = $116 + +HEAPF64[$J_Xc_T$i + ($j$0$i8 * 96 | 0) + ($k$0$i6 << 3) >> 3] * +HEAPF64[$J_T_S$i + ($k$0$i6 * 48 | 0) + ($i$0$i7 << 3) >> 3]; + $k$0$i6 = $k$0$i6 + 1 | 0; + if (($k$0$i6 | 0) == 12) { + $$lcssa = $115; + break; + } else $116 = $115; + } + HEAPF64[$109 >> 3] = $$lcssa; + $i$0$i7 = $i$0$i7 + 1 | 0; + } while (($i$0$i7 | 0) != 6); + $j$0$i8 = $j$0$i8 + 1 | 0; + } while (($j$0$i8 | 0) != 3); + $122 = $14 + ($2 + $7 + $12); + $125 = $24 + ($52 + $19 + $22); + $128 = $34 + ($71 + $29 + $32); + $129 = +HEAPF64[$matXc2U >> 3]; + $132 = +HEAPF64[$matXc2U + 8 >> 3]; + $136 = +HEAPF64[$matXc2U + 16 >> 3]; + $141 = +HEAPF64[$matXc2U + 24 >> 3] + ($122 * $129 + $125 * $132 + $128 * $136); + $143 = +HEAPF64[$matXc2U + 32 >> 3]; + $146 = +HEAPF64[$matXc2U + 40 >> 3]; + $150 = +HEAPF64[$matXc2U + 48 >> 3]; + $155 = +HEAPF64[$matXc2U + 56 >> 3] + ($122 * $143 + $125 * $146 + $128 * $150); + $157 = +HEAPF64[$matXc2U + 64 >> 3]; + $160 = +HEAPF64[$matXc2U + 72 >> 3]; + $164 = +HEAPF64[$matXc2U + 80 >> 3]; + $169 = +HEAPF64[$matXc2U + 88 >> 3] + ($122 * $157 + $125 * $160 + $128 * $164); + if ($169 == 0.0) { + _arLog(3, 5089, $vararg_buffer); + $$0 = -1; + } else { + $171 = $169 * $169; + HEAPF64[$J_U_Xc >> 3] = ($129 * $169 - $141 * $157) / $171; + HEAPF64[$J_U_Xc + 8 >> 3] = ($169 * $132 - $141 * $160) / $171; + HEAPF64[$J_U_Xc + 16 >> 3] = ($169 * $136 - $141 * $164) / $171; + HEAPF64[$J_U_Xc + 24 >> 3] = ($169 * $143 - $155 * $157) / $171; + HEAPF64[$J_U_Xc + 32 >> 3] = ($169 * $146 - $155 * $160) / $171; + HEAPF64[$J_U_Xc + 40 >> 3] = ($169 * $150 - $155 * $164) / $171; + $j$05 = 0; + do { + $202 = +HEAPF64[$J_U_Xc + ($j$05 * 24 | 0) >> 3]; + $204 = +HEAPF64[$J_U_Xc + ($j$05 * 24 | 0) + 8 >> 3]; + $206 = +HEAPF64[$J_U_Xc + ($j$05 * 24 | 0) + 16 >> 3]; + $i$04 = 0; + do { + $207 = $J_U_S + ($j$05 * 48 | 0) + ($i$04 << 3) | 0; + HEAPF64[$207 >> 3] = 0.0; + $211 = $202 * +HEAPF64[$J_Xc_S + ($i$04 << 3) >> 3] + 0.0; + HEAPF64[$207 >> 3] = $211; + $215 = $211 + $204 * +HEAPF64[$J_Xc_S + 48 + ($i$04 << 3) >> 3]; + HEAPF64[$207 >> 3] = $215; + HEAPF64[$207 >> 3] = $215 + $206 * +HEAPF64[$J_Xc_S + 96 + ($i$04 << 3) >> 3]; + $i$04 = $i$04 + 1 | 0; + } while (($i$04 | 0) != 6); + $j$05 = $j$05 + 1 | 0; + } while (($j$05 | 0) != 2); + $$0 = 0; + } + STACKTOP = sp; + return $$0 | 0; +} + +function __ZN10__cxxabiv112_GLOBAL__N_120parse_function_paramINS0_2DbEEEPKcS4_S4_RT_($first, $last, $db) { + $first = $first | 0; + $last = $last | 0; + $db = $db | 0; + var $$0 = 0, $$0$i$i$i = 0, $$0$i$i$i18 = 0, $$0$i$i1027 = 0, $$0$i$i24 = 0, $0 = 0, $1 = 0, $101 = 0, $102 = 0, $104 = 0, $111 = 0, $112 = 0, $113 = 0, $114 = 0, $118 = 0, $120 = 0, $123 = 0, $124 = 0, $15 = 0, $16 = 0, $2 = 0, $22 = 0, $29 = 0, $3 = 0, $30 = 0, $39 = 0, $4 = 0, $42 = 0, $43 = 0, $45 = 0, $5 = 0, $52 = 0, $53 = 0, $54 = 0, $55 = 0, $59 = 0, $61 = 0, $64 = 0, $65 = 0, $69 = 0, $74 = 0, $75 = 0, $81 = 0, $88 = 0, $89 = 0, $98 = 0, $__p$0$i$i23 = 0, $__p$0$i$i926 = 0, $__p$0$ph$i$i = 0, $__p$0$ph$i$i7 = 0, $__v$i$i17 = 0, $cv = 0, $cv1 = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 128 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $__v$i$i17 = sp + 108 | 0; + $cv = sp + 104 | 0; + $0 = sp + 80 | 0; + $1 = sp + 64 | 0; + $2 = sp + 52 | 0; + $cv1 = sp + 48 | 0; + $3 = sp + 24 | 0; + $4 = sp + 12 | 0; + $5 = sp; + L1 : do if (($last - $first | 0) > 2) if ((HEAP8[$first >> 0] | 0) == 102) { + switch (HEAP8[$first + 1 >> 0] | 0) { + case 112: + { + $15 = __ZN10__cxxabiv112_GLOBAL__N_119parse_cv_qualifiersEPKcS2_Rj($first + 2 | 0, $last, $cv) | 0; + $16 = __ZN10__cxxabiv112_GLOBAL__N_112parse_numberEPKcS2_($15, $last) | 0; + if (($16 | 0) == ($last | 0)) { + $$0 = $first; + break L1; + } + if ((HEAP8[$16 >> 0] | 0) != 95) { + $$0 = $first; + break L1; + } + $22 = $16 - $15 | 0; + if ($22 >>> 0 > 4294967279) __ZNKSt3__121__basic_string_commonILb1EE20__throw_length_errorEv($2); + if ($22 >>> 0 < 11) { + HEAP8[$2 >> 0] = $22 << 1; + $__p$0$ph$i$i = $2 + 1 | 0; + } else { + $29 = $22 + 16 & -16; + $30 = _malloc($29) | 0; + HEAP32[$2 + 8 >> 2] = $30; + HEAP32[$2 >> 2] = $29 | 1; + HEAP32[$2 + 4 >> 2] = $22; + $__p$0$ph$i$i = $30; + } + if (($15 | 0) != ($16 | 0)) { + $$0$i$i24 = $15; + $__p$0$i$i23 = $__p$0$ph$i$i; + while (1) { + HEAP8[$__p$0$i$i23 >> 0] = HEAP8[$$0$i$i24 >> 0] | 0; + $$0$i$i24 = $$0$i$i24 + 1 | 0; + if (($$0$i$i24 | 0) == ($16 | 0)) break; else $__p$0$i$i23 = $__p$0$i$i23 + 1 | 0; + } + } + HEAP8[$__p$0$ph$i$i + $22 >> 0] = 0; + $39 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc($2, 0, 14149) | 0; + HEAP32[$1 >> 2] = HEAP32[$39 >> 2]; + HEAP32[$1 + 4 >> 2] = HEAP32[$39 + 4 >> 2]; + HEAP32[$1 + 8 >> 2] = HEAP32[$39 + 8 >> 2]; + HEAP32[$39 >> 2] = 0; + HEAP32[$39 + 4 >> 2] = 0; + HEAP32[$39 + 8 >> 2] = 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ENSt3__112basic_stringIcNS2_11char_traitsIcEENS0_12malloc_allocIcEEEE($0, $1); + $42 = $db + 4 | 0; + $43 = HEAP32[$42 >> 2] | 0; + $45 = HEAP32[$db + 8 >> 2] | 0; + if ($43 >>> 0 < $45 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($43, $0); + HEAP32[$42 >> 2] = (HEAP32[$42 >> 2] | 0) + 24; + } else { + $52 = HEAP32[$db >> 2] | 0; + $53 = $43 - $52 | 0; + $54 = ($53 | 0) / 24 | 0; + $55 = $54 + 1 | 0; + if (($53 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $59 = ($45 - $52 | 0) / 24 | 0; + if ($59 >>> 0 < 1073741823) { + $61 = $59 << 1; + $$0$i$i$i = $61 >>> 0 < $55 >>> 0 ? $55 : $61; + } else $$0$i$i$i = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i17, $$0$i$i$i, $54, $db + 12 | 0); + $64 = $__v$i$i17 + 8 | 0; + $65 = HEAP32[$64 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($65, $0); + HEAP32[$64 >> 2] = $65 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i17); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i17); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($0); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($1); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($2); + $$0 = $16 + 1 | 0; + break L1; + break; + } + case 76: + break; + default: + { + $$0 = $first; + break L1; + } + } + $69 = __ZN10__cxxabiv112_GLOBAL__N_112parse_numberEPKcS2_($first + 2 | 0, $last) | 0; + if (($69 | 0) == ($last | 0)) $$0 = $first; else if ((HEAP8[$69 >> 0] | 0) == 112) { + $74 = __ZN10__cxxabiv112_GLOBAL__N_119parse_cv_qualifiersEPKcS2_Rj($69 + 1 | 0, $last, $cv1) | 0; + $75 = __ZN10__cxxabiv112_GLOBAL__N_112parse_numberEPKcS2_($74, $last) | 0; + if (($75 | 0) == ($last | 0)) $$0 = $first; else if ((HEAP8[$75 >> 0] | 0) == 95) { + $81 = $75 - $74 | 0; + if ($81 >>> 0 > 4294967279) __ZNKSt3__121__basic_string_commonILb1EE20__throw_length_errorEv($5); + if ($81 >>> 0 < 11) { + HEAP8[$5 >> 0] = $81 << 1; + $__p$0$ph$i$i7 = $5 + 1 | 0; + } else { + $88 = $81 + 16 & -16; + $89 = _malloc($88) | 0; + HEAP32[$5 + 8 >> 2] = $89; + HEAP32[$5 >> 2] = $88 | 1; + HEAP32[$5 + 4 >> 2] = $81; + $__p$0$ph$i$i7 = $89; + } + if (($74 | 0) != ($75 | 0)) { + $$0$i$i1027 = $74; + $__p$0$i$i926 = $__p$0$ph$i$i7; + while (1) { + HEAP8[$__p$0$i$i926 >> 0] = HEAP8[$$0$i$i1027 >> 0] | 0; + $$0$i$i1027 = $$0$i$i1027 + 1 | 0; + if (($$0$i$i1027 | 0) == ($75 | 0)) break; else $__p$0$i$i926 = $__p$0$i$i926 + 1 | 0; + } + } + HEAP8[$__p$0$ph$i$i7 + $81 >> 0] = 0; + $98 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc($5, 0, 14149) | 0; + HEAP32[$4 >> 2] = HEAP32[$98 >> 2]; + HEAP32[$4 + 4 >> 2] = HEAP32[$98 + 4 >> 2]; + HEAP32[$4 + 8 >> 2] = HEAP32[$98 + 8 >> 2]; + HEAP32[$98 >> 2] = 0; + HEAP32[$98 + 4 >> 2] = 0; + HEAP32[$98 + 8 >> 2] = 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ENSt3__112basic_stringIcNS2_11char_traitsIcEENS0_12malloc_allocIcEEEE($3, $4); + $101 = $db + 4 | 0; + $102 = HEAP32[$101 >> 2] | 0; + $104 = HEAP32[$db + 8 >> 2] | 0; + if ($102 >>> 0 < $104 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($102, $3); + HEAP32[$101 >> 2] = (HEAP32[$101 >> 2] | 0) + 24; + } else { + $111 = HEAP32[$db >> 2] | 0; + $112 = $102 - $111 | 0; + $113 = ($112 | 0) / 24 | 0; + $114 = $113 + 1 | 0; + if (($112 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $118 = ($104 - $111 | 0) / 24 | 0; + if ($118 >>> 0 < 1073741823) { + $120 = $118 << 1; + $$0$i$i$i18 = $120 >>> 0 < $114 >>> 0 ? $114 : $120; + } else $$0$i$i$i18 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i17, $$0$i$i$i18, $113, $db + 12 | 0); + $123 = $__v$i$i17 + 8 | 0; + $124 = HEAP32[$123 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($124, $3); + HEAP32[$123 >> 2] = $124 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i17); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i17); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($3); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($4); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($5); + $$0 = $75 + 1 | 0; + } else $$0 = $first; + } else $$0 = $first; + } else $$0 = $first; else $$0 = $first; while (0); + STACKTOP = sp; + return $$0 | 0; +} + +function _icpPointRobust($handle, $data, $initMatXw2Xc, $matXw2Xc, $err) { + $handle = $handle | 0; + $data = $data | 0; + $initMatXw2Xc = $initMatXw2Xc | 0; + $matXw2Xc = $matXw2Xc | 0; + $err = $err | 0; + var $$ = 0, $$0 = 0, $$lcssa = 0, $$lcssa50 = 0.0, $$pn = 0.0, $$pre = 0, $0 = 0, $1 = 0, $101 = 0, $102 = 0, $108 = 0.0, $109 = 0.0, $11 = 0, $113 = 0, $117 = 0, $121 = 0, $125 = 0, $129 = 0, $133 = 0, $137 = 0, $14 = 0, $141 = 0, $145 = 0, $149 = 0, $153 = 0, $156 = 0, $16 = 0, $17 = 0, $174 = 0, $19 = 0, $21 = 0, $22 = 0, $23 = 0, $24 = 0, $25 = 0, $26 = 0, $27 = 0, $41 = 0, $47 = 0, $51 = 0.0, $55 = 0.0, $56 = 0, $62 = 0.0, $66 = 0, $69 = 0.0, $71 = 0, $72 = 0.0, $75 = 0.0, $78 = 0.0, $8 = 0, $86 = 0.0, $99 = 0.0, $K2$0 = 0.0, $U = 0, $dS = 0, $err0$0 = 0.0, $err1$0$lcssa = 0.0, $err1$032 = 0.0, $err1$1 = 0.0, $i$1 = 0, $j$043 = 0, $j$131 = 0, $j$233 = 0, $j$338 = 0, $k$0$lcssa = 0, $k$039 = 0, $k$1 = 0, $matXw2U = 0, $vararg_buffer = 0, $vararg_buffer1 = 0, $vararg_buffer3 = 0, $vararg_buffer5 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 192 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer5 = sp + 184 | 0; + $vararg_buffer3 = sp + 176 | 0; + $vararg_buffer1 = sp + 168 | 0; + $vararg_buffer = sp + 160 | 0; + $U = sp + 48 | 0; + $matXw2U = sp + 64 | 0; + $dS = sp; + $0 = $data + 8 | 0; + $1 = HEAP32[$0 >> 2] | 0; + do if (($1 | 0) < 4) $$0 = -1; else { + $8 = ~~(+($1 | 0) * +HEAPF64[$handle + 128 >> 3]) + -1 | 0; + $$ = ($8 | 0) < 3 ? 3 : $8; + $11 = _malloc($1 * 96 | 0) | 0; + if (!$11) { + _arLog(3, 5109, $vararg_buffer); + $$0 = -1; + break; + } + $14 = _malloc($1 << 4) | 0; + if (!$14) { + _arLog(3, 5109, $vararg_buffer1); + _free($11); + $$0 = -1; + break; + } + $16 = $1 << 3; + $17 = _malloc($16) | 0; + if (!$17) { + _arLog(3, 5109, $vararg_buffer3); + _free($11); + _free($14); + $$0 = -1; + break; + } + $19 = _malloc($16) | 0; + if (!$19) { + _arLog(3, 5109, $vararg_buffer5); + _free($11); + _free($14); + _free($17); + $$0 = -1; + break; + } else $j$043 = 0; + do { + HEAPF64[$matXw2Xc + ($j$043 << 5) >> 3] = +HEAPF64[$initMatXw2Xc + ($j$043 << 5) >> 3]; + HEAPF64[$matXw2Xc + ($j$043 << 5) + 8 >> 3] = +HEAPF64[$initMatXw2Xc + ($j$043 << 5) + 8 >> 3]; + HEAPF64[$matXw2Xc + ($j$043 << 5) + 16 >> 3] = +HEAPF64[$initMatXw2Xc + ($j$043 << 5) + 16 >> 3]; + HEAPF64[$matXw2Xc + ($j$043 << 5) + 24 >> 3] = +HEAPF64[$initMatXw2Xc + ($j$043 << 5) + 24 >> 3]; + $j$043 = $j$043 + 1 | 0; + } while (($j$043 | 0) != 3); + $21 = $data + 4 | 0; + $22 = $U + 8 | 0; + $23 = $19 + ($$ << 3) | 0; + $24 = $handle + 104 | 0; + $25 = $handle + 120 | 0; + $26 = $handle + 112 | 0; + $27 = $handle + 96 | 0; + $err0$0 = 0.0; + $i$1 = 0; + L17 : while (1) { + _arUtilMatMul($handle, $matXw2Xc, $matXw2U) | 0; + $41 = HEAP32[$0 >> 2] | 0; + if (($41 | 0) > 0) { + $j$131 = 0; + while (1) { + if ((_icpGetU_from_X_by_MatX2U($U, $matXw2U, (HEAP32[$21 >> 2] | 0) + ($j$131 * 24 | 0) | 0) | 0) < 0) { + label = 14; + break L17; + } + $47 = HEAP32[$data >> 2] | 0; + $51 = +HEAPF64[$47 + ($j$131 << 4) >> 3] - +HEAPF64[$U >> 3]; + $55 = +HEAPF64[$47 + ($j$131 << 4) + 8 >> 3] - +HEAPF64[$22 >> 3]; + $56 = $j$131 << 1; + HEAPF64[$14 + ($56 << 3) >> 3] = $51; + HEAPF64[$14 + (($56 | 1) << 3) >> 3] = $55; + $62 = $51 * $51 + $55 * $55; + HEAPF64[$19 + ($j$131 << 3) >> 3] = $62; + HEAPF64[$17 + ($j$131 << 3) >> 3] = $62; + $j$131 = $j$131 + 1 | 0; + $66 = HEAP32[$0 >> 2] | 0; + if (($j$131 | 0) >= ($66 | 0)) { + $$lcssa = $66; + break; + } + } + } else $$lcssa = $41; + _qsort($19, $$lcssa, 8, 1); + $69 = +HEAPF64[$23 >> 3] * 4.0; + $K2$0 = $69 < 16.0 ? 16.0 : $69; + $71 = HEAP32[$0 >> 2] | 0; + $72 = $K2$0 / 6.0; + if (($71 | 0) > 0) { + $err1$032 = 0.0; + $j$233 = 0; + while (1) { + $75 = +HEAPF64[$19 + ($j$233 << 3) >> 3]; + if ($75 > $K2$0) $$pn = $72; else { + $78 = 1.0 - $75 / $K2$0; + $$pn = $72 * (1.0 - $78 * ($78 * $78)); + } + $err1$1 = $err1$032 + $$pn; + $j$233 = $j$233 + 1 | 0; + if (($j$233 | 0) >= ($71 | 0)) { + $err1$0$lcssa = $err1$1; + break; + } else $err1$032 = $err1$1; + } + } else $err1$0$lcssa = 0.0; + $86 = $err1$0$lcssa / +($71 | 0); + if ($86 < +HEAPF64[$24 >> 3]) { + $$lcssa50 = $86; + label = 36; + break; + } + if (($i$1 | 0) > 0) if ($86 < +HEAPF64[$25 >> 3]) if ($86 / $err0$0 > +HEAPF64[$26 >> 3]) { + $$lcssa50 = $86; + label = 36; + break; + } + if (($i$1 | 0) == (HEAP32[$27 >> 2] | 0)) { + $$lcssa50 = $86; + label = 36; + break; + } + if (($71 | 0) > 0) { + $174 = $71; + $j$338 = 0; + $k$039 = 0; + while (1) { + $99 = +HEAPF64[$17 + ($j$338 << 3) >> 3]; + if (!($99 <= $K2$0)) { + $$pre = $174; + $k$1 = $k$039; + } else { + $101 = $k$039 * 6 | 0; + $102 = $11 + ($101 << 3) | 0; + if ((_icpGetJ_U_S($102, $handle, $matXw2Xc, (HEAP32[$21 >> 2] | 0) + ($j$338 * 24 | 0) | 0) | 0) < 0) { + label = 28; + break L17; + } + $108 = 1.0 - $99 / $K2$0; + $109 = $108 * $108; + HEAPF64[$102 >> 3] = +HEAPF64[$102 >> 3] * $109; + $113 = $11 + (($101 | 1) << 3) | 0; + HEAPF64[$113 >> 3] = +HEAPF64[$113 >> 3] * $109; + $117 = $11 + ($101 + 2 << 3) | 0; + HEAPF64[$117 >> 3] = $109 * +HEAPF64[$117 >> 3]; + $121 = $11 + ($101 + 3 << 3) | 0; + HEAPF64[$121 >> 3] = $109 * +HEAPF64[$121 >> 3]; + $125 = $11 + ($101 + 4 << 3) | 0; + HEAPF64[$125 >> 3] = $109 * +HEAPF64[$125 >> 3]; + $129 = $11 + ($101 + 5 << 3) | 0; + HEAPF64[$129 >> 3] = $109 * +HEAPF64[$129 >> 3]; + $133 = $11 + ($101 + 6 << 3) | 0; + HEAPF64[$133 >> 3] = $109 * +HEAPF64[$133 >> 3]; + $137 = $11 + ($101 + 7 << 3) | 0; + HEAPF64[$137 >> 3] = $109 * +HEAPF64[$137 >> 3]; + $141 = $11 + ($101 + 8 << 3) | 0; + HEAPF64[$141 >> 3] = $109 * +HEAPF64[$141 >> 3]; + $145 = $11 + ($101 + 9 << 3) | 0; + HEAPF64[$145 >> 3] = $109 * +HEAPF64[$145 >> 3]; + $149 = $11 + ($101 + 10 << 3) | 0; + HEAPF64[$149 >> 3] = $109 * +HEAPF64[$149 >> 3]; + $153 = $11 + ($101 + 11 << 3) | 0; + HEAPF64[$153 >> 3] = $109 * +HEAPF64[$153 >> 3]; + $156 = $j$338 << 1; + HEAPF64[$14 + ($k$039 << 3) >> 3] = $109 * +HEAPF64[$14 + ($156 << 3) >> 3]; + HEAPF64[$14 + ($k$039 + 1 << 3) >> 3] = $109 * +HEAPF64[$14 + (($156 | 1) << 3) >> 3]; + $$pre = HEAP32[$0 >> 2] | 0; + $k$1 = $k$039 + 2 | 0; + } + $j$338 = $j$338 + 1 | 0; + if (($j$338 | 0) >= ($$pre | 0)) { + $k$0$lcssa = $k$1; + break; + } else { + $174 = $$pre; + $k$039 = $k$1; + } + } + } else $k$0$lcssa = 0; + if (($k$0$lcssa | 0) < 6) { + label = 32; + break; + } + if ((_icpGetDeltaS($dS, $14, $11, $k$0$lcssa) | 0) < 0) { + label = 34; + break; + } + _icpUpdateMat($matXw2Xc, $dS) | 0; + $err0$0 = $86; + $i$1 = $i$1 + 1 | 0; + } + if ((label | 0) == 14) { + _icpGetXw2XcCleanup295($11, $14, $17, $19); + $$0 = -1; + break; + } else if ((label | 0) == 28) { + _icpGetXw2XcCleanup295($11, $14, $17, $19); + $$0 = -1; + break; + } else if ((label | 0) == 32) { + _icpGetXw2XcCleanup295($11, $14, $17, $19); + $$0 = -1; + break; + } else if ((label | 0) == 34) { + _icpGetXw2XcCleanup295($11, $14, $17, $19); + $$0 = -1; + break; + } else if ((label | 0) == 36) { + HEAPF64[$err >> 3] = $$lcssa50; + _free($11); + _free($14); + _free($17); + _free($19); + $$0 = 0; + break; + } + } while (0); + STACKTOP = sp; + return $$0 | 0; +} + +function _arParamObserv2Ideal($dist_factor, $ox, $oy, $ix, $iy, $dist_function_version) { + $dist_factor = $dist_factor | 0; + $ox = +$ox; + $oy = +$oy; + $ix = $ix | 0; + $iy = $iy | 0; + $dist_function_version = $dist_function_version | 0; + var $$0 = 0, $0 = 0.0, $10 = 0.0, $101 = 0.0, $103 = 0.0, $104 = 0, $106 = 0.0, $109 = 0.0, $113 = 0.0, $116 = 0.0, $117 = 0.0, $118 = 0.0, $119 = 0.0, $12 = 0.0, $134 = 0.0, $14 = 0.0, $146 = 0, $154 = 0.0, $155 = 0.0, $156 = 0, $158 = 0.0, $16 = 0.0, $161 = 0.0, $165 = 0.0, $168 = 0.0, $169 = 0.0, $170 = 0.0, $171 = 0.0, $18 = 0.0, $186 = 0.0, $198 = 0, $2 = 0.0, $20 = 0.0, $206 = 0.0, $207 = 0.0, $208 = 0, $21 = 0.0, $210 = 0.0, $213 = 0.0, $216 = 0.0, $217 = 0.0, $218 = 0.0, $22 = 0.0, $227 = 0.0, $23 = 0.0, $239 = 0, $24 = 0.0, $25 = 0.0, $26 = 0.0, $29 = 0.0, $34 = 0.0, $4 = 0.0, $44 = 0.0, $50 = 0.0, $6 = 0.0, $67 = 0.0, $8 = 0.0, $i$03 = 0, $i14$029 = 0, $i21$042 = 0, $i5$015 = 0, $px$07 = 0.0, $px$1 = 0.0, $px12$027 = 0.0, $px12$1 = 0.0, $px19$040 = 0.0, $px19$1 = 0.0, $px3$012 = 0.0, $px3$1 = 0.0, $py$06 = 0.0, $py$1 = 0.0, $py13$028 = 0.0, $py13$1 = 0.0, $py20$041 = 0.0, $py20$1 = 0.0, $py4$013 = 0.0, $py4$1 = 0.0, $x02$05 = 0.0, $y02$04 = 0.0, $z0$014 = 0.0, $z016$039 = 0.0, $z02$016 = 0.0, $z0215$038 = 0.0, $z026$025 = 0.0, $z07$026 = 0.0; + switch ($dist_function_version | 0) { + case 4: + { + $0 = +HEAPF64[$dist_factor >> 3]; + $2 = +HEAPF64[$dist_factor + 8 >> 3]; + $4 = +HEAPF64[$dist_factor + 16 >> 3]; + $6 = +HEAPF64[$dist_factor + 24 >> 3]; + $8 = +HEAPF64[$dist_factor + 32 >> 3]; + $10 = +HEAPF64[$dist_factor + 40 >> 3]; + $12 = +HEAPF64[$dist_factor + 48 >> 3]; + $14 = +HEAPF64[$dist_factor + 56 >> 3]; + $16 = +HEAPF64[$dist_factor + 64 >> 3]; + $18 = ($ox - $12) / $8; + $20 = ($oy - $14) / $10; + $21 = $18 * $18; + $22 = $20 * $20; + $23 = $4 * 2.0; + $24 = $6 * 6.0; + $25 = $6 * 2.0; + $26 = $4 * 6.0; + L3 : do if ($22 != 0.0 | $21 != 0.0) { + $i$03 = 1; + $px$07 = $18; + $py$06 = $20; + $x02$05 = $21; + $y02$04 = $22; + while (1) { + $29 = $y02$04 + $x02$05; + $34 = $0 * $29 + 1.0 + $29 * ($2 * $29); + $44 = $x02$05 * 3.0; + $50 = $y02$04 * $44; + $px$07 = $px$07 - ($6 * ($29 + $x02$05 * 2.0) + ($py$06 * ($23 * $px$07) + $px$07 * $34) - $18) / ($24 * $px$07 + ($23 * $py$06 + ($0 * ($y02$04 + $44) + 1.0 + $2 * ($y02$04 * $y02$04 + ($x02$05 * ($x02$05 * 5.0) + $50))))); + $67 = $25 * $px$07; + $py$06 = $py$06 - ($4 * ($y02$04 * 2.0 + $29) + $py$06 * $34 + $py$06 * $67 - $20) / ($26 * $py$06 + ($0 * ($x02$05 + $y02$04 * 3.0) + 1.0 + $2 * ($y02$04 * ($y02$04 * 5.0) + ($x02$05 * $x02$05 + $50))) + $67); + if (($i$03 | 0) == 4) { + $px$1 = $px$07; + $py$1 = $py$06; + break L3; + } + $x02$05 = $px$07 * $px$07; + $y02$04 = $py$06 * $py$06; + if (!($y02$04 != 0.0 | $x02$05 != 0.0)) { + $px$1 = 0.0; + $py$1 = 0.0; + break; + } else $i$03 = $i$03 + 1 | 0; + } + } else { + $px$1 = 0.0; + $py$1 = 0.0; + } while (0); + HEAPF64[$ix >> 3] = $12 + $8 * $px$1 / $16; + HEAPF64[$iy >> 3] = $14 + $10 * $py$1 / $16; + $$0 = 0; + break; + } + case 3: + { + $101 = +HEAPF64[$dist_factor >> 3]; + $103 = ($ox - $101) / +HEAPF64[$dist_factor + 24 >> 3]; + $104 = $dist_factor + 8 | 0; + $106 = $oy - +HEAPF64[$104 >> 3]; + $109 = +HEAPF64[$dist_factor + 32 >> 3] / 1.0e8; + $113 = +HEAPF64[$dist_factor + 40 >> 3] / 1.0e8 / 1.0e5; + $116 = $103 * $103 + $106 * $106; + $117 = +Math_sqrt(+$116); + $118 = $109 * 3.0; + $119 = $113 * 5.0; + L9 : do if ($117 != 0.0) { + $i5$015 = 1; + $px3$012 = $103; + $py4$013 = $106; + $z0$014 = $117; + $z02$016 = $116; + while (1) { + $134 = $z0$014 - ($z0$014 * (1.0 - $109 * $z02$016 - $z02$016 * ($113 * $z02$016)) - $117) / (1.0 - $118 * $z02$016 - $z02$016 * ($119 * $z02$016)); + $px3$012 = $px3$012 * $134 / $z0$014; + $py4$013 = $py4$013 * $134 / $z0$014; + if (($i5$015 | 0) == 3) { + $px3$1 = $px3$012; + $py4$1 = $py4$013; + break L9; + } + $z02$016 = $px3$012 * $px3$012 + $py4$013 * $py4$013; + $z0$014 = +Math_sqrt(+$z02$016); + if (!($z0$014 != 0.0)) { + $px3$1 = 0.0; + $py4$1 = 0.0; + break; + } else $i5$015 = $i5$015 + 1 | 0; + } + } else { + $px3$1 = 0.0; + $py4$1 = 0.0; + } while (0); + $146 = $dist_factor + 16 | 0; + HEAPF64[$ix >> 3] = $px3$1 / +HEAPF64[$146 >> 3] + $101; + HEAPF64[$iy >> 3] = $py4$1 / +HEAPF64[$146 >> 3] + +HEAPF64[$104 >> 3]; + $$0 = 0; + break; + } + case 2: + { + $154 = +HEAPF64[$dist_factor >> 3]; + $155 = $ox - $154; + $156 = $dist_factor + 8 | 0; + $158 = $oy - +HEAPF64[$156 >> 3]; + $161 = +HEAPF64[$dist_factor + 24 >> 3] / 1.0e8; + $165 = +HEAPF64[$dist_factor + 32 >> 3] / 1.0e8 / 1.0e5; + $168 = $155 * $155 + $158 * $158; + $169 = +Math_sqrt(+$168); + $170 = $161 * 3.0; + $171 = $165 * 5.0; + L15 : do if ($169 != 0.0) { + $i14$029 = 1; + $px12$027 = $155; + $py13$028 = $158; + $z026$025 = $168; + $z07$026 = $169; + while (1) { + $186 = $z07$026 - ($z07$026 * (1.0 - $161 * $z026$025 - $z026$025 * ($165 * $z026$025)) - $169) / (1.0 - $170 * $z026$025 - $z026$025 * ($171 * $z026$025)); + $px12$027 = $px12$027 * $186 / $z07$026; + $py13$028 = $py13$028 * $186 / $z07$026; + if (($i14$029 | 0) == 3) { + $px12$1 = $px12$027; + $py13$1 = $py13$028; + break L15; + } + $z026$025 = $px12$027 * $px12$027 + $py13$028 * $py13$028; + $z07$026 = +Math_sqrt(+$z026$025); + if (!($z07$026 != 0.0)) { + $px12$1 = 0.0; + $py13$1 = 0.0; + break; + } else $i14$029 = $i14$029 + 1 | 0; + } + } else { + $px12$1 = 0.0; + $py13$1 = 0.0; + } while (0); + $198 = $dist_factor + 16 | 0; + HEAPF64[$ix >> 3] = $px12$1 / +HEAPF64[$198 >> 3] + $154; + HEAPF64[$iy >> 3] = $py13$1 / +HEAPF64[$198 >> 3] + +HEAPF64[$156 >> 3]; + $$0 = 0; + break; + } + case 1: + { + $206 = +HEAPF64[$dist_factor >> 3]; + $207 = $ox - $206; + $208 = $dist_factor + 8 | 0; + $210 = $oy - +HEAPF64[$208 >> 3]; + $213 = +HEAPF64[$dist_factor + 24 >> 3] / 1.0e8; + $216 = $207 * $207 + $210 * $210; + $217 = +Math_sqrt(+$216); + $218 = $213 * 3.0; + L21 : do if ($217 != 0.0) { + $i21$042 = 1; + $px19$040 = $207; + $py20$041 = $210; + $z016$039 = $217; + $z0215$038 = $216; + while (1) { + $227 = $z016$039 - ($z016$039 * (1.0 - $213 * $z0215$038) - $217) / (1.0 - $218 * $z0215$038); + $px19$040 = $px19$040 * $227 / $z016$039; + $py20$041 = $py20$041 * $227 / $z016$039; + if (($i21$042 | 0) == 3) { + $px19$1 = $px19$040; + $py20$1 = $py20$041; + break L21; + } + $z0215$038 = $px19$040 * $px19$040 + $py20$041 * $py20$041; + $z016$039 = +Math_sqrt(+$z0215$038); + if (!($z016$039 != 0.0)) { + $px19$1 = 0.0; + $py20$1 = 0.0; + break; + } else $i21$042 = $i21$042 + 1 | 0; + } + } else { + $px19$1 = 0.0; + $py20$1 = 0.0; + } while (0); + $239 = $dist_factor + 16 | 0; + HEAPF64[$ix >> 3] = $px19$1 / +HEAPF64[$239 >> 3] + $206; + HEAPF64[$iy >> 3] = $py20$1 / +HEAPF64[$239 >> 3] + +HEAPF64[$208 >> 3]; + $$0 = 0; + break; + } + default: + $$0 = -1; + } + return $$0 | 0; +} + +function __ZN10__cxxabiv112_GLOBAL__N_117parse_source_nameINS0_2DbEEEPKcS4_S4_RT_($first, $last, $db) { + $first = $first | 0; + $last = $last | 0; + $db = $db | 0; + var $$0$i$i$i = 0, $$0$i$i$i8 = 0, $$02 = 0, $$lcssa = 0, $0 = 0, $1 = 0, $10 = 0, $103 = 0, $105 = 0, $108 = 0, $109 = 0, $13 = 0, $19 = 0, $2 = 0, $21 = 0, $26 = 0, $3 = 0, $33 = 0, $35 = 0, $40 = 0, $45 = 0, $47 = 0, $52 = 0, $56 = 0, $59 = 0, $60 = 0, $62 = 0, $69 = 0, $7 = 0, $70 = 0, $71 = 0, $72 = 0, $76 = 0, $78 = 0, $81 = 0, $82 = 0, $86 = 0, $87 = 0, $89 = 0, $96 = 0, $97 = 0, $98 = 0, $99 = 0, $__v$i$i7 = 0, $c$0$in$lcssa = 0, $c$0$in29 = 0, $isdigittmp = 0, $isdigittmp427 = 0, $isdigittmp431 = 0, $n$0$lcssa = 0, $n$030 = 0, $r = 0, dest = 0, sp = 0, src = 0, stop = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 112 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $__v$i$i7 = sp + 88 | 0; + $r = sp + 76 | 0; + $0 = sp + 64 | 0; + $1 = sp + 40 | 0; + $2 = sp + 16 | 0; + $3 = sp; + L1 : do if (($first | 0) == ($last | 0)) $$02 = $first; else { + $isdigittmp = (HEAP8[$first >> 0] | 0) + -48 | 0; + if ($isdigittmp >>> 0 < 10) { + $7 = $first + 1 | 0; + if (($7 | 0) == ($last | 0)) $$02 = $first; else { + $isdigittmp427 = (HEAP8[$7 >> 0] | 0) + -48 | 0; + if ($isdigittmp427 >>> 0 < 10) { + $c$0$in29 = $7; + $isdigittmp431 = $isdigittmp427; + $n$030 = $isdigittmp; + while (1) { + $10 = $c$0$in29 + 1 | 0; + if (($10 | 0) == ($last | 0)) { + $$02 = $first; + break L1; + } + $13 = $isdigittmp431 + ($n$030 * 10 | 0) | 0; + $isdigittmp431 = (HEAP8[$10 >> 0] | 0) + -48 | 0; + if ($isdigittmp431 >>> 0 >= 10) { + $$lcssa = $c$0$in29; + $c$0$in$lcssa = $10; + $n$0$lcssa = $13; + break; + } else { + $c$0$in29 = $10; + $n$030 = $13; + } + } + } else { + $$lcssa = $first; + $c$0$in$lcssa = $7; + $n$0$lcssa = $isdigittmp; + } + if (($last - $c$0$in$lcssa | 0) >>> 0 < $n$0$lcssa >>> 0) $$02 = $first; else { + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($r, $c$0$in$lcssa, $n$0$lcssa); + $19 = HEAP8[$r >> 0] | 0; + $21 = ($19 & 1) == 0; + $26 = $21 ? ($19 & 255) >>> 1 : HEAP32[$r + 4 >> 2] | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($0, $21 ? $r + 1 | 0 : HEAP32[$r + 8 >> 2] | 0, $26 >>> 0 < 10 ? $26 : 10); + $33 = HEAP8[$0 >> 0] | 0; + $35 = ($33 & 1) == 0; + $40 = $35 ? ($33 & 255) >>> 1 : HEAP32[$0 + 4 >> 2] | 0; + $45 = $40 >>> 0 > 10; + $47 = _memcmp($35 ? $0 + 1 | 0 : HEAP32[$0 + 8 >> 2] | 0, 13728, $45 ? 10 : $40) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($0); + if (!((($47 | 0) == 0 ? ($40 >>> 0 < 10 ? -1 : $45 & 1) : $47) | 0)) { + $52 = _malloc(32) | 0; + HEAP32[$1 + 8 >> 2] = $52; + HEAP32[$1 >> 2] = 33; + HEAP32[$1 + 4 >> 2] = 21; + dest = $52; + src = 13739; + stop = dest + 21 | 0; + do { + HEAP8[dest >> 0] = HEAP8[src >> 0] | 0; + dest = dest + 1 | 0; + src = src + 1 | 0; + } while ((dest | 0) < (stop | 0)); + HEAP8[$52 + 21 >> 0] = 0; + $56 = $1 + 12 | 0; + HEAP32[$56 >> 2] = 0; + HEAP32[$56 + 4 >> 2] = 0; + HEAP32[$56 + 8 >> 2] = 0; + $59 = $db + 4 | 0; + $60 = HEAP32[$59 >> 2] | 0; + $62 = HEAP32[$db + 8 >> 2] | 0; + if ($60 >>> 0 < $62 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($60, $1); + HEAP32[$59 >> 2] = (HEAP32[$59 >> 2] | 0) + 24; + } else { + $69 = HEAP32[$db >> 2] | 0; + $70 = $60 - $69 | 0; + $71 = ($70 | 0) / 24 | 0; + $72 = $71 + 1 | 0; + if (($70 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $76 = ($62 - $69 | 0) / 24 | 0; + if ($76 >>> 0 < 1073741823) { + $78 = $76 << 1; + $$0$i$i$i = $78 >>> 0 < $72 >>> 0 ? $72 : $78; + } else $$0$i$i$i = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i7, $$0$i$i$i, $71, $db + 12 | 0); + $81 = $__v$i$i7 + 8 | 0; + $82 = HEAP32[$81 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($82, $1); + HEAP32[$81 >> 2] = $82 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i7); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i7); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($1); + } else { + HEAP32[$3 >> 2] = HEAP32[$r >> 2]; + HEAP32[$3 + 4 >> 2] = HEAP32[$r + 4 >> 2]; + HEAP32[$3 + 8 >> 2] = HEAP32[$r + 8 >> 2]; + HEAP32[$r >> 2] = 0; + HEAP32[$r + 4 >> 2] = 0; + HEAP32[$r + 8 >> 2] = 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ENSt3__112basic_stringIcNS2_11char_traitsIcEENS0_12malloc_allocIcEEEE($2, $3); + $86 = $db + 4 | 0; + $87 = HEAP32[$86 >> 2] | 0; + $89 = HEAP32[$db + 8 >> 2] | 0; + if ($87 >>> 0 < $89 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($87, $2); + HEAP32[$86 >> 2] = (HEAP32[$86 >> 2] | 0) + 24; + } else { + $96 = HEAP32[$db >> 2] | 0; + $97 = $87 - $96 | 0; + $98 = ($97 | 0) / 24 | 0; + $99 = $98 + 1 | 0; + if (($97 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $103 = ($89 - $96 | 0) / 24 | 0; + if ($103 >>> 0 < 1073741823) { + $105 = $103 << 1; + $$0$i$i$i8 = $105 >>> 0 < $99 >>> 0 ? $99 : $105; + } else $$0$i$i$i8 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i7, $$0$i$i$i8, $98, $db + 12 | 0); + $108 = $__v$i$i7 + 8 | 0; + $109 = HEAP32[$108 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($109, $2); + HEAP32[$108 >> 2] = $109 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i7); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i7); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($2); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($3); + } + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($r); + $$02 = $$lcssa + ($n$0$lcssa + 1) | 0; + } + } + } else $$02 = $first; + } while (0); + STACKTOP = sp; + return $$02 | 0; +} + +function _arPattLoadFromBuffer($pattHandle, $buffer) { + $pattHandle = $pattHandle | 0; + $buffer = $buffer | 0; + var $$0 = 0, $$lcssa = 0, $$lcssa36 = 0, $$pre = 0, $$pre17 = 0, $$pre18 = 0, $$pre19 = 0, $10 = 0, $101 = 0.0, $105 = 0, $13 = 0, $16 = 0, $17 = 0, $18 = 0, $19 = 0, $2 = 0, $20 = 0, $21 = 0, $22 = 0, $23 = 0, $24 = 0, $27 = 0, $29 = 0, $30 = 0, $31 = 0, $36 = 0, $4 = 0, $43 = 0, $46 = 0, $47 = 0, $53 = 0, $56 = 0, $6 = 0, $63 = 0, $66 = 0, $72 = 0, $73 = 0, $75 = 0, $77 = 0, $83 = 0.0, $91 = 0, $92 = 0, $94 = 0, $96 = 0, $buffPtr$064 = 0, $buffPtr$151 = 0, $buffPtr$2$lcssa = 0, $buffPtr$2$lcssa$lcssa = 0, $buffPtr$245 = 0, $buffPtr$3$lcssa = 0, $buffPtr$339 = 0, $h$063 = 0, $i$0$lcssa = 0, $i$065 = 0, $i$152 = 0, $i$258 = 0, $i1$037 = 0, $i2$042 = 0, $i3$048 = 0, $l$050 = 0, $l$1$lcssa = 0, $l$1$lcssa$lcssa = 0, $l$144 = 0, $l$2$lcssa = 0, $l$238 = 0, $m$0$lcssa = 0, $m$053 = 0, $m$1$lcssa = 0, $m$159 = 0, $vararg_buffer1 = 0, $vararg_buffer3 = 0, $vararg_buffer5 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 32 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer5 = sp + 24 | 0; + $vararg_buffer3 = sp + 16 | 0; + $vararg_buffer1 = sp + 8 | 0; + do if (!$pattHandle) { + _arLog(3, 4649, sp); + $$0 = -1; + } else { + if (!$buffer) { + _arLog(3, 4674, $vararg_buffer1); + $$0 = -1; + break; + } + $2 = $pattHandle + 8 | 0; + $4 = HEAP32[$pattHandle + 4 >> 2] | 0; + L7 : do if (($4 | 0) > 0) { + $6 = HEAP32[$2 >> 2] | 0; + $i$065 = 0; + while (1) { + if (!(HEAP32[$6 + ($i$065 << 2) >> 2] | 0)) { + $i$0$lcssa = $i$065; + break L7; + } + $10 = $i$065 + 1 | 0; + if (($10 | 0) < ($4 | 0)) $i$065 = $10; else { + $i$0$lcssa = $10; + break; + } + } + } else $i$0$lcssa = 0; while (0); + if (($i$0$lcssa | 0) == ($4 | 0)) $$0 = -1; else { + $13 = ___strdup($buffer) | 0; + if (!$13) { + _arLog(3, 4719, $vararg_buffer3); + $$0 = -1; + break; + } + $16 = $pattHandle + 28 | 0; + $17 = $i$0$lcssa << 2; + $18 = $pattHandle + 12 | 0; + $19 = $pattHandle + 20 | 0; + $20 = $pattHandle + 16 | 0; + $21 = $pattHandle + 24 | 0; + $buffPtr$064 = _strtok($13, 4742) | 0; + $h$063 = 0; + L17 : while (1) { + $22 = $h$063 + $17 | 0; + $buffPtr$151 = $buffPtr$064; + $i3$048 = 0; + $l$050 = 0; + while (1) { + $23 = ($i3$048 | 0) == 0; + $24 = ($i3$048 | 0) == 2; + $$pre18 = HEAP32[$16 >> 2] | 0; + if (($$pre18 | 0) > 0) { + $27 = $$pre18; + $buffPtr$245 = $buffPtr$151; + $i2$042 = 0; + $l$144 = $l$050; + while (1) { + if (($27 | 0) > 0) { + $buffPtr$339 = $buffPtr$245; + $i1$037 = 0; + $l$238 = $l$144; + while (1) { + if (!$buffPtr$339) { + label = 17; + break L17; + } + $29 = _atoi($buffPtr$339) | 0; + $30 = _strtok(0, 4742) | 0; + $31 = 255 - $29 | 0; + $36 = (((Math_imul(HEAP32[$16 >> 2] | 0, $i2$042) | 0) + $i1$037 | 0) * 3 | 0) + $i3$048 | 0; + HEAP32[(HEAP32[(HEAP32[$18 >> 2] | 0) + ($22 << 2) >> 2] | 0) + ($36 << 2) >> 2] = $31; + $43 = (Math_imul(HEAP32[$16 >> 2] | 0, $i2$042) | 0) + $i1$037 | 0; + $46 = HEAP32[(HEAP32[$19 >> 2] | 0) + ($22 << 2) >> 2] | 0; + $47 = $46 + ($43 << 2) | 0; + if ($23) HEAP32[$47 >> 2] = $31; else { + HEAP32[$47 >> 2] = (HEAP32[$47 >> 2] | 0) + $31; + if ($24) { + $53 = $46 + ((Math_imul(HEAP32[$16 >> 2] | 0, $i2$042) | 0) + $i1$037 << 2) | 0; + HEAP32[$53 >> 2] = (HEAP32[$53 >> 2] | 0) / 3 | 0; + } + } + $56 = $31 + $l$238 | 0; + $i1$037 = $i1$037 + 1 | 0; + $$pre19 = HEAP32[$16 >> 2] | 0; + if (($i1$037 | 0) >= ($$pre19 | 0)) { + $$lcssa = $$pre19; + $buffPtr$3$lcssa = $30; + $l$2$lcssa = $56; + break; + } else { + $buffPtr$339 = $30; + $l$238 = $56; + } + } + } else { + $$lcssa = $27; + $buffPtr$3$lcssa = $buffPtr$245; + $l$2$lcssa = $l$144; + } + $i2$042 = $i2$042 + 1 | 0; + if (($i2$042 | 0) >= ($$lcssa | 0)) { + $buffPtr$2$lcssa = $buffPtr$3$lcssa; + $l$1$lcssa = $l$2$lcssa; + break; + } else { + $27 = $$lcssa; + $buffPtr$245 = $buffPtr$3$lcssa; + $l$144 = $l$2$lcssa; + } + } + } else { + $buffPtr$2$lcssa = $buffPtr$151; + $l$1$lcssa = $l$050; + } + $i3$048 = $i3$048 + 1 | 0; + if (($i3$048 | 0) >= 3) { + $buffPtr$2$lcssa$lcssa = $buffPtr$2$lcssa; + $l$1$lcssa$lcssa = $l$1$lcssa; + break; + } else { + $buffPtr$151 = $buffPtr$2$lcssa; + $l$050 = $l$1$lcssa; + } + } + $63 = HEAP32[$16 >> 2] | 0; + $66 = ($l$1$lcssa$lcssa | 0) / (Math_imul($63 * 3 | 0, $63) | 0) | 0; + if ((Math_imul($63 * 3 | 0, $63) | 0) > 0) { + $72 = HEAP32[(HEAP32[$18 >> 2] | 0) + ($22 << 2) >> 2] | 0; + $i$152 = 0; + $m$053 = 0; + while (1) { + $73 = $72 + ($i$152 << 2) | 0; + $75 = (HEAP32[$73 >> 2] | 0) - $66 | 0; + HEAP32[$73 >> 2] = $75; + $77 = (Math_imul($75, $75) | 0) + $m$053 | 0; + $i$152 = $i$152 + 1 | 0; + $$pre = HEAP32[$16 >> 2] | 0; + if (($i$152 | 0) >= (Math_imul($$pre * 3 | 0, $$pre) | 0)) { + $$lcssa36 = $$pre; + $m$0$lcssa = $77; + break; + } else $m$053 = $77; + } + } else { + $$lcssa36 = $63; + $m$0$lcssa = 0; + } + $83 = +Math_sqrt(+(+($m$0$lcssa | 0))); + HEAPF64[(HEAP32[$20 >> 2] | 0) + ($22 << 3) >> 3] = $83 == 0.0 ? 1.0e-07 : $83; + if (!(Math_imul($$lcssa36, $$lcssa36) | 0)) $m$1$lcssa = 0; else { + $91 = HEAP32[(HEAP32[$19 >> 2] | 0) + ($22 << 2) >> 2] | 0; + $i$258 = 0; + $m$159 = 0; + while (1) { + $92 = $91 + ($i$258 << 2) | 0; + $94 = (HEAP32[$92 >> 2] | 0) - $66 | 0; + HEAP32[$92 >> 2] = $94; + $96 = (Math_imul($94, $94) | 0) + $m$159 | 0; + $i$258 = $i$258 + 1 | 0; + $$pre17 = HEAP32[$16 >> 2] | 0; + if (($i$258 | 0) >= (Math_imul($$pre17, $$pre17) | 0)) { + $m$1$lcssa = $96; + break; + } else $m$159 = $96; + } + } + $101 = +Math_sqrt(+(+($m$1$lcssa | 0))); + HEAPF64[(HEAP32[$21 >> 2] | 0) + ($22 << 3) >> 3] = $101 == 0.0 ? 1.0e-07 : $101; + $105 = $h$063 + 1 | 0; + if (($105 | 0) < 4) { + $buffPtr$064 = $buffPtr$2$lcssa$lcssa; + $h$063 = $105; + } else { + label = 32; + break; + } + } + if ((label | 0) == 17) { + _arLog(3, 4747, $vararg_buffer5); + _free($13); + $$0 = -1; + break; + } else if ((label | 0) == 32) { + _free($13); + HEAP32[(HEAP32[$2 >> 2] | 0) + ($i$0$lcssa << 2) >> 2] = 1; + HEAP32[$pattHandle >> 2] = (HEAP32[$pattHandle >> 2] | 0) + 1; + $$0 = $i$0$lcssa; + break; + } + } + } while (0); + STACKTOP = sp; + return $$0 | 0; +} + +function _qsort($base, $nel, $width, $cmp) { + $base = $base | 0; + $nel = $nel | 0; + $width = $width | 0; + $cmp = $cmp | 0; + var $$0$i = 0, $$0$i30 = 0, $$02$i$i = 0, $$02$i3$i = 0, $$lcssa = 0, $$lcssa57 = 0, $$phi$trans$insert$i = 0, $$pre1$i = 0, $$pre1$i6 = 0, $$pre1$i9 = 0, $$sum = 0, $0 = 0, $1 = 0, $10 = 0, $111 = 0, $14 = 0, $15 = 0, $17 = 0, $19 = 0, $23 = 0, $26 = 0, $36 = 0, $39 = 0, $41 = 0, $44 = 0, $46 = 0, $48 = 0, $49 = 0, $51 = 0, $53 = 0, $58 = 0, $59 = 0, $63 = 0, $68 = 0, $72 = 0, $79 = 0, $8 = 0, $8$phi = 0, $81 = 0, $82 = 0, $84 = 0, $87 = 0, $9 = 0, $91 = 0, $93 = 0, $94 = 0, $95 = 0, $head$0$lcssa = 0, $head$036 = 0, $head$1$be = 0, $head$153 = 0, $i$0 = 0, $lp = 0, $nTrailingZeros$03$i$i = 0, $nTrailingZeros$03$i2$i = 0, $nTrailingZeros$03$i2$i$lcssa = 0, $p = 0, $pshift$0$lcssa = 0, $pshift$037 = 0, $pshift$1 = 0, $pshift$2$be = 0, $pshift$254 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 208 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $lp = sp + 8 | 0; + $p = sp; + $0 = Math_imul($width, $nel) | 0; + $1 = $p; + HEAP32[$1 >> 2] = 1; + HEAP32[$1 + 4 >> 2] = 0; + if ($0) { + $$sum = $0 - $width | 0; + HEAP32[$lp + 4 >> 2] = $width; + HEAP32[$lp >> 2] = $width; + $10 = $width; + $8 = $width; + $i$0 = 2; + while (1) { + $9 = $8 + $width + $10 | 0; + HEAP32[$lp + ($i$0 << 2) >> 2] = $9; + if ($9 >>> 0 < $0 >>> 0) { + $8$phi = $10; + $10 = $9; + $i$0 = $i$0 + 1 | 0; + $8 = $8$phi; + } else break; + } + $14 = 0 - $width | 0; + $15 = $base + $$sum | 0; + $$phi$trans$insert$i = $p + 4 | 0; + if (($$sum | 0) > 0) { + $17 = $15; + $19 = 1; + $head$036 = $base; + $pshift$037 = 1; + while (1) { + do if (($19 & 3 | 0) == 3) { + _sift($head$036, $width, $cmp, $pshift$037, $lp); + $$pre1$i = HEAP32[$$phi$trans$insert$i >> 2] | 0; + $23 = $$pre1$i << 30 | (HEAP32[$p >> 2] | 0) >>> 2; + HEAP32[$p >> 2] = $23; + HEAP32[$$phi$trans$insert$i >> 2] = $$pre1$i >>> 2; + $48 = $23; + $pshift$1 = $pshift$037 + 2 | 0; + } else { + $26 = $pshift$037 + -1 | 0; + if ((HEAP32[$lp + ($26 << 2) >> 2] | 0) >>> 0 < ($17 - $head$036 | 0) >>> 0) _sift($head$036, $width, $cmp, $pshift$037, $lp); else _trinkle($head$036, $width, $cmp, $p, $pshift$037, 0, $lp); + if (($pshift$037 | 0) == 1) { + $$pre1$i6 = HEAP32[$p >> 2] | 0; + HEAP32[$$phi$trans$insert$i >> 2] = $$pre1$i6 >>> 31 | HEAP32[$$phi$trans$insert$i >> 2] << 1; + $36 = $$pre1$i6 << 1; + HEAP32[$p >> 2] = $36; + $48 = $36; + $pshift$1 = 0; + break; + } + if ($26 >>> 0 > 31) { + $39 = HEAP32[$p >> 2] | 0; + HEAP32[$$phi$trans$insert$i >> 2] = $39; + HEAP32[$p >> 2] = 0; + $$0$i = $pshift$037 + -33 | 0; + $41 = $39; + $44 = 0; + } else { + $$0$i = $26; + $41 = HEAP32[$$phi$trans$insert$i >> 2] | 0; + $44 = HEAP32[$p >> 2] | 0; + } + HEAP32[$$phi$trans$insert$i >> 2] = $44 >>> (32 - $$0$i | 0) | $41 << $$0$i; + $46 = $44 << $$0$i; + HEAP32[$p >> 2] = $46; + $48 = $46; + $pshift$1 = 1; + } while (0); + $19 = $48 | 1; + HEAP32[$p >> 2] = $19; + $49 = $head$036 + $width | 0; + if ($49 >>> 0 >= $15 >>> 0) { + $head$0$lcssa = $49; + $pshift$0$lcssa = $pshift$1; + break; + } else { + $head$036 = $49; + $pshift$037 = $pshift$1; + } + } + } else { + $head$0$lcssa = $base; + $pshift$0$lcssa = 1; + } + _trinkle($head$0$lcssa, $width, $cmp, $p, $pshift$0$lcssa, 0, $lp); + $51 = $p + 4 | 0; + $53 = HEAP32[$p >> 2] | 0; + if (!(($pshift$0$lcssa | 0) == 1 & ($53 | 0) == 1 & (HEAP32[$51 >> 2] | 0) == 0)) { + $59 = $53; + $head$153 = $head$0$lcssa; + $pshift$254 = $pshift$0$lcssa; + while (1) { + if (($pshift$254 | 0) < 2) { + $58 = $59 + -1 | 0; + do if (!$58) { + $81 = 32; + label = 30; + } else { + if (!($58 & 1)) { + $$02$i$i = $58; + $nTrailingZeros$03$i$i = 0; + while (1) { + $63 = $nTrailingZeros$03$i$i + 1 | 0; + $$02$i$i = $$02$i$i >>> 1; + if ($$02$i$i & 1) { + $$lcssa = $63; + break; + } else $nTrailingZeros$03$i$i = $63; + } + if (!$$lcssa) label = 24; else $79 = $$lcssa; + } else label = 24; + if ((label | 0) == 24) { + label = 0; + $68 = HEAP32[$$phi$trans$insert$i >> 2] | 0; + if (!$68) { + $81 = 64; + label = 30; + break; + } + if (!($68 & 1)) { + $$02$i3$i = $68; + $nTrailingZeros$03$i2$i = 0; + } else { + $$0$i30 = 0; + $84 = $59; + $87 = $68; + $91 = 0; + break; + } + while (1) { + $72 = $nTrailingZeros$03$i2$i + 1 | 0; + $$02$i3$i = $$02$i3$i >>> 1; + if ($$02$i3$i & 1) { + $$lcssa57 = $72; + $nTrailingZeros$03$i2$i$lcssa = $nTrailingZeros$03$i2$i; + break; + } else $nTrailingZeros$03$i2$i = $72; + } + if (!$$lcssa57) { + $$0$i30 = 0; + $84 = $59; + $87 = $68; + $91 = 0; + break; + } else $79 = $nTrailingZeros$03$i2$i$lcssa + 33 | 0; + } + if ($79 >>> 0 > 31) { + $81 = $79; + label = 30; + } else { + $$0$i30 = $79; + $84 = $59; + $87 = HEAP32[$$phi$trans$insert$i >> 2] | 0; + $91 = $79; + } + } while (0); + if ((label | 0) == 30) { + label = 0; + $82 = HEAP32[$$phi$trans$insert$i >> 2] | 0; + HEAP32[$p >> 2] = $82; + HEAP32[$$phi$trans$insert$i >> 2] = 0; + $$0$i30 = $81 + -32 | 0; + $84 = $82; + $87 = 0; + $91 = $81; + } + HEAP32[$p >> 2] = $87 << 32 - $$0$i30 | $84 >>> $$0$i30; + HEAP32[$$phi$trans$insert$i >> 2] = $87 >>> $$0$i30; + $head$1$be = $head$153 + $14 | 0; + $pshift$2$be = $91 + $pshift$254 | 0; + } else { + $93 = $59 >>> 30; + $94 = $93 | HEAP32[$$phi$trans$insert$i >> 2] << 2; + $95 = $pshift$254 + -2 | 0; + HEAP32[$p >> 2] = ($59 << 1 & 2147483646 | $93 << 31) ^ 3; + HEAP32[$$phi$trans$insert$i >> 2] = $94 >>> 1; + _trinkle($head$153 + (0 - ((HEAP32[$lp + ($95 << 2) >> 2] | 0) + $width)) | 0, $width, $cmp, $p, $pshift$254 + -1 | 0, 1, $lp); + $$pre1$i9 = HEAP32[$p >> 2] | 0; + HEAP32[$$phi$trans$insert$i >> 2] = $$pre1$i9 >>> 31 | HEAP32[$$phi$trans$insert$i >> 2] << 1; + HEAP32[$p >> 2] = $$pre1$i9 << 1 | 1; + $111 = $head$153 + $14 | 0; + _trinkle($111, $width, $cmp, $p, $95, 1, $lp); + $head$1$be = $111; + $pshift$2$be = $95; + } + $59 = HEAP32[$p >> 2] | 0; + if (($pshift$2$be | 0) == 1 & ($59 | 0) == 1 & (HEAP32[$51 >> 2] | 0) == 0) break; else { + $head$153 = $head$1$be; + $pshift$254 = $pshift$2$be; + } + } + } + } + STACKTOP = sp; + return; +} + +function _arImageProcLuma($ipi, $dataPtr) { + $ipi = $ipi | 0; + $dataPtr = $dataPtr | 0; + var $$0 = 0, $1 = 0, $104 = 0, $105 = 0, $110 = 0, $111 = 0, $116 = 0, $117 = 0, $122 = 0, $123 = 0, $128 = 0, $129 = 0, $13 = 0, $14 = 0, $157 = 0, $164 = 0, $185 = 0, $192 = 0, $213 = 0, $44 = 0, $45 = 0, $75 = 0, $76 = 0, $p$040 = 0, $p$142 = 0, $p$245 = 0, $p$348 = 0, $p$451 = 0, $p$554 = 0, $p$657 = 0, $p$760 = 0, $q$041 = 0, $q$143 = 0, $q$246 = 0, $q$349 = 0, $q$452 = 0, $q$555 = 0, $q$658 = 0, $q$761 = 0, $vararg_buffer = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $1 = HEAP32[$ipi + 2068 >> 2] | 0; + L1 : do switch ($1 | 0) { + case 5: + case 12: + case 13: + case 14: + { + if (!(HEAP32[$ipi + 2072 >> 2] | 0)) { + HEAP32[$ipi >> 2] = $dataPtr; + $$0 = 0; + break L1; + } else { + _memcpy(HEAP32[$ipi >> 2] | 0, $dataPtr | 0, Math_imul(HEAP32[$ipi + 12 >> 2] | 0, HEAP32[$ipi + 8 >> 2] | 0) | 0) | 0; + $$0 = 0; + break L1; + } + break; + } + default: + { + if (($1 & -2 | 0) == 2) { + $13 = $ipi + 8 | 0; + $14 = $ipi + 12 | 0; + if (!(Math_imul(HEAP32[$14 >> 2] | 0, HEAP32[$13 >> 2] | 0) | 0)) { + $$0 = 0; + break L1; + } else { + $p$040 = 0; + $q$041 = 0; + } + while (1) { + HEAP8[(HEAP32[$ipi >> 2] | 0) + $p$040 >> 0] = (((HEAPU8[$dataPtr + ($q$041 | 1) >> 0] | 0) + (HEAPU8[$dataPtr + $q$041 >> 0] | 0) + (HEAPU8[$dataPtr + ($q$041 | 2) >> 0] | 0) | 0) >>> 0) / 3 | 0; + $p$040 = $p$040 + 1 | 0; + if ($p$040 >>> 0 >= (Math_imul(HEAP32[$14 >> 2] | 0, HEAP32[$13 >> 2] | 0) | 0) >>> 0) { + $$0 = 0; + break L1; + } else $q$041 = $q$041 + 4 | 0; + } + } + if (($1 & -3 | 0) == 4) { + $44 = $ipi + 8 | 0; + $45 = $ipi + 12 | 0; + if (!(Math_imul(HEAP32[$45 >> 2] | 0, HEAP32[$44 >> 2] | 0) | 0)) { + $$0 = 0; + break L1; + } else { + $p$142 = 0; + $q$143 = 0; + } + while (1) { + HEAP8[(HEAP32[$ipi >> 2] | 0) + $p$142 >> 0] = (((HEAPU8[$dataPtr + ($q$143 | 2) >> 0] | 0) + (HEAPU8[$dataPtr + ($q$143 | 1) >> 0] | 0) + (HEAPU8[$dataPtr + ($q$143 | 3) >> 0] | 0) | 0) >>> 0) / 3 | 0; + $p$142 = $p$142 + 1 | 0; + if ($p$142 >>> 0 >= (Math_imul(HEAP32[$45 >> 2] | 0, HEAP32[$44 >> 2] | 0) | 0) >>> 0) { + $$0 = 0; + break L1; + } else $q$143 = $q$143 + 4 | 0; + } + } + if ($1 >>> 0 < 2) { + $75 = $ipi + 8 | 0; + $76 = $ipi + 12 | 0; + if (!(Math_imul(HEAP32[$76 >> 2] | 0, HEAP32[$75 >> 2] | 0) | 0)) { + $$0 = 0; + break L1; + } else { + $p$245 = 0; + $q$246 = 0; + } + while (1) { + HEAP8[(HEAP32[$ipi >> 2] | 0) + $p$245 >> 0] = (((HEAPU8[$dataPtr + ($q$246 + 1) >> 0] | 0) + (HEAPU8[$dataPtr + $q$246 >> 0] | 0) + (HEAPU8[$dataPtr + ($q$246 + 2) >> 0] | 0) | 0) >>> 0) / 3 | 0; + $p$245 = $p$245 + 1 | 0; + if ($p$245 >>> 0 >= (Math_imul(HEAP32[$76 >> 2] | 0, HEAP32[$75 >> 2] | 0) | 0) >>> 0) { + $$0 = 0; + break L1; + } else $q$246 = $q$246 + 3 | 0; + } + } + switch ($1 | 0) { + case 8: + { + $128 = $ipi + 8 | 0; + $129 = $ipi + 12 | 0; + if (!(Math_imul(HEAP32[$129 >> 2] | 0, HEAP32[$128 >> 2] | 0) | 0)) { + $$0 = 0; + break L1; + } else { + $p$348 = 0; + $q$349 = 0; + } + while (1) { + HEAP8[(HEAP32[$ipi >> 2] | 0) + $p$348 >> 0] = HEAP8[$dataPtr + $q$349 >> 0] | 0; + $p$348 = $p$348 + 1 | 0; + if ($p$348 >>> 0 >= (Math_imul(HEAP32[$129 >> 2] | 0, HEAP32[$128 >> 2] | 0) | 0) >>> 0) { + $$0 = 0; + break; + } else $q$349 = $q$349 + 2 | 0; + } + break; + } + case 7: + { + $122 = $ipi + 8 | 0; + $123 = $ipi + 12 | 0; + if (!(Math_imul(HEAP32[$123 >> 2] | 0, HEAP32[$122 >> 2] | 0) | 0)) { + $$0 = 0; + break L1; + } else { + $p$451 = 0; + $q$452 = 0; + } + while (1) { + HEAP8[(HEAP32[$ipi >> 2] | 0) + $p$451 >> 0] = HEAP8[$dataPtr + ($q$452 | 1) >> 0] | 0; + $p$451 = $p$451 + 1 | 0; + if ($p$451 >>> 0 >= (Math_imul(HEAP32[$123 >> 2] | 0, HEAP32[$122 >> 2] | 0) | 0) >>> 0) { + $$0 = 0; + break; + } else $q$452 = $q$452 + 2 | 0; + } + break; + } + case 9: + { + $116 = $ipi + 8 | 0; + $117 = $ipi + 12 | 0; + if (!(Math_imul(HEAP32[$117 >> 2] | 0, HEAP32[$116 >> 2] | 0) | 0)) { + $$0 = 0; + break L1; + } else { + $p$554 = 0; + $q$555 = 0; + } + while (1) { + $157 = HEAPU8[$dataPtr + $q$555 >> 0] | 0; + $164 = HEAPU8[$dataPtr + ($q$555 | 1) >> 0] | 0; + HEAP8[(HEAP32[$ipi >> 2] | 0) + $p$554 >> 0] = ((($157 & 248) + 10 + ($157 << 5 & 224) + ($164 >>> 3 & 28) + ($164 << 3 & 248) | 0) >>> 0) / 3 | 0; + $p$554 = $p$554 + 1 | 0; + if ($p$554 >>> 0 >= (Math_imul(HEAP32[$117 >> 2] | 0, HEAP32[$116 >> 2] | 0) | 0) >>> 0) { + $$0 = 0; + break; + } else $q$555 = $q$555 + 2 | 0; + } + break; + } + case 10: + { + $110 = $ipi + 8 | 0; + $111 = $ipi + 12 | 0; + if (!(Math_imul(HEAP32[$111 >> 2] | 0, HEAP32[$110 >> 2] | 0) | 0)) { + $$0 = 0; + break L1; + } else { + $p$657 = 0; + $q$658 = 0; + } + while (1) { + $185 = HEAPU8[$dataPtr + $q$658 >> 0] | 0; + $192 = HEAPU8[$dataPtr + ($q$658 | 1) >> 0] | 0; + HEAP8[(HEAP32[$ipi >> 2] | 0) + $p$657 >> 0] = ((($185 & 248) + 12 + ($185 << 5 & 224) + ($192 >>> 3 & 24) + ($192 << 2 & 248) | 0) >>> 0) / 3 | 0; + $p$657 = $p$657 + 1 | 0; + if ($p$657 >>> 0 >= (Math_imul(HEAP32[$111 >> 2] | 0, HEAP32[$110 >> 2] | 0) | 0) >>> 0) { + $$0 = 0; + break; + } else $q$658 = $q$658 + 2 | 0; + } + break; + } + case 11: + { + $104 = $ipi + 8 | 0; + $105 = $ipi + 12 | 0; + if (!(Math_imul(HEAP32[$105 >> 2] | 0, HEAP32[$104 >> 2] | 0) | 0)) { + $$0 = 0; + break L1; + } else { + $p$760 = 0; + $q$761 = 0; + } + while (1) { + $213 = HEAPU8[$dataPtr + $q$761 >> 0] | 0; + HEAP8[(HEAP32[$ipi >> 2] | 0) + $p$760 >> 0] = ((($213 & 240) + 24 + ($213 << 4 & 240) + ((HEAPU8[$dataPtr + ($q$761 | 1) >> 0] | 0) & 240) | 0) >>> 0) / 3 | 0; + $p$760 = $p$760 + 1 | 0; + if ($p$760 >>> 0 >= (Math_imul(HEAP32[$105 >> 2] | 0, HEAP32[$104 >> 2] | 0) | 0) >>> 0) { + $$0 = 0; + break; + } else $q$761 = $q$761 + 2 | 0; + } + break; + } + default: + { + _arLog(3, 4361, $vararg_buffer); + $$0 = -1; + break L1; + } + } + } + } while (0); + STACKTOP = sp; + return $$0 | 0; +} + +function __ZN10__cxxabiv112_GLOBAL__N_123parse_binary_expressionINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_($first, $last, $op, $db) { + $first = $first | 0; + $last = $last | 0; + $op = $op | 0; + $db = $db | 0; + var $$0 = 0, $0 = 0, $1 = 0, $10 = 0, $101 = 0, $103 = 0, $107 = 0, $11 = 0, $110 = 0, $112 = 0, $117 = 0, $118 = 0, $119 = 0, $19 = 0, $2 = 0, $20 = 0, $21 = 0, $22 = 0, $25 = 0, $26 = 0, $3 = 0, $34 = 0, $36 = 0, $37 = 0, $4 = 0, $41 = 0, $42 = 0, $44 = 0, $46 = 0, $48 = 0, $5 = 0, $53 = 0, $56 = 0, $58 = 0, $6 = 0, $65 = 0, $68 = 0, $71 = 0, $73 = 0, $8 = 0, $83 = 0, $86 = 0, $89 = 0, $91 = 0, $op1 = 0, $op2 = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 96 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $op2 = sp + 84 | 0; + $op1 = sp + 72 | 0; + $0 = sp + 60 | 0; + $1 = sp + 48 | 0; + $2 = sp + 36 | 0; + $3 = sp + 24 | 0; + $4 = sp + 12 | 0; + $5 = sp; + $6 = __ZN10__cxxabiv112_GLOBAL__N_116parse_expressionINS0_2DbEEEPKcS4_S4_RT_($first, $last, $db) | 0; + L1 : do if (($6 | 0) == ($first | 0)) $$0 = $first; else { + $8 = __ZN10__cxxabiv112_GLOBAL__N_116parse_expressionINS0_2DbEEEPKcS4_S4_RT_($6, $last, $db) | 0; + $10 = $db + 4 | 0; + $11 = HEAP32[$10 >> 2] | 0; + if (($8 | 0) == ($6 | 0)) { + $117 = $11 + -24 | 0; + $119 = $11; + while (1) { + $118 = $119 + -24 | 0; + HEAP32[$10 >> 2] = $118; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($118); + $119 = HEAP32[$10 >> 2] | 0; + if (($119 | 0) == ($117 | 0)) { + $$0 = $first; + break L1; + } + } + } + if ((($11 - (HEAP32[$db >> 2] | 0) | 0) / 24 | 0) >>> 0 < 2) $$0 = $first; else { + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($op2, $11 + -24 | 0); + $19 = HEAP32[$10 >> 2] | 0; + $20 = $19 + -24 | 0; + $22 = $19; + do { + $21 = $22 + -24 | 0; + HEAP32[$10 >> 2] = $21; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($21); + $22 = HEAP32[$10 >> 2] | 0; + } while (($22 | 0) != ($20 | 0)); + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($op1, $19 + -48 | 0); + $25 = HEAP32[$10 >> 2] | 0; + $26 = $25 + -24 | 0; + if (!(HEAP8[$26 >> 0] & 1)) { + HEAP8[$26 + 1 >> 0] = 0; + HEAP8[$26 >> 0] = 0; + } else { + HEAP8[HEAP32[$25 + -16 >> 2] >> 0] = 0; + HEAP32[$25 + -20 >> 2] = 0; + } + $34 = HEAP8[$op >> 0] | 0; + $36 = ($34 & 1) == 0; + $37 = $op + 4 | 0; + $41 = $36 ? ($34 & 255) >>> 1 : HEAP32[$37 >> 2] | 0; + $42 = $op + 8 | 0; + $44 = $op + 1 | 0; + $46 = $41 >>> 0 > 1; + $48 = _memcmp($36 ? $44 : HEAP32[$42 >> 2] | 0, 12778, $46 ? 1 : $41) | 0; + if (!((($48 | 0) == 0 ? (($41 | 0) == 0 ? -1 : $46 & 1) : $48) | 0)) __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE9push_backEc($26, 40); + __ZNSt3__1plIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEENS_12basic_stringIT_T0_T1_EEPKS8_RKSB_($5, 12714, $op1); + $53 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($5, 14007) | 0; + HEAP32[$4 >> 2] = HEAP32[$53 >> 2]; + HEAP32[$4 + 4 >> 2] = HEAP32[$53 + 4 >> 2]; + HEAP32[$4 + 8 >> 2] = HEAP32[$53 + 8 >> 2]; + HEAP32[$53 >> 2] = 0; + HEAP32[$53 + 4 >> 2] = 0; + HEAP32[$53 + 8 >> 2] = 0; + $56 = HEAP8[$op >> 0] | 0; + $58 = ($56 & 1) == 0; + $65 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($4, $58 ? $44 : HEAP32[$42 >> 2] | 0, $58 ? ($56 & 255) >>> 1 : HEAP32[$37 >> 2] | 0) | 0; + HEAP32[$3 >> 2] = HEAP32[$65 >> 2]; + HEAP32[$3 + 4 >> 2] = HEAP32[$65 + 4 >> 2]; + HEAP32[$3 + 8 >> 2] = HEAP32[$65 + 8 >> 2]; + HEAP32[$65 >> 2] = 0; + HEAP32[$65 + 4 >> 2] = 0; + HEAP32[$65 + 8 >> 2] = 0; + $68 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($3, 12616) | 0; + HEAP32[$2 >> 2] = HEAP32[$68 >> 2]; + HEAP32[$2 + 4 >> 2] = HEAP32[$68 + 4 >> 2]; + HEAP32[$2 + 8 >> 2] = HEAP32[$68 + 8 >> 2]; + HEAP32[$68 >> 2] = 0; + HEAP32[$68 + 4 >> 2] = 0; + HEAP32[$68 + 8 >> 2] = 0; + $71 = HEAP8[$op2 >> 0] | 0; + $73 = ($71 & 1) == 0; + $83 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($2, $73 ? $op2 + 1 | 0 : HEAP32[$op2 + 8 >> 2] | 0, $73 ? ($71 & 255) >>> 1 : HEAP32[$op2 + 4 >> 2] | 0) | 0; + HEAP32[$1 >> 2] = HEAP32[$83 >> 2]; + HEAP32[$1 + 4 >> 2] = HEAP32[$83 + 4 >> 2]; + HEAP32[$1 + 8 >> 2] = HEAP32[$83 + 8 >> 2]; + HEAP32[$83 >> 2] = 0; + HEAP32[$83 + 4 >> 2] = 0; + HEAP32[$83 + 8 >> 2] = 0; + $86 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($1, 12619) | 0; + HEAP32[$0 >> 2] = HEAP32[$86 >> 2]; + HEAP32[$0 + 4 >> 2] = HEAP32[$86 + 4 >> 2]; + HEAP32[$0 + 8 >> 2] = HEAP32[$86 + 8 >> 2]; + HEAP32[$86 >> 2] = 0; + HEAP32[$86 + 4 >> 2] = 0; + HEAP32[$86 + 8 >> 2] = 0; + $89 = HEAP8[$0 >> 0] | 0; + $91 = ($89 & 1) == 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($26, $91 ? $0 + 1 | 0 : HEAP32[$0 + 8 >> 2] | 0, $91 ? ($89 & 255) >>> 1 : HEAP32[$0 + 4 >> 2] | 0) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($0); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($1); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($2); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($3); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($4); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($5); + $101 = HEAP8[$op >> 0] | 0; + $103 = ($101 & 1) == 0; + $107 = $103 ? ($101 & 255) >>> 1 : HEAP32[$37 >> 2] | 0; + $110 = $107 >>> 0 > 1; + $112 = _memcmp($103 ? $44 : HEAP32[$42 >> 2] | 0, 12778, $110 ? 1 : $107) | 0; + if (!((($112 | 0) == 0 ? (($107 | 0) == 0 ? -1 : $110 & 1) : $112) | 0)) __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE9push_backEc($26, 41); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($op1); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($op2); + $$0 = $8; + } + } while (0); + STACKTOP = sp; + return $$0 | 0; +} + +function __ZNK10__cxxabiv121__vmi_class_type_info16search_below_dstEPNS_19__dynamic_cast_infoEPKvib($this, $info, $current_ptr, $path_below, $use_strcmp) { + $this = $this | 0; + $info = $info | 0; + $current_ptr = $current_ptr | 0; + $path_below = $path_below | 0; + $use_strcmp = $use_strcmp | 0; + var $14 = 0, $20 = 0, $24 = 0, $25 = 0, $26 = 0, $27 = 0, $28 = 0, $29 = 0, $30 = 0, $49 = 0, $59 = 0, $6 = 0, $60 = 0, $61 = 0, $64 = 0, $67 = 0, $70 = 0, $77 = 0, $78 = 0, $79 = 0, $does_dst_type_point_to_our_static_type$0$off0$lcssa = 0, $does_dst_type_point_to_our_static_type$0$off023 = 0, $does_dst_type_point_to_our_static_type$1$off0 = 0, $is_dst_type_derived_from_static_type$0$off025 = 0, $is_dst_type_derived_from_static_type$1$off0 = 0, $is_dst_type_derived_from_static_type$2$off0 = 0, $p$024 = 0, $p2$0 = 0, $p2$1 = 0, $p2$2 = 0, label = 0; + L1 : do if (($this | 0) == (HEAP32[$info + 8 >> 2] | 0)) { + if ((HEAP32[$info + 4 >> 2] | 0) == ($current_ptr | 0)) { + $6 = $info + 28 | 0; + if ((HEAP32[$6 >> 2] | 0) != 1) HEAP32[$6 >> 2] = $path_below; + } + } else { + if (($this | 0) != (HEAP32[$info >> 2] | 0)) { + $59 = HEAP32[$this + 12 >> 2] | 0; + $60 = $this + 16 + ($59 << 3) | 0; + __ZNK10__cxxabiv122__base_class_type_info16search_below_dstEPNS_19__dynamic_cast_infoEPKvib($this + 16 | 0, $info, $current_ptr, $path_below, $use_strcmp); + $61 = $this + 24 | 0; + if (($59 | 0) <= 1) break; + $64 = HEAP32[$this + 8 >> 2] | 0; + if (!($64 & 2)) { + $67 = $info + 36 | 0; + if ((HEAP32[$67 >> 2] | 0) != 1) { + if (!($64 & 1)) { + $79 = $info + 54 | 0; + $p2$2 = $61; + while (1) { + if (HEAP8[$79 >> 0] | 0) break L1; + if ((HEAP32[$67 >> 2] | 0) == 1) break L1; + __ZNK10__cxxabiv122__base_class_type_info16search_below_dstEPNS_19__dynamic_cast_infoEPKvib($p2$2, $info, $current_ptr, $path_below, $use_strcmp); + $p2$2 = $p2$2 + 8 | 0; + if ($p2$2 >>> 0 >= $60 >>> 0) break L1; + } + } + $77 = $info + 24 | 0; + $78 = $info + 54 | 0; + $p2$1 = $61; + while (1) { + if (HEAP8[$78 >> 0] | 0) break L1; + if ((HEAP32[$67 >> 2] | 0) == 1) if ((HEAP32[$77 >> 2] | 0) == 1) break L1; + __ZNK10__cxxabiv122__base_class_type_info16search_below_dstEPNS_19__dynamic_cast_infoEPKvib($p2$1, $info, $current_ptr, $path_below, $use_strcmp); + $p2$1 = $p2$1 + 8 | 0; + if ($p2$1 >>> 0 >= $60 >>> 0) break L1; + } + } + } + $70 = $info + 54 | 0; + $p2$0 = $61; + while (1) { + if (HEAP8[$70 >> 0] | 0) break L1; + __ZNK10__cxxabiv122__base_class_type_info16search_below_dstEPNS_19__dynamic_cast_infoEPKvib($p2$0, $info, $current_ptr, $path_below, $use_strcmp); + $p2$0 = $p2$0 + 8 | 0; + if ($p2$0 >>> 0 >= $60 >>> 0) break L1; + } + } + if ((HEAP32[$info + 16 >> 2] | 0) != ($current_ptr | 0)) { + $14 = $info + 20 | 0; + if ((HEAP32[$14 >> 2] | 0) != ($current_ptr | 0)) { + HEAP32[$info + 32 >> 2] = $path_below; + $20 = $info + 44 | 0; + if ((HEAP32[$20 >> 2] | 0) == 4) break; + $24 = HEAP32[$this + 12 >> 2] | 0; + $25 = $this + 16 + ($24 << 3) | 0; + $26 = $info + 52 | 0; + $27 = $info + 53 | 0; + $28 = $info + 54 | 0; + $29 = $this + 8 | 0; + $30 = $info + 24 | 0; + L34 : do if (($24 | 0) > 0) { + $does_dst_type_point_to_our_static_type$0$off023 = 0; + $is_dst_type_derived_from_static_type$0$off025 = 0; + $p$024 = $this + 16 | 0; + while (1) { + HEAP8[$26 >> 0] = 0; + HEAP8[$27 >> 0] = 0; + __ZNK10__cxxabiv122__base_class_type_info16search_above_dstEPNS_19__dynamic_cast_infoEPKvS4_ib($p$024, $info, $current_ptr, $current_ptr, 1, $use_strcmp); + if (HEAP8[$28 >> 0] | 0) { + $does_dst_type_point_to_our_static_type$0$off0$lcssa = $does_dst_type_point_to_our_static_type$0$off023; + $is_dst_type_derived_from_static_type$2$off0 = $is_dst_type_derived_from_static_type$0$off025; + label = 20; + break L34; + } + do if (!(HEAP8[$27 >> 0] | 0)) { + $does_dst_type_point_to_our_static_type$1$off0 = $does_dst_type_point_to_our_static_type$0$off023; + $is_dst_type_derived_from_static_type$1$off0 = $is_dst_type_derived_from_static_type$0$off025; + } else { + if (!(HEAP8[$26 >> 0] | 0)) if (!(HEAP32[$29 >> 2] & 1)) { + $does_dst_type_point_to_our_static_type$0$off0$lcssa = $does_dst_type_point_to_our_static_type$0$off023; + $is_dst_type_derived_from_static_type$2$off0 = 1; + label = 20; + break L34; + } else { + $does_dst_type_point_to_our_static_type$1$off0 = $does_dst_type_point_to_our_static_type$0$off023; + $is_dst_type_derived_from_static_type$1$off0 = 1; + break; + } + if ((HEAP32[$30 >> 2] | 0) == 1) break L34; + if (!(HEAP32[$29 >> 2] & 2)) break L34; else { + $does_dst_type_point_to_our_static_type$1$off0 = 1; + $is_dst_type_derived_from_static_type$1$off0 = 1; + } + } while (0); + $p$024 = $p$024 + 8 | 0; + if ($p$024 >>> 0 >= $25 >>> 0) { + $does_dst_type_point_to_our_static_type$0$off0$lcssa = $does_dst_type_point_to_our_static_type$1$off0; + $is_dst_type_derived_from_static_type$2$off0 = $is_dst_type_derived_from_static_type$1$off0; + label = 20; + break; + } else { + $does_dst_type_point_to_our_static_type$0$off023 = $does_dst_type_point_to_our_static_type$1$off0; + $is_dst_type_derived_from_static_type$0$off025 = $is_dst_type_derived_from_static_type$1$off0; + } + } + } else { + $does_dst_type_point_to_our_static_type$0$off0$lcssa = 0; + $is_dst_type_derived_from_static_type$2$off0 = 0; + label = 20; + } while (0); + do if ((label | 0) == 20) { + if ($does_dst_type_point_to_our_static_type$0$off0$lcssa) label = 24; else { + HEAP32[$14 >> 2] = $current_ptr; + $49 = $info + 40 | 0; + HEAP32[$49 >> 2] = (HEAP32[$49 >> 2] | 0) + 1; + if ((HEAP32[$info + 36 >> 2] | 0) == 1) if ((HEAP32[$30 >> 2] | 0) == 2) { + HEAP8[$28 >> 0] = 1; + if ($is_dst_type_derived_from_static_type$2$off0) break; + } else label = 24; else label = 24; + } + if ((label | 0) == 24) if ($is_dst_type_derived_from_static_type$2$off0) break; + HEAP32[$20 >> 2] = 4; + break L1; + } while (0); + HEAP32[$20 >> 2] = 3; + break; + } + } + if (($path_below | 0) == 1) HEAP32[$info + 32 >> 2] = 1; + } while (0); + return; +} + +function _arVecTridiagonalize($a, $d, $e) { + $a = $a | 0; + $d = $d | 0; + $e = $e | 0; + var $$0 = 0, $$pre$phiZ2D = 0, $1 = 0, $106 = 0, $107 = 0, $110 = 0, $112 = 0, $113 = 0, $114 = 0, $117 = 0, $118 = 0, $12 = 0, $120 = 0, $121 = 0, $125 = 0.0, $126 = 0, $13 = 0, $131 = 0, $14 = 0, $16 = 0, $17 = 0, $23 = 0, $25 = 0, $26 = 0.0, $32 = 0, $34 = 0, $35 = 0, $37 = 0, $40 = 0, $45 = 0.0, $54 = 0.0, $63 = 0.0, $65 = 0, $68 = 0.0, $70 = 0, $72 = 0.0, $73 = 0, $75 = 0, $84 = 0, $90 = 0, $92 = 0, $95 = 0, $97 = 0, $i$039 = 0, $i$143 = 0, $i$144 = 0, $i$223 = 0, $i$325 = 0, $j$032 = 0, $j$135 = 0, $j$240 = 0, $j$320 = 0, $k$047 = 0, $k$129$in = 0, $s$0$lcssa = 0.0, $s$031 = 0.0, $s$1$lcssa = 0.0, $s$134 = 0.0, $wv1 = 0, $wv2 = 0, label = 0, sp = 0, $k$047$looptemp = 0, $k$129$in$looptemp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $wv1 = sp + 8 | 0; + $wv2 = sp; + $1 = HEAP32[$a + 8 >> 2] | 0; + if (($1 | 0) == (HEAP32[$a + 4 >> 2] | 0)) if (($1 | 0) == (HEAP32[$d + 4 >> 2] | 0)) if (($1 | 0) == ((HEAP32[$e + 4 >> 2] | 0) + 1 | 0)) { + $12 = $1 + -2 | 0; + $13 = $wv1 + 4 | 0; + $14 = $wv2 + 4 | 0; + if (($1 | 0) > 2) { + $i$143 = $1 + -1 | 0; + $k$047 = 0; + do { + $16 = Math_imul($k$047, $1) | 0; + $17 = HEAP32[$a >> 2] | 0; + HEAPF64[(HEAP32[$d >> 2] | 0) + ($k$047 << 3) >> 3] = +HEAPF64[$17 + ($16 + $k$047 << 3) >> 3]; + $23 = $1 - $k$047 + -1 | 0; + HEAP32[$13 >> 2] = $23; + $k$047$looptemp = $k$047; + $k$047 = $k$047 + 1 | 0; + $25 = $17 + ($16 + $k$047 << 3) | 0; + HEAP32[$wv1 >> 2] = $25; + $26 = +_arVecHousehold($wv1); + HEAPF64[(HEAP32[$e >> 2] | 0) + ($k$047$looptemp << 3) >> 3] = $26; + if (!($26 == 0.0)) { + if (($k$047 | 0) < ($1 | 0)) { + $32 = HEAP32[$d >> 2] | 0; + $i$039 = $k$047; + do { + if (($k$047 | 0) < ($i$039 | 0)) { + $34 = HEAP32[$a >> 2] | 0; + $j$032 = $k$047; + $s$031 = 0.0; + while (1) { + $40 = $34 + ((Math_imul($j$032, $1) | 0) + $i$039 << 3) | 0; + $45 = $s$031 + +HEAPF64[$40 >> 3] * +HEAPF64[$17 + ($j$032 + $16 << 3) >> 3]; + $j$032 = $j$032 + 1 | 0; + if (($j$032 | 0) >= ($i$039 | 0)) { + $s$0$lcssa = $45; + break; + } else $s$031 = $45; + } + } else $s$0$lcssa = 0.0; + $35 = Math_imul($i$039, $1) | 0; + if (($i$039 | 0) < ($1 | 0)) { + $37 = HEAP32[$a >> 2] | 0; + $j$135 = $i$039; + $s$134 = $s$0$lcssa; + while (1) { + $54 = $s$134 + +HEAPF64[$37 + ($j$135 + $35 << 3) >> 3] * +HEAPF64[$17 + ($j$135 + $16 << 3) >> 3]; + $j$135 = $j$135 + 1 | 0; + if (($j$135 | 0) >= ($1 | 0)) { + $s$1$lcssa = $54; + break; + } else $s$134 = $54; + } + } else $s$1$lcssa = $s$0$lcssa; + HEAPF64[$32 + ($i$039 << 3) >> 3] = $s$1$lcssa; + $i$039 = $i$039 + 1 | 0; + } while (($i$039 | 0) < ($1 | 0)); + } + HEAP32[$14 >> 2] = $23; + HEAP32[$13 >> 2] = $23; + HEAP32[$wv1 >> 2] = $25; + HEAP32[$wv2 >> 2] = (HEAP32[$d >> 2] | 0) + ($k$047 << 3); + $63 = +_arVecInnerproduct($wv1, $wv2) * .5; + if (($i$143 | 0) > ($k$047$looptemp | 0)) { + $65 = HEAP32[$d >> 2] | 0; + $i$144 = $i$143; + do { + $68 = +HEAPF64[$17 + ($i$144 + $16 << 3) >> 3]; + $70 = $65 + ($i$144 << 3) | 0; + $72 = +HEAPF64[$70 >> 3] - $63 * $68; + HEAPF64[$70 >> 3] = $72; + $73 = Math_imul($i$144, $1) | 0; + if (($i$144 | 0) < ($1 | 0)) { + $75 = HEAP32[$a >> 2] | 0; + $j$240 = $i$144; + do { + $84 = $75 + ($j$240 + $73 << 3) | 0; + HEAPF64[$84 >> 3] = +HEAPF64[$84 >> 3] - ($68 * +HEAPF64[$65 + ($j$240 << 3) >> 3] + $72 * +HEAPF64[$17 + ($j$240 + $16 << 3) >> 3]); + $j$240 = $j$240 + 1 | 0; + } while (($j$240 | 0) < ($1 | 0)); + } + $i$144 = $i$144 + -1 | 0; + } while (($i$144 | 0) > ($k$047$looptemp | 0)); + } + } + } while (($k$047 | 0) < ($12 | 0)); + } + if (($1 | 0) > 1) { + $90 = Math_imul($12, $1) | 0; + $92 = HEAP32[$a >> 2] | 0; + $95 = HEAP32[$d >> 2] | 0; + HEAPF64[$95 + ($12 << 3) >> 3] = +HEAPF64[$92 + ($90 + $12 << 3) >> 3]; + $97 = $1 + -1 | 0; + HEAPF64[(HEAP32[$e >> 2] | 0) + ($12 << 3) >> 3] = +HEAPF64[$92 + ($97 + $90 << 3) >> 3]; + $$pre$phiZ2D = $97; + $107 = $92; + $110 = $95; + label = 27; + } else if (($1 | 0) > 0) { + $$pre$phiZ2D = 0; + $107 = HEAP32[$a >> 2] | 0; + $110 = HEAP32[$d >> 2] | 0; + label = 27; + } + if ((label | 0) == 27) { + $106 = $107 + ((Math_imul($$pre$phiZ2D, $1) | 0) + $$pre$phiZ2D << 3) | 0; + HEAPF64[$110 + ($$pre$phiZ2D << 3) >> 3] = +HEAPF64[$106 >> 3]; + } + if (($1 | 0) > 0) { + $112 = ($1 | 0) > 0; + $k$129$in = $1; + do { + $k$129$in$looptemp = $k$129$in; + $k$129$in = $k$129$in + -1 | 0; + $113 = Math_imul($k$129$in, $1) | 0; + $114 = HEAP32[$a >> 2] | 0; + if (($k$129$in$looptemp | 0) <= ($12 | 0)) { + $117 = $1 - $k$129$in + -1 | 0; + $118 = $114 + ($113 + $k$129$in$looptemp << 3) | 0; + if (($k$129$in$looptemp | 0) < ($1 | 0)) { + $120 = ($k$129$in$looptemp | 0) < ($1 | 0); + $i$223 = $k$129$in$looptemp; + do { + HEAP32[$14 >> 2] = $117; + HEAP32[$13 >> 2] = $117; + HEAP32[$wv1 >> 2] = $118; + $121 = Math_imul($i$223, $1) | 0; + HEAP32[$wv2 >> 2] = (HEAP32[$a >> 2] | 0) + ($121 + $k$129$in$looptemp << 3); + $125 = +_arVecInnerproduct($wv1, $wv2); + if ($120) { + $126 = HEAP32[$a >> 2] | 0; + $j$320 = $k$129$in$looptemp; + do { + $131 = $126 + ($j$320 + $121 << 3) | 0; + HEAPF64[$131 >> 3] = +HEAPF64[$131 >> 3] - $125 * +HEAPF64[$114 + ($j$320 + $113 << 3) >> 3]; + $j$320 = $j$320 + 1 | 0; + } while (($j$320 | 0) < ($1 | 0)); + } + $i$223 = $i$223 + 1 | 0; + } while (($i$223 | 0) < ($1 | 0)); + } + } + if ($112) { + $i$325 = 0; + do { + HEAPF64[$114 + ($i$325 + $113 << 3) >> 3] = 0.0; + $i$325 = $i$325 + 1 | 0; + } while (($i$325 | 0) < ($1 | 0)); + } + HEAPF64[$114 + ($113 + $k$129$in << 3) >> 3] = 1.0; + } while (($k$129$in$looptemp | 0) > 1); + $$0 = 0; + } else $$0 = 0; + } else $$0 = -1; else $$0 = -1; else $$0 = -1; + STACKTOP = sp; + return $$0 | 0; +} + +function __ZN10__cxxabiv112_GLOBAL__N_18demangleINS0_2DbEEEvPKcS4_RT_Ri($first, $last, $db, $status) { + $first = $first | 0; + $last = $last | 0; + $db = $db | 0; + $status = $status | 0; + var $$0$i$i$i11 = 0, $$0$i2 = 0, $$03$i = 0, $$lcssa = 0, $0 = 0, $1 = 0, $12 = 0, $13 = 0, $2 = 0, $20 = 0, $22 = 0, $24 = 0, $31 = 0, $32 = 0, $41 = 0, $44 = 0, $47 = 0, $49 = 0, $6 = 0, $66 = 0, $67 = 0, $78 = 0, $83 = 0, $95 = 0, $__p$0$i$i$i10 = 0, $__p$0$ph$i$i$i = 0, $i$0$i16 = 0, $t$0 = 0, $t$0$i15 = 0, $t$0$i15$lcssa20 = 0, $t$1$i$ph = 0, $t$1$i12 = 0, $t$2$i = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 48 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $0 = sp + 24 | 0; + $1 = sp + 12 | 0; + $2 = sp; + L1 : do if ($first >>> 0 < $last >>> 0) { + L3 : do if ((HEAP8[$first >> 0] | 0) == 95) { + $6 = $last; + if (($6 - $first | 0) <= 3) { + HEAP32[$status >> 2] = -2; + break L1; + } + switch (HEAP8[$first + 1 >> 0] | 0) { + case 90: + { + $12 = $first + 2 | 0; + $13 = __ZN10__cxxabiv112_GLOBAL__N_114parse_encodingINS0_2DbEEEPKcS4_S4_RT_($12, $last, $db) | 0; + if (($13 | 0) == ($12 | 0) | ($13 | 0) == ($last | 0)) $t$0 = $13; else if ((HEAP8[$13 >> 0] | 0) == 46) { + $20 = HEAP32[$db + 4 >> 2] | 0; + if ((HEAP32[$db >> 2] | 0) == ($20 | 0)) $$03$i = $13; else { + $22 = $20 + -24 | 0; + $24 = $6 - $13 | 0; + if ($24 >>> 0 > 4294967279) __ZNKSt3__121__basic_string_commonILb1EE20__throw_length_errorEv($2); + if ($24 >>> 0 < 11) { + HEAP8[$2 >> 0] = $24 << 1; + $__p$0$ph$i$i$i = $2 + 1 | 0; + } else { + $31 = $24 + 16 & -16; + $32 = _malloc($31) | 0; + HEAP32[$2 + 8 >> 2] = $32; + HEAP32[$2 >> 2] = $31 | 1; + HEAP32[$2 + 4 >> 2] = $24; + $__p$0$ph$i$i$i = $32; + } + if (($13 | 0) != ($last | 0)) { + $$0$i$i$i11 = $13; + $__p$0$i$i$i10 = $__p$0$ph$i$i$i; + while (1) { + HEAP8[$__p$0$i$i$i10 >> 0] = HEAP8[$$0$i$i$i11 >> 0] | 0; + $$0$i$i$i11 = $$0$i$i$i11 + 1 | 0; + if (($$0$i$i$i11 | 0) == ($last | 0)) break; else $__p$0$i$i$i10 = $__p$0$i$i$i10 + 1 | 0; + } + } + HEAP8[$__p$0$ph$i$i$i + $24 >> 0] = 0; + $41 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc($2, 0, 12616) | 0; + HEAP32[$1 >> 2] = HEAP32[$41 >> 2]; + HEAP32[$1 + 4 >> 2] = HEAP32[$41 + 4 >> 2]; + HEAP32[$1 + 8 >> 2] = HEAP32[$41 + 8 >> 2]; + HEAP32[$41 >> 2] = 0; + HEAP32[$41 + 4 >> 2] = 0; + HEAP32[$41 + 8 >> 2] = 0; + $44 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($1, 12619) | 0; + HEAP32[$0 >> 2] = HEAP32[$44 >> 2]; + HEAP32[$0 + 4 >> 2] = HEAP32[$44 + 4 >> 2]; + HEAP32[$0 + 8 >> 2] = HEAP32[$44 + 8 >> 2]; + HEAP32[$44 >> 2] = 0; + HEAP32[$44 + 4 >> 2] = 0; + HEAP32[$44 + 8 >> 2] = 0; + $47 = HEAP8[$0 >> 0] | 0; + $49 = ($47 & 1) == 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($22, $49 ? $0 + 1 | 0 : HEAP32[$0 + 8 >> 2] | 0, $49 ? ($47 & 255) >>> 1 : HEAP32[$0 + 4 >> 2] | 0) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($0); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($1); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($2); + $$03$i = $last; + } + $t$0 = $$03$i; + } else $t$0 = $13; + if (($t$0 | 0) == ($last | 0)) break L3; + HEAP32[$status >> 2] = -2; + break L1; + break; + } + case 95: + { + label = 20; + break; + } + default: + {} + } + if ((label | 0) == 20) if ((HEAP8[$first + 2 >> 0] | 0) == 95) if ((HEAP8[$first + 3 >> 0] | 0) == 90) { + $66 = $first + 4 | 0; + $67 = __ZN10__cxxabiv112_GLOBAL__N_114parse_encodingINS0_2DbEEEPKcS4_S4_RT_($66, $last, $db) | 0; + if (($67 | 0) == ($66 | 0) | ($67 | 0) == ($last | 0)) { + HEAP32[$status >> 2] = -2; + break L1; + } + L36 : do if (($6 - $67 | 0) > 12) { + $i$0$i16 = 0; + $t$0$i15 = $67; + while (1) { + if ((HEAP8[$t$0$i15 >> 0] | 0) != (HEAP8[12621 + $i$0$i16 >> 0] | 0)) { + $$0$i2 = $67; + break L36; + } + $i$0$i16 = $i$0$i16 + 1 | 0; + $78 = $t$0$i15 + 1 | 0; + if (($i$0$i16 | 0) >= 13) { + $$lcssa = $78; + $t$0$i15$lcssa20 = $t$0$i15; + break; + } else $t$0$i15 = $78; + } + L41 : do if (($$lcssa | 0) == ($last | 0)) $t$2$i = $last; else { + if ((HEAP8[$$lcssa >> 0] | 0) == 95) { + $83 = $t$0$i15$lcssa20 + 2 | 0; + if (($83 | 0) == ($last | 0)) { + $$0$i2 = $67; + break L36; + } + if (((HEAP8[$83 >> 0] | 0) + -48 | 0) >>> 0 >= 10) { + $$0$i2 = $67; + break L36; + } + $t$1$i$ph = $t$0$i15$lcssa20 + 3 | 0; + } else $t$1$i$ph = $$lcssa; + if (($t$1$i$ph | 0) == ($last | 0)) $t$2$i = $last; else { + $t$1$i12 = $t$1$i$ph; + while (1) { + if (((HEAP8[$t$1$i12 >> 0] | 0) + -48 | 0) >>> 0 >= 10) { + $t$2$i = $t$1$i12; + break L41; + } + $t$1$i12 = $t$1$i12 + 1 | 0; + if (($t$1$i12 | 0) == ($last | 0)) { + $t$2$i = $last; + break; + } + } + } + } while (0); + $95 = HEAP32[$db + 4 >> 2] | 0; + if ((HEAP32[$db >> 2] | 0) == ($95 | 0)) $$0$i2 = $67; else { + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc($95 + -24 | 0, 0, 12635) | 0; + $$0$i2 = $t$2$i; + } + } else $$0$i2 = $67; while (0); + if (($$0$i2 | 0) == ($last | 0)) break; + HEAP32[$status >> 2] = -2; + break L1; + } + HEAP32[$status >> 2] = -2; + break L1; + } else if ((__ZN10__cxxabiv112_GLOBAL__N_110parse_typeINS0_2DbEEEPKcS4_S4_RT_($first, $last, $db) | 0) != ($last | 0)) { + HEAP32[$status >> 2] = -2; + break L1; + } while (0); + if (!(HEAP32[$status >> 2] | 0)) if ((HEAP32[$db >> 2] | 0) == (HEAP32[$db + 4 >> 2] | 0)) HEAP32[$status >> 2] = -2; + } else HEAP32[$status >> 2] = -2; while (0); + STACKTOP = sp; + return; +} + +function _arMatrixSelfInv($m) { + $m = $m | 0; + var $$0$i = 0, $$lcssa = 0, $0 = 0, $13 = 0, $15 = 0, $18 = 0.0, $19 = 0, $2 = 0, $24 = 0, $25 = 0, $26 = 0, $30 = 0.0, $35 = 0.0, $43 = 0, $44 = 0.0, $59 = 0, $61 = 0, $63 = 0, $65 = 0, $70 = 0.0, $exitcond$i23 = 0, $exitcond12$i36 = 0, $exitcond13$i43 = 0, $exitcond7$i30 = 0, $i$0$i14 = 0, $i$1$i45 = 0, $i$2$i8 = 0, $indvars$iv$i49 = 0, $indvars$iv9$i44 = 0, $ip$0$i51 = 0, $ip$1$i$lcssa = 0, $ip$1$i15 = 0, $ip$2$i = 0, $j$0$i24 = 0, $j$1$i31 = 0, $j$2$i37 = 0, $j$3$i$lcssa = 0, $j$3$i4 = 0, $n$0$i53 = 0, $n$1$i50 = 0, $n$2$i12 = 0, $nos$i = 0, $p$0$i$lcssa = 0.0, $p$0$i17 = 0.0, $p$1$i = 0.0, $scevgep$i = 0, $wap$0$i16 = 0, $wap$1$i26 = 0, $wap$2$i32 = 0, $wap$3$i39 = 0, $wap$4$i10 = 0, $wbp$0$i25 = 0, $wbp$1$i38 = 0, $wbp$2$i9 = 0, sp = 0, $wap$2$i32$looptemp = 0, $wap$3$i39$looptemp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 2e3 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $nos$i = sp; + $0 = HEAP32[$m >> 2] | 0; + $2 = HEAP32[$m + 4 >> 2] | 0; + L1 : do if (($2 | 0) > 500) $$0$i = 0; else { + switch ($2 | 0) { + case 0: + { + $$0$i = 0; + break L1; + break; + } + case 1: + { + HEAPF64[$0 >> 3] = 1.0 / +HEAPF64[$0 >> 3]; + $$0$i = $0; + break L1; + break; + } + default: + {} + } + if (($2 | 0) > 0) { + $n$0$i53 = 0; + do { + HEAP32[$nos$i + ($n$0$i53 << 2) >> 2] = $n$0$i53; + $n$0$i53 = $n$0$i53 + 1 | 0; + } while (($n$0$i53 | 0) < ($2 | 0)); + } + $scevgep$i = $0 + ($2 + -1 << 3) | 0; + if (($2 | 0) > 0) { + $exitcond$i23 = ($2 | 0) == 0; + $exitcond7$i30 = ($2 | 0) == 1; + $exitcond13$i43 = ($2 | 0) == 0; + $exitcond12$i36 = ($2 | 0) == 1; + $indvars$iv$i49 = $scevgep$i; + $ip$0$i51 = 0; + $n$1$i50 = 0; + while (1) { + $15 = $0 + ((Math_imul($n$1$i50, $2) | 0) << 3) | 0; + if (($n$1$i50 | 0) < ($2 | 0)) { + $i$0$i14 = $n$1$i50; + $ip$1$i15 = $ip$0$i51; + $p$0$i17 = 0.0; + $wap$0$i16 = $15; + while (1) { + $18 = +Math_abs(+(+HEAPF64[$wap$0$i16 >> 3])); + $19 = $p$0$i17 < $18; + $ip$2$i = $19 ? $i$0$i14 : $ip$1$i15; + $p$1$i = $19 ? $18 : $p$0$i17; + $i$0$i14 = $i$0$i14 + 1 | 0; + if (($i$0$i14 | 0) >= ($2 | 0)) { + $ip$1$i$lcssa = $ip$2$i; + $p$0$i$lcssa = $p$1$i; + break; + } else { + $ip$1$i15 = $ip$2$i; + $p$0$i17 = $p$1$i; + $wap$0$i16 = $wap$0$i16 + ($2 << 3) | 0; + } + } + } else { + $ip$1$i$lcssa = $ip$0$i51; + $p$0$i$lcssa = 0.0; + } + if ($p$0$i$lcssa <= 1.0e-10) { + $$0$i = 0; + break L1; + } + $24 = $nos$i + ($ip$1$i$lcssa << 2) | 0; + $25 = HEAP32[$24 >> 2] | 0; + $26 = $nos$i + ($n$1$i50 << 2) | 0; + HEAP32[$24 >> 2] = HEAP32[$26 >> 2]; + HEAP32[$26 >> 2] = $25; + if (!$exitcond$i23) { + $j$0$i24 = 0; + $wap$1$i26 = $0 + ((Math_imul($ip$1$i$lcssa, $2) | 0) << 3) | 0; + $wbp$0$i25 = $15; + while (1) { + $30 = +HEAPF64[$wap$1$i26 >> 3]; + HEAPF64[$wap$1$i26 >> 3] = +HEAPF64[$wbp$0$i25 >> 3]; + HEAPF64[$wbp$0$i25 >> 3] = $30; + $j$0$i24 = $j$0$i24 + 1 | 0; + if (($j$0$i24 | 0) == ($2 | 0)) break; else { + $wap$1$i26 = $wap$1$i26 + 8 | 0; + $wbp$0$i25 = $wbp$0$i25 + 8 | 0; + } + } + } + $35 = +HEAPF64[$15 >> 3]; + if (!$exitcond7$i30) { + $j$1$i31 = 1; + $wap$2$i32 = $15; + do { + $wap$2$i32$looptemp = $wap$2$i32; + $wap$2$i32 = $wap$2$i32 + 8 | 0; + HEAPF64[$wap$2$i32$looptemp >> 3] = +HEAPF64[$wap$2$i32 >> 3] / $35; + $j$1$i31 = $j$1$i31 + 1 | 0; + } while (($j$1$i31 | 0) != ($2 | 0)); + } + HEAPF64[$indvars$iv$i49 >> 3] = 1.0 / $35; + if (!$exitcond13$i43) { + $i$1$i45 = 0; + $indvars$iv9$i44 = $scevgep$i; + while (1) { + if (($i$1$i45 | 0) != ($n$1$i50 | 0)) { + $43 = $0 + ((Math_imul($i$1$i45, $2) | 0) << 3) | 0; + $44 = +HEAPF64[$43 >> 3]; + if (!$exitcond12$i36) { + $j$2$i37 = 1; + $wap$3$i39 = $43; + $wbp$1$i38 = $15; + while (1) { + $wap$3$i39$looptemp = $wap$3$i39; + $wap$3$i39 = $wap$3$i39 + 8 | 0; + HEAPF64[$wap$3$i39$looptemp >> 3] = +HEAPF64[$wap$3$i39 >> 3] - $44 * +HEAPF64[$wbp$1$i38 >> 3]; + $j$2$i37 = $j$2$i37 + 1 | 0; + if (($j$2$i37 | 0) == ($2 | 0)) break; else $wbp$1$i38 = $wbp$1$i38 + 8 | 0; + } + } + HEAPF64[$indvars$iv9$i44 >> 3] = -($44 * +HEAPF64[$indvars$iv$i49 >> 3]); + } + $i$1$i45 = $i$1$i45 + 1 | 0; + if (($i$1$i45 | 0) == ($2 | 0)) break; else $indvars$iv9$i44 = $indvars$iv9$i44 + ($2 << 3) | 0; + } + } + $n$1$i50 = $n$1$i50 + 1 | 0; + if (($n$1$i50 | 0) >= ($2 | 0)) break; else { + $indvars$iv$i49 = $indvars$iv$i49 + ($2 << 3) | 0; + $ip$0$i51 = $ip$1$i$lcssa; + } + } + } + if (($2 | 0) > 0) { + $13 = ($2 | 0) > 0; + $n$2$i12 = 0; + while (1) { + $59 = $nos$i + ($n$2$i12 << 2) | 0; + L43 : do if (($n$2$i12 | 0) < ($2 | 0)) { + $61 = $59; + $j$3$i4 = $n$2$i12; + while (1) { + if ((HEAP32[$61 >> 2] | 0) == ($n$2$i12 | 0)) { + $$lcssa = $61; + $j$3$i$lcssa = $j$3$i4; + break L43; + } + $63 = $j$3$i4 + 1 | 0; + $65 = $nos$i + ($63 << 2) | 0; + if (($63 | 0) < ($2 | 0)) { + $61 = $65; + $j$3$i4 = $63; + } else { + $$lcssa = $65; + $j$3$i$lcssa = $63; + break; + } + } + } else { + $$lcssa = $59; + $j$3$i$lcssa = $n$2$i12; + } while (0); + HEAP32[$$lcssa >> 2] = HEAP32[$nos$i + ($n$2$i12 << 2) >> 2]; + if ($13) { + $i$2$i8 = 0; + $wap$4$i10 = $0 + ($j$3$i$lcssa << 3) | 0; + $wbp$2$i9 = $0 + ($n$2$i12 << 3) | 0; + while (1) { + $70 = +HEAPF64[$wap$4$i10 >> 3]; + HEAPF64[$wap$4$i10 >> 3] = +HEAPF64[$wbp$2$i9 >> 3]; + HEAPF64[$wbp$2$i9 >> 3] = $70; + $i$2$i8 = $i$2$i8 + 1 | 0; + if (($i$2$i8 | 0) >= ($2 | 0)) break; else { + $wap$4$i10 = $wap$4$i10 + ($2 << 3) | 0; + $wbp$2$i9 = $wbp$2$i9 + ($2 << 3) | 0; + } + } + } + $n$2$i12 = $n$2$i12 + 1 | 0; + if (($n$2$i12 | 0) >= ($2 | 0)) { + $$0$i = $0; + break; + } + } + } else $$0$i = $0; + } while (0); + STACKTOP = sp; + return (($$0$i | 0) == 0) << 31 >> 31 | 0; +} + +function _try_realloc_chunk($p, $nb) { + $p = $p | 0; + $nb = $nb | 0; + var $$pre$phiZ2D = 0, $0 = 0, $1 = 0, $101 = 0, $103 = 0, $106 = 0, $109 = 0, $110 = 0, $112 = 0, $113 = 0, $115 = 0, $116 = 0, $118 = 0, $119 = 0, $124 = 0, $125 = 0, $134 = 0, $139 = 0, $143 = 0, $149 = 0, $159 = 0, $168 = 0, $2 = 0, $20 = 0, $3 = 0, $33 = 0, $35 = 0, $4 = 0, $45 = 0, $47 = 0, $5 = 0, $56 = 0, $62 = 0, $68 = 0, $7 = 0, $70 = 0, $71 = 0, $74 = 0, $76 = 0, $78 = 0, $8 = 0, $91 = 0, $96 = 0, $98 = 0, $R$0 = 0, $R$0$lcssa = 0, $R$1 = 0, $RP$0 = 0, $RP$0$lcssa = 0, $newp$0 = 0, $storemerge = 0, $storemerge21 = 0; + $0 = $p + 4 | 0; + $1 = HEAP32[$0 >> 2] | 0; + $2 = $1 & -8; + $3 = $p + $2 | 0; + $4 = HEAP32[760] | 0; + $5 = $1 & 3; + if (!(($5 | 0) != 1 & $p >>> 0 >= $4 >>> 0 & $p >>> 0 < $3 >>> 0)) _abort(); + $7 = $p + ($2 | 4) | 0; + $8 = HEAP32[$7 >> 2] | 0; + if (!($8 & 1)) _abort(); + if (!$5) { + if ($nb >>> 0 < 256) { + $newp$0 = 0; + return $newp$0 | 0; + } + if ($2 >>> 0 >= ($nb + 4 | 0) >>> 0) if (($2 - $nb | 0) >>> 0 <= HEAP32[876] << 1 >>> 0) { + $newp$0 = $p; + return $newp$0 | 0; + } + $newp$0 = 0; + return $newp$0 | 0; + } + if ($2 >>> 0 >= $nb >>> 0) { + $20 = $2 - $nb | 0; + if ($20 >>> 0 <= 15) { + $newp$0 = $p; + return $newp$0 | 0; + } + HEAP32[$0 >> 2] = $1 & 1 | $nb | 2; + HEAP32[$p + ($nb + 4) >> 2] = $20 | 3; + HEAP32[$7 >> 2] = HEAP32[$7 >> 2] | 1; + _dispose_chunk($p + $nb | 0, $20); + $newp$0 = $p; + return $newp$0 | 0; + } + if (($3 | 0) == (HEAP32[762] | 0)) { + $33 = (HEAP32[759] | 0) + $2 | 0; + if ($33 >>> 0 <= $nb >>> 0) { + $newp$0 = 0; + return $newp$0 | 0; + } + $35 = $33 - $nb | 0; + HEAP32[$0 >> 2] = $1 & 1 | $nb | 2; + HEAP32[$p + ($nb + 4) >> 2] = $35 | 1; + HEAP32[762] = $p + $nb; + HEAP32[759] = $35; + $newp$0 = $p; + return $newp$0 | 0; + } + if (($3 | 0) == (HEAP32[761] | 0)) { + $45 = (HEAP32[758] | 0) + $2 | 0; + if ($45 >>> 0 < $nb >>> 0) { + $newp$0 = 0; + return $newp$0 | 0; + } + $47 = $45 - $nb | 0; + if ($47 >>> 0 > 15) { + HEAP32[$0 >> 2] = $1 & 1 | $nb | 2; + HEAP32[$p + ($nb + 4) >> 2] = $47 | 1; + HEAP32[$p + $45 >> 2] = $47; + $56 = $p + ($45 + 4) | 0; + HEAP32[$56 >> 2] = HEAP32[$56 >> 2] & -2; + $storemerge = $p + $nb | 0; + $storemerge21 = $47; + } else { + HEAP32[$0 >> 2] = $1 & 1 | $45 | 2; + $62 = $p + ($45 + 4) | 0; + HEAP32[$62 >> 2] = HEAP32[$62 >> 2] | 1; + $storemerge = 0; + $storemerge21 = 0; + } + HEAP32[758] = $storemerge21; + HEAP32[761] = $storemerge; + $newp$0 = $p; + return $newp$0 | 0; + } + if ($8 & 2) { + $newp$0 = 0; + return $newp$0 | 0; + } + $68 = ($8 & -8) + $2 | 0; + if ($68 >>> 0 < $nb >>> 0) { + $newp$0 = 0; + return $newp$0 | 0; + } + $70 = $68 - $nb | 0; + $71 = $8 >>> 3; + do if ($8 >>> 0 < 256) { + $74 = HEAP32[$p + ($2 + 8) >> 2] | 0; + $76 = HEAP32[$p + ($2 + 12) >> 2] | 0; + $78 = 3064 + ($71 << 1 << 2) | 0; + if (($74 | 0) != ($78 | 0)) { + if ($74 >>> 0 < $4 >>> 0) _abort(); + if ((HEAP32[$74 + 12 >> 2] | 0) != ($3 | 0)) _abort(); + } + if (($76 | 0) == ($74 | 0)) { + HEAP32[756] = HEAP32[756] & ~(1 << $71); + break; + } + if (($76 | 0) == ($78 | 0)) $$pre$phiZ2D = $76 + 8 | 0; else { + if ($76 >>> 0 < $4 >>> 0) _abort(); + $91 = $76 + 8 | 0; + if ((HEAP32[$91 >> 2] | 0) == ($3 | 0)) $$pre$phiZ2D = $91; else _abort(); + } + HEAP32[$74 + 12 >> 2] = $76; + HEAP32[$$pre$phiZ2D >> 2] = $74; + } else { + $96 = HEAP32[$p + ($2 + 24) >> 2] | 0; + $98 = HEAP32[$p + ($2 + 12) >> 2] | 0; + do if (($98 | 0) == ($3 | 0)) { + $109 = $p + ($2 + 20) | 0; + $110 = HEAP32[$109 >> 2] | 0; + if (!$110) { + $112 = $p + ($2 + 16) | 0; + $113 = HEAP32[$112 >> 2] | 0; + if (!$113) { + $R$1 = 0; + break; + } else { + $R$0 = $113; + $RP$0 = $112; + } + } else { + $R$0 = $110; + $RP$0 = $109; + } + while (1) { + $115 = $R$0 + 20 | 0; + $116 = HEAP32[$115 >> 2] | 0; + if ($116) { + $R$0 = $116; + $RP$0 = $115; + continue; + } + $118 = $R$0 + 16 | 0; + $119 = HEAP32[$118 >> 2] | 0; + if (!$119) { + $R$0$lcssa = $R$0; + $RP$0$lcssa = $RP$0; + break; + } else { + $R$0 = $119; + $RP$0 = $118; + } + } + if ($RP$0$lcssa >>> 0 < $4 >>> 0) _abort(); else { + HEAP32[$RP$0$lcssa >> 2] = 0; + $R$1 = $R$0$lcssa; + break; + } + } else { + $101 = HEAP32[$p + ($2 + 8) >> 2] | 0; + if ($101 >>> 0 < $4 >>> 0) _abort(); + $103 = $101 + 12 | 0; + if ((HEAP32[$103 >> 2] | 0) != ($3 | 0)) _abort(); + $106 = $98 + 8 | 0; + if ((HEAP32[$106 >> 2] | 0) == ($3 | 0)) { + HEAP32[$103 >> 2] = $98; + HEAP32[$106 >> 2] = $101; + $R$1 = $98; + break; + } else _abort(); + } while (0); + if ($96) { + $124 = HEAP32[$p + ($2 + 28) >> 2] | 0; + $125 = 3328 + ($124 << 2) | 0; + if (($3 | 0) == (HEAP32[$125 >> 2] | 0)) { + HEAP32[$125 >> 2] = $R$1; + if (!$R$1) { + HEAP32[757] = HEAP32[757] & ~(1 << $124); + break; + } + } else { + if ($96 >>> 0 < (HEAP32[760] | 0) >>> 0) _abort(); + $134 = $96 + 16 | 0; + if ((HEAP32[$134 >> 2] | 0) == ($3 | 0)) HEAP32[$134 >> 2] = $R$1; else HEAP32[$96 + 20 >> 2] = $R$1; + if (!$R$1) break; + } + $139 = HEAP32[760] | 0; + if ($R$1 >>> 0 < $139 >>> 0) _abort(); + HEAP32[$R$1 + 24 >> 2] = $96; + $143 = HEAP32[$p + ($2 + 16) >> 2] | 0; + do if ($143) if ($143 >>> 0 < $139 >>> 0) _abort(); else { + HEAP32[$R$1 + 16 >> 2] = $143; + HEAP32[$143 + 24 >> 2] = $R$1; + break; + } while (0); + $149 = HEAP32[$p + ($2 + 20) >> 2] | 0; + if ($149) if ($149 >>> 0 < (HEAP32[760] | 0) >>> 0) _abort(); else { + HEAP32[$R$1 + 20 >> 2] = $149; + HEAP32[$149 + 24 >> 2] = $R$1; + break; + } + } + } while (0); + if ($70 >>> 0 < 16) { + HEAP32[$0 >> 2] = $68 | $1 & 1 | 2; + $159 = $p + ($68 | 4) | 0; + HEAP32[$159 >> 2] = HEAP32[$159 >> 2] | 1; + $newp$0 = $p; + return $newp$0 | 0; + } else { + HEAP32[$0 >> 2] = $1 & 1 | $nb | 2; + HEAP32[$p + ($nb + 4) >> 2] = $70 | 3; + $168 = $p + ($68 | 4) | 0; + HEAP32[$168 >> 2] = HEAP32[$168 >> 2] | 1; + _dispose_chunk($p + $nb | 0, $70); + $newp$0 = $p; + return $newp$0 | 0; + } + return 0; +} + +function __ZN10__cxxabiv112_GLOBAL__N_121parse_integer_literalINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_($first, $last, $lit, $db) { + $first = $first | 0; + $last = $last | 0; + $lit = $lit | 0; + $db = $db | 0; + var $$0$i$i$i = 0, $$0$i$i$i5 = 0, $$02 = 0, $$1 = 0, $0 = 0, $1 = 0, $11 = 0, $17 = 0, $2 = 0, $20 = 0, $21 = 0, $23 = 0, $3 = 0, $30 = 0, $31 = 0, $32 = 0, $33 = 0, $37 = 0, $39 = 0, $42 = 0, $43 = 0, $45 = 0, $46 = 0, $48 = 0, $52 = 0, $60 = 0, $61 = 0, $62 = 0, $63 = 0, $67 = 0, $69 = 0, $72 = 0, $73 = 0, $76 = 0, $8 = 0, $82 = 0, $88 = 0, $90 = 0, $94 = 0, $__v$i$i4 = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 80 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $__v$i$i4 = sp + 48 | 0; + $0 = sp + 24 | 0; + $1 = sp + 12 | 0; + $2 = sp; + $3 = __ZN10__cxxabiv112_GLOBAL__N_112parse_numberEPKcS2_($first, $last) | 0; + if (($3 | 0) == ($first | 0) | ($3 | 0) == ($last | 0)) $$1 = $first; else if ((HEAP8[$3 >> 0] | 0) == 69) { + $8 = HEAP8[$lit >> 0] | 0; + $11 = $lit + 4 | 0; + do if ((($8 & 1) == 0 ? ($8 & 255) >>> 1 : HEAP32[$11 >> 2] | 0) >>> 0 > 3) { + __ZNSt3__1plIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEENS_12basic_stringIT_T0_T1_EEPKS8_RKSB_($2, 12714, $lit); + $17 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($2, 12619) | 0; + HEAP32[$1 >> 2] = HEAP32[$17 >> 2]; + HEAP32[$1 + 4 >> 2] = HEAP32[$17 + 4 >> 2]; + HEAP32[$1 + 8 >> 2] = HEAP32[$17 + 8 >> 2]; + HEAP32[$17 >> 2] = 0; + HEAP32[$17 + 4 >> 2] = 0; + HEAP32[$17 + 8 >> 2] = 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ENSt3__112basic_stringIcNS2_11char_traitsIcEENS0_12malloc_allocIcEEEE($0, $1); + $20 = $db + 4 | 0; + $21 = HEAP32[$20 >> 2] | 0; + $23 = HEAP32[$db + 8 >> 2] | 0; + if ($21 >>> 0 < $23 >>> 0) { + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($21, $0); + HEAP32[$20 >> 2] = (HEAP32[$20 >> 2] | 0) + 24; + } else { + $30 = HEAP32[$db >> 2] | 0; + $31 = $21 - $30 | 0; + $32 = ($31 | 0) / 24 | 0; + $33 = $32 + 1 | 0; + if (($31 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $37 = ($23 - $30 | 0) / 24 | 0; + if ($37 >>> 0 < 1073741823) { + $39 = $37 << 1; + $$0$i$i$i = $39 >>> 0 < $33 >>> 0 ? $33 : $39; + } else $$0$i$i$i = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i4, $$0$i$i$i, $32, $db + 12 | 0); + $42 = $__v$i$i4 + 8 | 0; + $43 = HEAP32[$42 >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($43, $0); + HEAP32[$42 >> 2] = $43 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i4); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i4); + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($0); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($1); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($2); + } else { + $45 = $db + 4 | 0; + $46 = HEAP32[$45 >> 2] | 0; + $48 = HEAP32[$db + 8 >> 2] | 0; + if ($46 >>> 0 < $48 >>> 0) { + HEAP32[$46 >> 2] = 0; + HEAP32[$46 + 4 >> 2] = 0; + HEAP32[$46 + 8 >> 2] = 0; + HEAP32[$46 + 12 >> 2] = 0; + HEAP32[$46 + 16 >> 2] = 0; + HEAP32[$46 + 20 >> 2] = 0; + HEAP32[$46 >> 2] = 0; + HEAP32[$46 + 4 >> 2] = 0; + HEAP32[$46 + 8 >> 2] = 0; + $52 = $46 + 12 | 0; + HEAP32[$52 >> 2] = 0; + HEAP32[$52 + 4 >> 2] = 0; + HEAP32[$52 + 8 >> 2] = 0; + HEAP32[$45 >> 2] = (HEAP32[$45 >> 2] | 0) + 24; + break; + } + $60 = HEAP32[$db >> 2] | 0; + $61 = $46 - $60 | 0; + $62 = ($61 | 0) / 24 | 0; + $63 = $62 + 1 | 0; + if (($61 | 0) < -24) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($db); + $67 = ($48 - $60 | 0) / 24 | 0; + if ($67 >>> 0 < 1073741823) { + $69 = $67 << 1; + $$0$i$i$i5 = $69 >>> 0 < $63 >>> 0 ? $63 : $69; + } else $$0$i$i$i5 = 2147483647; + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($__v$i$i4, $$0$i$i$i5, $62, $db + 12 | 0); + $72 = $__v$i$i4 + 8 | 0; + $73 = HEAP32[$72 >> 2] | 0; + HEAP32[$73 >> 2] = 0; + HEAP32[$73 + 4 >> 2] = 0; + HEAP32[$73 + 8 >> 2] = 0; + HEAP32[$73 + 12 >> 2] = 0; + HEAP32[$73 + 16 >> 2] = 0; + HEAP32[$73 + 20 >> 2] = 0; + HEAP32[$73 >> 2] = 0; + HEAP32[$73 + 4 >> 2] = 0; + HEAP32[$73 + 8 >> 2] = 0; + $76 = $73 + 12 | 0; + HEAP32[$76 >> 2] = 0; + HEAP32[$76 + 4 >> 2] = 0; + HEAP32[$76 + 8 >> 2] = 0; + HEAP32[$72 >> 2] = $73 + 24; + __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($db, $__v$i$i4); + __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($__v$i$i4); + } while (0); + $82 = $db + 4 | 0; + if ((HEAP8[$first >> 0] | 0) == 110) { + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE9push_backEc((HEAP32[$82 >> 2] | 0) + -24 | 0, 45); + $$02 = $first + 1 | 0; + } else $$02 = $first; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendIPKcEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueERS7_E4typeESC_SC_((HEAP32[$82 >> 2] | 0) + -24 | 0, $$02, $3); + $88 = HEAP8[$lit >> 0] | 0; + $90 = ($88 & 1) == 0; + $94 = $90 ? ($88 & 255) >>> 1 : HEAP32[$11 >> 2] | 0; + if ($94 >>> 0 < 4) __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj((HEAP32[$82 >> 2] | 0) + -24 | 0, $90 ? $lit + 1 | 0 : HEAP32[$lit + 8 >> 2] | 0, $94) | 0; + $$1 = $3 + 1 | 0; + } else $$1 = $first; + STACKTOP = sp; + return $$1 | 0; +} + +function _arGetContour($limage, $xsize, $ysize, $label_ref, $label, $clip, $marker_info2) { + $limage = $limage | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $label_ref = $label_ref | 0; + $label = $label | 0; + $clip = $clip | 0; + $marker_info2 = $marker_info2 | 0; + var $$0 = 0, $$lcssa68 = 0, $$lcssa69 = 0, $1 = 0, $19 = 0, $2 = 0, $20 = 0, $21 = 0, $24 = 0, $26 = 0, $27 = 0, $29 = 0, $30 = 0, $34 = 0, $38 = 0, $4 = 0, $40 = 0, $41 = 0, $46 = 0, $48 = 0, $49 = 0, $56 = 0, $61 = 0, $62 = 0, $65 = 0, $67 = 0, $68 = 0, $83 = 0, $9 = 0, $92 = 0, $dir$0 = 0, $dir$1 = 0, $dir$1$lcssa = 0, $dir$130 = 0, $dir$146 = 0, $dmax$040 = 0, $i$048 = 0, $i$048$lcssa = 0, $i$145 = 0, $i$2$v1$0 = 0, $i$242 = 0, $i$338 = 0, $i$436 = 0, $i$535 = 0, $p1$047 = 0, $v1$0$lcssa = 0, $v1$041 = 0, $vararg_buffer = 0, $vararg_buffer1 = 0, $vararg_buffer3 = 0, $wx = 0, $wy = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 80032 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer3 = sp + 16 | 0; + $vararg_buffer1 = sp + 8 | 0; + $vararg_buffer = sp; + $wx = sp + 40024 | 0; + $wy = sp + 24 | 0; + $1 = HEAP32[$clip + 8 >> 2] | 0; + $2 = HEAP32[$clip >> 2] | 0; + $4 = HEAP32[$clip + 4 >> 2] | 0; + L1 : do if (($2 | 0) > ($4 | 0)) label = 6; else { + $i$048 = $2; + $p1$047 = $limage + ((Math_imul($1, $xsize) | 0) + $2 << 1) | 0; + while (1) { + $9 = HEAP16[$p1$047 >> 1] | 0; + if ($9 << 16 >> 16 > 0) if ((HEAP32[$label_ref + (($9 << 16 >> 16) + -1 << 2) >> 2] | 0) == ($label | 0)) { + $i$048$lcssa = $i$048; + break; + } + if (($i$048 | 0) < ($4 | 0)) { + $i$048 = $i$048 + 1 | 0; + $p1$047 = $p1$047 + 2 | 0; + } else { + label = 6; + break L1; + } + } + $19 = $marker_info2 + 24 | 0; + HEAP32[$19 >> 2] = 1; + $20 = $marker_info2 + 28 | 0; + HEAP32[$20 >> 2] = $i$048$lcssa; + $21 = $marker_info2 + 40028 | 0; + HEAP32[$21 >> 2] = $1; + $27 = $1; + $29 = $i$048$lcssa; + $40 = 1; + $dir$0 = 5; + while (1) { + $dir$146 = ($dir$0 + 5 | 0) % 8 | 0; + $i$145 = 0; + while (1) { + $24 = HEAP32[776 + ($dir$146 << 2) >> 2] | 0; + $26 = HEAP32[808 + ($dir$146 << 2) >> 2] | 0; + $30 = $limage + ($26 + $29 + (Math_imul($24 + $27 | 0, $xsize) | 0) << 1) | 0; + if ((HEAP16[$30 >> 1] | 0) > 0) { + $38 = $26; + $46 = $24; + $dir$130 = $dir$146; + break; + } + $34 = $i$145 + 1 | 0; + $dir$1 = ($dir$146 + 1 | 0) % 8 | 0; + if (($34 | 0) < 8) { + $dir$146 = $dir$1; + $i$145 = $34; + } else { + $$lcssa68 = $34; + $dir$1$lcssa = $dir$1; + label = 11; + break; + } + } + if ((label | 0) == 11) { + label = 0; + if (($$lcssa68 | 0) == 8) { + label = 13; + break; + } + $38 = HEAP32[808 + ($dir$1$lcssa << 2) >> 2] | 0; + $46 = HEAP32[776 + ($dir$1$lcssa << 2) >> 2] | 0; + $dir$130 = $dir$1$lcssa; + } + HEAP32[$marker_info2 + 28 + ($40 << 2) >> 2] = $38 + $29; + $41 = HEAP32[$19 >> 2] | 0; + HEAP32[$marker_info2 + 40028 + ($41 << 2) >> 2] = $46 + (HEAP32[$marker_info2 + 40028 + ($41 + -1 << 2) >> 2] | 0); + $48 = HEAP32[$19 >> 2] | 0; + $49 = $marker_info2 + 28 + ($48 << 2) | 0; + if ((HEAP32[$49 >> 2] | 0) == ($i$048$lcssa | 0)) if ((HEAP32[$marker_info2 + 40028 + ($48 << 2) >> 2] | 0) == ($1 | 0)) { + $$lcssa69 = $48; + label = 16; + break; + } + $56 = $48 + 1 | 0; + HEAP32[$19 >> 2] = $56; + if (($56 | 0) == 9999) { + label = 19; + break; + } + $27 = HEAP32[$marker_info2 + 40028 + ($48 << 2) >> 2] | 0; + $29 = HEAP32[$49 >> 2] | 0; + $40 = $56; + $dir$0 = $dir$130; + } + if ((label | 0) == 13) { + _arLog(3, 4347, $vararg_buffer1); + $$0 = -1; + break; + } else if ((label | 0) == 16) { + if (($$lcssa69 | 0) > 1) { + $dmax$040 = 0; + $i$242 = 1; + $v1$041 = 0; + while (1) { + $61 = (HEAP32[$marker_info2 + 28 + ($i$242 << 2) >> 2] | 0) - $i$048$lcssa | 0; + $62 = Math_imul($61, $61) | 0; + $65 = (HEAP32[$marker_info2 + 40028 + ($i$242 << 2) >> 2] | 0) - $1 | 0; + $67 = (Math_imul($65, $65) | 0) + $62 | 0; + $68 = ($67 | 0) > ($dmax$040 | 0); + $i$2$v1$0 = $68 ? $i$242 : $v1$041; + $i$242 = $i$242 + 1 | 0; + if (($i$242 | 0) >= ($$lcssa69 | 0)) { + $v1$0$lcssa = $i$2$v1$0; + break; + } else { + $dmax$040 = $68 ? $67 : $dmax$040; + $v1$041 = $i$2$v1$0; + } + } + } else $v1$0$lcssa = 0; + if (($v1$0$lcssa | 0) > 0) { + $i$338 = 0; + do { + HEAP32[$wx + ($i$338 << 2) >> 2] = HEAP32[$marker_info2 + 28 + ($i$338 << 2) >> 2]; + HEAP32[$wy + ($i$338 << 2) >> 2] = HEAP32[$marker_info2 + 40028 + ($i$338 << 2) >> 2]; + $i$338 = $i$338 + 1 | 0; + } while (($i$338 | 0) < ($v1$0$lcssa | 0)); + } + if (($v1$0$lcssa | 0) < ($$lcssa69 | 0)) { + $i$436 = $v1$0$lcssa; + do { + $83 = $i$436 - $v1$0$lcssa | 0; + HEAP32[$marker_info2 + 28 + ($83 << 2) >> 2] = HEAP32[$marker_info2 + 28 + ($i$436 << 2) >> 2]; + HEAP32[$marker_info2 + 40028 + ($83 << 2) >> 2] = HEAP32[$marker_info2 + 40028 + ($i$436 << 2) >> 2]; + $i$436 = $i$436 + 1 | 0; + } while (($i$436 | 0) < (HEAP32[$19 >> 2] | 0)); + } + if (($v1$0$lcssa | 0) > 0) { + $i$535 = 0; + do { + $92 = $i$535 - $v1$0$lcssa | 0; + HEAP32[$marker_info2 + 28 + ((HEAP32[$19 >> 2] | 0) + $92 << 2) >> 2] = HEAP32[$wx + ($i$535 << 2) >> 2]; + HEAP32[$marker_info2 + 40028 + ((HEAP32[$19 >> 2] | 0) + $92 << 2) >> 2] = HEAP32[$wy + ($i$535 << 2) >> 2]; + $i$535 = $i$535 + 1 | 0; + } while (($i$535 | 0) < ($v1$0$lcssa | 0)); + } + HEAP32[$marker_info2 + 28 + (HEAP32[$19 >> 2] << 2) >> 2] = HEAP32[$20 >> 2]; + HEAP32[$marker_info2 + 40028 + (HEAP32[$19 >> 2] << 2) >> 2] = HEAP32[$21 >> 2]; + HEAP32[$19 >> 2] = (HEAP32[$19 >> 2] | 0) + 1; + $$0 = 0; + break; + } else if ((label | 0) == 19) { + _arLog(3, 4354, $vararg_buffer3); + $$0 = -1; + break; + } + } while (0); + if ((label | 0) == 6) { + _arLog(3, 4340, $vararg_buffer); + $$0 = -1; + } + STACKTOP = sp; + return $$0 | 0; +} + +function ___cxa_demangle($mangled_name, $buf, $n, $status) { + $mangled_name = $mangled_name | 0; + $buf = $buf | 0; + $n = $n | 0; + $status = $status | 0; + var $$0 = 0, $$028 = 0, $$1 = 0, $1 = 0, $10 = 0, $101 = 0, $102 = 0, $109 = 0, $11 = 0, $112 = 0, $15 = 0, $17 = 0, $18 = 0, $19 = 0, $2 = 0, $20 = 0, $21 = 0, $22 = 0, $27 = 0, $30 = 0, $31 = 0, $35 = 0, $42 = 0, $43 = 0, $45 = 0, $46 = 0, $49 = 0, $50 = 0, $52 = 0, $53 = 0, $59 = 0, $6 = 0, $60 = 0, $62 = 0, $7 = 0, $70 = 0, $77 = 0, $78 = 0, $79 = 0, $80 = 0, $82 = 0, $83 = 0, $86 = 0, $88 = 0, $89 = 0, $91 = 0, $__v$i$i = 0, $a = 0, $db = 0, $internal_status = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 4208 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $__v$i$i = sp + 4184 | 0; + $a = sp; + $db = sp + 4120 | 0; + $internal_status = sp + 4112 | 0; + if (!$mangled_name) label = 3; else { + $1 = ($buf | 0) != 0; + $2 = ($n | 0) == 0; + if ($1 & $2) label = 3; else { + if ($1) $82 = HEAP32[$n >> 2] | 0; else $82 = 0; + HEAP32[$a + 4096 >> 2] = $a; + $6 = $a; + HEAP32[$db >> 2] = 0; + $7 = $db + 4 | 0; + HEAP32[$7 >> 2] = 0; + HEAP32[$db + 8 >> 2] = 0; + HEAP32[$db + 12 >> 2] = $6; + $10 = $db + 16 | 0; + HEAP32[$10 >> 2] = 0; + $11 = $db + 20 | 0; + HEAP32[$11 >> 2] = 0; + HEAP32[$db + 24 >> 2] = 0; + HEAP32[$db + 28 >> 2] = $6; + HEAP32[$db + 32 >> 2] = 0; + $15 = $db + 36 | 0; + HEAP32[$15 >> 2] = 0; + HEAP32[$db + 40 >> 2] = 0; + $17 = $db + 44 | 0; + HEAP32[$17 >> 2] = $6; + $18 = $db + 48 | 0; + $19 = $db + 61 | 0; + HEAP32[$18 >> 2] = 0; + HEAP32[$18 + 4 >> 2] = 0; + HEAP32[$18 + 8 >> 2] = 0; + HEAP8[$18 + 12 >> 0] = 0; + HEAP8[$19 >> 0] = 1; + $20 = $db + 32 | 0; + __ZNSt3__114__split_bufferINS_6vectorINS1_IN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEENS5_IS7_Lj4096EEEEERNS5_IS9_Lj4096EEEEC2EjjSB_($__v$i$i, 1, 0, $17); + $21 = $__v$i$i + 8 | 0; + $22 = HEAP32[$21 >> 2] | 0; + HEAP32[$22 >> 2] = 0; + HEAP32[$22 + 4 >> 2] = 0; + HEAP32[$22 + 8 >> 2] = 0; + HEAP32[$22 + 12 >> 2] = $6; + HEAP32[$21 >> 2] = $22 + 16; + __ZNSt3__16vectorINS0_INS0_IN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEEENS4_IS6_Lj4096EEEEENS4_IS8_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS8_RS9_EE($20, $__v$i$i); + __ZNSt3__114__split_bufferINS_6vectorINS1_IN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEENS5_IS7_Lj4096EEEEERNS5_IS9_Lj4096EEEED2Ev($__v$i$i); + $27 = $db + 62 | 0; + HEAP8[$27 >> 0] = 0; + HEAP8[$db + 63 >> 0] = 1; + HEAP32[$internal_status >> 2] = 0; + $30 = $mangled_name + (_strlen($mangled_name) | 0) | 0; + __ZN10__cxxabiv112_GLOBAL__N_18demangleINS0_2DbEEEvPKcS4_RT_Ri($mangled_name, $30, $db, $internal_status); + $31 = HEAP32[$internal_status >> 2] | 0; + do if (($31 | 0) != 0 | (HEAP8[$27 >> 0] | 0) == 0) { + $59 = $31; + label = 17; + } else { + $35 = HEAP32[$20 >> 2] | 0; + if (($35 | 0) == (HEAP32[$15 >> 2] | 0)) label = 18; else if ((HEAP32[$35 >> 2] | 0) == (HEAP32[$35 + 4 >> 2] | 0)) label = 18; else { + HEAP8[$27 >> 0] = 0; + HEAP8[$19 >> 0] = 0; + $42 = HEAP32[$db >> 2] | 0; + $43 = HEAP32[$7 >> 2] | 0; + if (($43 | 0) != ($42 | 0)) { + $46 = $43; + do { + $45 = $46 + -24 | 0; + HEAP32[$7 >> 2] = $45; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($45); + $46 = HEAP32[$7 >> 2] | 0; + } while (($46 | 0) != ($42 | 0)); + } + $49 = HEAP32[$10 >> 2] | 0; + $50 = HEAP32[$11 >> 2] | 0; + if (($50 | 0) != ($49 | 0)) { + $53 = $50; + do { + $52 = $53 + -16 | 0; + HEAP32[$11 >> 2] = $52; + __ZNSt3__113__vector_baseIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEED2Ev($52); + $53 = HEAP32[$11 >> 2] | 0; + } while (($53 | 0) != ($49 | 0)); + } + __ZN10__cxxabiv112_GLOBAL__N_18demangleINS0_2DbEEEvPKcS4_RT_Ri($mangled_name, $30, $db, $internal_status); + if (!(HEAP8[$27 >> 0] | 0)) { + $59 = HEAP32[$internal_status >> 2] | 0; + label = 17; + break; + } else { + HEAP32[$internal_status >> 2] = -2; + $$1 = 0; + $112 = -2; + break; + } + } + } while (0); + if ((label | 0) == 17) if (!$59) label = 18; else { + $$1 = 0; + $112 = $59; + } + do if ((label | 0) == 18) { + $60 = HEAP32[$7 >> 2] | 0; + $62 = HEAP8[$60 + -24 >> 0] | 0; + if (!($62 & 1)) $79 = ($62 & 255) >>> 1; else $79 = HEAP32[$60 + -20 >> 2] | 0; + $70 = HEAP8[$60 + -12 >> 0] | 0; + if (!($70 & 1)) $78 = ($70 & 255) >>> 1; else $78 = HEAP32[$60 + -8 >> 2] | 0; + $77 = $78 + $79 | 0; + $80 = $77 + 1 | 0; + if ($80 >>> 0 > $82 >>> 0) { + $83 = _realloc($buf, $80) | 0; + if (!$83) { + HEAP32[$internal_status >> 2] = -1; + $$1 = 0; + $112 = -1; + break; + } + if ($2) $$028 = $83; else { + HEAP32[$n >> 2] = $80; + $$028 = $83; + } + } else if (!$buf) { + $$1 = 0; + $112 = 0; + break; + } else $$028 = $buf; + $86 = HEAP32[$7 >> 2] | 0; + $88 = $86 + -12 | 0; + $89 = HEAP8[$88 >> 0] | 0; + $91 = ($89 & 1) == 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($86 + -24 | 0, $91 ? $88 + 1 | 0 : HEAP32[$86 + -4 >> 2] | 0, $91 ? ($89 & 255) >>> 1 : HEAP32[$86 + -8 >> 2] | 0) | 0; + $101 = HEAP32[$7 >> 2] | 0; + $102 = $101 + -24 | 0; + if (!(HEAP8[$102 >> 0] & 1)) $109 = $102 + 1 | 0; else $109 = HEAP32[$101 + -16 >> 2] | 0; + _memcpy($$028 | 0, $109 | 0, $77 | 0) | 0; + HEAP8[$$028 + $77 >> 0] = 0; + $$1 = $$028; + $112 = 0; + } while (0); + if ($status) HEAP32[$status >> 2] = $112; + __ZN10__cxxabiv112_GLOBAL__N_12DbD2Ev($db); + $$0 = $$1; + } + } + if ((label | 0) == 3) if (!$status) $$0 = 0; else { + HEAP32[$status >> 2] = -3; + $$0 = 0; + } + STACKTOP = sp; + return $$0 | 0; +} + +function _fmod($x, $y) { + $x = +$x; + $y = +$y; + var $$0 = 0.0, $$lcssa7 = 0, $0 = 0, $1 = 0, $10 = 0, $100 = 0, $101 = 0, $102 = 0, $103 = 0, $104 = 0, $106 = 0, $107 = 0, $11 = 0, $112 = 0, $114 = 0, $116 = 0, $119 = 0, $12 = 0, $121 = 0, $126 = 0, $127 = 0, $128 = 0, $129 = 0, $130 = 0, $137 = 0, $138 = 0, $139 = 0, $140 = 0, $141 = 0, $146 = 0, $149 = 0, $150 = 0, $152 = 0, $153 = 0, $154 = 0, $155 = 0, $156 = 0, $16 = 0, $2 = 0, $23 = 0.0, $25 = 0, $26 = 0, $3 = 0, $37 = 0, $38 = 0, $4 = 0, $44 = 0, $45 = 0, $46 = 0, $55 = 0, $6 = 0, $60 = 0, $61 = 0, $67 = 0, $68 = 0, $69 = 0, $7 = 0, $78 = 0, $83 = 0, $84 = 0, $85 = 0, $86 = 0, $87 = 0, $88 = 0, $9 = 0, $93 = 0, $95 = 0, $97 = 0, $ex$0$lcssa = 0, $ex$026 = 0, $ex$1 = 0, $ex$2$lcssa = 0, $ex$212 = 0, $ex$3$lcssa = 0, $ex$39 = 0, $ey$0$lcssa = 0, $ey$020 = 0, $ey$1$ph = 0, label = 0; + HEAPF64[tempDoublePtr >> 3] = $x; + $0 = HEAP32[tempDoublePtr >> 2] | 0; + $1 = HEAP32[tempDoublePtr + 4 >> 2] | 0; + HEAPF64[tempDoublePtr >> 3] = $y; + $2 = HEAP32[tempDoublePtr >> 2] | 0; + $3 = HEAP32[tempDoublePtr + 4 >> 2] | 0; + $4 = _bitshift64Lshr($0 | 0, $1 | 0, 52) | 0; + $6 = $4 & 2047; + $7 = _bitshift64Lshr($2 | 0, $3 | 0, 52) | 0; + $9 = $7 & 2047; + $10 = $1 & -2147483648; + $11 = _bitshift64Shl($2 | 0, $3 | 0, 1) | 0; + $12 = tempRet0; + L1 : do if (($11 | 0) == 0 & ($12 | 0) == 0) label = 3; else { + $16 = $3 & 2147483647; + if ($16 >>> 0 > 2146435072 | ($16 | 0) == 2146435072 & $2 >>> 0 > 0 | ($6 | 0) == 2047) label = 3; else { + $25 = _bitshift64Shl($0 | 0, $1 | 0, 1) | 0; + $26 = tempRet0; + if (!($26 >>> 0 > $12 >>> 0 | ($26 | 0) == ($12 | 0) & $25 >>> 0 > $11 >>> 0)) return +(($25 | 0) == ($11 | 0) & ($26 | 0) == ($12 | 0) ? $x * 0.0 : $x); + if (!$6) { + $37 = _bitshift64Shl($0 | 0, $1 | 0, 12) | 0; + $38 = tempRet0; + if (($38 | 0) > -1 | ($38 | 0) == -1 & $37 >>> 0 > 4294967295) { + $45 = $37; + $46 = $38; + $ex$026 = 0; + while (1) { + $44 = $ex$026 + -1 | 0; + $45 = _bitshift64Shl($45 | 0, $46 | 0, 1) | 0; + $46 = tempRet0; + if (!(($46 | 0) > -1 | ($46 | 0) == -1 & $45 >>> 0 > 4294967295)) { + $ex$0$lcssa = $44; + break; + } else $ex$026 = $44; + } + } else $ex$0$lcssa = 0; + $55 = _bitshift64Shl($0 | 0, $1 | 0, 1 - $ex$0$lcssa | 0) | 0; + $83 = $55; + $84 = tempRet0; + $ex$1 = $ex$0$lcssa; + } else { + $83 = $0; + $84 = $1 & 1048575 | 1048576; + $ex$1 = $6; + } + if (!$9) { + $60 = _bitshift64Shl($2 | 0, $3 | 0, 12) | 0; + $61 = tempRet0; + if (($61 | 0) > -1 | ($61 | 0) == -1 & $60 >>> 0 > 4294967295) { + $68 = $60; + $69 = $61; + $ey$020 = 0; + while (1) { + $67 = $ey$020 + -1 | 0; + $68 = _bitshift64Shl($68 | 0, $69 | 0, 1) | 0; + $69 = tempRet0; + if (!(($69 | 0) > -1 | ($69 | 0) == -1 & $68 >>> 0 > 4294967295)) { + $ey$0$lcssa = $67; + break; + } else $ey$020 = $67; + } + } else $ey$0$lcssa = 0; + $78 = _bitshift64Shl($2 | 0, $3 | 0, 1 - $ey$0$lcssa | 0) | 0; + $85 = $78; + $86 = tempRet0; + $ey$1$ph = $ey$0$lcssa; + } else { + $85 = $2; + $86 = $3 & 1048575 | 1048576; + $ey$1$ph = $9; + } + $87 = _i64Subtract($83 | 0, $84 | 0, $85 | 0, $86 | 0) | 0; + $88 = tempRet0; + $93 = ($88 | 0) > -1 | ($88 | 0) == -1 & $87 >>> 0 > 4294967295; + L23 : do if (($ex$1 | 0) > ($ey$1$ph | 0)) { + $152 = $93; + $153 = $87; + $154 = $88; + $95 = $83; + $97 = $84; + $ex$212 = $ex$1; + while (1) { + if ($152) if (($95 | 0) == ($85 | 0) & ($97 | 0) == ($86 | 0)) break; else { + $100 = $153; + $101 = $154; + } else { + $100 = $95; + $101 = $97; + } + $102 = _bitshift64Shl($100 | 0, $101 | 0, 1) | 0; + $103 = tempRet0; + $104 = $ex$212 + -1 | 0; + $106 = _i64Subtract($102 | 0, $103 | 0, $85 | 0, $86 | 0) | 0; + $107 = tempRet0; + $112 = ($107 | 0) > -1 | ($107 | 0) == -1 & $106 >>> 0 > 4294967295; + if (($104 | 0) > ($ey$1$ph | 0)) { + $152 = $112; + $153 = $106; + $154 = $107; + $95 = $102; + $97 = $103; + $ex$212 = $104; + } else { + $$lcssa7 = $112; + $114 = $102; + $116 = $103; + $155 = $106; + $156 = $107; + $ex$2$lcssa = $104; + break L23; + } + } + $$0 = $x * 0.0; + break L1; + } else { + $$lcssa7 = $93; + $114 = $83; + $116 = $84; + $155 = $87; + $156 = $88; + $ex$2$lcssa = $ex$1; + } while (0); + if ($$lcssa7) if (($114 | 0) == ($85 | 0) & ($116 | 0) == ($86 | 0)) { + $$0 = $x * 0.0; + break; + } else { + $119 = $156; + $121 = $155; + } else { + $119 = $116; + $121 = $114; + } + if ($119 >>> 0 < 1048576 | ($119 | 0) == 1048576 & $121 >>> 0 < 0) { + $126 = $121; + $127 = $119; + $ex$39 = $ex$2$lcssa; + while (1) { + $128 = _bitshift64Shl($126 | 0, $127 | 0, 1) | 0; + $129 = tempRet0; + $130 = $ex$39 + -1 | 0; + if ($129 >>> 0 < 1048576 | ($129 | 0) == 1048576 & $128 >>> 0 < 0) { + $126 = $128; + $127 = $129; + $ex$39 = $130; + } else { + $137 = $128; + $138 = $129; + $ex$3$lcssa = $130; + break; + } + } + } else { + $137 = $121; + $138 = $119; + $ex$3$lcssa = $ex$2$lcssa; + } + if (($ex$3$lcssa | 0) > 0) { + $139 = _i64Add($137 | 0, $138 | 0, 0, -1048576) | 0; + $140 = tempRet0; + $141 = _bitshift64Shl($ex$3$lcssa | 0, 0, 52) | 0; + $149 = $140 | tempRet0; + $150 = $139 | $141; + } else { + $146 = _bitshift64Lshr($137 | 0, $138 | 0, 1 - $ex$3$lcssa | 0) | 0; + $149 = tempRet0; + $150 = $146; + } + HEAP32[tempDoublePtr >> 2] = $150; + HEAP32[tempDoublePtr + 4 >> 2] = $149 | $10; + $$0 = +HEAPF64[tempDoublePtr >> 3]; + } + } while (0); + if ((label | 0) == 3) { + $23 = $x * $y; + $$0 = $23 / $23; + } + return +$$0; +} + +function __ZN46EmscriptenBindingInitializer_constant_bindingsC2Ev($this) { + $this = $this | 0; + var $0 = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $0 = sp; + __ZN10emscripten8functionIiJiiiEJEEEvPKcPFT_DpT0_EDpT1_(8590, 7); + __ZN10emscripten8functionIiJiEJEEEvPKcPFT_DpT0_EDpT1_(8596, 3); + __ZN10emscripten8functionIiJiNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEJEEEvPKcPFT_DpT0_EDpT1_(8605, 2); + __ZN10emscripten8functionIiJiNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEJEEEvPKcPFT_DpT0_EDpT1_(8616, 3); + __ZN10emscripten8functionIiJiiEJEEEvPKcPFT_DpT0_EDpT1_(8632, 4); + __ZN10emscripten8functionIiJiEJEEEvPKcPFT_DpT0_EDpT1_(8650, 4); + __ZN10emscripten8functionIiJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEJEEEvPKcPFT_DpT0_EDpT1_(8670, 5); + __ZN10emscripten8functionIiJiiiEJEEEvPKcPFT_DpT0_EDpT1_(8682, 8); + __ZN10emscripten8functionIiJiiEJEEEvPKcPFT_DpT0_EDpT1_(8699, 5); + __ZN10emscripten8functionIiJiiiEJEEEvPKcPFT_DpT0_EDpT1_(8719, 9); + __ZN10emscripten8functionIiJiiiEJEEEvPKcPFT_DpT0_EDpT1_(8737, 10); + __ZN10emscripten8functionIiJiiEJEEEvPKcPFT_DpT0_EDpT1_(8759, 6); + __ZN10emscripten8functionIiJiiEJEEEvPKcPFT_DpT0_EDpT1_(8782, 7); + __ZN10emscripten8functionIiJiEJEEEvPKcPFT_DpT0_EDpT1_(8811, 6); + __ZN10emscripten8functionIiJiEJEEEvPKcPFT_DpT0_EDpT1_(8824, 7); + __ZN10emscripten8functionIiJiiiEJEEEvPKcPFT_DpT0_EDpT1_(8837, 11); + __ZN10emscripten8functionIiJiiEJEEEvPKcPFT_DpT0_EDpT1_(8856, 8); + __ZN10emscripten8functionIiJiiEJEEEvPKcPFT_DpT0_EDpT1_(8866, 9); + __ZN10emscripten8functionIiJiEJEEEvPKcPFT_DpT0_EDpT1_(8879, 8); + __ZN10emscripten8functionIiJiEJEEEvPKcPFT_DpT0_EDpT1_(8892, 9); + __ZN10emscripten8functionIvJiEJEEEvPKcPFT_DpT0_EDpT1_(8911, 10); + __ZN10emscripten8functionIiJEJEEEvPKcPFT_DpT0_EDpT1_(8923, 1); + __ZN10emscripten8functionIvJidEJEEEvPKcPFT_DpT0_EDpT1_(8935, 1); + __ZN10emscripten8functionIdJiEJEEEvPKcPFT_DpT0_EDpT1_(8958, 1); + __ZN10emscripten8functionIvJidEJEEEvPKcPFT_DpT0_EDpT1_(8981, 2); + __ZN10emscripten8functionIdJiEJEEEvPKcPFT_DpT0_EDpT1_(9003, 2); + __ZN10emscripten8functionIvJiiEJEEEvPKcPFT_DpT0_EDpT1_(9025, 1); + __ZN10emscripten8functionIiJiEJEEEvPKcPFT_DpT0_EDpT1_(9042, 10); + __ZN10emscripten8functionIvJiiEJEEEvPKcPFT_DpT0_EDpT1_(9059, 2); + __ZN10emscripten8functionIiJiEJEEEvPKcPFT_DpT0_EDpT1_(9072, 11); + __ZN10emscripten8functionIvJiiEJEEEvPKcPFT_DpT0_EDpT1_(9085, 3); + __ZN10emscripten8functionIiJiEJEEEvPKcPFT_DpT0_EDpT1_(9109, 12); + __ZN10emscripten8functionIvJifEJEEEvPKcPFT_DpT0_EDpT1_(9133, 3); + __ZN10emscripten8functionIdJiEJEEEvPKcPFT_DpT0_EDpT1_(9146, 3); + __ZN10emscripten8functionIvJiiEJEEEvPKcPFT_DpT0_EDpT1_(9159, 4); + __ZN10emscripten8functionIiJiEJEEEvPKcPFT_DpT0_EDpT1_(9177, 13); + __ZN10emscripten8functionIvJiiEJEEEvPKcPFT_DpT0_EDpT1_(9195, 5); + __ZN10emscripten8functionIiJiEJEEEvPKcPFT_DpT0_EDpT1_(9211, 14); + __ZN10emscripten8functionIvJiiEJEEEvPKcPFT_DpT0_EDpT1_(9227, 6); + __ZN10emscripten8functionIiJiEJEEEvPKcPFT_DpT0_EDpT1_(9244, 15); + __ZN10emscripten8constantIiEEvPKcRKT_(9261, 2088); + __ZN10emscripten8constantIiEEvPKcRKT_(9290, 2096); + __ZN10emscripten8constantIiEEvPKcRKT_(9318, 2092); + __embind_register_constant(9351, 680, 0); + __embind_register_constant(9368, 680, 1); + __embind_register_constant(9384, 680, 0); + __embind_register_constant(9406, 680, 0); + __embind_register_constant(9431, 680, 1); + __embind_register_constant(9456, 680, 1); + __embind_register_constant(9481, 680, 100); + __embind_register_constant(9508, 680, 0); + __embind_register_constant(9534, 680, 1); + __embind_register_constant(9560, 680, 0); + __embind_register_constant(9587, 680, 0); + __embind_register_constant(9614, 680, 1); + __embind_register_constant(9640, 680, 2); + __embind_register_constant(9665, 680, 3); + __embind_register_constant(9703, 680, 4); + __embind_register_constant(9740, 680, 0); + __embind_register_constant(9774, 680, 0); + __embind_register_constant(9798, 680, 1); + __embind_register_constant(9824, 680, 2); + __embind_register_constant(9851, 680, 2); + __embind_register_constant(9885, 680, 5); + HEAPF64[$0 >> 3] = .5; + __ZN10emscripten8constantIdEEvPKcRKT_(9903, $0); + __embind_register_constant(9924, 680, 0); + __embind_register_constant(9943, 680, 1); + __embind_register_constant(9961, 680, 2); + __embind_register_constant(9979, 680, 3); + __embind_register_constant(9998, 680, 4); + __embind_register_constant(10020, 680, 3); + __embind_register_constant(10039, 680, 515); + __embind_register_constant(10068, 680, 259); + __embind_register_constant(10096, 680, 4); + __embind_register_constant(10115, 680, 772); + __embind_register_constant(10145, 680, 1028); + __embind_register_constant(10175, 680, 0); + __embind_register_constant(10206, 680, 1); + __embind_register_constant(10242, 680, 2); + __embind_register_constant(10276, 680, 3); + __embind_register_constant(10314, 680, 0); + __embind_register_constant(10347, 680, 1); + __embind_register_constant(10394, 680, 2); + __embind_register_constant(10436, 680, 3); + __embind_register_constant(10479, 680, 4); + __embind_register_constant(10531, 680, 5); + __embind_register_constant(10582, 680, 6); + __embind_register_constant(10627, 680, 7); + __embind_register_constant(10666, 680, 8); + __embind_register_constant(10711, 680, 9); + STACKTOP = sp; + return; +} + +function _arParamDecompMat($source, $cpara, $trans) { + $source = $source | 0; + $cpara = $cpara | 0; + $trans = $trans | 0; + var $102 = 0, $105 = 0, $109 = 0.0, $111 = 0.0, $113 = 0.0, $118 = 0.0, $119 = 0, $127 = 0.0, $128 = 0, $134 = 0.0, $140 = 0.0, $146 = 0.0, $152 = 0.0, $163 = 0.0, $167 = 0.0, $181 = 0, $185 = 0, $189 = 0, $45 = 0.0, $47 = 0.0, $49 = 0.0, $55 = 0.0, $56 = 0, $57 = 0.0, $58 = 0, $60 = 0.0, $61 = 0, $63 = 0.0, $64 = 0, $69 = 0, $71 = 0.0, $73 = 0.0, $75 = 0.0, $80 = 0.0, $81 = 0, $84 = 0.0, $87 = 0.0, $90 = 0.0, $96 = 0.0, $97 = 0, $99 = 0, $Cpara = 0, $r$024 = 0, $r$122 = 0, $r$318 = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 96 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $Cpara = sp; + if (!(+HEAPF64[$source + 88 >> 3] >= 0.0)) { + $r$122 = 0; + do { + HEAPF64[$Cpara + ($r$122 << 5) >> 3] = -+HEAPF64[$source + ($r$122 << 5) >> 3]; + HEAPF64[$Cpara + ($r$122 << 5) + 8 >> 3] = -+HEAPF64[$source + ($r$122 << 5) + 8 >> 3]; + HEAPF64[$Cpara + ($r$122 << 5) + 16 >> 3] = -+HEAPF64[$source + ($r$122 << 5) + 16 >> 3]; + HEAPF64[$Cpara + ($r$122 << 5) + 24 >> 3] = -+HEAPF64[$source + ($r$122 << 5) + 24 >> 3]; + $r$122 = $r$122 + 1 | 0; + } while (($r$122 | 0) != 3); + } else { + $r$024 = 0; + do { + HEAPF64[$Cpara + ($r$024 << 5) >> 3] = +HEAPF64[$source + ($r$024 << 5) >> 3]; + HEAPF64[$Cpara + ($r$024 << 5) + 8 >> 3] = +HEAPF64[$source + ($r$024 << 5) + 8 >> 3]; + HEAPF64[$Cpara + ($r$024 << 5) + 16 >> 3] = +HEAPF64[$source + ($r$024 << 5) + 16 >> 3]; + HEAPF64[$Cpara + ($r$024 << 5) + 24 >> 3] = +HEAPF64[$source + ($r$024 << 5) + 24 >> 3]; + $r$024 = $r$024 + 1 | 0; + } while (($r$024 | 0) != 3); + } + HEAPF64[$cpara >> 3] = 0.0; + HEAPF64[$cpara + 8 >> 3] = 0.0; + HEAPF64[$cpara + 16 >> 3] = 0.0; + HEAPF64[$cpara + 24 >> 3] = 0.0; + HEAPF64[$cpara + 32 >> 3] = 0.0; + HEAPF64[$cpara + 40 >> 3] = 0.0; + HEAPF64[$cpara + 48 >> 3] = 0.0; + HEAPF64[$cpara + 56 >> 3] = 0.0; + HEAPF64[$cpara + 64 >> 3] = 0.0; + HEAPF64[$cpara + 72 >> 3] = 0.0; + HEAPF64[$cpara + 80 >> 3] = 0.0; + HEAPF64[$cpara + 88 >> 3] = 0.0; + $45 = +HEAPF64[$Cpara + 64 >> 3]; + $47 = +HEAPF64[$Cpara + 72 >> 3]; + $49 = +HEAPF64[$Cpara + 80 >> 3]; + $55 = +Math_sqrt(+($45 * $45 + $47 * $47 + $49 * $49)); + $56 = $cpara + 80 | 0; + HEAPF64[$56 >> 3] = $55; + $57 = $45 / $55; + $58 = $trans + 64 | 0; + HEAPF64[$58 >> 3] = $57; + $60 = $47 / +HEAPF64[$56 >> 3]; + $61 = $trans + 72 | 0; + HEAPF64[$61 >> 3] = $60; + $63 = $49 / +HEAPF64[$56 >> 3]; + $64 = $trans + 80 | 0; + HEAPF64[$64 >> 3] = $63; + $69 = $trans + 88 | 0; + HEAPF64[$69 >> 3] = +HEAPF64[$Cpara + 88 >> 3] / +HEAPF64[$56 >> 3]; + $71 = +HEAPF64[$Cpara + 32 >> 3]; + $73 = +HEAPF64[$Cpara + 40 >> 3]; + $75 = +HEAPF64[$Cpara + 48 >> 3]; + $80 = $57 * $71 + $60 * $73 + $63 * $75; + $81 = $cpara + 48 | 0; + HEAPF64[$81 >> 3] = $80; + $84 = $71 - $80 * +HEAPF64[$58 >> 3]; + $87 = $73 - $80 * +HEAPF64[$61 >> 3]; + $90 = $75 - $80 * +HEAPF64[$64 >> 3]; + $96 = +Math_sqrt(+($84 * $84 + $87 * $87 + $90 * $90)); + $97 = $cpara + 40 | 0; + HEAPF64[$97 >> 3] = $96; + $99 = $trans + 32 | 0; + HEAPF64[$99 >> 3] = $84 / $96; + $102 = $trans + 40 | 0; + HEAPF64[$102 >> 3] = $87 / +HEAPF64[$97 >> 3]; + $105 = $trans + 48 | 0; + HEAPF64[$105 >> 3] = $90 / +HEAPF64[$97 >> 3]; + $109 = +HEAPF64[$Cpara >> 3]; + $111 = +HEAPF64[$Cpara + 8 >> 3]; + $113 = +HEAPF64[$Cpara + 16 >> 3]; + $118 = +HEAPF64[$58 >> 3] * $109 + +HEAPF64[$61 >> 3] * $111 + +HEAPF64[$64 >> 3] * $113; + $119 = $cpara + 16 | 0; + HEAPF64[$119 >> 3] = $118; + $127 = +HEAPF64[$99 >> 3] * $109 + +HEAPF64[$102 >> 3] * $111 + +HEAPF64[$105 >> 3] * $113; + $128 = $cpara + 8 | 0; + HEAPF64[$128 >> 3] = $127; + $134 = $109 - $127 * +HEAPF64[$99 >> 3] - $118 * +HEAPF64[$58 >> 3]; + $140 = $111 - $127 * +HEAPF64[$102 >> 3] - $118 * +HEAPF64[$61 >> 3]; + $146 = $113 - $127 * +HEAPF64[$105 >> 3] - $118 * +HEAPF64[$64 >> 3]; + $152 = +Math_sqrt(+($134 * $134 + $140 * $140 + $146 * $146)); + HEAPF64[$cpara >> 3] = $152; + HEAPF64[$trans >> 3] = $134 / $152; + HEAPF64[$trans + 8 >> 3] = $140 / +HEAPF64[$cpara >> 3]; + HEAPF64[$trans + 16 >> 3] = $146 / +HEAPF64[$cpara >> 3]; + $163 = +HEAPF64[$69 >> 3]; + $167 = (+HEAPF64[$Cpara + 56 >> 3] - +HEAPF64[$81 >> 3] * $163) / +HEAPF64[$97 >> 3]; + HEAPF64[$trans + 56 >> 3] = $167; + HEAPF64[$trans + 24 >> 3] = (+HEAPF64[$Cpara + 24 >> 3] - $167 * +HEAPF64[$128 >> 3] - +HEAPF64[$119 >> 3] * $163) / +HEAPF64[$cpara >> 3]; + $r$318 = 0; + do { + $181 = $cpara + ($r$318 << 5) | 0; + HEAPF64[$181 >> 3] = +HEAPF64[$181 >> 3] / +HEAPF64[$56 >> 3]; + $185 = $cpara + ($r$318 << 5) + 8 | 0; + HEAPF64[$185 >> 3] = +HEAPF64[$185 >> 3] / +HEAPF64[$56 >> 3]; + $189 = $cpara + ($r$318 << 5) + 16 | 0; + HEAPF64[$189 >> 3] = +HEAPF64[$189 >> 3] / +HEAPF64[$56 >> 3]; + $r$318 = $r$318 + 1 | 0; + } while (($r$318 | 0) != 3); + STACKTOP = sp; + return 0; +} + +function __ZN10__cxxabiv112_GLOBAL__N_19base_nameINSt3__112basic_stringIcNS2_11char_traitsIcEENS0_12malloc_allocIcEEEEEET_RS9_($agg$result, $s) { + $agg$result = $agg$result | 0; + $s = $s | 0; + var $$$$i$i$i3 = 0, $$0$i$i27 = 0, $$lcssa = 0, $$lcssa32 = 0, $$lcssa33 = 0, $0 = 0, $12 = 0, $13 = 0, $15 = 0, $2 = 0, $20 = 0, $21 = 0, $22 = 0, $27 = 0, $31 = 0, $33 = 0, $38 = 0, $42 = 0, $46 = 0, $48 = 0, $56 = 0, $63 = 0, $64 = 0, $7 = 0, $__p$0$i$i26 = 0, $__p$0$ph$i$i = 0, $c$0$ph = 0, $p0$0 = 0, $p0$1 = 0, $pe$0 = 0, $pe$0$ph = 0, $pe$1 = 0, $pe$1$pn = 0, label = 0; + $0 = HEAP8[$s >> 0] | 0; + $2 = ($0 & 1) == 0; + $7 = $2 ? ($0 & 255) >>> 1 : HEAP32[$s + 4 >> 2] | 0; + L1 : do if (!$7) __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEC2ERKS7_($agg$result, $s); else { + $12 = $2 ? $s + 1 | 0 : HEAP32[$s + 8 >> 2] | 0; + $13 = $7 >>> 0 > 11; + $15 = _memcmp($12, 12846, $13 ? 11 : $7) | 0; + if (!((($15 | 0) == 0 ? ($7 >>> 0 < 11 ? -1 : $13 & 1) : $15) | 0)) { + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6assignEPKcj($s, 13450, 70); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($agg$result, 13521, 12); + break; + } + $20 = $7 >>> 0 > 12; + $21 = $20 ? 12 : $7; + $22 = _memcmp($12, 12858, $21) | 0; + $$$$i$i$i3 = $7 >>> 0 < 12 ? -1 : $20 & 1; + if (!((($22 | 0) == 0 ? $$$$i$i$i3 : $22) | 0)) { + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6assignEPKcj($s, 13534, 49); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($agg$result, 13584, 13); + break; + } + $27 = _memcmp($12, 12871, $21) | 0; + if (!((($27 | 0) == 0 ? $$$$i$i$i3 : $27) | 0)) { + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6assignEPKcj($s, 13598, 49); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($agg$result, 13648, 13); + break; + } + $31 = $7 >>> 0 > 13; + $33 = _memcmp($12, 12884, $31 ? 13 : $7) | 0; + if (!((($33 | 0) == 0 ? ($7 >>> 0 < 13 ? -1 : $31 & 1) : $33) | 0)) { + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6assignEPKcj($s, 13662, 50); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($agg$result, 13713, 14); + break; + } + $38 = $12 + $7 | 0; + L16 : do if ((HEAP8[$12 + ($7 + -1) >> 0] | 0) == 62) { + $c$0$ph = 1; + $pe$0$ph = $38; + L17 : while (1) { + $pe$0 = $pe$0$ph; + L19 : while (1) { + $42 = $pe$0 + -1 | 0; + if (($42 | 0) == ($12 | 0)) break L17; + $46 = $pe$0 + -2 | 0; + switch (HEAP8[$46 >> 0] | 0) { + case 60: + { + $$lcssa = $46; + $$lcssa32 = $42; + label = 16; + break L19; + break; + } + case 62: + { + $$lcssa33 = $42; + label = 17; + break L19; + break; + } + default: + $pe$0 = $42; + } + } + if ((label | 0) == 16) { + label = 0; + $48 = $c$0$ph + -1 | 0; + if (!$48) { + $pe$1 = $$lcssa; + break L16; + } else { + $c$0$ph = $48; + $pe$0$ph = $$lcssa32; + continue; + } + } else if ((label | 0) == 17) { + label = 0; + $c$0$ph = $c$0$ph + 1 | 0; + $pe$0$ph = $$lcssa33; + continue; + } + } + HEAP32[$agg$result >> 2] = 0; + HEAP32[$agg$result + 4 >> 2] = 0; + HEAP32[$agg$result + 8 >> 2] = 0; + break L1; + } else $pe$1 = $38; while (0); + $pe$1$pn = $pe$1; + while (1) { + $p0$0 = $pe$1$pn + -1 | 0; + if (($p0$0 | 0) == ($12 | 0)) { + $p0$1 = $12; + break; + } + if ((HEAP8[$p0$0 >> 0] | 0) == 58) { + $p0$1 = $pe$1$pn; + break; + } else $pe$1$pn = $p0$0; + } + $56 = $pe$1 - $p0$1 | 0; + if ($56 >>> 0 > 4294967279) __ZNKSt3__121__basic_string_commonILb1EE20__throw_length_errorEv($agg$result); + if ($56 >>> 0 < 11) { + HEAP8[$agg$result >> 0] = $56 << 1; + $__p$0$ph$i$i = $agg$result + 1 | 0; + } else { + $63 = $56 + 16 & -16; + $64 = _malloc($63) | 0; + HEAP32[$agg$result + 8 >> 2] = $64; + HEAP32[$agg$result >> 2] = $63 | 1; + HEAP32[$agg$result + 4 >> 2] = $56; + $__p$0$ph$i$i = $64; + } + if (($p0$1 | 0) != ($pe$1 | 0)) { + $$0$i$i27 = $p0$1; + $__p$0$i$i26 = $__p$0$ph$i$i; + while (1) { + HEAP8[$__p$0$i$i26 >> 0] = HEAP8[$$0$i$i27 >> 0] | 0; + $$0$i$i27 = $$0$i$i27 + 1 | 0; + if (($$0$i$i27 | 0) == ($pe$1 | 0)) break; else $__p$0$i$i26 = $__p$0$i$i26 + 1 | 0; + } + } + HEAP8[$__p$0$ph$i$i + $56 >> 0] = 0; + } while (0); + return; +} + +function _trinkle($head, $width, $cmp, $pp, $pshift, $trusty, $lp) { + $head = $head | 0; + $width = $width | 0; + $cmp = $cmp | 0; + $pp = $pp | 0; + $pshift = $pshift | 0; + $trusty = $trusty | 0; + $lp = $lp | 0; + var $$0$i = 0, $$0$lcssa = 0, $$0$lcssa49 = 0, $$01162 = 0, $$01162$phi = 0, $$02$i$i = 0, $$02$i3$i = 0, $$02$lcssa = 0, $$02$lcssa51 = 0, $$02964 = 0, $$03$lcssa = 0, $$03865 = 0, $$lcssa = 0, $$lcssa75 = 0, $0 = 0, $10 = 0, $17 = 0, $18 = 0, $2 = 0, $24 = 0, $26 = 0, $27 = 0, $3 = 0, $31 = 0, $37 = 0, $40 = 0, $47 = 0, $49 = 0, $51 = 0, $54 = 0, $57 = 0, $58 = 0, $65 = 0, $ar = 0, $i$0$lcssa = 0, $i$0$lcssa50 = 0, $i$01063 = 0, $nTrailingZeros$03$i$i = 0, $nTrailingZeros$03$i2$i = 0, $nTrailingZeros$03$i2$i$lcssa = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 240 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $ar = sp; + $0 = HEAP32[$pp >> 2] | 0; + $2 = HEAP32[$pp + 4 >> 2] | 0; + HEAP32[$ar >> 2] = $head; + $3 = 0 - $width | 0; + L1 : do if (($2 | 0) != 0 | ($0 | 0) != 1) { + $10 = $head + (0 - (HEAP32[$lp + ($pshift << 2) >> 2] | 0)) | 0; + if ((FUNCTION_TABLE_iii[$cmp & 15]($10, $head) | 0) < 1) { + $$0$lcssa = $head; + $$02$lcssa = $pshift; + $$03$lcssa = $trusty; + $i$0$lcssa = 1; + label = 19; + } else { + $$01162 = $head; + $$02964 = $pshift; + $$03865 = ($trusty | 0) == 0; + $18 = $10; + $27 = $0; + $37 = $2; + $i$01063 = 1; + while (1) { + if ($$03865 & ($$02964 | 0) > 1) { + $17 = HEAP32[$lp + ($$02964 + -2 << 2) >> 2] | 0; + if ((FUNCTION_TABLE_iii[$cmp & 15]($$01162 + $3 | 0, $18) | 0) > -1) { + $$0$lcssa49 = $$01162; + $$02$lcssa51 = $$02964; + $i$0$lcssa50 = $i$01063; + label = 20; + break L1; + } + if ((FUNCTION_TABLE_iii[$cmp & 15]($$01162 + (0 - ($17 + $width)) | 0, $18) | 0) > -1) { + $$0$lcssa49 = $$01162; + $$02$lcssa51 = $$02964; + $i$0$lcssa50 = $i$01063; + label = 20; + break L1; + } + } + $24 = $i$01063 + 1 | 0; + HEAP32[$ar + ($i$01063 << 2) >> 2] = $18; + $26 = $27 + -1 | 0; + do if (!$26) { + $49 = 32; + label = 16; + } else { + if (!($26 & 1)) { + $$02$i$i = $26; + $nTrailingZeros$03$i$i = 0; + while (1) { + $31 = $nTrailingZeros$03$i$i + 1 | 0; + $$02$i$i = $$02$i$i >>> 1; + if ($$02$i$i & 1) { + $$lcssa = $31; + break; + } else $nTrailingZeros$03$i$i = $31; + } + if (!$$lcssa) label = 11; else $47 = $$lcssa; + } else label = 11; + if ((label | 0) == 11) { + label = 0; + if (!$37) { + $49 = 64; + label = 16; + break; + } + if (!($37 & 1)) { + $$02$i3$i = $37; + $nTrailingZeros$03$i2$i = 0; + } else { + $$0$i = 0; + $51 = $27; + $54 = $37; + $58 = 0; + break; + } + while (1) { + $40 = $nTrailingZeros$03$i2$i + 1 | 0; + $$02$i3$i = $$02$i3$i >>> 1; + if ($$02$i3$i & 1) { + $$lcssa75 = $40; + $nTrailingZeros$03$i2$i$lcssa = $nTrailingZeros$03$i2$i; + break; + } else $nTrailingZeros$03$i2$i = $40; + } + if (!$$lcssa75) { + $$0$i = 0; + $51 = $27; + $54 = $37; + $58 = 0; + break; + } else $47 = $nTrailingZeros$03$i2$i$lcssa + 33 | 0; + } + if ($47 >>> 0 > 31) { + $49 = $47; + label = 16; + } else { + $$0$i = $47; + $51 = $27; + $54 = $37; + $58 = $47; + } + } while (0); + if ((label | 0) == 16) { + label = 0; + $$0$i = $49 + -32 | 0; + $51 = $37; + $54 = 0; + $58 = $49; + } + $27 = $54 << 32 - $$0$i | $51 >>> $$0$i; + $37 = $54 >>> $$0$i; + $57 = $58 + $$02964 | 0; + if (!(($37 | 0) != 0 | ($27 | 0) != 1)) { + $$0$lcssa49 = $18; + $$02$lcssa51 = $57; + $i$0$lcssa50 = $24; + label = 20; + break L1; + } + $65 = $18 + (0 - (HEAP32[$lp + ($57 << 2) >> 2] | 0)) | 0; + if ((FUNCTION_TABLE_iii[$cmp & 15]($65, HEAP32[$ar >> 2] | 0) | 0) < 1) { + $$0$lcssa = $18; + $$02$lcssa = $57; + $$03$lcssa = 0; + $i$0$lcssa = $24; + label = 19; + break; + } else { + $$01162$phi = $18; + $$02964 = $57; + $$03865 = 1; + $18 = $65; + $i$01063 = $24; + $$01162 = $$01162$phi; + } + } + } + } else { + $$0$lcssa = $head; + $$02$lcssa = $pshift; + $$03$lcssa = $trusty; + $i$0$lcssa = 1; + label = 19; + } while (0); + if ((label | 0) == 19) if (!$$03$lcssa) { + $$0$lcssa49 = $$0$lcssa; + $$02$lcssa51 = $$02$lcssa; + $i$0$lcssa50 = $i$0$lcssa; + label = 20; + } + if ((label | 0) == 20) { + _cycle($width, $ar, $i$0$lcssa50); + _sift($$0$lcssa49, $width, $cmp, $$02$lcssa51, $lp); + } + STACKTOP = sp; + return; +} + +function _arMatrixPCA($input, $evec, $ev, $mean) { + $input = $input | 0; + $evec = $evec | 0; + $ev = $ev | 0; + $mean = $mean | 0; + var $$0 = 0, $1 = 0, $14 = 0, $17 = 0, $20 = 0, $23 = 0.0, $25 = 0, $27 = 0, $3 = 0, $32 = 0, $35 = 0, $36 = 0.0, $37 = 0, $46 = 0, $5 = 0, $52 = 0, $53 = 0, $65 = 0, $70 = 0, $71 = 0, $73 = 0, $75 = 0, $78 = 0.0, $81 = 0, $exitcond3$i29 = 0, $i$0$i322 = 0, $i$0$i42 = 0, $i$015 = 0, $i$1$i38 = 0, $i$113 = 0, $i$2$i26 = 0, $i$211 = 0, $j$0$i32 = 0, $j$0$i619 = 0, $m$0$i221 = 0, $m$0$i37 = 0, $m$1$i31 = 0, $m$1$i518 = 0, $smax$i = 0, $sum$0$lcssa = 0.0, $sum$012 = 0.0, $v$0$i30 = 0, $v$0$i417 = 0; + $1 = HEAP32[$input + 4 >> 2] | 0; + $3 = HEAP32[$input + 8 >> 2] | 0; + $5 = ($1 | 0) < ($3 | 0) ? $1 : $3; + L1 : do if (($1 | 0) < 2 | ($3 | 0) < 2) $$0 = -1; else if ((HEAP32[$evec + 8 >> 2] | 0) == ($3 | 0)) if ((HEAP32[$evec + 4 >> 2] | 0) == ($5 | 0)) { + $14 = $ev + 4 | 0; + if ((HEAP32[$14 >> 2] | 0) == ($5 | 0)) { + $17 = $mean + 4 | 0; + if ((HEAP32[$17 >> 2] | 0) == ($3 | 0)) { + $20 = _arMatrixAllocDup($input) | 0; + if (!$20) $$0 = -1; else { + $23 = +Math_sqrt(+(+($1 | 0))); + $25 = HEAP32[$20 + 4 >> 2] | 0; + $27 = HEAP32[$20 + 8 >> 2] | 0; + if (!(($25 | 0) < 1 | ($27 | 0) < 1)) if ((HEAP32[$17 >> 2] | 0) == ($27 | 0)) { + if ($27) { + $32 = HEAP32[$mean >> 2] | 0; + $i$0$i42 = 0; + do { + HEAPF64[$32 + ($i$0$i42 << 3) >> 3] = 0.0; + $i$0$i42 = $i$0$i42 + 1 | 0; + } while (($i$0$i42 | 0) != ($27 | 0)); + } + $35 = HEAP32[$20 >> 2] | 0; + if ($25) { + $exitcond3$i29 = ($27 | 0) == 0; + $i$1$i38 = 0; + $m$0$i37 = $35; + while (1) { + if (!$exitcond3$i29) { + $j$0$i32 = 0; + $m$1$i31 = $m$0$i37; + $v$0$i30 = HEAP32[$mean >> 2] | 0; + while (1) { + HEAPF64[$v$0$i30 >> 3] = +HEAPF64[$m$1$i31 >> 3] + +HEAPF64[$v$0$i30 >> 3]; + $j$0$i32 = $j$0$i32 + 1 | 0; + if (($j$0$i32 | 0) == ($27 | 0)) break; else { + $m$1$i31 = $m$1$i31 + 8 | 0; + $v$0$i30 = $v$0$i30 + 8 | 0; + } + } + } + $i$1$i38 = $i$1$i38 + 1 | 0; + if (($i$1$i38 | 0) == ($25 | 0)) break; else $m$0$i37 = $m$0$i37 + ($27 << 3) | 0; + } + } + $36 = +($25 | 0); + if ($27) { + $37 = HEAP32[$mean >> 2] | 0; + $i$2$i26 = 0; + do { + $46 = $37 + ($i$2$i26 << 3) | 0; + HEAPF64[$46 >> 3] = +HEAPF64[$46 >> 3] / $36; + $i$2$i26 = $i$2$i26 + 1 | 0; + } while (($i$2$i26 | 0) != ($27 | 0)); + } + $smax$i = ($27 | 0) > 0 ? $27 : 0; + if (($25 | 0) > 0) { + $52 = ($27 | 0) > 0; + $i$0$i322 = 0; + $m$0$i221 = $35; + while (1) { + if ($52) { + $j$0$i619 = 0; + $m$1$i518 = $m$0$i221; + $v$0$i417 = HEAP32[$mean >> 2] | 0; + while (1) { + HEAPF64[$m$1$i518 >> 3] = +HEAPF64[$m$1$i518 >> 3] - +HEAPF64[$v$0$i417 >> 3]; + $j$0$i619 = $j$0$i619 + 1 | 0; + if (($j$0$i619 | 0) >= ($27 | 0)) break; else { + $m$1$i518 = $m$1$i518 + 8 | 0; + $v$0$i417 = $v$0$i417 + 8 | 0; + } + } + } + $i$0$i322 = $i$0$i322 + 1 | 0; + if (($i$0$i322 | 0) >= ($25 | 0)) break; else $m$0$i221 = $m$0$i221 + ($smax$i << 3) | 0; + } + } + $53 = Math_imul($3, $1) | 0; + if (($53 | 0) > 0) { + $i$015 = 0; + do { + $65 = $35 + ($i$015 << 3) | 0; + HEAPF64[$65 >> 3] = +HEAPF64[$65 >> 3] / $23; + $i$015 = $i$015 + 1 | 0; + } while (($i$015 | 0) < ($53 | 0)); + } + $70 = _PCA($20, $evec, $ev) | 0; + _arMatrixFree($20) | 0; + $71 = HEAP32[$14 >> 2] | 0; + if (($71 | 0) > 0) { + $73 = HEAP32[$ev >> 2] | 0; + $i$113 = 0; + $sum$012 = 0.0; + while (1) { + $78 = $sum$012 + +HEAPF64[$73 + ($i$113 << 3) >> 3]; + $i$113 = $i$113 + 1 | 0; + if (($i$113 | 0) >= ($71 | 0)) { + $sum$0$lcssa = $78; + break; + } else $sum$012 = $78; + } + } else $sum$0$lcssa = 0.0; + if (($71 | 0) <= 0) { + $$0 = $70; + break; + } + $75 = HEAP32[$ev >> 2] | 0; + $i$211 = 0; + while (1) { + $81 = $75 + ($i$211 << 3) | 0; + HEAPF64[$81 >> 3] = +HEAPF64[$81 >> 3] / $sum$0$lcssa; + $i$211 = $i$211 + 1 | 0; + if (($i$211 | 0) >= ($71 | 0)) { + $$0 = $70; + break L1; + } + } + } + _arMatrixFree($20) | 0; + $$0 = -1; + } + } else $$0 = -1; + } else $$0 = -1; + } else $$0 = -1; else $$0 = -1; while (0); + return $$0 | 0; +} + +function __ZN10__cxxabiv112_GLOBAL__N_126parse_base_unresolved_nameINS0_2DbEEEPKcS4_S4_RT_($first, $last, $db) { + $first = $first | 0; + $last = $last | 0; + $db = $db | 0; + var $$0 = 0, $$0$i = 0, $10 = 0, $12 = 0, $14 = 0, $15 = 0, $23 = 0, $24 = 0, $25 = 0, $26 = 0, $29 = 0, $31 = 0, $4 = 0, $42 = 0, $48 = 0, $52 = 0, $54 = 0, $56 = 0, $58 = 0, $59 = 0, $67 = 0, $68 = 0, $69 = 0, $70 = 0, $73 = 0, $75 = 0, $9 = 0, $args = 0, $args3 = 0, $t$0$i = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 32 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $args = sp + 12 | 0; + $args3 = sp; + L1 : do if (($last - $first | 0) > 1) { + $4 = HEAP8[$first >> 0] | 0; + switch ($4 << 24 >> 24) { + case 100: + case 111: + { + if ((HEAP8[$first + 1 >> 0] | 0) == 110) { + $9 = $first + 2 | 0; + if ($4 << 24 >> 24 == 111) { + $10 = __ZN10__cxxabiv112_GLOBAL__N_119parse_operator_nameINS0_2DbEEEPKcS4_S4_RT_($9, $last, $db) | 0; + if (($10 | 0) == ($9 | 0)) { + $$0 = $first; + break L1; + } + $12 = __ZN10__cxxabiv112_GLOBAL__N_119parse_template_argsINS0_2DbEEEPKcS4_S4_RT_($10, $last, $db) | 0; + if (($12 | 0) == ($10 | 0)) { + $$0 = $10; + break L1; + } + $14 = $db + 4 | 0; + $15 = HEAP32[$14 >> 2] | 0; + if ((($15 - (HEAP32[$db >> 2] | 0) | 0) / 24 | 0) >>> 0 < 2) { + $$0 = $12; + break L1; + } + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($args, $15 + -24 | 0); + $23 = HEAP32[$14 >> 2] | 0; + $24 = $23 + -24 | 0; + $26 = $23; + do { + $25 = $26 + -24 | 0; + HEAP32[$14 >> 2] = $25; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($25); + $26 = HEAP32[$14 >> 2] | 0; + } while (($26 | 0) != ($24 | 0)); + $29 = HEAP8[$args >> 0] | 0; + $31 = ($29 & 1) == 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($23 + -48 | 0, $31 ? $args + 1 | 0 : HEAP32[$args + 8 >> 2] | 0, $31 ? ($29 & 255) >>> 1 : HEAP32[$args + 4 >> 2] | 0) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($args); + $$0 = $12; + break L1; + } + if (($9 | 0) == ($last | 0)) $$0$i = $last; else { + $42 = __ZN10__cxxabiv112_GLOBAL__N_121parse_unresolved_typeINS0_2DbEEEPKcS4_S4_RT_($9, $last, $db) | 0; + if (($42 | 0) == ($9 | 0)) $t$0$i = __ZN10__cxxabiv112_GLOBAL__N_115parse_simple_idINS0_2DbEEEPKcS4_S4_RT_($9, $last, $db) | 0; else $t$0$i = $42; + if (($t$0$i | 0) == ($9 | 0)) $$0$i = $9; else { + $48 = HEAP32[$db + 4 >> 2] | 0; + if ((HEAP32[$db >> 2] | 0) == ($48 | 0)) $$0$i = $9; else { + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc($48 + -24 | 0, 0, 12928) | 0; + $$0$i = $t$0$i; + } + } + } + STACKTOP = sp; + return (($$0$i | 0) == ($9 | 0) ? $first : $$0$i) | 0; + } + break; + } + default: + {} + } + $52 = __ZN10__cxxabiv112_GLOBAL__N_115parse_simple_idINS0_2DbEEEPKcS4_S4_RT_($first, $last, $db) | 0; + if (($52 | 0) == ($first | 0)) { + $54 = __ZN10__cxxabiv112_GLOBAL__N_119parse_operator_nameINS0_2DbEEEPKcS4_S4_RT_($first, $last, $db) | 0; + if (($54 | 0) == ($first | 0)) $$0 = $first; else { + $56 = __ZN10__cxxabiv112_GLOBAL__N_119parse_template_argsINS0_2DbEEEPKcS4_S4_RT_($54, $last, $db) | 0; + if (($56 | 0) == ($54 | 0)) $$0 = $54; else { + $58 = $db + 4 | 0; + $59 = HEAP32[$58 >> 2] | 0; + if ((($59 - (HEAP32[$db >> 2] | 0) | 0) / 24 | 0) >>> 0 < 2) $$0 = $56; else { + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($args3, $59 + -24 | 0); + $67 = HEAP32[$58 >> 2] | 0; + $68 = $67 + -24 | 0; + $70 = $67; + do { + $69 = $70 + -24 | 0; + HEAP32[$58 >> 2] = $69; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($69); + $70 = HEAP32[$58 >> 2] | 0; + } while (($70 | 0) != ($68 | 0)); + $73 = HEAP8[$args3 >> 0] | 0; + $75 = ($73 & 1) == 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($67 + -48 | 0, $75 ? $args3 + 1 | 0 : HEAP32[$args3 + 8 >> 2] | 0, $75 ? ($73 & 255) >>> 1 : HEAP32[$args3 + 4 >> 2] | 0) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($args3); + $$0 = $56; + } + } + } + } else $$0 = $52; + } else $$0 = $first; while (0); + STACKTOP = sp; + return $$0 | 0; +} + +function _arParamLoad($filename, $num, $param, $varargs) { + $filename = $filename | 0; + $num = $num | 0; + $param = $param | 0; + $varargs = $varargs | 0; + var $$pre$phi14Z2D = 0, $11 = 0, $14 = 0, $15 = 0, $18 = 0, $21 = 0, $23 = 0, $26 = 0, $29 = 0, $3 = 0, $30 = 0, $31 = 0, $32 = 0, $33 = 0.0, $34 = 0, $36 = 0, $43 = 0, $44 = 0, $5 = 0, $53 = 0.0, $8 = 0, $ap = 0, $dist_function_version$04 = 0, $i$0 = 0, $i$0$lcssa = 0, $i$119 = 0, $param_wasRead = 0, $ret$06 = 0, $ret$09 = 0, $vararg_buffer = 0, $vararg_buffer13 = 0, $vararg_buffer15 = 0, $vararg_buffer18 = 0, $vararg_buffer2 = 0, $vararg_buffer6 = 0, $vararg_buffer9 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 256 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer18 = sp + 232 | 0; + $vararg_buffer15 = sp + 224 | 0; + $vararg_buffer13 = sp + 216 | 0; + $vararg_buffer9 = sp + 208 | 0; + $vararg_buffer6 = sp + 200 | 0; + $vararg_buffer2 = sp + 192 | 0; + $vararg_buffer = sp + 184 | 0; + $ap = sp + 240 | 0; + $param_wasRead = sp; + do if (($filename | 0) != 0 & ($num | 0) > 0 & ($param | 0) != 0) { + $3 = _fopen($filename, 4854) | 0; + if (!$3) { + $5 = ___errno_location() | 0; + HEAP32[$vararg_buffer >> 2] = HEAP32[$5 >> 2]; + HEAP32[$vararg_buffer + 4 >> 2] = $filename; + _arLog(3, 4857, $vararg_buffer); + $8 = _strerror(HEAP32[$5 >> 2] | 0) | 0; + HEAP32[$vararg_buffer2 >> 2] = 13835; + HEAP32[$vararg_buffer2 + 4 >> 2] = $8; + _arLog(3, 5361, $vararg_buffer2); + $ret$06 = -1; + break; + } + _fseek($3, 0, 2) | 0; + L6 : do if (!(_ferror($3) | 0)) { + $15 = _ftell($3) | 0; + _rewind($3); + $i$0 = 0; + while (1) { + if (($i$0 | 0) >= 4) { + $i$0$lcssa = $i$0; + label = 9; + break; + } + $18 = HEAP32[2012 + ($i$0 << 3) + 4 >> 2] | 0; + $21 = $i$0 + 1 | 0; + if (!(($15 | 0) % ($18 | 0) | 0)) { + $23 = $18; + $dist_function_version$04 = $21; + break; + } else $i$0 = $21; + } + do if ((label | 0) == 9) if (($i$0$lcssa | 0) == 4) { + _arLog(3, 4971, $vararg_buffer13); + $ret$09 = -1; + break L6; + } else { + $23 = HEAP32[2012 + (0 << 3) + 4 >> 2] | 0; + $dist_function_version$04 = 0; + break; + } while (0); + if ((_fread($param_wasRead, $23, 1, $3) | 0) != 1) { + $26 = ___errno_location() | 0; + HEAP32[$vararg_buffer15 >> 2] = HEAP32[$26 >> 2]; + _arLog(3, 5051, $vararg_buffer15); + $29 = _strerror(HEAP32[$26 >> 2] | 0) | 0; + HEAP32[$vararg_buffer18 >> 2] = 13835; + HEAP32[$vararg_buffer18 + 4 >> 2] = $29; + _arLog(3, 5361, $vararg_buffer18); + $ret$09 = -1; + break; + } + $30 = $param_wasRead + 176 | 0; + HEAP32[$30 >> 2] = $dist_function_version$04; + _byteswap($param_wasRead); + $31 = ($dist_function_version$04 | 0) == 1; + $32 = $param_wasRead + 120 | 0; + if ($31) { + $33 = +HEAPF64[$32 >> 3]; + $34 = $param_wasRead + 128 | 0; + HEAPF64[$32 >> 3] = +HEAPF64[$34 >> 3]; + HEAPF64[$34 >> 3] = $33; + $$pre$phi14Z2D = $34; + } else $$pre$phi14Z2D = $param_wasRead + 128 | 0; + _memcpy($param | 0, $param_wasRead | 0, 184) | 0; + HEAP32[$ap >> 2] = $varargs; + $36 = $param + 176 | 0; + if (($num | 0) > 1) { + $i$119 = 1; + while (1) { + $43 = (HEAP32[$ap >> 2] | 0) + (4 - 1) & ~(4 - 1); + $44 = HEAP32[$43 >> 2] | 0; + HEAP32[$ap >> 2] = $43 + 4; + HEAP32[$44 + 176 >> 2] = HEAP32[$36 >> 2]; + if ((_fread($param_wasRead, HEAP32[2012 + ((HEAP32[$36 >> 2] | 0) + -1 << 3) + 4 >> 2] | 0, 1, $3) | 0) != 1) { + $ret$09 = -1; + break L6; + } + HEAP32[$30 >> 2] = $dist_function_version$04; + _byteswap($param_wasRead); + if ($31) { + $53 = +HEAPF64[$32 >> 3]; + HEAPF64[$32 >> 3] = +HEAPF64[$$pre$phi14Z2D >> 3]; + HEAPF64[$$pre$phi14Z2D >> 3] = $53; + } + _memcpy($44 | 0, $param_wasRead | 0, 184) | 0; + $i$119 = $i$119 + 1 | 0; + if (($i$119 | 0) >= ($num | 0)) { + $ret$09 = 0; + break; + } + } + } else $ret$09 = 0; + } else { + $11 = ___errno_location() | 0; + HEAP32[$vararg_buffer6 >> 2] = HEAP32[$11 >> 2]; + _arLog(3, 4926, $vararg_buffer6); + $14 = _strerror(HEAP32[$11 >> 2] | 0) | 0; + HEAP32[$vararg_buffer9 >> 2] = 13835; + HEAP32[$vararg_buffer9 + 4 >> 2] = $14; + _arLog(3, 5361, $vararg_buffer9); + $ret$09 = -1; + } while (0); + _fclose($3) | 0; + $ret$06 = $ret$09; + } else $ret$06 = -1; while (0); + STACKTOP = sp; + return $ret$06 | 0; +} + +function __ZN10__cxxabiv112_GLOBAL__N_123parse_prefix_expressionINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_($first, $last, $op, $db) { + $first = $first | 0; + $last = $last | 0; + $op = $op | 0; + $db = $db | 0; + var $$04 = 0, $$pre$i$i$i = 0, $0 = 0, $1 = 0, $10 = 0, $13 = 0, $15 = 0, $2 = 0, $25 = 0, $28 = 0, $3 = 0, $35 = 0, $37 = 0, $4 = 0, $40 = 0, $44 = 0, $47 = 0, $52 = 0, $53 = 0, $56 = 0, $57 = 0, $59 = 0, $60 = 0, $69 = 0, $7 = 0, $72 = 0, $77 = 0, $8 = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 48 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $0 = sp + 36 | 0; + $1 = sp + 24 | 0; + $2 = sp + 12 | 0; + $3 = sp; + $4 = __ZN10__cxxabiv112_GLOBAL__N_116parse_expressionINS0_2DbEEEPKcS4_S4_RT_($first, $last, $db) | 0; + if (($4 | 0) == ($first | 0)) $$04 = $first; else { + $7 = $db + 4 | 0; + $8 = HEAP32[$7 >> 2] | 0; + if ((HEAP32[$db >> 2] | 0) == ($8 | 0)) $$04 = $first; else { + $10 = $8 + -24 | 0; + __ZNSt3__1plIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEENS_12basic_stringIT_T0_T1_EERKSB_PKS8_($2, $op, 12714); + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($3, (HEAP32[$7 >> 2] | 0) + -24 | 0); + $13 = HEAP8[$3 >> 0] | 0; + $15 = ($13 & 1) == 0; + $25 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($2, $15 ? $3 + 1 | 0 : HEAP32[$3 + 8 >> 2] | 0, $15 ? ($13 & 255) >>> 1 : HEAP32[$3 + 4 >> 2] | 0) | 0; + HEAP32[$1 >> 2] = HEAP32[$25 >> 2]; + HEAP32[$1 + 4 >> 2] = HEAP32[$25 + 4 >> 2]; + HEAP32[$1 + 8 >> 2] = HEAP32[$25 + 8 >> 2]; + HEAP32[$25 >> 2] = 0; + HEAP32[$25 + 4 >> 2] = 0; + HEAP32[$25 + 8 >> 2] = 0; + $28 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($1, 12619) | 0; + HEAP32[$0 >> 2] = HEAP32[$28 >> 2]; + HEAP32[$0 + 4 >> 2] = HEAP32[$28 + 4 >> 2]; + HEAP32[$0 + 8 >> 2] = HEAP32[$28 + 8 >> 2]; + HEAP32[$28 >> 2] = 0; + HEAP32[$28 + 4 >> 2] = 0; + HEAP32[$28 + 8 >> 2] = 0; + do if (!(HEAP8[$10 >> 0] & 1)) { + HEAP8[$10 + 1 >> 0] = 0; + HEAP8[$10 >> 0] = 0; + } else { + $35 = $8 + -16 | 0; + HEAP8[HEAP32[$35 >> 2] >> 0] = 0; + $37 = $8 + -20 | 0; + HEAP32[$37 >> 2] = 0; + $$pre$i$i$i = HEAP8[$10 >> 0] | 0; + if (!($$pre$i$i$i & 1)) { + $44 = $$pre$i$i$i; + $53 = 10; + } else { + $40 = HEAP32[$10 >> 2] | 0; + $44 = $40 & 255; + $53 = ($40 & -2) + -1 | 0; + } + if (!($44 & 1)) { + $47 = ($44 & 255) >>> 1; + if (($44 & 255) < 22) { + $52 = 10; + $72 = $47; + $77 = 1; + } else { + $52 = ($47 + 16 & 240) + -1 | 0; + $72 = $47; + $77 = 1; + } + } else { + $52 = 10; + $72 = 0; + $77 = 0; + } + if (($52 | 0) != ($53 | 0)) { + if (($52 | 0) == 10) { + $59 = $10 + 1 | 0; + $60 = HEAP32[$35 >> 2] | 0; + if ($77) { + _memcpy($59 | 0, $60 | 0, (($44 & 255) >>> 1) + 1 | 0) | 0; + _free($60); + } else { + HEAP8[$59 >> 0] = HEAP8[$60 >> 0] | 0; + _free($60); + } + HEAP8[$10 >> 0] = $72 << 1; + break; + } + $56 = $52 + 1 | 0; + $57 = _malloc($56) | 0; + if (!($52 >>> 0 <= $53 >>> 0 & ($57 | 0) == 0)) { + if ($77) _memcpy($57 | 0, $10 + 1 | 0, (($44 & 255) >>> 1) + 1 | 0) | 0; else { + $69 = HEAP32[$35 >> 2] | 0; + HEAP8[$57 >> 0] = HEAP8[$69 >> 0] | 0; + _free($69); + } + HEAP32[$10 >> 2] = $56 | 1; + HEAP32[$37 >> 2] = $72; + HEAP32[$35 >> 2] = $57; + } + } + } while (0); + HEAP32[$10 >> 2] = HEAP32[$0 >> 2]; + HEAP32[$10 + 4 >> 2] = HEAP32[$0 + 4 >> 2]; + HEAP32[$10 + 8 >> 2] = HEAP32[$0 + 8 >> 2]; + HEAP32[$0 >> 2] = 0; + HEAP32[$0 + 4 >> 2] = 0; + HEAP32[$0 + 8 >> 2] = 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($0); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($1); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($3); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($2); + $$04 = $4; + } + } + STACKTOP = sp; + return $$04 | 0; +} + +function _icpPoint($handle, $data, $initMatXw2Xc, $matXw2Xc, $err) { + $handle = $handle | 0; + $data = $data | 0; + $initMatXw2Xc = $initMatXw2Xc | 0; + $matXw2Xc = $matXw2Xc | 0; + $err = $err | 0; + var $$0 = 0, $$lcssa = 0, $$lcssa28 = 0, $$lcssa50 = 0.0, $$pre = 0, $0 = 0, $1 = 0, $10 = 0, $11 = 0, $12 = 0, $13 = 0, $14 = 0, $28 = 0, $34 = 0, $38 = 0.0, $4 = 0, $42 = 0.0, $46 = 0.0, $47 = 0, $52 = 0, $55 = 0.0, $7 = 0, $9 = 0, $U = 0, $dS = 0, $err0$0 = 0.0, $err1$0$lcssa = 0.0, $err1$033 = 0.0, $i$1 = 0, $j$042 = 0, $j$134 = 0, $j$238 = 0, $matXw2U = 0, $vararg_buffer = 0, $vararg_buffer1 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 176 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer1 = sp + 168 | 0; + $vararg_buffer = sp + 160 | 0; + $U = sp + 48 | 0; + $matXw2U = sp + 64 | 0; + $dS = sp; + $0 = $data + 8 | 0; + $1 = HEAP32[$0 >> 2] | 0; + do if (($1 | 0) < 3) $$0 = -1; else { + $4 = _malloc($1 * 96 | 0) | 0; + if (!$4) { + _arLog(3, 5109, $vararg_buffer); + $$0 = -1; + break; + } + $7 = _malloc($1 << 4) | 0; + if (!$7) { + _arLog(3, 5109, $vararg_buffer1); + _free($4); + $$0 = -1; + break; + } else $j$042 = 0; + do { + HEAPF64[$matXw2Xc + ($j$042 << 5) >> 3] = +HEAPF64[$initMatXw2Xc + ($j$042 << 5) >> 3]; + HEAPF64[$matXw2Xc + ($j$042 << 5) + 8 >> 3] = +HEAPF64[$initMatXw2Xc + ($j$042 << 5) + 8 >> 3]; + HEAPF64[$matXw2Xc + ($j$042 << 5) + 16 >> 3] = +HEAPF64[$initMatXw2Xc + ($j$042 << 5) + 16 >> 3]; + HEAPF64[$matXw2Xc + ($j$042 << 5) + 24 >> 3] = +HEAPF64[$initMatXw2Xc + ($j$042 << 5) + 24 >> 3]; + $j$042 = $j$042 + 1 | 0; + } while (($j$042 | 0) != 3); + $9 = $data + 4 | 0; + $10 = $U + 8 | 0; + $11 = $handle + 104 | 0; + $12 = $handle + 120 | 0; + $13 = $handle + 112 | 0; + $14 = $handle + 96 | 0; + $err0$0 = 0.0; + $i$1 = 0; + L11 : while (1) { + _arUtilMatMul($handle, $matXw2Xc, $matXw2U) | 0; + $28 = HEAP32[$0 >> 2] | 0; + if (($28 | 0) > 0) { + $err1$033 = 0.0; + $j$134 = 0; + while (1) { + if ((_icpGetU_from_X_by_MatX2U($U, $matXw2U, (HEAP32[$9 >> 2] | 0) + ($j$134 * 24 | 0) | 0) | 0) < 0) { + label = 10; + break L11; + } + $34 = HEAP32[$data >> 2] | 0; + $38 = +HEAPF64[$34 + ($j$134 << 4) >> 3] - +HEAPF64[$U >> 3]; + $42 = +HEAPF64[$34 + ($j$134 << 4) + 8 >> 3] - +HEAPF64[$10 >> 3]; + $46 = $err1$033 + ($38 * $38 + $42 * $42); + $47 = $j$134 << 1; + HEAPF64[$7 + ($47 << 3) >> 3] = $38; + HEAPF64[$7 + (($47 | 1) << 3) >> 3] = $42; + $j$134 = $j$134 + 1 | 0; + $52 = HEAP32[$0 >> 2] | 0; + if (($j$134 | 0) >= ($52 | 0)) { + $$lcssa = $52; + $err1$0$lcssa = $46; + break; + } else $err1$033 = $46; + } + } else { + $$lcssa = $28; + $err1$0$lcssa = 0.0; + } + $55 = $err1$0$lcssa / +($$lcssa | 0); + if ($55 < +HEAPF64[$11 >> 3]) { + $$lcssa50 = $55; + label = 24; + break; + } + if (($i$1 | 0) > 0) if ($55 < +HEAPF64[$12 >> 3]) if ($55 / $err0$0 > +HEAPF64[$13 >> 3]) { + $$lcssa50 = $55; + label = 24; + break; + } + if (($i$1 | 0) == (HEAP32[$14 >> 2] | 0)) { + $$lcssa50 = $55; + label = 24; + break; + } + if (($$lcssa | 0) > 0) { + $j$238 = 0; + while (1) { + if ((_icpGetJ_U_S($4 + ($j$238 * 12 << 3) | 0, $handle, $matXw2Xc, (HEAP32[$9 >> 2] | 0) + ($j$238 * 24 | 0) | 0) | 0) < 0) { + label = 20; + break L11; + } + $j$238 = $j$238 + 1 | 0; + $$pre = HEAP32[$0 >> 2] | 0; + if (($j$238 | 0) >= ($$pre | 0)) { + $$lcssa28 = $$pre; + break; + } + } + } else $$lcssa28 = $$lcssa; + if ((_icpGetDeltaS($dS, $7, $4, $$lcssa28 << 1) | 0) < 0) { + label = 22; + break; + } + _icpUpdateMat($matXw2Xc, $dS) | 0; + $err0$0 = $55; + $i$1 = $i$1 + 1 | 0; + } + if ((label | 0) == 10) { + _icpGetXw2XcCleanup($4, $7); + $$0 = -1; + break; + } else if ((label | 0) == 20) { + _icpGetXw2XcCleanup($4, $7); + $$0 = -1; + break; + } else if ((label | 0) == 22) { + _icpGetXw2XcCleanup($4, $7); + $$0 = -1; + break; + } else if ((label | 0) == 24) { + HEAPF64[$err >> 3] = $$lcssa50; + _free($4); + _free($7); + $$0 = 0; + break; + } + } while (0); + STACKTOP = sp; + return $$0 | 0; +} + +function _arGetMarkerInfo($image, $xsize, $ysize, $pixelFormat, $markerInfo2, $marker2_num, $pattHandle, $imageProcMode, $pattDetectMode, $arParamLTf, $pattRatio, $markerInfo, $marker_num, $matrixCodeType) { + $image = $image | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $pixelFormat = $pixelFormat | 0; + $markerInfo2 = $markerInfo2 | 0; + $marker2_num = $marker2_num | 0; + $pattHandle = $pattHandle | 0; + $imageProcMode = $imageProcMode | 0; + $pattDetectMode = $pattDetectMode | 0; + $arParamLTf = $arParamLTf | 0; + $pattRatio = +$pattRatio; + $markerInfo = $markerInfo | 0; + $marker_num = $marker_num | 0; + $matrixCodeType = $matrixCodeType | 0; + var $0 = 0, $1 = 0, $26 = 0, $29 = 0, $30 = 0, $31 = 0, $32 = 0, $33 = 0, $34 = 0, $i$03 = 0, $j$0$lcssa = 0, $j$02 = 0, $j$1 = 0, $pos0 = 0, $pos1 = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $pos0 = sp + 4 | 0; + $pos1 = sp; + $0 = $pattDetectMode >>> 0 < 2; + $1 = ($pattDetectMode | 0) == 2; + if (($marker2_num | 0) > 0) { + $i$03 = 0; + $j$02 = 0; + while (1) { + HEAP32[$markerInfo + ($j$02 << 8) >> 2] = HEAP32[$markerInfo2 + ($i$03 * 80048 | 0) >> 2]; + if ((_arParamObserv2IdealLTf($arParamLTf, +HEAPF64[$markerInfo2 + ($i$03 * 80048 | 0) + 8 >> 3], +HEAPF64[$markerInfo2 + ($i$03 * 80048 | 0) + 16 >> 3], $pos0, $pos1) | 0) < 0) $j$1 = $j$02; else { + HEAPF64[$markerInfo + ($j$02 << 8) + 56 >> 3] = +HEAPF32[$pos0 >> 2]; + HEAPF64[$markerInfo + ($j$02 << 8) + 64 >> 3] = +HEAPF32[$pos1 >> 2]; + $26 = $markerInfo + ($j$02 << 8) + 168 | 0; + if ((_arGetLine($markerInfo2 + ($i$03 * 80048 | 0) + 28 | 0, $markerInfo2 + ($i$03 * 80048 | 0) + 40028 | 0, HEAP32[$markerInfo2 + ($i$03 * 80048 | 0) + 24 >> 2] | 0, $markerInfo2 + ($i$03 * 80048 | 0) + 80028 | 0, $arParamLTf, $markerInfo + ($j$02 << 8) + 72 | 0, $26) | 0) < 0) $j$1 = $j$02; else { + $29 = $markerInfo + ($j$02 << 8) + 8 | 0; + $30 = $markerInfo + ($j$02 << 8) + 20 | 0; + $31 = $markerInfo + ($j$02 << 8) + 40 | 0; + $32 = $markerInfo + ($j$02 << 8) + 12 | 0; + $33 = $markerInfo + ($j$02 << 8) + 24 | 0; + $34 = $markerInfo + ($j$02 << 8) + 48 | 0; + switch (_arPattGetIDGlobal($pattHandle, $imageProcMode, $pattDetectMode, $image, $xsize, $ysize, $pixelFormat, $arParamLTf, $26, $pattRatio, $29, $30, $31, $32, $33, $34, $matrixCodeType, $markerInfo + ($j$02 << 8) + 240 | 0, $markerInfo + ($j$02 << 8) + 248 | 0) | 0) { + case 0: + { + HEAP32[$markerInfo + ($j$02 << 8) + 236 >> 2] = 0; + break; + } + case -1: + { + HEAP32[$markerInfo + ($j$02 << 8) + 236 >> 2] = 2; + break; + } + case -2: + { + HEAP32[$markerInfo + ($j$02 << 8) + 236 >> 2] = 3; + break; + } + case -3: + { + HEAP32[$markerInfo + ($j$02 << 8) + 236 >> 2] = 4; + break; + } + case -4: + { + HEAP32[$markerInfo + ($j$02 << 8) + 236 >> 2] = 5; + break; + } + case -5: + { + HEAP32[$markerInfo + ($j$02 << 8) + 236 >> 2] = 9; + break; + } + case -6: + { + HEAP32[$markerInfo + ($j$02 << 8) + 236 >> 2] = 1; + break; + } + default: + {} + } + if ($0) { + HEAP32[$markerInfo + ($j$02 << 8) + 4 >> 2] = HEAP32[$29 >> 2]; + HEAP32[$markerInfo + ($j$02 << 8) + 16 >> 2] = HEAP32[$30 >> 2]; + HEAPF64[$markerInfo + ($j$02 << 8) + 32 >> 3] = +HEAPF64[$31 >> 3]; + } else if ($1) { + HEAP32[$markerInfo + ($j$02 << 8) + 4 >> 2] = HEAP32[$32 >> 2]; + HEAP32[$markerInfo + ($j$02 << 8) + 16 >> 2] = HEAP32[$33 >> 2]; + HEAPF64[$markerInfo + ($j$02 << 8) + 32 >> 3] = +HEAPF64[$34 >> 3]; + } + $j$1 = $j$02 + 1 | 0; + } + } + $i$03 = $i$03 + 1 | 0; + if (($i$03 | 0) >= ($marker2_num | 0)) { + $j$0$lcssa = $j$1; + break; + } else $j$02 = $j$1; + } + } else $j$0$lcssa = 0; + HEAP32[$marker_num >> 2] = $j$0$lcssa; + STACKTOP = sp; + return 0; +} + +function _arImageProcLumaHistAndBoxFilterWithBias($ipi, $dataPtr, $boxSize, $bias) { + $ipi = $ipi | 0; + $dataPtr = $dataPtr | 0; + $boxSize = $boxSize | 0; + $bias = $bias | 0; + var $$0 = 0, $$lcssa = 0, $$pre$phi6Z2D = 0, $$pre$phiZ2D = 0, $0 = 0, $10 = 0, $12 = 0, $13 = 0, $14 = 0, $16 = 0, $17 = 0, $18 = 0, $2 = 0, $20 = 0, $24 = 0, $25 = 0, $26 = 0, $43 = 0, $5 = 0, $50 = 0, $57 = 0, $7 = 0, $count$0$lcssa = 0, $count$015 = 0, $count$110 = 0, $count$2 = 0, $count$3 = 0, $i$020 = 0, $i$18 = 0, $j$021 = 0, $kernel_i$011 = 0, $kernel_j$016 = 0, $val$0$lcssa = 0, $val$014 = 0, $val$19 = 0, $val$2 = 0, $val$3 = 0; + $0 = _arImageProcLumaHist($ipi, $dataPtr) | 0; + do if (($0 | 0) < 0) $$0 = $0; else { + $2 = $ipi + 4 | 0; + if (!(HEAP32[$2 >> 2] | 0)) { + $5 = $ipi + 8 | 0; + $7 = $ipi + 12 | 0; + $10 = _malloc(Math_imul(HEAP32[$7 >> 2] | 0, HEAP32[$5 >> 2] | 0) | 0) | 0; + HEAP32[$2 >> 2] = $10; + if (!$10) { + $$0 = -1; + break; + } else { + $$pre$phi6Z2D = $5; + $$pre$phiZ2D = $7; + } + } else { + $$pre$phi6Z2D = $ipi + 8 | 0; + $$pre$phiZ2D = $ipi + 12 | 0; + } + $12 = $boxSize >> 1; + $13 = 0 - $12 | 0; + $14 = HEAP32[$$pre$phiZ2D >> 2] | 0; + if (($14 | 0) > 0) { + $16 = ($12 | 0) < ($13 | 0); + $17 = ($12 | 0) < ($13 | 0); + $j$021 = 0; + do { + $18 = HEAP32[$$pre$phi6Z2D >> 2] | 0; + if (($18 | 0) > 0) { + $25 = $18; + $i$020 = 0; + do { + if ($16) { + $count$0$lcssa = 0; + $val$0$lcssa = 0; + } else { + $count$015 = 0; + $kernel_j$016 = $13; + $val$014 = 0; + while (1) { + $20 = $kernel_j$016 + $j$021 | 0; + if (($20 | 0) < 0) { + $count$3 = $count$015; + $val$3 = $val$014; + } else if (($20 | 0) < (HEAP32[$$pre$phiZ2D >> 2] | 0)) { + $24 = Math_imul($25, $20) | 0; + if ($17) { + $count$3 = $count$015; + $val$3 = $val$014; + } else { + $count$110 = $count$015; + $kernel_i$011 = $13; + $val$19 = $val$014; + while (1) { + $26 = $kernel_i$011 + $i$020 | 0; + if (($26 | 0) > -1 & ($26 | 0) < ($25 | 0)) { + $count$2 = $count$110 + 1 | 0; + $val$2 = (HEAPU8[(HEAP32[$ipi >> 2] | 0) + ($24 + $26) >> 0] | 0) + $val$19 | 0; + } else { + $count$2 = $count$110; + $val$2 = $val$19; + } + if (($kernel_i$011 | 0) < ($12 | 0)) { + $count$110 = $count$2; + $kernel_i$011 = $kernel_i$011 + 1 | 0; + $val$19 = $val$2; + } else { + $count$3 = $count$2; + $val$3 = $val$2; + break; + } + } + } + } else { + $count$3 = $count$015; + $val$3 = $val$014; + } + if (($kernel_j$016 | 0) < ($12 | 0)) { + $count$015 = $count$3; + $kernel_j$016 = $kernel_j$016 + 1 | 0; + $val$014 = $val$3; + } else { + $count$0$lcssa = $count$3; + $val$0$lcssa = $val$3; + break; + } + } + } + $43 = (Math_imul($25, $j$021) | 0) + $i$020 | 0; + HEAP8[(HEAP32[$2 >> 2] | 0) + $43 >> 0] = ($val$0$lcssa | 0) / ($count$0$lcssa | 0) | 0; + $i$020 = $i$020 + 1 | 0; + $25 = HEAP32[$$pre$phi6Z2D >> 2] | 0; + } while (($i$020 | 0) < ($25 | 0)); + } + $j$021 = $j$021 + 1 | 0; + $50 = HEAP32[$$pre$phiZ2D >> 2] | 0; + } while (($j$021 | 0) < ($50 | 0)); + $$lcssa = $50; + } else $$lcssa = $14; + if (!$bias) $$0 = 0; else if ((Math_imul($$lcssa, HEAP32[$$pre$phi6Z2D >> 2] | 0) | 0) > 0) { + $i$18 = 0; + do { + $57 = (HEAP32[$2 >> 2] | 0) + $i$18 | 0; + HEAP8[$57 >> 0] = (HEAPU8[$57 >> 0] | 0) + $bias; + $i$18 = $i$18 + 1 | 0; + } while (($i$18 | 0) < (Math_imul(HEAP32[$$pre$phiZ2D >> 2] | 0, HEAP32[$$pre$phi6Z2D >> 2] | 0) | 0)); + $$0 = 0; + } else $$0 = 0; + } while (0); + return $$0 | 0; +} + +function __ZN10__cxxabiv112_GLOBAL__N_111string_pairaSEOS1_($this, $0) { + $this = $this | 0; + $0 = $0 | 0; + var $$pre$i$i$i = 0, $$pre$i$i$i2 = 0, $10 = 0, $14 = 0, $17 = 0, $22 = 0, $23 = 0, $26 = 0, $27 = 0, $29 = 0, $30 = 0, $39 = 0, $42 = 0, $47 = 0, $48 = 0, $5 = 0, $53 = 0, $55 = 0, $58 = 0, $62 = 0, $65 = 0, $7 = 0, $70 = 0, $71 = 0, $74 = 0, $75 = 0, $77 = 0, $78 = 0, $87 = 0, $90 = 0, $95 = 0, $96 = 0; + do if (!(HEAP8[$this >> 0] & 1)) { + HEAP8[$this + 1 >> 0] = 0; + HEAP8[$this >> 0] = 0; + } else { + $5 = $this + 8 | 0; + HEAP8[HEAP32[$5 >> 2] >> 0] = 0; + $7 = $this + 4 | 0; + HEAP32[$7 >> 2] = 0; + $$pre$i$i$i = HEAP8[$this >> 0] | 0; + if (!($$pre$i$i$i & 1)) { + $14 = $$pre$i$i$i; + $23 = 10; + } else { + $10 = HEAP32[$this >> 2] | 0; + $14 = $10 & 255; + $23 = ($10 & -2) + -1 | 0; + } + if (!($14 & 1)) { + $17 = ($14 & 255) >>> 1; + if (($14 & 255) < 22) { + $22 = 10; + $42 = $17; + $95 = 1; + } else { + $22 = ($17 + 16 & 240) + -1 | 0; + $42 = $17; + $95 = 1; + } + } else { + $22 = 10; + $42 = 0; + $95 = 0; + } + if (($22 | 0) != ($23 | 0)) { + if (($22 | 0) == 10) { + $29 = $this + 1 | 0; + $30 = HEAP32[$5 >> 2] | 0; + if ($95) { + _memcpy($29 | 0, $30 | 0, (($14 & 255) >>> 1) + 1 | 0) | 0; + _free($30); + } else { + HEAP8[$29 >> 0] = HEAP8[$30 >> 0] | 0; + _free($30); + } + HEAP8[$this >> 0] = $42 << 1; + break; + } + $26 = $22 + 1 | 0; + $27 = _malloc($26) | 0; + if (!($22 >>> 0 <= $23 >>> 0 & ($27 | 0) == 0)) { + if ($95) _memcpy($27 | 0, $this + 1 | 0, (($14 & 255) >>> 1) + 1 | 0) | 0; else { + $39 = HEAP32[$5 >> 2] | 0; + HEAP8[$27 >> 0] = HEAP8[$39 >> 0] | 0; + _free($39); + } + HEAP32[$this >> 2] = $26 | 1; + HEAP32[$7 >> 2] = $42; + HEAP32[$5 >> 2] = $27; + } + } + } while (0); + HEAP32[$this >> 2] = HEAP32[$0 >> 2]; + HEAP32[$this + 4 >> 2] = HEAP32[$0 + 4 >> 2]; + HEAP32[$this + 8 >> 2] = HEAP32[$0 + 8 >> 2]; + HEAP32[$0 >> 2] = 0; + HEAP32[$0 + 4 >> 2] = 0; + HEAP32[$0 + 8 >> 2] = 0; + $47 = $this + 12 | 0; + $48 = $0 + 12 | 0; + do if (!(HEAP8[$47 >> 0] & 1)) { + HEAP8[$47 + 1 >> 0] = 0; + HEAP8[$47 >> 0] = 0; + } else { + $53 = $this + 20 | 0; + HEAP8[HEAP32[$53 >> 2] >> 0] = 0; + $55 = $this + 16 | 0; + HEAP32[$55 >> 2] = 0; + $$pre$i$i$i2 = HEAP8[$47 >> 0] | 0; + if (!($$pre$i$i$i2 & 1)) { + $62 = $$pre$i$i$i2; + $71 = 10; + } else { + $58 = HEAP32[$47 >> 2] | 0; + $62 = $58 & 255; + $71 = ($58 & -2) + -1 | 0; + } + if (!($62 & 1)) { + $65 = ($62 & 255) >>> 1; + if (($62 & 255) < 22) { + $70 = 10; + $90 = $65; + $96 = 1; + } else { + $70 = ($65 + 16 & 240) + -1 | 0; + $90 = $65; + $96 = 1; + } + } else { + $70 = 10; + $90 = 0; + $96 = 0; + } + if (($70 | 0) != ($71 | 0)) { + if (($70 | 0) == 10) { + $77 = $47 + 1 | 0; + $78 = HEAP32[$53 >> 2] | 0; + if ($96) { + _memcpy($77 | 0, $78 | 0, (($62 & 255) >>> 1) + 1 | 0) | 0; + _free($78); + } else { + HEAP8[$77 >> 0] = HEAP8[$78 >> 0] | 0; + _free($78); + } + HEAP8[$47 >> 0] = $90 << 1; + break; + } + $74 = $70 + 1 | 0; + $75 = _malloc($74) | 0; + if (!($70 >>> 0 <= $71 >>> 0 & ($75 | 0) == 0)) { + if ($96) _memcpy($75 | 0, $47 + 1 | 0, (($62 & 255) >>> 1) + 1 | 0) | 0; else { + $87 = HEAP32[$53 >> 2] | 0; + HEAP8[$75 >> 0] = HEAP8[$87 >> 0] | 0; + _free($87); + } + HEAP32[$47 >> 2] = $74 | 1; + HEAP32[$55 >> 2] = $90; + HEAP32[$53 >> 2] = $75; + } + } + } while (0); + HEAP32[$47 >> 2] = HEAP32[$48 >> 2]; + HEAP32[$47 + 4 >> 2] = HEAP32[$48 + 4 >> 2]; + HEAP32[$47 + 8 >> 2] = HEAP32[$48 + 8 >> 2]; + HEAP32[$48 >> 2] = 0; + HEAP32[$48 + 4 >> 2] = 0; + HEAP32[$48 + 8 >> 2] = 0; + return; +} + +function __ZNSt3__112__hash_tableINS_17__hash_value_typeIi12arControllerEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE8__rehashEj($this, $__nbc) { + $this = $this | 0; + $__nbc = $__nbc | 0; + var $$in = 0, $$in41 = 0, $$in41$lcssa = 0, $$lcssa = 0, $$lcssa56 = 0, $$lcssa58 = 0, $0 = 0, $10 = 0, $13 = 0, $14 = 0, $16 = 0, $21 = 0, $25 = 0, $29 = 0, $3 = 0, $31 = 0, $34 = 0, $36 = 0, $4 = 0, $51 = 0, $9 = 0, $__cp$0$in2736 = 0, $__cp$0$in30 = 0, $__cp$025 = 0, $__cp$02528 = 0, $__cp$0252833 = 0, $__cp$0252837 = 0, $__cp$02531 = 0, $__cp$026 = 0, $__cp$026$lcssa = 0, $__cp$026$lcssa53 = 0, $__i$039 = 0, $__np$0 = 0, $__np$0$lcssa = 0, $__phash$0$ph$ph35 = 0; + $0 = $this + 4 | 0; + L1 : do if (!$__nbc) { + $51 = HEAP32[$this >> 2] | 0; + HEAP32[$this >> 2] = 0; + if ($51) __ZdlPv($51); + HEAP32[$0 >> 2] = 0; + } else { + $3 = __Znwj($__nbc << 2) | 0; + $4 = HEAP32[$this >> 2] | 0; + HEAP32[$this >> 2] = $3; + if ($4) __ZdlPv($4); + HEAP32[$0 >> 2] = $__nbc; + if ($__nbc) { + $__i$039 = 0; + do { + HEAP32[(HEAP32[$this >> 2] | 0) + ($__i$039 << 2) >> 2] = 0; + $__i$039 = $__i$039 + 1 | 0; + } while (($__i$039 | 0) != ($__nbc | 0)); + } + $9 = $this + 8 | 0; + $10 = HEAP32[$9 >> 2] | 0; + if ($10) { + $13 = HEAP32[$10 + 4 >> 2] | 0; + $14 = $__nbc + -1 | 0; + $16 = ($14 & $__nbc | 0) == 0; + if ($16) $21 = $13 & $14; else $21 = ($13 >>> 0) % ($__nbc >>> 0) | 0; + HEAP32[(HEAP32[$this >> 2] | 0) + ($21 << 2) >> 2] = $9; + $__cp$0252833 = HEAP32[$10 >> 2] | 0; + if ($__cp$0252833) { + $$in = $10; + $__cp$0$in2736 = $10; + $__cp$0252837 = $__cp$0252833; + $__phash$0$ph$ph35 = $21; + while (1) { + $$in41 = $$in; + $__cp$0$in30 = $__cp$0$in2736; + $__cp$02531 = $__cp$0252837; + L21 : while (1) { + $__cp$026 = $__cp$02531; + while (1) { + $25 = HEAP32[$__cp$026 + 4 >> 2] | 0; + if ($16) $29 = $25 & $14; else $29 = ($25 >>> 0) % ($__nbc >>> 0) | 0; + if (($29 | 0) == ($__phash$0$ph$ph35 | 0)) { + $__cp$026$lcssa = $__cp$026; + break; + } + $31 = (HEAP32[$this >> 2] | 0) + ($29 << 2) | 0; + if (!(HEAP32[$31 >> 2] | 0)) { + $$in41$lcssa = $$in41; + $$lcssa56 = $29; + $$lcssa58 = $31; + $__cp$026$lcssa53 = $__cp$026; + break L21; + } + $34 = $__cp$026 + 8 | 0; + $__np$0 = $__cp$026; + while (1) { + $36 = HEAP32[$__np$0 >> 2] | 0; + if (!$36) { + $$lcssa = $36; + $__np$0$lcssa = $__np$0; + break; + } + if ((HEAP32[$34 >> 2] | 0) == (HEAP32[$36 + 8 >> 2] | 0)) $__np$0 = $36; else { + $$lcssa = $36; + $__np$0$lcssa = $__np$0; + break; + } + } + HEAP32[$$in41 >> 2] = $$lcssa; + HEAP32[$__np$0$lcssa >> 2] = HEAP32[HEAP32[(HEAP32[$this >> 2] | 0) + ($29 << 2) >> 2] >> 2]; + HEAP32[HEAP32[(HEAP32[$this >> 2] | 0) + ($29 << 2) >> 2] >> 2] = $__cp$026; + $__cp$026 = HEAP32[$__cp$0$in30 >> 2] | 0; + if (!$__cp$026) break L1; + } + $__cp$025 = HEAP32[$__cp$026$lcssa >> 2] | 0; + if (!$__cp$025) break L1; else { + $$in41 = $__cp$026$lcssa; + $__cp$0$in30 = $__cp$026$lcssa; + $__cp$02531 = $__cp$025; + } + } + HEAP32[$$lcssa58 >> 2] = $$in41$lcssa; + $__cp$02528 = HEAP32[$__cp$026$lcssa53 >> 2] | 0; + if (!$__cp$02528) break; else { + $$in = $__cp$026$lcssa53; + $__cp$0$in2736 = $__cp$026$lcssa53; + $__cp$0252837 = $__cp$02528; + $__phash$0$ph$ph35 = $$lcssa56; + } + } + } + } + } while (0); + return; +} + +function __ZNSt3__112__hash_tableINS_17__hash_value_typeIi7ARParamEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE8__rehashEj($this, $__nbc) { + $this = $this | 0; + $__nbc = $__nbc | 0; + var $$in = 0, $$in41 = 0, $$in41$lcssa = 0, $$lcssa = 0, $$lcssa56 = 0, $$lcssa58 = 0, $0 = 0, $10 = 0, $13 = 0, $14 = 0, $16 = 0, $21 = 0, $25 = 0, $29 = 0, $3 = 0, $31 = 0, $34 = 0, $36 = 0, $4 = 0, $51 = 0, $9 = 0, $__cp$0$in2736 = 0, $__cp$0$in30 = 0, $__cp$025 = 0, $__cp$02528 = 0, $__cp$0252833 = 0, $__cp$0252837 = 0, $__cp$02531 = 0, $__cp$026 = 0, $__cp$026$lcssa = 0, $__cp$026$lcssa53 = 0, $__i$039 = 0, $__np$0 = 0, $__np$0$lcssa = 0, $__phash$0$ph$ph35 = 0; + $0 = $this + 4 | 0; + L1 : do if (!$__nbc) { + $51 = HEAP32[$this >> 2] | 0; + HEAP32[$this >> 2] = 0; + if ($51) __ZdlPv($51); + HEAP32[$0 >> 2] = 0; + } else { + $3 = __Znwj($__nbc << 2) | 0; + $4 = HEAP32[$this >> 2] | 0; + HEAP32[$this >> 2] = $3; + if ($4) __ZdlPv($4); + HEAP32[$0 >> 2] = $__nbc; + if ($__nbc) { + $__i$039 = 0; + do { + HEAP32[(HEAP32[$this >> 2] | 0) + ($__i$039 << 2) >> 2] = 0; + $__i$039 = $__i$039 + 1 | 0; + } while (($__i$039 | 0) != ($__nbc | 0)); + } + $9 = $this + 8 | 0; + $10 = HEAP32[$9 >> 2] | 0; + if ($10) { + $13 = HEAP32[$10 + 4 >> 2] | 0; + $14 = $__nbc + -1 | 0; + $16 = ($14 & $__nbc | 0) == 0; + if ($16) $21 = $13 & $14; else $21 = ($13 >>> 0) % ($__nbc >>> 0) | 0; + HEAP32[(HEAP32[$this >> 2] | 0) + ($21 << 2) >> 2] = $9; + $__cp$0252833 = HEAP32[$10 >> 2] | 0; + if ($__cp$0252833) { + $$in = $10; + $__cp$0$in2736 = $10; + $__cp$0252837 = $__cp$0252833; + $__phash$0$ph$ph35 = $21; + while (1) { + $$in41 = $$in; + $__cp$0$in30 = $__cp$0$in2736; + $__cp$02531 = $__cp$0252837; + L21 : while (1) { + $__cp$026 = $__cp$02531; + while (1) { + $25 = HEAP32[$__cp$026 + 4 >> 2] | 0; + if ($16) $29 = $25 & $14; else $29 = ($25 >>> 0) % ($__nbc >>> 0) | 0; + if (($29 | 0) == ($__phash$0$ph$ph35 | 0)) { + $__cp$026$lcssa = $__cp$026; + break; + } + $31 = (HEAP32[$this >> 2] | 0) + ($29 << 2) | 0; + if (!(HEAP32[$31 >> 2] | 0)) { + $$in41$lcssa = $$in41; + $$lcssa56 = $29; + $$lcssa58 = $31; + $__cp$026$lcssa53 = $__cp$026; + break L21; + } + $34 = $__cp$026 + 8 | 0; + $__np$0 = $__cp$026; + while (1) { + $36 = HEAP32[$__np$0 >> 2] | 0; + if (!$36) { + $$lcssa = $36; + $__np$0$lcssa = $__np$0; + break; + } + if ((HEAP32[$34 >> 2] | 0) == (HEAP32[$36 + 8 >> 2] | 0)) $__np$0 = $36; else { + $$lcssa = $36; + $__np$0$lcssa = $__np$0; + break; + } + } + HEAP32[$$in41 >> 2] = $$lcssa; + HEAP32[$__np$0$lcssa >> 2] = HEAP32[HEAP32[(HEAP32[$this >> 2] | 0) + ($29 << 2) >> 2] >> 2]; + HEAP32[HEAP32[(HEAP32[$this >> 2] | 0) + ($29 << 2) >> 2] >> 2] = $__cp$026; + $__cp$026 = HEAP32[$__cp$0$in30 >> 2] | 0; + if (!$__cp$026) break L1; + } + $__cp$025 = HEAP32[$__cp$026$lcssa >> 2] | 0; + if (!$__cp$025) break L1; else { + $$in41 = $__cp$026$lcssa; + $__cp$0$in30 = $__cp$026$lcssa; + $__cp$02531 = $__cp$025; + } + } + HEAP32[$$lcssa58 >> 2] = $$in41$lcssa; + $__cp$02528 = HEAP32[$__cp$026$lcssa53 >> 2] | 0; + if (!$__cp$02528) break; else { + $$in = $__cp$026$lcssa53; + $__cp$0$in2736 = $__cp$026$lcssa53; + $__cp$0252837 = $__cp$02528; + $__phash$0$ph$ph35 = $$lcssa56; + } + } + } + } + } while (0); + return; +} + +function _arglCameraFrustum($cparam, $focalmin, $focalmax, $m_projection) { + $cparam = $cparam | 0; + $focalmin = +$focalmin; + $focalmax = +$focalmax; + $m_projection = $m_projection | 0; + var $0 = 0, $11 = 0, $17 = 0, $2 = 0, $23 = 0, $29 = 0, $33 = 0.0, $50 = 0.0, $63 = 0, $7 = 0.0, $75 = 0, $77 = 0.0, $84 = 0, $88 = 0.0, $90 = 0.0, $92 = 0.0, $94 = 0.0, $95 = 0, $96 = 0, $97 = 0.0, $98 = 0.0, $i$111 = 0, $i$29 = 0, $icpara = 0, $j$18 = 0, $p = 0, $q = 0, $trans = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 400 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $icpara = sp + 296 | 0; + $trans = sp + 200 | 0; + $p = sp + 128 | 0; + $q = sp; + $0 = HEAP32[$cparam >> 2] | 0; + $2 = HEAP32[$cparam + 4 >> 2] | 0; + if ((_arParamDecompMat($cparam + 8 | 0, $icpara, $trans) | 0) < 0) _arLog(3, 6024, sp + 392 | 0); else { + $7 = +($2 + -1 | 0); + $11 = $icpara + 32 | 0; + HEAPF64[$11 >> 3] = $7 * +HEAPF64[$icpara + 64 >> 3] - +HEAPF64[$11 >> 3]; + $17 = $icpara + 40 | 0; + HEAPF64[$17 >> 3] = $7 * +HEAPF64[$icpara + 72 >> 3] - +HEAPF64[$17 >> 3]; + $23 = $icpara + 48 | 0; + HEAPF64[$23 >> 3] = $7 * +HEAPF64[$icpara + 80 >> 3] - +HEAPF64[$23 >> 3]; + $29 = $icpara + 56 | 0; + HEAPF64[$29 >> 3] = $7 * +HEAPF64[$icpara + 88 >> 3] - +HEAPF64[$29 >> 3]; + $33 = +HEAPF64[$icpara + 80 >> 3]; + $i$111 = 0; + do { + HEAPF64[$p + ($i$111 * 24 | 0) >> 3] = +HEAPF64[$icpara + ($i$111 << 5) >> 3] / $33; + HEAPF64[$p + ($i$111 * 24 | 0) + 8 >> 3] = +HEAPF64[$icpara + ($i$111 << 5) + 8 >> 3] / $33; + HEAPF64[$p + ($i$111 * 24 | 0) + 16 >> 3] = +HEAPF64[$icpara + ($i$111 << 5) + 16 >> 3] / $33; + $i$111 = $i$111 + 1 | 0; + } while (($i$111 | 0) != 3); + $50 = +($0 + -1 | 0); + HEAPF64[$q >> 3] = +HEAPF64[$p >> 3] * 2.0 / $50; + HEAPF64[$q + 8 >> 3] = +HEAPF64[$p + 8 >> 3] * 2.0 / $50; + HEAPF64[$q + 16 >> 3] = +HEAPF64[$p + 16 >> 3] * 2.0 / $50 + -1.0; + $63 = $q + 24 | 0; + HEAP32[$63 >> 2] = 0; + HEAP32[$63 + 4 >> 2] = 0; + HEAP32[$63 + 8 >> 2] = 0; + HEAP32[$63 + 12 >> 2] = 0; + HEAPF64[$q + 40 >> 3] = +HEAPF64[$p + 32 >> 3] * 2.0 / $7; + HEAPF64[$q + 48 >> 3] = +HEAPF64[$p + 40 >> 3] * 2.0 / $7 + -1.0; + $75 = $q + 56 | 0; + $77 = $focalmax - $focalmin; + HEAP32[$75 >> 2] = 0; + HEAP32[$75 + 4 >> 2] = 0; + HEAP32[$75 + 8 >> 2] = 0; + HEAP32[$75 + 12 >> 2] = 0; + HEAP32[$75 + 16 >> 2] = 0; + HEAP32[$75 + 20 >> 2] = 0; + HEAPF64[$q + 80 >> 3] = ($focalmin + $focalmax) / $77; + HEAPF64[$q + 88 >> 3] = $focalmax * -2.0 * $focalmin / $77; + $84 = $q + 96 | 0; + HEAP32[$84 >> 2] = 0; + HEAP32[$84 + 4 >> 2] = 0; + HEAP32[$84 + 8 >> 2] = 0; + HEAP32[$84 + 12 >> 2] = 0; + HEAPF64[$q + 112 >> 3] = 1.0; + HEAPF64[$q + 120 >> 3] = 0.0; + $88 = +HEAPF64[$trans + 24 >> 3]; + $90 = +HEAPF64[$trans + 56 >> 3]; + $92 = +HEAPF64[$trans + 88 >> 3]; + $i$29 = 0; + do { + $94 = +HEAPF64[$q + ($i$29 << 5) >> 3]; + $95 = $q + ($i$29 << 5) + 8 | 0; + $96 = $q + ($i$29 << 5) + 16 | 0; + $97 = +HEAPF64[$95 >> 3]; + $98 = +HEAPF64[$96 >> 3]; + $j$18 = 0; + do { + HEAPF64[$m_projection + (($j$18 << 2) + $i$29 << 3) >> 3] = $94 * +HEAPF64[$trans + ($j$18 << 3) >> 3] + $97 * +HEAPF64[$trans + 32 + ($j$18 << 3) >> 3] + $98 * +HEAPF64[$trans + 64 + ($j$18 << 3) >> 3]; + $j$18 = $j$18 + 1 | 0; + } while (($j$18 | 0) != 3); + HEAPF64[$m_projection + ($i$29 + 12 << 3) >> 3] = +HEAPF64[$q + ($i$29 << 5) + 24 >> 3] + ($94 * $88 + +HEAPF64[$95 >> 3] * $90 + +HEAPF64[$96 >> 3] * $92); + $i$29 = $i$29 + 1 | 0; + } while (($i$29 | 0) != 4); + } + STACKTOP = sp; + return; +} + +function _arParamIdeal2Observ($dist_factor, $ix, $iy, $ox, $oy, $dist_function_version) { + $dist_factor = $dist_factor | 0; + $ix = +$ix; + $iy = +$iy; + $ox = $ox | 0; + $oy = $oy | 0; + $dist_function_version = $dist_function_version | 0; + var $$0 = 0, $10 = 0.0, $104 = 0.0, $116 = 0.0, $12 = 0.0, $122 = 0.0, $125 = 0.0, $126 = 0.0, $127 = 0, $130 = 0.0, $14 = 0.0, $141 = 0.0, $16 = 0.0, $19 = 0.0, $22 = 0.0, $25 = 0.0, $30 = 0.0, $4 = 0.0, $55 = 0.0, $58 = 0.0, $59 = 0.0, $6 = 0.0, $60 = 0, $63 = 0.0, $71 = 0.0, $8 = 0.0, $83 = 0.0, $90 = 0.0, $93 = 0.0, $94 = 0.0, $95 = 0, $98 = 0.0, $storemerge = 0.0, $storemerge6 = 0.0, $storemerge7 = 0.0; + switch ($dist_function_version | 0) { + case 4: + { + $4 = +HEAPF64[$dist_factor + 16 >> 3]; + $6 = +HEAPF64[$dist_factor + 24 >> 3]; + $8 = +HEAPF64[$dist_factor + 32 >> 3]; + $10 = +HEAPF64[$dist_factor + 40 >> 3]; + $12 = +HEAPF64[$dist_factor + 48 >> 3]; + $14 = +HEAPF64[$dist_factor + 56 >> 3]; + $16 = +HEAPF64[$dist_factor + 64 >> 3]; + $19 = ($ix - $12) * $16 / $8; + $22 = ($iy - $14) * $16 / $10; + $25 = $19 * $19 + $22 * $22; + $30 = +HEAPF64[$dist_factor >> 3] * $25 + 1.0 + $25 * (+HEAPF64[$dist_factor + 8 >> 3] * $25); + HEAPF64[$ox >> 3] = $12 + $8 * ($6 * ($19 * ($19 * 2.0) + $25) + ($4 * 2.0 * $19 * $22 + $19 * $30)); + HEAPF64[$oy >> 3] = $14 + $10 * ($6 * 2.0 * $19 * $22 + ($4 * ($25 + $22 * ($22 * 2.0)) + $22 * $30)); + $$0 = 0; + break; + } + case 3: + { + $55 = +HEAPF64[$dist_factor >> 3]; + $58 = +HEAPF64[$dist_factor + 16 >> 3]; + $59 = ($ix - $55) * $58; + $60 = $dist_factor + 8 | 0; + $63 = $58 * ($iy - +HEAPF64[$60 >> 3]); + if ($59 == 0.0 & $63 == 0.0) { + HEAPF64[$ox >> 3] = $55; + $storemerge7 = +HEAPF64[$60 >> 3]; + } else { + $71 = $59 * $59 + $63 * $63; + $83 = 1.0 - $71 * (+HEAPF64[$dist_factor + 32 >> 3] / 1.0e8) - $71 * ($71 * (+HEAPF64[$dist_factor + 40 >> 3] / 1.0e8 / 1.0e5)); + HEAPF64[$ox >> 3] = $55 + +HEAPF64[$dist_factor + 24 >> 3] * ($59 * $83); + $storemerge7 = +HEAPF64[$60 >> 3] + $63 * $83; + } + HEAPF64[$oy >> 3] = $storemerge7; + $$0 = 0; + break; + } + case 2: + { + $90 = +HEAPF64[$dist_factor >> 3]; + $93 = +HEAPF64[$dist_factor + 16 >> 3]; + $94 = ($ix - $90) * $93; + $95 = $dist_factor + 8 | 0; + $98 = $93 * ($iy - +HEAPF64[$95 >> 3]); + if ($94 == 0.0 & $98 == 0.0) { + HEAPF64[$ox >> 3] = $90; + $storemerge6 = +HEAPF64[$95 >> 3]; + } else { + $104 = $94 * $94 + $98 * $98; + $116 = 1.0 - $104 * (+HEAPF64[$dist_factor + 24 >> 3] / 1.0e8) - $104 * ($104 * (+HEAPF64[$dist_factor + 32 >> 3] / 1.0e8 / 1.0e5)); + HEAPF64[$ox >> 3] = $90 + $94 * $116; + $storemerge6 = +HEAPF64[$95 >> 3] + $98 * $116; + } + HEAPF64[$oy >> 3] = $storemerge6; + $$0 = 0; + break; + } + case 1: + { + $122 = +HEAPF64[$dist_factor >> 3]; + $125 = +HEAPF64[$dist_factor + 16 >> 3]; + $126 = ($ix - $122) * $125; + $127 = $dist_factor + 8 | 0; + $130 = $125 * ($iy - +HEAPF64[$127 >> 3]); + if ($126 == 0.0 & $130 == 0.0) { + HEAPF64[$ox >> 3] = $122; + $storemerge = +HEAPF64[$127 >> 3]; + } else { + $141 = 1.0 - ($126 * $126 + $130 * $130) * (+HEAPF64[$dist_factor + 24 >> 3] / 1.0e8); + HEAPF64[$ox >> 3] = $122 + $126 * $141; + $storemerge = +HEAPF64[$127 >> 3] + $130 * $141; + } + HEAPF64[$oy >> 3] = $storemerge; + $$0 = 0; + break; + } + default: + $$0 = -1; + } + return $$0 | 0; +} + +function __ZNSt3__112__hash_tableINS_17__hash_value_typeIi12arControllerEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE20__node_insert_uniqueEPNS_11__hash_nodeIS3_PvEE($agg$result, $this, $__nd) { + $agg$result = $agg$result | 0; + $this = $this | 0; + $__nd = $__nd | 0; + var $$pn = 0, $1 = 0, $13 = 0, $14 = 0, $18 = 0, $2 = 0, $22 = 0, $26 = 0, $29 = 0.0, $3 = 0, $32 = 0.0, $4 = 0, $41 = 0, $43 = 0, $46 = 0, $49 = 0, $5 = 0, $50 = 0, $51 = 0, $58 = 0, $6 = 0, $60 = 0, $64 = 0, $67 = 0, $68 = 0, $75 = 0, $8 = 0, $81 = 0, $__bc$0 = 0, $__chash$0 = 0, $__chash$1 = 0, $__ndptr$0 = 0, $__ndptr$1 = 0, label = 0; + $1 = HEAP32[$__nd + 8 >> 2] | 0; + $2 = $__nd + 4 | 0; + HEAP32[$2 >> 2] = $1; + $3 = $this + 4 | 0; + $4 = HEAP32[$3 >> 2] | 0; + $5 = ($4 | 0) == 0; + L1 : do if ($5) { + $__chash$0 = 0; + label = 12; + } else { + $6 = $4 + -1 | 0; + $8 = ($6 & $4 | 0) == 0; + if ($8) $13 = $6 & $1; else $13 = ($1 >>> 0) % ($4 >>> 0) | 0; + $14 = HEAP32[(HEAP32[$this >> 2] | 0) + ($13 << 2) >> 2] | 0; + if (!$14) { + $__chash$0 = $13; + label = 12; + } else { + $$pn = $14; + while (1) { + $__ndptr$0 = HEAP32[$$pn >> 2] | 0; + if (!$__ndptr$0) { + $__chash$0 = $13; + label = 12; + break L1; + } + $18 = HEAP32[$__ndptr$0 + 4 >> 2] | 0; + if ($8) $22 = $18 & $6; else $22 = ($18 >>> 0) % ($4 >>> 0) | 0; + if (($22 | 0) != ($13 | 0)) { + $__chash$0 = $13; + label = 12; + break L1; + } + if ((HEAP32[$__ndptr$0 + 8 >> 2] | 0) == ($1 | 0)) { + $81 = 0; + $__ndptr$1 = $__ndptr$0; + break; + } else $$pn = $__ndptr$0; + } + } + } while (0); + if ((label | 0) == 12) { + $26 = $this + 12 | 0; + $29 = +(((HEAP32[$26 >> 2] | 0) + 1 | 0) >>> 0); + $32 = +HEAPF32[$this + 16 >> 2]; + do if ($5 | $29 > +($4 >>> 0) * $32) { + if ($4 >>> 0 > 2) $41 = ($4 + -1 & $4 | 0) == 0; else $41 = 0; + $43 = ($41 & 1 | $4 << 1) ^ 1; + $46 = ~~+Math_ceil(+($29 / $32)) >>> 0; + __ZNSt3__112__hash_tableINS_17__hash_value_typeIi12arControllerEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE6rehashEj($this, $43 >>> 0 < $46 >>> 0 ? $46 : $43); + $49 = HEAP32[$3 >> 2] | 0; + $50 = HEAP32[$2 >> 2] | 0; + $51 = $49 + -1 | 0; + if (!($51 & $49)) { + $__bc$0 = $49; + $__chash$1 = $51 & $50; + break; + } else { + $__bc$0 = $49; + $__chash$1 = ($50 >>> 0) % ($49 >>> 0) | 0; + break; + } + } else { + $__bc$0 = $4; + $__chash$1 = $__chash$0; + } while (0); + $58 = HEAP32[(HEAP32[$this >> 2] | 0) + ($__chash$1 << 2) >> 2] | 0; + if (!$58) { + $60 = $this + 8 | 0; + HEAP32[$__nd >> 2] = HEAP32[$60 >> 2]; + HEAP32[$60 >> 2] = $__nd; + HEAP32[(HEAP32[$this >> 2] | 0) + ($__chash$1 << 2) >> 2] = $60; + $64 = HEAP32[$__nd >> 2] | 0; + if ($64) { + $67 = HEAP32[$64 + 4 >> 2] | 0; + $68 = $__bc$0 + -1 | 0; + if (!($68 & $__bc$0)) $75 = $67 & $68; else $75 = ($67 >>> 0) % ($__bc$0 >>> 0) | 0; + HEAP32[(HEAP32[$this >> 2] | 0) + ($75 << 2) >> 2] = $__nd; + } + } else { + HEAP32[$__nd >> 2] = HEAP32[$58 >> 2]; + HEAP32[$58 >> 2] = $__nd; + } + HEAP32[$26 >> 2] = (HEAP32[$26 >> 2] | 0) + 1; + $81 = 1; + $__ndptr$1 = $__nd; + } + HEAP32[$agg$result >> 2] = $__ndptr$1; + HEAP8[$agg$result + 4 >> 0] = $81; + return; +} + +function _scanexp($f, $pok) { + $f = $f | 0; + $pok = $pok | 0; + var $$lcssa22 = 0, $0 = 0, $1 = 0, $10 = 0, $11 = 0, $12 = 0, $2 = 0, $20 = 0, $35 = 0, $36 = 0, $48 = 0, $53 = 0, $54 = 0, $55 = 0, $56 = 0, $59 = 0, $61 = 0, $62 = 0, $63 = 0, $78 = 0, $91 = 0, $92 = 0, $93 = 0, $94 = 0, $98 = 0, $99 = 0, $c$0 = 0, $c$1$be = 0, $c$1$be$lcssa = 0, $c$112 = 0, $c$2$be = 0, $c$2$lcssa = 0, $c$27 = 0, $c$3$be = 0, $neg$0 = 0, $x$013 = 0; + $0 = $f + 4 | 0; + $1 = HEAP32[$0 >> 2] | 0; + $2 = $f + 100 | 0; + if ($1 >>> 0 < (HEAP32[$2 >> 2] | 0) >>> 0) { + HEAP32[$0 >> 2] = $1 + 1; + $10 = HEAPU8[$1 >> 0] | 0; + } else $10 = ___shgetc($f) | 0; + switch ($10 | 0) { + case 43: + case 45: + { + $11 = ($10 | 0) == 45 & 1; + $12 = HEAP32[$0 >> 2] | 0; + if ($12 >>> 0 < (HEAP32[$2 >> 2] | 0) >>> 0) { + HEAP32[$0 >> 2] = $12 + 1; + $20 = HEAPU8[$12 >> 0] | 0; + } else $20 = ___shgetc($f) | 0; + if (($pok | 0) != 0 & ($20 + -48 | 0) >>> 0 > 9) if (!(HEAP32[$2 >> 2] | 0)) { + $c$0 = $20; + $neg$0 = $11; + } else { + HEAP32[$0 >> 2] = (HEAP32[$0 >> 2] | 0) + -1; + $c$0 = $20; + $neg$0 = $11; + } else { + $c$0 = $20; + $neg$0 = $11; + } + break; + } + default: + { + $c$0 = $10; + $neg$0 = 0; + } + } + if (($c$0 + -48 | 0) >>> 0 > 9) if (!(HEAP32[$2 >> 2] | 0)) { + $98 = -2147483648; + $99 = 0; + } else { + HEAP32[$0 >> 2] = (HEAP32[$0 >> 2] | 0) + -1; + $98 = -2147483648; + $99 = 0; + } else { + $c$112 = $c$0; + $x$013 = 0; + while (1) { + $35 = $c$112 + -48 + ($x$013 * 10 | 0) | 0; + $36 = HEAP32[$0 >> 2] | 0; + if ($36 >>> 0 < (HEAP32[$2 >> 2] | 0) >>> 0) { + HEAP32[$0 >> 2] = $36 + 1; + $c$1$be = HEAPU8[$36 >> 0] | 0; + } else $c$1$be = ___shgetc($f) | 0; + if (($c$1$be + -48 | 0) >>> 0 < 10 & ($35 | 0) < 214748364) { + $c$112 = $c$1$be; + $x$013 = $35; + } else { + $$lcssa22 = $35; + $c$1$be$lcssa = $c$1$be; + break; + } + } + $48 = (($$lcssa22 | 0) < 0) << 31 >> 31; + if (($c$1$be$lcssa + -48 | 0) >>> 0 < 10) { + $53 = $$lcssa22; + $54 = $48; + $c$27 = $c$1$be$lcssa; + while (1) { + $55 = ___muldi3($53 | 0, $54 | 0, 10, 0) | 0; + $56 = tempRet0; + $59 = _i64Add($c$27 | 0, (($c$27 | 0) < 0) << 31 >> 31 | 0, -48, -1) | 0; + $61 = _i64Add($59 | 0, tempRet0 | 0, $55 | 0, $56 | 0) | 0; + $62 = tempRet0; + $63 = HEAP32[$0 >> 2] | 0; + if ($63 >>> 0 < (HEAP32[$2 >> 2] | 0) >>> 0) { + HEAP32[$0 >> 2] = $63 + 1; + $c$2$be = HEAPU8[$63 >> 0] | 0; + } else $c$2$be = ___shgetc($f) | 0; + if (($c$2$be + -48 | 0) >>> 0 < 10 & (($62 | 0) < 21474836 | ($62 | 0) == 21474836 & $61 >>> 0 < 2061584302)) { + $53 = $61; + $54 = $62; + $c$27 = $c$2$be; + } else { + $92 = $61; + $93 = $62; + $c$2$lcssa = $c$2$be; + break; + } + } + } else { + $92 = $$lcssa22; + $93 = $48; + $c$2$lcssa = $c$1$be$lcssa; + } + if (($c$2$lcssa + -48 | 0) >>> 0 < 10) do { + $78 = HEAP32[$0 >> 2] | 0; + if ($78 >>> 0 < (HEAP32[$2 >> 2] | 0) >>> 0) { + HEAP32[$0 >> 2] = $78 + 1; + $c$3$be = HEAPU8[$78 >> 0] | 0; + } else $c$3$be = ___shgetc($f) | 0; + } while (($c$3$be + -48 | 0) >>> 0 < 10); + if (HEAP32[$2 >> 2] | 0) HEAP32[$0 >> 2] = (HEAP32[$0 >> 2] | 0) + -1; + $91 = ($neg$0 | 0) != 0; + $94 = _i64Subtract(0, 0, $92 | 0, $93 | 0) | 0; + $98 = $91 ? tempRet0 : $93; + $99 = $91 ? $94 : $92; + } + tempRet0 = $98; + return $99 | 0; +} +function __ZNSt3__112__hash_tableINS_17__hash_value_typeIi7ARParamEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE20__node_insert_uniqueEPNS_11__hash_nodeIS3_PvEE($agg$result, $this, $__nd) { + $agg$result = $agg$result | 0; + $this = $this | 0; + $__nd = $__nd | 0; + var $$pn = 0, $1 = 0, $13 = 0, $14 = 0, $18 = 0, $2 = 0, $22 = 0, $26 = 0, $29 = 0.0, $3 = 0, $32 = 0.0, $4 = 0, $41 = 0, $43 = 0, $46 = 0, $49 = 0, $5 = 0, $50 = 0, $51 = 0, $58 = 0, $6 = 0, $60 = 0, $64 = 0, $67 = 0, $68 = 0, $75 = 0, $8 = 0, $81 = 0, $__bc$0 = 0, $__chash$0 = 0, $__chash$1 = 0, $__ndptr$0 = 0, $__ndptr$1 = 0, label = 0; + $1 = HEAP32[$__nd + 8 >> 2] | 0; + $2 = $__nd + 4 | 0; + HEAP32[$2 >> 2] = $1; + $3 = $this + 4 | 0; + $4 = HEAP32[$3 >> 2] | 0; + $5 = ($4 | 0) == 0; + L1 : do if ($5) { + $__chash$0 = 0; + label = 12; + } else { + $6 = $4 + -1 | 0; + $8 = ($6 & $4 | 0) == 0; + if ($8) $13 = $6 & $1; else $13 = ($1 >>> 0) % ($4 >>> 0) | 0; + $14 = HEAP32[(HEAP32[$this >> 2] | 0) + ($13 << 2) >> 2] | 0; + if (!$14) { + $__chash$0 = $13; + label = 12; + } else { + $$pn = $14; + while (1) { + $__ndptr$0 = HEAP32[$$pn >> 2] | 0; + if (!$__ndptr$0) { + $__chash$0 = $13; + label = 12; + break L1; + } + $18 = HEAP32[$__ndptr$0 + 4 >> 2] | 0; + if ($8) $22 = $18 & $6; else $22 = ($18 >>> 0) % ($4 >>> 0) | 0; + if (($22 | 0) != ($13 | 0)) { + $__chash$0 = $13; + label = 12; + break L1; + } + if ((HEAP32[$__ndptr$0 + 8 >> 2] | 0) == ($1 | 0)) { + $81 = 0; + $__ndptr$1 = $__ndptr$0; + break; + } else $$pn = $__ndptr$0; + } + } + } while (0); + if ((label | 0) == 12) { + $26 = $this + 12 | 0; + $29 = +(((HEAP32[$26 >> 2] | 0) + 1 | 0) >>> 0); + $32 = +HEAPF32[$this + 16 >> 2]; + do if ($5 | $29 > +($4 >>> 0) * $32) { + if ($4 >>> 0 > 2) $41 = ($4 + -1 & $4 | 0) == 0; else $41 = 0; + $43 = ($41 & 1 | $4 << 1) ^ 1; + $46 = ~~+Math_ceil(+($29 / $32)) >>> 0; + __ZNSt3__112__hash_tableINS_17__hash_value_typeIi7ARParamEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE6rehashEj($this, $43 >>> 0 < $46 >>> 0 ? $46 : $43); + $49 = HEAP32[$3 >> 2] | 0; + $50 = HEAP32[$2 >> 2] | 0; + $51 = $49 + -1 | 0; + if (!($51 & $49)) { + $__bc$0 = $49; + $__chash$1 = $51 & $50; + break; + } else { + $__bc$0 = $49; + $__chash$1 = ($50 >>> 0) % ($49 >>> 0) | 0; + break; + } + } else { + $__bc$0 = $4; + $__chash$1 = $__chash$0; + } while (0); + $58 = HEAP32[(HEAP32[$this >> 2] | 0) + ($__chash$1 << 2) >> 2] | 0; + if (!$58) { + $60 = $this + 8 | 0; + HEAP32[$__nd >> 2] = HEAP32[$60 >> 2]; + HEAP32[$60 >> 2] = $__nd; + HEAP32[(HEAP32[$this >> 2] | 0) + ($__chash$1 << 2) >> 2] = $60; + $64 = HEAP32[$__nd >> 2] | 0; + if ($64) { + $67 = HEAP32[$64 + 4 >> 2] | 0; + $68 = $__bc$0 + -1 | 0; + if (!($68 & $__bc$0)) $75 = $67 & $68; else $75 = ($67 >>> 0) % ($__bc$0 >>> 0) | 0; + HEAP32[(HEAP32[$this >> 2] | 0) + ($75 << 2) >> 2] = $__nd; + } + } else { + HEAP32[$__nd >> 2] = HEAP32[$58 >> 2]; + HEAP32[$58 >> 2] = $__nd; + } + HEAP32[$26 >> 2] = (HEAP32[$26 >> 2] | 0) + 1; + $81 = 1; + $__ndptr$1 = $__nd; + } + HEAP32[$agg$result >> 2] = $__ndptr$1; + HEAP8[$agg$result + 4 >> 0] = $81; + return; +} + +function _arGetLine($x_coord, $y_coord, $coord_num, $vertex, $paramLTf, $line, $v) { + $x_coord = $x_coord | 0; + $y_coord = $y_coord | 0; + $coord_num = $coord_num | 0; + $vertex = $vertex | 0; + $paramLTf = $paramLTf | 0; + $line = $line | 0; + $v = $v | 0; + var $$0 = 0, $0 = 0, $1 = 0, $12 = 0.0, $15 = 0, $19 = 0, $2 = 0, $20 = 0, $21 = 0, $23 = 0, $34 = 0, $35 = 0, $45 = 0, $47 = 0.0, $5 = 0, $50 = 0.0, $52 = 0, $63 = 0, $64 = 0, $67 = 0.0, $69 = 0, $7 = 0, $72 = 0.0, $74 = 0.0, $77 = 0, $80 = 0, $97 = 0, $i$011 = 0, $i$19 = 0, $j$010 = 0, $m0 = 0, $m1 = 0, label = 0, sp = 0, $i$011$looptemp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $m0 = sp + 4 | 0; + $m1 = sp; + $0 = _arVecAlloc(2) | 0; + $1 = _arVecAlloc(2) | 0; + $2 = _arMatrixAlloc(2, 2) | 0; + $i$011 = 0; + L1 : while (1) { + $i$011$looptemp = $i$011; + $i$011 = $i$011 + 1 | 0; + $5 = HEAP32[$vertex + ($i$011 << 2) >> 2] | 0; + $7 = HEAP32[$vertex + ($i$011$looptemp << 2) >> 2] | 0; + $12 = +($5 + 1 - $7 | 0) * .05 + .5; + $15 = ~~(+($7 | 0) + $12); + $19 = ~~(+($5 | 0) - $12) - $15 | 0; + $20 = $19 + 1 | 0; + $21 = _arMatrixAlloc($20, 2) | 0; + if (($19 | 0) > -1) { + $j$010 = 0; + do { + $23 = $j$010 + $15 | 0; + if ((_arParamObserv2IdealLTf($paramLTf, +(HEAP32[$x_coord + ($23 << 2) >> 2] | 0), +(HEAP32[$y_coord + ($23 << 2) >> 2] | 0), $m0, $m1) | 0) < 0) { + $97 = $21; + label = 10; + break L1; + } + $34 = $j$010 << 1; + $35 = HEAP32[$21 >> 2] | 0; + HEAPF64[$35 + ($34 << 3) >> 3] = +HEAPF32[$m0 >> 2]; + HEAPF64[$35 + (($34 | 1) << 3) >> 3] = +HEAPF32[$m1 >> 2]; + $j$010 = $j$010 + 1 | 0; + } while (($j$010 | 0) < ($20 | 0)); + } + if ((_arMatrixPCA($21, $2, $0, $1) | 0) < 0) { + $97 = $21; + label = 10; + break; + } + $45 = HEAP32[$2 >> 2] | 0; + $47 = +HEAPF64[$45 + 8 >> 3]; + HEAPF64[$line + ($i$011$looptemp * 24 | 0) >> 3] = $47; + $50 = -+HEAPF64[$45 >> 3]; + HEAPF64[$line + ($i$011$looptemp * 24 | 0) + 8 >> 3] = $50; + $52 = HEAP32[$1 >> 2] | 0; + HEAPF64[$line + ($i$011$looptemp * 24 | 0) + 16 >> 3] = -($47 * +HEAPF64[$52 >> 3] + +HEAPF64[$52 + 8 >> 3] * $50); + _arMatrixFree($21) | 0; + if (($i$011 | 0) >= 4) { + label = 7; + break; + } + } + L9 : do if ((label | 0) == 7) { + _arMatrixFree($2) | 0; + _arVecFree($1) | 0; + _arVecFree($0) | 0; + $i$19 = 0; + while (1) { + $63 = ($i$19 + 3 | 0) % 4 | 0; + $64 = $line + ($63 * 24 | 0) | 0; + $67 = +HEAPF64[$line + ($i$19 * 24 | 0) + 8 >> 3]; + $69 = $line + ($i$19 * 24 | 0) | 0; + $72 = +HEAPF64[$line + ($63 * 24 | 0) + 8 >> 3]; + $74 = +HEAPF64[$64 >> 3] * $67 - +HEAPF64[$69 >> 3] * $72; + if (+Math_abs(+$74) < .0001) { + $$0 = -1; + break L9; + } + $77 = $line + ($i$19 * 24 | 0) + 16 | 0; + $80 = $line + ($63 * 24 | 0) + 16 | 0; + HEAPF64[$v + ($i$19 << 4) >> 3] = ($72 * +HEAPF64[$77 >> 3] - $67 * +HEAPF64[$80 >> 3]) / $74; + HEAPF64[$v + ($i$19 << 4) + 8 >> 3] = (+HEAPF64[$69 >> 3] * +HEAPF64[$80 >> 3] - +HEAPF64[$64 >> 3] * +HEAPF64[$77 >> 3]) / $74; + $i$19 = $i$19 + 1 | 0; + if (($i$19 | 0) >= 4) { + $$0 = 0; + break; + } + } + } else if ((label | 0) == 10) { + _arMatrixFree($97) | 0; + _arMatrixFree($2) | 0; + _arVecFree($1) | 0; + _arVecFree($0) | 0; + $$0 = -1; + } while (0); + STACKTOP = sp; + return $$0 | 0; +} + +function ___stpncpy($d, $s, $n) { + $d = $d | 0; + $s = $s | 0; + $n = $n | 0; + var $$0$lcssa = 0, $$0$lcssa60 = 0, $$031 = 0, $$04$lcssa = 0, $$04$lcssa61 = 0, $$0430 = 0, $$06$lcssa = 0, $$06$lcssa62 = 0, $$0629 = 0, $$1$lcssa = 0, $$117 = 0, $$15$ph = 0, $$1511 = 0, $$17$ph = 0, $$1710 = 0, $$2$ph = 0, $$212 = 0, $$28 = 0, $$3 = 0, $$lcssa = 0, $0 = 0, $10 = 0, $11 = 0, $12 = 0, $16 = 0, $20 = 0, $26 = 0, $27 = 0, $28 = 0, $31 = 0, $35 = 0, $7 = 0, $8 = 0, $wd$0$lcssa = 0, $wd$018 = 0, $ws$0$lcssa = 0, $ws$019 = 0, label = 0; + $0 = $s; + do if (!(($0 ^ $d) & 3)) { + $7 = ($n | 0) != 0; + L3 : do if ($7 & ($0 & 3 | 0) != 0) { + $$031 = $n; + $$0430 = $s; + $$0629 = $d; + while (1) { + $8 = HEAP8[$$0430 >> 0] | 0; + HEAP8[$$0629 >> 0] = $8; + if (!($8 << 24 >> 24)) { + $$0$lcssa60 = $$031; + $$04$lcssa61 = $$0430; + $$06$lcssa62 = $$0629; + break L3; + } + $10 = $$031 + -1 | 0; + $11 = $$0430 + 1 | 0; + $12 = $$0629 + 1 | 0; + $16 = ($10 | 0) != 0; + if ($16 & ($11 & 3 | 0) != 0) { + $$031 = $10; + $$0430 = $11; + $$0629 = $12; + } else { + $$0$lcssa = $10; + $$04$lcssa = $11; + $$06$lcssa = $12; + $$lcssa = $16; + label = 5; + break; + } + } + } else { + $$0$lcssa = $n; + $$04$lcssa = $s; + $$06$lcssa = $d; + $$lcssa = $7; + label = 5; + } while (0); + if ((label | 0) == 5) if ($$lcssa) { + $$0$lcssa60 = $$0$lcssa; + $$04$lcssa61 = $$04$lcssa; + $$06$lcssa62 = $$06$lcssa; + } else { + $$28 = $$06$lcssa; + $$3 = 0; + break; + } + if (!(HEAP8[$$04$lcssa61 >> 0] | 0)) { + $$28 = $$06$lcssa62; + $$3 = $$0$lcssa60; + } else { + L11 : do if ($$0$lcssa60 >>> 0 > 3) { + $$117 = $$0$lcssa60; + $wd$018 = $$06$lcssa62; + $ws$019 = $$04$lcssa61; + while (1) { + $20 = HEAP32[$ws$019 >> 2] | 0; + if (($20 & -2139062144 ^ -2139062144) & $20 + -16843009) { + $$1$lcssa = $$117; + $wd$0$lcssa = $wd$018; + $ws$0$lcssa = $ws$019; + break L11; + } + HEAP32[$wd$018 >> 2] = $20; + $26 = $$117 + -4 | 0; + $27 = $ws$019 + 4 | 0; + $28 = $wd$018 + 4 | 0; + if ($26 >>> 0 > 3) { + $$117 = $26; + $wd$018 = $28; + $ws$019 = $27; + } else { + $$1$lcssa = $26; + $wd$0$lcssa = $28; + $ws$0$lcssa = $27; + break; + } + } + } else { + $$1$lcssa = $$0$lcssa60; + $wd$0$lcssa = $$06$lcssa62; + $ws$0$lcssa = $$04$lcssa61; + } while (0); + $$15$ph = $ws$0$lcssa; + $$17$ph = $wd$0$lcssa; + $$2$ph = $$1$lcssa; + label = 11; + } + } else { + $$15$ph = $s; + $$17$ph = $d; + $$2$ph = $n; + label = 11; + } while (0); + L16 : do if ((label | 0) == 11) if (!$$2$ph) { + $$28 = $$17$ph; + $$3 = 0; + } else { + $$1511 = $$15$ph; + $$1710 = $$17$ph; + $$212 = $$2$ph; + while (1) { + $31 = HEAP8[$$1511 >> 0] | 0; + HEAP8[$$1710 >> 0] = $31; + if (!($31 << 24 >> 24)) { + $$28 = $$1710; + $$3 = $$212; + break L16; + } + $$212 = $$212 + -1 | 0; + $35 = $$1710 + 1 | 0; + if (!$$212) { + $$28 = $35; + $$3 = 0; + break; + } else { + $$1511 = $$1511 + 1 | 0; + $$1710 = $35; + } + } + } while (0); + _memset($$28 | 0, 0, $$3 | 0) | 0; + return $$28 | 0; +} + +function ___stdio_write($f, $buf, $len) { + $f = $f | 0; + $buf = $buf | 0; + $len = $len | 0; + var $$0 = 0, $0 = 0, $1 = 0, $10 = 0, $11 = 0, $16 = 0, $21 = 0, $26 = 0, $3 = 0, $35 = 0, $37 = 0, $39 = 0, $50 = 0, $6 = 0, $cnt$0 = 0, $cnt$1 = 0, $iov$0 = 0, $iov$0$lcssa11 = 0, $iov$1 = 0, $iovcnt$0 = 0, $iovcnt$0$lcssa12 = 0, $iovcnt$1 = 0, $iovs = 0, $rem$0 = 0, $vararg_buffer = 0, $vararg_buffer3 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 48 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer3 = sp + 16 | 0; + $vararg_buffer = sp; + $iovs = sp + 32 | 0; + $0 = $f + 28 | 0; + $1 = HEAP32[$0 >> 2] | 0; + HEAP32[$iovs >> 2] = $1; + $3 = $f + 20 | 0; + $6 = (HEAP32[$3 >> 2] | 0) - $1 | 0; + HEAP32[$iovs + 4 >> 2] = $6; + HEAP32[$iovs + 8 >> 2] = $buf; + HEAP32[$iovs + 12 >> 2] = $len; + $10 = $f + 60 | 0; + $11 = $f + 44 | 0; + $iov$0 = $iovs; + $iovcnt$0 = 2; + $rem$0 = $6 + $len | 0; + while (1) { + if (!(HEAP32[597] | 0)) { + HEAP32[$vararg_buffer3 >> 2] = HEAP32[$10 >> 2]; + HEAP32[$vararg_buffer3 + 4 >> 2] = $iov$0; + HEAP32[$vararg_buffer3 + 8 >> 2] = $iovcnt$0; + $cnt$0 = ___syscall_ret(___syscall146(146, $vararg_buffer3 | 0) | 0) | 0; + } else { + _pthread_cleanup_push(14, $f | 0); + HEAP32[$vararg_buffer >> 2] = HEAP32[$10 >> 2]; + HEAP32[$vararg_buffer + 4 >> 2] = $iov$0; + HEAP32[$vararg_buffer + 8 >> 2] = $iovcnt$0; + $16 = ___syscall_ret(___syscall146(146, $vararg_buffer | 0) | 0) | 0; + _pthread_cleanup_pop(0); + $cnt$0 = $16; + } + if (($rem$0 | 0) == ($cnt$0 | 0)) { + label = 6; + break; + } + if (($cnt$0 | 0) < 0) { + $iov$0$lcssa11 = $iov$0; + $iovcnt$0$lcssa12 = $iovcnt$0; + label = 8; + break; + } + $35 = $rem$0 - $cnt$0 | 0; + $37 = HEAP32[$iov$0 + 4 >> 2] | 0; + if ($cnt$0 >>> 0 > $37 >>> 0) { + $39 = HEAP32[$11 >> 2] | 0; + HEAP32[$0 >> 2] = $39; + HEAP32[$3 >> 2] = $39; + $50 = HEAP32[$iov$0 + 12 >> 2] | 0; + $cnt$1 = $cnt$0 - $37 | 0; + $iov$1 = $iov$0 + 8 | 0; + $iovcnt$1 = $iovcnt$0 + -1 | 0; + } else if (($iovcnt$0 | 0) == 2) { + HEAP32[$0 >> 2] = (HEAP32[$0 >> 2] | 0) + $cnt$0; + $50 = $37; + $cnt$1 = $cnt$0; + $iov$1 = $iov$0; + $iovcnt$1 = 2; + } else { + $50 = $37; + $cnt$1 = $cnt$0; + $iov$1 = $iov$0; + $iovcnt$1 = $iovcnt$0; + } + HEAP32[$iov$1 >> 2] = (HEAP32[$iov$1 >> 2] | 0) + $cnt$1; + HEAP32[$iov$1 + 4 >> 2] = $50 - $cnt$1; + $iov$0 = $iov$1; + $iovcnt$0 = $iovcnt$1; + $rem$0 = $35; + } + if ((label | 0) == 6) { + $21 = HEAP32[$11 >> 2] | 0; + HEAP32[$f + 16 >> 2] = $21 + (HEAP32[$f + 48 >> 2] | 0); + $26 = $21; + HEAP32[$0 >> 2] = $26; + HEAP32[$3 >> 2] = $26; + $$0 = $len; + } else if ((label | 0) == 8) { + HEAP32[$f + 16 >> 2] = 0; + HEAP32[$0 >> 2] = 0; + HEAP32[$3 >> 2] = 0; + HEAP32[$f >> 2] = HEAP32[$f >> 2] | 32; + if (($iovcnt$0$lcssa12 | 0) == 2) $$0 = 0; else $$0 = $len - (HEAP32[$iov$0$lcssa11 + 4 >> 2] | 0) | 0; + } + STACKTOP = sp; + return $$0 | 0; +} + +function _pop_arg($arg, $type, $ap) { + $arg = $arg | 0; + $type = $type | 0; + $ap = $ap | 0; + var $105 = 0, $106 = 0.0, $112 = 0, $113 = 0.0, $13 = 0, $14 = 0, $17 = 0, $26 = 0, $27 = 0, $28 = 0, $37 = 0, $38 = 0, $40 = 0, $43 = 0, $44 = 0, $53 = 0, $54 = 0, $56 = 0, $59 = 0, $6 = 0, $68 = 0, $69 = 0, $7 = 0, $70 = 0, $79 = 0, $80 = 0, $82 = 0, $85 = 0, $94 = 0, $95 = 0, $96 = 0; + L1 : do if ($type >>> 0 <= 20) do switch ($type | 0) { + case 9: + { + $6 = (HEAP32[$ap >> 2] | 0) + (4 - 1) & ~(4 - 1); + $7 = HEAP32[$6 >> 2] | 0; + HEAP32[$ap >> 2] = $6 + 4; + HEAP32[$arg >> 2] = $7; + break L1; + break; + } + case 10: + { + $13 = (HEAP32[$ap >> 2] | 0) + (4 - 1) & ~(4 - 1); + $14 = HEAP32[$13 >> 2] | 0; + HEAP32[$ap >> 2] = $13 + 4; + $17 = $arg; + HEAP32[$17 >> 2] = $14; + HEAP32[$17 + 4 >> 2] = (($14 | 0) < 0) << 31 >> 31; + break L1; + break; + } + case 11: + { + $26 = (HEAP32[$ap >> 2] | 0) + (4 - 1) & ~(4 - 1); + $27 = HEAP32[$26 >> 2] | 0; + HEAP32[$ap >> 2] = $26 + 4; + $28 = $arg; + HEAP32[$28 >> 2] = $27; + HEAP32[$28 + 4 >> 2] = 0; + break L1; + break; + } + case 12: + { + $37 = (HEAP32[$ap >> 2] | 0) + (8 - 1) & ~(8 - 1); + $38 = $37; + $40 = HEAP32[$38 >> 2] | 0; + $43 = HEAP32[$38 + 4 >> 2] | 0; + HEAP32[$ap >> 2] = $37 + 8; + $44 = $arg; + HEAP32[$44 >> 2] = $40; + HEAP32[$44 + 4 >> 2] = $43; + break L1; + break; + } + case 13: + { + $53 = (HEAP32[$ap >> 2] | 0) + (4 - 1) & ~(4 - 1); + $54 = HEAP32[$53 >> 2] | 0; + HEAP32[$ap >> 2] = $53 + 4; + $56 = ($54 & 65535) << 16 >> 16; + $59 = $arg; + HEAP32[$59 >> 2] = $56; + HEAP32[$59 + 4 >> 2] = (($56 | 0) < 0) << 31 >> 31; + break L1; + break; + } + case 14: + { + $68 = (HEAP32[$ap >> 2] | 0) + (4 - 1) & ~(4 - 1); + $69 = HEAP32[$68 >> 2] | 0; + HEAP32[$ap >> 2] = $68 + 4; + $70 = $arg; + HEAP32[$70 >> 2] = $69 & 65535; + HEAP32[$70 + 4 >> 2] = 0; + break L1; + break; + } + case 15: + { + $79 = (HEAP32[$ap >> 2] | 0) + (4 - 1) & ~(4 - 1); + $80 = HEAP32[$79 >> 2] | 0; + HEAP32[$ap >> 2] = $79 + 4; + $82 = ($80 & 255) << 24 >> 24; + $85 = $arg; + HEAP32[$85 >> 2] = $82; + HEAP32[$85 + 4 >> 2] = (($82 | 0) < 0) << 31 >> 31; + break L1; + break; + } + case 16: + { + $94 = (HEAP32[$ap >> 2] | 0) + (4 - 1) & ~(4 - 1); + $95 = HEAP32[$94 >> 2] | 0; + HEAP32[$ap >> 2] = $94 + 4; + $96 = $arg; + HEAP32[$96 >> 2] = $95 & 255; + HEAP32[$96 + 4 >> 2] = 0; + break L1; + break; + } + case 17: + { + $105 = (HEAP32[$ap >> 2] | 0) + (8 - 1) & ~(8 - 1); + $106 = +HEAPF64[$105 >> 3]; + HEAP32[$ap >> 2] = $105 + 8; + HEAPF64[$arg >> 3] = $106; + break L1; + break; + } + case 18: + { + $112 = (HEAP32[$ap >> 2] | 0) + (8 - 1) & ~(8 - 1); + $113 = +HEAPF64[$112 >> 3]; + HEAP32[$ap >> 2] = $112 + 8; + HEAPF64[$arg >> 3] = $113; + break L1; + break; + } + default: + break L1; + } while (0); while (0); + return; +} + +function _arPattCreateHandle2($pattSize, $patternCountMax) { + $pattSize = $pattSize | 0; + $patternCountMax = $patternCountMax | 0; + var $$0 = 0, $10 = 0, $11 = 0, $14 = 0, $15 = 0, $17 = 0, $18 = 0, $2 = 0, $21 = 0, $24 = 0, $25 = 0, $26 = 0, $29 = 0, $31 = 0, $32 = 0, $35 = 0, $7 = 0, $i$04 = 0, $j$0 = 0, $vararg_buffer = 0, $vararg_buffer1 = 0, $vararg_buffer11 = 0, $vararg_buffer13 = 0, $vararg_buffer3 = 0, $vararg_buffer5 = 0, $vararg_buffer7 = 0, $vararg_buffer9 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 64 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer13 = sp + 56 | 0; + $vararg_buffer11 = sp + 48 | 0; + $vararg_buffer9 = sp + 40 | 0; + $vararg_buffer7 = sp + 32 | 0; + $vararg_buffer5 = sp + 24 | 0; + $vararg_buffer3 = sp + 16 | 0; + $vararg_buffer1 = sp + 8 | 0; + $vararg_buffer = sp; + L1 : do if (($pattSize + -16 | 0) >>> 0 > 48 | ($patternCountMax | 0) < 1) $$0 = 0; else { + $2 = _malloc(32) | 0; + if (!$2) { + _arLog(3, 5471, $vararg_buffer); + _exit(1); + } + HEAP32[$2 >> 2] = 0; + HEAP32[$2 + 4 >> 2] = $patternCountMax; + HEAP32[$2 + 28 >> 2] = $pattSize; + $7 = _malloc($patternCountMax << 2) | 0; + HEAP32[$2 + 8 >> 2] = $7; + if (!$7) { + _arLog(3, 5471, $vararg_buffer1); + _exit(1); + } + $10 = $patternCountMax << 4; + $11 = _malloc($10) | 0; + HEAP32[$2 + 12 >> 2] = $11; + if (!$11) { + _arLog(3, 5471, $vararg_buffer3); + _exit(1); + } + $14 = _malloc($10) | 0; + $15 = $2 + 20 | 0; + HEAP32[$15 >> 2] = $14; + if (!$14) { + _arLog(3, 5471, $vararg_buffer5); + _exit(1); + } + $17 = $patternCountMax << 5; + $18 = _malloc($17) | 0; + HEAP32[$2 + 16 >> 2] = $18; + if (!$18) { + _arLog(3, 5471, $vararg_buffer7); + _exit(1); + } + $21 = _malloc($17) | 0; + HEAP32[$2 + 24 >> 2] = $21; + if (!$21) { + _arLog(3, 5471, $vararg_buffer9); + _exit(1); + } + $24 = Math_imul($pattSize, $pattSize) | 0; + $25 = $24 * 12 | 0; + $26 = $24 << 2; + if (($patternCountMax | 0) > 0) { + $i$04 = 0; + L21 : while (1) { + HEAP32[$7 + ($i$04 << 2) >> 2] = 0; + $29 = $i$04 << 2; + $j$0 = 0; + while (1) { + if (($j$0 | 0) >= 4) break; + $31 = _malloc($25) | 0; + $32 = $j$0 + $29 | 0; + HEAP32[$11 + ($32 << 2) >> 2] = $31; + if (!$31) { + label = 18; + break L21; + } + $35 = _malloc($26) | 0; + HEAP32[(HEAP32[$15 >> 2] | 0) + ($32 << 2) >> 2] = $35; + if (!$35) { + label = 20; + break L21; + } else $j$0 = $j$0 + 1 | 0; + } + $i$04 = $i$04 + 1 | 0; + if (($i$04 | 0) >= ($patternCountMax | 0)) { + $$0 = $2; + break L1; + } + } + if ((label | 0) == 18) { + _arLog(3, 5471, $vararg_buffer11); + _exit(1); + } else if ((label | 0) == 20) { + _arLog(3, 5471, $vararg_buffer13); + _exit(1); + } + } else $$0 = $2; + } while (0); + STACKTOP = sp; + return $$0 | 0; +} + +function _arParamChangeSize($source, $xsize, $ysize, $newparam) { + $source = $source | 0; + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $newparam = $newparam | 0; + var $$0 = 0, $23 = 0, $3 = 0.0, $8 = 0.0, $i$01 = 0, label = 0; + $3 = +($xsize | 0) / +(HEAP32[$source >> 2] | 0); + $8 = +($ysize | 0) / +(HEAP32[$source + 4 >> 2] | 0); + HEAP32[$newparam >> 2] = $xsize; + HEAP32[$newparam + 4 >> 2] = $ysize; + $i$01 = 0; + do { + HEAPF64[$newparam + 8 + ($i$01 << 3) >> 3] = $3 * +HEAPF64[$source + 8 + ($i$01 << 3) >> 3]; + HEAPF64[$newparam + 40 + ($i$01 << 3) >> 3] = $8 * +HEAPF64[$source + 40 + ($i$01 << 3) >> 3]; + HEAPF64[$newparam + 72 + ($i$01 << 3) >> 3] = +HEAPF64[$source + 72 + ($i$01 << 3) >> 3]; + $i$01 = $i$01 + 1 | 0; + } while (($i$01 | 0) != 4); + $23 = HEAP32[$source + 176 >> 2] | 0; + switch ($23 | 0) { + case 4: + { + HEAPF64[$newparam + 104 >> 3] = +HEAPF64[$source + 104 >> 3]; + HEAPF64[$newparam + 112 >> 3] = +HEAPF64[$source + 112 >> 3]; + HEAPF64[$newparam + 120 >> 3] = +HEAPF64[$source + 120 >> 3]; + HEAPF64[$newparam + 128 >> 3] = +HEAPF64[$source + 128 >> 3]; + HEAPF64[$newparam + 136 >> 3] = $3 * +HEAPF64[$source + 136 >> 3]; + HEAPF64[$newparam + 144 >> 3] = $8 * +HEAPF64[$source + 144 >> 3]; + HEAPF64[$newparam + 152 >> 3] = $3 * +HEAPF64[$source + 152 >> 3]; + HEAPF64[$newparam + 160 >> 3] = $8 * +HEAPF64[$source + 160 >> 3]; + HEAPF64[$newparam + 168 >> 3] = +HEAPF64[$source + 168 >> 3]; + label = 8; + break; + } + case 3: + { + HEAPF64[$newparam + 104 >> 3] = $3 * +HEAPF64[$source + 104 >> 3]; + HEAPF64[$newparam + 112 >> 3] = $8 * +HEAPF64[$source + 112 >> 3]; + HEAPF64[$newparam + 120 >> 3] = +HEAPF64[$source + 120 >> 3]; + HEAPF64[$newparam + 128 >> 3] = +HEAPF64[$source + 128 >> 3]; + HEAPF64[$newparam + 136 >> 3] = +HEAPF64[$source + 136 >> 3] / ($3 * $8); + HEAPF64[$newparam + 144 >> 3] = +HEAPF64[$source + 144 >> 3] / ($8 * ($3 * $3 * $8)); + label = 8; + break; + } + case 2: + { + HEAPF64[$newparam + 104 >> 3] = $3 * +HEAPF64[$source + 104 >> 3]; + HEAPF64[$newparam + 112 >> 3] = $8 * +HEAPF64[$source + 112 >> 3]; + HEAPF64[$newparam + 120 >> 3] = +HEAPF64[$source + 120 >> 3]; + HEAPF64[$newparam + 128 >> 3] = +HEAPF64[$source + 128 >> 3] / ($3 * $8); + HEAPF64[$newparam + 136 >> 3] = +HEAPF64[$source + 136 >> 3] / ($8 * ($3 * $3 * $8)); + label = 8; + break; + } + case 1: + { + HEAPF64[$newparam + 104 >> 3] = $3 * +HEAPF64[$source + 104 >> 3]; + HEAPF64[$newparam + 112 >> 3] = $8 * +HEAPF64[$source + 112 >> 3]; + HEAPF64[$newparam + 120 >> 3] = +HEAPF64[$source + 120 >> 3]; + HEAPF64[$newparam + 128 >> 3] = +HEAPF64[$source + 128 >> 3] / ($3 * $8); + label = 8; + break; + } + default: + $$0 = -1; + } + if ((label | 0) == 8) { + HEAP32[$newparam + 176 >> 2] = $23; + $$0 = 0; + } + return $$0 | 0; +} + +function _icpUpdateMat($matXw2Xc, $dS) { + $matXw2Xc = $matXw2Xc | 0; + $dS = $dS | 0; + var $$sink$i = 0.0, $$sink1$i = 0.0, $0 = 0.0, $11 = 0.0, $16 = 0.0, $18 = 0.0, $20 = 0.0, $21 = 0.0, $22 = 0.0, $23 = 0.0, $25 = 0.0, $29 = 0.0, $3 = 0.0, $30 = 0.0, $31 = 0.0, $35 = 0.0, $36 = 0.0, $47 = 0.0, $48 = 0.0, $64 = 0.0, $65 = 0.0, $66 = 0.0, $7 = 0.0, $82 = 0, $9 = 0.0, $i$08 = 0, $j$09 = 0, $j$17 = 0, $mat = 0, $mat2 = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 192 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $mat = sp + 96 | 0; + $mat2 = sp; + $0 = +HEAPF64[$dS >> 3]; + $3 = +HEAPF64[$dS + 8 >> 3]; + $7 = +HEAPF64[$dS + 16 >> 3]; + $9 = $0 * $0 + $3 * $3 + $7 * $7; + if ($9 == 0.0) { + $$sink$i = 0.0; + $$sink1$i = 0.0; + $25 = 1.0; + $29 = 0.0; + } else { + $11 = +Math_sqrt(+$9); + $$sink$i = $11; + $$sink1$i = $7 / $11; + $25 = $0 / $11; + $29 = $3 / $11; + } + $16 = +HEAPF64[$dS + 24 >> 3]; + $18 = +HEAPF64[$dS + 32 >> 3]; + $20 = +HEAPF64[$dS + 40 >> 3]; + $21 = +Math_cos(+$$sink$i); + $22 = 1.0 - $21; + $23 = +Math_sin(+$$sink$i); + HEAPF64[$mat >> 3] = $21 + $25 * $25 * $22; + $30 = $29 * $25 * $22; + $31 = $$sink1$i * $23; + HEAPF64[$mat + 8 >> 3] = $30 - $31; + $35 = $25 * $$sink1$i * $22; + $36 = $29 * $23; + HEAPF64[$mat + 16 >> 3] = $35 + $36; + HEAPF64[$mat + 24 >> 3] = $16; + HEAPF64[$mat + 32 >> 3] = $30 + $31; + HEAPF64[$mat + 40 >> 3] = $21 + $29 * $29 * $22; + $47 = $29 * $$sink1$i * $22; + $48 = $25 * $23; + HEAPF64[$mat + 48 >> 3] = $47 - $48; + HEAPF64[$mat + 56 >> 3] = $18; + HEAPF64[$mat + 64 >> 3] = $35 - $36; + HEAPF64[$mat + 72 >> 3] = $47 + $48; + HEAPF64[$mat + 80 >> 3] = $21 + $$sink1$i * $$sink1$i * $22; + HEAPF64[$mat + 88 >> 3] = $20; + $j$09 = 0; + do { + $64 = +HEAPF64[$matXw2Xc + ($j$09 << 5) >> 3]; + $65 = +HEAPF64[$matXw2Xc + ($j$09 << 5) + 8 >> 3]; + $66 = +HEAPF64[$matXw2Xc + ($j$09 << 5) + 16 >> 3]; + $i$08 = 0; + do { + HEAPF64[$mat2 + ($j$09 << 5) + ($i$08 << 3) >> 3] = $64 * +HEAPF64[$mat + ($i$08 << 3) >> 3] + $65 * +HEAPF64[$mat + 32 + ($i$08 << 3) >> 3] + $66 * +HEAPF64[$mat + 64 + ($i$08 << 3) >> 3]; + $i$08 = $i$08 + 1 | 0; + } while (($i$08 | 0) != 4); + $82 = $mat2 + ($j$09 << 5) + 24 | 0; + HEAPF64[$82 >> 3] = +HEAPF64[$matXw2Xc + ($j$09 << 5) + 24 >> 3] + +HEAPF64[$82 >> 3]; + $j$09 = $j$09 + 1 | 0; + } while (($j$09 | 0) != 3); + $j$17 = 0; + do { + HEAPF64[$matXw2Xc + ($j$17 << 5) >> 3] = +HEAPF64[$mat2 + ($j$17 << 5) >> 3]; + HEAPF64[$matXw2Xc + ($j$17 << 5) + 8 >> 3] = +HEAPF64[$mat2 + ($j$17 << 5) + 8 >> 3]; + HEAPF64[$matXw2Xc + ($j$17 << 5) + 16 >> 3] = +HEAPF64[$mat2 + ($j$17 << 5) + 16 >> 3]; + HEAPF64[$matXw2Xc + ($j$17 << 5) + 24 >> 3] = +HEAPF64[$mat2 + ($j$17 << 5) + 24 >> 3]; + $j$17 = $j$17 + 1 | 0; + } while (($j$17 | 0) != 3); + STACKTOP = sp; + return 0; +} + +function _setCamera($id, $cameraID) { + $id = $id | 0; + $cameraID = $cameraID | 0; + var $$0 = 0, $0 = 0, $1 = 0, $10 = 0, $14 = 0, $15 = 0, $20 = 0, $21 = 0, $23 = 0, $24 = 0, $26 = 0, $4 = 0, $7 = 0, $9 = 0, $vararg_buffer = 0, $vararg_buffer2 = 0, $vararg_buffer4 = 0, $vararg_buffer6 = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 48 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer6 = sp + 24 | 0; + $vararg_buffer4 = sp + 16 | 0; + $vararg_buffer2 = sp + 8 | 0; + $vararg_buffer = sp; + $0 = sp + 32 | 0; + $1 = sp + 28 | 0; + HEAP32[$0 >> 2] = $id; + HEAP32[$1 >> 2] = $cameraID; + do if (!(__ZNSt3__112__hash_tableINS_17__hash_value_typeIi12arControllerEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE4findIiEENS_15__hash_iteratorIPNS_11__hash_nodeIS3_PvEEEERKT_(2044, $0) | 0)) $$0 = -1; else { + $4 = __ZNSt3__113unordered_mapIi12arControllerNS_4hashIiEENS_8equal_toIiEENS_9allocatorINS_4pairIKiS1_EEEEEixERS8_(2044, $0) | 0; + if (!(__ZNSt3__112__hash_tableINS_17__hash_value_typeIi7ARParamEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE4findIiEENS_15__hash_iteratorIPNS_11__hash_nodeIS3_PvEEEERKT_(2064, $1) | 0)) $$0 = -1; else { + $7 = $4 + 8 | 0; + _memcpy($7 | 0, __ZNSt3__113unordered_mapIi7ARParamNS_4hashIiEENS_8equal_toIiEENS_9allocatorINS_4pairIKiS1_EEEEEixERS8_(2064, $1) | 0, 184) | 0; + $9 = HEAP32[$7 >> 2] | 0; + $10 = $4 + 204 | 0; + $14 = HEAP32[$4 + 12 >> 2] | 0; + $15 = $4 + 208 | 0; + if (!(($9 | 0) == (HEAP32[$10 >> 2] | 0) ? ($14 | 0) == (HEAP32[$15 >> 2] | 0) : 0)) { + HEAP32[$vararg_buffer >> 2] = $9; + HEAP32[$vararg_buffer + 4 >> 2] = $14; + _arLog(2, 6151, $vararg_buffer); + _arParamChangeSize($7, HEAP32[$10 >> 2] | 0, HEAP32[$15 >> 2] | 0, $7) | 0; + } + _deleteHandle($4); + $20 = _arParamLTCreate($7, 15) | 0; + $21 = $4 + 192 | 0; + HEAP32[$21 >> 2] = $20; + if (!$20) { + _arLog(3, 6198, $vararg_buffer2); + $$0 = -1; + break; + } + $23 = _arCreateHandle($20) | 0; + $24 = $4 + 212 | 0; + HEAP32[$24 >> 2] = $23; + if (!$23) { + _arLog(3, 6236, $vararg_buffer4); + $$0 = -1; + break; + } + _arSetPixelFormat($23, 2) | 0; + $26 = _ar3DCreateHandle($7) | 0; + HEAP32[$4 + 224 >> 2] = $26; + if (!$26) { + _arLog(3, 6273, $vararg_buffer6); + $$0 = -1; + break; + } else { + _arPattAttach(HEAP32[$24 >> 2] | 0, HEAP32[$4 + 216 >> 2] | 0) | 0; + _arglCameraFrustum(HEAP32[$21 >> 2] | 0, +HEAPF64[$4 + 232 >> 3], +HEAPF64[$4 + 240 >> 3], $4 + 264 | 0); + $$0 = 0; + break; + } + } + } while (0); + STACKTOP = sp; + return $$0 | 0; +} + +function _memchr($src, $c, $n) { + $src = $src | 0; + $c = $c | 0; + $n = $n | 0; + var $$0$lcssa = 0, $$0$lcssa44 = 0, $$019 = 0, $$1$lcssa = 0, $$110 = 0, $$110$lcssa = 0, $$24 = 0, $$3 = 0, $$lcssa = 0, $0 = 0, $13 = 0, $15 = 0, $17 = 0, $20 = 0, $26 = 0, $27 = 0, $32 = 0, $4 = 0, $5 = 0, $8 = 0, $9 = 0, $s$0$lcssa = 0, $s$0$lcssa43 = 0, $s$020 = 0, $s$15 = 0, $s$2 = 0, $w$0$lcssa = 0, $w$011 = 0, $w$011$lcssa = 0, label = 0; + $0 = $c & 255; + $4 = ($n | 0) != 0; + L1 : do if ($4 & ($src & 3 | 0) != 0) { + $5 = $c & 255; + $$019 = $n; + $s$020 = $src; + while (1) { + if ((HEAP8[$s$020 >> 0] | 0) == $5 << 24 >> 24) { + $$0$lcssa44 = $$019; + $s$0$lcssa43 = $s$020; + label = 6; + break L1; + } + $8 = $s$020 + 1 | 0; + $9 = $$019 + -1 | 0; + $13 = ($9 | 0) != 0; + if ($13 & ($8 & 3 | 0) != 0) { + $$019 = $9; + $s$020 = $8; + } else { + $$0$lcssa = $9; + $$lcssa = $13; + $s$0$lcssa = $8; + label = 5; + break; + } + } + } else { + $$0$lcssa = $n; + $$lcssa = $4; + $s$0$lcssa = $src; + label = 5; + } while (0); + if ((label | 0) == 5) if ($$lcssa) { + $$0$lcssa44 = $$0$lcssa; + $s$0$lcssa43 = $s$0$lcssa; + label = 6; + } else { + $$3 = 0; + $s$2 = $s$0$lcssa; + } + L8 : do if ((label | 0) == 6) { + $15 = $c & 255; + if ((HEAP8[$s$0$lcssa43 >> 0] | 0) == $15 << 24 >> 24) { + $$3 = $$0$lcssa44; + $s$2 = $s$0$lcssa43; + } else { + $17 = Math_imul($0, 16843009) | 0; + L11 : do if ($$0$lcssa44 >>> 0 > 3) { + $$110 = $$0$lcssa44; + $w$011 = $s$0$lcssa43; + while (1) { + $20 = HEAP32[$w$011 >> 2] ^ $17; + if (($20 & -2139062144 ^ -2139062144) & $20 + -16843009) { + $$110$lcssa = $$110; + $w$011$lcssa = $w$011; + break; + } + $26 = $w$011 + 4 | 0; + $27 = $$110 + -4 | 0; + if ($27 >>> 0 > 3) { + $$110 = $27; + $w$011 = $26; + } else { + $$1$lcssa = $27; + $w$0$lcssa = $26; + label = 11; + break L11; + } + } + $$24 = $$110$lcssa; + $s$15 = $w$011$lcssa; + } else { + $$1$lcssa = $$0$lcssa44; + $w$0$lcssa = $s$0$lcssa43; + label = 11; + } while (0); + if ((label | 0) == 11) if (!$$1$lcssa) { + $$3 = 0; + $s$2 = $w$0$lcssa; + break; + } else { + $$24 = $$1$lcssa; + $s$15 = $w$0$lcssa; + } + while (1) { + if ((HEAP8[$s$15 >> 0] | 0) == $15 << 24 >> 24) { + $$3 = $$24; + $s$2 = $s$15; + break L8; + } + $32 = $s$15 + 1 | 0; + $$24 = $$24 + -1 | 0; + if (!$$24) { + $$3 = 0; + $s$2 = $32; + break; + } else $s$15 = $32; + } + } + } while (0); + return (($$3 | 0) != 0 ? $s$2 : 0) | 0; +} + +function _getMarkerInfo($id, $markerIndex) { + $id = $id | 0; + $markerIndex = $markerIndex | 0; + var $$0 = 0, $0 = 0, $5 = 0, $6 = 0, $_ZL11gMarkerInfo$ = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $0 = sp; + HEAP32[$0 >> 2] = $id; + do if (!(__ZNSt3__112__hash_tableINS_17__hash_value_typeIi12arControllerEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE4findIiEENS_15__hash_iteratorIPNS_11__hash_nodeIS3_PvEEEERKT_(2044, $0) | 0)) $$0 = HEAP32[522] | 0; else { + $5 = (__ZNSt3__113unordered_mapIi12arControllerNS_4hashIiEENS_8equal_toIiEENS_9allocatorINS_4pairIKiS1_EEEEEixERS8_(2044, $0) | 0) + 212 | 0; + $6 = HEAP32[$5 >> 2] | 0; + if ((HEAP32[$6 + 44 >> 2] | 0) > ($markerIndex | 0)) { + $_ZL11gMarkerInfo$ = ($markerIndex | 0) < 0 ? 8 : $6 + 48 + ($markerIndex << 8) | 0; + _emscripten_asm_const_33(1, HEAP32[$_ZL11gMarkerInfo$ >> 2] | 0, HEAP32[$_ZL11gMarkerInfo$ + 4 >> 2] | 0, HEAP32[$_ZL11gMarkerInfo$ + 8 >> 2] | 0, HEAP32[$_ZL11gMarkerInfo$ + 12 >> 2] | 0, HEAP32[$_ZL11gMarkerInfo$ + 16 >> 2] | 0, HEAP32[$_ZL11gMarkerInfo$ + 20 >> 2] | 0, HEAP32[$_ZL11gMarkerInfo$ + 24 >> 2] | 0, +(+HEAPF64[$_ZL11gMarkerInfo$ + 32 >> 3]), +(+HEAPF64[$_ZL11gMarkerInfo$ + 40 >> 3]), +(+HEAPF64[$_ZL11gMarkerInfo$ + 48 >> 3]), +(+HEAPF64[$_ZL11gMarkerInfo$ + 56 >> 3]), +(+HEAPF64[$_ZL11gMarkerInfo$ + 64 >> 3]), +(+HEAPF64[$_ZL11gMarkerInfo$ + 72 >> 3]), +(+HEAPF64[$_ZL11gMarkerInfo$ + 80 >> 3]), +(+HEAPF64[$_ZL11gMarkerInfo$ + 88 >> 3]), +(+HEAPF64[$_ZL11gMarkerInfo$ + 96 >> 3]), +(+HEAPF64[$_ZL11gMarkerInfo$ + 104 >> 3]), +(+HEAPF64[$_ZL11gMarkerInfo$ + 112 >> 3]), +(+HEAPF64[$_ZL11gMarkerInfo$ + 120 >> 3]), +(+HEAPF64[$_ZL11gMarkerInfo$ + 128 >> 3]), +(+HEAPF64[$_ZL11gMarkerInfo$ + 136 >> 3]), +(+HEAPF64[$_ZL11gMarkerInfo$ + 144 >> 3]), +(+HEAPF64[$_ZL11gMarkerInfo$ + 152 >> 3]), +(+HEAPF64[$_ZL11gMarkerInfo$ + 160 >> 3]), +(+HEAPF64[$_ZL11gMarkerInfo$ + 168 >> 3]), +(+HEAPF64[$_ZL11gMarkerInfo$ + 176 >> 3]), +(+HEAPF64[$_ZL11gMarkerInfo$ + 184 >> 3]), +(+HEAPF64[$_ZL11gMarkerInfo$ + 192 >> 3]), +(+HEAPF64[$_ZL11gMarkerInfo$ + 200 >> 3]), +(+HEAPF64[$_ZL11gMarkerInfo$ + 208 >> 3]), +(+HEAPF64[$_ZL11gMarkerInfo$ + 216 >> 3]), +(+HEAPF64[$_ZL11gMarkerInfo$ + 224 >> 3]), HEAP32[$_ZL11gMarkerInfo$ + 240 >> 2] | 0) | 0; + $$0 = 0; + break; + } else { + $$0 = HEAP32[523] | 0; + break; + } + } while (0); + STACKTOP = sp; + return $$0 | 0; +} + +function __ZN10__cxxabiv112_GLOBAL__N_114parse_decltypeINS0_2DbEEEPKcS4_S4_RT_($first, $last, $db) { + $first = $first | 0; + $last = $last | 0; + $db = $db | 0; + var $$03 = 0, $0 = 0, $1 = 0, $13 = 0, $14 = 0, $2 = 0, $21 = 0, $23 = 0, $24 = 0, $27 = 0, $3 = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 64 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $0 = sp + 40 | 0; + $1 = sp + 24 | 0; + $2 = sp + 12 | 0; + $3 = sp; + L1 : do if (($last - $first | 0) > 3) if ((HEAP8[$first >> 0] | 0) == 68) { + switch (HEAP8[$first + 1 >> 0] | 0) { + case 84: + case 116: + break; + default: + { + $$03 = $first; + break L1; + } + } + $13 = $first + 2 | 0; + $14 = __ZN10__cxxabiv112_GLOBAL__N_116parse_expressionINS0_2DbEEEPKcS4_S4_RT_($13, $last, $db) | 0; + if (($14 | 0) == ($13 | 0) | ($14 | 0) == ($last | 0)) $$03 = $first; else if ((HEAP8[$14 >> 0] | 0) == 69) { + $21 = HEAP32[$db + 4 >> 2] | 0; + if ((HEAP32[$db >> 2] | 0) == ($21 | 0)) $$03 = $first; else { + $23 = $21 + -24 | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($3, $23); + $24 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc($3, 0, 12803) | 0; + HEAP32[$2 >> 2] = HEAP32[$24 >> 2]; + HEAP32[$2 + 4 >> 2] = HEAP32[$24 + 4 >> 2]; + HEAP32[$2 + 8 >> 2] = HEAP32[$24 + 8 >> 2]; + HEAP32[$24 >> 2] = 0; + HEAP32[$24 + 4 >> 2] = 0; + HEAP32[$24 + 8 >> 2] = 0; + $27 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($2, 12619) | 0; + HEAP32[$1 >> 2] = HEAP32[$27 >> 2]; + HEAP32[$1 + 4 >> 2] = HEAP32[$27 + 4 >> 2]; + HEAP32[$1 + 8 >> 2] = HEAP32[$27 + 8 >> 2]; + HEAP32[$27 >> 2] = 0; + HEAP32[$27 + 4 >> 2] = 0; + HEAP32[$27 + 8 >> 2] = 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ENSt3__112basic_stringIcNS2_11char_traitsIcEENS0_12malloc_allocIcEEEE($0, $1); + __ZN10__cxxabiv112_GLOBAL__N_111string_pairaSEOS1_($23, $0); + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($0); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($1); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($2); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($3); + $$03 = $14 + 1 | 0; + } + } else $$03 = $first; + } else $$03 = $first; else $$03 = $first; while (0); + STACKTOP = sp; + return $$03 | 0; +} + +function ___fdopen($fd, $mode) { + $fd = $fd | 0; + $mode = $mode | 0; + var $$0 = 0, $0 = 0, $13 = 0, $14 = 0, $19 = 0, $24 = 0, $26 = 0, $3 = 0, $37 = 0, $4 = 0, $tio = 0, $vararg_buffer = 0, $vararg_buffer12 = 0, $vararg_buffer3 = 0, $vararg_buffer7 = 0, dest = 0, sp = 0, stop = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 112 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer12 = sp + 40 | 0; + $vararg_buffer7 = sp + 24 | 0; + $vararg_buffer3 = sp + 16 | 0; + $vararg_buffer = sp; + $tio = sp + 52 | 0; + $0 = HEAP8[$mode >> 0] | 0; + if (!(_memchr(16759, $0 << 24 >> 24, 4) | 0)) { + $3 = ___errno_location() | 0; + HEAP32[$3 >> 2] = 22; + $$0 = 0; + } else { + $4 = _malloc(1144) | 0; + if (!$4) $$0 = 0; else { + dest = $4; + stop = dest + 112 | 0; + do { + HEAP32[dest >> 2] = 0; + dest = dest + 4 | 0; + } while ((dest | 0) < (stop | 0)); + if (!(_strchr($mode, 43) | 0)) HEAP32[$4 >> 2] = $0 << 24 >> 24 == 114 ? 8 : 4; + if (!(_strchr($mode, 101) | 0)) $13 = $0; else { + HEAP32[$vararg_buffer >> 2] = $fd; + HEAP32[$vararg_buffer + 4 >> 2] = 2; + HEAP32[$vararg_buffer + 8 >> 2] = 1; + ___syscall221(221, $vararg_buffer | 0) | 0; + $13 = HEAP8[$mode >> 0] | 0; + } + if ($13 << 24 >> 24 == 97) { + HEAP32[$vararg_buffer3 >> 2] = $fd; + HEAP32[$vararg_buffer3 + 4 >> 2] = 3; + $14 = ___syscall221(221, $vararg_buffer3 | 0) | 0; + if (!($14 & 1024)) { + HEAP32[$vararg_buffer7 >> 2] = $fd; + HEAP32[$vararg_buffer7 + 4 >> 2] = 4; + HEAP32[$vararg_buffer7 + 8 >> 2] = $14 | 1024; + ___syscall221(221, $vararg_buffer7 | 0) | 0; + } + $19 = HEAP32[$4 >> 2] | 128; + HEAP32[$4 >> 2] = $19; + $26 = $19; + } else $26 = HEAP32[$4 >> 2] | 0; + HEAP32[$4 + 60 >> 2] = $fd; + HEAP32[$4 + 44 >> 2] = $4 + 120; + HEAP32[$4 + 48 >> 2] = 1024; + $24 = $4 + 75 | 0; + HEAP8[$24 >> 0] = -1; + if (!($26 & 8)) { + HEAP32[$vararg_buffer12 >> 2] = $fd; + HEAP32[$vararg_buffer12 + 4 >> 2] = 21505; + HEAP32[$vararg_buffer12 + 8 >> 2] = $tio; + if (!(___syscall54(54, $vararg_buffer12 | 0) | 0)) HEAP8[$24 >> 0] = 10; + } + HEAP32[$4 + 32 >> 2] = 14; + HEAP32[$4 + 36 >> 2] = 4; + HEAP32[$4 + 40 >> 2] = 5; + HEAP32[$4 + 12 >> 2] = 2; + if (!(HEAP32[598] | 0)) HEAP32[$4 + 76 >> 2] = -1; + ___lock(2416); + $37 = HEAP32[603] | 0; + HEAP32[$4 + 56 >> 2] = $37; + if ($37) HEAP32[$37 + 52 >> 2] = $4; + HEAP32[603] = $4; + ___unlock(2416); + $$0 = $4; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _addMultiMarker($id, $patt_name) { + $id = $id | 0; + $patt_name = $patt_name | 0; + var $$0 = 0, $0 = 0, $11 = 0, $12 = 0, $13 = 0, $15 = 0, $16 = 0, $21 = 0, $22 = 0, $23 = 0, $28 = 0, $29 = 0, $3 = 0, $38 = 0, $40 = 0, $43 = 0, $44 = 0, $marker = 0, $vararg_buffer = 0, $vararg_buffer1 = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 32 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer1 = sp + 16 | 0; + $vararg_buffer = sp + 8 | 0; + $0 = sp + 20 | 0; + $marker = sp; + HEAP32[$0 >> 2] = $id; + do if (!(__ZNSt3__112__hash_tableINS_17__hash_value_typeIi12arControllerEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE4findIiEENS_15__hash_iteratorIPNS_11__hash_nodeIS3_PvEEEERKT_(2044, $0) | 0)) $$0 = -1; else { + $3 = __ZNSt3__113unordered_mapIi12arControllerNS_4hashIiEENS_8equal_toIiEENS_9allocatorINS_4pairIKiS1_EEEEEixERS8_(2044, $0) | 0; + if (!(HEAP8[$patt_name >> 0] & 1)) $15 = $patt_name + 1 | 0; else $15 = HEAP32[$patt_name + 8 >> 2] | 0; + $11 = HEAP32[$3 + 212 >> 2] | 0; + $12 = $3 + 216 | 0; + $13 = $3 + 220 | 0; + $16 = _arMultiReadConfigFile($15, HEAP32[$12 >> 2] | 0) | 0; + HEAP32[$13 >> 2] = $16; + if (!$16) { + _arLog(3, 6401, $vararg_buffer); + _arPattDeleteHandle(HEAP32[$12 >> 2] | 0) | 0; + _arLog(3, 6428, $vararg_buffer1); + $$0 = -1; + break; + } + switch (HEAP32[$16 + 108 >> 2] | 0) { + case 0: + { + _arSetPatternDetectionMode($11, 0) | 0; + break; + } + case 1: + { + _arSetPatternDetectionMode($11, 2) | 0; + break; + } + default: + _arSetPatternDetectionMode($11, 3) | 0; + } + $21 = $3 + 248 | 0; + $22 = $3 + 252 | 0; + $23 = HEAP32[$22 >> 2] | 0; + $28 = $23 - (HEAP32[$21 >> 2] | 0) >> 3; + $29 = $marker; + HEAP32[$29 >> 2] = 0; + HEAP32[$29 + 4 >> 2] = 0; + HEAP32[$marker >> 2] = $28; + HEAP32[$marker + 4 >> 2] = HEAP32[$13 >> 2]; + if (($23 | 0) == (HEAP32[$3 + 256 >> 2] | 0)) { + __ZNSt3__16vectorI12multi_markerNS_9allocatorIS1_EEE21__push_back_slow_pathIRKS1_EEvOT_($21, $marker); + $$0 = $28; + break; + } else { + $38 = $marker; + $40 = HEAP32[$38 >> 2] | 0; + $43 = HEAP32[$38 + 4 >> 2] | 0; + $44 = $23; + HEAP32[$44 >> 2] = $40; + HEAP32[$44 + 4 >> 2] = $43; + HEAP32[$22 >> 2] = (HEAP32[$22 >> 2] | 0) + 8; + $$0 = $40; + break; + } + } while (0); + STACKTOP = sp; + return $$0 | 0; +} + +function _get_cpara($world, $vertex, $para) { + $world = $world | 0; + $vertex = $vertex | 0; + $para = $para | 0; + var $0 = 0, $1 = 0, $2 = 0, $22 = 0, $3 = 0, $4 = 0, $49 = 0, $5 = 0, $62 = 0, $68 = 0, $7 = 0, $76 = 0, $86 = 0, $9 = 0, $i$03 = 0; + $0 = _arMatrixAlloc(8, 8) | 0; + $1 = _arMatrixAlloc(8, 1) | 0; + $2 = _arMatrixAlloc(8, 1) | 0; + $3 = HEAP32[$0 >> 2] | 0; + $4 = HEAP32[$1 >> 2] | 0; + $i$03 = 0; + do { + $5 = $world + ($i$03 << 4) | 0; + $7 = $i$03 << 4; + HEAPF64[$3 + ($7 << 3) >> 3] = +HEAPF64[$5 >> 3]; + $9 = $world + ($i$03 << 4) + 8 | 0; + HEAPF64[$3 + (($7 | 1) << 3) >> 3] = +HEAPF64[$9 >> 3]; + HEAPF64[$3 + (($7 | 2) << 3) >> 3] = 1.0; + HEAPF64[$3 + (($7 | 3) << 3) >> 3] = 0.0; + HEAPF64[$3 + (($7 | 4) << 3) >> 3] = 0.0; + HEAPF64[$3 + (($7 | 5) << 3) >> 3] = 0.0; + $22 = $vertex + ($i$03 << 4) | 0; + HEAPF64[$3 + (($7 | 6) << 3) >> 3] = -(+HEAPF64[$5 >> 3] * +HEAPF64[$22 >> 3]); + HEAPF64[$3 + (($7 | 7) << 3) >> 3] = -(+HEAPF64[$9 >> 3] * +HEAPF64[$22 >> 3]); + HEAPF64[$3 + (($7 | 8) << 3) >> 3] = 0.0; + HEAPF64[$3 + (($7 | 9) << 3) >> 3] = 0.0; + HEAPF64[$3 + (($7 | 10) << 3) >> 3] = 0.0; + HEAPF64[$3 + (($7 | 11) << 3) >> 3] = +HEAPF64[$5 >> 3]; + HEAPF64[$3 + (($7 | 12) << 3) >> 3] = +HEAPF64[$9 >> 3]; + HEAPF64[$3 + (($7 | 13) << 3) >> 3] = 1.0; + $49 = $vertex + ($i$03 << 4) + 8 | 0; + HEAPF64[$3 + (($7 | 14) << 3) >> 3] = -(+HEAPF64[$5 >> 3] * +HEAPF64[$49 >> 3]); + HEAPF64[$3 + (($7 | 15) << 3) >> 3] = -(+HEAPF64[$9 >> 3] * +HEAPF64[$49 >> 3]); + $62 = $i$03 << 1; + HEAPF64[$4 + ($62 << 3) >> 3] = +HEAPF64[$22 >> 3]; + HEAPF64[$4 + (($62 | 1) << 3) >> 3] = +HEAPF64[$49 >> 3]; + $i$03 = $i$03 + 1 | 0; + } while (($i$03 | 0) != 4); + _arMatrixSelfInv($0) | 0; + _arMatrixMul($2, $0, $1) | 0; + $68 = HEAP32[$2 >> 2] | 0; + HEAPF64[$para >> 3] = +HEAPF64[$68 >> 3]; + HEAPF64[$para + 8 >> 3] = +HEAPF64[$68 + 8 >> 3]; + HEAPF64[$para + 16 >> 3] = +HEAPF64[$68 + 16 >> 3]; + $76 = HEAP32[$2 >> 2] | 0; + HEAPF64[$para + 24 >> 3] = +HEAPF64[$76 + 24 >> 3]; + HEAPF64[$para + 32 >> 3] = +HEAPF64[$76 + 32 >> 3]; + HEAPF64[$para + 40 >> 3] = +HEAPF64[$76 + 40 >> 3]; + $86 = HEAP32[$2 >> 2] | 0; + HEAPF64[$para + 48 >> 3] = +HEAPF64[$86 + 48 >> 3]; + HEAPF64[$para + 56 >> 3] = +HEAPF64[$86 + 56 >> 3]; + HEAPF64[$para + 64 >> 3] = 1.0; + _arMatrixFree($0) | 0; + _arMatrixFree($1) | 0; + _arMatrixFree($2) | 0; + return; +} + +function _arGetTransMatSquare($handle, $marker_info, $width, $conv) { + $handle = $handle | 0; + $marker_info = $marker_info | 0; + $width = +$width; + $conv = $conv | 0; + var $$0 = 0.0, $1 = 0, $10 = 0, $18 = 0, $26 = 0, $3 = 0, $33 = 0.0, $34 = 0.0, $53 = 0, $data = 0, $err = 0, $initMatXw2Xc = 0, $screenCoord = 0, $worldCoord = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 288 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $screenCoord = sp + 200 | 0; + $worldCoord = sp + 104 | 0; + $data = sp + 264 | 0; + $initMatXw2Xc = sp + 8 | 0; + $err = sp; + $1 = HEAP32[$marker_info + 16 >> 2] | 0; + $3 = (4 - $1 | 0) % 4 | 0; + HEAPF64[$screenCoord >> 3] = +HEAPF64[$marker_info + 168 + ($3 << 4) >> 3]; + HEAPF64[$screenCoord + 8 >> 3] = +HEAPF64[$marker_info + 168 + ($3 << 4) + 8 >> 3]; + $10 = (5 - $1 | 0) % 4 | 0; + HEAPF64[$screenCoord + 16 >> 3] = +HEAPF64[$marker_info + 168 + ($10 << 4) >> 3]; + HEAPF64[$screenCoord + 24 >> 3] = +HEAPF64[$marker_info + 168 + ($10 << 4) + 8 >> 3]; + $18 = (6 - $1 | 0) % 4 | 0; + HEAPF64[$screenCoord + 32 >> 3] = +HEAPF64[$marker_info + 168 + ($18 << 4) >> 3]; + HEAPF64[$screenCoord + 40 >> 3] = +HEAPF64[$marker_info + 168 + ($18 << 4) + 8 >> 3]; + $26 = (7 - $1 | 0) % 4 | 0; + HEAPF64[$screenCoord + 48 >> 3] = +HEAPF64[$marker_info + 168 + ($26 << 4) >> 3]; + HEAPF64[$screenCoord + 56 >> 3] = +HEAPF64[$marker_info + 168 + ($26 << 4) + 8 >> 3]; + $33 = $width * -.5; + HEAPF64[$worldCoord >> 3] = $33; + $34 = $width * .5; + HEAPF64[$worldCoord + 8 >> 3] = $34; + HEAPF64[$worldCoord + 16 >> 3] = 0.0; + HEAPF64[$worldCoord + 24 >> 3] = $34; + HEAPF64[$worldCoord + 32 >> 3] = $34; + HEAPF64[$worldCoord + 40 >> 3] = 0.0; + HEAPF64[$worldCoord + 48 >> 3] = $34; + HEAPF64[$worldCoord + 56 >> 3] = $33; + HEAPF64[$worldCoord + 64 >> 3] = 0.0; + HEAPF64[$worldCoord + 72 >> 3] = $33; + HEAPF64[$worldCoord + 80 >> 3] = $33; + HEAPF64[$worldCoord + 88 >> 3] = 0.0; + HEAP32[$data >> 2] = $screenCoord; + HEAP32[$data + 4 >> 2] = $worldCoord; + HEAP32[$data + 8 >> 2] = 4; + if ((_icpGetInitXw2Xc_from_PlanarData(HEAP32[$handle >> 2] | 0, $screenCoord, $worldCoord, 4, $initMatXw2Xc) | 0) < 0) $$0 = 1.0e8; else { + $53 = (_icpPoint(HEAP32[$handle >> 2] | 0, $data, $initMatXw2Xc, $conv, $err) | 0) < 0; + $$0 = $53 ? 1.0e8 : +HEAPF64[$err >> 3]; + } + STACKTOP = sp; + return +$$0; +} + +function __ZNK10__cxxabiv120__si_class_type_info16search_below_dstEPNS_19__dynamic_cast_infoEPKvib($this, $info, $current_ptr, $path_below, $use_strcmp) { + $this = $this | 0; + $info = $info | 0; + $current_ptr = $current_ptr | 0; + $path_below = $path_below | 0; + $use_strcmp = $use_strcmp | 0; + var $14 = 0, $20 = 0, $23 = 0, $24 = 0, $26 = 0, $33 = 0, $44 = 0, $6 = 0, $is_dst_type_derived_from_static_type$0$off01 = 0, label = 0; + L1 : do if (($this | 0) == (HEAP32[$info + 8 >> 2] | 0)) { + if ((HEAP32[$info + 4 >> 2] | 0) == ($current_ptr | 0)) { + $6 = $info + 28 | 0; + if ((HEAP32[$6 >> 2] | 0) != 1) HEAP32[$6 >> 2] = $path_below; + } + } else { + if (($this | 0) != (HEAP32[$info >> 2] | 0)) { + $44 = HEAP32[$this + 8 >> 2] | 0; + FUNCTION_TABLE_viiiii[HEAP32[(HEAP32[$44 >> 2] | 0) + 24 >> 2] & 3]($44, $info, $current_ptr, $path_below, $use_strcmp); + break; + } + if ((HEAP32[$info + 16 >> 2] | 0) != ($current_ptr | 0)) { + $14 = $info + 20 | 0; + if ((HEAP32[$14 >> 2] | 0) != ($current_ptr | 0)) { + HEAP32[$info + 32 >> 2] = $path_below; + $20 = $info + 44 | 0; + if ((HEAP32[$20 >> 2] | 0) == 4) break; + $23 = $info + 52 | 0; + HEAP8[$23 >> 0] = 0; + $24 = $info + 53 | 0; + HEAP8[$24 >> 0] = 0; + $26 = HEAP32[$this + 8 >> 2] | 0; + FUNCTION_TABLE_viiiiii[HEAP32[(HEAP32[$26 >> 2] | 0) + 20 >> 2] & 3]($26, $info, $current_ptr, $current_ptr, 1, $use_strcmp); + if (!(HEAP8[$24 >> 0] | 0)) { + $is_dst_type_derived_from_static_type$0$off01 = 0; + label = 13; + } else if (!(HEAP8[$23 >> 0] | 0)) { + $is_dst_type_derived_from_static_type$0$off01 = 1; + label = 13; + } + do if ((label | 0) == 13) { + HEAP32[$14 >> 2] = $current_ptr; + $33 = $info + 40 | 0; + HEAP32[$33 >> 2] = (HEAP32[$33 >> 2] | 0) + 1; + if ((HEAP32[$info + 36 >> 2] | 0) == 1) if ((HEAP32[$info + 24 >> 2] | 0) == 2) { + HEAP8[$info + 54 >> 0] = 1; + if ($is_dst_type_derived_from_static_type$0$off01) break; + } else label = 16; else label = 16; + if ((label | 0) == 16) if ($is_dst_type_derived_from_static_type$0$off01) break; + HEAP32[$20 >> 2] = 4; + break L1; + } while (0); + HEAP32[$20 >> 2] = 3; + break; + } + } + if (($path_below | 0) == 1) HEAP32[$info + 32 >> 2] = 1; + } while (0); + return; +} + +function _fgets($s, $n, $f) { + $s = $s | 0; + $n = $n | 0; + $f = $f | 0; + var $$0 = 0, $$048 = 0, $$05 = 0, $$lcssa14 = 0, $$sum$pre$phiZZ2D = 0, $$sum6 = 0, $13 = 0, $15 = 0, $16 = 0, $17 = 0, $20 = 0, $21 = 0, $22 = 0, $23 = 0, $27 = 0, $28 = 0, $29 = 0, $30 = 0, $31 = 0, $32 = 0, $33 = 0, $39 = 0, $4 = 0, $47 = 0, $48 = 0, $6 = 0, $8 = 0, $p$0 = 0, $p$1 = 0, label = 0; + if ((HEAP32[$f + 76 >> 2] | 0) > -1) $13 = ___lockfile($f) | 0; else $13 = 0; + $4 = $n + -1 | 0; + if (($n | 0) < 2) { + $6 = $f + 74 | 0; + $8 = HEAP8[$6 >> 0] | 0; + HEAP8[$6 >> 0] = $8 + 255 | $8; + if ($13) ___unlockfile($f); + if (!$4) { + HEAP8[$s >> 0] = 0; + $$0 = $s; + } else $$0 = 0; + } else { + L11 : do if (!$4) { + $p$1 = $s; + label = 18; + } else { + $15 = $f + 4 | 0; + $16 = $f + 8 | 0; + $$05 = $4; + $p$0 = $s; + while (1) { + $17 = HEAP32[$15 >> 2] | 0; + $20 = $17; + $21 = (HEAP32[$16 >> 2] | 0) - $20 | 0; + $22 = _memchr($17, 10, $21) | 0; + $23 = ($22 | 0) == 0; + $27 = $23 ? $21 : 1 - $20 + $22 | 0; + $28 = $27 >>> 0 < $$05 >>> 0; + $29 = $28 ? $27 : $$05; + _memcpy($p$0 | 0, $17 | 0, $29 | 0) | 0; + $30 = HEAP32[$15 >> 2] | 0; + $31 = $30 + $29 | 0; + HEAP32[$15 >> 2] = $31; + $32 = $p$0 + $29 | 0; + $33 = $$05 - $29 | 0; + if (!($23 & $28)) { + $p$1 = $32; + label = 18; + break L11; + } + if ($31 >>> 0 < (HEAP32[$16 >> 2] | 0) >>> 0) { + $$sum6 = $29 + 1 | 0; + HEAP32[$15 >> 2] = $30 + $$sum6; + $$sum$pre$phiZZ2D = $$sum6; + $47 = HEAPU8[$31 >> 0] | 0; + } else { + $39 = ___uflow($f) | 0; + if (($39 | 0) < 0) { + $$lcssa14 = $32; + break; + } + $$sum$pre$phiZZ2D = $29 + 1 | 0; + $47 = $39; + } + $$05 = $33 + -1 | 0; + $48 = $p$0 + $$sum$pre$phiZZ2D | 0; + HEAP8[$32 >> 0] = $47; + if (!(($$05 | 0) != 0 & ($47 & 255 | 0) != 10)) { + $p$1 = $48; + label = 18; + break L11; + } else $p$0 = $48; + } + if (($$lcssa14 | 0) == ($s | 0)) $$048 = 0; else if (!(HEAP32[$f >> 2] & 16)) $$048 = 0; else { + $p$1 = $$lcssa14; + label = 18; + } + } while (0); + if ((label | 0) == 18) if (!$s) $$048 = 0; else { + HEAP8[$p$1 >> 0] = 0; + $$048 = $s; + } + if (!$13) $$0 = $$048; else { + ___unlockfile($f); + $$0 = $$048; + } + } + return $$0 | 0; +} + +function _mbrtowc($wc, $src, $n, $st) { + $wc = $wc | 0; + $src = $src | 0; + $n = $n | 0; + $st = $st | 0; + var $$0 = 0, $$024 = 0, $$1 = 0, $$lcssa = 0, $$lcssa35 = 0, $$st = 0, $1 = 0, $12 = 0, $16 = 0, $17 = 0, $19 = 0, $21 = 0, $30 = 0, $40 = 0, $7 = 0, $8 = 0, $c$05 = 0, $c$1 = 0, $c$2 = 0, $dummy = 0, $dummy$wc = 0, $s$06 = 0, $s$1 = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $dummy = sp; + $$st = ($st | 0) == 0 ? 2680 : $st; + $1 = HEAP32[$$st >> 2] | 0; + L1 : do if (!$src) if (!$1) $$0 = 0; else label = 15; else { + $dummy$wc = ($wc | 0) == 0 ? $dummy : $wc; + if (!$n) $$0 = -2; else { + if (!$1) { + $7 = HEAP8[$src >> 0] | 0; + $8 = $7 & 255; + if ($7 << 24 >> 24 > -1) { + HEAP32[$dummy$wc >> 2] = $8; + $$0 = $7 << 24 >> 24 != 0 & 1; + break; + } + $12 = $8 + -194 | 0; + if ($12 >>> 0 > 50) { + label = 15; + break; + } + $16 = HEAP32[2432 + ($12 << 2) >> 2] | 0; + $17 = $n + -1 | 0; + if (!$17) $c$2 = $16; else { + $$024 = $17; + $c$05 = $16; + $s$06 = $src + 1 | 0; + label = 9; + } + } else { + $$024 = $n; + $c$05 = $1; + $s$06 = $src; + label = 9; + } + L11 : do if ((label | 0) == 9) { + $19 = HEAP8[$s$06 >> 0] | 0; + $21 = ($19 & 255) >>> 3; + if (($21 + -16 | $21 + ($c$05 >> 26)) >>> 0 > 7) { + label = 15; + break L1; + } else { + $$1 = $$024; + $30 = $19; + $c$1 = $c$05; + $s$1 = $s$06; + } + while (1) { + $s$1 = $s$1 + 1 | 0; + $c$1 = ($30 & 255) + -128 | $c$1 << 6; + $$1 = $$1 + -1 | 0; + if (($c$1 | 0) >= 0) { + $$lcssa = $c$1; + $$lcssa35 = $$1; + break; + } + if (!$$1) { + $c$2 = $c$1; + break L11; + } + $30 = HEAP8[$s$1 >> 0] | 0; + if (($30 & -64) << 24 >> 24 != -128) { + label = 15; + break L1; + } + } + HEAP32[$$st >> 2] = 0; + HEAP32[$dummy$wc >> 2] = $$lcssa; + $$0 = $n - $$lcssa35 | 0; + break L1; + } while (0); + HEAP32[$$st >> 2] = $c$2; + $$0 = -2; + } + } while (0); + if ((label | 0) == 15) { + HEAP32[$$st >> 2] = 0; + $40 = ___errno_location() | 0; + HEAP32[$40 >> 2] = 84; + $$0 = -1; + } + STACKTOP = sp; + return $$0 | 0; +} + +function __ZNSt3__112__hash_tableINS_17__hash_value_typeIi12arControllerEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE6removeENS_21__hash_const_iteratorIPNS_11__hash_nodeIS3_PvEEEE($agg$result, $this, $__p) { + $agg$result = $agg$result | 0; + $this = $this | 0; + $__p = $__p | 0; + var $$pre$phiZ2D = 0, $0 = 0, $11 = 0, $12 = 0, $14 = 0, $16 = 0, $19 = 0, $2 = 0, $23 = 0, $24 = 0, $27 = 0, $31 = 0, $32 = 0, $34 = 0, $36 = 0, $4 = 0, $40 = 0, $43 = 0, $44 = 0, $5 = 0, $7 = 0, $__pn$0 = 0, $__pn$0$lcssa = 0, label = 0; + $0 = HEAP32[$__p >> 2] | 0; + $2 = HEAP32[$this + 4 >> 2] | 0; + $4 = HEAP32[$0 + 4 >> 2] | 0; + $5 = $2 + -1 | 0; + $7 = ($5 & $2 | 0) == 0; + if ($7) $12 = $5 & $4; else $12 = ($4 >>> 0) % ($2 >>> 0) | 0; + $11 = (HEAP32[$this >> 2] | 0) + ($12 << 2) | 0; + $__pn$0 = HEAP32[$11 >> 2] | 0; + while (1) { + $14 = HEAP32[$__pn$0 >> 2] | 0; + if (($14 | 0) == ($0 | 0)) { + $__pn$0$lcssa = $__pn$0; + break; + } else $__pn$0 = $14; + } + $16 = $this + 8 | 0; + if (($__pn$0$lcssa | 0) == ($16 | 0)) label = 12; else { + $19 = HEAP32[$__pn$0$lcssa + 4 >> 2] | 0; + if ($7) $23 = $19 & $5; else $23 = ($19 >>> 0) % ($2 >>> 0) | 0; + if (($23 | 0) == ($12 | 0)) $$pre$phiZ2D = $0; else label = 12; + } + do if ((label | 0) == 12) { + $24 = HEAP32[$0 >> 2] | 0; + if ($24) { + $27 = HEAP32[$24 + 4 >> 2] | 0; + if ($7) $31 = $27 & $5; else $31 = ($27 >>> 0) % ($2 >>> 0) | 0; + if (($31 | 0) == ($12 | 0)) { + $$pre$phiZ2D = $0; + break; + } + } + HEAP32[$11 >> 2] = 0; + $$pre$phiZ2D = $0; + } while (0); + $32 = HEAP32[$$pre$phiZ2D >> 2] | 0; + $34 = $32; + if (!$32) $43 = $34; else { + $36 = HEAP32[$32 + 4 >> 2] | 0; + if ($7) $40 = $36 & $5; else $40 = ($36 >>> 0) % ($2 >>> 0) | 0; + if (($40 | 0) == ($12 | 0)) $43 = $34; else { + HEAP32[(HEAP32[$this >> 2] | 0) + ($40 << 2) >> 2] = $__pn$0$lcssa; + $43 = HEAP32[$0 >> 2] | 0; + } + } + HEAP32[$__pn$0$lcssa >> 2] = $43; + HEAP32[$$pre$phiZ2D >> 2] = 0; + $44 = $this + 12 | 0; + HEAP32[$44 >> 2] = (HEAP32[$44 >> 2] | 0) + -1; + HEAP32[$agg$result >> 2] = $0; + HEAP32[$agg$result + 4 >> 2] = $16; + HEAP8[$agg$result + 8 >> 0] = 1; + return; +} + +function _arParamLTCreate($param, $offset) { + $param = $param | 0; + $offset = $offset | 0; + var $0 = 0, $14 = 0, $15 = 0, $17 = 0, $20 = 0, $22 = 0, $24 = 0, $26 = 0, $29 = 0.0, $3 = 0, $32 = 0.0, $4 = 0, $9 = 0, $i$04 = 0, $i2of$05 = 0, $i2of$12 = 0, $ix = 0, $iy = 0, $j$07 = 0, $o2if$06 = 0, $o2if$13 = 0, $ox = 0, $oy = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 64 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $ix = sp + 24 | 0; + $iy = sp + 16 | 0; + $ox = sp + 8 | 0; + $oy = sp; + $0 = _malloc(208) | 0; + if (!$0) { + _arLog(3, 5471, sp + 32 | 0); + _exit(1); + } + _memcpy($0 | 0, $param | 0, 184) | 0; + $3 = $offset << 1; + $4 = (HEAP32[$param >> 2] | 0) + $3 | 0; + HEAP32[$0 + 192 >> 2] = $4; + $9 = (HEAP32[$param + 4 >> 2] | 0) + $3 | 0; + HEAP32[$0 + 196 >> 2] = $9; + HEAP32[$0 + 200 >> 2] = $offset; + HEAP32[$0 + 204 >> 2] = $offset; + $14 = Math_imul($4 << 3, $9) | 0; + $15 = _malloc($14) | 0; + HEAP32[$0 + 184 >> 2] = $15; + if (!$15) { + _arLog(3, 5471, sp + 40 | 0); + _exit(1); + } + $17 = _malloc($14) | 0; + HEAP32[$0 + 188 >> 2] = $17; + if (!$17) { + _arLog(3, 5471, sp + 48 | 0); + _exit(1); + } + $20 = $param + 104 | 0; + $22 = HEAP32[$param + 176 >> 2] | 0; + $24 = ($4 | 0) > 0 ? $4 << 1 : 0; + if (($9 | 0) > 0) { + $26 = ($4 | 0) > 0; + $i2of$05 = $15; + $j$07 = 0; + $o2if$06 = $17; + while (1) { + $29 = +($j$07 - $offset | 0); + if ($26) { + $i$04 = 0; + $i2of$12 = $i2of$05; + $o2if$13 = $o2if$06; + while (1) { + $32 = +($i$04 - $offset | 0); + _arParamIdeal2Observ($20, $32, $29, $ox, $oy, $22) | 0; + HEAPF32[$i2of$12 >> 2] = +HEAPF64[$ox >> 3]; + HEAPF32[$i2of$12 + 4 >> 2] = +HEAPF64[$oy >> 3]; + _arParamObserv2Ideal($20, $32, $29, $ix, $iy, $22) | 0; + HEAPF32[$o2if$13 >> 2] = +HEAPF64[$ix >> 3]; + HEAPF32[$o2if$13 + 4 >> 2] = +HEAPF64[$iy >> 3]; + $i$04 = $i$04 + 1 | 0; + if (($i$04 | 0) >= ($4 | 0)) break; else { + $i2of$12 = $i2of$12 + 8 | 0; + $o2if$13 = $o2if$13 + 8 | 0; + } + } + } + $o2if$06 = $o2if$06 + ($24 << 2) | 0; + $j$07 = $j$07 + 1 | 0; + if (($j$07 | 0) >= ($9 | 0)) break; else $i2of$05 = $i2of$05 + ($24 << 2) | 0; + } + } + STACKTOP = sp; + return $0 | 0; +} + +function _arGetTransMatSquareCont($handle, $marker_info, $initConv, $width, $conv) { + $handle = $handle | 0; + $marker_info = $marker_info | 0; + $initConv = $initConv | 0; + $width = +$width; + $conv = $conv | 0; + var $1 = 0, $10 = 0, $18 = 0, $26 = 0, $3 = 0, $33 = 0.0, $34 = 0.0, $50 = 0, $data = 0, $err = 0, $screenCoord = 0, $worldCoord = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 192 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $screenCoord = sp + 104 | 0; + $worldCoord = sp + 8 | 0; + $data = sp + 168 | 0; + $err = sp; + $1 = HEAP32[$marker_info + 16 >> 2] | 0; + $3 = (4 - $1 | 0) % 4 | 0; + HEAPF64[$screenCoord >> 3] = +HEAPF64[$marker_info + 168 + ($3 << 4) >> 3]; + HEAPF64[$screenCoord + 8 >> 3] = +HEAPF64[$marker_info + 168 + ($3 << 4) + 8 >> 3]; + $10 = (5 - $1 | 0) % 4 | 0; + HEAPF64[$screenCoord + 16 >> 3] = +HEAPF64[$marker_info + 168 + ($10 << 4) >> 3]; + HEAPF64[$screenCoord + 24 >> 3] = +HEAPF64[$marker_info + 168 + ($10 << 4) + 8 >> 3]; + $18 = (6 - $1 | 0) % 4 | 0; + HEAPF64[$screenCoord + 32 >> 3] = +HEAPF64[$marker_info + 168 + ($18 << 4) >> 3]; + HEAPF64[$screenCoord + 40 >> 3] = +HEAPF64[$marker_info + 168 + ($18 << 4) + 8 >> 3]; + $26 = (7 - $1 | 0) % 4 | 0; + HEAPF64[$screenCoord + 48 >> 3] = +HEAPF64[$marker_info + 168 + ($26 << 4) >> 3]; + HEAPF64[$screenCoord + 56 >> 3] = +HEAPF64[$marker_info + 168 + ($26 << 4) + 8 >> 3]; + $33 = $width * -.5; + HEAPF64[$worldCoord >> 3] = $33; + $34 = $width * .5; + HEAPF64[$worldCoord + 8 >> 3] = $34; + HEAPF64[$worldCoord + 16 >> 3] = 0.0; + HEAPF64[$worldCoord + 24 >> 3] = $34; + HEAPF64[$worldCoord + 32 >> 3] = $34; + HEAPF64[$worldCoord + 40 >> 3] = 0.0; + HEAPF64[$worldCoord + 48 >> 3] = $34; + HEAPF64[$worldCoord + 56 >> 3] = $33; + HEAPF64[$worldCoord + 64 >> 3] = 0.0; + HEAPF64[$worldCoord + 72 >> 3] = $33; + HEAPF64[$worldCoord + 80 >> 3] = $33; + HEAPF64[$worldCoord + 88 >> 3] = 0.0; + HEAP32[$data >> 2] = $screenCoord; + HEAP32[$data + 4 >> 2] = $worldCoord; + HEAP32[$data + 8 >> 2] = 4; + $50 = (_icpPoint(HEAP32[$handle >> 2] | 0, $data, $initConv, $conv, $err) | 0) < 0; + STACKTOP = sp; + return +($50 ? 1.0e8 : +HEAPF64[$err >> 3]); +} + +function ___dynamic_cast($static_ptr, $static_type, $dst_type, $src2dst_offset) { + $static_ptr = $static_ptr | 0; + $static_type = $static_type | 0; + $dst_type = $dst_type | 0; + $src2dst_offset = $src2dst_offset | 0; + var $0 = 0, $10 = 0, $11 = 0, $12 = 0, $13 = 0, $14 = 0, $15 = 0, $16 = 0, $4 = 0, $6 = 0, $dst_ptr$0 = 0, $info = 0, dest = 0, sp = 0, stop = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 64 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $info = sp; + $0 = HEAP32[$static_ptr >> 2] | 0; + $4 = $static_ptr + (HEAP32[$0 + -8 >> 2] | 0) | 0; + $6 = HEAP32[$0 + -4 >> 2] | 0; + HEAP32[$info >> 2] = $dst_type; + HEAP32[$info + 4 >> 2] = $static_ptr; + HEAP32[$info + 8 >> 2] = $static_type; + HEAP32[$info + 12 >> 2] = $src2dst_offset; + $10 = $info + 16 | 0; + $11 = $info + 20 | 0; + $12 = $info + 24 | 0; + $13 = $info + 28 | 0; + $14 = $info + 32 | 0; + $15 = $info + 40 | 0; + $16 = ($6 | 0) == ($dst_type | 0); + dest = $10; + stop = dest + 36 | 0; + do { + HEAP32[dest >> 2] = 0; + dest = dest + 4 | 0; + } while ((dest | 0) < (stop | 0)); + HEAP16[$10 + 36 >> 1] = 0; + HEAP8[$10 + 38 >> 0] = 0; + L1 : do if ($16) { + HEAP32[$info + 48 >> 2] = 1; + FUNCTION_TABLE_viiiiii[HEAP32[(HEAP32[$dst_type >> 2] | 0) + 20 >> 2] & 3]($dst_type, $info, $4, $4, 1, 0); + $dst_ptr$0 = (HEAP32[$12 >> 2] | 0) == 1 ? $4 : 0; + } else { + FUNCTION_TABLE_viiiii[HEAP32[(HEAP32[$6 >> 2] | 0) + 24 >> 2] & 3]($6, $info, $4, 1, 0); + switch (HEAP32[$info + 36 >> 2] | 0) { + case 0: + { + $dst_ptr$0 = (HEAP32[$15 >> 2] | 0) == 1 & (HEAP32[$13 >> 2] | 0) == 1 & (HEAP32[$14 >> 2] | 0) == 1 ? HEAP32[$11 >> 2] | 0 : 0; + break L1; + break; + } + case 1: + break; + default: + { + $dst_ptr$0 = 0; + break L1; + } + } + if ((HEAP32[$12 >> 2] | 0) != 1) if (!((HEAP32[$15 >> 2] | 0) == 0 & (HEAP32[$13 >> 2] | 0) == 1 & (HEAP32[$14 >> 2] | 0) == 1)) { + $dst_ptr$0 = 0; + break; + } + $dst_ptr$0 = HEAP32[$10 >> 2] | 0; + } while (0); + STACKTOP = sp; + return $dst_ptr$0 | 0; +} + +function _arImageProcLumaHistAndOtsu($ipi, $dataPtr, $value_p) { + $ipi = $ipi | 0; + $dataPtr = $dataPtr | 0; + $value_p = $value_p | 0; + var $$0 = 0, $$lcssa = 0.0, $0 = 0, $12 = 0.0, $14 = 0, $18 = 0.0, $22 = 0.0, $27 = 0.0, $29 = 0.0, $6 = 0.0, $indvars$iv = 0, $indvars$iv1 = 0, $sum$0 = 0.0, $sumB$0 = 0.0, $sumB$1 = 0.0, $threshold$0 = 0, $threshold$1 = 0, $threshold$2 = 0, $varMax$0 = 0.0, $varMax$1 = 0.0, $wB$0 = 0.0; + $0 = _arImageProcLumaHist($ipi, $dataPtr) | 0; + if (($0 | 0) < 0) $$0 = $0; else { + $indvars$iv1 = 1; + $sum$0 = 0.0; + while (1) { + $6 = $sum$0 + +((Math_imul(HEAP32[$ipi + 16 + ($indvars$iv1 << 2) >> 2] | 0, $indvars$iv1) | 0) >>> 0); + $indvars$iv1 = $indvars$iv1 + 1 | 0; + if (($indvars$iv1 | 0) == 256) { + $$lcssa = $6; + break; + } else $sum$0 = $6; + } + $12 = +(Math_imul(HEAP32[$ipi + 12 >> 2] | 0, HEAP32[$ipi + 8 >> 2] | 0) | 0); + $indvars$iv = 0; + $sumB$0 = 0.0; + $threshold$0 = 0; + $varMax$0 = 0.0; + $wB$0 = 0.0; + while (1) { + $14 = HEAP32[$ipi + 16 + ($indvars$iv << 2) >> 2] | 0; + $wB$0 = $wB$0 + +($14 >>> 0); + if ($wB$0 != 0.0) { + $18 = $12 - $wB$0; + if ($18 == 0.0) { + $threshold$2 = $threshold$0; + break; + } + $22 = $sumB$0 + +((Math_imul($indvars$iv, $14) | 0) >>> 0); + $27 = $22 / $wB$0 - ($$lcssa - $22) / $18; + $29 = $27 * ($wB$0 * $18 * $27); + if ($29 > $varMax$0) { + $sumB$1 = $22; + $threshold$1 = $indvars$iv & 255; + $varMax$1 = $29; + } else { + $sumB$1 = $22; + $threshold$1 = $threshold$0; + $varMax$1 = $varMax$0; + } + } else { + $sumB$1 = $sumB$0; + $threshold$1 = $threshold$0; + $varMax$1 = $varMax$0; + } + if (($indvars$iv & 255) << 24 >> 24 == -1) { + $threshold$2 = $threshold$1; + break; + } else { + $indvars$iv = $indvars$iv + 1 | 0; + $sumB$0 = $sumB$1; + $threshold$0 = $threshold$1; + $varMax$0 = $varMax$1; + } + } + HEAP8[$value_p >> 0] = $threshold$2; + $$0 = 0; + } + return $$0 | 0; +} + +function __ZN53EmscriptenBindingInitializer_native_and_builtin_typesC2Ev($this) { + $this = $this | 0; + __embind_register_void(624, 14202); + __embind_register_bool(632, 14207, 1, 1, 0); + __embind_register_integer(640, 13783, 1, -128, 127); + __embind_register_integer(656, 13788, 1, -128, 127); + __embind_register_integer(648, 13800, 1, 0, 255); + __embind_register_integer(664, 13814, 2, -32768, 32767); + __embind_register_integer(672, 13820, 2, 0, 65535); + __embind_register_integer(680, 14212, 4, -2147483648, 2147483647); + __embind_register_integer(688, 14216, 4, 0, -1); + __embind_register_integer(696, 14229, 4, -2147483648, 2147483647); + __embind_register_integer(704, 14234, 4, 0, -1); + __embind_register_float(712, 14277, 4); + __embind_register_float(720, 14283, 8); + __embind_register_std_string(360, 12846); + __embind_register_std_string(392, 10916); + __embind_register_std_wstring(416, 4, 10949); + __embind_register_emval(440, 10962); + __embind_register_memory_view(448, 0, 10978); + __ZN12_GLOBAL__N_1L20register_memory_viewIaEEvPKc(11008); + __ZN12_GLOBAL__N_1L20register_memory_viewIhEEvPKc(11045); + __ZN12_GLOBAL__N_1L20register_memory_viewIsEEvPKc(11084); + __ZN12_GLOBAL__N_1L20register_memory_viewItEEvPKc(11115); + __ZN12_GLOBAL__N_1L20register_memory_viewIiEEvPKc(11155); + __ZN12_GLOBAL__N_1L20register_memory_viewIjEEvPKc(11184); + __embind_register_memory_view(456, 4, 11222); + __embind_register_memory_view(464, 5, 11252); + __ZN12_GLOBAL__N_1L20register_memory_viewIaEEvPKc(11291); + __ZN12_GLOBAL__N_1L20register_memory_viewIhEEvPKc(11323); + __ZN12_GLOBAL__N_1L20register_memory_viewIsEEvPKc(11356); + __ZN12_GLOBAL__N_1L20register_memory_viewItEEvPKc(11389); + __ZN12_GLOBAL__N_1L20register_memory_viewIiEEvPKc(11423); + __ZN12_GLOBAL__N_1L20register_memory_viewIjEEvPKc(11456); + __embind_register_memory_view(472, 6, 11490); + __embind_register_memory_view(480, 7, 11521); + __embind_register_memory_view(488, 7, 11553); + return; +} + +function _arSetPixelFormat($handle, $pixFormat) { + $handle = $handle | 0; + $pixFormat = $pixFormat | 0; + var $$0 = 0, $1 = 0, $14 = 0, $16 = 0, $17 = 0, $4 = 0, $6 = 0, $7 = 0, $monoFormat$0 = 0, $vararg_buffer = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + L1 : do if (!$handle) $$0 = -1; else { + $1 = $handle + 4 | 0; + if ((HEAP32[$1 >> 2] | 0) == ($pixFormat | 0)) $$0 = 0; else { + switch ($pixFormat | 0) { + case 11: + case 10: + case 9: + case 8: + case 7: + case 6: + case 4: + case 3: + case 2: + case 1: + case 0: + { + $monoFormat$0 = 0; + break; + } + case 14: + case 13: + case 12: + case 5: + { + $monoFormat$0 = 1; + break; + } + default: + { + HEAP32[$vararg_buffer >> 2] = $pixFormat; + _arLog(3, 3936, $vararg_buffer); + $$0 = -1; + break L1; + } + } + HEAP32[$1 >> 2] = $pixFormat; + $4 = _arUtilGetPixelSize($pixFormat) | 0; + HEAP32[$handle + 8 >> 2] = $4; + $6 = $handle + 7062408 | 0; + $7 = HEAP32[$6 >> 2] | 0; + if ($7) { + _arImageProcFinal($7); + $14 = _arImageProcInit(HEAP32[$handle + 36 >> 2] | 0, HEAP32[$handle + 40 >> 2] | 0, HEAP32[$1 >> 2] | 0, 0) | 0; + HEAP32[$6 >> 2] = $14; + } + $16 = $handle + 24 | 0; + $17 = HEAP32[$16 >> 2] | 0; + if (!$monoFormat$0) switch ($17 | 0) { + case 1: + { + HEAP32[$16 >> 2] = 4; + $$0 = 0; + break L1; + break; + } + case 4: + { + HEAP32[$16 >> 2] = 3; + $$0 = 0; + break L1; + break; + } + default: + { + $$0 = 0; + break L1; + } + } else switch ($17 | 0) { + case 0: + { + HEAP32[$16 >> 2] = 1; + $$0 = 0; + break L1; + break; + } + case 3: + { + HEAP32[$16 >> 2] = 4; + $$0 = 0; + break L1; + break; + } + default: + { + $$0 = 0; + break L1; + } + } + } + } while (0); + STACKTOP = sp; + return $$0 | 0; +} + +function _confidenceCutoff($arHandle) { + $arHandle = $arHandle | 0; + var $11 = 0, $21 = 0, $3 = 0, $31 = 0, $37 = 0, $6 = 0, $9 = 0, $cfOK$0 = 0, $i$010 = 0, $i$112 = 0, $i$29 = 0; + switch (HEAP32[$arHandle + 24 >> 2] | 0) { + case 1: + case 0: + { + $6 = HEAP32[$arHandle + 44 >> 2] | 0; + if (($6 | 0) > 0) { + $i$010 = 0; + do { + $11 = $arHandle + 48 + ($i$010 << 8) + 4 | 0; + if ((HEAP32[$11 >> 2] | 0) > -1) if (+HEAPF64[$arHandle + 48 + ($i$010 << 8) + 32 >> 3] < .5) { + HEAP32[$arHandle + 48 + ($i$010 << 8) + 8 >> 2] = -1; + HEAP32[$11 >> 2] = -1; + HEAP32[$arHandle + 48 + ($i$010 << 8) + 236 >> 2] = 6; + } + $i$010 = $i$010 + 1 | 0; + } while (($i$010 | 0) < ($6 | 0)); + } + break; + } + case 2: + { + $3 = HEAP32[$arHandle + 44 >> 2] | 0; + if (($3 | 0) > 0) { + $i$112 = 0; + do { + $21 = $arHandle + 48 + ($i$112 << 8) + 4 | 0; + if ((HEAP32[$21 >> 2] | 0) > -1) if (+HEAPF64[$arHandle + 48 + ($i$112 << 8) + 32 >> 3] < .5) { + HEAP32[$arHandle + 48 + ($i$112 << 8) + 12 >> 2] = -1; + HEAP32[$21 >> 2] = -1; + HEAP32[$arHandle + 48 + ($i$112 << 8) + 236 >> 2] = 6; + } + $i$112 = $i$112 + 1 | 0; + } while (($i$112 | 0) < ($3 | 0)); + } + break; + } + default: + { + $9 = HEAP32[$arHandle + 44 >> 2] | 0; + if (($9 | 0) > 0) { + $i$29 = 0; + do { + $31 = $arHandle + 48 + ($i$29 << 8) + 8 | 0; + if ((HEAP32[$31 >> 2] | 0) > -1) if (+HEAPF64[$arHandle + 48 + ($i$29 << 8) + 40 >> 3] < .5) { + HEAP32[$31 >> 2] = -1; + $cfOK$0 = 0; + } else $cfOK$0 = 1; else $cfOK$0 = 1; + $37 = $arHandle + 48 + ($i$29 << 8) + 12 | 0; + if ((HEAP32[$37 >> 2] | 0) > -1) if (+HEAPF64[$arHandle + 48 + ($i$29 << 8) + 48 >> 3] < .5) { + HEAP32[$37 >> 2] = -1; + if (!$cfOK$0) HEAP32[$arHandle + 48 + ($i$29 << 8) + 236 >> 2] = 6; + } + $i$29 = $i$29 + 1 | 0; + } while (($i$29 | 0) < ($9 | 0)); + } + } + } + return; +} + +function ___stpcpy($d, $s) { + $d = $d | 0; + $s = $s | 0; + var $$0$lcssa = 0, $$01$lcssa = 0, $$0115 = 0, $$016 = 0, $$03 = 0, $$1$ph = 0, $$12$ph = 0, $$128 = 0, $$19 = 0, $0 = 0, $10 = 0, $14 = 0, $20 = 0, $21 = 0, $22 = 0, $29 = 0, $32 = 0, $33 = 0, $7 = 0, $9 = 0, $wd$0$lcssa = 0, $wd$010 = 0, $ws$0$lcssa = 0, $ws$011 = 0, label = 0; + $0 = $s; + L1 : do if (!(($0 ^ $d) & 3)) { + if (!($0 & 3)) { + $$0$lcssa = $s; + $$01$lcssa = $d; + } else { + $$0115 = $d; + $$016 = $s; + while (1) { + $7 = HEAP8[$$016 >> 0] | 0; + HEAP8[$$0115 >> 0] = $7; + if (!($7 << 24 >> 24)) { + $$03 = $$0115; + break L1; + } + $9 = $$016 + 1 | 0; + $10 = $$0115 + 1 | 0; + if (!($9 & 3)) { + $$0$lcssa = $9; + $$01$lcssa = $10; + break; + } else { + $$0115 = $10; + $$016 = $9; + } + } + } + $14 = HEAP32[$$0$lcssa >> 2] | 0; + if (!(($14 & -2139062144 ^ -2139062144) & $14 + -16843009)) { + $22 = $14; + $wd$010 = $$01$lcssa; + $ws$011 = $$0$lcssa; + while (1) { + $20 = $ws$011 + 4 | 0; + $21 = $wd$010 + 4 | 0; + HEAP32[$wd$010 >> 2] = $22; + $22 = HEAP32[$20 >> 2] | 0; + if (($22 & -2139062144 ^ -2139062144) & $22 + -16843009) { + $wd$0$lcssa = $21; + $ws$0$lcssa = $20; + break; + } else { + $wd$010 = $21; + $ws$011 = $20; + } + } + } else { + $wd$0$lcssa = $$01$lcssa; + $ws$0$lcssa = $$0$lcssa; + } + $$1$ph = $ws$0$lcssa; + $$12$ph = $wd$0$lcssa; + label = 8; + } else { + $$1$ph = $s; + $$12$ph = $d; + label = 8; + } while (0); + if ((label | 0) == 8) { + $29 = HEAP8[$$1$ph >> 0] | 0; + HEAP8[$$12$ph >> 0] = $29; + if (!($29 << 24 >> 24)) $$03 = $$12$ph; else { + $$128 = $$12$ph; + $$19 = $$1$ph; + while (1) { + $$19 = $$19 + 1 | 0; + $32 = $$128 + 1 | 0; + $33 = HEAP8[$$19 >> 0] | 0; + HEAP8[$32 >> 0] = $33; + if (!($33 << 24 >> 24)) { + $$03 = $32; + break; + } else $$128 = $32; + } + } + } + return $$03 | 0; +} + +function __ZN10__cxxabiv112_GLOBAL__N_118parse_template_argINS0_2DbEEEPKcS4_S4_RT_($first, $last, $db) { + $first = $first | 0; + $last = $last | 0; + $db = $db | 0; + var $$0 = 0, $10 = 0, $17 = 0, $21 = 0, $22 = 0, $3 = 0, $4 = 0, $t$0 = 0, $t$0$lcssa = 0, $t$0$looptemp = 0; + L1 : do if (($first | 0) == ($last | 0)) $$0 = $first; else switch (HEAP8[$first >> 0] | 0) { + case 88: + { + $3 = $first + 1 | 0; + $4 = __ZN10__cxxabiv112_GLOBAL__N_116parse_expressionINS0_2DbEEEPKcS4_S4_RT_($3, $last, $db) | 0; + if (($4 | 0) == ($3 | 0) | ($4 | 0) == ($last | 0)) { + $$0 = $first; + break L1; + } + $$0 = (HEAP8[$4 >> 0] | 0) == 69 ? $4 + 1 | 0 : $first; + break L1; + break; + } + case 74: + { + $10 = $first + 1 | 0; + if (($10 | 0) == ($last | 0)) { + $$0 = $first; + break L1; + } else $t$0 = $10; + while (1) { + if ((HEAP8[$t$0 >> 0] | 0) == 69) { + $t$0$lcssa = $t$0; + break; + } + $t$0$looptemp = $t$0; + $t$0 = __ZN10__cxxabiv112_GLOBAL__N_118parse_template_argINS0_2DbEEEPKcS4_S4_RT_($t$0, $last, $db) | 0; + if (($t$0 | 0) == ($t$0$looptemp | 0)) { + $$0 = $first; + break L1; + } + } + $$0 = $t$0$lcssa + 1 | 0; + break L1; + break; + } + case 76: + { + $17 = $first + 1 | 0; + if (($17 | 0) != ($last | 0)) if ((HEAP8[$17 >> 0] | 0) == 90) { + $21 = $first + 2 | 0; + $22 = __ZN10__cxxabiv112_GLOBAL__N_114parse_encodingINS0_2DbEEEPKcS4_S4_RT_($21, $last, $db) | 0; + if (($22 | 0) == ($21 | 0) | ($22 | 0) == ($last | 0)) { + $$0 = $first; + break L1; + } + return ((HEAP8[$22 >> 0] | 0) == 69 ? $22 + 1 | 0 : $first) | 0; + } + $$0 = __ZN10__cxxabiv112_GLOBAL__N_118parse_expr_primaryINS0_2DbEEEPKcS4_S4_RT_($first, $last, $db) | 0; + break L1; + break; + } + default: + { + $$0 = __ZN10__cxxabiv112_GLOBAL__N_110parse_typeINS0_2DbEEEPKcS4_S4_RT_($first, $last, $db) | 0; + break L1; + } + } while (0); + return $$0 | 0; +} + +function _vfprintf($f, $fmt, $ap) { + $f = $f | 0; + $fmt = $fmt | 0; + $ap = $ap | 0; + var $$ = 0, $$0 = 0, $12 = 0, $16 = 0, $17 = 0, $18 = 0, $19 = 0, $21 = 0, $22 = 0, $28 = 0, $33 = 0, $6 = 0, $7 = 0, $ap2 = 0, $internal_buf = 0, $nl_arg = 0, $nl_type = 0, $ret$1 = 0, dest = 0, sp = 0, stop = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 224 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $ap2 = sp + 80 | 0; + $nl_type = sp + 96 | 0; + $nl_arg = sp; + $internal_buf = sp + 136 | 0; + dest = $nl_type; + stop = dest + 40 | 0; + do { + HEAP32[dest >> 2] = 0; + dest = dest + 4 | 0; + } while ((dest | 0) < (stop | 0)); + HEAP32[$ap2 >> 2] = HEAP32[$ap >> 2]; + if ((_printf_core(0, $fmt, $ap2, $nl_arg, $nl_type) | 0) < 0) $$0 = -1; else { + if ((HEAP32[$f + 76 >> 2] | 0) > -1) $33 = ___lockfile($f) | 0; else $33 = 0; + $6 = HEAP32[$f >> 2] | 0; + $7 = $6 & 32; + if ((HEAP8[$f + 74 >> 0] | 0) < 1) HEAP32[$f >> 2] = $6 & -33; + $12 = $f + 48 | 0; + if (!(HEAP32[$12 >> 2] | 0)) { + $16 = $f + 44 | 0; + $17 = HEAP32[$16 >> 2] | 0; + HEAP32[$16 >> 2] = $internal_buf; + $18 = $f + 28 | 0; + HEAP32[$18 >> 2] = $internal_buf; + $19 = $f + 20 | 0; + HEAP32[$19 >> 2] = $internal_buf; + HEAP32[$12 >> 2] = 80; + $21 = $f + 16 | 0; + HEAP32[$21 >> 2] = $internal_buf + 80; + $22 = _printf_core($f, $fmt, $ap2, $nl_arg, $nl_type) | 0; + if (!$17) $ret$1 = $22; else { + FUNCTION_TABLE_iiii[HEAP32[$f + 36 >> 2] & 15]($f, 0, 0) | 0; + $$ = (HEAP32[$19 >> 2] | 0) == 0 ? -1 : $22; + HEAP32[$16 >> 2] = $17; + HEAP32[$12 >> 2] = 0; + HEAP32[$21 >> 2] = 0; + HEAP32[$18 >> 2] = 0; + HEAP32[$19 >> 2] = 0; + $ret$1 = $$; + } + } else $ret$1 = _printf_core($f, $fmt, $ap2, $nl_arg, $nl_type) | 0; + $28 = HEAP32[$f >> 2] | 0; + HEAP32[$f >> 2] = $28 | $7; + if ($33) ___unlockfile($f); + $$0 = ($28 & 32 | 0) == 0 ? $ret$1 : -1; + } + STACKTOP = sp; + return $$0 | 0; +} + +function _get_vertex($x_coord, $y_coord, $st, $ed, $thresh, $vertex, $vnum) { + $x_coord = $x_coord | 0; + $y_coord = $y_coord | 0; + $st = $st | 0; + $ed = $ed | 0; + $thresh = +$thresh; + $vertex = $vertex | 0; + $vnum = $vnum | 0; + var $$0 = 0, $1 = 0, $11 = 0.0, $15 = 0.0, $16 = 0, $27 = 0.0, $28 = 0.0, $29 = 0, $3 = 0, $39 = 0, $5 = 0.0, $7 = 0, $9 = 0, $dmax$0$lcssa = 0.0, $dmax$01 = 0.0, $dmax$1 = 0.0, $i$02 = 0, $v1$0$lcssa = 0, $v1$03 = 0, $v1$1 = 0, label = 0; + $1 = HEAP32[$y_coord + ($ed << 2) >> 2] | 0; + $3 = HEAP32[$y_coord + ($st << 2) >> 2] | 0; + $5 = +($1 - $3 | 0); + $7 = HEAP32[$x_coord + ($st << 2) >> 2] | 0; + $9 = HEAP32[$x_coord + ($ed << 2) >> 2] | 0; + $11 = +($7 - $9 | 0); + $15 = +((Math_imul($9, $3) | 0) - (Math_imul($7, $1) | 0) | 0); + $16 = $st + 1 | 0; + if (($16 | 0) < ($ed | 0)) { + $dmax$01 = 0.0; + $i$02 = $16; + $v1$03 = $16; + while (1) { + $27 = $15 + ($5 * +(HEAP32[$x_coord + ($i$02 << 2) >> 2] | 0) + $11 * +(HEAP32[$y_coord + ($i$02 << 2) >> 2] | 0)); + $28 = $27 * $27; + $29 = $28 > $dmax$01; + $dmax$1 = $29 ? $28 : $dmax$01; + $v1$1 = $29 ? $i$02 : $v1$03; + $i$02 = $i$02 + 1 | 0; + if (($i$02 | 0) >= ($ed | 0)) { + $dmax$0$lcssa = $dmax$1; + $v1$0$lcssa = $v1$1; + break; + } else { + $dmax$01 = $dmax$1; + $v1$03 = $v1$1; + } + } + } else { + $dmax$0$lcssa = 0.0; + $v1$0$lcssa = $16; + } + if ($dmax$0$lcssa / ($5 * $5 + $11 * $11) > $thresh) if ((_get_vertex($x_coord, $y_coord, $st, $v1$0$lcssa, $thresh, $vertex, $vnum) | 0) < 0) $$0 = -1; else { + $39 = HEAP32[$vnum >> 2] | 0; + if (($39 | 0) > 5) $$0 = -1; else { + HEAP32[$vertex + ($39 << 2) >> 2] = $v1$0$lcssa; + HEAP32[$vnum >> 2] = (HEAP32[$vnum >> 2] | 0) + 1; + if ((_get_vertex($x_coord, $y_coord, $v1$0$lcssa, $ed, $thresh, $vertex, $vnum) | 0) < 0) $$0 = -1; else label = 7; + } + } else label = 7; + if ((label | 0) == 7) $$0 = 0; + return $$0 | 0; +} + +function _setMarkerInfoVertex($id, $markerIndex) { + $id = $id | 0; + $markerIndex = $markerIndex | 0; + var $$0 = 0, $0 = 0, $13 = 0.0, $15 = 0.0, $17 = 0.0, $19 = 0.0, $21 = 0.0, $23 = 0.0, $25 = 0.0, $27 = 0.0, $5 = 0, $6 = 0, $_ZL11gMarkerInfo$ = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $0 = sp; + HEAP32[$0 >> 2] = $id; + do if (!(__ZNSt3__112__hash_tableINS_17__hash_value_typeIi12arControllerEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE4findIiEENS_15__hash_iteratorIPNS_11__hash_nodeIS3_PvEEEERKT_(2044, $0) | 0)) $$0 = HEAP32[522] | 0; else { + $5 = (__ZNSt3__113unordered_mapIi12arControllerNS_4hashIiEENS_8equal_toIiEENS_9allocatorINS_4pairIKiS1_EEEEEixERS8_(2044, $0) | 0) + 212 | 0; + $6 = HEAP32[$5 >> 2] | 0; + if ((HEAP32[$6 + 44 >> 2] | 0) > ($markerIndex | 0)) { + $_ZL11gMarkerInfo$ = ($markerIndex | 0) < 0 ? 8 : $6 + 48 + ($markerIndex << 8) | 0; + $13 = +HEAPF64[33]; + HEAPF64[$_ZL11gMarkerInfo$ + 168 >> 3] = $13; + $15 = +HEAPF64[34]; + HEAPF64[$_ZL11gMarkerInfo$ + 176 >> 3] = $15; + $17 = +HEAPF64[35]; + HEAPF64[$_ZL11gMarkerInfo$ + 184 >> 3] = $17; + $19 = +HEAPF64[36]; + HEAPF64[$_ZL11gMarkerInfo$ + 192 >> 3] = $19; + $21 = +HEAPF64[37]; + HEAPF64[$_ZL11gMarkerInfo$ + 200 >> 3] = $21; + $23 = +HEAPF64[38]; + HEAPF64[$_ZL11gMarkerInfo$ + 208 >> 3] = $23; + $25 = +HEAPF64[39]; + HEAPF64[$_ZL11gMarkerInfo$ + 216 >> 3] = $25; + $27 = +HEAPF64[40]; + HEAPF64[$_ZL11gMarkerInfo$ + 224 >> 3] = $27; + HEAPF64[$_ZL11gMarkerInfo$ + 56 >> 3] = ($13 + $17 + $21 + $25) * .25; + HEAPF64[$_ZL11gMarkerInfo$ + 64 >> 3] = ($15 + $19 + $23 + $27) * .25; + $$0 = 0; + break; + } else { + $$0 = HEAP32[523] | 0; + break; + } + } while (0); + STACKTOP = sp; + return $$0 | 0; +} + +function ___stdio_read($f, $buf, $len) { + $f = $f | 0; + $buf = $buf | 0; + $len = $len | 0; + var $$0 = 0, $0 = 0, $1 = 0, $15 = 0, $2 = 0, $27 = 0, $30 = 0, $31 = 0, $32 = 0, $7 = 0, $cnt$0 = 0, $iov = 0, $vararg_buffer = 0, $vararg_buffer3 = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 48 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer3 = sp + 16 | 0; + $vararg_buffer = sp; + $iov = sp + 32 | 0; + HEAP32[$iov >> 2] = $buf; + $0 = $iov + 4 | 0; + $1 = $f + 48 | 0; + $2 = HEAP32[$1 >> 2] | 0; + HEAP32[$0 >> 2] = $len - (($2 | 0) != 0 & 1); + $7 = $f + 44 | 0; + HEAP32[$iov + 8 >> 2] = HEAP32[$7 >> 2]; + HEAP32[$iov + 12 >> 2] = $2; + if (!(HEAP32[597] | 0)) { + HEAP32[$vararg_buffer3 >> 2] = HEAP32[$f + 60 >> 2]; + HEAP32[$vararg_buffer3 + 4 >> 2] = $iov; + HEAP32[$vararg_buffer3 + 8 >> 2] = 2; + $cnt$0 = ___syscall_ret(___syscall145(145, $vararg_buffer3 | 0) | 0) | 0; + } else { + _pthread_cleanup_push(13, $f | 0); + HEAP32[$vararg_buffer >> 2] = HEAP32[$f + 60 >> 2]; + HEAP32[$vararg_buffer + 4 >> 2] = $iov; + HEAP32[$vararg_buffer + 8 >> 2] = 2; + $15 = ___syscall_ret(___syscall145(145, $vararg_buffer | 0) | 0) | 0; + _pthread_cleanup_pop(0); + $cnt$0 = $15; + } + if (($cnt$0 | 0) < 1) { + HEAP32[$f >> 2] = HEAP32[$f >> 2] | $cnt$0 & 48 ^ 16; + HEAP32[$f + 8 >> 2] = 0; + HEAP32[$f + 4 >> 2] = 0; + $$0 = $cnt$0; + } else { + $27 = HEAP32[$0 >> 2] | 0; + if ($cnt$0 >>> 0 > $27 >>> 0) { + $30 = HEAP32[$7 >> 2] | 0; + $31 = $f + 4 | 0; + HEAP32[$31 >> 2] = $30; + $32 = $30; + HEAP32[$f + 8 >> 2] = $32 + ($cnt$0 - $27); + if (!(HEAP32[$1 >> 2] | 0)) $$0 = $len; else { + HEAP32[$31 >> 2] = $32 + 1; + HEAP8[$buf + ($len + -1) >> 0] = HEAP8[$32 >> 0] | 0; + $$0 = $len; + } + } else $$0 = $cnt$0; + } + STACKTOP = sp; + return $$0 | 0; +} + +function __ZNK10__cxxabiv121__vmi_class_type_info16search_above_dstEPNS_19__dynamic_cast_infoEPKvS4_ib($this, $info, $dst_ptr, $current_ptr, $path_below, $use_strcmp) { + $this = $this | 0; + $info = $info | 0; + $dst_ptr = $dst_ptr | 0; + $current_ptr = $current_ptr | 0; + $path_below = $path_below | 0; + $use_strcmp = $use_strcmp | 0; + var $10 = 0, $13 = 0, $14 = 0, $15 = 0, $3 = 0, $4 = 0, $5 = 0, $6 = 0, $9 = 0, $p$0 = 0; + if (($this | 0) == (HEAP32[$info + 8 >> 2] | 0)) __ZNK10__cxxabiv117__class_type_info29process_static_type_above_dstEPNS_19__dynamic_cast_infoEPKvS4_i(0, $info, $dst_ptr, $current_ptr, $path_below); else { + $3 = $info + 52 | 0; + $4 = HEAP8[$3 >> 0] | 0; + $5 = $info + 53 | 0; + $6 = HEAP8[$5 >> 0] | 0; + $9 = HEAP32[$this + 12 >> 2] | 0; + $10 = $this + 16 + ($9 << 3) | 0; + HEAP8[$3 >> 0] = 0; + HEAP8[$5 >> 0] = 0; + __ZNK10__cxxabiv122__base_class_type_info16search_above_dstEPNS_19__dynamic_cast_infoEPKvS4_ib($this + 16 | 0, $info, $dst_ptr, $current_ptr, $path_below, $use_strcmp); + L4 : do if (($9 | 0) > 1) { + $13 = $info + 24 | 0; + $14 = $this + 8 | 0; + $15 = $info + 54 | 0; + $p$0 = $this + 24 | 0; + do { + if (HEAP8[$15 >> 0] | 0) break L4; + if (!(HEAP8[$3 >> 0] | 0)) { + if (HEAP8[$5 >> 0] | 0) if (!(HEAP32[$14 >> 2] & 1)) break L4; + } else { + if ((HEAP32[$13 >> 2] | 0) == 1) break L4; + if (!(HEAP32[$14 >> 2] & 2)) break L4; + } + HEAP8[$3 >> 0] = 0; + HEAP8[$5 >> 0] = 0; + __ZNK10__cxxabiv122__base_class_type_info16search_above_dstEPNS_19__dynamic_cast_infoEPKvS4_ib($p$0, $info, $dst_ptr, $current_ptr, $path_below, $use_strcmp); + $p$0 = $p$0 + 8 | 0; + } while ($p$0 >>> 0 < $10 >>> 0); + } while (0); + HEAP8[$3 >> 0] = $4; + HEAP8[$5 >> 0] = $6; + } + return; +} + +function _teardown($id) { + $id = $id | 0; + var $$0 = 0, $0 = 0, $10 = 0, $11 = 0, $13 = 0, $16 = 0, $3 = 0, $4 = 0, $5 = 0, $i$02 = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $0 = sp; + HEAP32[$0 >> 2] = $id; + if (!(__ZNSt3__112__hash_tableINS_17__hash_value_typeIi12arControllerEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE4findIiEENS_15__hash_iteratorIPNS_11__hash_nodeIS3_PvEEEERKT_(2044, $0) | 0)) $$0 = -1; else { + $3 = __ZNSt3__113unordered_mapIi12arControllerNS_4hashIiEENS_8equal_toIiEENS_9allocatorINS_4pairIKiS1_EEEEEixERS8_(2044, $0) | 0; + $4 = $3 + 196 | 0; + $5 = HEAP32[$4 >> 2] | 0; + if ($5) { + _free($5); + HEAP32[$4 >> 2] = 0; + HEAP32[$3 + 200 >> 2] = 0; + } + _deleteHandle($3); + _arPattDeleteHandle(HEAP32[$3 + 216 >> 2] | 0) | 0; + __ZNSt3__112__hash_tableINS_17__hash_value_typeIi12arControllerEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE14__erase_uniqueIiEEjRKT_(2044, $0) | 0; + $10 = $3 + 248 | 0; + $11 = $3 + 252 | 0; + $13 = HEAP32[$10 >> 2] | 0; + if ((HEAP32[$11 >> 2] | 0) != ($13 | 0)) { + $16 = $13; + $i$02 = 0; + do { + _arMultiFreeConfig(HEAP32[$16 + ($i$02 << 3) + 4 >> 2] | 0) | 0; + $i$02 = $i$02 + 1 | 0; + $16 = HEAP32[$10 >> 2] | 0; + } while ($i$02 >>> 0 < (HEAP32[$11 >> 2] | 0) - $16 >> 3 >>> 0); + } + __ZNSt3__113__vector_baseI12multi_markerNS_9allocatorIS1_EEED2Ev($10); + __ZdlPv($10); + __ZNSt3__113__vector_baseI12multi_markerNS_9allocatorIS1_EEED2Ev($3 + 248 | 0); + __ZdlPv($3); + $$0 = 0; + } + STACKTOP = sp; + return $$0 | 0; +} + +function __ZN10__cxxabiv112_GLOBAL__N_115parse_simple_idINS0_2DbEEEPKcS4_S4_RT_($first, $last, $db) { + $first = $first | 0; + $last = $last | 0; + $db = $db | 0; + var $$0 = 0, $1 = 0, $14 = 0, $15 = 0, $16 = 0, $17 = 0, $20 = 0, $22 = 0, $3 = 0, $5 = 0, $6 = 0, $args = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $args = sp; + if (($first | 0) == ($last | 0)) $$0 = $first; else { + $1 = __ZN10__cxxabiv112_GLOBAL__N_117parse_source_nameINS0_2DbEEEPKcS4_S4_RT_($first, $last, $db) | 0; + if (($1 | 0) == ($first | 0)) $$0 = $first; else { + $3 = __ZN10__cxxabiv112_GLOBAL__N_119parse_template_argsINS0_2DbEEEPKcS4_S4_RT_($1, $last, $db) | 0; + if (($3 | 0) == ($1 | 0)) $$0 = $1; else { + $5 = $db + 4 | 0; + $6 = HEAP32[$5 >> 2] | 0; + if ((($6 - (HEAP32[$db >> 2] | 0) | 0) / 24 | 0) >>> 0 < 2) $$0 = $first; else { + __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($args, $6 + -24 | 0); + $14 = HEAP32[$5 >> 2] | 0; + $15 = $14 + -24 | 0; + $17 = $14; + do { + $16 = $17 + -24 | 0; + HEAP32[$5 >> 2] = $16; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($16); + $17 = HEAP32[$5 >> 2] | 0; + } while (($17 | 0) != ($15 | 0)); + $20 = HEAP8[$args >> 0] | 0; + $22 = ($20 & 1) == 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($14 + -48 | 0, $22 ? $args + 1 | 0 : HEAP32[$args + 8 >> 2] | 0, $22 ? ($20 & 255) >>> 1 : HEAP32[$args + 4 >> 2] | 0) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($args); + $$0 = $3; + } + } + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arMatrixMul($dest, $a, $b) { + $dest = $dest | 0; + $a = $a | 0; + $b = $b | 0; + var $$0 = 0, $1 = 0, $11 = 0, $18 = 0, $19 = 0, $20 = 0, $29 = 0.0, $6 = 0, $c$04 = 0, $i$01 = 0, $p1$02 = 0, $p2$03 = 0, $p3$09 = 0, $p3$15 = 0, $r$08 = 0, $smax = 0; + $1 = HEAP32[$a + 8 >> 2] | 0; + if (($1 | 0) == (HEAP32[$b + 4 >> 2] | 0)) { + $6 = HEAP32[$dest + 4 >> 2] | 0; + if (($6 | 0) == (HEAP32[$a + 4 >> 2] | 0)) { + $11 = HEAP32[$dest + 8 >> 2] | 0; + if (($11 | 0) == (HEAP32[$b + 8 >> 2] | 0)) { + $smax = ($11 | 0) > 0 ? $11 : 0; + if (($6 | 0) > 0) { + $18 = ($11 | 0) > 0; + $19 = ($1 | 0) > 0; + $p3$09 = HEAP32[$dest >> 2] | 0; + $r$08 = 0; + while (1) { + $20 = Math_imul($1, $r$08) | 0; + if ($18) { + $c$04 = 0; + $p3$15 = $p3$09; + while (1) { + HEAPF64[$p3$15 >> 3] = 0.0; + if ($19) { + $29 = 0.0; + $i$01 = 0; + $p1$02 = (HEAP32[$a >> 2] | 0) + ($20 << 3) | 0; + $p2$03 = (HEAP32[$b >> 2] | 0) + ($c$04 << 3) | 0; + while (1) { + $29 = $29 + +HEAPF64[$p1$02 >> 3] * +HEAPF64[$p2$03 >> 3]; + HEAPF64[$p3$15 >> 3] = $29; + $i$01 = $i$01 + 1 | 0; + if (($i$01 | 0) >= ($1 | 0)) break; else { + $p1$02 = $p1$02 + 8 | 0; + $p2$03 = $p2$03 + ($11 << 3) | 0; + } + } + } + $c$04 = $c$04 + 1 | 0; + if (($c$04 | 0) >= ($11 | 0)) break; else $p3$15 = $p3$15 + 8 | 0; + } + } + $r$08 = $r$08 + 1 | 0; + if (($r$08 | 0) >= ($6 | 0)) { + $$0 = 0; + break; + } else $p3$09 = $p3$09 + ($smax << 3) | 0; + } + } else $$0 = 0; + } else $$0 = -1; + } else $$0 = -1; + } else $$0 = -1; + return $$0 | 0; +} + +function __ZNSt3__16vectorINS0_INS0_IN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEEENS4_IS6_Lj4096EEEEENS4_IS8_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS8_RS9_EE($this, $__v) { + $this = $this | 0; + $__v = $__v | 0; + var $$0$i1 = 0, $0 = 0, $1 = 0, $11 = 0, $14 = 0, $16 = 0, $2 = 0, $22 = 0, $24 = 0, $25 = 0, $27 = 0, $28 = 0, $29 = 0, $3 = 0, $5 = 0, $6 = 0, $9 = 0, $$0$i1$looptemp = 0; + $0 = HEAP32[$this >> 2] | 0; + $1 = $this + 4 | 0; + $2 = HEAP32[$1 >> 2] | 0; + $3 = $__v + 4 | 0; + if (($2 | 0) != ($0 | 0)) { + $$0$i1 = $2; + do { + $5 = HEAP32[$3 >> 2] | 0; + $6 = $5 + -16 | 0; + $$0$i1$looptemp = $$0$i1; + $$0$i1 = $$0$i1 + -16 | 0; + HEAP32[$6 >> 2] = 0; + $9 = $5 + -12 | 0; + HEAP32[$9 >> 2] = 0; + $11 = HEAP32[$$0$i1$looptemp + -4 >> 2] | 0; + HEAP32[$5 + -8 >> 2] = 0; + HEAP32[$5 + -4 >> 2] = $11; + HEAP32[$6 >> 2] = HEAP32[$$0$i1 >> 2]; + $14 = $$0$i1$looptemp + -12 | 0; + HEAP32[$9 >> 2] = HEAP32[$14 >> 2]; + $16 = $$0$i1$looptemp + -8 | 0; + HEAP32[$5 + -8 >> 2] = HEAP32[$16 >> 2]; + HEAP32[$16 >> 2] = 0; + HEAP32[$14 >> 2] = 0; + HEAP32[$$0$i1 >> 2] = 0; + HEAP32[$3 >> 2] = (HEAP32[$3 >> 2] | 0) + -16; + } while (($$0$i1 | 0) != ($0 | 0)); + } + $22 = HEAP32[$this >> 2] | 0; + HEAP32[$this >> 2] = HEAP32[$3 >> 2]; + HEAP32[$3 >> 2] = $22; + $24 = $__v + 8 | 0; + $25 = HEAP32[$1 >> 2] | 0; + HEAP32[$1 >> 2] = HEAP32[$24 >> 2]; + HEAP32[$24 >> 2] = $25; + $27 = $this + 8 | 0; + $28 = $__v + 12 | 0; + $29 = HEAP32[$27 >> 2] | 0; + HEAP32[$27 >> 2] = HEAP32[$28 >> 2]; + HEAP32[$28 >> 2] = $29; + HEAP32[$__v >> 2] = HEAP32[$3 >> 2]; + return; +} + +function _strspn($s, $c) { + $s = $s | 0; + $c = $c | 0; + var $$0 = 0, $$028 = 0, $$03 = 0, $$03$lcssa = 0, $$1$lcssa = 0, $$16 = 0, $0 = 0, $11 = 0, $14 = 0, $18 = 0, $24 = 0, $33 = 0, $byteset = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 32 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $byteset = sp; + HEAP32[$byteset >> 2] = 0; + HEAP32[$byteset + 4 >> 2] = 0; + HEAP32[$byteset + 8 >> 2] = 0; + HEAP32[$byteset + 12 >> 2] = 0; + HEAP32[$byteset + 16 >> 2] = 0; + HEAP32[$byteset + 20 >> 2] = 0; + HEAP32[$byteset + 24 >> 2] = 0; + HEAP32[$byteset + 28 >> 2] = 0; + $0 = HEAP8[$c >> 0] | 0; + do if (!($0 << 24 >> 24)) $$0 = 0; else { + if (!(HEAP8[$c + 1 >> 0] | 0)) { + $$03 = $s; + while (1) if ((HEAP8[$$03 >> 0] | 0) == $0 << 24 >> 24) $$03 = $$03 + 1 | 0; else { + $$03$lcssa = $$03; + break; + } + $$0 = $$03$lcssa - $s | 0; + break; + } else { + $$028 = $c; + $14 = $0; + } + do { + $18 = $byteset + ((($14 & 255) >>> 5 & 255) << 2) | 0; + HEAP32[$18 >> 2] = HEAP32[$18 >> 2] | 1 << ($14 & 31); + $$028 = $$028 + 1 | 0; + $14 = HEAP8[$$028 >> 0] | 0; + } while ($14 << 24 >> 24 != 0); + $11 = HEAP8[$s >> 0] | 0; + L10 : do if (!($11 << 24 >> 24)) $$1$lcssa = $s; else { + $$16 = $s; + $24 = $11; + while (1) { + if (!(HEAP32[$byteset + ((($24 & 255) >>> 5 & 255) << 2) >> 2] & 1 << ($24 & 31))) { + $$1$lcssa = $$16; + break L10; + } + $33 = $$16 + 1 | 0; + $24 = HEAP8[$33 >> 0] | 0; + if (!($24 << 24 >> 24)) { + $$1$lcssa = $33; + break; + } else $$16 = $33; + } + } while (0); + $$0 = $$1$lcssa - $s | 0; + } while (0); + STACKTOP = sp; + return $$0 | 0; +} + +function _arLog($logLevel, $format, $varargs) { + $logLevel = $logLevel | 0; + $format = $format | 0; + $varargs = $varargs | 0; + var $12 = 0, $15 = 0, $16 = 0, $21 = 0, $29 = 0, $5 = 0, $7 = 0, $ap = 0, $buf = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 32 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $buf = sp + 16 | 0; + $ap = sp; + HEAP32[$buf >> 2] = 0; + if (($format | 0) != 0 & (HEAP32[496] | 0) <= ($logLevel | 0)) if (HEAP8[$format >> 0] | 0) { + HEAP32[$ap >> 2] = $varargs; + $5 = _vasprintf($buf, $format, $ap) | 0; + if (($5 | 0) > -1) { + $7 = HEAP32[497] | 0; + do if (!$7) _fputs(HEAP32[$buf >> 2] | 0, HEAP32[659] | 0) | 0; else { + if (!(HEAP32[498] | 0)) { + FUNCTION_TABLE_vi[$7 & 15](HEAP32[$buf >> 2] | 0); + break; + } + $12 = _pthread_self() | 0; + $15 = HEAP32[500] | 0; + if (($12 | 0) == (HEAP32[499] | 0)) { + if (($15 | 0) > 0) { + FUNCTION_TABLE_vi[$7 & 15](HEAP32[502] | 0); + HEAP32[500] = 0; + $29 = HEAP32[497] | 0; + } else $29 = $7; + FUNCTION_TABLE_vi[$29 & 15](HEAP32[$buf >> 2] | 0); + break; + } + $16 = HEAP32[501] | 0; + if (($15 | 0) < ($16 | 0)) { + $21 = (HEAP32[502] | 0) + $15 | 0; + if (($5 | 0) < (-3 - $15 + $16 | 0)) { + _strcpy($21, HEAP32[$buf >> 2] | 0) | 0; + HEAP32[500] = (HEAP32[500] | 0) + $5; + break; + } else { + HEAP8[$21 >> 0] = 46; + HEAP8[$21 + 1 >> 0] = 46; + HEAP8[$21 + 2 >> 0] = 46; + HEAP8[$21 + 3 >> 0] = 0; + HEAP32[500] = HEAP32[501]; + break; + } + } + } while (0); + _free(HEAP32[$buf >> 2] | 0); + } + } + STACKTOP = sp; + return; +} + +function __ZNSt3__16vectorINS0_IN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEEENS4_IS6_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS6_RS7_EE($this, $__v) { + $this = $this | 0; + $__v = $__v | 0; + var $$0$i1 = 0, $0 = 0, $1 = 0, $11 = 0, $14 = 0, $16 = 0, $2 = 0, $22 = 0, $24 = 0, $25 = 0, $27 = 0, $28 = 0, $29 = 0, $3 = 0, $5 = 0, $6 = 0, $9 = 0, $$0$i1$looptemp = 0; + $0 = HEAP32[$this >> 2] | 0; + $1 = $this + 4 | 0; + $2 = HEAP32[$1 >> 2] | 0; + $3 = $__v + 4 | 0; + if (($2 | 0) != ($0 | 0)) { + $$0$i1 = $2; + do { + $5 = HEAP32[$3 >> 2] | 0; + $6 = $5 + -16 | 0; + $$0$i1$looptemp = $$0$i1; + $$0$i1 = $$0$i1 + -16 | 0; + HEAP32[$6 >> 2] = 0; + $9 = $5 + -12 | 0; + HEAP32[$9 >> 2] = 0; + $11 = HEAP32[$$0$i1$looptemp + -4 >> 2] | 0; + HEAP32[$5 + -8 >> 2] = 0; + HEAP32[$5 + -4 >> 2] = $11; + HEAP32[$6 >> 2] = HEAP32[$$0$i1 >> 2]; + $14 = $$0$i1$looptemp + -12 | 0; + HEAP32[$9 >> 2] = HEAP32[$14 >> 2]; + $16 = $$0$i1$looptemp + -8 | 0; + HEAP32[$5 + -8 >> 2] = HEAP32[$16 >> 2]; + HEAP32[$16 >> 2] = 0; + HEAP32[$14 >> 2] = 0; + HEAP32[$$0$i1 >> 2] = 0; + HEAP32[$3 >> 2] = (HEAP32[$3 >> 2] | 0) + -16; + } while (($$0$i1 | 0) != ($0 | 0)); + } + $22 = HEAP32[$this >> 2] | 0; + HEAP32[$this >> 2] = HEAP32[$3 >> 2]; + HEAP32[$3 >> 2] = $22; + $24 = $__v + 8 | 0; + $25 = HEAP32[$1 >> 2] | 0; + HEAP32[$1 >> 2] = HEAP32[$24 >> 2]; + HEAP32[$24 >> 2] = $25; + $27 = $this + 8 | 0; + $28 = $__v + 12 | 0; + $29 = HEAP32[$27 >> 2] | 0; + HEAP32[$27 >> 2] = HEAP32[$28 >> 2]; + HEAP32[$28 >> 2] = $29; + HEAP32[$__v >> 2] = HEAP32[$3 >> 2]; + return; +} + +function _getMultiEachMarkerInfo($id, $multiMarkerId, $markerIndex) { + $id = $id | 0; + $multiMarkerId = $multiMarkerId | 0; + $markerIndex = $markerIndex | 0; + var $$0 = 0, $0 = 0, $17 = 0, $23 = 0, $4 = 0, $8 = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $0 = sp; + HEAP32[$0 >> 2] = $id; + do if (!(__ZNSt3__112__hash_tableINS_17__hash_value_typeIi12arControllerEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE4findIiEENS_15__hash_iteratorIPNS_11__hash_nodeIS3_PvEEEERKT_(2044, $0) | 0)) $$0 = HEAP32[522] | 0; else { + $4 = __ZNSt3__113unordered_mapIi12arControllerNS_4hashIiEENS_8equal_toIiEENS_9allocatorINS_4pairIKiS1_EEEEEixERS8_(2044, $0) | 0; + $8 = HEAP32[$4 + 248 >> 2] | 0; + if (($multiMarkerId | 0) < 0 ? 1 : (HEAP32[$4 + 252 >> 2] | 0) - $8 >> 3 >>> 0 <= $multiMarkerId >>> 0) { + $$0 = HEAP32[524] | 0; + break; + } + $17 = HEAP32[$8 + ($multiMarkerId << 3) + 4 >> 2] | 0; + if (($markerIndex | 0) < 0 ? 1 : (HEAP32[$17 + 4 >> 2] | 0) <= ($markerIndex | 0)) { + $$0 = HEAP32[523] | 0; + break; + } else { + $23 = HEAP32[$17 >> 2] | 0; + _matrixCopy($23 + ($markerIndex * 320 | 0) + 16 | 0, 264); + _emscripten_asm_const_4(0, HEAP32[$23 + ($markerIndex * 320 | 0) + 304 >> 2] | 0, HEAP32[$23 + ($markerIndex * 320 | 0) >> 2] | 0, HEAP32[$23 + ($markerIndex * 320 | 0) + 4 >> 2] | 0, +(+HEAPF64[$23 + ($markerIndex * 320 | 0) + 8 >> 3])) | 0; + $$0 = 0; + break; + } + } while (0); + STACKTOP = sp; + return $$0 | 0; +} + +function __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendIPKcEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueERS7_E4typeESC_SC_($this, $__first, $__last) { + $this = $this | 0; + $__first = $__first | 0; + $__last = $__last | 0; + var $$03 = 0, $0 = 0, $1 = 0, $12 = 0, $15 = 0, $16 = 0, $21 = 0, $29 = 0, $34 = 0, $41 = 0, $8 = 0, $__p$04 = 0, $scevgep1 = 0; + $0 = $__first; + $1 = HEAP8[$this >> 0] | 0; + if (!($1 & 1)) { + $15 = 10; + $16 = ($1 & 255) >>> 1; + $41 = $1; + } else { + $8 = HEAP32[$this >> 2] | 0; + $15 = ($8 & -2) + -1 | 0; + $16 = HEAP32[$this + 4 >> 2] | 0; + $41 = $8 & 255; + } + $12 = $__last - $0 | 0; + do if (($__last | 0) != ($__first | 0)) { + if (($15 - $16 | 0) >>> 0 < $12 >>> 0) { + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE9__grow_byEjjjjjj($this, $15, $16 + $12 - $15 | 0, $16, $16, 0); + $21 = HEAP8[$this >> 0] | 0; + } else $21 = $41; + if (!($21 & 1)) $29 = $this + 1 | 0; else $29 = HEAP32[$this + 8 >> 2] | 0; + $scevgep1 = $__last + ($16 - $0) | 0; + if (($__first | 0) != ($__last | 0)) { + $$03 = $__first; + $__p$04 = $29 + $16 | 0; + while (1) { + HEAP8[$__p$04 >> 0] = HEAP8[$$03 >> 0] | 0; + $$03 = $$03 + 1 | 0; + if (($$03 | 0) == ($__last | 0)) break; else $__p$04 = $__p$04 + 1 | 0; + } + } + HEAP8[$29 + $scevgep1 >> 0] = 0; + $34 = $16 + $12 | 0; + if (!(HEAP8[$this >> 0] & 1)) { + HEAP8[$this >> 0] = $34 << 1; + break; + } else { + HEAP32[$this + 4 >> 2] = $34; + break; + } + } while (0); + return; +} + +function _fread($destv, $size, $nmemb, $f) { + $destv = $destv | 0; + $size = $size | 0; + $nmemb = $nmemb | 0; + $f = $f | 0; + var $$ = 0, $$0 = 0, $0 = 0, $13 = 0, $14 = 0, $17 = 0, $24 = 0, $28 = 0, $32 = 0, $5 = 0, $7 = 0, $dest$0$ph = 0, $dest$02 = 0, $l$0$ph = 0, $l$03 = 0, $l$03$lcssa = 0, label = 0; + $0 = Math_imul($nmemb, $size) | 0; + if ((HEAP32[$f + 76 >> 2] | 0) > -1) $32 = ___lockfile($f) | 0; else $32 = 0; + $5 = $f + 74 | 0; + $7 = HEAP8[$5 >> 0] | 0; + HEAP8[$5 >> 0] = $7 + 255 | $7; + $13 = $f + 4 | 0; + $14 = HEAP32[$13 >> 2] | 0; + $17 = (HEAP32[$f + 8 >> 2] | 0) - $14 | 0; + if (($17 | 0) > 0) { + $$ = $17 >>> 0 < $0 >>> 0 ? $17 : $0; + _memcpy($destv | 0, $14 | 0, $$ | 0) | 0; + HEAP32[$13 >> 2] = $14 + $$; + $dest$0$ph = $destv + $$ | 0; + $l$0$ph = $0 - $$ | 0; + } else { + $dest$0$ph = $destv; + $l$0$ph = $0; + } + L7 : do if (!$l$0$ph) label = 13; else { + $24 = $f + 32 | 0; + $dest$02 = $dest$0$ph; + $l$03 = $l$0$ph; + while (1) { + if (___toread($f) | 0) { + $l$03$lcssa = $l$03; + break; + } + $28 = FUNCTION_TABLE_iiii[HEAP32[$24 >> 2] & 15]($f, $dest$02, $l$03) | 0; + if (($28 + 1 | 0) >>> 0 < 2) { + $l$03$lcssa = $l$03; + break; + } + if (($l$03 | 0) == ($28 | 0)) { + label = 13; + break L7; + } else { + $dest$02 = $dest$02 + $28 | 0; + $l$03 = $l$03 - $28 | 0; + } + } + if ($32) ___unlockfile($f); + $$0 = (($0 - $l$03$lcssa | 0) >>> 0) / ($size >>> 0) | 0; + } while (0); + if ((label | 0) == 13) if (!$32) $$0 = $nmemb; else { + ___unlockfile($f); + $$0 = $nmemb; + } + return $$0 | 0; +} + +function __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKcj($this, $__pos, $__s, $__n) { + $this = $this | 0; + $__pos = $__pos | 0; + $__s = $__s | 0; + $__n = $__n | 0; + var $$1 = 0, $$pre$phiZ2D = 0, $0 = 0, $13 = 0, $17 = 0, $2 = 0, $23 = 0, $25 = 0, $31 = 0, $8 = 0, $9 = 0; + $0 = HEAP8[$this >> 0] | 0; + $2 = ($0 & 1) == 0; + if ($2) $8 = ($0 & 255) >>> 1; else $8 = HEAP32[$this + 4 >> 2] | 0; + if ($8 >>> 0 < $__pos >>> 0) __ZNKSt3__121__basic_string_commonILb1EE20__throw_out_of_rangeEv($this); + if ($2) { + $13 = 10; + $17 = $0; + } else { + $9 = HEAP32[$this >> 2] | 0; + $13 = ($9 & -2) + -1 | 0; + $17 = $9 & 255; + } + if (($13 - $8 | 0) >>> 0 < $__n >>> 0) __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE21__grow_by_and_replaceEjjjjjjPKc($this, $13, $8 + $__n - $13 | 0, $8, $__pos, 0, $__n, $__s); else if ($__n) { + if (!($17 & 1)) $23 = $this + 1 | 0; else $23 = HEAP32[$this + 8 >> 2] | 0; + if (($8 | 0) == ($__pos | 0)) { + $$1 = $__s; + $$pre$phiZ2D = $23 + $__pos | 0; + } else { + $25 = $23 + $__pos | 0; + _memmove($23 + ($__n + $__pos) | 0, $25 | 0, $8 - $__pos | 0) | 0; + $$1 = $25 >>> 0 <= $__s >>> 0 & ($23 + $8 | 0) >>> 0 > $__s >>> 0 ? $__s + $__n | 0 : $__s; + $$pre$phiZ2D = $25; + } + _memmove($$pre$phiZ2D | 0, $$1 | 0, $__n | 0) | 0; + $31 = $8 + $__n | 0; + if (!(HEAP8[$this >> 0] & 1)) HEAP8[$this >> 0] = $31 << 1; else HEAP32[$this + 4 >> 2] = $31; + HEAP8[$23 + $31 >> 0] = 0; + } + return $this | 0; +} + +function _arUtilMatInv($s, $d) { + $s = $s | 0; + $d = $d | 0; + var $0 = 0, $1 = 0, $2 = 0, $22 = 0, $23 = 0, $25 = 0, $26 = 0, $27 = 0, $28 = 0, $29 = 0, $3 = 0, $4 = 0, $5 = 0, $j$08 = 0, $j$16 = 0; + $0 = _arMatrixAlloc(4, 4) | 0; + $1 = HEAP32[$0 >> 2] | 0; + $2 = HEAP32[$0 >> 2] | 0; + $3 = HEAP32[$0 >> 2] | 0; + $4 = HEAP32[$0 >> 2] | 0; + $j$08 = 0; + do { + $5 = $j$08 << 2; + HEAPF64[$1 + ($5 << 3) >> 3] = +HEAPF64[$s + ($j$08 << 5) >> 3]; + HEAPF64[$2 + (1 + $5 << 3) >> 3] = +HEAPF64[$s + ($j$08 << 5) + 8 >> 3]; + HEAPF64[$3 + (2 + $5 << 3) >> 3] = +HEAPF64[$s + ($j$08 << 5) + 16 >> 3]; + HEAPF64[$4 + (3 + $5 << 3) >> 3] = +HEAPF64[$s + ($j$08 << 5) + 24 >> 3]; + $j$08 = $j$08 + 1 | 0; + } while (($j$08 | 0) != 3); + $22 = HEAP32[$0 >> 2] | 0; + $23 = $22 + 96 | 0; + HEAP32[$23 >> 2] = 0; + HEAP32[$23 + 4 >> 2] = 0; + HEAP32[$23 + 8 >> 2] = 0; + HEAP32[$23 + 12 >> 2] = 0; + HEAP32[$23 + 16 >> 2] = 0; + HEAP32[$23 + 20 >> 2] = 0; + HEAPF64[$22 + 120 >> 3] = 1.0; + _arMatrixSelfInv($0) | 0; + $25 = HEAP32[$0 >> 2] | 0; + $26 = HEAP32[$0 >> 2] | 0; + $27 = HEAP32[$0 >> 2] | 0; + $28 = HEAP32[$0 >> 2] | 0; + $j$16 = 0; + do { + $29 = $j$16 << 2; + HEAPF64[$d + ($j$16 << 5) >> 3] = +HEAPF64[$25 + ($29 << 3) >> 3]; + HEAPF64[$d + ($j$16 << 5) + 8 >> 3] = +HEAPF64[$26 + (1 + $29 << 3) >> 3]; + HEAPF64[$d + ($j$16 << 5) + 16 >> 3] = +HEAPF64[$27 + (2 + $29 << 3) >> 3]; + HEAPF64[$d + ($j$16 << 5) + 24 >> 3] = +HEAPF64[$28 + (3 + $29 << 3) >> 3]; + $j$16 = $j$16 + 1 | 0; + } while (($j$16 | 0) != 3); + _arMatrixFree($0) | 0; + return 0; +} + +function __ZN10__cxxabiv112_GLOBAL__N_119parse_discriminatorEPKcS2_($first, $last) { + $first = $first | 0; + $last = $last | 0; + var $$0 = 0, $$lcssa = 0, $1 = 0, $11 = 0, $3 = 0, $5 = 0, $9 = 0, $first$pn = 0, $t1$016 = 0, $t1$016$lcssa = 0, $t11$0 = 0; + L1 : do if (($first | 0) == ($last | 0)) $$0 = $first; else { + $1 = HEAP8[$first >> 0] | 0; + if ($1 << 24 >> 24 != 95) { + if ((($1 << 24 >> 24) + -48 | 0) >>> 0 < 10) $first$pn = $first; else { + $$0 = $first; + break; + } + while (1) { + $t11$0 = $first$pn + 1 | 0; + if (($t11$0 | 0) == ($last | 0)) { + $$0 = $last; + break L1; + } + if (((HEAP8[$t11$0 >> 0] | 0) + -48 | 0) >>> 0 < 10) $first$pn = $t11$0; else { + $$0 = $t11$0; + break L1; + } + } + } + $3 = $first + 1 | 0; + if (($3 | 0) == ($last | 0)) $$0 = $first; else { + $5 = HEAP8[$3 >> 0] | 0; + if ((($5 << 24 >> 24) + -48 | 0) >>> 0 < 10) { + $$0 = $first + 2 | 0; + break; + } + if ($5 << 24 >> 24 == 95) { + $9 = $first + 2 | 0; + if (($9 | 0) == ($last | 0)) $$0 = $first; else { + $t1$016 = $9; + while (1) { + $11 = HEAP8[$t1$016 >> 0] | 0; + if ((($11 << 24 >> 24) + -48 | 0) >>> 0 >= 10) { + $$lcssa = $11; + $t1$016$lcssa = $t1$016; + break; + } + $t1$016 = $t1$016 + 1 | 0; + if (($t1$016 | 0) == ($last | 0)) { + $$0 = $first; + break L1; + } + } + return ($$lcssa << 24 >> 24 == 95 ? $t1$016$lcssa + 1 | 0 : $first) | 0; + } + } else $$0 = $first; + } + } while (0); + return $$0 | 0; +} + +function __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE21__grow_by_and_replaceEjjjjjjPKc($this, $__old_cap, $__delta_cap, $__old_sz, $__n_copy, $__n_del, $__n_add, $__p_new_stuff) { + $this = $this | 0; + $__old_cap = $__old_cap | 0; + $__delta_cap = $__delta_cap | 0; + $__old_sz = $__old_sz | 0; + $__n_copy = $__n_copy | 0; + $__n_del = $__n_del | 0; + $__n_add = $__n_add | 0; + $__p_new_stuff = $__p_new_stuff | 0; + var $10 = 0, $12 = 0, $17 = 0, $18 = 0, $20 = 0, $23 = 0, $31 = 0, $9 = 0; + if ((-18 - $__old_cap | 0) >>> 0 < $__delta_cap >>> 0) __ZNKSt3__121__basic_string_commonILb1EE20__throw_length_errorEv($this); + if (!(HEAP8[$this >> 0] & 1)) $20 = $this + 1 | 0; else $20 = HEAP32[$this + 8 >> 2] | 0; + if ($__old_cap >>> 0 < 2147483623) { + $9 = $__delta_cap + $__old_cap | 0; + $10 = $__old_cap << 1; + $12 = $9 >>> 0 < $10 >>> 0 ? $10 : $9; + $17 = $12 >>> 0 < 11 ? 11 : $12 + 16 & -16; + } else $17 = -17; + $18 = _malloc($17) | 0; + if ($__n_copy) _memcpy($18 | 0, $20 | 0, $__n_copy | 0) | 0; + if ($__n_add) _memcpy($18 + $__n_copy | 0, $__p_new_stuff | 0, $__n_add | 0) | 0; + $23 = $__old_sz - $__n_del | 0; + if (($23 | 0) != ($__n_copy | 0)) _memcpy($18 + ($__n_add + $__n_copy) | 0, $20 + ($__n_del + $__n_copy) | 0, $23 - $__n_copy | 0) | 0; + if (($__old_cap | 0) != 10) _free($20); + HEAP32[$this + 8 >> 2] = $18; + HEAP32[$this >> 2] = $17 | 1; + $31 = $23 + $__n_add | 0; + HEAP32[$this + 4 >> 2] = $31; + HEAP8[$18 + $31 >> 0] = 0; + return; +} + +function _strcspn($s, $c) { + $s = $s | 0; + $c = $c | 0; + var $$0 = 0, $$027 = 0, $$03$lcssa = 0, $$035 = 0, $0 = 0, $10 = 0, $13 = 0, $17 = 0, $23 = 0, $32 = 0, $byteset = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 32 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $byteset = sp; + $0 = HEAP8[$c >> 0] | 0; + if (!($0 << 24 >> 24)) label = 3; else if (!(HEAP8[$c + 1 >> 0] | 0)) label = 3; else { + HEAP32[$byteset >> 2] = 0; + HEAP32[$byteset + 4 >> 2] = 0; + HEAP32[$byteset + 8 >> 2] = 0; + HEAP32[$byteset + 12 >> 2] = 0; + HEAP32[$byteset + 16 >> 2] = 0; + HEAP32[$byteset + 20 >> 2] = 0; + HEAP32[$byteset + 24 >> 2] = 0; + HEAP32[$byteset + 28 >> 2] = 0; + $$027 = $c; + $13 = $0; + do { + $17 = $byteset + ((($13 & 255) >>> 5 & 255) << 2) | 0; + HEAP32[$17 >> 2] = HEAP32[$17 >> 2] | 1 << ($13 & 31); + $$027 = $$027 + 1 | 0; + $13 = HEAP8[$$027 >> 0] | 0; + } while ($13 << 24 >> 24 != 0); + $10 = HEAP8[$s >> 0] | 0; + L7 : do if (!($10 << 24 >> 24)) $$03$lcssa = $s; else { + $$035 = $s; + $23 = $10; + while (1) { + if (HEAP32[$byteset + ((($23 & 255) >>> 5 & 255) << 2) >> 2] & 1 << ($23 & 31)) { + $$03$lcssa = $$035; + break L7; + } + $32 = $$035 + 1 | 0; + $23 = HEAP8[$32 >> 0] | 0; + if (!($23 << 24 >> 24)) { + $$03$lcssa = $32; + break; + } else $$035 = $32; + } + } while (0); + $$0 = $$03$lcssa - $s | 0; + } + if ((label | 0) == 3) $$0 = (___strchrnul($s, $0 << 24 >> 24) | 0) - $s | 0; + STACKTOP = sp; + return $$0 | 0; +} + +function ___strchrnul($s, $c) { + $s = $s | 0; + $c = $c | 0; + var $$0 = 0, $$02$lcssa = 0, $$0211 = 0, $$1 = 0, $0 = 0, $11 = 0, $15 = 0, $16 = 0, $22 = 0, $23 = 0, $29 = 0, $36 = 0, $37 = 0, $5 = 0, $8 = 0, $w$0$lcssa = 0, $w$08 = 0; + $0 = $c & 255; + L1 : do if (!$0) $$0 = $s + (_strlen($s) | 0) | 0; else { + if (!($s & 3)) $$02$lcssa = $s; else { + $5 = $c & 255; + $$0211 = $s; + while (1) { + $8 = HEAP8[$$0211 >> 0] | 0; + if ($8 << 24 >> 24 == 0 ? 1 : $8 << 24 >> 24 == $5 << 24 >> 24) { + $$0 = $$0211; + break L1; + } + $11 = $$0211 + 1 | 0; + if (!($11 & 3)) { + $$02$lcssa = $11; + break; + } else $$0211 = $11; + } + } + $15 = Math_imul($0, 16843009) | 0; + $16 = HEAP32[$$02$lcssa >> 2] | 0; + L10 : do if (!(($16 & -2139062144 ^ -2139062144) & $16 + -16843009)) { + $23 = $16; + $w$08 = $$02$lcssa; + while (1) { + $22 = $23 ^ $15; + if (($22 & -2139062144 ^ -2139062144) & $22 + -16843009) { + $w$0$lcssa = $w$08; + break L10; + } + $29 = $w$08 + 4 | 0; + $23 = HEAP32[$29 >> 2] | 0; + if (($23 & -2139062144 ^ -2139062144) & $23 + -16843009) { + $w$0$lcssa = $29; + break; + } else $w$08 = $29; + } + } else $w$0$lcssa = $$02$lcssa; while (0); + $36 = $c & 255; + $$1 = $w$0$lcssa; + while (1) { + $37 = HEAP8[$$1 >> 0] | 0; + if ($37 << 24 >> 24 == 0 ? 1 : $37 << 24 >> 24 == $36 << 24 >> 24) { + $$0 = $$1; + break; + } else $$1 = $$1 + 1 | 0; + } + } while (0); + return $$0 | 0; +} + +function _arGetTransMatRobust($handle, $initConv, $pos2d, $pos3d, $num, $conv) { + $handle = $handle | 0; + $initConv = $initConv | 0; + $pos2d = $pos2d | 0; + $pos3d = $pos3d | 0; + $num = $num | 0; + $conv = $conv | 0; + var $1 = 0, $4 = 0, $5 = 0, $data = 0, $err = 0, $i$01 = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 32 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $data = sp + 20 | 0; + $err = sp; + $1 = _malloc($num << 4) | 0; + HEAP32[$data >> 2] = $1; + if (!$1) { + _arLog(3, 5471, sp + 8 | 0); + _exit(1); + } + $4 = _malloc($num * 24 | 0) | 0; + $5 = $data + 4 | 0; + HEAP32[$5 >> 2] = $4; + if (!$4) { + _arLog(3, 5471, sp + 16 | 0); + _exit(1); + } + if (($num | 0) > 0) { + $i$01 = 0; + do { + HEAPF64[$1 + ($i$01 << 4) >> 3] = +HEAPF64[$pos2d + ($i$01 << 4) >> 3]; + HEAPF64[$1 + ($i$01 << 4) + 8 >> 3] = +HEAPF64[$pos2d + ($i$01 << 4) + 8 >> 3]; + HEAPF64[$4 + ($i$01 * 24 | 0) >> 3] = +HEAPF64[$pos3d + ($i$01 * 24 | 0) >> 3]; + HEAPF64[$4 + ($i$01 * 24 | 0) + 8 >> 3] = +HEAPF64[$pos3d + ($i$01 * 24 | 0) + 8 >> 3]; + HEAPF64[$4 + ($i$01 * 24 | 0) + 16 >> 3] = +HEAPF64[$pos3d + ($i$01 * 24 | 0) + 16 >> 3]; + $i$01 = $i$01 + 1 | 0; + } while (($i$01 | 0) < ($num | 0)); + } + HEAP32[$data + 8 >> 2] = $num; + if ((_icpPointRobust(HEAP32[$handle >> 2] | 0, $data, $initConv, $conv, $err) | 0) < 0) HEAPF64[$err >> 3] = 1.0e8; + _free(HEAP32[$data >> 2] | 0); + _free(HEAP32[$5 >> 2] | 0); + STACKTOP = sp; + return +(+HEAPF64[$err >> 3]); +} + +function _arGetTransMat($handle, $initConv, $pos2d, $pos3d, $num, $conv) { + $handle = $handle | 0; + $initConv = $initConv | 0; + $pos2d = $pos2d | 0; + $pos3d = $pos3d | 0; + $num = $num | 0; + $conv = $conv | 0; + var $1 = 0, $4 = 0, $5 = 0, $data = 0, $err = 0, $i$01 = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 32 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $data = sp + 20 | 0; + $err = sp; + $1 = _malloc($num << 4) | 0; + HEAP32[$data >> 2] = $1; + if (!$1) { + _arLog(3, 5471, sp + 8 | 0); + _exit(1); + } + $4 = _malloc($num * 24 | 0) | 0; + $5 = $data + 4 | 0; + HEAP32[$5 >> 2] = $4; + if (!$4) { + _arLog(3, 5471, sp + 16 | 0); + _exit(1); + } + if (($num | 0) > 0) { + $i$01 = 0; + do { + HEAPF64[$1 + ($i$01 << 4) >> 3] = +HEAPF64[$pos2d + ($i$01 << 4) >> 3]; + HEAPF64[$1 + ($i$01 << 4) + 8 >> 3] = +HEAPF64[$pos2d + ($i$01 << 4) + 8 >> 3]; + HEAPF64[$4 + ($i$01 * 24 | 0) >> 3] = +HEAPF64[$pos3d + ($i$01 * 24 | 0) >> 3]; + HEAPF64[$4 + ($i$01 * 24 | 0) + 8 >> 3] = +HEAPF64[$pos3d + ($i$01 * 24 | 0) + 8 >> 3]; + HEAPF64[$4 + ($i$01 * 24 | 0) + 16 >> 3] = +HEAPF64[$pos3d + ($i$01 * 24 | 0) + 16 >> 3]; + $i$01 = $i$01 + 1 | 0; + } while (($i$01 | 0) < ($num | 0)); + } + HEAP32[$data + 8 >> 2] = $num; + if ((_icpPoint(HEAP32[$handle >> 2] | 0, $data, $initConv, $conv, $err) | 0) < 0) HEAPF64[$err >> 3] = 1.0e8; + _free(HEAP32[$data >> 2] | 0); + _free(HEAP32[$5 >> 2] | 0); + STACKTOP = sp; + return +(+HEAPF64[$err >> 3]); +} + +function ___fwritex($s, $l, $f) { + $s = $s | 0; + $l = $l | 0; + $f = $f | 0; + var $$0 = 0, $$01 = 0, $$02 = 0, $0 = 0, $1 = 0, $19 = 0, $29 = 0, $5 = 0, $6 = 0, $8 = 0, $i$0 = 0, $i$0$lcssa10 = 0, $i$1 = 0, label = 0; + $0 = $f + 16 | 0; + $1 = HEAP32[$0 >> 2] | 0; + if (!$1) if (!(___towrite($f) | 0)) { + $8 = HEAP32[$0 >> 2] | 0; + label = 4; + } else $$0 = 0; else { + $8 = $1; + label = 4; + } + L4 : do if ((label | 0) == 4) { + $5 = $f + 20 | 0; + $6 = HEAP32[$5 >> 2] | 0; + if (($8 - $6 | 0) >>> 0 < $l >>> 0) { + $$0 = FUNCTION_TABLE_iiii[HEAP32[$f + 36 >> 2] & 15]($f, $s, $l) | 0; + break; + } + L9 : do if ((HEAP8[$f + 75 >> 0] | 0) > -1) { + $i$0 = $l; + while (1) { + if (!$i$0) { + $$01 = $l; + $$02 = $s; + $29 = $6; + $i$1 = 0; + break L9; + } + $19 = $i$0 + -1 | 0; + if ((HEAP8[$s + $19 >> 0] | 0) == 10) { + $i$0$lcssa10 = $i$0; + break; + } else $i$0 = $19; + } + if ((FUNCTION_TABLE_iiii[HEAP32[$f + 36 >> 2] & 15]($f, $s, $i$0$lcssa10) | 0) >>> 0 < $i$0$lcssa10 >>> 0) { + $$0 = $i$0$lcssa10; + break L4; + } + $$01 = $l - $i$0$lcssa10 | 0; + $$02 = $s + $i$0$lcssa10 | 0; + $29 = HEAP32[$5 >> 2] | 0; + $i$1 = $i$0$lcssa10; + } else { + $$01 = $l; + $$02 = $s; + $29 = $6; + $i$1 = 0; + } while (0); + _memcpy($29 | 0, $$02 | 0, $$01 | 0) | 0; + HEAP32[$5 >> 2] = (HEAP32[$5 >> 2] | 0) + $$01; + $$0 = $i$1 + $$01 | 0; + } while (0); + return $$0 | 0; +} + +function ___shgetc($f) { + $f = $f | 0; + var $$0 = 0, $$phi$trans$insert = 0, $$pre = 0, $$pre4 = 0, $0 = 0, $1 = 0, $12 = 0, $14 = 0, $15 = 0, $21 = 0, $26 = 0, $28 = 0, $31 = 0, $36 = 0, $41 = 0, $6 = 0, $9 = 0, label = 0; + $0 = $f + 104 | 0; + $1 = HEAP32[$0 >> 2] | 0; + if (!$1) label = 3; else if ((HEAP32[$f + 108 >> 2] | 0) < ($1 | 0)) label = 3; else label = 4; + if ((label | 0) == 3) { + $6 = ___uflow($f) | 0; + if (($6 | 0) < 0) label = 4; else { + $9 = HEAP32[$0 >> 2] | 0; + $$phi$trans$insert = $f + 8 | 0; + if (!$9) { + $$pre = HEAP32[$$phi$trans$insert >> 2] | 0; + $26 = $$pre; + $41 = $$pre; + label = 9; + } else { + $12 = HEAP32[$$phi$trans$insert >> 2] | 0; + $14 = HEAP32[$f + 4 >> 2] | 0; + $15 = $12; + $21 = $9 - (HEAP32[$f + 108 >> 2] | 0) + -1 | 0; + if (($15 - $14 | 0) > ($21 | 0)) { + HEAP32[$f + 100 >> 2] = $14 + $21; + $28 = $12; + } else { + $26 = $15; + $41 = $12; + label = 9; + } + } + if ((label | 0) == 9) { + HEAP32[$f + 100 >> 2] = $26; + $28 = $41; + } + $$pre4 = HEAP32[$f + 4 >> 2] | 0; + if ($28) { + $31 = $f + 108 | 0; + HEAP32[$31 >> 2] = $28 + 1 - $$pre4 + (HEAP32[$31 >> 2] | 0); + } + $36 = $$pre4 + -1 | 0; + if ((HEAPU8[$36 >> 0] | 0 | 0) == ($6 | 0)) $$0 = $6; else { + HEAP8[$36 >> 0] = $6; + $$0 = $6; + } + } + } + if ((label | 0) == 4) { + HEAP32[$f + 100 >> 2] = 0; + $$0 = -1; + } + return $$0 | 0; +} + +function _arSetLabelingThreshMode($handle, $mode) { + $handle = $handle | 0; + $mode = $mode | 0; + var $$0 = 0, $1 = 0, $13 = 0, $4 = 0, $5 = 0, $mode1$0 = 0, $vararg_buffer = 0, $vararg_buffer1 = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer1 = sp + 8 | 0; + $vararg_buffer = sp; + if (!$handle) $$0 = -1; else { + $1 = $handle + 7062388 | 0; + if ((HEAP32[$1 >> 2] | 0) == ($mode | 0)) $$0 = 0; else { + $4 = $handle + 7062408 | 0; + $5 = HEAP32[$4 >> 2] | 0; + if ($5) { + _arImageProcFinal($5); + HEAP32[$4 >> 2] = 0; + } + switch ($mode | 0) { + case 3: + case 2: + case 1: + { + $13 = _arImageProcInit(HEAP32[$handle + 36 >> 2] | 0, HEAP32[$handle + 40 >> 2] | 0, HEAP32[$handle + 4 >> 2] | 0, 0) | 0; + HEAP32[$4 >> 2] = $13; + $mode1$0 = $mode; + break; + } + case 4: + { + HEAP32[$handle + 7062404 >> 2] = 1; + HEAP32[$handle + 7062400 >> 2] = 1; + $mode1$0 = 4; + break; + } + case 0: + { + $mode1$0 = 0; + break; + } + default: + { + _arLog(3, 3985, $vararg_buffer); + $mode1$0 = 0; + } + } + HEAP32[$1 >> 2] = $mode1$0; + if ((HEAP32[$handle >> 2] | 0) == 1) { + HEAP32[$vararg_buffer1 >> 2] = HEAP32[760 + ($mode1$0 << 2) >> 2]; + _arLog(3, 4059, $vararg_buffer1); + $$0 = 0; + } else $$0 = 0; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _sift($head, $width, $cmp, $pshift, $lp) { + $head = $head | 0; + $width = $width | 0; + $cmp = $cmp | 0; + $pshift = $pshift | 0; + $lp = $lp | 0; + var $$0$be = 0, $$01$be = 0, $$012 = 0, $$03 = 0, $1 = 0, $14 = 0, $15 = 0, $2 = 0, $3 = 0, $6 = 0, $7 = 0, $ar = 0, $i$0$lcssa = 0, $i$04 = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 240 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $ar = sp; + HEAP32[$ar >> 2] = $head; + L1 : do if (($pshift | 0) > 1) { + $1 = 0 - $width | 0; + $$012 = $pshift; + $$03 = $head; + $7 = $head; + $i$04 = 1; + while (1) { + $2 = $$03 + $1 | 0; + $3 = $$012 + -2 | 0; + $6 = $$03 + (0 - ((HEAP32[$lp + ($3 << 2) >> 2] | 0) + $width)) | 0; + if ((FUNCTION_TABLE_iii[$cmp & 15]($7, $6) | 0) > -1) if ((FUNCTION_TABLE_iii[$cmp & 15]($7, $2) | 0) > -1) { + $i$0$lcssa = $i$04; + break L1; + } + $14 = $i$04 + 1 | 0; + $15 = $ar + ($i$04 << 2) | 0; + if ((FUNCTION_TABLE_iii[$cmp & 15]($6, $2) | 0) > -1) { + HEAP32[$15 >> 2] = $6; + $$0$be = $6; + $$01$be = $$012 + -1 | 0; + } else { + HEAP32[$15 >> 2] = $2; + $$0$be = $2; + $$01$be = $3; + } + if (($$01$be | 0) <= 1) { + $i$0$lcssa = $14; + break L1; + } + $$012 = $$01$be; + $$03 = $$0$be; + $7 = HEAP32[$ar >> 2] | 0; + $i$04 = $14; + } + } else $i$0$lcssa = 1; while (0); + _cycle($width, $ar, $i$0$lcssa); + STACKTOP = sp; + return; +} + +function _arCreateHandle($paramLT) { + $paramLT = $paramLT | 0; + var $0 = 0, $15 = 0, $18 = 0, $26 = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $0 = _malloc(7062432) | 0; + if (!$0) { + _arLog(3, 5471, sp); + _exit(1); + } + HEAP32[$0 >> 2] = 0; + HEAP32[$0 + 4834148 >> 2] = 0; + HEAP32[$0 + 7062408 >> 2] = 0; + HEAP32[$0 + 4 >> 2] = -1; + HEAP32[$0 + 8 >> 2] = 0; + HEAP32[$0 + 12 >> 2] = 1; + HEAP32[$0 + 16 >> 2] = 100; + HEAP32[$0 + 20 >> 2] = 0; + HEAP32[$0 + 24 >> 2] = 0; + HEAP32[$0 + 28 >> 2] = 2; + HEAPF64[$0 + 7062416 >> 3] = .5; + HEAP32[$0 + 7062424 >> 2] = 3; + HEAP32[$0 + 32 >> 2] = $paramLT; + $15 = HEAP32[$paramLT >> 2] | 0; + HEAP32[$0 + 36 >> 2] = $15; + $18 = HEAP32[$paramLT + 4 >> 2] | 0; + HEAP32[$0 + 40 >> 2] = $18; + HEAP32[$0 + 44 >> 2] = 0; + HEAP32[$0 + 15408 >> 2] = 0; + HEAP32[$0 + 4834152 >> 2] = 0; + HEAP32[$0 + 4818296 >> 2] = 0; + $26 = _malloc(Math_imul($15 << 1, $18) | 0) | 0; + HEAP32[$0 + 4834144 >> 2] = $26; + if (!$26) { + _arLog(3, 5471, sp + 8 | 0); + _exit(1); + } else { + HEAP32[$0 + 7062384 >> 2] = 0; + _arSetPixelFormat($0, 2) | 0; + _arSetDebugMode($0, 0) | 0; + HEAP32[$0 + 7062388 >> 2] = -1; + _arSetLabelingThreshMode($0, 0) | 0; + HEAP32[$0 + 7062392 >> 2] = 7; + HEAP32[$0 + 7062396 >> 2] = 0; + STACKTOP = sp; + return $0 | 0; + } + return 0; +} + +function __ZNSt3__16vectorI12multi_markerNS_9allocatorIS1_EEE21__push_back_slow_pathIRKS1_EEvOT_($this, $__x) { + $this = $this | 0; + $__x = $__x | 0; + var $$0$i = 0, $1 = 0, $13 = 0, $14 = 0, $17 = 0, $24 = 0, $25 = 0, $26 = 0, $3 = 0, $31 = 0, $32 = 0, $8 = 0, $__v = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 32 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $__v = sp; + $1 = $this + 4 | 0; + $3 = HEAP32[$this >> 2] | 0; + $8 = ((HEAP32[$1 >> 2] | 0) - $3 >> 3) + 1 | 0; + if ($8 >>> 0 > 536870911) __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($this); + $13 = $3; + $14 = (HEAP32[$this + 8 >> 2] | 0) - $13 | 0; + if ($14 >> 3 >>> 0 < 268435455) { + $17 = $14 >> 2; + $$0$i = $17 >>> 0 < $8 >>> 0 ? $8 : $17; + } else $$0$i = 536870911; + __ZNSt3__114__split_bufferI12multi_markerRNS_9allocatorIS1_EEEC2EjjS4_($__v, $$0$i, (HEAP32[$1 >> 2] | 0) - $13 >> 3, $this + 8 | 0); + $24 = $__v + 8 | 0; + $25 = HEAP32[$24 >> 2] | 0; + $26 = $__x; + $31 = HEAP32[$26 + 4 >> 2] | 0; + $32 = $25; + HEAP32[$32 >> 2] = HEAP32[$26 >> 2]; + HEAP32[$32 + 4 >> 2] = $31; + HEAP32[$24 >> 2] = $25 + 8; + __ZNSt3__16vectorI12multi_markerNS_9allocatorIS1_EEE26__swap_out_circular_bufferERNS_14__split_bufferIS1_RS3_EE($this, $__v); + __ZNSt3__114__split_bufferI12multi_markerRNS_9allocatorIS1_EEED2Ev($__v); + STACKTOP = sp; + return; +} + +function __ZNSt3__112__hash_tableINS_17__hash_value_typeIi12arControllerEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE6rehashEj($this, $__n) { + $this = $this | 0; + $__n = $__n | 0; + var $20 = 0, $27 = 0, $28 = 0, $30 = 0, $6 = 0, $__n1 = 0; + if (($__n | 0) == 1) $__n1 = 2; else if (!($__n + -1 & $__n)) $__n1 = $__n; else $__n1 = __ZNSt3__112__next_primeEj($__n) | 0; + $6 = HEAP32[$this + 4 >> 2] | 0; + if ($__n1 >>> 0 > $6 >>> 0) __ZNSt3__112__hash_tableINS_17__hash_value_typeIi12arControllerEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE8__rehashEj($this, $__n1); else if ($__n1 >>> 0 < $6 >>> 0) { + if ($6 >>> 0 > 2) $30 = ($6 + -1 & $6 | 0) == 0; else $30 = 0; + $20 = ~~+Math_ceil(+(+((HEAP32[$this + 12 >> 2] | 0) >>> 0) / +HEAPF32[$this + 16 >> 2])) >>> 0; + if ($30) $27 = 1 << 32 - (Math_clz32($20 + -1 | 0) | 0); else $27 = __ZNSt3__112__next_primeEj($20) | 0; + $28 = $__n1 >>> 0 < $27 >>> 0 ? $27 : $__n1; + if ($28 >>> 0 < $6 >>> 0) __ZNSt3__112__hash_tableINS_17__hash_value_typeIi12arControllerEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE8__rehashEj($this, $28); + } + return; +} + +function _vsnprintf($s, $n, $fmt, $ap) { + $s = $s | 0; + $n = $n | 0; + $fmt = $fmt | 0; + $ap = $ap | 0; + var $$$02 = 0, $$0 = 0, $$01 = 0, $$02 = 0, $10 = 0, $11 = 0, $13 = 0, $15 = 0, $3 = 0, $5 = 0, $8 = 0, $b = 0, $f = 0, dest = 0, label = 0, sp = 0, src = 0, stop = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 128 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $b = sp + 112 | 0; + $f = sp; + dest = $f; + src = 2684; + stop = dest + 112 | 0; + do { + HEAP32[dest >> 2] = HEAP32[src >> 2]; + dest = dest + 4 | 0; + src = src + 4 | 0; + } while ((dest | 0) < (stop | 0)); + if (($n + -1 | 0) >>> 0 > 2147483646) if (!$n) { + $$01 = $b; + $$02 = 1; + label = 4; + } else { + $3 = ___errno_location() | 0; + HEAP32[$3 >> 2] = 75; + $$0 = -1; + } else { + $$01 = $s; + $$02 = $n; + label = 4; + } + if ((label | 0) == 4) { + $5 = -2 - $$01 | 0; + $$$02 = $$02 >>> 0 > $5 >>> 0 ? $5 : $$02; + HEAP32[$f + 48 >> 2] = $$$02; + $8 = $f + 20 | 0; + HEAP32[$8 >> 2] = $$01; + HEAP32[$f + 44 >> 2] = $$01; + $10 = $$01 + $$$02 | 0; + $11 = $f + 16 | 0; + HEAP32[$11 >> 2] = $10; + HEAP32[$f + 28 >> 2] = $10; + $13 = _vfprintf($f, $fmt, $ap) | 0; + if (!$$$02) $$0 = $13; else { + $15 = HEAP32[$8 >> 2] | 0; + HEAP8[$15 + ((($15 | 0) == (HEAP32[$11 >> 2] | 0)) << 31 >> 31) >> 0] = 0; + $$0 = $13; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function __ZNSt3__112__hash_tableINS_17__hash_value_typeIi7ARParamEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE6rehashEj($this, $__n) { + $this = $this | 0; + $__n = $__n | 0; + var $20 = 0, $27 = 0, $28 = 0, $30 = 0, $6 = 0, $__n1 = 0; + if (($__n | 0) == 1) $__n1 = 2; else if (!($__n + -1 & $__n)) $__n1 = $__n; else $__n1 = __ZNSt3__112__next_primeEj($__n) | 0; + $6 = HEAP32[$this + 4 >> 2] | 0; + if ($__n1 >>> 0 > $6 >>> 0) __ZNSt3__112__hash_tableINS_17__hash_value_typeIi7ARParamEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE8__rehashEj($this, $__n1); else if ($__n1 >>> 0 < $6 >>> 0) { + if ($6 >>> 0 > 2) $30 = ($6 + -1 & $6 | 0) == 0; else $30 = 0; + $20 = ~~+Math_ceil(+(+((HEAP32[$this + 12 >> 2] | 0) >>> 0) / +HEAPF32[$this + 16 >> 2])) >>> 0; + if ($30) $27 = 1 << 32 - (Math_clz32($20 + -1 | 0) | 0); else $27 = __ZNSt3__112__next_primeEj($20) | 0; + $28 = $__n1 >>> 0 < $27 >>> 0 ? $27 : $__n1; + if ($28 >>> 0 < $6 >>> 0) __ZNSt3__112__hash_tableINS_17__hash_value_typeIi7ARParamEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE8__rehashEj($this, $28); + } + return; +} + +function _addMarker($id, $patt_name) { + $id = $id | 0; + $patt_name = $patt_name | 0; + var $$0 = 0, $0 = 0, $11 = 0, $13 = 0, $14 = 0, $3 = 0, $vararg_buffer = 0, $vararg_buffer1 = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer1 = sp + 8 | 0; + $vararg_buffer = sp; + $0 = sp + 12 | 0; + HEAP32[$0 >> 2] = $id; + if (!(__ZNSt3__112__hash_tableINS_17__hash_value_typeIi12arControllerEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE4findIiEENS_15__hash_iteratorIPNS_11__hash_nodeIS3_PvEEEERKT_(2044, $0) | 0)) $$0 = -1; else { + $3 = __ZNSt3__113unordered_mapIi12arControllerNS_4hashIiEENS_8equal_toIiEENS_9allocatorINS_4pairIKiS1_EEEEEixERS8_(2044, $0) | 0; + if (!(HEAP8[$patt_name >> 0] & 1)) $13 = $patt_name + 1 | 0; else $13 = HEAP32[$patt_name + 8 >> 2] | 0; + $11 = $3 + 216 | 0; + $14 = _arPattLoad(HEAP32[$11 >> 2] | 0, $13) | 0; + HEAP32[$3 + 260 >> 2] = $14; + if (($14 | 0) < 0) { + HEAP32[$vararg_buffer >> 2] = $13; + _arLog(3, 6311, $vararg_buffer); + _arPattDeleteHandle(HEAP32[$11 >> 2] | 0) | 0; + _arLog(3, 6357, $vararg_buffer1); + $$0 = -1; + } else $$0 = $14; + } + STACKTOP = sp; + return $$0 | 0; +} + +function _icpGetDeltaS($S, $dU, $J_U_S, $n) { + $S = $S | 0; + $dU = $dU | 0; + $J_U_S = $J_U_S | 0; + $n = $n | 0; + var $$0 = 0, $10 = 0, $6 = 0, $8 = 0, $matJ = 0, $matS = 0, $matU = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 48 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $matS = sp + 24 | 0; + $matU = sp + 12 | 0; + $matJ = sp; + HEAP32[$matS + 4 >> 2] = 6; + HEAP32[$matS + 8 >> 2] = 1; + HEAP32[$matS >> 2] = $S; + HEAP32[$matU + 4 >> 2] = $n; + HEAP32[$matU + 8 >> 2] = 1; + HEAP32[$matU >> 2] = $dU; + HEAP32[$matJ + 4 >> 2] = $n; + HEAP32[$matJ + 8 >> 2] = 6; + HEAP32[$matJ >> 2] = $J_U_S; + $6 = _arMatrixAllocTrans($matJ) | 0; + do if (!$6) $$0 = -1; else { + $8 = _arMatrixAllocMul($6, $matJ) | 0; + if (!$8) { + _arMatrixFree($6) | 0; + $$0 = -1; + break; + } + $10 = _arMatrixAllocMul($6, $matU) | 0; + if (!$10) { + _arMatrixFree($6) | 0; + _arMatrixFree($8) | 0; + $$0 = -1; + break; + } + if ((_arMatrixSelfInv($8) | 0) < 0) { + _arMatrixFree($6) | 0; + _arMatrixFree($8) | 0; + _arMatrixFree($10) | 0; + $$0 = -1; + break; + } else { + _arMatrixMul($matS, $8, $10) | 0; + _arMatrixFree($6) | 0; + _arMatrixFree($8) | 0; + _arMatrixFree($10) | 0; + $$0 = 0; + break; + } + } while (0); + STACKTOP = sp; + return $$0 | 0; +} + +function _getTransMatMultiSquareRobust($id, $multiMarkerId) { + $id = $id | 0; + $multiMarkerId = $multiMarkerId | 0; + var $$0 = 0, $0 = 0, $17 = 0, $21 = 0, $4 = 0, $8 = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $0 = sp; + HEAP32[$0 >> 2] = $id; + do if (!(__ZNSt3__112__hash_tableINS_17__hash_value_typeIi12arControllerEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE4findIiEENS_15__hash_iteratorIPNS_11__hash_nodeIS3_PvEEEERKT_(2044, $0) | 0)) $$0 = HEAP32[522] | 0; else { + $4 = __ZNSt3__113unordered_mapIi12arControllerNS_4hashIiEENS_8equal_toIiEENS_9allocatorINS_4pairIKiS1_EEEEEixERS8_(2044, $0) | 0; + $8 = HEAP32[$4 + 248 >> 2] | 0; + if (($multiMarkerId | 0) < 0 ? 1 : (HEAP32[$4 + 252 >> 2] | 0) - $8 >> 3 >>> 0 <= $multiMarkerId >>> 0) { + $$0 = HEAP32[524] | 0; + break; + } else { + $17 = HEAP32[$8 + ($multiMarkerId << 3) + 4 >> 2] | 0; + $21 = HEAP32[$4 + 212 >> 2] | 0; + +_arGetTransMatMultiSquareRobust(HEAP32[$4 + 224 >> 2] | 0, $21 + 48 | 0, HEAP32[$21 + 44 >> 2] | 0, $17); + _matrixCopy($17 + 8 | 0, 264); + $$0 = 0; + break; + } + } while (0); + STACKTOP = sp; + return $$0 | 0; +} + +function _arImageProcLumaHistAndCDFAndPercentile($ipi, $dataPtr, $percentile, $value_p) { + $ipi = $ipi | 0; + $dataPtr = $dataPtr | 0; + $percentile = +$percentile; + $value_p = $value_p | 0; + var $$0 = 0, $$in = 0, $$lcssa10 = 0, $$lcssa9 = 0, $11 = 0, $12 = 0, $14 = 0, $18 = 0, $2 = 0, $i$0 = 0, $i$0$lcssa = 0, $j$0$lcssa = 0; + if ($percentile < 0.0 | $percentile > 1.0) $$0 = -1; else { + $2 = _arImageProcLumaHistAndCDF($ipi, $dataPtr) | 0; + if (($2 | 0) < 0) $$0 = $2; else { + $11 = ~~(+(Math_imul(HEAP32[$ipi + 12 >> 2] | 0, HEAP32[$ipi + 8 >> 2] | 0) | 0) * $percentile) >>> 0; + $i$0 = 0; + while (1) { + $12 = $i$0 & 255; + $14 = HEAP32[$ipi + 1040 + ($12 << 2) >> 2] | 0; + if ($14 >>> 0 < $11 >>> 0) $i$0 = $i$0 + 1 << 24 >> 24; else { + $$lcssa10 = $14; + $$lcssa9 = $12; + $i$0$lcssa = $i$0; + break; + } + } + if (($$lcssa10 | 0) == ($11 | 0)) { + $$in = $i$0$lcssa; + while (1) { + $18 = $$in + 1 << 24 >> 24; + if ((HEAP32[$ipi + 1040 + (($18 & 255) << 2) >> 2] | 0) == ($11 | 0)) $$in = $18; else { + $j$0$lcssa = $18; + break; + } + } + } else $j$0$lcssa = $i$0$lcssa; + HEAP8[$value_p >> 0] = (($j$0$lcssa & 255) + $$lcssa9 | 0) >>> 1; + $$0 = 0; + } + } + return $$0 | 0; +} + +function _getTransMatMultiSquare($id, $multiMarkerId) { + $id = $id | 0; + $multiMarkerId = $multiMarkerId | 0; + var $$0 = 0, $0 = 0, $17 = 0, $21 = 0, $4 = 0, $8 = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $0 = sp; + HEAP32[$0 >> 2] = $id; + do if (!(__ZNSt3__112__hash_tableINS_17__hash_value_typeIi12arControllerEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE4findIiEENS_15__hash_iteratorIPNS_11__hash_nodeIS3_PvEEEERKT_(2044, $0) | 0)) $$0 = HEAP32[522] | 0; else { + $4 = __ZNSt3__113unordered_mapIi12arControllerNS_4hashIiEENS_8equal_toIiEENS_9allocatorINS_4pairIKiS1_EEEEEixERS8_(2044, $0) | 0; + $8 = HEAP32[$4 + 248 >> 2] | 0; + if (($multiMarkerId | 0) < 0 ? 1 : (HEAP32[$4 + 252 >> 2] | 0) - $8 >> 3 >>> 0 <= $multiMarkerId >>> 0) { + $$0 = HEAP32[524] | 0; + break; + } else { + $17 = HEAP32[$8 + ($multiMarkerId << 3) + 4 >> 2] | 0; + $21 = HEAP32[$4 + 212 >> 2] | 0; + +_arGetTransMatMultiSquare(HEAP32[$4 + 224 >> 2] | 0, $21 + 48 | 0, HEAP32[$21 + 44 >> 2] | 0, $17); + _matrixCopy($17 + 8 | 0, 264); + $$0 = 0; + break; + } + } while (0); + STACKTOP = sp; + return $$0 | 0; +} + +function _arPattDeleteHandle($pattHandle) { + $pattHandle = $pattHandle | 0; + var $$0 = 0, $1 = 0, $11 = 0, $18 = 0, $2 = 0, $25 = 0, $3 = 0, $32 = 0, $4 = 0, $i$03 = 0; + if (!$pattHandle) $$0 = -1; else { + $1 = $pattHandle + 4 | 0; + $2 = $pattHandle + 8 | 0; + $3 = $pattHandle + 12 | 0; + $4 = $pattHandle + 20 | 0; + if ((HEAP32[$1 >> 2] | 0) > 0) { + $i$03 = 0; + do { + if (HEAP32[(HEAP32[$2 >> 2] | 0) + ($i$03 << 2) >> 2] | 0) _arPattFree($pattHandle, $i$03) | 0; + $11 = $i$03 << 2; + _free(HEAP32[(HEAP32[$3 >> 2] | 0) + ($11 << 2) >> 2] | 0); + _free(HEAP32[(HEAP32[$4 >> 2] | 0) + ($11 << 2) >> 2] | 0); + $18 = 1 + $11 | 0; + _free(HEAP32[(HEAP32[$3 >> 2] | 0) + ($18 << 2) >> 2] | 0); + _free(HEAP32[(HEAP32[$4 >> 2] | 0) + ($18 << 2) >> 2] | 0); + $25 = 2 + $11 | 0; + _free(HEAP32[(HEAP32[$3 >> 2] | 0) + ($25 << 2) >> 2] | 0); + _free(HEAP32[(HEAP32[$4 >> 2] | 0) + ($25 << 2) >> 2] | 0); + $32 = 3 + $11 | 0; + _free(HEAP32[(HEAP32[$3 >> 2] | 0) + ($32 << 2) >> 2] | 0); + _free(HEAP32[(HEAP32[$4 >> 2] | 0) + ($32 << 2) >> 2] | 0); + $i$03 = $i$03 + 1 | 0; + } while (($i$03 | 0) < (HEAP32[$1 >> 2] | 0)); + } + _free($pattHandle); + $$0 = 0; + } + return $$0 | 0; +} + +function _atoi($s) { + $s = $s | 0; + var $$0 = 0, $$0$lcssa = 0, $$1$ph = 0, $$13 = 0, $$lcssa9 = 0, $11 = 0, $4 = 0, $5 = 0, $8 = 0, $isdigittmp1 = 0, $isdigittmp5 = 0, $n$0$lcssa = 0, $n$04 = 0, $neg$0 = 0, $neg$1$ph = 0, label = 0; + $$0 = $s; + while (1) { + $4 = $$0 + 1 | 0; + if (!(_isspace(HEAP8[$$0 >> 0] | 0) | 0)) { + $$0$lcssa = $$0; + $$lcssa9 = $4; + break; + } else $$0 = $4; + } + $5 = HEAP8[$$0$lcssa >> 0] | 0; + switch ($5 << 24 >> 24 | 0) { + case 45: + { + $neg$0 = 1; + label = 5; + break; + } + case 43: + { + $neg$0 = 0; + label = 5; + break; + } + default: + { + $$1$ph = $$0$lcssa; + $8 = $5; + $neg$1$ph = 0; + } + } + if ((label | 0) == 5) { + $$1$ph = $$lcssa9; + $8 = HEAP8[$$lcssa9 >> 0] | 0; + $neg$1$ph = $neg$0; + } + $isdigittmp1 = ($8 << 24 >> 24) + -48 | 0; + if ($isdigittmp1 >>> 0 < 10) { + $$13 = $$1$ph; + $isdigittmp5 = $isdigittmp1; + $n$04 = 0; + while (1) { + $$13 = $$13 + 1 | 0; + $11 = ($n$04 * 10 | 0) - $isdigittmp5 | 0; + $isdigittmp5 = (HEAP8[$$13 >> 0] | 0) + -48 | 0; + if ($isdigittmp5 >>> 0 >= 10) { + $n$0$lcssa = $11; + break; + } else $n$04 = $11; + } + } else $n$0$lcssa = 0; + return (($neg$1$ph | 0) != 0 ? $n$0$lcssa : 0 - $n$0$lcssa | 0) | 0; +} + +function __ZNSt3__113unordered_mapIi12arControllerNS_4hashIiEENS_8equal_toIiEENS_9allocatorINS_4pairIKiS1_EEEEEixERS8_($this, $__k) { + $this = $this | 0; + $__k = $__k | 0; + var $$pn3 = 0, $0 = 0, $1 = 0, $5 = 0, $__h = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 32 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $__h = sp + 8 | 0; + $0 = sp; + $1 = __ZNSt3__112__hash_tableINS_17__hash_value_typeIi12arControllerEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE4findIiEENS_15__hash_iteratorIPNS_11__hash_nodeIS3_PvEEEERKT_($this, $__k) | 0; + if (!$1) { + __ZNSt3__113unordered_mapIi12arControllerNS_4hashIiEENS_8equal_toIiEENS_9allocatorINS_4pairIKiS1_EEEEE25__construct_node_with_keyERS8_($__h, $this, $__k); + __ZNSt3__112__hash_tableINS_17__hash_value_typeIi12arControllerEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE20__node_insert_uniqueEPNS_11__hash_nodeIS3_PvEE($0, $this, HEAP32[$__h >> 2] | 0); + $5 = HEAP32[$0 >> 2] | 0; + HEAP32[$__h >> 2] = 0; + $$pn3 = $5; + } else $$pn3 = $1; + STACKTOP = sp; + return $$pn3 + 16 | 0; +} + +function __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE9push_backEc($this, $__c) { + $this = $this | 0; + $__c = $__c | 0; + var $$pn = 0, $0 = 0, $19 = 0, $2 = 0, $20 = 0, $__cap$0 = 0, $__p$0$sum$pre$phiZZZ2D = 0, $__sz$0 = 0, label = 0; + $0 = HEAP8[$this >> 0] | 0; + $2 = ($0 & 1) != 0; + if ($2) { + $__cap$0 = (HEAP32[$this >> 2] & -2) + -1 | 0; + $__sz$0 = HEAP32[$this + 4 >> 2] | 0; + } else { + $__cap$0 = 10; + $__sz$0 = ($0 & 255) >>> 1; + } + if (($__sz$0 | 0) == ($__cap$0 | 0)) { + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE9__grow_byEjjjjjj($this, $__cap$0, 1, $__cap$0, $__cap$0, 0); + if (!(HEAP8[$this >> 0] & 1)) label = 7; else label = 8; + } else if ($2) label = 8; else label = 7; + if ((label | 0) == 7) { + HEAP8[$this >> 0] = ($__sz$0 << 1) + 2; + $$pn = $this + 1 | 0; + $__p$0$sum$pre$phiZZZ2D = $__sz$0 + 1 | 0; + } else if ((label | 0) == 8) { + $19 = HEAP32[$this + 8 >> 2] | 0; + $20 = $__sz$0 + 1 | 0; + HEAP32[$this + 4 >> 2] = $20; + $$pn = $19; + $__p$0$sum$pre$phiZZZ2D = $20; + } + HEAP8[$$pn + $__sz$0 >> 0] = $__c; + HEAP8[$$pn + $__p$0$sum$pre$phiZZZ2D >> 0] = 0; + return; +} + +function __ZNK10__cxxabiv117__class_type_info29process_static_type_above_dstEPNS_19__dynamic_cast_infoEPKvS4_i($this, $info, $dst_ptr, $current_ptr, $path_below) { + $this = $this | 0; + $info = $info | 0; + $dst_ptr = $dst_ptr | 0; + $current_ptr = $current_ptr | 0; + $path_below = $path_below | 0; + var $16 = 0, $17 = 0, $23 = 0, $25 = 0, $5 = 0, $6 = 0; + HEAP8[$info + 53 >> 0] = 1; + do if ((HEAP32[$info + 4 >> 2] | 0) == ($current_ptr | 0)) { + HEAP8[$info + 52 >> 0] = 1; + $5 = $info + 16 | 0; + $6 = HEAP32[$5 >> 2] | 0; + if (!$6) { + HEAP32[$5 >> 2] = $dst_ptr; + HEAP32[$info + 24 >> 2] = $path_below; + HEAP32[$info + 36 >> 2] = 1; + if (!(($path_below | 0) == 1 ? (HEAP32[$info + 48 >> 2] | 0) == 1 : 0)) break; + HEAP8[$info + 54 >> 0] = 1; + break; + } + if (($6 | 0) != ($dst_ptr | 0)) { + $25 = $info + 36 | 0; + HEAP32[$25 >> 2] = (HEAP32[$25 >> 2] | 0) + 1; + HEAP8[$info + 54 >> 0] = 1; + break; + } + $16 = $info + 24 | 0; + $17 = HEAP32[$16 >> 2] | 0; + if (($17 | 0) == 2) { + HEAP32[$16 >> 2] = $path_below; + $23 = $path_below; + } else $23 = $17; + if (($23 | 0) == 1 ? (HEAP32[$info + 48 >> 2] | 0) == 1 : 0) HEAP8[$info + 54 >> 0] = 1; + } while (0); + return; +} + +function __ZN10__cxxabiv112_GLOBAL__N_117parse_call_offsetEPKcS2_($first, $last) { + $first = $first | 0; + $last = $last | 0; + var $$0 = 0, $10 = 0, $11 = 0, $16 = 0, $17 = 0, $3 = 0, $4 = 0; + L1 : do if (($first | 0) == ($last | 0)) $$0 = $first; else { + switch (HEAP8[$first >> 0] | 0) { + case 104: + { + $3 = $first + 1 | 0; + $4 = __ZN10__cxxabiv112_GLOBAL__N_112parse_numberEPKcS2_($3, $last) | 0; + if (($4 | 0) == ($3 | 0) | ($4 | 0) == ($last | 0)) { + $$0 = $first; + break L1; + } + $$0 = (HEAP8[$4 >> 0] | 0) == 95 ? $4 + 1 | 0 : $first; + break L1; + break; + } + case 118: + break; + default: + { + $$0 = $first; + break L1; + } + } + $10 = $first + 1 | 0; + $11 = __ZN10__cxxabiv112_GLOBAL__N_112parse_numberEPKcS2_($10, $last) | 0; + if (($11 | 0) == ($10 | 0) | ($11 | 0) == ($last | 0)) $$0 = $first; else if ((HEAP8[$11 >> 0] | 0) == 95) { + $16 = $11 + 1 | 0; + $17 = __ZN10__cxxabiv112_GLOBAL__N_112parse_numberEPKcS2_($16, $last) | 0; + if (($17 | 0) == ($16 | 0) | ($17 | 0) == ($last | 0)) $$0 = $first; else return ((HEAP8[$17 >> 0] | 0) == 95 ? $17 + 1 | 0 : $first) | 0; + } else $$0 = $first; + } while (0); + return $$0 | 0; +} + +function _setup($width, $height, $cameraID) { + $width = $width | 0; + $height = $height | 0; + $cameraID = $cameraID | 0; + var $0 = 0, $10 = 0, $2 = 0, $6 = 0, $7 = 0, $8 = 0, $9 = 0, $id = 0, $vararg_buffer1 = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer1 = sp + 8 | 0; + $id = sp + 12 | 0; + $0 = HEAP32[525] | 0; + HEAP32[525] = $0 + 1; + HEAP32[$id >> 2] = $0; + $2 = __ZNSt3__113unordered_mapIi12arControllerNS_4hashIiEENS_8equal_toIiEENS_9allocatorINS_4pairIKiS1_EEEEEixERS8_(2044, $id) | 0; + HEAP32[$2 >> 2] = $0; + HEAP32[$2 + 204 >> 2] = $width; + HEAP32[$2 + 208 >> 2] = $height; + $6 = Math_imul($width << 2, $height) | 0; + $7 = $2 + 200 | 0; + HEAP32[$7 >> 2] = $6; + $8 = _malloc($6) | 0; + $9 = $2 + 196 | 0; + HEAP32[$9 >> 2] = $8; + $10 = _arPattCreateHandle() | 0; + HEAP32[$2 + 216 >> 2] = $10; + if (!$10) _arLog(3, 8284, sp); + _setCamera($0, $cameraID) | 0; + HEAP32[$vararg_buffer1 >> 2] = HEAP32[$7 >> 2]; + _arLog(1, 8321, $vararg_buffer1); + _emscripten_asm_const_5(2, HEAP32[$2 >> 2] | 0, HEAP32[$9 >> 2] | 0, HEAP32[$7 >> 2] | 0, $2 + 264 | 0, 264) | 0; + STACKTOP = sp; + return HEAP32[$2 >> 2] | 0; +} + +function __ZNSt3__113unordered_mapIi7ARParamNS_4hashIiEENS_8equal_toIiEENS_9allocatorINS_4pairIKiS1_EEEEEixERS8_($this, $__k) { + $this = $this | 0; + $__k = $__k | 0; + var $$pn3 = 0, $0 = 0, $1 = 0, $5 = 0, $__h = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 32 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $__h = sp + 8 | 0; + $0 = sp; + $1 = __ZNSt3__112__hash_tableINS_17__hash_value_typeIi7ARParamEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE4findIiEENS_15__hash_iteratorIPNS_11__hash_nodeIS3_PvEEEERKT_($this, $__k) | 0; + if (!$1) { + __ZNSt3__113unordered_mapIi7ARParamNS_4hashIiEENS_8equal_toIiEENS_9allocatorINS_4pairIKiS1_EEEEE25__construct_node_with_keyERS8_($__h, $this, $__k); + __ZNSt3__112__hash_tableINS_17__hash_value_typeIi7ARParamEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE20__node_insert_uniqueEPNS_11__hash_nodeIS3_PvEE($0, $this, HEAP32[$__h >> 2] | 0); + $5 = HEAP32[$0 >> 2] | 0; + HEAP32[$__h >> 2] = 0; + $$pn3 = $5; + } else $$pn3 = $1; + STACKTOP = sp; + return $$pn3 + 16 | 0; +} + +function __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE9__grow_byEjjjjjj($this, $__old_cap, $__delta_cap, $__old_sz, $__n_copy, $__n_add) { + $this = $this | 0; + $__old_cap = $__old_cap | 0; + $__delta_cap = $__delta_cap | 0; + $__old_sz = $__old_sz | 0; + $__n_copy = $__n_copy | 0; + $__n_add = $__n_add | 0; + var $10 = 0, $12 = 0, $17 = 0, $18 = 0, $20 = 0, $9 = 0; + if ((-17 - $__old_cap | 0) >>> 0 < $__delta_cap >>> 0) __ZNKSt3__121__basic_string_commonILb1EE20__throw_length_errorEv($this); + if (!(HEAP8[$this >> 0] & 1)) $20 = $this + 1 | 0; else $20 = HEAP32[$this + 8 >> 2] | 0; + if ($__old_cap >>> 0 < 2147483623) { + $9 = $__delta_cap + $__old_cap | 0; + $10 = $__old_cap << 1; + $12 = $9 >>> 0 < $10 >>> 0 ? $10 : $9; + $17 = $12 >>> 0 < 11 ? 11 : $12 + 16 & -16; + } else $17 = -17; + $18 = _malloc($17) | 0; + if ($__n_copy) _memcpy($18 | 0, $20 | 0, $__n_copy | 0) | 0; + if (($__old_sz | 0) != ($__n_copy | 0)) _memcpy($18 + ($__n_add + $__n_copy) | 0, $20 + $__n_copy | 0, $__old_sz - $__n_copy | 0) | 0; + if (($__old_cap | 0) != 10) _free($20); + HEAP32[$this + 8 >> 2] = $18; + HEAP32[$this >> 2] = $17 | 1; + return; +} + +function __ZNSt3__112__hash_tableINS_17__hash_value_typeIi12arControllerEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE4findIiEENS_15__hash_iteratorIPNS_11__hash_nodeIS3_PvEEEERKT_($this, $__k) { + $this = $this | 0; + $__k = $__k | 0; + var $$pn = 0, $0 = 0, $11 = 0, $12 = 0, $16 = 0, $2 = 0, $20 = 0, $24 = 0, $4 = 0, $6 = 0, $__nd$0 = 0; + $0 = HEAP32[$__k >> 2] | 0; + $2 = HEAP32[$this + 4 >> 2] | 0; + L1 : do if (!$2) $24 = 0; else { + $4 = $2 + -1 | 0; + $6 = ($4 & $2 | 0) == 0; + if ($6) $11 = $4 & $0; else $11 = ($0 >>> 0) % ($2 >>> 0) | 0; + $12 = HEAP32[(HEAP32[$this >> 2] | 0) + ($11 << 2) >> 2] | 0; + if (!$12) $24 = 0; else { + $$pn = $12; + while (1) { + $__nd$0 = HEAP32[$$pn >> 2] | 0; + if (!$__nd$0) { + $24 = 0; + break L1; + } + $16 = HEAP32[$__nd$0 + 4 >> 2] | 0; + if ($6) $20 = $16 & $4; else $20 = ($16 >>> 0) % ($2 >>> 0) | 0; + if (($20 | 0) != ($11 | 0)) { + $24 = 0; + break L1; + } + if ((HEAP32[$__nd$0 + 8 >> 2] | 0) == ($0 | 0)) { + $24 = $__nd$0; + break; + } else $$pn = $__nd$0; + } + } + } while (0); + return $24 | 0; +} + +function __ZNSt3__112__hash_tableINS_17__hash_value_typeIi7ARParamEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE4findIiEENS_15__hash_iteratorIPNS_11__hash_nodeIS3_PvEEEERKT_($this, $__k) { + $this = $this | 0; + $__k = $__k | 0; + var $$pn = 0, $0 = 0, $11 = 0, $12 = 0, $16 = 0, $2 = 0, $20 = 0, $24 = 0, $4 = 0, $6 = 0, $__nd$0 = 0; + $0 = HEAP32[$__k >> 2] | 0; + $2 = HEAP32[$this + 4 >> 2] | 0; + L1 : do if (!$2) $24 = 0; else { + $4 = $2 + -1 | 0; + $6 = ($4 & $2 | 0) == 0; + if ($6) $11 = $4 & $0; else $11 = ($0 >>> 0) % ($2 >>> 0) | 0; + $12 = HEAP32[(HEAP32[$this >> 2] | 0) + ($11 << 2) >> 2] | 0; + if (!$12) $24 = 0; else { + $$pn = $12; + while (1) { + $__nd$0 = HEAP32[$$pn >> 2] | 0; + if (!$__nd$0) { + $24 = 0; + break L1; + } + $16 = HEAP32[$__nd$0 + 4 >> 2] | 0; + if ($6) $20 = $16 & $4; else $20 = ($16 >>> 0) % ($2 >>> 0) | 0; + if (($20 | 0) != ($11 | 0)) { + $24 = 0; + break L1; + } + if ((HEAP32[$__nd$0 + 8 >> 2] | 0) == ($0 | 0)) { + $24 = $__nd$0; + break; + } else $$pn = $__nd$0; + } + } + } while (0); + return $24 | 0; +} + +function __ZNSt3__112__hash_tableINS_17__hash_value_typeIi12arControllerEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE14__erase_uniqueIiEEjRKT_($this, $__k) { + $this = $this | 0; + $__k = $__k | 0; + var $$0 = 0, $$byval_copy = 0, $0 = 0, $1 = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $$byval_copy = sp + 4 | 0; + $0 = sp; + $1 = __ZNSt3__112__hash_tableINS_17__hash_value_typeIi12arControllerEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE4findIiEENS_15__hash_iteratorIPNS_11__hash_nodeIS3_PvEEEERKT_($this, $__k) | 0; + if (!$1) $$0 = 0; else { + HEAP32[$0 >> 2] = $1; + HEAP32[$$byval_copy >> 2] = HEAP32[$0 >> 2]; + __ZNSt3__112__hash_tableINS_17__hash_value_typeIi12arControllerEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE5eraseENS_21__hash_const_iteratorIPNS_11__hash_nodeIS3_PvEEEE($this, $$byval_copy) | 0; + $$0 = 1; + } + STACKTOP = sp; + return $$0 | 0; +} + +function __ZNSt3__112__hash_tableINS_17__hash_value_typeIi12arControllerEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE5eraseENS_21__hash_const_iteratorIPNS_11__hash_nodeIS3_PvEEEE($this, $__p) { + $this = $this | 0; + $__p = $__p | 0; + var $$byval_copy = 0, $0 = 0, $1 = 0, $2 = 0, $3 = 0, $4 = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 32 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $$byval_copy = sp + 16 | 0; + $0 = sp + 4 | 0; + $1 = sp; + $2 = HEAP32[$__p >> 2] | 0; + $3 = HEAP32[$2 >> 2] | 0; + HEAP32[$1 >> 2] = $2; + HEAP32[$$byval_copy >> 2] = HEAP32[$1 >> 2]; + __ZNSt3__112__hash_tableINS_17__hash_value_typeIi12arControllerEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE6removeENS_21__hash_const_iteratorIPNS_11__hash_nodeIS3_PvEEEE($0, $this, $$byval_copy); + $4 = HEAP32[$0 >> 2] | 0; + HEAP32[$0 >> 2] = 0; + if ($4) { + if (HEAP8[$0 + 8 >> 0] | 0) __ZNSt3__113__vector_baseI12multi_markerNS_9allocatorIS1_EEED2Ev($4 + 264 | 0); + __ZdlPv($4); + } + STACKTOP = sp; + return $3 | 0; +} + +function __ZNK10__cxxabiv117__class_type_info9can_catchEPKNS_16__shim_type_infoERPv($this, $thrown_type, $adjustedPtr) { + $this = $this | 0; + $thrown_type = $thrown_type | 0; + $adjustedPtr = $adjustedPtr | 0; + var $$0 = 0, $$1 = 0, $2 = 0, $info = 0, dest = 0, sp = 0, stop = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 64 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $info = sp; + if (($this | 0) == ($thrown_type | 0)) $$1 = 1; else if (!$thrown_type) $$1 = 0; else { + $2 = ___dynamic_cast($thrown_type, 576, 592, 0) | 0; + if (!$2) $$1 = 0; else { + dest = $info; + stop = dest + 56 | 0; + do { + HEAP32[dest >> 2] = 0; + dest = dest + 4 | 0; + } while ((dest | 0) < (stop | 0)); + HEAP32[$info >> 2] = $2; + HEAP32[$info + 8 >> 2] = $this; + HEAP32[$info + 12 >> 2] = -1; + HEAP32[$info + 48 >> 2] = 1; + FUNCTION_TABLE_viiii[HEAP32[(HEAP32[$2 >> 2] | 0) + 28 >> 2] & 3]($2, $info, HEAP32[$adjustedPtr >> 2] | 0, 1); + if ((HEAP32[$info + 24 >> 2] | 0) == 1) { + HEAP32[$adjustedPtr >> 2] = HEAP32[$info + 16 >> 2]; + $$0 = 1; + } else $$0 = 0; + $$1 = $$0; + } + } + STACKTOP = sp; + return $$1 | 0; +} + +function __ZNK10__cxxabiv117__class_type_info16search_below_dstEPNS_19__dynamic_cast_infoEPKvib($this, $info, $current_ptr, $path_below, $use_strcmp) { + $this = $this | 0; + $info = $info | 0; + $current_ptr = $current_ptr | 0; + $path_below = $path_below | 0; + $use_strcmp = $use_strcmp | 0; + var $14 = 0, $20 = 0, $6 = 0; + do if (($this | 0) == (HEAP32[$info + 8 >> 2] | 0)) { + if ((HEAP32[$info + 4 >> 2] | 0) == ($current_ptr | 0)) { + $6 = $info + 28 | 0; + if ((HEAP32[$6 >> 2] | 0) != 1) HEAP32[$6 >> 2] = $path_below; + } + } else if (($this | 0) == (HEAP32[$info >> 2] | 0)) { + if ((HEAP32[$info + 16 >> 2] | 0) != ($current_ptr | 0)) { + $14 = $info + 20 | 0; + if ((HEAP32[$14 >> 2] | 0) != ($current_ptr | 0)) { + HEAP32[$info + 32 >> 2] = $path_below; + HEAP32[$14 >> 2] = $current_ptr; + $20 = $info + 40 | 0; + HEAP32[$20 >> 2] = (HEAP32[$20 >> 2] | 0) + 1; + if ((HEAP32[$info + 36 >> 2] | 0) == 1) if ((HEAP32[$info + 24 >> 2] | 0) == 2) HEAP8[$info + 54 >> 0] = 1; + HEAP32[$info + 44 >> 2] = 4; + break; + } + } + if (($path_below | 0) == 1) HEAP32[$info + 32 >> 2] = 1; + } while (0); + return; +} + +function _getTransMatSquareCont($id, $markerIndex, $markerWidth) { + $id = $id | 0; + $markerIndex = $markerIndex | 0; + $markerWidth = $markerWidth | 0; + var $$0 = 0, $0 = 0, $4 = 0, $6 = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $0 = sp; + HEAP32[$0 >> 2] = $id; + do if (!(__ZNSt3__112__hash_tableINS_17__hash_value_typeIi12arControllerEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE4findIiEENS_15__hash_iteratorIPNS_11__hash_nodeIS3_PvEEEERKT_(2044, $0) | 0)) $$0 = HEAP32[522] | 0; else { + $4 = __ZNSt3__113unordered_mapIi12arControllerNS_4hashIiEENS_8equal_toIiEENS_9allocatorINS_4pairIKiS1_EEEEEixERS8_(2044, $0) | 0; + $6 = HEAP32[$4 + 212 >> 2] | 0; + if ((HEAP32[$6 + 44 >> 2] | 0) > ($markerIndex | 0)) { + +_arGetTransMatSquareCont(HEAP32[$4 + 224 >> 2] | 0, ($markerIndex | 0) < 0 ? 8 : $6 + 48 + ($markerIndex << 8) | 0, 264, +($markerWidth | 0), 264); + $$0 = 0; + break; + } else { + $$0 = HEAP32[523] | 0; + break; + } + } while (0); + STACKTOP = sp; + return $$0 | 0; +} + +function _arPattLoad($pattHandle, $filename) { + $pattHandle = $pattHandle | 0; + $filename = $filename | 0; + var $$0 = 0, $0 = 0, $2 = 0, $4 = 0, $6 = 0, $9 = 0, $vararg_buffer = 0, $vararg_buffer1 = 0, $vararg_buffer3 = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 32 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer3 = sp + 16 | 0; + $vararg_buffer1 = sp + 8 | 0; + $vararg_buffer = sp; + $0 = _fopen($filename, 4854) | 0; + do if (!$0) { + HEAP32[$vararg_buffer >> 2] = $filename; + _arLog(3, 4774, $vararg_buffer); + $$0 = -1; + } else { + _fseek($0, 0, 2) | 0; + $2 = _ftell($0) | 0; + _fseek($0, 0, 0) | 0; + $4 = _malloc($2 + 1 | 0) | 0; + if (!$4) { + _arLog(3, 5471, $vararg_buffer1); + _fclose($0) | 0; + $$0 = -1; + break; + } + $6 = _fread($4, $2, 1, $0) | 0; + _fclose($0) | 0; + if (!$6) { + HEAP32[$vararg_buffer3 >> 2] = $filename; + _arLog(3, 4820, $vararg_buffer3); + _free($4); + $$0 = -1; + break; + } else { + HEAP8[$4 + $2 >> 0] = 0; + $9 = _arPattLoadFromBuffer($pattHandle, $4) | 0; + _free($4); + $$0 = $9; + break; + } + } while (0); + STACKTOP = sp; + return $$0 | 0; +} + +function _fmt_u($0, $1, $s) { + $0 = $0 | 0; + $1 = $1 | 0; + $s = $s | 0; + var $$0$lcssa = 0, $$01$lcssa$off0 = 0, $$05 = 0, $$1$lcssa = 0, $$12 = 0, $$lcssa20 = 0, $13 = 0, $14 = 0, $25 = 0, $28 = 0, $7 = 0, $8 = 0, $9 = 0, $y$03 = 0; + if ($1 >>> 0 > 0 | ($1 | 0) == 0 & $0 >>> 0 > 4294967295) { + $$05 = $s; + $7 = $0; + $8 = $1; + while (1) { + $9 = ___uremdi3($7 | 0, $8 | 0, 10, 0) | 0; + $13 = $$05 + -1 | 0; + HEAP8[$13 >> 0] = $9 | 48; + $14 = ___udivdi3($7 | 0, $8 | 0, 10, 0) | 0; + if ($8 >>> 0 > 9 | ($8 | 0) == 9 & $7 >>> 0 > 4294967295) { + $$05 = $13; + $7 = $14; + $8 = tempRet0; + } else { + $$lcssa20 = $13; + $28 = $14; + break; + } + } + $$0$lcssa = $$lcssa20; + $$01$lcssa$off0 = $28; + } else { + $$0$lcssa = $s; + $$01$lcssa$off0 = $0; + } + if (!$$01$lcssa$off0) $$1$lcssa = $$0$lcssa; else { + $$12 = $$0$lcssa; + $y$03 = $$01$lcssa$off0; + while (1) { + $25 = $$12 + -1 | 0; + HEAP8[$25 >> 0] = ($y$03 >>> 0) % 10 | 0 | 48; + if ($y$03 >>> 0 < 10) { + $$1$lcssa = $25; + break; + } else { + $$12 = $25; + $y$03 = ($y$03 >>> 0) / 10 | 0; + } + } + } + return $$1$lcssa | 0; +} + +function _byteswap($param) { + $param = $param | 0; + var $$lcssa = 0, $15 = 0, $2 = 0, $i$13 = 0, $j$05 = 0, $wparam = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 192 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $wparam = sp; + _byteSwapInt($param, $wparam); + _byteSwapInt($param + 4 | 0, $wparam + 4 | 0); + $j$05 = 0; + do { + _byteSwapDouble($param + 8 + ($j$05 << 5) | 0, $wparam + 8 + ($j$05 << 5) | 0); + _byteSwapDouble($param + 8 + ($j$05 << 5) + 8 | 0, $wparam + 8 + ($j$05 << 5) + 8 | 0); + _byteSwapDouble($param + 8 + ($j$05 << 5) + 16 | 0, $wparam + 8 + ($j$05 << 5) + 16 | 0); + _byteSwapDouble($param + 8 + ($j$05 << 5) + 24 | 0, $wparam + 8 + ($j$05 << 5) + 24 | 0); + $j$05 = $j$05 + 1 | 0; + } while (($j$05 | 0) != 3); + $2 = $param + 176 | 0; + $i$13 = 0; + do { + _byteSwapDouble($param + 104 + ($i$13 << 3) | 0, $wparam + 104 + ($i$13 << 3) | 0); + $i$13 = $i$13 + 1 | 0; + $15 = HEAP32[$2 >> 2] | 0; + } while (($i$13 | 0) < (HEAP32[2012 + ($15 + -1 << 3) >> 2] | 0)); + $$lcssa = $15; + HEAP32[$wparam + 176 >> 2] = $$lcssa; + _memcpy($param | 0, $wparam | 0, 184) | 0; + STACKTOP = sp; + return; +} + +function _getTransMatSquare($id, $markerIndex, $markerWidth) { + $id = $id | 0; + $markerIndex = $markerIndex | 0; + $markerWidth = $markerWidth | 0; + var $$0 = 0, $0 = 0, $4 = 0, $6 = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $0 = sp; + HEAP32[$0 >> 2] = $id; + do if (!(__ZNSt3__112__hash_tableINS_17__hash_value_typeIi12arControllerEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE4findIiEENS_15__hash_iteratorIPNS_11__hash_nodeIS3_PvEEEERKT_(2044, $0) | 0)) $$0 = HEAP32[522] | 0; else { + $4 = __ZNSt3__113unordered_mapIi12arControllerNS_4hashIiEENS_8equal_toIiEENS_9allocatorINS_4pairIKiS1_EEEEEixERS8_(2044, $0) | 0; + $6 = HEAP32[$4 + 212 >> 2] | 0; + if ((HEAP32[$6 + 44 >> 2] | 0) > ($markerIndex | 0)) { + +_arGetTransMatSquare(HEAP32[$4 + 224 >> 2] | 0, ($markerIndex | 0) < 0 ? 8 : $6 + 48 + ($markerIndex << 8) | 0, +($markerWidth | 0), 264); + $$0 = 0; + break; + } else { + $$0 = HEAP32[523] | 0; + break; + } + } while (0); + STACKTOP = sp; + return $$0 | 0; +} + +function _arMatrixTrans($dest, $source) { + $dest = $dest | 0; + $source = $source | 0; + var $$0 = 0, $1 = 0, $13 = 0, $6 = 0, $c$01 = 0, $p1$02 = 0, $p2$05 = 0, $p2$13 = 0, $r$04 = 0, $smax = 0; + $1 = HEAP32[$dest + 4 >> 2] | 0; + if (($1 | 0) == (HEAP32[$source + 8 >> 2] | 0)) { + $6 = HEAP32[$dest + 8 >> 2] | 0; + if (($6 | 0) == (HEAP32[$source + 4 >> 2] | 0)) { + $smax = ($6 | 0) > 0 ? $6 : 0; + if (($1 | 0) > 0) { + $13 = ($6 | 0) > 0; + $p2$05 = HEAP32[$dest >> 2] | 0; + $r$04 = 0; + while (1) { + if ($13) { + $c$01 = 0; + $p1$02 = (HEAP32[$source >> 2] | 0) + ($r$04 << 3) | 0; + $p2$13 = $p2$05; + while (1) { + HEAPF64[$p2$13 >> 3] = +HEAPF64[$p1$02 >> 3]; + $c$01 = $c$01 + 1 | 0; + if (($c$01 | 0) >= ($6 | 0)) break; else { + $p1$02 = $p1$02 + ($1 << 3) | 0; + $p2$13 = $p2$13 + 8 | 0; + } + } + } + $r$04 = $r$04 + 1 | 0; + if (($r$04 | 0) >= ($1 | 0)) { + $$0 = 0; + break; + } else $p2$05 = $p2$05 + ($smax << 3) | 0; + } + } else $$0 = 0; + } else $$0 = -1; + } else $$0 = -1; + return $$0 | 0; +} + +function _fflush($f) { + $f = $f | 0; + var $$0 = 0, $$012 = 0, $$014 = 0, $24 = 0, $27 = 0, $6 = 0, $phitmp = 0, $r$0$lcssa = 0, $r$03 = 0, $r$1 = 0; + do if (!$f) { + if (!(HEAP32[660] | 0)) $27 = 0; else $27 = _fflush(HEAP32[660] | 0) | 0; + ___lock(2416); + $$012 = HEAP32[603] | 0; + if (!$$012) $r$0$lcssa = $27; else { + $$014 = $$012; + $r$03 = $27; + while (1) { + if ((HEAP32[$$014 + 76 >> 2] | 0) > -1) $24 = ___lockfile($$014) | 0; else $24 = 0; + if ((HEAP32[$$014 + 20 >> 2] | 0) >>> 0 > (HEAP32[$$014 + 28 >> 2] | 0) >>> 0) $r$1 = ___fflush_unlocked($$014) | 0 | $r$03; else $r$1 = $r$03; + if ($24) ___unlockfile($$014); + $$014 = HEAP32[$$014 + 56 >> 2] | 0; + if (!$$014) { + $r$0$lcssa = $r$1; + break; + } else $r$03 = $r$1; + } + } + ___unlock(2416); + $$0 = $r$0$lcssa; + } else { + if ((HEAP32[$f + 76 >> 2] | 0) <= -1) { + $$0 = ___fflush_unlocked($f) | 0; + break; + } + $phitmp = (___lockfile($f) | 0) == 0; + $6 = ___fflush_unlocked($f) | 0; + if ($phitmp) $$0 = $6; else { + ___unlockfile($f); + $$0 = $6; + } + } while (0); + return $$0 | 0; +} + +function __ZNK10__cxxabiv121__vmi_class_type_info27has_unambiguous_public_baseEPNS_19__dynamic_cast_infoEPvi($this, $info, $adjustedPtr, $path_below) { + $this = $this | 0; + $info = $info | 0; + $adjustedPtr = $adjustedPtr | 0; + $path_below = $path_below | 0; + var $5 = 0, $6 = 0, $9 = 0, $p$0 = 0; + L1 : do if (($this | 0) == (HEAP32[$info + 8 >> 2] | 0)) __ZNK10__cxxabiv117__class_type_info24process_found_base_classEPNS_19__dynamic_cast_infoEPvi(0, $info, $adjustedPtr, $path_below); else { + $5 = HEAP32[$this + 12 >> 2] | 0; + $6 = $this + 16 + ($5 << 3) | 0; + __ZNK10__cxxabiv122__base_class_type_info27has_unambiguous_public_baseEPNS_19__dynamic_cast_infoEPvi($this + 16 | 0, $info, $adjustedPtr, $path_below); + if (($5 | 0) > 1) { + $9 = $info + 54 | 0; + $p$0 = $this + 24 | 0; + do { + __ZNK10__cxxabiv122__base_class_type_info27has_unambiguous_public_baseEPNS_19__dynamic_cast_infoEPvi($p$0, $info, $adjustedPtr, $path_below); + if (HEAP8[$9 >> 0] | 0) break L1; + $p$0 = $p$0 + 8 | 0; + } while ($p$0 >>> 0 < $6 >>> 0); + } + } while (0); + return; +} + +function __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE($this, $__v) { + $this = $this | 0; + $__v = $__v | 0; + var $$0$i1 = 0, $0 = 0, $1 = 0, $11 = 0, $13 = 0, $14 = 0, $16 = 0, $17 = 0, $18 = 0, $2 = 0, $3 = 0; + $0 = HEAP32[$this >> 2] | 0; + $1 = $this + 4 | 0; + $2 = HEAP32[$1 >> 2] | 0; + $3 = $__v + 4 | 0; + if (($2 | 0) != ($0 | 0)) { + $$0$i1 = $2; + do { + $$0$i1 = $$0$i1 + -24 | 0; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_((HEAP32[$3 >> 2] | 0) + -24 | 0, $$0$i1); + HEAP32[$3 >> 2] = (HEAP32[$3 >> 2] | 0) + -24; + } while (($$0$i1 | 0) != ($0 | 0)); + } + $11 = HEAP32[$this >> 2] | 0; + HEAP32[$this >> 2] = HEAP32[$3 >> 2]; + HEAP32[$3 >> 2] = $11; + $13 = $__v + 8 | 0; + $14 = HEAP32[$1 >> 2] | 0; + HEAP32[$1 >> 2] = HEAP32[$13 >> 2]; + HEAP32[$13 >> 2] = $14; + $16 = $this + 8 | 0; + $17 = $__v + 12 | 0; + $18 = HEAP32[$16 >> 2] | 0; + HEAP32[$16 >> 2] = HEAP32[$17 >> 2]; + HEAP32[$17 >> 2] = $18; + HEAP32[$__v >> 2] = HEAP32[$3 >> 2]; + return; +} + +function _strlen($s) { + $s = $s | 0; + var $$01$lcssa = 0, $$014 = 0, $$1$lcssa = 0, $$lcssa20 = 0, $$pn = 0, $$pn15 = 0, $0 = 0, $18 = 0, $21 = 0, $5 = 0, $9 = 0, $w$0 = 0, $w$0$lcssa = 0, label = 0; + $0 = $s; + L1 : do if (!($0 & 3)) { + $$01$lcssa = $s; + label = 4; + } else { + $$014 = $s; + $21 = $0; + while (1) { + if (!(HEAP8[$$014 >> 0] | 0)) { + $$pn = $21; + break L1; + } + $5 = $$014 + 1 | 0; + $21 = $5; + if (!($21 & 3)) { + $$01$lcssa = $5; + label = 4; + break; + } else $$014 = $5; + } + } while (0); + if ((label | 0) == 4) { + $w$0 = $$01$lcssa; + while (1) { + $9 = HEAP32[$w$0 >> 2] | 0; + if (!(($9 & -2139062144 ^ -2139062144) & $9 + -16843009)) $w$0 = $w$0 + 4 | 0; else { + $$lcssa20 = $9; + $w$0$lcssa = $w$0; + break; + } + } + if (!(($$lcssa20 & 255) << 24 >> 24)) $$1$lcssa = $w$0$lcssa; else { + $$pn15 = $w$0$lcssa; + while (1) { + $18 = $$pn15 + 1 | 0; + if (!(HEAP8[$18 >> 0] | 0)) { + $$1$lcssa = $18; + break; + } else $$pn15 = $18; + } + } + $$pn = $$1$lcssa; + } + return $$pn - $0 | 0; +} + +function _setMarkerInfoDir($id, $markerIndex, $dir) { + $id = $id | 0; + $markerIndex = $markerIndex | 0; + $dir = $dir | 0; + var $$0 = 0, $0 = 0, $5 = 0, $6 = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $0 = sp; + HEAP32[$0 >> 2] = $id; + do if (!(__ZNSt3__112__hash_tableINS_17__hash_value_typeIi12arControllerEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE4findIiEENS_15__hash_iteratorIPNS_11__hash_nodeIS3_PvEEEERKT_(2044, $0) | 0)) $$0 = HEAP32[522] | 0; else { + $5 = (__ZNSt3__113unordered_mapIi12arControllerNS_4hashIiEENS_8equal_toIiEENS_9allocatorINS_4pairIKiS1_EEEEEixERS8_(2044, $0) | 0) + 212 | 0; + $6 = HEAP32[$5 >> 2] | 0; + if ((HEAP32[$6 + 44 >> 2] | 0) > ($markerIndex | 0)) { + HEAP32[(($markerIndex | 0) < 0 ? 8 : $6 + 48 + ($markerIndex << 8) | 0) + 16 >> 2] = $dir; + $$0 = 0; + break; + } else { + $$0 = HEAP32[523] | 0; + break; + } + } while (0); + STACKTOP = sp; + return $$0 | 0; +} + +function __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6assignEPKcj($this, $__s, $__n) { + $this = $this | 0; + $__s = $__s | 0; + $__n = $__n | 0; + var $0 = 0, $10 = 0, $14 = 0, $27 = 0, $3 = 0, $7 = 0, $9 = 0; + $0 = HEAP8[$this >> 0] | 0; + if (!($0 & 1)) { + $7 = 10; + $9 = $0; + } else { + $3 = HEAP32[$this >> 2] | 0; + $7 = ($3 & -2) + -1 | 0; + $9 = $3 & 255; + } + $10 = ($9 & 1) == 0; + do if ($7 >>> 0 < $__n >>> 0) { + if ($10) $27 = ($9 & 255) >>> 1; else $27 = HEAP32[$this + 4 >> 2] | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE21__grow_by_and_replaceEjjjjjjPKc($this, $7, $__n - $7 | 0, $27, 0, $27, $__n, $__s); + } else { + if ($10) $14 = $this + 1 | 0; else $14 = HEAP32[$this + 8 >> 2] | 0; + _memmove($14 | 0, $__s | 0, $__n | 0) | 0; + HEAP8[$14 + $__n >> 0] = 0; + if (!(HEAP8[$this >> 0] & 1)) { + HEAP8[$this >> 0] = $__n << 1; + break; + } else { + HEAP32[$this + 4 >> 2] = $__n; + break; + } + } while (0); + return; +} + +function __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($this, $__s, $__n) { + $this = $this | 0; + $__s = $__s | 0; + $__n = $__n | 0; + var $0 = 0, $14 = 0, $15 = 0, $24 = 0, $25 = 0, $3 = 0, $7 = 0; + $0 = HEAP8[$this >> 0] | 0; + if (!($0 & 1)) { + $14 = 10; + $7 = $0; + } else { + $3 = HEAP32[$this >> 2] | 0; + $14 = ($3 & -2) + -1 | 0; + $7 = $3 & 255; + } + if (!($7 & 1)) $15 = ($7 & 255) >>> 1; else $15 = HEAP32[$this + 4 >> 2] | 0; + if (($14 - $15 | 0) >>> 0 < $__n >>> 0) __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE21__grow_by_and_replaceEjjjjjjPKc($this, $14, $__n - $14 + $15 | 0, $15, $15, 0, $__n, $__s); else if ($__n) { + if (!($7 & 1)) $24 = $this + 1 | 0; else $24 = HEAP32[$this + 8 >> 2] | 0; + _memcpy($24 + $15 | 0, $__s | 0, $__n | 0) | 0; + $25 = $15 + $__n | 0; + if (!(HEAP8[$this >> 0] & 1)) HEAP8[$this >> 0] = $25 << 1; else HEAP32[$this + 4 >> 2] = $25; + HEAP8[$24 + $25 >> 0] = 0; + } + return $this | 0; +} + +function _pad($f, $c, $w, $l, $fl) { + $f = $f | 0; + $c = $c | 0; + $w = $w | 0; + $l = $l | 0; + $fl = $fl | 0; + var $$0$lcssa6 = 0, $$02 = 0, $10 = 0, $14 = 0, $17 = 0, $18 = 0, $3 = 0, $7 = 0, $9 = 0, $pad = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 256 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $pad = sp; + do if (($w | 0) > ($l | 0) & ($fl & 73728 | 0) == 0) { + $3 = $w - $l | 0; + _memset($pad | 0, $c | 0, ($3 >>> 0 > 256 ? 256 : $3) | 0) | 0; + $7 = HEAP32[$f >> 2] | 0; + $9 = ($7 & 32 | 0) == 0; + if ($3 >>> 0 > 255) { + $10 = $w - $l | 0; + $$02 = $3; + $17 = $7; + $18 = $9; + while (1) { + if ($18) { + ___fwritex($pad, 256, $f) | 0; + $14 = HEAP32[$f >> 2] | 0; + } else $14 = $17; + $$02 = $$02 + -256 | 0; + $18 = ($14 & 32 | 0) == 0; + if ($$02 >>> 0 <= 255) break; else $17 = $14; + } + if ($18) $$0$lcssa6 = $10 & 255; else break; + } else if ($9) $$0$lcssa6 = $3; else break; + ___fwritex($pad, $$0$lcssa6, $f) | 0; + } while (0); + STACKTOP = sp; + return; +} + +function _loadCamera($cparam_name) { + $cparam_name = $cparam_name | 0; + var $$0 = 0, $15 = 0, $16 = 0, $6 = 0, $cameraID = 0, $param = 0, $vararg_buffer1 = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 208 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer1 = sp + 192 | 0; + $param = sp; + $cameraID = sp + 196 | 0; + if (!(HEAP8[$cparam_name >> 0] & 1)) $6 = $cparam_name + 1 | 0; else $6 = HEAP32[$cparam_name + 8 >> 2] | 0; + if ((_arParamLoad($6, 1, $param, sp + 184 | 0) | 0) < 0) { + if (!(HEAP8[$cparam_name >> 0] & 1)) $15 = $cparam_name + 1 | 0; else $15 = HEAP32[$cparam_name + 8 >> 2] | 0; + HEAP32[$vararg_buffer1 >> 2] = $15; + _arLog(3, 6092, $vararg_buffer1); + $$0 = -1; + } else { + $16 = HEAP32[521] | 0; + HEAP32[521] = $16 + 1; + HEAP32[$cameraID >> 2] = $16; + _memcpy(__ZNSt3__113unordered_mapIi7ARParamNS_4hashIiEENS_8equal_toIiEENS_9allocatorINS_4pairIKiS1_EEEEEixERS8_(2064, $cameraID) | 0, $param | 0, 184) | 0; + $$0 = $16; + } + STACKTOP = sp; + return $$0 | 0; +} + +function _getMultiMarkerNum($id, $multiMarker_id) { + $id = $id | 0; + $multiMarker_id = $multiMarker_id | 0; + var $$0 = 0, $0 = 0, $3 = 0, $8 = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $0 = sp; + HEAP32[$0 >> 2] = $id; + if (!(__ZNSt3__112__hash_tableINS_17__hash_value_typeIi12arControllerEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE4findIiEENS_15__hash_iteratorIPNS_11__hash_nodeIS3_PvEEEERKT_(2044, $0) | 0)) $$0 = -1; else { + $3 = __ZNSt3__113unordered_mapIi12arControllerNS_4hashIiEENS_8equal_toIiEENS_9allocatorINS_4pairIKiS1_EEEEEixERS8_(2044, $0) | 0; + if (($multiMarker_id | 0) < 0) $$0 = -1; else { + $8 = HEAP32[$3 + 248 >> 2] | 0; + if ((HEAP32[$3 + 252 >> 2] | 0) - $8 >> 3 >>> 0 > $multiMarker_id >>> 0) $$0 = HEAP32[(HEAP32[$8 + ($multiMarker_id << 3) + 4 >> 2] | 0) + 4 >> 2] | 0; else $$0 = -1; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _arImageProcInit($xsize, $ysize, $pixFormat, $alwaysCopy) { + $xsize = $xsize | 0; + $ysize = $ysize | 0; + $pixFormat = $pixFormat | 0; + $alwaysCopy = $alwaysCopy | 0; + var $$0 = 0, $0 = 0, $5 = 0, label = 0; + $0 = _malloc(2080) | 0; + L1 : do if (!$0) $$0 = $0; else { + HEAP32[$0 + 2068 >> 2] = $pixFormat; + L3 : do if (!$alwaysCopy) { + switch ($pixFormat | 0) { + case 5: + case 12: + case 13: + case 14: + break; + default: + { + label = 4; + break L3; + } + } + HEAP32[$0 + 2076 >> 2] = 0; + } else label = 4; while (0); + do if ((label | 0) == 4) { + $5 = _malloc(Math_imul($ysize, $xsize) | 0) | 0; + HEAP32[$0 >> 2] = $5; + if (!$5) { + _free($0); + $$0 = 0; + break L1; + } else { + HEAP32[$0 + 2076 >> 2] = 1; + break; + } + } while (0); + HEAP32[$0 + 2072 >> 2] = $alwaysCopy; + HEAP32[$0 + 4 >> 2] = 0; + HEAP32[$0 + 8 >> 2] = $xsize; + HEAP32[$0 + 12 >> 2] = $ysize; + $$0 = $0; + } while (0); + return $$0 | 0; +} + +function _setPattRatio($id, $ratio) { + $id = $id | 0; + $ratio = +$ratio; + var $0 = 0, $3 = 0, $6 = 0.0, $8 = 0, $vararg_buffer = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = sp + 8 | 0; + HEAP32[$0 >> 2] = $id; + if (__ZNSt3__112__hash_tableINS_17__hash_value_typeIi12arControllerEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE4findIiEENS_15__hash_iteratorIPNS_11__hash_nodeIS3_PvEEEERKT_(2044, $0) | 0) { + $3 = __ZNSt3__113unordered_mapIi12arControllerNS_4hashIiEENS_8equal_toIiEENS_9allocatorINS_4pairIKiS1_EEEEEixERS8_(2044, $0) | 0; + if (!($ratio <= 0.0 | $ratio >= 1.0)) { + $6 = $ratio; + $8 = HEAP32[$3 + 212 >> 2] | 0; + if ($8) if (!(_arSetPattRatio($8, $6) | 0)) { + HEAPF64[$vararg_buffer >> 3] = $6; + _arLog(1, 6512, $vararg_buffer); + } + } + } + STACKTOP = sp; + return; +} + +function _setDebugMode($id, $enable) { + $id = $id | 0; + $enable = $enable | 0; + var $$0 = 0, $0 = 0, $4 = 0, $6 = 0, $vararg_buffer = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = sp + 4 | 0; + HEAP32[$0 >> 2] = $id; + if (!(__ZNSt3__112__hash_tableINS_17__hash_value_typeIi12arControllerEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE4findIiEENS_15__hash_iteratorIPNS_11__hash_nodeIS3_PvEEEERKT_(2044, $0) | 0)) $$0 = 0; else { + $4 = (__ZNSt3__113unordered_mapIi12arControllerNS_4hashIiEENS_8equal_toIiEENS_9allocatorINS_4pairIKiS1_EEEEEixERS8_(2044, $0) | 0) + 212 | 0; + $6 = ($enable | 0) != 0; + _arSetDebugMode(HEAP32[$4 >> 2] | 0, $6 & 1) | 0; + HEAP32[$vararg_buffer >> 2] = $6 ? 6615 : 6619; + _arLog(1, 6624, $vararg_buffer); + $$0 = $enable; + } + STACKTOP = sp; + return $$0 | 0; +} + +function ___remdi3($a$0, $a$1, $b$0, $b$1) { + $a$0 = $a$0 | 0; + $a$1 = $a$1 | 0; + $b$0 = $b$0 | 0; + $b$1 = $b$1 | 0; + var $rem = 0, $1$0 = 0, $1$1 = 0, $2$0 = 0, $2$1 = 0, $4$0 = 0, $4$1 = 0, $10$0 = 0, $10$1 = 0, __stackBase__ = 0; + __stackBase__ = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + $rem = __stackBase__ | 0; + $1$0 = $a$1 >> 31 | (($a$1 | 0) < 0 ? -1 : 0) << 1; + $1$1 = (($a$1 | 0) < 0 ? -1 : 0) >> 31 | (($a$1 | 0) < 0 ? -1 : 0) << 1; + $2$0 = $b$1 >> 31 | (($b$1 | 0) < 0 ? -1 : 0) << 1; + $2$1 = (($b$1 | 0) < 0 ? -1 : 0) >> 31 | (($b$1 | 0) < 0 ? -1 : 0) << 1; + $4$0 = _i64Subtract($1$0 ^ $a$0, $1$1 ^ $a$1, $1$0, $1$1) | 0; + $4$1 = tempRet0; + ___udivmoddi4($4$0, $4$1, _i64Subtract($2$0 ^ $b$0, $2$1 ^ $b$1, $2$0, $2$1) | 0, tempRet0, $rem) | 0; + $10$0 = _i64Subtract(HEAP32[$rem >> 2] ^ $1$0, HEAP32[$rem + 4 >> 2] ^ $1$1, $1$0, $1$1) | 0; + $10$1 = tempRet0; + STACKTOP = __stackBase__; + return (tempRet0 = $10$1, $10$0) | 0; +} + +function _fopen($filename, $mode) { + $filename = $filename | 0; + $mode = $mode | 0; + var $$0 = 0, $3 = 0, $5 = 0, $7 = 0, $9 = 0, $vararg_buffer = 0, $vararg_buffer3 = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 32 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer3 = sp + 16 | 0; + $vararg_buffer = sp; + if (!(_memchr(16759, HEAP8[$mode >> 0] | 0, 4) | 0)) { + $3 = ___errno_location() | 0; + HEAP32[$3 >> 2] = 22; + $$0 = 0; + } else { + $5 = ___fmodeflags($mode) | 0 | 32768; + HEAP32[$vararg_buffer >> 2] = $filename; + HEAP32[$vararg_buffer + 4 >> 2] = $5; + HEAP32[$vararg_buffer + 8 >> 2] = 438; + $7 = ___syscall_ret(___syscall5(5, $vararg_buffer | 0) | 0) | 0; + if (($7 | 0) < 0) $$0 = 0; else { + $9 = ___fdopen($7, $mode) | 0; + if (!$9) { + HEAP32[$vararg_buffer3 >> 2] = $7; + ___syscall6(6, $vararg_buffer3 | 0) | 0; + $$0 = 0; + } else $$0 = $9; + } + } + STACKTOP = sp; + return $$0 | 0; +} + +function _cycle($width, $ar, $n) { + $width = $width | 0; + $ar = $ar | 0; + $n = $n | 0; + var $$02 = 0, $1 = 0, $4 = 0, $6 = 0, $7 = 0, $i$01 = 0, $tmp = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 256 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $tmp = sp; + L1 : do if (($n | 0) >= 2) { + $1 = $ar + ($n << 2) | 0; + HEAP32[$1 >> 2] = $tmp; + if ($width) { + $$02 = $width; + $6 = $tmp; + while (1) { + $4 = $$02 >>> 0 > 256 ? 256 : $$02; + _memcpy($6 | 0, HEAP32[$ar >> 2] | 0, $4 | 0) | 0; + $i$01 = 0; + do { + $7 = $ar + ($i$01 << 2) | 0; + $i$01 = $i$01 + 1 | 0; + _memcpy(HEAP32[$7 >> 2] | 0, HEAP32[$ar + ($i$01 << 2) >> 2] | 0, $4 | 0) | 0; + HEAP32[$7 >> 2] = (HEAP32[$7 >> 2] | 0) + $4; + } while (($i$01 | 0) != ($n | 0)); + if (($$02 | 0) == ($4 | 0)) break L1; + $$02 = $$02 - $4 | 0; + $6 = HEAP32[$1 >> 2] | 0; + } + } + } while (0); + STACKTOP = sp; + return; +} + +function _setThreshold($id, $threshold) { + $id = $id | 0; + $threshold = $threshold | 0; + var $0 = 0, $3 = 0, $vararg_buffer = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = sp + 4 | 0; + HEAP32[$0 >> 2] = $id; + if (__ZNSt3__112__hash_tableINS_17__hash_value_typeIi12arControllerEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE4findIiEENS_15__hash_iteratorIPNS_11__hash_nodeIS3_PvEEEERKT_(2044, $0) | 0) { + $3 = __ZNSt3__113unordered_mapIi12arControllerNS_4hashIiEENS_8equal_toIiEENS_9allocatorINS_4pairIKiS1_EEEEEixERS8_(2044, $0) | 0; + if ($threshold >>> 0 <= 255) if (!(_arSetLabelingThresh(HEAP32[$3 + 212 >> 2] | 0, $threshold) | 0)) { + HEAP32[$vararg_buffer >> 2] = $threshold; + _arLog(1, 6568, $vararg_buffer); + } + } + STACKTOP = sp; + return; +} + +function _scalbn($x, $n) { + $x = +$x; + $n = $n | 0; + var $$0 = 0, $1 = 0.0, $12 = 0, $15 = 0, $16 = 0, $2 = 0, $5 = 0, $8 = 0.0, $9 = 0, $y$0 = 0.0; + if (($n | 0) > 1023) { + $1 = $x * 8988465674311579538646525.0e283; + $2 = $n + -1023 | 0; + if (($2 | 0) > 1023) { + $5 = $n + -2046 | 0; + $$0 = ($5 | 0) > 1023 ? 1023 : $5; + $y$0 = $1 * 8988465674311579538646525.0e283; + } else { + $$0 = $2; + $y$0 = $1; + } + } else if (($n | 0) < -1022) { + $8 = $x * 2.2250738585072014e-308; + $9 = $n + 1022 | 0; + if (($9 | 0) < -1022) { + $12 = $n + 2044 | 0; + $$0 = ($12 | 0) < -1022 ? -1022 : $12; + $y$0 = $8 * 2.2250738585072014e-308; + } else { + $$0 = $9; + $y$0 = $8; + } + } else { + $$0 = $n; + $y$0 = $x; + } + $15 = _bitshift64Shl($$0 + 1023 | 0, 0, 52) | 0; + $16 = tempRet0; + HEAP32[tempDoublePtr >> 2] = $15; + HEAP32[tempDoublePtr + 4 >> 2] = $16; + return +($y$0 * +HEAPF64[tempDoublePtr >> 3]); +} + +function _wcrtomb($s, $wc, $st) { + $s = $s | 0; + $wc = $wc | 0; + $st = $st | 0; + var $$0 = 0, $45 = 0; + do if (!$s) $$0 = 1; else { + if ($wc >>> 0 < 128) { + HEAP8[$s >> 0] = $wc; + $$0 = 1; + break; + } + if ($wc >>> 0 < 2048) { + HEAP8[$s >> 0] = $wc >>> 6 | 192; + HEAP8[$s + 1 >> 0] = $wc & 63 | 128; + $$0 = 2; + break; + } + if ($wc >>> 0 < 55296 | ($wc & -8192 | 0) == 57344) { + HEAP8[$s >> 0] = $wc >>> 12 | 224; + HEAP8[$s + 1 >> 0] = $wc >>> 6 & 63 | 128; + HEAP8[$s + 2 >> 0] = $wc & 63 | 128; + $$0 = 3; + break; + } + if (($wc + -65536 | 0) >>> 0 < 1048576) { + HEAP8[$s >> 0] = $wc >>> 18 | 240; + HEAP8[$s + 1 >> 0] = $wc >>> 12 & 63 | 128; + HEAP8[$s + 2 >> 0] = $wc >>> 6 & 63 | 128; + HEAP8[$s + 3 >> 0] = $wc & 63 | 128; + $$0 = 4; + break; + } else { + $45 = ___errno_location() | 0; + HEAP32[$45 >> 2] = 84; + $$0 = -1; + break; + } + } while (0); + return $$0 | 0; +} + +function _getThresholdMode($id) { + $id = $id | 0; + var $0 = 0, $4 = 0, $7 = 0, $thresholdMode = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $0 = sp + 4 | 0; + $thresholdMode = sp; + HEAP32[$0 >> 2] = $id; + if (!(__ZNSt3__112__hash_tableINS_17__hash_value_typeIi12arControllerEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE4findIiEENS_15__hash_iteratorIPNS_11__hash_nodeIS3_PvEEEERKT_(2044, $0) | 0)) { + STACKTOP = sp; + return -1; + } else { + $4 = (__ZNSt3__113unordered_mapIi12arControllerNS_4hashIiEENS_8equal_toIiEENS_9allocatorINS_4pairIKiS1_EEEEEixERS8_(2044, $0) | 0) + 212 | 0; + $7 = (_arGetLabelingThreshMode(HEAP32[$4 >> 2] | 0, $thresholdMode) | 0) == 0; + STACKTOP = sp; + return ($7 ? HEAP32[$thresholdMode >> 2] | 0 : -1) | 0; + } + return 0; +} + +function __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj9EEERAT__Kc($this, $s) { + $this = $this | 0; + $s = $s | 0; + var $1 = 0, $10 = 0, $12 = 0, $2 = 0, $3 = 0, $5 = 0, $6 = 0, $7 = 0, $8 = 0; + HEAP8[$this >> 0] = 16; + $1 = $s; + $2 = $1; + $3 = HEAPU8[$2 >> 0] | HEAPU8[$2 + 1 >> 0] << 8 | HEAPU8[$2 + 2 >> 0] << 16 | HEAPU8[$2 + 3 >> 0] << 24; + $5 = $1 + 4 | 0; + $6 = HEAPU8[$5 >> 0] | HEAPU8[$5 + 1 >> 0] << 8 | HEAPU8[$5 + 2 >> 0] << 16 | HEAPU8[$5 + 3 >> 0] << 24; + $7 = $this + 1 | 0; + $8 = $7; + HEAP8[$8 >> 0] = $3; + HEAP8[$8 + 1 >> 0] = $3 >> 8; + HEAP8[$8 + 2 >> 0] = $3 >> 16; + HEAP8[$8 + 3 >> 0] = $3 >> 24; + $10 = $7 + 4 | 0; + HEAP8[$10 >> 0] = $6; + HEAP8[$10 + 1 >> 0] = $6 >> 8; + HEAP8[$10 + 2 >> 0] = $6 >> 16; + HEAP8[$10 + 3 >> 0] = $6 >> 24; + HEAP8[$this + 9 >> 0] = 0; + $12 = $this + 12 | 0; + HEAP32[$12 >> 2] = 0; + HEAP32[$12 + 4 >> 2] = 0; + HEAP32[$12 + 8 >> 2] = 0; + return; +} + +function _getImageProcMode($id) { + $id = $id | 0; + var $0 = 0, $4 = 0, $7 = 0, $imageProcMode = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $0 = sp + 4 | 0; + $imageProcMode = sp; + HEAP32[$0 >> 2] = $id; + if (!(__ZNSt3__112__hash_tableINS_17__hash_value_typeIi12arControllerEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE4findIiEENS_15__hash_iteratorIPNS_11__hash_nodeIS3_PvEEEERKT_(2044, $0) | 0)) { + STACKTOP = sp; + return -1; + } else { + $4 = (__ZNSt3__113unordered_mapIi12arControllerNS_4hashIiEENS_8equal_toIiEENS_9allocatorINS_4pairIKiS1_EEEEEixERS8_(2044, $0) | 0) + 212 | 0; + $7 = (_arGetImageProcMode(HEAP32[$4 >> 2] | 0, $imageProcMode) | 0) == 0; + STACKTOP = sp; + return ($7 ? HEAP32[$imageProcMode >> 2] | 0 : -1) | 0; + } + return 0; +} + +function __ZNSt3__16vectorI12multi_markerNS_9allocatorIS1_EEE26__swap_out_circular_bufferERNS_14__split_bufferIS1_RS3_EE($this, $__v) { + $this = $this | 0; + $__v = $__v | 0; + var $0 = 0, $1 = 0, $10 = 0, $11 = 0, $13 = 0, $14 = 0, $16 = 0, $17 = 0, $18 = 0, $3 = 0, $6 = 0; + $0 = HEAP32[$this >> 2] | 0; + $1 = $this + 4 | 0; + $3 = $__v + 4 | 0; + $6 = (HEAP32[$1 >> 2] | 0) - $0 | 0; + $10 = (HEAP32[$3 >> 2] | 0) + (0 - ($6 >> 3) << 3) | 0; + HEAP32[$3 >> 2] = $10; + _memcpy($10 | 0, $0 | 0, $6 | 0) | 0; + $11 = HEAP32[$this >> 2] | 0; + HEAP32[$this >> 2] = HEAP32[$3 >> 2]; + HEAP32[$3 >> 2] = $11; + $13 = $__v + 8 | 0; + $14 = HEAP32[$1 >> 2] | 0; + HEAP32[$1 >> 2] = HEAP32[$13 >> 2]; + HEAP32[$13 >> 2] = $14; + $16 = $this + 8 | 0; + $17 = $__v + 12 | 0; + $18 = HEAP32[$16 >> 2] | 0; + HEAP32[$16 >> 2] = HEAP32[$17 >> 2]; + HEAP32[$17 >> 2] = $18; + HEAP32[$__v >> 2] = HEAP32[$3 >> 2]; + return; +} + +function _setPatternDetectionMode($id, $mode) { + $id = $id | 0; + $mode = $mode | 0; + var $0 = 0, $4 = 0, $vararg_buffer = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = sp + 4 | 0; + HEAP32[$0 >> 2] = $id; + if (__ZNSt3__112__hash_tableINS_17__hash_value_typeIi12arControllerEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE4findIiEENS_15__hash_iteratorIPNS_11__hash_nodeIS3_PvEEEERKT_(2044, $0) | 0) { + $4 = (__ZNSt3__113unordered_mapIi12arControllerNS_4hashIiEENS_8equal_toIiEENS_9allocatorINS_4pairIKiS1_EEEEEixERS8_(2044, $0) | 0) + 212 | 0; + if (!(_arSetPatternDetectionMode(HEAP32[$4 >> 2] | 0, $mode) | 0)) { + HEAP32[$vararg_buffer >> 2] = $mode; + _arLog(1, 6477, $vararg_buffer); + } + } + STACKTOP = sp; + return; +} + +function _getLabelingMode($id) { + $id = $id | 0; + var $0 = 0, $4 = 0, $7 = 0, $labelingMode = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $0 = sp + 4 | 0; + $labelingMode = sp; + HEAP32[$0 >> 2] = $id; + if (!(__ZNSt3__112__hash_tableINS_17__hash_value_typeIi12arControllerEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE4findIiEENS_15__hash_iteratorIPNS_11__hash_nodeIS3_PvEEEERKT_(2044, $0) | 0)) { + STACKTOP = sp; + return -1; + } else { + $4 = (__ZNSt3__113unordered_mapIi12arControllerNS_4hashIiEENS_8equal_toIiEENS_9allocatorINS_4pairIKiS1_EEEEEixERS8_(2044, $0) | 0) + 212 | 0; + $7 = (_arGetLabelingMode(HEAP32[$4 >> 2] | 0, $labelingMode) | 0) == 0; + STACKTOP = sp; + return ($7 ? HEAP32[$labelingMode >> 2] | 0 : -1) | 0; + } + return 0; +} + +function _arMatrixDup($dest, $source) { + $dest = $dest | 0; + $source = $source | 0; + var $$0 = 0, $1 = 0, $11 = 0, $12 = 0, $13 = 0, $14 = 0, $15 = 0, $6 = 0, $c$02 = 0, $r$03 = 0; + $1 = HEAP32[$dest + 4 >> 2] | 0; + if (($1 | 0) == (HEAP32[$source + 4 >> 2] | 0)) { + $6 = HEAP32[$dest + 8 >> 2] | 0; + if (($6 | 0) == (HEAP32[$source + 8 >> 2] | 0)) if (($1 | 0) > 0) { + $11 = ($6 | 0) > 0; + $r$03 = 0; + do { + $12 = Math_imul($6, $r$03) | 0; + if ($11) { + $13 = HEAP32[$source >> 2] | 0; + $14 = HEAP32[$dest >> 2] | 0; + $c$02 = 0; + do { + $15 = $12 + $c$02 | 0; + HEAPF64[$14 + ($15 << 3) >> 3] = +HEAPF64[$13 + ($15 << 3) >> 3]; + $c$02 = $c$02 + 1 | 0; + } while (($c$02 | 0) < ($6 | 0)); + } + $r$03 = $r$03 + 1 | 0; + } while (($r$03 | 0) < ($1 | 0)); + $$0 = 0; + } else $$0 = 0; else $$0 = -1; + } else $$0 = -1; + return $$0 | 0; +} + +function _setThresholdMode($id, $mode) { + $id = $id | 0; + $mode = $mode | 0; + var $0 = 0, $4 = 0, $vararg_buffer = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = sp + 4 | 0; + HEAP32[$0 >> 2] = $id; + if (__ZNSt3__112__hash_tableINS_17__hash_value_typeIi12arControllerEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE4findIiEENS_15__hash_iteratorIPNS_11__hash_nodeIS3_PvEEEERKT_(2044, $0) | 0) { + $4 = (__ZNSt3__113unordered_mapIi12arControllerNS_4hashIiEENS_8equal_toIiEENS_9allocatorINS_4pairIKiS1_EEEEEixERS8_(2044, $0) | 0) + 212 | 0; + if (!(_arSetLabelingThreshMode(HEAP32[$4 >> 2] | 0, $mode) | 0)) { + HEAP32[$vararg_buffer >> 2] = $mode; + _arLog(1, 6589, $vararg_buffer); + } + } + STACKTOP = sp; + return; +} + +function _getPattRatio($id) { + $id = $id | 0; + var $0 = 0, $4 = 0, $5 = 0, $8 = 0, $pattRatio = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $0 = sp + 8 | 0; + $pattRatio = sp; + HEAP32[$0 >> 2] = $id; + if (__ZNSt3__112__hash_tableINS_17__hash_value_typeIi12arControllerEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE4findIiEENS_15__hash_iteratorIPNS_11__hash_nodeIS3_PvEEEERKT_(2044, $0) | 0) { + $4 = (__ZNSt3__113unordered_mapIi12arControllerNS_4hashIiEENS_8equal_toIiEENS_9allocatorINS_4pairIKiS1_EEEEEixERS8_(2044, $0) | 0) + 212 | 0; + $5 = HEAP32[$4 >> 2] | 0; + if ($5) { + $8 = (_arGetPattRatio($5, $pattRatio) | 0) == 0; + STACKTOP = sp; + return +($8 ? +HEAPF64[$pattRatio >> 3] : -1.0); + } + } + STACKTOP = sp; + return -1.0; +} + +function _setImageProcMode($id, $mode) { + $id = $id | 0; + $mode = $mode | 0; + var $0 = 0, $4 = 0, $vararg_buffer = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = sp + 4 | 0; + HEAP32[$0 >> 2] = $id; + if (__ZNSt3__112__hash_tableINS_17__hash_value_typeIi12arControllerEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE4findIiEENS_15__hash_iteratorIPNS_11__hash_nodeIS3_PvEEEERKT_(2044, $0) | 0) { + $4 = (__ZNSt3__113unordered_mapIi12arControllerNS_4hashIiEENS_8equal_toIiEENS_9allocatorINS_4pairIKiS1_EEEEEixERS8_(2044, $0) | 0) + 212 | 0; + if (!(_arSetImageProcMode(HEAP32[$4 >> 2] | 0, $mode) | 0)) { + HEAP32[$vararg_buffer >> 2] = $mode; + _arLog(1, 6646, $vararg_buffer); + } + } + STACKTOP = sp; + return; +} + +function _setLabelingMode($id, $mode) { + $id = $id | 0; + $mode = $mode | 0; + var $0 = 0, $4 = 0, $vararg_buffer = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $0 = sp + 4 | 0; + HEAP32[$0 >> 2] = $id; + if (__ZNSt3__112__hash_tableINS_17__hash_value_typeIi12arControllerEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE4findIiEENS_15__hash_iteratorIPNS_11__hash_nodeIS3_PvEEEERKT_(2044, $0) | 0) { + $4 = (__ZNSt3__113unordered_mapIi12arControllerNS_4hashIiEENS_8equal_toIiEENS_9allocatorINS_4pairIKiS1_EEEEEixERS8_(2044, $0) | 0) + 212 | 0; + if (!(_arSetLabelingMode(HEAP32[$4 >> 2] | 0, $mode) | 0)) { + HEAP32[$vararg_buffer >> 2] = $mode; + _arLog(1, 6543, $vararg_buffer); + } + } + STACKTOP = sp; + return; +} + +function _getThreshold($id) { + $id = $id | 0; + var $0 = 0, $4 = 0, $7 = 0, $threshold = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $0 = sp + 4 | 0; + $threshold = sp; + HEAP32[$0 >> 2] = $id; + if (!(__ZNSt3__112__hash_tableINS_17__hash_value_typeIi12arControllerEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE4findIiEENS_15__hash_iteratorIPNS_11__hash_nodeIS3_PvEEEERKT_(2044, $0) | 0)) { + STACKTOP = sp; + return -1; + } else { + $4 = (__ZNSt3__113unordered_mapIi12arControllerNS_4hashIiEENS_8equal_toIiEENS_9allocatorINS_4pairIKiS1_EEEEEixERS8_(2044, $0) | 0) + 212 | 0; + $7 = (_arGetLabelingThresh(HEAP32[$4 >> 2] | 0, $threshold) | 0) == 0; + STACKTOP = sp; + return ($7 ? HEAP32[$threshold >> 2] | 0 : -1) | 0; + } + return 0; +} + +function __ZN10__cxxabiv112_GLOBAL__N_119parse_cv_qualifiersEPKcS2_Rj($first, $last, $cv) { + $first = $first | 0; + $last = $last | 0; + $cv = $cv | 0; + var $$0 = 0, $$1 = 0, $$2 = 0, $1 = 0, $10 = 0, $12 = 0, $3 = 0, $5 = 0, $6 = 0, $7 = 0, $8 = 0; + HEAP32[$cv >> 2] = 0; + if (($first | 0) == ($last | 0)) $$2 = $first; else { + $1 = HEAP8[$first >> 0] | 0; + if ($1 << 24 >> 24 == 114) { + HEAP32[$cv >> 2] = 4; + $3 = $first + 1 | 0; + $$0 = $3; + $5 = HEAP8[$3 >> 0] | 0; + $7 = 4; + } else { + $$0 = $first; + $5 = $1; + $7 = 0; + } + if ($5 << 24 >> 24 == 86) { + $6 = $7 | 2; + HEAP32[$cv >> 2] = $6; + $8 = $$0 + 1 | 0; + $$1 = $8; + $10 = HEAP8[$8 >> 0] | 0; + $12 = $6; + } else { + $$1 = $$0; + $10 = $5; + $12 = $7; + } + if ($10 << 24 >> 24 == 75) { + HEAP32[$cv >> 2] = $12 | 1; + $$2 = $$1 + 1 | 0; + } else $$2 = $$1; + } + return $$2 | 0; +} + +function _getPatternDetectionMode($id) { + $id = $id | 0; + var $0 = 0, $4 = 0, $7 = 0, $mode = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $0 = sp + 4 | 0; + $mode = sp; + HEAP32[$0 >> 2] = $id; + if (!(__ZNSt3__112__hash_tableINS_17__hash_value_typeIi12arControllerEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE4findIiEENS_15__hash_iteratorIPNS_11__hash_nodeIS3_PvEEEERKT_(2044, $0) | 0)) { + STACKTOP = sp; + return -1; + } else { + $4 = (__ZNSt3__113unordered_mapIi12arControllerNS_4hashIiEENS_8equal_toIiEENS_9allocatorINS_4pairIKiS1_EEEEEixERS8_(2044, $0) | 0) + 212 | 0; + $7 = (_arGetPatternDetectionMode(HEAP32[$4 >> 2] | 0, $mode) | 0) == 0; + STACKTOP = sp; + return ($7 ? HEAP32[$mode >> 2] | 0 : -1) | 0; + } + return 0; +} + +function _strerror($e) { + $e = $e | 0; + var $$lcssa = 0, $9 = 0, $i$03 = 0, $i$03$lcssa = 0, $i$12 = 0, $s$0$lcssa = 0, $s$01 = 0, $s$1 = 0, label = 0; + $i$03 = 0; + while (1) { + if ((HEAPU8[14592 + $i$03 >> 0] | 0) == ($e | 0)) { + $i$03$lcssa = $i$03; + label = 2; + break; + } + $i$03 = $i$03 + 1 | 0; + if (($i$03 | 0) == 87) { + $i$12 = 87; + $s$01 = 14680; + label = 5; + break; + } + } + if ((label | 0) == 2) if (!$i$03$lcssa) $s$0$lcssa = 14680; else { + $i$12 = $i$03$lcssa; + $s$01 = 14680; + label = 5; + } + if ((label | 0) == 5) while (1) { + label = 0; + $s$1 = $s$01; + while (1) { + $9 = $s$1 + 1 | 0; + if (!(HEAP8[$s$1 >> 0] | 0)) { + $$lcssa = $9; + break; + } else $s$1 = $9; + } + $i$12 = $i$12 + -1 | 0; + if (!$i$12) { + $s$0$lcssa = $$lcssa; + break; + } else { + $s$01 = $$lcssa; + label = 5; + } + } + return $s$0$lcssa | 0; +} + +function __ZNSt3__113__lower_boundIRNS_6__lessIjjEEPKjjEET0_S6_S6_RKT1_T_($__first, $__last, $__value_, $__comp) { + $__first = $__first | 0; + $__last = $__last | 0; + $__value_ = $__value_ | 0; + $__comp = $__comp | 0; + var $$0$ph = 0, $$0$ph$lcssa = 0, $$lcssa = 0, $4 = 0, $6 = 0, $__len$0 = 0, $__len$0$lcssa7 = 0, $__len$0$ph = 0; + $4 = HEAP32[$__value_ >> 2] | 0; + $$0$ph = $__first; + $__len$0$ph = $__last - $__first >> 2; + L1 : while (1) { + $__len$0 = $__len$0$ph; + while (1) { + if (!$__len$0) { + $$0$ph$lcssa = $$0$ph; + break L1; + } + $6 = ($__len$0 | 0) / 2 | 0; + if ((HEAP32[$$0$ph + ($6 << 2) >> 2] | 0) >>> 0 < $4 >>> 0) { + $$lcssa = $6; + $__len$0$lcssa7 = $__len$0; + break; + } else $__len$0 = $6; + } + $$0$ph = $$0$ph + ($$lcssa + 1 << 2) | 0; + $__len$0$ph = $__len$0$lcssa7 + -1 - $$lcssa | 0; + } + return $$0$ph$lcssa | 0; +} + +function __ZNSt3__1plIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEENS_12basic_stringIT_T0_T1_EEPKS8_RKSB_($agg$result, $__lhs, $__rhs) { + $agg$result = $agg$result | 0; + $__lhs = $__lhs | 0; + $__rhs = $__rhs | 0; + var $10 = 0, $2 = 0, $3 = 0; + HEAP32[$agg$result >> 2] = 0; + HEAP32[$agg$result + 4 >> 2] = 0; + HEAP32[$agg$result + 8 >> 2] = 0; + $2 = _strlen($__lhs) | 0; + $3 = HEAP8[$__rhs >> 0] | 0; + $10 = ($3 & 1) == 0 ? ($3 & 255) >>> 1 : HEAP32[$__rhs + 4 >> 2] | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcjj($agg$result, $__lhs, $2, $10 + $2 | 0); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($agg$result, (HEAP8[$__rhs >> 0] & 1) == 0 ? $__rhs + 1 | 0 : HEAP32[$__rhs + 8 >> 2] | 0, $10) | 0; + return; +} + +function _frexp($x, $e) { + $x = +$x; + $e = $e | 0; + var $$0 = 0.0, $$01 = 0.0, $0 = 0, $1 = 0, $2 = 0, $4 = 0, $7 = 0.0, $storemerge = 0; + HEAPF64[tempDoublePtr >> 3] = $x; + $0 = HEAP32[tempDoublePtr >> 2] | 0; + $1 = HEAP32[tempDoublePtr + 4 >> 2] | 0; + $2 = _bitshift64Lshr($0 | 0, $1 | 0, 52) | 0; + $4 = $2 & 2047; + switch ($4 | 0) { + case 0: + { + if ($x != 0.0) { + $7 = +_frexp($x * 18446744073709551616.0, $e); + $$01 = $7; + $storemerge = (HEAP32[$e >> 2] | 0) + -64 | 0; + } else { + $$01 = $x; + $storemerge = 0; + } + HEAP32[$e >> 2] = $storemerge; + $$0 = $$01; + break; + } + case 2047: + { + $$0 = $x; + break; + } + default: + { + HEAP32[$e >> 2] = $4 + -1022; + HEAP32[tempDoublePtr >> 2] = $0; + HEAP32[tempDoublePtr + 4 >> 2] = $1 & -2146435073 | 1071644672; + $$0 = +HEAPF64[tempDoublePtr >> 3]; + } + } + return +$$0; +} + +function ___fseeko_unlocked($f, $off, $whence) { + $f = $f | 0; + $off = $off | 0; + $whence = $whence | 0; + var $$0 = 0, $$01 = 0, $11 = 0, $9 = 0, label = 0; + if (($whence | 0) == 1) $$01 = $off - (HEAP32[$f + 8 >> 2] | 0) + (HEAP32[$f + 4 >> 2] | 0) | 0; else $$01 = $off; + $9 = $f + 20 | 0; + $11 = $f + 28 | 0; + if ((HEAP32[$9 >> 2] | 0) >>> 0 > (HEAP32[$11 >> 2] | 0) >>> 0) { + FUNCTION_TABLE_iiii[HEAP32[$f + 36 >> 2] & 15]($f, 0, 0) | 0; + if (!(HEAP32[$9 >> 2] | 0)) $$0 = -1; else label = 5; + } else label = 5; + if ((label | 0) == 5) { + HEAP32[$f + 16 >> 2] = 0; + HEAP32[$11 >> 2] = 0; + HEAP32[$9 >> 2] = 0; + if ((FUNCTION_TABLE_iiii[HEAP32[$f + 40 >> 2] & 15]($f, $$01, $whence) | 0) < 0) $$0 = -1; else { + HEAP32[$f + 8 >> 2] = 0; + HEAP32[$f + 4 >> 2] = 0; + HEAP32[$f >> 2] = HEAP32[$f >> 2] & -17; + $$0 = 0; + } + } + return $$0 | 0; +} + +function __ZNSt3__1plIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEENS_12basic_stringIT_T0_T1_EERKSB_PKS8_($agg$result, $__lhs, $__rhs) { + $agg$result = $agg$result | 0; + $__lhs = $__lhs | 0; + $__rhs = $__rhs | 0; + var $10 = 0, $2 = 0, $4 = 0, $9 = 0; + HEAP32[$agg$result >> 2] = 0; + HEAP32[$agg$result + 4 >> 2] = 0; + HEAP32[$agg$result + 8 >> 2] = 0; + $2 = HEAP8[$__lhs >> 0] | 0; + $4 = ($2 & 1) == 0; + $9 = $4 ? ($2 & 255) >>> 1 : HEAP32[$__lhs + 4 >> 2] | 0; + $10 = _strlen($__rhs) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcjj($agg$result, $4 ? $__lhs + 1 | 0 : HEAP32[$__lhs + 8 >> 2] | 0, $9, $9 + $10 | 0); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($agg$result, $__rhs, $10) | 0; + return; +} + +function _icpGetU_from_X_by_MatX2U($u, $matX2U, $coord3d) { + $u = $u | 0; + $matX2U = $matX2U | 0; + $coord3d = $coord3d | 0; + var $$0 = 0, $0 = 0.0, $18 = 0.0, $2 = 0.0, $33 = 0.0, $4 = 0.0; + $0 = +HEAPF64[$coord3d >> 3]; + $2 = +HEAPF64[$coord3d + 8 >> 3]; + $4 = +HEAPF64[$coord3d + 16 >> 3]; + $18 = +HEAPF64[$matX2U + 88 >> 3] + ($0 * +HEAPF64[$matX2U + 64 >> 3] + $2 * +HEAPF64[$matX2U + 72 >> 3] + $4 * +HEAPF64[$matX2U + 80 >> 3]); + if ($18 == 0.0) $$0 = -1; else { + $33 = +HEAPF64[$matX2U + 56 >> 3] + ($0 * +HEAPF64[$matX2U + 32 >> 3] + $2 * +HEAPF64[$matX2U + 40 >> 3] + $4 * +HEAPF64[$matX2U + 48 >> 3]); + HEAPF64[$u >> 3] = (+HEAPF64[$matX2U + 24 >> 3] + ($0 * +HEAPF64[$matX2U >> 3] + $2 * +HEAPF64[$matX2U + 8 >> 3] + $4 * +HEAPF64[$matX2U + 16 >> 3])) / $18; + HEAPF64[$u + 8 >> 3] = $33 / $18; + $$0 = 0; + } + return $$0 | 0; +} + +function __ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEEC2EjRKS3_RKS5_($this, $__x, $__a) { + $this = $this | 0; + $__x = $__x | 0; + $__a = $__a | 0; + var $0 = 0, $2 = 0, $5 = 0; + HEAP32[$this >> 2] = 0; + $0 = $this + 4 | 0; + HEAP32[$0 >> 2] = 0; + $2 = HEAP32[$__a >> 2] | 0; + HEAP32[$this + 8 >> 2] = 0; + HEAP32[$this + 12 >> 2] = $2; + $5 = __ZN10__cxxabiv112_GLOBAL__N_15arenaILj4096EE8allocateEj($2, 24) | 0; + HEAP32[$0 >> 2] = $5; + HEAP32[$this >> 2] = $5; + HEAP32[$this + 8 >> 2] = $5 + 24; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEC2ERKS7_($5, $__x); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEC2ERKS7_($5 + 12 | 0, $__x + 12 | 0); + HEAP32[$0 >> 2] = (HEAP32[$0 >> 2] | 0) + 24; + return; +} + +function _getMatrixCodeType($id) { + $id = $id | 0; + var $$0 = 0, $0 = 0, $4 = 0, $matrixType = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $0 = sp + 4 | 0; + $matrixType = sp; + HEAP32[$0 >> 2] = $id; + if (!(__ZNSt3__112__hash_tableINS_17__hash_value_typeIi12arControllerEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE4findIiEENS_15__hash_iteratorIPNS_11__hash_nodeIS3_PvEEEERKT_(2044, $0) | 0)) $$0 = -1; else { + $4 = (__ZNSt3__113unordered_mapIi12arControllerNS_4hashIiEENS_8equal_toIiEENS_9allocatorINS_4pairIKiS1_EEEEEixERS8_(2044, $0) | 0) + 212 | 0; + _arGetMatrixCodeType(HEAP32[$4 >> 2] | 0, $matrixType) | 0; + $$0 = HEAP32[$matrixType >> 2] | 0; + } + STACKTOP = sp; + return $$0 | 0; +} + +function __ZN10__cxxabiv112_GLOBAL__N_112parse_numberEPKcS2_($first, $last) { + $first = $first | 0; + $last = $last | 0; + var $$0 = 0, $$1 = 0, $$first = 0, $5 = 0, $t$0$pn = 0; + L1 : do if (($first | 0) == ($last | 0)) $$1 = $first; else { + $$first = (HEAP8[$first >> 0] | 0) == 110 ? $first + 1 | 0 : $first; + if (($$first | 0) == ($last | 0)) $$1 = $first; else { + $5 = HEAP8[$$first >> 0] | 0; + if ($5 << 24 >> 24 == 48) { + $$1 = $$first + 1 | 0; + break; + } + if (($5 + -49 & 255) < 9) { + $t$0$pn = $$first; + while (1) { + $$0 = $t$0$pn + 1 | 0; + if (($$0 | 0) == ($last | 0)) { + $$1 = $last; + break L1; + } + if (((HEAP8[$$0 >> 0] | 0) + -48 | 0) >>> 0 < 10) $t$0$pn = $$0; else { + $$1 = $$0; + break; + } + } + } else $$1 = $first; + } + } while (0); + return $$1 | 0; +} + +function __ZNSt3__114__split_bufferINS_6vectorINS1_IN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEENS5_IS7_Lj4096EEEEERNS5_IS9_Lj4096EEEED2Ev($this) { + $this = $this | 0; + var $1 = 0, $2 = 0, $3 = 0, $5 = 0, $6 = 0, $9 = 0; + $1 = HEAP32[$this + 4 >> 2] | 0; + $2 = $this + 8 | 0; + $3 = HEAP32[$2 >> 2] | 0; + if (($3 | 0) != ($1 | 0)) { + $6 = $3; + do { + $5 = $6 + -16 | 0; + HEAP32[$2 >> 2] = $5; + __ZNSt3__113__vector_baseINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEENS5_IS7_Lj4096EEEED2Ev($5); + $6 = HEAP32[$2 >> 2] | 0; + } while (($6 | 0) != ($1 | 0)); + } + $9 = HEAP32[$this >> 2] | 0; + if ($9) __ZN10__cxxabiv112_GLOBAL__N_15arenaILj4096EE10deallocateEPcj(HEAP32[HEAP32[$this + 16 >> 2] >> 2] | 0, $9, (HEAP32[$this + 12 >> 2] | 0) - $9 | 0); + return; +} + +function __ZNSt3__113__vector_baseINS_6vectorINS1_IN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEENS5_IS7_Lj4096EEEEENS5_IS9_Lj4096EEEED2Ev($this) { + $this = $this | 0; + var $0 = 0, $2 = 0, $3 = 0, $5 = 0, $6 = 0, $9 = 0; + $0 = HEAP32[$this >> 2] | 0; + if ($0) { + $2 = $this + 4 | 0; + $3 = HEAP32[$2 >> 2] | 0; + if (($3 | 0) != ($0 | 0)) { + $6 = $3; + do { + $5 = $6 + -16 | 0; + HEAP32[$2 >> 2] = $5; + __ZNSt3__113__vector_baseINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEENS5_IS7_Lj4096EEEED2Ev($5); + $6 = HEAP32[$2 >> 2] | 0; + } while (($6 | 0) != ($0 | 0)); + } + $9 = HEAP32[$this >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_15arenaILj4096EE10deallocateEPcj(HEAP32[$this + 12 >> 2] | 0, $9, (HEAP32[$this + 8 >> 2] | 0) - $9 | 0); + } + return; +} + +function _getDebugMode($id) { + $id = $id | 0; + var $$0 = 0, $0 = 0, $4 = 0, $enable = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $0 = sp + 4 | 0; + $enable = sp; + HEAP32[$0 >> 2] = $id; + if (!(__ZNSt3__112__hash_tableINS_17__hash_value_typeIi12arControllerEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE4findIiEENS_15__hash_iteratorIPNS_11__hash_nodeIS3_PvEEEERKT_(2044, $0) | 0)) $$0 = 0; else { + $4 = (__ZNSt3__113unordered_mapIi12arControllerNS_4hashIiEENS_8equal_toIiEENS_9allocatorINS_4pairIKiS1_EEEEEixERS8_(2044, $0) | 0) + 212 | 0; + _arGetDebugMode(HEAP32[$4 >> 2] | 0, $enable) | 0; + $$0 = HEAP32[$enable >> 2] | 0; + } + STACKTOP = sp; + return $$0 | 0; +} + +function _realloc($oldmem, $bytes) { + $oldmem = $oldmem | 0; + $bytes = $bytes | 0; + var $12 = 0, $15 = 0, $20 = 0, $3 = 0, $9 = 0, $mem$0 = 0; + if (!$oldmem) { + $mem$0 = _malloc($bytes) | 0; + return $mem$0 | 0; + } + if ($bytes >>> 0 > 4294967231) { + $3 = ___errno_location() | 0; + HEAP32[$3 >> 2] = 12; + $mem$0 = 0; + return $mem$0 | 0; + } + $9 = _try_realloc_chunk($oldmem + -8 | 0, $bytes >>> 0 < 11 ? 16 : $bytes + 11 & -8) | 0; + if ($9) { + $mem$0 = $9 + 8 | 0; + return $mem$0 | 0; + } + $12 = _malloc($bytes) | 0; + if (!$12) { + $mem$0 = 0; + return $mem$0 | 0; + } + $15 = HEAP32[$oldmem + -4 >> 2] | 0; + $20 = ($15 & -8) - (($15 & 3 | 0) == 0 ? 8 : 4) | 0; + _memcpy($12 | 0, $oldmem | 0, ($20 >>> 0 < $bytes >>> 0 ? $20 : $bytes) | 0) | 0; + _free($oldmem); + $mem$0 = $12; + return $mem$0 | 0; +} + +function _arSetDebugMode($handle, $mode) { + $handle = $handle | 0; + $mode = $mode | 0; + var $$0 = 0, $11 = 0, $4 = 0, $vararg_buffer = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + do if (!$handle) $$0 = -1; else if ((HEAP32[$handle >> 2] | 0) == ($mode | 0)) $$0 = 0; else { + HEAP32[$handle >> 2] = $mode; + if (!$mode) { + $4 = $handle + 4834148 | 0; + _free(HEAP32[$4 >> 2] | 0); + HEAP32[$4 >> 2] = 0; + $$0 = 0; + break; + } + $11 = _malloc(Math_imul(HEAP32[$handle + 40 >> 2] | 0, HEAP32[$handle + 36 >> 2] | 0) | 0) | 0; + HEAP32[$handle + 4834148 >> 2] = $11; + if (!$11) { + _arLog(3, 5471, $vararg_buffer); + _exit(1); + } else $$0 = 0; + } while (0); + STACKTOP = sp; + return $$0 | 0; +} + +function _vasprintf($s, $fmt, $ap) { + $s = $s | 0; + $fmt = $fmt | 0; + $ap = $ap | 0; + var $$0 = 0, $0 = 0, $10 = 0, $2 = 0, $5 = 0, $9 = 0, $ap2 = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $ap2 = sp; + $0 = _malloc(240) | 0; + do if (!$0) $$0 = -1; else { + HEAP32[$ap2 >> 2] = HEAP32[$ap >> 2]; + $2 = _vsnprintf($0, 240, $fmt, $ap2) | 0; + if ($2 >>> 0 < 240) { + $5 = _realloc($0, $2 + 1 | 0) | 0; + HEAP32[$s >> 2] = ($5 | 0) != 0 ? $5 : $0; + $$0 = $2; + break; + } + _free($0); + if (($2 | 0) < 0) $$0 = -1; else { + $9 = $2 + 1 | 0; + $10 = _malloc($9) | 0; + HEAP32[$s >> 2] = $10; + if (!$10) $$0 = -1; else $$0 = _vsnprintf($10, $9, $fmt, $ap) | 0; + } + } while (0); + STACKTOP = sp; + return $$0 | 0; +} + +function _icpCreateHandle($matXc2U) { + $matXc2U = $matXc2U | 0; + var $$0 = 0, $0 = 0, $j$04 = 0; + $0 = _malloc(136) | 0; + if (!$0) $$0 = 0; else { + $j$04 = 0; + do { + HEAPF64[$0 + ($j$04 << 5) >> 3] = +HEAPF64[$matXc2U + ($j$04 << 5) >> 3]; + HEAPF64[$0 + ($j$04 << 5) + 8 >> 3] = +HEAPF64[$matXc2U + ($j$04 << 5) + 8 >> 3]; + HEAPF64[$0 + ($j$04 << 5) + 16 >> 3] = +HEAPF64[$matXc2U + ($j$04 << 5) + 16 >> 3]; + HEAPF64[$0 + ($j$04 << 5) + 24 >> 3] = +HEAPF64[$matXc2U + ($j$04 << 5) + 24 >> 3]; + $j$04 = $j$04 + 1 | 0; + } while (($j$04 | 0) != 3); + HEAP32[$0 + 96 >> 2] = 10; + HEAPF64[$0 + 104 >> 3] = .10000000149011612; + HEAPF64[$0 + 112 >> 3] = .9900000095367432; + HEAPF64[$0 + 120 >> 3] = 4.0; + HEAPF64[$0 + 128 >> 3] = .5; + $$0 = $0; + } + return $$0 | 0; +} + +function __ZNSt3__114__split_bufferINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEERNS5_IS7_Lj4096EEEED2Ev($this) { + $this = $this | 0; + var $1 = 0, $2 = 0, $3 = 0, $5 = 0, $6 = 0, $9 = 0; + $1 = HEAP32[$this + 4 >> 2] | 0; + $2 = $this + 8 | 0; + $3 = HEAP32[$2 >> 2] | 0; + if (($3 | 0) != ($1 | 0)) { + $6 = $3; + do { + $5 = $6 + -16 | 0; + HEAP32[$2 >> 2] = $5; + __ZNSt3__113__vector_baseIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEED2Ev($5); + $6 = HEAP32[$2 >> 2] | 0; + } while (($6 | 0) != ($1 | 0)); + } + $9 = HEAP32[$this >> 2] | 0; + if ($9) __ZN10__cxxabiv112_GLOBAL__N_15arenaILj4096EE10deallocateEPcj(HEAP32[HEAP32[$this + 16 >> 2] >> 2] | 0, $9, (HEAP32[$this + 12 >> 2] | 0) - $9 | 0); + return; +} + +function __ZNSt3__113__vector_baseINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEENS5_IS7_Lj4096EEEED2Ev($this) { + $this = $this | 0; + var $0 = 0, $2 = 0, $3 = 0, $5 = 0, $6 = 0, $9 = 0; + $0 = HEAP32[$this >> 2] | 0; + if ($0) { + $2 = $this + 4 | 0; + $3 = HEAP32[$2 >> 2] | 0; + if (($3 | 0) != ($0 | 0)) { + $6 = $3; + do { + $5 = $6 + -16 | 0; + HEAP32[$2 >> 2] = $5; + __ZNSt3__113__vector_baseIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEED2Ev($5); + $6 = HEAP32[$2 >> 2] | 0; + } while (($6 | 0) != ($0 | 0)); + } + $9 = HEAP32[$this >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_15arenaILj4096EE10deallocateEPcj(HEAP32[$this + 12 >> 2] | 0, $9, (HEAP32[$this + 8 >> 2] | 0) - $9 | 0); + } + return; +} + +function __ZNK10__cxxabiv122__base_class_type_info16search_above_dstEPNS_19__dynamic_cast_infoEPKvS4_ib($this, $info, $dst_ptr, $current_ptr, $path_below, $use_strcmp) { + $this = $this | 0; + $info = $info | 0; + $dst_ptr = $dst_ptr | 0; + $current_ptr = $current_ptr | 0; + $path_below = $path_below | 0; + $use_strcmp = $use_strcmp | 0; + var $1 = 0, $2 = 0, $8 = 0, $offset_to_base$0 = 0; + $1 = HEAP32[$this + 4 >> 2] | 0; + $2 = $1 >> 8; + if (!($1 & 1)) $offset_to_base$0 = $2; else $offset_to_base$0 = HEAP32[(HEAP32[$current_ptr >> 2] | 0) + $2 >> 2] | 0; + $8 = HEAP32[$this >> 2] | 0; + FUNCTION_TABLE_viiiiii[HEAP32[(HEAP32[$8 >> 2] | 0) + 20 >> 2] & 3]($8, $info, $dst_ptr, $current_ptr + $offset_to_base$0 | 0, ($1 & 2 | 0) != 0 ? $path_below : 2, $use_strcmp); + return; +} + +function _setProjectionNearPlane($id, $projectionNearPlane) { + $id = $id | 0; + $projectionNearPlane = +$projectionNearPlane; + var $0 = 0, $4 = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $0 = sp; + HEAP32[$0 >> 2] = $id; + if (__ZNSt3__112__hash_tableINS_17__hash_value_typeIi12arControllerEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE4findIiEENS_15__hash_iteratorIPNS_11__hash_nodeIS3_PvEEEERKT_(2044, $0) | 0) { + $4 = (__ZNSt3__113unordered_mapIi12arControllerNS_4hashIiEENS_8equal_toIiEENS_9allocatorINS_4pairIKiS1_EEEEEixERS8_(2044, $0) | 0) + 232 | 0; + HEAPF64[$4 >> 3] = $projectionNearPlane; + } + STACKTOP = sp; + return; +} + +function _detectMarker($id) { + $id = $id | 0; + var $$0 = 0, $0 = 0, $4 = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $0 = sp; + HEAP32[$0 >> 2] = $id; + if (!(__ZNSt3__112__hash_tableINS_17__hash_value_typeIi12arControllerEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE4findIiEENS_15__hash_iteratorIPNS_11__hash_nodeIS3_PvEEEERKT_(2044, $0) | 0)) $$0 = HEAP32[522] | 0; else { + $4 = __ZNSt3__113unordered_mapIi12arControllerNS_4hashIiEENS_8equal_toIiEENS_9allocatorINS_4pairIKiS1_EEEEEixERS8_(2044, $0) | 0; + $$0 = _arDetectMarker(HEAP32[$4 + 212 >> 2] | 0, HEAP32[$4 + 196 >> 2] | 0) | 0; + } + STACKTOP = sp; + return $$0 | 0; +} + +function __ZNK10__cxxabiv117__class_type_info24process_found_base_classEPNS_19__dynamic_cast_infoEPvi($this, $info, $adjustedPtr, $path_below) { + $this = $this | 0; + $info = $info | 0; + $adjustedPtr = $adjustedPtr | 0; + $path_below = $path_below | 0; + var $0 = 0, $1 = 0, $6 = 0, $9 = 0; + $0 = $info + 16 | 0; + $1 = HEAP32[$0 >> 2] | 0; + do if (!$1) { + HEAP32[$0 >> 2] = $adjustedPtr; + HEAP32[$info + 24 >> 2] = $path_below; + HEAP32[$info + 36 >> 2] = 1; + } else { + if (($1 | 0) != ($adjustedPtr | 0)) { + $9 = $info + 36 | 0; + HEAP32[$9 >> 2] = (HEAP32[$9 >> 2] | 0) + 1; + HEAP32[$info + 24 >> 2] = 2; + HEAP8[$info + 54 >> 0] = 1; + break; + } + $6 = $info + 24 | 0; + if ((HEAP32[$6 >> 2] | 0) == 2) HEAP32[$6 >> 2] = $path_below; + } while (0); + return; +} + +function _setProjectionFarPlane($id, $projectionFarPlane) { + $id = $id | 0; + $projectionFarPlane = +$projectionFarPlane; + var $0 = 0, $4 = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $0 = sp; + HEAP32[$0 >> 2] = $id; + if (__ZNSt3__112__hash_tableINS_17__hash_value_typeIi12arControllerEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE4findIiEENS_15__hash_iteratorIPNS_11__hash_nodeIS3_PvEEEERKT_(2044, $0) | 0) { + $4 = (__ZNSt3__113unordered_mapIi12arControllerNS_4hashIiEENS_8equal_toIiEENS_9allocatorINS_4pairIKiS1_EEEEEixERS8_(2044, $0) | 0) + 240 | 0; + HEAPF64[$4 >> 3] = $projectionFarPlane; + } + STACKTOP = sp; + return; +} + +function _arParamObserv2IdealLTf($paramLTf, $ox, $oy, $ix, $iy) { + $paramLTf = $paramLTf | 0; + $ox = +$ox; + $oy = +$oy; + $ix = $ix | 0; + $iy = $iy | 0; + var $$0 = 0, $12 = 0, $19 = 0, $22 = 0, $4 = 0, $9 = 0; + $4 = (HEAP32[$paramLTf + 16 >> 2] | 0) + ~~($ox + .5) | 0; + $9 = (HEAP32[$paramLTf + 20 >> 2] | 0) + ~~($oy + .5) | 0; + if (($4 | 0) < 0) $$0 = -1; else { + $12 = HEAP32[$paramLTf + 8 >> 2] | 0; + if (($9 | 0) < 0 | ($4 | 0) >= ($12 | 0)) $$0 = -1; else if (($9 | 0) < (HEAP32[$paramLTf + 12 >> 2] | 0)) { + $19 = HEAP32[$paramLTf + 4 >> 2] | 0; + $22 = (Math_imul($12, $9) | 0) + $4 << 1; + HEAP32[$ix >> 2] = HEAP32[$19 + ($22 << 2) >> 2]; + HEAP32[$iy >> 2] = HEAP32[$19 + (($22 | 1) << 2) >> 2]; + $$0 = 0; + } else $$0 = -1; + } + return $$0 | 0; +} + +function _arParamIdeal2ObservLTf($paramLTf, $ix, $iy, $ox, $oy) { + $paramLTf = $paramLTf | 0; + $ix = +$ix; + $iy = +$iy; + $ox = $ox | 0; + $oy = $oy | 0; + var $$0 = 0, $12 = 0, $18 = 0, $21 = 0, $4 = 0, $9 = 0; + $4 = (HEAP32[$paramLTf + 16 >> 2] | 0) + ~~($ix + .5) | 0; + $9 = (HEAP32[$paramLTf + 20 >> 2] | 0) + ~~($iy + .5) | 0; + if (($4 | 0) < 0) $$0 = -1; else { + $12 = HEAP32[$paramLTf + 8 >> 2] | 0; + if (($9 | 0) < 0 | ($4 | 0) >= ($12 | 0)) $$0 = -1; else if (($9 | 0) < (HEAP32[$paramLTf + 12 >> 2] | 0)) { + $18 = HEAP32[$paramLTf >> 2] | 0; + $21 = (Math_imul($12, $9) | 0) + $4 << 1; + HEAP32[$ox >> 2] = HEAP32[$18 + ($21 << 2) >> 2]; + HEAP32[$oy >> 2] = HEAP32[$18 + (($21 | 1) << 2) >> 2]; + $$0 = 0; + } else $$0 = -1; + } + return $$0 | 0; +} + +function _arUtilMatMul($s1, $s2, $d) { + $s1 = $s1 | 0; + $s2 = $s2 | 0; + $d = $d | 0; + var $0 = 0, $1 = 0, $2 = 0, $21 = 0, $i$02 = 0, $j$03 = 0; + $j$03 = 0; + do { + $0 = $s1 + ($j$03 << 5) | 0; + $1 = $s1 + ($j$03 << 5) + 8 | 0; + $2 = $s1 + ($j$03 << 5) + 16 | 0; + $i$02 = 0; + do { + HEAPF64[$d + ($j$03 << 5) + ($i$02 << 3) >> 3] = +HEAPF64[$0 >> 3] * +HEAPF64[$s2 + ($i$02 << 3) >> 3] + +HEAPF64[$1 >> 3] * +HEAPF64[$s2 + 32 + ($i$02 << 3) >> 3] + +HEAPF64[$2 >> 3] * +HEAPF64[$s2 + 64 + ($i$02 << 3) >> 3]; + $i$02 = $i$02 + 1 | 0; + } while (($i$02 | 0) != 4); + $21 = $d + ($j$03 << 5) + 24 | 0; + HEAPF64[$21 >> 3] = +HEAPF64[$s1 + ($j$03 << 5) + 24 >> 3] + +HEAPF64[$21 >> 3]; + $j$03 = $j$03 + 1 | 0; + } while (($j$03 | 0) != 3); + return 0; +} + +function _getMultiMarkerCount($id) { + $id = $id | 0; + var $$0 = 0, $0 = 0, $3 = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $0 = sp; + HEAP32[$0 >> 2] = $id; + if (!(__ZNSt3__112__hash_tableINS_17__hash_value_typeIi12arControllerEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE4findIiEENS_15__hash_iteratorIPNS_11__hash_nodeIS3_PvEEEERKT_(2044, $0) | 0)) $$0 = -1; else { + $3 = __ZNSt3__113unordered_mapIi12arControllerNS_4hashIiEENS_8equal_toIiEENS_9allocatorINS_4pairIKiS1_EEEEEixERS8_(2044, $0) | 0; + $$0 = (HEAP32[$3 + 252 >> 2] | 0) - (HEAP32[$3 + 248 >> 2] | 0) >> 3; + } + STACKTOP = sp; + return $$0 | 0; +} + +function _getMarkerNum($id) { + $id = $id | 0; + var $$0$in = 0, $0 = 0, $4 = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $0 = sp; + HEAP32[$0 >> 2] = $id; + if (!(__ZNSt3__112__hash_tableINS_17__hash_value_typeIi12arControllerEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE4findIiEENS_15__hash_iteratorIPNS_11__hash_nodeIS3_PvEEEERKT_(2044, $0) | 0)) $$0$in = 2088; else { + $4 = (__ZNSt3__113unordered_mapIi12arControllerNS_4hashIiEENS_8equal_toIiEENS_9allocatorINS_4pairIKiS1_EEEEEixERS8_(2044, $0) | 0) + 212 | 0; + $$0$in = (HEAP32[$4 >> 2] | 0) + 44 | 0; + } + STACKTOP = sp; + return HEAP32[$$0$in >> 2] | 0; +} + +function _getProcessingImage($id) { + $id = $id | 0; + var $$0 = 0, $0 = 0, $4 = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $0 = sp; + HEAP32[$0 >> 2] = $id; + if (!(__ZNSt3__112__hash_tableINS_17__hash_value_typeIi12arControllerEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE4findIiEENS_15__hash_iteratorIPNS_11__hash_nodeIS3_PvEEEERKT_(2044, $0) | 0)) $$0 = 0; else { + $4 = (__ZNSt3__113unordered_mapIi12arControllerNS_4hashIiEENS_8equal_toIiEENS_9allocatorINS_4pairIKiS1_EEEEEixERS8_(2044, $0) | 0) + 212 | 0; + $$0 = HEAP32[(HEAP32[$4 >> 2] | 0) + 4834148 >> 2] | 0; + } + STACKTOP = sp; + return $$0 | 0; +} + +function ___fflush_unlocked($f) { + $f = $f | 0; + var $$0 = 0, $0 = 0, $10 = 0, $11 = 0, $12 = 0, $2 = 0, $9 = 0, label = 0; + $0 = $f + 20 | 0; + $2 = $f + 28 | 0; + if ((HEAP32[$0 >> 2] | 0) >>> 0 > (HEAP32[$2 >> 2] | 0) >>> 0) { + FUNCTION_TABLE_iiii[HEAP32[$f + 36 >> 2] & 15]($f, 0, 0) | 0; + if (!(HEAP32[$0 >> 2] | 0)) $$0 = -1; else label = 3; + } else label = 3; + if ((label | 0) == 3) { + $9 = $f + 4 | 0; + $10 = HEAP32[$9 >> 2] | 0; + $11 = $f + 8 | 0; + $12 = HEAP32[$11 >> 2] | 0; + if ($10 >>> 0 < $12 >>> 0) FUNCTION_TABLE_iiii[HEAP32[$f + 40 >> 2] & 15]($f, $10 - $12 | 0, 1) | 0; + HEAP32[$f + 16 >> 2] = 0; + HEAP32[$2 >> 2] = 0; + HEAP32[$0 >> 2] = 0; + HEAP32[$11 >> 2] = 0; + HEAP32[$9 >> 2] = 0; + $$0 = 0; + } + return $$0 | 0; +} + +function ___divdi3($a$0, $a$1, $b$0, $b$1) { + $a$0 = $a$0 | 0; + $a$1 = $a$1 | 0; + $b$0 = $b$0 | 0; + $b$1 = $b$1 | 0; + var $1$0 = 0, $1$1 = 0, $2$0 = 0, $2$1 = 0, $4$0 = 0, $4$1 = 0, $7$0 = 0, $7$1 = 0; + $1$0 = $a$1 >> 31 | (($a$1 | 0) < 0 ? -1 : 0) << 1; + $1$1 = (($a$1 | 0) < 0 ? -1 : 0) >> 31 | (($a$1 | 0) < 0 ? -1 : 0) << 1; + $2$0 = $b$1 >> 31 | (($b$1 | 0) < 0 ? -1 : 0) << 1; + $2$1 = (($b$1 | 0) < 0 ? -1 : 0) >> 31 | (($b$1 | 0) < 0 ? -1 : 0) << 1; + $4$0 = _i64Subtract($1$0 ^ $a$0, $1$1 ^ $a$1, $1$0, $1$1) | 0; + $4$1 = tempRet0; + $7$0 = $2$0 ^ $1$0; + $7$1 = $2$1 ^ $1$1; + return _i64Subtract((___udivmoddi4($4$0, $4$1, _i64Subtract($2$0 ^ $b$0, $2$1 ^ $b$1, $2$0, $2$1) | 0, tempRet0, 0) | 0) ^ $7$0, tempRet0 ^ $7$1, $7$0, $7$1) | 0; +} + +function _setMatrixCodeType($id, $type) { + $id = $id | 0; + $type = $type | 0; + var $0 = 0, $4 = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $0 = sp; + HEAP32[$0 >> 2] = $id; + if (__ZNSt3__112__hash_tableINS_17__hash_value_typeIi12arControllerEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE4findIiEENS_15__hash_iteratorIPNS_11__hash_nodeIS3_PvEEEERKT_(2044, $0) | 0) { + $4 = (__ZNSt3__113unordered_mapIi12arControllerNS_4hashIiEENS_8equal_toIiEENS_9allocatorINS_4pairIKiS1_EEEEEixERS8_(2044, $0) | 0) + 212 | 0; + _arSetMatrixCodeType(HEAP32[$4 >> 2] | 0, $type) | 0; + } + STACKTOP = sp; + return; +} + +function __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcjj($this, $__s, $__sz, $__reserve) { + $this = $this | 0; + $__s = $__s | 0; + $__sz = $__sz | 0; + $__reserve = $__reserve | 0; + var $6 = 0, $7 = 0, $__p$0 = 0; + if ($__reserve >>> 0 > 4294967279) __ZNKSt3__121__basic_string_commonILb1EE20__throw_length_errorEv($this); + if ($__reserve >>> 0 < 11) { + HEAP8[$this >> 0] = $__sz << 1; + $__p$0 = $this + 1 | 0; + } else { + $6 = $__reserve + 16 & -16; + $7 = _malloc($6) | 0; + HEAP32[$this + 8 >> 2] = $7; + HEAP32[$this >> 2] = $6 | 1; + HEAP32[$this + 4 >> 2] = $__sz; + $__p$0 = $7; + } + _memcpy($__p$0 | 0, $__s | 0, $__sz | 0) | 0; + HEAP8[$__p$0 + $__sz >> 0] = 0; + return; +} + +function __ZNK10__cxxabiv120__si_class_type_info16search_above_dstEPNS_19__dynamic_cast_infoEPKvS4_ib($this, $info, $dst_ptr, $current_ptr, $path_below, $use_strcmp) { + $this = $this | 0; + $info = $info | 0; + $dst_ptr = $dst_ptr | 0; + $current_ptr = $current_ptr | 0; + $path_below = $path_below | 0; + $use_strcmp = $use_strcmp | 0; + var $4 = 0; + if (($this | 0) == (HEAP32[$info + 8 >> 2] | 0)) __ZNK10__cxxabiv117__class_type_info29process_static_type_above_dstEPNS_19__dynamic_cast_infoEPKvS4_i(0, $info, $dst_ptr, $current_ptr, $path_below); else { + $4 = HEAP32[$this + 8 >> 2] | 0; + FUNCTION_TABLE_viiiiii[HEAP32[(HEAP32[$4 >> 2] | 0) + 20 >> 2] & 3]($4, $info, $dst_ptr, $current_ptr, $path_below, $use_strcmp); + } + return; +} + +function _strtok($s, $sep) { + $s = $s | 0; + $sep = $sep | 0; + var $$0 = 0, $$01 = 0, $$sum = 0, $1 = 0, $3 = 0, $4 = 0, $8 = 0, label = 0; + if (!$s) { + $1 = HEAP32[699] | 0; + if (!$1) $$0 = 0; else { + $$01 = $1; + label = 3; + } + } else { + $$01 = $s; + label = 3; + } + do if ((label | 0) == 3) { + $3 = _strspn($$01, $sep) | 0; + $4 = $$01 + $3 | 0; + if (!(HEAP8[$4 >> 0] | 0)) { + HEAP32[699] = 0; + $$0 = 0; + break; + } + $$sum = (_strcspn($4, $sep) | 0) + $3 | 0; + $8 = $$01 + $$sum | 0; + HEAP32[699] = $8; + if (!(HEAP8[$8 >> 0] | 0)) { + HEAP32[699] = 0; + $$0 = $4; + break; + } else { + HEAP32[699] = $$01 + ($$sum + 1); + HEAP8[$8 >> 0] = 0; + $$0 = $4; + break; + } + } while (0); + return $$0 | 0; +} + +function __ZNK10__cxxabiv122__base_class_type_info16search_below_dstEPNS_19__dynamic_cast_infoEPKvib($this, $info, $current_ptr, $path_below, $use_strcmp) { + $this = $this | 0; + $info = $info | 0; + $current_ptr = $current_ptr | 0; + $path_below = $path_below | 0; + $use_strcmp = $use_strcmp | 0; + var $1 = 0, $2 = 0, $8 = 0, $offset_to_base$0 = 0; + $1 = HEAP32[$this + 4 >> 2] | 0; + $2 = $1 >> 8; + if (!($1 & 1)) $offset_to_base$0 = $2; else $offset_to_base$0 = HEAP32[(HEAP32[$current_ptr >> 2] | 0) + $2 >> 2] | 0; + $8 = HEAP32[$this >> 2] | 0; + FUNCTION_TABLE_viiiii[HEAP32[(HEAP32[$8 >> 2] | 0) + 24 >> 2] & 3]($8, $info, $current_ptr + $offset_to_base$0 | 0, ($1 & 2 | 0) != 0 ? $path_below : 2, $use_strcmp); + return; +} + +function _getProjectionNearPlane($id) { + $id = $id | 0; + var $$0 = 0.0, $0 = 0, $4 = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $0 = sp; + HEAP32[$0 >> 2] = $id; + if (!(__ZNSt3__112__hash_tableINS_17__hash_value_typeIi12arControllerEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE4findIiEENS_15__hash_iteratorIPNS_11__hash_nodeIS3_PvEEEERKT_(2044, $0) | 0)) $$0 = -1.0; else { + $4 = (__ZNSt3__113unordered_mapIi12arControllerNS_4hashIiEENS_8equal_toIiEENS_9allocatorINS_4pairIKiS1_EEEEEixERS8_(2044, $0) | 0) + 232 | 0; + $$0 = +HEAPF64[$4 >> 3]; + } + STACKTOP = sp; + return +$$0; +} + +function _getProjectionFarPlane($id) { + $id = $id | 0; + var $$0 = 0.0, $0 = 0, $4 = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $0 = sp; + HEAP32[$0 >> 2] = $id; + if (!(__ZNSt3__112__hash_tableINS_17__hash_value_typeIi12arControllerEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE4findIiEENS_15__hash_iteratorIPNS_11__hash_nodeIS3_PvEEEERKT_(2044, $0) | 0)) $$0 = -1.0; else { + $4 = (__ZNSt3__113unordered_mapIi12arControllerNS_4hashIiEENS_8equal_toIiEENS_9allocatorINS_4pairIKiS1_EEEEEixERS8_(2044, $0) | 0) + 240 | 0; + $$0 = +HEAPF64[$4 >> 3]; + } + STACKTOP = sp; + return +$$0; +} + +function __ZN10__cxxabiv112_GLOBAL__N_111string_pair9move_fullEv($agg$result, $this) { + $agg$result = $agg$result | 0; + $this = $this | 0; + var $0 = 0, $1 = 0, $13 = 0, $3 = 0; + $0 = $this + 12 | 0; + $1 = HEAP8[$0 >> 0] | 0; + $3 = ($1 & 1) == 0; + $13 = __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($this, $3 ? $0 + 1 | 0 : HEAP32[$this + 20 >> 2] | 0, $3 ? ($1 & 255) >>> 1 : HEAP32[$this + 16 >> 2] | 0) | 0; + HEAP32[$agg$result >> 2] = HEAP32[$13 >> 2]; + HEAP32[$agg$result + 4 >> 2] = HEAP32[$13 + 4 >> 2]; + HEAP32[$agg$result + 8 >> 2] = HEAP32[$13 + 8 >> 2]; + HEAP32[$13 >> 2] = 0; + HEAP32[$13 + 4 >> 2] = 0; + HEAP32[$13 + 8 >> 2] = 0; + return; +} + +function _arImageProcLumaHist($ipi, $dataPtr) { + $ipi = $ipi | 0; + $dataPtr = $dataPtr | 0; + var $$0 = 0, $13 = 0, $5 = 0, $8 = 0, $9 = 0, $p$03 = 0; + if (($ipi | 0) != 0 & ($dataPtr | 0) != 0) if ((_arImageProcLuma($ipi, $dataPtr) | 0) < 0) $$0 = -1; else { + _memset($ipi + 16 | 0, 0, 1024) | 0; + $5 = HEAP32[$ipi >> 2] | 0; + $8 = Math_imul(HEAP32[$ipi + 12 >> 2] | 0, HEAP32[$ipi + 8 >> 2] | 0) | 0; + $9 = $5 + $8 | 0; + if (($8 | 0) > 0) { + $p$03 = $5; + do { + $13 = $ipi + 16 + ((HEAPU8[$p$03 >> 0] | 0) << 2) | 0; + HEAP32[$13 >> 2] = (HEAP32[$13 >> 2] | 0) + 1; + $p$03 = $p$03 + 1 | 0; + } while ($p$03 >>> 0 < $9 >>> 0); + $$0 = 0; + } else $$0 = 0; + } else $$0 = -1; + return $$0 | 0; +} + +function _memcpy(dest, src, num) { + dest = dest | 0; + src = src | 0; + num = num | 0; + var ret = 0; + if ((num | 0) >= 4096) return _emscripten_memcpy_big(dest | 0, src | 0, num | 0) | 0; + ret = dest | 0; + if ((dest & 3) == (src & 3)) { + while (dest & 3) { + if (!num) return ret | 0; + HEAP8[dest >> 0] = HEAP8[src >> 0] | 0; + dest = dest + 1 | 0; + src = src + 1 | 0; + num = num - 1 | 0; + } + while ((num | 0) >= 4) { + HEAP32[dest >> 2] = HEAP32[src >> 2]; + dest = dest + 4 | 0; + src = src + 4 | 0; + num = num - 4 | 0; + } + } + while ((num | 0) > 0) { + HEAP8[dest >> 0] = HEAP8[src >> 0] | 0; + dest = dest + 1 | 0; + src = src + 1 | 0; + num = num - 1 | 0; + } + return ret | 0; +} + +function __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE5eraseEjj($this) { + $this = $this | 0; + var $$pre1 = 0, $0 = 0, $10 = 0, $11 = 0, $14 = 0, $16 = 0; + $0 = HEAP8[$this >> 0] | 0; + if (!($0 & 1)) { + $10 = ($0 & 255) >>> 1; + $14 = $this + 1 | 0; + } else { + $10 = HEAP32[$this + 4 >> 2] | 0; + $14 = HEAP32[$this + 8 >> 2] | 0; + } + $11 = ($10 | 0) != 0 & 1; + $$pre1 = $10 - $11 | 0; + if (($10 | 0) == ($11 | 0)) $16 = $0; else { + _memmove($14 | 0, $14 + $11 | 0, $$pre1 | 0) | 0; + $16 = HEAP8[$this >> 0] | 0; + } + if (!($16 & 1)) HEAP8[$this >> 0] = $$pre1 << 1; else HEAP32[$this + 4 >> 2] = $$pre1; + HEAP8[$14 + $$pre1 >> 0] = 0; + return; +} + +function ___stdio_seek($f, $off, $whence) { + $f = $f | 0; + $off = $off | 0; + $whence = $whence | 0; + var $5 = 0, $ret = 0, $vararg_buffer = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 32 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + $ret = sp + 20 | 0; + HEAP32[$vararg_buffer >> 2] = HEAP32[$f + 60 >> 2]; + HEAP32[$vararg_buffer + 4 >> 2] = 0; + HEAP32[$vararg_buffer + 8 >> 2] = $off; + HEAP32[$vararg_buffer + 12 >> 2] = $ret; + HEAP32[$vararg_buffer + 16 >> 2] = $whence; + if ((___syscall_ret(___syscall140(140, $vararg_buffer | 0) | 0) | 0) < 0) { + HEAP32[$ret >> 2] = -1; + $5 = -1; + } else $5 = HEAP32[$ret >> 2] | 0; + STACKTOP = sp; + return $5 | 0; +} + +function __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEED2Ev($this) { + $this = $this | 0; + var $1 = 0, $2 = 0, $3 = 0, $5 = 0, $6 = 0, $9 = 0; + $1 = HEAP32[$this + 4 >> 2] | 0; + $2 = $this + 8 | 0; + $3 = HEAP32[$2 >> 2] | 0; + if (($3 | 0) != ($1 | 0)) { + $6 = $3; + do { + $5 = $6 + -24 | 0; + HEAP32[$2 >> 2] = $5; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($5); + $6 = HEAP32[$2 >> 2] | 0; + } while (($6 | 0) != ($1 | 0)); + } + $9 = HEAP32[$this >> 2] | 0; + if ($9) __ZN10__cxxabiv112_GLOBAL__N_15arenaILj4096EE10deallocateEPcj(HEAP32[HEAP32[$this + 16 >> 2] >> 2] | 0, $9, (HEAP32[$this + 12 >> 2] | 0) - $9 | 0); + return; +} + +function __ZNSt3__113__vector_baseIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEED2Ev($this) { + $this = $this | 0; + var $0 = 0, $2 = 0, $3 = 0, $5 = 0, $6 = 0, $9 = 0; + $0 = HEAP32[$this >> 2] | 0; + if ($0) { + $2 = $this + 4 | 0; + $3 = HEAP32[$2 >> 2] | 0; + if (($3 | 0) != ($0 | 0)) { + $6 = $3; + do { + $5 = $6 + -24 | 0; + HEAP32[$2 >> 2] = $5; + __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($5); + $6 = HEAP32[$2 >> 2] | 0; + } while (($6 | 0) != ($0 | 0)); + } + $9 = HEAP32[$this >> 2] | 0; + __ZN10__cxxabiv112_GLOBAL__N_15arenaILj4096EE10deallocateEPcj(HEAP32[$this + 12 >> 2] | 0, $9, (HEAP32[$this + 8 >> 2] | 0) - $9 | 0); + } + return; +} + +function __ZNSt3__113unordered_mapIi12arControllerNS_4hashIiEENS_8equal_toIiEENS_9allocatorINS_4pairIKiS1_EEEEE25__construct_node_with_keyERS8_($agg$result, $this, $__k) { + $agg$result = $agg$result | 0; + $this = $this | 0; + $__k = $__k | 0; + var $1 = 0, $11 = 0, $8 = 0; + $1 = __Znwj(408) | 0; + HEAP32[$1 + 8 >> 2] = HEAP32[$__k >> 2]; + _memset($1 + 16 | 0, 0, 392) | 0; + HEAPF64[$1 + 248 >> 3] = .0001; + HEAPF64[$1 + 256 >> 3] = 1.0e3; + $8 = $1 + 264 | 0; + HEAP32[$8 >> 2] = 0; + HEAP32[$8 + 4 >> 2] = 0; + HEAP32[$8 + 8 >> 2] = 0; + HEAP32[$8 + 12 >> 2] = 0; + HEAP32[$agg$result >> 2] = $1; + $11 = $agg$result + 4 | 0; + HEAP32[$11 >> 2] = $this + 8; + HEAP32[$11 + 4 >> 2] = 257; + return; +} + +function _arVecHousehold($x) { + $x = $x | 0; + var $1 = 0.0, $10 = 0.0, $12 = 0, $14 = 0, $3 = 0, $4 = 0.0, $7 = 0.0, $i$01 = 0, $s$0 = 0.0, $s$1 = 0.0; + $1 = +Math_sqrt(+(+_arVecInnerproduct($x, $x))); + if ($1 != 0.0) { + $3 = HEAP32[$x >> 2] | 0; + $4 = +HEAPF64[$3 >> 3]; + $s$0 = $4 < 0.0 ? -$1 : $1; + $7 = $4 + $s$0; + HEAPF64[$3 >> 3] = $7; + $10 = 1.0 / +Math_sqrt(+($7 * $s$0)); + $12 = HEAP32[$x + 4 >> 2] | 0; + if (($12 | 0) > 0) { + $i$01 = 0; + do { + $14 = $3 + ($i$01 << 3) | 0; + HEAPF64[$14 >> 3] = $10 * +HEAPF64[$14 >> 3]; + $i$01 = $i$01 + 1 | 0; + } while (($i$01 | 0) < ($12 | 0)); + $s$1 = $s$0; + } else $s$1 = $s$0; + } else $s$1 = $1; + return +-$s$1; +} + +function __ZNSt3__114__split_bufferINS_6vectorINS1_IN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEENS5_IS7_Lj4096EEEEERNS5_IS9_Lj4096EEEEC2EjjSB_($this, $__cap, $__start, $__a) { + $this = $this | 0; + $__cap = $__cap | 0; + $__start = $__start | 0; + $__a = $__a | 0; + var $6 = 0, $7 = 0; + HEAP32[$this + 12 >> 2] = 0; + HEAP32[$this + 16 >> 2] = $__a; + if (!$__cap) $6 = 0; else $6 = __ZN10__cxxabiv112_GLOBAL__N_15arenaILj4096EE8allocateEj(HEAP32[$__a >> 2] | 0, $__cap << 4) | 0; + HEAP32[$this >> 2] = $6; + $7 = $6 + ($__start << 4) | 0; + HEAP32[$this + 8 >> 2] = $7; + HEAP32[$this + 4 >> 2] = $7; + HEAP32[$this + 12 >> 2] = $6 + ($__cap << 4); + return; +} + +function _memset(ptr, value, num) { + ptr = ptr | 0; + value = value | 0; + num = num | 0; + var stop = 0, value4 = 0, stop4 = 0, unaligned = 0; + stop = ptr + num | 0; + if ((num | 0) >= 20) { + value = value & 255; + unaligned = ptr & 3; + value4 = value | value << 8 | value << 16 | value << 24; + stop4 = stop & ~3; + if (unaligned) { + unaligned = ptr + 4 - unaligned | 0; + while ((ptr | 0) < (unaligned | 0)) { + HEAP8[ptr >> 0] = value; + ptr = ptr + 1 | 0; + } + } + while ((ptr | 0) < (stop4 | 0)) { + HEAP32[ptr >> 2] = value4; + ptr = ptr + 4 | 0; + } + } + while ((ptr | 0) < (stop | 0)) { + HEAP8[ptr >> 0] = value; + ptr = ptr + 1 | 0; + } + return ptr - num | 0; +} + +function __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($this, $__s, $__sz) { + $this = $this | 0; + $__s = $__s | 0; + $__sz = $__sz | 0; + var $6 = 0, $7 = 0, $__p$0 = 0; + if ($__sz >>> 0 > 4294967279) __ZNKSt3__121__basic_string_commonILb1EE20__throw_length_errorEv($this); + if ($__sz >>> 0 < 11) { + HEAP8[$this >> 0] = $__sz << 1; + $__p$0 = $this + 1 | 0; + } else { + $6 = $__sz + 16 & -16; + $7 = _malloc($6) | 0; + HEAP32[$this + 8 >> 2] = $7; + HEAP32[$this >> 2] = $6 | 1; + HEAP32[$this + 4 >> 2] = $__sz; + $__p$0 = $7; + } + _memcpy($__p$0 | 0, $__s | 0, $__sz | 0) | 0; + HEAP8[$__p$0 + $__sz >> 0] = 0; + return; +} + +function __ZNK10__cxxabiv122__base_class_type_info27has_unambiguous_public_baseEPNS_19__dynamic_cast_infoEPvi($this, $info, $adjustedPtr, $path_below) { + $this = $this | 0; + $info = $info | 0; + $adjustedPtr = $adjustedPtr | 0; + $path_below = $path_below | 0; + var $1 = 0, $2 = 0, $8 = 0, $offset_to_base$0 = 0; + $1 = HEAP32[$this + 4 >> 2] | 0; + $2 = $1 >> 8; + if (!($1 & 1)) $offset_to_base$0 = $2; else $offset_to_base$0 = HEAP32[(HEAP32[$adjustedPtr >> 2] | 0) + $2 >> 2] | 0; + $8 = HEAP32[$this >> 2] | 0; + FUNCTION_TABLE_viiii[HEAP32[(HEAP32[$8 >> 2] | 0) + 28 >> 2] & 3]($8, $info, $adjustedPtr + $offset_to_base$0 | 0, ($1 & 2 | 0) != 0 ? $path_below : 2); + return; +} + +function __ZN10emscripten8internal7InvokerIiJiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEEE6invokeEPFiiS8_EiPNS0_11BindingTypeIS8_EUt_E($fn, $args, $args1) { + $fn = $fn | 0; + $args = $args | 0; + $args1 = $args1 | 0; + var $0 = 0, $1 = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $0 = sp; + __ZN10emscripten8internal11BindingTypeINSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEE12fromWireTypeEPNS9_Ut_E($0, $args1); + $1 = FUNCTION_TABLE_iii[$fn & 15]($args, $0) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev($0); + STACKTOP = sp; + return $1 | 0; +} + +function ___toread($f) { + $f = $f | 0; + var $$0 = 0, $0 = 0, $15 = 0, $2 = 0, $21 = 0, $6 = 0, $8 = 0; + $0 = $f + 74 | 0; + $2 = HEAP8[$0 >> 0] | 0; + HEAP8[$0 >> 0] = $2 + 255 | $2; + $6 = $f + 20 | 0; + $8 = $f + 44 | 0; + if ((HEAP32[$6 >> 2] | 0) >>> 0 > (HEAP32[$8 >> 2] | 0) >>> 0) FUNCTION_TABLE_iiii[HEAP32[$f + 36 >> 2] & 15]($f, 0, 0) | 0; + HEAP32[$f + 16 >> 2] = 0; + HEAP32[$f + 28 >> 2] = 0; + HEAP32[$6 >> 2] = 0; + $15 = HEAP32[$f >> 2] | 0; + if (!($15 & 20)) { + $21 = HEAP32[$8 >> 2] | 0; + HEAP32[$f + 8 >> 2] = $21; + HEAP32[$f + 4 >> 2] = $21; + $$0 = 0; + } else if (!($15 & 4)) $$0 = -1; else { + HEAP32[$f >> 2] = $15 | 32; + $$0 = -1; + } + return $$0 | 0; +} + +function _fclose($f) { + $f = $f | 0; + var $$pre = 0, $12 = 0, $18 = 0, $22 = 0, $24 = 0, $5 = 0, $7 = 0; + if ((HEAP32[$f + 76 >> 2] | 0) > -1) {} + $5 = (HEAP32[$f >> 2] & 1 | 0) != 0; + if (!$5) { + ___lock(2416); + $7 = HEAP32[$f + 52 >> 2] | 0; + $$pre = $f + 56 | 0; + if ($7) HEAP32[$7 + 56 >> 2] = HEAP32[$$pre >> 2]; + $12 = HEAP32[$$pre >> 2] | 0; + if ($12) HEAP32[$12 + 52 >> 2] = $7; + if ((HEAP32[603] | 0) == ($f | 0)) HEAP32[603] = $12; + ___unlock(2416); + } + $18 = _fflush($f) | 0; + $22 = FUNCTION_TABLE_ii[HEAP32[$f + 12 >> 2] & 31]($f) | 0 | $18; + $24 = HEAP32[$f + 92 >> 2] | 0; + if ($24) _free($24); + if (!$5) _free($f); + return $22 | 0; +} + +function __ZNSt3__114__split_bufferINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEERNS5_IS7_Lj4096EEEEC2EjjS9_($this, $__cap, $__start, $__a) { + $this = $this | 0; + $__cap = $__cap | 0; + $__start = $__start | 0; + $__a = $__a | 0; + var $6 = 0, $7 = 0; + HEAP32[$this + 12 >> 2] = 0; + HEAP32[$this + 16 >> 2] = $__a; + if (!$__cap) $6 = 0; else $6 = __ZN10__cxxabiv112_GLOBAL__N_15arenaILj4096EE8allocateEj(HEAP32[$__a >> 2] | 0, $__cap << 4) | 0; + HEAP32[$this >> 2] = $6; + $7 = $6 + ($__start << 4) | 0; + HEAP32[$this + 8 >> 2] = $7; + HEAP32[$this + 4 >> 2] = $7; + HEAP32[$this + 12 >> 2] = $6 + ($__cap << 4); + return; +} + +function __ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEPKcj($this, $__s, $__sz) { + $this = $this | 0; + $__s = $__s | 0; + $__sz = $__sz | 0; + var $6 = 0, $7 = 0, $__p$0 = 0; + if ($__sz >>> 0 > 4294967279) __ZNKSt3__121__basic_string_commonILb1EE20__throw_length_errorEv($this); + if ($__sz >>> 0 < 11) { + HEAP8[$this >> 0] = $__sz << 1; + $__p$0 = $this + 1 | 0; + } else { + $6 = $__sz + 16 & -16; + $7 = __Znwj($6) | 0; + HEAP32[$this + 8 >> 2] = $7; + HEAP32[$this >> 2] = $6 | 1; + HEAP32[$this + 4 >> 2] = $__sz; + $__p$0 = $7; + } + _memcpy($__p$0 | 0, $__s | 0, $__sz | 0) | 0; + HEAP8[$__p$0 + $__sz >> 0] = 0; + return; +} + +function _arVecInnerproduct($x, $y) { + $x = $x | 0; + $y = $y | 0; + var $1 = 0, $13 = 0.0, $6 = 0, $7 = 0, $i$02 = 0, $result$0$lcssa = 0.0, $result$01 = 0.0; + $1 = HEAP32[$x + 4 >> 2] | 0; + if (($1 | 0) != (HEAP32[$y + 4 >> 2] | 0)) _exit(0); + if (($1 | 0) > 0) { + $6 = HEAP32[$x >> 2] | 0; + $7 = HEAP32[$y >> 2] | 0; + $i$02 = 0; + $result$01 = 0.0; + while (1) { + $13 = $result$01 + +HEAPF64[$6 + ($i$02 << 3) >> 3] * +HEAPF64[$7 + ($i$02 << 3) >> 3]; + $i$02 = $i$02 + 1 | 0; + if (($i$02 | 0) >= ($1 | 0)) { + $result$0$lcssa = $13; + break; + } else $result$01 = $13; + } + } else $result$0$lcssa = 0.0; + return +$result$0$lcssa; +} + +function _memcmp($vl, $vr, $n) { + $vl = $vl | 0; + $vr = $vr | 0; + $n = $n | 0; + var $$03 = 0, $$lcssa = 0, $$lcssa19 = 0, $1 = 0, $11 = 0, $2 = 0, $l$04 = 0, $r$05 = 0; + L1 : do if (!$n) $11 = 0; else { + $$03 = $n; + $l$04 = $vl; + $r$05 = $vr; + while (1) { + $1 = HEAP8[$l$04 >> 0] | 0; + $2 = HEAP8[$r$05 >> 0] | 0; + if ($1 << 24 >> 24 != $2 << 24 >> 24) { + $$lcssa = $1; + $$lcssa19 = $2; + break; + } + $$03 = $$03 + -1 | 0; + if (!$$03) { + $11 = 0; + break L1; + } else { + $l$04 = $l$04 + 1 | 0; + $r$05 = $r$05 + 1 | 0; + } + } + $11 = ($$lcssa & 255) - ($$lcssa19 & 255) | 0; + } while (0); + return $11 | 0; +} + +function ___fmodeflags($mode) { + $mode = $mode | 0; + var $1 = 0, $2 = 0, $4 = 0, $7 = 0, $flags$0 = 0, $flags$0$ = 0, $flags$2 = 0, $flags$2$ = 0, $flags$4 = 0; + $1 = (_strchr($mode, 43) | 0) == 0; + $2 = HEAP8[$mode >> 0] | 0; + $flags$0 = $1 ? $2 << 24 >> 24 != 114 & 1 : 2; + $4 = (_strchr($mode, 120) | 0) == 0; + $flags$0$ = $4 ? $flags$0 : $flags$0 | 128; + $7 = (_strchr($mode, 101) | 0) == 0; + $flags$2 = $7 ? $flags$0$ : $flags$0$ | 524288; + $flags$2$ = $2 << 24 >> 24 == 114 ? $flags$2 : $flags$2 | 64; + $flags$4 = $2 << 24 >> 24 == 119 ? $flags$2$ | 512 : $flags$2$; + return ($2 << 24 >> 24 == 97 ? $flags$4 | 1024 : $flags$4) | 0; +} + +function __ZNSt3__114__split_bufferIN10__cxxabiv112_GLOBAL__N_111string_pairERNS2_11short_allocIS3_Lj4096EEEEC2EjjS6_($this, $__cap, $__start, $__a) { + $this = $this | 0; + $__cap = $__cap | 0; + $__start = $__start | 0; + $__a = $__a | 0; + var $6 = 0, $7 = 0; + HEAP32[$this + 12 >> 2] = 0; + HEAP32[$this + 16 >> 2] = $__a; + if (!$__cap) $6 = 0; else $6 = __ZN10__cxxabiv112_GLOBAL__N_15arenaILj4096EE8allocateEj(HEAP32[$__a >> 2] | 0, $__cap * 24 | 0) | 0; + HEAP32[$this >> 2] = $6; + $7 = $6 + ($__start * 24 | 0) | 0; + HEAP32[$this + 8 >> 2] = $7; + HEAP32[$this + 4 >> 2] = $7; + HEAP32[$this + 12 >> 2] = $6 + ($__cap * 24 | 0); + return; +} + +function __ZN10emscripten8internal7InvokerIiJNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEEE6invokeEPFiS8_EPNS0_11BindingTypeIS8_EUt_E($fn, $args) { + $fn = $fn | 0; + $args = $args | 0; + var $0 = 0, $1 = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $0 = sp; + __ZN10emscripten8internal11BindingTypeINSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEE12fromWireTypeEPNS9_Ut_E($0, $args); + $1 = FUNCTION_TABLE_ii[$fn & 31]($0) | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev($0); + STACKTOP = sp; + return $1 | 0; +} + +function _strncat($d, $s, $n) { + $d = $d | 0; + $s = $s | 0; + $n = $n | 0; + var $$0$lcssa = 0, $$014 = 0, $$023 = 0, $$05 = 0, $1 = 0, $3 = 0, $7 = 0; + $1 = $d + (_strlen($d) | 0) | 0; + L1 : do if (!$n) $$0$lcssa = $1; else { + $$014 = $n; + $$023 = $s; + $$05 = $1; + while (1) { + $3 = HEAP8[$$023 >> 0] | 0; + if (!($3 << 24 >> 24)) { + $$0$lcssa = $$05; + break L1; + } + $$014 = $$014 + -1 | 0; + $7 = $$05 + 1 | 0; + HEAP8[$$05 >> 0] = $3; + if (!$$014) { + $$0$lcssa = $7; + break; + } else { + $$023 = $$023 + 1 | 0; + $$05 = $7; + } + } + } while (0); + HEAP8[$$0$lcssa >> 0] = 0; + return $d | 0; +} + +function _get_buff($buf, $fp) { + $buf = $buf | 0; + $fp = $fp | 0; + var $2 = 0, $5 = 0, $l$01 = 0; + L1 : do if (_fgets($buf, 256, $fp) | 0) while (1) { + $2 = _strlen($buf) | 0; + L4 : do if ($2) { + $l$01 = $2; + while (1) { + $l$01 = $l$01 + -1 | 0; + $5 = $buf + $l$01 | 0; + switch (HEAP8[$5 >> 0] | 0) { + case 13: + case 10: + break; + default: + break L4; + } + HEAP8[$5 >> 0] = 0; + if (!$l$01) break L4; + } + } while (0); + switch (HEAP8[$buf >> 0] | 0) { + case 0: + case 35: + break; + default: + break L1; + } + if (!(_fgets($buf, 256, $fp) | 0)) break L1; + } while (0); + return; +} + +function __ZNK10__cxxabiv120__si_class_type_info27has_unambiguous_public_baseEPNS_19__dynamic_cast_infoEPvi($this, $info, $adjustedPtr, $path_below) { + $this = $this | 0; + $info = $info | 0; + $adjustedPtr = $adjustedPtr | 0; + $path_below = $path_below | 0; + var $4 = 0; + if (($this | 0) == (HEAP32[$info + 8 >> 2] | 0)) __ZNK10__cxxabiv117__class_type_info24process_found_base_classEPNS_19__dynamic_cast_infoEPvi(0, $info, $adjustedPtr, $path_below); else { + $4 = HEAP32[$this + 8 >> 2] | 0; + FUNCTION_TABLE_viiii[HEAP32[(HEAP32[$4 >> 2] | 0) + 28 >> 2] & 3]($4, $info, $adjustedPtr, $path_below); + } + return; +} + +function ___stdout_write($f, $buf, $len) { + $f = $f | 0; + $buf = $buf | 0; + $len = $len | 0; + var $9 = 0, $vararg_buffer = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 80 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + HEAP32[$f + 36 >> 2] = 4; + if (!(HEAP32[$f >> 2] & 64)) { + HEAP32[$vararg_buffer >> 2] = HEAP32[$f + 60 >> 2]; + HEAP32[$vararg_buffer + 4 >> 2] = 21505; + HEAP32[$vararg_buffer + 8 >> 2] = sp + 12; + if (___syscall54(54, $vararg_buffer | 0) | 0) HEAP8[$f + 75 >> 0] = -1; + } + $9 = ___stdio_write($f, $buf, $len) | 0; + STACKTOP = sp; + return $9 | 0; +} + +function _arUtilGetDirectoryNameFromPath($dir, $path, $n, $addSeparator) { + $dir = $dir | 0; + $path = $path | 0; + $n = $n | 0; + $addSeparator = $addSeparator | 0; + var $$0 = 0, $10 = 0, $3 = 0; + do if (($dir | 0) != 0 & ($path | 0) != 0 & ($n | 0) != 0) { + $3 = _strrchr($path, 47) | 0; + if (!$3) { + HEAP8[$dir >> 0] = 0; + $$0 = $dir; + break; + } + $10 = $3 + (($addSeparator | 0) != 0 & 1) - $path | 0; + if (($10 + 1 | 0) >>> 0 > $n >>> 0) $$0 = 0; else { + _strncpy($dir, $path, $10) | 0; + HEAP8[$dir + $10 >> 0] = 0; + $$0 = $dir; + } + } else $$0 = 0; while (0); + return $$0 | 0; +} + +function __ZNSt3__112__hash_tableINS_17__hash_value_typeIi12arControllerEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEED2Ev($this) { + $this = $this | 0; + var $2 = 0; + __ZNSt3__112__hash_tableINS_17__hash_value_typeIi12arControllerEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE12__deallocateEPNS_11__hash_nodeIS3_PvEE($this, HEAP32[$this + 8 >> 2] | 0); + $2 = HEAP32[$this >> 2] | 0; + HEAP32[$this >> 2] = 0; + if ($2) __ZdlPv($2); + return; +} + +function __ZNSt3__112__hash_tableINS_17__hash_value_typeIi12arControllerEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE12__deallocateEPNS_11__hash_nodeIS3_PvEE($this, $__np) { + $this = $this | 0; + $__np = $__np | 0; + var $$01 = 0, $$01$looptemp = 0; + if ($__np) { + $$01 = $__np; + do { + $$01$looptemp = $$01; + $$01 = HEAP32[$$01 >> 2] | 0; + __ZNSt3__113__vector_baseI12multi_markerNS_9allocatorIS1_EEED2Ev($$01$looptemp + 264 | 0); + __ZdlPv($$01$looptemp); + } while (($$01 | 0) != 0); + } + return; +} + +function __ZNSt3__112__hash_tableINS_17__hash_value_typeIi7ARParamEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEED2Ev($this) { + $this = $this | 0; + var $2 = 0; + __ZNSt3__112__hash_tableINS_17__hash_value_typeIi7ARParamEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE12__deallocateEPNS_11__hash_nodeIS3_PvEE($this, HEAP32[$this + 8 >> 2] | 0); + $2 = HEAP32[$this >> 2] | 0; + HEAP32[$this >> 2] = 0; + if ($2) __ZdlPv($2); + return; +} + +function __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2EOS1_($this, $0) { + $this = $this | 0; + $0 = $0 | 0; + var $3 = 0, $4 = 0; + HEAP32[$this >> 2] = HEAP32[$0 >> 2]; + HEAP32[$this + 4 >> 2] = HEAP32[$0 + 4 >> 2]; + HEAP32[$this + 8 >> 2] = HEAP32[$0 + 8 >> 2]; + HEAP32[$0 >> 2] = 0; + HEAP32[$0 + 4 >> 2] = 0; + HEAP32[$0 + 8 >> 2] = 0; + $3 = $this + 12 | 0; + $4 = $0 + 12 | 0; + HEAP32[$3 >> 2] = HEAP32[$4 >> 2]; + HEAP32[$3 + 4 >> 2] = HEAP32[$4 + 4 >> 2]; + HEAP32[$3 + 8 >> 2] = HEAP32[$4 + 8 >> 2]; + HEAP32[$4 >> 2] = 0; + HEAP32[$4 + 4 >> 2] = 0; + HEAP32[$4 + 8 >> 2] = 0; + return; +} + +function _arImageProcLumaHistAndCDF($ipi, $dataPtr) { + $ipi = $ipi | 0; + $dataPtr = $dataPtr | 0; + var $$0 = 0, $0 = 0, $cdfCurrent$0 = 0, $indvars$iv = 0; + $0 = _arImageProcLumaHist($ipi, $dataPtr) | 0; + if (($0 | 0) < 0) $$0 = $0; else { + $cdfCurrent$0 = 0; + $indvars$iv = 0; + do { + $cdfCurrent$0 = (HEAP32[$ipi + 16 + ($indvars$iv << 2) >> 2] | 0) + $cdfCurrent$0 | 0; + HEAP32[$ipi + 1040 + ($indvars$iv << 2) >> 2] = $cdfCurrent$0; + $indvars$iv = $indvars$iv + 1 | 0; + } while (($indvars$iv | 0) != 256); + $$0 = 0; + } + return $$0 | 0; +} + +function __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj5EEERAT__Kc($this, $s) { + $this = $this | 0; + $s = $s | 0; + var $0 = 0, $1 = 0, $3 = 0; + HEAP8[$this >> 0] = 8; + $0 = $this + 1 | 0; + $1 = HEAPU8[$s >> 0] | HEAPU8[$s + 1 >> 0] << 8 | HEAPU8[$s + 2 >> 0] << 16 | HEAPU8[$s + 3 >> 0] << 24; + HEAP8[$0 >> 0] = $1; + HEAP8[$0 + 1 >> 0] = $1 >> 8; + HEAP8[$0 + 2 >> 0] = $1 >> 16; + HEAP8[$0 + 3 >> 0] = $1 >> 24; + HEAP8[$this + 5 >> 0] = 0; + $3 = $this + 12 | 0; + HEAP32[$3 >> 2] = 0; + HEAP32[$3 + 4 >> 2] = 0; + HEAP32[$3 + 8 >> 2] = 0; + return; +} + +function _vsscanf($s, $fmt, $ap) { + $s = $s | 0; + $fmt = $fmt | 0; + $ap = $ap | 0; + var $4 = 0, $f = 0, dest = 0, sp = 0, stop = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 112 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $f = sp; + dest = $f; + stop = dest + 112 | 0; + do { + HEAP32[dest >> 2] = 0; + dest = dest + 4 | 0; + } while ((dest | 0) < (stop | 0)); + HEAP32[$f + 32 >> 2] = 15; + HEAP32[$f + 44 >> 2] = $s; + HEAP32[$f + 76 >> 2] = -1; + HEAP32[$f + 84 >> 2] = $s; + $4 = _vfscanf($f, $fmt, $ap) | 0; + STACKTOP = sp; + return $4 | 0; +} + +function __ZNSt3__114__split_bufferI12multi_markerRNS_9allocatorIS1_EEED2Ev($this) { + $this = $this | 0; + var $$lcssa = 0, $$pre$i$i$i = 0, $1 = 0, $2 = 0, $4 = 0, $5 = 0, $7 = 0; + $1 = HEAP32[$this + 4 >> 2] | 0; + $2 = $this + 8 | 0; + $$pre$i$i$i = HEAP32[$2 >> 2] | 0; + if (($$pre$i$i$i | 0) != ($1 | 0)) { + $5 = $$pre$i$i$i; + while (1) { + $4 = $5 + -8 | 0; + if (($4 | 0) == ($1 | 0)) { + $$lcssa = $4; + break; + } else $5 = $4; + } + HEAP32[$2 >> 2] = $$lcssa; + } + $7 = HEAP32[$this >> 2] | 0; + if ($7) __ZdlPv($7); + return; +} + +function __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEC2ERKS7_($this, $__str) { + $this = $this | 0; + $__str = $__str | 0; + if (!(HEAP8[$__str >> 0] & 1)) { + HEAP32[$this >> 2] = HEAP32[$__str >> 2]; + HEAP32[$this + 4 >> 2] = HEAP32[$__str + 4 >> 2]; + HEAP32[$this + 8 >> 2] = HEAP32[$__str + 8 >> 2]; + } else __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($this, HEAP32[$__str + 8 >> 2] | 0, HEAP32[$__str + 4 >> 2] | 0); + return; +} + +function __ZNK10__cxxabiv117__class_type_info16search_above_dstEPNS_19__dynamic_cast_infoEPKvS4_ib($this, $info, $dst_ptr, $current_ptr, $path_below, $use_strcmp) { + $this = $this | 0; + $info = $info | 0; + $dst_ptr = $dst_ptr | 0; + $current_ptr = $current_ptr | 0; + $path_below = $path_below | 0; + $use_strcmp = $use_strcmp | 0; + if (($this | 0) == (HEAP32[$info + 8 >> 2] | 0)) __ZNK10__cxxabiv117__class_type_info29process_static_type_above_dstEPNS_19__dynamic_cast_infoEPKvS4_i(0, $info, $dst_ptr, $current_ptr, $path_below); + return; +} + +function __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj6EEERAT__Kc($this, $s) { + $this = $this | 0; + $s = $s | 0; + var $0 = 0, $2 = 0; + HEAP8[$this >> 0] = 10; + $0 = $this + 1 | 0; + HEAP8[$0 >> 0] = HEAP8[$s >> 0] | 0; + HEAP8[$0 + 1 >> 0] = HEAP8[$s + 1 >> 0] | 0; + HEAP8[$0 + 2 >> 0] = HEAP8[$s + 2 >> 0] | 0; + HEAP8[$0 + 3 >> 0] = HEAP8[$s + 3 >> 0] | 0; + HEAP8[$0 + 4 >> 0] = HEAP8[$s + 4 >> 0] | 0; + HEAP8[$this + 6 >> 0] = 0; + $2 = $this + 12 | 0; + HEAP32[$2 >> 2] = 0; + HEAP32[$2 + 4 >> 2] = 0; + HEAP32[$2 + 8 >> 2] = 0; + return; +} + +function _fwrite($src, $size, $nmemb, $f) { + $src = $src | 0; + $size = $size | 0; + $nmemb = $nmemb | 0; + $f = $f | 0; + var $0 = 0, $10 = 0, $6 = 0, $8 = 0, $phitmp = 0; + $0 = Math_imul($nmemb, $size) | 0; + if ((HEAP32[$f + 76 >> 2] | 0) > -1) { + $phitmp = (___lockfile($f) | 0) == 0; + $6 = ___fwritex($src, $0, $f) | 0; + if ($phitmp) $8 = $6; else { + ___unlockfile($f); + $8 = $6; + } + } else $8 = ___fwritex($src, $0, $f) | 0; + if (($8 | 0) == ($0 | 0)) $10 = $nmemb; else $10 = ($8 >>> 0) / ($size >>> 0) | 0; + return $10 | 0; +} + +function ___string_read($f, $buf, $len) { + $f = $f | 0; + $buf = $buf | 0; + $len = $len | 0; + var $0 = 0, $1 = 0, $11 = 0, $2 = 0, $3 = 0, $k$0 = 0, $k$0$len = 0; + $0 = $f + 84 | 0; + $1 = HEAP32[$0 >> 2] | 0; + $2 = $len + 256 | 0; + $3 = _memchr($1, 0, $2) | 0; + $k$0 = ($3 | 0) == 0 ? $2 : $3 - $1 | 0; + $k$0$len = $k$0 >>> 0 < $len >>> 0 ? $k$0 : $len; + _memcpy($buf | 0, $1 | 0, $k$0$len | 0) | 0; + HEAP32[$f + 4 >> 2] = $1 + $k$0$len; + $11 = $1 + $k$0 | 0; + HEAP32[$f + 8 >> 2] = $11; + HEAP32[$0 >> 2] = $11; + return $k$0$len | 0; +} + +function __Znwj($size) { + $size = $size | 0; + var $$lcssa = 0, $$size = 0, $1 = 0, $3 = 0, $5 = 0, $7 = 0; + $$size = ($size | 0) == 0 ? 1 : $size; + $1 = _malloc($$size) | 0; + L1 : do if (!$1) { + while (1) { + $3 = __ZSt15get_new_handlerv() | 0; + if (!$3) break; + FUNCTION_TABLE_v[$3 & 0](); + $5 = _malloc($$size) | 0; + if ($5) { + $$lcssa = $5; + break L1; + } + } + $7 = ___cxa_allocate_exception(4) | 0; + HEAP32[$7 >> 2] = 2224; + ___cxa_throw($7 | 0, 544, 1); + } else $$lcssa = $1; while (0); + return $$lcssa | 0; +} + +function _calloc($n_elements, $elem_size) { + $n_elements = $n_elements | 0; + $elem_size = $elem_size | 0; + var $1 = 0, $6 = 0, $req$0 = 0; + if (!$n_elements) $req$0 = 0; else { + $1 = Math_imul($elem_size, $n_elements) | 0; + if (($elem_size | $n_elements) >>> 0 > 65535) $req$0 = (($1 >>> 0) / ($n_elements >>> 0) | 0 | 0) == ($elem_size | 0) ? $1 : -1; else $req$0 = $1; + } + $6 = _malloc($req$0) | 0; + if (!$6) return $6 | 0; + if (!(HEAP32[$6 + -4 >> 2] & 3)) return $6 | 0; + _memset($6 | 0, 0, $req$0 | 0) | 0; + return $6 | 0; +} + +function ___muldi3($a$0, $a$1, $b$0, $b$1) { + $a$0 = $a$0 | 0; + $a$1 = $a$1 | 0; + $b$0 = $b$0 | 0; + $b$1 = $b$1 | 0; + var $x_sroa_0_0_extract_trunc = 0, $y_sroa_0_0_extract_trunc = 0, $1$0 = 0, $1$1 = 0; + $x_sroa_0_0_extract_trunc = $a$0; + $y_sroa_0_0_extract_trunc = $b$0; + $1$0 = ___muldsi3($x_sroa_0_0_extract_trunc, $y_sroa_0_0_extract_trunc) | 0; + $1$1 = tempRet0; + return (tempRet0 = (Math_imul($a$1, $y_sroa_0_0_extract_trunc) | 0) + (Math_imul($b$1, $x_sroa_0_0_extract_trunc) | 0) + $1$1 | $1$1 & 0, $1$0 | 0 | 0) | 0; +} + +function __ZN10__cxxabiv112_GLOBAL__N_12DbD2Ev($this) { + $this = $this | 0; + __ZNSt3__113__vector_baseINS_6vectorINS1_IN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEENS5_IS7_Lj4096EEEEENS5_IS9_Lj4096EEEED2Ev($this + 32 | 0); + __ZNSt3__113__vector_baseINS_6vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEENS5_IS7_Lj4096EEEED2Ev($this + 16 | 0); + __ZNSt3__113__vector_baseIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEED2Ev($this); + return; +} + +function __ZNSt3__114__split_bufferI12multi_markerRNS_9allocatorIS1_EEEC2EjjS4_($this, $__cap, $__start, $__a) { + $this = $this | 0; + $__cap = $__cap | 0; + $__start = $__start | 0; + $__a = $__a | 0; + var $5 = 0, $6 = 0; + HEAP32[$this + 12 >> 2] = 0; + HEAP32[$this + 16 >> 2] = $__a; + if (!$__cap) $5 = 0; else $5 = __Znwj($__cap << 3) | 0; + HEAP32[$this >> 2] = $5; + $6 = $5 + ($__start << 3) | 0; + HEAP32[$this + 8 >> 2] = $6; + HEAP32[$this + 4 >> 2] = $6; + HEAP32[$this + 12 >> 2] = $5 + ($__cap << 3); + return; +} + +function __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEaSERKS7_($this, $__str) { + $this = $this | 0; + $__str = $__str | 0; + var $1 = 0, $3 = 0; + if (($this | 0) != ($__str | 0)) { + $1 = HEAP8[$__str >> 0] | 0; + $3 = ($1 & 1) == 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6assignEPKcj($this, $3 ? $__str + 1 | 0 : HEAP32[$__str + 8 >> 2] | 0, $3 ? ($1 & 255) >>> 1 : HEAP32[$__str + 4 >> 2] | 0); + } + return; +} + +function __ZNSt3__113__vector_baseI12multi_markerNS_9allocatorIS1_EEED2Ev($this) { + $this = $this | 0; + var $$lcssa = 0, $$pre$i$i = 0, $0 = 0, $2 = 0, $4 = 0, $5 = 0; + $0 = HEAP32[$this >> 2] | 0; + if ($0) { + $2 = $this + 4 | 0; + $$pre$i$i = HEAP32[$2 >> 2] | 0; + if (($$pre$i$i | 0) != ($0 | 0)) { + $5 = $$pre$i$i; + while (1) { + $4 = $5 + -8 | 0; + if (($4 | 0) == ($0 | 0)) { + $$lcssa = $4; + break; + } else $5 = $4; + } + HEAP32[$2 >> 2] = $$lcssa; + } + __ZdlPv($0); + } + return; +} + +function __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj11EEERAT__Kc($this, $s) { + $this = $this | 0; + $s = $s | 0; + var $2 = 0, dest = 0, src = 0, stop = 0; + HEAP8[$this >> 0] = 20; + dest = $this + 1 | 0; + src = $s; + stop = dest + 10 | 0; + do { + HEAP8[dest >> 0] = HEAP8[src >> 0] | 0; + dest = dest + 1 | 0; + src = src + 1 | 0; + } while ((dest | 0) < (stop | 0)); + HEAP8[$this + 11 >> 0] = 0; + $2 = $this + 12 | 0; + HEAP32[$2 >> 2] = 0; + HEAP32[$2 + 4 >> 2] = 0; + HEAP32[$2 + 8 >> 2] = 0; + return; +} + +function __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj10EEERAT__Kc($this, $s) { + $this = $this | 0; + $s = $s | 0; + var $2 = 0, dest = 0, src = 0, stop = 0; + HEAP8[$this >> 0] = 18; + dest = $this + 1 | 0; + src = $s; + stop = dest + 9 | 0; + do { + HEAP8[dest >> 0] = HEAP8[src >> 0] | 0; + dest = dest + 1 | 0; + src = src + 1 | 0; + } while ((dest | 0) < (stop | 0)); + HEAP8[$this + 10 >> 0] = 0; + $2 = $this + 12 | 0; + HEAP32[$2 >> 2] = 0; + HEAP32[$2 + 4 >> 2] = 0; + HEAP32[$2 + 8 >> 2] = 0; + return; +} + +function ___towrite($f) { + $f = $f | 0; + var $$0 = 0, $0 = 0, $13 = 0, $2 = 0, $6 = 0; + $0 = $f + 74 | 0; + $2 = HEAP8[$0 >> 0] | 0; + HEAP8[$0 >> 0] = $2 + 255 | $2; + $6 = HEAP32[$f >> 2] | 0; + if (!($6 & 8)) { + HEAP32[$f + 8 >> 2] = 0; + HEAP32[$f + 4 >> 2] = 0; + $13 = HEAP32[$f + 44 >> 2] | 0; + HEAP32[$f + 28 >> 2] = $13; + HEAP32[$f + 20 >> 2] = $13; + HEAP32[$f + 16 >> 2] = $13 + (HEAP32[$f + 48 >> 2] | 0); + $$0 = 0; + } else { + HEAP32[$f >> 2] = $6 | 32; + $$0 = -1; + } + return $$0 | 0; +} + +function __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ENSt3__112basic_stringIcNS2_11char_traitsIcEENS0_12malloc_allocIcEEEE($this, $f) { + $this = $this | 0; + $f = $f | 0; + var $2 = 0; + HEAP32[$this >> 2] = HEAP32[$f >> 2]; + HEAP32[$this + 4 >> 2] = HEAP32[$f + 4 >> 2]; + HEAP32[$this + 8 >> 2] = HEAP32[$f + 8 >> 2]; + HEAP32[$f >> 2] = 0; + HEAP32[$f + 4 >> 2] = 0; + HEAP32[$f + 8 >> 2] = 0; + $2 = $this + 12 | 0; + HEAP32[$2 >> 2] = 0; + HEAP32[$2 + 4 >> 2] = 0; + HEAP32[$2 + 8 >> 2] = 0; + return; +} + +function _matrixCopy($src, $dst) { + $src = $src | 0; + $dst = $dst | 0; + var $i$03 = 0; + $i$03 = 0; + do { + HEAPF64[$dst + ($i$03 << 5) >> 3] = +HEAPF64[$src + ($i$03 << 5) >> 3]; + HEAPF64[$dst + ($i$03 << 5) + 8 >> 3] = +HEAPF64[$src + ($i$03 << 5) + 8 >> 3]; + HEAPF64[$dst + ($i$03 << 5) + 16 >> 3] = +HEAPF64[$src + ($i$03 << 5) + 16 >> 3]; + HEAPF64[$dst + ($i$03 << 5) + 24 >> 3] = +HEAPF64[$src + ($i$03 << 5) + 24 >> 3]; + $i$03 = $i$03 + 1 | 0; + } while (($i$03 | 0) != 3); + return; +} + +function __ZNSt3__112__hash_tableINS_17__hash_value_typeIi7ARParamEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEE12__deallocateEPNS_11__hash_nodeIS3_PvEE($this, $__np) { + $this = $this | 0; + $__np = $__np | 0; + var $$01 = 0, $$01$looptemp = 0; + if ($__np) { + $$01 = $__np; + do { + $$01$looptemp = $$01; + $$01 = HEAP32[$$01 >> 2] | 0; + __ZdlPv($$01$looptemp); + } while (($$01 | 0) != 0); + } + return; +} + +function __ZNSt3__113unordered_mapIi7ARParamNS_4hashIiEENS_8equal_toIiEENS_9allocatorINS_4pairIKiS1_EEEEE25__construct_node_with_keyERS8_($agg$result, $this, $__k) { + $agg$result = $agg$result | 0; + $this = $this | 0; + $__k = $__k | 0; + var $1 = 0, $8 = 0; + $1 = __Znwj(200) | 0; + HEAP32[$1 + 8 >> 2] = HEAP32[$__k >> 2]; + _memset($1 + 16 | 0, 0, 184) | 0; + HEAP32[$agg$result >> 2] = $1; + $8 = $agg$result + 4 | 0; + HEAP32[$8 >> 2] = $this + 8; + HEAP32[$8 + 4 >> 2] = 257; + return; +} + +function _byteSwapDouble($from, $to) { + $from = $from | 0; + $to = $to | 0; + HEAP8[$to >> 0] = HEAP8[$from + 7 >> 0] | 0; + HEAP8[$to + 1 >> 0] = HEAP8[$from + 6 >> 0] | 0; + HEAP8[$to + 2 >> 0] = HEAP8[$from + 5 >> 0] | 0; + HEAP8[$to + 3 >> 0] = HEAP8[$from + 4 >> 0] | 0; + HEAP8[$to + 4 >> 0] = HEAP8[$from + 3 >> 0] | 0; + HEAP8[$to + 5 >> 0] = HEAP8[$from + 2 >> 0] | 0; + HEAP8[$to + 6 >> 0] = HEAP8[$from + 1 >> 0] | 0; + HEAP8[$to + 7 >> 0] = HEAP8[$from >> 0] | 0; + return; +} + +function copyTempDouble(ptr) { + ptr = ptr | 0; + HEAP8[tempDoublePtr >> 0] = HEAP8[ptr >> 0]; + HEAP8[tempDoublePtr + 1 >> 0] = HEAP8[ptr + 1 >> 0]; + HEAP8[tempDoublePtr + 2 >> 0] = HEAP8[ptr + 2 >> 0]; + HEAP8[tempDoublePtr + 3 >> 0] = HEAP8[ptr + 3 >> 0]; + HEAP8[tempDoublePtr + 4 >> 0] = HEAP8[ptr + 4 >> 0]; + HEAP8[tempDoublePtr + 5 >> 0] = HEAP8[ptr + 5 >> 0]; + HEAP8[tempDoublePtr + 6 >> 0] = HEAP8[ptr + 6 >> 0]; + HEAP8[tempDoublePtr + 7 >> 0] = HEAP8[ptr + 7 >> 0]; +} + +function ___ftello_unlocked($f) { + $f = $f | 0; + var $$0 = 0, $10 = 0, $11 = 0; + if (!(HEAP32[$f >> 2] & 128)) $10 = 1; else $10 = (HEAP32[$f + 20 >> 2] | 0) >>> 0 > (HEAP32[$f + 28 >> 2] | 0) >>> 0 ? 2 : 1; + $11 = FUNCTION_TABLE_iiii[HEAP32[$f + 40 >> 2] & 15]($f, 0, $10) | 0; + if (($11 | 0) < 0) $$0 = $11; else $$0 = $11 - (HEAP32[$f + 8 >> 2] | 0) + (HEAP32[$f + 4 >> 2] | 0) + (HEAP32[$f + 20 >> 2] | 0) - (HEAP32[$f + 28 >> 2] | 0) | 0; + return $$0 | 0; +} + +function ___uflow($f) { + $f = $f | 0; + var $$0 = 0, $c = 0, label = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $c = sp; + if (!(HEAP32[$f + 8 >> 2] | 0)) if (!(___toread($f) | 0)) label = 3; else $$0 = -1; else label = 3; + if ((label | 0) == 3) if ((FUNCTION_TABLE_iiii[HEAP32[$f + 32 >> 2] & 15]($f, $c, 1) | 0) == 1) $$0 = HEAPU8[$c >> 0] | 0; else $$0 = -1; + STACKTOP = sp; + return $$0 | 0; +} + +function _deleteHandle($arc) { + $arc = $arc | 0; + var $0 = 0, $1 = 0, $4 = 0, $7 = 0; + $0 = $arc + 212 | 0; + $1 = HEAP32[$0 >> 2] | 0; + if ($1) { + _arPattDetach($1) | 0; + _arDeleteHandle(HEAP32[$0 >> 2] | 0) | 0; + HEAP32[$0 >> 2] = 0; + } + $4 = $arc + 224 | 0; + if (HEAP32[$4 >> 2] | 0) { + _ar3DDeleteHandle($4) | 0; + HEAP32[$4 >> 2] = 0; + } + $7 = $arc + 192 | 0; + if (HEAP32[$7 >> 2] | 0) { + _arParamLTFree($7) | 0; + HEAP32[$7 >> 2] = 0; + } + return; +} + +function __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj4EEERAT__Kc($this, $s) { + $this = $this | 0; + $s = $s | 0; + var $0 = 0, $2 = 0; + HEAP8[$this >> 0] = 6; + $0 = $this + 1 | 0; + HEAP8[$0 >> 0] = HEAP8[$s >> 0] | 0; + HEAP8[$0 + 1 >> 0] = HEAP8[$s + 1 >> 0] | 0; + HEAP8[$0 + 2 >> 0] = HEAP8[$s + 2 >> 0] | 0; + HEAP8[$this + 4 >> 0] = 0; + $2 = $this + 12 | 0; + HEAP32[$2 >> 2] = 0; + HEAP32[$2 + 4 >> 2] = 0; + HEAP32[$2 + 8 >> 2] = 0; + return; +} + +function __ZNK10__cxxabiv117__class_type_info27has_unambiguous_public_baseEPNS_19__dynamic_cast_infoEPvi($this, $info, $adjustedPtr, $path_below) { + $this = $this | 0; + $info = $info | 0; + $adjustedPtr = $adjustedPtr | 0; + $path_below = $path_below | 0; + if (($this | 0) == (HEAP32[$info + 8 >> 2] | 0)) __ZNK10__cxxabiv117__class_type_info24process_found_base_classEPNS_19__dynamic_cast_infoEPvi(0, $info, $adjustedPtr, $path_below); + return; +} + +function ___muldsi3($a, $b) { + $a = $a | 0; + $b = $b | 0; + var $1 = 0, $2 = 0, $3 = 0, $6 = 0, $8 = 0, $11 = 0, $12 = 0; + $1 = $a & 65535; + $2 = $b & 65535; + $3 = Math_imul($2, $1) | 0; + $6 = $a >>> 16; + $8 = ($3 >>> 16) + (Math_imul($2, $6) | 0) | 0; + $11 = $b >>> 16; + $12 = Math_imul($11, $1) | 0; + return (tempRet0 = ($8 >>> 16) + (Math_imul($11, $6) | 0) + ((($8 & 65535) + $12 | 0) >>> 16) | 0, $8 + $12 << 16 | $3 & 65535 | 0) | 0; +} + +function _memmove(dest, src, num) { + dest = dest | 0; + src = src | 0; + num = num | 0; + var ret = 0; + if ((src | 0) < (dest | 0) & (dest | 0) < (src + num | 0)) { + ret = dest; + src = src + num | 0; + dest = dest + num | 0; + while ((num | 0) > 0) { + dest = dest - 1 | 0; + src = src - 1 | 0; + num = num - 1 | 0; + HEAP8[dest >> 0] = HEAP8[src >> 0] | 0; + } + dest = ret; + } else _memcpy(dest, src, num) | 0; + return dest | 0; +} + +function _arUtilGetPixelSize($arPixelFormat) { + $arPixelFormat = $arPixelFormat | 0; + var $$0 = 0; + switch ($arPixelFormat | 0) { + case 1: + case 0: + { + $$0 = 3; + break; + } + case 6: + case 4: + case 3: + case 2: + { + $$0 = 4; + break; + } + case 14: + case 13: + case 12: + case 5: + { + $$0 = 1; + break; + } + case 11: + case 10: + case 9: + case 8: + case 7: + { + $$0 = 2; + break; + } + default: + $$0 = 0; + } + return $$0 | 0; +} + +function _copysign($x, $y) { + $x = +$x; + $y = +$y; + var $0 = 0, $1 = 0, $6 = 0; + HEAPF64[tempDoublePtr >> 3] = $x; + $0 = HEAP32[tempDoublePtr >> 2] | 0; + $1 = HEAP32[tempDoublePtr + 4 >> 2] | 0; + HEAPF64[tempDoublePtr >> 3] = $y; + $6 = HEAP32[tempDoublePtr + 4 >> 2] & -2147483648 | $1 & 2147483647; + HEAP32[tempDoublePtr >> 2] = $0; + HEAP32[tempDoublePtr + 4 >> 2] = $6; + return +(+HEAPF64[tempDoublePtr >> 3]); +} + +function _arMatrixAlloc($row, $clm) { + $row = $row | 0; + $clm = $clm | 0; + var $$0 = 0, $0 = 0, $4 = 0; + $0 = _malloc(12) | 0; + do if (!$0) $$0 = 0; else { + $4 = _malloc(Math_imul($row << 3, $clm) | 0) | 0; + HEAP32[$0 >> 2] = $4; + if (!$4) { + _free($0); + $$0 = 0; + break; + } else { + HEAP32[$0 + 4 >> 2] = $row; + HEAP32[$0 + 8 >> 2] = $clm; + $$0 = $0; + break; + } + } while (0); + return $$0 | 0; +} + +function _ar3DCreateHandle2($cpara) { + $cpara = $cpara | 0; + var $$0 = 0, $0 = 0, $2 = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $0 = _malloc(4) | 0; + if (!$0) { + _arLog(3, 5471, sp); + _exit(1); + } + $2 = _icpCreateHandle($cpara) | 0; + HEAP32[$0 >> 2] = $2; + if (!$2) { + _free($0); + $$0 = 0; + } else $$0 = $0; + STACKTOP = sp; + return $$0 | 0; +} + +function ___fseeko($f, $off, $whence) { + $f = $f | 0; + $off = $off | 0; + $whence = $whence | 0; + var $5 = 0, $6 = 0, $phitmp = 0; + if ((HEAP32[$f + 76 >> 2] | 0) > -1) { + $phitmp = (___lockfile($f) | 0) == 0; + $5 = ___fseeko_unlocked($f, $off, $whence) | 0; + if ($phitmp) $6 = $5; else { + ___unlockfile($f); + $6 = $5; + } + } else $6 = ___fseeko_unlocked($f, $off, $whence) | 0; + return $6 | 0; +} + +function __GLOBAL__sub_I_ARToolKitJS_cpp() { + HEAP32[511] = 0; + HEAP32[512] = 0; + HEAP32[513] = 0; + HEAP32[514] = 0; + HEAPF32[515] = 1.0; + ___cxa_atexit(11, 2044, ___dso_handle | 0) | 0; + HEAP32[516] = 0; + HEAP32[517] = 0; + HEAP32[518] = 0; + HEAP32[519] = 0; + HEAPF32[520] = 1.0; + ___cxa_atexit(12, 2064, ___dso_handle | 0) | 0; + __ZN46EmscriptenBindingInitializer_constant_bindingsC2Ev(0); + return; +} + +function _arParamLTFree($paramLT_p) { + $paramLT_p = $paramLT_p | 0; + var $$0 = 0, $1 = 0; + if (!$paramLT_p) $$0 = -1; else { + $1 = HEAP32[$paramLT_p >> 2] | 0; + if (!$1) $$0 = -1; else { + _free(HEAP32[$1 + 184 >> 2] | 0); + _free(HEAP32[(HEAP32[$paramLT_p >> 2] | 0) + 188 >> 2] | 0); + _free(HEAP32[$paramLT_p >> 2] | 0); + HEAP32[$paramLT_p >> 2] = 0; + $$0 = 0; + } + } + return $$0 | 0; +} + +function ___uremdi3($a$0, $a$1, $b$0, $b$1) { + $a$0 = $a$0 | 0; + $a$1 = $a$1 | 0; + $b$0 = $b$0 | 0; + $b$1 = $b$1 | 0; + var $rem = 0, __stackBase__ = 0; + __stackBase__ = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + $rem = __stackBase__ | 0; + ___udivmoddi4($a$0, $a$1, $b$0, $b$1, $rem) | 0; + STACKTOP = __stackBase__; + return (tempRet0 = HEAP32[$rem + 4 >> 2] | 0, HEAP32[$rem >> 2] | 0) | 0; +} + +function _arDeleteHandle($handle) { + $handle = $handle | 0; + var $$0 = 0, $1 = 0, $2 = 0; + if (!$handle) $$0 = -1; else { + $1 = $handle + 7062408 | 0; + $2 = HEAP32[$1 >> 2] | 0; + if ($2) { + _arImageProcFinal($2); + HEAP32[$1 >> 2] = 0; + } + _free(HEAP32[$handle + 4834144 >> 2] | 0); + _free(HEAP32[$handle + 4834148 >> 2] | 0); + _free($handle); + $$0 = 0; + } + return $$0 | 0; +} + +function _llvm_cttz_i32(x) { + x = x | 0; + var ret = 0; + ret = HEAP8[cttz_i8 + (x & 255) >> 0] | 0; + if ((ret | 0) < 8) return ret | 0; + ret = HEAP8[cttz_i8 + (x >> 8 & 255) >> 0] | 0; + if ((ret | 0) < 8) return ret + 8 | 0; + ret = HEAP8[cttz_i8 + (x >> 16 & 255) >> 0] | 0; + if ((ret | 0) < 8) return ret + 16 | 0; + return (HEAP8[cttz_i8 + (x >>> 24) >> 0] | 0) + 24 | 0; +} + +function __ZN10__cxxabiv112_GLOBAL__N_15arenaILj4096EE8allocateEj($this, $n) { + $this = $this | 0; + $n = $n | 0; + var $$0 = 0, $1 = 0, $3 = 0, $4 = 0; + $1 = $n + 15 & -16; + $3 = $this + 4096 | 0; + $4 = HEAP32[$3 >> 2] | 0; + if (($this + 4096 - $4 | 0) >>> 0 < $1 >>> 0) $$0 = _malloc($1) | 0; else { + HEAP32[$3 >> 2] = $4 + $1; + $$0 = $4; + } + return $$0 | 0; +} + +function _snprintf($s, $n, $fmt, $varargs) { + $s = $s | 0; + $n = $n | 0; + $fmt = $fmt | 0; + $varargs = $varargs | 0; + var $0 = 0, $ap = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $ap = sp; + HEAP32[$ap >> 2] = $varargs; + $0 = _vsnprintf($s, $n, $fmt, $ap) | 0; + STACKTOP = sp; + return $0 | 0; +} + +function __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj18EEERAT__Kc($this, $s) { + $this = $this | 0; + $s = $s | 0; + var $0 = 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($this, $s, 17); + $0 = $this + 12 | 0; + HEAP32[$0 >> 2] = 0; + HEAP32[$0 + 4 >> 2] = 0; + HEAP32[$0 + 8 >> 2] = 0; + return; +} + +function __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj15EEERAT__Kc($this, $s) { + $this = $this | 0; + $s = $s | 0; + var $0 = 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($this, $s, 14); + $0 = $this + 12 | 0; + HEAP32[$0 >> 2] = 0; + HEAP32[$0 + 4 >> 2] = 0; + HEAP32[$0 + 8 >> 2] = 0; + return; +} + +function __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj14EEERAT__Kc($this, $s) { + $this = $this | 0; + $s = $s | 0; + var $0 = 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($this, $s, 13); + $0 = $this + 12 | 0; + HEAP32[$0 >> 2] = 0; + HEAP32[$0 + 4 >> 2] = 0; + HEAP32[$0 + 8 >> 2] = 0; + return; +} + +function __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj13EEERAT__Kc($this, $s) { + $this = $this | 0; + $s = $s | 0; + var $0 = 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($this, $s, 12); + $0 = $this + 12 | 0; + HEAP32[$0 >> 2] = 0; + HEAP32[$0 + 4 >> 2] = 0; + HEAP32[$0 + 8 >> 2] = 0; + return; +} + +function __ZN10__cxxabiv112_GLOBAL__N_111string_pairC2ILj12EEERAT__Kc($this, $s) { + $this = $this | 0; + $s = $s | 0; + var $0 = 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6__initEPKcj($this, $s, 11); + $0 = $this + 12 | 0; + HEAP32[$0 >> 2] = 0; + HEAP32[$0 + 4 >> 2] = 0; + HEAP32[$0 + 8 >> 2] = 0; + return; +} + +function __ZNSt3__113unordered_mapIi12arControllerNS_4hashIiEENS_8equal_toIiEENS_9allocatorINS_4pairIKiS1_EEEEED2Ev($this) { + $this = $this | 0; + __ZNSt3__112__hash_tableINS_17__hash_value_typeIi12arControllerEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEED2Ev($this); + return; +} + +function __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKc($this, $__pos, $__s) { + $this = $this | 0; + $__pos = $__pos | 0; + $__s = $__s | 0; + return __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKcj($this, $__pos, $__s, _strlen($__s) | 0) | 0; +} + +function ___shlim($f, $lim) { + $f = $f | 0; + $lim = $lim | 0; + var $4 = 0, $5 = 0, $7 = 0; + HEAP32[$f + 104 >> 2] = $lim; + $4 = HEAP32[$f + 4 >> 2] | 0; + $5 = HEAP32[$f + 8 >> 2] | 0; + $7 = $5 - $4 | 0; + HEAP32[$f + 108 >> 2] = $7; + if (($lim | 0) != 0 & ($7 | 0) > ($lim | 0)) HEAP32[$f + 100 >> 2] = $4 + $lim; else HEAP32[$f + 100 >> 2] = $5; + return; +} + +function ___stdio_close($f) { + $f = $f | 0; + var $3 = 0, $vararg_buffer = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $vararg_buffer = sp; + HEAP32[$vararg_buffer >> 2] = HEAP32[$f + 60 >> 2]; + $3 = ___syscall_ret(___syscall6(6, $vararg_buffer | 0) | 0) | 0; + STACKTOP = sp; + return $3 | 0; +} + +function __ZN10__cxxabiv112_GLOBAL__N_15arenaILj4096EE10deallocateEPcj($this, $p, $n) { + $this = $this | 0; + $p = $p | 0; + $n = $n | 0; + var $7 = 0; + if ($this >>> 0 <= $p >>> 0 & ($this + 4096 | 0) >>> 0 >= $p >>> 0) { + $7 = $this + 4096 | 0; + if (($p + ($n + 15 & -16) | 0) == (HEAP32[$7 >> 2] | 0)) HEAP32[$7 >> 2] = $p; + } else _free($p); + return; +} + +function _rewind($f) { + $f = $f | 0; + var $phitmp = 0; + if ((HEAP32[$f + 76 >> 2] | 0) > -1) { + $phitmp = (___lockfile($f) | 0) == 0; + ___fseeko_unlocked($f, 0, 0) | 0; + HEAP32[$f >> 2] = HEAP32[$f >> 2] & -33; + if (!$phitmp) ___unlockfile($f); + } else { + ___fseeko_unlocked($f, 0, 0) | 0; + HEAP32[$f >> 2] = HEAP32[$f >> 2] & -33; + } + return; +} + +function _arPattFree($pattHandle, $patno) { + $pattHandle = $pattHandle | 0; + $patno = $patno | 0; + var $$0 = 0, $2 = 0; + $2 = (HEAP32[$pattHandle + 8 >> 2] | 0) + ($patno << 2) | 0; + if (!(HEAP32[$2 >> 2] | 0)) $$0 = -1; else { + HEAP32[$2 >> 2] = 0; + HEAP32[$pattHandle >> 2] = (HEAP32[$pattHandle >> 2] | 0) + -1; + $$0 = 1; + } + return $$0 | 0; +} + +function __ZNSt3__113unordered_mapIi7ARParamNS_4hashIiEENS_8equal_toIiEENS_9allocatorINS_4pairIKiS1_EEEEED2Ev($this) { + $this = $this | 0; + __ZNSt3__112__hash_tableINS_17__hash_value_typeIi7ARParamEENS_22__unordered_map_hasherIiS3_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS3_NS_8equal_toIiEELb1EEENS_9allocatorIS3_EEED2Ev($this); + return; +} + +function _sn_write($f, $s, $l) { + $f = $f | 0; + $s = $s | 0; + $l = $l | 0; + var $2 = 0, $3 = 0, $6 = 0, $l$ = 0; + $2 = $f + 20 | 0; + $3 = HEAP32[$2 >> 2] | 0; + $6 = (HEAP32[$f + 16 >> 2] | 0) - $3 | 0; + $l$ = $6 >>> 0 > $l >>> 0 ? $l : $6; + _memcpy($3 | 0, $s | 0, $l$ | 0) | 0; + HEAP32[$2 >> 2] = (HEAP32[$2 >> 2] | 0) + $l$; + return $l | 0; +} + +function _ferror($f) { + $f = $f | 0; + var $$lobit = 0, $$lobit2 = 0, $phitmp = 0; + if ((HEAP32[$f + 76 >> 2] | 0) > -1) { + $phitmp = (___lockfile($f) | 0) == 0; + $$lobit = (HEAP32[$f >> 2] | 0) >>> 5 & 1; + if ($phitmp) $$lobit2 = $$lobit; else $$lobit2 = $$lobit; + } else $$lobit2 = (HEAP32[$f >> 2] | 0) >>> 5 & 1; + return $$lobit2 | 0; +} + +function ___memrchr($m, $c, $n) { + $m = $m | 0; + $c = $c | 0; + $n = $n | 0; + var $$0 = 0, $$01 = 0, $0 = 0, $3 = 0; + $0 = $c & 255; + $$01 = $n; + while (1) { + if (!$$01) { + $$0 = 0; + break; + } + $$01 = $$01 + -1 | 0; + $3 = $m + $$01 | 0; + if ((HEAP8[$3 >> 0] | 0) == $0 << 24 >> 24) { + $$0 = $3; + break; + } + } + return $$0 | 0; +} + +function __ZN10emscripten8internal11BindingTypeINSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEE12fromWireTypeEPNS9_Ut_E($agg$result, $v) { + $agg$result = $agg$result | 0; + $v = $v | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEPKcj($agg$result, $v + 4 | 0, HEAP32[$v >> 2] | 0); + return; +} + +function _arVecAlloc($clm) { + $clm = $clm | 0; + var $$0 = 0, $0 = 0, $3 = 0; + $0 = _malloc(8) | 0; + do if (!$0) $$0 = 0; else { + $3 = _malloc($clm << 3) | 0; + HEAP32[$0 >> 2] = $3; + if (!$3) { + _free($0); + $$0 = 0; + break; + } else { + HEAP32[$0 + 4 >> 2] = $clm; + $$0 = $0; + break; + } + } while (0); + return $$0 | 0; +} + +function _sscanf($s, $fmt, $varargs) { + $s = $s | 0; + $fmt = $fmt | 0; + $varargs = $varargs | 0; + var $0 = 0, $ap = 0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + $ap = sp; + HEAP32[$ap >> 2] = $varargs; + $0 = _vsscanf($s, $fmt, $ap) | 0; + STACKTOP = sp; + return $0 | 0; +} + +function _arPattAttach($arHandle, $arPattHandle) { + $arHandle = $arHandle | 0; + $arPattHandle = $arPattHandle | 0; + var $$0 = 0, $1 = 0; + if (!$arHandle) $$0 = -1; else { + $1 = $arHandle + 7062384 | 0; + if (!(HEAP32[$1 >> 2] | 0)) { + HEAP32[$1 >> 2] = $arPattHandle; + $$0 = 0; + } else $$0 = -1; + } + return $$0 | 0; +} + +function __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKc($this, $__s) { + $this = $this | 0; + $__s = $__s | 0; + return __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj($this, $__s, _strlen($__s) | 0) | 0; +} + +function __ZN10__cxxabiv112_GLOBAL__N_111string_pairD2Ev($this) { + $this = $this | 0; + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($this + 12 | 0); + __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($this); + return; +} + +function _arMatrixAllocTrans($source) { + $source = $source | 0; + var $$0 = 0, $4 = 0; + $4 = _arMatrixAlloc(HEAP32[$source + 8 >> 2] | 0, HEAP32[$source + 4 >> 2] | 0) | 0; + if (!$4) $$0 = 0; else if ((_arMatrixTrans($4, $source) | 0) < 0) { + _arMatrixFree($4) | 0; + $$0 = 0; + } else $$0 = $4; + return $$0 | 0; +} + +function _arMatrixAllocDup($source) { + $source = $source | 0; + var $$0 = 0, $4 = 0; + $4 = _arMatrixAlloc(HEAP32[$source + 4 >> 2] | 0, HEAP32[$source + 8 >> 2] | 0) | 0; + if (!$4) $$0 = 0; else if ((_arMatrixDup($4, $source) | 0) < 0) { + _arMatrixFree($4) | 0; + $$0 = 0; + } else $$0 = $4; + return $$0 | 0; +} + +function _arMatrixAllocMul($a, $b) { + $a = $a | 0; + $b = $b | 0; + var $$0 = 0, $4 = 0; + $4 = _arMatrixAlloc(HEAP32[$a + 4 >> 2] | 0, HEAP32[$b + 8 >> 2] | 0) | 0; + if (!$4) $$0 = 0; else if ((_arMatrixMul($4, $a, $b) | 0) < 0) { + _arMatrixFree($4) | 0; + $$0 = 0; + } else $$0 = $4; + return $$0 | 0; +} + +function _arGetTransMatMultiSquareRobust($handle, $marker_info, $marker_num, $config) { + $handle = $handle | 0; + $marker_info = $marker_info | 0; + $marker_num = $marker_num | 0; + $config = $config | 0; + return +(+_arGetTransMatMultiSquare2($handle, $marker_info, $marker_num, $config, 1)); +} + +function _arGetTransMatMultiSquare($handle, $marker_info, $marker_num, $config) { + $handle = $handle | 0; + $marker_info = $marker_info | 0; + $marker_num = $marker_num | 0; + $config = $config | 0; + return +(+_arGetTransMatMultiSquare2($handle, $marker_info, $marker_num, $config, 0)); +} + +function ___ftello($f) { + $f = $f | 0; + var $5 = 0, $6 = 0, $phitmp = 0; + if ((HEAP32[$f + 76 >> 2] | 0) > -1) { + $phitmp = (___lockfile($f) | 0) == 0; + $5 = ___ftello_unlocked($f) | 0; + if ($phitmp) $6 = $5; else $6 = $5; + } else $6 = ___ftello_unlocked($f) | 0; + return $6 | 0; +} + +function _arSetPattRatio($handle, $pattRatio) { + $handle = $handle | 0; + $pattRatio = +$pattRatio; + var $$0 = 0; + if (!$handle) $$0 = -1; else if ($pattRatio <= 0.0 | $pattRatio >= 1.0) $$0 = -1; else { + HEAPF64[$handle + 7062416 >> 3] = $pattRatio; + $$0 = 0; + } + return $$0 | 0; +} + +function _bitshift64Ashr(low, high, bits) { + low = low | 0; + high = high | 0; + bits = bits | 0; + if ((bits | 0) < 32) { + tempRet0 = high >> bits; + return low >>> bits | (high & (1 << bits) - 1) << 32 - bits; + } + tempRet0 = (high | 0) < 0 ? -1 : 0; + return high >> bits - 32 | 0; +} + +function _byteSwapInt($from, $to) { + $from = $from | 0; + $to = $to | 0; + HEAP8[$to >> 0] = HEAP8[$from + 3 >> 0] | 0; + HEAP8[$to + 1 >> 0] = HEAP8[$from + 2 >> 0] | 0; + HEAP8[$to + 2 >> 0] = HEAP8[$from + 1 >> 0] | 0; + HEAP8[$to + 3 >> 0] = HEAP8[$from >> 0] | 0; + return; +} + +function _arGetLabelingThreshMode($handle, $mode_p) { + $handle = $handle | 0; + $mode_p = $mode_p | 0; + var $$0 = 0; + if (($handle | 0) != 0 & ($mode_p | 0) != 0) { + HEAP32[$mode_p >> 2] = HEAP32[$handle + 7062388 >> 2]; + $$0 = 0; + } else $$0 = -1; + return $$0 | 0; +} + +function _bitshift64Shl(low, high, bits) { + low = low | 0; + high = high | 0; + bits = bits | 0; + if ((bits | 0) < 32) { + tempRet0 = high << bits | (low & (1 << bits) - 1 << 32 - bits) >>> 32 - bits; + return low << bits; + } + tempRet0 = low << bits - 32; + return 0; +} + +function _ar3DDeleteHandle($handle) { + $handle = $handle | 0; + var $$0 = 0, $0 = 0; + $0 = HEAP32[$handle >> 2] | 0; + if (!$0) $$0 = -1; else { + _icpDeleteHandle($0) | 0; + _free(HEAP32[$handle >> 2] | 0); + HEAP32[$handle >> 2] = 0; + $$0 = 0; + } + return $$0 | 0; +} + +function _arGetMatrixCodeType($handle, $type_p) { + $handle = $handle | 0; + $type_p = $type_p | 0; + var $$0 = 0; + if (($handle | 0) != 0 & ($type_p | 0) != 0) { + HEAP32[$type_p >> 2] = HEAP32[$handle + 7062424 >> 2]; + $$0 = 0; + } else $$0 = -1; + return $$0 | 0; +} + +function _bitshift64Lshr(low, high, bits) { + low = low | 0; + high = high | 0; + bits = bits | 0; + if ((bits | 0) < 32) { + tempRet0 = high >>> bits; + return low >>> bits | (high & (1 << bits) - 1) << 32 - bits; + } + tempRet0 = 0; + return high >>> bits - 32 | 0; +} + +function _arPattDetach($arHandle) { + $arHandle = $arHandle | 0; + var $$0 = 0, $1 = 0; + if (!$arHandle) $$0 = -1; else { + $1 = $arHandle + 7062384 | 0; + if (!(HEAP32[$1 >> 2] | 0)) $$0 = -1; else { + HEAP32[$1 >> 2] = 0; + $$0 = 0; + } + } + return $$0 | 0; +} + +function _arGetLabelingThresh($handle, $thresh) { + $handle = $handle | 0; + $thresh = $thresh | 0; + var $$0 = 0; + if (($handle | 0) != 0 & ($thresh | 0) != 0) { + HEAP32[$thresh >> 2] = HEAP32[$handle + 16 >> 2]; + $$0 = 0; + } else $$0 = -1; + return $$0 | 0; +} + +function __ZN10emscripten8functionIiJiNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEJEEEvPKcPFT_DpT0_EDpT1_($name, $fn) { + $name = $name | 0; + $fn = $fn | 0; + __embind_register_function($name | 0, 3, 2180, 10905, 12, $fn | 0); + return; +} + +function copyTempFloat(ptr) { + ptr = ptr | 0; + HEAP8[tempDoublePtr >> 0] = HEAP8[ptr >> 0]; + HEAP8[tempDoublePtr + 1 >> 0] = HEAP8[ptr + 1 >> 0]; + HEAP8[tempDoublePtr + 2 >> 0] = HEAP8[ptr + 2 >> 0]; + HEAP8[tempDoublePtr + 3 >> 0] = HEAP8[ptr + 3 >> 0]; +} + +function __ZN10emscripten8functionIiJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEJEEEvPKcPFT_DpT0_EDpT1_($name, $fn) { + $name = $name | 0; + $fn = $fn | 0; + __embind_register_function($name | 0, 2, 2160, 10800, 11, $fn | 0); + return; +} + +function dynCall_viiiiii(index, a1, a2, a3, a4, a5, a6) { + index = index | 0; + a1 = a1 | 0; + a2 = a2 | 0; + a3 = a3 | 0; + a4 = a4 | 0; + a5 = a5 | 0; + a6 = a6 | 0; + FUNCTION_TABLE_viiiiii[index & 3](a1 | 0, a2 | 0, a3 | 0, a4 | 0, a5 | 0, a6 | 0); +} + +function _arSetLabelingThresh($handle, $thresh) { + $handle = $handle | 0; + $thresh = $thresh | 0; + var $$0 = 0; + if (($handle | 0) == 0 | $thresh >>> 0 > 255) $$0 = -1; else { + HEAP32[$handle + 16 >> 2] = $thresh; + $$0 = 0; + } + return $$0 | 0; +} + +function _arGetLabelingMode($handle, $mode) { + $handle = $handle | 0; + $mode = $mode | 0; + var $$0 = 0; + if (($handle | 0) != 0 & ($mode | 0) != 0) { + HEAP32[$mode >> 2] = HEAP32[$handle + 12 >> 2]; + $$0 = 0; + } else $$0 = -1; + return $$0 | 0; +} + +function __ZN10emscripten8internal7InvokerIiJiiiEE6invokeEPFiiiiEiii($fn, $args, $args1, $args2) { + $fn = $fn | 0; + $args = $args | 0; + $args1 = $args1 | 0; + $args2 = $args2 | 0; + return FUNCTION_TABLE_iiii[$fn & 15]($args, $args1, $args2) | 0; +} + +function _arGetPattRatio($handle, $pattRatio) { + $handle = $handle | 0; + $pattRatio = $pattRatio | 0; + var $$0 = 0; + if (!$handle) $$0 = -1; else { + HEAPF64[$pattRatio >> 3] = +HEAPF64[$handle + 7062416 >> 3]; + $$0 = 0; + } + return $$0 | 0; +} + +function _arSetPatternDetectionMode($handle, $mode) { + $handle = $handle | 0; + $mode = $mode | 0; + var $$0 = 0; + if (($handle | 0) != 0 & $mode >>> 0 < 5) { + HEAP32[$handle + 24 >> 2] = $mode; + $$0 = 0; + } else $$0 = -1; + return $$0 | 0; +} + +function _arGetDebugMode($handle, $mode) { + $handle = $handle | 0; + $mode = $mode | 0; + var $$0 = 0; + if (($handle | 0) != 0 & ($mode | 0) != 0) { + HEAP32[$mode >> 2] = HEAP32[$handle >> 2]; + $$0 = 0; + } else $$0 = -1; + return $$0 | 0; +} + +function _icpSetInlierProbability($handle, $inlierProb) { + $handle = $handle | 0; + $inlierProb = +$inlierProb; + var $$0 = 0; + if (!$handle) $$0 = -1; else { + HEAPF64[$handle + 128 >> 3] = $inlierProb; + $$0 = 0; + } + return $$0 | 0; +} + +function _arSetImageProcMode($handle, $mode) { + $handle = $handle | 0; + $mode = $mode | 0; + var $$0 = 0; + if (($handle | 0) != 0 & $mode >>> 0 < 2) { + HEAP32[$handle + 20 >> 2] = $mode; + $$0 = 0; + } else $$0 = -1; + return $$0 | 0; +} + +function _arSetLabelingMode($handle, $mode) { + $handle = $handle | 0; + $mode = $mode | 0; + var $$0 = 0; + if (($handle | 0) != 0 & $mode >>> 0 < 2) { + HEAP32[$handle + 12 >> 2] = $mode; + $$0 = 0; + } else $$0 = -1; + return $$0 | 0; +} + +function __ZNK10__cxxabiv123__fundamental_type_info9can_catchEPKNS_16__shim_type_infoERPv($this, $thrown_type, $0) { + $this = $this | 0; + $thrown_type = $thrown_type | 0; + $0 = $0 | 0; + return ($this | 0) == ($thrown_type | 0) | 0; +} + +function runPostSets() {} +function _i64Subtract(a, b, c, d) { + a = a | 0; + b = b | 0; + c = c | 0; + d = d | 0; + var h = 0; + h = b - d >>> 0; + h = b - d - (c >>> 0 > a >>> 0 | 0) >>> 0; + return (tempRet0 = h, a - c >>> 0 | 0) | 0; +} + +function _arImageProcLumaHistAndCDFAndMedian($ipi, $dataPtr, $value_p) { + $ipi = $ipi | 0; + $dataPtr = $dataPtr | 0; + $value_p = $value_p | 0; + return _arImageProcLumaHistAndCDFAndPercentile($ipi, $dataPtr, .5, $value_p) | 0; +} + +function _arGetPatternDetectionMode($handle, $mode) { + $handle = $handle | 0; + $mode = $mode | 0; + var $$0 = 0; + if (!$handle) $$0 = -1; else { + HEAP32[$mode >> 2] = HEAP32[$handle + 24 >> 2]; + $$0 = 0; + } + return $$0 | 0; +} + +function ___strdup($s) { + $s = $s | 0; + var $$0 = 0, $1 = 0, $2 = 0; + $1 = (_strlen($s) | 0) + 1 | 0; + $2 = _malloc($1) | 0; + if (!$2) $$0 = 0; else { + _memcpy($2 | 0, $s | 0, $1 | 0) | 0; + $$0 = $2; + } + return $$0 | 0; +} + +function dynCall_viiiii(index, a1, a2, a3, a4, a5) { + index = index | 0; + a1 = a1 | 0; + a2 = a2 | 0; + a3 = a3 | 0; + a4 = a4 | 0; + a5 = a5 | 0; + FUNCTION_TABLE_viiiii[index & 3](a1 | 0, a2 | 0, a3 | 0, a4 | 0, a5 | 0); +} + +function _arGetImageProcMode($handle, $mode) { + $handle = $handle | 0; + $mode = $mode | 0; + var $$0 = 0; + if (!$handle) $$0 = -1; else { + HEAP32[$mode >> 2] = HEAP32[$handle + 20 >> 2]; + $$0 = 0; + } + return $$0 | 0; +} + +function _icpDeleteHandle($handle) { + $handle = $handle | 0; + var $$0 = 0, $0 = 0; + $0 = HEAP32[$handle >> 2] | 0; + if (!$0) $$0 = -1; else { + _free($0); + HEAP32[$handle >> 2] = 0; + $$0 = 0; + } + return $$0 | 0; +} + +function _arSetMatrixCodeType($handle, $type) { + $handle = $handle | 0; + $type = $type | 0; + var $$0 = 0; + if (!$handle) $$0 = -1; else { + HEAP32[$handle + 7062424 >> 2] = $type; + $$0 = 0; + } + return $$0 | 0; +} +function stackAlloc(size) { + size = size | 0; + var ret = 0; + ret = STACKTOP; + STACKTOP = STACKTOP + size | 0; + STACKTOP = STACKTOP + 15 & -16; + if ((STACKTOP | 0) >= (STACK_MAX | 0)) abort(); + return ret | 0; +} + +function __ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEED2Ev($this) { + $this = $this | 0; + if (HEAP8[$this >> 0] & 1) _free(HEAP32[$this + 8 >> 2] | 0); + return; +} + +function ___syscall_ret($r) { + $r = $r | 0; + var $$0 = 0, $2 = 0; + if ($r >>> 0 > 4294963200) { + $2 = ___errno_location() | 0; + HEAP32[$2 >> 2] = 0 - $r; + $$0 = -1; + } else $$0 = $r; + return $$0 | 0; +} + +function __ZN10emscripten8internal7InvokerIiJiiEE6invokeEPFiiiEii($fn, $args, $args1) { + $fn = $fn | 0; + $args = $args | 0; + $args1 = $args1 | 0; + return FUNCTION_TABLE_iii[$fn & 15]($args, $args1) | 0; +} + +function dynCall_iiiii(index, a1, a2, a3, a4) { + index = index | 0; + a1 = a1 | 0; + a2 = a2 | 0; + a3 = a3 | 0; + a4 = a4 | 0; + return FUNCTION_TABLE_iiiii[index & 1](a1 | 0, a2 | 0, a3 | 0, a4 | 0) | 0; +} + +function __ZN10emscripten8internal7InvokerIvJiiEE6invokeEPFviiEii($fn, $args, $args1) { + $fn = $fn | 0; + $args = $args | 0; + $args1 = $args1 | 0; + FUNCTION_TABLE_vii[$fn & 7]($args, $args1); + return; +} + +function __ZN10emscripten8internal7InvokerIvJifEE6invokeEPFvifEif($fn, $args, $args1) { + $fn = $fn | 0; + $args = $args | 0; + $args1 = +$args1; + FUNCTION_TABLE_vid[$fn & 3]($args, $args1); + return; +} + +function __ZN10emscripten8internal7InvokerIvJidEE6invokeEPFvidEid($fn, $args, $args1) { + $fn = $fn | 0; + $args = $args | 0; + $args1 = +$args1; + FUNCTION_TABLE_vid[$fn & 3]($args, $args1); + return; +} + +function _arImageProcFinal($ipi) { + $ipi = $ipi | 0; + if ($ipi) { + if (HEAP32[$ipi + 2076 >> 2] | 0) _free(HEAP32[$ipi >> 2] | 0); + _free(HEAP32[$ipi + 4 >> 2] | 0); + _free($ipi); + } + return; +} + +function __ZN10emscripten8functionIiJiiiEJEEEvPKcPFT_DpT0_EDpT1_($name, $fn) { + $name = $name | 0; + $fn = $fn | 0; + __embind_register_function($name | 0, 4, 2200, 10910, 1, $fn | 0); + return; +} + +function __ZN10emscripten8functionIiJiiEJEEEvPKcPFT_DpT0_EDpT1_($name, $fn) { + $name = $name | 0; + $fn = $fn | 0; + __embind_register_function($name | 0, 3, 2168, 10905, 13, $fn | 0); + return; +} + +function __ZN10emscripten8functionIvJiiEJEEEvPKcPFT_DpT0_EDpT1_($name, $fn) { + $name = $name | 0; + $fn = $fn | 0; + __embind_register_function($name | 0, 3, 2116, 10779, 1, $fn | 0); + return; +} + +function __ZN10emscripten8functionIvJifEJEEEvPKcPFT_DpT0_EDpT1_($name, $fn) { + $name = $name | 0; + $fn = $fn | 0; + __embind_register_function($name | 0, 3, 2104, 10774, 2, $fn | 0); + return; +} + +function __ZN10emscripten8functionIvJidEJEEEvPKcPFT_DpT0_EDpT1_($name, $fn) { + $name = $name | 0; + $fn = $fn | 0; + __embind_register_function($name | 0, 3, 2136, 10788, 1, $fn | 0); + return; +} + +function __ZN10emscripten8functionIiJiEJEEEvPKcPFT_DpT0_EDpT1_($name, $fn) { + $name = $name | 0; + $fn = $fn | 0; + __embind_register_function($name | 0, 2, 2192, 10800, 10, $fn | 0); + return; +} + +function dynCall_viiii(index, a1, a2, a3, a4) { + index = index | 0; + a1 = a1 | 0; + a2 = a2 | 0; + a3 = a3 | 0; + a4 = a4 | 0; + FUNCTION_TABLE_viiii[index & 3](a1 | 0, a2 | 0, a3 | 0, a4 | 0); +} + +function __ZN10emscripten8functionIvJiEJEEEvPKcPFT_DpT0_EDpT1_($name, $fn) { + $name = $name | 0; + $fn = $fn | 0; + __embind_register_function($name | 0, 2, 2152, 10796, 7, $fn | 0); + return; +} + +function __ZN10emscripten8functionIiJEJEEEvPKcPFT_DpT0_EDpT1_($name, $fn) { + $name = $name | 0; + $fn = $fn | 0; + __embind_register_function($name | 0, 1, 2148, 10793, 16, $fn | 0); + return; +} + +function __ZN10emscripten8functionIdJiEJEEEvPKcPFT_DpT0_EDpT1_($name, $fn) { + $name = $name | 0; + $fn = $fn | 0; + __embind_register_function($name | 0, 2, 2128, 10784, 1, $fn | 0); + return; +} + +function _icpGetXw2XcCleanup295($J_U_S, $dU, $E, $E2) { + $J_U_S = $J_U_S | 0; + $dU = $dU | 0; + $E = $E | 0; + $E2 = $E2 | 0; + _free($J_U_S); + _free($dU); + _free($E); + _free($E2); + return; +} + +function ___errno_location() { + var $$0 = 0, $3 = 0; + if (!(HEAP32[597] | 0)) $$0 = 2644; else { + $3 = (_pthread_self() | 0) + 60 | 0; + $$0 = HEAP32[$3 >> 2] | 0; + } + return $$0 | 0; +} + +function __ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev($this) { + $this = $this | 0; + if (HEAP8[$this >> 0] & 1) __ZdlPv(HEAP32[$this + 8 >> 2] | 0); + return; +} + +function _i64Add(a, b, c, d) { + a = a | 0; + b = b | 0; + c = c | 0; + d = d | 0; + var l = 0; + l = a + c >>> 0; + return (tempRet0 = b + d + (l >>> 0 < a >>> 0 | 0) >>> 0, l | 0) | 0; +} + +function __ZN10emscripten8constantIdEEvPKcRKT_($name, $v) { + $name = $name | 0; + $v = $v | 0; + __embind_register_constant($name | 0, 720, ~~+HEAPF64[$v >> 3] >>> 0 | 0); + return; +} + +function dynCall_iiii(index, a1, a2, a3) { + index = index | 0; + a1 = a1 | 0; + a2 = a2 | 0; + a3 = a3 | 0; + return FUNCTION_TABLE_iiii[index & 15](a1 | 0, a2 | 0, a3 | 0) | 0; +} + +function ___udivdi3($a$0, $a$1, $b$0, $b$1) { + $a$0 = $a$0 | 0; + $a$1 = $a$1 | 0; + $b$0 = $b$0 | 0; + $b$1 = $b$1 | 0; + return ___udivmoddi4($a$0, $a$1, $b$0, $b$1, 0) | 0; +} + +function _strchr($s, $c) { + $s = $s | 0; + $c = $c | 0; + var $0 = 0; + $0 = ___strchrnul($s, $c) | 0; + return ((HEAP8[$0 >> 0] | 0) == ($c & 255) << 24 >> 24 ? $0 : 0) | 0; +} + +function __ZN10emscripten8constantIiEEvPKcRKT_($name, $v) { + $name = $name | 0; + $v = $v | 0; + __embind_register_constant($name | 0, 680, HEAP32[$v >> 2] | 0); + return; +} + +function dynCall_viii(index, a1, a2, a3) { + index = index | 0; + a1 = a1 | 0; + a2 = a2 | 0; + a3 = a3 | 0; + FUNCTION_TABLE_viii[index & 1](a1 | 0, a2 | 0, a3 | 0); +} + +function __ZN10emscripten8internal7InvokerIiJiEE6invokeEPFiiEi($fn, $args) { + $fn = $fn | 0; + $args = $args | 0; + return FUNCTION_TABLE_ii[$fn & 31]($args) | 0; +} + +function __ZN10emscripten8internal7InvokerIdJiEE6invokeEPFdiEi($fn, $args) { + $fn = $fn | 0; + $args = $args | 0; + return +(+FUNCTION_TABLE_di[$fn & 3]($args)); +} + +function __ZN10emscripten8internal7InvokerIvJiEE6invokeEPFviEi($fn, $args) { + $fn = $fn | 0; + $args = $args | 0; + FUNCTION_TABLE_vi[$fn & 15]($args); + return; +} + +function _compE($a, $b) { + $a = $a | 0; + $b = $b | 0; + var $2 = 0.0; + $2 = +HEAPF64[$a >> 3] - +HEAPF64[$b >> 3]; + return ($2 < 0.0 ? -1 : $2 > 0.0 & 1) | 0; +} + +function dynCall_viid(index, a1, a2, a3) { + index = index | 0; + a1 = a1 | 0; + a2 = a2 | 0; + a3 = +a3; + FUNCTION_TABLE_viid[index & 3](a1 | 0, a2 | 0, +a3); +} + +function _isxdigit($c) { + $c = $c | 0; + var $4 = 0; + if (($c + -48 | 0) >>> 0 < 10) $4 = 1; else $4 = (($c | 32) + -97 | 0) >>> 0 < 6; + return $4 & 1 | 0; +} + +function establishStackSpace(stackBase, stackMax) { + stackBase = stackBase | 0; + stackMax = stackMax | 0; + STACKTOP = stackBase; + STACK_MAX = stackMax; +} + +function __ZN12_GLOBAL__N_1L20register_memory_viewItEEvPKc($name) { + $name = $name | 0; + __embind_register_memory_view(512, 3, $name | 0); + return; +} + +function __ZN12_GLOBAL__N_1L20register_memory_viewIsEEvPKc($name) { + $name = $name | 0; + __embind_register_memory_view(520, 2, $name | 0); + return; +} + +function __ZN12_GLOBAL__N_1L20register_memory_viewIjEEvPKc($name) { + $name = $name | 0; + __embind_register_memory_view(496, 5, $name | 0); + return; +} + +function __ZN12_GLOBAL__N_1L20register_memory_viewIiEEvPKc($name) { + $name = $name | 0; + __embind_register_memory_view(504, 4, $name | 0); + return; +} + +function __ZN12_GLOBAL__N_1L20register_memory_viewIhEEvPKc($name) { + $name = $name | 0; + __embind_register_memory_view(528, 1, $name | 0); + return; +} + +function __ZN12_GLOBAL__N_1L20register_memory_viewIaEEvPKc($name) { + $name = $name | 0; + __embind_register_memory_view(536, 0, $name | 0); + return; +} + +function __ZNKSt3__121__basic_string_commonILb1EE20__throw_out_of_rangeEv($this) { + $this = $this | 0; + ___assert_fail(14152, 12528, 1175, 14181); +} + +function __ZNKSt3__121__basic_string_commonILb1EE20__throw_length_errorEv($this) { + $this = $this | 0; + ___assert_fail(12499, 12528, 1164, 12463); +} + +function dynCall_iii(index, a1, a2) { + index = index | 0; + a1 = a1 | 0; + a2 = a2 | 0; + return FUNCTION_TABLE_iii[index & 15](a1 | 0, a2 | 0) | 0; +} + +function b13(p0, p1, p2, p3, p4, p5) { + p0 = p0 | 0; + p1 = p1 | 0; + p2 = p2 | 0; + p3 = p3 | 0; + p4 = p4 | 0; + p5 = p5 | 0; + nullFunc_viiiiii(13); +} + +function _wctomb($s, $wc) { + $s = $s | 0; + $wc = $wc | 0; + var $$0 = 0; + if (!$s) $$0 = 0; else $$0 = _wcrtomb($s, $wc, 0) | 0; + return $$0 | 0; +} + +function __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv($this) { + $this = $this | 0; + ___assert_fail(12352, 12375, 303, 12463); +} + +function dynCall_dii(index, a1, a2) { + index = index | 0; + a1 = a1 | 0; + a2 = a2 | 0; + return +FUNCTION_TABLE_dii[index & 1](a1 | 0, a2 | 0); +} + +function setThrew(threw, value) { + threw = threw | 0; + value = value | 0; + if (!__THREW__) { + __THREW__ = threw; + threwValue = value; + } +} + +function _fseek($f, $off, $whence) { + $f = $f | 0; + $off = $off | 0; + $whence = $whence | 0; + return ___fseeko($f, $off, $whence) | 0; +} + +function dynCall_vii(index, a1, a2) { + index = index | 0; + a1 = a1 | 0; + a2 = a2 | 0; + FUNCTION_TABLE_vii[index & 7](a1 | 0, a2 | 0); +} + +function _mbsinit($st) { + $st = $st | 0; + var $4 = 0; + if (!$st) $4 = 1; else $4 = (HEAP32[$st >> 2] | 0) == 0; + return $4 & 1 | 0; +} + +function _do_read($f, $buf, $len) { + $f = $f | 0; + $buf = $buf | 0; + $len = $len | 0; + return ___string_read($f, $buf, $len) | 0; +} + +function dynCall_vid(index, a1, a2) { + index = index | 0; + a1 = a1 | 0; + a2 = +a2; + FUNCTION_TABLE_vid[index & 3](a1 | 0, +a2); +} + +function b1(p0, p1, p2, p3, p4) { + p0 = p0 | 0; + p1 = p1 | 0; + p2 = p2 | 0; + p3 = p3 | 0; + p4 = p4 | 0; + nullFunc_viiiii(1); +} + +function _arMultiFreeConfig($config) { + $config = $config | 0; + _free(HEAP32[$config >> 2] | 0); + _free($config); + return 0; +} + +function __ZN10emscripten8internal7InvokerIiJEE6invokeEPFivE($fn) { + $fn = $fn | 0; + return FUNCTION_TABLE_i[$fn & 1]() | 0; +} + +function _icpGetXw2XcCleanup($J_U_S, $dU) { + $J_U_S = $J_U_S | 0; + $dU = $dU | 0; + _free($J_U_S); + _free($dU); + return; +} + +function b12(p0, p1, p2, p3) { + p0 = p0 | 0; + p1 = p1 | 0; + p2 = p2 | 0; + p3 = p3 | 0; + nullFunc_iiiii(12); + return 0; +} + +function _strncpy($d, $s, $n) { + $d = $d | 0; + $s = $s | 0; + $n = $n | 0; + ___stpncpy($d, $s, $n) | 0; + return $d | 0; +} + +function dynCall_ii(index, a1) { + index = index | 0; + a1 = a1 | 0; + return FUNCTION_TABLE_ii[index & 31](a1 | 0) | 0; +} + +function _strcpy($dest, $src) { + $dest = $dest | 0; + $src = $src | 0; + ___stpcpy($dest, $src) | 0; + return $dest | 0; +} + +function __GLOBAL__sub_I_bind_cpp() { + __ZN53EmscriptenBindingInitializer_native_and_builtin_typesC2Ev(0); + return; +} + +function _strrchr($s, $c) { + $s = $s | 0; + $c = $c | 0; + return ___memrchr($s, $c, (_strlen($s) | 0) + 1 | 0) | 0; +} + +function _ar3DCreateHandle($arParam) { + $arParam = $arParam | 0; + return _ar3DCreateHandle2($arParam + 8 | 0) | 0; +} + +function dynCall_di(index, a1) { + index = index | 0; + a1 = a1 | 0; + return +FUNCTION_TABLE_di[index & 3](a1 | 0); +} + +function _fputs($s, $f) { + $s = $s | 0; + $f = $f | 0; + return (_fwrite($s, _strlen($s) | 0, 1, $f) | 0) + -1 | 0; +} + +function __ZSt15get_new_handlerv() { + var $0 = 0; + $0 = HEAP32[559] | 0; + HEAP32[559] = $0 + 0; + return $0 | 0; +} + +function _arMatrixFree($m) { + $m = $m | 0; + if ($m) { + _free(HEAP32[$m >> 2] | 0); + _free($m); + } + return 0; +} + +function __ZN10__cxxabiv123__fundamental_type_infoD0Ev($this) { + $this = $this | 0; + __ZdlPv($this); + return; +} + +function b15(p0, p1, p2, p3) { + p0 = p0 | 0; + p1 = p1 | 0; + p2 = p2 | 0; + p3 = p3 | 0; + nullFunc_viiii(15); +} + +function __ZN10__cxxabiv121__vmi_class_type_infoD0Ev($this) { + $this = $this | 0; + __ZdlPv($this); + return; +} + +function dynCall_vi(index, a1) { + index = index | 0; + a1 = a1 | 0; + FUNCTION_TABLE_vi[index & 15](a1 | 0); +} + +function __ZN10__cxxabiv120__si_class_type_infoD0Ev($this) { + $this = $this | 0; + __ZdlPv($this); + return; +} + +function __ZN10__cxxabiv117__class_type_infoD0Ev($this) { + $this = $this | 0; + __ZdlPv($this); + return; +} + +function _cleanup392($p) { + $p = $p | 0; + if (!(HEAP32[$p + 68 >> 2] | 0)) ___unlockfile($p); + return; +} + +function _cleanup387($p) { + $p = $p | 0; + if (!(HEAP32[$p + 68 >> 2] | 0)) ___unlockfile($p); + return; +} + +function b0(p0, p1, p2) { + p0 = p0 | 0; + p1 = p1 | 0; + p2 = p2 | 0; + nullFunc_iiii(0); + return 0; +} + +function _isspace($c) { + $c = $c | 0; + return (($c | 0) == 32 | ($c + -9 | 0) >>> 0 < 5) & 1 | 0; +} + +function ___getTypeName($ti) { + $ti = $ti | 0; + return ___strdup(HEAP32[$ti + 4 >> 2] | 0) | 0; +} + +function _arVecFree($v) { + $v = $v | 0; + _free(HEAP32[$v >> 2] | 0); + _free($v); + return 0; +} + +function dynCall_i(index) { + index = index | 0; + return FUNCTION_TABLE_i[index & 1]() | 0; +} + +function __ZNK10__cxxabiv116__shim_type_info5noop2Ev($this) { + $this = $this | 0; + return; +} + +function __ZNK10__cxxabiv116__shim_type_info5noop1Ev($this) { + $this = $this | 0; + return; +} + +function b9(p0, p1, p2) { + p0 = p0 | 0; + p1 = p1 | 0; + p2 = p2 | 0; + nullFunc_viii(9); +} + +function b11(p0, p1, p2) { + p0 = p0 | 0; + p1 = p1 | 0; + p2 = +p2; + nullFunc_viid(11); +} + +function _setLogLevel($level) { + $level = $level | 0; + HEAP32[496] = $level; + return; +} + +function __ZN10__cxxabiv116__shim_type_infoD2Ev($this) { + $this = $this | 0; + return; +} + +function __ZNSt9bad_allocD0Ev($this) { + $this = $this | 0; + __ZdlPv($this); + return; +} + +function _copysignl($x, $y) { + $x = +$x; + $y = +$y; + return +(+_copysign($x, $y)); +} + +function _scalbnl($x, $n) { + $x = +$x; + $n = $n | 0; + return +(+_scalbn($x, $n)); +} + +function b2(p0, p1) { + p0 = p0 | 0; + p1 = p1 | 0; + nullFunc_dii(2); + return 0.0; +} + +function b14(p0, p1) { + p0 = p0 | 0; + p1 = p1 | 0; + nullFunc_iii(14); + return 0; +} + +function dynCall_v(index) { + index = index | 0; + FUNCTION_TABLE_v[index & 0](); +} + +function _frexpl($x, $e) { + $x = +$x; + $e = $e | 0; + return +(+_frexp($x, $e)); +} + +function __ZNKSt9bad_alloc4whatEv($this) { + $this = $this | 0; + return 12484; +} + +function _isupper($c) { + $c = $c | 0; + return ($c + -65 | 0) >>> 0 < 26 | 0; +} + +function _fmodl($x, $y) { + $x = +$x; + $y = +$y; + return +(+_fmod($x, $y)); +} + +function _arPattCreateHandle() { + return _arPattCreateHandle2(16, 50) | 0; +} + +function setTempRet0(value) { + value = value | 0; + tempRet0 = value; +} + +function b7(p0, p1) { + p0 = p0 | 0; + p1 = p1 | 0; + nullFunc_vii(7); +} + +function __ZNSt9type_infoD2Ev($this) { + $this = $this | 0; + return; +} + +function __ZNSt9exceptionD2Ev($this) { + $this = $this | 0; + return; +} + +function __ZNSt9bad_allocD2Ev($this) { + $this = $this | 0; + return; +} + +function __ZdlPv($ptr) { + $ptr = $ptr | 0; + _free($ptr); + return; +} + +function b3(p0, p1) { + p0 = p0 | 0; + p1 = +p1; + nullFunc_vid(3); +} + +function _ftell($f) { + $f = $f | 0; + return ___ftello($f) | 0; +} + +function stackRestore(top) { + top = top | 0; + STACKTOP = top; +} + +function b4(p0) { + p0 = p0 | 0; + nullFunc_di(4); + return 0.0; +} + +function b8(p0) { + p0 = p0 | 0; + nullFunc_ii(8); + return 0; +} + +function ___unlockfile($f) { + $f = $f | 0; + return; +} + +function ___lockfile($f) { + $f = $f | 0; + return 0; +} + +function _getLogLevel() { + return HEAP32[496] | 0; +} + +function b6(p0) { + p0 = p0 | 0; + nullFunc_vi(6); +} + +function getTempRet0() { + return tempRet0 | 0; +} + +function stackSave() { + return STACKTOP | 0; +} + +function b5() { + nullFunc_i(5); + return 0; +} + +function b10() { + nullFunc_v(10); +} + +// EMSCRIPTEN_END_FUNCS +var FUNCTION_TABLE_iiii = [b0,__ZNK10__cxxabiv123__fundamental_type_info9can_catchEPKNS_16__shim_type_infoERPv,__ZNK10__cxxabiv117__class_type_info9can_catchEPKNS_16__shim_type_infoERPv,_sn_write,___stdio_write,___stdio_seek,___stdout_write,_setup,_setMarkerInfoDir,_getTransMatSquare,_getTransMatSquareCont,_getMultiEachMarkerInfo,__ZN10emscripten8internal7InvokerIiJiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEEE6invokeEPFiiS8_EiPNS0_11BindingTypeIS8_EUt_E,__ZN10emscripten8internal7InvokerIiJiiEE6invokeEPFiiiEii,___stdio_read,_do_read]; +var FUNCTION_TABLE_viiiii = [b1,__ZNK10__cxxabiv117__class_type_info16search_below_dstEPNS_19__dynamic_cast_infoEPKvib,__ZNK10__cxxabiv120__si_class_type_info16search_below_dstEPNS_19__dynamic_cast_infoEPKvib,__ZNK10__cxxabiv121__vmi_class_type_info16search_below_dstEPNS_19__dynamic_cast_infoEPKvib]; +var FUNCTION_TABLE_dii = [b2,__ZN10emscripten8internal7InvokerIdJiEE6invokeEPFdiEi]; +var FUNCTION_TABLE_vid = [b3,_setProjectionNearPlane,_setProjectionFarPlane,_setPattRatio]; +var FUNCTION_TABLE_di = [b4,_getProjectionNearPlane,_getProjectionFarPlane,_getPattRatio]; +var FUNCTION_TABLE_i = [b5,_getLogLevel]; +var FUNCTION_TABLE_vi = [b6,__ZNSt9bad_allocD2Ev,__ZNSt9bad_allocD0Ev,__ZN10__cxxabiv116__shim_type_infoD2Ev,__ZN10__cxxabiv123__fundamental_type_infoD0Ev,__ZNK10__cxxabiv116__shim_type_info5noop1Ev,__ZNK10__cxxabiv116__shim_type_info5noop2Ev,__ZN10__cxxabiv117__class_type_infoD0Ev,__ZN10__cxxabiv120__si_class_type_infoD0Ev,__ZN10__cxxabiv121__vmi_class_type_infoD0Ev,_setLogLevel,__ZNSt3__113unordered_mapIi12arControllerNS_4hashIiEENS_8equal_toIiEENS_9allocatorINS_4pairIKiS1_EEEEED2Ev,__ZNSt3__113unordered_mapIi7ARParamNS_4hashIiEENS_8equal_toIiEENS_9allocatorINS_4pairIKiS1_EEEEED2Ev,_cleanup387,_cleanup392,b6]; +var FUNCTION_TABLE_vii = [b7,_setThresholdMode,_setThreshold,_setPatternDetectionMode,_setMatrixCodeType,_setLabelingMode,_setImageProcMode,__ZN10emscripten8internal7InvokerIvJiEE6invokeEPFviEi]; +var FUNCTION_TABLE_ii = [b8,__ZNKSt9bad_alloc4whatEv,___stdio_close,_teardown,_getMultiMarkerCount,_loadCamera,_detectMarker,_getMarkerNum,_getDebugMode,_getProcessingImage,_getThresholdMode,_getThreshold,_getPatternDetectionMode,_getMatrixCodeType,_getLabelingMode,_getImageProcMode,__ZN10emscripten8internal7InvokerIiJEE6invokeEPFivE,b8,b8,b8,b8,b8,b8,b8,b8,b8,b8,b8,b8 +,b8,b8,b8]; +var FUNCTION_TABLE_viii = [b9,__ZN10emscripten8internal7InvokerIvJiiEE6invokeEPFviiEii]; +var FUNCTION_TABLE_v = [b10]; +var FUNCTION_TABLE_viid = [b11,__ZN10emscripten8internal7InvokerIvJidEE6invokeEPFvidEid,__ZN10emscripten8internal7InvokerIvJifEE6invokeEPFvifEif,b11]; +var FUNCTION_TABLE_iiiii = [b12,__ZN10emscripten8internal7InvokerIiJiiiEE6invokeEPFiiiiEiii]; +var FUNCTION_TABLE_viiiiii = [b13,__ZNK10__cxxabiv117__class_type_info16search_above_dstEPNS_19__dynamic_cast_infoEPKvS4_ib,__ZNK10__cxxabiv120__si_class_type_info16search_above_dstEPNS_19__dynamic_cast_infoEPKvS4_ib,__ZNK10__cxxabiv121__vmi_class_type_info16search_above_dstEPNS_19__dynamic_cast_infoEPKvS4_ib]; +var FUNCTION_TABLE_iii = [b14,_compE,_addMarker,_addMultiMarker,_getMultiMarkerNum,_setMarkerInfoVertex,_getTransMatMultiSquare,_getTransMatMultiSquareRobust,_getMarkerInfo,_setDebugMode,__ZN10emscripten8internal7InvokerIiJiEE6invokeEPFiiEi,__ZN10emscripten8internal7InvokerIiJNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEEE6invokeEPFiS8_EPNS0_11BindingTypeIS8_EUt_E,b14,b14,b14,b14]; +var FUNCTION_TABLE_viiii = [b15,__ZNK10__cxxabiv117__class_type_info27has_unambiguous_public_baseEPNS_19__dynamic_cast_infoEPvi,__ZNK10__cxxabiv120__si_class_type_info27has_unambiguous_public_baseEPNS_19__dynamic_cast_infoEPvi,__ZNK10__cxxabiv121__vmi_class_type_info27has_unambiguous_public_baseEPNS_19__dynamic_cast_infoEPvi]; + + return { _malloc: _malloc, _i64Subtract: _i64Subtract, _fflush: _fflush, _i64Add: _i64Add, _memmove: _memmove, _memset: _memset, ___cxa_demangle: ___cxa_demangle, _memcpy: _memcpy, ___getTypeName: ___getTypeName, _bitshift64Lshr: _bitshift64Lshr, _free: _free, ___errno_location: ___errno_location, _bitshift64Shl: _bitshift64Shl, __GLOBAL__sub_I_ARToolKitJS_cpp: __GLOBAL__sub_I_ARToolKitJS_cpp, __GLOBAL__sub_I_bind_cpp: __GLOBAL__sub_I_bind_cpp, runPostSets: runPostSets, _emscripten_replace_memory: _emscripten_replace_memory, stackAlloc: stackAlloc, stackSave: stackSave, stackRestore: stackRestore, establishStackSpace: establishStackSpace, setThrew: setThrew, setTempRet0: setTempRet0, getTempRet0: getTempRet0, dynCall_iiii: dynCall_iiii, dynCall_viiiii: dynCall_viiiii, dynCall_dii: dynCall_dii, dynCall_vid: dynCall_vid, dynCall_di: dynCall_di, dynCall_i: dynCall_i, dynCall_vi: dynCall_vi, dynCall_vii: dynCall_vii, dynCall_ii: dynCall_ii, dynCall_viii: dynCall_viii, dynCall_v: dynCall_v, dynCall_viid: dynCall_viid, dynCall_iiiii: dynCall_iiiii, dynCall_viiiiii: dynCall_viiiiii, dynCall_iii: dynCall_iii, dynCall_viiii: dynCall_viiii }; +}) +// EMSCRIPTEN_END_ASM +(Module.asmGlobalArg, Module.asmLibraryArg, buffer); +var real____cxa_demangle = asm["___cxa_demangle"]; asm["___cxa_demangle"] = function() { +assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); +assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); +return real____cxa_demangle.apply(null, arguments); +}; + +var real__i64Subtract = asm["_i64Subtract"]; asm["_i64Subtract"] = function() { +assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); +assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); +return real__i64Subtract.apply(null, arguments); +}; + +var real___GLOBAL__sub_I_bind_cpp = asm["__GLOBAL__sub_I_bind_cpp"]; asm["__GLOBAL__sub_I_bind_cpp"] = function() { +assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); +assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); +return real___GLOBAL__sub_I_bind_cpp.apply(null, arguments); +}; + +var real__fflush = asm["_fflush"]; asm["_fflush"] = function() { +assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); +assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); +return real__fflush.apply(null, arguments); +}; + +var real___GLOBAL__sub_I_ARToolKitJS_cpp = asm["__GLOBAL__sub_I_ARToolKitJS_cpp"]; asm["__GLOBAL__sub_I_ARToolKitJS_cpp"] = function() { +assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); +assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); +return real___GLOBAL__sub_I_ARToolKitJS_cpp.apply(null, arguments); +}; + +var real__i64Add = asm["_i64Add"]; asm["_i64Add"] = function() { +assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); +assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); +return real__i64Add.apply(null, arguments); +}; + +var real__memmove = asm["_memmove"]; asm["_memmove"] = function() { +assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); +assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); +return real__memmove.apply(null, arguments); +}; + +var real__malloc = asm["_malloc"]; asm["_malloc"] = function() { +assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); +assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); +return real__malloc.apply(null, arguments); +}; + +var real____getTypeName = asm["___getTypeName"]; asm["___getTypeName"] = function() { +assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); +assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); +return real____getTypeName.apply(null, arguments); +}; + +var real__bitshift64Lshr = asm["_bitshift64Lshr"]; asm["_bitshift64Lshr"] = function() { +assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); +assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); +return real__bitshift64Lshr.apply(null, arguments); +}; + +var real__free = asm["_free"]; asm["_free"] = function() { +assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); +assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); +return real__free.apply(null, arguments); +}; + +var real____errno_location = asm["___errno_location"]; asm["___errno_location"] = function() { +assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); +assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); +return real____errno_location.apply(null, arguments); +}; + +var real__bitshift64Shl = asm["_bitshift64Shl"]; asm["_bitshift64Shl"] = function() { +assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); +assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); +return real__bitshift64Shl.apply(null, arguments); +}; +var ___cxa_demangle = Module["___cxa_demangle"] = asm["___cxa_demangle"]; +var _i64Subtract = Module["_i64Subtract"] = asm["_i64Subtract"]; +var __GLOBAL__sub_I_bind_cpp = Module["__GLOBAL__sub_I_bind_cpp"] = asm["__GLOBAL__sub_I_bind_cpp"]; +var _fflush = Module["_fflush"] = asm["_fflush"]; +var __GLOBAL__sub_I_ARToolKitJS_cpp = Module["__GLOBAL__sub_I_ARToolKitJS_cpp"] = asm["__GLOBAL__sub_I_ARToolKitJS_cpp"]; +var _i64Add = Module["_i64Add"] = asm["_i64Add"]; +var _memmove = Module["_memmove"] = asm["_memmove"]; +var _memset = Module["_memset"] = asm["_memset"]; +var runPostSets = Module["runPostSets"] = asm["runPostSets"]; +var _malloc = Module["_malloc"] = asm["_malloc"]; +var _memcpy = Module["_memcpy"] = asm["_memcpy"]; +var ___getTypeName = Module["___getTypeName"] = asm["___getTypeName"]; +var _bitshift64Lshr = Module["_bitshift64Lshr"] = asm["_bitshift64Lshr"]; +var _free = Module["_free"] = asm["_free"]; +var _emscripten_replace_memory = Module["_emscripten_replace_memory"] = asm["_emscripten_replace_memory"]; +var ___errno_location = Module["___errno_location"] = asm["___errno_location"]; +var _bitshift64Shl = Module["_bitshift64Shl"] = asm["_bitshift64Shl"]; +var dynCall_iiii = Module["dynCall_iiii"] = asm["dynCall_iiii"]; +var dynCall_viiiii = Module["dynCall_viiiii"] = asm["dynCall_viiiii"]; +var dynCall_dii = Module["dynCall_dii"] = asm["dynCall_dii"]; +var dynCall_vid = Module["dynCall_vid"] = asm["dynCall_vid"]; +var dynCall_di = Module["dynCall_di"] = asm["dynCall_di"]; +var dynCall_i = Module["dynCall_i"] = asm["dynCall_i"]; +var dynCall_vi = Module["dynCall_vi"] = asm["dynCall_vi"]; +var dynCall_vii = Module["dynCall_vii"] = asm["dynCall_vii"]; +var dynCall_ii = Module["dynCall_ii"] = asm["dynCall_ii"]; +var dynCall_viii = Module["dynCall_viii"] = asm["dynCall_viii"]; +var dynCall_v = Module["dynCall_v"] = asm["dynCall_v"]; +var dynCall_viid = Module["dynCall_viid"] = asm["dynCall_viid"]; +var dynCall_iiiii = Module["dynCall_iiiii"] = asm["dynCall_iiiii"]; +var dynCall_viiiiii = Module["dynCall_viiiiii"] = asm["dynCall_viiiiii"]; +var dynCall_iii = Module["dynCall_iii"] = asm["dynCall_iii"]; +var dynCall_viiii = Module["dynCall_viiii"] = asm["dynCall_viiii"]; +; + +Runtime.stackAlloc = asm['stackAlloc']; +Runtime.stackSave = asm['stackSave']; +Runtime.stackRestore = asm['stackRestore']; +Runtime.establishStackSpace = asm['establishStackSpace']; + +Runtime.setTempRet0 = asm['setTempRet0']; +Runtime.getTempRet0 = asm['getTempRet0']; + + + +// === Auto-generated postamble setup entry stuff === + + +function ExitStatus(status) { + this.name = "ExitStatus"; + this.message = "Program terminated with exit(" + status + ")"; + this.status = status; +}; +ExitStatus.prototype = new Error(); +ExitStatus.prototype.constructor = ExitStatus; + +var initialStackTop; +var preloadStartTime = null; +var calledMain = false; + +dependenciesFulfilled = function runCaller() { + // If run has never been called, and we should call run (INVOKE_RUN is true, and Module.noInitialRun is not false) + if (!Module['calledRun']) run(); + if (!Module['calledRun']) dependenciesFulfilled = runCaller; // try this again later, after new deps are fulfilled +} + +Module['callMain'] = Module.callMain = function callMain(args) { + assert(runDependencies == 0, 'cannot call main when async dependencies remain! (listen on __ATMAIN__)'); + assert(__ATPRERUN__.length == 0, 'cannot call main when preRun functions remain to be called'); + + args = args || []; + + ensureInitRuntime(); + + var argc = args.length+1; + function pad() { + for (var i = 0; i < 4-1; i++) { + argv.push(0); + } + } + var argv = [allocate(intArrayFromString(Module['thisProgram']), 'i8', ALLOC_NORMAL) ]; + pad(); + for (var i = 0; i < argc-1; i = i + 1) { + argv.push(allocate(intArrayFromString(args[i]), 'i8', ALLOC_NORMAL)); + pad(); + } + argv.push(0); + argv = allocate(argv, 'i32', ALLOC_NORMAL); + + + try { + + var ret = Module['_main'](argc, argv, 0); + + + // if we're not running an evented main loop, it's time to exit + exit(ret, /* implicit = */ true); + } + catch(e) { + if (e instanceof ExitStatus) { + // exit() throws this once it's done to make sure execution + // has been stopped completely + return; + } else if (e == 'SimulateInfiniteLoop') { + // running an evented main loop, don't immediately exit + Module['noExitRuntime'] = true; + return; + } else { + if (e && typeof e === 'object' && e.stack) Module.printErr('exception thrown: ' + [e, e.stack]); + throw e; + } + } finally { + calledMain = true; + } +} + + + + +function run(args) { + args = args || Module['arguments']; + + if (preloadStartTime === null) preloadStartTime = Date.now(); + + if (runDependencies > 0) { + Module.printErr('run() called, but dependencies remain, so not running'); + return; + } + + preRun(); + + if (runDependencies > 0) return; // a preRun added a dependency, run will be called later + if (Module['calledRun']) return; // run may have just been called through dependencies being fulfilled just in this very frame + + function doRun() { + if (Module['calledRun']) return; // run may have just been called while the async setStatus time below was happening + Module['calledRun'] = true; + + if (ABORT) return; + + ensureInitRuntime(); + + preMain(); + + if (ENVIRONMENT_IS_WEB && preloadStartTime !== null) { + Module.printErr('pre-main prep time: ' + (Date.now() - preloadStartTime) + ' ms'); + } + + if (Module['onRuntimeInitialized']) Module['onRuntimeInitialized'](); + + if (Module['_main'] && shouldRunNow) Module['callMain'](args); + + postRun(); + } + + if (Module['setStatus']) { + Module['setStatus']('Running...'); + setTimeout(function() { + setTimeout(function() { + Module['setStatus'](''); + }, 1); + doRun(); + }, 1); + } else { + doRun(); + } +} +Module['run'] = Module.run = run; + +function exit(status, implicit) { + if (implicit && Module['noExitRuntime']) { + Module.printErr('exit(' + status + ') implicitly called by end of main(), but noExitRuntime, so not exiting the runtime (you can use emscripten_force_exit, if you want to force a true shutdown)'); + return; + } + + if (Module['noExitRuntime']) { + Module.printErr('exit(' + status + ') called, but noExitRuntime, so halting execution but not exiting the runtime or preventing further async execution (you can use emscripten_force_exit, if you want to force a true shutdown)'); + } else { + + ABORT = true; + EXITSTATUS = status; + STACKTOP = initialStackTop; + + exitRuntime(); + + if (Module['onExit']) Module['onExit'](status); + } + + if (ENVIRONMENT_IS_NODE) { + // Work around a node.js bug where stdout buffer is not flushed at process exit: + // Instead of process.exit() directly, wait for stdout flush event. + // See https://github.com/joyent/node/issues/1669 and https://github.com/kripken/emscripten/issues/2582 + // Workaround is based on https://github.com/RReverser/acorn/commit/50ab143cecc9ed71a2d66f78b4aec3bb2e9844f6 + process['stdout']['once']('drain', function () { + process['exit'](status); + }); + console.log(' '); // Make sure to print something to force the drain event to occur, in case the stdout buffer was empty. + // Work around another node bug where sometimes 'drain' is never fired - make another effort + // to emit the exit status, after a significant delay (if node hasn't fired drain by then, give up) + setTimeout(function() { + process['exit'](status); + }, 500); + } else + if (ENVIRONMENT_IS_SHELL && typeof quit === 'function') { + quit(status); + } + // if we reach here, we must throw an exception to halt the current execution + throw new ExitStatus(status); +} +Module['exit'] = Module.exit = exit; + +var abortDecorators = []; + +function abort(what) { + if (what !== undefined) { + Module.print(what); + Module.printErr(what); + what = JSON.stringify(what) + } else { + what = ''; + } + + ABORT = true; + EXITSTATUS = 1; + + var extra = ''; + + var output = 'abort(' + what + ') at ' + stackTrace() + extra; + if (abortDecorators) { + abortDecorators.forEach(function(decorator) { + output = decorator(output, what); + }); + } + throw output; +} +Module['abort'] = Module.abort = abort; + +// {{PRE_RUN_ADDITIONS}} + +if (Module['preInit']) { + if (typeof Module['preInit'] == 'function') Module['preInit'] = [Module['preInit']]; + while (Module['preInit'].length > 0) { + Module['preInit'].pop()(); + } +} + +// shouldRunNow refers to calling main(), not run(). +var shouldRunNow = true; +if (Module['noInitialRun']) { + shouldRunNow = false; +} + + +run(); + +// {{POST_RUN_ADDITIONS}} + + + + + + +// {{MODULE_ADDITIONS}} + + + + + + diff --git a/1_Three.js/6_AR/jsartoolkit5/artoolkit.min.js b/1_Three.js/6_AR/jsartoolkit5/artoolkit.min.js new file mode 100755 index 0000000000000000000000000000000000000000..cac6a6d9566149b7e24551748194355c7ac6a58f --- /dev/null +++ b/1_Three.js/6_AR/jsartoolkit5/artoolkit.min.js @@ -0,0 +1,18 @@ +((function(){"use strict";var ARController=(function(width,height,camera){var id;var w=width,h=height;this.orientation="landscape";this.listeners={};if(typeof width!=="number"){var image=width;camera=height;w=image.videoWidth||image.width;h=image.videoHeight||image.height;this.image=image}this.defaultMarkerWidth=1;this.patternMarkers={};this.barcodeMarkers={};this.transform_mat=new Float32Array(16);this.canvas=document.createElement("canvas");this.canvas.width=w;this.canvas.height=h;this.ctx=this.canvas.getContext("2d");this.videoWidth=w;this.videoHeight=h;if(typeof camera==="string"){var self=this;this.cameraParam=new ARCameraParam(camera,(function(){self._initialize()}),(function(err){console.error("ARController: Failed to load ARCameraParam",err)}))}else{this.cameraParam=camera;this._initialize()}});ARController.prototype.dispose=(function(){artoolkit.teardown(this.id);for(var t in this){this[t]=null}});ARController.prototype.process=(function(image){this.detectMarker(image);var markerNum=this.getMarkerNum();var k,o;for(k in this.patternMarkers){o=this.patternMarkers[k];o.inPrevious=o.inCurrent;o.inCurrent=false}for(k in this.barcodeMarkers){o=this.barcodeMarkers[k];o.inPrevious=o.inCurrent;o.inCurrent=false}for(var i=0;i<markerNum;i++){var markerInfo=this.getMarker(i);var markerType=artoolkit.UNKNOWN_MARKER;var visible=this.trackPatternMarkerId(-1);if(markerInfo.idPatt>-1&&(markerInfo.id===markerInfo.idPatt||markerInfo.idMatrix===-1)){visible=this.trackPatternMarkerId(markerInfo.idPatt);markerType=artoolkit.PATTERN_MARKER;if(markerInfo.dir!==markerInfo.dirPatt){this.setMarkerInfoDir(i,markerInfo.dirPatt)}}else if(markerInfo.idMatrix>-1){visible=this.trackBarcodeMarkerId(markerInfo.idMatrix);markerType=artoolkit.BARCODE_MARKER;if(markerInfo.dir!==markerInfo.dirMatrix){this.setMarkerInfoDir(i,markerInfo.dirMatrix)}}if(markerType!==artoolkit.UNKNOWN_MARKER&&visible.inPrevious){this.getTransMatSquareCont(i,visible.markerWidth,visible.matrix,visible.matrix)}else{this.getTransMatSquare(i,visible.markerWidth,visible.matrix)}visible.inCurrent=true;this.transMatToGLMat(visible.matrix,this.transform_mat);this.dispatchEvent({name:"getMarker",target:this,data:{index:i,type:markerType,marker:markerInfo,matrix:this.transform_mat}})}var multiMarkerCount=this.getMultiMarkerCount();for(var i=0;i<multiMarkerCount;i++){var subMarkerCount=this.getMultiMarkerPatternCount(i);var visible=false;artoolkit.getTransMatMultiSquareRobust(this.id,i);this.transMatToGLMat(this.marker_transform_mat,this.transform_mat);for(var j=0;j<subMarkerCount;j++){var multiEachMarkerInfo=this.getMultiEachMarker(i,j);if(multiEachMarkerInfo.visible>=0){visible=true;this.dispatchEvent({name:"getMultiMarker",target:this,data:{multiMarkerId:i,matrix:this.transform_mat}});break}}if(visible){for(var j=0;j<subMarkerCount;j++){var multiEachMarkerInfo=this.getMultiEachMarker(i,j);this.transMatToGLMat(this.marker_transform_mat,this.transform_mat);this.dispatchEvent({name:"getMultiMarkerSub",target:this,data:{multiMarkerId:i,markerIndex:j,marker:multiEachMarkerInfo,matrix:this.transform_mat}})}}}if(this._bwpointer){this.debugDraw()}});ARController.prototype.trackPatternMarkerId=(function(id,markerWidth){var obj=this.patternMarkers[id];if(!obj){this.patternMarkers[id]=obj={inPrevious:false,inCurrent:false,matrix:new Float32Array(12),markerWidth:markerWidth||this.defaultMarkerWidth}}if(markerWidth){obj.markerWidth=markerWidth}return obj});ARController.prototype.trackBarcodeMarkerId=(function(id,markerWidth){var obj=this.barcodeMarkers[id];if(!obj){this.barcodeMarkers[id]=obj={inPrevious:false,inCurrent:false,matrix:new Float32Array(12),markerWidth:markerWidth||this.defaultMarkerWidth}}if(markerWidth){obj.markerWidth=markerWidth}return obj});ARController.prototype.getMultiMarkerCount=(function(){return artoolkit.getMultiMarkerCount(this.id)});ARController.prototype.getMultiMarkerPatternCount=(function(multiMarkerId){return artoolkit.getMultiMarkerNum(this.id,multiMarkerId)});ARController.prototype.addEventListener=(function(name,callback){if(!this.listeners[name]){this.listeners[name]=[]}this.listeners[name].push(callback)});ARController.prototype.removeEventListener=(function(name,callback){if(this.listeners[name]){var index=this.listeners[name].indexOf(callback);if(index>-1){this.listeners[name].splice(index,1)}}});ARController.prototype.dispatchEvent=(function(event){var listeners=this.listeners[event.name];if(listeners){for(var i=0;i<listeners.length;i++){listeners[i].call(this,event)}}});ARController.prototype.debugSetup=(function(){document.body.appendChild(this.canvas);this.setDebugMode(1);this._bwpointer=this.getProcessingImage()});ARController.prototype.loadMarker=(function(markerURL,onSuccess,onError){return artoolkit.addMarker(this.id,markerURL,onSuccess,onError)});ARController.prototype.loadMultiMarker=(function(markerURL,onSuccess,onError){return artoolkit.addMultiMarker(this.id,markerURL,onSuccess,onError)});ARController.prototype.getTransMatSquare=(function(markerIndex,markerWidth,dst){artoolkit.getTransMatSquare(this.id,markerIndex,markerWidth);dst.set(this.marker_transform_mat);return dst});ARController.prototype.getTransMatSquareCont=(function(markerIndex,markerWidth,previousMarkerTransform,dst){this.marker_transform_mat.set(previousMarkerTransform);artoolkit.getTransMatSquareCont(this.id,markerIndex,markerWidth);dst.set(this.marker_transform_mat);return dst});ARController.prototype.getTransMatMultiSquare=(function(multiMarkerId,dst){artoolkit.getTransMatMultiSquare(this.id,multiMarkerId);dst.set(this.marker_transform_mat);return dst});ARController.prototype.getTransMatMultiSquareRobust=(function(multiMarkerId,dst){artoolkit.getTransMatMultiSquare(this.id,multiMarkerId);dst.set(this.marker_transform_mat);return dst});ARController.prototype.transMatToGLMat=(function(transMat,glMat,scale){glMat[0+0*4]=transMat[0];glMat[0+1*4]=transMat[1];glMat[0+2*4]=transMat[2];glMat[0+3*4]=transMat[3];glMat[1+0*4]=transMat[4];glMat[1+1*4]=transMat[5];glMat[1+2*4]=transMat[6];glMat[1+3*4]=transMat[7];glMat[2+0*4]=transMat[8];glMat[2+1*4]=transMat[9];glMat[2+2*4]=transMat[10];glMat[2+3*4]=transMat[11];glMat[3+0*4]=0;glMat[3+1*4]=0;glMat[3+2*4]=0;glMat[3+3*4]=1;if(scale!=undefined&&scale!==0){glMat[12]*=scale;glMat[13]*=scale;glMat[14]*=scale}return glMat});ARController.prototype.detectMarker=(function(image){if(this._copyImageToHeap(image)){return artoolkit.detectMarker(this.id)}return-99});ARController.prototype.getMarkerNum=(function(){return artoolkit.getMarkerNum(this.id)});ARController.prototype.getMarker=(function(markerIndex){if(0===artoolkit.getMarker(this.id,markerIndex)){return artoolkit.markerInfo}});ARController.prototype.setMarkerInfoVertex=(function(markerIndex,vertexData){for(var i=0;i<vertexData.length;i++){this.marker_transform_mat[i*2+0]=vertexData[i][0];this.marker_transform_mat[i*2+1]=vertexData[i][1]}return artoolkit.setMarkerInfoVertex(this.id,markerIndex)});ARController.prototype.cloneMarkerInfo=(function(markerInfo){return JSON.parse(JSON.stringify(markerInfo))});ARController.prototype.getMultiEachMarker=(function(multiMarkerId,markerIndex){if(0===artoolkit.getMultiEachMarker(this.id,multiMarkerId,markerIndex)){return artoolkit.multiEachMarkerInfo}});ARController.prototype.getTransformationMatrix=(function(){return this.transform_mat});ARController.prototype.getCameraMatrix=(function(){return this.camera_mat});ARController.prototype.getMarkerTransformationMatrix=(function(){return this.marker_transform_mat});ARController.prototype.setDebugMode=(function(mode){return artoolkit.setDebugMode(this.id,mode)});ARController.prototype.getDebugMode=(function(){return artoolkit.getDebugMode(this.id)});ARController.prototype.getProcessingImage=(function(){return artoolkit.getProcessingImage(this.id)});ARController.prototype.setLogLevel=(function(mode){return artoolkit.setLogLevel(mode)});ARController.prototype.getLogLevel=(function(){return artoolkit.getLogLevel()});ARController.prototype.setMarkerInfoDir=(function(markerIndex,dir){return artoolkit.setMarkerInfoDir(this.id,markerIndex,dir)});ARController.prototype.setProjectionNearPlane=(function(value){return artoolkit.setProjectionNearPlane(this.id,value)});ARController.prototype.getProjectionNearPlane=(function(){return artoolkit.getProjectionNearPlane(this.id)});ARController.prototype.setProjectionFarPlane=(function(value){return artoolkit.setProjectionFarPlane(this.id,value)});ARController.prototype.getProjectionFarPlane=(function(){return artoolkit.getProjectionFarPlane(this.id)});ARController.prototype.setThresholdMode=(function(mode){return artoolkit.setThresholdMode(this.id,mode)});ARController.prototype.getThresholdMode=(function(){return artoolkit.getThresholdMode(this.id)});ARController.prototype.setThreshold=(function(threshold){return artoolkit.setThreshold(this.id,threshold)});ARController.prototype.getThreshold=(function(){return artoolkit.getThreshold(this.id)});ARController.prototype.setPatternDetectionMode=(function(value){return artoolkit.setPatternDetectionMode(this.id,value)});ARController.prototype.getPatternDetectionMode=(function(){return artoolkit.getPatternDetectionMode(this.id)});ARController.prototype.setMatrixCodeType=(function(value){return artoolkit.setMatrixCodeType(this.id,value)});ARController.prototype.getMatrixCodeType=(function(){return artoolkit.getMatrixCodeType(this.id)});ARController.prototype.setLabelingMode=(function(value){return artoolkit.setLabelingMode(this.id,value)});ARController.prototype.getLabelingMode=(function(){return artoolkit.getLabelingMode(this.id)});ARController.prototype.setPattRatio=(function(value){return artoolkit.setPattRatio(this.id,value)});ARController.prototype.getPattRatio=(function(){return artoolkit.getPattRatio(this.id)});ARController.prototype.setImageProcMode=(function(value){return artoolkit.setImageProcMode(this.id,value)});ARController.prototype.getImageProcMode=(function(){return artoolkit.getImageProcMode(this.id)});ARController.prototype.debugDraw=(function(){var debugBuffer=new Uint8ClampedArray(Module.HEAPU8.buffer,this._bwpointer,this.framesize);var id=new ImageData(debugBuffer,this.canvas.width,this.canvas.height);this.ctx.putImageData(id,0,0);var marker_num=this.getMarkerNum();for(var i=0;i<marker_num;i++){this._debugMarker(this.getMarker(i))}});ARController.prototype._initialize=(function(){this.id=artoolkit.setup(this.canvas.width,this.canvas.height,this.cameraParam.id);var params=artoolkit.frameMalloc;this.framepointer=params.framepointer;this.framesize=params.framesize;this.dataHeap=new Uint8Array(Module.HEAPU8.buffer,this.framepointer,this.framesize);this.camera_mat=new Float64Array(Module.HEAPU8.buffer,params.camera,16);this.marker_transform_mat=new Float64Array(Module.HEAPU8.buffer,params.transform,12);this.setProjectionNearPlane(.1);this.setProjectionFarPlane(1e3);var self=this;setTimeout((function(){if(self.onload){self.onload()}self.dispatchEvent({name:"load",target:self})}),1)});ARController.prototype._copyImageToHeap=(function(image){if(!image){image=this.image}this.ctx.save();if(this.orientation==="portrait"){this.ctx.translate(this.canvas.width,0);this.ctx.rotate(Math.PI/2);this.ctx.drawImage(image,0,0,this.canvas.height,this.canvas.width)}else{this.ctx.drawImage(image,0,0,this.canvas.width,this.canvas.height)}this.ctx.restore();var imageData=this.ctx.getImageData(0,0,this.canvas.width,this.canvas.height);var data=imageData.data;if(this.dataHeap){this.dataHeap.set(data);return true}return false});ARController.prototype._debugMarker=(function(marker){var vertex,pos;vertex=marker.vertex;var ctx=this.ctx;ctx.strokeStyle="red";ctx.beginPath();ctx.moveTo(vertex[0][0],vertex[0][1]);ctx.lineTo(vertex[1][0],vertex[1][1]);ctx.stroke();ctx.beginPath();ctx.moveTo(vertex[2][0],vertex[2][1]);ctx.lineTo(vertex[3][0],vertex[3][1]);ctx.stroke();ctx.strokeStyle="green";ctx.beginPath();ctx.lineTo(vertex[1][0],vertex[1][1]);ctx.lineTo(vertex[2][0],vertex[2][1]);ctx.stroke();ctx.beginPath();ctx.moveTo(vertex[3][0],vertex[3][1]);ctx.lineTo(vertex[0][0],vertex[0][1]);ctx.stroke();pos=marker.pos;ctx.beginPath();ctx.arc(pos[0],pos[1],8,0,Math.PI*2);ctx.fillStyle="red";ctx.fill()});ARController.getUserMedia=(function(configuration){var facing=configuration.facingMode||"environment";var onSuccess=configuration.onSuccess;var onError=configuration.onError||(function(err){console.error("ARController.getUserMedia",err)});var video=document.createElement("video");var initProgress=(function(){if(this.videoWidth!==0){onSuccess(video)}});var readyToPlay=false;var eventNames=["touchstart","touchend","touchmove","touchcancel","click","mousedown","mouseup","mousemove","keydown","keyup","keypress","scroll"];var play=(function(ev){if(readyToPlay){video.play();if(!video.paused){eventNames.forEach((function(eventName){window.removeEventListener(eventName,play,true)}))}}});eventNames.forEach((function(eventName){window.addEventListener(eventName,play,true)}));var success=(function(stream){video.addEventListener("loadedmetadata",initProgress,false);video.src=window.URL.createObjectURL(stream);readyToPlay=true;play()});var constraints={};var mediaDevicesConstraints={};if(configuration.width){mediaDevicesConstraints.width=configuration.width;if(typeof configuration.width==="object"){if(configuration.width.max){constraints.maxWidth=configuration.width.max}if(configuration.width.min){constraints.minWidth=configuration.width.max}}else{constraints.maxWidth=configuration.width}}if(configuration.height){mediaDevicesConstraints.height=configuration.height;if(typeof configuration.height==="object"){if(configuration.height.max){constraints.maxHeight=configuration.height.max}if(configuration.height.min){constraints.minHeight=configuration.height.max}}else{constraints.maxHeight=configuration.height}}mediaDevicesConstraints.facingMode=facing;navigator.getUserMedia=navigator.getUserMedia||navigator.webkitGetUserMedia||navigator.mozGetUserMedia||navigator.msGetUserMedia;var hdConstraints={audio:false,video:{mandatory:constraints}};if(false){if(navigator.mediaDevices){navigator.mediaDevices.getUserMedia({audio:false,video:mediaDevicesConstraints}).then(success,onError)}else{MediaStreamTrack.getSources((function(sources){var facingDir=mediaDevicesConstraints.facingMode;if(facing&&facing.exact){facingDir=facing.exact}for(var i=0;i<sources.length;i++){if(sources[i].kind==="video"&&sources[i].facing===facingDir){hdConstraints.video.mandatory.sourceId=sources[i].id;break}}if(facing&&facing.exact&&!hdConstraints.video.mandatory.sourceId){onError("Failed to get camera facing the wanted direction")}else{if(navigator.getUserMedia){navigator.getUserMedia(hdConstraints,success,onError)}else{onError("navigator.getUserMedia is not supported on your browser")}}}))}}else{if(navigator.getUserMedia){navigator.getUserMedia(hdConstraints,success,onError)}else{onError("navigator.getUserMedia is not supported on your browser")}}return video});ARController.getUserMediaARController=(function(configuration){var obj={};for(var i in configuration){obj[i]=configuration[i]}var onSuccess=configuration.onSuccess;var cameraParamURL=configuration.cameraParam;obj.onSuccess=(function(){new ARCameraParam(cameraParamURL,(function(){var arCameraParam=this;var maxSize=configuration.maxARVideoSize||Math.max(video.videoWidth,video.videoHeight);var f=maxSize/Math.max(video.videoWidth,video.videoHeight);var w=f*video.videoWidth;var h=f*video.videoHeight;if(video.videoWidth<video.videoHeight){var tmp=w;w=h;h=tmp}var arController=new ARController(w,h,arCameraParam);arController.image=video;if(video.videoWidth<video.videoHeight){arController.orientation="portrait";arController.videoWidth=video.videoHeight;arController.videoHeight=video.videoWidth}else{arController.orientation="landscape";arController.videoWidth=video.videoWidth;arController.videoHeight=video.videoHeight}onSuccess(arController,arCameraParam)}),(function(err){console.error("ARController: Failed to load ARCameraParam",err)}))});var video=this.getUserMedia(obj);return video});var ARCameraParam=(function(src,onload,onerror){this.id=-1;this._src="";this.complete=false;this.onload=onload;this.onerror=onerror;if(src){this.load(src)}});ARCameraParam.prototype.load=(function(src){if(this._src!==""){throw"ARCameraParam: Trying to load camera parameters twice."}this._src=src;if(src){var self=this;artoolkit.loadCamera(src,(function(id){self.id=id;self.complete=true;self.onload()}),(function(err){self.onerror(err)}))}});Object.defineProperty(ARCameraParam.prototype,"src",{set:(function(src){this.load(src)}),get:(function(){return this._src})});ARCameraParam.prototype.dispose=(function(){if(this.id!==-1){artoolkit.deleteCamera(this.id)}this.id=-1;this._src="";this.complete=false});var artoolkit={UNKNOWN_MARKER:-1,PATTERN_MARKER:0,BARCODE_MARKER:1,loadCamera:loadCamera,addMarker:addMarker,addMultiMarker:addMultiMarker};var FUNCTIONS=["setup","teardown","setLogLevel","getLogLevel","setDebugMode","getDebugMode","getProcessingImage","setMarkerInfoDir","setMarkerInfoVertex","getTransMatSquare","getTransMatSquareCont","getTransMatMultiSquare","getTransMatMultiSquareRobust","getMultiMarkerNum","getMultiMarkerCount","detectMarker","getMarkerNum","getMarker","getMultiEachMarker","setProjectionNearPlane","getProjectionNearPlane","setProjectionFarPlane","getProjectionFarPlane","setThresholdMode","getThresholdMode","setThreshold","getThreshold","setPatternDetectionMode","getPatternDetectionMode","setMatrixCodeType","getMatrixCodeType","setLabelingMode","getLabelingMode","setPattRatio","getPattRatio","setImageProcMode","getImageProcMode"];function runWhenLoaded(){FUNCTIONS.forEach((function(n){artoolkit[n]=Module[n]}));for(var m in Module){if(m.match(/^AR/))artoolkit[m]=Module[m]}}var marker_count=0;function addMarker(arId,url,callback){var filename="/marker_"+marker_count++;ajax(url,filename,(function(){var id=Module._addMarker(arId,filename);if(callback)callback(id)}))}function bytesToString(array){return String.fromCharCode.apply(String,array)}function parseMultiFile(bytes){var str=bytesToString(bytes);var lines=str.split("\n");var files=[];var state=0;var markers=0;lines.forEach((function(line){line=line.trim();if(!line||line.startsWith("#"))return;switch(state){case 0:markers=+line;state=1;return;case 1:if(!line.match(/^\d+$/)){files.push(line)};case 2:case 3:case 4:state++;return;case 5:state=1;return}}));return files}var multi_marker_count=0;function addMultiMarker(arId,url,callback){var filename="/multi_marker_"+multi_marker_count++;ajax(url,filename,(function(bytes){var files=parseMultiFile(bytes);function ok(){var markerID=Module._addMultiMarker(arId,filename);var markerNum=Module.getMultiMarkerNum(arId,markerID);if(callback)callback(markerID,markerNum)}if(!files.length)return ok();var path=url.split("/").slice(0,-1).join("/");files=files.map((function(file){return[path+"/"+file,file]}));ajaxDependencies(files,ok)}))}var camera_count=0;function loadCamera(url,callback){var filename="/camera_param_"+camera_count++;var writeCallback=(function(){var id=Module._loadCamera(filename);if(callback)callback(id)});if(typeof url==="object"){writeByteArrayToFS(filename,url,writeCallback)}else if(url.indexOf("\n")>-1){writeStringToFS(filename,url,writeCallback)}else{ajax(url,filename,writeCallback)}}function writeStringToFS(target,string,callback){var byteArray=new Uint8Array(string.length);for(var i=0;i<byteArray.length;i++){byteArray[i]=string.charCodeAt(i)&255}writeByteArrayToFS(target,byteArray,callback)}function writeByteArrayToFS(target,byteArray,callback){FS.writeFile(target,byteArray,{encoding:"binary"});callback(byteArray)}function ajax(url,target,callback){var oReq=new XMLHttpRequest;oReq.open("GET",url,true);oReq.responseType="arraybuffer";oReq.onload=(function(oEvent){var arrayBuffer=oReq.response;var byteArray=new Uint8Array(arrayBuffer);writeByteArrayToFS(target,byteArray,callback)});oReq.send()}function ajaxDependencies(files,callback){var next=files.pop();if(next){ajax(next[0],next[1],(function(){ajaxDependencies(files,callback)}))}else{callback()}}window.artoolkit=artoolkit;window.ARController=ARController;window.ARCameraParam=ARCameraParam;if(window.Module){runWhenLoaded()}else{window.Module={onRuntimeInitialized:(function(){runWhenLoaded()})}}}))();var Module;if(!Module)Module=(typeof Module!=="undefined"?Module:null)||{};var moduleOverrides={};for(var key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var ENVIRONMENT_IS_WEB=typeof window==="object";var ENVIRONMENT_IS_WORKER=typeof importScripts==="function";var ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof require==="function"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;var ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;if(ENVIRONMENT_IS_NODE){if(!Module["print"])Module["print"]=function print(x){process["stdout"].write(x+"\n")};if(!Module["printErr"])Module["printErr"]=function printErr(x){process["stderr"].write(x+"\n")};var nodeFS=require("fs");var nodePath=require("path");Module["read"]=function read(filename,binary){filename=nodePath["normalize"](filename);var ret=nodeFS["readFileSync"](filename);if(!ret&&filename!=nodePath["resolve"](filename)){filename=path.join(__dirname,"..","src",filename);ret=nodeFS["readFileSync"](filename)}if(ret&&!binary)ret=ret.toString();return ret};Module["readBinary"]=function readBinary(filename){var ret=Module["read"](filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};Module["load"]=function load(f){globalEval(read(f))};if(!Module["thisProgram"]){if(process["argv"].length>1){Module["thisProgram"]=process["argv"][1].replace(/\\/g,"/")}else{Module["thisProgram"]="unknown-program"}}Module["arguments"]=process["argv"].slice(2);if(typeof module!=="undefined"){module["exports"]=Module}process["on"]("uncaughtException",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));Module["inspect"]=(function(){return"[Emscripten Module object]"})}else if(ENVIRONMENT_IS_SHELL){if(!Module["print"])Module["print"]=print;if(typeof printErr!="undefined")Module["printErr"]=printErr;if(typeof read!="undefined"){Module["read"]=read}else{Module["read"]=function read(){throw"no read() available (jsc?)"}}Module["readBinary"]=function readBinary(f){if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}var data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){Module["arguments"]=scriptArgs}else if(typeof arguments!="undefined"){Module["arguments"]=arguments}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){Module["read"]=function read(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(typeof arguments!="undefined"){Module["arguments"]=arguments}if(typeof console!=="undefined"){if(!Module["print"])Module["print"]=function print(x){console.log(x)};if(!Module["printErr"])Module["printErr"]=function printErr(x){console.log(x)}}else{var TRY_USE_DUMP=false;if(!Module["print"])Module["print"]=TRY_USE_DUMP&&typeof dump!=="undefined"?(function(x){dump(x)}):(function(x){})}if(ENVIRONMENT_IS_WORKER){Module["load"]=importScripts}if(typeof Module["setWindowTitle"]==="undefined"){Module["setWindowTitle"]=(function(title){document.title=title})}}else{throw"Unknown runtime environment. Where are we?"}function globalEval(x){eval.call(null,x)}if(!Module["load"]&&Module["read"]){Module["load"]=function load(f){globalEval(Module["read"](f))}}if(!Module["print"]){Module["print"]=(function(){})}if(!Module["printErr"]){Module["printErr"]=Module["print"]}if(!Module["arguments"]){Module["arguments"]=[]}if(!Module["thisProgram"]){Module["thisProgram"]="./this.program"}Module.print=Module["print"];Module.printErr=Module["printErr"];Module["preRun"]=[];Module["postRun"]=[];for(var key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}var Runtime={setTempRet0:(function(value){tempRet0=value}),getTempRet0:(function(){return tempRet0}),stackSave:(function(){return STACKTOP}),stackRestore:(function(stackTop){STACKTOP=stackTop}),getNativeTypeSize:(function(type){switch(type){case"i1":case"i8":return 1;case"i16":return 2;case"i32":return 4;case"i64":return 8;case"float":return 4;case"double":return 8;default:{if(type[type.length-1]==="*"){return Runtime.QUANTUM_SIZE}else if(type[0]==="i"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}),getNativeFieldSize:(function(type){return Math.max(Runtime.getNativeTypeSize(type),Runtime.QUANTUM_SIZE)}),STACK_ALIGN:16,prepVararg:(function(ptr,type){if(type==="double"||type==="i64"){if(ptr&7){assert((ptr&7)===4);ptr+=4}}else{assert((ptr&3)===0)}return ptr}),getAlignSize:(function(type,size,vararg){if(!vararg&&(type=="i64"||type=="double"))return 8;if(!type)return Math.min(size,8);return Math.min(size||(type?Runtime.getNativeFieldSize(type):0),Runtime.QUANTUM_SIZE)}),dynCall:(function(sig,ptr,args){if(args&&args.length){if(!args.splice)args=Array.prototype.slice.call(args);args.splice(0,0,ptr);return Module["dynCall_"+sig].apply(null,args)}else{return Module["dynCall_"+sig].call(null,ptr)}}),functionPointers:[],addFunction:(function(func){for(var i=0;i<Runtime.functionPointers.length;i++){if(!Runtime.functionPointers[i]){Runtime.functionPointers[i]=func;return 2*(1+i)}}throw"Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS."}),removeFunction:(function(index){Runtime.functionPointers[(index-2)/2]=null}),warnOnce:(function(text){if(!Runtime.warnOnce.shown)Runtime.warnOnce.shown={};if(!Runtime.warnOnce.shown[text]){Runtime.warnOnce.shown[text]=1;Module.printErr(text)}}),funcWrappers:{},getFuncWrapper:(function(func,sig){assert(sig);if(!Runtime.funcWrappers[sig]){Runtime.funcWrappers[sig]={}}var sigCache=Runtime.funcWrappers[sig];if(!sigCache[func]){sigCache[func]=function dynCall_wrapper(){return Runtime.dynCall(sig,func,arguments)}}return sigCache[func]}),getCompilerSetting:(function(name){throw"You must build with -s RETAIN_COMPILER_SETTINGS=1 for Runtime.getCompilerSetting or emscripten_get_compiler_setting to work"}),stackAlloc:(function(size){var ret=STACKTOP;STACKTOP=STACKTOP+size|0;STACKTOP=STACKTOP+15&-16;return ret}),staticAlloc:(function(size){var ret=STATICTOP;STATICTOP=STATICTOP+size|0;STATICTOP=STATICTOP+15&-16;return ret}),dynamicAlloc:(function(size){var ret=DYNAMICTOP;DYNAMICTOP=DYNAMICTOP+size|0;DYNAMICTOP=DYNAMICTOP+15&-16;if(DYNAMICTOP>=TOTAL_MEMORY){var success=enlargeMemory();if(!success){DYNAMICTOP=ret;return 0}}return ret}),alignMemory:(function(size,quantum){var ret=size=Math.ceil(size/(quantum?quantum:16))*(quantum?quantum:16);return ret}),makeBigInt:(function(low,high,unsigned){var ret=unsigned?+(low>>>0)+ +(high>>>0)*+4294967296:+(low>>>0)+ +(high|0)*+4294967296;return ret}),GLOBAL_BASE:8,QUANTUM_SIZE:4,__dummy__:0};Module["Runtime"]=Runtime;var __THREW__=0;var ABORT=false;var EXITSTATUS=0;var undef=0;var tempValue,tempInt,tempBigInt,tempInt2,tempBigInt2,tempPair,tempBigIntI,tempBigIntR,tempBigIntS,tempBigIntP,tempBigIntD,tempDouble,tempFloat;var tempI64,tempI64b;var tempRet0,tempRet1,tempRet2,tempRet3,tempRet4,tempRet5,tempRet6,tempRet7,tempRet8,tempRet9;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}var globalScope=this;function getCFunc(ident){var func=Module["_"+ident];if(!func){try{func=eval("_"+ident)}catch(e){}}assert(func,"Cannot call unknown function "+ident+" (perhaps LLVM optimizations or closure removed it?)");return func}var cwrap,ccall;((function(){var JSfuncs={"stackSave":(function(){Runtime.stackSave()}),"stackRestore":(function(){Runtime.stackRestore()}),"arrayToC":(function(arr){var ret=Runtime.stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}),"stringToC":(function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){ret=Runtime.stackAlloc((str.length<<2)+1);writeStringToMemory(str,ret)}return ret})};var toC={"string":JSfuncs["stringToC"],"array":JSfuncs["arrayToC"]};ccall=function ccallFunc(ident,returnType,argTypes,args,opts){var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i<args.length;i++){var converter=toC[argTypes[i]];if(converter){if(stack===0)stack=Runtime.stackSave();cArgs[i]=converter(args[i])}else{cArgs[i]=args[i]}}}var ret=func.apply(null,cArgs);if(returnType==="string")ret=Pointer_stringify(ret);if(stack!==0){if(opts&&opts.async){EmterpreterAsync.asyncFinalizers.push((function(){Runtime.stackRestore(stack)}));return}Runtime.stackRestore(stack)}return ret};var sourceRegex=/^function\s*\(([^)]*)\)\s*{\s*([^*]*?)[\s;]*(?:return\s*(.*?)[;\s]*)?}$/;function parseJSFunc(jsfunc){var parsed=jsfunc.toString().match(sourceRegex).slice(1);return{arguments:parsed[0],body:parsed[1],returnValue:parsed[2]}}var JSsource={};for(var fun in JSfuncs){if(JSfuncs.hasOwnProperty(fun)){JSsource[fun]=parseJSFunc(JSfuncs[fun])}}cwrap=function cwrap(ident,returnType,argTypes){argTypes=argTypes||[];var cfunc=getCFunc(ident);var numericArgs=argTypes.every((function(type){return type==="number"}));var numericRet=returnType!=="string";if(numericRet&&numericArgs){return cfunc}var argNames=argTypes.map((function(x,i){return"$"+i}));var funcstr="(function("+argNames.join(",")+") {";var nargs=argTypes.length;if(!numericArgs){funcstr+="var stack = "+JSsource["stackSave"].body+";";for(var i=0;i<nargs;i++){var arg=argNames[i],type=argTypes[i];if(type==="number")continue;var convertCode=JSsource[type+"ToC"];funcstr+="var "+convertCode.arguments+" = "+arg+";";funcstr+=convertCode.body+";";funcstr+=arg+"="+convertCode.returnValue+";"}}var cfuncname=parseJSFunc((function(){return cfunc})).returnValue;funcstr+="var ret = "+cfuncname+"("+argNames.join(",")+");";if(!numericRet){var strgfy=parseJSFunc((function(){return Pointer_stringify})).returnValue;funcstr+="ret = "+strgfy+"(ret);"}if(!numericArgs){funcstr+=JSsource["stackRestore"].body.replace("()","(stack)")+";"}funcstr+="return ret})";return eval(funcstr)}}))();Module["ccall"]=ccall;Module["cwrap"]=cwrap;function setValue(ptr,value,type,noSafe){type=type||"i8";if(type.charAt(type.length-1)==="*")type="i32";switch(type){case"i1":HEAP8[ptr>>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=+1?tempDouble>+0?(Math_min(+Math_floor(tempDouble/+4294967296),+4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/+4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;default:abort("invalid type for setValue: "+type)}}Module["setValue"]=setValue;function getValue(ptr,type,noSafe){type=type||"i8";if(type.charAt(type.length-1)==="*")type="i32";switch(type){case"i1":return HEAP8[ptr>>0];case"i8":return HEAP8[ptr>>0];case"i16":return HEAP16[ptr>>1];case"i32":return HEAP32[ptr>>2];case"i64":return HEAP32[ptr>>2];case"float":return HEAPF32[ptr>>2];case"double":return HEAPF64[ptr>>3];default:abort("invalid type for setValue: "+type)}return null}Module["getValue"]=getValue;var ALLOC_NORMAL=0;var ALLOC_STACK=1;var ALLOC_STATIC=2;var ALLOC_DYNAMIC=3;var ALLOC_NONE=4;Module["ALLOC_NORMAL"]=ALLOC_NORMAL;Module["ALLOC_STACK"]=ALLOC_STACK;Module["ALLOC_STATIC"]=ALLOC_STATIC;Module["ALLOC_DYNAMIC"]=ALLOC_DYNAMIC;Module["ALLOC_NONE"]=ALLOC_NONE;function allocate(slab,types,allocator,ptr){var zeroinit,size;if(typeof slab==="number"){zeroinit=true;size=slab}else{zeroinit=false;size=slab.length}var singleType=typeof types==="string"?types:null;var ret;if(allocator==ALLOC_NONE){ret=ptr}else{ret=[_malloc,Runtime.stackAlloc,Runtime.staticAlloc,Runtime.dynamicAlloc][allocator===undefined?ALLOC_STATIC:allocator](Math.max(size,singleType?1:types.length))}if(zeroinit){var ptr=ret,stop;assert((ret&3)==0);stop=ret+(size&~3);for(;ptr<stop;ptr+=4){HEAP32[ptr>>2]=0}stop=ret+size;while(ptr<stop){HEAP8[ptr++>>0]=0}return ret}if(singleType==="i8"){if(slab.subarray||slab.slice){HEAPU8.set(slab,ret)}else{HEAPU8.set(new Uint8Array(slab),ret)}return ret}var i=0,type,typeSize,previousType;while(i<size){var curr=slab[i];if(typeof curr==="function"){curr=Runtime.getFunctionIndex(curr)}type=singleType||types[i];if(type===0){i++;continue}if(type=="i64")type="i32";setValue(ret+i,curr,type);if(previousType!==type){typeSize=Runtime.getNativeTypeSize(type);previousType=type}i+=typeSize}return ret}Module["allocate"]=allocate;function getMemory(size){if(!staticSealed)return Runtime.staticAlloc(size);if(typeof _sbrk!=="undefined"&&!_sbrk.called||!runtimeInitialized)return Runtime.dynamicAlloc(size);return _malloc(size)}Module["getMemory"]=getMemory;function Pointer_stringify(ptr,length){if(length===0||!ptr)return"";var hasUtf=0;var t;var i=0;while(1){t=HEAPU8[ptr+i>>0];hasUtf|=t;if(t==0&&!length)break;i++;if(length&&i==length)break}if(!length)length=i;var ret="";if(hasUtf<128){var MAX_CHUNK=1024;var curr;while(length>0){curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,MAX_CHUNK)));ret=ret?ret+curr:curr;ptr+=MAX_CHUNK;length-=MAX_CHUNK}return ret}return Module["UTF8ToString"](ptr)}Module["Pointer_stringify"]=Pointer_stringify;function AsciiToString(ptr){var str="";while(1){var ch=HEAP8[ptr++>>0];if(!ch)return str;str+=String.fromCharCode(ch)}}Module["AsciiToString"]=AsciiToString;function stringToAscii(str,outPtr){return writeAsciiToMemory(str,outPtr,false)}Module["stringToAscii"]=stringToAscii;function UTF8ArrayToString(u8Array,idx){var u0,u1,u2,u3,u4,u5;var str="";while(1){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){u0=(u0&3)<<24|u1<<18|u2<<12|u3<<6|u4}else{u5=u8Array[idx++]&63;u0=(u0&1)<<30|u1<<24|u2<<18|u3<<12|u4<<6|u5}}}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}Module["UTF8ArrayToString"]=UTF8ArrayToString;function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}Module["UTF8ToString"]=UTF8ToString;function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}Module["stringToUTF8Array"]=stringToUTF8Array;function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}Module["stringToUTF8"]=stringToUTF8;function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else if(u<=2047){len+=2}else if(u<=65535){len+=3}else if(u<=2097151){len+=4}else if(u<=67108863){len+=5}else{len+=6}}return len}Module["lengthBytesUTF8"]=lengthBytesUTF8;function UTF16ToString(ptr){var i=0;var str="";while(1){var codeUnit=HEAP16[ptr+i*2>>1];if(codeUnit==0)return str;++i;str+=String.fromCharCode(codeUnit)}}Module["UTF16ToString"]=UTF16ToString;function stringToUTF16(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<2)return 0;maxBytesToWrite-=2;var startPtr=outPtr;var numCharsToWrite=maxBytesToWrite<str.length*2?maxBytesToWrite/2:str.length;for(var i=0;i<numCharsToWrite;++i){var codeUnit=str.charCodeAt(i);HEAP16[outPtr>>1]=codeUnit;outPtr+=2}HEAP16[outPtr>>1]=0;return outPtr-startPtr}Module["stringToUTF16"]=stringToUTF16;function lengthBytesUTF16(str){return str.length*2}Module["lengthBytesUTF16"]=lengthBytesUTF16;function UTF32ToString(ptr){var i=0;var str="";while(1){var utf32=HEAP32[ptr+i*4>>2];if(utf32==0)return str;++i;if(utf32>=65536){var ch=utf32-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}else{str+=String.fromCharCode(utf32)}}}Module["UTF32ToString"]=UTF32ToString;function stringToUTF32(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<4)return 0;var startPtr=outPtr;var endPtr=startPtr+maxBytesToWrite-4;for(var i=0;i<str.length;++i){var codeUnit=str.charCodeAt(i);if(codeUnit>=55296&&codeUnit<=57343){var trailSurrogate=str.charCodeAt(++i);codeUnit=65536+((codeUnit&1023)<<10)|trailSurrogate&1023}HEAP32[outPtr>>2]=codeUnit;outPtr+=4;if(outPtr+4>endPtr)break}HEAP32[outPtr>>2]=0;return outPtr-startPtr}Module["stringToUTF32"]=stringToUTF32;function lengthBytesUTF32(str){var len=0;for(var i=0;i<str.length;++i){var codeUnit=str.charCodeAt(i);if(codeUnit>=55296&&codeUnit<=57343)++i;len+=4}return len}Module["lengthBytesUTF32"]=lengthBytesUTF32;function demangle(func){var hasLibcxxabi=!!Module["___cxa_demangle"];if(hasLibcxxabi){try{var buf=_malloc(func.length);writeStringToMemory(func.substr(1),buf);var status=_malloc(4);var ret=Module["___cxa_demangle"](buf,0,0,status);if(getValue(status,"i32")===0&&ret){return Pointer_stringify(ret)}}catch(e){}finally{if(buf)_free(buf);if(status)_free(status);if(ret)_free(ret)}}var i=3;var basicTypes={"v":"void","b":"bool","c":"char","s":"short","i":"int","l":"long","f":"float","d":"double","w":"wchar_t","a":"signed char","h":"unsigned char","t":"unsigned short","j":"unsigned int","m":"unsigned long","x":"long long","y":"unsigned long long","z":"..."};var subs=[];var first=true;function dump(x){if(x)Module.print(x);Module.print(func);var pre="";for(var a=0;a<i;a++)pre+=" ";Module.print(pre+"^")}function parseNested(){i++;if(func[i]==="K")i++;var parts=[];while(func[i]!=="E"){if(func[i]==="S"){i++;var next=func.indexOf("_",i);var num=func.substring(i,next)||0;parts.push(subs[num]||"?");i=next+1;continue}if(func[i]==="C"){parts.push(parts[parts.length-1]);i+=2;continue}var size=parseInt(func.substr(i));var pre=size.toString().length;if(!size||!pre){i--;break}var curr=func.substr(i+pre,size);parts.push(curr);subs.push(curr);i+=pre+size}i++;return parts}function parse(rawList,limit,allowVoid){limit=limit||Infinity;var ret="",list=[];function flushList(){return"("+list.join(", ")+")"}var name;if(func[i]==="N"){name=parseNested().join("::");limit--;if(limit===0)return rawList?[name]:name}else{if(func[i]==="K"||first&&func[i]==="L")i++;var size=parseInt(func.substr(i));if(size){var pre=size.toString().length;name=func.substr(i+pre,size);i+=pre+size}}first=false;if(func[i]==="I"){i++;var iList=parse(true);var iRet=parse(true,1,true);ret+=iRet[0]+" "+name+"<"+iList.join(", ")+">"}else{ret=name}paramLoop:while(i<func.length&&limit-->0){var c=func[i++];if(c in basicTypes){list.push(basicTypes[c])}else{switch(c){case"P":list.push(parse(true,1,true)[0]+"*");break;case"R":list.push(parse(true,1,true)[0]+"&");break;case"L":{i++;var end=func.indexOf("E",i);var size=end-i;list.push(func.substr(i,size));i+=size+2;break};case"A":{var size=parseInt(func.substr(i));i+=size.toString().length;if(func[i]!=="_")throw"?";i++;list.push(parse(true,1,true)[0]+" ["+size+"]");break};case"E":break paramLoop;default:ret+="?"+c;break paramLoop}}}if(!allowVoid&&list.length===1&&list[0]==="void")list=[];if(rawList){if(ret){list.push(ret+"?")}return list}else{return ret+flushList()}}var parsed=func;try{if(func=="Object._main"||func=="_main"){return"main()"}if(typeof func==="number")func=Pointer_stringify(func);if(func[0]!=="_")return func;if(func[1]!=="_")return func;if(func[2]!=="Z")return func;switch(func[3]){case"n":return"operator new()";case"d":return"operator delete()"}parsed=parse()}catch(e){parsed+="?"}if(parsed.indexOf("?")>=0&&!hasLibcxxabi){Runtime.warnOnce("warning: a problem occurred in builtin C++ name demangling; build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling")}return parsed}function demangleAll(text){return text.replace(/__Z[\w\d_]+/g,(function(x){var y=demangle(x);return x===y?x:x+" ["+y+"]"}))}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error(0)}catch(e){err=e}if(!err.stack){return"(no stack trace available)"}}return err.stack.toString()}function stackTrace(){return demangleAll(jsStackTrace())}Module["stackTrace"]=stackTrace;var PAGE_SIZE=4096;function alignMemoryPage(x){if(x%4096>0){x+=4096-x%4096}return x}var HEAP;var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;var STATIC_BASE=0,STATICTOP=0,staticSealed=false;var STACK_BASE=0,STACKTOP=0,STACK_MAX=0;var DYNAMIC_BASE=0,DYNAMICTOP=0;function abortOnCannotGrowMemory(){abort("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value "+TOTAL_MEMORY+", (2) compile with -s ALLOW_MEMORY_GROWTH=1 which adjusts the size at runtime but prevents some optimizations, (3) set Module.TOTAL_MEMORY to a higher value before the program runs, or if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 ")}function enlargeMemory(){abortOnCannotGrowMemory()}var TOTAL_STACK=Module["TOTAL_STACK"]||5242880;var TOTAL_MEMORY=Module["TOTAL_MEMORY"]||268435456;var totalMemory=64*1024;while(totalMemory<TOTAL_MEMORY||totalMemory<2*TOTAL_STACK){if(totalMemory<16*1024*1024){totalMemory*=2}else{totalMemory+=16*1024*1024}}if(totalMemory!==TOTAL_MEMORY){TOTAL_MEMORY=totalMemory}assert(typeof Int32Array!=="undefined"&&typeof Float64Array!=="undefined"&&!!(new Int32Array(1))["subarray"]&&!!(new Int32Array(1))["set"],"JS engine does not provide full typed array support");var buffer;buffer=new ArrayBuffer(TOTAL_MEMORY);HEAP8=new Int8Array(buffer);HEAP16=new Int16Array(buffer);HEAP32=new Int32Array(buffer);HEAPU8=new Uint8Array(buffer);HEAPU16=new Uint16Array(buffer);HEAPU32=new Uint32Array(buffer);HEAPF32=new Float32Array(buffer);HEAPF64=new Float64Array(buffer);HEAP32[0]=255;assert(HEAPU8[0]===255&&HEAPU8[3]===0,"Typed arrays 2 must be run on a little-endian system");Module["HEAP"]=HEAP;Module["buffer"]=buffer;Module["HEAP8"]=HEAP8;Module["HEAP16"]=HEAP16;Module["HEAP32"]=HEAP32;Module["HEAPU8"]=HEAPU8;Module["HEAPU16"]=HEAPU16;Module["HEAPU32"]=HEAPU32;Module["HEAPF32"]=HEAPF32;Module["HEAPF64"]=HEAPF64;function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback();continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){Runtime.dynCall("v",func)}else{Runtime.dynCall("vi",func,[callback.arg])}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}Module["addOnPreRun"]=addOnPreRun;function addOnInit(cb){__ATINIT__.unshift(cb)}Module["addOnInit"]=addOnInit;function addOnPreMain(cb){__ATMAIN__.unshift(cb)}Module["addOnPreMain"]=addOnPreMain;function addOnExit(cb){__ATEXIT__.unshift(cb)}Module["addOnExit"]=addOnExit;function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}Module["addOnPostRun"]=addOnPostRun;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}Module["intArrayFromString"]=intArrayFromString;function intArrayToString(array){var ret=[];for(var i=0;i<array.length;i++){var chr=array[i];if(chr>255){chr&=255}ret.push(String.fromCharCode(chr))}return ret.join("")}Module["intArrayToString"]=intArrayToString;function writeStringToMemory(string,buffer,dontAddNull){var array=intArrayFromString(string,dontAddNull);var i=0;while(i<array.length){var chr=array[i];HEAP8[buffer+i>>0]=chr;i=i+1}}Module["writeStringToMemory"]=writeStringToMemory;function writeArrayToMemory(array,buffer){for(var i=0;i<array.length;i++){HEAP8[buffer++>>0]=array[i]}}Module["writeArrayToMemory"]=writeArrayToMemory;function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i<str.length;++i){HEAP8[buffer++>>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}Module["writeAsciiToMemory"]=writeAsciiToMemory;function unSign(value,bits,ignore){if(value>=0){return value}return bits<=32?2*Math.abs(1<<bits-1)+value:Math.pow(2,bits)+value}function reSign(value,bits,ignore){if(value<=0){return value}var half=bits<=32?Math.abs(1<<bits-1):Math.pow(2,bits-1);if(value>=half&&(bits<=32||value>half)){value=-2*half+value}return value}if(!Math["imul"]||Math["imul"](4294967295,5)!==-5)Math["imul"]=function imul(a,b){var ah=a>>>16;var al=a&65535;var bh=b>>>16;var bl=b&65535;return al*bl+(ah*bl+al*bh<<16)|0};Math.imul=Math["imul"];if(!Math["clz32"])Math["clz32"]=(function(x){x=x>>>0;for(var i=0;i<32;i++){if(x&1<<31-i)return i}return 32});Math.clz32=Math["clz32"];var Math_abs=Math.abs;var Math_cos=Math.cos;var Math_sin=Math.sin;var Math_tan=Math.tan;var Math_acos=Math.acos;var Math_asin=Math.asin;var Math_atan=Math.atan;var Math_atan2=Math.atan2;var Math_exp=Math.exp;var Math_log=Math.log;var Math_sqrt=Math.sqrt;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_pow=Math.pow;var Math_imul=Math.imul;var Math_fround=Math.fround;var Math_min=Math.min;var Math_clz32=Math.clz32;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}Module["addRunDependency"]=addRunDependency;function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["removeRunDependency"]=removeRunDependency;Module["preloadedImages"]={};Module["preloadedAudios"]={};var memoryInitializer=null;var ASM_CONSTS=[(function($0,$1,$2,$3){{if(!artoolkit["multiEachMarkerInfo"]){artoolkit["multiEachMarkerInfo"]={}}var multiEachMarker=artoolkit["multiEachMarkerInfo"];multiEachMarker["visible"]=$0;multiEachMarker["pattId"]=$1;multiEachMarker["pattType"]=$2;multiEachMarker["width"]=$3}}),(function($0,$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){{var $a=arguments;var i=12;if(!artoolkit["markerInfo"]){artoolkit["markerInfo"]={pos:[0,0],line:[[0,0,0],[0,0,0],[0,0,0],[0,0,0]],vertex:[[0,0],[0,0],[0,0],[0,0]]}}var markerInfo=artoolkit["markerInfo"];markerInfo["area"]=$0;markerInfo["id"]=$1;markerInfo["idPatt"]=$2;markerInfo["idMatrix"]=$3;markerInfo["dir"]=$4;markerInfo["dirPatt"]=$5;markerInfo["dirMatrix"]=$6;markerInfo["cf"]=$7;markerInfo["cfPatt"]=$8;markerInfo["cfMatrix"]=$9;markerInfo["pos"][0]=$10;markerInfo["pos"][1]=$11;markerInfo["line"][0][0]=$a[i++];markerInfo["line"][0][1]=$a[i++];markerInfo["line"][0][2]=$a[i++];markerInfo["line"][1][0]=$a[i++];markerInfo["line"][1][1]=$a[i++];markerInfo["line"][1][2]=$a[i++];markerInfo["line"][2][0]=$a[i++];markerInfo["line"][2][1]=$a[i++];markerInfo["line"][2][2]=$a[i++];markerInfo["line"][3][0]=$a[i++];markerInfo["line"][3][1]=$a[i++];markerInfo["line"][3][2]=$a[i++];markerInfo["vertex"][0][0]=$a[i++];markerInfo["vertex"][0][1]=$a[i++];markerInfo["vertex"][1][0]=$a[i++];markerInfo["vertex"][1][1]=$a[i++];markerInfo["vertex"][2][0]=$a[i++];markerInfo["vertex"][2][1]=$a[i++];markerInfo["vertex"][3][0]=$a[i++];markerInfo["vertex"][3][1]=$a[i++];markerInfo["errorCorrected"]=$a[i++]}}),(function($0,$1,$2,$3,$4){{if(!artoolkit["frameMalloc"]){artoolkit["frameMalloc"]={}}var frameMalloc=artoolkit["frameMalloc"];frameMalloc["framepointer"]=$1;frameMalloc["framesize"]=$2;frameMalloc["camera"]=$3;frameMalloc["transform"]=$4}})];function _emscripten_asm_const_33(code,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32){return ASM_CONSTS[code](a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32)}function _emscripten_asm_const_4(code,a0,a1,a2,a3){return ASM_CONSTS[code](a0,a1,a2,a3)}function _emscripten_asm_const_5(code,a0,a1,a2,a3,a4){return ASM_CONSTS[code](a0,a1,a2,a3,a4)}STATIC_BASE=8;STATICTOP=STATIC_BASE+16496;__ATINIT__.push({func:(function(){__GLOBAL__sub_I_ARToolKitJS_cpp()})},{func:(function(){__GLOBAL__sub_I_bind_cpp()})});allocate([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,9,0,0,53,42,0,0,0,0,0,0,1,0,0,0,128,1,0,0,0,0,0,0,228,8,0,0,116,42,0,0,52,9,0,0,136,47,0,0,0,0,0,0,1,0,0,0,128,1,0,0,0,0,0,0,52,9,0,0,73,47,0,0,0,0,0,0,1,0,0,0,128,1,0,0,0,0,0,0,228,8,0,0,54,47,0,0,228,8,0,0,23,47,0,0,228,8,0,0,62,46,0,0,228,8,0,0,31,46,0,0,228,8,0,0,0,46,0,0,228,8,0,0,225,45,0,0,228,8,0,0,194,45,0,0,228,8,0,0,93,46,0,0,228,8,0,0,124,46,0,0,228,8,0,0,155,46,0,0,228,8,0,0,186,46,0,0,228,8,0,0,217,46,0,0,228,8,0,0,248,46,0,0,12,9,0,0,199,47,0,0,48,2,0,0,0,0,0,0,228,8,0,0,212,47,0,0,228,8,0,0,225,47,0,0,12,9,0,0,238,47,0,0,56,2,0,0,0,0,0,0,12,9,0,0,15,48,0,0,64,2,0,0,0,0,0,0,12,9,0,0,49,48,0,0,64,2,0,0,0,0,0,0,200,8,0,0,89,48,0,0,200,8,0,0,91,48,0,0,200,8,0,0,93,48,0,0,200,8,0,0,95,48,0,0,200,8,0,0,97,48,0,0,200,8,0,0,99,48,0,0,200,8,0,0,101,48,0,0,200,8,0,0,103,48,0,0,200,8,0,0,105,48,0,0,200,8,0,0,107,48,0,0,200,8,0,0,109,48,0,0,200,8,0,0,111,48,0,0,200,8,0,0,113,48,0,0,12,9,0,0,115,48,0,0,80,2,0,0,0,0,0,0,12,9,0,0,152,48,0,0,80,2,0,0,0,0,0,0,255,15,0,0,6,16,0,0,18,16,0,0,28,16,0,0,255,255,255,255,255,255,255,255,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,1,0,0,0,2,0,0,0,4,0,0,0,8,0,0,0,3,0,0,0,6,0,0,0,12,0,0,0,11,0,0,0,5,0,0,0,10,0,0,0,7,0,0,0,14,0,0,0,15,0,0,0,13,0,0,0,9,0,0,0,1,0,0,0,2,0,0,0,4,0,0,0,8,0,0,0,16,0,0,0,32,0,0,0,64,0,0,0,3,0,0,0,6,0,0,0,12,0,0,0,24,0,0,0,48,0,0,0,96,0,0,0,67,0,0,0,5,0,0,0,10,0,0,0,20,0,0,0,40,0,0,0,80,0,0,0,35,0,0,0,70,0,0,0,15,0,0,0,30,0,0,0,60,0,0,0,120,0,0,0,115,0,0,0,101,0,0,0,73,0,0,0,17,0,0,0,34,0,0,0,68,0,0,0,11,0,0,0,22,0,0,0,44,0,0,0,88,0,0,0,51,0,0,0,102,0,0,0,79,0,0,0,29,0,0,0,58,0,0,0,116,0,0,0,107,0,0,0,85,0,0,0,41,0,0,0,82,0,0,0,39,0,0,0,78,0,0,0,31,0,0,0,62,0,0,0,124,0,0,0,123,0,0,0,117,0,0,0,105,0,0,0,81,0,0,0,33,0,0,0,66,0,0,0,7,0,0,0,14,0,0,0,28,0,0,0,56,0,0,0,112,0,0,0,99,0,0,0,69,0,0,0,9,0,0,0,18,0,0,0,36,0,0,0,72,0,0,0,19,0,0,0,38,0,0,0,76,0,0,0,27,0,0,0,54,0,0,0,108,0,0,0,91,0,0,0,53,0,0,0,106,0,0,0,87,0,0,0,45,0,0,0,90,0,0,0,55,0,0,0,110,0,0,0,95,0,0,0,61,0,0,0,122,0,0,0,119,0,0,0,109,0,0,0,89,0,0,0,49,0,0,0,98,0,0,0,71,0,0,0,13,0,0,0,26,0,0,0,52,0,0,0,104,0,0,0,83,0,0,0,37,0,0,0,74,0,0,0,23,0,0,0,46,0,0,0,92,0,0,0,59,0,0,0,118,0,0,0,111,0,0,0,93,0,0,0,57,0,0,0,114,0,0,0,103,0,0,0,77,0,0,0,25,0,0,0,50,0,0,0,100,0,0,0,75,0,0,0,21,0,0,0,42,0,0,0,84,0,0,0,43,0,0,0,86,0,0,0,47,0,0,0,94,0,0,0,63,0,0,0,126,0,0,0,127,0,0,0,125,0,0,0,121,0,0,0,113,0,0,0,97,0,0,0,65,0,0,0,255,255,255,255,0,0,0,0,1,0,0,0,4,0,0,0,2,0,0,0,8,0,0,0,5,0,0,0,10,0,0,0,3,0,0,0,14,0,0,0,9,0,0,0,7,0,0,0,6,0,0,0,13,0,0,0,11,0,0,0,12,0,0,0,255,255,255,255,0,0,0,0,1,0,0,0,7,0,0,0,2,0,0,0,14,0,0,0,8,0,0,0,56,0,0,0,3,0,0,0,63,0,0,0,15,0,0,0,31,0,0,0,9,0,0,0,90,0,0,0,57,0,0,0,21,0,0,0,4,0,0,0,28,0,0,0,64,0,0,0,67,0,0,0,16,0,0,0,112,0,0,0,32,0,0,0,97,0,0,0,10,0,0,0,108,0,0,0,91,0,0,0,70,0,0,0,58,0,0,0,38,0,0,0,22,0,0,0,47,0,0,0,5,0,0,0,54,0,0,0,29,0,0,0,19,0,0,0,65,0,0,0,95,0,0,0,68,0,0,0,45,0,0,0,17,0,0,0,43,0,0,0,113,0,0,0,115,0,0,0,33,0,0,0,77,0,0,0,98,0,0,0,117,0,0,0,11,0,0,0,87,0,0,0,109,0,0,0,35,0,0,0,92,0,0,0,74,0,0,0,71,0,0,0,79,0,0,0,59,0,0,0,104,0,0,0,39,0,0,0,100,0,0,0,23,0,0,0,82,0,0,0,48,0,0,0,119,0,0,0,6,0,0,0,126,0,0,0,55,0,0,0,13,0,0,0,30,0,0,0,62,0,0,0,20,0,0,0,89,0,0,0,66,0,0,0,27,0,0,0,96,0,0,0,111,0,0,0,69,0,0,0,107,0,0,0,46,0,0,0,37,0,0,0,18,0,0,0,53,0,0,0,44,0,0,0,94,0,0,0,114,0,0,0,42,0,0,0,116,0,0,0,76,0,0,0,34,0,0,0,86,0,0,0,78,0,0,0,73,0,0,0,99,0,0,0,103,0,0,0,118,0,0,0,81,0,0,0,12,0,0,0,125,0,0,0,88,0,0,0,61,0,0,0,110,0,0,0,26,0,0,0,36,0,0,0,106,0,0,0,93,0,0,0,52,0,0,0,75,0,0,0,41,0,0,0,72,0,0,0,85,0,0,0,80,0,0,0,102,0,0,0,60,0,0,0,124,0,0,0,105,0,0,0,25,0,0,0,40,0,0,0,51,0,0,0,101,0,0,0,84,0,0,0,24,0,0,0,123,0,0,0,83,0,0,0,50,0,0,0,49,0,0,0,122,0,0,0,120,0,0,0,121,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,136,0,0,0,5,0,0,0,144,0,0,0,6,0,0,0,152,0,0,0,9,0,0,0,176,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,253,255,255,255,254,255,255,255,0,0,0,0,112,2,0,0,168,2,0,0,200,2,0,0,112,2,0,0,168,2,0,0,168,2,0,0,208,2,0,0,168,2,0,0,112,2,0,0,168,2,0,0,208,2,0,0,168,2,0,0,112,2,0,0,168,2,0,0,168,2,0,0,104,1,0,0,168,2,0,0,168,2,0,0,168,2,0,0,168,2,0,0,168,2,0,0,104,1,0,0,168,2,0,0,168,2,0,0,168,2,0,0,168,2,0,0,168,2,0,0,168,2,0,0,0,0,0,0,32,2,0,0,1,0,0,0,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,96,2,0,0,3,0,0,0,4,0,0,0,5,0,0,0,6,0,0,0,1,0,0,0,0,0,0,0,80,2,0,0,3,0,0,0,7,0,0,0,5,0,0,0,6,0,0,0,2,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,216,2,0,0,3,0,0,0,8,0,0,0,5,0,0,0,6,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,232,2,0,0,3,0,0,0,9,0,0,0,5,0,0,0,6,0,0,0,2,0,0,0,3,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,192,3,0,0,192,4,0,0,192,5,0,0,192,6,0,0,192,7,0,0,192,8,0,0,192,9,0,0,192,10,0,0,192,11,0,0,192,12,0,0,192,13,0,0,192,14,0,0,192,15,0,0,192,16,0,0,192,17,0,0,192,18,0,0,192,19,0,0,192,20,0,0,192,21,0,0,192,22,0,0,192,23,0,0,192,24,0,0,192,25,0,0,192,26,0,0,192,27,0,0,192,28,0,0,192,29,0,0,192,30,0,0,192,31,0,0,192,0,0,0,179,1,0,0,195,2,0,0,195,3,0,0,195,4,0,0,195,5,0,0,195,6,0,0,195,7,0,0,195,8,0,0,195,9,0,0,195,10,0,0,195,11,0,0,195,12,0,0,195,13,0,0,211,14,0,0,195,15,0,0,195,0,0,12,187,1,0,12,195,2,0,12,195,3,0,12,195,4,0,12,211,240,10,0,0,96,11,0,0,0,0,0,0,10,0,0,0,100,0,0,0,232,3,0,0,16,39,0,0,160,134,1,0,64,66,15,0,128,150,152,0,0,225,245,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,5,0,0,0,81,62,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,5,0,0,0,73,58,0,0,0,4,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,5,0,0,0,7,0,0,0,11,0,0,0,13,0,0,0,17,0,0,0,19,0,0,0,23,0,0,0,29,0,0,0,31,0,0,0,37,0,0,0,41,0,0,0,43,0,0,0,47,0,0,0,53,0,0,0,59,0,0,0,61,0,0,0,67,0,0,0,71,0,0,0,73,0,0,0,79,0,0,0,83,0,0,0,89,0,0,0,97,0,0,0,101,0,0,0,103,0,0,0,107,0,0,0,109,0,0,0,113,0,0,0,127,0,0,0,131,0,0,0,137,0,0,0,139,0,0,0,149,0,0,0,151,0,0,0,157,0,0,0,163,0,0,0,167,0,0,0,173,0,0,0,179,0,0,0,181,0,0,0,191,0,0,0,193,0,0,0,197,0,0,0,199,0,0,0,211,0,0,0,1,0,0,0,11,0,0,0,13,0,0,0,17,0,0,0,19,0,0,0,23,0,0,0,29,0,0,0,31,0,0,0,37,0,0,0,41,0,0,0,43,0,0,0,47,0,0,0,53,0,0,0,59,0,0,0,61,0,0,0,67,0,0,0,71,0,0,0,73,0,0,0,79,0,0,0,83,0,0,0,89,0,0,0,97,0,0,0,101,0,0,0,103,0,0,0,107,0,0,0,109,0,0,0,113,0,0,0,121,0,0,0,127,0,0,0,131,0,0,0,137,0,0,0,139,0,0,0,143,0,0,0,149,0,0,0,151,0,0,0,157,0,0,0,163,0,0,0,167,0,0,0,169,0,0,0,173,0,0,0,179,0,0,0,181,0,0,0,187,0,0,0,191,0,0,0,193,0,0,0,197,0,0,0,199,0,0,0,209,0,0,0,69,114,114,111,114,58,32,108,97,98,101,108,105,110,103,32,119,111,114,107,32,111,118,101,114,102,108,111,119,46,10,0,69,114,114,111,114,58,32,85,110,115,117,112,112,111,114,116,101,100,32,112,105,120,101,108,32,102,111,114,109,97,116,32,40,37,100,41,32,114,101,113,117,101,115,116,101,100,46,10,0,85,110,107,110,111,119,110,32,111,114,32,117,110,115,117,112,112,111,114,116,101,100,32,108,97,98,101,108,105,110,103,32,116,104,114,101,115,104,111,108,100,32,109,111,100,101,32,114,101,113,117,101,115,116,101,100,46,32,83,101,116,32,116,111,32,109,97,110,117,97,108,46,10,0,76,97,98,101,108,105,110,103,32,116,104,114,101,115,104,111,108,100,32,109,111,100,101,32,115,101,116,32,116,111,32,37,115,46,10,0,77,65,78,85,65,76,0,65,85,84,79,95,77,69,68,73,65,78,0,65,85,84,79,95,79,84,83,85,0,65,85,84,79,95,65,68,65,80,84,73,86,69,65,85,84,79,95,66,82,65,67,75,69,84,73,78,71,0,65,117,116,111,32,116,104,114,101,115,104,111,108,100,32,40,98,114,97,99,107,101,116,41,32,109,97,114,107,101,114,32,99,111,117,110,116,115,32,45,91,37,51,100,58,32,37,51,100,93,32,91,37,51,100,58,32,37,51,100,93,32,91,37,51,100,58,32,37,51,100,93,43,46,10,0,65,117,116,111,32,116,104,114,101,115,104,111,108,100,32,40,98,114,97,99,107,101,116,41,32,97,100,106,117,115,116,101,100,32,116,104,114,101,115,104,111,108,100,32,116,111,32,37,100,46,10,0,109,101,100,105,97,110,0,79,116,115,117,0,65,117,116,111,32,116,104,114,101,115,104,111,108,100,32,40,37,115,41,32,97,100,106,117,115,116,101,100,32,116,104,114,101,115,104,111,108,100,32,116,111,32,37,100,46,10,0,63,63,63,32,49,10,0,63,63,63,32,50,10,0,63,63,63,32,51,10,0,69,114,114,111,114,58,32,85,110,115,117,112,112,111,114,116,101,100,32,112,105,120,101,108,32,102,111,114,109,97,116,32,112,97,115,115,101,100,32,116,111,32,97,114,73,109,97,103,101,80,114,111,99,72,105,115,116,40,41,46,10,0,0,0,0,1,0,1,1,1,0,2,4,255,255,5,3,1,0,2,255,6,7,255,3,1,2,2,3,2,3,2,3,3,0,255,4,6,7,5,255,1,4,5,4,4,5,5,4,5,7,6,6,6,7,7,7,6,255,2,4,6,7,5,3,255,0,1,1,1,1,1,1,0,1,1,1,0,0,1,1,1,1,1,0,1,1,0,1,1,1,0,1,1,1,1,0,1,1,0,1,1,1,1,0,1,1,1,0,1,1,0,1,1,1,1,1,0,0,1,1,1,0,1,1,1,1,1,1,0,0,255,255,3,255,5,6,255,255,9,10,255,12,255,255,15,255,17,18,255,20,255,255,23,24,255,255,27,255,29,30,255,255,1,2,255,4,255,255,7,8,255,255,11,255,13,14,255,16,255,255,19,255,21,22,255,255,25,26,255,28,255,255,31,69,114,114,111,114,58,32,117,110,115,117,112,112,111,114,116,101,100,32,112,105,120,101,108,32,102,111,114,109,97,116,46,10,0,69,114,114,111,114,58,32,78,85,76,76,32,112,97,116,116,72,97,110,100,108,101,46,10,0,69,114,114,111,114,58,32,99,97,110,39,116,32,108,111,97,100,32,112,97,116,116,101,114,110,32,102,114,111,109,32,78,85,76,76,32,98,117,102,102,101,114,46,10,0,69,114,114,111,114,58,32,111,117,116,32,111,102,32,109,101,109,111,114,121,46,10,0,32,9,10,13,0,80,97,116,116,101,114,110,32,68,97,116,97,32,114,101,97,100,32,101,114,114,111,114,33,33,10,0,69,114,114,111,114,32,111,112,101,110,105,110,103,32,112,97,116,116,101,114,110,32,102,105,108,101,32,39,37,115,39,32,102,111,114,32,114,101,97,100,105,110,103,46,10,0,69,114,114,111,114,32,114,101,97,100,105,110,103,32,112,97,116,116,101,114,110,32,102,105,108,101,32,39,37,115,39,46,10,0,114,98,0,69,114,114,111,114,32,40,37,100,41,58,32,117,110,97,98,108,101,32,116,111,32,111,112,101,110,32,99,97,109,101,114,97,32,112,97,114,97,109,101,116,101,114,115,32,102,105,108,101,32,34,37,115,34,32,102,111,114,32,114,101,97,100,105,110,103,46,10,0,69,114,114,111,114,32,40,37,100,41,58,32,117,110,97,98,108,101,32,116,111,32,100,101,116,101,114,109,105,110,101,32,102,105,108,101,32,108,101,110,103,116,104,46,0,69,114,114,111,114,58,32,115,117,112,112,108,105,101,100,32,102,105,108,101,32,100,111,101,115,32,110,111,116,32,97,112,112,101,97,114,32,116,111,32,98,101,32,97,110,32,65,82,84,111,111,108,75,105,116,32,99,97,109,101,114,97,32,112,97,114,97,109,101,116,101,114,32,102,105,108,101,46,10,0,69,114,114,111,114,32,40,37,100,41,58,32,117,110,97,98,108,101,32,116,111,32,114,101,97,100,32,102,114,111,109,32,102,105,108,101,46,0,69,114,114,111,114,58,32,105,99,112,71,101,116,74,95,85,95,88,99,0,69,114,114,111,114,58,32,109,97,108,108,111,99,10,0,69,114,114,111,114,32,49,58,32,105,99,112,71,101,116,73,110,105,116,88,119,50,88,99,10,0,69,114,114,111,114,32,50,58,32,105,99,112,71,101,116,73,110,105,116,88,119,50,88,99,10,0,69,114,114,111,114,32,51,58,32,105,99,112,71,101,116,73,110,105,116,88,119,50,88,99,10,0,69,114,114,111,114,32,52,58,32,105,99,112,71,101,116,73,110,105,116,88,119,50,88,99,10,0,69,114,114,111,114,32,53,58,32,105,99,112,71,101,116,73,110,105,116,88,119,50,88,99,10,0,69,114,114,111,114,32,54,58,32,105,99,112,71,101,116,73,110,105,116,88,119,50,88,99,10,0,69,114,114,111,114,32,55,58,32,105,99,112,71,101,116,73,110,105,116,88,119,50,88,99,10,0,114,0,69,114,114,111,114,58,32,117,110,97,98,108,101,32,116,111,32,111,112,101,110,32,109,117,108,116,105,109,97,114,107,101,114,32,99,111,110,102,105,103,32,102,105,108,101,32,39,37,115,39,46,10,0,37,115,37,115,10,0,0,37,100,0,69,114,114,111,114,32,112,114,111,99,101,115,115,105,110,103,32,109,117,108,116,105,109,97,114,107,101,114,32,99,111,110,102,105,103,32,102,105,108,101,32,39,37,115,39,58,32,70,105,114,115,116,32,108,105,110,101,32,109,117,115,116,32,98,101,32,110,117,109,98,101,114,32,111,102,32,109,97,114,107,101,114,32,99,111,110,102,105,103,115,32,116,111,32,114,101,97,100,46,10,0,79,117,116,32,111,102,32,109,101,109,111,114,121,33,33,10,0,37,108,108,117,37,99,0,69,114,114,111,114,32,112,114,111,99,101,115,115,105,110,103,32,109,117,108,116,105,109,97,114,107,101,114,32,99,111,110,102,105,103,32,102,105,108,101,32,39,37,115,39,58,32,112,97,116,116,101,114,110,32,39,37,115,39,32,115,112,101,99,105,102,105,101,100,32,105,110,32,109,117,108,116,105,109,97,114,107,101,114,32,99,111,110,102,105,103,117,114,97,116,105,111,110,32,119,104,105,108,101,32,105,110,32,98,97,114,99,111,100,101,45,111,110,108,121,32,109,111,100,101,46,10,0,69,114,114,111,114,32,112,114,111,99,101,115,115,105,110,103,32,109,117,108,116,105,109,97,114,107,101,114,32,99,111,110,102,105,103,32,102,105,108,101,32,39,37,115,39,58,32,85,110,97,98,108,101,32,116,111,32,100,101,116,101,114,109,105,110,101,32,100,105,114,101,99,116,111,114,121,32,110,97,109,101,46,10,0,69,114,114,111,114,32,112,114,111,99,101,115,115,105,110,103,32,109,117,108,116,105,109,97,114,107,101,114,32,99,111,110,102,105,103,32,102,105,108,101,32,39,37,115,39,58,32,85,110,97,98,108,101,32,116,111,32,108,111,97,100,32,112,97,116,116,101,114,110,32,39,37,115,39,46,10,0,37,108,102,0,69,114,114,111,114,32,112,114,111,99,101,115,115,105,110,103,32,109,117,108,116,105,109,97,114,107,101,114,32,99,111,110,102,105,103,32,102,105,108,101,32,39,37,115,39,44,32,109,97,114,107,101,114,32,100,101,102,105,110,105,116,105,111,110,32,37,51,100,58,32,70,105,114,115,116,32,108,105,110,101,32,109,117,115,116,32,98,101,32,112,97,116,116,101,114,110,32,119,105,100,116,104,46,10,0,37,108,102,32,37,108,102,32,37,108,102,32,37,108,102,0,37,102,32,37,102,0,69,114,114,111,114,32,112,114,111,99,101,115,115,105,110,103,32,109,117,108,116,105,109,97,114,107,101,114,32,99,111,110,102,105,103,32,102,105,108,101,32,39,37,115,39,44,32,109,97,114,107,101,114,32,100,101,102,105,110,105,116,105,111,110,32,37,51,100,58,32,76,105,110,101,115,32,50,32,45,32,52,32,109,117,115,116,32,98,101,32,109,97,114,107,101,114,32,116,114,97,110,115,102,111,114,109,46,10,0,97,114,103,108,67,97,109,101,114,97,70,114,117,115,116,117,109,40,41,58,32,97,114,80,97,114,97,109,68,101,99,111,109,112,77,97,116,40,41,32,105,110,100,105,99,97,116,101,100,32,112,97,114,97,109,101,116,101,114,32,101,114,114,111,114,46,10,0,108,111,97,100,67,97,109,101,114,97,40,41,58,32,69,114,114,111,114,32,108,111,97,100,105,110,103,32,112,97,114,97,109,101,116,101,114,32,102,105,108,101,32,37,115,32,102,111,114,32,99,97,109,101,114,97,46,10,0,42,42,42,32,67,97,109,101,114,97,32,80,97,114,97,109,101,116,101,114,32,114,101,115,105,122,101,100,32,102,114,111,109,32,37,100,44,32,37,100,46,32,42,42,42,10,0,115,101,116,67,97,109,101,114,97,40,41,58,32,69,114,114,111,114,58,32,97,114,80,97,114,97,109,76,84,67,114,101,97,116,101,46,10,0,115,101,116,67,97,109,101,114,97,40,41,58,32,69,114,114,111,114,58,32,97,114,67,114,101,97,116,101,72,97,110,100,108,101,46,10,0,115,101,116,67,97,109,101,114,97,40,41,58,32,69,114,114,111,114,32,99,114,101,97,116,105,110,103,32,51,68,32,104,97,110,100,108,101,0,108,111,97,100,77,97,114,107,101,114,40,41,58,32,69,114,114,111,114,32,108,111,97,100,105,110,103,32,112,97,116,116,101,114,110,32,102,105,108,101,32,37,115,46,10,0,65,82,84,111,111,108,75,105,116,74,83,40,41,58,32,85,110,97,98,108,101,32,116,111,32,115,101,116,32,117,112,32,65,82,32,109,97,114,107,101,114,46,10,0,99,111,110,102,105,103,32,100,97,116,97,32,108,111,97,100,32,101,114,114,111,114,32,33,33,10,0,65,82,84,111,111,108,75,105,116,74,83,40,41,58,32,85,110,97,98,108,101,32,116,111,32,115,101,116,32,117,112,32,65,82,32,109,117,108,116,105,109,97,114,107,101,114,46,10,0,80,97,116,116,101,114,110,32,100,101,116,101,99,116,105,111,110,32,109,111,100,101,32,115,101,116,32,116,111,32,37,100,46,10,0,80,97,116,116,101,114,110,32,114,97,116,105,111,32,115,105,122,101,32,115,101,116,32,116,111,32,37,102,46,10,0,76,97,98,101,108,105,110,103,32,109,111,100,101,32,115,101,116,32,116,111,32,37,100,10,0,84,104,114,101,115,104,111,108,100,32,115,101,116,32,116,111,32,37,100,10,0,84,104,114,101,115,104,111,108,100,32,109,111,100,101,32,115,101,116,32,116,111,32,37,100,10,0,111,110,46,0,111,102,102,46,0,68,101,98,117,103,32,109,111,100,101,32,115,101,116,32,116,111,32,37,115,10,0,73,109,97,103,101,32,112,114,111,99,46,32,109,111,100,101,32,115,101,116,32,116,111,32,37,100,46,10,0,123,32,105,102,32,40,33,97,114,116,111,111,108,107,105,116,91,34,109,117,108,116,105,69,97,99,104,77,97,114,107,101,114,73,110,102,111,34,93,41,32,123,32,97,114,116,111,111,108,107,105,116,91,34,109,117,108,116,105,69,97,99,104,77,97,114,107,101,114,73,110,102,111,34,93,32,61,32,40,123,125,41,59,32,125,32,118,97,114,32,109,117,108,116,105,69,97,99,104,77,97,114,107,101,114,32,61,32,97,114,116,111,111,108,107,105,116,91,34,109,117,108,116,105,69,97,99,104,77,97,114,107,101,114,73,110,102,111,34,93,59,32,109,117,108,116,105,69,97,99,104,77,97,114,107,101,114,91,39,118,105,115,105,98,108,101,39,93,32,61,32,36,48,59,32,109,117,108,116,105,69,97,99,104,77,97,114,107,101,114,91,39,112,97,116,116,73,100,39,93,32,61,32,36,49,59,32,109,117,108,116,105,69,97,99,104,77,97,114,107,101,114,91,39,112,97,116,116,84,121,112,101,39,93,32,61,32,36,50,59,32,109,117,108,116,105,69,97,99,104,77,97,114,107,101,114,91,39,119,105,100,116,104,39,93,32,61,32,36,51,59,32,125,0,123,32,118,97,114,32,36,97,32,61,32,97,114,103,117,109,101,110,116,115,59,32,118,97,114,32,105,32,61,32,49,50,59,32,105,102,32,40,33,97,114,116,111,111,108,107,105,116,91,34,109,97,114,107,101,114,73,110,102,111,34,93,41,32,123,32,97,114,116,111,111,108,107,105,116,91,34,109,97,114,107,101,114,73,110,102,111,34,93,32,61,32,40,123,32,112,111,115,58,32,91,48,44,48,93,44,32,108,105,110,101,58,32,91,91,48,44,48,44,48,93,44,32,91,48,44,48,44,48,93,44,32,91,48,44,48,44,48,93,44,32,91,48,44,48,44,48,93,93,44,32,118,101,114,116,101,120,58,32,91,91,48,44,48,93,44,32,91,48,44,48,93,44,32,91,48,44,48,93,44,32,91,48,44,48,93,93,32,125,41,59,32,125,32,118,97,114,32,109,97,114,107,101,114,73,110,102,111,32,61,32,97,114,116,111,111,108,107,105,116,91,34,109,97,114,107,101,114,73,110,102,111,34,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,97,114,101,97,34,93,32,61,32,36,48,59,32,109,97,114,107,101,114,73,110,102,111,91,34,105,100,34,93,32,61,32,36,49,59,32,109,97,114,107,101,114,73,110,102,111,91,34,105,100,80,97,116,116,34,93,32,61,32,36,50,59,32,109,97,114,107,101,114,73,110,102,111,91,34,105,100,77,97,116,114,105,120,34,93,32,61,32,36,51,59,32,109,97,114,107,101,114,73,110,102,111,91,34,100,105,114,34,93,32,61,32,36,52,59,32,109,97,114,107,101,114,73,110,102,111,91,34,100,105,114,80,97,116,116,34,93,32,61,32,36,53,59,32,109,97,114,107,101,114,73,110,102,111,91,34,100,105,114,77,97,116,114,105,120,34,93,32,61,32,36,54,59,32,109,97,114,107,101,114,73,110,102,111,91,34,99,102,34,93,32,61,32,36,55,59,32,109,97,114,107,101,114,73,110,102,111,91,34,99,102,80,97,116,116,34,93,32,61,32,36,56,59,32,109,97,114,107,101,114,73,110,102,111,91,34,99,102,77,97,116,114,105,120,34,93,32,61,32,36,57,59,32,109,97,114,107,101,114,73,110,102,111,91,34,112,111,115,34,93,91,48,93,32,61,32,36,49,48,59,32,109,97,114,107,101,114,73,110,102,111,91,34,112,111,115,34,93,91,49,93,32,61,32,36,49,49,59,32,109,97,114,107,101,114,73,110,102,111,91,34,108,105,110,101,34,93,91,48,93,91,48,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,108,105,110,101,34,93,91,48,93,91,49,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,108,105,110,101,34,93,91,48,93,91,50,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,108,105,110,101,34,93,91,49,93,91,48,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,108,105,110,101,34,93,91,49,93,91,49,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,108,105,110,101,34,93,91,49,93,91,50,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,108,105,110,101,34,93,91,50,93,91,48,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,108,105,110,101,34,93,91,50,93,91,49,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,108,105,110,101,34,93,91,50,93,91,50,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,108,105,110,101,34,93,91,51,93,91,48,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,108,105,110,101,34,93,91,51,93,91,49,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,108,105,110,101,34,93,91,51,93,91,50,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,118,101,114,116,101,120,34,93,91,48,93,91,48,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,118,101,114,116,101,120,34,93,91,48,93,91,49,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,118,101,114,116,101,120,34,93,91,49,93,91,48,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,118,101,114,116,101,120,34,93,91,49,93,91,49,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,118,101,114,116,101,120,34,93,91,50,93,91,48,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,118,101,114,116,101,120,34,93,91,50,93,91,49,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,118,101,114,116,101,120,34,93,91,51,93,91,48,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,118,101,114,116,101,120,34,93,91,51,93,91,49,93,32,61,32,36,97,91,105,43,43,93,59,32,109,97,114,107,101,114,73,110,102,111,91,34,101,114,114,111,114,67,111,114,114,101,99,116,101,100,34,93,32,61,32,36,97,91,105,43,43,93,59,32,125,0,115,101,116,117,112,40,41,58,32,69,114,114,111,114,58,32,97,114,80,97,116,116,67,114,101,97,116,101,72,97,110,100,108,101,46,10,0,65,108,108,111,99,97,116,101,100,32,118,105,100,101,111,70,114,97,109,101,83,105,122,101,32,37,100,10,0,123,32,105,102,32,40,33,97,114,116,111,111,108,107,105,116,91,34,102,114,97,109,101,77,97,108,108,111,99,34,93,41,32,123,32,97,114,116,111,111,108,107,105,116,91,34,102,114,97,109,101,77,97,108,108,111,99,34,93,32,61,32,40,123,125,41,59,32,125,32,118,97,114,32,102,114,97,109,101,77,97,108,108,111,99,32,61,32,97,114,116,111,111,108,107,105,116,91,34,102,114,97,109,101,77,97,108,108,111,99,34,93,59,32,102,114,97,109,101,77,97,108,108,111,99,91,34,102,114,97,109,101,112,111,105,110,116,101,114,34,93,32,61,32,36,49,59,32,102,114,97,109,101,77,97,108,108,111,99,91,34,102,114,97,109,101,115,105,122,101,34,93,32,61,32,36,50,59,32,102,114,97,109,101,77,97,108,108,111,99,91,34,99,97,109,101,114,97,34,93,32,61,32,36,51,59,32,102,114,97,109,101,77,97,108,108,111,99,91,34,116,114,97,110,115,102,111,114,109,34,93,32,61,32,36,52,59,32,125,0,115,101,116,117,112,0,116,101,97,114,100,111,119,110,0,95,97,100,100,77,97,114,107,101,114,0,95,97,100,100,77,117,108,116,105,77,97,114,107,101,114,0,103,101,116,77,117,108,116,105,77,97,114,107,101,114,78,117,109,0,103,101,116,77,117,108,116,105,77,97,114,107,101,114,67,111,117,110,116,0,95,108,111,97,100,67,97,109,101,114,97,0,115,101,116,77,97,114,107,101,114,73,110,102,111,68,105,114,0,115,101,116,77,97,114,107,101,114,73,110,102,111,86,101,114,116,101,120,0,103,101,116,84,114,97,110,115,77,97,116,83,113,117,97,114,101,0,103,101,116,84,114,97,110,115,77,97,116,83,113,117,97,114,101,67,111,110,116,0,103,101,116,84,114,97,110,115,77,97,116,77,117,108,116,105,83,113,117,97,114,101,0,103,101,116,84,114,97,110,115,77,97,116,77,117,108,116,105,83,113,117,97,114,101,82,111,98,117,115,116,0,100,101,116,101,99,116,77,97,114,107,101,114,0,103,101,116,77,97,114,107,101,114,78,117,109,0,103,101,116,77,117,108,116,105,69,97,99,104,77,97,114,107,101,114,0,103,101,116,77,97,114,107,101,114,0,115,101,116,68,101,98,117,103,77,111,100,101,0,103,101,116,68,101,98,117,103,77,111,100,101,0,103,101,116,80,114,111,99,101,115,115,105,110,103,73,109,97,103,101,0,115,101,116,76,111,103,76,101,118,101,108,0,103,101,116,76,111,103,76,101,118,101,108,0,115,101,116,80,114,111,106,101,99,116,105,111,110,78,101,97,114,80,108,97,110,101,0,103,101,116,80,114,111,106,101,99,116,105,111,110,78,101,97,114,80,108,97,110,101,0,115,101,116,80,114,111,106,101,99,116,105,111,110,70,97,114,80,108,97,110,101,0,103,101,116,80,114,111,106,101,99,116,105,111,110,70,97,114,80,108,97,110,101,0,115,101,116,84,104,114,101,115,104,111,108,100,77,111,100,101,0,103,101,116,84,104,114,101,115,104,111,108,100,77,111,100,101,0,115,101,116,84,104,114,101,115,104,111,108,100,0,103,101,116,84,104,114,101,115,104,111,108,100,0,115,101,116,80,97,116,116,101,114,110,68,101,116,101,99,116,105,111,110,77,111,100,101,0,103,101,116,80,97,116,116,101,114,110,68,101,116,101,99,116,105,111,110,77,111,100,101,0,115,101,116,80,97,116,116,82,97,116,105,111,0,103,101,116,80,97,116,116,82,97,116,105,111,0,115,101,116,77,97,116,114,105,120,67,111,100,101,84,121,112,101,0,103,101,116,77,97,116,114,105,120,67,111,100,101,84,121,112,101,0,115,101,116,76,97,98,101,108,105,110,103,77,111,100,101,0,103,101,116,76,97,98,101,108,105,110,103,77,111,100,101,0,115,101,116,73,109,97,103,101,80,114,111,99,77,111,100,101,0,103,101,116,73,109,97,103,101,80,114,111,99,77,111,100,101,0,69,82,82,79,82,95,65,82,67,79,78,84,82,79,76,76,69,82,95,78,79,84,95,70,79,85,78,68,0,69,82,82,79,82,95,77,85,76,84,73,77,65,82,75,69,82,95,78,79,84,95,70,79,85,78,68,0,69,82,82,79,82,95,77,65,82,75,69,82,95,73,78,68,69,88,95,79,85,84,95,79,70,95,66,79,85,78,68,83,0,65,82,95,68,69,66,85,71,95,68,73,83,65,66,76,69,0,65,82,95,68,69,66,85,71,95,69,78,65,66,76,69,0,65,82,95,68,69,70,65,85,76,84,95,68,69,66,85,71,95,77,79,68,69,0,65,82,95,76,65,66,69,76,73,78,71,95,87,72,73,84,69,95,82,69,71,73,79,78,0,65,82,95,76,65,66,69,76,73,78,71,95,66,76,65,67,75,95,82,69,71,73,79,78,0,65,82,95,68,69,70,65,85,76,84,95,76,65,66,69,76,73,78,71,95,77,79,68,69,0,65,82,95,68,69,70,65,85,76,84,95,76,65,66,69,76,73,78,71,95,84,72,82,69,83,72,0,65,82,95,73,77,65,71,69,95,80,82,79,67,95,70,82,65,77,69,95,73,77,65,71,69,0,65,82,95,73,77,65,71,69,95,80,82,79,67,95,70,73,69,76,68,95,73,77,65,71,69,0,65,82,95,68,69,70,65,85,76,84,95,73,77,65,71,69,95,80,82,79,67,95,77,79,68,69,0,65,82,95,84,69,77,80,76,65,84,69,95,77,65,84,67,72,73,78,71,95,67,79,76,79,82,0,65,82,95,84,69,77,80,76,65,84,69,95,77,65,84,67,72,73,78,71,95,77,79,78,79,0,65,82,95,77,65,84,82,73,88,95,67,79,68,69,95,68,69,84,69,67,84,73,79,78,0,65,82,95,84,69,77,80,76,65,84,69,95,77,65,84,67,72,73,78,71,95,67,79,76,79,82,95,65,78,68,95,77,65,84,82,73,88,0,65,82,95,84,69,77,80,76,65,84,69,95,77,65,84,67,72,73,78,71,95,77,79,78,79,95,65,78,68,95,77,65,84,82,73,88,0,65,82,95,68,69,70,65,85,76,84,95,80,65,84,84,69,82,78,95,68,69,84,69,67,84,73,79,78,95,77,79,68,69,0,65,82,95,85,83,69,95,84,82,65,67,75,73,78,71,95,72,73,83,84,79,82,89,0,65,82,95,78,79,85,83,69,95,84,82,65,67,75,73,78,71,95,72,73,83,84,79,82,89,0,65,82,95,85,83,69,95,84,82,65,67,75,73,78,71,95,72,73,83,84,79,82,89,95,86,50,0,65,82,95,68,69,70,65,85,76,84,95,77,65,82,75,69,82,95,69,88,84,82,65,67,84,73,79,78,95,77,79,68,69,0,65,82,95,77,65,88,95,76,79,79,80,95,67,79,85,78,84,0,65,82,95,76,79,79,80,95,66,82,69,65,75,95,84,72,82,69,83,72,0,65,82,95,76,79,71,95,76,69,86,69,76,95,68,69,66,85,71,0,65,82,95,76,79,71,95,76,69,86,69,76,95,73,78,70,79,0,65,82,95,76,79,71,95,76,69,86,69,76,95,87,65,82,78,0,65,82,95,76,79,71,95,76,69,86,69,76,95,69,82,82,79,82,0,65,82,95,76,79,71,95,76,69,86,69,76,95,82,69,76,95,73,78,70,79,0,65,82,95,77,65,84,82,73,88,95,67,79,68,69,95,51,120,51,0,65,82,95,77,65,84,82,73,88,95,67,79,68,69,95,51,120,51,95,72,65,77,77,73,78,71,54,51,0,65,82,95,77,65,84,82,73,88,95,67,79,68,69,95,51,120,51,95,80,65,82,73,84,89,54,53,0,65,82,95,77,65,84,82,73,88,95,67,79,68,69,95,52,120,52,0,65,82,95,77,65,84,82,73,88,95,67,79,68,69,95,52,120,52,95,66,67,72,95,49,51,95,57,95,51,0,65,82,95,77,65,84,82,73,88,95,67,79,68,69,95,52,120,52,95,66,67,72,95,49,51,95,53,95,53,0,65,82,95,76,65,66,69,76,73,78,71,95,84,72,82,69,83,72,95,77,79,68,69,95,77,65,78,85,65,76,0,65,82,95,76,65,66,69,76,73,78,71,95,84,72,82,69,83,72,95,77,79,68,69,95,65,85,84,79,95,77,69,68,73,65,78,0,65,82,95,76,65],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE);allocate([66,69,76,73,78,71,95,84,72,82,69,83,72,95,77,79,68,69,95,65,85,84,79,95,79,84,83,85,0,65,82,95,76,65,66,69,76,73,78,71,95,84,72,82,69,83,72,95,77,79,68,69,95,65,85,84,79,95,65,68,65,80,84,73,86,69,0,65,82,95,77,65,82,75,69,82,95,73,78,70,79,95,67,85,84,79,70,70,95,80,72,65,83,69,95,78,79,78,69,0,65,82,95,77,65,82,75,69,82,95,73,78,70,79,95,67,85,84,79,70,70,95,80,72,65,83,69,95,80,65,84,84,69,82,78,95,69,88,84,82,65,67,84,73,79,78,0,65,82,95,77,65,82,75,69,82,95,73,78,70,79,95,67,85,84,79,70,70,95,80,72,65,83,69,95,77,65,84,67,72,95,71,69,78,69,82,73,67,0,65,82,95,77,65,82,75,69,82,95,73,78,70,79,95,67,85,84,79,70,70,95,80,72,65,83,69,95,77,65,84,67,72,95,67,79,78,84,82,65,83,84,0,65,82,95,77,65,82,75,69,82,95,73,78,70,79,95,67,85,84,79,70,70,95,80,72,65,83,69,95,77,65,84,67,72,95,66,65,82,67,79,68,69,95,78,79,84,95,70,79,85,78,68,0,65,82,95,77,65,82,75,69,82,95,73,78,70,79,95,67,85,84,79,70,70,95,80,72,65,83,69,95,77,65,84,67,72,95,66,65,82,67,79,68,69,95,69,68,67,95,70,65,73,76,0,65,82,95,77,65,82,75,69,82,95,73,78,70,79,95,67,85,84,79,70,70,95,80,72,65,83,69,95,77,65,84,67,72,95,67,79,78,70,73,68,69,78,67,69,0,65,82,95,77,65,82,75,69,82,95,73,78,70,79,95,67,85,84,79,70,70,95,80,72,65,83,69,95,80,79,83,69,95,69,82,82,79,82,0,65,82,95,77,65,82,75,69,82,95,73,78,70,79,95,67,85,84,79,70,70,95,80,72,65,83,69,95,80,79,83,69,95,69,82,82,79,82,95,77,85,76,84,73,0,65,82,95,77,65,82,75,69,82,95,73,78,70,79,95,67,85,84,79,70,70,95,80,72,65,83,69,95,72,69,85,82,73,83,84,73,67,95,84,82,79,85,66,76,69,83,79,77,69,95,77,65,84,82,73,88,95,67,79,68,69,83,0,118,105,105,102,0,118,105,105,105,0,100,105,105,0,118,105,105,100,0,105,105,0,118,105,105,0,105,105,105,0,78,83,116,51,95,95,49,49,50,98,97,115,105,99,95,115,116,114,105,110,103,73,99,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,99,69,69,78,83,95,57,97,108,108,111,99,97,116,111,114,73,99,69,69,69,69,0,78,83,116,51,95,95,49,50,49,95,95,98,97,115,105,99,95,115,116,114,105,110,103,95,99,111,109,109,111,110,73,76,98,49,69,69,69,0,105,105,105,105,0,105,105,105,105,105,0,118,111,105,100,0,98,111,111,108,0,99,104,97,114,0,115,105,103,110,101,100,32,99,104,97,114,0,117,110,115,105,103,110,101,100,32,99,104,97,114,0,115,104,111,114,116,0,117,110,115,105,103,110,101,100,32,115,104,111,114,116,0,105,110,116,0,117,110,115,105,103,110,101,100,32,105,110,116,0,108,111,110,103,0,117,110,115,105,103,110,101,100,32,108,111,110,103,0,102,108,111,97,116,0,100,111,117,98,108,101,0,115,116,100,58,58,115,116,114,105,110,103,0,115,116,100,58,58,98,97,115,105,99,95,115,116,114,105,110,103,60,117,110,115,105,103,110,101,100,32,99,104,97,114,62,0,115,116,100,58,58,119,115,116,114,105,110,103,0,101,109,115,99,114,105,112,116,101,110,58,58,118,97,108,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,99,104,97,114,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,115,105,103,110,101,100,32,99,104,97,114,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,117,110,115,105,103,110,101,100,32,99,104,97,114,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,115,104,111,114,116,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,117,110,115,105,103,110,101,100,32,115,104,111,114,116,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,105,110,116,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,117,110,115,105,103,110,101,100,32,105,110,116,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,108,111,110,103,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,117,110,115,105,103,110,101,100,32,108,111,110,103,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,105,110,116,56,95,116,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,117,105,110,116,56,95,116,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,105,110,116,49,54,95,116,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,117,105,110,116,49,54,95,116,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,105,110,116,51,50,95,116,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,117,105,110,116,51,50,95,116,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,102,108,111,97,116,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,100,111,117,98,108,101,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,108,111,110,103,32,100,111,117,98,108,101,62,0,78,49,48,101,109,115,99,114,105,112,116,101,110,49,49,109,101,109,111,114,121,95,118,105,101,119,73,101,69,69,0,78,49,48,101,109,115,99,114,105,112,116,101,110,49,49,109,101,109,111,114,121,95,118,105,101,119,73,100,69,69,0,78,49,48,101,109,115,99,114,105,112,116,101,110,49,49,109,101,109,111,114,121,95,118,105,101,119,73,102,69,69,0,78,49,48,101,109,115,99,114,105,112,116,101,110,49,49,109,101,109,111,114,121,95,118,105,101,119,73,109,69,69,0,78,49,48,101,109,115,99,114,105,112,116,101,110,49,49,109,101,109,111,114,121,95,118,105,101,119,73,108,69,69,0,78,49,48,101,109,115,99,114,105,112,116,101,110,49,49,109,101,109,111,114,121,95,118,105,101,119,73,106,69,69,0,78,49,48,101,109,115,99,114,105,112,116,101,110,49,49,109,101,109,111,114,121,95,118,105,101,119,73,105,69,69,0,78,49,48,101,109,115,99,114,105,112,116,101,110,49,49,109,101,109,111,114,121,95,118,105,101,119,73,116,69,69,0,78,49,48,101,109,115,99,114,105,112,116,101,110,49,49,109,101,109,111,114,121,95,118,105,101,119,73,115,69,69,0,78,49,48,101,109,115,99,114,105,112,116,101,110,49,49,109,101,109,111,114,121,95,118,105,101,119,73,104,69,69,0,78,49,48,101,109,115,99,114,105,112,116,101,110,49,49,109,101,109,111,114,121,95,118,105,101,119,73,97,69,69,0,78,49,48,101,109,115,99,114,105,112,116,101,110,49,49,109,101,109,111,114,121,95,118,105,101,119,73,99,69,69,0,78,49,48,101,109,115,99,114,105,112,116,101,110,51,118,97,108,69,0,78,83,116,51,95,95,49,49,50,98,97,115,105,99,95,115,116,114,105,110,103,73,119,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,119,69,69,78,83,95,57,97,108,108,111,99,97,116,111,114,73,119,69,69,69,69,0,78,83,116,51,95,95,49,49,50,98,97,115,105,99,95,115,116,114,105,110,103,73,104,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,104,69,69,78,83,95,57,97,108,108,111,99,97,116,111,114,73,104,69,69,69,69,0,83,116,57,98,97,100,95,97,108,108,111,99,0,83,116,57,101,120,99,101,112,116,105,111,110,0,83,116,57,116,121,112,101,95,105,110,102,111,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,54,95,95,115,104,105,109,95,116,121,112,101,95,105,110,102,111,69,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,55,95,95,99,108,97,115,115,95,116,121,112,101,95,105,110,102,111,69,0,78,49,48,95,95,99,120,120,97,98,105,118,49,50,51,95,95,102,117,110,100,97,109,101,110,116,97,108,95,116,121,112,101,95,105,110,102,111,69,0,118,0,98,0,99,0,104,0,97,0,115,0,116,0,105,0,106,0,108,0,109,0,102,0,100,0,78,49,48,95,95,99,120,120,97,98,105,118,49,50,48,95,95,115,105,95,99,108,97,115,115,95,116,121,112,101,95,105,110,102,111,69,0,78,49,48,95,95,99,120,120,97,98,105,118,49,50,49,95,95,118,109,105,95,99,108,97,115,115,95,116,121,112,101,95,105,110,102,111,69,0,33,34,118,101,99,116,111,114,32,108,101,110,103,116,104,95,101,114,114,111,114,34,0,47,85,115,101,114,115,47,106,101,114,111,109,101,101,116,105,101,110,110,101,47,119,111,114,107,47,101,109,115,100,107,95,112,111,114,116,97,98,108,101,47,101,109,115,99,114,105,112,116,101,110,47,49,46,51,53,46,48,47,115,121,115,116,101,109,47,105,110,99,108,117,100,101,47,108,105,98,99,120,120,47,118,101,99,116,111,114,0,95,95,116,104,114,111,119,95,108,101,110,103,116,104,95,101,114,114,111,114,0,115,116,100,58,58,98,97,100,95,97,108,108,111,99,0,33,34,98,97,115,105,99,95,115,116,114,105,110,103,32,108,101,110,103,116,104,95,101,114,114,111,114,34,0,47,85,115,101,114,115,47,106,101,114,111,109,101,101,116,105,101,110,110,101,47,119,111,114,107,47,101,109,115,100,107,95,112,111,114,116,97,98,108,101,47,101,109,115,99,114,105,112,116,101,110,47,49,46,51,53,46,48,47,115,121,115,116,101,109,47,105,110,99,108,117,100,101,47,108,105,98,99,120,120,47,115,116,114,105,110,103,0,84,33,34,25,13,1,2,3,17,75,28,12,16,4,11,29,18,30,39,104,110,111,112,113,98,32,5,6,15,19,20,21,26,8,22,7,40,36,23,24,9,10,14,27,31,37,35,131,130,125,38,42,43,60,61,62,63,67,71,74,77,88,89,90,91,92,93,94,95,96,97,99,100,101,102,103,105,106,107,108,114,115,116,121,122,123,124,0,73,108,108,101,103,97,108,32,98,121,116,101,32,115,101,113,117,101,110,99,101,0,68,111,109,97,105,110,32,101,114,114,111,114,0,82,101,115,117,108,116,32,110,111,116,32,114,101,112,114,101,115,101,110,116,97,98,108,101,0,78,111,116,32,97,32,116,116,121,0,80,101,114,109,105,115,115,105,111,110,32,100,101,110,105,101,100,0,79,112,101,114,97,116,105,111,110,32,110,111,116,32,112,101,114,109,105,116,116,101,100,0,78,111,32,115,117,99,104,32,102,105,108,101,32,111,114,32,100,105,114,101,99,116,111,114,121,0,78,111,32,115,117,99,104,32,112,114,111,99,101,115,115,0,70,105,108,101,32,101,120,105,115,116,115,0,86,97,108,117,101,32,116,111,111,32,108,97,114,103,101,32,102,111,114,32,100,97,116,97,32,116,121,112,101,0,78,111,32,115,112,97,99,101,32,108,101,102,116,32,111,110,32,100,101,118,105,99,101,0,79,117,116,32,111,102,32,109,101,109,111,114,121,0,82,101,115,111,117,114,99,101,32,98,117,115,121,0,73,110,116,101,114,114,117,112,116,101,100,32,115,121,115,116,101,109,32,99,97,108,108,0,82,101,115,111,117,114,99,101,32,116,101,109,112,111,114,97,114,105,108,121,32,117,110,97,118,97,105,108,97,98,108,101,0,73,110,118,97,108,105,100,32,115,101,101,107,0,67,114,111,115,115,45,100,101,118,105,99,101,32,108,105,110,107,0,82,101,97,100,45,111,110,108,121,32,102,105,108,101,32,115,121,115,116,101,109,0,68,105,114,101,99,116,111,114,121,32,110,111,116,32,101,109,112,116,121,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,112,101,101,114,0,79,112,101,114,97,116,105,111,110,32,116,105,109,101,100,32,111,117,116,0,67,111,110,110,101,99,116,105,111,110,32,114,101,102,117,115,101,100,0,72,111,115,116,32,105,115,32,100,111,119,110,0,72,111,115,116,32,105,115,32,117,110,114,101,97,99,104,97,98,108,101,0,65,100,100,114,101,115,115,32,105,110,32,117,115,101,0,66,114,111,107,101,110,32,112,105,112,101,0,73,47,79,32,101,114,114,111,114,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,32,111,114,32,97,100,100,114,101,115,115,0,66,108,111,99,107,32,100,101,118,105,99,101,32,114,101,113,117,105,114,101,100,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,0,78,111,116,32,97,32,100,105,114,101,99,116,111,114,121,0,73,115,32,97,32,100,105,114,101,99,116,111,114,121,0,84,101,120,116,32,102,105,108,101,32,98,117,115,121,0,69,120,101,99,32,102,111,114,109,97,116,32,101,114,114,111,114,0,73,110,118,97,108,105,100,32,97,114,103,117,109,101,110,116,0,65,114,103,117,109,101,110,116,32,108,105,115,116,32,116,111,111,32,108,111,110,103,0,83,121,109,98,111,108,105,99,32,108,105,110,107,32,108,111,111,112,0,70,105,108,101,110,97,109,101,32,116,111,111,32,108,111,110,103,0,84,111,111,32,109,97,110,121,32,111,112,101,110,32,102,105,108,101,115,32,105,110,32,115,121,115,116,101,109,0,78,111,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,115,32,97,118,97,105,108,97,98,108,101,0,66,97,100,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,0,78,111,32,99,104,105,108,100,32,112,114,111,99,101,115,115,0,66,97,100,32,97,100,100,114,101,115,115,0,70,105,108,101,32,116,111,111,32,108,97,114,103,101,0,84,111,111,32,109,97,110,121,32,108,105,110,107,115,0,78,111,32,108,111,99,107,115,32,97,118,97,105,108,97,98,108,101,0,82,101,115,111,117,114,99,101,32,100,101,97,100,108,111,99,107,32,119,111,117,108,100,32,111,99,99,117,114,0,83,116,97,116,101,32,110,111,116,32,114,101,99,111,118,101,114,97,98,108,101,0,80,114,101,118,105,111,117,115,32,111,119,110,101,114,32,100,105,101,100,0,79,112,101,114,97,116,105,111,110,32,99,97,110,99,101,108,101,100,0,70,117,110,99,116,105,111,110,32,110,111,116,32,105,109,112,108,101,109,101,110,116,101,100,0,78,111,32,109,101,115,115,97,103,101,32,111,102,32,100,101,115,105,114,101,100,32,116,121,112,101,0,73,100,101,110,116,105,102,105,101,114,32,114,101,109,111,118,101,100,0,68,101,118,105,99,101,32,110,111,116,32,97,32,115,116,114,101,97,109,0,78,111,32,100,97,116,97,32,97,118,97,105,108,97,98,108,101,0,68,101,118,105,99,101,32,116,105,109,101,111,117,116,0,79,117,116,32,111,102,32,115,116,114,101,97,109,115,32,114,101,115,111,117,114,99,101,115,0,76,105,110,107,32,104,97,115,32,98,101,101,110,32,115,101,118,101,114,101,100,0,80,114,111,116,111,99,111,108,32,101,114,114,111,114,0,66,97,100,32,109,101,115,115,97,103,101,0,70,105,108,101,32,100,101,115,99,114,105,112,116,111,114,32,105,110,32,98,97,100,32,115,116,97,116,101,0,78,111,116,32,97,32,115,111,99,107,101,116,0,68,101,115,116,105,110,97,116,105,111,110,32,97,100,100,114,101,115,115,32,114,101,113,117,105,114,101,100,0,77,101,115,115,97,103,101,32,116,111,111,32,108,97,114,103,101,0,80,114,111,116,111,99,111,108,32,119,114,111,110,103,32,116,121,112,101,32,102,111,114,32,115,111,99,107,101,116,0,80,114,111,116,111,99,111,108,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,80,114,111,116,111,99,111,108,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,83,111,99,107,101,116,32,116,121,112,101,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,78,111,116,32,115,117,112,112,111,114,116,101,100,0,80,114,111,116,111,99,111,108,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,65,100,100,114,101,115,115,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,98,121,32,112,114,111,116,111,99,111,108,0,65,100,100,114,101,115,115,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,78,101,116,119,111,114,107,32,105,115,32,100,111,119,110,0,78,101,116,119,111,114,107,32,117,110,114,101,97,99,104,97,98,108,101,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,110,101,116,119,111,114,107,0,67,111,110,110,101,99,116,105,111,110,32,97,98,111,114,116,101,100,0,78,111,32,98,117,102,102,101,114,32,115,112,97,99,101,32,97,118,97,105,108,97,98,108,101,0,83,111,99,107,101,116,32,105,115,32,99,111,110,110,101,99,116,101,100,0,83,111,99,107,101,116,32,110,111,116,32,99,111,110,110,101,99,116,101,100,0,67,97,110,110,111,116,32,115,101,110,100,32,97,102,116,101,114,32,115,111,99,107,101,116,32,115,104,117,116,100,111,119,110,0,79,112,101,114,97,116,105,111,110,32,97,108,114,101,97,100,121,32,105,110,32,112,114,111,103,114,101,115,115,0,79,112,101,114,97,116,105,111,110,32,105,110,32,112,114,111,103,114,101,115,115,0,83,116,97,108,101,32,102,105,108,101,32,104,97,110,100,108,101,0,82,101,109,111,116,101,32,73,47,79,32,101,114,114,111,114,0,81,117,111,116,97,32,101,120,99,101,101,100,101,100,0,78,111,32,109,101,100,105,117,109,32,102,111,117,110,100,0,87,114,111,110,103,32,109,101,100,105,117,109,32,116,121,112,101,0,78,111,32,101,114,114,111,114,32,105,110,102,111,114,109,97,116,105,111,110,0,0,105,110,102,105,110,105,116,121,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,1,2,3,4,5,6,7,8,9,255,255,255,255,255,255,255,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,255,255,255,255,255,255,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,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,1,2,4,7,3,6,5,0,114,119,97],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+10240);allocate([17,0,10,0,17,17,17,0,0,0,0,5,0,0,0,0,0,0,9,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,15,10,17,17,17,3,10,7,0,1,19,9,11,11,0,0,9,6,11,0,0,11,0,6,17,0,0,0,17,17,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,10,10,17,17,17,0,10,0,0,2,0,9,11,0,0,0,9,0,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,4,13,0,0,0,0,9,14,0,0,0,0,0,14,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,15,0,0,0,0,9,16,0,0,0,0,0,16,0,0,16,0,0,18,0,0,0,18,18,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,18,18,18,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,0,0,0,0,9,11,0,0,0,0,0,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70,45,43,32,32,32,48,88,48,120,0,40,110,117,108,108,41,0,45,48,88,43,48,88,32,48,88,45,48,120,43,48,120,32,48,120,0,105,110,102,0,73,78,70,0,110,97,110,0,78,65,78,0,46,0],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+15945);var tempDoublePtr=Runtime.alignMemory(allocate(12,"i8",ALLOC_STATIC),8);assert(tempDoublePtr%8==0);function copyTempFloat(ptr){HEAP8[tempDoublePtr]=HEAP8[ptr];HEAP8[tempDoublePtr+1]=HEAP8[ptr+1];HEAP8[tempDoublePtr+2]=HEAP8[ptr+2];HEAP8[tempDoublePtr+3]=HEAP8[ptr+3]}function copyTempDouble(ptr){HEAP8[tempDoublePtr]=HEAP8[ptr];HEAP8[tempDoublePtr+1]=HEAP8[ptr+1];HEAP8[tempDoublePtr+2]=HEAP8[ptr+2];HEAP8[tempDoublePtr+3]=HEAP8[ptr+3];HEAP8[tempDoublePtr+4]=HEAP8[ptr+4];HEAP8[tempDoublePtr+5]=HEAP8[ptr+5];HEAP8[tempDoublePtr+6]=HEAP8[ptr+6];HEAP8[tempDoublePtr+7]=HEAP8[ptr+7]}function _atexit(func,arg){__ATEXIT__.unshift({func:func,arg:arg})}function ___cxa_atexit(){return _atexit.apply(null,arguments)}Module["_i64Subtract"]=_i64Subtract;function ___assert_fail(condition,filename,line,func){ABORT=true;throw"Assertion failed: "+Pointer_stringify(condition)+", at: "+[filename?Pointer_stringify(filename):"unknown filename",line,func?Pointer_stringify(func):"unknown function"]+" at "+stackTrace()}function embind_init_charCodes(){var codes=new Array(256);for(var i=0;i<256;++i){codes[i]=String.fromCharCode(i)}embind_charCodes=codes}var embind_charCodes=undefined;function readLatin1String(ptr){var ret="";var c=ptr;while(HEAPU8[c]){ret+=embind_charCodes[HEAPU8[c++]]}return ret}var awaitingDependencies={};var registeredTypes={};var typeDependencies={};var char_0=48;var char_9=57;function makeLegalFunctionName(name){if(undefined===name){return"_unknown"}name=name.replace(/[^a-zA-Z0-9_]/g,"$");var f=name.charCodeAt(0);if(f>=char_0&&f<=char_9){return"_"+name}else{return name}}function createNamedFunction(name,body){name=makeLegalFunctionName(name);return(new Function("body","return function "+name+"() {\n"+' "use strict";'+" return body.apply(this, arguments);\n"+"};\n"))(body)}function extendError(baseErrorType,errorName){var errorClass=createNamedFunction(errorName,(function(message){this.name=errorName;this.message=message;var stack=(new Error(message)).stack;if(stack!==undefined){this.stack=this.toString()+"\n"+stack.replace(/^Error(:[^\n]*)?\n/,"")}}));errorClass.prototype=Object.create(baseErrorType.prototype);errorClass.prototype.constructor=errorClass;errorClass.prototype.toString=(function(){if(this.message===undefined){return this.name}else{return this.name+": "+this.message}});return errorClass}var BindingError=undefined;function throwBindingError(message){throw new BindingError(message)}var InternalError=undefined;function throwInternalError(message){throw new InternalError(message)}function whenDependentTypesAreResolved(myTypes,dependentTypes,getTypeConverters){myTypes.forEach((function(type){typeDependencies[type]=dependentTypes}));function onComplete(typeConverters){var myTypeConverters=getTypeConverters(typeConverters);if(myTypeConverters.length!==myTypes.length){throwInternalError("Mismatched type converter count")}for(var i=0;i<myTypes.length;++i){registerType(myTypes[i],myTypeConverters[i])}}var typeConverters=new Array(dependentTypes.length);var unregisteredTypes=[];var registered=0;dependentTypes.forEach((function(dt,i){if(registeredTypes.hasOwnProperty(dt)){typeConverters[i]=registeredTypes[dt]}else{unregisteredTypes.push(dt);if(!awaitingDependencies.hasOwnProperty(dt)){awaitingDependencies[dt]=[]}awaitingDependencies[dt].push((function(){typeConverters[i]=registeredTypes[dt];++registered;if(registered===unregisteredTypes.length){onComplete(typeConverters)}}))}}));if(0===unregisteredTypes.length){onComplete(typeConverters)}}function registerType(rawType,registeredInstance,options){options=options||{};if(!("argPackAdvance"in registeredInstance)){throw new TypeError("registerType registeredInstance requires argPackAdvance")}var name=registeredInstance.name;if(!rawType){throwBindingError('type "'+name+'" must have a positive integer typeid pointer')}if(registeredTypes.hasOwnProperty(rawType)){if(options.ignoreDuplicateRegistrations){return}else{throwBindingError("Cannot register type '"+name+"' twice")}}registeredTypes[rawType]=registeredInstance;delete typeDependencies[rawType];if(awaitingDependencies.hasOwnProperty(rawType)){var callbacks=awaitingDependencies[rawType];delete awaitingDependencies[rawType];callbacks.forEach((function(cb){cb()}))}}function __embind_register_void(rawType,name){name=readLatin1String(name);registerType(rawType,{isVoid:true,name:name,"argPackAdvance":0,"fromWireType":(function(){return undefined}),"toWireType":(function(destructors,o){return undefined})})}function __ZSt18uncaught_exceptionv(){return!!__ZSt18uncaught_exceptionv.uncaught_exception}var EXCEPTIONS={last:0,caught:[],infos:{},deAdjust:(function(adjusted){if(!adjusted||EXCEPTIONS.infos[adjusted])return adjusted;for(var ptr in EXCEPTIONS.infos){var info=EXCEPTIONS.infos[ptr];if(info.adjusted===adjusted){return ptr}}return adjusted}),addRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];info.refcount++}),decRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];assert(info.refcount>0);info.refcount--;if(info.refcount===0){if(info.destructor){Runtime.dynCall("vi",info.destructor,[ptr])}delete EXCEPTIONS.infos[ptr];___cxa_free_exception(ptr)}}),clearRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];info.refcount=0})};function ___resumeException(ptr){if(!EXCEPTIONS.last){EXCEPTIONS.last=ptr}EXCEPTIONS.clearRef(EXCEPTIONS.deAdjust(ptr));throw ptr+" - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch."}function ___cxa_find_matching_catch(){var thrown=EXCEPTIONS.last;if(!thrown){return(asm["setTempRet0"](0),0)|0}var info=EXCEPTIONS.infos[thrown];var throwntype=info.type;if(!throwntype){return(asm["setTempRet0"](0),thrown)|0}var typeArray=Array.prototype.slice.call(arguments);var pointer=Module["___cxa_is_pointer_type"](throwntype);if(!___cxa_find_matching_catch.buffer)___cxa_find_matching_catch.buffer=_malloc(4);HEAP32[___cxa_find_matching_catch.buffer>>2]=thrown;thrown=___cxa_find_matching_catch.buffer;for(var i=0;i<typeArray.length;i++){if(typeArray[i]&&Module["___cxa_can_catch"](typeArray[i],throwntype,thrown)){thrown=HEAP32[thrown>>2];info.adjusted=thrown;return(asm["setTempRet0"](typeArray[i]),thrown)|0}}thrown=HEAP32[thrown>>2];return(asm["setTempRet0"](throwntype),thrown)|0}function ___cxa_throw(ptr,type,destructor){EXCEPTIONS.infos[ptr]={ptr:ptr,adjusted:ptr,type:type,destructor:destructor,refcount:0};EXCEPTIONS.last=ptr;if(!("uncaught_exception"in __ZSt18uncaught_exceptionv)){__ZSt18uncaught_exceptionv.uncaught_exception=1}else{__ZSt18uncaught_exceptionv.uncaught_exception++}throw ptr+" - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch."}Module["_memset"]=_memset;var _BDtoILow=true;function getShiftFromSize(size){switch(size){case 1:return 0;case 2:return 1;case 4:return 2;case 8:return 3;default:throw new TypeError("Unknown type size: "+size)}}function __embind_register_bool(rawType,name,size,trueValue,falseValue){var shift=getShiftFromSize(size);name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":(function(wt){return!!wt}),"toWireType":(function(destructors,o){return o?trueValue:falseValue}),"argPackAdvance":8,"readValueFromPointer":(function(pointer){var heap;if(size===1){heap=HEAP8}else if(size===2){heap=HEAP16}else if(size===4){heap=HEAP32}else{throw new TypeError("Unknown boolean type size: "+name)}return this["fromWireType"](heap[pointer>>shift])}),destructorFunction:null})}Module["_bitshift64Shl"]=_bitshift64Shl;function _abort(){Module["abort"]()}function _free(){}Module["_free"]=_free;function _malloc(bytes){var ptr=Runtime.dynamicAlloc(bytes+8);return ptr+8&4294967288}Module["_malloc"]=_malloc;function simpleReadValueFromPointer(pointer){return this["fromWireType"](HEAPU32[pointer>>2])}function __embind_register_std_string(rawType,name){name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":(function(value){var length=HEAPU32[value>>2];var a=new Array(length);for(var i=0;i<length;++i){a[i]=String.fromCharCode(HEAPU8[value+4+i])}_free(value);return a.join("")}),"toWireType":(function(destructors,value){if(value instanceof ArrayBuffer){value=new Uint8Array(value)}function getTAElement(ta,index){return ta[index]}function getStringElement(string,index){return string.charCodeAt(index)}var getElement;if(value instanceof Uint8Array){getElement=getTAElement}else if(value instanceof Int8Array){getElement=getTAElement}else if(typeof value==="string"){getElement=getStringElement}else{throwBindingError("Cannot pass non-string to std::string")}var length=value.length;var ptr=_malloc(4+length);HEAPU32[ptr>>2]=length;for(var i=0;i<length;++i){var charCode=getElement(value,i);if(charCode>255){_free(ptr);throwBindingError("String has UTF-16 code units that do not fit in 8 bits")}HEAPU8[ptr+4+i]=charCode}if(destructors!==null){destructors.push(_free,ptr)}return ptr}),"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:(function(ptr){_free(ptr)})})}function __embind_register_std_wstring(rawType,charSize,name){name=readLatin1String(name);var getHeap,shift;if(charSize===2){getHeap=(function(){return HEAPU16});shift=1}else if(charSize===4){getHeap=(function(){return HEAPU32});shift=2}registerType(rawType,{name:name,"fromWireType":(function(value){var HEAP=getHeap();var length=HEAPU32[value>>2];var a=new Array(length);var start=value+4>>shift;for(var i=0;i<length;++i){a[i]=String.fromCharCode(HEAP[start+i])}_free(value);return a.join("")}),"toWireType":(function(destructors,value){var HEAP=getHeap();var length=value.length;var ptr=_malloc(4+length*charSize);HEAPU32[ptr>>2]=length;var start=ptr+4>>shift;for(var i=0;i<length;++i){HEAP[start+i]=value.charCodeAt(i)}if(destructors!==null){destructors.push(_free,ptr)}return ptr}),"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:(function(ptr){_free(ptr)})})}function ___lock(){}function ___unlock(){}var _emscripten_asm_const_int=true;Module["_i64Add"]=_i64Add;var _fabs=Math_abs;var _sqrt=Math_sqrt;function _embind_repr(v){if(v===null){return"null"}var t=typeof v;if(t==="object"||t==="array"||t==="function"){return v.toString()}else{return""+v}}function integerReadValueFromPointer(name,shift,signed){switch(shift){case 0:return signed?function readS8FromPointer(pointer){return HEAP8[pointer]}:function readU8FromPointer(pointer){return HEAPU8[pointer]};case 1:return signed?function readS16FromPointer(pointer){return HEAP16[pointer>>1]}:function readU16FromPointer(pointer){return HEAPU16[pointer>>1]};case 2:return signed?function readS32FromPointer(pointer){return HEAP32[pointer>>2]}:function readU32FromPointer(pointer){return HEAPU32[pointer>>2]};default:throw new TypeError("Unknown integer type: "+name)}}function __embind_register_integer(primitiveType,name,size,minRange,maxRange){name=readLatin1String(name);if(maxRange===-1){maxRange=4294967295}var shift=getShiftFromSize(size);var fromWireType=(function(value){return value});if(minRange===0){var bitshift=32-8*size;fromWireType=(function(value){return value<<bitshift>>>bitshift})}registerType(primitiveType,{name:name,"fromWireType":fromWireType,"toWireType":(function(destructors,value){if(typeof value!=="number"&&typeof value!=="boolean"){throw new TypeError('Cannot convert "'+_embind_repr(value)+'" to '+this.name)}if(value<minRange||value>maxRange){throw new TypeError('Passing a number "'+_embind_repr(value)+'" from JS side to C/C++ side to an argument of type "'+name+'", which is outside the valid range ['+minRange+", "+maxRange+"]!")}return value|0}),"argPackAdvance":8,"readValueFromPointer":integerReadValueFromPointer(name,shift,minRange!==0),destructorFunction:null})}var emval_free_list=[];var emval_handle_array=[{},{value:undefined},{value:null},{value:true},{value:false}];function __emval_decref(handle){if(handle>4&&0===--emval_handle_array[handle].refcount){emval_handle_array[handle]=undefined;emval_free_list.push(handle)}}function count_emval_handles(){var count=0;for(var i=5;i<emval_handle_array.length;++i){if(emval_handle_array[i]!==undefined){++count}}return count}function get_first_emval(){for(var i=5;i<emval_handle_array.length;++i){if(emval_handle_array[i]!==undefined){return emval_handle_array[i]}}return null}function init_emval(){Module["count_emval_handles"]=count_emval_handles;Module["get_first_emval"]=get_first_emval}function __emval_register(value){switch(value){case undefined:{return 1};case null:{return 2};case true:{return 3};case false:{return 4};default:{var handle=emval_free_list.length?emval_free_list.pop():emval_handle_array.length;emval_handle_array[handle]={refcount:1,value:value};return handle}}}function __embind_register_emval(rawType,name){name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":(function(handle){var rv=emval_handle_array[handle].value;__emval_decref(handle);return rv}),"toWireType":(function(destructors,value){return __emval_register(value)}),"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:null})}function ___cxa_allocate_exception(size){return _malloc(size)}var _sin=Math_sin;function ___setErrNo(value){if(Module["___errno_location"])HEAP32[Module["___errno_location"]()>>2]=value;return value}var ERRNO_CODES={EPERM:1,ENOENT:2,ESRCH:3,EINTR:4,EIO:5,ENXIO:6,E2BIG:7,ENOEXEC:8,EBADF:9,ECHILD:10,EAGAIN:11,EWOULDBLOCK:11,ENOMEM:12,EACCES:13,EFAULT:14,ENOTBLK:15,EBUSY:16,EEXIST:17,EXDEV:18,ENODEV:19,ENOTDIR:20,EISDIR:21,EINVAL:22,ENFILE:23,EMFILE:24,ENOTTY:25,ETXTBSY:26,EFBIG:27,ENOSPC:28,ESPIPE:29,EROFS:30,EMLINK:31,EPIPE:32,EDOM:33,ERANGE:34,ENOMSG:42,EIDRM:43,ECHRNG:44,EL2NSYNC:45,EL3HLT:46,EL3RST:47,ELNRNG:48,EUNATCH:49,ENOCSI:50,EL2HLT:51,EDEADLK:35,ENOLCK:37,EBADE:52,EBADR:53,EXFULL:54,ENOANO:55,EBADRQC:56,EBADSLT:57,EDEADLOCK:35,EBFONT:59,ENOSTR:60,ENODATA:61,ETIME:62,ENOSR:63,ENONET:64,ENOPKG:65,EREMOTE:66,ENOLINK:67,EADV:68,ESRMNT:69,ECOMM:70,EPROTO:71,EMULTIHOP:72,EDOTDOT:73,EBADMSG:74,ENOTUNIQ:76,EBADFD:77,EREMCHG:78,ELIBACC:79,ELIBBAD:80,ELIBSCN:81,ELIBMAX:82,ELIBEXEC:83,ENOSYS:38,ENOTEMPTY:39,ENAMETOOLONG:36,ELOOP:40,EOPNOTSUPP:95,EPFNOSUPPORT:96,ECONNRESET:104,ENOBUFS:105,EAFNOSUPPORT:97,EPROTOTYPE:91,ENOTSOCK:88,ENOPROTOOPT:92,ESHUTDOWN:108,ECONNREFUSED:111,EADDRINUSE:98,ECONNABORTED:103,ENETUNREACH:101,ENETDOWN:100,ETIMEDOUT:110,EHOSTDOWN:112,EHOSTUNREACH:113,EINPROGRESS:115,EALREADY:114,EDESTADDRREQ:89,EMSGSIZE:90,EPROTONOSUPPORT:93,ESOCKTNOSUPPORT:94,EADDRNOTAVAIL:99,ENETRESET:102,EISCONN:106,ENOTCONN:107,ETOOMANYREFS:109,EUSERS:87,EDQUOT:122,ESTALE:116,ENOTSUP:95,ENOMEDIUM:123,EILSEQ:84,EOVERFLOW:75,ECANCELED:125,ENOTRECOVERABLE:131,EOWNERDEAD:130,ESTRPIPE:86};function _sysconf(name){switch(name){case 30:return PAGE_SIZE;case 85:return totalMemory/PAGE_SIZE;case 132:case 133:case 12:case 137:case 138:case 15:case 235:case 16:case 17:case 18:case 19:case 20:case 149:case 13:case 10:case 236:case 153:case 9:case 21:case 22:case 159:case 154:case 14:case 77:case 78:case 139:case 80:case 81:case 82:case 68:case 67:case 164:case 11:case 29:case 47:case 48:case 95:case 52:case 51:case 46:return 200809;case 79:return 0;case 27:case 246:case 127:case 128:case 23:case 24:case 160:case 161:case 181:case 182:case 242:case 183:case 184:case 243:case 244:case 245:case 165:case 178:case 179:case 49:case 50:case 168:case 169:case 175:case 170:case 171:case 172:case 97:case 76:case 32:case 173:case 35:return-1;case 176:case 177:case 7:case 155:case 8:case 157:case 125:case 126:case 92:case 93:case 129:case 130:case 131:case 94:case 91:return 1;case 74:case 60:case 69:case 70:case 4:return 1024;case 31:case 42:case 72:return 32;case 87:case 26:case 33:return 2147483647;case 34:case 1:return 47839;case 38:case 36:return 99;case 43:case 37:return 2048;case 0:return 2097152;case 3:return 65536;case 28:return 32768;case 44:return 32767;case 75:return 16384;case 39:return 1e3;case 89:return 700;case 71:return 256;case 40:return 255;case 2:return 100;case 180:return 64;case 25:return 20;case 5:return 16;case 6:return 6;case 73:return 4;case 84:{if(typeof navigator==="object")return navigator["hardwareConcurrency"]||1;return 1}}___setErrNo(ERRNO_CODES.EINVAL);return-1}Module["_bitshift64Lshr"]=_bitshift64Lshr;function __exit(status){Module["exit"](status)}function _exit(status){__exit(status)}var _llvm_ctlz_i32=true;function floatReadValueFromPointer(name,shift){switch(shift){case 2:return(function(pointer){return this["fromWireType"](HEAPF32[pointer>>2])});case 3:return(function(pointer){return this["fromWireType"](HEAPF64[pointer>>3])});default:throw new TypeError("Unknown float type: "+name)}}function __embind_register_float(rawType,name,size){var shift=getShiftFromSize(size);name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":(function(value){return value}),"toWireType":(function(destructors,value){if(typeof value!=="number"&&typeof value!=="boolean"){throw new TypeError('Cannot convert "'+_embind_repr(value)+'" to '+this.name)}return value}),"argPackAdvance":8,"readValueFromPointer":floatReadValueFromPointer(name,shift),destructorFunction:null})}var _BDtoIHigh=true;function _pthread_cleanup_push(routine,arg){__ATEXIT__.push((function(){Runtime.dynCall("vi",routine,[arg])}));_pthread_cleanup_push.level=__ATEXIT__.length}function new_(constructor,argumentList){if(!(constructor instanceof Function)){throw new TypeError("new_ called with constructor type "+typeof constructor+" which is not a function")}var dummy=createNamedFunction(constructor.name||"unknownFunctionName",(function(){}));dummy.prototype=constructor.prototype;var obj=new dummy;var r=constructor.apply(obj,argumentList);return r instanceof Object?r:obj}function runDestructors(destructors){while(destructors.length){var ptr=destructors.pop();var del=destructors.pop();del(ptr)}}function craftInvokerFunction(humanName,argTypes,classType,cppInvokerFunc,cppTargetFunc){var argCount=argTypes.length;if(argCount<2){throwBindingError("argTypes array size mismatch! Must at least get return value and 'this' types!")}var isClassMethodFunc=argTypes[1]!==null&&classType!==null;var argsList="";var argsListWired="";for(var i=0;i<argCount-2;++i){argsList+=(i!==0?", ":"")+"arg"+i;argsListWired+=(i!==0?", ":"")+"arg"+i+"Wired"}var invokerFnBody="return function "+makeLegalFunctionName(humanName)+"("+argsList+") {\n"+"if (arguments.length !== "+(argCount-2)+") {\n"+"throwBindingError('function "+humanName+" called with ' + arguments.length + ' arguments, expected "+(argCount-2)+" args!');\n"+"}\n";var needsDestructorStack=false;for(var i=1;i<argTypes.length;++i){if(argTypes[i]!==null&&argTypes[i].destructorFunction===undefined){needsDestructorStack=true;break}}if(needsDestructorStack){invokerFnBody+="var destructors = [];\n"}var dtorStack=needsDestructorStack?"destructors":"null";var args1=["throwBindingError","invoker","fn","runDestructors","retType","classParam"];var args2=[throwBindingError,cppInvokerFunc,cppTargetFunc,runDestructors,argTypes[0],argTypes[1]];if(isClassMethodFunc){invokerFnBody+="var thisWired = classParam.toWireType("+dtorStack+", this);\n"}for(var i=0;i<argCount-2;++i){invokerFnBody+="var arg"+i+"Wired = argType"+i+".toWireType("+dtorStack+", arg"+i+"); // "+argTypes[i+2].name+"\n";args1.push("argType"+i);args2.push(argTypes[i+2])}if(isClassMethodFunc){argsListWired="thisWired"+(argsListWired.length>0?", ":"")+argsListWired}var returns=argTypes[0].name!=="void";invokerFnBody+=(returns?"var rv = ":"")+"invoker(fn"+(argsListWired.length>0?", ":"")+argsListWired+");\n";if(needsDestructorStack){invokerFnBody+="runDestructors(destructors);\n"}else{for(var i=isClassMethodFunc?1:2;i<argTypes.length;++i){var paramName=i===1?"thisWired":"arg"+(i-2)+"Wired";if(argTypes[i].destructorFunction!==null){invokerFnBody+=paramName+"_dtor("+paramName+"); // "+argTypes[i].name+"\n";args1.push(paramName+"_dtor");args2.push(argTypes[i].destructorFunction)}}}if(returns){invokerFnBody+="var ret = retType.fromWireType(rv);\n"+"return ret;\n"}else{}invokerFnBody+="}\n";args1.push(invokerFnBody);var invokerFunction=new_(Function,args1).apply(null,args2);return invokerFunction}function ensureOverloadTable(proto,methodName,humanName){if(undefined===proto[methodName].overloadTable){var prevFunc=proto[methodName];proto[methodName]=(function(){if(!proto[methodName].overloadTable.hasOwnProperty(arguments.length)){throwBindingError("Function '"+humanName+"' called with an invalid number of arguments ("+arguments.length+") - expects one of ("+proto[methodName].overloadTable+")!")}return proto[methodName].overloadTable[arguments.length].apply(this,arguments)});proto[methodName].overloadTable=[];proto[methodName].overloadTable[prevFunc.argCount]=prevFunc}}function exposePublicSymbol(name,value,numArguments){if(Module.hasOwnProperty(name)){if(undefined===numArguments||undefined!==Module[name].overloadTable&&undefined!==Module[name].overloadTable[numArguments]){throwBindingError("Cannot register public name '"+name+"' twice")}ensureOverloadTable(Module,name,name);if(Module.hasOwnProperty(numArguments)){throwBindingError("Cannot register multiple overloads of a function with the same number of arguments ("+numArguments+")!")}Module[name].overloadTable[numArguments]=value}else{Module[name]=value;if(undefined!==numArguments){Module[name].numArguments=numArguments}}}function heap32VectorToArray(count,firstElement){var array=[];for(var i=0;i<count;i++){array.push(HEAP32[(firstElement>>2)+i])}return array}function replacePublicSymbol(name,value,numArguments){if(!Module.hasOwnProperty(name)){throwInternalError("Replacing nonexistant public symbol")}if(undefined!==Module[name].overloadTable&&undefined!==numArguments){Module[name].overloadTable[numArguments]=value}else{Module[name]=value}}function requireFunction(signature,rawFunction){signature=readLatin1String(signature);function makeDynCaller(dynCall){var args=[];for(var i=1;i<signature.length;++i){args.push("a"+i)}var name="dynCall_"+signature+"_"+rawFunction;var body="return function "+name+"("+args.join(", ")+") {\n";body+=" return dynCall(rawFunction"+(args.length?", ":"")+args.join(", ")+");\n";body+="};\n";return(new Function("dynCall","rawFunction",body))(dynCall,rawFunction)}var fp;if(Module["FUNCTION_TABLE_"+signature]!==undefined){fp=Module["FUNCTION_TABLE_"+signature][rawFunction]}else if(typeof FUNCTION_TABLE!=="undefined"){fp=FUNCTION_TABLE[rawFunction]}else{var dc=asm["dynCall_"+signature];if(dc===undefined){dc=asm["dynCall_"+signature.replace(/f/g,"d")];if(dc===undefined){throwBindingError("No dynCall invoker for signature: "+signature)}}fp=makeDynCaller(dc)}if(typeof fp!=="function"){throwBindingError("unknown function pointer with signature "+signature+": "+rawFunction)}return fp}var UnboundTypeError=undefined;function getTypeName(type){var ptr=___getTypeName(type);var rv=readLatin1String(ptr);_free(ptr);return rv}function throwUnboundTypeError(message,types){var unboundTypes=[];var seen={};function visit(type){if(seen[type]){return}if(registeredTypes[type]){return}if(typeDependencies[type]){typeDependencies[type].forEach(visit);return}unboundTypes.push(type);seen[type]=true}types.forEach(visit);throw new UnboundTypeError(message+": "+unboundTypes.map(getTypeName).join([", "]))}function __embind_register_function(name,argCount,rawArgTypesAddr,signature,rawInvoker,fn){var argTypes=heap32VectorToArray(argCount,rawArgTypesAddr);name=readLatin1String(name);rawInvoker=requireFunction(signature,rawInvoker);exposePublicSymbol(name,(function(){throwUnboundTypeError("Cannot call "+name+" due to unbound types",argTypes)}),argCount-1);whenDependentTypesAreResolved([],argTypes,(function(argTypes){var invokerArgsArray=[argTypes[0],null].concat(argTypes.slice(1));replacePublicSymbol(name,craftInvokerFunction(name,invokerArgsArray,null,rawInvoker,fn),argCount-1);return[]}))}function __embind_register_constant(name,type,value){name=readLatin1String(name);whenDependentTypesAreResolved([],[type],(function(type){type=type[0];Module[name]=type["fromWireType"](value);return[]}))}function _pthread_cleanup_pop(){assert(_pthread_cleanup_push.level==__ATEXIT__.length,"cannot pop if something else added meanwhile!");__ATEXIT__.pop();_pthread_cleanup_push.level=__ATEXIT__.length}var ERRNO_MESSAGES={0:"Success",1:"Not super-user",2:"No such file or directory",3:"No such process",4:"Interrupted system call",5:"I/O error",6:"No such device or address",7:"Arg list too long",8:"Exec format error",9:"Bad file number",10:"No children",11:"No more processes",12:"Not enough core",13:"Permission denied",14:"Bad address",15:"Block device required",16:"Mount device busy",17:"File exists",18:"Cross-device link",19:"No such device",20:"Not a directory",21:"Is a directory",22:"Invalid argument",23:"Too many open files in system",24:"Too many open files",25:"Not a typewriter",26:"Text file busy",27:"File too large",28:"No space left on device",29:"Illegal seek",30:"Read only file system",31:"Too many links",32:"Broken pipe",33:"Math arg out of domain of func",34:"Math result not representable",35:"File locking deadlock error",36:"File or path name too long",37:"No record locks available",38:"Function not implemented",39:"Directory not empty",40:"Too many symbolic links",42:"No message of desired type",43:"Identifier removed",44:"Channel number out of range",45:"Level 2 not synchronized",46:"Level 3 halted",47:"Level 3 reset",48:"Link number out of range",49:"Protocol driver not attached",50:"No CSI structure available",51:"Level 2 halted",52:"Invalid exchange",53:"Invalid request descriptor",54:"Exchange full",55:"No anode",56:"Invalid request code",57:"Invalid slot",59:"Bad font file fmt",60:"Device not a stream",61:"No data (for no delay io)",62:"Timer expired",63:"Out of streams resources",64:"Machine is not on the network",65:"Package not installed",66:"The object is remote",67:"The link has been severed",68:"Advertise error",69:"Srmount error",70:"Communication error on send",71:"Protocol error",72:"Multihop attempted",73:"Cross mount point (not really error)",74:"Trying to read unreadable message",75:"Value too large for defined data type",76:"Given log. name not unique",77:"f.d. invalid for this operation",78:"Remote address changed",79:"Can access a needed shared lib",80:"Accessing a corrupted shared lib",81:".lib section in a.out corrupted",82:"Attempting to link in too many libs",83:"Attempting to exec a shared library",84:"Illegal byte sequence",86:"Streams pipe error",87:"Too many users",88:"Socket operation on non-socket",89:"Destination address required",90:"Message too long",91:"Protocol wrong type for socket",92:"Protocol not available",93:"Unknown protocol",94:"Socket type not supported",95:"Not supported",96:"Protocol family not supported",97:"Address family not supported by protocol family",98:"Address already in use",99:"Address not available",100:"Network interface is not configured",101:"Network is unreachable",102:"Connection reset by network",103:"Connection aborted",104:"Connection reset by peer",105:"No buffer space available",106:"Socket is already connected",107:"Socket is not connected",108:"Can't send after socket shutdown",109:"Too many references",110:"Connection timed out",111:"Connection refused",112:"Host is down",113:"Host is unreachable",114:"Socket already connected",115:"Connection already in progress",116:"Stale file handle",122:"Quota exceeded",123:"No medium (in tape drive)",125:"Operation canceled",130:"Previous owner died",131:"State not recoverable"};var PATH={splitPath:(function(filename){var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)}),normalizeArray:(function(parts,allowAboveRoot){var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up--;up){parts.unshift("..")}}return parts}),normalize:(function(path){var isAbsolute=path.charAt(0)==="/",trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter((function(p){return!!p})),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path}),dirname:(function(path){var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir}),basename:(function(path){if(path==="/")return"/";var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)}),extname:(function(path){return PATH.splitPath(path)[3]}),join:(function(){var paths=Array.prototype.slice.call(arguments,0);return PATH.normalize(paths.join("/"))}),join2:(function(l,r){return PATH.normalize(l+"/"+r)}),resolve:(function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:FS.cwd();if(typeof path!=="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=path.charAt(0)==="/"}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter((function(p){return!!p})),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."}),relative:(function(from,to){from=PATH.resolve(from).substr(1);to=PATH.resolve(to).substr(1);function trim(arr){var start=0;for(;start<arr.length;start++){if(arr[start]!=="")break}var end=arr.length-1;for(;end>=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i<length;i++){if(fromParts[i]!==toParts[i]){samePartsLength=i;break}}var outputParts=[];for(var i=samePartsLength;i<fromParts.length;i++){outputParts.push("..")}outputParts=outputParts.concat(toParts.slice(samePartsLength));return outputParts.join("/")})};var TTY={ttys:[],init:(function(){}),shutdown:(function(){}),register:(function(dev,ops){TTY.ttys[dev]={input:[],output:[],ops:ops};FS.registerDevice(dev,TTY.stream_ops)}),stream_ops:{open:(function(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.ErrnoError(ERRNO_CODES.ENODEV)}stream.tty=tty;stream.seekable=false}),close:(function(stream){stream.tty.ops.flush(stream.tty)}),flush:(function(stream){stream.tty.ops.flush(stream.tty)}),read:(function(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char){throw new FS.ErrnoError(ERRNO_CODES.ENXIO)}var bytesRead=0;for(var i=0;i<length;i++){var result;try{result=stream.tty.ops.get_char(stream.tty)}catch(e){throw new FS.ErrnoError(ERRNO_CODES.EIO)}if(result===undefined&&bytesRead===0){throw new FS.ErrnoError(ERRNO_CODES.EAGAIN)}if(result===null||result===undefined)break;bytesRead++;buffer[offset+i]=result}if(bytesRead){stream.node.timestamp=Date.now()}return bytesRead}),write:(function(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.put_char){throw new FS.ErrnoError(ERRNO_CODES.ENXIO)}for(var i=0;i<length;i++){try{stream.tty.ops.put_char(stream.tty,buffer[offset+i])}catch(e){throw new FS.ErrnoError(ERRNO_CODES.EIO)}}if(length){stream.node.timestamp=Date.now()}return i})},default_tty_ops:{get_char:(function(tty){if(!tty.input.length){var result=null;if(ENVIRONMENT_IS_NODE){var BUFSIZE=256;var buf=new Buffer(BUFSIZE);var bytesRead=0;var fd=process.stdin.fd;var usingDevice=false;try{fd=fs.openSync("/dev/stdin","r");usingDevice=true}catch(e){}bytesRead=fs.readSync(fd,buf,0,BUFSIZE,null);if(usingDevice){fs.closeSync(fd)}if(bytesRead>0){result=buf.slice(0,bytesRead).toString("utf-8")}else{result=null}}else if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else if(typeof readline=="function"){result=readline();if(result!==null){result+="\n"}}if(!result){return null}tty.input=intArrayFromString(result,true)}return tty.input.shift()}),put_char:(function(tty,val){if(val===null||val===10){Module["print"](UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}}),flush:(function(tty){if(tty.output&&tty.output.length>0){Module["print"](UTF8ArrayToString(tty.output,0));tty.output=[]}})},default_tty1_ops:{put_char:(function(tty,val){if(val===null||val===10){Module["printErr"](UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}}),flush:(function(tty){if(tty.output&&tty.output.length>0){Module["printErr"](UTF8ArrayToString(tty.output,0));tty.output=[]}})}};var MEMFS={ops_table:null,mount:(function(mount){return MEMFS.createNode(null,"/",16384|511,0)}),createNode:(function(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(!MEMFS.ops_table){MEMFS.ops_table={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}}}var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.timestamp=Date.now();if(parent){parent.contents[name]=node}return node}),getFileDataAsRegularArray:(function(node){if(node.contents&&node.contents.subarray){var arr=[];for(var i=0;i<node.usedBytes;++i)arr.push(node.contents[i]);return arr}return node.contents}),getFileDataAsTypedArray:(function(node){if(!node.contents)return new Uint8Array;if(node.contents.subarray)return node.contents.subarray(0,node.usedBytes);return new Uint8Array(node.contents)}),expandFileStorage:(function(node,newCapacity){if(node.contents&&node.contents.subarray&&newCapacity>node.contents.length){node.contents=MEMFS.getFileDataAsRegularArray(node);node.usedBytes=node.contents.length}if(!node.contents||node.contents.subarray){var prevCapacity=node.contents?node.contents.buffer.byteLength:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity<CAPACITY_DOUBLING_MAX?2:1.125)|0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0);return}if(!node.contents&&newCapacity>0)node.contents=[];while(node.contents.length<newCapacity)node.contents.push(0)}),resizeFileStorage:(function(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0;return}if(!node.contents||node.contents.subarray){var oldContents=node.contents;node.contents=new Uint8Array(new ArrayBuffer(newSize));if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize;return}if(!node.contents)node.contents=[];if(node.contents.length>newSize)node.contents.length=newSize;else while(node.contents.length<newSize)node.contents.push(0);node.usedBytes=newSize}),node_ops:{getattr:(function(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.timestamp);attr.mtime=new Date(node.timestamp);attr.ctime=new Date(node.timestamp);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr}),setattr:(function(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}}),lookup:(function(parent,name){throw FS.genericErrors[ERRNO_CODES.ENOENT]}),mknod:(function(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)}),rename:(function(old_node,new_dir,new_name){if(FS.isDir(old_node.mode)){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){for(var i in new_node.contents){throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY)}}}delete old_node.parent.contents[old_node.name];old_node.name=new_name;new_dir.contents[new_name]=old_node;old_node.parent=new_dir}),unlink:(function(parent,name){delete parent.contents[name]}),rmdir:(function(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY)}delete parent.contents[name]}),readdir:(function(node){var entries=[".",".."];for(var key in node.contents){if(!node.contents.hasOwnProperty(key)){continue}entries.push(key)}return entries}),symlink:(function(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node}),readlink:(function(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}return node.link})},stream_ops:{read:(function(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);assert(size>=0);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i<size;i++)buffer[offset+i]=contents[position+i]}return size}),write:(function(stream,buffer,offset,length,position,canOwn){if(!length)return 0;var node=stream.node;node.timestamp=Date.now();if(buffer.subarray&&(!node.contents||node.contents.subarray)){if(canOwn){node.contents=buffer.subarray(offset,offset+length);node.usedBytes=length;return length}else if(node.usedBytes===0&&position===0){node.contents=new Uint8Array(buffer.subarray(offset,offset+length));node.usedBytes=length;return length}else if(position+length<=node.usedBytes){node.contents.set(buffer.subarray(offset,offset+length),position);return length}}MEMFS.expandFileStorage(node,position+length);if(node.contents.subarray&&buffer.subarray)node.contents.set(buffer.subarray(offset,offset+length),position);else{for(var i=0;i<length;i++){node.contents[position+i]=buffer[offset+i]}}node.usedBytes=Math.max(node.usedBytes,position+length);return length}),llseek:(function(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){position+=stream.node.usedBytes}}if(position<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}return position}),allocate:(function(stream,offset,length){MEMFS.expandFileStorage(stream.node,offset+length);stream.node.usedBytes=Math.max(stream.node.usedBytes,offset+length)}),mmap:(function(stream,buffer,offset,length,position,prot,flags){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(ERRNO_CODES.ENODEV)}var ptr;var allocated;var contents=stream.node.contents;if(!(flags&2)&&(contents.buffer===buffer||contents.buffer===buffer.buffer)){allocated=false;ptr=contents.byteOffset}else{if(position>0||position+length<stream.node.usedBytes){if(contents.subarray){contents=contents.subarray(position,position+length)}else{contents=Array.prototype.slice.call(contents,position,position+length)}}allocated=true;ptr=_malloc(length);if(!ptr){throw new FS.ErrnoError(ERRNO_CODES.ENOMEM)}buffer.set(contents,ptr)}return{ptr:ptr,allocated:allocated}}),msync:(function(stream,buffer,offset,length,mmapFlags){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(ERRNO_CODES.ENODEV)}if(mmapFlags&2){return 0}var bytesWritten=MEMFS.stream_ops.write(stream,buffer,0,length,offset,false);return 0})}};var IDBFS={dbs:{},indexedDB:(function(){if(typeof indexedDB!=="undefined")return indexedDB;var ret=null;if(typeof window==="object")ret=window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB;assert(ret,"IDBFS used, but indexedDB not supported");return ret}),DB_VERSION:21,DB_STORE_NAME:"FILE_DATA",mount:(function(mount){return MEMFS.mount.apply(null,arguments)}),syncfs:(function(mount,populate,callback){IDBFS.getLocalSet(mount,(function(err,local){if(err)return callback(err);IDBFS.getRemoteSet(mount,(function(err,remote){if(err)return callback(err);var src=populate?remote:local;var dst=populate?local:remote;IDBFS.reconcile(src,dst,callback)}))}))}),getDB:(function(name,callback){var db=IDBFS.dbs[name];if(db){return callback(null,db)}var req;try{req=IDBFS.indexedDB().open(name,IDBFS.DB_VERSION)}catch(e){return callback(e)}req.onupgradeneeded=(function(e){var db=e.target.result;var transaction=e.target.transaction;var fileStore;if(db.objectStoreNames.contains(IDBFS.DB_STORE_NAME)){fileStore=transaction.objectStore(IDBFS.DB_STORE_NAME)}else{fileStore=db.createObjectStore(IDBFS.DB_STORE_NAME)}if(!fileStore.indexNames.contains("timestamp")){fileStore.createIndex("timestamp","timestamp",{unique:false})}});req.onsuccess=(function(){db=req.result;IDBFS.dbs[name]=db;callback(null,db)});req.onerror=(function(e){callback(this.error);e.preventDefault()})}),getLocalSet:(function(mount,callback){var entries={};function isRealDir(p){return p!=="."&&p!==".."}function toAbsolute(root){return(function(p){return PATH.join2(root,p)})}var check=FS.readdir(mount.mountpoint).filter(isRealDir).map(toAbsolute(mount.mountpoint));while(check.length){var path=check.pop();var stat;try{stat=FS.stat(path)}catch(e){return callback(e)}if(FS.isDir(stat.mode)){check.push.apply(check,FS.readdir(path).filter(isRealDir).map(toAbsolute(path)))}entries[path]={timestamp:stat.mtime}}return callback(null,{type:"local",entries:entries})}),getRemoteSet:(function(mount,callback){var entries={};IDBFS.getDB(mount.mountpoint,(function(err,db){if(err)return callback(err);var transaction=db.transaction([IDBFS.DB_STORE_NAME],"readonly");transaction.onerror=(function(e){callback(this.error);e.preventDefault()});var store=transaction.objectStore(IDBFS.DB_STORE_NAME);var index=store.index("timestamp");index.openKeyCursor().onsuccess=(function(event){var cursor=event.target.result;if(!cursor){return callback(null,{type:"remote",db:db,entries:entries})}entries[cursor.primaryKey]={timestamp:cursor.key};cursor.continue()})}))}),loadLocalEntry:(function(path,callback){var stat,node;try{var lookup=FS.lookupPath(path);node=lookup.node;stat=FS.stat(path)}catch(e){return callback(e)}if(FS.isDir(stat.mode)){return callback(null,{timestamp:stat.mtime,mode:stat.mode})}else if(FS.isFile(stat.mode)){node.contents=MEMFS.getFileDataAsTypedArray(node);return callback(null,{timestamp:stat.mtime,mode:stat.mode,contents:node.contents})}else{return callback(new Error("node type not supported"))}}),storeLocalEntry:(function(path,entry,callback){try{if(FS.isDir(entry.mode)){FS.mkdir(path,entry.mode)}else if(FS.isFile(entry.mode)){FS.writeFile(path,entry.contents,{encoding:"binary",canOwn:true})}else{return callback(new Error("node type not supported"))}FS.chmod(path,entry.mode);FS.utime(path,entry.timestamp,entry.timestamp)}catch(e){return callback(e)}callback(null)}),removeLocalEntry:(function(path,callback){try{var lookup=FS.lookupPath(path);var stat=FS.stat(path);if(FS.isDir(stat.mode)){FS.rmdir(path)}else if(FS.isFile(stat.mode)){FS.unlink(path)}}catch(e){return callback(e)}callback(null)}),loadRemoteEntry:(function(store,path,callback){var req=store.get(path);req.onsuccess=(function(event){callback(null,event.target.result)});req.onerror=(function(e){callback(this.error);e.preventDefault()})}),storeRemoteEntry:(function(store,path,entry,callback){var req=store.put(entry,path);req.onsuccess=(function(){callback(null)});req.onerror=(function(e){callback(this.error);e.preventDefault()})}),removeRemoteEntry:(function(store,path,callback){var req=store.delete(path);req.onsuccess=(function(){callback(null)});req.onerror=(function(e){callback(this.error);e.preventDefault()})}),reconcile:(function(src,dst,callback){var total=0;var create=[];Object.keys(src.entries).forEach((function(key){var e=src.entries[key];var e2=dst.entries[key];if(!e2||e.timestamp>e2.timestamp){create.push(key);total++}}));var remove=[];Object.keys(dst.entries).forEach((function(key){var e=dst.entries[key];var e2=src.entries[key];if(!e2){remove.push(key);total++}}));if(!total){return callback(null)}var errored=false;var completed=0;var db=src.type==="remote"?src.db:dst.db;var transaction=db.transaction([IDBFS.DB_STORE_NAME],"readwrite");var store=transaction.objectStore(IDBFS.DB_STORE_NAME);function done(err){if(err){if(!done.errored){done.errored=true;return callback(err)}return}if(++completed>=total){return callback(null)}}transaction.onerror=(function(e){done(this.error);e.preventDefault()});create.sort().forEach((function(path){if(dst.type==="local"){IDBFS.loadRemoteEntry(store,path,(function(err,entry){if(err)return done(err);IDBFS.storeLocalEntry(path,entry,done)}))}else{IDBFS.loadLocalEntry(path,(function(err,entry){if(err)return done(err);IDBFS.storeRemoteEntry(store,path,entry,done)}))}}));remove.sort().reverse().forEach((function(path){if(dst.type==="local"){IDBFS.removeLocalEntry(path,done)}else{IDBFS.removeRemoteEntry(store,path,done)}}))})};var NODEFS={isWindows:false,staticInit:(function(){NODEFS.isWindows=!!process.platform.match(/^win/)}),mount:(function(mount){assert(ENVIRONMENT_IS_NODE);return NODEFS.createNode(null,"/",NODEFS.getMode(mount.opts.root),0)}),createNode:(function(parent,name,mode,dev){if(!FS.isDir(mode)&&!FS.isFile(mode)&&!FS.isLink(mode)){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var node=FS.createNode(parent,name,mode);node.node_ops=NODEFS.node_ops;node.stream_ops=NODEFS.stream_ops;return node}),getMode:(function(path){var stat;try{stat=fs.lstatSync(path);if(NODEFS.isWindows){stat.mode=stat.mode|(stat.mode&146)>>1}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}return stat.mode}),realPath:(function(node){var parts=[];while(node.parent!==node){parts.push(node.name);node=node.parent}parts.push(node.mount.opts.root);parts.reverse();return PATH.join.apply(null,parts)}),flagsToPermissionStringMap:{0:"r",1:"r+",2:"r+",64:"r",65:"r+",66:"r+",129:"rx+",193:"rx+",514:"w+",577:"w",578:"w+",705:"wx",706:"wx+",1024:"a",1025:"a",1026:"a+",1089:"a",1090:"a+",1153:"ax",1154:"ax+",1217:"ax",1218:"ax+",4096:"rs",4098:"rs+"},flagsToPermissionString:(function(flags){flags&=~32768;if(flags in NODEFS.flagsToPermissionStringMap){return NODEFS.flagsToPermissionStringMap[flags]}else{throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}}),node_ops:{getattr:(function(node){var path=NODEFS.realPath(node);var stat;try{stat=fs.lstatSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}if(NODEFS.isWindows&&!stat.blksize){stat.blksize=4096}if(NODEFS.isWindows&&!stat.blocks){stat.blocks=(stat.size+stat.blksize-1)/stat.blksize|0}return{dev:stat.dev,ino:stat.ino,mode:stat.mode,nlink:stat.nlink,uid:stat.uid,gid:stat.gid,rdev:stat.rdev,size:stat.size,atime:stat.atime,mtime:stat.mtime,ctime:stat.ctime,blksize:stat.blksize,blocks:stat.blocks}}),setattr:(function(node,attr){var path=NODEFS.realPath(node);try{if(attr.mode!==undefined){fs.chmodSync(path,attr.mode);node.mode=attr.mode}if(attr.timestamp!==undefined){var date=new Date(attr.timestamp);fs.utimesSync(path,date,date)}if(attr.size!==undefined){fs.truncateSync(path,attr.size)}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),lookup:(function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);var mode=NODEFS.getMode(path);return NODEFS.createNode(parent,name,mode)}),mknod:(function(parent,name,mode,dev){var node=NODEFS.createNode(parent,name,mode,dev);var path=NODEFS.realPath(node);try{if(FS.isDir(node.mode)){fs.mkdirSync(path,node.mode)}else{fs.writeFileSync(path,"",{mode:node.mode})}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}return node}),rename:(function(oldNode,newDir,newName){var oldPath=NODEFS.realPath(oldNode);var newPath=PATH.join2(NODEFS.realPath(newDir),newName);try{fs.renameSync(oldPath,newPath)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),unlink:(function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);try{fs.unlinkSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),rmdir:(function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);try{fs.rmdirSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),readdir:(function(node){var path=NODEFS.realPath(node);try{return fs.readdirSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),symlink:(function(parent,newName,oldPath){var newPath=PATH.join2(NODEFS.realPath(parent),newName);try{fs.symlinkSync(oldPath,newPath)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),readlink:(function(node){var path=NODEFS.realPath(node);try{path=fs.readlinkSync(path);path=NODEJS_PATH.relative(NODEJS_PATH.resolve(node.mount.opts.root),path);return path}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}})},stream_ops:{open:(function(stream){var path=NODEFS.realPath(stream.node);try{if(FS.isFile(stream.node.mode)){stream.nfd=fs.openSync(path,NODEFS.flagsToPermissionString(stream.flags))}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),close:(function(stream){try{if(FS.isFile(stream.node.mode)&&stream.nfd){fs.closeSync(stream.nfd)}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),read:(function(stream,buffer,offset,length,position){if(length===0)return 0;var nbuffer=new Buffer(length);var res;try{res=fs.readSync(stream.nfd,nbuffer,0,length,position)}catch(e){throw new FS.ErrnoError(ERRNO_CODES[e.code])}if(res>0){for(var i=0;i<res;i++){buffer[offset+i]=nbuffer[i]}}return res}),write:(function(stream,buffer,offset,length,position){var nbuffer=new Buffer(buffer.subarray(offset,offset+length));var res;try{res=fs.writeSync(stream.nfd,nbuffer,0,length,position)}catch(e){throw new FS.ErrnoError(ERRNO_CODES[e.code])}return res}),llseek:(function(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){try{var stat=fs.fstatSync(stream.nfd);position+=stat.size}catch(e){throw new FS.ErrnoError(ERRNO_CODES[e.code])}}}if(position<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}return position})}};var WORKERFS={DIR_MODE:16895,FILE_MODE:33279,reader:null,mount:(function(mount){assert(ENVIRONMENT_IS_WORKER);if(!WORKERFS.reader)WORKERFS.reader=new FileReaderSync;var root=WORKERFS.createNode(null,"/",WORKERFS.DIR_MODE,0);var createdParents={};function ensureParent(path){var parts=path.split("/");var parent=root;for(var i=0;i<parts.length-1;i++){var curr=parts.slice(0,i+1).join("/");if(!createdParents[curr]){createdParents[curr]=WORKERFS.createNode(parent,curr,WORKERFS.DIR_MODE,0)}parent=createdParents[curr]}return parent}function base(path){var parts=path.split("/");return parts[parts.length-1]}Array.prototype.forEach.call(mount.opts["files"]||[],(function(file){WORKERFS.createNode(ensureParent(file.name),base(file.name),WORKERFS.FILE_MODE,0,file,file.lastModifiedDate)}));(mount.opts["blobs"]||[]).forEach((function(obj){WORKERFS.createNode(ensureParent(obj["name"]),base(obj["name"]),WORKERFS.FILE_MODE,0,obj["data"])}));(mount.opts["packages"]||[]).forEach((function(pack){pack["metadata"].files.forEach((function(file){var name=file.filename.substr(1);WORKERFS.createNode(ensureParent(name),base(name),WORKERFS.FILE_MODE,0,pack["blob"].slice(file.start,file.end))}))}));return root}),createNode:(function(parent,name,mode,dev,contents,mtime){var node=FS.createNode(parent,name,mode);node.mode=mode;node.node_ops=WORKERFS.node_ops;node.stream_ops=WORKERFS.stream_ops;node.timestamp=(mtime||new Date).getTime();assert(WORKERFS.FILE_MODE!==WORKERFS.DIR_MODE);if(mode===WORKERFS.FILE_MODE){node.size=contents.size;node.contents=contents}else{node.size=4096;node.contents={}}if(parent){parent.contents[name]=node}return node}),node_ops:{getattr:(function(node){return{dev:1,ino:undefined,mode:node.mode,nlink:1,uid:0,gid:0,rdev:undefined,size:node.size,atime:new Date(node.timestamp),mtime:new Date(node.timestamp),ctime:new Date(node.timestamp),blksize:4096,blocks:Math.ceil(node.size/4096)}}),setattr:(function(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}}),lookup:(function(parent,name){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}),mknod:(function(parent,name,mode,dev){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}),rename:(function(oldNode,newDir,newName){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}),unlink:(function(parent,name){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}),rmdir:(function(parent,name){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}),readdir:(function(node){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}),symlink:(function(parent,newName,oldPath){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}),readlink:(function(node){throw new FS.ErrnoError(ERRNO_CODES.EPERM)})},stream_ops:{read:(function(stream,buffer,offset,length,position){if(position>=stream.node.size)return 0;var chunk=stream.node.contents.slice(position,position+length);var ab=WORKERFS.reader.readAsArrayBuffer(chunk);buffer.set(new Uint8Array(ab),offset);return chunk.size}),write:(function(stream,buffer,offset,length,position){throw new FS.ErrnoError(ERRNO_CODES.EIO)}),llseek:(function(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){position+=stream.node.size}}if(position<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}return position})}};var _stdin=allocate(1,"i32*",ALLOC_STATIC);var _stdout=allocate(1,"i32*",ALLOC_STATIC);var _stderr=allocate(1,"i32*",ALLOC_STATIC);var FS={root:null,mounts:[],devices:[null],streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,trackingDelegate:{},tracking:{openFlags:{READ:1,WRITE:2}},ErrnoError:null,genericErrors:{},filesystems:null,handleFSError:(function(e){if(!(e instanceof FS.ErrnoError))throw e+" : "+stackTrace();return ___setErrNo(e.errno)}),lookupPath:(function(path,opts){path=PATH.resolve(FS.cwd(),path);opts=opts||{};if(!path)return{path:"",node:null};var defaults={follow_mount:true,recurse_count:0};for(var key in defaults){if(opts[key]===undefined){opts[key]=defaults[key]}}if(opts.recurse_count>8){throw new FS.ErrnoError(ERRNO_CODES.ELOOP)}var parts=PATH.normalizeArray(path.split("/").filter((function(p){return!!p})),false);var current=FS.root;var current_path="/";for(var i=0;i<parts.length;i++){var islast=i===parts.length-1;if(islast&&opts.parent){break}current=FS.lookupNode(current,parts[i]);current_path=PATH.join2(current_path,parts[i]);if(FS.isMountpoint(current)){if(!islast||islast&&opts.follow_mount){current=current.mounted.root}}if(!islast||opts.follow){var count=0;while(FS.isLink(current.mode)){var link=FS.readlink(current_path);current_path=PATH.resolve(PATH.dirname(current_path),link);var lookup=FS.lookupPath(current_path,{recurse_count:opts.recurse_count});current=lookup.node;if(count++>40){throw new FS.ErrnoError(ERRNO_CODES.ELOOP)}}}}return{path:current_path,node:current}}),getPath:(function(node){var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?mount+"/"+path:mount+path}path=path?node.name+"/"+path:node.name;node=node.parent}}),hashName:(function(parentid,name){var hash=0;for(var i=0;i<name.length;i++){hash=(hash<<5)-hash+name.charCodeAt(i)|0}return(parentid+hash>>>0)%FS.nameTable.length}),hashAddNode:(function(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node}),hashRemoveNode:(function(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}}),lookupNode:(function(parent,name){var err=FS.mayLookup(parent);if(err){throw new FS.ErrnoError(err,parent)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)}),createNode:(function(parent,name,mode,rdev){if(!FS.FSNode){FS.FSNode=(function(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev});FS.FSNode.prototype={};var readMode=292|73;var writeMode=146;Object.defineProperties(FS.FSNode.prototype,{read:{get:(function(){return(this.mode&readMode)===readMode}),set:(function(val){val?this.mode|=readMode:this.mode&=~readMode})},write:{get:(function(){return(this.mode&writeMode)===writeMode}),set:(function(val){val?this.mode|=writeMode:this.mode&=~writeMode})},isFolder:{get:(function(){return FS.isDir(this.mode)})},isDevice:{get:(function(){return FS.isChrdev(this.mode)})}})}var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node}),destroyNode:(function(node){FS.hashRemoveNode(node)}),isRoot:(function(node){return node===node.parent}),isMountpoint:(function(node){return!!node.mounted}),isFile:(function(mode){return(mode&61440)===32768}),isDir:(function(mode){return(mode&61440)===16384}),isLink:(function(mode){return(mode&61440)===40960}),isChrdev:(function(mode){return(mode&61440)===8192}),isBlkdev:(function(mode){return(mode&61440)===24576}),isFIFO:(function(mode){return(mode&61440)===4096}),isSocket:(function(mode){return(mode&49152)===49152}),flagModes:{"r":0,"rs":1052672,"r+":2,"w":577,"wx":705,"xw":705,"w+":578,"wx+":706,"xw+":706,"a":1089,"ax":1217,"xa":1217,"a+":1090,"ax+":1218,"xa+":1218},modeStringToFlags:(function(str){var flags=FS.flagModes[str];if(typeof flags==="undefined"){throw new Error("Unknown file open mode: "+str)}return flags}),flagsToPermissionString:(function(flag){var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms}),nodePermissions:(function(node,perms){if(FS.ignorePermissions){return 0}if(perms.indexOf("r")!==-1&&!(node.mode&292)){return ERRNO_CODES.EACCES}else if(perms.indexOf("w")!==-1&&!(node.mode&146)){return ERRNO_CODES.EACCES}else if(perms.indexOf("x")!==-1&&!(node.mode&73)){return ERRNO_CODES.EACCES}return 0}),mayLookup:(function(dir){var err=FS.nodePermissions(dir,"x");if(err)return err;if(!dir.node_ops.lookup)return ERRNO_CODES.EACCES;return 0}),mayCreate:(function(dir,name){try{var node=FS.lookupNode(dir,name);return ERRNO_CODES.EEXIST}catch(e){}return FS.nodePermissions(dir,"wx")}),mayDelete:(function(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var err=FS.nodePermissions(dir,"wx");if(err){return err}if(isdir){if(!FS.isDir(node.mode)){return ERRNO_CODES.ENOTDIR}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return ERRNO_CODES.EBUSY}}else{if(FS.isDir(node.mode)){return ERRNO_CODES.EISDIR}}return 0}),mayOpen:(function(node,flags){if(!node){return ERRNO_CODES.ENOENT}if(FS.isLink(node.mode)){return ERRNO_CODES.ELOOP}else if(FS.isDir(node.mode)){if((flags&2097155)!==0||flags&512){return ERRNO_CODES.EISDIR}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))}),MAX_OPEN_FDS:4096,nextfd:(function(fd_start,fd_end){fd_start=fd_start||0;fd_end=fd_end||FS.MAX_OPEN_FDS;for(var fd=fd_start;fd<=fd_end;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(ERRNO_CODES.EMFILE)}),getStream:(function(fd){return FS.streams[fd]}),createStream:(function(stream,fd_start,fd_end){if(!FS.FSStream){FS.FSStream=(function(){});FS.FSStream.prototype={};Object.defineProperties(FS.FSStream.prototype,{object:{get:(function(){return this.node}),set:(function(val){this.node=val})},isRead:{get:(function(){return(this.flags&2097155)!==1})},isWrite:{get:(function(){return(this.flags&2097155)!==0})},isAppend:{get:(function(){return this.flags&1024})}})}var newStream=new FS.FSStream;for(var p in stream){newStream[p]=stream[p]}stream=newStream;var fd=FS.nextfd(fd_start,fd_end);stream.fd=fd;FS.streams[fd]=stream;return stream}),closeStream:(function(fd){FS.streams[fd]=null}),chrdev_stream_ops:{open:(function(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;if(stream.stream_ops.open){stream.stream_ops.open(stream)}}),llseek:(function(){throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)})},major:(function(dev){return dev>>8}),minor:(function(dev){return dev&255}),makedev:(function(ma,mi){return ma<<8|mi}),registerDevice:(function(dev,ops){FS.devices[dev]={stream_ops:ops}}),getDevice:(function(dev){return FS.devices[dev]}),getMounts:(function(mount){var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push.apply(check,m.mounts)}return mounts}),syncfs:(function(populate,callback){if(typeof populate==="function"){callback=populate;populate=false}var mounts=FS.getMounts(FS.root.mount);var completed=0;function done(err){if(err){if(!done.errored){done.errored=true;return callback(err)}return}if(++completed>=mounts.length){callback(null)}}mounts.forEach((function(mount){if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)}))}),mount:(function(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot}),unmount:(function(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach((function(hash){var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.indexOf(current.mount)!==-1){FS.destroyNode(current)}current=next}}));node.mounted=null;var idx=node.mount.mounts.indexOf(mount);assert(idx!==-1);node.mount.mounts.splice(idx,1)}),lookup:(function(parent,name){return parent.node_ops.lookup(parent,name)}),mknod:(function(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var err=FS.mayCreate(parent,name);if(err){throw new FS.ErrnoError(err)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}return parent.node_ops.mknod(parent,name,mode,dev)}),create:(function(path,mode){mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)}),mkdir:(function(path,mode){mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)}),mkdev:(function(path,mode,dev){if(typeof dev==="undefined"){dev=mode;mode=438}mode|=8192;return FS.mknod(path,mode,dev)}),symlink:(function(oldpath,newpath){if(!PATH.resolve(oldpath)){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}var lookup=FS.lookupPath(newpath,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}var newname=PATH.basename(newpath);var err=FS.mayCreate(parent,newname);if(err){throw new FS.ErrnoError(err)}if(!parent.node_ops.symlink){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}return parent.node_ops.symlink(parent,newname,oldpath)}),rename:(function(old_path,new_path){var old_dirname=PATH.dirname(old_path);var new_dirname=PATH.dirname(new_path);var old_name=PATH.basename(old_path);var new_name=PATH.basename(new_path);var lookup,old_dir,new_dir;try{lookup=FS.lookupPath(old_path,{parent:true});old_dir=lookup.node;lookup=FS.lookupPath(new_path,{parent:true});new_dir=lookup.node}catch(e){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}if(!old_dir||!new_dir)throw new FS.ErrnoError(ERRNO_CODES.ENOENT);if(old_dir.mount!==new_dir.mount){throw new FS.ErrnoError(ERRNO_CODES.EXDEV)}var old_node=FS.lookupNode(old_dir,old_name);var relative=PATH.relative(old_path,new_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}relative=PATH.relative(new_path,old_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY)}var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(old_node===new_node){return}var isdir=FS.isDir(old_node.mode);var err=FS.mayDelete(old_dir,old_name,isdir);if(err){throw new FS.ErrnoError(err)}err=new_node?FS.mayDelete(new_dir,new_name,isdir):FS.mayCreate(new_dir,new_name);if(err){throw new FS.ErrnoError(err)}if(!old_dir.node_ops.rename){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(FS.isMountpoint(old_node)||new_node&&FS.isMountpoint(new_node)){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}if(new_dir!==old_dir){err=FS.nodePermissions(old_dir,"w");if(err){throw new FS.ErrnoError(err)}}try{if(FS.trackingDelegate["willMovePath"]){FS.trackingDelegate["willMovePath"](old_path,new_path)}}catch(e){console.log("FS.trackingDelegate['willMovePath']('"+old_path+"', '"+new_path+"') threw an exception: "+e.message)}FS.hashRemoveNode(old_node);try{old_dir.node_ops.rename(old_node,new_dir,new_name)}catch(e){throw e}finally{FS.hashAddNode(old_node)}try{if(FS.trackingDelegate["onMovePath"])FS.trackingDelegate["onMovePath"](old_path,new_path)}catch(e){console.log("FS.trackingDelegate['onMovePath']('"+old_path+"', '"+new_path+"') threw an exception: "+e.message)}}),rmdir:(function(path){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var err=FS.mayDelete(parent,name,true);if(err){throw new FS.ErrnoError(err)}if(!parent.node_ops.rmdir){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}try{if(FS.trackingDelegate["willDeletePath"]){FS.trackingDelegate["willDeletePath"](path)}}catch(e){console.log("FS.trackingDelegate['willDeletePath']('"+path+"') threw an exception: "+e.message)}parent.node_ops.rmdir(parent,name);FS.destroyNode(node);try{if(FS.trackingDelegate["onDeletePath"])FS.trackingDelegate["onDeletePath"](path)}catch(e){console.log("FS.trackingDelegate['onDeletePath']('"+path+"') threw an exception: "+e.message)}}),readdir:(function(path){var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;if(!node.node_ops.readdir){throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)}return node.node_ops.readdir(node)}),unlink:(function(path){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var err=FS.mayDelete(parent,name,false);if(err){if(err===ERRNO_CODES.EISDIR)err=ERRNO_CODES.EPERM;throw new FS.ErrnoError(err)}if(!parent.node_ops.unlink){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}try{if(FS.trackingDelegate["willDeletePath"]){FS.trackingDelegate["willDeletePath"](path)}}catch(e){console.log("FS.trackingDelegate['willDeletePath']('"+path+"') threw an exception: "+e.message)}parent.node_ops.unlink(parent,name);FS.destroyNode(node);try{if(FS.trackingDelegate["onDeletePath"])FS.trackingDelegate["onDeletePath"](path)}catch(e){console.log("FS.trackingDelegate['onDeletePath']('"+path+"') threw an exception: "+e.message)}}),readlink:(function(path){var lookup=FS.lookupPath(path);var link=lookup.node;if(!link){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}if(!link.node_ops.readlink){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}return PATH.resolve(FS.getPath(link.parent),link.node_ops.readlink(link))}),stat:(function(path,dontFollow){var lookup=FS.lookupPath(path,{follow:!dontFollow});var node=lookup.node;if(!node){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}if(!node.node_ops.getattr){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}return node.node_ops.getattr(node)}),lstat:(function(path){return FS.stat(path,true)}),chmod:(function(path,mode,dontFollow){var node;if(typeof path==="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}node.node_ops.setattr(node,{mode:mode&4095|node.mode&~4095,timestamp:Date.now()})}),lchmod:(function(path,mode){FS.chmod(path,mode,true)}),fchmod:(function(fd,mode){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}FS.chmod(stream.node,mode)}),chown:(function(path,uid,gid,dontFollow){var node;if(typeof path==="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}node.node_ops.setattr(node,{timestamp:Date.now()})}),lchown:(function(path,uid,gid){FS.chown(path,uid,gid,true)}),fchown:(function(fd,uid,gid){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}FS.chown(stream.node,uid,gid)}),truncate:(function(path,len){if(len<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var node;if(typeof path==="string"){var lookup=FS.lookupPath(path,{follow:true});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(FS.isDir(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.EISDIR)}if(!FS.isFile(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var err=FS.nodePermissions(node,"w");if(err){throw new FS.ErrnoError(err)}node.node_ops.setattr(node,{size:len,timestamp:Date.now()})}),ftruncate:(function(fd,len){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}FS.truncate(stream.node,len)}),utime:(function(path,atime,mtime){var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;node.node_ops.setattr(node,{timestamp:Math.max(atime,mtime)})}),open:(function(path,flags,mode,fd_start,fd_end){if(path===""){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}flags=typeof flags==="string"?FS.modeStringToFlags(flags):flags;mode=typeof mode==="undefined"?438:mode;if(flags&64){mode=mode&4095|32768}else{mode=0}var node;if(typeof path==="object"){node=path}else{path=PATH.normalize(path);try{var lookup=FS.lookupPath(path,{follow:!(flags&131072)});node=lookup.node}catch(e){}}var created=false;if(flags&64){if(node){if(flags&128){throw new FS.ErrnoError(ERRNO_CODES.EEXIST)}}else{node=FS.mknod(path,mode,0);created=true}}if(!node){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}if(FS.isChrdev(node.mode)){flags&=~512}if(flags&65536&&!FS.isDir(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)}if(!created){var err=FS.mayOpen(node,flags);if(err){throw new FS.ErrnoError(err)}}if(flags&512){FS.truncate(node,0)}flags&=~(128|512);var stream=FS.createStream({node:node,path:FS.getPath(node),flags:flags,seekable:true,position:0,stream_ops:node.stream_ops,ungotten:[],error:false},fd_start,fd_end);if(stream.stream_ops.open){stream.stream_ops.open(stream)}if(Module["logReadFiles"]&&!(flags&1)){if(!FS.readFiles)FS.readFiles={};if(!(path in FS.readFiles)){FS.readFiles[path]=1;Module["printErr"]("read file: "+path)}}try{if(FS.trackingDelegate["onOpenFile"]){var trackingFlags=0;if((flags&2097155)!==1){trackingFlags|=FS.tracking.openFlags.READ}if((flags&2097155)!==0){trackingFlags|=FS.tracking.openFlags.WRITE}FS.trackingDelegate["onOpenFile"](path,trackingFlags)}}catch(e){console.log("FS.trackingDelegate['onOpenFile']('"+path+"', flags) threw an exception: "+e.message)}return stream}),close:(function(stream){if(stream.getdents)stream.getdents=null;try{if(stream.stream_ops.close){stream.stream_ops.close(stream)}}catch(e){throw e}finally{FS.closeStream(stream.fd)}}),llseek:(function(stream,offset,whence){if(!stream.seekable||!stream.stream_ops.llseek){throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)}stream.position=stream.stream_ops.llseek(stream,offset,whence);stream.ungotten=[];return stream.position}),read:(function(stream,buffer,offset,length,position){if(length<0||position<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(ERRNO_CODES.EISDIR)}if(!stream.stream_ops.read){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var seeking=true;if(typeof position==="undefined"){position=stream.position;seeking=false}else if(!stream.seekable){throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)}var bytesRead=stream.stream_ops.read(stream,buffer,offset,length,position);if(!seeking)stream.position+=bytesRead;return bytesRead}),write:(function(stream,buffer,offset,length,position,canOwn){if(length<0||position<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(ERRNO_CODES.EISDIR)}if(!stream.stream_ops.write){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}if(stream.flags&1024){FS.llseek(stream,0,2)}var seeking=true;if(typeof position==="undefined"){position=stream.position;seeking=false}else if(!stream.seekable){throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)}var bytesWritten=stream.stream_ops.write(stream,buffer,offset,length,position,canOwn);if(!seeking)stream.position+=bytesWritten;try{if(stream.path&&FS.trackingDelegate["onWriteToFile"])FS.trackingDelegate["onWriteToFile"](stream.path)}catch(e){console.log("FS.trackingDelegate['onWriteToFile']('"+path+"') threw an exception: "+e.message)}return bytesWritten}),allocate:(function(stream,offset,length){if(offset<0||length<=0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}if(!FS.isFile(stream.node.mode)&&!FS.isDir(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.ENODEV)}if(!stream.stream_ops.allocate){throw new FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP)}stream.stream_ops.allocate(stream,offset,length)}),mmap:(function(stream,buffer,offset,length,position,prot,flags){if((stream.flags&2097155)===1){throw new FS.ErrnoError(ERRNO_CODES.EACCES)}if(!stream.stream_ops.mmap){throw new FS.ErrnoError(ERRNO_CODES.ENODEV)}return stream.stream_ops.mmap(stream,buffer,offset,length,position,prot,flags)}),msync:(function(stream,buffer,offset,length,mmapFlags){if(!stream||!stream.stream_ops.msync){return 0}return stream.stream_ops.msync(stream,buffer,offset,length,mmapFlags)}),munmap:(function(stream){return 0}),ioctl:(function(stream,cmd,arg){if(!stream.stream_ops.ioctl){throw new FS.ErrnoError(ERRNO_CODES.ENOTTY)}return stream.stream_ops.ioctl(stream,cmd,arg)}),readFile:(function(path,opts){opts=opts||{};opts.flags=opts.flags||"r";opts.encoding=opts.encoding||"binary";if(opts.encoding!=="utf8"&&opts.encoding!=="binary"){throw new Error('Invalid encoding type "'+opts.encoding+'"')}var ret;var stream=FS.open(path,opts.flags);var stat=FS.stat(path);var length=stat.size;var buf=new Uint8Array(length);FS.read(stream,buf,0,length,0);if(opts.encoding==="utf8"){ret=UTF8ArrayToString(buf,0)}else if(opts.encoding==="binary"){ret=buf}FS.close(stream);return ret}),writeFile:(function(path,data,opts){opts=opts||{};opts.flags=opts.flags||"w";opts.encoding=opts.encoding||"utf8";if(opts.encoding!=="utf8"&&opts.encoding!=="binary"){throw new Error('Invalid encoding type "'+opts.encoding+'"')}var stream=FS.open(path,opts.flags,opts.mode);if(opts.encoding==="utf8"){var buf=new Uint8Array(lengthBytesUTF8(data)+1);var actualNumBytes=stringToUTF8Array(data,buf,0,buf.length);FS.write(stream,buf,0,actualNumBytes,0,opts.canOwn)}else if(opts.encoding==="binary"){FS.write(stream,data,0,data.length,0,opts.canOwn)}FS.close(stream)}),cwd:(function(){return FS.currentPath}),chdir:(function(path){var lookup=FS.lookupPath(path,{follow:true});if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)}var err=FS.nodePermissions(lookup.node,"x");if(err){throw new FS.ErrnoError(err)}FS.currentPath=lookup.path}),createDefaultDirectories:(function(){FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("/home/web_user")}),createDefaultDevices:(function(){FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3),{read:(function(){return 0}),write:(function(stream,buffer,offset,length,pos){return length})});FS.mkdev("/dev/null",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev("/dev/tty",FS.makedev(5,0));FS.mkdev("/dev/tty1",FS.makedev(6,0));var random_device;if(typeof crypto!=="undefined"){var randomBuffer=new Uint8Array(1);random_device=(function(){crypto.getRandomValues(randomBuffer);return randomBuffer[0]})}else if(ENVIRONMENT_IS_NODE){random_device=(function(){return require("crypto").randomBytes(1)[0]})}else{random_device=(function(){return Math.random()*256|0})}FS.createDevice("/dev","random",random_device);FS.createDevice("/dev","urandom",random_device);FS.mkdir("/dev/shm");FS.mkdir("/dev/shm/tmp")}),createSpecialDirectories:(function(){FS.mkdir("/proc");FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd");FS.mount({mount:(function(){var node=FS.createNode("/proc/self","fd",16384|511,73);node.node_ops={lookup:(function(parent,name){var fd=+name;var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(ERRNO_CODES.EBADF);var ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:(function(){return stream.path})}};ret.parent=ret;return ret})};return node})},{},"/proc/self/fd")}),createStandardStreams:(function(){if(Module["stdin"]){FS.createDevice("/dev","stdin",Module["stdin"])}else{FS.symlink("/dev/tty","/dev/stdin")}if(Module["stdout"]){FS.createDevice("/dev","stdout",null,Module["stdout"])}else{FS.symlink("/dev/tty","/dev/stdout")}if(Module["stderr"]){FS.createDevice("/dev","stderr",null,Module["stderr"])}else{FS.symlink("/dev/tty1","/dev/stderr")}var stdin=FS.open("/dev/stdin","r");assert(stdin.fd===0,"invalid handle for stdin ("+stdin.fd+")");var stdout=FS.open("/dev/stdout","w");assert(stdout.fd===1,"invalid handle for stdout ("+stdout.fd+")");var stderr=FS.open("/dev/stderr","w");assert(stderr.fd===2,"invalid handle for stderr ("+stderr.fd+")")}),ensureErrnoError:(function(){if(FS.ErrnoError)return;FS.ErrnoError=function ErrnoError(errno,node){this.node=node;this.setErrno=(function(errno){this.errno=errno;for(var key in ERRNO_CODES){if(ERRNO_CODES[key]===errno){this.code=key;break}}});this.setErrno(errno);this.message=ERRNO_MESSAGES[errno]};FS.ErrnoError.prototype=new Error;FS.ErrnoError.prototype.constructor=FS.ErrnoError;[ERRNO_CODES.ENOENT].forEach((function(code){FS.genericErrors[code]=new FS.ErrnoError(code);FS.genericErrors[code].stack="<generic error, no stack>"}))}),staticInit:(function(){FS.ensureErrnoError();FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={"MEMFS":MEMFS,"IDBFS":IDBFS,"NODEFS":NODEFS,"WORKERFS":WORKERFS}}),init:(function(input,output,error){assert(!FS.init.initialized,"FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)");FS.init.initialized=true;FS.ensureErrnoError();Module["stdin"]=input||Module["stdin"];Module["stdout"]=output||Module["stdout"];Module["stderr"]=error||Module["stderr"];FS.createStandardStreams()}),quit:(function(){FS.init.initialized=false;var fflush=Module["_fflush"];if(fflush)fflush(0);for(var i=0;i<FS.streams.length;i++){var stream=FS.streams[i];if(!stream){continue}FS.close(stream)}}),getMode:(function(canRead,canWrite){var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode}),joinPath:(function(parts,forceRelative){var path=PATH.join.apply(null,parts);if(forceRelative&&path[0]=="/")path=path.substr(1);return path}),absolutePath:(function(relative,base){return PATH.resolve(base,relative)}),standardizePath:(function(path){return PATH.normalize(path)}),findObject:(function(path,dontResolveLastLink){var ret=FS.analyzePath(path,dontResolveLastLink);if(ret.exists){return ret.object}else{___setErrNo(ret.error);return null}}),analyzePath:(function(path,dontResolveLastLink){try{var lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});path=lookup.path}catch(e){}var ret={isRoot:false,exists:false,error:0,name:null,path:null,object:null,parentExists:false,parentPath:null,parentObject:null};try{var lookup=FS.lookupPath(path,{parent:true});ret.parentExists=true;ret.parentPath=lookup.path;ret.parentObject=lookup.node;ret.name=PATH.basename(path);lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});ret.exists=true;ret.path=lookup.path;ret.object=lookup.node;ret.name=lookup.node.name;ret.isRoot=lookup.path==="/"}catch(e){ret.error=e.errno}return ret}),createFolder:(function(parent,name,canRead,canWrite){var path=PATH.join2(typeof parent==="string"?parent:FS.getPath(parent),name);var mode=FS.getMode(canRead,canWrite);return FS.mkdir(path,mode)}),createPath:(function(parent,path,canRead,canWrite){parent=typeof parent==="string"?parent:FS.getPath(parent);var parts=path.split("/").reverse();while(parts.length){var part=parts.pop();if(!part)continue;var current=PATH.join2(parent,part);try{FS.mkdir(current)}catch(e){}parent=current}return current}),createFile:(function(parent,name,properties,canRead,canWrite){var path=PATH.join2(typeof parent==="string"?parent:FS.getPath(parent),name);var mode=FS.getMode(canRead,canWrite);return FS.create(path,mode)}),createDataFile:(function(parent,name,data,canRead,canWrite,canOwn){var path=name?PATH.join2(typeof parent==="string"?parent:FS.getPath(parent),name):parent;var mode=FS.getMode(canRead,canWrite);var node=FS.create(path,mode);if(data){if(typeof data==="string"){var arr=new Array(data.length);for(var i=0,len=data.length;i<len;++i)arr[i]=data.charCodeAt(i);data=arr}FS.chmod(node,mode|146);var stream=FS.open(node,"w");FS.write(stream,data,0,data.length,0,canOwn);FS.close(stream);FS.chmod(node,mode)}return node}),createDevice:(function(parent,name,input,output){var path=PATH.join2(typeof parent==="string"?parent:FS.getPath(parent),name);var mode=FS.getMode(!!input,!!output);if(!FS.createDevice.major)FS.createDevice.major=64;var dev=FS.makedev(FS.createDevice.major++,0);FS.registerDevice(dev,{open:(function(stream){stream.seekable=false}),close:(function(stream){if(output&&output.buffer&&output.buffer.length){output(10)}}),read:(function(stream,buffer,offset,length,pos){var bytesRead=0;for(var i=0;i<length;i++){var result;try{result=input()}catch(e){throw new FS.ErrnoError(ERRNO_CODES.EIO)}if(result===undefined&&bytesRead===0){throw new FS.ErrnoError(ERRNO_CODES.EAGAIN)}if(result===null||result===undefined)break;bytesRead++;buffer[offset+i]=result}if(bytesRead){stream.node.timestamp=Date.now()}return bytesRead}),write:(function(stream,buffer,offset,length,pos){for(var i=0;i<length;i++){try{output(buffer[offset+i])}catch(e){throw new FS.ErrnoError(ERRNO_CODES.EIO)}}if(length){stream.node.timestamp=Date.now()}return i})});return FS.mkdev(path,mode,dev)}),createLink:(function(parent,name,target,canRead,canWrite){var path=PATH.join2(typeof parent==="string"?parent:FS.getPath(parent),name);return FS.symlink(target,path)}),forceLoadFile:(function(obj){if(obj.isDevice||obj.isFolder||obj.link||obj.contents)return true;var success=true;if(typeof XMLHttpRequest!=="undefined"){throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.")}else if(Module["read"]){try{obj.contents=intArrayFromString(Module["read"](obj.url),true);obj.usedBytes=obj.contents.length}catch(e){success=false}}else{throw new Error("Cannot load without read() or XMLHttpRequest.")}if(!success)___setErrNo(ERRNO_CODES.EIO);return success}),createLazyFile:(function(parent,name,url,canRead,canWrite){function LazyUint8Array(){this.lengthKnown=false;this.chunks=[]}LazyUint8Array.prototype.get=function LazyUint8Array_get(idx){if(idx>this.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]};LazyUint8Array.prototype.setDataGetter=function LazyUint8Array_setDataGetter(getter){this.getter=getter};LazyUint8Array.prototype.cacheLength=function LazyUint8Array_cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(function(from,to){if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);if(typeof Uint8Array!="undefined")xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}else{return intArrayFromString(xhr.responseText||"",true)}});var lazyArray=this;lazyArray.setDataGetter((function(chunkNum){var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]==="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]==="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]}));this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true};if(typeof XMLHttpRequest!=="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;Object.defineProperty(lazyArray,"length",{get:(function(){if(!this.lengthKnown){this.cacheLength()}return this._length})});Object.defineProperty(lazyArray,"chunkSize",{get:(function(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize})});var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperty(node,"usedBytes",{get:(function(){return this.contents.length})});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach((function(key){var fn=node.stream_ops[key];stream_ops[key]=function forceLoadLazyFile(){if(!FS.forceLoadFile(node)){throw new FS.ErrnoError(ERRNO_CODES.EIO)}return fn.apply(null,arguments)}}));stream_ops.read=function stream_ops_read(stream,buffer,offset,length,position){if(!FS.forceLoadFile(node)){throw new FS.ErrnoError(ERRNO_CODES.EIO)}var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);assert(size>=0);if(contents.slice){for(var i=0;i<size;i++){buffer[offset+i]=contents[position+i]}}else{for(var i=0;i<size;i++){buffer[offset+i]=contents.get(position+i)}}return size};node.stream_ops=stream_ops;return node}),createPreloadedFile:(function(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish){Browser.init();var fullname=name?PATH.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency("cp "+fullname);function processData(byteArray){function finish(byteArray){if(preFinish)preFinish();if(!dontCreateFile){FS.createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}if(onload)onload();removeRunDependency(dep)}var handled=false;Module["preloadPlugins"].forEach((function(plugin){if(handled)return;if(plugin["canHandle"](fullname)){plugin["handle"](byteArray,fullname,finish,(function(){if(onerror)onerror();removeRunDependency(dep)}));handled=true}}));if(!handled)finish(byteArray)}addRunDependency(dep);if(typeof url=="string"){Browser.asyncLoad(url,(function(byteArray){processData(byteArray)}),onerror)}else{processData(url)}}),indexedDB:(function(){return window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB}),DB_NAME:(function(){return"EM_FS_"+window.location.pathname}),DB_VERSION:20,DB_STORE_NAME:"FILE_DATA",saveFilesToDB:(function(paths,onload,onerror){onload=onload||(function(){});onerror=onerror||(function(){});var indexedDB=FS.indexedDB();try{var openRequest=indexedDB.open(FS.DB_NAME(),FS.DB_VERSION)}catch(e){return onerror(e)}openRequest.onupgradeneeded=function openRequest_onupgradeneeded(){console.log("creating db");var db=openRequest.result;db.createObjectStore(FS.DB_STORE_NAME)};openRequest.onsuccess=function openRequest_onsuccess(){var db=openRequest.result;var transaction=db.transaction([FS.DB_STORE_NAME],"readwrite");var files=transaction.objectStore(FS.DB_STORE_NAME);var ok=0,fail=0,total=paths.length;function finish(){if(fail==0)onload();else onerror()}paths.forEach((function(path){var putRequest=files.put(FS.analyzePath(path).object.contents,path);putRequest.onsuccess=function putRequest_onsuccess(){ok++;if(ok+fail==total)finish()};putRequest.onerror=function putRequest_onerror(){fail++;if(ok+fail==total)finish()}}));transaction.onerror=onerror};openRequest.onerror=onerror}),loadFilesFromDB:(function(paths,onload,onerror){onload=onload||(function(){});onerror=onerror||(function(){});var indexedDB=FS.indexedDB();try{var openRequest=indexedDB.open(FS.DB_NAME(),FS.DB_VERSION)}catch(e){return onerror(e)}openRequest.onupgradeneeded=onerror;openRequest.onsuccess=function openRequest_onsuccess(){var db=openRequest.result;try{var transaction=db.transaction([FS.DB_STORE_NAME],"readonly")}catch(e){onerror(e);return}var files=transaction.objectStore(FS.DB_STORE_NAME);var ok=0,fail=0,total=paths.length;function finish(){if(fail==0)onload();else onerror()}paths.forEach((function(path){var getRequest=files.get(path);getRequest.onsuccess=function getRequest_onsuccess(){if(FS.analyzePath(path).exists){FS.unlink(path)}FS.createDataFile(PATH.dirname(path),PATH.basename(path),getRequest.result,true,true,true);ok++;if(ok+fail==total)finish()};getRequest.onerror=function getRequest_onerror(){fail++;if(ok+fail==total)finish()}}));transaction.onerror=onerror};openRequest.onerror=onerror})};var SYSCALLS={DEFAULT_POLLMASK:5,mappings:{},umask:511,calculateAt:(function(dirfd,path){if(path[0]!=="/"){var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=FS.getStream(dirfd);if(!dirstream)throw new FS.ErrnoError(ERRNO_CODES.EBADF);dir=dirstream.path}path=PATH.join2(dir,path)}return path}),doStat:(function(func,path,buf){try{var stat=func(path)}catch(e){if(e&&e.node&&PATH.normalize(path)!==PATH.normalize(FS.getPath(e.node))){return-ERRNO_CODES.ENOTDIR}throw e}HEAP32[buf>>2]=stat.dev;HEAP32[buf+4>>2]=0;HEAP32[buf+8>>2]=stat.ino;HEAP32[buf+12>>2]=stat.mode;HEAP32[buf+16>>2]=stat.nlink;HEAP32[buf+20>>2]=stat.uid;HEAP32[buf+24>>2]=stat.gid;HEAP32[buf+28>>2]=stat.rdev;HEAP32[buf+32>>2]=0;HEAP32[buf+36>>2]=stat.size;HEAP32[buf+40>>2]=4096;HEAP32[buf+44>>2]=stat.blocks;HEAP32[buf+48>>2]=stat.atime.getTime()/1e3|0;HEAP32[buf+52>>2]=0;HEAP32[buf+56>>2]=stat.mtime.getTime()/1e3|0;HEAP32[buf+60>>2]=0;HEAP32[buf+64>>2]=stat.ctime.getTime()/1e3|0;HEAP32[buf+68>>2]=0;HEAP32[buf+72>>2]=stat.ino;return 0}),doMsync:(function(addr,stream,len,flags){var buffer=new Uint8Array(HEAPU8.subarray(addr,addr+len));FS.msync(stream,buffer,0,len,flags)}),doMkdir:(function(path,mode){path=PATH.normalize(path);if(path[path.length-1]==="/")path=path.substr(0,path.length-1);FS.mkdir(path,mode,0);return 0}),doMknod:(function(path,mode,dev){switch(mode&61440){case 32768:case 8192:case 24576:case 4096:case 49152:break;default:return-ERRNO_CODES.EINVAL}FS.mknod(path,mode,dev);return 0}),doReadlink:(function(path,buf,bufsize){if(bufsize<=0)return-ERRNO_CODES.EINVAL;var ret=FS.readlink(path);ret=ret.slice(0,Math.max(0,bufsize));writeStringToMemory(ret,buf,true);return ret.length}),doAccess:(function(path,amode){if(amode&~7){return-ERRNO_CODES.EINVAL}var node;var lookup=FS.lookupPath(path,{follow:true});node=lookup.node;var perms="";if(amode&4)perms+="r";if(amode&2)perms+="w";if(amode&1)perms+="x";if(perms&&FS.nodePermissions(node,perms)){return-ERRNO_CODES.EACCES}return 0}),doDup:(function(path,flags,suggestFD){var suggest=FS.getStream(suggestFD);if(suggest)FS.close(suggest);return FS.open(path,flags,0,suggestFD,suggestFD).fd}),doReadv:(function(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i<iovcnt;i++){var ptr=HEAP32[iov+i*8>>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr<len)break}return ret}),doWritev:(function(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i<iovcnt;i++){var ptr=HEAP32[iov+i*8>>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr}return ret}),varargs:0,get:(function(varargs){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret}),getStr:(function(){var ret=Pointer_stringify(SYSCALLS.get());return ret}),getStreamFromFD:(function(){var stream=FS.getStream(SYSCALLS.get());if(!stream)throw new FS.ErrnoError(ERRNO_CODES.EBADF);return stream}),getSocketFromFD:(function(){var socket=SOCKFS.getSocket(SYSCALLS.get());if(!socket)throw new FS.ErrnoError(ERRNO_CODES.EBADF);return socket}),getSocketAddress:(function(allowNull){var addrp=SYSCALLS.get(),addrlen=SYSCALLS.get();if(allowNull&&addrp===0)return null;var info=__read_sockaddr(addrp,addrlen);if(info.errno)throw new FS.ErrnoError(info.errno);info.addr=DNS.lookup_addr(info.addr)||info.addr;return info}),get64:(function(){var low=SYSCALLS.get(),high=SYSCALLS.get();if(low>=0)assert(high===0);else assert(high===-1);return low}),getZero:(function(){assert(SYSCALLS.get()===0)})};function ___syscall5(which,varargs){SYSCALLS.varargs=varargs;try{var pathname=SYSCALLS.getStr(),flags=SYSCALLS.get(),mode=SYSCALLS.get();var stream=FS.open(pathname,flags,mode);return stream.fd}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return dest}Module["_memcpy"]=_memcpy;function ___syscall6(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD();FS.close(stream);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}var _cos=Math_cos;function _sbrk(bytes){var self=_sbrk;if(!self.called){DYNAMICTOP=alignMemoryPage(DYNAMICTOP);self.called=true;assert(Runtime.dynamicAlloc);self.alloc=Runtime.dynamicAlloc;Runtime.dynamicAlloc=(function(){abort("cannot dynamically allocate, sbrk now has control")})}var ret=DYNAMICTOP;if(bytes!=0){var success=self.alloc(bytes);if(!success)return-1>>>0}return ret}var _BItoD=true;function ___syscall54(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),op=SYSCALLS.get();switch(op){case 21505:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return 0};case 21506:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return 0};case 21519:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;var argp=SYSCALLS.get();HEAP32[argp>>2]=0;return 0};case 21520:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return-ERRNO_CODES.EINVAL};case 21531:{var argp=SYSCALLS.get();return FS.ioctl(stream,op,argp)};default:abort("bad ioctl syscall "+op)}}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}var _ceilf=Math_ceil;function __embind_register_memory_view(rawType,dataTypeIndex,name){var typeMapping=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array];var TA=typeMapping[dataTypeIndex];function decodeMemoryView(handle){handle=handle>>2;var heap=HEAPU32;var size=heap[handle];var data=heap[handle+1];return new TA(heap["buffer"],data,size)}name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":decodeMemoryView,"argPackAdvance":8,"readValueFromPointer":decodeMemoryView},{ignoreDuplicateRegistrations:true})}function _time(ptr){var ret=Date.now()/1e3|0;if(ptr){HEAP32[ptr>>2]=ret}return ret}function _pthread_self(){return 0}function ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();var offset=offset_low;assert(offset_high===0);FS.llseek(stream,offset,whence);HEAP32[result>>2]=stream.position;if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall146(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();return SYSCALLS.doWritev(stream,iov,iovcnt)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall221(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),cmd=SYSCALLS.get();switch(cmd){case 0:{var arg=SYSCALLS.get();if(arg<0){return-ERRNO_CODES.EINVAL}var newStream;newStream=FS.open(stream.path,stream.flags,0,arg);return newStream.fd};case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=SYSCALLS.get();stream.flags|=arg;return 0};case 12:case 12:{var arg=SYSCALLS.get();var offset=0;HEAP16[arg+offset>>1]=2;return 0};case 13:case 14:case 13:case 14:return 0;case 16:case 8:return-ERRNO_CODES.EINVAL;case 9:___setErrNo(ERRNO_CODES.EINVAL);return-1;default:{return-ERRNO_CODES.EINVAL}}}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall145(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();return SYSCALLS.doReadv(stream,iov,iovcnt)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}var ___dso_handle=allocate(1,"i32*",ALLOC_STATIC);embind_init_charCodes();BindingError=Module["BindingError"]=extendError(Error,"BindingError");InternalError=Module["InternalError"]=extendError(Error,"InternalError");init_emval();UnboundTypeError=Module["UnboundTypeError"]=extendError(Error,"UnboundTypeError");FS.staticInit();__ATINIT__.unshift((function(){if(!Module["noFSInit"]&&!FS.init.initialized)FS.init()}));__ATMAIN__.push((function(){FS.ignorePermissions=false}));__ATEXIT__.push((function(){FS.quit()}));Module["FS_createFolder"]=FS.createFolder;Module["FS_createPath"]=FS.createPath;Module["FS_createDataFile"]=FS.createDataFile;Module["FS_createPreloadedFile"]=FS.createPreloadedFile;Module["FS_createLazyFile"]=FS.createLazyFile;Module["FS_createLink"]=FS.createLink;Module["FS_createDevice"]=FS.createDevice;Module["FS_unlink"]=FS.unlink;__ATINIT__.unshift((function(){TTY.init()}));__ATEXIT__.push((function(){TTY.shutdown()}));if(ENVIRONMENT_IS_NODE){var fs=require("fs");var NODEJS_PATH=require("path");NODEFS.staticInit()}STACK_BASE=STACKTOP=Runtime.alignMemory(STATICTOP);staticSealed=true;STACK_MAX=STACK_BASE+TOTAL_STACK;DYNAMIC_BASE=DYNAMICTOP=Runtime.alignMemory(STACK_MAX);assert(DYNAMIC_BASE<TOTAL_MEMORY,"TOTAL_MEMORY not big enough for stack");var cttz_i8=allocate([8,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0],"i8",ALLOC_DYNAMIC);function invoke_iiii(index,a1,a2,a3){try{return Module["dynCall_iiii"](index,a1,a2,a3)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;asm["setThrew"](1,0)}}function invoke_viiiii(index,a1,a2,a3,a4,a5){try{Module["dynCall_viiiii"](index,a1,a2,a3,a4,a5)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;asm["setThrew"](1,0)}}function invoke_dii(index,a1,a2){try{return Module["dynCall_dii"](index,a1,a2)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;asm["setThrew"](1,0)}}function invoke_vid(index,a1,a2){try{Module["dynCall_vid"](index,a1,a2)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;asm["setThrew"](1,0)}}function invoke_di(index,a1){try{return Module["dynCall_di"](index,a1)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;asm["setThrew"](1,0)}}function invoke_i(index){try{return Module["dynCall_i"](index)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;asm["setThrew"](1,0)}}function invoke_vi(index,a1){try{Module["dynCall_vi"](index,a1)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;asm["setThrew"](1,0)}}function invoke_vii(index,a1,a2){try{Module["dynCall_vii"](index,a1,a2)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;asm["setThrew"](1,0)}}function invoke_ii(index,a1){try{return Module["dynCall_ii"](index,a1)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;asm["setThrew"](1,0)}}function invoke_viii(index,a1,a2,a3){try{Module["dynCall_viii"](index,a1,a2,a3)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;asm["setThrew"](1,0)}}function invoke_v(index){try{Module["dynCall_v"](index)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;asm["setThrew"](1,0)}}function invoke_viid(index,a1,a2,a3){try{Module["dynCall_viid"](index,a1,a2,a3)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;asm["setThrew"](1,0)}}function invoke_iiiii(index,a1,a2,a3,a4){try{return Module["dynCall_iiiii"](index,a1,a2,a3,a4)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;asm["setThrew"](1,0)}}function invoke_viiiiii(index,a1,a2,a3,a4,a5,a6){try{Module["dynCall_viiiiii"](index,a1,a2,a3,a4,a5,a6)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;asm["setThrew"](1,0)}}function invoke_iii(index,a1,a2){try{return Module["dynCall_iii"](index,a1,a2)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;asm["setThrew"](1,0)}}function invoke_viiii(index,a1,a2,a3,a4){try{Module["dynCall_viiii"](index,a1,a2,a3,a4)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;asm["setThrew"](1,0)}}Module.asmGlobalArg={"Math":Math,"Int8Array":Int8Array,"Int16Array":Int16Array,"Int32Array":Int32Array,"Uint8Array":Uint8Array,"Uint16Array":Uint16Array,"Uint32Array":Uint32Array,"Float32Array":Float32Array,"Float64Array":Float64Array,"NaN":NaN,"Infinity":Infinity};Module.asmLibraryArg={"abort":abort,"assert":assert,"invoke_iiii":invoke_iiii,"invoke_viiiii":invoke_viiiii,"invoke_dii":invoke_dii,"invoke_vid":invoke_vid,"invoke_di":invoke_di,"invoke_i":invoke_i,"invoke_vi":invoke_vi,"invoke_vii":invoke_vii,"invoke_ii":invoke_ii,"invoke_viii":invoke_viii,"invoke_v":invoke_v,"invoke_viid":invoke_viid,"invoke_iiiii":invoke_iiiii,"invoke_viiiiii":invoke_viiiiii,"invoke_iii":invoke_iii,"invoke_viiii":invoke_viiii,"_fabs":_fabs,"___syscall221":___syscall221,"_sin":_sin,"floatReadValueFromPointer":floatReadValueFromPointer,"simpleReadValueFromPointer":simpleReadValueFromPointer,"integerReadValueFromPointer":integerReadValueFromPointer,"__embind_register_memory_view":__embind_register_memory_view,"throwInternalError":throwInternalError,"get_first_emval":get_first_emval,"_abort":_abort,"count_emval_handles":count_emval_handles,"_pthread_cleanup_push":_pthread_cleanup_push,"__embind_register_integer":__embind_register_integer,"extendError":extendError,"___assert_fail":___assert_fail,"init_emval":init_emval,"__embind_register_void":__embind_register_void,"___cxa_find_matching_catch":___cxa_find_matching_catch,"_ceilf":_ceilf,"getShiftFromSize":getShiftFromSize,"__embind_register_function":__embind_register_function,"embind_init_charCodes":embind_init_charCodes,"_emscripten_asm_const_33":_emscripten_asm_const_33,"throwBindingError":throwBindingError,"___setErrNo":___setErrNo,"__emval_register":__emval_register,"_sbrk":_sbrk,"readLatin1String":readLatin1String,"___cxa_allocate_exception":___cxa_allocate_exception,"_emscripten_memcpy_big":_emscripten_memcpy_big,"__embind_register_bool":__embind_register_bool,"___resumeException":___resumeException,"__ZSt18uncaught_exceptionv":__ZSt18uncaught_exceptionv,"_sysconf":_sysconf,"_embind_repr":_embind_repr,"__embind_register_std_wstring":__embind_register_std_wstring,"createNamedFunction":createNamedFunction,"__embind_register_emval":__embind_register_emval,"_cos":_cos,"throwUnboundTypeError":throwUnboundTypeError,"_pthread_self":_pthread_self,"craftInvokerFunction":craftInvokerFunction,"__emval_decref":__emval_decref,"_sqrt":_sqrt,"__embind_register_float":__embind_register_float,"makeLegalFunctionName":makeLegalFunctionName,"___syscall54":___syscall54,"___unlock":___unlock,"heap32VectorToArray":heap32VectorToArray,"_pthread_cleanup_pop":_pthread_cleanup_pop,"whenDependentTypesAreResolved":whenDependentTypesAreResolved,"_exit":_exit,"__embind_register_std_string":__embind_register_std_string,"new_":new_,"___cxa_atexit":___cxa_atexit,"registerType":registerType,"___cxa_throw":___cxa_throw,"__exit":__exit,"___lock":___lock,"___syscall6":___syscall6,"___syscall5":___syscall5,"ensureOverloadTable":ensureOverloadTable,"__embind_register_constant":__embind_register_constant,"_time":_time,"requireFunction":requireFunction,"runDestructors":runDestructors,"getTypeName":getTypeName,"_atexit":_atexit,"___syscall140":___syscall140,"exposePublicSymbol":exposePublicSymbol,"_emscripten_asm_const_5":_emscripten_asm_const_5,"_emscripten_asm_const_4":_emscripten_asm_const_4,"replacePublicSymbol":replacePublicSymbol,"___syscall145":___syscall145,"___syscall146":___syscall146,"STACKTOP":STACKTOP,"STACK_MAX":STACK_MAX,"tempDoublePtr":tempDoublePtr,"ABORT":ABORT,"cttz_i8":cttz_i8,"___dso_handle":___dso_handle};// EMSCRIPTEN_START_ASM +var asm=(function(global,env,buffer) { +"use asm";var a=new global.Int8Array(buffer);var b=new global.Int16Array(buffer);var c=new global.Int32Array(buffer);var d=new global.Uint8Array(buffer);var e=new global.Uint16Array(buffer);var f=new global.Uint32Array(buffer);var g=new global.Float32Array(buffer);var h=new global.Float64Array(buffer);var i=env.STACKTOP|0;var j=env.STACK_MAX|0;var k=env.tempDoublePtr|0;var l=env.ABORT|0;var m=env.cttz_i8|0;var n=env.___dso_handle|0;var o=0;var p=0;var q=0;var r=0;var s=global.NaN,t=global.Infinity;var u=0,v=0,w=0,x=0,y=0.0,z=0,A=0,B=0,C=0.0;var D=0;var E=0;var F=0;var G=0;var H=0;var I=0;var J=0;var K=0;var L=0;var M=0;var N=global.Math.floor;var O=global.Math.abs;var P=global.Math.sqrt;var Q=global.Math.pow;var R=global.Math.cos;var S=global.Math.sin;var T=global.Math.tan;var U=global.Math.acos;var V=global.Math.asin;var W=global.Math.atan;var X=global.Math.atan2;var Y=global.Math.exp;var Z=global.Math.log;var _=global.Math.ceil;var $=global.Math.imul;var aa=global.Math.min;var ba=global.Math.clz32;var ca=env.abort;var da=env.assert;var ea=env.invoke_iiii;var fa=env.invoke_viiiii;var ga=env.invoke_dii;var ha=env.invoke_vid;var ia=env.invoke_di;var ja=env.invoke_i;var ka=env.invoke_vi;var la=env.invoke_vii;var ma=env.invoke_ii;var na=env.invoke_viii;var oa=env.invoke_v;var pa=env.invoke_viid;var qa=env.invoke_iiiii;var ra=env.invoke_viiiiii;var sa=env.invoke_iii;var ta=env.invoke_viiii;var ua=env._fabs;var va=env.___syscall221;var wa=env._sin;var xa=env.floatReadValueFromPointer;var ya=env.simpleReadValueFromPointer;var za=env.integerReadValueFromPointer;var Aa=env.__embind_register_memory_view;var Ba=env.throwInternalError;var Ca=env.get_first_emval;var Da=env._abort;var Ea=env.count_emval_handles;var Fa=env._pthread_cleanup_push;var Ga=env.__embind_register_integer;var Ha=env.extendError;var Ia=env.___assert_fail;var Ja=env.init_emval;var Ka=env.__embind_register_void;var La=env.___cxa_find_matching_catch;var Ma=env._ceilf;var Na=env.getShiftFromSize;var Oa=env.__embind_register_function;var Pa=env.embind_init_charCodes;var Qa=env._emscripten_asm_const_33;var Ra=env.throwBindingError;var Sa=env.___setErrNo;var Ta=env.__emval_register;var Ua=env._sbrk;var Va=env.readLatin1String;var Wa=env.___cxa_allocate_exception;var Xa=env._emscripten_memcpy_big;var Ya=env.__embind_register_bool;var Za=env.___resumeException;var _a=env.__ZSt18uncaught_exceptionv;var $a=env._sysconf;var ab=env._embind_repr;var bb=env.__embind_register_std_wstring;var cb=env.createNamedFunction;var db=env.__embind_register_emval;var eb=env._cos;var fb=env.throwUnboundTypeError;var gb=env._pthread_self;var hb=env.craftInvokerFunction;var ib=env.__emval_decref;var jb=env._sqrt;var kb=env.__embind_register_float;var lb=env.makeLegalFunctionName;var mb=env.___syscall54;var nb=env.___unlock;var ob=env.heap32VectorToArray;var pb=env._pthread_cleanup_pop;var qb=env.whenDependentTypesAreResolved;var rb=env._exit;var sb=env.__embind_register_std_string;var tb=env.new_;var ub=env.___cxa_atexit;var vb=env.registerType;var wb=env.___cxa_throw;var xb=env.__exit;var yb=env.___lock;var zb=env.___syscall6;var Ab=env.___syscall5;var Bb=env.ensureOverloadTable;var Cb=env.__embind_register_constant;var Db=env._time;var Eb=env.requireFunction;var Fb=env.runDestructors;var Gb=env.getTypeName;var Hb=env._atexit;var Ib=env.___syscall140;var Jb=env.exposePublicSymbol;var Kb=env._emscripten_asm_const_5;var Lb=env._emscripten_asm_const_4;var Mb=env.replacePublicSymbol;var Nb=env.___syscall145;var Ob=env.___syscall146;var Pb=0.0; +// EMSCRIPTEN_START_FUNCS +function dd(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;F=i;i=i+16|0;B=F;D=(f|0)/2|0;E=(g|0)/2|0;o=c[k>>2]|0;A=E+-1|0;if((f|0)>1){l=0;m=o;n=o+(($(A,D)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(D|0))break;else{m=m+2|0;n=n+2|0}}}z=D+-1|0;if((g|0)>1){l=0;m=o;n=o+(z<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(E|0))break;else{m=m+(D<<1)|0;n=n+(D<<1)|0}}}n=k+1179664|0;m=D+1|0;w=0-D|0;u=1-D|0;v=~D;t=f+4|0;a:do if((A|0)>1){x=(z|0)>1;l=(c[k+4>>2]|0)+m|0;y=1;g=e+((f<<1)+2)|0;e=o+(m<<1)|0;m=0;b:while(1){if(x){s=1;r=g;q=m;while(1){do if((d[r>>0]|0|0)>(j|0)){b[e>>1]=0;a[l>>0]=0;m=q}else{a[l>>0]=-1;m=b[e+(w<<1)>>1]|0;if(m<<16>>16>0){b[e>>1]=m;m=(m<<16>>16)*7|0;p=k+1310736+(m+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=k+1310736+(m+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=k+1310736+(m+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+y;c[k+1310736+(m+-1<<2)>>2]=y;m=q;break}f=b[e+(u<<1)>>1]|0;o=f<<16>>16;m=b[e+(v<<1)>>1]|0;p=m<<16>>16;g=m<<16>>16>0;if(f<<16>>16<=0){if(g){b[e>>1]=m;m=p*7|0;g=k+1310736+(m+-7<<2)|0;c[g>>2]=(c[g>>2]|0)+1;g=k+1310736+(m+-6<<2)|0;c[g>>2]=(c[g>>2]|0)+s;g=k+1310736+(m+-5<<2)|0;c[g>>2]=(c[g>>2]|0)+y;g=k+1310736+(m+-3<<2)|0;if((c[g>>2]|0)<(s|0))c[g>>2]=s;c[k+1310736+(m+-1<<2)>>2]=y;m=q;break}m=b[e+-2>>1]|0;if(m<<16>>16>0){b[e>>1]=m;m=(m<<16>>16)*7|0;p=k+1310736+(m+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=k+1310736+(m+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=k+1310736+(m+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+y;m=k+1310736+(m+-3<<2)|0;if((c[m>>2]|0)>=(s|0)){m=q;break}c[m>>2]=s;m=q;break}else{m=q+1|0;if((q|0)>32767)break b;b[e>>1]=m;c[k+1179664+(q<<2)>>2]=m<<16>>16;q=q*7|0;c[k+1310736+(q<<2)>>2]=1;c[k+1310736+(q+1<<2)>>2]=s;c[k+1310736+(q+2<<2)>>2]=y;c[k+1310736+(q+3<<2)>>2]=s;c[k+1310736+(q+4<<2)>>2]=s;c[k+1310736+(q+5<<2)>>2]=y;c[k+1310736+(q+6<<2)>>2]=y;break}}if(g){m=c[k+1179664+(o+-1<<2)>>2]|0;o=c[k+1179664+(p+-1<<2)>>2]|0;if((m|0)>(o|0)){b[e>>1]=o;if((q|0)>0){g=0;f=n;while(1){if((c[f>>2]|0)==(m|0))c[f>>2]=o;g=g+1|0;if((g|0)>=(q|0)){m=o;break}else f=f+4|0}}else m=o}else{b[e>>1]=m;if((m|0)<(o|0)&(q|0)>0){g=0;f=n;while(1){if((c[f>>2]|0)==(o|0))c[f>>2]=m;g=g+1|0;if((g|0)>=(q|0))break;else f=f+4|0}}}m=(m<<16>>16)*7|0;p=k+1310736+(m+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=k+1310736+(m+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=k+1310736+(m+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+y;c[k+1310736+(m+-1<<2)>>2]=y;m=q;break}g=b[e+-2>>1]|0;if(g<<16>>16<=0){b[e>>1]=f;m=o*7|0;g=k+1310736+(m+-7<<2)|0;c[g>>2]=(c[g>>2]|0)+1;g=k+1310736+(m+-6<<2)|0;c[g>>2]=(c[g>>2]|0)+s;g=k+1310736+(m+-5<<2)|0;c[g>>2]=(c[g>>2]|0)+y;g=k+1310736+(m+-4<<2)|0;if((c[g>>2]|0)>(s|0))c[g>>2]=s;c[k+1310736+(m+-1<<2)>>2]=y;m=q;break}m=c[k+1179664+(o+-1<<2)>>2]|0;o=c[k+1179664+((g<<16>>16)+-1<<2)>>2]|0;if((m|0)>(o|0)){b[e>>1]=o;if((q|0)>0){g=0;f=n;while(1){if((c[f>>2]|0)==(m|0))c[f>>2]=o;g=g+1|0;if((g|0)>=(q|0)){m=o;break}else f=f+4|0}}else m=o}else{b[e>>1]=m;if((m|0)<(o|0)&(q|0)>0){g=0;f=n;while(1){if((c[f>>2]|0)==(o|0))c[f>>2]=m;g=g+1|0;if((g|0)>=(q|0))break;else f=f+4|0}}}m=(m<<16>>16)*7|0;p=k+1310736+(m+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=k+1310736+(m+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;m=k+1310736+(m+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+y;m=q}while(0);s=s+1|0;g=r+2|0;e=e+2|0;l=l+1|0;if((s|0)>=(z|0))break;else{r=g;q=m}}}y=y+1|0;if((y|0)>=(A|0)){o=m;C=52;break a}else{l=l+2|0;g=g+t|0;e=e+4|0}}Me(3,3904,B);l=-1}else{o=0;C=52}while(0);if((C|0)==52){e=k+12|0;if((o|0)<1)m=1;else{g=1;m=1;while(1){l=c[n>>2]|0;if((l|0)==(g|0)){l=m;m=m+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[n>>2]=l;if((g|0)<(o|0)){g=g+1|0;n=n+4|0}else break}}f=k+8|0;l=m+-1|0;c[f>>2]=l;if(l){ek(e|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((m|0)>1){l=0;do{C=l<<2;c[k+131084+(C<<2)>>2]=D;c[k+131084+((C|1)<<2)>>2]=0;c[k+131084+((C|2)<<2)>>2]=E;c[k+131084+((C|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[f>>2]|0))}if((o|0)>0){e=0;do{n=(c[k+1179664+(e<<2)>>2]|0)+-1|0;g=e*7|0;l=k+12+(n<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(g<<2)>>2]|0);l=n<<1;m=k+655376+(l<<3)|0;h[m>>3]=+h[m>>3]+ +(c[k+1310736+(g+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(g+2<<2)>>2]|0);n=n<<2;l=k+131084+(n<<2)|0;m=c[k+1310736+(g+3<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;l=k+131084+((n|1)<<2)|0;m=c[k+1310736+(g+4<<2)>>2]|0;if((c[l>>2]|0)<(m|0))c[l>>2]=m;l=k+131084+((n|2)<<2)|0;m=c[k+1310736+(g+5<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;m=k+131084+((n|3)<<2)|0;l=c[k+1310736+(g+6<<2)>>2]|0;if((c[m>>2]|0)<(l|0))c[m>>2]=l;e=e+1|0}while((e|0)<(o|0))}if((c[f>>2]|0)>0){l=0;do{D=k+12+(l<<2)|0;E=l<<1;C=k+655376+(E<<3)|0;h[C>>3]=+h[C>>3]/+(c[D>>2]|0);E=k+655376+((E|1)<<3)|0;h[E>>3]=+h[E>>3]/+(c[D>>2]|0);l=l+1|0}while((l|0)<(c[f>>2]|0));l=0}else l=0}else l=0}i=F;return l|0}function ed(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;F=i;i=i+16|0;B=F;D=(f|0)/2|0;E=(g|0)/2|0;o=c[k>>2]|0;A=E+-1|0;if((f|0)>1){l=0;m=o;n=o+(($(A,D)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(D|0))break;else{m=m+2|0;n=n+2|0}}}z=D+-1|0;if((g|0)>1){l=0;m=o;n=o+(z<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(E|0))break;else{m=m+(D<<1)|0;n=n+(D<<1)|0}}}n=k+1179664|0;m=D+1|0;w=0-D|0;u=1-D|0;v=~D;t=(f<<1)+8|0;a:do if((A|0)>1){x=(z|0)>1;l=(c[k+4>>2]|0)+m|0;y=1;g=e+((f<<2)+4)|0;e=o+(m<<1)|0;m=0;b:while(1){if(x){s=1;r=g;q=m;while(1){do if((d[r+1>>0]|0|0)>(j|0)){b[e>>1]=0;a[l>>0]=0;m=q}else{a[l>>0]=-1;m=b[e+(w<<1)>>1]|0;if(m<<16>>16>0){b[e>>1]=m;m=(m<<16>>16)*7|0;p=k+1310736+(m+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=k+1310736+(m+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=k+1310736+(m+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+y;c[k+1310736+(m+-1<<2)>>2]=y;m=q;break}f=b[e+(u<<1)>>1]|0;o=f<<16>>16;m=b[e+(v<<1)>>1]|0;p=m<<16>>16;g=m<<16>>16>0;if(f<<16>>16<=0){if(g){b[e>>1]=m;m=p*7|0;g=k+1310736+(m+-7<<2)|0;c[g>>2]=(c[g>>2]|0)+1;g=k+1310736+(m+-6<<2)|0;c[g>>2]=(c[g>>2]|0)+s;g=k+1310736+(m+-5<<2)|0;c[g>>2]=(c[g>>2]|0)+y;g=k+1310736+(m+-3<<2)|0;if((c[g>>2]|0)<(s|0))c[g>>2]=s;c[k+1310736+(m+-1<<2)>>2]=y;m=q;break}m=b[e+-2>>1]|0;if(m<<16>>16>0){b[e>>1]=m;m=(m<<16>>16)*7|0;p=k+1310736+(m+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=k+1310736+(m+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=k+1310736+(m+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+y;m=k+1310736+(m+-3<<2)|0;if((c[m>>2]|0)>=(s|0)){m=q;break}c[m>>2]=s;m=q;break}else{m=q+1|0;if((q|0)>32767)break b;b[e>>1]=m;c[k+1179664+(q<<2)>>2]=m<<16>>16;q=q*7|0;c[k+1310736+(q<<2)>>2]=1;c[k+1310736+(q+1<<2)>>2]=s;c[k+1310736+(q+2<<2)>>2]=y;c[k+1310736+(q+3<<2)>>2]=s;c[k+1310736+(q+4<<2)>>2]=s;c[k+1310736+(q+5<<2)>>2]=y;c[k+1310736+(q+6<<2)>>2]=y;break}}if(g){m=c[k+1179664+(o+-1<<2)>>2]|0;o=c[k+1179664+(p+-1<<2)>>2]|0;if((m|0)>(o|0)){b[e>>1]=o;if((q|0)>0){g=0;f=n;while(1){if((c[f>>2]|0)==(m|0))c[f>>2]=o;g=g+1|0;if((g|0)>=(q|0)){m=o;break}else f=f+4|0}}else m=o}else{b[e>>1]=m;if((m|0)<(o|0)&(q|0)>0){g=0;f=n;while(1){if((c[f>>2]|0)==(o|0))c[f>>2]=m;g=g+1|0;if((g|0)>=(q|0))break;else f=f+4|0}}}m=(m<<16>>16)*7|0;p=k+1310736+(m+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=k+1310736+(m+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=k+1310736+(m+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+y;c[k+1310736+(m+-1<<2)>>2]=y;m=q;break}g=b[e+-2>>1]|0;if(g<<16>>16<=0){b[e>>1]=f;m=o*7|0;g=k+1310736+(m+-7<<2)|0;c[g>>2]=(c[g>>2]|0)+1;g=k+1310736+(m+-6<<2)|0;c[g>>2]=(c[g>>2]|0)+s;g=k+1310736+(m+-5<<2)|0;c[g>>2]=(c[g>>2]|0)+y;g=k+1310736+(m+-4<<2)|0;if((c[g>>2]|0)>(s|0))c[g>>2]=s;c[k+1310736+(m+-1<<2)>>2]=y;m=q;break}m=c[k+1179664+(o+-1<<2)>>2]|0;o=c[k+1179664+((g<<16>>16)+-1<<2)>>2]|0;if((m|0)>(o|0)){b[e>>1]=o;if((q|0)>0){g=0;f=n;while(1){if((c[f>>2]|0)==(m|0))c[f>>2]=o;g=g+1|0;if((g|0)>=(q|0)){m=o;break}else f=f+4|0}}else m=o}else{b[e>>1]=m;if((m|0)<(o|0)&(q|0)>0){g=0;f=n;while(1){if((c[f>>2]|0)==(o|0))c[f>>2]=m;g=g+1|0;if((g|0)>=(q|0))break;else f=f+4|0}}}m=(m<<16>>16)*7|0;p=k+1310736+(m+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=k+1310736+(m+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;m=k+1310736+(m+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+y;m=q}while(0);s=s+1|0;g=r+4|0;e=e+2|0;l=l+1|0;if((s|0)>=(z|0))break;else{r=g;q=m}}}y=y+1|0;if((y|0)>=(A|0)){o=m;C=52;break a}else{l=l+2|0;g=g+t|0;e=e+4|0}}Me(3,3904,B);l=-1}else{o=0;C=52}while(0);if((C|0)==52){e=k+12|0;if((o|0)<1)m=1;else{g=1;m=1;while(1){l=c[n>>2]|0;if((l|0)==(g|0)){l=m;m=m+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[n>>2]=l;if((g|0)<(o|0)){g=g+1|0;n=n+4|0}else break}}f=k+8|0;l=m+-1|0;c[f>>2]=l;if(l){ek(e|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((m|0)>1){l=0;do{C=l<<2;c[k+131084+(C<<2)>>2]=D;c[k+131084+((C|1)<<2)>>2]=0;c[k+131084+((C|2)<<2)>>2]=E;c[k+131084+((C|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[f>>2]|0))}if((o|0)>0){e=0;do{n=(c[k+1179664+(e<<2)>>2]|0)+-1|0;g=e*7|0;l=k+12+(n<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(g<<2)>>2]|0);l=n<<1;m=k+655376+(l<<3)|0;h[m>>3]=+h[m>>3]+ +(c[k+1310736+(g+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(g+2<<2)>>2]|0);n=n<<2;l=k+131084+(n<<2)|0;m=c[k+1310736+(g+3<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;l=k+131084+((n|1)<<2)|0;m=c[k+1310736+(g+4<<2)>>2]|0;if((c[l>>2]|0)<(m|0))c[l>>2]=m;l=k+131084+((n|2)<<2)|0;m=c[k+1310736+(g+5<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;m=k+131084+((n|3)<<2)|0;l=c[k+1310736+(g+6<<2)>>2]|0;if((c[m>>2]|0)<(l|0))c[m>>2]=l;e=e+1|0}while((e|0)<(o|0))}if((c[f>>2]|0)>0){l=0;do{D=k+12+(l<<2)|0;E=l<<1;C=k+655376+(E<<3)|0;h[C>>3]=+h[C>>3]/+(c[D>>2]|0);E=k+655376+((E|1)<<3)|0;h[E>>3]=+h[E>>3]/+(c[D>>2]|0);l=l+1|0}while((l|0)<(c[f>>2]|0));l=0}else l=0}else l=0}i=F;return l|0}function fd(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;F=i;i=i+16|0;B=F;D=(f|0)/2|0;E=(g|0)/2|0;o=c[k>>2]|0;A=E+-1|0;if((f|0)>1){l=0;m=o;n=o+(($(A,D)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(D|0))break;else{m=m+2|0;n=n+2|0}}}z=D+-1|0;if((g|0)>1){l=0;m=o;n=o+(z<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(E|0))break;else{m=m+(D<<1)|0;n=n+(D<<1)|0}}}n=k+1179664|0;m=D+1|0;w=0-D|0;u=1-D|0;v=~D;t=(f<<1)+8|0;a:do if((A|0)>1){x=(z|0)>1;l=(c[k+4>>2]|0)+m|0;y=1;g=e+((f<<2)+4)|0;e=o+(m<<1)|0;m=0;b:while(1){if(x){s=1;r=g;q=m;while(1){do if((d[r>>0]|0|0)>(j|0)){b[e>>1]=0;a[l>>0]=0;m=q}else{a[l>>0]=-1;m=b[e+(w<<1)>>1]|0;if(m<<16>>16>0){b[e>>1]=m;m=(m<<16>>16)*7|0;p=k+1310736+(m+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=k+1310736+(m+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=k+1310736+(m+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+y;c[k+1310736+(m+-1<<2)>>2]=y;m=q;break}f=b[e+(u<<1)>>1]|0;o=f<<16>>16;m=b[e+(v<<1)>>1]|0;p=m<<16>>16;g=m<<16>>16>0;if(f<<16>>16<=0){if(g){b[e>>1]=m;m=p*7|0;g=k+1310736+(m+-7<<2)|0;c[g>>2]=(c[g>>2]|0)+1;g=k+1310736+(m+-6<<2)|0;c[g>>2]=(c[g>>2]|0)+s;g=k+1310736+(m+-5<<2)|0;c[g>>2]=(c[g>>2]|0)+y;g=k+1310736+(m+-3<<2)|0;if((c[g>>2]|0)<(s|0))c[g>>2]=s;c[k+1310736+(m+-1<<2)>>2]=y;m=q;break}m=b[e+-2>>1]|0;if(m<<16>>16>0){b[e>>1]=m;m=(m<<16>>16)*7|0;p=k+1310736+(m+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=k+1310736+(m+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=k+1310736+(m+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+y;m=k+1310736+(m+-3<<2)|0;if((c[m>>2]|0)>=(s|0)){m=q;break}c[m>>2]=s;m=q;break}else{m=q+1|0;if((q|0)>32767)break b;b[e>>1]=m;c[k+1179664+(q<<2)>>2]=m<<16>>16;q=q*7|0;c[k+1310736+(q<<2)>>2]=1;c[k+1310736+(q+1<<2)>>2]=s;c[k+1310736+(q+2<<2)>>2]=y;c[k+1310736+(q+3<<2)>>2]=s;c[k+1310736+(q+4<<2)>>2]=s;c[k+1310736+(q+5<<2)>>2]=y;c[k+1310736+(q+6<<2)>>2]=y;break}}if(g){m=c[k+1179664+(o+-1<<2)>>2]|0;o=c[k+1179664+(p+-1<<2)>>2]|0;if((m|0)>(o|0)){b[e>>1]=o;if((q|0)>0){g=0;f=n;while(1){if((c[f>>2]|0)==(m|0))c[f>>2]=o;g=g+1|0;if((g|0)>=(q|0)){m=o;break}else f=f+4|0}}else m=o}else{b[e>>1]=m;if((m|0)<(o|0)&(q|0)>0){g=0;f=n;while(1){if((c[f>>2]|0)==(o|0))c[f>>2]=m;g=g+1|0;if((g|0)>=(q|0))break;else f=f+4|0}}}m=(m<<16>>16)*7|0;p=k+1310736+(m+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=k+1310736+(m+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=k+1310736+(m+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+y;c[k+1310736+(m+-1<<2)>>2]=y;m=q;break}g=b[e+-2>>1]|0;if(g<<16>>16<=0){b[e>>1]=f;m=o*7|0;g=k+1310736+(m+-7<<2)|0;c[g>>2]=(c[g>>2]|0)+1;g=k+1310736+(m+-6<<2)|0;c[g>>2]=(c[g>>2]|0)+s;g=k+1310736+(m+-5<<2)|0;c[g>>2]=(c[g>>2]|0)+y;g=k+1310736+(m+-4<<2)|0;if((c[g>>2]|0)>(s|0))c[g>>2]=s;c[k+1310736+(m+-1<<2)>>2]=y;m=q;break}m=c[k+1179664+(o+-1<<2)>>2]|0;o=c[k+1179664+((g<<16>>16)+-1<<2)>>2]|0;if((m|0)>(o|0)){b[e>>1]=o;if((q|0)>0){g=0;f=n;while(1){if((c[f>>2]|0)==(m|0))c[f>>2]=o;g=g+1|0;if((g|0)>=(q|0)){m=o;break}else f=f+4|0}}else m=o}else{b[e>>1]=m;if((m|0)<(o|0)&(q|0)>0){g=0;f=n;while(1){if((c[f>>2]|0)==(o|0))c[f>>2]=m;g=g+1|0;if((g|0)>=(q|0))break;else f=f+4|0}}}m=(m<<16>>16)*7|0;p=k+1310736+(m+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=k+1310736+(m+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;m=k+1310736+(m+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+y;m=q}while(0);s=s+1|0;g=r+4|0;e=e+2|0;l=l+1|0;if((s|0)>=(z|0))break;else{r=g;q=m}}}y=y+1|0;if((y|0)>=(A|0)){o=m;C=52;break a}else{l=l+2|0;g=g+t|0;e=e+4|0}}Me(3,3904,B);l=-1}else{o=0;C=52}while(0);if((C|0)==52){e=k+12|0;if((o|0)<1)m=1;else{g=1;m=1;while(1){l=c[n>>2]|0;if((l|0)==(g|0)){l=m;m=m+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[n>>2]=l;if((g|0)<(o|0)){g=g+1|0;n=n+4|0}else break}}f=k+8|0;l=m+-1|0;c[f>>2]=l;if(l){ek(e|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((m|0)>1){l=0;do{C=l<<2;c[k+131084+(C<<2)>>2]=D;c[k+131084+((C|1)<<2)>>2]=0;c[k+131084+((C|2)<<2)>>2]=E;c[k+131084+((C|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[f>>2]|0))}if((o|0)>0){e=0;do{n=(c[k+1179664+(e<<2)>>2]|0)+-1|0;g=e*7|0;l=k+12+(n<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(g<<2)>>2]|0);l=n<<1;m=k+655376+(l<<3)|0;h[m>>3]=+h[m>>3]+ +(c[k+1310736+(g+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(g+2<<2)>>2]|0);n=n<<2;l=k+131084+(n<<2)|0;m=c[k+1310736+(g+3<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;l=k+131084+((n|1)<<2)|0;m=c[k+1310736+(g+4<<2)>>2]|0;if((c[l>>2]|0)<(m|0))c[l>>2]=m;l=k+131084+((n|2)<<2)|0;m=c[k+1310736+(g+5<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;m=k+131084+((n|3)<<2)|0;l=c[k+1310736+(g+6<<2)>>2]|0;if((c[m>>2]|0)<(l|0))c[m>>2]=l;e=e+1|0}while((e|0)<(o|0))}if((c[f>>2]|0)>0){l=0;do{D=k+12+(l<<2)|0;E=l<<1;C=k+655376+(E<<3)|0;h[C>>3]=+h[C>>3]/+(c[D>>2]|0);E=k+655376+((E|1)<<3)|0;h[E>>3]=+h[E>>3]/+(c[D>>2]|0);l=l+1|0}while((l|0)<(c[f>>2]|0));l=0}else l=0}else l=0}i=F;return l|0}function gd(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;E=i;i=i+16|0;C=E;p=c[k>>2]|0;B=g+-1|0;if((f|0)>0){l=0;m=p;n=p+(($(B,f)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(f|0))break;else{m=m+2|0;n=n+2|0}}}A=j*3|0;z=f+-1|0;if((g|0)>0){l=0;j=p;m=p+(z<<1)|0;while(1){b[m>>1]=0;b[j>>1]=0;l=l+1|0;if((l|0)>=(g|0))break;else{j=j+(f<<1)|0;m=m+(f<<1)|0}}}m=k+1179664|0;l=f+1|0;w=0-f|0;u=1-f|0;v=~f;a:do if((B|0)>1){x=(z|0)>1;o=(c[k+4>>2]|0)+l|0;y=1;n=e+(l*3|0)|0;e=p+(l<<1)|0;j=0;b:while(1){if(x){l=o;t=1;s=n;r=j;while(1){do if(((d[s+1>>0]|0)+(d[s>>0]|0)+(d[s+2>>0]|0)|0)>(A|0)){b[e>>1]=0;a[l>>0]=0;j=r}else{a[l>>0]=-1;j=b[e+(w<<1)>>1]|0;if(j<<16>>16>0){b[e>>1]=j;j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}o=b[e+(u<<1)>>1]|0;p=o<<16>>16;j=b[e+(v<<1)>>1]|0;q=j<<16>>16;n=j<<16>>16>0;if(o<<16>>16<=0){if(n){b[e>>1]=j;j=q*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+t;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+y;n=k+1310736+(j+-3<<2)|0;if((c[n>>2]|0)<(t|0))c[n>>2]=t;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}j=b[e+-2>>1]|0;if(j<<16>>16>0){b[e>>1]=j;j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;j=k+1310736+(j+-3<<2)|0;if((c[j>>2]|0)>=(t|0)){j=r;break}c[j>>2]=t;j=r;break}else{j=r+1|0;if((r|0)>32767)break b;b[e>>1]=j;c[k+1179664+(r<<2)>>2]=j<<16>>16;r=r*7|0;c[k+1310736+(r<<2)>>2]=1;c[k+1310736+(r+1<<2)>>2]=t;c[k+1310736+(r+2<<2)>>2]=y;c[k+1310736+(r+3<<2)>>2]=t;c[k+1310736+(r+4<<2)>>2]=t;c[k+1310736+(r+5<<2)>>2]=y;c[k+1310736+(r+6<<2)>>2]=y;break}}if(n){j=c[k+1179664+(p+-1<<2)>>2]|0;p=c[k+1179664+(q+-1<<2)>>2]|0;if((j|0)>(p|0)){b[e>>1]=p;if((r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(j|0))c[o>>2]=p;n=n+1|0;if((n|0)>=(r|0)){j=p;break}else o=o+4|0}}else j=p}else{b[e>>1]=j;if((j|0)<(p|0)&(r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(p|0))c[o>>2]=j;n=n+1|0;if((n|0)>=(r|0))break;else o=o+4|0}}}j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}n=b[e+-2>>1]|0;if(n<<16>>16<=0){b[e>>1]=o;j=p*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+t;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+y;n=k+1310736+(j+-4<<2)|0;if((c[n>>2]|0)>(t|0))c[n>>2]=t;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}j=c[k+1179664+(p+-1<<2)>>2]|0;p=c[k+1179664+((n<<16>>16)+-1<<2)>>2]|0;if((j|0)>(p|0)){b[e>>1]=p;if((r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(j|0))c[o>>2]=p;n=n+1|0;if((n|0)>=(r|0)){j=p;break}else o=o+4|0}}else j=p}else{b[e>>1]=j;if((j|0)<(p|0)&(r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(p|0))c[o>>2]=j;n=n+1|0;if((n|0)>=(r|0))break;else o=o+4|0}}}j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;j=k+1310736+(j+-5<<2)|0;c[j>>2]=(c[j>>2]|0)+y;j=r}while(0);t=t+1|0;n=s+3|0;e=e+2|0;l=l+1|0;if((t|0)>=(z|0))break;else{s=n;r=j}}}else l=o;y=y+1|0;if((y|0)>=(B|0)){p=j;D=52;break a}else{o=l+2|0;n=n+6|0;e=e+4|0}}Me(3,3904,C);l=-1}else{p=0;D=52}while(0);if((D|0)==52){e=k+12|0;if((p|0)<1)j=1;else{n=1;j=1;while(1){l=c[m>>2]|0;if((l|0)==(n|0)){l=j;j=j+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[m>>2]=l;if((n|0)<(p|0)){n=n+1|0;m=m+4|0}else break}}o=k+8|0;l=j+-1|0;c[o>>2]=l;if(l){ek(e|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((j|0)>1){l=0;do{D=l<<2;c[k+131084+(D<<2)>>2]=f;c[k+131084+((D|1)<<2)>>2]=0;c[k+131084+((D|2)<<2)>>2]=g;c[k+131084+((D|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[o>>2]|0))}if((p|0)>0){e=0;do{m=(c[k+1179664+(e<<2)>>2]|0)+-1|0;n=e*7|0;l=k+12+(m<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(n<<2)>>2]|0);l=m<<1;j=k+655376+(l<<3)|0;h[j>>3]=+h[j>>3]+ +(c[k+1310736+(n+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(n+2<<2)>>2]|0);m=m<<2;l=k+131084+(m<<2)|0;j=c[k+1310736+(n+3<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;l=k+131084+((m|1)<<2)|0;j=c[k+1310736+(n+4<<2)>>2]|0;if((c[l>>2]|0)<(j|0))c[l>>2]=j;l=k+131084+((m|2)<<2)|0;j=c[k+1310736+(n+5<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;j=k+131084+((m|3)<<2)|0;l=c[k+1310736+(n+6<<2)>>2]|0;if((c[j>>2]|0)<(l|0))c[j>>2]=l;e=e+1|0}while((e|0)<(p|0))}if((c[o>>2]|0)>0){l=0;do{f=k+12+(l<<2)|0;g=l<<1;D=k+655376+(g<<3)|0;h[D>>3]=+h[D>>3]/+(c[f>>2]|0);g=k+655376+((g|1)<<3)|0;h[g>>3]=+h[g>>3]/+(c[f>>2]|0);l=l+1|0}while((l|0)<(c[o>>2]|0));l=0}else l=0}else l=0}i=E;return l|0}function hd(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;E=i;i=i+16|0;C=E;p=c[k>>2]|0;B=g+-1|0;if((f|0)>0){l=0;m=p;n=p+(($(B,f)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(f|0))break;else{m=m+2|0;n=n+2|0}}}A=j*3|0;z=f+-1|0;if((g|0)>0){l=0;j=p;m=p+(z<<1)|0;while(1){b[m>>1]=0;b[j>>1]=0;l=l+1|0;if((l|0)>=(g|0))break;else{j=j+(f<<1)|0;m=m+(f<<1)|0}}}m=k+1179664|0;l=f+1|0;w=0-f|0;u=1-f|0;v=~f;a:do if((B|0)>1){x=(z|0)>1;o=(c[k+4>>2]|0)+l|0;y=1;n=e+(l<<1)|0;e=p+(l<<1)|0;j=0;b:while(1){if(x){l=o;t=1;s=n;r=j;while(1){p=d[s>>0]|0;q=d[s+1>>0]|0;do if(((p&248)+10+(p<<5&224)+(q>>>3&28)+(q<<3&248)|0)>(A|0)){b[e>>1]=0;a[l>>0]=0;j=r}else{a[l>>0]=-1;j=b[e+(w<<1)>>1]|0;if(j<<16>>16>0){b[e>>1]=j;j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}o=b[e+(u<<1)>>1]|0;p=o<<16>>16;j=b[e+(v<<1)>>1]|0;q=j<<16>>16;n=j<<16>>16>0;if(o<<16>>16<=0){if(n){b[e>>1]=j;j=q*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+t;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+y;n=k+1310736+(j+-3<<2)|0;if((c[n>>2]|0)<(t|0))c[n>>2]=t;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}j=b[e+-2>>1]|0;if(j<<16>>16>0){b[e>>1]=j;j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;j=k+1310736+(j+-3<<2)|0;if((c[j>>2]|0)>=(t|0)){j=r;break}c[j>>2]=t;j=r;break}else{j=r+1|0;if((r|0)>32767)break b;b[e>>1]=j;c[k+1179664+(r<<2)>>2]=j<<16>>16;r=r*7|0;c[k+1310736+(r<<2)>>2]=1;c[k+1310736+(r+1<<2)>>2]=t;c[k+1310736+(r+2<<2)>>2]=y;c[k+1310736+(r+3<<2)>>2]=t;c[k+1310736+(r+4<<2)>>2]=t;c[k+1310736+(r+5<<2)>>2]=y;c[k+1310736+(r+6<<2)>>2]=y;break}}if(n){j=c[k+1179664+(p+-1<<2)>>2]|0;p=c[k+1179664+(q+-1<<2)>>2]|0;if((j|0)>(p|0)){b[e>>1]=p;if((r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(j|0))c[o>>2]=p;n=n+1|0;if((n|0)>=(r|0)){j=p;break}else o=o+4|0}}else j=p}else{b[e>>1]=j;if((j|0)<(p|0)&(r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(p|0))c[o>>2]=j;n=n+1|0;if((n|0)>=(r|0))break;else o=o+4|0}}}j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}n=b[e+-2>>1]|0;if(n<<16>>16<=0){b[e>>1]=o;j=p*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+t;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+y;n=k+1310736+(j+-4<<2)|0;if((c[n>>2]|0)>(t|0))c[n>>2]=t;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}j=c[k+1179664+(p+-1<<2)>>2]|0;p=c[k+1179664+((n<<16>>16)+-1<<2)>>2]|0;if((j|0)>(p|0)){b[e>>1]=p;if((r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(j|0))c[o>>2]=p;n=n+1|0;if((n|0)>=(r|0)){j=p;break}else o=o+4|0}}else j=p}else{b[e>>1]=j;if((j|0)<(p|0)&(r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(p|0))c[o>>2]=j;n=n+1|0;if((n|0)>=(r|0))break;else o=o+4|0}}}j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;j=k+1310736+(j+-5<<2)|0;c[j>>2]=(c[j>>2]|0)+y;j=r}while(0);t=t+1|0;n=s+2|0;e=e+2|0;l=l+1|0;if((t|0)>=(z|0))break;else{s=n;r=j}}}else l=o;y=y+1|0;if((y|0)>=(B|0)){p=j;D=52;break a}else{o=l+2|0;n=n+4|0;e=e+4|0}}Me(3,3904,C);l=-1}else{p=0;D=52}while(0);if((D|0)==52){e=k+12|0;if((p|0)<1)j=1;else{n=1;j=1;while(1){l=c[m>>2]|0;if((l|0)==(n|0)){l=j;j=j+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[m>>2]=l;if((n|0)<(p|0)){n=n+1|0;m=m+4|0}else break}}o=k+8|0;l=j+-1|0;c[o>>2]=l;if(l){ek(e|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((j|0)>1){l=0;do{D=l<<2;c[k+131084+(D<<2)>>2]=f;c[k+131084+((D|1)<<2)>>2]=0;c[k+131084+((D|2)<<2)>>2]=g;c[k+131084+((D|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[o>>2]|0))}if((p|0)>0){e=0;do{m=(c[k+1179664+(e<<2)>>2]|0)+-1|0;n=e*7|0;l=k+12+(m<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(n<<2)>>2]|0);l=m<<1;j=k+655376+(l<<3)|0;h[j>>3]=+h[j>>3]+ +(c[k+1310736+(n+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(n+2<<2)>>2]|0);m=m<<2;l=k+131084+(m<<2)|0;j=c[k+1310736+(n+3<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;l=k+131084+((m|1)<<2)|0;j=c[k+1310736+(n+4<<2)>>2]|0;if((c[l>>2]|0)<(j|0))c[l>>2]=j;l=k+131084+((m|2)<<2)|0;j=c[k+1310736+(n+5<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;j=k+131084+((m|3)<<2)|0;l=c[k+1310736+(n+6<<2)>>2]|0;if((c[j>>2]|0)<(l|0))c[j>>2]=l;e=e+1|0}while((e|0)<(p|0))}if((c[o>>2]|0)>0){l=0;do{f=k+12+(l<<2)|0;g=l<<1;D=k+655376+(g<<3)|0;h[D>>3]=+h[D>>3]/+(c[f>>2]|0);g=k+655376+((g|1)<<3)|0;h[g>>3]=+h[g>>3]/+(c[f>>2]|0);l=l+1|0}while((l|0)<(c[o>>2]|0));l=0}else l=0}else l=0}i=E;return l|0}function id(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;E=i;i=i+16|0;C=E;p=c[k>>2]|0;B=g+-1|0;if((f|0)>0){l=0;m=p;n=p+(($(B,f)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(f|0))break;else{m=m+2|0;n=n+2|0}}}A=j*3|0;z=f+-1|0;if((g|0)>0){l=0;j=p;m=p+(z<<1)|0;while(1){b[m>>1]=0;b[j>>1]=0;l=l+1|0;if((l|0)>=(g|0))break;else{j=j+(f<<1)|0;m=m+(f<<1)|0}}}m=k+1179664|0;l=f+1|0;w=0-f|0;u=1-f|0;v=~f;a:do if((B|0)>1){x=(z|0)>1;o=(c[k+4>>2]|0)+l|0;y=1;n=e+(l<<2)|0;e=p+(l<<1)|0;j=0;b:while(1){if(x){l=o;t=1;s=n;r=j;while(1){do if(((d[s+1>>0]|0)+(d[s>>0]|0)+(d[s+2>>0]|0)|0)>(A|0)){b[e>>1]=0;a[l>>0]=0;j=r}else{a[l>>0]=-1;j=b[e+(w<<1)>>1]|0;if(j<<16>>16>0){b[e>>1]=j;j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}o=b[e+(u<<1)>>1]|0;p=o<<16>>16;j=b[e+(v<<1)>>1]|0;q=j<<16>>16;n=j<<16>>16>0;if(o<<16>>16<=0){if(n){b[e>>1]=j;j=q*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+t;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+y;n=k+1310736+(j+-3<<2)|0;if((c[n>>2]|0)<(t|0))c[n>>2]=t;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}j=b[e+-2>>1]|0;if(j<<16>>16>0){b[e>>1]=j;j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;j=k+1310736+(j+-3<<2)|0;if((c[j>>2]|0)>=(t|0)){j=r;break}c[j>>2]=t;j=r;break}else{j=r+1|0;if((r|0)>32767)break b;b[e>>1]=j;c[k+1179664+(r<<2)>>2]=j<<16>>16;r=r*7|0;c[k+1310736+(r<<2)>>2]=1;c[k+1310736+(r+1<<2)>>2]=t;c[k+1310736+(r+2<<2)>>2]=y;c[k+1310736+(r+3<<2)>>2]=t;c[k+1310736+(r+4<<2)>>2]=t;c[k+1310736+(r+5<<2)>>2]=y;c[k+1310736+(r+6<<2)>>2]=y;break}}if(n){j=c[k+1179664+(p+-1<<2)>>2]|0;p=c[k+1179664+(q+-1<<2)>>2]|0;if((j|0)>(p|0)){b[e>>1]=p;if((r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(j|0))c[o>>2]=p;n=n+1|0;if((n|0)>=(r|0)){j=p;break}else o=o+4|0}}else j=p}else{b[e>>1]=j;if((j|0)<(p|0)&(r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(p|0))c[o>>2]=j;n=n+1|0;if((n|0)>=(r|0))break;else o=o+4|0}}}j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}n=b[e+-2>>1]|0;if(n<<16>>16<=0){b[e>>1]=o;j=p*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+t;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+y;n=k+1310736+(j+-4<<2)|0;if((c[n>>2]|0)>(t|0))c[n>>2]=t;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}j=c[k+1179664+(p+-1<<2)>>2]|0;p=c[k+1179664+((n<<16>>16)+-1<<2)>>2]|0;if((j|0)>(p|0)){b[e>>1]=p;if((r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(j|0))c[o>>2]=p;n=n+1|0;if((n|0)>=(r|0)){j=p;break}else o=o+4|0}}else j=p}else{b[e>>1]=j;if((j|0)<(p|0)&(r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(p|0))c[o>>2]=j;n=n+1|0;if((n|0)>=(r|0))break;else o=o+4|0}}}j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;j=k+1310736+(j+-5<<2)|0;c[j>>2]=(c[j>>2]|0)+y;j=r}while(0);t=t+1|0;n=s+4|0;e=e+2|0;l=l+1|0;if((t|0)>=(z|0))break;else{s=n;r=j}}}else l=o;y=y+1|0;if((y|0)>=(B|0)){p=j;D=52;break a}else{o=l+2|0;n=n+8|0;e=e+4|0}}Me(3,3904,C);l=-1}else{p=0;D=52}while(0);if((D|0)==52){e=k+12|0;if((p|0)<1)j=1;else{n=1;j=1;while(1){l=c[m>>2]|0;if((l|0)==(n|0)){l=j;j=j+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[m>>2]=l;if((n|0)<(p|0)){n=n+1|0;m=m+4|0}else break}}o=k+8|0;l=j+-1|0;c[o>>2]=l;if(l){ek(e|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((j|0)>1){l=0;do{D=l<<2;c[k+131084+(D<<2)>>2]=f;c[k+131084+((D|1)<<2)>>2]=0;c[k+131084+((D|2)<<2)>>2]=g;c[k+131084+((D|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[o>>2]|0))}if((p|0)>0){e=0;do{m=(c[k+1179664+(e<<2)>>2]|0)+-1|0;n=e*7|0;l=k+12+(m<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(n<<2)>>2]|0);l=m<<1;j=k+655376+(l<<3)|0;h[j>>3]=+h[j>>3]+ +(c[k+1310736+(n+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(n+2<<2)>>2]|0);m=m<<2;l=k+131084+(m<<2)|0;j=c[k+1310736+(n+3<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;l=k+131084+((m|1)<<2)|0;j=c[k+1310736+(n+4<<2)>>2]|0;if((c[l>>2]|0)<(j|0))c[l>>2]=j;l=k+131084+((m|2)<<2)|0;j=c[k+1310736+(n+5<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;j=k+131084+((m|3)<<2)|0;l=c[k+1310736+(n+6<<2)>>2]|0;if((c[j>>2]|0)<(l|0))c[j>>2]=l;e=e+1|0}while((e|0)<(p|0))}if((c[o>>2]|0)>0){l=0;do{f=k+12+(l<<2)|0;g=l<<1;D=k+655376+(g<<3)|0;h[D>>3]=+h[D>>3]/+(c[f>>2]|0);g=k+655376+((g|1)<<3)|0;h[g>>3]=+h[g>>3]/+(c[f>>2]|0);l=l+1|0}while((l|0)<(c[o>>2]|0));l=0}else l=0}else l=0}i=E;return l|0}function jd(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;E=i;i=i+16|0;C=E;p=c[k>>2]|0;B=g+-1|0;if((f|0)>0){l=0;m=p;n=p+(($(B,f)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(f|0))break;else{m=m+2|0;n=n+2|0}}}A=j*3|0;z=f+-1|0;if((g|0)>0){l=0;j=p;m=p+(z<<1)|0;while(1){b[m>>1]=0;b[j>>1]=0;l=l+1|0;if((l|0)>=(g|0))break;else{j=j+(f<<1)|0;m=m+(f<<1)|0}}}m=k+1179664|0;l=f+1|0;w=0-f|0;u=1-f|0;v=~f;a:do if((B|0)>1){x=(z|0)>1;o=(c[k+4>>2]|0)+l|0;y=1;n=e+(l<<1)|0;e=p+(l<<1)|0;j=0;b:while(1){if(x){l=o;t=1;s=n;r=j;while(1){q=d[s>>0]|0;do if(((q&240)+24+(q<<4&240)+((d[s+1>>0]|0)&240)|0)>(A|0)){b[e>>1]=0;a[l>>0]=0;j=r}else{a[l>>0]=-1;j=b[e+(w<<1)>>1]|0;if(j<<16>>16>0){b[e>>1]=j;j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}o=b[e+(u<<1)>>1]|0;p=o<<16>>16;j=b[e+(v<<1)>>1]|0;q=j<<16>>16;n=j<<16>>16>0;if(o<<16>>16<=0){if(n){b[e>>1]=j;j=q*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+t;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+y;n=k+1310736+(j+-3<<2)|0;if((c[n>>2]|0)<(t|0))c[n>>2]=t;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}j=b[e+-2>>1]|0;if(j<<16>>16>0){b[e>>1]=j;j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;j=k+1310736+(j+-3<<2)|0;if((c[j>>2]|0)>=(t|0)){j=r;break}c[j>>2]=t;j=r;break}else{j=r+1|0;if((r|0)>32767)break b;b[e>>1]=j;c[k+1179664+(r<<2)>>2]=j<<16>>16;r=r*7|0;c[k+1310736+(r<<2)>>2]=1;c[k+1310736+(r+1<<2)>>2]=t;c[k+1310736+(r+2<<2)>>2]=y;c[k+1310736+(r+3<<2)>>2]=t;c[k+1310736+(r+4<<2)>>2]=t;c[k+1310736+(r+5<<2)>>2]=y;c[k+1310736+(r+6<<2)>>2]=y;break}}if(n){j=c[k+1179664+(p+-1<<2)>>2]|0;p=c[k+1179664+(q+-1<<2)>>2]|0;if((j|0)>(p|0)){b[e>>1]=p;if((r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(j|0))c[o>>2]=p;n=n+1|0;if((n|0)>=(r|0)){j=p;break}else o=o+4|0}}else j=p}else{b[e>>1]=j;if((j|0)<(p|0)&(r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(p|0))c[o>>2]=j;n=n+1|0;if((n|0)>=(r|0))break;else o=o+4|0}}}j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}n=b[e+-2>>1]|0;if(n<<16>>16<=0){b[e>>1]=o;j=p*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+t;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+y;n=k+1310736+(j+-4<<2)|0;if((c[n>>2]|0)>(t|0))c[n>>2]=t;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}j=c[k+1179664+(p+-1<<2)>>2]|0;p=c[k+1179664+((n<<16>>16)+-1<<2)>>2]|0;if((j|0)>(p|0)){b[e>>1]=p;if((r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(j|0))c[o>>2]=p;n=n+1|0;if((n|0)>=(r|0)){j=p;break}else o=o+4|0}}else j=p}else{b[e>>1]=j;if((j|0)<(p|0)&(r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(p|0))c[o>>2]=j;n=n+1|0;if((n|0)>=(r|0))break;else o=o+4|0}}}j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;j=k+1310736+(j+-5<<2)|0;c[j>>2]=(c[j>>2]|0)+y;j=r}while(0);t=t+1|0;n=s+2|0;e=e+2|0;l=l+1|0;if((t|0)>=(z|0))break;else{s=n;r=j}}}else l=o;y=y+1|0;if((y|0)>=(B|0)){p=j;D=52;break a}else{o=l+2|0;n=n+4|0;e=e+4|0}}Me(3,3904,C);l=-1}else{p=0;D=52}while(0);if((D|0)==52){e=k+12|0;if((p|0)<1)j=1;else{n=1;j=1;while(1){l=c[m>>2]|0;if((l|0)==(n|0)){l=j;j=j+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[m>>2]=l;if((n|0)<(p|0)){n=n+1|0;m=m+4|0}else break}}o=k+8|0;l=j+-1|0;c[o>>2]=l;if(l){ek(e|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((j|0)>1){l=0;do{D=l<<2;c[k+131084+(D<<2)>>2]=f;c[k+131084+((D|1)<<2)>>2]=0;c[k+131084+((D|2)<<2)>>2]=g;c[k+131084+((D|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[o>>2]|0))}if((p|0)>0){e=0;do{m=(c[k+1179664+(e<<2)>>2]|0)+-1|0;n=e*7|0;l=k+12+(m<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(n<<2)>>2]|0);l=m<<1;j=k+655376+(l<<3)|0;h[j>>3]=+h[j>>3]+ +(c[k+1310736+(n+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(n+2<<2)>>2]|0);m=m<<2;l=k+131084+(m<<2)|0;j=c[k+1310736+(n+3<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;l=k+131084+((m|1)<<2)|0;j=c[k+1310736+(n+4<<2)>>2]|0;if((c[l>>2]|0)<(j|0))c[l>>2]=j;l=k+131084+((m|2)<<2)|0;j=c[k+1310736+(n+5<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;j=k+131084+((m|3)<<2)|0;l=c[k+1310736+(n+6<<2)>>2]|0;if((c[j>>2]|0)<(l|0))c[j>>2]=l;e=e+1|0}while((e|0)<(p|0))}if((c[o>>2]|0)>0){l=0;do{f=k+12+(l<<2)|0;g=l<<1;D=k+655376+(g<<3)|0;h[D>>3]=+h[D>>3]/+(c[f>>2]|0);g=k+655376+((g|1)<<3)|0;h[g>>3]=+h[g>>3]/+(c[f>>2]|0);l=l+1|0}while((l|0)<(c[o>>2]|0));l=0}else l=0}else l=0}i=E;return l|0}function kd(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;E=i;i=i+16|0;C=E;p=c[k>>2]|0;B=g+-1|0;if((f|0)>0){l=0;m=p;n=p+(($(B,f)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(f|0))break;else{m=m+2|0;n=n+2|0}}}A=j*3|0;z=f+-1|0;if((g|0)>0){l=0;j=p;m=p+(z<<1)|0;while(1){b[m>>1]=0;b[j>>1]=0;l=l+1|0;if((l|0)>=(g|0))break;else{j=j+(f<<1)|0;m=m+(f<<1)|0}}}m=k+1179664|0;l=f+1|0;w=0-f|0;u=1-f|0;v=~f;a:do if((B|0)>1){x=(z|0)>1;o=(c[k+4>>2]|0)+l|0;y=1;n=e+(l<<1)|0;e=p+(l<<1)|0;j=0;b:while(1){if(x){l=o;t=1;s=n;r=j;while(1){p=d[s>>0]|0;q=d[s+1>>0]|0;do if(((p&248)+12+(p<<5&224)+(q>>>3&24)+(q<<2&248)|0)>(A|0)){b[e>>1]=0;a[l>>0]=0;j=r}else{a[l>>0]=-1;j=b[e+(w<<1)>>1]|0;if(j<<16>>16>0){b[e>>1]=j;j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}o=b[e+(u<<1)>>1]|0;p=o<<16>>16;j=b[e+(v<<1)>>1]|0;q=j<<16>>16;n=j<<16>>16>0;if(o<<16>>16<=0){if(n){b[e>>1]=j;j=q*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+t;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+y;n=k+1310736+(j+-3<<2)|0;if((c[n>>2]|0)<(t|0))c[n>>2]=t;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}j=b[e+-2>>1]|0;if(j<<16>>16>0){b[e>>1]=j;j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;j=k+1310736+(j+-3<<2)|0;if((c[j>>2]|0)>=(t|0)){j=r;break}c[j>>2]=t;j=r;break}else{j=r+1|0;if((r|0)>32767)break b;b[e>>1]=j;c[k+1179664+(r<<2)>>2]=j<<16>>16;r=r*7|0;c[k+1310736+(r<<2)>>2]=1;c[k+1310736+(r+1<<2)>>2]=t;c[k+1310736+(r+2<<2)>>2]=y;c[k+1310736+(r+3<<2)>>2]=t;c[k+1310736+(r+4<<2)>>2]=t;c[k+1310736+(r+5<<2)>>2]=y;c[k+1310736+(r+6<<2)>>2]=y;break}}if(n){j=c[k+1179664+(p+-1<<2)>>2]|0;p=c[k+1179664+(q+-1<<2)>>2]|0;if((j|0)>(p|0)){b[e>>1]=p;if((r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(j|0))c[o>>2]=p;n=n+1|0;if((n|0)>=(r|0)){j=p;break}else o=o+4|0}}else j=p}else{b[e>>1]=j;if((j|0)<(p|0)&(r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(p|0))c[o>>2]=j;n=n+1|0;if((n|0)>=(r|0))break;else o=o+4|0}}}j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}n=b[e+-2>>1]|0;if(n<<16>>16<=0){b[e>>1]=o;j=p*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+t;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+y;n=k+1310736+(j+-4<<2)|0;if((c[n>>2]|0)>(t|0))c[n>>2]=t;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}j=c[k+1179664+(p+-1<<2)>>2]|0;p=c[k+1179664+((n<<16>>16)+-1<<2)>>2]|0;if((j|0)>(p|0)){b[e>>1]=p;if((r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(j|0))c[o>>2]=p;n=n+1|0;if((n|0)>=(r|0)){j=p;break}else o=o+4|0}}else j=p}else{b[e>>1]=j;if((j|0)<(p|0)&(r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(p|0))c[o>>2]=j;n=n+1|0;if((n|0)>=(r|0))break;else o=o+4|0}}}j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;j=k+1310736+(j+-5<<2)|0;c[j>>2]=(c[j>>2]|0)+y;j=r}while(0);t=t+1|0;n=s+2|0;e=e+2|0;l=l+1|0;if((t|0)>=(z|0))break;else{s=n;r=j}}}else l=o;y=y+1|0;if((y|0)>=(B|0)){p=j;D=52;break a}else{o=l+2|0;n=n+4|0;e=e+4|0}}Me(3,3904,C);l=-1}else{p=0;D=52}while(0);if((D|0)==52){e=k+12|0;if((p|0)<1)j=1;else{n=1;j=1;while(1){l=c[m>>2]|0;if((l|0)==(n|0)){l=j;j=j+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[m>>2]=l;if((n|0)<(p|0)){n=n+1|0;m=m+4|0}else break}}o=k+8|0;l=j+-1|0;c[o>>2]=l;if(l){ek(e|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((j|0)>1){l=0;do{D=l<<2;c[k+131084+(D<<2)>>2]=f;c[k+131084+((D|1)<<2)>>2]=0;c[k+131084+((D|2)<<2)>>2]=g;c[k+131084+((D|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[o>>2]|0))}if((p|0)>0){e=0;do{m=(c[k+1179664+(e<<2)>>2]|0)+-1|0;n=e*7|0;l=k+12+(m<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(n<<2)>>2]|0);l=m<<1;j=k+655376+(l<<3)|0;h[j>>3]=+h[j>>3]+ +(c[k+1310736+(n+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(n+2<<2)>>2]|0);m=m<<2;l=k+131084+(m<<2)|0;j=c[k+1310736+(n+3<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;l=k+131084+((m|1)<<2)|0;j=c[k+1310736+(n+4<<2)>>2]|0;if((c[l>>2]|0)<(j|0))c[l>>2]=j;l=k+131084+((m|2)<<2)|0;j=c[k+1310736+(n+5<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;j=k+131084+((m|3)<<2)|0;l=c[k+1310736+(n+6<<2)>>2]|0;if((c[j>>2]|0)<(l|0))c[j>>2]=l;e=e+1|0}while((e|0)<(p|0))}if((c[o>>2]|0)>0){l=0;do{f=k+12+(l<<2)|0;g=l<<1;D=k+655376+(g<<3)|0;h[D>>3]=+h[D>>3]/+(c[f>>2]|0);g=k+655376+((g|1)<<3)|0;h[g>>3]=+h[g>>3]/+(c[f>>2]|0);l=l+1|0}while((l|0)<(c[o>>2]|0));l=0}else l=0}else l=0}i=E;return l|0}function ld(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;E=i;i=i+16|0;C=E;p=c[k>>2]|0;B=g+-1|0;if((f|0)>0){l=0;m=p;n=p+(($(B,f)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(f|0))break;else{m=m+2|0;n=n+2|0}}}A=j*3|0;z=f+-1|0;if((g|0)>0){l=0;j=p;m=p+(z<<1)|0;while(1){b[m>>1]=0;b[j>>1]=0;l=l+1|0;if((l|0)>=(g|0))break;else{j=j+(f<<1)|0;m=m+(f<<1)|0}}}m=k+1179664|0;l=f+1|0;w=0-f|0;u=1-f|0;v=~f;a:do if((B|0)>1){x=(z|0)>1;o=(c[k+4>>2]|0)+l|0;y=1;n=e+(l<<2)|0;e=p+(l<<1)|0;j=0;b:while(1){if(x){l=o;t=1;s=n;r=j;while(1){do if(((d[s+2>>0]|0)+(d[s+1>>0]|0)+(d[s+3>>0]|0)|0)>(A|0)){b[e>>1]=0;a[l>>0]=0;j=r}else{a[l>>0]=-1;j=b[e+(w<<1)>>1]|0;if(j<<16>>16>0){b[e>>1]=j;j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}o=b[e+(u<<1)>>1]|0;p=o<<16>>16;j=b[e+(v<<1)>>1]|0;q=j<<16>>16;n=j<<16>>16>0;if(o<<16>>16<=0){if(n){b[e>>1]=j;j=q*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+t;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+y;n=k+1310736+(j+-3<<2)|0;if((c[n>>2]|0)<(t|0))c[n>>2]=t;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}j=b[e+-2>>1]|0;if(j<<16>>16>0){b[e>>1]=j;j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;j=k+1310736+(j+-3<<2)|0;if((c[j>>2]|0)>=(t|0)){j=r;break}c[j>>2]=t;j=r;break}else{j=r+1|0;if((r|0)>32767)break b;b[e>>1]=j;c[k+1179664+(r<<2)>>2]=j<<16>>16;r=r*7|0;c[k+1310736+(r<<2)>>2]=1;c[k+1310736+(r+1<<2)>>2]=t;c[k+1310736+(r+2<<2)>>2]=y;c[k+1310736+(r+3<<2)>>2]=t;c[k+1310736+(r+4<<2)>>2]=t;c[k+1310736+(r+5<<2)>>2]=y;c[k+1310736+(r+6<<2)>>2]=y;break}}if(n){j=c[k+1179664+(p+-1<<2)>>2]|0;p=c[k+1179664+(q+-1<<2)>>2]|0;if((j|0)>(p|0)){b[e>>1]=p;if((r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(j|0))c[o>>2]=p;n=n+1|0;if((n|0)>=(r|0)){j=p;break}else o=o+4|0}}else j=p}else{b[e>>1]=j;if((j|0)<(p|0)&(r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(p|0))c[o>>2]=j;n=n+1|0;if((n|0)>=(r|0))break;else o=o+4|0}}}j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}n=b[e+-2>>1]|0;if(n<<16>>16<=0){b[e>>1]=o;j=p*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+t;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+y;n=k+1310736+(j+-4<<2)|0;if((c[n>>2]|0)>(t|0))c[n>>2]=t;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}j=c[k+1179664+(p+-1<<2)>>2]|0;p=c[k+1179664+((n<<16>>16)+-1<<2)>>2]|0;if((j|0)>(p|0)){b[e>>1]=p;if((r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(j|0))c[o>>2]=p;n=n+1|0;if((n|0)>=(r|0)){j=p;break}else o=o+4|0}}else j=p}else{b[e>>1]=j;if((j|0)<(p|0)&(r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(p|0))c[o>>2]=j;n=n+1|0;if((n|0)>=(r|0))break;else o=o+4|0}}}j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;j=k+1310736+(j+-5<<2)|0;c[j>>2]=(c[j>>2]|0)+y;j=r}while(0);t=t+1|0;n=s+4|0;e=e+2|0;l=l+1|0;if((t|0)>=(z|0))break;else{s=n;r=j}}}else l=o;y=y+1|0;if((y|0)>=(B|0)){p=j;D=52;break a}else{o=l+2|0;n=n+8|0;e=e+4|0}}Me(3,3904,C);l=-1}else{p=0;D=52}while(0);if((D|0)==52){e=k+12|0;if((p|0)<1)j=1;else{n=1;j=1;while(1){l=c[m>>2]|0;if((l|0)==(n|0)){l=j;j=j+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[m>>2]=l;if((n|0)<(p|0)){n=n+1|0;m=m+4|0}else break}}o=k+8|0;l=j+-1|0;c[o>>2]=l;if(l){ek(e|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((j|0)>1){l=0;do{D=l<<2;c[k+131084+(D<<2)>>2]=f;c[k+131084+((D|1)<<2)>>2]=0;c[k+131084+((D|2)<<2)>>2]=g;c[k+131084+((D|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[o>>2]|0))}if((p|0)>0){e=0;do{m=(c[k+1179664+(e<<2)>>2]|0)+-1|0;n=e*7|0;l=k+12+(m<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(n<<2)>>2]|0);l=m<<1;j=k+655376+(l<<3)|0;h[j>>3]=+h[j>>3]+ +(c[k+1310736+(n+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(n+2<<2)>>2]|0);m=m<<2;l=k+131084+(m<<2)|0;j=c[k+1310736+(n+3<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;l=k+131084+((m|1)<<2)|0;j=c[k+1310736+(n+4<<2)>>2]|0;if((c[l>>2]|0)<(j|0))c[l>>2]=j;l=k+131084+((m|2)<<2)|0;j=c[k+1310736+(n+5<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;j=k+131084+((m|3)<<2)|0;l=c[k+1310736+(n+6<<2)>>2]|0;if((c[j>>2]|0)<(l|0))c[j>>2]=l;e=e+1|0}while((e|0)<(p|0))}if((c[o>>2]|0)>0){l=0;do{f=k+12+(l<<2)|0;g=l<<1;D=k+655376+(g<<3)|0;h[D>>3]=+h[D>>3]/+(c[f>>2]|0);g=k+655376+((g|1)<<3)|0;h[g>>3]=+h[g>>3]/+(c[f>>2]|0);l=l+1|0}while((l|0)<(c[o>>2]|0));l=0}else l=0}else l=0}i=E;return l|0}function md(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;E=i;i=i+16|0;C=E;o=c[k>>2]|0;B=g+-1|0;if((f|0)>0){l=0;m=o;n=o+(($(B,f)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(f|0))break;else{m=m+2|0;n=n+2|0}}}A=f+-1|0;if((g|0)>0){l=0;m=o;n=o+(A<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(g|0))break;else{m=m+(f<<1)|0;n=n+(f<<1)|0}}}n=k+1179664|0;l=f+1|0;x=0-f|0;v=1-f|0;w=~f;a:do if((B|0)>1){y=(A|0)>1;p=(c[k+4>>2]|0)+l|0;z=1;e=e+l|0;o=o+(l<<1)|0;m=0;b:while(1){if(y){l=p;u=1;t=e;s=m;while(1){do if((d[t>>0]|0|0)>(j|0)){b[o>>1]=0;a[l>>0]=0;m=s}else{a[l>>0]=-1;m=b[o+(x<<1)>>1]|0;if(m<<16>>16>0){b[o>>1]=m;m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}p=b[o+(v<<1)>>1]|0;q=p<<16>>16;m=b[o+(w<<1)>>1]|0;r=m<<16>>16;e=m<<16>>16>0;if(p<<16>>16<=0){if(e){b[o>>1]=m;m=r*7|0;e=k+1310736+(m+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=k+1310736+(m+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+u;e=k+1310736+(m+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+z;e=k+1310736+(m+-3<<2)|0;if((c[e>>2]|0)<(u|0))c[e>>2]=u;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}m=b[o+-2>>1]|0;if(m<<16>>16>0){b[o>>1]=m;m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;m=k+1310736+(m+-3<<2)|0;if((c[m>>2]|0)>=(u|0)){m=s;break}c[m>>2]=u;m=s;break}else{m=s+1|0;if((s|0)>32767)break b;b[o>>1]=m;c[k+1179664+(s<<2)>>2]=m<<16>>16;s=s*7|0;c[k+1310736+(s<<2)>>2]=1;c[k+1310736+(s+1<<2)>>2]=u;c[k+1310736+(s+2<<2)>>2]=z;c[k+1310736+(s+3<<2)>>2]=u;c[k+1310736+(s+4<<2)>>2]=u;c[k+1310736+(s+5<<2)>>2]=z;c[k+1310736+(s+6<<2)>>2]=z;break}}if(e){m=c[k+1179664+(q+-1<<2)>>2]|0;q=c[k+1179664+(r+-1<<2)>>2]|0;if((m|0)>(q|0)){b[o>>1]=q;if((s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(m|0))c[p>>2]=q;e=e+1|0;if((e|0)>=(s|0)){m=q;break}else p=p+4|0}}else m=q}else{b[o>>1]=m;if((m|0)<(q|0)&(s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(q|0))c[p>>2]=m;e=e+1|0;if((e|0)>=(s|0))break;else p=p+4|0}}}m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}e=b[o+-2>>1]|0;if(e<<16>>16<=0){b[o>>1]=p;m=q*7|0;e=k+1310736+(m+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=k+1310736+(m+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+u;e=k+1310736+(m+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+z;e=k+1310736+(m+-4<<2)|0;if((c[e>>2]|0)>(u|0))c[e>>2]=u;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}m=c[k+1179664+(q+-1<<2)>>2]|0;q=c[k+1179664+((e<<16>>16)+-1<<2)>>2]|0;if((m|0)>(q|0)){b[o>>1]=q;if((s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(m|0))c[p>>2]=q;e=e+1|0;if((e|0)>=(s|0)){m=q;break}else p=p+4|0}}else m=q}else{b[o>>1]=m;if((m|0)<(q|0)&(s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(q|0))c[p>>2]=m;e=e+1|0;if((e|0)>=(s|0))break;else p=p+4|0}}}m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;m=k+1310736+(m+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+z;m=s}while(0);u=u+1|0;e=t+1|0;o=o+2|0;l=l+1|0;if((u|0)>=(A|0))break;else{t=e;s=m}}}else l=p;z=z+1|0;if((z|0)>=(B|0)){q=m;D=52;break a}else{p=l+2|0;e=e+2|0;o=o+4|0}}Me(3,3904,C);l=-1}else{q=0;D=52}while(0);if((D|0)==52){o=k+12|0;if((q|0)<1)m=1;else{e=1;m=1;while(1){l=c[n>>2]|0;if((l|0)==(e|0)){l=m;m=m+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[n>>2]=l;if((e|0)<(q|0)){e=e+1|0;n=n+4|0}else break}}p=k+8|0;l=m+-1|0;c[p>>2]=l;if(l){ek(o|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((m|0)>1){l=0;do{D=l<<2;c[k+131084+(D<<2)>>2]=f;c[k+131084+((D|1)<<2)>>2]=0;c[k+131084+((D|2)<<2)>>2]=g;c[k+131084+((D|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[p>>2]|0))}if((q|0)>0){o=0;do{n=(c[k+1179664+(o<<2)>>2]|0)+-1|0;e=o*7|0;l=k+12+(n<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(e<<2)>>2]|0);l=n<<1;m=k+655376+(l<<3)|0;h[m>>3]=+h[m>>3]+ +(c[k+1310736+(e+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(e+2<<2)>>2]|0);n=n<<2;l=k+131084+(n<<2)|0;m=c[k+1310736+(e+3<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;l=k+131084+((n|1)<<2)|0;m=c[k+1310736+(e+4<<2)>>2]|0;if((c[l>>2]|0)<(m|0))c[l>>2]=m;l=k+131084+((n|2)<<2)|0;m=c[k+1310736+(e+5<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;m=k+131084+((n|3)<<2)|0;l=c[k+1310736+(e+6<<2)>>2]|0;if((c[m>>2]|0)<(l|0))c[m>>2]=l;o=o+1|0}while((o|0)<(q|0))}if((c[p>>2]|0)>0){l=0;do{f=k+12+(l<<2)|0;g=l<<1;D=k+655376+(g<<3)|0;h[D>>3]=+h[D>>3]/+(c[f>>2]|0);g=k+655376+((g|1)<<3)|0;h[g>>3]=+h[g>>3]/+(c[f>>2]|0);l=l+1|0}while((l|0)<(c[p>>2]|0));l=0}else l=0}else l=0}i=E;return l|0}function nd(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;E=i;i=i+16|0;C=E;o=c[k>>2]|0;B=g+-1|0;if((f|0)>0){l=0;m=o;n=o+(($(B,f)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(f|0))break;else{m=m+2|0;n=n+2|0}}}A=f+-1|0;if((g|0)>0){l=0;m=o;n=o+(A<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(g|0))break;else{m=m+(f<<1)|0;n=n+(f<<1)|0}}}n=k+1179664|0;l=f+1|0;x=0-f|0;v=1-f|0;w=~f;a:do if((B|0)>1){y=(A|0)>1;p=(c[k+4>>2]|0)+l|0;z=1;e=e+(l<<1)|0;o=o+(l<<1)|0;m=0;b:while(1){if(y){l=p;u=1;t=e;s=m;while(1){do if((d[t+1>>0]|0|0)>(j|0)){b[o>>1]=0;a[l>>0]=0;m=s}else{a[l>>0]=-1;m=b[o+(x<<1)>>1]|0;if(m<<16>>16>0){b[o>>1]=m;m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}p=b[o+(v<<1)>>1]|0;q=p<<16>>16;m=b[o+(w<<1)>>1]|0;r=m<<16>>16;e=m<<16>>16>0;if(p<<16>>16<=0){if(e){b[o>>1]=m;m=r*7|0;e=k+1310736+(m+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=k+1310736+(m+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+u;e=k+1310736+(m+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+z;e=k+1310736+(m+-3<<2)|0;if((c[e>>2]|0)<(u|0))c[e>>2]=u;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}m=b[o+-2>>1]|0;if(m<<16>>16>0){b[o>>1]=m;m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;m=k+1310736+(m+-3<<2)|0;if((c[m>>2]|0)>=(u|0)){m=s;break}c[m>>2]=u;m=s;break}else{m=s+1|0;if((s|0)>32767)break b;b[o>>1]=m;c[k+1179664+(s<<2)>>2]=m<<16>>16;s=s*7|0;c[k+1310736+(s<<2)>>2]=1;c[k+1310736+(s+1<<2)>>2]=u;c[k+1310736+(s+2<<2)>>2]=z;c[k+1310736+(s+3<<2)>>2]=u;c[k+1310736+(s+4<<2)>>2]=u;c[k+1310736+(s+5<<2)>>2]=z;c[k+1310736+(s+6<<2)>>2]=z;break}}if(e){m=c[k+1179664+(q+-1<<2)>>2]|0;q=c[k+1179664+(r+-1<<2)>>2]|0;if((m|0)>(q|0)){b[o>>1]=q;if((s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(m|0))c[p>>2]=q;e=e+1|0;if((e|0)>=(s|0)){m=q;break}else p=p+4|0}}else m=q}else{b[o>>1]=m;if((m|0)<(q|0)&(s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(q|0))c[p>>2]=m;e=e+1|0;if((e|0)>=(s|0))break;else p=p+4|0}}}m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}e=b[o+-2>>1]|0;if(e<<16>>16<=0){b[o>>1]=p;m=q*7|0;e=k+1310736+(m+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=k+1310736+(m+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+u;e=k+1310736+(m+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+z;e=k+1310736+(m+-4<<2)|0;if((c[e>>2]|0)>(u|0))c[e>>2]=u;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}m=c[k+1179664+(q+-1<<2)>>2]|0;q=c[k+1179664+((e<<16>>16)+-1<<2)>>2]|0;if((m|0)>(q|0)){b[o>>1]=q;if((s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(m|0))c[p>>2]=q;e=e+1|0;if((e|0)>=(s|0)){m=q;break}else p=p+4|0}}else m=q}else{b[o>>1]=m;if((m|0)<(q|0)&(s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(q|0))c[p>>2]=m;e=e+1|0;if((e|0)>=(s|0))break;else p=p+4|0}}}m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;m=k+1310736+(m+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+z;m=s}while(0);u=u+1|0;e=t+2|0;o=o+2|0;l=l+1|0;if((u|0)>=(A|0))break;else{t=e;s=m}}}else l=p;z=z+1|0;if((z|0)>=(B|0)){q=m;D=52;break a}else{p=l+2|0;e=e+4|0;o=o+4|0}}Me(3,3904,C);l=-1}else{q=0;D=52}while(0);if((D|0)==52){o=k+12|0;if((q|0)<1)m=1;else{e=1;m=1;while(1){l=c[n>>2]|0;if((l|0)==(e|0)){l=m;m=m+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[n>>2]=l;if((e|0)<(q|0)){e=e+1|0;n=n+4|0}else break}}p=k+8|0;l=m+-1|0;c[p>>2]=l;if(l){ek(o|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((m|0)>1){l=0;do{D=l<<2;c[k+131084+(D<<2)>>2]=f;c[k+131084+((D|1)<<2)>>2]=0;c[k+131084+((D|2)<<2)>>2]=g;c[k+131084+((D|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[p>>2]|0))}if((q|0)>0){o=0;do{n=(c[k+1179664+(o<<2)>>2]|0)+-1|0;e=o*7|0;l=k+12+(n<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(e<<2)>>2]|0);l=n<<1;m=k+655376+(l<<3)|0;h[m>>3]=+h[m>>3]+ +(c[k+1310736+(e+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(e+2<<2)>>2]|0);n=n<<2;l=k+131084+(n<<2)|0;m=c[k+1310736+(e+3<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;l=k+131084+((n|1)<<2)|0;m=c[k+1310736+(e+4<<2)>>2]|0;if((c[l>>2]|0)<(m|0))c[l>>2]=m;l=k+131084+((n|2)<<2)|0;m=c[k+1310736+(e+5<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;m=k+131084+((n|3)<<2)|0;l=c[k+1310736+(e+6<<2)>>2]|0;if((c[m>>2]|0)<(l|0))c[m>>2]=l;o=o+1|0}while((o|0)<(q|0))}if((c[p>>2]|0)>0){l=0;do{f=k+12+(l<<2)|0;g=l<<1;D=k+655376+(g<<3)|0;h[D>>3]=+h[D>>3]/+(c[f>>2]|0);g=k+655376+((g|1)<<3)|0;h[g>>3]=+h[g>>3]/+(c[f>>2]|0);l=l+1|0}while((l|0)<(c[p>>2]|0));l=0}else l=0}else l=0}i=E;return l|0}function od(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;E=i;i=i+16|0;C=E;o=c[k>>2]|0;B=g+-1|0;if((f|0)>0){l=0;m=o;n=o+(($(B,f)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(f|0))break;else{m=m+2|0;n=n+2|0}}}A=f+-1|0;if((g|0)>0){l=0;m=o;n=o+(A<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(g|0))break;else{m=m+(f<<1)|0;n=n+(f<<1)|0}}}n=k+1179664|0;l=f+1|0;x=0-f|0;v=1-f|0;w=~f;a:do if((B|0)>1){y=(A|0)>1;p=(c[k+4>>2]|0)+l|0;z=1;e=e+(l<<1)|0;o=o+(l<<1)|0;m=0;b:while(1){if(y){l=p;u=1;t=e;s=m;while(1){do if((d[t>>0]|0|0)>(j|0)){b[o>>1]=0;a[l>>0]=0;m=s}else{a[l>>0]=-1;m=b[o+(x<<1)>>1]|0;if(m<<16>>16>0){b[o>>1]=m;m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}p=b[o+(v<<1)>>1]|0;q=p<<16>>16;m=b[o+(w<<1)>>1]|0;r=m<<16>>16;e=m<<16>>16>0;if(p<<16>>16<=0){if(e){b[o>>1]=m;m=r*7|0;e=k+1310736+(m+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=k+1310736+(m+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+u;e=k+1310736+(m+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+z;e=k+1310736+(m+-3<<2)|0;if((c[e>>2]|0)<(u|0))c[e>>2]=u;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}m=b[o+-2>>1]|0;if(m<<16>>16>0){b[o>>1]=m;m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;m=k+1310736+(m+-3<<2)|0;if((c[m>>2]|0)>=(u|0)){m=s;break}c[m>>2]=u;m=s;break}else{m=s+1|0;if((s|0)>32767)break b;b[o>>1]=m;c[k+1179664+(s<<2)>>2]=m<<16>>16;s=s*7|0;c[k+1310736+(s<<2)>>2]=1;c[k+1310736+(s+1<<2)>>2]=u;c[k+1310736+(s+2<<2)>>2]=z;c[k+1310736+(s+3<<2)>>2]=u;c[k+1310736+(s+4<<2)>>2]=u;c[k+1310736+(s+5<<2)>>2]=z;c[k+1310736+(s+6<<2)>>2]=z;break}}if(e){m=c[k+1179664+(q+-1<<2)>>2]|0;q=c[k+1179664+(r+-1<<2)>>2]|0;if((m|0)>(q|0)){b[o>>1]=q;if((s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(m|0))c[p>>2]=q;e=e+1|0;if((e|0)>=(s|0)){m=q;break}else p=p+4|0}}else m=q}else{b[o>>1]=m;if((m|0)<(q|0)&(s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(q|0))c[p>>2]=m;e=e+1|0;if((e|0)>=(s|0))break;else p=p+4|0}}}m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}e=b[o+-2>>1]|0;if(e<<16>>16<=0){b[o>>1]=p;m=q*7|0;e=k+1310736+(m+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=k+1310736+(m+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+u;e=k+1310736+(m+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+z;e=k+1310736+(m+-4<<2)|0;if((c[e>>2]|0)>(u|0))c[e>>2]=u;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}m=c[k+1179664+(q+-1<<2)>>2]|0;q=c[k+1179664+((e<<16>>16)+-1<<2)>>2]|0;if((m|0)>(q|0)){b[o>>1]=q;if((s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(m|0))c[p>>2]=q;e=e+1|0;if((e|0)>=(s|0)){m=q;break}else p=p+4|0}}else m=q}else{b[o>>1]=m;if((m|0)<(q|0)&(s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(q|0))c[p>>2]=m;e=e+1|0;if((e|0)>=(s|0))break;else p=p+4|0}}}m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;m=k+1310736+(m+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+z;m=s}while(0);u=u+1|0;e=t+2|0;o=o+2|0;l=l+1|0;if((u|0)>=(A|0))break;else{t=e;s=m}}}else l=p;z=z+1|0;if((z|0)>=(B|0)){q=m;D=52;break a}else{p=l+2|0;e=e+4|0;o=o+4|0}}Me(3,3904,C);l=-1}else{q=0;D=52}while(0);if((D|0)==52){o=k+12|0;if((q|0)<1)m=1;else{e=1;m=1;while(1){l=c[n>>2]|0;if((l|0)==(e|0)){l=m;m=m+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[n>>2]=l;if((e|0)<(q|0)){e=e+1|0;n=n+4|0}else break}}p=k+8|0;l=m+-1|0;c[p>>2]=l;if(l){ek(o|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((m|0)>1){l=0;do{D=l<<2;c[k+131084+(D<<2)>>2]=f;c[k+131084+((D|1)<<2)>>2]=0;c[k+131084+((D|2)<<2)>>2]=g;c[k+131084+((D|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[p>>2]|0))}if((q|0)>0){o=0;do{n=(c[k+1179664+(o<<2)>>2]|0)+-1|0;e=o*7|0;l=k+12+(n<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(e<<2)>>2]|0);l=n<<1;m=k+655376+(l<<3)|0;h[m>>3]=+h[m>>3]+ +(c[k+1310736+(e+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(e+2<<2)>>2]|0);n=n<<2;l=k+131084+(n<<2)|0;m=c[k+1310736+(e+3<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;l=k+131084+((n|1)<<2)|0;m=c[k+1310736+(e+4<<2)>>2]|0;if((c[l>>2]|0)<(m|0))c[l>>2]=m;l=k+131084+((n|2)<<2)|0;m=c[k+1310736+(e+5<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;m=k+131084+((n|3)<<2)|0;l=c[k+1310736+(e+6<<2)>>2]|0;if((c[m>>2]|0)<(l|0))c[m>>2]=l;o=o+1|0}while((o|0)<(q|0))}if((c[p>>2]|0)>0){l=0;do{f=k+12+(l<<2)|0;g=l<<1;D=k+655376+(g<<3)|0;h[D>>3]=+h[D>>3]/+(c[f>>2]|0);g=k+655376+((g|1)<<3)|0;h[g>>3]=+h[g>>3]/+(c[f>>2]|0);l=l+1|0}while((l|0)<(c[p>>2]|0));l=0}else l=0}else l=0}i=E;return l|0}function pd(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;E=i;i=i+16|0;C=E;o=c[k>>2]|0;B=g+-1|0;if((f|0)>0){l=0;m=o;n=o+(($(B,f)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(f|0))break;else{m=m+2|0;n=n+2|0}}}A=f+-1|0;if((g|0)>0){l=0;m=o;n=o+(A<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(g|0))break;else{m=m+(f<<1)|0;n=n+(f<<1)|0}}}n=k+1179664|0;m=f+1|0;x=0-f|0;v=1-f|0;w=~f;a:do if((B|0)>1){y=(A|0)>1;l=(c[k+4>>2]|0)+m|0;z=1;e=e+m|0;o=o+(m<<1)|0;j=j+m|0;m=0;b:while(1){if(y){u=1;t=e;s=m;while(1){do if((d[t>>0]|0)>(d[j>>0]|0)){b[o>>1]=0;a[l>>0]=0;m=s}else{a[l>>0]=-1;m=b[o+(x<<1)>>1]|0;if(m<<16>>16>0){b[o>>1]=m;m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}p=b[o+(v<<1)>>1]|0;q=p<<16>>16;m=b[o+(w<<1)>>1]|0;r=m<<16>>16;e=m<<16>>16>0;if(p<<16>>16<=0){if(e){b[o>>1]=m;m=r*7|0;e=k+1310736+(m+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=k+1310736+(m+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+u;e=k+1310736+(m+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+z;e=k+1310736+(m+-3<<2)|0;if((c[e>>2]|0)<(u|0))c[e>>2]=u;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}m=b[o+-2>>1]|0;if(m<<16>>16>0){b[o>>1]=m;m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;m=k+1310736+(m+-3<<2)|0;if((c[m>>2]|0)>=(u|0)){m=s;break}c[m>>2]=u;m=s;break}else{m=s+1|0;if((s|0)>32767)break b;b[o>>1]=m;c[k+1179664+(s<<2)>>2]=m<<16>>16;s=s*7|0;c[k+1310736+(s<<2)>>2]=1;c[k+1310736+(s+1<<2)>>2]=u;c[k+1310736+(s+2<<2)>>2]=z;c[k+1310736+(s+3<<2)>>2]=u;c[k+1310736+(s+4<<2)>>2]=u;c[k+1310736+(s+5<<2)>>2]=z;c[k+1310736+(s+6<<2)>>2]=z;break}}if(e){m=c[k+1179664+(q+-1<<2)>>2]|0;q=c[k+1179664+(r+-1<<2)>>2]|0;if((m|0)>(q|0)){b[o>>1]=q;if((s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(m|0))c[p>>2]=q;e=e+1|0;if((e|0)>=(s|0)){m=q;break}else p=p+4|0}}else m=q}else{b[o>>1]=m;if((m|0)<(q|0)&(s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(q|0))c[p>>2]=m;e=e+1|0;if((e|0)>=(s|0))break;else p=p+4|0}}}m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}e=b[o+-2>>1]|0;if(e<<16>>16<=0){b[o>>1]=p;m=q*7|0;e=k+1310736+(m+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=k+1310736+(m+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+u;e=k+1310736+(m+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+z;e=k+1310736+(m+-4<<2)|0;if((c[e>>2]|0)>(u|0))c[e>>2]=u;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}m=c[k+1179664+(q+-1<<2)>>2]|0;q=c[k+1179664+((e<<16>>16)+-1<<2)>>2]|0;if((m|0)>(q|0)){b[o>>1]=q;if((s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(m|0))c[p>>2]=q;e=e+1|0;if((e|0)>=(s|0)){m=q;break}else p=p+4|0}}else m=q}else{b[o>>1]=m;if((m|0)<(q|0)&(s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(q|0))c[p>>2]=m;e=e+1|0;if((e|0)>=(s|0))break;else p=p+4|0}}}m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;m=k+1310736+(m+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+z;m=s}while(0);u=u+1|0;e=t+1|0;j=j+1|0;o=o+2|0;l=l+1|0;if((u|0)>=(A|0))break;else{t=e;s=m}}}z=z+1|0;if((z|0)>=(B|0)){p=m;D=52;break a}else{l=l+2|0;e=e+2|0;o=o+4|0;j=j+2|0}}Me(3,3904,C);l=-1}else{p=0;D=52}while(0);if((D|0)==52){o=k+12|0;if((p|0)<1)m=1;else{e=1;m=1;while(1){l=c[n>>2]|0;if((l|0)==(e|0)){l=m;m=m+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[n>>2]=l;if((e|0)<(p|0)){e=e+1|0;n=n+4|0}else break}}j=k+8|0;l=m+-1|0;c[j>>2]=l;if(l){ek(o|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((m|0)>1){l=0;do{D=l<<2;c[k+131084+(D<<2)>>2]=f;c[k+131084+((D|1)<<2)>>2]=0;c[k+131084+((D|2)<<2)>>2]=g;c[k+131084+((D|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[j>>2]|0))}if((p|0)>0){o=0;do{n=(c[k+1179664+(o<<2)>>2]|0)+-1|0;e=o*7|0;l=k+12+(n<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(e<<2)>>2]|0);l=n<<1;m=k+655376+(l<<3)|0;h[m>>3]=+h[m>>3]+ +(c[k+1310736+(e+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(e+2<<2)>>2]|0);n=n<<2;l=k+131084+(n<<2)|0;m=c[k+1310736+(e+3<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;l=k+131084+((n|1)<<2)|0;m=c[k+1310736+(e+4<<2)>>2]|0;if((c[l>>2]|0)<(m|0))c[l>>2]=m;l=k+131084+((n|2)<<2)|0;m=c[k+1310736+(e+5<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;m=k+131084+((n|3)<<2)|0;l=c[k+1310736+(e+6<<2)>>2]|0;if((c[m>>2]|0)<(l|0))c[m>>2]=l;o=o+1|0}while((o|0)<(p|0))}if((c[j>>2]|0)>0){l=0;do{f=k+12+(l<<2)|0;g=l<<1;D=k+655376+(g<<3)|0;h[D>>3]=+h[D>>3]/+(c[f>>2]|0);g=k+655376+((g|1)<<3)|0;h[g>>3]=+h[g>>3]/+(c[f>>2]|0);l=l+1|0}while((l|0)<(c[j>>2]|0));l=0}else l=0}else l=0}i=E;return l|0}function qd(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;F=i;i=i+16|0;B=F;D=(f|0)/2|0;E=(g|0)/2|0;o=c[k>>2]|0;A=E+-1|0;if((f|0)>1){l=0;m=o;n=o+(($(A,D)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(D|0))break;else{m=m+2|0;n=n+2|0}}}y=j*3|0;z=D+-1|0;if((g|0)>1){l=0;j=o;m=o+(z<<1)|0;while(1){b[m>>1]=0;b[j>>1]=0;l=l+1|0;if((l|0)>=(E|0))break;else{j=j+(D<<1)|0;m=m+(D<<1)|0}}}m=k+1179664|0;j=D+1|0;v=0-D|0;t=1-D|0;u=~D;s=(f*3|0)+12|0;a:do if((A|0)>1){w=(z|0)>1;l=(c[k+4>>2]|0)+j|0;x=1;n=e+((f*6|0)+6)|0;g=o+(j<<1)|0;j=0;b:while(1){if(w){r=1;q=n;p=j;while(1){do if(((d[q+1>>0]|0)+(d[q>>0]|0)+(d[q+2>>0]|0)|0)>(y|0)){a[l>>0]=-1;j=b[g+(v<<1)>>1]|0;if(j<<16>>16>0){b[g>>1]=j;j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}e=b[g+(t<<1)>>1]|0;f=e<<16>>16;j=b[g+(u<<1)>>1]|0;o=j<<16>>16;n=j<<16>>16>0;if(e<<16>>16<=0){if(n){b[g>>1]=j;j=o*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+r;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+x;n=k+1310736+(j+-3<<2)|0;if((c[n>>2]|0)<(r|0))c[n>>2]=r;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}j=b[g+-2>>1]|0;if(j<<16>>16>0){b[g>>1]=j;j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;j=k+1310736+(j+-3<<2)|0;if((c[j>>2]|0)>=(r|0)){j=p;break}c[j>>2]=r;j=p;break}else{j=p+1|0;if((p|0)>32767)break b;b[g>>1]=j;c[k+1179664+(p<<2)>>2]=j<<16>>16;p=p*7|0;c[k+1310736+(p<<2)>>2]=1;c[k+1310736+(p+1<<2)>>2]=r;c[k+1310736+(p+2<<2)>>2]=x;c[k+1310736+(p+3<<2)>>2]=r;c[k+1310736+(p+4<<2)>>2]=r;c[k+1310736+(p+5<<2)>>2]=x;c[k+1310736+(p+6<<2)>>2]=x;break}}if(n){j=c[k+1179664+(f+-1<<2)>>2]|0;f=c[k+1179664+(o+-1<<2)>>2]|0;if((j|0)>(f|0)){b[g>>1]=f;if((p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(j|0))c[e>>2]=f;n=n+1|0;if((n|0)>=(p|0)){j=f;break}else e=e+4|0}}else j=f}else{b[g>>1]=j;if((j|0)<(f|0)&(p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(f|0))c[e>>2]=j;n=n+1|0;if((n|0)>=(p|0))break;else e=e+4|0}}}j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}n=b[g+-2>>1]|0;if(n<<16>>16<=0){b[g>>1]=e;j=f*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+r;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+x;n=k+1310736+(j+-4<<2)|0;if((c[n>>2]|0)>(r|0))c[n>>2]=r;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}j=c[k+1179664+(f+-1<<2)>>2]|0;f=c[k+1179664+((n<<16>>16)+-1<<2)>>2]|0;if((j|0)>(f|0)){b[g>>1]=f;if((p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(j|0))c[e>>2]=f;n=n+1|0;if((n|0)>=(p|0)){j=f;break}else e=e+4|0}}else j=f}else{b[g>>1]=j;if((j|0)<(f|0)&(p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(f|0))c[e>>2]=j;n=n+1|0;if((n|0)>=(p|0))break;else e=e+4|0}}}j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;j=k+1310736+(j+-5<<2)|0;c[j>>2]=(c[j>>2]|0)+x;j=p}else{b[g>>1]=0;a[l>>0]=0;j=p}while(0);r=r+1|0;n=q+6|0;g=g+2|0;l=l+1|0;if((r|0)>=(z|0))break;else{q=n;p=j}}}x=x+1|0;if((x|0)>=(A|0)){f=j;C=52;break a}else{l=l+2|0;n=n+s|0;g=g+4|0}}Me(3,3904,B);l=-1}else{f=0;C=52}while(0);if((C|0)==52){g=k+12|0;if((f|0)<1)j=1;else{n=1;j=1;while(1){l=c[m>>2]|0;if((l|0)==(n|0)){l=j;j=j+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[m>>2]=l;if((n|0)<(f|0)){n=n+1|0;m=m+4|0}else break}}e=k+8|0;l=j+-1|0;c[e>>2]=l;if(l){ek(g|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((j|0)>1){l=0;do{C=l<<2;c[k+131084+(C<<2)>>2]=D;c[k+131084+((C|1)<<2)>>2]=0;c[k+131084+((C|2)<<2)>>2]=E;c[k+131084+((C|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[e>>2]|0))}if((f|0)>0){g=0;do{m=(c[k+1179664+(g<<2)>>2]|0)+-1|0;n=g*7|0;l=k+12+(m<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(n<<2)>>2]|0);l=m<<1;j=k+655376+(l<<3)|0;h[j>>3]=+h[j>>3]+ +(c[k+1310736+(n+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(n+2<<2)>>2]|0);m=m<<2;l=k+131084+(m<<2)|0;j=c[k+1310736+(n+3<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;l=k+131084+((m|1)<<2)|0;j=c[k+1310736+(n+4<<2)>>2]|0;if((c[l>>2]|0)<(j|0))c[l>>2]=j;l=k+131084+((m|2)<<2)|0;j=c[k+1310736+(n+5<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;j=k+131084+((m|3)<<2)|0;l=c[k+1310736+(n+6<<2)>>2]|0;if((c[j>>2]|0)<(l|0))c[j>>2]=l;g=g+1|0}while((g|0)<(f|0))}if((c[e>>2]|0)>0){l=0;do{D=k+12+(l<<2)|0;E=l<<1;C=k+655376+(E<<3)|0;h[C>>3]=+h[C>>3]/+(c[D>>2]|0);E=k+655376+((E|1)<<3)|0;h[E>>3]=+h[E>>3]/+(c[D>>2]|0);l=l+1|0}while((l|0)<(c[e>>2]|0));l=0}else l=0}else l=0}i=F;return l|0}function rd(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;F=i;i=i+16|0;B=F;D=(f|0)/2|0;E=(g|0)/2|0;o=c[k>>2]|0;A=E+-1|0;if((f|0)>1){l=0;m=o;n=o+(($(A,D)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(D|0))break;else{m=m+2|0;n=n+2|0}}}y=j*3|0;z=D+-1|0;if((g|0)>1){l=0;j=o;m=o+(z<<1)|0;while(1){b[m>>1]=0;b[j>>1]=0;l=l+1|0;if((l|0)>=(E|0))break;else{j=j+(D<<1)|0;m=m+(D<<1)|0}}}m=k+1179664|0;j=D+1|0;v=0-D|0;t=1-D|0;u=~D;s=(f<<1)+8|0;a:do if((A|0)>1){w=(z|0)>1;l=(c[k+4>>2]|0)+j|0;x=1;n=e+((f<<2)+4)|0;g=o+(j<<1)|0;j=0;b:while(1){if(w){r=1;q=n;p=j;while(1){f=d[q>>0]|0;o=d[q+1>>0]|0;do if(((f&248)+10+(f<<5&224)+(o>>>3&28)+(o<<3&248)|0)>(y|0)){a[l>>0]=-1;j=b[g+(v<<1)>>1]|0;if(j<<16>>16>0){b[g>>1]=j;j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}e=b[g+(t<<1)>>1]|0;f=e<<16>>16;j=b[g+(u<<1)>>1]|0;o=j<<16>>16;n=j<<16>>16>0;if(e<<16>>16<=0){if(n){b[g>>1]=j;j=o*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+r;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+x;n=k+1310736+(j+-3<<2)|0;if((c[n>>2]|0)<(r|0))c[n>>2]=r;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}j=b[g+-2>>1]|0;if(j<<16>>16>0){b[g>>1]=j;j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;j=k+1310736+(j+-3<<2)|0;if((c[j>>2]|0)>=(r|0)){j=p;break}c[j>>2]=r;j=p;break}else{j=p+1|0;if((p|0)>32767)break b;b[g>>1]=j;c[k+1179664+(p<<2)>>2]=j<<16>>16;p=p*7|0;c[k+1310736+(p<<2)>>2]=1;c[k+1310736+(p+1<<2)>>2]=r;c[k+1310736+(p+2<<2)>>2]=x;c[k+1310736+(p+3<<2)>>2]=r;c[k+1310736+(p+4<<2)>>2]=r;c[k+1310736+(p+5<<2)>>2]=x;c[k+1310736+(p+6<<2)>>2]=x;break}}if(n){j=c[k+1179664+(f+-1<<2)>>2]|0;f=c[k+1179664+(o+-1<<2)>>2]|0;if((j|0)>(f|0)){b[g>>1]=f;if((p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(j|0))c[e>>2]=f;n=n+1|0;if((n|0)>=(p|0)){j=f;break}else e=e+4|0}}else j=f}else{b[g>>1]=j;if((j|0)<(f|0)&(p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(f|0))c[e>>2]=j;n=n+1|0;if((n|0)>=(p|0))break;else e=e+4|0}}}j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}n=b[g+-2>>1]|0;if(n<<16>>16<=0){b[g>>1]=e;j=f*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+r;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+x;n=k+1310736+(j+-4<<2)|0;if((c[n>>2]|0)>(r|0))c[n>>2]=r;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}j=c[k+1179664+(f+-1<<2)>>2]|0;f=c[k+1179664+((n<<16>>16)+-1<<2)>>2]|0;if((j|0)>(f|0)){b[g>>1]=f;if((p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(j|0))c[e>>2]=f;n=n+1|0;if((n|0)>=(p|0)){j=f;break}else e=e+4|0}}else j=f}else{b[g>>1]=j;if((j|0)<(f|0)&(p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(f|0))c[e>>2]=j;n=n+1|0;if((n|0)>=(p|0))break;else e=e+4|0}}}j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;j=k+1310736+(j+-5<<2)|0;c[j>>2]=(c[j>>2]|0)+x;j=p}else{b[g>>1]=0;a[l>>0]=0;j=p}while(0);r=r+1|0;n=q+4|0;g=g+2|0;l=l+1|0;if((r|0)>=(z|0))break;else{q=n;p=j}}}x=x+1|0;if((x|0)>=(A|0)){f=j;C=52;break a}else{l=l+2|0;n=n+s|0;g=g+4|0}}Me(3,3904,B);l=-1}else{f=0;C=52}while(0);if((C|0)==52){g=k+12|0;if((f|0)<1)j=1;else{n=1;j=1;while(1){l=c[m>>2]|0;if((l|0)==(n|0)){l=j;j=j+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[m>>2]=l;if((n|0)<(f|0)){n=n+1|0;m=m+4|0}else break}}e=k+8|0;l=j+-1|0;c[e>>2]=l;if(l){ek(g|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((j|0)>1){l=0;do{C=l<<2;c[k+131084+(C<<2)>>2]=D;c[k+131084+((C|1)<<2)>>2]=0;c[k+131084+((C|2)<<2)>>2]=E;c[k+131084+((C|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[e>>2]|0))}if((f|0)>0){g=0;do{m=(c[k+1179664+(g<<2)>>2]|0)+-1|0;n=g*7|0;l=k+12+(m<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(n<<2)>>2]|0);l=m<<1;j=k+655376+(l<<3)|0;h[j>>3]=+h[j>>3]+ +(c[k+1310736+(n+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(n+2<<2)>>2]|0);m=m<<2;l=k+131084+(m<<2)|0;j=c[k+1310736+(n+3<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;l=k+131084+((m|1)<<2)|0;j=c[k+1310736+(n+4<<2)>>2]|0;if((c[l>>2]|0)<(j|0))c[l>>2]=j;l=k+131084+((m|2)<<2)|0;j=c[k+1310736+(n+5<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;j=k+131084+((m|3)<<2)|0;l=c[k+1310736+(n+6<<2)>>2]|0;if((c[j>>2]|0)<(l|0))c[j>>2]=l;g=g+1|0}while((g|0)<(f|0))}if((c[e>>2]|0)>0){l=0;do{D=k+12+(l<<2)|0;E=l<<1;C=k+655376+(E<<3)|0;h[C>>3]=+h[C>>3]/+(c[D>>2]|0);E=k+655376+((E|1)<<3)|0;h[E>>3]=+h[E>>3]/+(c[D>>2]|0);l=l+1|0}while((l|0)<(c[e>>2]|0));l=0}else l=0}else l=0}i=F;return l|0}function sd(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;F=i;i=i+16|0;B=F;D=(f|0)/2|0;E=(g|0)/2|0;o=c[k>>2]|0;A=E+-1|0;if((f|0)>1){l=0;m=o;n=o+(($(A,D)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(D|0))break;else{m=m+2|0;n=n+2|0}}}y=j*3|0;z=D+-1|0;if((g|0)>1){l=0;j=o;m=o+(z<<1)|0;while(1){b[m>>1]=0;b[j>>1]=0;l=l+1|0;if((l|0)>=(E|0))break;else{j=j+(D<<1)|0;m=m+(D<<1)|0}}}m=k+1179664|0;j=D+1|0;v=0-D|0;t=1-D|0;u=~D;s=(f<<2)+16|0;a:do if((A|0)>1){w=(z|0)>1;l=(c[k+4>>2]|0)+j|0;x=1;n=e+((f<<3)+8)|0;g=o+(j<<1)|0;j=0;b:while(1){if(w){r=1;q=n;p=j;while(1){do if(((d[q+1>>0]|0)+(d[q>>0]|0)+(d[q+2>>0]|0)|0)>(y|0)){a[l>>0]=-1;j=b[g+(v<<1)>>1]|0;if(j<<16>>16>0){b[g>>1]=j;j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}e=b[g+(t<<1)>>1]|0;f=e<<16>>16;j=b[g+(u<<1)>>1]|0;o=j<<16>>16;n=j<<16>>16>0;if(e<<16>>16<=0){if(n){b[g>>1]=j;j=o*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+r;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+x;n=k+1310736+(j+-3<<2)|0;if((c[n>>2]|0)<(r|0))c[n>>2]=r;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}j=b[g+-2>>1]|0;if(j<<16>>16>0){b[g>>1]=j;j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;j=k+1310736+(j+-3<<2)|0;if((c[j>>2]|0)>=(r|0)){j=p;break}c[j>>2]=r;j=p;break}else{j=p+1|0;if((p|0)>32767)break b;b[g>>1]=j;c[k+1179664+(p<<2)>>2]=j<<16>>16;p=p*7|0;c[k+1310736+(p<<2)>>2]=1;c[k+1310736+(p+1<<2)>>2]=r;c[k+1310736+(p+2<<2)>>2]=x;c[k+1310736+(p+3<<2)>>2]=r;c[k+1310736+(p+4<<2)>>2]=r;c[k+1310736+(p+5<<2)>>2]=x;c[k+1310736+(p+6<<2)>>2]=x;break}}if(n){j=c[k+1179664+(f+-1<<2)>>2]|0;f=c[k+1179664+(o+-1<<2)>>2]|0;if((j|0)>(f|0)){b[g>>1]=f;if((p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(j|0))c[e>>2]=f;n=n+1|0;if((n|0)>=(p|0)){j=f;break}else e=e+4|0}}else j=f}else{b[g>>1]=j;if((j|0)<(f|0)&(p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(f|0))c[e>>2]=j;n=n+1|0;if((n|0)>=(p|0))break;else e=e+4|0}}}j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}n=b[g+-2>>1]|0;if(n<<16>>16<=0){b[g>>1]=e;j=f*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+r;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+x;n=k+1310736+(j+-4<<2)|0;if((c[n>>2]|0)>(r|0))c[n>>2]=r;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}j=c[k+1179664+(f+-1<<2)>>2]|0;f=c[k+1179664+((n<<16>>16)+-1<<2)>>2]|0;if((j|0)>(f|0)){b[g>>1]=f;if((p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(j|0))c[e>>2]=f;n=n+1|0;if((n|0)>=(p|0)){j=f;break}else e=e+4|0}}else j=f}else{b[g>>1]=j;if((j|0)<(f|0)&(p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(f|0))c[e>>2]=j;n=n+1|0;if((n|0)>=(p|0))break;else e=e+4|0}}}j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;j=k+1310736+(j+-5<<2)|0;c[j>>2]=(c[j>>2]|0)+x;j=p}else{b[g>>1]=0;a[l>>0]=0;j=p}while(0);r=r+1|0;n=q+8|0;g=g+2|0;l=l+1|0;if((r|0)>=(z|0))break;else{q=n;p=j}}}x=x+1|0;if((x|0)>=(A|0)){f=j;C=52;break a}else{l=l+2|0;n=n+s|0;g=g+4|0}}Me(3,3904,B);l=-1}else{f=0;C=52}while(0);if((C|0)==52){g=k+12|0;if((f|0)<1)j=1;else{n=1;j=1;while(1){l=c[m>>2]|0;if((l|0)==(n|0)){l=j;j=j+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[m>>2]=l;if((n|0)<(f|0)){n=n+1|0;m=m+4|0}else break}}e=k+8|0;l=j+-1|0;c[e>>2]=l;if(l){ek(g|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((j|0)>1){l=0;do{C=l<<2;c[k+131084+(C<<2)>>2]=D;c[k+131084+((C|1)<<2)>>2]=0;c[k+131084+((C|2)<<2)>>2]=E;c[k+131084+((C|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[e>>2]|0))}if((f|0)>0){g=0;do{m=(c[k+1179664+(g<<2)>>2]|0)+-1|0;n=g*7|0;l=k+12+(m<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(n<<2)>>2]|0);l=m<<1;j=k+655376+(l<<3)|0;h[j>>3]=+h[j>>3]+ +(c[k+1310736+(n+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(n+2<<2)>>2]|0);m=m<<2;l=k+131084+(m<<2)|0;j=c[k+1310736+(n+3<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;l=k+131084+((m|1)<<2)|0;j=c[k+1310736+(n+4<<2)>>2]|0;if((c[l>>2]|0)<(j|0))c[l>>2]=j;l=k+131084+((m|2)<<2)|0;j=c[k+1310736+(n+5<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;j=k+131084+((m|3)<<2)|0;l=c[k+1310736+(n+6<<2)>>2]|0;if((c[j>>2]|0)<(l|0))c[j>>2]=l;g=g+1|0}while((g|0)<(f|0))}if((c[e>>2]|0)>0){l=0;do{D=k+12+(l<<2)|0;E=l<<1;C=k+655376+(E<<3)|0;h[C>>3]=+h[C>>3]/+(c[D>>2]|0);E=k+655376+((E|1)<<3)|0;h[E>>3]=+h[E>>3]/+(c[D>>2]|0);l=l+1|0}while((l|0)<(c[e>>2]|0));l=0}else l=0}else l=0}i=F;return l|0}function td(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;F=i;i=i+16|0;B=F;D=(f|0)/2|0;E=(g|0)/2|0;o=c[k>>2]|0;A=E+-1|0;if((f|0)>1){l=0;m=o;n=o+(($(A,D)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(D|0))break;else{m=m+2|0;n=n+2|0}}}y=j*3|0;z=D+-1|0;if((g|0)>1){l=0;j=o;m=o+(z<<1)|0;while(1){b[m>>1]=0;b[j>>1]=0;l=l+1|0;if((l|0)>=(E|0))break;else{j=j+(D<<1)|0;m=m+(D<<1)|0}}}m=k+1179664|0;j=D+1|0;v=0-D|0;t=1-D|0;u=~D;s=(f<<1)+8|0;a:do if((A|0)>1){w=(z|0)>1;l=(c[k+4>>2]|0)+j|0;x=1;n=e+((f<<2)+4)|0;g=o+(j<<1)|0;j=0;b:while(1){if(w){r=1;q=n;p=j;while(1){o=d[q>>0]|0;do if(((o&240)+24+(o<<4&240)+((d[q+1>>0]|0)&240)|0)>(y|0)){a[l>>0]=-1;j=b[g+(v<<1)>>1]|0;if(j<<16>>16>0){b[g>>1]=j;j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}e=b[g+(t<<1)>>1]|0;f=e<<16>>16;j=b[g+(u<<1)>>1]|0;o=j<<16>>16;n=j<<16>>16>0;if(e<<16>>16<=0){if(n){b[g>>1]=j;j=o*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+r;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+x;n=k+1310736+(j+-3<<2)|0;if((c[n>>2]|0)<(r|0))c[n>>2]=r;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}j=b[g+-2>>1]|0;if(j<<16>>16>0){b[g>>1]=j;j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;j=k+1310736+(j+-3<<2)|0;if((c[j>>2]|0)>=(r|0)){j=p;break}c[j>>2]=r;j=p;break}else{j=p+1|0;if((p|0)>32767)break b;b[g>>1]=j;c[k+1179664+(p<<2)>>2]=j<<16>>16;p=p*7|0;c[k+1310736+(p<<2)>>2]=1;c[k+1310736+(p+1<<2)>>2]=r;c[k+1310736+(p+2<<2)>>2]=x;c[k+1310736+(p+3<<2)>>2]=r;c[k+1310736+(p+4<<2)>>2]=r;c[k+1310736+(p+5<<2)>>2]=x;c[k+1310736+(p+6<<2)>>2]=x;break}}if(n){j=c[k+1179664+(f+-1<<2)>>2]|0;f=c[k+1179664+(o+-1<<2)>>2]|0;if((j|0)>(f|0)){b[g>>1]=f;if((p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(j|0))c[e>>2]=f;n=n+1|0;if((n|0)>=(p|0)){j=f;break}else e=e+4|0}}else j=f}else{b[g>>1]=j;if((j|0)<(f|0)&(p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(f|0))c[e>>2]=j;n=n+1|0;if((n|0)>=(p|0))break;else e=e+4|0}}}j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}n=b[g+-2>>1]|0;if(n<<16>>16<=0){b[g>>1]=e;j=f*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+r;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+x;n=k+1310736+(j+-4<<2)|0;if((c[n>>2]|0)>(r|0))c[n>>2]=r;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}j=c[k+1179664+(f+-1<<2)>>2]|0;f=c[k+1179664+((n<<16>>16)+-1<<2)>>2]|0;if((j|0)>(f|0)){b[g>>1]=f;if((p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(j|0))c[e>>2]=f;n=n+1|0;if((n|0)>=(p|0)){j=f;break}else e=e+4|0}}else j=f}else{b[g>>1]=j;if((j|0)<(f|0)&(p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(f|0))c[e>>2]=j;n=n+1|0;if((n|0)>=(p|0))break;else e=e+4|0}}}j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;j=k+1310736+(j+-5<<2)|0;c[j>>2]=(c[j>>2]|0)+x;j=p}else{b[g>>1]=0;a[l>>0]=0;j=p}while(0);r=r+1|0;n=q+4|0;g=g+2|0;l=l+1|0;if((r|0)>=(z|0))break;else{q=n;p=j}}}x=x+1|0;if((x|0)>=(A|0)){f=j;C=52;break a}else{l=l+2|0;n=n+s|0;g=g+4|0}}Me(3,3904,B);l=-1}else{f=0;C=52}while(0);if((C|0)==52){g=k+12|0;if((f|0)<1)j=1;else{n=1;j=1;while(1){l=c[m>>2]|0;if((l|0)==(n|0)){l=j;j=j+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[m>>2]=l;if((n|0)<(f|0)){n=n+1|0;m=m+4|0}else break}}e=k+8|0;l=j+-1|0;c[e>>2]=l;if(l){ek(g|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((j|0)>1){l=0;do{C=l<<2;c[k+131084+(C<<2)>>2]=D;c[k+131084+((C|1)<<2)>>2]=0;c[k+131084+((C|2)<<2)>>2]=E;c[k+131084+((C|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[e>>2]|0))}if((f|0)>0){g=0;do{m=(c[k+1179664+(g<<2)>>2]|0)+-1|0;n=g*7|0;l=k+12+(m<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(n<<2)>>2]|0);l=m<<1;j=k+655376+(l<<3)|0;h[j>>3]=+h[j>>3]+ +(c[k+1310736+(n+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(n+2<<2)>>2]|0);m=m<<2;l=k+131084+(m<<2)|0;j=c[k+1310736+(n+3<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;l=k+131084+((m|1)<<2)|0;j=c[k+1310736+(n+4<<2)>>2]|0;if((c[l>>2]|0)<(j|0))c[l>>2]=j;l=k+131084+((m|2)<<2)|0;j=c[k+1310736+(n+5<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;j=k+131084+((m|3)<<2)|0;l=c[k+1310736+(n+6<<2)>>2]|0;if((c[j>>2]|0)<(l|0))c[j>>2]=l;g=g+1|0}while((g|0)<(f|0))}if((c[e>>2]|0)>0){l=0;do{D=k+12+(l<<2)|0;E=l<<1;C=k+655376+(E<<3)|0;h[C>>3]=+h[C>>3]/+(c[D>>2]|0);E=k+655376+((E|1)<<3)|0;h[E>>3]=+h[E>>3]/+(c[D>>2]|0);l=l+1|0}while((l|0)<(c[e>>2]|0));l=0}else l=0}else l=0}i=F;return l|0}function ud(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;F=i;i=i+16|0;B=F;D=(f|0)/2|0;E=(g|0)/2|0;o=c[k>>2]|0;A=E+-1|0;if((f|0)>1){l=0;m=o;n=o+(($(A,D)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(D|0))break;else{m=m+2|0;n=n+2|0}}}y=j*3|0;z=D+-1|0;if((g|0)>1){l=0;j=o;m=o+(z<<1)|0;while(1){b[m>>1]=0;b[j>>1]=0;l=l+1|0;if((l|0)>=(E|0))break;else{j=j+(D<<1)|0;m=m+(D<<1)|0}}}m=k+1179664|0;j=D+1|0;v=0-D|0;t=1-D|0;u=~D;s=(f<<1)+8|0;a:do if((A|0)>1){w=(z|0)>1;l=(c[k+4>>2]|0)+j|0;x=1;n=e+((f<<2)+4)|0;g=o+(j<<1)|0;j=0;b:while(1){if(w){r=1;q=n;p=j;while(1){f=d[q>>0]|0;o=d[q+1>>0]|0;do if(((f&248)+12+(f<<5&224)+(o>>>3&24)+(o<<2&248)|0)>(y|0)){a[l>>0]=-1;j=b[g+(v<<1)>>1]|0;if(j<<16>>16>0){b[g>>1]=j;j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}e=b[g+(t<<1)>>1]|0;f=e<<16>>16;j=b[g+(u<<1)>>1]|0;o=j<<16>>16;n=j<<16>>16>0;if(e<<16>>16<=0){if(n){b[g>>1]=j;j=o*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+r;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+x;n=k+1310736+(j+-3<<2)|0;if((c[n>>2]|0)<(r|0))c[n>>2]=r;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}j=b[g+-2>>1]|0;if(j<<16>>16>0){b[g>>1]=j;j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;j=k+1310736+(j+-3<<2)|0;if((c[j>>2]|0)>=(r|0)){j=p;break}c[j>>2]=r;j=p;break}else{j=p+1|0;if((p|0)>32767)break b;b[g>>1]=j;c[k+1179664+(p<<2)>>2]=j<<16>>16;p=p*7|0;c[k+1310736+(p<<2)>>2]=1;c[k+1310736+(p+1<<2)>>2]=r;c[k+1310736+(p+2<<2)>>2]=x;c[k+1310736+(p+3<<2)>>2]=r;c[k+1310736+(p+4<<2)>>2]=r;c[k+1310736+(p+5<<2)>>2]=x;c[k+1310736+(p+6<<2)>>2]=x;break}}if(n){j=c[k+1179664+(f+-1<<2)>>2]|0;f=c[k+1179664+(o+-1<<2)>>2]|0;if((j|0)>(f|0)){b[g>>1]=f;if((p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(j|0))c[e>>2]=f;n=n+1|0;if((n|0)>=(p|0)){j=f;break}else e=e+4|0}}else j=f}else{b[g>>1]=j;if((j|0)<(f|0)&(p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(f|0))c[e>>2]=j;n=n+1|0;if((n|0)>=(p|0))break;else e=e+4|0}}}j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}n=b[g+-2>>1]|0;if(n<<16>>16<=0){b[g>>1]=e;j=f*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+r;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+x;n=k+1310736+(j+-4<<2)|0;if((c[n>>2]|0)>(r|0))c[n>>2]=r;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}j=c[k+1179664+(f+-1<<2)>>2]|0;f=c[k+1179664+((n<<16>>16)+-1<<2)>>2]|0;if((j|0)>(f|0)){b[g>>1]=f;if((p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(j|0))c[e>>2]=f;n=n+1|0;if((n|0)>=(p|0)){j=f;break}else e=e+4|0}}else j=f}else{b[g>>1]=j;if((j|0)<(f|0)&(p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(f|0))c[e>>2]=j;n=n+1|0;if((n|0)>=(p|0))break;else e=e+4|0}}}j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;j=k+1310736+(j+-5<<2)|0;c[j>>2]=(c[j>>2]|0)+x;j=p}else{b[g>>1]=0;a[l>>0]=0;j=p}while(0);r=r+1|0;n=q+4|0;g=g+2|0;l=l+1|0;if((r|0)>=(z|0))break;else{q=n;p=j}}}x=x+1|0;if((x|0)>=(A|0)){f=j;C=52;break a}else{l=l+2|0;n=n+s|0;g=g+4|0}}Me(3,3904,B);l=-1}else{f=0;C=52}while(0);if((C|0)==52){g=k+12|0;if((f|0)<1)j=1;else{n=1;j=1;while(1){l=c[m>>2]|0;if((l|0)==(n|0)){l=j;j=j+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[m>>2]=l;if((n|0)<(f|0)){n=n+1|0;m=m+4|0}else break}}e=k+8|0;l=j+-1|0;c[e>>2]=l;if(l){ek(g|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((j|0)>1){l=0;do{C=l<<2;c[k+131084+(C<<2)>>2]=D;c[k+131084+((C|1)<<2)>>2]=0;c[k+131084+((C|2)<<2)>>2]=E;c[k+131084+((C|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[e>>2]|0))}if((f|0)>0){g=0;do{m=(c[k+1179664+(g<<2)>>2]|0)+-1|0;n=g*7|0;l=k+12+(m<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(n<<2)>>2]|0);l=m<<1;j=k+655376+(l<<3)|0;h[j>>3]=+h[j>>3]+ +(c[k+1310736+(n+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(n+2<<2)>>2]|0);m=m<<2;l=k+131084+(m<<2)|0;j=c[k+1310736+(n+3<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;l=k+131084+((m|1)<<2)|0;j=c[k+1310736+(n+4<<2)>>2]|0;if((c[l>>2]|0)<(j|0))c[l>>2]=j;l=k+131084+((m|2)<<2)|0;j=c[k+1310736+(n+5<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;j=k+131084+((m|3)<<2)|0;l=c[k+1310736+(n+6<<2)>>2]|0;if((c[j>>2]|0)<(l|0))c[j>>2]=l;g=g+1|0}while((g|0)<(f|0))}if((c[e>>2]|0)>0){l=0;do{D=k+12+(l<<2)|0;E=l<<1;C=k+655376+(E<<3)|0;h[C>>3]=+h[C>>3]/+(c[D>>2]|0);E=k+655376+((E|1)<<3)|0;h[E>>3]=+h[E>>3]/+(c[D>>2]|0);l=l+1|0}while((l|0)<(c[e>>2]|0));l=0}else l=0}else l=0}i=F;return l|0}function vd(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;F=i;i=i+16|0;B=F;D=(f|0)/2|0;E=(g|0)/2|0;o=c[k>>2]|0;A=E+-1|0;if((f|0)>1){l=0;m=o;n=o+(($(A,D)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(D|0))break;else{m=m+2|0;n=n+2|0}}}y=j*3|0;z=D+-1|0;if((g|0)>1){l=0;j=o;m=o+(z<<1)|0;while(1){b[m>>1]=0;b[j>>1]=0;l=l+1|0;if((l|0)>=(E|0))break;else{j=j+(D<<1)|0;m=m+(D<<1)|0}}}m=k+1179664|0;j=D+1|0;v=0-D|0;t=1-D|0;u=~D;s=(f<<2)+16|0;a:do if((A|0)>1){w=(z|0)>1;l=(c[k+4>>2]|0)+j|0;x=1;n=e+((f<<3)+8)|0;g=o+(j<<1)|0;j=0;b:while(1){if(w){r=1;q=n;p=j;while(1){do if(((d[q+2>>0]|0)+(d[q+1>>0]|0)+(d[q+3>>0]|0)|0)>(y|0)){a[l>>0]=-1;j=b[g+(v<<1)>>1]|0;if(j<<16>>16>0){b[g>>1]=j;j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}e=b[g+(t<<1)>>1]|0;f=e<<16>>16;j=b[g+(u<<1)>>1]|0;o=j<<16>>16;n=j<<16>>16>0;if(e<<16>>16<=0){if(n){b[g>>1]=j;j=o*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+r;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+x;n=k+1310736+(j+-3<<2)|0;if((c[n>>2]|0)<(r|0))c[n>>2]=r;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}j=b[g+-2>>1]|0;if(j<<16>>16>0){b[g>>1]=j;j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;j=k+1310736+(j+-3<<2)|0;if((c[j>>2]|0)>=(r|0)){j=p;break}c[j>>2]=r;j=p;break}else{j=p+1|0;if((p|0)>32767)break b;b[g>>1]=j;c[k+1179664+(p<<2)>>2]=j<<16>>16;p=p*7|0;c[k+1310736+(p<<2)>>2]=1;c[k+1310736+(p+1<<2)>>2]=r;c[k+1310736+(p+2<<2)>>2]=x;c[k+1310736+(p+3<<2)>>2]=r;c[k+1310736+(p+4<<2)>>2]=r;c[k+1310736+(p+5<<2)>>2]=x;c[k+1310736+(p+6<<2)>>2]=x;break}}if(n){j=c[k+1179664+(f+-1<<2)>>2]|0;f=c[k+1179664+(o+-1<<2)>>2]|0;if((j|0)>(f|0)){b[g>>1]=f;if((p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(j|0))c[e>>2]=f;n=n+1|0;if((n|0)>=(p|0)){j=f;break}else e=e+4|0}}else j=f}else{b[g>>1]=j;if((j|0)<(f|0)&(p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(f|0))c[e>>2]=j;n=n+1|0;if((n|0)>=(p|0))break;else e=e+4|0}}}j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}n=b[g+-2>>1]|0;if(n<<16>>16<=0){b[g>>1]=e;j=f*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+r;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+x;n=k+1310736+(j+-4<<2)|0;if((c[n>>2]|0)>(r|0))c[n>>2]=r;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}j=c[k+1179664+(f+-1<<2)>>2]|0;f=c[k+1179664+((n<<16>>16)+-1<<2)>>2]|0;if((j|0)>(f|0)){b[g>>1]=f;if((p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(j|0))c[e>>2]=f;n=n+1|0;if((n|0)>=(p|0)){j=f;break}else e=e+4|0}}else j=f}else{b[g>>1]=j;if((j|0)<(f|0)&(p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(f|0))c[e>>2]=j;n=n+1|0;if((n|0)>=(p|0))break;else e=e+4|0}}}j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;j=k+1310736+(j+-5<<2)|0;c[j>>2]=(c[j>>2]|0)+x;j=p}else{b[g>>1]=0;a[l>>0]=0;j=p}while(0);r=r+1|0;n=q+8|0;g=g+2|0;l=l+1|0;if((r|0)>=(z|0))break;else{q=n;p=j}}}x=x+1|0;if((x|0)>=(A|0)){f=j;C=52;break a}else{l=l+2|0;n=n+s|0;g=g+4|0}}Me(3,3904,B);l=-1}else{f=0;C=52}while(0);if((C|0)==52){g=k+12|0;if((f|0)<1)j=1;else{n=1;j=1;while(1){l=c[m>>2]|0;if((l|0)==(n|0)){l=j;j=j+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[m>>2]=l;if((n|0)<(f|0)){n=n+1|0;m=m+4|0}else break}}e=k+8|0;l=j+-1|0;c[e>>2]=l;if(l){ek(g|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((j|0)>1){l=0;do{C=l<<2;c[k+131084+(C<<2)>>2]=D;c[k+131084+((C|1)<<2)>>2]=0;c[k+131084+((C|2)<<2)>>2]=E;c[k+131084+((C|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[e>>2]|0))}if((f|0)>0){g=0;do{m=(c[k+1179664+(g<<2)>>2]|0)+-1|0;n=g*7|0;l=k+12+(m<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(n<<2)>>2]|0);l=m<<1;j=k+655376+(l<<3)|0;h[j>>3]=+h[j>>3]+ +(c[k+1310736+(n+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(n+2<<2)>>2]|0);m=m<<2;l=k+131084+(m<<2)|0;j=c[k+1310736+(n+3<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;l=k+131084+((m|1)<<2)|0;j=c[k+1310736+(n+4<<2)>>2]|0;if((c[l>>2]|0)<(j|0))c[l>>2]=j;l=k+131084+((m|2)<<2)|0;j=c[k+1310736+(n+5<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;j=k+131084+((m|3)<<2)|0;l=c[k+1310736+(n+6<<2)>>2]|0;if((c[j>>2]|0)<(l|0))c[j>>2]=l;g=g+1|0}while((g|0)<(f|0))}if((c[e>>2]|0)>0){l=0;do{D=k+12+(l<<2)|0;E=l<<1;C=k+655376+(E<<3)|0;h[C>>3]=+h[C>>3]/+(c[D>>2]|0);E=k+655376+((E|1)<<3)|0;h[E>>3]=+h[E>>3]/+(c[D>>2]|0);l=l+1|0}while((l|0)<(c[e>>2]|0));l=0}else l=0}else l=0}i=F;return l|0}function wd(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;F=i;i=i+16|0;B=F;D=(f|0)/2|0;E=(g|0)/2|0;o=c[k>>2]|0;A=E+-1|0;if((f|0)>1){l=0;m=o;n=o+(($(A,D)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(D|0))break;else{m=m+2|0;n=n+2|0}}}z=D+-1|0;if((g|0)>1){l=0;m=o;n=o+(z<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(E|0))break;else{m=m+(D<<1)|0;n=n+(D<<1)|0}}}n=k+1179664|0;m=D+1|0;w=0-D|0;u=1-D|0;v=~D;t=f+4|0;a:do if((A|0)>1){x=(z|0)>1;l=(c[k+4>>2]|0)+m|0;y=1;g=e+((f<<1)+2)|0;e=o+(m<<1)|0;m=0;b:while(1){if(x){s=1;r=g;q=m;while(1){do if((d[r>>0]|0|0)>(j|0)){a[l>>0]=-1;m=b[e+(w<<1)>>1]|0;if(m<<16>>16>0){b[e>>1]=m;m=(m<<16>>16)*7|0;p=k+1310736+(m+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=k+1310736+(m+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=k+1310736+(m+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+y;c[k+1310736+(m+-1<<2)>>2]=y;m=q;break}f=b[e+(u<<1)>>1]|0;o=f<<16>>16;m=b[e+(v<<1)>>1]|0;p=m<<16>>16;g=m<<16>>16>0;if(f<<16>>16<=0){if(g){b[e>>1]=m;m=p*7|0;g=k+1310736+(m+-7<<2)|0;c[g>>2]=(c[g>>2]|0)+1;g=k+1310736+(m+-6<<2)|0;c[g>>2]=(c[g>>2]|0)+s;g=k+1310736+(m+-5<<2)|0;c[g>>2]=(c[g>>2]|0)+y;g=k+1310736+(m+-3<<2)|0;if((c[g>>2]|0)<(s|0))c[g>>2]=s;c[k+1310736+(m+-1<<2)>>2]=y;m=q;break}m=b[e+-2>>1]|0;if(m<<16>>16>0){b[e>>1]=m;m=(m<<16>>16)*7|0;p=k+1310736+(m+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=k+1310736+(m+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=k+1310736+(m+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+y;m=k+1310736+(m+-3<<2)|0;if((c[m>>2]|0)>=(s|0)){m=q;break}c[m>>2]=s;m=q;break}else{m=q+1|0;if((q|0)>32767)break b;b[e>>1]=m;c[k+1179664+(q<<2)>>2]=m<<16>>16;q=q*7|0;c[k+1310736+(q<<2)>>2]=1;c[k+1310736+(q+1<<2)>>2]=s;c[k+1310736+(q+2<<2)>>2]=y;c[k+1310736+(q+3<<2)>>2]=s;c[k+1310736+(q+4<<2)>>2]=s;c[k+1310736+(q+5<<2)>>2]=y;c[k+1310736+(q+6<<2)>>2]=y;break}}if(g){m=c[k+1179664+(o+-1<<2)>>2]|0;o=c[k+1179664+(p+-1<<2)>>2]|0;if((m|0)>(o|0)){b[e>>1]=o;if((q|0)>0){g=0;f=n;while(1){if((c[f>>2]|0)==(m|0))c[f>>2]=o;g=g+1|0;if((g|0)>=(q|0)){m=o;break}else f=f+4|0}}else m=o}else{b[e>>1]=m;if((m|0)<(o|0)&(q|0)>0){g=0;f=n;while(1){if((c[f>>2]|0)==(o|0))c[f>>2]=m;g=g+1|0;if((g|0)>=(q|0))break;else f=f+4|0}}}m=(m<<16>>16)*7|0;p=k+1310736+(m+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=k+1310736+(m+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=k+1310736+(m+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+y;c[k+1310736+(m+-1<<2)>>2]=y;m=q;break}g=b[e+-2>>1]|0;if(g<<16>>16<=0){b[e>>1]=f;m=o*7|0;g=k+1310736+(m+-7<<2)|0;c[g>>2]=(c[g>>2]|0)+1;g=k+1310736+(m+-6<<2)|0;c[g>>2]=(c[g>>2]|0)+s;g=k+1310736+(m+-5<<2)|0;c[g>>2]=(c[g>>2]|0)+y;g=k+1310736+(m+-4<<2)|0;if((c[g>>2]|0)>(s|0))c[g>>2]=s;c[k+1310736+(m+-1<<2)>>2]=y;m=q;break}m=c[k+1179664+(o+-1<<2)>>2]|0;o=c[k+1179664+((g<<16>>16)+-1<<2)>>2]|0;if((m|0)>(o|0)){b[e>>1]=o;if((q|0)>0){g=0;f=n;while(1){if((c[f>>2]|0)==(m|0))c[f>>2]=o;g=g+1|0;if((g|0)>=(q|0)){m=o;break}else f=f+4|0}}else m=o}else{b[e>>1]=m;if((m|0)<(o|0)&(q|0)>0){g=0;f=n;while(1){if((c[f>>2]|0)==(o|0))c[f>>2]=m;g=g+1|0;if((g|0)>=(q|0))break;else f=f+4|0}}}m=(m<<16>>16)*7|0;p=k+1310736+(m+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=k+1310736+(m+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;m=k+1310736+(m+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+y;m=q}else{b[e>>1]=0;a[l>>0]=0;m=q}while(0);s=s+1|0;g=r+2|0;e=e+2|0;l=l+1|0;if((s|0)>=(z|0))break;else{r=g;q=m}}}y=y+1|0;if((y|0)>=(A|0)){o=m;C=52;break a}else{l=l+2|0;g=g+t|0;e=e+4|0}}Me(3,3904,B);l=-1}else{o=0;C=52}while(0);if((C|0)==52){e=k+12|0;if((o|0)<1)m=1;else{g=1;m=1;while(1){l=c[n>>2]|0;if((l|0)==(g|0)){l=m;m=m+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[n>>2]=l;if((g|0)<(o|0)){g=g+1|0;n=n+4|0}else break}}f=k+8|0;l=m+-1|0;c[f>>2]=l;if(l){ek(e|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((m|0)>1){l=0;do{C=l<<2;c[k+131084+(C<<2)>>2]=D;c[k+131084+((C|1)<<2)>>2]=0;c[k+131084+((C|2)<<2)>>2]=E;c[k+131084+((C|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[f>>2]|0))}if((o|0)>0){e=0;do{n=(c[k+1179664+(e<<2)>>2]|0)+-1|0;g=e*7|0;l=k+12+(n<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(g<<2)>>2]|0);l=n<<1;m=k+655376+(l<<3)|0;h[m>>3]=+h[m>>3]+ +(c[k+1310736+(g+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(g+2<<2)>>2]|0);n=n<<2;l=k+131084+(n<<2)|0;m=c[k+1310736+(g+3<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;l=k+131084+((n|1)<<2)|0;m=c[k+1310736+(g+4<<2)>>2]|0;if((c[l>>2]|0)<(m|0))c[l>>2]=m;l=k+131084+((n|2)<<2)|0;m=c[k+1310736+(g+5<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;m=k+131084+((n|3)<<2)|0;l=c[k+1310736+(g+6<<2)>>2]|0;if((c[m>>2]|0)<(l|0))c[m>>2]=l;e=e+1|0}while((e|0)<(o|0))}if((c[f>>2]|0)>0){l=0;do{D=k+12+(l<<2)|0;E=l<<1;C=k+655376+(E<<3)|0;h[C>>3]=+h[C>>3]/+(c[D>>2]|0);E=k+655376+((E|1)<<3)|0;h[E>>3]=+h[E>>3]/+(c[D>>2]|0);l=l+1|0}while((l|0)<(c[f>>2]|0));l=0}else l=0}else l=0}i=F;return l|0}function xd(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;F=i;i=i+16|0;B=F;D=(f|0)/2|0;E=(g|0)/2|0;o=c[k>>2]|0;A=E+-1|0;if((f|0)>1){l=0;m=o;n=o+(($(A,D)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(D|0))break;else{m=m+2|0;n=n+2|0}}}z=D+-1|0;if((g|0)>1){l=0;m=o;n=o+(z<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(E|0))break;else{m=m+(D<<1)|0;n=n+(D<<1)|0}}}n=k+1179664|0;m=D+1|0;w=0-D|0;u=1-D|0;v=~D;t=(f<<1)+8|0;a:do if((A|0)>1){x=(z|0)>1;l=(c[k+4>>2]|0)+m|0;y=1;g=e+((f<<2)+4)|0;e=o+(m<<1)|0;m=0;b:while(1){if(x){s=1;r=g;q=m;while(1){do if((d[r+1>>0]|0|0)>(j|0)){a[l>>0]=-1;m=b[e+(w<<1)>>1]|0;if(m<<16>>16>0){b[e>>1]=m;m=(m<<16>>16)*7|0;p=k+1310736+(m+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=k+1310736+(m+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=k+1310736+(m+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+y;c[k+1310736+(m+-1<<2)>>2]=y;m=q;break}f=b[e+(u<<1)>>1]|0;o=f<<16>>16;m=b[e+(v<<1)>>1]|0;p=m<<16>>16;g=m<<16>>16>0;if(f<<16>>16<=0){if(g){b[e>>1]=m;m=p*7|0;g=k+1310736+(m+-7<<2)|0;c[g>>2]=(c[g>>2]|0)+1;g=k+1310736+(m+-6<<2)|0;c[g>>2]=(c[g>>2]|0)+s;g=k+1310736+(m+-5<<2)|0;c[g>>2]=(c[g>>2]|0)+y;g=k+1310736+(m+-3<<2)|0;if((c[g>>2]|0)<(s|0))c[g>>2]=s;c[k+1310736+(m+-1<<2)>>2]=y;m=q;break}m=b[e+-2>>1]|0;if(m<<16>>16>0){b[e>>1]=m;m=(m<<16>>16)*7|0;p=k+1310736+(m+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=k+1310736+(m+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=k+1310736+(m+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+y;m=k+1310736+(m+-3<<2)|0;if((c[m>>2]|0)>=(s|0)){m=q;break}c[m>>2]=s;m=q;break}else{m=q+1|0;if((q|0)>32767)break b;b[e>>1]=m;c[k+1179664+(q<<2)>>2]=m<<16>>16;q=q*7|0;c[k+1310736+(q<<2)>>2]=1;c[k+1310736+(q+1<<2)>>2]=s;c[k+1310736+(q+2<<2)>>2]=y;c[k+1310736+(q+3<<2)>>2]=s;c[k+1310736+(q+4<<2)>>2]=s;c[k+1310736+(q+5<<2)>>2]=y;c[k+1310736+(q+6<<2)>>2]=y;break}}if(g){m=c[k+1179664+(o+-1<<2)>>2]|0;o=c[k+1179664+(p+-1<<2)>>2]|0;if((m|0)>(o|0)){b[e>>1]=o;if((q|0)>0){g=0;f=n;while(1){if((c[f>>2]|0)==(m|0))c[f>>2]=o;g=g+1|0;if((g|0)>=(q|0)){m=o;break}else f=f+4|0}}else m=o}else{b[e>>1]=m;if((m|0)<(o|0)&(q|0)>0){g=0;f=n;while(1){if((c[f>>2]|0)==(o|0))c[f>>2]=m;g=g+1|0;if((g|0)>=(q|0))break;else f=f+4|0}}}m=(m<<16>>16)*7|0;p=k+1310736+(m+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=k+1310736+(m+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=k+1310736+(m+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+y;c[k+1310736+(m+-1<<2)>>2]=y;m=q;break}g=b[e+-2>>1]|0;if(g<<16>>16<=0){b[e>>1]=f;m=o*7|0;g=k+1310736+(m+-7<<2)|0;c[g>>2]=(c[g>>2]|0)+1;g=k+1310736+(m+-6<<2)|0;c[g>>2]=(c[g>>2]|0)+s;g=k+1310736+(m+-5<<2)|0;c[g>>2]=(c[g>>2]|0)+y;g=k+1310736+(m+-4<<2)|0;if((c[g>>2]|0)>(s|0))c[g>>2]=s;c[k+1310736+(m+-1<<2)>>2]=y;m=q;break}m=c[k+1179664+(o+-1<<2)>>2]|0;o=c[k+1179664+((g<<16>>16)+-1<<2)>>2]|0;if((m|0)>(o|0)){b[e>>1]=o;if((q|0)>0){g=0;f=n;while(1){if((c[f>>2]|0)==(m|0))c[f>>2]=o;g=g+1|0;if((g|0)>=(q|0)){m=o;break}else f=f+4|0}}else m=o}else{b[e>>1]=m;if((m|0)<(o|0)&(q|0)>0){g=0;f=n;while(1){if((c[f>>2]|0)==(o|0))c[f>>2]=m;g=g+1|0;if((g|0)>=(q|0))break;else f=f+4|0}}}m=(m<<16>>16)*7|0;p=k+1310736+(m+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=k+1310736+(m+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;m=k+1310736+(m+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+y;m=q}else{b[e>>1]=0;a[l>>0]=0;m=q}while(0);s=s+1|0;g=r+4|0;e=e+2|0;l=l+1|0;if((s|0)>=(z|0))break;else{r=g;q=m}}}y=y+1|0;if((y|0)>=(A|0)){o=m;C=52;break a}else{l=l+2|0;g=g+t|0;e=e+4|0}}Me(3,3904,B);l=-1}else{o=0;C=52}while(0);if((C|0)==52){e=k+12|0;if((o|0)<1)m=1;else{g=1;m=1;while(1){l=c[n>>2]|0;if((l|0)==(g|0)){l=m;m=m+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[n>>2]=l;if((g|0)<(o|0)){g=g+1|0;n=n+4|0}else break}}f=k+8|0;l=m+-1|0;c[f>>2]=l;if(l){ek(e|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((m|0)>1){l=0;do{C=l<<2;c[k+131084+(C<<2)>>2]=D;c[k+131084+((C|1)<<2)>>2]=0;c[k+131084+((C|2)<<2)>>2]=E;c[k+131084+((C|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[f>>2]|0))}if((o|0)>0){e=0;do{n=(c[k+1179664+(e<<2)>>2]|0)+-1|0;g=e*7|0;l=k+12+(n<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(g<<2)>>2]|0);l=n<<1;m=k+655376+(l<<3)|0;h[m>>3]=+h[m>>3]+ +(c[k+1310736+(g+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(g+2<<2)>>2]|0);n=n<<2;l=k+131084+(n<<2)|0;m=c[k+1310736+(g+3<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;l=k+131084+((n|1)<<2)|0;m=c[k+1310736+(g+4<<2)>>2]|0;if((c[l>>2]|0)<(m|0))c[l>>2]=m;l=k+131084+((n|2)<<2)|0;m=c[k+1310736+(g+5<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;m=k+131084+((n|3)<<2)|0;l=c[k+1310736+(g+6<<2)>>2]|0;if((c[m>>2]|0)<(l|0))c[m>>2]=l;e=e+1|0}while((e|0)<(o|0))}if((c[f>>2]|0)>0){l=0;do{D=k+12+(l<<2)|0;E=l<<1;C=k+655376+(E<<3)|0;h[C>>3]=+h[C>>3]/+(c[D>>2]|0);E=k+655376+((E|1)<<3)|0;h[E>>3]=+h[E>>3]/+(c[D>>2]|0);l=l+1|0}while((l|0)<(c[f>>2]|0));l=0}else l=0}else l=0}i=F;return l|0}function yd(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;F=i;i=i+16|0;B=F;D=(f|0)/2|0;E=(g|0)/2|0;o=c[k>>2]|0;A=E+-1|0;if((f|0)>1){l=0;m=o;n=o+(($(A,D)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(D|0))break;else{m=m+2|0;n=n+2|0}}}z=D+-1|0;if((g|0)>1){l=0;m=o;n=o+(z<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(E|0))break;else{m=m+(D<<1)|0;n=n+(D<<1)|0}}}n=k+1179664|0;m=D+1|0;w=0-D|0;u=1-D|0;v=~D;t=(f<<1)+8|0;a:do if((A|0)>1){x=(z|0)>1;l=(c[k+4>>2]|0)+m|0;y=1;g=e+((f<<2)+4)|0;e=o+(m<<1)|0;m=0;b:while(1){if(x){s=1;r=g;q=m;while(1){do if((d[r>>0]|0|0)>(j|0)){a[l>>0]=-1;m=b[e+(w<<1)>>1]|0;if(m<<16>>16>0){b[e>>1]=m;m=(m<<16>>16)*7|0;p=k+1310736+(m+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=k+1310736+(m+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=k+1310736+(m+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+y;c[k+1310736+(m+-1<<2)>>2]=y;m=q;break}f=b[e+(u<<1)>>1]|0;o=f<<16>>16;m=b[e+(v<<1)>>1]|0;p=m<<16>>16;g=m<<16>>16>0;if(f<<16>>16<=0){if(g){b[e>>1]=m;m=p*7|0;g=k+1310736+(m+-7<<2)|0;c[g>>2]=(c[g>>2]|0)+1;g=k+1310736+(m+-6<<2)|0;c[g>>2]=(c[g>>2]|0)+s;g=k+1310736+(m+-5<<2)|0;c[g>>2]=(c[g>>2]|0)+y;g=k+1310736+(m+-3<<2)|0;if((c[g>>2]|0)<(s|0))c[g>>2]=s;c[k+1310736+(m+-1<<2)>>2]=y;m=q;break}m=b[e+-2>>1]|0;if(m<<16>>16>0){b[e>>1]=m;m=(m<<16>>16)*7|0;p=k+1310736+(m+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=k+1310736+(m+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=k+1310736+(m+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+y;m=k+1310736+(m+-3<<2)|0;if((c[m>>2]|0)>=(s|0)){m=q;break}c[m>>2]=s;m=q;break}else{m=q+1|0;if((q|0)>32767)break b;b[e>>1]=m;c[k+1179664+(q<<2)>>2]=m<<16>>16;q=q*7|0;c[k+1310736+(q<<2)>>2]=1;c[k+1310736+(q+1<<2)>>2]=s;c[k+1310736+(q+2<<2)>>2]=y;c[k+1310736+(q+3<<2)>>2]=s;c[k+1310736+(q+4<<2)>>2]=s;c[k+1310736+(q+5<<2)>>2]=y;c[k+1310736+(q+6<<2)>>2]=y;break}}if(g){m=c[k+1179664+(o+-1<<2)>>2]|0;o=c[k+1179664+(p+-1<<2)>>2]|0;if((m|0)>(o|0)){b[e>>1]=o;if((q|0)>0){g=0;f=n;while(1){if((c[f>>2]|0)==(m|0))c[f>>2]=o;g=g+1|0;if((g|0)>=(q|0)){m=o;break}else f=f+4|0}}else m=o}else{b[e>>1]=m;if((m|0)<(o|0)&(q|0)>0){g=0;f=n;while(1){if((c[f>>2]|0)==(o|0))c[f>>2]=m;g=g+1|0;if((g|0)>=(q|0))break;else f=f+4|0}}}m=(m<<16>>16)*7|0;p=k+1310736+(m+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=k+1310736+(m+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=k+1310736+(m+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+y;c[k+1310736+(m+-1<<2)>>2]=y;m=q;break}g=b[e+-2>>1]|0;if(g<<16>>16<=0){b[e>>1]=f;m=o*7|0;g=k+1310736+(m+-7<<2)|0;c[g>>2]=(c[g>>2]|0)+1;g=k+1310736+(m+-6<<2)|0;c[g>>2]=(c[g>>2]|0)+s;g=k+1310736+(m+-5<<2)|0;c[g>>2]=(c[g>>2]|0)+y;g=k+1310736+(m+-4<<2)|0;if((c[g>>2]|0)>(s|0))c[g>>2]=s;c[k+1310736+(m+-1<<2)>>2]=y;m=q;break}m=c[k+1179664+(o+-1<<2)>>2]|0;o=c[k+1179664+((g<<16>>16)+-1<<2)>>2]|0;if((m|0)>(o|0)){b[e>>1]=o;if((q|0)>0){g=0;f=n;while(1){if((c[f>>2]|0)==(m|0))c[f>>2]=o;g=g+1|0;if((g|0)>=(q|0)){m=o;break}else f=f+4|0}}else m=o}else{b[e>>1]=m;if((m|0)<(o|0)&(q|0)>0){g=0;f=n;while(1){if((c[f>>2]|0)==(o|0))c[f>>2]=m;g=g+1|0;if((g|0)>=(q|0))break;else f=f+4|0}}}m=(m<<16>>16)*7|0;p=k+1310736+(m+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=k+1310736+(m+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;m=k+1310736+(m+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+y;m=q}else{b[e>>1]=0;a[l>>0]=0;m=q}while(0);s=s+1|0;g=r+4|0;e=e+2|0;l=l+1|0;if((s|0)>=(z|0))break;else{r=g;q=m}}}y=y+1|0;if((y|0)>=(A|0)){o=m;C=52;break a}else{l=l+2|0;g=g+t|0;e=e+4|0}}Me(3,3904,B);l=-1}else{o=0;C=52}while(0);if((C|0)==52){e=k+12|0;if((o|0)<1)m=1;else{g=1;m=1;while(1){l=c[n>>2]|0;if((l|0)==(g|0)){l=m;m=m+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[n>>2]=l;if((g|0)<(o|0)){g=g+1|0;n=n+4|0}else break}}f=k+8|0;l=m+-1|0;c[f>>2]=l;if(l){ek(e|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((m|0)>1){l=0;do{C=l<<2;c[k+131084+(C<<2)>>2]=D;c[k+131084+((C|1)<<2)>>2]=0;c[k+131084+((C|2)<<2)>>2]=E;c[k+131084+((C|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[f>>2]|0))}if((o|0)>0){e=0;do{n=(c[k+1179664+(e<<2)>>2]|0)+-1|0;g=e*7|0;l=k+12+(n<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(g<<2)>>2]|0);l=n<<1;m=k+655376+(l<<3)|0;h[m>>3]=+h[m>>3]+ +(c[k+1310736+(g+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(g+2<<2)>>2]|0);n=n<<2;l=k+131084+(n<<2)|0;m=c[k+1310736+(g+3<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;l=k+131084+((n|1)<<2)|0;m=c[k+1310736+(g+4<<2)>>2]|0;if((c[l>>2]|0)<(m|0))c[l>>2]=m;l=k+131084+((n|2)<<2)|0;m=c[k+1310736+(g+5<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;m=k+131084+((n|3)<<2)|0;l=c[k+1310736+(g+6<<2)>>2]|0;if((c[m>>2]|0)<(l|0))c[m>>2]=l;e=e+1|0}while((e|0)<(o|0))}if((c[f>>2]|0)>0){l=0;do{D=k+12+(l<<2)|0;E=l<<1;C=k+655376+(E<<3)|0;h[C>>3]=+h[C>>3]/+(c[D>>2]|0);E=k+655376+((E|1)<<3)|0;h[E>>3]=+h[E>>3]/+(c[D>>2]|0);l=l+1|0}while((l|0)<(c[f>>2]|0));l=0}else l=0}else l=0}i=F;return l|0} +function ec(a){a=a|0;var b=0;b=i;i=i+a|0;i=i+15&-16;return b|0}function fc(){return i|0}function gc(a){a=a|0;i=a}function hc(a,b){a=a|0;b=b|0;i=a;j=b}function ic(a,b){a=a|0;b=b|0;if(!o){o=a;p=b}}function jc(b){b=b|0;a[k>>0]=a[b>>0];a[k+1>>0]=a[b+1>>0];a[k+2>>0]=a[b+2>>0];a[k+3>>0]=a[b+3>>0]}function kc(b){b=b|0;a[k>>0]=a[b>>0];a[k+1>>0]=a[b+1>>0];a[k+2>>0]=a[b+2>>0];a[k+3>>0]=a[b+3>>0];a[k+4>>0]=a[b+4>>0];a[k+5>>0]=a[b+5>>0];a[k+6>>0]=a[b+6>>0];a[k+7>>0]=a[b+7>>0]}function lc(a){a=a|0;D=a}function mc(){return D|0}function nc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;D=i;i=i+16|0;z=D;B=(e|0)/2|0;C=(f|0)/2|0;n=c[j>>2]|0;y=C+-1|0;if((e|0)>1){k=0;l=n;m=n+(($(y,B)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(B|0))break;else{l=l+2|0;m=m+2|0}}}w=g*3|0;x=B+-1|0;if((f|0)>1){k=0;g=n;l=n+(x<<1)|0;while(1){b[l>>1]=0;b[g>>1]=0;k=k+1|0;if((k|0)>=(C|0))break;else{g=g+(B<<1)|0;l=l+(B<<1)|0}}}l=j+1179664|0;t=0-B|0;r=1-B|0;s=~B;q=(e*3|0)+12|0;a:do if((y|0)>1){u=(x|0)>1;v=1;g=a+((e*6|0)+6)|0;m=n+(B+1<<1)|0;k=0;b:while(1){if(u){p=1;o=m;n=k;while(1){do if(((d[g+1>>0]|0)+(d[g>>0]|0)+(d[g+2>>0]|0)|0)>(w|0)){b[o>>1]=0;k=n}else{k=b[o+(t<<1)>>1]|0;if(k<<16>>16>0){b[o>>1]=k;k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}f=b[o+(r<<1)>>1]|0;a=f<<16>>16;k=b[o+(s<<1)>>1]|0;e=k<<16>>16;m=k<<16>>16>0;if(f<<16>>16<=0){if(m){b[o>>1]=k;k=e*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+p;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+v;m=j+1310736+(k+-3<<2)|0;if((c[m>>2]|0)<(p|0))c[m>>2]=p;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}k=b[o+-2>>1]|0;if(k<<16>>16>0){b[o>>1]=k;k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(p|0)){k=n;break}c[k>>2]=p;k=n;break}else{k=n+1|0;if((n|0)>32767)break b;b[o>>1]=k;c[j+1179664+(n<<2)>>2]=k<<16>>16;n=n*7|0;c[j+1310736+(n<<2)>>2]=1;c[j+1310736+(n+1<<2)>>2]=p;c[j+1310736+(n+2<<2)>>2]=v;c[j+1310736+(n+3<<2)>>2]=p;c[j+1310736+(n+4<<2)>>2]=p;c[j+1310736+(n+5<<2)>>2]=v;c[j+1310736+(n+6<<2)>>2]=v;break}}if(m){k=c[j+1179664+(a+-1<<2)>>2]|0;a=c[j+1179664+(e+-1<<2)>>2]|0;if((k|0)>(a|0)){b[o>>1]=a;if((n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(k|0))c[f>>2]=a;m=m+1|0;if((m|0)>=(n|0)){k=a;break}else f=f+4|0}}else k=a}else{b[o>>1]=k;if((k|0)<(a|0)&(n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(a|0))c[f>>2]=k;m=m+1|0;if((m|0)>=(n|0))break;else f=f+4|0}}}k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}m=b[o+-2>>1]|0;if(m<<16>>16<=0){b[o>>1]=f;k=a*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+p;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+v;m=j+1310736+(k+-4<<2)|0;if((c[m>>2]|0)>(p|0))c[m>>2]=p;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}k=c[j+1179664+(a+-1<<2)>>2]|0;a=c[j+1179664+((m<<16>>16)+-1<<2)>>2]|0;if((k|0)>(a|0)){b[o>>1]=a;if((n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(k|0))c[f>>2]=a;m=m+1|0;if((m|0)>=(n|0)){k=a;break}else f=f+4|0}}else k=a}else{b[o>>1]=k;if((k|0)<(a|0)&(n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(a|0))c[f>>2]=k;m=m+1|0;if((m|0)>=(n|0))break;else f=f+4|0}}}k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+v;k=n}while(0);p=p+1|0;g=g+6|0;m=o+2|0;if((p|0)>=(x|0))break;else{o=m;n=k}}}v=v+1|0;if((v|0)>=(y|0)){e=k;A=52;break a}else{g=g+q|0;m=m+4|0}}Me(3,3904,z);k=-1}else{e=0;A=52}while(0);if((A|0)==52){f=j+12|0;if((e|0)<1)g=1;else{m=1;g=1;while(1){k=c[l>>2]|0;if((k|0)==(m|0)){k=g;g=g+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[l>>2]=k;if((m|0)<(e|0)){m=m+1|0;l=l+4|0}else break}}a=j+8|0;k=g+-1|0;c[a>>2]=k;if(k){ek(f|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((g|0)>1){k=0;do{A=k<<2;c[j+131084+(A<<2)>>2]=B;c[j+131084+((A|1)<<2)>>2]=0;c[j+131084+((A|2)<<2)>>2]=C;c[j+131084+((A|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[a>>2]|0))}if((e|0)>0){f=0;do{l=(c[j+1179664+(f<<2)>>2]|0)+-1|0;m=f*7|0;k=j+12+(l<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(m<<2)>>2]|0);k=l<<1;g=j+655376+(k<<3)|0;h[g>>3]=+h[g>>3]+ +(c[j+1310736+(m+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(m+2<<2)>>2]|0);l=l<<2;k=j+131084+(l<<2)|0;g=c[j+1310736+(m+3<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;k=j+131084+((l|1)<<2)|0;g=c[j+1310736+(m+4<<2)>>2]|0;if((c[k>>2]|0)<(g|0))c[k>>2]=g;k=j+131084+((l|2)<<2)|0;g=c[j+1310736+(m+5<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;g=j+131084+((l|3)<<2)|0;k=c[j+1310736+(m+6<<2)>>2]|0;if((c[g>>2]|0)<(k|0))c[g>>2]=k;f=f+1|0}while((f|0)<(e|0))}if((c[a>>2]|0)>0){k=0;do{B=j+12+(k<<2)|0;C=k<<1;A=j+655376+(C<<3)|0;h[A>>3]=+h[A>>3]/+(c[B>>2]|0);C=j+655376+((C|1)<<3)|0;h[C>>3]=+h[C>>3]/+(c[B>>2]|0);k=k+1|0}while((k|0)<(c[a>>2]|0));k=0}else k=0}else k=0}i=D;return k|0}function oc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;D=i;i=i+16|0;z=D;B=(e|0)/2|0;C=(f|0)/2|0;n=c[j>>2]|0;y=C+-1|0;if((e|0)>1){k=0;l=n;m=n+(($(y,B)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(B|0))break;else{l=l+2|0;m=m+2|0}}}w=g*3|0;x=B+-1|0;if((f|0)>1){k=0;g=n;l=n+(x<<1)|0;while(1){b[l>>1]=0;b[g>>1]=0;k=k+1|0;if((k|0)>=(C|0))break;else{g=g+(B<<1)|0;l=l+(B<<1)|0}}}l=j+1179664|0;t=0-B|0;r=1-B|0;s=~B;q=(e<<1)+8|0;a:do if((y|0)>1){u=(x|0)>1;v=1;g=a+((e<<2)+4)|0;m=n+(B+1<<1)|0;k=0;b:while(1){if(u){p=1;o=m;n=k;while(1){a=d[g>>0]|0;e=d[g+1>>0]|0;do if(((a&248)+10+(a<<5&224)+(e>>>3&28)+(e<<3&248)|0)>(w|0)){b[o>>1]=0;k=n}else{k=b[o+(t<<1)>>1]|0;if(k<<16>>16>0){b[o>>1]=k;k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}f=b[o+(r<<1)>>1]|0;a=f<<16>>16;k=b[o+(s<<1)>>1]|0;e=k<<16>>16;m=k<<16>>16>0;if(f<<16>>16<=0){if(m){b[o>>1]=k;k=e*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+p;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+v;m=j+1310736+(k+-3<<2)|0;if((c[m>>2]|0)<(p|0))c[m>>2]=p;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}k=b[o+-2>>1]|0;if(k<<16>>16>0){b[o>>1]=k;k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(p|0)){k=n;break}c[k>>2]=p;k=n;break}else{k=n+1|0;if((n|0)>32767)break b;b[o>>1]=k;c[j+1179664+(n<<2)>>2]=k<<16>>16;n=n*7|0;c[j+1310736+(n<<2)>>2]=1;c[j+1310736+(n+1<<2)>>2]=p;c[j+1310736+(n+2<<2)>>2]=v;c[j+1310736+(n+3<<2)>>2]=p;c[j+1310736+(n+4<<2)>>2]=p;c[j+1310736+(n+5<<2)>>2]=v;c[j+1310736+(n+6<<2)>>2]=v;break}}if(m){k=c[j+1179664+(a+-1<<2)>>2]|0;a=c[j+1179664+(e+-1<<2)>>2]|0;if((k|0)>(a|0)){b[o>>1]=a;if((n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(k|0))c[f>>2]=a;m=m+1|0;if((m|0)>=(n|0)){k=a;break}else f=f+4|0}}else k=a}else{b[o>>1]=k;if((k|0)<(a|0)&(n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(a|0))c[f>>2]=k;m=m+1|0;if((m|0)>=(n|0))break;else f=f+4|0}}}k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}m=b[o+-2>>1]|0;if(m<<16>>16<=0){b[o>>1]=f;k=a*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+p;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+v;m=j+1310736+(k+-4<<2)|0;if((c[m>>2]|0)>(p|0))c[m>>2]=p;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}k=c[j+1179664+(a+-1<<2)>>2]|0;a=c[j+1179664+((m<<16>>16)+-1<<2)>>2]|0;if((k|0)>(a|0)){b[o>>1]=a;if((n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(k|0))c[f>>2]=a;m=m+1|0;if((m|0)>=(n|0)){k=a;break}else f=f+4|0}}else k=a}else{b[o>>1]=k;if((k|0)<(a|0)&(n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(a|0))c[f>>2]=k;m=m+1|0;if((m|0)>=(n|0))break;else f=f+4|0}}}k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+v;k=n}while(0);p=p+1|0;g=g+4|0;m=o+2|0;if((p|0)>=(x|0))break;else{o=m;n=k}}}v=v+1|0;if((v|0)>=(y|0)){e=k;A=52;break a}else{g=g+q|0;m=m+4|0}}Me(3,3904,z);k=-1}else{e=0;A=52}while(0);if((A|0)==52){f=j+12|0;if((e|0)<1)g=1;else{m=1;g=1;while(1){k=c[l>>2]|0;if((k|0)==(m|0)){k=g;g=g+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[l>>2]=k;if((m|0)<(e|0)){m=m+1|0;l=l+4|0}else break}}a=j+8|0;k=g+-1|0;c[a>>2]=k;if(k){ek(f|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((g|0)>1){k=0;do{A=k<<2;c[j+131084+(A<<2)>>2]=B;c[j+131084+((A|1)<<2)>>2]=0;c[j+131084+((A|2)<<2)>>2]=C;c[j+131084+((A|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[a>>2]|0))}if((e|0)>0){f=0;do{l=(c[j+1179664+(f<<2)>>2]|0)+-1|0;m=f*7|0;k=j+12+(l<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(m<<2)>>2]|0);k=l<<1;g=j+655376+(k<<3)|0;h[g>>3]=+h[g>>3]+ +(c[j+1310736+(m+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(m+2<<2)>>2]|0);l=l<<2;k=j+131084+(l<<2)|0;g=c[j+1310736+(m+3<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;k=j+131084+((l|1)<<2)|0;g=c[j+1310736+(m+4<<2)>>2]|0;if((c[k>>2]|0)<(g|0))c[k>>2]=g;k=j+131084+((l|2)<<2)|0;g=c[j+1310736+(m+5<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;g=j+131084+((l|3)<<2)|0;k=c[j+1310736+(m+6<<2)>>2]|0;if((c[g>>2]|0)<(k|0))c[g>>2]=k;f=f+1|0}while((f|0)<(e|0))}if((c[a>>2]|0)>0){k=0;do{B=j+12+(k<<2)|0;C=k<<1;A=j+655376+(C<<3)|0;h[A>>3]=+h[A>>3]/+(c[B>>2]|0);C=j+655376+((C|1)<<3)|0;h[C>>3]=+h[C>>3]/+(c[B>>2]|0);k=k+1|0}while((k|0)<(c[a>>2]|0));k=0}else k=0}else k=0}i=D;return k|0}function pc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;D=i;i=i+16|0;z=D;B=(e|0)/2|0;C=(f|0)/2|0;n=c[j>>2]|0;y=C+-1|0;if((e|0)>1){k=0;l=n;m=n+(($(y,B)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(B|0))break;else{l=l+2|0;m=m+2|0}}}w=g*3|0;x=B+-1|0;if((f|0)>1){k=0;g=n;l=n+(x<<1)|0;while(1){b[l>>1]=0;b[g>>1]=0;k=k+1|0;if((k|0)>=(C|0))break;else{g=g+(B<<1)|0;l=l+(B<<1)|0}}}l=j+1179664|0;t=0-B|0;r=1-B|0;s=~B;q=(e<<2)+16|0;a:do if((y|0)>1){u=(x|0)>1;v=1;g=a+((e<<3)+8)|0;m=n+(B+1<<1)|0;k=0;b:while(1){if(u){p=1;o=m;n=k;while(1){do if(((d[g+1>>0]|0)+(d[g>>0]|0)+(d[g+2>>0]|0)|0)>(w|0)){b[o>>1]=0;k=n}else{k=b[o+(t<<1)>>1]|0;if(k<<16>>16>0){b[o>>1]=k;k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}f=b[o+(r<<1)>>1]|0;a=f<<16>>16;k=b[o+(s<<1)>>1]|0;e=k<<16>>16;m=k<<16>>16>0;if(f<<16>>16<=0){if(m){b[o>>1]=k;k=e*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+p;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+v;m=j+1310736+(k+-3<<2)|0;if((c[m>>2]|0)<(p|0))c[m>>2]=p;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}k=b[o+-2>>1]|0;if(k<<16>>16>0){b[o>>1]=k;k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(p|0)){k=n;break}c[k>>2]=p;k=n;break}else{k=n+1|0;if((n|0)>32767)break b;b[o>>1]=k;c[j+1179664+(n<<2)>>2]=k<<16>>16;n=n*7|0;c[j+1310736+(n<<2)>>2]=1;c[j+1310736+(n+1<<2)>>2]=p;c[j+1310736+(n+2<<2)>>2]=v;c[j+1310736+(n+3<<2)>>2]=p;c[j+1310736+(n+4<<2)>>2]=p;c[j+1310736+(n+5<<2)>>2]=v;c[j+1310736+(n+6<<2)>>2]=v;break}}if(m){k=c[j+1179664+(a+-1<<2)>>2]|0;a=c[j+1179664+(e+-1<<2)>>2]|0;if((k|0)>(a|0)){b[o>>1]=a;if((n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(k|0))c[f>>2]=a;m=m+1|0;if((m|0)>=(n|0)){k=a;break}else f=f+4|0}}else k=a}else{b[o>>1]=k;if((k|0)<(a|0)&(n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(a|0))c[f>>2]=k;m=m+1|0;if((m|0)>=(n|0))break;else f=f+4|0}}}k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}m=b[o+-2>>1]|0;if(m<<16>>16<=0){b[o>>1]=f;k=a*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+p;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+v;m=j+1310736+(k+-4<<2)|0;if((c[m>>2]|0)>(p|0))c[m>>2]=p;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}k=c[j+1179664+(a+-1<<2)>>2]|0;a=c[j+1179664+((m<<16>>16)+-1<<2)>>2]|0;if((k|0)>(a|0)){b[o>>1]=a;if((n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(k|0))c[f>>2]=a;m=m+1|0;if((m|0)>=(n|0)){k=a;break}else f=f+4|0}}else k=a}else{b[o>>1]=k;if((k|0)<(a|0)&(n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(a|0))c[f>>2]=k;m=m+1|0;if((m|0)>=(n|0))break;else f=f+4|0}}}k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+v;k=n}while(0);p=p+1|0;g=g+8|0;m=o+2|0;if((p|0)>=(x|0))break;else{o=m;n=k}}}v=v+1|0;if((v|0)>=(y|0)){e=k;A=52;break a}else{g=g+q|0;m=m+4|0}}Me(3,3904,z);k=-1}else{e=0;A=52}while(0);if((A|0)==52){f=j+12|0;if((e|0)<1)g=1;else{m=1;g=1;while(1){k=c[l>>2]|0;if((k|0)==(m|0)){k=g;g=g+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[l>>2]=k;if((m|0)<(e|0)){m=m+1|0;l=l+4|0}else break}}a=j+8|0;k=g+-1|0;c[a>>2]=k;if(k){ek(f|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((g|0)>1){k=0;do{A=k<<2;c[j+131084+(A<<2)>>2]=B;c[j+131084+((A|1)<<2)>>2]=0;c[j+131084+((A|2)<<2)>>2]=C;c[j+131084+((A|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[a>>2]|0))}if((e|0)>0){f=0;do{l=(c[j+1179664+(f<<2)>>2]|0)+-1|0;m=f*7|0;k=j+12+(l<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(m<<2)>>2]|0);k=l<<1;g=j+655376+(k<<3)|0;h[g>>3]=+h[g>>3]+ +(c[j+1310736+(m+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(m+2<<2)>>2]|0);l=l<<2;k=j+131084+(l<<2)|0;g=c[j+1310736+(m+3<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;k=j+131084+((l|1)<<2)|0;g=c[j+1310736+(m+4<<2)>>2]|0;if((c[k>>2]|0)<(g|0))c[k>>2]=g;k=j+131084+((l|2)<<2)|0;g=c[j+1310736+(m+5<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;g=j+131084+((l|3)<<2)|0;k=c[j+1310736+(m+6<<2)>>2]|0;if((c[g>>2]|0)<(k|0))c[g>>2]=k;f=f+1|0}while((f|0)<(e|0))}if((c[a>>2]|0)>0){k=0;do{B=j+12+(k<<2)|0;C=k<<1;A=j+655376+(C<<3)|0;h[A>>3]=+h[A>>3]/+(c[B>>2]|0);C=j+655376+((C|1)<<3)|0;h[C>>3]=+h[C>>3]/+(c[B>>2]|0);k=k+1|0}while((k|0)<(c[a>>2]|0));k=0}else k=0}else k=0}i=D;return k|0}function qc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;D=i;i=i+16|0;z=D;B=(e|0)/2|0;C=(f|0)/2|0;n=c[j>>2]|0;y=C+-1|0;if((e|0)>1){k=0;l=n;m=n+(($(y,B)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(B|0))break;else{l=l+2|0;m=m+2|0}}}w=g*3|0;x=B+-1|0;if((f|0)>1){k=0;g=n;l=n+(x<<1)|0;while(1){b[l>>1]=0;b[g>>1]=0;k=k+1|0;if((k|0)>=(C|0))break;else{g=g+(B<<1)|0;l=l+(B<<1)|0}}}l=j+1179664|0;t=0-B|0;r=1-B|0;s=~B;q=(e<<1)+8|0;a:do if((y|0)>1){u=(x|0)>1;v=1;g=a+((e<<2)+4)|0;m=n+(B+1<<1)|0;k=0;b:while(1){if(u){p=1;o=m;n=k;while(1){e=d[g>>0]|0;do if(((e&240)+24+(e<<4&240)+((d[g+1>>0]|0)&240)|0)>(w|0)){b[o>>1]=0;k=n}else{k=b[o+(t<<1)>>1]|0;if(k<<16>>16>0){b[o>>1]=k;k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}f=b[o+(r<<1)>>1]|0;a=f<<16>>16;k=b[o+(s<<1)>>1]|0;e=k<<16>>16;m=k<<16>>16>0;if(f<<16>>16<=0){if(m){b[o>>1]=k;k=e*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+p;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+v;m=j+1310736+(k+-3<<2)|0;if((c[m>>2]|0)<(p|0))c[m>>2]=p;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}k=b[o+-2>>1]|0;if(k<<16>>16>0){b[o>>1]=k;k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(p|0)){k=n;break}c[k>>2]=p;k=n;break}else{k=n+1|0;if((n|0)>32767)break b;b[o>>1]=k;c[j+1179664+(n<<2)>>2]=k<<16>>16;n=n*7|0;c[j+1310736+(n<<2)>>2]=1;c[j+1310736+(n+1<<2)>>2]=p;c[j+1310736+(n+2<<2)>>2]=v;c[j+1310736+(n+3<<2)>>2]=p;c[j+1310736+(n+4<<2)>>2]=p;c[j+1310736+(n+5<<2)>>2]=v;c[j+1310736+(n+6<<2)>>2]=v;break}}if(m){k=c[j+1179664+(a+-1<<2)>>2]|0;a=c[j+1179664+(e+-1<<2)>>2]|0;if((k|0)>(a|0)){b[o>>1]=a;if((n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(k|0))c[f>>2]=a;m=m+1|0;if((m|0)>=(n|0)){k=a;break}else f=f+4|0}}else k=a}else{b[o>>1]=k;if((k|0)<(a|0)&(n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(a|0))c[f>>2]=k;m=m+1|0;if((m|0)>=(n|0))break;else f=f+4|0}}}k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}m=b[o+-2>>1]|0;if(m<<16>>16<=0){b[o>>1]=f;k=a*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+p;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+v;m=j+1310736+(k+-4<<2)|0;if((c[m>>2]|0)>(p|0))c[m>>2]=p;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}k=c[j+1179664+(a+-1<<2)>>2]|0;a=c[j+1179664+((m<<16>>16)+-1<<2)>>2]|0;if((k|0)>(a|0)){b[o>>1]=a;if((n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(k|0))c[f>>2]=a;m=m+1|0;if((m|0)>=(n|0)){k=a;break}else f=f+4|0}}else k=a}else{b[o>>1]=k;if((k|0)<(a|0)&(n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(a|0))c[f>>2]=k;m=m+1|0;if((m|0)>=(n|0))break;else f=f+4|0}}}k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+v;k=n}while(0);p=p+1|0;g=g+4|0;m=o+2|0;if((p|0)>=(x|0))break;else{o=m;n=k}}}v=v+1|0;if((v|0)>=(y|0)){e=k;A=52;break a}else{g=g+q|0;m=m+4|0}}Me(3,3904,z);k=-1}else{e=0;A=52}while(0);if((A|0)==52){f=j+12|0;if((e|0)<1)g=1;else{m=1;g=1;while(1){k=c[l>>2]|0;if((k|0)==(m|0)){k=g;g=g+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[l>>2]=k;if((m|0)<(e|0)){m=m+1|0;l=l+4|0}else break}}a=j+8|0;k=g+-1|0;c[a>>2]=k;if(k){ek(f|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((g|0)>1){k=0;do{A=k<<2;c[j+131084+(A<<2)>>2]=B;c[j+131084+((A|1)<<2)>>2]=0;c[j+131084+((A|2)<<2)>>2]=C;c[j+131084+((A|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[a>>2]|0))}if((e|0)>0){f=0;do{l=(c[j+1179664+(f<<2)>>2]|0)+-1|0;m=f*7|0;k=j+12+(l<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(m<<2)>>2]|0);k=l<<1;g=j+655376+(k<<3)|0;h[g>>3]=+h[g>>3]+ +(c[j+1310736+(m+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(m+2<<2)>>2]|0);l=l<<2;k=j+131084+(l<<2)|0;g=c[j+1310736+(m+3<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;k=j+131084+((l|1)<<2)|0;g=c[j+1310736+(m+4<<2)>>2]|0;if((c[k>>2]|0)<(g|0))c[k>>2]=g;k=j+131084+((l|2)<<2)|0;g=c[j+1310736+(m+5<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;g=j+131084+((l|3)<<2)|0;k=c[j+1310736+(m+6<<2)>>2]|0;if((c[g>>2]|0)<(k|0))c[g>>2]=k;f=f+1|0}while((f|0)<(e|0))}if((c[a>>2]|0)>0){k=0;do{B=j+12+(k<<2)|0;C=k<<1;A=j+655376+(C<<3)|0;h[A>>3]=+h[A>>3]/+(c[B>>2]|0);C=j+655376+((C|1)<<3)|0;h[C>>3]=+h[C>>3]/+(c[B>>2]|0);k=k+1|0}while((k|0)<(c[a>>2]|0));k=0}else k=0}else k=0}i=D;return k|0}function rc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;D=i;i=i+16|0;z=D;B=(e|0)/2|0;C=(f|0)/2|0;n=c[j>>2]|0;y=C+-1|0;if((e|0)>1){k=0;l=n;m=n+(($(y,B)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(B|0))break;else{l=l+2|0;m=m+2|0}}}w=g*3|0;x=B+-1|0;if((f|0)>1){k=0;g=n;l=n+(x<<1)|0;while(1){b[l>>1]=0;b[g>>1]=0;k=k+1|0;if((k|0)>=(C|0))break;else{g=g+(B<<1)|0;l=l+(B<<1)|0}}}l=j+1179664|0;t=0-B|0;r=1-B|0;s=~B;q=(e<<1)+8|0;a:do if((y|0)>1){u=(x|0)>1;v=1;g=a+((e<<2)+4)|0;m=n+(B+1<<1)|0;k=0;b:while(1){if(u){p=1;o=m;n=k;while(1){a=d[g>>0]|0;e=d[g+1>>0]|0;do if(((a&248)+12+(a<<5&224)+(e>>>3&24)+(e<<2&248)|0)>(w|0)){b[o>>1]=0;k=n}else{k=b[o+(t<<1)>>1]|0;if(k<<16>>16>0){b[o>>1]=k;k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}f=b[o+(r<<1)>>1]|0;a=f<<16>>16;k=b[o+(s<<1)>>1]|0;e=k<<16>>16;m=k<<16>>16>0;if(f<<16>>16<=0){if(m){b[o>>1]=k;k=e*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+p;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+v;m=j+1310736+(k+-3<<2)|0;if((c[m>>2]|0)<(p|0))c[m>>2]=p;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}k=b[o+-2>>1]|0;if(k<<16>>16>0){b[o>>1]=k;k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(p|0)){k=n;break}c[k>>2]=p;k=n;break}else{k=n+1|0;if((n|0)>32767)break b;b[o>>1]=k;c[j+1179664+(n<<2)>>2]=k<<16>>16;n=n*7|0;c[j+1310736+(n<<2)>>2]=1;c[j+1310736+(n+1<<2)>>2]=p;c[j+1310736+(n+2<<2)>>2]=v;c[j+1310736+(n+3<<2)>>2]=p;c[j+1310736+(n+4<<2)>>2]=p;c[j+1310736+(n+5<<2)>>2]=v;c[j+1310736+(n+6<<2)>>2]=v;break}}if(m){k=c[j+1179664+(a+-1<<2)>>2]|0;a=c[j+1179664+(e+-1<<2)>>2]|0;if((k|0)>(a|0)){b[o>>1]=a;if((n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(k|0))c[f>>2]=a;m=m+1|0;if((m|0)>=(n|0)){k=a;break}else f=f+4|0}}else k=a}else{b[o>>1]=k;if((k|0)<(a|0)&(n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(a|0))c[f>>2]=k;m=m+1|0;if((m|0)>=(n|0))break;else f=f+4|0}}}k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}m=b[o+-2>>1]|0;if(m<<16>>16<=0){b[o>>1]=f;k=a*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+p;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+v;m=j+1310736+(k+-4<<2)|0;if((c[m>>2]|0)>(p|0))c[m>>2]=p;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}k=c[j+1179664+(a+-1<<2)>>2]|0;a=c[j+1179664+((m<<16>>16)+-1<<2)>>2]|0;if((k|0)>(a|0)){b[o>>1]=a;if((n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(k|0))c[f>>2]=a;m=m+1|0;if((m|0)>=(n|0)){k=a;break}else f=f+4|0}}else k=a}else{b[o>>1]=k;if((k|0)<(a|0)&(n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(a|0))c[f>>2]=k;m=m+1|0;if((m|0)>=(n|0))break;else f=f+4|0}}}k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+v;k=n}while(0);p=p+1|0;g=g+4|0;m=o+2|0;if((p|0)>=(x|0))break;else{o=m;n=k}}}v=v+1|0;if((v|0)>=(y|0)){e=k;A=52;break a}else{g=g+q|0;m=m+4|0}}Me(3,3904,z);k=-1}else{e=0;A=52}while(0);if((A|0)==52){f=j+12|0;if((e|0)<1)g=1;else{m=1;g=1;while(1){k=c[l>>2]|0;if((k|0)==(m|0)){k=g;g=g+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[l>>2]=k;if((m|0)<(e|0)){m=m+1|0;l=l+4|0}else break}}a=j+8|0;k=g+-1|0;c[a>>2]=k;if(k){ek(f|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((g|0)>1){k=0;do{A=k<<2;c[j+131084+(A<<2)>>2]=B;c[j+131084+((A|1)<<2)>>2]=0;c[j+131084+((A|2)<<2)>>2]=C;c[j+131084+((A|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[a>>2]|0))}if((e|0)>0){f=0;do{l=(c[j+1179664+(f<<2)>>2]|0)+-1|0;m=f*7|0;k=j+12+(l<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(m<<2)>>2]|0);k=l<<1;g=j+655376+(k<<3)|0;h[g>>3]=+h[g>>3]+ +(c[j+1310736+(m+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(m+2<<2)>>2]|0);l=l<<2;k=j+131084+(l<<2)|0;g=c[j+1310736+(m+3<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;k=j+131084+((l|1)<<2)|0;g=c[j+1310736+(m+4<<2)>>2]|0;if((c[k>>2]|0)<(g|0))c[k>>2]=g;k=j+131084+((l|2)<<2)|0;g=c[j+1310736+(m+5<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;g=j+131084+((l|3)<<2)|0;k=c[j+1310736+(m+6<<2)>>2]|0;if((c[g>>2]|0)<(k|0))c[g>>2]=k;f=f+1|0}while((f|0)<(e|0))}if((c[a>>2]|0)>0){k=0;do{B=j+12+(k<<2)|0;C=k<<1;A=j+655376+(C<<3)|0;h[A>>3]=+h[A>>3]/+(c[B>>2]|0);C=j+655376+((C|1)<<3)|0;h[C>>3]=+h[C>>3]/+(c[B>>2]|0);k=k+1|0}while((k|0)<(c[a>>2]|0));k=0}else k=0}else k=0}i=D;return k|0}function sc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;D=i;i=i+16|0;z=D;B=(e|0)/2|0;C=(f|0)/2|0;n=c[j>>2]|0;y=C+-1|0;if((e|0)>1){k=0;l=n;m=n+(($(y,B)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(B|0))break;else{l=l+2|0;m=m+2|0}}}w=g*3|0;x=B+-1|0;if((f|0)>1){k=0;g=n;l=n+(x<<1)|0;while(1){b[l>>1]=0;b[g>>1]=0;k=k+1|0;if((k|0)>=(C|0))break;else{g=g+(B<<1)|0;l=l+(B<<1)|0}}}l=j+1179664|0;t=0-B|0;r=1-B|0;s=~B;q=(e<<2)+16|0;a:do if((y|0)>1){u=(x|0)>1;v=1;g=a+((e<<3)+8)|0;m=n+(B+1<<1)|0;k=0;b:while(1){if(u){p=1;o=m;n=k;while(1){do if(((d[g+2>>0]|0)+(d[g+1>>0]|0)+(d[g+3>>0]|0)|0)>(w|0)){b[o>>1]=0;k=n}else{k=b[o+(t<<1)>>1]|0;if(k<<16>>16>0){b[o>>1]=k;k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}f=b[o+(r<<1)>>1]|0;a=f<<16>>16;k=b[o+(s<<1)>>1]|0;e=k<<16>>16;m=k<<16>>16>0;if(f<<16>>16<=0){if(m){b[o>>1]=k;k=e*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+p;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+v;m=j+1310736+(k+-3<<2)|0;if((c[m>>2]|0)<(p|0))c[m>>2]=p;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}k=b[o+-2>>1]|0;if(k<<16>>16>0){b[o>>1]=k;k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(p|0)){k=n;break}c[k>>2]=p;k=n;break}else{k=n+1|0;if((n|0)>32767)break b;b[o>>1]=k;c[j+1179664+(n<<2)>>2]=k<<16>>16;n=n*7|0;c[j+1310736+(n<<2)>>2]=1;c[j+1310736+(n+1<<2)>>2]=p;c[j+1310736+(n+2<<2)>>2]=v;c[j+1310736+(n+3<<2)>>2]=p;c[j+1310736+(n+4<<2)>>2]=p;c[j+1310736+(n+5<<2)>>2]=v;c[j+1310736+(n+6<<2)>>2]=v;break}}if(m){k=c[j+1179664+(a+-1<<2)>>2]|0;a=c[j+1179664+(e+-1<<2)>>2]|0;if((k|0)>(a|0)){b[o>>1]=a;if((n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(k|0))c[f>>2]=a;m=m+1|0;if((m|0)>=(n|0)){k=a;break}else f=f+4|0}}else k=a}else{b[o>>1]=k;if((k|0)<(a|0)&(n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(a|0))c[f>>2]=k;m=m+1|0;if((m|0)>=(n|0))break;else f=f+4|0}}}k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}m=b[o+-2>>1]|0;if(m<<16>>16<=0){b[o>>1]=f;k=a*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+p;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+v;m=j+1310736+(k+-4<<2)|0;if((c[m>>2]|0)>(p|0))c[m>>2]=p;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}k=c[j+1179664+(a+-1<<2)>>2]|0;a=c[j+1179664+((m<<16>>16)+-1<<2)>>2]|0;if((k|0)>(a|0)){b[o>>1]=a;if((n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(k|0))c[f>>2]=a;m=m+1|0;if((m|0)>=(n|0)){k=a;break}else f=f+4|0}}else k=a}else{b[o>>1]=k;if((k|0)<(a|0)&(n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(a|0))c[f>>2]=k;m=m+1|0;if((m|0)>=(n|0))break;else f=f+4|0}}}k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+v;k=n}while(0);p=p+1|0;g=g+8|0;m=o+2|0;if((p|0)>=(x|0))break;else{o=m;n=k}}}v=v+1|0;if((v|0)>=(y|0)){e=k;A=52;break a}else{g=g+q|0;m=m+4|0}}Me(3,3904,z);k=-1}else{e=0;A=52}while(0);if((A|0)==52){f=j+12|0;if((e|0)<1)g=1;else{m=1;g=1;while(1){k=c[l>>2]|0;if((k|0)==(m|0)){k=g;g=g+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[l>>2]=k;if((m|0)<(e|0)){m=m+1|0;l=l+4|0}else break}}a=j+8|0;k=g+-1|0;c[a>>2]=k;if(k){ek(f|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((g|0)>1){k=0;do{A=k<<2;c[j+131084+(A<<2)>>2]=B;c[j+131084+((A|1)<<2)>>2]=0;c[j+131084+((A|2)<<2)>>2]=C;c[j+131084+((A|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[a>>2]|0))}if((e|0)>0){f=0;do{l=(c[j+1179664+(f<<2)>>2]|0)+-1|0;m=f*7|0;k=j+12+(l<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(m<<2)>>2]|0);k=l<<1;g=j+655376+(k<<3)|0;h[g>>3]=+h[g>>3]+ +(c[j+1310736+(m+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(m+2<<2)>>2]|0);l=l<<2;k=j+131084+(l<<2)|0;g=c[j+1310736+(m+3<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;k=j+131084+((l|1)<<2)|0;g=c[j+1310736+(m+4<<2)>>2]|0;if((c[k>>2]|0)<(g|0))c[k>>2]=g;k=j+131084+((l|2)<<2)|0;g=c[j+1310736+(m+5<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;g=j+131084+((l|3)<<2)|0;k=c[j+1310736+(m+6<<2)>>2]|0;if((c[g>>2]|0)<(k|0))c[g>>2]=k;f=f+1|0}while((f|0)<(e|0))}if((c[a>>2]|0)>0){k=0;do{B=j+12+(k<<2)|0;C=k<<1;A=j+655376+(C<<3)|0;h[A>>3]=+h[A>>3]/+(c[B>>2]|0);C=j+655376+((C|1)<<3)|0;h[C>>3]=+h[C>>3]/+(c[B>>2]|0);k=k+1|0}while((k|0)<(c[a>>2]|0));k=0}else k=0}else k=0}i=D;return k|0}function tc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;D=i;i=i+16|0;z=D;B=(e|0)/2|0;C=(f|0)/2|0;n=c[j>>2]|0;y=C+-1|0;if((e|0)>1){k=0;l=n;m=n+(($(y,B)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(B|0))break;else{l=l+2|0;m=m+2|0}}}x=B+-1|0;if((f|0)>1){k=0;l=n;m=n+(x<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(C|0))break;else{l=l+(B<<1)|0;m=m+(B<<1)|0}}}m=j+1179664|0;u=0-B|0;s=1-B|0;t=~B;r=e+4|0;a:do if((y|0)>1){v=(x|0)>1;w=1;l=a+((e<<1)+2)|0;f=n+(B+1<<1)|0;k=0;b:while(1){if(v){q=1;p=f;o=k;while(1){do if((d[l>>0]|0|0)>(g|0)){b[p>>1]=0;k=o}else{k=b[p+(u<<1)>>1]|0;if(k<<16>>16>0){b[p>>1]=k;k=(k<<16>>16)*7|0;n=j+1310736+(k+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=j+1310736+(k+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+q;n=j+1310736+(k+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=o;break}a=b[p+(s<<1)>>1]|0;e=a<<16>>16;k=b[p+(t<<1)>>1]|0;n=k<<16>>16;f=k<<16>>16>0;if(a<<16>>16<=0){if(f){b[p>>1]=k;k=n*7|0;f=j+1310736+(k+-7<<2)|0;c[f>>2]=(c[f>>2]|0)+1;f=j+1310736+(k+-6<<2)|0;c[f>>2]=(c[f>>2]|0)+q;f=j+1310736+(k+-5<<2)|0;c[f>>2]=(c[f>>2]|0)+w;f=j+1310736+(k+-3<<2)|0;if((c[f>>2]|0)<(q|0))c[f>>2]=q;c[j+1310736+(k+-1<<2)>>2]=w;k=o;break}k=b[p+-2>>1]|0;if(k<<16>>16>0){b[p>>1]=k;k=(k<<16>>16)*7|0;n=j+1310736+(k+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=j+1310736+(k+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+q;n=j+1310736+(k+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+w;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(q|0)){k=o;break}c[k>>2]=q;k=o;break}else{k=o+1|0;if((o|0)>32767)break b;b[p>>1]=k;c[j+1179664+(o<<2)>>2]=k<<16>>16;o=o*7|0;c[j+1310736+(o<<2)>>2]=1;c[j+1310736+(o+1<<2)>>2]=q;c[j+1310736+(o+2<<2)>>2]=w;c[j+1310736+(o+3<<2)>>2]=q;c[j+1310736+(o+4<<2)>>2]=q;c[j+1310736+(o+5<<2)>>2]=w;c[j+1310736+(o+6<<2)>>2]=w;break}}if(f){k=c[j+1179664+(e+-1<<2)>>2]|0;e=c[j+1179664+(n+-1<<2)>>2]|0;if((k|0)>(e|0)){b[p>>1]=e;if((o|0)>0){f=0;a=m;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=e;f=f+1|0;if((f|0)>=(o|0)){k=e;break}else a=a+4|0}}else k=e}else{b[p>>1]=k;if((k|0)<(e|0)&(o|0)>0){f=0;a=m;while(1){if((c[a>>2]|0)==(e|0))c[a>>2]=k;f=f+1|0;if((f|0)>=(o|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;n=j+1310736+(k+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=j+1310736+(k+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+q;n=j+1310736+(k+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=o;break}f=b[p+-2>>1]|0;if(f<<16>>16<=0){b[p>>1]=a;k=e*7|0;f=j+1310736+(k+-7<<2)|0;c[f>>2]=(c[f>>2]|0)+1;f=j+1310736+(k+-6<<2)|0;c[f>>2]=(c[f>>2]|0)+q;f=j+1310736+(k+-5<<2)|0;c[f>>2]=(c[f>>2]|0)+w;f=j+1310736+(k+-4<<2)|0;if((c[f>>2]|0)>(q|0))c[f>>2]=q;c[j+1310736+(k+-1<<2)>>2]=w;k=o;break}k=c[j+1179664+(e+-1<<2)>>2]|0;e=c[j+1179664+((f<<16>>16)+-1<<2)>>2]|0;if((k|0)>(e|0)){b[p>>1]=e;if((o|0)>0){f=0;a=m;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=e;f=f+1|0;if((f|0)>=(o|0)){k=e;break}else a=a+4|0}}else k=e}else{b[p>>1]=k;if((k|0)<(e|0)&(o|0)>0){f=0;a=m;while(1){if((c[a>>2]|0)==(e|0))c[a>>2]=k;f=f+1|0;if((f|0)>=(o|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;n=j+1310736+(k+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=j+1310736+(k+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+q;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+w;k=o}while(0);q=q+1|0;l=l+2|0;f=p+2|0;if((q|0)>=(x|0))break;else{p=f;o=k}}}w=w+1|0;if((w|0)>=(y|0)){n=k;A=52;break a}else{l=l+r|0;f=f+4|0}}Me(3,3904,z);k=-1}else{n=0;A=52}while(0);if((A|0)==52){a=j+12|0;if((n|0)<1)l=1;else{f=1;l=1;while(1){k=c[m>>2]|0;if((k|0)==(f|0)){k=l;l=l+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[m>>2]=k;if((f|0)<(n|0)){f=f+1|0;m=m+4|0}else break}}e=j+8|0;k=l+-1|0;c[e>>2]=k;if(k){ek(a|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((l|0)>1){k=0;do{A=k<<2;c[j+131084+(A<<2)>>2]=B;c[j+131084+((A|1)<<2)>>2]=0;c[j+131084+((A|2)<<2)>>2]=C;c[j+131084+((A|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[e>>2]|0))}if((n|0)>0){a=0;do{m=(c[j+1179664+(a<<2)>>2]|0)+-1|0;f=a*7|0;k=j+12+(m<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(f<<2)>>2]|0);k=m<<1;l=j+655376+(k<<3)|0;h[l>>3]=+h[l>>3]+ +(c[j+1310736+(f+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(f+2<<2)>>2]|0);m=m<<2;k=j+131084+(m<<2)|0;l=c[j+1310736+(f+3<<2)>>2]|0;if((c[k>>2]|0)>(l|0))c[k>>2]=l;k=j+131084+((m|1)<<2)|0;l=c[j+1310736+(f+4<<2)>>2]|0;if((c[k>>2]|0)<(l|0))c[k>>2]=l;k=j+131084+((m|2)<<2)|0;l=c[j+1310736+(f+5<<2)>>2]|0;if((c[k>>2]|0)>(l|0))c[k>>2]=l;l=j+131084+((m|3)<<2)|0;k=c[j+1310736+(f+6<<2)>>2]|0;if((c[l>>2]|0)<(k|0))c[l>>2]=k;a=a+1|0}while((a|0)<(n|0))}if((c[e>>2]|0)>0){k=0;do{B=j+12+(k<<2)|0;C=k<<1;A=j+655376+(C<<3)|0;h[A>>3]=+h[A>>3]/+(c[B>>2]|0);C=j+655376+((C|1)<<3)|0;h[C>>3]=+h[C>>3]/+(c[B>>2]|0);k=k+1|0}while((k|0)<(c[e>>2]|0));k=0}else k=0}else k=0}i=D;return k|0}function uc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;D=i;i=i+16|0;z=D;B=(e|0)/2|0;C=(f|0)/2|0;n=c[j>>2]|0;y=C+-1|0;if((e|0)>1){k=0;l=n;m=n+(($(y,B)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(B|0))break;else{l=l+2|0;m=m+2|0}}}x=B+-1|0;if((f|0)>1){k=0;l=n;m=n+(x<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(C|0))break;else{l=l+(B<<1)|0;m=m+(B<<1)|0}}}m=j+1179664|0;u=0-B|0;s=1-B|0;t=~B;r=(e<<1)+8|0;a:do if((y|0)>1){v=(x|0)>1;w=1;l=a+((e<<2)+4)|0;f=n+(B+1<<1)|0;k=0;b:while(1){if(v){q=1;p=f;o=k;while(1){do if((d[l+1>>0]|0|0)>(g|0)){b[p>>1]=0;k=o}else{k=b[p+(u<<1)>>1]|0;if(k<<16>>16>0){b[p>>1]=k;k=(k<<16>>16)*7|0;n=j+1310736+(k+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=j+1310736+(k+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+q;n=j+1310736+(k+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=o;break}a=b[p+(s<<1)>>1]|0;e=a<<16>>16;k=b[p+(t<<1)>>1]|0;n=k<<16>>16;f=k<<16>>16>0;if(a<<16>>16<=0){if(f){b[p>>1]=k;k=n*7|0;f=j+1310736+(k+-7<<2)|0;c[f>>2]=(c[f>>2]|0)+1;f=j+1310736+(k+-6<<2)|0;c[f>>2]=(c[f>>2]|0)+q;f=j+1310736+(k+-5<<2)|0;c[f>>2]=(c[f>>2]|0)+w;f=j+1310736+(k+-3<<2)|0;if((c[f>>2]|0)<(q|0))c[f>>2]=q;c[j+1310736+(k+-1<<2)>>2]=w;k=o;break}k=b[p+-2>>1]|0;if(k<<16>>16>0){b[p>>1]=k;k=(k<<16>>16)*7|0;n=j+1310736+(k+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=j+1310736+(k+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+q;n=j+1310736+(k+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+w;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(q|0)){k=o;break}c[k>>2]=q;k=o;break}else{k=o+1|0;if((o|0)>32767)break b;b[p>>1]=k;c[j+1179664+(o<<2)>>2]=k<<16>>16;o=o*7|0;c[j+1310736+(o<<2)>>2]=1;c[j+1310736+(o+1<<2)>>2]=q;c[j+1310736+(o+2<<2)>>2]=w;c[j+1310736+(o+3<<2)>>2]=q;c[j+1310736+(o+4<<2)>>2]=q;c[j+1310736+(o+5<<2)>>2]=w;c[j+1310736+(o+6<<2)>>2]=w;break}}if(f){k=c[j+1179664+(e+-1<<2)>>2]|0;e=c[j+1179664+(n+-1<<2)>>2]|0;if((k|0)>(e|0)){b[p>>1]=e;if((o|0)>0){f=0;a=m;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=e;f=f+1|0;if((f|0)>=(o|0)){k=e;break}else a=a+4|0}}else k=e}else{b[p>>1]=k;if((k|0)<(e|0)&(o|0)>0){f=0;a=m;while(1){if((c[a>>2]|0)==(e|0))c[a>>2]=k;f=f+1|0;if((f|0)>=(o|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;n=j+1310736+(k+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=j+1310736+(k+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+q;n=j+1310736+(k+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=o;break}f=b[p+-2>>1]|0;if(f<<16>>16<=0){b[p>>1]=a;k=e*7|0;f=j+1310736+(k+-7<<2)|0;c[f>>2]=(c[f>>2]|0)+1;f=j+1310736+(k+-6<<2)|0;c[f>>2]=(c[f>>2]|0)+q;f=j+1310736+(k+-5<<2)|0;c[f>>2]=(c[f>>2]|0)+w;f=j+1310736+(k+-4<<2)|0;if((c[f>>2]|0)>(q|0))c[f>>2]=q;c[j+1310736+(k+-1<<2)>>2]=w;k=o;break}k=c[j+1179664+(e+-1<<2)>>2]|0;e=c[j+1179664+((f<<16>>16)+-1<<2)>>2]|0;if((k|0)>(e|0)){b[p>>1]=e;if((o|0)>0){f=0;a=m;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=e;f=f+1|0;if((f|0)>=(o|0)){k=e;break}else a=a+4|0}}else k=e}else{b[p>>1]=k;if((k|0)<(e|0)&(o|0)>0){f=0;a=m;while(1){if((c[a>>2]|0)==(e|0))c[a>>2]=k;f=f+1|0;if((f|0)>=(o|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;n=j+1310736+(k+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=j+1310736+(k+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+q;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+w;k=o}while(0);q=q+1|0;l=l+4|0;f=p+2|0;if((q|0)>=(x|0))break;else{p=f;o=k}}}w=w+1|0;if((w|0)>=(y|0)){n=k;A=52;break a}else{l=l+r|0;f=f+4|0}}Me(3,3904,z);k=-1}else{n=0;A=52}while(0);if((A|0)==52){a=j+12|0;if((n|0)<1)l=1;else{f=1;l=1;while(1){k=c[m>>2]|0;if((k|0)==(f|0)){k=l;l=l+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[m>>2]=k;if((f|0)<(n|0)){f=f+1|0;m=m+4|0}else break}}e=j+8|0;k=l+-1|0;c[e>>2]=k;if(k){ek(a|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((l|0)>1){k=0;do{A=k<<2;c[j+131084+(A<<2)>>2]=B;c[j+131084+((A|1)<<2)>>2]=0;c[j+131084+((A|2)<<2)>>2]=C;c[j+131084+((A|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[e>>2]|0))}if((n|0)>0){a=0;do{m=(c[j+1179664+(a<<2)>>2]|0)+-1|0;f=a*7|0;k=j+12+(m<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(f<<2)>>2]|0);k=m<<1;l=j+655376+(k<<3)|0;h[l>>3]=+h[l>>3]+ +(c[j+1310736+(f+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(f+2<<2)>>2]|0);m=m<<2;k=j+131084+(m<<2)|0;l=c[j+1310736+(f+3<<2)>>2]|0;if((c[k>>2]|0)>(l|0))c[k>>2]=l;k=j+131084+((m|1)<<2)|0;l=c[j+1310736+(f+4<<2)>>2]|0;if((c[k>>2]|0)<(l|0))c[k>>2]=l;k=j+131084+((m|2)<<2)|0;l=c[j+1310736+(f+5<<2)>>2]|0;if((c[k>>2]|0)>(l|0))c[k>>2]=l;l=j+131084+((m|3)<<2)|0;k=c[j+1310736+(f+6<<2)>>2]|0;if((c[l>>2]|0)<(k|0))c[l>>2]=k;a=a+1|0}while((a|0)<(n|0))}if((c[e>>2]|0)>0){k=0;do{B=j+12+(k<<2)|0;C=k<<1;A=j+655376+(C<<3)|0;h[A>>3]=+h[A>>3]/+(c[B>>2]|0);C=j+655376+((C|1)<<3)|0;h[C>>3]=+h[C>>3]/+(c[B>>2]|0);k=k+1|0}while((k|0)<(c[e>>2]|0));k=0}else k=0}else k=0}i=D;return k|0}function vc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;D=i;i=i+16|0;z=D;B=(e|0)/2|0;C=(f|0)/2|0;n=c[j>>2]|0;y=C+-1|0;if((e|0)>1){k=0;l=n;m=n+(($(y,B)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(B|0))break;else{l=l+2|0;m=m+2|0}}}x=B+-1|0;if((f|0)>1){k=0;l=n;m=n+(x<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(C|0))break;else{l=l+(B<<1)|0;m=m+(B<<1)|0}}}m=j+1179664|0;u=0-B|0;s=1-B|0;t=~B;r=(e<<1)+8|0;a:do if((y|0)>1){v=(x|0)>1;w=1;l=a+((e<<2)+4)|0;f=n+(B+1<<1)|0;k=0;b:while(1){if(v){q=1;p=f;o=k;while(1){do if((d[l>>0]|0|0)>(g|0)){b[p>>1]=0;k=o}else{k=b[p+(u<<1)>>1]|0;if(k<<16>>16>0){b[p>>1]=k;k=(k<<16>>16)*7|0;n=j+1310736+(k+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=j+1310736+(k+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+q;n=j+1310736+(k+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=o;break}a=b[p+(s<<1)>>1]|0;e=a<<16>>16;k=b[p+(t<<1)>>1]|0;n=k<<16>>16;f=k<<16>>16>0;if(a<<16>>16<=0){if(f){b[p>>1]=k;k=n*7|0;f=j+1310736+(k+-7<<2)|0;c[f>>2]=(c[f>>2]|0)+1;f=j+1310736+(k+-6<<2)|0;c[f>>2]=(c[f>>2]|0)+q;f=j+1310736+(k+-5<<2)|0;c[f>>2]=(c[f>>2]|0)+w;f=j+1310736+(k+-3<<2)|0;if((c[f>>2]|0)<(q|0))c[f>>2]=q;c[j+1310736+(k+-1<<2)>>2]=w;k=o;break}k=b[p+-2>>1]|0;if(k<<16>>16>0){b[p>>1]=k;k=(k<<16>>16)*7|0;n=j+1310736+(k+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=j+1310736+(k+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+q;n=j+1310736+(k+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+w;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(q|0)){k=o;break}c[k>>2]=q;k=o;break}else{k=o+1|0;if((o|0)>32767)break b;b[p>>1]=k;c[j+1179664+(o<<2)>>2]=k<<16>>16;o=o*7|0;c[j+1310736+(o<<2)>>2]=1;c[j+1310736+(o+1<<2)>>2]=q;c[j+1310736+(o+2<<2)>>2]=w;c[j+1310736+(o+3<<2)>>2]=q;c[j+1310736+(o+4<<2)>>2]=q;c[j+1310736+(o+5<<2)>>2]=w;c[j+1310736+(o+6<<2)>>2]=w;break}}if(f){k=c[j+1179664+(e+-1<<2)>>2]|0;e=c[j+1179664+(n+-1<<2)>>2]|0;if((k|0)>(e|0)){b[p>>1]=e;if((o|0)>0){f=0;a=m;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=e;f=f+1|0;if((f|0)>=(o|0)){k=e;break}else a=a+4|0}}else k=e}else{b[p>>1]=k;if((k|0)<(e|0)&(o|0)>0){f=0;a=m;while(1){if((c[a>>2]|0)==(e|0))c[a>>2]=k;f=f+1|0;if((f|0)>=(o|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;n=j+1310736+(k+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=j+1310736+(k+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+q;n=j+1310736+(k+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=o;break}f=b[p+-2>>1]|0;if(f<<16>>16<=0){b[p>>1]=a;k=e*7|0;f=j+1310736+(k+-7<<2)|0;c[f>>2]=(c[f>>2]|0)+1;f=j+1310736+(k+-6<<2)|0;c[f>>2]=(c[f>>2]|0)+q;f=j+1310736+(k+-5<<2)|0;c[f>>2]=(c[f>>2]|0)+w;f=j+1310736+(k+-4<<2)|0;if((c[f>>2]|0)>(q|0))c[f>>2]=q;c[j+1310736+(k+-1<<2)>>2]=w;k=o;break}k=c[j+1179664+(e+-1<<2)>>2]|0;e=c[j+1179664+((f<<16>>16)+-1<<2)>>2]|0;if((k|0)>(e|0)){b[p>>1]=e;if((o|0)>0){f=0;a=m;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=e;f=f+1|0;if((f|0)>=(o|0)){k=e;break}else a=a+4|0}}else k=e}else{b[p>>1]=k;if((k|0)<(e|0)&(o|0)>0){f=0;a=m;while(1){if((c[a>>2]|0)==(e|0))c[a>>2]=k;f=f+1|0;if((f|0)>=(o|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;n=j+1310736+(k+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=j+1310736+(k+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+q;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+w;k=o}while(0);q=q+1|0;l=l+4|0;f=p+2|0;if((q|0)>=(x|0))break;else{p=f;o=k}}}w=w+1|0;if((w|0)>=(y|0)){n=k;A=52;break a}else{l=l+r|0;f=f+4|0}}Me(3,3904,z);k=-1}else{n=0;A=52}while(0);if((A|0)==52){a=j+12|0;if((n|0)<1)l=1;else{f=1;l=1;while(1){k=c[m>>2]|0;if((k|0)==(f|0)){k=l;l=l+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[m>>2]=k;if((f|0)<(n|0)){f=f+1|0;m=m+4|0}else break}}e=j+8|0;k=l+-1|0;c[e>>2]=k;if(k){ek(a|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((l|0)>1){k=0;do{A=k<<2;c[j+131084+(A<<2)>>2]=B;c[j+131084+((A|1)<<2)>>2]=0;c[j+131084+((A|2)<<2)>>2]=C;c[j+131084+((A|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[e>>2]|0))}if((n|0)>0){a=0;do{m=(c[j+1179664+(a<<2)>>2]|0)+-1|0;f=a*7|0;k=j+12+(m<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(f<<2)>>2]|0);k=m<<1;l=j+655376+(k<<3)|0;h[l>>3]=+h[l>>3]+ +(c[j+1310736+(f+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(f+2<<2)>>2]|0);m=m<<2;k=j+131084+(m<<2)|0;l=c[j+1310736+(f+3<<2)>>2]|0;if((c[k>>2]|0)>(l|0))c[k>>2]=l;k=j+131084+((m|1)<<2)|0;l=c[j+1310736+(f+4<<2)>>2]|0;if((c[k>>2]|0)<(l|0))c[k>>2]=l;k=j+131084+((m|2)<<2)|0;l=c[j+1310736+(f+5<<2)>>2]|0;if((c[k>>2]|0)>(l|0))c[k>>2]=l;l=j+131084+((m|3)<<2)|0;k=c[j+1310736+(f+6<<2)>>2]|0;if((c[l>>2]|0)<(k|0))c[l>>2]=k;a=a+1|0}while((a|0)<(n|0))}if((c[e>>2]|0)>0){k=0;do{B=j+12+(k<<2)|0;C=k<<1;A=j+655376+(C<<3)|0;h[A>>3]=+h[A>>3]/+(c[B>>2]|0);C=j+655376+((C|1)<<3)|0;h[C>>3]=+h[C>>3]/+(c[B>>2]|0);k=k+1|0}while((k|0)<(c[e>>2]|0));k=0}else k=0}else k=0}i=D;return k|0}function wc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=i;i=i+16|0;A=C;n=c[j>>2]|0;z=f+-1|0;if((e|0)>0){k=0;l=n;m=n+(($(z,e)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(e|0))break;else{l=l+2|0;m=m+2|0}}}y=g*3|0;x=e+-1|0;if((f|0)>0){k=0;g=n;l=n+(x<<1)|0;while(1){b[l>>1]=0;b[g>>1]=0;k=k+1|0;if((k|0)>=(f|0))break;else{g=g+(e<<1)|0;l=l+(e<<1)|0}}}l=j+1179664|0;k=e+1|0;u=0-e|0;s=1-e|0;t=~e;a:do if((z|0)>1){v=(x|0)>1;w=1;g=a+(k*3|0)|0;m=n+(k<<1)|0;k=0;b:while(1){if(v){r=1;q=m;p=k;while(1){do if(((d[g+1>>0]|0)+(d[g>>0]|0)+(d[g+2>>0]|0)|0)>(y|0)){b[q>>1]=0;k=p}else{k=b[q+(u<<1)>>1]|0;if(k<<16>>16>0){b[q>>1]=k;k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}a=b[q+(s<<1)>>1]|0;n=a<<16>>16;k=b[q+(t<<1)>>1]|0;o=k<<16>>16;m=k<<16>>16>0;if(a<<16>>16<=0){if(m){b[q>>1]=k;k=o*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+r;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+w;m=j+1310736+(k+-3<<2)|0;if((c[m>>2]|0)<(r|0))c[m>>2]=r;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}k=b[q+-2>>1]|0;if(k<<16>>16>0){b[q>>1]=k;k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(r|0)){k=p;break}c[k>>2]=r;k=p;break}else{k=p+1|0;if((p|0)>32767)break b;b[q>>1]=k;c[j+1179664+(p<<2)>>2]=k<<16>>16;p=p*7|0;c[j+1310736+(p<<2)>>2]=1;c[j+1310736+(p+1<<2)>>2]=r;c[j+1310736+(p+2<<2)>>2]=w;c[j+1310736+(p+3<<2)>>2]=r;c[j+1310736+(p+4<<2)>>2]=r;c[j+1310736+(p+5<<2)>>2]=w;c[j+1310736+(p+6<<2)>>2]=w;break}}if(m){k=c[j+1179664+(n+-1<<2)>>2]|0;n=c[j+1179664+(o+-1<<2)>>2]|0;if((k|0)>(n|0)){b[q>>1]=n;if((p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=n;m=m+1|0;if((m|0)>=(p|0)){k=n;break}else a=a+4|0}}else k=n}else{b[q>>1]=k;if((k|0)<(n|0)&(p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(n|0))c[a>>2]=k;m=m+1|0;if((m|0)>=(p|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}m=b[q+-2>>1]|0;if(m<<16>>16<=0){b[q>>1]=a;k=n*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+r;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+w;m=j+1310736+(k+-4<<2)|0;if((c[m>>2]|0)>(r|0))c[m>>2]=r;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}k=c[j+1179664+(n+-1<<2)>>2]|0;n=c[j+1179664+((m<<16>>16)+-1<<2)>>2]|0;if((k|0)>(n|0)){b[q>>1]=n;if((p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=n;m=m+1|0;if((m|0)>=(p|0)){k=n;break}else a=a+4|0}}else k=n}else{b[q>>1]=k;if((k|0)<(n|0)&(p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(n|0))c[a>>2]=k;m=m+1|0;if((m|0)>=(p|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+w;k=p}while(0);r=r+1|0;g=g+3|0;m=q+2|0;if((r|0)>=(x|0))break;else{q=m;p=k}}}w=w+1|0;if((w|0)>=(z|0)){o=k;B=52;break a}else{g=g+6|0;m=m+4|0}}Me(3,3904,A);k=-1}else{o=0;B=52}while(0);if((B|0)==52){a=j+12|0;if((o|0)<1)g=1;else{m=1;g=1;while(1){k=c[l>>2]|0;if((k|0)==(m|0)){k=g;g=g+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[l>>2]=k;if((m|0)<(o|0)){m=m+1|0;l=l+4|0}else break}}n=j+8|0;k=g+-1|0;c[n>>2]=k;if(k){ek(a|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((g|0)>1){k=0;do{B=k<<2;c[j+131084+(B<<2)>>2]=e;c[j+131084+((B|1)<<2)>>2]=0;c[j+131084+((B|2)<<2)>>2]=f;c[j+131084+((B|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[n>>2]|0))}if((o|0)>0){a=0;do{l=(c[j+1179664+(a<<2)>>2]|0)+-1|0;m=a*7|0;k=j+12+(l<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(m<<2)>>2]|0);k=l<<1;g=j+655376+(k<<3)|0;h[g>>3]=+h[g>>3]+ +(c[j+1310736+(m+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(m+2<<2)>>2]|0);l=l<<2;k=j+131084+(l<<2)|0;g=c[j+1310736+(m+3<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;k=j+131084+((l|1)<<2)|0;g=c[j+1310736+(m+4<<2)>>2]|0;if((c[k>>2]|0)<(g|0))c[k>>2]=g;k=j+131084+((l|2)<<2)|0;g=c[j+1310736+(m+5<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;g=j+131084+((l|3)<<2)|0;k=c[j+1310736+(m+6<<2)>>2]|0;if((c[g>>2]|0)<(k|0))c[g>>2]=k;a=a+1|0}while((a|0)<(o|0))}if((c[n>>2]|0)>0){k=0;do{e=j+12+(k<<2)|0;f=k<<1;B=j+655376+(f<<3)|0;h[B>>3]=+h[B>>3]/+(c[e>>2]|0);f=j+655376+((f|1)<<3)|0;h[f>>3]=+h[f>>3]/+(c[e>>2]|0);k=k+1|0}while((k|0)<(c[n>>2]|0));k=0}else k=0}else k=0}i=C;return k|0}function xc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=i;i=i+16|0;A=C;n=c[j>>2]|0;z=f+-1|0;if((e|0)>0){k=0;l=n;m=n+(($(z,e)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(e|0))break;else{l=l+2|0;m=m+2|0}}}y=g*3|0;x=e+-1|0;if((f|0)>0){k=0;g=n;l=n+(x<<1)|0;while(1){b[l>>1]=0;b[g>>1]=0;k=k+1|0;if((k|0)>=(f|0))break;else{g=g+(e<<1)|0;l=l+(e<<1)|0}}}l=j+1179664|0;k=e+1|0;u=0-e|0;s=1-e|0;t=~e;a:do if((z|0)>1){v=(x|0)>1;w=1;g=a+(k<<1)|0;m=n+(k<<1)|0;k=0;b:while(1){if(v){r=1;q=m;p=k;while(1){n=d[g>>0]|0;o=d[g+1>>0]|0;do if(((n&248)+10+(n<<5&224)+(o>>>3&28)+(o<<3&248)|0)>(y|0)){b[q>>1]=0;k=p}else{k=b[q+(u<<1)>>1]|0;if(k<<16>>16>0){b[q>>1]=k;k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}a=b[q+(s<<1)>>1]|0;n=a<<16>>16;k=b[q+(t<<1)>>1]|0;o=k<<16>>16;m=k<<16>>16>0;if(a<<16>>16<=0){if(m){b[q>>1]=k;k=o*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+r;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+w;m=j+1310736+(k+-3<<2)|0;if((c[m>>2]|0)<(r|0))c[m>>2]=r;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}k=b[q+-2>>1]|0;if(k<<16>>16>0){b[q>>1]=k;k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(r|0)){k=p;break}c[k>>2]=r;k=p;break}else{k=p+1|0;if((p|0)>32767)break b;b[q>>1]=k;c[j+1179664+(p<<2)>>2]=k<<16>>16;p=p*7|0;c[j+1310736+(p<<2)>>2]=1;c[j+1310736+(p+1<<2)>>2]=r;c[j+1310736+(p+2<<2)>>2]=w;c[j+1310736+(p+3<<2)>>2]=r;c[j+1310736+(p+4<<2)>>2]=r;c[j+1310736+(p+5<<2)>>2]=w;c[j+1310736+(p+6<<2)>>2]=w;break}}if(m){k=c[j+1179664+(n+-1<<2)>>2]|0;n=c[j+1179664+(o+-1<<2)>>2]|0;if((k|0)>(n|0)){b[q>>1]=n;if((p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=n;m=m+1|0;if((m|0)>=(p|0)){k=n;break}else a=a+4|0}}else k=n}else{b[q>>1]=k;if((k|0)<(n|0)&(p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(n|0))c[a>>2]=k;m=m+1|0;if((m|0)>=(p|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}m=b[q+-2>>1]|0;if(m<<16>>16<=0){b[q>>1]=a;k=n*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+r;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+w;m=j+1310736+(k+-4<<2)|0;if((c[m>>2]|0)>(r|0))c[m>>2]=r;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}k=c[j+1179664+(n+-1<<2)>>2]|0;n=c[j+1179664+((m<<16>>16)+-1<<2)>>2]|0;if((k|0)>(n|0)){b[q>>1]=n;if((p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=n;m=m+1|0;if((m|0)>=(p|0)){k=n;break}else a=a+4|0}}else k=n}else{b[q>>1]=k;if((k|0)<(n|0)&(p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(n|0))c[a>>2]=k;m=m+1|0;if((m|0)>=(p|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+w;k=p}while(0);r=r+1|0;g=g+2|0;m=q+2|0;if((r|0)>=(x|0))break;else{q=m;p=k}}}w=w+1|0;if((w|0)>=(z|0)){o=k;B=52;break a}else{g=g+4|0;m=m+4|0}}Me(3,3904,A);k=-1}else{o=0;B=52}while(0);if((B|0)==52){a=j+12|0;if((o|0)<1)g=1;else{m=1;g=1;while(1){k=c[l>>2]|0;if((k|0)==(m|0)){k=g;g=g+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[l>>2]=k;if((m|0)<(o|0)){m=m+1|0;l=l+4|0}else break}}n=j+8|0;k=g+-1|0;c[n>>2]=k;if(k){ek(a|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((g|0)>1){k=0;do{B=k<<2;c[j+131084+(B<<2)>>2]=e;c[j+131084+((B|1)<<2)>>2]=0;c[j+131084+((B|2)<<2)>>2]=f;c[j+131084+((B|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[n>>2]|0))}if((o|0)>0){a=0;do{l=(c[j+1179664+(a<<2)>>2]|0)+-1|0;m=a*7|0;k=j+12+(l<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(m<<2)>>2]|0);k=l<<1;g=j+655376+(k<<3)|0;h[g>>3]=+h[g>>3]+ +(c[j+1310736+(m+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(m+2<<2)>>2]|0);l=l<<2;k=j+131084+(l<<2)|0;g=c[j+1310736+(m+3<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;k=j+131084+((l|1)<<2)|0;g=c[j+1310736+(m+4<<2)>>2]|0;if((c[k>>2]|0)<(g|0))c[k>>2]=g;k=j+131084+((l|2)<<2)|0;g=c[j+1310736+(m+5<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;g=j+131084+((l|3)<<2)|0;k=c[j+1310736+(m+6<<2)>>2]|0;if((c[g>>2]|0)<(k|0))c[g>>2]=k;a=a+1|0}while((a|0)<(o|0))}if((c[n>>2]|0)>0){k=0;do{e=j+12+(k<<2)|0;f=k<<1;B=j+655376+(f<<3)|0;h[B>>3]=+h[B>>3]/+(c[e>>2]|0);f=j+655376+((f|1)<<3)|0;h[f>>3]=+h[f>>3]/+(c[e>>2]|0);k=k+1|0}while((k|0)<(c[n>>2]|0));k=0}else k=0}else k=0}i=C;return k|0}function yc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=i;i=i+16|0;A=C;n=c[j>>2]|0;z=f+-1|0;if((e|0)>0){k=0;l=n;m=n+(($(z,e)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(e|0))break;else{l=l+2|0;m=m+2|0}}}y=g*3|0;x=e+-1|0;if((f|0)>0){k=0;g=n;l=n+(x<<1)|0;while(1){b[l>>1]=0;b[g>>1]=0;k=k+1|0;if((k|0)>=(f|0))break;else{g=g+(e<<1)|0;l=l+(e<<1)|0}}}l=j+1179664|0;k=e+1|0;u=0-e|0;s=1-e|0;t=~e;a:do if((z|0)>1){v=(x|0)>1;w=1;g=a+(k<<2)|0;m=n+(k<<1)|0;k=0;b:while(1){if(v){r=1;q=m;p=k;while(1){do if(((d[g+1>>0]|0)+(d[g>>0]|0)+(d[g+2>>0]|0)|0)>(y|0)){b[q>>1]=0;k=p}else{k=b[q+(u<<1)>>1]|0;if(k<<16>>16>0){b[q>>1]=k;k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}a=b[q+(s<<1)>>1]|0;n=a<<16>>16;k=b[q+(t<<1)>>1]|0;o=k<<16>>16;m=k<<16>>16>0;if(a<<16>>16<=0){if(m){b[q>>1]=k;k=o*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+r;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+w;m=j+1310736+(k+-3<<2)|0;if((c[m>>2]|0)<(r|0))c[m>>2]=r;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}k=b[q+-2>>1]|0;if(k<<16>>16>0){b[q>>1]=k;k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(r|0)){k=p;break}c[k>>2]=r;k=p;break}else{k=p+1|0;if((p|0)>32767)break b;b[q>>1]=k;c[j+1179664+(p<<2)>>2]=k<<16>>16;p=p*7|0;c[j+1310736+(p<<2)>>2]=1;c[j+1310736+(p+1<<2)>>2]=r;c[j+1310736+(p+2<<2)>>2]=w;c[j+1310736+(p+3<<2)>>2]=r;c[j+1310736+(p+4<<2)>>2]=r;c[j+1310736+(p+5<<2)>>2]=w;c[j+1310736+(p+6<<2)>>2]=w;break}}if(m){k=c[j+1179664+(n+-1<<2)>>2]|0;n=c[j+1179664+(o+-1<<2)>>2]|0;if((k|0)>(n|0)){b[q>>1]=n;if((p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=n;m=m+1|0;if((m|0)>=(p|0)){k=n;break}else a=a+4|0}}else k=n}else{b[q>>1]=k;if((k|0)<(n|0)&(p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(n|0))c[a>>2]=k;m=m+1|0;if((m|0)>=(p|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}m=b[q+-2>>1]|0;if(m<<16>>16<=0){b[q>>1]=a;k=n*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+r;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+w;m=j+1310736+(k+-4<<2)|0;if((c[m>>2]|0)>(r|0))c[m>>2]=r;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}k=c[j+1179664+(n+-1<<2)>>2]|0;n=c[j+1179664+((m<<16>>16)+-1<<2)>>2]|0;if((k|0)>(n|0)){b[q>>1]=n;if((p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=n;m=m+1|0;if((m|0)>=(p|0)){k=n;break}else a=a+4|0}}else k=n}else{b[q>>1]=k;if((k|0)<(n|0)&(p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(n|0))c[a>>2]=k;m=m+1|0;if((m|0)>=(p|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+w;k=p}while(0);r=r+1|0;g=g+4|0;m=q+2|0;if((r|0)>=(x|0))break;else{q=m;p=k}}}w=w+1|0;if((w|0)>=(z|0)){o=k;B=52;break a}else{g=g+8|0;m=m+4|0}}Me(3,3904,A);k=-1}else{o=0;B=52}while(0);if((B|0)==52){a=j+12|0;if((o|0)<1)g=1;else{m=1;g=1;while(1){k=c[l>>2]|0;if((k|0)==(m|0)){k=g;g=g+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[l>>2]=k;if((m|0)<(o|0)){m=m+1|0;l=l+4|0}else break}}n=j+8|0;k=g+-1|0;c[n>>2]=k;if(k){ek(a|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((g|0)>1){k=0;do{B=k<<2;c[j+131084+(B<<2)>>2]=e;c[j+131084+((B|1)<<2)>>2]=0;c[j+131084+((B|2)<<2)>>2]=f;c[j+131084+((B|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[n>>2]|0))}if((o|0)>0){a=0;do{l=(c[j+1179664+(a<<2)>>2]|0)+-1|0;m=a*7|0;k=j+12+(l<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(m<<2)>>2]|0);k=l<<1;g=j+655376+(k<<3)|0;h[g>>3]=+h[g>>3]+ +(c[j+1310736+(m+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(m+2<<2)>>2]|0);l=l<<2;k=j+131084+(l<<2)|0;g=c[j+1310736+(m+3<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;k=j+131084+((l|1)<<2)|0;g=c[j+1310736+(m+4<<2)>>2]|0;if((c[k>>2]|0)<(g|0))c[k>>2]=g;k=j+131084+((l|2)<<2)|0;g=c[j+1310736+(m+5<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;g=j+131084+((l|3)<<2)|0;k=c[j+1310736+(m+6<<2)>>2]|0;if((c[g>>2]|0)<(k|0))c[g>>2]=k;a=a+1|0}while((a|0)<(o|0))}if((c[n>>2]|0)>0){k=0;do{e=j+12+(k<<2)|0;f=k<<1;B=j+655376+(f<<3)|0;h[B>>3]=+h[B>>3]/+(c[e>>2]|0);f=j+655376+((f|1)<<3)|0;h[f>>3]=+h[f>>3]/+(c[e>>2]|0);k=k+1|0}while((k|0)<(c[n>>2]|0));k=0}else k=0}else k=0}i=C;return k|0}function zc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=i;i=i+16|0;A=C;n=c[j>>2]|0;z=f+-1|0;if((e|0)>0){k=0;l=n;m=n+(($(z,e)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(e|0))break;else{l=l+2|0;m=m+2|0}}}y=g*3|0;x=e+-1|0;if((f|0)>0){k=0;g=n;l=n+(x<<1)|0;while(1){b[l>>1]=0;b[g>>1]=0;k=k+1|0;if((k|0)>=(f|0))break;else{g=g+(e<<1)|0;l=l+(e<<1)|0}}}l=j+1179664|0;k=e+1|0;u=0-e|0;s=1-e|0;t=~e;a:do if((z|0)>1){v=(x|0)>1;w=1;g=a+(k<<1)|0;m=n+(k<<1)|0;k=0;b:while(1){if(v){r=1;q=m;p=k;while(1){o=d[g>>0]|0;do if(((o&240)+24+(o<<4&240)+((d[g+1>>0]|0)&240)|0)>(y|0)){b[q>>1]=0;k=p}else{k=b[q+(u<<1)>>1]|0;if(k<<16>>16>0){b[q>>1]=k;k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}a=b[q+(s<<1)>>1]|0;n=a<<16>>16;k=b[q+(t<<1)>>1]|0;o=k<<16>>16;m=k<<16>>16>0;if(a<<16>>16<=0){if(m){b[q>>1]=k;k=o*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+r;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+w;m=j+1310736+(k+-3<<2)|0;if((c[m>>2]|0)<(r|0))c[m>>2]=r;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}k=b[q+-2>>1]|0;if(k<<16>>16>0){b[q>>1]=k;k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(r|0)){k=p;break}c[k>>2]=r;k=p;break}else{k=p+1|0;if((p|0)>32767)break b;b[q>>1]=k;c[j+1179664+(p<<2)>>2]=k<<16>>16;p=p*7|0;c[j+1310736+(p<<2)>>2]=1;c[j+1310736+(p+1<<2)>>2]=r;c[j+1310736+(p+2<<2)>>2]=w;c[j+1310736+(p+3<<2)>>2]=r;c[j+1310736+(p+4<<2)>>2]=r;c[j+1310736+(p+5<<2)>>2]=w;c[j+1310736+(p+6<<2)>>2]=w;break}}if(m){k=c[j+1179664+(n+-1<<2)>>2]|0;n=c[j+1179664+(o+-1<<2)>>2]|0;if((k|0)>(n|0)){b[q>>1]=n;if((p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=n;m=m+1|0;if((m|0)>=(p|0)){k=n;break}else a=a+4|0}}else k=n}else{b[q>>1]=k;if((k|0)<(n|0)&(p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(n|0))c[a>>2]=k;m=m+1|0;if((m|0)>=(p|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}m=b[q+-2>>1]|0;if(m<<16>>16<=0){b[q>>1]=a;k=n*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+r;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+w;m=j+1310736+(k+-4<<2)|0;if((c[m>>2]|0)>(r|0))c[m>>2]=r;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}k=c[j+1179664+(n+-1<<2)>>2]|0;n=c[j+1179664+((m<<16>>16)+-1<<2)>>2]|0;if((k|0)>(n|0)){b[q>>1]=n;if((p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=n;m=m+1|0;if((m|0)>=(p|0)){k=n;break}else a=a+4|0}}else k=n}else{b[q>>1]=k;if((k|0)<(n|0)&(p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(n|0))c[a>>2]=k;m=m+1|0;if((m|0)>=(p|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+w;k=p}while(0);r=r+1|0;g=g+2|0;m=q+2|0;if((r|0)>=(x|0))break;else{q=m;p=k}}}w=w+1|0;if((w|0)>=(z|0)){o=k;B=52;break a}else{g=g+4|0;m=m+4|0}}Me(3,3904,A);k=-1}else{o=0;B=52}while(0);if((B|0)==52){a=j+12|0;if((o|0)<1)g=1;else{m=1;g=1;while(1){k=c[l>>2]|0;if((k|0)==(m|0)){k=g;g=g+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[l>>2]=k;if((m|0)<(o|0)){m=m+1|0;l=l+4|0}else break}}n=j+8|0;k=g+-1|0;c[n>>2]=k;if(k){ek(a|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((g|0)>1){k=0;do{B=k<<2;c[j+131084+(B<<2)>>2]=e;c[j+131084+((B|1)<<2)>>2]=0;c[j+131084+((B|2)<<2)>>2]=f;c[j+131084+((B|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[n>>2]|0))}if((o|0)>0){a=0;do{l=(c[j+1179664+(a<<2)>>2]|0)+-1|0;m=a*7|0;k=j+12+(l<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(m<<2)>>2]|0);k=l<<1;g=j+655376+(k<<3)|0;h[g>>3]=+h[g>>3]+ +(c[j+1310736+(m+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(m+2<<2)>>2]|0);l=l<<2;k=j+131084+(l<<2)|0;g=c[j+1310736+(m+3<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;k=j+131084+((l|1)<<2)|0;g=c[j+1310736+(m+4<<2)>>2]|0;if((c[k>>2]|0)<(g|0))c[k>>2]=g;k=j+131084+((l|2)<<2)|0;g=c[j+1310736+(m+5<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;g=j+131084+((l|3)<<2)|0;k=c[j+1310736+(m+6<<2)>>2]|0;if((c[g>>2]|0)<(k|0))c[g>>2]=k;a=a+1|0}while((a|0)<(o|0))}if((c[n>>2]|0)>0){k=0;do{e=j+12+(k<<2)|0;f=k<<1;B=j+655376+(f<<3)|0;h[B>>3]=+h[B>>3]/+(c[e>>2]|0);f=j+655376+((f|1)<<3)|0;h[f>>3]=+h[f>>3]/+(c[e>>2]|0);k=k+1|0}while((k|0)<(c[n>>2]|0));k=0}else k=0}else k=0}i=C;return k|0}function Ac(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=i;i=i+16|0;A=C;n=c[j>>2]|0;z=f+-1|0;if((e|0)>0){k=0;l=n;m=n+(($(z,e)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(e|0))break;else{l=l+2|0;m=m+2|0}}}y=g*3|0;x=e+-1|0;if((f|0)>0){k=0;g=n;l=n+(x<<1)|0;while(1){b[l>>1]=0;b[g>>1]=0;k=k+1|0;if((k|0)>=(f|0))break;else{g=g+(e<<1)|0;l=l+(e<<1)|0}}}l=j+1179664|0;k=e+1|0;u=0-e|0;s=1-e|0;t=~e;a:do if((z|0)>1){v=(x|0)>1;w=1;g=a+(k<<1)|0;m=n+(k<<1)|0;k=0;b:while(1){if(v){r=1;q=m;p=k;while(1){n=d[g>>0]|0;o=d[g+1>>0]|0;do if(((n&248)+12+(n<<5&224)+(o>>>3&24)+(o<<2&248)|0)>(y|0)){b[q>>1]=0;k=p}else{k=b[q+(u<<1)>>1]|0;if(k<<16>>16>0){b[q>>1]=k;k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}a=b[q+(s<<1)>>1]|0;n=a<<16>>16;k=b[q+(t<<1)>>1]|0;o=k<<16>>16;m=k<<16>>16>0;if(a<<16>>16<=0){if(m){b[q>>1]=k;k=o*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+r;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+w;m=j+1310736+(k+-3<<2)|0;if((c[m>>2]|0)<(r|0))c[m>>2]=r;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}k=b[q+-2>>1]|0;if(k<<16>>16>0){b[q>>1]=k;k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(r|0)){k=p;break}c[k>>2]=r;k=p;break}else{k=p+1|0;if((p|0)>32767)break b;b[q>>1]=k;c[j+1179664+(p<<2)>>2]=k<<16>>16;p=p*7|0;c[j+1310736+(p<<2)>>2]=1;c[j+1310736+(p+1<<2)>>2]=r;c[j+1310736+(p+2<<2)>>2]=w;c[j+1310736+(p+3<<2)>>2]=r;c[j+1310736+(p+4<<2)>>2]=r;c[j+1310736+(p+5<<2)>>2]=w;c[j+1310736+(p+6<<2)>>2]=w;break}}if(m){k=c[j+1179664+(n+-1<<2)>>2]|0;n=c[j+1179664+(o+-1<<2)>>2]|0;if((k|0)>(n|0)){b[q>>1]=n;if((p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=n;m=m+1|0;if((m|0)>=(p|0)){k=n;break}else a=a+4|0}}else k=n}else{b[q>>1]=k;if((k|0)<(n|0)&(p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(n|0))c[a>>2]=k;m=m+1|0;if((m|0)>=(p|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}m=b[q+-2>>1]|0;if(m<<16>>16<=0){b[q>>1]=a;k=n*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+r;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+w;m=j+1310736+(k+-4<<2)|0;if((c[m>>2]|0)>(r|0))c[m>>2]=r;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}k=c[j+1179664+(n+-1<<2)>>2]|0;n=c[j+1179664+((m<<16>>16)+-1<<2)>>2]|0;if((k|0)>(n|0)){b[q>>1]=n;if((p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=n;m=m+1|0;if((m|0)>=(p|0)){k=n;break}else a=a+4|0}}else k=n}else{b[q>>1]=k;if((k|0)<(n|0)&(p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(n|0))c[a>>2]=k;m=m+1|0;if((m|0)>=(p|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+w;k=p}while(0);r=r+1|0;g=g+2|0;m=q+2|0;if((r|0)>=(x|0))break;else{q=m;p=k}}}w=w+1|0;if((w|0)>=(z|0)){o=k;B=52;break a}else{g=g+4|0;m=m+4|0}}Me(3,3904,A);k=-1}else{o=0;B=52}while(0);if((B|0)==52){a=j+12|0;if((o|0)<1)g=1;else{m=1;g=1;while(1){k=c[l>>2]|0;if((k|0)==(m|0)){k=g;g=g+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[l>>2]=k;if((m|0)<(o|0)){m=m+1|0;l=l+4|0}else break}}n=j+8|0;k=g+-1|0;c[n>>2]=k;if(k){ek(a|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((g|0)>1){k=0;do{B=k<<2;c[j+131084+(B<<2)>>2]=e;c[j+131084+((B|1)<<2)>>2]=0;c[j+131084+((B|2)<<2)>>2]=f;c[j+131084+((B|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[n>>2]|0))}if((o|0)>0){a=0;do{l=(c[j+1179664+(a<<2)>>2]|0)+-1|0;m=a*7|0;k=j+12+(l<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(m<<2)>>2]|0);k=l<<1;g=j+655376+(k<<3)|0;h[g>>3]=+h[g>>3]+ +(c[j+1310736+(m+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(m+2<<2)>>2]|0);l=l<<2;k=j+131084+(l<<2)|0;g=c[j+1310736+(m+3<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;k=j+131084+((l|1)<<2)|0;g=c[j+1310736+(m+4<<2)>>2]|0;if((c[k>>2]|0)<(g|0))c[k>>2]=g;k=j+131084+((l|2)<<2)|0;g=c[j+1310736+(m+5<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;g=j+131084+((l|3)<<2)|0;k=c[j+1310736+(m+6<<2)>>2]|0;if((c[g>>2]|0)<(k|0))c[g>>2]=k;a=a+1|0}while((a|0)<(o|0))}if((c[n>>2]|0)>0){k=0;do{e=j+12+(k<<2)|0;f=k<<1;B=j+655376+(f<<3)|0;h[B>>3]=+h[B>>3]/+(c[e>>2]|0);f=j+655376+((f|1)<<3)|0;h[f>>3]=+h[f>>3]/+(c[e>>2]|0);k=k+1|0}while((k|0)<(c[n>>2]|0));k=0}else k=0}else k=0}i=C;return k|0}function Bc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=i;i=i+16|0;A=C;n=c[j>>2]|0;z=f+-1|0;if((e|0)>0){k=0;l=n;m=n+(($(z,e)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(e|0))break;else{l=l+2|0;m=m+2|0}}}y=g*3|0;x=e+-1|0;if((f|0)>0){k=0;g=n;l=n+(x<<1)|0;while(1){b[l>>1]=0;b[g>>1]=0;k=k+1|0;if((k|0)>=(f|0))break;else{g=g+(e<<1)|0;l=l+(e<<1)|0}}}l=j+1179664|0;k=e+1|0;u=0-e|0;s=1-e|0;t=~e;a:do if((z|0)>1){v=(x|0)>1;w=1;g=a+(k<<2)|0;m=n+(k<<1)|0;k=0;b:while(1){if(v){r=1;q=m;p=k;while(1){do if(((d[g+2>>0]|0)+(d[g+1>>0]|0)+(d[g+3>>0]|0)|0)>(y|0)){b[q>>1]=0;k=p}else{k=b[q+(u<<1)>>1]|0;if(k<<16>>16>0){b[q>>1]=k;k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}a=b[q+(s<<1)>>1]|0;n=a<<16>>16;k=b[q+(t<<1)>>1]|0;o=k<<16>>16;m=k<<16>>16>0;if(a<<16>>16<=0){if(m){b[q>>1]=k;k=o*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+r;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+w;m=j+1310736+(k+-3<<2)|0;if((c[m>>2]|0)<(r|0))c[m>>2]=r;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}k=b[q+-2>>1]|0;if(k<<16>>16>0){b[q>>1]=k;k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(r|0)){k=p;break}c[k>>2]=r;k=p;break}else{k=p+1|0;if((p|0)>32767)break b;b[q>>1]=k;c[j+1179664+(p<<2)>>2]=k<<16>>16;p=p*7|0;c[j+1310736+(p<<2)>>2]=1;c[j+1310736+(p+1<<2)>>2]=r;c[j+1310736+(p+2<<2)>>2]=w;c[j+1310736+(p+3<<2)>>2]=r;c[j+1310736+(p+4<<2)>>2]=r;c[j+1310736+(p+5<<2)>>2]=w;c[j+1310736+(p+6<<2)>>2]=w;break}}if(m){k=c[j+1179664+(n+-1<<2)>>2]|0;n=c[j+1179664+(o+-1<<2)>>2]|0;if((k|0)>(n|0)){b[q>>1]=n;if((p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=n;m=m+1|0;if((m|0)>=(p|0)){k=n;break}else a=a+4|0}}else k=n}else{b[q>>1]=k;if((k|0)<(n|0)&(p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(n|0))c[a>>2]=k;m=m+1|0;if((m|0)>=(p|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}m=b[q+-2>>1]|0;if(m<<16>>16<=0){b[q>>1]=a;k=n*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+r;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+w;m=j+1310736+(k+-4<<2)|0;if((c[m>>2]|0)>(r|0))c[m>>2]=r;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}k=c[j+1179664+(n+-1<<2)>>2]|0;n=c[j+1179664+((m<<16>>16)+-1<<2)>>2]|0;if((k|0)>(n|0)){b[q>>1]=n;if((p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=n;m=m+1|0;if((m|0)>=(p|0)){k=n;break}else a=a+4|0}}else k=n}else{b[q>>1]=k;if((k|0)<(n|0)&(p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(n|0))c[a>>2]=k;m=m+1|0;if((m|0)>=(p|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+w;k=p}while(0);r=r+1|0;g=g+4|0;m=q+2|0;if((r|0)>=(x|0))break;else{q=m;p=k}}}w=w+1|0;if((w|0)>=(z|0)){o=k;B=52;break a}else{g=g+8|0;m=m+4|0}}Me(3,3904,A);k=-1}else{o=0;B=52}while(0);if((B|0)==52){a=j+12|0;if((o|0)<1)g=1;else{m=1;g=1;while(1){k=c[l>>2]|0;if((k|0)==(m|0)){k=g;g=g+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[l>>2]=k;if((m|0)<(o|0)){m=m+1|0;l=l+4|0}else break}}n=j+8|0;k=g+-1|0;c[n>>2]=k;if(k){ek(a|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((g|0)>1){k=0;do{B=k<<2;c[j+131084+(B<<2)>>2]=e;c[j+131084+((B|1)<<2)>>2]=0;c[j+131084+((B|2)<<2)>>2]=f;c[j+131084+((B|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[n>>2]|0))}if((o|0)>0){a=0;do{l=(c[j+1179664+(a<<2)>>2]|0)+-1|0;m=a*7|0;k=j+12+(l<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(m<<2)>>2]|0);k=l<<1;g=j+655376+(k<<3)|0;h[g>>3]=+h[g>>3]+ +(c[j+1310736+(m+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(m+2<<2)>>2]|0);l=l<<2;k=j+131084+(l<<2)|0;g=c[j+1310736+(m+3<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;k=j+131084+((l|1)<<2)|0;g=c[j+1310736+(m+4<<2)>>2]|0;if((c[k>>2]|0)<(g|0))c[k>>2]=g;k=j+131084+((l|2)<<2)|0;g=c[j+1310736+(m+5<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;g=j+131084+((l|3)<<2)|0;k=c[j+1310736+(m+6<<2)>>2]|0;if((c[g>>2]|0)<(k|0))c[g>>2]=k;a=a+1|0}while((a|0)<(o|0))}if((c[n>>2]|0)>0){k=0;do{e=j+12+(k<<2)|0;f=k<<1;B=j+655376+(f<<3)|0;h[B>>3]=+h[B>>3]/+(c[e>>2]|0);f=j+655376+((f|1)<<3)|0;h[f>>3]=+h[f>>3]/+(c[e>>2]|0);k=k+1|0}while((k|0)<(c[n>>2]|0));k=0}else k=0}else k=0}i=C;return k|0}function Cc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=i;i=i+16|0;A=C;n=c[j>>2]|0;z=f+-1|0;if((e|0)>0){k=0;l=n;m=n+(($(z,e)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(e|0))break;else{l=l+2|0;m=m+2|0}}}y=e+-1|0;if((f|0)>0){k=0;l=n;m=n+(y<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(f|0))break;else{l=l+(e<<1)|0;m=m+(e<<1)|0}}}m=j+1179664|0;k=e+1|0;v=0-e|0;t=1-e|0;u=~e;a:do if((z|0)>1){w=(y|0)>1;x=1;l=a+k|0;a=n+(k<<1)|0;k=0;b:while(1){if(w){s=1;r=a;q=k;while(1){do if((d[l>>0]|0|0)>(g|0)){b[r>>1]=0;k=q}else{k=b[r+(v<<1)>>1]|0;if(k<<16>>16>0){b[r>>1]=k;k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=j+1310736+(k+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+x;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}n=b[r+(t<<1)>>1]|0;o=n<<16>>16;k=b[r+(u<<1)>>1]|0;p=k<<16>>16;a=k<<16>>16>0;if(n<<16>>16<=0){if(a){b[r>>1]=k;k=p*7|0;a=j+1310736+(k+-7<<2)|0;c[a>>2]=(c[a>>2]|0)+1;a=j+1310736+(k+-6<<2)|0;c[a>>2]=(c[a>>2]|0)+s;a=j+1310736+(k+-5<<2)|0;c[a>>2]=(c[a>>2]|0)+x;a=j+1310736+(k+-3<<2)|0;if((c[a>>2]|0)<(s|0))c[a>>2]=s;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}k=b[r+-2>>1]|0;if(k<<16>>16>0){b[r>>1]=k;k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=j+1310736+(k+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+x;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(s|0)){k=q;break}c[k>>2]=s;k=q;break}else{k=q+1|0;if((q|0)>32767)break b;b[r>>1]=k;c[j+1179664+(q<<2)>>2]=k<<16>>16;q=q*7|0;c[j+1310736+(q<<2)>>2]=1;c[j+1310736+(q+1<<2)>>2]=s;c[j+1310736+(q+2<<2)>>2]=x;c[j+1310736+(q+3<<2)>>2]=s;c[j+1310736+(q+4<<2)>>2]=s;c[j+1310736+(q+5<<2)>>2]=x;c[j+1310736+(q+6<<2)>>2]=x;break}}if(a){k=c[j+1179664+(o+-1<<2)>>2]|0;o=c[j+1179664+(p+-1<<2)>>2]|0;if((k|0)>(o|0)){b[r>>1]=o;if((q|0)>0){a=0;n=m;while(1){if((c[n>>2]|0)==(k|0))c[n>>2]=o;a=a+1|0;if((a|0)>=(q|0)){k=o;break}else n=n+4|0}}else k=o}else{b[r>>1]=k;if((k|0)<(o|0)&(q|0)>0){a=0;n=m;while(1){if((c[n>>2]|0)==(o|0))c[n>>2]=k;a=a+1|0;if((a|0)>=(q|0))break;else n=n+4|0}}}k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=j+1310736+(k+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+x;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}k=b[r+-2>>1]|0;if(k<<16>>16<=0){b[r>>1]=n;k=o*7|0;a=j+1310736+(k+-7<<2)|0;c[a>>2]=(c[a>>2]|0)+1;a=j+1310736+(k+-6<<2)|0;c[a>>2]=(c[a>>2]|0)+s;a=j+1310736+(k+-5<<2)|0;c[a>>2]=(c[a>>2]|0)+x;a=j+1310736+(k+-4<<2)|0;if((c[a>>2]|0)>(s|0))c[a>>2]=s;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}o=c[j+1179664+(o+-1<<2)>>2]|0;k=c[j+1179664+((k<<16>>16)+-1<<2)>>2]|0;if((o|0)>(k|0)){b[r>>1]=k;if((q|0)>0){a=0;n=m;while(1){if((c[n>>2]|0)==(o|0))c[n>>2]=k;a=a+1|0;if((a|0)>=(q|0))break;else n=n+4|0}}}else{b[r>>1]=o;if((o|0)<(k|0)&(q|0)>0){a=0;n=m;while(1){if((c[n>>2]|0)==(k|0))c[n>>2]=o;a=a+1|0;if((a|0)>=(q|0)){k=o;break}else n=n+4|0}}else k=o}k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+x;k=q}while(0);s=s+1|0;l=l+1|0;a=r+2|0;if((s|0)>=(y|0))break;else{r=a;q=k}}}x=x+1|0;if((x|0)>=(z|0)){p=k;B=52;break a}else{l=l+2|0;a=a+4|0}}Me(3,3904,A);k=-1}else{p=0;B=52}while(0);if((B|0)==52){n=j+12|0;if((p|0)<1)l=1;else{a=1;l=1;while(1){k=c[m>>2]|0;if((k|0)==(a|0)){k=l;l=l+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[m>>2]=k;if((a|0)<(p|0)){a=a+1|0;m=m+4|0}else break}}o=j+8|0;k=l+-1|0;c[o>>2]=k;if(k){ek(n|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((l|0)>1){k=0;do{B=k<<2;c[j+131084+(B<<2)>>2]=e;c[j+131084+((B|1)<<2)>>2]=0;c[j+131084+((B|2)<<2)>>2]=f;c[j+131084+((B|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[o>>2]|0))}if((p|0)>0){n=0;do{m=(c[j+1179664+(n<<2)>>2]|0)+-1|0;a=n*7|0;k=j+12+(m<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(a<<2)>>2]|0);k=m<<1;l=j+655376+(k<<3)|0;h[l>>3]=+h[l>>3]+ +(c[j+1310736+(a+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(a+2<<2)>>2]|0);m=m<<2;k=j+131084+(m<<2)|0;l=c[j+1310736+(a+3<<2)>>2]|0;if((c[k>>2]|0)>(l|0))c[k>>2]=l;k=j+131084+((m|1)<<2)|0;l=c[j+1310736+(a+4<<2)>>2]|0;if((c[k>>2]|0)<(l|0))c[k>>2]=l;k=j+131084+((m|2)<<2)|0;l=c[j+1310736+(a+5<<2)>>2]|0;if((c[k>>2]|0)>(l|0))c[k>>2]=l;l=j+131084+((m|3)<<2)|0;k=c[j+1310736+(a+6<<2)>>2]|0;if((c[l>>2]|0)<(k|0))c[l>>2]=k;n=n+1|0}while((n|0)<(p|0))}if((c[o>>2]|0)>0){k=0;do{e=j+12+(k<<2)|0;f=k<<1;B=j+655376+(f<<3)|0;h[B>>3]=+h[B>>3]/+(c[e>>2]|0);f=j+655376+((f|1)<<3)|0;h[f>>3]=+h[f>>3]/+(c[e>>2]|0);k=k+1|0}while((k|0)<(c[o>>2]|0));k=0}else k=0}else k=0}i=C;return k|0}function Dc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=i;i=i+16|0;A=C;n=c[j>>2]|0;z=f+-1|0;if((e|0)>0){k=0;l=n;m=n+(($(z,e)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(e|0))break;else{l=l+2|0;m=m+2|0}}}y=e+-1|0;if((f|0)>0){k=0;l=n;m=n+(y<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(f|0))break;else{l=l+(e<<1)|0;m=m+(e<<1)|0}}}m=j+1179664|0;k=e+1|0;v=0-e|0;t=1-e|0;u=~e;a:do if((z|0)>1){w=(y|0)>1;x=1;l=a+(k<<1)|0;a=n+(k<<1)|0;k=0;b:while(1){if(w){s=1;r=a;q=k;while(1){do if((d[l+1>>0]|0|0)>(g|0)){b[r>>1]=0;k=q}else{k=b[r+(v<<1)>>1]|0;if(k<<16>>16>0){b[r>>1]=k;k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=j+1310736+(k+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+x;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}n=b[r+(t<<1)>>1]|0;o=n<<16>>16;k=b[r+(u<<1)>>1]|0;p=k<<16>>16;a=k<<16>>16>0;if(n<<16>>16<=0){if(a){b[r>>1]=k;k=p*7|0;a=j+1310736+(k+-7<<2)|0;c[a>>2]=(c[a>>2]|0)+1;a=j+1310736+(k+-6<<2)|0;c[a>>2]=(c[a>>2]|0)+s;a=j+1310736+(k+-5<<2)|0;c[a>>2]=(c[a>>2]|0)+x;a=j+1310736+(k+-3<<2)|0;if((c[a>>2]|0)<(s|0))c[a>>2]=s;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}k=b[r+-2>>1]|0;if(k<<16>>16>0){b[r>>1]=k;k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=j+1310736+(k+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+x;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(s|0)){k=q;break}c[k>>2]=s;k=q;break}else{k=q+1|0;if((q|0)>32767)break b;b[r>>1]=k;c[j+1179664+(q<<2)>>2]=k<<16>>16;q=q*7|0;c[j+1310736+(q<<2)>>2]=1;c[j+1310736+(q+1<<2)>>2]=s;c[j+1310736+(q+2<<2)>>2]=x;c[j+1310736+(q+3<<2)>>2]=s;c[j+1310736+(q+4<<2)>>2]=s;c[j+1310736+(q+5<<2)>>2]=x;c[j+1310736+(q+6<<2)>>2]=x;break}}if(a){k=c[j+1179664+(o+-1<<2)>>2]|0;o=c[j+1179664+(p+-1<<2)>>2]|0;if((k|0)>(o|0)){b[r>>1]=o;if((q|0)>0){a=0;n=m;while(1){if((c[n>>2]|0)==(k|0))c[n>>2]=o;a=a+1|0;if((a|0)>=(q|0)){k=o;break}else n=n+4|0}}else k=o}else{b[r>>1]=k;if((k|0)<(o|0)&(q|0)>0){a=0;n=m;while(1){if((c[n>>2]|0)==(o|0))c[n>>2]=k;a=a+1|0;if((a|0)>=(q|0))break;else n=n+4|0}}}k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=j+1310736+(k+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+x;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}a=b[r+-2>>1]|0;if(a<<16>>16<=0){b[r>>1]=n;k=o*7|0;a=j+1310736+(k+-7<<2)|0;c[a>>2]=(c[a>>2]|0)+1;a=j+1310736+(k+-6<<2)|0;c[a>>2]=(c[a>>2]|0)+s;a=j+1310736+(k+-5<<2)|0;c[a>>2]=(c[a>>2]|0)+x;a=j+1310736+(k+-4<<2)|0;if((c[a>>2]|0)>(s|0))c[a>>2]=s;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}k=c[j+1179664+(o+-1<<2)>>2]|0;o=c[j+1179664+((a<<16>>16)+-1<<2)>>2]|0;if((k|0)>(o|0)){b[r>>1]=o;if((q|0)>0){a=0;n=m;while(1){if((c[n>>2]|0)==(k|0))c[n>>2]=o;a=a+1|0;if((a|0)>=(q|0)){k=o;break}else n=n+4|0}}else k=o}else{b[r>>1]=k;if((k|0)<(o|0)&(q|0)>0){a=0;n=m;while(1){if((c[n>>2]|0)==(o|0))c[n>>2]=k;a=a+1|0;if((a|0)>=(q|0))break;else n=n+4|0}}}k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+x;k=q}while(0);s=s+1|0;l=l+2|0;a=r+2|0;if((s|0)>=(y|0))break;else{r=a;q=k}}}x=x+1|0;if((x|0)>=(z|0)){p=k;B=52;break a}else{l=l+4|0;a=a+4|0}}Me(3,3904,A);k=-1}else{p=0;B=52}while(0);if((B|0)==52){n=j+12|0;if((p|0)<1)l=1;else{a=1;l=1;while(1){k=c[m>>2]|0;if((k|0)==(a|0)){k=l;l=l+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[m>>2]=k;if((a|0)<(p|0)){a=a+1|0;m=m+4|0}else break}}o=j+8|0;k=l+-1|0;c[o>>2]=k;if(k){ek(n|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((l|0)>1){k=0;do{B=k<<2;c[j+131084+(B<<2)>>2]=e;c[j+131084+((B|1)<<2)>>2]=0;c[j+131084+((B|2)<<2)>>2]=f;c[j+131084+((B|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[o>>2]|0))}if((p|0)>0){n=0;do{m=(c[j+1179664+(n<<2)>>2]|0)+-1|0;a=n*7|0;k=j+12+(m<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(a<<2)>>2]|0);k=m<<1;l=j+655376+(k<<3)|0;h[l>>3]=+h[l>>3]+ +(c[j+1310736+(a+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(a+2<<2)>>2]|0);m=m<<2;k=j+131084+(m<<2)|0;l=c[j+1310736+(a+3<<2)>>2]|0;if((c[k>>2]|0)>(l|0))c[k>>2]=l;k=j+131084+((m|1)<<2)|0;l=c[j+1310736+(a+4<<2)>>2]|0;if((c[k>>2]|0)<(l|0))c[k>>2]=l;k=j+131084+((m|2)<<2)|0;l=c[j+1310736+(a+5<<2)>>2]|0;if((c[k>>2]|0)>(l|0))c[k>>2]=l;l=j+131084+((m|3)<<2)|0;k=c[j+1310736+(a+6<<2)>>2]|0;if((c[l>>2]|0)<(k|0))c[l>>2]=k;n=n+1|0}while((n|0)<(p|0))}if((c[o>>2]|0)>0){k=0;do{e=j+12+(k<<2)|0;f=k<<1;B=j+655376+(f<<3)|0;h[B>>3]=+h[B>>3]/+(c[e>>2]|0);f=j+655376+((f|1)<<3)|0;h[f>>3]=+h[f>>3]/+(c[e>>2]|0);k=k+1|0}while((k|0)<(c[o>>2]|0));k=0}else k=0}else k=0}i=C;return k|0}function Ec(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=i;i=i+16|0;A=C;n=c[j>>2]|0;z=f+-1|0;if((e|0)>0){k=0;l=n;m=n+(($(z,e)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(e|0))break;else{l=l+2|0;m=m+2|0}}}y=e+-1|0;if((f|0)>0){k=0;l=n;m=n+(y<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(f|0))break;else{l=l+(e<<1)|0;m=m+(e<<1)|0}}}m=j+1179664|0;k=e+1|0;v=0-e|0;t=1-e|0;u=~e;a:do if((z|0)>1){w=(y|0)>1;x=1;l=a+(k<<1)|0;a=n+(k<<1)|0;k=0;b:while(1){if(w){s=1;r=a;q=k;while(1){do if((d[l>>0]|0|0)>(g|0)){b[r>>1]=0;k=q}else{k=b[r+(v<<1)>>1]|0;if(k<<16>>16>0){b[r>>1]=k;k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=j+1310736+(k+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+x;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}n=b[r+(t<<1)>>1]|0;o=n<<16>>16;k=b[r+(u<<1)>>1]|0;p=k<<16>>16;a=k<<16>>16>0;if(n<<16>>16<=0){if(a){b[r>>1]=k;k=p*7|0;a=j+1310736+(k+-7<<2)|0;c[a>>2]=(c[a>>2]|0)+1;a=j+1310736+(k+-6<<2)|0;c[a>>2]=(c[a>>2]|0)+s;a=j+1310736+(k+-5<<2)|0;c[a>>2]=(c[a>>2]|0)+x;a=j+1310736+(k+-3<<2)|0;if((c[a>>2]|0)<(s|0))c[a>>2]=s;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}k=b[r+-2>>1]|0;if(k<<16>>16>0){b[r>>1]=k;k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=j+1310736+(k+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+x;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(s|0)){k=q;break}c[k>>2]=s;k=q;break}else{k=q+1|0;if((q|0)>32767)break b;b[r>>1]=k;c[j+1179664+(q<<2)>>2]=k<<16>>16;q=q*7|0;c[j+1310736+(q<<2)>>2]=1;c[j+1310736+(q+1<<2)>>2]=s;c[j+1310736+(q+2<<2)>>2]=x;c[j+1310736+(q+3<<2)>>2]=s;c[j+1310736+(q+4<<2)>>2]=s;c[j+1310736+(q+5<<2)>>2]=x;c[j+1310736+(q+6<<2)>>2]=x;break}}if(a){k=c[j+1179664+(o+-1<<2)>>2]|0;o=c[j+1179664+(p+-1<<2)>>2]|0;if((k|0)>(o|0)){b[r>>1]=o;if((q|0)>0){a=0;n=m;while(1){if((c[n>>2]|0)==(k|0))c[n>>2]=o;a=a+1|0;if((a|0)>=(q|0)){k=o;break}else n=n+4|0}}else k=o}else{b[r>>1]=k;if((k|0)<(o|0)&(q|0)>0){a=0;n=m;while(1){if((c[n>>2]|0)==(o|0))c[n>>2]=k;a=a+1|0;if((a|0)>=(q|0))break;else n=n+4|0}}}k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=j+1310736+(k+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+x;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}k=b[r+-2>>1]|0;if(k<<16>>16<=0){b[r>>1]=n;k=o*7|0;a=j+1310736+(k+-7<<2)|0;c[a>>2]=(c[a>>2]|0)+1;a=j+1310736+(k+-6<<2)|0;c[a>>2]=(c[a>>2]|0)+s;a=j+1310736+(k+-5<<2)|0;c[a>>2]=(c[a>>2]|0)+x;a=j+1310736+(k+-4<<2)|0;if((c[a>>2]|0)>(s|0))c[a>>2]=s;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}o=c[j+1179664+(o+-1<<2)>>2]|0;k=c[j+1179664+((k<<16>>16)+-1<<2)>>2]|0;if((o|0)>(k|0)){b[r>>1]=k;if((q|0)>0){a=0;n=m;while(1){if((c[n>>2]|0)==(o|0))c[n>>2]=k;a=a+1|0;if((a|0)>=(q|0))break;else n=n+4|0}}}else{b[r>>1]=o;if((o|0)<(k|0)&(q|0)>0){a=0;n=m;while(1){if((c[n>>2]|0)==(k|0))c[n>>2]=o;a=a+1|0;if((a|0)>=(q|0)){k=o;break}else n=n+4|0}}else k=o}k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+x;k=q}while(0);s=s+1|0;l=l+2|0;a=r+2|0;if((s|0)>=(y|0))break;else{r=a;q=k}}}x=x+1|0;if((x|0)>=(z|0)){p=k;B=52;break a}else{l=l+4|0;a=a+4|0}}Me(3,3904,A);k=-1}else{p=0;B=52}while(0);if((B|0)==52){n=j+12|0;if((p|0)<1)l=1;else{a=1;l=1;while(1){k=c[m>>2]|0;if((k|0)==(a|0)){k=l;l=l+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[m>>2]=k;if((a|0)<(p|0)){a=a+1|0;m=m+4|0}else break}}o=j+8|0;k=l+-1|0;c[o>>2]=k;if(k){ek(n|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((l|0)>1){k=0;do{B=k<<2;c[j+131084+(B<<2)>>2]=e;c[j+131084+((B|1)<<2)>>2]=0;c[j+131084+((B|2)<<2)>>2]=f;c[j+131084+((B|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[o>>2]|0))}if((p|0)>0){n=0;do{m=(c[j+1179664+(n<<2)>>2]|0)+-1|0;a=n*7|0;k=j+12+(m<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(a<<2)>>2]|0);k=m<<1;l=j+655376+(k<<3)|0;h[l>>3]=+h[l>>3]+ +(c[j+1310736+(a+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(a+2<<2)>>2]|0);m=m<<2;k=j+131084+(m<<2)|0;l=c[j+1310736+(a+3<<2)>>2]|0;if((c[k>>2]|0)>(l|0))c[k>>2]=l;k=j+131084+((m|1)<<2)|0;l=c[j+1310736+(a+4<<2)>>2]|0;if((c[k>>2]|0)<(l|0))c[k>>2]=l;k=j+131084+((m|2)<<2)|0;l=c[j+1310736+(a+5<<2)>>2]|0;if((c[k>>2]|0)>(l|0))c[k>>2]=l;l=j+131084+((m|3)<<2)|0;k=c[j+1310736+(a+6<<2)>>2]|0;if((c[l>>2]|0)<(k|0))c[l>>2]=k;n=n+1|0}while((n|0)<(p|0))}if((c[o>>2]|0)>0){k=0;do{e=j+12+(k<<2)|0;f=k<<1;B=j+655376+(f<<3)|0;h[B>>3]=+h[B>>3]/+(c[e>>2]|0);f=j+655376+((f|1)<<3)|0;h[f>>3]=+h[f>>3]/+(c[e>>2]|0);k=k+1|0}while((k|0)<(c[o>>2]|0));k=0}else k=0}else k=0}i=C;return k|0}function Fc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=i;i=i+16|0;A=C;n=c[j>>2]|0;z=f+-1|0;if((e|0)>0){k=0;l=n;m=n+(($(z,e)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(e|0))break;else{l=l+2|0;m=m+2|0}}}y=e+-1|0;if((f|0)>0){k=0;l=n;m=n+(y<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(f|0))break;else{l=l+(e<<1)|0;m=m+(e<<1)|0}}}m=j+1179664|0;k=e+1|0;v=0-e|0;t=1-e|0;u=~e;a:do if((z|0)>1){w=(y|0)>1;x=1;l=a+k|0;a=n+(k<<1)|0;n=g+k|0;k=0;b:while(1){if(w){s=1;r=l;q=k;while(1){do if((d[r>>0]|0)>(d[n>>0]|0)){b[a>>1]=0;k=q}else{k=b[a+(v<<1)>>1]|0;if(k<<16>>16>0){b[a>>1]=k;k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=j+1310736+(k+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+x;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}g=b[a+(t<<1)>>1]|0;o=g<<16>>16;k=b[a+(u<<1)>>1]|0;p=k<<16>>16;l=k<<16>>16>0;if(g<<16>>16<=0){if(l){b[a>>1]=k;k=p*7|0;l=j+1310736+(k+-7<<2)|0;c[l>>2]=(c[l>>2]|0)+1;l=j+1310736+(k+-6<<2)|0;c[l>>2]=(c[l>>2]|0)+s;l=j+1310736+(k+-5<<2)|0;c[l>>2]=(c[l>>2]|0)+x;l=j+1310736+(k+-3<<2)|0;if((c[l>>2]|0)<(s|0))c[l>>2]=s;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}k=b[a+-2>>1]|0;if(k<<16>>16>0){b[a>>1]=k;k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=j+1310736+(k+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+x;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(s|0)){k=q;break}c[k>>2]=s;k=q;break}else{k=q+1|0;if((q|0)>32767)break b;b[a>>1]=k;c[j+1179664+(q<<2)>>2]=k<<16>>16;q=q*7|0;c[j+1310736+(q<<2)>>2]=1;c[j+1310736+(q+1<<2)>>2]=s;c[j+1310736+(q+2<<2)>>2]=x;c[j+1310736+(q+3<<2)>>2]=s;c[j+1310736+(q+4<<2)>>2]=s;c[j+1310736+(q+5<<2)>>2]=x;c[j+1310736+(q+6<<2)>>2]=x;break}}if(l){k=c[j+1179664+(o+-1<<2)>>2]|0;o=c[j+1179664+(p+-1<<2)>>2]|0;if((k|0)>(o|0)){b[a>>1]=o;if((q|0)>0){l=0;g=m;while(1){if((c[g>>2]|0)==(k|0))c[g>>2]=o;l=l+1|0;if((l|0)>=(q|0)){k=o;break}else g=g+4|0}}else k=o}else{b[a>>1]=k;if((k|0)<(o|0)&(q|0)>0){l=0;g=m;while(1){if((c[g>>2]|0)==(o|0))c[g>>2]=k;l=l+1|0;if((l|0)>=(q|0))break;else g=g+4|0}}}k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=j+1310736+(k+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+x;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}k=b[a+-2>>1]|0;if(k<<16>>16<=0){b[a>>1]=g;k=o*7|0;l=j+1310736+(k+-7<<2)|0;c[l>>2]=(c[l>>2]|0)+1;l=j+1310736+(k+-6<<2)|0;c[l>>2]=(c[l>>2]|0)+s;l=j+1310736+(k+-5<<2)|0;c[l>>2]=(c[l>>2]|0)+x;l=j+1310736+(k+-4<<2)|0;if((c[l>>2]|0)>(s|0))c[l>>2]=s;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}o=c[j+1179664+(o+-1<<2)>>2]|0;k=c[j+1179664+((k<<16>>16)+-1<<2)>>2]|0;if((o|0)>(k|0)){b[a>>1]=k;if((q|0)>0){l=0;g=m;while(1){if((c[g>>2]|0)==(o|0))c[g>>2]=k;l=l+1|0;if((l|0)>=(q|0))break;else g=g+4|0}}}else{b[a>>1]=o;if((o|0)<(k|0)&(q|0)>0){l=0;g=m;while(1){if((c[g>>2]|0)==(k|0))c[g>>2]=o;l=l+1|0;if((l|0)>=(q|0)){k=o;break}else g=g+4|0}}else k=o}k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+x;k=q}while(0);s=s+1|0;l=r+1|0;n=n+1|0;a=a+2|0;if((s|0)>=(y|0))break;else{r=l;q=k}}}x=x+1|0;if((x|0)>=(z|0)){o=k;B=52;break a}else{l=l+2|0;a=a+4|0;n=n+2|0}}Me(3,3904,A);k=-1}else{o=0;B=52}while(0);if((B|0)==52){n=j+12|0;if((o|0)<1)l=1;else{a=1;l=1;while(1){k=c[m>>2]|0;if((k|0)==(a|0)){k=l;l=l+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[m>>2]=k;if((a|0)<(o|0)){a=a+1|0;m=m+4|0}else break}}g=j+8|0;k=l+-1|0;c[g>>2]=k;if(k){ek(n|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((l|0)>1){k=0;do{B=k<<2;c[j+131084+(B<<2)>>2]=e;c[j+131084+((B|1)<<2)>>2]=0;c[j+131084+((B|2)<<2)>>2]=f;c[j+131084+((B|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[g>>2]|0))}if((o|0)>0){n=0;do{m=(c[j+1179664+(n<<2)>>2]|0)+-1|0;a=n*7|0;k=j+12+(m<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(a<<2)>>2]|0);k=m<<1;l=j+655376+(k<<3)|0;h[l>>3]=+h[l>>3]+ +(c[j+1310736+(a+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(a+2<<2)>>2]|0);m=m<<2;k=j+131084+(m<<2)|0;l=c[j+1310736+(a+3<<2)>>2]|0;if((c[k>>2]|0)>(l|0))c[k>>2]=l;k=j+131084+((m|1)<<2)|0;l=c[j+1310736+(a+4<<2)>>2]|0;if((c[k>>2]|0)<(l|0))c[k>>2]=l;k=j+131084+((m|2)<<2)|0;l=c[j+1310736+(a+5<<2)>>2]|0;if((c[k>>2]|0)>(l|0))c[k>>2]=l;l=j+131084+((m|3)<<2)|0;k=c[j+1310736+(a+6<<2)>>2]|0;if((c[l>>2]|0)<(k|0))c[l>>2]=k;n=n+1|0}while((n|0)<(o|0))}if((c[g>>2]|0)>0){k=0;do{e=j+12+(k<<2)|0;f=k<<1;B=j+655376+(f<<3)|0;h[B>>3]=+h[B>>3]/+(c[e>>2]|0);f=j+655376+((f|1)<<3)|0;h[f>>3]=+h[f>>3]/+(c[e>>2]|0);k=k+1|0}while((k|0)<(c[g>>2]|0));k=0}else k=0}else k=0}i=C;return k|0}function Gc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;D=i;i=i+16|0;z=D;B=(e|0)/2|0;C=(f|0)/2|0;n=c[j>>2]|0;y=C+-1|0;if((e|0)>1){k=0;l=n;m=n+(($(y,B)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(B|0))break;else{l=l+2|0;m=m+2|0}}}w=g*3|0;x=B+-1|0;if((f|0)>1){k=0;g=n;l=n+(x<<1)|0;while(1){b[l>>1]=0;b[g>>1]=0;k=k+1|0;if((k|0)>=(C|0))break;else{g=g+(B<<1)|0;l=l+(B<<1)|0}}}l=j+1179664|0;t=0-B|0;r=1-B|0;s=~B;q=(e*3|0)+12|0;a:do if((y|0)>1){u=(x|0)>1;v=1;g=a+((e*6|0)+6)|0;m=n+(B+1<<1)|0;k=0;b:while(1){if(u){p=1;o=m;n=k;while(1){do if(((d[g+1>>0]|0)+(d[g>>0]|0)+(d[g+2>>0]|0)|0)>(w|0)){k=b[o+(t<<1)>>1]|0;if(k<<16>>16>0){b[o>>1]=k;k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}f=b[o+(r<<1)>>1]|0;a=f<<16>>16;k=b[o+(s<<1)>>1]|0;e=k<<16>>16;m=k<<16>>16>0;if(f<<16>>16<=0){if(m){b[o>>1]=k;k=e*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+p;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+v;m=j+1310736+(k+-3<<2)|0;if((c[m>>2]|0)<(p|0))c[m>>2]=p;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}k=b[o+-2>>1]|0;if(k<<16>>16>0){b[o>>1]=k;k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(p|0)){k=n;break}c[k>>2]=p;k=n;break}else{k=n+1|0;if((n|0)>32767)break b;b[o>>1]=k;c[j+1179664+(n<<2)>>2]=k<<16>>16;n=n*7|0;c[j+1310736+(n<<2)>>2]=1;c[j+1310736+(n+1<<2)>>2]=p;c[j+1310736+(n+2<<2)>>2]=v;c[j+1310736+(n+3<<2)>>2]=p;c[j+1310736+(n+4<<2)>>2]=p;c[j+1310736+(n+5<<2)>>2]=v;c[j+1310736+(n+6<<2)>>2]=v;break}}if(m){k=c[j+1179664+(a+-1<<2)>>2]|0;a=c[j+1179664+(e+-1<<2)>>2]|0;if((k|0)>(a|0)){b[o>>1]=a;if((n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(k|0))c[f>>2]=a;m=m+1|0;if((m|0)>=(n|0)){k=a;break}else f=f+4|0}}else k=a}else{b[o>>1]=k;if((k|0)<(a|0)&(n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(a|0))c[f>>2]=k;m=m+1|0;if((m|0)>=(n|0))break;else f=f+4|0}}}k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}m=b[o+-2>>1]|0;if(m<<16>>16<=0){b[o>>1]=f;k=a*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+p;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+v;m=j+1310736+(k+-4<<2)|0;if((c[m>>2]|0)>(p|0))c[m>>2]=p;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}k=c[j+1179664+(a+-1<<2)>>2]|0;a=c[j+1179664+((m<<16>>16)+-1<<2)>>2]|0;if((k|0)>(a|0)){b[o>>1]=a;if((n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(k|0))c[f>>2]=a;m=m+1|0;if((m|0)>=(n|0)){k=a;break}else f=f+4|0}}else k=a}else{b[o>>1]=k;if((k|0)<(a|0)&(n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(a|0))c[f>>2]=k;m=m+1|0;if((m|0)>=(n|0))break;else f=f+4|0}}}k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+v;k=n}else{b[o>>1]=0;k=n}while(0);p=p+1|0;g=g+6|0;m=o+2|0;if((p|0)>=(x|0))break;else{o=m;n=k}}}v=v+1|0;if((v|0)>=(y|0)){e=k;A=52;break a}else{g=g+q|0;m=m+4|0}}Me(3,3904,z);k=-1}else{e=0;A=52}while(0);if((A|0)==52){f=j+12|0;if((e|0)<1)g=1;else{m=1;g=1;while(1){k=c[l>>2]|0;if((k|0)==(m|0)){k=g;g=g+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[l>>2]=k;if((m|0)<(e|0)){m=m+1|0;l=l+4|0}else break}}a=j+8|0;k=g+-1|0;c[a>>2]=k;if(k){ek(f|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((g|0)>1){k=0;do{A=k<<2;c[j+131084+(A<<2)>>2]=B;c[j+131084+((A|1)<<2)>>2]=0;c[j+131084+((A|2)<<2)>>2]=C;c[j+131084+((A|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[a>>2]|0))}if((e|0)>0){f=0;do{l=(c[j+1179664+(f<<2)>>2]|0)+-1|0;m=f*7|0;k=j+12+(l<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(m<<2)>>2]|0);k=l<<1;g=j+655376+(k<<3)|0;h[g>>3]=+h[g>>3]+ +(c[j+1310736+(m+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(m+2<<2)>>2]|0);l=l<<2;k=j+131084+(l<<2)|0;g=c[j+1310736+(m+3<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;k=j+131084+((l|1)<<2)|0;g=c[j+1310736+(m+4<<2)>>2]|0;if((c[k>>2]|0)<(g|0))c[k>>2]=g;k=j+131084+((l|2)<<2)|0;g=c[j+1310736+(m+5<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;g=j+131084+((l|3)<<2)|0;k=c[j+1310736+(m+6<<2)>>2]|0;if((c[g>>2]|0)<(k|0))c[g>>2]=k;f=f+1|0}while((f|0)<(e|0))}if((c[a>>2]|0)>0){k=0;do{B=j+12+(k<<2)|0;C=k<<1;A=j+655376+(C<<3)|0;h[A>>3]=+h[A>>3]/+(c[B>>2]|0);C=j+655376+((C|1)<<3)|0;h[C>>3]=+h[C>>3]/+(c[B>>2]|0);k=k+1|0}while((k|0)<(c[a>>2]|0));k=0}else k=0}else k=0}i=D;return k|0}function Hc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;D=i;i=i+16|0;z=D;B=(e|0)/2|0;C=(f|0)/2|0;n=c[j>>2]|0;y=C+-1|0;if((e|0)>1){k=0;l=n;m=n+(($(y,B)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(B|0))break;else{l=l+2|0;m=m+2|0}}}w=g*3|0;x=B+-1|0;if((f|0)>1){k=0;g=n;l=n+(x<<1)|0;while(1){b[l>>1]=0;b[g>>1]=0;k=k+1|0;if((k|0)>=(C|0))break;else{g=g+(B<<1)|0;l=l+(B<<1)|0}}}l=j+1179664|0;t=0-B|0;r=1-B|0;s=~B;q=(e<<1)+8|0;a:do if((y|0)>1){u=(x|0)>1;v=1;g=a+((e<<2)+4)|0;m=n+(B+1<<1)|0;k=0;b:while(1){if(u){p=1;o=m;n=k;while(1){a=d[g>>0]|0;e=d[g+1>>0]|0;do if(((a&248)+10+(a<<5&224)+(e>>>3&28)+(e<<3&248)|0)>(w|0)){k=b[o+(t<<1)>>1]|0;if(k<<16>>16>0){b[o>>1]=k;k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}f=b[o+(r<<1)>>1]|0;a=f<<16>>16;k=b[o+(s<<1)>>1]|0;e=k<<16>>16;m=k<<16>>16>0;if(f<<16>>16<=0){if(m){b[o>>1]=k;k=e*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+p;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+v;m=j+1310736+(k+-3<<2)|0;if((c[m>>2]|0)<(p|0))c[m>>2]=p;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}k=b[o+-2>>1]|0;if(k<<16>>16>0){b[o>>1]=k;k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(p|0)){k=n;break}c[k>>2]=p;k=n;break}else{k=n+1|0;if((n|0)>32767)break b;b[o>>1]=k;c[j+1179664+(n<<2)>>2]=k<<16>>16;n=n*7|0;c[j+1310736+(n<<2)>>2]=1;c[j+1310736+(n+1<<2)>>2]=p;c[j+1310736+(n+2<<2)>>2]=v;c[j+1310736+(n+3<<2)>>2]=p;c[j+1310736+(n+4<<2)>>2]=p;c[j+1310736+(n+5<<2)>>2]=v;c[j+1310736+(n+6<<2)>>2]=v;break}}if(m){k=c[j+1179664+(a+-1<<2)>>2]|0;a=c[j+1179664+(e+-1<<2)>>2]|0;if((k|0)>(a|0)){b[o>>1]=a;if((n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(k|0))c[f>>2]=a;m=m+1|0;if((m|0)>=(n|0)){k=a;break}else f=f+4|0}}else k=a}else{b[o>>1]=k;if((k|0)<(a|0)&(n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(a|0))c[f>>2]=k;m=m+1|0;if((m|0)>=(n|0))break;else f=f+4|0}}}k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}m=b[o+-2>>1]|0;if(m<<16>>16<=0){b[o>>1]=f;k=a*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+p;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+v;m=j+1310736+(k+-4<<2)|0;if((c[m>>2]|0)>(p|0))c[m>>2]=p;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}k=c[j+1179664+(a+-1<<2)>>2]|0;a=c[j+1179664+((m<<16>>16)+-1<<2)>>2]|0;if((k|0)>(a|0)){b[o>>1]=a;if((n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(k|0))c[f>>2]=a;m=m+1|0;if((m|0)>=(n|0)){k=a;break}else f=f+4|0}}else k=a}else{b[o>>1]=k;if((k|0)<(a|0)&(n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(a|0))c[f>>2]=k;m=m+1|0;if((m|0)>=(n|0))break;else f=f+4|0}}}k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+v;k=n}else{b[o>>1]=0;k=n}while(0);p=p+1|0;g=g+4|0;m=o+2|0;if((p|0)>=(x|0))break;else{o=m;n=k}}}v=v+1|0;if((v|0)>=(y|0)){e=k;A=52;break a}else{g=g+q|0;m=m+4|0}}Me(3,3904,z);k=-1}else{e=0;A=52}while(0);if((A|0)==52){f=j+12|0;if((e|0)<1)g=1;else{m=1;g=1;while(1){k=c[l>>2]|0;if((k|0)==(m|0)){k=g;g=g+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[l>>2]=k;if((m|0)<(e|0)){m=m+1|0;l=l+4|0}else break}}a=j+8|0;k=g+-1|0;c[a>>2]=k;if(k){ek(f|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((g|0)>1){k=0;do{A=k<<2;c[j+131084+(A<<2)>>2]=B;c[j+131084+((A|1)<<2)>>2]=0;c[j+131084+((A|2)<<2)>>2]=C;c[j+131084+((A|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[a>>2]|0))}if((e|0)>0){f=0;do{l=(c[j+1179664+(f<<2)>>2]|0)+-1|0;m=f*7|0;k=j+12+(l<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(m<<2)>>2]|0);k=l<<1;g=j+655376+(k<<3)|0;h[g>>3]=+h[g>>3]+ +(c[j+1310736+(m+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(m+2<<2)>>2]|0);l=l<<2;k=j+131084+(l<<2)|0;g=c[j+1310736+(m+3<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;k=j+131084+((l|1)<<2)|0;g=c[j+1310736+(m+4<<2)>>2]|0;if((c[k>>2]|0)<(g|0))c[k>>2]=g;k=j+131084+((l|2)<<2)|0;g=c[j+1310736+(m+5<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;g=j+131084+((l|3)<<2)|0;k=c[j+1310736+(m+6<<2)>>2]|0;if((c[g>>2]|0)<(k|0))c[g>>2]=k;f=f+1|0}while((f|0)<(e|0))}if((c[a>>2]|0)>0){k=0;do{B=j+12+(k<<2)|0;C=k<<1;A=j+655376+(C<<3)|0;h[A>>3]=+h[A>>3]/+(c[B>>2]|0);C=j+655376+((C|1)<<3)|0;h[C>>3]=+h[C>>3]/+(c[B>>2]|0);k=k+1|0}while((k|0)<(c[a>>2]|0));k=0}else k=0}else k=0}i=D;return k|0}function Ic(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;D=i;i=i+16|0;z=D;B=(e|0)/2|0;C=(f|0)/2|0;n=c[j>>2]|0;y=C+-1|0;if((e|0)>1){k=0;l=n;m=n+(($(y,B)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(B|0))break;else{l=l+2|0;m=m+2|0}}}w=g*3|0;x=B+-1|0;if((f|0)>1){k=0;g=n;l=n+(x<<1)|0;while(1){b[l>>1]=0;b[g>>1]=0;k=k+1|0;if((k|0)>=(C|0))break;else{g=g+(B<<1)|0;l=l+(B<<1)|0}}}l=j+1179664|0;t=0-B|0;r=1-B|0;s=~B;q=(e<<2)+16|0;a:do if((y|0)>1){u=(x|0)>1;v=1;g=a+((e<<3)+8)|0;m=n+(B+1<<1)|0;k=0;b:while(1){if(u){p=1;o=m;n=k;while(1){do if(((d[g+1>>0]|0)+(d[g>>0]|0)+(d[g+2>>0]|0)|0)>(w|0)){k=b[o+(t<<1)>>1]|0;if(k<<16>>16>0){b[o>>1]=k;k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}f=b[o+(r<<1)>>1]|0;a=f<<16>>16;k=b[o+(s<<1)>>1]|0;e=k<<16>>16;m=k<<16>>16>0;if(f<<16>>16<=0){if(m){b[o>>1]=k;k=e*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+p;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+v;m=j+1310736+(k+-3<<2)|0;if((c[m>>2]|0)<(p|0))c[m>>2]=p;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}k=b[o+-2>>1]|0;if(k<<16>>16>0){b[o>>1]=k;k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(p|0)){k=n;break}c[k>>2]=p;k=n;break}else{k=n+1|0;if((n|0)>32767)break b;b[o>>1]=k;c[j+1179664+(n<<2)>>2]=k<<16>>16;n=n*7|0;c[j+1310736+(n<<2)>>2]=1;c[j+1310736+(n+1<<2)>>2]=p;c[j+1310736+(n+2<<2)>>2]=v;c[j+1310736+(n+3<<2)>>2]=p;c[j+1310736+(n+4<<2)>>2]=p;c[j+1310736+(n+5<<2)>>2]=v;c[j+1310736+(n+6<<2)>>2]=v;break}}if(m){k=c[j+1179664+(a+-1<<2)>>2]|0;a=c[j+1179664+(e+-1<<2)>>2]|0;if((k|0)>(a|0)){b[o>>1]=a;if((n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(k|0))c[f>>2]=a;m=m+1|0;if((m|0)>=(n|0)){k=a;break}else f=f+4|0}}else k=a}else{b[o>>1]=k;if((k|0)<(a|0)&(n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(a|0))c[f>>2]=k;m=m+1|0;if((m|0)>=(n|0))break;else f=f+4|0}}}k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}m=b[o+-2>>1]|0;if(m<<16>>16<=0){b[o>>1]=f;k=a*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+p;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+v;m=j+1310736+(k+-4<<2)|0;if((c[m>>2]|0)>(p|0))c[m>>2]=p;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}k=c[j+1179664+(a+-1<<2)>>2]|0;a=c[j+1179664+((m<<16>>16)+-1<<2)>>2]|0;if((k|0)>(a|0)){b[o>>1]=a;if((n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(k|0))c[f>>2]=a;m=m+1|0;if((m|0)>=(n|0)){k=a;break}else f=f+4|0}}else k=a}else{b[o>>1]=k;if((k|0)<(a|0)&(n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(a|0))c[f>>2]=k;m=m+1|0;if((m|0)>=(n|0))break;else f=f+4|0}}}k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+v;k=n}else{b[o>>1]=0;k=n}while(0);p=p+1|0;g=g+8|0;m=o+2|0;if((p|0)>=(x|0))break;else{o=m;n=k}}}v=v+1|0;if((v|0)>=(y|0)){e=k;A=52;break a}else{g=g+q|0;m=m+4|0}}Me(3,3904,z);k=-1}else{e=0;A=52}while(0);if((A|0)==52){f=j+12|0;if((e|0)<1)g=1;else{m=1;g=1;while(1){k=c[l>>2]|0;if((k|0)==(m|0)){k=g;g=g+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[l>>2]=k;if((m|0)<(e|0)){m=m+1|0;l=l+4|0}else break}}a=j+8|0;k=g+-1|0;c[a>>2]=k;if(k){ek(f|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((g|0)>1){k=0;do{A=k<<2;c[j+131084+(A<<2)>>2]=B;c[j+131084+((A|1)<<2)>>2]=0;c[j+131084+((A|2)<<2)>>2]=C;c[j+131084+((A|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[a>>2]|0))}if((e|0)>0){f=0;do{l=(c[j+1179664+(f<<2)>>2]|0)+-1|0;m=f*7|0;k=j+12+(l<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(m<<2)>>2]|0);k=l<<1;g=j+655376+(k<<3)|0;h[g>>3]=+h[g>>3]+ +(c[j+1310736+(m+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(m+2<<2)>>2]|0);l=l<<2;k=j+131084+(l<<2)|0;g=c[j+1310736+(m+3<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;k=j+131084+((l|1)<<2)|0;g=c[j+1310736+(m+4<<2)>>2]|0;if((c[k>>2]|0)<(g|0))c[k>>2]=g;k=j+131084+((l|2)<<2)|0;g=c[j+1310736+(m+5<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;g=j+131084+((l|3)<<2)|0;k=c[j+1310736+(m+6<<2)>>2]|0;if((c[g>>2]|0)<(k|0))c[g>>2]=k;f=f+1|0}while((f|0)<(e|0))}if((c[a>>2]|0)>0){k=0;do{B=j+12+(k<<2)|0;C=k<<1;A=j+655376+(C<<3)|0;h[A>>3]=+h[A>>3]/+(c[B>>2]|0);C=j+655376+((C|1)<<3)|0;h[C>>3]=+h[C>>3]/+(c[B>>2]|0);k=k+1|0}while((k|0)<(c[a>>2]|0));k=0}else k=0}else k=0}i=D;return k|0} +function Jc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;D=i;i=i+16|0;z=D;B=(e|0)/2|0;C=(f|0)/2|0;n=c[j>>2]|0;y=C+-1|0;if((e|0)>1){k=0;l=n;m=n+(($(y,B)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(B|0))break;else{l=l+2|0;m=m+2|0}}}w=g*3|0;x=B+-1|0;if((f|0)>1){k=0;g=n;l=n+(x<<1)|0;while(1){b[l>>1]=0;b[g>>1]=0;k=k+1|0;if((k|0)>=(C|0))break;else{g=g+(B<<1)|0;l=l+(B<<1)|0}}}l=j+1179664|0;t=0-B|0;r=1-B|0;s=~B;q=(e<<1)+8|0;a:do if((y|0)>1){u=(x|0)>1;v=1;g=a+((e<<2)+4)|0;m=n+(B+1<<1)|0;k=0;b:while(1){if(u){p=1;o=m;n=k;while(1){e=d[g>>0]|0;do if(((e&240)+24+(e<<4&240)+((d[g+1>>0]|0)&240)|0)>(w|0)){k=b[o+(t<<1)>>1]|0;if(k<<16>>16>0){b[o>>1]=k;k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}f=b[o+(r<<1)>>1]|0;a=f<<16>>16;k=b[o+(s<<1)>>1]|0;e=k<<16>>16;m=k<<16>>16>0;if(f<<16>>16<=0){if(m){b[o>>1]=k;k=e*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+p;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+v;m=j+1310736+(k+-3<<2)|0;if((c[m>>2]|0)<(p|0))c[m>>2]=p;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}k=b[o+-2>>1]|0;if(k<<16>>16>0){b[o>>1]=k;k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(p|0)){k=n;break}c[k>>2]=p;k=n;break}else{k=n+1|0;if((n|0)>32767)break b;b[o>>1]=k;c[j+1179664+(n<<2)>>2]=k<<16>>16;n=n*7|0;c[j+1310736+(n<<2)>>2]=1;c[j+1310736+(n+1<<2)>>2]=p;c[j+1310736+(n+2<<2)>>2]=v;c[j+1310736+(n+3<<2)>>2]=p;c[j+1310736+(n+4<<2)>>2]=p;c[j+1310736+(n+5<<2)>>2]=v;c[j+1310736+(n+6<<2)>>2]=v;break}}if(m){k=c[j+1179664+(a+-1<<2)>>2]|0;a=c[j+1179664+(e+-1<<2)>>2]|0;if((k|0)>(a|0)){b[o>>1]=a;if((n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(k|0))c[f>>2]=a;m=m+1|0;if((m|0)>=(n|0)){k=a;break}else f=f+4|0}}else k=a}else{b[o>>1]=k;if((k|0)<(a|0)&(n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(a|0))c[f>>2]=k;m=m+1|0;if((m|0)>=(n|0))break;else f=f+4|0}}}k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}m=b[o+-2>>1]|0;if(m<<16>>16<=0){b[o>>1]=f;k=a*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+p;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+v;m=j+1310736+(k+-4<<2)|0;if((c[m>>2]|0)>(p|0))c[m>>2]=p;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}k=c[j+1179664+(a+-1<<2)>>2]|0;a=c[j+1179664+((m<<16>>16)+-1<<2)>>2]|0;if((k|0)>(a|0)){b[o>>1]=a;if((n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(k|0))c[f>>2]=a;m=m+1|0;if((m|0)>=(n|0)){k=a;break}else f=f+4|0}}else k=a}else{b[o>>1]=k;if((k|0)<(a|0)&(n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(a|0))c[f>>2]=k;m=m+1|0;if((m|0)>=(n|0))break;else f=f+4|0}}}k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+v;k=n}else{b[o>>1]=0;k=n}while(0);p=p+1|0;g=g+4|0;m=o+2|0;if((p|0)>=(x|0))break;else{o=m;n=k}}}v=v+1|0;if((v|0)>=(y|0)){e=k;A=52;break a}else{g=g+q|0;m=m+4|0}}Me(3,3904,z);k=-1}else{e=0;A=52}while(0);if((A|0)==52){f=j+12|0;if((e|0)<1)g=1;else{m=1;g=1;while(1){k=c[l>>2]|0;if((k|0)==(m|0)){k=g;g=g+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[l>>2]=k;if((m|0)<(e|0)){m=m+1|0;l=l+4|0}else break}}a=j+8|0;k=g+-1|0;c[a>>2]=k;if(k){ek(f|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((g|0)>1){k=0;do{A=k<<2;c[j+131084+(A<<2)>>2]=B;c[j+131084+((A|1)<<2)>>2]=0;c[j+131084+((A|2)<<2)>>2]=C;c[j+131084+((A|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[a>>2]|0))}if((e|0)>0){f=0;do{l=(c[j+1179664+(f<<2)>>2]|0)+-1|0;m=f*7|0;k=j+12+(l<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(m<<2)>>2]|0);k=l<<1;g=j+655376+(k<<3)|0;h[g>>3]=+h[g>>3]+ +(c[j+1310736+(m+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(m+2<<2)>>2]|0);l=l<<2;k=j+131084+(l<<2)|0;g=c[j+1310736+(m+3<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;k=j+131084+((l|1)<<2)|0;g=c[j+1310736+(m+4<<2)>>2]|0;if((c[k>>2]|0)<(g|0))c[k>>2]=g;k=j+131084+((l|2)<<2)|0;g=c[j+1310736+(m+5<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;g=j+131084+((l|3)<<2)|0;k=c[j+1310736+(m+6<<2)>>2]|0;if((c[g>>2]|0)<(k|0))c[g>>2]=k;f=f+1|0}while((f|0)<(e|0))}if((c[a>>2]|0)>0){k=0;do{B=j+12+(k<<2)|0;C=k<<1;A=j+655376+(C<<3)|0;h[A>>3]=+h[A>>3]/+(c[B>>2]|0);C=j+655376+((C|1)<<3)|0;h[C>>3]=+h[C>>3]/+(c[B>>2]|0);k=k+1|0}while((k|0)<(c[a>>2]|0));k=0}else k=0}else k=0}i=D;return k|0}function Kc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;D=i;i=i+16|0;z=D;B=(e|0)/2|0;C=(f|0)/2|0;n=c[j>>2]|0;y=C+-1|0;if((e|0)>1){k=0;l=n;m=n+(($(y,B)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(B|0))break;else{l=l+2|0;m=m+2|0}}}w=g*3|0;x=B+-1|0;if((f|0)>1){k=0;g=n;l=n+(x<<1)|0;while(1){b[l>>1]=0;b[g>>1]=0;k=k+1|0;if((k|0)>=(C|0))break;else{g=g+(B<<1)|0;l=l+(B<<1)|0}}}l=j+1179664|0;t=0-B|0;r=1-B|0;s=~B;q=(e<<1)+8|0;a:do if((y|0)>1){u=(x|0)>1;v=1;g=a+((e<<2)+4)|0;m=n+(B+1<<1)|0;k=0;b:while(1){if(u){p=1;o=m;n=k;while(1){a=d[g>>0]|0;e=d[g+1>>0]|0;do if(((a&248)+12+(a<<5&224)+(e>>>3&24)+(e<<2&248)|0)>(w|0)){k=b[o+(t<<1)>>1]|0;if(k<<16>>16>0){b[o>>1]=k;k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}f=b[o+(r<<1)>>1]|0;a=f<<16>>16;k=b[o+(s<<1)>>1]|0;e=k<<16>>16;m=k<<16>>16>0;if(f<<16>>16<=0){if(m){b[o>>1]=k;k=e*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+p;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+v;m=j+1310736+(k+-3<<2)|0;if((c[m>>2]|0)<(p|0))c[m>>2]=p;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}k=b[o+-2>>1]|0;if(k<<16>>16>0){b[o>>1]=k;k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(p|0)){k=n;break}c[k>>2]=p;k=n;break}else{k=n+1|0;if((n|0)>32767)break b;b[o>>1]=k;c[j+1179664+(n<<2)>>2]=k<<16>>16;n=n*7|0;c[j+1310736+(n<<2)>>2]=1;c[j+1310736+(n+1<<2)>>2]=p;c[j+1310736+(n+2<<2)>>2]=v;c[j+1310736+(n+3<<2)>>2]=p;c[j+1310736+(n+4<<2)>>2]=p;c[j+1310736+(n+5<<2)>>2]=v;c[j+1310736+(n+6<<2)>>2]=v;break}}if(m){k=c[j+1179664+(a+-1<<2)>>2]|0;a=c[j+1179664+(e+-1<<2)>>2]|0;if((k|0)>(a|0)){b[o>>1]=a;if((n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(k|0))c[f>>2]=a;m=m+1|0;if((m|0)>=(n|0)){k=a;break}else f=f+4|0}}else k=a}else{b[o>>1]=k;if((k|0)<(a|0)&(n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(a|0))c[f>>2]=k;m=m+1|0;if((m|0)>=(n|0))break;else f=f+4|0}}}k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}m=b[o+-2>>1]|0;if(m<<16>>16<=0){b[o>>1]=f;k=a*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+p;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+v;m=j+1310736+(k+-4<<2)|0;if((c[m>>2]|0)>(p|0))c[m>>2]=p;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}k=c[j+1179664+(a+-1<<2)>>2]|0;a=c[j+1179664+((m<<16>>16)+-1<<2)>>2]|0;if((k|0)>(a|0)){b[o>>1]=a;if((n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(k|0))c[f>>2]=a;m=m+1|0;if((m|0)>=(n|0)){k=a;break}else f=f+4|0}}else k=a}else{b[o>>1]=k;if((k|0)<(a|0)&(n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(a|0))c[f>>2]=k;m=m+1|0;if((m|0)>=(n|0))break;else f=f+4|0}}}k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+v;k=n}else{b[o>>1]=0;k=n}while(0);p=p+1|0;g=g+4|0;m=o+2|0;if((p|0)>=(x|0))break;else{o=m;n=k}}}v=v+1|0;if((v|0)>=(y|0)){e=k;A=52;break a}else{g=g+q|0;m=m+4|0}}Me(3,3904,z);k=-1}else{e=0;A=52}while(0);if((A|0)==52){f=j+12|0;if((e|0)<1)g=1;else{m=1;g=1;while(1){k=c[l>>2]|0;if((k|0)==(m|0)){k=g;g=g+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[l>>2]=k;if((m|0)<(e|0)){m=m+1|0;l=l+4|0}else break}}a=j+8|0;k=g+-1|0;c[a>>2]=k;if(k){ek(f|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((g|0)>1){k=0;do{A=k<<2;c[j+131084+(A<<2)>>2]=B;c[j+131084+((A|1)<<2)>>2]=0;c[j+131084+((A|2)<<2)>>2]=C;c[j+131084+((A|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[a>>2]|0))}if((e|0)>0){f=0;do{l=(c[j+1179664+(f<<2)>>2]|0)+-1|0;m=f*7|0;k=j+12+(l<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(m<<2)>>2]|0);k=l<<1;g=j+655376+(k<<3)|0;h[g>>3]=+h[g>>3]+ +(c[j+1310736+(m+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(m+2<<2)>>2]|0);l=l<<2;k=j+131084+(l<<2)|0;g=c[j+1310736+(m+3<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;k=j+131084+((l|1)<<2)|0;g=c[j+1310736+(m+4<<2)>>2]|0;if((c[k>>2]|0)<(g|0))c[k>>2]=g;k=j+131084+((l|2)<<2)|0;g=c[j+1310736+(m+5<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;g=j+131084+((l|3)<<2)|0;k=c[j+1310736+(m+6<<2)>>2]|0;if((c[g>>2]|0)<(k|0))c[g>>2]=k;f=f+1|0}while((f|0)<(e|0))}if((c[a>>2]|0)>0){k=0;do{B=j+12+(k<<2)|0;C=k<<1;A=j+655376+(C<<3)|0;h[A>>3]=+h[A>>3]/+(c[B>>2]|0);C=j+655376+((C|1)<<3)|0;h[C>>3]=+h[C>>3]/+(c[B>>2]|0);k=k+1|0}while((k|0)<(c[a>>2]|0));k=0}else k=0}else k=0}i=D;return k|0}function Lc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;D=i;i=i+16|0;z=D;B=(e|0)/2|0;C=(f|0)/2|0;n=c[j>>2]|0;y=C+-1|0;if((e|0)>1){k=0;l=n;m=n+(($(y,B)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(B|0))break;else{l=l+2|0;m=m+2|0}}}w=g*3|0;x=B+-1|0;if((f|0)>1){k=0;g=n;l=n+(x<<1)|0;while(1){b[l>>1]=0;b[g>>1]=0;k=k+1|0;if((k|0)>=(C|0))break;else{g=g+(B<<1)|0;l=l+(B<<1)|0}}}l=j+1179664|0;t=0-B|0;r=1-B|0;s=~B;q=(e<<2)+16|0;a:do if((y|0)>1){u=(x|0)>1;v=1;g=a+((e<<3)+8)|0;m=n+(B+1<<1)|0;k=0;b:while(1){if(u){p=1;o=m;n=k;while(1){do if(((d[g+2>>0]|0)+(d[g+1>>0]|0)+(d[g+3>>0]|0)|0)>(w|0)){k=b[o+(t<<1)>>1]|0;if(k<<16>>16>0){b[o>>1]=k;k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}f=b[o+(r<<1)>>1]|0;a=f<<16>>16;k=b[o+(s<<1)>>1]|0;e=k<<16>>16;m=k<<16>>16>0;if(f<<16>>16<=0){if(m){b[o>>1]=k;k=e*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+p;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+v;m=j+1310736+(k+-3<<2)|0;if((c[m>>2]|0)<(p|0))c[m>>2]=p;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}k=b[o+-2>>1]|0;if(k<<16>>16>0){b[o>>1]=k;k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(p|0)){k=n;break}c[k>>2]=p;k=n;break}else{k=n+1|0;if((n|0)>32767)break b;b[o>>1]=k;c[j+1179664+(n<<2)>>2]=k<<16>>16;n=n*7|0;c[j+1310736+(n<<2)>>2]=1;c[j+1310736+(n+1<<2)>>2]=p;c[j+1310736+(n+2<<2)>>2]=v;c[j+1310736+(n+3<<2)>>2]=p;c[j+1310736+(n+4<<2)>>2]=p;c[j+1310736+(n+5<<2)>>2]=v;c[j+1310736+(n+6<<2)>>2]=v;break}}if(m){k=c[j+1179664+(a+-1<<2)>>2]|0;a=c[j+1179664+(e+-1<<2)>>2]|0;if((k|0)>(a|0)){b[o>>1]=a;if((n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(k|0))c[f>>2]=a;m=m+1|0;if((m|0)>=(n|0)){k=a;break}else f=f+4|0}}else k=a}else{b[o>>1]=k;if((k|0)<(a|0)&(n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(a|0))c[f>>2]=k;m=m+1|0;if((m|0)>=(n|0))break;else f=f+4|0}}}k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;e=j+1310736+(k+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+v;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}m=b[o+-2>>1]|0;if(m<<16>>16<=0){b[o>>1]=f;k=a*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+p;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+v;m=j+1310736+(k+-4<<2)|0;if((c[m>>2]|0)>(p|0))c[m>>2]=p;c[j+1310736+(k+-1<<2)>>2]=v;k=n;break}k=c[j+1179664+(a+-1<<2)>>2]|0;a=c[j+1179664+((m<<16>>16)+-1<<2)>>2]|0;if((k|0)>(a|0)){b[o>>1]=a;if((n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(k|0))c[f>>2]=a;m=m+1|0;if((m|0)>=(n|0)){k=a;break}else f=f+4|0}}else k=a}else{b[o>>1]=k;if((k|0)<(a|0)&(n|0)>0){m=0;f=l;while(1){if((c[f>>2]|0)==(a|0))c[f>>2]=k;m=m+1|0;if((m|0)>=(n|0))break;else f=f+4|0}}}k=(k<<16>>16)*7|0;e=j+1310736+(k+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=j+1310736+(k+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+p;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+v;k=n}else{b[o>>1]=0;k=n}while(0);p=p+1|0;g=g+8|0;m=o+2|0;if((p|0)>=(x|0))break;else{o=m;n=k}}}v=v+1|0;if((v|0)>=(y|0)){e=k;A=52;break a}else{g=g+q|0;m=m+4|0}}Me(3,3904,z);k=-1}else{e=0;A=52}while(0);if((A|0)==52){f=j+12|0;if((e|0)<1)g=1;else{m=1;g=1;while(1){k=c[l>>2]|0;if((k|0)==(m|0)){k=g;g=g+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[l>>2]=k;if((m|0)<(e|0)){m=m+1|0;l=l+4|0}else break}}a=j+8|0;k=g+-1|0;c[a>>2]=k;if(k){ek(f|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((g|0)>1){k=0;do{A=k<<2;c[j+131084+(A<<2)>>2]=B;c[j+131084+((A|1)<<2)>>2]=0;c[j+131084+((A|2)<<2)>>2]=C;c[j+131084+((A|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[a>>2]|0))}if((e|0)>0){f=0;do{l=(c[j+1179664+(f<<2)>>2]|0)+-1|0;m=f*7|0;k=j+12+(l<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(m<<2)>>2]|0);k=l<<1;g=j+655376+(k<<3)|0;h[g>>3]=+h[g>>3]+ +(c[j+1310736+(m+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(m+2<<2)>>2]|0);l=l<<2;k=j+131084+(l<<2)|0;g=c[j+1310736+(m+3<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;k=j+131084+((l|1)<<2)|0;g=c[j+1310736+(m+4<<2)>>2]|0;if((c[k>>2]|0)<(g|0))c[k>>2]=g;k=j+131084+((l|2)<<2)|0;g=c[j+1310736+(m+5<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;g=j+131084+((l|3)<<2)|0;k=c[j+1310736+(m+6<<2)>>2]|0;if((c[g>>2]|0)<(k|0))c[g>>2]=k;f=f+1|0}while((f|0)<(e|0))}if((c[a>>2]|0)>0){k=0;do{B=j+12+(k<<2)|0;C=k<<1;A=j+655376+(C<<3)|0;h[A>>3]=+h[A>>3]/+(c[B>>2]|0);C=j+655376+((C|1)<<3)|0;h[C>>3]=+h[C>>3]/+(c[B>>2]|0);k=k+1|0}while((k|0)<(c[a>>2]|0));k=0}else k=0}else k=0}i=D;return k|0}function Mc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;D=i;i=i+16|0;z=D;B=(e|0)/2|0;C=(f|0)/2|0;n=c[j>>2]|0;y=C+-1|0;if((e|0)>1){k=0;l=n;m=n+(($(y,B)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(B|0))break;else{l=l+2|0;m=m+2|0}}}x=B+-1|0;if((f|0)>1){k=0;l=n;m=n+(x<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(C|0))break;else{l=l+(B<<1)|0;m=m+(B<<1)|0}}}m=j+1179664|0;u=0-B|0;s=1-B|0;t=~B;r=e+4|0;a:do if((y|0)>1){v=(x|0)>1;w=1;l=a+((e<<1)+2)|0;f=n+(B+1<<1)|0;k=0;b:while(1){if(v){q=1;p=f;o=k;while(1){do if((d[l>>0]|0|0)>(g|0)){k=b[p+(u<<1)>>1]|0;if(k<<16>>16>0){b[p>>1]=k;k=(k<<16>>16)*7|0;n=j+1310736+(k+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=j+1310736+(k+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+q;n=j+1310736+(k+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=o;break}a=b[p+(s<<1)>>1]|0;e=a<<16>>16;k=b[p+(t<<1)>>1]|0;n=k<<16>>16;f=k<<16>>16>0;if(a<<16>>16<=0){if(f){b[p>>1]=k;k=n*7|0;f=j+1310736+(k+-7<<2)|0;c[f>>2]=(c[f>>2]|0)+1;f=j+1310736+(k+-6<<2)|0;c[f>>2]=(c[f>>2]|0)+q;f=j+1310736+(k+-5<<2)|0;c[f>>2]=(c[f>>2]|0)+w;f=j+1310736+(k+-3<<2)|0;if((c[f>>2]|0)<(q|0))c[f>>2]=q;c[j+1310736+(k+-1<<2)>>2]=w;k=o;break}k=b[p+-2>>1]|0;if(k<<16>>16>0){b[p>>1]=k;k=(k<<16>>16)*7|0;n=j+1310736+(k+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=j+1310736+(k+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+q;n=j+1310736+(k+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+w;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(q|0)){k=o;break}c[k>>2]=q;k=o;break}else{k=o+1|0;if((o|0)>32767)break b;b[p>>1]=k;c[j+1179664+(o<<2)>>2]=k<<16>>16;o=o*7|0;c[j+1310736+(o<<2)>>2]=1;c[j+1310736+(o+1<<2)>>2]=q;c[j+1310736+(o+2<<2)>>2]=w;c[j+1310736+(o+3<<2)>>2]=q;c[j+1310736+(o+4<<2)>>2]=q;c[j+1310736+(o+5<<2)>>2]=w;c[j+1310736+(o+6<<2)>>2]=w;break}}if(f){k=c[j+1179664+(e+-1<<2)>>2]|0;e=c[j+1179664+(n+-1<<2)>>2]|0;if((k|0)>(e|0)){b[p>>1]=e;if((o|0)>0){f=0;a=m;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=e;f=f+1|0;if((f|0)>=(o|0)){k=e;break}else a=a+4|0}}else k=e}else{b[p>>1]=k;if((k|0)<(e|0)&(o|0)>0){f=0;a=m;while(1){if((c[a>>2]|0)==(e|0))c[a>>2]=k;f=f+1|0;if((f|0)>=(o|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;n=j+1310736+(k+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=j+1310736+(k+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+q;n=j+1310736+(k+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=o;break}f=b[p+-2>>1]|0;if(f<<16>>16<=0){b[p>>1]=a;k=e*7|0;f=j+1310736+(k+-7<<2)|0;c[f>>2]=(c[f>>2]|0)+1;f=j+1310736+(k+-6<<2)|0;c[f>>2]=(c[f>>2]|0)+q;f=j+1310736+(k+-5<<2)|0;c[f>>2]=(c[f>>2]|0)+w;f=j+1310736+(k+-4<<2)|0;if((c[f>>2]|0)>(q|0))c[f>>2]=q;c[j+1310736+(k+-1<<2)>>2]=w;k=o;break}k=c[j+1179664+(e+-1<<2)>>2]|0;e=c[j+1179664+((f<<16>>16)+-1<<2)>>2]|0;if((k|0)>(e|0)){b[p>>1]=e;if((o|0)>0){f=0;a=m;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=e;f=f+1|0;if((f|0)>=(o|0)){k=e;break}else a=a+4|0}}else k=e}else{b[p>>1]=k;if((k|0)<(e|0)&(o|0)>0){f=0;a=m;while(1){if((c[a>>2]|0)==(e|0))c[a>>2]=k;f=f+1|0;if((f|0)>=(o|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;n=j+1310736+(k+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=j+1310736+(k+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+q;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+w;k=o}else{b[p>>1]=0;k=o}while(0);q=q+1|0;l=l+2|0;f=p+2|0;if((q|0)>=(x|0))break;else{p=f;o=k}}}w=w+1|0;if((w|0)>=(y|0)){n=k;A=52;break a}else{l=l+r|0;f=f+4|0}}Me(3,3904,z);k=-1}else{n=0;A=52}while(0);if((A|0)==52){a=j+12|0;if((n|0)<1)l=1;else{f=1;l=1;while(1){k=c[m>>2]|0;if((k|0)==(f|0)){k=l;l=l+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[m>>2]=k;if((f|0)<(n|0)){f=f+1|0;m=m+4|0}else break}}e=j+8|0;k=l+-1|0;c[e>>2]=k;if(k){ek(a|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((l|0)>1){k=0;do{A=k<<2;c[j+131084+(A<<2)>>2]=B;c[j+131084+((A|1)<<2)>>2]=0;c[j+131084+((A|2)<<2)>>2]=C;c[j+131084+((A|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[e>>2]|0))}if((n|0)>0){a=0;do{m=(c[j+1179664+(a<<2)>>2]|0)+-1|0;f=a*7|0;k=j+12+(m<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(f<<2)>>2]|0);k=m<<1;l=j+655376+(k<<3)|0;h[l>>3]=+h[l>>3]+ +(c[j+1310736+(f+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(f+2<<2)>>2]|0);m=m<<2;k=j+131084+(m<<2)|0;l=c[j+1310736+(f+3<<2)>>2]|0;if((c[k>>2]|0)>(l|0))c[k>>2]=l;k=j+131084+((m|1)<<2)|0;l=c[j+1310736+(f+4<<2)>>2]|0;if((c[k>>2]|0)<(l|0))c[k>>2]=l;k=j+131084+((m|2)<<2)|0;l=c[j+1310736+(f+5<<2)>>2]|0;if((c[k>>2]|0)>(l|0))c[k>>2]=l;l=j+131084+((m|3)<<2)|0;k=c[j+1310736+(f+6<<2)>>2]|0;if((c[l>>2]|0)<(k|0))c[l>>2]=k;a=a+1|0}while((a|0)<(n|0))}if((c[e>>2]|0)>0){k=0;do{B=j+12+(k<<2)|0;C=k<<1;A=j+655376+(C<<3)|0;h[A>>3]=+h[A>>3]/+(c[B>>2]|0);C=j+655376+((C|1)<<3)|0;h[C>>3]=+h[C>>3]/+(c[B>>2]|0);k=k+1|0}while((k|0)<(c[e>>2]|0));k=0}else k=0}else k=0}i=D;return k|0}function Nc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;D=i;i=i+16|0;z=D;B=(e|0)/2|0;C=(f|0)/2|0;n=c[j>>2]|0;y=C+-1|0;if((e|0)>1){k=0;l=n;m=n+(($(y,B)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(B|0))break;else{l=l+2|0;m=m+2|0}}}x=B+-1|0;if((f|0)>1){k=0;l=n;m=n+(x<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(C|0))break;else{l=l+(B<<1)|0;m=m+(B<<1)|0}}}m=j+1179664|0;u=0-B|0;s=1-B|0;t=~B;r=(e<<1)+8|0;a:do if((y|0)>1){v=(x|0)>1;w=1;l=a+((e<<2)+4)|0;f=n+(B+1<<1)|0;k=0;b:while(1){if(v){q=1;p=f;o=k;while(1){do if((d[l+1>>0]|0|0)>(g|0)){k=b[p+(u<<1)>>1]|0;if(k<<16>>16>0){b[p>>1]=k;k=(k<<16>>16)*7|0;n=j+1310736+(k+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=j+1310736+(k+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+q;n=j+1310736+(k+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=o;break}a=b[p+(s<<1)>>1]|0;e=a<<16>>16;k=b[p+(t<<1)>>1]|0;n=k<<16>>16;f=k<<16>>16>0;if(a<<16>>16<=0){if(f){b[p>>1]=k;k=n*7|0;f=j+1310736+(k+-7<<2)|0;c[f>>2]=(c[f>>2]|0)+1;f=j+1310736+(k+-6<<2)|0;c[f>>2]=(c[f>>2]|0)+q;f=j+1310736+(k+-5<<2)|0;c[f>>2]=(c[f>>2]|0)+w;f=j+1310736+(k+-3<<2)|0;if((c[f>>2]|0)<(q|0))c[f>>2]=q;c[j+1310736+(k+-1<<2)>>2]=w;k=o;break}k=b[p+-2>>1]|0;if(k<<16>>16>0){b[p>>1]=k;k=(k<<16>>16)*7|0;n=j+1310736+(k+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=j+1310736+(k+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+q;n=j+1310736+(k+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+w;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(q|0)){k=o;break}c[k>>2]=q;k=o;break}else{k=o+1|0;if((o|0)>32767)break b;b[p>>1]=k;c[j+1179664+(o<<2)>>2]=k<<16>>16;o=o*7|0;c[j+1310736+(o<<2)>>2]=1;c[j+1310736+(o+1<<2)>>2]=q;c[j+1310736+(o+2<<2)>>2]=w;c[j+1310736+(o+3<<2)>>2]=q;c[j+1310736+(o+4<<2)>>2]=q;c[j+1310736+(o+5<<2)>>2]=w;c[j+1310736+(o+6<<2)>>2]=w;break}}if(f){k=c[j+1179664+(e+-1<<2)>>2]|0;e=c[j+1179664+(n+-1<<2)>>2]|0;if((k|0)>(e|0)){b[p>>1]=e;if((o|0)>0){f=0;a=m;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=e;f=f+1|0;if((f|0)>=(o|0)){k=e;break}else a=a+4|0}}else k=e}else{b[p>>1]=k;if((k|0)<(e|0)&(o|0)>0){f=0;a=m;while(1){if((c[a>>2]|0)==(e|0))c[a>>2]=k;f=f+1|0;if((f|0)>=(o|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;n=j+1310736+(k+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=j+1310736+(k+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+q;n=j+1310736+(k+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=o;break}f=b[p+-2>>1]|0;if(f<<16>>16<=0){b[p>>1]=a;k=e*7|0;f=j+1310736+(k+-7<<2)|0;c[f>>2]=(c[f>>2]|0)+1;f=j+1310736+(k+-6<<2)|0;c[f>>2]=(c[f>>2]|0)+q;f=j+1310736+(k+-5<<2)|0;c[f>>2]=(c[f>>2]|0)+w;f=j+1310736+(k+-4<<2)|0;if((c[f>>2]|0)>(q|0))c[f>>2]=q;c[j+1310736+(k+-1<<2)>>2]=w;k=o;break}k=c[j+1179664+(e+-1<<2)>>2]|0;e=c[j+1179664+((f<<16>>16)+-1<<2)>>2]|0;if((k|0)>(e|0)){b[p>>1]=e;if((o|0)>0){f=0;a=m;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=e;f=f+1|0;if((f|0)>=(o|0)){k=e;break}else a=a+4|0}}else k=e}else{b[p>>1]=k;if((k|0)<(e|0)&(o|0)>0){f=0;a=m;while(1){if((c[a>>2]|0)==(e|0))c[a>>2]=k;f=f+1|0;if((f|0)>=(o|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;n=j+1310736+(k+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=j+1310736+(k+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+q;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+w;k=o}else{b[p>>1]=0;k=o}while(0);q=q+1|0;l=l+4|0;f=p+2|0;if((q|0)>=(x|0))break;else{p=f;o=k}}}w=w+1|0;if((w|0)>=(y|0)){n=k;A=52;break a}else{l=l+r|0;f=f+4|0}}Me(3,3904,z);k=-1}else{n=0;A=52}while(0);if((A|0)==52){a=j+12|0;if((n|0)<1)l=1;else{f=1;l=1;while(1){k=c[m>>2]|0;if((k|0)==(f|0)){k=l;l=l+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[m>>2]=k;if((f|0)<(n|0)){f=f+1|0;m=m+4|0}else break}}e=j+8|0;k=l+-1|0;c[e>>2]=k;if(k){ek(a|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((l|0)>1){k=0;do{A=k<<2;c[j+131084+(A<<2)>>2]=B;c[j+131084+((A|1)<<2)>>2]=0;c[j+131084+((A|2)<<2)>>2]=C;c[j+131084+((A|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[e>>2]|0))}if((n|0)>0){a=0;do{m=(c[j+1179664+(a<<2)>>2]|0)+-1|0;f=a*7|0;k=j+12+(m<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(f<<2)>>2]|0);k=m<<1;l=j+655376+(k<<3)|0;h[l>>3]=+h[l>>3]+ +(c[j+1310736+(f+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(f+2<<2)>>2]|0);m=m<<2;k=j+131084+(m<<2)|0;l=c[j+1310736+(f+3<<2)>>2]|0;if((c[k>>2]|0)>(l|0))c[k>>2]=l;k=j+131084+((m|1)<<2)|0;l=c[j+1310736+(f+4<<2)>>2]|0;if((c[k>>2]|0)<(l|0))c[k>>2]=l;k=j+131084+((m|2)<<2)|0;l=c[j+1310736+(f+5<<2)>>2]|0;if((c[k>>2]|0)>(l|0))c[k>>2]=l;l=j+131084+((m|3)<<2)|0;k=c[j+1310736+(f+6<<2)>>2]|0;if((c[l>>2]|0)<(k|0))c[l>>2]=k;a=a+1|0}while((a|0)<(n|0))}if((c[e>>2]|0)>0){k=0;do{B=j+12+(k<<2)|0;C=k<<1;A=j+655376+(C<<3)|0;h[A>>3]=+h[A>>3]/+(c[B>>2]|0);C=j+655376+((C|1)<<3)|0;h[C>>3]=+h[C>>3]/+(c[B>>2]|0);k=k+1|0}while((k|0)<(c[e>>2]|0));k=0}else k=0}else k=0}i=D;return k|0}function Oc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;D=i;i=i+16|0;z=D;B=(e|0)/2|0;C=(f|0)/2|0;n=c[j>>2]|0;y=C+-1|0;if((e|0)>1){k=0;l=n;m=n+(($(y,B)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(B|0))break;else{l=l+2|0;m=m+2|0}}}x=B+-1|0;if((f|0)>1){k=0;l=n;m=n+(x<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(C|0))break;else{l=l+(B<<1)|0;m=m+(B<<1)|0}}}m=j+1179664|0;u=0-B|0;s=1-B|0;t=~B;r=(e<<1)+8|0;a:do if((y|0)>1){v=(x|0)>1;w=1;l=a+((e<<2)+4)|0;f=n+(B+1<<1)|0;k=0;b:while(1){if(v){q=1;p=f;o=k;while(1){do if((d[l>>0]|0|0)>(g|0)){k=b[p+(u<<1)>>1]|0;if(k<<16>>16>0){b[p>>1]=k;k=(k<<16>>16)*7|0;n=j+1310736+(k+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=j+1310736+(k+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+q;n=j+1310736+(k+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=o;break}a=b[p+(s<<1)>>1]|0;e=a<<16>>16;k=b[p+(t<<1)>>1]|0;n=k<<16>>16;f=k<<16>>16>0;if(a<<16>>16<=0){if(f){b[p>>1]=k;k=n*7|0;f=j+1310736+(k+-7<<2)|0;c[f>>2]=(c[f>>2]|0)+1;f=j+1310736+(k+-6<<2)|0;c[f>>2]=(c[f>>2]|0)+q;f=j+1310736+(k+-5<<2)|0;c[f>>2]=(c[f>>2]|0)+w;f=j+1310736+(k+-3<<2)|0;if((c[f>>2]|0)<(q|0))c[f>>2]=q;c[j+1310736+(k+-1<<2)>>2]=w;k=o;break}k=b[p+-2>>1]|0;if(k<<16>>16>0){b[p>>1]=k;k=(k<<16>>16)*7|0;n=j+1310736+(k+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=j+1310736+(k+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+q;n=j+1310736+(k+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+w;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(q|0)){k=o;break}c[k>>2]=q;k=o;break}else{k=o+1|0;if((o|0)>32767)break b;b[p>>1]=k;c[j+1179664+(o<<2)>>2]=k<<16>>16;o=o*7|0;c[j+1310736+(o<<2)>>2]=1;c[j+1310736+(o+1<<2)>>2]=q;c[j+1310736+(o+2<<2)>>2]=w;c[j+1310736+(o+3<<2)>>2]=q;c[j+1310736+(o+4<<2)>>2]=q;c[j+1310736+(o+5<<2)>>2]=w;c[j+1310736+(o+6<<2)>>2]=w;break}}if(f){k=c[j+1179664+(e+-1<<2)>>2]|0;e=c[j+1179664+(n+-1<<2)>>2]|0;if((k|0)>(e|0)){b[p>>1]=e;if((o|0)>0){f=0;a=m;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=e;f=f+1|0;if((f|0)>=(o|0)){k=e;break}else a=a+4|0}}else k=e}else{b[p>>1]=k;if((k|0)<(e|0)&(o|0)>0){f=0;a=m;while(1){if((c[a>>2]|0)==(e|0))c[a>>2]=k;f=f+1|0;if((f|0)>=(o|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;n=j+1310736+(k+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=j+1310736+(k+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+q;n=j+1310736+(k+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=o;break}f=b[p+-2>>1]|0;if(f<<16>>16<=0){b[p>>1]=a;k=e*7|0;f=j+1310736+(k+-7<<2)|0;c[f>>2]=(c[f>>2]|0)+1;f=j+1310736+(k+-6<<2)|0;c[f>>2]=(c[f>>2]|0)+q;f=j+1310736+(k+-5<<2)|0;c[f>>2]=(c[f>>2]|0)+w;f=j+1310736+(k+-4<<2)|0;if((c[f>>2]|0)>(q|0))c[f>>2]=q;c[j+1310736+(k+-1<<2)>>2]=w;k=o;break}k=c[j+1179664+(e+-1<<2)>>2]|0;e=c[j+1179664+((f<<16>>16)+-1<<2)>>2]|0;if((k|0)>(e|0)){b[p>>1]=e;if((o|0)>0){f=0;a=m;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=e;f=f+1|0;if((f|0)>=(o|0)){k=e;break}else a=a+4|0}}else k=e}else{b[p>>1]=k;if((k|0)<(e|0)&(o|0)>0){f=0;a=m;while(1){if((c[a>>2]|0)==(e|0))c[a>>2]=k;f=f+1|0;if((f|0)>=(o|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;n=j+1310736+(k+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=j+1310736+(k+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+q;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+w;k=o}else{b[p>>1]=0;k=o}while(0);q=q+1|0;l=l+4|0;f=p+2|0;if((q|0)>=(x|0))break;else{p=f;o=k}}}w=w+1|0;if((w|0)>=(y|0)){n=k;A=52;break a}else{l=l+r|0;f=f+4|0}}Me(3,3904,z);k=-1}else{n=0;A=52}while(0);if((A|0)==52){a=j+12|0;if((n|0)<1)l=1;else{f=1;l=1;while(1){k=c[m>>2]|0;if((k|0)==(f|0)){k=l;l=l+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[m>>2]=k;if((f|0)<(n|0)){f=f+1|0;m=m+4|0}else break}}e=j+8|0;k=l+-1|0;c[e>>2]=k;if(k){ek(a|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((l|0)>1){k=0;do{A=k<<2;c[j+131084+(A<<2)>>2]=B;c[j+131084+((A|1)<<2)>>2]=0;c[j+131084+((A|2)<<2)>>2]=C;c[j+131084+((A|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[e>>2]|0))}if((n|0)>0){a=0;do{m=(c[j+1179664+(a<<2)>>2]|0)+-1|0;f=a*7|0;k=j+12+(m<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(f<<2)>>2]|0);k=m<<1;l=j+655376+(k<<3)|0;h[l>>3]=+h[l>>3]+ +(c[j+1310736+(f+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(f+2<<2)>>2]|0);m=m<<2;k=j+131084+(m<<2)|0;l=c[j+1310736+(f+3<<2)>>2]|0;if((c[k>>2]|0)>(l|0))c[k>>2]=l;k=j+131084+((m|1)<<2)|0;l=c[j+1310736+(f+4<<2)>>2]|0;if((c[k>>2]|0)<(l|0))c[k>>2]=l;k=j+131084+((m|2)<<2)|0;l=c[j+1310736+(f+5<<2)>>2]|0;if((c[k>>2]|0)>(l|0))c[k>>2]=l;l=j+131084+((m|3)<<2)|0;k=c[j+1310736+(f+6<<2)>>2]|0;if((c[l>>2]|0)<(k|0))c[l>>2]=k;a=a+1|0}while((a|0)<(n|0))}if((c[e>>2]|0)>0){k=0;do{B=j+12+(k<<2)|0;C=k<<1;A=j+655376+(C<<3)|0;h[A>>3]=+h[A>>3]/+(c[B>>2]|0);C=j+655376+((C|1)<<3)|0;h[C>>3]=+h[C>>3]/+(c[B>>2]|0);k=k+1|0}while((k|0)<(c[e>>2]|0));k=0}else k=0}else k=0}i=D;return k|0}function Pc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=i;i=i+16|0;A=C;n=c[j>>2]|0;z=f+-1|0;if((e|0)>0){k=0;l=n;m=n+(($(z,e)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(e|0))break;else{l=l+2|0;m=m+2|0}}}y=g*3|0;x=e+-1|0;if((f|0)>0){k=0;g=n;l=n+(x<<1)|0;while(1){b[l>>1]=0;b[g>>1]=0;k=k+1|0;if((k|0)>=(f|0))break;else{g=g+(e<<1)|0;l=l+(e<<1)|0}}}l=j+1179664|0;k=e+1|0;u=0-e|0;s=1-e|0;t=~e;a:do if((z|0)>1){v=(x|0)>1;w=1;g=a+(k*3|0)|0;m=n+(k<<1)|0;k=0;b:while(1){if(v){r=1;q=m;p=k;while(1){do if(((d[g+1>>0]|0)+(d[g>>0]|0)+(d[g+2>>0]|0)|0)>(y|0)){k=b[q+(u<<1)>>1]|0;if(k<<16>>16>0){b[q>>1]=k;k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}a=b[q+(s<<1)>>1]|0;n=a<<16>>16;k=b[q+(t<<1)>>1]|0;o=k<<16>>16;m=k<<16>>16>0;if(a<<16>>16<=0){if(m){b[q>>1]=k;k=o*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+r;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+w;m=j+1310736+(k+-3<<2)|0;if((c[m>>2]|0)<(r|0))c[m>>2]=r;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}k=b[q+-2>>1]|0;if(k<<16>>16>0){b[q>>1]=k;k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(r|0)){k=p;break}c[k>>2]=r;k=p;break}else{k=p+1|0;if((p|0)>32767)break b;b[q>>1]=k;c[j+1179664+(p<<2)>>2]=k<<16>>16;p=p*7|0;c[j+1310736+(p<<2)>>2]=1;c[j+1310736+(p+1<<2)>>2]=r;c[j+1310736+(p+2<<2)>>2]=w;c[j+1310736+(p+3<<2)>>2]=r;c[j+1310736+(p+4<<2)>>2]=r;c[j+1310736+(p+5<<2)>>2]=w;c[j+1310736+(p+6<<2)>>2]=w;break}}if(m){k=c[j+1179664+(n+-1<<2)>>2]|0;n=c[j+1179664+(o+-1<<2)>>2]|0;if((k|0)>(n|0)){b[q>>1]=n;if((p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=n;m=m+1|0;if((m|0)>=(p|0)){k=n;break}else a=a+4|0}}else k=n}else{b[q>>1]=k;if((k|0)<(n|0)&(p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(n|0))c[a>>2]=k;m=m+1|0;if((m|0)>=(p|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}m=b[q+-2>>1]|0;if(m<<16>>16<=0){b[q>>1]=a;k=n*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+r;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+w;m=j+1310736+(k+-4<<2)|0;if((c[m>>2]|0)>(r|0))c[m>>2]=r;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}k=c[j+1179664+(n+-1<<2)>>2]|0;n=c[j+1179664+((m<<16>>16)+-1<<2)>>2]|0;if((k|0)>(n|0)){b[q>>1]=n;if((p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=n;m=m+1|0;if((m|0)>=(p|0)){k=n;break}else a=a+4|0}}else k=n}else{b[q>>1]=k;if((k|0)<(n|0)&(p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(n|0))c[a>>2]=k;m=m+1|0;if((m|0)>=(p|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+w;k=p}else{b[q>>1]=0;k=p}while(0);r=r+1|0;g=g+3|0;m=q+2|0;if((r|0)>=(x|0))break;else{q=m;p=k}}}w=w+1|0;if((w|0)>=(z|0)){o=k;B=52;break a}else{g=g+6|0;m=m+4|0}}Me(3,3904,A);k=-1}else{o=0;B=52}while(0);if((B|0)==52){a=j+12|0;if((o|0)<1)g=1;else{m=1;g=1;while(1){k=c[l>>2]|0;if((k|0)==(m|0)){k=g;g=g+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[l>>2]=k;if((m|0)<(o|0)){m=m+1|0;l=l+4|0}else break}}n=j+8|0;k=g+-1|0;c[n>>2]=k;if(k){ek(a|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((g|0)>1){k=0;do{B=k<<2;c[j+131084+(B<<2)>>2]=e;c[j+131084+((B|1)<<2)>>2]=0;c[j+131084+((B|2)<<2)>>2]=f;c[j+131084+((B|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[n>>2]|0))}if((o|0)>0){a=0;do{l=(c[j+1179664+(a<<2)>>2]|0)+-1|0;m=a*7|0;k=j+12+(l<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(m<<2)>>2]|0);k=l<<1;g=j+655376+(k<<3)|0;h[g>>3]=+h[g>>3]+ +(c[j+1310736+(m+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(m+2<<2)>>2]|0);l=l<<2;k=j+131084+(l<<2)|0;g=c[j+1310736+(m+3<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;k=j+131084+((l|1)<<2)|0;g=c[j+1310736+(m+4<<2)>>2]|0;if((c[k>>2]|0)<(g|0))c[k>>2]=g;k=j+131084+((l|2)<<2)|0;g=c[j+1310736+(m+5<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;g=j+131084+((l|3)<<2)|0;k=c[j+1310736+(m+6<<2)>>2]|0;if((c[g>>2]|0)<(k|0))c[g>>2]=k;a=a+1|0}while((a|0)<(o|0))}if((c[n>>2]|0)>0){k=0;do{e=j+12+(k<<2)|0;f=k<<1;B=j+655376+(f<<3)|0;h[B>>3]=+h[B>>3]/+(c[e>>2]|0);f=j+655376+((f|1)<<3)|0;h[f>>3]=+h[f>>3]/+(c[e>>2]|0);k=k+1|0}while((k|0)<(c[n>>2]|0));k=0}else k=0}else k=0}i=C;return k|0}function Qc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=i;i=i+16|0;A=C;n=c[j>>2]|0;z=f+-1|0;if((e|0)>0){k=0;l=n;m=n+(($(z,e)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(e|0))break;else{l=l+2|0;m=m+2|0}}}y=g*3|0;x=e+-1|0;if((f|0)>0){k=0;g=n;l=n+(x<<1)|0;while(1){b[l>>1]=0;b[g>>1]=0;k=k+1|0;if((k|0)>=(f|0))break;else{g=g+(e<<1)|0;l=l+(e<<1)|0}}}l=j+1179664|0;k=e+1|0;u=0-e|0;s=1-e|0;t=~e;a:do if((z|0)>1){v=(x|0)>1;w=1;g=a+(k<<1)|0;m=n+(k<<1)|0;k=0;b:while(1){if(v){r=1;q=m;p=k;while(1){n=d[g>>0]|0;o=d[g+1>>0]|0;do if(((n&248)+10+(n<<5&224)+(o>>>3&28)+(o<<3&248)|0)>(y|0)){k=b[q+(u<<1)>>1]|0;if(k<<16>>16>0){b[q>>1]=k;k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}a=b[q+(s<<1)>>1]|0;n=a<<16>>16;k=b[q+(t<<1)>>1]|0;o=k<<16>>16;m=k<<16>>16>0;if(a<<16>>16<=0){if(m){b[q>>1]=k;k=o*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+r;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+w;m=j+1310736+(k+-3<<2)|0;if((c[m>>2]|0)<(r|0))c[m>>2]=r;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}k=b[q+-2>>1]|0;if(k<<16>>16>0){b[q>>1]=k;k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(r|0)){k=p;break}c[k>>2]=r;k=p;break}else{k=p+1|0;if((p|0)>32767)break b;b[q>>1]=k;c[j+1179664+(p<<2)>>2]=k<<16>>16;p=p*7|0;c[j+1310736+(p<<2)>>2]=1;c[j+1310736+(p+1<<2)>>2]=r;c[j+1310736+(p+2<<2)>>2]=w;c[j+1310736+(p+3<<2)>>2]=r;c[j+1310736+(p+4<<2)>>2]=r;c[j+1310736+(p+5<<2)>>2]=w;c[j+1310736+(p+6<<2)>>2]=w;break}}if(m){k=c[j+1179664+(n+-1<<2)>>2]|0;n=c[j+1179664+(o+-1<<2)>>2]|0;if((k|0)>(n|0)){b[q>>1]=n;if((p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=n;m=m+1|0;if((m|0)>=(p|0)){k=n;break}else a=a+4|0}}else k=n}else{b[q>>1]=k;if((k|0)<(n|0)&(p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(n|0))c[a>>2]=k;m=m+1|0;if((m|0)>=(p|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}m=b[q+-2>>1]|0;if(m<<16>>16<=0){b[q>>1]=a;k=n*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+r;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+w;m=j+1310736+(k+-4<<2)|0;if((c[m>>2]|0)>(r|0))c[m>>2]=r;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}k=c[j+1179664+(n+-1<<2)>>2]|0;n=c[j+1179664+((m<<16>>16)+-1<<2)>>2]|0;if((k|0)>(n|0)){b[q>>1]=n;if((p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=n;m=m+1|0;if((m|0)>=(p|0)){k=n;break}else a=a+4|0}}else k=n}else{b[q>>1]=k;if((k|0)<(n|0)&(p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(n|0))c[a>>2]=k;m=m+1|0;if((m|0)>=(p|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+w;k=p}else{b[q>>1]=0;k=p}while(0);r=r+1|0;g=g+2|0;m=q+2|0;if((r|0)>=(x|0))break;else{q=m;p=k}}}w=w+1|0;if((w|0)>=(z|0)){o=k;B=52;break a}else{g=g+4|0;m=m+4|0}}Me(3,3904,A);k=-1}else{o=0;B=52}while(0);if((B|0)==52){a=j+12|0;if((o|0)<1)g=1;else{m=1;g=1;while(1){k=c[l>>2]|0;if((k|0)==(m|0)){k=g;g=g+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[l>>2]=k;if((m|0)<(o|0)){m=m+1|0;l=l+4|0}else break}}n=j+8|0;k=g+-1|0;c[n>>2]=k;if(k){ek(a|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((g|0)>1){k=0;do{B=k<<2;c[j+131084+(B<<2)>>2]=e;c[j+131084+((B|1)<<2)>>2]=0;c[j+131084+((B|2)<<2)>>2]=f;c[j+131084+((B|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[n>>2]|0))}if((o|0)>0){a=0;do{l=(c[j+1179664+(a<<2)>>2]|0)+-1|0;m=a*7|0;k=j+12+(l<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(m<<2)>>2]|0);k=l<<1;g=j+655376+(k<<3)|0;h[g>>3]=+h[g>>3]+ +(c[j+1310736+(m+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(m+2<<2)>>2]|0);l=l<<2;k=j+131084+(l<<2)|0;g=c[j+1310736+(m+3<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;k=j+131084+((l|1)<<2)|0;g=c[j+1310736+(m+4<<2)>>2]|0;if((c[k>>2]|0)<(g|0))c[k>>2]=g;k=j+131084+((l|2)<<2)|0;g=c[j+1310736+(m+5<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;g=j+131084+((l|3)<<2)|0;k=c[j+1310736+(m+6<<2)>>2]|0;if((c[g>>2]|0)<(k|0))c[g>>2]=k;a=a+1|0}while((a|0)<(o|0))}if((c[n>>2]|0)>0){k=0;do{e=j+12+(k<<2)|0;f=k<<1;B=j+655376+(f<<3)|0;h[B>>3]=+h[B>>3]/+(c[e>>2]|0);f=j+655376+((f|1)<<3)|0;h[f>>3]=+h[f>>3]/+(c[e>>2]|0);k=k+1|0}while((k|0)<(c[n>>2]|0));k=0}else k=0}else k=0}i=C;return k|0}function Rc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=i;i=i+16|0;A=C;n=c[j>>2]|0;z=f+-1|0;if((e|0)>0){k=0;l=n;m=n+(($(z,e)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(e|0))break;else{l=l+2|0;m=m+2|0}}}y=g*3|0;x=e+-1|0;if((f|0)>0){k=0;g=n;l=n+(x<<1)|0;while(1){b[l>>1]=0;b[g>>1]=0;k=k+1|0;if((k|0)>=(f|0))break;else{g=g+(e<<1)|0;l=l+(e<<1)|0}}}l=j+1179664|0;k=e+1|0;u=0-e|0;s=1-e|0;t=~e;a:do if((z|0)>1){v=(x|0)>1;w=1;g=a+(k<<2)|0;m=n+(k<<1)|0;k=0;b:while(1){if(v){r=1;q=m;p=k;while(1){do if(((d[g+1>>0]|0)+(d[g>>0]|0)+(d[g+2>>0]|0)|0)>(y|0)){k=b[q+(u<<1)>>1]|0;if(k<<16>>16>0){b[q>>1]=k;k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}a=b[q+(s<<1)>>1]|0;n=a<<16>>16;k=b[q+(t<<1)>>1]|0;o=k<<16>>16;m=k<<16>>16>0;if(a<<16>>16<=0){if(m){b[q>>1]=k;k=o*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+r;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+w;m=j+1310736+(k+-3<<2)|0;if((c[m>>2]|0)<(r|0))c[m>>2]=r;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}k=b[q+-2>>1]|0;if(k<<16>>16>0){b[q>>1]=k;k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(r|0)){k=p;break}c[k>>2]=r;k=p;break}else{k=p+1|0;if((p|0)>32767)break b;b[q>>1]=k;c[j+1179664+(p<<2)>>2]=k<<16>>16;p=p*7|0;c[j+1310736+(p<<2)>>2]=1;c[j+1310736+(p+1<<2)>>2]=r;c[j+1310736+(p+2<<2)>>2]=w;c[j+1310736+(p+3<<2)>>2]=r;c[j+1310736+(p+4<<2)>>2]=r;c[j+1310736+(p+5<<2)>>2]=w;c[j+1310736+(p+6<<2)>>2]=w;break}}if(m){k=c[j+1179664+(n+-1<<2)>>2]|0;n=c[j+1179664+(o+-1<<2)>>2]|0;if((k|0)>(n|0)){b[q>>1]=n;if((p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=n;m=m+1|0;if((m|0)>=(p|0)){k=n;break}else a=a+4|0}}else k=n}else{b[q>>1]=k;if((k|0)<(n|0)&(p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(n|0))c[a>>2]=k;m=m+1|0;if((m|0)>=(p|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}m=b[q+-2>>1]|0;if(m<<16>>16<=0){b[q>>1]=a;k=n*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+r;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+w;m=j+1310736+(k+-4<<2)|0;if((c[m>>2]|0)>(r|0))c[m>>2]=r;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}k=c[j+1179664+(n+-1<<2)>>2]|0;n=c[j+1179664+((m<<16>>16)+-1<<2)>>2]|0;if((k|0)>(n|0)){b[q>>1]=n;if((p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=n;m=m+1|0;if((m|0)>=(p|0)){k=n;break}else a=a+4|0}}else k=n}else{b[q>>1]=k;if((k|0)<(n|0)&(p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(n|0))c[a>>2]=k;m=m+1|0;if((m|0)>=(p|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+w;k=p}else{b[q>>1]=0;k=p}while(0);r=r+1|0;g=g+4|0;m=q+2|0;if((r|0)>=(x|0))break;else{q=m;p=k}}}w=w+1|0;if((w|0)>=(z|0)){o=k;B=52;break a}else{g=g+8|0;m=m+4|0}}Me(3,3904,A);k=-1}else{o=0;B=52}while(0);if((B|0)==52){a=j+12|0;if((o|0)<1)g=1;else{m=1;g=1;while(1){k=c[l>>2]|0;if((k|0)==(m|0)){k=g;g=g+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[l>>2]=k;if((m|0)<(o|0)){m=m+1|0;l=l+4|0}else break}}n=j+8|0;k=g+-1|0;c[n>>2]=k;if(k){ek(a|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((g|0)>1){k=0;do{B=k<<2;c[j+131084+(B<<2)>>2]=e;c[j+131084+((B|1)<<2)>>2]=0;c[j+131084+((B|2)<<2)>>2]=f;c[j+131084+((B|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[n>>2]|0))}if((o|0)>0){a=0;do{l=(c[j+1179664+(a<<2)>>2]|0)+-1|0;m=a*7|0;k=j+12+(l<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(m<<2)>>2]|0);k=l<<1;g=j+655376+(k<<3)|0;h[g>>3]=+h[g>>3]+ +(c[j+1310736+(m+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(m+2<<2)>>2]|0);l=l<<2;k=j+131084+(l<<2)|0;g=c[j+1310736+(m+3<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;k=j+131084+((l|1)<<2)|0;g=c[j+1310736+(m+4<<2)>>2]|0;if((c[k>>2]|0)<(g|0))c[k>>2]=g;k=j+131084+((l|2)<<2)|0;g=c[j+1310736+(m+5<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;g=j+131084+((l|3)<<2)|0;k=c[j+1310736+(m+6<<2)>>2]|0;if((c[g>>2]|0)<(k|0))c[g>>2]=k;a=a+1|0}while((a|0)<(o|0))}if((c[n>>2]|0)>0){k=0;do{e=j+12+(k<<2)|0;f=k<<1;B=j+655376+(f<<3)|0;h[B>>3]=+h[B>>3]/+(c[e>>2]|0);f=j+655376+((f|1)<<3)|0;h[f>>3]=+h[f>>3]/+(c[e>>2]|0);k=k+1|0}while((k|0)<(c[n>>2]|0));k=0}else k=0}else k=0}i=C;return k|0}function Sc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=i;i=i+16|0;A=C;n=c[j>>2]|0;z=f+-1|0;if((e|0)>0){k=0;l=n;m=n+(($(z,e)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(e|0))break;else{l=l+2|0;m=m+2|0}}}y=g*3|0;x=e+-1|0;if((f|0)>0){k=0;g=n;l=n+(x<<1)|0;while(1){b[l>>1]=0;b[g>>1]=0;k=k+1|0;if((k|0)>=(f|0))break;else{g=g+(e<<1)|0;l=l+(e<<1)|0}}}l=j+1179664|0;k=e+1|0;u=0-e|0;s=1-e|0;t=~e;a:do if((z|0)>1){v=(x|0)>1;w=1;g=a+(k<<1)|0;m=n+(k<<1)|0;k=0;b:while(1){if(v){r=1;q=m;p=k;while(1){o=d[g>>0]|0;do if(((o&240)+24+(o<<4&240)+((d[g+1>>0]|0)&240)|0)>(y|0)){k=b[q+(u<<1)>>1]|0;if(k<<16>>16>0){b[q>>1]=k;k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}a=b[q+(s<<1)>>1]|0;n=a<<16>>16;k=b[q+(t<<1)>>1]|0;o=k<<16>>16;m=k<<16>>16>0;if(a<<16>>16<=0){if(m){b[q>>1]=k;k=o*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+r;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+w;m=j+1310736+(k+-3<<2)|0;if((c[m>>2]|0)<(r|0))c[m>>2]=r;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}k=b[q+-2>>1]|0;if(k<<16>>16>0){b[q>>1]=k;k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(r|0)){k=p;break}c[k>>2]=r;k=p;break}else{k=p+1|0;if((p|0)>32767)break b;b[q>>1]=k;c[j+1179664+(p<<2)>>2]=k<<16>>16;p=p*7|0;c[j+1310736+(p<<2)>>2]=1;c[j+1310736+(p+1<<2)>>2]=r;c[j+1310736+(p+2<<2)>>2]=w;c[j+1310736+(p+3<<2)>>2]=r;c[j+1310736+(p+4<<2)>>2]=r;c[j+1310736+(p+5<<2)>>2]=w;c[j+1310736+(p+6<<2)>>2]=w;break}}if(m){k=c[j+1179664+(n+-1<<2)>>2]|0;n=c[j+1179664+(o+-1<<2)>>2]|0;if((k|0)>(n|0)){b[q>>1]=n;if((p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=n;m=m+1|0;if((m|0)>=(p|0)){k=n;break}else a=a+4|0}}else k=n}else{b[q>>1]=k;if((k|0)<(n|0)&(p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(n|0))c[a>>2]=k;m=m+1|0;if((m|0)>=(p|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}m=b[q+-2>>1]|0;if(m<<16>>16<=0){b[q>>1]=a;k=n*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+r;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+w;m=j+1310736+(k+-4<<2)|0;if((c[m>>2]|0)>(r|0))c[m>>2]=r;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}k=c[j+1179664+(n+-1<<2)>>2]|0;n=c[j+1179664+((m<<16>>16)+-1<<2)>>2]|0;if((k|0)>(n|0)){b[q>>1]=n;if((p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=n;m=m+1|0;if((m|0)>=(p|0)){k=n;break}else a=a+4|0}}else k=n}else{b[q>>1]=k;if((k|0)<(n|0)&(p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(n|0))c[a>>2]=k;m=m+1|0;if((m|0)>=(p|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+w;k=p}else{b[q>>1]=0;k=p}while(0);r=r+1|0;g=g+2|0;m=q+2|0;if((r|0)>=(x|0))break;else{q=m;p=k}}}w=w+1|0;if((w|0)>=(z|0)){o=k;B=52;break a}else{g=g+4|0;m=m+4|0}}Me(3,3904,A);k=-1}else{o=0;B=52}while(0);if((B|0)==52){a=j+12|0;if((o|0)<1)g=1;else{m=1;g=1;while(1){k=c[l>>2]|0;if((k|0)==(m|0)){k=g;g=g+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[l>>2]=k;if((m|0)<(o|0)){m=m+1|0;l=l+4|0}else break}}n=j+8|0;k=g+-1|0;c[n>>2]=k;if(k){ek(a|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((g|0)>1){k=0;do{B=k<<2;c[j+131084+(B<<2)>>2]=e;c[j+131084+((B|1)<<2)>>2]=0;c[j+131084+((B|2)<<2)>>2]=f;c[j+131084+((B|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[n>>2]|0))}if((o|0)>0){a=0;do{l=(c[j+1179664+(a<<2)>>2]|0)+-1|0;m=a*7|0;k=j+12+(l<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(m<<2)>>2]|0);k=l<<1;g=j+655376+(k<<3)|0;h[g>>3]=+h[g>>3]+ +(c[j+1310736+(m+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(m+2<<2)>>2]|0);l=l<<2;k=j+131084+(l<<2)|0;g=c[j+1310736+(m+3<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;k=j+131084+((l|1)<<2)|0;g=c[j+1310736+(m+4<<2)>>2]|0;if((c[k>>2]|0)<(g|0))c[k>>2]=g;k=j+131084+((l|2)<<2)|0;g=c[j+1310736+(m+5<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;g=j+131084+((l|3)<<2)|0;k=c[j+1310736+(m+6<<2)>>2]|0;if((c[g>>2]|0)<(k|0))c[g>>2]=k;a=a+1|0}while((a|0)<(o|0))}if((c[n>>2]|0)>0){k=0;do{e=j+12+(k<<2)|0;f=k<<1;B=j+655376+(f<<3)|0;h[B>>3]=+h[B>>3]/+(c[e>>2]|0);f=j+655376+((f|1)<<3)|0;h[f>>3]=+h[f>>3]/+(c[e>>2]|0);k=k+1|0}while((k|0)<(c[n>>2]|0));k=0}else k=0}else k=0}i=C;return k|0}function Tc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=i;i=i+16|0;A=C;n=c[j>>2]|0;z=f+-1|0;if((e|0)>0){k=0;l=n;m=n+(($(z,e)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(e|0))break;else{l=l+2|0;m=m+2|0}}}y=g*3|0;x=e+-1|0;if((f|0)>0){k=0;g=n;l=n+(x<<1)|0;while(1){b[l>>1]=0;b[g>>1]=0;k=k+1|0;if((k|0)>=(f|0))break;else{g=g+(e<<1)|0;l=l+(e<<1)|0}}}l=j+1179664|0;k=e+1|0;u=0-e|0;s=1-e|0;t=~e;a:do if((z|0)>1){v=(x|0)>1;w=1;g=a+(k<<1)|0;m=n+(k<<1)|0;k=0;b:while(1){if(v){r=1;q=m;p=k;while(1){n=d[g>>0]|0;o=d[g+1>>0]|0;do if(((n&248)+12+(n<<5&224)+(o>>>3&24)+(o<<2&248)|0)>(y|0)){k=b[q+(u<<1)>>1]|0;if(k<<16>>16>0){b[q>>1]=k;k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}a=b[q+(s<<1)>>1]|0;n=a<<16>>16;k=b[q+(t<<1)>>1]|0;o=k<<16>>16;m=k<<16>>16>0;if(a<<16>>16<=0){if(m){b[q>>1]=k;k=o*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+r;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+w;m=j+1310736+(k+-3<<2)|0;if((c[m>>2]|0)<(r|0))c[m>>2]=r;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}k=b[q+-2>>1]|0;if(k<<16>>16>0){b[q>>1]=k;k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(r|0)){k=p;break}c[k>>2]=r;k=p;break}else{k=p+1|0;if((p|0)>32767)break b;b[q>>1]=k;c[j+1179664+(p<<2)>>2]=k<<16>>16;p=p*7|0;c[j+1310736+(p<<2)>>2]=1;c[j+1310736+(p+1<<2)>>2]=r;c[j+1310736+(p+2<<2)>>2]=w;c[j+1310736+(p+3<<2)>>2]=r;c[j+1310736+(p+4<<2)>>2]=r;c[j+1310736+(p+5<<2)>>2]=w;c[j+1310736+(p+6<<2)>>2]=w;break}}if(m){k=c[j+1179664+(n+-1<<2)>>2]|0;n=c[j+1179664+(o+-1<<2)>>2]|0;if((k|0)>(n|0)){b[q>>1]=n;if((p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=n;m=m+1|0;if((m|0)>=(p|0)){k=n;break}else a=a+4|0}}else k=n}else{b[q>>1]=k;if((k|0)<(n|0)&(p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(n|0))c[a>>2]=k;m=m+1|0;if((m|0)>=(p|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}m=b[q+-2>>1]|0;if(m<<16>>16<=0){b[q>>1]=a;k=n*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+r;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+w;m=j+1310736+(k+-4<<2)|0;if((c[m>>2]|0)>(r|0))c[m>>2]=r;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}k=c[j+1179664+(n+-1<<2)>>2]|0;n=c[j+1179664+((m<<16>>16)+-1<<2)>>2]|0;if((k|0)>(n|0)){b[q>>1]=n;if((p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=n;m=m+1|0;if((m|0)>=(p|0)){k=n;break}else a=a+4|0}}else k=n}else{b[q>>1]=k;if((k|0)<(n|0)&(p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(n|0))c[a>>2]=k;m=m+1|0;if((m|0)>=(p|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+w;k=p}else{b[q>>1]=0;k=p}while(0);r=r+1|0;g=g+2|0;m=q+2|0;if((r|0)>=(x|0))break;else{q=m;p=k}}}w=w+1|0;if((w|0)>=(z|0)){o=k;B=52;break a}else{g=g+4|0;m=m+4|0}}Me(3,3904,A);k=-1}else{o=0;B=52}while(0);if((B|0)==52){a=j+12|0;if((o|0)<1)g=1;else{m=1;g=1;while(1){k=c[l>>2]|0;if((k|0)==(m|0)){k=g;g=g+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[l>>2]=k;if((m|0)<(o|0)){m=m+1|0;l=l+4|0}else break}}n=j+8|0;k=g+-1|0;c[n>>2]=k;if(k){ek(a|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((g|0)>1){k=0;do{B=k<<2;c[j+131084+(B<<2)>>2]=e;c[j+131084+((B|1)<<2)>>2]=0;c[j+131084+((B|2)<<2)>>2]=f;c[j+131084+((B|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[n>>2]|0))}if((o|0)>0){a=0;do{l=(c[j+1179664+(a<<2)>>2]|0)+-1|0;m=a*7|0;k=j+12+(l<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(m<<2)>>2]|0);k=l<<1;g=j+655376+(k<<3)|0;h[g>>3]=+h[g>>3]+ +(c[j+1310736+(m+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(m+2<<2)>>2]|0);l=l<<2;k=j+131084+(l<<2)|0;g=c[j+1310736+(m+3<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;k=j+131084+((l|1)<<2)|0;g=c[j+1310736+(m+4<<2)>>2]|0;if((c[k>>2]|0)<(g|0))c[k>>2]=g;k=j+131084+((l|2)<<2)|0;g=c[j+1310736+(m+5<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;g=j+131084+((l|3)<<2)|0;k=c[j+1310736+(m+6<<2)>>2]|0;if((c[g>>2]|0)<(k|0))c[g>>2]=k;a=a+1|0}while((a|0)<(o|0))}if((c[n>>2]|0)>0){k=0;do{e=j+12+(k<<2)|0;f=k<<1;B=j+655376+(f<<3)|0;h[B>>3]=+h[B>>3]/+(c[e>>2]|0);f=j+655376+((f|1)<<3)|0;h[f>>3]=+h[f>>3]/+(c[e>>2]|0);k=k+1|0}while((k|0)<(c[n>>2]|0));k=0}else k=0}else k=0}i=C;return k|0}function Uc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=i;i=i+16|0;A=C;n=c[j>>2]|0;z=f+-1|0;if((e|0)>0){k=0;l=n;m=n+(($(z,e)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(e|0))break;else{l=l+2|0;m=m+2|0}}}y=g*3|0;x=e+-1|0;if((f|0)>0){k=0;g=n;l=n+(x<<1)|0;while(1){b[l>>1]=0;b[g>>1]=0;k=k+1|0;if((k|0)>=(f|0))break;else{g=g+(e<<1)|0;l=l+(e<<1)|0}}}l=j+1179664|0;k=e+1|0;u=0-e|0;s=1-e|0;t=~e;a:do if((z|0)>1){v=(x|0)>1;w=1;g=a+(k<<2)|0;m=n+(k<<1)|0;k=0;b:while(1){if(v){r=1;q=m;p=k;while(1){do if(((d[g+2>>0]|0)+(d[g+1>>0]|0)+(d[g+3>>0]|0)|0)>(y|0)){k=b[q+(u<<1)>>1]|0;if(k<<16>>16>0){b[q>>1]=k;k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}a=b[q+(s<<1)>>1]|0;n=a<<16>>16;k=b[q+(t<<1)>>1]|0;o=k<<16>>16;m=k<<16>>16>0;if(a<<16>>16<=0){if(m){b[q>>1]=k;k=o*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+r;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+w;m=j+1310736+(k+-3<<2)|0;if((c[m>>2]|0)<(r|0))c[m>>2]=r;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}k=b[q+-2>>1]|0;if(k<<16>>16>0){b[q>>1]=k;k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(r|0)){k=p;break}c[k>>2]=r;k=p;break}else{k=p+1|0;if((p|0)>32767)break b;b[q>>1]=k;c[j+1179664+(p<<2)>>2]=k<<16>>16;p=p*7|0;c[j+1310736+(p<<2)>>2]=1;c[j+1310736+(p+1<<2)>>2]=r;c[j+1310736+(p+2<<2)>>2]=w;c[j+1310736+(p+3<<2)>>2]=r;c[j+1310736+(p+4<<2)>>2]=r;c[j+1310736+(p+5<<2)>>2]=w;c[j+1310736+(p+6<<2)>>2]=w;break}}if(m){k=c[j+1179664+(n+-1<<2)>>2]|0;n=c[j+1179664+(o+-1<<2)>>2]|0;if((k|0)>(n|0)){b[q>>1]=n;if((p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=n;m=m+1|0;if((m|0)>=(p|0)){k=n;break}else a=a+4|0}}else k=n}else{b[q>>1]=k;if((k|0)<(n|0)&(p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(n|0))c[a>>2]=k;m=m+1|0;if((m|0)>=(p|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=j+1310736+(k+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+w;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}m=b[q+-2>>1]|0;if(m<<16>>16<=0){b[q>>1]=a;k=n*7|0;m=j+1310736+(k+-7<<2)|0;c[m>>2]=(c[m>>2]|0)+1;m=j+1310736+(k+-6<<2)|0;c[m>>2]=(c[m>>2]|0)+r;m=j+1310736+(k+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+w;m=j+1310736+(k+-4<<2)|0;if((c[m>>2]|0)>(r|0))c[m>>2]=r;c[j+1310736+(k+-1<<2)>>2]=w;k=p;break}k=c[j+1179664+(n+-1<<2)>>2]|0;n=c[j+1179664+((m<<16>>16)+-1<<2)>>2]|0;if((k|0)>(n|0)){b[q>>1]=n;if((p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(k|0))c[a>>2]=n;m=m+1|0;if((m|0)>=(p|0)){k=n;break}else a=a+4|0}}else k=n}else{b[q>>1]=k;if((k|0)<(n|0)&(p|0)>0){m=0;a=l;while(1){if((c[a>>2]|0)==(n|0))c[a>>2]=k;m=m+1|0;if((m|0)>=(p|0))break;else a=a+4|0}}}k=(k<<16>>16)*7|0;o=j+1310736+(k+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=j+1310736+(k+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+w;k=p}else{b[q>>1]=0;k=p}while(0);r=r+1|0;g=g+4|0;m=q+2|0;if((r|0)>=(x|0))break;else{q=m;p=k}}}w=w+1|0;if((w|0)>=(z|0)){o=k;B=52;break a}else{g=g+8|0;m=m+4|0}}Me(3,3904,A);k=-1}else{o=0;B=52}while(0);if((B|0)==52){a=j+12|0;if((o|0)<1)g=1;else{m=1;g=1;while(1){k=c[l>>2]|0;if((k|0)==(m|0)){k=g;g=g+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[l>>2]=k;if((m|0)<(o|0)){m=m+1|0;l=l+4|0}else break}}n=j+8|0;k=g+-1|0;c[n>>2]=k;if(k){ek(a|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((g|0)>1){k=0;do{B=k<<2;c[j+131084+(B<<2)>>2]=e;c[j+131084+((B|1)<<2)>>2]=0;c[j+131084+((B|2)<<2)>>2]=f;c[j+131084+((B|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[n>>2]|0))}if((o|0)>0){a=0;do{l=(c[j+1179664+(a<<2)>>2]|0)+-1|0;m=a*7|0;k=j+12+(l<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(m<<2)>>2]|0);k=l<<1;g=j+655376+(k<<3)|0;h[g>>3]=+h[g>>3]+ +(c[j+1310736+(m+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(m+2<<2)>>2]|0);l=l<<2;k=j+131084+(l<<2)|0;g=c[j+1310736+(m+3<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;k=j+131084+((l|1)<<2)|0;g=c[j+1310736+(m+4<<2)>>2]|0;if((c[k>>2]|0)<(g|0))c[k>>2]=g;k=j+131084+((l|2)<<2)|0;g=c[j+1310736+(m+5<<2)>>2]|0;if((c[k>>2]|0)>(g|0))c[k>>2]=g;g=j+131084+((l|3)<<2)|0;k=c[j+1310736+(m+6<<2)>>2]|0;if((c[g>>2]|0)<(k|0))c[g>>2]=k;a=a+1|0}while((a|0)<(o|0))}if((c[n>>2]|0)>0){k=0;do{e=j+12+(k<<2)|0;f=k<<1;B=j+655376+(f<<3)|0;h[B>>3]=+h[B>>3]/+(c[e>>2]|0);f=j+655376+((f|1)<<3)|0;h[f>>3]=+h[f>>3]/+(c[e>>2]|0);k=k+1|0}while((k|0)<(c[n>>2]|0));k=0}else k=0}else k=0}i=C;return k|0}function Vc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=i;i=i+16|0;A=C;n=c[j>>2]|0;z=f+-1|0;if((e|0)>0){k=0;l=n;m=n+(($(z,e)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(e|0))break;else{l=l+2|0;m=m+2|0}}}y=e+-1|0;if((f|0)>0){k=0;l=n;m=n+(y<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(f|0))break;else{l=l+(e<<1)|0;m=m+(e<<1)|0}}}m=j+1179664|0;k=e+1|0;v=0-e|0;t=1-e|0;u=~e;a:do if((z|0)>1){w=(y|0)>1;x=1;l=a+k|0;a=n+(k<<1)|0;k=0;b:while(1){if(w){s=1;r=a;q=k;while(1){do if((d[l>>0]|0|0)>(g|0)){k=b[r+(v<<1)>>1]|0;if(k<<16>>16>0){b[r>>1]=k;k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=j+1310736+(k+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+x;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}n=b[r+(t<<1)>>1]|0;o=n<<16>>16;k=b[r+(u<<1)>>1]|0;p=k<<16>>16;a=k<<16>>16>0;if(n<<16>>16<=0){if(a){b[r>>1]=k;k=p*7|0;a=j+1310736+(k+-7<<2)|0;c[a>>2]=(c[a>>2]|0)+1;a=j+1310736+(k+-6<<2)|0;c[a>>2]=(c[a>>2]|0)+s;a=j+1310736+(k+-5<<2)|0;c[a>>2]=(c[a>>2]|0)+x;a=j+1310736+(k+-3<<2)|0;if((c[a>>2]|0)<(s|0))c[a>>2]=s;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}k=b[r+-2>>1]|0;if(k<<16>>16>0){b[r>>1]=k;k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=j+1310736+(k+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+x;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(s|0)){k=q;break}c[k>>2]=s;k=q;break}else{k=q+1|0;if((q|0)>32767)break b;b[r>>1]=k;c[j+1179664+(q<<2)>>2]=k<<16>>16;q=q*7|0;c[j+1310736+(q<<2)>>2]=1;c[j+1310736+(q+1<<2)>>2]=s;c[j+1310736+(q+2<<2)>>2]=x;c[j+1310736+(q+3<<2)>>2]=s;c[j+1310736+(q+4<<2)>>2]=s;c[j+1310736+(q+5<<2)>>2]=x;c[j+1310736+(q+6<<2)>>2]=x;break}}if(a){k=c[j+1179664+(o+-1<<2)>>2]|0;o=c[j+1179664+(p+-1<<2)>>2]|0;if((k|0)>(o|0)){b[r>>1]=o;if((q|0)>0){a=0;n=m;while(1){if((c[n>>2]|0)==(k|0))c[n>>2]=o;a=a+1|0;if((a|0)>=(q|0)){k=o;break}else n=n+4|0}}else k=o}else{b[r>>1]=k;if((k|0)<(o|0)&(q|0)>0){a=0;n=m;while(1){if((c[n>>2]|0)==(o|0))c[n>>2]=k;a=a+1|0;if((a|0)>=(q|0))break;else n=n+4|0}}}k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=j+1310736+(k+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+x;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}k=b[r+-2>>1]|0;if(k<<16>>16<=0){b[r>>1]=n;k=o*7|0;a=j+1310736+(k+-7<<2)|0;c[a>>2]=(c[a>>2]|0)+1;a=j+1310736+(k+-6<<2)|0;c[a>>2]=(c[a>>2]|0)+s;a=j+1310736+(k+-5<<2)|0;c[a>>2]=(c[a>>2]|0)+x;a=j+1310736+(k+-4<<2)|0;if((c[a>>2]|0)>(s|0))c[a>>2]=s;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}o=c[j+1179664+(o+-1<<2)>>2]|0;k=c[j+1179664+((k<<16>>16)+-1<<2)>>2]|0;if((o|0)>(k|0)){b[r>>1]=k;if((q|0)>0){a=0;n=m;while(1){if((c[n>>2]|0)==(o|0))c[n>>2]=k;a=a+1|0;if((a|0)>=(q|0))break;else n=n+4|0}}}else{b[r>>1]=o;if((o|0)<(k|0)&(q|0)>0){a=0;n=m;while(1){if((c[n>>2]|0)==(k|0))c[n>>2]=o;a=a+1|0;if((a|0)>=(q|0)){k=o;break}else n=n+4|0}}else k=o}k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+x;k=q}else{b[r>>1]=0;k=q}while(0);s=s+1|0;l=l+1|0;a=r+2|0;if((s|0)>=(y|0))break;else{r=a;q=k}}}x=x+1|0;if((x|0)>=(z|0)){p=k;B=52;break a}else{l=l+2|0;a=a+4|0}}Me(3,3904,A);k=-1}else{p=0;B=52}while(0);if((B|0)==52){n=j+12|0;if((p|0)<1)l=1;else{a=1;l=1;while(1){k=c[m>>2]|0;if((k|0)==(a|0)){k=l;l=l+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[m>>2]=k;if((a|0)<(p|0)){a=a+1|0;m=m+4|0}else break}}o=j+8|0;k=l+-1|0;c[o>>2]=k;if(k){ek(n|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((l|0)>1){k=0;do{B=k<<2;c[j+131084+(B<<2)>>2]=e;c[j+131084+((B|1)<<2)>>2]=0;c[j+131084+((B|2)<<2)>>2]=f;c[j+131084+((B|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[o>>2]|0))}if((p|0)>0){n=0;do{m=(c[j+1179664+(n<<2)>>2]|0)+-1|0;a=n*7|0;k=j+12+(m<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(a<<2)>>2]|0);k=m<<1;l=j+655376+(k<<3)|0;h[l>>3]=+h[l>>3]+ +(c[j+1310736+(a+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(a+2<<2)>>2]|0);m=m<<2;k=j+131084+(m<<2)|0;l=c[j+1310736+(a+3<<2)>>2]|0;if((c[k>>2]|0)>(l|0))c[k>>2]=l;k=j+131084+((m|1)<<2)|0;l=c[j+1310736+(a+4<<2)>>2]|0;if((c[k>>2]|0)<(l|0))c[k>>2]=l;k=j+131084+((m|2)<<2)|0;l=c[j+1310736+(a+5<<2)>>2]|0;if((c[k>>2]|0)>(l|0))c[k>>2]=l;l=j+131084+((m|3)<<2)|0;k=c[j+1310736+(a+6<<2)>>2]|0;if((c[l>>2]|0)<(k|0))c[l>>2]=k;n=n+1|0}while((n|0)<(p|0))}if((c[o>>2]|0)>0){k=0;do{e=j+12+(k<<2)|0;f=k<<1;B=j+655376+(f<<3)|0;h[B>>3]=+h[B>>3]/+(c[e>>2]|0);f=j+655376+((f|1)<<3)|0;h[f>>3]=+h[f>>3]/+(c[e>>2]|0);k=k+1|0}while((k|0)<(c[o>>2]|0));k=0}else k=0}else k=0}i=C;return k|0}function Wc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=i;i=i+16|0;A=C;n=c[j>>2]|0;z=f+-1|0;if((e|0)>0){k=0;l=n;m=n+(($(z,e)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(e|0))break;else{l=l+2|0;m=m+2|0}}}y=e+-1|0;if((f|0)>0){k=0;l=n;m=n+(y<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(f|0))break;else{l=l+(e<<1)|0;m=m+(e<<1)|0}}}m=j+1179664|0;k=e+1|0;v=0-e|0;t=1-e|0;u=~e;a:do if((z|0)>1){w=(y|0)>1;x=1;l=a+(k<<1)|0;a=n+(k<<1)|0;k=0;b:while(1){if(w){s=1;r=a;q=k;while(1){do if((d[l+1>>0]|0|0)>(g|0)){k=b[r+(v<<1)>>1]|0;if(k<<16>>16>0){b[r>>1]=k;k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=j+1310736+(k+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+x;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}n=b[r+(t<<1)>>1]|0;o=n<<16>>16;k=b[r+(u<<1)>>1]|0;p=k<<16>>16;a=k<<16>>16>0;if(n<<16>>16<=0){if(a){b[r>>1]=k;k=p*7|0;a=j+1310736+(k+-7<<2)|0;c[a>>2]=(c[a>>2]|0)+1;a=j+1310736+(k+-6<<2)|0;c[a>>2]=(c[a>>2]|0)+s;a=j+1310736+(k+-5<<2)|0;c[a>>2]=(c[a>>2]|0)+x;a=j+1310736+(k+-3<<2)|0;if((c[a>>2]|0)<(s|0))c[a>>2]=s;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}k=b[r+-2>>1]|0;if(k<<16>>16>0){b[r>>1]=k;k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=j+1310736+(k+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+x;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(s|0)){k=q;break}c[k>>2]=s;k=q;break}else{k=q+1|0;if((q|0)>32767)break b;b[r>>1]=k;c[j+1179664+(q<<2)>>2]=k<<16>>16;q=q*7|0;c[j+1310736+(q<<2)>>2]=1;c[j+1310736+(q+1<<2)>>2]=s;c[j+1310736+(q+2<<2)>>2]=x;c[j+1310736+(q+3<<2)>>2]=s;c[j+1310736+(q+4<<2)>>2]=s;c[j+1310736+(q+5<<2)>>2]=x;c[j+1310736+(q+6<<2)>>2]=x;break}}if(a){k=c[j+1179664+(o+-1<<2)>>2]|0;o=c[j+1179664+(p+-1<<2)>>2]|0;if((k|0)>(o|0)){b[r>>1]=o;if((q|0)>0){a=0;n=m;while(1){if((c[n>>2]|0)==(k|0))c[n>>2]=o;a=a+1|0;if((a|0)>=(q|0)){k=o;break}else n=n+4|0}}else k=o}else{b[r>>1]=k;if((k|0)<(o|0)&(q|0)>0){a=0;n=m;while(1){if((c[n>>2]|0)==(o|0))c[n>>2]=k;a=a+1|0;if((a|0)>=(q|0))break;else n=n+4|0}}}k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=j+1310736+(k+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+x;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}a=b[r+-2>>1]|0;if(a<<16>>16<=0){b[r>>1]=n;k=o*7|0;a=j+1310736+(k+-7<<2)|0;c[a>>2]=(c[a>>2]|0)+1;a=j+1310736+(k+-6<<2)|0;c[a>>2]=(c[a>>2]|0)+s;a=j+1310736+(k+-5<<2)|0;c[a>>2]=(c[a>>2]|0)+x;a=j+1310736+(k+-4<<2)|0;if((c[a>>2]|0)>(s|0))c[a>>2]=s;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}k=c[j+1179664+(o+-1<<2)>>2]|0;o=c[j+1179664+((a<<16>>16)+-1<<2)>>2]|0;if((k|0)>(o|0)){b[r>>1]=o;if((q|0)>0){a=0;n=m;while(1){if((c[n>>2]|0)==(k|0))c[n>>2]=o;a=a+1|0;if((a|0)>=(q|0)){k=o;break}else n=n+4|0}}else k=o}else{b[r>>1]=k;if((k|0)<(o|0)&(q|0)>0){a=0;n=m;while(1){if((c[n>>2]|0)==(o|0))c[n>>2]=k;a=a+1|0;if((a|0)>=(q|0))break;else n=n+4|0}}}k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+x;k=q}else{b[r>>1]=0;k=q}while(0);s=s+1|0;l=l+2|0;a=r+2|0;if((s|0)>=(y|0))break;else{r=a;q=k}}}x=x+1|0;if((x|0)>=(z|0)){p=k;B=52;break a}else{l=l+4|0;a=a+4|0}}Me(3,3904,A);k=-1}else{p=0;B=52}while(0);if((B|0)==52){n=j+12|0;if((p|0)<1)l=1;else{a=1;l=1;while(1){k=c[m>>2]|0;if((k|0)==(a|0)){k=l;l=l+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[m>>2]=k;if((a|0)<(p|0)){a=a+1|0;m=m+4|0}else break}}o=j+8|0;k=l+-1|0;c[o>>2]=k;if(k){ek(n|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((l|0)>1){k=0;do{B=k<<2;c[j+131084+(B<<2)>>2]=e;c[j+131084+((B|1)<<2)>>2]=0;c[j+131084+((B|2)<<2)>>2]=f;c[j+131084+((B|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[o>>2]|0))}if((p|0)>0){n=0;do{m=(c[j+1179664+(n<<2)>>2]|0)+-1|0;a=n*7|0;k=j+12+(m<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(a<<2)>>2]|0);k=m<<1;l=j+655376+(k<<3)|0;h[l>>3]=+h[l>>3]+ +(c[j+1310736+(a+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(a+2<<2)>>2]|0);m=m<<2;k=j+131084+(m<<2)|0;l=c[j+1310736+(a+3<<2)>>2]|0;if((c[k>>2]|0)>(l|0))c[k>>2]=l;k=j+131084+((m|1)<<2)|0;l=c[j+1310736+(a+4<<2)>>2]|0;if((c[k>>2]|0)<(l|0))c[k>>2]=l;k=j+131084+((m|2)<<2)|0;l=c[j+1310736+(a+5<<2)>>2]|0;if((c[k>>2]|0)>(l|0))c[k>>2]=l;l=j+131084+((m|3)<<2)|0;k=c[j+1310736+(a+6<<2)>>2]|0;if((c[l>>2]|0)<(k|0))c[l>>2]=k;n=n+1|0}while((n|0)<(p|0))}if((c[o>>2]|0)>0){k=0;do{e=j+12+(k<<2)|0;f=k<<1;B=j+655376+(f<<3)|0;h[B>>3]=+h[B>>3]/+(c[e>>2]|0);f=j+655376+((f|1)<<3)|0;h[f>>3]=+h[f>>3]/+(c[e>>2]|0);k=k+1|0}while((k|0)<(c[o>>2]|0));k=0}else k=0}else k=0}i=C;return k|0}function Xc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=i;i=i+16|0;A=C;n=c[j>>2]|0;z=f+-1|0;if((e|0)>0){k=0;l=n;m=n+(($(z,e)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(e|0))break;else{l=l+2|0;m=m+2|0}}}y=e+-1|0;if((f|0)>0){k=0;l=n;m=n+(y<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(f|0))break;else{l=l+(e<<1)|0;m=m+(e<<1)|0}}}m=j+1179664|0;k=e+1|0;v=0-e|0;t=1-e|0;u=~e;a:do if((z|0)>1){w=(y|0)>1;x=1;l=a+(k<<1)|0;a=n+(k<<1)|0;k=0;b:while(1){if(w){s=1;r=a;q=k;while(1){do if((d[l>>0]|0|0)>(g|0)){k=b[r+(v<<1)>>1]|0;if(k<<16>>16>0){b[r>>1]=k;k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=j+1310736+(k+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+x;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}n=b[r+(t<<1)>>1]|0;o=n<<16>>16;k=b[r+(u<<1)>>1]|0;p=k<<16>>16;a=k<<16>>16>0;if(n<<16>>16<=0){if(a){b[r>>1]=k;k=p*7|0;a=j+1310736+(k+-7<<2)|0;c[a>>2]=(c[a>>2]|0)+1;a=j+1310736+(k+-6<<2)|0;c[a>>2]=(c[a>>2]|0)+s;a=j+1310736+(k+-5<<2)|0;c[a>>2]=(c[a>>2]|0)+x;a=j+1310736+(k+-3<<2)|0;if((c[a>>2]|0)<(s|0))c[a>>2]=s;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}k=b[r+-2>>1]|0;if(k<<16>>16>0){b[r>>1]=k;k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=j+1310736+(k+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+x;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(s|0)){k=q;break}c[k>>2]=s;k=q;break}else{k=q+1|0;if((q|0)>32767)break b;b[r>>1]=k;c[j+1179664+(q<<2)>>2]=k<<16>>16;q=q*7|0;c[j+1310736+(q<<2)>>2]=1;c[j+1310736+(q+1<<2)>>2]=s;c[j+1310736+(q+2<<2)>>2]=x;c[j+1310736+(q+3<<2)>>2]=s;c[j+1310736+(q+4<<2)>>2]=s;c[j+1310736+(q+5<<2)>>2]=x;c[j+1310736+(q+6<<2)>>2]=x;break}}if(a){k=c[j+1179664+(o+-1<<2)>>2]|0;o=c[j+1179664+(p+-1<<2)>>2]|0;if((k|0)>(o|0)){b[r>>1]=o;if((q|0)>0){a=0;n=m;while(1){if((c[n>>2]|0)==(k|0))c[n>>2]=o;a=a+1|0;if((a|0)>=(q|0)){k=o;break}else n=n+4|0}}else k=o}else{b[r>>1]=k;if((k|0)<(o|0)&(q|0)>0){a=0;n=m;while(1){if((c[n>>2]|0)==(o|0))c[n>>2]=k;a=a+1|0;if((a|0)>=(q|0))break;else n=n+4|0}}}k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=j+1310736+(k+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+x;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}k=b[r+-2>>1]|0;if(k<<16>>16<=0){b[r>>1]=n;k=o*7|0;a=j+1310736+(k+-7<<2)|0;c[a>>2]=(c[a>>2]|0)+1;a=j+1310736+(k+-6<<2)|0;c[a>>2]=(c[a>>2]|0)+s;a=j+1310736+(k+-5<<2)|0;c[a>>2]=(c[a>>2]|0)+x;a=j+1310736+(k+-4<<2)|0;if((c[a>>2]|0)>(s|0))c[a>>2]=s;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}o=c[j+1179664+(o+-1<<2)>>2]|0;k=c[j+1179664+((k<<16>>16)+-1<<2)>>2]|0;if((o|0)>(k|0)){b[r>>1]=k;if((q|0)>0){a=0;n=m;while(1){if((c[n>>2]|0)==(o|0))c[n>>2]=k;a=a+1|0;if((a|0)>=(q|0))break;else n=n+4|0}}}else{b[r>>1]=o;if((o|0)<(k|0)&(q|0)>0){a=0;n=m;while(1){if((c[n>>2]|0)==(k|0))c[n>>2]=o;a=a+1|0;if((a|0)>=(q|0)){k=o;break}else n=n+4|0}}else k=o}k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+x;k=q}else{b[r>>1]=0;k=q}while(0);s=s+1|0;l=l+2|0;a=r+2|0;if((s|0)>=(y|0))break;else{r=a;q=k}}}x=x+1|0;if((x|0)>=(z|0)){p=k;B=52;break a}else{l=l+4|0;a=a+4|0}}Me(3,3904,A);k=-1}else{p=0;B=52}while(0);if((B|0)==52){n=j+12|0;if((p|0)<1)l=1;else{a=1;l=1;while(1){k=c[m>>2]|0;if((k|0)==(a|0)){k=l;l=l+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[m>>2]=k;if((a|0)<(p|0)){a=a+1|0;m=m+4|0}else break}}o=j+8|0;k=l+-1|0;c[o>>2]=k;if(k){ek(n|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((l|0)>1){k=0;do{B=k<<2;c[j+131084+(B<<2)>>2]=e;c[j+131084+((B|1)<<2)>>2]=0;c[j+131084+((B|2)<<2)>>2]=f;c[j+131084+((B|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[o>>2]|0))}if((p|0)>0){n=0;do{m=(c[j+1179664+(n<<2)>>2]|0)+-1|0;a=n*7|0;k=j+12+(m<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(a<<2)>>2]|0);k=m<<1;l=j+655376+(k<<3)|0;h[l>>3]=+h[l>>3]+ +(c[j+1310736+(a+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(a+2<<2)>>2]|0);m=m<<2;k=j+131084+(m<<2)|0;l=c[j+1310736+(a+3<<2)>>2]|0;if((c[k>>2]|0)>(l|0))c[k>>2]=l;k=j+131084+((m|1)<<2)|0;l=c[j+1310736+(a+4<<2)>>2]|0;if((c[k>>2]|0)<(l|0))c[k>>2]=l;k=j+131084+((m|2)<<2)|0;l=c[j+1310736+(a+5<<2)>>2]|0;if((c[k>>2]|0)>(l|0))c[k>>2]=l;l=j+131084+((m|3)<<2)|0;k=c[j+1310736+(a+6<<2)>>2]|0;if((c[l>>2]|0)<(k|0))c[l>>2]=k;n=n+1|0}while((n|0)<(p|0))}if((c[o>>2]|0)>0){k=0;do{e=j+12+(k<<2)|0;f=k<<1;B=j+655376+(f<<3)|0;h[B>>3]=+h[B>>3]/+(c[e>>2]|0);f=j+655376+((f|1)<<3)|0;h[f>>3]=+h[f>>3]/+(c[e>>2]|0);k=k+1|0}while((k|0)<(c[o>>2]|0));k=0}else k=0}else k=0}i=C;return k|0}function Yc(a,e,f,g,j){a=a|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=i;i=i+16|0;A=C;n=c[j>>2]|0;z=f+-1|0;if((e|0)>0){k=0;l=n;m=n+(($(z,e)|0)<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(e|0))break;else{l=l+2|0;m=m+2|0}}}y=e+-1|0;if((f|0)>0){k=0;l=n;m=n+(y<<1)|0;while(1){b[m>>1]=0;b[l>>1]=0;k=k+1|0;if((k|0)>=(f|0))break;else{l=l+(e<<1)|0;m=m+(e<<1)|0}}}m=j+1179664|0;k=e+1|0;v=0-e|0;t=1-e|0;u=~e;a:do if((z|0)>1){w=(y|0)>1;x=1;l=a+k|0;a=n+(k<<1)|0;n=g+k|0;k=0;b:while(1){if(w){s=1;r=l;q=k;while(1){do if((d[r>>0]|0)>(d[n>>0]|0)){k=b[a+(v<<1)>>1]|0;if(k<<16>>16>0){b[a>>1]=k;k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=j+1310736+(k+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+x;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}g=b[a+(t<<1)>>1]|0;o=g<<16>>16;k=b[a+(u<<1)>>1]|0;p=k<<16>>16;l=k<<16>>16>0;if(g<<16>>16<=0){if(l){b[a>>1]=k;k=p*7|0;l=j+1310736+(k+-7<<2)|0;c[l>>2]=(c[l>>2]|0)+1;l=j+1310736+(k+-6<<2)|0;c[l>>2]=(c[l>>2]|0)+s;l=j+1310736+(k+-5<<2)|0;c[l>>2]=(c[l>>2]|0)+x;l=j+1310736+(k+-3<<2)|0;if((c[l>>2]|0)<(s|0))c[l>>2]=s;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}k=b[a+-2>>1]|0;if(k<<16>>16>0){b[a>>1]=k;k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=j+1310736+(k+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+x;k=j+1310736+(k+-3<<2)|0;if((c[k>>2]|0)>=(s|0)){k=q;break}c[k>>2]=s;k=q;break}else{k=q+1|0;if((q|0)>32767)break b;b[a>>1]=k;c[j+1179664+(q<<2)>>2]=k<<16>>16;q=q*7|0;c[j+1310736+(q<<2)>>2]=1;c[j+1310736+(q+1<<2)>>2]=s;c[j+1310736+(q+2<<2)>>2]=x;c[j+1310736+(q+3<<2)>>2]=s;c[j+1310736+(q+4<<2)>>2]=s;c[j+1310736+(q+5<<2)>>2]=x;c[j+1310736+(q+6<<2)>>2]=x;break}}if(l){k=c[j+1179664+(o+-1<<2)>>2]|0;o=c[j+1179664+(p+-1<<2)>>2]|0;if((k|0)>(o|0)){b[a>>1]=o;if((q|0)>0){l=0;g=m;while(1){if((c[g>>2]|0)==(k|0))c[g>>2]=o;l=l+1|0;if((l|0)>=(q|0)){k=o;break}else g=g+4|0}}else k=o}else{b[a>>1]=k;if((k|0)<(o|0)&(q|0)>0){l=0;g=m;while(1){if((c[g>>2]|0)==(o|0))c[g>>2]=k;l=l+1|0;if((l|0)>=(q|0))break;else g=g+4|0}}}k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;p=j+1310736+(k+-5<<2)|0;c[p>>2]=(c[p>>2]|0)+x;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}k=b[a+-2>>1]|0;if(k<<16>>16<=0){b[a>>1]=g;k=o*7|0;l=j+1310736+(k+-7<<2)|0;c[l>>2]=(c[l>>2]|0)+1;l=j+1310736+(k+-6<<2)|0;c[l>>2]=(c[l>>2]|0)+s;l=j+1310736+(k+-5<<2)|0;c[l>>2]=(c[l>>2]|0)+x;l=j+1310736+(k+-4<<2)|0;if((c[l>>2]|0)>(s|0))c[l>>2]=s;c[j+1310736+(k+-1<<2)>>2]=x;k=q;break}o=c[j+1179664+(o+-1<<2)>>2]|0;k=c[j+1179664+((k<<16>>16)+-1<<2)>>2]|0;if((o|0)>(k|0)){b[a>>1]=k;if((q|0)>0){l=0;g=m;while(1){if((c[g>>2]|0)==(o|0))c[g>>2]=k;l=l+1|0;if((l|0)>=(q|0))break;else g=g+4|0}}}else{b[a>>1]=o;if((o|0)<(k|0)&(q|0)>0){l=0;g=m;while(1){if((c[g>>2]|0)==(k|0))c[g>>2]=o;l=l+1|0;if((l|0)>=(q|0)){k=o;break}else g=g+4|0}}else k=o}k=(k<<16>>16)*7|0;p=j+1310736+(k+-7<<2)|0;c[p>>2]=(c[p>>2]|0)+1;p=j+1310736+(k+-6<<2)|0;c[p>>2]=(c[p>>2]|0)+s;k=j+1310736+(k+-5<<2)|0;c[k>>2]=(c[k>>2]|0)+x;k=q}else{b[a>>1]=0;k=q}while(0);s=s+1|0;l=r+1|0;n=n+1|0;a=a+2|0;if((s|0)>=(y|0))break;else{r=l;q=k}}}x=x+1|0;if((x|0)>=(z|0)){o=k;B=52;break a}else{l=l+2|0;a=a+4|0;n=n+2|0}}Me(3,3904,A);k=-1}else{o=0;B=52}while(0);if((B|0)==52){n=j+12|0;if((o|0)<1)l=1;else{a=1;l=1;while(1){k=c[m>>2]|0;if((k|0)==(a|0)){k=l;l=l+1|0}else k=c[j+1179664+(k+-1<<2)>>2]|0;c[m>>2]=k;if((a|0)<(o|0)){a=a+1|0;m=m+4|0}else break}}g=j+8|0;k=l+-1|0;c[g>>2]=k;if(k){ek(n|0,0,k<<2|0)|0;ek(j+655376|0,0,k<<4|0)|0;if((l|0)>1){k=0;do{B=k<<2;c[j+131084+(B<<2)>>2]=e;c[j+131084+((B|1)<<2)>>2]=0;c[j+131084+((B|2)<<2)>>2]=f;c[j+131084+((B|3)<<2)>>2]=0;k=k+1|0}while((k|0)<(c[g>>2]|0))}if((o|0)>0){n=0;do{m=(c[j+1179664+(n<<2)>>2]|0)+-1|0;a=n*7|0;k=j+12+(m<<2)|0;c[k>>2]=(c[k>>2]|0)+(c[j+1310736+(a<<2)>>2]|0);k=m<<1;l=j+655376+(k<<3)|0;h[l>>3]=+h[l>>3]+ +(c[j+1310736+(a+1<<2)>>2]|0);k=j+655376+((k|1)<<3)|0;h[k>>3]=+h[k>>3]+ +(c[j+1310736+(a+2<<2)>>2]|0);m=m<<2;k=j+131084+(m<<2)|0;l=c[j+1310736+(a+3<<2)>>2]|0;if((c[k>>2]|0)>(l|0))c[k>>2]=l;k=j+131084+((m|1)<<2)|0;l=c[j+1310736+(a+4<<2)>>2]|0;if((c[k>>2]|0)<(l|0))c[k>>2]=l;k=j+131084+((m|2)<<2)|0;l=c[j+1310736+(a+5<<2)>>2]|0;if((c[k>>2]|0)>(l|0))c[k>>2]=l;l=j+131084+((m|3)<<2)|0;k=c[j+1310736+(a+6<<2)>>2]|0;if((c[l>>2]|0)<(k|0))c[l>>2]=k;n=n+1|0}while((n|0)<(o|0))}if((c[g>>2]|0)>0){k=0;do{e=j+12+(k<<2)|0;f=k<<1;B=j+655376+(f<<3)|0;h[B>>3]=+h[B>>3]/+(c[e>>2]|0);f=j+655376+((f|1)<<3)|0;h[f>>3]=+h[f>>3]/+(c[e>>2]|0);k=k+1|0}while((k|0)<(c[g>>2]|0));k=0}else k=0}else k=0}i=C;return k|0}function Zc(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;F=i;i=i+16|0;B=F;D=(f|0)/2|0;E=(g|0)/2|0;o=c[k>>2]|0;A=E+-1|0;if((f|0)>1){l=0;m=o;n=o+(($(A,D)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(D|0))break;else{m=m+2|0;n=n+2|0}}}y=j*3|0;z=D+-1|0;if((g|0)>1){l=0;j=o;m=o+(z<<1)|0;while(1){b[m>>1]=0;b[j>>1]=0;l=l+1|0;if((l|0)>=(E|0))break;else{j=j+(D<<1)|0;m=m+(D<<1)|0}}}m=k+1179664|0;j=D+1|0;v=0-D|0;t=1-D|0;u=~D;s=(f*3|0)+12|0;a:do if((A|0)>1){w=(z|0)>1;l=(c[k+4>>2]|0)+j|0;x=1;n=e+((f*6|0)+6)|0;g=o+(j<<1)|0;j=0;b:while(1){if(w){r=1;q=n;p=j;while(1){do if(((d[q+1>>0]|0)+(d[q>>0]|0)+(d[q+2>>0]|0)|0)>(y|0)){b[g>>1]=0;a[l>>0]=0;j=p}else{a[l>>0]=-1;j=b[g+(v<<1)>>1]|0;if(j<<16>>16>0){b[g>>1]=j;j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}e=b[g+(t<<1)>>1]|0;f=e<<16>>16;j=b[g+(u<<1)>>1]|0;o=j<<16>>16;n=j<<16>>16>0;if(e<<16>>16<=0){if(n){b[g>>1]=j;j=o*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+r;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+x;n=k+1310736+(j+-3<<2)|0;if((c[n>>2]|0)<(r|0))c[n>>2]=r;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}j=b[g+-2>>1]|0;if(j<<16>>16>0){b[g>>1]=j;j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;j=k+1310736+(j+-3<<2)|0;if((c[j>>2]|0)>=(r|0)){j=p;break}c[j>>2]=r;j=p;break}else{j=p+1|0;if((p|0)>32767)break b;b[g>>1]=j;c[k+1179664+(p<<2)>>2]=j<<16>>16;p=p*7|0;c[k+1310736+(p<<2)>>2]=1;c[k+1310736+(p+1<<2)>>2]=r;c[k+1310736+(p+2<<2)>>2]=x;c[k+1310736+(p+3<<2)>>2]=r;c[k+1310736+(p+4<<2)>>2]=r;c[k+1310736+(p+5<<2)>>2]=x;c[k+1310736+(p+6<<2)>>2]=x;break}}if(n){j=c[k+1179664+(f+-1<<2)>>2]|0;f=c[k+1179664+(o+-1<<2)>>2]|0;if((j|0)>(f|0)){b[g>>1]=f;if((p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(j|0))c[e>>2]=f;n=n+1|0;if((n|0)>=(p|0)){j=f;break}else e=e+4|0}}else j=f}else{b[g>>1]=j;if((j|0)<(f|0)&(p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(f|0))c[e>>2]=j;n=n+1|0;if((n|0)>=(p|0))break;else e=e+4|0}}}j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}n=b[g+-2>>1]|0;if(n<<16>>16<=0){b[g>>1]=e;j=f*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+r;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+x;n=k+1310736+(j+-4<<2)|0;if((c[n>>2]|0)>(r|0))c[n>>2]=r;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}j=c[k+1179664+(f+-1<<2)>>2]|0;f=c[k+1179664+((n<<16>>16)+-1<<2)>>2]|0;if((j|0)>(f|0)){b[g>>1]=f;if((p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(j|0))c[e>>2]=f;n=n+1|0;if((n|0)>=(p|0)){j=f;break}else e=e+4|0}}else j=f}else{b[g>>1]=j;if((j|0)<(f|0)&(p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(f|0))c[e>>2]=j;n=n+1|0;if((n|0)>=(p|0))break;else e=e+4|0}}}j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;j=k+1310736+(j+-5<<2)|0;c[j>>2]=(c[j>>2]|0)+x;j=p}while(0);r=r+1|0;n=q+6|0;g=g+2|0;l=l+1|0;if((r|0)>=(z|0))break;else{q=n;p=j}}}x=x+1|0;if((x|0)>=(A|0)){f=j;C=52;break a}else{l=l+2|0;n=n+s|0;g=g+4|0}}Me(3,3904,B);l=-1}else{f=0;C=52}while(0);if((C|0)==52){g=k+12|0;if((f|0)<1)j=1;else{n=1;j=1;while(1){l=c[m>>2]|0;if((l|0)==(n|0)){l=j;j=j+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[m>>2]=l;if((n|0)<(f|0)){n=n+1|0;m=m+4|0}else break}}e=k+8|0;l=j+-1|0;c[e>>2]=l;if(l){ek(g|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((j|0)>1){l=0;do{C=l<<2;c[k+131084+(C<<2)>>2]=D;c[k+131084+((C|1)<<2)>>2]=0;c[k+131084+((C|2)<<2)>>2]=E;c[k+131084+((C|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[e>>2]|0))}if((f|0)>0){g=0;do{m=(c[k+1179664+(g<<2)>>2]|0)+-1|0;n=g*7|0;l=k+12+(m<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(n<<2)>>2]|0);l=m<<1;j=k+655376+(l<<3)|0;h[j>>3]=+h[j>>3]+ +(c[k+1310736+(n+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(n+2<<2)>>2]|0);m=m<<2;l=k+131084+(m<<2)|0;j=c[k+1310736+(n+3<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;l=k+131084+((m|1)<<2)|0;j=c[k+1310736+(n+4<<2)>>2]|0;if((c[l>>2]|0)<(j|0))c[l>>2]=j;l=k+131084+((m|2)<<2)|0;j=c[k+1310736+(n+5<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;j=k+131084+((m|3)<<2)|0;l=c[k+1310736+(n+6<<2)>>2]|0;if((c[j>>2]|0)<(l|0))c[j>>2]=l;g=g+1|0}while((g|0)<(f|0))}if((c[e>>2]|0)>0){l=0;do{D=k+12+(l<<2)|0;E=l<<1;C=k+655376+(E<<3)|0;h[C>>3]=+h[C>>3]/+(c[D>>2]|0);E=k+655376+((E|1)<<3)|0;h[E>>3]=+h[E>>3]/+(c[D>>2]|0);l=l+1|0}while((l|0)<(c[e>>2]|0));l=0}else l=0}else l=0}i=F;return l|0}function _c(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;F=i;i=i+16|0;B=F;D=(f|0)/2|0;E=(g|0)/2|0;o=c[k>>2]|0;A=E+-1|0;if((f|0)>1){l=0;m=o;n=o+(($(A,D)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(D|0))break;else{m=m+2|0;n=n+2|0}}}y=j*3|0;z=D+-1|0;if((g|0)>1){l=0;j=o;m=o+(z<<1)|0;while(1){b[m>>1]=0;b[j>>1]=0;l=l+1|0;if((l|0)>=(E|0))break;else{j=j+(D<<1)|0;m=m+(D<<1)|0}}}m=k+1179664|0;j=D+1|0;v=0-D|0;t=1-D|0;u=~D;s=(f<<1)+8|0;a:do if((A|0)>1){w=(z|0)>1;l=(c[k+4>>2]|0)+j|0;x=1;n=e+((f<<2)+4)|0;g=o+(j<<1)|0;j=0;b:while(1){if(w){r=1;q=n;p=j;while(1){f=d[q>>0]|0;o=d[q+1>>0]|0;do if(((f&248)+10+(f<<5&224)+(o>>>3&28)+(o<<3&248)|0)>(y|0)){b[g>>1]=0;a[l>>0]=0;j=p}else{a[l>>0]=-1;j=b[g+(v<<1)>>1]|0;if(j<<16>>16>0){b[g>>1]=j;j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}e=b[g+(t<<1)>>1]|0;f=e<<16>>16;j=b[g+(u<<1)>>1]|0;o=j<<16>>16;n=j<<16>>16>0;if(e<<16>>16<=0){if(n){b[g>>1]=j;j=o*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+r;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+x;n=k+1310736+(j+-3<<2)|0;if((c[n>>2]|0)<(r|0))c[n>>2]=r;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}j=b[g+-2>>1]|0;if(j<<16>>16>0){b[g>>1]=j;j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;j=k+1310736+(j+-3<<2)|0;if((c[j>>2]|0)>=(r|0)){j=p;break}c[j>>2]=r;j=p;break}else{j=p+1|0;if((p|0)>32767)break b;b[g>>1]=j;c[k+1179664+(p<<2)>>2]=j<<16>>16;p=p*7|0;c[k+1310736+(p<<2)>>2]=1;c[k+1310736+(p+1<<2)>>2]=r;c[k+1310736+(p+2<<2)>>2]=x;c[k+1310736+(p+3<<2)>>2]=r;c[k+1310736+(p+4<<2)>>2]=r;c[k+1310736+(p+5<<2)>>2]=x;c[k+1310736+(p+6<<2)>>2]=x;break}}if(n){j=c[k+1179664+(f+-1<<2)>>2]|0;f=c[k+1179664+(o+-1<<2)>>2]|0;if((j|0)>(f|0)){b[g>>1]=f;if((p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(j|0))c[e>>2]=f;n=n+1|0;if((n|0)>=(p|0)){j=f;break}else e=e+4|0}}else j=f}else{b[g>>1]=j;if((j|0)<(f|0)&(p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(f|0))c[e>>2]=j;n=n+1|0;if((n|0)>=(p|0))break;else e=e+4|0}}}j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}n=b[g+-2>>1]|0;if(n<<16>>16<=0){b[g>>1]=e;j=f*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+r;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+x;n=k+1310736+(j+-4<<2)|0;if((c[n>>2]|0)>(r|0))c[n>>2]=r;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}j=c[k+1179664+(f+-1<<2)>>2]|0;f=c[k+1179664+((n<<16>>16)+-1<<2)>>2]|0;if((j|0)>(f|0)){b[g>>1]=f;if((p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(j|0))c[e>>2]=f;n=n+1|0;if((n|0)>=(p|0)){j=f;break}else e=e+4|0}}else j=f}else{b[g>>1]=j;if((j|0)<(f|0)&(p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(f|0))c[e>>2]=j;n=n+1|0;if((n|0)>=(p|0))break;else e=e+4|0}}}j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;j=k+1310736+(j+-5<<2)|0;c[j>>2]=(c[j>>2]|0)+x;j=p}while(0);r=r+1|0;n=q+4|0;g=g+2|0;l=l+1|0;if((r|0)>=(z|0))break;else{q=n;p=j}}}x=x+1|0;if((x|0)>=(A|0)){f=j;C=52;break a}else{l=l+2|0;n=n+s|0;g=g+4|0}}Me(3,3904,B);l=-1}else{f=0;C=52}while(0);if((C|0)==52){g=k+12|0;if((f|0)<1)j=1;else{n=1;j=1;while(1){l=c[m>>2]|0;if((l|0)==(n|0)){l=j;j=j+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[m>>2]=l;if((n|0)<(f|0)){n=n+1|0;m=m+4|0}else break}}e=k+8|0;l=j+-1|0;c[e>>2]=l;if(l){ek(g|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((j|0)>1){l=0;do{C=l<<2;c[k+131084+(C<<2)>>2]=D;c[k+131084+((C|1)<<2)>>2]=0;c[k+131084+((C|2)<<2)>>2]=E;c[k+131084+((C|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[e>>2]|0))}if((f|0)>0){g=0;do{m=(c[k+1179664+(g<<2)>>2]|0)+-1|0;n=g*7|0;l=k+12+(m<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(n<<2)>>2]|0);l=m<<1;j=k+655376+(l<<3)|0;h[j>>3]=+h[j>>3]+ +(c[k+1310736+(n+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(n+2<<2)>>2]|0);m=m<<2;l=k+131084+(m<<2)|0;j=c[k+1310736+(n+3<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;l=k+131084+((m|1)<<2)|0;j=c[k+1310736+(n+4<<2)>>2]|0;if((c[l>>2]|0)<(j|0))c[l>>2]=j;l=k+131084+((m|2)<<2)|0;j=c[k+1310736+(n+5<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;j=k+131084+((m|3)<<2)|0;l=c[k+1310736+(n+6<<2)>>2]|0;if((c[j>>2]|0)<(l|0))c[j>>2]=l;g=g+1|0}while((g|0)<(f|0))}if((c[e>>2]|0)>0){l=0;do{D=k+12+(l<<2)|0;E=l<<1;C=k+655376+(E<<3)|0;h[C>>3]=+h[C>>3]/+(c[D>>2]|0);E=k+655376+((E|1)<<3)|0;h[E>>3]=+h[E>>3]/+(c[D>>2]|0);l=l+1|0}while((l|0)<(c[e>>2]|0));l=0}else l=0}else l=0}i=F;return l|0}function $c(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;F=i;i=i+16|0;B=F;D=(f|0)/2|0;E=(g|0)/2|0;o=c[k>>2]|0;A=E+-1|0;if((f|0)>1){l=0;m=o;n=o+(($(A,D)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(D|0))break;else{m=m+2|0;n=n+2|0}}}y=j*3|0;z=D+-1|0;if((g|0)>1){l=0;j=o;m=o+(z<<1)|0;while(1){b[m>>1]=0;b[j>>1]=0;l=l+1|0;if((l|0)>=(E|0))break;else{j=j+(D<<1)|0;m=m+(D<<1)|0}}}m=k+1179664|0;j=D+1|0;v=0-D|0;t=1-D|0;u=~D;s=(f<<2)+16|0;a:do if((A|0)>1){w=(z|0)>1;l=(c[k+4>>2]|0)+j|0;x=1;n=e+((f<<3)+8)|0;g=o+(j<<1)|0;j=0;b:while(1){if(w){r=1;q=n;p=j;while(1){do if(((d[q+1>>0]|0)+(d[q>>0]|0)+(d[q+2>>0]|0)|0)>(y|0)){b[g>>1]=0;a[l>>0]=0;j=p}else{a[l>>0]=-1;j=b[g+(v<<1)>>1]|0;if(j<<16>>16>0){b[g>>1]=j;j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}e=b[g+(t<<1)>>1]|0;f=e<<16>>16;j=b[g+(u<<1)>>1]|0;o=j<<16>>16;n=j<<16>>16>0;if(e<<16>>16<=0){if(n){b[g>>1]=j;j=o*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+r;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+x;n=k+1310736+(j+-3<<2)|0;if((c[n>>2]|0)<(r|0))c[n>>2]=r;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}j=b[g+-2>>1]|0;if(j<<16>>16>0){b[g>>1]=j;j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;j=k+1310736+(j+-3<<2)|0;if((c[j>>2]|0)>=(r|0)){j=p;break}c[j>>2]=r;j=p;break}else{j=p+1|0;if((p|0)>32767)break b;b[g>>1]=j;c[k+1179664+(p<<2)>>2]=j<<16>>16;p=p*7|0;c[k+1310736+(p<<2)>>2]=1;c[k+1310736+(p+1<<2)>>2]=r;c[k+1310736+(p+2<<2)>>2]=x;c[k+1310736+(p+3<<2)>>2]=r;c[k+1310736+(p+4<<2)>>2]=r;c[k+1310736+(p+5<<2)>>2]=x;c[k+1310736+(p+6<<2)>>2]=x;break}}if(n){j=c[k+1179664+(f+-1<<2)>>2]|0;f=c[k+1179664+(o+-1<<2)>>2]|0;if((j|0)>(f|0)){b[g>>1]=f;if((p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(j|0))c[e>>2]=f;n=n+1|0;if((n|0)>=(p|0)){j=f;break}else e=e+4|0}}else j=f}else{b[g>>1]=j;if((j|0)<(f|0)&(p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(f|0))c[e>>2]=j;n=n+1|0;if((n|0)>=(p|0))break;else e=e+4|0}}}j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}n=b[g+-2>>1]|0;if(n<<16>>16<=0){b[g>>1]=e;j=f*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+r;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+x;n=k+1310736+(j+-4<<2)|0;if((c[n>>2]|0)>(r|0))c[n>>2]=r;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}j=c[k+1179664+(f+-1<<2)>>2]|0;f=c[k+1179664+((n<<16>>16)+-1<<2)>>2]|0;if((j|0)>(f|0)){b[g>>1]=f;if((p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(j|0))c[e>>2]=f;n=n+1|0;if((n|0)>=(p|0)){j=f;break}else e=e+4|0}}else j=f}else{b[g>>1]=j;if((j|0)<(f|0)&(p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(f|0))c[e>>2]=j;n=n+1|0;if((n|0)>=(p|0))break;else e=e+4|0}}}j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;j=k+1310736+(j+-5<<2)|0;c[j>>2]=(c[j>>2]|0)+x;j=p}while(0);r=r+1|0;n=q+8|0;g=g+2|0;l=l+1|0;if((r|0)>=(z|0))break;else{q=n;p=j}}}x=x+1|0;if((x|0)>=(A|0)){f=j;C=52;break a}else{l=l+2|0;n=n+s|0;g=g+4|0}}Me(3,3904,B);l=-1}else{f=0;C=52}while(0);if((C|0)==52){g=k+12|0;if((f|0)<1)j=1;else{n=1;j=1;while(1){l=c[m>>2]|0;if((l|0)==(n|0)){l=j;j=j+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[m>>2]=l;if((n|0)<(f|0)){n=n+1|0;m=m+4|0}else break}}e=k+8|0;l=j+-1|0;c[e>>2]=l;if(l){ek(g|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((j|0)>1){l=0;do{C=l<<2;c[k+131084+(C<<2)>>2]=D;c[k+131084+((C|1)<<2)>>2]=0;c[k+131084+((C|2)<<2)>>2]=E;c[k+131084+((C|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[e>>2]|0))}if((f|0)>0){g=0;do{m=(c[k+1179664+(g<<2)>>2]|0)+-1|0;n=g*7|0;l=k+12+(m<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(n<<2)>>2]|0);l=m<<1;j=k+655376+(l<<3)|0;h[j>>3]=+h[j>>3]+ +(c[k+1310736+(n+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(n+2<<2)>>2]|0);m=m<<2;l=k+131084+(m<<2)|0;j=c[k+1310736+(n+3<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;l=k+131084+((m|1)<<2)|0;j=c[k+1310736+(n+4<<2)>>2]|0;if((c[l>>2]|0)<(j|0))c[l>>2]=j;l=k+131084+((m|2)<<2)|0;j=c[k+1310736+(n+5<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;j=k+131084+((m|3)<<2)|0;l=c[k+1310736+(n+6<<2)>>2]|0;if((c[j>>2]|0)<(l|0))c[j>>2]=l;g=g+1|0}while((g|0)<(f|0))}if((c[e>>2]|0)>0){l=0;do{D=k+12+(l<<2)|0;E=l<<1;C=k+655376+(E<<3)|0;h[C>>3]=+h[C>>3]/+(c[D>>2]|0);E=k+655376+((E|1)<<3)|0;h[E>>3]=+h[E>>3]/+(c[D>>2]|0);l=l+1|0}while((l|0)<(c[e>>2]|0));l=0}else l=0}else l=0}i=F;return l|0}function ad(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;F=i;i=i+16|0;B=F;D=(f|0)/2|0;E=(g|0)/2|0;o=c[k>>2]|0;A=E+-1|0;if((f|0)>1){l=0;m=o;n=o+(($(A,D)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(D|0))break;else{m=m+2|0;n=n+2|0}}}y=j*3|0;z=D+-1|0;if((g|0)>1){l=0;j=o;m=o+(z<<1)|0;while(1){b[m>>1]=0;b[j>>1]=0;l=l+1|0;if((l|0)>=(E|0))break;else{j=j+(D<<1)|0;m=m+(D<<1)|0}}}m=k+1179664|0;j=D+1|0;v=0-D|0;t=1-D|0;u=~D;s=(f<<1)+8|0;a:do if((A|0)>1){w=(z|0)>1;l=(c[k+4>>2]|0)+j|0;x=1;n=e+((f<<2)+4)|0;g=o+(j<<1)|0;j=0;b:while(1){if(w){r=1;q=n;p=j;while(1){o=d[q>>0]|0;do if(((o&240)+24+(o<<4&240)+((d[q+1>>0]|0)&240)|0)>(y|0)){b[g>>1]=0;a[l>>0]=0;j=p}else{a[l>>0]=-1;j=b[g+(v<<1)>>1]|0;if(j<<16>>16>0){b[g>>1]=j;j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}e=b[g+(t<<1)>>1]|0;f=e<<16>>16;j=b[g+(u<<1)>>1]|0;o=j<<16>>16;n=j<<16>>16>0;if(e<<16>>16<=0){if(n){b[g>>1]=j;j=o*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+r;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+x;n=k+1310736+(j+-3<<2)|0;if((c[n>>2]|0)<(r|0))c[n>>2]=r;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}j=b[g+-2>>1]|0;if(j<<16>>16>0){b[g>>1]=j;j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;j=k+1310736+(j+-3<<2)|0;if((c[j>>2]|0)>=(r|0)){j=p;break}c[j>>2]=r;j=p;break}else{j=p+1|0;if((p|0)>32767)break b;b[g>>1]=j;c[k+1179664+(p<<2)>>2]=j<<16>>16;p=p*7|0;c[k+1310736+(p<<2)>>2]=1;c[k+1310736+(p+1<<2)>>2]=r;c[k+1310736+(p+2<<2)>>2]=x;c[k+1310736+(p+3<<2)>>2]=r;c[k+1310736+(p+4<<2)>>2]=r;c[k+1310736+(p+5<<2)>>2]=x;c[k+1310736+(p+6<<2)>>2]=x;break}}if(n){j=c[k+1179664+(f+-1<<2)>>2]|0;f=c[k+1179664+(o+-1<<2)>>2]|0;if((j|0)>(f|0)){b[g>>1]=f;if((p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(j|0))c[e>>2]=f;n=n+1|0;if((n|0)>=(p|0)){j=f;break}else e=e+4|0}}else j=f}else{b[g>>1]=j;if((j|0)<(f|0)&(p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(f|0))c[e>>2]=j;n=n+1|0;if((n|0)>=(p|0))break;else e=e+4|0}}}j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}n=b[g+-2>>1]|0;if(n<<16>>16<=0){b[g>>1]=e;j=f*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+r;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+x;n=k+1310736+(j+-4<<2)|0;if((c[n>>2]|0)>(r|0))c[n>>2]=r;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}j=c[k+1179664+(f+-1<<2)>>2]|0;f=c[k+1179664+((n<<16>>16)+-1<<2)>>2]|0;if((j|0)>(f|0)){b[g>>1]=f;if((p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(j|0))c[e>>2]=f;n=n+1|0;if((n|0)>=(p|0)){j=f;break}else e=e+4|0}}else j=f}else{b[g>>1]=j;if((j|0)<(f|0)&(p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(f|0))c[e>>2]=j;n=n+1|0;if((n|0)>=(p|0))break;else e=e+4|0}}}j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;j=k+1310736+(j+-5<<2)|0;c[j>>2]=(c[j>>2]|0)+x;j=p}while(0);r=r+1|0;n=q+4|0;g=g+2|0;l=l+1|0;if((r|0)>=(z|0))break;else{q=n;p=j}}}x=x+1|0;if((x|0)>=(A|0)){f=j;C=52;break a}else{l=l+2|0;n=n+s|0;g=g+4|0}}Me(3,3904,B);l=-1}else{f=0;C=52}while(0);if((C|0)==52){g=k+12|0;if((f|0)<1)j=1;else{n=1;j=1;while(1){l=c[m>>2]|0;if((l|0)==(n|0)){l=j;j=j+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[m>>2]=l;if((n|0)<(f|0)){n=n+1|0;m=m+4|0}else break}}e=k+8|0;l=j+-1|0;c[e>>2]=l;if(l){ek(g|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((j|0)>1){l=0;do{C=l<<2;c[k+131084+(C<<2)>>2]=D;c[k+131084+((C|1)<<2)>>2]=0;c[k+131084+((C|2)<<2)>>2]=E;c[k+131084+((C|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[e>>2]|0))}if((f|0)>0){g=0;do{m=(c[k+1179664+(g<<2)>>2]|0)+-1|0;n=g*7|0;l=k+12+(m<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(n<<2)>>2]|0);l=m<<1;j=k+655376+(l<<3)|0;h[j>>3]=+h[j>>3]+ +(c[k+1310736+(n+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(n+2<<2)>>2]|0);m=m<<2;l=k+131084+(m<<2)|0;j=c[k+1310736+(n+3<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;l=k+131084+((m|1)<<2)|0;j=c[k+1310736+(n+4<<2)>>2]|0;if((c[l>>2]|0)<(j|0))c[l>>2]=j;l=k+131084+((m|2)<<2)|0;j=c[k+1310736+(n+5<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;j=k+131084+((m|3)<<2)|0;l=c[k+1310736+(n+6<<2)>>2]|0;if((c[j>>2]|0)<(l|0))c[j>>2]=l;g=g+1|0}while((g|0)<(f|0))}if((c[e>>2]|0)>0){l=0;do{D=k+12+(l<<2)|0;E=l<<1;C=k+655376+(E<<3)|0;h[C>>3]=+h[C>>3]/+(c[D>>2]|0);E=k+655376+((E|1)<<3)|0;h[E>>3]=+h[E>>3]/+(c[D>>2]|0);l=l+1|0}while((l|0)<(c[e>>2]|0));l=0}else l=0}else l=0}i=F;return l|0}function bd(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;F=i;i=i+16|0;B=F;D=(f|0)/2|0;E=(g|0)/2|0;o=c[k>>2]|0;A=E+-1|0;if((f|0)>1){l=0;m=o;n=o+(($(A,D)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(D|0))break;else{m=m+2|0;n=n+2|0}}}y=j*3|0;z=D+-1|0;if((g|0)>1){l=0;j=o;m=o+(z<<1)|0;while(1){b[m>>1]=0;b[j>>1]=0;l=l+1|0;if((l|0)>=(E|0))break;else{j=j+(D<<1)|0;m=m+(D<<1)|0}}}m=k+1179664|0;j=D+1|0;v=0-D|0;t=1-D|0;u=~D;s=(f<<1)+8|0;a:do if((A|0)>1){w=(z|0)>1;l=(c[k+4>>2]|0)+j|0;x=1;n=e+((f<<2)+4)|0;g=o+(j<<1)|0;j=0;b:while(1){if(w){r=1;q=n;p=j;while(1){f=d[q>>0]|0;o=d[q+1>>0]|0;do if(((f&248)+12+(f<<5&224)+(o>>>3&24)+(o<<2&248)|0)>(y|0)){b[g>>1]=0;a[l>>0]=0;j=p}else{a[l>>0]=-1;j=b[g+(v<<1)>>1]|0;if(j<<16>>16>0){b[g>>1]=j;j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}e=b[g+(t<<1)>>1]|0;f=e<<16>>16;j=b[g+(u<<1)>>1]|0;o=j<<16>>16;n=j<<16>>16>0;if(e<<16>>16<=0){if(n){b[g>>1]=j;j=o*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+r;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+x;n=k+1310736+(j+-3<<2)|0;if((c[n>>2]|0)<(r|0))c[n>>2]=r;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}j=b[g+-2>>1]|0;if(j<<16>>16>0){b[g>>1]=j;j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;j=k+1310736+(j+-3<<2)|0;if((c[j>>2]|0)>=(r|0)){j=p;break}c[j>>2]=r;j=p;break}else{j=p+1|0;if((p|0)>32767)break b;b[g>>1]=j;c[k+1179664+(p<<2)>>2]=j<<16>>16;p=p*7|0;c[k+1310736+(p<<2)>>2]=1;c[k+1310736+(p+1<<2)>>2]=r;c[k+1310736+(p+2<<2)>>2]=x;c[k+1310736+(p+3<<2)>>2]=r;c[k+1310736+(p+4<<2)>>2]=r;c[k+1310736+(p+5<<2)>>2]=x;c[k+1310736+(p+6<<2)>>2]=x;break}}if(n){j=c[k+1179664+(f+-1<<2)>>2]|0;f=c[k+1179664+(o+-1<<2)>>2]|0;if((j|0)>(f|0)){b[g>>1]=f;if((p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(j|0))c[e>>2]=f;n=n+1|0;if((n|0)>=(p|0)){j=f;break}else e=e+4|0}}else j=f}else{b[g>>1]=j;if((j|0)<(f|0)&(p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(f|0))c[e>>2]=j;n=n+1|0;if((n|0)>=(p|0))break;else e=e+4|0}}}j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}n=b[g+-2>>1]|0;if(n<<16>>16<=0){b[g>>1]=e;j=f*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+r;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+x;n=k+1310736+(j+-4<<2)|0;if((c[n>>2]|0)>(r|0))c[n>>2]=r;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}j=c[k+1179664+(f+-1<<2)>>2]|0;f=c[k+1179664+((n<<16>>16)+-1<<2)>>2]|0;if((j|0)>(f|0)){b[g>>1]=f;if((p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(j|0))c[e>>2]=f;n=n+1|0;if((n|0)>=(p|0)){j=f;break}else e=e+4|0}}else j=f}else{b[g>>1]=j;if((j|0)<(f|0)&(p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(f|0))c[e>>2]=j;n=n+1|0;if((n|0)>=(p|0))break;else e=e+4|0}}}j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;j=k+1310736+(j+-5<<2)|0;c[j>>2]=(c[j>>2]|0)+x;j=p}while(0);r=r+1|0;n=q+4|0;g=g+2|0;l=l+1|0;if((r|0)>=(z|0))break;else{q=n;p=j}}}x=x+1|0;if((x|0)>=(A|0)){f=j;C=52;break a}else{l=l+2|0;n=n+s|0;g=g+4|0}}Me(3,3904,B);l=-1}else{f=0;C=52}while(0);if((C|0)==52){g=k+12|0;if((f|0)<1)j=1;else{n=1;j=1;while(1){l=c[m>>2]|0;if((l|0)==(n|0)){l=j;j=j+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[m>>2]=l;if((n|0)<(f|0)){n=n+1|0;m=m+4|0}else break}}e=k+8|0;l=j+-1|0;c[e>>2]=l;if(l){ek(g|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((j|0)>1){l=0;do{C=l<<2;c[k+131084+(C<<2)>>2]=D;c[k+131084+((C|1)<<2)>>2]=0;c[k+131084+((C|2)<<2)>>2]=E;c[k+131084+((C|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[e>>2]|0))}if((f|0)>0){g=0;do{m=(c[k+1179664+(g<<2)>>2]|0)+-1|0;n=g*7|0;l=k+12+(m<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(n<<2)>>2]|0);l=m<<1;j=k+655376+(l<<3)|0;h[j>>3]=+h[j>>3]+ +(c[k+1310736+(n+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(n+2<<2)>>2]|0);m=m<<2;l=k+131084+(m<<2)|0;j=c[k+1310736+(n+3<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;l=k+131084+((m|1)<<2)|0;j=c[k+1310736+(n+4<<2)>>2]|0;if((c[l>>2]|0)<(j|0))c[l>>2]=j;l=k+131084+((m|2)<<2)|0;j=c[k+1310736+(n+5<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;j=k+131084+((m|3)<<2)|0;l=c[k+1310736+(n+6<<2)>>2]|0;if((c[j>>2]|0)<(l|0))c[j>>2]=l;g=g+1|0}while((g|0)<(f|0))}if((c[e>>2]|0)>0){l=0;do{D=k+12+(l<<2)|0;E=l<<1;C=k+655376+(E<<3)|0;h[C>>3]=+h[C>>3]/+(c[D>>2]|0);E=k+655376+((E|1)<<3)|0;h[E>>3]=+h[E>>3]/+(c[D>>2]|0);l=l+1|0}while((l|0)<(c[e>>2]|0));l=0}else l=0}else l=0}i=F;return l|0}function cd(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;F=i;i=i+16|0;B=F;D=(f|0)/2|0;E=(g|0)/2|0;o=c[k>>2]|0;A=E+-1|0;if((f|0)>1){l=0;m=o;n=o+(($(A,D)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(D|0))break;else{m=m+2|0;n=n+2|0}}}y=j*3|0;z=D+-1|0;if((g|0)>1){l=0;j=o;m=o+(z<<1)|0;while(1){b[m>>1]=0;b[j>>1]=0;l=l+1|0;if((l|0)>=(E|0))break;else{j=j+(D<<1)|0;m=m+(D<<1)|0}}}m=k+1179664|0;j=D+1|0;v=0-D|0;t=1-D|0;u=~D;s=(f<<2)+16|0;a:do if((A|0)>1){w=(z|0)>1;l=(c[k+4>>2]|0)+j|0;x=1;n=e+((f<<3)+8)|0;g=o+(j<<1)|0;j=0;b:while(1){if(w){r=1;q=n;p=j;while(1){do if(((d[q+2>>0]|0)+(d[q+1>>0]|0)+(d[q+3>>0]|0)|0)>(y|0)){b[g>>1]=0;a[l>>0]=0;j=p}else{a[l>>0]=-1;j=b[g+(v<<1)>>1]|0;if(j<<16>>16>0){b[g>>1]=j;j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}e=b[g+(t<<1)>>1]|0;f=e<<16>>16;j=b[g+(u<<1)>>1]|0;o=j<<16>>16;n=j<<16>>16>0;if(e<<16>>16<=0){if(n){b[g>>1]=j;j=o*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+r;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+x;n=k+1310736+(j+-3<<2)|0;if((c[n>>2]|0)<(r|0))c[n>>2]=r;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}j=b[g+-2>>1]|0;if(j<<16>>16>0){b[g>>1]=j;j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;j=k+1310736+(j+-3<<2)|0;if((c[j>>2]|0)>=(r|0)){j=p;break}c[j>>2]=r;j=p;break}else{j=p+1|0;if((p|0)>32767)break b;b[g>>1]=j;c[k+1179664+(p<<2)>>2]=j<<16>>16;p=p*7|0;c[k+1310736+(p<<2)>>2]=1;c[k+1310736+(p+1<<2)>>2]=r;c[k+1310736+(p+2<<2)>>2]=x;c[k+1310736+(p+3<<2)>>2]=r;c[k+1310736+(p+4<<2)>>2]=r;c[k+1310736+(p+5<<2)>>2]=x;c[k+1310736+(p+6<<2)>>2]=x;break}}if(n){j=c[k+1179664+(f+-1<<2)>>2]|0;f=c[k+1179664+(o+-1<<2)>>2]|0;if((j|0)>(f|0)){b[g>>1]=f;if((p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(j|0))c[e>>2]=f;n=n+1|0;if((n|0)>=(p|0)){j=f;break}else e=e+4|0}}else j=f}else{b[g>>1]=j;if((j|0)<(f|0)&(p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(f|0))c[e>>2]=j;n=n+1|0;if((n|0)>=(p|0))break;else e=e+4|0}}}j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;o=k+1310736+(j+-5<<2)|0;c[o>>2]=(c[o>>2]|0)+x;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}n=b[g+-2>>1]|0;if(n<<16>>16<=0){b[g>>1]=e;j=f*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+r;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+x;n=k+1310736+(j+-4<<2)|0;if((c[n>>2]|0)>(r|0))c[n>>2]=r;c[k+1310736+(j+-1<<2)>>2]=x;j=p;break}j=c[k+1179664+(f+-1<<2)>>2]|0;f=c[k+1179664+((n<<16>>16)+-1<<2)>>2]|0;if((j|0)>(f|0)){b[g>>1]=f;if((p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(j|0))c[e>>2]=f;n=n+1|0;if((n|0)>=(p|0)){j=f;break}else e=e+4|0}}else j=f}else{b[g>>1]=j;if((j|0)<(f|0)&(p|0)>0){n=0;e=m;while(1){if((c[e>>2]|0)==(f|0))c[e>>2]=j;n=n+1|0;if((n|0)>=(p|0))break;else e=e+4|0}}}j=(j<<16>>16)*7|0;o=k+1310736+(j+-7<<2)|0;c[o>>2]=(c[o>>2]|0)+1;o=k+1310736+(j+-6<<2)|0;c[o>>2]=(c[o>>2]|0)+r;j=k+1310736+(j+-5<<2)|0;c[j>>2]=(c[j>>2]|0)+x;j=p}while(0);r=r+1|0;n=q+8|0;g=g+2|0;l=l+1|0;if((r|0)>=(z|0))break;else{q=n;p=j}}}x=x+1|0;if((x|0)>=(A|0)){f=j;C=52;break a}else{l=l+2|0;n=n+s|0;g=g+4|0}}Me(3,3904,B);l=-1}else{f=0;C=52}while(0);if((C|0)==52){g=k+12|0;if((f|0)<1)j=1;else{n=1;j=1;while(1){l=c[m>>2]|0;if((l|0)==(n|0)){l=j;j=j+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[m>>2]=l;if((n|0)<(f|0)){n=n+1|0;m=m+4|0}else break}}e=k+8|0;l=j+-1|0;c[e>>2]=l;if(l){ek(g|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((j|0)>1){l=0;do{C=l<<2;c[k+131084+(C<<2)>>2]=D;c[k+131084+((C|1)<<2)>>2]=0;c[k+131084+((C|2)<<2)>>2]=E;c[k+131084+((C|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[e>>2]|0))}if((f|0)>0){g=0;do{m=(c[k+1179664+(g<<2)>>2]|0)+-1|0;n=g*7|0;l=k+12+(m<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(n<<2)>>2]|0);l=m<<1;j=k+655376+(l<<3)|0;h[j>>3]=+h[j>>3]+ +(c[k+1310736+(n+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(n+2<<2)>>2]|0);m=m<<2;l=k+131084+(m<<2)|0;j=c[k+1310736+(n+3<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;l=k+131084+((m|1)<<2)|0;j=c[k+1310736+(n+4<<2)>>2]|0;if((c[l>>2]|0)<(j|0))c[l>>2]=j;l=k+131084+((m|2)<<2)|0;j=c[k+1310736+(n+5<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;j=k+131084+((m|3)<<2)|0;l=c[k+1310736+(n+6<<2)>>2]|0;if((c[j>>2]|0)<(l|0))c[j>>2]=l;g=g+1|0}while((g|0)<(f|0))}if((c[e>>2]|0)>0){l=0;do{D=k+12+(l<<2)|0;E=l<<1;C=k+655376+(E<<3)|0;h[C>>3]=+h[C>>3]/+(c[D>>2]|0);E=k+655376+((E|1)<<3)|0;h[E>>3]=+h[E>>3]/+(c[D>>2]|0);l=l+1|0}while((l|0)<(c[e>>2]|0));l=0}else l=0}else l=0}i=F;return l|0} +function sh(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;if((b|0)!=1){if(b+-1&b)b=_j(b)|0}else b=2;f=c[a+4>>2]|0;if(b>>>0<=f>>>0){if(b>>>0<f>>>0){if(f>>>0>2)e=(f+-1&f|0)==0;else e=0;d=~~+_(+(+((c[a+12>>2]|0)>>>0)/+g[a+16>>2]))>>>0;if(e)d=1<<32-(ba(d+-1|0)|0);else d=_j(d)|0;b=b>>>0<d>>>0?d:b;if(b>>>0<f>>>0)th(a,b)}}else th(a,b);return}function th(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;e=a+4|0;a:do if(b){m=Kh(b<<2)|0;d=c[a>>2]|0;c[a>>2]=m;if(d)Lh(d);c[e>>2]=b;if(b){d=0;do{c[(c[a>>2]|0)+(d<<2)>>2]=0;d=d+1|0}while((d|0)!=(b|0))}e=a+8|0;f=c[e>>2]|0;if(f){d=c[f+4>>2]|0;l=b+-1|0;m=(l&b|0)==0;if(m)h=d&l;else h=(d>>>0)%(b>>>0)|0;c[(c[a>>2]|0)+(h<<2)>>2]=e;d=c[f>>2]|0;if(d){g=f;e=f;while(1){k=e;b:while(1){while(1){e=c[d+4>>2]|0;if(m)j=e&l;else j=(e>>>0)%(b>>>0)|0;if((j|0)==(h|0)){e=d;break}e=(c[a>>2]|0)+(j<<2)|0;if(!(c[e>>2]|0)){h=j;f=d;break b}i=d+8|0;e=d;while(1){f=c[e>>2]|0;if(!f)break;if((c[i>>2]|0)==(c[f+8>>2]|0))e=f;else break}c[g>>2]=f;c[e>>2]=c[c[(c[a>>2]|0)+(j<<2)>>2]>>2];c[c[(c[a>>2]|0)+(j<<2)>>2]>>2]=d;d=c[k>>2]|0;if(!d)break a}d=c[e>>2]|0;if(!d)break a;else{g=e;k=e}}c[e>>2]=g;d=c[f>>2]|0;if(!d)break;else{g=f;e=f}}}}}else{d=c[a>>2]|0;c[a>>2]=0;if(d)Lh(d);c[e>>2]=0}while(0);return}function uh(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;g=i;i=i+32|0;h=g+16|0;f=g+4|0;j=g;d=c[d>>2]|0;e=c[d>>2]|0;c[j>>2]=d;c[h>>2]=c[j>>2];vh(f,b,h);d=c[f>>2]|0;c[f>>2]=0;if(d){if(a[f+8>>0]|0)Fg(d+264|0);Lh(d)}i=g;return e|0}function vh(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;o=c[e>>2]|0;l=c[d+4>>2]|0;e=c[o+4>>2]|0;m=l+-1|0;n=(m&l|0)==0;if(n)k=m&e;else k=(e>>>0)%(l>>>0)|0;g=(c[d>>2]|0)+(k<<2)|0;f=c[g>>2]|0;while(1){e=c[f>>2]|0;if((e|0)==(o|0)){j=f;break}else f=e}i=d+8|0;if((j|0)!=(i|0)){e=c[j+4>>2]|0;if(n)e=e&m;else e=(e>>>0)%(l>>>0)|0;if((e|0)==(k|0))g=o;else h=12}else h=12;do if((h|0)==12){e=c[o>>2]|0;if(e){e=c[e+4>>2]|0;if(n)e=e&m;else e=(e>>>0)%(l>>>0)|0;if((e|0)==(k|0)){g=o;break}}c[g>>2]=0;g=o}while(0);f=c[g>>2]|0;e=f;if(f){f=c[f+4>>2]|0;if(n)f=f&m;else f=(f>>>0)%(l>>>0)|0;if((f|0)!=(k|0)){c[(c[d>>2]|0)+(f<<2)>>2]=j;e=c[o>>2]|0}}c[j>>2]=e;c[g>>2]=0;d=d+12|0;c[d>>2]=(c[d>>2]|0)+-1;c[b>>2]=o;c[b+4>>2]=i;a[b+8>>0]=1;return}function wh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=Kh(408)|0;c[e+8>>2]=c[d>>2];ek(e+16|0,0,392)|0;h[e+248>>3]=.0001;h[e+256>>3]=1.0e3;d=e+264|0;c[d>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[a>>2]=e;a=a+4|0;c[a>>2]=b+8;c[a+4>>2]=257;return}function xh(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0.0,k=0.0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;m=c[e+8>>2]|0;s=e+4|0;c[s>>2]=m;r=d+4|0;l=c[r>>2]|0;q=(l|0)==0;a:do if(!q){n=l+-1|0;o=(n&l|0)==0;if(o)h=n&m;else h=(m>>>0)%(l>>>0)|0;f=c[(c[d>>2]|0)+(h<<2)>>2]|0;if(!f)p=12;else while(1){i=c[f>>2]|0;if(!i){p=12;break a}f=c[i+4>>2]|0;if(o)f=f&n;else f=(f>>>0)%(l>>>0)|0;if((f|0)!=(h|0)){p=12;break a}if((c[i+8>>2]|0)==(m|0)){f=0;e=i;break}else f=i}}else{h=0;p=12}while(0);if((p|0)==12){m=d+12|0;j=+(((c[m>>2]|0)+1|0)>>>0);k=+g[d+16>>2];do if(q|j>+(l>>>0)*k){if(l>>>0>2)f=(l+-1&l|0)==0;else f=0;i=(f&1|l<<1)^1;f=~~+_(+(j/k))>>>0;yh(d,i>>>0<f>>>0?f:i);i=c[r>>2]|0;f=c[s>>2]|0;h=i+-1|0;if(!(h&i)){l=i;h=h&f;break}else{l=i;h=(f>>>0)%(i>>>0)|0;break}}while(0);f=c[(c[d>>2]|0)+(h<<2)>>2]|0;if(!f){f=d+8|0;c[e>>2]=c[f>>2];c[f>>2]=e;c[(c[d>>2]|0)+(h<<2)>>2]=f;f=c[e>>2]|0;if(f){f=c[f+4>>2]|0;h=l+-1|0;if(!(h&l))f=f&h;else f=(f>>>0)%(l>>>0)|0;c[(c[d>>2]|0)+(f<<2)>>2]=e}}else{c[e>>2]=c[f>>2];c[f>>2]=e}c[m>>2]=(c[m>>2]|0)+1;f=1}c[b>>2]=e;a[b+4>>0]=f;return}function yh(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;if((b|0)!=1){if(b+-1&b)b=_j(b)|0}else b=2;f=c[a+4>>2]|0;if(b>>>0<=f>>>0){if(b>>>0<f>>>0){if(f>>>0>2)e=(f+-1&f|0)==0;else e=0;d=~~+_(+(+((c[a+12>>2]|0)>>>0)/+g[a+16>>2]))>>>0;if(e)d=1<<32-(ba(d+-1|0)|0);else d=_j(d)|0;b=b>>>0<d>>>0?d:b;if(b>>>0<f>>>0)zh(a,b)}}else zh(a,b);return}function zh(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;e=a+4|0;a:do if(b){m=Kh(b<<2)|0;d=c[a>>2]|0;c[a>>2]=m;if(d)Lh(d);c[e>>2]=b;if(b){d=0;do{c[(c[a>>2]|0)+(d<<2)>>2]=0;d=d+1|0}while((d|0)!=(b|0))}e=a+8|0;f=c[e>>2]|0;if(f){d=c[f+4>>2]|0;l=b+-1|0;m=(l&b|0)==0;if(m)h=d&l;else h=(d>>>0)%(b>>>0)|0;c[(c[a>>2]|0)+(h<<2)>>2]=e;d=c[f>>2]|0;if(d){g=f;e=f;while(1){k=e;b:while(1){while(1){e=c[d+4>>2]|0;if(m)j=e&l;else j=(e>>>0)%(b>>>0)|0;if((j|0)==(h|0)){e=d;break}e=(c[a>>2]|0)+(j<<2)|0;if(!(c[e>>2]|0)){h=j;f=d;break b}i=d+8|0;e=d;while(1){f=c[e>>2]|0;if(!f)break;if((c[i>>2]|0)==(c[f+8>>2]|0))e=f;else break}c[g>>2]=f;c[e>>2]=c[c[(c[a>>2]|0)+(j<<2)>>2]>>2];c[c[(c[a>>2]|0)+(j<<2)>>2]>>2]=d;d=c[k>>2]|0;if(!d)break a}d=c[e>>2]|0;if(!d)break a;else{g=e;k=e}}c[e>>2]=g;d=c[f>>2]|0;if(!d)break;else{g=f;e=f}}}}}else{d=c[a>>2]|0;c[a>>2]=0;if(d)Lh(d);c[e>>2]=0}while(0);return}function Ah(a){a=a|0;return Aj(c[a+4>>2]|0)|0}function Bh(a){a=a|0;Ka(624,10917);Ya(632,10922,1,1,0);Ga(640,10927,1,-128,127);Ga(656,10932,1,-128,127);Ga(648,10944,1,0,255);Ga(664,10958,2,-32768,32767);Ga(672,10964,2,0,65535);Ga(680,10979,4,-2147483648,2147483647);Ga(688,10983,4,0,-1);Ga(696,10996,4,-2147483648,2147483647);Ga(704,11001,4,0,-1);kb(712,11015,4);kb(720,11021,8);sb(360,11028);sb(392,11040);bb(416,4,11073);db(440,11086);Aa(448,0,11102);Dh(11132);Eh(11169);Fh(11208);Gh(11239);Hh(11279);Ih(11308);Aa(456,4,11346);Aa(464,5,11376);Dh(11415);Eh(11447);Fh(11480);Gh(11513);Hh(11547);Ih(11580);Aa(472,6,11614);Aa(480,7,11645);Aa(488,7,11677);return}function Ch(){Bh(0);return}function Dh(a){a=a|0;Aa(536,0,a|0);return}function Eh(a){a=a|0;Aa(528,1,a|0);return}function Fh(a){a=a|0;Aa(520,2,a|0);return}function Gh(a){a=a|0;Aa(512,3,a|0);return}function Hh(a){a=a|0;Aa(504,4,a|0);return}function Ih(a){a=a|0;Aa(496,5,a|0);return}function Jh(a){a=a|0;Ia(12478,12501,303,12589)}function Kh(a){a=a|0;var b=0;b=(a|0)==0?1:a;a=Uj(b)|0;a:do if(!a){while(1){a=Ph()|0;if(!a)break;_b[a&0]();a=Uj(b)|0;if(a)break a}b=Wa(4)|0;c[b>>2]=2224;wb(b|0,544,1)}while(0);return a|0}function Lh(a){a=a|0;Vj(a);return}function Mh(a){a=a|0;return}function Nh(a){a=a|0;Lh(a);return}function Oh(a){a=a|0;return 12610}function Ph(){var a=0;a=c[559]|0;c[559]=a+0;return a|0}function Qh(a){a=a|0;return}function Rh(a){a=a|0;return}function Sh(a){a=a|0;return}function Th(a){a=a|0;return}function Uh(a){a=a|0;return}function Vh(a){a=a|0;Lh(a);return}function Wh(a){a=a|0;Lh(a);return}function Xh(a){a=a|0;Lh(a);return}function Yh(a){a=a|0;Lh(a);return}function Zh(a,b,c){a=a|0;b=b|0;c=c|0;return (a|0)==(b|0)|0}function _h(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;h=i;i=i+64|0;g=h;if((a|0)!=(b|0))if((b|0)!=0?(f=ei(b,576,592,0)|0,(f|0)!=0):0){b=g;e=b+56|0;do{c[b>>2]=0;b=b+4|0}while((b|0)<(e|0));c[g>>2]=f;c[g+8>>2]=a;c[g+12>>2]=-1;c[g+48>>2]=1;dc[c[(c[f>>2]|0)+28>>2]&3](f,g,c[d>>2]|0,1);if((c[g+24>>2]|0)==1){c[d>>2]=c[g+16>>2];b=1}else b=0}else b=0;else b=1;i=h;return b|0}function $h(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0;b=d+16|0;g=c[b>>2]|0;do if(g){if((g|0)!=(e|0)){f=d+36|0;c[f>>2]=(c[f>>2]|0)+1;c[d+24>>2]=2;a[d+54>>0]=1;break}b=d+24|0;if((c[b>>2]|0)==2)c[b>>2]=f}else{c[b>>2]=e;c[d+24>>2]=f;c[d+36>>2]=1}while(0);return}function ai(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;if((a|0)==(c[b+8>>2]|0))$h(0,b,d,e);return}function bi(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;if((a|0)==(c[b+8>>2]|0))$h(0,b,d,e);else{a=c[a+8>>2]|0;dc[c[(c[a>>2]|0)+28>>2]&3](a,b,d,e)}return}function ci(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;g=c[a+4>>2]|0;f=g>>8;if(g&1)f=c[(c[d>>2]|0)+f>>2]|0;a=c[a>>2]|0;dc[c[(c[a>>2]|0)+28>>2]&3](a,b,d+f|0,(g&2|0)!=0?e:2);return}function di(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;a:do if((b|0)!=(c[d+8>>2]|0)){h=c[b+12>>2]|0;g=b+16+(h<<3)|0;ci(b+16|0,d,e,f);if((h|0)>1){h=d+54|0;b=b+24|0;do{ci(b,d,e,f);if(a[h>>0]|0)break a;b=b+8|0}while(b>>>0<g>>>0)}}else $h(0,d,e,f);while(0);return}function ei(d,e,f,g){d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;r=i;i=i+64|0;q=r;p=c[d>>2]|0;o=d+(c[p+-8>>2]|0)|0;p=c[p+-4>>2]|0;c[q>>2]=f;c[q+4>>2]=d;c[q+8>>2]=e;c[q+12>>2]=g;g=q+16|0;d=q+20|0;e=q+24|0;h=q+28|0;j=q+32|0;k=q+40|0;l=(p|0)==(f|0);m=g;n=m+36|0;do{c[m>>2]=0;m=m+4|0}while((m|0)<(n|0));b[g+36>>1]=0;a[g+38>>0]=0;a:do if(l){c[q+48>>2]=1;bc[c[(c[f>>2]|0)+20>>2]&3](f,q,o,o,1,0);g=(c[e>>2]|0)==1?o:0}else{Rb[c[(c[p>>2]|0)+24>>2]&3](p,q,o,1,0);switch(c[q+36>>2]|0){case 0:{g=(c[k>>2]|0)==1&(c[h>>2]|0)==1&(c[j>>2]|0)==1?c[d>>2]|0:0;break a}case 1:break;default:{g=0;break a}}if((c[e>>2]|0)!=1?!((c[k>>2]|0)==0&(c[h>>2]|0)==1&(c[j>>2]|0)==1):0){g=0;break}g=c[g>>2]|0}while(0);i=r;return g|0}function fi(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;a[d+53>>0]=1;do if((c[d+4>>2]|0)==(f|0)){a[d+52>>0]=1;f=d+16|0;b=c[f>>2]|0;if(!b){c[f>>2]=e;c[d+24>>2]=g;c[d+36>>2]=1;if(!((g|0)==1?(c[d+48>>2]|0)==1:0))break;a[d+54>>0]=1;break}if((b|0)!=(e|0)){g=d+36|0;c[g>>2]=(c[g>>2]|0)+1;a[d+54>>0]=1;break}b=d+24|0;f=c[b>>2]|0;if((f|0)==2){c[b>>2]=g;f=g}if((f|0)==1?(c[d+48>>2]|0)==1:0)a[d+54>>0]=1}while(0);return}function gi(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;a:do if((b|0)==(c[d+8>>2]|0)){if((c[d+4>>2]|0)==(e|0)?(h=d+28|0,(c[h>>2]|0)!=1):0)c[h>>2]=f}else{if((b|0)!=(c[d>>2]|0)){q=c[b+12>>2]|0;j=b+16+(q<<3)|0;ii(b+16|0,d,e,f,g);h=b+24|0;if((q|0)<=1)break;i=c[b+8>>2]|0;if((i&2|0)==0?(k=d+36|0,(c[k>>2]|0)!=1):0){if(!(i&1)){i=d+54|0;while(1){if(a[i>>0]|0)break a;if((c[k>>2]|0)==1)break a;ii(h,d,e,f,g);h=h+8|0;if(h>>>0>=j>>>0)break a}}i=d+24|0;b=d+54|0;while(1){if(a[b>>0]|0)break a;if((c[k>>2]|0)==1?(c[i>>2]|0)==1:0)break a;ii(h,d,e,f,g);h=h+8|0;if(h>>>0>=j>>>0)break a}}i=d+54|0;while(1){if(a[i>>0]|0)break a;ii(h,d,e,f,g);h=h+8|0;if(h>>>0>=j>>>0)break a}}if((c[d+16>>2]|0)!=(e|0)?(p=d+20|0,(c[p>>2]|0)!=(e|0)):0){c[d+32>>2]=f;m=d+44|0;if((c[m>>2]|0)==4)break;i=c[b+12>>2]|0;j=b+16+(i<<3)|0;k=d+52|0;f=d+53|0;n=d+54|0;l=b+8|0;o=d+24|0;b:do if((i|0)>0){i=0;h=0;b=b+16|0;while(1){a[k>>0]=0;a[f>>0]=0;hi(b,d,e,e,1,g);if(a[n>>0]|0){q=20;break b}do if(a[f>>0]|0){if(!(a[k>>0]|0))if(!(c[l>>2]&1)){h=1;q=20;break b}else{h=1;break}if((c[o>>2]|0)==1)break b;if(!(c[l>>2]&2))break b;else{i=1;h=1}}while(0);b=b+8|0;if(b>>>0>=j>>>0){q=20;break}}}else{i=0;h=0;q=20}while(0);do if((q|0)==20){if((!i?(c[p>>2]=e,e=d+40|0,c[e>>2]=(c[e>>2]|0)+1,(c[d+36>>2]|0)==1):0)?(c[o>>2]|0)==2:0){a[n>>0]=1;if(h)break}else q=24;if((q|0)==24?h:0)break;c[m>>2]=4;break a}while(0);c[m>>2]=3;break}if((f|0)==1)c[d+32>>2]=1}while(0);return}function hi(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0;i=c[a+4>>2]|0;h=i>>8;if(i&1)h=c[(c[e>>2]|0)+h>>2]|0;a=c[a>>2]|0;bc[c[(c[a>>2]|0)+20>>2]&3](a,b,d,e+h|0,(i&2|0)!=0?f:2,g);return}function ii(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;h=c[a+4>>2]|0;g=h>>8;if(h&1)g=c[(c[d>>2]|0)+g>>2]|0;a=c[a>>2]|0;Rb[c[(c[a>>2]|0)+24>>2]&3](a,b,d+g|0,(h&2|0)!=0?e:2,f);return}function ji(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0;a:do if((b|0)==(c[d+8>>2]|0)){if((c[d+4>>2]|0)==(e|0)?(h=d+28|0,(c[h>>2]|0)!=1):0)c[h>>2]=f}else{if((b|0)!=(c[d>>2]|0)){j=c[b+8>>2]|0;Rb[c[(c[j>>2]|0)+24>>2]&3](j,d,e,f,g);break}if((c[d+16>>2]|0)!=(e|0)?(i=d+20|0,(c[i>>2]|0)!=(e|0)):0){c[d+32>>2]=f;f=d+44|0;if((c[f>>2]|0)==4)break;h=d+52|0;a[h>>0]=0;k=d+53|0;a[k>>0]=0;b=c[b+8>>2]|0;bc[c[(c[b>>2]|0)+20>>2]&3](b,d,e,e,1,g);if(a[k>>0]|0){if(!(a[h>>0]|0)){h=1;j=13}}else{h=0;j=13}do if((j|0)==13){c[i>>2]=e;k=d+40|0;c[k>>2]=(c[k>>2]|0)+1;if((c[d+36>>2]|0)==1?(c[d+24>>2]|0)==2:0){a[d+54>>0]=1;if(h)break}else j=16;if((j|0)==16?h:0)break;c[f>>2]=4;break a}while(0);c[f>>2]=3;break}if((f|0)==1)c[d+32>>2]=1}while(0);return}function ki(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0;do if((b|0)==(c[d+8>>2]|0)){if((c[d+4>>2]|0)==(e|0)?(i=d+28|0,(c[i>>2]|0)!=1):0)c[i>>2]=f}else if((b|0)==(c[d>>2]|0)){if((c[d+16>>2]|0)!=(e|0)?(h=d+20|0,(c[h>>2]|0)!=(e|0)):0){c[d+32>>2]=f;c[h>>2]=e;g=d+40|0;c[g>>2]=(c[g>>2]|0)+1;if((c[d+36>>2]|0)==1?(c[d+24>>2]|0)==2:0)a[d+54>>0]=1;c[d+44>>2]=4;break}if((f|0)==1)c[d+32>>2]=1}while(0);return}function li(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;if((b|0)==(c[d+8>>2]|0))fi(0,d,e,f,g);else{m=d+52|0;n=a[m>>0]|0;o=d+53|0;p=a[o>>0]|0;l=c[b+12>>2]|0;i=b+16+(l<<3)|0;a[m>>0]=0;a[o>>0]=0;hi(b+16|0,d,e,f,g,h);a:do if((l|0)>1){j=d+24|0;k=b+8|0;l=d+54|0;b=b+24|0;do{if(a[l>>0]|0)break a;if(!(a[m>>0]|0)){if((a[o>>0]|0)!=0?(c[k>>2]&1|0)==0:0)break a}else{if((c[j>>2]|0)==1)break a;if(!(c[k>>2]&2))break a}a[m>>0]=0;a[o>>0]=0;hi(b,d,e,f,g,h);b=b+8|0}while(b>>>0<i>>>0)}while(0);a[m>>0]=n;a[o>>0]=p}return}function mi(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;if((a|0)==(c[b+8>>2]|0))fi(0,b,d,e,f);else{a=c[a+8>>2]|0;bc[c[(c[a>>2]|0)+20>>2]&3](a,b,d,e,f,g)}return}function ni(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;if((a|0)==(c[b+8>>2]|0))fi(0,b,d,e,f);return}function oi(a){a=a|0;Ia(12625,12654,1164,12589)}function pi(a){a=a|0;return ((a|0)==32|(a+-9|0)>>>0<5)&1|0}function qi(){var a=0;if(!(c[597]|0))a=2644;else a=c[(gb()|0)+60>>2]|0;return a|0}function ri(b){b=b|0;var c=0,e=0;c=0;while(1){if((d[12742+c>>0]|0)==(b|0)){e=2;break}c=c+1|0;if((c|0)==87){c=87;b=12830;e=5;break}}if((e|0)==2)if(!c)b=12830;else{b=12830;e=5}if((e|0)==5)while(1){e=b;while(1){b=e+1|0;if(!(a[e>>0]|0))break;else e=b}c=c+-1|0;if(!c)break;else e=5}return b|0}function si(b,e,f){b=b|0;e=e|0;f=f|0;var g=0.0,h=0,j=0.0,k=0,l=0,m=0.0,n=0,o=0,p=0,q=0.0,r=0.0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0.0;L=i;i=i+512|0;H=L;switch(e|0){case 0:{K=24;J=-149;A=4;break}case 1:{K=53;J=-1074;A=4;break}case 2:{K=53;J=-1074;A=4;break}default:g=0.0}a:do if((A|0)==4){E=b+4|0;C=b+100|0;do{e=c[E>>2]|0;if(e>>>0<(c[C>>2]|0)>>>0){c[E>>2]=e+1;e=d[e>>0]|0}else e=vi(b)|0}while((pi(e)|0)!=0);b:do switch(e|0){case 43:case 45:{h=1-(((e|0)==45&1)<<1)|0;e=c[E>>2]|0;if(e>>>0<(c[C>>2]|0)>>>0){c[E>>2]=e+1;e=d[e>>0]|0;I=h;break b}else{e=vi(b)|0;I=h;break b}}default:I=1}while(0);h=e;e=0;do{if((h|32|0)!=(a[14634+e>>0]|0))break;do if(e>>>0<7){h=c[E>>2]|0;if(h>>>0<(c[C>>2]|0)>>>0){c[E>>2]=h+1;h=d[h>>0]|0;break}else{h=vi(b)|0;break}}while(0);e=e+1|0}while(e>>>0<8);c:do switch(e|0){case 8:break;case 3:{A=23;break}default:{k=(f|0)!=0;if(k&e>>>0>3)if((e|0)==8)break c;else{A=23;break c}d:do if(!e){e=0;do{if((h|32|0)!=(a[16477+e>>0]|0))break d;do if(e>>>0<2){h=c[E>>2]|0;if(h>>>0<(c[C>>2]|0)>>>0){c[E>>2]=h+1;h=d[h>>0]|0;break}else{h=vi(b)|0;break}}while(0);e=e+1|0}while(e>>>0<3)}while(0);switch(e|0){case 3:{e=c[E>>2]|0;if(e>>>0<(c[C>>2]|0)>>>0){c[E>>2]=e+1;e=d[e>>0]|0}else e=vi(b)|0;if((e|0)==40)e=1;else{if(!(c[C>>2]|0)){g=s;break a}c[E>>2]=(c[E>>2]|0)+-1;g=s;break a}while(1){h=c[E>>2]|0;if(h>>>0<(c[C>>2]|0)>>>0){c[E>>2]=h+1;h=d[h>>0]|0}else h=vi(b)|0;if(!((h+-48|0)>>>0<10|(h+-65|0)>>>0<26)?!((h|0)==95|(h+-97|0)>>>0<26):0)break;e=e+1|0}if((h|0)==41){g=s;break a}h=(c[C>>2]|0)==0;if(!h)c[E>>2]=(c[E>>2]|0)+-1;if(!k){c[(qi()|0)>>2]=22;ui(b,0);g=0.0;break a}if(!e){g=s;break a}while(1){e=e+-1|0;if(!h)c[E>>2]=(c[E>>2]|0)+-1;if(!e){g=s;break a}}}case 0:{do if((h|0)==48){e=c[E>>2]|0;if(e>>>0<(c[C>>2]|0)>>>0){c[E>>2]=e+1;e=d[e>>0]|0}else e=vi(b)|0;if((e|32|0)!=120){if(!(c[C>>2]|0)){e=48;break}c[E>>2]=(c[E>>2]|0)+-1;e=48;break}e=c[E>>2]|0;if(e>>>0<(c[C>>2]|0)>>>0){c[E>>2]=e+1;e=d[e>>0]|0;k=0}else{e=vi(b)|0;k=0}e:while(1){switch(e|0){case 46:{A=74;break e}case 48:break;default:{y=0;l=0;x=0;h=0;n=k;o=0;w=0;m=1.0;k=0;g=0.0;break e}}e=c[E>>2]|0;if(e>>>0<(c[C>>2]|0)>>>0){c[E>>2]=e+1;e=d[e>>0]|0;k=1;continue}else{e=vi(b)|0;k=1;continue}}if((A|0)==74){e=c[E>>2]|0;if(e>>>0<(c[C>>2]|0)>>>0){c[E>>2]=e+1;e=d[e>>0]|0}else e=vi(b)|0;if((e|0)==48){k=0;h=0;do{e=c[E>>2]|0;if(e>>>0<(c[C>>2]|0)>>>0){c[E>>2]=e+1;e=d[e>>0]|0}else e=vi(b)|0;k=gk(k|0,h|0,-1,-1)|0;h=D}while((e|0)==48);y=0;l=0;x=k;n=1;o=1;w=0;m=1.0;k=0;g=0.0}else{y=0;l=0;x=0;h=0;n=k;o=1;w=0;m=1.0;k=0;g=0.0}}while(1){u=e+-48|0;p=e|32;if(u>>>0>=10){v=(e|0)==46;if(!(v|(p+-97|0)>>>0<6)){p=x;u=y;break}if(v)if(!o){v=l;h=y;u=y;o=1;p=w;j=m}else{p=x;u=y;e=46;break}else A=86}else A=86;if((A|0)==86){A=0;e=(e|0)>57?p+-87|0:u;do if(!((y|0)<0|(y|0)==0&l>>>0<8)){if((y|0)<0|(y|0)==0&l>>>0<14){r=m*.0625;p=w;j=r;g=g+r*+(e|0);break}if((w|0)!=0|(e|0)==0){p=w;j=m}else{p=1;j=m;g=g+m*.5}}else{p=w;j=m;k=e+(k<<4)|0}while(0);l=gk(l|0,y|0,1,0)|0;v=x;u=D;n=1}e=c[E>>2]|0;if(e>>>0<(c[C>>2]|0)>>>0){c[E>>2]=e+1;y=u;x=v;e=d[e>>0]|0;w=p;m=j;continue}else{y=u;x=v;e=vi(b)|0;w=p;m=j;continue}}if(!n){e=(c[C>>2]|0)==0;if(!e)c[E>>2]=(c[E>>2]|0)+-1;if(f){if(!e?(z=c[E>>2]|0,c[E>>2]=z+-1,(o|0)!=0):0)c[E>>2]=z+-2}else ui(b,0);g=+(I|0)*0.0;break a}n=(o|0)==0;o=n?l:p;n=n?u:h;if((u|0)<0|(u|0)==0&l>>>0<8){h=u;do{k=k<<4;l=gk(l|0,h|0,1,0)|0;h=D}while((h|0)<0|(h|0)==0&l>>>0<8)}if((e|32|0)==112){h=Hj(b,f)|0;e=D;if((h|0)==0&(e|0)==-2147483648){if(!f){ui(b,0);g=0.0;break a}if(!(c[C>>2]|0)){h=0;e=0}else{c[E>>2]=(c[E>>2]|0)+-1;h=0;e=0}}}else if(!(c[C>>2]|0)){h=0;e=0}else{c[E>>2]=(c[E>>2]|0)+-1;h=0;e=0}H=fk(o|0,n|0,2)|0;H=gk(H|0,D|0,-32,-1)|0;e=gk(H|0,D|0,h|0,e|0)|0;h=D;if(!k){g=+(I|0)*0.0;break a}if((h|0)>0|(h|0)==0&e>>>0>(0-J|0)>>>0){c[(qi()|0)>>2]=34;g=+(I|0)*1797693134862315708145274.0e284*1797693134862315708145274.0e284;break a}H=J+-106|0;G=((H|0)<0)<<31>>31;if((h|0)<(G|0)|(h|0)==(G|0)&e>>>0<H>>>0){c[(qi()|0)>>2]=34;g=+(I|0)*2.2250738585072014e-308*2.2250738585072014e-308;break a}if((k|0)>-1){do{G=!(g>=.5);H=G&1|k<<1;k=H^1;g=g+(G?g:g+-1.0);e=gk(e|0,h|0,-1,-1)|0;h=D}while((H|0)>-1);l=e;m=g}else{l=e;m=g}e=dk(32,0,J|0,((J|0)<0)<<31>>31|0)|0;e=gk(l|0,h|0,e|0,D|0)|0;J=D;if(0>(J|0)|0==(J|0)&K>>>0>e>>>0)if((e|0)<0){e=0;A=127}else A=125;else{e=K;A=125}if((A|0)==125)if((e|0)<53)A=127;else{h=e;j=+(I|0);g=0.0}if((A|0)==127){g=+(I|0);h=e;j=g;g=+yi(+Di(1.0,84-e|0),g)}K=(k&1|0)==0&(m!=0.0&(h|0)<32);g=j*(K?0.0:m)+(g+j*+(((K&1)+k|0)>>>0))-g;if(!(g!=0.0))c[(qi()|0)>>2]=34;g=+Ei(g,l);break a}else e=h;while(0);F=J+K|0;G=0-F|0;k=0;f:while(1){switch(e|0){case 46:{A=138;break f}case 48:break;default:{h=0;p=0;o=0;break f}}e=c[E>>2]|0;if(e>>>0<(c[C>>2]|0)>>>0){c[E>>2]=e+1;e=d[e>>0]|0;k=1;continue}else{e=vi(b)|0;k=1;continue}}if((A|0)==138){e=c[E>>2]|0;if(e>>>0<(c[C>>2]|0)>>>0){c[E>>2]=e+1;e=d[e>>0]|0}else e=vi(b)|0;if((e|0)==48){h=0;e=0;while(1){h=gk(h|0,e|0,-1,-1)|0;k=D;e=c[E>>2]|0;if(e>>>0<(c[C>>2]|0)>>>0){c[E>>2]=e+1;e=d[e>>0]|0}else e=vi(b)|0;if((e|0)==48)e=k;else{p=k;k=1;o=1;break}}}else{h=0;p=0;o=1}}c[H>>2]=0;n=e+-48|0;l=(e|0)==46;g:do if(l|n>>>0<10){B=H+496|0;y=0;v=0;w=l;A=p;u=k;z=o;k=0;l=0;o=0;h:while(1){do if(w)if(!z){h=y;p=v;z=1}else{p=A;e=y;n=v;break h}else{w=gk(y|0,v|0,1,0)|0;v=D;x=(e|0)!=48;if((l|0)>=125){if(!x){p=A;y=w;break}c[B>>2]=c[B>>2]|1;p=A;y=w;break}p=H+(l<<2)|0;if(k)n=e+-48+((c[p>>2]|0)*10|0)|0;c[p>>2]=n;k=k+1|0;n=(k|0)==9;p=A;y=w;u=1;k=n?0:k;l=(n&1)+l|0;o=x?w:o}while(0);e=c[E>>2]|0;if(e>>>0<(c[C>>2]|0)>>>0){c[E>>2]=e+1;e=d[e>>0]|0}else e=vi(b)|0;n=e+-48|0;w=(e|0)==46;if(!(w|n>>>0<10)){n=z;A=161;break g}else A=p}u=(u|0)!=0;A=169}else{y=0;v=0;u=k;n=o;k=0;l=0;o=0;A=161}while(0);do if((A|0)==161){B=(n|0)==0;h=B?y:h;p=B?v:p;u=(u|0)!=0;if(!((e|32|0)==101&u))if((e|0)>-1){e=y;n=v;A=169;break}else{e=y;n=v;A=171;break}n=Hj(b,f)|0;e=D;if((n|0)==0&(e|0)==-2147483648){if(!f){ui(b,0);g=0.0;break}if(!(c[C>>2]|0)){n=0;e=0}else{c[E>>2]=(c[E>>2]|0)+-1;n=0;e=0}}h=gk(n|0,e|0,h|0,p|0)|0;u=y;p=D;n=v;A=173}while(0);if((A|0)==169)if(c[C>>2]|0){c[E>>2]=(c[E>>2]|0)+-1;if(u){u=e;A=173}else A=172}else A=171;if((A|0)==171)if(u){u=e;A=173}else A=172;do if((A|0)==172){c[(qi()|0)>>2]=22;ui(b,0);g=0.0}else if((A|0)==173){e=c[H>>2]|0;if(!e){g=+(I|0)*0.0;break}if(((n|0)<0|(n|0)==0&u>>>0<10)&((h|0)==(u|0)&(p|0)==(n|0))?K>>>0>30|(e>>>K|0)==0:0){g=+(I|0)*+(e>>>0);break}b=(J|0)/-2|0;E=((b|0)<0)<<31>>31;if((p|0)>(E|0)|(p|0)==(E|0)&h>>>0>b>>>0){c[(qi()|0)>>2]=34;g=+(I|0)*1797693134862315708145274.0e284*1797693134862315708145274.0e284;break}b=J+-106|0;E=((b|0)<0)<<31>>31;if((p|0)<(E|0)|(p|0)==(E|0)&h>>>0<b>>>0){c[(qi()|0)>>2]=34;g=+(I|0)*2.2250738585072014e-308*2.2250738585072014e-308;break}if(k){if((k|0)<9){n=H+(l<<2)|0;e=c[n>>2]|0;do{e=e*10|0;k=k+1|0}while((k|0)!=9);c[n>>2]=e}l=l+1|0}if((o|0)<9?(o|0)<=(h|0)&(h|0)<18:0){if((h|0)==9){g=+(I|0)*+((c[H>>2]|0)>>>0);break}if((h|0)<9){g=+(I|0)*+((c[H>>2]|0)>>>0)/+(c[2648+(8-h<<2)>>2]|0);break}b=K+27+($(h,-3)|0)|0;e=c[H>>2]|0;if((b|0)>30|(e>>>b|0)==0){g=+(I|0)*+(e>>>0)*+(c[2648+(h+-10<<2)>>2]|0);break}}e=(h|0)%9|0;if(!e){k=0;e=0}else{u=(h|0)>-1?e:e+9|0;n=c[2648+(8-u<<2)>>2]|0;if(l){o=1e9/(n|0)|0;k=0;e=0;p=0;do{C=H+(p<<2)|0;E=c[C>>2]|0;b=((E>>>0)/(n>>>0)|0)+e|0;c[C>>2]=b;e=$((E>>>0)%(n>>>0)|0,o)|0;b=(p|0)==(k|0)&(b|0)==0;p=p+1|0;h=b?h+-9|0:h;k=b?p&127:k}while((p|0)!=(l|0));if(e){c[H+(l<<2)>>2]=e;l=l+1|0}}else{k=0;l=0}e=0;h=9-u+h|0}i:while(1){v=(h|0)<18;w=(h|0)==18;x=H+(k<<2)|0;do{if(!v){if(!w)break i;if((c[x>>2]|0)>>>0>=9007199){h=18;break i}}n=0;o=l+127|0;while(1){u=o&127;p=H+(u<<2)|0;o=fk(c[p>>2]|0,0,29)|0;o=gk(o|0,D|0,n|0,0)|0;n=D;if(n>>>0>0|(n|0)==0&o>>>0>1e9){b=pk(o|0,n|0,1e9,0)|0;o=qk(o|0,n|0,1e9,0)|0;n=b}else n=0;c[p>>2]=o;b=(u|0)==(k|0);l=(u|0)!=(l+127&127|0)|b?l:(o|0)==0?u:l;if(b)break;else o=u+-1|0}e=e+-29|0}while((n|0)==0);k=k+127&127;if((k|0)==(l|0)){b=l+127&127;l=H+((l+126&127)<<2)|0;c[l>>2]=c[l>>2]|c[H+(b<<2)>>2];l=b}c[H+(k<<2)>>2]=n;h=h+9|0}j:while(1){y=l+1&127;x=H+((l+127&127)<<2)|0;while(1){v=(h|0)==18;w=(h|0)>27?9:1;u=v^1;while(1){o=k&127;p=(o|0)==(l|0);do if(!p){n=c[H+(o<<2)>>2]|0;if(n>>>0<9007199){A=219;break}if(n>>>0>9007199)break;n=k+1&127;if((n|0)==(l|0)){A=219;break}n=c[H+(n<<2)>>2]|0;if(n>>>0<254740991){A=219;break}if(!(n>>>0>254740991|u)){h=o;break j}}else A=219;while(0);if((A|0)==219?(A=0,v):0){A=220;break j}e=e+w|0;if((k|0)==(l|0))k=l;else break}u=(1<<w)+-1|0;v=1e9>>>w;o=k;n=0;p=k;while(1){E=H+(p<<2)|0;b=c[E>>2]|0;k=(b>>>w)+n|0;c[E>>2]=k;n=$(b&u,v)|0;k=(p|0)==(o|0)&(k|0)==0;p=p+1&127;h=k?h+-9|0:h;k=k?p:o;if((p|0)==(l|0))break;else o=k}if(!n)continue;if((y|0)!=(k|0))break;c[x>>2]=c[x>>2]|1}c[H+(l<<2)>>2]=n;l=y}if((A|0)==220)if(p){c[H+(y+-1<<2)>>2]=0;h=l;l=y}else h=o;g=+((c[H+(h<<2)>>2]|0)>>>0);h=k+1&127;if((h|0)==(l|0)){l=k+2&127;c[H+(l+-1<<2)>>2]=0}r=+(I|0);j=r*(g*1.0e9+ +((c[H+(h<<2)>>2]|0)>>>0));v=e+53|0;p=v-J|0;u=(p|0)<(K|0);h=u&1;o=u?((p|0)<0?0:p):K;if((o|0)<53){M=+yi(+Di(1.0,105-o|0),j);m=+Ai(j,+Di(1.0,53-o|0));q=M;g=m;m=M+(j-m)}else{q=0.0;g=0.0;m=j}n=k+2&127;do if((n|0)==(l|0))j=g;else{n=c[H+(n<<2)>>2]|0;do if(n>>>0>=5e8){if(n>>>0>5e8){g=r*.75+g;break}if((k+3&127|0)==(l|0)){g=r*.5+g;break}else{g=r*.75+g;break}}else{if((n|0)==0?(k+3&127|0)==(l|0):0)break;g=r*.25+g}while(0);if((53-o|0)<=1){j=g;break}if(+Ai(g,1.0)!=0.0){j=g;break}j=g+1.0}while(0);g=m+j-q;do if((v&2147483647|0)>(-2-F|0)){if(+O(+g)>=9007199254740992.0){h=u&(o|0)==(p|0)?0:h;e=e+1|0;g=g*.5}if((e+50|0)<=(G|0)?!(j!=0.0&(h|0)!=0):0)break;c[(qi()|0)>>2]=34}while(0);g=+Ei(g,e)}while(0);break a}default:{if(c[C>>2]|0)c[E>>2]=(c[E>>2]|0)+-1;c[(qi()|0)>>2]=22;ui(b,0);g=0.0;break a}}}}while(0);if((A|0)==23){h=(c[C>>2]|0)==0;if(!h)c[E>>2]=(c[E>>2]|0)+-1;if((f|0)!=0&e>>>0>3)do{if(!h)c[E>>2]=(c[E>>2]|0)+-1;e=e+-1|0}while(e>>>0>3)}g=+(I|0)*t}while(0);i=L;return +g}function ti(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;a:do if(e>>>0>36){c[(qi()|0)>>2]=22;h=0;g=0}else{r=b+4|0;q=b+100|0;do{i=c[r>>2]|0;if(i>>>0<(c[q>>2]|0)>>>0){c[r>>2]=i+1;i=d[i>>0]|0}else i=vi(b)|0}while((pi(i)|0)!=0);b:do switch(i|0){case 43:case 45:{j=((i|0)==45)<<31>>31;i=c[r>>2]|0;if(i>>>0<(c[q>>2]|0)>>>0){c[r>>2]=i+1;i=d[i>>0]|0;p=j;break b}else{i=vi(b)|0;p=j;break b}}default:p=0}while(0);j=(e|0)==0;do if((e&-17|0)==0&(i|0)==48){i=c[r>>2]|0;if(i>>>0<(c[q>>2]|0)>>>0){c[r>>2]=i+1;i=d[i>>0]|0}else i=vi(b)|0;if((i|32|0)!=120)if(j){e=8;n=46;break}else{n=32;break}e=c[r>>2]|0;if(e>>>0<(c[q>>2]|0)>>>0){c[r>>2]=e+1;i=d[e>>0]|0}else i=vi(b)|0;if((d[14643+(i+1)>>0]|0)>15){g=(c[q>>2]|0)==0;if(!g)c[r>>2]=(c[r>>2]|0)+-1;if(!f){ui(b,0);h=0;g=0;break a}if(g){h=0;g=0;break a}c[r>>2]=(c[r>>2]|0)+-1;h=0;g=0;break a}else{e=16;n=46}}else{e=j?10:e;if((d[14643+(i+1)>>0]|0)>>>0<e>>>0)n=32;else{if(c[q>>2]|0)c[r>>2]=(c[r>>2]|0)+-1;ui(b,0);c[(qi()|0)>>2]=22;h=0;g=0;break a}}while(0);if((n|0)==32)if((e|0)==10){e=i+-48|0;if(e>>>0<10){i=0;while(1){j=(i*10|0)+e|0;e=c[r>>2]|0;if(e>>>0<(c[q>>2]|0)>>>0){c[r>>2]=e+1;i=d[e>>0]|0}else i=vi(b)|0;e=i+-48|0;if(!(e>>>0<10&j>>>0<429496729)){e=j;break}else i=j}j=0}else{e=0;j=0}f=i+-48|0;if(f>>>0<10){while(1){k=ok(e|0,j|0,10,0)|0;l=D;m=((f|0)<0)<<31>>31;o=~m;if(l>>>0>o>>>0|(l|0)==(o|0)&k>>>0>~f>>>0){k=e;break}e=gk(k|0,l|0,f|0,m|0)|0;j=D;i=c[r>>2]|0;if(i>>>0<(c[q>>2]|0)>>>0){c[r>>2]=i+1;i=d[i>>0]|0}else i=vi(b)|0;f=i+-48|0;if(!(f>>>0<10&(j>>>0<429496729|(j|0)==429496729&e>>>0<2576980378))){k=e;break}}if(f>>>0>9){i=k;e=p}else{e=10;n=72}}else{i=e;e=p}}else n=46;c:do if((n|0)==46){if(!(e+-1&e)){n=a[14900+((e*23|0)>>>5&7)>>0]|0;j=a[14643+(i+1)>>0]|0;f=j&255;if(f>>>0<e>>>0){i=0;while(1){k=f|i<<n;i=c[r>>2]|0;if(i>>>0<(c[q>>2]|0)>>>0){c[r>>2]=i+1;i=d[i>>0]|0}else i=vi(b)|0;j=a[14643+(i+1)>>0]|0;f=j&255;if(!(k>>>0<134217728&f>>>0<e>>>0))break;else i=k}f=0}else{f=0;k=0}l=hk(-1,-1,n|0)|0;m=D;if((j&255)>>>0>=e>>>0|(f>>>0>m>>>0|(f|0)==(m|0)&k>>>0>l>>>0)){j=f;n=72;break}else i=f;while(1){k=fk(k|0,i|0,n|0)|0;f=D;k=j&255|k;i=c[r>>2]|0;if(i>>>0<(c[q>>2]|0)>>>0){c[r>>2]=i+1;i=d[i>>0]|0}else i=vi(b)|0;j=a[14643+(i+1)>>0]|0;if((j&255)>>>0>=e>>>0|(f>>>0>m>>>0|(f|0)==(m|0)&k>>>0>l>>>0)){j=f;n=72;break c}else i=f}}j=a[14643+(i+1)>>0]|0;f=j&255;if(f>>>0<e>>>0){i=0;while(1){k=f+($(i,e)|0)|0;i=c[r>>2]|0;if(i>>>0<(c[q>>2]|0)>>>0){c[r>>2]=i+1;i=d[i>>0]|0}else i=vi(b)|0;j=a[14643+(i+1)>>0]|0;f=j&255;if(!(k>>>0<119304647&f>>>0<e>>>0))break;else i=k}f=0}else{k=0;f=0}if((j&255)>>>0<e>>>0){n=pk(-1,-1,e|0,0)|0;o=D;m=f;while(1){if(m>>>0>o>>>0|(m|0)==(o|0)&k>>>0>n>>>0){j=m;n=72;break c}f=ok(k|0,m|0,e|0,0)|0;l=D;j=j&255;if(l>>>0>4294967295|(l|0)==-1&f>>>0>~j>>>0){j=m;n=72;break c}k=gk(j|0,0,f|0,l|0)|0;f=D;i=c[r>>2]|0;if(i>>>0<(c[q>>2]|0)>>>0){c[r>>2]=i+1;i=d[i>>0]|0}else i=vi(b)|0;j=a[14643+(i+1)>>0]|0;if((j&255)>>>0>=e>>>0){j=f;n=72;break}else m=f}}else{j=f;n=72}}while(0);if((n|0)==72)if((d[14643+(i+1)>>0]|0)>>>0<e>>>0){do{i=c[r>>2]|0;if(i>>>0<(c[q>>2]|0)>>>0){c[r>>2]=i+1;i=d[i>>0]|0}else i=vi(b)|0}while((d[14643+(i+1)>>0]|0)>>>0<e>>>0);c[(qi()|0)>>2]=34;j=h;i=g;e=(g&1|0)==0&0==0?p:0}else{i=k;e=p}if(c[q>>2]|0)c[r>>2]=(c[r>>2]|0)+-1;if(!(j>>>0<h>>>0|(j|0)==(h|0)&i>>>0<g>>>0)){if(!((g&1|0)!=0|0!=0|(e|0)!=0)){c[(qi()|0)>>2]=34;g=gk(g|0,h|0,-1,-1)|0;h=D;break}if(j>>>0>h>>>0|(j|0)==(h|0)&i>>>0>g>>>0){c[(qi()|0)>>2]=34;break}}g=((e|0)<0)<<31>>31;g=dk(i^e|0,j^g|0,e|0,g|0)|0;h=D}while(0);D=h;return g|0}function ui(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;c[a+104>>2]=b;d=c[a+4>>2]|0;e=c[a+8>>2]|0;f=e-d|0;c[a+108>>2]=f;if((b|0)!=0&(f|0)>(b|0))c[a+100>>2]=d+b;else c[a+100>>2]=e;return}function vi(b){b=b|0;var e=0,f=0,g=0,h=0,i=0,j=0;f=b+104|0;i=c[f>>2]|0;if((i|0)!=0?(c[b+108>>2]|0)>=(i|0):0)j=4;else{e=Vi(b)|0;if((e|0)>=0){h=c[f>>2]|0;f=b+8|0;if(h){g=c[f>>2]|0;i=c[b+4>>2]|0;f=g;h=h-(c[b+108>>2]|0)+-1|0;if((f-i|0)>(h|0))c[b+100>>2]=i+h;else j=9}else{g=c[f>>2]|0;f=g;j=9}if((j|0)==9)c[b+100>>2]=f;f=c[b+4>>2]|0;if(g){b=b+108|0;c[b>>2]=g+1-f+(c[b>>2]|0)}f=f+-1|0;if((d[f>>0]|0|0)!=(e|0))a[f>>0]=e}else j=4}if((j|0)==4){c[b+100>>2]=0;e=-1}return e|0}function wi(a){a=a|0;if(a>>>0>4294963200){c[(qi()|0)>>2]=0-a;a=-1}return a|0}function xi(a,b){a=+a;b=+b;var d=0,e=0;h[k>>3]=a;e=c[k>>2]|0;d=c[k+4>>2]|0;h[k>>3]=b;d=c[k+4>>2]&-2147483648|d&2147483647;c[k>>2]=e;c[k+4>>2]=d;return +(+h[k>>3])}function yi(a,b){a=+a;b=+b;return +(+xi(a,b))}function zi(a,b){a=+a;b=+b;var d=0,e=0,f=0,g=0,i=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0;h[k>>3]=a;d=c[k>>2]|0;m=c[k+4>>2]|0;h[k>>3]=b;n=c[k>>2]|0;o=c[k+4>>2]|0;e=hk(d|0,m|0,52)|0;e=e&2047;j=hk(n|0,o|0,52)|0;j=j&2047;p=m&-2147483648;i=fk(n|0,o|0,1)|0;l=D;a:do if(!((i|0)==0&(l|0)==0)?(g=o&2147483647,!(g>>>0>2146435072|(g|0)==2146435072&n>>>0>0|(e|0)==2047)):0){f=fk(d|0,m|0,1)|0;g=D;if(!(g>>>0>l>>>0|(g|0)==(l|0)&f>>>0>i>>>0))return +((f|0)==(i|0)&(g|0)==(l|0)?a*0.0:a);if(!e){e=fk(d|0,m|0,12)|0;f=D;if((f|0)>-1|(f|0)==-1&e>>>0>4294967295){g=e;e=0;do{e=e+-1|0;g=fk(g|0,f|0,1)|0;f=D}while((f|0)>-1|(f|0)==-1&g>>>0>4294967295)}else e=0;d=fk(d|0,m|0,1-e|0)|0;f=D}else f=m&1048575|1048576;if(!j){g=fk(n|0,o|0,12)|0;i=D;if((i|0)>-1|(i|0)==-1&g>>>0>4294967295){j=0;do{j=j+-1|0;g=fk(g|0,i|0,1)|0;i=D}while((i|0)>-1|(i|0)==-1&g>>>0>4294967295)}else j=0;n=fk(n|0,o|0,1-j|0)|0;m=D}else m=o&1048575|1048576;l=dk(d|0,f|0,n|0,m|0)|0;i=D;g=(i|0)>-1|(i|0)==-1&l>>>0>4294967295;b:do if((e|0)>(j|0)){while(1){if(g)if((d|0)==(n|0)&(f|0)==(m|0))break;else{d=l;f=i}d=fk(d|0,f|0,1)|0;f=D;e=e+-1|0;l=dk(d|0,f|0,n|0,m|0)|0;i=D;g=(i|0)>-1|(i|0)==-1&l>>>0>4294967295;if((e|0)<=(j|0))break b}b=a*0.0;break a}while(0);if(g)if((d|0)==(n|0)&(f|0)==(m|0)){b=a*0.0;break}else{f=i;d=l}if(f>>>0<1048576|(f|0)==1048576&d>>>0<0)do{d=fk(d|0,f|0,1)|0;f=D;e=e+-1|0}while(f>>>0<1048576|(f|0)==1048576&d>>>0<0);if((e|0)>0){o=gk(d|0,f|0,0,-1048576)|0;d=D;e=fk(e|0,0,52)|0;d=d|D;e=o|e}else{e=hk(d|0,f|0,1-e|0)|0;d=D}c[k>>2]=e;c[k+4>>2]=d|p;b=+h[k>>3]}else q=3;while(0);if((q|0)==3){b=a*b;b=b/b}return +b}function Ai(a,b){a=+a;b=+b;return +(+zi(a,b))}function Bi(a,b){a=+a;b=b|0;var d=0,e=0,f=0;h[k>>3]=a;d=c[k>>2]|0;e=c[k+4>>2]|0;f=hk(d|0,e|0,52)|0;f=f&2047;switch(f|0){case 0:{if(a!=0.0){a=+Bi(a*18446744073709551616.0,b);d=(c[b>>2]|0)+-64|0}else d=0;c[b>>2]=d;break}case 2047:break;default:{c[b>>2]=f+-1022;c[k>>2]=d;c[k+4>>2]=e&-2146435073|1071644672;a=+h[k>>3]}}return +a}function Ci(a,b){a=+a;b=b|0;return +(+Bi(a,b))}function Di(a,b){a=+a;b=b|0;var d=0;if((b|0)>1023){a=a*8988465674311579538646525.0e283;d=b+-1023|0;if((d|0)>1023){d=b+-2046|0;d=(d|0)>1023?1023:d;a=a*8988465674311579538646525.0e283}}else if((b|0)<-1022){a=a*2.2250738585072014e-308;d=b+1022|0;if((d|0)<-1022){d=b+2044|0;d=(d|0)<-1022?-1022:d;a=a*2.2250738585072014e-308}}else d=b;d=fk(d+1023|0,0,52)|0;b=D;c[k>>2]=d;c[k+4>>2]=b;return +(a*+h[k>>3])}function Ei(a,b){a=+a;b=b|0;return +(+Di(a,b))}function Fi(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0;l=i;i=i+16|0;g=l;j=(f|0)==0?2680:f;f=c[j>>2]|0;a:do if(!d)if(!f)f=0;else k=15;else{h=(b|0)==0?g:b;if(!e)f=-2;else{if(!f){f=a[d>>0]|0;g=f&255;if(f<<24>>24>-1){c[h>>2]=g;f=f<<24>>24!=0&1;break}f=g+-194|0;if(f>>>0>50){k=15;break}f=c[2432+(f<<2)>>2]|0;g=e+-1|0;if(g){d=d+1|0;k=9}}else{g=e;k=9}b:do if((k|0)==9){b=a[d>>0]|0;m=(b&255)>>>3;if((m+-16|m+(f>>26))>>>0>7){k=15;break a}while(1){d=d+1|0;f=(b&255)+-128|f<<6;g=g+-1|0;if((f|0)>=0)break;if(!g)break b;b=a[d>>0]|0;if((b&-64)<<24>>24!=-128){k=15;break a}}c[j>>2]=0;c[h>>2]=f;f=e-g|0;break a}while(0);c[j>>2]=f;f=-2}}while(0);if((k|0)==15){c[j>>2]=0;c[(qi()|0)>>2]=84;f=-1}i=l;return f|0}function Gi(a){a=a|0;if(!a)a=1;else a=(c[a>>2]|0)==0;return a&1|0}function Hi(b,d,e){b=b|0;d=d|0;e=e|0;do if(b){if(d>>>0<128){a[b>>0]=d;b=1;break}if(d>>>0<2048){a[b>>0]=d>>>6|192;a[b+1>>0]=d&63|128;b=2;break}if(d>>>0<55296|(d&-8192|0)==57344){a[b>>0]=d>>>12|224;a[b+1>>0]=d>>>6&63|128;a[b+2>>0]=d&63|128;b=3;break}if((d+-65536|0)>>>0<1048576){a[b>>0]=d>>>18|240;a[b+1>>0]=d>>>12&63|128;a[b+2>>0]=d>>>6&63|128;a[b+3>>0]=d&63|128;b=4;break}else{c[(qi()|0)>>2]=84;b=-1;break}}else b=1;while(0);return b|0}function Ii(a,b){a=a|0;b=b|0;if(!a)a=0;else a=Hi(a,b,0)|0;return a|0}function Ji(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;o=i;i=i+112|0;n=o+40|0;l=o+24|0;k=o+16|0;g=o;m=o+52|0;f=a[d>>0]|0;if(sj(14909,f<<24>>24,4)|0){e=Uj(1144)|0;if(!e)e=0;else{h=e;j=h+112|0;do{c[h>>2]=0;h=h+4|0}while((h|0)<(j|0));if(!(wj(d,43)|0))c[e>>2]=f<<24>>24==114?8:4;if(wj(d,101)|0){c[g>>2]=b;c[g+4>>2]=2;c[g+8>>2]=1;va(221,g|0)|0;f=a[d>>0]|0}if(f<<24>>24==97){c[k>>2]=b;c[k+4>>2]=3;f=va(221,k|0)|0;if(!(f&1024)){c[l>>2]=b;c[l+4>>2]=4;c[l+8>>2]=f|1024;va(221,l|0)|0}d=c[e>>2]|128;c[e>>2]=d}else d=c[e>>2]|0;c[e+60>>2]=b;c[e+44>>2]=e+120;c[e+48>>2]=1024;f=e+75|0;a[f>>0]=-1;if((d&8|0)==0?(c[n>>2]=b,c[n+4>>2]=21505,c[n+8>>2]=m,(mb(54,n|0)|0)==0):0)a[f>>0]=10;c[e+32>>2]=14;c[e+36>>2]=4;c[e+40>>2]=5;c[e+12>>2]=2;if(!(c[598]|0))c[e+76>>2]=-1;yb(2416);f=c[603]|0;c[e+56>>2]=f;if(f)c[f+52>>2]=e;c[603]=e;nb(2416)}}else{c[(qi()|0)>>2]=22;e=0}i=o;return e|0}function Ki(b){b=b|0;var c=0,d=0,e=0;d=(wj(b,43)|0)==0;c=a[b>>0]|0;d=d?c<<24>>24!=114&1:2;e=(wj(b,120)|0)==0;d=e?d:d|128;b=(wj(b,101)|0)==0;b=b?d:d|524288;b=c<<24>>24==114?b:b|64;b=c<<24>>24==119?b|512:b;return (c<<24>>24==97?b|1024:b)|0}function Li(a){a=a|0;return 0}function Mi(a){a=a|0;return}function Ni(a){a=a|0;var b=0,d=0;b=i;i=i+16|0;d=b;c[d>>2]=c[a+60>>2];a=wi(zb(6,d|0)|0)|0;i=b;return a|0}function Oi(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;m=i;i=i+48|0;h=m+16|0;g=m;f=m+32|0;c[f>>2]=d;j=f+4|0;l=b+48|0;n=c[l>>2]|0;c[j>>2]=e-((n|0)!=0&1);k=b+44|0;c[f+8>>2]=c[k>>2];c[f+12>>2]=n;if(!(c[597]|0)){c[h>>2]=c[b+60>>2];c[h+4>>2]=f;c[h+8>>2]=2;f=wi(Nb(145,h|0)|0)|0}else{Fa(13,b|0);c[g>>2]=c[b+60>>2];c[g+4>>2]=f;c[g+8>>2]=2;f=wi(Nb(145,g|0)|0)|0;pb(0)}if((f|0)>=1){j=c[j>>2]|0;if(f>>>0>j>>>0){h=c[k>>2]|0;g=b+4|0;c[g>>2]=h;c[b+8>>2]=h+(f-j);if(!(c[l>>2]|0))f=e;else{c[g>>2]=h+1;a[d+(e+-1)>>0]=a[h>>0]|0;f=e}}}else{c[b>>2]=c[b>>2]|f&48^16;c[b+8>>2]=0;c[b+4>>2]=0}i=m;return f|0}function Pi(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;f=i;i=i+32|0;g=f;e=f+20|0;c[g>>2]=c[a+60>>2];c[g+4>>2]=0;c[g+8>>2]=b;c[g+12>>2]=e;c[g+16>>2]=d;if((wi(Ib(140,g|0)|0)|0)<0){c[e>>2]=-1;a=-1}else a=c[e>>2]|0;i=f;return a|0}function Qi(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;q=i;i=i+48|0;n=q+16|0;m=q;e=q+32|0;o=a+28|0;f=c[o>>2]|0;c[e>>2]=f;p=a+20|0;f=(c[p>>2]|0)-f|0;c[e+4>>2]=f;c[e+8>>2]=b;c[e+12>>2]=d;k=a+60|0;l=a+44|0;b=2;f=f+d|0;while(1){if(!(c[597]|0)){c[n>>2]=c[k>>2];c[n+4>>2]=e;c[n+8>>2]=b;h=wi(Ob(146,n|0)|0)|0}else{Fa(14,a|0);c[m>>2]=c[k>>2];c[m+4>>2]=e;c[m+8>>2]=b;h=wi(Ob(146,m|0)|0)|0;pb(0)}if((f|0)==(h|0)){f=6;break}if((h|0)<0){f=8;break}f=f-h|0;g=c[e+4>>2]|0;if(h>>>0<=g>>>0)if((b|0)==2){c[o>>2]=(c[o>>2]|0)+h;j=g;b=2}else j=g;else{j=c[l>>2]|0;c[o>>2]=j;c[p>>2]=j;j=c[e+12>>2]|0;h=h-g|0;e=e+8|0;b=b+-1|0}c[e>>2]=(c[e>>2]|0)+h;c[e+4>>2]=j-h}if((f|0)==6){n=c[l>>2]|0;c[a+16>>2]=n+(c[a+48>>2]|0);a=n;c[o>>2]=a;c[p>>2]=a}else if((f|0)==8){c[a+16>>2]=0;c[o>>2]=0;c[p>>2]=0;c[a>>2]=c[a>>2]|32;if((b|0)==2)d=0;else d=d-(c[e+4>>2]|0)|0}i=q;return d|0}function Ri(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0;g=i;i=i+80|0;f=g;c[b+36>>2]=4;if((c[b>>2]&64|0)==0?(c[f>>2]=c[b+60>>2],c[f+4>>2]=21505,c[f+8>>2]=g+12,(mb(54,f|0)|0)!=0):0)a[b+75>>0]=-1;f=Qi(b,d,e)|0;i=g;return f|0}function Si(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=a+84|0;g=c[e>>2]|0;h=d+256|0;f=sj(g,0,h)|0;f=(f|0)==0?h:f-g|0;d=f>>>0<d>>>0?f:d;ik(b|0,g|0,d|0)|0;c[a+4>>2]=g+d;b=g+f|0;c[a+8>>2]=b;c[e>>2]=b;return d|0}function Ti(b){b=b|0;var d=0,e=0;d=b+74|0;e=a[d>>0]|0;a[d>>0]=e+255|e;d=b+20|0;e=b+44|0;if((c[d>>2]|0)>>>0>(c[e>>2]|0)>>>0)Qb[c[b+36>>2]&15](b,0,0)|0;c[b+16>>2]=0;c[b+28>>2]=0;c[d>>2]=0;d=c[b>>2]|0;if(d&20)if(!(d&4))d=-1;else{c[b>>2]=d|32;d=-1}else{d=c[e>>2]|0;c[b+8>>2]=d;c[b+4>>2]=d;d=0}return d|0}function Ui(b){b=b|0;var d=0,e=0;d=b+74|0;e=a[d>>0]|0;a[d>>0]=e+255|e;d=c[b>>2]|0;if(!(d&8)){c[b+8>>2]=0;c[b+4>>2]=0;d=c[b+44>>2]|0;c[b+28>>2]=d;c[b+20>>2]=d;c[b+16>>2]=d+(c[b+48>>2]|0);d=0}else{c[b>>2]=d|32;d=-1}return d|0}function Vi(a){a=a|0;var b=0,e=0;e=i;i=i+16|0;b=e;if((c[a+8>>2]|0)==0?(Ti(a)|0)!=0:0)b=-1;else if((Qb[c[a+32>>2]&15](a,b,1)|0)==1)b=d[b>>0]|0;else b=-1;i=e;return b|0}function Wi(a){a=a|0;var b=0,d=0,e=0;e=(c[a>>2]&1|0)!=0;if(!e){yb(2416);d=c[a+52>>2]|0;b=a+56|0;if(d)c[d+56>>2]=c[b>>2];b=c[b>>2]|0;if(b)c[b+52>>2]=d;if((c[603]|0)==(a|0))c[603]=b;nb(2416)}b=Yi(a)|0;b=Yb[c[a+12>>2]&31](a)|0|b;d=c[a+92>>2]|0;if(d)Vj(d);if(!e)Vj(a);return b|0}function Xi(a){a=a|0;var b=0;if((c[a+76>>2]|0)>-1){b=(Li(a)|0)==0;a=(c[a>>2]|0)>>>5&1}else a=(c[a>>2]|0)>>>5&1;return a|0}function Yi(a){a=a|0;var b=0,d=0;do if(a){if((c[a+76>>2]|0)<=-1){b=Kj(a)|0;break}d=(Li(a)|0)==0;b=Kj(a)|0;if(!d)Mi(a)}else{if(!(c[660]|0))b=0;else b=Yi(c[660]|0)|0;yb(2416);a=c[603]|0;if(a)do{if((c[a+76>>2]|0)>-1)d=Li(a)|0;else d=0;if((c[a+20>>2]|0)>>>0>(c[a+28>>2]|0)>>>0)b=Kj(a)|0|b;if(d)Mi(a);a=c[a+56>>2]|0}while((a|0)!=0);nb(2416)}while(0);return b|0}function Zi(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;if((c[f+76>>2]|0)>-1)o=Li(f)|0;else o=0;g=e+-1|0;if((e|0)<2){p=f+74|0;n=a[p>>0]|0;a[p>>0]=n+255|n;if(o)Mi(f);if(!g)a[b>>0]=0;else b=0}else{a:do if(g){m=f+4|0;n=f+8|0;h=b;while(1){i=c[m>>2]|0;q=i;k=(c[n>>2]|0)-q|0;j=sj(i,10,k)|0;r=(j|0)==0;j=r?k:1-q+j|0;q=j>>>0<g>>>0;j=q?j:g;ik(h|0,i|0,j|0)|0;i=c[m>>2]|0;k=i+j|0;c[m>>2]=k;e=h+j|0;l=g-j|0;if(!(r&q)){p=18;break a}if(k>>>0<(c[n>>2]|0)>>>0){j=j+1|0;c[m>>2]=i+j;i=d[k>>0]|0}else{g=Vi(f)|0;if((g|0)<0)break;j=j+1|0;i=g}g=l+-1|0;h=h+j|0;a[e>>0]=i;if(!((g|0)!=0&(i&255|0)!=10)){e=h;p=18;break a}}if((e|0)!=(b|0)?(c[f>>2]&16|0)!=0:0)p=18;else b=0}else{e=b;p=18}while(0);if((p|0)==18)if(!b)b=0;else a[e>>0]=0;if(o)Mi(f)}return b|0}function _i(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;g=i;i=i+32|0;f=g+16|0;e=g;if(sj(14909,a[d>>0]|0,4)|0){h=Ki(d)|0|32768;c[e>>2]=b;c[e+4>>2]=h;c[e+8>>2]=438;e=wi(Ab(5,e|0)|0)|0;if((e|0)>=0){b=Ji(e,d)|0;if(!b){c[f>>2]=e;zb(6,f|0)|0;b=0}}else b=0}else{c[(qi()|0)>>2]=22;b=0}i=g;return b|0}function $i(a,b){a=a|0;b=b|0;return (ij(a,Bj(a)|0,1,b)|0)+-1|0}function aj(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0;j=$(e,d)|0;if((c[f+76>>2]|0)>-1)k=Li(f)|0;else k=0;g=f+74|0;h=a[g>>0]|0;a[g>>0]=h+255|h;g=f+4|0;h=c[g>>2]|0;i=(c[f+8>>2]|0)-h|0;if((i|0)>0){i=i>>>0<j>>>0?i:j;ik(b|0,h|0,i|0)|0;c[g>>2]=h+i;b=b+i|0;g=j-i|0}else g=j;a:do if(!g)l=13;else{i=f+32|0;h=g;while(1){if(Ti(f)|0){e=h;break}g=Qb[c[i>>2]&15](f,b,h)|0;if((g+1|0)>>>0<2){e=h;break}if((h|0)==(g|0)){l=13;break a}else{b=b+g|0;h=h-g|0}}if(k)Mi(f);e=((j-e|0)>>>0)/(d>>>0)|0}while(0);if((l|0)==13)if(k)Mi(f);return e|0}function bj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;if((d|0)==1)b=b-(c[a+8>>2]|0)+(c[a+4>>2]|0)|0;f=a+20|0;e=a+28|0;if((c[f>>2]|0)>>>0>(c[e>>2]|0)>>>0?(Qb[c[a+36>>2]&15](a,0,0)|0,(c[f>>2]|0)==0):0)b=-1;else{c[a+16>>2]=0;c[e>>2]=0;c[f>>2]=0;if((Qb[c[a+40>>2]&15](a,b,d)|0)<0)b=-1;else{c[a+8>>2]=0;c[a+4>>2]=0;c[a>>2]=c[a>>2]&-17;b=0}}return b|0}function cj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;if((c[a+76>>2]|0)>-1){e=(Li(a)|0)==0;b=bj(a,b,d)|0;if(!e)Mi(a)}else b=bj(a,b,d)|0;return b|0}function dj(a,b,c){a=a|0;b=b|0;c=c|0;return cj(a,b,c)|0}function ej(a){a=a|0;var b=0;if(!(c[a>>2]&128))b=1;else b=(c[a+20>>2]|0)>>>0>(c[a+28>>2]|0)>>>0?2:1;b=Qb[c[a+40>>2]&15](a,0,b)|0;if((b|0)>=0)b=b-(c[a+8>>2]|0)+(c[a+4>>2]|0)+(c[a+20>>2]|0)-(c[a+28>>2]|0)|0;return b|0}function fj(a){a=a|0;var b=0;if((c[a+76>>2]|0)>-1){b=(Li(a)|0)==0;a=ej(a)|0}else a=ej(a)|0;return a|0}function gj(a){a=a|0;return fj(a)|0}function hj(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=e+16|0;g=c[f>>2]|0;if(!g)if(!(Ui(e)|0)){g=c[f>>2]|0;h=4}else f=0;else h=4;a:do if((h|0)==4){i=e+20|0;h=c[i>>2]|0;if((g-h|0)>>>0<d>>>0){f=Qb[c[e+36>>2]&15](e,b,d)|0;break}b:do if((a[e+75>>0]|0)>-1){f=d;while(1){if(!f){g=h;f=0;break b}g=f+-1|0;if((a[b+g>>0]|0)==10)break;else f=g}if((Qb[c[e+36>>2]&15](e,b,f)|0)>>>0<f>>>0)break a;d=d-f|0;b=b+f|0;g=c[i>>2]|0}else{g=h;f=0}while(0);ik(g|0,b|0,d|0)|0;c[i>>2]=(c[i>>2]|0)+d;f=f+d|0}while(0);return f|0}function ij(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=$(d,b)|0;if((c[e+76>>2]|0)>-1){g=(Li(e)|0)==0;a=hj(a,f,e)|0;if(!g)Mi(e)}else a=hj(a,f,e)|0;if((a|0)!=(f|0))d=(a>>>0)/(b>>>0)|0;return d|0}function jj(a){a=a|0;var b=0;if((c[a+76>>2]|0)>-1){b=(Li(a)|0)==0;bj(a,0,0)|0;c[a>>2]=c[a>>2]&-33;if(!b)Mi(a)}else{bj(a,0,0)|0;c[a>>2]=c[a>>2]&-33}return}function kj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;i=i+16|0;f=e;c[f>>2]=d;d=pj(a,b,f)|0;i=e;return d|0}function lj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;j=i;i=i+16|0;e=j;f=Uj(240)|0;do if(f){c[e>>2]=c[d>>2];e=oj(f,240,b,e)|0;if(e>>>0<240){b=Xj(f,e+1|0)|0;c[a>>2]=(b|0)!=0?b:f;break}Vj(f);if((e|0)>=0?(h=e+1|0,g=Uj(h)|0,c[a>>2]=g,(g|0)!=0):0)e=oj(g,h,b,d)|0;else e=-1}else e=-1;while(0);i=j;return e|0}function mj(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;s=i;i=i+224|0;o=s+80|0;r=s+96|0;q=s;p=s+136|0;f=r;g=f+40|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(g|0));c[o>>2]=c[e>>2];if((Lj(0,d,o,q,r)|0)<0)e=-1;else{if((c[b+76>>2]|0)>-1)m=Li(b)|0;else m=0;e=c[b>>2]|0;n=e&32;if((a[b+74>>0]|0)<1)c[b>>2]=e&-33;e=b+48|0;if(!(c[e>>2]|0)){g=b+44|0;h=c[g>>2]|0;c[g>>2]=p;j=b+28|0;c[j>>2]=p;k=b+20|0;c[k>>2]=p;c[e>>2]=80;l=b+16|0;c[l>>2]=p+80;f=Lj(b,d,o,q,r)|0;if(h){Qb[c[b+36>>2]&15](b,0,0)|0;f=(c[k>>2]|0)==0?-1:f;c[g>>2]=h;c[e>>2]=0;c[l>>2]=0;c[j>>2]=0;c[k>>2]=0}}else f=Lj(b,d,o,q,r)|0;e=c[b>>2]|0;c[b>>2]=e|n;if(m)Mi(b);e=(e&32|0)==0?f:-1}i=s;return e|0}function nj(e,f,j){e=e|0;f=f|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0;P=i;i=i+304|0;H=P+16|0;J=P+8|0;I=P+33|0;K=P;y=P+32|0;if((c[e+76>>2]|0)>-1)O=Li(e)|0;else O=0;k=a[f>>0]|0;a:do if(k<<24>>24){L=e+4|0;M=e+100|0;G=e+108|0;z=e+8|0;A=I+10|0;B=I+33|0;C=J+4|0;E=I+46|0;F=I+94|0;m=k;k=0;n=f;s=0;l=0;f=0;b:while(1){c:do if(!(pi(m&255)|0)){m=(a[n>>0]|0)==37;d:do if(m){q=n+1|0;o=a[q>>0]|0;e:do switch(o<<24>>24){case 37:break d;case 42:{x=0;o=n+2|0;break}default:{o=(o&255)+-48|0;if(o>>>0<10?(a[n+2>>0]|0)==36:0){c[H>>2]=c[j>>2];while(1){x=(c[H>>2]|0)+(4-1)&~(4-1);m=c[x>>2]|0;c[H>>2]=x+4;if(o>>>0>1)o=o+-1|0;else break}x=m;o=n+3|0;break e}o=(c[j>>2]|0)+(4-1)&~(4-1);x=c[o>>2]|0;c[j>>2]=o+4;o=q}}while(0);m=a[o>>0]|0;n=m&255;if((n+-48|0)>>>0<10){m=0;while(1){q=(m*10|0)+-48+n|0;o=o+1|0;m=a[o>>0]|0;n=m&255;if((n+-48|0)>>>0>=10)break;else m=q}}else q=0;if(m<<24>>24==109){o=o+1|0;r=a[o>>0]|0;m=(x|0)!=0&1;l=0;f=0}else{r=m;m=0}n=o+1|0;switch(r&255|0){case 104:{w=(a[n>>0]|0)==104;n=w?o+2|0:n;o=w?-2:-1;break}case 108:{w=(a[n>>0]|0)==108;n=w?o+2|0:n;o=w?3:1;break}case 106:{o=3;break}case 116:case 122:{o=1;break}case 76:{o=2;break}case 110:case 112:case 67:case 83:case 91:case 99:case 115:case 88:case 71:case 70:case 69:case 65:case 103:case 102:case 101:case 97:case 120:case 117:case 111:case 105:case 100:{n=o;o=0;break}default:{N=152;break b}}r=d[n>>0]|0;t=(r&47|0)==3;r=t?r|32:r;t=t?1:o;switch(r|0){case 99:{w=s;v=(q|0)<1?1:q;break}case 91:{w=s;v=q;break}case 110:{if(!x){o=s;break c}switch(t|0){case -2:{a[x>>0]=s;o=s;break c}case -1:{b[x>>1]=s;o=s;break c}case 0:{c[x>>2]=s;o=s;break c}case 1:{c[x>>2]=s;o=s;break c}case 3:{o=x;c[o>>2]=s;c[o+4>>2]=((s|0)<0)<<31>>31;o=s;break c}default:{o=s;break c}}}default:{ui(e,0);do{o=c[L>>2]|0;if(o>>>0<(c[M>>2]|0)>>>0){c[L>>2]=o+1;o=d[o>>0]|0}else o=vi(e)|0}while((pi(o)|0)!=0);o=c[L>>2]|0;if(c[M>>2]|0){o=o+-1|0;c[L>>2]=o}w=(c[G>>2]|0)+s+o-(c[z>>2]|0)|0;v=q}}ui(e,v);o=c[L>>2]|0;q=c[M>>2]|0;if(o>>>0<q>>>0)c[L>>2]=o+1;else{if((vi(e)|0)<0){N=152;break b}q=c[M>>2]|0}if(q)c[L>>2]=(c[L>>2]|0)+-1;f:do switch(r|0){case 91:case 99:case 115:{u=(r|0)==99;g:do if((r&239|0)==99){ek(I|0,-1,257)|0;a[I>>0]=0;if((r|0)==115){a[B>>0]=0;a[A>>0]=0;a[A+1>>0]=0;a[A+2>>0]=0;a[A+3>>0]=0;a[A+4>>0]=0}}else{Q=n+1|0;s=(a[Q>>0]|0)==94;o=s&1;r=s?Q:n;n=s?n+2|0:Q;ek(I|0,s&1|0,257)|0;a[I>>0]=0;switch(a[n>>0]|0){case 45:{s=(o^1)&255;a[E>>0]=s;n=r+2|0;break}case 93:{s=(o^1)&255;a[F>>0]=s;n=r+2|0;break}default:s=(o^1)&255}while(1){o=a[n>>0]|0;h:do switch(o<<24>>24){case 0:{N=152;break b}case 93:break g;case 45:{r=n+1|0;o=a[r>>0]|0;switch(o<<24>>24){case 93:case 0:{o=45;break h}default:{}}n=a[n+-1>>0]|0;if((n&255)<(o&255)){n=n&255;do{n=n+1|0;a[I+n>>0]=s;o=a[r>>0]|0}while((n|0)<(o&255|0));n=r}else n=r;break}default:{}}while(0);a[I+((o&255)+1)>>0]=s;n=n+1|0}}while(0);r=u?v+1|0:31;s=(t|0)==1;t=(m|0)!=0;i:do if(s){if(t){f=Uj(r<<2)|0;if(!f){l=0;N=152;break b}}else f=x;c[J>>2]=0;c[C>>2]=0;l=0;j:while(1){q=(f|0)==0;do{k:while(1){o=c[L>>2]|0;if(o>>>0<(c[M>>2]|0)>>>0){c[L>>2]=o+1;o=d[o>>0]|0}else o=vi(e)|0;if(!(a[I+(o+1)>>0]|0))break j;a[y>>0]=o;switch(Fi(K,y,1,J)|0){case -1:{l=0;N=152;break b}case -2:break;default:break k}}if(!q){c[f+(l<<2)>>2]=c[K>>2];l=l+1|0}}while(!(t&(l|0)==(r|0)));l=r<<1|1;o=Xj(f,l<<2)|0;if(!o){l=0;N=152;break b}Q=r;r=l;f=o;l=Q}if(!(Gi(J)|0)){l=0;N=152;break b}else{q=l;l=0}}else{if(t){l=Uj(r)|0;if(!l){l=0;f=0;N=152;break b}else o=0;while(1){do{f=c[L>>2]|0;if(f>>>0<(c[M>>2]|0)>>>0){c[L>>2]=f+1;f=d[f>>0]|0}else f=vi(e)|0;if(!(a[I+(f+1)>>0]|0)){q=o;f=0;break i}a[l+o>>0]=f;o=o+1|0}while((o|0)!=(r|0));f=r<<1|1;o=Xj(l,f)|0;if(!o){f=0;N=152;break b}else{Q=r;r=f;l=o;o=Q}}}if(!x){l=q;while(1){f=c[L>>2]|0;if(f>>>0<l>>>0){c[L>>2]=f+1;f=d[f>>0]|0}else f=vi(e)|0;if(!(a[I+(f+1)>>0]|0)){q=0;l=0;f=0;break i}l=c[M>>2]|0}}else{l=0;while(1){f=c[L>>2]|0;if(f>>>0<q>>>0){c[L>>2]=f+1;f=d[f>>0]|0}else f=vi(e)|0;if(!(a[I+(f+1)>>0]|0)){q=l;l=x;f=0;break i}a[x+l>>0]=f;q=c[M>>2]|0;l=l+1|0}}}while(0);o=c[L>>2]|0;if(c[M>>2]|0){o=o+-1|0;c[L>>2]=o}o=o-(c[z>>2]|0)+(c[G>>2]|0)|0;if(!o)break b;if(!((o|0)==(v|0)|u^1))break b;do if(t)if(s){c[x>>2]=f;break}else{c[x>>2]=l;break}while(0);if(!u){if(f)c[f+(q<<2)>>2]=0;if(!l){l=0;break f}a[l+q>>0]=0}break}case 120:case 88:case 112:{o=16;N=134;break}case 111:{o=8;N=134;break}case 117:case 100:{o=10;N=134;break}case 105:{o=0;N=134;break}case 71:case 103:case 70:case 102:case 69:case 101:case 65:case 97:{p=+si(e,t,0);if((c[G>>2]|0)==((c[z>>2]|0)-(c[L>>2]|0)|0))break b;if(x)switch(t|0){case 0:{g[x>>2]=p;break f}case 1:{h[x>>3]=p;break f}case 2:{h[x>>3]=p;break f}default:break f}break}default:{}}while(0);l:do if((N|0)==134){N=0;o=ti(e,o,0,-1,-1)|0;if((c[G>>2]|0)==((c[z>>2]|0)-(c[L>>2]|0)|0))break b;if((x|0)!=0&(r|0)==112){c[x>>2]=o;break}if(x)switch(t|0){case -2:{a[x>>0]=o;break l}case -1:{b[x>>1]=o;break l}case 0:{c[x>>2]=o;break l}case 1:{c[x>>2]=o;break l}case 3:{Q=x;c[Q>>2]=o;c[Q+4>>2]=D;break l}default:break l}}while(0);k=((x|0)!=0&1)+k|0;o=(c[G>>2]|0)+w+(c[L>>2]|0)-(c[z>>2]|0)|0;break c}while(0);n=n+(m&1)|0;ui(e,0);m=c[L>>2]|0;if(m>>>0<(c[M>>2]|0)>>>0){c[L>>2]=m+1;m=d[m>>0]|0}else m=vi(e)|0;if((m|0)!=(d[n>>0]|0)){N=21;break b}o=s+1|0}else{while(1){m=n+1|0;if(!(pi(d[m>>0]|0)|0))break;else n=m}ui(e,0);do{m=c[L>>2]|0;if(m>>>0<(c[M>>2]|0)>>>0){c[L>>2]=m+1;m=d[m>>0]|0}else m=vi(e)|0}while((pi(m)|0)!=0);m=c[L>>2]|0;if(c[M>>2]|0){m=m+-1|0;c[L>>2]=m}o=(c[G>>2]|0)+s+m-(c[z>>2]|0)|0}while(0);n=n+1|0;m=a[n>>0]|0;if(!(m<<24>>24))break a;else s=o}if((N|0)==21){if(c[M>>2]|0)c[L>>2]=(c[L>>2]|0)+-1;if((k|0)!=0|(m|0)>-1)break;else{k=0;N=153}}else if((N|0)==152)if(!k){k=m;N=153}if((N|0)==153){m=k;k=-1}if(m){Vj(l);Vj(f)}}else k=0;while(0);if(O)Mi(e);i=P;return k|0}function oj(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0;n=i;i=i+128|0;g=n+112|0;m=n;h=m;j=2684;k=h+112|0;do{c[h>>2]=c[j>>2];h=h+4|0;j=j+4|0}while((h|0)<(k|0));if((d+-1|0)>>>0>2147483646)if(!d){d=1;l=4}else{c[(qi()|0)>>2]=75;d=-1}else{g=b;l=4}if((l|0)==4){l=-2-g|0;l=d>>>0>l>>>0?l:d;c[m+48>>2]=l;b=m+20|0;c[b>>2]=g;c[m+44>>2]=g;d=g+l|0;g=m+16|0;c[g>>2]=d;c[m+28>>2]=d;d=mj(m,e,f)|0;if(l){e=c[b>>2]|0;a[e+(((e|0)==(c[g>>2]|0))<<31>>31)>>0]=0}}i=n;return d|0}function pj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;g=i;i=i+112|0;e=g;f=e;h=f+112|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(h|0));c[e+32>>2]=15;c[e+44>>2]=a;c[e+76>>2]=-1;c[e+84>>2]=a;h=nj(e,b,d)|0;i=g;return h|0}function qj(b){b=b|0;var c=0,d=0,e=0,f=0;while(1){c=b+1|0;if(!(pi(a[b>>0]|0)|0))break;else b=c}d=a[b>>0]|0;switch(d<<24>>24|0){case 45:{e=1;f=5;break}case 43:{e=0;f=5;break}default:e=0}if((f|0)==5){b=c;d=a[c>>0]|0}c=(d<<24>>24)+-48|0;if(c>>>0<10){d=b;b=0;do{d=d+1|0;b=(b*10|0)-c|0;c=(a[d>>0]|0)+-48|0}while(c>>>0<10)}else b=0;return ((e|0)!=0?b:0-b|0)|0}function rj(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;r=i;i=i+208|0;o=r+8|0;p=r;f=$(d,b)|0;n=p;c[n>>2]=1;c[n+4>>2]=0;if(f){j=f-d|0;c[o+4>>2]=d;c[o>>2]=d;g=d;b=d;h=2;while(1){b=b+d+g|0;c[o+(h<<2)>>2]=b;if(b>>>0<f>>>0){n=g;g=b;h=h+1|0;b=n}else break}n=0-d|0;k=a+j|0;m=p+4|0;if((j|0)>0){j=k;f=1;h=1;while(1){do if((f&3|0)==3){Nj(a,d,e,h,o);l=c[m>>2]|0;b=l<<30|(c[p>>2]|0)>>>2;c[p>>2]=b;c[m>>2]=l>>>2;h=h+2|0}else{b=h+-1|0;if((c[o+(b<<2)>>2]|0)>>>0<(j-a|0)>>>0)Nj(a,d,e,h,o);else Oj(a,d,e,p,h,0,o);if((h|0)==1){b=c[p>>2]|0;c[m>>2]=b>>>31|c[m>>2]<<1;b=b<<1;c[p>>2]=b;h=0;break}if(b>>>0>31){f=c[p>>2]|0;c[m>>2]=f;c[p>>2]=0;b=h+-33|0;g=0}else{f=c[m>>2]|0;g=c[p>>2]|0}c[m>>2]=g>>>(32-b|0)|f<<b;b=g<<b;c[p>>2]=b;h=1}while(0);f=b|1;c[p>>2]=f;b=a+d|0;if(b>>>0>=k>>>0){f=b;break}else a=b}}else{f=a;h=1}Oj(f,d,e,p,h,0,o);l=p+4|0;b=c[p>>2]|0;if(!((h|0)==1&(b|0)==1&(c[l>>2]|0)==0)){g=f;while(1){if((h|0)<2){f=b+-1|0;do if(f){if(!(f&1)){j=f;f=0;do{f=f+1|0;j=j>>>1}while((j&1|0)==0);if(!f)q=24}else q=24;if((q|0)==24){q=0;k=c[m>>2]|0;if(!k){f=64;q=30;break}if(!(k&1)){j=k;f=0}else{a=0;j=k;f=0;break}while(1){a=f+1|0;j=j>>>1;if(j&1){j=a;break}else f=a}if(!j){a=0;j=k;f=0;break}else f=f+33|0}if(f>>>0>31)q=30;else{a=f;j=c[m>>2]|0}}else{f=32;q=30}while(0);if((q|0)==30){q=0;b=c[m>>2]|0;c[p>>2]=b;c[m>>2]=0;a=f+-32|0;j=0}c[p>>2]=j<<32-a|b>>>a;c[m>>2]=j>>>a;g=g+n|0;f=f+h|0}else{a=b>>>30;k=a|c[m>>2]<<2;f=h+-2|0;c[p>>2]=(b<<1&2147483646|a<<31)^3;c[m>>2]=k>>>1;Oj(g+(0-((c[o+(f<<2)>>2]|0)+d))|0,d,e,p,h+-1|0,1,o);k=c[p>>2]|0;c[m>>2]=k>>>31|c[m>>2]<<1;c[p>>2]=k<<1|1;g=g+n|0;Oj(g,d,e,p,f,1,o)}b=c[p>>2]|0;if((f|0)==1&(b|0)==1&(c[l>>2]|0)==0)break;else h=f}}}i=r;return}function sj(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;h=d&255;f=(e|0)!=0;a:do if(f&(b&3|0)!=0){g=d&255;while(1){if((a[b>>0]|0)==g<<24>>24){i=6;break a}b=b+1|0;e=e+-1|0;f=(e|0)!=0;if(!(f&(b&3|0)!=0)){i=5;break}}}else i=5;while(0);if((i|0)==5)if(f)i=6;else e=0;b:do if((i|0)==6){g=d&255;if((a[b>>0]|0)!=g<<24>>24){f=$(h,16843009)|0;c:do if(e>>>0>3)while(1){h=c[b>>2]^f;if((h&-2139062144^-2139062144)&h+-16843009)break;b=b+4|0;e=e+-4|0;if(e>>>0<=3){i=11;break c}}else i=11;while(0);if((i|0)==11)if(!e){e=0;break}while(1){if((a[b>>0]|0)==g<<24>>24)break b;b=b+1|0;e=e+-1|0;if(!e){e=0;break}}}}while(0);return ((e|0)!=0?b:0)|0}function tj(b,c,d){b=b|0;c=c|0;d=d|0;var e=0;e=c&255;do{if(!d){c=0;break}d=d+-1|0;c=b+d|0}while((a[c>>0]|0)!=e<<24>>24);return c|0}function uj(b,d){b=b|0;d=d|0;var e=0,f=0;e=d;a:do if(!((e^b)&3)){if(e&3)do{e=a[d>>0]|0;a[b>>0]=e;if(!(e<<24>>24))break a;d=d+1|0;b=b+1|0}while((d&3|0)!=0);e=c[d>>2]|0;if(!((e&-2139062144^-2139062144)&e+-16843009)){f=b;while(1){d=d+4|0;b=f+4|0;c[f>>2]=e;e=c[d>>2]|0;if((e&-2139062144^-2139062144)&e+-16843009)break;else f=b}}f=8}else f=8;while(0);if((f|0)==8){f=a[d>>0]|0;a[b>>0]=f;if(f<<24>>24)do{d=d+1|0;b=b+1|0;f=a[d>>0]|0;a[b>>0]=f}while(f<<24>>24!=0)}return b|0}function vj(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;g=d;do if(!((g^b)&3)){f=(e|0)!=0;a:do if(f&(g&3|0)!=0)while(1){g=a[d>>0]|0;a[b>>0]=g;if(!(g<<24>>24))break a;e=e+-1|0;d=d+1|0;b=b+1|0;f=(e|0)!=0;if(!(f&(d&3|0)!=0)){h=5;break}}else h=5;while(0);if((h|0)==5)if(!f){e=0;break}if(a[d>>0]|0){b:do if(e>>>0>3)do{f=c[d>>2]|0;if((f&-2139062144^-2139062144)&f+-16843009)break b;c[b>>2]=f;e=e+-4|0;d=d+4|0;b=b+4|0}while(e>>>0>3);while(0);h=11}}else h=11;while(0);c:do if((h|0)==11)if(!e)e=0;else while(1){h=a[d>>0]|0;a[b>>0]=h;if(!(h<<24>>24))break c;e=e+-1|0;b=b+1|0;if(!e){e=0;break}else d=d+1|0}while(0);ek(b|0,0,e|0)|0;return b|0}function wj(b,c){b=b|0;c=c|0;b=xj(b,c)|0;return ((a[b>>0]|0)==(c&255)<<24>>24?b:0)|0}function xj(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;f=d&255;a:do if(!f)b=b+(Bj(b)|0)|0;else{if(b&3){e=d&255;do{g=a[b>>0]|0;if(g<<24>>24==0?1:g<<24>>24==e<<24>>24)break a;b=b+1|0}while((b&3|0)!=0)}f=$(f,16843009)|0;e=c[b>>2]|0;b:do if(!((e&-2139062144^-2139062144)&e+-16843009))do{g=e^f;if((g&-2139062144^-2139062144)&g+-16843009)break b;b=b+4|0;e=c[b>>2]|0}while(((e&-2139062144^-2139062144)&e+-16843009|0)==0);while(0);e=d&255;while(1){g=a[b>>0]|0;if(g<<24>>24==0?1:g<<24>>24==e<<24>>24)break;else b=b+1|0}}while(0);return b|0}function yj(a,b){a=a|0;b=b|0;uj(a,b)|0;return a|0}function zj(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;g=i;i=i+32|0;f=g;e=a[d>>0]|0;if(e<<24>>24!=0?(a[d+1>>0]|0)!=0:0){c[f>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[f+16>>2]=0;c[f+20>>2]=0;c[f+24>>2]=0;c[f+28>>2]=0;do{h=f+(((e&255)>>>5&255)<<2)|0;c[h>>2]=c[h>>2]|1<<(e&31);d=d+1|0;e=a[d>>0]|0}while(e<<24>>24!=0);d=a[b>>0]|0;a:do if(!(d<<24>>24))e=b;else{e=b;do{if(c[f+(((d&255)>>>5&255)<<2)>>2]&1<<(d&31))break a;e=e+1|0;d=a[e>>0]|0}while(d<<24>>24!=0)}while(0);e=e-b|0}else e=(xj(b,e<<24>>24)|0)-b|0;i=g;return e|0}function Aj(a){a=a|0;var b=0,c=0;c=(Bj(a)|0)+1|0;b=Uj(c)|0;if(!b)b=0;else ik(b|0,a|0,c|0)|0;return b|0}function Bj(b){b=b|0;var d=0,e=0,f=0;f=b;a:do if(!(f&3))e=4;else{d=b;b=f;while(1){if(!(a[d>>0]|0))break a;d=d+1|0;b=d;if(!(b&3)){b=d;e=4;break}}}while(0);if((e|0)==4){while(1){d=c[b>>2]|0;if(!((d&-2139062144^-2139062144)&d+-16843009))b=b+4|0;else break}if((d&255)<<24>>24)do b=b+1|0;while((a[b>>0]|0)!=0)}return b-f|0}function Cj(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;e=b+(Bj(b)|0)|0;a:do if(d)while(1){f=a[c>>0]|0;if(!(f<<24>>24))break a;d=d+-1|0;g=e+1|0;a[e>>0]=f;if(!d){e=g;break}else{c=c+1|0;e=g}}while(0);a[e>>0]=0;return b|0}function Dj(a,b,c){a=a|0;b=b|0;c=c|0;vj(a,b,c)|0;return a|0}function Ej(a,b){a=a|0;b=b|0;return tj(a,b,(Bj(a)|0)+1|0)|0}function Fj(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;h=i;i=i+32|0;g=h;c[g>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;c[g+12>>2]=0;c[g+16>>2]=0;c[g+20>>2]=0;c[g+24>>2]=0;c[g+28>>2]=0;f=a[d>>0]|0;do if(!(f<<24>>24))d=0;else{if(!(a[d+1>>0]|0)){d=b;while(1)if((a[d>>0]|0)==f<<24>>24)d=d+1|0;else break;d=d-b|0;break}else{e=d;d=f}do{f=g+(((d&255)>>>5&255)<<2)|0;c[f>>2]=c[f>>2]|1<<(d&31);e=e+1|0;d=a[e>>0]|0}while(d<<24>>24!=0);e=a[b>>0]|0;a:do if(!(e<<24>>24))d=b;else{d=b;do{if(!(c[g+(((e&255)>>>5&255)<<2)>>2]&1<<(e&31)))break a;d=d+1|0;e=a[d>>0]|0}while(e<<24>>24!=0)}while(0);d=d-b|0}while(0);i=h;return d|0}function Gj(b,d){b=b|0;d=d|0;var e=0,f=0;if(!b){b=c[699]|0;if(!b)b=0;else{f=b;e=3}}else{f=b;e=3}do if((e|0)==3){e=Fj(f,d)|0;b=f+e|0;if(!(a[b>>0]|0)){c[699]=0;b=0;break}e=(zj(b,d)|0)+e|0;d=f+e|0;c[699]=d;if(!(a[d>>0]|0)){c[699]=0;break}else{c[699]=f+(e+1);a[d>>0]=0;break}}while(0);return b|0}function Hj(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,i=0,j=0;i=a+4|0;e=c[i>>2]|0;j=a+100|0;if(e>>>0<(c[j>>2]|0)>>>0){c[i>>2]=e+1;e=d[e>>0]|0}else e=vi(a)|0;switch(e|0){case 43:case 45:{f=(e|0)==45&1;e=c[i>>2]|0;if(e>>>0<(c[j>>2]|0)>>>0){c[i>>2]=e+1;e=d[e>>0]|0}else e=vi(a)|0;if((b|0)!=0&(e+-48|0)>>>0>9?(c[j>>2]|0)!=0:0){c[i>>2]=(c[i>>2]|0)+-1;h=f}else h=f;break}default:h=0}if((e+-48|0)>>>0>9)if(!(c[j>>2]|0)){f=-2147483648;e=0}else{c[i>>2]=(c[i>>2]|0)+-1;f=-2147483648;e=0}else{f=0;do{f=e+-48+(f*10|0)|0;e=c[i>>2]|0;if(e>>>0<(c[j>>2]|0)>>>0){c[i>>2]=e+1;e=d[e>>0]|0}else e=vi(a)|0}while((e+-48|0)>>>0<10&(f|0)<214748364);b=((f|0)<0)<<31>>31;if((e+-48|0)>>>0<10){do{b=ok(f|0,b|0,10,0)|0;f=D;e=gk(e|0,((e|0)<0)<<31>>31|0,-48,-1)|0;f=gk(e|0,D|0,b|0,f|0)|0;b=D;e=c[i>>2]|0;if(e>>>0<(c[j>>2]|0)>>>0){c[i>>2]=e+1;e=d[e>>0]|0}else e=vi(a)|0}while((e+-48|0)>>>0<10&((b|0)<21474836|(b|0)==21474836&f>>>0<2061584302));g=f}else g=f;if((e+-48|0)>>>0<10)do{e=c[i>>2]|0;if(e>>>0<(c[j>>2]|0)>>>0){c[i>>2]=e+1;e=d[e>>0]|0}else e=vi(a)|0}while((e+-48|0)>>>0<10);if(c[j>>2]|0)c[i>>2]=(c[i>>2]|0)+-1;a=(h|0)!=0;e=dk(0,0,g|0,b|0)|0;f=a?D:b;e=a?e:g}D=f;return e|0}function Ij(a){a=a|0;if(!(c[a+68>>2]|0))Mi(a);return}function Jj(a){a=a|0;if(!(c[a+68>>2]|0))Mi(a);return}function Kj(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=a+20|0;g=a+28|0;if((c[b>>2]|0)>>>0>(c[g>>2]|0)>>>0?(Qb[c[a+36>>2]&15](a,0,0)|0,(c[b>>2]|0)==0):0)b=-1;else{h=a+4|0;d=c[h>>2]|0;e=a+8|0;f=c[e>>2]|0;if(d>>>0<f>>>0)Qb[c[a+40>>2]&15](a,d-f|0,1)|0;c[a+16>>2]=0;c[g>>2]=0;c[b>>2]=0;c[e>>2]=0;c[h>>2]=0;b=0}return b|0}function Lj(e,f,g,j,l){e=e|0;f=f|0;g=g|0;j=j|0;l=l|0;var m=0,n=0,o=0,p=0,q=0.0,r=0,s=0,t=0,u=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0;ha=i;i=i+624|0;ca=ha+24|0;ea=ha+16|0;da=ha+588|0;Y=ha+576|0;ba=ha;V=ha+536|0;ga=ha+8|0;fa=ha+528|0;M=(e|0)!=0;N=V+40|0;U=N;V=V+39|0;W=ga+4|0;X=Y+12|0;Y=Y+11|0;Z=da;_=X;aa=_-Z|0;O=-2-Z|0;P=_+2|0;Q=ca+288|0;R=da+9|0;S=R;T=da+8|0;m=0;w=f;n=0;f=0;a:while(1){do if((m|0)>-1)if((n|0)>(2147483647-m|0)){c[(qi()|0)>>2]=75;m=-1;break}else{m=n+m|0;break}while(0);n=a[w>>0]|0;if(!(n<<24>>24)){L=245;break}else o=w;b:while(1){switch(n<<24>>24){case 37:{n=o;L=9;break b}case 0:{n=o;break b}default:{}}K=o+1|0;n=a[K>>0]|0;o=K}c:do if((L|0)==9)while(1){L=0;if((a[n+1>>0]|0)!=37)break c;o=o+1|0;n=n+2|0;if((a[n>>0]|0)==37)L=9;else break}while(0);y=o-w|0;if(M?(c[e>>2]&32|0)==0:0)hj(w,y,e)|0;if((o|0)!=(w|0)){w=n;n=y;continue}r=n+1|0;o=a[r>>0]|0;p=(o<<24>>24)+-48|0;if(p>>>0<10){K=(a[n+2>>0]|0)==36;r=K?n+3|0:r;o=a[r>>0]|0;u=K?p:-1;f=K?1:f}else u=-1;n=o<<24>>24;d:do if((n&-32|0)==32){p=0;while(1){if(!(1<<n+-32&75913)){s=p;n=r;break d}p=1<<(o<<24>>24)+-32|p;r=r+1|0;o=a[r>>0]|0;n=o<<24>>24;if((n&-32|0)!=32){s=p;n=r;break}}}else{s=0;n=r}while(0);do if(o<<24>>24==42){p=n+1|0;o=(a[p>>0]|0)+-48|0;if(o>>>0<10?(a[n+2>>0]|0)==36:0){c[l+(o<<2)>>2]=10;f=1;n=n+3|0;o=c[j+((a[p>>0]|0)+-48<<3)>>2]|0}else{if(f){m=-1;break a}if(!M){x=s;n=p;f=0;K=0;break}f=(c[g>>2]|0)+(4-1)&~(4-1);o=c[f>>2]|0;c[g>>2]=f+4;f=0;n=p}if((o|0)<0){x=s|8192;K=0-o|0}else{x=s;K=o}}else{p=(o<<24>>24)+-48|0;if(p>>>0<10){o=0;do{o=(o*10|0)+p|0;n=n+1|0;p=(a[n>>0]|0)+-48|0}while(p>>>0<10);if((o|0)<0){m=-1;break a}else{x=s;K=o}}else{x=s;K=0}}while(0);e:do if((a[n>>0]|0)==46){p=n+1|0;o=a[p>>0]|0;if(o<<24>>24!=42){r=(o<<24>>24)+-48|0;if(r>>>0<10){n=p;o=0}else{n=p;r=0;break}while(1){o=(o*10|0)+r|0;n=n+1|0;r=(a[n>>0]|0)+-48|0;if(r>>>0>=10){r=o;break e}}}p=n+2|0;o=(a[p>>0]|0)+-48|0;if(o>>>0<10?(a[n+3>>0]|0)==36:0){c[l+(o<<2)>>2]=10;n=n+4|0;r=c[j+((a[p>>0]|0)+-48<<3)>>2]|0;break}if(f){m=-1;break a}if(M){n=(c[g>>2]|0)+(4-1)&~(4-1);r=c[n>>2]|0;c[g>>2]=n+4;n=p}else{n=p;r=0}}else r=-1;while(0);t=0;while(1){o=(a[n>>0]|0)+-65|0;if(o>>>0>57){m=-1;break a}p=n+1|0;o=a[15953+(t*58|0)+o>>0]|0;s=o&255;if((s+-1|0)>>>0<8){n=p;t=s}else{J=p;break}}if(!(o<<24>>24)){m=-1;break}p=(u|0)>-1;do if(o<<24>>24==19)if(p){m=-1;break a}else L=52;else{if(p){c[l+(u<<2)>>2]=s;H=j+(u<<3)|0;I=c[H+4>>2]|0;L=ba;c[L>>2]=c[H>>2];c[L+4>>2]=I;L=52;break}if(!M){m=0;break a}Rj(ba,s,g)}while(0);if((L|0)==52?(L=0,!M):0){w=J;n=y;continue}u=a[n>>0]|0;u=(t|0)!=0&(u&15|0)==3?u&-33:u;p=x&-65537;I=(x&8192|0)==0?x:p;f:do switch(u|0){case 110:switch(t|0){case 0:{c[c[ba>>2]>>2]=m;w=J;n=y;continue a}case 1:{c[c[ba>>2]>>2]=m;w=J;n=y;continue a}case 2:{w=c[ba>>2]|0;c[w>>2]=m;c[w+4>>2]=((m|0)<0)<<31>>31;w=J;n=y;continue a}case 3:{b[c[ba>>2]>>1]=m;w=J;n=y;continue a}case 4:{a[c[ba>>2]>>0]=m;w=J;n=y;continue a}case 6:{c[c[ba>>2]>>2]=m;w=J;n=y;continue a}case 7:{w=c[ba>>2]|0;c[w>>2]=m;c[w+4>>2]=((m|0)<0)<<31>>31;w=J;n=y;continue a}default:{w=J;n=y;continue a}}case 112:{t=I|8;r=r>>>0>8?r:8;u=120;L=64;break}case 88:case 120:{t=I;L=64;break}case 111:{p=ba;o=c[p>>2]|0;p=c[p+4>>2]|0;if((o|0)==0&(p|0)==0)n=N;else{n=N;do{n=n+-1|0;a[n>>0]=o&7|48;o=hk(o|0,p|0,3)|0;p=D}while(!((o|0)==0&(p|0)==0))}if(!(I&8)){o=I;t=0;s=16433;L=77}else{t=U-n+1|0;o=I;r=(r|0)<(t|0)?t:r;t=0;s=16433;L=77}break}case 105:case 100:{o=ba;n=c[o>>2]|0;o=c[o+4>>2]|0;if((o|0)<0){n=dk(0,0,n|0,o|0)|0;o=D;p=ba;c[p>>2]=n;c[p+4>>2]=o;p=1;s=16433;L=76;break f}if(!(I&2048)){s=I&1;p=s;s=(s|0)==0?16433:16435;L=76}else{p=1;s=16434;L=76}break}case 117:{o=ba;n=c[o>>2]|0;o=c[o+4>>2]|0;p=0;s=16433;L=76;break}case 99:{a[V>>0]=c[ba>>2];w=V;o=1;t=0;u=16433;n=N;break}case 109:{n=ri(c[(qi()|0)>>2]|0)|0;L=82;break}case 115:{n=c[ba>>2]|0;n=(n|0)!=0?n:16443;L=82;break}case 67:{c[ga>>2]=c[ba>>2];c[W>>2]=0;c[ba>>2]=ga;r=-1;L=86;break}case 83:{if(!r){Tj(e,32,K,0,I);n=0;L=98}else L=86;break}case 65:case 71:case 70:case 69:case 97:case 103:case 102:case 101:{q=+h[ba>>3];c[ea>>2]=0;h[k>>3]=q;if((c[k+4>>2]|0)>=0)if(!(I&2048)){H=I&1;G=H;H=(H|0)==0?16451:16456}else{G=1;H=16453}else{q=-q;G=1;H=16450}h[k>>3]=q;F=c[k+4>>2]&2146435072;do if(F>>>0<2146435072|(F|0)==2146435072&0<0){v=+Ci(q,ea)*2.0;o=v!=0.0;if(o)c[ea>>2]=(c[ea>>2]|0)+-1;C=u|32;if((C|0)==97){w=u&32;y=(w|0)==0?H:H+9|0;x=G|2;n=12-r|0;do if(!(r>>>0>11|(n|0)==0)){q=8.0;do{n=n+-1|0;q=q*16.0}while((n|0)!=0);if((a[y>>0]|0)==45){q=-(q+(-v-q));break}else{q=v+q-q;break}}else q=v;while(0);o=c[ea>>2]|0;n=(o|0)<0?0-o|0:o;n=Sj(n,((n|0)<0)<<31>>31,X)|0;if((n|0)==(X|0)){a[Y>>0]=48;n=Y}a[n+-1>>0]=(o>>31&2)+43;t=n+-2|0;a[t>>0]=u+15;s=(r|0)<1;p=(I&8|0)==0;o=da;while(1){H=~~q;n=o+1|0;a[o>>0]=d[16417+H>>0]|w;q=(q-+(H|0))*16.0;do if((n-Z|0)==1){if(p&(s&q==0.0))break;a[n>>0]=46;n=o+2|0}while(0);if(!(q!=0.0))break;else o=n}r=(r|0)!=0&(O+n|0)<(r|0)?P+r-t|0:aa-t+n|0;p=r+x|0;Tj(e,32,K,p,I);if(!(c[e>>2]&32))hj(y,x,e)|0;Tj(e,48,K,p,I^65536);n=n-Z|0;if(!(c[e>>2]&32))hj(da,n,e)|0;o=_-t|0;Tj(e,48,r-(n+o)|0,0,0);if(!(c[e>>2]&32))hj(t,o,e)|0;Tj(e,32,K,p,I^8192);n=(p|0)<(K|0)?K:p;break}n=(r|0)<0?6:r;if(o){o=(c[ea>>2]|0)+-28|0;c[ea>>2]=o;q=v*268435456.0}else{q=v;o=c[ea>>2]|0}F=(o|0)<0?ca:Q;E=F;o=F;do{B=~~q>>>0;c[o>>2]=B;o=o+4|0;q=(q-+(B>>>0))*1.0e9}while(q!=0.0);p=o;o=c[ea>>2]|0;if((o|0)>0){s=F;while(1){t=(o|0)>29?29:o;r=p+-4|0;do if(r>>>0<s>>>0)r=s;else{o=0;do{B=fk(c[r>>2]|0,0,t|0)|0;B=gk(B|0,D|0,o|0,0)|0;o=D;A=qk(B|0,o|0,1e9,0)|0;c[r>>2]=A;o=pk(B|0,o|0,1e9,0)|0;r=r+-4|0}while(r>>>0>=s>>>0);if(!o){r=s;break}r=s+-4|0;c[r>>2]=o}while(0);while(1){if(p>>>0<=r>>>0)break;o=p+-4|0;if(!(c[o>>2]|0))p=o;else break}o=(c[ea>>2]|0)-t|0;c[ea>>2]=o;if((o|0)>0)s=r;else break}}else r=F;if((o|0)<0){y=((n+25|0)/9|0)+1|0;z=(C|0)==102;w=r;while(1){x=0-o|0;x=(x|0)>9?9:x;do if(w>>>0<p>>>0){o=(1<<x)+-1|0;s=1e9>>>x;r=0;t=w;do{B=c[t>>2]|0;c[t>>2]=(B>>>x)+r;r=$(B&o,s)|0;t=t+4|0}while(t>>>0<p>>>0);o=(c[w>>2]|0)==0?w+4|0:w;if(!r){r=o;break}c[p>>2]=r;r=o;p=p+4|0}else r=(c[w>>2]|0)==0?w+4|0:w;while(0);o=z?F:r;p=(p-o>>2|0)>(y|0)?o+(y<<2)|0:p;o=(c[ea>>2]|0)+x|0;c[ea>>2]=o;if((o|0)>=0){w=r;break}else w=r}}else w=r;do if(w>>>0<p>>>0){o=(E-w>>2)*9|0;s=c[w>>2]|0;if(s>>>0<10)break;else r=10;do{r=r*10|0;o=o+1|0}while(s>>>0>=r>>>0)}else o=0;while(0);A=(C|0)==103;B=(n|0)!=0;r=n-((C|0)!=102?o:0)+((B&A)<<31>>31)|0;if((r|0)<(((p-E>>2)*9|0)+-9|0)){t=r+9216|0;z=(t|0)/9|0;r=F+(z+-1023<<2)|0;t=((t|0)%9|0)+1|0;if((t|0)<9){s=10;do{s=s*10|0;t=t+1|0}while((t|0)!=9)}else s=10;x=c[r>>2]|0;y=(x>>>0)%(s>>>0)|0;if((y|0)==0?(F+(z+-1022<<2)|0)==(p|0):0)s=w;else L=163;do if((L|0)==163){L=0;v=(((x>>>0)/(s>>>0)|0)&1|0)==0?9007199254740992.0:9007199254740994.0;t=(s|0)/2|0;do if(y>>>0<t>>>0)q=.5;else{if((y|0)==(t|0)?(F+(z+-1022<<2)|0)==(p|0):0){q=1.0;break}q=1.5}while(0);do if(G){if((a[H>>0]|0)!=45)break;v=-v;q=-q}while(0);t=x-y|0;c[r>>2]=t;if(!(v+q!=v)){s=w;break}C=t+s|0;c[r>>2]=C;if(C>>>0>999999999){o=w;while(1){s=r+-4|0;c[r>>2]=0;if(s>>>0<o>>>0){o=o+-4|0;c[o>>2]=0}C=(c[s>>2]|0)+1|0;c[s>>2]=C;if(C>>>0>999999999)r=s;else{w=o;r=s;break}}}o=(E-w>>2)*9|0;t=c[w>>2]|0;if(t>>>0<10){s=w;break}else s=10;do{s=s*10|0;o=o+1|0}while(t>>>0>=s>>>0);s=w}while(0);C=r+4|0;w=s;p=p>>>0>C>>>0?C:p}y=0-o|0;while(1){if(p>>>0<=w>>>0){z=0;C=p;break}r=p+-4|0;if(!(c[r>>2]|0))p=r;else{z=1;C=p;break}}do if(A){n=(B&1^1)+n|0;if((n|0)>(o|0)&(o|0)>-5){u=u+-1|0;n=n+-1-o|0}else{u=u+-2|0;n=n+-1|0}p=I&8;if(p)break;do if(z){p=c[C+-4>>2]|0;if(!p){r=9;break}if(!((p>>>0)%10|0)){s=10;r=0}else{r=0;break}do{s=s*10|0;r=r+1|0}while(((p>>>0)%(s>>>0)|0|0)==0)}else r=9;while(0);p=((C-E>>2)*9|0)+-9|0;if((u|32|0)==102){p=p-r|0;p=(p|0)<0?0:p;n=(n|0)<(p|0)?n:p;p=0;break}else{p=p+o-r|0;p=(p|0)<0?0:p;n=(n|0)<(p|0)?n:p;p=0;break}}else p=I&8;while(0);x=n|p;s=(x|0)!=0&1;t=(u|32|0)==102;if(t){o=(o|0)>0?o:0;u=0}else{r=(o|0)<0?y:o;r=Sj(r,((r|0)<0)<<31>>31,X)|0;if((_-r|0)<2)do{r=r+-1|0;a[r>>0]=48}while((_-r|0)<2);a[r+-1>>0]=(o>>31&2)+43;E=r+-2|0;a[E>>0]=u;o=_-E|0;u=E}y=G+1+n+s+o|0;Tj(e,32,K,y,I);if(!(c[e>>2]&32))hj(H,G,e)|0;Tj(e,48,K,y,I^65536);do if(t){r=w>>>0>F>>>0?F:w;o=r;do{p=Sj(c[o>>2]|0,0,R)|0;do if((o|0)==(r|0)){if((p|0)!=(R|0))break;a[T>>0]=48;p=T}else{if(p>>>0<=da>>>0)break;do{p=p+-1|0;a[p>>0]=48}while(p>>>0>da>>>0)}while(0);if(!(c[e>>2]&32))hj(p,S-p|0,e)|0;o=o+4|0}while(o>>>0<=F>>>0);do if(x){if(c[e>>2]&32)break;hj(16485,1,e)|0}while(0);if((n|0)>0&o>>>0<C>>>0){p=o;while(1){o=Sj(c[p>>2]|0,0,R)|0;if(o>>>0>da>>>0)do{o=o+-1|0;a[o>>0]=48}while(o>>>0>da>>>0);if(!(c[e>>2]&32))hj(o,(n|0)>9?9:n,e)|0;p=p+4|0;o=n+-9|0;if(!((n|0)>9&p>>>0<C>>>0)){n=o;break}else n=o}}Tj(e,48,n+9|0,9,0)}else{t=z?C:w+4|0;if((n|0)>-1){s=(p|0)==0;r=w;do{o=Sj(c[r>>2]|0,0,R)|0;if((o|0)==(R|0)){a[T>>0]=48;o=T}do if((r|0)==(w|0)){p=o+1|0;if(!(c[e>>2]&32))hj(o,1,e)|0;if(s&(n|0)<1){o=p;break}if(c[e>>2]&32){o=p;break}hj(16485,1,e)|0;o=p}else{if(o>>>0<=da>>>0)break;do{o=o+-1|0;a[o>>0]=48}while(o>>>0>da>>>0)}while(0);p=S-o|0;if(!(c[e>>2]&32))hj(o,(n|0)>(p|0)?p:n,e)|0;n=n-p|0;r=r+4|0}while(r>>>0<t>>>0&(n|0)>-1)}Tj(e,48,n+18|0,18,0);if(c[e>>2]&32)break;hj(u,_-u|0,e)|0}while(0);Tj(e,32,K,y,I^8192);n=(y|0)<(K|0)?K:y}else{t=(u&32|0)!=0;s=q!=q|0.0!=0.0;o=s?0:G;r=o+3|0;Tj(e,32,K,r,p);n=c[e>>2]|0;if(!(n&32)){hj(H,o,e)|0;n=c[e>>2]|0}if(!(n&32))hj(s?(t?16477:16481):t?16469:16473,3,e)|0;Tj(e,32,K,r,I^8192);n=(r|0)<(K|0)?K:r}while(0);w=J;continue a}default:{p=I;o=r;t=0;u=16433;n=N}}while(0);g:do if((L|0)==64){p=ba;o=c[p>>2]|0;p=c[p+4>>2]|0;s=u&32;if(!((o|0)==0&(p|0)==0)){n=N;do{n=n+-1|0;a[n>>0]=d[16417+(o&15)>>0]|s;o=hk(o|0,p|0,4)|0;p=D}while(!((o|0)==0&(p|0)==0));L=ba;if((t&8|0)==0|(c[L>>2]|0)==0&(c[L+4>>2]|0)==0){o=t;t=0;s=16433;L=77}else{o=t;t=2;s=16433+(u>>4)|0;L=77}}else{n=N;o=t;t=0;s=16433;L=77}}else if((L|0)==76){n=Sj(n,o,N)|0;o=I;t=p;L=77}else if((L|0)==82){L=0;I=sj(n,0,r)|0;H=(I|0)==0;w=n;o=H?r:I-n|0;t=0;u=16433;n=H?n+r|0:I}else if((L|0)==86){L=0;o=0;n=0;s=c[ba>>2]|0;while(1){p=c[s>>2]|0;if(!p)break;n=Ii(fa,p)|0;if((n|0)<0|n>>>0>(r-o|0)>>>0)break;o=n+o|0;if(r>>>0>o>>>0)s=s+4|0;else break}if((n|0)<0){m=-1;break a}Tj(e,32,K,o,I);if(!o){n=0;L=98}else{p=0;r=c[ba>>2]|0;while(1){n=c[r>>2]|0;if(!n){n=o;L=98;break g}n=Ii(fa,n)|0;p=n+p|0;if((p|0)>(o|0)){n=o;L=98;break g}if(!(c[e>>2]&32))hj(fa,n,e)|0;if(p>>>0>=o>>>0){n=o;L=98;break}else r=r+4|0}}}while(0);if((L|0)==98){L=0;Tj(e,32,K,n,I^8192);w=J;n=(K|0)>(n|0)?K:n;continue}if((L|0)==77){L=0;p=(r|0)>-1?o&-65537:o;o=ba;o=(c[o>>2]|0)!=0|(c[o+4>>2]|0)!=0;if((r|0)!=0|o){o=(o&1^1)+(U-n)|0;w=n;o=(r|0)>(o|0)?r:o;u=s;n=N}else{w=N;o=0;u=s;n=N}}s=n-w|0;o=(o|0)<(s|0)?s:o;r=t+o|0;n=(K|0)<(r|0)?r:K;Tj(e,32,n,r,p);if(!(c[e>>2]&32))hj(u,t,e)|0;Tj(e,48,n,r,p^65536);Tj(e,48,o,s,0);if(!(c[e>>2]&32))hj(w,s,e)|0;Tj(e,32,n,r,p^8192);w=J}h:do if((L|0)==245)if(!e)if(f){m=1;while(1){f=c[l+(m<<2)>>2]|0;if(!f)break;Rj(j+(m<<3)|0,f,g);m=m+1|0;if((m|0)>=10){m=1;break h}}if((m|0)<10)while(1){if(c[l+(m<<2)>>2]|0){m=-1;break h}m=m+1|0;if((m|0)>=10){m=1;break}}else m=1}else m=0;while(0);i=ha;return m|0}function Mj(a,b,c){a=a|0;b=b|0;c=c|0;return Si(a,b,c)|0}function Nj(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;p=i;i=i+240|0;o=p;c[o>>2]=a;a:do if((e|0)>1){n=0-b|0;g=e;h=a;k=a;l=1;while(1){a=h+n|0;m=g+-2|0;j=h+(0-((c[f+(m<<2)>>2]|0)+b))|0;if((cc[d&15](k,j)|0)>-1?(cc[d&15](k,a)|0)>-1:0){e=l;break a}e=l+1|0;h=o+(l<<2)|0;if((cc[d&15](j,a)|0)>-1){c[h>>2]=j;a=j;g=g+-1|0}else{c[h>>2]=a;g=m}if((g|0)<=1)break a;h=a;k=c[o>>2]|0;l=e}}else e=1;while(0);Pj(b,o,e);i=p;return}function Oj(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;r=i;i=i+240|0;p=r;k=c[e>>2]|0;e=c[e+4>>2]|0;c[p>>2]=a;o=0-b|0;a:do if((e|0)!=0|(k|0)!=1?(j=a+(0-(c[h+(f<<2)>>2]|0))|0,(cc[d&15](j,a)|0)>=1):0){g=(g|0)==0;n=j;l=k;m=e;j=1;while(1){if(g&(f|0)>1){e=c[h+(f+-2<<2)>>2]|0;if((cc[d&15](a+o|0,n)|0)>-1){g=f;e=j;q=20;break a}if((cc[d&15](a+(0-(e+b))|0,n)|0)>-1){g=f;e=j;q=20;break a}}e=j+1|0;c[p+(j<<2)>>2]=n;g=l+-1|0;do if(g){if(!(g&1)){a=g;g=0;do{g=g+1|0;a=a>>>1}while((a&1|0)==0);if(!g)q=11}else q=11;if((q|0)==11){q=0;if(!m){g=64;q=16;break}if(!(m&1)){a=m;g=0}else{k=0;a=l;j=m;g=0;break}while(1){j=g+1|0;a=a>>>1;if(a&1){a=j;break}else g=j}if(!a){k=0;a=l;j=m;g=0;break}else g=g+33|0}if(g>>>0>31)q=16;else{k=g;a=l;j=m}}else{g=32;q=16}while(0);if((q|0)==16){q=0;k=g+-32|0;a=m;j=0}l=j<<32-k|a>>>k;m=j>>>k;g=g+f|0;if(!((m|0)!=0|(l|0)!=1)){a=n;q=20;break a}a=n+(0-(c[h+(g<<2)>>2]|0))|0;if((cc[d&15](a,c[p>>2]|0)|0)<1){a=n;f=g;g=0;q=19;break}else{k=n;f=g;g=1;n=a;j=e;a=k}}}else{e=1;q=19}while(0);if((q|0)==19?(g|0)==0:0){g=f;q=20}if((q|0)==20){Pj(b,p,e);Nj(a,b,d,g,h)}i=r;return}function Pj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;h=i;i=i+256|0;e=h;a:do if((d|0)>=2?(g=b+(d<<2)|0,c[g>>2]=e,(a|0)!=0):0)while(1){f=a>>>0>256?256:a;ik(e|0,c[b>>2]|0,f|0)|0;e=0;do{j=b+(e<<2)|0;e=e+1|0;ik(c[j>>2]|0,c[b+(e<<2)>>2]|0,f|0)|0;c[j>>2]=(c[j>>2]|0)+f}while((e|0)!=(d|0));if((a|0)==(f|0))break a;a=a-f|0;e=c[g>>2]|0}while(0);i=h;return}function Qj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=a+20|0;f=c[e>>2]|0;a=(c[a+16>>2]|0)-f|0;a=a>>>0>d>>>0?d:a;ik(f|0,b|0,a|0)|0;c[e>>2]=(c[e>>2]|0)+a;return d|0}function Rj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0;a:do if(b>>>0<=20)do switch(b|0){case 9:{e=(c[d>>2]|0)+(4-1)&~(4-1);b=c[e>>2]|0;c[d>>2]=e+4;c[a>>2]=b;break a}case 10:{e=(c[d>>2]|0)+(4-1)&~(4-1);b=c[e>>2]|0;c[d>>2]=e+4;e=a;c[e>>2]=b;c[e+4>>2]=((b|0)<0)<<31>>31;break a}case 11:{e=(c[d>>2]|0)+(4-1)&~(4-1);b=c[e>>2]|0;c[d>>2]=e+4;e=a;c[e>>2]=b;c[e+4>>2]=0;break a}case 12:{e=(c[d>>2]|0)+(8-1)&~(8-1);b=e;f=c[b>>2]|0;b=c[b+4>>2]|0;c[d>>2]=e+8;e=a;c[e>>2]=f;c[e+4>>2]=b;break a}case 13:{f=(c[d>>2]|0)+(4-1)&~(4-1);e=c[f>>2]|0;c[d>>2]=f+4;e=(e&65535)<<16>>16;f=a;c[f>>2]=e;c[f+4>>2]=((e|0)<0)<<31>>31;break a}case 14:{f=(c[d>>2]|0)+(4-1)&~(4-1);e=c[f>>2]|0;c[d>>2]=f+4;f=a;c[f>>2]=e&65535;c[f+4>>2]=0;break a}case 15:{f=(c[d>>2]|0)+(4-1)&~(4-1);e=c[f>>2]|0;c[d>>2]=f+4;e=(e&255)<<24>>24;f=a;c[f>>2]=e;c[f+4>>2]=((e|0)<0)<<31>>31;break a}case 16:{f=(c[d>>2]|0)+(4-1)&~(4-1);e=c[f>>2]|0;c[d>>2]=f+4;f=a;c[f>>2]=e&255;c[f+4>>2]=0;break a}case 17:{f=(c[d>>2]|0)+(8-1)&~(8-1);g=+h[f>>3];c[d>>2]=f+8;h[a>>3]=g;break a}case 18:{f=(c[d>>2]|0)+(8-1)&~(8-1);g=+h[f>>3];c[d>>2]=f+8;h[a>>3]=g;break a}default:break a}while(0);while(0);return}function Sj(b,c,d){b=b|0;c=c|0;d=d|0;var e=0;if(c>>>0>0|(c|0)==0&b>>>0>4294967295)while(1){e=qk(b|0,c|0,10,0)|0;d=d+-1|0;a[d>>0]=e|48;e=pk(b|0,c|0,10,0)|0;if(c>>>0>9|(c|0)==9&b>>>0>4294967295){b=e;c=D}else{b=e;break}}if(b)while(1){d=d+-1|0;a[d>>0]=(b>>>0)%10|0|48;if(b>>>0<10)break;else b=(b>>>0)/10|0}return d|0}function Tj(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0;j=i;i=i+256|0;h=j;do if((d|0)>(e|0)&(f&73728|0)==0){f=d-e|0;ek(h|0,b|0,(f>>>0>256?256:f)|0)|0;b=c[a>>2]|0;g=(b&32|0)==0;if(f>>>0>255){e=d-e|0;do{if(g){hj(h,256,a)|0;b=c[a>>2]|0}f=f+-256|0;g=(b&32|0)==0}while(f>>>0>255);if(g)f=e&255;else break}else if(!g)break;hj(h,f,a)|0}while(0);i=j;return}function Uj(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0;do if(a>>>0<245){o=a>>>0<11?16:a+11&-8;a=o>>>3;i=c[756]|0;d=i>>>a;if(d&3){a=(d&1^1)+a|0;e=a<<1;d=3064+(e<<2)|0;e=3064+(e+2<<2)|0;f=c[e>>2]|0;g=f+8|0;h=c[g>>2]|0;do if((d|0)!=(h|0)){if(h>>>0<(c[760]|0)>>>0)Da();b=h+12|0;if((c[b>>2]|0)==(f|0)){c[b>>2]=d;c[e>>2]=h;break}else Da()}else c[756]=i&~(1<<a);while(0);M=a<<3;c[f+4>>2]=M|3;M=f+(M|4)|0;c[M>>2]=c[M>>2]|1;M=g;return M|0}h=c[758]|0;if(o>>>0>h>>>0){if(d){e=2<<a;e=d<<a&(e|0-e);e=(e&0-e)+-1|0;j=e>>>12&16;e=e>>>j;f=e>>>5&8;e=e>>>f;g=e>>>2&4;e=e>>>g;d=e>>>1&2;e=e>>>d;a=e>>>1&1;a=(f|j|g|d|a)+(e>>>a)|0;e=a<<1;d=3064+(e<<2)|0;e=3064+(e+2<<2)|0;g=c[e>>2]|0;j=g+8|0;f=c[j>>2]|0;do if((d|0)!=(f|0)){if(f>>>0<(c[760]|0)>>>0)Da();b=f+12|0;if((c[b>>2]|0)==(g|0)){c[b>>2]=d;c[e>>2]=f;k=c[758]|0;break}else Da()}else{c[756]=i&~(1<<a);k=h}while(0);M=a<<3;h=M-o|0;c[g+4>>2]=o|3;i=g+o|0;c[g+(o|4)>>2]=h|1;c[g+M>>2]=h;if(k){f=c[761]|0;d=k>>>3;b=d<<1;e=3064+(b<<2)|0;a=c[756]|0;d=1<<d;if(a&d){a=3064+(b+2<<2)|0;b=c[a>>2]|0;if(b>>>0<(c[760]|0)>>>0)Da();else{l=a;m=b}}else{c[756]=a|d;l=3064+(b+2<<2)|0;m=e}c[l>>2]=f;c[m+12>>2]=f;c[f+8>>2]=m;c[f+12>>2]=e}c[758]=h;c[761]=i;M=j;return M|0}a=c[757]|0;if(a){d=(a&0-a)+-1|0;L=d>>>12&16;d=d>>>L;K=d>>>5&8;d=d>>>K;M=d>>>2&4;d=d>>>M;a=d>>>1&2;d=d>>>a;e=d>>>1&1;e=c[3328+((K|L|M|a|e)+(d>>>e)<<2)>>2]|0;d=(c[e+4>>2]&-8)-o|0;a=e;while(1){b=c[a+16>>2]|0;if(!b){b=c[a+20>>2]|0;if(!b){j=d;break}}a=(c[b+4>>2]&-8)-o|0;M=a>>>0<d>>>0;d=M?a:d;a=b;e=M?b:e}g=c[760]|0;if(e>>>0<g>>>0)Da();i=e+o|0;if(e>>>0>=i>>>0)Da();h=c[e+24>>2]|0;d=c[e+12>>2]|0;do if((d|0)==(e|0)){a=e+20|0;b=c[a>>2]|0;if(!b){a=e+16|0;b=c[a>>2]|0;if(!b){n=0;break}}while(1){d=b+20|0;f=c[d>>2]|0;if(f){b=f;a=d;continue}d=b+16|0;f=c[d>>2]|0;if(!f)break;else{b=f;a=d}}if(a>>>0<g>>>0)Da();else{c[a>>2]=0;n=b;break}}else{f=c[e+8>>2]|0;if(f>>>0<g>>>0)Da();b=f+12|0;if((c[b>>2]|0)!=(e|0))Da();a=d+8|0;if((c[a>>2]|0)==(e|0)){c[b>>2]=d;c[a>>2]=f;n=d;break}else Da()}while(0);do if(h){b=c[e+28>>2]|0;a=3328+(b<<2)|0;if((e|0)==(c[a>>2]|0)){c[a>>2]=n;if(!n){c[757]=c[757]&~(1<<b);break}}else{if(h>>>0<(c[760]|0)>>>0)Da();b=h+16|0;if((c[b>>2]|0)==(e|0))c[b>>2]=n;else c[h+20>>2]=n;if(!n)break}a=c[760]|0;if(n>>>0<a>>>0)Da();c[n+24>>2]=h;b=c[e+16>>2]|0;do if(b)if(b>>>0<a>>>0)Da();else{c[n+16>>2]=b;c[b+24>>2]=n;break}while(0);b=c[e+20>>2]|0;if(b)if(b>>>0<(c[760]|0)>>>0)Da();else{c[n+20>>2]=b;c[b+24>>2]=n;break}}while(0);if(j>>>0<16){M=j+o|0;c[e+4>>2]=M|3;M=e+(M+4)|0;c[M>>2]=c[M>>2]|1}else{c[e+4>>2]=o|3;c[e+(o|4)>>2]=j|1;c[e+(j+o)>>2]=j;b=c[758]|0;if(b){g=c[761]|0;d=b>>>3;b=d<<1;f=3064+(b<<2)|0;a=c[756]|0;d=1<<d;if(a&d){b=3064+(b+2<<2)|0;a=c[b>>2]|0;if(a>>>0<(c[760]|0)>>>0)Da();else{p=b;q=a}}else{c[756]=a|d;p=3064+(b+2<<2)|0;q=f}c[p>>2]=g;c[q+12>>2]=g;c[g+8>>2]=q;c[g+12>>2]=f}c[758]=j;c[761]=i}M=e+8|0;return M|0}else q=o}else q=o}else if(a>>>0<=4294967231){a=a+11|0;m=a&-8;l=c[757]|0;if(l){d=0-m|0;a=a>>>8;if(a)if(m>>>0>16777215)k=31;else{q=(a+1048320|0)>>>16&8;v=a<<q;p=(v+520192|0)>>>16&4;v=v<<p;k=(v+245760|0)>>>16&2;k=14-(p|q|k)+(v<<k>>>15)|0;k=m>>>(k+7|0)&1|k<<1}else k=0;a=c[3328+(k<<2)>>2]|0;a:do if(!a){f=0;a=0;v=86}else{h=d;f=0;i=m<<((k|0)==31?0:25-(k>>>1)|0);j=a;a=0;while(1){g=c[j+4>>2]&-8;d=g-m|0;if(d>>>0<h>>>0)if((g|0)==(m|0)){g=j;a=j;v=90;break a}else a=j;else d=h;v=c[j+20>>2]|0;j=c[j+16+(i>>>31<<2)>>2]|0;f=(v|0)==0|(v|0)==(j|0)?f:v;if(!j){v=86;break}else{h=d;i=i<<1}}}while(0);if((v|0)==86){if((f|0)==0&(a|0)==0){a=2<<k;a=l&(a|0-a);if(!a){q=m;break}a=(a&0-a)+-1|0;n=a>>>12&16;a=a>>>n;l=a>>>5&8;a=a>>>l;p=a>>>2&4;a=a>>>p;q=a>>>1&2;a=a>>>q;f=a>>>1&1;f=c[3328+((l|n|p|q|f)+(a>>>f)<<2)>>2]|0;a=0}if(!f){i=d;j=a}else{g=f;v=90}}if((v|0)==90)while(1){v=0;q=(c[g+4>>2]&-8)-m|0;f=q>>>0<d>>>0;d=f?q:d;a=f?g:a;f=c[g+16>>2]|0;if(f){g=f;v=90;continue}g=c[g+20>>2]|0;if(!g){i=d;j=a;break}else v=90}if((j|0)!=0?i>>>0<((c[758]|0)-m|0)>>>0:0){f=c[760]|0;if(j>>>0<f>>>0)Da();h=j+m|0;if(j>>>0>=h>>>0)Da();g=c[j+24>>2]|0;d=c[j+12>>2]|0;do if((d|0)==(j|0)){a=j+20|0;b=c[a>>2]|0;if(!b){a=j+16|0;b=c[a>>2]|0;if(!b){o=0;break}}while(1){d=b+20|0;e=c[d>>2]|0;if(e){b=e;a=d;continue}d=b+16|0;e=c[d>>2]|0;if(!e)break;else{b=e;a=d}}if(a>>>0<f>>>0)Da();else{c[a>>2]=0;o=b;break}}else{e=c[j+8>>2]|0;if(e>>>0<f>>>0)Da();b=e+12|0;if((c[b>>2]|0)!=(j|0))Da();a=d+8|0;if((c[a>>2]|0)==(j|0)){c[b>>2]=d;c[a>>2]=e;o=d;break}else Da()}while(0);do if(g){b=c[j+28>>2]|0;a=3328+(b<<2)|0;if((j|0)==(c[a>>2]|0)){c[a>>2]=o;if(!o){c[757]=c[757]&~(1<<b);break}}else{if(g>>>0<(c[760]|0)>>>0)Da();b=g+16|0;if((c[b>>2]|0)==(j|0))c[b>>2]=o;else c[g+20>>2]=o;if(!o)break}a=c[760]|0;if(o>>>0<a>>>0)Da();c[o+24>>2]=g;b=c[j+16>>2]|0;do if(b)if(b>>>0<a>>>0)Da();else{c[o+16>>2]=b;c[b+24>>2]=o;break}while(0);b=c[j+20>>2]|0;if(b)if(b>>>0<(c[760]|0)>>>0)Da();else{c[o+20>>2]=b;c[b+24>>2]=o;break}}while(0);b:do if(i>>>0>=16){c[j+4>>2]=m|3;c[j+(m|4)>>2]=i|1;c[j+(i+m)>>2]=i;b=i>>>3;if(i>>>0<256){a=b<<1;e=3064+(a<<2)|0;d=c[756]|0;b=1<<b;if(d&b){b=3064+(a+2<<2)|0;a=c[b>>2]|0;if(a>>>0<(c[760]|0)>>>0)Da();else{s=b;t=a}}else{c[756]=d|b;s=3064+(a+2<<2)|0;t=e}c[s>>2]=h;c[t+12>>2]=h;c[j+(m+8)>>2]=t;c[j+(m+12)>>2]=e;break}b=i>>>8;if(b)if(i>>>0>16777215)e=31;else{L=(b+1048320|0)>>>16&8;M=b<<L;K=(M+520192|0)>>>16&4;M=M<<K;e=(M+245760|0)>>>16&2;e=14-(K|L|e)+(M<<e>>>15)|0;e=i>>>(e+7|0)&1|e<<1}else e=0;b=3328+(e<<2)|0;c[j+(m+28)>>2]=e;c[j+(m+20)>>2]=0;c[j+(m+16)>>2]=0;a=c[757]|0;d=1<<e;if(!(a&d)){c[757]=a|d;c[b>>2]=h;c[j+(m+24)>>2]=b;c[j+(m+12)>>2]=h;c[j+(m+8)>>2]=h;break}b=c[b>>2]|0;c:do if((c[b+4>>2]&-8|0)!=(i|0)){e=i<<((e|0)==31?0:25-(e>>>1)|0);while(1){a=b+16+(e>>>31<<2)|0;d=c[a>>2]|0;if(!d)break;if((c[d+4>>2]&-8|0)==(i|0)){y=d;break c}else{e=e<<1;b=d}}if(a>>>0<(c[760]|0)>>>0)Da();else{c[a>>2]=h;c[j+(m+24)>>2]=b;c[j+(m+12)>>2]=h;c[j+(m+8)>>2]=h;break b}}else y=b;while(0);b=y+8|0;a=c[b>>2]|0;M=c[760]|0;if(a>>>0>=M>>>0&y>>>0>=M>>>0){c[a+12>>2]=h;c[b>>2]=h;c[j+(m+8)>>2]=a;c[j+(m+12)>>2]=y;c[j+(m+24)>>2]=0;break}else Da()}else{M=i+m|0;c[j+4>>2]=M|3;M=j+(M+4)|0;c[M>>2]=c[M>>2]|1}while(0);M=j+8|0;return M|0}else q=m}else q=m}else q=-1;while(0);d=c[758]|0;if(d>>>0>=q>>>0){b=d-q|0;a=c[761]|0;if(b>>>0>15){c[761]=a+q;c[758]=b;c[a+(q+4)>>2]=b|1;c[a+d>>2]=b;c[a+4>>2]=q|3}else{c[758]=0;c[761]=0;c[a+4>>2]=d|3;M=a+(d+4)|0;c[M>>2]=c[M>>2]|1}M=a+8|0;return M|0}a=c[759]|0;if(a>>>0>q>>>0){L=a-q|0;c[759]=L;M=c[762]|0;c[762]=M+q;c[M+(q+4)>>2]=L|1;c[M+4>>2]=q|3;M=M+8|0;return M|0}do if(!(c[874]|0)){a=$a(30)|0;if(!(a+-1&a)){c[876]=a;c[875]=a;c[877]=-1;c[878]=-1;c[879]=0;c[867]=0;c[874]=(Db(0)|0)&-16^1431655768;break}else Da()}while(0);j=q+48|0;i=c[876]|0;k=q+47|0;h=i+k|0;i=0-i|0;l=h&i;if(l>>>0<=q>>>0){M=0;return M|0}a=c[866]|0;if((a|0)!=0?(t=c[864]|0,y=t+l|0,y>>>0<=t>>>0|y>>>0>a>>>0):0){M=0;return M|0}d:do if(!(c[867]&4)){a=c[762]|0;e:do if(a){f=3472;while(1){d=c[f>>2]|0;if(d>>>0<=a>>>0?(r=f+4|0,(d+(c[r>>2]|0)|0)>>>0>a>>>0):0){g=f;a=r;break}f=c[f+8>>2]|0;if(!f){v=174;break e}}d=h-(c[759]|0)&i;if(d>>>0<2147483647){f=Ua(d|0)|0;y=(f|0)==((c[g>>2]|0)+(c[a>>2]|0)|0);a=y?d:0;if(y){if((f|0)!=(-1|0)){w=f;p=a;v=194;break d}}else v=184}else a=0}else v=174;while(0);do if((v|0)==174){g=Ua(0)|0;if((g|0)!=(-1|0)){a=g;d=c[875]|0;f=d+-1|0;if(!(f&a))d=l;else d=l-a+(f+a&0-d)|0;a=c[864]|0;f=a+d|0;if(d>>>0>q>>>0&d>>>0<2147483647){y=c[866]|0;if((y|0)!=0?f>>>0<=a>>>0|f>>>0>y>>>0:0){a=0;break}f=Ua(d|0)|0;y=(f|0)==(g|0);a=y?d:0;if(y){w=g;p=a;v=194;break d}else v=184}else a=0}else a=0}while(0);f:do if((v|0)==184){g=0-d|0;do if(j>>>0>d>>>0&(d>>>0<2147483647&(f|0)!=(-1|0))?(u=c[876]|0,u=k-d+u&0-u,u>>>0<2147483647):0)if((Ua(u|0)|0)==(-1|0)){Ua(g|0)|0;break f}else{d=u+d|0;break}while(0);if((f|0)!=(-1|0)){w=f;p=d;v=194;break d}}while(0);c[867]=c[867]|4;v=191}else{a=0;v=191}while(0);if((((v|0)==191?l>>>0<2147483647:0)?(w=Ua(l|0)|0,x=Ua(0)|0,w>>>0<x>>>0&((w|0)!=(-1|0)&(x|0)!=(-1|0))):0)?(z=x-w|0,A=z>>>0>(q+40|0)>>>0,A):0){p=A?z:a;v=194}if((v|0)==194){a=(c[864]|0)+p|0;c[864]=a;if(a>>>0>(c[865]|0)>>>0)c[865]=a;h=c[762]|0;g:do if(h){g=3472;do{a=c[g>>2]|0;d=g+4|0;f=c[d>>2]|0;if((w|0)==(a+f|0)){B=a;C=d;D=f;E=g;v=204;break}g=c[g+8>>2]|0}while((g|0)!=0);if(((v|0)==204?(c[E+12>>2]&8|0)==0:0)?h>>>0<w>>>0&h>>>0>=B>>>0:0){c[C>>2]=D+p;M=(c[759]|0)+p|0;L=h+8|0;L=(L&7|0)==0?0:0-L&7;K=M-L|0;c[762]=h+L;c[759]=K;c[h+(L+4)>>2]=K|1;c[h+(M+4)>>2]=40;c[763]=c[878];break}a=c[760]|0;if(w>>>0<a>>>0){c[760]=w;a=w}d=w+p|0;g=3472;while(1){if((c[g>>2]|0)==(d|0)){f=g;d=g;v=212;break}g=c[g+8>>2]|0;if(!g){d=3472;break}}if((v|0)==212)if(!(c[d+12>>2]&8)){c[f>>2]=w;n=d+4|0;c[n>>2]=(c[n>>2]|0)+p;n=w+8|0;n=(n&7|0)==0?0:0-n&7;k=w+(p+8)|0;k=(k&7|0)==0?0:0-k&7;b=w+(k+p)|0;m=n+q|0;o=w+m|0;l=b-(w+n)-q|0;c[w+(n+4)>>2]=q|3;h:do if((b|0)!=(h|0)){if((b|0)==(c[761]|0)){M=(c[758]|0)+l|0;c[758]=M;c[761]=o;c[w+(m+4)>>2]=M|1;c[w+(M+m)>>2]=M;break}i=p+4|0;d=c[w+(i+k)>>2]|0;if((d&3|0)==1){j=d&-8;g=d>>>3;i:do if(d>>>0>=256){h=c[w+((k|24)+p)>>2]|0;e=c[w+(p+12+k)>>2]|0;do if((e|0)==(b|0)){f=k|16;e=w+(i+f)|0;d=c[e>>2]|0;if(!d){e=w+(f+p)|0;d=c[e>>2]|0;if(!d){J=0;break}}while(1){f=d+20|0;g=c[f>>2]|0;if(g){d=g;e=f;continue}f=d+16|0;g=c[f>>2]|0;if(!g)break;else{d=g;e=f}}if(e>>>0<a>>>0)Da();else{c[e>>2]=0;J=d;break}}else{f=c[w+((k|8)+p)>>2]|0;if(f>>>0<a>>>0)Da();a=f+12|0;if((c[a>>2]|0)!=(b|0))Da();d=e+8|0;if((c[d>>2]|0)==(b|0)){c[a>>2]=e;c[d>>2]=f;J=e;break}else Da()}while(0);if(!h)break;a=c[w+(p+28+k)>>2]|0;d=3328+(a<<2)|0;do if((b|0)!=(c[d>>2]|0)){if(h>>>0<(c[760]|0)>>>0)Da();a=h+16|0;if((c[a>>2]|0)==(b|0))c[a>>2]=J;else c[h+20>>2]=J;if(!J)break i}else{c[d>>2]=J;if(J)break;c[757]=c[757]&~(1<<a);break i}while(0);d=c[760]|0;if(J>>>0<d>>>0)Da();c[J+24>>2]=h;b=k|16;a=c[w+(b+p)>>2]|0;do if(a)if(a>>>0<d>>>0)Da();else{c[J+16>>2]=a;c[a+24>>2]=J;break}while(0);b=c[w+(i+b)>>2]|0;if(!b)break;if(b>>>0<(c[760]|0)>>>0)Da();else{c[J+20>>2]=b;c[b+24>>2]=J;break}}else{e=c[w+((k|8)+p)>>2]|0;f=c[w+(p+12+k)>>2]|0;d=3064+(g<<1<<2)|0;do if((e|0)!=(d|0)){if(e>>>0<a>>>0)Da();if((c[e+12>>2]|0)==(b|0))break;Da()}while(0);if((f|0)==(e|0)){c[756]=c[756]&~(1<<g);break}do if((f|0)==(d|0))F=f+8|0;else{if(f>>>0<a>>>0)Da();a=f+8|0;if((c[a>>2]|0)==(b|0)){F=a;break}Da()}while(0);c[e+12>>2]=f;c[F>>2]=e}while(0);b=w+((j|k)+p)|0;f=j+l|0}else f=l;b=b+4|0;c[b>>2]=c[b>>2]&-2;c[w+(m+4)>>2]=f|1;c[w+(f+m)>>2]=f;b=f>>>3;if(f>>>0<256){a=b<<1;e=3064+(a<<2)|0;d=c[756]|0;b=1<<b;do if(!(d&b)){c[756]=d|b;K=3064+(a+2<<2)|0;L=e}else{b=3064+(a+2<<2)|0;a=c[b>>2]|0;if(a>>>0>=(c[760]|0)>>>0){K=b;L=a;break}Da()}while(0);c[K>>2]=o;c[L+12>>2]=o;c[w+(m+8)>>2]=L;c[w+(m+12)>>2]=e;break}b=f>>>8;do if(!b)e=0;else{if(f>>>0>16777215){e=31;break}K=(b+1048320|0)>>>16&8;L=b<<K;J=(L+520192|0)>>>16&4;L=L<<J;e=(L+245760|0)>>>16&2;e=14-(J|K|e)+(L<<e>>>15)|0;e=f>>>(e+7|0)&1|e<<1}while(0);b=3328+(e<<2)|0;c[w+(m+28)>>2]=e;c[w+(m+20)>>2]=0;c[w+(m+16)>>2]=0;a=c[757]|0;d=1<<e;if(!(a&d)){c[757]=a|d;c[b>>2]=o;c[w+(m+24)>>2]=b;c[w+(m+12)>>2]=o;c[w+(m+8)>>2]=o;break}b=c[b>>2]|0;j:do if((c[b+4>>2]&-8|0)!=(f|0)){e=f<<((e|0)==31?0:25-(e>>>1)|0);while(1){a=b+16+(e>>>31<<2)|0;d=c[a>>2]|0;if(!d)break;if((c[d+4>>2]&-8|0)==(f|0)){M=d;break j}else{e=e<<1;b=d}}if(a>>>0<(c[760]|0)>>>0)Da();else{c[a>>2]=o;c[w+(m+24)>>2]=b;c[w+(m+12)>>2]=o;c[w+(m+8)>>2]=o;break h}}else M=b;while(0);b=M+8|0;a=c[b>>2]|0;L=c[760]|0;if(a>>>0>=L>>>0&M>>>0>=L>>>0){c[a+12>>2]=o;c[b>>2]=o;c[w+(m+8)>>2]=a;c[w+(m+12)>>2]=M;c[w+(m+24)>>2]=0;break}else Da()}else{M=(c[759]|0)+l|0;c[759]=M;c[762]=o;c[w+(m+4)>>2]=M|1}while(0);M=w+(n|8)|0;return M|0}else d=3472;while(1){a=c[d>>2]|0;if(a>>>0<=h>>>0?(b=c[d+4>>2]|0,e=a+b|0,e>>>0>h>>>0):0)break;d=c[d+8>>2]|0}f=a+(b+-39)|0;a=a+(b+-47+((f&7|0)==0?0:0-f&7))|0;f=h+16|0;a=a>>>0<f>>>0?h:a;b=a+8|0;d=w+8|0;d=(d&7|0)==0?0:0-d&7;M=p+-40-d|0;c[762]=w+d;c[759]=M;c[w+(d+4)>>2]=M|1;c[w+(p+-36)>>2]=40;c[763]=c[878];d=a+4|0;c[d>>2]=27;c[b>>2]=c[868];c[b+4>>2]=c[869];c[b+8>>2]=c[870];c[b+12>>2]=c[871];c[868]=w;c[869]=p;c[871]=0;c[870]=b;b=a+28|0;c[b>>2]=7;if((a+32|0)>>>0<e>>>0)do{M=b;b=b+4|0;c[b>>2]=7}while((M+8|0)>>>0<e>>>0);if((a|0)!=(h|0)){g=a-h|0;c[d>>2]=c[d>>2]&-2;c[h+4>>2]=g|1;c[a>>2]=g;b=g>>>3;if(g>>>0<256){a=b<<1;e=3064+(a<<2)|0;d=c[756]|0;b=1<<b;if(d&b){b=3064+(a+2<<2)|0;a=c[b>>2]|0;if(a>>>0<(c[760]|0)>>>0)Da();else{G=b;H=a}}else{c[756]=d|b;G=3064+(a+2<<2)|0;H=e}c[G>>2]=h;c[H+12>>2]=h;c[h+8>>2]=H;c[h+12>>2]=e;break}b=g>>>8;if(b)if(g>>>0>16777215)e=31;else{L=(b+1048320|0)>>>16&8;M=b<<L;K=(M+520192|0)>>>16&4;M=M<<K;e=(M+245760|0)>>>16&2;e=14-(K|L|e)+(M<<e>>>15)|0;e=g>>>(e+7|0)&1|e<<1}else e=0;d=3328+(e<<2)|0;c[h+28>>2]=e;c[h+20>>2]=0;c[f>>2]=0;b=c[757]|0;a=1<<e;if(!(b&a)){c[757]=b|a;c[d>>2]=h;c[h+24>>2]=d;c[h+12>>2]=h;c[h+8>>2]=h;break}b=c[d>>2]|0;k:do if((c[b+4>>2]&-8|0)!=(g|0)){e=g<<((e|0)==31?0:25-(e>>>1)|0);while(1){a=b+16+(e>>>31<<2)|0;d=c[a>>2]|0;if(!d)break;if((c[d+4>>2]&-8|0)==(g|0)){I=d;break k}else{e=e<<1;b=d}}if(a>>>0<(c[760]|0)>>>0)Da();else{c[a>>2]=h;c[h+24>>2]=b;c[h+12>>2]=h;c[h+8>>2]=h;break g}}else I=b;while(0);b=I+8|0;a=c[b>>2]|0;M=c[760]|0;if(a>>>0>=M>>>0&I>>>0>=M>>>0){c[a+12>>2]=h;c[b>>2]=h;c[h+8>>2]=a;c[h+12>>2]=I;c[h+24>>2]=0;break}else Da()}}else{M=c[760]|0;if((M|0)==0|w>>>0<M>>>0)c[760]=w;c[868]=w;c[869]=p;c[871]=0;c[765]=c[874];c[764]=-1;b=0;do{M=b<<1;L=3064+(M<<2)|0;c[3064+(M+3<<2)>>2]=L;c[3064+(M+2<<2)>>2]=L;b=b+1|0}while((b|0)!=32);M=w+8|0;M=(M&7|0)==0?0:0-M&7;L=p+-40-M|0;c[762]=w+M;c[759]=L;c[w+(M+4)>>2]=L|1;c[w+(p+-36)>>2]=40;c[763]=c[878]}while(0);b=c[759]|0;if(b>>>0>q>>>0){L=b-q|0;c[759]=L;M=c[762]|0;c[762]=M+q;c[M+(q+4)>>2]=L|1;c[M+4>>2]=q|3;M=M+8|0;return M|0}}c[(qi()|0)>>2]=12;M=0;return M|0}function Vj(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;if(!a)return;b=a+-8|0;i=c[760]|0;if(b>>>0<i>>>0)Da();d=c[a+-4>>2]|0;e=d&3;if((e|0)==1)Da();o=d&-8;q=a+(o+-8)|0;do if(!(d&1)){b=c[b>>2]|0;if(!e)return;j=-8-b|0;l=a+j|0;m=b+o|0;if(l>>>0<i>>>0)Da();if((l|0)==(c[761]|0)){b=a+(o+-4)|0;d=c[b>>2]|0;if((d&3|0)!=3){u=l;g=m;break}c[758]=m;c[b>>2]=d&-2;c[a+(j+4)>>2]=m|1;c[q>>2]=m;return}f=b>>>3;if(b>>>0<256){e=c[a+(j+8)>>2]|0;d=c[a+(j+12)>>2]|0;b=3064+(f<<1<<2)|0;if((e|0)!=(b|0)){if(e>>>0<i>>>0)Da();if((c[e+12>>2]|0)!=(l|0))Da()}if((d|0)==(e|0)){c[756]=c[756]&~(1<<f);u=l;g=m;break}if((d|0)!=(b|0)){if(d>>>0<i>>>0)Da();b=d+8|0;if((c[b>>2]|0)==(l|0))h=b;else Da()}else h=d+8|0;c[e+12>>2]=d;c[h>>2]=e;u=l;g=m;break}h=c[a+(j+24)>>2]|0;e=c[a+(j+12)>>2]|0;do if((e|0)==(l|0)){d=a+(j+20)|0;b=c[d>>2]|0;if(!b){d=a+(j+16)|0;b=c[d>>2]|0;if(!b){k=0;break}}while(1){e=b+20|0;f=c[e>>2]|0;if(f){b=f;d=e;continue}e=b+16|0;f=c[e>>2]|0;if(!f)break;else{b=f;d=e}}if(d>>>0<i>>>0)Da();else{c[d>>2]=0;k=b;break}}else{f=c[a+(j+8)>>2]|0;if(f>>>0<i>>>0)Da();b=f+12|0;if((c[b>>2]|0)!=(l|0))Da();d=e+8|0;if((c[d>>2]|0)==(l|0)){c[b>>2]=e;c[d>>2]=f;k=e;break}else Da()}while(0);if(h){b=c[a+(j+28)>>2]|0;d=3328+(b<<2)|0;if((l|0)==(c[d>>2]|0)){c[d>>2]=k;if(!k){c[757]=c[757]&~(1<<b);u=l;g=m;break}}else{if(h>>>0<(c[760]|0)>>>0)Da();b=h+16|0;if((c[b>>2]|0)==(l|0))c[b>>2]=k;else c[h+20>>2]=k;if(!k){u=l;g=m;break}}d=c[760]|0;if(k>>>0<d>>>0)Da();c[k+24>>2]=h;b=c[a+(j+16)>>2]|0;do if(b)if(b>>>0<d>>>0)Da();else{c[k+16>>2]=b;c[b+24>>2]=k;break}while(0);b=c[a+(j+20)>>2]|0;if(b)if(b>>>0<(c[760]|0)>>>0)Da();else{c[k+20>>2]=b;c[b+24>>2]=k;u=l;g=m;break}else{u=l;g=m}}else{u=l;g=m}}else{u=b;g=o}while(0);if(u>>>0>=q>>>0)Da();b=a+(o+-4)|0;d=c[b>>2]|0;if(!(d&1))Da();if(!(d&2)){if((q|0)==(c[762]|0)){t=(c[759]|0)+g|0;c[759]=t;c[762]=u;c[u+4>>2]=t|1;if((u|0)!=(c[761]|0))return;c[761]=0;c[758]=0;return}if((q|0)==(c[761]|0)){t=(c[758]|0)+g|0;c[758]=t;c[761]=u;c[u+4>>2]=t|1;c[u+t>>2]=t;return}g=(d&-8)+g|0;f=d>>>3;do if(d>>>0>=256){h=c[a+(o+16)>>2]|0;b=c[a+(o|4)>>2]|0;do if((b|0)==(q|0)){d=a+(o+12)|0;b=c[d>>2]|0;if(!b){d=a+(o+8)|0;b=c[d>>2]|0;if(!b){p=0;break}}while(1){e=b+20|0;f=c[e>>2]|0;if(f){b=f;d=e;continue}e=b+16|0;f=c[e>>2]|0;if(!f)break;else{b=f;d=e}}if(d>>>0<(c[760]|0)>>>0)Da();else{c[d>>2]=0;p=b;break}}else{d=c[a+o>>2]|0;if(d>>>0<(c[760]|0)>>>0)Da();e=d+12|0;if((c[e>>2]|0)!=(q|0))Da();f=b+8|0;if((c[f>>2]|0)==(q|0)){c[e>>2]=b;c[f>>2]=d;p=b;break}else Da()}while(0);if(h){b=c[a+(o+20)>>2]|0;d=3328+(b<<2)|0;if((q|0)==(c[d>>2]|0)){c[d>>2]=p;if(!p){c[757]=c[757]&~(1<<b);break}}else{if(h>>>0<(c[760]|0)>>>0)Da();b=h+16|0;if((c[b>>2]|0)==(q|0))c[b>>2]=p;else c[h+20>>2]=p;if(!p)break}d=c[760]|0;if(p>>>0<d>>>0)Da();c[p+24>>2]=h;b=c[a+(o+8)>>2]|0;do if(b)if(b>>>0<d>>>0)Da();else{c[p+16>>2]=b;c[b+24>>2]=p;break}while(0);b=c[a+(o+12)>>2]|0;if(b)if(b>>>0<(c[760]|0)>>>0)Da();else{c[p+20>>2]=b;c[b+24>>2]=p;break}}}else{e=c[a+o>>2]|0;d=c[a+(o|4)>>2]|0;b=3064+(f<<1<<2)|0;if((e|0)!=(b|0)){if(e>>>0<(c[760]|0)>>>0)Da();if((c[e+12>>2]|0)!=(q|0))Da()}if((d|0)==(e|0)){c[756]=c[756]&~(1<<f);break}if((d|0)!=(b|0)){if(d>>>0<(c[760]|0)>>>0)Da();b=d+8|0;if((c[b>>2]|0)==(q|0))n=b;else Da()}else n=d+8|0;c[e+12>>2]=d;c[n>>2]=e}while(0);c[u+4>>2]=g|1;c[u+g>>2]=g;if((u|0)==(c[761]|0)){c[758]=g;return}}else{c[b>>2]=d&-2;c[u+4>>2]=g|1;c[u+g>>2]=g}b=g>>>3;if(g>>>0<256){d=b<<1;f=3064+(d<<2)|0;e=c[756]|0;b=1<<b;if(e&b){b=3064+(d+2<<2)|0;d=c[b>>2]|0;if(d>>>0<(c[760]|0)>>>0)Da();else{r=b;s=d}}else{c[756]=e|b;r=3064+(d+2<<2)|0;s=f}c[r>>2]=u;c[s+12>>2]=u;c[u+8>>2]=s;c[u+12>>2]=f;return}b=g>>>8;if(b)if(g>>>0>16777215)f=31;else{r=(b+1048320|0)>>>16&8;s=b<<r;q=(s+520192|0)>>>16&4;s=s<<q;f=(s+245760|0)>>>16&2;f=14-(q|r|f)+(s<<f>>>15)|0;f=g>>>(f+7|0)&1|f<<1}else f=0;b=3328+(f<<2)|0;c[u+28>>2]=f;c[u+20>>2]=0;c[u+16>>2]=0;d=c[757]|0;e=1<<f;a:do if(d&e){b=c[b>>2]|0;b:do if((c[b+4>>2]&-8|0)!=(g|0)){f=g<<((f|0)==31?0:25-(f>>>1)|0);while(1){d=b+16+(f>>>31<<2)|0;e=c[d>>2]|0;if(!e)break;if((c[e+4>>2]&-8|0)==(g|0)){t=e;break b}else{f=f<<1;b=e}}if(d>>>0<(c[760]|0)>>>0)Da();else{c[d>>2]=u;c[u+24>>2]=b;c[u+12>>2]=u;c[u+8>>2]=u;break a}}else t=b;while(0);b=t+8|0;d=c[b>>2]|0;s=c[760]|0;if(d>>>0>=s>>>0&t>>>0>=s>>>0){c[d+12>>2]=u;c[b>>2]=u;c[u+8>>2]=d;c[u+12>>2]=t;c[u+24>>2]=0;break}else Da()}else{c[757]=d|e;c[b>>2]=u;c[u+24>>2]=b;c[u+12>>2]=u;c[u+8>>2]=u}while(0);u=(c[764]|0)+-1|0;c[764]=u;if(!u)b=3480;else return;while(1){b=c[b>>2]|0;if(!b)break;else b=b+8|0}c[764]=-1;return}function Wj(a,b){a=a|0;b=b|0;var d=0;if(a){d=$(b,a)|0;if((b|a)>>>0>65535)d=((d>>>0)/(a>>>0)|0|0)==(b|0)?d:-1}else d=0;b=Uj(d)|0;if(!b)return b|0;if(!(c[b+-4>>2]&3))return b|0;ek(b|0,0,d|0)|0;return b|0}function Xj(a,b){a=a|0;b=b|0;var d=0,e=0;if(!a){a=Uj(b)|0;return a|0}if(b>>>0>4294967231){c[(qi()|0)>>2]=12;a=0;return a|0}d=Yj(a+-8|0,b>>>0<11?16:b+11&-8)|0;if(d){a=d+8|0;return a|0}d=Uj(b)|0;if(!d){a=0;return a|0}e=c[a+-4>>2]|0;e=(e&-8)-((e&3|0)==0?8:4)|0;ik(d|0,a|0,(e>>>0<b>>>0?e:b)|0)|0;Vj(a);a=d;return a|0}function Yj(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;o=a+4|0;p=c[o>>2]|0;j=p&-8;l=a+j|0;i=c[760]|0;d=p&3;if(!((d|0)!=1&a>>>0>=i>>>0&a>>>0<l>>>0))Da();e=a+(j|4)|0;f=c[e>>2]|0;if(!(f&1))Da();if(!d){if(b>>>0<256){a=0;return a|0}if(j>>>0>=(b+4|0)>>>0?(j-b|0)>>>0<=c[876]<<1>>>0:0)return a|0;a=0;return a|0}if(j>>>0>=b>>>0){d=j-b|0;if(d>>>0<=15)return a|0;c[o>>2]=p&1|b|2;c[a+(b+4)>>2]=d|3;c[e>>2]=c[e>>2]|1;Zj(a+b|0,d);return a|0}if((l|0)==(c[762]|0)){d=(c[759]|0)+j|0;if(d>>>0<=b>>>0){a=0;return a|0}n=d-b|0;c[o>>2]=p&1|b|2;c[a+(b+4)>>2]=n|1;c[762]=a+b;c[759]=n;return a|0}if((l|0)==(c[761]|0)){e=(c[758]|0)+j|0;if(e>>>0<b>>>0){a=0;return a|0}d=e-b|0;if(d>>>0>15){c[o>>2]=p&1|b|2;c[a+(b+4)>>2]=d|1;c[a+e>>2]=d;e=a+(e+4)|0;c[e>>2]=c[e>>2]&-2;e=a+b|0}else{c[o>>2]=p&1|e|2;e=a+(e+4)|0;c[e>>2]=c[e>>2]|1;e=0;d=0}c[758]=d;c[761]=e;return a|0}if(f&2){a=0;return a|0}m=(f&-8)+j|0;if(m>>>0<b>>>0){a=0;return a|0}n=m-b|0;g=f>>>3;do if(f>>>0>=256){h=c[a+(j+24)>>2]|0;g=c[a+(j+12)>>2]|0;do if((g|0)==(l|0)){e=a+(j+20)|0;d=c[e>>2]|0;if(!d){e=a+(j+16)|0;d=c[e>>2]|0;if(!d){k=0;break}}while(1){f=d+20|0;g=c[f>>2]|0;if(g){d=g;e=f;continue}f=d+16|0;g=c[f>>2]|0;if(!g)break;else{d=g;e=f}}if(e>>>0<i>>>0)Da();else{c[e>>2]=0;k=d;break}}else{f=c[a+(j+8)>>2]|0;if(f>>>0<i>>>0)Da();d=f+12|0;if((c[d>>2]|0)!=(l|0))Da();e=g+8|0;if((c[e>>2]|0)==(l|0)){c[d>>2]=g;c[e>>2]=f;k=g;break}else Da()}while(0);if(h){d=c[a+(j+28)>>2]|0;e=3328+(d<<2)|0;if((l|0)==(c[e>>2]|0)){c[e>>2]=k;if(!k){c[757]=c[757]&~(1<<d);break}}else{if(h>>>0<(c[760]|0)>>>0)Da();d=h+16|0;if((c[d>>2]|0)==(l|0))c[d>>2]=k;else c[h+20>>2]=k;if(!k)break}e=c[760]|0;if(k>>>0<e>>>0)Da();c[k+24>>2]=h;d=c[a+(j+16)>>2]|0;do if(d)if(d>>>0<e>>>0)Da();else{c[k+16>>2]=d;c[d+24>>2]=k;break}while(0);d=c[a+(j+20)>>2]|0;if(d)if(d>>>0<(c[760]|0)>>>0)Da();else{c[k+20>>2]=d;c[d+24>>2]=k;break}}}else{f=c[a+(j+8)>>2]|0;e=c[a+(j+12)>>2]|0;d=3064+(g<<1<<2)|0;if((f|0)!=(d|0)){if(f>>>0<i>>>0)Da();if((c[f+12>>2]|0)!=(l|0))Da()}if((e|0)==(f|0)){c[756]=c[756]&~(1<<g);break}if((e|0)!=(d|0)){if(e>>>0<i>>>0)Da();d=e+8|0;if((c[d>>2]|0)==(l|0))h=d;else Da()}else h=e+8|0;c[f+12>>2]=e;c[h>>2]=f}while(0);if(n>>>0<16){c[o>>2]=m|p&1|2;b=a+(m|4)|0;c[b>>2]=c[b>>2]|1;return a|0}else{c[o>>2]=p&1|b|2;c[a+(b+4)>>2]=n|3;p=a+(m|4)|0;c[p>>2]=c[p>>2]|1;Zj(a+b|0,n);return a|0}return 0}function Zj(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;q=a+b|0;d=c[a+4>>2]|0;do if(!(d&1)){k=c[a>>2]|0;if(!(d&3))return;n=a+(0-k)|0;m=k+b|0;j=c[760]|0;if(n>>>0<j>>>0)Da();if((n|0)==(c[761]|0)){e=a+(b+4)|0;d=c[e>>2]|0;if((d&3|0)!=3){t=n;h=m;break}c[758]=m;c[e>>2]=d&-2;c[a+(4-k)>>2]=m|1;c[q>>2]=m;return}g=k>>>3;if(k>>>0<256){f=c[a+(8-k)>>2]|0;e=c[a+(12-k)>>2]|0;d=3064+(g<<1<<2)|0;if((f|0)!=(d|0)){if(f>>>0<j>>>0)Da();if((c[f+12>>2]|0)!=(n|0))Da()}if((e|0)==(f|0)){c[756]=c[756]&~(1<<g);t=n;h=m;break}if((e|0)!=(d|0)){if(e>>>0<j>>>0)Da();d=e+8|0;if((c[d>>2]|0)==(n|0))i=d;else Da()}else i=e+8|0;c[f+12>>2]=e;c[i>>2]=f;t=n;h=m;break}i=c[a+(24-k)>>2]|0;f=c[a+(12-k)>>2]|0;do if((f|0)==(n|0)){f=16-k|0;e=a+(f+4)|0;d=c[e>>2]|0;if(!d){e=a+f|0;d=c[e>>2]|0;if(!d){l=0;break}}while(1){f=d+20|0;g=c[f>>2]|0;if(g){d=g;e=f;continue}f=d+16|0;g=c[f>>2]|0;if(!g)break;else{d=g;e=f}}if(e>>>0<j>>>0)Da();else{c[e>>2]=0;l=d;break}}else{g=c[a+(8-k)>>2]|0;if(g>>>0<j>>>0)Da();d=g+12|0;if((c[d>>2]|0)!=(n|0))Da();e=f+8|0;if((c[e>>2]|0)==(n|0)){c[d>>2]=f;c[e>>2]=g;l=f;break}else Da()}while(0);if(i){d=c[a+(28-k)>>2]|0;e=3328+(d<<2)|0;if((n|0)==(c[e>>2]|0)){c[e>>2]=l;if(!l){c[757]=c[757]&~(1<<d);t=n;h=m;break}}else{if(i>>>0<(c[760]|0)>>>0)Da();d=i+16|0;if((c[d>>2]|0)==(n|0))c[d>>2]=l;else c[i+20>>2]=l;if(!l){t=n;h=m;break}}f=c[760]|0;if(l>>>0<f>>>0)Da();c[l+24>>2]=i;d=16-k|0;e=c[a+d>>2]|0;do if(e)if(e>>>0<f>>>0)Da();else{c[l+16>>2]=e;c[e+24>>2]=l;break}while(0);d=c[a+(d+4)>>2]|0;if(d)if(d>>>0<(c[760]|0)>>>0)Da();else{c[l+20>>2]=d;c[d+24>>2]=l;t=n;h=m;break}else{t=n;h=m}}else{t=n;h=m}}else{t=a;h=b}while(0);j=c[760]|0;if(q>>>0<j>>>0)Da();d=a+(b+4)|0;e=c[d>>2]|0;if(!(e&2)){if((q|0)==(c[762]|0)){s=(c[759]|0)+h|0;c[759]=s;c[762]=t;c[t+4>>2]=s|1;if((t|0)!=(c[761]|0))return;c[761]=0;c[758]=0;return}if((q|0)==(c[761]|0)){s=(c[758]|0)+h|0;c[758]=s;c[761]=t;c[t+4>>2]=s|1;c[t+s>>2]=s;return}h=(e&-8)+h|0;g=e>>>3;do if(e>>>0>=256){i=c[a+(b+24)>>2]|0;f=c[a+(b+12)>>2]|0;do if((f|0)==(q|0)){e=a+(b+20)|0;d=c[e>>2]|0;if(!d){e=a+(b+16)|0;d=c[e>>2]|0;if(!d){p=0;break}}while(1){f=d+20|0;g=c[f>>2]|0;if(g){d=g;e=f;continue}f=d+16|0;g=c[f>>2]|0;if(!g)break;else{d=g;e=f}}if(e>>>0<j>>>0)Da();else{c[e>>2]=0;p=d;break}}else{g=c[a+(b+8)>>2]|0;if(g>>>0<j>>>0)Da();d=g+12|0;if((c[d>>2]|0)!=(q|0))Da();e=f+8|0;if((c[e>>2]|0)==(q|0)){c[d>>2]=f;c[e>>2]=g;p=f;break}else Da()}while(0);if(i){d=c[a+(b+28)>>2]|0;e=3328+(d<<2)|0;if((q|0)==(c[e>>2]|0)){c[e>>2]=p;if(!p){c[757]=c[757]&~(1<<d);break}}else{if(i>>>0<(c[760]|0)>>>0)Da();d=i+16|0;if((c[d>>2]|0)==(q|0))c[d>>2]=p;else c[i+20>>2]=p;if(!p)break}e=c[760]|0;if(p>>>0<e>>>0)Da();c[p+24>>2]=i;d=c[a+(b+16)>>2]|0;do if(d)if(d>>>0<e>>>0)Da();else{c[p+16>>2]=d;c[d+24>>2]=p;break}while(0);d=c[a+(b+20)>>2]|0;if(d)if(d>>>0<(c[760]|0)>>>0)Da();else{c[p+20>>2]=d;c[d+24>>2]=p;break}}}else{f=c[a+(b+8)>>2]|0;e=c[a+(b+12)>>2]|0;d=3064+(g<<1<<2)|0;if((f|0)!=(d|0)){if(f>>>0<j>>>0)Da();if((c[f+12>>2]|0)!=(q|0))Da()}if((e|0)==(f|0)){c[756]=c[756]&~(1<<g);break}if((e|0)!=(d|0)){if(e>>>0<j>>>0)Da();d=e+8|0;if((c[d>>2]|0)==(q|0))o=d;else Da()}else o=e+8|0;c[f+12>>2]=e;c[o>>2]=f}while(0);c[t+4>>2]=h|1;c[t+h>>2]=h;if((t|0)==(c[761]|0)){c[758]=h;return}}else{c[d>>2]=e&-2;c[t+4>>2]=h|1;c[t+h>>2]=h}d=h>>>3;if(h>>>0<256){e=d<<1;g=3064+(e<<2)|0;f=c[756]|0;d=1<<d;if(f&d){d=3064+(e+2<<2)|0;e=c[d>>2]|0;if(e>>>0<(c[760]|0)>>>0)Da();else{r=d;s=e}}else{c[756]=f|d;r=3064+(e+2<<2)|0;s=g}c[r>>2]=t;c[s+12>>2]=t;c[t+8>>2]=s;c[t+12>>2]=g;return}d=h>>>8;if(d)if(h>>>0>16777215)g=31;else{r=(d+1048320|0)>>>16&8;s=d<<r;q=(s+520192|0)>>>16&4;s=s<<q;g=(s+245760|0)>>>16&2;g=14-(q|r|g)+(s<<g>>>15)|0;g=h>>>(g+7|0)&1|g<<1}else g=0;d=3328+(g<<2)|0;c[t+28>>2]=g;c[t+20>>2]=0;c[t+16>>2]=0;e=c[757]|0;f=1<<g;if(!(e&f)){c[757]=e|f;c[d>>2]=t;c[t+24>>2]=d;c[t+12>>2]=t;c[t+8>>2]=t;return}d=c[d>>2]|0;a:do if((c[d+4>>2]&-8|0)!=(h|0)){g=h<<((g|0)==31?0:25-(g>>>1)|0);while(1){e=d+16+(g>>>31<<2)|0;f=c[e>>2]|0;if(!f)break;if((c[f+4>>2]&-8|0)==(h|0)){d=f;break a}else{g=g<<1;d=f}}if(e>>>0<(c[760]|0)>>>0)Da();c[e>>2]=t;c[t+24>>2]=d;c[t+12>>2]=t;c[t+8>>2]=t;return}while(0);e=d+8|0;f=c[e>>2]|0;s=c[760]|0;if(!(f>>>0>=s>>>0&d>>>0>=s>>>0))Da();c[f+12>>2]=t;c[e>>2]=t;c[t+8>>2]=f;c[t+12>>2]=d;c[t+24>>2]=0;return} +function Ee(b,e,f,j,k,l,m,n,o,p,q,r){b=b|0;e=e|0;f=f|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;p=p|0;q=+q;r=r|0;var s=0,t=0,u=0.0,v=0.0,w=0,x=0,y=0.0,z=0.0,A=0.0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0.0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0,Z=0;T=i;i=i+240|0;x=T+224|0;w=T+216|0;C=T+208|0;B=T+200|0;s=T+136|0;N=T+72|0;P=T;Q=T+232|0;R=T+228|0;h[s>>3]=100.0;h[s+8>>3]=100.0;h[s+16>>3]=110.0;h[s+24>>3]=100.0;h[s+32>>3]=110.0;h[s+40>>3]=110.0;h[s+48>>3]=100.0;h[s+56>>3]=110.0;h[N>>3]=+h[p>>3];h[N+8>>3]=+h[p+8>>3];h[N+16>>3]=+h[p+16>>3];h[N+24>>3]=+h[p+24>>3];h[N+32>>3]=+h[p+32>>3];h[N+40>>3]=+h[p+40>>3];h[N+48>>3]=+h[p+48>>3];h[N+56>>3]=+h[p+56>>3];He(s,N,P);A=+h[N>>3];V=+h[N+16>>3];y=A-V;J=+h[N+8>>3];U=+h[N+24>>3];u=J-U;s=~~(y*y+u*u);u=+h[N+32>>3];y=+h[N+48>>3];X=u-y;v=+h[N+40>>3];z=+h[N+56>>3];W=v-z;N=~~(X*X+W*W);u=V-u;v=U-v;t=~~(u*u+v*v);A=y-A;J=z-J;O=~~(A*A+J*J);s=~~(+(((N|0)>(s|0)?N:s)|0)*q*q);t=~~(+(((O|0)>(t|0)?O:t)|0)*q*q);if(!b){p=f;while(1)if((p|0)<(j|0)&($(p,p)|0)<(s|0))p=p<<1;else break;s=f;while(1)if((s|0)<(j|0)&($(s,s)|0)<(t|0))s=s<<1;else break}else{p=f;while(1)if((p|0)<(j|0)&($(p<<2,p)|0)<(s|0))p=p<<1;else break;s=f;while(1)if((s|0)<(j|0)&($(s<<2,s)|0)<(t|0))s=s<<1;else break}O=(p|0)>(j|0)?j:p;M=(s|0)>(j|0)?j:s;L=(O|0)/(f|0)|0;K=(M|0)/(f|0)|0;u=(1.0-q)*.5*10.0;J=q*10.0;N=$(f,f)|0;a:do if(!e){I=N*3|0;p=Wj(I,4)|0;if(!p){Me(3,5472,B);rb(1)}do switch(n|0){case 0:{y=u+100.0;z=+(M|0);A=+(O|0);B=P+48|0;C=P+56|0;n=P+64|0;D=P+8|0;E=P+16|0;F=P+24|0;G=P+32|0;H=P+40|0;j=(b|0)==1;if((M|0)>0){e=(O|0)>0;x=0;do{v=y+J*(+(x|0)+.5)/z;if(e){w=0;do{u=y+J*(+(w|0)+.5)/A;q=+h[n>>3]+(+h[B>>3]*u+v*+h[C>>3]);if(q==0.0){S=278;break a}X=(+h[E>>3]+(u*+h[P>>3]+v*+h[D>>3]))/q;g[Q>>2]=X;u=(+h[H>>3]+(u*+h[F>>3]+v*+h[G>>3]))/q;g[R>>2]=u;lf(o,X,u,Q,R)|0;u=+g[Q>>2];if(j){s=((~~(u+1.0)|0)/2|0)<<1;t=((~~(+g[R>>2]+1.0)|0)/2|0)<<1}else{s=~~(u+.5);t=~~(+g[R>>2]+.5)}if((s|0)>-1?(t|0)<(m|0)&((t|0)>-1&(s|0)<(l|0)):0){t=(($(t,l)|0)+s|0)*3|0;b=(($((x|0)/(K|0)|0,f)|0)+((w|0)/(L|0)|0)|0)*3|0;s=p+(b<<2)|0;c[s>>2]=(c[s>>2]|0)+(d[k+(t+2)>>0]|0);s=p+(b+1<<2)|0;c[s>>2]=(c[s>>2]|0)+(d[k+(t+1)>>0]|0);b=p+(b+2<<2)|0;c[b>>2]=(c[b>>2]|0)+(d[k+t>>0]|0)}w=w+1|0}while((w|0)<(O|0))}x=x+1|0}while((x|0)<(M|0))}break}case 1:{y=u+100.0;z=+(M|0);A=+(O|0);B=P+48|0;C=P+56|0;n=P+64|0;D=P+8|0;E=P+16|0;F=P+24|0;G=P+32|0;H=P+40|0;j=(b|0)==1;if((M|0)>0){e=(O|0)>0;x=0;do{v=y+J*(+(x|0)+.5)/z;if(e){w=0;do{u=y+J*(+(w|0)+.5)/A;q=+h[n>>3]+(+h[B>>3]*u+v*+h[C>>3]);if(q==0.0){S=278;break a}X=(+h[E>>3]+(u*+h[P>>3]+v*+h[D>>3]))/q;g[Q>>2]=X;u=(+h[H>>3]+(u*+h[F>>3]+v*+h[G>>3]))/q;g[R>>2]=u;lf(o,X,u,Q,R)|0;u=+g[Q>>2];if(j){s=((~~(u+1.0)|0)/2|0)<<1;t=((~~(+g[R>>2]+1.0)|0)/2|0)<<1}else{s=~~(u+.5);t=~~(+g[R>>2]+.5)}if((s|0)>-1?(t|0)<(m|0)&((t|0)>-1&(s|0)<(l|0)):0){t=(($(t,l)|0)+s|0)*3|0;b=(($((x|0)/(K|0)|0,f)|0)+((w|0)/(L|0)|0)|0)*3|0;s=p+(b<<2)|0;c[s>>2]=(c[s>>2]|0)+(d[k+t>>0]|0);s=p+(b+1<<2)|0;c[s>>2]=(c[s>>2]|0)+(d[k+(t+1)>>0]|0);b=p+(b+2<<2)|0;c[b>>2]=(c[b>>2]|0)+(d[k+(t+2)>>0]|0)}w=w+1|0}while((w|0)<(O|0))}x=x+1|0}while((x|0)<(M|0))}break}case 2:{y=u+100.0;z=+(M|0);A=+(O|0);B=P+48|0;C=P+56|0;n=P+64|0;D=P+8|0;E=P+16|0;F=P+24|0;G=P+32|0;H=P+40|0;j=(b|0)==1;if((M|0)>0){e=(O|0)>0;x=0;do{v=y+J*(+(x|0)+.5)/z;if(e){w=0;do{u=y+J*(+(w|0)+.5)/A;q=+h[n>>3]+(+h[B>>3]*u+v*+h[C>>3]);if(q==0.0){S=278;break a}X=(+h[E>>3]+(u*+h[P>>3]+v*+h[D>>3]))/q;g[Q>>2]=X;u=(+h[H>>3]+(u*+h[F>>3]+v*+h[G>>3]))/q;g[R>>2]=u;lf(o,X,u,Q,R)|0;u=+g[Q>>2];if(j){s=((~~(u+1.0)|0)/2|0)<<1;t=((~~(+g[R>>2]+1.0)|0)/2|0)<<1}else{s=~~(u+.5);t=~~(+g[R>>2]+.5)}if((s|0)>-1?(t|0)<(m|0)&((t|0)>-1&(s|0)<(l|0)):0){t=($(t,l)|0)+s<<2;b=(($((x|0)/(K|0)|0,f)|0)+((w|0)/(L|0)|0)|0)*3|0;s=p+(b<<2)|0;c[s>>2]=(c[s>>2]|0)+(d[k+(t|2)>>0]|0);s=p+(b+1<<2)|0;c[s>>2]=(c[s>>2]|0)+(d[k+(t|1)>>0]|0);b=p+(b+2<<2)|0;c[b>>2]=(c[b>>2]|0)+(d[k+t>>0]|0)}w=w+1|0}while((w|0)<(O|0))}x=x+1|0}while((x|0)<(M|0))}break}case 3:{y=u+100.0;z=+(M|0);A=+(O|0);B=P+48|0;C=P+56|0;n=P+64|0;D=P+8|0;E=P+16|0;F=P+24|0;G=P+32|0;H=P+40|0;j=(b|0)==1;if((M|0)>0){e=(O|0)>0;x=0;do{v=y+J*(+(x|0)+.5)/z;if(e){w=0;do{u=y+J*(+(w|0)+.5)/A;q=+h[n>>3]+(+h[B>>3]*u+v*+h[C>>3]);if(q==0.0){S=278;break a}X=(+h[E>>3]+(u*+h[P>>3]+v*+h[D>>3]))/q;g[Q>>2]=X;u=(+h[H>>3]+(u*+h[F>>3]+v*+h[G>>3]))/q;g[R>>2]=u;lf(o,X,u,Q,R)|0;u=+g[Q>>2];if(j){s=((~~(u+1.0)|0)/2|0)<<1;t=((~~(+g[R>>2]+1.0)|0)/2|0)<<1}else{s=~~(u+.5);t=~~(+g[R>>2]+.5)}if((s|0)>-1?(t|0)<(m|0)&((t|0)>-1&(s|0)<(l|0)):0){t=($(t,l)|0)+s<<2;b=(($((x|0)/(K|0)|0,f)|0)+((w|0)/(L|0)|0)|0)*3|0;s=p+(b<<2)|0;c[s>>2]=(c[s>>2]|0)+(d[k+t>>0]|0);s=p+(b+1<<2)|0;c[s>>2]=(c[s>>2]|0)+(d[k+(t|1)>>0]|0);b=p+(b+2<<2)|0;c[b>>2]=(c[b>>2]|0)+(d[k+(t|2)>>0]|0)}w=w+1|0}while((w|0)<(O|0))}x=x+1|0}while((x|0)<(M|0))}break}case 4:{y=u+100.0;z=+(M|0);A=+(O|0);B=P+48|0;C=P+56|0;n=P+64|0;D=P+8|0;E=P+16|0;F=P+24|0;G=P+32|0;H=P+40|0;j=(b|0)==1;if((M|0)>0){e=(O|0)>0;x=0;do{v=y+J*(+(x|0)+.5)/z;if(e){w=0;do{u=y+J*(+(w|0)+.5)/A;q=+h[n>>3]+(+h[B>>3]*u+v*+h[C>>3]);if(q==0.0){S=278;break a}X=(+h[E>>3]+(u*+h[P>>3]+v*+h[D>>3]))/q;g[Q>>2]=X;u=(+h[H>>3]+(u*+h[F>>3]+v*+h[G>>3]))/q;g[R>>2]=u;lf(o,X,u,Q,R)|0;u=+g[Q>>2];if(j){s=((~~(u+1.0)|0)/2|0)<<1;t=((~~(+g[R>>2]+1.0)|0)/2|0)<<1}else{s=~~(u+.5);t=~~(+g[R>>2]+.5)}if((s|0)>-1?(t|0)<(m|0)&((t|0)>-1&(s|0)<(l|0)):0){t=($(t,l)|0)+s<<2;b=(($((x|0)/(K|0)|0,f)|0)+((w|0)/(L|0)|0)|0)*3|0;s=p+(b<<2)|0;c[s>>2]=(c[s>>2]|0)+(d[k+(t|1)>>0]|0);s=p+(b+1<<2)|0;c[s>>2]=(c[s>>2]|0)+(d[k+(t|2)>>0]|0);b=p+(b+2<<2)|0;c[b>>2]=(c[b>>2]|0)+(d[k+(t|3)>>0]|0)}w=w+1|0}while((w|0)<(O|0))}x=x+1|0}while((x|0)<(M|0))}break}case 5:case 12:case 13:case 14:{y=u+100.0;z=+(M|0);A=+(O|0);B=P+48|0;C=P+56|0;n=P+64|0;D=P+8|0;E=P+16|0;F=P+24|0;G=P+32|0;H=P+40|0;j=(b|0)==1;if((M|0)>0){e=(O|0)>0;x=0;do{v=y+J*(+(x|0)+.5)/z;if(e){w=0;do{u=y+J*(+(w|0)+.5)/A;q=+h[n>>3]+(+h[B>>3]*u+v*+h[C>>3]);if(q==0.0){S=278;break a}X=(+h[E>>3]+(u*+h[P>>3]+v*+h[D>>3]))/q;g[Q>>2]=X;u=(+h[H>>3]+(u*+h[F>>3]+v*+h[G>>3]))/q;g[R>>2]=u;lf(o,X,u,Q,R)|0;u=+g[Q>>2];if(j){s=((~~(u+1.0)|0)/2|0)<<1;t=((~~(+g[R>>2]+1.0)|0)/2|0)<<1}else{s=~~(u+.5);t=~~(+g[R>>2]+.5)}if((s|0)>-1?(t|0)<(m|0)&((t|0)>-1&(s|0)<(l|0)):0){t=d[k+(($(t,l)|0)+s)>>0]|0;b=(($((x|0)/(K|0)|0,f)|0)+((w|0)/(L|0)|0)|0)*3|0;s=p+(b<<2)|0;c[s>>2]=(c[s>>2]|0)+t;s=p+(b+1<<2)|0;c[s>>2]=(c[s>>2]|0)+t;b=p+(b+2<<2)|0;c[b>>2]=(c[b>>2]|0)+t}w=w+1|0}while((w|0)<(O|0))}x=x+1|0}while((x|0)<(M|0))}break}case 6:{y=u+100.0;z=+(M|0);A=+(O|0);B=P+48|0;C=P+56|0;n=P+64|0;D=P+8|0;E=P+16|0;F=P+24|0;G=P+32|0;H=P+40|0;j=(b|0)==1;if((M|0)>0){e=(O|0)>0;x=0;do{v=y+J*(+(x|0)+.5)/z;if(e){w=0;do{u=y+J*(+(w|0)+.5)/A;q=+h[n>>3]+(+h[B>>3]*u+v*+h[C>>3]);if(q==0.0){S=278;break a}X=(+h[E>>3]+(u*+h[P>>3]+v*+h[D>>3]))/q;g[Q>>2]=X;u=(+h[H>>3]+(u*+h[F>>3]+v*+h[G>>3]))/q;g[R>>2]=u;lf(o,X,u,Q,R)|0;u=+g[Q>>2];if(j){s=((~~(u+1.0)|0)/2|0)<<1;t=((~~(+g[R>>2]+1.0)|0)/2|0)<<1}else{s=~~(u+.5);t=~~(+g[R>>2]+.5)}if((s|0)>-1?(t|0)<(m|0)&((t|0)>-1&(s|0)<(l|0)):0){t=($(t,l)|0)+s<<2;b=(($((x|0)/(K|0)|0,f)|0)+((w|0)/(L|0)|0)|0)*3|0;s=p+(b<<2)|0;c[s>>2]=(c[s>>2]|0)+(d[k+(t|3)>>0]|0);s=p+(b+1<<2)|0;c[s>>2]=(c[s>>2]|0)+(d[k+(t|2)>>0]|0);b=p+(b+2<<2)|0;c[b>>2]=(c[b>>2]|0)+(d[k+(t|1)>>0]|0)}w=w+1|0}while((w|0)<(O|0))}x=x+1|0}while((x|0)<(M|0))}break}case 7:{y=u+100.0;z=+(M|0);A=+(O|0);B=P+48|0;C=P+56|0;n=P+64|0;D=P+8|0;E=P+16|0;F=P+24|0;G=P+32|0;H=P+40|0;j=(b|0)==1;if((M|0)>0){e=(O|0)>0;x=0;do{v=y+J*(+(x|0)+.5)/z;if(e){w=0;do{u=y+J*(+(w|0)+.5)/A;q=+h[n>>3]+(+h[B>>3]*u+v*+h[C>>3]);if(q==0.0){S=278;break a}X=(+h[E>>3]+(u*+h[P>>3]+v*+h[D>>3]))/q;g[Q>>2]=X;u=(+h[H>>3]+(u*+h[F>>3]+v*+h[G>>3]))/q;g[R>>2]=u;lf(o,X,u,Q,R)|0;u=+g[Q>>2];if(j){s=((~~(u+1.0)|0)/2|0)<<1;t=((~~(+g[R>>2]+1.0)|0)/2|0)<<1}else{s=~~(u+.5);t=~~(+g[R>>2]+.5)}if((s|0)>-1?(t|0)<(m|0)&((t|0)>-1&(s|0)<(l|0)):0){Z=$(t,l)|0;Y=(s&65534)+Z<<1;V=+((d[k+Y>>0]|0)+-128|0);X=+((d[k+(Y+2)>>0]|0)+-128|0);W=+((d[k+(Z+s<<1|1)>>0]|0)+-16|0)*298.0820007324219;Z=~~(V*516.4110107421875+W)>>8;Y=~~(W-V*100.29100036621094-X*208.1199951171875)>>8;t=~~(W+X*408.5830078125)>>8;Z=(Z|0)>0?Z:0;b=(($((x|0)/(K|0)|0,f)|0)+((w|0)/(L|0)|0)|0)*3|0;s=p+(b<<2)|0;c[s>>2]=((Z|0)<255?Z:255)+(c[s>>2]|0);Y=(Y|0)>0?Y:0;s=p+(b+1<<2)|0;c[s>>2]=((Y|0)<255?Y:255)+(c[s>>2]|0);t=(t|0)>0?t:0;b=p+(b+2<<2)|0;c[b>>2]=((t|0)<255?t:255)+(c[b>>2]|0)}w=w+1|0}while((w|0)<(O|0))}x=x+1|0}while((x|0)<(M|0))}break}case 8:{y=u+100.0;z=+(M|0);A=+(O|0);B=P+48|0;C=P+56|0;n=P+64|0;D=P+8|0;E=P+16|0;F=P+24|0;G=P+32|0;H=P+40|0;j=(b|0)==1;if((M|0)>0){e=(O|0)>0;x=0;do{v=y+J*(+(x|0)+.5)/z;if(e){w=0;do{u=y+J*(+(w|0)+.5)/A;q=+h[n>>3]+(+h[B>>3]*u+v*+h[C>>3]);if(q==0.0){S=278;break a}X=(+h[E>>3]+(u*+h[P>>3]+v*+h[D>>3]))/q;g[Q>>2]=X;u=(+h[H>>3]+(u*+h[F>>3]+v*+h[G>>3]))/q;g[R>>2]=u;lf(o,X,u,Q,R)|0;u=+g[Q>>2];if(j){s=((~~(u+1.0)|0)/2|0)<<1;t=((~~(+g[R>>2]+1.0)|0)/2|0)<<1}else{s=~~(u+.5);t=~~(+g[R>>2]+.5)}if((s|0)>-1?(t|0)<(m|0)&((t|0)>-1&(s|0)<(l|0)):0){t=$(t,l)|0;Y=(s&65534)+t<<1;V=+((d[k+(Y|1)>>0]|0)+-128|0);X=+((d[k+(Y+3)>>0]|0)+-128|0);W=+((d[k+(t+s<<1)>>0]|0)+-16|0)*298.0820007324219;s=~~(W+V*516.4110107421875)>>8;t=~~(W-V*100.29100036621094-X*208.1199951171875)>>8;Y=~~(W+X*408.5830078125)>>8;s=(s|0)>0?s:0;Z=(($((x|0)/(K|0)|0,f)|0)+((w|0)/(L|0)|0)|0)*3|0;b=p+(Z<<2)|0;c[b>>2]=((s|0)<255?s:255)+(c[b>>2]|0);t=(t|0)>0?t:0;b=p+(Z+1<<2)|0;c[b>>2]=((t|0)<255?t:255)+(c[b>>2]|0);Y=(Y|0)>0?Y:0;Z=p+(Z+2<<2)|0;c[Z>>2]=((Y|0)<255?Y:255)+(c[Z>>2]|0)}w=w+1|0}while((w|0)<(O|0))}x=x+1|0}while((x|0)<(M|0))}break}case 9:{y=u+100.0;z=+(M|0);A=+(O|0);B=P+48|0;C=P+56|0;n=P+64|0;D=P+8|0;E=P+16|0;F=P+24|0;G=P+32|0;H=P+40|0;j=(b|0)==1;if((M|0)>0){e=(O|0)>0;x=0;do{v=y+J*(+(x|0)+.5)/z;if(e){w=0;do{u=y+J*(+(w|0)+.5)/A;q=+h[n>>3]+(+h[B>>3]*u+v*+h[C>>3]);if(q==0.0){S=278;break a}X=(+h[E>>3]+(u*+h[P>>3]+v*+h[D>>3]))/q;g[Q>>2]=X;u=(+h[H>>3]+(u*+h[F>>3]+v*+h[G>>3]))/q;g[R>>2]=u;lf(o,X,u,Q,R)|0;u=+g[Q>>2];if(j){s=((~~(u+1.0)|0)/2|0)<<1;t=((~~(+g[R>>2]+1.0)|0)/2|0)<<1}else{s=~~(u+.5);t=~~(+g[R>>2]+.5)}if((s|0)>-1?(t|0)<(m|0)&((t|0)>-1&(s|0)<(l|0)):0){Y=($(t,l)|0)+s<<1;t=d[k+(Y|1)>>0]|0;Z=(($((x|0)/(K|0)|0,f)|0)+((w|0)/(L|0)|0)|0)*3|0;b=p+(Z<<2)|0;c[b>>2]=(t<<3&248|4)+(c[b>>2]|0);Y=d[k+Y>>0]|0;b=p+(Z+1<<2)|0;c[b>>2]=(Y<<5&224|t>>>3&28|2)+(c[b>>2]|0);Z=p+(Z+2<<2)|0;c[Z>>2]=(Y&248|4)+(c[Z>>2]|0)}w=w+1|0}while((w|0)<(O|0))}x=x+1|0}while((x|0)<(M|0))}break}case 10:{y=u+100.0;z=+(M|0);A=+(O|0);B=P+48|0;C=P+56|0;n=P+64|0;D=P+8|0;E=P+16|0;F=P+24|0;G=P+32|0;H=P+40|0;j=(b|0)==1;if((M|0)>0){e=(O|0)>0;x=0;do{v=y+J*(+(x|0)+.5)/z;if(e){w=0;do{u=y+J*(+(w|0)+.5)/A;q=+h[n>>3]+(+h[B>>3]*u+v*+h[C>>3]);if(q==0.0){S=278;break a}X=(+h[E>>3]+(u*+h[P>>3]+v*+h[D>>3]))/q;g[Q>>2]=X;u=(+h[H>>3]+(u*+h[F>>3]+v*+h[G>>3]))/q;g[R>>2]=u;lf(o,X,u,Q,R)|0;u=+g[Q>>2];if(j){s=((~~(u+1.0)|0)/2|0)<<1;t=((~~(+g[R>>2]+1.0)|0)/2|0)<<1}else{s=~~(u+.5);t=~~(+g[R>>2]+.5)}if((s|0)>-1?(t|0)<(m|0)&((t|0)>-1&(s|0)<(l|0)):0){Y=($(t,l)|0)+s<<1;t=d[k+(Y|1)>>0]|0;Z=(($((x|0)/(K|0)|0,f)|0)+((w|0)/(L|0)|0)|0)*3|0;b=p+(Z<<2)|0;c[b>>2]=(t<<2&248|4)+(c[b>>2]|0);Y=d[k+Y>>0]|0;b=p+(Z+1<<2)|0;c[b>>2]=(Y<<5&224|t>>>3&24|4)+(c[b>>2]|0);Z=p+(Z+2<<2)|0;c[Z>>2]=(Y&248|4)+(c[Z>>2]|0)}w=w+1|0}while((w|0)<(O|0))}x=x+1|0}while((x|0)<(M|0))}break}case 11:{y=u+100.0;z=+(M|0);A=+(O|0);B=P+48|0;C=P+56|0;n=P+64|0;D=P+8|0;E=P+16|0;F=P+24|0;G=P+32|0;H=P+40|0;j=(b|0)==1;if((M|0)>0){e=(O|0)>0;x=0;do{v=y+J*(+(x|0)+.5)/z;if(e){w=0;do{u=y+J*(+(w|0)+.5)/A;q=+h[n>>3]+(+h[B>>3]*u+v*+h[C>>3]);if(q==0.0){S=278;break a}X=(+h[E>>3]+(u*+h[P>>3]+v*+h[D>>3]))/q;g[Q>>2]=X;u=(+h[H>>3]+(u*+h[F>>3]+v*+h[G>>3]))/q;g[R>>2]=u;lf(o,X,u,Q,R)|0;u=+g[Q>>2];if(j){s=((~~(u+1.0)|0)/2|0)<<1;t=((~~(+g[R>>2]+1.0)|0)/2|0)<<1}else{s=~~(u+.5);t=~~(+g[R>>2]+.5)}if((s|0)>-1?(t|0)<(m|0)&((t|0)>-1&(s|0)<(l|0)):0){Y=($(t,l)|0)+s<<1;Z=(($((x|0)/(K|0)|0,f)|0)+((w|0)/(L|0)|0)|0)*3|0;b=p+(Z<<2)|0;c[b>>2]=(c[b>>2]|0)+((d[k+(Y|1)>>0]|0)&240|8);Y=d[k+Y>>0]|0;b=p+(Z+1<<2)|0;c[b>>2]=(Y<<4&240|8)+(c[b>>2]|0);Z=p+(Z+2<<2)|0;c[Z>>2]=(Y&240|8)+(c[Z>>2]|0)}w=w+1|0}while((w|0)<(O|0))}x=x+1|0}while((x|0)<(M|0))}break}default:{Me(3,4615,C);S=278;break a}}while(0);t=$(K,L)|0;if(N){s=0;do{a[r+s>>0]=((c[p+(s<<2)>>2]|0)>>>0)/(t>>>0)|0;s=s+1|0}while((s|0)<(I|0))}Vj(p);p=0}else{p=Wj(N,4)|0;if(!p){Me(3,5472,w);rb(1)}b:do if(n>>>0<2){y=u+100.0;z=+(M|0);A=+(O|0);B=P+48|0;C=P+56|0;n=P+64|0;D=P+8|0;E=P+16|0;F=P+24|0;G=P+32|0;H=P+40|0;j=(b|0)==1;if((M|0)>0){e=(O|0)>0;x=0;do{v=y+J*(+(x|0)+.5)/z;if(e){w=0;do{u=y+J*(+(w|0)+.5)/A;q=+h[n>>3]+(+h[B>>3]*u+v*+h[C>>3]);if(q==0.0){S=278;break a}X=(+h[E>>3]+(u*+h[P>>3]+v*+h[D>>3]))/q;g[Q>>2]=X;u=(+h[H>>3]+(u*+h[F>>3]+v*+h[G>>3]))/q;g[R>>2]=u;lf(o,X,u,Q,R)|0;u=+g[Q>>2];if(j){s=((~~(u+1.0)|0)/2|0)<<1;t=((~~(+g[R>>2]+1.0)|0)/2|0)<<1}else{s=~~(u+.5);t=~~(+g[R>>2]+.5)}if((s|0)>-1?(t|0)<(m|0)&((t|0)>-1&(s|0)<(l|0)):0){Y=(($(t,l)|0)+s|0)*3|0;Z=p+(($((x|0)/(K|0)|0,f)|0)+((w|0)/(L|0)|0)<<2)|0;c[Z>>2]=(c[Z>>2]|0)+((((d[k+(Y+1)>>0]|0)+(d[k+Y>>0]|0)+(d[k+(Y+2)>>0]|0)|0)>>>0)/3|0)}w=w+1|0}while((w|0)<(O|0))}x=x+1|0}while((x|0)<(M|0))}}else{if((n&-2|0)==2){y=u+100.0;z=+(M|0);A=+(O|0);B=P+48|0;C=P+56|0;n=P+64|0;D=P+8|0;E=P+16|0;F=P+24|0;G=P+32|0;H=P+40|0;j=(b|0)==1;if((M|0)<=0)break;e=(O|0)>0;x=0;while(1){v=y+J*(+(x|0)+.5)/z;if(e){w=0;do{u=y+J*(+(w|0)+.5)/A;q=+h[n>>3]+(+h[B>>3]*u+v*+h[C>>3]);if(q==0.0){S=278;break a}X=(+h[E>>3]+(u*+h[P>>3]+v*+h[D>>3]))/q;g[Q>>2]=X;u=(+h[H>>3]+(u*+h[F>>3]+v*+h[G>>3]))/q;g[R>>2]=u;lf(o,X,u,Q,R)|0;u=+g[Q>>2];if(j){s=((~~(u+1.0)|0)/2|0)<<1;t=((~~(+g[R>>2]+1.0)|0)/2|0)<<1}else{s=~~(u+.5);t=~~(+g[R>>2]+.5)}if((s|0)>-1?(t|0)<(m|0)&((t|0)>-1&(s|0)<(l|0)):0){Y=($(t,l)|0)+s<<2;Z=p+(($((x|0)/(K|0)|0,f)|0)+((w|0)/(L|0)|0)<<2)|0;c[Z>>2]=(c[Z>>2]|0)+((((d[k+(Y|1)>>0]|0)+(d[k+Y>>0]|0)+(d[k+(Y|2)>>0]|0)|0)>>>0)/3|0)}w=w+1|0}while((w|0)<(O|0))}x=x+1|0;if((x|0)>=(M|0))break b}}if((n&-3|0)==4){y=u+100.0;z=+(M|0);A=+(O|0);B=P+48|0;C=P+56|0;n=P+64|0;D=P+8|0;E=P+16|0;F=P+24|0;G=P+32|0;H=P+40|0;j=(b|0)==1;if((M|0)<=0)break;e=(O|0)>0;x=0;while(1){v=y+J*(+(x|0)+.5)/z;if(e){w=0;do{u=y+J*(+(w|0)+.5)/A;q=+h[n>>3]+(+h[B>>3]*u+v*+h[C>>3]);if(q==0.0){S=278;break a}X=(+h[E>>3]+(u*+h[P>>3]+v*+h[D>>3]))/q;g[Q>>2]=X;u=(+h[H>>3]+(u*+h[F>>3]+v*+h[G>>3]))/q;g[R>>2]=u;lf(o,X,u,Q,R)|0;u=+g[Q>>2];if(j){s=((~~(u+1.0)|0)/2|0)<<1;t=((~~(+g[R>>2]+1.0)|0)/2|0)<<1}else{s=~~(u+.5);t=~~(+g[R>>2]+.5)}if((s|0)>-1?(t|0)<(m|0)&((t|0)>-1&(s|0)<(l|0)):0){Y=($(t,l)|0)+s<<2;Z=p+(($((x|0)/(K|0)|0,f)|0)+((w|0)/(L|0)|0)<<2)|0;c[Z>>2]=(c[Z>>2]|0)+((((d[k+(Y|2)>>0]|0)+(d[k+(Y|1)>>0]|0)+(d[k+(Y|3)>>0]|0)|0)>>>0)/3|0)}w=w+1|0}while((w|0)<(O|0))}x=x+1|0;if((x|0)>=(M|0))break b}}switch(n|0){case 5:case 12:case 13:case 14:{y=u+100.0;z=+(M|0);A=+(O|0);B=P+48|0;C=P+56|0;n=P+64|0;D=P+8|0;E=P+16|0;F=P+24|0;G=P+32|0;H=P+40|0;j=(b|0)==1;if((M|0)<=0)break b;e=(O|0)>0;x=0;do{v=y+J*(+(x|0)+.5)/z;if(e){w=0;do{u=y+J*(+(w|0)+.5)/A;q=+h[n>>3]+(+h[B>>3]*u+v*+h[C>>3]);if(q==0.0){S=278;break a}X=(+h[E>>3]+(u*+h[P>>3]+v*+h[D>>3]))/q;g[Q>>2]=X;u=(+h[H>>3]+(u*+h[F>>3]+v*+h[G>>3]))/q;g[R>>2]=u;lf(o,X,u,Q,R)|0;u=+g[Q>>2];if(j){s=((~~(u+1.0)|0)/2|0)<<1;t=((~~(+g[R>>2]+1.0)|0)/2|0)<<1}else{s=~~(u+.5);t=~~(+g[R>>2]+.5)}if((s|0)>-1?(t|0)<(m|0)&((t|0)>-1&(s|0)<(l|0)):0){Y=d[k+(($(t,l)|0)+s)>>0]|0;Z=p+(($((x|0)/(K|0)|0,f)|0)+((w|0)/(L|0)|0)<<2)|0;c[Z>>2]=(c[Z>>2]|0)+Y}w=w+1|0}while((w|0)<(O|0))}x=x+1|0}while((x|0)<(M|0));break}case 7:{y=u+100.0;z=+(M|0);A=+(O|0);B=P+48|0;C=P+56|0;n=P+64|0;D=P+8|0;E=P+16|0;F=P+24|0;G=P+32|0;H=P+40|0;j=(b|0)==1;if((M|0)<=0)break b;e=(O|0)>0;x=0;do{v=y+J*(+(x|0)+.5)/z;if(e){w=0;do{u=y+J*(+(w|0)+.5)/A;q=+h[n>>3]+(+h[B>>3]*u+v*+h[C>>3]);if(q==0.0){S=278;break a}X=(+h[E>>3]+(u*+h[P>>3]+v*+h[D>>3]))/q;g[Q>>2]=X;u=(+h[H>>3]+(u*+h[F>>3]+v*+h[G>>3]))/q;g[R>>2]=u;lf(o,X,u,Q,R)|0;u=+g[Q>>2];if(j){s=((~~(u+1.0)|0)/2|0)<<1;t=((~~(+g[R>>2]+1.0)|0)/2|0)<<1}else{s=~~(u+.5);t=~~(+g[R>>2]+.5)}if((s|0)>-1?(t|0)<(m|0)&((t|0)>-1&(s|0)<(l|0)):0){Y=d[k+(($(t,l)|0)+s<<1|1)>>0]|0;Z=p+(($((x|0)/(K|0)|0,f)|0)+((w|0)/(L|0)|0)<<2)|0;c[Z>>2]=(c[Z>>2]|0)+Y}w=w+1|0}while((w|0)<(O|0))}x=x+1|0}while((x|0)<(M|0));break}case 8:{y=u+100.0;z=+(M|0);A=+(O|0);B=P+48|0;C=P+56|0;n=P+64|0;D=P+8|0;E=P+16|0;F=P+24|0;G=P+32|0;H=P+40|0;j=(b|0)==1;if((M|0)<=0)break b;e=(O|0)>0;x=0;do{v=y+J*(+(x|0)+.5)/z;if(e){w=0;do{u=y+J*(+(w|0)+.5)/A;q=+h[n>>3]+(+h[B>>3]*u+v*+h[C>>3]);if(q==0.0){S=278;break a}X=(+h[E>>3]+(u*+h[P>>3]+v*+h[D>>3]))/q;g[Q>>2]=X;u=(+h[H>>3]+(u*+h[F>>3]+v*+h[G>>3]))/q;g[R>>2]=u;lf(o,X,u,Q,R)|0;u=+g[Q>>2];if(j){s=((~~(u+1.0)|0)/2|0)<<1;t=((~~(+g[R>>2]+1.0)|0)/2|0)<<1}else{s=~~(u+.5);t=~~(+g[R>>2]+.5)}if((s|0)>-1?(t|0)<(m|0)&((t|0)>-1&(s|0)<(l|0)):0){Y=d[k+(($(t,l)|0)+s<<1)>>0]|0;Z=p+(($((x|0)/(K|0)|0,f)|0)+((w|0)/(L|0)|0)<<2)|0;c[Z>>2]=(c[Z>>2]|0)+Y}w=w+1|0}while((w|0)<(O|0))}x=x+1|0}while((x|0)<(M|0));break}case 9:{y=u+100.0;z=+(M|0);A=+(O|0);B=P+48|0;C=P+56|0;n=P+64|0;D=P+8|0;E=P+16|0;F=P+24|0;G=P+32|0;H=P+40|0;j=(b|0)==1;if((M|0)<=0)break b;e=(O|0)>0;x=0;do{v=y+J*(+(x|0)+.5)/z;if(e){w=0;do{u=y+J*(+(w|0)+.5)/A;q=+h[n>>3]+(+h[B>>3]*u+v*+h[C>>3]);if(q==0.0){S=278;break a}X=(+h[E>>3]+(u*+h[P>>3]+v*+h[D>>3]))/q;g[Q>>2]=X;u=(+h[H>>3]+(u*+h[F>>3]+v*+h[G>>3]))/q;g[R>>2]=u;lf(o,X,u,Q,R)|0;u=+g[Q>>2];if(j){s=((~~(u+1.0)|0)/2|0)<<1;t=((~~(+g[R>>2]+1.0)|0)/2|0)<<1}else{s=~~(u+.5);t=~~(+g[R>>2]+.5)}if((s|0)>-1?(t|0)<(m|0)&((t|0)>-1&(s|0)<(l|0)):0){Y=($(t,l)|0)+s<<1;I=d[k+Y>>0]|0;Y=d[k+(Y|1)>>0]|0;Z=p+(($((x|0)/(K|0)|0,f)|0)+((w|0)/(L|0)|0)<<2)|0;c[Z>>2]=(c[Z>>2]|0)+((((Y<<3&248|4)+(I&248|4)+(I<<5&224|Y>>>3&28|2)|0)>>>0)/3|0)}w=w+1|0}while((w|0)<(O|0))}x=x+1|0}while((x|0)<(M|0));break}case 10:{y=u+100.0;z=+(M|0);A=+(O|0);B=P+48|0;C=P+56|0;n=P+64|0;D=P+8|0;E=P+16|0;F=P+24|0;G=P+32|0;H=P+40|0;j=(b|0)==1;if((M|0)<=0)break b;e=(O|0)>0;x=0;do{v=y+J*(+(x|0)+.5)/z;if(e){w=0;do{u=y+J*(+(w|0)+.5)/A;q=+h[n>>3]+(+h[B>>3]*u+v*+h[C>>3]);if(q==0.0){S=278;break a}X=(+h[E>>3]+(u*+h[P>>3]+v*+h[D>>3]))/q;g[Q>>2]=X;u=(+h[H>>3]+(u*+h[F>>3]+v*+h[G>>3]))/q;g[R>>2]=u;lf(o,X,u,Q,R)|0;u=+g[Q>>2];if(j){s=((~~(u+1.0)|0)/2|0)<<1;t=((~~(+g[R>>2]+1.0)|0)/2|0)<<1}else{s=~~(u+.5);t=~~(+g[R>>2]+.5)}if((s|0)>-1?(t|0)<(m|0)&((t|0)>-1&(s|0)<(l|0)):0){Y=($(t,l)|0)+s<<1;I=d[k+Y>>0]|0;Y=d[k+(Y|1)>>0]|0;Z=p+(($((x|0)/(K|0)|0,f)|0)+((w|0)/(L|0)|0)<<2)|0;c[Z>>2]=(c[Z>>2]|0)+((((Y<<2&248|4)+(I&248|4)+(I<<5&224|Y>>>3&24|4)|0)>>>0)/3|0)}w=w+1|0}while((w|0)<(O|0))}x=x+1|0}while((x|0)<(M|0));break}case 11:{y=u+100.0;z=+(M|0);A=+(O|0);B=P+48|0;C=P+56|0;n=P+64|0;D=P+8|0;E=P+16|0;F=P+24|0;G=P+32|0;H=P+40|0;j=(b|0)==1;if((M|0)<=0)break b;e=(O|0)>0;x=0;do{v=y+J*(+(x|0)+.5)/z;if(e){w=0;do{u=y+J*(+(w|0)+.5)/A;q=+h[n>>3]+(+h[B>>3]*u+v*+h[C>>3]);if(q==0.0){S=278;break a}X=(+h[E>>3]+(u*+h[P>>3]+v*+h[D>>3]))/q;g[Q>>2]=X;u=(+h[H>>3]+(u*+h[F>>3]+v*+h[G>>3]))/q;g[R>>2]=u;lf(o,X,u,Q,R)|0;u=+g[Q>>2];if(j){s=((~~(u+1.0)|0)/2|0)<<1;t=((~~(+g[R>>2]+1.0)|0)/2|0)<<1}else{s=~~(u+.5);t=~~(+g[R>>2]+.5)}if((s|0)>-1?(t|0)<(m|0)&((t|0)>-1&(s|0)<(l|0)):0){Y=($(t,l)|0)+s<<1;I=d[k+Y>>0]|0;Z=p+(($((x|0)/(K|0)|0,f)|0)+((w|0)/(L|0)|0)<<2)|0;c[Z>>2]=(c[Z>>2]|0)+((((I<<4&240|8)+(I&240|8)+((d[k+(Y|1)>>0]|0)&240|8)|0)>>>0)/3|0)}w=w+1|0}while((w|0)<(O|0))}x=x+1|0}while((x|0)<(M|0));break}default:{Me(3,4615,x);S=278;break a}}}while(0);s=$(K,L)|0;if(N){t=0;do{a[r+t>>0]=((c[p+(t<<2)>>2]|0)>>>0)/(s>>>0)|0;t=t+1|0}while((t|0)<(N|0))}Vj(p);p=0}while(0);if((S|0)==278){Vj(p);p=-1}i=T;return p|0}function Fe(b,e,f,g,j,k,l){b=b|0;e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;v=i;i=i+32|0;p=v+24|0;o=v+8|0;u=v;a:do if((e+-3|0)>>>0>5){c[f>>2]=-1;c[g>>2]=0;h[j>>3]=-1.0;m=-1}else{c[o>>2]=0;t=e+-1|0;c[o+4>>2]=$(t,e)|0;r=$(e,e)|0;c[o+8>>2]=r+-1;c[o+12>>2]=t;n=a[b+(c[o>>2]|0)>>0]|0;m=(n&255)>0?n:0;n=(n&255)<255?n:-1;s=a[b+(c[o+4>>2]|0)>>0]|0;m=(s&255)>(m&255)?s:m;n=(s&255)<(n&255)?s:n;s=a[b+(c[o+8>>2]|0)>>0]|0;m=(s&255)>(m&255)?s:m;n=(s&255)<(n&255)?s:n;s=a[b+(c[o+12>>2]|0)>>0]|0;m=((s&255)>(m&255)?s:m)&255;n=((s&255)<(n&255)?s:n)&255;if((m-n|0)<30){c[f>>2]=-1;c[g>>2]=0;h[j>>3]=-1.0;m=-2;break}q=(m+n|0)>>>1;a[p>>0]=(d[b+(c[o>>2]|0)>>0]|0)>>>0<q>>>0&1;a[p+1>>0]=(d[b+(c[o+4>>2]|0)>>0]|0)>>>0<q>>>0&1;a[p+2>>0]=(d[b+(c[o+8>>2]|0)>>0]|0)>>>0<q>>>0&1;a[p+3>>0]=(d[b+(c[o+12>>2]|0)>>0]|0)>>>0<q>>>0&1;n=0;while(1){m=n+1|0;if(((a[p+n>>0]|0)==1?(a[p+((m|0)%4|0)>>0]|0)==1:0)?(a[p+((n+2|0)%4|0)>>0]|0)==0:0){m=n;n=10;break}if((m|0)<4)n=m;else{n=12;break}}if((n|0)==10)c[g>>2]=m;else if((n|0)==12?(m|0)==4:0){c[f>>2]=-1;c[g>>2]=0;h[j>>3]=-1.0;m=-3;break}if(!r)s=255;else{m=255;n=0;do{s=b+n|0;p=d[s>>0]|0;o=p-q|0;o=(o|0)<0?0-o|0:o;m=(o|0)<(m|0)?o:m;a[s>>0]=p>>>0<q>>>0&1;n=n+1|0}while((n|0)<(r|0));s=m}switch(c[g>>2]|0){case 0:{if((e|0)>0){r=(e|0)==0;n=0;m=0;g=0;do{p=(g|0)==(t|0);q=$(g,e)|0;if(!r){o=0;do{if((o|g|0)!=0?!(p&((o|0)==0|(o|0)==(t|0))):0){n=fk(n|0,m|0,1)|0;n=(a[b+(o+q)>>0]|0)!=0|n;m=D}o=o+1|0}while((o|0)!=(e|0))}g=g+1|0}while((g|0)<(e|0))}else{n=0;m=0}break}case 1:{if((e|0)>0){r=(e|0)>0;n=0;m=0;g=0;do{p=(g|0)==0;q=(g|0)==(t|0);if(r){o=t;while(1){w=(o|0)==(t|0);if(!(p&w)?!(q&(w|(o|0)==0)):0){n=fk(n|0,m|0,1)|0;n=(a[b+(($(o,e)|0)+g)>>0]|0)!=0|n;m=D}if((o|0)>0)o=o+-1|0;else break}}g=g+1|0}while((g|0)<(e|0))}else{n=0;m=0}break}case 2:{if((e|0)>0){r=(e|0)>0;n=0;m=0;g=t;while(1){q=(g|0)==(t|0)|(g|0)==0;p=$(g,e)|0;if(r){o=t;while(1){if(!(q&(o|0)==(t|0)|(o|g|0)==0)){n=fk(n|0,m|0,1)|0;n=(a[b+(o+p)>>0]|0)!=0|n;m=D}if((o|0)>0)o=o+-1|0;else break}}if((g|0)>0)g=g+-1|0;else break}}else{n=0;m=0}break}case 3:{if((e|0)>0){r=(e|0)>0;n=0;m=0;g=t;while(1){p=(g|0)==(t|0);q=(g|0)==0;if(r){o=0;do{if(!(p&(o|0)==0|(o|g|0)==0|q&(o|0)==(t|0))){n=fk(n|0,m|0,1)|0;n=(a[b+(($(o,e)|0)+g)>>0]|0)!=0|n;m=D}o=o+1|0}while((o|0)<(e|0))}if((g|0)>0)g=g+-1|0;else break}}else{n=0;m=0}break}default:{n=0;m=0}}h[j>>3]=(s|0)>30?1.0:+(s|0)/30.0;switch(k|0){case 259:{w=a[4551+n>>0]|0;k=w<<24>>24;l=u;c[l>>2]=k;c[l+4>>2]=((k|0)<0)<<31>>31;if(w<<24>>24<0){c[f>>2]=-1;h[j>>3]=-1.0;m=-4;break a}break}case 515:{m=a[4423+n>>0]|0;k=m<<24>>24;w=u;c[w>>2]=k;c[w+4>>2]=((k|0)<0)<<31>>31;if(l)c[l>>2]=d[4487+n>>0];if(m<<24>>24<0){c[f>>2]=-1;h[j>>3]=-1.0;m=-4;break a}break}case 772:case 1028:{m=Ie(k,n,m,0,u)|0;if((m|0)<0){c[f>>2]=-1;h[j>>3]=-1.0;m=-4;break a}if((l|0)!=0&(m|0)>0)c[l>>2]=m;break}default:{w=u;c[w>>2]=n;c[w+4>>2]=m}}c[f>>2]=c[u>>2];m=0}while(0);i=v;return m|0}function Ge(a,b,e,f,g,j,k){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0,A=0,B=0,C=0,D=0.0;C=i;i=i+16|0;l=C+8|0;n=C;a:do if(!a){c[g>>2]=0;c[j>>2]=0;h[k>>3]=-1.0;b=-1}else switch(b|0){case 0:{o=$(f,f)|0;z=o*3|0;A=Uj(o*12|0)|0;if(!A){Me(3,5472,n);rb(1)}if(!o)b=0;else{b=0;l=0;do{b=((d[e+l>>0]|0)^255)+b|0;l=l+1|0}while((l|0)<(z|0))}l=(b|0)/(z|0)|0;if(!o)m=0.0;else{n=0;b=0;do{x=((d[e+n>>0]|0)^255)-l|0;c[A+(n<<2)>>2]=x;b=($(x,x)|0)+b|0;n=n+1|0}while((n|0)<(z|0));m=+(b|0)}y=+P(+m);if(y/(+(f|0)*1.7320508)<15.0){c[g>>2]=0;c[j>>2]=0;h[k>>3]=-1.0;Vj(A);b=-2;break a}v=c[a>>2]|0;w=a+12|0;x=a+16|0;if((v|0)>0){u=c[a+8>>2]|0;s=(o|0)==0;n=-1;t=0;m=0.0;l=-1;b=-1;do{b:while(1){n=n+1|0;switch(c[u+(n<<2)>>2]|0){case 0:break;case 2:break b;default:{B=17;break b}}}if((B|0)==17){B=0;p=n<<2;q=c[x>>2]|0;r=0;do{a=r+p|0;if(s)o=0;else{e=c[(c[w>>2]|0)+(a<<2)>>2]|0;f=0;o=0;do{o=($(c[e+(f<<2)>>2]|0,c[A+(f<<2)>>2]|0)|0)+o|0;f=f+1|0}while((f|0)<(z|0))}D=+(o|0)/+h[q+(a<<3)>>3]/y;a=D>m;l=a?r:l;b=a?n:b;m=a?D:m;r=r+1|0}while((r|0)!=4)}t=t+1|0}while((t|0)<(v|0))}else{m=0.0;l=-1;b=-1}c[j>>2]=l;c[g>>2]=b;h[k>>3]=m;Vj(A);b=0;break a}case 1:{z=$(f,f)|0;A=Uj(z<<2)|0;if(!A){Me(3,5472,l);rb(1)}if(!z)b=0;else{b=0;l=0;do{b=((d[e+l>>0]|0)^255)+b|0;l=l+1|0}while((l|0)<(z|0))}l=(b|0)/(z|0)|0;if(!z)m=0.0;else{n=0;b=0;do{x=((d[e+n>>0]|0)^255)-l|0;c[A+(n<<2)>>2]=x;b=($(x,x)|0)+b|0;n=n+1|0}while((n|0)<(z|0));m=+(b|0)}y=+P(+m);if(y/+(f|0)<15.0){c[g>>2]=0;c[j>>2]=0;h[k>>3]=-1.0;Vj(A);b=-2;break a}v=c[a>>2]|0;w=a+20|0;x=a+24|0;if((v|0)>0){s=c[a+8>>2]|0;t=(z|0)==0;n=-1;u=0;m=0.0;l=-1;b=-1;do{c:while(1){n=n+1|0;switch(c[s+(n<<2)>>2]|0){case 0:break;case 2:break c;default:{B=37;break c}}}if((B|0)==37){B=0;p=n<<2;q=c[x>>2]|0;r=0;do{a=r+p|0;if(t)o=0;else{e=c[(c[w>>2]|0)+(a<<2)>>2]|0;f=0;o=0;do{o=($(c[e+(f<<2)>>2]|0,c[A+(f<<2)>>2]|0)|0)+o|0;f=f+1|0}while((f|0)<(z|0))}D=+(o|0)/+h[q+(a<<3)>>3]/y;a=D>m;l=a?r:l;b=a?n:b;m=a?D:m;r=r+1|0}while((r|0)!=4)}u=u+1|0}while((u|0)<(v|0))}else{m=0.0;l=-1;b=-1}c[j>>2]=l;c[g>>2]=b;h[k>>3]=m;Vj(A);b=0;break a}default:{b=-1;break a}}while(0);i=C;return b|0}function He(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=Re(8,8)|0;f=Re(8,1)|0;g=Re(8,1)|0;i=c[e>>2]|0;j=c[f>>2]|0;k=0;do{p=a+(k<<4)|0;l=k<<4;h[i+(l<<3)>>3]=+h[p>>3];o=a+(k<<4)+8|0;h[i+((l|1)<<3)>>3]=+h[o>>3];h[i+((l|2)<<3)>>3]=1.0;h[i+((l|3)<<3)>>3]=0.0;h[i+((l|4)<<3)>>3]=0.0;h[i+((l|5)<<3)>>3]=0.0;n=b+(k<<4)|0;h[i+((l|6)<<3)>>3]=-(+h[p>>3]*+h[n>>3]);h[i+((l|7)<<3)>>3]=-(+h[o>>3]*+h[n>>3]);h[i+((l|8)<<3)>>3]=0.0;h[i+((l|9)<<3)>>3]=0.0;h[i+((l|10)<<3)>>3]=0.0;h[i+((l|11)<<3)>>3]=+h[p>>3];h[i+((l|12)<<3)>>3]=+h[o>>3];h[i+((l|13)<<3)>>3]=1.0;m=b+(k<<4)+8|0;h[i+((l|14)<<3)>>3]=-(+h[p>>3]*+h[m>>3]);h[i+((l|15)<<3)>>3]=-(+h[o>>3]*+h[m>>3]);l=k<<1;h[j+(l<<3)>>3]=+h[n>>3];h[j+((l|1)<<3)>>3]=+h[m>>3];k=k+1|0}while((k|0)!=4);_e(e)|0;Xe(g,e,f)|0;p=c[g>>2]|0;h[d>>3]=+h[p>>3];h[d+8>>3]=+h[p+8>>3];h[d+16>>3]=+h[p+16>>3];p=c[g>>2]|0;h[d+24>>3]=+h[p+24>>3];h[d+32>>3]=+h[p+32>>3];h[d+40>>3]=+h[p+40>>3];p=c[g>>2]|0;h[d+48>>3]=+h[p+48>>3];h[d+56>>3]=+h[p+56>>3];h[d+64>>3]=1.0;We(e)|0;We(f)|0;We(g)|0;return}function Ie(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0,I=0;I=i;i=i+2320|0;k=I+2304|0;y=I+864|0;u=I+784|0;H=I+704|0;w=I+624|0;v=I+548|0;G=I+40|0;E=I;switch(b|0){case 772:{g=9;j=1;l=3;break}case 1028:{g=5;j=2;l=3;break}case 2830:{A=900;s=1472;C=64;F=120;z=127;B=g;j=9;l=6;break}default:f=-1}if((l|0)==3){b=0;while(1){a[k+b>>0]=e&1;e=hk(e|0,f|0,1)|0;b=b+1|0;if((b|0)==13)break;else f=D}A=840;s=1408;C=g;F=13;z=15;B=k;l=6}do if((l|0)==6){r=j<<1;k=1;f=0;while(1){g=v+(k<<2)|0;c[g>>2]=0;b=0;e=0;do{if(a[B+e>>0]|0){b=b^c[A+((($(e,k)|0)%(z|0)|0)<<2)>>2];c[g>>2]=b}e=e+1|0}while((e|0)<(F|0));f=(b|0)==0?f:1;c[g>>2]=c[s+(b<<2)>>2];if((k|0)<(r|0))k=k+1|0;else break}x=(f|0)!=0;if(x){c[u>>2]=0;f=c[v+4>>2]|0;c[u+4>>2]=f;c[y>>2]=0;c[y+72>>2]=1;if((r|0)>1){b=1;do{c[y+(b<<2)>>2]=-1;c[y+72+(b<<2)>>2]=0;b=b+1|0}while((b|0)<(r|0))}c[H>>2]=0;c[H+4>>2]=0;c[w>>2]=-1;c[w+4>>2]=0;p=0;q=0;while(1){g=q;q=q+1|0;o=u+(q<<2)|0;if((f|0)==-1){k=g+2|0;c[H+(k<<2)>>2]=p;if((p|0)<0)n=p;else{f=0;while(1){o=y+(q*72|0)+(f<<2)|0;n=c[o>>2]|0;c[y+(k*72|0)+(f<<2)>>2]=n;c[o>>2]=c[s+(n<<2)>>2];if((f|0)<(p|0))f=f+1|0;else{n=p;break}}}}else{b=g;while(1){f=(b|0)>0;if(f&(c[u+(b<<2)>>2]|0)==-1)b=b+-1|0;else break}if(f){e=b;do{f=e;e=e+-1|0;if((c[u+(e<<2)>>2]|0)!=-1)b=(c[w+(b<<2)>>2]|0)<(c[w+(e<<2)>>2]|0)?e:b}while((f|0)>1)}e=H+(b<<2)|0;m=q-b|0;n=m+(c[e>>2]|0)|0;k=g+2|0;n=(p|0)>(n|0)?p:n;c[H+(k<<2)>>2]=n;f=0;do{c[y+(k*72|0)+(f<<2)>>2]=0;f=f+1|0}while((f|0)<(r|0));f=c[e>>2]|0;e=u+(b<<2)|0;if((f|0)>=0){l=0;while(1){g=c[y+(b*72|0)+(l<<2)>>2]|0;if((g|0)!=-1)c[y+(k*72|0)+(m+l<<2)>>2]=c[A+(((g+z+(c[o>>2]|0)-(c[e>>2]|0)|0)%(z|0)|0)<<2)>>2];if((l|0)<(f|0))l=l+1|0;else break}}if((p|0)>=0){f=0;while(1){o=y+(q*72|0)+(f<<2)|0;m=c[o>>2]|0;l=y+(k*72|0)+(f<<2)|0;c[l>>2]=c[l>>2]^m;c[o>>2]=c[s+(m<<2)>>2];if((f|0)<(p|0))f=f+1|0;else break}}}c[w+(k<<2)>>2]=q-n;if((q|0)>=(r|0))break;f=c[v+(k<<2)>>2]|0;if((f|0)==-1)f=0;else f=c[A+(f<<2)>>2]|0;g=u+(k<<2)|0;c[g>>2]=f;if((n|0)>=1){e=1;while(1){b=c[v+(k-e<<2)>>2]|0;if((b|0)!=-1?(t=c[y+(k*72|0)+(e<<2)>>2]|0,(t|0)!=0):0){f=f^c[A+((((c[s+(t<<2)>>2]|0)+b|0)%(z|0)|0)<<2)>>2];c[g>>2]=f}if((e|0)<(n|0))e=e+1|0;else break}}f=c[s+(f<<2)>>2]|0;c[g>>2]=f;if((n|0)>(j|0))break;else p=n}if((n|0)>(j|0)){f=-1;break}if((n|0)>=0){f=0;while(1){w=y+(k*72|0)+(f<<2)|0;c[w>>2]=c[s+(c[w>>2]<<2)>>2];if((f|0)<(n|0))f=f+1|0;else break}}if((n|0)>=1){f=1;while(1){c[E+(f<<2)>>2]=c[y+(k*72|0)+(f<<2)>>2];if((f|0)<(n|0))f=f+1|0;else break}}l=(n|0)<1;f=0;m=1;do{if(l)b=1;else{j=1;b=1;while(1){e=E+(j<<2)|0;g=c[e>>2]|0;if((g|0)!=-1){y=(g+j|0)%(z|0)|0;c[e>>2]=y;b=c[A+(y<<2)>>2]^b}if((j|0)<(n|0))j=j+1|0;else break}}if(!b){c[G+(f<<2)>>2]=z-m;f=f+1|0}m=m+1|0}while((z|0)>=(m|0));if((f|0)!=(n|0)){f=-1;break}if((n|0)>0){f=0;do{E=B+(c[G+(f<<2)>>2]|0)|0;a[E>>0]=d[E>>0]^1;f=f+1|0}while((f|0)<(n|0))}}else k=0;b=h;c[b>>2]=0;c[b+4>>2]=0;b=1;e=0;g=0;j=0;f=F-C|0;while(1){G=ok(d[B+f>>0]|0,0,b|0,e|0)|0;g=gk(G|0,D|0,g|0,j|0)|0;j=D;G=h;c[G>>2]=g;c[G+4>>2]=j;b=fk(b|0,e|0,1)|0;f=f+1|0;if((f|0)>=(F|0))break;else e=D}if(x)f=c[H+(k<<2)>>2]|0;else f=0}while(0);i=I;return f|0}function Je(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0.0;A=i;i=i+32|0;z=A+24|0;g=A+16|0;d=A+8|0;do if(a){if(!b){Me(3,4674,d);d=-1;break}y=a+8|0;f=c[a+4>>2]|0;a:do if((f|0)>0){e=c[y>>2]|0;d=0;do{if(!(c[e+(d<<2)>>2]|0))break a;d=d+1|0}while((d|0)<(f|0))}else d=0;while(0);if((d|0)!=(f|0)){x=Aj(b)|0;if(!x){Me(3,4719,g);d=-1;break}r=a+28|0;s=d<<2;t=a+12|0;u=a+20|0;v=a+16|0;w=a+24|0;f=Gj(x,4742)|0;e=0;b:while(1){q=e+s|0;p=0;b=0;do{n=(p|0)==0;o=(p|0)==2;g=c[r>>2]|0;if((g|0)>0){m=0;do{if((g|0)>0){l=0;do{if(!f){e=17;break b}g=qj(f)|0;f=Gj(0,4742)|0;g=255-g|0;k=((($(c[r>>2]|0,m)|0)+l|0)*3|0)+p|0;c[(c[(c[t>>2]|0)+(q<<2)>>2]|0)+(k<<2)>>2]=g;k=($(c[r>>2]|0,m)|0)+l|0;j=c[(c[u>>2]|0)+(q<<2)>>2]|0;k=j+(k<<2)|0;if(!n){c[k>>2]=(c[k>>2]|0)+g;if(o){k=j+(($(c[r>>2]|0,m)|0)+l<<2)|0;c[k>>2]=(c[k>>2]|0)/3|0}}else c[k>>2]=g;b=g+b|0;l=l+1|0;g=c[r>>2]|0}while((l|0)<(g|0))}m=m+1|0}while((m|0)<(g|0))}p=p+1|0}while((p|0)<3);g=c[r>>2]|0;l=(b|0)/($(g*3|0,g)|0)|0;if(($(g*3|0,g)|0)>0){j=c[(c[t>>2]|0)+(q<<2)>>2]|0;k=0;b=0;do{p=j+(k<<2)|0;g=(c[p>>2]|0)-l|0;c[p>>2]=g;b=($(g,g)|0)+b|0;k=k+1|0;g=c[r>>2]|0}while((k|0)<($(g*3|0,g)|0))}else b=0;B=+P(+(+(b|0)));h[(c[v>>2]|0)+(q<<3)>>3]=B==0.0?1.0e-07:B;if(!($(g,g)|0))b=0;else{g=c[(c[u>>2]|0)+(q<<2)>>2]|0;j=0;b=0;do{o=g+(j<<2)|0;p=(c[o>>2]|0)-l|0;c[o>>2]=p;b=($(p,p)|0)+b|0;j=j+1|0;p=c[r>>2]|0}while((j|0)<($(p,p)|0))}B=+P(+(+(b|0)));h[(c[w>>2]|0)+(q<<3)>>3]=B==0.0?1.0e-07:B;e=e+1|0;if((e|0)>=4){e=32;break}}if((e|0)==17){Me(3,4747,z);Vj(x);d=-1;break}else if((e|0)==32){Vj(x);c[(c[y>>2]|0)+(d<<2)>>2]=1;c[a>>2]=(c[a>>2]|0)+1;break}}else d=-1}else{Me(3,4649,A);d=-1}while(0);i=A;return d|0}function Ke(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;k=i;i=i+32|0;j=k+16|0;h=k+8|0;e=k;g=_i(d,4854)|0;do if(g){dj(g,0,2)|0;e=gj(g)|0;dj(g,0,0)|0;f=Uj(e+1|0)|0;if(!f){Me(3,5472,h);Wi(g)|0;e=-1;break}h=aj(f,e,1,g)|0;Wi(g)|0;if(!h){c[j>>2]=d;Me(3,4820,j);Vj(f);e=-1;break}else{a[f+e>>0]=0;e=Je(b,f)|0;Vj(f);break}}else{c[e>>2]=d;Me(3,4774,e);e=-1}while(0);i=k;return e|0}function Le(a,b){a=a|0;b=b|0;b=(c[a+8>>2]|0)+(b<<2)|0;if(!(c[b>>2]|0))b=-1;else{c[b>>2]=0;c[a>>2]=(c[a>>2]|0)+-1;b=1}return b|0}function Me(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;j=i;i=i+32|0;h=j+16|0;f=j;c[h>>2]=0;if(((d|0)!=0&(c[496]|0)<=(b|0)?(a[d>>0]|0)!=0:0)?(c[f>>2]=e,g=lj(h,d,f)|0,(g|0)>-1):0){f=c[497]|0;do if(f){if(!(c[498]|0)){Wb[f&15](c[h>>2]|0);break}e=gb()|0;b=c[500]|0;if((e|0)==(c[499]|0)){if((b|0)>0){Wb[f&15](c[502]|0);c[500]=0;f=c[497]|0}Wb[f&15](c[h>>2]|0);break}f=c[501]|0;if((b|0)<(f|0)){d=(c[502]|0)+b|0;if((g|0)<(-3-b+f|0)){yj(d,c[h>>2]|0)|0;c[500]=(c[500]|0)+g;break}else{a[d>>0]=46;a[d+1>>0]=46;a[d+2>>0]=46;a[d+3>>0]=0;c[500]=c[501];break}}}else $i(c[h>>2]|0,c[659]|0)|0;while(0);Vj(c[h>>2]|0)}i=j;return}function Ne(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,i=0;i=0;do{d=a+(i<<5)|0;e=a+(i<<5)+8|0;f=a+(i<<5)+16|0;g=0;do{h[c+(i<<5)+(g<<3)>>3]=+h[d>>3]*+h[b+(g<<3)>>3]+ +h[e>>3]*+h[b+32+(g<<3)>>3]+ +h[f>>3]*+h[b+64+(g<<3)>>3];g=g+1|0}while((g|0)!=4);g=c+(i<<5)+24|0;h[g>>3]=+h[a+(i<<5)+24>>3]+ +h[g>>3];i=i+1|0}while((i|0)!=3);return 0}function Oe(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0;j=Re(4,4)|0;d=c[j>>2]|0;e=c[j>>2]|0;f=c[j>>2]|0;g=c[j>>2]|0;i=0;do{k=i<<2;h[d+(k<<3)>>3]=+h[a+(i<<5)>>3];h[e+(1+k<<3)>>3]=+h[a+(i<<5)+8>>3];h[f+(2+k<<3)>>3]=+h[a+(i<<5)+16>>3];h[g+(3+k<<3)>>3]=+h[a+(i<<5)+24>>3];i=i+1|0}while((i|0)!=3);d=c[j>>2]|0;e=d+96|0;c[e>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;c[e+16>>2]=0;c[e+20>>2]=0;h[d+120>>3]=1.0;_e(j)|0;d=c[j>>2]|0;e=c[j>>2]|0;f=c[j>>2]|0;g=c[j>>2]|0;i=0;do{k=i<<2;h[b+(i<<5)>>3]=+h[d+(k<<3)>>3];h[b+(i<<5)+8>>3]=+h[e+(1+k<<3)>>3];h[b+(i<<5)+16>>3]=+h[f+(2+k<<3)>>3];h[b+(i<<5)+24>>3]=+h[g+(3+k<<3)>>3];i=i+1|0}while((i|0)!=3);We(j)|0;return 0}function Pe(a){a=a|0;switch(a|0){case 1:case 0:{a=3;break}case 6:case 4:case 3:case 2:{a=4;break}case 14:case 13:case 12:case 5:{a=1;break}case 11:case 10:case 9:case 8:case 7:{a=2;break}default:a=0}return a|0}function Qe(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;var f=0;do if((b|0)!=0&(c|0)!=0&(d|0)!=0){f=Ej(c,47)|0;if(!f){a[b>>0]=0;break}f=f+((e|0)!=0&1)-c|0;if((f+1|0)>>>0<=d>>>0){Dj(b,c,f)|0;a[b+f>>0]=0}else b=0}else b=0;while(0);return b|0}function Re(a,b){a=a|0;b=b|0;var d=0,e=0;d=Uj(12)|0;do if(d){e=Uj($(a<<3,b)|0)|0;c[d>>2]=e;if(!e){Vj(d);d=0;break}else{c[d+4>>2]=a;c[d+8>>2]=b;break}}else d=0;while(0);return d|0}function Se(a){a=a|0;var b=0;b=Re(c[a+4>>2]|0,c[a+8>>2]|0)|0;if(b){if((Ve(b,a)|0)<0){We(b)|0;b=0}}else b=0;return b|0}function Te(a,b){a=a|0;b=b|0;var d=0;d=Re(c[a+4>>2]|0,c[b+8>>2]|0)|0;if(d){if((Xe(d,a,b)|0)<0){We(d)|0;d=0}}else d=0;return d|0}function Ue(a){a=a|0;var b=0;b=Re(c[a+8>>2]|0,c[a+4>>2]|0)|0;if(b){if(($e(b,a)|0)<0){We(b)|0;b=0}}else b=0;return b|0}function Ve(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0;d=c[a+4>>2]|0;if((d|0)==(c[b+4>>2]|0)?(j=c[a+8>>2]|0,(j|0)==(c[b+8>>2]|0)):0)if((d|0)>0){e=(j|0)>0;l=0;do{f=$(j,l)|0;if(e){g=c[b>>2]|0;i=c[a>>2]|0;k=0;do{m=f+k|0;h[i+(m<<3)>>3]=+h[g+(m<<3)>>3];k=k+1|0}while((k|0)<(j|0))}l=l+1|0}while((l|0)<(d|0));d=0}else d=0;else d=-1;return d|0}function We(a){a=a|0;if(a){Vj(c[a>>2]|0);Vj(a)}return 0}function Xe(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;n=c[b+8>>2]|0;if(((n|0)==(c[d+4>>2]|0)?(r=c[a+4>>2]|0,(r|0)==(c[b+4>>2]|0)):0)?(o=c[a+8>>2]|0,(o|0)==(c[d+8>>2]|0)):0){s=(o|0)>0?o:0;if((r|0)>0){p=(o|0)>0;q=(n|0)>0;k=c[a>>2]|0;m=0;while(1){a=$(n,m)|0;if(p){f=0;l=k;while(1){h[l>>3]=0.0;if(q){e=0.0;g=0;i=(c[b>>2]|0)+(a<<3)|0;j=(c[d>>2]|0)+(f<<3)|0;while(1){e=e+ +h[i>>3]*+h[j>>3];h[l>>3]=e;g=g+1|0;if((g|0)>=(n|0))break;else{i=i+8|0;j=j+(o<<3)|0}}}f=f+1|0;if((f|0)>=(o|0))break;else l=l+8|0}}m=m+1|0;if((m|0)>=(r|0)){a=0;break}else k=k+(s<<3)|0}}else a=0}else a=-1;return a|0}function Ye(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0.0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0,t=0,u=0;q=c[a+4>>2]|0;s=c[a+8>>2]|0;f=(q|0)<(s|0)?q:s;a:do if(((((!((q|0)<2|(s|0)<2)?(c[b+8>>2]|0)==(s|0):0)?(c[b+4>>2]|0)==(f|0):0)?(t=d+4|0,(c[t>>2]|0)==(f|0)):0)?(g=e+4|0,(c[g>>2]|0)==(s|0)):0)?(u=Se(a)|0,(u|0)!=0):0){r=+P(+(+(q|0)));o=c[u+4>>2]|0;p=c[u+8>>2]|0;if(!((o|0)<1|(p|0)<1)?(c[g>>2]|0)==(p|0):0){if(p){f=c[e>>2]|0;a=0;do{h[f+(a<<3)>>3]=0.0;a=a+1|0}while((a|0)!=(p|0))}n=c[u>>2]|0;if(o){f=(p|0)==0;a=0;j=n;while(1){if(!f){g=0;k=j;l=c[e>>2]|0;while(1){h[l>>3]=+h[k>>3]+ +h[l>>3];g=g+1|0;if((g|0)==(p|0))break;else{k=k+8|0;l=l+8|0}}}a=a+1|0;if((a|0)==(o|0))break;else j=j+(p<<3)|0}}i=+(o|0);if(p){f=c[e>>2]|0;a=0;do{m=f+(a<<3)|0;h[m>>3]=+h[m>>3]/i;a=a+1|0}while((a|0)!=(p|0))}l=(p|0)>0?p:0;if((o|0)>0){f=(p|0)>0;a=0;j=n;while(1){if(f){g=0;k=j;m=c[e>>2]|0;while(1){h[k>>3]=+h[k>>3]-+h[m>>3];g=g+1|0;if((g|0)>=(p|0))break;else{k=k+8|0;m=m+8|0}}}a=a+1|0;if((a|0)>=(o|0))break;else j=j+(l<<3)|0}}f=$(s,q)|0;if((f|0)>0){a=0;do{e=n+(a<<3)|0;h[e>>3]=+h[e>>3]/r;a=a+1|0}while((a|0)<(f|0))}f=Ze(u,b,d)|0;We(u)|0;j=c[t>>2]|0;if((j|0)>0){a=c[d>>2]|0;g=0;i=0.0;do{i=i+ +h[a+(g<<3)>>3];g=g+1|0}while((g|0)<(j|0))}else i=0.0;if((j|0)<=0)break;a=c[d>>2]|0;g=0;while(1){d=a+(g<<3)|0;h[d>>3]=+h[d>>3]/i;g=g+1|0;if((g|0)>=(j|0))break a}}We(u)|0;f=-1}else f=-1;while(0);return f|0}function Ze(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0.0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0,s=0,t=0,u=0.0,v=0.0,w=0,x=0.0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,Q=0,R=0,S=0,T=0,U=0,V=0.0,W=0.0,X=0.0,Y=0,Z=0;U=i;i=i+16|0;w=U;F=a+4|0;I=c[F>>2]|0;J=a+8|0;K=c[J>>2]|0;S=(K|0)<(I|0)?K:I;a:do if(((!((I|0)<2|(K|0)<2)?(R=b+8|0,(c[R>>2]|0)==(K|0)):0)?(L=b+4|0,(c[L>>2]|0)==(S|0)):0)?(M=d+4|0,(c[M>>2]|0)==(S|0)):0){T=Re(S,S)|0;N=T+4|0;if((c[N>>2]|0)==(S|0)?(Q=T+8|0,(c[Q>>2]|0)==(S|0)):0){G=(I|0)<(K|0);s=c[F>>2]|0;t=c[J>>2]|0;if(G){if((S|0)!=(s|0)){We(T)|0;e=-1;break}g=c[T>>2]|0;if((S|0)>0){m=(S|0)==0;j=(t|0)>0;n=0;r=g;while(1){l=$(n,t)|0;if(!m){p=0;s=r;while(1){if((p|0)>=(n|0)){e=c[a>>2]|0;h[s>>3]=0.0;if(j){k=0.0;o=e+(l<<3)|0;e=e+(($(p,t)|0)<<3)|0;f=0;while(1){k=k+ +h[o>>3]*+h[e>>3];h[s>>3]=k;f=f+1|0;if((f|0)>=(t|0))break;else{o=o+8|0;e=e+8|0}}}}else h[s>>3]=+h[g+(($(p,S)|0)+n<<3)>>3];p=p+1|0;if((p|0)==(S|0))break;else s=s+8|0}}n=n+1|0;if((n|0)>=(S|0))break;else r=r+(S<<3)|0}}}else{if((S|0)!=(t|0)){We(T)|0;e=-1;break}g=c[T>>2]|0;if((S|0)>0){l=(S|0)==0;j=(s|0)>0;m=0;p=g;while(1){if(!l){o=0;r=p;while(1){if((o|0)>=(m|0)){e=c[a>>2]|0;h[r>>3]=0.0;if(j){k=0.0;n=e+(m<<3)|0;e=e+(o<<3)|0;f=0;while(1){k=k+ +h[n>>3]*+h[e>>3];h[r>>3]=k;f=f+1|0;if((f|0)>=(s|0))break;else{n=n+(S<<3)|0;e=e+(S<<3)|0}}}}else h[r>>3]=+h[g+(($(o,S)|0)+m<<3)>>3];o=o+1|0;if((o|0)==(S|0))break;else r=r+8|0}}m=m+1|0;if((m|0)>=(S|0))break;else p=p+(S<<3)|0}}}do if(((S|0)>=2?(c[M>>2]|0)==(S|0):0)?(H=nf(S)|0,(H|0)!=0):0){E=S+-1|0;c[w+4>>2]=E;c[w>>2]=(c[H>>2]|0)+8;if((rf(T,d,w)|0)<0){of(H)|0;break}B=c[H>>2]|0;h[B>>3]=0.0;if((E|0)>0){C=(S|0)==0;D=E;do{f=D;while(1){if((f|0)<=0)break;v=+O(+(+h[B+(f<<3)>>3]));e=f+-1|0;A=c[d>>2]|0;x=+O(+(+h[A+(e<<3)>>3]));if(v>(x+ +O(+(+h[A+(f<<3)>>3])))*1.0e-06)f=e;else break}y=D;D=D+-1|0;b:do if((f|0)!=(y|0)){o=B+(y<<3)|0;p=B+(f+1<<3)|0;r=(f|0)<(y|0);z=0;do{if((z|0)>99)break b;z=z+1|0;s=c[d>>2]|0;t=s+(D<<3)|0;w=s+(y<<3)|0;k=+h[w>>3];q=(+h[t>>3]-k)*.5;u=+h[o>>3];u=u*u;v=+P(+(u+q*q));if(r){A=f;q=+h[s+(f<<3)>>3]-k+u/(q+(q<0.0?-v:v));u=+h[p>>3];while(1){k=+O(+q);do if(!(k>=+O(+u))){v=-q/u;x=1.0/+P(+(v*v+1.0));v=v*x}else{if(!(k>1.0e-16)){v=1.0;x=0.0;break}k=-u/q;x=1.0/+P(+(k*k+1.0));v=x;x=k*x}while(0);j=s+(A<<3)|0;X=+h[j>>3];n=A;A=A+1|0;l=s+(A<<3)|0;W=+h[l>>3];k=X-W;m=B+(A<<3)|0;V=x*(x*k+v*2.0*+h[m>>3]);h[j>>3]=X-V;h[l>>3]=W+V;if((n|0)>(f|0)){l=B+(n<<3)|0;h[l>>3]=v*+h[l>>3]-u*x}X=+h[m>>3];h[m>>3]=X+x*(v*k-x*2.0*X);j=$(n,S)|0;l=$(A,S)|0;if(C)k=u;else{e=c[T>>2]|0;g=0;do{Z=e+(g+j<<3)|0;q=+h[Z>>3];Y=e+(g+l<<3)|0;k=+h[Y>>3];h[Z>>3]=v*q-x*k;h[Y>>3]=x*q+v*k;g=g+1|0}while((g|0)!=(S|0))}if((n|0)<(D|0)){q=+h[m>>3];Z=B+(n+2<<3)|0;k=+h[Z>>3];h[Z>>3]=v*k;k=-(x*k)}if((A|0)>=(y|0))break;else u=k}}W=+O(+(+h[o>>3]));X=+O(+(+h[t>>3]))}while(W>(X+ +O(+(+h[w>>3])))*1.0e-06)}while(0)}while((y|0)>1)}if(E){l=c[d>>2]|0;m=c[T>>2]|0;n=(S|0)==0;o=0;do{g=l+(o<<3)|0;q=+h[g>>3];j=o;o=o+1|0;if((o|0)<(S|0)){e=j;f=o;k=q;do{X=+h[l+(f<<3)>>3];Z=X>k;k=Z?X:k;e=Z?f:e;f=f+1|0}while((f|0)<(S|0))}else{e=j;k=q}h[l+(e<<3)>>3]=q;h[g>>3]=k;if(!n){g=0;f=m+(($(e,S)|0)<<3)|0;e=m+(($(j,S)|0)<<3)|0;while(1){X=+h[f>>3];h[f>>3]=+h[e>>3];h[e>>3]=X;g=g+1|0;if((g|0)==(S|0))break;else{f=f+8|0;e=e+8|0}}}}while((o|0)!=(E|0))}of(H)|0;c:do if(!G){g=c[b>>2]|0;p=(I|0)>(K|0)?K:I;d:do if((S|0)>0){m=c[d>>2]|0;n=(p|0)==0;e=0;o=c[T>>2]|0;do{if(+h[m+(e<<3)>>3]<1.0e-16)break d;if(!n){f=0;j=o;l=g;while(1){h[l>>3]=+h[j>>3];f=f+1|0;if((f|0)==(p|0))break;else{j=j+8|0;l=l+8|0}}}o=o+(p<<3)|0;g=g+(p<<3)|0;e=e+1|0}while((e|0)<(S|0))}else e=0;while(0);n=(p|0)>0?p:0;if((e|0)<(S|0)){l=c[d>>2]|0;m=(S|0)>0;while(1){h[l+(e<<3)>>3]=0.0;if(m){f=0;j=g;while(1){h[j>>3]=0.0;f=f+1|0;if((f|0)>=(S|0))break;else j=j+8|0}}e=e+1|0;if((e|0)>=(S|0))break;else g=g+(n<<3)|0}}}else{w=c[F>>2]|0;t=c[J>>2]|0;do if(!((w|0)<1|(t|0)<1)){if((c[N>>2]|0)!=(w|0))break;if((c[Q>>2]|0)!=(w|0))break;if((c[L>>2]|0)!=(w|0))break;if((c[R>>2]|0)!=(t|0))break;if((c[M>>2]|0)!=(w|0))break;f=c[b>>2]|0;e:do if((w|0)>0){p=c[d>>2]|0;s=(t|0)==0;r=(w|0)==0;e=0;do{k=+h[p+(e<<3)>>3];if(k<1.0e-16)break e;q=1.0/+P(+(+O(+k)));m=$(e,w)|0;if(!s){n=0;o=f;while(1){if(r)k=0.0;else{g=0;j=(c[T>>2]|0)+(m<<3)|0;l=(c[a>>2]|0)+(n<<3)|0;k=0.0;while(1){k=k+ +h[j>>3]*+h[l>>3];g=g+1|0;if((g|0)==(w|0))break;else{j=j+8|0;l=l+(t<<3)|0}}}h[o>>3]=q*k;n=n+1|0;if((n|0)==(t|0))break;else o=o+8|0}}f=f+(t<<3)|0;e=e+1|0}while((e|0)<(w|0))}else e=0;while(0);n=(t|0)>0?t:0;if((e|0)>=(w|0))break c;l=c[d>>2]|0;m=(t|0)>0;g=f;while(1){h[l+(e<<3)>>3]=0.0;if(m){f=0;j=g;while(1){h[j>>3]=0.0;f=f+1|0;if((f|0)>=(t|0))break;else j=j+8|0}}e=e+1|0;if((e|0)>=(w|0))break c;else g=g+(n<<3)|0}}while(0);We(T)|0;e=-1;break a}while(0);We(T)|0;e=0;break a}while(0);We(T)|0;e=-1;break}We(T)|0;e=-1}else e=-1;while(0);i=U;return e|0}function _e(a){a=a|0;var b=0,d=0,e=0,f=0.0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0.0,x=0;v=i;i=i+2e3|0;u=v;b=c[a>>2]|0;t=c[a+4>>2]|0;a:do if((t|0)<=500){switch(t|0){case 0:{b=0;break a}case 1:{h[b>>3]=1.0/+h[b>>3];break a}default:{}}if((t|0)>0){a=0;do{c[u+(a<<2)>>2]=a;a=a+1|0}while((a|0)<(t|0))}s=b+(t+-1<<3)|0;if((t|0)>0){m=(t|0)==0;p=(t|0)==1;o=(t|0)==0;n=(t|0)==1;q=s;a=0;r=0;while(1){l=b+(($(r,t)|0)<<3)|0;if((r|0)<(t|0)){e=r;f=0.0;d=l;while(1){w=+O(+(+h[d>>3]));k=f<w;a=k?e:a;f=k?w:f;e=e+1|0;if((e|0)>=(t|0))break;else d=d+(t<<3)|0}}else f=0.0;if(f<=1.0e-10){b=0;break a}g=u+(a<<2)|0;j=c[g>>2]|0;k=u+(r<<2)|0;c[g>>2]=c[k>>2];c[k>>2]=j;if(!m){d=0;e=b+(($(a,t)|0)<<3)|0;g=l;while(1){w=+h[e>>3];h[e>>3]=+h[g>>3];h[g>>3]=w;d=d+1|0;if((d|0)==(t|0))break;else{e=e+8|0;g=g+8|0}}}f=+h[l>>3];if(!p){d=1;e=l;do{k=e;e=e+8|0;h[k>>3]=+h[e>>3]/f;d=d+1|0}while((d|0)!=(t|0))}h[q>>3]=1.0/f;if(!o){g=0;j=s;while(1){if((g|0)!=(r|0)){d=b+(($(g,t)|0)<<3)|0;f=+h[d>>3];if(!n){k=1;e=l;while(1){x=d;d=d+8|0;h[x>>3]=+h[d>>3]-f*+h[e>>3];k=k+1|0;if((k|0)==(t|0))break;else e=e+8|0}}h[j>>3]=-(f*+h[q>>3])}g=g+1|0;if((g|0)==(t|0))break;else j=j+(t<<3)|0}}r=r+1|0;if((r|0)>=(t|0))break;else q=q+(t<<3)|0}}if((t|0)>0){g=(t|0)>0;j=0;do{a=u+(j<<2)|0;b:do if((j|0)<(t|0)){d=j;do{if((c[a>>2]|0)==(j|0))break b;d=d+1|0;a=u+(d<<2)|0}while((d|0)<(t|0))}else d=j;while(0);c[a>>2]=c[u+(j<<2)>>2];if(g){e=0;a=b+(d<<3)|0;d=b+(j<<3)|0;while(1){w=+h[a>>3];h[a>>3]=+h[d>>3];h[d>>3]=w;e=e+1|0;if((e|0)>=(t|0))break;else{a=a+(t<<3)|0;d=d+(t<<3)|0}}}j=j+1|0}while((j|0)<(t|0))}}else b=0;while(0);i=v;return ((b|0)==0)<<31>>31|0}function $e(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,l=0;i=c[a+4>>2]|0;if((i|0)==(c[b+8>>2]|0)?(k=c[a+8>>2]|0,(k|0)==(c[b+4>>2]|0)):0){l=(k|0)>0?k:0;if((i|0)>0){j=(k|0)>0;e=c[a>>2]|0;g=0;while(1){if(j){a=0;d=(c[b>>2]|0)+(g<<3)|0;f=e;while(1){h[f>>3]=+h[d>>3];a=a+1|0;if((a|0)>=(k|0))break;else{d=d+(i<<3)|0;f=f+8|0}}}g=g+1|0;if((g|0)>=(i|0)){a=0;break}else e=e+(l<<3)|0}}else a=0}else a=-1;return a|0}function af(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,g=0.0,i=0;f=+(b|0)/+(c[a>>2]|0);g=+(d|0)/+(c[a+4>>2]|0);c[e>>2]=b;c[e+4>>2]=d;b=0;do{h[e+8+(b<<3)>>3]=f*+h[a+8+(b<<3)>>3];h[e+40+(b<<3)>>3]=g*+h[a+40+(b<<3)>>3];h[e+72+(b<<3)>>3]=+h[a+72+(b<<3)>>3];b=b+1|0}while((b|0)!=4);b=c[a+176>>2]|0;switch(b|0){case 4:{h[e+104>>3]=+h[a+104>>3];h[e+112>>3]=+h[a+112>>3];h[e+120>>3]=+h[a+120>>3];h[e+128>>3]=+h[a+128>>3];h[e+136>>3]=f*+h[a+136>>3];h[e+144>>3]=g*+h[a+144>>3];h[e+152>>3]=f*+h[a+152>>3];h[e+160>>3]=g*+h[a+160>>3];h[e+168>>3]=+h[a+168>>3];i=8;break}case 3:{h[e+104>>3]=f*+h[a+104>>3];h[e+112>>3]=g*+h[a+112>>3];h[e+120>>3]=+h[a+120>>3];h[e+128>>3]=+h[a+128>>3];h[e+136>>3]=+h[a+136>>3]/(f*g);h[e+144>>3]=+h[a+144>>3]/(g*(f*f*g));i=8;break}case 2:{h[e+104>>3]=f*+h[a+104>>3];h[e+112>>3]=g*+h[a+112>>3];h[e+120>>3]=+h[a+120>>3];h[e+128>>3]=+h[a+128>>3]/(f*g);h[e+136>>3]=+h[a+136>>3]/(g*(f*f*g));i=8;break}case 1:{h[e+104>>3]=f*+h[a+104>>3];h[e+112>>3]=g*+h[a+112>>3];h[e+120>>3]=+h[a+120>>3];h[e+128>>3]=+h[a+128>>3]/(f*g);i=8;break}default:b=-1}if((i|0)==8){c[e+176>>2]=b;b=0}return b|0}function bf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0.0,j=0,k=0.0,l=0,m=0,n=0,o=0.0,p=0.0,q=0,r=0,s=0.0,t=0,u=0,v=0,w=0,x=0.0;f=i;i=i+96|0;e=f;if(!(+h[a+88>>3]>=0.0)){d=0;do{h[e+(d<<5)>>3]=-+h[a+(d<<5)>>3];h[e+(d<<5)+8>>3]=-+h[a+(d<<5)+8>>3];h[e+(d<<5)+16>>3]=-+h[a+(d<<5)+16>>3];h[e+(d<<5)+24>>3]=-+h[a+(d<<5)+24>>3];d=d+1|0}while((d|0)!=3)}else{d=0;do{h[e+(d<<5)>>3]=+h[a+(d<<5)>>3];h[e+(d<<5)+8>>3]=+h[a+(d<<5)+8>>3];h[e+(d<<5)+16>>3]=+h[a+(d<<5)+16>>3];h[e+(d<<5)+24>>3]=+h[a+(d<<5)+24>>3];d=d+1|0}while((d|0)!=3)}h[b>>3]=0.0;h[b+8>>3]=0.0;h[b+16>>3]=0.0;h[b+24>>3]=0.0;h[b+32>>3]=0.0;h[b+40>>3]=0.0;h[b+48>>3]=0.0;h[b+56>>3]=0.0;h[b+64>>3]=0.0;h[b+72>>3]=0.0;h[b+80>>3]=0.0;h[b+88>>3]=0.0;g=+h[e+64>>3];o=+h[e+72>>3];p=+h[e+80>>3];x=+P(+(g*g+o*o+p*p));a=b+80|0;h[a>>3]=x;x=g/x;v=c+64|0;h[v>>3]=x;o=o/+h[a>>3];t=c+72|0;h[t>>3]=o;p=p/+h[a>>3];q=c+80|0;h[q>>3]=p;n=c+88|0;h[n>>3]=+h[e+88>>3]/+h[a>>3];g=+h[e+32>>3];k=+h[e+40>>3];s=+h[e+48>>3];p=x*g+o*k+p*s;m=b+48|0;h[m>>3]=p;g=g-p*+h[v>>3];k=k-p*+h[t>>3];p=s-p*+h[q>>3];s=+P(+(g*g+k*k+p*p));l=b+40|0;h[l>>3]=s;w=c+32|0;h[w>>3]=g/s;u=c+40|0;h[u>>3]=k/+h[l>>3];r=c+48|0;h[r>>3]=p/+h[l>>3];p=+h[e>>3];k=+h[e+8>>3];s=+h[e+16>>3];g=+h[v>>3]*p+ +h[t>>3]*k+ +h[q>>3]*s;d=b+16|0;h[d>>3]=g;o=+h[w>>3]*p+ +h[u>>3]*k+ +h[r>>3]*s;j=b+8|0;h[j>>3]=o;p=p-o*+h[w>>3]-g*+h[v>>3];k=k-o*+h[u>>3]-g*+h[t>>3];g=s-o*+h[r>>3]-g*+h[q>>3];o=+P(+(p*p+k*k+g*g));h[b>>3]=o;h[c>>3]=p/o;h[c+8>>3]=k/+h[b>>3];h[c+16>>3]=g/+h[b>>3];g=+h[n>>3];k=(+h[e+56>>3]-+h[m>>3]*g)/+h[l>>3];h[c+56>>3]=k;h[c+24>>3]=(+h[e+24>>3]-k*+h[j>>3]-+h[d>>3]*g)/+h[b>>3];d=0;do{w=b+(d<<5)|0;h[w>>3]=+h[w>>3]/+h[a>>3];w=b+(d<<5)+8|0;h[w>>3]=+h[w>>3]/+h[a>>3];w=b+(d<<5)+16|0;h[w>>3]=+h[w>>3]/+h[a>>3];d=d+1|0}while((d|0)!=3);i=f;return 0}function cf(a,b,c,d,e,f){a=a|0;b=+b;c=+c;d=d|0;e=e|0;f=f|0;var g=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0;switch(f|0){case 4:{q=+h[a>>3];r=+h[a+8>>3];s=+h[a+16>>3];t=+h[a+24>>3];y=+h[a+32>>3];v=+h[a+40>>3];w=+h[a+48>>3];x=+h[a+56>>3];u=+h[a+64>>3];p=(b-w)/y;j=(c-x)/v;c=p*p;i=j*j;k=s*2.0;l=t*6.0;m=t*2.0;n=s*6.0;a:do if(i!=0.0|c!=0.0){f=1;g=p;b=j;while(1){C=i+c;B=q*C+1.0+C*(r*C);z=c*3.0;A=i*z;g=g-(t*(C+c*2.0)+(b*(k*g)+g*B)-p)/(l*g+(k*b+(q*(i+z)+1.0+r*(i*i+(c*(c*5.0)+A)))));z=m*g;b=b-(s*(i*2.0+C)+b*B+b*z-j)/(n*b+(q*(c+i*3.0)+1.0+r*(i*(i*5.0)+(c*c+A)))+z);if((f|0)==4)break a;c=g*g;i=b*b;if(!(i!=0.0|c!=0.0)){g=0.0;b=0.0;break}else f=f+1|0}}else{g=0.0;b=0.0}while(0);h[d>>3]=w+y*g/u;h[e>>3]=x+v*b/u;f=0;break}case 3:{p=+h[a>>3];g=(b-p)/+h[a+24>>3];o=a+8|0;b=c-+h[o>>3];j=+h[a+32>>3]/1.0e8;k=+h[a+40>>3]/1.0e8/1.0e5;c=g*g+b*b;l=+P(+c);m=j*3.0;n=k*5.0;b:do if(l!=0.0){f=1;i=l;while(1){C=i-(i*(1.0-j*c-c*(k*c))-l)/(1.0-m*c-c*(n*c));g=g*C/i;b=b*C/i;if((f|0)==3)break b;c=g*g+b*b;i=+P(+c);if(!(i!=0.0)){g=0.0;b=0.0;break}else f=f+1|0}}else{g=0.0;b=0.0}while(0);f=a+16|0;h[d>>3]=g/+h[f>>3]+p;h[e>>3]=b/+h[f>>3]+ +h[o>>3];f=0;break}case 2:{p=+h[a>>3];g=b-p;o=a+8|0;b=c-+h[o>>3];j=+h[a+24>>3]/1.0e8;k=+h[a+32>>3]/1.0e8/1.0e5;c=g*g+b*b;l=+P(+c);m=j*3.0;n=k*5.0;c:do if(l!=0.0){f=1;i=l;while(1){C=i-(i*(1.0-j*c-c*(k*c))-l)/(1.0-m*c-c*(n*c));g=g*C/i;b=b*C/i;if((f|0)==3)break c;c=g*g+b*b;i=+P(+c);if(!(i!=0.0)){g=0.0;b=0.0;break}else f=f+1|0}}else{g=0.0;b=0.0}while(0);f=a+16|0;h[d>>3]=g/+h[f>>3]+p;h[e>>3]=b/+h[f>>3]+ +h[o>>3];f=0;break}case 1:{m=+h[a>>3];g=b-m;o=a+8|0;b=c-+h[o>>3];j=+h[a+24>>3]/1.0e8;c=g*g+b*b;k=+P(+c);l=j*3.0;d:do if(k!=0.0){f=1;i=k;while(1){C=i-(i*(1.0-j*c)-k)/(1.0-l*c);g=g*C/i;b=b*C/i;if((f|0)==3)break d;c=g*g+b*b;i=+P(+c);if(!(i!=0.0)){g=0.0;b=0.0;break}else f=f+1|0}}else{g=0.0;b=0.0}while(0);f=a+16|0;h[d>>3]=g/+h[f>>3]+m;h[e>>3]=b/+h[f>>3]+ +h[o>>3];f=0;break}default:f=-1}return f|0}function df(a,b,c,d,e,f){a=a|0;b=+b;c=+c;d=d|0;e=e|0;f=f|0;var g=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0;switch(f|0){case 4:{j=+h[a+16>>3];k=+h[a+24>>3];n=+h[a+32>>3];l=+h[a+40>>3];o=+h[a+48>>3];m=+h[a+56>>3];i=+h[a+64>>3];b=(b-o)*i/n;i=(c-m)*i/l;g=b*b+i*i;c=+h[a>>3]*g+1.0+g*(+h[a+8>>3]*g);h[d>>3]=o+n*(k*(b*(b*2.0)+g)+(j*2.0*b*i+b*c));h[e>>3]=m+l*(k*2.0*b*i+(j*(g+i*(i*2.0))+i*c));f=0;break}case 3:{i=+h[a>>3];o=+h[a+16>>3];g=(b-i)*o;f=a+8|0;b=o*(c-+h[f>>3]);if(g==0.0&b==0.0){h[d>>3]=i;b=+h[f>>3]}else{o=g*g+b*b;o=1.0-o*(+h[a+32>>3]/1.0e8)-o*(o*(+h[a+40>>3]/1.0e8/1.0e5));h[d>>3]=i+ +h[a+24>>3]*(g*o);b=+h[f>>3]+b*o}h[e>>3]=b;f=0;break}case 2:{i=+h[a>>3];o=+h[a+16>>3];g=(b-i)*o;f=a+8|0;b=o*(c-+h[f>>3]);if(g==0.0&b==0.0){h[d>>3]=i;b=+h[f>>3]}else{o=g*g+b*b;o=1.0-o*(+h[a+24>>3]/1.0e8)-o*(o*(+h[a+32>>3]/1.0e8/1.0e5));h[d>>3]=i+g*o;b=+h[f>>3]+b*o}h[e>>3]=b;f=0;break}case 1:{i=+h[a>>3];o=+h[a+16>>3];g=(b-i)*o;f=a+8|0;b=o*(c-+h[f>>3]);if(g==0.0&b==0.0){h[d>>3]=i;b=+h[f>>3]}else{o=1.0-(g*g+b*b)*(+h[a+24>>3]/1.0e8);h[d>>3]=i+g*o;b=+h[f>>3]+b*o}h[e>>3]=b;f=0;break}default:f=-1}return f|0}function ef(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0;s=i;i=i+256|0;n=s+232|0;m=s+224|0;l=s+216|0;k=s+208|0;j=s+200|0;g=s+192|0;f=s+184|0;p=s+240|0;q=s;do if((a|0)!=0&(b|0)>0&(d|0)!=0){r=_i(a,4854)|0;if(!r){r=qi()|0;c[f>>2]=c[r>>2];c[f+4>>2]=a;Me(3,4857,f);a=ri(c[r>>2]|0)|0;c[g>>2]=5367;c[g+4>>2]=a;Me(3,5361,g);a=-1;break}dj(r,0,2)|0;a:do if(!(Xi(r)|0)){g=gj(r)|0;jj(r);a=0;do{if((a|0)>=4){o=9;break}f=c[2012+(a<<3)+4>>2]|0;a=a+1|0}while(((g|0)%(f|0)|0|0)!=0);do if((o|0)==9)if((a|0)==4){Me(3,4971,l);a=-1;break a}else{f=c[2012+(0<<3)+4>>2]|0;a=0;break}while(0);if((aj(q,f,1,r)|0)!=1){a=qi()|0;c[m>>2]=c[a>>2];Me(3,5051,m);a=ri(c[a>>2]|0)|0;c[n>>2]=5367;c[n+4>>2]=a;Me(3,5361,n);a=-1;break}l=q+176|0;c[l>>2]=a;ff(q);m=(a|0)==1;n=q+120|0;if(m){t=+h[n>>3];k=q+128|0;h[n>>3]=+h[k>>3];h[k>>3]=t}else k=q+128|0;ik(d|0,q|0,184)|0;c[p>>2]=e;f=d+176|0;if((b|0)>1){j=1;while(1){e=(c[p>>2]|0)+(4-1)&~(4-1);g=c[e>>2]|0;c[p>>2]=e+4;c[g+176>>2]=c[f>>2];if((aj(q,c[2012+((c[f>>2]|0)+-1<<3)+4>>2]|0,1,r)|0)!=1){a=-1;break a}c[l>>2]=a;ff(q);if(m){t=+h[n>>3];h[n>>3]=+h[k>>3];h[k>>3]=t}ik(g|0,q|0,184)|0;j=j+1|0;if((j|0)>=(b|0)){a=0;break}}}else a=0}else{a=qi()|0;c[j>>2]=c[a>>2];Me(3,4926,j);a=ri(c[a>>2]|0)|0;c[k>>2]=5367;c[k+4>>2]=a;Me(3,5361,k);a=-1}while(0);Wi(r)|0}else a=-1;while(0);i=s;return a|0}function ff(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;g=i;i=i+192|0;f=g;hf(a,f);hf(a+4|0,f+4|0);b=0;do{gf(a+8+(b<<5)|0,f+8+(b<<5)|0);gf(a+8+(b<<5)+8|0,f+8+(b<<5)+8|0);gf(a+8+(b<<5)+16|0,f+8+(b<<5)+16|0);gf(a+8+(b<<5)+24|0,f+8+(b<<5)+24|0);b=b+1|0}while((b|0)!=3);d=a+176|0;e=0;do{gf(a+104+(e<<3)|0,f+104+(e<<3)|0);e=e+1|0;b=c[d>>2]|0}while((e|0)<(c[2012+(b+-1<<3)>>2]|0));c[f+176>>2]=b;ik(a|0,f|0,184)|0;i=g;return}function gf(b,c){b=b|0;c=c|0;a[c>>0]=a[b+7>>0]|0;a[c+1>>0]=a[b+6>>0]|0;a[c+2>>0]=a[b+5>>0]|0;a[c+3>>0]=a[b+4>>0]|0;a[c+4>>0]=a[b+3>>0]|0;a[c+5>>0]=a[b+2>>0]|0;a[c+6>>0]=a[b+1>>0]|0;a[c+7>>0]=a[b>>0]|0;return}function hf(b,c){b=b|0;c=c|0;a[c>>0]=a[b+3>>0]|0;a[c+1>>0]=a[b+2>>0]|0;a[c+2>>0]=a[b+1>>0]|0;a[c+3>>0]=a[b>>0]|0;return}function jf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0;x=i;i=i+64|0;t=x+24|0;u=x+16|0;v=x+8|0;w=x;q=Uj(208)|0;if(!q){Me(3,5472,x+32|0);rb(1)}ik(q|0,a|0,184)|0;s=b<<1;r=(c[a>>2]|0)+s|0;c[q+192>>2]=r;s=(c[a+4>>2]|0)+s|0;c[q+196>>2]=s;c[q+200>>2]=b;c[q+204>>2]=b;d=$(r<<3,s)|0;e=Uj(d)|0;c[q+184>>2]=e;if(!e){Me(3,5472,x+40|0);rb(1)}d=Uj(d)|0;c[q+188>>2]=d;if(!d){Me(3,5472,x+48|0);rb(1)}p=a+104|0;m=c[a+176>>2]|0;n=(r|0)>0?r<<1:0;if((s|0)>0){o=(r|0)>0;l=0;while(1){f=+(l-b|0);if(o){a=0;j=e;k=d;while(1){y=+(a-b|0);df(p,y,f,v,w,m)|0;g[j>>2]=+h[v>>3];g[j+4>>2]=+h[w>>3];cf(p,y,f,t,u,m)|0;g[k>>2]=+h[t>>3];g[k+4>>2]=+h[u>>3];a=a+1|0;if((a|0)>=(r|0))break;else{j=j+8|0;k=k+8|0}}}d=d+(n<<2)|0;l=l+1|0;if((l|0)>=(s|0))break;else e=e+(n<<2)|0}}i=x;return q|0}function kf(a){a=a|0;var b=0;if((a|0)!=0?(b=c[a>>2]|0,(b|0)!=0):0){Vj(c[b+184>>2]|0);Vj(c[(c[a>>2]|0)+188>>2]|0);Vj(c[a>>2]|0);c[a>>2]=0;b=0}else b=-1;return b|0}function lf(a,b,d,e,f){a=a|0;b=+b;d=+d;e=e|0;f=f|0;var g=0,h=0,i=0;h=(c[a+16>>2]|0)+~~(b+.5)|0;g=(c[a+20>>2]|0)+~~(d+.5)|0;if(((h|0)>=0?(i=c[a+8>>2]|0,!((g|0)<0|(h|0)>=(i|0))):0)?(g|0)<(c[a+12>>2]|0):0){a=c[a>>2]|0;g=($(i,g)|0)+h<<1;c[e>>2]=c[a+(g<<2)>>2];c[f>>2]=c[a+((g|1)<<2)>>2];g=0}else g=-1;return g|0}function mf(a,b,d,e,f){a=a|0;b=+b;d=+d;e=e|0;f=f|0;var g=0,h=0,i=0;h=(c[a+16>>2]|0)+~~(b+.5)|0;g=(c[a+20>>2]|0)+~~(d+.5)|0;if(((h|0)>=0?(i=c[a+8>>2]|0,!((g|0)<0|(h|0)>=(i|0))):0)?(g|0)<(c[a+12>>2]|0):0){a=c[a+4>>2]|0;g=($(i,g)|0)+h<<1;c[e>>2]=c[a+(g<<2)>>2];c[f>>2]=c[a+((g|1)<<2)>>2];g=0}else g=-1;return g|0}function nf(a){a=a|0;var b=0,d=0;b=Uj(8)|0;do if(b){d=Uj(a<<3)|0;c[b>>2]=d;if(!d){Vj(b);b=0;break}else{c[b+4>>2]=a;break}}else b=0;while(0);return b|0}function of(a){a=a|0;Vj(c[a>>2]|0);Vj(a);return 0}function pf(a){a=a|0;var b=0.0,d=0,e=0.0,f=0,g=0;b=+P(+(+qf(a,a)));if(b!=0.0){f=c[a>>2]|0;e=+h[f>>3];b=e<0.0?-b:b;e=e+b;h[f>>3]=e;e=1.0/+P(+(e*b));a=c[a+4>>2]|0;if((a|0)>0){d=0;do{g=f+(d<<3)|0;h[g>>3]=e*+h[g>>3];d=d+1|0}while((d|0)<(a|0))}}return +-b}function qf(a,b){a=a|0;b=b|0;var d=0.0,e=0,f=0;f=c[a+4>>2]|0;if((f|0)!=(c[b+4>>2]|0))rb(0);if((f|0)>0){e=c[a>>2]|0;a=c[b>>2]|0;b=0;d=0.0;do{d=d+ +h[e+(b<<3)>>3]*+h[a+(b<<3)>>3];b=b+1|0}while((b|0)<(f|0))}else d=0.0;return +d}function rf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,j=0.0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;E=i;i=i+16|0;C=E+8|0;D=E;w=c[a+8>>2]|0;if(((w|0)==(c[a+4>>2]|0)?(w|0)==(c[b+4>>2]|0):0)?(w|0)==((c[d+4>>2]|0)+1|0):0){z=w+-2|0;A=C+4|0;B=D+4|0;if((w|0)>2){s=w+-1|0;t=0;do{o=$(t,w)|0;p=c[a>>2]|0;h[(c[b>>2]|0)+(t<<3)>>3]=+h[p+(o+t<<3)>>3];k=w-t+-1|0;c[A>>2]=k;u=t;t=t+1|0;l=p+(o+t<<3)|0;c[C>>2]=l;r=+pf(C);h[(c[d>>2]|0)+(u<<3)>>3]=r;if(!(r==0.0)){if((t|0)<(w|0)){m=c[b>>2]|0;n=t;do{if((t|0)<(n|0)){e=c[a>>2]|0;f=t;j=0.0;do{r=+h[e+(($(f,w)|0)+n<<3)>>3];j=j+r*+h[p+(f+o<<3)>>3];f=f+1|0}while((f|0)<(n|0))}else j=0.0;e=$(n,w)|0;if((n|0)<(w|0)){f=c[a>>2]|0;g=n;do{j=j+ +h[f+(g+e<<3)>>3]*+h[p+(g+o<<3)>>3];g=g+1|0}while((g|0)<(w|0))}h[m+(n<<3)>>3]=j;n=n+1|0}while((n|0)<(w|0))}c[B>>2]=k;c[A>>2]=k;c[C>>2]=l;c[D>>2]=(c[b>>2]|0)+(t<<3);j=+qf(C,D)*.5;if((s|0)>(u|0)){e=c[b>>2]|0;k=s;do{q=+h[p+(k+o<<3)>>3];f=e+(k<<3)|0;r=+h[f>>3]-j*q;h[f>>3]=r;f=$(k,w)|0;if((k|0)<(w|0)){g=c[a>>2]|0;l=k;do{n=g+(l+f<<3)|0;h[n>>3]=+h[n>>3]-(q*+h[e+(l<<3)>>3]+r*+h[p+(l+o<<3)>>3]);l=l+1|0}while((l|0)<(w|0))}k=k+-1|0}while((k|0)>(u|0))}}}while((t|0)<(z|0))}if((w|0)<=1){if((w|0)>0){f=0;g=c[a>>2]|0;e=c[b>>2]|0;v=27}}else{v=$(z,w)|0;g=c[a>>2]|0;e=c[b>>2]|0;h[e+(z<<3)>>3]=+h[g+(v+z<<3)>>3];f=w+-1|0;h[(c[d>>2]|0)+(z<<3)>>3]=+h[g+(f+v<<3)>>3];v=27}if((v|0)==27)h[e+(f<<3)>>3]=+h[g+(($(f,w)|0)+f<<3)>>3];if((w|0)>0){m=(w|0)>0;p=w;do{d=p;p=p+-1|0;n=$(p,w)|0;o=c[a>>2]|0;if((d|0)<=(z|0)?(x=w-p+-1|0,y=o+(n+d<<3)|0,(d|0)<(w|0)):0){e=(d|0)<(w|0);k=d;do{c[B>>2]=x;c[A>>2]=x;c[C>>2]=y;f=$(k,w)|0;c[D>>2]=(c[a>>2]|0)+(f+d<<3);j=+qf(C,D);if(e){g=c[a>>2]|0;l=d;do{v=g+(l+f<<3)|0;h[v>>3]=+h[v>>3]-j*+h[o+(l+n<<3)>>3];l=l+1|0}while((l|0)<(w|0))}k=k+1|0}while((k|0)<(w|0))}if(m){e=0;do{h[o+(e+n<<3)>>3]=0.0;e=e+1|0}while((e|0)<(w|0))}h[o+(n+p<<3)>>3]=1.0}while((d|0)>1);e=0}else e=0}else e=-1;i=E;return e|0}function sf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0,g=0.0,i=0.0;f=+h[c>>3];g=+h[c+8>>3];e=+h[c+16>>3];d=+h[b+88>>3]+(f*+h[b+64>>3]+g*+h[b+72>>3]+e*+h[b+80>>3]);if(d==0.0)c=-1;else{i=+h[b+56>>3]+(f*+h[b+32>>3]+g*+h[b+40>>3]+e*+h[b+48>>3]);h[a>>3]=(+h[b+24>>3]+(f*+h[b>>3]+g*+h[b+8>>3]+e*+h[b+16>>3]))/d;h[a+8>>3]=i/d;c=0}return c|0}function tf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,g=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0;B=i;i=i+1072|0;y=B+1056|0;x=B+768|0;w=B+192|0;A=B+48|0;z=B;K=+h[d>>3];F=+h[e>>3];s=K*F;J=+h[d+8>>3];t=e+8|0;E=+h[t>>3];v=J*E;j=+h[d+16>>3];G=+h[e+16>>3];l=j*G;m=+h[d+24>>3];I=+h[d+32>>3];H=+h[d+40>>3];n=E*H;k=+h[d+48>>3];o=G*k;p=+h[d+56>>3];D=+h[d+64>>3];C=+h[d+72>>3];q=E*C;f=+h[d+80>>3];r=G*f;g=+h[d+88>>3];h[x>>3]=s;h[x+8>>3]=K*E;h[x+16>>3]=K*G;h[x+24>>3]=F*J;h[x+32>>3]=v;h[x+40>>3]=G*J;h[x+48>>3]=F*j;h[x+56>>3]=E*j;h[x+64>>3]=l;h[x+72>>3]=K;h[x+80>>3]=J;h[x+88>>3]=j;j=F*I;h[x+96>>3]=j;h[x+104>>3]=E*I;h[x+112>>3]=G*I;h[x+120>>3]=F*H;h[x+128>>3]=n;h[x+136>>3]=G*H;h[x+144>>3]=F*k;h[x+152>>3]=E*k;h[x+160>>3]=o;h[x+168>>3]=I;h[x+176>>3]=H;h[x+184>>3]=k;k=D*F;h[x+192>>3]=k;h[x+200>>3]=E*D;h[x+208>>3]=G*D;h[x+216>>3]=F*C;E=+h[t>>3];h[x+224>>3]=C*E;h[x+232>>3]=G*C;h[x+240>>3]=F*f;h[x+248>>3]=E*f;h[x+256>>3]=r;h[x+264>>3]=D;h[x+272>>3]=C;h[x+280>>3]=f;e=w+64|0;d=w;t=d+64|0;do{c[d>>2]=0;d=d+4|0}while((d|0)<(t|0));h[e>>3]=-1.0;e=w+72|0;c[e>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;c[e+16>>2]=0;c[e+20>>2]=0;c[e+24>>2]=0;c[e+28>>2]=0;h[w+104>>3]=1.0;e=w+160|0;d=w+112|0;t=d+48|0;do{c[d>>2]=0;d=d+4|0}while((d|0)<(t|0));h[e>>3]=1.0;e=w+240|0;d=w+168|0;t=d+72|0;do{c[d>>2]=0;d=d+4|0}while((d|0)<(t|0));h[e>>3]=-1.0;e=w+296|0;d=w+248|0;t=d+48|0;do{c[d>>2]=0;d=d+4|0}while((d|0)<(t|0));h[e>>3]=-1.0;e=w+304|0;c[e>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;c[e+16>>2]=0;c[e+20>>2]=0;c[e+24>>2]=0;c[e+28>>2]=0;h[w+336>>3]=1.0;e=w+456|0;d=w+344|0;t=d+112|0;do{c[d>>2]=0;d=d+4|0}while((d|0)<(t|0));h[e>>3]=1.0;e=w+512|0;d=w+464|0;t=d+48|0;do{c[d>>2]=0;d=d+4|0}while((d|0)<(t|0));h[e>>3]=1.0;e=w+568|0;d=w+520|0;t=d+48|0;do{c[d>>2]=0;d=d+4|0}while((d|0)<(t|0));h[e>>3]=1.0;u=0;do{t=0;do{d=A+(u*48|0)+(t<<3)|0;h[d>>3]=0.0;f=0.0;e=0;do{f=f+ +h[x+(u*96|0)+(e<<3)>>3]*+h[w+(e*48|0)+(t<<3)>>3];e=e+1|0}while((e|0)!=12);h[d>>3]=f;t=t+1|0}while((t|0)!=6);u=u+1|0}while((u|0)!=3);J=m+(s+v+l);K=p+(j+n+o);f=g+(k+q+r);g=+h[b>>3];j=+h[b+8>>3];k=+h[b+16>>3];l=+h[b+24>>3]+(J*g+K*j+f*k);m=+h[b+32>>3];n=+h[b+40>>3];o=+h[b+48>>3];p=+h[b+56>>3]+(J*m+K*n+f*o);q=+h[b+64>>3];r=+h[b+72>>3];s=+h[b+80>>3];f=+h[b+88>>3]+(J*q+K*r+f*s);if(f==0.0){Me(3,5089,y);e=-1}else{K=f*f;h[z>>3]=(g*f-l*q)/K;h[z+8>>3]=(f*j-l*r)/K;h[z+16>>3]=(f*k-l*s)/K;h[z+24>>3]=(f*m-p*q)/K;h[z+32>>3]=(f*n-p*r)/K;h[z+40>>3]=(f*o-p*s)/K;d=0;do{f=+h[z+(d*24|0)>>3];g=+h[z+(d*24|0)+8>>3];j=+h[z+(d*24|0)+16>>3];e=0;do{y=a+(d*48|0)+(e<<3)|0;h[y>>3]=0.0;K=f*+h[A+(e<<3)>>3]+0.0;h[y>>3]=K;K=K+g*+h[A+48+(e<<3)>>3];h[y>>3]=K;h[y>>3]=K+j*+h[A+96+(e<<3)>>3];e=e+1|0}while((e|0)!=6);d=d+1|0}while((d|0)!=2);e=0}i=B;return e|0}function uf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;j=i;i=i+48|0;h=j+24|0;g=j+12|0;f=j;c[h+4>>2]=6;c[h+8>>2]=1;c[h>>2]=a;c[g+4>>2]=e;c[g+8>>2]=1;c[g>>2]=b;c[f+4>>2]=e;c[f+8>>2]=6;c[f>>2]=d;b=Ue(f)|0;do if(b){a=Te(b,f)|0;if(!a){We(b)|0;d=-1;break}d=Te(b,g)|0;if(!d){We(b)|0;We(a)|0;d=-1;break}if((_e(a)|0)<0){We(b)|0;We(a)|0;We(d)|0;d=-1;break}else{Xe(h,a,d)|0;We(b)|0;We(a)|0;We(d)|0;d=0;break}}else d=-1;while(0);i=j;return d|0}function vf(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0.0,f=0,g=0.0,j=0.0,k=0.0,l=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0;n=i;i=i+192|0;l=n+96|0;m=n;g=+h[b>>3];k=+h[b+8>>3];d=+h[b+16>>3];c=g*g+k*k+d*d;if(c==0.0){j=0.0;e=0.0;d=1.0;c=0.0}else{c=+P(+c);j=c;e=d/c;d=g/c;c=k/c}u=+h[b+24>>3];r=+h[b+32>>3];k=+h[b+40>>3];o=+R(+j);g=1.0-o;j=+S(+j);h[l>>3]=o+d*d*g;t=c*d*g;s=e*j;h[l+8>>3]=t-s;q=d*e*g;p=c*j;h[l+16>>3]=q+p;h[l+24>>3]=u;h[l+32>>3]=t+s;h[l+40>>3]=o+c*c*g;c=c*e*g;j=d*j;h[l+48>>3]=c-j;h[l+56>>3]=r;h[l+64>>3]=q-p;h[l+72>>3]=c+j;h[l+80>>3]=o+e*e*g;h[l+88>>3]=k;f=0;do{c=+h[a+(f<<5)>>3];d=+h[a+(f<<5)+8>>3];e=+h[a+(f<<5)+16>>3];b=0;do{h[m+(f<<5)+(b<<3)>>3]=c*+h[l+(b<<3)>>3]+d*+h[l+32+(b<<3)>>3]+e*+h[l+64+(b<<3)>>3];b=b+1|0}while((b|0)!=4);b=m+(f<<5)+24|0;h[b>>3]=+h[a+(f<<5)+24>>3]+ +h[b>>3];f=f+1|0}while((f|0)!=3);b=0;do{h[a+(b<<5)>>3]=+h[m+(b<<5)>>3];h[a+(b<<5)+8>>3]=+h[m+(b<<5)+8>>3];h[a+(b<<5)+16>>3]=+h[m+(b<<5)+16>>3];h[a+(b<<5)+24>>3]=+h[m+(b<<5)+24>>3];b=b+1|0}while((b|0)!=3);i=n;return 0}function wf(a){a=a|0;var b=0,d=0;b=Uj(136)|0;if(!b)b=0;else{d=0;do{h[b+(d<<5)>>3]=+h[a+(d<<5)>>3];h[b+(d<<5)+8>>3]=+h[a+(d<<5)+8>>3];h[b+(d<<5)+16>>3]=+h[a+(d<<5)+16>>3];h[b+(d<<5)+24>>3]=+h[a+(d<<5)+24>>3];d=d+1|0}while((d|0)!=3);c[b+96>>2]=10;h[b+104>>3]=.10000000149011612;h[b+112>>3]=.9900000095367432;h[b+120>>3]=4.0;h[b+128>>3]=.5}return b|0}function xf(a){a=a|0;var b=0;b=c[a>>2]|0;if(!b)b=-1;else{Vj(b);c[a>>2]=0;b=0}return b|0}function yf(a,b){a=a|0;b=+b;if(!a)a=-1;else{h[a+128>>3]=b;a=0}return a|0}function zf(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0.0,k=0,l=0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0.0,A=0.0;y=i;i=i+176|0;l=y+168|0;k=y+160|0;u=y+48|0;w=y+64|0;v=y;s=b+8|0;g=c[s>>2]|0;do if((g|0)>=3){x=Uj(g*96|0)|0;if(!x){Me(3,5109,k);g=-1;break}t=Uj(g<<4)|0;if(!t){Me(3,5109,l);Vj(x);g=-1;break}else g=0;do{h[e+(g<<5)>>3]=+h[d+(g<<5)>>3];h[e+(g<<5)+8>>3]=+h[d+(g<<5)+8>>3];h[e+(g<<5)+16>>3]=+h[d+(g<<5)+16>>3];h[e+(g<<5)+24>>3]=+h[d+(g<<5)+24>>3];g=g+1|0}while((g|0)!=3);q=b+4|0;l=u+8|0;d=a+104|0;n=a+120|0;o=a+112|0;p=a+96|0;m=0.0;r=0;a:while(1){Ne(a,e,w)|0;g=c[s>>2]|0;if((g|0)>0){j=0.0;k=0;do{if((sf(u,w,(c[q>>2]|0)+(k*24|0)|0)|0)<0){k=10;break a}g=c[b>>2]|0;A=+h[g+(k<<4)>>3]-+h[u>>3];z=+h[g+(k<<4)+8>>3]-+h[l>>3];j=j+(A*A+z*z);g=k<<1;h[t+(g<<3)>>3]=A;h[t+((g|1)<<3)>>3]=z;k=k+1|0;g=c[s>>2]|0}while((k|0)<(g|0))}else j=0.0;j=j/+(g|0);if(j<+h[d>>3]){k=24;break}if(((r|0)>0?j<+h[n>>3]:0)?j/m>+h[o>>3]:0){k=24;break}if((r|0)==(c[p>>2]|0)){k=24;break}if((g|0)>0){k=0;do{if((tf(x+(k*12<<3)|0,a,e,(c[q>>2]|0)+(k*24|0)|0)|0)<0){k=20;break a}k=k+1|0;g=c[s>>2]|0}while((k|0)<(g|0))}if((uf(v,t,x,g<<1)|0)<0){k=22;break}vf(e,v)|0;m=j;r=r+1|0}if((k|0)==10){Af(x,t);g=-1;break}else if((k|0)==20){Af(x,t);g=-1;break}else if((k|0)==22){Af(x,t);g=-1;break}else if((k|0)==24){h[f>>3]=j;Vj(x);Vj(t);g=0;break}}else g=-1;while(0);i=y;return g|0}function Af(a,b){a=a|0;b=b|0;Vj(a);Vj(b);return}function Bf(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0.0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;G=i;i=i+192|0;n=G+184|0;m=G+176|0;l=G+168|0;g=G+160|0;B=G+48|0;D=G+64|0;C=G;A=b+8|0;k=c[A>>2]|0;do if((k|0)>=4){o=~~(+(k|0)*+h[a+128>>3])+-1|0;o=(o|0)<3?3:o;F=Uj(k*96|0)|0;if(!F){Me(3,5109,g);g=-1;break}E=Uj(k<<4)|0;if(!E){Me(3,5109,l);Vj(F);g=-1;break}g=k<<3;z=Uj(g)|0;if(!z){Me(3,5109,m);Vj(F);Vj(E);g=-1;break}y=Uj(g)|0;if(!y){Me(3,5109,n);Vj(F);Vj(E);Vj(z);g=-1;break}else g=0;do{h[e+(g<<5)>>3]=+h[d+(g<<5)>>3];h[e+(g<<5)+8>>3]=+h[d+(g<<5)+8>>3];h[e+(g<<5)+16>>3]=+h[d+(g<<5)+16>>3];h[e+(g<<5)+24>>3]=+h[d+(g<<5)+24>>3];g=g+1|0}while((g|0)!=3);w=b+4|0;x=B+8|0;n=y+(o<<3)|0;d=a+104|0;o=a+120|0;t=a+112|0;u=a+96|0;r=0.0;v=0;a:while(1){Ne(a,e,D)|0;g=c[A>>2]|0;if((g|0)>0){k=0;do{if((sf(B,D,(c[w>>2]|0)+(k*24|0)|0)|0)<0){k=14;break a}g=c[b>>2]|0;q=+h[g+(k<<4)>>3]-+h[B>>3];s=+h[g+(k<<4)+8>>3]-+h[x>>3];g=k<<1;h[E+(g<<3)>>3]=q;h[E+((g|1)<<3)>>3]=s;s=q*q+s*s;h[y+(k<<3)>>3]=s;h[z+(k<<3)>>3]=s;k=k+1|0;g=c[A>>2]|0}while((k|0)<(g|0))}rj(y,g,8,1);s=+h[n>>3]*4.0;s=s<16.0?16.0:s;k=c[A>>2]|0;q=s/6.0;if((k|0)>0){j=0.0;g=0;do{p=+h[y+(g<<3)>>3];if(p>s)p=q;else{p=1.0-p/s;p=q*(1.0-p*(p*p))}j=j+p;g=g+1|0}while((g|0)<(k|0))}else j=0.0;j=j/+(k|0);if(j<+h[d>>3]){k=36;break}if(((v|0)>0?j<+h[o>>3]:0)?j/r>+h[t>>3]:0){k=36;break}if((v|0)==(c[u>>2]|0)){k=36;break}if((k|0)>0){m=0;g=0;do{p=+h[z+(m<<3)>>3];if(p<=s){k=g*6|0;l=F+(k<<3)|0;if((tf(l,a,e,(c[w>>2]|0)+(m*24|0)|0)|0)<0){k=28;break a}r=1.0-p/s;r=r*r;h[l>>3]=+h[l>>3]*r;l=F+((k|1)<<3)|0;h[l>>3]=+h[l>>3]*r;l=F+(k+2<<3)|0;h[l>>3]=r*+h[l>>3];l=F+(k+3<<3)|0;h[l>>3]=r*+h[l>>3];l=F+(k+4<<3)|0;h[l>>3]=r*+h[l>>3];l=F+(k+5<<3)|0;h[l>>3]=r*+h[l>>3];l=F+(k+6<<3)|0;h[l>>3]=r*+h[l>>3];l=F+(k+7<<3)|0;h[l>>3]=r*+h[l>>3];l=F+(k+8<<3)|0;h[l>>3]=r*+h[l>>3];l=F+(k+9<<3)|0;h[l>>3]=r*+h[l>>3];l=F+(k+10<<3)|0;h[l>>3]=r*+h[l>>3];k=F+(k+11<<3)|0;h[k>>3]=r*+h[k>>3];k=m<<1;h[E+(g<<3)>>3]=r*+h[E+(k<<3)>>3];h[E+(g+1<<3)>>3]=r*+h[E+((k|1)<<3)>>3];k=c[A>>2]|0;g=g+2|0}m=m+1|0}while((m|0)<(k|0))}else g=0;if((g|0)<6){k=32;break}if((uf(C,E,F,g)|0)<0){k=34;break}vf(e,C)|0;r=j;v=v+1|0}if((k|0)==14){Cf(F,E,z,y);g=-1;break}else if((k|0)==28){Cf(F,E,z,y);g=-1;break}else if((k|0)==32){Cf(F,E,z,y);g=-1;break}else if((k|0)==34){Cf(F,E,z,y);g=-1;break}else if((k|0)==36){h[f>>3]=j;Vj(F);Vj(E);Vj(z);Vj(y);g=0;break}}else g=-1;while(0);i=G;return g|0}function Cf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Vj(a);Vj(b);Vj(c);Vj(d);return}function Df(a,b){a=a|0;b=b|0;var c=0.0;c=+h[a>>3]-+h[b>>3];return (c<0.0?-1:c>0.0&1)|0}function Ef(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0.0,k=0.0,l=0,m=0.0,n=0.0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0,v=0.0,w=0,x=0,y=0,z=0,A=0.0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0,V=0,W=0,X=0,Y=0,Z=0;U=i;i=i+64|0;D=U+48|0;z=U+40|0;y=U+32|0;x=U+24|0;u=U+16|0;o=U+8|0;l=U;a:do if((e|0)>=4){g=0;while(1){if((g|0)>=(e|0))break;if(+h[d+(g*24|0)+16>>3]!=0.0){g=-1;break a}else g=g+1|0}if((((((((!(+h[a>>3]==0.0)?!(+h[a+32>>3]!=0.0):0)?(B=a+40|0,!(+h[B>>3]==0.0)):0)?!(+h[a+64>>3]!=0.0):0)?!(+h[a+72>>3]!=0.0):0)?!(+h[a+80>>3]!=1.0):0)?!(+h[a+24>>3]!=0.0):0)?!(+h[a+56>>3]!=0.0):0)?!(+h[a+88>>3]!=0.0):0){g=e<<1;C=Re(g,8)|0;if(!C){Me(3,5124,l);g=-1;break}w=Re(g,1)|0;if(!w){We(C)|0;Me(3,5150,o);g=-1;break}if(e){g=c[C>>2]|0;l=c[w>>2]|0;o=0;do{Z=d+(o*24|0)|0;V=o<<4;h[g+(V<<3)>>3]=+h[Z>>3];Y=d+(o*24|0)+8|0;h[g+((V|1)<<3)>>3]=+h[Y>>3];h[g+((V|2)<<3)>>3]=1.0;h[g+((V|3)<<3)>>3]=0.0;h[g+((V|4)<<3)>>3]=0.0;h[g+((V|5)<<3)>>3]=0.0;X=b+(o<<4)|0;h[g+((V|6)<<3)>>3]=-(+h[Z>>3]*+h[X>>3]);h[g+((V|7)<<3)>>3]=-(+h[Y>>3]*+h[X>>3]);h[g+((V|8)<<3)>>3]=0.0;h[g+((V|9)<<3)>>3]=0.0;h[g+((V|10)<<3)>>3]=0.0;h[g+((V|11)<<3)>>3]=+h[Z>>3];h[g+((V|12)<<3)>>3]=+h[Y>>3];h[g+((V|13)<<3)>>3]=1.0;W=b+(o<<4)+8|0;h[g+((V|14)<<3)>>3]=-(+h[Z>>3]*+h[W>>3]);h[g+((V|15)<<3)>>3]=-(+h[Y>>3]*+h[W>>3]);V=o<<1;h[l+(V<<3)>>3]=+h[X>>3];h[l+((V|1)<<3)>>3]=+h[W>>3];o=o+1|0}while((o|0)!=(e|0))}e=Ue(C)|0;if(!e){We(C)|0;We(w)|0;Me(3,5176,u);g=-1;break}o=Te(e,C)|0;if(!o){We(C)|0;We(w)|0;We(e)|0;Me(3,5202,x);g=-1;break}l=Te(e,w)|0;if(!l){We(C)|0;We(w)|0;We(e)|0;We(o)|0;Me(3,5228,y);g=-1;break}if((_e(o)|0)<0){We(C)|0;We(w)|0;We(e)|0;We(o)|0;We(l)|0;Me(3,5254,z);g=-1;break}g=Te(o,l)|0;if(!g){We(C)|0;We(w)|0;We(e)|0;We(o)|0;We(l)|0;Me(3,5280,D);g=-1;break}Z=c[g>>2]|0;p=+h[Z+48>>3];S=+h[a+48>>3];t=+h[B>>3];j=(+h[Z+24>>3]-p*S)/t;s=+h[a+16>>3];T=+h[a+8>>3];r=+h[a>>3];q=(+h[Z>>3]-p*s-j*T)/r;k=+h[Z+56>>3];m=(+h[Z+32>>3]-S*k)/t;n=(+h[Z+8>>3]-s*k-T*m)/r;t=(+h[Z+40>>3]-S)/t;r=(+h[Z+16>>3]-s-T*t)/r;We(C)|0;We(w)|0;We(e)|0;We(o)|0;We(l)|0;We(g)|0;T=+P(+(p*p+(j*j+q*q)));s=+P(+(k*k+(m*m+n*n)));q=q/T;j=j/T;p=p/T;n=n/s;m=m/s;k=k/s;s=(T+s)*.5;r=r/s;T=1.0/s;if(T<0.0){O=-j;k=-k;m=-m;p=-p;n=-n;Q=-q;S=-r;R=-T}else{O=j;Q=q;S=r;R=t/s}j=k*O-m*p;q=n*p-k*Q;r=m*Q-n*O;s=+P(+(r*r+(j*j+q*q)));do if(!(s==0.0)){t=j/s;q=q/s;j=r/s;N=k*p+(m*O+n*Q);N=N<0.0?-N:N;N=(+P(+(N+1.0))+ +P(+(1.0-N)))*.5;if(Q*q-O*t!=0.0){g=0;E=Q;v=O;F=p;I=t;H=q}else{Z=Q*j-p*t!=0.0;g=Z?1:2;E=Z?Q:p;v=Z?p:O;F=Z?O:Q;I=Z?t:j;H=Z?j:q;j=Z?q:t}r=E*H;s=v*I;q=r-s;if(q==0.0){q=O;j=Q;break}G=(v*j-F*H)/q;A=N*H/q;r=s-r;q=(E*j-F*I)/r;r=N*I/r;s=G*G+q*q+1.0;t=G*A+q*r;v=t*t-s*(A*A+r*r+-1.0);if(v<0.0){q=O;j=Q;break}M=+P(+v);L=(M-t)/s;F=A+G*L;K=r+q*L;M=(-t-M)/s;G=A+G*M;r=r+q*M;Z=(g|0)==1;q=Z?H:j;s=Z?j:H;J=Z?L:K;L=Z?K:L;K=Z?M:r;H=Z?r:M;Z=(g|0)==2&(Z^1);r=Z?I:q;q=Z?q:I;M=Z?L:F;L=Z?F:L;j=Z?H:G;I=Z?G:H;if(n*s-m*q!=0.0){g=0;E=n;v=m;F=k;H=q;A=s}else{Z=n*r-k*q!=0.0;g=Z?1:2;E=Z?n:k;v=Z?k:m;F=Z?m:n;H=Z?q:r;A=Z?r:s;r=Z?s:q}s=E*A;t=v*H;q=s-t;if(q==0.0){q=O;j=Q;break}G=(v*r-F*A)/q;A=N*A/q;q=t-s;v=(E*r-F*H)/q;q=N*H/q;r=G*G+v*v+1.0;s=G*A+v*q;t=s*s-r*(A*A+q*q+-1.0);if(t<0.0){q=O;j=Q;break}t=+P(+t);k=(t-s)/r;Q=A+G*k;O=q+v*k;t=(-s-t)/r;p=A+G*t;n=q+v*t;Z=(g|0)==1;m=Z?k:O;k=Z?O:k;v=Z?t:n;t=Z?n:t;Z=(g|0)==2&(Z^1);n=Z?k:Q;k=Z?Q:k;A=Z?t:p;t=Z?p:t;p=L*k+(J*m+M*n);p=p<0.0?-p:p;q=L*t+(J*v+M*A);q=q<0.0?-q:q;r=I*k+(K*m+j*n);r=r<0.0?-r:r;s=I*t+(K*v+j*A);s=s<0.0?-s:s;if(p<q)if(p<r){if(p<s){q=J;p=L;j=M;break}q=K;k=t;m=v;p=I;n=A;break}else{if(r<s){q=K;p=I;break}q=K;k=t;m=v;p=I;n=A;break}else if(q<r){if(q<s){q=J;k=t;m=v;p=L;n=A;j=M;break}q=K;k=t;m=v;p=I;n=A;break}else{if(r<s){q=K;p=I;break}q=K;k=t;m=v;p=I;n=A;break}}else{q=O;j=Q}while(0);M=k*q-m*p;N=n*p-k*j;O=m*j-n*q;Q=+P(+(O*O+(M*M+N*N)));h[f>>3]=j;h[f+32>>3]=q;h[f+64>>3]=p;h[f+8>>3]=n;h[f+40>>3]=m;h[f+72>>3]=k;h[f+16>>3]=M/Q;h[f+48>>3]=N/Q;h[f+80>>3]=O/Q;h[f+24>>3]=S;h[f+56>>3]=R;h[f+88>>3]=T;g=0}else g=-1}else g=-1;while(0);i=U;return g|0}function Ff(a){a=a|0;Vj(c[a>>2]|0);Vj(a);return 0}function Gf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return +(+If(a,b,c,d,0))}function Hf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return +(+If(a,b,c,d,1))}function If(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0.0,j=0,k=0,l=0,m=0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;F=i;i=i+208|0;z=F+200|0;y=F+192|0;A=F+96|0;B=F;C=e+4|0;p=c[C>>2]|0;q=e+112|0;r=e+120|0;if((p|0)>0){u=c[e>>2]|0;v=(d|0)>0;w=(d|0)>0;x=0;do{if(!(c[u+(x*320|0)+4>>2]|0)){if(v){k=c[u+(x*320|0)>>2]|0;l=0;j=-1;do{if((c[b+(l<<8)+8>>2]|0)==(k|0)?(n=+h[b+(l<<8)+40>>3],!(n<+h[q>>3])):0)if(!((j|0)!=-1?!(+h[b+(j<<8)+40>>3]<n):0))j=l;l=l+1|0}while((l|0)<(d|0))}else j=-1;c[u+(x*320|0)+304>>2]=j;if((j|0)>-1)c[b+(j<<8)+16>>2]=c[b+(j<<8)+20>>2]}else{l=u+(x*320|0)+312|0;m=u+(x*320|0)|0;if(w){o=0;j=-1;do{k=c[b+(o<<8)+12>>2]|0;if((k|0)==0?(t=b+(o<<8)+248|0,s=c[t>>2]|0,t=c[t+4>>2]|0,!((s|0)==0&(t|0)==0)):0){k=l;if((s|0)==(c[k>>2]|0)?(t|0)==(c[k+4>>2]|0):0)E=20}else if((k|0)==(c[m>>2]|0))E=20;if((E|0)==20){E=0;g=+h[b+(o<<8)+48>>3];if(!(g<+h[r>>3]))if(!((j|0)!=-1?!(+h[b+(j<<8)+48>>3]<g):0))j=o}o=o+1|0}while((o|0)<(d|0))}else j=-1;c[u+(x*320|0)+304>>2]=j;if((j|0)>-1)c[b+(j<<8)+16>>2]=c[b+(j<<8)+24>>2]}x=x+1|0}while((x|0)<(p|0))}if((p|0)>0){q=0;j=0;p=0;k=0;while(1){l=c[e>>2]|0;m=c[l+(q*320|0)+304>>2]|0;do if((m|0)<0)l=p;else{o=b+(m<<8)|0;if(+ke(a,o,+h[l+(q*320|0)+8>>3],B)>4.0){c[(c[e>>2]|0)+(q*320|0)+304>>2]=-1;l=b+(m<<8)+236|0;if(c[l>>2]|0){l=p;break}c[l>>2]=7;l=p;break}l=c[o>>2]|0;if((k|0)==0|(p|0)<(l|0)){j=0;do{h[A+(j<<5)>>3]=+h[B+(j<<5)>>3];h[A+(j<<5)+8>>3]=+h[B+(j<<5)+8>>3];h[A+(j<<5)+16>>3]=+h[B+(j<<5)+16>>3];h[A+(j<<5)+24>>3]=+h[B+(j<<5)+24>>3];j=j+1|0}while((j|0)!=3);j=q}else l=p;k=k+1|0}while(0);q=q+1|0;if((q|0)>=(c[C>>2]|0))break;else p=l}}else{j=0;k=0}do if((k|0)!=0?(k|0)>=(c[e+128>>2]|0):0){Ne(A,(c[e>>2]|0)+(j*320|0)+112|0,B)|0;p=k<<2;r=Uj(k<<6)|0;if(!r){Me(3,5472,y);rb(1)}q=Uj(k*96|0)|0;if(!q){Me(3,5472,z);rb(1)}l=c[C>>2]|0;if((l|0)>0){m=c[e>>2]|0;o=0;j=0;do{k=c[m+(o*320|0)+304>>2]|0;if((k|0)>=0){y=c[b+(k<<8)+16>>2]|0;d=(4-y|0)%4|0;z=j<<3;h[r+(z<<3)>>3]=+h[b+(k<<8)+168+(d<<4)>>3];h[r+((z|1)<<3)>>3]=+h[b+(k<<8)+168+(d<<4)+8>>3];d=(5-y|0)%4|0;h[r+((z|2)<<3)>>3]=+h[b+(k<<8)+168+(d<<4)>>3];h[r+((z|3)<<3)>>3]=+h[b+(k<<8)+168+(d<<4)+8>>3];d=(6-y|0)%4|0;h[r+((z|4)<<3)>>3]=+h[b+(k<<8)+168+(d<<4)>>3];h[r+((z|5)<<3)>>3]=+h[b+(k<<8)+168+(d<<4)+8>>3];y=(7-y|0)%4|0;h[r+((z|6)<<3)>>3]=+h[b+(k<<8)+168+(y<<4)>>3];h[r+((z|7)<<3)>>3]=+h[b+(k<<8)+168+(y<<4)+8>>3];z=j*12|0;h[q+(z<<3)>>3]=+h[m+(o*320|0)+208>>3];h[q+((z|1)<<3)>>3]=+h[m+(o*320|0)+216>>3];h[q+((z|2)<<3)>>3]=+h[m+(o*320|0)+224>>3];h[q+((z|3)<<3)>>3]=+h[m+(o*320|0)+232>>3];h[q+(z+4<<3)>>3]=+h[m+(o*320|0)+240>>3];h[q+(z+5<<3)>>3]=+h[m+(o*320|0)+248>>3];h[q+(z+6<<3)>>3]=+h[m+(o*320|0)+256>>3];h[q+(z+7<<3)>>3]=+h[m+(o*320|0)+264>>3];h[q+(z+8<<3)>>3]=+h[m+(o*320|0)+272>>3];h[q+(z+9<<3)>>3]=+h[m+(o*320|0)+280>>3];y=c[e>>2]|0;h[q+(z+10<<3)>>3]=+h[y+(o*320|0)+288>>3];h[q+(z+11<<3)>>3]=+h[y+(o*320|0)+296>>3];j=j+1|0}o=o+1|0}while((o|0)<(l|0))}m=e+104|0;k=(f|0)!=0;if(!(c[m>>2]|0)){j=e+8|0;g=+me(a,B,r,q,p,j);if(k&g>=20.0){yf(c[a>>2]|0,.8)|0;g=+ne(a,B,r,q,p,j);if(g>=20.0){yf(c[a>>2]|0,.6)|0;g=+ne(a,B,r,q,p,j);if(g>=20.0){yf(c[a>>2]|0,.4)|0;g=+ne(a,B,r,q,p,j);if(g>=20.0){yf(c[a>>2]|0,0.0)|0;g=+ne(a,B,r,q,p,j)}}}}Vj(q);Vj(r)}else{g=+me(a,B,r,q,p,A);l=e+8|0;n=+me(a,l,r,q,p,l);j=g<n;do if(k){if(j){j=0;do{h[e+8+(j<<5)>>3]=+h[A+(j<<5)>>3];h[e+8+(j<<5)+8>>3]=+h[A+(j<<5)+8>>3];h[e+8+(j<<5)+16>>3]=+h[A+(j<<5)+16>>3];h[e+8+(j<<5)+24>>3]=+h[A+(j<<5)+24>>3];j=j+1|0}while((j|0)!=3)}else g=n;if(g>=20.0){yf(c[a>>2]|0,.8)|0;g=+ne(a,B,r,q,p,A);n=+ne(a,l,r,q,p,l);if(g<n){j=0;do{h[e+8+(j<<5)>>3]=+h[A+(j<<5)>>3];h[e+8+(j<<5)+8>>3]=+h[A+(j<<5)+8>>3];h[e+8+(j<<5)+16>>3]=+h[A+(j<<5)+16>>3];h[e+8+(j<<5)+24>>3]=+h[A+(j<<5)+24>>3];j=j+1|0}while((j|0)!=3)}else g=n;if(g>=20.0){yf(c[a>>2]|0,.6)|0;g=+ne(a,B,r,q,p,A);n=+ne(a,l,r,q,p,l);if(g<n){j=0;do{h[e+8+(j<<5)>>3]=+h[A+(j<<5)>>3];h[e+8+(j<<5)+8>>3]=+h[A+(j<<5)+8>>3];h[e+8+(j<<5)+16>>3]=+h[A+(j<<5)+16>>3];h[e+8+(j<<5)+24>>3]=+h[A+(j<<5)+24>>3];j=j+1|0}while((j|0)!=3)}else g=n;if(g>=20.0){yf(c[a>>2]|0,.4)|0;g=+ne(a,B,r,q,p,A);n=+ne(a,l,r,q,p,l);if(g<n){j=0;do{h[e+8+(j<<5)>>3]=+h[A+(j<<5)>>3];h[e+8+(j<<5)+8>>3]=+h[A+(j<<5)+8>>3];h[e+8+(j<<5)+16>>3]=+h[A+(j<<5)+16>>3];h[e+8+(j<<5)+24>>3]=+h[A+(j<<5)+24>>3];j=j+1|0}while((j|0)!=3)}else g=n;if(g>=20.0){yf(c[a>>2]|0,0.0)|0;g=+ne(a,B,r,q,p,A);n=+ne(a,l,r,q,p,l);if(g<n)j=0;else{g=n;break}do{h[e+8+(j<<5)>>3]=+h[A+(j<<5)>>3];h[e+8+(j<<5)+8>>3]=+h[A+(j<<5)+8>>3];h[e+8+(j<<5)+16>>3]=+h[A+(j<<5)+16>>3];h[e+8+(j<<5)+24>>3]=+h[A+(j<<5)+24>>3];j=j+1|0}while((j|0)!=3)}}}}}else if(j){j=0;do{h[e+8+(j<<5)>>3]=+h[A+(j<<5)>>3];h[e+8+(j<<5)+8>>3]=+h[A+(j<<5)+8>>3];h[e+8+(j<<5)+16>>3]=+h[A+(j<<5)+16>>3];h[e+8+(j<<5)+24>>3]=+h[A+(j<<5)+24>>3];j=j+1|0}while((j|0)!=3)}else g=n;while(0);Vj(q);Vj(r)}if(g<20.0){c[m>>2]=1;break}c[m>>2]=0;m=c[C>>2]|0;if((m|0)>0){j=c[e>>2]|0;l=0;do{k=c[j+(l*320|0)+304>>2]|0;if((k|0)>=0?(D=b+(k<<8)+236|0,(c[D>>2]|0)==0):0)c[D>>2]=8;l=l+1|0}while((l|0)<(m|0))}}else E=38;while(0);if((E|0)==38){c[e+104>>2]=0;g=-1.0}i=F;return +g}function Jf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0.0,W=0.0;U=i;i=i+2544|0;S=U+208|0;R=U+200|0;G=U+184|0;Q=U+176|0;F=U+168|0;E=U+152|0;P=U+144|0;D=U+136|0;M=U+128|0;L=U+120|0;K=U+112|0;C=U+104|0;j=U+96|0;g=U+88|0;f=U+80|0;e=U+72|0;d=U+64|0;H=U;I=U+2280|0;J=U+232|0;z=U+224|0;O=U+220|0;A=U+216|0;B=U+212|0;T=_i(a,5306)|0;a:do if(!T){c[d>>2]=a;Me(3,5308,d);d=ri(c[(qi()|0)>>2]|0)|0;c[e>>2]=5367;c[e+4>>2]=d;Me(3,5361,e);d=0}else{Kf(I,T);c[f>>2]=O;if((kj(I,5368,f)|0)!=1){c[g>>2]=a;Me(3,5371,g);Wi(T)|0;d=0;break}d=c[O>>2]|0;N=Uj(d*320|0)|0;if(!N){Me(3,5472,j);rb(1)}r=H+8|0;s=H+16|0;t=H+24|0;u=H+32|0;v=H+40|0;w=H+48|0;x=H+56|0;y=(b|0)==0;b:do if((d|0)>0){d=0;f=0;c:while(1){Kf(I,T);e=N+(d*320|0)|0;g=N+(d*320|0)+312|0;c[C>>2]=g;c[C+4>>2]=z;if((kj(I,5489,C)|0)==1){q=c[g>>2]|0;c[e>>2]=(q&-32768|0)==0&0==0?q&32767:0;c[N+(d*320|0)+4>>2]=1;f=f|2}else{if(y){e=10;break}if(!(Qe(J,a,2048,1)|0)){e=12;break}Cj(J,I,2047-(Bj(J)|0)|0)|0;q=Ke(b,J)|0;c[e>>2]=q;if((q|0)<0){e=14;break}c[N+(d*320|0)+4>>2]=0;f=f|1}Kf(I,T);e=N+(d*320|0)+8|0;c[D>>2]=e;if((kj(I,5785,D)|0)!=1){e=18;break}Kf(I,T);o=N+(d*320|0)+16|0;p=N+(d*320|0)+24|0;q=N+(d*320|0)+40|0;c[E>>2]=o;c[E+4>>2]=p;c[E+8>>2]=N+(d*320|0)+32;c[E+12>>2]=q;if((kj(I,5894,E)|0)!=4){c[F>>2]=A;c[F+4>>2]=B;if((kj(I,5910,F)|0)==2)g=0;else{e=21;break}}else g=1;do{Kf(I,T);c[G>>2]=N+(d*320|0)+16+(g<<5);c[G+4>>2]=N+(d*320|0)+16+(g<<5)+8;c[G+8>>2]=N+(d*320|0)+16+(g<<5)+16;c[G+12>>2]=N+(d*320|0)+16+(g<<5)+24;if((kj(I,5894,G)|0)!=4){e=23;break c}g=g+1|0}while((g|0)<3);Oe(o,N+(d*320|0)+112|0)|0;W=+h[e>>3];V=W*-.5;h[H>>3]=V;W=W*.5;h[r>>3]=W;h[s>>3]=W;h[t>>3]=W;h[u>>3]=W;h[v>>3]=V;h[w>>3]=V;h[x>>3]=V;e=N+(d*320|0)+48|0;g=N+(d*320|0)+56|0;j=N+(d*320|0)+72|0;k=N+(d*320|0)+80|0;l=N+(d*320|0)+88|0;m=N+(d*320|0)+104|0;n=0;do{V=+h[H+(n<<4)>>3];W=+h[H+(n<<4)+8>>3];h[N+(d*320|0)+208+(n*24|0)>>3]=+h[q>>3]+(+h[o>>3]*V+ +h[p>>3]*W);h[N+(d*320|0)+208+(n*24|0)+8>>3]=+h[j>>3]+(+h[e>>3]*V+ +h[g>>3]*W);h[N+(d*320|0)+208+(n*24|0)+16>>3]=+h[m>>3]+(+h[k>>3]*V+ +h[l>>3]*W);n=n+1|0}while((n|0)!=4);d=d+1|0;if((d|0)>=(c[O>>2]|0))break b}if((e|0)==10){c[K>>2]=a;c[K+4>>2]=I;Me(3,5496,K)}else if((e|0)==12){c[L>>2]=a;Me(3,5624,L)}else if((e|0)==14){c[M>>2]=a;c[M+4>>2]=J;Me(3,5708,M)}else if((e|0)==18){c[P>>2]=a;c[P+4>>2]=d+1;Me(3,5789,P)}else if((e|0)==21){c[Q>>2]=a;c[Q+4>>2]=d+1;Me(3,5916,Q)}else if((e|0)==23){c[R>>2]=a;c[R+4>>2]=d+1;Me(3,5916,R)}Wi(T)|0;Vj(N);d=0;break a}else f=0;while(0);Wi(T)|0;d=Uj(136)|0;if(!d){Me(3,5472,S);rb(1)}c[d>>2]=N;c[d+4>>2]=c[O>>2];c[d+104>>2]=0;do if((f&3|0)!=3){e=d+108|0;if(!(f&1)){c[e>>2]=1;break}else{c[e>>2]=0;break}}else c[d+108>>2]=2;while(0);h[d+112>>3]=.5;h[d+120>>3]=.5}while(0);i=U;return d|0}function Kf(b,c){b=b|0;c=c|0;var d=0,e=0;a:do if(Zi(b,256,c)|0)while(1){d=Bj(b)|0;b:do if(d)while(1){d=d+-1|0;e=b+d|0;switch(a[e>>0]|0){case 13:case 10:break;default:break b}a[e>>0]=0;if(!d)break b}while(0);switch(a[b>>0]|0){case 0:case 35:break;default:break a}if(!(Zi(b,256,c)|0))break a}while(0);return}function Lf(a,b,d,e){a=a|0;b=+b;d=+d;e=e|0;var f=0,g=0.0,j=0.0,k=0,l=0.0,m=0.0,n=0,o=0,p=0,q=0,r=0;r=i;i=i+400|0;n=r+296|0;q=r+200|0;o=r+128|0;p=r;k=c[a>>2]|0;f=c[a+4>>2]|0;if((bf(a+8|0,n,q)|0)<0)Me(3,6025,r+392|0);else{j=+(f+-1|0);f=n+32|0;h[f>>3]=j*+h[n+64>>3]-+h[f>>3];f=n+40|0;h[f>>3]=j*+h[n+72>>3]-+h[f>>3];f=n+48|0;h[f>>3]=j*+h[n+80>>3]-+h[f>>3];f=n+56|0;h[f>>3]=j*+h[n+88>>3]-+h[f>>3];g=+h[n+80>>3];f=0;do{h[o+(f*24|0)>>3]=+h[n+(f<<5)>>3]/g;h[o+(f*24|0)+8>>3]=+h[n+(f<<5)+8>>3]/g;h[o+(f*24|0)+16>>3]=+h[n+(f<<5)+16>>3]/g;f=f+1|0}while((f|0)!=3);g=+(k+-1|0);h[p>>3]=+h[o>>3]*2.0/g;h[p+8>>3]=+h[o+8>>3]*2.0/g;h[p+16>>3]=+h[o+16>>3]*2.0/g+-1.0;k=p+24|0;c[k>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;c[k+12>>2]=0;h[p+40>>3]=+h[o+32>>3]*2.0/j;h[p+48>>3]=+h[o+40>>3]*2.0/j+-1.0;k=p+56|0;g=d-b;c[k>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;c[k+12>>2]=0;c[k+16>>2]=0;c[k+20>>2]=0;h[p+80>>3]=(b+d)/g;h[p+88>>3]=d*-2.0*b/g;k=p+96|0;c[k>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;c[k+12>>2]=0;h[p+112>>3]=1.0;h[p+120>>3]=0.0;g=+h[q+24>>3];j=+h[q+56>>3];d=+h[q+88>>3];k=0;do{b=+h[p+(k<<5)>>3];f=p+(k<<5)+8|0;a=p+(k<<5)+16|0;l=+h[f>>3];m=+h[a>>3];n=0;do{h[e+((n<<2)+k<<3)>>3]=b*+h[q+(n<<3)>>3]+l*+h[q+32+(n<<3)>>3]+m*+h[q+64+(n<<3)>>3];n=n+1|0}while((n|0)!=3);h[e+(k+12<<3)>>3]=+h[p+(k<<5)+24>>3]+(b*g+ +h[f>>3]*j+ +h[a>>3]*d);k=k+1|0}while((k|0)!=4)}i=r;return}function Mf(a){a=a|0;c[496]=a;return}function Nf(){return c[496]|0}function Of(a){a=a|0;var b=0,d=0;b=a+212|0;d=c[b>>2]|0;if(d){ze(d)|0;Qd(c[b>>2]|0)|0;c[b>>2]=0}b=a+224|0;if(c[b>>2]|0){Ld(b)|0;c[b>>2]=0}b=a+192|0;if(c[b>>2]|0){kf(b)|0;c[b>>2]=0}return}function Pf(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;g=i;i=i+16|0;d=g;c[d>>2]=a;if(!(Cg(2044,d)|0))a=-1;else{f=Dg(2044,d)|0;a=f+196|0;b=c[a>>2]|0;if(b){Vj(b);c[a>>2]=0;c[f+200>>2]=0}Of(f);Ce(c[f+216>>2]|0)|0;Eg(2044,d)|0;d=f+248|0;e=f+252|0;a=c[d>>2]|0;if((c[e>>2]|0)!=(a|0)){b=0;do{Ff(c[a+(b<<3)+4>>2]|0)|0;b=b+1|0;a=c[d>>2]|0}while(b>>>0<(c[e>>2]|0)-a>>3>>>0)}Fg(d);Lh(d);Fg(f+248|0);Lh(f);a=0}i=g;return a|0}function Qf(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;h=i;i=i+208|0;g=h+192|0;f=h;e=h+196|0;if(!(a[b>>0]&1))d=b+1|0;else d=c[b+8>>2]|0;if((ef(d,1,f,h+184|0)|0)<0){if(!(a[b>>0]&1))d=b+1|0;else d=c[b+8>>2]|0;c[g>>2]=d;Me(3,6093,g);d=-1}else{d=c[521]|0;c[521]=d+1;c[e>>2]=d;ik(Gg(2064,e)|0,f|0,184)|0}i=h;return d|0}function Rf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0;n=i;i=i+48|0;m=n+24|0;l=n+16|0;j=n+8|0;f=n;d=n+32|0;e=n+28|0;c[d>>2]=a;c[e>>2]=b;do if((Cg(2044,d)|0)!=0?(k=Dg(2044,d)|0,(Hg(2064,e)|0)!=0):0){g=k+8|0;ik(g|0,Gg(2064,e)|0,184)|0;e=c[g>>2]|0;d=k+204|0;b=c[k+12>>2]|0;a=k+208|0;if(!((e|0)==(c[d>>2]|0)?(b|0)==(c[a>>2]|0):0)){c[f>>2]=e;c[f+4>>2]=b;Me(2,6152,f);af(g,c[d>>2]|0,c[a>>2]|0,g)|0}Of(k);d=jf(g,15)|0;a=k+192|0;c[a>>2]=d;if(!d){Me(3,6199,j);d=-1;break}d=Md(d)|0;b=k+212|0;c[b>>2]=d;if(!d){Me(3,6237,l);d=-1;break}Nd(d,2)|0;l=Jd(g)|0;c[k+224>>2]=l;if(!l){Me(3,6274,m);d=-1;break}else{ye(c[b>>2]|0,c[k+216>>2]|0)|0;Lf(c[a>>2]|0,+h[k+232>>3],+h[k+240>>3],k+264|0);d=0;break}}else d=-1;while(0);i=n;return d|0}function Sf(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;j=i;i=i+16|0;h=j+8|0;g=j;e=j+12|0;c[e>>2]=b;if(Cg(2044,e)|0){f=Dg(2044,e)|0;if(!(a[d>>0]&1))d=d+1|0;else d=c[d+8>>2]|0;b=f+216|0;e=Ke(c[b>>2]|0,d)|0;c[f+260>>2]=e;if((e|0)<0){c[g>>2]=d;Me(3,6312,g);Ce(c[b>>2]|0)|0;Me(3,6358,h);e=-1}}else e=-1;i=j;return e|0}function Tf(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;l=i;i=i+32|0;g=l+16|0;f=l+8|0;e=l+20|0;k=l;c[e>>2]=b;do if(Cg(2044,e)|0){j=Dg(2044,e)|0;if(!(a[d>>0]&1))e=d+1|0;else e=c[d+8>>2]|0;b=c[j+212>>2]|0;d=j+216|0;h=j+220|0;e=Jf(e,c[d>>2]|0)|0;c[h>>2]=e;if(!e){Me(3,6402,f);Ce(c[d>>2]|0)|0;Me(3,6429,g);e=-1;break}switch(c[e+108>>2]|0){case 0:{Zd(b,0)|0;break}case 1:{Zd(b,2)|0;break}default:Zd(b,3)|0}b=j+248|0;d=j+252|0;f=c[d>>2]|0;e=f-(c[b>>2]|0)>>3;g=k;c[g>>2]=0;c[g+4>>2]=0;c[k>>2]=e;c[k+4>>2]=c[h>>2];if((f|0)==(c[j+256>>2]|0)){Ig(b,k);break}else{j=k;e=c[j>>2]|0;j=c[j+4>>2]|0;k=f;c[k>>2]=e;c[k+4>>2]=j;c[d>>2]=(c[d>>2]|0)+8;break}}else e=-1;while(0);i=l;return e|0}function Uf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;g=i;i=i+16|0;d=g;c[d>>2]=a;if(((Cg(2044,d)|0)!=0?(e=Dg(2044,d)|0,(b|0)>=0):0)?(f=c[e+248>>2]|0,(c[e+252>>2]|0)-f>>3>>>0>b>>>0):0)d=c[(c[f+(b<<3)+4>>2]|0)+4>>2]|0;else d=-1;i=g;return d|0}function Vf(a){a=a|0;var b=0,d=0;d=i;i=i+16|0;b=d;c[b>>2]=a;if(!(Cg(2044,b)|0))b=-1;else{b=Dg(2044,b)|0;b=(c[b+252>>2]|0)-(c[b+248>>2]|0)>>3}i=d;return b|0}function Wf(a,b){a=a|0;b=+b;var d=0,e=0;e=i;i=i+16|0;d=e;c[d>>2]=a;if(Cg(2044,d)|0)h[(Dg(2044,d)|0)+232>>3]=b;i=e;return}function Xf(a){a=a|0;var b=0.0,d=0,e=0;e=i;i=i+16|0;d=e;c[d>>2]=a;if(!(Cg(2044,d)|0))b=-1.0;else b=+h[(Dg(2044,d)|0)+232>>3];i=e;return +b}function Yf(a,b){a=a|0;b=+b;var d=0,e=0;e=i;i=i+16|0;d=e;c[d>>2]=a;if(Cg(2044,d)|0)h[(Dg(2044,d)|0)+240>>3]=b;i=e;return}function Zf(a){a=a|0;var b=0.0,d=0,e=0;e=i;i=i+16|0;d=e;c[d>>2]=a;if(!(Cg(2044,d)|0))b=-1.0;else b=+h[(Dg(2044,d)|0)+240>>3];i=e;return +b}function _f(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=i;i=i+16|0;e=f;d=f+4|0;c[d>>2]=a;if((Cg(2044,d)|0)!=0?(Zd(c[(Dg(2044,d)|0)+212>>2]|0,b)|0)==0:0){c[e>>2]=b;Me(1,6478,e)}i=f;return}function $f(a){a=a|0;var b=0,d=0,e=0;e=i;i=i+16|0;b=e+4|0;d=e;c[b>>2]=a;if(!(Cg(2044,b)|0)){i=e;return -1}else{a=(ae(c[(Dg(2044,b)|0)+212>>2]|0,d)|0)==0;i=e;return (a?c[d>>2]|0:-1)|0}return 0}function ag(a,b){a=a|0;b=+b;var d=0,e=0,f=0.0,g=0,j=0,k=0;k=i;i=i+16|0;j=k;d=k+8|0;c[d>>2]=a;if((((Cg(2044,d)|0)!=0?(e=Dg(2044,d)|0,!(b<=0.0|b>=1.0)):0)?(f=b,g=c[e+212>>2]|0,(g|0)!=0):0)?(be(g,f)|0)==0:0){h[j>>3]=f;Me(1,6513,j)}i=k;return}function bg(a){a=a|0;var b=0,d=0,e=0,f=0;f=i;i=i+16|0;b=f+8|0;e=f;c[b>>2]=a;if((Cg(2044,b)|0)!=0?(d=c[(Dg(2044,b)|0)+212>>2]|0,(d|0)!=0):0){a=(ce(d,e)|0)==0;i=f;return +(a?+h[e>>3]:-1.0)}i=f;return -1.0}function cg(a,b){a=a|0;b=b|0;var d=0,e=0;e=i;i=i+16|0;d=e;c[d>>2]=a;if(Cg(2044,d)|0)_d(c[(Dg(2044,d)|0)+212>>2]|0,b)|0;i=e;return}function dg(a){a=a|0;var b=0,d=0,e=0;e=i;i=i+16|0;b=e+4|0;d=e;c[b>>2]=a;if(!(Cg(2044,b)|0))b=-1;else{$d(c[(Dg(2044,b)|0)+212>>2]|0,d)|0;b=c[d>>2]|0}i=e;return b|0}function eg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=i;i=i+16|0;e=f;d=f+4|0;c[d>>2]=a;if((Cg(2044,d)|0)!=0?(Sd(c[(Dg(2044,d)|0)+212>>2]|0,b)|0)==0:0){c[e>>2]=b;Me(1,6544,e)}i=f;return}function fg(a){a=a|0;var b=0,d=0,e=0;e=i;i=i+16|0;b=e+4|0;d=e;c[b>>2]=a;if(!(Cg(2044,b)|0)){i=e;return -1}else{a=(Td(c[(Dg(2044,b)|0)+212>>2]|0,d)|0)==0;i=e;return (a?c[d>>2]|0:-1)|0}return 0}function gg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;g=i;i=i+16|0;f=g;d=g+4|0;c[d>>2]=a;if(((Cg(2044,d)|0)!=0?(e=Dg(2044,d)|0,b>>>0<=255):0)?(Ud(c[e+212>>2]|0,b)|0)==0:0){c[f>>2]=b;Me(1,6569,f)}i=g;return}function hg(a){a=a|0;var b=0,d=0,e=0;e=i;i=i+16|0;b=e+4|0;d=e;c[b>>2]=a;if(!(Cg(2044,b)|0)){i=e;return -1}else{a=(Vd(c[(Dg(2044,b)|0)+212>>2]|0,d)|0)==0;i=e;return (a?c[d>>2]|0:-1)|0}return 0}function ig(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=i;i=i+16|0;e=f;d=f+4|0;c[d>>2]=a;if((Cg(2044,d)|0)!=0?(Pd(c[(Dg(2044,d)|0)+212>>2]|0,b)|0)==0:0){c[e>>2]=b;Me(1,6590,e)}i=f;return}function jg(a){a=a|0;var b=0,d=0,e=0;e=i;i=i+16|0;b=e+4|0;d=e;c[b>>2]=a;if(!(Cg(2044,b)|0)){i=e;return -1}else{a=(Wd(c[(Dg(2044,b)|0)+212>>2]|0,d)|0)==0;i=e;return (a?c[d>>2]|0:-1)|0}return 0}function kg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=i;i=i+16|0;e=f;d=f+4|0;c[d>>2]=a;if(!(Cg(2044,d)|0))b=0;else{a=(b|0)!=0;Od(c[(Dg(2044,d)|0)+212>>2]|0,a&1)|0;c[e>>2]=a?6616:6620;Me(1,6625,e)}i=f;return b|0}function lg(a){a=a|0;var b=0,d=0;d=i;i=i+16|0;b=d;c[b>>2]=a;if(!(Cg(2044,b)|0))b=0;else b=c[(c[(Dg(2044,b)|0)+212>>2]|0)+4834148>>2]|0;i=d;return b|0}function mg(a){a=a|0;var b=0,d=0,e=0;e=i;i=i+16|0;b=e+4|0;d=e;c[b>>2]=a;if(!(Cg(2044,b)|0))b=0;else{Rd(c[(Dg(2044,b)|0)+212>>2]|0,d)|0;b=c[d>>2]|0}i=e;return b|0}function ng(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=i;i=i+16|0;e=f;d=f+4|0;c[d>>2]=a;if((Cg(2044,d)|0)!=0?(Xd(c[(Dg(2044,d)|0)+212>>2]|0,b)|0)==0:0){c[e>>2]=b;Me(1,6647,e)}i=f;return}function og(a){a=a|0;var b=0,d=0,e=0;e=i;i=i+16|0;b=e+4|0;d=e;c[b>>2]=a;if(!(Cg(2044,b)|0)){i=e;return -1}else{a=(Yd(c[(Dg(2044,b)|0)+212>>2]|0,d)|0)==0;i=e;return (a?c[d>>2]|0:-1)|0}return 0}function pg(a,b){a=a|0;b=b|0;var c=0;c=0;do{h[b+(c<<5)>>3]=+h[a+(c<<5)>>3];h[b+(c<<5)+8>>3]=+h[a+(c<<5)+8>>3];h[b+(c<<5)+16>>3]=+h[a+(c<<5)+16>>3];h[b+(c<<5)+24>>3]=+h[a+(c<<5)+24>>3];c=c+1|0}while((c|0)!=3);return}function qg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;f=i;i=i+16|0;e=f;c[e>>2]=a;do if(Cg(2044,e)|0){e=Dg(2044,e)|0;a=c[e+212>>2]|0;if((c[a+44>>2]|0)>(b|0)){+ke(c[e+224>>2]|0,(b|0)<0?8:a+48+(b<<8)|0,+(d|0),264);e=0;break}else{e=c[523]|0;break}}else e=c[522]|0;while(0);i=f;return e|0}function rg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;f=i;i=i+16|0;e=f;c[e>>2]=a;do if(Cg(2044,e)|0){e=Dg(2044,e)|0;a=c[e+212>>2]|0;if((c[a+44>>2]|0)>(b|0)){+le(c[e+224>>2]|0,(b|0)<0?8:a+48+(b<<8)|0,264,+(d|0),264);e=0;break}else{e=c[523]|0;break}}else e=c[522]|0;while(0);i=f;return e|0}function sg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;f=i;i=i+16|0;e=f;c[e>>2]=a;do if(Cg(2044,e)|0){e=c[(Dg(2044,e)|0)+212>>2]|0;if((c[e+44>>2]|0)>(b|0)){c[((b|0)<0?8:e+48+(b<<8)|0)+16>>2]=d;e=0;break}else{e=c[523]|0;break}}else e=c[522]|0;while(0);i=f;return e|0}function tg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0,g=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0;e=i;i=i+16|0;d=e;c[d>>2]=a;do if(Cg(2044,d)|0){d=c[(Dg(2044,d)|0)+212>>2]|0;if((c[d+44>>2]|0)>(b|0)){d=(b|0)<0?8:d+48+(b<<8)|0;o=+h[33];h[d+168>>3]=o;k=+h[34];h[d+176>>3]=k;n=+h[35];h[d+184>>3]=n;j=+h[36];h[d+192>>3]=j;m=+h[37];h[d+200>>3]=m;g=+h[38];h[d+208>>3]=g;l=+h[39];h[d+216>>3]=l;f=+h[40];h[d+224>>3]=f;h[d+56>>3]=(o+n+m+l)*.25;h[d+64>>3]=(k+j+g+f)*.25;d=0;break}else{d=c[523]|0;break}}else d=c[522]|0;while(0);i=e;return d|0}function ug(a,b){a=a|0;b=b|0;var d=0,e=0;e=i;i=i+16|0;d=e;c[d>>2]=a;do if(Cg(2044,d)|0){d=Dg(2044,d)|0;a=c[d+248>>2]|0;if((b|0)<0?1:(c[d+252>>2]|0)-a>>3>>>0<=b>>>0){d=c[524]|0;break}else{b=c[a+(b<<3)+4>>2]|0;a=c[d+212>>2]|0;+Hf(c[d+224>>2]|0,a+48|0,c[a+44>>2]|0,b);pg(b+8|0,264);d=0;break}}else d=c[522]|0;while(0);i=e;return d|0}function vg(a,b){a=a|0;b=b|0;var d=0,e=0;e=i;i=i+16|0;d=e;c[d>>2]=a;do if(Cg(2044,d)|0){d=Dg(2044,d)|0;a=c[d+248>>2]|0;if((b|0)<0?1:(c[d+252>>2]|0)-a>>3>>>0<=b>>>0){d=c[524]|0;break}else{b=c[a+(b<<3)+4>>2]|0;a=c[d+212>>2]|0;+Gf(c[d+224>>2]|0,a+48|0,c[a+44>>2]|0,b);pg(b+8|0,264);d=0;break}}else d=c[522]|0;while(0);i=e;return d|0}function wg(a){a=a|0;var b=0,d=0;d=i;i=i+16|0;b=d;c[b>>2]=a;if(!(Cg(2044,b)|0))b=c[522]|0;else{b=Dg(2044,b)|0;b=de(c[b+212>>2]|0,c[b+196>>2]|0)|0}i=d;return b|0}function xg(a){a=a|0;var b=0,d=0;d=i;i=i+16|0;b=d;c[b>>2]=a;if(!(Cg(2044,b)|0))b=2088;else b=(c[(Dg(2044,b)|0)+212>>2]|0)+44|0;i=d;return c[b>>2]|0}function yg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;f=i;i=i+16|0;e=f;c[e>>2]=a;do if(Cg(2044,e)|0){a=Dg(2044,e)|0;e=c[a+248>>2]|0;if((b|0)<0?1:(c[a+252>>2]|0)-e>>3>>>0<=b>>>0){e=c[524]|0;break}e=c[e+(b<<3)+4>>2]|0;if((d|0)<0?1:(c[e+4>>2]|0)<=(d|0)){e=c[523]|0;break}else{e=c[e>>2]|0;pg(e+(d*320|0)+16|0,264);Lb(0,c[e+(d*320|0)+304>>2]|0,c[e+(d*320|0)>>2]|0,c[e+(d*320|0)+4>>2]|0,+(+h[e+(d*320|0)+8>>3]))|0;e=0;break}}else e=c[522]|0;while(0);i=f;return e|0}function zg(a,b){a=a|0;b=b|0;var d=0,e=0;e=i;i=i+16|0;d=e;c[d>>2]=a;do if(Cg(2044,d)|0){d=c[(Dg(2044,d)|0)+212>>2]|0;if((c[d+44>>2]|0)>(b|0)){d=(b|0)<0?8:d+48+(b<<8)|0;Qa(1,c[d>>2]|0,c[d+4>>2]|0,c[d+8>>2]|0,c[d+12>>2]|0,c[d+16>>2]|0,c[d+20>>2]|0,c[d+24>>2]|0,+(+h[d+32>>3]),+(+h[d+40>>3]),+(+h[d+48>>3]),+(+h[d+56>>3]),+(+h[d+64>>3]),+(+h[d+72>>3]),+(+h[d+80>>3]),+(+h[d+88>>3]),+(+h[d+96>>3]),+(+h[d+104>>3]),+(+h[d+112>>3]),+(+h[d+120>>3]),+(+h[d+128>>3]),+(+h[d+136>>3]),+(+h[d+144>>3]),+(+h[d+152>>3]),+(+h[d+160>>3]),+(+h[d+168>>3]),+(+h[d+176>>3]),+(+h[d+184>>3]),+(+h[d+192>>3]),+(+h[d+200>>3]),+(+h[d+208>>3]),+(+h[d+216>>3]),+(+h[d+224>>3]),c[d+240>>2]|0)|0;d=0;break}else{d=c[523]|0;break}}else d=c[522]|0;while(0);i=e;return d|0}function Ag(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;h=i;i=i+16|0;g=h+8|0;f=h+12|0;e=c[525]|0;c[525]=e+1;c[f>>2]=e;f=Dg(2044,f)|0;c[f>>2]=e;c[f+204>>2]=a;c[f+208>>2]=b;j=$(a<<2,b)|0;b=f+200|0;c[b>>2]=j;a=f+196|0;c[a>>2]=Uj(j)|0;j=Ae()|0;c[f+216>>2]=j;if(!j)Me(3,8285,h);Rf(e,d)|0;c[g>>2]=c[b>>2];Me(1,8322,g);Kb(2,c[f>>2]|0,c[a>>2]|0,c[b>>2]|0,f+264|0,264)|0;i=h;return c[f>>2]|0}function Bg(a){a=a|0;var b=0;a=i;i=i+16|0;b=a;Jg(8591,7);Kg(8597,3);Lg(8606,2);Lg(8617,3);Mg(8633,4);Kg(8651,4);Ng(8671,5);Jg(8683,8);Mg(8700,5);Jg(8720,9);Jg(8738,10);Mg(8760,6);Mg(8783,7);Kg(8812,6);Kg(8825,7);Jg(8838,11);Mg(8857,8);Mg(8867,9);Kg(8880,8);Kg(8893,9);Og(8912,10);Pg(8924,1);Qg(8936,1);Rg(8959,1);Qg(8982,2);Rg(9004,2);Sg(9026,1);Kg(9043,10);Sg(9060,2);Kg(9073,11);Sg(9086,3);Kg(9110,12);Tg(9134,3);Rg(9147,3);Sg(9160,4);Kg(9178,13);Sg(9196,5);Kg(9212,14);Sg(9228,6);Kg(9245,15);Ug(9262,2088);Ug(9291,2096);Ug(9319,2092);Cb(9352,680,0);Cb(9369,680,1);Cb(9385,680,0);Cb(9407,680,0);Cb(9432,680,1);Cb(9457,680,1);Cb(9482,680,100);Cb(9509,680,0);Cb(9535,680,1);Cb(9561,680,0);Cb(9588,680,0);Cb(9615,680,1);Cb(9641,680,2);Cb(9666,680,3);Cb(9704,680,4);Cb(9741,680,0);Cb(9775,680,0);Cb(9799,680,1);Cb(9825,680,2);Cb(9852,680,2);Cb(9886,680,5);h[b>>3]=.5;Vg(9904,b);Cb(9925,680,0);Cb(9944,680,1);Cb(9962,680,2);Cb(9980,680,3);Cb(9999,680,4);Cb(10021,680,3);Cb(10040,680,515);Cb(10069,680,259);Cb(10097,680,4);Cb(10116,680,772);Cb(10146,680,1028);Cb(10176,680,0);Cb(10207,680,1);Cb(10243,680,2);Cb(10277,680,3);Cb(10315,680,0);Cb(10348,680,1);Cb(10395,680,2);Cb(10437,680,3);Cb(10480,680,4);Cb(10532,680,5);Cb(10583,680,6);Cb(10628,680,7);Cb(10667,680,8);Cb(10712,680,9);i=a;return}function Cg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=c[b>>2]|0;f=c[a+4>>2]|0;a:do if(f){g=f+-1|0;h=(g&f|0)==0;if(h)e=g&d;else e=(d>>>0)%(f>>>0)|0;b=c[(c[a>>2]|0)+(e<<2)>>2]|0;if(b)do{b=c[b>>2]|0;if(!b){b=0;break a}a=c[b+4>>2]|0;if(h)a=a&g;else a=(a>>>0)%(f>>>0)|0;if((a|0)!=(e|0)){b=0;break a}}while((c[b+8>>2]|0)!=(d|0));else b=0}else b=0;while(0);return b|0}function Dg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;g=i;i=i+32|0;f=g+8|0;e=g;d=Cg(a,b)|0;if(!d){wh(f,a,b);xh(e,a,c[f>>2]|0);d=c[e>>2]|0;c[f>>2]=0}i=g;return d+16|0}function Eg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=i;i=i+16|0;d=f+4|0;e=f;b=Cg(a,b)|0;if(!b)b=0;else{c[e>>2]=b;c[d>>2]=c[e>>2];uh(a,d)|0;b=1}i=f;return b|0}function Fg(a){a=a|0;var b=0,d=0;d=c[a>>2]|0;if(d){b=a+4|0;a=c[b>>2]|0;if((a|0)!=(d|0)){do a=a+-8|0;while((a|0)!=(d|0));c[b>>2]=a}Lh(d)}return}function Gg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;g=i;i=i+32|0;f=g+8|0;e=g;d=Hg(a,b)|0;if(!d){qh(f,a,b);rh(e,a,c[f>>2]|0);d=c[e>>2]|0;c[f>>2]=0}i=g;return d+16|0}function Hg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=c[b>>2]|0;f=c[a+4>>2]|0;a:do if(f){g=f+-1|0;h=(g&f|0)==0;if(h)e=g&d;else e=(d>>>0)%(f>>>0)|0;b=c[(c[a>>2]|0)+(e<<2)>>2]|0;if(b)do{b=c[b>>2]|0;if(!b){b=0;break a}a=c[b+4>>2]|0;if(h)a=a&g;else a=(a>>>0)%(f>>>0)|0;if((a|0)!=(e|0)){b=0;break a}}while((c[b+8>>2]|0)!=(d|0));else b=0}else b=0;while(0);return b|0}function Ig(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;j=i;i=i+32|0;h=j;g=a+4|0;d=c[a>>2]|0;f=((c[g>>2]|0)-d>>3)+1|0;if(f>>>0>536870911)Jh(a);e=d;d=(c[a+8>>2]|0)-e|0;if(d>>3>>>0<268435455){d=d>>2;d=d>>>0<f>>>0?f:d}else d=536870911;nh(h,d,(c[g>>2]|0)-e>>3,a+8|0);g=h+8|0;f=c[g>>2]|0;d=b;e=c[d+4>>2]|0;b=f;c[b>>2]=c[d>>2];c[b+4>>2]=e;c[g>>2]=f+8;oh(a,h);ph(h);i=j;return}function Jg(a,b){a=a|0;b=b|0;Oa(a|0,4,2200,10911,1,b|0);return}function Kg(a,b){a=a|0;b=b|0;Oa(a|0,2,2192,10801,10,b|0);return}function Lg(a,b){a=a|0;b=b|0;Oa(a|0,3,2180,10906,12,b|0);return}function Mg(a,b){a=a|0;b=b|0;Oa(a|0,3,2168,10906,13,b|0);return}function Ng(a,b){a=a|0;b=b|0;Oa(a|0,2,2160,10801,11,b|0);return}function Og(a,b){a=a|0;b=b|0;Oa(a|0,2,2152,10797,7,b|0);return}function Pg(a,b){a=a|0;b=b|0;Oa(a|0,1,2148,10794,16,b|0);return}function Qg(a,b){a=a|0;b=b|0;Oa(a|0,3,2136,10789,1,b|0);return}function Rg(a,b){a=a|0;b=b|0;Oa(a|0,2,2128,10785,1,b|0);return}function Sg(a,b){a=a|0;b=b|0;Oa(a|0,3,2116,10780,1,b|0);return}function Tg(a,b){a=a|0;b=b|0;Oa(a|0,3,2104,10775,2,b|0);return}function Ug(a,b){a=a|0;b=b|0;Cb(a|0,680,c[b>>2]|0);return}function Vg(a,b){a=a|0;b=b|0;Cb(a|0,720,~~+h[b>>3]>>>0|0);return}function Wg(){c[511]=0;c[512]=0;c[513]=0;c[514]=0;g[515]=1.0;ub(11,2044,n|0)|0;c[516]=0;c[517]=0;c[518]=0;c[519]=0;g[520]=1.0;ub(12,2064,n|0)|0;Bg(0);return}function Xg(a){a=a|0;$g(a);return}function Yg(a){a=a|0;Zg(a);return}function Zg(a){a=a|0;var b=0;_g(a,c[a+8>>2]|0);b=c[a>>2]|0;c[a>>2]=0;if(b)Lh(b);return}function _g(a,b){a=a|0;b=b|0;if(b)do{a=b;b=c[b>>2]|0;Lh(a)}while((b|0)!=0);return}function $g(a){a=a|0;var b=0;ah(a,c[a+8>>2]|0);b=c[a>>2]|0;c[a>>2]=0;if(b)Lh(b);return}function ah(a,b){a=a|0;b=b|0;if(b)do{a=b;b=c[b>>2]|0;Fg(a+264|0);Lh(a)}while((b|0)!=0);return}function bh(a,b,c){a=a|0;b=b|0;c=+c;Tb[a&3](b,c);return}function ch(a,b,c){a=a|0;b=b|0;c=c|0;Xb[a&7](b,c);return}function dh(a,b){a=a|0;b=b|0;return +(+Ub[a&3](b))}function eh(a,b,c){a=a|0;b=b|0;c=+c;Tb[a&3](b,c);return}function fh(a){a=a|0;return Vb[a&1]()|0}function gh(a,b){a=a|0;b=b|0;Wb[a&15](b);return}function hh(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;i=i+16|0;d=c;ih(d,b);a=Yb[a&31](d)|0;bk(d);i=c;return a|0}function ih(a,b){a=a|0;b=b|0;ak(a,b+4|0,c[b>>2]|0);return}function jh(a,b,c){a=a|0;b=b|0;c=c|0;return cc[a&15](b,c)|0}function kh(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=i;i=i+16|0;e=d;ih(e,c);a=cc[a&15](b,e)|0;bk(e);i=d;return a|0}function lh(a,b){a=a|0;b=b|0;return Yb[a&31](b)|0}function mh(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Qb[a&15](b,c,d)|0}function nh(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;c[a+12>>2]=0;c[a+16>>2]=e;if(!b)e=0;else e=Kh(b<<3)|0;c[a>>2]=e;d=e+(d<<3)|0;c[a+8>>2]=d;c[a+4>>2]=d;c[a+12>>2]=e+(b<<3);return}function oh(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;e=c[a>>2]|0;g=a+4|0;d=b+4|0;f=(c[g>>2]|0)-e|0;h=(c[d>>2]|0)+(0-(f>>3)<<3)|0;c[d>>2]=h;ik(h|0,e|0,f|0)|0;f=c[a>>2]|0;c[a>>2]=c[d>>2];c[d>>2]=f;f=b+8|0;e=c[g>>2]|0;c[g>>2]=c[f>>2];c[f>>2]=e;f=a+8|0;a=b+12|0;e=c[f>>2]|0;c[f>>2]=c[a>>2];c[a>>2]=e;c[b>>2]=c[d>>2];return}function ph(a){a=a|0;var b=0,d=0,e=0;d=c[a+4>>2]|0;e=a+8|0;b=c[e>>2]|0;if((b|0)!=(d|0)){do b=b+-8|0;while((b|0)!=(d|0));c[e>>2]=b}b=c[a>>2]|0;if(b)Lh(b);return}function qh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=Kh(200)|0;c[e+8>>2]=c[d>>2];ek(e+16|0,0,184)|0;c[a>>2]=e;a=a+4|0;c[a>>2]=b+8;c[a+4>>2]=257;return}function rh(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0.0,k=0.0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;m=c[e+8>>2]|0;s=e+4|0;c[s>>2]=m;r=d+4|0;l=c[r>>2]|0;q=(l|0)==0;a:do if(!q){n=l+-1|0;o=(n&l|0)==0;if(o)h=n&m;else h=(m>>>0)%(l>>>0)|0;f=c[(c[d>>2]|0)+(h<<2)>>2]|0;if(!f)p=12;else while(1){i=c[f>>2]|0;if(!i){p=12;break a}f=c[i+4>>2]|0;if(o)f=f&n;else f=(f>>>0)%(l>>>0)|0;if((f|0)!=(h|0)){p=12;break a}if((c[i+8>>2]|0)==(m|0)){f=0;e=i;break}else f=i}}else{h=0;p=12}while(0);if((p|0)==12){m=d+12|0;j=+(((c[m>>2]|0)+1|0)>>>0);k=+g[d+16>>2];do if(q|j>+(l>>>0)*k){if(l>>>0>2)f=(l+-1&l|0)==0;else f=0;i=(f&1|l<<1)^1;f=~~+_(+(j/k))>>>0;sh(d,i>>>0<f>>>0?f:i);i=c[r>>2]|0;f=c[s>>2]|0;h=i+-1|0;if(!(h&i)){l=i;h=h&f;break}else{l=i;h=(f>>>0)%(i>>>0)|0;break}}while(0);f=c[(c[d>>2]|0)+(h<<2)>>2]|0;if(!f){f=d+8|0;c[e>>2]=c[f>>2];c[f>>2]=e;c[(c[d>>2]|0)+(h<<2)>>2]=f;f=c[e>>2]|0;if(f){f=c[f+4>>2]|0;h=l+-1|0;if(!(h&l))f=f&h;else f=(f>>>0)%(l>>>0)|0;c[(c[d>>2]|0)+(f<<2)>>2]=e}}else{c[e>>2]=c[f>>2];c[f>>2]=e}c[m>>2]=(c[m>>2]|0)+1;f=1}c[b>>2]=e;a[b+4>>0]=f;return} +function zd(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;E=i;i=i+16|0;C=E;p=c[k>>2]|0;B=g+-1|0;if((f|0)>0){l=0;m=p;n=p+(($(B,f)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(f|0))break;else{m=m+2|0;n=n+2|0}}}A=j*3|0;z=f+-1|0;if((g|0)>0){l=0;j=p;m=p+(z<<1)|0;while(1){b[m>>1]=0;b[j>>1]=0;l=l+1|0;if((l|0)>=(g|0))break;else{j=j+(f<<1)|0;m=m+(f<<1)|0}}}m=k+1179664|0;l=f+1|0;w=0-f|0;u=1-f|0;v=~f;a:do if((B|0)>1){x=(z|0)>1;o=(c[k+4>>2]|0)+l|0;y=1;n=e+(l*3|0)|0;e=p+(l<<1)|0;j=0;b:while(1){if(x){l=o;t=1;s=n;r=j;while(1){do if(((d[s+1>>0]|0)+(d[s>>0]|0)+(d[s+2>>0]|0)|0)>(A|0)){a[l>>0]=-1;j=b[e+(w<<1)>>1]|0;if(j<<16>>16>0){b[e>>1]=j;j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}o=b[e+(u<<1)>>1]|0;p=o<<16>>16;j=b[e+(v<<1)>>1]|0;q=j<<16>>16;n=j<<16>>16>0;if(o<<16>>16<=0){if(n){b[e>>1]=j;j=q*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+t;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+y;n=k+1310736+(j+-3<<2)|0;if((c[n>>2]|0)<(t|0))c[n>>2]=t;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}j=b[e+-2>>1]|0;if(j<<16>>16>0){b[e>>1]=j;j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;j=k+1310736+(j+-3<<2)|0;if((c[j>>2]|0)>=(t|0)){j=r;break}c[j>>2]=t;j=r;break}else{j=r+1|0;if((r|0)>32767)break b;b[e>>1]=j;c[k+1179664+(r<<2)>>2]=j<<16>>16;r=r*7|0;c[k+1310736+(r<<2)>>2]=1;c[k+1310736+(r+1<<2)>>2]=t;c[k+1310736+(r+2<<2)>>2]=y;c[k+1310736+(r+3<<2)>>2]=t;c[k+1310736+(r+4<<2)>>2]=t;c[k+1310736+(r+5<<2)>>2]=y;c[k+1310736+(r+6<<2)>>2]=y;break}}if(n){j=c[k+1179664+(p+-1<<2)>>2]|0;p=c[k+1179664+(q+-1<<2)>>2]|0;if((j|0)>(p|0)){b[e>>1]=p;if((r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(j|0))c[o>>2]=p;n=n+1|0;if((n|0)>=(r|0)){j=p;break}else o=o+4|0}}else j=p}else{b[e>>1]=j;if((j|0)<(p|0)&(r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(p|0))c[o>>2]=j;n=n+1|0;if((n|0)>=(r|0))break;else o=o+4|0}}}j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}n=b[e+-2>>1]|0;if(n<<16>>16<=0){b[e>>1]=o;j=p*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+t;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+y;n=k+1310736+(j+-4<<2)|0;if((c[n>>2]|0)>(t|0))c[n>>2]=t;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}j=c[k+1179664+(p+-1<<2)>>2]|0;p=c[k+1179664+((n<<16>>16)+-1<<2)>>2]|0;if((j|0)>(p|0)){b[e>>1]=p;if((r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(j|0))c[o>>2]=p;n=n+1|0;if((n|0)>=(r|0)){j=p;break}else o=o+4|0}}else j=p}else{b[e>>1]=j;if((j|0)<(p|0)&(r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(p|0))c[o>>2]=j;n=n+1|0;if((n|0)>=(r|0))break;else o=o+4|0}}}j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;j=k+1310736+(j+-5<<2)|0;c[j>>2]=(c[j>>2]|0)+y;j=r}else{b[e>>1]=0;a[l>>0]=0;j=r}while(0);t=t+1|0;n=s+3|0;e=e+2|0;l=l+1|0;if((t|0)>=(z|0))break;else{s=n;r=j}}}else l=o;y=y+1|0;if((y|0)>=(B|0)){p=j;D=52;break a}else{o=l+2|0;n=n+6|0;e=e+4|0}}Me(3,3904,C);l=-1}else{p=0;D=52}while(0);if((D|0)==52){e=k+12|0;if((p|0)<1)j=1;else{n=1;j=1;while(1){l=c[m>>2]|0;if((l|0)==(n|0)){l=j;j=j+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[m>>2]=l;if((n|0)<(p|0)){n=n+1|0;m=m+4|0}else break}}o=k+8|0;l=j+-1|0;c[o>>2]=l;if(l){ek(e|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((j|0)>1){l=0;do{D=l<<2;c[k+131084+(D<<2)>>2]=f;c[k+131084+((D|1)<<2)>>2]=0;c[k+131084+((D|2)<<2)>>2]=g;c[k+131084+((D|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[o>>2]|0))}if((p|0)>0){e=0;do{m=(c[k+1179664+(e<<2)>>2]|0)+-1|0;n=e*7|0;l=k+12+(m<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(n<<2)>>2]|0);l=m<<1;j=k+655376+(l<<3)|0;h[j>>3]=+h[j>>3]+ +(c[k+1310736+(n+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(n+2<<2)>>2]|0);m=m<<2;l=k+131084+(m<<2)|0;j=c[k+1310736+(n+3<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;l=k+131084+((m|1)<<2)|0;j=c[k+1310736+(n+4<<2)>>2]|0;if((c[l>>2]|0)<(j|0))c[l>>2]=j;l=k+131084+((m|2)<<2)|0;j=c[k+1310736+(n+5<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;j=k+131084+((m|3)<<2)|0;l=c[k+1310736+(n+6<<2)>>2]|0;if((c[j>>2]|0)<(l|0))c[j>>2]=l;e=e+1|0}while((e|0)<(p|0))}if((c[o>>2]|0)>0){l=0;do{f=k+12+(l<<2)|0;g=l<<1;D=k+655376+(g<<3)|0;h[D>>3]=+h[D>>3]/+(c[f>>2]|0);g=k+655376+((g|1)<<3)|0;h[g>>3]=+h[g>>3]/+(c[f>>2]|0);l=l+1|0}while((l|0)<(c[o>>2]|0));l=0}else l=0}else l=0}i=E;return l|0}function Ad(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;E=i;i=i+16|0;C=E;p=c[k>>2]|0;B=g+-1|0;if((f|0)>0){l=0;m=p;n=p+(($(B,f)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(f|0))break;else{m=m+2|0;n=n+2|0}}}A=j*3|0;z=f+-1|0;if((g|0)>0){l=0;j=p;m=p+(z<<1)|0;while(1){b[m>>1]=0;b[j>>1]=0;l=l+1|0;if((l|0)>=(g|0))break;else{j=j+(f<<1)|0;m=m+(f<<1)|0}}}m=k+1179664|0;l=f+1|0;w=0-f|0;u=1-f|0;v=~f;a:do if((B|0)>1){x=(z|0)>1;o=(c[k+4>>2]|0)+l|0;y=1;n=e+(l<<1)|0;e=p+(l<<1)|0;j=0;b:while(1){if(x){l=o;t=1;s=n;r=j;while(1){p=d[s>>0]|0;q=d[s+1>>0]|0;do if(((p&248)+10+(p<<5&224)+(q>>>3&28)+(q<<3&248)|0)>(A|0)){a[l>>0]=-1;j=b[e+(w<<1)>>1]|0;if(j<<16>>16>0){b[e>>1]=j;j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}o=b[e+(u<<1)>>1]|0;p=o<<16>>16;j=b[e+(v<<1)>>1]|0;q=j<<16>>16;n=j<<16>>16>0;if(o<<16>>16<=0){if(n){b[e>>1]=j;j=q*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+t;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+y;n=k+1310736+(j+-3<<2)|0;if((c[n>>2]|0)<(t|0))c[n>>2]=t;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}j=b[e+-2>>1]|0;if(j<<16>>16>0){b[e>>1]=j;j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;j=k+1310736+(j+-3<<2)|0;if((c[j>>2]|0)>=(t|0)){j=r;break}c[j>>2]=t;j=r;break}else{j=r+1|0;if((r|0)>32767)break b;b[e>>1]=j;c[k+1179664+(r<<2)>>2]=j<<16>>16;r=r*7|0;c[k+1310736+(r<<2)>>2]=1;c[k+1310736+(r+1<<2)>>2]=t;c[k+1310736+(r+2<<2)>>2]=y;c[k+1310736+(r+3<<2)>>2]=t;c[k+1310736+(r+4<<2)>>2]=t;c[k+1310736+(r+5<<2)>>2]=y;c[k+1310736+(r+6<<2)>>2]=y;break}}if(n){j=c[k+1179664+(p+-1<<2)>>2]|0;p=c[k+1179664+(q+-1<<2)>>2]|0;if((j|0)>(p|0)){b[e>>1]=p;if((r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(j|0))c[o>>2]=p;n=n+1|0;if((n|0)>=(r|0)){j=p;break}else o=o+4|0}}else j=p}else{b[e>>1]=j;if((j|0)<(p|0)&(r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(p|0))c[o>>2]=j;n=n+1|0;if((n|0)>=(r|0))break;else o=o+4|0}}}j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}n=b[e+-2>>1]|0;if(n<<16>>16<=0){b[e>>1]=o;j=p*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+t;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+y;n=k+1310736+(j+-4<<2)|0;if((c[n>>2]|0)>(t|0))c[n>>2]=t;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}j=c[k+1179664+(p+-1<<2)>>2]|0;p=c[k+1179664+((n<<16>>16)+-1<<2)>>2]|0;if((j|0)>(p|0)){b[e>>1]=p;if((r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(j|0))c[o>>2]=p;n=n+1|0;if((n|0)>=(r|0)){j=p;break}else o=o+4|0}}else j=p}else{b[e>>1]=j;if((j|0)<(p|0)&(r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(p|0))c[o>>2]=j;n=n+1|0;if((n|0)>=(r|0))break;else o=o+4|0}}}j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;j=k+1310736+(j+-5<<2)|0;c[j>>2]=(c[j>>2]|0)+y;j=r}else{b[e>>1]=0;a[l>>0]=0;j=r}while(0);t=t+1|0;n=s+2|0;e=e+2|0;l=l+1|0;if((t|0)>=(z|0))break;else{s=n;r=j}}}else l=o;y=y+1|0;if((y|0)>=(B|0)){p=j;D=52;break a}else{o=l+2|0;n=n+4|0;e=e+4|0}}Me(3,3904,C);l=-1}else{p=0;D=52}while(0);if((D|0)==52){e=k+12|0;if((p|0)<1)j=1;else{n=1;j=1;while(1){l=c[m>>2]|0;if((l|0)==(n|0)){l=j;j=j+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[m>>2]=l;if((n|0)<(p|0)){n=n+1|0;m=m+4|0}else break}}o=k+8|0;l=j+-1|0;c[o>>2]=l;if(l){ek(e|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((j|0)>1){l=0;do{D=l<<2;c[k+131084+(D<<2)>>2]=f;c[k+131084+((D|1)<<2)>>2]=0;c[k+131084+((D|2)<<2)>>2]=g;c[k+131084+((D|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[o>>2]|0))}if((p|0)>0){e=0;do{m=(c[k+1179664+(e<<2)>>2]|0)+-1|0;n=e*7|0;l=k+12+(m<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(n<<2)>>2]|0);l=m<<1;j=k+655376+(l<<3)|0;h[j>>3]=+h[j>>3]+ +(c[k+1310736+(n+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(n+2<<2)>>2]|0);m=m<<2;l=k+131084+(m<<2)|0;j=c[k+1310736+(n+3<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;l=k+131084+((m|1)<<2)|0;j=c[k+1310736+(n+4<<2)>>2]|0;if((c[l>>2]|0)<(j|0))c[l>>2]=j;l=k+131084+((m|2)<<2)|0;j=c[k+1310736+(n+5<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;j=k+131084+((m|3)<<2)|0;l=c[k+1310736+(n+6<<2)>>2]|0;if((c[j>>2]|0)<(l|0))c[j>>2]=l;e=e+1|0}while((e|0)<(p|0))}if((c[o>>2]|0)>0){l=0;do{f=k+12+(l<<2)|0;g=l<<1;D=k+655376+(g<<3)|0;h[D>>3]=+h[D>>3]/+(c[f>>2]|0);g=k+655376+((g|1)<<3)|0;h[g>>3]=+h[g>>3]/+(c[f>>2]|0);l=l+1|0}while((l|0)<(c[o>>2]|0));l=0}else l=0}else l=0}i=E;return l|0}function Bd(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;E=i;i=i+16|0;C=E;p=c[k>>2]|0;B=g+-1|0;if((f|0)>0){l=0;m=p;n=p+(($(B,f)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(f|0))break;else{m=m+2|0;n=n+2|0}}}A=j*3|0;z=f+-1|0;if((g|0)>0){l=0;j=p;m=p+(z<<1)|0;while(1){b[m>>1]=0;b[j>>1]=0;l=l+1|0;if((l|0)>=(g|0))break;else{j=j+(f<<1)|0;m=m+(f<<1)|0}}}m=k+1179664|0;l=f+1|0;w=0-f|0;u=1-f|0;v=~f;a:do if((B|0)>1){x=(z|0)>1;o=(c[k+4>>2]|0)+l|0;y=1;n=e+(l<<2)|0;e=p+(l<<1)|0;j=0;b:while(1){if(x){l=o;t=1;s=n;r=j;while(1){do if(((d[s+1>>0]|0)+(d[s>>0]|0)+(d[s+2>>0]|0)|0)>(A|0)){a[l>>0]=-1;j=b[e+(w<<1)>>1]|0;if(j<<16>>16>0){b[e>>1]=j;j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}o=b[e+(u<<1)>>1]|0;p=o<<16>>16;j=b[e+(v<<1)>>1]|0;q=j<<16>>16;n=j<<16>>16>0;if(o<<16>>16<=0){if(n){b[e>>1]=j;j=q*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+t;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+y;n=k+1310736+(j+-3<<2)|0;if((c[n>>2]|0)<(t|0))c[n>>2]=t;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}j=b[e+-2>>1]|0;if(j<<16>>16>0){b[e>>1]=j;j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;j=k+1310736+(j+-3<<2)|0;if((c[j>>2]|0)>=(t|0)){j=r;break}c[j>>2]=t;j=r;break}else{j=r+1|0;if((r|0)>32767)break b;b[e>>1]=j;c[k+1179664+(r<<2)>>2]=j<<16>>16;r=r*7|0;c[k+1310736+(r<<2)>>2]=1;c[k+1310736+(r+1<<2)>>2]=t;c[k+1310736+(r+2<<2)>>2]=y;c[k+1310736+(r+3<<2)>>2]=t;c[k+1310736+(r+4<<2)>>2]=t;c[k+1310736+(r+5<<2)>>2]=y;c[k+1310736+(r+6<<2)>>2]=y;break}}if(n){j=c[k+1179664+(p+-1<<2)>>2]|0;p=c[k+1179664+(q+-1<<2)>>2]|0;if((j|0)>(p|0)){b[e>>1]=p;if((r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(j|0))c[o>>2]=p;n=n+1|0;if((n|0)>=(r|0)){j=p;break}else o=o+4|0}}else j=p}else{b[e>>1]=j;if((j|0)<(p|0)&(r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(p|0))c[o>>2]=j;n=n+1|0;if((n|0)>=(r|0))break;else o=o+4|0}}}j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}n=b[e+-2>>1]|0;if(n<<16>>16<=0){b[e>>1]=o;j=p*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+t;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+y;n=k+1310736+(j+-4<<2)|0;if((c[n>>2]|0)>(t|0))c[n>>2]=t;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}j=c[k+1179664+(p+-1<<2)>>2]|0;p=c[k+1179664+((n<<16>>16)+-1<<2)>>2]|0;if((j|0)>(p|0)){b[e>>1]=p;if((r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(j|0))c[o>>2]=p;n=n+1|0;if((n|0)>=(r|0)){j=p;break}else o=o+4|0}}else j=p}else{b[e>>1]=j;if((j|0)<(p|0)&(r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(p|0))c[o>>2]=j;n=n+1|0;if((n|0)>=(r|0))break;else o=o+4|0}}}j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;j=k+1310736+(j+-5<<2)|0;c[j>>2]=(c[j>>2]|0)+y;j=r}else{b[e>>1]=0;a[l>>0]=0;j=r}while(0);t=t+1|0;n=s+4|0;e=e+2|0;l=l+1|0;if((t|0)>=(z|0))break;else{s=n;r=j}}}else l=o;y=y+1|0;if((y|0)>=(B|0)){p=j;D=52;break a}else{o=l+2|0;n=n+8|0;e=e+4|0}}Me(3,3904,C);l=-1}else{p=0;D=52}while(0);if((D|0)==52){e=k+12|0;if((p|0)<1)j=1;else{n=1;j=1;while(1){l=c[m>>2]|0;if((l|0)==(n|0)){l=j;j=j+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[m>>2]=l;if((n|0)<(p|0)){n=n+1|0;m=m+4|0}else break}}o=k+8|0;l=j+-1|0;c[o>>2]=l;if(l){ek(e|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((j|0)>1){l=0;do{D=l<<2;c[k+131084+(D<<2)>>2]=f;c[k+131084+((D|1)<<2)>>2]=0;c[k+131084+((D|2)<<2)>>2]=g;c[k+131084+((D|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[o>>2]|0))}if((p|0)>0){e=0;do{m=(c[k+1179664+(e<<2)>>2]|0)+-1|0;n=e*7|0;l=k+12+(m<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(n<<2)>>2]|0);l=m<<1;j=k+655376+(l<<3)|0;h[j>>3]=+h[j>>3]+ +(c[k+1310736+(n+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(n+2<<2)>>2]|0);m=m<<2;l=k+131084+(m<<2)|0;j=c[k+1310736+(n+3<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;l=k+131084+((m|1)<<2)|0;j=c[k+1310736+(n+4<<2)>>2]|0;if((c[l>>2]|0)<(j|0))c[l>>2]=j;l=k+131084+((m|2)<<2)|0;j=c[k+1310736+(n+5<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;j=k+131084+((m|3)<<2)|0;l=c[k+1310736+(n+6<<2)>>2]|0;if((c[j>>2]|0)<(l|0))c[j>>2]=l;e=e+1|0}while((e|0)<(p|0))}if((c[o>>2]|0)>0){l=0;do{f=k+12+(l<<2)|0;g=l<<1;D=k+655376+(g<<3)|0;h[D>>3]=+h[D>>3]/+(c[f>>2]|0);g=k+655376+((g|1)<<3)|0;h[g>>3]=+h[g>>3]/+(c[f>>2]|0);l=l+1|0}while((l|0)<(c[o>>2]|0));l=0}else l=0}else l=0}i=E;return l|0}function Cd(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;E=i;i=i+16|0;C=E;p=c[k>>2]|0;B=g+-1|0;if((f|0)>0){l=0;m=p;n=p+(($(B,f)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(f|0))break;else{m=m+2|0;n=n+2|0}}}A=j*3|0;z=f+-1|0;if((g|0)>0){l=0;j=p;m=p+(z<<1)|0;while(1){b[m>>1]=0;b[j>>1]=0;l=l+1|0;if((l|0)>=(g|0))break;else{j=j+(f<<1)|0;m=m+(f<<1)|0}}}m=k+1179664|0;l=f+1|0;w=0-f|0;u=1-f|0;v=~f;a:do if((B|0)>1){x=(z|0)>1;o=(c[k+4>>2]|0)+l|0;y=1;n=e+(l<<1)|0;e=p+(l<<1)|0;j=0;b:while(1){if(x){l=o;t=1;s=n;r=j;while(1){q=d[s>>0]|0;do if(((q&240)+24+(q<<4&240)+((d[s+1>>0]|0)&240)|0)>(A|0)){a[l>>0]=-1;j=b[e+(w<<1)>>1]|0;if(j<<16>>16>0){b[e>>1]=j;j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}o=b[e+(u<<1)>>1]|0;p=o<<16>>16;j=b[e+(v<<1)>>1]|0;q=j<<16>>16;n=j<<16>>16>0;if(o<<16>>16<=0){if(n){b[e>>1]=j;j=q*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+t;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+y;n=k+1310736+(j+-3<<2)|0;if((c[n>>2]|0)<(t|0))c[n>>2]=t;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}j=b[e+-2>>1]|0;if(j<<16>>16>0){b[e>>1]=j;j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;j=k+1310736+(j+-3<<2)|0;if((c[j>>2]|0)>=(t|0)){j=r;break}c[j>>2]=t;j=r;break}else{j=r+1|0;if((r|0)>32767)break b;b[e>>1]=j;c[k+1179664+(r<<2)>>2]=j<<16>>16;r=r*7|0;c[k+1310736+(r<<2)>>2]=1;c[k+1310736+(r+1<<2)>>2]=t;c[k+1310736+(r+2<<2)>>2]=y;c[k+1310736+(r+3<<2)>>2]=t;c[k+1310736+(r+4<<2)>>2]=t;c[k+1310736+(r+5<<2)>>2]=y;c[k+1310736+(r+6<<2)>>2]=y;break}}if(n){j=c[k+1179664+(p+-1<<2)>>2]|0;p=c[k+1179664+(q+-1<<2)>>2]|0;if((j|0)>(p|0)){b[e>>1]=p;if((r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(j|0))c[o>>2]=p;n=n+1|0;if((n|0)>=(r|0)){j=p;break}else o=o+4|0}}else j=p}else{b[e>>1]=j;if((j|0)<(p|0)&(r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(p|0))c[o>>2]=j;n=n+1|0;if((n|0)>=(r|0))break;else o=o+4|0}}}j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}n=b[e+-2>>1]|0;if(n<<16>>16<=0){b[e>>1]=o;j=p*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+t;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+y;n=k+1310736+(j+-4<<2)|0;if((c[n>>2]|0)>(t|0))c[n>>2]=t;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}j=c[k+1179664+(p+-1<<2)>>2]|0;p=c[k+1179664+((n<<16>>16)+-1<<2)>>2]|0;if((j|0)>(p|0)){b[e>>1]=p;if((r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(j|0))c[o>>2]=p;n=n+1|0;if((n|0)>=(r|0)){j=p;break}else o=o+4|0}}else j=p}else{b[e>>1]=j;if((j|0)<(p|0)&(r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(p|0))c[o>>2]=j;n=n+1|0;if((n|0)>=(r|0))break;else o=o+4|0}}}j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;j=k+1310736+(j+-5<<2)|0;c[j>>2]=(c[j>>2]|0)+y;j=r}else{b[e>>1]=0;a[l>>0]=0;j=r}while(0);t=t+1|0;n=s+2|0;e=e+2|0;l=l+1|0;if((t|0)>=(z|0))break;else{s=n;r=j}}}else l=o;y=y+1|0;if((y|0)>=(B|0)){p=j;D=52;break a}else{o=l+2|0;n=n+4|0;e=e+4|0}}Me(3,3904,C);l=-1}else{p=0;D=52}while(0);if((D|0)==52){e=k+12|0;if((p|0)<1)j=1;else{n=1;j=1;while(1){l=c[m>>2]|0;if((l|0)==(n|0)){l=j;j=j+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[m>>2]=l;if((n|0)<(p|0)){n=n+1|0;m=m+4|0}else break}}o=k+8|0;l=j+-1|0;c[o>>2]=l;if(l){ek(e|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((j|0)>1){l=0;do{D=l<<2;c[k+131084+(D<<2)>>2]=f;c[k+131084+((D|1)<<2)>>2]=0;c[k+131084+((D|2)<<2)>>2]=g;c[k+131084+((D|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[o>>2]|0))}if((p|0)>0){e=0;do{m=(c[k+1179664+(e<<2)>>2]|0)+-1|0;n=e*7|0;l=k+12+(m<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(n<<2)>>2]|0);l=m<<1;j=k+655376+(l<<3)|0;h[j>>3]=+h[j>>3]+ +(c[k+1310736+(n+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(n+2<<2)>>2]|0);m=m<<2;l=k+131084+(m<<2)|0;j=c[k+1310736+(n+3<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;l=k+131084+((m|1)<<2)|0;j=c[k+1310736+(n+4<<2)>>2]|0;if((c[l>>2]|0)<(j|0))c[l>>2]=j;l=k+131084+((m|2)<<2)|0;j=c[k+1310736+(n+5<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;j=k+131084+((m|3)<<2)|0;l=c[k+1310736+(n+6<<2)>>2]|0;if((c[j>>2]|0)<(l|0))c[j>>2]=l;e=e+1|0}while((e|0)<(p|0))}if((c[o>>2]|0)>0){l=0;do{f=k+12+(l<<2)|0;g=l<<1;D=k+655376+(g<<3)|0;h[D>>3]=+h[D>>3]/+(c[f>>2]|0);g=k+655376+((g|1)<<3)|0;h[g>>3]=+h[g>>3]/+(c[f>>2]|0);l=l+1|0}while((l|0)<(c[o>>2]|0));l=0}else l=0}else l=0}i=E;return l|0}function Dd(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;E=i;i=i+16|0;C=E;p=c[k>>2]|0;B=g+-1|0;if((f|0)>0){l=0;m=p;n=p+(($(B,f)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(f|0))break;else{m=m+2|0;n=n+2|0}}}A=j*3|0;z=f+-1|0;if((g|0)>0){l=0;j=p;m=p+(z<<1)|0;while(1){b[m>>1]=0;b[j>>1]=0;l=l+1|0;if((l|0)>=(g|0))break;else{j=j+(f<<1)|0;m=m+(f<<1)|0}}}m=k+1179664|0;l=f+1|0;w=0-f|0;u=1-f|0;v=~f;a:do if((B|0)>1){x=(z|0)>1;o=(c[k+4>>2]|0)+l|0;y=1;n=e+(l<<1)|0;e=p+(l<<1)|0;j=0;b:while(1){if(x){l=o;t=1;s=n;r=j;while(1){p=d[s>>0]|0;q=d[s+1>>0]|0;do if(((p&248)+12+(p<<5&224)+(q>>>3&24)+(q<<2&248)|0)>(A|0)){a[l>>0]=-1;j=b[e+(w<<1)>>1]|0;if(j<<16>>16>0){b[e>>1]=j;j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}o=b[e+(u<<1)>>1]|0;p=o<<16>>16;j=b[e+(v<<1)>>1]|0;q=j<<16>>16;n=j<<16>>16>0;if(o<<16>>16<=0){if(n){b[e>>1]=j;j=q*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+t;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+y;n=k+1310736+(j+-3<<2)|0;if((c[n>>2]|0)<(t|0))c[n>>2]=t;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}j=b[e+-2>>1]|0;if(j<<16>>16>0){b[e>>1]=j;j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;j=k+1310736+(j+-3<<2)|0;if((c[j>>2]|0)>=(t|0)){j=r;break}c[j>>2]=t;j=r;break}else{j=r+1|0;if((r|0)>32767)break b;b[e>>1]=j;c[k+1179664+(r<<2)>>2]=j<<16>>16;r=r*7|0;c[k+1310736+(r<<2)>>2]=1;c[k+1310736+(r+1<<2)>>2]=t;c[k+1310736+(r+2<<2)>>2]=y;c[k+1310736+(r+3<<2)>>2]=t;c[k+1310736+(r+4<<2)>>2]=t;c[k+1310736+(r+5<<2)>>2]=y;c[k+1310736+(r+6<<2)>>2]=y;break}}if(n){j=c[k+1179664+(p+-1<<2)>>2]|0;p=c[k+1179664+(q+-1<<2)>>2]|0;if((j|0)>(p|0)){b[e>>1]=p;if((r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(j|0))c[o>>2]=p;n=n+1|0;if((n|0)>=(r|0)){j=p;break}else o=o+4|0}}else j=p}else{b[e>>1]=j;if((j|0)<(p|0)&(r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(p|0))c[o>>2]=j;n=n+1|0;if((n|0)>=(r|0))break;else o=o+4|0}}}j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}n=b[e+-2>>1]|0;if(n<<16>>16<=0){b[e>>1]=o;j=p*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+t;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+y;n=k+1310736+(j+-4<<2)|0;if((c[n>>2]|0)>(t|0))c[n>>2]=t;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}j=c[k+1179664+(p+-1<<2)>>2]|0;p=c[k+1179664+((n<<16>>16)+-1<<2)>>2]|0;if((j|0)>(p|0)){b[e>>1]=p;if((r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(j|0))c[o>>2]=p;n=n+1|0;if((n|0)>=(r|0)){j=p;break}else o=o+4|0}}else j=p}else{b[e>>1]=j;if((j|0)<(p|0)&(r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(p|0))c[o>>2]=j;n=n+1|0;if((n|0)>=(r|0))break;else o=o+4|0}}}j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;j=k+1310736+(j+-5<<2)|0;c[j>>2]=(c[j>>2]|0)+y;j=r}else{b[e>>1]=0;a[l>>0]=0;j=r}while(0);t=t+1|0;n=s+2|0;e=e+2|0;l=l+1|0;if((t|0)>=(z|0))break;else{s=n;r=j}}}else l=o;y=y+1|0;if((y|0)>=(B|0)){p=j;D=52;break a}else{o=l+2|0;n=n+4|0;e=e+4|0}}Me(3,3904,C);l=-1}else{p=0;D=52}while(0);if((D|0)==52){e=k+12|0;if((p|0)<1)j=1;else{n=1;j=1;while(1){l=c[m>>2]|0;if((l|0)==(n|0)){l=j;j=j+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[m>>2]=l;if((n|0)<(p|0)){n=n+1|0;m=m+4|0}else break}}o=k+8|0;l=j+-1|0;c[o>>2]=l;if(l){ek(e|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((j|0)>1){l=0;do{D=l<<2;c[k+131084+(D<<2)>>2]=f;c[k+131084+((D|1)<<2)>>2]=0;c[k+131084+((D|2)<<2)>>2]=g;c[k+131084+((D|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[o>>2]|0))}if((p|0)>0){e=0;do{m=(c[k+1179664+(e<<2)>>2]|0)+-1|0;n=e*7|0;l=k+12+(m<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(n<<2)>>2]|0);l=m<<1;j=k+655376+(l<<3)|0;h[j>>3]=+h[j>>3]+ +(c[k+1310736+(n+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(n+2<<2)>>2]|0);m=m<<2;l=k+131084+(m<<2)|0;j=c[k+1310736+(n+3<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;l=k+131084+((m|1)<<2)|0;j=c[k+1310736+(n+4<<2)>>2]|0;if((c[l>>2]|0)<(j|0))c[l>>2]=j;l=k+131084+((m|2)<<2)|0;j=c[k+1310736+(n+5<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;j=k+131084+((m|3)<<2)|0;l=c[k+1310736+(n+6<<2)>>2]|0;if((c[j>>2]|0)<(l|0))c[j>>2]=l;e=e+1|0}while((e|0)<(p|0))}if((c[o>>2]|0)>0){l=0;do{f=k+12+(l<<2)|0;g=l<<1;D=k+655376+(g<<3)|0;h[D>>3]=+h[D>>3]/+(c[f>>2]|0);g=k+655376+((g|1)<<3)|0;h[g>>3]=+h[g>>3]/+(c[f>>2]|0);l=l+1|0}while((l|0)<(c[o>>2]|0));l=0}else l=0}else l=0}i=E;return l|0}function Ed(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;E=i;i=i+16|0;C=E;p=c[k>>2]|0;B=g+-1|0;if((f|0)>0){l=0;m=p;n=p+(($(B,f)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(f|0))break;else{m=m+2|0;n=n+2|0}}}A=j*3|0;z=f+-1|0;if((g|0)>0){l=0;j=p;m=p+(z<<1)|0;while(1){b[m>>1]=0;b[j>>1]=0;l=l+1|0;if((l|0)>=(g|0))break;else{j=j+(f<<1)|0;m=m+(f<<1)|0}}}m=k+1179664|0;l=f+1|0;w=0-f|0;u=1-f|0;v=~f;a:do if((B|0)>1){x=(z|0)>1;o=(c[k+4>>2]|0)+l|0;y=1;n=e+(l<<2)|0;e=p+(l<<1)|0;j=0;b:while(1){if(x){l=o;t=1;s=n;r=j;while(1){do if(((d[s+2>>0]|0)+(d[s+1>>0]|0)+(d[s+3>>0]|0)|0)>(A|0)){a[l>>0]=-1;j=b[e+(w<<1)>>1]|0;if(j<<16>>16>0){b[e>>1]=j;j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}o=b[e+(u<<1)>>1]|0;p=o<<16>>16;j=b[e+(v<<1)>>1]|0;q=j<<16>>16;n=j<<16>>16>0;if(o<<16>>16<=0){if(n){b[e>>1]=j;j=q*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+t;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+y;n=k+1310736+(j+-3<<2)|0;if((c[n>>2]|0)<(t|0))c[n>>2]=t;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}j=b[e+-2>>1]|0;if(j<<16>>16>0){b[e>>1]=j;j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;j=k+1310736+(j+-3<<2)|0;if((c[j>>2]|0)>=(t|0)){j=r;break}c[j>>2]=t;j=r;break}else{j=r+1|0;if((r|0)>32767)break b;b[e>>1]=j;c[k+1179664+(r<<2)>>2]=j<<16>>16;r=r*7|0;c[k+1310736+(r<<2)>>2]=1;c[k+1310736+(r+1<<2)>>2]=t;c[k+1310736+(r+2<<2)>>2]=y;c[k+1310736+(r+3<<2)>>2]=t;c[k+1310736+(r+4<<2)>>2]=t;c[k+1310736+(r+5<<2)>>2]=y;c[k+1310736+(r+6<<2)>>2]=y;break}}if(n){j=c[k+1179664+(p+-1<<2)>>2]|0;p=c[k+1179664+(q+-1<<2)>>2]|0;if((j|0)>(p|0)){b[e>>1]=p;if((r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(j|0))c[o>>2]=p;n=n+1|0;if((n|0)>=(r|0)){j=p;break}else o=o+4|0}}else j=p}else{b[e>>1]=j;if((j|0)<(p|0)&(r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(p|0))c[o>>2]=j;n=n+1|0;if((n|0)>=(r|0))break;else o=o+4|0}}}j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;q=k+1310736+(j+-5<<2)|0;c[q>>2]=(c[q>>2]|0)+y;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}n=b[e+-2>>1]|0;if(n<<16>>16<=0){b[e>>1]=o;j=p*7|0;n=k+1310736+(j+-7<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=k+1310736+(j+-6<<2)|0;c[n>>2]=(c[n>>2]|0)+t;n=k+1310736+(j+-5<<2)|0;c[n>>2]=(c[n>>2]|0)+y;n=k+1310736+(j+-4<<2)|0;if((c[n>>2]|0)>(t|0))c[n>>2]=t;c[k+1310736+(j+-1<<2)>>2]=y;j=r;break}j=c[k+1179664+(p+-1<<2)>>2]|0;p=c[k+1179664+((n<<16>>16)+-1<<2)>>2]|0;if((j|0)>(p|0)){b[e>>1]=p;if((r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(j|0))c[o>>2]=p;n=n+1|0;if((n|0)>=(r|0)){j=p;break}else o=o+4|0}}else j=p}else{b[e>>1]=j;if((j|0)<(p|0)&(r|0)>0){n=0;o=m;while(1){if((c[o>>2]|0)==(p|0))c[o>>2]=j;n=n+1|0;if((n|0)>=(r|0))break;else o=o+4|0}}}j=(j<<16>>16)*7|0;q=k+1310736+(j+-7<<2)|0;c[q>>2]=(c[q>>2]|0)+1;q=k+1310736+(j+-6<<2)|0;c[q>>2]=(c[q>>2]|0)+t;j=k+1310736+(j+-5<<2)|0;c[j>>2]=(c[j>>2]|0)+y;j=r}else{b[e>>1]=0;a[l>>0]=0;j=r}while(0);t=t+1|0;n=s+4|0;e=e+2|0;l=l+1|0;if((t|0)>=(z|0))break;else{s=n;r=j}}}else l=o;y=y+1|0;if((y|0)>=(B|0)){p=j;D=52;break a}else{o=l+2|0;n=n+8|0;e=e+4|0}}Me(3,3904,C);l=-1}else{p=0;D=52}while(0);if((D|0)==52){e=k+12|0;if((p|0)<1)j=1;else{n=1;j=1;while(1){l=c[m>>2]|0;if((l|0)==(n|0)){l=j;j=j+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[m>>2]=l;if((n|0)<(p|0)){n=n+1|0;m=m+4|0}else break}}o=k+8|0;l=j+-1|0;c[o>>2]=l;if(l){ek(e|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((j|0)>1){l=0;do{D=l<<2;c[k+131084+(D<<2)>>2]=f;c[k+131084+((D|1)<<2)>>2]=0;c[k+131084+((D|2)<<2)>>2]=g;c[k+131084+((D|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[o>>2]|0))}if((p|0)>0){e=0;do{m=(c[k+1179664+(e<<2)>>2]|0)+-1|0;n=e*7|0;l=k+12+(m<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(n<<2)>>2]|0);l=m<<1;j=k+655376+(l<<3)|0;h[j>>3]=+h[j>>3]+ +(c[k+1310736+(n+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(n+2<<2)>>2]|0);m=m<<2;l=k+131084+(m<<2)|0;j=c[k+1310736+(n+3<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;l=k+131084+((m|1)<<2)|0;j=c[k+1310736+(n+4<<2)>>2]|0;if((c[l>>2]|0)<(j|0))c[l>>2]=j;l=k+131084+((m|2)<<2)|0;j=c[k+1310736+(n+5<<2)>>2]|0;if((c[l>>2]|0)>(j|0))c[l>>2]=j;j=k+131084+((m|3)<<2)|0;l=c[k+1310736+(n+6<<2)>>2]|0;if((c[j>>2]|0)<(l|0))c[j>>2]=l;e=e+1|0}while((e|0)<(p|0))}if((c[o>>2]|0)>0){l=0;do{f=k+12+(l<<2)|0;g=l<<1;D=k+655376+(g<<3)|0;h[D>>3]=+h[D>>3]/+(c[f>>2]|0);g=k+655376+((g|1)<<3)|0;h[g>>3]=+h[g>>3]/+(c[f>>2]|0);l=l+1|0}while((l|0)<(c[o>>2]|0));l=0}else l=0}else l=0}i=E;return l|0}function Fd(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;E=i;i=i+16|0;C=E;o=c[k>>2]|0;B=g+-1|0;if((f|0)>0){l=0;m=o;n=o+(($(B,f)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(f|0))break;else{m=m+2|0;n=n+2|0}}}A=f+-1|0;if((g|0)>0){l=0;m=o;n=o+(A<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(g|0))break;else{m=m+(f<<1)|0;n=n+(f<<1)|0}}}n=k+1179664|0;l=f+1|0;x=0-f|0;v=1-f|0;w=~f;a:do if((B|0)>1){y=(A|0)>1;p=(c[k+4>>2]|0)+l|0;z=1;e=e+l|0;o=o+(l<<1)|0;m=0;b:while(1){if(y){l=p;u=1;t=e;s=m;while(1){do if((d[t>>0]|0|0)>(j|0)){a[l>>0]=-1;m=b[o+(x<<1)>>1]|0;if(m<<16>>16>0){b[o>>1]=m;m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}p=b[o+(v<<1)>>1]|0;q=p<<16>>16;m=b[o+(w<<1)>>1]|0;r=m<<16>>16;e=m<<16>>16>0;if(p<<16>>16<=0){if(e){b[o>>1]=m;m=r*7|0;e=k+1310736+(m+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=k+1310736+(m+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+u;e=k+1310736+(m+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+z;e=k+1310736+(m+-3<<2)|0;if((c[e>>2]|0)<(u|0))c[e>>2]=u;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}m=b[o+-2>>1]|0;if(m<<16>>16>0){b[o>>1]=m;m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;m=k+1310736+(m+-3<<2)|0;if((c[m>>2]|0)>=(u|0)){m=s;break}c[m>>2]=u;m=s;break}else{m=s+1|0;if((s|0)>32767)break b;b[o>>1]=m;c[k+1179664+(s<<2)>>2]=m<<16>>16;s=s*7|0;c[k+1310736+(s<<2)>>2]=1;c[k+1310736+(s+1<<2)>>2]=u;c[k+1310736+(s+2<<2)>>2]=z;c[k+1310736+(s+3<<2)>>2]=u;c[k+1310736+(s+4<<2)>>2]=u;c[k+1310736+(s+5<<2)>>2]=z;c[k+1310736+(s+6<<2)>>2]=z;break}}if(e){m=c[k+1179664+(q+-1<<2)>>2]|0;q=c[k+1179664+(r+-1<<2)>>2]|0;if((m|0)>(q|0)){b[o>>1]=q;if((s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(m|0))c[p>>2]=q;e=e+1|0;if((e|0)>=(s|0)){m=q;break}else p=p+4|0}}else m=q}else{b[o>>1]=m;if((m|0)<(q|0)&(s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(q|0))c[p>>2]=m;e=e+1|0;if((e|0)>=(s|0))break;else p=p+4|0}}}m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}e=b[o+-2>>1]|0;if(e<<16>>16<=0){b[o>>1]=p;m=q*7|0;e=k+1310736+(m+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=k+1310736+(m+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+u;e=k+1310736+(m+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+z;e=k+1310736+(m+-4<<2)|0;if((c[e>>2]|0)>(u|0))c[e>>2]=u;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}m=c[k+1179664+(q+-1<<2)>>2]|0;q=c[k+1179664+((e<<16>>16)+-1<<2)>>2]|0;if((m|0)>(q|0)){b[o>>1]=q;if((s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(m|0))c[p>>2]=q;e=e+1|0;if((e|0)>=(s|0)){m=q;break}else p=p+4|0}}else m=q}else{b[o>>1]=m;if((m|0)<(q|0)&(s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(q|0))c[p>>2]=m;e=e+1|0;if((e|0)>=(s|0))break;else p=p+4|0}}}m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;m=k+1310736+(m+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+z;m=s}else{b[o>>1]=0;a[l>>0]=0;m=s}while(0);u=u+1|0;e=t+1|0;o=o+2|0;l=l+1|0;if((u|0)>=(A|0))break;else{t=e;s=m}}}else l=p;z=z+1|0;if((z|0)>=(B|0)){q=m;D=52;break a}else{p=l+2|0;e=e+2|0;o=o+4|0}}Me(3,3904,C);l=-1}else{q=0;D=52}while(0);if((D|0)==52){o=k+12|0;if((q|0)<1)m=1;else{e=1;m=1;while(1){l=c[n>>2]|0;if((l|0)==(e|0)){l=m;m=m+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[n>>2]=l;if((e|0)<(q|0)){e=e+1|0;n=n+4|0}else break}}p=k+8|0;l=m+-1|0;c[p>>2]=l;if(l){ek(o|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((m|0)>1){l=0;do{D=l<<2;c[k+131084+(D<<2)>>2]=f;c[k+131084+((D|1)<<2)>>2]=0;c[k+131084+((D|2)<<2)>>2]=g;c[k+131084+((D|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[p>>2]|0))}if((q|0)>0){o=0;do{n=(c[k+1179664+(o<<2)>>2]|0)+-1|0;e=o*7|0;l=k+12+(n<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(e<<2)>>2]|0);l=n<<1;m=k+655376+(l<<3)|0;h[m>>3]=+h[m>>3]+ +(c[k+1310736+(e+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(e+2<<2)>>2]|0);n=n<<2;l=k+131084+(n<<2)|0;m=c[k+1310736+(e+3<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;l=k+131084+((n|1)<<2)|0;m=c[k+1310736+(e+4<<2)>>2]|0;if((c[l>>2]|0)<(m|0))c[l>>2]=m;l=k+131084+((n|2)<<2)|0;m=c[k+1310736+(e+5<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;m=k+131084+((n|3)<<2)|0;l=c[k+1310736+(e+6<<2)>>2]|0;if((c[m>>2]|0)<(l|0))c[m>>2]=l;o=o+1|0}while((o|0)<(q|0))}if((c[p>>2]|0)>0){l=0;do{f=k+12+(l<<2)|0;g=l<<1;D=k+655376+(g<<3)|0;h[D>>3]=+h[D>>3]/+(c[f>>2]|0);g=k+655376+((g|1)<<3)|0;h[g>>3]=+h[g>>3]/+(c[f>>2]|0);l=l+1|0}while((l|0)<(c[p>>2]|0));l=0}else l=0}else l=0}i=E;return l|0}function Gd(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;E=i;i=i+16|0;C=E;o=c[k>>2]|0;B=g+-1|0;if((f|0)>0){l=0;m=o;n=o+(($(B,f)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(f|0))break;else{m=m+2|0;n=n+2|0}}}A=f+-1|0;if((g|0)>0){l=0;m=o;n=o+(A<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(g|0))break;else{m=m+(f<<1)|0;n=n+(f<<1)|0}}}n=k+1179664|0;l=f+1|0;x=0-f|0;v=1-f|0;w=~f;a:do if((B|0)>1){y=(A|0)>1;p=(c[k+4>>2]|0)+l|0;z=1;e=e+(l<<1)|0;o=o+(l<<1)|0;m=0;b:while(1){if(y){l=p;u=1;t=e;s=m;while(1){do if((d[t+1>>0]|0|0)>(j|0)){a[l>>0]=-1;m=b[o+(x<<1)>>1]|0;if(m<<16>>16>0){b[o>>1]=m;m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}p=b[o+(v<<1)>>1]|0;q=p<<16>>16;m=b[o+(w<<1)>>1]|0;r=m<<16>>16;e=m<<16>>16>0;if(p<<16>>16<=0){if(e){b[o>>1]=m;m=r*7|0;e=k+1310736+(m+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=k+1310736+(m+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+u;e=k+1310736+(m+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+z;e=k+1310736+(m+-3<<2)|0;if((c[e>>2]|0)<(u|0))c[e>>2]=u;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}m=b[o+-2>>1]|0;if(m<<16>>16>0){b[o>>1]=m;m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;m=k+1310736+(m+-3<<2)|0;if((c[m>>2]|0)>=(u|0)){m=s;break}c[m>>2]=u;m=s;break}else{m=s+1|0;if((s|0)>32767)break b;b[o>>1]=m;c[k+1179664+(s<<2)>>2]=m<<16>>16;s=s*7|0;c[k+1310736+(s<<2)>>2]=1;c[k+1310736+(s+1<<2)>>2]=u;c[k+1310736+(s+2<<2)>>2]=z;c[k+1310736+(s+3<<2)>>2]=u;c[k+1310736+(s+4<<2)>>2]=u;c[k+1310736+(s+5<<2)>>2]=z;c[k+1310736+(s+6<<2)>>2]=z;break}}if(e){m=c[k+1179664+(q+-1<<2)>>2]|0;q=c[k+1179664+(r+-1<<2)>>2]|0;if((m|0)>(q|0)){b[o>>1]=q;if((s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(m|0))c[p>>2]=q;e=e+1|0;if((e|0)>=(s|0)){m=q;break}else p=p+4|0}}else m=q}else{b[o>>1]=m;if((m|0)<(q|0)&(s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(q|0))c[p>>2]=m;e=e+1|0;if((e|0)>=(s|0))break;else p=p+4|0}}}m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}e=b[o+-2>>1]|0;if(e<<16>>16<=0){b[o>>1]=p;m=q*7|0;e=k+1310736+(m+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=k+1310736+(m+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+u;e=k+1310736+(m+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+z;e=k+1310736+(m+-4<<2)|0;if((c[e>>2]|0)>(u|0))c[e>>2]=u;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}m=c[k+1179664+(q+-1<<2)>>2]|0;q=c[k+1179664+((e<<16>>16)+-1<<2)>>2]|0;if((m|0)>(q|0)){b[o>>1]=q;if((s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(m|0))c[p>>2]=q;e=e+1|0;if((e|0)>=(s|0)){m=q;break}else p=p+4|0}}else m=q}else{b[o>>1]=m;if((m|0)<(q|0)&(s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(q|0))c[p>>2]=m;e=e+1|0;if((e|0)>=(s|0))break;else p=p+4|0}}}m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;m=k+1310736+(m+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+z;m=s}else{b[o>>1]=0;a[l>>0]=0;m=s}while(0);u=u+1|0;e=t+2|0;o=o+2|0;l=l+1|0;if((u|0)>=(A|0))break;else{t=e;s=m}}}else l=p;z=z+1|0;if((z|0)>=(B|0)){q=m;D=52;break a}else{p=l+2|0;e=e+4|0;o=o+4|0}}Me(3,3904,C);l=-1}else{q=0;D=52}while(0);if((D|0)==52){o=k+12|0;if((q|0)<1)m=1;else{e=1;m=1;while(1){l=c[n>>2]|0;if((l|0)==(e|0)){l=m;m=m+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[n>>2]=l;if((e|0)<(q|0)){e=e+1|0;n=n+4|0}else break}}p=k+8|0;l=m+-1|0;c[p>>2]=l;if(l){ek(o|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((m|0)>1){l=0;do{D=l<<2;c[k+131084+(D<<2)>>2]=f;c[k+131084+((D|1)<<2)>>2]=0;c[k+131084+((D|2)<<2)>>2]=g;c[k+131084+((D|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[p>>2]|0))}if((q|0)>0){o=0;do{n=(c[k+1179664+(o<<2)>>2]|0)+-1|0;e=o*7|0;l=k+12+(n<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(e<<2)>>2]|0);l=n<<1;m=k+655376+(l<<3)|0;h[m>>3]=+h[m>>3]+ +(c[k+1310736+(e+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(e+2<<2)>>2]|0);n=n<<2;l=k+131084+(n<<2)|0;m=c[k+1310736+(e+3<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;l=k+131084+((n|1)<<2)|0;m=c[k+1310736+(e+4<<2)>>2]|0;if((c[l>>2]|0)<(m|0))c[l>>2]=m;l=k+131084+((n|2)<<2)|0;m=c[k+1310736+(e+5<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;m=k+131084+((n|3)<<2)|0;l=c[k+1310736+(e+6<<2)>>2]|0;if((c[m>>2]|0)<(l|0))c[m>>2]=l;o=o+1|0}while((o|0)<(q|0))}if((c[p>>2]|0)>0){l=0;do{f=k+12+(l<<2)|0;g=l<<1;D=k+655376+(g<<3)|0;h[D>>3]=+h[D>>3]/+(c[f>>2]|0);g=k+655376+((g|1)<<3)|0;h[g>>3]=+h[g>>3]/+(c[f>>2]|0);l=l+1|0}while((l|0)<(c[p>>2]|0));l=0}else l=0}else l=0}i=E;return l|0}function Hd(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;E=i;i=i+16|0;C=E;o=c[k>>2]|0;B=g+-1|0;if((f|0)>0){l=0;m=o;n=o+(($(B,f)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(f|0))break;else{m=m+2|0;n=n+2|0}}}A=f+-1|0;if((g|0)>0){l=0;m=o;n=o+(A<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(g|0))break;else{m=m+(f<<1)|0;n=n+(f<<1)|0}}}n=k+1179664|0;l=f+1|0;x=0-f|0;v=1-f|0;w=~f;a:do if((B|0)>1){y=(A|0)>1;p=(c[k+4>>2]|0)+l|0;z=1;e=e+(l<<1)|0;o=o+(l<<1)|0;m=0;b:while(1){if(y){l=p;u=1;t=e;s=m;while(1){do if((d[t>>0]|0|0)>(j|0)){a[l>>0]=-1;m=b[o+(x<<1)>>1]|0;if(m<<16>>16>0){b[o>>1]=m;m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}p=b[o+(v<<1)>>1]|0;q=p<<16>>16;m=b[o+(w<<1)>>1]|0;r=m<<16>>16;e=m<<16>>16>0;if(p<<16>>16<=0){if(e){b[o>>1]=m;m=r*7|0;e=k+1310736+(m+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=k+1310736+(m+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+u;e=k+1310736+(m+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+z;e=k+1310736+(m+-3<<2)|0;if((c[e>>2]|0)<(u|0))c[e>>2]=u;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}m=b[o+-2>>1]|0;if(m<<16>>16>0){b[o>>1]=m;m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;m=k+1310736+(m+-3<<2)|0;if((c[m>>2]|0)>=(u|0)){m=s;break}c[m>>2]=u;m=s;break}else{m=s+1|0;if((s|0)>32767)break b;b[o>>1]=m;c[k+1179664+(s<<2)>>2]=m<<16>>16;s=s*7|0;c[k+1310736+(s<<2)>>2]=1;c[k+1310736+(s+1<<2)>>2]=u;c[k+1310736+(s+2<<2)>>2]=z;c[k+1310736+(s+3<<2)>>2]=u;c[k+1310736+(s+4<<2)>>2]=u;c[k+1310736+(s+5<<2)>>2]=z;c[k+1310736+(s+6<<2)>>2]=z;break}}if(e){m=c[k+1179664+(q+-1<<2)>>2]|0;q=c[k+1179664+(r+-1<<2)>>2]|0;if((m|0)>(q|0)){b[o>>1]=q;if((s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(m|0))c[p>>2]=q;e=e+1|0;if((e|0)>=(s|0)){m=q;break}else p=p+4|0}}else m=q}else{b[o>>1]=m;if((m|0)<(q|0)&(s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(q|0))c[p>>2]=m;e=e+1|0;if((e|0)>=(s|0))break;else p=p+4|0}}}m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}e=b[o+-2>>1]|0;if(e<<16>>16<=0){b[o>>1]=p;m=q*7|0;e=k+1310736+(m+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=k+1310736+(m+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+u;e=k+1310736+(m+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+z;e=k+1310736+(m+-4<<2)|0;if((c[e>>2]|0)>(u|0))c[e>>2]=u;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}m=c[k+1179664+(q+-1<<2)>>2]|0;q=c[k+1179664+((e<<16>>16)+-1<<2)>>2]|0;if((m|0)>(q|0)){b[o>>1]=q;if((s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(m|0))c[p>>2]=q;e=e+1|0;if((e|0)>=(s|0)){m=q;break}else p=p+4|0}}else m=q}else{b[o>>1]=m;if((m|0)<(q|0)&(s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(q|0))c[p>>2]=m;e=e+1|0;if((e|0)>=(s|0))break;else p=p+4|0}}}m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;m=k+1310736+(m+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+z;m=s}else{b[o>>1]=0;a[l>>0]=0;m=s}while(0);u=u+1|0;e=t+2|0;o=o+2|0;l=l+1|0;if((u|0)>=(A|0))break;else{t=e;s=m}}}else l=p;z=z+1|0;if((z|0)>=(B|0)){q=m;D=52;break a}else{p=l+2|0;e=e+4|0;o=o+4|0}}Me(3,3904,C);l=-1}else{q=0;D=52}while(0);if((D|0)==52){o=k+12|0;if((q|0)<1)m=1;else{e=1;m=1;while(1){l=c[n>>2]|0;if((l|0)==(e|0)){l=m;m=m+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[n>>2]=l;if((e|0)<(q|0)){e=e+1|0;n=n+4|0}else break}}p=k+8|0;l=m+-1|0;c[p>>2]=l;if(l){ek(o|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((m|0)>1){l=0;do{D=l<<2;c[k+131084+(D<<2)>>2]=f;c[k+131084+((D|1)<<2)>>2]=0;c[k+131084+((D|2)<<2)>>2]=g;c[k+131084+((D|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[p>>2]|0))}if((q|0)>0){o=0;do{n=(c[k+1179664+(o<<2)>>2]|0)+-1|0;e=o*7|0;l=k+12+(n<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(e<<2)>>2]|0);l=n<<1;m=k+655376+(l<<3)|0;h[m>>3]=+h[m>>3]+ +(c[k+1310736+(e+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(e+2<<2)>>2]|0);n=n<<2;l=k+131084+(n<<2)|0;m=c[k+1310736+(e+3<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;l=k+131084+((n|1)<<2)|0;m=c[k+1310736+(e+4<<2)>>2]|0;if((c[l>>2]|0)<(m|0))c[l>>2]=m;l=k+131084+((n|2)<<2)|0;m=c[k+1310736+(e+5<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;m=k+131084+((n|3)<<2)|0;l=c[k+1310736+(e+6<<2)>>2]|0;if((c[m>>2]|0)<(l|0))c[m>>2]=l;o=o+1|0}while((o|0)<(q|0))}if((c[p>>2]|0)>0){l=0;do{f=k+12+(l<<2)|0;g=l<<1;D=k+655376+(g<<3)|0;h[D>>3]=+h[D>>3]/+(c[f>>2]|0);g=k+655376+((g|1)<<3)|0;h[g>>3]=+h[g>>3]/+(c[f>>2]|0);l=l+1|0}while((l|0)<(c[p>>2]|0));l=0}else l=0}else l=0}i=E;return l|0}function Id(e,f,g,j,k){e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;E=i;i=i+16|0;C=E;o=c[k>>2]|0;B=g+-1|0;if((f|0)>0){l=0;m=o;n=o+(($(B,f)|0)<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(f|0))break;else{m=m+2|0;n=n+2|0}}}A=f+-1|0;if((g|0)>0){l=0;m=o;n=o+(A<<1)|0;while(1){b[n>>1]=0;b[m>>1]=0;l=l+1|0;if((l|0)>=(g|0))break;else{m=m+(f<<1)|0;n=n+(f<<1)|0}}}n=k+1179664|0;m=f+1|0;x=0-f|0;v=1-f|0;w=~f;a:do if((B|0)>1){y=(A|0)>1;l=(c[k+4>>2]|0)+m|0;z=1;e=e+m|0;o=o+(m<<1)|0;j=j+m|0;m=0;b:while(1){if(y){u=1;t=e;s=m;while(1){do if((d[t>>0]|0)>(d[j>>0]|0)){a[l>>0]=-1;m=b[o+(x<<1)>>1]|0;if(m<<16>>16>0){b[o>>1]=m;m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}p=b[o+(v<<1)>>1]|0;q=p<<16>>16;m=b[o+(w<<1)>>1]|0;r=m<<16>>16;e=m<<16>>16>0;if(p<<16>>16<=0){if(e){b[o>>1]=m;m=r*7|0;e=k+1310736+(m+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=k+1310736+(m+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+u;e=k+1310736+(m+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+z;e=k+1310736+(m+-3<<2)|0;if((c[e>>2]|0)<(u|0))c[e>>2]=u;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}m=b[o+-2>>1]|0;if(m<<16>>16>0){b[o>>1]=m;m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;m=k+1310736+(m+-3<<2)|0;if((c[m>>2]|0)>=(u|0)){m=s;break}c[m>>2]=u;m=s;break}else{m=s+1|0;if((s|0)>32767)break b;b[o>>1]=m;c[k+1179664+(s<<2)>>2]=m<<16>>16;s=s*7|0;c[k+1310736+(s<<2)>>2]=1;c[k+1310736+(s+1<<2)>>2]=u;c[k+1310736+(s+2<<2)>>2]=z;c[k+1310736+(s+3<<2)>>2]=u;c[k+1310736+(s+4<<2)>>2]=u;c[k+1310736+(s+5<<2)>>2]=z;c[k+1310736+(s+6<<2)>>2]=z;break}}if(e){m=c[k+1179664+(q+-1<<2)>>2]|0;q=c[k+1179664+(r+-1<<2)>>2]|0;if((m|0)>(q|0)){b[o>>1]=q;if((s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(m|0))c[p>>2]=q;e=e+1|0;if((e|0)>=(s|0)){m=q;break}else p=p+4|0}}else m=q}else{b[o>>1]=m;if((m|0)<(q|0)&(s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(q|0))c[p>>2]=m;e=e+1|0;if((e|0)>=(s|0))break;else p=p+4|0}}}m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;r=k+1310736+(m+-5<<2)|0;c[r>>2]=(c[r>>2]|0)+z;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}e=b[o+-2>>1]|0;if(e<<16>>16<=0){b[o>>1]=p;m=q*7|0;e=k+1310736+(m+-7<<2)|0;c[e>>2]=(c[e>>2]|0)+1;e=k+1310736+(m+-6<<2)|0;c[e>>2]=(c[e>>2]|0)+u;e=k+1310736+(m+-5<<2)|0;c[e>>2]=(c[e>>2]|0)+z;e=k+1310736+(m+-4<<2)|0;if((c[e>>2]|0)>(u|0))c[e>>2]=u;c[k+1310736+(m+-1<<2)>>2]=z;m=s;break}m=c[k+1179664+(q+-1<<2)>>2]|0;q=c[k+1179664+((e<<16>>16)+-1<<2)>>2]|0;if((m|0)>(q|0)){b[o>>1]=q;if((s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(m|0))c[p>>2]=q;e=e+1|0;if((e|0)>=(s|0)){m=q;break}else p=p+4|0}}else m=q}else{b[o>>1]=m;if((m|0)<(q|0)&(s|0)>0){e=0;p=n;while(1){if((c[p>>2]|0)==(q|0))c[p>>2]=m;e=e+1|0;if((e|0)>=(s|0))break;else p=p+4|0}}}m=(m<<16>>16)*7|0;r=k+1310736+(m+-7<<2)|0;c[r>>2]=(c[r>>2]|0)+1;r=k+1310736+(m+-6<<2)|0;c[r>>2]=(c[r>>2]|0)+u;m=k+1310736+(m+-5<<2)|0;c[m>>2]=(c[m>>2]|0)+z;m=s}else{b[o>>1]=0;a[l>>0]=0;m=s}while(0);u=u+1|0;e=t+1|0;j=j+1|0;o=o+2|0;l=l+1|0;if((u|0)>=(A|0))break;else{t=e;s=m}}}z=z+1|0;if((z|0)>=(B|0)){p=m;D=52;break a}else{l=l+2|0;e=e+2|0;o=o+4|0;j=j+2|0}}Me(3,3904,C);l=-1}else{p=0;D=52}while(0);if((D|0)==52){o=k+12|0;if((p|0)<1)m=1;else{e=1;m=1;while(1){l=c[n>>2]|0;if((l|0)==(e|0)){l=m;m=m+1|0}else l=c[k+1179664+(l+-1<<2)>>2]|0;c[n>>2]=l;if((e|0)<(p|0)){e=e+1|0;n=n+4|0}else break}}j=k+8|0;l=m+-1|0;c[j>>2]=l;if(l){ek(o|0,0,l<<2|0)|0;ek(k+655376|0,0,l<<4|0)|0;if((m|0)>1){l=0;do{D=l<<2;c[k+131084+(D<<2)>>2]=f;c[k+131084+((D|1)<<2)>>2]=0;c[k+131084+((D|2)<<2)>>2]=g;c[k+131084+((D|3)<<2)>>2]=0;l=l+1|0}while((l|0)<(c[j>>2]|0))}if((p|0)>0){o=0;do{n=(c[k+1179664+(o<<2)>>2]|0)+-1|0;e=o*7|0;l=k+12+(n<<2)|0;c[l>>2]=(c[l>>2]|0)+(c[k+1310736+(e<<2)>>2]|0);l=n<<1;m=k+655376+(l<<3)|0;h[m>>3]=+h[m>>3]+ +(c[k+1310736+(e+1<<2)>>2]|0);l=k+655376+((l|1)<<3)|0;h[l>>3]=+h[l>>3]+ +(c[k+1310736+(e+2<<2)>>2]|0);n=n<<2;l=k+131084+(n<<2)|0;m=c[k+1310736+(e+3<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;l=k+131084+((n|1)<<2)|0;m=c[k+1310736+(e+4<<2)>>2]|0;if((c[l>>2]|0)<(m|0))c[l>>2]=m;l=k+131084+((n|2)<<2)|0;m=c[k+1310736+(e+5<<2)>>2]|0;if((c[l>>2]|0)>(m|0))c[l>>2]=m;m=k+131084+((n|3)<<2)|0;l=c[k+1310736+(e+6<<2)>>2]|0;if((c[m>>2]|0)<(l|0))c[m>>2]=l;o=o+1|0}while((o|0)<(p|0))}if((c[j>>2]|0)>0){l=0;do{f=k+12+(l<<2)|0;g=l<<1;D=k+655376+(g<<3)|0;h[D>>3]=+h[D>>3]/+(c[f>>2]|0);g=k+655376+((g|1)<<3)|0;h[g>>3]=+h[g>>3]/+(c[f>>2]|0);l=l+1|0}while((l|0)<(c[j>>2]|0));l=0}else l=0}else l=0}i=E;return l|0}function Jd(a){a=a|0;return Kd(a+8|0)|0}function Kd(a){a=a|0;var b=0,d=0;d=i;i=i+16|0;b=Uj(4)|0;if(!b){Me(3,5472,d);rb(1)}a=wf(a)|0;c[b>>2]=a;if(!a){Vj(b);b=0}i=d;return b|0}function Ld(a){a=a|0;var b=0;b=c[a>>2]|0;if(!b)b=-1;else{xf(b)|0;Vj(c[a>>2]|0);c[a>>2]=0;b=0}return b|0}function Md(a){a=a|0;var b=0,d=0,e=0;d=i;i=i+16|0;b=Uj(7062432)|0;if(!b){Me(3,5472,d);rb(1)}c[b>>2]=0;c[b+4834148>>2]=0;c[b+7062408>>2]=0;c[b+4>>2]=-1;c[b+8>>2]=0;c[b+12>>2]=1;c[b+16>>2]=100;c[b+20>>2]=0;c[b+24>>2]=0;c[b+28>>2]=2;h[b+7062416>>3]=.5;c[b+7062424>>2]=3;c[b+32>>2]=a;e=c[a>>2]|0;c[b+36>>2]=e;a=c[a+4>>2]|0;c[b+40>>2]=a;c[b+44>>2]=0;c[b+15408>>2]=0;c[b+4834152>>2]=0;c[b+4818296>>2]=0;a=Uj($(e<<1,a)|0)|0;c[b+4834144>>2]=a;if(!a){Me(3,5472,d+8|0);rb(1)}else{c[b+7062384>>2]=0;Nd(b,2)|0;Od(b,0)|0;c[b+7062388>>2]=-1;Pd(b,0)|0;c[b+7062392>>2]=7;c[b+7062396>>2]=0;i=d;return b|0}return 0}function Nd(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;g=i;i=i+16|0;d=g;a:do if(a){e=a+4|0;if((c[e>>2]|0)!=(b|0)){switch(b|0){case 11:case 10:case 9:case 8:case 7:case 6:case 4:case 3:case 2:case 1:case 0:{f=0;break}case 14:case 13:case 12:case 5:{f=1;break}default:{c[d>>2]=b;Me(3,3936,d);d=-1;break a}}c[e>>2]=b;c[a+8>>2]=Pe(b)|0;d=a+7062408|0;b=c[d>>2]|0;if(b){pe(b);c[d>>2]=oe(c[a+36>>2]|0,c[a+40>>2]|0,c[e>>2]|0,0)|0}d=a+24|0;b=c[d>>2]|0;if(!f)switch(b|0){case 1:{c[d>>2]=4;d=0;break a}case 4:{c[d>>2]=3;d=0;break a}default:{d=0;break a}}else switch(b|0){case 0:{c[d>>2]=1;d=0;break a}case 3:{c[d>>2]=4;d=0;break a}default:{d=0;break a}}}else d=0}else d=-1;while(0);i=g;return d|0}function Od(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=i;i=i+16|0;e=f;do if(a)if((c[a>>2]|0)!=(b|0)){c[a>>2]=b;if(!b){d=a+4834148|0;Vj(c[d>>2]|0);c[d>>2]=0;d=0;break}b=Uj($(c[a+40>>2]|0,c[a+36>>2]|0)|0)|0;c[a+4834148>>2]=b;if(!b){Me(3,5472,e);rb(1)}else d=0}else d=0;else d=-1;while(0);i=f;return d|0}function Pd(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;j=i;i=i+16|0;h=j+8|0;f=j;if(a){g=a+7062388|0;if((c[g>>2]|0)!=(b|0)){d=a+7062408|0;e=c[d>>2]|0;if(e){pe(e);c[d>>2]=0}switch(b|0){case 3:case 2:case 1:{c[d>>2]=oe(c[a+36>>2]|0,c[a+40>>2]|0,c[a+4>>2]|0,0)|0;break}case 4:{c[a+7062404>>2]=1;c[a+7062400>>2]=1;b=4;break}case 0:{b=0;break}default:{Me(3,3985,f);b=0}}c[g>>2]=b;if((c[a>>2]|0)==1){c[h>>2]=c[760+(b<<2)>>2];Me(3,4059,h);b=0}else b=0}else b=0}else b=-1;i=j;return b|0}function Qd(a){a=a|0;var b=0,d=0;if(!a)b=-1;else{b=a+7062408|0;d=c[b>>2]|0;if(d){pe(d);c[b>>2]=0}Vj(c[a+4834144>>2]|0);Vj(c[a+4834148>>2]|0);Vj(a);b=0}return b|0}function Rd(a,b){a=a|0;b=b|0;if((a|0)!=0&(b|0)!=0){c[b>>2]=c[a>>2];a=0}else a=-1;return a|0}function Sd(a,b){a=a|0;b=b|0;if((a|0)!=0&b>>>0<2){c[a+12>>2]=b;a=0}else a=-1;return a|0}function Td(a,b){a=a|0;b=b|0;if((a|0)!=0&(b|0)!=0){c[b>>2]=c[a+12>>2];a=0}else a=-1;return a|0}function Ud(a,b){a=a|0;b=b|0;if((a|0)==0|b>>>0>255)a=-1;else{c[a+16>>2]=b;a=0}return a|0}function Vd(a,b){a=a|0;b=b|0;if((a|0)!=0&(b|0)!=0){c[b>>2]=c[a+16>>2];a=0}else a=-1;return a|0}function Wd(a,b){a=a|0;b=b|0;if((a|0)!=0&(b|0)!=0){c[b>>2]=c[a+7062388>>2];a=0}else a=-1;return a|0}function Xd(a,b){a=a|0;b=b|0;if((a|0)!=0&b>>>0<2){c[a+20>>2]=b;a=0}else a=-1;return a|0}function Yd(a,b){a=a|0;b=b|0;if(!a)a=-1;else{c[b>>2]=c[a+20>>2];a=0}return a|0}function Zd(a,b){a=a|0;b=b|0;if((a|0)!=0&b>>>0<5){c[a+24>>2]=b;a=0}else a=-1;return a|0}function _d(a,b){a=a|0;b=b|0;if(!a)a=-1;else{c[a+7062424>>2]=b;a=0}return a|0}function $d(a,b){a=a|0;b=b|0;if((a|0)!=0&(b|0)!=0){c[b>>2]=c[a+7062424>>2];a=0}else a=-1;return a|0}function ae(a,b){a=a|0;b=b|0;if(!a)a=-1;else{c[b>>2]=c[a+24>>2];a=0}return a|0}function be(a,b){a=a|0;b=+b;if((a|0)!=0?!(b<=0.0|b>=1.0):0){h[a+7062416>>3]=b;a=0}else a=-1;return a|0}function ce(a,b){a=a|0;b=b|0;if(!a)a=-1;else{h[b>>3]=+h[a+7062416>>3];a=0}return a|0}function de(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,j=0.0,k=0,l=0,m=0,n=0.0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0.0,P=0,Q=0,R=0.0,S=0.0;Q=i;i=i+80|0;M=Q+32|0;G=Q+24|0;z=Q;y=Q+52|0;D=Q+40|0;L=Q+64|0;P=a+44|0;c[P>>2]=0;J=a+7062388|0;f=c[J>>2]|0;a:do if((f|0)==4){I=a+7062396|0;e=c[I>>2]|0;do if((e|0)>0){f=4;e=e+-1|0}else{C=a+16|0;F=c[C>>2]|0;E=a+7062400|0;A=(c[E>>2]|0)+F|0;A=(A|0)>255?255:A;c[y>>2]=A;H=a+7062404|0;B=F-(c[H>>2]|0)|0;B=(B|0)<0?0:B;c[y+4>>2]=B;c[y+8>>2]=F;e=a+36|0;f=a+40|0;g=a+4|0;k=a+12|0;l=a+20|0;m=a+4834144|0;p=a+15416|0;q=a+15408|0;r=a+7062384|0;s=a+24|0;t=a+32|0;u=a+7062416|0;v=a+48|0;w=a+7062424|0;x=0;do{if((xe(b,c[e>>2]|0,c[f>>2]|0,c[g>>2]|0,c[a>>2]|0,c[k>>2]|0,c[y+(x<<2)>>2]|0,c[l>>2]|0,m,0)|0)<0){e=-1;break a}if((fe(c[e>>2]|0,c[f>>2]|0,m,c[l>>2]|0,1e6,70,1.0,p,q)|0)<0){e=-1;break a}if((je(b,c[e>>2]|0,c[f>>2]|0,c[g>>2]|0,p,c[q>>2]|0,c[r>>2]|0,c[l>>2]|0,c[s>>2]|0,(c[t>>2]|0)+184|0,+h[u>>3],v,P,c[w>>2]|0)|0)<0){e=-1;break a}c[D+(x<<2)>>2]=c[P>>2];x=x+1|0}while((x|0)<3);if((c[a>>2]|0)==1){N=c[D+4>>2]|0;g=c[D+8>>2]|0;f=c[D>>2]|0;c[z>>2]=B;c[z+4>>2]=N;c[z+8>>2]=F;c[z+12>>2]=g;c[z+16>>2]=A;c[z+20>>2]=f;Me(3,4153,z)}else{f=c[D>>2]|0;g=c[D+8>>2]|0}e=c[D+4>>2]|0;if((f|0)>(g|0)|(e|0)>(g|0)){f=(f|0)>=(e|0)?A:B;c[C>>2]=f;e=f-F|0;if((e|0)>0){c[E>>2]=e;e=1}else{c[E>>2]=1;e=0-e|0}c[H>>2]=e;if((c[a>>2]|0)==1){c[G>>2]=f;Me(3,4229,G)}f=c[J>>2]|0;e=c[a+7062392>>2]|0;break}e=c[E>>2]|0;f=c[H>>2]|0;do if((e|0)>=(f|0))if((e|0)>(f|0)){c[H>>2]=f+1;break}else{e=e+1|0;c[E>>2]=e;c[H>>2]=f+1;break}else{e=e+1|0;c[E>>2]=e}while(0);if((e+F|0)>254){c[E>>2]=1;e=1}if((F|0)<=(e|0))c[H>>2]=1;c[I>>2]=c[a+7062392>>2];N=47;break a}while(0);c[I>>2]=e;N=30}else N=30;while(0);b:do if((N|0)==30){c:do switch(f|0){case 3:{f=a+7062408|0;e=we(c[f>>2]|0,b,9,-7)|0;if((e|0)<0)break b;e=c[f>>2]|0;f=a+4834144|0;e=xe(c[e>>2]|0,c[e+8>>2]|0,c[e+12>>2]|0,5,c[a>>2]|0,c[a+12>>2]|0,0,0,f,c[e+4>>2]|0)|0;if((e|0)<0)break b;e=a+36|0;g=a+40|0;k=a+20|0;break}case 2:case 1:{g=a+7062396|0;e=c[g>>2]|0;if((e|0)>0){c[g>>2]=e+-1;N=44;break c}e=c[a+7062408>>2]|0;if((f|0)==1)e=ue(e,b,L)|0;else e=ve(e,b,L)|0;if((e|0)<0)break b;e=a+16|0;if((c[a>>2]|0)==1?(K=d[L>>0]|0,(c[e>>2]|0)!=(K|0)):0){c[M>>2]=(c[J>>2]|0)==1?4281:4288;c[M+4>>2]=K;Me(3,4293,M)}c[e>>2]=d[L>>0];c[g>>2]=c[a+7062392>>2];N=44;break}default:N=44}while(0);if((N|0)==44){e=a+36|0;g=a+40|0;k=a+20|0;f=a+4834144|0;if((xe(b,c[e>>2]|0,c[g>>2]|0,c[a+4>>2]|0,c[a>>2]|0,c[a+12>>2]|0,c[a+16>>2]|0,c[k>>2]|0,f,0)|0)<0){e=-1;break}}l=a+15416|0;m=a+15408|0;if((fe(c[e>>2]|0,c[g>>2]|0,f,c[k>>2]|0,1e6,70,1.0,l,m)|0)>=0?(je(b,c[e>>2]|0,c[g>>2]|0,c[a+4>>2]|0,l,c[m>>2]|0,c[a+7062384>>2]|0,c[k>>2]|0,c[a+24>>2]|0,(c[a+32>>2]|0)+184|0,+h[a+7062416>>3],a+48|0,P,c[a+7062424>>2]|0)|0)>=0:0)N=47;else e=-1}while(0);d:do if((N|0)==47){t=a+28|0;if((c[t>>2]|0)==1){ee(a);e=0;break}u=a+4818296|0;r=a+24|0;q=c[u>>2]|0;if((q|0)>0){s=0;do{f=c[P>>2]|0;g=a+4818304+(s*264|0)+56|0;k=a+4818304+(s*264|0)+64|0;if((f|0)>0){o=+(c[a+4818304+(s*264|0)>>2]|0);e=-1;l=0;n=.5;while(1){j=+(c[a+48+(l<<8)>>2]|0);R=o/j;if(!(R<.7|R>1.43)?(R=+h[a+48+(l<<8)+56>>3]-+h[g>>3],O=+h[a+48+(l<<8)+64>>3]-+h[k>>3],O=(R*R+O*O)/j,O<n):0){e=l;j=O}else j=n;l=l+1|0;if((l|0)>=(f|0)){p=e;break}else n=j}}else p=-1;e:do if((p|0)>-1){m=c[r>>2]|0;switch(m|0){case 2:case 1:case 0:break;case 4:case 3:{g=a+48+(p<<8)+40|0;j=+h[a+4818304+(s*264|0)+40>>3];if(!(+h[g>>3]<j)){e=a+48+(p<<8)+48|0;f=a+4818304+(s*264|0)+48|0;if(!(+h[e>>3]<+h[f>>3]))break e}else{f=a+4818304+(s*264|0)+48|0;e=a+48+(p<<8)+48|0}h[g>>3]=j;c[a+48+(p<<8)+8>>2]=c[a+4818304+(s*264|0)+8>>2];h[e>>3]=+h[f>>3];c[a+48+(p<<8)+12>>2]=c[a+4818304+(s*264|0)+12>>2];e=-1;n=1.0e8;g=0;while(1){j=0.0;f=0;do{b=(f+g|0)%4|0;o=+h[a+4818304+(s*264|0)+168+(f<<4)>>3]-+h[a+48+(p<<8)+168+(b<<4)>>3];R=+h[a+4818304+(s*264|0)+168+(f<<4)+8>>3]-+h[a+48+(p<<8)+168+(b<<4)+8>>3];j=j+(o*o+R*R);f=f+1|0}while((f|0)!=4);f=j<n;e=f?g:e;g=g+1|0;if((g|0)==4)break;else n=f?j:n}b=4-e|0;c[a+48+(p<<8)+20>>2]=(b+(c[a+4818304+(s*264|0)+20>>2]|0)|0)%4|0;c[a+48+(p<<8)+24>>2]=(b+(c[a+4818304+(s*264|0)+24>>2]|0)|0)%4|0;break e}default:{e=-1;break d}}e=a+48+(p<<8)+32|0;o=+h[a+4818304+(s*264|0)+32>>3];if(+h[e>>3]<o){h[e>>3]=o;l=c[a+4818304+(s*264|0)+4>>2]|0;c[a+48+(p<<8)+4>>2]=l;g=a+4818304+(s*264|0)+16|0;e=-1;n=1.0e8;k=0;while(1){j=0.0;f=0;do{b=(f+k|0)%4|0;S=+h[a+4818304+(s*264|0)+168+(f<<4)>>3]-+h[a+48+(p<<8)+168+(b<<4)>>3];R=+h[a+4818304+(s*264|0)+168+(f<<4)+8>>3]-+h[a+48+(p<<8)+168+(b<<4)+8>>3];j=j+(S*S+R*R);f=f+1|0}while((f|0)!=4);if(j<n)e=(4-k+(c[g>>2]|0)|0)%4|0;else j=n;k=k+1|0;if((k|0)==4)break;else n=j}c[a+48+(p<<8)+16>>2]=e;if(m>>>0<2){c[a+48+(p<<8)+8>>2]=l;h[a+48+(p<<8)+40>>3]=o;c[a+48+(p<<8)+20>>2]=e;break}else{c[a+48+(p<<8)+12>>2]=l;h[a+48+(p<<8)+48>>3]=o;c[a+48+(p<<8)+24>>2]=e;break}}}while(0);s=s+1|0}while((s|0)<(q|0))}ee(a);if((c[u>>2]|0)>0){g=0;e=0;do{f=a+4818304+(g*264|0)|0;N=a+4818304+(g*264|0)+256|0;b=(c[N>>2]|0)+1|0;c[N>>2]=b;if((b|0)<4){if((g|0)!=(e|0))ik(a+4818304+(e*264|0)|0,f|0,264)|0;e=e+1|0}g=g+1|0}while((g|0)<(c[u>>2]|0))}else e=0;c[u>>2]=e;e=c[P>>2]|0;f:do if((e|0)>0){m=0;do{k=a+48+(m<<8)|0;g=c[a+48+(m<<8)+4>>2]|0;if((g|0)>=0){l=c[u>>2]|0;g:do if((l|0)>0){f=0;do{if((c[a+4818304+(f*264|0)+4>>2]|0)==(g|0))break g;f=f+1|0}while((f|0)<(l|0))}else f=0;while(0);if((f|0)==(l|0)){if((l|0)==60)break f;c[u>>2]=l+1}ik(a+4818304+(f*264|0)|0,k|0,256)|0;c[a+4818304+(f*264|0)+256>>2]=1}m=m+1|0;e=c[P>>2]|0}while((m|0)<(e|0))}while(0);if((c[t>>2]|0)!=2?(c[u>>2]|0)>0:0){l=0;while(1){g=a+4818304+(l*264|0)+56|0;k=a+4818304+(l*264|0)+64|0;h:do if((e|0)>0){n=+(c[a+4818304+(l*264|0)>>2]|0);f=0;do{j=+(c[a+48+(f<<8)>>2]|0);S=n/j;if(!(S<.7|S>1.43)?(R=+h[a+48+(f<<8)+56>>3]-+h[g>>3],S=+h[a+48+(f<<8)+64>>3]-+h[k>>3],(R*R+S*S)/j<.5):0)break h;f=f+1|0}while((f|0)<(e|0))}else f=0;while(0);if((f|0)==(e|0)){ik(a+48+(e<<8)|0,a+4818304+(l*264|0)|0,256)|0;e=(c[P>>2]|0)+1|0;c[P>>2]=e}l=l+1|0;if((l|0)>=(c[u>>2]|0)){e=0;break}}}else e=0}while(0);i=Q;return e|0}function ee(a){a=a|0;var b=0,d=0,e=0,f=0;switch(c[a+24>>2]|0){case 1:case 0:{d=c[a+44>>2]|0;if((d|0)>0){e=0;do{b=a+48+(e<<8)+4|0;if((c[b>>2]|0)>-1?+h[a+48+(e<<8)+32>>3]<.5:0){c[a+48+(e<<8)+8>>2]=-1;c[b>>2]=-1;c[a+48+(e<<8)+236>>2]=6}e=e+1|0}while((e|0)<(d|0))}break}case 2:{d=c[a+44>>2]|0;if((d|0)>0){e=0;do{b=a+48+(e<<8)+4|0;if((c[b>>2]|0)>-1?+h[a+48+(e<<8)+32>>3]<.5:0){c[a+48+(e<<8)+12>>2]=-1;c[b>>2]=-1;c[a+48+(e<<8)+236>>2]=6}e=e+1|0}while((e|0)<(d|0))}break}default:{e=c[a+44>>2]|0;if((e|0)>0){f=0;do{b=a+48+(f<<8)+8|0;if((c[b>>2]|0)>-1?+h[a+48+(f<<8)+40>>3]<.5:0){c[b>>2]=-1;d=0}else d=1;b=a+48+(f<<8)+12|0;if(((c[b>>2]|0)>-1?+h[a+48+(f<<8)+48>>3]<.5:0)?(c[b>>2]=-1,(d|0)==0):0)c[a+48+(f<<8)+236>>2]=6;f=f+1|0}while((f|0)<(e|0))}}}return}function fe(a,b,d,e,f,g,j,k,l){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;j=+j;k=k|0;l=l|0;var m=0.0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0.0;L=i;i=i+96|0;F=L+56|0;H=L+48|0;G=L+8|0;I=L;K=(e|0)==1;if(K){a=(a|0)/2|0;b=(b|0)/2|0;f=(f|0)/4|0;g=(g|0)/4|0}c[l>>2]=0;C=d+8|0;D=a+-2|0;z=b+-2|0;A=d+1179664|0;a:do if((c[C>>2]|0)>0){B=0;while(1){w=d+12+(B<<2)|0;y=c[w>>2]|0;b:do if(((((!((y|0)<(g|0)|(y|0)>(f|0))?(E=d+131084+(B<<4)|0,(c[E>>2]|0)!=1):0)?(c[d+131084+(B<<4)+4>>2]|0)!=(D|0):0)?(c[d+131084+(B<<4)+8>>2]|0)!=1:0)?(c[d+131084+(B<<4)+12>>2]|0)!=(z|0):0)?(ge(c[d>>2]|0,a,0,A,B+1|0,E,k+((c[l>>2]|0)*80048|0)|0)|0)>=0:0){t=c[w>>2]|0;x=c[l>>2]|0;u=k+(x*80048|0)+28|0;b=c[u>>2]|0;v=k+(x*80048|0)+40028|0;n=c[v>>2]|0;y=k+(x*80048|0)+24|0;o=(c[y>>2]|0)+-1|0;if((o|0)>1){r=0;s=1;e=0;while(1){p=(c[k+(x*80048|0)+28+(s<<2)>>2]|0)-b|0;p=$(p,p)|0;q=(c[k+(x*80048|0)+40028+(s<<2)>>2]|0)-n|0;p=($(q,q)|0)+p|0;q=(p|0)>(r|0);e=q?s:e;s=s+1|0;if((s|0)>=(o|0))break;else r=q?p:r}}else e=0;m=+(t|0)/.75*.01*j;c[H>>2]=0;c[I>>2]=0;c:do if((he(u,v,0,e,m,F,H)|0)>=0?(he(u,v,e,(c[y>>2]|0)+-1|0,m,G,I)|0)>=0:0){b=c[H>>2]|0;n=c[I>>2]|0;do if((b|0)==1&(n|0)==1){b=c[G>>2]|0;n=c[F>>2]|0}else{if((b|0)>1&(n|0)==0){b=(e|0)/2|0;c[I>>2]=0;c[H>>2]=0;if((he(u,v,0,b,m,F,H)|0)<0)break c;if((he(u,v,b,e,m,G,I)|0)<0)break c;if(!((c[H>>2]|0)==1&(c[I>>2]|0)==1))break c;b=e;n=c[F>>2]|0;e=c[G>>2]|0;break}if(!((b|0)==0&(n|0)>1))break c;b=(e+-1+(c[y>>2]|0)|0)/2|0;c[I>>2]=0;c[H>>2]=0;if((he(u,v,e,b,m,F,H)|0)<0)break c;if((he(u,v,b,(c[y>>2]|0)+-1|0,m,G,I)|0)<0)break c;if(!((c[H>>2]|0)==1&(c[I>>2]|0)==1))break c;b=c[G>>2]|0;n=e;e=c[F>>2]|0}while(0);c[k+(x*80048|0)+80028>>2]=0;c[k+(x*80048|0)+80032>>2]=n;c[k+(x*80048|0)+80036>>2]=e;c[k+(x*80048|0)+80040>>2]=b;c[k+(x*80048|0)+80044>>2]=(c[y>>2]|0)+-1;c[k+((c[l>>2]|0)*80048|0)>>2]=c[w>>2];y=c[l>>2]|0;h[k+(y*80048|0)+8>>3]=+h[d+655376+(B<<4)>>3];h[k+(y*80048|0)+16>>3]=+h[d+655376+(B<<4)+8>>3];y=y+1|0;c[l>>2]=y;if((y|0)==60){e=60;break a}else break b}while(0)}while(0);B=B+1|0;if((B|0)>=(c[C>>2]|0)){J=4;break}}}else J=4;while(0);if((J|0)==4)e=c[l>>2]|0;if((e|0)>0){o=0;do{a=o;o=o+1|0;g=k+(a*80048|0)+16|0;n=k+(a*80048|0)|0;if((o|0)<(e|0)){j=+h[k+(a*80048|0)+8>>3];f=o;do{M=j-+h[k+(f*80048|0)+8>>3];m=+h[g>>3]-+h[k+(f*80048|0)+16>>3];m=M*M+m*m;e=c[n>>2]|0;a=k+(f*80048|0)|0;b=c[a>>2]|0;if((e|0)>(b|0)){if(m<+((e|0)/4|0|0))c[a>>2]=0}else if(m<+((b|0)/4|0|0))c[n>>2]=0;f=f+1|0;e=c[l>>2]|0}while((f|0)<(e|0))}}while((o|0)<(e|0))}if((e|0)>0){f=0;do{if(!(c[k+(f*80048|0)>>2]|0)){a=f+1|0;if((a|0)<(e|0)){e=f;b=a;while(1){ik(k+(e*80048|0)|0,k+(b*80048|0)|0,80048)|0;e=c[l>>2]|0;a=b+1|0;if((a|0)<(e|0)){e=b;b=a}else break}}e=e+-1|0;c[l>>2]=e}f=f+1|0}while((f|0)<(e|0))}if(K&(e|0)>0){b=0;while(1){c[k>>2]=c[k>>2]<<2;e=k+8|0;h[e>>3]=+h[e>>3]*2.0;e=k+16|0;h[e>>3]=+h[e>>3]*2.0;e=k+24|0;if((c[e>>2]|0)>0){a=0;do{K=k+28+(a<<2)|0;c[K>>2]=c[K>>2]<<1;K=k+40028+(a<<2)|0;c[K>>2]=c[K>>2]<<1;a=a+1|0}while((a|0)<(c[e>>2]|0))}b=b+1|0;if((b|0)>=(c[l>>2]|0))break;else k=k+80048|0}}i=L;return 0}function ge(a,d,e,f,g,h,j){a=a|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;w=i;i=i+80032|0;p=w+16|0;o=w+8|0;l=w;u=w+40024|0;v=w+24|0;t=c[h+8>>2]|0;e=c[h>>2]|0;h=c[h+4>>2]|0;a:do if((e|0)<=(h|0)){k=e;e=a+(($(t,d)|0)+e<<1)|0;while(1){s=b[e>>1]|0;if(s<<16>>16>0?(c[f+((s<<16>>16)+-1<<2)>>2]|0)==(g|0):0){n=k;break}if((k|0)<(h|0)){k=k+1|0;e=e+2|0}else{x=6;break a}}q=j+24|0;c[q>>2]=1;r=j+28|0;c[r>>2]=n;s=j+40028|0;c[s>>2]=t;f=t;m=n;k=1;e=5;while(1){h=(e+5|0)%8|0;e=0;while(1){g=c[776+(h<<2)>>2]|0;l=c[808+(h<<2)>>2]|0;if((b[a+(l+m+($(g+f|0,d)|0)<<1)>>1]|0)>0){e=g;g=h;break}e=e+1|0;h=(h+1|0)%8|0;if((e|0)>=8){x=11;break}}if((x|0)==11){x=0;if((e|0)==8){x=13;break}l=c[808+(h<<2)>>2]|0;e=c[776+(h<<2)>>2]|0;g=h}c[j+28+(k<<2)>>2]=l+m;h=c[q>>2]|0;c[j+40028+(h<<2)>>2]=e+(c[j+40028+(h+-1<<2)>>2]|0);e=c[q>>2]|0;h=j+28+(e<<2)|0;if((c[h>>2]|0)==(n|0)?(c[j+40028+(e<<2)>>2]|0)==(t|0):0){f=e;x=16;break}k=e+1|0;c[q>>2]=k;if((k|0)==9999){x=19;break}f=c[j+40028+(e<<2)>>2]|0;m=c[h>>2]|0;e=g}if((x|0)==13){Me(3,4347,o);e=-1;break}else if((x|0)==16){if((f|0)>1){l=0;g=1;h=0;while(1){e=(c[j+28+(g<<2)>>2]|0)-n|0;e=$(e,e)|0;k=(c[j+40028+(g<<2)>>2]|0)-t|0;e=($(k,k)|0)+e|0;k=(e|0)>(l|0);h=k?g:h;g=g+1|0;if((g|0)>=(f|0))break;else l=k?e:l}}else h=0;if((h|0)>0){e=0;do{c[u+(e<<2)>>2]=c[j+28+(e<<2)>>2];c[v+(e<<2)>>2]=c[j+40028+(e<<2)>>2];e=e+1|0}while((e|0)<(h|0))}if((h|0)<(f|0)){e=h;do{t=e-h|0;c[j+28+(t<<2)>>2]=c[j+28+(e<<2)>>2];c[j+40028+(t<<2)>>2]=c[j+40028+(e<<2)>>2];e=e+1|0}while((e|0)<(c[q>>2]|0))}if((h|0)>0){e=0;do{t=e-h|0;c[j+28+((c[q>>2]|0)+t<<2)>>2]=c[u+(e<<2)>>2];c[j+40028+((c[q>>2]|0)+t<<2)>>2]=c[v+(e<<2)>>2];e=e+1|0}while((e|0)<(h|0))}c[j+28+(c[q>>2]<<2)>>2]=c[r>>2];c[j+40028+(c[q>>2]<<2)>>2]=c[s>>2];c[q>>2]=(c[q>>2]|0)+1;e=0;break}else if((x|0)==19){Me(3,4354,p);e=-1;break}}else x=6;while(0);if((x|0)==6){Me(3,4340,l);e=-1}i=w;return e|0}function he(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=+f;g=g|0;h=h|0;var i=0,j=0.0,k=0.0,l=0,m=0.0,n=0,o=0.0,p=0,q=0,r=0,s=0.0;i=c[b+(e<<2)>>2]|0;q=c[b+(d<<2)>>2]|0;o=+(i-q|0);l=c[a+(d<<2)>>2]|0;r=c[a+(e<<2)>>2]|0;m=+(l-r|0);k=+(($(r,q)|0)-($(l,i)|0)|0);i=d+1|0;if((i|0)<(e|0)){j=0.0;l=i;do{s=k+(o*+(c[a+(l<<2)>>2]|0)+m*+(c[b+(l<<2)>>2]|0));s=s*s;r=s>j;j=r?s:j;i=r?l:i;l=l+1|0}while((l|0)<(e|0))}else j=0.0;if(j/(o*o+m*m)>f)if(((he(a,b,d,i,f,g,h)|0)>=0?(n=c[h>>2]|0,(n|0)<=5):0)?(c[g+(n<<2)>>2]=i,c[h>>2]=(c[h>>2]|0)+1,(he(a,b,i,e,f,g,h)|0)>=0):0)p=7;else i=-1;else p=7;if((p|0)==7)i=0;return i|0}function ie(a,b,d,e,f,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;j=j|0;k=k|0;var l=0,m=0.0,n=0,o=0.0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;y=i;i=i+16|0;t=y+4|0;u=y;v=nf(2)|0;w=nf(2)|0;x=Re(2,2)|0;q=0;a:while(1){r=q;q=q+1|0;s=c[e+(q<<2)>>2]|0;l=c[e+(r<<2)>>2]|0;p=+(s+1-l|0)*.05+.5;l=~~(+(l|0)+p);s=~~(+(s|0)-p)-l|0;n=s+1|0;d=Re(n,2)|0;if((s|0)>-1){s=0;do{z=s+l|0;if((mf(f,+(c[a+(z<<2)>>2]|0),+(c[b+(z<<2)>>2]|0),t,u)|0)<0){l=10;break a}z=s<<1;A=c[d>>2]|0;h[A+(z<<3)>>3]=+g[t>>2];h[A+((z|1)<<3)>>3]=+g[u>>2];s=s+1|0}while((s|0)<(n|0))}if((Ye(d,x,v,w)|0)<0){l=10;break}A=c[x>>2]|0;o=+h[A+8>>3];h[j+(r*24|0)>>3]=o;p=-+h[A>>3];h[j+(r*24|0)+8>>3]=p;A=c[w>>2]|0;h[j+(r*24|0)+16>>3]=-(o*+h[A>>3]+ +h[A+8>>3]*p);We(d)|0;if((q|0)>=4){l=7;break}}b:do if((l|0)==7){We(x)|0;of(w)|0;of(v)|0;q=0;while(1){d=(q+3|0)%4|0;l=j+(d*24|0)|0;m=+h[j+(q*24|0)+8>>3];n=j+(q*24|0)|0;o=+h[j+(d*24|0)+8>>3];p=+h[l>>3]*m-+h[n>>3]*o;if(+O(+p)<.0001){d=-1;break b}A=j+(q*24|0)+16|0;z=j+(d*24|0)+16|0;h[k+(q<<4)>>3]=(o*+h[A>>3]-m*+h[z>>3])/p;h[k+(q<<4)+8>>3]=(+h[n>>3]*+h[z>>3]-+h[l>>3]*+h[A>>3])/p;q=q+1|0;if((q|0)>=4){d=0;break}}}else if((l|0)==10){We(d)|0;We(x)|0;of(w)|0;of(v)|0;d=-1}while(0);i=y;return d|0}function je(a,b,d,e,f,j,k,l,m,n,o,p,q,r){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=+o;p=p|0;q=q|0;r=r|0;var s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;F=i;i=i+16|0;D=F+4|0;E=F;z=m>>>0<2;A=(m|0)==2;if((j|0)>0){C=0;s=0;do{c[p+(s<<8)>>2]=c[f+(C*80048|0)>>2];if((mf(n,+h[f+(C*80048|0)+8>>3],+h[f+(C*80048|0)+16>>3],D,E)|0)>=0?(h[p+(s<<8)+56>>3]=+g[D>>2],h[p+(s<<8)+64>>3]=+g[E>>2],B=p+(s<<8)+168|0,(ie(f+(C*80048|0)+28|0,f+(C*80048|0)+40028|0,c[f+(C*80048|0)+24>>2]|0,f+(C*80048|0)+80028|0,n,p+(s<<8)+72|0,B)|0)>=0):0){t=p+(s<<8)+8|0;u=p+(s<<8)+20|0;v=p+(s<<8)+40|0;w=p+(s<<8)+12|0;x=p+(s<<8)+24|0;y=p+(s<<8)+48|0;switch(De(k,l,m,a,b,d,e,n,B,o,t,u,v,w,x,y,r,p+(s<<8)+240|0,p+(s<<8)+248|0)|0){case 0:{c[p+(s<<8)+236>>2]=0;break}case -1:{c[p+(s<<8)+236>>2]=2;break}case -2:{c[p+(s<<8)+236>>2]=3;break}case -3:{c[p+(s<<8)+236>>2]=4;break}case -4:{c[p+(s<<8)+236>>2]=5;break}case -5:{c[p+(s<<8)+236>>2]=9;break}case -6:{c[p+(s<<8)+236>>2]=1;break}default:{}}if(!z){if(A){c[p+(s<<8)+4>>2]=c[w>>2];c[p+(s<<8)+16>>2]=c[x>>2];h[p+(s<<8)+32>>3]=+h[y>>3]}}else{c[p+(s<<8)+4>>2]=c[t>>2];c[p+(s<<8)+16>>2]=c[u>>2];h[p+(s<<8)+32>>3]=+h[v>>3]}s=s+1|0}C=C+1|0}while((C|0)<(j|0))}else s=0;c[q>>2]=s;i=F;return 0}function ke(a,b,d,e){a=a|0;b=b|0;d=+d;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0.0,o=0,p=0;k=i;i=i+288|0;m=k+200|0;l=k+104|0;f=k+264|0;j=k+8|0;g=k;o=c[b+16>>2]|0;p=(4-o|0)%4|0;h[m>>3]=+h[b+168+(p<<4)>>3];h[m+8>>3]=+h[b+168+(p<<4)+8>>3];p=(5-o|0)%4|0;h[m+16>>3]=+h[b+168+(p<<4)>>3];h[m+24>>3]=+h[b+168+(p<<4)+8>>3];p=(6-o|0)%4|0;h[m+32>>3]=+h[b+168+(p<<4)>>3];h[m+40>>3]=+h[b+168+(p<<4)+8>>3];o=(7-o|0)%4|0;h[m+48>>3]=+h[b+168+(o<<4)>>3];h[m+56>>3]=+h[b+168+(o<<4)+8>>3];n=d*-.5;h[l>>3]=n;d=d*.5;h[l+8>>3]=d;h[l+16>>3]=0.0;h[l+24>>3]=d;h[l+32>>3]=d;h[l+40>>3]=0.0;h[l+48>>3]=d;h[l+56>>3]=n;h[l+64>>3]=0.0;h[l+72>>3]=n;h[l+80>>3]=n;h[l+88>>3]=0.0;c[f>>2]=m;c[f+4>>2]=l;c[f+8>>2]=4;if((Ef(c[a>>2]|0,m,l,4,j)|0)<0)d=1.0e8;else{p=(zf(c[a>>2]|0,f,j,e,g)|0)<0;d=p?1.0e8:+h[g>>3]}i=k;return +d}function le(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=+e;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0.0,o=0,p=0;j=i;i=i+192|0;m=j+104|0;l=j+8|0;k=j+168|0;g=j;o=c[b+16>>2]|0;p=(4-o|0)%4|0;h[m>>3]=+h[b+168+(p<<4)>>3];h[m+8>>3]=+h[b+168+(p<<4)+8>>3];p=(5-o|0)%4|0;h[m+16>>3]=+h[b+168+(p<<4)>>3];h[m+24>>3]=+h[b+168+(p<<4)+8>>3];p=(6-o|0)%4|0;h[m+32>>3]=+h[b+168+(p<<4)>>3];h[m+40>>3]=+h[b+168+(p<<4)+8>>3];o=(7-o|0)%4|0;h[m+48>>3]=+h[b+168+(o<<4)>>3];h[m+56>>3]=+h[b+168+(o<<4)+8>>3];n=e*-.5;h[l>>3]=n;e=e*.5;h[l+8>>3]=e;h[l+16>>3]=0.0;h[l+24>>3]=e;h[l+32>>3]=e;h[l+40>>3]=0.0;h[l+48>>3]=e;h[l+56>>3]=n;h[l+64>>3]=0.0;h[l+72>>3]=n;h[l+80>>3]=n;h[l+88>>3]=0.0;c[k>>2]=m;c[k+4>>2]=l;c[k+8>>2]=4;b=(zf(c[a>>2]|0,k,d,f,g)|0)<0;i=j;return +(b?1.0e8:+h[g>>3])}function me(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0;p=i;i=i+32|0;m=p+20|0;n=p;j=Uj(f<<4)|0;c[m>>2]=j;if(!j){Me(3,5472,p+8|0);rb(1)}k=Uj(f*24|0)|0;l=m+4|0;c[l>>2]=k;if(!k){Me(3,5472,p+16|0);rb(1)}if((f|0)>0){o=0;do{h[j+(o<<4)>>3]=+h[d+(o<<4)>>3];h[j+(o<<4)+8>>3]=+h[d+(o<<4)+8>>3];h[k+(o*24|0)>>3]=+h[e+(o*24|0)>>3];h[k+(o*24|0)+8>>3]=+h[e+(o*24|0)+8>>3];h[k+(o*24|0)+16>>3]=+h[e+(o*24|0)+16>>3];o=o+1|0}while((o|0)<(f|0))}c[m+8>>2]=f;if((zf(c[a>>2]|0,m,b,g,n)|0)<0)h[n>>3]=1.0e8;Vj(c[m>>2]|0);Vj(c[l>>2]|0);i=p;return +(+h[n>>3])}function ne(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0;p=i;i=i+32|0;m=p+20|0;n=p;j=Uj(f<<4)|0;c[m>>2]=j;if(!j){Me(3,5472,p+8|0);rb(1)}k=Uj(f*24|0)|0;l=m+4|0;c[l>>2]=k;if(!k){Me(3,5472,p+16|0);rb(1)}if((f|0)>0){o=0;do{h[j+(o<<4)>>3]=+h[d+(o<<4)>>3];h[j+(o<<4)+8>>3]=+h[d+(o<<4)+8>>3];h[k+(o*24|0)>>3]=+h[e+(o*24|0)>>3];h[k+(o*24|0)+8>>3]=+h[e+(o*24|0)+8>>3];h[k+(o*24|0)+16>>3]=+h[e+(o*24|0)+16>>3];o=o+1|0}while((o|0)<(f|0))}c[m+8>>2]=f;if((Bf(c[a>>2]|0,m,b,g,n)|0)<0)h[n>>3]=1.0e8;Vj(c[m>>2]|0);Vj(c[l>>2]|0);i=p;return +(+h[n>>3])}function oe(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=Uj(2080)|0;a:do if(f){c[f+2068>>2]=d;b:do if(!e){switch(d|0){case 5:case 12:case 13:case 14:break;default:{g=4;break b}}c[f+2076>>2]=0}else g=4;while(0);do if((g|0)==4){g=Uj($(b,a)|0)|0;c[f>>2]=g;if(!g){Vj(f);f=0;break a}else{c[f+2076>>2]=1;break}}while(0);c[f+2072>>2]=e;c[f+4>>2]=0;c[f+8>>2]=a;c[f+12>>2]=b}while(0);return f|0}function pe(a){a=a|0;if(a){if(c[a+2076>>2]|0)Vj(c[a>>2]|0);Vj(c[a+4>>2]|0);Vj(a)}return}function qe(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0;k=i;i=i+16|0;g=k;f=c[b+2068>>2]|0;a:do switch(f|0){case 5:case 12:case 13:case 14:if(!(c[b+2072>>2]|0)){c[b>>2]=e;f=0;break a}else{ik(c[b>>2]|0,e|0,$(c[b+12>>2]|0,c[b+8>>2]|0)|0)|0;f=0;break a}default:{if((f&-2|0)==2){f=b+8|0;g=b+12|0;if(!($(c[g>>2]|0,c[f>>2]|0)|0)){f=0;break a}else{h=0;j=0}while(1){a[(c[b>>2]|0)+h>>0]=(((d[e+(j|1)>>0]|0)+(d[e+j>>0]|0)+(d[e+(j|2)>>0]|0)|0)>>>0)/3|0;h=h+1|0;if(h>>>0>=($(c[g>>2]|0,c[f>>2]|0)|0)>>>0){f=0;break a}else j=j+4|0}}if((f&-3|0)==4){f=b+8|0;g=b+12|0;if(!($(c[g>>2]|0,c[f>>2]|0)|0)){f=0;break a}else{h=0;j=0}while(1){a[(c[b>>2]|0)+h>>0]=(((d[e+(j|2)>>0]|0)+(d[e+(j|1)>>0]|0)+(d[e+(j|3)>>0]|0)|0)>>>0)/3|0;h=h+1|0;if(h>>>0>=($(c[g>>2]|0,c[f>>2]|0)|0)>>>0){f=0;break a}else j=j+4|0}}if(f>>>0<2){f=b+8|0;g=b+12|0;if(!($(c[g>>2]|0,c[f>>2]|0)|0)){f=0;break a}else{h=0;j=0}while(1){a[(c[b>>2]|0)+h>>0]=(((d[e+(j+1)>>0]|0)+(d[e+j>>0]|0)+(d[e+(j+2)>>0]|0)|0)>>>0)/3|0;h=h+1|0;if(h>>>0>=($(c[g>>2]|0,c[f>>2]|0)|0)>>>0){f=0;break a}else j=j+3|0}}switch(f|0){case 8:{f=b+8|0;g=b+12|0;if(!($(c[g>>2]|0,c[f>>2]|0)|0)){f=0;break a}else{h=0;j=0}while(1){a[(c[b>>2]|0)+h>>0]=a[e+j>>0]|0;h=h+1|0;if(h>>>0>=($(c[g>>2]|0,c[f>>2]|0)|0)>>>0){f=0;break}else j=j+2|0}break}case 7:{f=b+8|0;g=b+12|0;if(!($(c[g>>2]|0,c[f>>2]|0)|0)){f=0;break a}else{h=0;j=0}while(1){a[(c[b>>2]|0)+h>>0]=a[e+(j|1)>>0]|0;h=h+1|0;if(h>>>0>=($(c[g>>2]|0,c[f>>2]|0)|0)>>>0){f=0;break}else j=j+2|0}break}case 9:{f=b+8|0;g=b+12|0;if(!($(c[g>>2]|0,c[f>>2]|0)|0)){f=0;break a}else{h=0;j=0}while(1){m=d[e+j>>0]|0;l=d[e+(j|1)>>0]|0;a[(c[b>>2]|0)+h>>0]=(((m&248)+10+(m<<5&224)+(l>>>3&28)+(l<<3&248)|0)>>>0)/3|0;h=h+1|0;if(h>>>0>=($(c[g>>2]|0,c[f>>2]|0)|0)>>>0){f=0;break}else j=j+2|0}break}case 10:{f=b+8|0;g=b+12|0;if(!($(c[g>>2]|0,c[f>>2]|0)|0)){f=0;break a}else{h=0;j=0}while(1){l=d[e+j>>0]|0;m=d[e+(j|1)>>0]|0;a[(c[b>>2]|0)+h>>0]=(((l&248)+12+(l<<5&224)+(m>>>3&24)+(m<<2&248)|0)>>>0)/3|0;h=h+1|0;if(h>>>0>=($(c[g>>2]|0,c[f>>2]|0)|0)>>>0){f=0;break}else j=j+2|0}break}case 11:{f=b+8|0;g=b+12|0;if(!($(c[g>>2]|0,c[f>>2]|0)|0)){f=0;break a}else{h=0;j=0}while(1){m=d[e+j>>0]|0;a[(c[b>>2]|0)+h>>0]=(((m&240)+24+(m<<4&240)+((d[e+(j|1)>>0]|0)&240)|0)>>>0)/3|0;h=h+1|0;if(h>>>0>=($(c[g>>2]|0,c[f>>2]|0)|0)>>>0){f=0;break}else j=j+2|0}break}default:{Me(3,4361,g);f=-1;break a}}}}while(0);i=k;return f|0}function re(a,b){a=a|0;b=b|0;var e=0,f=0;if((a|0)!=0&(b|0)!=0?(qe(a,b)|0)>=0:0){ek(a+16|0,0,1024)|0;b=c[a>>2]|0;f=$(c[a+12>>2]|0,c[a+8>>2]|0)|0;e=b+f|0;if((f|0)>0){do{f=a+16+((d[b>>0]|0)<<2)|0;c[f>>2]=(c[f>>2]|0)+1;b=b+1|0}while(b>>>0<e>>>0);b=0}else b=0}else b=-1;return b|0}function se(a,b){a=a|0;b=b|0;var d=0;b=re(a,b)|0;if((b|0)>=0){b=0;d=0;do{b=(c[a+16+(d<<2)>>2]|0)+b|0;c[a+1040+(d<<2)>>2]=b;d=d+1|0}while((d|0)!=256);b=0}return b|0}function te(b,d,e,f){b=b|0;d=d|0;e=+e;f=f|0;var g=0,h=0,i=0;if(!(e<0.0|e>1.0)){d=se(b,d)|0;if((d|0)>=0){i=~~(+($(c[b+12>>2]|0,c[b+8>>2]|0)|0)*e)>>>0;d=0;while(1){h=d&255;g=c[b+1040+(h<<2)>>2]|0;if(g>>>0<i>>>0)d=d+1<<24>>24;else break}if((g|0)==(i|0))do d=d+1<<24>>24;while((c[b+1040+((d&255)<<2)>>2]|0)==(i|0));a[f>>0]=((d&255)+h|0)>>>1;d=0}}else d=-1;return d|0}function ue(a,b,c){a=a|0;b=b|0;c=c|0;return te(a,b,.5,c)|0}function ve(b,d,e){b=b|0;d=d|0;e=e|0;var f=0.0,g=0,h=0.0,i=0.0,j=0.0,k=0.0,l=0,m=0.0,n=0.0;d=re(b,d)|0;if((d|0)>=0){d=1;f=0.0;do{f=f+ +(($(c[b+16+(d<<2)>>2]|0,d)|0)>>>0);d=d+1|0}while((d|0)!=256);k=+($(c[b+12>>2]|0,c[b+8>>2]|0)|0);l=0;h=0.0;d=0;j=0.0;m=0.0;while(1){g=c[b+16+(l<<2)>>2]|0;m=m+ +(g>>>0);if(m!=0.0){i=k-m;if(i==0.0)break;h=h+ +(($(l,g)|0)>>>0);n=h/m-(f-h)/i;i=n*(m*i*n);if(i>j)d=l&255;else i=j}else i=j;if((l&255)<<24>>24==-1)break;else{l=l+1|0;j=i}}a[e>>0]=d;d=0}return d|0}function we(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;e=re(b,e)|0;do if((e|0)>=0){t=b+4|0;if(!(c[t>>2]|0)){e=b+8|0;h=b+12|0;s=Uj($(c[h>>2]|0,c[e>>2]|0)|0)|0;c[t>>2]=s;if(!s){e=-1;break}else s=e}else{s=b+8|0;h=b+12|0}q=f>>1;r=0-q|0;e=c[h>>2]|0;if((e|0)>0){n=(q|0)<(r|0);o=(q|0)<(r|0);p=0;do{e=c[s>>2]|0;if((e|0)>0){m=0;do{if(n){i=0;f=0}else{i=0;l=r;f=0;while(1){j=l+p|0;if(((j|0)>=0?(j|0)<(c[h>>2]|0):0)?(u=$(e,j)|0,!o):0){k=r;while(1){j=k+m|0;if((j|0)>-1&(j|0)<(e|0)){i=i+1|0;f=(d[(c[b>>2]|0)+(u+j)>>0]|0)+f|0}if((k|0)<(q|0))k=k+1|0;else break}}if((l|0)<(q|0))l=l+1|0;else break}}l=($(e,p)|0)+m|0;a[(c[t>>2]|0)+l>>0]=(f|0)/(i|0)|0;m=m+1|0;e=c[s>>2]|0}while((m|0)<(e|0))}p=p+1|0;e=c[h>>2]|0}while((p|0)<(e|0))}if((g|0)!=0?($(e,c[s>>2]|0)|0)>0:0){e=0;do{b=(c[t>>2]|0)+e|0;a[b>>0]=(d[b>>0]|0)+g;e=e+1|0}while((e|0)<($(c[h>>2]|0,c[s>>2]|0)|0));e=0}else e=0}while(0);return e|0}function xe(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0;a:do switch(e|0){case 0:{switch(f|0){case 1:{if(j){k=Fc(a,b,c,j,i)|0;break a}switch(h|0){case 0:{if(d>>>0<2){k=wc(a,b,c,g,i)|0;break a}if((d&-2|0)==2){k=yc(a,b,c,g,i)|0;break a}if((d&-3|0)==4){k=Bc(a,b,c,g,i)|0;break a}switch(d|0){case 5:case 12:case 13:case 14:{k=Cc(a,b,c,g,i)|0;break a}case 8:{k=Ec(a,b,c,g,i)|0;break a}case 7:{k=Dc(a,b,c,g,i)|0;break a}case 9:{k=xc(a,b,c,g,i)|0;break a}case 10:{k=Ac(a,b,c,g,i)|0;break a}case 11:{k=zc(a,b,c,g,i)|0;break a}default:rb(0)}break}case 1:{if(d>>>0<2){k=nc(a,b,c,g,i)|0;break a}if((d&-2|0)==2){k=pc(a,b,c,g,i)|0;break a}if((d&-3|0)==4){k=sc(a,b,c,g,i)|0;break a}switch(d|0){case 5:case 12:case 13:case 14:{k=tc(a,b,c,g,i)|0;break a}case 8:{k=vc(a,b,c,g,i)|0;break a}case 7:{k=uc(a,b,c,g,i)|0;break a}case 9:{k=oc(a,b,c,g,i)|0;break a}case 10:{k=rc(a,b,c,g,i)|0;break a}case 11:{k=qc(a,b,c,g,i)|0;break a}default:rb(0)}break}default:rb(0)}break}case 0:{if(j){k=Yc(a,b,c,j,i)|0;break a}switch(h|0){case 0:{if(d>>>0<2){k=Pc(a,b,c,g,i)|0;break a}if((d&-2|0)==2){k=Rc(a,b,c,g,i)|0;break a}if((d&-3|0)==4){k=Uc(a,b,c,g,i)|0;break a}switch(d|0){case 5:case 12:case 13:case 14:{k=Vc(a,b,c,g,i)|0;break a}case 8:{k=Xc(a,b,c,g,i)|0;break a}case 7:{k=Wc(a,b,c,g,i)|0;break a}case 9:{k=Qc(a,b,c,g,i)|0;break a}case 10:{k=Tc(a,b,c,g,i)|0;break a}case 11:{k=Sc(a,b,c,g,i)|0;break a}default:rb(0)}break}case 1:{if(d>>>0<2){k=Gc(a,b,c,g,i)|0;break a}if((d&-2|0)==2){k=Ic(a,b,c,g,i)|0;break a}if((d&-3|0)==4){k=Lc(a,b,c,g,i)|0;break a}switch(d|0){case 5:case 12:case 13:case 14:{k=Mc(a,b,c,g,i)|0;break a}case 8:{k=Oc(a,b,c,g,i)|0;break a}case 7:{k=Nc(a,b,c,g,i)|0;break a}case 9:{k=Hc(a,b,c,g,i)|0;break a}case 10:{k=Kc(a,b,c,g,i)|0;break a}case 11:{k=Jc(a,b,c,g,i)|0;break a}default:rb(0)}break}default:rb(0)}break}default:rb(0)}break}case 1:{switch(f|0){case 1:{if(j){k=pd(a,b,c,j,i)|0;break a}switch(h|0){case 0:{if(d>>>0<2){k=gd(a,b,c,g,i)|0;break a}if((d&-2|0)==2){k=id(a,b,c,g,i)|0;break a}if((d&-3|0)==4){k=ld(a,b,c,g,i)|0;break a}switch(d|0){case 5:case 12:case 13:case 14:{k=md(a,b,c,g,i)|0;break a}case 8:{k=od(a,b,c,g,i)|0;break a}case 7:{k=nd(a,b,c,g,i)|0;break a}case 9:{k=hd(a,b,c,g,i)|0;break a}case 10:{k=kd(a,b,c,g,i)|0;break a}case 11:{k=jd(a,b,c,g,i)|0;break a}default:rb(0)}break}case 1:{if(d>>>0<2){k=Zc(a,b,c,g,i)|0;break a}if((d&-2|0)==2){k=$c(a,b,c,g,i)|0;break a}if((d&-3|0)==4){k=cd(a,b,c,g,i)|0;break a}switch(d|0){case 5:case 12:case 13:case 14:{k=dd(a,b,c,g,i)|0;break a}case 8:{k=fd(a,b,c,g,i)|0;break a}case 7:{k=ed(a,b,c,g,i)|0;break a}case 9:{k=_c(a,b,c,g,i)|0;break a}case 10:{k=bd(a,b,c,g,i)|0;break a}case 11:{k=ad(a,b,c,g,i)|0;break a}default:rb(0)}break}default:rb(0)}break}case 0:{if(j){k=Id(a,b,c,j,i)|0;break a}switch(h|0){case 0:{if(d>>>0<2){k=zd(a,b,c,g,i)|0;break a}if((d&-2|0)==2){k=Bd(a,b,c,g,i)|0;break a}if((d&-3|0)==4){k=Ed(a,b,c,g,i)|0;break a}switch(d|0){case 5:case 12:case 13:case 14:{k=Fd(a,b,c,g,i)|0;break a}case 8:{k=Hd(a,b,c,g,i)|0;break a}case 7:{k=Gd(a,b,c,g,i)|0;break a}case 9:{k=Ad(a,b,c,g,i)|0;break a}case 10:{k=Dd(a,b,c,g,i)|0;break a}case 11:{k=Cd(a,b,c,g,i)|0;break a}default:rb(0)}break}case 1:{if(d>>>0<2){k=qd(a,b,c,g,i)|0;break a}if((d&-2|0)==2){k=sd(a,b,c,g,i)|0;break a}if((d&-3|0)==4){k=vd(a,b,c,g,i)|0;break a}switch(d|0){case 5:case 12:case 13:case 14:{k=wd(a,b,c,g,i)|0;break a}case 8:{k=yd(a,b,c,g,i)|0;break a}case 7:{k=xd(a,b,c,g,i)|0;break a}case 9:{k=rd(a,b,c,g,i)|0;break a}case 10:{k=ud(a,b,c,g,i)|0;break a}case 11:{k=td(a,b,c,g,i)|0;break a}default:rb(0)}break}default:rb(0)}break}default:rb(0)}break}default:rb(0)}while(0);return k|0}function ye(a,b){a=a|0;b=b|0;var d=0;if((a|0)!=0?(d=a+7062384|0,(c[d>>2]|0)==0):0){c[d>>2]=b;d=0}else d=-1;return d|0}function ze(a){a=a|0;var b=0;if((a|0)!=0?(b=a+7062384|0,(c[b>>2]|0)!=0):0){c[b>>2]=0;b=0}else b=-1;return b|0}function Ae(){return Be(16,50)|0}function Be(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;r=i;i=i+64|0;q=r+56|0;p=r+48|0;j=r+40|0;h=r+32|0;g=r+24|0;f=r+16|0;e=r+8|0;d=r;a:do if(!((a+-16|0)>>>0>48|(b|0)<1)){n=Uj(32)|0;if(!n){Me(3,5472,d);rb(1)}c[n>>2]=0;c[n+4>>2]=b;c[n+28>>2]=a;m=Uj(b<<2)|0;c[n+8>>2]=m;if(!m){Me(3,5472,e);rb(1)}d=b<<4;l=Uj(d)|0;c[n+12>>2]=l;if(!l){Me(3,5472,f);rb(1)}f=Uj(d)|0;k=n+20|0;c[k>>2]=f;if(!f){Me(3,5472,g);rb(1)}d=b<<5;g=Uj(d)|0;c[n+16>>2]=g;if(!g){Me(3,5472,h);rb(1)}h=Uj(d)|0;c[n+24>>2]=h;if(!h){Me(3,5472,j);rb(1)}e=$(a,a)|0;d=e*12|0;e=e<<2;if((b|0)>0){a=0;b:while(1){c[m+(a<<2)>>2]=0;f=a<<2;h=0;while(1){if((h|0)>=4)break;j=Uj(d)|0;g=h+f|0;c[l+(g<<2)>>2]=j;if(!j){d=18;break b}j=Uj(e)|0;c[(c[k>>2]|0)+(g<<2)>>2]=j;if(!j){d=20;break b}else h=h+1|0}a=a+1|0;if((a|0)>=(b|0)){o=n;break a}}if((d|0)==18){Me(3,5472,p);rb(1)}else if((d|0)==20){Me(3,5472,q);rb(1)}}else o=n}else o=0;while(0);i=r;return o|0}function Ce(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0;if(!a)b=-1;else{b=a+4|0;d=a+8|0;e=a+12|0;f=a+20|0;if((c[b>>2]|0)>0){g=0;do{if(c[(c[d>>2]|0)+(g<<2)>>2]|0)Le(a,g)|0;h=g<<2;Vj(c[(c[e>>2]|0)+(h<<2)>>2]|0);Vj(c[(c[f>>2]|0)+(h<<2)>>2]|0);i=1+h|0;Vj(c[(c[e>>2]|0)+(i<<2)>>2]|0);Vj(c[(c[f>>2]|0)+(i<<2)>>2]|0);i=2+h|0;Vj(c[(c[e>>2]|0)+(i<<2)>>2]|0);Vj(c[(c[f>>2]|0)+(i<<2)>>2]|0);h=3+h|0;Vj(c[(c[e>>2]|0)+(h<<2)>>2]|0);Vj(c[(c[f>>2]|0)+(h<<2)>>2]|0);g=g+1|0}while((g|0)<(c[b>>2]|0))}Vj(a);b=0}return b|0}function De(b,e,f,g,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x){b=b|0;e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=+o;p=p|0;q=q|0;r=r|0;s=s|0;t=t|0;u=u|0;v=v|0;w=w|0;x=x|0;var y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;L=i;i=i+12448|0;A=L+12440|0;z=L+8|0;J=L;I=L+12312|0;K=L+24|0;do if((f+-2|0)>>>0<3){if((v|0)!=2830){y=v&255;if((Ee(e,2,y,y*3|0,g,j,k,l,m,n,o,K)|0)<0){c[s>>2]=-1;y=-6;break}y=Fe(K,y,s,t,u,v,w)|0;if(!x)break;c[x>>2]=0;c[x+4>>2]=0;break}if((Ee(e,2,14,42,g,j,k,l,m,n,.875,K)|0)<0){c[s>>2]=-1;y=-6;break}c[z>>2]=0;c[z+4>>2]=182;c[z+8>>2]=195;c[z+12>>2]=13;v=a[K+(c[z>>2]|0)>>0]|0;y=(v&255)>0?v:0;v=(v&255)<255?v:-1;H=a[K+(c[z+4>>2]|0)>>0]|0;y=(H&255)>(y&255)?H:y;v=(H&255)<(v&255)?H:v;H=a[K+(c[z+8>>2]|0)>>0]|0;y=(H&255)>(y&255)?H:y;v=(H&255)<(v&255)?H:v;H=a[K+(c[z+12>>2]|0)>>0]|0;y=((H&255)>(y&255)?H:y)&255;v=((H&255)<(v&255)?H:v)&255;a:do if((y-v|0)>=30){H=(y+v|0)>>>1;a[A>>0]=(d[K+(c[z>>2]|0)>>0]|0)>>>0<H>>>0&1;a[A+1>>0]=(d[K+(c[z+4>>2]|0)>>0]|0)>>>0<H>>>0&1;a[A+2>>0]=(d[K+(c[z+8>>2]|0)>>0]|0)>>>0<H>>>0&1;a[A+3>>0]=(d[K+(c[z+12>>2]|0)>>0]|0)>>>0<H>>>0&1;v=0;while(1){y=v+1|0;if(((a[A+v>>0]|0)==1?(a[A+((y|0)%4|0)>>0]|0)==1:0)?(a[A+((v+2|0)%4|0)>>0]|0)==0:0){G=v;break}if((y|0)<4)v=y;else{G=y;break}}switch(G|0){case 4:{c[t>>2]=0;h[u>>3]=-1.0;y=-3;v=0;z=0;break a}case 0:{z=119;y=255;v=0;do{D=v+-3|0;B=(v&-2|0)==12;C=v*14|0;A=0;do{if(((A+-3|D)>>>0>=8?(F=A&-2,(A|v)>>>0>=2):0)?!(B&((F|0)==0|(F|0)==12)):0){E=(d[K+(A+C)>>0]|0)-H|0;a[I+z>>0]=E>>>31;E=(E|0)>-1?E:0-E|0;z=z+-1|0;y=(E|0)<(y|0)?E:y}A=A+1|0}while((A|0)!=14);v=v+1|0}while((v|0)!=14);break}case 1:{z=119;y=255;v=0;do{D=v+-3|0;C=v&-2;B=(C|0)==0;C=(C|0)==12;A=13;while(1){if(((A+-3|D)>>>0>=8?(E=(A&-2|0)==12,!(B&E)):0)?!(C&(A>>>0<2|E)):0){F=(d[K+((A*14|0)+v)>>0]|0)-H|0;a[I+z>>0]=F>>>31;F=(F|0)>-1?F:0-F|0;z=z+-1|0;y=(F|0)<(y|0)?F:y}if((A|0)>0)A=A+-1|0;else break}v=v+1|0}while((v|0)!=14);break}case 2:{v=119;y=255;D=13;while(1){B=D+-3|0;C=D>>>0<2|(D&-2|0)==12;A=D*14|0;z=13;while(1){if((z+-3|B)>>>0>=8?!((z|D)>>>0<2|C&(z&-2|0)==12):0){F=(d[K+(z+A)>>0]|0)-H|0;a[I+v>>0]=F>>>31;F=(F|0)>-1?F:0-F|0;v=v+-1|0;y=(F|0)<(y|0)?F:y}if((z|0)>0)z=z+-1|0;else break}if((D|0)>0)D=D+-1|0;else break}break}case 3:{v=119;y=255;D=13;while(1){C=D+-3|0;B=D&-2;A=(B|0)==12;B=(B|0)==0;z=0;do{if(((z+-3|C)>>>0>=8?!(A&z>>>0<2|(z|D)>>>0<2):0)?!(B&(z&-2|0)==12):0){F=(d[K+((z*14|0)+D)>>0]|0)-H|0;a[I+v>>0]=F>>>31;F=(F|0)>-1?F:0-F|0;v=v+-1|0;y=(F|0)<(y|0)?F:y}z=z+1|0}while((z|0)!=14);if((D|0)>0)D=D+-1|0;else break}break}default:y=255}c[t>>2]=G;h[u>>3]=(y|0)>30?1.0:+(y|0)/30.0;y=Ie(2830,0,0,I,J)|0;if((y|0)<0){y=-4;v=0;z=0}else{if(w)c[w>>2]=y;z=J;y=0;v=c[z>>2]|0;z=c[z+4>>2]|0}}else{c[t>>2]=0;h[u>>3]=-1.0;y=-2;v=0;z=0}while(0);if((y|0)<0){c[s>>2]=-1;break}if((v|0)==-1&(z|0)==-1){c[s>>2]=-1;y=-5;break}c[s>>2]=(v&-32768|0)==0&0==0?v&32767:0;if(!x)y=0;else{y=x;c[y>>2]=v;c[y+4>>2]=z;y=0}}else y=1;while(0);b:do switch(f|0){case 0:case 1:case 3:case 4:{if(!b){c[p>>2]=-1;v=-1;break b}v=b+28|0;z=c[v>>2]|0;A=z<<2;switch(f|0){case 0:case 3:if((Ee(e,0,z,A,g,j,k,l,m,n,o,K)|0)<0){c[p>>2]=-1;v=-6;break b}else{v=Ge(b,0,K,c[v>>2]|0,p,q,r)|0;break b}default:if((Ee(e,1,z,A,g,j,k,l,m,n,o,K)|0)<0){c[p>>2]=-1;v=-6;break b}else{v=Ge(b,1,K,c[v>>2]|0,p,q,r)|0;break b}}}default:v=1}while(0);if((y|0)!=1){if((v|0)!=1)y=(v&y|0)<0?v:0}else y=v;i=L;return y|0} +function _j(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0;k=i;i=i+16|0;b=k+8|0;h=k+4|0;d=k;c[h>>2]=a;do if(a>>>0>=212){g=(a>>>0)/210|0;e=g*210|0;c[d>>2]=a-e;b=($j(3712,3904,d,b)|0)-3712>>2;f=b;b=(c[3712+(b<<2)>>2]|0)+e|0;a:while(1){e=5;while(1){if(e>>>0>=47){e=211;j=8;break}d=c[3520+(e<<2)>>2]|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=106;break a}if((b|0)==($(a,d)|0))break;else e=e+1|0}b:do if((j|0)==8)while(1){j=0;d=(b>>>0)/(e>>>0)|0;if(d>>>0<e>>>0){j=105;break a}if((b|0)==($(d,e)|0))break b;d=e+10|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+12|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+16|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+18|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+22|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+28|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+30|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+36|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+40|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+42|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+46|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+52|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+58|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+60|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+66|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+70|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+72|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+78|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+82|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+88|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+96|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+100|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+102|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+106|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+108|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+112|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+120|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+126|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+130|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+136|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+138|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+142|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+148|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+150|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+156|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+162|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+166|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+168|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+172|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+178|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+180|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+186|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+190|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+192|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+196|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+198|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break b;d=e+208|0;a=(b>>>0)/(d>>>0)|0;if(a>>>0<d>>>0){j=105;break a}if((b|0)==($(a,d)|0))break;else{e=e+210|0;j=8}}while(0);e=f+1|0;b=(e|0)==48;e=b?0:e;b=(b&1)+g|0;f=e;g=b;b=(c[3712+(e<<2)>>2]|0)+(b*210|0)|0}if((j|0)==105){c[h>>2]=b;break}else if((j|0)==106){c[h>>2]=b;break}}else b=c[($j(3520,3712,h,b)|0)>>2]|0;while(0);i=k;return b|0}function $j(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=c[d>>2]|0;e=a;d=b-a>>2;a:while(1){while(1){if(!d)break a;a=(d|0)/2|0;if((c[e+(a<<2)>>2]|0)>>>0<f>>>0)break;else d=a}e=e+(a+1<<2)|0;d=d+-1-a|0}return e|0}function ak(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0;if(e>>>0>4294967279)oi(b);if(e>>>0<11){a[b>>0]=e<<1;b=b+1|0}else{g=e+16&-16;f=Kh(g)|0;c[b+8>>2]=f;c[b>>2]=g|1;c[b+4>>2]=e;b=f}ik(b|0,d|0,e|0)|0;a[b+e>>0]=0;return}function bk(b){b=b|0;if(a[b>>0]&1)Lh(c[b+8>>2]|0);return}function ck(){}function dk(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;d=b-d-(c>>>0>a>>>0|0)>>>0;return (D=d,a-c>>>0|0)|0}function ek(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=b+e|0;if((e|0)>=20){d=d&255;h=b&3;i=d|d<<8|d<<16|d<<24;g=f&~3;if(h){h=b+4-h|0;while((b|0)<(h|0)){a[b>>0]=d;b=b+1|0}}while((b|0)<(g|0)){c[b>>2]=i;b=b+4|0}}while((b|0)<(f|0)){a[b>>0]=d;b=b+1|0}return b-e|0}function fk(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){D=b<<c|(a&(1<<c)-1<<32-c)>>>32-c;return a<<c}D=a<<c-32;return 0}function gk(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;c=a+c>>>0;return (D=b+d+(c>>>0<a>>>0|0)>>>0,c|0)|0}function hk(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){D=b>>>c;return a>>>c|(b&(1<<c)-1)<<32-c}D=0;return b>>>c-32|0}function ik(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;if((e|0)>=4096)return Xa(b|0,d|0,e|0)|0;f=b|0;if((b&3)==(d&3)){while(b&3){if(!e)return f|0;a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0;e=e-1|0}while((e|0)>=4){c[b>>2]=c[d>>2];b=b+4|0;d=d+4|0;e=e-4|0}}while((e|0)>0){a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0;e=e-1|0}return f|0}function jk(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){D=b>>c;return a>>>c|(b&(1<<c)-1)<<32-c}D=(b|0)<0?-1:0;return b>>c-32|0}function kk(b){b=b|0;var c=0;c=a[m+(b&255)>>0]|0;if((c|0)<8)return c|0;c=a[m+(b>>8&255)>>0]|0;if((c|0)<8)return c+8|0;c=a[m+(b>>16&255)>>0]|0;if((c|0)<8)return c+16|0;return (a[m+(b>>>24)>>0]|0)+24|0}function lk(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;f=a&65535;e=b&65535;c=$(e,f)|0;d=a>>>16;a=(c>>>16)+($(e,d)|0)|0;e=b>>>16;b=$(e,f)|0;return (D=(a>>>16)+($(e,d)|0)+(((a&65535)+b|0)>>>16)|0,a+b<<16|c&65535|0)|0}function mk(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;j=b>>31|((b|0)<0?-1:0)<<1;i=((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1;f=d>>31|((d|0)<0?-1:0)<<1;e=((d|0)<0?-1:0)>>31|((d|0)<0?-1:0)<<1;h=dk(j^a,i^b,j,i)|0;g=D;a=f^j;b=e^i;return dk((rk(h,g,dk(f^c,e^d,f,e)|0,D,0)|0)^a,D^b,a,b)|0}function nk(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;i=i+16|0;j=f|0;h=b>>31|((b|0)<0?-1:0)<<1;g=((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1;l=e>>31|((e|0)<0?-1:0)<<1;k=((e|0)<0?-1:0)>>31|((e|0)<0?-1:0)<<1;a=dk(h^a,g^b,h,g)|0;b=D;rk(a,b,dk(l^d,k^e,l,k)|0,D,j)|0;e=dk(c[j>>2]^h,c[j+4>>2]^g,h,g)|0;d=D;i=f;return (D=d,e)|0}function ok(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=a;f=c;c=lk(e,f)|0;a=D;return (D=($(b,f)|0)+($(d,e)|0)+a|a&0,c|0|0)|0}function pk(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return rk(a,b,c,d,0)|0}function qk(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;g=i;i=i+16|0;f=g|0;rk(a,b,d,e,f)|0;i=g;return (D=c[f+4>>2]|0,c[f>>2]|0)|0}function rk(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;l=a;j=b;k=j;h=d;n=e;i=n;if(!k){g=(f|0)!=0;if(!i){if(g){c[f>>2]=(l>>>0)%(h>>>0);c[f+4>>2]=0}n=0;f=(l>>>0)/(h>>>0)>>>0;return (D=n,f)|0}else{if(!g){n=0;f=0;return (D=n,f)|0}c[f>>2]=a|0;c[f+4>>2]=b&0;n=0;f=0;return (D=n,f)|0}}g=(i|0)==0;do if(h){if(!g){g=(ba(i|0)|0)-(ba(k|0)|0)|0;if(g>>>0<=31){m=g+1|0;i=31-g|0;b=g-31>>31;h=m;a=l>>>(m>>>0)&b|k<<i;b=k>>>(m>>>0)&b;g=0;i=l<<i;break}if(!f){n=0;f=0;return (D=n,f)|0}c[f>>2]=a|0;c[f+4>>2]=j|b&0;n=0;f=0;return (D=n,f)|0}g=h-1|0;if(g&h){i=(ba(h|0)|0)+33-(ba(k|0)|0)|0;p=64-i|0;m=32-i|0;j=m>>31;o=i-32|0;b=o>>31;h=i;a=m-1>>31&k>>>(o>>>0)|(k<<m|l>>>(i>>>0))&b;b=b&k>>>(i>>>0);g=l<<p&j;i=(k<<p|l>>>(o>>>0))&j|l<<m&i-33>>31;break}if(f){c[f>>2]=g&l;c[f+4>>2]=0}if((h|0)==1){o=j|b&0;p=a|0|0;return (D=o,p)|0}else{p=kk(h|0)|0;o=k>>>(p>>>0)|0;p=k<<32-p|l>>>(p>>>0)|0;return (D=o,p)|0}}else{if(g){if(f){c[f>>2]=(k>>>0)%(h>>>0);c[f+4>>2]=0}o=0;p=(k>>>0)/(h>>>0)>>>0;return (D=o,p)|0}if(!l){if(f){c[f>>2]=0;c[f+4>>2]=(k>>>0)%(i>>>0)}o=0;p=(k>>>0)/(i>>>0)>>>0;return (D=o,p)|0}g=i-1|0;if(!(g&i)){if(f){c[f>>2]=a|0;c[f+4>>2]=g&k|b&0}o=0;p=k>>>((kk(i|0)|0)>>>0);return (D=o,p)|0}g=(ba(i|0)|0)-(ba(k|0)|0)|0;if(g>>>0<=30){b=g+1|0;i=31-g|0;h=b;a=k<<i|l>>>(b>>>0);b=k>>>(b>>>0);g=0;i=l<<i;break}if(!f){o=0;p=0;return (D=o,p)|0}c[f>>2]=a|0;c[f+4>>2]=j|b&0;o=0;p=0;return (D=o,p)|0}while(0);if(!h){k=i;j=0;i=0}else{m=d|0|0;l=n|e&0;k=gk(m|0,l|0,-1,-1)|0;d=D;j=i;i=0;do{e=j;j=g>>>31|j<<1;g=i|g<<1;e=a<<1|e>>>31|0;n=a>>>31|b<<1|0;dk(k,d,e,n)|0;p=D;o=p>>31|((p|0)<0?-1:0)<<1;i=o&1;a=dk(e,n,o&m,(((p|0)<0?-1:0)>>31|((p|0)<0?-1:0)<<1)&l)|0;b=D;h=h-1|0}while((h|0)!=0);k=j;j=0}h=0;if(f){c[f>>2]=a;c[f+4>>2]=b}o=(g|0)>>>31|(k|h)<<1|(h<<1|g>>>31)&0|j;p=(g<<1|0>>>31)&-2|i;return (D=o,p)|0}function sk(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Qb[a&15](b|0,c|0,d|0)|0}function tk(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;Rb[a&3](b|0,c|0,d|0,e|0,f|0)}function uk(a,b,c){a=a|0;b=b|0;c=c|0;return +Sb[a&1](b|0,c|0)}function vk(a,b,c){a=a|0;b=b|0;c=+c;Tb[a&3](b|0,+c)}function wk(a,b){a=a|0;b=b|0;return +Ub[a&3](b|0)}function xk(a){a=a|0;return Vb[a&1]()|0}function yk(a,b){a=a|0;b=b|0;Wb[a&15](b|0)}function zk(a,b,c){a=a|0;b=b|0;c=c|0;Xb[a&7](b|0,c|0)}function Ak(a,b){a=a|0;b=b|0;return Yb[a&31](b|0)|0}function Bk(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Zb[a&1](b|0,c|0,d|0)}function Ck(a){a=a|0;_b[a&0]()}function Dk(a,b,c,d){a=a|0;b=b|0;c=c|0;d=+d;$b[a&3](b|0,c|0,+d)}function Ek(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return ac[a&1](b|0,c|0,d|0,e|0)|0}function Fk(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;bc[a&3](b|0,c|0,d|0,e|0,f|0,g|0)}function Gk(a,b,c){a=a|0;b=b|0;c=c|0;return cc[a&15](b|0,c|0)|0}function Hk(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;dc[a&3](b|0,c|0,d|0,e|0)}function Ik(a,b,c){a=a|0;b=b|0;c=c|0;ca(0);return 0}function Jk(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;ca(1)}function Kk(a,b){a=a|0;b=b|0;ca(2);return 0.0}function Lk(a,b){a=a|0;b=+b;ca(3)}function Mk(a){a=a|0;ca(4);return 0.0}function Nk(){ca(5);return 0}function Ok(a){a=a|0;ca(6)}function Pk(a,b){a=a|0;b=b|0;ca(7)}function Qk(a){a=a|0;ca(8);return 0}function Rk(a,b,c){a=a|0;b=b|0;c=c|0;ca(9)}function Sk(){ca(10)}function Tk(a,b,c){a=a|0;b=b|0;c=+c;ca(11)}function Uk(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;ca(12);return 0}function Vk(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;ca(13)}function Wk(a,b){a=a|0;b=b|0;ca(14);return 0}function Xk(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;ca(15)} + +// EMSCRIPTEN_END_FUNCS +var Qb=[Ik,Zh,_h,Qj,Qi,Pi,Ri,Ag,sg,qg,rg,yg,kh,jh,Oi,Mj];var Rb=[Jk,ki,ji,gi];var Sb=[Kk,dh];var Tb=[Lk,Wf,Yf,ag];var Ub=[Mk,Xf,Zf,bg];var Vb=[Nk,Nf];var Wb=[Ok,Mh,Nh,Sh,Vh,Th,Uh,Wh,Xh,Yh,Mf,Xg,Yg,Ij,Jj,Ok];var Xb=[Pk,ig,gg,_f,cg,eg,ng,gh];var Yb=[Qk,Oh,Ni,Pf,Vf,Qf,wg,xg,mg,lg,jg,hg,$f,dg,fg,og,fh,Qk,Qk,Qk,Qk,Qk,Qk,Qk,Qk,Qk,Qk,Qk,Qk,Qk,Qk,Qk];var Zb=[Rk,ch];var _b=[Sk];var $b=[Tk,eh,bh,Tk];var ac=[Uk,mh];var bc=[Vk,ni,mi,li];var cc=[Wk,Df,Sf,Tf,Uf,tg,vg,ug,zg,kg,lh,hh,Wk,Wk,Wk,Wk];var dc=[Xk,ai,bi,di];return{_i64Subtract:dk,_fflush:Yi,_i64Add:gk,_memset:ek,_malloc:Uj,_memcpy:ik,___getTypeName:Ah,_bitshift64Lshr:hk,_free:Vj,___errno_location:qi,_bitshift64Shl:fk,__GLOBAL__sub_I_ARToolKitJS_cpp:Wg,__GLOBAL__sub_I_bind_cpp:Ch,runPostSets:ck,stackAlloc:ec,stackSave:fc,stackRestore:gc,establishStackSpace:hc,setThrew:ic,setTempRet0:lc,getTempRet0:mc,dynCall_iiii:sk,dynCall_viiiii:tk,dynCall_dii:uk,dynCall_vid:vk,dynCall_di:wk,dynCall_i:xk,dynCall_vi:yk,dynCall_vii:zk,dynCall_ii:Ak,dynCall_viii:Bk,dynCall_v:Ck,dynCall_viid:Dk,dynCall_iiiii:Ek,dynCall_viiiiii:Fk,dynCall_iii:Gk,dynCall_viiii:Hk}}) + + +// EMSCRIPTEN_END_ASM +(Module.asmGlobalArg,Module.asmLibraryArg,buffer);var _i64Subtract=Module["_i64Subtract"]=asm["_i64Subtract"];var __GLOBAL__sub_I_bind_cpp=Module["__GLOBAL__sub_I_bind_cpp"]=asm["__GLOBAL__sub_I_bind_cpp"];var _fflush=Module["_fflush"]=asm["_fflush"];var __GLOBAL__sub_I_ARToolKitJS_cpp=Module["__GLOBAL__sub_I_ARToolKitJS_cpp"]=asm["__GLOBAL__sub_I_ARToolKitJS_cpp"];var _i64Add=Module["_i64Add"]=asm["_i64Add"];var _memset=Module["_memset"]=asm["_memset"];var runPostSets=Module["runPostSets"]=asm["runPostSets"];var _malloc=Module["_malloc"]=asm["_malloc"];var _memcpy=Module["_memcpy"]=asm["_memcpy"];var ___getTypeName=Module["___getTypeName"]=asm["___getTypeName"];var _bitshift64Lshr=Module["_bitshift64Lshr"]=asm["_bitshift64Lshr"];var _free=Module["_free"]=asm["_free"];var ___errno_location=Module["___errno_location"]=asm["___errno_location"];var _bitshift64Shl=Module["_bitshift64Shl"]=asm["_bitshift64Shl"];var dynCall_iiii=Module["dynCall_iiii"]=asm["dynCall_iiii"];var dynCall_viiiii=Module["dynCall_viiiii"]=asm["dynCall_viiiii"];var dynCall_dii=Module["dynCall_dii"]=asm["dynCall_dii"];var dynCall_vid=Module["dynCall_vid"]=asm["dynCall_vid"];var dynCall_di=Module["dynCall_di"]=asm["dynCall_di"];var dynCall_i=Module["dynCall_i"]=asm["dynCall_i"];var dynCall_vi=Module["dynCall_vi"]=asm["dynCall_vi"];var dynCall_vii=Module["dynCall_vii"]=asm["dynCall_vii"];var dynCall_ii=Module["dynCall_ii"]=asm["dynCall_ii"];var dynCall_viii=Module["dynCall_viii"]=asm["dynCall_viii"];var dynCall_v=Module["dynCall_v"]=asm["dynCall_v"];var dynCall_viid=Module["dynCall_viid"]=asm["dynCall_viid"];var dynCall_iiiii=Module["dynCall_iiiii"]=asm["dynCall_iiiii"];var dynCall_viiiiii=Module["dynCall_viiiiii"]=asm["dynCall_viiiiii"];var dynCall_iii=Module["dynCall_iii"]=asm["dynCall_iii"];var dynCall_viiii=Module["dynCall_viiii"]=asm["dynCall_viiii"];Runtime.stackAlloc=asm["stackAlloc"];Runtime.stackSave=asm["stackSave"];Runtime.stackRestore=asm["stackRestore"];Runtime.establishStackSpace=asm["establishStackSpace"];Runtime.setTempRet0=asm["setTempRet0"];Runtime.getTempRet0=asm["getTempRet0"];function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;var preloadStartTime=null;var calledMain=false;dependenciesFulfilled=function runCaller(){if(!Module["calledRun"])run();if(!Module["calledRun"])dependenciesFulfilled=runCaller};Module["callMain"]=Module.callMain=function callMain(args){assert(runDependencies==0,"cannot call main when async dependencies remain! (listen on __ATMAIN__)");assert(__ATPRERUN__.length==0,"cannot call main when preRun functions remain to be called");args=args||[];ensureInitRuntime();var argc=args.length+1;function pad(){for(var i=0;i<4-1;i++){argv.push(0)}}var argv=[allocate(intArrayFromString(Module["thisProgram"]),"i8",ALLOC_NORMAL)];pad();for(var i=0;i<argc-1;i=i+1){argv.push(allocate(intArrayFromString(args[i]),"i8",ALLOC_NORMAL));pad()}argv.push(0);argv=allocate(argv,"i32",ALLOC_NORMAL);try{var ret=Module["_main"](argc,argv,0);exit(ret,true)}catch(e){if(e instanceof ExitStatus){return}else if(e=="SimulateInfiniteLoop"){Module["noExitRuntime"]=true;return}else{if(e&&typeof e==="object"&&e.stack)Module.printErr("exception thrown: "+[e,e.stack]);throw e}}finally{calledMain=true}};function run(args){args=args||Module["arguments"];if(preloadStartTime===null)preloadStartTime=Date.now();if(runDependencies>0){return}preRun();if(runDependencies>0)return;if(Module["calledRun"])return;function doRun(){if(Module["calledRun"])return;Module["calledRun"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();if(Module["_main"]&&shouldRunNow)Module["callMain"](args);postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout((function(){setTimeout((function(){Module["setStatus"]("")}),1);doRun()}),1)}else{doRun()}}Module["run"]=Module.run=run;function exit(status,implicit){if(implicit&&Module["noExitRuntime"]){return}if(Module["noExitRuntime"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module["onExit"])Module["onExit"](status)}if(ENVIRONMENT_IS_NODE){process["stdout"]["once"]("drain",(function(){process["exit"](status)}));console.log(" ");setTimeout((function(){process["exit"](status)}),500)}else if(ENVIRONMENT_IS_SHELL&&typeof quit==="function"){quit(status)}throw new ExitStatus(status)}Module["exit"]=Module.exit=exit;var abortDecorators=[];function abort(what){if(what!==undefined){Module.print(what);Module.printErr(what);what=JSON.stringify(what)}else{what=""}ABORT=true;EXITSTATUS=1;var extra="\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.";var output="abort("+what+") at "+stackTrace()+extra;if(abortDecorators){abortDecorators.forEach((function(decorator){output=decorator(output,what)}))}throw output}Module["abort"]=Module.abort=abort;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}var shouldRunNow=true;if(Module["noInitialRun"]){shouldRunNow=false}run() diff --git a/1_Three.js/6_AR/jsartoolkit5/artoolkit.three.js b/1_Three.js/6_AR/jsartoolkit5/artoolkit.three.js new file mode 100755 index 0000000000000000000000000000000000000000..4162d486ce65ddc9ecab72deffb566d2afc517eb --- /dev/null +++ b/1_Three.js/6_AR/jsartoolkit5/artoolkit.three.js @@ -0,0 +1,323 @@ +/* THREE.js ARToolKit integration */ + +(function() { + var integrate = function() { + /** + Helper for setting up a Three.js AR scene using the device camera as input. + Pass in the maximum dimensions of the video you want to process and onSuccess and onError callbacks. + + On a successful initialization, the onSuccess callback is called with an ThreeARScene object. + The ThreeARScene object contains two THREE.js scenes (one for the video image and other for the 3D scene) + and a couple of helper functions for doing video frame processing and AR rendering. + + Here's the structure of the ThreeARScene object: + { + scene: THREE.Scene, // The 3D scene. Put your AR objects here. + camera: THREE.Camera, // The 3D scene camera. + + arController: ARController, + + video: HTMLVideoElement, // The userMedia video element. + + videoScene: THREE.Scene, // The userMedia video image scene. Shows the video feed. + videoCamera: THREE.Camera, // Camera for the userMedia video scene. + + process: function(), // Process the current video frame and update the markers in the scene. + renderOn: function( THREE.WebGLRenderer ) // Render the AR scene and video background on the given Three.js renderer. + } + + You should use the arScene.video.videoWidth and arScene.video.videoHeight to set the width and height of your renderer. + + In your frame loop, use arScene.process() and arScene.renderOn(renderer) to do frame processing and 3D rendering, respectively. + + @param {number} width - The maximum width of the userMedia video to request. + @param {number} height - The maximum height of the userMedia video to request. + @param {function} onSuccess - Called on successful initialization with an ThreeARScene object. + @param {function} onError - Called if the initialization fails with the error encountered. + */ + ARController.getUserMediaThreeScene = function(configuration) { + var obj = {}; + for (var i in configuration) { + obj[i] = configuration[i]; + } + var onSuccess = configuration.onSuccess; + + obj.onSuccess = function(arController, arCameraParam) { + var scenes = arController.createThreeScene(); + onSuccess(scenes, arController, arCameraParam); + }; + + var video = this.getUserMediaARController(obj); + return video; + }; + + /** + Creates a Three.js scene for use with this ARController. + + Returns a ThreeARScene object that contains two THREE.js scenes (one for the video image and other for the 3D scene) + and a couple of helper functions for doing video frame processing and AR rendering. + + Here's the structure of the ThreeARScene object: + { + scene: THREE.Scene, // The 3D scene. Put your AR objects here. + camera: THREE.Camera, // The 3D scene camera. + + arController: ARController, + + video: HTMLVideoElement, // The userMedia video element. + + videoScene: THREE.Scene, // The userMedia video image scene. Shows the video feed. + videoCamera: THREE.Camera, // Camera for the userMedia video scene. + + process: function(), // Process the current video frame and update the markers in the scene. + renderOn: function( THREE.WebGLRenderer ) // Render the AR scene and video background on the given Three.js renderer. + } + + You should use the arScene.video.videoWidth and arScene.video.videoHeight to set the width and height of your renderer. + + In your frame loop, use arScene.process() and arScene.renderOn(renderer) to do frame processing and 3D rendering, respectively. + + @param video Video image to use as scene background. Defaults to this.image + */ + ARController.prototype.createThreeScene = function(video) { + video = video || this.image; + + this.setupThree(); + + // To display the video, first create a texture from it. + var videoTex = new THREE.Texture(video); + + videoTex.minFilter = THREE.LinearFilter; + videoTex.flipY = false; + + // Then create a plane textured with the video. + var plane = new THREE.Mesh( + new THREE.PlaneBufferGeometry(2, 2), + new THREE.MeshBasicMaterial({map: videoTex, side: THREE.DoubleSide}) + ); + + // The video plane shouldn't care about the z-buffer. + plane.material.depthTest = false; + plane.material.depthWrite = false; + + // Create a camera and a scene for the video plane and + // add the camera and the video plane to the scene. + var videoCamera = new THREE.OrthographicCamera(-1, 1, -1, 1, -1, 1); + var videoScene = new THREE.Scene(); + videoScene.add(plane); + videoScene.add(videoCamera); + + if (this.orientation === 'portrait') { + plane.rotation.z = Math.PI/2; + } + + var scene = new THREE.Scene(); + var camera = new THREE.Camera(); + camera.matrixAutoUpdate = false; + camera.projectionMatrix.elements.set(this.getCameraMatrix()); + + scene.add(camera); + + + var self = this; + + return { + scene: scene, + videoScene: videoScene, + camera: camera, + videoCamera: videoCamera, + + arController: this, + + video: video, + + process: function() { + for (var i in self.threePatternMarkers) { + self.threePatternMarkers[i].visible = false; + } + for (var i in self.threeBarcodeMarkers) { + self.threeBarcodeMarkers[i].visible = false; + } + for (var i in self.threeMultiMarkers) { + self.threeMultiMarkers[i].visible = false; + for (var j=0; j<self.threeMultiMarkers[i].markers.length; j++) { + if (self.threeMultiMarkers[i].markers[j]) { + self.threeMultiMarkers[i].markers[j].visible = false; + } + } + } + self.process(video); + }, + + renderOn: function(renderer) { + videoTex.needsUpdate = true; + + var ac = renderer.autoClear; + renderer.autoClear = false; + renderer.clear(); + renderer.render(this.videoScene, this.videoCamera); + renderer.render(this.scene, this.camera); + renderer.autoClear = ac; + } + }; + }; + + + /** + Creates a Three.js marker Object3D for the given marker UID. + The marker Object3D tracks the marker pattern when it's detected in the video. + + Use this after a successful artoolkit.loadMarker call: + + arController.loadMarker('/bin/Data/patt.hiro', function(markerUID) { + var markerRoot = arController.createThreeMarker(markerUID); + markerRoot.add(myFancyHiroModel); + arScene.scene.add(markerRoot); + }); + + @param {number} markerUID The UID of the marker to track. + @param {number} markerWidth The width of the marker, defaults to 1. + @return {THREE.Object3D} Three.Object3D that tracks the given marker. + */ + ARController.prototype.createThreeMarker = function(markerUID, markerWidth) { + this.setupThree(); + var obj = new THREE.Object3D(); + obj.markerTracker = this.trackPatternMarkerId(markerUID, markerWidth); + obj.matrixAutoUpdate = false; + this.threePatternMarkers[markerUID] = obj; + return obj; + }; + + /** + Creates a Three.js marker Object3D for the given multimarker UID. + The marker Object3D tracks the multimarker when it's detected in the video. + + Use this after a successful arController.loadMarker call: + + arController.loadMultiMarker('/bin/Data/multi-barcode-4x3.dat', function(markerUID) { + var markerRoot = arController.createThreeMultiMarker(markerUID); + markerRoot.add(myFancyMultiMarkerModel); + arScene.scene.add(markerRoot); + }); + + @param {number} markerUID The UID of the marker to track. + @return {THREE.Object3D} Three.Object3D that tracks the given marker. + */ + ARController.prototype.createThreeMultiMarker = function(markerUID) { + this.setupThree(); + var obj = new THREE.Object3D(); + obj.matrixAutoUpdate = false; + obj.markers = []; + this.threeMultiMarkers[markerUID] = obj; + return obj; + }; + + /** + Creates a Three.js marker Object3D for the given barcode marker UID. + The marker Object3D tracks the marker pattern when it's detected in the video. + + var markerRoot20 = arController.createThreeBarcodeMarker(20); + markerRoot20.add(myFancyNumber20Model); + arScene.scene.add(markerRoot20); + + var markerRoot5 = arController.createThreeBarcodeMarker(5); + markerRoot5.add(myFancyNumber5Model); + arScene.scene.add(markerRoot5); + + @param {number} markerUID The UID of the barcode marker to track. + @param {number} markerWidth The width of the marker, defaults to 1. + @return {THREE.Object3D} Three.Object3D that tracks the given marker. + */ + ARController.prototype.createThreeBarcodeMarker = function(markerUID, markerWidth) { + this.setupThree(); + var obj = new THREE.Object3D(); + obj.markerTracker = this.trackBarcodeMarkerId(markerUID, markerWidth); + obj.matrixAutoUpdate = false; + this.threeBarcodeMarkers[markerUID] = obj; + return obj; + }; + + ARController.prototype.setupThree = function() { + if (this.THREE_JS_ENABLED) { + return; + } + this.THREE_JS_ENABLED = true; + + /* + Listen to getMarker events to keep track of Three.js markers. + */ + this.addEventListener('getMarker', function(ev) { + var marker = ev.data.marker; + var obj; + if (ev.data.type === artoolkit.PATTERN_MARKER) { + obj = this.threePatternMarkers[ev.data.marker.idPatt]; + + } else if (ev.data.type === artoolkit.BARCODE_MARKER) { + obj = this.threeBarcodeMarkers[ev.data.marker.idMatrix]; + + } + if (obj) { + obj.matrix.elements.set(ev.data.matrix); + obj.visible = true; + } + }); + + /* + Listen to getMultiMarker events to keep track of Three.js multimarkers. + */ + this.addEventListener('getMultiMarker', function(ev) { + var obj = this.threeMultiMarkers[ev.data.multiMarkerId]; + if (obj) { + obj.matrix.elements.set(ev.data.matrix); + obj.visible = true; + } + }); + + /* + Listen to getMultiMarkerSub events to keep track of Three.js multimarker submarkers. + */ + this.addEventListener('getMultiMarkerSub', function(ev) { + var marker = ev.data.multiMarkerId; + var subMarkerID = ev.data.markerIndex; + var subMarker = ev.data.marker; + var obj = this.threeMultiMarkers[marker]; + if (obj && obj.markers && obj.markers[subMarkerID]) { + var sub = obj.markers[subMarkerID]; + sub.matrix.elements.set(ev.data.matrix); + sub.visible = (subMarker.visible >= 0); + } + }); + + /** + Index of Three.js pattern markers, maps markerID -> THREE.Object3D. + */ + this.threePatternMarkers = {}; + + /** + Index of Three.js barcode markers, maps markerID -> THREE.Object3D. + */ + this.threeBarcodeMarkers = {}; + + /** + Index of Three.js multimarkers, maps markerID -> THREE.Object3D. + */ + this.threeMultiMarkers = {}; + }; + + }; + + + var tick = function() { + if (window.ARController && window.THREE) { + integrate(); + if (window.ARThreeOnLoad) { + window.ARThreeOnLoad(); + } + } else { + setTimeout(tick, 50); + } + }; + + tick(); + +})(); diff --git a/1_Three.js/6_AR/markers/10cm/kanji.png b/1_Three.js/6_AR/markers/10cm/kanji.png new file mode 100755 index 0000000000000000000000000000000000000000..e7b1e7e6951cc1a4f735e770fe08dbd6fcadbe14 Binary files /dev/null and b/1_Three.js/6_AR/markers/10cm/kanji.png differ diff --git a/1_Three.js/6_AR/markers/10cm/letterA.png b/1_Three.js/6_AR/markers/10cm/letterA.png new file mode 100755 index 0000000000000000000000000000000000000000..5bd035cf25cf2c0b755c1f2a62991901d74cceee Binary files /dev/null and b/1_Three.js/6_AR/markers/10cm/letterA.png differ diff --git a/1_Three.js/6_AR/markers/10cm/letterB.png b/1_Three.js/6_AR/markers/10cm/letterB.png new file mode 100755 index 0000000000000000000000000000000000000000..3d49a9e75797fb966ceca1e845b2a7ab41d0fa53 Binary files /dev/null and b/1_Three.js/6_AR/markers/10cm/letterB.png differ diff --git a/1_Three.js/6_AR/markers/10cm/letterC.png b/1_Three.js/6_AR/markers/10cm/letterC.png new file mode 100755 index 0000000000000000000000000000000000000000..52c5c113a20bb1b0c3855255e2d58ca20f654931 Binary files /dev/null and b/1_Three.js/6_AR/markers/10cm/letterC.png differ diff --git a/1_Three.js/6_AR/markers/10cm/letterD.png b/1_Three.js/6_AR/markers/10cm/letterD.png new file mode 100755 index 0000000000000000000000000000000000000000..be4e8fe1fad8b9b711fd30da34a4085865ab123b Binary files /dev/null and b/1_Three.js/6_AR/markers/10cm/letterD.png differ diff --git a/1_Three.js/6_AR/markers/10cm/letterF.png b/1_Three.js/6_AR/markers/10cm/letterF.png new file mode 100755 index 0000000000000000000000000000000000000000..9762880a80762cd8a6b83648be23517186d221e2 Binary files /dev/null and b/1_Three.js/6_AR/markers/10cm/letterF.png differ diff --git a/1_Three.js/6_AR/markers/10cm/readme.txt b/1_Three.js/6_AR/markers/10cm/readme.txt new file mode 100755 index 0000000000000000000000000000000000000000..6b85b217c16af0459a6a1345e6136d8f04181878 --- /dev/null +++ b/1_Three.js/6_AR/markers/10cm/readme.txt @@ -0,0 +1 @@ +All images in this directory are 10cm by 10cm. diff --git a/1_Three.js/6_AR/markers/barcode05.png b/1_Three.js/6_AR/markers/barcode05.png new file mode 100755 index 0000000000000000000000000000000000000000..e13f1cf2b9227b407f5191831d99f13a782f30ee Binary files /dev/null and b/1_Three.js/6_AR/markers/barcode05.png differ diff --git a/1_Three.js/6_AR/markers/barcodes/00.png b/1_Three.js/6_AR/markers/barcodes/00.png new file mode 100755 index 0000000000000000000000000000000000000000..efe9493b9f43115f50e704aba944570390501c1e Binary files /dev/null and b/1_Three.js/6_AR/markers/barcodes/00.png differ diff --git a/1_Three.js/6_AR/markers/barcodes/01.png b/1_Three.js/6_AR/markers/barcodes/01.png new file mode 100755 index 0000000000000000000000000000000000000000..7f4d079a022bf3c7e178b02c719c0658d141fbe0 Binary files /dev/null and b/1_Three.js/6_AR/markers/barcodes/01.png differ diff --git a/1_Three.js/6_AR/markers/barcodes/02.png b/1_Three.js/6_AR/markers/barcodes/02.png new file mode 100755 index 0000000000000000000000000000000000000000..931df57a7d71d918876523f9673824ad8a2b4f8d Binary files /dev/null and b/1_Three.js/6_AR/markers/barcodes/02.png differ diff --git a/1_Three.js/6_AR/markers/barcodes/03.png b/1_Three.js/6_AR/markers/barcodes/03.png new file mode 100755 index 0000000000000000000000000000000000000000..f6cd6674e01caef47e6e3ca3a807f8dfcc61ca0d Binary files /dev/null and b/1_Three.js/6_AR/markers/barcodes/03.png differ diff --git a/1_Three.js/6_AR/markers/barcodes/04.png b/1_Three.js/6_AR/markers/barcodes/04.png new file mode 100755 index 0000000000000000000000000000000000000000..2a2cb2aa81633e486dc679633b19a8048fe5a526 Binary files /dev/null and b/1_Three.js/6_AR/markers/barcodes/04.png differ diff --git a/1_Three.js/6_AR/markers/barcodes/05.png b/1_Three.js/6_AR/markers/barcodes/05.png new file mode 100755 index 0000000000000000000000000000000000000000..cf3f9cd8c9134b65adc7bff1acedc994877028dd Binary files /dev/null and b/1_Three.js/6_AR/markers/barcodes/05.png differ diff --git a/1_Three.js/6_AR/markers/barcodes/06.png b/1_Three.js/6_AR/markers/barcodes/06.png new file mode 100755 index 0000000000000000000000000000000000000000..71024a41070a300e0e9f78e9d0a3c159e06929c8 Binary files /dev/null and b/1_Three.js/6_AR/markers/barcodes/06.png differ diff --git a/1_Three.js/6_AR/markers/barcodes/07.png b/1_Three.js/6_AR/markers/barcodes/07.png new file mode 100755 index 0000000000000000000000000000000000000000..f6fe66123bf93495968631bc68981b42299b4119 Binary files /dev/null and b/1_Three.js/6_AR/markers/barcodes/07.png differ diff --git a/1_Three.js/6_AR/markers/barcodes/08.png b/1_Three.js/6_AR/markers/barcodes/08.png new file mode 100755 index 0000000000000000000000000000000000000000..42494ec1f2f7494ba5ca911ba5f7389aa3ac4e3e Binary files /dev/null and b/1_Three.js/6_AR/markers/barcodes/08.png differ diff --git a/1_Three.js/6_AR/markers/barcodes/09.png b/1_Three.js/6_AR/markers/barcodes/09.png new file mode 100755 index 0000000000000000000000000000000000000000..39970f32f8c35249174b0b0cf07beafccf8d2f14 Binary files /dev/null and b/1_Three.js/6_AR/markers/barcodes/09.png differ diff --git a/1_Three.js/6_AR/markers/barcodes/10.png b/1_Three.js/6_AR/markers/barcodes/10.png new file mode 100755 index 0000000000000000000000000000000000000000..202579dee7d9d325a552b60a61279cc3f68a4ff1 Binary files /dev/null and b/1_Three.js/6_AR/markers/barcodes/10.png differ diff --git a/1_Three.js/6_AR/markers/barcodes/11.png b/1_Three.js/6_AR/markers/barcodes/11.png new file mode 100755 index 0000000000000000000000000000000000000000..f59b27e4635100bfb8fd7507364cd5d016c17ca9 Binary files /dev/null and b/1_Three.js/6_AR/markers/barcodes/11.png differ diff --git a/1_Three.js/6_AR/markers/barcodes/12.png b/1_Three.js/6_AR/markers/barcodes/12.png new file mode 100755 index 0000000000000000000000000000000000000000..7cf8fd51a64c99055000190b3113c427a24e871f Binary files /dev/null and b/1_Three.js/6_AR/markers/barcodes/12.png differ diff --git a/1_Three.js/6_AR/markers/barcodes/13.png b/1_Three.js/6_AR/markers/barcodes/13.png new file mode 100755 index 0000000000000000000000000000000000000000..51c3699c1b8be4ce262454e1bdf9d0c1ef060847 Binary files /dev/null and b/1_Three.js/6_AR/markers/barcodes/13.png differ diff --git a/1_Three.js/6_AR/markers/barcodes/14.png b/1_Three.js/6_AR/markers/barcodes/14.png new file mode 100755 index 0000000000000000000000000000000000000000..53138f6b94256ddbb862c11653fbea2e953fe223 Binary files /dev/null and b/1_Three.js/6_AR/markers/barcodes/14.png differ diff --git a/1_Three.js/6_AR/markers/barcodes/15.png b/1_Three.js/6_AR/markers/barcodes/15.png new file mode 100755 index 0000000000000000000000000000000000000000..30a853b35c9933e6f2e9b2b7e27b41fb05a62a78 Binary files /dev/null and b/1_Three.js/6_AR/markers/barcodes/15.png differ diff --git a/1_Three.js/6_AR/markers/barcodes/label-00.png b/1_Three.js/6_AR/markers/barcodes/label-00.png new file mode 100755 index 0000000000000000000000000000000000000000..1c797cc2cc3a23166844932f07ab902c0dc30479 Binary files /dev/null and b/1_Three.js/6_AR/markers/barcodes/label-00.png differ diff --git a/1_Three.js/6_AR/markers/barcodes/label-01.png b/1_Three.js/6_AR/markers/barcodes/label-01.png new file mode 100755 index 0000000000000000000000000000000000000000..a21454a0e342ff259674082a18d0cbb7de91e8f5 Binary files /dev/null and b/1_Three.js/6_AR/markers/barcodes/label-01.png differ diff --git a/1_Three.js/6_AR/markers/barcodes/label-02.png b/1_Three.js/6_AR/markers/barcodes/label-02.png new file mode 100755 index 0000000000000000000000000000000000000000..fe277b09996fb607d31bcfb9c1a3f4e3304aea30 Binary files /dev/null and b/1_Three.js/6_AR/markers/barcodes/label-02.png differ diff --git a/1_Three.js/6_AR/markers/barcodes/label-03.png b/1_Three.js/6_AR/markers/barcodes/label-03.png new file mode 100755 index 0000000000000000000000000000000000000000..1f505961c8c005dbd383de4023e21c530e3a308a Binary files /dev/null and b/1_Three.js/6_AR/markers/barcodes/label-03.png differ diff --git a/1_Three.js/6_AR/markers/barcodes/template.png b/1_Three.js/6_AR/markers/barcodes/template.png new file mode 100755 index 0000000000000000000000000000000000000000..8a040fd3b3ff8c6ff58e51cc5f6993909885abf6 Binary files /dev/null and b/1_Three.js/6_AR/markers/barcodes/template.png differ diff --git a/1_Three.js/6_AR/markers/cube.png b/1_Three.js/6_AR/markers/cube.png new file mode 100755 index 0000000000000000000000000000000000000000..448e8e7855284db5066c9b2e85e7907a53c675ff Binary files /dev/null and b/1_Three.js/6_AR/markers/cube.png differ diff --git a/1_Three.js/6_AR/markers/hiro.png b/1_Three.js/6_AR/markers/hiro.png new file mode 100755 index 0000000000000000000000000000000000000000..89d6ea819bff64fbb6ec2801372b5508d8dd4dc5 Binary files /dev/null and b/1_Three.js/6_AR/markers/hiro.png differ diff --git a/1_Three.js/6_AR/markers/kanji-a.png b/1_Three.js/6_AR/markers/kanji-a.png new file mode 100755 index 0000000000000000000000000000000000000000..3490cc0f2e8b4d67891365adfcac21cfb268cd9b Binary files /dev/null and b/1_Three.js/6_AR/markers/kanji-a.png differ diff --git a/1_Three.js/6_AR/markers/kanji-abcd.png b/1_Three.js/6_AR/markers/kanji-abcd.png new file mode 100755 index 0000000000000000000000000000000000000000..0ca04fe2a90f4b58b79729a352c2483bf4948e74 Binary files /dev/null and b/1_Three.js/6_AR/markers/kanji-abcd.png differ diff --git a/1_Three.js/6_AR/markers/kanji-b.png b/1_Three.js/6_AR/markers/kanji-b.png new file mode 100755 index 0000000000000000000000000000000000000000..be4bc8553760fdad18add354500b3a2808d50478 Binary files /dev/null and b/1_Three.js/6_AR/markers/kanji-b.png differ diff --git a/1_Three.js/6_AR/markers/kanji-c.png b/1_Three.js/6_AR/markers/kanji-c.png new file mode 100755 index 0000000000000000000000000000000000000000..f1f03dc021b8d6160464026c12b960a9d36095d4 Binary files /dev/null and b/1_Three.js/6_AR/markers/kanji-c.png differ diff --git a/1_Three.js/6_AR/markers/kanji-d.png b/1_Three.js/6_AR/markers/kanji-d.png new file mode 100755 index 0000000000000000000000000000000000000000..09020dbca73937c846ae1671afe6580d9463dc6b Binary files /dev/null and b/1_Three.js/6_AR/markers/kanji-d.png differ diff --git a/1_Three.js/6_AR/markers/kanji.png b/1_Three.js/6_AR/markers/kanji.png new file mode 100755 index 0000000000000000000000000000000000000000..ecbfbf3d0f9c590c76c741c0d9395c70733884fe Binary files /dev/null and b/1_Three.js/6_AR/markers/kanji.png differ diff --git a/1_Three.js/6_AR/markers/letterA.png b/1_Three.js/6_AR/markers/letterA.png new file mode 100755 index 0000000000000000000000000000000000000000..d65dfdcd697ce1a0c567051a7003565c4fd1bc80 Binary files /dev/null and b/1_Three.js/6_AR/markers/letterA.png differ diff --git a/1_Three.js/6_AR/markers/letterB.png b/1_Three.js/6_AR/markers/letterB.png new file mode 100755 index 0000000000000000000000000000000000000000..af62648a6e02651508e3d2657da8d896d8a124c1 Binary files /dev/null and b/1_Three.js/6_AR/markers/letterB.png differ diff --git a/1_Three.js/6_AR/markers/letterC.png b/1_Three.js/6_AR/markers/letterC.png new file mode 100755 index 0000000000000000000000000000000000000000..d6c76dee68156124c4ea16d29d93ad3b1fafff1c Binary files /dev/null and b/1_Three.js/6_AR/markers/letterC.png differ diff --git a/1_Three.js/6_AR/markers/letterD.png b/1_Three.js/6_AR/markers/letterD.png new file mode 100755 index 0000000000000000000000000000000000000000..b4b988dd0095c68b215d008c7bc4b51c8cd75005 Binary files /dev/null and b/1_Three.js/6_AR/markers/letterD.png differ diff --git a/1_Three.js/6_AR/markers/letterF.png b/1_Three.js/6_AR/markers/letterF.png new file mode 100755 index 0000000000000000000000000000000000000000..a0c18aac543c5cf657ffdc76eddeb0d9ccb6144b Binary files /dev/null and b/1_Three.js/6_AR/markers/letterF.png differ diff --git a/1_Three.js/6_AR/markers/readme.txt b/1_Three.js/6_AR/markers/readme.txt new file mode 100755 index 0000000000000000000000000000000000000000..2a765957e26c3088de07624682c740bd5c33e64a --- /dev/null +++ b/1_Three.js/6_AR/markers/readme.txt @@ -0,0 +1 @@ +The pattern images are each 512x512, but the detected part is the inner black square, which translates to 1 unit in the virtual world. The inner black square takes up 80% of the width/height of the entire image, so to cover the entire image (including the outer white area up to the thin black border), use a cube that is 1.25 units on a side. \ No newline at end of file diff --git a/1_Three.js/6_AR/threex/threex-arbasecontrols.js b/1_Three.js/6_AR/threex/threex-arbasecontrols.js new file mode 100755 index 0000000000000000000000000000000000000000..82907d4b6199b18919eeb53c314092fd0a99a9e8 --- /dev/null +++ b/1_Three.js/6_AR/threex/threex-arbasecontrols.js @@ -0,0 +1,36 @@ +var THREEx = THREEx || {} + +THREEx.ArBaseControls = function(object3d){ + this.id = THREEx.ArBaseControls.id++ + + this.object3d = object3d + this.object3d.matrixAutoUpdate = false; + this.object3d.visible = false + + // Events to honor + // this.dispatchEvent({ type: 'becameVisible' }) + // this.dispatchEvent({ type: 'markerVisible' }) // replace markerFound + // this.dispatchEvent({ type: 'becameUnVisible' }) +} + +THREEx.ArBaseControls.id = 0 + +Object.assign( THREEx.ArBaseControls.prototype, THREE.EventDispatcher.prototype ); + +////////////////////////////////////////////////////////////////////////////// +// Functions +////////////////////////////////////////////////////////////////////////////// +/** + * error catching function for update() + */ +THREEx.ArBaseControls.prototype.update = function(){ + console.assert(false, 'you need to implement your own update') +} + +/** + * error catching function for name() + */ +THREEx.ArBaseControls.prototype.name = function(){ + console.assert(false, 'you need to implement your own .name()') + return 'Not yet implemented - name()' +} diff --git a/1_Three.js/6_AR/threex/threex-armarkercontrols.js b/1_Three.js/6_AR/threex/threex-armarkercontrols.js new file mode 100755 index 0000000000000000000000000000000000000000..8d35a76744f7840570520528e1fcb9cf6b7ae5f9 --- /dev/null +++ b/1_Three.js/6_AR/threex/threex-armarkercontrols.js @@ -0,0 +1,245 @@ +var ARjs = ARjs || {} +var THREEx = THREEx || {} + +ARjs.MarkerControls = THREEx.ArMarkerControls = function(context, object3d, parameters){ + var _this = this + + THREEx.ArBaseControls.call(this, object3d) + + this.context = context + // handle default parameters + this.parameters = { + // size of the marker in meter + size : 1, + // type of marker - ['pattern', 'barcode', 'unknown' ] + type : 'unknown', + // url of the pattern - IIF type='pattern' + patternUrl : null, + // value of the barcode - IIF type='barcode' + barcodeValue : null, + // change matrix mode - [modelViewMatrix, cameraTransformMatrix] + changeMatrixMode : 'modelViewMatrix', + // minimal confidence in the marke recognition - between [0, 1] - default to 1 + minConfidence: 0.6, + } + + // sanity check + var possibleValues = ['pattern', 'barcode', 'unknown'] + console.assert(possibleValues.indexOf(this.parameters.type) !== -1, 'illegal value', this.parameters.type) + var possibleValues = ['modelViewMatrix', 'cameraTransformMatrix' ] + console.assert(possibleValues.indexOf(this.parameters.changeMatrixMode) !== -1, 'illegal value', this.parameters.changeMatrixMode) + + + // create the marker Root + this.object3d = object3d + this.object3d.matrixAutoUpdate = false; + this.object3d.visible = false + + ////////////////////////////////////////////////////////////////////////////// + // setParameters + ////////////////////////////////////////////////////////////////////////////// + setParameters(parameters) + function setParameters(parameters){ + if( parameters === undefined ) return + for( var key in parameters ){ + var newValue = parameters[ key ] + + if( newValue === undefined ){ + console.warn( "THREEx.ArMarkerControls: '" + key + "' parameter is undefined." ) + continue + } + + var currentValue = _this.parameters[ key ] + + if( currentValue === undefined ){ + console.warn( "THREEx.ArMarkerControls: '" + key + "' is not a property of this material." ) + continue + } + + _this.parameters[ key ] = newValue + } + } + + ////////////////////////////////////////////////////////////////////////////// + // Code Separator + ////////////////////////////////////////////////////////////////////////////// + // add this marker to artoolkitsystem + // TODO rename that .addMarkerControls + context.addMarker(this) + + if( _this.context.parameters.trackingBackend === 'artoolkit' ){ + this._initArtoolkit() + }else if( _this.context.parameters.trackingBackend === 'aruco' ){ + // TODO create a ._initAruco + // put aruco second + this._arucoPosit = new POS.Posit(this.parameters.size, _this.context.arucoContext.canvas.width) + }else if( _this.context.parameters.trackingBackend === 'tango' ){ + this._initTango() + }else console.assert(false) +} + +ARjs.MarkerControls.prototype = Object.create( THREEx.ArBaseControls.prototype ); +ARjs.MarkerControls.prototype.constructor = THREEx.ArMarkerControls; + +ARjs.MarkerControls.prototype.dispose = function(){ + this.context.removeMarker(this) + + // TODO remove the event listener if needed + // unloadMaker ??? +} + +////////////////////////////////////////////////////////////////////////////// +// update controls with new modelViewMatrix +////////////////////////////////////////////////////////////////////////////// + +/** + * When you actually got a new modelViewMatrix, you need to perfom a whole bunch + * of things. it is done here. + */ +ARjs.MarkerControls.prototype.updateWithModelViewMatrix = function(modelViewMatrix){ + var markerObject3D = this.object3d; + + // mark object as visible + markerObject3D.visible = true + + if( this.context.parameters.trackingBackend === 'artoolkit' ){ + // apply context._axisTransformMatrix - change artoolkit axis to match usual webgl one + var tmpMatrix = new THREE.Matrix4().copy(this.context._artoolkitProjectionAxisTransformMatrix) + tmpMatrix.multiply(modelViewMatrix) + + modelViewMatrix.copy(tmpMatrix) + }else if( this.context.parameters.trackingBackend === 'aruco' ){ + // ... + }else if( this.context.parameters.trackingBackend === 'tango' ){ + // ... + }else console.assert(false) + + + if( this.context.parameters.trackingBackend !== 'tango' ){ + + // change axis orientation on marker - artoolkit say Z is normal to the marker - ar.js say Y is normal to the marker + var markerAxisTransformMatrix = new THREE.Matrix4().makeRotationX(Math.PI/2) + modelViewMatrix.multiply(markerAxisTransformMatrix) + } + + // change markerObject3D.matrix based on parameters.changeMatrixMode + if( this.parameters.changeMatrixMode === 'modelViewMatrix' ){ + markerObject3D.matrix.copy(modelViewMatrix) + }else if( this.parameters.changeMatrixMode === 'cameraTransformMatrix' ){ + markerObject3D.matrix.getInverse( modelViewMatrix ) + }else { + console.assert(false) + } + + // decompose - the matrix into .position, .quaternion, .scale + markerObject3D.matrix.decompose(markerObject3D.position, markerObject3D.quaternion, markerObject3D.scale) + + // dispatchEvent + this.dispatchEvent( { type: 'markerFound' } ); +} + +////////////////////////////////////////////////////////////////////////////// +// utility functions +////////////////////////////////////////////////////////////////////////////// + +/** + * provide a name for a marker + * - silly heuristic for now + * - should be improved + */ +ARjs.MarkerControls.prototype.name = function(){ + var name = '' + name += this.parameters.type; + if( this.parameters.type === 'pattern' ){ + var url = this.parameters.patternUrl + var basename = url.replace(/^.*\//g, '') + name += ' - ' + basename + }else if( this.parameters.type === 'barcode' ){ + name += ' - ' + this.parameters.barcodeValue + }else{ + console.assert(false, 'no .name() implemented for this marker controls') + } + return name +} + +////////////////////////////////////////////////////////////////////////////// +// init for Artoolkit +////////////////////////////////////////////////////////////////////////////// +ARjs.MarkerControls.prototype._initArtoolkit = function(){ + var _this = this + + var artoolkitMarkerId = null + + var delayedInitTimerId = setInterval(function(){ + // check if arController is init + var arController = _this.context.arController + if( arController === null ) return + // stop looping if it is init + clearInterval(delayedInitTimerId) + delayedInitTimerId = null + // launch the _postInitArtoolkit + postInit() + }, 1000/50) + + return + + function postInit(){ + // check if arController is init + var arController = _this.context.arController + console.assert(arController !== null ) + + // start tracking this pattern + if( _this.parameters.type === 'pattern' ){ + arController.loadMarker(_this.parameters.patternUrl, function(markerId) { + artoolkitMarkerId = markerId + arController.trackPatternMarkerId(artoolkitMarkerId, _this.parameters.size); + }); + }else if( _this.parameters.type === 'barcode' ){ + artoolkitMarkerId = _this.parameters.barcodeValue + arController.trackBarcodeMarkerId(artoolkitMarkerId, _this.parameters.size); + }else if( _this.parameters.type === 'unknown' ){ + artoolkitMarkerId = null + }else{ + console.log(false, 'invalid marker type', _this.parameters.type) + } + + // listen to the event + arController.addEventListener('getMarker', function(event){ + if( event.data.type === artoolkit.PATTERN_MARKER && _this.parameters.type === 'pattern' ){ + if( artoolkitMarkerId === null ) return + if( event.data.marker.idPatt === artoolkitMarkerId ) onMarkerFound(event) + }else if( event.data.type === artoolkit.BARCODE_MARKER && _this.parameters.type === 'barcode' ){ + // console.log('BARCODE_MARKER idMatrix', event.data.marker.idMatrix, artoolkitMarkerId ) + if( artoolkitMarkerId === null ) return + if( event.data.marker.idMatrix === artoolkitMarkerId ) onMarkerFound(event) + }else if( event.data.type === artoolkit.UNKNOWN_MARKER && _this.parameters.type === 'unknown'){ + onMarkerFound(event) + } + }) + + } + + function onMarkerFound(event){ + // honor his.parameters.minConfidence + if( event.data.type === artoolkit.PATTERN_MARKER && event.data.marker.cfPatt < _this.parameters.minConfidence ) return + if( event.data.type === artoolkit.BARCODE_MARKER && event.data.marker.cfMatt < _this.parameters.minConfidence ) return + + var modelViewMatrix = new THREE.Matrix4().fromArray(event.data.matrix) + _this.updateWithModelViewMatrix(modelViewMatrix) + } +} + +////////////////////////////////////////////////////////////////////////////// +// aruco specific +////////////////////////////////////////////////////////////////////////////// +ARjs.MarkerControls.prototype._initAruco = function(){ + this._arucoPosit = new POS.Posit(this.parameters.size, _this.context.arucoContext.canvas.width) +} + +////////////////////////////////////////////////////////////////////////////// +// init for Artoolkit +////////////////////////////////////////////////////////////////////////////// +ARjs.MarkerControls.prototype._initTango = function(){ + var _this = this + console.log('init tango ArMarkerControls') +} diff --git a/1_Three.js/6_AR/threex/threex-arsmoothedcontrols.js b/1_Three.js/6_AR/threex/threex-arsmoothedcontrols.js new file mode 100755 index 0000000000000000000000000000000000000000..ec2d8ff709ed442cbb008a18092db59bdb39e0cd --- /dev/null +++ b/1_Three.js/6_AR/threex/threex-arsmoothedcontrols.js @@ -0,0 +1,152 @@ +var THREEx = THREEx || {} + +/** + * - lerp position/quaternino/scale + * - minDelayDetected + * - minDelayUndetected + * @param {[type]} object3d [description] + * @param {[type]} parameters [description] + */ +THREEx.ArSmoothedControls = function(object3d, parameters){ + var _this = this + + THREEx.ArBaseControls.call(this, object3d) + + // copy parameters + this.object3d.visible = false + + this._lastLerpStepAt = null + this._visibleStartedAt = null + this._unvisibleStartedAt = null + + // handle default parameters + parameters = parameters || {} + this.parameters = { + // lerp coeficient for the position - between [0,1] - default to 1 + lerpPosition: 0.8, + // lerp coeficient for the quaternion - between [0,1] - default to 1 + lerpQuaternion: 0.2, + // lerp coeficient for the scale - between [0,1] - default to 1 + lerpScale: 0.7, + // delay for lerp fixed steps - in seconds - default to 1/120 + lerpStepDelay: 1/60, + // minimum delay the sub-control must be visible before this controls become visible - default to 0 seconds + minVisibleDelay: 0.0, + // minimum delay the sub-control must be unvisible before this controls become unvisible - default to 0 seconds + minUnvisibleDelay: 0.2, + } + + ////////////////////////////////////////////////////////////////////////////// + // setParameters + ////////////////////////////////////////////////////////////////////////////// + setParameters(parameters) + function setParameters(parameters){ + if( parameters === undefined ) return + for( var key in parameters ){ + var newValue = parameters[ key ] + + if( newValue === undefined ){ + console.warn( "THREEx.ArSmoothedControls: '" + key + "' parameter is undefined." ) + continue + } + + var currentValue = _this.parameters[ key ] + + if( currentValue === undefined ){ + console.warn( "THREEx.ArSmoothedControls: '" + key + "' is not a property of this material." ) + continue + } + + _this.parameters[ key ] = newValue + } + } +} + +THREEx.ArSmoothedControls.prototype = Object.create( THREEx.ArBaseControls.prototype ); +THREEx.ArSmoothedControls.prototype.constructor = THREEx.ArSmoothedControls; + +////////////////////////////////////////////////////////////////////////////// +// update function +////////////////////////////////////////////////////////////////////////////// + +THREEx.ArSmoothedControls.prototype.update = function(targetObject3d){ + var object3d = this.object3d + var parameters = this.parameters + var wasVisible = object3d.visible + var present = performance.now()/1000 + + + ////////////////////////////////////////////////////////////////////////////// + // handle object3d.visible with minVisibleDelay/minUnvisibleDelay + ////////////////////////////////////////////////////////////////////////////// + if( targetObject3d.visible === false ) this._visibleStartedAt = null + if( targetObject3d.visible === true ) this._unvisibleStartedAt = null + + if( targetObject3d.visible === true && this._visibleStartedAt === null ) this._visibleStartedAt = present + if( targetObject3d.visible === false && this._unvisibleStartedAt === null ) this._unvisibleStartedAt = present + + if( wasVisible === false && targetObject3d.visible === true ){ + var visibleFor = present - this._visibleStartedAt + if( visibleFor >= this.parameters.minVisibleDelay ){ + object3d.visible = true + snapDirectlyToTarget() + } + // console.log('visibleFor', visibleFor) + } + + if( wasVisible === true && targetObject3d.visible === false ){ + var unvisibleFor = present - this._unvisibleStartedAt + if( unvisibleFor >= this.parameters.minUnvisibleDelay ){ + object3d.visible = false + } + } + + ////////////////////////////////////////////////////////////////////////////// + // apply lerp on positon/quaternion/scale + ////////////////////////////////////////////////////////////////////////////// + + // apply lerp steps - require fix time steps to behave the same no matter the fps + if( this._lastLerpStepAt === null ){ + applyOneSlerpStep() + this._lastLerpStepAt = present + }else{ + var nStepsToDo = Math.floor( (present - this._lastLerpStepAt)/this.parameters.lerpStepDelay ) + for(var i = 0; i < nStepsToDo; i++){ + applyOneSlerpStep() + this._lastLerpStepAt += this.parameters.lerpStepDelay + } + } + + // disable the lerp by directly copying targetObject3d position/quaternion/scale + if( false ){ + snapDirectlyToTarget() + } + + // update the matrix + this.object3d.updateMatrix() + + ////////////////////////////////////////////////////////////////////////////// + // honor becameVisible/becameUnVisible event + ////////////////////////////////////////////////////////////////////////////// + // honor becameVisible event + if( wasVisible === false && object3d.visible === true ){ + this.dispatchEvent({ type: 'becameVisible' }) + } + // honor becameUnVisible event + if( wasVisible === true && object3d.visible === false ){ + this.dispatchEvent({ type: 'becameUnVisible' }) + } + return + + function snapDirectlyToTarget(){ + object3d.position.copy( targetObject3d.position ) + object3d.quaternion.copy( targetObject3d.quaternion ) + object3d.scale.copy( targetObject3d.scale ) + } + + function applyOneSlerpStep(){ + object3d.position.lerp(targetObject3d.position, parameters.lerpPosition) + object3d.quaternion.slerp(targetObject3d.quaternion, parameters.lerpQuaternion) + object3d.scale.lerp(targetObject3d.scale, parameters.lerpScale) + } +} diff --git a/1_Three.js/6_AR/threex/threex-artoolkitcontext.js b/1_Three.js/6_AR/threex/threex-artoolkitcontext.js new file mode 100755 index 0000000000000000000000000000000000000000..a1cc8ae2d62b319fb3d5a0c522c91ff54b696a07 --- /dev/null +++ b/1_Three.js/6_AR/threex/threex-artoolkitcontext.js @@ -0,0 +1,430 @@ +var ARjs = ARjs || {} +var THREEx = THREEx || {} + +ARjs.Context = THREEx.ArToolkitContext = function(parameters){ + var _this = this + + _this._updatedAt = null + + // handle default parameters + this.parameters = { + // AR backend - ['artoolkit', 'aruco', 'tango'] + trackingBackend: 'artoolkit', + // debug - true if one should display artoolkit debug canvas, false otherwise + debug: false, + // the mode of detection - ['color', 'color_and_matrix', 'mono', 'mono_and_matrix'] + detectionMode: 'mono', + // type of matrix code - valid iif detectionMode end with 'matrix' - [3x3, 3x3_HAMMING63, 3x3_PARITY65, 4x4, 4x4_BCH_13_9_3, 4x4_BCH_13_5_5] + matrixCodeType: '3x3', + + // url of the camera parameters + cameraParametersUrl: ARjs.Context.baseURL + 'parameters/camera_para.dat', + + // tune the maximum rate of pose detection in the source image + maxDetectionRate: 60, + // resolution of at which we detect pose in the source image + canvasWidth: 640, + canvasHeight: 480, + + // the patternRatio inside the artoolkit marker - artoolkit only + patternRatio: 0.5, + + // enable image smoothing or not for canvas copy - default to true + // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/imageSmoothingEnabled + imageSmoothingEnabled : false, + } + // parameters sanity check + console.assert(['artoolkit', 'aruco', 'tango'].indexOf(this.parameters.trackingBackend) !== -1, 'invalid parameter trackingBackend', this.parameters.trackingBackend) + console.assert(['color', 'color_and_matrix', 'mono', 'mono_and_matrix'].indexOf(this.parameters.detectionMode) !== -1, 'invalid parameter detectionMode', this.parameters.detectionMode) + + this.arController = null; + this.arucoContext = null; + + _this.initialized = false + + + this._arMarkersControls = [] + + ////////////////////////////////////////////////////////////////////////////// + // setParameters + ////////////////////////////////////////////////////////////////////////////// + setParameters(parameters) + function setParameters(parameters){ + if( parameters === undefined ) return + for( var key in parameters ){ + var newValue = parameters[ key ] + + if( newValue === undefined ){ + console.warn( "THREEx.ArToolkitContext: '" + key + "' parameter is undefined." ) + continue + } + + var currentValue = _this.parameters[ key ] + + if( currentValue === undefined ){ + console.warn( "THREEx.ArToolkitContext: '" + key + "' is not a property of this material." ) + continue + } + + _this.parameters[ key ] = newValue + } + } +} + +Object.assign( ARjs.Context.prototype, THREE.EventDispatcher.prototype ); + +// ARjs.Context.baseURL = '../' +// default to github page +ARjs.Context.baseURL = 'https://jeromeetienne.github.io/AR.js/three.js/' +ARjs.Context.REVISION = '1.6.0' + + + +/** + * Create a default camera for this trackingBackend + * @param {string} trackingBackend - the tracking to user + * @return {THREE.Camera} the created camera + */ +ARjs.Context.createDefaultCamera = function( trackingBackend ){ + console.assert(false, 'use ARjs.Utils.createDefaultCamera instead') + // Create a camera + if( trackingBackend === 'artoolkit' ){ + var camera = new THREE.Camera(); + }else if( trackingBackend === 'aruco' ){ + var camera = new THREE.PerspectiveCamera(42, renderer.domElement.width / renderer.domElement.height, 0.01, 100); + }else if( trackingBackend === 'tango' ){ + var camera = new THREE.PerspectiveCamera(42, renderer.domElement.width / renderer.domElement.height, 0.01, 100); + }else console.assert(false) + return camera +} + + +////////////////////////////////////////////////////////////////////////////// +// init functions +////////////////////////////////////////////////////////////////////////////// +ARjs.Context.prototype.init = function(onCompleted){ + var _this = this + if( this.parameters.trackingBackend === 'artoolkit' ){ + this._initArtoolkit(done) + }else if( this.parameters.trackingBackend === 'aruco' ){ + this._initAruco(done) + }else if( this.parameters.trackingBackend === 'tango' ){ + this._initTango(done) + }else console.assert(false) + return + + function done(){ + // dispatch event + _this.dispatchEvent({ + type: 'initialized' + }); + + _this.initialized = true + + onCompleted && onCompleted() + } + +} +//////////////////////////////////////////////////////////////////////////////// +// update function +//////////////////////////////////////////////////////////////////////////////// +ARjs.Context.prototype.update = function(srcElement){ + + // be sure arController is fully initialized + if(this.parameters.trackingBackend === 'artoolkit' && this.arController === null) return false; + + // honor this.parameters.maxDetectionRate + var present = performance.now() + if( this._updatedAt !== null && present - this._updatedAt < 1000/this.parameters.maxDetectionRate ){ + return false + } + this._updatedAt = present + + // mark all markers to invisible before processing this frame + this._arMarkersControls.forEach(function(markerControls){ + markerControls.object3d.visible = false + }) + + // process this frame + if(this.parameters.trackingBackend === 'artoolkit'){ + this._updateArtoolkit(srcElement) + }else if( this.parameters.trackingBackend === 'aruco' ){ + this._updateAruco(srcElement) + }else if( this.parameters.trackingBackend === 'tango' ){ + this._updateTango(srcElement) + }else{ + console.assert(false) + } + + // dispatch event + this.dispatchEvent({ + type: 'sourceProcessed' + }); + + + // return true as we processed the frame + return true; +} + +//////////////////////////////////////////////////////////////////////////////// +// Add/Remove markerControls +//////////////////////////////////////////////////////////////////////////////// +ARjs.Context.prototype.addMarker = function(arMarkerControls){ + console.assert(arMarkerControls instanceof THREEx.ArMarkerControls) + this._arMarkersControls.push(arMarkerControls) +} + +ARjs.Context.prototype.removeMarker = function(arMarkerControls){ + console.assert(arMarkerControls instanceof THREEx.ArMarkerControls) + // console.log('remove marker for', arMarkerControls) + var index = this.arMarkerControlss.indexOf(artoolkitMarker); + console.assert(index !== index ) + this._arMarkersControls.splice(index, 1) +} + +////////////////////////////////////////////////////////////////////////////// +// artoolkit specific +////////////////////////////////////////////////////////////////////////////// +ARjs.Context.prototype._initArtoolkit = function(onCompleted){ + var _this = this + + // set this._artoolkitProjectionAxisTransformMatrix to change artoolkit projection matrix axis to match usual webgl one + this._artoolkitProjectionAxisTransformMatrix = new THREE.Matrix4() + this._artoolkitProjectionAxisTransformMatrix.multiply(new THREE.Matrix4().makeRotationY(Math.PI)) + this._artoolkitProjectionAxisTransformMatrix.multiply(new THREE.Matrix4().makeRotationZ(Math.PI)) + + // get cameraParameters + var cameraParameters = new ARCameraParam(_this.parameters.cameraParametersUrl, function(){ + // init controller + var arController = new ARController(_this.parameters.canvasWidth, _this.parameters.canvasHeight, cameraParameters); + _this.arController = arController + + // honor this.parameters.imageSmoothingEnabled + arController.ctx.mozImageSmoothingEnabled = _this.parameters.imageSmoothingEnabled; + arController.ctx.webkitImageSmoothingEnabled = _this.parameters.imageSmoothingEnabled; + arController.ctx.msImageSmoothingEnabled = _this.parameters.imageSmoothingEnabled; + arController.ctx.imageSmoothingEnabled = _this.parameters.imageSmoothingEnabled; + + // honor this.parameters.debug + if( _this.parameters.debug === true ){ + arController.debugSetup(); + arController.canvas.style.position = 'absolute' + arController.canvas.style.top = '0px' + arController.canvas.style.opacity = '0.6' + arController.canvas.style.pointerEvents = 'none' + arController.canvas.style.zIndex = '-1' + } + + // setPatternDetectionMode + var detectionModes = { + 'color' : artoolkit.AR_TEMPLATE_MATCHING_COLOR, + 'color_and_matrix' : artoolkit.AR_TEMPLATE_MATCHING_COLOR_AND_MATRIX, + 'mono' : artoolkit.AR_TEMPLATE_MATCHING_MONO, + 'mono_and_matrix' : artoolkit.AR_TEMPLATE_MATCHING_MONO_AND_MATRIX, + } + var detectionMode = detectionModes[_this.parameters.detectionMode] + console.assert(detectionMode !== undefined) + arController.setPatternDetectionMode(detectionMode); + + // setMatrixCodeType + var matrixCodeTypes = { + '3x3' : artoolkit.AR_MATRIX_CODE_3x3, + '3x3_HAMMING63' : artoolkit.AR_MATRIX_CODE_3x3_HAMMING63, + '3x3_PARITY65' : artoolkit.AR_MATRIX_CODE_3x3_PARITY65, + '4x4' : artoolkit.AR_MATRIX_CODE_4x4, + '4x4_BCH_13_9_3': artoolkit.AR_MATRIX_CODE_4x4_BCH_13_9_3, + '4x4_BCH_13_5_5': artoolkit.AR_MATRIX_CODE_4x4_BCH_13_5_5, + } + var matrixCodeType = matrixCodeTypes[_this.parameters.matrixCodeType] + console.assert(matrixCodeType !== undefined) + arController.setMatrixCodeType(matrixCodeType); + + // set the patternRatio for artoolkit + arController.setPattRatio(_this.parameters.patternRatio); + + // set thresholding in artoolkit + // this seems to be the default + // arController.setThresholdMode(artoolkit.AR_LABELING_THRESH_MODE_MANUAL) + // adatative consume a LOT of cpu... + // arController.setThresholdMode(artoolkit.AR_LABELING_THRESH_MODE_AUTO_ADAPTIVE) + // arController.setThresholdMode(artoolkit.AR_LABELING_THRESH_MODE_AUTO_OTSU) + + // notify + onCompleted() + }) + return this +} + +/** + * return the projection matrix + */ +ARjs.Context.prototype.getProjectionMatrix = function(srcElement){ + + +// FIXME rename this function to say it is artoolkit specific - getArtoolkitProjectMatrix +// keep a backward compatibility with a console.warn + + console.assert( this.parameters.trackingBackend === 'artoolkit' ) + console.assert(this.arController, 'arController MUST be initialized to call this function') + // get projectionMatrixArr from artoolkit + var projectionMatrixArr = this.arController.getCameraMatrix(); + var projectionMatrix = new THREE.Matrix4().fromArray(projectionMatrixArr) + + // apply context._axisTransformMatrix - change artoolkit axis to match usual webgl one + projectionMatrix.multiply(this._artoolkitProjectionAxisTransformMatrix) + + // return the result + return projectionMatrix +} + +ARjs.Context.prototype._updateArtoolkit = function(srcElement){ + this.arController.process(srcElement) +} + +////////////////////////////////////////////////////////////////////////////// +// aruco specific +////////////////////////////////////////////////////////////////////////////// +ARjs.Context.prototype._initAruco = function(onCompleted){ + this.arucoContext = new THREEx.ArucoContext() + + // honor this.parameters.canvasWidth/.canvasHeight + this.arucoContext.canvas.width = this.parameters.canvasWidth + this.arucoContext.canvas.height = this.parameters.canvasHeight + + // honor this.parameters.imageSmoothingEnabled + var context = this.arucoContext.canvas.getContext('2d') + // context.mozImageSmoothingEnabled = this.parameters.imageSmoothingEnabled; + context.webkitImageSmoothingEnabled = this.parameters.imageSmoothingEnabled; + context.msImageSmoothingEnabled = this.parameters.imageSmoothingEnabled; + context.imageSmoothingEnabled = this.parameters.imageSmoothingEnabled; + + + setTimeout(function(){ + onCompleted() + }, 0) +} + + +ARjs.Context.prototype._updateAruco = function(srcElement){ + // console.log('update aruco here') + var _this = this + var arMarkersControls = this._arMarkersControls + var detectedMarkers = this.arucoContext.detect(srcElement) + + detectedMarkers.forEach(function(detectedMarker){ + var foundControls = null + for(var i = 0; i < arMarkersControls.length; i++){ + console.assert( arMarkersControls[i].parameters.type === 'barcode' ) + if( arMarkersControls[i].parameters.barcodeValue === detectedMarker.id ){ + foundControls = arMarkersControls[i] + break; + } + } + if( foundControls === null ) return + + var tmpObject3d = new THREE.Object3D + _this.arucoContext.updateObject3D(tmpObject3d, foundControls._arucoPosit, foundControls.parameters.size, detectedMarker); + tmpObject3d.updateMatrix() + + foundControls.updateWithModelViewMatrix(tmpObject3d.matrix) + }) +} + +////////////////////////////////////////////////////////////////////////////// +// tango specific +////////////////////////////////////////////////////////////////////////////// +ARjs.Context.prototype._initTango = function(onCompleted){ + var _this = this + // check webvr is available + if (navigator.getVRDisplays){ + // do nothing + } else if (navigator.getVRDevices){ + alert("Your browser supports WebVR but not the latest version. See <a href='http://webvr.info'>webvr.info</a> for more info."); + } else { + alert("Your browser does not support WebVR. See <a href='http://webvr.info'>webvr.info</a> for assistance."); + } + + + this._tangoContext = { + vrDisplay: null, + vrPointCloud: null, + frameData: new VRFrameData(), + } + + + // get vrDisplay + navigator.getVRDisplays().then(function (vrDisplays){ + if( vrDisplays.length === 0 ) alert('no vrDisplays available') + var vrDisplay = _this._tangoContext.vrDisplay = vrDisplays[0] + + console.log('vrDisplays.displayName :', vrDisplay.displayName) + + // init vrPointCloud + if( vrDisplay.displayName === "Tango VR Device" ){ + _this._tangoContext.vrPointCloud = new THREE.WebAR.VRPointCloud(vrDisplay, true) + } + + // NOTE it doesnt seem necessary and it fails on tango + // var canvasElement = document.createElement('canvas') + // document.body.appendChild(canvasElement) + // _this._tangoContext.requestPresent([{ source: canvasElement }]).then(function(){ + // console.log('vrdisplay request accepted') + // }); + + onCompleted() + }); +} + + +ARjs.Context.prototype._updateTango = function(srcElement){ + // console.log('update aruco here') + var _this = this + var arMarkersControls = this._arMarkersControls + var tangoContext= this._tangoContext + var vrDisplay = this._tangoContext.vrDisplay + + // check vrDisplay is already initialized + if( vrDisplay === null ) return + + + // Update the point cloud. Only if the point cloud will be shown the geometry is also updated. + if( vrDisplay.displayName === "Tango VR Device" ){ + var showPointCloud = true + var pointsToSkip = 0 + _this._tangoContext.vrPointCloud.update(showPointCloud, pointsToSkip, true) + } + + + if( this._arMarkersControls.length === 0 ) return + + // TODO here do a fake search on barcode/1001 ? + + var foundControls = this._arMarkersControls[0] + + var frameData = this._tangoContext.frameData + + // read frameData + vrDisplay.getFrameData(frameData); + + if( frameData.pose.position === null ) return + if( frameData.pose.orientation === null ) return + + // create cameraTransformMatrix + var position = new THREE.Vector3().fromArray(frameData.pose.position) + var quaternion = new THREE.Quaternion().fromArray(frameData.pose.orientation) + var scale = new THREE.Vector3(1,1,1) + var cameraTransformMatrix = new THREE.Matrix4().compose(position, quaternion, scale) + // compute modelViewMatrix from cameraTransformMatrix + var modelViewMatrix = new THREE.Matrix4() + modelViewMatrix.getInverse( cameraTransformMatrix ) + + foundControls.updateWithModelViewMatrix(modelViewMatrix) + + // console.log('position', position) + // if( position.x !== 0 || position.y !== 0 || position.z !== 0 ){ + // console.log('vrDisplay tracking') + // }else{ + // console.log('vrDisplay NOT tracking') + // } + +} diff --git a/1_Three.js/6_AR/threex/threex-artoolkitsource.js b/1_Three.js/6_AR/threex/threex-artoolkitsource.js new file mode 100755 index 0000000000000000000000000000000000000000..820af92d843cfed47abadf7def0fa6828b5d1a5b --- /dev/null +++ b/1_Three.js/6_AR/threex/threex-artoolkitsource.js @@ -0,0 +1,433 @@ +var ARjs = ARjs || {} +var THREEx = THREEx || {} + +ARjs.Source = THREEx.ArToolkitSource = function(parameters){ + var _this = this + + this.ready = false + this.domElement = null + + // handle default parameters + this.parameters = { + // type of source - ['webcam', 'image', 'video'] + sourceType : 'webcam', + // url of the source - valid if sourceType = image|video + sourceUrl : null, + + // resolution of at which we initialize in the source image + sourceWidth: 640, + sourceHeight: 480, + // resolution displayed for the source + displayWidth: 640, + displayHeight: 480, + } + ////////////////////////////////////////////////////////////////////////////// + // setParameters + ////////////////////////////////////////////////////////////////////////////// + setParameters(parameters) + function setParameters(parameters){ + if( parameters === undefined ) return + for( var key in parameters ){ + var newValue = parameters[ key ] + + if( newValue === undefined ){ + console.warn( "THREEx.ArToolkitSource: '" + key + "' parameter is undefined." ) + continue + } + + var currentValue = _this.parameters[ key ] + + if( currentValue === undefined ){ + console.warn( "THREEx.ArToolkitSource: '" + key + "' is not a property of this material." ) + continue + } + + _this.parameters[ key ] = newValue + } + } +} + +////////////////////////////////////////////////////////////////////////////// +// Code Separator +////////////////////////////////////////////////////////////////////////////// +ARjs.Source.prototype.init = function(onReady, onError){ + var _this = this + + if( this.parameters.sourceType === 'image' ){ + var domElement = this._initSourceImage(onSourceReady, onError) + }else if( this.parameters.sourceType === 'video' ){ + var domElement = this._initSourceVideo(onSourceReady, onError) + }else if( this.parameters.sourceType === 'webcam' ){ + // var domElement = this._initSourceWebcamOld(onSourceReady) + var domElement = this._initSourceWebcam(onSourceReady, onError) + }else{ + console.assert(false) + } + + // attach + this.domElement = domElement + this.domElement.style.position = 'absolute' + this.domElement.style.top = '0px' + this.domElement.style.left = '0px' + this.domElement.style.zIndex = '-2' + + return this + function onSourceReady(){ + document.body.appendChild(_this.domElement); + + _this.ready = true + + onReady && onReady() + } +} + +//////////////////////////////////////////////////////////////////////////////// +// init image source +//////////////////////////////////////////////////////////////////////////////// + + +ARjs.Source.prototype._initSourceImage = function(onReady) { + // TODO make it static + var domElement = document.createElement('img') + domElement.src = this.parameters.sourceUrl + + domElement.width = this.parameters.sourceWidth + domElement.height = this.parameters.sourceHeight + domElement.style.width = this.parameters.displayWidth+'px' + domElement.style.height = this.parameters.displayHeight+'px' + + // wait until the video stream is ready + var interval = setInterval(function() { + if (!domElement.naturalWidth) return; + onReady() + clearInterval(interval) + }, 1000/50); + + return domElement +} + +//////////////////////////////////////////////////////////////////////////////// +// init video source +//////////////////////////////////////////////////////////////////////////////// + + +ARjs.Source.prototype._initSourceVideo = function(onReady) { + // TODO make it static + var domElement = document.createElement('video'); + domElement.src = this.parameters.sourceUrl + + domElement.style.objectFit = 'initial' + + domElement.autoplay = true; + domElement.webkitPlaysinline = true; + domElement.controls = false; + domElement.loop = true; + domElement.muted = true + + // trick to trigger the video on android + document.body.addEventListener('click', function onClick(){ + document.body.removeEventListener('click', onClick); + domElement.play() + }) + + domElement.width = this.parameters.sourceWidth + domElement.height = this.parameters.sourceHeight + domElement.style.width = this.parameters.displayWidth+'px' + domElement.style.height = this.parameters.displayHeight+'px' + + // wait until the video stream is ready + var interval = setInterval(function() { + if (!domElement.videoWidth) return; + onReady() + clearInterval(interval) + }, 1000/50); + return domElement +} + +//////////////////////////////////////////////////////////////////////////////// +// handle webcam source +//////////////////////////////////////////////////////////////////////////////// + +ARjs.Source.prototype._initSourceWebcam = function(onReady, onError) { + var _this = this + + // init default value + onError = onError || function(error){ + alert('Webcam Error\nName: '+error.name + '\nMessage: '+error.message) + } + + var domElement = document.createElement('video'); + domElement.setAttribute('autoplay', ''); + domElement.setAttribute('muted', ''); + domElement.setAttribute('playsinline', ''); + domElement.style.width = this.parameters.displayWidth+'px' + domElement.style.height = this.parameters.displayHeight+'px' + + // check API is available + if (navigator.mediaDevices === undefined + || navigator.mediaDevices.enumerateDevices === undefined + || navigator.mediaDevices.getUserMedia === undefined ){ + if( navigator.mediaDevices === undefined ) var fctName = 'navigator.mediaDevices' + else if( navigator.mediaDevices.enumerateDevices === undefined ) var fctName = 'navigator.mediaDevices.enumerateDevices' + else if( navigator.mediaDevices.getUserMedia === undefined ) var fctName = 'navigator.mediaDevices.getUserMedia' + else console.assert(false) + onError({ + name: '', + message: 'WebRTC issue-! '+fctName+' not present in your browser' + }) + return null + } + + // get available devices + navigator.mediaDevices.enumerateDevices().then(function(devices) { + var userMediaConstraints = { + audio: false, + video: { + facingMode: 'environment', + width: { + ideal: _this.parameters.sourceWidth, + // min: 1024, + // max: 1920 + }, + height: { + ideal: _this.parameters.sourceHeight, + // min: 776, + // max: 1080 + } + } + } + // get a device which satisfy the constraints + navigator.mediaDevices.getUserMedia(userMediaConstraints).then(function success(stream) { + // set the .src of the domElement + domElement.srcObject = stream; + // to start the video, when it is possible to start it only on userevent. like in android + document.body.addEventListener('click', function(){ + domElement.play(); + }) + // domElement.play(); + +// TODO listen to loadedmetadata instead + // wait until the video stream is ready + var interval = setInterval(function() { + if (!domElement.videoWidth) return; + onReady() + clearInterval(interval) + }, 1000/50); + }).catch(function(error) { + onError({ + name: error.name, + message: error.message + }); + }); + }).catch(function(error) { + onError({ + message: error.message + }); + }); + + return domElement +} + +////////////////////////////////////////////////////////////////////////////// +// Handle Mobile Torch +////////////////////////////////////////////////////////////////////////////// +ARjs.Source.prototype.hasMobileTorch = function(){ + var stream = arToolkitSource.domElement.srcObject + if( stream instanceof MediaStream === false ) return false + + if( this._currentTorchStatus === undefined ){ + this._currentTorchStatus = false + } + + var videoTrack = stream.getVideoTracks()[0]; + + // if videoTrack.getCapabilities() doesnt exist, return false now + if( videoTrack.getCapabilities === undefined ) return false + + var capabilities = videoTrack.getCapabilities() + + return capabilities.torch ? true : false +} + +/** + * toggle the flash/torch of the mobile fun if applicable. + * Great post about it https://www.oberhofer.co/mediastreamtrack-and-its-capabilities/ + */ +ARjs.Source.prototype.toggleMobileTorch = function(){ + // sanity check + console.assert(this.hasMobileTorch() === true) + + var stream = arToolkitSource.domElement.srcObject + if( stream instanceof MediaStream === false ){ + alert('enabling mobile torch is available only on webcam') + return + } + + if( this._currentTorchStatus === undefined ){ + this._currentTorchStatus = false + } + + var videoTrack = stream.getVideoTracks()[0]; + var capabilities = videoTrack.getCapabilities() + + if( !capabilities.torch ){ + alert('no mobile torch is available on your camera') + return + } + + this._currentTorchStatus = this._currentTorchStatus === false ? true : false + videoTrack.applyConstraints({ + advanced: [{ + torch: this._currentTorchStatus + }] + }).catch(function(error){ + console.log(error) + }); +} + +ARjs.Source.prototype.domElementWidth = function(){ + return parseInt(this.domElement.style.width) +} +ARjs.Source.prototype.domElementHeight = function(){ + return parseInt(this.domElement.style.height) +} + +//////////////////////////////////////////////////////////////////////////////// +// handle resize +//////////////////////////////////////////////////////////////////////////////// + +ARjs.Source.prototype.onResizeElement = function(){ + var _this = this + var screenWidth = window.innerWidth + var screenHeight = window.innerHeight + + // sanity check + console.assert( arguments.length === 0 ) + + // compute sourceWidth, sourceHeight + if( this.domElement.nodeName === "IMG" ){ + var sourceWidth = this.domElement.naturalWidth + var sourceHeight = this.domElement.naturalHeight + }else if( this.domElement.nodeName === "VIDEO" ){ + var sourceWidth = this.domElement.videoWidth + var sourceHeight = this.domElement.videoHeight + }else{ + console.assert(false) + } + + // compute sourceAspect + var sourceAspect = sourceWidth / sourceHeight + // compute screenAspect + var screenAspect = screenWidth / screenHeight + + // if screenAspect < sourceAspect, then change the width, else change the height + if( screenAspect < sourceAspect ){ + // compute newWidth and set .width/.marginLeft + var newWidth = sourceAspect * screenHeight + this.domElement.style.width = newWidth+'px' + this.domElement.style.marginLeft = -(newWidth-screenWidth)/2+'px' + + // init style.height/.marginTop to normal value + this.domElement.style.height = screenHeight+'px' + this.domElement.style.marginTop = '0px' + }else{ + // compute newHeight and set .height/.marginTop + var newHeight = 1 / (sourceAspect / screenWidth) + this.domElement.style.height = newHeight+'px' + this.domElement.style.marginTop = -(newHeight-screenHeight)/2+'px' + + // init style.width/.marginLeft to normal value + this.domElement.style.width = screenWidth+'px' + this.domElement.style.marginLeft = '0px' + } +} +/* +ARjs.Source.prototype.copyElementSizeTo = function(otherElement){ + otherElement.style.width = this.domElement.style.width + otherElement.style.height = this.domElement.style.height + otherElement.style.marginLeft = this.domElement.style.marginLeft + otherElement.style.marginTop = this.domElement.style.marginTop +} +*/ + +ARjs.Source.prototype.copyElementSizeTo = function(otherElement){ + + if (window.innerWidth > window.innerHeight) + { + //landscape + otherElement.style.width = this.domElement.style.width + otherElement.style.height = this.domElement.style.height + otherElement.style.marginLeft = this.domElement.style.marginLeft + otherElement.style.marginTop = this.domElement.style.marginTop + } + else { + //portrait + otherElement.style.height = this.domElement.style.height + otherElement.style.width = (parseInt(otherElement.style.height) * 4/3)+"px"; + otherElement.style.marginLeft = ((window.innerWidth- parseInt(otherElement.style.width))/2)+"px"; + otherElement.style.marginTop = 0; + } + +} + +////////////////////////////////////////////////////////////////////////////// +// Code Separator +////////////////////////////////////////////////////////////////////////////// + +ARjs.Source.prototype.copySizeTo = function(){ + console.warn('obsolete function arToolkitSource.copySizeTo. Use arToolkitSource.copyElementSizeTo' ) + this.copyElementSizeTo.apply(this, arguments) +} + +////////////////////////////////////////////////////////////////////////////// +// Code Separator +////////////////////////////////////////////////////////////////////////////// + +ARjs.Source.prototype.onResize = function(arToolkitContext, renderer, camera){ + if( arguments.length !== 3 ){ + console.warn('obsolete function arToolkitSource.onResize. Use arToolkitSource.onResizeElement' ) + return this.onResizeElement.apply(this, arguments) + } + + var trackingBackend = arToolkitContext.parameters.trackingBackend + + + // RESIZE DOMELEMENT + if( trackingBackend === 'artoolkit' ){ + + this.onResizeElement() + + var isAframe = renderer.domElement.dataset.aframeCanvas ? true : false + if( isAframe === false ){ + this.copyElementSizeTo(renderer.domElement) + }else{ + + } + + if( arToolkitContext.arController !== null ){ + this.copyElementSizeTo(arToolkitContext.arController.canvas) + } + }else if( trackingBackend === 'aruco' ){ + this.onResizeElement() + this.copyElementSizeTo(renderer.domElement) + + this.copyElementSizeTo(arToolkitContext.arucoContext.canvas) + }else if( trackingBackend === 'tango' ){ + renderer.setSize( window.innerWidth, window.innerHeight ) + }else console.assert(false, 'unhandled trackingBackend '+trackingBackend) + + + // UPDATE CAMERA + if( trackingBackend === 'artoolkit' ){ + if( arToolkitContext.arController !== null ){ + camera.projectionMatrix.copy( arToolkitContext.getProjectionMatrix() ); + } + }else if( trackingBackend === 'aruco' ){ + camera.aspect = renderer.domElement.width / renderer.domElement.height; + camera.updateProjectionMatrix(); + }else if( trackingBackend === 'tango' ){ + var vrDisplay = arToolkitContext._tangoContext.vrDisplay + // make camera fit vrDisplay + if( vrDisplay && vrDisplay.displayName === "Tango VR Device" ) THREE.WebAR.resizeVRSeeThroughCamera(vrDisplay, camera) + }else console.assert(false, 'unhandled trackingBackend '+trackingBackend) +} diff --git a/1_Three.js/assets/cubemap/cubemaps_skybox.png b/1_Three.js/assets/cubemap/cubemaps_skybox.png new file mode 100644 index 0000000000000000000000000000000000000000..f15aef2238c60858669eef597e5b22ed1ecf4cdd Binary files /dev/null and b/1_Three.js/assets/cubemap/cubemaps_skybox.png differ diff --git a/1_Three.js/assets/cubemap/link.txt b/1_Three.js/assets/cubemap/link.txt new file mode 100755 index 0000000000000000000000000000000000000000..4b4b9c27cf139031b64b48645b74d02f556cf59d --- /dev/null +++ b/1_Three.js/assets/cubemap/link.txt @@ -0,0 +1 @@ +https://github.com/mrdoob/three.js/tree/dev/examples/textures/cube/SwedishRoyalCastle \ No newline at end of file diff --git a/1_Three.js/assets/cubemap/nx.jpg b/1_Three.js/assets/cubemap/nx.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f527be5bf00d7a355a014960a31593485263fd01 Binary files /dev/null and b/1_Three.js/assets/cubemap/nx.jpg differ diff --git a/1_Three.js/assets/cubemap/ny.jpg b/1_Three.js/assets/cubemap/ny.jpg new file mode 100644 index 0000000000000000000000000000000000000000..30a7e82e709b41da5e8c28d34a613f12869e0a21 Binary files /dev/null and b/1_Three.js/assets/cubemap/ny.jpg differ diff --git a/1_Three.js/assets/cubemap/nz.jpg b/1_Three.js/assets/cubemap/nz.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dc131f35faee4d63f2b5a12285a49e22214f6bee Binary files /dev/null and b/1_Three.js/assets/cubemap/nz.jpg differ diff --git a/1_Three.js/assets/cubemap/px.jpg b/1_Three.js/assets/cubemap/px.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7b58481146d960c2e44d0a8531dc5a3fa7109277 Binary files /dev/null and b/1_Three.js/assets/cubemap/px.jpg differ diff --git a/1_Three.js/assets/cubemap/py.jpg b/1_Three.js/assets/cubemap/py.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9a285e81699a9c21b7354a3cb330b54338728e0e Binary files /dev/null and b/1_Three.js/assets/cubemap/py.jpg differ diff --git a/1_Three.js/assets/cubemap/pz.jpg b/1_Three.js/assets/cubemap/pz.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7dad62af679076e1008588520c570992851183cd Binary files /dev/null and b/1_Three.js/assets/cubemap/pz.jpg differ diff --git a/1_Three.js/assets/models/head/Face_Color.jpg b/1_Three.js/assets/models/head/Face_Color.jpg new file mode 100755 index 0000000000000000000000000000000000000000..70ec8a465730ba2d074c56799146a4dcc89165f1 Binary files /dev/null and b/1_Three.js/assets/models/head/Face_Color.jpg differ diff --git a/1_Three.js/assets/models/head/Face_Disp.jpg b/1_Three.js/assets/models/head/Face_Disp.jpg new file mode 100755 index 0000000000000000000000000000000000000000..993a9b87a20fe57a5e1e60af42eea31fc7e50c5b Binary files /dev/null and b/1_Three.js/assets/models/head/Face_Disp.jpg differ diff --git a/1_Three.js/assets/models/head/lee-perry-smith-head-scan.mtl b/1_Three.js/assets/models/head/lee-perry-smith-head-scan.mtl new file mode 100755 index 0000000000000000000000000000000000000000..1a0de12597dc89b6fbafcbd15204dad4ef0bc705 --- /dev/null +++ b/1_Three.js/assets/models/head/lee-perry-smith-head-scan.mtl @@ -0,0 +1,22 @@ +# Blender MTL File: 'None' +# Material Count: 2 + +newmtl 505050 +Ns 96.078431 +Ka 0.000000 0.000000 0.000000 +Kd 0.313726 0.313726 0.313726 +Ks 0.001176 0.001176 0.001176 +Ni 1.000000 +d 1.000000 +illum 2 + +newmtl Skin1 +Ns 96.078431 +Ka 0.000000 0.000000 0.000000 +Kd 0.639216 0.639216 0.639216 +Ks 0.005882 0.005882 0.005882 +Ni 1.000000 +d 1.000000 +illum 2 +map_Bump Face_Disp.jpg +map_Kd Face_Color.jpg diff --git a/1_Three.js/assets/models/head/lee-perry-smith-head-scan.obj b/1_Three.js/assets/models/head/lee-perry-smith-head-scan.obj new file mode 100755 index 0000000000000000000000000000000000000000..f02862bb9fdc4e134c53e939013047e25547a2b0 --- /dev/null +++ b/1_Three.js/assets/models/head/lee-perry-smith-head-scan.obj @@ -0,0 +1,44795 @@ +# Blender v2.74 (sub 0) OBJ File: '' +# www.blender.org +mtllib lee-perry-smith-head-scan.mtl +o Infinite +v 0.056212 0.192391 -0.120891 +v 0.054796 0.201964 -0.120129 +v 0.057483 0.198825 -0.114361 +v 0.059137 0.188425 -0.114325 +v 0.054249 0.208305 -0.119242 +v 0.056311 0.208029 -0.114865 +v 0.059255 0.206553 -0.108901 +v 0.059947 0.195822 -0.108371 +v 0.061388 0.184136 -0.107815 +v 0.060181 0.396568 -0.041739 +v 0.059233 0.400791 -0.048815 +v 0.053556 0.403726 -0.042434 +v 0.053565 0.399726 -0.034485 +v 0.058391 0.403625 -0.054107 +v 0.054468 0.406425 -0.051772 +v 0.048913 0.409747 -0.049063 +v 0.047686 0.406609 -0.038166 +v 0.047332 0.402545 -0.029277 +v 0.049131 0.411565 -0.113644 +v 0.041841 0.417866 -0.103177 +v 0.044601 0.417803 -0.090235 +v 0.051898 0.412577 -0.094216 +v 0.037662 0.421189 -0.096611 +v 0.037926 0.421991 -0.086542 +v 0.037921 0.421290 -0.072962 +v 0.045096 0.417032 -0.075681 +v 0.052111 0.412312 -0.078088 +v 0.056703 0.407363 -0.063933 +v 0.050767 0.411582 -0.062664 +v 0.061726 0.402993 -0.063174 +v 0.065274 0.401037 -0.077394 +v 0.058923 0.406974 -0.078887 +v 0.059892 0.406132 -0.095173 +v 0.067495 0.398517 -0.093607 +v 0.067932 0.395746 -0.109941 +v 0.059746 0.403994 -0.112260 +v 0.036123 0.415973 -0.044123 +v 0.042770 0.412974 -0.046475 +v 0.044201 0.415417 -0.060629 +v 0.037221 0.418997 -0.058453 +v 0.020196 0.420939 -0.040461 +v 0.028741 0.418566 -0.042140 +v 0.029535 0.422078 -0.056571 +v 0.020610 0.424722 -0.054942 +v 0.030035 0.424664 -0.071097 +v 0.020976 0.427317 -0.070064 +v -0.001212 0.423251 -0.038748 +v 0.010034 0.422717 -0.039223 +v 0.010089 0.426540 -0.053608 +v -0.001385 0.426957 -0.052901 +v 0.010449 0.429121 -0.069598 +v -0.001026 0.429624 -0.069646 +v -0.001447 0.413610 -0.014261 +v -0.001576 0.407791 -0.005014 +v 0.009310 0.407392 -0.005691 +v 0.009498 0.413086 -0.014789 +v -0.001659 0.401587 0.003120 +v 0.009257 0.401390 0.002466 +v 0.019088 0.400258 0.000473 +v 0.019122 0.406278 -0.007492 +v 0.019288 0.411637 -0.016493 +v 0.009793 0.418374 -0.025917 +v -0.001283 0.418839 -0.025597 +v 0.019701 0.416659 -0.027342 +v 0.066310 0.240495 -0.078847 +v 0.066906 0.248584 -0.078376 +v 0.066282 0.248946 -0.071118 +v 0.065420 0.241223 -0.071328 +v 0.069164 0.256514 -0.076706 +v 0.067508 0.255187 -0.070131 +v 0.067569 0.255098 -0.064706 +v 0.066611 0.249792 -0.064953 +v 0.065982 0.242611 -0.064622 +v 0.064607 0.194976 -0.081781 +v 0.065076 0.198089 -0.088931 +v 0.065635 0.210826 -0.088288 +v 0.064894 0.209029 -0.080791 +v 0.064123 0.201196 -0.095757 +v 0.064478 0.212893 -0.095525 +v 0.065222 0.223491 -0.095221 +v 0.066137 0.222232 -0.087527 +v 0.065167 0.221650 -0.079808 +v 0.062041 0.204140 -0.102420 +v 0.062202 0.214991 -0.102752 +v 0.058468 0.216549 -0.109859 +v 0.058209 0.226052 -0.111133 +v 0.062653 0.224977 -0.103153 +v 0.063589 0.234114 -0.103680 +v 0.066277 0.232881 -0.095115 +v 0.058605 0.235220 -0.112418 +v 0.060186 0.243692 -0.113804 +v 0.064835 0.242448 -0.104237 +v 0.067285 0.241204 -0.095031 +v 0.066970 0.231983 -0.086993 +v 0.065710 0.231880 -0.079213 +v 0.067730 0.240459 -0.086593 +v 0.058294 0.188263 -0.067711 +v 0.062308 0.191777 -0.074407 +v 0.062409 0.207593 -0.073230 +v 0.059051 0.205350 -0.066104 +v 0.063393 0.221953 -0.071855 +v 0.061173 0.222777 -0.062747 +v 0.064610 0.232680 -0.071386 +v 0.064621 0.234406 -0.063913 +v 0.068511 0.248235 -0.086181 +v 0.070114 0.255726 -0.085228 +v 0.068363 0.248877 -0.094892 +v 0.070357 0.257826 -0.094291 +v 0.066222 0.250226 -0.104751 +v 0.062408 0.251473 -0.115140 +v 0.065041 0.258868 -0.116868 +v 0.068112 0.257924 -0.105878 +v 0.067653 0.266408 -0.119191 +v 0.070473 0.266527 -0.108380 +v 0.070293 0.274593 -0.121809 +v 0.072844 0.275292 -0.111203 +v 0.074708 0.276022 -0.101195 +v 0.072471 0.267443 -0.098384 +v 0.076366 0.296033 -0.126707 +v 0.073176 0.284115 -0.124382 +v 0.068814 0.282985 -0.135923 +v 0.071961 0.296068 -0.139696 +v 0.065692 0.273378 -0.132529 +v 0.058805 0.271886 -0.142865 +v 0.061934 0.281166 -0.146819 +v 0.065141 0.293924 -0.151392 +v 0.078462 0.292466 -0.104464 +v 0.076701 0.284093 -0.103345 +v 0.075284 0.284262 -0.113417 +v 0.077866 0.294218 -0.114576 +v 0.080919 0.310423 -0.100217 +v 0.079784 0.301401 -0.103771 +v 0.080138 0.305670 -0.114134 +v 0.082254 0.317105 -0.110362 +v 0.079611 0.310845 -0.127804 +v 0.082339 0.329509 -0.125579 +v 0.076463 0.364413 -0.135101 +v 0.079520 0.369529 -0.119649 +v 0.083128 0.354495 -0.115385 +v 0.080059 0.349076 -0.131344 +v 0.080870 0.374024 -0.103245 +v 0.084135 0.359896 -0.099243 +v 0.084522 0.345731 -0.094795 +v 0.084591 0.338972 -0.109540 +v 0.060237 0.391087 -0.034233 +v 0.067188 0.386611 -0.042990 +v 0.067048 0.392263 -0.051966 +v 0.059639 0.384740 -0.026602 +v 0.065906 0.379715 -0.034310 +v 0.071813 0.373358 -0.042515 +v 0.073230 0.380304 -0.051628 +v 0.074962 0.384619 -0.065829 +v 0.079857 0.370965 -0.066755 +v 0.082721 0.365913 -0.082451 +v 0.079540 0.379164 -0.085797 +v 0.079793 0.355392 -0.063271 +v 0.082822 0.351683 -0.079618 +v 0.074233 0.389881 -0.090088 +v 0.075105 0.386127 -0.106830 +v 0.070570 0.394077 -0.073217 +v 0.065069 0.397886 -0.059007 +v 0.077015 0.373316 -0.056482 +v 0.076464 0.365588 -0.051298 +v 0.067587 0.325695 -0.156256 +v 0.066818 0.341689 -0.158014 +v 0.074283 0.345032 -0.145908 +v 0.075568 0.328519 -0.143481 +v 0.064575 0.356013 -0.158918 +v 0.071215 0.359738 -0.148184 +v 0.049680 0.316915 -0.173477 +v 0.049424 0.333715 -0.174949 +v 0.058527 0.337802 -0.167669 +v 0.059043 0.321511 -0.166068 +v 0.048931 0.349696 -0.174855 +v 0.057216 0.352746 -0.167766 +v 0.027861 0.346017 -0.184885 +v 0.039271 0.347319 -0.180496 +v 0.039315 0.330462 -0.180657 +v 0.027629 0.328625 -0.185143 +v 0.039155 0.313366 -0.179244 +v 0.027049 0.311447 -0.183595 +v 0.027313 0.416200 -0.129887 +v 0.028256 0.409734 -0.143265 +v 0.015307 0.411129 -0.146546 +v 0.014682 0.417296 -0.133547 +v 0.028681 0.400982 -0.155543 +v 0.015739 0.402691 -0.158459 +v 0.001302 0.402871 -0.159029 +v 0.001074 0.411271 -0.147518 +v 0.000923 0.417763 -0.135005 +v 0.000579 0.427068 -0.106459 +v 0.012887 0.426673 -0.105073 +v 0.013910 0.422500 -0.120094 +v 0.000860 0.422970 -0.121691 +v 0.023799 0.425293 -0.102600 +v 0.025688 0.421202 -0.116643 +v 0.011583 0.429290 -0.087681 +v -0.000116 0.429750 -0.088559 +v 0.022160 0.427761 -0.086539 +v 0.030799 0.425201 -0.085737 +v 0.032301 0.423090 -0.099526 +v 0.035158 0.419170 -0.111498 +v 0.038294 0.414299 -0.123832 +v 0.028133 0.377142 -0.175096 +v 0.038864 0.376439 -0.171093 +v 0.038936 0.362646 -0.177214 +v 0.027858 0.362328 -0.181416 +v 0.047473 0.375884 -0.166247 +v 0.047969 0.363685 -0.171996 +v 0.048717 0.395705 -0.146163 +v 0.047985 0.386596 -0.157544 +v 0.039167 0.388462 -0.161983 +v 0.039478 0.398719 -0.150792 +v 0.028558 0.390146 -0.166314 +v 0.054413 0.375126 -0.161212 +v 0.055433 0.365068 -0.165797 +v 0.058984 0.373954 -0.157200 +v 0.061608 0.367149 -0.158470 +v 0.066580 0.390835 -0.125895 +v 0.058658 0.398468 -0.128767 +v 0.064100 0.384693 -0.139572 +v 0.056902 0.391184 -0.142427 +v 0.049572 0.404131 -0.132390 +v 0.070858 0.376109 -0.137558 +v 0.073807 0.381553 -0.122996 +v 0.066687 0.371045 -0.149291 +v 0.061308 0.378753 -0.150403 +v 0.055174 0.383504 -0.153319 +v 0.039498 0.407459 -0.137844 +v 0.015698 0.391561 -0.168808 +v 0.015277 0.378137 -0.177540 +v 0.000982 0.378781 -0.178084 +v 0.001305 0.391870 -0.169044 +v 0.014884 0.362660 -0.184104 +v 0.014697 0.345631 -0.187466 +v 0.001070 0.345726 -0.188484 +v 0.000807 0.363122 -0.185048 +v 0.024125 0.283815 -0.175667 +v 0.012278 0.283072 -0.177965 +v 0.013450 0.295315 -0.183129 +v 0.026019 0.296013 -0.180463 +v 0.000248 0.282508 -0.178105 +v 0.000574 0.294680 -0.183874 +v 0.001142 0.310451 -0.187395 +v 0.014046 0.310703 -0.186327 +v 0.014594 0.327917 -0.188213 +v 0.001473 0.327919 -0.189156 +v 0.046265 0.286763 -0.166466 +v 0.035536 0.284682 -0.172056 +v 0.038101 0.297342 -0.176598 +v 0.049429 0.300330 -0.171416 +v 0.056246 0.290297 -0.159919 +v 0.058931 0.305054 -0.164111 +v 0.067129 0.309542 -0.154483 +v 0.074821 0.311839 -0.142293 +v 0.050729 0.269939 -0.152456 +v 0.053859 0.278346 -0.156180 +v 0.041512 0.268199 -0.159941 +v 0.044027 0.276070 -0.163342 +v 0.194230 0.104410 -0.124629 +v 0.185069 0.109065 -0.116826 +v 0.190163 0.105195 -0.108777 +v 0.200839 0.099705 -0.108293 +v 0.179562 0.110221 -0.114718 +v 0.181172 0.108677 -0.108961 +v 0.181208 0.105962 -0.104418 +v 0.187165 0.102058 -0.101240 +v 0.197281 0.092818 -0.094534 +v 0.172827 0.106897 -0.103144 +v 0.177014 0.101548 -0.097442 +v 0.159736 0.107560 -0.101473 +v 0.162858 0.102124 -0.095232 +v 0.165708 0.095104 -0.088691 +v 0.181175 0.093655 -0.090867 +v 0.112419 0.079284 -0.058111 +v 0.125728 0.079878 -0.064059 +v 0.122646 0.088438 -0.070558 +v 0.109064 0.088123 -0.064670 +v 0.138866 0.079717 -0.069429 +v 0.136851 0.088734 -0.075701 +v 0.134084 0.095519 -0.082913 +v 0.119352 0.094416 -0.078163 +v 0.105679 0.094415 -0.072398 +v 0.151748 0.087836 -0.079567 +v 0.149840 0.095959 -0.086122 +v 0.152418 0.078070 -0.073277 +v 0.166431 0.075211 -0.075378 +v 0.166965 0.085778 -0.082274 +v 0.183472 0.046911 -0.059616 +v 0.194499 0.042903 -0.060855 +v 0.201016 0.052012 -0.066628 +v 0.189461 0.056701 -0.066735 +v 0.203510 0.037349 -0.067269 +v 0.211132 0.045687 -0.071201 +v 0.217739 0.055266 -0.077009 +v 0.206686 0.062186 -0.073815 +v 0.194232 0.067507 -0.074557 +v 0.159609 0.054682 -0.058114 +v 0.148877 0.059174 -0.058011 +v 0.141712 0.051744 -0.049839 +v 0.152323 0.044952 -0.049238 +v 0.141165 0.062909 -0.058191 +v 0.133860 0.059935 -0.052974 +v 0.122353 0.056970 -0.046216 +v 0.130182 0.045979 -0.041937 +v 0.140312 0.031976 -0.044656 +v 0.171794 0.026728 -0.056836 +v 0.177316 0.037193 -0.054079 +v 0.165038 0.040368 -0.051329 +v 0.158486 0.028355 -0.051798 +v 0.171555 0.050542 -0.058877 +v 0.164156 0.064754 -0.067077 +v 0.176980 0.060874 -0.067208 +v 0.180635 0.071756 -0.075544 +v 0.182511 0.025857 -0.061484 +v 0.188036 0.033982 -0.057430 +v 0.189636 0.025909 -0.066321 +v 0.195823 0.030302 -0.065325 +v 0.210846 0.073526 -0.082419 +v 0.197064 0.079515 -0.083091 +v 0.222312 0.065730 -0.085078 +v 0.225260 0.075450 -0.095418 +v 0.213528 0.084416 -0.093483 +v 0.182205 0.083067 -0.083475 +v 0.140279 0.070051 -0.063360 +v 0.151847 0.068109 -0.066036 +v 0.128957 0.069617 -0.058267 +v 0.116565 0.068377 -0.052046 +v 0.114058 0.042860 -0.035291 +v 0.118172 0.028730 -0.040534 +v 0.107844 0.055575 -0.039894 +v 0.091056 0.055341 -0.036171 +v 0.095569 0.042134 -0.030919 +v 0.098207 0.028289 -0.036483 +v 0.102372 0.067590 -0.046636 +v 0.098310 0.078755 -0.053146 +v 0.083314 0.078672 -0.050282 +v 0.086630 0.067457 -0.043765 +v 0.092410 0.094278 -0.067586 +v 0.095281 0.087772 -0.059873 +v 0.079594 0.093859 -0.064408 +v 0.081306 0.087519 -0.057020 +v 0.068663 0.157882 -0.105651 +v 0.067882 0.152308 -0.098478 +v 0.073234 0.138731 -0.097041 +v 0.075661 0.143774 -0.104883 +v 0.066570 0.147888 -0.091856 +v 0.069760 0.135568 -0.090492 +v 0.072276 0.123916 -0.088964 +v 0.078064 0.125045 -0.095419 +v 0.086577 0.127456 -0.104544 +v 0.067522 0.089260 -0.055363 +v 0.068133 0.080135 -0.048877 +v 0.067486 0.094786 -0.062652 +v 0.056567 0.098884 -0.063873 +v 0.055170 0.093755 -0.056043 +v 0.051851 0.085745 -0.047904 +v 0.075915 0.098229 -0.203247 +v 0.070179 0.120360 -0.191845 +v 0.084670 0.119814 -0.188043 +v 0.092517 0.097042 -0.201866 +v 0.065657 0.133897 -0.183425 +v 0.073866 0.137272 -0.176455 +v 0.089837 0.139467 -0.162474 +v 0.102360 0.117707 -0.183809 +v 0.110835 0.094796 -0.200651 +v 0.038779 0.145954 -0.182769 +v 0.029632 0.167534 -0.171261 +v 0.034675 0.174188 -0.163795 +v 0.044978 0.161295 -0.168259 +v 0.025174 0.177950 -0.166371 +v 0.027336 0.185447 -0.161749 +v 0.031497 0.197728 -0.154068 +v 0.039688 0.181772 -0.154751 +v 0.049648 0.168391 -0.156610 +v 0.047192 0.198277 -0.135257 +v 0.050788 0.186480 -0.136584 +v 0.045431 0.185773 -0.145426 +v 0.040696 0.199034 -0.144169 +v 0.056911 0.175084 -0.137630 +v 0.053399 0.173079 -0.146520 +v 0.064469 0.169905 -0.121592 +v 0.059265 0.181449 -0.121276 +v 0.062204 0.176738 -0.113913 +v 0.067383 0.164135 -0.113512 +v 0.063957 0.171392 -0.106734 +v 0.072500 0.157045 -0.139603 +v 0.076835 0.153772 -0.133205 +v 0.087929 0.145926 -0.138726 +v 0.077536 0.152202 -0.146753 +v 0.081823 0.147955 -0.124380 +v 0.094986 0.139632 -0.128263 +v 0.111836 0.133212 -0.131981 +v 0.103917 0.137846 -0.145187 +v 0.214455 0.091770 -0.107783 +v 0.212511 0.094730 -0.124315 +v 0.226412 0.082416 -0.108535 +v 0.225444 0.085383 -0.123804 +v 0.187638 0.096432 -0.161921 +v 0.191589 0.102077 -0.143622 +v 0.208907 0.092997 -0.142094 +v 0.204065 0.086945 -0.159890 +v 0.221987 0.083534 -0.140018 +v 0.217045 0.077647 -0.156094 +v 0.146373 0.114700 -0.164496 +v 0.146254 0.102832 -0.182281 +v 0.124236 0.110972 -0.182626 +v 0.121486 0.124881 -0.164465 +v 0.148487 0.085152 -0.198992 +v 0.129891 0.090666 -0.199821 +v 0.212020 0.068951 -0.171485 +v 0.199308 0.077662 -0.177100 +v 0.207346 0.057890 -0.184665 +v 0.195305 0.065279 -0.191962 +v 0.181241 0.072448 -0.195727 +v 0.183880 0.086452 -0.179865 +v 0.203822 0.045908 -0.193943 +v 0.193259 0.051098 -0.202508 +v 0.201461 0.035962 -0.197200 +v 0.193392 0.035707 -0.204474 +v 0.181594 0.036572 -0.209796 +v 0.180546 0.055549 -0.207315 +v 0.166737 0.059725 -0.210046 +v 0.165653 0.079056 -0.197824 +v 0.168765 0.038342 -0.213169 +v 0.154832 0.040413 -0.215459 +v 0.151653 0.063631 -0.211894 +v 0.166196 0.094748 -0.181445 +v 0.168378 0.105543 -0.163514 +v 0.149479 0.119784 -0.147837 +v 0.171635 0.111063 -0.146128 +v 0.153192 0.120333 -0.133697 +v 0.173663 0.113113 -0.131305 +v 0.097563 0.102112 -0.090722 +v 0.111909 0.103102 -0.094889 +v 0.107673 0.110716 -0.103012 +v 0.092422 0.111323 -0.098785 +v 0.127734 0.104903 -0.097887 +v 0.124491 0.111300 -0.104758 +v 0.121160 0.118949 -0.111808 +v 0.103702 0.121501 -0.109426 +v 0.130981 0.100160 -0.090499 +v 0.115793 0.098704 -0.086306 +v 0.101983 0.098498 -0.080946 +v 0.144163 0.106901 -0.099740 +v 0.147057 0.101849 -0.093083 +v 0.170818 0.110848 -0.108650 +v 0.157522 0.112153 -0.107627 +v 0.170560 0.113392 -0.114452 +v 0.156161 0.115875 -0.114490 +v 0.172309 0.114016 -0.121312 +v 0.155162 0.118750 -0.122824 +v 0.141628 0.112084 -0.106284 +v 0.139166 0.117525 -0.113496 +v 0.136226 0.122803 -0.122445 +v 0.117282 0.126648 -0.120741 +v 0.131850 0.126965 -0.133830 +v 0.125774 0.128878 -0.147891 +v 0.100126 0.131820 -0.117832 +v 0.085645 0.139723 -0.114914 +v 0.072072 0.158562 -0.122249 +v 0.075104 0.151424 -0.113530 +v 0.052374 0.195903 -0.127756 +v 0.055469 0.184891 -0.128753 +v 0.060566 0.173768 -0.129514 +v 0.068176 0.163412 -0.130618 +v 0.065185 0.164596 -0.138918 +v 0.064668 0.161289 -0.148089 +v 0.064481 0.155932 -0.159280 +v 0.059105 0.149805 -0.171125 +v 0.054558 0.139853 -0.182651 +v 0.057102 0.122298 -0.193496 +v 0.046568 0.121945 -0.195318 +v 0.061764 0.098978 -0.204298 +v 0.050645 0.098629 -0.205368 +v 0.055425 0.046869 -0.217896 +v 0.053081 0.072637 -0.215063 +v 0.065164 0.072750 -0.214761 +v 0.068232 0.046876 -0.218561 +v 0.080282 0.072337 -0.214480 +v 0.083980 0.046464 -0.218969 +v 0.035294 0.098238 -0.206322 +v 0.035262 0.122678 -0.196224 +v 0.041189 0.115952 -0.198675 +v 0.042512 0.097368 -0.206422 +v 0.019793 0.045835 -0.216263 +v 0.019008 0.071810 -0.216080 +v 0.027635 0.071992 -0.215825 +v 0.028367 0.046025 -0.216228 +v 0.018531 0.098884 -0.206863 +v 0.027359 0.098947 -0.206550 +v 0.035687 0.072070 -0.215516 +v 0.036596 0.046267 -0.216460 +v 0.043696 0.072220 -0.215363 +v 0.045168 0.046586 -0.217092 +v 0.135118 0.066986 -0.213155 +v 0.139304 0.042391 -0.217251 +v 0.121791 0.044069 -0.218458 +v 0.117117 0.069570 -0.213951 +v 0.098187 0.071296 -0.214260 +v 0.102582 0.045463 -0.218989 +v 0.009812 0.071538 -0.216177 +v 0.009202 0.098573 -0.207004 +v 0.010706 0.045583 -0.216382 +v 0.001365 0.045498 -0.216468 +v 0.000445 0.071370 -0.216101 +v -0.000233 0.098318 -0.206871 +v 0.016268 0.148491 -0.185026 +v 0.017683 0.125504 -0.195942 +v 0.008443 0.125318 -0.195948 +v 0.007385 0.148607 -0.185182 +v -0.000712 0.125024 -0.195627 +v -0.001287 0.148502 -0.184955 +v 0.026874 0.125262 -0.195726 +v 0.025620 0.148125 -0.184408 +v 0.012185 0.180337 -0.167249 +v 0.019662 0.179379 -0.167009 +v 0.022251 0.165930 -0.174434 +v 0.014055 0.166371 -0.175381 +v 0.024523 0.102977 -0.056876 +v 0.022294 0.113217 -0.056634 +v 0.015075 0.111313 -0.057598 +v 0.017278 0.099919 -0.059025 +v 0.021184 0.123295 -0.054062 +v 0.013966 0.122293 -0.053152 +v 0.006141 0.121858 -0.053308 +v 0.007178 0.110056 -0.058425 +v 0.008440 0.097918 -0.060637 +v 0.036080 0.106662 -0.059266 +v 0.033582 0.115835 -0.057890 +v 0.028511 0.114520 -0.056455 +v 0.030826 0.104733 -0.057255 +v 0.033113 0.125132 -0.056611 +v 0.027451 0.124282 -0.055372 +v 0.035460 0.094514 -0.053765 +v 0.041729 0.096581 -0.056069 +v 0.027766 0.092970 -0.053340 +v 0.030467 0.083443 -0.046531 +v 0.040232 0.084995 -0.045357 +v 0.037304 0.117581 -0.059388 +v 0.038335 0.125346 -0.059020 +v 0.040184 0.111524 -0.061524 +v 0.044462 0.122291 -0.063035 +v 0.045518 0.101262 -0.061139 +v 0.049178 0.108582 -0.065214 +v 0.056532 0.158972 -0.070628 +v 0.060557 0.162739 -0.076244 +v 0.061669 0.176797 -0.075496 +v 0.057797 0.172955 -0.069133 +v 0.063326 0.166653 -0.082177 +v 0.064029 0.180701 -0.082307 +v 0.064440 0.166079 -0.099887 +v 0.063027 0.179602 -0.101215 +v 0.064100 0.175075 -0.094687 +v 0.064530 0.161265 -0.093331 +v 0.062287 0.192329 -0.102034 +v 0.064133 0.188506 -0.095541 +v 0.064394 0.170762 -0.088362 +v 0.064739 0.184604 -0.088984 +v 0.063142 0.140863 -0.080693 +v 0.065232 0.144294 -0.085915 +v 0.064331 0.157022 -0.087165 +v 0.062973 0.153129 -0.081398 +v 0.056370 0.132806 -0.071413 +v 0.060201 0.137094 -0.075941 +v 0.060073 0.149347 -0.076092 +v 0.055868 0.145513 -0.071211 +v 0.050880 0.141542 -0.066401 +v 0.051308 0.127931 -0.067181 +v 0.051699 0.155343 -0.065328 +v 0.046300 0.152117 -0.060391 +v 0.045323 0.138250 -0.061675 +v 0.064194 0.130764 -0.080552 +v 0.066823 0.133289 -0.085049 +v 0.065350 0.124209 -0.080788 +v 0.067980 0.123710 -0.083960 +v 0.081551 0.112099 -0.092309 +v 0.073520 0.112750 -0.086535 +v 0.074592 0.102840 -0.082050 +v 0.085056 0.101756 -0.086346 +v 0.077157 0.096247 -0.073547 +v 0.066182 0.098400 -0.071865 +v 0.066341 0.106058 -0.078392 +v 0.061103 0.112353 -0.074774 +v 0.058270 0.105334 -0.070422 +v 0.089271 0.097246 -0.076530 +v 0.067556 0.114727 -0.081854 +v 0.063798 0.119042 -0.078234 +v 0.061496 0.126685 -0.076425 +v 0.058117 0.121436 -0.072362 +v 0.053932 0.115472 -0.068384 +v 0.033594 0.147430 -0.053559 +v 0.033300 0.135814 -0.055165 +v 0.039458 0.136827 -0.057751 +v 0.039912 0.149647 -0.056877 +v 0.024176 0.181872 -0.019050 +v 0.020916 0.179151 -0.021893 +v 0.026020 0.180708 -0.026602 +v 0.031121 0.185611 -0.023778 +v 0.018084 0.177050 -0.023456 +v 0.019962 0.176518 -0.026309 +v 0.021299 0.173803 -0.031121 +v 0.028411 0.179349 -0.033603 +v 0.036776 0.189018 -0.034404 +v 0.003166 0.174637 -0.020239 +v 0.011803 0.175391 -0.021671 +v 0.012749 0.176734 -0.019133 +v 0.003153 0.175725 -0.017620 +v 0.014173 0.178034 -0.016923 +v 0.003171 0.176476 -0.015386 +v 0.012155 0.173659 -0.024481 +v 0.012772 0.170846 -0.027696 +v 0.003250 0.172729 -0.023158 +v 0.003415 0.169938 -0.025991 +v 0.021490 0.160591 -0.039587 +v 0.021581 0.151747 -0.042586 +v 0.028037 0.155317 -0.047390 +v 0.028728 0.165100 -0.044737 +v 0.021272 0.142490 -0.046419 +v 0.027612 0.144953 -0.050053 +v 0.034121 0.159107 -0.051932 +v 0.035220 0.170373 -0.049832 +v 0.047557 0.179960 -0.057816 +v 0.046843 0.165856 -0.059157 +v 0.052860 0.169267 -0.063500 +v 0.053521 0.184202 -0.061989 +v 0.051576 0.207811 -0.049628 +v 0.049453 0.194547 -0.054964 +v 0.054809 0.200488 -0.060081 +v 0.056335 0.214991 -0.056157 +v 0.040441 0.162584 -0.055623 +v 0.041359 0.175451 -0.054099 +v 0.036271 0.180632 -0.045071 +v 0.043210 0.188020 -0.050195 +v 0.045380 0.198999 -0.042863 +v 0.021513 0.168387 -0.036052 +v 0.029068 0.173622 -0.040542 +v 0.012916 0.165220 -0.031904 +v 0.003665 0.164344 -0.029802 +v 0.004043 0.156484 -0.033377 +v 0.013219 0.157422 -0.035202 +v 0.004433 0.148281 -0.037746 +v 0.013378 0.149322 -0.039319 +v 0.004927 0.140630 -0.043705 +v 0.013432 0.140930 -0.044076 +v 0.027282 0.134490 -0.052928 +v 0.021111 0.132908 -0.050115 +v 0.005452 0.131783 -0.048278 +v 0.013627 0.131893 -0.048251 +v 0.019275 0.090067 -0.054918 +v 0.009299 0.087603 -0.057056 +v 0.009659 0.078648 -0.052622 +v 0.020678 0.080735 -0.049460 +v 0.020967 0.071045 -0.043327 +v 0.031477 0.072826 -0.038489 +v 0.009496 0.069359 -0.047019 +v 0.008867 0.059502 -0.040076 +v 0.020319 0.059953 -0.037345 +v 0.031756 0.060182 -0.033567 +v 0.043134 0.072707 -0.037724 +v 0.055910 0.071207 -0.039787 +v 0.044287 0.059074 -0.033117 +v 0.058174 0.057563 -0.034126 +v 0.076978 0.043036 -0.029109 +v 0.078901 0.029464 -0.032545 +v 0.073903 0.056130 -0.034997 +v 0.059944 0.044522 -0.028346 +v 0.061018 0.031416 -0.030076 +v 0.070573 0.068613 -0.042320 +v 0.045005 0.046018 -0.028058 +v 0.045283 0.032459 -0.029725 +v 0.031319 0.047079 -0.029133 +v 0.031204 0.033712 -0.031354 +v 0.019180 0.047677 -0.031731 +v 0.018868 0.034419 -0.033546 +v 0.007981 0.047780 -0.033775 +v 0.007518 0.034653 -0.035144 +v 0.047377 0.391797 -0.014399 +v 0.053393 0.388592 -0.020018 +v 0.053636 0.394571 -0.027171 +v 0.047396 0.397541 -0.021610 +v 0.027568 0.409763 -0.018894 +v 0.028021 0.414503 -0.029368 +v 0.034626 0.407494 -0.021833 +v 0.035179 0.412133 -0.031806 +v 0.027447 0.398718 -0.002308 +v 0.027428 0.404551 -0.010161 +v 0.034708 0.396879 -0.005659 +v 0.034581 0.402492 -0.013394 +v 0.041065 0.405055 -0.025239 +v 0.041566 0.409371 -0.034766 +v 0.041283 0.394598 -0.009630 +v 0.041138 0.400171 -0.017127 +v 0.030098 0.229385 -0.149019 +v 0.021225 0.232846 -0.152731 +v 0.022430 0.242114 -0.153227 +v 0.031241 0.239217 -0.149474 +v 0.012495 0.236066 -0.152975 +v 0.013694 0.244996 -0.153465 +v 0.014915 0.250744 -0.155189 +v 0.023940 0.248430 -0.154601 +v 0.032821 0.246613 -0.150822 +v 0.052457 0.259026 -0.137641 +v 0.044571 0.258612 -0.146794 +v 0.047246 0.264101 -0.149150 +v 0.055457 0.265092 -0.139960 +v 0.036221 0.257886 -0.153765 +v 0.038693 0.262663 -0.156559 +v 0.059525 0.259125 -0.127372 +v 0.062607 0.265843 -0.129771 +v 0.054124 0.244503 -0.123330 +v 0.056691 0.252150 -0.125331 +v 0.047674 0.245072 -0.133293 +v 0.049865 0.252567 -0.135542 +v 0.040808 0.245780 -0.143323 +v 0.042482 0.252698 -0.144954 +v 0.034377 0.252684 -0.152034 +v 0.054595 0.216701 -0.116849 +v 0.051728 0.213877 -0.122735 +v 0.046799 0.223177 -0.129110 +v 0.052660 0.225942 -0.119282 +v 0.051112 0.206185 -0.126043 +v 0.045896 0.210459 -0.133207 +v 0.038891 0.213202 -0.142462 +v 0.038636 0.226443 -0.140837 +v 0.030259 0.215901 -0.150490 +v 0.052421 0.235726 -0.121295 +v 0.046319 0.235886 -0.131063 +v 0.039450 0.237229 -0.141555 +v 0.031092 0.267517 -0.164803 +v 0.033167 0.275014 -0.168131 +v 0.020350 0.267127 -0.167855 +v 0.022050 0.274563 -0.171149 +v 0.027023 0.257777 -0.158206 +v 0.028972 0.262103 -0.161333 +v 0.017349 0.257874 -0.160923 +v 0.018755 0.261761 -0.164342 +v 0.009709 0.266623 -0.169197 +v 0.010917 0.273866 -0.172987 +v -0.000567 0.266527 -0.168802 +v -0.000158 0.273547 -0.172749 +v 0.006467 0.251732 -0.154626 +v 0.007174 0.255292 -0.157644 +v 0.016084 0.254655 -0.157712 +v -0.001474 0.251173 -0.155018 +v -0.001263 0.254946 -0.157608 +v -0.001136 0.257866 -0.161210 +v 0.007860 0.258069 -0.161425 +v 0.008687 0.261589 -0.165261 +v -0.000886 0.261504 -0.164878 +v 0.025401 0.253428 -0.156040 +v 0.019548 0.191334 -0.161611 +v 0.020524 0.204567 -0.157124 +v 0.011406 0.193443 -0.161416 +v 0.011292 0.207332 -0.156989 +v 0.003487 0.208439 -0.157045 +v 0.003874 0.223966 -0.153901 +v 0.011551 0.222567 -0.153912 +v -0.003292 0.208590 -0.157956 +v -0.002940 0.223830 -0.154983 +v -0.002363 0.236913 -0.153941 +v 0.004743 0.237389 -0.152888 +v 0.020687 0.219531 -0.153963 +v -0.002746 0.180962 -0.167533 +v 0.004591 0.180797 -0.167382 +v 0.005859 0.166792 -0.175756 +v -0.002210 0.166879 -0.175715 +v 0.003833 0.194140 -0.161521 +v -0.003127 0.194192 -0.161892 +v 0.005630 0.246190 -0.152979 +v -0.001882 0.245597 -0.153695 +v 0.078299 0.327155 -0.067680 +v 0.079910 0.327713 -0.076566 +v 0.081639 0.338074 -0.077840 +v 0.079276 0.338625 -0.066554 +v 0.081429 0.324583 -0.085771 +v 0.083330 0.333432 -0.090111 +v 0.083789 0.326288 -0.101526 +v 0.081788 0.318512 -0.093916 +v -0.056336 0.204144 -0.106439 +v -0.053441 0.205815 -0.112280 +v -0.053964 0.196781 -0.111483 +v -0.056504 0.193751 -0.105602 +v -0.051183 0.206271 -0.116538 +v -0.051184 0.200005 -0.117209 +v -0.051904 0.190464 -0.117567 +v -0.054572 0.186574 -0.111001 +v -0.056740 0.182584 -0.104633 +v -0.050249 0.407764 -0.048868 +v -0.055287 0.404309 -0.051422 +v -0.055089 0.401603 -0.042970 +v -0.049770 0.404609 -0.038885 +v -0.058992 0.401588 -0.053455 +v -0.060186 0.398788 -0.048734 +v -0.061428 0.394422 -0.042391 +v -0.055634 0.397643 -0.035576 +v -0.049882 0.400515 -0.030514 +v -0.038965 0.419716 -0.073447 +v -0.038791 0.419548 -0.088303 +v -0.045470 0.415357 -0.090899 +v -0.045794 0.415455 -0.075005 +v -0.038312 0.418273 -0.098694 +v -0.042715 0.415012 -0.104687 +v -0.050233 0.407861 -0.114501 +v -0.052704 0.410121 -0.093713 +v -0.052322 0.410614 -0.076350 +v -0.064154 0.399047 -0.074439 +v -0.061358 0.400871 -0.061546 +v -0.056662 0.405384 -0.062332 +v -0.058436 0.405030 -0.076350 +v -0.051250 0.409782 -0.061383 +v -0.068498 0.392093 -0.107648 +v -0.066928 0.396384 -0.090286 +v -0.060119 0.403579 -0.093266 +v -0.060608 0.399798 -0.111678 +v -0.045319 0.413971 -0.059687 +v -0.044687 0.411264 -0.046203 +v -0.038548 0.414579 -0.043646 +v -0.038805 0.417724 -0.057777 +v -0.031499 0.421069 -0.055976 +v -0.031473 0.423295 -0.072473 +v -0.031413 0.417657 -0.041584 +v -0.022761 0.420443 -0.040068 +v -0.022899 0.423980 -0.054314 +v -0.022722 0.426231 -0.071568 +v -0.012701 0.425921 -0.053156 +v -0.012412 0.428614 -0.070418 +v -0.012485 0.422434 -0.039079 +v -0.022739 0.399244 0.000237 +v -0.012656 0.400743 0.002253 +v -0.012597 0.406929 -0.005952 +v -0.022626 0.405229 -0.008100 +v -0.012551 0.412812 -0.015209 +v -0.022560 0.410835 -0.017325 +v -0.022583 0.416033 -0.027973 +v -0.012450 0.418036 -0.026372 +v -0.066074 0.252522 -0.064836 +v -0.065288 0.252146 -0.069493 +v -0.063227 0.245741 -0.070760 +v -0.064380 0.246780 -0.064852 +v -0.066852 0.253953 -0.075489 +v -0.063823 0.245678 -0.077779 +v -0.062013 0.236883 -0.078441 +v -0.061257 0.237396 -0.070817 +v -0.062122 0.239020 -0.064138 +v -0.061936 0.220610 -0.093904 +v -0.061094 0.210405 -0.093775 +v -0.060953 0.208410 -0.086529 +v -0.061864 0.219096 -0.086327 +v -0.060164 0.199187 -0.093521 +v -0.060101 0.196510 -0.086627 +v -0.058415 0.193845 -0.079645 +v -0.059534 0.206631 -0.079074 +v -0.060504 0.218043 -0.078647 +v -0.055776 0.223443 -0.109026 +v -0.056091 0.214005 -0.107718 +v -0.059527 0.212433 -0.100926 +v -0.060081 0.222232 -0.101586 +v -0.058887 0.201797 -0.100187 +v -0.057919 0.241148 -0.111699 +v -0.056362 0.232500 -0.110365 +v -0.060945 0.231195 -0.102328 +v -0.062148 0.239838 -0.102992 +v -0.062706 0.229759 -0.094168 +v -0.063625 0.238628 -0.094388 +v -0.062581 0.228467 -0.086323 +v -0.063369 0.237411 -0.086251 +v -0.061203 0.227808 -0.078521 +v -0.057037 0.205052 -0.071313 +v -0.058660 0.217676 -0.070355 +v -0.055908 0.191138 -0.072499 +v -0.052002 0.188125 -0.065858 +v -0.052766 0.202875 -0.063977 +v -0.055423 0.217990 -0.060860 +v -0.059980 0.228287 -0.070473 +v -0.059400 0.230189 -0.062919 +v -0.065226 0.246660 -0.085446 +v -0.065539 0.247981 -0.094042 +v -0.068426 0.255992 -0.082851 +v -0.069155 0.259672 -0.091834 +v -0.061567 0.257465 -0.114274 +v -0.059735 0.249421 -0.112913 +v -0.063700 0.248669 -0.103474 +v -0.065662 0.257734 -0.104169 +v -0.072843 0.275917 -0.097529 +v -0.069754 0.274047 -0.108663 +v -0.067516 0.266024 -0.106311 +v -0.071109 0.268432 -0.095415 +v -0.065898 0.273459 -0.118599 +v -0.063445 0.265355 -0.116183 +v -0.054619 0.271548 -0.138269 +v -0.060988 0.272794 -0.128278 +v -0.063875 0.281980 -0.130865 +v -0.057198 0.280216 -0.141374 +v -0.068753 0.282652 -0.120738 +v -0.072210 0.293572 -0.122172 +v -0.067209 0.293216 -0.133405 +v -0.060181 0.291314 -0.145042 +v -0.072301 0.282679 -0.110496 +v -0.074716 0.283405 -0.099361 +v -0.076550 0.291741 -0.100950 +v -0.074897 0.292569 -0.111383 +v -0.076612 0.303874 -0.111018 +v -0.075656 0.307221 -0.122362 +v -0.077560 0.300541 -0.101402 +v -0.078984 0.309337 -0.097859 +v -0.078837 0.315478 -0.106931 +v -0.078509 0.325631 -0.119880 +v -0.082596 0.344930 -0.091559 +v -0.082161 0.359262 -0.094256 +v -0.081337 0.351956 -0.110094 +v -0.081939 0.336988 -0.105333 +v -0.079399 0.372635 -0.097620 +v -0.078499 0.365899 -0.114460 +v -0.074832 0.359155 -0.130322 +v -0.077388 0.344733 -0.125674 +v -0.072967 0.371378 -0.043787 +v -0.068164 0.377855 -0.035546 +v -0.068177 0.384666 -0.043665 +v -0.072960 0.378410 -0.051907 +v -0.062440 0.382995 -0.027711 +v -0.062270 0.389168 -0.035285 +v -0.067359 0.390410 -0.051592 +v -0.073821 0.383116 -0.064030 +v -0.081424 0.350706 -0.077744 +v -0.080660 0.365336 -0.079132 +v -0.078745 0.353761 -0.063132 +v -0.078224 0.369614 -0.065666 +v -0.077607 0.378315 -0.081371 +v -0.069530 0.392524 -0.070372 +v -0.072937 0.388414 -0.085754 +v -0.074896 0.383442 -0.102512 +v -0.065130 0.396061 -0.057762 +v -0.076072 0.371621 -0.056774 +v -0.076461 0.363688 -0.052191 +v -0.069009 0.353887 -0.143653 +v -0.071204 0.339926 -0.140316 +v -0.062272 0.350355 -0.155252 +v -0.063421 0.336541 -0.153466 +v -0.063482 0.321031 -0.150922 +v -0.072086 0.323708 -0.137238 +v -0.053740 0.348082 -0.164493 +v -0.054163 0.333786 -0.164433 +v -0.044801 0.346814 -0.172132 +v -0.044123 0.331556 -0.172896 +v -0.043569 0.315101 -0.171631 +v -0.053925 0.317957 -0.162542 +v -0.034247 0.329966 -0.179692 +v -0.033507 0.312865 -0.178638 +v -0.035591 0.346207 -0.178468 +v -0.025331 0.346039 -0.183932 +v -0.023812 0.328910 -0.185326 +v -0.022895 0.311295 -0.183511 +v -0.013744 0.401395 -0.157778 +v -0.013773 0.410180 -0.146721 +v -0.028066 0.398760 -0.155049 +v -0.028163 0.407624 -0.143827 +v -0.027207 0.414263 -0.131217 +v -0.013436 0.416809 -0.134331 +v -0.025267 0.419307 -0.118442 +v -0.012676 0.421930 -0.121172 +v -0.023561 0.423363 -0.104836 +v -0.012067 0.425873 -0.106404 +v -0.022792 0.426075 -0.089069 +v -0.012006 0.428748 -0.089135 +v -0.032589 0.420409 -0.101872 +v -0.031624 0.423004 -0.088296 +v -0.035592 0.416563 -0.113411 +v -0.039208 0.411376 -0.125486 +v -0.045265 0.360234 -0.169069 +v -0.036608 0.360943 -0.174576 +v -0.046338 0.371894 -0.164181 +v -0.037608 0.373995 -0.168602 +v -0.027018 0.376237 -0.172842 +v -0.026498 0.361985 -0.179687 +v -0.038803 0.385201 -0.160708 +v -0.027514 0.388279 -0.164502 +v -0.048165 0.382106 -0.156869 +v -0.050103 0.391167 -0.146854 +v -0.040039 0.395180 -0.151044 +v -0.060134 0.361226 -0.155452 +v -0.053146 0.360062 -0.162812 +v -0.058533 0.368135 -0.154910 +v -0.053611 0.369860 -0.159294 +v -0.058458 0.385801 -0.142514 +v -0.060030 0.393187 -0.128657 +v -0.051305 0.399727 -0.133348 +v -0.065404 0.379059 -0.138516 +v -0.067855 0.385797 -0.124443 +v -0.074159 0.377027 -0.119523 +v -0.070845 0.370359 -0.134536 +v -0.061651 0.372783 -0.148809 +v -0.065951 0.364816 -0.146263 +v -0.055803 0.378141 -0.152607 +v -0.040492 0.404114 -0.138998 +v -0.013767 0.378200 -0.176466 +v -0.013644 0.390727 -0.167438 +v -0.012686 0.345916 -0.187413 +v -0.013628 0.362961 -0.183815 +v -0.011562 0.294458 -0.182549 +v -0.011276 0.310510 -0.186392 +v -0.011106 0.282317 -0.176722 +v -0.021706 0.282614 -0.174119 +v -0.022713 0.294983 -0.179762 +v -0.011505 0.328249 -0.188325 +v -0.033046 0.296535 -0.175359 +v -0.031808 0.283588 -0.170106 +v -0.041686 0.285560 -0.164053 +v -0.042936 0.299248 -0.168550 +v -0.053092 0.302368 -0.159592 +v -0.051160 0.288497 -0.155357 +v -0.062564 0.305311 -0.148364 +v -0.070742 0.307300 -0.135597 +v -0.039817 0.275664 -0.159088 +v -0.048806 0.277990 -0.150977 +v -0.037907 0.268314 -0.154668 +v -0.046569 0.269783 -0.147269 +v -0.167386 0.101967 -0.102367 +v -0.167661 0.104886 -0.106664 +v -0.176223 0.101325 -0.106085 +v -0.172855 0.097916 -0.098925 +v -0.166661 0.105972 -0.112465 +v -0.171945 0.105776 -0.114104 +v -0.181064 0.101308 -0.121574 +v -0.186619 0.095869 -0.105176 +v -0.182378 0.088988 -0.091557 +v -0.151462 0.091288 -0.087124 +v -0.149203 0.098153 -0.093708 +v -0.162921 0.097431 -0.095550 +v -0.166533 0.089918 -0.088495 +v -0.146707 0.103780 -0.099812 +v -0.159318 0.102906 -0.101321 +v -0.120865 0.093191 -0.080942 +v -0.123232 0.086446 -0.073951 +v -0.109174 0.086859 -0.068642 +v -0.106003 0.092709 -0.076137 +v -0.124781 0.077576 -0.067987 +v -0.111938 0.078306 -0.062390 +v -0.098672 0.078388 -0.056127 +v -0.095217 0.086902 -0.062775 +v -0.091730 0.092534 -0.070528 +v -0.151020 0.071988 -0.074306 +v -0.137733 0.075372 -0.072066 +v -0.137592 0.084906 -0.077971 +v -0.152169 0.082420 -0.080539 +v -0.136141 0.092619 -0.084631 +v -0.200010 0.051496 -0.074864 +v -0.193364 0.042294 -0.069235 +v -0.183542 0.048329 -0.065236 +v -0.189540 0.058157 -0.071834 +v -0.185919 0.034231 -0.065499 +v -0.177038 0.039697 -0.059866 +v -0.166408 0.043686 -0.059314 +v -0.172415 0.053057 -0.065845 +v -0.177595 0.063780 -0.072657 +v -0.107615 0.055612 -0.045870 +v -0.118920 0.058103 -0.052844 +v -0.126454 0.049861 -0.050162 +v -0.115247 0.044806 -0.042080 +v -0.126055 0.060697 -0.058191 +v -0.133406 0.056716 -0.058317 +v -0.143589 0.051866 -0.058637 +v -0.136658 0.042981 -0.049915 +v -0.125198 0.031338 -0.044664 +v -0.154980 0.047484 -0.059131 +v -0.148816 0.038195 -0.051784 +v -0.160524 0.034695 -0.054032 +v -0.155273 0.024781 -0.056493 +v -0.142649 0.027016 -0.051709 +v -0.160458 0.057348 -0.066948 +v -0.148226 0.061518 -0.067126 +v -0.164568 0.068167 -0.074235 +v -0.178374 0.027491 -0.063884 +v -0.170783 0.031291 -0.056669 +v -0.172355 0.023256 -0.065114 +v -0.165488 0.023463 -0.060696 +v -0.208692 0.070773 -0.092525 +v -0.205348 0.061425 -0.082423 +v -0.194288 0.069265 -0.079873 +v -0.197698 0.080021 -0.090524 +v -0.181217 0.075846 -0.080247 +v -0.166889 0.079659 -0.081013 +v -0.136573 0.065400 -0.065839 +v -0.125582 0.067907 -0.062714 +v -0.114514 0.067863 -0.057463 +v -0.102238 0.067072 -0.051071 +v -0.076661 0.054852 -0.035294 +v -0.093194 0.054480 -0.039575 +v -0.099430 0.042396 -0.035197 +v -0.081307 0.042006 -0.030311 +v -0.103647 0.028478 -0.039886 +v -0.083777 0.028143 -0.035809 +v -0.069036 0.078772 -0.048570 +v -0.084251 0.078384 -0.051114 +v -0.088088 0.066900 -0.045377 +v -0.072410 0.067554 -0.041998 +v -0.066387 0.086738 -0.056029 +v -0.080841 0.086677 -0.058248 +v -0.064736 0.094120 -0.061908 +v -0.077936 0.093052 -0.065386 +v -0.060684 0.125232 -0.084854 +v -0.059203 0.136668 -0.087187 +v -0.062854 0.138902 -0.093646 +v -0.066638 0.125481 -0.091414 +v -0.057879 0.148906 -0.088804 +v -0.059641 0.152468 -0.094968 +v -0.060624 0.157123 -0.101931 +v -0.066302 0.143253 -0.101129 +v -0.076120 0.126814 -0.100575 +v -0.042535 0.100416 -0.062392 +v -0.052798 0.096602 -0.060031 +v -0.052558 0.089188 -0.054810 +v -0.040340 0.094113 -0.055821 +v -0.053546 0.080115 -0.048403 +v -0.036496 0.084772 -0.049664 +v -0.085629 0.137531 -0.159749 +v -0.071695 0.135440 -0.173577 +v -0.081358 0.117824 -0.186332 +v -0.097539 0.115564 -0.182101 +v -0.064325 0.131911 -0.180834 +v -0.068183 0.118536 -0.190130 +v -0.072979 0.096991 -0.203448 +v -0.088440 0.095667 -0.201836 +v -0.105503 0.093150 -0.199938 +v -0.032621 0.195683 -0.149726 +v -0.029515 0.183601 -0.157247 +v -0.036370 0.172435 -0.159411 +v -0.040051 0.179841 -0.150064 +v -0.027998 0.176399 -0.162406 +v -0.032041 0.166105 -0.167675 +v -0.039626 0.144667 -0.180174 +v -0.045990 0.159826 -0.164850 +v -0.049802 0.167117 -0.153326 +v -0.051648 0.171506 -0.143178 +v -0.044256 0.184150 -0.141643 +v -0.053373 0.173315 -0.134006 +v -0.047866 0.184799 -0.133111 +v -0.045279 0.196727 -0.132367 +v -0.040315 0.197599 -0.140795 +v -0.056045 0.175122 -0.110167 +v -0.057443 0.170341 -0.103200 +v -0.053864 0.179546 -0.117473 +v -0.058328 0.168189 -0.117563 +v -0.060193 0.162778 -0.109598 +v -0.103808 0.130670 -0.128943 +v -0.087576 0.137985 -0.124791 +v -0.082126 0.144404 -0.135595 +v -0.097356 0.135552 -0.142086 +v -0.074670 0.146549 -0.120739 +v -0.071236 0.152465 -0.129778 +v -0.068318 0.155781 -0.136257 +v -0.073842 0.150748 -0.143839 +v -0.199326 0.087541 -0.104477 +v -0.210141 0.077754 -0.105206 +v -0.198029 0.090766 -0.120778 +v -0.209387 0.080870 -0.119961 +v -0.195275 0.089448 -0.138380 +v -0.206961 0.079736 -0.135934 +v -0.179655 0.099327 -0.140501 +v -0.176713 0.094003 -0.158825 +v -0.191824 0.084359 -0.156437 +v -0.203495 0.074736 -0.152285 +v -0.123275 0.088715 -0.198355 +v -0.117892 0.108684 -0.180567 +v -0.140613 0.082937 -0.196852 +v -0.138445 0.100461 -0.179873 +v -0.138160 0.112134 -0.161841 +v -0.114905 0.122258 -0.161767 +v -0.171160 0.069911 -0.192415 +v -0.184302 0.062758 -0.188420 +v -0.187860 0.075171 -0.173631 +v -0.173585 0.084037 -0.176735 +v -0.195169 0.055158 -0.180677 +v -0.199364 0.066217 -0.167661 +v -0.170588 0.033940 -0.206418 +v -0.181897 0.032789 -0.200705 +v -0.182052 0.048334 -0.198629 +v -0.170230 0.052875 -0.203792 +v -0.189470 0.033685 -0.193190 +v -0.191800 0.043140 -0.189785 +v -0.145825 0.038095 -0.213388 +v -0.158780 0.035902 -0.210160 +v -0.157406 0.057282 -0.207157 +v -0.143362 0.061434 -0.209782 +v -0.156641 0.076655 -0.195029 +v -0.157092 0.092363 -0.178693 +v -0.158758 0.103095 -0.160718 +v -0.162213 0.110262 -0.128645 +v -0.161138 0.108434 -0.143338 +v -0.143099 0.117403 -0.131198 +v -0.140423 0.117086 -0.145191 +v -0.110540 0.116783 -0.108935 +v -0.112993 0.110002 -0.101337 +v -0.095813 0.109974 -0.098811 +v -0.092778 0.119255 -0.106404 +v -0.115559 0.103950 -0.094525 +v -0.099610 0.103392 -0.090744 +v -0.085047 0.103656 -0.085682 +v -0.080783 0.111900 -0.093716 +v -0.102870 0.097647 -0.083532 +v -0.088492 0.097944 -0.077941 +v -0.118199 0.098440 -0.087938 +v -0.133917 0.098649 -0.091300 +v -0.131658 0.104180 -0.097535 +v -0.157818 0.107127 -0.106639 +v -0.158014 0.109865 -0.112257 +v -0.145134 0.108562 -0.105763 +v -0.144437 0.112455 -0.112403 +v -0.160200 0.110817 -0.118859 +v -0.144148 0.115510 -0.120524 +v -0.129844 0.109508 -0.103871 +v -0.128192 0.114671 -0.111148 +v -0.126193 0.119817 -0.120037 +v -0.122958 0.124079 -0.131246 +v -0.107886 0.124177 -0.117880 +v -0.118169 0.126154 -0.145112 +v -0.090851 0.129629 -0.114676 +v -0.076916 0.138323 -0.111185 +v -0.067177 0.150295 -0.109547 +v -0.065479 0.157195 -0.118310 +v -0.051145 0.183045 -0.125069 +v -0.055800 0.172060 -0.125587 +v -0.048987 0.194084 -0.124624 +v -0.061346 0.163126 -0.135304 +v -0.062871 0.161896 -0.126794 +v -0.062476 0.160211 -0.144970 +v -0.063238 0.154734 -0.156319 +v -0.054352 0.138117 -0.179975 +v -0.058657 0.148247 -0.168198 +v -0.056175 0.120738 -0.191744 +v -0.059746 0.097885 -0.204407 +v -0.046243 0.120591 -0.193512 +v -0.049198 0.097731 -0.205380 +v -0.061929 0.072052 -0.216431 +v -0.076296 0.071441 -0.216186 +v -0.050367 0.072099 -0.216464 +v -0.051090 0.046173 -0.220312 +v -0.063538 0.045933 -0.221022 +v -0.078703 0.045230 -0.221112 +v -0.035506 0.121418 -0.194491 +v -0.040856 0.114745 -0.197309 +v -0.034604 0.097591 -0.206089 +v -0.041411 0.096570 -0.206237 +v -0.027074 0.098376 -0.206070 +v -0.025939 0.071772 -0.216017 +v -0.033612 0.071772 -0.216139 +v -0.018631 0.098521 -0.206476 +v -0.017688 0.071688 -0.216029 +v -0.016618 0.045697 -0.216798 +v -0.024845 0.045787 -0.217196 +v -0.032743 0.045912 -0.217938 +v -0.041324 0.071813 -0.216378 +v -0.041073 0.046098 -0.219085 +v -0.114677 0.042132 -0.218821 +v -0.131223 0.040199 -0.216261 +v -0.127917 0.065138 -0.212123 +v -0.111016 0.068090 -0.214008 +v -0.093216 0.070166 -0.215385 +v -0.096365 0.043880 -0.220372 +v -0.007855 0.045542 -0.216572 +v -0.008818 0.071476 -0.216035 +v -0.009562 0.098354 -0.206685 +v -0.009782 0.125029 -0.195516 +v -0.018783 0.124933 -0.195020 +v -0.018407 0.147921 -0.183687 +v -0.009834 0.148316 -0.184502 +v -0.027593 0.124270 -0.194191 +v -0.027326 0.147078 -0.182300 +v -0.025283 0.164895 -0.171737 +v -0.023285 0.178407 -0.164117 +v -0.016763 0.179982 -0.165970 +v -0.017691 0.165739 -0.173538 +v -0.001830 0.122113 -0.053997 +v -0.001056 0.110766 -0.058264 +v -0.009315 0.122776 -0.054817 +v -0.008877 0.112309 -0.057457 +v -0.009455 0.101782 -0.058396 +v -0.000987 0.099162 -0.059919 +v -0.015926 0.123542 -0.055427 +v -0.015489 0.113533 -0.057369 +v -0.021734 0.124450 -0.056518 +v -0.020973 0.114978 -0.058368 +v -0.022467 0.106036 -0.060289 +v -0.016530 0.103621 -0.058651 +v -0.013446 0.082313 -0.048288 +v -0.011339 0.091904 -0.054494 +v -0.019958 0.093784 -0.054492 +v -0.024152 0.083373 -0.047895 +v -0.027215 0.096200 -0.056871 +v -0.024963 0.116955 -0.059412 +v -0.027323 0.111308 -0.061876 +v -0.027242 0.124834 -0.058193 +v -0.032828 0.122463 -0.062327 +v -0.035933 0.109283 -0.065218 +v -0.031888 0.101508 -0.061737 +v -0.057263 0.180505 -0.079771 +v -0.054727 0.177137 -0.073275 +v -0.055601 0.167224 -0.079526 +v -0.052684 0.163634 -0.073829 +v -0.049117 0.159866 -0.068331 +v -0.051134 0.173655 -0.067145 +v -0.058633 0.174587 -0.091775 +v -0.058176 0.178546 -0.098211 +v -0.057895 0.165788 -0.096564 +v -0.057561 0.161643 -0.090301 +v -0.058520 0.190533 -0.099402 +v -0.059597 0.187198 -0.092884 +v -0.059185 0.183841 -0.086251 +v -0.057773 0.170824 -0.085465 +v -0.056450 0.157981 -0.084401 +v -0.055944 0.145992 -0.083227 +v -0.053388 0.142796 -0.078204 +v -0.054208 0.154458 -0.078954 +v -0.051092 0.150722 -0.073856 +v -0.050093 0.138875 -0.073632 +v -0.045714 0.134227 -0.069528 +v -0.047047 0.146638 -0.069035 +v -0.038681 0.152521 -0.058942 +v -0.044413 0.156032 -0.063352 +v -0.041977 0.142224 -0.064465 +v -0.035975 0.138442 -0.060376 +v -0.040205 0.128829 -0.065746 +v -0.056482 0.125619 -0.079926 +v -0.056242 0.135092 -0.081835 +v -0.053919 0.126347 -0.077021 +v -0.053417 0.132856 -0.077464 +v -0.061294 0.105131 -0.077033 +v -0.061131 0.114638 -0.081571 +v -0.069290 0.113341 -0.087396 +v -0.072151 0.103821 -0.080941 +v -0.048601 0.114435 -0.071207 +v -0.053426 0.108628 -0.073668 +v -0.052687 0.101705 -0.067573 +v -0.044991 0.107215 -0.067902 +v -0.063244 0.099257 -0.068805 +v -0.075371 0.098631 -0.072423 +v -0.051915 0.121258 -0.074371 +v -0.055460 0.116928 -0.077092 +v -0.050208 0.128727 -0.073545 +v -0.046077 0.123140 -0.070115 +v -0.041002 0.116632 -0.067430 +v -0.029716 0.136621 -0.056965 +v -0.023424 0.135374 -0.054506 +v -0.025200 0.147382 -0.052358 +v -0.032125 0.149711 -0.055277 +v -0.014563 0.173894 -0.029033 +v -0.013500 0.175637 -0.024757 +v -0.020348 0.179205 -0.025404 +v -0.022827 0.178607 -0.031076 +v -0.011760 0.176329 -0.021731 +v -0.014791 0.177942 -0.020916 +v -0.017656 0.179943 -0.019125 +v -0.025470 0.183245 -0.024529 +v -0.031661 0.186625 -0.032665 +v -0.006460 0.176398 -0.017966 +v -0.007675 0.177366 -0.015712 +v -0.005483 0.175220 -0.020462 +v -0.005517 0.173485 -0.023515 +v -0.005809 0.170929 -0.026724 +v -0.018345 0.145277 -0.050133 +v -0.019551 0.156401 -0.046804 +v -0.026410 0.159925 -0.050132 +v -0.011355 0.143134 -0.047616 +v -0.012527 0.152790 -0.043043 +v -0.013200 0.162155 -0.038884 +v -0.020521 0.166906 -0.042792 +v -0.027290 0.171860 -0.046852 +v -0.046440 0.170042 -0.061819 +v -0.040525 0.166550 -0.057391 +v -0.041046 0.180527 -0.055691 +v -0.046949 0.184491 -0.060462 +v -0.047838 0.198555 -0.057653 +v -0.042475 0.193169 -0.051976 +v -0.045155 0.202879 -0.047196 +v -0.050105 0.209971 -0.053607 +v -0.033546 0.163259 -0.053668 +v -0.034194 0.176439 -0.051139 +v -0.036404 0.187218 -0.046138 +v -0.029523 0.180875 -0.040795 +v -0.039535 0.195230 -0.040291 +v -0.022109 0.174747 -0.037070 +v -0.014208 0.169639 -0.033822 +v -0.005516 0.165950 -0.031002 +v -0.005038 0.158227 -0.035042 +v -0.003472 0.141414 -0.045055 +v -0.004461 0.149751 -0.039486 +v -0.017020 0.134201 -0.052974 +v -0.010240 0.133053 -0.051374 +v -0.002614 0.132217 -0.049618 +v -0.001605 0.089058 -0.056347 +v -0.002288 0.080023 -0.050914 +v -0.002782 0.070858 -0.044219 +v -0.003148 0.060211 -0.037479 +v -0.014738 0.072304 -0.040410 +v -0.015679 0.060305 -0.034393 +v -0.027217 0.072136 -0.039387 +v -0.028979 0.059289 -0.033692 +v -0.040627 0.070793 -0.040505 +v -0.043407 0.057725 -0.033820 +v -0.059573 0.056241 -0.033715 +v -0.062651 0.043194 -0.028078 +v -0.045443 0.044667 -0.028655 +v -0.064447 0.029229 -0.032199 +v -0.046398 0.031167 -0.030533 +v -0.056192 0.068967 -0.040902 +v -0.030200 0.045923 -0.030081 +v -0.016418 0.047027 -0.031321 +v -0.030578 0.033161 -0.031434 +v -0.016792 0.034194 -0.033375 +v -0.003606 0.047574 -0.033056 +v -0.004076 0.034552 -0.034836 +v -0.056328 0.392743 -0.028313 +v -0.056521 0.386974 -0.020902 +v -0.050761 0.390283 -0.015030 +v -0.050489 0.395780 -0.022706 +v -0.038097 0.410592 -0.032524 +v -0.031051 0.413338 -0.030074 +v -0.037981 0.405978 -0.022965 +v -0.030920 0.408424 -0.019991 +v -0.038198 0.400936 -0.014262 +v -0.031046 0.403154 -0.010941 +v -0.038472 0.395375 -0.006078 +v -0.031250 0.397374 -0.002634 +v -0.044153 0.407643 -0.035480 +v -0.044169 0.403391 -0.026384 +v -0.044565 0.398527 -0.018093 +v -0.044735 0.392901 -0.010245 +v -0.017351 0.247931 -0.154529 +v -0.017059 0.241490 -0.154041 +v -0.024814 0.239330 -0.150837 +v -0.025084 0.246742 -0.151006 +v -0.016846 0.232595 -0.154494 +v -0.024579 0.229508 -0.151304 +v -0.032000 0.226587 -0.145646 +v -0.032303 0.237188 -0.145576 +v -0.032541 0.245450 -0.145994 +v -0.036022 0.262705 -0.151154 +v -0.044403 0.263242 -0.144279 +v -0.034416 0.257567 -0.148603 +v -0.042439 0.257448 -0.141962 +v -0.049541 0.257913 -0.133120 +v -0.052087 0.264365 -0.135544 +v -0.058174 0.265166 -0.125760 +v -0.055704 0.258017 -0.123599 +v -0.047365 0.251135 -0.131231 +v -0.053486 0.250631 -0.121803 +v -0.045803 0.243316 -0.129711 +v -0.051528 0.242516 -0.120147 +v -0.033306 0.251966 -0.147058 +v -0.040845 0.251350 -0.140276 +v -0.039877 0.244115 -0.139118 +v -0.045036 0.221257 -0.126424 +v -0.048905 0.211889 -0.119981 +v -0.051868 0.214406 -0.114227 +v -0.050232 0.223650 -0.116627 +v -0.048162 0.204321 -0.123282 +v -0.044189 0.208817 -0.130642 +v -0.038886 0.211343 -0.139314 +v -0.031824 0.213174 -0.146873 +v -0.038868 0.224169 -0.137806 +v -0.050141 0.233437 -0.118384 +v -0.044873 0.233991 -0.128038 +v -0.039316 0.235185 -0.138101 +v -0.020932 0.273427 -0.169266 +v -0.030735 0.274067 -0.165161 +v -0.020042 0.266737 -0.164923 +v -0.029271 0.267287 -0.160544 +v -0.019202 0.261780 -0.161046 +v -0.027722 0.262288 -0.156594 +v -0.018483 0.257447 -0.157999 +v -0.026432 0.257702 -0.153720 +v -0.010703 0.273434 -0.171535 +v -0.010399 0.266575 -0.167418 +v -0.009598 0.254025 -0.157337 +v -0.009923 0.257573 -0.160252 +v -0.009372 0.249633 -0.155630 +v -0.017860 0.253045 -0.155827 +v -0.010164 0.261525 -0.163687 +v -0.025693 0.252594 -0.152126 +v -0.023034 0.189809 -0.158936 +v -0.016338 0.192536 -0.161102 +v -0.023941 0.202384 -0.155325 +v -0.016489 0.205983 -0.157901 +v -0.009618 0.222599 -0.156069 +v -0.009436 0.235203 -0.155063 +v -0.009763 0.207899 -0.158614 +v -0.016619 0.220178 -0.155510 +v -0.024200 0.216647 -0.152516 +v -0.010044 0.166506 -0.174854 +v -0.009845 0.180778 -0.167151 +v -0.009725 0.193787 -0.162030 +v -0.009346 0.243813 -0.154774 +v -0.081447 0.332116 -0.088396 +v -0.080372 0.336627 -0.076959 +v -0.079731 0.322664 -0.084813 +v -0.079153 0.325634 -0.075993 +v -0.077683 0.325182 -0.066734 +v -0.078268 0.337009 -0.066070 +v -0.079569 0.317196 -0.091839 +v -0.080825 0.325052 -0.098668 +v 0.234399 0.061581 -0.111275 +v 0.233351 0.060441 -0.124560 +v 0.234519 0.065755 -0.123795 +v 0.235510 0.067559 -0.116993 +v 0.230964 0.063256 -0.138310 +v 0.233658 0.068331 -0.130486 +v 0.234933 0.070026 -0.123372 +v 0.221675 0.046004 -0.153222 +v 0.226646 0.044178 -0.129248 +v 0.219442 0.034677 -0.131753 +v 0.215564 0.035727 -0.159471 +v 0.227105 0.045074 -0.105032 +v 0.220201 0.036238 -0.103757 +v 0.210946 0.028820 -0.103367 +v 0.210194 0.026342 -0.134056 +v 0.207750 0.026108 -0.164603 +v 0.207346 0.057890 -0.184665 +v 0.216553 0.050833 -0.172158 +v 0.211176 0.039822 -0.180439 +v 0.203822 0.045908 -0.193943 +v 0.204677 0.029957 -0.186506 +v 0.201461 0.035962 -0.197200 +v 0.217045 0.077647 -0.156094 +v 0.226919 0.069310 -0.149425 +v 0.222019 0.061021 -0.161611 +v 0.212020 0.068951 -0.171485 +v 0.226880 0.055530 -0.146018 +v 0.231009 0.053318 -0.126597 +v 0.231551 0.053942 -0.107539 +v 0.208708 0.032498 -0.081120 +v 0.199684 0.026495 -0.079480 +v 0.200750 0.022901 -0.103181 +v 0.203510 0.037349 -0.067269 +v 0.195823 0.030302 -0.065325 +v 0.189636 0.025909 -0.066321 +v 0.190129 0.022358 -0.078102 +v 0.190003 0.018421 -0.102507 +v 0.216946 0.039996 -0.083820 +v 0.223943 0.048816 -0.087817 +v 0.217739 0.055266 -0.077009 +v 0.211132 0.045687 -0.071201 +v 0.229745 0.058192 -0.093358 +v 0.233361 0.067028 -0.101178 +v 0.225260 0.075450 -0.095418 +v 0.222312 0.065730 -0.085078 +v 0.234352 0.073667 -0.111489 +v 0.233432 0.076632 -0.123579 +v 0.225444 0.085383 -0.123804 +v 0.226412 0.082416 -0.108535 +v 0.230799 0.074827 -0.136510 +v 0.221987 0.083534 -0.140018 +v 0.002914 0.017064 -0.169186 +v 0.012963 0.017146 -0.169063 +v 0.015768 0.016548 -0.124526 +v 0.004689 0.016483 -0.124985 +v 0.022968 0.017184 -0.169021 +v 0.026978 0.016426 -0.123757 +v 0.030640 0.019139 -0.077462 +v 0.018439 0.019370 -0.078968 +v 0.006523 0.019335 -0.079855 +v 0.036596 0.046267 -0.216460 +v 0.045168 0.046586 -0.217092 +v 0.047859 0.025358 -0.203883 +v 0.038589 0.025518 -0.201703 +v 0.055425 0.046869 -0.217896 +v 0.058661 0.025197 -0.206567 +v 0.064774 0.014682 -0.181167 +v 0.054063 0.015577 -0.175640 +v 0.043347 0.016314 -0.171611 +v 0.019793 0.045835 -0.216263 +v 0.028367 0.046025 -0.216228 +v 0.029749 0.025652 -0.200532 +v 0.020786 0.025662 -0.200143 +v 0.033018 0.016889 -0.169601 +v 0.083980 0.046464 -0.218969 +v 0.087594 0.024204 -0.208701 +v 0.071739 0.024995 -0.208612 +v 0.068232 0.046876 -0.218561 +v 0.091305 0.013391 -0.183422 +v 0.076402 0.013852 -0.185788 +v 0.135320 0.013812 -0.093207 +v 0.137531 0.019328 -0.062504 +v 0.117789 0.019221 -0.060677 +v 0.115572 0.014165 -0.094628 +v 0.140312 0.031976 -0.044656 +v 0.118172 0.028730 -0.040534 +v 0.098207 0.028289 -0.036483 +v 0.097359 0.019582 -0.058470 +v 0.092051 0.014584 -0.101717 +v 0.078901 0.029464 -0.032545 +v 0.078210 0.020688 -0.052536 +v 0.061018 0.031416 -0.030076 +v 0.060772 0.022089 -0.047228 +v 0.057535 0.017535 -0.079660 +v 0.073325 0.016356 -0.087205 +v 0.128909 0.012147 -0.178305 +v 0.109636 0.012766 -0.180325 +v 0.106319 0.023112 -0.207825 +v 0.125561 0.022102 -0.206507 +v 0.102582 0.045463 -0.218989 +v 0.121791 0.044069 -0.218458 +v 0.139304 0.042391 -0.217251 +v 0.142779 0.021255 -0.204843 +v 0.154832 0.040413 -0.215459 +v 0.157804 0.020635 -0.202808 +v 0.160833 0.011870 -0.175797 +v 0.146017 0.011776 -0.176995 +v 0.179967 0.020151 -0.075134 +v 0.178652 0.015686 -0.100829 +v 0.182511 0.025857 -0.061484 +v 0.171794 0.026728 -0.056836 +v 0.168338 0.019283 -0.071200 +v 0.166249 0.014334 -0.098174 +v 0.152094 0.013790 -0.095022 +v 0.154452 0.019181 -0.066570 +v 0.158486 0.028355 -0.051798 +v 0.168765 0.038342 -0.213169 +v 0.171239 0.020399 -0.200190 +v 0.181594 0.036572 -0.209796 +v 0.183554 0.021136 -0.196714 +v 0.186090 0.014983 -0.171833 +v 0.173997 0.012746 -0.174166 +v 0.193392 0.035707 -0.204474 +v 0.195064 0.023765 -0.192087 +v 0.197472 0.019230 -0.168644 +v 0.199744 0.019804 -0.136044 +v 0.188509 0.015174 -0.137367 +v 0.176655 0.012443 -0.137763 +v 0.163802 0.011169 -0.137332 +v 0.149315 0.010845 -0.136473 +v 0.132379 0.011084 -0.136543 +v 0.094244 0.011934 -0.146563 +v 0.112956 0.011606 -0.139124 +v 0.082095 0.011908 -0.158925 +v 0.075255 0.012929 -0.144491 +v 0.063706 0.014206 -0.133065 +v 0.050721 0.015227 -0.126502 +v 0.038485 0.016002 -0.123871 +v 0.043461 0.018512 -0.076990 +v 0.019240 0.024786 -0.048826 +v 0.007333 0.024850 -0.049978 +v 0.031686 0.024423 -0.046850 +v 0.031204 0.033712 -0.031354 +v 0.018868 0.034419 -0.033546 +v 0.007518 0.034653 -0.035144 +v 0.045312 0.023422 -0.045605 +v 0.045283 0.032459 -0.029725 +v 0.001997 0.025329 -0.200129 +v 0.011530 0.025454 -0.200049 +v 0.001365 0.045498 -0.216468 +v 0.010706 0.045583 -0.216382 +v -0.214777 0.060156 -0.134304 +v -0.216271 0.057495 -0.120797 +v -0.217231 0.062196 -0.119891 +v -0.216755 0.064996 -0.126467 +v -0.216676 0.058289 -0.107779 +v -0.217777 0.064015 -0.113365 +v -0.217682 0.066713 -0.119464 +v -0.194206 0.025947 -0.100326 +v -0.203476 0.033222 -0.100568 +v -0.204455 0.031536 -0.128092 +v -0.194715 0.023581 -0.130320 +v -0.210086 0.042120 -0.101766 +v -0.210853 0.041233 -0.125511 +v -0.207092 0.043196 -0.149225 +v -0.201699 0.032756 -0.155392 +v -0.193810 0.023340 -0.160346 +v -0.198028 0.036986 -0.176035 +v -0.191848 0.027123 -0.182153 +v -0.202898 0.048021 -0.167869 +v -0.195169 0.055158 -0.180677 +v -0.191800 0.043140 -0.189785 +v -0.189470 0.033685 -0.193190 +v -0.211577 0.052625 -0.142041 +v -0.207796 0.058123 -0.157433 +v -0.211932 0.066255 -0.145297 +v -0.203495 0.074736 -0.152285 +v -0.199364 0.066217 -0.167661 +v -0.214168 0.050862 -0.104138 +v -0.214325 0.050374 -0.122856 +v -0.172355 0.023256 -0.065114 +v -0.178374 0.027491 -0.063884 +v -0.182326 0.023722 -0.077492 +v -0.173088 0.019700 -0.076412 +v -0.185919 0.034231 -0.065499 +v -0.191236 0.029527 -0.078757 +v -0.184272 0.020015 -0.100334 +v -0.173805 0.015656 -0.099894 +v -0.200010 0.051496 -0.074864 +v -0.206352 0.045408 -0.085024 +v -0.199590 0.036779 -0.081030 +v -0.193364 0.042294 -0.069235 +v -0.208692 0.070773 -0.092525 +v -0.215517 0.063041 -0.098186 +v -0.211733 0.054562 -0.090619 +v -0.205348 0.061425 -0.082423 +v -0.209387 0.080870 -0.119961 +v -0.216583 0.072497 -0.119584 +v -0.216960 0.069424 -0.108019 +v -0.210141 0.077754 -0.105206 +v -0.214912 0.071267 -0.132353 +v -0.206961 0.079736 -0.135934 +v -0.017469 0.018756 -0.077556 +v -0.017353 0.016101 -0.123543 +v -0.006315 0.016371 -0.124435 +v -0.005364 0.019185 -0.079094 +v -0.016897 0.016922 -0.169153 +v -0.007069 0.017045 -0.169112 +v -0.057586 0.013637 -0.181743 +v -0.052853 0.024204 -0.208383 +v -0.042480 0.024584 -0.205472 +v -0.047177 0.014744 -0.176113 +v -0.051090 0.046173 -0.220312 +v -0.041073 0.046098 -0.219085 +v -0.032743 0.045912 -0.217938 +v -0.033578 0.024896 -0.202918 +v -0.036745 0.015721 -0.171965 +v -0.025083 0.025185 -0.201362 +v -0.026699 0.016459 -0.169842 +v -0.024845 0.045787 -0.217196 +v -0.016618 0.045697 -0.216798 +v -0.016388 0.025348 -0.200580 +v -0.068772 0.012469 -0.186333 +v -0.065569 0.023656 -0.210413 +v -0.082903 0.011718 -0.183367 +v -0.080840 0.022555 -0.209970 +v -0.078703 0.045230 -0.221112 +v -0.063538 0.045933 -0.221022 +v -0.083777 0.028143 -0.035809 +v -0.103647 0.028478 -0.039886 +v -0.103418 0.018410 -0.058863 +v -0.083173 0.018885 -0.056693 +v -0.125198 0.031338 -0.044664 +v -0.122617 0.018332 -0.061092 +v -0.121145 0.012122 -0.090625 +v -0.102172 0.012630 -0.091753 +v -0.079516 0.013203 -0.098974 +v -0.044327 0.016717 -0.078736 +v -0.046279 0.021645 -0.047304 +v -0.063932 0.020092 -0.051557 +v -0.060388 0.015275 -0.085346 +v -0.046398 0.031167 -0.030533 +v -0.064447 0.029229 -0.032199 +v -0.098643 0.021171 -0.208148 +v -0.096365 0.043880 -0.220372 +v -0.100211 0.010888 -0.179352 +v -0.118498 0.010070 -0.176374 +v -0.116888 0.019925 -0.205625 +v -0.114677 0.042132 -0.218821 +v -0.148842 0.009548 -0.172471 +v -0.147378 0.018348 -0.199853 +v -0.133188 0.019010 -0.202820 +v -0.134752 0.009575 -0.174258 +v -0.145825 0.038095 -0.213388 +v -0.131223 0.040199 -0.216261 +v -0.155273 0.024781 -0.056493 +v -0.165488 0.023463 -0.060696 +v -0.163253 0.017759 -0.073756 +v -0.152119 0.017306 -0.070033 +v -0.162784 0.013141 -0.098446 +v -0.150823 0.012069 -0.095906 +v -0.138847 0.017738 -0.065421 +v -0.142649 0.027016 -0.051709 +v -0.137226 0.011860 -0.092677 +v -0.172973 0.012389 -0.167834 +v -0.171556 0.018651 -0.192775 +v -0.159974 0.018057 -0.196612 +v -0.161383 0.010311 -0.170427 +v -0.170588 0.033940 -0.206418 +v -0.158780 0.035902 -0.210160 +v -0.182497 0.021056 -0.187891 +v -0.183925 0.016526 -0.164483 +v -0.181897 0.032789 -0.200705 +v -0.184711 0.016987 -0.132375 +v -0.173828 0.012436 -0.133808 +v -0.162362 0.009863 -0.134380 +v -0.149998 0.008761 -0.134145 +v -0.136121 0.008630 -0.133480 +v -0.119956 0.009052 -0.133787 +v -0.101467 0.009786 -0.136704 +v -0.083861 0.010328 -0.144728 +v -0.070634 0.011533 -0.157908 +v -0.065622 0.011758 -0.143149 +v -0.053803 0.013239 -0.131886 +v -0.040791 0.014503 -0.125723 +v -0.028674 0.015474 -0.123432 +v -0.030195 0.017905 -0.076741 +v -0.016792 0.034194 -0.033375 +v -0.017191 0.024331 -0.047982 +v -0.004667 0.024805 -0.049488 +v -0.004076 0.034552 -0.034836 +v -0.030797 0.023193 -0.046618 +v -0.030578 0.033161 -0.031434 +v -0.007855 0.045542 -0.216572 +v -0.007385 0.025336 -0.200240 +v 0.044872 0.238480 0.016815 +v 0.045431 0.230564 0.014637 +v 0.048228 0.228246 0.010159 +v 0.047997 0.237819 0.013279 +v 0.045042 0.223468 0.012100 +v 0.047320 0.220077 0.007157 +v 0.049011 0.216354 0.001229 +v 0.051494 0.225260 0.003746 +v 0.051993 0.236474 0.007173 +v 0.035678 0.250599 0.023201 +v 0.033478 0.249322 0.024521 +v 0.035569 0.244462 0.023584 +v 0.037936 0.244965 0.022175 +v 0.031649 0.248051 0.025833 +v 0.033406 0.243940 0.024769 +v 0.034660 0.240115 0.023732 +v 0.037079 0.239784 0.022569 +v 0.039592 0.239357 0.021120 +v 0.063640 0.235226 -0.047978 +v 0.059770 0.227895 -0.042782 +v 0.057544 0.223288 -0.049841 +v 0.061876 0.230094 -0.054842 +v 0.055836 0.220308 -0.036177 +v 0.053443 0.215958 -0.042873 +v 0.054277 0.222069 -0.004667 +v 0.056682 0.234284 -0.002094 +v 0.049995 0.212709 -0.005171 +v 0.049980 0.209353 -0.011650 +v 0.055227 0.218761 -0.014091 +v 0.060279 0.232353 -0.015825 +v 0.062743 0.232803 -0.034722 +v 0.058513 0.224365 -0.028186 +v 0.066232 0.241910 -0.040467 +v 0.067826 0.251378 -0.031591 +v 0.064917 0.241646 -0.025071 +v 0.067142 0.262853 -0.022854 +v 0.064390 0.254888 -0.016164 +v 0.065477 0.273950 -0.015519 +v 0.063047 0.267895 -0.009483 +v 0.059272 0.263739 -0.002595 +v 0.060911 0.249581 -0.007656 +v 0.054453 0.261904 0.004639 +v 0.056400 0.248290 0.001770 +v 0.048380 0.262202 0.012152 +v 0.051360 0.248397 0.009764 +v 0.048613 0.206040 -0.017716 +v 0.054104 0.215037 -0.022641 +v 0.045989 0.202248 -0.023138 +v 0.051452 0.211358 -0.029668 +v 0.048420 0.206595 -0.035805 +v 0.042577 0.197025 -0.028005 +v 0.025255 0.242860 0.027866 +v 0.025877 0.241810 0.027033 +v 0.027672 0.242141 0.026780 +v 0.026786 0.243768 0.027845 +v 0.026121 0.240853 0.026243 +v 0.028113 0.240623 0.025854 +v 0.030187 0.240508 0.025400 +v 0.029464 0.242665 0.026421 +v 0.028361 0.245076 0.027531 +v 0.031368 0.243309 0.025727 +v 0.029968 0.246566 0.026891 +v 0.032368 0.240336 0.024739 +v 0.023986 0.242297 0.027689 +v 0.024454 0.241756 0.026987 +v 0.023178 0.241914 0.027095 +v 0.023597 0.241672 0.026473 +v 0.023755 0.241335 0.026090 +v 0.024682 0.241225 0.026272 +v 0.040388 0.233859 0.019969 +v 0.042841 0.232368 0.017678 +v 0.042134 0.238944 0.019216 +v 0.040098 0.228744 0.018704 +v 0.042568 0.226322 0.015907 +v 0.035285 0.236456 0.022801 +v 0.037832 0.235222 0.021529 +v 0.035058 0.232947 0.021996 +v 0.037631 0.230888 0.020605 +v 0.006528 0.191530 0.020503 +v 0.014528 0.192194 0.019405 +v 0.015537 0.194659 0.025926 +v 0.007067 0.193843 0.027372 +v 0.021433 0.193899 0.016953 +v 0.022620 0.196860 0.022490 +v 0.022970 0.201326 0.026803 +v 0.015910 0.199398 0.031057 +v 0.007428 0.198309 0.033354 +v 0.005963 0.189272 0.014640 +v 0.013308 0.190074 0.013555 +v 0.004982 0.186449 0.009666 +v 0.011431 0.187037 0.008802 +v 0.017150 0.188075 0.006784 +v 0.019831 0.191531 0.011443 +v 0.026810 0.196190 0.013476 +v 0.027975 0.199395 0.018409 +v 0.031424 0.198978 0.009544 +v 0.032338 0.202459 0.014054 +v 0.032192 0.206370 0.017970 +v 0.028114 0.203633 0.022334 +v 0.025145 0.193382 0.008514 +v 0.022625 0.189690 0.004120 +v 0.027926 0.191782 0.001100 +v 0.029915 0.195630 0.005104 +v 0.045420 0.210200 0.001048 +v 0.044958 0.206301 -0.003919 +v 0.041312 0.205924 0.002663 +v 0.039922 0.201833 -0.001510 +v 0.038151 0.197880 -0.005484 +v 0.043932 0.202709 -0.008682 +v 0.043457 0.217895 0.010886 +v 0.045123 0.214261 0.006100 +v 0.040657 0.213589 0.011487 +v 0.042011 0.209998 0.007046 +v 0.034942 0.198353 0.001664 +v 0.036412 0.202241 0.005703 +v 0.032885 0.194452 -0.002230 +v 0.036586 0.209697 0.014108 +v 0.037135 0.206097 0.009912 +v 0.038779 0.224266 0.017878 +v 0.041211 0.221202 0.014935 +v 0.036474 0.220372 0.018191 +v 0.038736 0.216970 0.015404 +v 0.034072 0.229609 0.021644 +v 0.036429 0.226999 0.020036 +v 0.032415 0.226536 0.022147 +v 0.034494 0.223504 0.020496 +v 0.030129 0.223763 0.023555 +v 0.031779 0.220480 0.021918 +v 0.027085 0.221507 0.025320 +v 0.028444 0.218050 0.024005 +v 0.029861 0.214358 0.022595 +v 0.033474 0.217047 0.019979 +v 0.024552 0.240567 0.025951 +v 0.025949 0.239808 0.025714 +v 0.023593 0.240961 0.025994 +v 0.023119 0.240673 0.026170 +v 0.024167 0.239954 0.026027 +v 0.025467 0.238934 0.025527 +v 0.030369 0.238469 0.024609 +v 0.032769 0.237563 0.023781 +v 0.030021 0.236525 0.024023 +v 0.032517 0.234846 0.023132 +v 0.027991 0.239123 0.025190 +v 0.027402 0.237763 0.024748 +v 0.031631 0.232198 0.023002 +v 0.029226 0.234546 0.024019 +v 0.028031 0.232539 0.024814 +v 0.030244 0.229636 0.023634 +v 0.026511 0.236426 0.024930 +v 0.024679 0.238150 0.025632 +v 0.023792 0.237215 0.026390 +v 0.025588 0.235032 0.025908 +v 0.023542 0.239408 0.026152 +v 0.022474 0.240449 0.026530 +v 0.021563 0.240062 0.027127 +v 0.022683 0.238813 0.026763 +v 0.021414 0.238194 0.028288 +v 0.022695 0.236123 0.027928 +v 0.020245 0.239618 0.028375 +v 0.018308 0.239334 0.030238 +v 0.019372 0.237496 0.030483 +v 0.020738 0.234866 0.030145 +v 0.024283 0.233476 0.027180 +v 0.026225 0.230469 0.026132 +v 0.022222 0.231790 0.029106 +v 0.023826 0.228456 0.027869 +v 0.028219 0.227139 0.024945 +v 0.025535 0.224973 0.026600 +v 0.020700 0.226807 0.029414 +v 0.022130 0.223343 0.028205 +v 0.016628 0.225557 0.030886 +v 0.017662 0.222211 0.029827 +v 0.018667 0.218716 0.029461 +v 0.023426 0.219856 0.027298 +v 0.024754 0.216263 0.026696 +v 0.026053 0.212387 0.025966 +v 0.019930 0.215127 0.029716 +v 0.021282 0.211121 0.029931 +v 0.035138 0.213395 0.017441 +v 0.031264 0.210428 0.020788 +v 0.027281 0.208141 0.024708 +v 0.022455 0.206398 0.029263 +v 0.015649 0.205183 0.033665 +v 0.014909 0.210574 0.034235 +v 0.006929 0.210180 0.036381 +v 0.007278 0.204581 0.035941 +v 0.013903 0.214778 0.033549 +v 0.012831 0.218126 0.032416 +v 0.006163 0.217761 0.034582 +v 0.006540 0.214363 0.035784 +v 0.011232 0.224741 0.032020 +v 0.011930 0.221390 0.031647 +v 0.005237 0.224240 0.032493 +v 0.005721 0.220808 0.033053 +v 0.014637 0.232605 0.034219 +v 0.015580 0.228944 0.032408 +v 0.019334 0.230258 0.030857 +v 0.018072 0.233663 0.032265 +v 0.016724 0.236804 0.032999 +v 0.015398 0.239113 0.032462 +v 0.011903 0.239196 0.034659 +v 0.013431 0.236385 0.035289 +v 0.007497 0.239044 0.036944 +v 0.008748 0.235666 0.037336 +v 0.002712 0.238671 0.037337 +v 0.003330 0.235176 0.037660 +v 0.004031 0.231573 0.034937 +v 0.009651 0.231731 0.035368 +v 0.010497 0.228017 0.033482 +v 0.004681 0.227723 0.033318 +v 0.068518 0.256443 -0.060243 +v 0.067554 0.251699 -0.060103 +v 0.069653 0.260222 -0.056846 +v 0.068996 0.256019 -0.055770 +v 0.068135 0.250123 -0.054107 +v 0.066658 0.245222 -0.059117 +v 0.065206 0.237716 -0.057504 +v 0.066520 0.242918 -0.051544 +v 0.071623 0.273296 -0.041836 +v 0.069925 0.283021 -0.031605 +v 0.068796 0.272090 -0.028086 +v 0.069864 0.261590 -0.036971 +v 0.068179 0.290987 -0.023520 +v 0.067027 0.281514 -0.020248 +v 0.068539 0.251079 -0.044970 +v 0.070064 0.258788 -0.048718 +v 0.070787 0.263667 -0.051979 +v 0.071183 0.266515 -0.054306 +v 0.072718 0.274861 -0.052575 +v 0.072430 0.274407 -0.048936 +v 0.040540 0.245621 0.020456 +v 0.038136 0.252203 0.021628 +v 0.043496 0.246524 0.018207 +v 0.041061 0.254275 0.019681 +v 0.047029 0.247618 0.014981 +v 0.044405 0.257095 0.016869 +v 0.021776 0.184863 -0.004260 +v 0.024947 0.187703 -0.002352 +v 0.018627 0.185232 0.000435 +v 0.014823 0.182017 -0.003159 +v 0.012315 0.183802 0.003338 +v 0.002904 0.180922 0.000145 +v 0.008964 0.184512 0.005639 +v 0.003874 0.183657 0.005477 +v 0.003070 0.177707 -0.010118 +v 0.003158 0.176996 -0.013082 +v 0.015420 0.178994 -0.014396 +v 0.015789 0.179775 -0.011210 +v 0.027114 0.184457 -0.015961 +v 0.029571 0.187251 -0.011919 +v 0.035573 0.190348 -0.020377 +v 0.038945 0.194864 -0.016915 +v 0.041945 0.198996 -0.013077 +v 0.035445 0.193553 -0.009044 +v 0.030094 0.190181 -0.005456 +v 0.024646 0.185386 -0.007398 +v 0.014650 0.180497 -0.007343 +v 0.002876 0.178660 -0.006092 +v -0.037187 0.207040 0.005810 +v -0.035487 0.210707 0.012145 +v -0.040608 0.220274 0.012853 +v -0.043879 0.217130 0.006410 +v -0.033897 0.214835 0.016582 +v -0.037965 0.223320 0.017154 +v -0.040818 0.233063 0.018343 +v -0.044135 0.231831 0.014406 +v -0.048201 0.230348 0.008427 +v -0.029844 0.236719 0.025263 +v -0.030185 0.241198 0.026051 +v -0.032593 0.241684 0.025090 +v -0.032309 0.236098 0.024284 +v -0.029395 0.245934 0.026864 +v -0.031608 0.247425 0.025792 +v -0.034266 0.248838 0.024492 +v -0.035184 0.242133 0.023573 +v -0.034895 0.235255 0.022860 +v -0.047535 0.209693 -0.042553 +v -0.052247 0.217580 -0.048759 +v -0.050678 0.214675 -0.036768 +v -0.055763 0.223181 -0.042506 +v -0.060430 0.231448 -0.047257 +v -0.056956 0.225492 -0.053715 +v -0.040449 0.201745 -0.010338 +v -0.039165 0.204110 -0.001879 +v -0.047228 0.214342 -0.002460 +v -0.049217 0.211740 -0.013003 +v -0.053172 0.228533 -0.000734 +v -0.057866 0.227850 -0.014233 +v -0.066245 0.249450 -0.029037 +v -0.064102 0.239326 -0.038824 +v -0.060084 0.229749 -0.033631 +v -0.063421 0.239254 -0.022914 +v -0.054969 0.219444 -0.028073 +v -0.060271 0.262308 -0.002868 +v -0.063649 0.266551 -0.008687 +v -0.064185 0.252767 -0.014530 +v -0.060287 0.246754 -0.006837 +v -0.065936 0.272677 -0.013522 +v -0.066531 0.261161 -0.020523 +v -0.050612 0.244766 0.009411 +v -0.055563 0.244873 0.001865 +v -0.050586 0.260914 0.010244 +v -0.055988 0.260438 0.003331 +v -0.045228 0.205435 -0.030381 +v -0.047958 0.208772 -0.023036 +v -0.038615 0.196654 -0.023838 +v -0.040093 0.199519 -0.017892 +v -0.036150 0.192915 -0.028383 +v -0.042551 0.201058 -0.035553 +v -0.025545 0.237758 0.026378 +v -0.023462 0.238275 0.026986 +v -0.023879 0.239819 0.027815 +v -0.026022 0.240132 0.027436 +v -0.021569 0.238884 0.027189 +v -0.021769 0.239697 0.028195 +v -0.021827 0.240907 0.028739 +v -0.023811 0.241601 0.028633 +v -0.025680 0.242764 0.028289 +v -0.027568 0.237247 0.025887 +v -0.028026 0.240646 0.026857 +v -0.027482 0.244302 0.027772 +v -0.019228 0.239285 0.026512 +v -0.019372 0.239647 0.026881 +v -0.020264 0.239733 0.027780 +v -0.020198 0.239249 0.026874 +v -0.019178 0.239994 0.027567 +v -0.020280 0.240421 0.028465 +v -0.032119 0.218932 0.019506 +v -0.035546 0.226101 0.020128 +v -0.030514 0.222589 0.021632 +v -0.033228 0.228586 0.022129 +v -0.037690 0.234242 0.020944 +v -0.028742 0.225838 0.023168 +v -0.030920 0.230740 0.023384 +v -0.026737 0.228683 0.024206 +v -0.028399 0.232554 0.024069 +v -0.008332 0.198198 0.030820 +v -0.007906 0.194473 0.025654 +v -0.001292 0.193695 0.027342 +v -0.001392 0.197979 0.032984 +v -0.007313 0.192060 0.019374 +v -0.001093 0.191443 0.020599 +v -0.006231 0.186930 0.008457 +v -0.001127 0.186565 0.009679 +v -0.001094 0.189343 0.014638 +v -0.006868 0.189960 0.013488 +v -0.017473 0.199486 0.024896 +v -0.017013 0.195699 0.020226 +v -0.012838 0.195014 0.023122 +v -0.013297 0.198759 0.027898 +v -0.015969 0.193385 0.014446 +v -0.011964 0.192653 0.017254 +v -0.015281 0.187832 0.003905 +v -0.010784 0.187269 0.006451 +v -0.011344 0.190456 0.011505 +v -0.015406 0.191047 0.008817 +v -0.025761 0.191092 -0.002927 +v -0.025240 0.193992 0.002854 +v -0.031519 0.197739 0.000168 +v -0.032650 0.195033 -0.006677 +v -0.024671 0.196917 0.008903 +v -0.030313 0.200564 0.007042 +v -0.025153 0.199769 0.014756 +v -0.029877 0.203939 0.013059 +v -0.025195 0.203883 0.019189 +v -0.029414 0.208293 0.017426 +v -0.020205 0.188827 0.000749 +v -0.019974 0.191972 0.005844 +v -0.020115 0.194647 0.011516 +v -0.021025 0.197193 0.017242 +v -0.021466 0.201014 0.021901 +v -0.024866 0.208555 0.022439 +v -0.028361 0.213007 0.020303 +v -0.023825 0.213413 0.024240 +v -0.027194 0.217445 0.022344 +v -0.022671 0.217904 0.025293 +v -0.025939 0.221486 0.023830 +v -0.021676 0.222045 0.026266 +v -0.024554 0.225136 0.024973 +v -0.016675 0.208848 0.029414 +v -0.015654 0.213502 0.029839 +v -0.019229 0.215227 0.027431 +v -0.020379 0.210575 0.026730 +v -0.014485 0.217904 0.029652 +v -0.018204 0.219591 0.027893 +v -0.018259 0.238946 0.027005 +v -0.018814 0.239027 0.026598 +v -0.019777 0.238639 0.026782 +v -0.019163 0.238090 0.027073 +v -0.021024 0.237957 0.026768 +v -0.020257 0.237010 0.026876 +v -0.024743 0.231247 0.025002 +v -0.026260 0.234129 0.024839 +v -0.023137 0.233551 0.025586 +v -0.024470 0.235625 0.025571 +v -0.022630 0.236968 0.026352 +v -0.021591 0.235505 0.026328 +v -0.019862 0.229425 0.027901 +v -0.021769 0.231486 0.026555 +v -0.023119 0.228462 0.026018 +v -0.020750 0.225887 0.027155 +v -0.017911 0.235272 0.028764 +v -0.019282 0.236102 0.027510 +v -0.020506 0.234106 0.027230 +v -0.018994 0.232630 0.028470 +v -0.016107 0.238509 0.028473 +v -0.017424 0.238814 0.027641 +v -0.018341 0.237663 0.027647 +v -0.016914 0.237181 0.028754 +v -0.011878 0.238755 0.032084 +v -0.014358 0.238426 0.030045 +v -0.015017 0.236706 0.030776 +v -0.012546 0.236074 0.033048 +v -0.015823 0.234187 0.030830 +v -0.013031 0.233021 0.033115 +v -0.016514 0.230996 0.030356 +v -0.013272 0.229593 0.032247 +v -0.016944 0.227498 0.029542 +v -0.013240 0.226023 0.030760 +v -0.017412 0.223710 0.028546 +v -0.013635 0.222109 0.029847 +v -0.006083 0.216781 0.033107 +v -0.005334 0.220730 0.031904 +v -0.009667 0.221170 0.030792 +v -0.010573 0.216984 0.031290 +v -0.005130 0.224468 0.032373 +v -0.009403 0.224995 0.031857 +v -0.011736 0.212658 0.032074 +v -0.007072 0.212701 0.034467 +v -0.012697 0.208046 0.032085 +v -0.007898 0.208084 0.034922 +v -0.017416 0.204013 0.028000 +v -0.021231 0.205686 0.025043 +v -0.013319 0.203245 0.030950 +v -0.008293 0.203090 0.033776 +v -0.001187 0.208979 0.036810 +v -0.001369 0.203500 0.036186 +v -0.000496 0.217174 0.034696 +v -0.000896 0.213525 0.036118 +v -0.000160 0.220633 0.032969 +v -0.000198 0.224303 0.032319 +v -0.009629 0.228519 0.033698 +v -0.005324 0.227967 0.034140 +v -0.005636 0.231819 0.036028 +v -0.009766 0.232257 0.035219 +v -0.005274 0.238679 0.036140 +v -0.008595 0.238815 0.034282 +v -0.009467 0.235721 0.035556 +v -0.005823 0.235562 0.037222 +v -0.001463 0.235278 0.037779 +v -0.000936 0.231525 0.035567 +v -0.001555 0.238684 0.037072 +v -0.000551 0.227822 0.033620 +v -0.066956 0.247955 -0.054258 +v -0.068225 0.254128 -0.056550 +v -0.066111 0.249239 -0.060390 +v -0.064158 0.242247 -0.058938 +v -0.069067 0.258593 -0.057961 +v -0.067476 0.254665 -0.061150 +v -0.066074 0.252522 -0.064836 +v -0.064486 0.240094 -0.051112 +v -0.061074 0.234092 -0.056767 +v -0.067510 0.280111 -0.016795 +v -0.068351 0.270468 -0.024879 +v -0.068527 0.289369 -0.018502 +v -0.069941 0.281356 -0.027203 +v -0.071124 0.271691 -0.039574 +v -0.068712 0.259785 -0.034224 +v -0.069230 0.257230 -0.048143 +v -0.067297 0.248928 -0.043545 +v -0.072008 0.273167 -0.052872 +v -0.070487 0.264888 -0.054901 +v -0.070139 0.262166 -0.052215 +v -0.072079 0.272886 -0.048608 +v -0.038215 0.242586 0.021525 +v -0.041908 0.243155 0.018890 +v -0.037345 0.250420 0.022562 +v -0.041257 0.252470 0.020052 +v -0.046054 0.244027 0.014995 +v -0.045774 0.255352 0.016184 +v -0.009112 0.183964 0.002162 +v -0.003914 0.183624 0.004319 +v -0.014294 0.184805 -0.000181 +v -0.012562 0.182846 -0.002669 +v -0.007285 0.181482 -0.001704 +v -0.000538 0.184234 0.006277 +v -0.008591 0.178272 -0.013195 +v -0.019664 0.181869 -0.016334 +v -0.008666 0.179180 -0.009829 +v -0.020704 0.183898 -0.011484 +v -0.028719 0.186812 -0.021752 +v -0.030794 0.189797 -0.017662 +v -0.024986 0.188145 -0.007817 +v -0.032254 0.192650 -0.012795 +v -0.015360 0.182914 -0.005810 +v -0.019133 0.185947 -0.003516 +v -0.007564 0.180048 -0.005827 +v 0.076035 0.315360 -0.055672 +v 0.076625 0.310750 -0.058969 +v 0.076989 0.315982 -0.062721 +v 0.076765 0.322645 -0.060580 +v 0.076837 0.307033 -0.060191 +v 0.077310 0.312400 -0.063295 +v 0.078176 0.315648 -0.068542 +v 0.077774 0.320334 -0.068679 +v 0.078515 0.301516 -0.061735 +v 0.079149 0.305687 -0.062079 +v 0.078509 0.307116 -0.061830 +v 0.077753 0.302085 -0.061086 +v 0.079884 0.309040 -0.062960 +v 0.079201 0.310444 -0.063059 +v 0.078713 0.312142 -0.064356 +v 0.078056 0.308650 -0.062050 +v 0.077337 0.302932 -0.060671 +v 0.077725 0.310180 -0.062609 +v 0.077030 0.304377 -0.060482 +v 0.078174 0.313018 -0.065253 +v 0.091968 0.304360 -0.092114 +v 0.092669 0.303906 -0.091364 +v 0.092378 0.306838 -0.090544 +v 0.091505 0.307397 -0.091286 +v 0.093017 0.303112 -0.090552 +v 0.092693 0.306038 -0.089918 +v 0.092328 0.308537 -0.088456 +v 0.092099 0.309425 -0.089142 +v 0.091119 0.310010 -0.089752 +v 0.093127 0.300647 -0.091491 +v 0.093601 0.299854 -0.090622 +v 0.092540 0.301046 -0.092022 +v 0.092770 0.298686 -0.092108 +v 0.092982 0.297614 -0.091761 +v 0.093463 0.296435 -0.090804 +v 0.094308 0.299276 -0.089770 +v 0.093779 0.302348 -0.089682 +v 0.094396 0.295827 -0.089515 +v 0.095637 0.295713 -0.089468 +v 0.095363 0.299149 -0.089618 +v 0.095001 0.302089 -0.089487 +v 0.096278 0.304289 -0.092993 +v 0.096490 0.300853 -0.093559 +v 0.095343 0.301507 -0.094750 +v 0.094898 0.305221 -0.094102 +v 0.096370 0.296880 -0.093857 +v 0.095443 0.297213 -0.095078 +v 0.093746 0.297371 -0.095880 +v 0.093330 0.301955 -0.095456 +v 0.092588 0.305895 -0.094735 +v 0.095578 0.307847 -0.088664 +v 0.096112 0.305449 -0.090060 +v 0.096308 0.306215 -0.090879 +v 0.095851 0.308708 -0.089479 +v 0.096326 0.302799 -0.091048 +v 0.096510 0.303447 -0.091945 +v 0.096057 0.307184 -0.091822 +v 0.095697 0.309791 -0.090327 +v 0.096646 0.296109 -0.091494 +v 0.096405 0.295868 -0.090476 +v 0.096337 0.291862 -0.090769 +v 0.096568 0.291965 -0.091747 +v 0.095602 0.291806 -0.089520 +v 0.095200 0.287314 -0.089431 +v 0.095890 0.287265 -0.090431 +v 0.096161 0.287221 -0.091287 +v 0.096652 0.296475 -0.092588 +v 0.096517 0.292114 -0.092828 +v 0.096102 0.292275 -0.094031 +v 0.096063 0.287156 -0.092364 +v 0.095657 0.287086 -0.093474 +v 0.096194 0.299379 -0.090374 +v 0.095852 0.302348 -0.090177 +v 0.096515 0.299728 -0.091361 +v 0.096697 0.300234 -0.092396 +v 0.094640 0.308311 -0.092903 +v 0.094475 0.310990 -0.091245 +v 0.092246 0.309085 -0.093413 +v 0.092140 0.311819 -0.091485 +v 0.094274 0.314675 -0.085927 +v 0.095238 0.312337 -0.088551 +v 0.094096 0.313658 -0.089298 +v 0.093267 0.316136 -0.086412 +v 0.091689 0.314520 -0.089316 +v 0.091040 0.316994 -0.086317 +v 0.094042 0.311947 -0.084546 +v 0.094894 0.310135 -0.086994 +v 0.095325 0.311109 -0.087767 +v 0.094309 0.313274 -0.085354 +v 0.087453 0.315600 -0.079544 +v 0.088585 0.315275 -0.082084 +v 0.089304 0.314875 -0.081141 +v 0.088061 0.315477 -0.078303 +v 0.089433 0.314249 -0.085340 +v 0.090426 0.313597 -0.084563 +v 0.090545 0.312589 -0.083778 +v 0.089364 0.313914 -0.080398 +v 0.087910 0.314518 -0.076825 +v 0.092062 0.310584 -0.083210 +v 0.090919 0.311703 -0.079814 +v 0.089663 0.312712 -0.080072 +v 0.090850 0.311415 -0.083297 +v 0.089573 0.313011 -0.077025 +v 0.088762 0.313694 -0.077013 +v 0.092735 0.307529 -0.087614 +v 0.091997 0.309719 -0.085884 +v 0.091662 0.310754 -0.086565 +v 0.093967 0.306960 -0.087250 +v 0.092970 0.309192 -0.085708 +v 0.092246 0.312274 -0.080156 +v 0.090627 0.313430 -0.077063 +v 0.093308 0.310941 -0.083756 +v 0.092787 0.313526 -0.080885 +v 0.091481 0.314796 -0.077375 +v 0.094109 0.309469 -0.086264 +v 0.095038 0.307207 -0.087819 +v 0.095566 0.304910 -0.089259 +v 0.094608 0.304651 -0.088663 +v 0.093328 0.305056 -0.088935 +v 0.090325 0.312370 -0.088004 +v 0.091439 0.311738 -0.087345 +v 0.091060 0.301906 -0.095441 +v 0.090119 0.305794 -0.094357 +v 0.091737 0.297292 -0.096028 +v 0.089713 0.296873 -0.095203 +v 0.088985 0.301182 -0.094026 +v 0.088140 0.304716 -0.092299 +v 0.090628 0.286949 -0.094571 +v 0.089415 0.286867 -0.093494 +v 0.088802 0.291878 -0.093581 +v 0.090141 0.292170 -0.095259 +v 0.088509 0.286936 -0.092150 +v 0.087830 0.291749 -0.091556 +v 0.086916 0.296162 -0.090745 +v 0.088170 0.296435 -0.092879 +v 0.089881 0.275986 -0.089989 +v 0.088919 0.276537 -0.089603 +v 0.089713 0.281526 -0.091982 +v 0.090729 0.281284 -0.092695 +v 0.088256 0.277268 -0.089076 +v 0.088963 0.281874 -0.091320 +v 0.091825 0.278056 -0.086025 +v 0.090285 0.274387 -0.083350 +v 0.090581 0.274204 -0.083542 +v 0.092257 0.278041 -0.086372 +v 0.089110 0.272198 -0.080675 +v 0.088750 0.271388 -0.080088 +v 0.088673 0.270387 -0.079613 +v 0.090806 0.273720 -0.083466 +v 0.092764 0.277799 -0.086568 +v 0.088472 0.316862 -0.085067 +v 0.087811 0.318350 -0.081740 +v 0.090276 0.318767 -0.082747 +v 0.086048 0.315838 -0.082963 +v 0.085458 0.316989 -0.079978 +v 0.084357 0.317642 -0.076856 +v 0.086444 0.319158 -0.078096 +v 0.088639 0.319767 -0.078890 +v 0.085790 0.313814 -0.076107 +v 0.086442 0.314745 -0.077508 +v 0.086302 0.314921 -0.076283 +v 0.085015 0.313486 -0.074939 +v 0.085906 0.314426 -0.074729 +v 0.083544 0.313033 -0.072737 +v 0.086291 0.313700 -0.073776 +v 0.085610 0.313385 -0.073496 +v 0.084508 0.312300 -0.071745 +v 0.084025 0.312760 -0.071778 +v 0.089067 0.268297 -0.079586 +v 0.088837 0.269359 -0.079441 +v 0.086582 0.266473 -0.075949 +v 0.086799 0.264923 -0.076040 +v 0.086507 0.268121 -0.076231 +v 0.084703 0.266319 -0.073485 +v 0.084860 0.264031 -0.073019 +v 0.085076 0.262057 -0.073066 +v 0.083989 0.270544 -0.071542 +v 0.085108 0.272344 -0.072989 +v 0.084816 0.273639 -0.071732 +v 0.083665 0.271851 -0.070206 +v 0.086905 0.273502 -0.075215 +v 0.086675 0.274786 -0.073786 +v 0.085544 0.276329 -0.072861 +v 0.083781 0.275106 -0.071116 +v 0.082883 0.273576 -0.069442 +v 0.082613 0.311654 -0.078920 +v 0.082089 0.312996 -0.076799 +v 0.083578 0.314879 -0.078201 +v 0.084111 0.313790 -0.080705 +v 0.081318 0.314129 -0.074644 +v 0.082688 0.315791 -0.075616 +v 0.082337 0.269795 -0.068808 +v 0.082709 0.268068 -0.070220 +v 0.082066 0.271587 -0.067667 +v 0.081164 0.270028 -0.066686 +v 0.080674 0.267895 -0.067352 +v 0.081397 0.263942 -0.067514 +v 0.080634 0.307615 -0.063359 +v 0.081509 0.310308 -0.064427 +v 0.080770 0.311444 -0.064315 +v 0.081449 0.306187 -0.064124 +v 0.082331 0.309026 -0.064786 +v 0.083534 0.312084 -0.066016 +v 0.082851 0.313274 -0.065801 +v 0.082028 0.314139 -0.065893 +v 0.077911 0.304667 -0.066502 +v 0.077021 0.303355 -0.066724 +v 0.077174 0.303954 -0.066841 +v 0.077763 0.305156 -0.066865 +v 0.076434 0.302508 -0.067135 +v 0.076960 0.303495 -0.067026 +v 0.077594 0.305042 -0.067181 +v 0.076320 0.301835 -0.066934 +v 0.076298 0.302180 -0.066995 +v 0.076724 0.302785 -0.066819 +v 0.076940 0.302895 -0.066529 +v 0.077017 0.274972 -0.071922 +v 0.078022 0.275277 -0.071973 +v 0.078905 0.275493 -0.073983 +v 0.077587 0.275791 -0.074014 +v 0.078553 0.275766 -0.071656 +v 0.079667 0.275805 -0.073461 +v 0.080949 0.276344 -0.075304 +v 0.079845 0.276301 -0.076135 +v 0.078437 0.277703 -0.076442 +v 0.081192 0.314697 -0.066224 +v 0.080146 0.312523 -0.064628 +v 0.080601 0.314831 -0.066622 +v 0.079777 0.313765 -0.065723 +v 0.076497 0.274442 -0.070256 +v 0.077127 0.274955 -0.070268 +v 0.075933 0.273998 -0.069321 +v 0.076281 0.274194 -0.068897 +v 0.076469 0.274484 -0.068344 +v 0.077491 0.275464 -0.069844 +v 0.077082 0.290180 -0.072510 +v 0.076142 0.291921 -0.072009 +v 0.076108 0.292342 -0.070978 +v 0.077132 0.290970 -0.071232 +v 0.075694 0.293255 -0.071632 +v 0.075185 0.293723 -0.070748 +v 0.075143 0.295026 -0.069403 +v 0.076213 0.293477 -0.069804 +v 0.077362 0.292331 -0.070211 +v 0.076984 0.300295 -0.070349 +v 0.076544 0.300970 -0.069057 +v 0.076061 0.300494 -0.069145 +v 0.076337 0.299880 -0.070443 +v 0.076332 0.301575 -0.068088 +v 0.075968 0.301110 -0.068227 +v 0.075672 0.300803 -0.068049 +v 0.075586 0.300006 -0.069041 +v 0.075791 0.299258 -0.070360 +v 0.076321 0.302075 -0.067522 +v 0.076087 0.301525 -0.067722 +v 0.075971 0.301605 -0.067559 +v 0.075981 0.301560 -0.067345 +v 0.075881 0.301186 -0.067480 +v 0.075317 0.300118 -0.068020 +v 0.075200 0.299381 -0.068821 +v 0.075160 0.299528 -0.067804 +v 0.074898 0.298681 -0.068533 +v 0.074796 0.297614 -0.069699 +v 0.075247 0.298518 -0.070079 +v 0.075980 0.301037 -0.067139 +v 0.075614 0.300688 -0.067589 +v 0.075804 0.300592 -0.067233 +v 0.075491 0.300162 -0.067424 +v 0.075231 0.298849 -0.067490 +v 0.074870 0.297805 -0.068199 +v 0.075773 0.297900 -0.067273 +v 0.075321 0.296558 -0.068102 +v 0.074664 0.296525 -0.069409 +v 0.075680 0.299662 -0.067123 +v 0.076107 0.300358 -0.066918 +v 0.076804 0.299912 -0.066652 +v 0.076293 0.298970 -0.066854 +v 0.079368 0.298411 -0.067444 +v 0.079722 0.299621 -0.067004 +v 0.080233 0.298948 -0.066170 +v 0.080018 0.297386 -0.066824 +v 0.080233 0.300934 -0.066609 +v 0.080699 0.300640 -0.065681 +v 0.080372 0.300658 -0.064285 +v 0.080097 0.298346 -0.064853 +v 0.080015 0.296272 -0.065694 +v 0.080905 0.302487 -0.066319 +v 0.081261 0.302670 -0.065309 +v 0.081594 0.304457 -0.066186 +v 0.081902 0.305070 -0.065227 +v 0.080799 0.303298 -0.063985 +v 0.081995 0.317479 -0.070837 +v 0.081154 0.316263 -0.068313 +v 0.082284 0.316810 -0.068399 +v 0.083445 0.318508 -0.071173 +v 0.083479 0.316784 -0.068250 +v 0.085046 0.318839 -0.071288 +v 0.084568 0.316170 -0.068126 +v 0.086477 0.318322 -0.071243 +v 0.085344 0.315043 -0.068121 +v 0.087395 0.317219 -0.071122 +v 0.083136 0.317942 -0.073724 +v 0.084821 0.319271 -0.074445 +v 0.086778 0.319785 -0.074872 +v 0.087717 0.315588 -0.071071 +v 0.089941 0.316611 -0.074296 +v 0.089571 0.318282 -0.074630 +v 0.087478 0.313839 -0.071097 +v 0.089591 0.314848 -0.074121 +v 0.091805 0.316457 -0.077909 +v 0.091643 0.318043 -0.078456 +v 0.092915 0.315007 -0.081628 +v 0.092855 0.316494 -0.082259 +v 0.090503 0.319312 -0.078919 +v 0.092255 0.317998 -0.082676 +v 0.088461 0.319379 -0.074909 +v 0.083694 0.309250 -0.067149 +v 0.085437 0.311877 -0.068722 +v 0.085650 0.313483 -0.068333 +v 0.083978 0.310584 -0.066503 +v 0.076497 0.301089 -0.066713 +v 0.077302 0.300865 -0.066469 +v 0.076905 0.301978 -0.066451 +v 0.077993 0.302245 -0.066296 +v 0.077257 0.302752 -0.066411 +v 0.077940 0.303562 -0.066223 +v 0.080826 0.304245 -0.066723 +v 0.081658 0.306083 -0.066867 +v 0.082457 0.306732 -0.066393 +v 0.080102 0.304289 -0.066778 +v 0.080506 0.305486 -0.066861 +v 0.081545 0.307589 -0.067577 +v 0.082989 0.308165 -0.067705 +v 0.079208 0.303496 -0.066588 +v 0.079082 0.304665 -0.066422 +v 0.079387 0.306083 -0.066657 +v 0.087877 0.313283 -0.074069 +v 0.087090 0.313357 -0.074009 +v 0.085850 0.312063 -0.071517 +v 0.085044 0.312069 -0.071687 +v 0.088784 0.313665 -0.074081 +v 0.086784 0.312596 -0.071259 +v 0.082682 0.310638 -0.069473 +v 0.082051 0.311151 -0.069466 +v 0.080801 0.308742 -0.067849 +v 0.080232 0.309049 -0.067956 +v 0.079774 0.309171 -0.068151 +v 0.081266 0.311384 -0.069677 +v 0.081263 0.308362 -0.067835 +v 0.079798 0.307132 -0.066979 +v 0.079167 0.307003 -0.066924 +v 0.078555 0.307155 -0.067377 +v 0.078747 0.307066 -0.067135 +v 0.083187 0.310228 -0.069517 +v 0.083868 0.310064 -0.069406 +v 0.084730 0.310643 -0.069166 +v 0.082800 0.307702 -0.065555 +v 0.079980 0.302800 -0.066827 +v 0.079102 0.301540 -0.066869 +v 0.078494 0.300332 -0.066975 +v 0.078058 0.299240 -0.067116 +v 0.079233 0.292721 -0.067596 +v 0.079101 0.294196 -0.068350 +v 0.079634 0.295810 -0.067547 +v 0.079785 0.294436 -0.066590 +v 0.078454 0.295591 -0.068572 +v 0.078967 0.297086 -0.067953 +v 0.078080 0.289005 -0.070012 +v 0.078079 0.290821 -0.070152 +v 0.078536 0.292559 -0.069220 +v 0.078625 0.290991 -0.068671 +v 0.077856 0.293955 -0.069352 +v 0.077640 0.298123 -0.067428 +v 0.077196 0.296788 -0.067975 +v 0.076602 0.295145 -0.068715 +v 0.078022 0.286915 -0.073374 +v 0.077892 0.288398 -0.072924 +v 0.077859 0.289280 -0.071422 +v 0.077872 0.287371 -0.071780 +v 0.079600 0.278897 -0.078877 +v 0.079863 0.281360 -0.079923 +v 0.078415 0.280628 -0.077606 +v 0.080572 0.279717 -0.080196 +v 0.081326 0.281788 -0.081284 +v 0.081792 0.285357 -0.081521 +v 0.080430 0.284707 -0.080374 +v 0.078866 0.283703 -0.078068 +v 0.083241 0.279169 -0.079059 +v 0.081909 0.279072 -0.080003 +v 0.080659 0.277629 -0.078062 +v 0.081878 0.277538 -0.077148 +v 0.086945 0.269749 -0.077112 +v 0.088029 0.271489 -0.079045 +v 0.086426 0.271222 -0.076609 +v 0.085093 0.268680 -0.074580 +v 0.086849 0.272469 -0.076243 +v 0.085493 0.271628 -0.073986 +v 0.084665 0.270272 -0.073331 +v 0.083313 0.264897 -0.070935 +v 0.083687 0.267853 -0.072181 +v 0.093060 0.292824 -0.090465 +v 0.094203 0.291961 -0.089207 +v 0.093026 0.288287 -0.089452 +v 0.094092 0.287467 -0.088933 +v 0.093522 0.282587 -0.088294 +v 0.092867 0.282550 -0.088008 +v 0.094272 0.282457 -0.088650 +v 0.083202 0.278058 -0.076073 +v 0.084927 0.279515 -0.077741 +v 0.081832 0.276764 -0.074449 +v 0.082799 0.277279 -0.073502 +v 0.084885 0.278649 -0.075125 +v 0.086844 0.279631 -0.076937 +v 0.084599 0.285783 -0.081489 +v 0.084407 0.281951 -0.080734 +v 0.086185 0.282092 -0.079382 +v 0.086227 0.285702 -0.080482 +v 0.088331 0.282038 -0.078483 +v 0.088662 0.285438 -0.079674 +v 0.076749 0.299305 -0.072089 +v 0.077559 0.299731 -0.071918 +v 0.076094 0.298596 -0.072007 +v 0.076458 0.297907 -0.073955 +v 0.077439 0.298824 -0.073998 +v 0.078604 0.299195 -0.073731 +v 0.082199 0.294336 -0.079063 +v 0.080675 0.294267 -0.079460 +v 0.082780 0.290103 -0.081264 +v 0.084204 0.290164 -0.080965 +v 0.079293 0.293569 -0.078912 +v 0.081371 0.289508 -0.080773 +v 0.083217 0.285663 -0.082032 +v 0.075550 0.297592 -0.071723 +v 0.075116 0.296446 -0.071312 +v 0.075850 0.295268 -0.072834 +v 0.076006 0.296662 -0.073509 +v 0.074970 0.295165 -0.070821 +v 0.075583 0.293954 -0.072147 +v 0.076305 0.292353 -0.073005 +v 0.076677 0.293665 -0.074219 +v 0.077356 0.290230 -0.073959 +v 0.077803 0.291017 -0.075692 +v 0.076977 0.295216 -0.075467 +v 0.077488 0.296744 -0.076496 +v 0.078377 0.292405 -0.077546 +v 0.078939 0.297896 -0.076735 +v 0.080421 0.297992 -0.076229 +v 0.076762 0.302187 -0.067786 +v 0.076721 0.302848 -0.067309 +v 0.077171 0.302909 -0.067609 +v 0.077219 0.303774 -0.067257 +v 0.077639 0.300713 -0.070071 +v 0.077063 0.301495 -0.068742 +v 0.078304 0.301218 -0.069619 +v 0.077543 0.302128 -0.068372 +v 0.078542 0.299888 -0.071512 +v 0.079536 0.300324 -0.071010 +v 0.079841 0.299046 -0.073124 +v 0.081168 0.299350 -0.072283 +v 0.081693 0.297536 -0.075329 +v 0.083153 0.297763 -0.074121 +v 0.083704 0.294085 -0.078448 +v 0.086234 0.294463 -0.077890 +v 0.085723 0.289958 -0.080294 +v 0.088022 0.289612 -0.079741 +v 0.082861 0.281834 -0.081676 +v 0.080049 0.288371 -0.079581 +v 0.079036 0.287315 -0.077507 +v 0.078312 0.287552 -0.074968 +v 0.078176 0.285185 -0.075035 +v 0.076549 0.284885 -0.072765 +v 0.076318 0.282423 -0.074231 +v 0.076644 0.287358 -0.069969 +v 0.074703 0.286100 -0.069856 +v 0.073229 0.260992 -0.057689 +v 0.074375 0.260091 -0.057864 +v 0.075238 0.261326 -0.057873 +v 0.074312 0.262828 -0.057648 +v 0.075193 0.259523 -0.058023 +v 0.075909 0.260333 -0.058223 +v 0.076374 0.261112 -0.058493 +v 0.076208 0.262313 -0.058514 +v 0.075520 0.264890 -0.058995 +v 0.077323 0.262500 -0.059443 +v 0.076784 0.264924 -0.060624 +v 0.077247 0.260713 -0.059020 +v 0.078365 0.259846 -0.059932 +v 0.078712 0.261940 -0.060639 +v 0.077926 0.264552 -0.062461 +v 0.076625 0.259413 -0.058766 +v 0.075410 0.258773 -0.058502 +v 0.075839 0.257444 -0.059150 +v 0.077403 0.258352 -0.059533 +v 0.078124 0.257189 -0.060597 +v 0.079538 0.258754 -0.061231 +v 0.076495 0.256307 -0.060232 +v 0.077136 0.255630 -0.061166 +v 0.078502 0.256203 -0.061827 +v 0.080167 0.257472 -0.062606 +v 0.080129 0.261072 -0.062382 +v 0.079257 0.263924 -0.064531 +v 0.081394 0.259692 -0.063978 +v 0.080063 0.270332 -0.065713 +v 0.078901 0.267370 -0.065756 +v 0.077967 0.270890 -0.064482 +v 0.077354 0.267608 -0.064102 +v 0.074984 0.269451 -0.061441 +v 0.075363 0.267630 -0.060615 +v 0.076144 0.267529 -0.062250 +v 0.075885 0.269781 -0.062997 +v 0.074725 0.269832 -0.060399 +v 0.074821 0.268415 -0.059761 +v 0.074729 0.270370 -0.059992 +v 0.074457 0.269776 -0.059598 +v 0.074019 0.268649 -0.058711 +v 0.074491 0.266675 -0.058563 +v 0.073041 0.267057 -0.057571 +v 0.073569 0.264624 -0.057530 +v 0.071461 0.264331 -0.057636 +v 0.072256 0.262258 -0.057665 +v 0.074173 0.273015 -0.068009 +v 0.075266 0.273396 -0.068807 +v 0.075379 0.274073 -0.069768 +v 0.074082 0.273855 -0.068890 +v 0.075656 0.275062 -0.071239 +v 0.073948 0.275548 -0.069905 +v 0.076083 0.276494 -0.072971 +v 0.074464 0.277553 -0.071599 +v 0.076580 0.278359 -0.074452 +v 0.074683 0.279693 -0.072435 +v 0.076684 0.280362 -0.074965 +v 0.074494 0.281856 -0.071867 +v 0.073080 0.270392 -0.058060 +v 0.072298 0.269357 -0.057023 +v 0.073929 0.271197 -0.059110 +v 0.073739 0.274100 -0.058593 +v 0.073438 0.274388 -0.057489 +v 0.073129 0.274780 -0.056202 +v 0.077759 0.286141 -0.063398 +v 0.077586 0.286069 -0.062876 +v 0.077633 0.284203 -0.062365 +v 0.077816 0.283978 -0.062909 +v 0.077409 0.285933 -0.062514 +v 0.077373 0.284757 -0.062039 +v 0.076986 0.283024 -0.061243 +v 0.077345 0.282202 -0.061900 +v 0.077595 0.281829 -0.062587 +v 0.076825 0.287919 -0.062145 +v 0.077025 0.285951 -0.061699 +v 0.077213 0.285787 -0.062021 +v 0.077135 0.286793 -0.062429 +v 0.076912 0.289004 -0.062788 +v 0.076943 0.290820 -0.062239 +v 0.076621 0.289428 -0.061394 +v 0.077092 0.289438 -0.063458 +v 0.077321 0.291223 -0.063299 +v 0.078041 0.293692 -0.063129 +v 0.076989 0.293146 -0.061187 +v 0.076232 0.291538 -0.059614 +v 0.077058 0.290220 -0.065982 +v 0.075984 0.289419 -0.066266 +v 0.075642 0.289259 -0.067135 +v 0.076319 0.289345 -0.067617 +v 0.075479 0.289197 -0.066340 +v 0.075289 0.289287 -0.066858 +v 0.075007 0.289036 -0.067237 +v 0.075062 0.288666 -0.067816 +v 0.077647 0.289819 -0.068097 +v 0.078471 0.291461 -0.066840 +v 0.079112 0.293150 -0.065626 +v 0.077981 0.291902 -0.064843 +v 0.079330 0.295184 -0.064493 +v 0.076846 0.286811 -0.065437 +v 0.076286 0.287151 -0.065754 +v 0.076127 0.288575 -0.065922 +v 0.076602 0.288525 -0.065583 +v 0.075573 0.287718 -0.065997 +v 0.075672 0.288663 -0.066129 +v 0.077034 0.289046 -0.064481 +v 0.077239 0.287966 -0.064517 +v 0.076934 0.288226 -0.065051 +v 0.076972 0.289628 -0.064915 +v 0.077699 0.286313 -0.064448 +v 0.077385 0.286536 -0.065005 +v 0.077798 0.286191 -0.063917 +v 0.077361 0.287920 -0.064063 +v 0.077332 0.287846 -0.063555 +v 0.077092 0.289339 -0.064088 +v 0.077255 0.290680 -0.064306 +v 0.077223 0.287528 -0.062987 +v 0.077859 0.283897 -0.063502 +v 0.077731 0.283957 -0.064139 +v 0.077631 0.281625 -0.063287 +v 0.077481 0.281607 -0.063902 +v 0.073023 0.275713 -0.064839 +v 0.073306 0.275363 -0.064213 +v 0.072963 0.273976 -0.064749 +v 0.072590 0.274438 -0.065338 +v 0.073593 0.275098 -0.063633 +v 0.073118 0.273778 -0.063952 +v 0.073349 0.272733 -0.064571 +v 0.072955 0.273028 -0.065399 +v 0.072636 0.273517 -0.066150 +v 0.076718 0.282243 -0.064861 +v 0.076301 0.282841 -0.065197 +v 0.076627 0.285204 -0.065602 +v 0.077144 0.284672 -0.065287 +v 0.075878 0.283557 -0.065452 +v 0.076014 0.285719 -0.065687 +v 0.077489 0.284205 -0.064794 +v 0.077153 0.281795 -0.064453 +v 0.077067 0.279337 -0.064669 +v 0.076594 0.279774 -0.064996 +v 0.077396 0.279217 -0.064132 +v 0.076674 0.277119 -0.063789 +v 0.076252 0.277155 -0.064327 +v 0.075878 0.277475 -0.064804 +v 0.075493 0.278075 -0.065118 +v 0.076103 0.280456 -0.065199 +v 0.074961 0.278899 -0.065343 +v 0.075509 0.281301 -0.065313 +v 0.074368 0.276585 -0.064451 +v 0.073836 0.277193 -0.064773 +v 0.074816 0.276155 -0.064087 +v 0.075414 0.273232 -0.067962 +v 0.075601 0.273472 -0.067189 +v 0.074448 0.272719 -0.067101 +v 0.074795 0.272797 -0.066158 +v 0.074065 0.272402 -0.065287 +v 0.073607 0.272643 -0.066291 +v 0.073248 0.273097 -0.067042 +v 0.075544 0.273001 -0.064713 +v 0.076402 0.273811 -0.065879 +v 0.075872 0.273690 -0.066428 +v 0.075132 0.272935 -0.065289 +v 0.077027 0.274653 -0.066857 +v 0.076663 0.274706 -0.067564 +v 0.076419 0.272583 -0.064473 +v 0.075308 0.271566 -0.063360 +v 0.074775 0.272258 -0.063748 +v 0.074304 0.272538 -0.062410 +v 0.074688 0.271182 -0.061954 +v 0.077722 0.275757 -0.068990 +v 0.077761 0.275264 -0.067482 +v 0.079579 0.276012 -0.069019 +v 0.079049 0.276221 -0.070819 +v 0.080699 0.272865 -0.066820 +v 0.078877 0.273609 -0.066156 +v 0.081415 0.275183 -0.069123 +v 0.082484 0.276132 -0.071220 +v 0.081290 0.276337 -0.071839 +v 0.084010 0.277386 -0.072818 +v 0.080407 0.276141 -0.072678 +v 0.077327 0.273788 -0.065868 +v 0.074481 0.272328 -0.064382 +v 0.073629 0.272594 -0.063516 +v 0.074404 0.271684 -0.059771 +v 0.074700 0.271793 -0.060291 +v 0.074907 0.274218 -0.060330 +v 0.074298 0.273992 -0.059439 +v 0.074815 0.271466 -0.060848 +v 0.075212 0.273189 -0.061333 +v 0.075248 0.275670 -0.060591 +v 0.075154 0.278078 -0.059984 +v 0.074523 0.277269 -0.059068 +v 0.075807 0.276552 -0.061322 +v 0.076191 0.279178 -0.061085 +v 0.076196 0.282651 -0.060150 +v 0.075528 0.281832 -0.058919 +v 0.076974 0.277414 -0.063237 +v 0.076513 0.276184 -0.062600 +v 0.076043 0.275764 -0.063166 +v 0.076967 0.277928 -0.062892 +v 0.076558 0.277314 -0.062214 +v 0.075952 0.275324 -0.062039 +v 0.075350 0.274793 -0.062732 +v 0.074578 0.273847 -0.062352 +v 0.075535 0.274431 -0.061664 +v 0.073404 0.273742 -0.063023 +v 0.074246 0.274880 -0.063165 +v 0.075366 0.275857 -0.063716 +v 0.077406 0.279662 -0.062781 +v 0.077543 0.279386 -0.063490 +v 0.076993 0.279664 -0.062011 +v 0.076641 0.286614 -0.060892 +v 0.076228 0.286907 -0.059459 +v 0.074501 0.280407 -0.057331 +v 0.074910 0.280996 -0.057916 +v 0.075477 0.285872 -0.058002 +v 0.074619 0.283373 -0.056973 +v 0.075604 0.291139 -0.057985 +v 0.074990 0.289299 -0.056376 +v 0.074281 0.276972 -0.058237 +v 0.074057 0.277453 -0.057492 +v 0.073884 0.279017 -0.056755 +v 0.073892 0.281210 -0.055700 +v 0.070170 0.262913 -0.057602 +v 0.071703 0.268185 -0.055830 +v 0.072835 0.274981 -0.054656 +v 0.085600 0.279216 -0.089752 +v 0.085065 0.275699 -0.088559 +v 0.083054 0.274937 -0.088304 +v 0.083548 0.278714 -0.089619 +v 0.084582 0.273811 -0.086814 +v 0.082914 0.272242 -0.086455 +v 0.081105 0.270557 -0.084819 +v 0.080663 0.273261 -0.086909 +v 0.080229 0.277008 -0.089429 +v 0.081835 0.267123 -0.080877 +v 0.080286 0.266041 -0.079559 +v 0.080207 0.267166 -0.081223 +v 0.081560 0.268634 -0.082812 +v 0.079233 0.265445 -0.078793 +v 0.079005 0.265996 -0.079711 +v 0.078884 0.266796 -0.080933 +v 0.079794 0.268673 -0.082974 +v 0.083133 0.270382 -0.084622 +v 0.085014 0.272621 -0.086521 +v 0.085419 0.271624 -0.085145 +v 0.083474 0.268948 -0.082782 +v 0.086324 0.275595 -0.088019 +v 0.087011 0.274980 -0.087279 +v 0.087154 0.279164 -0.089210 +v 0.087859 0.278724 -0.088815 +v 0.084772 0.269734 -0.082955 +v 0.085071 0.270761 -0.083821 +v 0.087004 0.274163 -0.086729 +v 0.086889 0.273350 -0.086359 +v 0.087934 0.278022 -0.088811 +v 0.080643 0.264810 -0.076665 +v 0.081476 0.266049 -0.078975 +v 0.083263 0.267835 -0.081021 +v 0.082984 0.266679 -0.079834 +v 0.075162 0.262637 -0.070421 +v 0.074274 0.262600 -0.070090 +v 0.074962 0.263197 -0.071594 +v 0.076001 0.263459 -0.072295 +v 0.073786 0.262565 -0.070213 +v 0.074221 0.262870 -0.071345 +v 0.074681 0.263020 -0.072632 +v 0.075385 0.263442 -0.073345 +v 0.077001 0.264004 -0.074822 +v 0.078311 0.263305 -0.073597 +v 0.077250 0.263533 -0.073028 +v 0.078714 0.264433 -0.075364 +v 0.077122 0.262565 -0.071892 +v 0.076266 0.262638 -0.071117 +v 0.077600 0.265123 -0.078843 +v 0.077268 0.264867 -0.079440 +v 0.078420 0.267080 -0.082378 +v 0.076660 0.264357 -0.077104 +v 0.075981 0.263426 -0.076785 +v 0.073938 0.261931 -0.075969 +v 0.075348 0.263727 -0.080646 +v 0.076228 0.266848 -0.084428 +v 0.072319 0.261701 -0.082731 +v 0.073608 0.264590 -0.087547 +v 0.071645 0.260438 -0.076923 +v 0.076801 0.263975 -0.076138 +v 0.075516 0.263363 -0.074938 +v 0.074372 0.262694 -0.073629 +v 0.073415 0.262063 -0.071765 +v 0.072948 0.261651 -0.070040 +v 0.071412 0.259991 -0.069645 +v 0.072480 0.260810 -0.072654 +v 0.073253 0.261526 -0.069062 +v 0.072139 0.260044 -0.067951 +v 0.074189 0.261459 -0.069069 +v 0.073265 0.259845 -0.067996 +v 0.075513 0.261428 -0.069884 +v 0.077042 0.261621 -0.071334 +v 0.076836 0.259921 -0.070648 +v 0.074916 0.259745 -0.068941 +v 0.085951 0.266957 -0.082922 +v 0.085106 0.268456 -0.082794 +v 0.087173 0.272375 -0.086479 +v 0.088137 0.271242 -0.086878 +v 0.082140 0.258953 -0.075347 +v 0.081521 0.260356 -0.075768 +v 0.084210 0.262852 -0.078865 +v 0.084977 0.262172 -0.078318 +v 0.081230 0.262048 -0.076042 +v 0.083647 0.263987 -0.079188 +v 0.086879 0.265870 -0.082814 +v 0.087889 0.265423 -0.082275 +v 0.083231 0.265283 -0.079443 +v 0.080995 0.263573 -0.076292 +v 0.089299 0.270486 -0.086862 +v 0.090346 0.270292 -0.086345 +v 0.091096 0.275642 -0.090097 +v 0.092202 0.275609 -0.089756 +v 0.092065 0.281159 -0.093137 +v 0.093361 0.281164 -0.092955 +v 0.092097 0.286963 -0.095261 +v 0.093663 0.286968 -0.095220 +v 0.091882 0.292374 -0.096017 +v 0.093706 0.292430 -0.095910 +v 0.095144 0.292400 -0.095113 +v 0.094934 0.286999 -0.094551 +v 0.094299 0.281352 -0.092205 +v 0.094879 0.281595 -0.091283 +v 0.093411 0.276234 -0.088283 +v 0.093001 0.275857 -0.089021 +v 0.089077 0.266328 -0.080651 +v 0.089233 0.267224 -0.079992 +v 0.086752 0.263701 -0.076345 +v 0.086432 0.262760 -0.076847 +v 0.084950 0.260364 -0.073399 +v 0.084309 0.259043 -0.074012 +v 0.095160 0.281850 -0.090381 +v 0.095072 0.282061 -0.089705 +v 0.093472 0.277045 -0.087167 +v 0.093586 0.276659 -0.087611 +v 0.094785 0.282258 -0.089169 +v 0.093215 0.277443 -0.086794 +v 0.091089 0.273150 -0.083429 +v 0.091347 0.272540 -0.083568 +v 0.091502 0.271881 -0.083940 +v 0.091449 0.271195 -0.084603 +v 0.091070 0.270589 -0.085497 +v 0.088672 0.265613 -0.081497 +v 0.085776 0.262178 -0.077578 +v 0.083224 0.258479 -0.074786 +v 0.076217 0.255090 -0.061995 +v 0.078306 0.255319 -0.063044 +v 0.075055 0.254690 -0.063864 +v 0.078318 0.254761 -0.064465 +v 0.079974 0.255441 -0.064747 +v 0.080101 0.256250 -0.063909 +v 0.074408 0.257788 -0.068156 +v 0.072462 0.258099 -0.066924 +v 0.076634 0.257761 -0.069972 +v 0.076616 0.255822 -0.069510 +v 0.074230 0.255984 -0.067520 +v 0.072158 0.256555 -0.065901 +v 0.072195 0.257445 -0.059927 +v 0.072446 0.259231 -0.058525 +v 0.071126 0.259801 -0.059003 +v 0.070629 0.258007 -0.060966 +v 0.070042 0.260122 -0.059696 +v 0.069725 0.258285 -0.063092 +v 0.074710 0.255893 -0.060647 +v 0.072823 0.255991 -0.061584 +v 0.073997 0.257189 -0.059423 +v 0.073915 0.258637 -0.058479 +v 0.082446 0.257441 -0.067959 +v 0.083876 0.259425 -0.070338 +v 0.083729 0.261957 -0.070277 +v 0.082678 0.259917 -0.067552 +v 0.081605 0.257773 -0.065279 +v 0.080959 0.256120 -0.066022 +v 0.083288 0.257460 -0.070666 +v 0.081286 0.255765 -0.068312 +v 0.079519 0.254867 -0.068688 +v 0.082008 0.256188 -0.071156 +v 0.079452 0.254912 -0.066277 +v 0.077072 0.254308 -0.066489 +v 0.074961 0.254739 -0.067000 +v 0.072772 0.255370 -0.064930 +v 0.077684 0.254900 -0.069061 +v 0.080517 0.256008 -0.071612 +v 0.079485 0.256723 -0.071965 +v 0.079117 0.258624 -0.072500 +v 0.078843 0.260680 -0.073116 +v 0.078719 0.262283 -0.073540 +v 0.078558 0.264769 -0.077251 +v 0.079857 0.265221 -0.077642 +v 0.077989 0.264826 -0.077917 +v 0.079457 0.270274 -0.084735 +v 0.078323 0.270952 -0.087410 +v 0.076795 0.277185 -0.093379 +v 0.075176 0.270336 -0.090727 +v 0.079965 0.303838 -0.081779 +v 0.081238 0.301160 -0.083968 +v 0.081054 0.300235 -0.085741 +v 0.079918 0.304163 -0.083221 +v 0.082406 0.298745 -0.086303 +v 0.082252 0.296660 -0.087702 +v 0.081749 0.292380 -0.090325 +v 0.081072 0.299650 -0.089093 +v 0.080205 0.306263 -0.085557 +v 0.085001 0.288710 -0.089679 +v 0.085520 0.283737 -0.090071 +v 0.083853 0.283924 -0.090526 +v 0.083580 0.289772 -0.089625 +v 0.081693 0.284120 -0.090929 +v 0.078652 0.284240 -0.094963 +v 0.079838 0.291909 -0.095917 +v 0.080263 0.299835 -0.095387 +v 0.080547 0.307579 -0.092259 +v 0.085660 0.295777 -0.088162 +v 0.084869 0.295585 -0.088108 +v 0.083776 0.297922 -0.087109 +v 0.084485 0.298622 -0.086998 +v 0.084204 0.295332 -0.088510 +v 0.083358 0.296735 -0.087716 +v 0.082694 0.300025 -0.085388 +v 0.083240 0.300976 -0.085274 +v 0.087861 0.287203 -0.090878 +v 0.087101 0.291823 -0.090165 +v 0.087278 0.287641 -0.089599 +v 0.086526 0.292012 -0.089075 +v 0.086110 0.295999 -0.089273 +v 0.088344 0.282382 -0.090516 +v 0.087814 0.283020 -0.089696 +v 0.086459 0.288151 -0.089571 +v 0.087075 0.283501 -0.089741 +v 0.084514 0.292873 -0.089004 +v 0.085699 0.292308 -0.088845 +v 0.083306 0.294275 -0.088714 +v 0.079261 0.306073 -0.079803 +v 0.080087 0.306194 -0.079034 +v 0.080696 0.304317 -0.080905 +v 0.079445 0.307534 -0.078194 +v 0.079629 0.307783 -0.077405 +v 0.080448 0.308797 -0.077247 +v 0.080858 0.307066 -0.079045 +v 0.081437 0.305269 -0.080931 +v 0.087384 0.300299 -0.091417 +v 0.086022 0.299728 -0.089340 +v 0.085007 0.302677 -0.087477 +v 0.086385 0.303606 -0.089663 +v 0.085241 0.299190 -0.087689 +v 0.084282 0.301793 -0.085782 +v 0.086676 0.311130 -0.088201 +v 0.084773 0.309716 -0.085557 +v 0.084323 0.312079 -0.083196 +v 0.086160 0.313905 -0.085873 +v 0.083384 0.308018 -0.083265 +v 0.082924 0.309971 -0.081098 +v 0.089290 0.311918 -0.090538 +v 0.088851 0.314692 -0.088150 +v 0.089611 0.309005 -0.092701 +v 0.087331 0.307942 -0.090337 +v 0.085415 0.306747 -0.087670 +v 0.084080 0.305494 -0.085378 +v 0.082286 0.306511 -0.081738 +v 0.081757 0.308319 -0.079765 +v 0.081361 0.310076 -0.077754 +v 0.083049 0.304349 -0.083790 +v 0.082216 0.303235 -0.082990 +v 0.081628 0.302237 -0.083071 +v 0.079341 0.310549 -0.077678 +v 0.079219 0.308637 -0.078097 +v 0.079275 0.306798 -0.080500 +v 0.079546 0.308600 -0.080965 +v 0.080331 0.311560 -0.083264 +v 0.080058 0.310532 -0.080788 +v 0.080025 0.315032 -0.079009 +v 0.079723 0.312155 -0.078550 +v 0.076381 0.296819 -0.059591 +v 0.075937 0.297154 -0.058638 +v 0.075710 0.298466 -0.057779 +v 0.078201 0.297489 -0.062096 +v 0.077125 0.297089 -0.060776 +v 0.079443 0.297857 -0.063491 +v 0.079535 0.300964 -0.062907 +v 0.079955 0.304377 -0.062814 +v 0.079171 0.314199 -0.072329 +v 0.079257 0.312880 -0.073229 +v 0.079184 0.312529 -0.074657 +v 0.079438 0.314016 -0.073959 +v 0.079702 0.311529 -0.074333 +v 0.079087 0.311017 -0.075635 +v 0.079277 0.312401 -0.076091 +v 0.079578 0.313557 -0.075380 +v 0.080121 0.310255 -0.075679 +v 0.080898 0.311501 -0.075905 +v 0.080330 0.312746 -0.074216 +v 0.079176 0.309343 -0.076408 +v 0.080470 0.314945 -0.072418 +v 0.081663 0.316383 -0.072929 +v 0.079466 0.315143 -0.069859 +v 0.080690 0.316213 -0.070289 +v 0.079737 0.313792 -0.072555 +v 0.079257 0.314634 -0.071096 +v 0.079125 0.315319 -0.071397 +v 0.079426 0.315435 -0.073812 +v 0.079138 0.317575 -0.074390 +v 0.079589 0.314150 -0.076274 +v 0.073857 0.283113 -0.054147 +v 0.073802 0.285007 -0.051642 +v 0.074667 0.292316 -0.054669 +v 0.074633 0.295843 -0.052063 +v 0.075752 0.301737 -0.056480 +v 0.075664 0.306322 -0.053340 +v 0.071002 0.258522 -0.066408 +v 0.070120 0.258590 -0.066676 +v 0.070578 0.257270 -0.064559 +v 0.071230 0.256544 -0.062946 +v 0.068585 0.257833 -0.063943 +v 0.069195 0.259351 -0.060352 +v 0.069033 0.257707 -0.068043 +v 0.070106 0.258634 -0.071713 +v 0.071260 0.259850 -0.073595 +v 0.079027 0.321914 -0.075698 +v 0.080439 0.319270 -0.082102 +v 0.081019 0.314217 -0.087728 +v 0.079658 0.312917 -0.076993 +v 0.080041 0.315197 -0.067768 +v 0.079087 0.314464 -0.067076 +v 0.078834 0.315130 -0.068703 +v 0.078527 0.314345 -0.066974 +v 0.078987 0.315146 -0.070217 +v -0.077046 0.312891 -0.068870 +v -0.076294 0.310109 -0.063454 +v -0.076207 0.314313 -0.062411 +v -0.077063 0.317989 -0.067828 +v -0.075509 0.305438 -0.059940 +v -0.075351 0.308549 -0.058635 +v -0.075421 0.313693 -0.056442 +v -0.076512 0.320408 -0.060769 +v -0.077450 0.309272 -0.066546 +v -0.077496 0.307767 -0.065350 +v -0.076564 0.304560 -0.063371 +v -0.076388 0.306071 -0.063253 +v -0.077876 0.306646 -0.064997 +v -0.076972 0.303189 -0.063730 +v -0.076318 0.299156 -0.063241 +v -0.076020 0.299696 -0.062558 +v -0.075887 0.300881 -0.061858 +v -0.077147 0.310165 -0.066681 +v -0.076281 0.307708 -0.063299 +v -0.075713 0.302998 -0.060955 +v -0.090957 0.305603 -0.088092 +v -0.091536 0.303497 -0.089844 +v -0.091311 0.304240 -0.090667 +v -0.090783 0.306502 -0.088969 +v -0.092128 0.300858 -0.091224 +v -0.091857 0.301569 -0.091982 +v -0.091654 0.301951 -0.092109 +v -0.091049 0.304610 -0.090852 +v -0.090199 0.306714 -0.089133 +v -0.091732 0.295448 -0.093019 +v -0.091946 0.298990 -0.092857 +v -0.092116 0.298481 -0.092683 +v -0.091863 0.295006 -0.093115 +v -0.092353 0.297689 -0.092043 +v -0.091975 0.294307 -0.092498 +v -0.093409 0.293265 -0.090914 +v -0.092427 0.293540 -0.091223 +v -0.092766 0.297131 -0.091139 +v -0.093546 0.296907 -0.090896 +v -0.092483 0.300194 -0.090446 +v -0.093382 0.299946 -0.090249 +v -0.092014 0.294639 -0.096579 +v -0.093640 0.294317 -0.095855 +v -0.093768 0.299265 -0.095605 +v -0.091946 0.299705 -0.096210 +v -0.094571 0.294009 -0.094645 +v -0.094714 0.298671 -0.094502 +v -0.094699 0.302339 -0.093748 +v -0.093691 0.303257 -0.094838 +v -0.091665 0.303764 -0.095278 +v -0.095020 0.301465 -0.092719 +v -0.094744 0.304213 -0.091501 +v -0.094477 0.305272 -0.092472 +v -0.094910 0.300691 -0.091748 +v -0.094559 0.303310 -0.090481 +v -0.093905 0.305457 -0.088669 +v -0.094166 0.306582 -0.089759 +v -0.094018 0.307851 -0.090689 +v -0.091753 0.284796 -0.088978 +v -0.092701 0.289197 -0.090176 +v -0.093530 0.289041 -0.090694 +v -0.092539 0.284593 -0.089466 +v -0.094297 0.293226 -0.091438 +v -0.094816 0.293460 -0.092456 +v -0.094017 0.289013 -0.091479 +v -0.093067 0.284473 -0.090244 +v -0.094112 0.289052 -0.092635 +v -0.093153 0.284342 -0.091305 +v -0.094882 0.293742 -0.093560 +v -0.093798 0.289134 -0.093840 +v -0.092874 0.284250 -0.092404 +v -0.094499 0.297084 -0.091412 +v -0.095132 0.297567 -0.092409 +v -0.094353 0.300137 -0.090738 +v -0.095070 0.298110 -0.093485 +v -0.093467 0.306376 -0.093386 +v -0.091318 0.307161 -0.093742 +v -0.093047 0.309234 -0.091545 +v -0.090690 0.310148 -0.091641 +v -0.092233 0.311775 -0.089179 +v -0.089773 0.312531 -0.088979 +v -0.093397 0.310289 -0.088587 +v -0.092372 0.312243 -0.085841 +v -0.091199 0.313746 -0.086183 +v -0.088851 0.314394 -0.085966 +v -0.093365 0.308812 -0.087795 +v -0.093111 0.307468 -0.086746 +v -0.092150 0.308949 -0.084522 +v -0.092490 0.310552 -0.085278 +v -0.089309 0.308805 -0.083939 +v -0.089341 0.309726 -0.084555 +v -0.088003 0.310386 -0.081673 +v -0.088071 0.310003 -0.081083 +v -0.088438 0.310045 -0.085028 +v -0.087547 0.310821 -0.082327 +v -0.086407 0.311089 -0.079881 +v -0.086490 0.311003 -0.079021 +v -0.086184 0.310830 -0.077664 +v -0.087105 0.309977 -0.077997 +v -0.088396 0.309109 -0.080902 +v -0.087933 0.309713 -0.078028 +v -0.089075 0.308725 -0.080991 +v -0.090156 0.307481 -0.083592 +v -0.089551 0.307843 -0.083543 +v -0.091162 0.306081 -0.085516 +v -0.090523 0.306456 -0.085634 +v -0.092018 0.304393 -0.087226 +v -0.091215 0.304751 -0.087398 +v -0.090313 0.307416 -0.086247 +v -0.091174 0.307798 -0.083887 +v -0.089929 0.309178 -0.081204 +v -0.090846 0.310240 -0.081529 +v -0.088716 0.310432 -0.078130 +v -0.089528 0.311548 -0.078232 +v -0.093046 0.304680 -0.087710 +v -0.092151 0.306467 -0.085904 +v -0.093845 0.302635 -0.089435 +v -0.092802 0.302395 -0.088905 +v -0.091841 0.302741 -0.089087 +v -0.090297 0.308412 -0.087101 +v -0.089312 0.308397 -0.087203 +v -0.087915 0.294272 -0.093846 +v -0.089807 0.294635 -0.095715 +v -0.089586 0.299464 -0.095118 +v -0.087734 0.298841 -0.093152 +v -0.089095 0.303387 -0.093948 +v -0.086921 0.302491 -0.091725 +v -0.085311 0.293614 -0.090574 +v -0.085596 0.289392 -0.091025 +v -0.087094 0.289447 -0.091884 +v -0.086956 0.293947 -0.091745 +v -0.086130 0.285076 -0.090692 +v -0.087161 0.284891 -0.091280 +v -0.087800 0.284680 -0.092717 +v -0.087975 0.289483 -0.093691 +v -0.086196 0.280441 -0.090018 +v -0.086795 0.280025 -0.090322 +v -0.085746 0.275676 -0.088372 +v -0.086159 0.275187 -0.088301 +v -0.086547 0.274431 -0.089078 +v -0.087497 0.279574 -0.091169 +v -0.086736 0.268247 -0.079789 +v -0.086646 0.269140 -0.080077 +v -0.088053 0.271941 -0.082675 +v -0.088475 0.271468 -0.082790 +v -0.086677 0.269992 -0.080492 +v -0.087621 0.272136 -0.082422 +v -0.088584 0.275680 -0.085137 +v -0.089031 0.275780 -0.085307 +v -0.089640 0.275580 -0.085429 +v -0.082379 0.314085 -0.077594 +v -0.083097 0.313446 -0.080486 +v -0.085286 0.315144 -0.081824 +v -0.084241 0.315718 -0.078509 +v -0.083750 0.312289 -0.083260 +v -0.086178 0.313891 -0.084914 +v -0.087801 0.315789 -0.082596 +v -0.086529 0.316517 -0.078943 +v -0.085048 0.311287 -0.076770 +v -0.085037 0.310895 -0.076271 +v -0.085374 0.310988 -0.077811 +v -0.084494 0.310695 -0.076403 +v -0.083585 0.310672 -0.075418 +v -0.082443 0.310456 -0.073660 +v -0.083227 0.309707 -0.073130 +v -0.084701 0.310431 -0.074922 +v -0.083926 0.310823 -0.074622 +v -0.082757 0.310190 -0.073066 +v -0.084035 0.264125 -0.074627 +v -0.084949 0.265813 -0.077147 +v -0.085500 0.264381 -0.076920 +v -0.084851 0.262174 -0.074321 +v -0.087052 0.267308 -0.079790 +v -0.087397 0.266305 -0.080118 +v -0.086143 0.263032 -0.076991 +v -0.085497 0.260276 -0.074438 +v -0.083669 0.272839 -0.074022 +v -0.084553 0.271711 -0.074682 +v -0.082793 0.270911 -0.072932 +v -0.081888 0.272280 -0.072374 +v -0.084950 0.270633 -0.075705 +v -0.083298 0.269627 -0.073926 +v -0.082411 0.268468 -0.072366 +v -0.082041 0.270131 -0.070975 +v -0.080973 0.271778 -0.070345 +v -0.080960 0.312323 -0.076487 +v -0.081623 0.311276 -0.078930 +v -0.079858 0.310809 -0.075631 +v -0.080596 0.309470 -0.077665 +v -0.081542 0.307936 -0.079689 +v -0.082294 0.310015 -0.081413 +v -0.079697 0.269437 -0.067225 +v -0.080175 0.270652 -0.068456 +v -0.081451 0.268747 -0.069055 +v -0.080204 0.267081 -0.067426 +v -0.081869 0.266413 -0.070792 +v -0.080836 0.262979 -0.068924 +v -0.081819 0.309862 -0.068468 +v -0.080406 0.307253 -0.066988 +v -0.079735 0.308357 -0.066729 +v -0.081180 0.310802 -0.068304 +v -0.079396 0.304022 -0.065949 +v -0.078529 0.305375 -0.065223 +v -0.079165 0.309239 -0.066751 +v -0.080417 0.311542 -0.068276 +v -0.075787 0.299078 -0.069186 +v -0.076426 0.300142 -0.069041 +v -0.076666 0.300708 -0.069289 +v -0.076252 0.300141 -0.069336 +v -0.077421 0.301720 -0.068968 +v -0.077135 0.302137 -0.069435 +v -0.076819 0.301938 -0.069986 +v -0.075714 0.298805 -0.068985 +v -0.076193 0.299486 -0.068972 +v -0.075800 0.298556 -0.068870 +v -0.076515 0.299733 -0.068772 +v -0.079578 0.273515 -0.075846 +v -0.078230 0.273314 -0.073815 +v -0.077650 0.272972 -0.074335 +v -0.078730 0.273805 -0.076575 +v -0.076859 0.273495 -0.071923 +v -0.076348 0.272823 -0.072348 +v -0.075223 0.272441 -0.072413 +v -0.076376 0.273569 -0.074391 +v -0.077770 0.275496 -0.076725 +v -0.078305 0.311163 -0.068008 +v -0.078612 0.310090 -0.067206 +v -0.078844 0.312300 -0.068956 +v -0.079642 0.312059 -0.068466 +v -0.074760 0.272974 -0.068881 +v -0.074458 0.272420 -0.069433 +v -0.075266 0.272788 -0.070728 +v -0.075770 0.273480 -0.070268 +v -0.074190 0.271942 -0.069835 +v -0.074583 0.272205 -0.070779 +v -0.074369 0.293163 -0.070968 +v -0.074443 0.291831 -0.072263 +v -0.074851 0.290764 -0.072349 +v -0.074698 0.292111 -0.071050 +v -0.074696 0.290923 -0.073198 +v -0.074958 0.289990 -0.073388 +v -0.075441 0.288778 -0.073692 +v -0.075541 0.289749 -0.072401 +v -0.075570 0.291089 -0.071299 +v -0.074811 0.297358 -0.069401 +v -0.074836 0.297556 -0.069528 +v -0.074644 0.296850 -0.070122 +v -0.074405 0.296556 -0.070137 +v -0.075159 0.297871 -0.069566 +v -0.075011 0.297148 -0.070075 +v -0.075160 0.296737 -0.071333 +v -0.074682 0.296459 -0.071387 +v -0.074355 0.295986 -0.071215 +v -0.075388 0.298556 -0.069309 +v -0.075197 0.298016 -0.069290 +v -0.075244 0.298099 -0.069209 +v -0.075343 0.298165 -0.069058 +v -0.075125 0.297963 -0.069133 +v -0.074224 0.294685 -0.071048 +v -0.074326 0.295682 -0.070099 +v -0.074317 0.296143 -0.070138 +v -0.074263 0.295372 -0.071163 +v -0.074606 0.296415 -0.069560 +v -0.074576 0.296819 -0.069469 +v -0.074938 0.296967 -0.069164 +v -0.074886 0.297437 -0.069177 +v -0.075182 0.297428 -0.069076 +v -0.075309 0.297852 -0.068909 +v -0.074756 0.294349 -0.069932 +v -0.074455 0.295125 -0.070018 +v -0.074239 0.294006 -0.071005 +v -0.075268 0.295318 -0.069249 +v -0.074829 0.295920 -0.069393 +v -0.076273 0.296942 -0.068710 +v -0.075496 0.297255 -0.068795 +v -0.075144 0.296603 -0.069006 +v -0.075782 0.296150 -0.068883 +v -0.077823 0.298488 -0.065355 +v -0.078878 0.298343 -0.066694 +v -0.078500 0.296563 -0.067016 +v -0.077604 0.296250 -0.065658 +v -0.079091 0.298491 -0.067766 +v -0.078531 0.297082 -0.068094 +v -0.077965 0.295849 -0.068437 +v -0.078045 0.295014 -0.067507 +v -0.077445 0.294238 -0.066444 +v -0.080054 0.302959 -0.066845 +v -0.079316 0.300469 -0.066559 +v -0.078450 0.301016 -0.065403 +v -0.080276 0.302243 -0.067673 +v -0.079638 0.300230 -0.067588 +v -0.080607 0.313827 -0.070081 +v -0.081826 0.313676 -0.070098 +v -0.079445 0.313275 -0.070132 +v -0.080326 0.314153 -0.072299 +v -0.081778 0.315107 -0.072481 +v -0.083369 0.315361 -0.072437 +v -0.082840 0.312971 -0.070142 +v -0.083550 0.311926 -0.070282 +v -0.084674 0.314743 -0.072417 +v -0.085458 0.313627 -0.072455 +v -0.083040 0.315736 -0.075383 +v -0.085017 0.316321 -0.075474 +v -0.081442 0.314351 -0.074810 +v -0.087757 0.311668 -0.075019 +v -0.087912 0.313175 -0.075142 +v -0.089718 0.313031 -0.078539 +v -0.085792 0.310746 -0.072513 +v -0.085843 0.312241 -0.072438 +v -0.087641 0.314616 -0.075260 +v -0.089551 0.314555 -0.078758 +v -0.091094 0.311787 -0.081998 +v -0.091045 0.313588 -0.082399 +v -0.090018 0.315185 -0.082698 +v -0.088550 0.315907 -0.078909 +v -0.086686 0.315808 -0.075392 +v -0.083981 0.310648 -0.070421 +v -0.083977 0.309352 -0.070665 +v -0.082345 0.307395 -0.069256 +v -0.082270 0.308684 -0.068766 +v -0.075957 0.297988 -0.068677 +v -0.076493 0.298898 -0.068618 +v -0.076940 0.297870 -0.068603 +v -0.077789 0.299356 -0.068488 +v -0.076911 0.299682 -0.068752 +v -0.077748 0.300621 -0.068655 +v -0.081035 0.305023 -0.070170 +v -0.080202 0.302840 -0.069081 +v -0.080987 0.303686 -0.068936 +v -0.082072 0.306056 -0.069829 +v -0.079900 0.301674 -0.068710 +v -0.080192 0.301848 -0.068388 +v -0.081237 0.304712 -0.068361 +v -0.078938 0.301883 -0.068809 +v -0.079027 0.303276 -0.069189 +v -0.079129 0.300806 -0.068575 +v -0.083865 0.309054 -0.073273 +v -0.085473 0.309778 -0.075389 +v -0.084526 0.308965 -0.073144 +v -0.086251 0.309780 -0.075322 +v -0.087053 0.310467 -0.075140 +v -0.085344 0.309486 -0.072728 +v -0.078923 0.306462 -0.071147 +v -0.079279 0.306567 -0.070678 +v -0.080723 0.308777 -0.071713 +v -0.080069 0.308731 -0.072093 +v -0.079918 0.306347 -0.070474 +v -0.081545 0.308273 -0.071674 +v -0.080574 0.305861 -0.070508 +v -0.079267 0.304389 -0.069658 +v -0.078520 0.304279 -0.069620 +v -0.077976 0.304296 -0.069954 +v -0.077749 0.304333 -0.070541 +v -0.082244 0.307649 -0.071727 +v -0.082811 0.307522 -0.071557 +v -0.083542 0.308183 -0.071183 +v -0.081023 0.305933 -0.067623 +v -0.079487 0.300301 -0.068283 +v -0.078650 0.298827 -0.068356 +v -0.077918 0.297553 -0.068582 +v -0.077254 0.296506 -0.068772 +v -0.077424 0.294745 -0.068935 +v -0.077635 0.293649 -0.068297 +v -0.076820 0.293668 -0.069571 +v -0.077211 0.292470 -0.069235 +v -0.076828 0.291136 -0.068429 +v -0.077231 0.292519 -0.067460 +v -0.076063 0.292502 -0.070326 +v -0.076743 0.291323 -0.070183 +v -0.076447 0.289925 -0.071084 +v -0.076384 0.288242 -0.070593 +v -0.076523 0.289751 -0.069361 +v -0.076672 0.295562 -0.069006 +v -0.076025 0.294542 -0.069347 +v -0.075251 0.293437 -0.069996 +v -0.076196 0.288553 -0.072287 +v -0.076037 0.287458 -0.073747 +v -0.076341 0.286469 -0.073580 +v -0.076318 0.286995 -0.072217 +v -0.080521 0.282382 -0.081967 +v -0.080549 0.278991 -0.081089 +v -0.079081 0.278720 -0.079955 +v -0.078657 0.282225 -0.080927 +v -0.080194 0.277161 -0.080102 +v -0.079230 0.276316 -0.079024 +v -0.077653 0.278880 -0.077697 +v -0.077009 0.282878 -0.077925 +v -0.079859 0.274987 -0.078454 +v -0.080975 0.276718 -0.079907 +v -0.082120 0.276506 -0.079236 +v -0.080843 0.274547 -0.077683 +v -0.084701 0.268657 -0.077102 +v -0.085753 0.269287 -0.079220 +v -0.084993 0.267349 -0.077868 +v -0.083755 0.266174 -0.075581 +v -0.085013 0.269739 -0.076635 +v -0.083686 0.268925 -0.074940 +v -0.083059 0.267766 -0.074326 +v -0.082762 0.265621 -0.073174 +v -0.083091 0.263182 -0.072145 +v -0.091008 0.285043 -0.089144 +v -0.091682 0.289520 -0.090482 +v -0.090486 0.285846 -0.090057 +v -0.091290 0.290298 -0.091799 +v -0.090891 0.280145 -0.087580 +v -0.090230 0.280253 -0.087544 +v -0.089802 0.280095 -0.087750 +v -0.081224 0.273927 -0.074337 +v -0.080259 0.273885 -0.075047 +v -0.081902 0.274702 -0.076743 +v -0.083215 0.274815 -0.075885 +v -0.083543 0.276597 -0.078134 +v -0.085186 0.276563 -0.077223 +v -0.084781 0.279552 -0.079206 +v -0.086737 0.279474 -0.078513 +v -0.083327 0.279265 -0.080625 +v -0.084091 0.282988 -0.081705 +v -0.085575 0.283225 -0.080434 +v -0.087615 0.283293 -0.079841 +v -0.074837 0.294231 -0.075314 +v -0.074526 0.295285 -0.072914 +v -0.074791 0.296464 -0.073631 +v -0.075587 0.295991 -0.076322 +v -0.075563 0.296911 -0.073698 +v -0.076993 0.296178 -0.075707 +v -0.080120 0.286640 -0.081619 +v -0.081940 0.287109 -0.081914 +v -0.082243 0.282693 -0.082265 +v -0.079122 0.290555 -0.080113 +v -0.081278 0.291506 -0.080201 +v -0.082445 0.291479 -0.079573 +v -0.083703 0.287524 -0.081581 +v -0.074586 0.292008 -0.074010 +v -0.074317 0.293473 -0.072440 +v -0.074460 0.294317 -0.072545 +v -0.074681 0.292886 -0.074503 +v -0.074288 0.292712 -0.072329 +v -0.074567 0.291330 -0.073541 +v -0.074975 0.289945 -0.074374 +v -0.075346 0.288257 -0.075144 +v -0.074981 0.290419 -0.075314 +v -0.075637 0.288312 -0.076765 +v -0.075237 0.291309 -0.076357 +v -0.076808 0.289056 -0.078616 +v -0.076110 0.292860 -0.077738 +v -0.078172 0.294458 -0.078625 +v -0.079549 0.294197 -0.077605 +v -0.076283 0.300271 -0.069916 +v -0.075847 0.299314 -0.069499 +v -0.076122 0.299124 -0.069989 +v -0.075643 0.298399 -0.069684 +v -0.076230 0.298008 -0.070205 +v -0.075599 0.297482 -0.070073 +v -0.076663 0.296857 -0.070733 +v -0.075871 0.296671 -0.070994 +v -0.076608 0.296216 -0.072725 +v -0.078192 0.295207 -0.074406 +v -0.077655 0.296044 -0.071911 +v -0.079383 0.295387 -0.073443 +v -0.080760 0.293696 -0.076587 +v -0.083607 0.291517 -0.079127 +v -0.081855 0.294094 -0.075932 +v -0.085028 0.292106 -0.078975 +v -0.085174 0.287490 -0.080757 +v -0.087175 0.287433 -0.080255 +v -0.081949 0.279095 -0.081373 +v -0.076693 0.285958 -0.078102 +v -0.078142 0.286093 -0.080463 +v -0.076378 0.285247 -0.075083 +v -0.076068 0.286563 -0.075648 +v -0.075653 0.285308 -0.072961 +v -0.074906 0.286747 -0.070761 +v -0.075597 0.283183 -0.074104 +v -0.073798 0.285066 -0.070564 +v -0.074275 0.260439 -0.061161 +v -0.073731 0.259643 -0.060737 +v -0.073175 0.260463 -0.060346 +v -0.074018 0.261454 -0.061128 +v -0.073250 0.258927 -0.060499 +v -0.072614 0.259069 -0.060123 +v -0.071762 0.259715 -0.059809 +v -0.072672 0.261589 -0.060011 +v -0.073546 0.263357 -0.061099 +v -0.076235 0.259756 -0.063035 +v -0.075042 0.260227 -0.061882 +v -0.075052 0.261667 -0.062274 +v -0.076278 0.261413 -0.063765 +v -0.074606 0.263403 -0.062787 +v -0.075872 0.263362 -0.064533 +v -0.074513 0.256813 -0.061598 +v -0.073688 0.257966 -0.060869 +v -0.074508 0.258934 -0.061368 +v -0.075551 0.258152 -0.062258 +v -0.076387 0.254728 -0.063341 +v -0.075590 0.255606 -0.062541 +v -0.076731 0.257149 -0.063256 +v -0.077762 0.255797 -0.064097 +v -0.077573 0.259041 -0.064366 +v -0.078855 0.257810 -0.065521 +v -0.077858 0.260928 -0.065462 +v -0.079653 0.259880 -0.066942 +v -0.077996 0.263312 -0.066176 +v -0.075870 0.265970 -0.064830 +v -0.078080 0.266393 -0.066054 +v -0.075848 0.269026 -0.065317 +v -0.078032 0.269236 -0.066456 +v -0.074271 0.265510 -0.063384 +v -0.073524 0.265600 -0.061802 +v -0.073804 0.267408 -0.062032 +v -0.074350 0.267711 -0.063590 +v -0.072311 0.266708 -0.059456 +v -0.072467 0.267745 -0.060027 +v -0.072904 0.266364 -0.060706 +v -0.072773 0.264836 -0.060121 +v -0.072628 0.268402 -0.060468 +v -0.073065 0.267765 -0.061064 +v -0.071035 0.260804 -0.059455 +v -0.072165 0.263041 -0.059465 +v -0.070454 0.262678 -0.058974 +v -0.071801 0.265200 -0.058919 +v -0.073519 0.271820 -0.070421 +v -0.073868 0.273104 -0.071637 +v -0.073487 0.271288 -0.069385 +v -0.072354 0.270756 -0.068794 +v -0.072282 0.271816 -0.069500 +v -0.072351 0.274164 -0.070049 +v -0.074933 0.274827 -0.073126 +v -0.076108 0.276977 -0.074343 +v -0.073373 0.276356 -0.071516 +v -0.074217 0.278593 -0.072233 +v -0.076304 0.280029 -0.074539 +v -0.074318 0.281487 -0.071981 +v -0.072072 0.272452 -0.058701 +v -0.072032 0.269257 -0.058979 +v -0.071704 0.268445 -0.058291 +v -0.071924 0.272561 -0.057906 +v -0.071111 0.267482 -0.057577 +v -0.071767 0.272847 -0.056877 +v -0.075501 0.280703 -0.062342 +v -0.076419 0.282353 -0.062871 +v -0.076916 0.281801 -0.063607 +v -0.076176 0.279906 -0.063156 +v -0.076556 0.283440 -0.063057 +v -0.076936 0.283499 -0.063680 +v -0.077185 0.283580 -0.064483 +v -0.077170 0.281603 -0.064359 +v -0.076426 0.279581 -0.063761 +v -0.075334 0.283321 -0.061953 +v -0.076031 0.283339 -0.062553 +v -0.075347 0.285192 -0.062330 +v -0.076077 0.284265 -0.062757 +v -0.074971 0.291883 -0.064161 +v -0.075129 0.288678 -0.063919 +v -0.074910 0.288219 -0.062732 +v -0.074792 0.291205 -0.062319 +v -0.075635 0.286696 -0.064103 +v -0.075547 0.286263 -0.063171 +v -0.074683 0.286606 -0.061733 +v -0.074218 0.289240 -0.060764 +v -0.072748 0.286707 -0.067880 +v -0.072917 0.286966 -0.067556 +v -0.073082 0.287096 -0.067951 +v -0.072951 0.286448 -0.068672 +v -0.073103 0.286939 -0.067071 +v -0.073410 0.287249 -0.067003 +v -0.074019 0.288235 -0.066452 +v -0.073356 0.287515 -0.068634 +v -0.074769 0.288522 -0.069011 +v -0.075326 0.289934 -0.067555 +v -0.076063 0.291373 -0.066494 +v -0.076384 0.293346 -0.065413 +v -0.074591 0.290056 -0.065492 +v -0.073080 0.286445 -0.066769 +v -0.073652 0.286392 -0.066624 +v -0.073034 0.285544 -0.066686 +v -0.074038 0.284984 -0.066825 +v -0.074915 0.284622 -0.066824 +v -0.074439 0.286294 -0.066500 +v -0.075823 0.284211 -0.066579 +v -0.075272 0.285892 -0.066293 +v -0.076657 0.283877 -0.066068 +v -0.075983 0.285529 -0.065852 +v -0.075543 0.286486 -0.065519 +v -0.075014 0.287205 -0.065742 +v -0.076406 0.285369 -0.065199 +v -0.075624 0.286690 -0.064920 +v -0.077155 0.283714 -0.065329 +v -0.076465 0.285218 -0.064388 +v -0.075090 0.288192 -0.064899 +v -0.076337 0.284924 -0.063485 +v -0.077138 0.281566 -0.065073 +v -0.076409 0.279427 -0.064307 +v -0.076790 0.281702 -0.065769 +v -0.076228 0.279430 -0.064900 +v -0.071630 0.270071 -0.065235 +v -0.071644 0.271062 -0.064713 +v -0.071214 0.271534 -0.065236 +v -0.071131 0.270465 -0.065948 +v -0.072138 0.272382 -0.064661 +v -0.071690 0.272881 -0.065026 +v -0.071115 0.273593 -0.065238 +v -0.070702 0.272196 -0.065611 +v -0.070524 0.270984 -0.066650 +v -0.073736 0.283439 -0.066770 +v -0.074600 0.282960 -0.066790 +v -0.073935 0.281128 -0.066060 +v -0.074749 0.280546 -0.066052 +v -0.075354 0.280037 -0.065839 +v -0.075424 0.282425 -0.066622 +v -0.075823 0.279615 -0.065413 +v -0.076188 0.281975 -0.066324 +v -0.075102 0.275335 -0.064692 +v -0.075783 0.277343 -0.064785 +v -0.075318 0.277492 -0.065391 +v -0.074482 0.275420 -0.065399 +v -0.074701 0.277843 -0.065728 +v -0.073871 0.275807 -0.065850 +v -0.073558 0.278925 -0.065563 +v -0.074203 0.278326 -0.065714 +v -0.072847 0.277027 -0.065792 +v -0.073380 0.276347 -0.065940 +v -0.072958 0.273982 -0.065080 +v -0.072448 0.274528 -0.065323 +v -0.071874 0.275230 -0.065440 +v -0.073683 0.271560 -0.068446 +v -0.072715 0.270610 -0.067709 +v -0.073891 0.271889 -0.067723 +v -0.073114 0.270686 -0.066820 +v -0.071695 0.270009 -0.066965 +v -0.071073 0.270455 -0.067914 +v -0.072392 0.269866 -0.066084 +v -0.075088 0.273187 -0.068288 +v -0.074176 0.271987 -0.067148 +v -0.075448 0.273111 -0.067712 +v -0.074753 0.271959 -0.066785 +v -0.073887 0.270370 -0.065822 +v -0.073477 0.270595 -0.066201 +v -0.073270 0.269848 -0.063113 +v -0.073328 0.269411 -0.064596 +v -0.073922 0.268929 -0.064005 +v -0.073724 0.268859 -0.062491 +v -0.074629 0.270014 -0.065514 +v -0.077975 0.273557 -0.069786 +v -0.076406 0.273289 -0.068384 +v -0.076208 0.273808 -0.069556 +v -0.077426 0.273947 -0.071164 +v -0.078551 0.271607 -0.067840 +v -0.079569 0.272951 -0.069948 +v -0.076979 0.271871 -0.067199 +v -0.080725 0.273233 -0.072194 +v -0.082433 0.273610 -0.073949 +v -0.079541 0.273702 -0.072452 +v -0.078781 0.273740 -0.073106 +v -0.075722 0.271941 -0.066807 +v -0.072804 0.269602 -0.065336 +v -0.072225 0.269787 -0.064348 +v -0.073104 0.272594 -0.060623 +v -0.072704 0.269877 -0.060468 +v -0.072276 0.269812 -0.059686 +v -0.072392 0.272598 -0.059550 +v -0.073417 0.269308 -0.061322 +v -0.073655 0.270716 -0.061733 +v -0.074934 0.277640 -0.062119 +v -0.073921 0.277129 -0.061308 +v -0.074234 0.280416 -0.061279 +v -0.074913 0.274917 -0.062003 +v -0.074119 0.274009 -0.061342 +v -0.073178 0.276418 -0.060400 +v -0.073431 0.280132 -0.060355 +v -0.075437 0.275637 -0.062830 +v -0.074783 0.274355 -0.063357 +v -0.074157 0.273197 -0.062862 +v -0.075717 0.276210 -0.063498 +v -0.075434 0.275698 -0.063977 +v -0.074221 0.273702 -0.064051 +v -0.073403 0.272329 -0.063588 +v -0.073834 0.271936 -0.062279 +v -0.073072 0.271029 -0.063205 +v -0.072748 0.272093 -0.064193 +v -0.072241 0.270822 -0.064020 +v -0.073549 0.273660 -0.064634 +v -0.075940 0.277536 -0.064129 +v -0.075985 0.277748 -0.063589 +v -0.075817 0.277745 -0.062943 +v -0.074532 0.283714 -0.061298 +v -0.073928 0.284113 -0.060369 +v -0.073451 0.283558 -0.059314 +v -0.073944 0.288961 -0.059324 +v -0.072961 0.279591 -0.059444 +v -0.072960 0.278941 -0.058733 +v -0.073023 0.281550 -0.058438 +v -0.073659 0.287198 -0.057651 +v -0.072422 0.276052 -0.058675 +v -0.072657 0.275964 -0.059470 +v -0.072438 0.277255 -0.057951 +v -0.072654 0.279235 -0.056827 +v -0.070646 0.266486 -0.056539 +v -0.071777 0.273103 -0.055305 +v -0.069537 0.261318 -0.058668 +v -0.072008 0.273167 -0.052872 +v -0.078380 0.269121 -0.083952 +v -0.079776 0.270525 -0.085783 +v -0.079323 0.273207 -0.087263 +v -0.077910 0.271391 -0.085801 +v -0.081141 0.271574 -0.086749 +v -0.081007 0.273859 -0.088175 +v -0.081118 0.277664 -0.089519 +v -0.079026 0.277230 -0.088737 +v -0.077131 0.275310 -0.088499 +v -0.074825 0.263766 -0.081781 +v -0.075815 0.262817 -0.080677 +v -0.077361 0.265005 -0.081334 +v -0.077079 0.266291 -0.082956 +v -0.076341 0.262284 -0.079746 +v -0.077518 0.263550 -0.079963 +v -0.079166 0.265194 -0.080866 +v -0.078833 0.267026 -0.082513 +v -0.082713 0.269523 -0.085338 +v -0.081680 0.270604 -0.086425 +v -0.080430 0.268669 -0.084435 +v -0.081038 0.267076 -0.082850 +v -0.082469 0.273565 -0.088268 +v -0.082896 0.277503 -0.089652 +v -0.083881 0.272843 -0.087579 +v -0.084385 0.276983 -0.089282 +v -0.084634 0.272084 -0.086708 +v -0.085331 0.276371 -0.088705 +v -0.083129 0.268496 -0.084040 +v -0.083171 0.267357 -0.083226 +v -0.084838 0.271255 -0.086228 +v -0.081281 0.265563 -0.081292 +v -0.079224 0.263343 -0.079270 +v -0.078852 0.261302 -0.077399 +v -0.081416 0.263955 -0.080150 +v -0.072085 0.259779 -0.072546 +v -0.071941 0.258939 -0.070878 +v -0.072954 0.259003 -0.071549 +v -0.072768 0.260137 -0.073490 +v -0.071804 0.257906 -0.069544 +v -0.072708 0.257740 -0.069587 +v -0.074019 0.257471 -0.070423 +v -0.074237 0.259103 -0.072794 +v -0.074403 0.260510 -0.075436 +v -0.075281 0.257514 -0.071681 +v -0.075688 0.259353 -0.073915 +v -0.076107 0.257856 -0.072780 +v -0.077053 0.259317 -0.074586 +v -0.076568 0.260729 -0.076338 +v -0.071061 0.260856 -0.075448 +v -0.072348 0.261912 -0.076982 +v -0.072804 0.263537 -0.079665 +v -0.071931 0.263529 -0.079771 +v -0.073005 0.262161 -0.077618 +v -0.073329 0.262939 -0.079445 +v -0.073853 0.265108 -0.082456 +v -0.073020 0.266189 -0.083066 +v -0.069590 0.259157 -0.075751 +v -0.070241 0.261762 -0.080522 +v -0.071547 0.265147 -0.085093 +v -0.072354 0.260985 -0.075001 +v -0.071639 0.260132 -0.073405 +v -0.073270 0.261406 -0.076621 +v -0.070008 0.256879 -0.067776 +v -0.071108 0.257431 -0.068863 +v -0.071261 0.258719 -0.070888 +v -0.070495 0.258354 -0.071388 +v -0.072077 0.256549 -0.068441 +v -0.073434 0.255833 -0.069126 +v -0.071370 0.255707 -0.067034 +v -0.072916 0.254695 -0.067848 +v -0.076559 0.255010 -0.071671 +v -0.076417 0.256547 -0.072215 +v -0.075061 0.255663 -0.070435 +v -0.074721 0.254385 -0.069459 +v -0.085007 0.270373 -0.086187 +v -0.083317 0.266144 -0.082986 +v -0.083803 0.264885 -0.083237 +v -0.085365 0.269413 -0.086663 +v -0.082089 0.261244 -0.079857 +v -0.082865 0.260345 -0.079708 +v -0.084693 0.263900 -0.083355 +v -0.080091 0.258513 -0.077145 +v -0.080762 0.257294 -0.076984 +v -0.081770 0.256649 -0.076666 +v -0.083927 0.259879 -0.079374 +v -0.085965 0.263391 -0.083092 +v -0.081698 0.262479 -0.079837 +v -0.079693 0.259973 -0.077144 +v -0.086634 0.268375 -0.087024 +v -0.087844 0.273699 -0.089816 +v -0.088022 0.267973 -0.086817 +v -0.089385 0.273415 -0.089680 +v -0.088837 0.279099 -0.092059 +v -0.089228 0.284417 -0.093707 +v -0.090439 0.278940 -0.091965 +v -0.090920 0.284254 -0.093893 +v -0.089702 0.289504 -0.095097 +v -0.091541 0.289373 -0.095591 +v -0.092131 0.284184 -0.093352 +v -0.092940 0.289225 -0.094984 +v -0.090854 0.273842 -0.088058 +v -0.091986 0.279155 -0.090448 +v -0.091412 0.278993 -0.091336 +v -0.090403 0.273492 -0.088956 +v -0.086355 0.261796 -0.077325 +v -0.085228 0.258556 -0.074928 +v -0.087592 0.265304 -0.080692 +v -0.087570 0.264308 -0.081461 +v -0.085947 0.260719 -0.077982 +v -0.084224 0.257304 -0.075611 +v -0.090805 0.274789 -0.086191 +v -0.092145 0.279664 -0.088597 +v -0.092285 0.279401 -0.089431 +v -0.091044 0.274280 -0.087056 +v -0.091657 0.279913 -0.087958 +v -0.090276 0.275200 -0.085728 +v -0.089004 0.270848 -0.083028 +v -0.089531 0.270106 -0.083554 +v -0.089854 0.269262 -0.084417 +v -0.089711 0.268502 -0.085384 +v -0.089067 0.268048 -0.086199 +v -0.087008 0.263588 -0.082369 +v -0.082965 0.256694 -0.076174 +v -0.085037 0.260018 -0.078741 +v -0.080019 0.254312 -0.066735 +v -0.078157 0.253172 -0.066213 +v -0.078000 0.254089 -0.064966 +v -0.079877 0.255867 -0.066120 +v -0.075268 0.252835 -0.065159 +v -0.075824 0.253643 -0.063964 +v -0.077004 0.252876 -0.070653 +v -0.076632 0.253774 -0.071070 +v -0.074471 0.253386 -0.068442 +v -0.074685 0.252549 -0.067856 +v -0.072281 0.253925 -0.066419 +v -0.072489 0.253109 -0.065498 +v -0.070036 0.258361 -0.060455 +v -0.069126 0.259107 -0.061211 +v -0.071327 0.257767 -0.060389 +v -0.071738 0.255919 -0.061510 +v -0.070063 0.256305 -0.061715 +v -0.068990 0.257503 -0.062931 +v -0.074322 0.254652 -0.062669 +v -0.073217 0.256063 -0.061433 +v -0.073036 0.254288 -0.062987 +v -0.072600 0.257582 -0.060567 +v -0.084013 0.260713 -0.071945 +v -0.084439 0.258320 -0.072164 +v -0.083122 0.256641 -0.069832 +v -0.082582 0.259491 -0.069678 +v -0.081481 0.255214 -0.067841 +v -0.081142 0.257794 -0.067665 +v -0.079688 0.253194 -0.070434 +v -0.081807 0.254354 -0.070138 +v -0.083653 0.256142 -0.072585 +v -0.082035 0.254800 -0.073034 +v -0.079695 0.253293 -0.067979 +v -0.077352 0.252355 -0.067844 +v -0.078057 0.252705 -0.070480 +v -0.075651 0.252150 -0.067629 +v -0.073592 0.252735 -0.065126 +v -0.080574 0.254196 -0.073366 +v -0.079424 0.254282 -0.073663 +v -0.078274 0.256600 -0.074282 +v -0.078691 0.255119 -0.073978 +v -0.077824 0.258262 -0.074491 +v -0.077291 0.262007 -0.078412 +v -0.075569 0.261229 -0.078185 +v -0.074174 0.261875 -0.078718 +v -0.076308 0.267600 -0.084815 +v -0.074916 0.269493 -0.086248 +v -0.073237 0.270546 -0.088127 +v -0.075064 0.276432 -0.090762 +v -0.078317 0.290357 -0.089130 +v -0.079528 0.294180 -0.087494 +v -0.078707 0.298115 -0.086272 +v -0.078322 0.297780 -0.088884 +v -0.080165 0.296380 -0.086644 +v -0.079368 0.298896 -0.084853 +v -0.078652 0.301258 -0.082708 +v -0.078163 0.301705 -0.083884 +v -0.078059 0.304003 -0.085708 +v -0.079435 0.282430 -0.089516 +v -0.077526 0.282694 -0.088962 +v -0.081410 0.282185 -0.089976 +v -0.081248 0.286478 -0.089445 +v -0.079776 0.287565 -0.088915 +v -0.076275 0.283152 -0.092028 +v -0.077375 0.290619 -0.093326 +v -0.078128 0.298613 -0.093791 +v -0.078390 0.306074 -0.091041 +v -0.080924 0.294041 -0.087666 +v -0.081549 0.295351 -0.087646 +v -0.080671 0.297714 -0.086210 +v -0.081407 0.292402 -0.088302 +v -0.081978 0.292750 -0.088652 +v -0.082783 0.293098 -0.089189 +v -0.082421 0.296175 -0.087973 +v -0.081461 0.298654 -0.086330 +v -0.083138 0.289479 -0.089792 +v -0.084263 0.289405 -0.090360 +v -0.083910 0.293334 -0.089758 +v -0.083978 0.285582 -0.089859 +v -0.085082 0.285319 -0.090302 +v -0.084375 0.281443 -0.089966 +v -0.085421 0.280962 -0.089896 +v -0.083001 0.281827 -0.090129 +v -0.082654 0.285917 -0.089649 +v -0.082216 0.289611 -0.089149 +v -0.081265 0.290095 -0.088717 +v -0.080336 0.291537 -0.088135 +v -0.079500 0.305259 -0.078372 +v -0.078591 0.304426 -0.078530 +v -0.079123 0.303130 -0.080117 +v -0.079963 0.303881 -0.080140 +v -0.078515 0.304301 -0.079345 +v -0.078299 0.303065 -0.080696 +v -0.079526 0.301592 -0.082117 +v -0.080347 0.302383 -0.082160 +v -0.084472 0.300296 -0.087669 +v -0.085241 0.297376 -0.089422 +v -0.086644 0.298132 -0.091021 +v -0.085669 0.301404 -0.089462 +v -0.083599 0.296766 -0.088562 +v -0.082696 0.299414 -0.086795 +v -0.082175 0.306409 -0.081822 +v -0.082850 0.308472 -0.083716 +v -0.082726 0.304643 -0.083829 +v -0.083507 0.306452 -0.085781 +v -0.085210 0.308321 -0.087998 +v -0.084424 0.310695 -0.085802 +v -0.086893 0.312174 -0.087761 +v -0.087762 0.309768 -0.090236 +v -0.088546 0.306776 -0.092275 +v -0.086035 0.305538 -0.089959 +v -0.083418 0.302542 -0.085773 +v -0.084434 0.304021 -0.087673 +v -0.081042 0.304954 -0.080671 +v -0.080442 0.306436 -0.078753 +v -0.081455 0.303309 -0.082692 +v -0.080726 0.300655 -0.084287 +v -0.081861 0.301508 -0.084804 +v -0.079937 0.299821 -0.084316 +v -0.077894 0.303895 -0.081231 +v -0.077886 0.305330 -0.079021 +v -0.077614 0.307540 -0.078663 +v -0.077847 0.305775 -0.081618 +v -0.078137 0.312191 -0.079326 +v -0.078101 0.309165 -0.083402 +v -0.077999 0.307897 -0.081325 +v -0.077750 0.309408 -0.079335 +v -0.074952 0.295906 -0.059834 +v -0.074842 0.297262 -0.058393 +v -0.075085 0.295216 -0.060969 +v -0.075378 0.295267 -0.062134 +v -0.075711 0.295590 -0.063372 +v -0.076849 0.298788 -0.064131 +v -0.076477 0.295973 -0.064423 +v -0.077620 0.301975 -0.064378 +v -0.077673 0.307896 -0.076748 +v -0.077603 0.309557 -0.075675 +v -0.077574 0.309598 -0.076956 +v -0.078270 0.308421 -0.075546 +v -0.077706 0.309892 -0.074423 +v -0.077683 0.311037 -0.073314 +v -0.077605 0.311028 -0.074839 +v -0.077854 0.310666 -0.076174 +v -0.078986 0.309548 -0.075305 +v -0.079685 0.308027 -0.076957 +v -0.078853 0.306892 -0.076889 +v -0.077994 0.306028 -0.077622 +v -0.079226 0.312881 -0.071807 +v -0.080101 0.312953 -0.074170 +v -0.078188 0.311867 -0.071267 +v -0.079050 0.311649 -0.073686 +v -0.077910 0.311290 -0.072242 +v -0.078389 0.310595 -0.073759 +v -0.077560 0.312285 -0.074427 +v -0.077714 0.311335 -0.076886 +v -0.077472 0.312037 -0.072133 +v -0.077630 0.314329 -0.074450 +v -0.072900 0.281054 -0.054909 +v -0.073880 0.290217 -0.055298 +v -0.073031 0.282996 -0.052046 +v -0.073985 0.293638 -0.052319 +v -0.074686 0.300004 -0.056406 +v -0.074549 0.304346 -0.053722 +v -0.070518 0.255324 -0.065014 +v -0.070420 0.254924 -0.063781 +v -0.069032 0.257047 -0.064725 +v -0.071566 0.254322 -0.063171 +v -0.068361 0.257906 -0.061341 +v -0.067571 0.256254 -0.063944 +v -0.067528 0.255930 -0.066708 +v -0.068395 0.256310 -0.070075 +v -0.069652 0.257637 -0.072423 +v -0.078870 0.316431 -0.081659 +v -0.078152 0.318718 -0.075009 +v -0.078560 0.312240 -0.086894 +v -0.077887 0.310226 -0.077775 +v -0.078505 0.312261 -0.069644 +v -0.077953 0.311521 -0.068776 +v -0.077488 0.311976 -0.069789 +v -0.077436 0.311408 -0.068404 +v -0.077652 0.312055 -0.071223 +v 0.074557 0.355035 -0.044165 +v 0.076741 0.344756 -0.053123 +v 0.070019 0.363939 -0.034310 +v 0.067852 0.351465 -0.025166 +v 0.072555 0.342594 -0.037929 +v 0.074304 0.333316 -0.046700 +v 0.075071 0.323873 -0.051961 +v 0.076754 0.333082 -0.058124 +v 0.028532 0.299302 0.014354 +v 0.031685 0.298659 0.013747 +v 0.031997 0.299929 0.014503 +v 0.028808 0.300535 0.015122 +v 0.034935 0.298503 0.012650 +v 0.035338 0.299851 0.013457 +v 0.035513 0.300940 0.014208 +v 0.032141 0.301055 0.015159 +v 0.028973 0.301626 0.015685 +v 0.049983 0.301060 0.002796 +v 0.051432 0.302144 0.001389 +v 0.049698 0.303256 0.002504 +v 0.048494 0.302298 0.003550 +v 0.052549 0.303597 0.000082 +v 0.050730 0.304534 0.001525 +v 0.049047 0.304996 0.003162 +v 0.048188 0.304036 0.003820 +v 0.047263 0.303289 0.004624 +v 0.046205 0.299696 0.006182 +v 0.048229 0.300262 0.004469 +v 0.046981 0.301622 0.004821 +v 0.045288 0.301181 0.006344 +v 0.046134 0.302764 0.005781 +v 0.044903 0.302387 0.007326 +v 0.041158 0.298705 0.009700 +v 0.043870 0.299195 0.007826 +v 0.043520 0.300764 0.008191 +v 0.041229 0.300238 0.010154 +v 0.043435 0.301925 0.009133 +v 0.041402 0.301327 0.011035 +v 0.038163 0.298481 0.011405 +v 0.038477 0.299918 0.011983 +v 0.038721 0.300987 0.012759 +v 0.053461 0.305650 -0.001052 +v 0.051725 0.306213 0.000587 +v 0.054155 0.308292 -0.001661 +v 0.052452 0.308404 0.000174 +v 0.050259 0.307806 0.003029 +v 0.050011 0.306082 0.002641 +v 0.014953 0.315947 0.014293 +v 0.013946 0.313268 0.012979 +v 0.015904 0.311974 0.013439 +v 0.016988 0.314271 0.014431 +v 0.013466 0.310930 0.012797 +v 0.015197 0.310353 0.013522 +v 0.016044 0.309792 0.013947 +v 0.016901 0.310624 0.014158 +v 0.018897 0.312192 0.015434 +v 0.013769 0.309005 0.013333 +v 0.015280 0.309162 0.013354 +v 0.014715 0.307397 0.013510 +v 0.016037 0.308033 0.013481 +v 0.016902 0.308236 0.013540 +v 0.016193 0.309149 0.013471 +v 0.022928 0.301520 0.014416 +v 0.025601 0.300339 0.014556 +v 0.025946 0.301609 0.015275 +v 0.023353 0.302720 0.015084 +v 0.026170 0.302523 0.015856 +v 0.023673 0.303605 0.015499 +v 0.018183 0.304026 0.014008 +v 0.020443 0.302659 0.014172 +v 0.021074 0.303823 0.014598 +v 0.018987 0.305066 0.014286 +v 0.021432 0.304544 0.014952 +v 0.019469 0.305627 0.014417 +v 0.016227 0.305790 0.013914 +v 0.017301 0.306659 0.013912 +v 0.017967 0.307013 0.013898 +v 0.046813 0.326484 0.017426 +v 0.040961 0.327833 0.021461 +v 0.039518 0.322635 0.020887 +v 0.044396 0.321612 0.017347 +v 0.032920 0.327921 0.024968 +v 0.033493 0.323087 0.022754 +v 0.032002 0.320662 0.020366 +v 0.037516 0.319713 0.019119 +v 0.041812 0.318611 0.016721 +v 0.052822 0.321422 0.007539 +v 0.050940 0.324337 0.012540 +v 0.048165 0.320163 0.013138 +v 0.050190 0.318390 0.008846 +v 0.045382 0.317246 0.013359 +v 0.047745 0.315984 0.009917 +v 0.054517 0.311290 -0.001201 +v 0.052692 0.311007 0.000773 +v 0.054709 0.314582 0.000659 +v 0.052302 0.313643 0.002437 +v 0.050159 0.312169 0.004654 +v 0.050822 0.310157 0.002991 +v 0.054203 0.318092 0.003639 +v 0.051412 0.316034 0.005220 +v 0.049091 0.314286 0.006925 +v 0.025212 0.323523 0.024636 +v 0.026459 0.322497 0.021869 +v 0.019576 0.321860 0.020338 +v 0.021075 0.320574 0.018663 +v 0.021866 0.318898 0.017801 +v 0.026233 0.320612 0.019647 +v 0.016552 0.318954 0.016740 +v 0.018430 0.317511 0.016067 +v 0.019800 0.316261 0.016126 +v 0.022937 0.315060 0.017695 +v 0.022466 0.317165 0.017417 +v 0.020714 0.315768 0.016514 +v 0.020838 0.313899 0.016613 +v 0.026575 0.315853 0.019223 +v 0.026197 0.318145 0.019080 +v 0.031563 0.315826 0.020196 +v 0.031458 0.318253 0.019934 +v 0.036320 0.315409 0.019228 +v 0.036534 0.317482 0.019039 +v 0.040390 0.314991 0.017026 +v 0.040662 0.316750 0.016847 +v 0.043492 0.314080 0.014167 +v 0.044006 0.315515 0.013851 +v 0.045522 0.312780 0.011198 +v 0.046250 0.314275 0.010680 +v 0.048334 0.310062 0.006428 +v 0.049019 0.311049 0.005850 +v 0.047884 0.312850 0.007995 +v 0.047118 0.311428 0.008623 +v 0.049280 0.309089 0.004604 +v 0.049778 0.309935 0.004429 +v 0.066612 0.297037 -0.016429 +v 0.065299 0.289010 -0.013583 +v 0.063948 0.301439 -0.010967 +v 0.063008 0.294754 -0.008455 +v 0.061498 0.289912 -0.005147 +v 0.063662 0.282963 -0.009601 +v 0.061061 0.278468 -0.004800 +v 0.059228 0.286595 -0.001460 +v 0.056465 0.284629 0.002421 +v 0.057664 0.275477 0.000453 +v 0.052912 0.283711 0.006066 +v 0.053491 0.274089 0.005723 +v 0.049018 0.283878 0.009274 +v 0.048961 0.274802 0.010459 +v 0.025434 0.257591 0.027235 +v 0.029202 0.252466 0.026631 +v 0.030880 0.254322 0.025284 +v 0.027694 0.259316 0.025358 +v 0.032860 0.256148 0.024019 +v 0.029733 0.261289 0.024185 +v 0.024407 0.269435 0.023591 +v 0.022450 0.267301 0.024381 +v 0.024840 0.263728 0.024892 +v 0.026919 0.265758 0.024080 +v 0.020457 0.265882 0.025508 +v 0.022546 0.262587 0.026093 +v 0.017721 0.275417 0.026636 +v 0.017912 0.275094 0.028333 +v 0.017992 0.272996 0.028509 +v 0.017812 0.272859 0.027191 +v 0.018065 0.274710 0.029507 +v 0.018071 0.273095 0.030218 +v 0.017277 0.270706 0.031989 +v 0.017623 0.271182 0.029198 +v 0.017667 0.271591 0.027876 +v 0.017120 0.269900 0.027909 +v 0.017425 0.270748 0.027798 +v 0.017091 0.269798 0.029571 +v 0.016656 0.268899 0.029417 +v 0.016323 0.268859 0.032124 +v 0.015108 0.267643 0.032267 +v 0.015034 0.267052 0.029716 +v 0.015155 0.267309 0.030799 +v 0.013156 0.266420 0.032851 +v 0.013173 0.266168 0.031895 +v 0.012901 0.266747 0.034086 +v 0.011087 0.267215 0.035115 +v 0.011224 0.266596 0.034316 +v 0.011151 0.266232 0.033527 +v 0.013587 0.267482 0.034800 +v 0.012068 0.267417 0.035328 +v 0.012115 0.268673 0.035922 +v 0.011143 0.269103 0.035625 +v 0.010108 0.269627 0.035291 +v 0.010631 0.268251 0.035675 +v 0.013821 0.269276 0.036588 +v 0.012972 0.268649 0.036073 +v 0.014825 0.268278 0.034633 +v 0.015697 0.269479 0.035045 +v 0.005223 0.303479 0.033202 +v 0.007083 0.300849 0.030148 +v 0.007147 0.303756 0.027626 +v 0.005509 0.306691 0.030536 +v 0.009071 0.298027 0.027228 +v 0.009043 0.300724 0.025068 +v 0.008933 0.302823 0.022327 +v 0.007213 0.306160 0.024444 +v 0.005745 0.310181 0.026871 +v 0.007687 0.262398 0.036535 +v 0.005841 0.262346 0.037690 +v 0.005778 0.260803 0.038056 +v 0.007766 0.260799 0.037044 +v 0.004033 0.262129 0.038203 +v 0.003897 0.260538 0.038365 +v 0.003710 0.258697 0.038418 +v 0.005612 0.259002 0.038411 +v 0.007671 0.258927 0.037609 +v 0.016819 0.273609 0.035920 +v 0.015820 0.271842 0.037582 +v 0.016055 0.270664 0.036077 +v 0.017392 0.272125 0.033981 +v 0.014406 0.270834 0.038345 +v 0.014349 0.269974 0.037251 +v 0.012353 0.272765 0.041867 +v 0.013771 0.271876 0.039859 +v 0.014822 0.273086 0.039489 +v 0.013152 0.274052 0.042001 +v 0.015519 0.275017 0.038344 +v 0.013370 0.276328 0.042070 +v 0.002012 0.260110 0.037878 +v 0.001823 0.258246 0.037909 +v 0.002205 0.261824 0.037894 +v 0.000134 0.261647 0.037386 +v -0.000050 0.259859 0.037343 +v -0.000161 0.257987 0.037348 +v 0.000822 0.266665 0.039644 +v 0.000752 0.266251 0.039184 +v 0.002694 0.266268 0.039058 +v 0.002708 0.266841 0.039371 +v 0.000684 0.265786 0.038818 +v 0.002608 0.265722 0.038838 +v 0.004407 0.265994 0.038302 +v 0.004513 0.266721 0.038359 +v 0.004695 0.267762 0.038590 +v 0.003960 0.268230 0.039465 +v 0.002592 0.267370 0.039901 +v 0.003630 0.268744 0.040292 +v 0.002501 0.267909 0.040624 +v 0.001026 0.267519 0.040919 +v 0.000908 0.267095 0.040189 +v 0.017963 0.260372 0.029766 +v 0.018777 0.257592 0.030959 +v 0.022142 0.255862 0.029776 +v 0.021439 0.259363 0.028616 +v 0.019225 0.254555 0.032134 +v 0.022174 0.252610 0.030741 +v 0.024699 0.250358 0.029653 +v 0.025338 0.253440 0.028784 +v 0.018220 0.265067 0.026916 +v 0.019838 0.262541 0.027488 +v 0.015732 0.264729 0.028605 +v 0.016847 0.262796 0.028967 +v 0.012079 0.261869 0.033301 +v 0.012512 0.259875 0.034083 +v 0.015479 0.258872 0.032401 +v 0.014837 0.261227 0.031463 +v 0.012708 0.257547 0.034913 +v 0.015865 0.256194 0.033451 +v 0.013344 0.264768 0.030664 +v 0.014010 0.263153 0.030817 +v 0.011136 0.264794 0.032587 +v 0.011541 0.263474 0.032778 +v 0.012975 0.265953 0.030950 +v 0.015001 0.266237 0.028891 +v 0.010947 0.265855 0.032743 +v 0.007588 0.263706 0.036185 +v 0.005877 0.263638 0.037502 +v 0.007512 0.264819 0.035937 +v 0.005902 0.264691 0.037346 +v 0.004186 0.264481 0.038168 +v 0.004129 0.263448 0.038195 +v 0.007525 0.266645 0.035923 +v 0.006040 0.266399 0.037204 +v 0.005953 0.265591 0.037256 +v 0.007484 0.265799 0.035849 +v 0.004315 0.265290 0.038234 +v 0.009355 0.267237 0.035279 +v 0.009195 0.266696 0.034710 +v 0.009378 0.267848 0.035716 +v 0.007838 0.268155 0.036387 +v 0.007636 0.267406 0.036118 +v 0.009247 0.268763 0.035904 +v 0.008923 0.269897 0.035477 +v 0.007872 0.270106 0.036227 +v 0.007930 0.269053 0.036446 +v 0.006788 0.269170 0.037334 +v 0.006424 0.268136 0.037308 +v 0.007061 0.270319 0.037215 +v 0.006355 0.270512 0.038268 +v 0.005771 0.269267 0.038320 +v 0.006179 0.267223 0.037247 +v 0.009141 0.265860 0.034371 +v 0.009235 0.264811 0.034337 +v 0.009446 0.263628 0.034572 +v 0.009717 0.262226 0.035026 +v 0.009903 0.260498 0.035594 +v 0.010030 0.258495 0.036420 +v 0.001708 0.256240 0.037973 +v 0.003561 0.256700 0.038635 +v -0.000192 0.256113 0.037603 +v -0.000175 0.254220 0.038365 +v 0.001759 0.254285 0.038561 +v 0.003628 0.254656 0.039032 +v 0.005407 0.257013 0.038733 +v 0.007530 0.256898 0.038214 +v 0.005408 0.254945 0.039195 +v 0.007459 0.254789 0.038701 +v 0.002013 0.252179 0.039847 +v 0.003958 0.252589 0.039913 +v -0.000056 0.252054 0.039901 +v 0.000094 0.249401 0.040601 +v 0.002359 0.249588 0.040521 +v 0.004407 0.250070 0.040211 +v 0.005723 0.252820 0.039848 +v 0.007658 0.252583 0.038972 +v 0.006261 0.250328 0.039747 +v 0.008345 0.250114 0.038675 +v 0.013875 0.248089 0.035480 +v 0.013243 0.250346 0.035985 +v 0.010193 0.251754 0.037627 +v 0.011005 0.249312 0.037262 +v 0.012908 0.252650 0.036019 +v 0.009876 0.254000 0.037420 +v 0.009941 0.256283 0.037072 +v 0.012761 0.255073 0.035591 +v 0.016138 0.253425 0.034283 +v 0.016293 0.250855 0.034618 +v 0.019047 0.249132 0.032840 +v 0.019202 0.251605 0.032687 +v 0.021259 0.247491 0.031190 +v 0.021818 0.249794 0.031257 +v 0.023047 0.245746 0.029928 +v 0.023902 0.247807 0.030028 +v 0.026870 0.247746 0.028735 +v 0.028025 0.250127 0.027939 +v 0.024325 0.244140 0.028830 +v 0.025586 0.245671 0.029040 +v 0.021806 0.242882 0.028895 +v 0.022571 0.242261 0.027895 +v 0.023282 0.243059 0.028466 +v 0.022332 0.244225 0.029567 +v 0.023178 0.241914 0.027095 +v 0.018874 0.245164 0.032159 +v 0.020628 0.243954 0.030366 +v 0.020886 0.245612 0.030988 +v 0.018852 0.247091 0.032591 +v 0.016652 0.246469 0.033961 +v 0.016378 0.248664 0.034424 +v 0.001281 0.268938 0.045590 +v 0.001323 0.268654 0.044257 +v 0.002713 0.269350 0.044088 +v 0.002806 0.269689 0.045475 +v 0.001284 0.268331 0.043011 +v 0.002621 0.268939 0.042773 +v 0.003594 0.269851 0.042520 +v 0.003752 0.270298 0.043837 +v 0.004038 0.270661 0.045226 +v 0.003528 0.269321 0.041309 +v 0.002513 0.268453 0.041584 +v 0.001167 0.267945 0.041871 +v 0.005755 0.270659 0.039406 +v 0.005013 0.269430 0.039280 +v 0.005202 0.270859 0.040613 +v 0.004524 0.269822 0.040250 +v 0.004811 0.271281 0.041868 +v 0.004271 0.270339 0.041388 +v 0.004810 0.271877 0.043133 +v 0.004232 0.270911 0.042645 +v 0.005245 0.272185 0.044222 +v 0.004470 0.271360 0.043874 +v 0.005664 0.272106 0.044884 +v 0.004974 0.271596 0.045015 +v 0.009847 0.274759 0.046500 +v 0.009271 0.273937 0.046188 +v 0.011160 0.274182 0.044489 +v 0.011301 0.275411 0.045298 +v 0.008229 0.273066 0.045473 +v 0.010481 0.273178 0.043907 +v 0.005131 0.271817 0.047635 +v 0.006661 0.272712 0.046800 +v 0.007672 0.273617 0.047459 +v 0.005983 0.272982 0.048626 +v 0.008830 0.274850 0.047670 +v 0.007101 0.274674 0.049265 +v 0.005741 0.271975 0.045999 +v 0.004514 0.271084 0.046519 +v 0.006539 0.272411 0.045324 +v 0.002982 0.270060 0.046862 +v 0.001200 0.269240 0.047069 +v 0.003305 0.270698 0.048316 +v 0.001061 0.269954 0.048766 +v 0.003802 0.272027 0.049778 +v 0.001025 0.271340 0.050731 +v 0.004485 0.274199 0.051094 +v 0.001014 0.273899 0.052471 +v 0.005239 0.277177 0.051985 +v 0.001052 0.277372 0.053467 +v 0.008557 0.276794 0.049327 +v 0.009461 0.279464 0.048143 +v 0.005680 0.280738 0.051334 +v 0.001191 0.281249 0.052788 +v 0.010348 0.276349 0.046977 +v 0.011628 0.278211 0.045199 +v 0.009128 0.284283 0.044349 +v 0.009555 0.282009 0.046209 +v 0.012074 0.280346 0.042988 +v 0.011487 0.282328 0.040846 +v 0.013867 0.278697 0.039619 +v 0.013331 0.280670 0.037602 +v 0.007899 0.288482 0.041559 +v 0.007229 0.290263 0.040319 +v 0.003960 0.291706 0.043084 +v 0.004487 0.290035 0.044415 +v 0.006596 0.292136 0.039105 +v 0.003507 0.293545 0.041781 +v 0.000007 0.294189 0.043187 +v 0.000277 0.292302 0.044478 +v 0.000478 0.290579 0.045744 +v 0.005058 0.288322 0.045880 +v 0.008503 0.286479 0.042853 +v 0.000735 0.288837 0.047139 +v 0.000986 0.286803 0.048778 +v 0.005564 0.286269 0.047551 +v 0.005764 0.283778 0.049462 +v 0.001126 0.284371 0.050824 +v 0.002313 0.263237 0.038140 +v 0.002409 0.264313 0.038428 +v 0.000487 0.264384 0.038024 +v 0.000324 0.263195 0.037634 +v 0.002506 0.265104 0.038642 +v 0.000588 0.265195 0.038482 +v 0.064587 0.371763 -0.025908 +v 0.058782 0.377861 -0.018773 +v 0.057387 0.370972 -0.010648 +v 0.062655 0.363857 -0.017094 +v 0.075139 0.312652 -0.048034 +v 0.074502 0.300290 -0.047312 +v 0.073486 0.320129 -0.042191 +v 0.073785 0.305597 -0.040360 +v 0.071791 0.311888 -0.033401 +v 0.071223 0.296586 -0.032913 +v 0.072559 0.290524 -0.040745 +v 0.068741 0.317322 -0.026039 +v 0.069456 0.302979 -0.025283 +v 0.073446 0.287216 -0.047286 +v 0.067887 0.333183 -0.025743 +v 0.070977 0.327718 -0.034691 +v 0.058082 0.306625 -0.005108 +v 0.057584 0.302493 -0.003733 +v 0.060185 0.299207 -0.005402 +v 0.060841 0.304584 -0.007401 +v 0.056612 0.299453 -0.001711 +v 0.059033 0.295330 -0.002654 +v 0.056426 0.311637 -0.003097 +v 0.056913 0.316142 -0.001338 +v 0.055956 0.307739 -0.003356 +v 0.058454 0.311768 -0.005314 +v 0.058793 0.317942 -0.003952 +v 0.055359 0.304527 -0.002497 +v 0.054498 0.302081 -0.001016 +v 0.020525 0.293467 0.016639 +v 0.021006 0.295611 0.015029 +v 0.017949 0.297106 0.015864 +v 0.017566 0.295059 0.017747 +v 0.021725 0.297950 0.014070 +v 0.018639 0.299151 0.014466 +v 0.015665 0.300844 0.015047 +v 0.014962 0.299279 0.016991 +v 0.014591 0.297490 0.019183 +v 0.011369 0.295381 0.024795 +v 0.011502 0.297961 0.022978 +v 0.013915 0.293001 0.022841 +v 0.014192 0.295370 0.021133 +v 0.011752 0.300152 0.020757 +v 0.009751 0.292471 0.030319 +v 0.011899 0.290118 0.027643 +v 0.011536 0.292685 0.026333 +v 0.009295 0.295180 0.028938 +v 0.013833 0.287947 0.025429 +v 0.013875 0.290485 0.024317 +v 0.014252 0.283647 0.027412 +v 0.013886 0.285636 0.026396 +v 0.012116 0.287765 0.028678 +v 0.012344 0.285657 0.029625 +v 0.010277 0.290048 0.031504 +v 0.010721 0.287903 0.032522 +v 0.017540 0.271788 0.026599 +v 0.017503 0.273193 0.025460 +v 0.017078 0.270178 0.026999 +v 0.017369 0.270445 0.025514 +v 0.016427 0.268586 0.028620 +v 0.016152 0.268213 0.027472 +v 0.016940 0.266927 0.026843 +v 0.018750 0.268281 0.025157 +v 0.020370 0.274942 0.023165 +v 0.018860 0.272533 0.023885 +v 0.020439 0.270131 0.024045 +v 0.022235 0.272445 0.023281 +v 0.016975 0.279362 0.024147 +v 0.017316 0.277397 0.025313 +v 0.017584 0.274988 0.024278 +v 0.018563 0.277217 0.023301 +v 0.019291 0.289089 0.020113 +v 0.018723 0.286644 0.021629 +v 0.021283 0.284938 0.021074 +v 0.022088 0.287504 0.019422 +v 0.018118 0.284109 0.022708 +v 0.020407 0.282254 0.022210 +v 0.022786 0.280265 0.022084 +v 0.023907 0.283121 0.020806 +v 0.024964 0.285988 0.019173 +v 0.017466 0.281644 0.023348 +v 0.019482 0.279632 0.022787 +v 0.021588 0.277491 0.022775 +v 0.016807 0.277621 0.032449 +v 0.017814 0.275951 0.030573 +v 0.017474 0.277232 0.029230 +v 0.016235 0.279185 0.031025 +v 0.017053 0.278404 0.027874 +v 0.015604 0.280562 0.029715 +v 0.017163 0.275712 0.034062 +v 0.015648 0.277222 0.036554 +v 0.015155 0.279179 0.034817 +v 0.017964 0.274147 0.032019 +v 0.014874 0.281958 0.028526 +v 0.012798 0.283811 0.030730 +v 0.013567 0.282264 0.031954 +v 0.011159 0.285964 0.033564 +v 0.011714 0.284161 0.034686 +v 0.009520 0.288226 0.036922 +v 0.010021 0.286305 0.037974 +v 0.008922 0.290153 0.035841 +v 0.012474 0.282411 0.035979 +v 0.010629 0.284264 0.039225 +v 0.014400 0.280821 0.033292 +v 0.015822 0.281551 0.025642 +v 0.016436 0.279816 0.026703 +v 0.015616 0.283619 0.024592 +v 0.015873 0.285941 0.023731 +v 0.016196 0.288433 0.022654 +v 0.016567 0.290869 0.021253 +v 0.017041 0.293067 0.019570 +v 0.019922 0.291329 0.018353 +v 0.026559 0.291203 0.015521 +v 0.027197 0.293543 0.014385 +v 0.024061 0.294447 0.014512 +v 0.023460 0.292230 0.015819 +v 0.027775 0.295782 0.013981 +v 0.024772 0.296847 0.014079 +v 0.022861 0.290008 0.017661 +v 0.025856 0.288732 0.017264 +v 0.023810 0.275028 0.022935 +v 0.025345 0.277963 0.022185 +v 0.026243 0.272026 0.023047 +v 0.028117 0.275113 0.022306 +v 0.026745 0.281046 0.020806 +v 0.027986 0.284178 0.019011 +v 0.029816 0.278506 0.020868 +v 0.031266 0.282073 0.018980 +v 0.029002 0.268347 0.023337 +v 0.031164 0.271524 0.022402 +v 0.032005 0.263798 0.023223 +v 0.034488 0.266963 0.022074 +v 0.035181 0.258363 0.022657 +v 0.037956 0.261219 0.021164 +v 0.038800 0.275659 0.017930 +v 0.036886 0.270912 0.020263 +v 0.040708 0.264956 0.018779 +v 0.043127 0.270409 0.016055 +v 0.034793 0.279337 0.018676 +v 0.033195 0.275247 0.020784 +v 0.040809 0.286536 0.013696 +v 0.036883 0.287893 0.014716 +v 0.035959 0.283647 0.016410 +v 0.039993 0.281127 0.015554 +v 0.033215 0.289046 0.015192 +v 0.032361 0.285609 0.016896 +v 0.044924 0.284998 0.011881 +v 0.044462 0.277836 0.013820 +v 0.047988 0.294991 0.006932 +v 0.044819 0.294596 0.008976 +v 0.045057 0.290645 0.010329 +v 0.048701 0.290512 0.008117 +v 0.041327 0.294368 0.010740 +v 0.041247 0.291053 0.012047 +v 0.037700 0.294396 0.012200 +v 0.037418 0.291581 0.013295 +v 0.034216 0.294694 0.013163 +v 0.033703 0.292151 0.013842 +v 0.029737 0.290102 0.015257 +v 0.028995 0.287255 0.017041 +v 0.030895 0.295092 0.013687 +v 0.030340 0.292794 0.014224 +v 0.031340 0.297057 0.013564 +v 0.034606 0.296779 0.012710 +v 0.028209 0.297755 0.013922 +v 0.053230 0.296338 0.002712 +v 0.050832 0.295588 0.004877 +v 0.052087 0.290822 0.005727 +v 0.054983 0.291543 0.003059 +v 0.057285 0.292894 0.000222 +v 0.055148 0.297502 0.000485 +v 0.053304 0.300444 0.000761 +v 0.051620 0.299298 0.002566 +v 0.049606 0.298483 0.004516 +v 0.047189 0.297781 0.006355 +v 0.037936 0.296658 0.011574 +v 0.041272 0.296786 0.010038 +v 0.044365 0.297194 0.008171 +v 0.025254 0.298828 0.014050 +v 0.022393 0.299969 0.014004 +v 0.019615 0.301115 0.013968 +v 0.016954 0.302513 0.014076 +v 0.005937 0.294325 0.037836 +v 0.003087 0.295806 0.040477 +v 0.005412 0.296998 0.036525 +v 0.002793 0.298615 0.039137 +v -0.000573 0.299150 0.040011 +v -0.000287 0.296488 0.041786 +v 0.008233 0.292328 0.034689 +v 0.007563 0.294861 0.033415 +v 0.007213 0.297794 0.032013 +v 0.005121 0.300113 0.035079 +v 0.002448 0.301846 0.037455 +v 0.002372 0.305215 0.035396 +v -0.001025 0.305740 0.035929 +v -0.000853 0.302364 0.038009 +v -0.000837 0.311963 0.031451 +v -0.000923 0.308940 0.033721 +v 0.002629 0.308463 0.032952 +v 0.002716 0.311630 0.030472 +v -0.001007 0.317713 0.029099 +v 0.002328 0.317656 0.028086 +v 0.002688 0.320424 0.028754 +v -0.000996 0.320428 0.029329 +v 0.005317 0.317601 0.025642 +v 0.005936 0.320322 0.026836 +v 0.006658 0.322625 0.028847 +v 0.003069 0.322943 0.029945 +v -0.000977 0.323133 0.030068 +v 0.002402 0.314703 0.028696 +v 0.005178 0.314373 0.025823 +v -0.000946 0.314907 0.029808 +v 0.013471 0.322377 0.024477 +v 0.011388 0.320333 0.021168 +v 0.014027 0.319909 0.018535 +v 0.016941 0.322158 0.022425 +v 0.009802 0.317673 0.018779 +v 0.012258 0.317230 0.015652 +v 0.009674 0.304470 0.019399 +v 0.007630 0.307509 0.020551 +v 0.010746 0.305539 0.016335 +v 0.009084 0.308271 0.016788 +v 0.008244 0.311428 0.017096 +v 0.006867 0.311175 0.021746 +v 0.012148 0.301783 0.018200 +v 0.012926 0.303032 0.015644 +v 0.014521 0.304318 0.014055 +v 0.012689 0.306467 0.014232 +v 0.011322 0.308725 0.014071 +v 0.010357 0.311316 0.013411 +v 0.010873 0.314466 0.013815 +v 0.008648 0.314746 0.017499 +v 0.007081 0.314557 0.021969 +v 0.007805 0.317623 0.022353 +v 0.008756 0.320327 0.024044 +v 0.009921 0.322595 0.026664 +v 0.009063 0.329588 0.032102 +v 0.007689 0.325300 0.030872 +v 0.011759 0.325131 0.029336 +v 0.014358 0.329434 0.031053 +v 0.016559 0.324481 0.027967 +v 0.020055 0.329177 0.029854 +v -0.002642 0.364155 0.026757 +v -0.002658 0.352584 0.027557 +v 0.005778 0.352573 0.027738 +v 0.006730 0.363783 0.026304 +v -0.002496 0.343759 0.030501 +v 0.005086 0.343890 0.031104 +v 0.012348 0.344107 0.031655 +v 0.013557 0.352450 0.027713 +v 0.015129 0.362981 0.025136 +v -0.002167 0.336016 0.032656 +v 0.004329 0.335971 0.032999 +v -0.001659 0.329902 0.032066 +v 0.003745 0.329885 0.032183 +v 0.010805 0.335920 0.033075 +v 0.020488 0.352443 0.026674 +v 0.022393 0.362626 0.023600 +v 0.019190 0.344141 0.030692 +v 0.025488 0.344170 0.028667 +v 0.026670 0.352587 0.024597 +v 0.028811 0.362591 0.021305 +v 0.036734 0.343833 0.021682 +v 0.031217 0.344100 0.025453 +v 0.029414 0.335980 0.027331 +v 0.035548 0.335730 0.023908 +v 0.023252 0.336017 0.030003 +v 0.026046 0.329152 0.027711 +v 0.021541 0.323981 0.026359 +v 0.047022 0.333411 0.015220 +v 0.041618 0.335159 0.019883 +v 0.047245 0.340861 0.012479 +v 0.042120 0.342948 0.017350 +v 0.042895 0.351509 0.013457 +v 0.037528 0.352515 0.017748 +v 0.048385 0.348950 0.008808 +v 0.051353 0.357163 0.004035 +v 0.045963 0.360498 0.009151 +v 0.040466 0.362102 0.014014 +v 0.054818 0.364352 -0.002729 +v 0.059225 0.357505 -0.008421 +v 0.055565 0.351143 -0.001567 +v 0.058859 0.342507 -0.006858 +v 0.063010 0.347324 -0.013561 +v 0.051188 0.330199 0.010133 +v 0.054142 0.325922 0.005400 +v 0.055062 0.331335 0.002381 +v 0.051642 0.336952 0.007227 +v 0.056167 0.321159 0.001562 +v 0.057439 0.324855 -0.001384 +v 0.061422 0.331847 -0.010833 +v 0.064358 0.333936 -0.017482 +v 0.063428 0.320514 -0.012653 +v 0.066179 0.320064 -0.018804 +v 0.060891 0.311419 -0.008383 +v 0.060857 0.319588 -0.007726 +v 0.063995 0.310187 -0.012575 +v 0.067111 0.307541 -0.018277 +v 0.059154 0.328568 -0.005478 +v 0.056291 0.337033 -0.001773 +v 0.052685 0.344052 0.003303 +v 0.008251 0.375867 0.022419 +v -0.002002 0.376367 0.023033 +v 0.017479 0.374882 0.021291 +v 0.018739 0.384944 0.015308 +v 0.008987 0.385879 0.016809 +v -0.001754 0.386278 0.017497 +v 0.025283 0.374125 0.019373 +v 0.032140 0.373505 0.016600 +v 0.033839 0.382538 0.009646 +v 0.026862 0.383793 0.012843 +v -0.001709 0.394459 0.010632 +v 0.009179 0.394202 0.009955 +v 0.019020 0.393152 0.008028 +v 0.027344 0.391848 0.005332 +v 0.034458 0.390182 0.001934 +v 0.046063 0.378730 0.000791 +v 0.051821 0.375610 -0.004696 +v 0.052964 0.382307 -0.012427 +v 0.047011 0.385544 -0.006906 +v 0.040193 0.380983 0.005676 +v 0.040960 0.388169 -0.002081 +v 0.049517 0.368489 0.002781 +v 0.044109 0.371068 0.008198 +v 0.034716 0.362582 0.018030 +v 0.038332 0.372625 0.012858 +v 0.032159 0.352684 0.021421 +v 0.017118 0.335926 0.032087 +v -0.001150 0.326017 0.030904 +v 0.003377 0.325837 0.030960 +v -0.070859 0.348085 -0.026912 +v -0.072814 0.361527 -0.036096 +v -0.075638 0.352622 -0.045515 +v -0.074166 0.339469 -0.038538 +v -0.076892 0.342620 -0.053840 +v -0.075432 0.330622 -0.047452 +v -0.076882 0.331048 -0.058560 +v -0.075700 0.321488 -0.053199 +v -0.034533 0.300093 0.014109 +v -0.034175 0.298994 0.013510 +v -0.030501 0.299835 0.014172 +v -0.030926 0.300728 0.014895 +v -0.033698 0.297892 0.013093 +v -0.029978 0.298718 0.013927 +v -0.026490 0.299775 0.014333 +v -0.027105 0.300786 0.014640 +v -0.027568 0.301643 0.015251 +v -0.049210 0.304635 0.004477 +v -0.051448 0.305277 0.002797 +v -0.050333 0.303634 0.003397 +v -0.048454 0.303637 0.004953 +v -0.053689 0.305201 0.001058 +v -0.052375 0.303147 0.001882 +v -0.050579 0.301352 0.003116 +v -0.048921 0.302185 0.004358 +v -0.047558 0.302706 0.005721 +v -0.047328 0.301076 0.005690 +v -0.046471 0.301867 0.006763 +v -0.048435 0.299920 0.004797 +v -0.046120 0.298894 0.006501 +v -0.045520 0.300225 0.007137 +v -0.045303 0.301019 0.008119 +v -0.043473 0.299536 0.008755 +v -0.043593 0.300383 0.009577 +v -0.043542 0.298233 0.008246 +v -0.040571 0.297819 0.009954 +v -0.040886 0.299100 0.010449 +v -0.041193 0.300012 0.011154 +v -0.037766 0.298830 0.012245 +v -0.038069 0.299944 0.012785 +v -0.037246 0.297654 0.011661 +v -0.049935 0.306652 0.005324 +v -0.053401 0.308997 0.003180 +v -0.052572 0.307042 0.002787 +v -0.049940 0.305684 0.004422 +v -0.055946 0.310201 0.001334 +v -0.054912 0.307455 0.000884 +v -0.015869 0.309999 0.014013 +v -0.014890 0.310491 0.013691 +v -0.015688 0.311604 0.013635 +v -0.016545 0.310564 0.014247 +v -0.013479 0.311106 0.013342 +v -0.014360 0.312836 0.013533 +v -0.015804 0.315245 0.014823 +v -0.017046 0.313580 0.014546 +v -0.018591 0.311536 0.014927 +v -0.016141 0.308960 0.013669 +v -0.015329 0.308839 0.013645 +v -0.014815 0.309694 0.013746 +v -0.015769 0.309555 0.013866 +v -0.014113 0.308506 0.013681 +v -0.013516 0.309738 0.013643 +v -0.024213 0.302052 0.014656 +v -0.024775 0.302860 0.015129 +v -0.023509 0.301122 0.014319 +v -0.020898 0.302859 0.014119 +v -0.021752 0.303737 0.014535 +v -0.022373 0.304447 0.014793 +v -0.019428 0.305348 0.014374 +v -0.020091 0.305947 0.014393 +v -0.018471 0.304519 0.014044 +v -0.016484 0.305994 0.013991 +v -0.017501 0.306722 0.014121 +v -0.018136 0.307192 0.014111 +v -0.016222 0.307831 0.013644 +v -0.016904 0.308160 0.013701 +v -0.015093 0.307278 0.013807 +v -0.034592 0.321005 0.019891 +v -0.035804 0.323905 0.022011 +v -0.041984 0.323800 0.021481 +v -0.039865 0.320646 0.019300 +v -0.036108 0.328075 0.025204 +v -0.043562 0.328786 0.021881 +v -0.049069 0.327551 0.018765 +v -0.046831 0.322932 0.018900 +v -0.044118 0.319475 0.017728 +v -0.050500 0.321176 0.015426 +v -0.047498 0.317780 0.014888 +v -0.053256 0.325180 0.014964 +v -0.055727 0.322498 0.010841 +v -0.052791 0.318822 0.011805 +v -0.049586 0.315571 0.011840 +v -0.050489 0.310995 0.007475 +v -0.053397 0.313667 0.006347 +v -0.053756 0.311290 0.004301 +v -0.050834 0.308967 0.005719 +v -0.057352 0.316837 0.004767 +v -0.056968 0.313417 0.002657 +v -0.053111 0.316378 0.008886 +v -0.050135 0.313292 0.009582 +v -0.057011 0.319724 0.007487 +v -0.022943 0.318167 0.017832 +v -0.022611 0.319997 0.018483 +v -0.028692 0.322629 0.020572 +v -0.028264 0.320174 0.019328 +v -0.021767 0.321506 0.019701 +v -0.027979 0.323965 0.023231 +v -0.018986 0.316831 0.016300 +v -0.020023 0.315413 0.016032 +v -0.017917 0.318317 0.017035 +v -0.023137 0.316201 0.017474 +v -0.020813 0.314775 0.016371 +v -0.023056 0.314035 0.017412 +v -0.020548 0.312924 0.016057 +v -0.033496 0.317934 0.019847 +v -0.027736 0.317510 0.019101 +v -0.033005 0.314833 0.020429 +v -0.027376 0.314777 0.019327 +v -0.042753 0.316337 0.017254 +v -0.038626 0.317489 0.019012 +v -0.042196 0.313278 0.017049 +v -0.038228 0.314337 0.019529 +v -0.047595 0.312830 0.011847 +v -0.045774 0.314740 0.014552 +v -0.046784 0.310241 0.011947 +v -0.044980 0.311864 0.014391 +v -0.048615 0.310840 0.009824 +v -0.049179 0.308900 0.008162 +v -0.048561 0.307134 0.008491 +v -0.047915 0.308454 0.010100 +v -0.048986 0.306601 0.006996 +v -0.049683 0.307709 0.007043 +v -0.062467 0.290684 -0.004464 +v -0.063300 0.295239 -0.006786 +v -0.065777 0.288377 -0.010636 +v -0.064498 0.282601 -0.008063 +v -0.063678 0.301669 -0.008427 +v -0.066243 0.296165 -0.012376 +v -0.058431 0.285171 0.002197 +v -0.060852 0.287415 -0.001402 +v -0.062507 0.278203 -0.004292 +v -0.059613 0.275192 0.000238 +v -0.051362 0.274519 0.009877 +v -0.055817 0.273781 0.005027 +v -0.050846 0.283932 0.009464 +v -0.055074 0.283985 0.005950 +v -0.029422 0.253195 0.026258 +v -0.031851 0.255181 0.025055 +v -0.027501 0.251028 0.027570 +v -0.023934 0.256703 0.027936 +v -0.026349 0.258689 0.026253 +v -0.028665 0.260822 0.025292 +v -0.020860 0.262272 0.026864 +v -0.023184 0.263471 0.025730 +v -0.018005 0.266021 0.026572 +v -0.020191 0.267414 0.025357 +v -0.022427 0.269588 0.024520 +v -0.025430 0.265588 0.024945 +v -0.016129 0.271790 0.037582 +v -0.016954 0.274327 0.036185 +v -0.017634 0.274339 0.034324 +v -0.017453 0.272330 0.035087 +v -0.016984 0.275916 0.035296 +v -0.017209 0.276482 0.033762 +v -0.017628 0.276909 0.031580 +v -0.018195 0.274175 0.032680 +v -0.018042 0.272600 0.033635 +v -0.017080 0.270518 0.035150 +v -0.015243 0.269476 0.037146 +v -0.018025 0.271587 0.033435 +v -0.017793 0.270331 0.033343 +v -0.016674 0.269037 0.034716 +v -0.013582 0.267855 0.036454 +v -0.009403 0.268514 0.035286 +v -0.010936 0.268024 0.035732 +v -0.011266 0.267173 0.035078 +v -0.009463 0.267813 0.034752 +v -0.013846 0.266879 0.035089 +v -0.014159 0.266490 0.033852 +v -0.011465 0.266637 0.034221 +v -0.009360 0.267204 0.034106 +v -0.008763 0.269989 0.035317 +v -0.009839 0.269931 0.035481 +v -0.010380 0.269045 0.035841 +v -0.009146 0.269251 0.035508 +v -0.010835 0.269892 0.036415 +v -0.011739 0.268847 0.036907 +v -0.013091 0.269310 0.038077 +v -0.011603 0.269987 0.037731 +v -0.012038 0.270325 0.039177 +v -0.013880 0.270420 0.039229 +v -0.008978 0.304598 0.023383 +v -0.008982 0.302456 0.026296 +v -0.007839 0.304857 0.028359 +v -0.007880 0.307205 0.025036 +v -0.009128 0.299817 0.028726 +v -0.007859 0.301955 0.031032 +v -0.006316 0.303943 0.033358 +v -0.006450 0.307068 0.030608 +v -0.006858 0.310519 0.027021 +v -0.004248 0.258604 0.038094 +v -0.004147 0.260419 0.037931 +v -0.006115 0.260487 0.037461 +v -0.006333 0.258604 0.037704 +v -0.003887 0.262081 0.037743 +v -0.005686 0.262202 0.037292 +v -0.007385 0.262052 0.036183 +v -0.008036 0.260255 0.036503 +v -0.008419 0.258219 0.036875 +v -0.012045 0.270928 0.040615 +v -0.013790 0.271550 0.040618 +v -0.011667 0.271548 0.042032 +v -0.013150 0.272523 0.042109 +v -0.014434 0.274229 0.041319 +v -0.015369 0.273083 0.039558 +v -0.012075 0.273310 0.043798 +v -0.013108 0.275288 0.043362 +v -0.010853 0.272103 0.043509 +v -0.009516 0.272384 0.044864 +v -0.010497 0.273690 0.045570 +v -0.011169 0.276126 0.046073 +v -0.001918 0.261798 0.037649 +v -0.002079 0.260067 0.037607 +v -0.002128 0.258240 0.037750 +v -0.002976 0.266243 0.038418 +v -0.001217 0.265986 0.038738 +v -0.001163 0.266511 0.039170 +v -0.003008 0.266928 0.038742 +v -0.001080 0.266970 0.039715 +v -0.003184 0.267809 0.039222 +v -0.000603 0.267649 0.041125 +v -0.000863 0.267335 0.040372 +v -0.002082 0.268350 0.041179 +v -0.002426 0.268148 0.040267 +v -0.023083 0.248548 0.030211 +v -0.020792 0.251086 0.031024 +v -0.020802 0.254699 0.030104 +v -0.023678 0.252040 0.029275 +v -0.018271 0.253219 0.032062 +v -0.017864 0.256590 0.031206 +v -0.016750 0.259888 0.030334 +v -0.019957 0.258542 0.029034 +v -0.015030 0.262763 0.029807 +v -0.017985 0.262240 0.028187 +v -0.013844 0.265299 0.030464 +v -0.015873 0.265419 0.028411 +v -0.015627 0.254996 0.033302 +v -0.014894 0.258034 0.032460 +v -0.013069 0.256485 0.034655 +v -0.012368 0.259120 0.033978 +v -0.011378 0.261509 0.033499 +v -0.013828 0.260874 0.031909 +v -0.010303 0.263477 0.033347 +v -0.012479 0.263266 0.031675 +v -0.009558 0.265072 0.033441 +v -0.011701 0.265174 0.032200 +v -0.009309 0.266309 0.033700 +v -0.011598 0.266151 0.033256 +v -0.014228 0.266236 0.032497 +v -0.003234 0.264674 0.037937 +v -0.004900 0.264813 0.037322 +v -0.005245 0.263650 0.037317 +v -0.003525 0.263540 0.037732 +v -0.006372 0.264870 0.036089 +v -0.006795 0.263613 0.036155 +v -0.003050 0.265528 0.038151 +v -0.004672 0.265741 0.037305 +v -0.004722 0.266523 0.037545 +v -0.006245 0.266766 0.036210 +v -0.006226 0.265903 0.036102 +v -0.006548 0.268317 0.036752 +v -0.007953 0.268497 0.035747 +v -0.007855 0.267765 0.035298 +v -0.006378 0.267527 0.036460 +v -0.007715 0.267011 0.034933 +v -0.006569 0.270143 0.036814 +v -0.007632 0.270050 0.035819 +v -0.007904 0.269268 0.035992 +v -0.006657 0.269191 0.036930 +v -0.004752 0.270196 0.038966 +v -0.005625 0.270197 0.037905 +v -0.005474 0.269131 0.038019 +v -0.004342 0.269069 0.039114 +v -0.005051 0.268140 0.037908 +v -0.004816 0.267256 0.037748 +v -0.007673 0.266099 0.034775 +v -0.007844 0.264945 0.034714 +v -0.008417 0.263543 0.034768 +v -0.009279 0.261834 0.034928 +v -0.010066 0.259795 0.035287 +v -0.010636 0.257540 0.035821 +v -0.002087 0.256395 0.037978 +v -0.002077 0.254438 0.038432 +v -0.004211 0.256664 0.038332 +v -0.004155 0.254725 0.038797 +v -0.006398 0.256633 0.038115 +v -0.006396 0.254616 0.038547 +v -0.008567 0.256130 0.037306 +v -0.008559 0.254006 0.037672 +v -0.002120 0.252229 0.039753 +v -0.002135 0.249641 0.040409 +v -0.004274 0.252529 0.039622 +v -0.004297 0.249963 0.039738 +v -0.006479 0.252449 0.039061 +v -0.006458 0.249888 0.039060 +v -0.008625 0.251834 0.038145 +v -0.008425 0.249268 0.038068 +v -0.010838 0.252847 0.036785 +v -0.010791 0.250593 0.037135 +v -0.013204 0.251200 0.035603 +v -0.012999 0.248877 0.035832 +v -0.012545 0.246554 0.035429 +v -0.010524 0.248115 0.036957 +v -0.010837 0.255176 0.036325 +v -0.013303 0.253782 0.035230 +v -0.017566 0.247376 0.032642 +v -0.015537 0.249286 0.034218 +v -0.015829 0.252027 0.034008 +v -0.018187 0.250072 0.032700 +v -0.022009 0.245760 0.030477 +v -0.020229 0.247978 0.031394 +v -0.020684 0.243650 0.030282 +v -0.019329 0.245471 0.031272 +v -0.026065 0.248268 0.028640 +v -0.024763 0.245628 0.029347 +v -0.023186 0.243583 0.029503 +v -0.021487 0.242166 0.029385 +v -0.020024 0.241176 0.029048 +v -0.018877 0.240456 0.028282 +v -0.018283 0.241149 0.029043 +v -0.019345 0.242224 0.029768 +v -0.018324 0.243578 0.030852 +v -0.017322 0.242189 0.030168 +v -0.016123 0.243479 0.031763 +v -0.016889 0.245189 0.032471 +v -0.015072 0.246967 0.034187 +v -0.014469 0.244912 0.033691 +v -0.001849 0.268647 0.043258 +v -0.000274 0.268167 0.043172 +v -0.000292 0.268487 0.044354 +v -0.001901 0.268893 0.044406 +v -0.000481 0.268783 0.045676 +v -0.002118 0.269175 0.045622 +v -0.000386 0.267915 0.042070 +v -0.001897 0.268500 0.042178 +v -0.003038 0.269280 0.041181 +v -0.003513 0.269143 0.040130 +v -0.003439 0.270226 0.041246 +v -0.004012 0.270158 0.040071 +v -0.002986 0.269452 0.043342 +v -0.002897 0.269391 0.042273 +v -0.003559 0.270440 0.043517 +v -0.003301 0.270364 0.042465 +v -0.003362 0.269767 0.045422 +v -0.003125 0.269526 0.044394 +v -0.004036 0.270251 0.045197 +v -0.003857 0.270355 0.044455 +v -0.007859 0.272170 0.045757 +v -0.008818 0.273268 0.046940 +v -0.006115 0.271537 0.046339 +v -0.007134 0.272758 0.047793 +v -0.007694 0.273848 0.048447 +v -0.009046 0.274748 0.047835 +v -0.005643 0.272386 0.048725 +v -0.006729 0.274022 0.049329 +v -0.004728 0.271084 0.047608 +v -0.003144 0.270609 0.048299 +v -0.003993 0.271975 0.049677 +v -0.005073 0.274005 0.050656 +v -0.004773 0.270668 0.045631 +v -0.003926 0.270245 0.046473 +v -0.002514 0.269733 0.046919 +v -0.000747 0.269169 0.047139 +v -0.001208 0.270036 0.048776 +v -0.001776 0.271521 0.050536 +v -0.002486 0.273914 0.051965 +v -0.007242 0.279591 0.049901 +v -0.006306 0.276626 0.050777 +v -0.003186 0.277199 0.052560 +v -0.003586 0.280755 0.051767 +v -0.008187 0.275859 0.049136 +v -0.009529 0.278086 0.048078 +v -0.010189 0.280763 0.046435 +v -0.012096 0.279138 0.044279 +v -0.007611 0.282444 0.048402 +v -0.007619 0.284931 0.046719 +v -0.010113 0.283248 0.044513 +v -0.011811 0.281576 0.042113 +v -0.003575 0.293832 0.042607 +v -0.003566 0.291956 0.044045 +v -0.006477 0.292732 0.040589 +v -0.006750 0.290843 0.042154 +v -0.007170 0.289088 0.043753 +v -0.003635 0.290277 0.045461 +v -0.003749 0.288442 0.046869 +v -0.003839 0.286386 0.048443 +v -0.007492 0.287113 0.045210 +v -0.003773 0.283816 0.050136 +v -0.001460 0.264535 0.037874 +v -0.001687 0.263318 0.037687 +v -0.001293 0.265375 0.038313 +v -0.061566 0.369270 -0.011715 +v -0.062223 0.376178 -0.019864 +v -0.068062 0.369761 -0.027522 +v -0.066927 0.361355 -0.019190 +v -0.074684 0.310277 -0.049476 +v -0.074232 0.317320 -0.042330 +v -0.074115 0.298013 -0.047319 +v -0.073679 0.303235 -0.038698 +v -0.069371 0.301277 -0.019807 +v -0.071437 0.294743 -0.027747 +v -0.069513 0.315245 -0.021733 +v -0.071758 0.309474 -0.029701 +v -0.072860 0.288753 -0.038010 +v -0.073166 0.285385 -0.047117 +v -0.072272 0.324670 -0.033247 +v -0.069339 0.330170 -0.023939 +v -0.059720 0.296766 -0.002725 +v -0.060582 0.300445 -0.004543 +v -0.057259 0.300965 -0.001676 +v -0.058269 0.304090 -0.002830 +v -0.059283 0.308363 -0.002957 +v -0.061224 0.305678 -0.005515 +v -0.057735 0.309819 -0.000623 +v -0.058900 0.313856 0.000717 +v -0.060488 0.313600 -0.001838 +v -0.059292 0.318472 0.002630 +v -0.060688 0.319692 -0.000355 +v -0.056582 0.306436 -0.001016 +v -0.055454 0.303724 -0.000447 +v -0.013440 0.303414 0.015771 +v -0.015810 0.301682 0.015084 +v -0.015199 0.300259 0.017052 +v -0.012842 0.302107 0.018089 +v -0.018723 0.300014 0.014696 +v -0.017965 0.298447 0.016214 +v -0.017458 0.296736 0.018134 +v -0.014881 0.298560 0.019229 +v -0.012609 0.300448 0.020521 +v -0.012503 0.298300 0.022798 +v -0.010569 0.300277 0.024439 +v -0.010644 0.302437 0.021939 +v -0.012510 0.295784 0.024877 +v -0.010644 0.297734 0.026666 +v -0.012691 0.293085 0.026796 +v -0.010828 0.294988 0.028575 +v -0.012888 0.290418 0.028488 +v -0.011062 0.292329 0.030278 +v -0.009491 0.294244 0.032430 +v -0.009266 0.296970 0.030702 +v -0.011416 0.290000 0.031880 +v -0.009821 0.291838 0.034074 +v -0.013004 0.288018 0.029952 +v -0.012992 0.285789 0.031236 +v -0.011597 0.287868 0.033281 +v -0.010213 0.289717 0.035611 +v -0.018547 0.272805 0.031921 +v -0.018117 0.270674 0.032212 +v -0.018583 0.274424 0.030338 +v -0.018418 0.271192 0.030450 +v -0.016702 0.268280 0.033632 +v -0.016787 0.267898 0.032370 +v -0.016312 0.267172 0.030908 +v -0.017345 0.268901 0.028670 +v -0.017644 0.270733 0.026227 +v -0.018608 0.273634 0.028145 +v -0.018256 0.275811 0.025817 +v -0.019854 0.272942 0.024638 +v -0.018165 0.276367 0.028815 +v -0.017019 0.279088 0.029747 +v -0.016157 0.281192 0.028382 +v -0.017577 0.278615 0.027223 +v -0.020498 0.281646 0.023981 +v -0.018168 0.284121 0.024705 +v -0.018781 0.287143 0.023272 +v -0.021383 0.284855 0.022703 +v -0.016275 0.286381 0.025711 +v -0.016555 0.289208 0.024135 +v -0.016766 0.292016 0.022239 +v -0.019220 0.290078 0.021372 +v -0.022136 0.287916 0.020796 +v -0.017526 0.281245 0.025759 +v -0.019363 0.278568 0.024450 +v -0.015957 0.283697 0.027033 +v -0.015917 0.278433 0.034343 +v -0.015564 0.279753 0.032560 +v -0.016168 0.277034 0.036160 +v -0.014728 0.278386 0.037662 +v -0.014041 0.280072 0.035705 +v -0.013606 0.281843 0.034026 +v -0.013263 0.279947 0.039715 +v -0.013634 0.277729 0.041833 +v -0.015066 0.276412 0.039696 +v -0.016136 0.275141 0.037904 +v -0.011789 0.285871 0.034621 +v -0.010602 0.287790 0.037044 +v -0.013149 0.283685 0.032545 +v -0.012074 0.283911 0.036041 +v -0.010956 0.285878 0.038519 +v -0.008582 0.291315 0.038090 +v -0.008953 0.289369 0.039585 +v -0.009361 0.287449 0.041119 +v -0.009825 0.285464 0.042758 +v -0.011292 0.283796 0.040175 +v -0.012715 0.282022 0.037779 +v -0.014892 0.281410 0.030977 +v -0.014427 0.283548 0.029579 +v -0.014444 0.285923 0.028331 +v -0.014618 0.288466 0.026993 +v -0.014612 0.291176 0.025330 +v -0.014657 0.293954 0.023468 +v -0.017127 0.294662 0.020289 +v -0.014678 0.296452 0.021370 +v -0.021809 0.298366 0.014451 +v -0.020974 0.296656 0.015660 +v -0.025054 0.296997 0.014291 +v -0.024240 0.295081 0.015150 +v -0.023510 0.293058 0.016756 +v -0.020344 0.294923 0.017368 +v -0.019710 0.292767 0.019340 +v -0.022833 0.290757 0.018749 +v -0.021747 0.275673 0.024087 +v -0.024591 0.272362 0.024358 +v -0.023288 0.278896 0.023766 +v -0.026573 0.275692 0.023919 +v -0.024578 0.282332 0.022628 +v -0.028318 0.279354 0.022672 +v -0.025675 0.285647 0.020735 +v -0.029670 0.283018 0.020595 +v -0.027833 0.268385 0.024599 +v -0.031424 0.263497 0.024542 +v -0.030311 0.271795 0.023942 +v -0.034508 0.266825 0.023509 +v -0.034871 0.257500 0.023742 +v -0.038530 0.260426 0.021965 +v -0.042235 0.264385 0.019077 +v -0.037400 0.270959 0.021518 +v -0.039496 0.275894 0.019051 +v -0.045062 0.270117 0.015927 +v -0.032591 0.275720 0.022506 +v -0.034250 0.279905 0.020179 +v -0.030504 0.286409 0.018146 +v -0.035167 0.284110 0.017697 +v -0.031147 0.289563 0.016046 +v -0.035657 0.287954 0.015438 +v -0.040728 0.286472 0.014438 +v -0.040426 0.281338 0.016600 +v -0.046021 0.277805 0.014017 +v -0.045949 0.284951 0.012388 +v -0.040768 0.290631 0.012516 +v -0.045398 0.290253 0.010482 +v -0.040686 0.293824 0.011130 +v -0.044732 0.293943 0.009077 +v -0.048280 0.294451 0.006726 +v -0.049626 0.290354 0.007961 +v -0.031759 0.292301 0.014453 +v -0.036134 0.291327 0.013848 +v -0.032475 0.294653 0.013636 +v -0.036556 0.294014 0.012730 +v -0.026434 0.288629 0.018436 +v -0.027122 0.291298 0.016434 +v -0.027828 0.293670 0.014878 +v -0.028598 0.295771 0.014123 +v -0.025817 0.298582 0.014069 +v -0.029321 0.297441 0.013704 +v -0.033138 0.296499 0.013179 +v -0.053316 0.291089 0.005339 +v -0.051390 0.295439 0.004410 +v -0.053902 0.296857 0.002133 +v -0.056032 0.292291 0.002326 +v -0.055837 0.298651 0.000034 +v -0.058219 0.294153 -0.000389 +v -0.054080 0.301548 0.000735 +v -0.052264 0.299732 0.002440 +v -0.047078 0.297101 0.006403 +v -0.049813 0.298191 0.004337 +v -0.036951 0.296071 0.012067 +v -0.040641 0.296122 0.010388 +v -0.044034 0.296446 0.008417 +v -0.022710 0.299933 0.014101 +v -0.019857 0.301600 0.013970 +v -0.017086 0.303222 0.014018 +v -0.014854 0.304787 0.014275 +v -0.003722 0.298822 0.039283 +v -0.003692 0.296116 0.041053 +v -0.006107 0.297614 0.037254 +v -0.006285 0.294953 0.038955 +v -0.007855 0.296017 0.034811 +v -0.008124 0.293458 0.036469 +v -0.007723 0.298914 0.033062 +v -0.006176 0.300737 0.035516 +v -0.004070 0.305303 0.035251 +v -0.003894 0.302024 0.037427 +v -0.004161 0.308472 0.032778 +v -0.004317 0.311678 0.030481 +v -0.009404 0.322590 0.027947 +v -0.008152 0.320101 0.026656 +v -0.004794 0.320299 0.028712 +v -0.005326 0.322860 0.029447 +v -0.007359 0.317427 0.025957 +v -0.004487 0.317629 0.028431 +v -0.004293 0.314721 0.028860 +v -0.006873 0.314415 0.026113 +v -0.013998 0.316529 0.016245 +v -0.016151 0.319452 0.018511 +v -0.011654 0.317297 0.019067 +v -0.013638 0.320039 0.020925 +v -0.016633 0.322534 0.023856 +v -0.019712 0.322409 0.021515 +v -0.009461 0.311752 0.017713 +v -0.009552 0.309237 0.017432 +v -0.008336 0.308482 0.021193 +v -0.008043 0.311463 0.022159 +v -0.010351 0.307070 0.017020 +v -0.009362 0.306044 0.020174 +v -0.011673 0.305191 0.016470 +v -0.010925 0.304003 0.019173 +v -0.013269 0.306348 0.014551 +v -0.012159 0.307872 0.014596 +v -0.011529 0.309576 0.014560 +v -0.011612 0.311572 0.014669 +v -0.012548 0.313871 0.015006 +v -0.010261 0.314500 0.018080 +v -0.009484 0.317379 0.022639 +v -0.008508 0.314516 0.022282 +v -0.010993 0.320124 0.023883 +v -0.013119 0.322606 0.025930 +v -0.016154 0.325078 0.028513 +v -0.020693 0.324985 0.027075 +v -0.011277 0.325493 0.029473 +v -0.013614 0.329630 0.031386 +v -0.019159 0.329717 0.030135 +v -0.024562 0.329637 0.028709 +v -0.017930 0.344105 0.031394 +v -0.010358 0.343884 0.031015 +v -0.011378 0.352502 0.027726 +v -0.019574 0.352397 0.028060 +v -0.012324 0.363631 0.026816 +v -0.021440 0.362776 0.026579 +v -0.007626 0.329773 0.031958 +v -0.009184 0.335990 0.032990 +v -0.016069 0.335967 0.032822 +v -0.030871 0.344050 0.028391 +v -0.024756 0.344115 0.030379 +v -0.026744 0.352340 0.027383 +v -0.032916 0.352203 0.025480 +v -0.029173 0.362115 0.025359 +v -0.035660 0.361625 0.023037 +v -0.028158 0.336137 0.029549 +v -0.033643 0.336220 0.027041 +v -0.029829 0.329327 0.026966 +v -0.036238 0.343983 0.025522 +v -0.041402 0.343642 0.021964 +v -0.039199 0.336168 0.023938 +v -0.024870 0.324632 0.025554 +v -0.046509 0.342591 0.018026 +v -0.044833 0.335653 0.020250 +v -0.051181 0.340228 0.013535 +v -0.049781 0.333717 0.016166 +v -0.056088 0.353856 0.004333 +v -0.053117 0.346802 0.009753 +v -0.048428 0.349759 0.014605 +v -0.051227 0.357668 0.009922 +v -0.043479 0.351288 0.018984 +v -0.046250 0.359799 0.015075 +v -0.062237 0.339904 -0.005689 +v -0.059822 0.347818 -0.001323 +v -0.063663 0.354309 -0.010080 +v -0.066242 0.343765 -0.014326 +v -0.059318 0.361986 -0.003535 +v -0.058024 0.331490 0.004901 +v -0.056672 0.326884 0.008145 +v -0.053853 0.330590 0.012053 +v -0.055107 0.336396 0.008919 +v -0.058456 0.322906 0.004957 +v -0.059783 0.325866 0.001757 +v -0.067105 0.318784 -0.014929 +v -0.066500 0.331449 -0.015324 +v -0.064568 0.320290 -0.009127 +v -0.063612 0.330511 -0.008193 +v -0.062096 0.312540 -0.005250 +v -0.064163 0.310301 -0.009306 +v -0.062225 0.320459 -0.004336 +v -0.066688 0.306610 -0.014016 +v -0.061316 0.328541 -0.002571 +v -0.059671 0.335895 0.000452 +v -0.056856 0.342070 0.004706 +v -0.022630 0.384461 0.015514 +v -0.022184 0.374510 0.021912 +v -0.012481 0.375710 0.022845 +v -0.012683 0.385726 0.017096 +v -0.037938 0.381709 0.009962 +v -0.037134 0.372489 0.017442 +v -0.030316 0.373399 0.020138 +v -0.030873 0.383021 0.013015 +v -0.012735 0.393830 0.010053 +v -0.022811 0.392466 0.008175 +v -0.038287 0.388963 0.001881 +v -0.031226 0.390812 0.005370 +v -0.056275 0.380797 -0.013109 +v -0.055724 0.374336 -0.004979 +v -0.050002 0.377730 0.000975 +v -0.050573 0.384272 -0.007143 +v -0.044612 0.386856 -0.002221 +v -0.044235 0.380102 0.006009 +v -0.054060 0.366821 0.002936 +v -0.048623 0.369714 0.008721 +v -0.043191 0.371476 0.013675 +v -0.041189 0.360947 0.019467 +v -0.038375 0.351943 0.022645 +v -0.022305 0.336066 0.031436 +v -0.006215 0.325741 0.030441 +v 0.092391 0.284796 -0.086017 +v 0.092225 0.285183 -0.087310 +v 0.092103 0.289373 -0.087752 +v 0.092325 0.289009 -0.086575 +v 0.092364 0.285766 -0.088256 +v 0.092204 0.289954 -0.088738 +v 0.091516 0.293897 -0.088836 +v 0.091580 0.293341 -0.087700 +v 0.091851 0.293049 -0.086405 +v 0.091968 0.300498 -0.091839 +v 0.092289 0.297434 -0.091954 +v 0.091240 0.303916 -0.091709 +v 0.090578 0.302850 -0.090311 +v 0.091432 0.299405 -0.090826 +v 0.091792 0.295900 -0.091043 +v 0.091548 0.294710 -0.089915 +v 0.091034 0.298383 -0.089624 +v 0.090759 0.297623 -0.088309 +v 0.090130 0.301868 -0.088741 +v 0.089849 0.301144 -0.087180 +v 0.090592 0.307022 -0.090802 +v 0.089745 0.306040 -0.089325 +v 0.090082 0.309590 -0.089073 +v 0.089161 0.308906 -0.087827 +v 0.087477 0.314995 -0.079861 +v 0.088067 0.314639 -0.082165 +v 0.087463 0.314351 -0.080000 +v 0.087640 0.313774 -0.081708 +v 0.088013 0.312600 -0.084212 +v 0.088580 0.313526 -0.085003 +v 0.088420 0.311089 -0.086405 +v 0.089233 0.311827 -0.087397 +v 0.088183 0.310392 -0.085384 +v 0.088671 0.308387 -0.086019 +v 0.087891 0.311201 -0.083381 +v 0.088202 0.308369 -0.083162 +v 0.089201 0.305200 -0.087417 +v 0.089014 0.304574 -0.085501 +v 0.090711 0.297048 -0.086896 +v 0.091089 0.296814 -0.085359 +v 0.090058 0.300570 -0.085522 +v 0.090152 0.300243 -0.083844 +v 0.088493 0.304977 -0.080617 +v 0.089184 0.303059 -0.082030 +v 0.089343 0.303680 -0.083686 +v 0.088419 0.306295 -0.081439 +v 0.079354 0.308802 -0.068421 +v 0.080002 0.309764 -0.069190 +v 0.080503 0.310680 -0.069773 +v 0.079527 0.309023 -0.068287 +v 0.081339 0.310835 -0.070645 +v 0.082363 0.311819 -0.071803 +v 0.078153 0.306495 -0.068055 +v 0.078707 0.307833 -0.068098 +v 0.078546 0.307411 -0.067686 +v 0.078000 0.305825 -0.067646 +v 0.090622 0.277021 -0.082456 +v 0.090618 0.277331 -0.080627 +v 0.088795 0.275630 -0.076929 +v 0.088928 0.274646 -0.078636 +v 0.090132 0.278166 -0.078499 +v 0.088061 0.276931 -0.075392 +v 0.091167 0.277295 -0.084663 +v 0.090802 0.277046 -0.083727 +v 0.088900 0.274049 -0.079947 +v 0.089153 0.273764 -0.081036 +v 0.091420 0.277727 -0.085452 +v 0.089717 0.274031 -0.082382 +v 0.092399 0.294847 -0.091511 +v 0.092185 0.292397 -0.090586 +v 0.092534 0.286621 -0.088942 +v 0.092220 0.290859 -0.089595 +v 0.092448 0.282016 -0.087497 +v 0.092168 0.281407 -0.086829 +v 0.091817 0.280622 -0.084820 +v 0.091866 0.280935 -0.085971 +v 0.092362 0.284643 -0.082295 +v 0.091718 0.280813 -0.080931 +v 0.091931 0.280515 -0.083168 +v 0.092533 0.284581 -0.084339 +v 0.088720 0.279141 -0.077100 +v 0.086637 0.278227 -0.074863 +v 0.090560 0.281521 -0.078880 +v 0.091403 0.285077 -0.080016 +v 0.077539 0.303658 -0.067717 +v 0.077552 0.304626 -0.067598 +v 0.077775 0.304351 -0.068156 +v 0.077832 0.305321 -0.068073 +v 0.078831 0.302746 -0.069370 +v 0.078760 0.303475 -0.069830 +v 0.078191 0.304148 -0.069134 +v 0.078081 0.303539 -0.068532 +v 0.078804 0.304029 -0.070421 +v 0.078331 0.304612 -0.069785 +v 0.078181 0.305382 -0.069455 +v 0.077972 0.304922 -0.068799 +v 0.081355 0.301388 -0.071689 +v 0.080671 0.302479 -0.071803 +v 0.079750 0.302887 -0.070689 +v 0.080035 0.301849 -0.070516 +v 0.080095 0.303054 -0.071811 +v 0.079479 0.303464 -0.071193 +v 0.078738 0.301958 -0.069382 +v 0.077883 0.302830 -0.068258 +v 0.080155 0.301033 -0.070582 +v 0.081758 0.300261 -0.071714 +v 0.088363 0.302895 -0.079995 +v 0.089573 0.300128 -0.081797 +v 0.087676 0.305301 -0.078823 +v 0.086396 0.305352 -0.076489 +v 0.087397 0.302910 -0.077604 +v 0.088712 0.300215 -0.079226 +v 0.090245 0.297031 -0.081034 +v 0.091008 0.296871 -0.083518 +v 0.091564 0.293270 -0.082231 +v 0.092020 0.293067 -0.084673 +v 0.091133 0.289342 -0.080050 +v 0.092269 0.289043 -0.082569 +v 0.090156 0.293573 -0.079351 +v 0.092471 0.288907 -0.084844 +v 0.086898 0.300417 -0.076689 +v 0.088959 0.297339 -0.077916 +v 0.083990 0.301177 -0.074487 +v 0.085922 0.298258 -0.075690 +v 0.084352 0.305033 -0.074668 +v 0.085355 0.302849 -0.075611 +v 0.082255 0.304763 -0.073992 +v 0.083063 0.303004 -0.074476 +v 0.079649 0.303702 -0.071772 +v 0.078966 0.304263 -0.071160 +v 0.080408 0.303068 -0.072404 +v 0.080798 0.303268 -0.072924 +v 0.080245 0.303660 -0.072641 +v 0.079527 0.304413 -0.072071 +v 0.079069 0.305220 -0.071291 +v 0.078522 0.304915 -0.070530 +v 0.078861 0.305798 -0.070659 +v 0.078497 0.305643 -0.070118 +v 0.080026 0.305700 -0.072172 +v 0.079512 0.306408 -0.071020 +v 0.080634 0.304540 -0.073137 +v 0.081694 0.306905 -0.072729 +v 0.081032 0.307993 -0.071332 +v 0.079312 0.308545 -0.068724 +v 0.078623 0.307147 -0.068558 +v 0.079313 0.307735 -0.069312 +v 0.080286 0.309367 -0.069710 +v 0.078145 0.305895 -0.068703 +v 0.078556 0.306345 -0.069331 +v 0.078972 0.306597 -0.070063 +v 0.080180 0.308036 -0.070287 +v 0.087328 0.312455 -0.080705 +v 0.087327 0.310249 -0.079531 +v 0.086914 0.313299 -0.078675 +v 0.085540 0.310850 -0.075864 +v 0.086660 0.314217 -0.077917 +v 0.085554 0.312881 -0.075975 +v 0.084113 0.312289 -0.073910 +v 0.083188 0.311129 -0.072697 +v 0.087401 0.307711 -0.078795 +v 0.086046 0.307951 -0.075860 +v 0.081729 0.309955 -0.071037 +v 0.083151 0.309554 -0.072342 +v 0.083962 0.307842 -0.073246 +v 0.081287 0.303298 -0.073714 +v 0.081723 0.302554 -0.073594 +v 0.081326 0.302291 -0.072905 +v 0.082530 0.301118 -0.073083 +v 0.083558 0.299493 -0.073364 +v -0.089576 0.292010 -0.090165 +v -0.090003 0.287785 -0.089644 +v -0.089840 0.287112 -0.088678 +v -0.089297 0.291264 -0.088979 +v -0.089870 0.283330 -0.088432 +v -0.089772 0.282661 -0.087610 +v -0.089641 0.282156 -0.086631 +v -0.089628 0.286553 -0.087619 +v -0.089074 0.290682 -0.087630 +v -0.089658 0.301182 -0.090864 +v -0.090912 0.301759 -0.091713 +v -0.091470 0.298605 -0.092575 +v -0.090397 0.297808 -0.091911 +v -0.090874 0.294000 -0.092221 +v -0.089438 0.296905 -0.090997 +v -0.088720 0.300420 -0.089836 +v -0.090008 0.292883 -0.091258 +v -0.088923 0.296043 -0.089840 +v -0.088312 0.299504 -0.088601 +v -0.090187 0.304447 -0.090329 +v -0.089358 0.306389 -0.088569 +v -0.088884 0.303920 -0.089240 +v -0.088333 0.305788 -0.087558 +v -0.087459 0.308122 -0.084027 +v -0.086877 0.308954 -0.082093 +v -0.087173 0.309817 -0.082365 +v -0.087973 0.309021 -0.084546 +v -0.086411 0.309427 -0.080585 +v -0.086442 0.310278 -0.080336 +v -0.088617 0.307889 -0.086682 +v -0.087898 0.307181 -0.085895 +v -0.087498 0.306544 -0.085270 +v -0.087091 0.306989 -0.083730 +v -0.087625 0.305192 -0.086240 +v -0.086937 0.304841 -0.084102 +v -0.087947 0.303173 -0.087990 +v -0.087526 0.302247 -0.086598 +v -0.088619 0.295254 -0.088449 +v -0.087816 0.298566 -0.087141 +v -0.088287 0.294512 -0.086791 +v -0.087709 0.297776 -0.085262 +v -0.087238 0.301083 -0.085155 +v -0.087215 0.300137 -0.083470 +v -0.086764 0.301561 -0.082117 +v -0.086748 0.302879 -0.082876 +v -0.081248 0.309092 -0.073294 +v -0.079869 0.307877 -0.072136 +v -0.080695 0.307425 -0.073132 +v -0.079494 0.306713 -0.072025 +v -0.078885 0.305849 -0.071465 +v -0.078893 0.306139 -0.071459 +v -0.077896 0.304493 -0.071115 +v -0.078270 0.304787 -0.071413 +v -0.077475 0.303501 -0.071259 +v -0.077092 0.302830 -0.070811 +v -0.086032 0.273575 -0.075881 +v -0.086832 0.272540 -0.076984 +v -0.088321 0.275026 -0.078404 +v -0.088390 0.274501 -0.080174 +v -0.088223 0.274356 -0.081619 +v -0.086834 0.271902 -0.078402 +v -0.086774 0.271542 -0.079539 +v -0.088152 0.274535 -0.082723 +v -0.088251 0.274819 -0.083702 +v -0.086751 0.271548 -0.080445 +v -0.087094 0.271885 -0.081545 +v -0.088325 0.275345 -0.084497 +v -0.091065 0.290360 -0.091656 +v -0.090360 0.288613 -0.090575 +v -0.090041 0.284210 -0.089230 +v -0.089296 0.278860 -0.086579 +v -0.089444 0.279518 -0.087335 +v -0.089196 0.278285 -0.085680 +v -0.089117 0.277910 -0.084537 +v -0.089321 0.277771 -0.083049 +v -0.089486 0.277978 -0.081161 +v -0.090001 0.282204 -0.083175 +v -0.089668 0.281934 -0.085200 +v -0.084649 0.274459 -0.075538 +v -0.087003 0.275932 -0.077240 +v -0.088555 0.278807 -0.079301 +v -0.089612 0.282917 -0.080883 +v -0.076863 0.302201 -0.071179 +v -0.076551 0.301314 -0.070510 +v -0.076584 0.300830 -0.071075 +v -0.076437 0.299958 -0.070422 +v -0.077262 0.302084 -0.072457 +v -0.077227 0.300922 -0.072503 +v -0.076959 0.300391 -0.071759 +v -0.076842 0.301566 -0.071789 +v -0.077790 0.300113 -0.072599 +v -0.077581 0.299476 -0.071800 +v -0.077440 0.298643 -0.071177 +v -0.076853 0.299617 -0.070996 +v -0.078545 0.299577 -0.072854 +v -0.078423 0.298909 -0.072232 +v -0.079127 0.299256 -0.073279 +v -0.079335 0.298740 -0.073152 +v -0.079554 0.297841 -0.073043 +v -0.078305 0.297997 -0.071827 +v -0.076651 0.298797 -0.070524 +v -0.077181 0.297662 -0.070819 +v -0.078141 0.296917 -0.071701 +v -0.079759 0.296674 -0.073070 +v -0.085149 0.301354 -0.078058 +v -0.086166 0.301492 -0.080231 +v -0.086890 0.299636 -0.081221 +v -0.085783 0.299381 -0.078915 +v -0.088122 0.297410 -0.082852 +v -0.087069 0.297230 -0.080231 +v -0.089243 0.290455 -0.085738 +v -0.088759 0.294291 -0.084483 +v -0.089737 0.290753 -0.083234 +v -0.088730 0.294380 -0.081612 +v -0.090050 0.286577 -0.083939 +v -0.089599 0.287169 -0.081240 +v -0.088222 0.291216 -0.080463 +v -0.089513 0.286336 -0.086135 +v -0.084114 0.294749 -0.077357 +v -0.086606 0.294619 -0.079297 +v -0.082496 0.297851 -0.075948 +v -0.085125 0.297343 -0.078111 +v -0.081901 0.299565 -0.075696 +v -0.083924 0.299387 -0.077136 +v -0.081455 0.301069 -0.075319 +v -0.083295 0.301173 -0.076417 +v -0.079975 0.299606 -0.074216 +v -0.079544 0.299444 -0.073821 +v -0.078918 0.299936 -0.073491 +v -0.079507 0.300040 -0.074184 +v -0.078198 0.300499 -0.073297 +v -0.078971 0.300863 -0.074011 +v -0.077821 0.302357 -0.073173 +v -0.077767 0.301357 -0.073174 +v -0.078409 0.302402 -0.073442 +v -0.078510 0.301738 -0.073802 +v -0.080009 0.301007 -0.074679 +v -0.079513 0.302134 -0.074371 +v -0.080941 0.302601 -0.074973 +v -0.078963 0.303043 -0.073974 +v -0.080302 0.303891 -0.074406 +v -0.078745 0.304485 -0.072644 +v -0.078046 0.304068 -0.071830 +v -0.078879 0.305335 -0.071943 +v -0.079804 0.305809 -0.072895 +v -0.077322 0.302864 -0.071805 +v -0.077831 0.303281 -0.072512 +v -0.078425 0.303355 -0.073323 +v -0.079510 0.304494 -0.073585 +v -0.086485 0.307753 -0.081466 +v -0.085882 0.308742 -0.079383 +v -0.086246 0.305869 -0.080679 +v -0.084476 0.306771 -0.077125 +v -0.085580 0.310140 -0.078401 +v -0.084297 0.309701 -0.076530 +v -0.082805 0.309606 -0.074740 +v -0.082179 0.307600 -0.074464 +v -0.086236 0.303504 -0.080172 +v -0.084952 0.303387 -0.077661 +v -0.081000 0.305790 -0.073985 +v -0.082203 0.304865 -0.075179 +v -0.082903 0.303005 -0.075930 +v -0.080663 0.299111 -0.074744 +v -0.080418 0.299861 -0.074857 +v -0.080189 0.298804 -0.074099 +v -0.081029 0.297767 -0.074441 +v -0.081897 0.295917 -0.075090 +v 0.043228 0.306776 0.009013 +v 0.042316 0.306277 0.010209 +v 0.042584 0.306196 0.010592 +v 0.043434 0.306620 0.009317 +v 0.040702 0.305657 0.011505 +v 0.041007 0.305724 0.012029 +v 0.041204 0.305540 0.012360 +v 0.042813 0.305972 0.010883 +v 0.043697 0.306280 0.009568 +v 0.021955 0.307440 0.014360 +v 0.024776 0.307163 0.015340 +v 0.024837 0.307449 0.014627 +v 0.021958 0.307849 0.013536 +v 0.027992 0.306356 0.016285 +v 0.028054 0.306545 0.015671 +v 0.028109 0.306328 0.014961 +v 0.024932 0.307538 0.014024 +v 0.022076 0.308113 0.012988 +v 0.035246 0.305361 0.015202 +v 0.031605 0.305670 0.016165 +v 0.031633 0.305149 0.016407 +v 0.035287 0.304887 0.015402 +v 0.028085 0.305867 0.016624 +v 0.028316 0.305161 0.016752 +v 0.031711 0.304488 0.016453 +v 0.035326 0.304268 0.015486 +v 0.022357 0.306852 0.015077 +v 0.025020 0.306620 0.015900 +v 0.023016 0.306223 0.015583 +v 0.025450 0.305907 0.016270 +v 0.028595 0.304342 0.016831 +v 0.031859 0.303712 0.016447 +v 0.028834 0.303423 0.016665 +v 0.032025 0.302825 0.016251 +v 0.035522 0.302682 0.015345 +v 0.035419 0.303526 0.015505 +v 0.023603 0.305610 0.015864 +v 0.025881 0.305114 0.016496 +v 0.023836 0.304981 0.015905 +v 0.026173 0.304259 0.016496 +v 0.020406 0.306051 0.014626 +v 0.021890 0.305464 0.015263 +v 0.022135 0.305761 0.015338 +v 0.021359 0.306174 0.014948 +v 0.032137 0.301922 0.015807 +v 0.035550 0.301834 0.014848 +v 0.028967 0.302486 0.016256 +v 0.045375 0.305336 0.007816 +v 0.045773 0.305519 0.007227 +v 0.045425 0.306120 0.007272 +v 0.044989 0.305973 0.007842 +v 0.046014 0.305694 0.006860 +v 0.045827 0.306217 0.006809 +v 0.045494 0.306979 0.006704 +v 0.045084 0.306813 0.007182 +v 0.044706 0.306647 0.007756 +v 0.046974 0.305320 0.005758 +v 0.046375 0.305507 0.006473 +v 0.046146 0.305087 0.006843 +v 0.046598 0.304780 0.006136 +v 0.045727 0.304775 0.007458 +v 0.046099 0.304328 0.006796 +v 0.044530 0.305875 0.008640 +v 0.044877 0.305201 0.008637 +v 0.044262 0.306495 0.008515 +v 0.043939 0.305736 0.009717 +v 0.044186 0.305049 0.009741 +v 0.043005 0.305445 0.011047 +v 0.041332 0.305085 0.012571 +v 0.041459 0.304475 0.012707 +v 0.043222 0.304846 0.011157 +v 0.038697 0.304860 0.014080 +v 0.038756 0.304250 0.014229 +v 0.038628 0.305300 0.013874 +v 0.041515 0.302982 0.012324 +v 0.041543 0.303759 0.012675 +v 0.038820 0.303515 0.014222 +v 0.038847 0.302718 0.013955 +v 0.043355 0.304132 0.011035 +v 0.044426 0.304349 0.009547 +v 0.043392 0.303420 0.010621 +v 0.044573 0.303707 0.009040 +v 0.045156 0.304542 0.008343 +v 0.045428 0.303973 0.007753 +v 0.047260 0.304489 0.005153 +v 0.047833 0.305196 0.004662 +v 0.046565 0.303901 0.005851 +v 0.045759 0.303435 0.006917 +v 0.044738 0.303084 0.008306 +v 0.043426 0.302690 0.009982 +v 0.041476 0.302181 0.011763 +v 0.038843 0.301854 0.013461 +v 0.035123 0.305501 0.014751 +v 0.031610 0.305756 0.015668 +v 0.035000 0.305121 0.014108 +v 0.031572 0.305355 0.014960 +v 0.038430 0.305445 0.013468 +v 0.038197 0.305159 0.012922 +v 0.044018 0.306860 0.008298 +v 0.043818 0.307096 0.007961 +v 0.044461 0.307077 0.007529 +v 0.044243 0.307422 0.007049 +v 0.044847 0.307364 0.006910 +v 0.044623 0.307920 0.006229 +v 0.045263 0.307722 0.006352 +v 0.045067 0.308491 0.005458 +v 0.046680 0.306996 0.005851 +v 0.046003 0.307102 0.006284 +v 0.046315 0.306164 0.006313 +v 0.047074 0.306030 0.005612 +v 0.048075 0.306734 0.004790 +v 0.048328 0.305976 0.004441 +v 0.045676 0.309269 0.004692 +v 0.045442 0.309192 0.005008 +v 0.045692 0.308117 0.006013 +v 0.045891 0.308144 0.005909 +v 0.020477 0.306894 0.014387 +v 0.019223 0.307060 0.014058 +v 0.019933 0.307735 0.013705 +v 0.018329 0.308224 0.013484 +v 0.020029 0.308619 0.012432 +v 0.019902 0.308314 0.012946 +v 0.018712 0.308964 0.012303 +v 0.018532 0.308772 0.012862 +v 0.018232 0.309123 0.012488 +v 0.017932 0.308971 0.013035 +v 0.018306 0.309319 0.012829 +v 0.017875 0.309077 0.013475 +v 0.017420 0.309026 0.013870 +v 0.017373 0.308843 0.013440 +v 0.016846 0.308977 0.013521 +v 0.016759 0.309356 0.014076 +v 0.017512 0.308235 0.013627 +v 0.026266 0.303378 0.016255 +v 0.023828 0.304321 0.015786 +v 0.021663 0.305053 0.015156 +v 0.019853 0.305904 0.014509 +v 0.018500 0.307124 0.013972 +v -0.040544 0.305025 0.013237 +v -0.040405 0.305394 0.012879 +v -0.042531 0.305049 0.011552 +v -0.042652 0.304608 0.011799 +v -0.040418 0.305358 0.012226 +v -0.042546 0.305147 0.011069 +v -0.043846 0.305293 0.010009 +v -0.043826 0.305083 0.010375 +v -0.043967 0.304606 0.010566 +v -0.026656 0.307032 0.014283 +v -0.026689 0.307269 0.014787 +v -0.023643 0.308206 0.013797 +v -0.023619 0.308134 0.013307 +v -0.026876 0.306830 0.015329 +v -0.023807 0.307781 0.014376 +v -0.021248 0.308455 0.013538 +v -0.021070 0.308831 0.012899 +v -0.021064 0.308901 0.012432 +v -0.027424 0.305298 0.016141 +v -0.027134 0.306192 0.015842 +v -0.030568 0.305394 0.016154 +v -0.030808 0.304530 0.016350 +v -0.030316 0.306010 0.015719 +v -0.034027 0.305612 0.015408 +v -0.034269 0.304996 0.015724 +v -0.034494 0.304136 0.015833 +v -0.024523 0.306237 0.015587 +v -0.024109 0.307124 0.015073 +v -0.022212 0.307046 0.014842 +v -0.021634 0.307843 0.014262 +v -0.034798 0.302336 0.015220 +v -0.031203 0.302754 0.015888 +v -0.031053 0.303673 0.016219 +v -0.034677 0.303284 0.015564 +v -0.027927 0.303488 0.015993 +v -0.027745 0.304412 0.016200 +v -0.025222 0.304452 0.015724 +v -0.024962 0.305316 0.015850 +v -0.022917 0.305644 0.015157 +v -0.022728 0.306277 0.015196 +v -0.020901 0.306653 0.014584 +v -0.021270 0.306843 0.014685 +v -0.019275 0.307514 0.014126 +v -0.020459 0.307472 0.014356 +v -0.027871 0.302573 0.015588 +v -0.031159 0.301758 0.015373 +v -0.034740 0.301234 0.014684 +v -0.045393 0.305092 0.007631 +v -0.045628 0.304551 0.007782 +v -0.045453 0.304464 0.008309 +v -0.045249 0.305047 0.008228 +v -0.045881 0.304264 0.007848 +v -0.045734 0.304048 0.008208 +v -0.045532 0.303819 0.008809 +v -0.045287 0.304347 0.008974 +v -0.045032 0.304909 0.008876 +v -0.046044 0.303848 0.007885 +v -0.045792 0.303486 0.008433 +v -0.046129 0.304184 0.007540 +v -0.046659 0.304231 0.006867 +v -0.046476 0.303756 0.007246 +v -0.046131 0.303249 0.007810 +v -0.044682 0.304779 0.009658 +v -0.044912 0.304184 0.009704 +v -0.044200 0.304009 0.010619 +v -0.045162 0.303622 0.009545 +v -0.044417 0.303417 0.010465 +v -0.040872 0.303686 0.013125 +v -0.040723 0.304437 0.013353 +v -0.042862 0.304003 0.011843 +v -0.043048 0.303332 0.011643 +v -0.037554 0.305407 0.014484 +v -0.037744 0.304849 0.014648 +v -0.037916 0.304092 0.014535 +v -0.038106 0.303238 0.014285 +v -0.041081 0.302850 0.012781 +v -0.041287 0.301971 0.012350 +v -0.038298 0.302251 0.013961 +v -0.043234 0.302636 0.011291 +v -0.043383 0.301945 0.010785 +v -0.044572 0.302836 0.010087 +v -0.044742 0.302297 0.009550 +v -0.045356 0.303159 0.009162 +v -0.045599 0.302756 0.008584 +v -0.046677 0.303041 0.006911 +v -0.047276 0.303706 0.006312 +v -0.047656 0.304314 0.005875 +v -0.044972 0.301746 0.008889 +v -0.045973 0.302367 0.007800 +v -0.041314 0.301040 0.011763 +v -0.043496 0.301231 0.010200 +v -0.038265 0.301125 0.013392 +v -0.030160 0.306034 0.014675 +v -0.030110 0.306290 0.015197 +v -0.033851 0.305634 0.014327 +v -0.033811 0.305847 0.014892 +v -0.037393 0.305512 0.013387 +v -0.037361 0.305719 0.013908 +v -0.044469 0.305208 0.009468 +v -0.044836 0.305338 0.008623 +v -0.044530 0.305449 0.009072 +v -0.044841 0.305665 0.008127 +v -0.044964 0.305504 0.007882 +v -0.045123 0.305628 0.007217 +v -0.044926 0.306032 0.007249 +v -0.044998 0.306421 0.006529 +v -0.046017 0.304612 0.007338 +v -0.045697 0.305091 0.007180 +v -0.046256 0.305112 0.006869 +v -0.046666 0.304665 0.006763 +v -0.047813 0.304881 0.005720 +v -0.047623 0.305202 0.006202 +v -0.045303 0.305860 0.006830 +v -0.045122 0.306819 0.006039 +v -0.045254 0.306960 0.005785 +v -0.045566 0.305905 0.006758 +v -0.019621 0.308182 0.013810 +v -0.019121 0.308798 0.013173 +v -0.018183 0.308272 0.013635 +v -0.017490 0.308918 0.013263 +v -0.017757 0.309385 0.012720 +v -0.018993 0.309191 0.012534 +v -0.017940 0.309674 0.012129 +v -0.019083 0.309431 0.012081 +v -0.017096 0.309426 0.013792 +v -0.017518 0.309444 0.013234 +v -0.017365 0.309480 0.013031 +v -0.016927 0.309324 0.013586 +v -0.017785 0.309816 0.012589 +v -0.017618 0.309844 0.012443 +v -0.016670 0.308925 0.013590 +v -0.016399 0.309387 0.013868 +v -0.015869 0.309999 0.014013 +v -0.016541 0.309618 0.014096 +v -0.025135 0.303638 0.015451 +v -0.022771 0.305068 0.014988 +v -0.020530 0.306367 0.014481 +v -0.018610 0.307438 0.014073 +v -0.017384 0.308265 0.013722 +v 0.024881 0.239208 0.018356 +v 0.023615 0.240545 0.020091 +v 0.023616 0.241001 0.020163 +v 0.024748 0.240102 0.018453 +v 0.022904 0.241492 0.021993 +v 0.022941 0.241495 0.022060 +v 0.022799 0.241524 0.022432 +v 0.023296 0.241351 0.020631 +v 0.024366 0.240975 0.018777 +v 0.021676 0.241421 0.022879 +v 0.022472 0.241394 0.022265 +v 0.023319 0.240178 0.020339 +v 0.022626 0.239959 0.020929 +v 0.024758 0.238503 0.018553 +v 0.024171 0.237973 0.019088 +v 0.022597 0.241905 0.023730 +v 0.022641 0.241908 0.023762 +v 0.022631 0.241877 0.025085 +v 0.022682 0.241880 0.025123 +v 0.022465 0.241734 0.025382 +v 0.022453 0.241708 0.024070 +v 0.022664 0.241699 0.026217 +v 0.022999 0.241676 0.025898 +v 0.023067 0.241543 0.025739 +v 0.019845 0.241884 0.027520 +v 0.019453 0.242185 0.026803 +v 0.017767 0.242228 0.028032 +v 0.018260 0.241855 0.028520 +v 0.019334 0.242001 0.024990 +v 0.017660 0.242255 0.026516 +v 0.015178 0.242409 0.027754 +v 0.015320 0.242492 0.029269 +v 0.015955 0.241943 0.029819 +v 0.022787 0.241423 0.025800 +v 0.022225 0.241368 0.026176 +v 0.022378 0.241898 0.025286 +v 0.021718 0.241906 0.025781 +v 0.022237 0.241928 0.024007 +v 0.021536 0.241952 0.024595 +v 0.021525 0.241358 0.026731 +v 0.020600 0.241295 0.027490 +v 0.020872 0.241907 0.026582 +v 0.020622 0.242065 0.025540 +v 0.020637 0.241602 0.023758 +v 0.019221 0.241122 0.028495 +v 0.017127 0.241055 0.030030 +v 0.008829 0.242635 0.029601 +v 0.012171 0.242549 0.028813 +v 0.012101 0.240770 0.025883 +v 0.008959 0.240805 0.026669 +v 0.014979 0.240593 0.024953 +v 0.015908 0.237056 0.023245 +v 0.012841 0.237112 0.024328 +v 0.009534 0.237250 0.024989 +v 0.009490 0.242568 0.033328 +v 0.008949 0.243087 0.031932 +v 0.005332 0.242930 0.032772 +v 0.005657 0.242442 0.034414 +v 0.005378 0.242446 0.030279 +v 0.002108 0.242457 0.030580 +v 0.001987 0.242795 0.033113 +v 0.002053 0.242340 0.034580 +v 0.010617 0.241215 0.033960 +v 0.006460 0.241079 0.035676 +v 0.002310 0.240858 0.035879 +v 0.014188 0.241131 0.031896 +v 0.012947 0.242276 0.031573 +v 0.012326 0.242892 0.030680 +v 0.005600 0.240641 0.027370 +v 0.002338 0.240429 0.027775 +v 0.006030 0.237313 0.025310 +v 0.002622 0.237192 0.025563 +v 0.021462 0.239903 0.021754 +v 0.019637 0.240204 0.022448 +v 0.022907 0.237553 0.019798 +v 0.021067 0.237272 0.020778 +v 0.017456 0.240506 0.023654 +v 0.018690 0.237116 0.021963 +v -0.018609 0.240157 0.022350 +v -0.018509 0.239993 0.022231 +v -0.018893 0.239473 0.020326 +v -0.019079 0.239978 0.020476 +v -0.018084 0.239801 0.022296 +v -0.018514 0.238881 0.020439 +v -0.019369 0.237636 0.018364 +v -0.019675 0.238644 0.018303 +v -0.019792 0.239602 0.018480 +v -0.018012 0.238357 0.020819 +v -0.018911 0.236743 0.018676 +v -0.017399 0.239697 0.022551 +v -0.016441 0.239696 0.023169 +v -0.017190 0.237995 0.021520 +v -0.018191 0.235970 0.019348 +v -0.018282 0.239895 0.025382 +v -0.018391 0.239799 0.025161 +v -0.018284 0.239999 0.023810 +v -0.018394 0.240133 0.023986 +v -0.018128 0.239851 0.025170 +v -0.018075 0.240013 0.023887 +v -0.018779 0.239441 0.026068 +v -0.018489 0.239327 0.026001 +v -0.018498 0.239659 0.026342 +v -0.009621 0.241659 0.027956 +v -0.011939 0.241112 0.026589 +v -0.012373 0.241432 0.028385 +v -0.010125 0.242259 0.029836 +v -0.013805 0.240451 0.025345 +v -0.014189 0.241021 0.027062 +v -0.014563 0.240525 0.027907 +v -0.012838 0.240796 0.029150 +v -0.010596 0.241580 0.030656 +v -0.017985 0.239378 0.026172 +v -0.017623 0.239994 0.025435 +v -0.017378 0.239564 0.026656 +v -0.016929 0.240194 0.026035 +v -0.017464 0.240090 0.024192 +v -0.016573 0.240245 0.024799 +v -0.016548 0.239728 0.027328 +v -0.015961 0.240338 0.026885 +v -0.015249 0.239703 0.028133 +v -0.015500 0.240524 0.025804 +v -0.015240 0.239959 0.024152 +v -0.013638 0.239936 0.029480 +v -0.011351 0.240566 0.031069 +v -0.009627 0.235840 0.023999 +v -0.009356 0.238918 0.026014 +v -0.006513 0.239506 0.026837 +v -0.006620 0.236413 0.024859 +v -0.006803 0.242233 0.028984 +v -0.003875 0.242447 0.029886 +v -0.003604 0.240024 0.027382 +v -0.003587 0.236848 0.025390 +v -0.000922 0.242530 0.030447 +v -0.001162 0.242782 0.032950 +v -0.004247 0.242870 0.032410 +v -0.004568 0.242375 0.033674 +v -0.001335 0.242356 0.034341 +v -0.001505 0.240974 0.035658 +v -0.005002 0.241060 0.034906 +v -0.007698 0.242156 0.032254 +v -0.008360 0.241060 0.033007 +v -0.007260 0.242721 0.031326 +v -0.000657 0.240405 0.027615 +v -0.000544 0.237073 0.025622 +v -0.015944 0.237798 0.022567 +v -0.016897 0.235407 0.020265 +v -0.014198 0.237865 0.023757 +v -0.014988 0.235176 0.021416 +v -0.011999 0.238257 0.024994 +v -0.012506 0.235339 0.022771 +v 0.012715 0.243055 0.026303 +v 0.012369 0.242917 0.028477 +v 0.010151 0.242995 0.029210 +v 0.010502 0.243095 0.026866 +v 0.012056 0.242803 0.030576 +v 0.009699 0.242964 0.031458 +v 0.006905 0.242945 0.032274 +v 0.007380 0.242960 0.029860 +v 0.007840 0.243025 0.027333 +v 0.004402 0.242822 0.030375 +v 0.004853 0.242928 0.027741 +v 0.004091 0.242758 0.032839 +v 0.001288 0.242735 0.032900 +v 0.001507 0.242838 0.030486 +v 0.001797 0.242887 0.027950 +v 0.006424 0.243872 0.034668 +v 0.003825 0.243669 0.035029 +v 0.005861 0.245388 0.036938 +v 0.003468 0.245155 0.037124 +v 0.000821 0.244910 0.037150 +v 0.001037 0.243632 0.034924 +v 0.011594 0.243656 0.032761 +v 0.009152 0.243932 0.033759 +v 0.010804 0.245287 0.035073 +v 0.008346 0.245565 0.036066 +v 0.022799 0.241524 0.022432 +v 0.022453 0.241708 0.024070 +v 0.021924 0.241701 0.024606 +v 0.022212 0.241614 0.022989 +v 0.021853 0.241703 0.025944 +v 0.021107 0.241789 0.026879 +v 0.021162 0.241797 0.025509 +v 0.021362 0.241812 0.023824 +v 0.021318 0.242150 0.028010 +v 0.022085 0.241838 0.026969 +v 0.015193 0.243567 0.032174 +v 0.017253 0.242852 0.030543 +v 0.016935 0.244369 0.032577 +v 0.014615 0.245699 0.034282 +v 0.018862 0.242411 0.029148 +v 0.018885 0.243416 0.030547 +v 0.016398 0.243101 0.024626 +v 0.016037 0.242737 0.026716 +v 0.014267 0.242803 0.027674 +v 0.014622 0.243078 0.025583 +v 0.015787 0.242637 0.028618 +v 0.013956 0.242680 0.029618 +v 0.013583 0.243281 0.031573 +v 0.015543 0.242659 0.030400 +v 0.013031 0.244650 0.033772 +v 0.017687 0.242604 0.025592 +v 0.017498 0.242556 0.027518 +v 0.018161 0.243043 0.023451 +v 0.019895 0.242902 0.022212 +v 0.019235 0.242443 0.024297 +v 0.018954 0.242274 0.026271 +v 0.024366 0.240975 0.018777 +v 0.023296 0.241351 0.020631 +v 0.022766 0.241624 0.021168 +v 0.023626 0.241744 0.019325 +v 0.021842 0.241936 0.021968 +v 0.022603 0.242306 0.020035 +v 0.020264 0.242065 0.024963 +v 0.020649 0.242241 0.023038 +v 0.021363 0.242668 0.020998 +v 0.017360 0.242461 0.029164 +v 0.018869 0.242193 0.027947 +v 0.020154 0.242052 0.028025 +v 0.020121 0.241965 0.026695 +v 0.020300 0.242630 0.029126 +v 0.012063 0.246941 0.035689 +v 0.009471 0.247642 0.037122 +v 0.007130 0.247899 0.038143 +v 0.004990 0.247795 0.038735 +v 0.002764 0.247369 0.039053 +v 0.000427 0.247057 0.039343 +v -0.004001 0.242764 0.032285 +v -0.006147 0.242523 0.031535 +v -0.006300 0.242530 0.029244 +v -0.003989 0.242599 0.029858 +v -0.008091 0.242216 0.030714 +v -0.008327 0.242381 0.028524 +v -0.008630 0.242837 0.026227 +v -0.006435 0.242925 0.026892 +v -0.003970 0.242900 0.027435 +v -0.001507 0.242776 0.032804 +v -0.001339 0.242737 0.030311 +v -0.001203 0.242847 0.027806 +v -0.001816 0.245110 0.037160 +v -0.001909 0.243571 0.035163 +v -0.003992 0.245277 0.036753 +v -0.004049 0.243686 0.034612 +v -0.006076 0.245048 0.036050 +v -0.006114 0.243509 0.033804 +v -0.008013 0.244534 0.035028 +v -0.007964 0.243167 0.032709 +v -0.017138 0.240161 0.026553 +v -0.017840 0.239953 0.025811 +v -0.018024 0.240222 0.024437 +v -0.017272 0.240335 0.025200 +v -0.018394 0.240133 0.023986 +v -0.018609 0.240157 0.022350 +v -0.018378 0.240298 0.022799 +v -0.017628 0.240482 0.023556 +v -0.018097 0.240026 0.026929 +v -0.017476 0.240441 0.027808 +v -0.015341 0.242128 0.030578 +v -0.013781 0.243356 0.032270 +v -0.014798 0.241195 0.029203 +v -0.013350 0.241953 0.030816 +v -0.011606 0.242910 0.032366 +v -0.011980 0.244546 0.034095 +v -0.009877 0.241957 0.029766 +v -0.010192 0.242198 0.027665 +v -0.011612 0.241680 0.028668 +v -0.011993 0.242025 0.026621 +v -0.012574 0.242516 0.024324 +v -0.010639 0.242708 0.025398 +v -0.011463 0.241863 0.030511 +v -0.009697 0.242676 0.031665 +v -0.009843 0.243811 0.033786 +v -0.016304 0.241882 0.021589 +v -0.014506 0.242208 0.023000 +v -0.013775 0.241742 0.025346 +v -0.015505 0.241411 0.023947 +v -0.013298 0.241372 0.027349 +v -0.014954 0.241029 0.025956 +v -0.018896 0.240393 0.020898 +v -0.018191 0.240755 0.021607 +v -0.019079 0.239978 0.020476 +v -0.019792 0.239602 0.018480 +v -0.019615 0.240425 0.018856 +v -0.018964 0.241072 0.019439 +v -0.017017 0.241084 0.022635 +v -0.017832 0.241539 0.020358 +v -0.016444 0.240720 0.024624 +v -0.014704 0.240878 0.027681 +v -0.013157 0.241484 0.029124 +v -0.016116 0.240510 0.026300 +v -0.016067 0.240559 0.027708 +v -0.016485 0.241098 0.029014 +v -0.010078 0.245637 0.035756 +v -0.008225 0.246638 0.036988 +v -0.004180 0.247497 0.038581 +v -0.006287 0.247299 0.037882 +v -0.001960 0.247172 0.039246 +v 0.038524 0.322509 -0.003987 +v 0.038834 0.323103 -0.001599 +v 0.034290 0.324821 -0.000984 +v 0.034145 0.324090 -0.003683 +v 0.039030 0.323495 0.000364 +v 0.034421 0.325117 0.001378 +v 0.029383 0.325003 0.001785 +v 0.029369 0.324753 -0.000946 +v 0.029492 0.323935 -0.003906 +v 0.024746 0.322930 0.001480 +v 0.024809 0.322728 -0.001463 +v 0.021305 0.319410 0.000956 +v 0.021339 0.319170 -0.002135 +v 0.021812 0.318522 -0.005435 +v 0.025178 0.321966 -0.004604 +v 0.019467 0.315086 0.000809 +v 0.019425 0.314616 -0.002548 +v 0.018890 0.310429 0.001701 +v 0.018921 0.309660 -0.002676 +v 0.019347 0.309167 -0.006432 +v 0.019876 0.314068 -0.006058 +v 0.019658 0.305929 0.000862 +v 0.019660 0.304894 -0.002705 +v 0.021231 0.302367 0.001625 +v 0.021515 0.300568 -0.002399 +v 0.022085 0.299794 -0.006327 +v 0.020126 0.304296 -0.006545 +v 0.024450 0.296867 -0.001848 +v 0.024965 0.295947 -0.005805 +v 0.024389 0.298812 0.001571 +v 0.027953 0.296489 0.001822 +v 0.028128 0.294134 -0.001311 +v 0.028485 0.292998 -0.005253 +v 0.032113 0.292471 -0.001034 +v 0.032334 0.291128 -0.004956 +v 0.031746 0.295041 0.002086 +v 0.035545 0.294511 0.002086 +v 0.035950 0.291818 -0.001112 +v 0.036006 0.290338 -0.005018 +v 0.041586 0.295778 0.000579 +v 0.041748 0.292956 -0.002520 +v 0.039217 0.292078 -0.001652 +v 0.038925 0.294846 0.001561 +v 0.041442 0.291387 -0.006147 +v 0.039063 0.290529 -0.005471 +v 0.044836 0.298248 -0.001732 +v 0.044945 0.295666 -0.004268 +v 0.043601 0.294172 -0.003442 +v 0.043489 0.296947 -0.000599 +v 0.044563 0.294250 -0.007373 +v 0.043230 0.292637 -0.006825 +v 0.045811 0.299704 -0.002700 +v 0.045917 0.297441 -0.004909 +v 0.046515 0.301353 -0.003427 +v 0.046621 0.299462 -0.005328 +v 0.046265 0.298396 -0.007814 +v 0.045555 0.296198 -0.007699 +v 0.046628 0.309509 -0.006843 +v 0.046983 0.310159 -0.005117 +v 0.046276 0.313292 -0.004550 +v 0.045891 0.312701 -0.006289 +v 0.046993 0.311182 -0.003841 +v 0.046332 0.314150 -0.003240 +v 0.044974 0.317351 -0.002294 +v 0.044871 0.316629 -0.003720 +v 0.044468 0.316057 -0.005586 +v 0.046992 0.303456 -0.007577 +v 0.047364 0.304328 -0.005551 +v 0.047322 0.307165 -0.005445 +v 0.046963 0.306404 -0.007273 +v 0.047337 0.305927 -0.003871 +v 0.047293 0.308445 -0.004115 +v 0.047003 0.303278 -0.003855 +v 0.047110 0.301731 -0.005525 +v 0.046744 0.300790 -0.007761 +v 0.042038 0.319553 -0.004732 +v 0.042417 0.320111 -0.002635 +v 0.042580 0.320662 -0.000997 +v 0.020616 0.308772 -0.009616 +v 0.021161 0.313279 -0.009178 +v 0.022749 0.308351 -0.012158 +v 0.023312 0.312256 -0.011729 +v 0.024945 0.315739 -0.011037 +v 0.022994 0.317326 -0.008478 +v 0.025648 0.307810 -0.014067 +v 0.026241 0.311039 -0.013674 +v 0.028872 0.307188 -0.015270 +v 0.029453 0.309643 -0.014952 +v 0.032021 0.311806 -0.014505 +v 0.027746 0.313934 -0.013034 +v 0.032299 0.301214 -0.015641 +v 0.029662 0.304440 -0.015453 +v 0.026461 0.304341 -0.014216 +v 0.027986 0.301035 -0.014084 +v 0.023502 0.304281 -0.012310 +v 0.025174 0.300458 -0.012114 +v 0.023251 0.299903 -0.009583 +v 0.021376 0.304186 -0.009779 +v 0.028976 0.293453 -0.008569 +v 0.025848 0.296261 -0.009087 +v 0.029631 0.294798 -0.011112 +v 0.027208 0.297256 -0.011624 +v 0.030544 0.296389 -0.013107 +v 0.029155 0.298363 -0.013601 +v 0.031442 0.297450 -0.014243 +v 0.031348 0.298863 -0.014841 +v 0.032741 0.296818 -0.014282 +v 0.033184 0.298118 -0.015074 +v 0.034057 0.296001 -0.014021 +v 0.034789 0.296595 -0.014476 +v 0.035692 0.297251 -0.014831 +v 0.033995 0.298979 -0.015481 +v 0.035257 0.292359 -0.010861 +v 0.034623 0.294398 -0.012840 +v 0.032548 0.295081 -0.012870 +v 0.032481 0.293145 -0.010835 +v 0.032439 0.291614 -0.008300 +v 0.035735 0.290781 -0.008354 +v 0.040533 0.291680 -0.009300 +v 0.038428 0.290900 -0.008739 +v 0.039203 0.293139 -0.011681 +v 0.037475 0.292443 -0.011191 +v 0.036233 0.294541 -0.013125 +v 0.037519 0.295175 -0.013530 +v 0.041805 0.295555 -0.012498 +v 0.039671 0.297154 -0.014197 +v 0.038667 0.296035 -0.013912 +v 0.040617 0.294185 -0.012155 +v 0.037367 0.298718 -0.015297 +v 0.036624 0.297870 -0.015095 +v 0.043472 0.294406 -0.010230 +v 0.042172 0.292860 -0.009839 +v 0.026006 0.320497 -0.007562 +v 0.027367 0.318566 -0.010118 +v 0.030458 0.320342 -0.009283 +v 0.029845 0.322371 -0.006754 +v 0.034058 0.322629 -0.006371 +v 0.034032 0.320709 -0.008828 +v 0.037540 0.319641 -0.008816 +v 0.038090 0.321280 -0.006473 +v 0.041371 0.318580 -0.006994 +v 0.040372 0.317337 -0.009215 +v 0.042348 0.314506 -0.009792 +v 0.043650 0.315319 -0.007668 +v 0.043948 0.303655 -0.012098 +v 0.043763 0.301305 -0.012422 +v 0.045692 0.300709 -0.010157 +v 0.045941 0.303266 -0.009842 +v 0.043437 0.299171 -0.012588 +v 0.045224 0.298404 -0.010340 +v 0.036154 0.305614 -0.015479 +v 0.037783 0.302904 -0.015442 +v 0.040906 0.302248 -0.014248 +v 0.040810 0.304465 -0.014007 +v 0.038156 0.301160 -0.015447 +v 0.040927 0.300269 -0.014335 +v 0.035558 0.301458 -0.015896 +v 0.035656 0.302691 -0.015885 +v 0.033936 0.303602 -0.015917 +v 0.038017 0.299779 -0.015408 +v 0.040492 0.298563 -0.014329 +v 0.042774 0.297236 -0.012630 +v 0.044488 0.296285 -0.010385 +v 0.036065 0.300487 -0.015825 +v 0.035178 0.299899 -0.015780 +v 0.031943 0.304802 -0.015871 +v 0.032007 0.306529 -0.015756 +v 0.033821 0.308682 -0.015358 +v 0.031783 0.308317 -0.015510 +v 0.038081 0.307707 -0.014746 +v 0.035765 0.308950 -0.015110 +v 0.038742 0.309549 -0.014186 +v 0.035792 0.310380 -0.014761 +v 0.044090 0.308949 -0.010980 +v 0.041636 0.309078 -0.012863 +v 0.041295 0.306754 -0.013485 +v 0.044134 0.306235 -0.011587 +v 0.045982 0.306107 -0.009390 +v 0.045726 0.309102 -0.008855 +v 0.038103 0.313172 -0.013185 +v 0.038809 0.311326 -0.013682 +v 0.041392 0.311401 -0.012272 +v 0.040485 0.313752 -0.011706 +v 0.043547 0.311697 -0.010380 +v 0.045024 0.312153 -0.008287 +v 0.036833 0.317914 -0.010774 +v 0.038978 0.316080 -0.011148 +v 0.036113 0.316595 -0.011991 +v 0.037079 0.315107 -0.012579 +v 0.036531 0.311450 -0.014345 +v 0.035322 0.312748 -0.014053 +v 0.031345 0.318224 -0.011270 +v 0.034057 0.318647 -0.010839 +v 0.032313 0.316666 -0.012399 +v 0.034197 0.316657 -0.012298 +v 0.034546 0.314685 -0.013328 +v 0.031814 0.314988 -0.013260 +v 0.029325 0.316520 -0.012106 +v 0.035075 0.299130 -0.015604 +v 0.020325 0.308729 0.010916 +v 0.019669 0.308945 0.011241 +v 0.019696 0.308772 0.011436 +v 0.020704 0.308402 0.011115 +v 0.019086 0.309308 0.011377 +v 0.018870 0.309156 0.011434 +v 0.018858 0.309165 0.011666 +v 0.019971 0.308755 0.011748 +v 0.021892 0.308014 0.011722 +v 0.018712 0.308964 0.012303 +v 0.018818 0.309120 0.011929 +v 0.018201 0.309336 0.011956 +v 0.018232 0.309123 0.012488 +v 0.018340 0.309506 0.011600 +v 0.018465 0.309840 0.011868 +v 0.018269 0.309611 0.012280 +v 0.018306 0.309319 0.012829 +v 0.035000 0.305121 0.014108 +v 0.038197 0.305159 0.012922 +v 0.037963 0.304041 0.012107 +v 0.034860 0.303755 0.013236 +v 0.040702 0.305657 0.011505 +v 0.040414 0.304946 0.010701 +v 0.040164 0.304153 0.009459 +v 0.037651 0.302915 0.010849 +v 0.034463 0.302498 0.011870 +v 0.031009 0.302923 0.012544 +v 0.031419 0.304079 0.014011 +v 0.027664 0.304599 0.012743 +v 0.028007 0.305527 0.014030 +v 0.028109 0.306328 0.014961 +v 0.031572 0.305355 0.014960 +v 0.024717 0.306567 0.012396 +v 0.024846 0.307167 0.013390 +v 0.022088 0.308189 0.012544 +v 0.022076 0.308113 0.012988 +v 0.024932 0.307538 0.014024 +v 0.027350 0.303655 0.009604 +v 0.027482 0.304189 0.011150 +v 0.030582 0.302567 0.010877 +v 0.030367 0.302314 0.009331 +v 0.033903 0.302121 0.010137 +v 0.033638 0.301796 0.008596 +v 0.037082 0.302615 0.009026 +v 0.039810 0.303788 0.007704 +v 0.039712 0.302976 0.005993 +v 0.036882 0.302108 0.007407 +v 0.045530 0.311705 0.003422 +v 0.045006 0.309756 0.005129 +v 0.044164 0.308900 0.006762 +v 0.044738 0.311840 0.004838 +v 0.044743 0.308225 0.006847 +v 0.043992 0.307065 0.008451 +v 0.042910 0.306172 0.010301 +v 0.043010 0.308096 0.008549 +v 0.043490 0.312144 0.006569 +v 0.046695 0.311324 -0.000592 +v 0.046518 0.311186 0.000771 +v 0.046493 0.312324 0.001128 +v 0.046709 0.312830 -0.000254 +v 0.046146 0.310765 0.002079 +v 0.046022 0.311328 0.002496 +v 0.046027 0.313409 0.001879 +v 0.046369 0.314427 0.000475 +v 0.045381 0.309379 0.003074 +v 0.045845 0.310173 0.002349 +v 0.046237 0.310205 0.000915 +v 0.045765 0.309263 0.001483 +v 0.046390 0.310075 -0.000505 +v 0.045954 0.308986 -0.000219 +v 0.044252 0.307742 0.005245 +v 0.044815 0.308555 0.004087 +v 0.045113 0.308309 0.002362 +v 0.044403 0.307316 0.003433 +v 0.045371 0.307864 0.000461 +v 0.044613 0.306754 0.001403 +v 0.042316 0.306277 0.010209 +v 0.042037 0.305892 0.009516 +v 0.043228 0.306776 0.009013 +v 0.043038 0.306615 0.008469 +v 0.042806 0.306158 0.007341 +v 0.041748 0.305377 0.008300 +v 0.043616 0.306932 0.006352 +v 0.043571 0.306457 0.004502 +v 0.042678 0.305585 0.005543 +v 0.043768 0.305723 0.002492 +v 0.042783 0.304775 0.003619 +v 0.041558 0.304781 0.006562 +v 0.041548 0.303934 0.004760 +v 0.043818 0.307096 0.007961 +v 0.043708 0.307207 0.007448 +v 0.044243 0.307422 0.007049 +v 0.044228 0.307767 0.006399 +v 0.044623 0.307920 0.006229 +v 0.044631 0.308447 0.005330 +v 0.045067 0.308491 0.005458 +v 0.045111 0.309123 0.004346 +v 0.045442 0.309192 0.005008 +v 0.045550 0.309722 0.003581 +v 0.045676 0.309269 0.004692 +v 0.045710 0.310060 0.003237 +v 0.045590 0.310086 0.003946 +v 0.045328 0.308996 0.005533 +v 0.019003 0.309734 0.012522 +v 0.018835 0.309217 0.013092 +v 0.019064 0.310145 0.012093 +v 0.020124 0.310626 0.012223 +v 0.020297 0.309606 0.012645 +v 0.020129 0.308700 0.013337 +v 0.018529 0.309632 0.011380 +v 0.018507 0.310071 0.011736 +v 0.018814 0.309681 0.011455 +v 0.018724 0.310231 0.011518 +v 0.019352 0.309415 0.011415 +v 0.019049 0.309781 0.011485 +v 0.019620 0.309577 0.011598 +v 0.019476 0.309935 0.011591 +v 0.019384 0.310454 0.011565 +v 0.018982 0.310329 0.011561 +v 0.019017 0.310604 0.011930 +v 0.018984 0.310919 0.011901 +v 0.019356 0.312070 0.011707 +v 0.019730 0.311531 0.011978 +v 0.019344 0.311012 0.011571 +v 0.018985 0.310994 0.011578 +v 0.019288 0.311433 0.011579 +v 0.019152 0.311626 0.011611 +v 0.020618 0.309556 0.011229 +v 0.020089 0.309512 0.011625 +v 0.019877 0.309118 0.011442 +v 0.020497 0.309002 0.011103 +v 0.020867 0.309814 0.010275 +v 0.020902 0.309690 0.010694 +v 0.020885 0.309080 0.010491 +v 0.020670 0.309395 0.009876 +v 0.020687 0.308569 0.010231 +v 0.020512 0.308561 0.009056 +v 0.020050 0.310059 0.011606 +v 0.019859 0.310598 0.011519 +v 0.020595 0.310233 0.011386 +v 0.020333 0.310808 0.011407 +v 0.019677 0.311795 0.011199 +v 0.019444 0.311577 0.011430 +v 0.019618 0.311124 0.011504 +v 0.019953 0.311307 0.011312 +v 0.023967 0.307495 0.014888 +v 0.023860 0.309290 0.013823 +v 0.027006 0.308796 0.014486 +v 0.027239 0.306693 0.016056 +v 0.023585 0.311861 0.012778 +v 0.026742 0.312304 0.012946 +v 0.031102 0.312552 0.012590 +v 0.031517 0.308104 0.014391 +v 0.031550 0.305773 0.016233 +v 0.035528 0.307744 0.013559 +v 0.035358 0.305342 0.015434 +v 0.035378 0.312903 0.011890 +v 0.038945 0.313059 0.010290 +v 0.038885 0.307807 0.012080 +v 0.038501 0.305336 0.013973 +v 0.041325 0.307913 0.010337 +v 0.041585 0.312715 0.008431 +v 0.041032 0.305659 0.012149 +v 0.045180 0.314454 0.003058 +v 0.045629 0.316136 0.001650 +v 0.043871 0.315653 0.004632 +v 0.044189 0.318031 0.003084 +v 0.041742 0.316932 0.006492 +v 0.041951 0.319929 0.004866 +v 0.038645 0.317900 0.008511 +v 0.038680 0.321390 0.006842 +v 0.034791 0.317985 0.010136 +v 0.030382 0.317222 0.011181 +v 0.029947 0.320870 0.009623 +v 0.034515 0.321809 0.008605 +v 0.026078 0.315865 0.011765 +v 0.022788 0.314255 0.012023 +v 0.021624 0.315737 0.010405 +v 0.025676 0.318739 0.010049 +v 0.020922 0.312734 0.011866 +v 0.021602 0.311288 0.012428 +v 0.020191 0.313527 0.011371 +v 0.021696 0.308106 0.013889 +v 0.021870 0.309483 0.013013 +v 0.046920 0.312623 -0.001230 +v 0.046865 0.310966 -0.001514 +v 0.046619 0.314558 -0.000601 +v 0.046771 0.313912 -0.001670 +v 0.047077 0.311762 -0.002150 +v 0.047055 0.310043 -0.002278 +v 0.044205 0.304928 0.001109 +v 0.043185 0.303902 0.002295 +v 0.045055 0.306072 0.000026 +v 0.045614 0.305069 -0.001009 +v 0.044827 0.303891 0.000049 +v 0.043829 0.302814 0.001280 +v 0.041908 0.302930 0.003521 +v 0.039995 0.301985 0.004819 +v 0.042535 0.301766 0.002597 +v 0.040586 0.300741 0.003955 +v 0.037124 0.301202 0.006219 +v 0.033761 0.301071 0.007318 +v 0.037700 0.299883 0.005238 +v 0.034204 0.299725 0.006106 +v 0.027406 0.301595 0.006449 +v 0.027300 0.302910 0.008112 +v 0.030360 0.301674 0.007918 +v 0.030647 0.300391 0.006433 +v 0.046625 0.309636 -0.001565 +v 0.046264 0.308491 -0.001369 +v 0.046897 0.308813 -0.002329 +v 0.046654 0.307622 -0.002208 +v 0.045758 0.307293 -0.000822 +v 0.046236 0.306346 -0.001771 +v 0.019055 0.309846 0.005701 +v 0.019295 0.310286 0.007324 +v 0.019673 0.309015 0.007283 +v 0.019500 0.308259 0.005568 +v 0.019629 0.310594 0.008621 +v 0.019976 0.309573 0.008689 +v 0.020183 0.307791 0.007333 +v 0.020009 0.306806 0.005642 +v 0.029643 0.324169 0.006660 +v 0.029803 0.323021 0.008159 +v 0.025663 0.320621 0.008232 +v 0.025458 0.321760 0.006551 +v 0.022455 0.317930 0.008165 +v 0.022198 0.318920 0.006278 +v 0.039147 0.324057 0.004095 +v 0.038887 0.323217 0.005548 +v 0.034524 0.323970 0.007296 +v 0.034568 0.324988 0.005777 +v 0.042255 0.321406 0.003576 +v 0.044509 0.319092 0.001793 +v 0.042571 0.321792 0.002171 +v 0.044809 0.319089 0.000452 +v 0.045894 0.316740 0.000406 +v 0.046106 0.316390 -0.000817 +v 0.047258 0.310194 -0.002961 +v 0.047265 0.308453 -0.002852 +v 0.046965 0.312588 -0.002628 +v 0.045429 0.302130 -0.001094 +v 0.044468 0.300933 0.000064 +v 0.046141 0.303444 -0.002017 +v 0.043142 0.299778 0.001370 +v 0.041188 0.298638 0.002728 +v 0.038396 0.297714 0.003852 +v 0.034909 0.297414 0.004481 +v 0.027713 0.299268 0.004372 +v 0.031205 0.297972 0.004546 +v 0.046779 0.307805 -0.002892 +v 0.046996 0.306516 -0.002821 +v 0.046672 0.304929 -0.002602 +v 0.018945 0.309356 0.003906 +v 0.019535 0.307129 0.003534 +v 0.020129 0.305235 0.003827 +v 0.029452 0.324877 0.004605 +v 0.024879 0.322668 0.004457 +v 0.021466 0.319396 0.003956 +v 0.039225 0.324051 0.002332 +v 0.034564 0.325334 0.003835 +v 0.042751 0.321470 0.000608 +v 0.045060 0.318372 -0.000897 +v 0.046350 0.315350 -0.001951 +v 0.018752 0.311795 0.006026 +v 0.019017 0.312043 0.007565 +v 0.019077 0.311312 0.007429 +v 0.018817 0.311040 0.005901 +v 0.019304 0.312055 0.008728 +v 0.019429 0.311442 0.008668 +v 0.018854 0.310568 0.004655 +v 0.018619 0.311266 0.004312 +v 0.019365 0.312293 0.011055 +v 0.019277 0.312048 0.011383 +v 0.019419 0.313033 0.010922 +v 0.019302 0.312754 0.011342 +v 0.019706 0.313503 0.011197 +v 0.019810 0.314041 0.010717 +v 0.019535 0.313210 0.010325 +v 0.019783 0.314053 0.010121 +v 0.019604 0.313356 0.009416 +v 0.020223 0.314811 0.009414 +v 0.019085 0.312773 0.007747 +v 0.019328 0.312634 0.008916 +v 0.018807 0.312565 0.006176 +v 0.019148 0.313843 0.006151 +v 0.019468 0.313923 0.007900 +v 0.020457 0.315708 0.007997 +v 0.020088 0.316099 0.006132 +v 0.018884 0.312929 0.004099 +v 0.018840 0.311869 0.004801 +v 0.019598 0.315740 0.003774 +v 0.020814 0.310366 0.010833 +v 0.020475 0.310967 0.010855 +v 0.020639 0.310324 0.010281 +v 0.020298 0.310973 0.010294 +v 0.019799 0.311967 0.010168 +v 0.019741 0.311904 0.010734 +v 0.020113 0.311449 0.010835 +v 0.020088 0.311563 0.010224 +v 0.019653 0.312458 0.010566 +v 0.019597 0.312473 0.009995 +v 0.019766 0.311531 0.009566 +v 0.019611 0.312016 0.009559 +v 0.019957 0.310839 0.009591 +v 0.020294 0.310037 0.009655 +v 0.019505 0.312390 0.009549 +v 0.020101 0.308814 0.012086 +v 0.020029 0.308619 0.012432 +v 0.024789 0.305295 0.009495 +v 0.024765 0.305990 0.010988 +v 0.022720 0.306591 0.009199 +v 0.022638 0.307333 0.010561 +v 0.021271 0.307504 0.008984 +v 0.021277 0.308047 0.010252 +v 0.021030 0.306777 0.007448 +v 0.022535 0.305736 0.007675 +v 0.022243 0.304611 0.006058 +v 0.020759 0.305768 0.005865 +v 0.024685 0.304398 0.007975 +v 0.024567 0.303104 0.006287 +v 0.020812 0.304708 0.004393 +v 0.021898 0.303161 0.004268 +v 0.024529 0.301077 0.004223 +v 0.003335 0.205760 -0.007304 +v 0.009781 0.206039 -0.007180 +v 0.010572 0.206475 -0.021241 +v 0.003380 0.206413 -0.021670 +v 0.015821 0.206167 -0.007183 +v 0.017007 0.206359 -0.020840 +v 0.017959 0.209010 -0.035429 +v 0.011401 0.209140 -0.036058 +v 0.003857 0.209195 -0.036618 +v 0.020816 0.206481 -0.007386 +v 0.022008 0.206364 -0.020647 +v 0.025102 0.206847 -0.007687 +v 0.026091 0.206390 -0.020839 +v 0.026951 0.208685 -0.035092 +v 0.022954 0.208907 -0.035008 +v 0.029110 0.207401 -0.008097 +v 0.029972 0.206512 -0.021504 +v 0.032771 0.208566 -0.008636 +v 0.033730 0.207345 -0.022418 +v 0.034406 0.208875 -0.036760 +v 0.030713 0.208402 -0.035806 +v 0.035837 0.210904 -0.009204 +v 0.037155 0.209608 -0.023167 +v 0.038238 0.215009 -0.009630 +v 0.039958 0.213825 -0.023542 +v 0.041148 0.214605 -0.037694 +v 0.037981 0.210846 -0.037458 +v 0.041272 0.228682 -0.009935 +v 0.043622 0.227563 -0.023750 +v 0.042170 0.220017 -0.023665 +v 0.040078 0.221185 -0.009830 +v 0.045512 0.227242 -0.037449 +v 0.043748 0.220142 -0.037612 +v 0.041579 0.236675 -0.009928 +v 0.043874 0.236005 -0.023672 +v 0.041095 0.244330 -0.009280 +v 0.043289 0.244544 -0.022943 +v 0.045279 0.244727 -0.036533 +v 0.045902 0.235757 -0.037164 +v 0.041105 0.228748 -0.056246 +v 0.041294 0.223004 -0.055771 +v 0.044348 0.221261 -0.048775 +v 0.045891 0.227581 -0.048595 +v 0.040905 0.219354 -0.054352 +v 0.041934 0.216870 -0.048799 +v 0.046097 0.244877 -0.047588 +v 0.046461 0.235896 -0.048233 +v 0.040962 0.245919 -0.055406 +v 0.041058 0.236985 -0.056124 +v 0.033406 0.221473 0.009221 +v 0.034137 0.226335 0.009135 +v 0.037224 0.223216 0.001353 +v 0.035983 0.217470 0.001448 +v 0.034230 0.232029 0.009080 +v 0.037825 0.230189 0.001300 +v 0.029186 0.215613 0.009627 +v 0.031773 0.217949 0.009358 +v 0.034075 0.213523 0.001700 +v 0.031344 0.211109 0.002044 +v 0.038537 0.214285 -0.048706 +v 0.034626 0.212642 -0.048031 +v 0.037162 0.218621 -0.055490 +v 0.032141 0.217137 -0.055241 +v 0.028831 0.215623 -0.054012 +v 0.030969 0.211972 -0.047018 +v 0.026986 0.214522 -0.052102 +v 0.027450 0.212009 -0.046225 +v 0.017624 0.216195 -0.054938 +v 0.023234 0.215559 -0.053789 +v 0.022566 0.218649 -0.057647 +v 0.014531 0.220203 -0.059088 +v 0.024392 0.221533 -0.059150 +v 0.005073 0.225586 -0.061307 +v 0.033187 0.223224 -0.058742 +v 0.028222 0.229460 -0.059973 +v 0.021378 0.213660 0.010509 +v 0.025569 0.214283 0.009973 +v 0.027744 0.209758 0.002406 +v 0.023592 0.209077 0.002826 +v 0.017900 0.228590 0.018146 +v 0.021305 0.228661 0.017341 +v 0.023197 0.221539 0.014474 +v 0.019345 0.221159 0.015081 +v 0.024231 0.229155 0.016782 +v 0.026513 0.222496 0.014079 +v 0.026377 0.230221 0.016384 +v 0.028875 0.224289 0.013794 +v 0.027685 0.231831 0.016050 +v 0.030289 0.226910 0.013600 +v 0.010687 0.228379 0.020160 +v 0.014350 0.228549 0.019152 +v 0.015404 0.221004 0.015949 +v 0.011431 0.220819 0.016842 +v 0.017096 0.213406 0.011272 +v 0.012710 0.213250 0.012021 +v 0.003594 0.212786 0.012798 +v 0.003417 0.220275 0.017896 +v 0.007400 0.220502 0.017525 +v 0.008139 0.213027 0.012538 +v 0.003153 0.227816 0.021372 +v 0.006896 0.228041 0.020964 +v 0.009027 0.208384 0.004299 +v 0.003565 0.208056 0.004521 +v 0.014370 0.208566 0.003924 +v 0.019188 0.208747 0.003379 +v 0.023502 0.212276 -0.046485 +v 0.018433 0.212448 -0.047201 +v 0.011925 0.212533 -0.047981 +v 0.011585 0.216247 -0.055696 +v 0.004820 0.216186 -0.056203 +v 0.004394 0.212498 -0.048546 +v 0.010300 0.219482 -0.059166 +v 0.005030 0.220221 -0.059945 +v 0.004494 0.266211 -0.053241 +v 0.010059 0.266347 -0.052949 +v 0.010486 0.268059 -0.043935 +v 0.004071 0.268152 -0.044201 +v 0.014605 0.266094 -0.052771 +v 0.015885 0.267746 -0.043740 +v 0.015861 0.267328 -0.030237 +v 0.010240 0.267761 -0.030335 +v 0.003622 0.267993 -0.030566 +v 0.004869 0.256429 -0.060686 +v 0.011458 0.262650 -0.057884 +v 0.008928 0.263664 -0.057375 +v 0.004819 0.262660 -0.058207 +v 0.008731 0.246284 0.022402 +v 0.005559 0.246208 0.022578 +v 0.006043 0.248658 0.020332 +v 0.009533 0.248661 0.020110 +v 0.002216 0.246183 0.022645 +v 0.002304 0.248635 0.020438 +v 0.002392 0.251431 0.017435 +v 0.006757 0.251465 0.017220 +v 0.010741 0.251485 0.016846 +v 0.014329 0.260349 0.002522 +v 0.012480 0.255245 0.011473 +v 0.007825 0.255305 0.012085 +v 0.008978 0.260701 0.002826 +v 0.002577 0.255348 0.012457 +v 0.002878 0.260943 0.002936 +v 0.015333 0.264795 -0.013093 +v 0.009727 0.265239 -0.013063 +v 0.003239 0.265521 -0.013179 +v 0.032983 0.242816 0.009321 +v 0.029615 0.241362 0.013486 +v 0.028659 0.244135 0.013985 +v 0.031915 0.246612 0.010182 +v 0.027248 0.240563 0.015746 +v 0.026413 0.242554 0.016073 +v 0.025323 0.244113 0.016627 +v 0.027469 0.246158 0.014713 +v 0.030543 0.249171 0.011374 +v 0.026006 0.247452 0.015575 +v 0.028819 0.250625 0.012598 +v 0.023955 0.245142 0.017387 +v 0.022337 0.245699 0.018292 +v 0.026734 0.251363 0.013636 +v 0.026591 0.239083 -0.060010 +v 0.027701 0.249195 -0.059261 +v 0.005043 0.239529 -0.061442 +v 0.016525 0.262339 -0.057690 +v 0.015093 0.263473 -0.057018 +v 0.020987 0.265538 -0.052737 +v 0.018160 0.266051 -0.052604 +v 0.019810 0.267490 -0.043732 +v 0.022812 0.267060 -0.043949 +v 0.022923 0.266582 -0.030645 +v 0.019905 0.266928 -0.030357 +v 0.022464 0.264011 -0.013572 +v 0.019404 0.264348 -0.013266 +v 0.021264 0.259726 0.001891 +v 0.018272 0.259978 0.002231 +v 0.016984 0.251479 0.016085 +v 0.014108 0.251523 0.016515 +v 0.016159 0.255154 0.010951 +v 0.019131 0.255134 0.010490 +v 0.014119 0.246265 0.021682 +v 0.011588 0.246329 0.022122 +v 0.012618 0.248621 0.019804 +v 0.015329 0.248533 0.019413 +v 0.018500 0.246051 0.020246 +v 0.016383 0.246143 0.021061 +v 0.017775 0.248478 0.018881 +v 0.020063 0.248481 0.018182 +v 0.019572 0.251548 0.015596 +v 0.022030 0.251614 0.015044 +v 0.022227 0.248434 0.017367 +v 0.020495 0.245954 0.019284 +v 0.024432 0.251613 0.014418 +v 0.032505 0.259599 -0.001479 +v 0.029849 0.255232 0.008342 +v 0.027111 0.255357 0.009278 +v 0.029471 0.259924 -0.000072 +v 0.024421 0.255261 0.009768 +v 0.026630 0.259773 0.000841 +v 0.021812 0.255161 0.010145 +v 0.023956 0.259665 0.001462 +v 0.034239 0.264321 -0.032397 +v 0.033879 0.262692 -0.016420 +v 0.030835 0.263482 -0.015356 +v 0.031084 0.265385 -0.031888 +v 0.027972 0.263703 -0.014578 +v 0.028266 0.265869 -0.031437 +v 0.025232 0.263824 -0.013999 +v 0.025619 0.266230 -0.031018 +v 0.028281 0.265954 -0.044322 +v 0.030908 0.265434 -0.044710 +v 0.027367 0.265230 -0.050928 +v 0.028375 0.264353 -0.052731 +v 0.031121 0.262666 -0.053260 +v 0.034153 0.264324 -0.044920 +v 0.025614 0.266461 -0.044211 +v 0.024462 0.265198 -0.052474 +v 0.022642 0.262960 -0.056613 +v 0.023586 0.259716 -0.057909 +v 0.040570 0.257593 -0.051561 +v 0.042071 0.258389 -0.045418 +v 0.038220 0.262095 -0.045050 +v 0.036256 0.260128 -0.052871 +v 0.041119 0.258383 -0.034046 +v 0.037753 0.262166 -0.033054 +v 0.044724 0.252664 -0.046539 +v 0.043758 0.252512 -0.035379 +v 0.040894 0.253229 -0.053847 +v 0.032142 0.255985 -0.057208 +v 0.039860 0.257303 -0.019568 +v 0.037029 0.260807 -0.017851 +v 0.038187 0.255330 -0.005601 +v 0.035567 0.258213 -0.003405 +v 0.034549 0.252533 0.004905 +v 0.032418 0.254457 0.006824 +v 0.037217 0.243900 0.001746 +v 0.036146 0.249026 0.003067 +v 0.039989 0.250684 -0.007701 +v 0.028213 0.233793 0.015820 +v 0.030897 0.230262 0.013477 +v 0.028198 0.235995 0.015690 +v 0.030861 0.234079 0.013374 +v 0.030369 0.237930 0.013307 +v 0.033779 0.237809 0.009014 +v 0.027844 0.238307 0.015646 +v 0.037789 0.237403 0.001271 +v 0.041954 0.251841 -0.021410 +v 0.002622 0.237192 0.025563 +v 0.006030 0.237313 0.025310 +v 0.006447 0.233336 0.023319 +v 0.002870 0.233209 0.023543 +v 0.009534 0.237250 0.024989 +v 0.010095 0.233471 0.022803 +v 0.013545 0.233571 0.021895 +v 0.012841 0.237112 0.024328 +v 0.015908 0.237056 0.023245 +v 0.016798 0.233582 0.020734 +v 0.019859 0.233637 0.019669 +v 0.018690 0.237116 0.021963 +v 0.021067 0.237272 0.020778 +v 0.022510 0.233908 0.018822 +v 0.022907 0.237553 0.019798 +v 0.024513 0.234473 0.018186 +v 0.024171 0.237973 0.019088 +v 0.025763 0.235342 0.017654 +v 0.024758 0.238503 0.018553 +v 0.026261 0.236411 0.017248 +v 0.024881 0.239208 0.018356 +v 0.026288 0.237678 0.017082 +v 0.024748 0.240102 0.018453 +v 0.026068 0.239111 0.017134 +v 0.024366 0.240975 0.018777 +v 0.025591 0.240595 0.017348 +v 0.023626 0.241744 0.019325 +v 0.024793 0.241937 0.017713 +v 0.022603 0.242306 0.020035 +v 0.023737 0.242958 0.018282 +v 0.021363 0.242668 0.020998 +v 0.022424 0.243591 0.019073 +v 0.019895 0.242902 0.022212 +v 0.020910 0.243949 0.020128 +v 0.019140 0.244175 0.021270 +v 0.018161 0.243043 0.023451 +v 0.016398 0.243101 0.024626 +v 0.017248 0.244263 0.022357 +v 0.014622 0.243078 0.025583 +v 0.015310 0.244272 0.023280 +v 0.012715 0.243055 0.026303 +v 0.013242 0.244294 0.023976 +v 0.010502 0.243095 0.026866 +v 0.010902 0.244217 0.024424 +v 0.007840 0.243025 0.027333 +v 0.008206 0.244089 0.024706 +v 0.005204 0.243994 0.024953 +v 0.004853 0.242928 0.027741 +v 0.001797 0.242887 0.027950 +v 0.002057 0.243976 0.025102 +v -0.029398 0.326371 0.001005 +v -0.034849 0.326737 0.000525 +v -0.034440 0.326490 -0.002211 +v -0.029086 0.326256 -0.002010 +v -0.039530 0.325449 -0.000388 +v -0.039117 0.325208 -0.002781 +v -0.038569 0.324681 -0.005446 +v -0.034003 0.325835 -0.005146 +v -0.028876 0.325478 -0.005200 +v -0.019557 0.319925 -0.006188 +v -0.019448 0.320454 -0.002634 +v -0.023816 0.324057 -0.002257 +v -0.023824 0.323385 -0.005634 +v -0.019896 0.320477 0.000690 +v -0.024123 0.324078 0.000934 +v -0.015264 0.310719 -0.006877 +v -0.015174 0.311126 -0.002801 +v -0.016573 0.315955 -0.002812 +v -0.016660 0.315526 -0.006611 +v -0.016009 0.311665 0.001847 +v -0.017224 0.316224 0.000762 +v -0.016831 0.301677 -0.006895 +v -0.016525 0.302405 -0.002670 +v -0.015165 0.306542 -0.002833 +v -0.015340 0.305996 -0.006992 +v -0.017019 0.304088 0.001604 +v -0.015778 0.307470 0.001060 +v -0.023210 0.298236 0.001367 +v -0.019648 0.300601 0.001273 +v -0.019249 0.298879 -0.002395 +v -0.023017 0.296254 -0.002143 +v -0.019566 0.298043 -0.006597 +v -0.023264 0.295353 -0.006358 +v -0.031669 0.296307 0.000535 +v -0.027396 0.296764 0.001193 +v -0.027425 0.294803 -0.002297 +v -0.031729 0.294461 -0.002880 +v -0.027521 0.293780 -0.006420 +v -0.031694 0.293330 -0.006799 +v -0.035220 0.293854 -0.007456 +v -0.035463 0.294982 -0.003687 +v -0.038020 0.295008 -0.008196 +v -0.038463 0.296123 -0.004582 +v -0.038617 0.297815 -0.001434 +v -0.035496 0.296742 -0.000403 +v -0.040158 0.296519 -0.008838 +v -0.040736 0.297627 -0.005405 +v -0.041802 0.298320 -0.009298 +v -0.042418 0.299379 -0.006099 +v -0.042748 0.300920 -0.003289 +v -0.040997 0.299266 -0.002408 +v -0.044144 0.302638 -0.009489 +v -0.044724 0.303494 -0.006826 +v -0.043709 0.301348 -0.006583 +v -0.043109 0.300388 -0.009509 +v -0.045059 0.304680 -0.004583 +v -0.044053 0.302736 -0.004042 +v -0.045317 0.320616 -0.002628 +v -0.046535 0.317834 -0.003463 +v -0.046044 0.317058 -0.005255 +v -0.044903 0.319976 -0.004510 +v -0.047035 0.315040 -0.004095 +v -0.046442 0.314164 -0.005854 +v -0.045949 0.313491 -0.007921 +v -0.045536 0.316434 -0.007346 +v -0.044351 0.319387 -0.006719 +v -0.047018 0.312264 -0.004529 +v -0.046432 0.311266 -0.006321 +v -0.046651 0.309515 -0.004539 +v -0.046120 0.308439 -0.006639 +v -0.045548 0.307668 -0.008924 +v -0.045903 0.310534 -0.008461 +v -0.045528 0.305825 -0.006831 +v -0.044949 0.305038 -0.009279 +v -0.045877 0.306802 -0.004807 +v -0.042664 0.322871 -0.003618 +v -0.043053 0.323282 -0.001527 +v -0.042094 0.322334 -0.006033 +v -0.022228 0.317323 -0.012196 +v -0.019870 0.313885 -0.012756 +v -0.017770 0.314811 -0.009983 +v -0.020461 0.318808 -0.009450 +v -0.018690 0.310058 -0.013114 +v -0.016458 0.310389 -0.010339 +v -0.029389 0.313888 -0.016010 +v -0.026192 0.311632 -0.016345 +v -0.022867 0.312819 -0.014895 +v -0.024959 0.315696 -0.014362 +v -0.025234 0.309224 -0.016620 +v -0.021784 0.309660 -0.015231 +v -0.022209 0.306340 -0.015416 +v -0.018968 0.306127 -0.013277 +v -0.025772 0.306631 -0.016829 +v -0.028378 0.303707 -0.017120 +v -0.023481 0.303213 -0.015387 +v -0.020293 0.302482 -0.013187 +v -0.016639 0.305939 -0.010500 +v -0.018097 0.301836 -0.010420 +v -0.022191 0.299467 -0.012837 +v -0.020562 0.298419 -0.010109 +v -0.024682 0.297234 -0.012498 +v -0.023821 0.295878 -0.009844 +v -0.027026 0.301321 -0.016333 +v -0.024490 0.300674 -0.014989 +v -0.026985 0.299961 -0.015762 +v -0.025870 0.298846 -0.014575 +v -0.031818 0.300179 -0.016465 +v -0.030717 0.299416 -0.016097 +v -0.029033 0.300744 -0.016629 +v -0.030057 0.301676 -0.017046 +v -0.029824 0.298767 -0.015629 +v -0.028405 0.299447 -0.015847 +v -0.028026 0.297744 -0.014433 +v -0.030337 0.297275 -0.014486 +v -0.030911 0.295362 -0.012559 +v -0.027785 0.295861 -0.012393 +v -0.027632 0.294356 -0.009837 +v -0.031376 0.293855 -0.010113 +v -0.033481 0.295691 -0.012974 +v -0.034501 0.294275 -0.010634 +v -0.035529 0.296584 -0.013500 +v -0.036977 0.295311 -0.011240 +v -0.032200 0.297582 -0.014817 +v -0.033740 0.298368 -0.015246 +v -0.032944 0.300957 -0.016737 +v -0.035133 0.299388 -0.015639 +v -0.033870 0.301886 -0.016939 +v -0.036378 0.300610 -0.015923 +v -0.038707 0.299275 -0.014312 +v -0.037237 0.297794 -0.013981 +v -0.038942 0.296693 -0.011768 +v -0.040544 0.298379 -0.012118 +v -0.029053 0.322015 -0.010837 +v -0.025349 0.320154 -0.011473 +v -0.024299 0.321988 -0.008775 +v -0.028841 0.323966 -0.008208 +v -0.036872 0.321834 -0.010530 +v -0.033098 0.322577 -0.010509 +v -0.033546 0.324453 -0.007974 +v -0.037833 0.323507 -0.008096 +v -0.041702 0.317500 -0.011381 +v -0.039781 0.319941 -0.010870 +v -0.041155 0.321304 -0.008514 +v -0.043327 0.318523 -0.009065 +v -0.042928 0.302499 -0.012077 +v -0.043708 0.304791 -0.011786 +v -0.040906 0.302940 -0.014322 +v -0.041503 0.305035 -0.014083 +v -0.042013 0.307318 -0.013695 +v -0.044289 0.307297 -0.011352 +v -0.038093 0.303651 -0.016020 +v -0.038297 0.305532 -0.015886 +v -0.034998 0.304181 -0.017066 +v -0.034770 0.305778 -0.017038 +v -0.033241 0.308265 -0.017012 +v -0.038497 0.307679 -0.015569 +v -0.032101 0.304224 -0.017474 +v -0.032322 0.305377 -0.017457 +v -0.030461 0.306127 -0.017438 +v -0.037435 0.302020 -0.016041 +v -0.039965 0.301008 -0.014415 +v -0.034695 0.302919 -0.017046 +v -0.041875 0.300344 -0.012207 +v -0.032541 0.303318 -0.017414 +v -0.031513 0.302763 -0.017361 +v -0.028358 0.307119 -0.017335 +v -0.028628 0.308797 -0.017220 +v -0.030956 0.311009 -0.016902 +v -0.028604 0.310514 -0.016984 +v -0.036721 0.312294 -0.015779 +v -0.035731 0.310499 -0.016304 +v -0.033222 0.311460 -0.016681 +v -0.033493 0.312793 -0.016355 +v -0.039316 0.309946 -0.015028 +v -0.040044 0.312174 -0.014467 +v -0.042970 0.312401 -0.012532 +v -0.042597 0.309807 -0.013147 +v -0.044729 0.310034 -0.010804 +v -0.044877 0.312878 -0.010202 +v -0.040118 0.314361 -0.013918 +v -0.042733 0.314979 -0.011936 +v -0.037027 0.313982 -0.015319 +v -0.036472 0.315672 -0.014841 +v -0.039374 0.316496 -0.013376 +v -0.044496 0.315709 -0.009622 +v -0.035572 0.317416 -0.014268 +v -0.037936 0.318543 -0.012857 +v -0.034695 0.318753 -0.013701 +v -0.035736 0.320077 -0.012505 +v -0.034445 0.313857 -0.015962 +v -0.033265 0.315030 -0.015661 +v -0.032552 0.318670 -0.013969 +v -0.032730 0.320570 -0.012533 +v -0.030427 0.318556 -0.014022 +v -0.029628 0.320005 -0.012871 +v -0.032649 0.316821 -0.014957 +v -0.029620 0.316931 -0.014822 +v -0.027104 0.318264 -0.013577 +v -0.031292 0.301941 -0.017190 +v -0.018251 0.310083 0.011562 +v -0.018336 0.310111 0.011568 +v -0.018818 0.309599 0.011541 +v -0.019043 0.309515 0.011532 +v -0.018380 0.310047 0.011554 +v -0.018588 0.309636 0.011368 +v -0.019069 0.309394 0.010844 +v -0.019512 0.309158 0.010926 +v -0.020786 0.308680 0.011282 +v -0.018204 0.310470 0.011922 +v -0.017988 0.310348 0.011643 +v -0.017809 0.310125 0.011938 +v -0.018053 0.310202 0.012139 +v -0.018156 0.309919 0.011806 +v -0.017940 0.309674 0.012129 +v -0.017618 0.309844 0.012443 +v -0.017785 0.309816 0.012589 +v -0.040214 0.303551 0.009784 +v -0.040535 0.304541 0.011392 +v -0.037585 0.304380 0.012628 +v -0.037122 0.303026 0.010912 +v -0.040418 0.305358 0.012226 +v -0.037393 0.305512 0.013387 +v -0.033851 0.305634 0.014327 +v -0.034057 0.304199 0.013667 +v -0.033470 0.302699 0.012056 +v -0.026656 0.307032 0.014283 +v -0.026669 0.305978 0.013622 +v -0.030241 0.304761 0.013967 +v -0.030160 0.306034 0.014675 +v -0.026244 0.305117 0.012481 +v -0.029655 0.303559 0.012598 +v -0.021064 0.308901 0.012432 +v -0.021073 0.308764 0.012021 +v -0.023629 0.307567 0.012741 +v -0.023619 0.308134 0.013307 +v -0.023421 0.307045 0.011855 +v -0.028767 0.303018 0.010509 +v -0.032415 0.302180 0.009616 +v -0.025601 0.304583 0.010796 +v -0.025149 0.304190 0.008924 +v -0.028104 0.302532 0.008469 +v -0.031624 0.301532 0.007398 +v -0.038347 0.302168 0.004872 +v -0.039202 0.302905 0.007255 +v -0.036018 0.302335 0.008377 +v -0.035235 0.301513 0.006053 +v -0.043467 0.305672 0.009519 +v -0.044361 0.306010 0.008413 +v -0.044549 0.308653 0.007164 +v -0.043545 0.308876 0.008096 +v -0.044924 0.306496 0.007405 +v -0.044985 0.308402 0.006078 +v -0.045289 0.311025 0.004478 +v -0.044967 0.312101 0.005546 +v -0.043934 0.313101 0.006471 +v -0.045378 0.310170 0.003629 +v -0.045705 0.312230 0.002088 +v -0.045646 0.313739 0.002855 +v -0.045402 0.309531 0.003287 +v -0.045689 0.311049 0.001682 +v -0.045886 0.312267 0.000043 +v -0.045981 0.313827 0.000550 +v -0.045935 0.315656 0.001278 +v -0.045514 0.309943 0.001710 +v -0.045684 0.311006 -0.000114 +v -0.045298 0.308702 0.003423 +v -0.045267 0.307727 0.003921 +v -0.045354 0.308713 0.002062 +v -0.045316 0.309732 0.000034 +v -0.044987 0.307445 0.002769 +v -0.044861 0.308288 0.000554 +v -0.045128 0.306782 0.004778 +v -0.044817 0.305921 0.005850 +v -0.044551 0.306116 0.003709 +v -0.044254 0.306714 0.001286 +v -0.043634 0.304330 0.007942 +v -0.043935 0.304892 0.009353 +v -0.042657 0.304609 0.010326 +v -0.042319 0.303874 0.008816 +v -0.043846 0.305293 0.010009 +v -0.042546 0.305147 0.011069 +v -0.043912 0.304998 0.004763 +v -0.043466 0.305231 0.002213 +v -0.044430 0.304990 0.006955 +v -0.042920 0.304115 0.005651 +v -0.042287 0.304035 0.003071 +v -0.041417 0.303546 0.006400 +v -0.040655 0.303067 0.003927 +v -0.044953 0.305797 0.007283 +v -0.044643 0.305277 0.008362 +v -0.044841 0.305665 0.008127 +v -0.044530 0.305449 0.009072 +v -0.045155 0.307069 0.005461 +v -0.045156 0.306482 0.006289 +v -0.044998 0.306421 0.006529 +v -0.044926 0.306032 0.007249 +v -0.045155 0.308162 0.004676 +v -0.045139 0.307750 0.004952 +v -0.045254 0.306960 0.005785 +v -0.045122 0.306819 0.006039 +v -0.045184 0.306856 0.006458 +v -0.045187 0.308266 0.005118 +v -0.019577 0.311019 0.011471 +v -0.018764 0.310643 0.011811 +v -0.018661 0.310160 0.012077 +v -0.019634 0.310177 0.011917 +v -0.018584 0.309757 0.012516 +v -0.019550 0.309428 0.012579 +v -0.018250 0.310421 0.011609 +v -0.018294 0.310338 0.011663 +v -0.018367 0.310557 0.011804 +v -0.018380 0.310676 0.011702 +v -0.018822 0.310706 0.011200 +v -0.018758 0.310328 0.011224 +v -0.018391 0.310332 0.011465 +v -0.018462 0.310736 0.011489 +v -0.018777 0.310087 0.011300 +v -0.018475 0.310044 0.011377 +v -0.019309 0.312307 0.011156 +v -0.018794 0.311221 0.011691 +v -0.018839 0.310992 0.011714 +v -0.019452 0.311776 0.011191 +v -0.019005 0.311782 0.011217 +v -0.018682 0.311243 0.011421 +v -0.019108 0.311589 0.011168 +v -0.018949 0.311168 0.011158 +v -0.018775 0.309884 0.011169 +v -0.019051 0.310078 0.011189 +v -0.019496 0.310021 0.011055 +v -0.019218 0.309751 0.010887 +v -0.019750 0.309600 0.010520 +v -0.019607 0.309293 0.010133 +v -0.020046 0.309935 0.010804 +v -0.020182 0.310103 0.010389 +v -0.020030 0.309795 0.009941 +v -0.019576 0.309300 0.008990 +v -0.019247 0.310340 0.011201 +v -0.019756 0.310413 0.011127 +v -0.019365 0.310760 0.011201 +v -0.019856 0.310928 0.011104 +v -0.019414 0.311264 0.011110 +v -0.019363 0.311741 0.010990 +v -0.019688 0.312003 0.010768 +v -0.019799 0.311488 0.010998 +v -0.028956 0.313165 0.010668 +v -0.024888 0.312879 0.011207 +v -0.025243 0.309538 0.012841 +v -0.029705 0.309282 0.012580 +v -0.022148 0.312250 0.011196 +v -0.022433 0.309701 0.012192 +v -0.022804 0.308298 0.013491 +v -0.025678 0.307077 0.014228 +v -0.030369 0.306280 0.014255 +v -0.038299 0.313093 0.008679 +v -0.033578 0.313145 0.009804 +v -0.034675 0.308895 0.011569 +v -0.039041 0.308649 0.010267 +v -0.035558 0.305817 0.013194 +v -0.039527 0.305501 0.011791 +v -0.041936 0.305461 0.010664 +v -0.041764 0.308851 0.009125 +v -0.041745 0.313377 0.007433 +v -0.045240 0.315511 0.003728 +v -0.044027 0.316982 0.004533 +v -0.045514 0.317673 0.002163 +v -0.044214 0.319419 0.003007 +v -0.041349 0.317466 0.005502 +v -0.037468 0.317194 0.006720 +v -0.041496 0.320349 0.004151 +v -0.037566 0.320575 0.005505 +v -0.028713 0.319959 0.007507 +v -0.028601 0.316835 0.008829 +v -0.032943 0.317083 0.007903 +v -0.033069 0.320482 0.006674 +v -0.021297 0.316219 0.008728 +v -0.021877 0.314697 0.010107 +v -0.024642 0.316029 0.009671 +v -0.024712 0.318528 0.008035 +v -0.020056 0.313917 0.010158 +v -0.020374 0.313077 0.010557 +v -0.020639 0.311542 0.011143 +v -0.020837 0.309975 0.011826 +v -0.020893 0.308951 0.012749 +v -0.046985 0.316533 -0.001036 +v -0.046483 0.316459 0.000114 +v -0.046535 0.314400 -0.000630 +v -0.046985 0.314297 -0.001739 +v -0.046317 0.312718 -0.001171 +v -0.046712 0.312470 -0.002185 +v -0.044577 0.306719 -0.001698 +v -0.044286 0.307002 -0.000515 +v -0.043322 0.305353 0.000287 +v -0.043622 0.305014 -0.000902 +v -0.042061 0.303880 0.001169 +v -0.042381 0.303402 0.000048 +v -0.040421 0.302593 0.002168 +v -0.040735 0.301968 0.001141 +v -0.038115 0.301527 0.003259 +v -0.038420 0.300751 0.002300 +v -0.035012 0.300790 0.004532 +v -0.035258 0.299912 0.003556 +v -0.031352 0.300794 0.005827 +v -0.031453 0.299820 0.004697 +v -0.027783 0.301881 0.006769 +v -0.024774 0.303585 0.007232 +v -0.024337 0.302442 0.005644 +v -0.027628 0.300774 0.005403 +v -0.045992 0.311385 -0.001434 +v -0.046412 0.311120 -0.002406 +v -0.045567 0.310115 -0.001421 +v -0.045940 0.309852 -0.002448 +v -0.045026 0.308640 -0.001106 +v -0.045367 0.308363 -0.002216 +v -0.019444 0.310162 0.008665 +v -0.018642 0.309844 0.007200 +v -0.018746 0.308807 0.007171 +v -0.019479 0.311069 0.008548 +v -0.018706 0.310974 0.007230 +v -0.017743 0.310814 0.005644 +v -0.017689 0.309345 0.005520 +v -0.017813 0.308042 0.005504 +v -0.024970 0.320743 0.006999 +v -0.021871 0.318382 0.007046 +v -0.029247 0.322446 0.006742 +v -0.029738 0.324391 0.005795 +v -0.024983 0.322380 0.005931 +v -0.021517 0.319425 0.005628 +v -0.033907 0.323207 0.005983 +v -0.038467 0.323081 0.004775 +v -0.039340 0.324641 0.003640 +v -0.034769 0.325175 0.005001 +v -0.042277 0.322256 0.003309 +v -0.042976 0.323285 0.002164 +v -0.044835 0.320772 0.001984 +v -0.045373 0.321303 0.000802 +v -0.046086 0.318736 0.000996 +v -0.046569 0.318967 -0.000183 +v -0.047449 0.315939 -0.002269 +v -0.047331 0.313443 -0.002846 +v -0.046908 0.311468 -0.003075 +v -0.044999 0.305876 -0.002807 +v -0.044026 0.304099 -0.002099 +v -0.042747 0.302402 -0.001205 +v -0.041020 0.300863 -0.000172 +v -0.038652 0.299521 0.000926 +v -0.035470 0.298551 0.002092 +v -0.031600 0.298263 0.003127 +v -0.027494 0.298950 0.003748 +v -0.023762 0.300518 0.003842 +v -0.046314 0.310353 -0.002950 +v -0.046367 0.309370 -0.003228 +v -0.045815 0.307656 -0.003193 +v -0.016679 0.308485 0.003704 +v -0.016990 0.306696 0.003897 +v -0.016707 0.310595 0.004019 +v -0.024596 0.323501 0.003916 +v -0.020671 0.320096 0.003611 +v -0.029725 0.325796 0.003948 +v -0.035095 0.326426 0.003230 +v -0.039755 0.325433 0.001981 +v -0.043336 0.323597 0.000590 +v -0.045714 0.321238 -0.000681 +v -0.046951 0.318595 -0.001550 +v -0.019522 0.311838 0.008454 +v -0.018808 0.311888 0.007235 +v -0.019512 0.312425 0.008368 +v -0.018865 0.312540 0.007215 +v -0.017957 0.312478 0.005789 +v -0.017898 0.311858 0.005766 +v -0.017138 0.311556 0.004527 +v -0.016941 0.312143 0.004315 +v -0.019327 0.312856 0.010463 +v -0.019262 0.312145 0.010837 +v -0.019689 0.313152 0.009934 +v -0.019542 0.312412 0.010355 +v -0.019722 0.313801 0.009973 +v -0.019961 0.314347 0.009395 +v -0.019770 0.313678 0.008570 +v -0.019837 0.313421 0.009364 +v -0.020062 0.314296 0.008939 +v -0.020256 0.315211 0.008328 +v -0.018431 0.314372 0.005708 +v -0.018085 0.313142 0.005830 +v -0.018954 0.313189 0.007216 +v -0.019278 0.314317 0.007197 +v -0.019558 0.312954 0.008351 +v -0.019429 0.316585 0.005581 +v -0.020105 0.316157 0.007102 +v -0.017280 0.313751 0.004010 +v -0.017397 0.312662 0.004553 +v -0.018297 0.316536 0.003604 +v -0.020242 0.310543 0.010856 +v -0.020319 0.310624 0.010251 +v -0.020345 0.311188 0.010800 +v -0.020382 0.311272 0.010122 +v -0.020160 0.311740 0.010560 +v -0.020007 0.312248 0.010271 +v -0.020082 0.312294 0.009693 +v -0.020273 0.311844 0.009949 +v -0.019860 0.312687 0.009844 +v -0.019921 0.312753 0.009299 +v -0.020108 0.311195 0.009437 +v -0.020006 0.311852 0.009342 +v -0.019933 0.312339 0.009153 +v -0.020063 0.310457 0.009612 +v -0.019847 0.312676 0.009004 +v -0.019145 0.309451 0.011761 +v -0.019083 0.309431 0.012081 +v -0.021188 0.308060 0.010165 +v -0.023162 0.306614 0.010511 +v -0.020977 0.307434 0.008826 +v -0.022774 0.306011 0.008979 +v -0.019999 0.308819 0.010002 +v -0.019884 0.308384 0.008769 +v -0.019515 0.305909 0.005592 +v -0.020424 0.306809 0.007215 +v -0.019262 0.307884 0.007148 +v -0.018338 0.307103 0.005561 +v -0.022290 0.305330 0.007332 +v -0.021592 0.304250 0.005671 +v -0.017660 0.306132 0.004334 +v -0.018346 0.304717 0.004007 +v -0.020616 0.302556 0.003838 +v -0.010906 0.209392 -0.036883 +v -0.010170 0.205725 -0.022043 +v -0.003760 0.205975 -0.021931 +v -0.003872 0.209139 -0.036894 +v -0.008396 0.204446 -0.007246 +v -0.002876 0.205000 -0.007288 +v -0.021123 0.210032 -0.036735 +v -0.019948 0.206125 -0.022680 +v -0.015373 0.205957 -0.022242 +v -0.016507 0.209937 -0.036766 +v -0.017551 0.204768 -0.007918 +v -0.013098 0.204466 -0.007424 +v -0.029732 0.208460 -0.037296 +v -0.029249 0.205758 -0.024256 +v -0.024624 0.205858 -0.023365 +v -0.025490 0.209288 -0.036910 +v -0.027092 0.205932 -0.009751 +v -0.022311 0.205133 -0.008692 +v -0.037091 0.210726 -0.038745 +v -0.037086 0.209742 -0.026299 +v -0.033539 0.206711 -0.025227 +v -0.033712 0.208559 -0.037898 +v -0.034809 0.211228 -0.012183 +v -0.031391 0.207674 -0.010943 +v -0.039464 0.215589 -0.039854 +v -0.039352 0.215419 -0.027520 +v -0.040883 0.222930 -0.041137 +v -0.040592 0.223463 -0.028550 +v -0.038548 0.225251 -0.013959 +v -0.037132 0.217199 -0.013300 +v -0.042798 0.242101 -0.042434 +v -0.041899 0.242925 -0.028215 +v -0.041375 0.233149 -0.028933 +v -0.041899 0.232258 -0.042289 +v -0.039092 0.243420 -0.013310 +v -0.039106 0.234507 -0.013982 +v -0.035425 0.213628 -0.048110 +v -0.037467 0.217431 -0.049108 +v -0.032927 0.216448 -0.053261 +v -0.032766 0.219670 -0.055248 +v -0.032389 0.225204 -0.056665 +v -0.038807 0.223714 -0.050386 +v -0.032850 0.233324 -0.057880 +v -0.039945 0.232215 -0.051756 +v -0.034329 0.242392 -0.058547 +v -0.041103 0.241519 -0.052509 +v -0.035429 0.227941 -0.002039 +v -0.034315 0.220650 -0.001388 +v -0.031889 0.230623 0.005724 +v -0.031148 0.224841 0.006201 +v -0.029448 0.220063 0.007021 +v -0.032172 0.214988 -0.000384 +v -0.028882 0.211271 0.000847 +v -0.026487 0.216700 0.008099 +v -0.022497 0.214553 0.009348 +v -0.024659 0.209051 0.002114 +v -0.032193 0.212332 -0.047707 +v -0.028990 0.216518 -0.054450 +v -0.028273 0.212248 -0.047382 +v -0.024131 0.216223 -0.054750 +v -0.020636 0.213200 -0.046959 +v -0.024444 0.212751 -0.047084 +v -0.019312 0.214967 -0.052542 +v -0.020993 0.215647 -0.054106 +v -0.013900 0.217983 -0.058105 +v -0.015357 0.220183 -0.059211 +v -0.015086 0.215462 -0.054458 +v -0.008773 0.215544 -0.055581 +v -0.004983 0.219414 -0.059478 +v -0.024030 0.220637 -0.058277 +v -0.018682 0.226711 -0.060192 +v -0.019875 0.207783 0.003260 +v -0.017860 0.213293 0.010681 +v -0.013173 0.212654 0.011808 +v -0.015125 0.207115 0.004108 +v -0.019879 0.221600 0.013398 +v -0.015849 0.220855 0.014775 +v -0.017341 0.227794 0.016425 +v -0.014094 0.227586 0.017774 +v -0.010642 0.227729 0.019137 +v -0.011677 0.220562 0.016074 +v -0.025748 0.225492 0.011330 +v -0.023284 0.223089 0.012238 +v -0.022202 0.229972 0.014364 +v -0.020137 0.228506 0.015267 +v -0.007798 0.220436 0.017013 +v -0.008899 0.212388 0.012502 +v -0.007234 0.227950 0.020206 +v -0.003865 0.228016 0.020925 +v -0.004115 0.220354 0.017610 +v -0.004862 0.212361 0.012810 +v -0.000430 0.227883 0.021332 +v -0.000410 0.220263 0.017921 +v -0.000739 0.212527 0.012885 +v -0.006400 0.206935 0.004717 +v -0.001640 0.207442 0.004662 +v -0.010752 0.206843 0.004560 +v -0.016198 0.213062 -0.047552 +v -0.010501 0.212537 -0.048218 +v -0.002154 0.215619 -0.056087 +v -0.003386 0.212320 -0.048606 +v -0.000436 0.218856 -0.059448 +v -0.008980 0.267471 -0.031017 +v -0.008208 0.267397 -0.044482 +v -0.002479 0.267863 -0.044402 +v -0.003079 0.267833 -0.030824 +v -0.005963 0.265467 -0.053362 +v -0.001179 0.266005 -0.053325 +v -0.002017 0.262119 -0.058229 +v 0.000554 0.263338 -0.057632 +v -0.001452 0.248574 0.020394 +v -0.001951 0.251327 0.017398 +v -0.001130 0.246194 0.022639 +v -0.004327 0.246177 0.022450 +v -0.005016 0.248427 0.020183 +v -0.005960 0.251156 0.017115 +v -0.002554 0.255313 0.012386 +v -0.007090 0.255210 0.011916 +v -0.008205 0.260876 0.002311 +v -0.003050 0.261004 0.002738 +v -0.003210 0.265522 -0.013441 +v -0.008851 0.265322 -0.013737 +v -0.022692 0.242661 0.015028 +v -0.023656 0.241225 0.014371 +v -0.026912 0.243025 0.011647 +v -0.025809 0.244854 0.012601 +v -0.024136 0.239301 0.013895 +v -0.027546 0.240306 0.010898 +v -0.031680 0.242146 0.006072 +v -0.030969 0.246092 0.007181 +v -0.029734 0.248484 0.008689 +v -0.019379 0.244306 0.016913 +v -0.021253 0.243653 0.015876 +v -0.024136 0.245968 0.013660 +v -0.021953 0.246625 0.014783 +v -0.027772 0.249613 0.010263 +v -0.025127 0.250084 0.011764 +v -0.019711 0.246640 -0.060945 +v -0.017344 0.236342 -0.061045 +v -0.013377 0.264560 -0.053185 +v -0.007917 0.261450 -0.057999 +v -0.006097 0.262688 -0.057423 +v -0.009916 0.265213 -0.053185 +v -0.017192 0.266873 -0.031209 +v -0.016274 0.266567 -0.044459 +v -0.012595 0.267046 -0.044430 +v -0.013485 0.267149 -0.031102 +v -0.012301 0.260669 0.001846 +v -0.013225 0.265070 -0.013981 +v -0.015796 0.260537 0.001302 +v -0.016849 0.264894 -0.014262 +v -0.010879 0.255142 0.011216 +v -0.009498 0.250993 0.016631 +v -0.012709 0.250873 0.015907 +v -0.014242 0.255124 0.010389 +v -0.008261 0.248185 0.019793 +v -0.007273 0.246023 0.022064 +v -0.009972 0.245770 0.021476 +v -0.011225 0.247894 0.019165 +v -0.014022 0.247619 0.018235 +v -0.015798 0.250756 0.014963 +v -0.012484 0.245403 0.020612 +v -0.014861 0.245029 0.019501 +v -0.016745 0.247342 0.017126 +v -0.018894 0.250594 0.013950 +v -0.022055 0.250384 0.012937 +v -0.019429 0.247046 0.015952 +v -0.017197 0.244692 0.018185 +v -0.024747 0.255072 0.007824 +v -0.021069 0.255023 0.008887 +v -0.028327 0.255092 0.005940 +v -0.030638 0.260464 -0.004077 +v -0.026764 0.260824 -0.001948 +v -0.022920 0.260659 -0.000387 +v -0.017587 0.255061 0.009688 +v -0.019276 0.260526 0.000637 +v -0.028120 0.264620 -0.016565 +v -0.024137 0.264804 -0.015428 +v -0.032284 0.263768 -0.018253 +v -0.032923 0.264634 -0.033557 +v -0.028604 0.265801 -0.032496 +v -0.024604 0.266284 -0.031874 +v -0.020410 0.264832 -0.014702 +v -0.020834 0.266596 -0.031460 +v -0.026441 0.261084 -0.054268 +v -0.023211 0.263034 -0.053182 +v -0.027349 0.264782 -0.045173 +v -0.031435 0.263491 -0.045984 +v -0.021938 0.264114 -0.051278 +v -0.023786 0.265407 -0.044665 +v -0.020049 0.265945 -0.044593 +v -0.017973 0.264062 -0.052832 +v -0.015615 0.261683 -0.056961 +v -0.016538 0.258234 -0.058636 +v -0.037425 0.262195 -0.035330 +v -0.036169 0.260950 -0.047450 +v -0.041170 0.257774 -0.037866 +v -0.040098 0.256663 -0.049450 +v -0.037109 0.255227 -0.055333 +v -0.032295 0.258104 -0.055332 +v -0.036203 0.250251 -0.057724 +v -0.041572 0.250052 -0.051651 +v -0.042934 0.250913 -0.040695 +v -0.026239 0.253570 -0.059369 +v -0.034203 0.258959 -0.006723 +v -0.036405 0.261633 -0.020584 +v -0.036954 0.255785 -0.009407 +v -0.039790 0.257578 -0.023329 +v -0.031386 0.254435 0.003642 +v -0.033621 0.252513 0.001381 +v -0.034936 0.248839 -0.000507 +v -0.035592 0.243237 -0.001788 +v -0.038491 0.250607 -0.011704 +v -0.027687 0.232725 0.010432 +v -0.027117 0.228811 0.010721 +v -0.023977 0.234488 0.013533 +v -0.023386 0.232045 0.013781 +v -0.024227 0.236987 0.013593 +v -0.027800 0.236735 0.010483 +v -0.032005 0.236713 0.005624 +v -0.035797 0.235899 -0.002230 +v -0.041607 0.251258 -0.026122 +v -0.003689 0.233186 0.023195 +v -0.000474 0.233219 0.023508 +v -0.003587 0.236848 0.025390 +v -0.000544 0.237073 0.025622 +v -0.009627 0.235840 0.023999 +v -0.006620 0.236413 0.024859 +v -0.006861 0.232951 0.022593 +v -0.010013 0.232510 0.021630 +v -0.014988 0.235176 0.021416 +v -0.012506 0.235339 0.022771 +v -0.013050 0.232111 0.020278 +v -0.015775 0.232057 0.018924 +v -0.019620 0.233392 0.017005 +v -0.018011 0.232463 0.017840 +v -0.018191 0.235970 0.019348 +v -0.016897 0.235407 0.020265 +v -0.021090 0.236152 0.016163 +v -0.020556 0.234672 0.016427 +v -0.019369 0.237636 0.018364 +v -0.018911 0.236743 0.018676 +v -0.021478 0.239258 0.016399 +v -0.021427 0.237743 0.016181 +v -0.019792 0.239602 0.018480 +v -0.019675 0.238644 0.018303 +v -0.020419 0.241566 0.017272 +v -0.021163 0.240556 0.016740 +v -0.018964 0.241072 0.019439 +v -0.019615 0.240425 0.018856 +v -0.017555 0.242781 0.019207 +v -0.019200 0.242280 0.018088 +v -0.016304 0.241882 0.021589 +v -0.017832 0.241539 0.020358 +v -0.012574 0.242516 0.024324 +v -0.014506 0.242208 0.023000 +v -0.015648 0.243115 0.020556 +v -0.013531 0.243444 0.021901 +v -0.009112 0.243978 0.023816 +v -0.011371 0.243739 0.022992 +v -0.008630 0.242837 0.026227 +v -0.010639 0.242708 0.025398 +v -0.003981 0.244090 0.024839 +v -0.006666 0.244095 0.024435 +v -0.003970 0.242900 0.027435 +v -0.006435 0.242925 0.026892 +v -0.001203 0.242847 0.027806 +v -0.001053 0.244013 0.025058 +v 0.075573 0.287718 -0.065997 +v 0.074934 0.287322 -0.065943 +v 0.074637 0.288045 -0.066090 +v 0.074928 0.288313 -0.066127 +v 0.073530 0.287038 -0.066191 +v 0.073386 0.287837 -0.066317 +v 0.073470 0.288440 -0.066549 +v 0.074549 0.289059 -0.067103 +v 0.074629 0.289252 -0.066750 +v 0.074090 0.288930 -0.066932 +v 0.074017 0.288601 -0.067428 +v 0.074890 0.289113 -0.066366 +v 0.074510 0.288966 -0.066453 +v 0.072808 0.288194 -0.067462 +v 0.072768 0.287076 -0.068385 +v 0.075200 0.288648 -0.066221 +v 0.075405 0.288854 -0.066228 +v 0.075672 0.288663 -0.066129 +v 0.075167 0.289136 -0.066351 +v 0.074981 0.288618 -0.066221 +v 0.074984 0.289315 -0.066687 +v 0.074714 0.289055 -0.067166 +v 0.074379 0.288371 -0.067824 +v 0.073871 0.286540 -0.068942 +v 0.067401 0.280203 -0.071479 +v 0.067511 0.282151 -0.071198 +v 0.065956 0.282640 -0.071109 +v 0.065948 0.280691 -0.071728 +v 0.067614 0.284040 -0.070825 +v 0.066101 0.284470 -0.070786 +v 0.065065 0.284722 -0.070461 +v 0.064900 0.282982 -0.070666 +v 0.064912 0.281105 -0.071200 +v 0.064457 0.282479 -0.068077 +v 0.064276 0.281174 -0.068343 +v 0.063922 0.281029 -0.069130 +v 0.064022 0.282370 -0.068825 +v 0.064300 0.280276 -0.068653 +v 0.064138 0.279871 -0.069209 +v 0.064358 0.279419 -0.069974 +v 0.064053 0.280561 -0.069849 +v 0.064134 0.282017 -0.069462 +v 0.068105 0.286749 -0.069965 +v 0.066598 0.286895 -0.070134 +v 0.066367 0.285880 -0.070550 +v 0.067891 0.285579 -0.070562 +v 0.065741 0.286783 -0.070038 +v 0.065423 0.286025 -0.070299 +v 0.070228 0.286531 -0.069391 +v 0.069946 0.285098 -0.070139 +v 0.071994 0.284724 -0.069577 +v 0.069676 0.283355 -0.070672 +v 0.071645 0.282544 -0.070307 +v 0.068388 0.287604 -0.068412 +v 0.068255 0.287418 -0.069179 +v 0.070500 0.287382 -0.068519 +v 0.070712 0.287632 -0.067682 +v 0.065482 0.287124 -0.068864 +v 0.065535 0.287068 -0.069565 +v 0.066672 0.287453 -0.069442 +v 0.066700 0.287562 -0.068674 +v 0.064936 0.286187 -0.069705 +v 0.064968 0.286205 -0.069120 +v 0.064606 0.285113 -0.069137 +v 0.064633 0.284929 -0.069741 +v 0.065624 0.286986 -0.068205 +v 0.064951 0.286242 -0.068457 +v 0.065898 0.286654 -0.067910 +v 0.065513 0.286090 -0.067860 +v 0.065148 0.285149 -0.067900 +v 0.064596 0.285228 -0.068590 +v 0.064180 0.283859 -0.068540 +v 0.064287 0.283645 -0.069206 +v 0.064764 0.283886 -0.067920 +v 0.064404 0.283309 -0.069856 +v 0.064350 0.281561 -0.070297 +v 0.069526 0.276763 -0.067685 +v 0.069941 0.276505 -0.068037 +v 0.068264 0.277038 -0.069092 +v 0.068061 0.277183 -0.068490 +v 0.070374 0.276680 -0.068558 +v 0.068649 0.277360 -0.069740 +v 0.066878 0.277791 -0.070949 +v 0.066456 0.277603 -0.070151 +v 0.066246 0.277846 -0.069338 +v 0.070816 0.276643 -0.066281 +v 0.069923 0.276554 -0.067194 +v 0.068222 0.277497 -0.067850 +v 0.068604 0.278112 -0.067323 +v 0.066243 0.278367 -0.068616 +v 0.066452 0.279213 -0.068032 +v 0.070902 0.275984 -0.067255 +v 0.071483 0.275856 -0.067825 +v 0.071480 0.275515 -0.066563 +v 0.072012 0.274982 -0.067283 +v 0.072636 0.273517 -0.066150 +v 0.072340 0.274196 -0.066745 +v 0.072104 0.274978 -0.065926 +v 0.072590 0.274438 -0.065338 +v 0.072295 0.276218 -0.065418 +v 0.073023 0.275713 -0.064839 +v 0.073279 0.283577 -0.069994 +v 0.073202 0.281266 -0.070842 +v 0.071137 0.278614 -0.069973 +v 0.071452 0.280423 -0.070430 +v 0.069491 0.281416 -0.070883 +v 0.069265 0.279579 -0.070730 +v 0.073009 0.279050 -0.070614 +v 0.072645 0.277317 -0.069644 +v 0.073012 0.273874 -0.067799 +v 0.072784 0.275039 -0.068304 +v 0.073248 0.273097 -0.067042 +v 0.074173 0.273015 -0.068009 +v 0.074082 0.273855 -0.068890 +v 0.070777 0.277362 -0.069264 +v 0.072063 0.276266 -0.068627 +v 0.068992 0.278205 -0.070306 +v 0.067227 0.278709 -0.071439 +v 0.065885 0.279184 -0.071910 +v 0.065610 0.278325 -0.071458 +v 0.064885 0.279653 -0.071588 +v 0.065033 0.278910 -0.071408 +v 0.064512 0.278949 -0.070849 +v 0.064346 0.280075 -0.070740 +v 0.065168 0.278123 -0.070617 +v 0.064986 0.278525 -0.069829 +v 0.065030 0.279895 -0.068431 +v 0.064913 0.279070 -0.069019 +v 0.065251 0.281020 -0.068020 +v 0.066835 0.280400 -0.067684 +v 0.065574 0.282341 -0.067763 +v 0.067300 0.281764 -0.067520 +v 0.066341 0.284930 -0.067661 +v 0.065965 0.283703 -0.067649 +v 0.068127 0.284477 -0.067533 +v 0.067749 0.283134 -0.067536 +v 0.073603 0.284202 -0.066180 +v 0.073654 0.285814 -0.066101 +v 0.075203 0.285945 -0.065706 +v 0.075164 0.284120 -0.065693 +v 0.076014 0.285719 -0.065687 +v 0.075878 0.283557 -0.065452 +v 0.072155 0.279895 -0.066146 +v 0.073976 0.279694 -0.065431 +v 0.072961 0.277809 -0.065221 +v 0.071273 0.278172 -0.066006 +v 0.074961 0.278899 -0.065343 +v 0.073836 0.277193 -0.064773 +v 0.069090 0.279238 -0.067019 +v 0.069656 0.280658 -0.067033 +v 0.070243 0.282201 -0.067151 +v 0.070729 0.283912 -0.067112 +v 0.073104 0.282200 -0.066214 +v 0.066639 0.285925 -0.067779 +v 0.066823 0.286674 -0.067809 +v 0.068528 0.286522 -0.067730 +v 0.068399 0.285624 -0.067652 +v 0.066787 0.287238 -0.068043 +v 0.068498 0.287164 -0.067948 +v 0.071003 0.286492 -0.067057 +v 0.070899 0.287206 -0.067244 +v 0.070989 0.285415 -0.067054 +v 0.074731 0.282072 -0.065561 +v 0.075509 0.281301 -0.065313 +v -0.071261 0.284962 -0.066471 +v -0.072434 0.285129 -0.066627 +v -0.072115 0.285790 -0.066776 +v -0.071133 0.285740 -0.066781 +v -0.072356 0.286092 -0.066814 +v -0.071189 0.286278 -0.067104 +v -0.072038 0.286333 -0.067136 +v -0.071789 0.286420 -0.067565 +v -0.070880 0.286143 -0.068071 +v -0.072497 0.286540 -0.067134 +v -0.072336 0.286565 -0.067413 +v -0.072240 0.286484 -0.067659 +v -0.071924 0.286207 -0.068071 +v -0.071131 0.285172 -0.068914 +v -0.072668 0.286409 -0.066857 +v -0.072843 0.286601 -0.066901 +v -0.072780 0.286680 -0.067158 +v -0.072415 0.286362 -0.066946 +v -0.072724 0.286785 -0.067437 +v -0.072488 0.286668 -0.067808 +v -0.072468 0.286131 -0.068514 +v -0.072607 0.284739 -0.069578 +v -0.064024 0.282328 -0.070942 +v -0.065092 0.281957 -0.071210 +v -0.064918 0.280178 -0.072014 +v -0.063885 0.280552 -0.071566 +v -0.066531 0.281555 -0.071080 +v -0.066303 0.279745 -0.071671 +v -0.066053 0.278107 -0.072109 +v -0.064725 0.278489 -0.072634 +v -0.063714 0.278858 -0.072170 +v -0.062790 0.277445 -0.070859 +v -0.062586 0.277808 -0.069849 +v -0.062502 0.278906 -0.069703 +v -0.062759 0.278472 -0.070637 +v -0.062836 0.278212 -0.069097 +v -0.062806 0.279061 -0.068475 +v -0.063056 0.280285 -0.067863 +v -0.062647 0.280170 -0.069141 +v -0.062847 0.279768 -0.070070 +v -0.064256 0.283786 -0.070401 +v -0.065249 0.283555 -0.070550 +v -0.064528 0.284513 -0.069737 +v -0.065389 0.284793 -0.070023 +v -0.066865 0.284756 -0.069757 +v -0.066725 0.283354 -0.070426 +v -0.068788 0.283181 -0.070179 +v -0.068586 0.281166 -0.070912 +v -0.068945 0.284836 -0.069357 +v -0.070924 0.282948 -0.069999 +v -0.070728 0.280710 -0.070528 +v -0.069029 0.285819 -0.068676 +v -0.066968 0.285552 -0.069071 +v -0.066998 0.285887 -0.068340 +v -0.069084 0.286073 -0.067792 +v -0.065420 0.285468 -0.069327 +v -0.064324 0.285040 -0.069477 +v -0.064250 0.285272 -0.068812 +v -0.065417 0.285702 -0.068641 +v -0.063220 0.282958 -0.069188 +v -0.063479 0.284314 -0.069021 +v -0.063766 0.284017 -0.069698 +v -0.063519 0.282633 -0.069981 +v -0.063839 0.283027 -0.067353 +v -0.064248 0.284130 -0.067455 +v -0.063591 0.284311 -0.068192 +v -0.063186 0.283101 -0.068266 +v -0.064692 0.284766 -0.067797 +v -0.064358 0.285119 -0.068032 +v -0.063439 0.281643 -0.067434 +v -0.062913 0.281631 -0.068580 +v -0.063023 0.281363 -0.069533 +v -0.063333 0.280951 -0.070516 +v -0.063176 0.279282 -0.071081 +v -0.065422 0.276017 -0.071597 +v -0.067219 0.275763 -0.070243 +v -0.066830 0.275437 -0.069674 +v -0.064985 0.275765 -0.070836 +v -0.068682 0.275105 -0.068662 +v -0.068200 0.274923 -0.068167 +v -0.067924 0.275296 -0.068032 +v -0.066609 0.275590 -0.069045 +v -0.064794 0.276024 -0.070050 +v -0.066725 0.275916 -0.068223 +v -0.064863 0.276517 -0.069269 +v -0.068155 0.275117 -0.067027 +v -0.069017 0.275342 -0.066070 +v -0.067181 0.276632 -0.067525 +v -0.065146 0.277326 -0.068424 +v -0.068883 0.274404 -0.067003 +v -0.069458 0.273841 -0.066342 +v -0.069482 0.274231 -0.067688 +v -0.070002 0.273231 -0.067203 +v -0.070072 0.273028 -0.065889 +v -0.070299 0.274409 -0.065439 +v -0.070306 0.272073 -0.066969 +v -0.072612 0.282421 -0.070601 +v -0.072454 0.279892 -0.070867 +v -0.068276 0.279313 -0.071177 +v -0.070365 0.278787 -0.070432 +v -0.069885 0.277158 -0.070008 +v -0.067978 0.277756 -0.071198 +v -0.071170 0.276006 -0.069610 +v -0.071967 0.277816 -0.070437 +v -0.071056 0.271805 -0.068268 +v -0.070874 0.273382 -0.068410 +v -0.070250 0.274794 -0.068547 +v -0.069289 0.275843 -0.069424 +v -0.067636 0.276534 -0.070832 +v -0.065804 0.276865 -0.072085 +v -0.064480 0.277171 -0.072571 +v -0.063510 0.277574 -0.072349 +v -0.064100 0.276278 -0.072189 +v -0.063502 0.276835 -0.072201 +v -0.062981 0.277966 -0.071483 +v -0.063089 0.276952 -0.071545 +v -0.063734 0.276206 -0.071419 +v -0.063455 0.276546 -0.070615 +v -0.063484 0.277125 -0.069735 +v -0.063608 0.277874 -0.068824 +v -0.063901 0.278864 -0.067956 +v -0.064286 0.280059 -0.067279 +v -0.065569 0.278380 -0.067619 +v -0.066084 0.279597 -0.066922 +v -0.066530 0.280988 -0.066424 +v -0.064707 0.281405 -0.066916 +v -0.066931 0.282505 -0.066389 +v -0.065106 0.282785 -0.066913 +v -0.072835 0.283651 -0.066542 +v -0.071429 0.283757 -0.066110 +v -0.071413 0.282030 -0.065712 +v -0.072913 0.281662 -0.065927 +v -0.071075 0.276056 -0.065408 +v -0.072044 0.277776 -0.065450 +v -0.070609 0.278502 -0.065718 +v -0.069736 0.276914 -0.065842 +v -0.067752 0.277784 -0.066886 +v -0.068397 0.279105 -0.066290 +v -0.069256 0.282321 -0.065857 +v -0.068907 0.280591 -0.065906 +v -0.071106 0.280168 -0.065519 +v -0.067219 0.284834 -0.067229 +v -0.065570 0.284836 -0.067437 +v -0.065407 0.283964 -0.067131 +v -0.067167 0.283811 -0.066756 +v -0.065525 0.285372 -0.067929 +v -0.067145 0.285475 -0.067743 +v -0.069198 0.285647 -0.067148 +v -0.069379 0.284873 -0.066815 +v -0.069419 0.283770 -0.066340 +v -0.072599 0.279571 -0.065416 +v 0.032006 0.310122 0.019822 +v 0.032035 0.307240 0.019459 +v 0.035831 0.307003 0.018552 +v 0.036101 0.309796 0.018733 +v 0.031908 0.305292 0.019212 +v 0.035731 0.305019 0.018351 +v 0.038940 0.305081 0.016765 +v 0.039056 0.306994 0.016734 +v 0.039605 0.309727 0.016665 +v 0.041621 0.305328 0.014591 +v 0.041754 0.306979 0.014585 +v 0.043824 0.305760 0.012320 +v 0.044128 0.306844 0.012473 +v 0.044342 0.308719 0.012269 +v 0.042156 0.309463 0.014382 +v 0.045803 0.306679 0.008285 +v 0.046358 0.307050 0.006842 +v 0.047309 0.306997 0.006243 +v 0.046516 0.306886 0.008141 +v 0.046680 0.306996 0.005851 +v 0.048075 0.306734 0.004790 +v 0.048275 0.307643 0.005485 +v 0.047209 0.307765 0.007723 +v 0.045060 0.306234 0.010176 +v 0.045567 0.306823 0.010241 +v 0.045930 0.308157 0.009982 +v 0.045123 0.307148 0.007896 +v 0.045639 0.307846 0.006672 +v 0.044743 0.308225 0.006847 +v 0.045328 0.308996 0.005533 +v 0.045676 0.309269 0.004692 +v 0.045891 0.308144 0.005909 +v 0.043293 0.305621 0.011614 +v 0.044430 0.306335 0.009647 +v 0.042910 0.306172 0.010301 +v 0.043992 0.307065 0.008451 +v 0.038599 0.304835 0.015569 +v 0.041205 0.305128 0.013644 +v 0.038501 0.305336 0.013973 +v 0.041032 0.305659 0.012149 +v 0.031700 0.305151 0.017808 +v 0.035485 0.304765 0.017039 +v 0.031550 0.305773 0.016233 +v 0.035358 0.305342 0.015434 +v 0.017420 0.309026 0.013870 +v 0.017875 0.309077 0.013475 +v 0.018555 0.308733 0.013802 +v 0.018164 0.308806 0.014388 +v 0.018306 0.309319 0.012829 +v 0.018835 0.309217 0.013092 +v 0.020129 0.308700 0.013337 +v 0.019794 0.308176 0.014216 +v 0.019376 0.308309 0.015054 +v 0.023551 0.307002 0.017369 +v 0.021047 0.307709 0.015962 +v 0.021449 0.307554 0.015048 +v 0.024058 0.307015 0.016215 +v 0.021696 0.308106 0.013889 +v 0.023967 0.307495 0.014888 +v 0.027423 0.306038 0.017439 +v 0.027274 0.306014 0.018741 +v 0.027239 0.306693 0.016056 +v 0.027203 0.310304 0.019387 +v 0.027221 0.307608 0.019251 +v 0.023406 0.310632 0.017896 +v 0.023260 0.308334 0.017901 +v 0.017512 0.309501 0.014717 +v 0.019013 0.309453 0.015414 +v 0.016759 0.309356 0.014076 +v 0.020969 0.311110 0.016555 +v 0.020802 0.309036 0.016431 +v 0.026997 0.313227 0.019518 +v 0.031808 0.313085 0.020242 +v 0.023334 0.312912 0.017993 +v 0.021323 0.312567 0.016918 +v 0.036259 0.312822 0.019049 +v 0.040187 0.312718 0.016818 +v 0.042952 0.312175 0.014296 +v 0.044884 0.310957 0.011736 +v 0.046480 0.309820 0.009411 +v 0.047709 0.308954 0.007127 +v 0.048479 0.308508 0.005383 +v -0.040775 0.303272 0.014768 +v -0.037117 0.303189 0.016484 +v -0.037851 0.304411 0.017653 +v -0.041463 0.304406 0.015822 +v -0.031946 0.303690 0.017484 +v -0.032746 0.304968 0.018689 +v -0.033132 0.307691 0.019772 +v -0.038242 0.307097 0.018670 +v -0.041765 0.306843 0.016455 +v -0.045765 0.305748 0.011999 +v -0.045270 0.304543 0.011784 +v -0.043812 0.304580 0.013698 +v -0.044322 0.306390 0.014393 +v -0.044546 0.303998 0.011314 +v -0.043114 0.303637 0.012992 +v -0.047623 0.305202 0.006202 +v -0.047056 0.304977 0.007293 +v -0.047954 0.305357 0.007073 +v -0.046256 0.305112 0.006869 +v -0.046205 0.305090 0.007540 +v -0.045938 0.304745 0.008577 +v -0.046596 0.304686 0.008610 +v -0.047325 0.305041 0.008545 +v -0.046046 0.304552 0.010089 +v -0.046643 0.305215 0.010129 +v -0.045413 0.304349 0.009858 +v -0.045254 0.306960 0.005785 +v -0.045184 0.306856 0.006458 +v -0.045566 0.305732 0.007309 +v -0.045566 0.305905 0.006758 +v -0.044924 0.306496 0.007405 +v -0.045289 0.305294 0.008202 +v -0.044361 0.306010 0.008413 +v -0.044759 0.304751 0.009316 +v -0.043467 0.305672 0.009519 +v -0.043850 0.304236 0.010537 +v -0.041936 0.305461 0.010664 +v -0.042361 0.303900 0.011934 +v -0.039527 0.305501 0.011791 +v -0.039962 0.303841 0.013352 +v -0.035558 0.305817 0.013194 +v -0.036235 0.304000 0.014886 +v -0.030369 0.306280 0.014255 +v -0.031098 0.304474 0.015897 +v -0.019550 0.309428 0.012579 +v -0.018584 0.309757 0.012516 +v -0.018238 0.309342 0.013191 +v -0.019304 0.309043 0.013383 +v -0.017785 0.309816 0.012589 +v -0.017518 0.309444 0.013234 +v -0.017096 0.309426 0.013792 +v -0.017794 0.309312 0.013825 +v -0.018880 0.308967 0.014052 +v -0.020767 0.308372 0.013892 +v -0.020893 0.308951 0.012749 +v -0.020480 0.308157 0.014685 +v -0.022880 0.307047 0.015899 +v -0.023061 0.307727 0.014914 +v -0.022804 0.308298 0.013491 +v -0.025678 0.307077 0.014228 +v -0.026163 0.305760 0.015733 +v -0.026531 0.305213 0.017109 +v -0.022757 0.307750 0.016739 +v -0.026866 0.306299 0.018241 +v -0.022860 0.309577 0.017154 +v -0.027125 0.308712 0.018877 +v -0.016541 0.309618 0.014096 +v -0.017290 0.309709 0.014262 +v -0.018443 0.309513 0.014743 +v -0.020125 0.308817 0.015511 +v -0.020216 0.310254 0.015863 +v -0.022910 0.311698 0.017207 +v -0.027269 0.311778 0.019164 +v -0.033052 0.311348 0.020413 +v -0.020726 0.311459 0.016194 +v -0.038310 0.310719 0.019456 +v -0.042043 0.310003 0.016920 +v -0.044708 0.309011 0.014528 +v -0.046384 0.307756 0.012151 +v -0.047263 0.306529 0.010114 +v -0.047923 0.305880 0.008504 +v -0.048282 0.305797 0.007301 +v 0.011883 0.271590 0.035424 +v 0.011791 0.271436 0.034687 +v 0.011827 0.270159 0.036021 +v 0.012243 0.270288 0.036703 +v 0.011397 0.271397 0.034009 +v 0.011396 0.270404 0.035371 +v 0.010702 0.270483 0.034632 +v 0.010548 0.271343 0.033474 +v 0.009460 0.271403 0.033371 +v 0.009703 0.270646 0.034335 +v 0.006399 0.272694 0.044512 +v 0.007886 0.272981 0.044248 +v 0.005658 0.272584 0.043577 +v 0.006654 0.273450 0.043366 +v 0.006975 0.271441 0.036739 +v 0.006484 0.271691 0.038077 +v 0.007619 0.271117 0.035582 +v 0.007223 0.271969 0.034696 +v 0.006558 0.272366 0.035975 +v 0.006180 0.272728 0.037633 +v 0.008563 0.270853 0.034659 +v 0.008247 0.271605 0.033776 +v 0.011805 0.272149 0.037322 +v 0.011918 0.271862 0.036243 +v 0.012577 0.270477 0.037330 +v 0.012622 0.270823 0.038236 +v 0.009932 0.273000 0.040601 +v 0.011137 0.272508 0.038806 +v 0.012225 0.271398 0.039620 +v 0.011145 0.272192 0.041386 +v 0.005293 0.272714 0.041238 +v 0.005404 0.271738 0.041076 +v 0.005957 0.271730 0.039587 +v 0.005755 0.272809 0.039524 +v 0.005194 0.272046 0.042408 +v 0.005349 0.272961 0.042543 +v 0.008479 0.273540 0.042334 +v 0.009555 0.272816 0.043130 +v 0.006541 0.277660 0.032283 +v 0.007521 0.277429 0.031675 +v 0.007701 0.279046 0.031621 +v 0.006963 0.279183 0.032113 +v 0.008646 0.277235 0.031309 +v 0.008428 0.278930 0.031277 +v 0.008369 0.279850 0.031524 +v 0.007913 0.280108 0.031632 +v 0.007308 0.280244 0.031926 +v 0.009108 0.281063 0.034003 +v 0.009055 0.280545 0.034792 +v 0.008091 0.280630 0.035387 +v 0.008534 0.281343 0.034124 +v 0.008908 0.279386 0.035915 +v 0.007598 0.279473 0.036987 +v 0.006281 0.279221 0.037436 +v 0.007083 0.280515 0.035579 +v 0.007841 0.281299 0.034065 +v 0.012025 0.277847 0.031697 +v 0.011806 0.278359 0.032591 +v 0.010835 0.279885 0.032336 +v 0.010765 0.279596 0.031676 +v 0.011081 0.278837 0.033638 +v 0.010537 0.280149 0.033100 +v 0.009994 0.280804 0.032896 +v 0.009943 0.280911 0.032492 +v 0.009658 0.280837 0.032063 +v 0.009919 0.280409 0.033980 +v 0.009618 0.281151 0.033452 +v 0.010108 0.279203 0.034787 +v 0.009136 0.278952 0.031162 +v 0.008520 0.280147 0.031340 +v 0.009776 0.277150 0.031048 +v 0.010819 0.277200 0.030941 +v 0.009778 0.279117 0.031086 +v 0.008664 0.280543 0.031648 +v 0.011624 0.277427 0.031128 +v 0.010363 0.279325 0.031276 +v 0.009197 0.280674 0.031778 +v 0.005157 0.278045 0.034063 +v 0.005741 0.277864 0.033088 +v 0.006290 0.279291 0.032713 +v 0.005813 0.279407 0.033400 +v 0.006682 0.280275 0.032426 +v 0.006439 0.280313 0.033090 +v 0.004814 0.278558 0.036315 +v 0.004804 0.278269 0.035175 +v 0.005664 0.279644 0.034115 +v 0.005823 0.279965 0.034812 +v 0.006347 0.280559 0.033197 +v 0.006692 0.280887 0.033553 +v 0.006276 0.280268 0.035357 +v 0.007197 0.281134 0.033865 +v 0.005308 0.278904 0.037184 +v 0.009224 0.281269 0.033182 +v 0.008688 0.281234 0.032894 +v 0.007595 0.281136 0.032487 +v 0.008147 0.281285 0.032663 +v 0.007094 0.280728 0.032367 +v 0.007706 0.280717 0.031845 +v 0.008116 0.280617 0.031533 +v 0.008907 0.275221 0.031365 +v 0.010362 0.275069 0.031184 +v 0.009135 0.273363 0.031692 +v 0.010541 0.273287 0.031684 +v 0.011707 0.273318 0.031806 +v 0.011623 0.275078 0.031198 +v 0.009301 0.272153 0.032423 +v 0.010516 0.272098 0.032449 +v 0.011474 0.272209 0.032798 +v 0.006256 0.275854 0.032550 +v 0.007462 0.275494 0.031779 +v 0.006335 0.274097 0.033028 +v 0.007654 0.273665 0.032168 +v 0.006732 0.272832 0.033783 +v 0.007920 0.272375 0.032827 +v 0.004652 0.276342 0.034824 +v 0.005323 0.276144 0.033537 +v 0.004752 0.274666 0.035759 +v 0.005378 0.274446 0.034184 +v 0.005453 0.273576 0.036814 +v 0.005893 0.273184 0.035056 +v 0.004328 0.276804 0.037959 +v 0.004266 0.276550 0.036388 +v 0.004479 0.275183 0.039596 +v 0.004493 0.274975 0.037732 +v 0.004971 0.273872 0.040809 +v 0.005222 0.273883 0.038915 +v 0.005848 0.277643 0.039425 +v 0.004825 0.277193 0.039095 +v 0.005911 0.276043 0.041201 +v 0.004905 0.275498 0.040822 +v 0.006204 0.274654 0.042419 +v 0.005209 0.274119 0.042003 +v 0.008877 0.277939 0.037336 +v 0.007280 0.277917 0.038720 +v 0.009064 0.276348 0.038764 +v 0.007455 0.276409 0.040431 +v 0.009376 0.274668 0.039842 +v 0.007762 0.274855 0.041603 +v 0.011557 0.277256 0.034487 +v 0.010312 0.277716 0.035850 +v 0.011787 0.275604 0.035502 +v 0.010557 0.276085 0.037005 +v 0.011722 0.273867 0.036404 +v 0.010834 0.274350 0.038012 +v 0.012993 0.275843 0.032151 +v 0.012593 0.276578 0.033251 +v 0.012985 0.274120 0.033016 +v 0.012717 0.274890 0.034184 +v 0.012410 0.272743 0.034126 +v 0.012183 0.273297 0.035106 +v 0.012630 0.275306 0.031382 +v 0.012624 0.273548 0.032198 +v 0.012108 0.272406 0.033346 +v -0.010401 0.270792 0.035738 +v -0.011004 0.270918 0.036987 +v -0.010054 0.271622 0.035077 +v -0.010904 0.271972 0.036150 +v -0.010981 0.272177 0.037531 +v -0.011109 0.271051 0.038448 +v -0.007761 0.271181 0.034332 +v -0.008878 0.271310 0.034487 +v -0.009359 0.270632 0.034965 +v -0.008271 0.270613 0.034859 +v -0.004479 0.271226 0.044667 +v -0.003846 0.271520 0.043710 +v -0.005376 0.272061 0.044753 +v -0.004088 0.272820 0.043803 +v -0.005726 0.271829 0.035788 +v -0.006225 0.271040 0.036392 +v -0.005558 0.271354 0.037572 +v -0.005199 0.272437 0.036989 +v -0.004849 0.271416 0.038715 +v -0.004703 0.272706 0.038307 +v -0.007230 0.270816 0.035432 +v -0.006704 0.271431 0.034867 +v -0.010869 0.271239 0.039892 +v -0.010556 0.272341 0.038953 +v -0.009856 0.272522 0.040281 +v -0.010380 0.271514 0.041290 +v -0.009567 0.271809 0.042647 +v -0.008890 0.272832 0.041561 +v -0.007607 0.273221 0.042687 +v -0.008376 0.272295 0.043750 +v -0.004128 0.271295 0.039983 +v -0.003410 0.271167 0.041357 +v -0.003042 0.272200 0.041432 +v -0.003896 0.272527 0.039776 +v -0.003318 0.271372 0.042736 +v -0.002852 0.272330 0.042925 +v -0.006801 0.272550 0.044475 +v -0.005957 0.273509 0.043624 +v -0.004856 0.280666 0.032715 +v -0.005076 0.279552 0.032529 +v -0.004279 0.279553 0.032754 +v -0.004311 0.280792 0.032700 +v -0.005486 0.277612 0.032663 +v -0.004401 0.277655 0.032955 +v -0.003409 0.277818 0.033460 +v -0.003472 0.279628 0.033140 +v -0.003638 0.280891 0.032957 +v -0.003635 0.279720 0.038773 +v -0.005263 0.280000 0.038358 +v -0.004937 0.281422 0.036900 +v -0.003784 0.281196 0.036963 +v -0.006735 0.280122 0.037495 +v -0.006044 0.281493 0.036468 +v -0.005660 0.282117 0.035790 +v -0.004986 0.282313 0.035748 +v -0.004217 0.282151 0.035544 +v -0.006666 0.282113 0.034815 +v -0.007540 0.281316 0.035109 +v -0.007730 0.281094 0.034423 +v -0.006482 0.282074 0.034400 +v -0.008748 0.279895 0.035614 +v -0.009099 0.279520 0.034736 +v -0.008918 0.279021 0.033975 +v -0.007572 0.280807 0.033760 +v -0.006225 0.282004 0.033923 +v -0.007889 0.280062 0.036526 +v -0.006924 0.281461 0.035809 +v -0.006179 0.282285 0.035291 +v -0.007518 0.278081 0.032850 +v -0.006557 0.277760 0.032609 +v -0.005806 0.279738 0.032535 +v -0.006457 0.280072 0.032806 +v -0.005057 0.280963 0.032571 +v -0.005034 0.281511 0.033050 +v -0.007092 0.280442 0.033201 +v -0.005749 0.281760 0.033446 +v -0.008357 0.278523 0.033284 +v -0.002795 0.279688 0.033707 +v -0.003006 0.280864 0.033441 +v -0.002644 0.277995 0.034155 +v -0.002097 0.278146 0.035001 +v -0.002334 0.279781 0.034353 +v -0.002731 0.280695 0.034061 +v -0.002186 0.280036 0.035057 +v -0.002667 0.281151 0.034243 +v -0.001809 0.278371 0.036029 +v -0.001828 0.278733 0.037197 +v -0.002360 0.280401 0.035828 +v -0.003015 0.281552 0.034702 +v -0.002370 0.279233 0.038288 +v -0.002861 0.280825 0.036545 +v -0.003542 0.281879 0.035169 +v -0.005615 0.282556 0.034903 +v -0.005042 0.282454 0.034511 +v -0.004496 0.282249 0.034131 +v -0.003900 0.282019 0.033758 +v -0.004039 0.281445 0.033050 +v -0.003353 0.281641 0.033528 +v -0.004435 0.281340 0.032657 +v -0.009053 0.273769 0.033831 +v -0.007974 0.273291 0.033345 +v -0.007312 0.275330 0.032913 +v -0.008422 0.275716 0.033172 +v -0.006772 0.273084 0.033216 +v -0.006087 0.275160 0.032838 +v -0.008461 0.272065 0.033882 +v -0.009610 0.272533 0.034458 +v -0.007283 0.271840 0.033712 +v -0.005371 0.273231 0.033574 +v -0.004750 0.275306 0.033193 +v -0.004171 0.273825 0.034482 +v -0.003573 0.275694 0.033905 +v -0.006055 0.272016 0.034154 +v -0.005002 0.272634 0.035104 +v -0.003433 0.274463 0.035560 +v -0.002709 0.276037 0.034784 +v -0.003002 0.274846 0.036830 +v -0.002157 0.276239 0.035861 +v -0.004419 0.273373 0.036270 +v -0.004049 0.273810 0.037657 +v -0.002528 0.274961 0.038372 +v -0.001754 0.276428 0.037181 +v -0.001889 0.274806 0.040211 +v -0.001595 0.276726 0.038728 +v -0.003329 0.273708 0.039273 +v -0.002364 0.273240 0.041174 +v -0.001901 0.274947 0.041903 +v -0.002117 0.277202 0.040157 +v -0.003135 0.275594 0.042527 +v -0.003544 0.277817 0.040752 +v -0.002172 0.273356 0.042785 +v -0.003302 0.274049 0.043360 +v -0.005437 0.276315 0.041743 +v -0.005631 0.278338 0.040159 +v -0.007628 0.276455 0.040291 +v -0.007524 0.278453 0.038854 +v -0.005386 0.274677 0.042872 +v -0.007407 0.274655 0.041675 +v -0.009222 0.276290 0.038864 +v -0.008865 0.278285 0.037536 +v -0.010278 0.276003 0.037653 +v -0.009905 0.278037 0.036431 +v -0.008946 0.274399 0.040364 +v -0.010089 0.274154 0.039112 +v -0.010730 0.275511 0.036526 +v -0.010337 0.277538 0.035391 +v -0.010558 0.274925 0.035484 +v -0.010085 0.276899 0.034490 +v -0.010791 0.273866 0.037872 +v -0.010885 0.273462 0.036548 +v -0.010053 0.274333 0.034503 +v -0.009365 0.276260 0.033735 +v -0.010637 0.273039 0.035333 +v 0.024234 0.248142 0.016283 +vt 0.775590 0.355550 +vt 0.776840 0.378110 +vt 0.758860 0.374860 +vt 0.778090 0.400680 +vt 0.762560 0.398380 +vt 0.747030 0.396090 +vt 0.755160 0.351340 +vt 0.740880 0.371610 +vt 0.627690 0.898810 +vt 0.631310 0.908870 +vt 0.620770 0.916280 +vt 0.634940 0.918940 +vt 0.626560 0.925500 +vt 0.618190 0.932060 +vt 0.614970 0.907070 +vt 0.610220 0.923690 +vt 0.733610 0.926070 +vt 0.719120 0.939550 +vt 0.697320 0.927240 +vt 0.704630 0.953030 +vt 0.686800 0.938080 +vt 0.676290 0.948930 +vt 0.654490 0.936620 +vt 0.661040 0.928410 +vt 0.639610 0.930230 +vt 0.644020 0.922210 +vt 0.648430 0.914190 +vt 0.661480 0.918920 +vt 0.661920 0.909440 +vt 0.693050 0.902220 +vt 0.695190 0.914730 +vt 0.724190 0.895000 +vt 0.728900 0.910530 +vt 0.594840 0.947180 +vt 0.606510 0.939620 +vt 0.621390 0.946010 +vt 0.630500 0.938120 +vt 0.647950 0.944840 +vt 0.565150 0.962050 +vt 0.579990 0.954610 +vt 0.595080 0.964000 +vt 0.608230 0.955000 +vt 0.636480 0.955390 +vt 0.625010 0.965950 +vt 0.499990 0.977360 +vt 0.532570 0.969700 +vt 0.537240 0.983640 +vt 0.566160 0.973820 +vt 0.599750 0.977930 +vt 0.574500 0.989920 +vt 0.499990 0.942310 +vt 0.499990 0.930930 +vt 0.522090 0.929610 +vt 0.499990 0.919550 +vt 0.520510 0.917940 +vt 0.541040 0.916340 +vt 0.523670 0.941280 +vt 0.544190 0.928300 +vt 0.499990 0.959830 +vt 0.547350 0.940260 +vt 0.528120 0.955490 +vt 0.556250 0.951150 +vt 0.731780 0.496880 +vt 0.741510 0.508870 +vt 0.716340 0.495330 +vt 0.751250 0.520870 +vt 0.726860 0.508950 +vt 0.737380 0.522570 +vt 0.712200 0.509030 +vt 0.700900 0.493780 +vt 0.670050 0.366220 +vt 0.689900 0.375380 +vt 0.681610 0.398360 +vt 0.709760 0.384540 +vt 0.701320 0.406400 +vt 0.721040 0.414440 +vt 0.712740 0.437420 +vt 0.693170 0.430510 +vt 0.728390 0.390310 +vt 0.743930 0.418350 +vt 0.766830 0.422260 +vt 0.759470 0.446390 +vt 0.732320 0.444340 +vt 0.748810 0.469590 +vt 0.786630 0.448440 +vt 0.774420 0.472550 +vt 0.800040 0.475520 +vt 0.789380 0.498720 +vt 0.765300 0.494850 +vt 0.730640 0.466640 +vt 0.748540 0.495860 +vt 0.712470 0.463690 +vt 0.630560 0.338530 +vt 0.650300 0.352370 +vt 0.642400 0.377360 +vt 0.662000 0.387860 +vt 0.673700 0.423350 +vt 0.695020 0.459340 +vt 0.677570 0.454980 +vt 0.654240 0.416190 +vt 0.770180 0.526450 +vt 0.759360 0.511160 +vt 0.777200 0.513440 +vt 0.813460 0.502600 +vt 0.801150 0.517870 +vt 0.825090 0.522310 +vt 0.812920 0.537030 +vt 0.789110 0.532040 +vt 0.836730 0.542020 +vt 0.844180 0.564610 +vt 0.826190 0.562590 +vt 0.851640 0.587210 +vt 0.839460 0.588150 +vt 0.827280 0.589100 +vt 0.808190 0.560570 +vt 0.856580 0.665960 +vt 0.854110 0.626580 +vt 0.867420 0.628040 +vt 0.865550 0.589990 +vt 0.879470 0.592780 +vt 0.869290 0.666100 +vt 0.882010 0.666240 +vt 0.834860 0.662330 +vt 0.831070 0.625710 +vt 0.842590 0.626150 +vt 0.845720 0.664140 +vt 0.815780 0.719270 +vt 0.825320 0.690800 +vt 0.836450 0.698930 +vt 0.827190 0.733720 +vt 0.847590 0.707060 +vt 0.811270 0.825380 +vt 0.776730 0.834420 +vt 0.791850 0.798370 +vt 0.742200 0.843470 +vt 0.758760 0.809970 +vt 0.775330 0.776480 +vt 0.824940 0.786770 +vt 0.806970 0.762320 +vt 0.622680 0.883440 +vt 0.645720 0.867250 +vt 0.617670 0.868070 +vt 0.636930 0.852670 +vt 0.656190 0.837280 +vt 0.654510 0.881830 +vt 0.668760 0.851060 +vt 0.681340 0.864850 +vt 0.692330 0.836580 +vt 0.711770 0.854160 +vt 0.703320 0.808310 +vt 0.725540 0.823270 +vt 0.739320 0.792390 +vt 0.733190 0.869230 +vt 0.702410 0.878190 +vt 0.671630 0.887140 +vt 0.651470 0.898010 +vt 0.679750 0.822790 +vt 0.680280 0.836810 +vt 0.866320 0.750780 +vt 0.859960 0.786130 +vt 0.852460 0.749470 +vt 0.853610 0.821490 +vt 0.842450 0.786450 +vt 0.832440 0.823430 +vt 0.904180 0.756110 +vt 0.895860 0.789890 +vt 0.885250 0.753440 +vt 0.887540 0.823680 +vt 0.877910 0.788010 +vt 0.870570 0.822580 +vt 0.932970 0.829810 +vt 0.910250 0.826740 +vt 0.917040 0.792700 +vt 0.938230 0.795500 +vt 0.923840 0.758650 +vt 0.780490 0.967310 +vt 0.811900 0.957490 +vt 0.788000 0.980420 +vt 0.843320 0.947670 +vt 0.826930 0.968430 +vt 0.865860 0.956440 +vt 0.841950 0.979380 +vt 0.795510 0.993540 +vt 0.676030 0.997580 +vt 0.682250 0.987280 +vt 0.735120 0.983850 +vt 0.688470 0.976990 +vt 0.734480 0.972150 +vt 0.735770 0.995560 +vt 0.625260 0.993750 +vt 0.641000 0.982610 +vt 0.656740 0.971470 +vt 0.666510 0.960200 +vt 0.696550 0.965010 +vt 0.726800 0.955850 +vt 0.757050 0.946690 +vt 0.902620 0.898830 +vt 0.883990 0.888980 +vt 0.897120 0.857860 +vt 0.865360 0.879140 +vt 0.876450 0.851410 +vt 0.917790 0.864320 +vt 0.806280 0.909350 +vt 0.835820 0.894240 +vt 0.824800 0.928510 +vt 0.854390 0.908740 +vt 0.872970 0.923250 +vt 0.847520 0.871290 +vt 0.859050 0.846940 +vt 0.829690 0.863450 +vt 0.841650 0.842470 +vt 0.754050 0.885940 +vt 0.783920 0.876880 +vt 0.762000 0.901820 +vt 0.795100 0.893110 +vt 0.769940 0.917710 +vt 0.797590 0.851130 +vt 0.765390 0.860180 +vt 0.819620 0.846800 +vt 0.806800 0.870160 +vt 0.821310 0.882200 +vt 0.790920 0.937600 +vt 0.896850 0.932240 +vt 0.927850 0.908040 +vt 0.920740 0.941240 +vt 0.888400 0.965220 +vt 0.942190 0.873150 +vt 0.956530 0.838250 +vt 0.980090 0.846700 +vt 0.953090 0.917260 +vt 0.952130 0.674380 +vt 0.971760 0.676510 +vt 0.967820 0.721850 +vt 0.991400 0.678640 +vt 0.987820 0.725920 +vt 0.984250 0.773210 +vt 0.947810 0.717790 +vt 0.963870 0.767200 +vt 0.943500 0.761200 +vt 0.960200 0.802730 +vt 0.982170 0.809950 +vt 0.915350 0.671080 +vt 0.933740 0.672730 +vt 0.928790 0.715690 +vt 0.909760 0.713590 +vt 0.898680 0.668660 +vt 0.891960 0.711050 +vt 0.874160 0.708510 +vt 0.860880 0.707780 +vt 0.899050 0.596820 +vt 0.898860 0.632740 +vt 0.918630 0.600870 +vt 0.916990 0.635970 +vt 0.880740 0.629510 +vt 0.766430 0.188580 +vt 0.752710 0.198100 +vt 0.737930 0.190030 +vt 0.738990 0.207620 +vt 0.731170 0.202070 +vt 0.723350 0.196520 +vt 0.744700 0.178000 +vt 0.723160 0.181970 +vt 0.716880 0.198320 +vt 0.713980 0.184140 +vt 0.710420 0.200120 +vt 0.704810 0.186320 +vt 0.699200 0.172520 +vt 0.711090 0.169970 +vt 0.661360 0.159200 +vt 0.670690 0.154930 +vt 0.673520 0.169050 +vt 0.680030 0.150670 +vt 0.682420 0.165320 +vt 0.684810 0.179970 +vt 0.664630 0.172780 +vt 0.667900 0.186370 +vt 0.692000 0.176240 +vt 0.688960 0.157730 +vt 0.685920 0.139220 +vt 0.695510 0.150140 +vt 0.700620 0.063600 +vt 0.710110 0.058480 +vt 0.703540 0.087030 +vt 0.719610 0.053360 +vt 0.713060 0.081130 +vt 0.722580 0.075230 +vt 0.716000 0.103790 +vt 0.706460 0.110470 +vt 0.685670 0.091300 +vt 0.680850 0.108020 +vt 0.677820 0.076900 +vt 0.676030 0.124740 +vt 0.673050 0.100940 +vt 0.668290 0.124980 +vt 0.665260 0.093870 +vt 0.669980 0.062510 +vt 0.691670 0.028260 +vt 0.696140 0.045930 +vt 0.686980 0.061410 +vt 0.693140 0.077450 +vt 0.680820 0.045380 +vt 0.691820 0.127770 +vt 0.688740 0.109530 +vt 0.696140 0.098280 +vt 0.699140 0.119120 +vt 0.698850 0.025380 +vt 0.706030 0.022510 +vt 0.704480 0.041930 +vt 0.712820 0.037930 +vt 0.723770 0.127660 +vt 0.725550 0.097110 +vt 0.732820 0.116390 +vt 0.740100 0.135670 +vt 0.714720 0.138940 +vt 0.731540 0.151540 +vt 0.705110 0.144540 +vt 0.722980 0.167420 +vt 0.678030 0.137700 +vt 0.683380 0.123620 +vt 0.660550 0.125230 +vt 0.669490 0.139960 +vt 0.660950 0.142210 +vt 0.649530 0.077040 +vt 0.646270 0.103030 +vt 0.643010 0.129020 +vt 0.627280 0.112190 +vt 0.629080 0.091570 +vt 0.643420 0.144190 +vt 0.643840 0.159370 +vt 0.625900 0.146180 +vt 0.625480 0.132820 +vt 0.654030 0.187990 +vt 0.648930 0.173680 +vt 0.640160 0.189610 +vt 0.633240 0.174570 +vt 0.626320 0.159540 +vt 0.724490 0.305260 +vt 0.703610 0.298870 +vt 0.718740 0.287830 +vt 0.682730 0.292480 +vt 0.697380 0.282860 +vt 0.676020 0.277900 +vt 0.691150 0.266860 +vt 0.713000 0.270400 +vt 0.603960 0.160960 +vt 0.614080 0.177200 +vt 0.624210 0.193440 +vt 0.594930 0.179830 +vt 0.581610 0.162390 +vt 0.900950 0.119840 +vt 0.890080 0.149980 +vt 0.873660 0.154510 +vt 0.879220 0.180130 +vt 0.861030 0.191650 +vt 0.842850 0.203170 +vt 0.886290 0.117370 +vt 0.857240 0.159030 +vt 0.927680 0.211740 +vt 0.921930 0.245280 +vt 0.889290 0.235220 +vt 0.916190 0.278820 +vt 0.893080 0.270980 +vt 0.896870 0.306730 +vt 0.864230 0.296680 +vt 0.850910 0.258710 +vt 0.823420 0.352390 +vt 0.819360 0.321220 +vt 0.841800 0.308950 +vt 0.815310 0.290060 +vt 0.833110 0.274380 +vt 0.850490 0.343520 +vt 0.769240 0.309220 +vt 0.772410 0.332380 +vt 0.751010 0.329290 +vt 0.734740 0.347140 +vt 0.746860 0.307240 +vt 0.729610 0.326200 +vt 0.814060 0.254400 +vt 0.792180 0.263930 +vt 0.828450 0.228780 +vt 0.770310 0.273460 +vt 0.800980 0.242900 +vt 0.773510 0.257010 +vt 0.809780 0.221870 +vt 0.767280 0.168660 +vt 0.749410 0.160100 +vt 0.754120 0.142200 +vt 0.768140 0.148740 +vt 0.812600 0.151620 +vt 0.789510 0.170100 +vt 0.806460 0.139710 +vt 0.786870 0.154180 +vt 0.784230 0.138270 +vt 0.800330 0.127800 +vt 0.825010 0.170950 +vt 0.839490 0.139960 +vt 0.848360 0.149500 +vt 0.853970 0.108980 +vt 0.862800 0.111940 +vt 0.871640 0.114900 +vt 0.833930 0.187060 +vt 0.809530 0.110090 +vt 0.818730 0.092380 +vt 0.817130 0.118460 +vt 0.827790 0.097210 +vt 0.836860 0.102050 +vt 0.823630 0.071620 +vt 0.828540 0.050860 +vt 0.838110 0.042840 +vt 0.832950 0.070020 +vt 0.847690 0.034820 +vt 0.842270 0.068430 +vt 0.851460 0.067340 +vt 0.857500 0.029160 +vt 0.867320 0.023510 +vt 0.845410 0.105510 +vt 0.860640 0.066240 +vt 0.824730 0.126830 +vt 0.832110 0.133400 +vt 0.818800 0.161280 +vt 0.800110 0.193100 +vt 0.775220 0.215260 +vt 0.794810 0.181600 +vt 0.770820 0.201920 +vt 0.680730 0.226740 +vt 0.688670 0.218250 +vt 0.704720 0.237650 +vt 0.696610 0.209760 +vt 0.712580 0.226740 +vt 0.728550 0.243720 +vt 0.696860 0.248570 +vt 0.720770 0.257060 +vt 0.690710 0.194860 +vt 0.676350 0.183170 +vt 0.682510 0.200710 +vt 0.674310 0.206550 +vt 0.703510 0.204940 +vt 0.697760 0.190590 +vt 0.727430 0.207080 +vt 0.723690 0.212090 +vt 0.737980 0.215840 +vt 0.736970 0.224060 +vt 0.754400 0.208880 +vt 0.756090 0.219660 +vt 0.718130 0.219410 +vt 0.732760 0.233890 +vt 0.754360 0.230900 +vt 0.752630 0.242140 +vt 0.775960 0.227910 +vt 0.776710 0.240570 +vt 0.804940 0.207480 +vt 0.747140 0.257030 +vt 0.741650 0.271930 +vt 0.769770 0.291340 +vt 0.744260 0.289580 +vt 0.799500 0.353970 +vt 0.795890 0.326800 +vt 0.792270 0.299640 +vt 0.792230 0.281780 +vt 0.814680 0.272230 +vt 0.830780 0.251580 +vt 0.846880 0.230940 +vt 0.903450 0.195930 +vt 0.875160 0.213430 +vt 0.926800 0.168410 +vt 0.908440 0.159190 +vt 0.913430 0.122460 +vt 0.925920 0.125080 +vt 0.932440 0.028580 +vt 0.929180 0.076830 +vt 0.920550 0.026100 +vt 0.916990 0.074280 +vt 0.908670 0.023620 +vt 0.947100 0.134870 +vt 0.937390 0.173300 +vt 0.933560 0.157230 +vt 0.936510 0.129970 +vt 0.973090 0.033240 +vt 0.970960 0.091430 +vt 0.960400 0.087420 +vt 0.968840 0.149630 +vt 0.957970 0.142250 +vt 0.962830 0.032590 +vt 0.952580 0.031940 +vt 0.949840 0.083400 +vt 0.942510 0.030260 +vt 0.939510 0.080110 +vt 0.870000 0.066110 +vt 0.877190 0.020280 +vt 0.887070 0.017050 +vt 0.879350 0.065970 +vt 0.904810 0.071730 +vt 0.892080 0.068850 +vt 0.897870 0.020330 +vt 0.981880 0.155610 +vt 0.982430 0.043200 +vt 0.982160 0.099400 +vt 0.993350 0.107380 +vt 0.994930 0.161600 +vt 0.960860 0.230580 +vt 0.964850 0.190100 +vt 0.979370 0.199770 +vt 0.993890 0.209440 +vt 0.976850 0.243930 +vt 0.992850 0.257280 +vt 0.951120 0.181700 +vt 0.944270 0.221160 +vt 0.960410 0.294440 +vt 0.938300 0.286630 +vt 0.960630 0.262510 +vt 0.941280 0.253890 +vt 0.528590 0.166570 +vt 0.528180 0.179020 +vt 0.514290 0.162920 +vt 0.527770 0.191480 +vt 0.514080 0.174710 +vt 0.513880 0.186510 +vt 0.499990 0.170400 +vt 0.499990 0.159270 +vt 0.563820 0.183010 +vt 0.561200 0.195480 +vt 0.544690 0.187250 +vt 0.558590 0.207960 +vt 0.543180 0.199720 +vt 0.546200 0.174790 +vt 0.551280 0.163950 +vt 0.529840 0.155210 +vt 0.556350 0.153120 +vt 0.572710 0.172700 +vt 0.569730 0.202810 +vt 0.575310 0.200240 +vt 0.572690 0.212710 +vt 0.586800 0.217470 +vt 0.608260 0.197280 +vt 0.585120 0.190030 +vt 0.597530 0.207370 +vt 0.616900 0.284960 +vt 0.634900 0.298290 +vt 0.623730 0.311740 +vt 0.652900 0.311620 +vt 0.642600 0.325330 +vt 0.661470 0.338920 +vt 0.709660 0.319440 +vt 0.715720 0.340010 +vt 0.696710 0.332890 +vt 0.689720 0.312680 +vt 0.703230 0.358710 +vt 0.722060 0.365160 +vt 0.674800 0.322250 +vt 0.682350 0.348810 +vt 0.641210 0.272470 +vt 0.661970 0.282470 +vt 0.647050 0.292040 +vt 0.668380 0.302360 +vt 0.612080 0.244700 +vt 0.626640 0.258580 +vt 0.614490 0.264830 +vt 0.630770 0.278430 +vt 0.600930 0.252020 +vt 0.602430 0.272950 +vt 0.587970 0.260950 +vt 0.599440 0.231080 +vt 0.587380 0.239210 +vt 0.641620 0.262320 +vt 0.658820 0.270110 +vt 0.642030 0.252170 +vt 0.655670 0.257740 +vt 0.669310 0.263320 +vt 0.679890 0.247680 +vt 0.662910 0.246800 +vt 0.656520 0.230280 +vt 0.668620 0.228510 +vt 0.648340 0.209940 +vt 0.632980 0.211180 +vt 0.641750 0.228930 +vt 0.617620 0.212430 +vt 0.661320 0.208250 +vt 0.648710 0.243330 +vt 0.634510 0.239870 +vt 0.626990 0.227580 +vt 0.619530 0.236140 +vt 0.630570 0.249230 +vt 0.608530 0.221750 +vt 0.560850 0.243070 +vt 0.559720 0.225510 +vt 0.573550 0.232360 +vt 0.574410 0.252010 +vt 0.542630 0.329090 +vt 0.537390 0.313340 +vt 0.548450 0.313630 +vt 0.532160 0.297590 +vt 0.535510 0.290730 +vt 0.538860 0.283870 +vt 0.561390 0.336530 +vt 0.559510 0.313920 +vt 0.499990 0.283880 +vt 0.516070 0.290730 +vt 0.499990 0.298270 +vt 0.518690 0.305800 +vt 0.521310 0.320870 +vt 0.499990 0.312660 +vt 0.519420 0.273060 +vt 0.517750 0.281900 +vt 0.499990 0.273070 +vt 0.499990 0.262260 +vt 0.536810 0.253910 +vt 0.534090 0.237550 +vt 0.549660 0.250850 +vt 0.531380 0.221190 +vt 0.546110 0.232130 +vt 0.553210 0.269580 +vt 0.565230 0.264160 +vt 0.598750 0.311540 +vt 0.593360 0.286240 +vt 0.608540 0.298990 +vt 0.614650 0.325030 +vt 0.616310 0.378710 +vt 0.607530 0.345120 +vt 0.624960 0.361240 +vt 0.635270 0.397450 +vt 0.569610 0.285260 +vt 0.579290 0.275200 +vt 0.584180 0.298400 +vt 0.580160 0.343980 +vt 0.574880 0.314620 +vt 0.591200 0.329870 +vt 0.598230 0.361340 +vt 0.537830 0.268890 +vt 0.556360 0.291750 +vt 0.518910 0.259150 +vt 0.499990 0.249410 +vt 0.499990 0.236570 +vt 0.499990 0.222000 +vt 0.518400 0.245240 +vt 0.499990 0.207430 +vt 0.517040 0.229770 +vt 0.515680 0.214310 +vt 0.529570 0.206330 +vt 0.544640 0.215920 +vt 0.499990 0.194480 +vt 0.514780 0.200410 +vt 0.499990 0.181540 +vt 0.514910 0.151700 +vt 0.499990 0.148200 +vt 0.515540 0.140490 +vt 0.531100 0.143850 +vt 0.532320 0.130550 +vt 0.499990 0.137140 +vt 0.516150 0.127900 +vt 0.499990 0.125250 +vt 0.516770 0.115300 +vt 0.533550 0.117250 +vt 0.557030 0.138630 +vt 0.581730 0.146720 +vt 0.557700 0.124150 +vt 0.603700 0.093070 +vt 0.603680 0.112500 +vt 0.603670 0.131940 +vt 0.580090 0.112820 +vt 0.578320 0.094580 +vt 0.603810 0.146450 +vt 0.581860 0.131060 +vt 0.555550 0.091350 +vt 0.556620 0.107750 +vt 0.533160 0.102680 +vt 0.532780 0.088120 +vt 0.516570 0.101920 +vt 0.499990 0.113360 +vt 0.516380 0.088530 +vt 0.499990 0.088950 +vt 0.592500 0.889240 +vt 0.605080 0.878650 +vt 0.597380 0.902280 +vt 0.610030 0.892860 +vt 0.602260 0.915330 +vt 0.562530 0.935480 +vt 0.577720 0.930710 +vt 0.571260 0.945050 +vt 0.586280 0.938940 +vt 0.555770 0.910940 +vt 0.570500 0.905540 +vt 0.559150 0.923210 +vt 0.574110 0.918120 +vt 0.589990 0.923020 +vt 0.598250 0.931320 +vt 0.581500 0.897390 +vt 0.585740 0.910200 +vt 0.886420 0.442260 +vt 0.918920 0.450490 +vt 0.896010 0.477960 +vt 0.951430 0.458720 +vt 0.923250 0.484160 +vt 0.950490 0.490370 +vt 0.927580 0.517840 +vt 0.905610 0.513660 +vt 0.867840 0.549350 +vt 0.891450 0.553060 +vt 0.895250 0.574940 +vt 0.915060 0.556780 +vt 0.916840 0.578820 +vt 0.873650 0.571060 +vt 0.852280 0.545680 +vt 0.858920 0.567840 +vt 0.835480 0.505090 +vt 0.857500 0.507590 +vt 0.843880 0.525390 +vt 0.862670 0.528470 +vt 0.881550 0.510620 +vt 0.886500 0.531840 +vt 0.910330 0.535220 +vt 0.784840 0.418990 +vt 0.802850 0.415730 +vt 0.807120 0.439610 +vt 0.827620 0.430780 +vt 0.825520 0.391580 +vt 0.801180 0.384850 +vt 0.853750 0.390020 +vt 0.877560 0.334650 +vt 0.857020 0.436520 +vt 0.881990 0.388450 +vt 0.821300 0.472350 +vt 0.842560 0.469180 +vt 0.869280 0.473570 +vt 0.938140 0.605950 +vt 0.935940 0.639340 +vt 0.957660 0.611040 +vt 0.954890 0.642710 +vt 0.935080 0.561960 +vt 0.936610 0.583960 +vt 0.955100 0.567150 +vt 0.956380 0.589090 +vt 0.976290 0.613370 +vt 0.974030 0.644940 +vt 0.994930 0.615710 +vt 0.993160 0.647170 +vt 0.949550 0.522030 +vt 0.971140 0.526710 +vt 0.952320 0.544590 +vt 0.992740 0.531390 +vt 0.992290 0.553360 +vt 0.972310 0.548970 +vt 0.991850 0.575340 +vt 0.973470 0.571240 +vt 0.974880 0.592310 +vt 0.993390 0.595520 +vt 0.931330 0.539900 +vt 0.927860 0.318490 +vt 0.917420 0.350360 +vt 0.958850 0.330250 +vt 0.957290 0.366070 +vt 0.975170 0.374560 +vt 0.954360 0.412390 +vt 0.993060 0.383050 +vt 0.992600 0.424510 +vt 0.973480 0.418450 +vt 0.992140 0.465980 +vt 0.918170 0.400420 +vt 0.992900 0.312530 +vt 0.976650 0.303480 +vt 0.992870 0.284900 +vt 0.976750 0.273700 +vt 0.975910 0.339020 +vt 0.992980 0.347790 +vt 0.971780 0.462350 +vt 0.971460 0.494530 +vt 0.992440 0.498680 +vt 0.738190 0.740860 +vt 0.758390 0.741310 +vt 0.720750 0.774580 +vt 0.778600 0.741760 +vt 0.776960 0.759120 +vt 0.748860 0.766850 +vt 0.797190 0.730510 +vt 0.802080 0.746420 +vt 0.252950 0.396090 +vt 0.237420 0.398380 +vt 0.259090 0.371610 +vt 0.221890 0.400680 +vt 0.241110 0.374860 +vt 0.223140 0.378110 +vt 0.244810 0.351340 +vt 0.265240 0.347140 +vt 0.381790 0.932060 +vt 0.373410 0.925500 +vt 0.389750 0.923690 +vt 0.365040 0.918940 +vt 0.379210 0.916280 +vt 0.368660 0.908870 +vt 0.385000 0.907070 +vt 0.397720 0.915330 +vt 0.352030 0.944840 +vt 0.323690 0.948930 +vt 0.313170 0.938080 +vt 0.295350 0.953030 +vt 0.280860 0.939550 +vt 0.266370 0.926070 +vt 0.345480 0.936620 +vt 0.302650 0.927240 +vt 0.338060 0.909440 +vt 0.351550 0.914190 +vt 0.338500 0.918920 +vt 0.355950 0.922210 +vt 0.360360 0.930230 +vt 0.275790 0.895000 +vt 0.306920 0.902220 +vt 0.271080 0.910530 +vt 0.304790 0.914730 +vt 0.338940 0.928410 +vt 0.369470 0.938120 +vt 0.393460 0.939620 +vt 0.405140 0.947180 +vt 0.378580 0.946010 +vt 0.391740 0.955000 +vt 0.419980 0.954610 +vt 0.434830 0.962050 +vt 0.363500 0.955390 +vt 0.404900 0.964000 +vt 0.374970 0.965950 +vt 0.433810 0.973820 +vt 0.467410 0.969700 +vt 0.400220 0.977930 +vt 0.462730 0.983640 +vt 0.458940 0.916340 +vt 0.479460 0.917940 +vt 0.455780 0.928300 +vt 0.477880 0.929610 +vt 0.476310 0.941280 +vt 0.452630 0.940260 +vt 0.443730 0.951150 +vt 0.471860 0.955490 +vt 0.276470 0.524280 +vt 0.262600 0.522570 +vt 0.273120 0.508950 +vt 0.248730 0.520870 +vt 0.258460 0.508870 +vt 0.268200 0.496880 +vt 0.287770 0.509030 +vt 0.283640 0.495330 +vt 0.267660 0.444340 +vt 0.278940 0.414440 +vt 0.298650 0.406400 +vt 0.290220 0.384540 +vt 0.310070 0.375380 +vt 0.329930 0.366220 +vt 0.287230 0.437420 +vt 0.318370 0.398360 +vt 0.213350 0.448440 +vt 0.233150 0.422260 +vt 0.256040 0.418350 +vt 0.271580 0.390310 +vt 0.240500 0.446390 +vt 0.186520 0.502600 +vt 0.199930 0.475520 +vt 0.225550 0.472550 +vt 0.210600 0.498720 +vt 0.251170 0.469590 +vt 0.234680 0.494850 +vt 0.269330 0.466640 +vt 0.306810 0.430510 +vt 0.251440 0.495860 +vt 0.287500 0.463690 +vt 0.337970 0.387860 +vt 0.349670 0.352370 +vt 0.369420 0.338530 +vt 0.326270 0.423350 +vt 0.357580 0.377360 +vt 0.299080 0.493780 +vt 0.304950 0.459340 +vt 0.322410 0.454980 +vt 0.345740 0.416190 +vt 0.222770 0.513440 +vt 0.240620 0.511160 +vt 0.210870 0.532040 +vt 0.163250 0.542020 +vt 0.174880 0.522310 +vt 0.198830 0.517870 +vt 0.187060 0.537030 +vt 0.172700 0.589100 +vt 0.160520 0.588150 +vt 0.191780 0.560570 +vt 0.148340 0.587210 +vt 0.173790 0.562590 +vt 0.155790 0.564610 +vt 0.120510 0.592780 +vt 0.134420 0.589990 +vt 0.132550 0.628040 +vt 0.145870 0.626580 +vt 0.143400 0.665960 +vt 0.119240 0.629510 +vt 0.130680 0.666100 +vt 0.157390 0.626150 +vt 0.168910 0.625710 +vt 0.154260 0.664140 +vt 0.152380 0.707060 +vt 0.165120 0.662330 +vt 0.163520 0.698930 +vt 0.174660 0.690800 +vt 0.172780 0.733720 +vt 0.161370 0.748170 +vt 0.224650 0.776480 +vt 0.241210 0.809970 +vt 0.193010 0.762320 +vt 0.257780 0.843470 +vt 0.208120 0.798370 +vt 0.223240 0.834420 +vt 0.175040 0.786770 +vt 0.343790 0.837280 +vt 0.363050 0.852670 +vt 0.331210 0.851060 +vt 0.382310 0.868070 +vt 0.354250 0.867250 +vt 0.377300 0.883440 +vt 0.345460 0.881830 +vt 0.318640 0.864850 +vt 0.260650 0.792390 +vt 0.274430 0.823270 +vt 0.296660 0.808310 +vt 0.307650 0.836580 +vt 0.288210 0.854160 +vt 0.328350 0.887140 +vt 0.297560 0.878190 +vt 0.266780 0.869230 +vt 0.372290 0.898810 +vt 0.348500 0.898010 +vt 0.319690 0.836810 +vt 0.320220 0.822790 +vt 0.188710 0.825380 +vt 0.167540 0.823430 +vt 0.157520 0.786450 +vt 0.146370 0.821490 +vt 0.140010 0.786130 +vt 0.133660 0.750780 +vt 0.129400 0.822580 +vt 0.122060 0.788010 +vt 0.112440 0.823680 +vt 0.104120 0.789890 +vt 0.095800 0.756110 +vt 0.114730 0.753440 +vt 0.076140 0.758650 +vt 0.082930 0.792700 +vt 0.089720 0.826740 +vt 0.061740 0.795500 +vt 0.056480 0.761200 +vt 0.111580 0.965220 +vt 0.134120 0.956440 +vt 0.173050 0.968430 +vt 0.156660 0.947670 +vt 0.188070 0.957490 +vt 0.219490 0.967310 +vt 0.158020 0.979380 +vt 0.211980 0.980420 +vt 0.265500 0.972150 +vt 0.311510 0.976990 +vt 0.264850 0.983850 +vt 0.317730 0.987280 +vt 0.323950 0.997580 +vt 0.264210 0.995560 +vt 0.343240 0.971470 +vt 0.358970 0.982610 +vt 0.425480 0.989920 +vt 0.374710 0.993750 +vt 0.303430 0.965010 +vt 0.333460 0.960200 +vt 0.242930 0.946690 +vt 0.273180 0.955850 +vt 0.123530 0.851410 +vt 0.134620 0.879140 +vt 0.102850 0.857860 +vt 0.115990 0.888980 +vt 0.082180 0.864320 +vt 0.067010 0.829810 +vt 0.097360 0.898830 +vt 0.145580 0.908740 +vt 0.164160 0.894240 +vt 0.193700 0.909350 +vt 0.127010 0.923250 +vt 0.175180 0.928510 +vt 0.158330 0.842470 +vt 0.170290 0.863450 +vt 0.140930 0.846940 +vt 0.152450 0.871290 +vt 0.204880 0.893110 +vt 0.237980 0.901820 +vt 0.216060 0.876880 +vt 0.245920 0.885940 +vt 0.230030 0.917710 +vt 0.234580 0.860180 +vt 0.202380 0.851130 +vt 0.193170 0.870160 +vt 0.180350 0.846800 +vt 0.178660 0.882200 +vt 0.209050 0.937600 +vt 0.046890 0.917260 +vt 0.072120 0.908040 +vt 0.103120 0.932240 +vt 0.079230 0.941240 +vt 0.019890 0.846700 +vt 0.043450 0.838250 +vt 0.057780 0.873150 +vt 0.033390 0.881980 +vt 0.015730 0.773210 +vt 0.012150 0.725920 +vt 0.032160 0.721850 +vt 0.008580 0.678640 +vt 0.028210 0.676510 +vt 0.047850 0.674380 +vt 0.036100 0.767200 +vt 0.052160 0.717790 +vt 0.017810 0.809950 +vt 0.039770 0.802730 +vt 0.071190 0.715690 +vt 0.066240 0.672730 +vt 0.090210 0.713590 +vt 0.084630 0.671080 +vt 0.108010 0.711050 +vt 0.101300 0.668660 +vt 0.125810 0.708510 +vt 0.147510 0.749470 +vt 0.117970 0.666240 +vt 0.139100 0.707780 +vt 0.082990 0.635970 +vt 0.081350 0.600870 +vt 0.101110 0.632740 +vt 0.100930 0.596820 +vt 0.276630 0.196520 +vt 0.268810 0.202070 +vt 0.276810 0.181970 +vt 0.260990 0.207620 +vt 0.262040 0.190030 +vt 0.247270 0.198100 +vt 0.255270 0.178000 +vt 0.277000 0.167420 +vt 0.300780 0.172520 +vt 0.295170 0.186320 +vt 0.288890 0.169970 +vt 0.289560 0.200120 +vt 0.285990 0.184140 +vt 0.283090 0.198320 +vt 0.315170 0.179970 +vt 0.317560 0.165320 +vt 0.323620 0.183170 +vt 0.319950 0.150670 +vt 0.326450 0.169050 +vt 0.329280 0.154930 +vt 0.335350 0.172780 +vt 0.332080 0.186370 +vt 0.308160 0.127770 +vt 0.314050 0.139220 +vt 0.311010 0.157730 +vt 0.304470 0.150140 +vt 0.307970 0.176240 +vt 0.274430 0.097110 +vt 0.277400 0.075230 +vt 0.286920 0.081130 +vt 0.280370 0.053360 +vt 0.289860 0.058480 +vt 0.299360 0.063600 +vt 0.283970 0.103790 +vt 0.296440 0.087030 +vt 0.339430 0.125230 +vt 0.331690 0.124980 +vt 0.326920 0.100940 +vt 0.323950 0.124740 +vt 0.319130 0.108020 +vt 0.314310 0.091300 +vt 0.334710 0.093870 +vt 0.322150 0.076900 +vt 0.306830 0.077450 +vt 0.312990 0.061410 +vt 0.303830 0.045930 +vt 0.319150 0.045380 +vt 0.330000 0.062510 +vt 0.303830 0.098280 +vt 0.311230 0.109530 +vt 0.300840 0.119120 +vt 0.293520 0.110470 +vt 0.287160 0.037930 +vt 0.295490 0.041930 +vt 0.293950 0.022510 +vt 0.301130 0.025380 +vt 0.308310 0.028260 +vt 0.259880 0.135670 +vt 0.267150 0.116390 +vt 0.268440 0.151540 +vt 0.276200 0.127660 +vt 0.285260 0.138940 +vt 0.294860 0.144540 +vt 0.321950 0.137700 +vt 0.316590 0.123620 +vt 0.330480 0.139960 +vt 0.339020 0.142210 +vt 0.338620 0.159200 +vt 0.374500 0.132820 +vt 0.356960 0.129020 +vt 0.353700 0.103030 +vt 0.372700 0.112190 +vt 0.350450 0.077040 +vt 0.373660 0.159540 +vt 0.356140 0.159370 +vt 0.356550 0.144190 +vt 0.374080 0.146180 +vt 0.366740 0.174570 +vt 0.359820 0.189610 +vt 0.351040 0.173680 +vt 0.345950 0.187990 +vt 0.330670 0.263320 +vt 0.323960 0.277900 +vt 0.302590 0.282860 +vt 0.317250 0.292480 +vt 0.296370 0.298870 +vt 0.275490 0.305260 +vt 0.308820 0.266860 +vt 0.281230 0.287830 +vt 0.391720 0.197280 +vt 0.375770 0.193440 +vt 0.385890 0.177200 +vt 0.405040 0.179830 +vt 0.396010 0.160960 +vt 0.157130 0.203170 +vt 0.138940 0.191650 +vt 0.142730 0.159030 +vt 0.120760 0.180130 +vt 0.109890 0.149980 +vt 0.126310 0.154510 +vt 0.113680 0.117370 +vt 0.128340 0.114900 +vt 0.122420 0.334650 +vt 0.103100 0.306730 +vt 0.106890 0.270980 +vt 0.083790 0.278820 +vt 0.078040 0.245280 +vt 0.072300 0.211740 +vt 0.135740 0.296680 +vt 0.110680 0.235220 +vt 0.149070 0.258710 +vt 0.166870 0.274380 +vt 0.158180 0.308950 +vt 0.184670 0.290060 +vt 0.180610 0.321220 +vt 0.149490 0.343520 +vt 0.270360 0.326200 +vt 0.224390 0.355550 +vt 0.248960 0.329290 +vt 0.227560 0.332380 +vt 0.253110 0.307240 +vt 0.223270 0.240570 +vt 0.226470 0.257010 +vt 0.198990 0.242900 +vt 0.229670 0.273460 +vt 0.207790 0.263930 +vt 0.185920 0.254400 +vt 0.190200 0.221870 +vt 0.171520 0.228780 +vt 0.250560 0.160100 +vt 0.233550 0.188580 +vt 0.245860 0.142200 +vt 0.232690 0.168660 +vt 0.231840 0.148740 +vt 0.213100 0.154180 +vt 0.210460 0.170100 +vt 0.187380 0.151620 +vt 0.215740 0.138270 +vt 0.193510 0.139710 +vt 0.137170 0.111940 +vt 0.146010 0.108980 +vt 0.151610 0.149500 +vt 0.160490 0.139960 +vt 0.166050 0.187060 +vt 0.163120 0.102050 +vt 0.172180 0.097210 +vt 0.175250 0.126830 +vt 0.181250 0.092380 +vt 0.190450 0.110090 +vt 0.182850 0.118460 +vt 0.199650 0.127800 +vt 0.152290 0.034820 +vt 0.161860 0.042840 +vt 0.157700 0.068430 +vt 0.171440 0.050860 +vt 0.176340 0.071620 +vt 0.167020 0.070020 +vt 0.132660 0.023510 +vt 0.142470 0.029160 +vt 0.139330 0.066240 +vt 0.148520 0.067340 +vt 0.154560 0.105510 +vt 0.167870 0.133400 +vt 0.181170 0.161280 +vt 0.174970 0.170950 +vt 0.229150 0.201920 +vt 0.205160 0.181600 +vt 0.224760 0.215260 +vt 0.199860 0.193100 +vt 0.271430 0.243720 +vt 0.287400 0.226740 +vt 0.279200 0.257060 +vt 0.303370 0.209760 +vt 0.295250 0.237650 +vt 0.311310 0.218250 +vt 0.303110 0.248570 +vt 0.286980 0.270400 +vt 0.319250 0.226740 +vt 0.317460 0.200710 +vt 0.309270 0.194860 +vt 0.325660 0.206550 +vt 0.302220 0.190590 +vt 0.296460 0.204940 +vt 0.262000 0.215840 +vt 0.272540 0.207080 +vt 0.276280 0.212090 +vt 0.263010 0.224060 +vt 0.245570 0.208880 +vt 0.267220 0.233890 +vt 0.281840 0.219410 +vt 0.243880 0.219660 +vt 0.224010 0.227910 +vt 0.245610 0.230900 +vt 0.247350 0.242140 +vt 0.195030 0.207480 +vt 0.252830 0.257030 +vt 0.258320 0.271930 +vt 0.230740 0.309220 +vt 0.255720 0.289580 +vt 0.230200 0.291340 +vt 0.204090 0.326800 +vt 0.200470 0.353970 +vt 0.176560 0.352390 +vt 0.207700 0.299640 +vt 0.185290 0.272230 +vt 0.207750 0.281780 +vt 0.169190 0.251580 +vt 0.153100 0.230940 +vt 0.096530 0.195930 +vt 0.124810 0.213430 +vt 0.099030 0.119840 +vt 0.091530 0.159190 +vt 0.086540 0.122460 +vt 0.073180 0.168410 +vt 0.095170 0.071730 +vt 0.074060 0.125080 +vt 0.082980 0.074280 +vt 0.070800 0.076830 +vt 0.079420 0.026100 +vt 0.091310 0.023620 +vt 0.062590 0.173300 +vt 0.066410 0.157230 +vt 0.052880 0.134870 +vt 0.063470 0.129970 +vt 0.042010 0.142250 +vt 0.050140 0.083400 +vt 0.031140 0.149630 +vt 0.029010 0.091430 +vt 0.039570 0.087420 +vt 0.026890 0.033240 +vt 0.047400 0.031940 +vt 0.060470 0.080110 +vt 0.057470 0.030260 +vt 0.067540 0.028580 +vt 0.112910 0.017050 +vt 0.122780 0.020280 +vt 0.120620 0.065970 +vt 0.129980 0.066110 +vt 0.107890 0.068850 +vt 0.102110 0.020330 +vt 0.008200 0.053160 +vt 0.017540 0.043200 +vt 0.006620 0.107380 +vt 0.017820 0.099400 +vt 0.018090 0.155610 +vt 0.005050 0.161600 +vt 0.020610 0.199770 +vt 0.035130 0.190100 +vt 0.039120 0.230580 +vt 0.006090 0.209440 +vt 0.023120 0.243930 +vt 0.048860 0.181700 +vt 0.055710 0.221160 +vt 0.058690 0.253890 +vt 0.061680 0.286630 +vt 0.039570 0.294440 +vt 0.039340 0.262510 +vt 0.486100 0.186510 +vt 0.472210 0.191480 +vt 0.485890 0.174710 +vt 0.471800 0.179020 +vt 0.471390 0.166570 +vt 0.485690 0.162920 +vt 0.456800 0.199720 +vt 0.441390 0.207960 +vt 0.455280 0.187250 +vt 0.438770 0.195480 +vt 0.453770 0.174790 +vt 0.468880 0.143850 +vt 0.470130 0.155210 +vt 0.448700 0.163950 +vt 0.436160 0.183010 +vt 0.443620 0.153120 +vt 0.418370 0.162390 +vt 0.430240 0.202810 +vt 0.427280 0.212710 +vt 0.424670 0.200240 +vt 0.413180 0.217470 +vt 0.402450 0.207370 +vt 0.414850 0.190030 +vt 0.427260 0.172700 +vt 0.338500 0.338920 +vt 0.357370 0.325330 +vt 0.347080 0.311620 +vt 0.365080 0.298290 +vt 0.383080 0.284960 +vt 0.376250 0.311740 +vt 0.303270 0.332890 +vt 0.284250 0.340010 +vt 0.310260 0.312680 +vt 0.290310 0.319440 +vt 0.277920 0.365160 +vt 0.296740 0.358710 +vt 0.317620 0.348810 +vt 0.325170 0.322250 +vt 0.331590 0.302360 +vt 0.338010 0.282470 +vt 0.358770 0.272470 +vt 0.352920 0.292040 +vt 0.369200 0.278430 +vt 0.373330 0.258580 +vt 0.387900 0.244700 +vt 0.385490 0.264830 +vt 0.412010 0.260950 +vt 0.397540 0.272950 +vt 0.412590 0.239210 +vt 0.399040 0.252020 +vt 0.400540 0.231080 +vt 0.344310 0.257740 +vt 0.357950 0.252170 +vt 0.341160 0.270110 +vt 0.358360 0.262320 +vt 0.343460 0.230280 +vt 0.337060 0.246800 +vt 0.331350 0.228510 +vt 0.320090 0.247680 +vt 0.372990 0.227580 +vt 0.358220 0.228930 +vt 0.366990 0.211180 +vt 0.351640 0.209940 +vt 0.382350 0.212430 +vt 0.338650 0.208250 +vt 0.365470 0.239870 +vt 0.351260 0.243330 +vt 0.369400 0.249230 +vt 0.380440 0.236140 +vt 0.391440 0.221750 +vt 0.426420 0.232360 +vt 0.440260 0.225510 +vt 0.425570 0.252010 +vt 0.461120 0.283870 +vt 0.464470 0.290730 +vt 0.440470 0.313920 +vt 0.467820 0.297590 +vt 0.451520 0.313630 +vt 0.462580 0.313340 +vt 0.438580 0.336530 +vt 0.419820 0.343980 +vt 0.457350 0.329090 +vt 0.481280 0.305800 +vt 0.483900 0.290730 +vt 0.478670 0.320870 +vt 0.482230 0.281900 +vt 0.439130 0.243070 +vt 0.453860 0.232130 +vt 0.434750 0.264160 +vt 0.468600 0.221190 +vt 0.450310 0.250850 +vt 0.465880 0.237550 +vt 0.446770 0.269580 +vt 0.430370 0.285260 +vt 0.391430 0.298990 +vt 0.406620 0.286240 +vt 0.385320 0.325030 +vt 0.401230 0.311540 +vt 0.375010 0.361240 +vt 0.392450 0.345120 +vt 0.364700 0.397450 +vt 0.420680 0.275200 +vt 0.415800 0.298400 +vt 0.408770 0.329870 +vt 0.425090 0.314620 +vt 0.401740 0.361340 +vt 0.383670 0.378710 +vt 0.463170 0.253910 +vt 0.443620 0.291750 +vt 0.462140 0.268890 +vt 0.481060 0.259150 +vt 0.480550 0.273060 +vt 0.481580 0.245240 +vt 0.484290 0.214310 +vt 0.482930 0.229770 +vt 0.455330 0.215920 +vt 0.470400 0.206330 +vt 0.485190 0.200410 +vt 0.484430 0.140490 +vt 0.485060 0.151700 +vt 0.483820 0.127900 +vt 0.483210 0.115300 +vt 0.467650 0.130550 +vt 0.466430 0.117250 +vt 0.442950 0.138630 +vt 0.418240 0.146720 +vt 0.442270 0.124150 +vt 0.418120 0.131060 +vt 0.396310 0.131940 +vt 0.396290 0.112500 +vt 0.370900 0.091570 +vt 0.419890 0.112820 +vt 0.421660 0.094580 +vt 0.396160 0.146450 +vt 0.466810 0.102680 +vt 0.443350 0.107750 +vt 0.444430 0.091350 +vt 0.467200 0.088120 +vt 0.499990 0.101150 +vt 0.483400 0.101920 +vt 0.483590 0.088530 +vt 0.389950 0.892860 +vt 0.394890 0.878650 +vt 0.407480 0.889240 +vt 0.402600 0.902280 +vt 0.413700 0.938940 +vt 0.428710 0.945050 +vt 0.422260 0.930710 +vt 0.437440 0.935480 +vt 0.425870 0.918120 +vt 0.440820 0.923210 +vt 0.429480 0.905540 +vt 0.444210 0.910940 +vt 0.401720 0.931320 +vt 0.409990 0.923020 +vt 0.414230 0.910200 +vt 0.418480 0.897390 +vt 0.050430 0.522030 +vt 0.049490 0.490370 +vt 0.076720 0.484160 +vt 0.048550 0.458720 +vt 0.081050 0.450490 +vt 0.113560 0.442260 +vt 0.072400 0.517840 +vt 0.103960 0.477960 +vt 0.083130 0.578820 +vt 0.084920 0.556780 +vt 0.108530 0.553060 +vt 0.104730 0.574940 +vt 0.126320 0.571060 +vt 0.141060 0.567840 +vt 0.132140 0.549350 +vt 0.147690 0.545680 +vt 0.137310 0.528470 +vt 0.156090 0.525390 +vt 0.142480 0.507590 +vt 0.164500 0.505090 +vt 0.089640 0.535220 +vt 0.113470 0.531840 +vt 0.094370 0.513660 +vt 0.118420 0.510620 +vt 0.172360 0.430780 +vt 0.197120 0.415730 +vt 0.215130 0.418990 +vt 0.192850 0.439610 +vt 0.198800 0.384850 +vt 0.174460 0.391580 +vt 0.146220 0.390020 +vt 0.142960 0.436520 +vt 0.117990 0.388450 +vt 0.157420 0.469180 +vt 0.178670 0.472350 +vt 0.130690 0.473570 +vt 0.045080 0.642710 +vt 0.064030 0.639340 +vt 0.042320 0.611040 +vt 0.061830 0.605950 +vt 0.043600 0.589090 +vt 0.063360 0.583960 +vt 0.044880 0.567150 +vt 0.064900 0.561960 +vt 0.006810 0.647170 +vt 0.025950 0.644940 +vt 0.005050 0.615710 +vt 0.023680 0.613370 +vt 0.008130 0.575340 +vt 0.007680 0.553360 +vt 0.026500 0.571240 +vt 0.007240 0.531390 +vt 0.027670 0.548970 +vt 0.028830 0.526710 +vt 0.047650 0.544590 +vt 0.006590 0.595520 +vt 0.025090 0.592310 +vt 0.068650 0.539900 +vt 0.041130 0.330250 +vt 0.072110 0.318490 +vt 0.082550 0.350360 +vt 0.042690 0.366070 +vt 0.007840 0.465980 +vt 0.007380 0.424510 +vt 0.028190 0.462350 +vt 0.006920 0.383050 +vt 0.026500 0.418450 +vt 0.024800 0.374560 +vt 0.045620 0.412390 +vt 0.081800 0.400420 +vt 0.023220 0.273700 +vt 0.023320 0.303480 +vt 0.007100 0.284900 +vt 0.007130 0.257280 +vt 0.007080 0.312530 +vt 0.007000 0.347790 +vt 0.024060 0.339020 +vt 0.007540 0.498680 +vt 0.028510 0.494530 +vt 0.223010 0.759120 +vt 0.221380 0.741760 +vt 0.251120 0.766850 +vt 0.241580 0.741310 +vt 0.261790 0.740860 +vt 0.184200 0.719270 +vt 0.202790 0.730510 +vt 0.197900 0.746420 +vt 0.596340 0.039510 +vt 0.596020 0.045440 +vt 0.598230 0.042860 +vt 0.595710 0.051380 +vt 0.597910 0.048790 +vt 0.597390 0.045700 +vt 0.600120 0.046210 +vt 0.587750 0.056100 +vt 0.589210 0.045600 +vt 0.586280 0.045480 +vt 0.590680 0.035100 +vt 0.587740 0.034030 +vt 0.584810 0.032970 +vt 0.584810 0.056940 +vt 0.583340 0.045370 +vt 0.611020 0.066450 +vt 0.599380 0.061270 +vt 0.596130 0.062640 +vt 0.581880 0.057780 +vt 0.607450 0.068350 +vt 0.592880 0.064010 +vt 0.622130 0.057010 +vt 0.608920 0.054190 +vt 0.604150 0.057730 +vt 0.591730 0.053740 +vt 0.616570 0.061730 +vt 0.592620 0.045520 +vt 0.593510 0.037300 +vt 0.597280 0.026500 +vt 0.579250 0.032130 +vt 0.609760 0.020030 +vt 0.590940 0.025350 +vt 0.602630 0.018580 +vt 0.584600 0.024210 +vt 0.573700 0.031290 +vt 0.600530 0.028020 +vt 0.603780 0.029540 +vt 0.616890 0.023990 +vt 0.613320 0.022010 +vt 0.606870 0.032930 +vt 0.609970 0.036310 +vt 0.623600 0.033120 +vt 0.620240 0.028550 +vt 0.611440 0.041260 +vt 0.612910 0.046210 +vt 0.624650 0.039660 +vt 0.625700 0.046210 +vt 0.610910 0.050200 +vt 0.623910 0.051610 +vt 0.500000 0.058380 +vt 0.506970 0.058300 +vt 0.508010 0.042670 +vt 0.513940 0.058230 +vt 0.516030 0.042400 +vt 0.518130 0.026580 +vt 0.500000 0.042930 +vt 0.509060 0.027030 +vt 0.522110 0.076670 +vt 0.525360 0.076120 +vt 0.521060 0.067980 +vt 0.528610 0.075580 +vt 0.527710 0.067550 +vt 0.524390 0.067770 +vt 0.523420 0.059410 +vt 0.520020 0.059300 +vt 0.514570 0.077150 +vt 0.518340 0.076910 +vt 0.514250 0.067690 +vt 0.517660 0.067830 +vt 0.516980 0.058760 +vt 0.540570 0.076040 +vt 0.537530 0.068660 +vt 0.534590 0.075810 +vt 0.534490 0.061280 +vt 0.532620 0.068100 +vt 0.530650 0.060400 +vt 0.526820 0.059530 +vt 0.556080 0.029010 +vt 0.564360 0.020790 +vt 0.548740 0.030380 +vt 0.572650 0.012570 +vt 0.557020 0.021280 +vt 0.565310 0.012190 +vt 0.549690 0.021780 +vt 0.541410 0.031750 +vt 0.557970 0.011810 +vt 0.547270 0.010670 +vt 0.540930 0.020030 +vt 0.536580 0.009530 +vt 0.532180 0.018280 +vt 0.534590 0.029390 +vt 0.553780 0.059910 +vt 0.544130 0.060590 +vt 0.549220 0.068050 +vt 0.554300 0.075500 +vt 0.560910 0.067440 +vt 0.568040 0.074970 +vt 0.575270 0.074210 +vt 0.582500 0.073450 +vt 0.567140 0.066860 +vt 0.573380 0.066290 +vt 0.564260 0.059140 +vt 0.559020 0.059520 +vt 0.569400 0.030760 +vt 0.595500 0.017140 +vt 0.579620 0.023380 +vt 0.589840 0.016000 +vt 0.574640 0.022540 +vt 0.565100 0.030230 +vt 0.560590 0.029620 +vt 0.569500 0.021660 +vt 0.584180 0.014860 +vt 0.578410 0.013710 +vt 0.587950 0.072840 +vt 0.593410 0.072230 +vt 0.578250 0.065870 +vt 0.583130 0.065460 +vt 0.568560 0.058910 +vt 0.598650 0.071240 +vt 0.603890 0.070250 +vt 0.588010 0.064730 +vt 0.577370 0.058230 +vt 0.572860 0.058690 +vt 0.573280 0.044990 +vt 0.578310 0.045180 +vt 0.564680 0.044680 +vt 0.568980 0.044830 +vt 0.559800 0.044570 +vt 0.554930 0.044460 +vt 0.537950 0.046510 +vt 0.546440 0.045480 +vt 0.534110 0.045640 +vt 0.534240 0.050850 +vt 0.523900 0.043160 +vt 0.529000 0.044400 +vt 0.527780 0.027030 +vt 0.522950 0.026800 +vt 0.519960 0.042780 +vt 0.500000 0.027490 +vt 0.510270 0.018390 +vt 0.520540 0.017820 +vt 0.522950 0.009070 +vt 0.500000 0.018960 +vt 0.511470 0.009750 +vt 0.529760 0.009300 +vt 0.526360 0.018050 +vt 0.500000 0.065610 +vt 0.500000 0.072840 +vt 0.507280 0.074990 +vt 0.507120 0.066650 +vt 0.404270 0.051380 +vt 0.403950 0.045440 +vt 0.402590 0.045700 +vt 0.403640 0.039510 +vt 0.402060 0.048790 +vt 0.401750 0.042860 +vt 0.415170 0.032970 +vt 0.412230 0.034030 +vt 0.416630 0.045370 +vt 0.409300 0.035100 +vt 0.413700 0.045480 +vt 0.410760 0.045600 +vt 0.415160 0.056940 +vt 0.418100 0.057780 +vt 0.407090 0.064010 +vt 0.412230 0.056100 +vt 0.403840 0.062640 +vt 0.400590 0.061270 +vt 0.392520 0.068350 +vt 0.396090 0.070250 +vt 0.408250 0.053740 +vt 0.395820 0.057730 +vt 0.391060 0.054190 +vt 0.383400 0.061730 +vt 0.388960 0.066450 +vt 0.406470 0.037300 +vt 0.407360 0.045520 +vt 0.404480 0.017140 +vt 0.397350 0.018580 +vt 0.409030 0.025350 +vt 0.390220 0.020030 +vt 0.402690 0.026500 +vt 0.415380 0.024210 +vt 0.420720 0.032130 +vt 0.383090 0.023990 +vt 0.396190 0.029540 +vt 0.386650 0.022010 +vt 0.399440 0.028020 +vt 0.376380 0.033120 +vt 0.390010 0.036310 +vt 0.379730 0.028550 +vt 0.393100 0.032930 +vt 0.374280 0.046210 +vt 0.387070 0.046210 +vt 0.388540 0.041260 +vt 0.399860 0.046210 +vt 0.375330 0.039660 +vt 0.389060 0.050200 +vt 0.376060 0.051610 +vt 0.377850 0.057010 +vt 0.481850 0.026580 +vt 0.483940 0.042400 +vt 0.490910 0.027030 +vt 0.486040 0.058230 +vt 0.493010 0.058300 +vt 0.491960 0.042670 +vt 0.473160 0.059530 +vt 0.472260 0.067550 +vt 0.475590 0.067770 +vt 0.471370 0.075580 +vt 0.474620 0.076120 +vt 0.477870 0.076670 +vt 0.476560 0.059410 +vt 0.478910 0.067980 +vt 0.479960 0.059300 +vt 0.482320 0.067830 +vt 0.481640 0.076910 +vt 0.485410 0.077150 +vt 0.483000 0.058760 +vt 0.485720 0.067690 +vt 0.469320 0.060400 +vt 0.465490 0.061280 +vt 0.467350 0.068100 +vt 0.462450 0.068660 +vt 0.465390 0.075810 +vt 0.442010 0.011810 +vt 0.434670 0.012190 +vt 0.442950 0.021280 +vt 0.427330 0.012570 +vt 0.435610 0.020790 +vt 0.451230 0.030380 +vt 0.450290 0.021780 +vt 0.458570 0.031750 +vt 0.472200 0.027030 +vt 0.467800 0.018280 +vt 0.459040 0.020030 +vt 0.463400 0.009530 +vt 0.452700 0.010670 +vt 0.465380 0.029390 +vt 0.459410 0.076040 +vt 0.450760 0.068050 +vt 0.455840 0.060590 +vt 0.446200 0.059910 +vt 0.445670 0.075500 +vt 0.439070 0.067440 +vt 0.435720 0.059140 +vt 0.426600 0.066290 +vt 0.432830 0.066860 +vt 0.417480 0.073450 +vt 0.424710 0.074210 +vt 0.431940 0.074970 +vt 0.440960 0.059520 +vt 0.415800 0.014860 +vt 0.410140 0.016000 +vt 0.420360 0.023380 +vt 0.426280 0.031290 +vt 0.425340 0.022540 +vt 0.430580 0.030760 +vt 0.421560 0.013710 +vt 0.434880 0.030230 +vt 0.430470 0.021660 +vt 0.439390 0.029620 +vt 0.427120 0.058690 +vt 0.416840 0.065460 +vt 0.421720 0.065870 +vt 0.406570 0.072230 +vt 0.412020 0.072840 +vt 0.431420 0.058910 +vt 0.411970 0.064730 +vt 0.401330 0.071240 +vt 0.422610 0.058230 +vt 0.421660 0.045180 +vt 0.426700 0.044990 +vt 0.431000 0.044830 +vt 0.443900 0.029010 +vt 0.440170 0.044570 +vt 0.435300 0.044680 +vt 0.445050 0.044460 +vt 0.453540 0.045480 +vt 0.462030 0.046510 +vt 0.465740 0.050850 +vt 0.465860 0.045640 +vt 0.470970 0.044400 +vt 0.476080 0.043160 +vt 0.480010 0.042780 +vt 0.477030 0.009070 +vt 0.479440 0.017820 +vt 0.488500 0.009750 +vt 0.489710 0.018390 +vt 0.499980 0.010440 +vt 0.477020 0.026800 +vt 0.473620 0.018050 +vt 0.492690 0.074990 +vt 0.492850 0.066650 +vt 0.586760 0.526300 +vt 0.583330 0.510090 +vt 0.595300 0.526460 +vt 0.579910 0.493880 +vt 0.590470 0.505830 +vt 0.585640 0.485200 +vt 0.597610 0.501570 +vt 0.603840 0.526630 +vt 0.574180 0.552330 +vt 0.570700 0.549700 +vt 0.572150 0.538490 +vt 0.567230 0.547080 +vt 0.568680 0.537430 +vt 0.570140 0.527780 +vt 0.575630 0.539560 +vt 0.573610 0.527280 +vt 0.660200 0.484770 +vt 0.646250 0.467590 +vt 0.657220 0.450480 +vt 0.632310 0.450420 +vt 0.624310 0.414560 +vt 0.640760 0.432520 +vt 0.615730 0.523310 +vt 0.591380 0.476520 +vt 0.605610 0.492890 +vt 0.595500 0.462470 +vt 0.613620 0.484210 +vt 0.627630 0.520000 +vt 0.643930 0.502560 +vt 0.657890 0.519920 +vt 0.641610 0.537530 +vt 0.629970 0.485210 +vt 0.655590 0.555070 +vt 0.650390 0.585490 +vt 0.637900 0.571640 +vt 0.645200 0.615910 +vt 0.634200 0.605750 +vt 0.623210 0.595590 +vt 0.625420 0.557790 +vt 0.611460 0.590100 +vt 0.613600 0.556710 +vt 0.599720 0.584620 +vt 0.601780 0.555620 +vt 0.599620 0.448420 +vt 0.599770 0.427450 +vt 0.614870 0.456330 +vt 0.599930 0.406480 +vt 0.616120 0.428450 +vt 0.607170 0.394890 +vt 0.590040 0.375230 +vt 0.559910 0.537610 +vt 0.560300 0.534070 +vt 0.561750 0.539540 +vt 0.560690 0.530530 +vt 0.562340 0.534720 +vt 0.562930 0.529900 +vt 0.564390 0.535380 +vt 0.563600 0.541480 +vt 0.566530 0.536400 +vt 0.565180 0.529280 +vt 0.567660 0.528530 +vt 0.565410 0.544280 +vt 0.557830 0.537070 +vt 0.557950 0.534140 +vt 0.555750 0.536540 +vt 0.555610 0.534210 +vt 0.555470 0.531890 +vt 0.577080 0.526790 +vt 0.573890 0.515650 +vt 0.581920 0.526540 +vt 0.570700 0.504520 +vt 0.578610 0.512870 +vt 0.575300 0.499200 +vt 0.566440 0.518760 +vt 0.562750 0.509750 +vt 0.570160 0.517210 +vt 0.566720 0.507130 +vt 0.499990 0.405820 +vt 0.511120 0.407030 +vt 0.511270 0.418670 +vt 0.522260 0.408240 +vt 0.522550 0.419820 +vt 0.522840 0.431400 +vt 0.499990 0.417520 +vt 0.511410 0.430310 +vt 0.499990 0.395400 +vt 0.510090 0.396310 +vt 0.499990 0.384980 +vt 0.509060 0.385600 +vt 0.518130 0.386230 +vt 0.520190 0.397230 +vt 0.533820 0.412470 +vt 0.534030 0.424340 +vt 0.545380 0.416700 +vt 0.545510 0.428870 +vt 0.545640 0.441040 +vt 0.534240 0.436220 +vt 0.529020 0.389270 +vt 0.531420 0.400870 +vt 0.539910 0.392310 +vt 0.580320 0.456520 +vt 0.569260 0.436520 +vt 0.581980 0.442610 +vt 0.568460 0.422750 +vt 0.583640 0.428700 +vt 0.572490 0.477520 +vt 0.565070 0.461160 +vt 0.576400 0.467020 +vt 0.567160 0.448840 +vt 0.542640 0.404500 +vt 0.555550 0.413620 +vt 0.553780 0.400640 +vt 0.567660 0.408980 +vt 0.557320 0.426610 +vt 0.555350 0.451100 +vt 0.556330 0.438850 +vt 0.563730 0.493900 +vt 0.556770 0.483280 +vt 0.568110 0.485710 +vt 0.560920 0.472220 +vt 0.556270 0.502690 +vt 0.549800 0.495640 +vt 0.560000 0.498290 +vt 0.553280 0.489460 +vt 0.542260 0.491460 +vt 0.534730 0.487280 +vt 0.545630 0.483450 +vt 0.537990 0.477440 +vt 0.541250 0.467600 +vt 0.558080 0.531210 +vt 0.555810 0.526680 +vt 0.551010 0.529450 +vt 0.553410 0.528060 +vt 0.548740 0.524920 +vt 0.560750 0.522500 +vt 0.556330 0.515720 +vt 0.563600 0.520630 +vt 0.559540 0.512730 +vt 0.558280 0.524590 +vt 0.550930 0.522830 +vt 0.553630 0.519270 +vt 0.553050 0.506960 +vt 0.549840 0.511220 +vt 0.543350 0.506730 +vt 0.546570 0.501180 +vt 0.547110 0.515570 +vt 0.544380 0.519930 +vt 0.537830 0.517030 +vt 0.540590 0.511880 +vt 0.546550 0.527010 +vt 0.542540 0.522460 +vt 0.540700 0.525000 +vt 0.536340 0.520010 +vt 0.531480 0.515060 +vt 0.534860 0.523000 +vt 0.530150 0.518190 +vt 0.528820 0.521330 +vt 0.523950 0.516380 +vt 0.525130 0.513100 +vt 0.533700 0.509880 +vt 0.526820 0.507880 +vt 0.535930 0.504690 +vt 0.528520 0.502660 +vt 0.539100 0.498070 +vt 0.531620 0.494970 +vt 0.521680 0.501840 +vt 0.524150 0.493640 +vt 0.514840 0.501030 +vt 0.516680 0.492310 +vt 0.518530 0.483600 +vt 0.526630 0.485440 +vt 0.531790 0.463220 +vt 0.529210 0.474330 +vt 0.520430 0.471220 +vt 0.522340 0.458840 +vt 0.549010 0.475440 +vt 0.543440 0.454320 +vt 0.552180 0.463270 +vt 0.533010 0.449720 +vt 0.522590 0.445120 +vt 0.511290 0.443970 +vt 0.511160 0.457620 +vt 0.499990 0.442820 +vt 0.499990 0.429230 +vt 0.510210 0.470300 +vt 0.509260 0.482980 +vt 0.499990 0.469390 +vt 0.499990 0.456410 +vt 0.507410 0.500740 +vt 0.508330 0.491860 +vt 0.499990 0.500460 +vt 0.499990 0.491410 +vt 0.499990 0.482370 +vt 0.512850 0.510760 +vt 0.513840 0.505890 +vt 0.518990 0.511930 +vt 0.520330 0.506880 +vt 0.522780 0.519660 +vt 0.518000 0.515380 +vt 0.517020 0.518830 +vt 0.512050 0.514380 +vt 0.511260 0.518000 +vt 0.505620 0.517720 +vt 0.506020 0.514080 +vt 0.499990 0.517440 +vt 0.499990 0.513790 +vt 0.499990 0.510150 +vt 0.506420 0.510450 +vt 0.506910 0.505600 +vt 0.499990 0.505300 +vt 0.723510 0.524280 +vt 0.715810 0.534370 +vt 0.704590 0.521220 +vt 0.708120 0.544460 +vt 0.696980 0.533420 +vt 0.685840 0.522380 +vt 0.693370 0.508080 +vt 0.675290 0.479280 +vt 0.673020 0.503570 +vt 0.680120 0.598730 +vt 0.671870 0.625080 +vt 0.661130 0.605280 +vt 0.663630 0.651440 +vt 0.654410 0.633670 +vt 0.667850 0.576900 +vt 0.670430 0.540230 +vt 0.682980 0.560550 +vt 0.692640 0.564630 +vt 0.702300 0.568710 +vt 0.688300 0.595850 +vt 0.578900 0.556010 +vt 0.580410 0.541270 +vt 0.585190 0.542990 +vt 0.583620 0.559690 +vt 0.593480 0.549310 +vt 0.591670 0.572150 +vt 0.529240 0.370180 +vt 0.534570 0.381240 +vt 0.521810 0.379320 +vt 0.514610 0.369380 +vt 0.509060 0.377410 +vt 0.506030 0.379930 +vt 0.499990 0.376780 +vt 0.499990 0.341990 +vt 0.499990 0.327320 +vt 0.525000 0.354700 +vt 0.523150 0.337780 +vt 0.546320 0.348250 +vt 0.550020 0.367410 +vt 0.568180 0.361740 +vt 0.574970 0.386940 +vt 0.579300 0.407820 +vt 0.558840 0.388190 +vt 0.546700 0.384720 +vt 0.539630 0.368790 +vt 0.519810 0.362040 +vt 0.499990 0.355290 +vt 0.408600 0.476520 +vt 0.414330 0.485200 +vt 0.409500 0.505830 +vt 0.420070 0.493880 +vt 0.416640 0.510090 +vt 0.413220 0.526300 +vt 0.402370 0.501570 +vt 0.404680 0.526460 +vt 0.429840 0.527780 +vt 0.431290 0.537430 +vt 0.426370 0.527280 +vt 0.432750 0.547080 +vt 0.429270 0.549700 +vt 0.427820 0.538490 +vt 0.425800 0.552330 +vt 0.422900 0.526790 +vt 0.375670 0.414560 +vt 0.359210 0.432520 +vt 0.367670 0.450420 +vt 0.353720 0.467590 +vt 0.339780 0.484770 +vt 0.342760 0.450480 +vt 0.400360 0.448420 +vt 0.404480 0.462470 +vt 0.386350 0.484210 +vt 0.394360 0.492890 +vt 0.396140 0.526630 +vt 0.384240 0.523310 +vt 0.344390 0.555070 +vt 0.342080 0.519920 +vt 0.356040 0.502560 +vt 0.358370 0.537530 +vt 0.370010 0.485210 +vt 0.376770 0.595590 +vt 0.365770 0.605750 +vt 0.374560 0.557790 +vt 0.354780 0.615910 +vt 0.362070 0.571640 +vt 0.349580 0.585490 +vt 0.372350 0.520000 +vt 0.398200 0.555620 +vt 0.400260 0.584620 +vt 0.386380 0.556710 +vt 0.388510 0.590100 +vt 0.383860 0.428450 +vt 0.400050 0.406480 +vt 0.385100 0.456330 +vt 0.400200 0.427450 +vt 0.409930 0.375230 +vt 0.392800 0.394890 +vt 0.434800 0.529280 +vt 0.437040 0.529900 +vt 0.435590 0.535380 +vt 0.439290 0.530530 +vt 0.439680 0.534070 +vt 0.437630 0.534720 +vt 0.438220 0.539540 +vt 0.436380 0.541480 +vt 0.432320 0.528530 +vt 0.433440 0.536400 +vt 0.434560 0.544280 +vt 0.444510 0.531890 +vt 0.444370 0.534210 +vt 0.441900 0.531210 +vt 0.444230 0.536540 +vt 0.442020 0.534140 +vt 0.442150 0.537070 +vt 0.440070 0.537610 +vt 0.424670 0.499200 +vt 0.421360 0.512870 +vt 0.429280 0.504520 +vt 0.426090 0.515650 +vt 0.418060 0.526540 +vt 0.433250 0.507130 +vt 0.429810 0.517210 +vt 0.437230 0.509750 +vt 0.433530 0.518760 +vt 0.477140 0.431400 +vt 0.477430 0.419820 +vt 0.488560 0.430310 +vt 0.477720 0.408240 +vt 0.488710 0.418670 +vt 0.488850 0.407030 +vt 0.481850 0.386230 +vt 0.490920 0.385600 +vt 0.489880 0.396310 +vt 0.479780 0.397230 +vt 0.454340 0.441040 +vt 0.454470 0.428870 +vt 0.465740 0.436220 +vt 0.454600 0.416700 +vt 0.465950 0.424340 +vt 0.466160 0.412470 +vt 0.460070 0.392310 +vt 0.470960 0.389270 +vt 0.468560 0.400870 +vt 0.457330 0.404500 +vt 0.432320 0.408980 +vt 0.431520 0.422750 +vt 0.416340 0.428700 +vt 0.430720 0.436520 +vt 0.418000 0.442610 +vt 0.419660 0.456520 +vt 0.432810 0.448840 +vt 0.423570 0.467020 +vt 0.434910 0.461160 +vt 0.427490 0.477520 +vt 0.446190 0.400640 +vt 0.444420 0.413620 +vt 0.442660 0.426610 +vt 0.443640 0.438850 +vt 0.444620 0.451100 +vt 0.439060 0.472220 +vt 0.431860 0.485710 +vt 0.443210 0.483280 +vt 0.436240 0.493900 +vt 0.446690 0.489460 +vt 0.439970 0.498290 +vt 0.450180 0.495640 +vt 0.443700 0.502690 +vt 0.458730 0.467600 +vt 0.461990 0.477440 +vt 0.454340 0.483450 +vt 0.465250 0.487280 +vt 0.457710 0.491460 +vt 0.450970 0.475440 +vt 0.453430 0.527010 +vt 0.448970 0.529450 +vt 0.446570 0.528060 +vt 0.444170 0.526680 +vt 0.451240 0.524920 +vt 0.440440 0.512730 +vt 0.436380 0.520630 +vt 0.443650 0.515720 +vt 0.439220 0.522500 +vt 0.449050 0.522830 +vt 0.446350 0.519270 +vt 0.441690 0.524590 +vt 0.456630 0.506730 +vt 0.450140 0.511220 +vt 0.453400 0.501180 +vt 0.446920 0.506960 +vt 0.462150 0.517030 +vt 0.455600 0.519930 +vt 0.459390 0.511880 +vt 0.452870 0.515570 +vt 0.465120 0.523000 +vt 0.459270 0.525000 +vt 0.457430 0.522460 +vt 0.463630 0.520010 +vt 0.477200 0.519660 +vt 0.471160 0.521330 +vt 0.476020 0.516380 +vt 0.469830 0.518190 +vt 0.474850 0.513100 +vt 0.468500 0.515060 +vt 0.473150 0.507880 +vt 0.466270 0.509880 +vt 0.464040 0.504690 +vt 0.471460 0.502660 +vt 0.468350 0.494970 +vt 0.460880 0.498070 +vt 0.481450 0.483600 +vt 0.483290 0.492310 +vt 0.473350 0.485440 +vt 0.485140 0.501030 +vt 0.478300 0.501840 +vt 0.475820 0.493640 +vt 0.470760 0.474330 +vt 0.479540 0.471220 +vt 0.468180 0.463220 +vt 0.456530 0.454320 +vt 0.447790 0.463270 +vt 0.477640 0.458840 +vt 0.466960 0.449720 +vt 0.477390 0.445120 +vt 0.488810 0.457620 +vt 0.488690 0.443970 +vt 0.490720 0.482980 +vt 0.489760 0.470300 +vt 0.492560 0.500740 +vt 0.491640 0.491860 +vt 0.479640 0.506880 +vt 0.486130 0.505890 +vt 0.480990 0.511930 +vt 0.488720 0.518000 +vt 0.482960 0.518830 +vt 0.487920 0.514380 +vt 0.481970 0.515380 +vt 0.493950 0.514080 +vt 0.494350 0.517720 +vt 0.493560 0.510450 +vt 0.493060 0.505600 +vt 0.314140 0.522380 +vt 0.303000 0.533420 +vt 0.306610 0.508080 +vt 0.291860 0.544460 +vt 0.295380 0.521220 +vt 0.284160 0.534370 +vt 0.326960 0.503570 +vt 0.324680 0.479280 +vt 0.345560 0.633670 +vt 0.336350 0.651440 +vt 0.338840 0.605280 +vt 0.328100 0.625080 +vt 0.332120 0.576900 +vt 0.319860 0.598730 +vt 0.317000 0.560550 +vt 0.329540 0.540230 +vt 0.303490 0.592970 +vt 0.297670 0.568710 +vt 0.307330 0.564630 +vt 0.311670 0.595850 +vt 0.419570 0.541270 +vt 0.424350 0.539560 +vt 0.421080 0.556010 +vt 0.414790 0.542990 +vt 0.416360 0.559690 +vt 0.406490 0.549310 +vt 0.408310 0.572150 +vt 0.490920 0.377410 +vt 0.465400 0.381240 +vt 0.478160 0.379320 +vt 0.485360 0.369380 +vt 0.499990 0.368590 +vt 0.493940 0.379930 +vt 0.453650 0.348250 +vt 0.476820 0.337780 +vt 0.474970 0.354700 +vt 0.449960 0.367410 +vt 0.431790 0.361740 +vt 0.425000 0.386940 +vt 0.441140 0.388190 +vt 0.420670 0.407820 +vt 0.460350 0.368790 +vt 0.470740 0.370180 +vt 0.453270 0.384720 +vt 0.480170 0.362040 +vt 0.714260 0.703520 +vt 0.720970 0.694220 +vt 0.731920 0.711940 +vt 0.727690 0.684920 +vt 0.737610 0.701690 +vt 0.747540 0.718470 +vt 0.726220 0.722190 +vt 0.742860 0.729660 +vt 0.737570 0.668420 +vt 0.739190 0.675200 +vt 0.735440 0.671910 +vt 0.740810 0.681980 +vt 0.738370 0.679660 +vt 0.741310 0.687410 +vt 0.741810 0.692840 +vt 0.733320 0.675400 +vt 0.737560 0.684120 +vt 0.737590 0.692900 +vt 0.744670 0.705650 +vt 0.730500 0.680160 +vt 0.781310 0.667080 +vt 0.782030 0.667800 +vt 0.780300 0.671870 +vt 0.782760 0.668520 +vt 0.781080 0.672560 +vt 0.781870 0.673250 +vt 0.780130 0.677320 +vt 0.779290 0.676660 +vt 0.783730 0.662350 +vt 0.783100 0.661690 +vt 0.782480 0.661030 +vt 0.783650 0.654990 +vt 0.784710 0.656180 +vt 0.784470 0.662840 +vt 0.785470 0.656380 +vt 0.786230 0.656590 +vt 0.783480 0.669300 +vt 0.785220 0.663340 +vt 0.788450 0.675390 +vt 0.788800 0.666120 +vt 0.790060 0.666340 +vt 0.789150 0.656860 +vt 0.790470 0.656710 +vt 0.791800 0.656570 +vt 0.789650 0.675970 +vt 0.791330 0.666560 +vt 0.784030 0.682730 +vt 0.785050 0.677720 +vt 0.786190 0.679070 +vt 0.786070 0.672710 +vt 0.787260 0.674050 +vt 0.785120 0.684090 +vt 0.787330 0.680420 +vt 0.787230 0.656780 +vt 0.786730 0.656680 +vt 0.786920 0.639850 +vt 0.786240 0.639830 +vt 0.785560 0.639810 +vt 0.785760 0.622980 +vt 0.786620 0.622930 +vt 0.788190 0.656820 +vt 0.788770 0.639450 +vt 0.787840 0.639650 +vt 0.787500 0.622480 +vt 0.788390 0.622040 +vt 0.784210 0.670090 +vt 0.785930 0.664040 +vt 0.785140 0.671400 +vt 0.786650 0.664740 +vt 0.787720 0.665430 +vt 0.786210 0.685450 +vt 0.788480 0.681010 +vt 0.790860 0.676550 +vt 0.787320 0.686050 +vt 0.789640 0.681600 +vt 0.778720 0.692550 +vt 0.782460 0.689000 +vt 0.783390 0.689920 +vt 0.788430 0.686650 +vt 0.779460 0.693790 +vt 0.784310 0.690840 +vt 0.777460 0.689790 +vt 0.780740 0.686260 +vt 0.781600 0.687630 +vt 0.778090 0.691170 +vt 0.769070 0.684060 +vt 0.772300 0.683690 +vt 0.767950 0.685430 +vt 0.775540 0.683320 +vt 0.772020 0.684720 +vt 0.776100 0.684010 +vt 0.771750 0.685750 +vt 0.766830 0.686800 +vt 0.777300 0.686950 +vt 0.772010 0.688780 +vt 0.771880 0.687260 +vt 0.766720 0.690620 +vt 0.766770 0.688710 +vt 0.776980 0.685820 +vt 0.780980 0.677990 +vt 0.781700 0.678770 +vt 0.778820 0.681340 +vt 0.782420 0.679550 +vt 0.779340 0.682290 +vt 0.779860 0.683250 +vt 0.776670 0.684700 +vt 0.766250 0.691890 +vt 0.771810 0.690130 +vt 0.777380 0.688370 +vt 0.771620 0.691470 +vt 0.765790 0.693160 +vt 0.780300 0.684750 +vt 0.783220 0.681140 +vt 0.784180 0.676270 +vt 0.783310 0.674820 +vt 0.782590 0.674030 +vt 0.777410 0.679990 +vt 0.778120 0.680660 +vt 0.792200 0.676320 +vt 0.792700 0.666040 +vt 0.793210 0.655760 +vt 0.794620 0.654960 +vt 0.793550 0.676090 +vt 0.793740 0.620200 +vt 0.795390 0.619550 +vt 0.794180 0.637580 +vt 0.797040 0.618910 +vt 0.797380 0.635460 +vt 0.795780 0.636520 +vt 0.797730 0.652010 +vt 0.782270 0.591030 +vt 0.784120 0.591370 +vt 0.788000 0.605610 +vt 0.785980 0.591720 +vt 0.791510 0.605310 +vt 0.789750 0.605460 +vt 0.772090 0.598060 +vt 0.766800 0.588190 +vt 0.766880 0.586670 +vt 0.761520 0.578330 +vt 0.761340 0.576200 +vt 0.766970 0.585150 +vt 0.772430 0.597150 +vt 0.772770 0.596240 +vt 0.780200 0.695030 +vt 0.781300 0.695670 +vt 0.773420 0.698490 +vt 0.782400 0.696310 +vt 0.774100 0.699380 +vt 0.765800 0.702460 +vt 0.772750 0.697590 +vt 0.765550 0.701310 +vt 0.766100 0.682090 +vt 0.767580 0.683070 +vt 0.764180 0.682100 +vt 0.766060 0.683760 +vt 0.764540 0.684450 +vt 0.763680 0.685790 +vt 0.760530 0.684780 +vt 0.761390 0.683440 +vt 0.763200 0.684560 +vt 0.761920 0.571100 +vt 0.761540 0.572580 +vt 0.758620 0.569630 +vt 0.761170 0.574070 +vt 0.758430 0.571890 +vt 0.755700 0.569720 +vt 0.758800 0.567370 +vt 0.755690 0.566680 +vt 0.751610 0.580980 +vt 0.754400 0.583420 +vt 0.749630 0.585430 +vt 0.757190 0.585870 +vt 0.756700 0.590110 +vt 0.753170 0.587770 +vt 0.756220 0.594350 +vt 0.747660 0.589890 +vt 0.784590 0.697150 +vt 0.775900 0.701010 +vt 0.783490 0.696730 +vt 0.767220 0.704870 +vt 0.775000 0.700190 +vt 0.766510 0.703660 +vt 0.747150 0.583180 +vt 0.745300 0.588000 +vt 0.742940 0.586110 +vt 0.749000 0.578360 +vt 0.744660 0.580920 +vt 0.741480 0.678590 +vt 0.744150 0.683200 +vt 0.742160 0.675200 +vt 0.744780 0.680310 +vt 0.747400 0.685430 +vt 0.743520 0.686090 +vt 0.746820 0.687810 +vt 0.749420 0.668290 +vt 0.749970 0.665830 +vt 0.751260 0.667630 +vt 0.750520 0.663370 +vt 0.751010 0.666210 +vt 0.751810 0.665170 +vt 0.748110 0.660780 +vt 0.749310 0.662070 +vt 0.749350 0.664140 +vt 0.748760 0.664530 +vt 0.747540 0.610920 +vt 0.746780 0.607800 +vt 0.749550 0.609000 +vt 0.746030 0.604680 +vt 0.749310 0.605520 +vt 0.752330 0.610210 +vt 0.749800 0.612490 +vt 0.746240 0.690200 +vt 0.745950 0.691810 +vt 0.743630 0.689610 +vt 0.745660 0.693430 +vt 0.743730 0.693130 +vt 0.744960 0.609230 +vt 0.742380 0.607550 +vt 0.743730 0.606520 +vt 0.740680 0.605240 +vt 0.738990 0.602940 +vt 0.742510 0.603810 +vt 0.758930 0.634190 +vt 0.759200 0.636720 +vt 0.756300 0.638710 +vt 0.759470 0.639260 +vt 0.756860 0.640700 +vt 0.757420 0.642700 +vt 0.754520 0.644690 +vt 0.753670 0.643230 +vt 0.762080 0.652290 +vt 0.757990 0.655860 +vt 0.756990 0.655090 +vt 0.753910 0.659440 +vt 0.752910 0.658930 +vt 0.751920 0.658430 +vt 0.761070 0.651240 +vt 0.755990 0.654310 +vt 0.752210 0.661400 +vt 0.752110 0.660410 +vt 0.751220 0.660900 +vt 0.750010 0.659600 +vt 0.750180 0.660860 +vt 0.752170 0.656290 +vt 0.752430 0.654150 +vt 0.755580 0.652680 +vt 0.755180 0.651060 +vt 0.759000 0.649080 +vt 0.760060 0.650200 +vt 0.748490 0.658720 +vt 0.748880 0.656660 +vt 0.750650 0.655400 +vt 0.750330 0.657500 +vt 0.751590 0.653250 +vt 0.750750 0.652350 +vt 0.754120 0.650150 +vt 0.753060 0.649250 +vt 0.756650 0.647060 +vt 0.757940 0.647970 +vt 0.749710 0.654920 +vt 0.747830 0.656600 +vt 0.746790 0.656540 +vt 0.748770 0.654440 +vt 0.744720 0.655930 +vt 0.743490 0.658510 +vt 0.742170 0.659030 +vt 0.742270 0.661100 +vt 0.740890 0.662530 +vt 0.740840 0.659550 +vt 0.743450 0.655530 +vt 0.742980 0.665220 +vt 0.743690 0.669350 +vt 0.741900 0.667400 +vt 0.742920 0.672270 +vt 0.740830 0.669580 +vt 0.739510 0.663970 +vt 0.752070 0.698050 +vt 0.748860 0.695740 +vt 0.753050 0.697190 +vt 0.749500 0.694500 +vt 0.750140 0.693260 +vt 0.754040 0.696330 +vt 0.750880 0.691230 +vt 0.751630 0.689200 +vt 0.754950 0.694650 +vt 0.755870 0.692980 +vt 0.758930 0.700250 +vt 0.759300 0.699250 +vt 0.759670 0.698240 +vt 0.765300 0.700160 +vt 0.756700 0.691230 +vt 0.761140 0.693000 +vt 0.757540 0.689480 +vt 0.761660 0.691320 +vt 0.760610 0.694690 +vt 0.765570 0.694780 +vt 0.771830 0.692970 +vt 0.772040 0.694480 +vt 0.765330 0.698280 +vt 0.765360 0.696410 +vt 0.772390 0.696030 +vt 0.760140 0.696470 +vt 0.748360 0.681620 +vt 0.752950 0.685550 +vt 0.747880 0.683520 +vt 0.752290 0.687370 +vt 0.747290 0.658920 +vt 0.746080 0.659120 +vt 0.746740 0.661240 +vt 0.747400 0.664990 +vt 0.747630 0.663590 +vt 0.744410 0.668550 +vt 0.746720 0.674290 +vt 0.745140 0.667750 +vt 0.747420 0.673090 +vt 0.749700 0.678440 +vt 0.746020 0.675480 +vt 0.749030 0.680030 +vt 0.745260 0.664720 +vt 0.745380 0.661700 +vt 0.747410 0.669040 +vt 0.749560 0.673360 +vt 0.762760 0.689020 +vt 0.763220 0.687400 +vt 0.758800 0.687430 +vt 0.759660 0.686100 +vt 0.758170 0.688450 +vt 0.762210 0.690170 +vt 0.756940 0.681370 +vt 0.757930 0.680100 +vt 0.753360 0.677970 +vt 0.754470 0.676760 +vt 0.758920 0.678830 +vt 0.751530 0.678200 +vt 0.751390 0.673130 +vt 0.750820 0.674900 +vt 0.753110 0.666970 +vt 0.754340 0.671260 +vt 0.755580 0.675550 +vt 0.752860 0.672190 +vt 0.755590 0.682150 +vt 0.754250 0.682930 +vt 0.753600 0.684240 +vt 0.745400 0.677900 +vt 0.744120 0.664970 +vt 0.743820 0.661400 +vt 0.745750 0.656230 +vt 0.744790 0.658810 +vt 0.746690 0.648170 +vt 0.747880 0.649360 +vt 0.744430 0.651650 +vt 0.749070 0.650550 +vt 0.745660 0.652440 +vt 0.746890 0.653240 +vt 0.742180 0.655140 +vt 0.751970 0.639540 +vt 0.752820 0.641380 +vt 0.749330 0.643850 +vt 0.750350 0.645370 +vt 0.751370 0.646890 +vt 0.749910 0.651450 +vt 0.747830 0.653840 +vt 0.755370 0.646150 +vt 0.752210 0.648070 +vt 0.757320 0.630090 +vt 0.758120 0.632140 +vt 0.754640 0.634810 +vt 0.755470 0.636760 +vt 0.752070 0.614070 +vt 0.754780 0.613990 +vt 0.754630 0.618720 +vt 0.757500 0.613920 +vt 0.757580 0.618180 +vt 0.760520 0.617640 +vt 0.760370 0.622370 +vt 0.757200 0.623370 +vt 0.763490 0.611360 +vt 0.760490 0.612640 +vt 0.758040 0.608860 +vt 0.756410 0.611420 +vt 0.752590 0.606360 +vt 0.759090 0.575120 +vt 0.759750 0.578340 +vt 0.756840 0.574040 +vt 0.757980 0.578360 +vt 0.757580 0.582110 +vt 0.755590 0.581730 +vt 0.754790 0.579670 +vt 0.746390 0.575740 +vt 0.751040 0.572730 +vt 0.752920 0.576200 +vt 0.783770 0.639800 +vt 0.784670 0.639810 +vt 0.782840 0.623430 +vt 0.783870 0.623230 +vt 0.777460 0.610740 +vt 0.778150 0.610190 +vt 0.778830 0.609640 +vt 0.765040 0.609700 +vt 0.758930 0.606430 +vt 0.752810 0.603160 +vt 0.759820 0.604000 +vt 0.766600 0.608040 +vt 0.771770 0.622940 +vt 0.767630 0.617150 +vt 0.769220 0.616440 +vt 0.770810 0.615740 +vt 0.773400 0.623190 +vt 0.765050 0.648830 +vt 0.763800 0.647700 +vt 0.762550 0.646580 +vt 0.765050 0.642960 +vt 0.766530 0.644160 +vt 0.771740 0.636770 +vt 0.769290 0.635460 +vt 0.771750 0.629850 +vt 0.766840 0.634150 +vt 0.765190 0.627760 +vt 0.768470 0.628800 +vt 0.767660 0.622150 +vt 0.761270 0.645290 +vt 0.759980 0.644010 +vt 0.763540 0.641500 +vt 0.758700 0.643350 +vt 0.760750 0.639650 +vt 0.762030 0.640050 +vt 0.762090 0.635530 +vt 0.760640 0.636130 +vt 0.762150 0.631020 +vt 0.764010 0.637040 +vt 0.764490 0.632580 +vt 0.765940 0.638550 +vt 0.768020 0.645370 +vt 0.767910 0.639810 +vt 0.769880 0.641070 +vt 0.755000 0.660180 +vt 0.756090 0.660920 +vt 0.753400 0.662670 +vt 0.754600 0.663940 +vt 0.762280 0.654160 +vt 0.762480 0.656030 +vt 0.758640 0.657170 +vt 0.759280 0.658470 +vt 0.765210 0.653750 +vt 0.765130 0.651290 +vt 0.767980 0.648420 +vt 0.767940 0.651470 +vt 0.770540 0.647460 +vt 0.770210 0.644260 +vt 0.772440 0.640110 +vt 0.773140 0.643460 +vt 0.772920 0.631650 +vt 0.775030 0.623450 +vt 0.774080 0.633450 +vt 0.763550 0.621370 +vt 0.764070 0.617390 +vt 0.759670 0.627190 +vt 0.762430 0.627470 +vt 0.760540 0.632600 +vt 0.758900 0.629660 +vt 0.757260 0.626730 +vt 0.752850 0.628240 +vt 0.753740 0.631530 +vt 0.750230 0.636330 +vt 0.721260 0.574150 +vt 0.723470 0.573330 +vt 0.723230 0.577110 +vt 0.725680 0.572520 +vt 0.725750 0.574690 +vt 0.725820 0.576870 +vt 0.720710 0.579520 +vt 0.722990 0.580880 +vt 0.720160 0.584900 +vt 0.727650 0.578680 +vt 0.729300 0.574620 +vt 0.732310 0.576480 +vt 0.726000 0.582740 +vt 0.728830 0.571440 +vt 0.728360 0.568260 +vt 0.731050 0.564000 +vt 0.732790 0.572380 +vt 0.731920 0.568190 +vt 0.735430 0.564990 +vt 0.734090 0.561140 +vt 0.737130 0.558280 +vt 0.736780 0.568840 +vt 0.738950 0.561790 +vt 0.731840 0.580580 +vt 0.737950 0.573500 +vt 0.743580 0.570520 +vt 0.739110 0.578160 +vt 0.736870 0.587790 +vt 0.730800 0.589480 +vt 0.737990 0.582970 +vt 0.731320 0.585030 +vt 0.718380 0.594770 +vt 0.719270 0.589830 +vt 0.725290 0.587430 +vt 0.724590 0.592120 +vt 0.715470 0.596800 +vt 0.715660 0.592870 +vt 0.712560 0.598840 +vt 0.712050 0.595910 +vt 0.711540 0.592980 +vt 0.715850 0.588940 +vt 0.711680 0.579750 +vt 0.711820 0.566520 +vt 0.716540 0.570330 +vt 0.716190 0.579630 +vt 0.736370 0.605890 +vt 0.739370 0.606720 +vt 0.739240 0.608300 +vt 0.742100 0.608760 +vt 0.742110 0.610710 +vt 0.744820 0.610810 +vt 0.745130 0.613850 +vt 0.747460 0.613170 +vt 0.750110 0.615530 +vt 0.748150 0.616990 +vt 0.751480 0.621880 +vt 0.748320 0.625050 +vt 0.709620 0.588570 +vt 0.710640 0.598540 +vt 0.707560 0.597400 +vt 0.708590 0.578610 +vt 0.705370 0.590710 +vt 0.727190 0.634500 +vt 0.725430 0.634370 +vt 0.723650 0.628620 +vt 0.723680 0.634240 +vt 0.720760 0.629840 +vt 0.722200 0.629230 +vt 0.717850 0.625450 +vt 0.718980 0.624090 +vt 0.723970 0.638550 +vt 0.720910 0.632000 +vt 0.723820 0.636390 +vt 0.721830 0.632740 +vt 0.728530 0.641080 +vt 0.724270 0.643460 +vt 0.733100 0.643620 +vt 0.729780 0.645820 +vt 0.735290 0.648180 +vt 0.731030 0.650550 +vt 0.724580 0.648370 +vt 0.741930 0.644290 +vt 0.741280 0.640860 +vt 0.745210 0.638700 +vt 0.740640 0.637440 +vt 0.743820 0.637970 +vt 0.742420 0.637250 +vt 0.744210 0.637060 +vt 0.746350 0.635090 +vt 0.748500 0.633120 +vt 0.747270 0.641280 +vt 0.744310 0.646230 +vt 0.739700 0.648510 +vt 0.742070 0.650080 +vt 0.739830 0.653940 +vt 0.737480 0.652740 +vt 0.732740 0.631960 +vt 0.733460 0.630970 +vt 0.737330 0.638120 +vt 0.734190 0.629980 +vt 0.737370 0.635910 +vt 0.737410 0.633710 +vt 0.736270 0.641840 +vt 0.733270 0.637510 +vt 0.735300 0.637810 +vt 0.730270 0.633180 +vt 0.731500 0.632570 +vt 0.739100 0.643060 +vt 0.728730 0.633840 +vt 0.730140 0.639060 +vt 0.731700 0.638280 +vt 0.734680 0.642730 +vt 0.737190 0.645620 +vt 0.726980 0.637720 +vt 0.726420 0.626960 +vt 0.725030 0.627790 +vt 0.720110 0.622740 +vt 0.722580 0.620750 +vt 0.722240 0.608710 +vt 0.721030 0.608750 +vt 0.724550 0.606670 +vt 0.719820 0.608790 +vt 0.721280 0.605840 +vt 0.722910 0.606250 +vt 0.722750 0.602900 +vt 0.724800 0.603760 +vt 0.724730 0.620400 +vt 0.725720 0.620420 +vt 0.728730 0.626180 +vt 0.726720 0.620440 +vt 0.729590 0.625690 +vt 0.730450 0.625210 +vt 0.727580 0.626570 +vt 0.723650 0.620570 +vt 0.723170 0.616940 +vt 0.722060 0.617210 +vt 0.720940 0.617480 +vt 0.720460 0.613840 +vt 0.721620 0.613480 +vt 0.722860 0.613630 +vt 0.724100 0.613780 +vt 0.724290 0.617020 +vt 0.725410 0.617110 +vt 0.721940 0.611190 +vt 0.720720 0.611130 +vt 0.723170 0.611240 +vt 0.734960 0.602220 +vt 0.737170 0.604470 +vt 0.733650 0.603700 +vt 0.730940 0.601510 +vt 0.726840 0.602200 +vt 0.729230 0.603730 +vt 0.731610 0.605260 +vt 0.726860 0.604630 +vt 0.727560 0.596760 +vt 0.731320 0.596950 +vt 0.733140 0.599590 +vt 0.735080 0.597150 +vt 0.737030 0.600040 +vt 0.729250 0.599130 +vt 0.729180 0.593120 +vt 0.723730 0.595660 +vt 0.722880 0.599210 +vt 0.718210 0.601660 +vt 0.718290 0.598210 +vt 0.740450 0.599990 +vt 0.738400 0.596170 +vt 0.741720 0.595190 +vt 0.736260 0.592330 +vt 0.740780 0.590160 +vt 0.744690 0.592540 +vt 0.747380 0.597580 +vt 0.751940 0.592120 +vt 0.749660 0.594850 +vt 0.754630 0.597160 +vt 0.748340 0.601550 +vt 0.743870 0.599930 +vt 0.753040 0.599970 +vt 0.733790 0.594640 +vt 0.724860 0.600700 +vt 0.720480 0.602280 +vt 0.711520 0.600760 +vt 0.712400 0.602980 +vt 0.711000 0.605610 +vt 0.709750 0.604100 +vt 0.715350 0.600590 +vt 0.715230 0.604390 +vt 0.712250 0.607120 +vt 0.713640 0.610360 +vt 0.713620 0.616270 +vt 0.715040 0.613600 +vt 0.715030 0.617900 +vt 0.716440 0.619520 +vt 0.716420 0.625440 +vt 0.714990 0.625430 +vt 0.719310 0.614210 +vt 0.718330 0.615120 +vt 0.717240 0.613490 +vt 0.717360 0.616030 +vt 0.716200 0.614810 +vt 0.718280 0.612170 +vt 0.716150 0.611870 +vt 0.717730 0.605900 +vt 0.717260 0.610140 +vt 0.715690 0.608130 +vt 0.719510 0.605870 +vt 0.718540 0.609460 +vt 0.719500 0.611650 +vt 0.718730 0.619380 +vt 0.721340 0.621740 +vt 0.719840 0.618430 +vt 0.717590 0.619450 +vt 0.720340 0.634450 +vt 0.719780 0.636900 +vt 0.711520 0.622730 +vt 0.713250 0.624080 +vt 0.712260 0.632640 +vt 0.716020 0.634770 +vt 0.718790 0.645460 +vt 0.713000 0.642560 +vt 0.712120 0.614840 +vt 0.710630 0.613410 +vt 0.709910 0.615020 +vt 0.709180 0.616630 +vt 0.709970 0.555490 +vt 0.705450 0.573660 +vt 0.700930 0.591840 +vt 0.696490 0.592970 +vt 0.798730 0.593630 +vt 0.793410 0.585820 +vt 0.795900 0.582380 +vt 0.788090 0.578010 +vt 0.786650 0.572750 +vt 0.785220 0.567500 +vt 0.805160 0.592000 +vt 0.798400 0.578940 +vt 0.775690 0.562750 +vt 0.774020 0.558250 +vt 0.777120 0.559080 +vt 0.772360 0.553750 +vt 0.773780 0.553030 +vt 0.780210 0.559910 +vt 0.780450 0.565120 +vt 0.782510 0.570660 +vt 0.784570 0.576200 +vt 0.781060 0.574400 +vt 0.778370 0.568570 +vt 0.786100 0.583460 +vt 0.789750 0.584640 +vt 0.791140 0.592520 +vt 0.773720 0.569210 +vt 0.777390 0.571800 +vt 0.779850 0.580460 +vt 0.782970 0.581960 +vt 0.788560 0.592120 +vt 0.764720 0.554330 +vt 0.770200 0.558540 +vt 0.769220 0.561770 +vt 0.773790 0.565170 +vt 0.752950 0.543450 +vt 0.752120 0.540770 +vt 0.758180 0.544690 +vt 0.751300 0.538100 +vt 0.753940 0.537660 +vt 0.756060 0.541170 +vt 0.756590 0.537220 +vt 0.760000 0.541570 +vt 0.760250 0.551170 +vt 0.759210 0.547930 +vt 0.755780 0.548010 +vt 0.754360 0.545730 +vt 0.764070 0.550130 +vt 0.775210 0.552320 +vt 0.770630 0.547610 +vt 0.769120 0.543720 +vt 0.766050 0.542900 +vt 0.761020 0.537820 +vt 0.767620 0.539840 +vt 0.777230 0.549630 +vt 0.779250 0.546940 +vt 0.768900 0.533150 +vt 0.755990 0.532750 +vt 0.753620 0.526810 +vt 0.784180 0.539490 +vt 0.764730 0.544410 +vt 0.763420 0.545930 +vt 0.760510 0.539700 +vt 0.756290 0.534980 +vt 0.751820 0.536260 +vt 0.747360 0.537530 +vt 0.749710 0.534860 +vt 0.743430 0.536970 +vt 0.747730 0.540450 +vt 0.743330 0.540140 +vt 0.748090 0.543380 +vt 0.750870 0.545750 +vt 0.753650 0.548130 +vt 0.747380 0.545780 +vt 0.743240 0.543310 +vt 0.768900 0.566840 +vt 0.771310 0.568020 +vt 0.777710 0.579700 +vt 0.775580 0.578930 +vt 0.757570 0.556500 +vt 0.758910 0.555540 +vt 0.763100 0.561290 +vt 0.760260 0.554580 +vt 0.764580 0.560710 +vt 0.761630 0.561870 +vt 0.767300 0.567040 +vt 0.766900 0.561240 +vt 0.762490 0.554450 +vt 0.765700 0.567250 +vt 0.772480 0.579280 +vt 0.774030 0.579100 +vt 0.779270 0.591310 +vt 0.780770 0.591170 +vt 0.786670 0.605980 +vt 0.792580 0.620800 +vt 0.785340 0.606350 +vt 0.791420 0.621400 +vt 0.791610 0.638980 +vt 0.792890 0.638280 +vt 0.790190 0.639210 +vt 0.789900 0.621720 +vt 0.783910 0.606800 +vt 0.782490 0.607250 +vt 0.777930 0.591890 +vt 0.763580 0.568860 +vt 0.762750 0.569980 +vt 0.759300 0.565690 +vt 0.755690 0.563650 +vt 0.759800 0.564020 +vt 0.755850 0.561410 +vt 0.781370 0.607930 +vt 0.780260 0.608600 +vt 0.775250 0.593370 +vt 0.776590 0.592470 +vt 0.784900 0.623040 +vt 0.779550 0.609120 +vt 0.773340 0.595260 +vt 0.773910 0.594280 +vt 0.767440 0.583920 +vt 0.767910 0.582690 +vt 0.769000 0.581670 +vt 0.770080 0.580660 +vt 0.771280 0.579970 +vt 0.764640 0.568050 +vt 0.756020 0.559180 +vt 0.760710 0.562940 +vt 0.756790 0.557840 +vt 0.738090 0.555280 +vt 0.740080 0.558510 +vt 0.739050 0.552280 +vt 0.741210 0.555230 +vt 0.743370 0.558190 +vt 0.742070 0.561740 +vt 0.741160 0.545260 +vt 0.751520 0.548260 +vt 0.745620 0.547230 +vt 0.750090 0.549190 +vt 0.743870 0.548670 +vt 0.739080 0.547220 +vt 0.728860 0.558200 +vt 0.725060 0.566170 +vt 0.727410 0.550580 +vt 0.721970 0.560460 +vt 0.725970 0.542970 +vt 0.733950 0.555240 +vt 0.734020 0.558190 +vt 0.729950 0.561100 +vt 0.726710 0.567210 +vt 0.748350 0.560740 +vt 0.752020 0.562190 +vt 0.747370 0.568240 +vt 0.751530 0.567460 +vt 0.740780 0.565300 +vt 0.744720 0.564990 +vt 0.745860 0.559460 +vt 0.751970 0.559330 +vt 0.748090 0.557260 +vt 0.751920 0.556480 +vt 0.744650 0.556240 +vt 0.747830 0.553780 +vt 0.743650 0.550850 +vt 0.748670 0.550130 +vt 0.748250 0.551950 +vt 0.739060 0.549750 +vt 0.743440 0.553030 +vt 0.752520 0.554890 +vt 0.754500 0.552360 +vt 0.755890 0.551420 +vt 0.753120 0.553310 +vt 0.758070 0.551290 +vt 0.767890 0.549840 +vt 0.769040 0.554190 +vt 0.769260 0.548720 +vt 0.811590 0.590380 +vt 0.787810 0.564280 +vt 0.795420 0.568660 +vt 0.819430 0.589740 +vt 0.801800 0.564610 +vt 0.801300 0.683710 +vt 0.803330 0.674890 +vt 0.802970 0.692920 +vt 0.805360 0.666070 +vt 0.810260 0.661080 +vt 0.806620 0.677000 +vt 0.815170 0.656100 +vt 0.804650 0.702140 +vt 0.805770 0.623200 +vt 0.802250 0.608410 +vt 0.807810 0.615820 +vt 0.813380 0.623240 +vt 0.810470 0.639650 +vt 0.825010 0.659210 +vt 0.822220 0.624470 +vt 0.809910 0.679120 +vt 0.810210 0.710700 +vt 0.817610 0.684960 +vt 0.801710 0.647100 +vt 0.803500 0.645740 +vt 0.801300 0.658470 +vt 0.805290 0.644390 +vt 0.805320 0.655230 +vt 0.803310 0.656850 +vt 0.800900 0.669850 +vt 0.798510 0.618160 +vt 0.799110 0.633850 +vt 0.799980 0.617410 +vt 0.800840 0.632250 +vt 0.799720 0.649550 +vt 0.793530 0.605140 +vt 0.795560 0.604960 +vt 0.802870 0.620300 +vt 0.798900 0.606690 +vt 0.805530 0.633790 +vt 0.803180 0.633020 +vt 0.807890 0.647440 +vt 0.796610 0.690590 +vt 0.799440 0.683560 +vt 0.791920 0.697480 +vt 0.789630 0.697480 +vt 0.794530 0.690520 +vt 0.787340 0.697480 +vt 0.792460 0.690450 +vt 0.796170 0.653480 +vt 0.795660 0.664270 +vt 0.797240 0.663030 +vt 0.796750 0.674050 +vt 0.794080 0.665520 +vt 0.795150 0.675070 +vt 0.799270 0.660750 +vt 0.798820 0.671950 +vt 0.791110 0.686690 +vt 0.792630 0.686190 +vt 0.788060 0.691460 +vt 0.794150 0.685700 +vt 0.789370 0.691420 +vt 0.786750 0.691500 +vt 0.789770 0.686670 +vt 0.785530 0.691170 +vt 0.790980 0.681490 +vt 0.792330 0.681390 +vt 0.793890 0.680630 +vt 0.795450 0.679870 +vt 0.795870 0.684560 +vt 0.790910 0.690930 +vt 0.797590 0.683420 +vt 0.785960 0.697310 +vt 0.797340 0.678250 +vt 0.799240 0.676630 +vt 0.801280 0.675760 +vt 0.803130 0.667960 +vt 0.783340 0.711550 +vt 0.787630 0.704510 +vt 0.793990 0.706840 +vt 0.795300 0.698720 +vt 0.791120 0.715080 +vt 0.777600 0.728030 +vt 0.780470 0.719790 +vt 0.788530 0.713900 +vt 0.728950 0.661880 +vt 0.724640 0.662810 +vt 0.720340 0.663740 +vt 0.737520 0.660580 +vt 0.733230 0.661230 +vt 0.739180 0.660060 +vt 0.738540 0.666190 +vt 0.740010 0.672390 +vt 0.763190 0.713820 +vt 0.767870 0.711190 +vt 0.768660 0.715860 +vt 0.772550 0.708570 +vt 0.773300 0.712960 +vt 0.777940 0.710060 +vt 0.778730 0.714730 +vt 0.774130 0.717910 +vt 0.779940 0.703020 +vt 0.777920 0.702010 +vt 0.769880 0.706720 +vt 0.783780 0.703770 +vt 0.759650 0.703130 +vt 0.752090 0.701390 +vt 0.759290 0.701690 +vt 0.752080 0.699720 +vt 0.763760 0.707160 +vt 0.757640 0.707600 +vt 0.755360 0.716140 +vt 0.765610 0.719550 +vt 0.775860 0.722970 +vt 0.762570 0.723250 +vt 0.704450 0.620550 +vt 0.699720 0.624470 +vt 0.707980 0.649270 +vt 0.714470 0.671740 +vt 0.708610 0.679750 +vt 0.702960 0.655980 +vt 0.734700 0.539970 +vt 0.737930 0.542610 +vt 0.732520 0.545090 +vt 0.733240 0.550160 +vt 0.724740 0.533620 +vt 0.718890 0.554740 +vt 0.717350 0.544550 +vt 0.736040 0.531270 +vt 0.747340 0.528920 +vt 0.750220 0.530190 +vt 0.760480 0.732280 +vt 0.778100 0.734890 +vt 0.794150 0.722800 +vt 0.778350 0.719160 +vt 0.747900 0.696420 +vt 0.746950 0.697110 +vt 0.749810 0.709930 +vt 0.747140 0.704230 +vt 0.754270 0.711220 +vt 0.252440 0.718470 +vt 0.262360 0.701690 +vt 0.257110 0.729660 +vt 0.272290 0.684920 +vt 0.268060 0.711940 +vt 0.279000 0.694220 +vt 0.273750 0.722190 +vt 0.258170 0.692840 +vt 0.258670 0.687410 +vt 0.262410 0.684120 +vt 0.259170 0.681980 +vt 0.260790 0.675200 +vt 0.261600 0.679660 +vt 0.262410 0.668420 +vt 0.266660 0.675400 +vt 0.255300 0.705650 +vt 0.262390 0.692900 +vt 0.269470 0.680160 +vt 0.219000 0.677990 +vt 0.218110 0.673250 +vt 0.218890 0.672560 +vt 0.217220 0.668520 +vt 0.217940 0.667800 +vt 0.218670 0.667080 +vt 0.219840 0.677320 +vt 0.219680 0.671870 +vt 0.216330 0.654990 +vt 0.217500 0.661030 +vt 0.215800 0.655580 +vt 0.216870 0.661690 +vt 0.216240 0.662350 +vt 0.213750 0.656590 +vt 0.214510 0.656380 +vt 0.214760 0.663340 +vt 0.215270 0.656180 +vt 0.215500 0.662840 +vt 0.216490 0.669300 +vt 0.215770 0.670090 +vt 0.208180 0.656570 +vt 0.209500 0.656710 +vt 0.208650 0.666560 +vt 0.210830 0.656860 +vt 0.209910 0.666340 +vt 0.211180 0.666120 +vt 0.210320 0.675970 +vt 0.209120 0.676550 +vt 0.211530 0.675390 +vt 0.212720 0.674050 +vt 0.212650 0.680420 +vt 0.213910 0.672710 +vt 0.213790 0.679070 +vt 0.214930 0.677720 +vt 0.214860 0.684090 +vt 0.213770 0.685450 +vt 0.215080 0.623040 +vt 0.214410 0.639810 +vt 0.213730 0.639830 +vt 0.213250 0.656680 +vt 0.212750 0.656780 +vt 0.214220 0.622980 +vt 0.213050 0.639850 +vt 0.213360 0.622930 +vt 0.212130 0.639650 +vt 0.211790 0.656820 +vt 0.212470 0.622480 +vt 0.211200 0.639450 +vt 0.213330 0.664740 +vt 0.214040 0.664040 +vt 0.214840 0.671400 +vt 0.212250 0.665430 +vt 0.210330 0.681600 +vt 0.211490 0.681010 +vt 0.212660 0.686050 +vt 0.211550 0.686650 +vt 0.215660 0.690840 +vt 0.216590 0.689920 +vt 0.217510 0.689000 +vt 0.220520 0.693790 +vt 0.219780 0.695030 +vt 0.215950 0.682730 +vt 0.218370 0.687630 +vt 0.219230 0.686260 +vt 0.222520 0.689790 +vt 0.221260 0.692550 +vt 0.223310 0.684700 +vt 0.223870 0.684010 +vt 0.227950 0.684720 +vt 0.224440 0.683320 +vt 0.227670 0.683690 +vt 0.230910 0.684060 +vt 0.228230 0.685750 +vt 0.232030 0.685430 +vt 0.233150 0.686800 +vt 0.233200 0.688710 +vt 0.233260 0.690620 +vt 0.228100 0.687260 +vt 0.227970 0.688780 +vt 0.222990 0.685820 +vt 0.222680 0.686950 +vt 0.220120 0.683250 +vt 0.220630 0.682290 +vt 0.217560 0.679550 +vt 0.218280 0.678770 +vt 0.221150 0.681340 +vt 0.222600 0.688370 +vt 0.228160 0.690130 +vt 0.228350 0.691470 +vt 0.233720 0.691890 +vt 0.216750 0.681140 +vt 0.219670 0.684750 +vt 0.215790 0.676270 +vt 0.216660 0.674820 +vt 0.217380 0.674030 +vt 0.220690 0.676660 +vt 0.221860 0.680660 +vt 0.222560 0.679990 +vt 0.205360 0.654960 +vt 0.206770 0.655760 +vt 0.205890 0.665520 +vt 0.207270 0.666040 +vt 0.207770 0.676320 +vt 0.202250 0.652010 +vt 0.202590 0.635460 +vt 0.204190 0.636520 +vt 0.202930 0.618910 +vt 0.204580 0.619550 +vt 0.206240 0.620200 +vt 0.203800 0.653480 +vt 0.205800 0.637580 +vt 0.208460 0.605310 +vt 0.214000 0.591720 +vt 0.210220 0.605460 +vt 0.215850 0.591370 +vt 0.211970 0.605610 +vt 0.238810 0.574070 +vt 0.238630 0.576200 +vt 0.233090 0.586670 +vt 0.238460 0.578330 +vt 0.233170 0.588190 +vt 0.227550 0.597150 +vt 0.233010 0.585150 +vt 0.234180 0.702460 +vt 0.225880 0.699380 +vt 0.234430 0.701310 +vt 0.217580 0.696310 +vt 0.226550 0.698490 +vt 0.218680 0.695670 +vt 0.227230 0.697590 +vt 0.234680 0.700160 +vt 0.233910 0.683760 +vt 0.232390 0.683070 +vt 0.233880 0.682090 +vt 0.235430 0.684450 +vt 0.235800 0.682100 +vt 0.239450 0.684780 +vt 0.236300 0.685790 +vt 0.236770 0.684560 +vt 0.238580 0.683440 +vt 0.244280 0.569720 +vt 0.241540 0.571890 +vt 0.244280 0.566680 +vt 0.241360 0.569630 +vt 0.238430 0.572580 +vt 0.241170 0.567370 +vt 0.244290 0.563650 +vt 0.243760 0.594350 +vt 0.243270 0.590110 +vt 0.248040 0.592120 +vt 0.242790 0.585870 +vt 0.246810 0.587770 +vt 0.245580 0.583420 +vt 0.250340 0.585430 +vt 0.252320 0.589890 +vt 0.233470 0.703660 +vt 0.224970 0.700190 +vt 0.232760 0.704870 +vt 0.224070 0.701010 +vt 0.215390 0.697150 +vt 0.216480 0.696730 +vt 0.257040 0.586110 +vt 0.254680 0.588000 +vt 0.255310 0.580920 +vt 0.252830 0.583180 +vt 0.250980 0.578360 +vt 0.253590 0.575740 +vt 0.252580 0.685430 +vt 0.255200 0.680310 +vt 0.253160 0.687810 +vt 0.257820 0.675200 +vt 0.255820 0.683200 +vt 0.258490 0.678590 +vt 0.256450 0.686090 +vt 0.253740 0.690200 +vt 0.249460 0.663370 +vt 0.250010 0.665830 +vt 0.248960 0.666210 +vt 0.250560 0.668290 +vt 0.248160 0.665170 +vt 0.246870 0.666970 +vt 0.250660 0.662070 +vt 0.251870 0.660780 +vt 0.251210 0.664530 +vt 0.250630 0.664140 +vt 0.247390 0.606360 +vt 0.250670 0.605520 +vt 0.247650 0.610210 +vt 0.253950 0.604680 +vt 0.253190 0.607800 +vt 0.250420 0.609000 +vt 0.250170 0.612490 +vt 0.247910 0.614070 +vt 0.256240 0.693130 +vt 0.256350 0.689610 +vt 0.254320 0.693430 +vt 0.254030 0.691810 +vt 0.260990 0.602940 +vt 0.259290 0.605240 +vt 0.257470 0.603810 +vt 0.257600 0.607550 +vt 0.255020 0.609230 +vt 0.256240 0.606520 +vt 0.252440 0.610920 +vt 0.244610 0.646150 +vt 0.242560 0.642700 +vt 0.243120 0.640700 +vt 0.240510 0.639260 +vt 0.240780 0.636720 +vt 0.241050 0.634190 +vt 0.245460 0.644690 +vt 0.243680 0.638710 +vt 0.248060 0.658430 +vt 0.247060 0.658930 +vt 0.243990 0.654310 +vt 0.246070 0.659440 +vt 0.242980 0.655090 +vt 0.241980 0.655860 +vt 0.238910 0.651240 +vt 0.239920 0.650200 +vt 0.247760 0.661400 +vt 0.247860 0.660410 +vt 0.248760 0.660900 +vt 0.249790 0.660860 +vt 0.242040 0.647970 +vt 0.244790 0.651060 +vt 0.244390 0.652680 +vt 0.247550 0.654150 +vt 0.247800 0.656290 +vt 0.240980 0.649080 +vt 0.249320 0.655400 +vt 0.249640 0.657500 +vt 0.251100 0.656660 +vt 0.251480 0.658720 +vt 0.246920 0.649250 +vt 0.245850 0.650150 +vt 0.249230 0.652350 +vt 0.248390 0.653250 +vt 0.243320 0.647060 +vt 0.253190 0.656540 +vt 0.252140 0.656600 +vt 0.250260 0.654920 +vt 0.251210 0.654440 +vt 0.260470 0.663970 +vt 0.259090 0.662530 +vt 0.259130 0.659550 +vt 0.257710 0.661100 +vt 0.257810 0.659030 +vt 0.256480 0.658510 +vt 0.256530 0.655530 +vt 0.257800 0.655140 +vt 0.257050 0.672270 +vt 0.258070 0.667400 +vt 0.256290 0.669350 +vt 0.257000 0.665220 +vt 0.259140 0.669580 +vt 0.249840 0.693260 +vt 0.251110 0.695740 +vt 0.250470 0.694500 +vt 0.247910 0.698050 +vt 0.245940 0.696330 +vt 0.249090 0.691230 +vt 0.245020 0.694650 +vt 0.248340 0.689200 +vt 0.246920 0.697190 +vt 0.240670 0.699250 +vt 0.241040 0.700250 +vt 0.240310 0.698240 +vt 0.234190 0.693160 +vt 0.238310 0.691320 +vt 0.234400 0.694780 +vt 0.242440 0.689480 +vt 0.238840 0.693000 +vt 0.243270 0.691230 +vt 0.239360 0.694690 +vt 0.234620 0.696410 +vt 0.221890 0.691170 +vt 0.227940 0.694480 +vt 0.228140 0.692970 +vt 0.227580 0.696030 +vt 0.234650 0.698280 +vt 0.244110 0.692980 +vt 0.239830 0.696470 +vt 0.247680 0.687370 +vt 0.247030 0.685550 +vt 0.251620 0.681620 +vt 0.252100 0.683520 +vt 0.253230 0.661240 +vt 0.252690 0.658920 +vt 0.253890 0.659120 +vt 0.254600 0.661700 +vt 0.252340 0.663590 +vt 0.252580 0.664990 +vt 0.250280 0.678440 +vt 0.252560 0.673090 +vt 0.250950 0.680030 +vt 0.254840 0.667750 +vt 0.253250 0.674290 +vt 0.255560 0.668550 +vt 0.253950 0.675480 +vt 0.250420 0.673360 +vt 0.252570 0.669040 +vt 0.254720 0.664720 +vt 0.240310 0.686100 +vt 0.241180 0.687430 +vt 0.236760 0.687400 +vt 0.237220 0.689020 +vt 0.237760 0.690170 +vt 0.241810 0.688450 +vt 0.244400 0.675550 +vt 0.245510 0.676760 +vt 0.242040 0.680100 +vt 0.246620 0.677970 +vt 0.243030 0.681370 +vt 0.241060 0.678830 +vt 0.248450 0.678200 +vt 0.249150 0.674900 +vt 0.248590 0.673130 +vt 0.247110 0.672190 +vt 0.245630 0.671260 +vt 0.244380 0.682150 +vt 0.245730 0.682930 +vt 0.246380 0.684240 +vt 0.254570 0.677900 +vt 0.255860 0.664970 +vt 0.256150 0.661400 +vt 0.255190 0.658810 +vt 0.255260 0.655930 +vt 0.253080 0.653240 +vt 0.254310 0.652440 +vt 0.250910 0.650550 +vt 0.252100 0.649360 +vt 0.253290 0.648170 +vt 0.255540 0.651650 +vt 0.248610 0.646890 +vt 0.249630 0.645370 +vt 0.246310 0.643230 +vt 0.247160 0.641380 +vt 0.248010 0.639540 +vt 0.250650 0.643850 +vt 0.254220 0.656230 +vt 0.252140 0.653840 +vt 0.250070 0.651450 +vt 0.247760 0.648070 +vt 0.244500 0.636760 +vt 0.241850 0.632140 +vt 0.242660 0.630090 +vt 0.245330 0.634810 +vt 0.236430 0.621370 +vt 0.239450 0.617640 +vt 0.242400 0.618180 +vt 0.242480 0.613920 +vt 0.245190 0.613990 +vt 0.239600 0.622370 +vt 0.242780 0.623370 +vt 0.243560 0.611420 +vt 0.239480 0.612640 +vt 0.236490 0.611360 +vt 0.241940 0.608860 +vt 0.242000 0.578360 +vt 0.240230 0.578340 +vt 0.243140 0.574040 +vt 0.240880 0.575120 +vt 0.242390 0.582110 +vt 0.245180 0.579670 +vt 0.244380 0.581730 +vt 0.248370 0.580980 +vt 0.247060 0.576200 +vt 0.248930 0.572730 +vt 0.216110 0.623230 +vt 0.217140 0.623430 +vt 0.215310 0.639810 +vt 0.216200 0.639800 +vt 0.221140 0.609640 +vt 0.221830 0.610190 +vt 0.227210 0.596240 +vt 0.227890 0.598060 +vt 0.222510 0.610740 +vt 0.246940 0.599970 +vt 0.247160 0.603160 +vt 0.241050 0.606430 +vt 0.240160 0.604000 +vt 0.234930 0.609700 +vt 0.233380 0.608040 +vt 0.230750 0.616440 +vt 0.232350 0.617150 +vt 0.228210 0.622940 +vt 0.229160 0.615740 +vt 0.226580 0.623190 +vt 0.234930 0.642960 +vt 0.237420 0.646580 +vt 0.233440 0.644160 +vt 0.236170 0.647700 +vt 0.234930 0.648830 +vt 0.231960 0.645370 +vt 0.234780 0.627760 +vt 0.231500 0.628800 +vt 0.233140 0.634150 +vt 0.230690 0.635460 +vt 0.228220 0.629850 +vt 0.232320 0.622150 +vt 0.237950 0.640050 +vt 0.239990 0.644010 +vt 0.238710 0.645290 +vt 0.236440 0.641500 +vt 0.241270 0.643350 +vt 0.239230 0.639650 +vt 0.239440 0.632600 +vt 0.239330 0.636130 +vt 0.237830 0.631020 +vt 0.237890 0.635530 +vt 0.235480 0.632580 +vt 0.235960 0.637040 +vt 0.234030 0.638550 +vt 0.232060 0.639810 +vt 0.230100 0.641070 +vt 0.245380 0.663940 +vt 0.246570 0.662670 +vt 0.243890 0.660920 +vt 0.244980 0.660180 +vt 0.240690 0.658470 +vt 0.241340 0.657170 +vt 0.237500 0.656030 +vt 0.237700 0.654160 +vt 0.234850 0.651290 +vt 0.237900 0.652290 +vt 0.232000 0.648420 +vt 0.234770 0.653750 +vt 0.228240 0.636770 +vt 0.229770 0.644260 +vt 0.232040 0.651470 +vt 0.227540 0.640110 +vt 0.226840 0.643460 +vt 0.224950 0.623450 +vt 0.225890 0.633450 +vt 0.227060 0.631650 +vt 0.235900 0.617390 +vt 0.240300 0.627190 +vt 0.237540 0.627470 +vt 0.242720 0.626730 +vt 0.241080 0.629660 +vt 0.246230 0.631530 +vt 0.249740 0.636330 +vt 0.247130 0.628240 +vt 0.274160 0.576870 +vt 0.274230 0.574690 +vt 0.276990 0.580880 +vt 0.274300 0.572520 +vt 0.276750 0.577110 +vt 0.276510 0.573330 +vt 0.279270 0.579520 +vt 0.279820 0.584900 +vt 0.267190 0.572380 +vt 0.270670 0.574620 +vt 0.267660 0.576480 +vt 0.272320 0.578680 +vt 0.273980 0.582740 +vt 0.268140 0.580580 +vt 0.268930 0.564000 +vt 0.271610 0.568260 +vt 0.268060 0.568190 +vt 0.271140 0.571440 +vt 0.262850 0.558280 +vt 0.265890 0.561140 +vt 0.261020 0.561790 +vt 0.264540 0.564990 +vt 0.263190 0.568840 +vt 0.259200 0.565300 +vt 0.256390 0.570520 +vt 0.262030 0.573500 +vt 0.260860 0.578160 +vt 0.268660 0.585030 +vt 0.261980 0.582970 +vt 0.269180 0.589480 +vt 0.263110 0.587790 +vt 0.274680 0.587430 +vt 0.280710 0.589830 +vt 0.275390 0.592120 +vt 0.288440 0.592980 +vt 0.287930 0.595910 +vt 0.284130 0.588940 +vt 0.287420 0.598840 +vt 0.284320 0.592870 +vt 0.284510 0.596800 +vt 0.278720 0.574150 +vt 0.283440 0.570330 +vt 0.283780 0.579630 +vt 0.288160 0.566520 +vt 0.288300 0.579750 +vt 0.255150 0.610810 +vt 0.257880 0.608760 +vt 0.260600 0.606720 +vt 0.260740 0.608300 +vt 0.252510 0.613170 +vt 0.257870 0.610710 +vt 0.249870 0.615530 +vt 0.254850 0.613850 +vt 0.245340 0.618720 +vt 0.248500 0.621880 +vt 0.251650 0.625050 +vt 0.251480 0.633120 +vt 0.290230 0.604100 +vt 0.289330 0.598540 +vt 0.290360 0.588570 +vt 0.292420 0.597400 +vt 0.291380 0.578610 +vt 0.282130 0.625450 +vt 0.279210 0.629840 +vt 0.281000 0.624090 +vt 0.276300 0.634240 +vt 0.277770 0.629230 +vt 0.274540 0.634370 +vt 0.276330 0.628620 +vt 0.279070 0.632000 +vt 0.278140 0.632740 +vt 0.276010 0.638550 +vt 0.276150 0.636390 +vt 0.262500 0.652740 +vt 0.264690 0.648180 +vt 0.270190 0.645820 +vt 0.266880 0.643620 +vt 0.271440 0.641080 +vt 0.268950 0.650550 +vt 0.275700 0.643460 +vt 0.255770 0.637060 +vt 0.257550 0.637250 +vt 0.253620 0.635090 +vt 0.259340 0.637440 +vt 0.256160 0.637970 +vt 0.258690 0.640860 +vt 0.258050 0.644290 +vt 0.252700 0.641280 +vt 0.255670 0.646230 +vt 0.254760 0.638700 +vt 0.257910 0.650080 +vt 0.260150 0.653940 +vt 0.260270 0.648510 +vt 0.262560 0.633710 +vt 0.265790 0.629980 +vt 0.262600 0.635910 +vt 0.266510 0.630970 +vt 0.267240 0.631960 +vt 0.268470 0.632570 +vt 0.262640 0.638120 +vt 0.269710 0.633180 +vt 0.264670 0.637810 +vt 0.266710 0.637510 +vt 0.260880 0.643060 +vt 0.263710 0.641840 +vt 0.265290 0.642730 +vt 0.271250 0.633840 +vt 0.268270 0.638280 +vt 0.272790 0.634500 +vt 0.262780 0.645620 +vt 0.269830 0.639060 +vt 0.272990 0.637720 +vt 0.279870 0.622740 +vt 0.274940 0.627790 +vt 0.278630 0.621740 +vt 0.273550 0.626960 +vt 0.277230 0.602900 +vt 0.278690 0.605840 +vt 0.277060 0.606250 +vt 0.280160 0.608790 +vt 0.278950 0.608750 +vt 0.277740 0.608710 +vt 0.275170 0.603760 +vt 0.275430 0.606670 +vt 0.269520 0.625210 +vt 0.273260 0.620440 +vt 0.270380 0.625690 +vt 0.274250 0.620420 +vt 0.271240 0.626180 +vt 0.275250 0.620400 +vt 0.276320 0.620570 +vt 0.277400 0.620750 +vt 0.272400 0.626570 +vt 0.280670 0.614210 +vt 0.279030 0.617480 +vt 0.279510 0.613840 +vt 0.277920 0.617210 +vt 0.276800 0.616940 +vt 0.274570 0.617110 +vt 0.275880 0.613780 +vt 0.275680 0.617020 +vt 0.277120 0.613630 +vt 0.278360 0.613480 +vt 0.279260 0.611130 +vt 0.278030 0.611190 +vt 0.276810 0.611240 +vt 0.263610 0.605890 +vt 0.262810 0.604470 +vt 0.266320 0.603700 +vt 0.265010 0.602220 +vt 0.268360 0.605260 +vt 0.269040 0.601510 +vt 0.270750 0.603730 +vt 0.273130 0.602200 +vt 0.262940 0.600040 +vt 0.264900 0.597150 +vt 0.266830 0.599590 +vt 0.268660 0.596950 +vt 0.270730 0.599130 +vt 0.281770 0.601660 +vt 0.277090 0.599210 +vt 0.281680 0.598210 +vt 0.272420 0.596760 +vt 0.276240 0.595660 +vt 0.270800 0.593120 +vt 0.281600 0.594770 +vt 0.258260 0.595190 +vt 0.261580 0.596170 +vt 0.256100 0.599930 +vt 0.259520 0.599990 +vt 0.259200 0.590160 +vt 0.255290 0.592540 +vt 0.263720 0.592330 +vt 0.250320 0.594850 +vt 0.245350 0.597160 +vt 0.252600 0.597580 +vt 0.251630 0.601550 +vt 0.266190 0.594640 +vt 0.279500 0.602280 +vt 0.275110 0.600700 +vt 0.287730 0.607120 +vt 0.287570 0.602980 +vt 0.288450 0.600760 +vt 0.288980 0.605610 +vt 0.284750 0.604390 +vt 0.284630 0.600590 +vt 0.283530 0.619520 +vt 0.284940 0.617900 +vt 0.284940 0.613600 +vt 0.286330 0.610360 +vt 0.283560 0.625440 +vt 0.286360 0.616270 +vt 0.283780 0.614810 +vt 0.283830 0.611870 +vt 0.282620 0.616030 +vt 0.282730 0.613490 +vt 0.281640 0.615120 +vt 0.281690 0.612170 +vt 0.282720 0.610140 +vt 0.284290 0.608130 +vt 0.282240 0.605900 +vt 0.281440 0.609460 +vt 0.280470 0.605870 +vt 0.280470 0.611650 +vt 0.280140 0.618430 +vt 0.281240 0.619380 +vt 0.282390 0.619450 +vt 0.275400 0.648370 +vt 0.279630 0.634450 +vt 0.280190 0.636900 +vt 0.284990 0.625430 +vt 0.283950 0.634770 +vt 0.286720 0.624080 +vt 0.288460 0.622730 +vt 0.281190 0.645460 +vt 0.286980 0.642560 +vt 0.289340 0.613410 +vt 0.287850 0.614840 +vt 0.287720 0.632640 +vt 0.290070 0.615020 +vt 0.290790 0.616630 +vt 0.294610 0.590710 +vt 0.294530 0.573660 +vt 0.290010 0.555490 +vt 0.299050 0.591840 +vt 0.214760 0.567500 +vt 0.213320 0.572750 +vt 0.201570 0.578940 +vt 0.211890 0.578010 +vt 0.204070 0.582380 +vt 0.206570 0.585820 +vt 0.194820 0.592000 +vt 0.188390 0.590380 +vt 0.224770 0.552320 +vt 0.226190 0.553030 +vt 0.219760 0.559910 +vt 0.227620 0.553750 +vt 0.222860 0.559080 +vt 0.225950 0.558250 +vt 0.219520 0.565120 +vt 0.218920 0.574400 +vt 0.215400 0.576200 +vt 0.221600 0.568570 +vt 0.217460 0.570660 +vt 0.201250 0.593630 +vt 0.205040 0.593070 +vt 0.210220 0.584640 +vt 0.213880 0.583460 +vt 0.208840 0.592520 +vt 0.217000 0.581960 +vt 0.222590 0.571800 +vt 0.226260 0.569210 +vt 0.211420 0.592120 +vt 0.226180 0.565170 +vt 0.224290 0.562750 +vt 0.229770 0.558540 +vt 0.235260 0.554330 +vt 0.230760 0.561770 +vt 0.243390 0.537220 +vt 0.246030 0.537660 +vt 0.243910 0.541170 +vt 0.248680 0.538100 +vt 0.247850 0.540770 +vt 0.247030 0.543450 +vt 0.239970 0.541570 +vt 0.241790 0.544690 +vt 0.245610 0.545730 +vt 0.244200 0.548010 +vt 0.239730 0.551170 +vt 0.240760 0.547930 +vt 0.235910 0.550130 +vt 0.236560 0.545930 +vt 0.243990 0.532750 +vt 0.238960 0.537820 +vt 0.230850 0.543720 +vt 0.233930 0.542900 +vt 0.229350 0.547610 +vt 0.232360 0.539840 +vt 0.220730 0.546940 +vt 0.246360 0.526810 +vt 0.231080 0.533150 +vt 0.229800 0.526450 +vt 0.243690 0.534980 +vt 0.239460 0.539700 +vt 0.235240 0.544410 +vt 0.256550 0.536970 +vt 0.252610 0.537530 +vt 0.250270 0.534860 +vt 0.248150 0.536260 +vt 0.251880 0.543380 +vt 0.252250 0.540450 +vt 0.256740 0.543310 +vt 0.248460 0.548260 +vt 0.246330 0.548130 +vt 0.249100 0.545750 +vt 0.252600 0.545780 +vt 0.220130 0.580460 +vt 0.222260 0.579700 +vt 0.228670 0.568020 +vt 0.224390 0.578930 +vt 0.217710 0.591030 +vt 0.231080 0.566840 +vt 0.235400 0.560710 +vt 0.232680 0.567040 +vt 0.239720 0.554580 +vt 0.236870 0.561290 +vt 0.241060 0.555540 +vt 0.238340 0.561870 +vt 0.234280 0.567250 +vt 0.237490 0.554450 +vt 0.233080 0.561240 +vt 0.219210 0.591170 +vt 0.225940 0.579100 +vt 0.227490 0.579280 +vt 0.213300 0.605980 +vt 0.214630 0.606350 +vt 0.207400 0.620800 +vt 0.207080 0.638280 +vt 0.208560 0.621400 +vt 0.208370 0.638980 +vt 0.210070 0.621720 +vt 0.211580 0.622040 +vt 0.209780 0.639210 +vt 0.223390 0.592470 +vt 0.217480 0.607250 +vt 0.216060 0.606800 +vt 0.222050 0.591890 +vt 0.244120 0.561410 +vt 0.238060 0.571100 +vt 0.240670 0.565690 +vt 0.237230 0.569980 +vt 0.240180 0.564020 +vt 0.243960 0.559180 +vt 0.226070 0.594280 +vt 0.219710 0.608600 +vt 0.218600 0.607930 +vt 0.224730 0.593370 +vt 0.220430 0.609120 +vt 0.226640 0.595260 +vt 0.232530 0.583920 +vt 0.232060 0.582690 +vt 0.230980 0.581670 +vt 0.229890 0.580660 +vt 0.236400 0.568860 +vt 0.235340 0.568050 +vt 0.228690 0.579970 +vt 0.220710 0.591310 +vt 0.242410 0.556500 +vt 0.243180 0.557840 +vt 0.239260 0.562940 +vt 0.256610 0.558190 +vt 0.258770 0.555230 +vt 0.257900 0.561740 +vt 0.260930 0.552280 +vt 0.261890 0.555280 +vt 0.259890 0.558510 +vt 0.251310 0.550130 +vt 0.249880 0.549190 +vt 0.254350 0.547230 +vt 0.256100 0.548670 +vt 0.258820 0.545260 +vt 0.281080 0.554740 +vt 0.274920 0.566170 +vt 0.278000 0.560460 +vt 0.272560 0.550580 +vt 0.274010 0.542970 +vt 0.270020 0.561100 +vt 0.265950 0.558190 +vt 0.266020 0.555240 +vt 0.271120 0.558200 +vt 0.273260 0.567210 +vt 0.248440 0.567460 +vt 0.247960 0.562190 +vt 0.251630 0.560740 +vt 0.254120 0.559460 +vt 0.252610 0.568240 +vt 0.255250 0.564990 +vt 0.252150 0.553780 +vt 0.251890 0.557260 +vt 0.248000 0.559330 +vt 0.248050 0.556480 +vt 0.255330 0.556240 +vt 0.256540 0.553030 +vt 0.251730 0.551950 +vt 0.256320 0.550850 +vt 0.260910 0.549750 +vt 0.246860 0.553310 +vt 0.247450 0.554890 +vt 0.244090 0.551420 +vt 0.245470 0.552360 +vt 0.241910 0.551290 +vt 0.230930 0.554190 +vt 0.232090 0.549840 +vt 0.230720 0.548720 +vt 0.222750 0.549630 +vt 0.212160 0.564280 +vt 0.204560 0.568660 +vt 0.198170 0.564610 +vt 0.180540 0.589740 +vt 0.215800 0.539490 +vt 0.184810 0.656100 +vt 0.189710 0.661080 +vt 0.193360 0.677000 +vt 0.194620 0.666070 +vt 0.196650 0.674890 +vt 0.198680 0.683710 +vt 0.190070 0.679120 +vt 0.197000 0.692920 +vt 0.192160 0.615820 +vt 0.197730 0.608410 +vt 0.194210 0.623200 +vt 0.186600 0.623240 +vt 0.189510 0.639650 +vt 0.177750 0.624470 +vt 0.174960 0.659210 +vt 0.182360 0.684960 +vt 0.195330 0.702140 +vt 0.189760 0.710700 +vt 0.194650 0.655230 +vt 0.196660 0.656850 +vt 0.194690 0.644390 +vt 0.196480 0.645740 +vt 0.198270 0.647100 +vt 0.196850 0.667960 +vt 0.198670 0.658470 +vt 0.199130 0.632250 +vt 0.200260 0.649550 +vt 0.200000 0.617410 +vt 0.200860 0.633850 +vt 0.201460 0.618160 +vt 0.204420 0.604960 +vt 0.206440 0.605140 +vt 0.201070 0.606690 +vt 0.197100 0.620300 +vt 0.196790 0.633020 +vt 0.194450 0.633790 +vt 0.192080 0.647440 +vt 0.212640 0.697480 +vt 0.210350 0.697480 +vt 0.207510 0.690450 +vt 0.208060 0.697480 +vt 0.203370 0.690590 +vt 0.205440 0.690520 +vt 0.202390 0.683420 +vt 0.203230 0.674050 +vt 0.202740 0.663030 +vt 0.204830 0.675070 +vt 0.204310 0.664270 +vt 0.206430 0.676090 +vt 0.199080 0.669850 +vt 0.201150 0.671950 +vt 0.200700 0.660750 +vt 0.210610 0.691420 +vt 0.205830 0.685700 +vt 0.211910 0.691460 +vt 0.207350 0.686190 +vt 0.213220 0.691500 +vt 0.208870 0.686690 +vt 0.214440 0.691170 +vt 0.210210 0.686670 +vt 0.208990 0.681490 +vt 0.207650 0.681390 +vt 0.204530 0.679870 +vt 0.206090 0.680630 +vt 0.209060 0.690930 +vt 0.204110 0.684560 +vt 0.214010 0.697310 +vt 0.200730 0.676630 +vt 0.202630 0.678250 +vt 0.198690 0.675760 +vt 0.200530 0.683560 +vt 0.212350 0.704510 +vt 0.204670 0.698720 +vt 0.216640 0.711550 +vt 0.205980 0.706840 +vt 0.222380 0.728030 +vt 0.208850 0.715080 +vt 0.211450 0.713900 +vt 0.219510 0.719790 +vt 0.275330 0.662810 +vt 0.271030 0.661880 +vt 0.279630 0.663740 +vt 0.264530 0.671910 +vt 0.266740 0.661230 +vt 0.262450 0.660580 +vt 0.261440 0.666190 +vt 0.260790 0.660060 +vt 0.259960 0.672390 +vt 0.222030 0.710060 +vt 0.226670 0.712960 +vt 0.227430 0.708570 +vt 0.232110 0.711190 +vt 0.236790 0.713820 +vt 0.221240 0.714730 +vt 0.231320 0.715860 +vt 0.230090 0.706720 +vt 0.222050 0.702010 +vt 0.220030 0.703020 +vt 0.216190 0.703770 +vt 0.247900 0.699720 +vt 0.240680 0.701690 +vt 0.247890 0.701390 +vt 0.240320 0.703130 +vt 0.242340 0.707600 +vt 0.236210 0.707160 +vt 0.225850 0.717910 +vt 0.234360 0.719550 +vt 0.244610 0.716140 +vt 0.237410 0.723250 +vt 0.224110 0.722970 +vt 0.292000 0.649270 +vt 0.295520 0.620550 +vt 0.300250 0.624470 +vt 0.297020 0.655980 +vt 0.285720 0.703520 +vt 0.285500 0.671740 +vt 0.291370 0.679750 +vt 0.260900 0.547220 +vt 0.262050 0.542610 +vt 0.256640 0.540140 +vt 0.267450 0.545090 +vt 0.265280 0.539970 +vt 0.266740 0.550160 +vt 0.282620 0.544550 +vt 0.275240 0.533620 +vt 0.263940 0.531270 +vt 0.252640 0.528920 +vt 0.249750 0.530190 +vt 0.221880 0.734890 +vt 0.239490 0.732280 +vt 0.205820 0.722800 +vt 0.221620 0.719160 +vt 0.252070 0.696420 +vt 0.253030 0.697110 +vt 0.250160 0.709930 +vt 0.252830 0.704230 +vt 0.245700 0.711220 +vt 0.672720 0.798910 +vt 0.647290 0.820760 +vt 0.638400 0.804250 +vt 0.698160 0.777060 +vt 0.665700 0.775030 +vt 0.693000 0.745820 +vt 0.703630 0.724670 +vt 0.712190 0.749620 +vt 0.548720 0.684190 +vt 0.553930 0.682530 +vt 0.554660 0.685130 +vt 0.559140 0.680880 +vt 0.559640 0.683480 +vt 0.560150 0.686080 +vt 0.549670 0.686790 +vt 0.555390 0.687740 +vt 0.598420 0.682570 +vt 0.603120 0.686940 +vt 0.600920 0.689730 +vt 0.607820 0.691310 +vt 0.605280 0.694390 +vt 0.602750 0.697470 +vt 0.596550 0.685070 +vt 0.598720 0.692520 +vt 0.584180 0.677750 +vt 0.591300 0.680160 +vt 0.589950 0.682920 +vt 0.594690 0.687570 +vt 0.583350 0.680780 +vt 0.588610 0.685690 +vt 0.570940 0.678070 +vt 0.577560 0.677910 +vt 0.577090 0.680910 +vt 0.582530 0.683810 +vt 0.570820 0.681050 +vt 0.576620 0.683920 +vt 0.565040 0.679470 +vt 0.565230 0.682260 +vt 0.570710 0.684040 +vt 0.565430 0.685060 +vt 0.610240 0.698500 +vt 0.606950 0.699970 +vt 0.612660 0.705700 +vt 0.608620 0.705550 +vt 0.604580 0.705400 +vt 0.603660 0.701430 +vt 0.534220 0.710700 +vt 0.533710 0.706580 +vt 0.535810 0.705810 +vt 0.533210 0.702470 +vt 0.535490 0.702580 +vt 0.537780 0.702690 +vt 0.536120 0.709050 +vt 0.537900 0.705040 +vt 0.534120 0.699780 +vt 0.536250 0.700380 +vt 0.535030 0.697100 +vt 0.537010 0.698190 +vt 0.538990 0.699280 +vt 0.538380 0.700980 +vt 0.543070 0.688780 +vt 0.545890 0.686480 +vt 0.544350 0.690290 +vt 0.547010 0.688540 +vt 0.548130 0.690600 +vt 0.545630 0.691810 +vt 0.537350 0.692520 +vt 0.540210 0.690650 +vt 0.541990 0.691990 +vt 0.539630 0.693690 +vt 0.543770 0.693340 +vt 0.536190 0.694810 +vt 0.538320 0.695940 +vt 0.541910 0.694870 +vt 0.540450 0.697070 +vt 0.581310 0.750370 +vt 0.567110 0.749370 +vt 0.578850 0.739190 +vt 0.552910 0.748380 +vt 0.553280 0.737220 +vt 0.566060 0.738200 +vt 0.565020 0.727040 +vt 0.576390 0.728010 +vt 0.600690 0.743450 +vt 0.591000 0.746910 +vt 0.596190 0.734140 +vt 0.587520 0.736660 +vt 0.584040 0.726420 +vt 0.591700 0.724840 +vt 0.611640 0.714750 +vt 0.610630 0.723800 +vt 0.607670 0.712500 +vt 0.606730 0.719460 +vt 0.603700 0.710260 +vt 0.605660 0.733620 +vt 0.601460 0.726800 +vt 0.597260 0.719980 +vt 0.602830 0.715130 +vt 0.544670 0.736270 +vt 0.536440 0.724170 +vt 0.546110 0.729200 +vt 0.538950 0.721180 +vt 0.547550 0.722130 +vt 0.535330 0.717430 +vt 0.537530 0.715110 +vt 0.538030 0.707400 +vt 0.539740 0.712790 +vt 0.543470 0.715270 +vt 0.542460 0.716730 +vt 0.540750 0.711330 +vt 0.541460 0.718190 +vt 0.540980 0.713620 +vt 0.548680 0.718490 +vt 0.548110 0.720310 +vt 0.553890 0.721710 +vt 0.553770 0.723890 +vt 0.553650 0.726070 +vt 0.565140 0.722870 +vt 0.565080 0.724950 +vt 0.576390 0.724030 +vt 0.576390 0.726020 +vt 0.584040 0.722440 +vt 0.591700 0.720860 +vt 0.584040 0.724430 +vt 0.591700 0.722850 +vt 0.599790 0.713230 +vt 0.601310 0.714180 +vt 0.596500 0.718510 +vt 0.595740 0.717040 +vt 0.602180 0.709310 +vt 0.602400 0.711250 +vt 0.655220 0.667290 +vt 0.647280 0.651950 +vt 0.646820 0.683150 +vt 0.640150 0.670230 +vt 0.633490 0.657310 +vt 0.639340 0.636610 +vt 0.629100 0.628030 +vt 0.624010 0.650310 +vt 0.614530 0.643320 +vt 0.618870 0.619450 +vt 0.605440 0.639880 +vt 0.596360 0.636450 +vt 0.598040 0.610530 +vt 0.608450 0.614990 +vt 0.549230 0.577490 +vt 0.558230 0.562280 +vt 0.561930 0.565170 +vt 0.553160 0.580650 +vt 0.565630 0.568070 +vt 0.545690 0.606550 +vt 0.543540 0.602280 +vt 0.551390 0.595180 +vt 0.541390 0.598020 +vt 0.548350 0.591460 +vt 0.545310 0.587750 +vt 0.557090 0.583810 +vt 0.532030 0.623020 +vt 0.530320 0.621550 +vt 0.532520 0.618080 +vt 0.528620 0.620080 +vt 0.530470 0.616300 +vt 0.528420 0.614530 +vt 0.530620 0.611060 +vt 0.533010 0.613150 +vt 0.534880 0.608040 +vt 0.533940 0.610590 +vt 0.531560 0.607140 +vt 0.528230 0.608980 +vt 0.532500 0.603210 +vt 0.529170 0.603680 +vt 0.533060 0.595050 +vt 0.531590 0.596720 +vt 0.527450 0.591470 +vt 0.530120 0.598390 +vt 0.526420 0.593190 +vt 0.525390 0.594910 +vt 0.520660 0.591440 +vt 0.521840 0.587900 +vt 0.527210 0.598070 +vt 0.524310 0.597760 +vt 0.521210 0.596130 +vt 0.523300 0.595520 +vt 0.518120 0.594510 +vt 0.519390 0.592970 +vt 0.523920 0.604470 +vt 0.524110 0.601110 +vt 0.526640 0.602400 +vt 0.526070 0.606720 +vt 0.509650 0.666630 +vt 0.513490 0.663970 +vt 0.513540 0.674420 +vt 0.517340 0.661310 +vt 0.517520 0.670470 +vt 0.517710 0.679630 +vt 0.509560 0.678370 +vt 0.513590 0.684870 +vt 0.511990 0.577630 +vt 0.509470 0.577130 +vt 0.512540 0.572840 +vt 0.506950 0.576630 +vt 0.509900 0.572300 +vt 0.507270 0.571770 +vt 0.510340 0.567480 +vt 0.513090 0.568050 +vt 0.521910 0.615510 +vt 0.521050 0.613090 +vt 0.523560 0.609900 +vt 0.520190 0.610670 +vt 0.522050 0.607570 +vt 0.525070 0.612240 +vt 0.515450 0.611380 +vt 0.517820 0.611020 +vt 0.515350 0.614030 +vt 0.518200 0.613560 +vt 0.518580 0.616090 +vt 0.515260 0.616680 +vt 0.507590 0.566920 +vt 0.503790 0.567240 +vt 0.503630 0.572090 +vt 0.503470 0.576930 +vt 0.499990 0.572400 +vt 0.499990 0.567570 +vt 0.499990 0.588770 +vt 0.499990 0.587650 +vt 0.503480 0.587620 +vt 0.499990 0.586540 +vt 0.503510 0.586260 +vt 0.507030 0.585980 +vt 0.503450 0.588990 +vt 0.506970 0.587600 +vt 0.506910 0.589220 +vt 0.506380 0.590620 +vt 0.505860 0.592030 +vt 0.503180 0.590340 +vt 0.502920 0.591680 +vt 0.499990 0.590050 +vt 0.534520 0.581460 +vt 0.535500 0.573170 +vt 0.541870 0.579470 +vt 0.536490 0.564890 +vt 0.542490 0.570340 +vt 0.543120 0.561200 +vt 0.549490 0.567500 +vt 0.537730 0.594110 +vt 0.539800 0.586790 +vt 0.534080 0.590200 +vt 0.534300 0.585830 +vt 0.522260 0.579480 +vt 0.522810 0.574010 +vt 0.528390 0.580470 +vt 0.523360 0.568540 +vt 0.529150 0.573590 +vt 0.529920 0.566710 +vt 0.528170 0.587380 +vt 0.528280 0.583920 +vt 0.522270 0.584570 +vt 0.522260 0.582020 +vt 0.527810 0.589430 +vt 0.522050 0.586230 +vt 0.533570 0.592620 +vt 0.511970 0.580190 +vt 0.509460 0.579790 +vt 0.511950 0.582750 +vt 0.509450 0.582460 +vt 0.506960 0.582180 +vt 0.506950 0.579400 +vt 0.512310 0.586270 +vt 0.509670 0.586120 +vt 0.512130 0.584510 +vt 0.509560 0.584290 +vt 0.506990 0.584080 +vt 0.521250 0.589670 +vt 0.516980 0.588930 +vt 0.516880 0.590770 +vt 0.512710 0.588190 +vt 0.517070 0.587080 +vt 0.516240 0.592520 +vt 0.515610 0.594280 +vt 0.513100 0.592080 +vt 0.513110 0.590110 +vt 0.510970 0.591840 +vt 0.513100 0.594050 +vt 0.511940 0.594020 +vt 0.510780 0.593990 +vt 0.510010 0.589660 +vt 0.508840 0.591600 +vt 0.509840 0.587890 +vt 0.517110 0.583660 +vt 0.517090 0.585370 +vt 0.517110 0.581100 +vt 0.517120 0.578550 +vt 0.517670 0.573420 +vt 0.518220 0.568290 +vt 0.503800 0.561110 +vt 0.499990 0.561100 +vt 0.503810 0.554980 +vt 0.507610 0.561120 +vt 0.513530 0.562250 +vt 0.510570 0.561680 +vt 0.507630 0.555330 +vt 0.513980 0.556450 +vt 0.507660 0.551930 +vt 0.499990 0.554630 +vt 0.503820 0.551570 +vt 0.499990 0.551210 +vt 0.499990 0.547800 +vt 0.503840 0.548170 +vt 0.510800 0.555890 +vt 0.510900 0.552350 +vt 0.507690 0.548540 +vt 0.514140 0.552760 +vt 0.510990 0.548810 +vt 0.523400 0.548040 +vt 0.523520 0.551550 +vt 0.518850 0.548560 +vt 0.523650 0.555070 +vt 0.518830 0.552160 +vt 0.518810 0.555760 +vt 0.514300 0.549080 +vt 0.518520 0.562020 +vt 0.523500 0.561800 +vt 0.530100 0.559970 +vt 0.530280 0.553240 +vt 0.536700 0.558150 +vt 0.536910 0.551410 +vt 0.543070 0.548930 +vt 0.543090 0.555070 +vt 0.549240 0.546460 +vt 0.549490 0.551990 +vt 0.549750 0.557520 +vt 0.556670 0.549500 +vt 0.557450 0.555890 +vt 0.554570 0.542030 +vt 0.555620 0.545760 +vt 0.547690 0.542040 +vt 0.551720 0.539290 +vt 0.553140 0.540660 +vt 0.548460 0.544250 +vt 0.536550 0.545590 +vt 0.542120 0.543810 +vt 0.542590 0.546370 +vt 0.536730 0.548500 +vt 0.529970 0.546810 +vt 0.530120 0.550020 +vt 0.499990 0.596680 +vt 0.499990 0.595390 +vt 0.502860 0.595890 +vt 0.499990 0.594110 +vt 0.502840 0.594520 +vt 0.505700 0.594930 +vt 0.502880 0.597270 +vt 0.505730 0.596390 +vt 0.505780 0.593480 +vt 0.502880 0.593100 +vt 0.499990 0.592720 +vt 0.510490 0.594870 +vt 0.510200 0.595750 +vt 0.508030 0.593890 +vt 0.508430 0.592740 +vt 0.510190 0.596970 +vt 0.507980 0.595220 +vt 0.510180 0.598200 +vt 0.507940 0.596560 +vt 0.510210 0.600010 +vt 0.507970 0.598200 +vt 0.510240 0.601830 +vt 0.508000 0.599840 +vt 0.505770 0.597860 +vt 0.510400 0.611110 +vt 0.510660 0.608980 +vt 0.513010 0.611500 +vt 0.510930 0.606850 +vt 0.513190 0.609110 +vt 0.512830 0.613890 +vt 0.505950 0.601790 +vt 0.508440 0.604320 +vt 0.506450 0.605730 +vt 0.508560 0.607350 +vt 0.508680 0.610390 +vt 0.506960 0.609670 +vt 0.505860 0.599820 +vt 0.508220 0.602080 +vt 0.510580 0.604340 +vt 0.499990 0.598450 +vt 0.502920 0.599130 +vt 0.502970 0.601000 +vt 0.499990 0.600220 +vt 0.499990 0.604090 +vt 0.503220 0.604910 +vt 0.503470 0.608820 +vt 0.499990 0.607970 +vt 0.499990 0.613150 +vt 0.504190 0.613730 +vt 0.508390 0.614310 +vt 0.504900 0.618650 +vt 0.499990 0.618340 +vt 0.510610 0.614100 +vt 0.512540 0.617820 +vt 0.509820 0.618960 +vt 0.511530 0.629720 +vt 0.510670 0.624340 +vt 0.513660 0.623250 +vt 0.514790 0.628680 +vt 0.516660 0.622160 +vt 0.511590 0.639850 +vt 0.511340 0.643450 +vt 0.505790 0.640260 +vt 0.511100 0.647060 +vt 0.505660 0.643800 +vt 0.505540 0.647350 +vt 0.499990 0.644160 +vt 0.499990 0.640680 +vt 0.505770 0.635050 +vt 0.499990 0.635320 +vt 0.499990 0.629960 +vt 0.511560 0.634780 +vt 0.505760 0.629840 +vt 0.505330 0.624240 +vt 0.499990 0.624150 +vt 0.503470 0.579800 +vt 0.503470 0.582660 +vt 0.499990 0.580190 +vt 0.499990 0.577240 +vt 0.499990 0.584840 +vt 0.503490 0.584460 +vt 0.499990 0.583150 +vt 0.629680 0.836530 +vt 0.612060 0.852310 +vt 0.622430 0.820400 +vt 0.696110 0.670940 +vt 0.699870 0.697800 +vt 0.691130 0.715860 +vt 0.689260 0.685910 +vt 0.677360 0.702110 +vt 0.674610 0.663600 +vt 0.665460 0.718320 +vt 0.664540 0.684880 +vt 0.684690 0.642320 +vt 0.692200 0.633390 +vt 0.651930 0.761280 +vt 0.671530 0.738570 +vt 0.627800 0.703470 +vt 0.623040 0.692170 +vt 0.637310 0.693310 +vt 0.618290 0.680880 +vt 0.631600 0.681200 +vt 0.625890 0.669090 +vt 0.619020 0.716920 +vt 0.620230 0.704580 +vt 0.626400 0.719100 +vt 0.617810 0.729270 +vt 0.616640 0.695340 +vt 0.613050 0.686090 +vt 0.536150 0.664700 +vt 0.536850 0.671470 +vt 0.531300 0.668060 +vt 0.537550 0.678240 +vt 0.532440 0.674790 +vt 0.533590 0.681520 +vt 0.529630 0.684810 +vt 0.526460 0.671430 +vt 0.521980 0.658360 +vt 0.522030 0.666940 +vt 0.526630 0.655410 +vt 0.526540 0.663420 +vt 0.522080 0.675530 +vt 0.517470 0.650130 +vt 0.521860 0.647390 +vt 0.521920 0.652870 +vt 0.526260 0.644660 +vt 0.526440 0.650030 +vt 0.517400 0.655720 +vt 0.526270 0.637190 +vt 0.526260 0.640920 +vt 0.522330 0.640210 +vt 0.522100 0.643800 +vt 0.517930 0.646680 +vt 0.518400 0.643240 +vt 0.534660 0.616470 +vt 0.534300 0.613530 +vt 0.536090 0.608980 +vt 0.537300 0.609930 +vt 0.535180 0.602490 +vt 0.533840 0.602850 +vt 0.536450 0.598300 +vt 0.539340 0.603970 +vt 0.539110 0.620480 +vt 0.538200 0.615200 +vt 0.542400 0.613510 +vt 0.540870 0.608740 +vt 0.533020 0.630800 +vt 0.532520 0.626910 +vt 0.536060 0.625640 +vt 0.535360 0.621050 +vt 0.535400 0.649380 +vt 0.534600 0.644100 +vt 0.540840 0.645350 +vt 0.533810 0.638830 +vt 0.539290 0.639630 +vt 0.537750 0.633910 +vt 0.543990 0.635160 +vt 0.546280 0.641330 +vt 0.533410 0.634810 +vt 0.536910 0.629770 +vt 0.540400 0.624730 +vt 0.541700 0.628990 +vt 0.524250 0.623910 +vt 0.526430 0.621990 +vt 0.527680 0.624400 +vt 0.525050 0.627250 +vt 0.528940 0.626810 +vt 0.523080 0.619710 +vt 0.519870 0.620930 +vt 0.521150 0.625770 +vt 0.518060 0.627640 +vt 0.525750 0.617120 +vt 0.525850 0.630600 +vt 0.526060 0.633890 +vt 0.522340 0.633440 +vt 0.522330 0.636830 +vt 0.518610 0.639760 +vt 0.518830 0.636290 +vt 0.515210 0.638070 +vt 0.514980 0.641610 +vt 0.514750 0.645150 +vt 0.518440 0.631960 +vt 0.515000 0.633370 +vt 0.521740 0.629610 +vt 0.529640 0.633990 +vt 0.529290 0.630400 +vt 0.530030 0.641740 +vt 0.529840 0.637870 +vt 0.531010 0.652390 +vt 0.530520 0.647070 +vt 0.531160 0.660230 +vt 0.535770 0.657040 +vt 0.548170 0.658160 +vt 0.548310 0.665570 +vt 0.542160 0.661430 +vt 0.548460 0.672980 +vt 0.542580 0.668520 +vt 0.543000 0.675610 +vt 0.541500 0.653390 +vt 0.547220 0.649740 +vt 0.546170 0.622400 +vt 0.544280 0.617960 +vt 0.548160 0.611180 +vt 0.550640 0.615820 +vt 0.552060 0.636910 +vt 0.549110 0.629650 +vt 0.554240 0.624150 +vt 0.557850 0.632490 +vt 0.557860 0.604310 +vt 0.554620 0.599740 +vt 0.561090 0.588310 +vt 0.565090 0.592810 +vt 0.574350 0.576250 +vt 0.569990 0.572160 +vt 0.575480 0.614750 +vt 0.570280 0.603780 +vt 0.587600 0.599680 +vt 0.580970 0.587960 +vt 0.566660 0.623620 +vt 0.562260 0.613960 +vt 0.577190 0.642020 +vt 0.568960 0.646650 +vt 0.567810 0.635130 +vt 0.560740 0.651290 +vt 0.559290 0.641890 +vt 0.576330 0.628380 +vt 0.586770 0.639230 +vt 0.587180 0.619460 +vt 0.589940 0.662640 +vt 0.582270 0.663020 +vt 0.593150 0.649540 +vt 0.574600 0.663400 +vt 0.584520 0.651120 +vt 0.575890 0.652710 +vt 0.567530 0.665870 +vt 0.560470 0.668350 +vt 0.568250 0.656260 +vt 0.560600 0.659820 +vt 0.554450 0.654720 +vt 0.553260 0.645810 +vt 0.554460 0.670660 +vt 0.554460 0.662690 +vt 0.559800 0.674610 +vt 0.548590 0.678580 +vt 0.554190 0.676600 +vt 0.604840 0.668260 +vt 0.597390 0.665450 +vt 0.609680 0.655790 +vt 0.601410 0.652660 +vt 0.617780 0.662440 +vt 0.611560 0.674570 +vt 0.607340 0.680750 +vt 0.601630 0.675410 +vt 0.594340 0.672800 +vt 0.587060 0.670190 +vt 0.572770 0.670730 +vt 0.566280 0.672670 +vt 0.579910 0.670460 +vt 0.544450 0.681040 +vt 0.540310 0.683510 +vt 0.536900 0.686080 +vt 0.533490 0.688660 +vt 0.510710 0.650780 +vt 0.510320 0.654510 +vt 0.505350 0.651090 +vt 0.505150 0.654830 +vt 0.499990 0.651400 +vt 0.499990 0.647640 +vt 0.514320 0.648730 +vt 0.513890 0.652320 +vt 0.513690 0.658140 +vt 0.509980 0.660570 +vt 0.504980 0.661060 +vt 0.504820 0.667290 +vt 0.499990 0.661550 +vt 0.499990 0.655160 +vt 0.499990 0.690260 +vt 0.499990 0.679100 +vt 0.504770 0.678740 +vt 0.499990 0.667950 +vt 0.504730 0.690190 +vt 0.499990 0.712920 +vt 0.505080 0.712980 +vt 0.499990 0.722910 +vt 0.510170 0.713050 +vt 0.512070 0.722560 +vt 0.506030 0.722730 +vt 0.513970 0.732080 +vt 0.499990 0.732900 +vt 0.509820 0.701580 +vt 0.504900 0.701580 +vt 0.499990 0.701590 +vt 0.509470 0.690120 +vt 0.524880 0.729010 +vt 0.522230 0.721040 +vt 0.530660 0.726590 +vt 0.519590 0.713070 +vt 0.528780 0.719230 +vt 0.526900 0.711880 +vt 0.520310 0.686050 +vt 0.517180 0.690890 +vt 0.522910 0.692470 +vt 0.520770 0.696920 +vt 0.518640 0.701370 +vt 0.514050 0.695740 +vt 0.528040 0.678120 +vt 0.526270 0.688640 +vt 0.524170 0.682080 +vt 0.531230 0.691720 +vt 0.528970 0.694780 +vt 0.527440 0.698350 +vt 0.525920 0.701920 +vt 0.526410 0.706900 +vt 0.519110 0.707220 +vt 0.514460 0.704400 +vt 0.514880 0.713060 +vt 0.519420 0.730540 +vt 0.517150 0.721800 +vt 0.516970 0.752780 +vt 0.515470 0.742430 +vt 0.521990 0.741410 +vt 0.524560 0.752290 +vt 0.528510 0.740400 +vt 0.499990 0.829850 +vt 0.499990 0.805350 +vt 0.510910 0.805200 +vt 0.499990 0.780860 +vt 0.509410 0.781270 +vt 0.518830 0.781680 +vt 0.512410 0.829140 +vt 0.521830 0.805050 +vt 0.499990 0.766830 +vt 0.499990 0.752810 +vt 0.508940 0.767030 +vt 0.508480 0.752790 +vt 0.517900 0.767230 +vt 0.524840 0.828430 +vt 0.532290 0.804210 +vt 0.528420 0.781960 +vt 0.538010 0.782240 +vt 0.536160 0.826470 +vt 0.542740 0.803380 +vt 0.560150 0.780800 +vt 0.549080 0.781520 +vt 0.556530 0.764590 +vt 0.545800 0.765800 +vt 0.535080 0.767020 +vt 0.542530 0.750090 +vt 0.532150 0.751800 +vt 0.536590 0.738340 +vt 0.583430 0.763730 +vt 0.585560 0.777100 +vt 0.569980 0.764160 +vt 0.572850 0.778950 +vt 0.565460 0.799330 +vt 0.577670 0.795560 +vt 0.589880 0.791800 +vt 0.582490 0.812180 +vt 0.570770 0.817860 +vt 0.606460 0.836550 +vt 0.600330 0.821530 +vt 0.614670 0.807580 +vt 0.594210 0.806510 +vt 0.606910 0.794760 +vt 0.629010 0.793630 +vt 0.594530 0.758590 +vt 0.605630 0.753460 +vt 0.610570 0.763470 +vt 0.598060 0.770280 +vt 0.611720 0.741360 +vt 0.625000 0.734740 +vt 0.617780 0.749100 +vt 0.619620 0.783020 +vt 0.630580 0.757260 +vt 0.641250 0.759270 +vt 0.641540 0.731510 +vt 0.653500 0.724910 +vt 0.635290 0.713210 +vt 0.644180 0.707330 +vt 0.633270 0.733120 +vt 0.654360 0.696100 +vt 0.624180 0.753180 +vt 0.615090 0.773240 +vt 0.602490 0.782520 +vt 0.499990 0.856350 +vt 0.514620 0.855180 +vt 0.529250 0.854020 +vt 0.516820 0.881230 +vt 0.499990 0.882860 +vt 0.547480 0.824520 +vt 0.541670 0.850770 +vt 0.554100 0.847520 +vt 0.547190 0.875070 +vt 0.533660 0.879610 +vt 0.499990 0.901200 +vt 0.518670 0.899590 +vt 0.537350 0.897970 +vt 0.560720 0.870530 +vt 0.551480 0.893000 +vt 0.565610 0.888030 +vt 0.582790 0.856360 +vt 0.594620 0.846450 +vt 0.587640 0.872800 +vt 0.599850 0.862550 +vt 0.571750 0.863440 +vt 0.576620 0.880410 +vt 0.576780 0.837110 +vt 0.588550 0.829320 +vt 0.559120 0.821190 +vt 0.565440 0.842310 +vt 0.554100 0.801350 +vt 0.526490 0.767120 +vt 0.499990 0.742850 +vt 0.507730 0.742640 +vt 0.506980 0.732490 +vt 0.361580 0.804250 +vt 0.352680 0.820760 +vt 0.334280 0.775030 +vt 0.327250 0.798910 +vt 0.301820 0.777060 +vt 0.306980 0.745820 +vt 0.279220 0.774580 +vt 0.287780 0.749620 +vt 0.296350 0.724670 +vt 0.439830 0.686080 +vt 0.440330 0.683480 +vt 0.445320 0.685130 +vt 0.440840 0.680880 +vt 0.446050 0.682530 +vt 0.451260 0.684190 +vt 0.444590 0.687740 +vt 0.449350 0.689400 +vt 0.397230 0.697470 +vt 0.394690 0.694390 +vt 0.401260 0.692520 +vt 0.392160 0.691310 +vt 0.399050 0.689730 +vt 0.396850 0.686940 +vt 0.403420 0.685070 +vt 0.405290 0.687570 +vt 0.411370 0.685690 +vt 0.401550 0.682570 +vt 0.410020 0.682920 +vt 0.408670 0.680160 +vt 0.416620 0.680780 +vt 0.417450 0.683810 +vt 0.423360 0.683920 +vt 0.415790 0.677750 +vt 0.422880 0.680910 +vt 0.422410 0.677910 +vt 0.429030 0.678070 +vt 0.429270 0.684040 +vt 0.429150 0.681050 +vt 0.434740 0.682260 +vt 0.434930 0.679470 +vt 0.434550 0.685060 +vt 0.395400 0.705400 +vt 0.391360 0.705550 +vt 0.396310 0.701430 +vt 0.387320 0.705700 +vt 0.393020 0.699970 +vt 0.389740 0.698500 +vt 0.462190 0.702690 +vt 0.464480 0.702580 +vt 0.464160 0.705810 +vt 0.466770 0.702470 +vt 0.466260 0.706580 +vt 0.463850 0.709050 +vt 0.462060 0.705040 +vt 0.460990 0.699280 +vt 0.462970 0.698190 +vt 0.461590 0.700980 +vt 0.464950 0.697100 +vt 0.465860 0.699780 +vt 0.463720 0.700380 +vt 0.450300 0.686790 +vt 0.451850 0.690600 +vt 0.452960 0.688540 +vt 0.454080 0.686480 +vt 0.455630 0.690290 +vt 0.454350 0.691810 +vt 0.456210 0.693340 +vt 0.456910 0.688780 +vt 0.457990 0.691990 +vt 0.459770 0.690650 +vt 0.460350 0.693690 +vt 0.458070 0.694870 +vt 0.459530 0.697070 +vt 0.462630 0.692520 +vt 0.461660 0.695940 +vt 0.463790 0.694810 +vt 0.446330 0.726070 +vt 0.446700 0.737220 +vt 0.433910 0.738200 +vt 0.447070 0.748380 +vt 0.432860 0.749370 +vt 0.418660 0.750370 +vt 0.434960 0.727040 +vt 0.421120 0.739190 +vt 0.423590 0.728010 +vt 0.412450 0.736660 +vt 0.408970 0.746910 +vt 0.403780 0.734140 +vt 0.415930 0.726420 +vt 0.408280 0.724840 +vt 0.397150 0.715130 +vt 0.393250 0.719460 +vt 0.396270 0.710260 +vt 0.389350 0.723800 +vt 0.392300 0.712500 +vt 0.388330 0.714750 +vt 0.402710 0.719980 +vt 0.399290 0.743450 +vt 0.398510 0.726800 +vt 0.394320 0.733620 +vt 0.458520 0.718190 +vt 0.461030 0.721180 +vt 0.452420 0.722130 +vt 0.463540 0.724170 +vt 0.453860 0.729200 +vt 0.455300 0.736270 +vt 0.461940 0.707400 +vt 0.460230 0.712790 +vt 0.465760 0.710700 +vt 0.462440 0.715110 +vt 0.464650 0.717430 +vt 0.457510 0.716730 +vt 0.456510 0.715270 +vt 0.458990 0.713620 +vt 0.459220 0.711330 +vt 0.446200 0.723890 +vt 0.446080 0.721710 +vt 0.451860 0.720310 +vt 0.451290 0.718490 +vt 0.423590 0.726020 +vt 0.434890 0.724950 +vt 0.423590 0.724030 +vt 0.434830 0.722870 +vt 0.408280 0.722850 +vt 0.408280 0.720860 +vt 0.415930 0.724430 +vt 0.415930 0.722440 +vt 0.403470 0.718510 +vt 0.398670 0.714180 +vt 0.400190 0.713230 +vt 0.404230 0.717040 +vt 0.397790 0.709310 +vt 0.397580 0.711250 +vt 0.366490 0.657310 +vt 0.359820 0.670230 +vt 0.360630 0.636610 +vt 0.353160 0.683150 +vt 0.352690 0.651950 +vt 0.344750 0.667290 +vt 0.385450 0.643320 +vt 0.375970 0.650310 +vt 0.381110 0.619450 +vt 0.370870 0.628030 +vt 0.401940 0.610530 +vt 0.403620 0.636450 +vt 0.391520 0.614990 +vt 0.394530 0.639880 +vt 0.434340 0.568070 +vt 0.438040 0.565170 +vt 0.441750 0.562280 +vt 0.446820 0.580650 +vt 0.442890 0.583810 +vt 0.450750 0.577490 +vt 0.454670 0.587750 +vt 0.451630 0.591460 +vt 0.458590 0.598020 +vt 0.456440 0.602280 +vt 0.454290 0.606550 +vt 0.448590 0.595180 +vt 0.471750 0.608980 +vt 0.471550 0.614530 +vt 0.469500 0.616300 +vt 0.471360 0.620080 +vt 0.469650 0.621550 +vt 0.467950 0.623020 +vt 0.469360 0.611060 +vt 0.467460 0.618080 +vt 0.470800 0.603680 +vt 0.466970 0.613150 +vt 0.468420 0.607140 +vt 0.466030 0.610590 +vt 0.467480 0.603210 +vt 0.469860 0.598390 +vt 0.479320 0.591440 +vt 0.474590 0.594910 +vt 0.478730 0.589670 +vt 0.473560 0.593190 +vt 0.468390 0.596720 +vt 0.472530 0.591470 +vt 0.478140 0.587900 +vt 0.481860 0.594510 +vt 0.478760 0.596130 +vt 0.480590 0.592970 +vt 0.475670 0.597760 +vt 0.476670 0.595520 +vt 0.472760 0.598070 +vt 0.475860 0.601110 +vt 0.473330 0.602400 +vt 0.476060 0.604470 +vt 0.482270 0.679630 +vt 0.482450 0.670470 +vt 0.486430 0.674420 +vt 0.482640 0.661310 +vt 0.486480 0.663970 +vt 0.490420 0.678370 +vt 0.486390 0.684870 +vt 0.490510 0.690120 +vt 0.492390 0.566920 +vt 0.492710 0.571770 +vt 0.489640 0.567480 +vt 0.493030 0.576630 +vt 0.490070 0.572300 +vt 0.490510 0.577130 +vt 0.487440 0.572840 +vt 0.486890 0.568050 +vt 0.477920 0.607570 +vt 0.476410 0.609900 +vt 0.479790 0.610670 +vt 0.478930 0.613090 +vt 0.474910 0.612240 +vt 0.473900 0.606720 +vt 0.478070 0.615510 +vt 0.481770 0.613560 +vt 0.482160 0.611020 +vt 0.484530 0.611380 +vt 0.481390 0.616090 +vt 0.484620 0.614030 +vt 0.496510 0.576930 +vt 0.496350 0.572090 +vt 0.496190 0.567240 +vt 0.492950 0.585980 +vt 0.496470 0.586260 +vt 0.493010 0.587600 +vt 0.496500 0.587620 +vt 0.493070 0.589220 +vt 0.499990 0.591340 +vt 0.497050 0.591680 +vt 0.496790 0.590340 +vt 0.494120 0.592030 +vt 0.493590 0.590620 +vt 0.496530 0.588990 +vt 0.450230 0.557520 +vt 0.456860 0.561200 +vt 0.457480 0.570340 +vt 0.463490 0.564890 +vt 0.464470 0.573170 +vt 0.465460 0.581460 +vt 0.450490 0.567500 +vt 0.458100 0.579470 +vt 0.465680 0.585830 +vt 0.465900 0.590200 +vt 0.460170 0.586790 +vt 0.462240 0.594110 +vt 0.470050 0.566710 +vt 0.470820 0.573590 +vt 0.476620 0.568540 +vt 0.477170 0.574010 +vt 0.477720 0.579480 +vt 0.471590 0.580470 +vt 0.477710 0.582020 +vt 0.477710 0.584570 +vt 0.471690 0.583920 +vt 0.471800 0.587380 +vt 0.477920 0.586230 +vt 0.472160 0.589430 +vt 0.466920 0.595050 +vt 0.493020 0.582180 +vt 0.490520 0.582460 +vt 0.490510 0.579790 +vt 0.488030 0.582750 +vt 0.488010 0.580190 +vt 0.487990 0.577630 +vt 0.493020 0.579400 +vt 0.492980 0.584080 +vt 0.490410 0.584290 +vt 0.490310 0.586120 +vt 0.487850 0.584510 +vt 0.486870 0.590110 +vt 0.483090 0.590770 +vt 0.483000 0.588930 +vt 0.487270 0.588190 +vt 0.487670 0.586270 +vt 0.486880 0.594050 +vt 0.484370 0.594280 +vt 0.483730 0.592520 +vt 0.486870 0.592080 +vt 0.489200 0.593990 +vt 0.488040 0.594020 +vt 0.491130 0.591600 +vt 0.489000 0.591840 +vt 0.489970 0.589660 +vt 0.490140 0.587890 +vt 0.482900 0.587080 +vt 0.482880 0.585370 +vt 0.482870 0.583660 +vt 0.482850 0.578550 +vt 0.482860 0.581100 +vt 0.481750 0.568290 +vt 0.482300 0.573420 +vt 0.496170 0.554980 +vt 0.496180 0.561110 +vt 0.492370 0.561120 +vt 0.492350 0.555330 +vt 0.489400 0.561680 +vt 0.486440 0.562250 +vt 0.489170 0.555890 +vt 0.486000 0.556450 +vt 0.496150 0.551570 +vt 0.492320 0.551930 +vt 0.496140 0.548170 +vt 0.492290 0.548540 +vt 0.488980 0.548810 +vt 0.489080 0.552350 +vt 0.485840 0.552760 +vt 0.485680 0.549080 +vt 0.481160 0.555760 +vt 0.481140 0.552160 +vt 0.476330 0.555070 +vt 0.476450 0.551550 +vt 0.476580 0.548040 +vt 0.481130 0.548560 +vt 0.481460 0.562020 +vt 0.476470 0.561800 +vt 0.463070 0.551410 +vt 0.469700 0.553240 +vt 0.469870 0.559970 +vt 0.463280 0.558150 +vt 0.450480 0.551990 +vt 0.450740 0.546460 +vt 0.456880 0.555070 +vt 0.456900 0.548930 +vt 0.442520 0.555890 +vt 0.443300 0.549500 +vt 0.444350 0.545760 +vt 0.445400 0.542030 +vt 0.446830 0.540660 +vt 0.448260 0.539290 +vt 0.452290 0.542040 +vt 0.451510 0.544250 +vt 0.457380 0.546370 +vt 0.457860 0.543810 +vt 0.463250 0.548500 +vt 0.463430 0.545590 +vt 0.469850 0.550020 +vt 0.470000 0.546810 +vt 0.494280 0.594930 +vt 0.497130 0.594520 +vt 0.494240 0.596390 +vt 0.497110 0.595890 +vt 0.494210 0.597860 +vt 0.497090 0.593100 +vt 0.494200 0.593480 +vt 0.491950 0.593890 +vt 0.491540 0.592740 +vt 0.489780 0.595750 +vt 0.489490 0.594870 +vt 0.492040 0.596560 +vt 0.489800 0.598200 +vt 0.491990 0.595220 +vt 0.489790 0.596970 +vt 0.491970 0.599840 +vt 0.489740 0.601830 +vt 0.492000 0.598200 +vt 0.489770 0.600010 +vt 0.486790 0.609110 +vt 0.489050 0.606850 +vt 0.486970 0.611500 +vt 0.489310 0.608980 +vt 0.487150 0.613890 +vt 0.484720 0.616680 +vt 0.489580 0.611110 +vt 0.491420 0.607350 +vt 0.491540 0.604320 +vt 0.494030 0.601790 +vt 0.491300 0.610390 +vt 0.493520 0.605730 +vt 0.489390 0.604340 +vt 0.491750 0.602080 +vt 0.494120 0.599820 +vt 0.497050 0.599130 +vt 0.497100 0.597270 +vt 0.497010 0.601000 +vt 0.493020 0.609670 +vt 0.496750 0.604910 +vt 0.496500 0.608820 +vt 0.490160 0.618960 +vt 0.491590 0.614310 +vt 0.495790 0.613730 +vt 0.495070 0.618650 +vt 0.489370 0.614100 +vt 0.487440 0.617820 +vt 0.486310 0.623250 +vt 0.489300 0.624340 +vt 0.488450 0.629720 +vt 0.483320 0.622160 +vt 0.481920 0.627640 +vt 0.494430 0.647350 +vt 0.488880 0.647060 +vt 0.494310 0.643800 +vt 0.488630 0.643450 +vt 0.488390 0.639850 +vt 0.494200 0.635050 +vt 0.494190 0.640260 +vt 0.488420 0.634780 +vt 0.494220 0.629840 +vt 0.494640 0.624240 +vt 0.496500 0.582660 +vt 0.496500 0.579800 +vt 0.496480 0.584460 +vt 0.393520 0.836550 +vt 0.387910 0.852310 +vt 0.370300 0.836530 +vt 0.377550 0.820400 +vt 0.300110 0.697800 +vt 0.308850 0.715860 +vt 0.303870 0.670940 +vt 0.335430 0.684880 +vt 0.334520 0.718320 +vt 0.325360 0.663600 +vt 0.322620 0.702110 +vt 0.315290 0.642320 +vt 0.310720 0.685910 +vt 0.307770 0.633390 +vt 0.328450 0.738570 +vt 0.348050 0.761280 +vt 0.374090 0.669090 +vt 0.368380 0.681200 +vt 0.381690 0.680880 +vt 0.376930 0.692170 +vt 0.372180 0.703470 +vt 0.362670 0.693310 +vt 0.379750 0.704580 +vt 0.380950 0.716920 +vt 0.382160 0.729270 +vt 0.373580 0.719100 +vt 0.386920 0.686090 +vt 0.383330 0.695340 +vt 0.470350 0.684810 +vt 0.466390 0.681520 +vt 0.471930 0.678120 +vt 0.462430 0.678240 +vt 0.467530 0.674790 +vt 0.463130 0.671470 +vt 0.463830 0.664700 +vt 0.473520 0.671430 +vt 0.473430 0.663420 +vt 0.477890 0.675530 +vt 0.473350 0.655410 +vt 0.477940 0.666940 +vt 0.477990 0.658360 +vt 0.473530 0.650030 +vt 0.473720 0.644660 +vt 0.478050 0.652870 +vt 0.478110 0.647390 +vt 0.482570 0.655720 +vt 0.482510 0.650130 +vt 0.477880 0.643800 +vt 0.473710 0.640920 +vt 0.473710 0.637190 +vt 0.482040 0.646680 +vt 0.477640 0.640210 +vt 0.465100 0.608040 +vt 0.465670 0.613530 +vt 0.463890 0.608980 +vt 0.465310 0.616470 +vt 0.466140 0.602850 +vt 0.462680 0.609930 +vt 0.464800 0.602490 +vt 0.463520 0.598300 +vt 0.466410 0.592620 +vt 0.460630 0.603970 +vt 0.459100 0.608740 +vt 0.461770 0.615200 +vt 0.460870 0.620480 +vt 0.457580 0.613510 +vt 0.464610 0.621050 +vt 0.467450 0.626910 +vt 0.466960 0.630800 +vt 0.463910 0.625640 +vt 0.458280 0.628990 +vt 0.462220 0.633910 +vt 0.460680 0.639630 +vt 0.466170 0.638830 +vt 0.465370 0.644100 +vt 0.464580 0.649380 +vt 0.455990 0.635160 +vt 0.459140 0.645350 +vt 0.463070 0.629770 +vt 0.466560 0.634810 +vt 0.459570 0.624730 +vt 0.471040 0.626810 +vt 0.472290 0.624400 +vt 0.473540 0.621990 +vt 0.474930 0.627250 +vt 0.474130 0.630600 +vt 0.478820 0.625770 +vt 0.475730 0.623910 +vt 0.480110 0.620930 +vt 0.476900 0.619710 +vt 0.474220 0.617120 +vt 0.481580 0.643240 +vt 0.477640 0.636830 +vt 0.473920 0.633890 +vt 0.481360 0.639760 +vt 0.477640 0.633440 +vt 0.485230 0.645150 +vt 0.485000 0.641610 +vt 0.484770 0.638070 +vt 0.484970 0.633370 +vt 0.481150 0.636290 +vt 0.481530 0.631960 +vt 0.485180 0.628680 +vt 0.478230 0.629610 +vt 0.470680 0.630400 +vt 0.470330 0.633990 +vt 0.470140 0.637870 +vt 0.469940 0.641740 +vt 0.469450 0.647070 +vt 0.468960 0.652390 +vt 0.464200 0.657040 +vt 0.468670 0.668060 +vt 0.468820 0.660230 +vt 0.456970 0.675610 +vt 0.451520 0.672980 +vt 0.457390 0.668520 +vt 0.451660 0.665570 +vt 0.451810 0.658160 +vt 0.457820 0.661430 +vt 0.453700 0.641330 +vt 0.458480 0.653390 +vt 0.452750 0.649740 +vt 0.451810 0.611180 +vt 0.455690 0.617960 +vt 0.453810 0.622400 +vt 0.449340 0.615820 +vt 0.450860 0.629650 +vt 0.445730 0.624150 +vt 0.447910 0.636910 +vt 0.445350 0.599740 +vt 0.438890 0.588310 +vt 0.442110 0.604310 +vt 0.429980 0.572160 +vt 0.434890 0.592810 +vt 0.425620 0.576250 +vt 0.419000 0.587960 +vt 0.429690 0.603780 +vt 0.424500 0.614750 +vt 0.412380 0.599680 +vt 0.442130 0.632490 +vt 0.437710 0.613960 +vt 0.433310 0.623620 +vt 0.440680 0.641890 +vt 0.439240 0.651290 +vt 0.432160 0.635130 +vt 0.431010 0.646650 +vt 0.423640 0.628380 +vt 0.422790 0.642020 +vt 0.412790 0.619460 +vt 0.413200 0.639230 +vt 0.424080 0.652710 +vt 0.425380 0.663400 +vt 0.417710 0.663020 +vt 0.415450 0.651120 +vt 0.410040 0.662640 +vt 0.439370 0.659820 +vt 0.439510 0.668350 +vt 0.432440 0.665870 +vt 0.431730 0.656260 +vt 0.446720 0.645810 +vt 0.445520 0.654720 +vt 0.445510 0.670660 +vt 0.445520 0.662690 +vt 0.451390 0.678580 +vt 0.445780 0.676600 +vt 0.440170 0.674610 +vt 0.406830 0.649540 +vt 0.398560 0.652660 +vt 0.402590 0.665450 +vt 0.395140 0.668260 +vt 0.390290 0.655790 +vt 0.388410 0.674570 +vt 0.382190 0.662440 +vt 0.392630 0.680750 +vt 0.398340 0.675410 +vt 0.412910 0.670190 +vt 0.405630 0.672800 +vt 0.433690 0.672670 +vt 0.427200 0.670730 +vt 0.420060 0.670460 +vt 0.455530 0.681040 +vt 0.459670 0.683510 +vt 0.466490 0.688660 +vt 0.463080 0.686080 +vt 0.494820 0.654830 +vt 0.489660 0.654510 +vt 0.494630 0.651090 +vt 0.489270 0.650780 +vt 0.486080 0.652320 +vt 0.485650 0.648730 +vt 0.490330 0.666630 +vt 0.486280 0.658140 +vt 0.489990 0.660570 +vt 0.495160 0.667290 +vt 0.494990 0.661060 +vt 0.495200 0.678740 +vt 0.495250 0.690190 +vt 0.486010 0.732080 +vt 0.487910 0.722560 +vt 0.493950 0.722730 +vt 0.489810 0.713050 +vt 0.494900 0.712980 +vt 0.493000 0.732490 +vt 0.495070 0.701580 +vt 0.490160 0.701580 +vt 0.473070 0.711880 +vt 0.471190 0.719230 +vt 0.480390 0.713070 +vt 0.477740 0.721040 +vt 0.469320 0.726590 +vt 0.481340 0.701370 +vt 0.479200 0.696920 +vt 0.485920 0.695740 +vt 0.477070 0.692470 +vt 0.482790 0.690890 +vt 0.479670 0.686050 +vt 0.473710 0.688640 +vt 0.475800 0.682080 +vt 0.471010 0.694780 +vt 0.468750 0.691720 +vt 0.474050 0.701920 +vt 0.472530 0.698350 +vt 0.473560 0.706900 +vt 0.480860 0.707220 +vt 0.485100 0.713060 +vt 0.485510 0.704400 +vt 0.482820 0.721800 +vt 0.480550 0.730540 +vt 0.475100 0.729010 +vt 0.471460 0.740400 +vt 0.477980 0.741410 +vt 0.484510 0.742430 +vt 0.475420 0.752290 +vt 0.467830 0.751800 +vt 0.481150 0.781680 +vt 0.490570 0.781270 +vt 0.489060 0.805200 +vt 0.478140 0.805050 +vt 0.487560 0.829140 +vt 0.483010 0.752780 +vt 0.491500 0.752790 +vt 0.482080 0.767230 +vt 0.491030 0.767030 +vt 0.461970 0.782240 +vt 0.471560 0.781960 +vt 0.457230 0.803380 +vt 0.467690 0.804210 +vt 0.463820 0.826470 +vt 0.452500 0.824520 +vt 0.464900 0.767020 +vt 0.454170 0.765800 +vt 0.450900 0.781520 +vt 0.439830 0.780800 +vt 0.457450 0.750090 +vt 0.443450 0.764590 +vt 0.463380 0.738340 +vt 0.427120 0.778950 +vt 0.414420 0.777100 +vt 0.429990 0.764160 +vt 0.416540 0.763730 +vt 0.405770 0.806510 +vt 0.410090 0.791800 +vt 0.422300 0.795560 +vt 0.417490 0.812180 +vt 0.434520 0.799330 +vt 0.380360 0.783020 +vt 0.393060 0.794760 +vt 0.385300 0.807580 +vt 0.399640 0.821530 +vt 0.370970 0.793630 +vt 0.389410 0.763470 +vt 0.394350 0.753460 +vt 0.401910 0.770280 +vt 0.405440 0.758590 +vt 0.374980 0.734740 +vt 0.382190 0.749100 +vt 0.388250 0.741360 +vt 0.346480 0.724910 +vt 0.358720 0.759270 +vt 0.358440 0.731510 +vt 0.369400 0.757260 +vt 0.364690 0.713210 +vt 0.355800 0.707330 +vt 0.366710 0.733120 +vt 0.345610 0.696100 +vt 0.375790 0.753180 +vt 0.384880 0.773240 +vt 0.397490 0.782520 +vt 0.466320 0.879610 +vt 0.470730 0.854020 +vt 0.483150 0.881230 +vt 0.475140 0.828430 +vt 0.485360 0.855180 +vt 0.439260 0.870530 +vt 0.445880 0.847520 +vt 0.458300 0.850770 +vt 0.452790 0.875070 +vt 0.462630 0.897970 +vt 0.481310 0.899590 +vt 0.434370 0.888030 +vt 0.448500 0.893000 +vt 0.400120 0.862550 +vt 0.405350 0.846450 +vt 0.417190 0.856360 +vt 0.412330 0.872800 +vt 0.423350 0.880410 +vt 0.428220 0.863440 +vt 0.411420 0.829320 +vt 0.429210 0.817860 +vt 0.423200 0.837110 +vt 0.434540 0.842310 +vt 0.440850 0.821190 +vt 0.445870 0.801350 +vt 0.473490 0.767120 +vt 0.492250 0.742640 +vt 0.778920 0.623350 +vt 0.779750 0.623260 +vt 0.778770 0.635120 +vt 0.780580 0.623170 +vt 0.779710 0.635840 +vt 0.780650 0.636560 +vt 0.779670 0.648430 +vt 0.778620 0.646900 +vt 0.781760 0.660480 +vt 0.780510 0.666630 +vt 0.779720 0.666180 +vt 0.783010 0.654330 +vt 0.781040 0.659930 +vt 0.780730 0.649960 +vt 0.781550 0.651820 +vt 0.779230 0.657230 +vt 0.782370 0.653680 +vt 0.780140 0.658580 +vt 0.778730 0.665340 +vt 0.777740 0.664510 +vt 0.778470 0.671230 +vt 0.779380 0.671550 +vt 0.778250 0.676470 +vt 0.769720 0.683160 +vt 0.770380 0.682260 +vt 0.772150 0.681850 +vt 0.772230 0.682770 +vt 0.773930 0.681450 +vt 0.774730 0.682380 +vt 0.775570 0.678860 +vt 0.777220 0.676280 +vt 0.776490 0.679420 +vt 0.775650 0.676010 +vt 0.775080 0.677820 +vt 0.774090 0.675750 +vt 0.777190 0.670680 +vt 0.775910 0.670130 +vt 0.777960 0.655830 +vt 0.776240 0.663240 +vt 0.776680 0.654430 +vt 0.772560 0.669850 +vt 0.773650 0.665910 +vt 0.773320 0.672800 +vt 0.774750 0.661970 +vt 0.774780 0.668020 +vt 0.756320 0.673970 +vt 0.758520 0.675140 +vt 0.758720 0.676980 +vt 0.760720 0.676310 +vt 0.761490 0.679210 +vt 0.762260 0.682110 +vt 0.755950 0.674760 +vt 0.755350 0.667860 +vt 0.755830 0.670910 +vt 0.755090 0.671080 +vt 0.754230 0.667410 +vt 0.769960 0.601370 +vt 0.769300 0.602940 +vt 0.763570 0.593620 +vt 0.768650 0.604520 +vt 0.763000 0.596520 +vt 0.762430 0.599430 +vt 0.771050 0.599000 +vt 0.770500 0.600180 +vt 0.764040 0.591150 +vt 0.764510 0.588680 +vt 0.771570 0.598530 +vt 0.765660 0.588430 +vt 0.784180 0.655580 +vt 0.783390 0.647070 +vt 0.782600 0.638550 +vt 0.781710 0.623300 +vt 0.781630 0.637560 +vt 0.776640 0.610910 +vt 0.775810 0.611080 +vt 0.774440 0.612360 +vt 0.775120 0.611720 +vt 0.776980 0.623370 +vt 0.772810 0.613940 +vt 0.773620 0.613150 +vt 0.777950 0.623360 +vt 0.767620 0.606280 +vt 0.761120 0.601720 +vt 0.771810 0.614840 +vt 0.776000 0.623410 +vt 0.757070 0.661740 +vt 0.758050 0.662570 +vt 0.755650 0.664580 +vt 0.756700 0.665210 +vt 0.763010 0.658900 +vt 0.763490 0.660080 +vt 0.760530 0.660730 +vt 0.763970 0.661260 +vt 0.761870 0.662900 +vt 0.761200 0.661820 +vt 0.758910 0.663560 +vt 0.766010 0.657080 +vt 0.765780 0.658410 +vt 0.764510 0.657990 +vt 0.765550 0.659740 +vt 0.764630 0.659240 +vt 0.764760 0.660500 +vt 0.762740 0.657460 +vt 0.759900 0.659600 +vt 0.764860 0.655870 +vt 0.766970 0.654270 +vt 0.773360 0.661020 +vt 0.772360 0.665140 +vt 0.771350 0.669250 +vt 0.771060 0.664370 +vt 0.771980 0.660080 +vt 0.774050 0.652250 +vt 0.776120 0.644420 +vt 0.775360 0.653340 +vt 0.777370 0.645660 +vt 0.775310 0.633670 +vt 0.776550 0.633890 +vt 0.774630 0.643940 +vt 0.777660 0.634510 +vt 0.770380 0.659710 +vt 0.772500 0.651820 +vt 0.768790 0.659350 +vt 0.770960 0.651400 +vt 0.770150 0.668660 +vt 0.768930 0.667290 +vt 0.769650 0.663500 +vt 0.767710 0.665920 +vt 0.768250 0.662630 +vt 0.765040 0.662630 +vt 0.765650 0.661680 +vt 0.766270 0.660730 +vt 0.766550 0.662860 +vt 0.766110 0.664010 +vt 0.764300 0.665460 +vt 0.762490 0.666920 +vt 0.763080 0.664180 +vt 0.761130 0.665730 +vt 0.762890 0.668830 +vt 0.764900 0.666890 +vt 0.766910 0.664960 +vt 0.765500 0.668330 +vt 0.763300 0.670740 +vt 0.757580 0.671870 +vt 0.756650 0.668610 +vt 0.757950 0.669370 +vt 0.757780 0.666080 +vt 0.759780 0.664550 +vt 0.758860 0.666960 +vt 0.760880 0.667890 +vt 0.760620 0.670050 +vt 0.774010 0.678600 +vt 0.770830 0.676470 +vt 0.771490 0.679160 +vt 0.768970 0.679730 +vt 0.768280 0.681400 +vt 0.766830 0.679640 +vt 0.764160 0.679420 +vt 0.764140 0.676750 +vt 0.771090 0.672860 +vt 0.768860 0.672930 +vt 0.759330 0.672840 +vt 0.762380 0.673400 +vt 0.765430 0.673970 +vt 0.767180 0.670630 +vt 0.767570 0.677200 +vt 0.767000 0.661720 +vt 0.767890 0.660530 +vt 0.767400 0.662750 +vt 0.766830 0.659470 +vt 0.767400 0.658210 +vt 0.768970 0.652840 +vt 0.219250 0.649960 +vt 0.219320 0.636560 +vt 0.220260 0.635840 +vt 0.219400 0.623170 +vt 0.220230 0.623260 +vt 0.221060 0.623350 +vt 0.220300 0.648430 +vt 0.221210 0.635120 +vt 0.220260 0.666180 +vt 0.219460 0.666630 +vt 0.218930 0.659930 +vt 0.218210 0.660480 +vt 0.217610 0.653680 +vt 0.219840 0.658580 +vt 0.218430 0.651820 +vt 0.221250 0.665340 +vt 0.220740 0.657230 +vt 0.221720 0.676470 +vt 0.220590 0.671550 +vt 0.221510 0.671230 +vt 0.222760 0.676280 +vt 0.226050 0.681450 +vt 0.227820 0.681850 +vt 0.225240 0.682380 +vt 0.229600 0.682260 +vt 0.230250 0.683160 +vt 0.227750 0.682770 +vt 0.223480 0.679420 +vt 0.224400 0.678860 +vt 0.225970 0.678600 +vt 0.224900 0.677820 +vt 0.224320 0.676010 +vt 0.222780 0.670680 +vt 0.224060 0.670130 +vt 0.225890 0.675750 +vt 0.222240 0.664510 +vt 0.222020 0.655830 +vt 0.221360 0.646900 +vt 0.223730 0.663240 +vt 0.225230 0.661970 +vt 0.225190 0.668020 +vt 0.226320 0.665910 +vt 0.227420 0.669850 +vt 0.237720 0.682110 +vt 0.238490 0.679210 +vt 0.241260 0.676980 +vt 0.239260 0.676310 +vt 0.241460 0.675140 +vt 0.243660 0.673970 +vt 0.244030 0.674760 +vt 0.244890 0.671080 +vt 0.244140 0.670910 +vt 0.245750 0.667410 +vt 0.237540 0.599430 +vt 0.236970 0.596520 +vt 0.231330 0.604520 +vt 0.230670 0.602940 +vt 0.230020 0.601370 +vt 0.236400 0.593620 +vt 0.235930 0.591150 +vt 0.229470 0.600180 +vt 0.228930 0.599000 +vt 0.235460 0.588680 +vt 0.234320 0.588430 +vt 0.228410 0.598530 +vt 0.216970 0.654330 +vt 0.216580 0.647070 +vt 0.217370 0.638550 +vt 0.218350 0.637560 +vt 0.218270 0.623300 +vt 0.224160 0.611080 +vt 0.223340 0.610910 +vt 0.224850 0.611720 +vt 0.225540 0.612360 +vt 0.226350 0.613150 +vt 0.227160 0.613940 +vt 0.222030 0.623360 +vt 0.238850 0.601720 +vt 0.232350 0.606280 +vt 0.228160 0.614840 +vt 0.223970 0.623410 +vt 0.223000 0.623370 +vt 0.244630 0.667860 +vt 0.243280 0.665210 +vt 0.241930 0.662570 +vt 0.242910 0.661740 +vt 0.244330 0.664580 +vt 0.240200 0.664550 +vt 0.238100 0.662900 +vt 0.238770 0.661820 +vt 0.236010 0.661260 +vt 0.236490 0.660080 +vt 0.236970 0.658900 +vt 0.241060 0.663560 +vt 0.239450 0.660730 +vt 0.235220 0.660500 +vt 0.234430 0.659740 +vt 0.235340 0.659240 +vt 0.234200 0.658410 +vt 0.235470 0.657990 +vt 0.240070 0.659600 +vt 0.237230 0.657460 +vt 0.235120 0.655870 +vt 0.233000 0.654270 +vt 0.229830 0.668660 +vt 0.228620 0.669250 +vt 0.227620 0.665140 +vt 0.228910 0.664370 +vt 0.226610 0.661020 +vt 0.222610 0.645660 +vt 0.224610 0.653340 +vt 0.223860 0.644420 +vt 0.225930 0.652250 +vt 0.228000 0.660080 +vt 0.223290 0.654430 +vt 0.223430 0.633890 +vt 0.225350 0.643940 +vt 0.224660 0.633670 +vt 0.222320 0.634510 +vt 0.229010 0.651400 +vt 0.231190 0.659350 +vt 0.227470 0.651820 +vt 0.229590 0.659710 +vt 0.231730 0.662630 +vt 0.232270 0.665920 +vt 0.230320 0.663500 +vt 0.231050 0.667290 +vt 0.232980 0.661720 +vt 0.233700 0.660730 +vt 0.234320 0.661680 +vt 0.233420 0.662860 +vt 0.234940 0.662630 +vt 0.238840 0.665730 +vt 0.237490 0.666920 +vt 0.236890 0.664180 +vt 0.235680 0.665460 +vt 0.233870 0.664010 +vt 0.233070 0.664960 +vt 0.235070 0.666890 +vt 0.234470 0.668330 +vt 0.237080 0.668830 +vt 0.242030 0.669370 +vt 0.243330 0.668610 +vt 0.240640 0.672840 +vt 0.242390 0.671870 +vt 0.241110 0.666960 +vt 0.242190 0.666080 +vt 0.236680 0.670740 +vt 0.239100 0.667890 +vt 0.239350 0.670050 +vt 0.231000 0.679730 +vt 0.228480 0.679160 +vt 0.232410 0.677200 +vt 0.231700 0.681400 +vt 0.233140 0.679640 +vt 0.235810 0.679420 +vt 0.235830 0.676750 +vt 0.226650 0.672800 +vt 0.228880 0.672860 +vt 0.231120 0.672930 +vt 0.229150 0.676470 +vt 0.234540 0.673970 +vt 0.237590 0.673400 +vt 0.232790 0.670630 +vt 0.232080 0.660530 +vt 0.232570 0.662750 +vt 0.233970 0.657080 +vt 0.232580 0.658210 +vt 0.233140 0.659470 +vt 0.229440 0.647460 +vt 0.231010 0.652840 +vt 0.579410 0.697110 +vt 0.574860 0.697100 +vt 0.575010 0.695920 +vt 0.570320 0.697100 +vt 0.570370 0.695950 +vt 0.575160 0.694730 +vt 0.579650 0.695880 +vt 0.579900 0.694660 +vt 0.548670 0.697900 +vt 0.551140 0.697260 +vt 0.551320 0.698170 +vt 0.553610 0.696620 +vt 0.553850 0.697690 +vt 0.554090 0.698770 +vt 0.548800 0.698640 +vt 0.548940 0.699390 +vt 0.561320 0.695650 +vt 0.557460 0.696130 +vt 0.557210 0.694780 +vt 0.553260 0.695380 +vt 0.552910 0.694150 +vt 0.561160 0.694190 +vt 0.556960 0.693440 +vt 0.548410 0.697090 +vt 0.550830 0.696230 +vt 0.548160 0.696280 +vt 0.550530 0.695210 +vt 0.552450 0.693120 +vt 0.552000 0.692090 +vt 0.556650 0.692220 +vt 0.556340 0.691010 +vt 0.560850 0.691330 +vt 0.561010 0.692730 +vt 0.547980 0.695520 +vt 0.550210 0.694320 +vt 0.547800 0.694760 +vt 0.549900 0.693420 +vt 0.543820 0.696090 +vt 0.545810 0.695420 +vt 0.546590 0.695710 +vt 0.545990 0.696180 +vt 0.560690 0.689940 +vt 0.555860 0.689370 +vt 0.551310 0.690740 +vt 0.560420 0.688010 +vt 0.591380 0.693880 +vt 0.594360 0.695760 +vt 0.593720 0.696910 +vt 0.597350 0.697640 +vt 0.596770 0.698630 +vt 0.593090 0.698070 +vt 0.590680 0.695200 +vt 0.589980 0.696520 +vt 0.599630 0.697410 +vt 0.598490 0.697520 +vt 0.596250 0.694210 +vt 0.595300 0.694980 +vt 0.592120 0.692450 +vt 0.592870 0.691020 +vt 0.585960 0.692580 +vt 0.584940 0.695590 +vt 0.585450 0.694080 +vt 0.580550 0.691280 +vt 0.580220 0.692970 +vt 0.570430 0.694810 +vt 0.575340 0.693080 +vt 0.570460 0.693200 +vt 0.575520 0.691440 +vt 0.570490 0.691600 +vt 0.565810 0.693690 +vt 0.565870 0.695230 +vt 0.565750 0.692160 +vt 0.570580 0.688440 +vt 0.570530 0.690020 +vt 0.565630 0.689190 +vt 0.565690 0.690670 +vt 0.575740 0.689810 +vt 0.580960 0.689610 +vt 0.575970 0.688190 +vt 0.586540 0.691030 +vt 0.581370 0.687950 +vt 0.587120 0.689480 +vt 0.597480 0.693360 +vt 0.593780 0.689290 +vt 0.601190 0.697440 +vt 0.587860 0.687580 +vt 0.581950 0.685880 +vt 0.576290 0.686060 +vt 0.570640 0.686240 +vt 0.565530 0.687120 +vt 0.561390 0.696800 +vt 0.557620 0.697240 +vt 0.561470 0.697950 +vt 0.557780 0.698360 +vt 0.565880 0.696370 +vt 0.565890 0.697520 +vt 0.584500 0.696740 +vt 0.584060 0.697890 +vt 0.589340 0.697590 +vt 0.588710 0.698670 +vt 0.592200 0.699000 +vt 0.596200 0.699630 +vt 0.591310 0.699930 +vt 0.595050 0.700410 +vt 0.599520 0.703890 +vt 0.597860 0.701760 +vt 0.598170 0.699640 +vt 0.599570 0.700650 +vt 0.602050 0.704640 +vt 0.601620 0.701040 +vt 0.596850 0.704280 +vt 0.595380 0.702740 +vt 0.598180 0.704080 +vt 0.593910 0.701200 +vt 0.596620 0.702250 +vt 0.543510 0.697310 +vt 0.545960 0.697200 +vt 0.545940 0.698210 +vt 0.543210 0.698530 +vt 0.546630 0.699660 +vt 0.546280 0.698940 +vt 0.544320 0.699940 +vt 0.543760 0.699230 +vt 0.543110 0.701610 +vt 0.541900 0.703290 +vt 0.542300 0.701110 +vt 0.540840 0.702990 +vt 0.541490 0.700610 +vt 0.539940 0.700790 +vt 0.541100 0.698900 +vt 0.538780 0.702690 +vt 0.546710 0.693280 +vt 0.550630 0.689400 +vt 0.549010 0.692010 +vt 0.544790 0.694380 +vt 0.542860 0.695480 +vt 0.541980 0.697190 +vt 0.429550 0.694810 +vt 0.429600 0.695950 +vt 0.424810 0.694730 +vt 0.429660 0.697100 +vt 0.425110 0.697100 +vt 0.424960 0.695920 +vt 0.420570 0.697110 +vt 0.420320 0.695880 +vt 0.445890 0.698770 +vt 0.446130 0.697690 +vt 0.448460 0.699080 +vt 0.446370 0.696620 +vt 0.448650 0.698170 +vt 0.448840 0.697260 +vt 0.451310 0.697900 +vt 0.451040 0.699390 +vt 0.447070 0.694150 +vt 0.446720 0.695380 +vt 0.443020 0.693440 +vt 0.442760 0.694780 +vt 0.442510 0.696130 +vt 0.438810 0.694190 +vt 0.438970 0.692730 +vt 0.449440 0.695210 +vt 0.451820 0.696280 +vt 0.449140 0.696230 +vt 0.451560 0.697090 +vt 0.439290 0.689940 +vt 0.443630 0.691010 +vt 0.443320 0.692220 +vt 0.447980 0.692090 +vt 0.447520 0.693120 +vt 0.439130 0.691330 +vt 0.450080 0.693420 +vt 0.452180 0.694760 +vt 0.449760 0.694320 +vt 0.452000 0.695520 +vt 0.454170 0.695420 +vt 0.456160 0.696090 +vt 0.453990 0.696180 +vt 0.453380 0.695710 +vt 0.448660 0.690740 +vt 0.444110 0.689370 +vt 0.439560 0.688010 +vt 0.403780 0.699630 +vt 0.403200 0.698630 +vt 0.406250 0.696910 +vt 0.402630 0.697640 +vt 0.405610 0.695760 +vt 0.409300 0.695200 +vt 0.406890 0.698070 +vt 0.408600 0.693880 +vt 0.404670 0.694980 +vt 0.401490 0.697520 +vt 0.400350 0.697410 +vt 0.407850 0.692450 +vt 0.403730 0.694210 +vt 0.420080 0.694660 +vt 0.415040 0.695590 +vt 0.414520 0.694080 +vt 0.410000 0.696520 +vt 0.419750 0.692970 +vt 0.414010 0.692580 +vt 0.429490 0.691600 +vt 0.429520 0.693200 +vt 0.424460 0.691440 +vt 0.424630 0.693080 +vt 0.419430 0.691280 +vt 0.438660 0.695650 +vt 0.434100 0.695230 +vt 0.434160 0.693690 +vt 0.434230 0.692160 +vt 0.434280 0.690670 +vt 0.429440 0.690020 +vt 0.429400 0.688440 +vt 0.434340 0.689190 +vt 0.424000 0.688190 +vt 0.424230 0.689810 +vt 0.419020 0.689610 +vt 0.418610 0.687950 +vt 0.412860 0.689480 +vt 0.413430 0.691030 +vt 0.407110 0.691020 +vt 0.406200 0.689290 +vt 0.402490 0.693360 +vt 0.398790 0.697440 +vt 0.418030 0.685880 +vt 0.412110 0.687580 +vt 0.429330 0.686240 +vt 0.423680 0.686060 +vt 0.434440 0.687120 +vt 0.442200 0.698360 +vt 0.438510 0.697950 +vt 0.442350 0.697240 +vt 0.438580 0.696800 +vt 0.434080 0.697520 +vt 0.434090 0.696370 +vt 0.410630 0.697590 +vt 0.415480 0.696740 +vt 0.415920 0.697890 +vt 0.404920 0.700410 +vt 0.407780 0.699000 +vt 0.411270 0.698670 +vt 0.408670 0.699930 +vt 0.401800 0.699640 +vt 0.402120 0.701760 +vt 0.400400 0.700650 +vt 0.398360 0.701040 +vt 0.400460 0.703890 +vt 0.397930 0.704640 +vt 0.403360 0.702250 +vt 0.406070 0.701200 +vt 0.404600 0.702740 +vt 0.403130 0.704280 +vt 0.454040 0.698210 +vt 0.454010 0.697200 +vt 0.456770 0.698530 +vt 0.456210 0.699230 +vt 0.453690 0.698940 +vt 0.455660 0.699940 +vt 0.453350 0.699660 +vt 0.451170 0.698640 +vt 0.460200 0.702690 +vt 0.459140 0.702990 +vt 0.458480 0.700610 +vt 0.458080 0.703290 +vt 0.456870 0.701610 +vt 0.457670 0.701110 +vt 0.458880 0.698900 +vt 0.460030 0.700790 +vt 0.461190 0.702690 +vt 0.450960 0.692010 +vt 0.453260 0.693280 +vt 0.455190 0.694380 +vt 0.457110 0.695480 +vt 0.456460 0.697310 +vt 0.457990 0.697190 +vt 0.544630 0.536620 +vt 0.545950 0.536190 +vt 0.546660 0.536900 +vt 0.547280 0.535770 +vt 0.547990 0.536680 +vt 0.547380 0.537620 +vt 0.545340 0.537130 +vt 0.546050 0.537650 +vt 0.540130 0.533980 +vt 0.543700 0.534870 +vt 0.542790 0.535540 +vt 0.541870 0.536210 +vt 0.539620 0.534890 +vt 0.549160 0.534920 +vt 0.551050 0.534080 +vt 0.551650 0.535580 +vt 0.549820 0.536130 +vt 0.550480 0.537330 +vt 0.554000 0.536810 +vt 0.552250 0.537080 +vt 0.553630 0.534890 +vt 0.553260 0.532980 +vt 0.532760 0.527720 +vt 0.531930 0.530070 +vt 0.526830 0.526320 +vt 0.531110 0.532420 +vt 0.526080 0.528840 +vt 0.525330 0.531360 +vt 0.519550 0.530310 +vt 0.520910 0.524930 +vt 0.548930 0.530890 +vt 0.546850 0.532330 +vt 0.544600 0.528790 +vt 0.542660 0.530580 +vt 0.541390 0.532280 +vt 0.545280 0.533600 +vt 0.539200 0.527070 +vt 0.533810 0.525360 +vt 0.537710 0.529150 +vt 0.536660 0.531170 +vt 0.535620 0.533200 +vt 0.527820 0.523820 +vt 0.521840 0.522290 +vt 0.510040 0.528900 +vt 0.514790 0.529600 +vt 0.514330 0.531810 +vt 0.518830 0.532450 +vt 0.518120 0.534600 +vt 0.509830 0.531170 +vt 0.513870 0.534020 +vt 0.510440 0.523170 +vt 0.510240 0.526030 +vt 0.505210 0.522870 +vt 0.505110 0.525800 +vt 0.505010 0.528740 +vt 0.499990 0.525580 +vt 0.499990 0.522580 +vt 0.510850 0.520580 +vt 0.505420 0.520290 +vt 0.499990 0.520010 +vt 0.516340 0.521440 +vt 0.515670 0.524050 +vt 0.520230 0.527620 +vt 0.515230 0.526820 +vt 0.499990 0.528580 +vt 0.504910 0.531040 +vt 0.509620 0.533450 +vt 0.499990 0.530910 +vt 0.504800 0.533340 +vt 0.535050 0.534380 +vt 0.539120 0.535810 +vt 0.530480 0.533880 +vt 0.534490 0.535570 +vt 0.524660 0.533160 +vt 0.529860 0.535340 +vt 0.523990 0.534970 +vt 0.451270 0.537590 +vt 0.451980 0.536680 +vt 0.452600 0.537620 +vt 0.452700 0.535770 +vt 0.454020 0.536190 +vt 0.453310 0.536900 +vt 0.454640 0.537130 +vt 0.453930 0.537650 +vt 0.455350 0.536620 +vt 0.458100 0.536210 +vt 0.457190 0.535540 +vt 0.456270 0.534870 +vt 0.460350 0.534890 +vt 0.460860 0.535810 +vt 0.447730 0.537080 +vt 0.448330 0.535580 +vt 0.449500 0.537330 +vt 0.448930 0.534080 +vt 0.450150 0.536130 +vt 0.450810 0.534920 +vt 0.446350 0.534890 +vt 0.445980 0.536810 +vt 0.446720 0.532980 +vt 0.480430 0.530310 +vt 0.474650 0.531360 +vt 0.479750 0.527620 +vt 0.468870 0.532420 +vt 0.468040 0.530070 +vt 0.473890 0.528840 +vt 0.473140 0.526320 +vt 0.453120 0.532330 +vt 0.451040 0.530890 +vt 0.455370 0.528790 +vt 0.457320 0.530580 +vt 0.454700 0.533600 +vt 0.459850 0.533980 +vt 0.462270 0.529150 +vt 0.460770 0.527070 +vt 0.466170 0.525360 +vt 0.467220 0.527720 +vt 0.458580 0.532280 +vt 0.464360 0.533200 +vt 0.463310 0.531170 +vt 0.479070 0.524930 +vt 0.472150 0.523820 +vt 0.478130 0.522290 +vt 0.481860 0.534600 +vt 0.481140 0.532450 +vt 0.486110 0.534020 +vt 0.485640 0.531810 +vt 0.485180 0.529600 +vt 0.490150 0.531170 +vt 0.490360 0.533450 +vt 0.494960 0.528740 +vt 0.489940 0.528900 +vt 0.489740 0.526030 +vt 0.494860 0.525800 +vt 0.494760 0.522870 +vt 0.489540 0.523170 +vt 0.489130 0.520580 +vt 0.494560 0.520290 +vt 0.484300 0.524050 +vt 0.483630 0.521440 +vt 0.484740 0.526820 +vt 0.495170 0.533340 +vt 0.495070 0.531040 +vt 0.499990 0.533240 +vt 0.465490 0.535570 +vt 0.464920 0.534380 +vt 0.469490 0.533880 +vt 0.470120 0.535340 +vt 0.475990 0.534970 +vt 0.475320 0.533160 +vt 0.514240 0.535190 +vt 0.514070 0.536220 +vt 0.510760 0.535800 +vt 0.513910 0.537250 +vt 0.510650 0.536900 +vt 0.507390 0.536550 +vt 0.510880 0.534710 +vt 0.507460 0.535390 +vt 0.507530 0.534240 +vt 0.503760 0.534090 +vt 0.503720 0.535170 +vt 0.503690 0.536250 +vt 0.499990 0.535960 +vt 0.499990 0.534950 +vt 0.507500 0.538800 +vt 0.507610 0.541050 +vt 0.503740 0.538540 +vt 0.503800 0.540830 +vt 0.499990 0.538290 +vt 0.514000 0.539390 +vt 0.514100 0.541530 +vt 0.510750 0.539090 +vt 0.510850 0.541290 +vt 0.548710 0.537590 +vt 0.546700 0.538300 +vt 0.547920 0.538480 +vt 0.549130 0.538660 +vt 0.546020 0.540240 +vt 0.545360 0.539620 +vt 0.546850 0.541140 +vt 0.550420 0.538970 +vt 0.523000 0.541920 +vt 0.529530 0.541710 +vt 0.529750 0.544260 +vt 0.536060 0.541500 +vt 0.536300 0.543540 +vt 0.523200 0.544980 +vt 0.522540 0.536240 +vt 0.522640 0.537210 +vt 0.518360 0.536710 +vt 0.522750 0.538190 +vt 0.518330 0.537720 +vt 0.518390 0.535710 +vt 0.518440 0.539720 +vt 0.522870 0.540050 +vt 0.518550 0.541720 +vt 0.528980 0.537500 +vt 0.528800 0.536550 +vt 0.535070 0.536870 +vt 0.529150 0.538450 +vt 0.535310 0.537790 +vt 0.544910 0.537800 +vt 0.545810 0.538050 +vt 0.544700 0.539010 +vt 0.544240 0.538480 +vt 0.540130 0.538860 +vt 0.535560 0.538710 +vt 0.539770 0.538130 +vt 0.539420 0.537410 +vt 0.543780 0.537950 +vt 0.529340 0.540080 +vt 0.535810 0.540100 +vt 0.541040 0.540870 +vt 0.540580 0.539860 +vt 0.541580 0.542340 +vt 0.518700 0.545140 +vt 0.514200 0.545300 +vt 0.510920 0.545050 +vt 0.507650 0.544790 +vt 0.503820 0.544500 +vt 0.499990 0.544210 +vt 0.499990 0.540620 +vt 0.492590 0.536550 +vt 0.489330 0.536900 +vt 0.492520 0.535390 +vt 0.486070 0.537250 +vt 0.489210 0.535800 +vt 0.485900 0.536220 +vt 0.489090 0.534710 +vt 0.492450 0.534240 +vt 0.496290 0.536250 +vt 0.496250 0.535170 +vt 0.496220 0.534090 +vt 0.496180 0.540830 +vt 0.492370 0.541050 +vt 0.492480 0.538800 +vt 0.496230 0.538540 +vt 0.489120 0.541290 +vt 0.489220 0.539090 +vt 0.485880 0.541530 +vt 0.485970 0.539390 +vt 0.453960 0.540240 +vt 0.450840 0.538660 +vt 0.454620 0.539620 +vt 0.452060 0.538480 +vt 0.455280 0.539010 +vt 0.449550 0.538970 +vt 0.453120 0.541140 +vt 0.463670 0.543540 +vt 0.463920 0.541500 +vt 0.470450 0.541710 +vt 0.470220 0.544260 +vt 0.476780 0.544980 +vt 0.481650 0.537720 +vt 0.477230 0.538190 +vt 0.481620 0.536710 +vt 0.477330 0.537210 +vt 0.481590 0.535710 +vt 0.485740 0.535190 +vt 0.476980 0.541920 +vt 0.477100 0.540050 +vt 0.481540 0.539720 +vt 0.481430 0.541720 +vt 0.464910 0.536870 +vt 0.471170 0.536550 +vt 0.464660 0.537790 +vt 0.477440 0.536240 +vt 0.471000 0.537500 +vt 0.470820 0.538450 +vt 0.464420 0.538710 +vt 0.453270 0.538300 +vt 0.455740 0.538480 +vt 0.454170 0.538050 +vt 0.455060 0.537800 +vt 0.456200 0.537950 +vt 0.460200 0.538130 +vt 0.459850 0.538860 +vt 0.460550 0.537410 +vt 0.464170 0.540100 +vt 0.470630 0.540080 +vt 0.459390 0.539860 +vt 0.458940 0.540870 +vt 0.458400 0.542340 +vt 0.481280 0.545140 +vt 0.485780 0.545300 +vt 0.492330 0.544790 +vt 0.489050 0.545050 +vt 0.496160 0.544500 +vt 0.967830 0.987120 +vt 0.967790 0.986370 +vt 0.960670 0.985790 +vt 0.967750 0.985620 +vt 0.960680 0.985000 +vt 0.953560 0.985210 +vt 0.960670 0.986580 +vt 0.953620 0.984380 +vt 0.949720 0.980730 +vt 0.945830 0.977080 +vt 0.949470 0.981610 +vt 0.945390 0.978000 +vt 0.949230 0.982490 +vt 0.953510 0.986050 +vt 0.944770 0.972380 +vt 0.943710 0.967690 +vt 0.944250 0.973230 +vt 0.943110 0.968470 +vt 0.943730 0.974090 +vt 0.944950 0.978930 +vt 0.945030 0.964150 +vt 0.946350 0.960610 +vt 0.944540 0.964500 +vt 0.945980 0.960530 +vt 0.944060 0.964850 +vt 0.942510 0.969250 +vt 0.945610 0.960450 +vt 0.948790 0.958020 +vt 0.949050 0.958310 +vt 0.951750 0.956010 +vt 0.948540 0.957730 +vt 0.951610 0.955510 +vt 0.951480 0.955010 +vt 0.956150 0.954200 +vt 0.956090 0.954630 +vt 0.960440 0.953250 +vt 0.956210 0.953780 +vt 0.960690 0.952900 +vt 0.970290 0.954780 +vt 0.970400 0.954250 +vt 0.965360 0.954010 +vt 0.970520 0.953730 +vt 0.965540 0.953580 +vt 0.965730 0.953140 +vt 0.976170 0.957830 +vt 0.976150 0.957290 +vt 0.973280 0.955770 +vt 0.976140 0.956750 +vt 0.973330 0.955240 +vt 0.973230 0.956300 +vt 0.977990 0.960010 +vt 0.979810 0.962200 +vt 0.977900 0.959660 +vt 0.979650 0.962030 +vt 0.977820 0.959310 +vt 0.980260 0.974150 +vt 0.980730 0.973930 +vt 0.979190 0.977160 +vt 0.981200 0.973710 +vt 0.979650 0.976860 +vt 0.978110 0.980020 +vt 0.978740 0.977450 +vt 0.977660 0.980390 +vt 0.981000 0.967580 +vt 0.981420 0.967390 +vt 0.981070 0.970660 +vt 0.981850 0.967210 +vt 0.981520 0.970460 +vt 0.980630 0.970860 +vt 0.980830 0.964700 +vt 0.980540 0.964710 +vt 0.980250 0.964720 +vt 0.979500 0.961870 +vt 0.972520 0.983940 +vt 0.977220 0.980760 +vt 0.972720 0.983380 +vt 0.972930 0.982820 +vt 0.943980 0.969450 +vt 0.945080 0.973750 +vt 0.945460 0.969660 +vt 0.946430 0.973420 +vt 0.947400 0.977180 +vt 0.946170 0.978050 +vt 0.948430 0.969330 +vt 0.949750 0.972290 +vt 0.951400 0.969000 +vt 0.953070 0.971170 +vt 0.951070 0.975260 +vt 0.955420 0.964020 +vt 0.953410 0.966510 +vt 0.951780 0.963040 +vt 0.950100 0.966180 +vt 0.946800 0.965860 +vt 0.948150 0.962070 +vt 0.946880 0.961260 +vt 0.945430 0.965350 +vt 0.952110 0.956330 +vt 0.952740 0.957660 +vt 0.949490 0.958790 +vt 0.950440 0.959860 +vt 0.953490 0.959280 +vt 0.954240 0.960910 +vt 0.952630 0.961160 +vt 0.954830 0.962460 +vt 0.956530 0.960370 +vt 0.957740 0.961400 +vt 0.958830 0.959830 +vt 0.960650 0.960340 +vt 0.962480 0.960850 +vt 0.958950 0.962430 +vt 0.960500 0.955840 +vt 0.959660 0.957830 +vt 0.956620 0.956750 +vt 0.956570 0.958560 +vt 0.956410 0.955260 +vt 0.960720 0.954200 +vt 0.969400 0.955200 +vt 0.968280 0.956680 +vt 0.965060 0.954700 +vt 0.964390 0.956260 +vt 0.960940 0.952560 +vt 0.962520 0.958300 +vt 0.965380 0.958760 +vt 0.972650 0.959000 +vt 0.968890 0.960590 +vt 0.970460 0.957840 +vt 0.965140 0.962190 +vt 0.967130 0.959680 +vt 0.963810 0.961520 +vt 0.974390 0.957870 +vt 0.971890 0.956540 +vt 0.950120 0.981200 +vt 0.951010 0.979920 +vt 0.954630 0.982660 +vt 0.954070 0.984350 +vt 0.960430 0.984770 +vt 0.960200 0.982960 +vt 0.965780 0.983260 +vt 0.966800 0.985190 +vt 0.971010 0.982390 +vt 0.969510 0.980850 +vt 0.973240 0.978450 +vt 0.975230 0.979600 +vt 0.976390 0.967970 +vt 0.975820 0.965570 +vt 0.978030 0.965150 +vt 0.975260 0.963180 +vt 0.977380 0.962520 +vt 0.978690 0.967770 +vt 0.964500 0.968190 +vt 0.965560 0.966420 +vt 0.970690 0.965990 +vt 0.966620 0.964650 +vt 0.970940 0.963910 +vt 0.970440 0.968080 +vt 0.961020 0.964330 +vt 0.959960 0.966100 +vt 0.962180 0.965620 +vt 0.965880 0.963420 +vt 0.969910 0.962250 +vt 0.973950 0.961090 +vt 0.975880 0.960200 +vt 0.960280 0.963100 +vt 0.962390 0.963620 +vt 0.957100 0.967070 +vt 0.957950 0.968590 +vt 0.959620 0.970770 +vt 0.956880 0.970180 +vt 0.954740 0.973350 +vt 0.965630 0.970010 +vt 0.966770 0.971840 +vt 0.960750 0.972590 +vt 0.962000 0.971120 +vt 0.975750 0.973310 +vt 0.971260 0.972570 +vt 0.970850 0.970320 +vt 0.976070 0.970640 +vt 0.978000 0.973730 +vt 0.978350 0.970750 +vt 0.965140 0.974890 +vt 0.965950 0.973360 +vt 0.970220 0.974620 +vt 0.974490 0.975880 +vt 0.969190 0.976670 +vt 0.976610 0.976660 +vt 0.963980 0.980680 +vt 0.966580 0.978670 +vt 0.962180 0.978100 +vt 0.963660 0.976490 +vt 0.959940 0.974120 +vt 0.962210 0.973360 +vt 0.955260 0.980240 +vt 0.955890 0.977830 +vt 0.959030 0.977960 +vt 0.959620 0.980460 +vt 0.959480 0.976040 +vt 0.955310 0.975590 +vt 0.953160 0.977750 +vt 0.961010 0.962350 +vt 0.547710 0.701560 +vt 0.546160 0.701590 +vt 0.546540 0.701180 +vt 0.544620 0.701620 +vt 0.544550 0.701270 +vt 0.544480 0.700920 +vt 0.548540 0.701100 +vt 0.546920 0.700780 +vt 0.544400 0.700430 +vt 0.543360 0.701910 +vt 0.543620 0.702200 +vt 0.542770 0.703490 +vt 0.542330 0.703390 +vt 0.565930 0.698440 +vt 0.570320 0.697990 +vt 0.570320 0.698880 +vt 0.561540 0.698890 +vt 0.561620 0.699830 +vt 0.558080 0.700130 +vt 0.557930 0.699240 +vt 0.554550 0.700440 +vt 0.554320 0.699600 +vt 0.551960 0.700540 +vt 0.549370 0.700640 +vt 0.549150 0.700010 +vt 0.551730 0.699810 +vt 0.551510 0.699080 +vt 0.554860 0.702350 +vt 0.554700 0.701390 +vt 0.558160 0.701180 +vt 0.561620 0.700960 +vt 0.558240 0.702220 +vt 0.565970 0.699350 +vt 0.570230 0.700120 +vt 0.565920 0.700540 +vt 0.570150 0.701360 +vt 0.565880 0.701730 +vt 0.594140 0.706330 +vt 0.594850 0.706940 +vt 0.591690 0.706510 +vt 0.595570 0.707560 +vt 0.592200 0.707410 +vt 0.592710 0.708320 +vt 0.589860 0.709080 +vt 0.589550 0.707880 +vt 0.593030 0.704470 +vt 0.593900 0.704460 +vt 0.593670 0.705110 +vt 0.594770 0.704450 +vt 0.594450 0.705390 +vt 0.592890 0.704830 +vt 0.593440 0.705760 +vt 0.592180 0.702440 +vt 0.593470 0.703440 +vt 0.592520 0.703740 +vt 0.591140 0.703020 +vt 0.591570 0.704040 +vt 0.587620 0.700350 +vt 0.589900 0.701390 +vt 0.588990 0.702200 +vt 0.590110 0.703610 +vt 0.586840 0.701370 +vt 0.588080 0.703000 +vt 0.574780 0.697990 +vt 0.579240 0.698000 +vt 0.579070 0.698900 +vt 0.574690 0.698890 +vt 0.583340 0.699620 +vt 0.582810 0.700730 +vt 0.586060 0.702400 +vt 0.578780 0.700080 +vt 0.582270 0.701830 +vt 0.574500 0.700100 +vt 0.578490 0.701270 +vt 0.574320 0.701310 +vt 0.583700 0.698750 +vt 0.588160 0.699510 +vt 0.590600 0.700660 +vt 0.593040 0.701820 +vt 0.594420 0.703090 +vt 0.595810 0.704360 +vt 0.595330 0.705650 +vt 0.596210 0.705920 +vt 0.542620 0.704780 +vt 0.543050 0.704660 +vt 0.542910 0.706170 +vt 0.542190 0.704890 +vt 0.543820 0.702380 +vt 0.544010 0.702550 +vt 0.543090 0.703490 +vt 0.544980 0.702010 +vt 0.545340 0.702400 +vt 0.544550 0.702700 +vt 0.545100 0.702850 +vt 0.544130 0.703390 +vt 0.543410 0.703490 +vt 0.543360 0.704490 +vt 0.543660 0.704320 +vt 0.543920 0.705160 +vt 0.543340 0.705840 +vt 0.544860 0.703300 +vt 0.544940 0.703640 +vt 0.545020 0.703990 +vt 0.544300 0.703980 +vt 0.544470 0.704570 +vt 0.546840 0.702330 +vt 0.546090 0.702360 +vt 0.547270 0.701940 +vt 0.546120 0.701970 +vt 0.548050 0.702780 +vt 0.547440 0.702550 +vt 0.547990 0.702260 +vt 0.548710 0.702570 +vt 0.548540 0.701960 +vt 0.545940 0.702830 +vt 0.545790 0.703300 +vt 0.546720 0.703310 +vt 0.546520 0.704260 +vt 0.545770 0.704120 +vt 0.546620 0.703780 +vt 0.545780 0.703710 +vt 0.546080 0.708320 +vt 0.546210 0.707530 +vt 0.550510 0.707510 +vt 0.546340 0.706750 +vt 0.550690 0.706450 +vt 0.554820 0.707490 +vt 0.550340 0.708580 +vt 0.554600 0.708840 +vt 0.565510 0.707590 +vt 0.555040 0.706150 +vt 0.565590 0.706170 +vt 0.576150 0.706190 +vt 0.565420 0.709020 +vt 0.576200 0.707690 +vt 0.589250 0.706690 +vt 0.582870 0.707790 +vt 0.583050 0.709140 +vt 0.576250 0.709200 +vt 0.582700 0.706440 +vt 0.592750 0.705190 +vt 0.591180 0.705690 +vt 0.590670 0.704880 +vt 0.588590 0.704580 +vt 0.588920 0.705630 +vt 0.582360 0.704120 +vt 0.582530 0.705280 +vt 0.576140 0.703660 +vt 0.576140 0.704920 +vt 0.565650 0.705220 +vt 0.555150 0.705510 +vt 0.565700 0.704270 +vt 0.546510 0.706350 +vt 0.550830 0.705930 +vt 0.546680 0.705950 +vt 0.555270 0.704880 +vt 0.543630 0.705500 +vt 0.544840 0.706290 +vt 0.545070 0.705920 +vt 0.545300 0.705550 +vt 0.544280 0.707410 +vt 0.542490 0.706500 +vt 0.544560 0.706850 +vt 0.549500 0.704100 +vt 0.549500 0.704150 +vt 0.549440 0.704190 +vt 0.549360 0.704030 +vt 0.549380 0.704060 +vt 0.549340 0.704070 +vt 0.549240 0.704040 +vt 0.549300 0.704030 +vt 0.549240 0.704080 +vt 0.549110 0.704050 +vt 0.549060 0.704170 +vt 0.549030 0.704140 +vt 0.549480 0.704030 +vt 0.549010 0.704300 +vt 0.548940 0.704310 +vt 0.548940 0.704230 +vt 0.548970 0.704230 +vt 0.549150 0.704440 +vt 0.549130 0.704470 +vt 0.549050 0.704460 +vt 0.549010 0.704390 +vt 0.549300 0.704430 +vt 0.549300 0.704460 +vt 0.549220 0.704470 +vt 0.549220 0.704430 +vt 0.549470 0.704340 +vt 0.549390 0.704420 +vt 0.549440 0.704330 +vt 0.549330 0.704160 +vt 0.549190 0.704150 +vt 0.549060 0.704300 +vt 0.546410 0.704790 +vt 0.545440 0.704680 +vt 0.546310 0.705320 +vt 0.545110 0.705240 +vt 0.545630 0.705470 +vt 0.546490 0.705630 +vt 0.546750 0.705250 +vt 0.547200 0.705180 +vt 0.546730 0.705480 +vt 0.546940 0.705560 +vt 0.546780 0.702820 +vt 0.547350 0.702970 +vt 0.547270 0.703390 +vt 0.547930 0.703130 +vt 0.547570 0.704510 +vt 0.547040 0.704380 +vt 0.547690 0.703990 +vt 0.547150 0.703890 +vt 0.547820 0.703480 +vt 0.547380 0.704840 +vt 0.546900 0.704810 +vt 0.548200 0.704120 +vt 0.548370 0.703530 +vt 0.548710 0.704250 +vt 0.548030 0.704710 +vt 0.548540 0.703050 +vt 0.549150 0.702980 +vt 0.548930 0.703590 +vt 0.548490 0.704920 +vt 0.547750 0.704870 +vt 0.546770 0.700220 +vt 0.552690 0.702360 +vt 0.550530 0.702370 +vt 0.552320 0.701450 +vt 0.549950 0.701500 +vt 0.549950 0.702370 +vt 0.549370 0.702370 +vt 0.549240 0.701730 +vt 0.732820 0.030790 +vt 0.736750 0.030790 +vt 0.732640 0.046270 +vt 0.740680 0.030790 +vt 0.739870 0.046260 +vt 0.736250 0.046260 +vt 0.739060 0.061740 +vt 0.732470 0.061750 +vt 0.744420 0.030790 +vt 0.743470 0.046280 +vt 0.748170 0.030800 +vt 0.747080 0.046310 +vt 0.742520 0.061780 +vt 0.751760 0.030800 +vt 0.750790 0.046400 +vt 0.755350 0.030810 +vt 0.754500 0.046490 +vt 0.753650 0.062170 +vt 0.745990 0.061820 +vt 0.758060 0.030810 +vt 0.757300 0.046540 +vt 0.760770 0.030820 +vt 0.760100 0.046590 +vt 0.759430 0.062360 +vt 0.756540 0.062260 +vt 0.765150 0.030830 +vt 0.764930 0.046640 +vt 0.762510 0.046610 +vt 0.764710 0.062460 +vt 0.762070 0.062410 +vt 0.762960 0.030820 +vt 0.767570 0.030830 +vt 0.769990 0.030830 +vt 0.767690 0.046670 +vt 0.770450 0.046690 +vt 0.767810 0.062510 +vt 0.764190 0.079220 +vt 0.761840 0.079220 +vt 0.761950 0.070810 +vt 0.759490 0.079220 +vt 0.759460 0.070790 +vt 0.764450 0.070840 +vt 0.770920 0.062560 +vt 0.770320 0.070890 +vt 0.767380 0.070860 +vt 0.769720 0.079220 +vt 0.766950 0.079220 +vt 0.760950 0.018600 +vt 0.762990 0.018610 +vt 0.760860 0.024710 +vt 0.765040 0.018620 +vt 0.762970 0.024710 +vt 0.765090 0.024720 +vt 0.755860 0.018570 +vt 0.758400 0.018580 +vt 0.755600 0.024690 +vt 0.758230 0.024700 +vt 0.756670 0.070740 +vt 0.756810 0.079220 +vt 0.753890 0.070690 +vt 0.754140 0.079220 +vt 0.750340 0.079220 +vt 0.746540 0.079220 +vt 0.746260 0.070520 +vt 0.750080 0.070600 +vt 0.749820 0.061990 +vt 0.754990 0.085780 +vt 0.760040 0.086160 +vt 0.751250 0.092270 +vt 0.765100 0.086540 +vt 0.761260 0.089740 +vt 0.771270 0.087200 +vt 0.777450 0.087870 +vt 0.762480 0.093320 +vt 0.781470 0.090200 +vt 0.785490 0.092540 +vt 0.775600 0.094790 +vt 0.788730 0.096270 +vt 0.769740 0.099380 +vt 0.747520 0.098770 +vt 0.749290 0.018540 +vt 0.752570 0.018550 +vt 0.752160 0.024680 +vt 0.748730 0.024670 +vt 0.749180 0.011010 +vt 0.752340 0.011010 +vt 0.752460 0.014780 +vt 0.755510 0.011010 +vt 0.755680 0.014790 +vt 0.749230 0.014770 +vt 0.757710 0.011010 +vt 0.759910 0.011010 +vt 0.758050 0.014790 +vt 0.760430 0.014800 +vt 0.740940 0.011010 +vt 0.745060 0.011010 +vt 0.745270 0.014770 +vt 0.741310 0.014770 +vt 0.745480 0.018530 +vt 0.733570 0.018520 +vt 0.734110 0.014760 +vt 0.737620 0.018520 +vt 0.734660 0.011010 +vt 0.737710 0.014760 +vt 0.737800 0.011010 +vt 0.741680 0.018530 +vt 0.737180 0.024650 +vt 0.741180 0.024660 +vt 0.733190 0.024650 +vt 0.744950 0.024660 +vt 0.742730 0.070500 +vt 0.742950 0.079220 +vt 0.739210 0.070480 +vt 0.736100 0.070480 +vt 0.739360 0.079220 +vt 0.736430 0.079220 +vt 0.733510 0.079220 +vt 0.735760 0.061740 +vt 0.732990 0.070480 +vt 0.748170 0.085740 +vt 0.751580 0.085760 +vt 0.750220 0.090090 +vt 0.747840 0.092250 +vt 0.802940 0.079220 +vt 0.800790 0.079220 +vt 0.801930 0.070470 +vt 0.798640 0.079220 +vt 0.799650 0.070470 +vt 0.800660 0.061730 +vt 0.804220 0.070470 +vt 0.803080 0.061720 +vt 0.747520 0.112620 +vt 0.750180 0.121360 +vt 0.747330 0.121140 +vt 0.752840 0.130110 +vt 0.749170 0.124130 +vt 0.747150 0.129660 +vt 0.797730 0.011010 +vt 0.801100 0.011010 +vt 0.798290 0.014740 +vt 0.804480 0.011010 +vt 0.801740 0.014740 +vt 0.805190 0.014740 +vt 0.802370 0.018480 +vt 0.798850 0.018480 +vt 0.798900 0.030780 +vt 0.798870 0.024630 +vt 0.802230 0.024630 +vt 0.805900 0.018480 +vt 0.802090 0.030780 +vt 0.805590 0.024630 +vt 0.799780 0.046250 +vt 0.802580 0.046250 +vt 0.805280 0.030780 +vt 0.805500 0.061720 +vt 0.769640 0.018630 +vt 0.769620 0.014820 +vt 0.772240 0.018600 +vt 0.769610 0.011010 +vt 0.772540 0.011010 +vt 0.772390 0.014800 +vt 0.775470 0.011010 +vt 0.775160 0.014790 +vt 0.774850 0.018570 +vt 0.777660 0.014780 +vt 0.777770 0.011010 +vt 0.791970 0.100000 +vt 0.791990 0.105590 +vt 0.769750 0.105640 +vt 0.792010 0.111180 +vt 0.769760 0.111900 +vt 0.755650 0.121610 +vt 0.763780 0.130610 +vt 0.754710 0.124440 +vt 0.795540 0.079220 +vt 0.796600 0.070480 +vt 0.792440 0.079220 +vt 0.793560 0.070490 +vt 0.797670 0.061750 +vt 0.794690 0.061770 +vt 0.793190 0.046280 +vt 0.796480 0.046260 +vt 0.791700 0.030790 +vt 0.795300 0.030780 +vt 0.791200 0.018490 +vt 0.795020 0.018480 +vt 0.791450 0.024640 +vt 0.795160 0.024630 +vt 0.790740 0.011010 +vt 0.794230 0.011010 +vt 0.790970 0.014750 +vt 0.794630 0.014740 +vt 0.785410 0.011010 +vt 0.788070 0.011010 +vt 0.785550 0.014760 +vt 0.788260 0.014750 +vt 0.788440 0.018500 +vt 0.785690 0.018510 +vt 0.782850 0.014770 +vt 0.782970 0.018530 +vt 0.780490 0.030810 +vt 0.780370 0.024680 +vt 0.783140 0.024660 +vt 0.780250 0.018550 +vt 0.783310 0.030800 +vt 0.785910 0.024650 +vt 0.788680 0.024640 +vt 0.788910 0.030790 +vt 0.786130 0.030790 +vt 0.783490 0.062210 +vt 0.781990 0.046510 +vt 0.784780 0.046440 +vt 0.786260 0.062080 +vt 0.787580 0.046370 +vt 0.789040 0.061950 +vt 0.790390 0.046320 +vt 0.791860 0.061860 +vt 0.787820 0.070580 +vt 0.785110 0.070650 +vt 0.786610 0.079220 +vt 0.783960 0.079220 +vt 0.782400 0.070710 +vt 0.789520 0.079220 +vt 0.790690 0.070540 +vt 0.781050 0.124930 +vt 0.777610 0.126920 +vt 0.766630 0.124270 +vt 0.774170 0.128920 +vt 0.768970 0.129760 +vt 0.764280 0.118770 +vt 0.775330 0.079220 +vt 0.776190 0.070810 +vt 0.778320 0.079220 +vt 0.777050 0.062410 +vt 0.780270 0.062310 +vt 0.779290 0.070760 +vt 0.781320 0.079220 +vt 0.773250 0.070850 +vt 0.772520 0.079220 +vt 0.773980 0.062480 +vt 0.790600 0.115490 +vt 0.789190 0.119800 +vt 0.777440 0.117130 +vt 0.785120 0.122360 +vt 0.775980 0.046610 +vt 0.778980 0.046560 +vt 0.774910 0.030810 +vt 0.777700 0.030810 +vt 0.774880 0.024690 +vt 0.777620 0.024680 +vt 0.777550 0.018560 +vt 0.769810 0.024730 +vt 0.772340 0.024710 +vt 0.772450 0.030820 +vt 0.762150 0.011010 +vt 0.764390 0.011010 +vt 0.762570 0.014810 +vt 0.764710 0.014810 +vt 0.767170 0.014810 +vt 0.767000 0.011010 +vt 0.767340 0.018620 +vt 0.767450 0.024720 +vt 0.773210 0.046650 +vt 0.504770 0.533490 +vt 0.509550 0.533610 +vt 0.509480 0.533780 +vt 0.499990 0.533370 +vt 0.504730 0.533640 +vt 0.513760 0.534320 +vt 0.513810 0.534170 +vt 0.518080 0.534730 +vt 0.518050 0.534860 +vt 0.523950 0.535260 +vt 0.523970 0.535110 +vt 0.529860 0.535500 +vt 0.529860 0.535670 +vt 0.534350 0.535720 +vt 0.538850 0.535940 +vt 0.534220 0.535870 +vt 0.541570 0.536340 +vt 0.544290 0.536750 +vt 0.541260 0.536470 +vt 0.538580 0.536070 +vt 0.544880 0.537130 +vt 0.545470 0.537510 +vt 0.544420 0.537130 +vt 0.543950 0.536880 +vt 0.544540 0.537640 +vt 0.543610 0.537780 +vt 0.544170 0.537490 +vt 0.544900 0.537380 +vt 0.539350 0.537220 +vt 0.535100 0.536660 +vt 0.539280 0.537030 +vt 0.543440 0.537610 +vt 0.535130 0.536460 +vt 0.528800 0.536300 +vt 0.528800 0.536040 +vt 0.522500 0.535930 +vt 0.518430 0.535470 +vt 0.514370 0.535020 +vt 0.518480 0.535240 +vt 0.522470 0.535630 +vt 0.510950 0.534570 +vt 0.507530 0.534130 +vt 0.511010 0.534440 +vt 0.514500 0.534850 +vt 0.507530 0.534030 +vt 0.503760 0.534000 +vt 0.499990 0.533950 +vt 0.503760 0.533920 +vt 0.046360 0.984380 +vt 0.039290 0.985000 +vt 0.046410 0.985210 +vt 0.032230 0.985620 +vt 0.039300 0.985790 +vt 0.032190 0.986370 +vt 0.032150 0.987120 +vt 0.046470 0.986050 +vt 0.055030 0.978930 +vt 0.054590 0.978000 +vt 0.050500 0.981610 +vt 0.054150 0.977080 +vt 0.050250 0.980730 +vt 0.050750 0.982490 +vt 0.057470 0.969250 +vt 0.056870 0.968470 +vt 0.055730 0.973230 +vt 0.056270 0.967690 +vt 0.055210 0.972380 +vt 0.056250 0.974090 +vt 0.054360 0.960450 +vt 0.053990 0.960530 +vt 0.055430 0.964500 +vt 0.053630 0.960610 +vt 0.054950 0.964150 +vt 0.055910 0.964850 +vt 0.048230 0.956010 +vt 0.050930 0.958310 +vt 0.048360 0.955510 +vt 0.051180 0.958020 +vt 0.051430 0.957730 +vt 0.048500 0.955010 +vt 0.039540 0.953250 +vt 0.043880 0.954630 +vt 0.039290 0.952900 +vt 0.043820 0.954200 +vt 0.043770 0.953780 +vt 0.039040 0.952560 +vt 0.034250 0.953140 +vt 0.034430 0.953580 +vt 0.029460 0.953730 +vt 0.029570 0.954250 +vt 0.029680 0.954780 +vt 0.034610 0.954010 +vt 0.026650 0.955240 +vt 0.023840 0.956750 +vt 0.026690 0.955770 +vt 0.023820 0.957290 +vt 0.026740 0.956300 +vt 0.020480 0.961870 +vt 0.020320 0.962030 +vt 0.022070 0.959660 +vt 0.020170 0.962200 +vt 0.021990 0.960010 +vt 0.023810 0.957830 +vt 0.022160 0.959310 +vt 0.021860 0.980020 +vt 0.020320 0.976860 +vt 0.022310 0.980390 +vt 0.018780 0.973710 +vt 0.020770 0.977160 +vt 0.019240 0.973930 +vt 0.021230 0.977450 +vt 0.022760 0.980760 +vt 0.018450 0.970460 +vt 0.018120 0.967210 +vt 0.018890 0.970660 +vt 0.018550 0.967390 +vt 0.019340 0.970860 +vt 0.019710 0.974150 +vt 0.018980 0.967580 +vt 0.019430 0.964710 +vt 0.019140 0.964700 +vt 0.019730 0.964720 +vt 0.027250 0.983380 +vt 0.027450 0.983940 +vt 0.027040 0.982820 +vt 0.052580 0.977180 +vt 0.053550 0.973420 +vt 0.053800 0.978050 +vt 0.054520 0.969660 +vt 0.054900 0.973750 +vt 0.055990 0.969450 +vt 0.045230 0.973350 +vt 0.046900 0.971170 +vt 0.050220 0.972290 +vt 0.048580 0.969000 +vt 0.051550 0.969330 +vt 0.048900 0.975260 +vt 0.049870 0.966180 +vt 0.046570 0.966510 +vt 0.044560 0.964020 +vt 0.053170 0.965860 +vt 0.048190 0.963040 +vt 0.051820 0.962070 +vt 0.054540 0.965350 +vt 0.053090 0.961260 +vt 0.049530 0.959860 +vt 0.047240 0.957660 +vt 0.047870 0.956330 +vt 0.050480 0.958790 +vt 0.045150 0.962460 +vt 0.047340 0.961160 +vt 0.045740 0.960910 +vt 0.046490 0.959280 +vt 0.037500 0.960850 +vt 0.039320 0.960340 +vt 0.042230 0.961400 +vt 0.041150 0.959830 +vt 0.043440 0.960370 +vt 0.041030 0.962430 +vt 0.040310 0.957830 +vt 0.043400 0.958560 +vt 0.039470 0.955840 +vt 0.043350 0.956750 +vt 0.043560 0.955260 +vt 0.039250 0.954200 +vt 0.035580 0.956260 +vt 0.031690 0.956680 +vt 0.034910 0.954700 +vt 0.030570 0.955200 +vt 0.037450 0.958300 +vt 0.034590 0.958760 +vt 0.036170 0.961520 +vt 0.034840 0.962190 +vt 0.032840 0.959680 +vt 0.031080 0.960590 +vt 0.029510 0.957840 +vt 0.027330 0.959000 +vt 0.028080 0.956540 +vt 0.025580 0.957870 +vt 0.045350 0.982660 +vt 0.048960 0.979920 +vt 0.045910 0.984350 +vt 0.049850 0.981200 +vt 0.034200 0.983260 +vt 0.039770 0.982960 +vt 0.039540 0.984770 +vt 0.039310 0.986580 +vt 0.033170 0.985190 +vt 0.026730 0.978450 +vt 0.030460 0.980850 +vt 0.024740 0.979600 +vt 0.028960 0.982390 +vt 0.022600 0.962520 +vt 0.021940 0.965150 +vt 0.024720 0.963180 +vt 0.024150 0.965570 +vt 0.023590 0.967970 +vt 0.021280 0.967770 +vt 0.029030 0.963910 +vt 0.029280 0.965990 +vt 0.033350 0.964650 +vt 0.034410 0.966420 +vt 0.029530 0.968080 +vt 0.038950 0.964330 +vt 0.037790 0.965620 +vt 0.035480 0.968190 +vt 0.030060 0.962250 +vt 0.034090 0.963420 +vt 0.026020 0.961090 +vt 0.024090 0.960200 +vt 0.037580 0.963620 +vt 0.040020 0.966100 +vt 0.042030 0.968590 +vt 0.042870 0.967070 +vt 0.040350 0.970770 +vt 0.043090 0.970180 +vt 0.033200 0.971840 +vt 0.034340 0.970010 +vt 0.039210 0.972590 +vt 0.037970 0.971120 +vt 0.029120 0.970320 +vt 0.028710 0.972570 +vt 0.023910 0.970640 +vt 0.021620 0.970750 +vt 0.024230 0.973310 +vt 0.021970 0.973730 +vt 0.029750 0.974620 +vt 0.034020 0.973360 +vt 0.030780 0.976670 +vt 0.025480 0.975880 +vt 0.023350 0.976660 +vt 0.034840 0.974890 +vt 0.036320 0.976490 +vt 0.033390 0.978670 +vt 0.037800 0.978100 +vt 0.036000 0.980680 +vt 0.037750 0.973360 +vt 0.040030 0.974120 +vt 0.040940 0.977960 +vt 0.040350 0.980460 +vt 0.044080 0.977830 +vt 0.044710 0.980240 +vt 0.044650 0.975590 +vt 0.040480 0.976040 +vt 0.046810 0.977750 +vt 0.039700 0.963100 +vt 0.038960 0.962350 +vt 0.455500 0.700920 +vt 0.455430 0.701270 +vt 0.453430 0.701180 +vt 0.455360 0.701620 +vt 0.453810 0.701590 +vt 0.451440 0.701100 +vt 0.453050 0.700780 +vt 0.457210 0.703490 +vt 0.456350 0.702200 +vt 0.456610 0.701910 +vt 0.455580 0.700430 +vt 0.457640 0.703390 +vt 0.429660 0.698880 +vt 0.429660 0.697990 +vt 0.434010 0.699350 +vt 0.434040 0.698440 +vt 0.438430 0.698890 +vt 0.445660 0.699600 +vt 0.442040 0.699240 +vt 0.445430 0.700440 +vt 0.441890 0.700130 +vt 0.450820 0.700010 +vt 0.450610 0.700640 +vt 0.448240 0.699810 +vt 0.448020 0.700540 +vt 0.438360 0.699830 +vt 0.441810 0.701180 +vt 0.445270 0.701390 +vt 0.445120 0.702350 +vt 0.438360 0.700960 +vt 0.438360 0.702100 +vt 0.429830 0.701360 +vt 0.429740 0.700120 +vt 0.434050 0.700540 +vt 0.434090 0.701730 +vt 0.410120 0.709080 +vt 0.407260 0.708320 +vt 0.410420 0.707880 +vt 0.404410 0.707560 +vt 0.407770 0.707410 +vt 0.405120 0.706940 +vt 0.405840 0.706330 +vt 0.408280 0.706510 +vt 0.405520 0.705390 +vt 0.406300 0.705110 +vt 0.405210 0.704450 +vt 0.406080 0.704460 +vt 0.406950 0.704470 +vt 0.406530 0.705760 +vt 0.407090 0.704830 +vt 0.408410 0.704040 +vt 0.407450 0.703740 +vt 0.406500 0.703440 +vt 0.408830 0.703020 +vt 0.409870 0.703610 +vt 0.411890 0.703000 +vt 0.407800 0.702440 +vt 0.410080 0.701390 +vt 0.410980 0.702200 +vt 0.413140 0.701370 +vt 0.413920 0.702400 +vt 0.420910 0.698900 +vt 0.420740 0.698000 +vt 0.425280 0.698890 +vt 0.425200 0.697990 +vt 0.417700 0.701830 +vt 0.412360 0.700350 +vt 0.417170 0.700730 +vt 0.416630 0.699620 +vt 0.421200 0.700080 +vt 0.421490 0.701270 +vt 0.425660 0.701310 +vt 0.425470 0.700100 +vt 0.411810 0.699510 +vt 0.416270 0.698750 +vt 0.406930 0.701820 +vt 0.409370 0.700660 +vt 0.404170 0.704360 +vt 0.405550 0.703090 +vt 0.403770 0.705920 +vt 0.404640 0.705650 +vt 0.456640 0.705840 +vt 0.456920 0.704660 +vt 0.457060 0.706170 +vt 0.457350 0.704780 +vt 0.457780 0.704890 +vt 0.457490 0.706500 +vt 0.456160 0.702380 +vt 0.456890 0.703490 +vt 0.455960 0.702550 +vt 0.455120 0.703300 +vt 0.454880 0.702850 +vt 0.455420 0.702700 +vt 0.454640 0.702400 +vt 0.455000 0.702010 +vt 0.455840 0.703390 +vt 0.456060 0.705160 +vt 0.456310 0.704320 +vt 0.456350 0.705500 +vt 0.456570 0.703490 +vt 0.456620 0.704490 +vt 0.455510 0.704570 +vt 0.454960 0.703990 +vt 0.455040 0.703640 +vt 0.455670 0.703980 +vt 0.453850 0.701970 +vt 0.453890 0.702360 +vt 0.453140 0.702330 +vt 0.452700 0.701940 +vt 0.452270 0.701560 +vt 0.451440 0.701960 +vt 0.452530 0.702550 +vt 0.451980 0.702260 +vt 0.451270 0.702570 +vt 0.450610 0.702370 +vt 0.453200 0.702820 +vt 0.454040 0.702830 +vt 0.454190 0.703300 +vt 0.453260 0.703310 +vt 0.454200 0.703710 +vt 0.454210 0.704120 +vt 0.453460 0.704260 +vt 0.453360 0.703780 +vt 0.444940 0.706150 +vt 0.449290 0.706450 +vt 0.449460 0.707510 +vt 0.453640 0.706750 +vt 0.453770 0.707530 +vt 0.453900 0.708320 +vt 0.445160 0.707490 +vt 0.449640 0.708580 +vt 0.423830 0.706190 +vt 0.434380 0.706170 +vt 0.434470 0.707590 +vt 0.445380 0.708840 +vt 0.423780 0.707690 +vt 0.434550 0.709020 +vt 0.423730 0.709200 +vt 0.416920 0.709140 +vt 0.417100 0.707790 +vt 0.417280 0.706440 +vt 0.410730 0.706690 +vt 0.408790 0.705690 +vt 0.407230 0.705190 +vt 0.411060 0.705630 +vt 0.409310 0.704880 +vt 0.423830 0.704920 +vt 0.417440 0.705280 +vt 0.417610 0.704120 +vt 0.423840 0.703660 +vt 0.444710 0.704880 +vt 0.444820 0.705510 +vt 0.434330 0.705220 +vt 0.434270 0.704270 +vt 0.453300 0.705950 +vt 0.453470 0.706350 +vt 0.449000 0.705410 +vt 0.449140 0.705930 +vt 0.454680 0.705550 +vt 0.454910 0.705920 +vt 0.455140 0.706290 +vt 0.455410 0.706850 +vt 0.455690 0.707410 +vt 0.450530 0.704230 +vt 0.450510 0.704120 +vt 0.450590 0.704100 +vt 0.450540 0.704020 +vt 0.450580 0.704020 +vt 0.450650 0.704110 +vt 0.450680 0.704030 +vt 0.450790 0.704120 +vt 0.450800 0.704040 +vt 0.450850 0.704090 +vt 0.450970 0.704120 +vt 0.450880 0.704150 +vt 0.451040 0.704230 +vt 0.451040 0.704270 +vt 0.451000 0.704410 +vt 0.450930 0.704460 +vt 0.450900 0.704430 +vt 0.450840 0.704470 +vt 0.450830 0.704440 +vt 0.450670 0.704500 +vt 0.450750 0.704430 +vt 0.450600 0.704400 +vt 0.450510 0.704340 +vt 0.450560 0.704330 +vt 0.450580 0.704230 +vt 0.450670 0.704170 +vt 0.450780 0.704170 +vt 0.450940 0.704270 +vt 0.454860 0.705240 +vt 0.453670 0.705320 +vt 0.454530 0.704680 +vt 0.453560 0.704790 +vt 0.454340 0.705470 +vt 0.453480 0.705630 +vt 0.452780 0.705180 +vt 0.453220 0.705250 +vt 0.453250 0.705480 +vt 0.453040 0.705560 +vt 0.451930 0.702780 +vt 0.452040 0.703130 +vt 0.452620 0.702970 +vt 0.452710 0.703390 +vt 0.452160 0.703480 +vt 0.452820 0.703890 +vt 0.452930 0.704380 +vt 0.452410 0.704510 +vt 0.452280 0.703990 +vt 0.453080 0.704810 +vt 0.452590 0.704840 +vt 0.451050 0.703590 +vt 0.451600 0.703530 +vt 0.451270 0.704250 +vt 0.451770 0.704120 +vt 0.451950 0.704710 +vt 0.451490 0.704920 +vt 0.450830 0.702980 +vt 0.451430 0.703050 +vt 0.452130 0.705050 +vt 0.452220 0.704870 +vt 0.453200 0.700220 +vt 0.450030 0.701500 +vt 0.447650 0.701450 +vt 0.449450 0.702370 +vt 0.447280 0.702360 +vt 0.450730 0.701730 +vt 0.450030 0.702370 +vt 0.260920 0.061740 +vt 0.260100 0.046260 +vt 0.263710 0.046260 +vt 0.259290 0.030790 +vt 0.263220 0.030790 +vt 0.267150 0.030790 +vt 0.264210 0.061740 +vt 0.267320 0.046270 +vt 0.253990 0.061820 +vt 0.252890 0.046310 +vt 0.257450 0.061780 +vt 0.251800 0.030800 +vt 0.256500 0.046280 +vt 0.255540 0.030790 +vt 0.246320 0.062170 +vt 0.245470 0.046490 +vt 0.249180 0.046400 +vt 0.244630 0.030810 +vt 0.248210 0.030800 +vt 0.250150 0.061990 +vt 0.240540 0.062360 +vt 0.239870 0.046590 +vt 0.243430 0.062260 +vt 0.239210 0.030820 +vt 0.242670 0.046540 +vt 0.241920 0.030810 +vt 0.237900 0.062410 +vt 0.237460 0.046610 +vt 0.235270 0.062460 +vt 0.235050 0.046640 +vt 0.234830 0.030830 +vt 0.237020 0.030820 +vt 0.229060 0.062560 +vt 0.229520 0.046690 +vt 0.232280 0.046670 +vt 0.229990 0.030830 +vt 0.232410 0.030830 +vt 0.232160 0.062510 +vt 0.240510 0.070790 +vt 0.240490 0.079220 +vt 0.238020 0.070810 +vt 0.238140 0.079220 +vt 0.235530 0.070840 +vt 0.235790 0.079220 +vt 0.233020 0.079220 +vt 0.232590 0.070860 +vt 0.230260 0.079220 +vt 0.229660 0.070890 +vt 0.234880 0.024720 +vt 0.237000 0.024710 +vt 0.234940 0.018620 +vt 0.236980 0.018610 +vt 0.239030 0.018600 +vt 0.239120 0.024710 +vt 0.241570 0.018580 +vt 0.241740 0.024700 +vt 0.244370 0.024690 +vt 0.243290 0.070740 +vt 0.243160 0.079220 +vt 0.246070 0.070690 +vt 0.253710 0.070520 +vt 0.253440 0.079220 +vt 0.249890 0.070600 +vt 0.249630 0.079220 +vt 0.222530 0.087870 +vt 0.228700 0.087200 +vt 0.237490 0.093320 +vt 0.234870 0.086540 +vt 0.238710 0.089740 +vt 0.239930 0.086160 +vt 0.248720 0.092270 +vt 0.252450 0.098770 +vt 0.208000 0.100000 +vt 0.211240 0.096270 +vt 0.224360 0.094790 +vt 0.214490 0.092540 +vt 0.218510 0.090200 +vt 0.230220 0.099380 +vt 0.244110 0.018570 +vt 0.247800 0.024680 +vt 0.247400 0.018550 +vt 0.251240 0.024670 +vt 0.244280 0.014790 +vt 0.244460 0.011010 +vt 0.247510 0.014780 +vt 0.247630 0.011010 +vt 0.250740 0.014770 +vt 0.250690 0.018540 +vt 0.239540 0.014800 +vt 0.241910 0.014790 +vt 0.240060 0.011010 +vt 0.242260 0.011010 +vt 0.254490 0.018530 +vt 0.250800 0.011010 +vt 0.254700 0.014770 +vt 0.254920 0.011010 +vt 0.258670 0.014770 +vt 0.258300 0.018530 +vt 0.259040 0.011010 +vt 0.262170 0.011010 +vt 0.262260 0.014760 +vt 0.265310 0.011010 +vt 0.265860 0.014760 +vt 0.266410 0.018520 +vt 0.262350 0.018520 +vt 0.258790 0.024660 +vt 0.262780 0.024650 +vt 0.266780 0.024650 +vt 0.255020 0.024660 +vt 0.260620 0.079220 +vt 0.257030 0.079220 +vt 0.260770 0.070480 +vt 0.257240 0.070500 +vt 0.266470 0.079220 +vt 0.263540 0.079220 +vt 0.263870 0.070480 +vt 0.266980 0.070480 +vt 0.244990 0.085780 +vt 0.248400 0.085760 +vt 0.251810 0.085740 +vt 0.252130 0.092250 +vt 0.249750 0.090090 +vt 0.199320 0.061730 +vt 0.200330 0.070470 +vt 0.196900 0.061720 +vt 0.201340 0.079220 +vt 0.198040 0.070470 +vt 0.199190 0.079220 +vt 0.195760 0.070470 +vt 0.194480 0.061720 +vt 0.247130 0.130110 +vt 0.249790 0.121360 +vt 0.249980 0.129880 +vt 0.252450 0.112620 +vt 0.250800 0.124130 +vt 0.252640 0.121140 +vt 0.194080 0.018480 +vt 0.194780 0.014740 +vt 0.198230 0.014740 +vt 0.195490 0.011010 +vt 0.198870 0.011010 +vt 0.202250 0.011010 +vt 0.197600 0.018480 +vt 0.201690 0.014740 +vt 0.194390 0.024630 +vt 0.201130 0.018480 +vt 0.197740 0.024630 +vt 0.201100 0.024630 +vt 0.197890 0.030780 +vt 0.194700 0.030780 +vt 0.197390 0.046250 +vt 0.201080 0.030780 +vt 0.200200 0.046250 +vt 0.194590 0.046250 +vt 0.224500 0.011010 +vt 0.227430 0.011010 +vt 0.224810 0.014790 +vt 0.230370 0.011010 +vt 0.227580 0.014800 +vt 0.230350 0.014820 +vt 0.230330 0.018630 +vt 0.225120 0.018570 +vt 0.219900 0.011010 +vt 0.222200 0.011010 +vt 0.219810 0.014780 +vt 0.222310 0.014780 +vt 0.222420 0.018560 +vt 0.219720 0.018550 +vt 0.230210 0.111900 +vt 0.230210 0.105640 +vt 0.207970 0.111180 +vt 0.207980 0.105590 +vt 0.252450 0.105690 +vt 0.236190 0.130610 +vt 0.244320 0.121610 +vt 0.241660 0.130360 +vt 0.245250 0.124440 +vt 0.205290 0.061770 +vt 0.206410 0.070490 +vt 0.202300 0.061750 +vt 0.207540 0.079220 +vt 0.203370 0.070480 +vt 0.204440 0.079220 +vt 0.204670 0.030780 +vt 0.208270 0.030790 +vt 0.203490 0.046260 +vt 0.206780 0.046280 +vt 0.204810 0.024630 +vt 0.204950 0.018480 +vt 0.208780 0.018490 +vt 0.208520 0.024640 +vt 0.205350 0.014740 +vt 0.205740 0.011010 +vt 0.209240 0.011010 +vt 0.209010 0.014750 +vt 0.211710 0.014750 +vt 0.211900 0.011010 +vt 0.214560 0.011010 +vt 0.211530 0.018500 +vt 0.214420 0.014760 +vt 0.217000 0.018530 +vt 0.214290 0.018510 +vt 0.217110 0.014770 +vt 0.217230 0.011010 +vt 0.214070 0.024650 +vt 0.216830 0.024660 +vt 0.219600 0.024680 +vt 0.216660 0.030800 +vt 0.213850 0.030790 +vt 0.211290 0.024640 +vt 0.211060 0.030790 +vt 0.212390 0.046370 +vt 0.219480 0.030810 +vt 0.215190 0.046440 +vt 0.217980 0.046510 +vt 0.213710 0.062080 +vt 0.210940 0.061950 +vt 0.209580 0.046320 +vt 0.208110 0.061860 +vt 0.218650 0.079220 +vt 0.216000 0.079220 +vt 0.214860 0.070650 +vt 0.213360 0.079220 +vt 0.212150 0.070580 +vt 0.217570 0.070710 +vt 0.216490 0.062210 +vt 0.209280 0.070540 +vt 0.210450 0.079220 +vt 0.231000 0.129760 +vt 0.233340 0.124270 +vt 0.225810 0.128920 +vt 0.222360 0.126920 +vt 0.235680 0.118770 +vt 0.219710 0.062310 +vt 0.222930 0.062410 +vt 0.220680 0.070760 +vt 0.223790 0.070810 +vt 0.224650 0.079220 +vt 0.221650 0.079220 +vt 0.227450 0.079220 +vt 0.226720 0.070850 +vt 0.225990 0.062480 +vt 0.218920 0.124930 +vt 0.214850 0.122360 +vt 0.222530 0.117130 +vt 0.210790 0.119800 +vt 0.209380 0.115490 +vt 0.222270 0.030810 +vt 0.225070 0.030810 +vt 0.220990 0.046560 +vt 0.224000 0.046610 +vt 0.222340 0.024680 +vt 0.225090 0.024690 +vt 0.227720 0.018600 +vt 0.227620 0.024710 +vt 0.230160 0.024730 +vt 0.227530 0.030820 +vt 0.235260 0.014810 +vt 0.237400 0.014810 +vt 0.235580 0.011010 +vt 0.237820 0.011010 +vt 0.232970 0.011010 +vt 0.232800 0.014810 +vt 0.232630 0.018620 +vt 0.232520 0.024720 +vt 0.226760 0.046650 +vt 0.490500 0.533780 +vt 0.490430 0.533610 +vt 0.495240 0.533640 +vt 0.495210 0.533490 +vt 0.486160 0.534170 +vt 0.481890 0.534730 +vt 0.486210 0.534320 +vt 0.476000 0.535110 +vt 0.481930 0.534860 +vt 0.470120 0.535500 +vt 0.476020 0.535260 +vt 0.461400 0.536070 +vt 0.461130 0.535940 +vt 0.465760 0.535870 +vt 0.465620 0.535720 +vt 0.470120 0.535670 +vt 0.456030 0.536880 +vt 0.455690 0.536750 +vt 0.458410 0.536340 +vt 0.458710 0.536470 +vt 0.455080 0.537380 +vt 0.454500 0.537510 +vt 0.455090 0.537130 +vt 0.455550 0.537130 +vt 0.456540 0.537610 +vt 0.456370 0.537780 +vt 0.455430 0.537640 +vt 0.455810 0.537490 +vt 0.464850 0.536460 +vt 0.464880 0.536660 +vt 0.460620 0.537220 +vt 0.460690 0.537030 +vt 0.477470 0.535930 +vt 0.471170 0.536300 +vt 0.471180 0.536040 +vt 0.477510 0.535630 +vt 0.485480 0.534850 +vt 0.485610 0.535020 +vt 0.481540 0.535470 +vt 0.481490 0.535240 +vt 0.492450 0.534030 +vt 0.492450 0.534130 +vt 0.489030 0.534570 +vt 0.488960 0.534440 +vt 0.496220 0.534000 +vt 0.496220 0.533920 +vt 0.499990 0.533810 +vt 0.734140 0.628540 +vt 0.735440 0.629120 +vt 0.734090 0.627100 +vt 0.736120 0.630130 +vt 0.738060 0.630290 +vt 0.742880 0.633740 +vt 0.740990 0.633510 +vt 0.741080 0.631510 +vt 0.739110 0.633290 +vt 0.738580 0.631790 +vt 0.743570 0.631240 +vt 0.741160 0.629510 +vt 0.736650 0.631630 +vt 0.739870 0.635360 +vt 0.737980 0.633570 +vt 0.737120 0.631180 +vt 0.741710 0.635380 +vt 0.743540 0.635400 +vt 0.744960 0.633160 +vt 0.744270 0.628740 +vt 0.746380 0.630930 +vt 0.738330 0.614530 +vt 0.739890 0.616340 +vt 0.738050 0.615980 +vt 0.741460 0.618150 +vt 0.740840 0.619350 +vt 0.739440 0.617660 +vt 0.738990 0.618990 +vt 0.737770 0.617430 +vt 0.732340 0.618120 +vt 0.732050 0.616770 +vt 0.733830 0.618140 +vt 0.731770 0.615420 +vt 0.733140 0.616640 +vt 0.732450 0.615150 +vt 0.734220 0.616520 +vt 0.735320 0.618160 +vt 0.742550 0.625710 +vt 0.741660 0.625090 +vt 0.741250 0.622220 +vt 0.740780 0.624480 +vt 0.740500 0.622520 +vt 0.740220 0.620560 +vt 0.742000 0.621930 +vt 0.743410 0.627220 +vt 0.742980 0.622260 +vt 0.742550 0.617290 +vt 0.743960 0.622590 +vt 0.743650 0.616440 +vt 0.739210 0.627680 +vt 0.740880 0.626690 +vt 0.738630 0.628980 +vt 0.741020 0.628100 +vt 0.738610 0.624610 +vt 0.739690 0.624540 +vt 0.740280 0.625620 +vt 0.738910 0.626140 +vt 0.739160 0.622600 +vt 0.737820 0.622680 +vt 0.737030 0.620760 +vt 0.738620 0.620660 +vt 0.737600 0.624810 +vt 0.736590 0.622990 +vt 0.736590 0.625020 +vt 0.735360 0.623310 +vt 0.734130 0.621600 +vt 0.735580 0.621180 +vt 0.734700 0.619660 +vt 0.733230 0.619860 +vt 0.736170 0.619460 +vt 0.737580 0.619220 +vt 0.736540 0.617790 +vt 0.728880 0.609740 +vt 0.730890 0.609890 +vt 0.731790 0.611070 +vt 0.732900 0.610040 +vt 0.733570 0.611300 +vt 0.734240 0.612570 +vt 0.730020 0.610840 +vt 0.731160 0.611940 +vt 0.725630 0.609520 +vt 0.727250 0.609630 +vt 0.727430 0.611080 +vt 0.728720 0.610960 +vt 0.730200 0.612290 +vt 0.729240 0.612640 +vt 0.729410 0.609140 +vt 0.731570 0.608650 +vt 0.727930 0.608390 +vt 0.728550 0.605950 +vt 0.730240 0.607270 +vt 0.726240 0.607530 +vt 0.723930 0.609110 +vt 0.746140 0.623820 +vt 0.745900 0.616710 +vt 0.738960 0.611930 +vt 0.741300 0.614180 +vt 0.740600 0.615260 +vt 0.738640 0.613230 +vt 0.743210 0.614010 +vt 0.740530 0.611320 +vt 0.733890 0.607120 +vt 0.736170 0.608990 +vt 0.735930 0.610980 +vt 0.736050 0.609980 +vt 0.736100 0.612260 +vt 0.736280 0.613550 +vt 0.736350 0.614830 +vt 0.736420 0.616110 +vt 0.734660 0.613680 +vt 0.735080 0.614800 +vt 0.733130 0.614880 +vt 0.734100 0.614840 +vt 0.735320 0.616310 +vt 0.732700 0.612250 +vt 0.733400 0.613540 +vt 0.732140 0.613410 +vt 0.730500 0.614030 +vt 0.731320 0.613720 +vt 0.729470 0.614510 +vt 0.730760 0.615640 +vt 0.729700 0.616390 +vt 0.733000 0.621650 +vt 0.732010 0.619450 +vt 0.731880 0.621710 +vt 0.730790 0.619050 +vt 0.731020 0.617250 +vt 0.729060 0.620790 +vt 0.731570 0.623940 +vt 0.727890 0.620610 +vt 0.731010 0.624570 +vt 0.726970 0.614930 +vt 0.725530 0.614350 +vt 0.724730 0.611730 +vt 0.726300 0.612220 +vt 0.727880 0.613370 +vt 0.728330 0.615660 +vt 0.729400 0.618450 +vt 0.730470 0.621250 +vt 0.728010 0.617860 +vt 0.734690 0.623690 +vt 0.736380 0.625730 +vt 0.734020 0.624080 +vt 0.736170 0.626450 +vt 0.737690 0.627060 +vt 0.737640 0.625940 +vt 0.735130 0.626770 +vt 0.736070 0.628690 +vt 0.736880 0.627880 +vt 0.732800 0.624010 +vt 0.726710 0.617480 +vt 0.265890 0.627100 +vt 0.265840 0.628540 +vt 0.264530 0.629120 +vt 0.263850 0.630130 +vt 0.263900 0.628690 +vt 0.261920 0.630290 +vt 0.261390 0.631790 +vt 0.258810 0.629510 +vt 0.260870 0.633290 +vt 0.258900 0.631510 +vt 0.258980 0.633510 +vt 0.257100 0.633740 +vt 0.256400 0.631240 +vt 0.263330 0.631630 +vt 0.262000 0.633570 +vt 0.260100 0.635360 +vt 0.262860 0.631180 +vt 0.258270 0.635380 +vt 0.256430 0.635400 +vt 0.255710 0.628740 +vt 0.253590 0.630930 +vt 0.255010 0.633160 +vt 0.259760 0.620560 +vt 0.259140 0.619350 +vt 0.260530 0.617660 +vt 0.258520 0.618150 +vt 0.260080 0.616340 +vt 0.261930 0.615980 +vt 0.260980 0.618990 +vt 0.266850 0.614880 +vt 0.267530 0.615150 +vt 0.266840 0.616640 +vt 0.268210 0.615420 +vt 0.267920 0.616770 +vt 0.267640 0.618120 +vt 0.265750 0.616520 +vt 0.266150 0.618140 +vt 0.259480 0.622520 +vt 0.259200 0.624480 +vt 0.258310 0.625090 +vt 0.258720 0.622220 +vt 0.257970 0.621930 +vt 0.257420 0.617290 +vt 0.257430 0.625710 +vt 0.256990 0.622260 +vt 0.256570 0.627220 +vt 0.256020 0.622590 +vt 0.258950 0.628100 +vt 0.259100 0.626690 +vt 0.260770 0.627680 +vt 0.259690 0.625620 +vt 0.260280 0.624540 +vt 0.261070 0.626140 +vt 0.262950 0.620760 +vt 0.262160 0.622680 +vt 0.261350 0.620660 +vt 0.261370 0.624610 +vt 0.260820 0.622600 +vt 0.265850 0.621600 +vt 0.264620 0.623310 +vt 0.264400 0.621180 +vt 0.263390 0.625020 +vt 0.263390 0.622990 +vt 0.262380 0.624810 +vt 0.266740 0.619860 +vt 0.265270 0.619660 +vt 0.263800 0.619460 +vt 0.264660 0.618160 +vt 0.263430 0.617790 +vt 0.262390 0.619220 +vt 0.262210 0.617430 +vt 0.265740 0.612570 +vt 0.266410 0.611300 +vt 0.267280 0.612250 +vt 0.267080 0.610040 +vt 0.269090 0.609890 +vt 0.268180 0.611070 +vt 0.271100 0.609740 +vt 0.269960 0.610840 +vt 0.268820 0.611940 +vt 0.271250 0.610960 +vt 0.272720 0.609630 +vt 0.274350 0.609520 +vt 0.269780 0.612290 +vt 0.272540 0.611080 +vt 0.272040 0.608390 +vt 0.270560 0.609140 +vt 0.269740 0.607270 +vt 0.273730 0.607530 +vt 0.271430 0.605950 +vt 0.273120 0.604630 +vt 0.276040 0.609110 +vt 0.256330 0.616440 +vt 0.254080 0.616710 +vt 0.253830 0.623820 +vt 0.251830 0.616990 +vt 0.259380 0.615260 +vt 0.258670 0.614180 +vt 0.261330 0.613230 +vt 0.259440 0.611320 +vt 0.256760 0.614010 +vt 0.261020 0.611930 +vt 0.266080 0.607120 +vt 0.268410 0.608650 +vt 0.263920 0.609980 +vt 0.264050 0.610980 +vt 0.263800 0.608990 +vt 0.261650 0.614530 +vt 0.263690 0.613550 +vt 0.263870 0.612260 +vt 0.263620 0.614830 +vt 0.263550 0.616110 +vt 0.265320 0.613680 +vt 0.264900 0.614800 +vt 0.264650 0.616310 +vt 0.265870 0.614840 +vt 0.266570 0.613540 +vt 0.267830 0.613410 +vt 0.270740 0.612640 +vt 0.268650 0.613720 +vt 0.269470 0.614030 +vt 0.268960 0.617250 +vt 0.269210 0.615640 +vt 0.270510 0.614510 +vt 0.270280 0.616390 +vt 0.269190 0.619050 +vt 0.268100 0.621710 +vt 0.267960 0.619450 +vt 0.266970 0.621650 +vt 0.268960 0.624570 +vt 0.268400 0.623940 +vt 0.270920 0.620790 +vt 0.272090 0.620610 +vt 0.275240 0.611730 +vt 0.274440 0.614350 +vt 0.273010 0.614930 +vt 0.273680 0.612220 +vt 0.271640 0.615660 +vt 0.272090 0.613370 +vt 0.269510 0.621250 +vt 0.270570 0.618450 +vt 0.271960 0.617860 +vt 0.263810 0.626450 +vt 0.263600 0.625730 +vt 0.265950 0.624080 +vt 0.265280 0.623690 +vt 0.262330 0.625940 +vt 0.262290 0.627060 +vt 0.263090 0.627880 +vt 0.264850 0.626770 +vt 0.261340 0.628980 +vt 0.267180 0.624010 +vt 0.273260 0.617480 +vt 0.553650 0.718460 +vt 0.553890 0.715340 +vt 0.565100 0.718940 +vt 0.554140 0.712230 +vt 0.565170 0.715790 +vt 0.565240 0.712640 +vt 0.576340 0.713050 +vt 0.576440 0.716240 +vt 0.583410 0.712620 +vt 0.590480 0.712190 +vt 0.583680 0.715470 +vt 0.590920 0.714710 +vt 0.583960 0.718330 +vt 0.576550 0.719430 +vt 0.597050 0.709500 +vt 0.598280 0.706690 +vt 0.599910 0.707620 +vt 0.601540 0.708540 +vt 0.597770 0.710590 +vt 0.598500 0.711690 +vt 0.593760 0.710840 +vt 0.594350 0.712650 +vt 0.594930 0.714460 +vt 0.591370 0.717230 +vt 0.596310 0.708530 +vt 0.597240 0.706300 +vt 0.590170 0.710630 +vt 0.593240 0.709580 +vt 0.576290 0.711120 +vt 0.583230 0.710880 +vt 0.554370 0.710530 +vt 0.565330 0.710830 +vt 0.539780 0.702690 +vt 0.541050 0.704970 +vt 0.541260 0.706950 +vt 0.539900 0.705040 +vt 0.544600 0.710620 +vt 0.542310 0.709010 +vt 0.543300 0.708210 +vt 0.540030 0.707400 +vt 0.545340 0.709470 +vt 0.549370 0.711420 +vt 0.549850 0.710000 +vt 0.548910 0.715880 +vt 0.544180 0.713300 +vt 0.549140 0.713650 +vt 0.544390 0.711960 +vt 0.538900 0.705040 +vt 0.539030 0.707400 +vt 0.541100 0.710350 +vt 0.541710 0.709680 +vt 0.553770 0.720080 +vt 0.548790 0.717180 +vt 0.543820 0.714280 +vt 0.541890 0.711990 +vt 0.565120 0.720900 +vt 0.576470 0.721730 +vt 0.584000 0.720380 +vt 0.591530 0.719040 +vt 0.599140 0.712460 +vt 0.595340 0.715750 +vt 0.600950 0.710100 +vt 0.423640 0.713050 +vt 0.434740 0.712640 +vt 0.423530 0.716240 +vt 0.445840 0.712230 +vt 0.434810 0.715790 +vt 0.446080 0.715340 +vt 0.446330 0.718460 +vt 0.434880 0.718940 +vt 0.408600 0.717230 +vt 0.409050 0.714710 +vt 0.416010 0.718330 +vt 0.409500 0.712190 +vt 0.416570 0.712620 +vt 0.416290 0.715470 +vt 0.423430 0.719430 +vt 0.400060 0.707620 +vt 0.401690 0.706690 +vt 0.402200 0.710590 +vt 0.398430 0.708540 +vt 0.401470 0.711690 +vt 0.405620 0.712650 +vt 0.402930 0.709500 +vt 0.406210 0.710840 +vt 0.405030 0.714460 +vt 0.401790 0.704080 +vt 0.402730 0.706300 +vt 0.403670 0.708530 +vt 0.406740 0.709580 +vt 0.409810 0.710630 +vt 0.416740 0.710880 +vt 0.423680 0.711120 +vt 0.434640 0.710830 +vt 0.445610 0.710530 +vt 0.458720 0.706950 +vt 0.458930 0.704970 +vt 0.460070 0.705040 +vt 0.459950 0.707400 +vt 0.457660 0.709010 +vt 0.456680 0.708210 +vt 0.454640 0.709470 +vt 0.450120 0.710000 +vt 0.455380 0.710620 +vt 0.450610 0.711420 +vt 0.455580 0.711960 +vt 0.455790 0.713300 +vt 0.451060 0.715880 +vt 0.450830 0.713650 +vt 0.461070 0.705040 +vt 0.460940 0.707400 +vt 0.458260 0.709680 +vt 0.458860 0.710350 +vt 0.456150 0.714280 +vt 0.451170 0.717180 +vt 0.446200 0.720080 +vt 0.458080 0.711990 +vt 0.434850 0.720900 +vt 0.423510 0.721730 +vt 0.415970 0.720380 +vt 0.408440 0.719040 +vt 0.404630 0.715750 +vt 0.400830 0.712460 +vt 0.399020 0.710100 +vt 0.521090 0.604780 +vt 0.521380 0.602120 +vt 0.522500 0.604620 +vt 0.521670 0.599470 +vt 0.522740 0.601620 +vt 0.522990 0.598610 +vt 0.519850 0.598170 +vt 0.520530 0.597150 +vt 0.518040 0.596880 +vt 0.518080 0.595690 +vt 0.511790 0.605400 +vt 0.511000 0.602700 +vt 0.511420 0.601070 +vt 0.512660 0.603950 +vt 0.512020 0.596580 +vt 0.512850 0.596270 +vt 0.513670 0.595960 +vt 0.513760 0.598520 +vt 0.513270 0.599180 +vt 0.514250 0.597870 +vt 0.515870 0.595820 +vt 0.516140 0.597370 +vt 0.518560 0.608150 +vt 0.519820 0.606460 +vt 0.519370 0.609410 +vt 0.520940 0.607010 +vt 0.515480 0.608090 +vt 0.517020 0.608120 +vt 0.517420 0.609570 +vt 0.515460 0.609730 +vt 0.512670 0.600710 +vt 0.511430 0.598230 +vt 0.512970 0.599940 +vt 0.511730 0.597400 +vt 0.511420 0.599650 +vt 0.512660 0.602330 +vt 0.514070 0.606020 +vt 0.513630 0.607560 +vt 0.515930 0.600760 +vt 0.516630 0.600570 +vt 0.516210 0.601200 +vt 0.517340 0.600390 +vt 0.517240 0.600930 +vt 0.516720 0.601060 +vt 0.517150 0.601470 +vt 0.516490 0.601650 +vt 0.516700 0.603430 +vt 0.516540 0.603980 +vt 0.516160 0.603420 +vt 0.516390 0.604540 +vt 0.515860 0.603770 +vt 0.515340 0.603010 +vt 0.516450 0.603070 +vt 0.515770 0.602860 +vt 0.518470 0.603310 +vt 0.518000 0.603930 +vt 0.517730 0.603540 +vt 0.517530 0.604560 +vt 0.517380 0.604000 +vt 0.517240 0.603440 +vt 0.518070 0.603080 +vt 0.517460 0.603140 +vt 0.516970 0.603430 +vt 0.516960 0.603990 +vt 0.516960 0.604550 +vt 0.517460 0.601700 +vt 0.517730 0.601280 +vt 0.518010 0.600870 +vt 0.518230 0.601640 +vt 0.517780 0.601930 +vt 0.518680 0.601350 +vt 0.518570 0.602330 +vt 0.518150 0.602360 +vt 0.517730 0.602390 +vt 0.515570 0.601240 +vt 0.515750 0.601000 +vt 0.515940 0.601560 +vt 0.516070 0.601380 +vt 0.516400 0.601760 +vt 0.516320 0.601880 +vt 0.515350 0.601810 +vt 0.515460 0.601520 +vt 0.515780 0.601970 +vt 0.515860 0.601760 +vt 0.516260 0.602010 +vt 0.516210 0.602140 +vt 0.516210 0.602710 +vt 0.516210 0.602420 +vt 0.515770 0.602410 +vt 0.515340 0.602410 +vt 0.517680 0.602850 +vt 0.516940 0.602780 +vt 0.516950 0.603100 +vt 0.516990 0.602030 +vt 0.516970 0.602400 +vt 0.516700 0.601900 +vt 0.517130 0.601790 +vt 0.516820 0.601560 +vt 0.517140 0.601680 +vt 0.517560 0.599230 +vt 0.517780 0.598070 +vt 0.518600 0.599970 +vt 0.519200 0.599080 +vt 0.520630 0.600100 +vt 0.519650 0.600720 +vt 0.517910 0.597470 +vt 0.519530 0.598630 +vt 0.515370 0.599800 +vt 0.514810 0.598850 +vt 0.516460 0.599510 +vt 0.516290 0.598460 +vt 0.514530 0.598360 +vt 0.516220 0.597910 +vt 0.514800 0.600550 +vt 0.515080 0.600180 +vt 0.514040 0.599870 +vt 0.514420 0.599360 +vt 0.513650 0.599520 +vt 0.514090 0.598940 +vt 0.514460 0.601440 +vt 0.514630 0.600990 +vt 0.513570 0.601070 +vt 0.513800 0.600470 +vt 0.513120 0.600890 +vt 0.513380 0.600200 +vt 0.514450 0.603310 +vt 0.513560 0.603620 +vt 0.514450 0.602370 +vt 0.513560 0.602340 +vt 0.513110 0.603780 +vt 0.513110 0.602330 +vt 0.516080 0.605700 +vt 0.515260 0.604510 +vt 0.515770 0.606870 +vt 0.514660 0.605240 +vt 0.515620 0.607480 +vt 0.514360 0.605630 +vt 0.517860 0.605730 +vt 0.516970 0.605720 +vt 0.518190 0.606910 +vt 0.516980 0.606890 +vt 0.518370 0.607530 +vt 0.517000 0.607500 +vt 0.519320 0.603790 +vt 0.520180 0.604270 +vt 0.518590 0.604760 +vt 0.519180 0.605590 +vt 0.520630 0.604520 +vt 0.519500 0.606020 +vt 0.519490 0.602250 +vt 0.520400 0.602180 +vt 0.521150 0.599780 +vt 0.520890 0.602150 +vt 0.476990 0.598610 +vt 0.477230 0.601620 +vt 0.478310 0.599470 +vt 0.478600 0.602120 +vt 0.478890 0.604780 +vt 0.477470 0.604620 +vt 0.481940 0.596880 +vt 0.480120 0.598170 +vt 0.481900 0.595690 +vt 0.479440 0.597150 +vt 0.488970 0.602700 +vt 0.488560 0.601070 +vt 0.488180 0.605400 +vt 0.485730 0.597870 +vt 0.486300 0.595960 +vt 0.487130 0.596270 +vt 0.486220 0.598520 +vt 0.487950 0.596580 +vt 0.484100 0.595820 +vt 0.483830 0.597370 +vt 0.479040 0.607010 +vt 0.480150 0.606460 +vt 0.481420 0.608150 +vt 0.480600 0.609410 +vt 0.482560 0.609570 +vt 0.482960 0.608120 +vt 0.484510 0.609730 +vt 0.488250 0.597400 +vt 0.488540 0.598230 +vt 0.487010 0.599940 +vt 0.486710 0.599180 +vt 0.487310 0.600710 +vt 0.487310 0.602330 +vt 0.488550 0.599650 +vt 0.487320 0.603950 +vt 0.484500 0.608090 +vt 0.486350 0.607560 +vt 0.485910 0.606020 +vt 0.482830 0.601470 +vt 0.482730 0.600930 +vt 0.483250 0.601060 +vt 0.482640 0.600390 +vt 0.483340 0.600570 +vt 0.483770 0.601200 +vt 0.483160 0.601560 +vt 0.484640 0.603010 +vt 0.484110 0.603770 +vt 0.484200 0.602860 +vt 0.483590 0.604540 +vt 0.483820 0.603420 +vt 0.483430 0.603980 +vt 0.483280 0.603430 +vt 0.483520 0.603070 +vt 0.482740 0.603440 +vt 0.482590 0.604000 +vt 0.482520 0.603140 +vt 0.482450 0.604560 +vt 0.482250 0.603540 +vt 0.481980 0.603930 +vt 0.481900 0.603080 +vt 0.483020 0.604550 +vt 0.483010 0.603990 +vt 0.481300 0.601350 +vt 0.481970 0.600870 +vt 0.481750 0.601640 +vt 0.482240 0.601280 +vt 0.482510 0.601700 +vt 0.482300 0.602850 +vt 0.481820 0.602360 +vt 0.481510 0.603310 +vt 0.481400 0.602330 +vt 0.482250 0.602390 +vt 0.483490 0.601650 +vt 0.483900 0.601380 +vt 0.484050 0.600760 +vt 0.484230 0.601000 +vt 0.484410 0.601240 +vt 0.483570 0.601760 +vt 0.484030 0.601560 +vt 0.483660 0.601880 +vt 0.483710 0.602010 +vt 0.484520 0.601520 +vt 0.484110 0.601760 +vt 0.484630 0.601810 +vt 0.484200 0.601970 +vt 0.484630 0.602410 +vt 0.484200 0.602410 +vt 0.483770 0.602710 +vt 0.483770 0.602420 +vt 0.483010 0.603430 +vt 0.483020 0.603100 +vt 0.483030 0.602780 +vt 0.482200 0.601930 +vt 0.483010 0.602400 +vt 0.482980 0.602030 +vt 0.483770 0.602140 +vt 0.482840 0.601790 +vt 0.483280 0.601900 +vt 0.482840 0.601680 +vt 0.479350 0.600100 +vt 0.480770 0.599080 +vt 0.480320 0.600720 +vt 0.482200 0.598070 +vt 0.481370 0.599970 +vt 0.482420 0.599230 +vt 0.478830 0.599780 +vt 0.480450 0.598630 +vt 0.482070 0.597470 +vt 0.483680 0.598460 +vt 0.483510 0.599510 +vt 0.485170 0.598850 +vt 0.484610 0.599800 +vt 0.483760 0.597910 +vt 0.485450 0.598360 +vt 0.485550 0.599360 +vt 0.484890 0.600180 +vt 0.485940 0.599870 +vt 0.485170 0.600550 +vt 0.485880 0.598940 +vt 0.486320 0.599520 +vt 0.486170 0.600470 +vt 0.486410 0.601070 +vt 0.485340 0.600990 +vt 0.485520 0.601440 +vt 0.486590 0.600200 +vt 0.486860 0.600890 +vt 0.486410 0.602340 +vt 0.486420 0.603620 +vt 0.485530 0.603310 +vt 0.485520 0.602370 +vt 0.486860 0.602330 +vt 0.486870 0.603780 +vt 0.485310 0.605240 +vt 0.484210 0.606870 +vt 0.484710 0.604510 +vt 0.483900 0.605700 +vt 0.485610 0.605630 +vt 0.484350 0.607480 +vt 0.483000 0.606890 +vt 0.481790 0.606910 +vt 0.483010 0.605720 +vt 0.482120 0.605730 +vt 0.482980 0.607500 +vt 0.481600 0.607530 +vt 0.480790 0.605590 +vt 0.479800 0.604270 +vt 0.480650 0.603790 +vt 0.481380 0.604760 +vt 0.480470 0.606020 +vt 0.479340 0.604520 +vt 0.479570 0.602180 +vt 0.480490 0.602250 +vt 0.479080 0.602150 +vt 0.780323 0.014786 +vt 0.780419 0.011037 +vt 0.782740 0.011010 +vt 0.838610 0.748170 +vt 0.966590 0.881980 +vt 0.991780 0.053160 +vt 0.204470 0.993540 +vt 0.037140 0.032590 +vt 0.396280 0.093070 +vt 0.470210 0.009300 +vt 0.487130 0.510760 +vt 0.794930 0.593070 +vt 0.248710 0.667630 +vt 0.249960 0.659600 +vt 0.561620 0.702100 +vt 0.550970 0.705410 +vt 0.547840 0.705050 +vt 0.749990 0.129880 +vt 0.805390 0.046250 +vt 0.747520 0.105690 +vt 0.758310 0.130360 +vt 0.499990 0.533500 +vt 0.441740 0.702220 +vt 0.411390 0.704580 +vt 0.267500 0.061750 +vt 0.245830 0.079220 +vt 0.197040 0.079220 +vt 0.252830 0.129660 +vn 0.916200 0.213700 -0.339000 +vn 0.904900 0.143000 -0.400900 +vn 0.928300 0.113100 -0.354200 +vn 0.893900 0.111100 -0.434200 +vn 0.901600 0.076800 -0.425700 +vn 0.910300 0.033100 -0.412700 +vn 0.948500 0.188500 -0.254600 +vn 0.943200 0.072800 -0.324300 +vn 0.739400 0.586500 0.330700 +vn 0.709400 0.651600 0.268700 +vn 0.633400 0.710600 0.306400 +vn 0.677300 0.702500 0.218500 +vn 0.616900 0.753800 0.226500 +vn 0.557100 0.795900 0.236900 +vn 0.667500 0.642200 0.376900 +vn 0.568100 0.755700 0.325800 +vn 0.531200 0.818200 -0.219700 +vn 0.478900 0.863300 -0.159300 +vn 0.585000 0.808700 -0.061500 +vn 0.443700 0.888000 -0.120600 +vn 0.540800 0.840100 -0.041200 +vn 0.462100 0.886600 -0.018200 +vn 0.545400 0.835100 0.071900 +vn 0.591600 0.804900 0.046800 +vn 0.569100 0.810700 0.137300 +vn 0.623200 0.772500 0.122200 +vn 0.704000 0.696400 0.139500 +vn 0.649700 0.759500 0.033100 +vn 0.733700 0.678000 0.045400 +vn 0.756500 0.652500 -0.044700 +vn 0.661100 0.748000 -0.058300 +vn 0.766700 0.619500 -0.168400 +vn 0.657700 0.727900 -0.193900 +vn 0.437600 0.860700 0.260200 +vn 0.506600 0.825500 0.248700 +vn 0.450600 0.873100 0.186300 +vn 0.520900 0.838300 0.160800 +vn 0.467900 0.878100 0.099800 +vn 0.254700 0.925900 0.278800 +vn 0.350500 0.896600 0.270700 +vn 0.247500 0.946000 0.209500 +vn 0.354300 0.912700 0.203700 +vn 0.351000 0.929700 0.111800 +vn 0.229600 0.967600 0.104700 +vn -0.015200 0.958300 0.285500 +vn 0.127200 0.950400 0.283800 +vn -0.021600 0.978500 0.205100 +vn 0.118600 0.970700 0.209100 +vn 0.105000 0.990200 0.091700 +vn -0.025000 0.996200 0.083400 +vn -0.021000 0.877200 0.479800 +vn -0.024100 0.822400 0.568400 +vn 0.131700 0.817900 0.560100 +vn -0.022200 0.764800 0.643900 +vn 0.133200 0.756100 0.640700 +vn 0.269600 0.737300 0.619400 +vn 0.132500 0.869700 0.475500 +vn 0.265700 0.798000 0.541000 +vn -0.017600 0.928100 0.372000 +vn 0.263100 0.848500 0.459200 +vn 0.130800 0.919800 0.369900 +vn 0.259600 0.895400 0.361800 +vn 0.984200 -0.090200 0.152600 +vn 0.971900 -0.179800 0.152100 +vn 0.993500 -0.103800 0.047000 +vn 0.908000 -0.404200 0.110700 +vn 0.985700 -0.162000 0.046700 +vn 0.926500 -0.370300 0.066000 +vn 0.986700 -0.145000 -0.073200 +vn 0.990100 -0.134700 -0.040700 +vn 0.982900 -0.038800 0.180200 +vn 0.999000 -0.027600 -0.035300 +vn 0.982300 -0.044900 0.181800 +vn 0.975100 -0.015600 -0.221200 +vn 0.998700 -0.038700 -0.033100 +vn 0.971700 -0.039400 -0.233100 +vn 0.997900 -0.064500 -0.004200 +vn 0.982400 -0.068400 0.173900 +vn 0.938700 0.000700 -0.344700 +vn 0.922500 -0.032400 -0.384700 +vn 0.878600 -0.003600 -0.477600 +vn 0.910200 -0.082600 -0.405900 +vn 0.971500 -0.077100 -0.224000 +vn 0.973200 -0.110500 -0.201700 +vn 0.851300 -0.069000 -0.520100 +vn 0.906400 -0.139200 -0.398900 +vn 0.834500 -0.169800 -0.524200 +vn 0.914400 -0.187400 -0.358800 +vn 0.977200 -0.129400 -0.168200 +vn 0.995500 -0.089900 0.029200 +vn 0.993100 -0.100900 0.059800 +vn 0.983700 -0.084600 0.158500 +vn 0.847600 -0.085300 0.523700 +vn 0.924100 -0.056600 0.377900 +vn 0.892100 -0.132200 0.432100 +vn 0.942200 -0.077600 0.325900 +vn 0.964900 -0.123800 0.231600 +vn 0.984000 -0.129000 0.123000 +vn 0.975000 -0.209400 0.074800 +vn 0.935100 -0.243100 0.258000 +vn 0.947700 -0.315600 0.046800 +vn 0.982600 -0.171600 0.071000 +vn 0.974200 -0.180100 -0.136000 +vn 0.833600 -0.267800 -0.483100 +vn 0.923500 -0.242400 -0.297300 +vn 0.842300 -0.340500 -0.417800 +vn 0.923000 -0.300900 -0.240000 +vn 0.952200 -0.277600 -0.127300 +vn 0.850700 -0.389000 -0.353600 +vn 0.867800 -0.393400 -0.303500 +vn 0.924700 -0.322900 -0.201700 +vn 0.892200 -0.364300 -0.266800 +vn 0.933500 -0.311000 -0.178200 +vn 0.938300 -0.295300 -0.180200 +vn 0.936300 -0.302000 -0.179400 +vn 0.939200 -0.251800 -0.233600 +vn 0.915700 -0.317800 -0.245900 +vn 0.851300 -0.363800 -0.378100 +vn 0.813100 -0.434400 -0.387600 +vn 0.729500 -0.499400 -0.467400 +vn 0.879900 -0.270900 -0.390300 +vn 0.797800 -0.294300 -0.526200 +vn 0.975900 -0.180400 -0.122800 +vn 0.952600 -0.254600 -0.166700 +vn 0.947100 -0.280400 -0.156300 +vn 0.966900 -0.224700 -0.120800 +vn 0.991400 -0.130700 0.008800 +vn 0.990400 -0.127900 -0.053000 +vn 0.982500 -0.170000 -0.076500 +vn 0.989100 -0.141300 -0.040900 +vn 0.960800 -0.159400 -0.226700 +vn 0.907600 0.235700 -0.347400 +vn 0.937700 0.273900 -0.213900 +vn 0.982000 0.111400 -0.152500 +vn 0.947700 0.306500 -0.089100 +vn 0.991800 0.126000 -0.023200 +vn 0.998500 -0.005500 0.054600 +vn 0.950700 0.083700 -0.298500 +vn 0.997400 -0.015800 -0.070200 +vn 0.770600 0.491900 0.405200 +vn 0.835400 0.424000 0.349800 +vn 0.797100 0.418600 0.435300 +vn 0.852300 0.324800 0.410000 +vn 0.900900 0.220300 0.374000 +vn 0.813400 0.522700 0.255200 +vn 0.893500 0.341500 0.291500 +vn 0.893500 0.419200 0.160900 +vn 0.967200 0.184100 0.175100 +vn 0.933800 0.355900 0.036500 +vn 0.976100 -0.006800 0.217400 +vn 0.984200 0.151100 0.092500 +vn 0.988900 -0.008800 0.148600 +vn 0.863500 0.485700 -0.135700 +vn 0.852500 0.522700 -0.011400 +vn 0.824200 0.558300 0.095300 +vn 0.777900 0.597500 0.194500 +vn 0.949300 0.091000 0.301000 +vn 0.943300 0.212900 0.254800 +vn 0.812500 -0.052700 -0.580500 +vn 0.802900 0.028900 -0.595400 +vn 0.899800 -0.039500 -0.434500 +vn 0.776200 0.155200 -0.611100 +vn 0.887200 0.052600 -0.458400 +vn 0.851600 0.191000 -0.488200 +vn 0.568800 -0.092700 -0.817200 +vn 0.567500 -0.020600 -0.823100 +vn 0.707900 -0.069400 -0.702900 +vn 0.548700 0.113400 -0.828300 +vn 0.697500 0.003000 -0.716600 +vn 0.675100 0.131600 -0.725900 +vn 0.275800 0.105500 -0.955400 +vn 0.415800 0.103600 -0.903600 +vn 0.429900 -0.035500 -0.902200 +vn 0.288000 -0.040400 -0.956800 +vn 0.420900 -0.125000 -0.898500 +vn 0.271900 0.892600 -0.359700 +vn 0.298000 0.827800 -0.475400 +vn 0.130400 0.911200 -0.390800 +vn 0.313600 0.726300 -0.611600 +vn 0.133000 0.852700 -0.505200 +vn 0.134100 0.746000 -0.652300 +vn -0.024300 0.849200 -0.527500 +vn -0.009200 0.912200 -0.409600 +vn -0.014400 0.978100 -0.207500 +vn 0.112100 0.973200 -0.200800 +vn 0.126500 0.944000 -0.304600 +vn 0.236000 0.954100 -0.184600 +vn 0.255000 0.926400 -0.277100 +vn -0.007600 0.949900 -0.312600 +vn -0.019900 0.997100 -0.073000 +vn 0.100000 0.993100 -0.061600 +vn 0.220500 0.974400 -0.043400 +vn 0.343100 0.939000 -0.022900 +vn 0.352500 0.922300 -0.158500 +vn 0.377900 0.895800 -0.233900 +vn 0.407900 0.858700 -0.310300 +vn 0.274300 0.457300 -0.846000 +vn 0.399600 0.458100 -0.794000 +vn 0.397200 0.287000 -0.871700 +vn 0.505900 0.458100 -0.730900 +vn 0.519600 0.290700 -0.803400 +vn 0.265900 0.287100 -0.920200 +vn 0.534000 0.674200 -0.510100 +vn 0.518100 0.590000 -0.619300 +vn 0.438400 0.704200 -0.558500 +vn 0.420700 0.601000 -0.679600 +vn 0.297600 0.604100 -0.739200 +vn 0.605900 0.445900 -0.658800 +vn 0.634200 0.291500 -0.716100 +vn 0.679900 0.427300 -0.595900 +vn 0.727900 0.305700 -0.613800 +vn 0.755000 0.576500 -0.312500 +vn 0.730300 0.534200 -0.425700 +vn 0.650900 0.675000 -0.347400 +vn 0.638200 0.614100 -0.464400 +vn 0.538100 0.750800 -0.383000 +vn 0.822800 0.412000 -0.391600 +vn 0.851900 0.450100 -0.267700 +vn 0.785100 0.358400 -0.505100 +vn 0.703700 0.486600 -0.517700 +vn 0.617600 0.553300 -0.558900 +vn 0.432900 0.791400 -0.431500 +vn 0.128200 0.614300 -0.778600 +vn 0.127900 0.469200 -0.873800 +vn -0.043600 0.621500 -0.782200 +vn -0.040900 0.741700 -0.669400 +vn 0.132600 0.292500 -0.947000 +vn 0.137800 0.113200 -0.984000 +vn -0.001000 0.118100 -0.993000 +vn -0.029200 0.489800 -0.871300 +vn 0.245700 -0.423700 -0.871800 +vn 0.116200 -0.444600 -0.888200 +vn 0.138500 -0.306500 -0.941700 +vn -0.031000 -0.461500 -0.886600 +vn -0.015100 -0.320700 -0.947100 +vn -0.002100 -0.161900 -0.986800 +vn 0.269500 -0.295700 -0.916500 +vn 0.147100 -0.158700 -0.976300 +vn 0.283800 -0.149500 -0.947200 +vn 0.146500 -0.037100 -0.988500 +vn 0.002900 -0.032700 -0.999500 +vn 0.541600 -0.367600 -0.756000 +vn 0.379300 -0.399400 -0.834600 +vn 0.406500 -0.284600 -0.868200 +vn 0.566200 -0.253000 -0.784500 +vn 0.687500 -0.333800 -0.645000 +vn 0.709400 -0.195200 -0.677200 +vn 0.814000 -0.155300 -0.559800 +vn 0.897400 -0.145400 -0.416600 +vn 0.639200 -0.544500 -0.543100 +vn 0.670600 -0.416600 -0.613700 +vn 0.489000 -0.551900 -0.675500 +vn 0.514900 -0.423600 -0.745200 +vn 0.772600 -0.401900 -0.491500 +vn 0.456000 0.888200 -0.056800 +vn 0.387600 0.918000 0.083400 +vn 0.399700 0.865600 0.301700 +vn 0.299300 0.927400 0.224600 +vn 0.271700 0.889400 0.367600 +vn 0.225700 0.813200 0.536500 +vn 0.447400 0.848300 0.283300 +vn 0.279900 0.771300 0.571600 +vn 0.150200 0.803700 0.575800 +vn 0.167600 0.734600 0.657500 +vn 0.082700 0.797500 0.597600 +vn 0.111800 0.750700 0.651100 +vn 0.156500 0.655900 0.738500 +vn 0.175400 0.645800 0.743100 +vn 0.280200 0.593000 0.754900 +vn 0.305900 0.587100 0.749500 +vn 0.242100 0.717500 0.653100 +vn 0.287400 0.567100 0.771900 +vn 0.220300 0.670500 0.708400 +vn 0.112200 0.800900 0.588200 +vn 0.238100 0.722100 0.649500 +vn 0.162400 0.866700 0.471600 +vn 0.131100 0.721500 0.679900 +vn 0.211500 0.601800 0.770100 +vn 0.248600 0.552100 0.795800 +vn 0.182100 0.565000 0.804700 +vn 0.231500 0.414200 0.880200 +vn 0.410800 0.139700 0.901000 +vn 0.178900 0.511700 0.840400 +vn 0.540700 -0.058300 0.839200 +vn 0.363600 0.317900 0.875600 +vn 0.495600 0.173400 0.851100 +vn 0.340100 0.433600 0.834400 +vn 0.157100 0.542700 0.825100 +vn 0.250300 0.549900 0.796800 +vn 0.267000 0.577900 0.771200 +vn 0.292800 0.284500 0.912900 +vn 0.289700 0.583100 0.759000 +vn 0.298300 0.458500 0.837200 +vn 0.301700 0.565100 0.767900 +vn 0.306800 0.253300 0.917400 +vn 0.298700 0.039500 0.953500 +vn 0.236500 -0.343600 0.908900 +vn 0.265800 -0.001500 0.964000 +vn 0.271800 0.147800 0.951000 +vn 0.227500 0.502900 0.833800 +vn 0.260700 -0.133000 0.956200 +vn 0.191000 0.555700 0.809100 +vn 0.210700 0.576800 0.789300 +vn 0.172100 0.559100 0.811100 +vn 0.140300 0.559700 0.816700 +vn 0.309300 -0.539900 0.782800 +vn 0.402600 -0.640500 0.654000 +vn 0.385500 -0.238600 0.891300 +vn 0.509400 -0.400000 0.761900 +vn 0.369100 0.541000 0.755700 +vn 0.472800 0.340100 0.812900 +vn 0.497400 0.475600 0.725500 +vn 0.558100 0.620900 0.550500 +vn 0.189300 0.593900 0.782000 +vn 0.449900 0.680400 0.578500 +vn 0.151600 0.575300 0.803800 +vn 0.295000 0.716700 0.632000 +vn 0.298800 0.561400 0.771700 +vn 0.254700 0.574000 0.778200 +vn 0.292300 0.531900 0.794800 +vn 0.320500 0.555500 0.767200 +vn 0.296000 0.553500 0.778500 +vn 0.257600 -0.200900 0.945100 +vn 0.260500 0.102000 0.960100 +vn 0.228900 0.497400 0.836800 +vn 0.169300 0.052600 0.984200 +vn 0.177700 -0.300300 0.937100 +vn 0.212700 0.549100 0.808200 +vn 0.199200 0.584600 0.786500 +vn 0.130700 0.536100 0.834000 +vn 0.135200 0.479100 0.867300 +vn 0.103100 0.877100 0.469100 +vn 0.174800 0.708000 0.684300 +vn 0.117600 0.878500 0.462900 +vn 0.144500 0.693200 0.706100 +vn 0.140400 0.567100 0.811600 +vn 0.879400 0.384400 0.280900 +vn 0.880200 0.310800 0.358600 +vn 0.752700 0.451500 0.479100 +vn 0.909000 0.227000 0.349500 +vn 0.756100 0.354600 0.550000 +vn 0.803400 0.260200 0.535600 +vn 0.649900 0.348400 0.675400 +vn 0.540700 0.498900 0.677300 +vn 0.184900 0.560800 0.807000 +vn 0.196100 0.691500 0.695200 +vn 0.245400 0.830600 0.499900 +vn 0.217600 0.678400 0.701700 +vn 0.177000 0.597200 0.782300 +vn 0.108400 0.452300 -0.885300 +vn 0.196100 0.536400 -0.820900 +vn 0.247800 0.621400 -0.743300 +vn 0.262500 0.606500 -0.750500 +vn 0.336500 0.685000 -0.646200 +vn 0.405000 0.807400 -0.429000 +vn 0.130300 0.506800 -0.852100 +vn 0.259400 0.689900 -0.675900 +vn 0.223300 0.534200 -0.815300 +vn 0.303600 0.521800 -0.797200 +vn 0.410800 0.607700 -0.679700 +vn 0.311000 0.468400 -0.827000 +vn 0.462400 0.501100 -0.731500 +vn 0.404300 0.400700 -0.822200 +vn 0.607600 0.447800 -0.656000 +vn 0.555100 0.618000 -0.556800 +vn 0.819200 0.239700 -0.521100 +vn 0.804800 0.380100 -0.455800 +vn 0.727100 0.411700 -0.549400 +vn 0.765900 0.539100 -0.350500 +vn 0.674100 0.583700 -0.452600 +vn 0.750300 0.253700 -0.610400 +vn 0.872000 0.483000 -0.079200 +vn 0.913200 0.332200 -0.235900 +vn 0.946800 0.306200 -0.099100 +vn 0.972000 0.142300 -0.186800 +vn 0.889700 0.444200 0.105400 +vn 0.966200 0.255700 0.031200 +vn 0.647900 0.747600 -0.146000 +vn 0.665300 0.746600 -0.006400 +vn 0.547700 0.812300 -0.200500 +vn 0.660500 0.722200 0.205400 +vn 0.526500 0.850100 -0.010800 +vn 0.485400 0.834900 0.259400 +vn 0.413100 0.907100 -0.081200 +vn 0.538200 0.841100 -0.054100 +vn 0.526500 0.805500 0.271900 +vn 0.600300 0.752800 0.270000 +vn 0.600000 0.799000 -0.040700 +vn 0.447900 0.780900 -0.435400 +vn 0.450700 0.851500 -0.268100 +vn 0.542900 0.705300 -0.455800 +vn 0.533800 0.792500 -0.294900 +vn 0.592700 0.747800 -0.299300 +vn 0.601200 0.653500 -0.459900 +vn 0.344400 0.833000 -0.433100 +vn 0.299000 0.733400 -0.610500 +vn 0.265200 0.721400 -0.639700 +vn 0.241400 0.604300 -0.759300 +vn 0.191600 0.589600 -0.784600 +vn 0.153800 0.557300 -0.816000 +vn 0.333700 0.837300 -0.433200 +vn 0.621400 0.552600 -0.555400 +vn 0.646700 0.430600 -0.629600 +vn 0.551500 0.609200 -0.569900 +vn 0.554300 0.494800 -0.669300 +vn 0.402500 0.577300 -0.710400 +vn 0.666900 0.239000 -0.705700 +vn 0.659300 0.095800 -0.745800 +vn 0.533900 0.115200 -0.837700 +vn 0.542000 0.277600 -0.793200 +vn 0.334100 0.141200 -0.931900 +vn 0.359200 0.331000 -0.872600 +vn 0.250300 0.350500 -0.902500 +vn 0.218000 0.158100 -0.963100 +vn 0.151300 0.169800 -0.973800 +vn 0.306600 0.602700 -0.736800 +vn 0.182400 0.356200 -0.916500 +vn 0.432200 0.692800 -0.577200 +vn 0.352800 0.726100 -0.590100 +vn 0.385400 0.816100 -0.430600 +vn 0.354000 0.908900 -0.220600 +vn 0.314000 0.949400 -0.007600 +vn 0.396200 0.882000 -0.255100 +vn 0.375400 0.922000 -0.094700 +vn 0.165600 0.830500 0.531900 +vn 0.081900 0.829000 0.553200 +vn 0.170200 0.654200 0.737000 +vn 0.013800 0.801300 0.598100 +vn 0.062100 0.722800 0.688300 +vn 0.156900 0.734700 0.660000 +vn 0.353500 0.570700 0.741200 +vn 0.293700 0.616300 0.730700 +vn 0.029600 0.848400 0.528500 +vn 0.152500 0.849300 0.505400 +vn 0.080500 0.898800 0.431000 +vn 0.093500 0.926100 0.365600 +vn 0.019300 0.792700 0.609300 +vn 0.049900 0.793600 0.606400 +vn 0.175100 0.876600 0.448300 +vn 0.092300 0.843800 0.528700 +vn 0.224200 0.930700 0.288900 +vn 0.146400 0.907000 0.394900 +vn 0.309700 0.946600 0.089800 +vn 0.234500 0.950800 0.202500 +vn 0.048000 0.791400 0.609400 +vn 0.120400 0.838400 0.531500 +vn 0.214600 0.909500 0.356100 +vn 0.267100 0.837200 0.477300 +vn 0.303200 0.945700 0.116900 +vn 0.358100 0.907800 0.218100 +vn 0.353900 0.922900 -0.151700 +vn 0.403800 0.749000 0.525300 +vn 0.612700 0.644400 0.457500 +vn 0.793100 0.604000 0.079200 +vn 0.785100 0.545000 0.294200 +vn 0.867400 0.229300 -0.441600 +vn 0.865000 0.352800 -0.357000 +vn 0.829900 0.506700 -0.233300 +vn 0.766500 0.633100 -0.107900 +vn 0.704400 0.668600 -0.238200 +vn 0.602200 0.727900 -0.327900 +vn 0.487500 0.736100 -0.469600 +vn 0.248500 0.588800 -0.769100 +vn 0.367200 0.673600 -0.641400 +vn 0.120600 0.463400 -0.877900 +vn 0.157800 0.490000 -0.857300 +vn 0.087600 0.411200 -0.907300 +vn 0.070700 0.384200 -0.920500 +vn -0.021500 0.107100 -0.994000 +vn 0.011300 0.233500 -0.972300 +vn -0.006800 0.143400 -0.989600 +vn 0.022900 0.263200 -0.964500 +vn 0.008600 0.169100 -0.985600 +vn 0.042400 0.357200 -0.933000 +vn 0.093600 0.433900 -0.896100 +vn 0.071300 0.409200 -0.909700 +vn 0.044900 0.363000 -0.930700 +vn 0.014100 0.009800 -0.999900 +vn 0.014200 0.168700 -0.985600 +vn 0.023200 0.175200 -0.984300 +vn 0.014200 0.352200 -0.935800 +vn 0.041100 0.354400 -0.934200 +vn 0.010400 0.019000 -0.999800 +vn -0.013100 0.038300 -0.999200 +vn 0.009600 0.186600 -0.982400 +vn -0.029400 0.068700 -0.997200 +vn -0.000300 0.204500 -0.978900 +vn 0.129700 0.352900 -0.926600 +vn 0.103400 0.178100 -0.978600 +vn 0.060200 0.182500 -0.981400 +vn 0.083400 0.339900 -0.936700 +vn 0.036000 0.292500 -0.955600 +vn 0.052400 0.318900 -0.946300 +vn 0.027400 0.180900 -0.983100 +vn -0.013100 0.352300 -0.935800 +vn 0.006000 0.009400 -0.999900 +vn -0.001100 0.167100 -0.985900 +vn -0.006400 0.169900 -0.985400 +vn -0.018900 0.354800 -0.934800 +vn 0.051400 0.456800 -0.888100 +vn 0.022600 0.406600 -0.913300 +vn -0.016800 0.401400 -0.915800 +vn -0.029600 0.401600 -0.915400 +vn -0.000400 0.441700 -0.897200 +vn -0.042500 0.436300 -0.898800 +vn 0.078600 0.420200 -0.904000 +vn 0.130900 0.480000 -0.867400 +vn 0.072800 0.458400 -0.885800 +vn 0.172900 0.459900 -0.871000 +vn 0.076900 0.494100 -0.866000 +vn 0.163500 0.504800 -0.847600 +vn -0.127700 0.105100 0.986200 +vn 0.009200 -0.164800 0.986300 +vn -0.222400 0.086600 0.971100 +vn 0.189700 -0.295700 0.936300 +vn -0.065200 -0.244900 0.967400 +vn 0.066600 -0.391500 0.917800 +vn -0.035700 -0.266100 0.963300 +vn -0.058500 0.108600 0.992400 +vn 0.338400 0.205100 0.918400 +vn 0.362800 -0.065400 0.929600 +vn 0.181000 -0.086100 0.979700 +vn 0.349700 -0.129000 0.927900 +vn 0.263800 -0.183300 0.947000 +vn 0.130100 0.172200 0.976400 +vn 0.032000 0.514100 0.857100 +vn -0.206700 0.414500 0.886300 +vn 0.011000 0.591600 0.806100 +vn 0.185200 0.561700 0.806300 +vn 0.461700 -0.080600 0.883400 +vn 0.434800 0.080100 0.897000 +vn 0.469600 -0.113600 0.875500 +vn 0.517200 -0.033400 0.855200 +vn 0.383100 0.647400 0.658900 +vn 0.317000 0.467500 0.825200 +vn 0.462700 0.243400 0.852500 +vn 0.798300 -0.093600 0.595000 +vn 0.880400 -0.060200 0.470400 +vn 0.827500 -0.103200 0.551800 +vn 0.961800 -0.030800 0.272200 +vn 0.911300 -0.075500 0.404800 +vn 0.978400 -0.047000 0.201100 +vn 0.977300 0.184400 0.104600 +vn 0.987700 0.076600 -0.136300 +vn 0.997000 0.020100 -0.075100 +vn 0.987300 0.112200 0.112700 +vn 0.984800 -0.002300 -0.173500 +vn 0.960800 0.031500 -0.275500 +vn 0.998300 -0.009900 0.057900 +vn 0.999700 -0.025300 -0.007200 +vn 0.864700 0.077600 0.496200 +vn 0.913600 0.140200 0.381700 +vn 0.922800 0.023400 0.384600 +vn 0.978900 0.058800 0.195900 +vn 0.698300 0.028200 0.715300 +vn 0.784900 0.047400 0.617900 +vn 0.745700 -0.029000 0.665700 +vn 0.829700 -0.004300 0.558200 +vn 0.680400 -0.061200 0.730300 +vn 0.719800 -0.109400 0.685500 +vn 0.607400 -0.105900 0.787300 +vn 0.610100 -0.002500 0.792300 +vn 0.591200 -0.093800 0.801000 +vn 0.809200 0.113100 0.576500 +vn 0.828400 0.175500 0.532000 +vn 0.776600 0.113900 0.619600 +vn 0.756200 0.162900 0.633800 +vn 0.708400 0.245900 0.661600 +vn 0.498700 0.462200 0.733300 +vn 0.584300 0.331000 0.741000 +vn 0.391900 0.633100 0.667600 +vn 0.258000 0.767200 0.587200 +vn 0.172200 0.897200 0.406600 +vn 0.408500 0.745900 0.526100 +vn 0.578100 0.411000 0.704800 +vn 0.594300 0.397200 0.699300 +vn 0.075100 0.929100 0.362200 +vn 0.679900 0.192100 0.707700 +vn 0.740400 0.093700 0.665600 +vn 0.693100 0.161900 0.702500 +vn 0.688800 0.060600 0.722400 +vn 0.756700 0.074000 0.649600 +vn 0.595900 0.102000 0.796600 +vn 0.517900 -0.147000 0.842700 +vn 0.414900 -0.151700 0.897200 +vn 0.485800 -0.113500 0.866700 +vn 0.511000 -0.106100 0.853000 +vn 0.493200 -0.833100 0.250200 +vn 0.456900 -0.825600 0.331000 +vn 0.603900 -0.733100 0.312700 +vn 0.404100 -0.817900 0.409500 +vn 0.492500 -0.739800 0.458400 +vn 0.559700 -0.611800 0.558900 +vn 0.651800 -0.731500 0.200300 +vn 0.681500 -0.606300 0.409800 +vn 0.039100 -0.884900 0.464200 +vn 0.252100 -0.855100 0.453000 +vn 0.040800 -0.925700 0.376000 +vn 0.261500 -0.890200 0.373000 +vn 0.291800 -0.909400 0.296500 +vn 0.042300 -0.951300 0.305400 +vn 0.344500 -0.634300 0.692100 +vn 0.292900 -0.763400 0.575700 +vn 0.037900 -0.793900 0.606800 +vn 0.030700 -0.667900 0.743600 +vn 0.587000 -0.307300 0.749000 +vn 0.543100 -0.313400 0.779000 +vn 0.641100 -0.221500 0.734800 +vn 0.457700 -0.335500 0.823400 +vn 0.552200 -0.229400 0.801500 +vn 0.683400 -0.279200 0.674500 +vn 0.609300 -0.170500 0.774400 +vn 0.652800 -0.174400 0.737100 +vn 0.595300 -0.115100 0.795200 +vn 0.715500 -0.117400 0.688700 +vn 0.745800 -0.125700 0.654200 +vn 0.883200 -0.348500 0.314000 +vn 0.785900 -0.270600 0.556000 +vn 0.835100 -0.188200 0.516900 +vn 0.894600 -0.286000 0.343300 +vn 0.686700 -0.258500 0.679400 +vn 0.553900 -0.129500 0.822400 +vn 0.652800 -0.221400 0.724400 +vn 0.773700 -0.581000 0.252600 +vn 0.757300 -0.415300 0.503900 +vn 0.775800 -0.354200 0.522200 +vn 0.853200 -0.451500 0.261000 +vn 0.592900 -0.435800 0.677100 +vn 0.699400 -0.435300 0.566800 +vn 0.376200 -0.461100 0.803600 +vn 0.014400 -0.509600 0.860300 +vn -0.005700 -0.444700 0.895700 +vn -0.028700 -0.523200 0.851700 +vn 0.366200 -0.378600 0.850000 +vn -0.057600 -0.513100 0.856400 +vn 0.309000 -0.439400 0.843500 +vn 0.216600 -0.446300 0.868200 +vn 0.348000 -0.337000 0.874800 +vn 0.414200 -0.232600 0.880000 +vn -0.068500 -0.445600 0.892600 +vn 0.140800 -0.420100 0.896500 +vn -0.048200 -0.412700 0.909600 +vn -0.307800 0.370900 0.876200 +vn -0.079800 0.401300 0.912500 +vn -0.347100 0.474100 0.809200 +vn -0.247300 0.532600 0.809500 +vn -0.226600 0.455800 0.860700 +vn -0.072900 0.500600 0.862600 +vn -0.346000 0.479600 0.806400 +vn -0.044200 0.539100 0.841100 +vn -0.270400 0.433600 0.859600 +vn -0.162800 0.364200 0.917000 +vn 0.052000 0.450500 0.891300 +vn 0.180800 0.469300 0.864300 +vn 0.045500 0.359200 0.932200 +vn 0.105100 -0.245300 0.963700 +vn 0.098600 0.094000 0.990700 +vn 0.105500 0.462400 0.880400 +vn 0.062500 0.131600 0.989300 +vn 0.045000 -0.156900 0.986600 +vn 0.150800 0.508300 0.847900 +vn 0.118100 0.413000 0.903000 +vn -0.045400 -0.134000 0.989900 +vn -0.010200 0.121200 0.992600 +vn -0.145200 0.111100 0.983100 +vn -0.151600 -0.143400 0.978000 +vn -0.204900 0.149500 0.967300 +vn -0.025400 0.488500 0.872200 +vn -0.178800 -0.128700 0.975400 +vn -0.055300 -0.118100 0.991500 +vn 0.673600 0.564800 0.476600 +vn 0.737600 0.498900 0.455000 +vn 0.640200 0.624500 0.447400 +vn 0.706900 0.558400 0.434100 +vn 0.597500 0.697700 0.395300 +vn 0.374000 0.816500 0.439800 +vn 0.466500 0.777500 0.421800 +vn 0.358900 0.864000 0.353100 +vn 0.448500 0.824100 0.346000 +vn 0.386900 0.711300 0.586800 +vn 0.491600 0.676600 0.548200 +vn 0.383200 0.767800 0.513500 +vn 0.480200 0.732000 0.483200 +vn 0.535200 0.740200 0.406900 +vn 0.515500 0.788000 0.336700 +vn 0.591300 0.625600 0.508900 +vn 0.563800 0.685700 0.460400 +vn 0.541900 -0.001900 -0.840500 +vn 0.199900 0.003500 -0.979800 +vn 0.509300 -0.179300 -0.841700 +vn 0.002000 0.012600 -0.999900 +vn 0.164700 -0.163900 -0.972600 +vn -0.040800 -0.155400 -0.987000 +vn 0.168700 -0.309800 -0.935700 +vn 0.490300 -0.287400 -0.822800 +vn 0.700400 -0.488700 -0.520200 +vn 0.631800 -0.502000 -0.590600 +vn 0.611900 -0.584800 -0.532600 +vn 0.479100 -0.532600 -0.697700 +vn 0.471200 -0.613000 -0.634200 +vn 0.691100 -0.538100 -0.482600 +vn 0.762000 -0.460200 -0.455600 +vn 0.775700 -0.474800 -0.415700 +vn 0.791600 -0.315900 -0.523000 +vn 0.779900 -0.312600 -0.542200 +vn 0.770700 -0.403500 -0.493200 +vn 0.735900 -0.409200 -0.539500 +vn 0.706100 -0.295700 -0.643400 +vn 0.670200 -0.387400 -0.633000 +vn 0.490000 -0.384000 -0.782600 +vn 0.869700 0.049600 -0.491100 +vn 0.867200 0.104200 -0.486900 +vn 0.847300 -0.026000 -0.530500 +vn 0.843200 0.028700 -0.536800 +vn 0.828700 0.143700 -0.540900 +vn 0.864400 0.151900 -0.479400 +vn 0.760300 0.138900 -0.634600 +vn 0.549300 0.295100 -0.781800 +vn 0.762500 0.005100 -0.647000 +vn 0.555600 0.144900 -0.818700 +vn 0.824300 -0.172700 -0.539200 +vn 0.823000 -0.161200 -0.544600 +vn 0.740200 -0.173300 -0.649700 +vn 0.320100 -0.527600 -0.786900 +vn 0.344600 -0.437600 -0.830500 +vn 0.192200 -0.520900 -0.831700 +vn 0.218400 -0.456400 -0.862500 +vn 0.273500 -0.592800 -0.757500 +vn 0.299900 -0.619600 -0.725400 +vn 0.098400 -0.684800 -0.722000 +vn 0.156100 -0.637800 -0.754200 +vn 0.054000 -0.537000 -0.841900 +vn 0.085100 -0.477200 -0.874700 +vn -0.064900 -0.548800 -0.833400 +vn -0.051100 -0.494600 -0.867600 +vn -0.044500 -0.390400 -0.919600 +vn -0.011300 -0.446800 -0.894600 +vn 0.018000 -0.604000 -0.796700 +vn 0.093800 -0.393400 -0.914600 +vn 0.037800 -0.656300 -0.753500 +vn -0.011000 -0.693600 -0.720300 +vn -0.019400 -0.728400 -0.684900 +vn 0.007300 -0.744500 -0.667600 +vn 0.028700 -0.661000 -0.749800 +vn -0.055800 -0.656400 -0.752400 +vn 0.223800 -0.457400 -0.860700 +vn 0.204700 0.369500 -0.906400 +vn 0.228100 0.260500 -0.938100 +vn 0.059900 0.354800 -0.933000 +vn 0.050200 0.250100 -0.966900 +vn 0.079600 0.240600 -0.967400 +vn 0.033100 0.134800 -0.990300 +vn 0.095700 0.223900 -0.969900 +vn 0.135900 0.125600 -0.982700 +vn 0.083400 0.128000 -0.988300 +vn 0.139300 0.041100 -0.989400 +vn 0.221600 0.144300 -0.964400 +vn -0.017600 0.444100 -0.895800 +vn 0.038300 0.456600 -0.888900 +vn -0.044300 0.476700 -0.878000 +vn 0.024400 0.486500 -0.873300 +vn 0.055800 0.346000 -0.936600 +vn 0.035100 0.327100 -0.944400 +vn 0.058100 0.025000 -0.998000 +vn 0.018200 -0.150900 -0.988400 +vn 0.126800 -0.112900 -0.985500 +vn 0.979500 -0.091700 0.179400 +vn 0.975500 -0.110600 0.189900 +vn 0.975000 -0.084600 0.205700 +vn 0.981500 -0.103500 0.161200 +vn 0.987900 -0.090800 0.125800 +vn 0.979600 -0.088400 0.180500 +vn 0.989100 -0.124800 0.077500 +vn 0.992800 -0.115600 0.030100 +vn -0.903200 -0.027200 -0.428400 +vn -0.886000 0.017800 -0.463400 +vn -0.935000 -0.013100 -0.354400 +vn -0.892900 0.057000 -0.446600 +vn -0.917000 0.025500 -0.398100 +vn -0.914400 0.067000 -0.399300 +vn -0.950500 0.071800 -0.302200 +vn -0.968300 0.015600 -0.249200 +vn -0.609600 0.761600 0.220000 +vn -0.643300 0.737900 0.204200 +vn -0.615300 0.727900 0.302600 +vn -0.685000 0.705300 0.182500 +vn -0.659800 0.695500 0.284300 +vn -0.720800 0.647800 0.246400 +vn -0.687400 0.645500 0.333000 +vn -0.631700 0.690800 0.351800 +vn -0.483400 0.874000 0.049900 +vn -0.470100 0.880100 -0.066900 +vn -0.542800 0.836600 -0.074300 +vn -0.447600 0.882500 -0.144200 +vn -0.495200 0.851500 -0.172200 +vn -0.579500 0.781400 -0.231500 +vn -0.562700 0.825600 0.041000 +vn -0.616500 0.782800 -0.085000 +vn -0.740700 0.670600 0.039600 +vn -0.712100 0.693900 0.106900 +vn -0.688000 0.724900 0.034600 +vn -0.662300 0.741400 0.108300 +vn -0.619000 0.775100 0.126700 +vn -0.788800 0.591200 -0.168300 +vn -0.767300 0.640100 -0.039000 +vn -0.693200 0.691000 -0.205100 +vn -0.693700 0.717100 -0.067400 +vn -0.628400 0.777100 0.035400 +vn -0.563800 0.813600 0.142000 +vn -0.563700 0.791200 0.237300 +vn -0.490700 0.832700 0.256600 +vn -0.486200 0.859800 0.156000 +vn -0.390000 0.905300 0.168200 +vn -0.396300 0.876500 0.273300 +vn -0.280900 0.917300 0.282300 +vn -0.382100 0.922500 0.054500 +vn -0.276500 0.943800 0.181200 +vn -0.277500 0.958800 0.060900 +vn -0.152500 0.968800 0.195100 +vn -0.149600 0.946800 0.284900 +vn -0.158600 0.984600 0.073400 +vn -0.295400 0.752400 0.588700 +vn -0.168800 0.763400 0.623500 +vn -0.307700 0.794100 0.524200 +vn -0.180300 0.811600 0.555700 +vn -0.178900 0.863500 0.471500 +vn -0.311800 0.835000 0.453400 +vn -0.297800 0.878700 0.373100 +vn -0.163100 0.913400 0.373000 +vn -0.950300 -0.279500 -0.136900 +vn -0.911200 -0.412000 0.000200 +vn -0.960400 -0.278800 0.000600 +vn -0.900800 -0.431300 0.050200 +vn -0.952300 -0.281200 0.118200 +vn -0.978400 -0.154300 0.137900 +vn -0.947500 -0.278300 -0.157700 +vn -0.978800 -0.199600 0.047000 +vn -0.988800 -0.085000 -0.122500 +vn -0.989300 -0.080300 -0.121500 +vn -0.993100 -0.083200 0.082100 +vn -0.991900 -0.066700 -0.108000 +vn -0.992300 -0.073500 0.100100 +vn -0.963200 -0.087100 0.254100 +vn -0.993400 -0.081600 0.081100 +vn -0.970300 -0.097700 0.221200 +vn -0.834700 -0.084600 -0.544200 +vn -0.866200 -0.036900 -0.498300 +vn -0.935000 -0.069600 -0.347700 +vn -0.951400 -0.057300 -0.302600 +vn -0.923600 -0.091400 -0.372400 +vn -0.816700 -0.230700 -0.528900 +vn -0.816000 -0.168400 -0.553000 +vn -0.921100 -0.138200 -0.364100 +vn -0.925300 -0.183300 -0.332000 +vn -0.988600 -0.101400 -0.111700 +vn -0.982800 -0.154300 -0.101200 +vn -0.992800 -0.084500 0.084300 +vn -0.977300 -0.094600 0.189800 +vn -0.985700 -0.147600 0.081000 +vn -0.982400 -0.092400 0.162200 +vn -0.928100 -0.133900 0.347500 +vn -0.916800 -0.099500 0.386700 +vn -0.836000 -0.113000 0.536900 +vn -0.951700 -0.154000 0.265700 +vn -0.870800 -0.186700 0.454800 +vn -0.956100 -0.281300 -0.082800 +vn -0.975700 -0.155800 0.154200 +vn -0.958100 -0.276900 0.073700 +vn -0.919800 -0.285300 0.269400 +vn -0.965500 -0.233100 -0.116100 +vn -0.961800 -0.267800 0.055800 +vn -0.946900 -0.293400 -0.131600 +vn -0.845300 -0.304100 -0.439300 +vn -0.832600 -0.264500 -0.486700 +vn -0.926000 -0.222300 -0.305100 +vn -0.919400 -0.264900 -0.290800 +vn -0.929300 -0.294900 -0.222300 +vn -0.907200 -0.324700 -0.267500 +vn -0.930400 -0.304100 -0.204500 +vn -0.856700 -0.365700 -0.363700 +vn -0.908200 -0.307600 -0.283700 +vn -0.848400 -0.353400 -0.394200 +vn -0.752700 -0.430500 -0.498200 +vn -0.811600 -0.399200 -0.426600 +vn -0.832800 -0.360800 -0.419800 +vn -0.877200 -0.333700 -0.345100 +vn -0.912200 -0.270500 -0.307800 +vn -0.772500 -0.390700 -0.500500 +vn -0.855800 -0.302900 -0.419300 +vn -0.921700 -0.299500 -0.246500 +vn -0.946600 -0.255400 -0.196700 +vn -0.953000 -0.221900 -0.206400 +vn -0.950600 -0.170700 -0.259300 +vn -0.972000 -0.177600 -0.154100 +vn -0.976500 -0.152200 -0.152500 +vn -0.986900 -0.118200 -0.109900 +vn -0.986200 -0.130700 -0.101400 +vn -0.967000 -0.085800 -0.239800 +vn -0.999400 -0.018900 0.029000 +vn -0.993100 0.115400 -0.022400 +vn -0.992800 -0.055100 -0.106700 +vn -0.959200 0.274300 -0.068800 +vn -0.983200 0.064600 -0.170900 +vn -0.956400 0.198400 -0.214200 +vn -0.948800 0.017000 -0.315500 +vn -0.936300 0.232900 0.263000 +vn -0.880700 0.345700 0.323700 +vn -0.919700 0.322300 0.224000 +vn -0.815300 0.441100 0.375200 +vn -0.860600 0.423900 0.282400 +vn -0.789100 0.511000 0.340900 +vn -0.836200 0.499800 0.225900 +vn -0.909200 0.390900 0.143200 +vn -0.991000 0.000200 0.134100 +vn -0.983900 0.152900 0.092600 +vn -0.985600 0.012300 0.168600 +vn -0.971900 0.181200 0.150500 +vn -0.939900 0.338000 0.049000 +vn -0.826100 0.557900 0.079600 +vn -0.858500 0.512800 0.001100 +vn -0.888100 0.444300 -0.117700 +vn -0.757000 0.583000 0.295100 +vn -0.785700 0.597200 0.161000 +vn -0.959000 0.210400 0.190100 +vn -0.973700 0.106500 0.201600 +vn -0.926100 0.124900 -0.355900 +vn -0.876300 0.079200 -0.475300 +vn -0.895300 -0.013900 -0.445200 +vn -0.793500 0.065100 -0.605100 +vn -0.815300 -0.037400 -0.577800 +vn -0.817800 -0.108400 -0.565300 +vn -0.685700 0.070800 -0.724400 +vn -0.711400 -0.042700 -0.701500 +vn -0.596500 0.087100 -0.797900 +vn -0.613500 -0.035500 -0.788900 +vn -0.627900 -0.128100 -0.767700 +vn -0.726100 -0.125100 -0.676100 +vn -0.512100 -0.138200 -0.847700 +vn -0.517900 -0.032300 -0.854800 +vn -0.511700 0.103600 -0.852900 +vn -0.354200 -0.033100 -0.934600 +vn -0.341000 -0.157900 -0.926700 +vn -0.188800 0.718500 -0.669400 +vn -0.176100 0.827300 -0.533400 +vn -0.334400 0.685500 -0.646700 +vn -0.331000 0.794900 -0.508500 +vn -0.317300 0.872800 -0.371000 +vn -0.168500 0.899200 -0.403700 +vn -0.303600 0.912900 -0.272700 +vn -0.294200 0.935800 -0.194200 +vn -0.166200 0.938900 -0.301400 +vn -0.162200 0.965000 -0.206100 +vn -0.283500 0.955500 -0.081100 +vn -0.159300 0.984000 -0.079600 +vn -0.384600 0.906800 -0.172800 +vn -0.379900 0.921900 -0.075500 +vn -0.450700 0.834400 -0.317200 +vn -0.411700 0.881200 -0.232400 +vn -0.568900 0.222600 -0.791700 +vn -0.542300 0.360700 -0.758800 +vn -0.487200 0.262600 -0.832900 +vn -0.455300 0.412400 -0.789100 +vn -0.372100 0.295600 -0.879900 +vn -0.369200 0.118800 -0.921700 +vn -0.354700 0.459700 -0.814200 +vn -0.441700 0.542600 -0.714500 +vn -0.543200 0.500800 -0.673900 +vn -0.573200 0.613000 -0.543800 +vn -0.337000 0.578800 -0.742500 +vn -0.455700 0.654600 -0.603100 +vn -0.757500 0.172800 -0.629600 +vn -0.726600 0.264100 -0.634200 +vn -0.655100 0.186500 -0.732100 +vn -0.642000 0.306600 -0.702700 +vn -0.692500 0.538200 -0.480400 +vn -0.699200 0.629200 -0.339500 +vn -0.793600 0.423800 -0.436500 +vn -0.798900 0.517200 -0.306800 +vn -0.595000 0.705500 -0.385100 +vn -0.897900 0.355700 -0.259400 +vn -0.879500 0.265700 -0.394800 +vn -0.764900 0.330700 -0.552800 +vn -0.835900 0.199100 -0.511500 +vn -0.662400 0.433000 -0.611300 +vn -0.467100 0.758300 -0.454700 +vn -0.201500 0.492100 -0.846900 +vn -0.197400 0.611600 -0.766100 +vn -0.171900 0.122200 -0.977500 +vn -0.193700 0.310300 -0.930700 +vn -0.011100 0.304100 -0.952600 +vn -0.168600 -0.327200 -0.929800 +vn -0.157700 -0.462300 -0.872600 +vn -0.300100 -0.442300 -0.845200 +vn -0.163300 -0.165600 -0.972600 +vn -0.326000 -0.313000 -0.892100 +vn -0.157900 -0.032700 -0.986900 +vn -0.496000 -0.277100 -0.822900 +vn -0.468800 -0.409900 -0.782400 +vn -0.633900 -0.241200 -0.734800 +vn -0.620700 -0.372800 -0.689800 +vn -0.729800 -0.221300 -0.646800 +vn -0.718900 -0.343100 -0.604500 +vn -0.810500 -0.205100 -0.548700 +vn -0.899300 -0.082400 -0.429500 +vn -0.793200 -0.321700 -0.517100 +vn -0.885300 -0.186500 -0.426000 +vn -0.595200 -0.474800 -0.648300 +vn -0.556700 -0.540500 -0.630900 +vn -0.694100 -0.429100 -0.578000 +vn -0.661500 -0.476100 -0.579400 +vn -0.212900 0.788400 0.577100 +vn -0.259300 0.872700 0.413800 +vn -0.253600 0.768900 0.586900 +vn -0.296700 0.902700 0.311800 +vn -0.380800 0.852300 0.358400 +vn -0.384700 0.909100 0.159700 +vn -0.463600 0.826000 0.320600 +vn -0.296300 0.707300 0.641900 +vn -0.154600 0.668200 0.727700 +vn -0.132600 0.740700 0.658700 +vn -0.151200 0.662000 0.734100 +vn -0.124000 0.773100 0.622000 +vn -0.152300 0.738100 0.657200 +vn -0.149800 0.778900 0.609000 +vn -0.176100 0.777800 0.603400 +vn -0.266200 0.659700 0.702800 +vn -0.186100 0.820000 0.541200 +vn -0.335700 0.520800 0.784900 +vn -0.265300 0.717200 0.644300 +vn -0.349700 0.548300 0.759700 +vn -0.239900 0.739500 0.629000 +vn -0.213400 0.821300 0.529100 +vn -0.194800 0.500800 0.843400 +vn -0.287100 0.499600 0.817300 +vn -0.247100 0.593800 0.765700 +vn -0.177000 0.554200 0.813300 +vn -0.182100 0.715500 0.674500 +vn -0.458400 0.317900 0.830000 +vn -0.469800 0.173200 0.865600 +vn -0.333700 0.310600 0.890000 +vn -0.507300 -0.045500 0.860600 +vn -0.373400 0.153400 0.914900 +vn -0.201300 0.428000 0.881100 +vn -0.328800 0.401200 0.855000 +vn -0.145000 0.494000 0.857300 +vn -0.328800 0.508700 0.795700 +vn -0.352600 0.536200 0.766900 +vn -0.342400 0.457700 0.820500 +vn -0.345900 0.541900 0.765900 +vn -0.315100 0.552800 0.771500 +vn -0.273600 0.544400 0.792900 +vn -0.337100 0.263400 0.903900 +vn -0.318700 0.308600 0.896200 +vn -0.219700 0.511600 0.830700 +vn -0.270600 0.182000 0.945300 +vn -0.238000 0.025200 0.970900 +vn -0.262500 -0.093100 0.960400 +vn -0.324800 0.076400 0.942700 +vn -0.150100 0.532400 0.833100 +vn -0.225300 0.534000 0.814900 +vn -0.110200 0.509000 0.853700 +vn -0.135100 0.499600 0.855600 +vn -0.473300 -0.396100 0.786800 +vn -0.346400 -0.224000 0.911000 +vn -0.367000 -0.638900 0.676100 +vn -0.271700 -0.530900 0.802700 +vn -0.210100 -0.318400 0.924400 +vn -0.582600 0.583900 0.565400 +vn -0.500400 0.445100 0.742600 +vn -0.479800 0.646000 0.593700 +vn -0.381400 0.506100 0.773500 +vn -0.190800 0.564100 0.803400 +vn -0.124800 0.554900 0.822500 +vn -0.353700 0.496700 0.792600 +vn -0.300500 0.514700 0.803000 +vn -0.373200 0.496200 0.783900 +vn -0.340100 0.497900 0.797800 +vn -0.309000 0.570400 0.761000 +vn -0.170500 0.457900 0.872500 +vn -0.265800 0.475700 0.838500 +vn -0.283200 0.118600 0.951700 +vn -0.190800 0.055100 0.980100 +vn -0.275700 -0.173100 0.945500 +vn -0.122700 0.599800 0.790700 +vn -0.210500 0.591100 0.778600 +vn -0.252900 0.501100 0.827600 +vn -0.146300 0.513800 0.845400 +vn -0.152800 0.661900 0.733900 +vn -0.210800 0.728200 0.652100 +vn -0.179900 0.720900 0.669300 +vn -0.206100 0.782800 0.587100 +vn -0.723000 0.244300 0.646200 +vn -0.826500 0.196600 0.527500 +vn -0.779300 0.291500 0.554700 +vn -0.925200 0.114400 0.361900 +vn -0.917000 0.207500 0.340800 +vn -0.911900 0.307600 0.271700 +vn -0.649500 0.351400 0.674300 +vn -0.767800 0.394100 0.505200 +vn -0.191300 0.577000 0.794000 +vn -0.205800 0.684500 0.699300 +vn -0.143500 0.600000 0.787000 +vn -0.089800 0.585200 0.805900 +vn -0.101300 0.580300 0.808100 +vn -0.454700 0.795300 -0.400900 +vn -0.372200 0.682000 -0.629500 +vn -0.298600 0.707200 -0.640900 +vn -0.295700 0.619400 -0.727200 +vn -0.219300 0.578400 -0.785700 +vn -0.274100 0.649600 -0.709100 +vn -0.168500 0.548400 -0.819100 +vn -0.207100 0.585200 -0.784000 +vn -0.665200 0.244900 -0.705400 +vn -0.563700 0.376700 -0.735100 +vn -0.507100 0.531300 -0.678700 +vn -0.473700 0.475600 -0.741200 +vn -0.393500 0.542000 -0.742600 +vn -0.268100 0.547900 -0.792400 +vn -0.647400 0.461600 -0.606400 +vn -0.432700 0.621200 -0.653400 +vn -0.574200 0.643400 -0.506300 +vn -0.720500 0.602300 -0.343700 +vn -0.788100 0.390700 -0.475600 +vn -0.818700 0.531900 -0.216600 +vn -0.880200 0.331000 -0.340000 +vn -0.802300 0.209700 -0.558800 +vn -0.989700 0.140400 -0.028800 +vn -0.939700 0.120500 -0.320100 +vn -0.971500 0.207400 -0.115200 +vn -0.948600 0.258100 -0.183200 +vn -0.908200 0.391900 0.147000 +vn -0.399900 0.882000 0.249300 +vn -0.528600 0.791700 0.306300 +vn -0.577600 0.815200 0.042200 +vn -0.685800 0.675100 0.271900 +vn -0.695100 0.713800 0.085900 +vn -0.685300 0.727700 -0.028300 +vn -0.464800 0.884100 -0.048400 +vn -0.607500 0.782800 -0.134900 +vn -0.572000 0.765400 0.295000 +vn -0.495100 0.868800 -0.008300 +vn -0.649000 0.703800 0.288700 +vn -0.598700 0.800800 -0.018600 +vn -0.662300 0.749200 -0.009200 +vn -0.598700 0.765200 -0.236700 +vn -0.500700 0.835600 -0.225900 +vn -0.491900 0.770400 -0.405600 +vn -0.656800 0.716600 -0.234500 +vn -0.601200 0.687300 -0.407700 +vn -0.247700 0.603400 -0.758000 +vn -0.294100 0.603800 -0.740900 +vn -0.305700 0.732500 -0.608300 +vn -0.334400 0.736000 -0.588700 +vn -0.368300 0.837400 -0.403900 +vn -0.445400 0.555900 -0.701900 +vn -0.598000 0.463100 -0.654100 +vn -0.471300 0.678200 -0.563900 +vn -0.696400 0.390100 -0.602400 +vn -0.677100 0.519400 -0.521400 +vn -0.599800 0.585000 -0.545900 +vn -0.663400 0.633600 -0.398100 +vn -0.382900 0.133700 -0.914100 +vn -0.571000 0.107600 -0.813900 +vn -0.407200 0.312800 -0.858100 +vn -0.695400 0.087200 -0.713300 +vn -0.706100 0.210900 -0.676000 +vn -0.582500 0.254000 -0.772200 +vn -0.226600 0.169300 -0.959200 +vn -0.280800 0.152500 -0.947600 +vn -0.252700 0.354600 -0.900200 +vn -0.312000 0.339500 -0.887400 +vn -0.355600 0.589800 -0.725100 +vn -0.388500 0.718900 -0.576400 +vn -0.414700 0.812800 -0.409200 +vn -0.368900 0.834100 -0.410000 +vn -0.397400 0.916300 -0.048900 +vn -0.423300 0.878100 -0.222900 +vn -0.331300 0.943000 0.031100 +vn -0.374500 0.907000 -0.192500 +vn -0.192500 0.761100 0.619400 +vn -0.126600 0.764400 0.632100 +vn -0.341500 0.641900 0.686600 +vn -0.113000 0.779600 0.616000 +vn -0.233800 0.714800 0.659100 +vn -0.172800 0.793600 0.583400 +vn -0.394200 0.615900 0.682100 +vn -0.565600 0.489700 0.663500 +vn -0.257100 0.784500 0.564300 +vn -0.165500 0.822900 0.543600 +vn -0.127000 0.797900 0.589200 +vn -0.218500 0.831700 0.510400 +vn -0.132500 0.764800 0.630600 +vn -0.116400 0.772000 0.624900 +vn -0.237900 0.906600 0.348500 +vn -0.190800 0.854900 0.482400 +vn -0.132900 0.824700 0.549700 +vn -0.173700 0.891100 0.419300 +vn -0.320400 0.931800 0.170400 +vn -0.171000 0.841600 0.512400 +vn -0.127200 0.797600 0.589600 +vn -0.251300 0.937400 0.241000 +vn -0.330500 0.932600 0.145000 +vn -0.247300 0.896100 0.368500 +vn -0.298300 0.817900 0.492000 +vn -0.384000 0.915200 -0.122200 +vn -0.445600 0.706300 0.550100 +vn -0.640800 0.588100 0.493500 +vn -0.894400 0.447200 0.008500 +vn -0.795000 0.495200 0.350300 +vn -0.805600 0.569000 0.164900 +vn -0.922200 0.292000 -0.253700 +vn -0.924100 0.155100 -0.349400 +vn -0.888200 0.182700 -0.421500 +vn -0.867700 0.483700 -0.114700 +vn -0.739800 0.664800 -0.103600 +vn -0.789200 0.614100 0.008100 +vn -0.652200 0.723300 -0.227000 +vn -0.537700 0.722300 -0.435000 +vn -0.284100 0.597600 -0.749700 +vn -0.403700 0.662400 -0.631000 +vn -0.127500 0.503800 -0.854400 +vn -0.180800 0.532200 -0.827100 +vn -0.092000 0.465600 -0.880200 +vn -0.133300 0.500000 -0.855700 +vn -0.060000 0.324400 -0.944000 +vn -0.058900 0.436700 -0.897700 +vn -0.022800 0.301600 -0.953200 +vn 0.011800 0.274900 -0.961400 +vn 0.005200 0.170000 -0.985400 +vn -0.037700 0.186100 -0.981800 +vn -0.118800 0.464200 -0.877700 +vn -0.075400 0.457400 -0.886000 +vn -0.037600 0.398100 -0.916600 +vn -0.031600 0.410300 -0.911400 +vn -0.051000 0.383200 -0.922300 +vn 0.033700 0.221300 -0.974600 +vn -0.037000 0.368200 -0.929000 +vn 0.002100 0.187400 -0.982300 +vn 0.011400 0.202100 -0.979300 +vn 0.018200 0.031800 -0.999300 +vn 0.070900 0.073600 -0.994800 +vn 0.037900 0.244600 -0.968900 +vn 0.078800 0.106700 -0.991200 +vn 0.047600 0.142500 -0.988700 +vn -0.132300 0.193700 -0.972100 +vn -0.182400 0.184300 -0.965800 +vn -0.151200 0.359100 -0.921000 +vn -0.203700 0.362200 -0.909600 +vn -0.103400 0.344600 -0.933000 +vn -0.081500 0.193900 -0.977600 +vn 0.001300 0.014200 -0.999900 +vn 0.007400 0.021400 -0.999700 +vn -0.000000 0.177100 -0.984200 +vn -0.015500 0.359200 -0.933100 +vn -0.040100 0.408300 -0.912000 +vn -0.087000 0.420700 -0.903000 +vn -0.147600 0.467100 -0.871800 +vn -0.086700 0.447300 -0.890200 +vn -0.134700 0.440600 -0.887600 +vn -0.215900 0.492700 -0.843000 +vn -0.298100 0.511800 -0.805700 +vn -0.404700 0.437800 -0.802800 +vn -0.270400 0.420600 -0.866000 +vn -0.214500 0.484000 -0.848400 +vn -0.103700 -0.370000 0.923200 +vn -0.126000 -0.294700 0.947300 +vn 0.015500 -0.239600 0.970800 +vn -0.012800 -0.191600 0.981400 +vn 0.108700 0.114300 0.987500 +vn 0.135100 0.102800 0.985500 +vn -0.183900 -0.234200 0.954600 +vn -0.281100 -0.211700 0.936000 +vn -0.146400 -0.164600 0.975400 +vn -0.300800 -0.175900 0.937300 +vn -0.084200 0.151100 0.984900 +vn 0.191500 0.541500 0.818600 +vn 0.183900 0.419000 0.889200 +vn -0.005000 0.469600 0.882900 +vn -0.268000 0.138500 0.953400 +vn 0.000000 0.571200 0.820800 +vn -0.082400 0.570800 0.817000 +vn -0.402100 -0.209400 0.891300 +vn -0.421000 -0.209700 0.882500 +vn -0.384000 -0.023400 0.923100 +vn -0.491100 -0.145300 0.858900 +vn -0.339600 0.188000 0.921600 +vn -0.191900 0.406300 0.893400 +vn -0.108000 0.492500 0.863600 +vn -0.953700 -0.099000 0.284000 +vn -0.911300 -0.118600 0.394400 +vn -0.936600 -0.104000 0.334700 +vn -0.890100 -0.129100 0.437000 +vn -0.819500 -0.156700 0.551200 +vn -0.833100 -0.130000 0.537600 +vn -0.997300 -0.073700 -0.006500 +vn -0.987300 -0.036800 -0.154300 +vn -0.987900 0.003600 0.155100 +vn -0.996100 0.066200 0.059000 +vn -0.968200 -0.044300 -0.246100 +vn -0.995000 -0.065700 -0.075000 +vn -0.987300 -0.081800 0.136100 +vn -0.978700 -0.089800 0.184500 +vn -0.958300 -0.035400 0.283700 +vn -0.907100 0.048400 0.418200 +vn -0.851500 0.008700 0.524200 +vn -0.904600 -0.058500 0.422300 +vn -0.843500 -0.088600 0.529800 +vn -0.769600 -0.025300 0.638000 +vn -0.673800 -0.068500 0.735700 +vn -0.764100 -0.127500 0.632400 +vn -0.593000 -0.177100 0.785500 +vn -0.714800 -0.173800 0.677400 +vn -0.565400 -0.191400 0.802300 +vn -0.669400 -0.165300 0.724300 +vn -0.576900 -0.116900 0.808400 +vn -0.751600 0.157000 0.640700 +vn -0.736300 0.108700 0.667800 +vn -0.832000 0.123600 0.540900 +vn -0.785600 0.076400 0.614000 +vn -0.414300 0.618600 0.667600 +vn -0.591200 0.333200 0.734400 +vn -0.312400 0.736700 0.599800 +vn -0.498000 0.487900 0.716900 +vn -0.537600 0.157400 0.828400 +vn -0.516800 0.402500 0.755600 +vn -0.333700 0.676000 0.657000 +vn -0.263300 0.795200 0.546100 +vn -0.387800 0.387200 0.836500 +vn -0.225200 0.828300 0.513000 +vn -0.656100 0.093300 0.748900 +vn -0.649200 0.182400 0.738400 +vn -0.688200 0.043700 0.724200 +vn -0.575100 0.015600 0.817900 +vn -0.469600 0.042400 0.881900 +vn -0.457900 -0.200000 0.866200 +vn -0.332600 -0.217300 0.917700 +vn -0.489200 -0.183600 0.852600 +vn -0.476100 -0.731900 0.487500 +vn -0.399000 -0.817200 0.415800 +vn -0.614800 -0.712400 0.338400 +vn -0.310200 -0.862300 0.400300 +vn -0.527600 -0.786900 0.319900 +vn -0.389300 -0.854100 0.345000 +vn -0.611300 -0.750400 0.251500 +vn -0.733000 -0.641200 0.227000 +vn -0.444400 -0.845600 0.295900 +vn -0.184000 -0.911800 0.367000 +vn -0.166800 -0.884400 0.436000 +vn -0.218600 -0.927200 0.304300 +vn -0.205100 -0.819100 0.535700 +vn -0.418500 -0.218900 0.881400 +vn -0.405400 -0.293100 0.865900 +vn -0.523800 -0.233900 0.819100 +vn -0.395900 -0.391900 0.830500 +vn -0.531900 -0.309000 0.788400 +vn -0.511600 -0.395200 0.763000 +vn -0.623800 -0.420000 0.659100 +vn -0.650800 -0.376800 0.659100 +vn -0.721800 -0.137100 0.678400 +vn -0.606600 -0.150500 0.780600 +vn -0.751800 -0.144100 0.643500 +vn -0.688400 -0.207500 0.695100 +vn -0.834000 -0.251400 0.491200 +vn -0.812400 -0.343100 0.471400 +vn -0.885100 -0.353400 0.302800 +vn -0.536500 -0.178200 0.824800 +vn -0.661200 -0.299300 0.687900 +vn -0.784100 -0.455900 0.421000 +vn -0.728200 -0.554700 0.402600 +vn -0.832000 -0.518300 0.197800 +vn -0.873600 -0.419000 0.247600 +vn -0.558500 -0.434000 0.706900 +vn -0.645100 -0.600800 0.472100 +vn -0.537500 -0.588400 0.604100 +vn -0.340200 -0.550700 0.762300 +vn -0.275800 -0.706300 0.652000 +vn -0.374800 -0.448000 0.811700 +vn -0.284800 -0.485300 0.826700 +vn -0.355200 -0.487400 0.797600 +vn -0.276800 -0.267900 0.922800 +vn -0.257600 -0.343200 0.903200 +vn -0.201000 -0.414400 0.887600 +vn 0.242500 0.512300 0.823800 +vn 0.204900 0.401800 0.892500 +vn 0.255900 0.524400 0.812100 +vn 0.204700 0.417900 0.885100 +vn 0.170300 0.517500 0.838500 +vn 0.131400 0.350600 0.927200 +vn -0.018700 0.515500 0.856700 +vn -0.082700 0.519700 0.850300 +vn 0.001000 0.355100 0.934800 +vn -0.034800 0.406400 0.913000 +vn -0.075300 0.444900 0.892400 +vn -0.074500 0.073700 0.994500 +vn -0.184200 -0.295700 0.937400 +vn 0.020400 0.098100 0.995000 +vn 0.033100 -0.174700 0.984100 +vn -0.082500 0.523100 0.848300 +vn 0.119200 0.058000 0.991200 +vn 0.069300 0.077200 0.994600 +vn 0.104200 -0.130000 0.986000 +vn 0.125900 -0.141800 0.981900 +vn -0.043400 0.165500 0.985300 +vn 0.125300 0.100600 0.987000 +vn 0.088000 -0.135900 0.986800 +vn -0.722900 0.581300 0.373500 +vn -0.756100 0.514300 0.404800 +vn -0.686000 0.583200 0.435000 +vn -0.659900 0.638900 0.395500 +vn -0.491400 0.798900 0.346800 +vn -0.402900 0.838800 0.366100 +vn -0.490800 0.771600 0.404700 +vn -0.409000 0.804600 0.430600 +vn -0.499800 0.736900 0.455200 +vn -0.407600 0.772000 0.487700 +vn -0.511500 0.691300 0.510300 +vn -0.406000 0.729200 0.550900 +vn -0.567700 0.757900 0.321400 +vn -0.571900 0.730100 0.373900 +vn -0.585300 0.690800 0.424500 +vn -0.602300 0.644100 0.471600 +vn -0.244300 -0.180300 -0.952800 +vn -0.245300 -0.020600 -0.969200 +vn -0.485000 -0.015300 -0.874400 +vn -0.252100 0.058000 -0.966000 +vn -0.504000 0.042900 -0.862700 +vn -0.678300 0.023800 -0.734400 +vn -0.468100 -0.138300 -0.872800 +vn -0.648800 -0.042300 -0.759800 +vn -0.525000 -0.537600 -0.659800 +vn -0.539400 -0.422900 -0.728200 +vn -0.656800 -0.418800 -0.627100 +vn -0.638500 -0.487100 -0.595800 +vn -0.737400 -0.453800 -0.500400 +vn -0.792000 -0.411800 -0.450700 +vn -0.746600 -0.414700 -0.520100 +vn -0.781300 -0.373000 -0.500400 +vn -0.782300 -0.315900 -0.536900 +vn -0.779900 -0.312100 -0.542600 +vn -0.825500 -0.214600 -0.522000 +vn -0.793800 -0.247700 -0.555400 +vn -0.573900 -0.268400 -0.773700 +vn -0.704800 -0.289100 -0.647800 +vn -0.609600 -0.136300 -0.780900 +vn -0.753600 -0.168100 -0.635400 +vn -0.883000 0.015000 -0.469200 +vn -0.891300 0.064100 -0.449000 +vn -0.861000 0.014600 -0.508400 +vn -0.847200 -0.045000 -0.529400 +vn -0.908700 0.100800 -0.405100 +vn -0.885300 0.109800 -0.451800 +vn -0.809400 0.108600 -0.577100 +vn -0.816700 0.014800 -0.576900 +vn -0.684600 0.107300 -0.721000 +vn -0.862900 -0.113900 -0.492400 +vn -0.823700 -0.152800 -0.546100 +vn -0.795600 -0.080900 -0.600400 +vn -0.286700 -0.510600 -0.810600 +vn -0.452500 -0.504900 -0.735000 +vn -0.293300 -0.582600 -0.758000 +vn -0.438600 -0.584900 -0.682300 +vn -0.306700 -0.607800 -0.732500 +vn -0.433500 -0.584300 -0.686100 +vn -0.300200 -0.537200 -0.788200 +vn -0.451200 -0.457400 -0.766300 +vn -0.152700 -0.505800 -0.849000 +vn -0.160400 -0.560200 -0.812700 +vn -0.112200 -0.643500 -0.757200 +vn -0.041100 -0.519200 -0.853700 +vn 0.014700 -0.273500 -0.961800 +vn -0.268500 -0.374700 -0.887400 +vn -0.156300 -0.628100 -0.762200 +vn -0.460500 -0.289000 -0.839300 +vn -0.289400 0.292500 -0.911400 +vn -0.478400 0.301300 -0.824800 +vn -0.511900 0.191900 -0.837300 +vn -0.285000 0.193700 -0.938800 +vn 0.021100 0.055700 -0.998200 +vn -0.000100 0.124900 -0.992200 +vn -0.044400 0.206400 -0.977500 +vn -0.269200 0.119800 -0.955600 +vn -0.517700 0.111400 -0.848300 +vn -0.131200 0.472600 -0.871500 +vn -0.130300 0.424900 -0.895800 +vn -0.091800 0.305200 -0.947900 +vn 0.027800 -0.058800 -0.997900 +vn -0.992500 -0.100200 0.069600 +vn -0.988900 -0.120400 0.087300 +vn -0.985700 -0.076700 0.150200 +vn -0.984900 -0.101000 0.140400 +vn -0.986100 -0.081700 0.144400 +vn -0.993100 -0.111400 -0.037300 +vn -0.992200 -0.120200 0.032700 +vn -0.992300 -0.120900 -0.028600 +vn 0.978200 -0.194000 0.074500 +vn 0.957600 -0.259500 -0.125100 +vn 0.999900 -0.015700 -0.005800 +vn 0.952200 -0.109600 -0.285100 +vn 0.972000 0.010500 -0.234600 +vn 0.978200 -0.158100 -0.134500 +vn 0.987700 0.093400 -0.125600 +vn 0.903600 -0.344500 -0.254600 +vn 0.871400 -0.480000 -0.101500 +vn 0.765600 -0.640700 -0.057600 +vn 0.853100 -0.505500 0.129500 +vn 0.731800 -0.668900 0.130600 +vn 0.590800 -0.797800 0.120500 +vn 0.846800 -0.494300 -0.196700 +vn 0.620000 -0.784600 -0.007500 +vn 0.840500 0.123500 -0.527600 +vn 0.899200 -0.046300 -0.435100 +vn 0.892900 -0.227800 -0.388500 +vn 0.700700 -0.698800 -0.144100 +vn 0.869200 -0.067600 -0.489900 +vn 0.761700 -0.527800 -0.375800 +vn 0.747300 0.452300 -0.486700 +vn 0.871300 0.241400 -0.427300 +vn 0.885600 0.095000 -0.454700 +vn 0.931200 -0.224800 -0.287100 +vn 0.792700 0.288600 -0.537000 +vn 0.929000 -0.350200 -0.119800 +vn 0.929000 -0.353000 0.110700 +vn 0.641100 -0.692100 0.331600 +vn 0.458000 -0.881800 0.112700 +vn 0.657900 -0.606300 0.446800 +vn 0.511000 -0.817400 0.265800 +vn 0.536900 -0.762600 0.360700 +vn 0.345600 -0.910000 0.229000 +vn 0.317300 -0.941700 0.111900 +vn 0.754000 -0.528800 0.389700 +vn 0.845100 -0.320700 0.427700 +vn 0.801300 -0.174200 0.572400 +vn 0.744700 -0.416700 0.521300 +vn 0.898600 -0.093000 0.428700 +vn 0.923400 0.153200 0.351800 +vn 0.784300 0.396200 0.477300 +vn 0.805100 0.113800 0.582100 +vn 0.910000 0.377000 0.172500 +vn 0.876300 0.472800 -0.092600 +vn 0.763600 0.601100 0.235800 +vn 0.743300 0.663300 -0.086400 +vn 0.864200 0.387400 -0.321100 +vn 0.729600 0.586000 -0.352700 +vn 0.006800 -0.990400 -0.137900 +vn 0.007400 -0.990400 -0.138100 +vn -0.003700 -0.999700 0.023500 +vn -0.013800 -0.990300 -0.137900 +vn -0.025800 -0.999400 0.024000 +vn -0.046700 -0.992000 0.117100 +vn 0.007300 -0.999700 0.023000 +vn -0.021100 -0.992700 0.119000 +vn -0.092700 -0.579200 -0.809900 +vn -0.130900 -0.533800 -0.835400 +vn -0.105400 -0.815800 -0.568700 +vn -0.118500 -0.479500 -0.869500 +vn -0.143700 -0.742300 -0.654400 +vn -0.148700 -0.784400 -0.602200 +vn -0.121000 -0.981000 -0.151900 +vn -0.087800 -0.986300 -0.139700 +vn 0.003900 -0.622300 -0.782800 +vn -0.035300 -0.607900 -0.793300 +vn -0.002500 -0.835600 -0.549300 +vn -0.047800 -0.830900 -0.554300 +vn -0.051700 -0.989200 -0.137100 +vn -0.018400 -0.426200 -0.904500 +vn -0.010900 -0.716100 -0.697900 +vn -0.066300 -0.436200 -0.897400 +vn -0.001700 -0.975200 -0.221300 +vn -0.074100 -0.708800 -0.701500 +vn -0.067500 -0.965300 -0.252100 +vn -0.138300 -0.972100 -0.189500 +vn -0.002000 -0.992700 0.120500 +vn 0.063700 -0.931800 0.357500 +vn -0.026000 -0.994100 0.105600 +vn 0.113200 -0.850000 0.514500 +vn 0.042200 -0.953200 0.299300 +vn 0.098100 -0.892700 0.439800 +vn 0.014500 -0.967600 0.252000 +vn -0.036700 -0.996000 0.081700 +vn 0.052300 -0.920200 0.388000 +vn 0.025700 -0.910200 0.413300 +vn 0.005800 -0.962900 0.269700 +vn -0.013900 -0.885900 0.463700 +vn -0.024800 -0.949000 0.314400 +vn -0.031500 -0.995100 0.093700 +vn -0.015000 -0.983700 -0.179400 +vn -0.014400 -0.981500 -0.191000 +vn 0.000100 -0.740400 -0.672200 +vn 0.003900 -0.445300 -0.895400 +vn 0.010300 -0.758100 -0.652000 +vn 0.023500 -0.471700 -0.881400 +vn 0.047600 -0.498100 -0.865800 +vn 0.079000 -0.528100 -0.845500 +vn 0.030400 -0.771800 -0.635100 +vn 0.067000 -0.786100 -0.614500 +vn 0.046800 -0.984700 -0.168000 +vn 0.002500 -0.984700 -0.174000 +vn 0.183200 -0.976100 0.117000 +vn 0.352700 -0.881400 0.314000 +vn 0.197900 -0.946500 0.255000 +vn 0.194800 -0.911700 0.361700 +vn 0.118100 -0.945500 0.303500 +vn 0.089700 -0.988400 0.122900 +vn 0.034000 -0.991400 0.126100 +vn 0.075300 -0.933200 0.351500 +vn 0.132600 -0.890200 0.435900 +vn 0.098800 -0.854600 0.509700 +vn 0.136600 -0.565000 -0.813700 +vn 0.250400 -0.599900 -0.759900 +vn 0.141300 -0.801800 -0.580700 +vn 0.275700 -0.804400 -0.526200 +vn 0.135600 -0.978400 -0.156000 +vn 0.441100 -0.600500 -0.667000 +vn 0.738600 -0.407900 -0.536700 +vn 0.488100 -0.752600 -0.442000 +vn 0.477100 -0.869900 -0.125100 +vn 0.278600 -0.950500 -0.137400 +vn 0.297800 -0.954200 0.028400 +vn 0.456400 -0.889500 0.021100 +vn 0.062700 -0.997700 0.026700 +vn 0.158500 -0.986900 0.028400 +vn 0.008600 -0.999700 0.024800 +vn -0.019300 -0.999600 0.022100 +vn -0.028300 -0.999500 0.015200 +vn -0.028800 -0.999400 0.019400 +vn -0.076200 -0.996800 0.024000 +vn -0.053200 -0.998300 -0.022200 +vn -0.059800 -0.997900 0.025100 +vn -0.067700 -0.997400 0.026000 +vn -0.044500 -0.993700 0.102900 +vn -0.056800 -0.992100 0.112100 +vn -0.048700 -0.998500 0.025000 +vn 0.004400 -0.992800 0.119500 +vn -0.066700 -0.931600 0.357200 +vn -0.094100 -0.932400 0.349000 +vn -0.122500 -0.852700 0.507800 +vn -0.012000 -0.931200 0.364300 +vn -0.100600 -0.843100 0.528300 +vn -0.078700 -0.866500 0.492900 +vn -0.071800 -0.937500 0.340500 +vn 0.009400 -0.839300 -0.543600 +vn 0.010500 -0.629200 -0.777200 +vn 0.015200 -0.628100 -0.778000 +vn 0.014300 -0.838900 -0.544000 +vn -0.971200 -0.108800 -0.211800 +vn -0.970400 -0.229200 -0.076200 +vn -0.985400 -0.150000 -0.080000 +vn -0.978400 -0.181000 0.099700 +vn -0.986500 -0.007900 -0.163500 +vn -0.999000 -0.034100 0.028800 +vn -0.580900 -0.800700 0.146100 +vn -0.729800 -0.664200 0.161700 +vn -0.609800 -0.792300 0.021000 +vn -0.867900 -0.469700 0.161800 +vn -0.770700 -0.636800 -0.021500 +vn -0.896600 -0.439000 -0.057900 +vn -0.852600 -0.496000 -0.164500 +vn -0.697900 -0.706900 -0.114700 +vn -0.771300 -0.541900 -0.333900 +vn -0.924100 -0.316900 -0.213400 +vn -0.907900 -0.244600 -0.340400 +vn -0.922200 -0.062200 -0.381700 +vn -0.896700 -0.096300 -0.432100 +vn -0.767500 -0.420600 -0.483800 +vn -0.951500 -0.206500 -0.228100 +vn -0.916800 0.070700 -0.393100 +vn -0.909100 0.224700 -0.350900 +vn -0.844400 0.240800 -0.478500 +vn -0.879200 0.081600 -0.469400 +vn -0.938200 -0.316300 0.140300 +vn -0.948200 -0.309400 -0.072400 +vn -0.334800 -0.881500 0.333000 +vn -0.522100 -0.765500 0.376000 +vn -0.500400 -0.817600 0.284700 +vn -0.638000 -0.612600 0.466600 +vn -0.625300 -0.695600 0.353900 +vn -0.332400 -0.909700 0.249100 +vn -0.459800 -0.877800 0.134500 +vn -0.789300 -0.175300 0.588400 +vn -0.840600 -0.310100 0.444100 +vn -0.726600 -0.411000 0.550500 +vn -0.743500 -0.522400 0.417600 +vn -0.812000 0.339400 0.474800 +vn -0.926800 0.122000 0.355200 +vn -0.814700 0.069200 0.575700 +vn -0.896400 -0.100100 0.431900 +vn -0.767100 0.640400 -0.036700 +vn -0.899300 0.435500 -0.039700 +vn -0.923700 0.331700 0.191600 +vn -0.995800 0.060600 -0.069000 +vn -0.791100 0.557800 0.251000 +vn -0.899200 0.365500 -0.240700 +vn -0.769100 0.577100 -0.274500 +vn -0.803400 0.422200 -0.419900 +vn 0.062200 -0.990700 0.121300 +vn 0.042800 -0.998900 0.021000 +vn 0.031700 -0.992100 0.121400 +vn 0.034000 -0.990000 -0.137100 +vn 0.009100 -0.990500 -0.137300 +vn 0.018700 -0.999600 0.022400 +vn 0.154400 -0.970600 -0.184900 +vn 0.172300 -0.743000 -0.646700 +vn 0.188900 -0.781100 -0.595100 +vn 0.145400 -0.484300 -0.862700 +vn 0.178500 -0.531800 -0.827800 +vn 0.149000 -0.574500 -0.804800 +vn 0.146400 -0.977700 -0.150700 +vn 0.148600 -0.813200 -0.562800 +vn 0.111500 -0.983900 -0.139400 +vn 0.088300 -0.829900 -0.550900 +vn 0.088400 -0.604400 -0.791800 +vn 0.038700 -0.620500 -0.783300 +vn 0.073100 -0.987900 -0.136900 +vn 0.037000 -0.836800 -0.546300 +vn 0.086600 -0.966500 -0.241600 +vn 0.023700 -0.978200 -0.206500 +vn 0.081300 -0.716800 -0.692600 +vn -0.001800 -0.728700 -0.684800 +vn 0.066000 -0.448900 -0.891100 +vn -0.051000 -0.904500 0.423400 +vn -0.103000 -0.871300 0.479900 +vn -0.041900 -0.941600 0.334200 +vn -0.117000 -0.823700 0.554700 +vn -0.060900 -0.917100 0.394000 +vn 0.035700 -0.992000 0.121100 +vn -0.010400 -0.959400 0.281700 +vn 0.051200 -0.994800 0.087700 +vn 0.062800 -0.992000 0.109700 +vn 0.055400 -0.940000 0.336700 +vn 0.005300 -0.955900 0.293600 +vn 0.057300 -0.869600 0.490500 +vn -0.012300 -0.898400 0.439000 +vn 0.046100 -0.993800 0.101500 +vn -0.004700 -0.445200 -0.895400 +vn -0.023300 -0.754200 -0.656200 +vn 0.018100 -0.983000 -0.182500 +vn 0.015900 -0.984800 -0.172800 +vn -0.041400 -0.469500 -0.882000 +vn -0.042500 -0.772500 -0.633600 +vn -0.047600 -0.985100 -0.165100 +vn -0.098500 -0.796300 -0.596800 +vn -0.066200 -0.784300 -0.616800 +vn -0.130000 -0.552100 -0.823600 +vn -0.104000 -0.524600 -0.845000 +vn -0.073100 -0.498900 -0.863600 +vn -0.003300 -0.985500 -0.169600 +vn -0.105600 -0.877300 0.468100 +vn -0.166200 -0.907000 0.387100 +vn -0.174900 -0.944900 0.276700 +vn -0.310800 -0.941500 0.130400 +vn -0.093400 -0.939400 0.329900 +vn -0.168400 -0.976800 0.132300 +vn -0.085500 -0.832000 0.548100 +vn -0.071400 -0.987800 0.138200 +vn -0.060000 -0.921500 0.383800 +vn -0.018400 -0.989500 0.143700 +vn -0.278900 -0.951800 -0.128000 +vn -0.283600 -0.815400 -0.504600 +vn -0.160900 -0.810700 -0.562900 +vn -0.267100 -0.625300 -0.733200 +vn -0.173300 -0.587300 -0.790600 +vn -0.135300 -0.979100 -0.151800 +vn -0.498200 -0.763200 -0.411500 +vn -0.461600 -0.625000 -0.629600 +vn -0.481300 -0.870200 -0.105200 +vn -0.462500 -0.885700 0.040500 +vn -0.294500 -0.954800 0.040600 +vn -0.149400 -0.988100 0.035400 +vn 0.012200 -0.990200 0.138800 +vn 0.003600 -0.999600 0.029200 +vn -0.050800 -0.998200 0.031300 +vn 0.030800 -0.999200 0.026100 +vn 0.041200 -0.998900 0.022700 +vn 0.052500 -0.998500 0.012600 +vn 0.083700 -0.996400 -0.016300 +vn 0.095800 -0.995200 0.017300 +vn 0.089000 -0.995800 0.021600 +vn 0.080300 -0.996600 0.020500 +vn 0.067200 -0.997500 0.020400 +vn 0.112600 -0.827600 0.549900 +vn 0.095200 -0.922000 0.375300 +vn 0.058300 -0.831500 0.552500 +vn 0.049000 -0.926900 0.372200 +vn -0.027100 -0.836900 0.546700 +vn 0.075700 -0.990200 0.117500 +vn 0.101300 -0.924600 0.367300 +vn 0.013200 -0.627200 -0.778700 +vn 0.010100 -0.839400 -0.543500 +vn 0.701000 -0.078600 0.708800 +vn 0.728200 -0.204900 0.654000 +vn 0.780200 -0.104300 0.616800 +vn 0.725300 -0.302800 0.618300 +vn 0.794700 -0.231700 0.561100 +vn 0.779600 -0.346100 0.522000 +vn 0.841200 -0.275100 0.465400 +vn 0.843200 -0.137300 0.519800 +vn 0.491000 0.072900 0.868100 +vn 0.500700 0.081400 0.861800 +vn 0.494100 -0.001900 0.869400 +vn 0.522400 0.060900 0.850500 +vn 0.475400 -0.050400 0.878300 +vn 0.398900 -0.139900 0.906300 +vn 0.527500 0.018600 0.849400 +vn 0.459400 -0.085700 0.884100 +vn 0.921800 -0.386500 0.029700 +vn 0.889100 -0.457600 0.007000 +vn 0.919600 -0.368400 0.136100 +vn 0.880000 -0.473800 -0.034000 +vn 0.897900 -0.430900 0.090400 +vn 0.900400 -0.408700 0.149000 +vn 0.907800 -0.184300 0.376800 +vn 0.810700 -0.409200 0.418700 +vn 0.889800 -0.326700 0.318700 +vn 0.826500 -0.470500 0.309100 +vn 0.909700 -0.385500 0.154200 +vn 0.939900 -0.269300 0.209800 +vn 0.920500 -0.389200 0.033300 +vn 0.954600 -0.296400 0.029900 +vn 0.954000 -0.240100 0.179300 +vn 0.908100 -0.418100 0.021200 +vn 0.975100 -0.169600 0.143000 +vn 0.964700 -0.076400 0.252100 +vn 0.944800 -0.110200 0.308500 +vn 0.947500 -0.038800 0.317400 +vn 0.916600 -0.051000 0.396500 +vn 0.873200 -0.035500 0.486000 +vn 0.923500 -0.106600 0.368400 +vn 0.817600 0.007200 0.575800 +vn 0.877200 -0.059000 0.476600 +vn 0.735200 0.062900 0.675000 +vn 0.809500 -0.012100 0.587000 +vn 0.831500 -0.523700 0.185500 +vn 0.818200 -0.570400 0.072700 +vn 0.887800 -0.460100 0.012300 +vn 0.809400 -0.586100 0.036400 +vn 0.864500 -0.501000 -0.040300 +vn 0.869000 -0.491800 0.054300 +vn 0.797500 -0.597400 0.084100 +vn 0.206500 -0.519300 0.829200 +vn 0.106200 -0.597400 0.794900 +vn 0.329800 -0.346500 0.878200 +vn 0.035400 -0.525100 0.850300 +vn 0.247300 -0.424800 0.870900 +vn 0.163600 -0.427100 0.889300 +vn 0.338700 -0.278400 0.898700 +vn 0.432500 -0.178000 0.883900 +vn 0.423800 -0.145200 0.894000 +vn 0.240200 -0.324200 0.915000 +vn 0.329100 -0.221800 0.917900 +vn 0.498700 -0.033200 0.866100 +vn 0.092800 -0.717200 0.690700 +vn -0.056300 -0.770700 0.634700 +vn -0.068400 -0.878500 0.472800 +vn -0.200500 -0.879800 0.431000 +vn -0.299100 -0.503100 0.810800 +vn 0.542800 -0.058100 0.837800 +vn 0.539700 -0.166200 0.825300 +vn 0.629000 -0.057400 0.775200 +vn 0.522300 -0.260200 0.812100 +vn 0.647500 -0.180600 0.740400 +vn 0.634200 -0.281000 0.720300 +vn 0.329000 -0.201700 0.922600 +vn 0.317300 -0.208700 0.925100 +vn 0.414400 -0.174100 0.893300 +vn 0.396600 -0.232200 0.888100 +vn 0.072700 -0.941800 0.328100 +vn 0.243000 -0.917400 0.315100 +vn 0.318700 -0.818400 0.478100 +vn 0.439700 -0.846600 0.299900 +vn 0.540000 -0.712200 0.448400 +vn 0.617700 -0.443200 0.649600 +vn 0.096600 -0.873700 0.476800 +vn 0.399500 -0.539600 0.741100 +vn 0.073500 -0.908700 0.411000 +vn 0.235200 -0.895400 0.378000 +vn 0.068200 -0.853200 0.517000 +vn 0.227800 -0.840400 0.491700 +vn 0.376000 -0.815000 0.441000 +vn 0.398800 -0.853600 0.335100 +vn 0.595600 -0.748200 0.292300 +vn 0.686300 -0.603800 0.405600 +vn 0.672500 -0.665400 0.323900 +vn 0.740800 -0.538500 0.401600 +vn 0.764400 -0.348000 0.542800 +vn 0.734900 -0.364800 0.571700 +vn 0.487000 -0.776100 0.400700 +vn 0.532600 -0.782800 0.321800 +vn 0.574400 -0.726300 0.377600 +vn 0.763100 -0.512500 0.393700 +vn 0.715600 -0.579600 0.389900 +vn 0.748200 -0.576000 0.329300 +vn 0.695600 -0.629000 0.347100 +vn 0.741600 -0.622200 0.250900 +vn 0.715900 -0.358600 0.599100 +vn 0.711700 -0.384500 0.588000 +vn 0.760500 -0.428200 0.488200 +vn 0.731100 -0.491600 0.473100 +vn 0.613300 -0.713200 0.339400 +vn 0.656800 -0.666100 0.353500 +vn 0.635600 -0.687500 0.351300 +vn 0.684300 -0.661300 0.307400 +vn 0.690600 -0.618900 0.374300 +vn 0.732700 -0.378100 0.565900 +vn 0.724500 -0.522800 0.449200 +vn 0.540600 -0.267500 0.797600 +vn 0.595300 -0.214600 0.774300 +vn 0.635500 -0.307700 0.708100 +vn 0.659200 -0.288600 0.694400 +vn 0.401800 -0.150900 0.903200 +vn 0.515200 -0.081000 0.853200 +vn 0.456800 -0.214500 0.863300 +vn 0.552600 -0.155700 0.818800 +vn 0.558700 -0.069700 0.826400 +vn 0.535800 -0.063700 0.842000 +vn 0.591300 -0.116000 0.798000 +vn 0.590300 -0.055600 0.805300 +vn 0.656400 -0.071800 0.751000 +vn -0.138000 -0.601300 0.787000 +vn 0.093900 -0.342000 0.935000 +vn 0.000900 0.103400 0.994600 +vn 0.015900 -0.225200 0.974200 +vn 0.225700 -0.031600 0.973700 +vn 0.175700 -0.318600 0.931500 +vn 0.209700 -0.202000 0.956700 +vn 0.252400 -0.254300 0.933600 +vn 0.258400 -0.198500 0.945400 +vn 0.133000 -0.363500 0.922000 +vn 0.223500 -0.185200 0.957000 +vn 0.206800 -0.207200 0.956200 +vn 0.377800 -0.087600 0.921700 +vn 0.361300 -0.010700 0.932400 +vn 0.501200 0.080900 0.861600 +vn 0.500300 -0.011400 0.865800 +vn 0.392700 0.056900 0.917900 +vn 0.412200 0.039900 0.910200 +vn 0.583300 0.230000 0.779000 +vn 0.540400 0.183800 0.821100 +vn 0.300300 0.290200 0.908600 +vn 0.404800 0.074600 0.911400 +vn 0.459500 0.264400 0.847900 +vn 0.573100 0.251700 0.779900 +vn 0.652300 0.229300 0.722400 +vn 0.553300 0.293700 0.779500 +vn 0.628400 0.343000 0.698200 +vn 0.583300 0.377700 0.719100 +vn 0.605900 0.319700 0.728500 +vn 0.635500 0.116200 0.763300 +vn 0.610500 0.131300 0.781100 +vn 0.597900 0.003600 0.801500 +vn 0.561500 0.051300 0.825900 +vn 0.539400 -0.038200 0.841200 +vn 0.546400 -0.010700 0.837400 +vn 0.513100 -0.057400 0.856400 +vn 0.447100 -0.150200 0.881800 +vn 0.431200 -0.092300 0.897500 +vn 0.332200 -0.214100 0.918600 +vn 0.356100 -0.040800 0.933600 +vn 0.418900 0.142700 0.896800 +vn 0.469600 -0.001000 0.882900 +vn 0.641100 0.025000 0.767000 +vn 0.551400 0.060000 0.832100 +vn 0.499300 0.201500 0.842700 +vn 0.576600 0.092800 0.811700 +vn 0.637700 -0.152200 0.755100 +vn 0.724500 -0.169600 0.668000 +vn 0.695300 -0.236400 0.678700 +vn 0.711100 -0.127000 0.691500 +vn 0.624300 -0.142900 0.768000 +vn 0.420300 -0.194000 0.886400 +vn 0.405900 0.091000 0.909400 +vn 0.159100 -0.242000 0.957100 +vn 0.139400 -0.607000 0.782400 +vn 0.376300 0.277600 0.883900 +vn 0.326500 0.305100 0.894600 +vn 0.137100 0.265500 0.954300 +vn 0.153400 0.048500 0.987000 +vn 0.184700 -0.182500 0.965700 +vn 0.257100 0.117500 0.959200 +vn 0.043700 -0.090900 0.994900 +vn 0.083000 0.271100 0.959000 +vn 0.114800 0.387100 0.914900 +vn 0.412600 -0.226000 0.882400 +vn 0.356000 -0.298400 0.885600 +vn 0.563300 -0.044200 0.825100 +vn 0.504700 -0.157600 0.848800 +vn 0.550200 0.437200 0.711400 +vn 0.555300 0.243300 0.795300 +vn 0.492600 0.463800 0.736400 +vn 0.451700 0.117500 0.884400 +vn 0.417000 0.451200 0.789000 +vn 0.204800 0.385200 0.899800 +vn 0.218700 -0.098700 0.970800 +vn 0.006100 0.338700 0.940900 +vn 0.037400 -0.227000 0.973200 +vn 0.035000 -0.477400 0.878000 +vn 0.152700 -0.400100 0.903700 +vn 0.135200 -0.366000 0.920700 +vn 0.022400 -0.359900 0.932700 +vn 0.959000 -0.279000 -0.049300 +vn 0.969600 -0.219600 -0.108300 +vn 0.977800 -0.166400 -0.127300 +vn 0.974900 -0.206400 -0.084000 +vn 0.977400 -0.183600 -0.104800 +vn 0.978100 -0.195300 -0.072400 +vn 0.982400 -0.173000 -0.070900 +vn 0.962200 -0.269700 0.038400 +vn 0.962800 -0.270000 -0.006900 +vn 0.986100 -0.092300 0.138400 +vn 0.971200 -0.051800 0.232500 +vn 0.973600 -0.046700 0.223300 +vn 0.962000 -0.044400 0.269400 +vn 0.962600 -0.030300 0.269300 +vn 0.985600 -0.116500 0.122900 +vn 0.977700 -0.209100 0.020300 +vn 0.985800 -0.167800 0.000000 +vn 0.985200 -0.170800 -0.017800 +vn 0.979600 -0.200800 -0.006400 +vn 0.989100 -0.123400 0.080500 +vn 0.512700 0.058900 0.856500 +vn 0.577500 0.019100 0.816100 +vn 0.642700 0.010600 0.766000 +vn 0.574000 0.055000 0.817000 +vn 0.732000 0.005700 0.681300 +vn 0.670900 0.073600 0.737900 +vn 0.451500 -0.834000 0.317200 +vn 0.527000 -0.766400 0.367200 +vn 0.408100 -0.822600 0.396000 +vn 0.296000 -0.898000 0.325700 +vn 0.264300 -0.862900 0.430700 +vn 0.169800 -0.850700 0.497400 +vn 0.045300 -0.868500 0.493700 +vn 0.031900 -0.971200 0.236000 +vn 0.037800 -0.968200 0.247300 +vn 0.337200 -0.912700 0.230700 +vn 0.322100 -0.915400 0.241400 +vn 0.541400 -0.811600 0.219600 +vn 0.595600 -0.767800 0.235900 +vn 0.692000 -0.703700 0.161100 +vn 0.720600 -0.676600 0.151700 +vn 0.732800 -0.657900 0.173800 +vn 0.668900 -0.696700 0.259300 +vn 0.604400 -0.726300 0.327500 +vn 0.504100 -0.820800 0.268500 +vn 0.294500 -0.918400 0.264200 +vn 0.027800 -0.957500 0.287000 +vn -0.700000 -0.560000 0.443200 +vn -0.693400 -0.471000 0.545400 +vn -0.712900 -0.367600 0.597200 +vn -0.634100 -0.360800 0.683900 +vn -0.631000 -0.314700 0.709100 +vn -0.656200 -0.195800 0.728700 +vn -0.758500 -0.426000 0.493200 +vn -0.742700 -0.228900 0.629300 +vn -0.249700 -0.249900 0.935500 +vn -0.384100 -0.141600 0.912400 +vn -0.355700 -0.193100 0.914400 +vn -0.450500 -0.015000 0.892700 +vn -0.443400 0.014700 0.896200 +vn -0.442100 -0.097000 0.891700 +vn -0.474600 0.010000 0.880100 +vn -0.477400 -0.163600 0.863300 +vn -0.876000 -0.476100 0.077400 +vn -0.882500 -0.458800 0.103600 +vn -0.847400 -0.528700 -0.048500 +vn -0.864600 -0.501000 -0.038300 +vn -0.894100 -0.446700 -0.032200 +vn -0.903800 -0.424500 0.054000 +vn -0.734400 -0.640400 0.224800 +vn -0.710400 -0.608000 0.354500 +vn -0.826100 -0.530700 0.189400 +vn -0.798400 -0.480500 0.362800 +vn -0.800600 -0.261300 0.539300 +vn -0.858700 -0.305900 0.411200 +vn -0.971100 -0.208100 0.116700 +vn -0.939600 -0.341600 0.022400 +vn -0.905900 -0.423600 -0.000400 +vn -0.947900 -0.282500 0.147200 +vn -0.869400 -0.494200 -0.002500 +vn -0.869700 -0.095900 0.484300 +vn -0.920700 -0.091700 0.379400 +vn -0.906000 -0.177100 0.384500 +vn -0.950300 -0.079500 0.301000 +vn -0.946200 -0.153900 0.284600 +vn -0.969700 -0.120300 0.212800 +vn -0.905100 -0.364800 0.218300 +vn -0.807600 -0.109300 0.579600 +vn -0.763600 -0.016300 0.645400 +vn -0.858700 -0.146600 0.491200 +vn -0.817200 -0.070700 0.571900 +vn -0.825000 -0.565200 -0.004100 +vn -0.764800 -0.636700 0.098500 +vn -0.820300 -0.570900 0.034700 +vn -0.750500 -0.649300 0.122800 +vn -0.764400 -0.631700 0.129000 +vn -0.843000 -0.533100 0.071600 +vn -0.159300 -0.403300 0.901100 +vn -0.082700 -0.483900 0.871200 +vn -0.271000 -0.333000 0.903100 +vn 0.107200 -0.549500 0.828600 +vn 0.024300 -0.592100 0.805500 +vn -0.177400 -0.451400 0.874500 +vn -0.260100 -0.332700 0.906500 +vn -0.370800 -0.214300 0.903700 +vn -0.196100 -0.323600 0.925700 +vn -0.341600 -0.223500 0.912900 +vn -0.445400 -0.093500 0.890500 +vn 0.457900 0.093800 0.884100 +vn 0.357000 -0.766400 0.534000 +vn 0.289000 -0.484500 0.825700 +vn 0.246600 -0.826900 0.505400 +vn 0.253100 -0.734400 0.629700 +vn 0.092200 -0.642300 0.760900 +vn -0.106100 -0.451000 0.886200 +vn -0.542100 -0.284000 0.790900 +vn -0.525900 -0.269300 0.806800 +vn -0.454000 -0.228600 0.861200 +vn -0.420100 -0.228400 0.878300 +vn -0.562400 -0.166500 0.809900 +vn -0.369500 -0.153700 0.916400 +vn -0.294700 -0.197000 0.935100 +vn -0.345100 -0.077900 0.935300 +vn -0.216100 -0.197000 0.956300 +vn -0.340600 -0.638900 0.689800 +vn -0.266700 -0.851800 0.450800 +vn -0.116600 -0.645100 0.755100 +vn -0.212900 -0.922300 0.322600 +vn -0.095100 -0.878500 0.468200 +vn -0.078800 -0.941100 0.328800 +vn -0.237000 -0.831300 0.502700 +vn -0.101300 -0.847800 0.520600 +vn -0.088700 -0.907200 0.411200 +vn -0.221500 -0.890400 0.397700 +vn -0.580600 -0.570200 0.581200 +vn -0.484100 -0.782400 0.391700 +vn -0.481200 -0.611100 0.628400 +vn -0.410600 -0.859900 0.303400 +vn -0.378300 -0.821300 0.427100 +vn -0.307700 -0.899100 0.311400 +vn -0.421000 -0.774800 0.471600 +vn -0.334800 -0.805900 0.488300 +vn -0.325300 -0.859400 0.394500 +vn -0.417100 -0.812800 0.406700 +vn -0.581300 -0.725900 0.367500 +vn -0.570600 -0.715700 0.402700 +vn -0.653500 -0.696500 0.296300 +vn -0.587900 -0.726300 0.356200 +vn -0.631700 -0.677000 0.377700 +vn -0.641000 -0.656200 0.398200 +vn -0.654200 -0.642700 0.398800 +vn -0.678700 -0.561300 0.473500 +vn -0.701700 -0.450600 0.551900 +vn -0.677600 -0.397500 0.618800 +vn -0.509100 -0.746900 0.427800 +vn -0.501100 -0.758700 0.416300 +vn -0.511900 -0.797200 0.320100 +vn -0.591100 -0.717600 0.368400 +vn -0.668100 -0.511600 0.540300 +vn -0.681500 -0.253000 0.686700 +vn -0.623200 -0.250300 0.741000 +vn -0.604700 -0.103200 0.789700 +vn -0.546500 -0.168100 0.820400 +vn -0.522300 -0.058900 0.850700 +vn -0.474700 -0.119200 0.872000 +vn -0.476300 -0.070000 0.876500 +vn -0.453200 -0.074100 0.888300 +vn -0.579000 -0.047000 0.814000 +vn -0.489600 0.097800 0.866500 +vn -0.524600 0.020900 0.851100 +vn -0.387300 0.096500 0.916900 +vn -0.449000 -0.008600 0.893500 +vn -0.609100 -0.070200 0.790000 +vn -0.386400 0.666100 0.638000 +vn -0.092900 0.702900 0.705200 +vn 0.015300 0.147500 0.988900 +vn -0.039800 -0.174200 0.983900 +vn -0.323800 0.316500 0.891600 +vn -0.367500 -0.028400 0.929600 +vn -0.194500 -0.225000 0.954700 +vn -0.383300 -0.034600 0.923000 +vn -0.179900 -0.276600 0.944000 +vn -0.328800 0.082300 0.940800 +vn -0.379300 -0.024100 0.925000 +vn -0.140100 -0.296600 0.944700 +vn -0.535000 -0.033700 0.844100 +vn -0.519900 0.047900 0.852900 +vn -0.482400 -0.073100 0.872900 +vn -0.475400 -0.008600 0.879700 +vn -0.592300 0.201900 0.780000 +vn -0.505500 0.202300 0.838800 +vn -0.586600 0.058500 0.807800 +vn -0.542300 0.108400 0.833200 +vn -0.495700 0.502500 0.708400 +vn -0.437000 0.543200 0.716900 +vn -0.469200 0.330700 0.818800 +vn -0.555200 0.361100 0.749300 +vn -0.547900 0.470000 0.692000 +vn -0.573700 0.496300 0.651500 +vn -0.583800 0.263800 0.767800 +vn -0.605400 0.340900 0.719200 +vn -0.577700 -0.044800 0.815000 +vn -0.620600 0.108100 0.776600 +vn -0.493000 -0.253400 0.832300 +vn -0.570900 -0.076600 0.817500 +vn -0.482300 -0.155600 0.862100 +vn -0.388400 -0.264600 0.882700 +vn -0.340600 -0.077200 0.937000 +vn -0.424600 -0.100300 0.899800 +vn -0.299500 0.332700 0.894200 +vn -0.212200 0.129800 0.968600 +vn -0.346000 0.221900 0.911600 +vn -0.104300 -0.256200 0.961000 +vn -0.261500 -0.317000 0.911700 +vn -0.275300 -0.004200 0.961300 +vn -0.451100 0.179500 0.874200 +vn -0.359500 0.240700 0.901600 +vn -0.522600 -0.025400 0.852200 +vn -0.618100 -0.298400 0.727300 +vn -0.671900 -0.275900 0.687300 +vn -0.390400 -0.006600 0.920600 +vn -0.535600 -0.313900 0.784000 +vn -0.384800 -0.323500 0.864400 +vn -0.122800 0.015900 0.992300 +vn -0.121100 -0.298200 0.946800 +vn -0.135000 0.388700 0.911400 +vn -0.136500 0.257100 0.956700 +vn -0.020500 -0.124200 0.992000 +vn -0.095900 0.267900 0.958600 +vn -0.308800 -0.392100 0.866500 +vn -0.054100 -0.433500 0.899500 +vn -0.403600 -0.215800 0.889100 +vn -0.295000 0.411100 0.862600 +vn -0.463500 0.448100 0.764500 +vn -0.246600 0.020500 0.968900 +vn -0.471700 0.165200 0.866200 +vn -0.041300 -0.147400 0.988200 +vn -0.104900 0.367400 0.924100 +vn 0.047800 -0.463000 0.885100 +vn 0.051100 -0.389700 0.919500 +vn -0.954900 -0.281500 -0.094900 +vn -0.964600 -0.236700 -0.116100 +vn -0.932200 -0.327600 -0.153700 +vn -0.969000 -0.219500 -0.113300 +vn -0.940500 -0.278200 -0.194900 +vn -0.946700 -0.272800 -0.171100 +vn -0.929400 -0.364600 -0.056300 +vn -0.922000 -0.383000 -0.057000 +vn -0.959500 -0.065900 0.273900 +vn -0.954200 -0.043700 0.295900 +vn -0.974900 -0.105900 0.195900 +vn -0.973800 -0.095600 0.206200 +vn -0.979200 -0.162300 0.121400 +vn -0.984400 -0.132100 0.116100 +vn -0.978900 -0.203300 0.021600 +vn -0.965400 -0.258100 0.037400 +vn -0.985000 -0.169400 -0.033800 +vn -0.982500 -0.176900 -0.058300 +vn -0.982000 -0.188500 -0.011700 +vn -0.990400 -0.135400 0.029200 +vn -0.571700 -0.074800 0.817100 +vn -0.521300 -0.077100 0.849900 +vn -0.519100 -0.014600 0.854600 +vn -0.647200 -0.086200 0.757400 +vn -0.601300 -0.025900 0.798600 +vn -0.745600 -0.096500 0.659400 +vn -0.718100 -0.009000 0.695900 +vn -0.173400 -0.863900 0.472900 +vn -0.399200 -0.812200 0.425400 +vn -0.279200 -0.843800 0.458400 +vn -0.212500 -0.905200 0.368100 +vn 0.026800 -0.922100 0.385900 +vn -0.083700 -0.853800 0.513900 +vn -0.481600 -0.836900 0.260300 +vn -0.248900 -0.930900 0.267500 +vn -0.255600 -0.935100 0.245500 +vn -0.498300 -0.826800 0.260900 +vn -0.647000 -0.733000 0.210000 +vn -0.659300 -0.726200 0.194800 +vn -0.577500 -0.763100 0.290100 +vn -0.664800 -0.715400 0.215100 +vn -0.407800 -0.864400 0.294200 +vn -0.348500 -0.866200 0.358200 +vn -0.495300 -0.789800 0.361800 +vn -0.221000 -0.935000 0.277400 +vn 0.989800 0.005200 0.142200 +vn 0.987500 -0.003300 0.157600 +vn 0.987000 0.019600 0.159400 +vn 0.939600 0.040600 0.339700 +vn 0.924500 0.211000 0.317400 +vn 0.878300 0.381500 0.288200 +vn 0.984500 -0.034700 0.172000 +vn 0.985700 -0.008200 0.168300 +vn 0.686900 -0.068900 0.723500 +vn 0.589600 0.028600 0.807200 +vn 0.683200 -0.012500 0.730100 +vn 0.525300 0.183700 0.830900 +vn 0.457900 0.151600 0.876000 +vn 0.250800 0.411500 0.876200 +vn 0.089400 0.623500 0.776700 +vn 0.692400 0.047900 0.720000 +vn 0.304100 0.330500 0.893500 +vn 0.622200 0.378200 0.685400 +vn 0.450300 0.646900 0.615500 +vn 0.758300 0.091300 0.645500 +vn -0.166200 -0.171900 0.971000 +vn -0.858800 -0.173500 0.482100 +vn -0.093500 -0.400300 0.911600 +vn -0.905600 -0.183100 0.382700 +vn -0.866600 -0.273600 0.417300 +vn -0.941900 -0.221600 0.252300 +vn -0.864800 -0.388200 0.318500 +vn -0.075800 -0.564500 0.822000 +vn -0.856200 -0.070500 0.511700 +vn -0.861900 -0.094900 0.498100 +vn -0.261300 -0.034300 0.964600 +vn -0.303500 -0.011200 0.952800 +vn -0.766500 0.093800 0.635400 +vn -0.494200 -0.028100 0.868900 +vn -0.406600 0.066500 0.911200 +vn 0.455700 0.026600 0.889700 +vn -0.580000 -0.212900 0.786300 +vn 0.329300 0.028800 0.943800 +vn 0.885800 0.180700 -0.427500 +vn 0.900400 0.077200 -0.428200 +vn 0.570900 0.142400 -0.808600 +vn 0.893300 -0.007100 -0.449400 +vn 0.612200 0.028000 -0.790200 +vn 0.242200 0.054200 -0.968700 +vn 0.533800 0.279800 -0.798000 +vn 0.175500 0.165900 -0.970400 +vn 0.899200 -0.055400 0.433900 +vn 0.930600 -0.042700 0.363400 +vn 0.993400 0.081500 0.081200 +vn 0.946700 -0.004900 0.322200 +vn 0.998100 0.057100 0.024600 +vn 0.981400 0.082500 0.173500 +vn 0.898100 0.263000 -0.352500 +vn 0.990000 -0.002300 0.140800 +vn 0.895900 0.005600 0.444200 +vn 0.994500 -0.056000 0.088800 +vn 0.919000 -0.047800 0.391400 +vn 0.578000 -0.011500 0.816000 +vn 0.891700 -0.063600 0.448200 +vn 0.984000 -0.112500 0.138300 +vn 0.994700 -0.013200 -0.102200 +vn 0.875100 -0.073300 -0.478300 +vn 0.980300 -0.067300 -0.185600 +vn 0.969800 -0.164700 -0.179700 +vn 0.874800 -0.198700 -0.441900 +vn 0.249400 -0.130200 0.959600 +vn 0.840000 0.043700 0.540900 +vn 0.790300 -0.044700 0.611100 +vn 0.969100 0.029700 0.244900 +vn 0.999600 0.025000 -0.013600 +vn 0.919000 0.303200 -0.252000 +vn 0.538100 0.417900 -0.732000 +vn 0.090900 0.312700 -0.945500 +vn 0.553300 0.517000 -0.653100 +vn 0.042800 0.487500 -0.872100 +vn 0.928500 0.365500 0.065900 +vn 0.930900 0.347000 -0.114400 +vn 0.568900 0.629700 -0.529000 +vn 0.025200 0.598200 -0.800900 +vn 0.615800 0.724600 -0.309500 +vn 0.007900 0.708500 -0.705700 +vn 0.909500 -0.127800 0.395500 +vn 0.884800 -0.109200 0.453000 +vn 0.965700 0.072000 0.249400 +vn 0.949900 0.090800 0.299100 +vn 0.463300 -0.854200 0.235900 +vn 0.125800 -0.951000 0.282400 +vn -0.414100 -0.874400 -0.253000 +vn 0.029700 -0.890800 0.453300 +vn -0.752400 -0.647900 -0.118900 +vn -0.820500 -0.571600 0.009200 +vn -0.905300 -0.350100 -0.240600 +vn -0.595300 -0.689900 -0.411900 +vn -0.073300 -0.918700 0.388200 +vn -0.104400 -0.935600 0.337300 +vn -0.792800 -0.605100 -0.072900 +vn -0.103900 -0.973900 0.201700 +vn -0.662300 -0.717500 -0.215600 +vn -0.808900 -0.587300 -0.029400 +vn -0.959700 -0.267800 0.085800 +vn -0.760300 -0.488700 0.428000 +vn -0.948200 -0.305200 -0.087700 +vn 0.065800 -0.516200 0.853900 +vn -0.799500 -0.576000 0.170400 +vn -0.024700 -0.746200 0.665300 +vn -0.934900 -0.298500 -0.191900 +vn 0.640500 -0.597100 0.482800 +vn 0.692200 -0.545200 0.472900 +vn 0.696600 -0.524500 0.489500 +vn 0.920500 -0.116700 0.372800 +vn 0.878600 -0.174800 0.444500 +vn 0.683900 -0.356800 0.636400 +vn 0.699800 -0.231000 0.675900 +vn 0.749400 -0.176300 0.638200 +vn 0.159500 -0.374100 0.913600 +vn -0.680900 -0.378000 0.627400 +vn -0.018900 -0.719600 0.694100 +vn -0.841700 -0.509600 0.178600 +vn -0.457300 0.247000 -0.854300 +vn -0.316000 0.141600 -0.938100 +vn -0.195400 0.051700 -0.979400 +vn -0.642800 0.012900 -0.765900 +vn -0.784800 0.115000 -0.608900 +vn -0.529700 -0.212800 -0.821100 +vn -0.747000 -0.170200 -0.642700 +vn -0.592100 -0.087100 -0.801200 +vn -0.852000 -0.126200 -0.508200 +vn -0.878600 -0.081800 -0.470400 +vn -0.820200 -0.084100 -0.565800 +vn -0.872000 -0.046300 -0.487400 +vn -0.407000 -0.380000 -0.830600 +vn -0.647000 -0.251300 -0.719800 +vn -0.446600 -0.327300 -0.832700 +vn -0.762000 -0.169800 -0.624900 +vn -0.792300 -0.174200 -0.584700 +vn -0.662600 -0.242400 -0.708700 +vn 0.662200 0.199000 0.722400 +vn 0.785100 0.157700 0.598900 +vn 0.638200 0.295200 0.711000 +vn 0.791500 0.223500 0.568900 +vn 0.776800 0.189900 0.600500 +vn 0.633600 0.311600 0.708100 +vn 0.500200 0.280600 0.819200 +vn 0.551900 0.257400 0.793100 +vn 0.021300 0.850000 -0.526400 +vn -0.461200 0.737500 -0.493300 +vn -0.482700 0.781200 -0.395800 +vn -0.743300 0.544200 -0.389200 +vn -0.746300 0.546400 -0.380100 +vn -0.741300 0.560700 -0.369000 +vn 0.024500 0.939900 -0.340600 +vn -0.496300 0.817400 -0.292700 +vn 0.891400 -0.224600 0.393600 +vn 0.812300 -0.529600 0.244100 +vn 0.818500 -0.428100 0.383300 +vn 0.368700 -0.922600 -0.113300 +vn 0.167200 -0.950600 -0.261400 +vn -0.374200 -0.728100 -0.574300 +vn -0.341500 -0.624600 -0.702300 +vn -0.150700 -0.784800 -0.601100 +vn -0.162100 -0.813900 -0.557900 +vn 0.847300 0.015500 0.530800 +vn 0.776500 0.158100 0.610000 +vn 0.794400 0.123800 0.594600 +vn 0.753000 0.214000 0.622200 +vn 0.773800 0.157000 0.613600 +vn 0.812800 0.146200 0.563900 +vn 0.858800 -0.016600 0.512000 +vn 0.835000 0.133900 0.533700 +vn 0.876200 -0.215900 0.430800 +vn 0.847600 -0.287900 0.445700 +vn 0.851300 -0.082200 0.518200 +vn 0.824800 -0.392900 0.406600 +vn 0.794900 -0.168000 0.583000 +vn 0.798600 -0.048600 0.599900 +vn 0.596800 0.307300 0.741200 +vn 0.719500 0.275000 0.637700 +vn -0.859000 0.332200 -0.389600 +vn -0.822800 0.356200 -0.442800 +vn -0.860100 0.377200 -0.343400 +vn -0.785400 0.409000 -0.464600 +vn -0.833700 0.390000 -0.391000 +vn -0.801500 0.433900 -0.411600 +vn 0.845100 -0.146300 0.514300 +vn 0.772100 0.072000 0.631400 +vn 0.737900 -0.147700 0.658600 +vn 0.865000 -0.060300 0.498200 +vn 0.771500 -0.080000 0.631200 +vn 0.630700 0.045500 0.774700 +vn 0.540800 0.162000 0.825400 +vn 0.751800 -0.099900 0.651700 +vn 0.680400 -0.000600 0.732900 +vn 0.639100 0.099400 0.762700 +vn 0.404100 0.328700 0.853600 +vn 0.446200 0.305500 0.841200 +vn 0.367100 -0.280600 -0.886800 +vn 0.790400 -0.372000 -0.486700 +vn 0.681900 -0.403300 -0.610200 +vn 0.876500 -0.481300 -0.003200 +vn 0.797600 -0.376900 -0.471000 +vn 0.913100 -0.404200 0.053500 +vn 0.711200 -0.093100 -0.696800 +vn 0.848100 -0.301300 -0.435900 +vn 0.782300 -0.341800 -0.520800 +vn 0.615000 -0.232000 -0.753600 +vn 0.061700 0.934700 0.349900 +vn -0.369900 0.928900 -0.016400 +vn -0.072500 0.965500 0.250100 +vn -0.461700 0.864800 -0.197200 +vn -0.369000 0.927900 -0.053000 +vn 0.052000 0.872900 0.485100 +vn 0.431200 0.731500 0.528200 +vn 0.220500 0.503600 0.835300 +vn -0.073300 0.669100 0.739600 +vn 0.097600 0.553700 0.827000 +vn -0.348200 0.741200 0.574000 +vn -0.249600 0.719100 0.648500 +vn -0.294900 0.921500 0.252600 +vn -0.450400 0.850400 0.271900 +vn -0.612200 0.787600 -0.069300 +vn -0.695000 0.718600 0.022000 +vn -0.748700 0.662000 -0.033800 +vn -0.640700 0.755500 -0.137000 +vn 0.904400 0.424300 -0.044200 +vn 0.896800 0.441900 0.021300 +vn 0.743300 0.474800 -0.471300 +vn 0.926900 0.327200 0.183900 +vn 0.727100 0.561800 -0.394600 +vn 0.899400 0.417600 -0.129400 +vn 0.391000 0.546200 -0.740800 +vn 0.495400 0.419100 -0.760900 +vn 0.333600 -0.809400 0.483400 +vn 0.461100 -0.708800 0.533900 +vn 0.627500 -0.628000 0.460300 +vn 0.584200 -0.625200 0.517500 +vn 0.662500 -0.597000 0.452400 +vn 0.835100 -0.504800 0.218600 +vn 0.585300 -0.686100 0.432100 +vn 0.788000 -0.497600 0.362600 +vn 0.636400 -0.548000 0.542900 +vn 0.697700 -0.567600 0.437000 +vn 0.872600 -0.458700 0.168000 +vn 0.917200 -0.286500 -0.276900 +vn 0.901900 -0.196200 -0.384900 +vn 0.924100 -0.381200 0.028100 +vn 0.938700 -0.217700 -0.267300 +vn 0.897800 -0.374600 0.231800 +vn 0.978000 -0.208200 -0.015300 +vn 0.877400 -0.357600 0.319700 +vn 0.777200 -0.503200 0.377700 +vn 0.773200 -0.213200 -0.597300 +vn 0.734200 -0.214400 -0.644200 +vn 0.827400 -0.237900 -0.508700 +vn 0.890900 -0.382600 -0.244900 +vn 0.777700 0.019500 -0.628400 +vn 0.307900 0.325100 -0.894100 +vn 0.913200 0.077800 -0.400100 +vn 0.512200 0.407900 -0.755800 +vn 0.987900 0.109500 -0.109500 +vn 0.967900 -0.177600 0.177900 +vn 0.607600 -0.049200 -0.792700 +vn 0.514900 -0.061600 -0.855000 +vn 0.075000 0.164300 -0.983600 +vn 0.161300 0.222500 -0.961500 +vn 0.418700 0.210600 -0.883400 +vn 0.503600 0.086500 -0.859600 +vn 0.962900 -0.090100 -0.254500 +vn 0.613100 -0.079000 -0.786000 +vn 0.968900 -0.215300 -0.122200 +vn 0.955200 -0.158600 0.249900 +vn 0.926500 -0.001200 -0.376300 +vn 0.734300 -0.205000 -0.647100 +vn 0.826400 -0.304000 -0.474000 +vn 0.963700 -0.258000 0.068400 +vn 0.935000 -0.264900 0.235900 +vn 0.826200 -0.170500 0.536900 +vn 0.901000 -0.192400 0.388800 +vn -0.636200 0.771000 0.028500 +vn -0.495200 0.792100 0.356800 +vn -0.375500 0.902300 0.211600 +vn -0.227900 0.819700 0.525600 +vn 0.121500 0.722500 0.680600 +vn 0.047700 0.907800 0.416700 +vn 0.424600 0.515000 0.744700 +vn 0.656300 0.233700 0.717400 +vn 0.424800 0.711300 0.560000 +vn 0.680400 0.389100 0.621000 +vn -0.711700 0.657100 -0.248400 +vn -0.464500 0.879500 -0.103500 +vn -0.010300 0.993500 0.113500 +vn -0.026100 0.989000 -0.145300 +vn 0.809600 0.028000 0.586300 +vn 0.849000 0.093300 0.520000 +vn 0.829600 -0.321900 0.456100 +vn 0.829500 -0.266200 0.491000 +vn 0.735200 0.490700 0.467600 +vn 0.923900 0.101100 0.368900 +vn 0.952800 0.088800 0.290300 +vn 0.922500 0.347300 0.168300 +vn 0.523600 0.848300 0.079200 +vn 0.853600 0.443500 0.273500 +vn 0.633700 0.766600 -0.103600 +vn 0.437400 0.840000 0.321000 +vn 0.889400 -0.440700 0.121800 +vn 0.854400 -0.385100 0.349000 +vn 0.830100 -0.162400 0.533500 +vn 0.800300 -0.063900 0.596100 +vn 0.472400 -0.013600 -0.881300 +vn -0.006600 0.168400 -0.985700 +vn 0.392300 -0.005600 -0.919800 +vn 0.081100 -0.067300 -0.994400 +vn 0.339900 -0.064400 -0.938300 +vn 0.301700 -0.144100 -0.942400 +vn 0.432300 -0.389000 -0.813600 +vn -0.156600 0.024500 -0.987400 +vn -0.106900 -0.139800 -0.984400 +vn -0.034100 -0.412700 -0.910200 +vn 0.885900 -0.430400 -0.172900 +vn 0.624800 -0.640400 -0.446700 +vn -0.245800 0.086000 -0.965500 +vn -0.093100 0.123500 -0.988000 +vn -0.146000 -0.074500 -0.986500 +vn -0.076700 -0.220000 -0.972500 +vn 0.089500 -0.987800 -0.127100 +vn -0.343700 -0.805800 -0.482200 +vn 0.286300 -0.886300 -0.364000 +vn -0.177000 -0.720800 -0.670200 +vn 0.689400 -0.712600 0.129900 +vn 0.633500 -0.700400 0.328700 +vn -0.347600 -0.486500 -0.801600 +vn -0.127300 -0.663000 -0.737700 +vn -0.163600 -0.441100 -0.882400 +vn 0.068900 -0.538300 -0.839900 +vn 0.462400 -0.822700 -0.330700 +vn -0.224100 -0.418300 -0.880200 +vn 0.152600 -0.377500 -0.913400 +vn -0.143800 -0.331900 -0.932300 +vn 0.921000 -0.385300 -0.057300 +vn 0.749900 -0.497400 -0.436200 +vn 0.448800 -0.642800 -0.620900 +vn 0.454700 -0.469800 -0.756700 +vn -0.222000 -0.564000 -0.795400 +vn 0.210300 -0.739400 -0.639500 +vn 0.720400 -0.688000 -0.088100 +vn 0.886900 -0.241300 0.394000 +vn 0.110500 -0.007000 -0.993800 +vn -0.041700 0.125900 -0.991200 +vn -0.119100 0.288300 -0.950100 +vn -0.096000 0.221400 -0.970500 +vn 0.951800 -0.286900 -0.108300 +vn 0.804900 0.029700 -0.592700 +vn 0.974900 -0.221800 -0.018900 +vn 0.315400 0.303800 -0.899000 +vn 0.860100 0.010000 -0.510100 +vn 0.350700 0.265300 -0.898100 +vn 0.980500 -0.155400 0.120700 +vn 0.933300 -0.327900 0.146200 +vn 0.863600 0.145400 -0.482800 +vn 0.948100 -0.314800 -0.045200 +vn 0.795800 0.074500 -0.600900 +vn 0.337900 0.353300 -0.872400 +vn -0.045900 0.427200 -0.903000 +vn -0.106700 0.367300 -0.924000 +vn 0.747500 0.429600 -0.506700 +vn 0.122400 0.486700 -0.865000 +vn 0.946100 -0.206300 0.249700 +vn 0.981000 0.189000 0.043400 +vn 0.907100 -0.320500 0.272700 +vn 0.953000 0.203800 -0.224100 +vn 0.638600 0.469100 0.610100 +vn 0.610900 0.457700 0.646100 +vn 0.832600 0.074000 0.548900 +vn 0.441000 0.428000 0.788900 +vn 0.767400 0.064200 0.637900 +vn 0.439200 0.182600 0.879700 +vn 0.764700 -0.053200 0.642200 +vn 0.873200 -0.105600 0.475900 +vn -0.463100 0.727300 0.506600 +vn -0.114700 0.694800 0.710000 +vn -0.411600 0.839100 0.355700 +vn 0.056300 0.816600 0.574500 +vn -0.397500 0.895700 0.199400 +vn 0.799900 0.117100 0.588500 +vn 0.839200 0.064000 0.540100 +vn 0.841200 0.025200 0.540200 +vn 0.869000 -0.159600 0.468400 +vn 0.849300 -0.402000 0.342100 +vn 0.852600 -0.333100 0.402700 +vn 0.879600 -0.207900 0.428000 +vn 0.824400 0.210200 0.525600 +vn 0.846900 0.150800 0.510000 +vn 0.877700 -0.026400 0.478400 +vn -0.515900 0.195300 0.834100 +vn -0.235700 0.082600 0.968300 +vn 0.092700 0.234400 0.967700 +vn 0.094200 0.113500 0.989100 +vn 0.368900 0.227100 0.901300 +vn 0.319600 0.189400 0.928400 +vn 0.597500 0.099000 0.795800 +vn -0.421500 0.770900 0.477500 +vn -0.466800 0.848900 0.247900 +vn -0.466400 0.877100 0.115200 +vn -0.179500 0.902700 0.391100 +vn -0.038000 0.749900 0.660500 +vn -0.447700 0.016100 0.894000 +vn -0.522700 0.399800 0.752900 +vn -0.434400 0.457800 0.775700 +vn -0.022300 0.429900 0.902600 +vn -0.419200 0.087600 0.903700 +vn 0.177400 -0.902100 0.393300 +vn 0.531700 -0.750000 0.393500 +vn 0.791700 -0.491300 0.363200 +vn 0.795300 -0.420600 0.436500 +vn 0.419500 -0.793600 0.440700 +vn -0.315000 -0.602600 0.733200 +vn 0.139600 -0.450900 0.881600 +vn -0.348000 -0.339600 0.873800 +vn 0.633300 -0.140000 0.761200 +vn 0.544800 -0.098400 0.832700 +vn 0.052700 -0.271200 0.961100 +vn -0.043000 -0.022500 0.998800 +vn 0.901500 -0.255900 0.348900 +vn 0.939900 -0.076000 0.332900 +vn 0.918400 -0.081400 0.387100 +vn 0.976500 0.121900 0.177500 +vn 0.918500 0.155500 0.363600 +vn 0.913900 0.054200 0.402200 +vn 0.900000 0.145700 0.410800 +vn 0.910300 0.247500 0.331900 +vn 0.910000 0.168700 0.378800 +vn 0.890300 0.053100 0.452200 +vn 0.849500 0.082300 0.521200 +vn 0.722400 -0.297800 0.624100 +vn -0.041400 -0.940000 0.338600 +vn 0.227300 -0.710100 0.666400 +vn -0.261200 -0.824800 0.501500 +vn 0.496300 -0.567300 0.657200 +vn 0.588200 -0.380100 0.713800 +vn 0.692700 -0.464500 0.551700 +vn 0.794400 -0.290700 0.533300 +vn 0.211900 -0.802700 0.557400 +vn 0.309400 -0.667500 0.677300 +vn 0.373100 -0.702000 0.606600 +vn 0.484700 -0.532200 0.694100 +vn 0.154000 -0.739700 0.655100 +vn 0.013700 -0.887300 0.461100 +vn -0.187600 -0.903700 0.384800 +vn 0.110700 -0.741800 0.661500 +vn 0.170700 -0.675900 0.717000 +vn -0.301700 -0.815600 0.493800 +vn -0.313600 -0.624800 0.715000 +vn 0.111300 -0.466800 0.877300 +vn -0.342200 -0.297400 0.891300 +vn -0.063100 0.152700 0.986300 +vn -0.031800 -0.163800 0.986000 +vn 0.493500 -0.042900 0.868700 +vn -0.144500 0.328200 0.933500 +vn 0.923700 0.021100 0.382400 +vn 0.798700 -0.003900 0.601700 +vn 0.927100 0.276800 0.252900 +vn 0.970800 0.082900 0.224900 +vn 0.895700 -0.271600 0.352100 +vn 0.802900 -0.262100 0.535500 +vn 0.695200 -0.509600 0.506900 +vn 0.593600 -0.596500 0.540300 +vn -0.136000 -0.198600 0.970600 +vn 0.034600 -0.243900 0.969200 +vn 0.317200 0.026800 0.948000 +vn 0.204700 -0.301600 0.931200 +vn 0.418800 -0.099900 0.902600 +vn 0.534600 0.048500 0.843700 +vn 0.266900 0.073300 0.960900 +vn 0.554300 0.218800 0.803000 +vn 0.670700 0.292200 0.681700 +vn 0.688000 0.304800 0.658600 +vn 0.606200 0.024700 0.795000 +vn 0.770300 0.310900 0.556700 +vn 0.746100 0.426600 0.511200 +vn 0.481000 -0.208800 0.851500 +vn 0.200000 -0.400600 0.894100 +vn 0.195700 -0.519500 0.831700 +vn 0.685200 -0.040100 0.727300 +vn 0.517200 -0.300000 0.801600 +vn 0.569300 -0.425200 0.703700 +vn 0.236900 -0.665000 0.708300 +vn 0.325300 -0.765200 0.555600 +vn 0.753700 -0.145200 0.641000 +vn 0.562000 -0.628500 0.537800 +vn 0.774000 0.441300 0.454100 +vn 0.818300 0.276300 0.504100 +vn 0.886000 0.096200 0.453600 +vn 0.778000 0.385300 0.496300 +vn 0.611200 0.000500 0.791500 +vn 0.529200 0.209600 0.822200 +vn 0.719100 0.057000 0.692600 +vn 0.734900 0.185500 0.652300 +vn 0.914100 0.246700 0.321800 +vn 0.842600 0.319200 0.433700 +vn 0.785000 0.326600 0.526400 +vn 0.715900 0.261600 0.647300 +vn 0.973700 0.112900 0.198100 +vn 0.873800 0.222700 0.432300 +vn 0.930000 0.064300 0.361800 +vn 0.863300 0.110200 0.492500 +vn 0.736500 0.152000 0.659100 +vn 0.703400 0.208000 0.679700 +vn 0.485400 0.046100 0.873100 +vn 0.331100 -0.240600 0.912400 +vn -0.286200 -0.145100 0.947100 +vn 0.270700 0.070700 0.960100 +vn 0.059600 0.920200 0.386900 +vn -0.176900 0.879900 0.441100 +vn 0.354100 0.687300 0.634200 +vn 0.174700 0.797400 0.577600 +vn 0.624700 0.441300 0.644200 +vn 0.461500 0.673300 0.577600 +vn 0.710200 0.280100 0.645800 +vn 0.666300 0.443400 0.599400 +vn 0.757600 0.219300 0.614800 +vn 0.749400 0.062100 0.659300 +vn 0.809300 0.016900 0.587100 +vn 0.729600 -0.200600 0.653800 +vn 0.804600 -0.044700 0.592200 +vn 0.827800 0.015300 0.560800 +vn 0.910600 -0.152300 0.384100 +vn 0.801300 -0.170600 0.573400 +vn 0.951000 -0.157900 0.266000 +vn 0.967600 0.160500 0.194900 +vn 0.903300 0.186300 0.386300 +vn 0.978100 -0.004700 0.208000 +vn 0.877200 0.185400 0.442800 +vn 0.857200 0.104200 0.504400 +vn 0.908900 0.043800 0.414800 +vn 0.838900 -0.027800 0.543600 +vn 0.865500 -0.086100 0.493400 +vn 0.951500 0.101600 0.290400 +vn 0.895900 0.099500 0.433000 +vn 0.892500 0.200900 0.403800 +vn 0.883000 0.152500 0.443900 +vn 0.962800 0.024100 0.269300 +vn 0.971500 -0.016200 0.236400 +vn 0.989300 -0.014600 0.145400 +vn 0.948400 -0.134700 0.287200 +vn 0.941700 -0.229800 0.245900 +vn 0.901600 -0.121900 0.415000 +vn 0.934100 -0.038600 0.355000 +vn 0.802900 -0.595700 0.021900 +vn 0.483600 -0.733900 -0.477000 +vn 0.457300 -0.749800 0.478200 +vn 0.191300 -0.749100 -0.634300 +vn 0.310500 -0.877100 0.366500 +vn 0.145300 -0.976200 0.160700 +vn 0.197600 -0.834700 0.514000 +vn 0.273700 -0.705900 0.653300 +vn 0.550700 -0.494900 0.672200 +vn 0.673100 -0.629000 0.388900 +vn 0.795400 -0.553000 0.248000 +vn 0.853300 -0.441200 0.277900 +vn 0.863500 -0.406400 0.298800 +vn 0.865500 -0.257100 0.429800 +vn 0.857300 -0.257000 0.446200 +vn 0.648500 0.047100 -0.759700 +vn 0.371500 -0.048500 -0.927200 +vn 0.740300 -0.123100 -0.660900 +vn 0.272700 -0.104400 -0.956400 +vn 0.411500 -0.185500 -0.892300 +vn 0.305300 -0.221200 -0.926200 +vn 0.965400 0.069000 -0.251500 +vn 0.935800 0.194100 -0.294300 +vn 0.902600 0.072600 -0.424300 +vn 0.947000 0.105600 -0.303200 +vn 0.833500 0.095500 -0.544100 +vn 0.967800 -0.185300 -0.170100 +vn 0.990700 0.124800 -0.055000 +vn 0.962800 0.198300 0.183400 +vn 0.974000 0.211600 -0.081400 +vn 0.995700 0.005700 -0.092600 +vn 0.960200 -0.276200 0.042000 +vn 0.915600 0.193300 0.352500 +vn 0.940100 -0.086100 -0.329800 +vn 0.996900 -0.049200 -0.062100 +vn 0.957800 -0.093600 0.271900 +vn 0.931700 -0.063700 -0.357700 +vn 0.687100 -0.238000 -0.686400 +vn 0.708500 -0.320800 -0.628600 +vn 0.907100 0.095700 -0.409800 +vn 0.637000 -0.452600 -0.623900 +vn 0.935000 0.037100 -0.352700 +vn 0.933800 0.094400 -0.345100 +vn 0.715200 0.688300 -0.121500 +vn 0.800000 0.592400 -0.095400 +vn 0.554400 -0.102100 -0.825900 +vn 0.321700 -0.122900 -0.938800 +vn 0.572800 -0.105200 -0.812900 +vn 0.165800 -0.132500 -0.977200 +vn 0.334700 -0.087300 -0.938300 +vn 0.167400 -0.099400 -0.980900 +vn 0.790500 -0.117000 -0.601200 +vn 0.770300 -0.070000 -0.633900 +vn 0.503200 -0.096400 -0.858800 +vn 0.708100 -0.170400 -0.685300 +vn 0.894400 -0.195800 -0.402200 +vn 0.521900 -0.486000 -0.701000 +vn 0.312300 -0.407800 -0.858000 +vn 0.168200 -0.272500 -0.947300 +vn 0.139300 -0.159800 -0.977300 +vn 0.346300 -0.053500 -0.936600 +vn 0.244300 -0.059900 -0.967900 +vn 0.248800 -0.469800 -0.847000 +vn 0.256400 -0.588600 -0.766700 +vn 0.193000 -0.378900 -0.905100 +vn -0.672400 0.739800 0.021400 +vn -0.515200 0.846900 0.131700 +vn -0.134600 0.972100 0.192100 +vn -0.432800 0.896000 0.099600 +vn 0.049400 0.995000 0.087100 +vn 0.329400 0.929800 0.164200 +vn 0.467100 0.850900 0.240300 +vn 0.834700 0.548300 -0.051300 +vn -0.167700 0.838300 0.518800 +vn -0.230000 0.831000 0.506500 +vn -0.598400 0.781900 0.174400 +vn -0.290600 0.817000 0.498100 +vn -0.623100 0.764800 0.163900 +vn -0.487600 0.851600 0.192200 +vn 0.281700 0.564900 0.775600 +vn 0.606400 0.476900 0.636300 +vn 0.289600 0.891400 0.348700 +vn 0.892600 0.273900 -0.358200 +vn 0.970600 0.196800 0.138500 +vn -0.437000 0.894700 0.092600 +vn -0.097600 0.859200 0.502300 +vn 0.132000 0.901500 0.412200 +vn 0.380300 0.532000 0.756500 +vn 0.555500 0.381400 0.738800 +vn 0.463500 0.657000 0.594600 +vn -0.099200 0.970800 0.218500 +vn 0.598200 0.364100 0.713900 +vn 0.251500 0.775000 0.579800 +vn 0.148400 0.763100 0.629000 +vn -0.303100 0.952000 -0.042600 +vn -0.253500 0.966200 -0.047500 +vn -0.311800 0.907000 0.283200 +vn 0.185500 0.660800 0.727300 +vn -0.076200 0.991800 0.102600 +vn 0.666300 0.681300 -0.303200 +vn 0.826400 0.019000 0.562800 +vn 0.915700 -0.024600 0.401100 +vn 0.859200 -0.095600 0.502500 +vn 0.865600 -0.136500 0.481700 +vn 0.999300 -0.031500 0.018400 +vn 0.980400 -0.171200 -0.097600 +vn 0.894200 -0.102800 0.435800 +vn 0.860200 -0.135000 0.491700 +vn 0.900200 -0.146000 0.410400 +vn 0.829700 -0.174500 0.530200 +vn 0.856800 -0.158000 0.490900 +vn 0.805000 -0.158300 0.571700 +vn 0.880500 -0.097600 0.463900 +vn 0.908800 -0.138500 0.393500 +vn 0.768200 -0.463700 -0.441400 +vn 0.947700 -0.318400 0.023600 +vn 0.905400 -0.406400 0.123000 +vn 0.908800 -0.219000 0.355200 +vn 0.861300 -0.192700 0.470100 +vn 0.646300 -0.621200 -0.443100 +vn 0.886500 -0.436200 0.154500 +vn 0.654800 -0.311300 -0.688700 +vn 0.572600 -0.630100 -0.524500 +vn 0.933600 -0.358200 0.010300 +vn 0.770700 -0.085600 -0.631400 +vn 0.421300 -0.544700 -0.725100 +vn 0.346000 -0.623200 -0.701300 +vn 0.935700 -0.157200 0.315700 +vn 0.996100 -0.077300 -0.043200 +vn 0.986300 -0.165000 -0.006900 +vn 0.844200 -0.165600 0.509800 +vn 0.946900 0.024800 0.320600 +vn 0.936000 -0.024100 0.351300 +vn 0.854100 -0.136500 0.501800 +vn 0.898900 -0.138000 0.415900 +vn 0.901500 -0.101100 0.420700 +vn 0.904500 -0.064300 0.421600 +vn 0.930100 -0.021900 0.366500 +vn 0.948000 -0.071200 0.310200 +vn 0.885900 -0.179900 0.427500 +vn 0.883500 -0.176500 0.434000 +vn 0.901900 -0.133600 0.410800 +vn 0.956600 -0.119600 0.265800 +vn 0.840200 -0.421100 0.341700 +vn 0.937000 -0.244800 0.249000 +vn 0.976700 -0.157100 0.145900 +vn 0.987100 -0.143900 0.070800 +vn 0.182900 -0.216100 -0.959100 +vn 0.133000 -0.444500 -0.885900 +vn 0.083500 -0.510500 -0.855800 +vn 0.118100 -0.585000 -0.802400 +vn 0.019800 -0.603500 -0.797100 +vn 0.024000 -0.678700 -0.734000 +vn 0.058000 -0.267200 -0.961900 +vn 0.257800 -0.571600 -0.779000 +vn 0.232900 -0.824100 -0.516300 +vn 0.157600 -0.866600 -0.473500 +vn 0.088400 -0.787000 -0.610600 +vn 0.185300 -0.898000 -0.399100 +vn 0.154100 -0.841100 -0.518500 +vn 0.271500 -0.722500 -0.635900 +vn 0.083300 -0.753500 -0.652200 +vn 0.127100 -0.720600 -0.681600 +vn 0.237400 -0.608700 -0.757100 +vn 0.446500 -0.698200 -0.559600 +vn 0.371900 -0.775400 -0.510400 +vn 0.089100 -0.497500 -0.862900 +vn 0.288700 -0.466300 -0.836200 +vn -0.353800 -0.285900 -0.890600 +vn -0.457900 -0.474300 -0.752000 +vn 0.073400 -0.706200 -0.704100 +vn -0.647700 -0.283000 -0.707400 +vn -0.237100 -0.543800 -0.805000 +vn -0.654100 -0.229000 -0.721000 +vn -0.383200 -0.685500 -0.619100 +vn 0.122800 -0.869400 -0.478600 +vn -0.399300 -0.599700 -0.693500 +vn 0.148100 -0.782400 -0.604900 +vn -0.278600 -0.726600 -0.628100 +vn 0.103900 -0.844200 -0.525800 +vn -0.027000 -0.945900 -0.323400 +vn 0.549000 -0.808700 -0.211200 +vn 0.511100 -0.858600 -0.039300 +vn 0.193400 -0.957000 -0.216200 +vn 0.560800 -0.825300 0.065800 +vn 0.402800 -0.915200 -0.006600 +vn -0.536100 -0.554500 -0.636500 +vn -0.245500 -0.849200 -0.467500 +vn -0.619500 -0.458900 -0.636900 +vn -0.479700 -0.596400 -0.643600 +vn -0.046700 -0.918000 -0.393900 +vn 0.368200 -0.790100 -0.490100 +vn 0.488900 -0.827700 -0.275500 +vn 0.630600 -0.745700 -0.215300 +vn 0.487400 -0.859700 -0.152800 +vn 0.603600 -0.795500 -0.053600 +vn 0.617500 -0.750700 -0.234600 +vn 0.576700 -0.681500 -0.450500 +vn 0.672300 -0.625700 -0.395600 +vn 0.825200 -0.559700 -0.076600 +vn 0.616700 -0.787100 -0.012600 +vn 0.748300 -0.663300 -0.005500 +vn 0.864200 -0.455900 -0.212800 +vn 0.417000 -0.902100 -0.111500 +vn 0.235700 -0.962600 -0.133400 +vn 0.531600 -0.844200 0.069200 +vn 0.651200 -0.751300 0.107000 +vn 0.715700 -0.693300 0.084500 +vn 0.685800 -0.713000 -0.146100 +vn 0.690200 -0.722800 0.035300 +vn 0.663400 -0.741100 -0.103800 +vn 0.283300 -0.718400 -0.635300 +vn 0.176700 -0.743200 -0.645300 +vn -0.311800 -0.486200 -0.816300 +vn -0.562700 -0.328800 -0.758500 +vn -0.686600 -0.260800 -0.678600 +vn -0.573900 -0.215800 -0.790000 +vn -0.350300 -0.391200 -0.851000 +vn -0.550300 -0.414300 -0.724900 +vn -0.677400 -0.291800 -0.675300 +vn -0.672900 -0.256100 -0.693900 +vn -0.467700 -0.402600 -0.786900 +vn -0.228500 -0.638900 -0.734600 +vn -0.544700 -0.400700 -0.736700 +vn -0.375400 -0.555300 -0.742100 +vn -0.665100 -0.278300 -0.692900 +vn -0.613000 -0.367200 -0.699500 +vn 0.089000 -0.753800 -0.651100 +vn -0.204100 -0.636800 -0.743500 +vn -0.668400 -0.319300 -0.671700 +vn -0.672700 -0.301700 -0.675600 +vn 0.310400 -0.769600 -0.558000 +vn 0.451700 -0.646000 -0.615400 +vn -0.056200 -0.581400 -0.811700 +vn 0.458900 -0.552700 -0.695700 +vn -0.011200 -0.509400 -0.860500 +vn -0.087800 -0.409800 -0.907900 +vn -0.160700 -0.240100 -0.957300 +vn 0.371100 -0.440600 -0.817400 +vn 0.288700 -0.242800 -0.926100 +vn 0.263800 -0.062600 -0.962500 +vn -0.171400 -0.073800 -0.982400 +vn 0.629400 -0.066900 -0.774200 +vn 0.663700 -0.225100 -0.713300 +vn 0.722000 -0.397000 -0.566700 +vn 0.889800 -0.329700 -0.315600 +vn 0.777300 -0.484300 -0.401600 +vn 0.885800 -0.453900 0.096100 +vn 0.913200 -0.213200 0.347200 +vn 0.911600 -0.265700 0.313600 +vn 0.907800 -0.050500 0.416400 +vn 0.843900 -0.536300 0.012700 +vn 0.919400 -0.351100 0.177300 +vn 0.969600 -0.241100 -0.040400 +vn 0.948300 -0.118800 0.294200 +vn 0.959000 -0.235700 0.157200 +vn 0.913100 -0.383900 -0.137400 +vn 0.626300 -0.001700 0.779600 +vn 0.822500 -0.006600 0.568700 +vn 0.739100 0.126800 0.661500 +vn 0.892900 -0.047700 0.447600 +vn 0.736700 0.198700 0.646400 +vn 0.855900 0.023500 0.516700 +vn 0.936300 -0.187700 0.296900 +vn 0.923100 -0.383700 0.024100 +vn 0.792800 -0.542900 -0.277100 +vn 0.711700 -0.668900 -0.214700 +vn 0.734300 -0.657200 -0.170300 +vn 0.573800 -0.741500 -0.347900 +vn 0.307300 -0.794000 -0.524600 +vn 0.057700 -0.922800 0.380900 +vn 0.397700 -0.836200 0.377700 +vn -0.152100 -0.974600 0.164300 +vn 0.284100 -0.927900 0.241500 +vn 0.609800 -0.736900 0.291800 +vn 0.713300 -0.555400 0.427500 +vn -0.499800 -0.392100 -0.772300 +vn -0.674900 -0.199200 -0.710600 +vn -0.593400 -0.217100 -0.775100 +vn -0.637400 -0.205200 -0.742800 +vn -0.594300 -0.465700 -0.655600 +vn -0.631700 -0.569100 -0.526400 +vn -0.442900 -0.648700 0.618900 +vn -0.356300 -0.426300 0.831500 +vn -0.680800 -0.589700 0.434400 +vn -0.570500 -0.366000 0.735200 +vn -0.255500 -0.936600 0.239600 +vn -0.385900 -0.843600 0.373500 +vn -0.137300 -0.824600 0.548700 +vn -0.165400 -0.645800 0.745400 +vn -0.128600 -0.475700 0.870200 +vn 0.875400 -0.377300 0.302200 +vn 0.925900 -0.165800 0.339500 +vn 0.917400 0.034800 0.396500 +vn 0.869600 0.131000 0.476100 +vn 0.774600 -0.348700 0.527600 +vn 0.901400 -0.226700 0.368900 +vn 0.763000 -0.588800 0.266800 +vn 0.828800 -0.545700 0.123500 +vn 0.637600 -0.760200 0.125000 +vn 0.504300 -0.843800 -0.183400 +vn 0.417400 -0.902600 0.105900 +vn 0.246000 -0.959200 -0.139000 +vn -0.379300 -0.864700 -0.329400 +vn -0.524800 -0.481700 -0.701800 +vn -0.189200 -0.871700 -0.452000 +vn -0.512600 -0.848200 -0.133400 +vn 0.022000 -0.999200 -0.032500 +vn 0.020300 -0.860700 -0.508600 +vn -0.651000 -0.288600 -0.702100 +vn -0.708500 -0.229200 -0.667500 +vn -0.423400 -0.557700 -0.713900 +vn -0.698500 -0.272000 -0.661900 +vn 0.247300 -0.940200 -0.234300 +vn 0.141700 -0.927000 -0.347300 +vn 0.184100 -0.916700 -0.354700 +vn 0.446900 -0.403600 -0.798400 +vn 0.399100 -0.647900 -0.648800 +vn 0.671100 -0.505800 -0.542000 +vn 0.850000 -0.332600 -0.408400 +vn 0.846500 -0.395600 -0.356100 +vn 0.710400 0.582600 -0.394800 +vn 0.399800 0.691300 -0.601800 +vn 0.978900 0.200100 0.042400 +vn 0.105000 0.616900 -0.780000 +vn 0.543100 0.438700 -0.715900 +vn 0.851500 0.423200 -0.309600 +vn 0.785000 0.138500 -0.603900 +vn 0.996600 -0.001600 0.082900 +vn 0.158600 0.146900 -0.976300 +vn 0.171400 -0.003300 -0.985200 +vn 0.176100 -0.023900 -0.984100 +vn 0.560300 -0.132500 -0.817700 +vn 0.225200 0.162500 -0.960600 +vn 0.963900 -0.090300 -0.250300 +vn 0.900900 -0.224100 -0.371700 +vn 0.983600 0.121900 -0.132700 +vn 0.998700 -0.050400 0.004000 +vn 0.994300 -0.024700 -0.103400 +vn -0.590900 0.095800 -0.801100 +vn 0.027100 0.329600 -0.943700 +vn -0.560600 0.254300 -0.788100 +vn 0.086600 0.334300 -0.938500 +vn 0.011600 0.473700 -0.880600 +vn -0.172300 0.455400 -0.873400 +vn -0.618100 0.332700 -0.712300 +vn -0.890900 -0.102300 -0.442500 +vn -0.892000 -0.095600 -0.441700 +vn -0.552300 -0.026800 -0.833200 +vn -0.600700 0.018600 -0.799200 +vn -0.878400 -0.066600 -0.473300 +vn -0.864800 -0.125600 -0.486200 +vn -0.494800 -0.129400 -0.859300 +vn 0.054300 0.109100 -0.992500 +vn 0.149500 -0.020800 -0.988500 +vn 0.145300 0.221400 -0.964300 +vn 0.039200 0.193200 -0.980400 +vn 0.170500 0.314300 -0.933900 +vn 0.840300 0.440300 -0.316400 +vn -0.157200 0.654700 -0.739300 +vn 0.867600 0.381000 -0.319600 +vn 0.271200 0.672000 -0.689200 +vn -0.036100 0.684900 -0.727800 +vn -0.601100 0.482400 -0.637100 +vn -0.702700 0.413200 -0.579200 +vn -0.846800 -0.022700 -0.531500 +vn -0.847800 0.025200 -0.529700 +vn -0.871900 -0.001600 -0.489700 +vn -0.878300 0.017400 -0.477800 +vn -0.726900 0.068700 -0.683300 +vn -0.849000 0.060800 -0.524800 +vn -0.840600 0.030200 -0.540800 +vn -0.807900 0.113700 -0.578200 +vn -0.772000 0.298400 -0.561300 +vn -0.871700 0.194900 -0.449700 +vn -0.877500 0.304900 -0.370200 +vn -0.883900 0.183400 -0.430200 +vn -0.881200 0.273700 -0.385600 +vn -0.758100 0.443500 -0.478100 +vn -0.485000 0.488500 -0.725300 +vn -0.466100 0.610900 -0.640000 +vn -0.502200 0.390700 -0.771400 +vn -0.789700 0.202900 -0.579000 +vn -0.858300 0.118800 -0.499300 +vn -0.879300 0.084400 -0.468700 +vn -0.848400 0.223000 -0.480100 +vn -0.840100 0.296900 -0.453900 +vn -0.719000 0.359300 -0.594900 +vn -0.815800 0.349700 -0.460700 +vn -0.829100 0.160200 -0.535700 +vn -0.692000 0.335400 -0.639300 +vn -0.289000 0.600400 -0.745700 +vn -0.348300 0.527800 -0.774700 +vn 0.981000 -0.122800 0.150300 +vn 0.997700 0.067300 -0.011600 +vn 0.981000 -0.109900 0.159600 +vn 0.995900 0.045500 0.078800 +vn 0.990600 -0.075600 0.114200 +vn 0.990900 -0.002200 0.134800 +vn 0.979100 -0.118800 0.165100 +vn 0.976800 -0.128400 0.171600 +vn 0.874400 -0.027900 0.484400 +vn 0.913400 -0.017000 0.406800 +vn 0.954800 -0.039700 0.294600 +vn 0.777300 -0.137400 0.614000 +vn 0.824900 -0.074600 0.560300 +vn 0.833200 -0.172300 0.525400 +vn 0.772000 -0.129300 0.622300 +vn 0.701400 -0.068700 0.709500 +vn 0.904800 0.360200 -0.227300 +vn 0.574800 0.525300 -0.627400 +vn 0.992700 -0.072400 0.096900 +vn 0.061700 0.634400 -0.770500 +vn 0.998300 0.014000 -0.057000 +vn 0.923500 0.251400 -0.289700 +vn 0.977700 -0.160200 0.135400 +vn 0.984800 -0.138000 0.105100 +vn -0.334600 0.575400 -0.746300 +vn -0.778400 0.372200 -0.505500 +vn -0.695900 0.444800 -0.563800 +vn 0.694200 0.470700 -0.544500 +vn -0.728200 0.560600 -0.394300 +vn -0.338800 0.936200 -0.093500 +vn -0.769700 0.551200 -0.322000 +vn -0.706600 0.704900 -0.062300 +vn -0.353200 0.702300 -0.618000 +vn 0.345600 0.854100 -0.388700 +vn 0.965600 0.226700 0.127100 +vn 0.985100 0.097300 0.141800 +vn 0.994300 -0.022300 0.104300 +vn 0.979000 0.105800 0.174400 +vn 0.982000 -0.103500 0.157900 +vn 0.990900 -0.091000 0.099600 +vn 0.984300 -0.071700 0.161500 +vn 0.982600 -0.061200 0.175100 +vn 0.989900 -0.039100 0.136000 +vn 0.989600 -0.076700 0.122100 +vn 0.314400 -0.936600 -0.154700 +vn -0.318200 -0.753000 -0.576000 +vn -0.685000 -0.683700 -0.251500 +vn -0.624300 -0.769000 0.137300 +vn 0.776300 -0.629300 0.035300 +vn -0.197700 -0.613200 0.764800 +vn 0.778600 -0.598900 0.187500 +vn 0.773300 -0.633100 0.034600 +vn 0.762600 -0.645500 0.041900 +vn 0.719600 -0.694400 0.006700 +vn 0.982200 -0.028800 0.185500 +vn 0.987000 -0.034300 0.157200 +vn 0.994100 -0.073500 0.079400 +vn 0.981400 -0.130100 0.141500 +vn -0.535500 0.784100 0.313700 +vn -0.118500 0.866900 0.484300 +vn 0.424300 0.853600 0.302200 +vn 0.263500 0.799500 0.539800 +vn 0.546100 0.837600 -0.014400 +vn -0.979300 0.118000 0.164700 +vn -0.979000 0.030500 0.201600 +vn -0.989100 -0.077500 0.125100 +vn -0.980900 -0.026500 0.192600 +vn -0.989800 -0.055700 0.131400 +vn -0.988200 -0.045900 0.146000 +vn -0.990100 -0.075300 0.118700 +vn -0.498300 0.500700 0.707900 +vn -0.532400 0.381100 0.755800 +vn -0.892300 0.123600 0.434300 +vn -0.565400 0.225600 0.793400 +vn -0.728700 0.026800 0.684300 +vn -0.812000 0.095200 0.575900 +vn -0.850300 -0.107000 0.515300 +vn -0.949700 -0.047000 0.309700 +vn -0.865500 0.291200 0.407700 +vn -0.950900 0.080200 0.299000 +vn -0.969300 -0.027700 0.244200 +vn 0.965400 -0.258100 -0.038300 +vn 0.960900 -0.271200 0.056100 +vn 0.899500 -0.361200 0.245700 +vn 0.961300 -0.206100 0.182700 +vn 0.924500 -0.224900 0.307600 +vn 0.248700 -0.389500 0.886800 +vn 0.805800 -0.510300 0.300300 +vn 0.106200 -0.557000 0.823700 +vn -0.205500 -0.015600 0.978500 +vn 0.189700 -0.202900 0.960600 +vn 0.220100 0.132500 0.966400 +vn 0.796200 -0.086800 0.598800 +vn 0.946600 -0.035800 0.320500 +vn -0.154900 0.074500 0.985100 +vn 0.643900 0.152800 0.749700 +vn -0.115200 -0.099900 0.988300 +vn 0.786000 0.186600 0.589400 +vn 0.681600 -0.080400 0.727300 +vn 0.718600 -0.338200 0.607700 +vn -0.114300 -0.323100 0.939400 +vn -0.016800 -0.044900 -0.998800 +vn -0.589100 -0.092000 -0.802800 +vn 0.042100 0.148800 -0.988000 +vn -0.871700 -0.111900 -0.477100 +vn -0.581000 0.105800 -0.807000 +vn -0.881600 0.045100 -0.469800 +vn -0.570500 0.281300 -0.771600 +vn 0.083800 0.316900 -0.944700 +vn -0.901300 0.162900 -0.401300 +vn -0.995800 0.069200 -0.059900 +vn -0.924800 0.265000 -0.273100 +vn -0.959100 -0.017800 0.282400 +vn -0.991600 0.112700 0.063200 +vn -0.934700 -0.034100 0.353900 +vn -0.975500 0.122000 0.183300 +vn -0.941500 0.312000 -0.127300 +vn -0.236800 0.233200 0.943200 +vn -0.192200 0.185800 0.963600 +vn -0.717600 0.017700 0.696200 +vn -0.730100 -0.028200 0.682800 +vn -0.966000 -0.095900 0.240100 +vn -0.694200 0.073000 0.716100 +vn -0.948800 -0.114200 0.294400 +vn -0.934800 -0.080000 0.346000 +vn -0.973700 -0.203000 -0.103200 +vn -0.980600 -0.116600 -0.157400 +vn -0.976000 -0.208200 -0.063800 +vn -0.859900 -0.251000 -0.444500 +vn -0.971000 -0.040100 0.235800 +vn -0.721000 -0.080800 0.688200 +vn -0.721700 -0.156300 0.674300 +vn -0.988700 0.004000 -0.150100 +vn 0.082100 0.481200 -0.872700 +vn -0.592100 0.444600 -0.672100 +vn -0.593500 0.580600 -0.557400 +vn 0.080600 0.632900 -0.770000 +vn 0.080900 0.776800 -0.624500 +vn -0.555600 0.721000 -0.414200 +vn -0.933000 0.359800 -0.011500 +vn -0.548300 0.801900 -0.237400 +vn 0.059400 0.883700 -0.464400 +vn -0.903400 -0.059400 0.424600 +vn -0.959500 0.098500 0.264000 +vn -0.887000 -0.097200 0.451400 +vn -0.868500 -0.168800 0.466000 +vn -0.911700 0.394000 0.116200 +vn 0.919100 -0.297400 -0.258400 +vn 0.751200 -0.659800 -0.019400 +vn 0.721800 -0.665800 -0.189200 +vn -0.302500 -0.829100 0.470100 +vn -0.262500 -0.921300 0.287000 +vn -0.388200 -0.880300 0.272800 +vn 0.826100 -0.496500 -0.266700 +vn 0.402600 -0.908300 -0.113300 +vn 0.658300 -0.656900 -0.367600 +vn 0.549900 -0.811800 -0.196300 +vn -0.200600 -0.938300 0.281600 +vn 0.697500 -0.714400 -0.055700 +vn -0.042200 -0.915000 0.401300 +vn 0.771000 -0.636800 0.002300 +vn 0.036400 -0.866100 0.498500 +vn 0.007100 -0.762600 0.646800 +vn 0.794100 -0.593600 0.130600 +vn -0.040900 -0.659200 0.750900 +vn 0.778600 -0.554600 0.293400 +vn 0.953100 -0.251200 -0.168900 +vn -0.616900 -0.519500 0.591300 +vn -0.626100 -0.581500 0.519500 +vn -0.853600 -0.239700 0.462500 +vn -0.679000 -0.581700 0.447800 +vn -0.666100 -0.334200 0.666800 +vn -0.644600 -0.409700 0.645500 +vn -0.703900 -0.254300 0.663200 +vn -0.086300 -0.534300 0.840900 +vn 0.752000 -0.503400 0.425600 +vn -0.135700 -0.643400 0.753400 +vn 0.734400 -0.634600 0.240700 +vn -0.289400 -0.703500 0.649100 +vn 0.806500 0.001200 -0.591200 +vn 0.530500 -0.008500 -0.847700 +vn 0.811400 0.045600 -0.582600 +vn 0.580500 0.112300 -0.806500 +vn 0.602700 0.209000 -0.770100 +vn 0.565600 0.120700 -0.815800 +vn 0.486200 -0.033700 -0.873200 +vn 0.753300 -0.044900 -0.656200 +vn 0.435400 -0.123700 -0.891700 +vn 0.731000 -0.097800 -0.675300 +vn 0.758500 -0.123500 -0.639900 +vn 0.790800 0.041200 -0.610700 +vn 0.782300 -0.074600 -0.618400 +vn 0.350000 -0.210000 -0.912900 +vn 0.220500 -0.353800 -0.909000 +vn 0.704000 -0.146200 -0.695000 +vn 0.699400 -0.168000 -0.694700 +vn 0.732500 -0.146000 -0.665000 +vn -0.650500 0.294300 0.700200 +vn -0.655700 0.289200 0.697500 +vn -0.520900 0.392200 0.758200 +vn -0.707100 0.253600 0.660100 +vn -0.706800 0.279000 0.650000 +vn -0.176800 0.461500 0.869400 +vn -0.600200 0.319500 0.733300 +vn 0.769600 0.548400 -0.326900 +vn 0.791800 0.490800 -0.363500 +vn 0.521900 0.817200 -0.244400 +vn 0.797300 0.430300 -0.423300 +vn 0.524200 0.765700 -0.372700 +vn 0.524100 0.696800 -0.489800 +vn 0.037700 0.955500 -0.292500 +vn 0.020200 0.997000 -0.074800 +vn -0.161100 -0.982800 0.090000 +vn -0.644000 -0.657100 0.391700 +vn -0.785100 -0.286700 0.549000 +vn 0.339300 -0.876500 -0.341500 +vn -0.553700 -0.780900 0.289100 +vn 0.498600 -0.426600 -0.754600 +vn 0.610400 -0.576500 -0.543200 +vn 0.214600 -0.896000 -0.388700 +vn 0.113500 -0.764400 -0.634600 +vn -0.803900 0.346100 0.483600 +vn -0.728500 0.319600 0.605800 +vn -0.813900 0.311100 0.490700 +vn -0.761300 0.309400 0.569800 +vn -0.728500 0.222600 0.647800 +vn -0.889200 0.132700 0.437900 +vn -0.929700 0.018700 0.367800 +vn -0.575400 0.291900 0.764000 +vn -0.733400 -0.159300 0.660900 +vn -0.667900 0.459500 0.585400 +vn -0.793700 -0.394000 0.463400 +vn -0.818700 0.054100 0.571700 +vn -0.850500 -0.206400 0.483700 +vn -0.888800 0.174600 0.423700 +vn -0.709500 0.493800 0.502700 +vn 0.829500 0.395300 -0.394500 +vn 0.883100 0.273600 -0.381300 +vn 0.797500 0.358500 -0.485200 +vn 0.843300 0.240000 -0.481000 +vn 0.882200 0.180700 -0.434700 +vn 0.913300 0.189400 -0.360600 +vn -0.569800 0.263000 0.778500 +vn -0.648500 0.404900 0.644600 +vn -0.714000 -0.002100 0.700200 +vn -0.865600 0.107200 0.489100 +vn -0.915200 0.009600 0.402800 +vn -0.766500 0.106500 0.633300 +vn -0.603700 0.145600 0.783800 +vn -0.652300 0.065800 0.755100 +vn -0.470900 0.302500 0.828700 +vn -0.706900 -0.033400 0.706500 +vn -0.537400 0.210500 0.816600 +vn -0.633100 0.082200 0.769700 +vn -0.344000 0.395300 0.851700 +vn -0.254600 0.476000 0.841800 +vn -0.808200 -0.446800 -0.383700 +vn -0.701700 -0.392400 -0.594600 +vn -0.765700 -0.379900 -0.519000 +vn -0.418000 -0.327200 -0.847500 +vn -0.868600 -0.412700 -0.274100 +vn -0.895000 -0.371600 -0.246700 +vn -0.705700 -0.378900 -0.598600 +vn -0.468200 -0.233400 -0.852200 +vn -0.431400 -0.254600 -0.865500 +vn -0.645700 -0.363500 -0.671500 +vn 0.258500 0.953800 0.153300 +vn 0.343100 0.922600 -0.176200 +vn -0.259900 0.802300 0.537400 +vn 0.441000 0.838100 -0.321000 +vn 0.355800 0.928900 -0.103000 +vn -0.010100 0.968300 0.249400 +vn -0.569600 0.528800 0.629300 +vn -0.745200 0.303500 0.593800 +vn 0.307500 0.685600 0.659900 +vn -0.067000 0.561900 0.824500 +vn 0.470300 0.719000 0.511800 +vn 0.045100 0.637400 0.769200 +vn 0.680500 0.730500 -0.056800 +vn 0.743300 0.649900 -0.158700 +vn 0.544700 0.804300 -0.237600 +vn 0.621600 0.782900 0.024400 +vn 0.285000 0.944200 0.165300 +vn 0.605000 0.754500 -0.254300 +vn -0.214500 0.876000 0.431900 +vn -0.874800 0.256700 -0.410900 +vn -0.954300 0.270000 -0.128000 +vn -0.820400 0.450200 -0.352500 +vn -0.957100 0.286200 -0.044300 +vn -0.909200 0.376900 -0.176700 +vn -0.884600 0.392400 -0.251900 +vn -0.671900 0.445300 -0.591800 +vn -0.761600 0.450000 -0.466400 +vn -0.904200 -0.415900 -0.097000 +vn -0.812600 -0.558900 0.165400 +vn -0.920600 -0.387400 0.048700 +vn -0.689200 -0.518400 0.506200 +vn -0.744200 -0.615000 0.260600 +vn -0.405900 -0.722400 0.559800 +vn -0.751700 -0.638700 0.164100 +vn -0.954800 -0.266200 0.132300 +vn -0.891300 -0.453400 0.001100 +vn -0.865900 -0.473000 -0.162900 +vn -0.832000 -0.496400 -0.247600 +vn -0.736600 -0.387800 -0.554100 +vn -0.999400 -0.004100 -0.033500 +vn -0.938100 0.054500 -0.341900 +vn -0.980600 -0.082400 -0.177700 +vn -0.790700 0.088700 -0.605700 +vn -0.868000 -0.094400 -0.487600 +vn -0.994400 -0.074100 0.075600 +vn -0.599800 0.046500 -0.798800 +vn -0.752700 -0.164800 -0.637400 +vn -0.437300 0.032200 -0.898700 +vn -0.538900 -0.175800 -0.823800 +vn -0.644200 0.279500 -0.712000 +vn -0.838900 0.159100 -0.520500 +vn -0.391800 0.271000 -0.879200 +vn -0.642100 0.164600 -0.748700 +vn -0.971900 0.106000 -0.210200 +vn -0.090000 0.134800 -0.986800 +vn -0.352200 0.023400 -0.935600 +vn -0.497200 0.094300 -0.862500 +vn -0.194800 0.214300 -0.957100 +vn -0.758000 -0.173800 0.628600 +vn -0.890800 -0.241700 0.384700 +vn -0.796100 -0.233300 0.558400 +vn -0.927200 -0.278200 -0.250900 +vn -0.936900 -0.279500 0.210100 +vn -0.843900 -0.218200 -0.490100 +vn -0.962200 -0.270800 0.027300 +vn -0.848300 -0.313500 0.426900 +vn -0.815200 -0.148800 0.559800 +vn -0.841000 -0.205500 0.500600 +vn -0.924700 -0.284300 0.253300 +vn -0.950600 -0.308900 0.031500 +vn -0.732300 -0.128700 0.668700 +vn -0.200600 0.667100 0.717400 +vn 0.573400 0.777800 0.257500 +vn 0.188700 0.824600 0.533300 +vn 0.663900 0.744700 -0.068800 +vn -0.089400 0.877600 0.471000 +vn -0.467000 0.420600 0.777900 +vn -0.468100 0.605900 0.643200 +vn -0.609500 0.220300 0.761600 +vn 0.364100 0.913400 0.182000 +vn 0.481900 0.871200 -0.093700 +vn 0.721800 0.637600 -0.269100 +vn -0.009600 0.983500 0.180700 +vn -0.854600 -0.245300 0.457600 +vn -0.827200 -0.239000 0.508600 +vn -0.908000 0.066800 0.413600 +vn -0.794600 -0.242200 0.556600 +vn -0.830400 0.088800 0.550000 +vn -0.743400 0.071600 0.665000 +vn -0.753200 0.388700 0.530700 +vn -0.854000 0.390900 0.343300 +vn -0.941900 0.074600 0.327400 +vn -0.898800 0.375400 0.226400 +vn -0.930300 0.052700 0.362900 +vn -0.561500 0.825600 -0.055000 +vn -0.545100 0.822000 0.164900 +vn -0.654800 0.312900 0.688000 +vn -0.494600 0.763100 0.416000 +vn -0.710200 0.013500 0.703800 +vn -0.787300 -0.267400 0.555600 +vn -0.846400 -0.261600 0.463800 +vn -0.728300 -0.045100 0.683800 +vn -0.211400 -0.103700 -0.971900 +vn -0.259000 -0.051000 -0.964500 +vn -0.077200 0.069600 -0.994600 +vn -0.157900 -0.091300 -0.983200 +vn -0.226700 -0.171400 -0.958800 +vn -0.145800 -0.176700 -0.973400 +vn -0.312200 -0.539100 -0.782200 +vn -0.345800 -0.432600 -0.832700 +vn -0.862600 -0.505900 -0.005300 +vn -0.362900 -0.362000 -0.858600 +vn -0.869400 -0.451100 -0.201800 +vn -0.849700 -0.412800 -0.328200 +vn -0.900800 -0.251500 0.353900 +vn -0.037600 -0.344900 -0.937900 +vn -0.068600 -0.259300 -0.963400 +vn -0.234700 -0.248300 -0.939800 +vn 0.308700 -0.647500 -0.696800 +vn -0.340600 -0.913900 -0.220900 +vn 0.415100 -0.797200 -0.438300 +vn -0.285500 -0.958200 0.019800 +vn -0.710800 -0.601000 0.365500 +vn -0.720400 -0.628400 0.293400 +vn -0.855300 -0.510400 -0.088800 +vn -0.411000 -0.548700 -0.728000 +vn -0.140000 -0.650200 -0.746800 +vn 0.064900 -0.401600 -0.913500 +vn 0.294800 -0.379800 -0.876800 +vn -0.750900 -0.660400 -0.009600 +vn 0.151700 -0.394500 -0.906300 +vn 0.079900 -0.363100 -0.928300 +vn -0.231900 -0.402700 -0.885500 +vn -0.643300 -0.474700 -0.600600 +vn -0.872900 -0.459300 -0.164200 +vn 0.208100 -0.480200 -0.852100 +vn -0.394600 -0.759700 -0.516900 +vn -0.776600 -0.602000 0.185500 +vn -0.785700 -0.090600 0.612000 +vn -0.687300 -0.328200 -0.648000 +vn -0.487500 -0.155700 -0.859100 +vn -0.339800 -0.011600 -0.940400 +vn -0.761600 -0.111500 -0.638400 +vn -0.663900 0.061700 -0.745300 +vn -0.963700 -0.201000 -0.175800 +vn -0.537900 0.229500 -0.811100 +vn -0.924500 -0.098400 -0.368100 +vn -0.875700 -0.443900 0.190100 +vn -0.882400 -0.391400 0.261000 +vn -0.460200 0.362000 -0.810600 +vn -0.891200 0.045100 -0.451400 +vn -0.590800 0.447800 -0.671200 +vn -0.920100 0.149000 -0.362200 +vn -0.873800 -0.370800 0.314600 +vn -0.863300 -0.423600 0.274500 +vn -0.238000 0.099200 -0.966200 +vn -0.195000 0.227400 -0.954100 +vn -0.229600 0.337100 -0.913100 +vn -0.402600 0.398700 -0.824000 +vn -0.933600 0.222000 -0.281100 +vn -0.935600 0.296200 -0.192000 +vn -0.996000 -0.074000 0.050200 +vn -0.937800 -0.274100 0.213100 +vn -0.331100 0.105000 0.937700 +vn -0.316700 0.337700 0.886400 +vn -0.696500 0.257500 0.669800 +vn -0.344300 0.444000 0.827200 +vn -0.588700 0.409200 0.697200 +vn -0.694100 0.133800 0.707300 +vn -0.915500 0.116300 0.385200 +vn -0.188500 0.699400 0.689400 +vn 0.073400 0.604000 0.793600 +vn 0.433500 0.643600 0.630800 +vn 0.295800 0.838000 0.458600 +vn -0.895500 -0.211300 0.391600 +vn -0.849100 0.008700 0.528200 +vn -0.857600 0.168000 0.486200 +vn -0.791000 0.151600 0.592800 +vn -0.844300 -0.424200 0.327400 +vn -0.906000 -0.080400 0.415500 +vn -0.839200 -0.309900 0.446900 +vn -0.937000 -0.044700 0.346400 +vn -0.895700 0.145400 0.420100 +vn -0.822800 0.268500 0.500900 +vn 0.392100 0.338900 0.855200 +vn 0.028900 0.353800 0.934900 +vn 0.551500 0.294000 0.780600 +vn 0.520000 0.316500 0.793300 +vn -0.317600 0.280700 0.905700 +vn 0.173100 0.402100 0.899100 +vn -0.445300 0.336500 0.829700 +vn -0.552200 0.349300 0.757000 +vn -0.092500 0.403800 0.910100 +vn 0.002900 0.956500 0.291800 +vn 0.273100 0.960500 0.053300 +vn 0.372800 0.856900 0.356100 +vn 0.114700 0.824100 0.554700 +vn 0.452100 0.639900 0.621400 +vn 0.060200 0.575800 0.815300 +vn 0.480000 0.438500 0.759900 +vn 0.525400 0.434300 0.731700 +vn 0.487200 0.135300 0.862700 +vn -0.068000 0.369100 0.926900 +vn 0.456500 0.192200 0.868700 +vn -0.919300 -0.107400 0.378700 +vn -0.976700 -0.139000 0.163500 +vn -0.507400 -0.659000 0.555300 +vn -0.747500 -0.630400 0.209300 +vn 0.040700 -0.993900 0.102800 +vn 0.309100 -0.927600 0.209600 +vn -0.360900 -0.155100 0.919600 +vn 0.024100 -0.226700 0.973700 +vn -0.434700 -0.226100 0.871800 +vn 0.090400 -0.529600 0.843400 +vn 0.364800 -0.277400 0.888800 +vn 0.090200 0.102400 0.990600 +vn -0.980100 0.036900 0.195200 +vn -0.989700 -0.034300 0.138900 +vn -0.984800 -0.061400 0.162400 +vn -0.967300 -0.022500 0.252600 +vn -0.995000 0.095700 0.028300 +vn -0.981500 0.172500 0.082600 +vn -0.948200 0.317700 0.000400 +vn -0.971000 0.235200 0.042500 +vn -0.925700 0.171500 0.337300 +vn -0.959400 0.105400 0.261500 +vn -0.756700 -0.030300 0.653100 +vn -0.881700 0.008000 0.471700 +vn -0.696800 -0.129600 0.705500 +vn -0.096200 -0.641600 0.761000 +vn 0.432900 -0.839400 0.328500 +vn -0.954600 -0.244500 0.170400 +vn -0.905000 -0.377700 0.196000 +vn -0.766700 -0.125100 0.629700 +vn -0.635200 -0.314500 0.705400 +vn -0.503800 -0.223900 0.834300 +vn -0.323200 -0.567500 0.757300 +vn -0.258500 -0.607900 0.750700 +vn 0.087300 -0.901500 0.423900 +vn 0.352700 -0.930200 0.101500 +vn -0.186000 -0.964200 0.188900 +vn 0.371800 -0.912000 0.173300 +vn -0.168400 -0.791300 0.587800 +vn 0.367900 -0.661100 0.653900 +vn 0.245000 -0.876800 0.413800 +vn -0.241200 -0.734000 0.634900 +vn 0.190000 -0.633000 0.750500 +vn -0.276000 -0.351800 0.894400 +vn -0.132700 0.192900 0.972200 +vn -0.140000 -0.050900 0.988800 +vn 0.345700 -0.218200 0.912600 +vn 0.155800 0.406900 0.900100 +vn -0.917400 0.130900 0.375900 +vn -0.700200 -0.036300 0.713100 +vn -0.982100 -0.023700 0.186800 +vn -0.960300 0.276700 0.035500 +vn -0.820100 -0.376500 0.430800 +vn -0.645000 -0.494800 0.582300 +vn -0.897500 -0.066700 0.436000 +vn -0.655000 0.081300 0.751300 +vn -0.579200 -0.020600 0.814900 +vn -0.685800 0.163600 0.709200 +vn -0.483500 -0.129300 0.865800 +vn -0.517300 0.016400 0.855600 +vn -0.313800 -0.181500 0.932000 +vn -0.543900 -0.021800 0.838800 +vn -0.794600 0.141800 0.590400 +vn -0.726100 0.148300 0.671400 +vn -0.706600 0.109700 0.699100 +vn -0.730000 0.279600 0.623600 +vn -0.749000 0.261600 0.608800 +vn -0.781600 0.258800 0.567600 +vn -0.682600 0.210700 0.699700 +vn -0.468000 -0.251800 0.847100 +vn -0.469700 -0.198900 0.860100 +vn -0.652300 -0.012000 0.757800 +vn -0.629800 -0.033800 0.776000 +vn -0.477300 -0.387100 0.788900 +vn -0.457900 -0.305400 0.834900 +vn -0.653800 -0.116000 0.747700 +vn -0.659800 0.002300 0.751500 +vn -0.724400 0.167600 0.668700 +vn -0.701900 0.126900 0.700800 +vn -0.692200 0.197900 0.694100 +vn -0.704900 0.229300 0.671200 +vn -0.646700 0.082300 0.758300 +vn -0.612000 0.098100 0.784700 +vn -0.539100 0.024500 0.841900 +vn -0.454700 0.333700 0.825800 +vn -0.443700 0.263800 0.856500 +vn -0.815100 0.111700 0.568400 +vn -0.881700 0.086500 0.463800 +vn -0.814900 0.199800 0.544100 +vn -0.880400 0.012600 0.474100 +vn -0.909200 0.044700 0.414000 +vn -0.831800 0.041300 0.553500 +vn -0.849400 -0.010400 0.527600 +vn -0.878100 0.062000 0.474500 +vn -0.850900 0.011800 0.525100 +vn -0.148600 -0.210200 0.966300 +vn 0.075800 -0.222000 0.972100 +vn -0.553500 -0.093000 0.827600 +vn -0.597200 -0.305800 0.741500 +vn -0.695800 -0.131100 0.706200 +vn -0.648300 0.375600 0.662300 +vn -0.254300 0.742100 0.620200 +vn 0.348300 0.884100 0.311500 +vn -0.571100 0.395600 0.719300 +vn -0.737600 0.106800 0.666800 +vn -0.683200 0.182500 0.707100 +vn -0.802700 0.022900 0.596000 +vn -0.689500 0.057700 0.722000 +vn -0.872000 0.164100 0.461200 +vn -0.869000 0.060000 0.491200 +vn -0.725200 -0.073800 0.684600 +vn -0.694100 -0.329700 0.639900 +vn -0.958900 -0.072300 0.274500 +vn -0.939500 -0.024500 0.341800 +vn -0.881700 -0.104500 0.460000 +vn -0.965800 -0.105300 0.237100 +vn -0.879100 -0.213100 0.426300 +vn -0.672500 -0.087200 0.735000 +vn -0.725800 -0.048400 0.686200 +vn -0.815800 -0.145900 0.559600 +vn -0.780100 0.120000 0.614000 +vn -0.867100 -0.100700 0.487900 +vn -0.897700 0.163500 0.409100 +vn -0.974500 -0.153200 0.164100 +vn -0.650200 0.018300 0.759600 +vn -0.650100 0.052600 0.758000 +vn -0.750300 0.186500 0.634200 +vn -0.726900 0.215600 0.652000 +vn -0.945600 -0.206900 0.251100 +vn -0.990200 0.139700 -0.000800 +vn -0.952600 0.104900 0.285700 +vn -0.927300 0.359000 0.106000 +vn -0.873300 0.291700 0.390200 +vn -0.979800 -0.076400 0.184800 +vn -0.870500 0.076400 0.486300 +vn -0.604800 -0.729700 0.319000 +vn -0.636000 -0.770800 -0.035300 +vn -0.705900 -0.486100 0.515100 +vn -0.509200 -0.656400 -0.556600 +vn -0.812400 -0.565900 0.140300 +vn -0.683200 -0.450600 -0.574600 +vn -0.897400 -0.268800 -0.349800 +vn -0.652900 -0.601500 0.460200 +vn -0.735000 -0.586000 0.341100 +vn -0.785200 -0.506400 0.356500 +vn -0.774800 -0.482100 0.408900 +vn -0.785000 -0.332600 0.522600 +vn -0.973200 -0.228300 0.027400 +vn -0.233700 -0.247800 -0.940200 +vn 0.006900 -0.064300 -0.997900 +vn -0.240000 -0.016300 -0.970600 +vn -0.025500 0.067800 -0.997400 +vn -0.220600 0.109000 -0.969300 +vn -0.467200 0.133900 -0.874000 +vn -0.395000 0.198700 -0.896900 +vn -0.740900 0.159100 -0.652500 +vn -0.549700 0.337100 -0.764300 +vn -0.723400 0.419800 -0.548100 +vn -0.747900 0.302800 -0.590700 +vn -0.770100 0.449000 -0.453200 +vn -0.883800 0.420100 -0.205800 +vn -0.945800 0.187000 -0.265500 +vn -0.864800 0.459100 -0.203300 +vn -0.973000 0.187800 0.134500 +vn -0.917300 0.217900 -0.333400 +vn -0.891900 0.429900 0.140600 +vn -0.838200 0.354300 0.414600 +vn -0.948100 -0.236100 0.213100 +vn -0.946300 -0.210500 -0.245300 +vn -0.946000 -0.296900 -0.130100 +vn -0.743900 -0.226700 -0.628600 +vn -0.696700 0.669600 -0.257400 +vn -0.763600 0.031600 -0.644900 +vn -0.736900 0.111600 -0.666700 +vn -0.496700 -0.287000 -0.819100 +vn -0.375600 -0.156100 -0.913500 +vn -0.266200 -0.019100 -0.963700 +vn -0.734000 0.623200 -0.270000 +vn -0.725800 0.203000 -0.657300 +vn 0.182900 -0.152500 -0.971200 +vn 0.228800 -0.238000 -0.943900 +vn 0.043000 -0.164600 -0.985400 +vn 0.068200 -0.222600 -0.972500 +vn -0.177700 -0.182500 -0.967000 +vn -0.225300 -0.238900 -0.944600 +vn -0.558700 -0.271300 -0.783700 +vn -0.816600 -0.304600 -0.490200 +vn -0.454100 -0.210700 -0.865700 +vn -0.787000 -0.440000 -0.432500 +vn -0.860800 -0.262600 -0.435900 +vn -0.518400 -0.398900 -0.756400 +vn -0.617800 -0.201400 -0.760100 +vn -0.302900 -0.093400 -0.948400 +vn 0.183500 -0.016500 -0.982900 +vn 0.164400 0.049900 -0.985100 +vn 0.017900 -0.011000 -0.999800 +vn 0.054100 -0.074400 -0.995800 +vn -0.208700 -0.263100 -0.941900 +vn -0.245900 -0.404000 -0.881100 +vn -0.010000 -0.250200 -0.968100 +vn 0.089800 -0.097400 -0.991200 +vn -0.063600 0.829800 0.554400 +vn 0.713800 0.700300 0.009500 +vn 0.460100 0.858500 0.226500 +vn 0.731500 0.666600 0.143300 +vn -0.562200 0.699800 0.440800 +vn 0.585800 0.746000 0.316700 +vn -0.157700 0.973700 0.164500 +vn 0.052400 0.967100 0.249100 +vn 0.425700 0.868100 0.255200 +vn 0.065900 0.795500 0.602400 +vn 0.552200 0.698500 0.455100 +vn 0.170200 0.659700 0.732000 +vn 0.448100 0.714300 0.537600 +vn -0.900300 0.332900 -0.280400 +vn -0.250900 0.932000 0.261700 +vn -0.960800 0.209100 0.182100 +vn 0.163800 0.708200 0.686700 +vn -0.675800 0.601300 0.426300 +vn -0.194000 0.599700 0.776400 +vn -0.906000 0.036500 0.421800 +vn -0.275400 0.877700 0.392100 +vn -0.186500 0.835700 0.516600 +vn 0.088200 0.994900 -0.049100 +vn 0.176800 0.979100 0.100400 +vn -0.434500 0.556900 0.707900 +vn -0.476000 0.740000 0.475100 +vn -0.357200 0.562600 0.745600 +vn -0.425900 0.802900 0.417000 +vn -0.299000 0.736400 0.606900 +vn -0.175500 0.967100 0.183900 +vn 0.146900 0.984400 -0.096900 +vn -0.215200 0.569600 0.793300 +vn -0.631900 0.672800 -0.384800 +vn -0.002000 0.962100 0.272700 +vn -0.840800 -0.093100 0.533300 +vn -0.838900 -0.048500 0.542100 +vn -0.916300 -0.031700 0.399300 +vn -0.905300 -0.070100 0.418900 +vn -0.981700 -0.065100 0.179000 +vn -0.908000 -0.004600 0.418800 +vn -0.689800 -0.040100 0.722900 +vn -0.695400 -0.029700 0.718000 +vn -0.839400 -0.213700 0.499700 +vn -0.820500 -0.150300 0.551500 +vn -0.718600 -0.071600 0.691700 +vn -0.809900 -0.051200 0.584300 +vn -0.911700 -0.276900 0.303700 +vn -0.894300 -0.445500 -0.042200 +vn -0.964400 -0.261600 0.037800 +vn -0.868500 -0.493400 -0.048400 +vn -0.910900 -0.390300 -0.133600 +vn -0.737300 -0.550600 -0.391500 +vn -0.758700 -0.444100 -0.476600 +vn -0.964000 -0.266000 -0.000300 +vn -0.827500 -0.159700 -0.538300 +vn -0.599800 -0.386900 -0.700400 +vn -0.738700 -0.040100 -0.672800 +vn -0.492300 -0.507600 -0.707100 +vn -0.957500 -0.248300 -0.146700 +vn -0.971000 -0.196600 0.135900 +vn -0.858400 -0.105600 0.502100 +vn -0.960600 -0.058900 0.271500 +vn -0.763000 -0.010100 0.646300 +vn -0.903700 -0.058100 0.424300 +vn -0.855900 -0.090400 0.509300 +vn -0.968200 -0.103700 0.227700 +vn -0.957800 -0.095400 0.271000 +vn -0.965400 -0.117500 0.232900 +vn -0.980000 -0.104400 0.169300 +vn -0.991100 -0.110200 0.074900 +vn -0.972100 -0.106700 0.208900 +vn -0.930100 -0.087300 0.356800 +vn -0.989500 -0.108500 0.095300 +vn -0.970300 -0.120500 0.209700 +vn -0.991200 -0.128000 0.035000 +vn -0.980500 -0.141300 0.136800 +vn -0.972000 -0.211300 0.103100 +vn -0.937700 -0.330900 0.105900 +vn -0.989400 -0.145300 -0.000400 +vn -0.154200 -0.600400 -0.784700 +vn 0.254400 -0.566600 -0.783700 +vn -0.137300 -0.522900 -0.841200 +vn 0.225200 -0.517300 -0.825600 +vn 0.134200 -0.471000 -0.871800 +vn 0.220500 -0.399300 -0.889900 +vn 0.202600 -0.212400 -0.956000 +vn -0.365000 -0.394100 -0.843500 +vn 0.071500 -0.718800 -0.691500 +vn -0.142800 -0.743000 -0.653900 +vn -0.355000 -0.587800 -0.727000 +vn -0.274400 -0.775500 -0.568500 +vn -0.366400 -0.606800 -0.705400 +vn -0.357600 -0.650700 -0.669900 +vn -0.117900 -0.652100 -0.748900 +vn -0.171400 -0.668800 -0.723400 +vn 0.052200 -0.596100 -0.801200 +vn -0.007600 -0.713700 -0.700400 +vn 0.157600 -0.661100 -0.733600 +vn 0.201600 -0.203400 -0.958100 +vn -0.028200 -0.223400 -0.974300 +vn -0.009600 -0.436600 -0.899600 +vn -0.270600 -0.492000 -0.827500 +vn -0.211500 -0.275100 -0.937900 +vn -0.195100 -0.524200 -0.829000 +vn 0.008600 -0.645000 -0.764100 +vn 0.514100 -0.405400 -0.755900 +vn -0.118000 -0.340400 -0.932800 +vn 0.123300 -0.641600 -0.757100 +vn -0.096800 -0.673200 -0.733100 +vn -0.021900 -0.674500 -0.738000 +vn 0.280500 -0.619300 -0.733300 +vn 0.441200 -0.461200 -0.769800 +vn 0.002900 -0.887600 -0.460700 +vn 0.026200 -0.848800 -0.528100 +vn 0.345100 -0.790600 -0.505800 +vn 0.080600 -0.765800 -0.638100 +vn 0.400500 -0.621800 -0.673100 +vn 0.549500 -0.533300 -0.643200 +vn 0.215700 -0.868200 -0.446800 +vn 0.377800 -0.767500 -0.518000 +vn 0.555000 -0.526000 -0.644400 +vn 0.532700 -0.517700 -0.669500 +vn 0.405300 -0.627400 -0.664900 +vn 0.297400 -0.756200 -0.582900 +vn 0.027200 -0.864900 -0.501100 +vn 0.210800 -0.880000 -0.425600 +vn -0.531600 -0.773700 -0.344600 +vn 0.091900 -0.869100 -0.486000 +vn 0.275100 -0.777400 -0.565700 +vn 0.453500 -0.770800 -0.447400 +vn 0.425500 -0.746000 -0.512300 +vn -0.409400 -0.799500 -0.439500 +vn -0.320700 -0.727600 -0.606400 +vn -0.840200 -0.525500 -0.133900 +vn -0.865500 -0.486800 -0.117900 +vn -0.939000 -0.343600 0.016600 +vn -0.267900 -0.864600 -0.425100 +vn 0.037000 -0.906800 -0.419900 +vn 0.326000 -0.854000 -0.405400 +vn -0.031400 -0.958900 -0.282000 +vn 0.000700 -0.809700 -0.586800 +vn -0.570500 -0.764100 -0.301200 +vn -0.295900 -0.842000 -0.451000 +vn 0.606300 -0.408100 -0.682600 +vn 0.450400 -0.571600 -0.685800 +vn 0.643600 -0.483200 -0.593600 +vn 0.683400 -0.333100 -0.649600 +vn 0.667400 -0.347900 -0.658400 +vn 0.652400 -0.350000 -0.672200 +vn 0.649900 -0.408100 -0.641200 +vn 0.357900 -0.406000 -0.840900 +vn 0.784900 -0.131600 -0.605500 +vn 0.756800 -0.195000 -0.623900 +vn 0.694600 -0.219500 -0.685100 +vn 0.728500 -0.150900 -0.668200 +vn 0.659200 -0.306800 -0.686500 +vn 0.603200 -0.332100 -0.725200 +vn 0.307700 -0.558600 -0.770200 +vn 0.620900 -0.321400 -0.715000 +vn 0.284700 -0.564300 -0.775000 +vn 0.379300 -0.532200 -0.756900 +vn -0.160700 -0.721100 -0.673900 +vn -0.186500 -0.718200 -0.670400 +vn 0.629800 -0.319800 -0.707900 +vn 0.661500 -0.266400 -0.701000 +vn 0.285100 -0.354100 -0.890700 +vn 0.282000 -0.461700 -0.841000 +vn -0.236100 -0.591600 -0.770900 +vn 0.307100 -0.295300 -0.904700 +vn -0.245300 -0.381900 -0.891100 +vn 0.376300 -0.239100 -0.895100 +vn 0.454200 -0.152400 -0.877800 +vn -0.133700 -0.330100 -0.934400 +vn -0.053300 -0.242100 -0.968800 +vn -0.598000 -0.343100 -0.724400 +vn -0.868500 -0.290700 -0.401500 +vn -0.573300 -0.274300 -0.772100 +vn -0.920300 -0.313100 -0.234800 +vn -0.896500 -0.302900 -0.323300 +vn -0.672200 -0.371000 -0.640700 +vn -0.705000 -0.420500 -0.571200 +vn -0.911900 -0.406600 0.055700 +vn -0.856000 0.066400 0.512800 +vn -0.966100 -0.198200 0.165400 +vn -0.942500 -0.162500 0.292000 +vn -0.845200 -0.512000 -0.153500 +vn -0.691500 -0.674200 -0.259500 +vn -0.876400 0.020300 0.481100 +vn -0.910500 -0.035200 0.412100 +vn -0.979800 -0.199900 0.009500 +vn -0.978000 -0.175000 0.113300 +vn -0.667600 0.135200 0.732200 +vn -0.666700 0.200500 0.717800 +vn -0.719900 0.200900 0.664400 +vn -0.865100 0.020000 0.501100 +vn -0.954900 -0.181100 0.235200 +vn -0.916900 -0.385500 -0.103900 +vn -0.896100 -0.443600 -0.017100 +vn -0.639700 -0.670300 -0.376300 +vn -0.678700 -0.555700 -0.480200 +vn -0.271400 -0.455700 -0.847800 +vn -0.031800 -0.732500 -0.680000 +vn -0.413800 -0.771800 -0.482700 +vn -0.569000 -0.697100 -0.436200 +vn -0.670300 -0.474100 0.570900 +vn -0.438600 -0.767300 0.467800 +vn -0.697900 -0.071900 0.712600 +vn -0.148100 -0.884500 0.442500 +vn -0.270700 -0.702600 0.658100 +vn -0.556200 -0.489200 0.671800 +vn 0.355300 -0.788000 -0.502800 +vn 0.604500 -0.486700 -0.630600 +vn 0.634700 -0.525100 -0.567000 +vn 0.469300 -0.812400 -0.346000 +vn 0.690800 -0.566500 -0.449200 +vn -0.107300 -0.666800 0.737500 +vn 0.080700 -0.421800 0.903100 +vn 0.480000 -0.365500 0.797500 +vn 0.565800 -0.584000 0.582100 +vn 0.181900 -0.882800 0.433200 +vn -0.162400 -0.511800 0.843600 +vn -0.149600 -0.641800 0.752200 +vn 0.027700 -0.753000 0.657500 +vn 0.105000 -0.612800 0.783300 +vn -0.192200 -0.369400 0.909200 +vn -0.815500 0.231500 0.530400 +vn -0.908800 -0.120100 0.399600 +vn -0.857000 -0.210200 0.470500 +vn -0.776000 -0.318200 0.544600 +vn -0.760400 0.178200 0.624500 +vn -0.713600 0.123700 0.689600 +vn -0.390000 -0.916700 -0.087400 +vn -0.679000 -0.722600 0.130000 +vn -0.805200 -0.589600 0.064000 +vn -0.530600 -0.822900 -0.203100 +vn -0.530100 -0.813300 0.239800 +vn -0.251900 -0.959900 0.122600 +vn -0.084500 -0.960900 -0.263600 +vn 0.061000 -0.998000 -0.014300 +vn 0.186200 -0.937900 0.292600 +vn 0.170300 -0.779000 -0.603500 +vn -0.251900 -0.886400 -0.388400 +vn 0.684200 -0.315300 -0.657600 +vn 0.528400 -0.502800 -0.684100 +vn 0.645200 -0.364800 -0.671300 +vn -0.227500 -0.796900 -0.559600 +vn -0.010800 -0.906300 -0.422500 +vn 0.344100 -0.817700 -0.461500 +vn 0.155300 -0.701600 -0.695400 +vn -0.268200 -0.572500 -0.774800 +vn -0.428800 -0.548600 -0.717700 +vn -0.788800 -0.441000 -0.428200 +vn -0.850500 -0.297600 -0.433800 +vn -0.858500 -0.463000 -0.220400 +vn -0.761600 0.042600 -0.646700 +vn -0.459100 0.262000 -0.848900 +vn -0.815900 0.312700 -0.486200 +vn 0.063200 0.424100 -0.903400 +vn -0.238300 0.612400 -0.753800 +vn -0.530800 0.655100 -0.537700 +vn -0.985000 0.037100 -0.168400 +vn -0.953600 0.254400 -0.161200 +vn 0.190900 -0.005900 -0.981600 +vn 0.173400 0.011800 -0.984800 +vn 0.192000 0.141800 -0.971100 +vn -0.475400 -0.109400 -0.873000 +vn 0.103400 0.127700 -0.986400 +vn -0.928800 -0.196600 -0.314200 +vn -0.975300 -0.132600 -0.176600 +vn -0.995300 -0.069200 -0.067100 +vn -0.999700 0.012500 0.021700 +vn -0.997600 -0.064200 0.025100 +vn 0.315400 0.262800 -0.911800 +vn 0.494300 0.274900 -0.824700 +vn 0.408800 0.192200 -0.892200 +vn 0.531900 0.166100 -0.830300 +vn 0.525100 0.170800 -0.833700 +vn 0.459400 0.417000 -0.784300 +vn 0.530400 0.283500 -0.798900 +vn 0.443500 0.030400 -0.895700 +vn 0.492900 0.167800 -0.853800 +vn 0.238200 -0.014300 -0.971100 +vn 0.445200 -0.006800 -0.895400 +vn 0.330900 -0.092100 -0.939200 +vn -0.015900 -0.079300 -0.996700 +vn 0.101700 -0.167800 -0.980600 +vn 0.014600 -0.011000 -0.999800 +vn 0.170900 0.080900 -0.982000 +vn 0.381600 0.102700 -0.918600 +vn 0.300700 0.178300 -0.936900 +vn 0.009500 0.230000 -0.973100 +vn 0.499000 0.513300 -0.698200 +vn -0.235800 0.716900 -0.656000 +vn 0.625900 0.533200 -0.569200 +vn -0.747100 0.533700 -0.396300 +vn -0.675900 0.591900 -0.439200 +vn 0.063600 0.752300 -0.655700 +vn 0.632200 0.544600 -0.551100 +vn 0.730500 0.184800 -0.657400 +vn 0.663500 0.190000 -0.723700 +vn 0.849400 0.017200 -0.527400 +vn 0.836900 0.047600 -0.545300 +vn 0.802500 0.077600 -0.591600 +vn 0.554400 0.395100 -0.732500 +vn 0.565900 0.369400 -0.737100 +vn 0.524300 0.289500 -0.800800 +vn 0.902000 0.180000 -0.392500 +vn 0.873900 0.191300 -0.447000 +vn 0.915600 0.142600 -0.375900 +vn 0.893700 0.092400 -0.439000 +vn 0.792600 0.345800 -0.502200 +vn 0.785800 0.230400 -0.574000 +vn 0.545000 0.579100 -0.606300 +vn 0.570900 0.430100 -0.699400 +vn 0.595500 0.311800 -0.740400 +vn 0.788400 0.144200 -0.597900 +vn 0.798900 0.197700 -0.568000 +vn 0.865300 0.036400 -0.500000 +vn 0.774500 0.383900 -0.502800 +vn 0.735600 0.426300 -0.526400 +vn 0.756300 0.336400 -0.561100 +vn 0.601400 0.507300 -0.617300 +vn 0.652600 0.429100 -0.624500 +vn 0.367400 0.605000 -0.706400 +vn 0.248100 0.719900 -0.648200 +vn -0.942200 0.295100 -0.159000 +vn -0.964500 0.231000 -0.128300 +vn -0.999300 0.032500 0.016100 +vn -0.998900 0.011900 0.045600 +vn -0.991500 -0.090500 0.093700 +vn -0.995300 -0.073600 0.062500 +vn -0.993700 -0.059300 0.095600 +vn -0.991900 -0.085000 0.094000 +vn -0.978400 -0.098800 0.181800 +vn -0.968300 -0.117100 0.220500 +vn -0.985900 -0.075600 0.149200 +vn -0.912600 -0.072100 0.402500 +vn -0.965500 -0.140000 0.219600 +vn -0.902700 -0.189500 0.386400 +vn -0.768500 -0.140000 0.624300 +vn -0.786100 -0.211900 0.580600 +vn -0.713200 -0.058000 0.698500 +vn -0.862900 0.342400 -0.371700 +vn -0.981700 0.133500 -0.135700 +vn -0.131200 0.628900 -0.766300 +vn -0.604100 0.556600 -0.570400 +vn -0.798100 0.522100 -0.300700 +vn -0.997600 -0.059400 0.035500 +vn -0.998300 0.055800 0.014700 +vn 0.610000 0.468100 -0.639400 +vn 0.704300 0.347600 -0.619000 +vn 0.213500 0.553100 -0.805300 +vn -0.630100 0.512400 -0.583500 +vn 0.768400 0.616200 -0.172700 +vn 0.785800 0.508800 -0.351500 +vn 0.367300 0.911700 -0.184200 +vn 0.753400 0.518100 -0.405000 +vn -0.131900 0.880700 -0.454900 +vn 0.392900 0.704900 -0.590500 +vn -0.995600 -0.054400 0.075800 +vn -0.996900 0.030100 0.073000 +vn -0.963100 0.264200 -0.051300 +vn -0.991300 -0.055800 0.119600 +vn -0.995800 -0.040400 0.082300 +vn -0.993400 -0.090100 0.070500 +vn -0.993300 -0.115400 0.008200 +vn -0.995300 -0.095600 0.017900 +vn -0.996400 -0.068200 0.049700 +vn -0.992500 -0.069300 0.100900 +vn -0.991300 -0.054300 0.119900 +vn -0.996100 -0.052900 0.070600 +vn 0.586500 -0.803400 -0.102400 +vn 0.749300 -0.613800 -0.248700 +vn 0.615100 -0.616800 -0.491200 +vn 0.746600 -0.659900 0.084600 +vn 0.137700 -0.990400 0.011600 +vn 0.366500 -0.794200 0.484600 +vn -0.871700 -0.479500 0.101100 +vn -0.814600 -0.579700 0.019100 +vn -0.930800 -0.337700 -0.140200 +vn -0.708100 -0.705200 0.036600 +vn -0.715700 -0.697700 -0.031100 +vn -0.768400 -0.616100 -0.173400 +vn -0.989600 -0.110500 0.092300 +vn -0.986700 -0.096000 0.131200 +vn -0.993300 -0.099400 0.059600 +vn -0.993500 -0.091700 0.067800 +vn 0.720400 0.680700 0.133000 +vn 0.064700 0.886800 0.457600 +vn -0.670400 0.726400 0.151400 +vn -0.761100 0.502900 0.409600 +vn -0.649600 0.751400 -0.115500 +vn 0.950600 0.029400 0.309000 +vn 0.916000 0.139400 0.376200 +vn 0.923600 0.062100 0.378400 +vn 0.969100 -0.050200 0.241400 +vn 0.951900 -0.006300 0.306500 +vn 0.972100 -0.030100 0.232600 +vn 0.983600 -0.002700 0.180500 +vn 0.975700 -0.065700 0.209100 +vn -0.000300 -0.381200 0.924500 +vn 0.179100 -0.347300 0.920500 +vn 0.151000 -0.530400 0.834200 +vn 0.313700 -0.285000 0.905700 +vn 0.293100 -0.543000 0.786900 +vn 0.278600 -0.577100 0.767700 +vn -0.026900 -0.496200 0.867800 +vn 0.134400 -0.548900 0.825000 +vn 0.560000 0.306300 0.769800 +vn 0.589500 0.250300 0.768000 +vn 0.637600 0.079600 0.766200 +vn 0.633200 0.180100 0.752700 +vn 0.680400 0.005200 0.732800 +vn 0.711000 -0.172300 0.681800 +vn 0.624700 0.125100 0.770800 +vn 0.713300 -0.115300 0.691300 +vn 0.550300 0.283500 0.785400 +vn 0.547800 0.340600 0.764100 +vn 0.648200 0.121300 0.751700 +vn 0.727100 -0.141000 0.671800 +vn 0.693100 -0.007100 0.720800 +vn 0.755800 -0.234800 0.611300 +vn 0.537200 -0.032200 0.842900 +vn 0.568200 0.134300 0.811900 +vn 0.685700 -0.215700 0.695200 +vn 0.754800 -0.364500 0.545400 +vn 0.584400 -0.397400 0.707500 +vn 0.697100 -0.474700 0.537300 +vn 0.429700 -0.180200 0.884800 +vn 0.432600 -0.504900 0.747000 +vn 0.572400 -0.558500 0.600400 +vn 0.417800 -0.591100 0.690000 +vn 0.667600 0.062100 0.741900 +vn 0.725700 -0.072100 0.684200 +vn 0.693700 -0.093900 0.714100 +vn 0.748100 -0.155500 0.645100 +vn 0.762000 -0.215800 0.610600 +vn 0.730600 -0.194700 0.654500 +vn -0.087800 -0.510800 0.855200 +vn -0.075200 -0.242200 0.967300 +vn -0.398200 -0.033000 0.916700 +vn 0.007800 0.087900 0.996100 +vn -0.306300 0.036700 0.951200 +vn -0.421200 -0.187400 0.887400 +vn -0.396900 -0.229600 0.888700 +vn -0.476000 0.040700 0.878500 +vn 0.076800 0.193800 0.978000 +vn -0.182000 -0.034400 0.982700 +vn 0.067800 0.167100 0.983600 +vn -0.083900 0.116800 0.989600 +vn -0.110300 0.099500 0.988900 +vn -0.274000 -0.306500 0.911600 +vn -0.193200 -0.279100 0.940600 +vn -0.137100 -0.360800 0.922500 +vn -0.280700 -0.352800 0.892600 +vn -0.185500 -0.446800 0.875200 +vn -0.198700 -0.432100 0.879700 +vn -0.307800 -0.325000 0.894200 +vn -0.084000 -0.035700 0.995800 +vn -0.155500 -0.158500 0.975000 +vn -0.278900 -0.231900 0.931900 +vn -0.202500 -0.061200 0.977400 +vn -0.327600 -0.201300 0.923100 +vn -0.023100 0.100700 0.994700 +vn -0.127200 0.120200 0.984600 +vn -0.257600 0.001300 0.966200 +vn -0.162200 0.147900 0.975600 +vn 0.679900 -0.052500 0.731400 +vn 0.506000 -0.071300 0.859600 +vn 0.521500 -0.412400 0.747000 +vn 0.354200 -0.259900 0.898400 +vn 0.167300 -0.557700 0.813000 +vn 0.350900 -0.437000 0.828200 +vn 0.277800 -0.431400 0.858300 +vn 0.477100 -0.414000 0.775200 +vn 0.830100 -0.223200 0.511000 +vn 0.814000 -0.121500 0.568000 +vn 0.706400 -0.445700 0.549900 +vn 0.649600 -0.437800 0.621600 +vn 0.617700 -0.425200 0.661600 +vn 0.704700 -0.413300 0.576600 +vn 0.706000 -0.264200 0.657100 +vn 0.721800 -0.345900 0.599400 +vn 0.738600 -0.258800 0.622500 +vn 0.712200 -0.350600 0.608200 +vn 0.785800 -0.212800 0.580700 +vn 0.772100 -0.304400 0.557800 +vn 0.706300 -0.407600 0.578800 +vn 0.750500 -0.333400 0.570600 +vn 0.777800 -0.248500 0.577300 +vn 0.153400 -0.721200 0.675600 +vn 0.044300 -0.877500 0.477500 +vn 0.002900 -0.743700 0.668500 +vn -0.104700 -0.709400 0.697000 +vn -0.155100 -0.497100 0.853700 +vn 0.003700 -0.710400 0.703800 +vn -0.249400 -0.449700 0.857700 +vn -0.499200 -0.044600 0.865400 +vn -0.390100 -0.210100 0.896500 +vn -0.432500 0.025400 0.901300 +vn -0.381000 -0.132800 0.915000 +vn -0.481100 -0.006600 0.876600 +vn -0.265800 -0.414400 0.870400 +vn -0.435100 -0.083500 0.896500 +vn -0.286600 0.042100 0.957100 +vn -0.265100 -0.102500 0.958800 +vn 0.016400 0.049200 0.998700 +vn 0.000400 -0.056000 0.998400 +vn 0.025800 -0.482400 0.875600 +vn 0.342900 0.003100 0.939400 +vn 0.313300 -0.065200 0.947400 +vn 0.567000 -0.059300 0.821600 +vn 0.537700 -0.134300 0.832400 +vn 0.718400 -0.115400 0.686000 +vn 0.791400 -0.138200 0.595500 +vn 0.685100 -0.214500 0.696200 +vn 0.756700 -0.259200 0.600200 +vn 0.813900 -0.209500 0.541900 +vn 0.789300 -0.216900 0.574400 +vn 0.783100 -0.232400 0.576800 +vn 0.814800 -0.142600 0.561900 +vn 0.781000 -0.214300 0.586700 +vn 0.784700 -0.221000 0.579100 +vn 0.937300 -0.005100 0.348400 +vn 0.938900 -0.014100 0.343900 +vn 0.860900 0.068900 0.504100 +vn 0.872000 0.063500 0.485400 +vn 0.862900 0.049800 0.502900 +vn 0.918700 -0.019400 0.394400 +vn 0.877800 -0.027500 0.478300 +vn 0.828200 0.031700 0.559500 +vn 0.767600 0.035300 0.640000 +vn 0.821600 -0.019300 0.569800 +vn 0.688000 0.066000 0.722700 +vn 0.614100 0.125000 0.779300 +vn 0.682700 0.070700 0.727300 +vn 0.758400 0.014000 0.651700 +vn 0.444200 0.327400 0.833900 +vn 0.511100 0.197300 0.836600 +vn 0.452600 0.179100 0.873500 +vn 0.359500 0.263700 0.895100 +vn 0.408900 0.135500 0.902400 +vn 0.115700 0.186600 0.975600 +vn 0.213700 0.273400 0.937900 +vn 0.178300 0.188400 0.965800 +vn 0.344900 0.361500 0.866200 +vn 0.263500 0.287000 0.921000 +vn 0.372000 0.394400 0.840300 +vn 0.290900 0.174100 0.940800 +vn 0.990500 0.109100 -0.084200 +vn 0.988300 0.127800 -0.082600 +vn 0.986800 -0.085000 -0.137800 +vn 0.994900 0.097900 -0.023800 +vn 0.992800 -0.101500 -0.064200 +vn 0.993100 -0.110200 0.040200 +vn 0.954700 -0.297400 0.006600 +vn 0.968600 -0.233200 -0.086100 +vn 0.896000 -0.434700 -0.090400 +vn 0.942000 -0.321600 -0.096400 +vn 0.898400 -0.437300 0.041100 +vn 0.920000 -0.361800 0.150600 +vn 0.822900 -0.566500 0.044400 +vn 0.801700 -0.569400 0.182100 +vn 0.737200 -0.618400 0.272300 +vn 0.675800 -0.722200 0.147300 +vn 0.415900 -0.871800 0.259000 +vn 0.642100 -0.730900 0.231300 +vn 0.392600 -0.871200 0.294800 +vn 0.321000 -0.846800 0.424000 +vn 0.058200 -0.707700 0.704100 +vn 0.245200 -0.855600 0.455900 +vn 0.385600 -0.734400 0.558500 +vn -0.211300 -0.318900 0.923900 +vn -0.169900 0.144600 0.974800 +vn 0.074700 -0.596000 0.799500 +vn 0.135700 0.512000 0.848200 +vn 0.105300 -0.129700 0.985900 +vn 0.114700 -0.723500 0.680700 +vn -0.005700 -0.608100 0.793800 +vn 0.580900 -0.686300 0.437700 +vn 0.709700 -0.587700 0.388500 +vn 0.816400 0.309400 0.487500 +vn 0.900700 0.250500 0.355000 +vn 0.919500 0.266600 0.288800 +vn 0.866100 0.299600 0.400200 +vn 0.859700 0.354700 0.367600 +vn 0.838700 0.413200 0.354700 +vn 0.843200 0.331300 0.423400 +vn 0.930000 0.270200 0.249400 +vn 0.557900 0.253700 0.790200 +vn 0.395000 0.157700 0.905100 +vn 0.497800 0.257400 0.828200 +vn 0.053800 0.047000 0.997400 +vn 0.295100 0.175900 0.939100 +vn -0.058800 0.093200 0.993900 +vn 0.188200 0.158000 0.969400 +vn 0.427900 0.227300 0.874800 +vn 0.923200 0.011300 0.384200 +vn 0.803600 -0.312700 0.506400 +vn 0.775400 -0.479800 0.410500 +vn 0.378600 -0.717100 0.585200 +vn 0.272700 -0.763900 0.584800 +vn 0.941900 -0.209400 0.262800 +vn 0.437700 -0.704500 0.558700 +vn 0.444000 -0.663400 0.602300 +vn 0.755800 -0.300000 0.582000 +vn 0.786800 -0.227100 0.574000 +vn 0.885100 0.110000 0.452100 +vn 0.878400 0.040900 0.476200 +vn -0.146200 0.095000 0.984700 +vn -0.275000 0.063800 0.959300 +vn -0.250900 0.037000 0.967300 +vn -0.203200 -0.034000 0.978500 +vn -0.053100 0.010100 0.998500 +vn -0.027400 0.073900 0.996900 +vn 0.030300 -0.737200 0.675000 +vn -0.017200 -0.626200 0.779500 +vn 0.246200 -0.431100 0.868100 +vn -0.061900 -0.510600 0.857600 +vn 0.150800 -0.351500 0.923900 +vn 0.444600 -0.173500 0.878700 +vn 0.339000 -0.551600 0.762100 +vn 0.503500 -0.243800 0.828900 +vn 0.580900 -0.349400 0.735200 +vn 0.594900 -0.506900 0.623800 +vn 0.645700 -0.584500 0.491400 +vn 0.396800 -0.673400 0.623700 +vn 0.463600 -0.740700 0.486200 +vn 0.083900 -0.823100 0.561600 +vn 0.464500 0.451800 0.761600 +vn 0.480200 0.389100 0.786100 +vn 0.438200 0.420400 0.794500 +vn 0.505700 0.264500 0.821100 +vn 0.475800 0.316300 0.820700 +vn 0.496400 0.172000 0.850900 +vn 0.488300 0.231200 0.841500 +vn 0.453800 0.389300 0.801500 +vn 0.417200 0.443300 0.793400 +vn 0.568100 0.326000 0.755600 +vn 0.484000 0.445500 0.753200 +vn 0.573500 0.407500 0.710700 +vn 0.548300 0.370200 0.749900 +vn 0.540500 0.447900 0.712200 +vn 0.523500 0.297100 0.798500 +vn 0.522400 0.401700 0.752200 +vn 0.498000 0.311900 0.809100 +vn 0.640600 0.214800 0.737200 +vn 0.573000 0.409200 0.710100 +vn 0.655700 0.157600 0.738400 +vn 0.611600 0.356800 0.706100 +vn 0.660800 -0.427500 0.616900 +vn 0.564700 -0.475300 0.674700 +vn 0.742700 -0.060800 0.666900 +vn 0.612300 0.219700 0.759500 +vn 0.478000 0.117100 0.870500 +vn 0.654700 0.128900 0.744800 +vn 0.545800 0.061700 0.835600 +vn 0.288100 -0.076300 0.954500 +vn 0.179700 -0.023500 0.983400 +vn 0.598400 -0.261500 0.757300 +vn 0.612900 -0.121000 0.780800 +vn 0.660100 -0.041400 0.750100 +vn 0.594500 -0.025300 0.803700 +vn 0.380200 -0.134600 0.915000 +vn 0.113900 -0.859900 0.497700 +vn 0.219300 -0.651100 0.726600 +vn 0.223800 -0.410600 0.883900 +vn 0.494600 -0.384400 0.779500 +vn 0.383700 -0.598500 0.703300 +vn 0.336900 0.103200 0.935900 +vn 0.430900 0.527900 0.731900 +vn 0.552200 0.030700 0.833200 +vn 0.461500 -0.265900 0.846400 +vn 0.661000 -0.162800 0.732500 +vn 0.681400 0.342500 0.646900 +vn 0.810700 0.076900 0.580300 +vn 0.840000 -0.164100 0.517200 +vn 0.593600 -0.259600 0.761700 +vn 0.686500 -0.329000 0.648500 +vn 0.600800 -0.228700 0.766000 +vn 0.664500 0.149300 0.732200 +vn 0.614700 -0.230200 0.754500 +vn 0.627000 0.301700 0.718200 +vn 0.585900 0.338100 0.736500 +vn 0.549000 0.322300 0.771200 +vn 0.516100 0.273500 0.811700 +vn -0.259800 0.184000 0.948000 +vn -0.007900 0.217800 0.976000 +vn -0.185000 0.389400 0.902300 +vn -0.206800 0.159900 0.965200 +vn 0.374200 0.196500 0.906300 +vn 0.096900 0.185700 0.977800 +vn -0.186000 0.298700 0.936000 +vn 0.387600 0.189400 0.902100 +vn -0.036100 0.260900 0.964700 +vn -0.007400 0.438300 0.898800 +vn -0.057400 0.355600 0.932900 +vn -0.017100 0.396700 0.917800 +vn -0.005000 -0.139700 0.990200 +vn 0.104700 -0.162000 0.981200 +vn 0.092800 0.249300 0.964000 +vn 0.204200 0.178400 0.962500 +vn 0.167000 -0.178100 0.969700 +vn 0.442300 0.114400 0.889500 +vn 0.313300 -0.184500 0.931600 +vn 0.387600 -0.233700 0.891700 +vn 0.455200 -0.002600 0.890400 +vn 0.430600 -0.191200 0.882000 +vn 0.458700 0.113700 0.881300 +vn 0.486100 0.070400 0.871100 +vn 0.489100 0.141500 0.860700 +vn 0.421900 -0.176600 0.889300 +vn 0.493600 0.190600 0.848600 +vn 0.486300 0.205300 0.849300 +vn 0.483600 0.188500 0.854800 +vn 0.476600 0.036500 0.878300 +vn 0.519100 0.097300 0.849100 +vn 0.520000 -0.066000 0.851600 +vn 0.469600 -0.167100 0.866900 +vn 0.485600 -0.009300 0.874100 +vn 0.369800 -0.281300 0.885500 +vn 0.406600 -0.103700 0.907700 +vn 0.460800 0.082900 0.883600 +vn 0.452800 -0.039500 0.890700 +vn 0.508900 0.116800 0.852900 +vn 0.277600 -0.412200 0.867800 +vn 0.365100 -0.228900 0.902400 +vn 0.267700 -0.678800 0.683700 +vn 0.139300 -0.813700 0.564400 +vn 0.232200 -0.587800 0.775000 +vn 0.029200 -0.915400 0.401500 +vn 0.371900 -0.439100 0.817900 +vn 0.460000 -0.408500 0.788400 +vn 0.375300 -0.547400 0.748000 +vn 0.485000 -0.282600 0.827600 +vn 0.532000 -0.162800 0.831000 +vn 0.423000 -0.298700 0.855500 +vn 0.468500 -0.096100 0.878200 +vn 0.271600 -0.938600 0.213000 +vn 0.289300 -0.930200 0.225900 +vn 0.568800 -0.804400 0.171400 +vn 0.276700 -0.925000 0.260600 +vn 0.568900 -0.789000 0.231800 +vn 0.755800 -0.627100 0.188400 +vn 0.537200 -0.830800 0.145700 +vn 0.748200 -0.660100 0.066700 +vn 0.707800 -0.622900 0.333300 +vn 0.529800 -0.776600 0.340800 +vn 0.224300 -0.917300 0.329000 +vn 0.817400 -0.348900 0.458400 +vn 0.774800 -0.479800 0.411800 +vn 0.690900 -0.549900 0.469400 +vn 0.682400 -0.458900 0.569000 +vn 0.760000 -0.568700 0.314600 +vn 0.738900 -0.579400 0.344000 +vn 0.738500 -0.670100 0.075300 +vn 0.804300 -0.571200 0.163500 +vn 0.622900 -0.751300 -0.218200 +vn 0.785600 -0.614700 -0.070900 +vn 0.516700 -0.814900 -0.262700 +vn 0.651400 -0.743900 -0.149200 +vn 0.667500 -0.744500 0.011600 +vn 0.640900 -0.496200 0.585600 +vn 0.531200 -0.683000 0.501400 +vn 0.657500 -0.504100 0.560000 +vn 0.362500 -0.903400 0.229000 +vn 0.358700 -0.823700 0.439200 +vn 0.779900 -0.273400 0.563000 +vn 0.574600 -0.767400 0.284400 +vn 0.511600 -0.821800 0.250700 +vn 0.567200 -0.666200 0.484100 +vn 0.545500 -0.705700 0.452100 +vn 0.623800 -0.517000 0.586100 +vn 0.586900 -0.495600 0.640300 +vn 0.598800 -0.794900 0.098200 +vn 0.540600 -0.840700 0.030600 +vn 0.409000 -0.909300 -0.076700 +vn 0.229200 -0.924200 0.305400 +vn 0.497700 -0.839800 0.216600 +vn 0.472400 -0.790000 0.390800 +vn 0.173800 -0.851000 0.495500 +vn 0.141500 -0.684400 0.715200 +vn 0.465300 -0.652900 0.597600 +vn 0.457700 -0.451800 0.765700 +vn 0.106000 -0.420000 0.901300 +vn 0.068200 -0.049700 0.996400 +vn 0.481800 -0.111200 0.869200 +vn 0.686200 -0.177200 0.705500 +vn 0.503800 0.295800 0.811600 +vn 0.060200 0.346200 0.936200 +vn 0.769700 -0.202500 0.605400 +vn 0.858300 0.122000 0.498500 +vn 0.754300 0.207600 0.622900 +vn 0.772000 0.505700 0.385000 +vn 0.763000 0.429200 0.483400 +vn 0.858900 0.371300 0.352700 +vn 0.832300 0.499500 0.240200 +vn 0.874500 0.361100 0.324000 +vn 0.776500 0.508000 0.372800 +vn 0.764400 0.510800 0.393400 +vn 0.507100 0.617900 0.600900 +vn 0.768900 0.482700 0.419300 +vn 0.523400 0.590200 0.614500 +vn 0.550700 0.536500 0.639400 +vn 0.116700 0.615000 0.779800 +vn 0.107300 0.637800 0.762700 +vn 0.507400 0.613300 0.605300 +vn 0.096000 0.640100 0.762200 +vn 0.082700 0.625400 0.775900 +vn 0.784000 0.504700 0.361300 +vn 0.514100 0.586900 0.625500 +vn 0.510100 0.516600 0.687700 +vn 0.064900 0.563600 0.823500 +vn -0.124600 -0.153400 0.980300 +vn -0.029600 -0.242100 0.969800 +vn -0.107300 -0.179800 0.977800 +vn -0.071300 -0.062500 0.995500 +vn -0.109600 -0.437200 0.892700 +vn 0.064500 -0.302200 0.951100 +vn -0.134400 -0.329900 0.934400 +vn 0.875100 0.255200 0.411100 +vn 0.821900 0.365600 0.436800 +vn 0.886000 0.188800 0.423600 +vn 0.987100 -0.060000 0.148500 +vn 0.988200 0.006900 0.153100 +vn 0.976300 0.029900 0.214200 +vn 0.975600 -0.021400 0.218400 +vn 0.960800 0.029000 0.275600 +vn 0.963000 -0.050100 0.264800 +vn 0.948200 0.057700 0.312300 +vn 0.957500 -0.001700 0.288300 +vn 0.977700 -0.072600 0.196900 +vn 0.988500 -0.081400 0.127400 +vn 0.935500 0.018300 0.353000 +vn 0.955300 0.021300 0.295000 +vn 0.686300 0.073000 0.723600 +vn 0.662800 0.205400 0.720100 +vn 0.759000 0.109200 0.641800 +vn 0.665900 0.274100 0.693900 +vn 0.763000 0.164500 0.625200 +vn 0.767400 0.181700 0.614900 +vn 0.730900 -0.198100 0.653100 +vn 0.667300 -0.012000 0.744700 +vn 0.773200 -0.085700 0.628300 +vn 0.814700 -0.213900 0.539000 +vn 0.634200 0.159100 0.756600 +vn 0.617800 0.269500 0.738700 +vn 0.452500 0.480000 0.751500 +vn 0.343800 0.393000 0.852900 +vn 0.584100 0.469700 0.662000 +vn 0.152700 0.182100 0.971300 +vn 0.501500 0.463500 0.730500 +vn 0.310800 0.303800 0.900600 +vn 0.462300 0.420700 0.780600 +vn 0.687400 0.463200 0.559400 +vn 0.796300 0.333200 0.504900 +vn 0.772600 0.390900 0.500300 +vn 0.719400 0.344900 0.602900 +vn 0.703700 0.387900 0.595300 +vn 0.741100 0.475300 0.474100 +vn 0.870200 0.333700 0.362400 +vn 0.847200 0.299000 0.439100 +vn 0.817800 0.324800 0.475100 +vn 0.791400 0.245100 0.560000 +vn 0.750200 0.299200 0.589600 +vn 0.867700 0.307000 0.391000 +vn 0.850000 0.390700 0.353500 +vn 0.833300 0.272000 0.481300 +vn 0.875800 0.352900 0.329200 +vn 0.874100 0.287500 0.391600 +vn 0.886100 0.335300 0.320100 +vn 0.902100 0.340800 0.264800 +vn 0.979100 0.034500 0.200600 +vn 0.983100 -0.161200 -0.086400 +vn 0.934400 -0.351600 -0.057200 +vn 0.835300 0.050700 0.547500 +vn 0.885100 -0.220900 0.409700 +vn 0.823200 -0.567800 0.004800 +vn 0.619800 0.226000 0.751500 +vn 0.446000 0.290100 0.846700 +vn 0.196500 0.132000 0.971600 +vn 0.464100 0.178100 0.867700 +vn 0.116700 0.155300 0.981000 +vn 0.267500 0.240000 0.933200 +vn 0.795500 0.213400 0.567200 +vn 0.958500 0.206500 0.196500 +vn 0.492300 0.129100 0.860800 +vn 0.835000 0.118200 0.537500 +vn 0.493800 0.404600 0.769700 +vn 0.480200 0.317100 0.817800 +vn 0.374300 0.434300 0.819300 +vn 0.468400 0.198700 0.860900 +vn 0.361100 0.340900 0.868000 +vn 0.304300 0.210200 0.929100 +vn 0.286000 0.350400 0.891900 +vn 0.306500 0.433600 0.847400 +vn 0.563300 0.148500 0.812800 +vn 0.295600 0.127300 0.946800 +vn 0.135800 0.142400 0.980500 +vn 0.210000 0.238500 0.948200 +vn 0.879700 0.426000 0.211200 +vn 0.961100 0.261900 0.088000 +vn 0.938200 0.344800 0.030900 +vn 0.840400 0.513700 0.172600 +vn 0.926700 0.374300 0.033500 +vn 0.923800 0.253100 0.287200 +vn 0.873300 0.353300 0.335400 +vn 0.822600 0.510500 0.250400 +vn 0.824800 0.519300 0.223600 +vn 0.984700 0.047900 0.167500 +vn 0.821200 0.545300 0.168200 +vn 0.831300 0.506000 0.229800 +vn 0.800500 0.560100 0.213300 +vn 0.843600 0.470900 0.258200 +vn 0.895500 0.388400 0.217300 +vn 0.862200 0.466000 0.198600 +vn 0.877300 0.419700 0.232800 +vn 0.877400 0.408800 0.251200 +vn 0.868300 0.408100 0.282000 +vn 0.822400 0.533600 0.197300 +vn 0.852500 0.475000 0.218000 +vn 0.791100 0.572700 0.214800 +vn 0.870100 0.329800 0.366400 +vn 0.910200 0.396600 0.119400 +vn 0.660100 0.213200 0.720300 +vn 0.755400 0.225600 0.615200 +vn 0.623000 0.364000 0.692400 +vn 0.632100 0.289400 0.718800 +vn 0.611200 0.416000 0.673300 +vn 0.486200 0.459700 0.743200 +vn 0.228100 0.449000 0.864000 +vn 0.140200 0.280600 0.949500 +vn 0.315800 0.479800 0.818600 +vn 0.088200 0.094100 0.991600 +vn 0.205400 0.321900 0.924200 +vn 0.075400 0.106800 0.991400 +vn 0.361000 0.492500 0.791900 +vn 0.291200 0.486800 0.823600 +vn 0.187100 0.238900 0.952800 +vn 0.101700 0.143000 0.984500 +vn 0.112100 0.154700 0.981600 +vn 0.201800 0.218700 0.954700 +vn 0.280900 0.417500 0.864200 +vn 0.257400 0.344100 0.903000 +vn 0.281500 0.313000 0.907100 +vn 0.306800 0.380400 0.872500 +vn 0.260200 0.187600 0.947100 +vn 0.178800 0.151400 0.972200 +vn 0.292700 0.122000 0.948400 +vn 0.374700 0.137700 0.916900 +vn 0.486600 0.092100 0.868800 +vn 0.412500 0.093100 0.906200 +vn 0.482900 0.231200 0.844600 +vn 0.466100 0.188800 0.864300 +vn 0.612000 0.131100 0.779900 +vn 0.587800 0.122700 0.799700 +vn 0.377900 0.319900 0.868800 +vn 0.350100 0.262700 0.899100 +vn 0.400000 0.255600 0.880200 +vn 0.289300 0.311400 0.905200 +vn 0.341900 0.323200 0.882400 +vn 0.206000 0.368400 0.906500 +vn 0.270700 0.397100 0.876900 +vn 0.441500 0.247600 0.862400 +vn 0.518900 0.193900 0.832500 +vn 0.571700 0.154400 0.805800 +vn 0.504400 0.305600 0.807600 +vn 0.458500 0.309800 0.832900 +vn 0.545500 0.226100 0.807000 +vn 0.395600 0.295800 0.869500 +vn 0.476800 0.262900 0.838800 +vn 0.386100 0.296100 0.873700 +vn 0.314700 0.259400 0.913100 +vn 0.226200 0.192500 0.954900 +vn 0.279800 0.309600 0.908800 +vn 0.186600 0.294800 0.937100 +vn 0.194400 0.408400 0.891900 +vn 0.256300 0.454500 0.853100 +vn 0.148800 0.126800 0.980700 +vn 0.147300 0.274700 0.950200 +vn 0.286200 0.052100 0.956800 +vn 0.054800 -0.110700 0.992300 +vn 0.177700 -0.043000 0.983100 +vn 0.612900 0.308800 0.727300 +vn 0.556900 0.306800 0.771800 +vn 0.689100 0.183200 0.701100 +vn 0.609700 0.198300 0.767400 +vn 0.744600 0.177500 0.643400 +vn 0.649700 0.299200 0.698900 +vn 0.593200 0.326300 0.735900 +vn 0.562100 0.357600 0.745700 +vn 0.534700 0.362300 0.763400 +vn 0.498800 0.327300 0.802600 +vn 0.444200 0.219400 0.868700 +vn 0.369000 0.137500 0.919200 +vn 0.477500 0.285200 0.831000 +vn -0.034600 -0.125000 0.991600 +vn -0.037100 -0.068100 0.997000 +vn 0.054700 0.044300 0.997500 +vn 0.163600 0.167100 0.972300 +vn 0.790200 0.421000 0.445400 +vn 0.810600 0.346000 0.472400 +vn 0.563400 0.475000 0.675900 +vn 0.544500 0.445500 0.710700 +vn 0.076000 0.536000 0.840800 +vn 0.107000 0.570000 0.814600 +vn 0.863400 0.390400 0.319600 +vn 0.871500 0.332600 0.360400 +vn 0.885000 0.271400 0.378400 +vn 0.813600 0.306100 0.494300 +vn 0.498400 0.450000 0.741000 +vn 0.478900 0.479100 0.735600 +vn -0.001900 0.519200 0.854600 +vn 0.032500 0.521300 0.852800 +vn 0.001700 0.548500 0.836100 +vn -0.020200 0.590300 0.806900 +vn 0.509200 0.514000 0.690300 +vn -0.023800 0.557300 0.830000 +vn 0.545500 0.472700 0.692100 +vn 0.029700 0.032700 0.999000 +vn 0.457500 -0.060700 0.887100 +vn -0.002600 -0.232400 0.972600 +vn 0.707500 -0.240100 0.664700 +vn 0.490900 -0.556800 0.670000 +vn 0.286200 -0.380500 0.879400 +vn 0.277700 -0.639300 0.717100 +vn -0.037000 -0.314000 0.948700 +vn 0.831100 0.093800 0.548200 +vn 0.535400 0.292200 0.792400 +vn 0.022200 0.359000 0.933100 +vn 0.886100 0.256600 0.386000 +vn 0.192400 -0.877000 0.440400 +vn 0.405900 -0.797500 0.446300 +vn 0.128800 -0.909700 0.394900 +vn 0.652500 -0.599100 0.464100 +vn 0.239700 -0.821600 0.517200 +vn 0.344200 -0.667400 0.660400 +vn 0.800400 0.441300 0.405800 +vn 0.911100 0.267200 0.313900 +vn 0.710600 0.413600 0.569100 +vn 0.818600 0.302600 0.488200 +vn 0.903700 0.023500 0.427500 +vn 0.953800 0.072500 0.291500 +vn 0.629900 0.510200 0.585600 +vn 0.602600 0.451600 0.658000 +vn 0.710500 0.513100 0.481500 +vn 0.289800 0.251600 0.923400 +vn 0.425400 0.291200 0.856900 +vn 0.519500 0.314300 0.794600 +vn 0.588500 0.058300 0.806400 +vn 0.494100 -0.388000 0.778000 +vn 0.840000 -0.325200 0.434400 +vn 0.912500 -0.137200 0.385300 +vn 0.763800 -0.429000 0.482300 +vn 0.303900 -0.787200 0.536600 +vn 0.516800 -0.691000 0.505400 +vn 0.100300 -0.265500 0.958900 +vn 0.150200 -0.488800 0.859400 +vn 0.213700 -0.629200 0.747300 +vn 0.200400 -0.326900 0.923600 +vn 0.165300 -0.713200 0.681200 +vn 0.016300 0.196100 0.980400 +vn 0.004800 0.213900 0.976800 +vn 0.003600 0.253200 0.967400 +vn -0.004100 0.298400 0.954400 +vn -0.049200 0.298500 0.953100 +vn 0.051100 0.287500 0.956400 +vn 0.078900 0.212900 0.973900 +vn 0.091000 0.306500 0.947500 +vn -0.007700 0.069800 0.997500 +vn -0.020800 -0.215500 0.976300 +vn -0.039400 0.051800 0.997900 +vn -0.018500 -0.205100 0.978600 +vn 0.067500 -0.002700 0.997700 +vn 0.161200 0.239500 0.957400 +vn 0.229200 0.316300 0.920600 +vn 0.223000 0.252000 0.941700 +vn 0.379900 0.218500 0.898900 +vn 0.271000 0.247200 0.930300 +vn 0.391000 0.282600 0.875900 +vn 0.575900 0.222000 0.786800 +vn 0.499200 0.210700 0.840500 +vn 0.507100 0.069900 0.859000 +vn 0.441400 -0.010700 0.897200 +vn 0.348300 -0.050400 0.936000 +vn 0.336200 -0.306200 0.890600 +vn 0.268000 -0.335700 0.903000 +vn 0.187100 -0.751900 0.632100 +vn 0.740700 0.182600 0.646500 +vn 0.761900 0.191900 0.618600 +vn 0.604800 0.150800 0.782000 +vn 0.657700 0.221800 0.719900 +vn 0.601800 0.204800 0.772000 +vn 0.673900 0.179000 0.716800 +vn 0.762000 0.137900 0.632700 +vn 0.707300 0.156300 0.689500 +vn 0.636300 0.162600 0.754100 +vn 0.834500 0.294600 0.465700 +vn 0.819700 0.202300 0.535900 +vn 0.867800 0.112800 0.484000 +vn 0.780900 0.121700 0.612700 +vn 0.841600 0.055400 0.537200 +vn 0.893400 0.034300 0.448000 +vn 0.852900 0.136100 0.504100 +vn 0.894400 0.039300 0.445600 +vn 0.889300 0.107100 0.444500 +vn 0.850500 0.148800 0.504500 +vn 0.875300 -0.078900 0.477000 +vn 0.863400 -0.075000 0.498800 +vn 0.896400 0.042800 0.441200 +vn 0.869500 0.028800 0.493000 +vn 0.892300 0.051900 0.448500 +vn 0.913700 0.026800 0.405500 +vn 0.889800 0.062200 0.452200 +vn 0.924700 0.072400 0.373700 +vn 0.810400 0.014300 0.585600 +vn 0.867300 0.060300 0.494200 +vn 0.872000 0.012800 0.489400 +vn 0.932500 0.047000 0.358000 +vn 0.891000 0.070800 0.448500 +vn 0.879400 0.083000 0.468700 +vn 0.844500 0.090300 0.527900 +vn 0.016200 0.397800 0.917300 +vn 0.116100 0.388000 0.914300 +vn 0.211000 0.379600 0.900800 +vn 0.127300 0.562200 0.817100 +vn 0.005900 0.569500 0.822000 +vn 0.414700 0.221800 0.882500 +vn 0.322100 0.376100 0.868800 +vn 0.452300 0.363600 0.814400 +vn 0.361900 0.556100 0.748200 +vn 0.243300 0.559700 0.792200 +vn -0.009300 0.688100 0.725500 +vn 0.133400 0.677700 0.723200 +vn 0.263900 0.667900 0.695900 +vn 0.479300 0.540200 0.691800 +vn 0.382500 0.651200 0.655400 +vn 0.492600 0.621800 0.608900 +vn 0.697800 0.443200 0.562700 +vn 0.768100 0.381700 0.514200 +vn 0.689800 0.517500 0.506400 +vn 0.758200 0.453500 0.468500 +vn 0.598000 0.501200 0.625500 +vn 0.601100 0.574200 0.555900 +vn 0.685400 0.300400 0.663300 +vn 0.754300 0.268500 0.599100 +vn 0.539100 0.186600 0.821300 +vn 0.578400 0.337600 0.742600 +vn 0.517200 0.238100 0.822100 +vn 0.221700 -0.046700 0.974000 +vn -0.038800 -0.309000 0.950300 +vn 0.009900 -0.342300 0.939500 +vn 0.110600 -0.436300 0.893000 +vn -0.948400 0.038800 0.314700 +vn -0.950400 0.132700 0.281300 +vn -0.972000 -0.012800 0.234500 +vn -0.977100 0.031700 0.210500 +vn -0.987600 -0.030900 0.154200 +vn -0.986500 -0.039400 0.158700 +vn -0.984900 -0.062100 0.161400 +vn -0.989600 -0.056900 0.131900 +vn -0.991900 -0.058600 0.112800 +vn -0.185400 -0.502300 0.844600 +vn -0.186300 -0.479400 0.857600 +vn -0.037400 -0.445100 0.894700 +vn -0.230300 -0.208500 0.950500 +vn -0.089000 -0.229500 0.969200 +vn 0.024500 -0.222400 0.974600 +vn -0.021700 -0.499800 0.865900 +vn 0.112500 -0.434900 0.893400 +vn -0.636100 -0.204100 0.744100 +vn -0.617000 -0.245400 0.747700 +vn -0.684600 -0.112200 0.720200 +vn -0.612900 -0.165100 0.772800 +vn -0.611400 -0.083900 0.786900 +vn -0.587000 -0.000200 0.809600 +vn -0.639100 -0.045700 0.767700 +vn -0.727800 -0.139700 0.671400 +vn -0.762700 -0.230300 0.604400 +vn -0.567600 0.076800 0.819700 +vn -0.670500 -0.094200 0.735900 +vn -0.573600 0.106400 0.812200 +vn -0.670700 -0.258400 0.695200 +vn -0.720800 -0.385600 0.576000 +vn -0.594200 -0.512400 0.620000 +vn -0.572800 0.065500 0.817100 +vn -0.583400 -0.435900 0.685300 +vn -0.546500 -0.012800 0.837300 +vn -0.491300 -0.103300 0.864900 +vn -0.469400 -0.541000 0.697900 +vn -0.477000 -0.510000 0.715800 +vn -0.360800 -0.510900 0.780200 +vn -0.391800 -0.174600 0.903400 +vn -0.351800 -0.508600 0.785800 +vn -0.692200 -0.506400 0.514200 +vn -0.644300 -0.404900 0.648800 +vn -0.622500 -0.431500 0.652900 +vn -0.645800 -0.397200 0.652100 +vn -0.631700 -0.386400 0.672000 +vn -0.632600 -0.303400 0.712600 +vn 0.283300 0.082400 0.955500 +vn 0.195300 0.094100 0.976200 +vn 0.286100 -0.026800 0.957800 +vn -0.238800 -0.045000 0.970000 +vn -0.096000 -0.311100 0.945500 +vn 0.304600 -0.239600 0.921900 +vn 0.318200 -0.028100 0.947600 +vn 0.030500 -0.185400 0.982200 +vn 0.021900 -0.059500 0.998000 +vn 0.154300 -0.257900 0.953800 +vn -0.185600 0.127500 0.974300 +vn -0.224500 0.105900 0.968700 +vn 0.113100 -0.017900 0.993400 +vn 0.082200 -0.387400 0.918300 +vn 0.228100 -0.304100 0.924900 +vn 0.193100 -0.284800 0.938900 +vn 0.122500 -0.171500 0.977500 +vn 0.202900 -0.180800 0.962400 +vn 0.237000 -0.148400 0.960100 +vn 0.148300 0.013400 0.988900 +vn 0.135100 -0.135800 0.981500 +vn 0.144900 -0.070500 0.986900 +vn 0.077900 -0.079700 0.993800 +vn 0.127500 0.084500 0.988200 +vn 0.107100 0.176600 0.978400 +vn 0.059400 0.158300 0.985600 +vn -0.006000 0.073300 0.997300 +vn 0.061500 0.106100 0.992500 +vn -0.120500 0.168500 0.978300 +vn -0.016300 -0.341600 0.939700 +vn -0.107500 -0.582100 0.806000 +vn -0.266000 -0.442200 0.856600 +vn -0.313300 -0.332300 0.889600 +vn -0.465000 -0.083100 0.881400 +vn -0.614800 -0.012000 0.788600 +vn -0.179700 -0.410400 0.894000 +vn -0.431000 -0.385400 0.815900 +vn -0.359600 -0.439200 0.823300 +vn -0.548400 -0.420100 0.723000 +vn -0.751600 -0.068600 0.656100 +vn -0.621500 -0.471400 0.625800 +vn -0.497100 -0.461900 0.734500 +vn -0.586900 -0.478000 0.653500 +vn -0.710100 -0.386300 0.588700 +vn -0.637800 -0.464800 0.614100 +vn -0.716400 -0.380300 0.585000 +vn -0.743200 -0.365300 0.560500 +vn -0.638900 -0.434900 0.634600 +vn -0.675100 -0.417200 0.608400 +vn -0.658600 -0.443700 0.607800 +vn -0.820800 -0.169700 0.545500 +vn -0.640700 -0.494400 0.587400 +vn -0.807100 -0.278100 0.520800 +vn 0.244000 -0.262800 0.933500 +vn 0.077300 -0.552000 0.830300 +vn 0.128800 -0.267800 0.954800 +vn -0.064300 -0.785300 0.615700 +vn -0.008000 -0.645200 0.763900 +vn -0.125100 -0.743100 0.657400 +vn 0.419700 -0.086900 0.903500 +vn 0.347500 -0.205800 0.914800 +vn -0.003900 -0.505300 0.862900 +vn 0.201000 -0.402900 0.892900 +vn -0.031200 -0.628500 0.777200 +vn 0.368200 -0.059600 0.927800 +vn 0.416000 -0.016900 0.909200 +vn 0.423900 -0.092900 0.900900 +vn 0.458500 -0.044800 0.887600 +vn -0.004300 0.047300 0.998900 +vn 0.013600 0.071100 0.997400 +vn 0.230000 0.020600 0.973000 +vn 0.292000 0.039900 0.955600 +vn -0.467800 -0.205500 0.859600 +vn -0.263200 -0.057800 0.963000 +vn -0.571000 -0.078200 0.817200 +vn -0.330800 0.023000 0.943400 +vn -0.680900 -0.318800 0.659400 +vn -0.776200 -0.152900 0.611700 +vn -0.602800 -0.302900 0.738200 +vn -0.699700 -0.133300 0.701800 +vn -0.753500 -0.285500 0.592200 +vn -0.806600 -0.268300 0.526700 +vn -0.815800 -0.331700 0.473600 +vn -0.814100 -0.205800 0.543000 +vn -0.788500 -0.472000 0.394200 +vn -0.812700 -0.350000 0.465800 +vn -0.834500 0.092600 0.543100 +vn -0.834200 0.089800 0.544100 +vn -0.912700 -0.022800 0.408000 +vn -0.833700 0.036300 0.551000 +vn -0.918900 0.005200 0.394500 +vn -0.905900 0.021000 0.422900 +vn -0.766700 0.092100 0.635400 +vn -0.812900 0.090400 0.575300 +vn -0.829400 -0.050800 0.556300 +vn -0.884600 -0.040500 0.464500 +vn -0.693600 0.023100 0.720000 +vn -0.602900 0.171000 0.779300 +vn -0.765800 -0.034000 0.642200 +vn -0.692600 0.112500 0.712500 +vn -0.359200 0.086700 0.929200 +vn -0.390500 0.132700 0.911000 +vn -0.444100 0.132400 0.886100 +vn -0.302000 0.225200 0.926300 +vn -0.217200 0.133100 0.967000 +vn -0.395500 0.273700 0.876800 +vn -0.360800 0.343200 0.867200 +vn -0.234000 0.261600 0.936400 +vn -0.624800 0.139400 0.768300 +vn -0.395800 0.201700 0.895900 +vn -0.148600 0.129300 0.980400 +vn -0.110800 0.151500 0.982200 +vn -0.823100 -0.273300 0.497800 +vn -0.918200 0.095500 0.384300 +vn -0.934200 0.147800 0.324700 +vn -0.902200 0.304300 0.305800 +vn -0.889100 0.377300 0.258900 +vn -0.901900 0.380200 0.205000 +vn -0.906700 -0.090700 0.411900 +vn -0.950500 0.180600 0.253000 +vn -0.580600 -0.573300 0.578100 +vn -0.942400 0.000500 0.334300 +vn -0.833100 -0.334200 0.440700 +vn -0.940800 -0.150400 0.303700 +vn -0.728000 -0.535000 0.428600 +vn -0.163100 -0.739000 0.653700 +vn 0.056400 -0.463700 0.884200 +vn 0.320100 -0.621600 0.714900 +vn 0.032300 -0.678400 0.734000 +vn 0.218000 -0.782100 0.583800 +vn -0.233300 -0.829100 0.508100 +vn 0.085900 -0.855000 0.511500 +vn -0.133900 -0.633100 0.762400 +vn -0.131800 0.482600 0.865900 +vn 0.427000 0.215600 0.878200 +vn -0.048100 0.020500 0.998600 +vn 0.739900 -0.159400 0.653500 +vn 0.454000 -0.259400 0.852400 +vn 0.405700 -0.584100 0.703000 +vn 0.667000 -0.560400 0.491000 +vn -0.012200 -0.743400 0.668800 +vn 0.334700 -0.845100 0.417000 +vn -0.900600 0.345300 0.264100 +vn -0.908900 0.313500 0.275000 +vn -0.931800 0.256000 0.257300 +vn -0.904300 0.281300 0.321100 +vn -0.910800 0.248800 0.329500 +vn -0.850900 0.328300 0.410100 +vn -0.952100 0.212500 0.220100 +vn -0.903900 0.184100 0.386100 +vn -0.003200 0.123100 0.992400 +vn -0.045600 0.097200 0.994200 +vn -0.296200 0.177100 0.938600 +vn -0.085400 0.056500 0.994700 +vn -0.350200 0.192100 0.916700 +vn -0.397200 0.172500 0.901400 +vn -0.495700 0.276600 0.823300 +vn -0.451100 0.232500 0.861700 +vn 0.028900 -0.911000 0.411400 +vn -0.549000 -0.610200 0.571200 +vn -0.173200 -0.881400 0.439400 +vn -0.614700 -0.512500 0.599600 +vn -0.840200 -0.199200 0.504400 +vn -0.399800 -0.696900 0.595400 +vn -0.831300 -0.097700 0.547200 +vn -0.629300 -0.468300 0.620200 +vn -0.254400 -0.850900 0.459700 +vn -0.258600 -0.894500 0.364700 +vn -0.812000 -0.075100 0.578800 +vn -0.616700 -0.506400 0.602700 +vn 0.084800 -0.029800 0.996000 +vn 0.143300 0.026100 0.989300 +vn 0.181800 0.089200 0.979300 +vn -0.348100 -0.400700 0.847500 +vn -0.161600 -0.524600 0.835900 +vn -0.414400 -0.467200 0.781000 +vn -0.209900 -0.619700 0.756300 +vn -0.521900 -0.534400 0.664900 +vn 0.149700 -0.885000 0.440800 +vn -0.204400 -0.904000 0.375400 +vn -0.248000 -0.829800 0.499900 +vn -0.528400 -0.787000 0.318600 +vn -0.525400 -0.700800 0.482500 +vn -0.254800 -0.731200 0.632700 +vn -0.429300 0.042500 0.902200 +vn -0.476600 0.132900 0.869000 +vn -0.466400 0.262500 0.844700 +vn -0.526500 0.209600 0.823900 +vn -0.511200 0.320700 0.797400 +vn -0.511900 0.397900 0.761300 +vn -0.449900 0.187300 0.873200 +vn -0.446700 0.364800 0.816900 +vn -0.573300 0.304300 0.760800 +vn -0.604600 -0.398400 0.689700 +vn -0.480800 0.366100 0.796800 +vn -0.711600 -0.124000 0.691600 +vn -0.550300 0.266400 0.791300 +vn -0.553300 0.349300 0.756200 +vn -0.545100 0.283800 0.788900 +vn -0.561600 0.353100 0.748300 +vn -0.568300 0.371600 0.734100 +vn -0.563700 0.393200 0.726400 +vn -0.572600 0.261000 0.777200 +vn -0.521300 -0.040100 0.852400 +vn -0.592200 0.235500 0.770600 +vn -0.490700 -0.347300 0.799100 +vn -0.357900 -0.380300 0.852800 +vn -0.164200 -0.774300 0.611100 +vn -0.308900 -0.894000 0.324600 +vn -0.190800 -0.132900 0.972600 +vn -0.484100 0.077000 0.871600 +vn -0.434100 0.120600 0.892700 +vn -0.636500 0.167800 0.752800 +vn -0.602600 0.243700 0.759900 +vn -0.550400 0.280800 0.786300 +vn -0.124000 -0.031600 0.991800 +vn -0.279900 -0.284100 0.917000 +vn -0.540600 -0.092600 0.836200 +vn -0.561200 -0.281900 0.778200 +vn -0.656000 -0.030900 0.754100 +vn -0.606600 -0.325800 0.725200 +vn -0.450600 -0.365300 0.814600 +vn -0.460200 -0.502600 0.731800 +vn -0.617800 -0.369200 0.694300 +vn -0.649200 -0.254000 0.716900 +vn -0.703700 0.309600 0.639500 +vn -0.517200 0.471800 0.714100 +vn -0.501600 0.055000 0.863400 +vn -0.656200 -0.054700 0.752600 +vn -0.799400 -0.058300 0.598000 +vn -0.773200 0.108600 0.624800 +vn -0.686400 -0.345500 0.639900 +vn -0.681400 -0.194300 0.705600 +vn -0.598900 -0.369100 0.710700 +vn -0.572000 -0.350700 0.741500 +vn -0.550100 -0.356800 0.755000 +vn -0.615900 -0.086300 0.783100 +vn -0.623000 0.146200 0.768500 +vn -0.560200 0.344900 0.753200 +vn -0.592200 0.291200 0.751300 +vn -0.502500 0.268200 0.821900 +vn -0.533500 0.329700 0.778900 +vn 0.123600 0.379600 0.916800 +vn 0.185400 0.193500 0.963400 +vn 0.030900 0.184200 0.982400 +vn 0.007800 0.297000 0.954900 +vn -0.262100 0.193100 0.945500 +vn -0.425100 0.191800 0.884600 +vn -0.279700 0.227500 0.932700 +vn -0.430100 0.180100 0.884600 +vn -0.021600 0.348700 0.937000 +vn -0.124600 0.235800 0.963800 +vn -0.167100 -0.125000 0.978000 +vn -0.259400 -0.158000 0.952800 +vn -0.320100 -0.195800 0.926900 +vn -0.328500 0.135300 0.934800 +vn -0.432900 0.075000 0.898300 +vn -0.357400 -0.228400 0.905600 +vn -0.477200 0.140100 0.867500 +vn -0.465300 0.001500 0.885100 +vn -0.514400 0.061100 0.855400 +vn -0.498500 -0.104200 0.860600 +vn -0.373800 -0.407100 0.833400 +vn -0.370600 -0.294600 0.880800 +vn -0.473600 0.187400 0.860600 +vn -0.515900 0.167100 0.840200 +vn -0.489900 -0.173300 0.854400 +vn -0.525400 -0.054400 0.849100 +vn -0.533300 0.110600 0.838700 +vn -0.513100 0.014400 0.858200 +vn -0.336900 -0.162400 0.927400 +vn -0.241700 -0.353400 0.903700 +vn -0.416300 -0.074200 0.906200 +vn -0.362400 -0.267100 0.892900 +vn -0.471000 0.058700 0.880200 +vn -0.422700 -0.094900 0.901300 +vn -0.309800 -0.265400 0.913000 +vn -0.178800 -0.412200 0.893400 +vn -0.039500 -0.586900 0.808700 +vn 0.120300 -0.794700 0.595000 +vn -0.014800 -0.735600 0.677200 +vn -0.142900 -0.531500 0.834900 +vn -0.296300 -0.468500 0.832300 +vn -0.173400 -0.674100 0.718000 +vn -0.450900 -0.359600 0.816900 +vn -0.284200 -0.612200 0.737900 +vn -0.501800 -0.229200 0.834000 +vn -0.336500 -0.525800 0.781200 +vn -0.427300 -0.892500 0.144400 +vn -0.082800 -0.967700 0.238200 +vn -0.363800 -0.919300 0.150300 +vn -0.060600 -0.972800 0.223700 +vn -0.346400 -0.918100 0.192500 +vn -0.140200 -0.951600 0.273700 +vn -0.493700 -0.849500 0.185900 +vn -0.772400 -0.559300 0.301000 +vn -0.719600 -0.475300 0.506200 +vn -0.928000 -0.223100 0.298400 +vn -0.844200 -0.177700 0.505700 +vn -0.734700 -0.677400 -0.035900 +vn -0.895700 -0.334000 -0.293600 +vn -0.790800 -0.606100 0.085000 +vn -0.971600 -0.232000 -0.047200 +vn -0.521400 -0.849700 0.079100 +vn -0.657000 -0.736700 -0.160100 +vn -0.627000 -0.778800 -0.018600 +vn -0.784300 -0.540600 -0.304400 +vn -0.289000 -0.948200 0.131900 +vn -0.486100 -0.873700 0.017900 +vn -0.554800 -0.625500 0.548600 +vn -0.503300 -0.699600 0.507200 +vn -0.658600 -0.344600 0.668900 +vn -0.776300 -0.106000 0.621400 +vn -0.556100 -0.501700 0.662600 +vn -0.503600 -0.680200 0.532700 +vn -0.474300 -0.804200 0.358300 +vn -0.389600 -0.808300 0.441500 +vn -0.547400 -0.466900 0.694600 +vn -0.430600 -0.666000 0.609200 +vn -0.628300 -0.758600 -0.172600 +vn -0.467600 -0.858100 0.212000 +vn -0.363600 -0.881200 0.302100 +vn -0.133100 -0.933700 0.332400 +vn -0.084600 -0.971100 0.223000 +vn -0.192400 -0.845800 0.497700 +vn -0.484200 -0.426600 0.764000 +vn -0.234400 -0.677700 0.697000 +vn -0.284900 -0.404100 0.869200 +vn -0.592700 0.195300 0.781400 +vn -0.547500 -0.105100 0.830200 +vn -0.341300 -0.039700 0.939100 +vn -0.360200 0.300600 0.883100 +vn -0.639500 -0.198400 0.742800 +vn -0.728000 0.062800 0.682700 +vn -0.777600 0.295300 0.555100 +vn -0.614600 0.382800 0.689800 +vn -0.633900 0.465400 0.617700 +vn -0.853900 0.248200 0.457500 +vn -0.866900 0.399400 0.298200 +vn -0.412600 0.533200 0.738600 +vn -0.717400 0.469000 0.515100 +vn -0.357300 0.595700 0.719400 +vn -0.681600 0.529300 0.505300 +vn -0.661500 0.540000 0.520500 +vn -0.309500 0.589500 0.746100 +vn -0.317300 0.610100 0.726000 +vn -0.652400 0.503200 0.566700 +vn -0.322200 0.561500 0.762200 +vn -0.343500 0.488800 0.801900 +vn -0.048600 -0.301000 0.952400 +vn 0.021300 -0.127400 0.991600 +vn -0.114500 -0.445200 0.888100 +vn -0.856900 0.300100 0.419200 +vn -0.837400 0.385900 0.387000 +vn -0.902200 0.262500 0.342300 +vn -0.913300 0.166400 0.371900 +vn -0.996100 -0.047400 0.074800 +vn -0.987900 -0.021700 0.153900 +vn -0.997400 -0.052400 0.050000 +vn -0.948400 -0.003000 0.317000 +vn -0.953500 0.032900 0.299600 +vn -0.973700 -0.047500 0.223000 +vn -0.974200 0.013600 0.225300 +vn -0.987800 -0.079200 0.133800 +vn -0.990400 -0.023100 0.136400 +vn -0.995000 -0.086600 0.049500 +vn -0.992100 -0.121400 -0.030900 +vn -0.970100 -0.000900 0.242900 +vn -0.953100 0.009600 0.302400 +vn -0.712600 0.179700 0.678200 +vn -0.724800 0.094800 0.682400 +vn -0.641700 0.126600 0.756500 +vn -0.668700 -0.025000 0.743100 +vn -0.726700 -0.202800 0.656300 +vn -0.765500 -0.047700 0.641700 +vn -0.683200 -0.333600 0.649600 +vn -0.774800 -0.318700 0.546000 +vn -0.872100 -0.171500 0.458300 +vn -0.841500 -0.203000 0.500700 +vn -0.627800 -0.020400 0.778100 +vn -0.650200 -0.190800 0.735400 +vn -0.604100 0.456200 0.653400 +vn -0.463700 0.461900 0.756100 +vn -0.705800 0.535000 0.464400 +vn -0.326000 0.409300 0.852200 +vn -0.602000 0.560700 0.568500 +vn -0.489100 0.540600 0.684600 +vn -0.566500 0.537000 0.625100 +vn -0.741300 0.495500 0.452600 +vn -0.761100 0.438000 0.478500 +vn -0.814900 0.449800 0.365500 +vn -0.773600 0.400100 0.491300 +vn -0.837500 0.391300 0.381500 +vn -0.849400 0.349000 0.395900 +vn -0.788200 0.369500 0.492200 +vn -0.817600 0.335700 0.467800 +vn -0.849500 0.334800 0.407700 +vn -0.852900 0.344200 0.392600 +vn -0.889600 0.281900 0.359400 +vn -0.876700 0.322200 0.357300 +vn -0.872400 0.330200 0.360500 +vn -0.855400 0.281200 0.434900 +vn -0.882300 0.280400 0.378100 +vn -0.872100 0.360800 0.330500 +vn -0.899800 0.299600 0.317300 +vn -0.904200 -0.326000 0.275800 +vn -0.987900 -0.011300 0.154500 +vn -0.946800 -0.292000 0.135200 +vn -0.987600 0.135700 0.078700 +vn -0.736500 -0.603000 0.306500 +vn -0.970200 -0.241400 -0.018800 +vn -0.768800 -0.621500 0.150600 +vn -0.729200 -0.637900 0.247800 +vn -0.385600 -0.857800 0.340000 +vn -0.929600 -0.277500 0.242600 +vn -0.865700 -0.036100 0.499300 +vn -0.997500 -0.032000 0.062900 +vn -0.860800 0.097800 0.499500 +vn -0.489300 0.053400 0.870500 +vn -0.965700 0.253300 0.056200 +vn -0.871000 0.441800 0.214700 +vn -0.845000 0.375000 0.381300 +vn -0.916700 0.258700 0.304600 +vn -0.365700 0.160900 0.916700 +vn -0.583000 0.203900 0.786500 +vn -0.549100 0.336700 0.764900 +vn -0.713700 0.250500 0.654200 +vn -0.674800 0.342800 0.653500 +vn -0.641000 0.406100 0.651300 +vn -0.389000 0.335300 0.858100 +vn -0.532100 0.422600 0.733600 +vn -0.729900 0.173400 0.661200 +vn -0.779900 0.245200 0.575900 +vn -0.509300 0.082900 0.856600 +vn -0.802700 0.524500 0.283700 +vn -0.804600 0.527200 0.273200 +vn -0.845100 0.433600 0.312800 +vn -0.823300 0.511800 0.245600 +vn -0.846100 0.467400 0.256300 +vn -0.867600 0.431100 0.248000 +vn -0.837300 0.473500 0.273500 +vn -0.873200 0.266800 0.407900 +vn -0.879000 0.260300 0.399400 +vn -0.901700 0.164800 0.399800 +vn -0.882200 0.364600 0.298000 +vn -0.914700 0.312800 0.255800 +vn -0.876800 0.373200 0.303200 +vn -0.896300 0.356100 0.264300 +vn -0.905400 0.370400 0.207500 +vn -0.832400 0.422200 0.359000 +vn -0.827800 0.440800 0.347000 +vn -0.832300 0.441200 0.335500 +vn -0.830000 0.424400 0.362100 +vn -0.897900 0.370200 0.238200 +vn -0.884700 0.398400 0.242000 +vn -0.805700 0.407700 0.429600 +vn -0.883100 0.426900 0.194900 +vn -0.821100 0.473800 0.318300 +vn -0.841200 0.336800 0.423000 +vn -0.822900 0.251000 0.509800 +vn -0.787500 0.289200 0.544200 +vn -0.748500 0.356400 0.559200 +vn -0.710800 0.410400 0.571300 +vn -0.607700 0.474900 0.636500 +vn -0.657000 0.526600 0.539500 +vn -0.683600 0.469700 0.558500 +vn -0.224900 0.316400 0.921600 +vn -0.162400 0.244600 0.955900 +vn -0.388800 0.488200 0.781300 +vn -0.286100 0.431500 0.855500 +vn -0.376700 0.514200 0.770500 +vn -0.478000 0.524900 0.704300 +vn -0.407200 0.447300 0.796300 +vn -0.515800 0.479300 0.710100 +vn -0.407400 0.500400 0.764000 +vn -0.052400 0.092500 0.994300 +vn -0.188300 0.077900 0.979000 +vn -0.166600 0.158900 0.973100 +vn -0.132400 0.165500 0.977300 +vn -0.269500 0.326500 0.905900 +vn -0.260700 0.304400 0.916200 +vn -0.327300 0.455700 0.827800 +vn -0.095000 0.096900 0.990800 +vn -0.233000 0.075800 0.969500 +vn -0.210400 0.149300 0.966200 +vn -0.396900 0.036000 0.917200 +vn -0.356500 0.100200 0.928900 +vn -0.508400 0.033000 0.860500 +vn -0.632100 0.071200 0.771600 +vn -0.477000 0.170100 0.862300 +vn -0.505400 0.235700 0.830100 +vn -0.654000 0.088400 0.751300 +vn -0.328400 0.427500 0.842200 +vn -0.332000 0.258000 0.907300 +vn -0.378100 0.360200 0.852800 +vn -0.324000 0.482200 0.813900 +vn -0.278900 0.460600 0.842600 +vn -0.346000 0.417700 0.840100 +vn -0.293400 0.417300 0.860100 +vn -0.451300 0.295600 0.842000 +vn -0.383800 0.349900 0.854600 +vn -0.588400 0.142700 0.795900 +vn -0.504500 0.260100 0.823300 +vn -0.362300 0.370900 0.855100 +vn -0.387500 0.328100 0.861500 +vn -0.447900 0.356000 0.820100 +vn -0.450900 0.359500 0.816900 +vn -0.479700 0.357000 0.801500 +vn -0.232400 0.364600 0.901700 +vn -0.213600 0.238900 0.947300 +vn -0.299200 0.281500 0.911700 +vn -0.272300 0.366500 0.889700 +vn -0.338900 0.507000 0.792500 +vn -0.304600 0.494900 0.813800 +vn -0.165600 0.222900 0.960700 +vn -0.231800 0.386500 0.892700 +vn -0.045800 -0.019600 0.998800 +vn -0.121800 -0.003600 0.992500 +vn -0.229600 0.078700 0.970100 +vn -0.511500 0.331500 0.792800 +vn -0.585400 0.300700 0.752900 +vn -0.520100 0.331600 0.787100 +vn -0.576600 0.279700 0.767700 +vn -0.653600 0.265900 0.708600 +vn -0.614600 0.214800 0.759000 +vn -0.688300 0.224500 0.689800 +vn -0.595000 0.109100 0.796300 +vn -0.550700 0.195400 0.811500 +vn -0.501700 0.274000 0.820500 +vn -0.516000 0.249200 0.819500 +vn -0.350800 0.179100 0.919200 +vn -0.426800 0.250800 0.868900 +vn -0.473400 0.275100 0.836800 +vn -0.018900 0.041600 0.999000 +vn -0.069700 0.113600 0.991100 +vn -0.328500 0.238800 0.913800 +vn -0.187500 0.174600 0.966600 +vn -0.483100 0.454300 0.748500 +vn -0.788300 0.333000 0.517400 +vn -0.463400 0.489700 0.738500 +vn -0.758700 0.405800 0.509600 +vn -0.870000 0.303400 0.388700 +vn -0.848500 0.376300 0.372000 +vn -0.818300 0.328100 0.471900 +vn -0.890700 0.247700 0.381300 +vn -0.803200 0.296600 0.516700 +vn -0.509900 0.485600 0.710100 +vn -0.488500 0.442300 0.752100 +vn -0.542400 0.502500 0.673300 +vn -0.565000 0.424900 0.707300 +vn -0.306800 -0.586700 0.749500 +vn -0.518300 -0.485700 0.703800 +vn -0.310700 -0.283400 0.907300 +vn -0.720900 -0.259500 0.642600 +vn -0.435800 -0.053300 0.898400 +vn -0.197600 -0.383200 0.902300 +vn -0.532100 0.223100 0.816800 +vn -0.849300 -0.013000 0.527800 +vn -0.364600 -0.631200 0.684600 +vn -0.256300 -0.756300 0.602000 +vn -0.610200 -0.599000 0.518500 +vn -0.418400 -0.764200 0.490900 +vn -0.162300 -0.860800 0.482300 +vn -0.878300 -0.158200 0.451200 +vn -0.883600 0.103600 0.456700 +vn -0.957200 -0.035500 0.287300 +vn -0.802400 0.318800 0.504500 +vn -0.950700 0.152700 0.269900 +vn -0.878700 0.351000 0.323500 +vn -0.705100 0.421400 0.570300 +vn -0.787400 0.476700 0.390800 +vn -0.558600 0.262900 0.786700 +vn -0.451100 0.293800 0.842700 +vn -0.668200 -0.178600 0.722200 +vn -0.657100 0.101800 0.746900 +vn -0.528800 -0.456900 0.715300 +vn -0.775200 -0.397800 0.490700 +vn -0.747800 -0.462100 0.476700 +vn -0.894700 -0.234800 0.379900 +vn -0.522100 -0.673800 0.522800 +vn -0.294800 -0.772000 0.563100 +vn -0.243400 -0.857100 0.454100 +vn -0.213500 -0.713400 0.667400 +vn -0.202400 -0.650600 0.732000 +vn -0.170600 -0.532800 0.828900 +vn -0.225000 -0.381400 0.896600 +vn -0.275200 -0.387900 0.879700 +vn -0.060900 0.253300 0.965500 +vn 0.038600 0.293500 0.955200 +vn 0.023800 0.225600 0.973900 +vn -0.051800 0.241000 0.969100 +vn -0.028500 0.209300 0.977400 +vn -0.133700 -0.346800 0.928300 +vn -0.046400 -0.276400 0.959900 +vn -0.111300 -0.050000 0.992500 +vn 0.008000 0.032100 0.999500 +vn -0.379500 0.123800 0.916900 +vn -0.224900 0.183300 0.957000 +vn -0.397300 0.171600 0.901500 +vn -0.217000 0.216500 0.951900 +vn -0.261900 0.255300 0.930700 +vn -0.439000 0.237900 0.866400 +vn -0.345100 -0.125100 0.930200 +vn -0.423100 -0.070200 0.903400 +vn -0.503700 0.097100 0.858400 +vn -0.587100 0.103000 0.802900 +vn -0.300100 -0.387100 0.871800 +vn -0.495100 0.016200 0.868700 +vn -0.182900 -0.733700 0.654400 +vn -0.668200 0.118700 0.734500 +vn -0.759000 0.120100 0.639900 +vn -0.589500 0.096300 0.802000 +vn -0.705900 0.149300 0.692400 +vn -0.832200 0.125400 0.540100 +vn -0.797400 0.112900 0.592800 +vn -0.720100 0.132000 0.681200 +vn -0.765500 0.168800 0.620800 +vn -0.643500 0.129900 0.754400 +vn -0.906400 0.033900 0.421000 +vn -0.881800 0.070000 0.466400 +vn -0.901700 0.098100 0.421100 +vn -0.856500 0.195000 0.477900 +vn -0.924400 0.023900 0.380600 +vn -0.889900 0.080000 0.449100 +vn -0.884900 0.073800 0.459900 +vn -0.835000 0.110500 0.539100 +vn -0.815100 0.142400 0.561500 +vn -0.916600 -0.061900 0.395000 +vn -0.920000 0.031900 0.390700 +vn -0.905200 -0.025100 0.424300 +vn -0.928000 0.028000 0.371500 +vn -0.934400 0.021100 0.355600 +vn -0.906700 0.005900 0.421700 +vn -0.916800 0.030400 0.398200 +vn -0.855000 -0.103300 0.508300 +vn -0.869000 -0.027200 0.494000 +vn -0.914300 -0.018700 0.404600 +vn -0.906900 0.010400 0.421200 +vn -0.920700 0.038200 0.388300 +vn -0.901900 0.064000 0.427100 +vn -0.861700 0.085500 0.500200 +vn -0.253600 0.585800 0.769800 +vn -0.192900 0.439400 0.877400 +vn -0.126500 0.578000 0.806200 +vn -0.112300 0.241500 0.963900 +vn -0.086300 0.412900 0.906700 +vn -0.478000 0.583500 0.656500 +vn -0.460600 0.442300 0.769500 +vn -0.316400 0.457200 0.831200 +vn -0.365300 0.592000 0.718400 +vn -0.282900 0.688500 0.667800 +vn -0.150700 0.694400 0.703600 +vn -0.502500 0.651300 0.568600 +vn -0.396500 0.674000 0.623400 +vn -0.776500 0.471300 0.418200 +vn -0.792500 0.398500 0.461600 +vn -0.717100 0.471400 0.513300 +vn -0.701700 0.545100 0.458800 +vn -0.607000 0.609100 0.510300 +vn -0.608200 0.539700 0.582000 +vn -0.793500 0.278400 0.541200 +vn -0.697700 0.184500 0.692200 +vn -0.723900 0.332300 0.604700 +vn -0.612200 0.391600 0.686900 +vn -0.593600 0.207300 0.777600 +vn -0.545400 0.136200 0.827000 +vn -0.243800 -0.111000 0.963400 +vn -0.111600 -0.388900 0.914500 +vn 0.992200 -0.075100 -0.099100 +vn 0.998400 -0.006300 0.057000 +vn 0.990700 0.057700 -0.123400 +vn 0.955400 0.073800 0.286000 +vn 0.996600 0.082400 -0.006500 +vn 0.980300 0.112800 0.162300 +vn 0.982600 0.183200 -0.030400 +vn 0.976900 0.178300 -0.117800 +vn 0.609800 0.070900 0.789400 +vn 0.665900 0.030700 0.745400 +vn 0.887100 0.123200 0.444900 +vn 0.349700 0.139600 0.926400 +vn 0.880900 0.108500 0.460600 +vn 0.974200 0.173900 0.144000 +vn 0.952300 0.150000 0.265900 +vn 0.972300 0.177900 0.151400 +vn 0.864300 0.124100 0.487400 +vn 0.941800 0.133900 0.308400 +vn 0.940900 0.155300 0.301100 +vn 0.972900 0.198600 0.118700 +vn 0.912200 0.028500 0.408700 +vn 0.725500 -0.155600 0.670400 +vn 0.726600 -0.237400 0.644800 +vn 0.909200 -0.230000 0.347200 +vn 0.953000 -0.146500 0.265300 +vn 0.957700 -0.173800 0.229200 +vn 0.845400 -0.425400 0.323000 +vn 0.949100 -0.169700 0.265400 +vn 0.783300 -0.456800 0.421600 +vn 0.920900 -0.085900 0.380200 +vn 0.906800 -0.019900 0.421000 +vn 0.737800 -0.330400 0.588700 +vn 0.970600 0.108100 0.215100 +vn 0.977000 0.087400 0.194400 +vn 0.977800 0.156200 0.139600 +vn 0.963600 0.112900 0.242200 +vn 0.978400 0.187200 0.087900 +vn 0.972800 0.228900 -0.035700 +vn 0.971000 0.238400 -0.015600 +vn 0.966700 0.251700 -0.047500 +vn 0.942200 0.131300 0.308300 +vn 0.955000 0.166400 0.245300 +vn 0.964200 0.189400 0.185400 +vn 0.966100 0.233100 0.110700 +vn 0.971700 0.228200 0.061000 +vn 0.856900 -0.514400 0.033500 +vn 0.870600 -0.356900 0.338600 +vn 0.866900 -0.422100 0.265000 +vn 0.722800 0.026800 0.690600 +vn 0.807200 -0.308200 0.503400 +vn 0.575200 -0.817800 0.020100 +vn 0.759900 -0.591500 -0.269500 +vn 0.934100 -0.342600 0.100400 +vn 0.876000 -0.478700 0.059500 +vn 0.834400 -0.478400 -0.273700 +vn 0.939200 -0.343300 -0.012200 +vn 0.925300 -0.368800 0.088100 +vn 0.920000 -0.340200 0.194800 +vn 0.864600 -0.435300 0.250900 +vn 0.868100 -0.104500 0.485200 +vn 0.862900 -0.296300 0.409400 +vn 0.754700 0.128700 0.643300 +vn 0.941700 -0.148200 0.302200 +vn 0.949700 -0.240500 0.200300 +vn 0.887000 -0.386200 0.253200 +vn 0.908800 -0.144400 0.391400 +vn 0.892600 -0.004600 0.450800 +vn 0.872000 0.064500 0.485200 +vn -0.646400 0.101900 0.756100 +vn 0.056300 0.241800 0.968700 +vn 0.474700 0.285700 0.832500 +vn 0.761600 0.181700 0.622000 +vn 0.869300 0.206500 0.449100 +vn 0.806400 0.121300 0.578800 +vn 0.957300 -0.028800 0.287500 +vn 0.974000 -0.225700 -0.022100 +vn 0.983800 -0.104600 0.145300 +vn 0.969600 -0.026100 0.243500 +vn 0.934700 -0.140100 0.326600 +vn 0.969300 -0.241900 0.042900 +vn 0.997500 -0.071100 -0.003300 +vn 0.537100 0.381000 0.752600 +vn 0.373100 0.652300 0.659800 +vn 0.618200 0.147700 0.772000 +vn 0.651000 0.086100 0.754200 +vn 0.798400 -0.130500 0.587900 +vn 0.915900 -0.005500 0.401400 +vn 0.926800 -0.213800 0.308700 +vn 0.958700 -0.226400 0.172000 +vn 0.776400 0.149800 0.612200 +vn 0.815000 0.373000 0.443500 +vn 0.851300 0.104100 0.514300 +vn 0.836100 0.406200 0.368700 +vn 0.925100 0.160900 0.344000 +vn 0.901800 0.213200 0.376000 +vn 0.953800 -0.041900 0.297600 +vn 0.713100 0.362600 0.600000 +vn 0.713800 0.558200 0.423000 +vn 0.707700 0.200800 0.677400 +vn 0.724100 0.587800 0.360800 +vn 0.741900 0.480800 0.467200 +vn 0.754500 0.540700 0.372000 +vn 0.590500 -0.292400 0.752200 +vn 0.695900 -0.210700 0.686500 +vn 0.499500 -0.291800 0.815700 +vn 0.565700 -0.188100 0.802800 +vn 0.932500 0.219600 0.286800 +vn 0.919600 0.138200 0.367600 +vn 0.912000 0.103500 0.396900 +vn 0.830800 0.096000 0.548300 +vn 0.882100 0.229500 0.411400 +vn 0.915600 0.229400 0.330100 +vn 0.943700 0.167000 0.285700 +vn 0.955500 0.246100 0.162400 +vn 0.983300 0.176000 0.046200 +vn 0.636000 0.019600 0.771400 +vn 0.964800 0.083700 0.249300 +vn 0.677500 -0.043000 0.734300 +vn 0.997800 0.065900 0.005500 +vn 0.703000 0.117800 0.701400 +vn 0.724100 0.010400 0.689700 +vn 0.619000 0.221800 0.753400 +vn 0.566800 -0.153400 0.809500 +vn 0.805500 -0.010000 0.592500 +vn 0.543300 -0.191500 0.817400 +vn 0.609400 0.018200 0.792700 +vn 0.410400 -0.255600 0.875300 +vn 0.453200 0.046200 0.890200 +vn 0.845800 0.266300 0.462300 +vn 0.769800 0.431900 0.470000 +vn 0.718000 0.512100 0.471500 +vn 0.732100 0.283000 0.619600 +vn 0.775400 0.057800 0.628800 +vn 0.785500 -0.215100 0.580200 +vn 0.777900 -0.370800 0.507300 +vn 0.906100 0.024300 0.422300 +vn 0.875600 -0.289100 0.386900 +vn 0.684100 -0.468300 0.559100 +vn 0.632900 -0.363900 0.683300 +vn 0.601200 -0.149500 0.785000 +vn 0.484100 -0.410300 0.772900 +vn 0.611700 -0.415600 0.673100 +vn 0.841300 -0.383000 0.381500 +vn 0.849600 -0.373400 0.372500 +vn 0.787900 -0.406300 0.462700 +vn 0.913200 -0.297800 0.278300 +vn 0.939900 -0.172200 0.294900 +vn 0.849200 -0.410000 0.332700 +vn 0.765100 -0.477400 0.432100 +vn 0.708500 -0.413400 0.572000 +vn 0.984300 0.052300 0.168400 +vn 0.950900 0.108100 0.290100 +vn 0.972900 -0.015000 0.230700 +vn 0.934300 -0.037400 0.354600 +vn 0.911700 -0.056800 0.407000 +vn 0.863200 -0.070900 0.499900 +vn 0.810400 -0.109700 0.575500 +vn 0.763700 0.070500 0.641600 +vn 0.928200 0.131400 0.348100 +vn 0.837600 0.034500 0.545200 +vn 0.763800 -0.245300 0.597000 +vn 0.712100 -0.125700 0.690700 +vn 0.714100 -0.070600 0.696400 +vn 0.636400 -0.180900 0.749800 +vn 0.857600 0.065300 0.510100 +vn 0.706500 0.472500 0.526900 +vn 0.580300 0.425600 0.694400 +vn 0.599700 0.212300 0.771500 +vn 0.682700 0.521300 0.512000 +vn 0.683500 0.424000 0.594200 +vn 0.628900 -0.113300 0.769200 +vn -0.915000 0.131500 0.381400 +vn -0.944700 0.090300 0.315400 +vn -0.975100 0.077800 0.207500 +vn -0.988300 -0.030700 0.149600 +vn -0.993700 -0.045200 0.102600 +vn -0.997800 -0.049800 0.044700 +vn -0.954800 0.135600 0.264400 +vn -0.990900 0.069900 0.115300 +vn -0.698400 -0.138800 0.702100 +vn -0.572700 -0.193000 0.796700 +vn -0.663300 -0.041300 0.747200 +vn -0.571600 -0.090000 0.815600 +vn -0.613100 0.095400 0.784200 +vn -0.816800 0.031100 0.576100 +vn -0.782300 0.121800 0.610900 +vn -0.860900 -0.034100 0.507700 +vn -0.924600 0.087800 0.370700 +vn -0.687200 -0.360900 0.630500 +vn -0.613700 -0.303700 0.728800 +vn -0.765100 -0.223600 0.603800 +vn -0.823000 -0.262500 0.503700 +vn -0.900700 -0.239500 0.362400 +vn -0.918400 -0.179100 0.352700 +vn -0.861200 -0.289400 0.417800 +vn -0.925100 -0.135900 0.354600 +vn -0.900700 -0.181400 0.394700 +vn -0.889200 -0.241600 0.388500 +vn -0.788700 -0.338400 0.513200 +vn -0.869200 -0.273100 0.412300 +vn -0.945600 -0.143500 0.292100 +vn -0.928300 -0.175900 0.327500 +vn -0.927300 -0.138500 0.347800 +vn -0.906500 -0.094300 0.411500 +vn -0.962000 0.004100 0.273000 +vn -0.970300 -0.040900 0.238500 +vn -0.942300 0.047900 0.331200 +vn -0.959200 0.118700 0.256800 +vn -0.984700 0.144400 0.097800 +vn -0.969200 0.091400 0.228600 +vn -0.978100 0.204700 0.037800 +vn -0.980100 0.078800 0.182000 +vn -0.972200 0.204500 0.114100 +vn -0.971900 0.116400 0.204500 +vn -0.537100 -0.834600 0.122000 +vn -0.716100 -0.269300 0.643900 +vn -0.792500 -0.250900 0.555900 +vn -0.696900 -0.206900 0.686700 +vn -0.754100 -0.232500 0.614200 +vn -0.740800 -0.311800 0.595000 +vn -0.827400 -0.295600 0.477500 +vn -0.868700 -0.418100 0.265500 +vn -0.752400 -0.382300 0.536400 +vn -0.923600 -0.382200 0.027800 +vn -0.673000 0.068900 0.736400 +vn -0.830300 -0.354500 0.430200 +vn -0.876300 -0.105400 0.470200 +vn -0.924300 -0.372700 0.082000 +vn -0.911000 -0.410000 -0.043500 +vn -0.857900 -0.474200 0.197700 +vn -0.875600 -0.472500 0.100800 +vn -0.923200 -0.381700 -0.045200 +vn -0.947700 -0.319000 0.006200 +vn -0.921900 -0.353200 0.159400 +vn -0.925900 -0.079600 0.369300 +vn -0.967300 -0.095300 0.235200 +vn -0.408200 0.232900 0.882700 +vn -0.792000 0.148400 0.592200 +vn -0.786300 0.155700 0.597900 +vn -0.974200 -0.223000 -0.034200 +vn -0.911500 0.054600 0.407700 +vn -0.979600 -0.201100 0.005600 +vn -0.968900 -0.237200 -0.070800 +vn -0.964800 -0.248400 -0.086800 +vn -0.973300 -0.133300 0.186900 +vn -0.991200 -0.085200 -0.100800 +vn -0.301600 0.551300 0.777900 +vn -0.508900 0.299300 0.807100 +vn -0.708800 0.144400 0.690400 +vn -0.812200 0.068100 0.579500 +vn -0.997800 -0.059100 0.029300 +vn -0.855000 -0.426600 0.295100 +vn -0.935800 -0.313900 0.160400 +vn -0.953500 -0.002600 0.301200 +vn -0.896400 0.008000 0.443100 +vn -0.969700 -0.237200 0.059100 +vn -0.854300 -0.207900 0.476500 +vn -0.800400 0.183500 0.570700 +vn -0.829400 0.267900 0.490200 +vn -0.653900 0.445300 0.611600 +vn -0.679200 0.408800 0.609600 +vn -0.670400 0.215700 0.710000 +vn -0.928000 -0.118700 0.353100 +vn -0.789600 0.242700 0.563500 +vn -0.629300 0.473500 0.616300 +vn -0.667900 0.411000 0.620500 +vn -0.666900 0.358400 0.653300 +vn -0.683200 0.333700 0.649600 +vn -0.676100 0.141300 0.723200 +vn -0.680900 0.065800 0.729400 +vn -0.587200 -0.087300 0.804700 +vn -0.603100 -0.205400 0.770800 +vn -0.637900 -0.154600 0.754400 +vn -0.788800 -0.028000 0.614000 +vn -0.932300 0.067800 0.355300 +vn -0.930000 0.212800 0.299600 +vn -0.806500 0.074300 0.586500 +vn -0.953300 0.282100 0.107900 +vn -0.981400 0.151300 -0.118300 +vn -0.968400 0.238900 -0.071700 +vn -0.981500 0.158000 0.107900 +vn -0.918100 0.180800 0.352700 +vn -0.840000 0.173900 0.513900 +vn -0.982900 0.177600 0.048800 +vn -0.998400 0.053300 -0.017000 +vn -0.688200 0.006600 0.725500 +vn -0.796700 0.073400 0.600000 +vn -0.995100 0.047900 -0.086400 +vn -0.598600 -0.152100 0.786400 +vn -0.658200 0.085300 0.748000 +vn -0.660600 -0.017700 0.750500 +vn -0.674800 0.030400 0.737400 +vn -0.553600 0.017600 0.832600 +vn -0.470400 -0.072500 0.879500 +vn -0.641800 -0.022300 0.766600 +vn -0.591800 -0.084900 0.801600 +vn -0.646100 0.378100 0.663000 +vn -0.639700 0.397500 0.657800 +vn -0.619100 0.418900 0.664200 +vn -0.601500 0.315000 0.734100 +vn -0.625100 0.347500 0.698900 +vn -0.719400 -0.209600 0.662300 +vn -0.608300 -0.124700 0.783800 +vn -0.698700 0.073900 0.711600 +vn -0.591200 -0.017600 0.806400 +vn -0.576500 0.171600 0.798900 +vn -0.484000 0.010400 0.875000 +vn -0.485400 -0.083500 0.870300 +vn -0.440000 -0.125900 0.889100 +vn -0.550300 -0.227300 0.803400 +vn -0.721000 -0.494100 0.485800 +vn -0.794500 -0.484800 0.365700 +vn -0.698500 -0.375300 0.609300 +vn -0.786300 -0.424100 0.449300 +vn -0.785700 -0.448500 0.426000 +vn -0.862200 -0.402700 0.307300 +vn -0.483100 -0.278800 0.830000 +vn -0.671400 -0.362300 0.646400 +vn -0.597200 -0.435500 0.673500 +vn -0.905200 -0.091400 0.415100 +vn -0.938700 -0.108500 0.327300 +vn -0.804900 -0.063600 0.590000 +vn -0.880200 -0.124900 0.457800 +vn -0.798500 -0.143100 0.584800 +vn -0.745400 -0.233800 0.624300 +vn -0.697700 -0.158700 0.698600 +vn -0.981000 0.052900 0.186900 +vn -0.942000 0.029500 0.334200 +vn -0.793600 -0.012800 0.608300 +vn -0.944700 -0.010200 0.327900 +vn -0.600000 -0.171700 0.781400 +vn -0.623900 -0.295800 0.723300 +vn -0.573800 -0.085900 0.814500 +vn -0.634900 0.276000 0.721600 +vn -0.567700 0.171000 0.805300 +vn -0.689800 0.162800 0.705400 +vn -0.694400 0.200700 0.691100 +vn -0.669200 0.311600 0.674600 +vn -0.315900 -0.621400 0.716900 +vn -0.661500 -0.129500 0.738600 +vn 0.156800 0.915500 0.370500 +vn -0.101400 0.961200 0.256400 +vn 0.101000 0.923500 0.370100 +vn -0.231600 0.972700 -0.017500 +vn -0.031400 0.975600 0.217400 +vn 0.469900 0.664400 0.581100 +vn 0.289200 0.857900 0.424600 +vn 0.603900 0.612500 0.510100 +vn -0.115700 0.777900 0.617600 +vn -0.031800 0.828000 0.559900 +vn 0.123000 0.960400 0.249900 +vn 0.098900 0.795200 0.598200 +vn 0.227000 0.971600 0.066400 +vn 0.279900 0.932500 -0.228200 +vn 0.021400 0.900200 0.435000 +vn 0.062200 0.912300 0.404700 +vn 0.240500 0.745900 0.621100 +vn 0.202600 0.756300 0.622100 +vn 0.192900 0.291200 0.937000 +vn 0.009700 0.399300 0.916700 +vn -0.002500 0.154500 0.988000 +vn 0.306500 0.285300 0.908100 +vn 0.186200 0.097900 0.977600 +vn -0.248800 0.516300 0.819500 +vn -0.138600 0.530500 0.836300 +vn -0.282600 0.278100 0.918100 +vn -0.176400 0.240200 0.954600 +vn -0.005500 -0.028500 0.999600 +vn -0.028800 -0.273200 0.961500 +vn 0.176600 -0.059600 0.982500 +vn 0.150800 -0.305500 0.940200 +vn 0.303900 -0.068700 0.950200 +vn 0.304900 0.104300 0.946700 +vn -0.285400 0.067000 0.956100 +vn -0.185300 0.032000 0.982200 +vn -0.300500 -0.114600 0.946900 +vn -0.203900 -0.195800 0.959200 +vn -0.285600 0.193600 0.938600 +vn -0.339100 0.019500 0.940500 +vn -0.340500 0.089100 0.936000 +vn -0.336200 0.232700 0.912600 +vn 0.295600 -0.325500 0.898200 +vn 0.125900 -0.511900 0.849800 +vn -0.045500 -0.461100 0.886200 +vn 0.276500 -0.523600 0.805900 +vn 0.779400 0.263100 0.568600 +vn 0.747300 0.244600 0.617900 +vn 0.681200 0.374600 0.629000 +vn 0.737800 0.241100 0.630500 +vn 0.672000 0.321300 0.667200 +vn 0.612300 0.475700 0.631500 +vn 0.730700 0.399300 0.553700 +vn 0.660800 0.510800 0.550000 +vn 0.762600 -0.061500 0.643900 +vn 0.767000 0.106300 0.632800 +vn 0.806000 -0.130700 0.577300 +vn 0.808900 0.025200 0.587400 +vn 0.829300 0.006300 0.558700 +vn 0.830500 -0.170500 0.530300 +vn 0.809000 0.258300 0.528100 +vn 0.669400 0.557300 0.491100 +vn 0.765700 0.402700 0.501600 +vn 0.800800 0.223000 0.555800 +vn 0.744500 0.394000 0.538900 +vn 0.343700 0.703500 0.622100 +vn 0.647000 0.386800 0.657100 +vn 0.505900 0.372600 0.778000 +vn 0.712300 0.190000 0.675700 +vn 0.558500 0.155400 0.814800 +vn 0.392200 0.334500 0.856900 +vn 0.274700 0.731000 0.624600 +vn 0.412500 0.133000 0.901200 +vn 0.587300 -0.401200 0.703000 +vn 0.592700 -0.156100 0.790100 +vn 0.432200 -0.371900 0.821500 +vn 0.430900 -0.115600 0.895000 +vn 0.749400 -0.123900 0.650400 +vn 0.832600 -0.061100 0.550500 +vn 0.726800 -0.366900 0.580600 +vn 0.846100 -0.013600 0.532900 +vn 0.808500 -0.288800 0.512700 +vn 0.830900 -0.221200 0.510600 +vn 0.773100 -0.216400 0.596300 +vn 0.794100 -0.267000 0.545900 +vn 0.741000 -0.197100 0.641900 +vn 0.797200 -0.340500 0.498500 +vn 0.771800 -0.412600 0.483900 +vn 0.704100 -0.476900 0.526100 +vn 0.576600 -0.523400 0.627400 +vn 0.420500 -0.533300 0.734000 +vn 0.013100 0.993800 -0.110400 +vn 0.139700 0.986400 -0.086500 +vn -0.119100 0.875700 -0.468000 +vn 0.067700 0.889900 -0.451100 +vn -0.042400 0.999000 0.011400 +vn -0.210100 0.923900 -0.319700 +vn 0.432000 0.782000 0.449200 +vn 0.297500 0.857200 0.420300 +vn 0.443100 0.729600 0.520800 +vn 0.233400 0.819900 0.522700 +vn 0.371400 0.687400 0.624100 +vn 0.561000 0.414500 0.716500 +vn 0.138400 0.783100 0.606300 +vn 0.248700 0.629500 0.736100 +vn 0.611000 0.152500 0.776800 +vn 0.546700 0.315400 0.775700 +vn 0.683100 0.203600 0.701400 +vn 0.688300 0.012900 0.725300 +vn 0.667200 -0.092700 0.739100 +vn 0.701200 -0.195700 0.685600 +vn 0.411800 0.689200 0.596100 +vn 0.281900 0.711500 0.643700 +vn 0.474600 0.519500 0.710600 +vn -0.158400 0.700000 0.696400 +vn 0.220900 0.591700 0.775300 +vn -0.103400 0.386100 0.916700 +vn -0.227700 0.440500 0.868400 +vn -0.012400 0.690300 0.723400 +vn 0.163200 0.561300 0.811400 +vn 0.149900 0.868000 0.473300 +vn 0.125300 0.835500 0.535100 +vn 0.294800 0.842700 0.450500 +vn 0.307200 0.776400 0.550300 +vn 0.704300 0.493800 0.510000 +vn 0.728700 -0.644000 0.233100 +vn 0.762300 -0.020400 0.646900 +vn 0.472100 -0.834200 0.284900 +vn 0.273700 -0.288600 0.917500 +vn -0.198900 -0.425700 0.882700 +vn 0.006400 0.242900 0.970000 +vn -0.332600 -0.756400 0.563300 +vn -0.310400 -0.243400 0.918900 +vn -0.036500 -0.511400 0.858600 +vn -0.208800 -0.357700 0.910200 +vn -0.336700 -0.097400 0.936600 +vn -0.260200 0.105600 0.959800 +vn -0.105500 0.263600 0.958900 +vn -0.455400 0.534500 0.711900 +vn -0.259700 0.929300 0.262700 +vn -0.588700 0.417800 0.692100 +vn -0.106400 0.993600 -0.037000 +vn -0.210300 0.944500 0.252200 +vn -0.411100 0.802200 0.433000 +vn -0.444000 0.776600 0.447000 +vn -0.493700 0.696800 0.520300 +vn -0.345000 0.871300 -0.349000 +vn -0.237200 0.959900 0.149100 +vn -0.319000 0.939200 -0.127000 +vn -0.074800 0.751600 0.655400 +vn -0.206300 0.955700 0.209700 +vn -0.019900 0.771500 0.635900 +vn -0.014200 0.799300 0.600700 +vn -0.197600 0.960800 0.194500 +vn 0.065700 0.185300 0.980500 +vn 0.008700 0.496100 0.868200 +vn -0.054000 0.056800 0.996900 +vn -0.080500 0.410000 0.908500 +vn -0.120700 0.752300 0.647700 +vn -0.223000 0.323400 0.919600 +vn -0.239200 -0.038000 0.970200 +vn 0.138700 0.309900 0.940600 +vn 0.165800 0.382500 0.909000 +vn 0.058400 0.587600 0.807100 +vn 0.058400 0.644100 0.762700 +vn -0.223500 -0.367400 0.902800 +vn -0.040000 -0.376500 0.925500 +vn -0.046500 -0.226700 0.972900 +vn 0.117900 -0.327000 0.937600 +vn 0.103700 -0.129400 0.986200 +vn -0.239800 -0.249700 0.938200 +vn 0.253800 -0.251600 0.934000 +vn 0.329200 -0.171100 0.928600 +vn 0.221400 -0.034900 0.974600 +vn 0.274600 0.060800 0.959600 +vn 0.258900 0.020600 0.965700 +vn 0.137500 0.305900 0.942100 +vn 0.160300 0.361500 0.918500 +vn 0.262300 0.112900 0.958400 +vn 0.105000 -0.366800 0.924400 +vn -0.039900 -0.429300 0.902300 +vn -0.205400 -0.454000 0.867000 +vn -0.731800 0.554100 0.396800 +vn -0.742700 0.495800 0.450000 +vn -0.835300 0.421400 0.353000 +vn -0.723800 0.465500 0.509400 +vn -0.810400 0.376200 0.449100 +vn -0.840700 0.345800 0.416800 +vn -0.803900 0.510700 0.304700 +vn -0.865400 0.208300 0.455800 +vn -0.826200 0.211600 0.522100 +vn -0.733700 0.354600 0.579600 +vn -0.713300 0.191200 0.674300 +vn -0.868500 0.050000 0.493200 +vn -0.799900 0.092500 0.593000 +vn -0.655100 0.395300 0.643900 +vn -0.727300 0.441700 0.525400 +vn -0.782400 0.268600 0.561900 +vn -0.785600 0.485200 0.383900 +vn -0.701900 0.179400 0.689300 +vn -0.823900 0.041400 0.565200 +vn -0.474000 -0.171200 0.863700 +vn -0.496900 0.099600 0.862100 +vn -0.601800 -0.144300 0.785500 +vn -0.619000 0.100900 0.778900 +vn -0.722800 -0.071400 0.687400 +vn -0.177200 0.733600 0.656000 +vn -0.287100 0.664300 0.690100 +vn -0.359900 0.200800 0.911100 +vn -0.370600 -0.122800 0.920700 +vn -0.374100 -0.235300 0.897000 +vn -0.476200 -0.258400 0.840500 +vn -0.477900 -0.385100 0.789500 +vn -0.367000 -0.349700 0.862000 +vn -0.604600 -0.407300 0.684500 +vn -0.598400 -0.297900 0.743800 +vn -0.722400 -0.280000 0.632200 +vn -0.725500 -0.360800 0.586000 +vn -0.820800 -0.233200 0.521400 +vn -0.830300 -0.153600 0.535700 +vn -0.849700 -0.064900 0.523200 +vn -0.799100 -0.141600 0.584200 +vn -0.750000 -0.035300 0.660500 +vn -0.694100 -0.043100 0.718600 +vn -0.735400 -0.345100 0.583100 +vn -0.810800 -0.228200 0.539100 +vn -0.474800 -0.467700 0.745600 +vn -0.611000 -0.432600 0.662900 +vn -0.351400 -0.461400 0.814600 +vn -0.172300 0.899500 -0.401500 +vn 0.008500 0.926800 -0.375500 +vn -0.191600 0.979300 0.064500 +vn -0.088700 0.995500 0.033000 +vn 0.023200 0.963700 -0.266100 +vn -0.098200 0.991500 0.085100 +vn -0.755100 0.549000 0.358400 +vn -0.632700 0.610400 0.476500 +vn -0.722000 0.558800 0.407900 +vn -0.734000 0.541400 0.410100 +vn -0.833800 0.485500 0.262900 +vn -0.895400 0.365400 0.254300 +vn -0.873500 0.393400 0.286800 +vn -0.627000 0.451400 0.634900 +vn -0.536100 0.525800 0.660400 +vn -0.635900 0.105000 0.764600 +vn -0.626900 -0.292400 0.722200 +vn -0.499900 0.334500 0.798800 +vn -0.584300 -0.324900 0.743600 +vn -0.437100 0.600900 0.669200 +vn -0.564700 0.587600 0.579500 +vn -0.293900 0.665200 0.686400 +vn -0.258100 0.671400 0.694700 +vn -0.056400 0.763900 0.642800 +vn 0.053800 0.609400 0.791100 +vn -0.332800 0.530200 0.779800 +vn -0.434400 0.683600 0.586500 +vn -0.146800 0.864800 0.480200 +vn -0.375300 0.767000 0.520500 +vn -0.176300 0.896200 0.407100 +vn -0.141100 0.935800 0.323100 +vn -0.157600 -0.938800 0.306200 +vn -0.229500 -0.961900 -0.148700 +vn -0.380100 -0.604200 0.700400 +vn -0.270100 -0.872400 -0.407400 +vn -0.936000 0.035900 0.350100 +vn -0.835700 -0.415500 0.359100 +vn -0.188600 -0.013400 0.982000 +vn -0.007300 -0.518600 0.855000 +vn 0.068300 -0.644600 0.761500 +vn 0.237900 -0.273500 0.932000 +vn 0.291700 -0.160700 0.942900 +vn 0.210600 0.008100 0.977500 +vn 0.078000 0.274900 0.958300 +vn -0.026100 0.546500 0.837100 +vn -0.052900 0.388000 0.920100 +vn -0.791200 0.025000 -0.611100 +vn -0.811700 0.137800 -0.567600 +vn -0.887700 -0.075300 -0.454300 +vn -0.683000 0.559500 -0.469600 +vn -0.890000 0.171400 -0.422600 +vn -0.782000 -0.599700 -0.169700 +vn -0.836700 -0.053800 -0.545000 +vn -0.864100 -0.195400 -0.463900 +vn -0.370200 0.776300 -0.510200 +vn -0.472600 0.735300 -0.485800 +vn -0.712300 0.267900 -0.648700 +vn -0.738000 0.085800 -0.669400 +vn -0.582100 0.392700 -0.712000 +vn -0.055900 0.982900 -0.175600 +vn -0.054000 0.981500 0.183500 +vn -0.199900 -0.968400 0.148900 +vn 0.839100 0.525300 0.141300 +vn 0.683400 -0.728500 0.047100 +vn -0.019800 -0.993200 0.114800 +vn 0.113500 -0.992600 -0.044000 +vn -0.318600 -0.926000 0.202600 +vn -0.547800 -0.106800 0.829800 +vn 0.362000 0.785600 0.501800 +vn 0.140600 0.985800 0.091500 +vn 0.354700 0.763600 0.539600 +vn -0.111200 0.926500 -0.359400 +vn 0.177500 0.964000 0.198000 +vn -0.080200 0.959400 -0.270500 +vn -0.052000 0.954400 -0.294000 +vn 0.368600 0.761300 0.533400 +vn 0.166100 0.657500 0.734900 +vn 0.146400 0.947500 0.284300 +vn 0.404500 0.621200 0.671200 +vn 0.257900 0.921200 0.291400 +vn -0.039700 0.990500 -0.131800 +vn -0.085700 0.985200 -0.148700 +vn 0.499400 0.525600 0.688700 +vn 0.526200 0.459900 0.715300 +vn 0.342800 0.865600 0.364900 +vn 0.075700 0.995700 -0.052900 +vn -0.186800 0.864200 -0.467100 +vn 0.510300 0.468800 0.721000 +vn 0.477800 0.545400 0.688700 +vn -0.091400 0.928700 -0.359300 +vn -0.051600 0.939400 -0.339000 +vn -0.185300 0.639700 -0.746000 +vn -0.273800 0.620200 -0.735100 +vn -0.371700 0.309500 -0.875200 +vn -0.150600 0.662300 -0.733900 +vn -0.251400 0.352500 -0.901400 +vn 0.218700 0.816100 0.534900 +vn 0.038700 0.996000 0.080400 +vn 0.062900 0.833600 0.548800 +vn -0.020700 0.997100 0.073000 +vn -0.090600 0.926700 -0.364800 +vn -0.011900 0.995900 0.090000 +vn -0.015500 0.839100 0.543800 +vn 0.359800 0.593400 0.720100 +vn 0.146800 0.612500 0.776700 +vn -0.013000 0.606300 0.795100 +vn 0.444800 0.575700 0.686100 +vn 0.346100 0.775300 0.528300 +vn 0.190600 0.965800 0.176000 +vn 0.142700 0.982900 0.116100 +vn -0.016400 0.932500 -0.360700 +vn -0.125300 0.687000 -0.715800 +vn -0.170000 0.408900 -0.896600 +vn -0.040500 0.693900 -0.718900 +vn -0.124900 0.492500 -0.861300 +vn -0.427700 0.492800 -0.757800 +vn -0.648800 0.193000 -0.736100 +vn -0.345600 0.550700 -0.759800 +vn -0.498200 0.325700 -0.803500 +vn -0.353500 0.588700 -0.727000 +vn -0.403700 0.337400 -0.850400 +vn -0.433500 0.277000 -0.857500 +vn 0.795800 0.583200 -0.163100 +vn 0.701700 0.667700 -0.248500 +vn 0.858300 0.391500 -0.331700 +vn 0.469700 0.815300 -0.338700 +vn 0.751900 0.436700 -0.493900 +vn 0.820900 0.405000 -0.402500 +vn 0.843100 0.289600 -0.453100 +vn 0.872500 0.271800 -0.406200 +vn 0.811100 0.291900 -0.506900 +vn 0.776500 0.295600 -0.556500 +vn 0.701200 0.411500 -0.582300 +vn 0.396600 0.787100 -0.472400 +vn 0.633200 0.402900 -0.660800 +vn 0.704700 0.342700 -0.621200 +vn 0.584700 -0.806300 -0.089600 +vn 0.775400 0.567200 0.277400 +vn 0.980600 0.193600 -0.031400 +vn -0.181200 0.946200 0.268000 +vn 0.533700 0.844500 -0.044300 +vn -0.003200 0.999700 -0.024600 +vn 0.725900 -0.326000 0.605600 +vn 0.404200 -0.893100 0.197600 +vn 0.053600 0.842400 0.536100 +vn 0.041200 0.829600 -0.556800 +vn 0.102800 0.804900 -0.584400 +vn -0.283200 0.956700 0.067900 +vn 0.190600 0.770600 -0.608200 +vn -0.256000 0.966700 -0.005800 +vn -0.317400 0.946700 0.055500 +vn -0.510400 0.735100 0.446300 +vn -0.339500 0.915600 0.215300 +vn -0.346600 0.847100 0.402900 +vn -0.461500 0.772900 0.435400 +vn -0.378200 0.901100 0.212100 +vn -0.059900 0.993000 -0.101400 +vn 0.385500 0.734500 -0.558400 +vn -0.401000 0.854500 0.330200 +vn -0.443200 0.678800 0.585500 +vn -0.489100 0.606200 0.627100 +vn -0.457900 0.778500 0.429200 +vn -0.074200 0.985200 -0.154700 +vn 0.307400 0.737900 -0.600800 +vn -0.154300 0.979800 -0.127300 +vn -0.478100 0.738800 0.475000 +vn -0.557900 0.588200 0.585400 +vn -0.537400 0.585400 0.607100 +vn 0.185200 0.540800 -0.820500 +vn 0.187700 0.547500 -0.815500 +vn 0.106900 0.533000 -0.839300 +vn 0.106600 0.585800 -0.803400 +vn 0.040300 0.858900 -0.510600 +vn 0.051800 0.629300 -0.775400 +vn 0.042900 0.528500 -0.847900 +vn 0.026300 0.927500 -0.372800 +vn 0.036600 0.900600 -0.433200 +vn -0.061300 0.991900 0.111300 +vn -0.006900 0.994700 0.102900 +vn -0.061900 0.840300 0.538600 +vn -0.189700 0.826500 0.530100 +vn -0.284700 0.589200 0.756200 +vn -0.104400 0.602100 0.791600 +vn -0.350800 0.784000 0.512100 +vn -0.448000 0.580100 0.680200 +vn -0.167900 0.980600 0.101000 +vn 0.007400 0.530600 -0.847600 +vn 0.019800 0.671700 -0.740500 +vn -0.056500 0.537200 -0.841600 +vn 0.583300 0.431100 -0.688400 +vn 0.545800 0.427000 -0.721000 +vn 0.430800 0.471600 -0.769400 +vn 0.443800 0.509600 -0.737100 +vn 0.310100 0.541900 -0.781100 +vn 0.300500 0.509500 -0.806300 +vn -0.058600 -0.994200 -0.089900 +vn -0.069400 -0.995200 -0.069200 +vn -0.024900 -0.999000 -0.036800 +vn -0.001700 -0.986700 0.162300 +vn 0.039500 -0.979900 0.195500 +vn 0.090000 -0.975000 0.203100 +vn -0.021800 -0.998600 -0.048500 +vn 0.026100 -0.999500 -0.018200 +vn 0.021600 -0.999300 -0.029700 +vn 0.021800 -0.999400 -0.028100 +vn 0.024000 -0.999400 -0.023500 +vn 0.052700 -0.978500 0.199300 +vn 0.007800 -0.982600 0.185700 +vn 0.010000 -0.999600 -0.026500 +vn 0.169200 -0.848700 0.501100 +vn 0.212100 -0.671800 0.709700 +vn 0.077400 -0.871700 0.483800 +vn 0.116600 -0.729000 0.674500 +vn 0.015100 -0.886800 0.462000 +vn 0.112800 -0.864300 0.490200 +vn 0.233500 -0.661300 0.712900 +vn 0.152300 -0.848300 0.507100 +vn 0.249200 -0.658200 0.710400 +vn -0.298800 -0.953600 -0.036900 +vn 0.017300 -0.997600 0.067500 +vn -0.214700 -0.976100 -0.032900 +vn -0.073000 -0.997300 0.009300 +vn -0.050600 -0.997500 0.049200 +vn -0.063800 -0.987600 0.143500 +vn -0.190500 -0.981400 -0.024200 +vn 0.114900 -0.888500 0.444200 +vn 0.037700 -0.960100 0.277200 +vn 0.084200 -0.804300 0.588300 +vn 0.147800 -0.860100 0.488200 +vn 0.282900 -0.631000 0.722400 +vn 0.061600 -0.922700 0.380600 +vn 0.271600 -0.716700 0.642300 +vn 0.243900 -0.533700 0.809700 +vn -0.174100 -0.962900 -0.206000 +vn -0.108200 -0.987200 -0.116900 +vn -0.076800 -0.992400 -0.096400 +vn -0.086000 -0.996100 -0.019900 +vn -0.064900 -0.995500 0.069700 +vn -0.090800 -0.984800 -0.148200 +vn 0.022800 -0.911800 0.409900 +vn -0.022400 -0.964300 0.263700 +vn 0.161400 -0.716700 0.678500 +vn -0.202200 -0.967700 -0.150700 +vn -0.272300 -0.926200 -0.260800 +vn -0.380400 -0.871500 -0.309400 +vn -0.163400 -0.984900 -0.057500 +vn -0.286400 -0.936800 -0.200900 +vn -0.755500 -0.550000 -0.356100 +vn -0.710300 -0.628600 -0.316700 +vn -0.721100 -0.594200 -0.356300 +vn -0.509400 -0.831800 -0.220600 +vn -0.292100 -0.952400 -0.087500 +vn -0.462400 -0.850500 -0.250900 +vn -0.268800 -0.958200 -0.098000 +vn -0.228500 -0.970400 -0.078800 +vn -0.390700 -0.888500 -0.240600 +vn -0.485900 -0.804700 -0.341300 +vn -0.575900 -0.739200 -0.349100 +vn -0.068700 -0.990200 0.121900 +vn -0.162700 -0.985600 0.045200 +vn -0.011300 -0.962200 0.272100 +vn -0.200500 -0.979700 -0.006100 +vn 0.181900 -0.799100 0.573000 +vn 0.311400 -0.462700 0.830000 +vn 0.317900 -0.466900 0.825200 +vn 0.305000 -0.476900 0.824300 +vn 0.234100 -0.520100 0.821400 +vn 0.161100 -0.566100 0.808400 +vn 0.024600 -0.594300 0.803800 +vn 0.029200 -0.771000 0.636200 +vn -0.019300 -0.977300 0.210900 +vn 0.015600 -0.977200 0.211800 +vn 0.039300 -0.998600 -0.034600 +vn 0.054300 -0.982600 0.177700 +vn 0.089100 -0.992100 -0.088800 +vn 0.149600 -0.977800 -0.146700 +vn 0.087500 -0.981300 -0.171500 +vn 0.037000 -0.992500 -0.116900 +vn -0.014300 -0.981000 0.193300 +vn 0.021400 -0.999600 -0.018200 +vn 0.026800 -0.998100 -0.056300 +vn -0.120200 -0.753100 0.646800 +vn -0.191300 -0.718500 0.668700 +vn -0.118900 -0.868600 0.481100 +vn -0.073400 -0.875500 0.477600 +vn -0.151400 -0.732600 0.663600 +vn -0.086400 -0.873900 0.478400 +vn -0.115200 -0.773000 0.623800 +vn -0.047200 -0.887500 0.458400 +vn 0.258400 -0.963200 0.073400 +vn 0.381100 -0.922600 -0.059300 +vn 0.348600 -0.923300 -0.161100 +vn 0.370100 -0.913800 -0.167400 +vn 0.475500 -0.869600 -0.132900 +vn 0.887200 -0.403600 -0.223400 +vn 0.391300 -0.898300 -0.199900 +vn 0.253800 -0.921200 0.294900 +vn 0.113400 -0.903900 0.412500 +vn -0.136300 -0.771700 0.621200 +vn 0.072700 -0.922600 0.378800 +vn -0.048900 -0.864400 0.500400 +vn -0.182100 -0.718000 0.671800 +vn -0.204600 -0.670600 0.713000 +vn 0.149200 -0.985800 0.076800 +vn 0.203000 -0.978600 -0.034700 +vn 0.203900 -0.959100 -0.196500 +vn 0.283300 -0.928600 -0.239800 +vn 0.219500 -0.942900 -0.250400 +vn 0.155900 -0.963800 -0.216400 +vn -0.060200 -0.820600 0.568400 +vn 0.095400 -0.947100 0.306500 +vn 0.032700 -0.906400 0.421200 +vn -0.074400 -0.805000 0.588600 +vn 0.443200 -0.837500 -0.319600 +vn 0.387700 -0.872300 -0.297900 +vn 0.417300 -0.860400 -0.292700 +vn 0.312600 -0.909100 -0.275200 +vn 0.366200 -0.889900 -0.271800 +vn 0.312600 -0.941200 -0.128100 +vn 0.378500 -0.903600 -0.200800 +vn 0.530700 -0.829800 -0.172300 +vn 0.553100 -0.783800 -0.282600 +vn 0.943300 -0.115200 -0.311500 +vn 0.836900 -0.467100 -0.285400 +vn 0.915700 -0.221400 -0.335400 +vn 0.697600 -0.642100 -0.317700 +vn 0.456600 -0.838500 -0.297500 +vn 0.381500 -0.897300 -0.221900 +vn 0.525300 -0.785200 -0.327800 +vn 0.275100 -0.960400 0.044600 +vn 0.161500 -0.971800 0.171700 +vn 0.322900 -0.942200 -0.089400 +vn 0.162500 -0.959300 0.231000 +vn -0.017300 -0.847500 0.530600 +vn -0.221400 -0.606000 0.764100 +vn -0.226800 -0.542500 0.808800 +vn -0.257600 -0.531500 0.806900 +vn -0.232800 -0.520300 0.821600 +vn -0.179500 -0.571200 0.800900 +vn -0.423800 -0.827600 0.368000 +vn -0.441900 -0.861700 0.249600 +vn -0.146100 -0.968500 0.201700 +vn -0.397600 -0.882100 0.252700 +vn -0.119100 -0.985400 0.122000 +vn 0.207600 -0.962400 0.175100 +vn -0.139600 -0.919600 0.367200 +vn 0.231000 -0.972500 0.028200 +vn 0.568800 -0.822500 -0.001400 +vn 0.824000 -0.566500 0.012200 +vn 0.547600 -0.820900 0.161700 +vn 0.814300 -0.563600 0.138600 +vn 0.488100 -0.790000 0.371100 +vn 0.179700 -0.910500 0.372400 +vn 0.962600 -0.268600 0.034200 +vn 0.999400 0.029800 0.017600 +vn 0.961300 -0.257000 0.099300 +vn 0.998200 0.026500 0.053100 +vn 0.914500 -0.273700 0.298100 +vn 0.749700 -0.562900 0.347900 +vn 0.959100 0.278000 -0.053900 +vn 0.806700 0.527400 -0.266600 +vn 0.959800 0.280500 0.000600 +vn 0.852500 0.514400 -0.092800 +vn 0.937700 0.277900 0.208500 +vn 0.968800 0.011900 0.247700 +vn 0.845400 0.509800 0.159300 +vn 0.688500 0.689600 -0.224600 +vn 0.598700 0.659700 -0.454300 +vn 0.408700 0.699800 -0.585900 +vn 0.710300 0.698900 0.083900 +vn 0.488900 0.796400 -0.355900 +vn 0.531900 0.846800 -0.005000 +vn 0.261800 0.852800 -0.451800 +vn 0.208300 0.714700 -0.667700 +vn -0.042000 0.699400 -0.713500 +vn 0.315300 0.945600 -0.079800 +vn -0.005300 0.863100 -0.505100 +vn -0.556000 0.527500 -0.642400 +vn -0.537800 0.715200 -0.446500 +vn -0.319500 0.633200 -0.705000 +vn -0.475400 0.878000 -0.054700 +vn -0.293900 0.813800 -0.501400 +vn -0.228100 0.967300 -0.110500 +vn -0.818900 0.319600 -0.476800 +vn -0.840800 0.464800 -0.277400 +vn -0.716600 0.593500 -0.366300 +vn -0.816100 0.569600 0.097100 +vn -0.671100 0.741000 0.021600 +vn -0.718400 0.416200 -0.557400 +vn -0.879200 0.244300 -0.409100 +vn -0.917000 0.186400 -0.352500 +vn -0.917300 0.347100 -0.195100 +vn -0.961300 0.247000 -0.121800 +vn -0.903200 0.400300 0.154900 +vn -0.913500 -0.204100 0.352000 +vn -0.961500 -0.186000 0.202300 +vn -0.900600 -0.337600 0.273700 +vn -0.966100 -0.188400 0.176500 +vn -0.889000 -0.352000 0.293000 +vn -0.751100 -0.544600 0.373200 +vn -0.858100 -0.346900 0.378500 +vn -0.794300 -0.519300 0.315400 +vn -0.956900 0.021000 0.289600 +vn -0.998200 0.047300 0.035500 +vn -0.989400 -0.069300 0.127400 +vn -0.973100 0.059100 -0.222700 +vn -0.997100 -0.064700 0.041000 +vn -0.941900 -0.088100 0.324100 +vn -0.947600 0.135200 -0.289400 +vn -0.987200 0.151600 -0.049100 +vn -0.959700 0.134500 0.246900 +vn -0.945100 0.257000 0.201800 +vn -0.632300 -0.674800 0.380500 +vn -0.766400 -0.510000 0.390400 +vn -0.650500 -0.697700 0.300100 +vn -0.593100 -0.722500 0.355400 +vn 0.854900 -0.013000 0.518600 +vn 0.780200 -0.285900 0.556400 +vn 0.657400 -0.038400 0.752600 +vn 0.574700 -0.281200 0.768500 +vn 0.441000 -0.468100 0.765800 +vn 0.615500 -0.530400 0.583000 +vn 0.445100 -0.057800 0.893600 +vn 0.355700 -0.270000 0.894800 +vn 0.257400 -0.074300 0.963500 +vn 0.176700 -0.244400 0.953500 +vn 0.255800 -0.395100 0.882300 +vn 0.198100 0.155400 0.967800 +vn 0.259800 0.083800 0.962000 +vn 0.427200 0.281100 0.859400 +vn 0.447800 0.153000 0.880900 +vn 0.649800 0.203600 0.732300 +vn 0.600700 0.384800 0.700800 +vn 0.758300 0.469100 0.452700 +vn 0.835600 0.251500 0.488500 +vn 0.503600 0.790600 0.348400 +vn 0.436400 0.675300 0.594600 +vn 0.650700 0.645800 0.399300 +vn 0.542000 0.538300 0.645400 +vn 0.379100 0.565000 0.732900 +vn 0.325300 0.471700 0.819500 +vn 0.434700 0.406600 0.803500 +vn 0.316300 0.316200 0.894400 +vn 0.224100 0.521900 0.823000 +vn 0.170600 0.370300 0.913100 +vn 0.140000 0.572600 0.807800 +vn 0.056300 0.500200 0.864000 +vn -0.002600 0.450700 0.892700 +vn 0.116100 0.279300 0.953200 +vn 0.139500 0.789000 0.598300 +vn 0.139600 0.664300 0.734300 +vn 0.295900 0.758200 0.581000 +vn 0.266900 0.647600 0.713700 +vn 0.324600 0.890300 0.319500 +vn 0.113800 0.942100 0.315300 +vn -0.332800 0.852400 0.403300 +vn -0.182000 0.700400 0.690100 +vn -0.121100 0.930200 0.346400 +vn -0.030500 0.767900 0.639900 +vn 0.055700 0.991100 -0.121300 +vn 0.012700 0.627100 0.778800 +vn -0.082900 0.565300 0.820700 +vn -0.472200 0.453200 0.756100 +vn -0.303400 0.361500 0.881600 +vn -0.326300 0.598000 0.732000 +vn -0.167400 0.278500 0.945700 +vn -0.184200 0.484400 0.855300 +vn -0.081000 0.384500 0.919600 +vn -0.670400 0.547900 0.500400 +vn -0.515700 0.722200 0.461000 +vn 0.392300 -0.714600 0.579100 +vn 0.289900 -0.614600 0.733700 +vn 0.101100 -0.716000 0.690700 +vn 0.138900 -0.816500 0.560300 +vn -0.126800 -0.831700 0.540600 +vn -0.116300 -0.744000 0.657900 +vn -0.333900 -0.693200 0.638800 +vn -0.378200 -0.762300 0.525200 +vn -0.573700 -0.633500 0.519200 +vn -0.505300 -0.584300 0.635100 +vn -0.606600 -0.464800 0.644900 +vn -0.697900 -0.491800 0.520600 +vn -0.658800 -0.073800 0.748700 +vn -0.662300 -0.007900 0.749200 +vn -0.845300 0.074500 0.529100 +vn -0.651600 0.119300 0.749100 +vn -0.830200 0.204200 0.518700 +vn -0.842900 -0.023400 0.537600 +vn -0.192600 -0.116400 0.974300 +vn -0.276500 -0.097500 0.956000 +vn -0.461800 -0.082500 0.883100 +vn -0.287100 -0.003100 0.957900 +vn -0.464400 0.039800 0.884700 +vn -0.443300 -0.111300 0.889400 +vn -0.043300 0.029100 0.998600 +vn -0.006100 -0.021200 0.999800 +vn -0.093700 -0.036600 0.994900 +vn -0.247900 0.140700 0.958500 +vn -0.408100 0.204800 0.889700 +vn -0.589100 0.284300 0.756400 +vn -0.776400 0.365300 0.513500 +vn 0.018500 0.157700 0.987300 +vn -0.096400 0.094100 0.990900 +vn 0.069300 -0.015700 0.997500 +vn 0.031800 -0.097500 0.994700 +vn -0.065800 -0.200000 0.977600 +vn 0.038500 -0.188800 0.981300 +vn 0.047900 -0.327600 0.943600 +vn -0.304600 -0.137200 0.942600 +vn -0.353000 -0.208300 0.912100 +vn -0.138900 -0.259000 0.955800 +vn -0.164000 -0.195800 0.966800 +vn -0.687400 -0.217800 0.692800 +vn -0.521600 -0.207200 0.827600 +vn -0.477900 -0.122400 0.869900 +vn -0.673700 -0.126000 0.728200 +vn -0.824200 -0.216900 0.523100 +vn -0.838600 -0.111200 0.533300 +vn -0.322800 -0.402100 0.856800 +vn -0.360600 -0.305900 0.881100 +vn -0.523300 -0.321700 0.789100 +vn -0.666500 -0.340700 0.663100 +vn -0.483700 -0.430300 0.762100 +vn -0.779100 -0.349500 0.520400 +vn -0.282900 -0.617400 0.734000 +vn -0.416300 -0.524500 0.742700 +vn -0.222100 -0.536600 0.814100 +vn -0.277200 -0.462000 0.842400 +vn -0.121700 -0.356300 0.926400 +vn -0.199000 -0.303200 0.931900 +vn 0.064800 -0.615000 0.785900 +vn 0.018200 -0.524800 0.851000 +vn -0.100300 -0.533800 0.839700 +vn -0.105600 -0.654900 0.748300 +vn -0.102500 -0.418600 0.902400 +vn 0.061400 -0.420400 0.905300 +vn 0.189300 -0.502600 0.843500 +vn 0.016900 0.284100 0.958700 +vn 0.740000 0.113000 0.663000 +vn 0.253300 0.053300 0.965900 +vn 0.424400 0.877100 0.225100 +vn 0.062700 0.000700 0.998000 +vn 0.411300 0.658900 0.629900 +vn 0.432000 0.887800 0.158800 +vn 0.476000 0.879400 0.012300 +vn 0.331900 0.932000 -0.145700 +vn 0.281100 0.864700 0.416300 +vn 0.311400 0.900400 0.303800 +vn 0.898000 0.325000 0.296700 +vn 0.886600 0.231500 0.400500 +vn 0.810900 -0.556700 -0.180300 +vn 0.943400 0.319100 0.090400 +vn 0.771800 -0.574500 -0.272400 +vn -0.222900 0.571400 -0.789800 +vn -0.411700 0.612700 -0.674700 +vn -0.418600 0.680800 -0.601100 +vn -0.556800 0.698800 -0.449000 +vn -0.581200 0.710800 -0.396200 +vn -0.568000 0.795600 -0.210900 +vn -0.202600 0.673700 -0.710700 +vn -0.117600 0.902000 -0.415400 +vn 0.190800 0.866700 -0.461000 +vn 0.079000 0.689700 -0.719800 +vn 0.447100 0.773300 -0.449500 +vn 0.365000 0.684100 -0.631500 +vn 0.053400 0.619600 -0.783100 +vn 0.506800 0.772300 -0.383000 +vn 0.427400 0.866400 -0.258200 +vn 0.352900 0.923300 -0.151400 +vn 0.439300 0.775200 -0.454000 +vn 0.291100 0.956400 -0.025300 +vn 0.414000 0.790800 -0.450800 +vn 0.440000 0.820800 -0.364200 +vn 0.477300 0.828200 -0.293500 +vn 0.257400 0.933600 -0.249300 +vn -0.045700 0.979400 -0.196500 +vn 0.233800 0.913200 -0.333700 +vn -0.376800 0.869200 -0.320300 +vn -0.533500 0.822100 -0.198600 +vn -0.317900 0.932300 -0.172400 +vn -0.557500 0.687800 -0.464900 +vn -0.350400 0.830700 -0.432600 +vn -0.875100 -0.164700 -0.455000 +vn -0.764000 -0.366200 -0.531300 +vn -0.833100 -0.192900 -0.518400 +vn -0.563000 -0.555700 -0.611800 +vn -0.697400 -0.386700 -0.603400 +vn -0.596100 -0.520200 -0.611600 +vn -0.574500 -0.505600 -0.643700 +vn -0.663100 -0.388700 -0.639700 +vn -0.974600 0.123200 -0.186800 +vn -0.973500 0.141400 -0.179500 +vn -0.960700 -0.054100 -0.272400 +vn -0.955600 0.179100 -0.233900 +vn -0.935900 -0.039400 -0.350000 +vn -0.976700 -0.047200 -0.209400 +vn -0.908100 -0.150700 -0.390700 +vn -0.890600 0.429500 -0.149100 +vn -0.919300 0.356800 -0.165900 +vn -0.937400 0.302400 -0.173000 +vn -0.911500 0.356300 -0.205300 +vn -0.941200 0.256300 -0.220200 +vn -0.858100 0.501200 -0.111200 +vn -0.886400 0.440700 -0.141700 +vn -0.894200 0.395400 -0.209800 +vn -0.915700 0.302000 -0.265100 +vn -0.869400 0.449700 -0.204900 +vn -0.899700 0.321200 -0.295600 +vn -0.611100 0.758600 -0.226000 +vn -0.638600 0.742000 -0.203900 +vn -0.578400 0.814800 -0.040800 +vn -0.622900 0.780200 -0.056800 +vn -0.716100 0.683100 -0.143500 +vn -0.652800 0.738800 -0.167200 +vn -0.789200 0.604500 -0.108300 +vn -0.819600 0.535500 -0.203800 +vn -0.881300 0.347600 -0.320200 +vn -0.747100 0.626800 -0.221400 +vn -0.849100 0.396700 -0.348800 +vn -0.653900 0.719900 -0.232500 +vn -0.793700 0.466400 -0.390600 +vn -0.693800 0.572200 -0.437400 +vn -0.406400 0.900600 0.154000 +vn -0.510400 0.851100 0.123100 +vn -0.098500 0.916800 0.387100 +vn -0.526200 0.816200 0.238700 +vn -0.140000 0.862400 0.486400 +vn -0.625200 0.745900 0.229600 +vn -0.317000 0.833400 0.452700 +vn -0.779500 0.617100 0.107400 +vn -0.615400 0.729800 0.297800 +vn -0.937400 0.347400 0.026300 +vn -0.662600 0.729600 0.169000 +vn -0.954600 0.254600 -0.155000 +vn -0.883800 -0.260000 -0.389000 +vn -0.662200 -0.540000 -0.519500 +vn 0.554900 -0.679200 -0.480400 +vn 0.191900 -0.703900 -0.683900 +vn 0.361300 -0.473500 -0.803300 +vn 0.116500 -0.503100 -0.856400 +vn 0.070600 -0.731300 -0.678400 +vn 0.630000 0.023300 0.776200 +vn 0.065700 -0.179400 0.981600 +vn 0.873800 -0.481600 -0.067200 +vn -0.179200 -0.346100 0.920900 +vn -0.169800 -0.225900 0.959200 +vn -0.117600 -0.171500 0.978100 +vn -0.110600 -0.051700 0.992500 +vn 0.220300 -0.165100 0.961400 +vn 0.606800 -0.408700 0.681700 +vn 0.578500 -0.344600 -0.739400 +vn 0.782200 -0.368000 -0.502800 +vn 0.642200 -0.300800 -0.705100 +vn 0.214500 -0.302600 -0.928700 +vn 0.006600 0.018600 0.999800 +vn 0.135600 0.032600 0.990200 +vn 0.288700 0.103100 0.951900 +vn 0.630300 -0.233200 0.740500 +vn 0.924000 -0.099700 0.369200 +vn 0.733000 -0.193300 0.652200 +vn 0.239500 -0.242300 0.940200 +vn 0.582200 -0.518500 0.626300 +vn 0.078900 -0.536800 0.840000 +vn 0.915800 0.172500 -0.362600 +vn 0.991600 -0.013300 0.128500 +vn 0.954300 -0.271300 0.125700 +vn 0.913900 0.122300 -0.387000 +vn 0.947700 0.319100 -0.004800 +vn 0.207000 0.049500 0.977100 +vn 0.158200 0.141700 0.977200 +vn 0.568200 0.381600 0.729000 +vn 0.658500 0.477100 0.582000 +vn 0.472400 0.307400 0.826100 +vn 0.550500 0.470800 0.689400 +vn 0.279400 0.198300 0.939500 +vn 0.171200 -0.535300 -0.827100 +vn 0.196400 -0.440800 -0.875900 +vn 0.020600 -0.489500 -0.871800 +vn 0.179800 -0.302300 -0.936100 +vn 0.018700 -0.343300 -0.939000 +vn -0.145200 -0.496200 -0.856000 +vn -0.019000 -0.591400 -0.806200 +vn -0.166400 -0.605200 -0.778500 +vn -0.285300 -0.459500 -0.841100 +vn -0.108900 -0.342100 -0.933300 +vn -0.271700 -0.326400 -0.905300 +vn -0.478800 -0.307700 -0.822200 +vn -0.272900 -0.579100 -0.768200 +vn -0.448800 -0.409300 -0.794400 +vn -0.759900 -0.231400 -0.607500 +vn -0.584100 -0.387200 -0.713400 +vn -0.503400 -0.501000 -0.704000 +vn -0.387700 -0.534500 -0.751000 +vn -0.644400 -0.275100 -0.713500 +vn -0.942500 -0.157800 -0.294700 +vn -0.851500 -0.196000 -0.486300 +vn -0.882300 -0.232000 -0.409600 +vn -0.795200 -0.302000 -0.525800 +vn -0.773100 -0.252800 -0.581800 +vn -0.672600 -0.363600 -0.644600 +vn -0.655600 -0.310000 -0.688500 +vn -0.491300 -0.419800 -0.763100 +vn -0.480800 -0.350800 -0.803600 +vn -0.258200 -0.362800 -0.895400 +vn -0.059200 -0.370200 -0.927100 +vn -0.236500 -0.462300 -0.854600 +vn 0.230500 -0.393300 -0.890000 +vn 0.099700 -0.403600 -0.909500 +vn 0.504100 -0.617800 -0.603600 +vn 0.052000 -0.508000 -0.859800 +vn 0.235600 -0.242000 -0.941300 +vn 0.243500 -0.263900 -0.933300 +vn 0.260000 -0.323900 -0.909700 +vn 0.345800 -0.473500 -0.810000 +vn 0.196900 -0.535900 -0.821000 +vn 0.040500 -0.609700 -0.791600 +vn 0.223900 -0.423600 -0.877700 +vn -0.954600 0.110800 -0.276400 +vn -0.987300 -0.046300 -0.152300 +vn -0.971700 -0.193400 -0.135500 +vn -0.991300 -0.052900 -0.120500 +vn -0.924400 0.085600 -0.371700 +vn -0.842200 0.184100 -0.506900 +vn -0.861200 0.169800 -0.479000 +vn -0.833200 0.080600 -0.547000 +vn -0.797600 0.232300 -0.556700 +vn -0.822200 0.084400 -0.562800 +vn -0.707500 0.315200 -0.632600 +vn -0.784100 0.119200 -0.609100 +vn -0.568200 0.433400 -0.699500 +vn -0.701400 0.190300 -0.686900 +vn -0.062300 0.931200 -0.359100 +vn -0.370900 0.596700 -0.711600 +vn -0.557500 0.298000 -0.774900 +vn -0.097300 0.763600 -0.638300 +vn -0.355200 0.442200 -0.823600 +vn 0.339100 0.696600 -0.632200 +vn 0.382800 0.776500 -0.500400 +vn 0.184300 0.821300 -0.539800 +vn 0.158800 0.688900 -0.707200 +vn -0.879200 0.184900 -0.439100 +vn -0.899900 0.189400 -0.392900 +vn -0.814100 0.190200 -0.548700 +vn -0.910800 0.069400 -0.407000 +vn -0.872200 0.169700 -0.458800 +vn -0.829900 0.089300 -0.550700 +vn 0.960100 0.233500 -0.153700 +vn 0.933400 0.254800 -0.252600 +vn 0.909100 0.312800 -0.275200 +vn 0.903800 0.261800 -0.338400 +vn 0.877800 0.309700 -0.365400 +vn 0.848000 0.415300 -0.329300 +vn 0.934800 0.297600 -0.194100 +vn 0.829400 0.440200 -0.344100 +vn 0.245800 -0.849600 -0.466700 +vn 0.173900 -0.686900 -0.705600 +vn 0.520400 -0.718100 -0.462000 +vn 0.444500 -0.663000 -0.602400 +vn 0.293300 -0.574100 -0.764400 +vn 0.620900 -0.641200 -0.451000 +vn 0.702000 -0.609700 -0.368000 +vn -0.461800 -0.847600 -0.261200 +vn -0.494400 -0.617200 -0.612100 +vn -0.185600 -0.686000 -0.703500 +vn -0.127700 -0.913700 -0.385900 +vn -0.837000 -0.426800 -0.342400 +vn -0.703700 -0.520200 -0.483900 +vn -0.697800 -0.704800 -0.127600 +vn -0.837700 -0.545900 -0.016300 +vn -0.922600 -0.319900 -0.215400 +vn -0.926100 -0.374700 0.043400 +vn -0.978100 -0.207400 0.019400 +vn -0.996300 -0.063600 -0.057400 +vn -0.970300 -0.198600 0.138300 +vn -0.916500 0.115400 -0.383000 +vn -0.801200 0.187600 -0.568300 +vn -0.843800 0.135900 -0.519200 +vn -0.862700 0.112200 -0.493100 +vn -0.714900 0.269000 -0.645400 +vn -0.559800 0.376100 -0.738400 +vn -0.093600 0.598700 -0.795500 +vn -0.334600 0.493200 -0.803000 +vn -0.066600 0.591600 -0.803500 +vn 0.344600 0.651800 -0.675600 +vn 0.173200 0.640700 -0.748000 +vn -0.846700 0.087200 -0.524800 +vn -0.892000 0.075300 -0.445700 +vn -0.873200 0.103700 -0.476300 +vn 0.976400 0.210600 -0.048400 +vn 0.958900 0.271800 -0.081600 +vn 0.862800 0.409400 -0.296700 +vn 0.871500 0.436600 -0.223400 +vn 0.257700 -0.947600 -0.188900 +vn 0.567000 -0.788200 -0.239200 +vn 0.792600 -0.585500 -0.170200 +vn -0.399200 -0.909400 0.116900 +vn -0.098100 -0.994200 -0.044300 +vn -0.768800 -0.566200 0.297300 +vn -0.614800 -0.750500 0.242500 +vn -0.894600 -0.369000 0.252200 +vn 0.996000 -0.013900 -0.087900 +vn 0.976300 0.055000 -0.209500 +vn 0.955000 0.181400 -0.234900 +vn 0.952000 0.129600 -0.277300 +vn 0.923500 0.219100 -0.314800 +vn 0.973300 0.180300 -0.142300 +vn 0.999800 0.008200 0.018900 +vn 0.983700 0.171700 -0.053700 +vn 0.889000 0.211000 0.406400 +vn 0.942300 0.113000 0.315100 +vn 0.976900 -0.189500 0.098900 +vn 0.873900 -0.303900 -0.379300 +vn 0.640500 -0.502800 -0.580500 +vn 0.733200 -0.578600 -0.357200 +vn 0.987000 -0.129300 0.095400 +vn 0.961400 -0.256100 -0.100100 +vn 0.873600 -0.486000 -0.026600 +vn 0.798000 -0.567800 -0.201900 +vn 0.970200 -0.155900 -0.185700 +vn 0.984200 -0.161200 -0.073700 +vn 0.947100 -0.302000 -0.108500 +vn 0.966800 -0.083600 -0.241600 +vn 0.914600 -0.358500 -0.187200 +vn 0.856700 -0.466800 -0.219300 +vn 0.796000 -0.537100 -0.279100 +vn 0.981700 -0.188000 0.031100 +vn 0.982000 -0.182000 0.051600 +vn 0.934200 -0.353200 -0.050900 +vn 0.696800 0.136100 0.704300 +vn 0.947300 0.302600 0.104700 +vn 0.855200 0.508700 0.099200 +vn 0.847000 0.352800 -0.397600 +vn 0.909100 0.399800 -0.116600 +vn 0.832500 0.495900 0.247200 +vn 0.872300 0.449600 -0.192100 +vn 0.801000 0.570500 0.181800 +vn 0.858500 0.387700 -0.335500 +vn 0.984900 0.131300 -0.112800 +vn 0.951000 0.222900 0.214100 +vn 0.883400 0.283700 -0.373000 +vn 0.858500 0.278300 -0.430800 +vn 0.914200 0.264800 -0.306900 +vn 0.818600 0.309100 -0.484100 +vn 0.960700 0.061200 -0.270900 +vn 0.264800 0.959400 0.097200 +vn 0.171300 0.901400 0.397700 +vn 0.517500 0.756900 -0.399200 +vn 0.529600 0.743100 -0.409000 +vn 0.534800 0.787700 -0.305900 +vn 0.511200 0.809100 -0.289700 +vn 0.637600 0.679000 -0.364000 +vn 0.588000 0.787600 -0.184300 +vn 0.652200 0.612400 -0.446800 +vn 0.525800 0.689400 -0.498300 +vn 0.683200 0.570600 -0.455700 +vn 0.480600 0.718300 -0.503100 +vn 0.448700 0.667100 -0.594700 +vn 0.542600 0.634500 -0.550400 +vn 0.619600 0.611200 -0.492500 +vn 0.716300 0.560000 -0.416400 +vn 0.489100 0.646700 -0.585200 +vn -0.073000 0.994800 -0.071700 +vn -0.028600 0.995800 -0.087500 +vn -0.042500 0.992000 0.118500 +vn -0.033800 0.994200 -0.102500 +vn -0.007800 0.995600 0.093800 +vn -0.009100 0.994400 0.104800 +vn -0.003800 0.973600 0.228100 +vn -0.022900 0.973500 0.227500 +vn -0.062500 0.991200 -0.116600 +vn -0.014300 0.996900 0.077400 +vn -0.104200 0.985400 -0.134700 +vn -0.020100 0.998300 0.054500 +vn 0.018900 0.973800 0.226600 +vn -0.223200 0.961500 -0.160500 +vn -0.118900 0.992600 0.025300 +vn -0.469000 0.863400 -0.185600 +vn -0.383600 0.923500 -0.008700 +vn -0.281800 0.940300 0.190700 +vn 0.056800 0.973600 0.221100 +vn -0.745100 0.637100 -0.197100 +vn -0.696600 0.715700 -0.050100 +vn -0.902000 0.380800 -0.203200 +vn -0.883700 0.458400 -0.094800 +vn -0.833700 0.551800 0.020300 +vn -0.602300 0.788600 0.123700 +vn -0.968900 0.084400 -0.232800 +vn -0.981700 0.115900 -0.151400 +vn -0.954000 0.269300 -0.131400 +vn -0.986600 0.140000 -0.083400 +vn -0.944100 0.325300 -0.053600 +vn -0.953500 0.208200 -0.218000 +vn -0.971000 -0.011500 -0.238600 +vn -0.966800 -0.084100 -0.241200 +vn -0.987900 -0.008100 -0.154700 +vn -0.983300 -0.102600 -0.150400 +vn -0.995200 -0.001600 -0.097900 +vn -0.602500 0.022000 0.797800 +vn -0.627500 0.211400 0.749400 +vn -0.927700 0.300700 0.221100 +vn -0.596400 0.521900 0.609800 +vn -0.746000 0.607900 0.272000 +vn -0.961900 0.110100 0.250400 +vn -0.988100 -0.110000 -0.107100 +vn -0.964100 -0.115200 0.239300 +vn -0.964900 -0.010300 0.262300 +vn -0.606600 -0.109400 0.787400 +vn -0.588300 -0.038200 0.807700 +vn -0.780800 0.233000 -0.579700 +vn -0.846500 0.082600 -0.525900 +vn -0.885000 0.310000 -0.347400 +vn -0.856400 -0.018200 -0.516000 +vn -0.929500 0.143400 -0.339800 +vn -0.932600 0.036500 -0.359000 +vn -0.413200 0.582600 -0.699900 +vn -0.631100 0.422700 -0.650400 +vn -0.489500 0.772900 -0.403700 +vn -0.740500 0.553400 -0.381300 +vn -0.448400 0.809400 0.379300 +vn -0.289300 0.601400 0.744700 +vn -0.208900 0.882900 0.420600 +vn -0.141600 0.685200 0.714500 +vn -0.052700 0.785100 0.617200 +vn 0.035800 0.884300 0.465500 +vn 0.063700 0.935600 0.347400 +vn -0.013400 0.921500 0.388100 +vn -0.018100 0.977000 0.212600 +vn -0.032300 0.822600 0.567700 +vn 0.011200 0.849200 0.527900 +vn -0.064100 0.521500 0.850800 +vn -0.041300 0.622200 0.781700 +vn -0.084800 0.351100 0.932500 +vn -0.214200 0.247900 0.944800 +vn -0.160300 0.039700 0.986300 +vn -0.018100 0.144700 0.989300 +vn -0.177300 0.677100 -0.714200 +vn -0.242300 0.656600 -0.714200 +vn -0.264800 0.878300 -0.398100 +vn -0.150700 0.910400 -0.385200 +vn -0.246000 0.361800 -0.899200 +vn -0.236200 0.330800 -0.913700 +vn -0.208700 0.398600 -0.893100 +vn -0.278800 0.288200 -0.916100 +vn -0.298700 0.363500 -0.882400 +vn -0.202600 0.408800 -0.889900 +vn -0.389200 0.220700 -0.894300 +vn -0.529000 0.118100 -0.840300 +vn -0.457800 0.281100 -0.843400 +vn -0.614000 0.159200 -0.773100 +vn -0.220800 0.398000 -0.890400 +vn -0.253600 0.385300 -0.887300 +vn -0.214900 0.419700 -0.881800 +vn -0.196000 0.442600 -0.875000 +vn -0.158600 0.685500 -0.710500 +vn -0.073000 0.725100 -0.684800 +vn -0.058400 0.484600 -0.872800 +vn -0.102600 0.718900 -0.687500 +vn -0.048700 0.396200 -0.916900 +vn -0.140600 0.470200 -0.871300 +vn -0.150500 0.398100 -0.904900 +vn -0.134900 0.700500 -0.700800 +vn -0.061100 0.932000 -0.357200 +vn -0.072000 0.926500 -0.369500 +vn -0.085000 0.932000 -0.352400 +vn -0.103200 0.919900 -0.378300 +vn 0.024700 0.937700 0.346500 +vn -0.016000 0.934400 0.355800 +vn -0.029300 0.933800 0.356700 +vn -0.060200 0.808000 0.586100 +vn -0.049900 0.813100 0.580000 +vn -0.010300 0.973900 0.226600 +vn -0.030800 0.936900 0.348200 +vn -0.076300 0.518500 0.851700 +vn -0.041500 0.464300 0.884700 +vn 0.012900 -0.921900 0.387200 +vn -0.044300 -0.921800 0.385100 +vn -0.040700 -0.995500 0.085800 +vn -0.042900 -0.927200 0.372000 +vn -0.063800 -0.995200 0.074700 +vn -0.083700 -0.992300 -0.091100 +vn 0.009700 -0.995200 0.097300 +vn -0.050800 -0.995200 -0.084100 +vn -0.020000 -0.220700 0.975100 +vn -0.065100 -0.583400 0.809500 +vn -0.000800 -0.603000 0.797800 +vn -0.040500 -0.683500 0.728900 +vn -0.044200 -0.703800 -0.709000 +vn -0.023000 -0.703600 -0.710200 +vn -0.057000 -0.712100 -0.699800 +vn -0.005400 -0.708300 -0.705900 +vn -0.030100 -0.707500 -0.706100 +vn -0.000800 -0.704900 -0.709300 +vn -0.045400 -0.767000 -0.640000 +vn -0.067100 -0.772900 -0.631000 +vn -0.095700 -0.913600 -0.395300 +vn -0.083000 -0.833600 -0.546200 +vn -0.058900 -0.828400 -0.557000 +vn -0.004500 -0.761300 -0.648300 +vn -0.061600 -0.916200 -0.396000 +vn -0.013100 -0.825600 -0.564100 +vn -0.094300 -0.972200 -0.214300 +vn -0.057500 -0.975700 -0.211500 +vn -0.017100 -0.918600 -0.394800 +vn -0.001800 -0.997100 -0.075800 +vn -0.817600 -0.086800 -0.569100 +vn -0.712900 -0.108300 -0.692800 +vn -0.789600 -0.101700 -0.605100 +vn -0.669800 -0.135200 -0.730200 +vn -0.646500 -0.151100 -0.747800 +vn -0.683400 -0.104400 -0.722500 +vn -0.608200 -0.172200 -0.774800 +vn -0.637200 -0.130500 -0.759600 +vn -0.734500 -0.175300 -0.655600 +vn -0.546600 -0.223700 -0.807000 +vn -0.553800 -0.240000 -0.797300 +vn -0.162900 -0.034400 0.986000 +vn -0.189500 -0.106300 0.976100 +vn -0.106800 -0.527900 0.842600 +vn -0.120500 -0.911500 0.393300 +vn -0.065100 -0.700400 0.710800 +vn -0.103900 -0.916300 0.386700 +vn -0.103700 -0.992000 0.071600 +vn -0.150200 -0.985600 0.077700 +vn -0.111800 -0.989200 -0.095100 +vn -0.136100 -0.986500 -0.091200 +vn -0.112200 -0.970800 -0.212200 +vn -0.117300 -0.969500 -0.215300 +vn -0.097200 -0.918300 -0.383800 +vn -0.112400 -0.912900 -0.392400 +vn -0.111700 -0.761800 -0.638100 +vn -0.091400 -0.771100 -0.630100 +vn -0.088200 -0.843900 -0.529200 +vn -0.097100 -0.837900 -0.537100 +vn -0.176700 -0.677500 -0.714000 +vn -0.093600 -0.701800 -0.706100 +vn -0.155400 -0.672200 -0.723900 +vn -0.098300 -0.703200 -0.704100 +vn -0.349000 -0.537000 -0.768000 +vn -0.262700 -0.623100 -0.736700 +vn -0.276600 -0.547200 -0.790000 +vn -0.209800 -0.621900 -0.754500 +vn -0.124800 -0.745100 -0.655100 +vn -0.163500 -0.709600 -0.685400 +vn -0.377400 -0.440000 -0.814800 +vn -0.269100 -0.626100 -0.731800 +vn -0.413800 -0.843200 -0.343300 +vn -0.415200 -0.701000 -0.579800 +vn -0.187000 -0.805500 -0.562400 +vn -0.417300 -0.506500 -0.754600 +vn -0.174400 -0.918100 -0.355900 +vn -0.084600 -0.840300 -0.535400 +vn -0.072400 -0.846800 -0.527000 +vn -0.068200 -0.925500 -0.372600 +vn -0.069000 -0.929800 -0.361600 +vn -0.421500 -0.905300 -0.052800 +vn -0.421900 -0.891900 -0.163000 +vn -0.205000 -0.962600 -0.177400 +vn -0.242000 -0.968500 -0.058100 +vn -0.100700 -0.976500 -0.190700 +vn -0.152100 -0.986000 -0.068300 +vn -0.093100 -0.974600 -0.203500 +vn -0.142200 -0.986600 -0.080300 +vn -0.182400 -0.980300 0.075300 +vn -0.293800 -0.948400 0.119200 +vn -0.186200 -0.951200 0.246100 +vn -0.296200 -0.806200 0.512100 +vn -0.420100 -0.894400 0.153200 +vn -0.129900 -0.923500 0.361100 +vn -0.150900 -0.985700 0.075400 +vn -0.372500 -0.714600 0.592100 +vn -0.158000 -0.648000 0.745100 +vn -0.189000 -0.342800 0.920200 +vn -0.681300 -0.534100 0.500600 +vn -0.811500 -0.570800 0.124900 +vn -0.471800 -0.654000 0.591400 +vn -0.845000 -0.527700 -0.087000 +vn -0.642000 -0.764200 -0.062300 +vn -0.584600 -0.798900 0.141600 +vn -0.943400 -0.280200 0.177500 +vn -0.655600 -0.273200 0.704000 +vn -0.955600 -0.275000 -0.106200 +vn -0.305500 -0.313500 0.899100 +vn -0.871000 -0.471000 -0.139700 +vn -0.675100 -0.722800 -0.147800 +vn -0.877500 -0.394600 -0.272800 +vn -0.690100 -0.653200 -0.311800 +vn -0.830700 -0.281800 -0.480100 +vn -0.669900 -0.506100 -0.543200 +vn -0.605500 -0.332700 -0.723000 +vn -0.909400 -0.073100 -0.409400 +vn -0.889800 -0.132200 -0.436700 +vn -0.949600 -0.190500 -0.249000 +vn -0.629600 0.002100 -0.776900 +vn -0.663900 -0.078400 -0.743700 +vn -0.709600 0.038800 -0.703500 +vn -0.741900 -0.056900 -0.668100 +vn -0.734800 -0.105300 -0.670100 +vn -0.672100 -0.114300 -0.731600 +vn -0.840300 -0.074900 -0.536900 +vn -0.922400 -0.034200 -0.384700 +vn -0.959600 -0.242400 -0.143000 +vn -0.043000 0.455500 -0.889200 +vn -0.090900 0.451700 -0.887500 +vn -0.115900 0.425200 -0.897700 +vn -0.144500 0.478000 -0.866400 +vn -0.184600 0.452100 -0.872700 +vn -0.042600 0.417500 -0.907700 +vn -0.255500 0.464100 -0.848100 +vn -0.229500 0.503400 -0.833000 +vn -0.296300 0.438500 -0.848500 +vn -0.304400 0.492700 -0.815200 +vn -0.313800 0.382000 -0.869300 +vn -0.351000 0.436200 -0.828600 +vn -0.348500 0.305700 -0.886000 +vn -0.392400 0.345200 -0.852600 +vn -0.455200 0.236800 -0.858300 +vn -0.426300 0.215300 -0.878600 +vn -0.575200 0.099100 -0.812000 +vn -0.551300 0.091900 -0.829200 +vn -0.688500 -0.038200 -0.724200 +vn -0.716300 -0.068100 -0.694500 +vn -0.643600 -0.026100 -0.764900 +vn -0.678600 -0.080500 -0.730100 +vn -0.749300 -0.114200 -0.652300 +vn -0.760800 -0.260600 -0.594400 +vn -0.699900 -0.104000 -0.706700 +vn -0.717900 -0.173100 -0.674200 +vn -0.707300 -0.403100 -0.580800 +vn -0.631000 -0.505300 -0.588700 +vn -0.696600 -0.268100 -0.665400 +vn -0.643800 -0.343400 -0.683900 +vn -0.571500 -0.577600 -0.583000 +vn -0.479100 -0.668300 -0.569100 +vn -0.594100 -0.413600 -0.689900 +vn -0.533700 -0.507000 -0.676800 +vn -0.517800 -0.312000 -0.796600 +vn -0.439200 -0.613400 -0.656400 +vn -0.386300 -0.742700 -0.547000 +vn -0.282500 -0.807400 -0.518000 +vn -0.441800 -0.421800 -0.791800 +vn -0.342100 -0.699300 -0.627700 +vn -0.198800 -0.843700 -0.498600 +vn -0.122600 -0.874200 -0.469800 +vn -0.245200 -0.760900 -0.600800 +vn -0.154100 -0.796400 -0.584700 +vn -0.050100 -0.905400 -0.421700 +vn -0.015100 -0.924800 -0.380200 +vn -0.071300 -0.822400 -0.564400 +vn -0.026500 -0.838200 -0.544700 +vn -0.016700 -0.848000 -0.529800 +vn -0.011300 -0.932000 -0.362200 +vn 0.000900 -0.930500 -0.366200 +vn -0.004600 -0.851400 -0.524500 +vn -0.232100 -0.968400 -0.091500 +vn 0.092800 -0.995700 -0.006300 +vn -0.223500 -0.968500 0.109700 +vn 0.361800 -0.926500 0.103600 +vn 0.088700 -0.983100 0.160400 +vn 0.364300 -0.906000 0.215600 +vn 0.340900 -0.868600 0.359600 +vn -0.207000 -0.925300 0.317700 +vn -0.703200 -0.662700 0.257600 +vn -0.746500 -0.665200 0.015600 +vn -0.513400 -0.856000 0.061000 +vn -0.742900 -0.646400 -0.173700 +vn -0.524200 -0.839400 -0.143400 +vn -0.471300 -0.832500 0.291400 +vn -0.971500 -0.136500 0.193600 +vn -0.988200 -0.141800 -0.057400 +vn -0.909800 -0.414300 -0.026700 +vn -0.956300 -0.149600 -0.251100 +vn -0.888200 -0.417000 -0.192800 +vn -0.880100 -0.420900 0.219500 +vn -0.869600 0.471900 0.145400 +vn -0.872400 0.464100 -0.153100 +vn -0.983200 0.160300 -0.087800 +vn -0.805500 0.443800 -0.392800 +vn -0.958500 0.135900 -0.250600 +vn -0.968600 0.172800 0.178900 +vn -0.374800 0.740000 -0.558500 +vn -0.591700 0.637200 -0.493900 +vn -0.430800 0.846000 -0.314100 +vn -0.676800 0.696900 -0.237300 +vn -0.693500 0.715600 0.083400 +vn -0.465800 0.884800 0.015500 +vn 0.104800 0.833400 -0.542700 +vn -0.137300 0.812000 -0.567200 +vn 0.084100 0.924100 -0.372700 +vn -0.166300 0.917800 -0.360400 +vn -0.217700 0.975300 -0.036800 +vn 0.032400 0.997700 -0.060100 +vn 0.272000 0.961500 -0.038700 +vn 0.313500 0.883100 -0.349100 +vn 0.475200 0.879700 0.016700 +vn 0.510300 0.808600 -0.292900 +vn 0.510300 0.736400 -0.444200 +vn 0.322600 0.802400 -0.502100 +vn 0.640800 0.763200 0.083800 +vn 0.768800 0.622300 0.147300 +vn 0.671800 0.708300 -0.217000 +vn 0.794400 0.592400 -0.134200 +vn 0.667400 0.645900 -0.370800 +vn 0.904700 0.352000 0.240000 +vn 0.925400 0.378900 0.010000 +vn 0.875000 0.480500 -0.058600 +vn 0.915300 0.372000 -0.154800 +vn 0.867400 0.446900 -0.218900 +vn 0.788000 0.542600 -0.290900 +vn 0.854200 0.481200 0.197000 +vn 0.746400 -0.579100 0.327900 +vn 0.869600 -0.348100 0.350100 +vn 0.770500 -0.539100 0.340300 +vn 0.943100 -0.128700 0.306700 +vn 0.883200 -0.316200 0.346400 +vn 0.942500 -0.119200 0.312300 +vn 0.868000 -0.306700 0.390600 +vn 0.751300 -0.517700 0.409200 +vn 0.979800 0.056600 0.191600 +vn 0.978000 0.208400 -0.012400 +vn 0.968600 0.033700 0.246400 +vn 0.972900 0.162900 0.163900 +vn 0.940900 0.013400 0.338500 +vn 0.925100 -0.121100 0.359800 +vn 0.940700 0.123200 0.316100 +vn 0.957400 0.276800 0.082300 +vn 0.949900 0.302500 -0.078300 +vn 0.930800 0.233000 0.281600 +vn 0.595800 -0.750400 0.286200 +vn 0.577000 -0.715600 0.393600 +vn 0.570200 -0.788500 0.230600 +vn -0.452500 -0.531600 0.716000 +vn -0.577900 -0.365700 0.729500 +vn -0.598400 -0.615300 0.513200 +vn -0.664900 -0.124200 0.736500 +vn -0.763900 -0.405900 0.501700 +vn -0.859800 -0.132700 0.493000 +vn -0.092900 -0.340200 0.935800 +vn -0.209700 -0.272200 0.939100 +vn -0.378600 -0.322000 0.867700 +vn -0.280700 -0.110500 0.953400 +vn -0.461000 -0.115200 0.879900 +vn -0.288300 -0.435800 0.852600 +vn -0.457000 0.103100 0.883500 +vn -0.271800 0.054400 0.960800 +vn -0.195900 0.130600 0.971900 +vn -0.661600 0.133100 0.737900 +vn -0.425300 0.239000 0.873000 +vn -0.606700 0.341900 0.717600 +vn -0.856300 0.162200 0.490300 +vn -0.772600 0.428800 0.468200 +vn -0.529000 0.527900 0.664400 +vn -0.396400 0.687000 0.609000 +vn -0.449900 0.816600 0.361600 +vn -0.634800 0.651700 0.415100 +vn -0.297700 0.285400 0.911000 +vn -0.421500 0.381800 0.822500 +vn -0.293800 0.464300 0.835500 +vn -0.345100 0.564300 0.750000 +vn 0.034600 0.444800 0.894900 +vn -0.021600 0.497900 0.867000 +vn -0.145700 0.350100 0.925300 +vn -0.096800 0.572200 0.814400 +vn -0.186000 0.517200 0.835400 +vn -0.094500 0.261800 0.960500 +vn -0.087500 0.670900 0.736400 +vn -0.216000 0.656600 0.722600 +vn -0.074800 0.795100 0.601800 +vn -0.234500 0.773700 0.588600 +vn -0.244800 0.910100 0.334300 +vn -0.034200 0.941700 0.334700 +vn 0.081600 0.764000 0.640000 +vn 0.212100 0.694900 0.687100 +vn 0.175100 0.913900 0.366200 +vn 0.354100 0.837000 0.417300 +vn 0.031600 0.628100 0.777500 +vn 0.116000 0.561300 0.819500 +vn 0.098300 0.375600 0.921600 +vn 0.154900 0.289000 0.944700 +vn 0.194400 0.481700 0.854500 +vn 0.281200 0.375000 0.883300 +vn 0.328800 0.601500 0.728100 +vn 0.446000 0.477500 0.757100 +vn 0.506100 0.724600 0.467700 +vn 0.637500 0.581200 0.505700 +vn -0.153100 -0.738300 0.656800 +vn -0.320900 -0.653100 0.685900 +vn -0.181600 -0.838600 0.513600 +vn -0.401300 -0.758400 0.513600 +vn 0.249000 -0.705400 0.663600 +vn 0.043400 -0.758000 0.650800 +vn 0.054100 -0.852100 0.520600 +vn 0.073200 -0.939000 0.336100 +vn 0.294800 -0.791000 0.536100 +vn 0.546300 -0.459200 0.700500 +vn 0.426400 -0.593100 0.683000 +vn 0.662800 -0.494400 0.562400 +vn 0.508200 -0.658600 0.555000 +vn 0.792800 0.275800 0.543500 +vn 0.813400 0.149900 0.562100 +vn 0.604000 0.164600 0.779800 +vn 0.612100 0.037700 0.789900 +vn 0.609800 -0.017000 0.792400 +vn 0.818700 0.061500 0.571000 +vn 0.410500 0.066900 0.909400 +vn 0.401600 -0.062200 0.913700 +vn 0.242900 0.014900 0.969900 +vn 0.229100 -0.090400 0.969200 +vn 0.385600 -0.078700 0.919300 +vn 0.017200 0.027400 0.999500 +vn 0.069500 -0.043200 0.996600 +vn 0.149900 -0.107700 0.982800 +vn 0.364700 0.230700 0.902100 +vn 0.213900 0.156800 0.964200 +vn 0.546800 0.326200 0.771100 +vn 0.735800 0.426100 0.526300 +vn 0.075500 0.109000 0.991200 +vn -0.018800 -0.030200 0.999400 +vn -0.061000 -0.106600 0.992400 +vn -0.098200 -0.026300 0.994800 +vn 0.024600 -0.194100 0.980700 +vn -0.071300 -0.195200 0.978200 +vn 0.295900 -0.162100 0.941400 +vn 0.256700 -0.102400 0.961100 +vn 0.093900 -0.247900 0.964200 +vn 0.114900 -0.180800 0.976800 +vn 0.418700 -0.072300 0.905200 +vn 0.457400 -0.147300 0.877000 +vn 0.630600 -0.052700 0.774400 +vn 0.826600 -0.018700 0.562500 +vn 0.651900 -0.148000 0.743700 +vn 0.821800 -0.140100 0.552300 +vn 0.454300 -0.284000 0.844400 +vn 0.293800 -0.275700 0.915200 +vn 0.405800 -0.414800 0.814400 +vn 0.625900 -0.303700 0.718300 +vn 0.770300 -0.312300 0.556000 +vn 0.249900 -0.384300 0.888700 +vn 0.204700 -0.451400 0.868500 +vn 0.332900 -0.520400 0.786400 +vn 0.147300 -0.536500 0.831000 +vn 0.202200 -0.620200 0.758000 +vn 0.149700 -0.283800 0.947100 +vn 0.065700 -0.349500 0.934600 +vn 0.038900 -0.536800 0.842800 +vn 0.036500 -0.664200 0.746600 +vn -0.069100 -0.533700 0.842800 +vn -0.118900 -0.632600 0.765300 +vn -0.109200 -0.432400 0.895100 +vn 0.046600 -0.415100 0.908600 +vn -0.231900 -0.528800 0.816500 +vn -0.020300 0.145900 0.989100 +vn -0.007600 0.267900 0.963400 +vn -0.379100 0.299100 0.875700 +vn 0.711400 -0.552600 0.434300 +vn 0.034500 0.388700 -0.920700 +vn -0.896900 0.442000 -0.017700 +vn -0.799100 0.589500 0.118100 +vn -0.500800 0.862400 -0.073300 +vn -0.422400 0.905300 -0.044000 +vn -0.310200 -0.815400 -0.488800 +vn -0.729000 -0.391600 0.561500 +vn -0.940000 -0.228000 0.253900 +vn -0.510200 0.668200 0.541400 +vn -0.766700 -0.636200 -0.086600 +vn -0.235400 -0.775700 -0.585500 +vn -0.183600 -0.818900 -0.543800 +vn 0.267600 0.915100 -0.301800 +vn 0.302500 0.750200 -0.587900 +vn 0.225600 0.901800 -0.368700 +vn 0.309600 0.618600 -0.722100 +vn 0.277000 0.665800 -0.692800 +vn 0.270000 0.493200 -0.826900 +vn 0.126500 0.617600 -0.776300 +vn -0.363000 0.526300 -0.768900 +vn -0.373600 0.589400 -0.716300 +vn -0.134800 0.599400 -0.789000 +vn -0.453500 0.721800 -0.522800 +vn -0.228600 0.820700 -0.523600 +vn -0.130900 0.481900 -0.866400 +vn 0.114100 0.447900 -0.886800 +vn -0.393300 0.852700 -0.343800 +vn -0.431000 0.837900 -0.335000 +vn -0.453200 0.642900 -0.617500 +vn -0.472000 0.843600 -0.256100 +vn -0.488000 0.656800 -0.574900 +vn -0.554300 0.710700 -0.433200 +vn 0.041900 0.890800 -0.452600 +vn -0.284000 0.900200 -0.330100 +vn -0.502600 0.782100 -0.368400 +vn -0.490300 0.788600 -0.371200 +vn -0.022800 0.963800 -0.265800 +vn -0.020300 0.936000 -0.351500 +vn 0.353600 0.907500 -0.226600 +vn 0.276500 0.949800 -0.146100 +vn 0.181500 0.960900 -0.209200 +vn 0.210400 0.926400 -0.312300 +vn 0.567100 -0.333700 -0.753000 +vn 0.749200 -0.255600 -0.611000 +vn 0.592900 -0.287700 -0.752100 +vn 0.893300 -0.198600 -0.403200 +vn 0.824700 -0.188400 -0.533300 +vn 0.950500 -0.113700 -0.289200 +vn 0.974500 -0.014000 -0.224100 +vn 0.868100 -0.147000 -0.474200 +vn 0.990500 0.040100 -0.131900 +vn 0.990800 0.050200 -0.125900 +vn 0.993000 0.095900 -0.068900 +vn 0.992500 0.104000 -0.065000 +vn 0.974200 0.159600 -0.159900 +vn 0.976500 -0.017400 -0.214800 +vn 0.967200 0.102200 -0.232600 +vn 0.971900 0.225500 -0.068300 +vn 0.985800 0.167000 0.016400 +vn 0.995800 0.066500 -0.062800 +vn 0.967800 0.235100 0.089800 +vn 0.958500 0.284800 0.014800 +vn 0.920700 0.378000 0.097200 +vn 0.991000 0.132800 0.015400 +vn 0.946200 0.306900 0.102600 +vn 0.902700 0.388500 0.184800 +vn 0.827300 0.526000 0.197500 +vn 0.863200 0.485500 0.138400 +vn 0.512800 0.855500 -0.071600 +vn 0.604500 0.727300 -0.325000 +vn 0.338300 0.919000 -0.202500 +vn 0.583700 0.653800 -0.481400 +vn 0.407900 0.780500 -0.473800 +vn 0.383100 0.693300 -0.610400 +vn 0.746400 0.651900 0.133700 +vn 0.849100 0.509500 0.139200 +vn 0.700300 0.694900 0.163700 +vn 0.728700 0.680800 0.074600 +vn 0.492000 0.867600 0.072600 +vn 0.594500 0.802900 0.043000 +vn 0.461700 0.881700 -0.097200 +vn 0.345600 0.937300 -0.045100 +vn 0.969700 0.234600 -0.068300 +vn 0.926900 0.343800 -0.150400 +vn 0.759100 0.564300 -0.324500 +vn 0.812000 0.569000 -0.130000 +vn 0.998000 0.054500 -0.031100 +vn 0.947400 -0.200000 -0.250000 +vn 0.498600 -0.722000 -0.479700 +vn 0.954600 -0.172200 -0.243200 +vn 0.996500 0.068000 -0.047900 +vn 0.840100 0.413400 0.351100 +vn 0.771800 0.443000 0.456100 +vn 0.980300 0.180400 0.080800 +vn 0.964400 -0.162000 -0.209000 +vn 0.992700 -0.037200 -0.114700 +vn 0.169200 -0.392500 -0.904000 +vn 0.062300 -0.469900 -0.880500 +vn 0.136400 -0.554000 -0.821300 +vn 0.117900 -0.604200 -0.788100 +vn 0.131200 -0.696900 -0.705100 +vn 0.149200 -0.664100 -0.732600 +vn -0.331400 -0.677400 0.656700 +vn -0.463800 -0.770400 -0.437500 +vn -0.396500 -0.465100 0.791500 +vn -0.347400 -0.033600 0.937100 +vn -0.325200 0.008800 0.945600 +vn -0.773800 -0.036100 0.632400 +vn -0.314300 -0.225100 0.922200 +vn -0.660100 0.064000 0.748400 +vn -0.845100 -0.309500 0.435900 +vn -0.429400 -0.506900 -0.747500 +vn -0.285100 -0.507000 -0.813500 +vn 0.287200 -0.304200 -0.908300 +vn -0.832700 -0.477800 -0.280000 +vn 0.102900 -0.329400 -0.938600 +vn -0.915200 -0.271400 0.298000 +vn -0.468100 0.071100 0.880800 +vn -0.380600 -0.011900 0.924600 +vn -0.861700 -0.411500 0.297000 +vn -0.504500 -0.292100 0.812500 +vn -0.227300 -0.322600 0.918800 +vn -0.272800 -0.483600 0.831700 +vn -0.405100 -0.536300 0.740400 +vn -0.777000 0.398800 0.487000 +vn -0.980200 0.024400 0.196400 +vn -0.658300 -0.544900 0.519400 +vn -0.586400 -0.696400 0.413800 +vn -0.886800 -0.436000 -0.153300 +vn -0.926700 0.138500 -0.349300 +vn -0.345000 -0.162000 0.924500 +vn -0.143000 -0.087200 0.985900 +vn -0.099000 0.069300 0.992700 +vn -0.355600 0.107700 0.928400 +vn -0.166700 0.177700 0.969900 +vn -0.342100 0.347300 0.873100 +vn -0.398700 0.548300 0.735100 +vn -0.351100 0.352600 0.867400 +vn 0.130600 -0.448000 -0.884500 +vn -0.011100 -0.428900 -0.903300 +vn -0.009500 -0.484600 -0.874700 +vn -0.139200 -0.382100 -0.913600 +vn -0.107200 -0.512700 -0.851900 +vn -0.062800 -0.592900 -0.802800 +vn 0.140600 -0.475200 -0.868600 +vn 0.030700 -0.521700 -0.852600 +vn 0.259100 -0.410000 -0.874500 +vn 0.203200 -0.436500 -0.876500 +vn 0.238100 -0.457000 -0.857000 +vn 0.157800 -0.505400 -0.848400 +vn 0.306700 -0.415400 -0.856400 +vn 0.261700 -0.493800 -0.829300 +vn 0.327500 -0.454100 -0.828600 +vn 0.415100 -0.399700 -0.817300 +vn 0.402900 -0.360700 -0.841200 +vn 0.351800 -0.381400 -0.854900 +vn 0.591900 -0.308900 -0.744500 +vn 0.874400 -0.187000 -0.447700 +vn 0.948300 0.013500 -0.317000 +vn 0.594300 -0.362800 -0.717800 +vn 0.849400 -0.156400 -0.504000 +vn 0.246300 -0.395200 -0.884900 +vn 0.339600 -0.404300 -0.849200 +vn 0.393300 -0.295800 -0.870500 +vn 0.279100 -0.259600 -0.924500 +vn 0.057600 -0.357900 -0.932000 +vn 0.104000 -0.434500 -0.894600 +vn 0.189500 -0.397600 -0.897800 +vn 0.189000 -0.273700 -0.943000 +vn -0.470600 -0.586000 -0.659700 +vn -0.158600 -0.487500 -0.858600 +vn -0.142400 -0.499400 -0.854600 +vn -0.047600 -0.491300 -0.869700 +vn -0.398800 -0.597300 -0.695900 +vn 0.006300 -0.403400 -0.915000 +vn -0.032500 -0.378600 -0.925000 +vn -0.002000 -0.529000 -0.848600 +vn 0.019000 -0.667800 -0.744100 +vn 0.936400 0.016900 -0.350500 +vn 0.916800 0.046300 -0.396600 +vn 0.917800 0.156900 -0.364800 +vn 0.913000 0.230300 -0.336800 +vn 0.899900 0.171800 -0.400800 +vn 0.861100 0.288000 -0.419100 +vn 0.908400 0.391900 -0.145500 +vn 0.840300 0.339000 -0.423100 +vn 0.848200 0.509500 -0.144700 +vn 0.742100 0.631800 -0.223700 +vn 0.771800 0.425000 -0.473000 +vn 0.657800 0.518300 -0.546600 +vn 0.605800 0.713400 -0.352100 +vn 0.456000 0.757200 -0.467700 +vn 0.506300 0.599200 -0.620100 +vn 0.330300 0.666300 -0.668500 +vn 0.280800 0.800300 -0.529800 +vn 0.029700 0.839600 -0.542400 +vn 0.094700 0.717900 -0.689700 +vn -0.291200 0.888200 -0.355400 +vn -0.245500 0.817100 -0.521700 +vn -0.429000 0.745000 -0.510800 +vn -0.168400 0.706600 -0.687300 +vn 0.863300 0.257600 -0.434000 +vn 0.911300 0.275500 -0.305900 +vn 0.921000 0.295400 -0.254100 +vn 0.849400 0.298200 -0.435500 +vn 0.860100 0.256800 -0.440800 +vn 0.853000 0.263200 -0.450800 +vn 0.928200 0.317100 -0.194400 +vn -0.875000 -0.066700 -0.479500 +vn -0.826500 0.234300 -0.511900 +vn -0.854300 -0.084200 -0.512900 +vn -0.872100 0.014500 -0.489100 +vn -0.862300 -0.063700 -0.502400 +vn -0.855200 0.056600 -0.515200 +vn -0.793800 0.220000 -0.567000 +vn -0.261300 -0.496300 -0.827900 +vn -0.009000 -0.386300 -0.922300 +vn -0.109600 -0.650800 -0.751300 +vn -0.515200 -0.554500 -0.653500 +vn -0.391900 -0.639800 -0.661100 +vn 0.177400 -0.311300 -0.933600 +vn 0.327300 -0.301800 -0.895400 +vn 0.157600 -0.637500 -0.754200 +vn 0.385400 -0.633600 -0.670800 +vn 0.486600 -0.340200 -0.804700 +vn 0.611000 -0.294000 -0.735000 +vn 0.592500 -0.613200 -0.522400 +vn 0.694000 -0.311300 -0.649200 +vn 0.800600 -0.473600 -0.366900 +vn 0.861000 -0.142000 -0.488400 +vn 0.925500 -0.214100 -0.312600 +vn 0.997400 -0.060600 -0.037900 +vn 0.983200 0.123900 -0.133800 +vn 0.937500 0.244500 -0.247800 +vn 0.872900 0.308300 -0.378100 +vn 0.844800 0.356000 -0.399400 +vn 0.777600 0.447600 -0.441600 +vn 0.664800 0.555300 -0.499700 +vn 0.512500 0.650300 -0.560700 +vn 0.329700 0.716000 -0.615400 +vn 0.107900 0.742800 -0.660800 +vn -0.135700 0.708500 -0.692500 +vn -0.348300 0.649900 -0.675500 +vn -0.328300 0.637800 -0.696800 +vn 0.890600 0.258900 -0.374000 +vn 0.885300 0.251000 -0.391400 +vn 0.886600 0.283200 -0.365600 +vn -0.826900 0.287600 -0.483300 +vn -0.856200 -0.034900 -0.515500 +vn -0.906400 0.089300 -0.412900 +vn -0.904700 -0.011700 -0.425800 +vn -0.624400 -0.571600 -0.532300 +vn -0.704400 -0.613100 -0.357600 +vn -0.202900 -0.895900 -0.395300 +vn -0.496200 -0.781000 -0.379200 +vn 0.122300 -0.930000 -0.346500 +vn 0.391000 -0.893900 -0.219100 +vn 0.607900 -0.792000 -0.055900 +vn 0.810800 -0.582200 0.060900 +vn 0.950600 -0.306900 0.046500 +vn -0.862700 -0.067000 -0.501300 +vn -0.874400 -0.070100 -0.480100 +vn -0.853900 -0.095600 -0.511600 +vn -0.855000 -0.082600 -0.512000 +vn -0.846200 -0.053400 -0.530100 +vn -0.850100 -0.142600 -0.507000 +vn -0.872300 -0.051500 -0.486300 +vn -0.964900 -0.249000 0.082900 +vn -0.889300 0.069200 0.452000 +vn -0.830500 0.191000 0.523300 +vn -0.599800 0.479200 0.640800 +vn -0.898400 -0.432500 -0.077100 +vn -0.868900 -0.470900 -0.152400 +vn -0.921300 -0.227600 -0.315200 +vn -0.993200 -0.029900 0.112800 +vn -0.919900 -0.371600 -0.125500 +vn -0.807400 -0.470000 -0.356600 +vn -0.826500 -0.319600 -0.463400 +vn -0.848500 -0.219700 -0.481400 +vn -0.830300 -0.315500 -0.459400 +vn -0.852700 -0.179200 -0.490700 +vn -0.888600 -0.118000 -0.443300 +vn -0.759400 -0.456100 -0.464000 +vn -0.742300 -0.470700 -0.476900 +vn -0.881400 -0.298800 -0.365900 +vn -0.868400 -0.269800 -0.416100 +vn -0.893000 -0.152200 -0.423600 +vn -0.826600 -0.440200 -0.350700 +vn -0.920500 -0.390700 -0.002300 +vn -0.976700 -0.185700 -0.107300 +vn -0.816300 -0.186300 0.546700 +vn -0.837600 0.151200 0.524900 +vn -0.991800 0.052800 -0.116700 +vn -0.771900 0.419200 0.478100 +vn -0.681500 0.583400 0.441700 +vn -0.953300 0.295100 -0.064300 +vn -0.963200 0.255800 -0.082200 +vn -0.869300 0.369200 0.328700 +vn -0.983500 0.128600 -0.127000 +vn -0.889500 -0.059500 -0.453000 +vn -0.902400 0.028300 -0.430000 +vn -0.925000 0.034000 -0.378500 +vn -0.900500 -0.160800 -0.404100 +vn -0.924200 -0.027000 -0.381000 +vn -0.549300 0.601900 0.579700 +vn -0.378400 0.921700 0.085200 +vn -0.319000 0.925300 0.205100 +vn -0.561300 0.759400 -0.329000 +vn -0.586600 0.722500 -0.366000 +vn -0.587100 0.688400 -0.425900 +vn -0.571000 0.709600 -0.412900 +vn -0.669900 0.720600 -0.178700 +vn -0.715100 0.582300 -0.386600 +vn -0.514900 0.537200 -0.668100 +vn -0.566400 0.625700 -0.536400 +vn -0.633000 0.433200 -0.641600 +vn -0.675000 0.505500 -0.537500 +vn -0.516100 0.675800 -0.526200 +vn -0.443400 0.593300 -0.671800 +vn -0.655200 0.430000 -0.621100 +vn -0.586400 0.513000 -0.626800 +vn -0.467400 0.578000 -0.668900 +vn 0.054700 0.965800 0.253300 +vn 0.006100 0.987000 0.160500 +vn -0.049500 0.988800 0.140600 +vn -0.036600 0.997700 -0.056400 +vn -0.095700 0.993700 -0.058900 +vn -0.005000 0.971400 0.237400 +vn -0.058500 0.958400 0.279300 +vn -0.015500 0.985100 0.171500 +vn 0.058600 0.961300 0.269200 +vn 0.074600 0.994500 -0.073200 +vn 0.039000 0.984400 0.171600 +vn 0.040800 0.997300 -0.061400 +vn -0.053100 0.962800 0.265000 +vn 0.095600 0.992400 0.078100 +vn -0.043800 0.989100 0.140600 +vn 0.286500 0.942300 -0.173100 +vn 0.125900 0.985900 -0.110500 +vn -0.149100 0.949900 0.274700 +vn 0.709900 0.677000 0.194200 +vn 0.807100 0.587300 -0.060600 +vn 0.284700 0.927600 0.242000 +vn 0.834000 0.492400 -0.249000 +vn 0.444400 0.895900 0.000500 +vn 0.569000 0.788900 -0.231900 +vn 0.932300 0.335800 0.134700 +vn 0.959300 0.269200 -0.084900 +vn 0.981100 0.163900 0.103100 +vn 0.988800 0.118900 -0.090300 +vn 0.972100 0.099900 -0.212300 +vn 0.945900 0.230300 -0.228700 +vn 0.997200 0.052200 0.054400 +vn 0.992100 0.028200 -0.122100 +vn 0.992500 0.068600 -0.101300 +vn 0.972000 0.002500 -0.235000 +vn 0.975400 0.041000 -0.216800 +vn 0.990900 0.108200 0.080000 +vn 0.565400 0.683300 0.462000 +vn 0.414600 0.609300 0.675900 +vn 0.814700 0.351500 0.461300 +vn 0.477200 0.329700 0.814600 +vn 0.849700 0.199500 0.488100 +vn 0.456100 0.162300 0.875000 +vn 0.421000 0.126100 0.898300 +vn 0.849900 0.155600 0.503500 +vn 0.429400 0.048600 0.901800 +vn 0.870600 0.083100 0.485000 +vn 0.933800 0.074900 -0.349800 +vn 0.908900 0.193400 -0.369500 +vn 0.831800 0.042300 -0.553500 +vn 0.804300 0.125600 -0.580800 +vn 0.716800 0.272600 -0.641800 +vn 0.813300 0.401200 -0.421300 +vn 0.564400 0.423800 -0.708400 +vn 0.615800 0.635900 -0.465200 +vn 0.403600 0.786500 -0.467500 +vn 0.159600 0.877400 0.452300 +vn 0.154000 0.691800 0.705500 +vn -0.050600 0.912800 0.405200 +vn -0.030200 0.950500 0.309200 +vn 0.016800 0.921900 0.387000 +vn -0.108400 0.933400 0.342000 +vn 0.037400 0.835200 0.548700 +vn 0.054500 0.768300 0.637700 +vn 0.084600 0.375400 0.923000 +vn 0.065100 0.623900 0.778800 +vn 0.062800 0.878600 0.473300 +vn 0.048600 0.487500 0.871800 +vn 0.179700 0.371700 0.910800 +vn 0.123900 0.122300 0.984700 +vn 0.418100 0.520000 -0.744800 +vn 0.253000 0.858600 -0.445900 +vn 0.308600 0.576400 -0.756600 +vn 0.153300 0.892600 -0.424000 +vn 0.392800 0.311400 -0.865300 +vn 0.405200 0.304000 -0.862200 +vn 0.329500 0.349000 -0.877300 +vn 0.351800 0.344500 -0.870400 +vn 0.259100 0.385800 -0.885500 +vn 0.212300 0.618800 -0.756300 +vn 0.584600 0.165600 -0.794200 +vn 0.478300 0.255700 -0.840100 +vn 0.556400 0.156500 -0.816100 +vn 0.472700 0.243500 -0.846900 +vn 0.115500 0.656500 -0.745500 +vn 0.280800 0.376300 -0.882900 +vn 0.179200 0.420700 -0.889300 +vn 0.202000 0.391200 -0.897900 +vn 0.104800 0.450900 -0.886400 +vn 0.026200 0.689800 -0.723500 +vn 0.135600 0.393200 -0.909400 +vn 0.057000 0.394200 -0.917300 +vn 0.028800 0.475500 -0.879200 +vn -0.037100 0.714200 -0.698900 +vn -0.036000 0.923700 -0.381400 +vn -0.095100 0.927900 -0.360400 +vn 0.061600 0.912600 -0.404200 +vn 0.049100 0.838100 0.543300 +vn 0.069600 0.942700 0.326400 +vn 0.074700 0.946900 0.312900 +vn 0.000500 0.819900 0.572500 +vn 0.004000 0.941600 0.336800 +vn -0.002100 0.517700 0.855500 +vn 0.067400 -0.996000 -0.058100 +vn 0.078000 -0.989800 0.119400 +vn 0.044200 -0.996900 -0.065800 +vn 0.078300 -0.907600 0.412600 +vn 0.058600 -0.992200 0.109800 +vn 0.069500 -0.910800 0.407000 +vn 0.081800 -0.556200 0.827000 +vn 0.045100 -0.670900 0.740200 +vn 0.041200 -0.708700 -0.704300 +vn 0.025700 -0.715100 -0.698600 +vn 0.084400 -0.719100 -0.689800 +vn 0.049000 -0.756900 -0.651700 +vn 0.100300 -0.706900 -0.700100 +vn 0.103900 -0.748900 -0.654500 +vn 0.045300 -0.821000 -0.569100 +vn 0.095800 -0.814800 -0.571800 +vn 0.033300 -0.918300 -0.394400 +vn 0.031000 -0.979000 -0.201500 +vn 0.075200 -0.915300 -0.395800 +vn 0.061400 -0.978300 -0.197800 +vn -0.013100 -0.978200 -0.207200 +vn 0.620700 -0.102300 -0.777300 +vn 0.660300 -0.008200 -0.751000 +vn 0.642300 -0.056100 -0.764400 +vn 0.669900 0.052200 -0.740600 +vn 0.699100 0.015400 -0.714800 +vn 0.714400 0.032800 -0.698900 +vn 0.837200 0.004600 -0.546900 +vn 0.760200 -0.142600 -0.633800 +vn 0.525900 -0.325900 -0.785700 +vn 0.568200 -0.216000 -0.794000 +vn 0.467000 -0.287500 -0.836200 +vn 0.551000 -0.168700 -0.817300 +vn 0.616300 -0.303200 -0.726800 +vn 0.453500 -0.433900 -0.778500 +vn 0.094000 -0.069200 0.993200 +vn 0.093900 0.039300 0.994800 +vn -0.023800 -0.011900 0.999600 +vn 0.130600 -0.888200 0.440500 +vn 0.110400 -0.535300 0.837400 +vn 0.128800 -0.889000 0.439300 +vn 0.091300 -0.655700 0.749500 +vn 0.085900 -0.995400 -0.042100 +vn 0.126000 -0.981300 0.145300 +vn 0.078400 -0.995600 -0.052300 +vn 0.104400 -0.985900 0.131000 +vn 0.095700 -0.911400 -0.400200 +vn 0.092300 -0.910100 -0.404000 +vn 0.071000 -0.977800 -0.197200 +vn 0.062500 -0.978600 -0.196100 +vn 0.131400 -0.807700 -0.574800 +vn 0.157500 -0.732300 -0.662500 +vn 0.211200 -0.702800 -0.679300 +vn 0.148600 -0.799600 -0.581900 +vn 0.171800 -0.687100 -0.706000 +vn 0.166300 -0.709900 -0.684400 +vn 0.265300 -0.676200 -0.687300 +vn 0.256900 -0.640600 -0.723600 +vn 0.332700 -0.571800 -0.749900 +vn 0.363700 -0.616400 -0.698400 +vn 0.439700 -0.534900 -0.721500 +vn 0.250400 -0.662500 -0.706000 +vn 0.381600 -0.489400 -0.784200 +vn 0.330000 -0.540600 -0.773800 +vn 0.276900 -0.612000 -0.740800 +vn 0.416300 -0.394700 -0.819100 +vn 0.490800 -0.434200 -0.755400 +vn 0.183000 -0.762600 -0.620500 +vn 0.271000 -0.724300 -0.634000 +vn 0.452900 -0.651000 -0.609200 +vn 0.211100 -0.892000 -0.399700 +vn 0.110000 -0.905900 -0.408900 +vn 0.160200 -0.783700 -0.600100 +vn 0.088300 -0.908200 -0.409000 +vn 0.077000 -0.980100 -0.183100 +vn 0.428000 -0.821500 -0.376800 +vn 0.181000 -0.968100 -0.173300 +vn 0.396000 -0.903500 -0.164000 +vn 0.189500 -0.981800 0.007200 +vn 0.101300 -0.994800 -0.009500 +vn 0.055200 -0.980000 -0.191400 +vn 0.085900 -0.996000 -0.026300 +vn 0.255100 -0.724800 0.640000 +vn 0.220800 -0.804000 0.552200 +vn 0.225100 -0.949600 0.218200 +vn 0.147100 -0.932400 0.330100 +vn 0.137600 -0.976900 0.163200 +vn 0.337100 -0.901800 0.270500 +vn 0.369300 -0.929100 0.022600 +vn 0.116600 -0.981600 0.151100 +vn 0.121800 -0.904100 0.409600 +vn 0.128200 -0.653400 0.746100 +vn 0.117800 -0.382500 0.916400 +vn 0.625100 -0.780000 0.027800 +vn 0.881100 -0.472300 0.026000 +vn 0.516800 -0.802600 0.298000 +vn 0.786900 -0.519100 0.333700 +vn 0.559800 -0.478400 0.676600 +vn 0.326900 -0.646100 0.689700 +vn 0.498200 -0.166900 0.850800 +vn 0.902000 -0.121800 0.414300 +vn 0.991400 -0.126900 0.032200 +vn 0.171500 -0.304600 0.936900 +vn 0.699300 -0.632100 -0.333900 +vn 0.896100 -0.337100 -0.288800 +vn 0.674900 -0.720900 -0.157800 +vn 0.901600 -0.404300 -0.153800 +vn 0.685100 -0.492000 -0.537300 +vn 0.858100 -0.255300 -0.445500 +vn 0.823500 -0.023900 -0.566800 +vn 0.918600 -0.074200 -0.388000 +vn 0.930700 -0.010800 -0.365700 +vn 0.961500 -0.096600 -0.257300 +vn 0.689300 0.036900 -0.723500 +vn 0.658000 0.077700 -0.749000 +vn 0.636900 0.069500 -0.767800 +vn 0.613700 0.085500 -0.784900 +vn 0.654500 0.074500 -0.752300 +vn 0.706500 0.031400 -0.707000 +vn 0.837600 0.010200 -0.546300 +vn 0.935200 0.017600 -0.353700 +vn 0.983800 -0.108700 -0.142400 +vn 0.104400 0.456100 -0.883800 +vn 0.073900 0.509200 -0.857500 +vn 0.040400 0.433200 -0.900400 +vn 0.021000 0.481200 -0.876300 +vn 0.192900 0.549300 -0.813000 +vn 0.119900 0.534000 -0.836900 +vn 0.160300 0.477200 -0.864100 +vn 0.244500 0.483000 -0.840800 +vn 0.412100 0.500700 -0.761300 +vn 0.302200 0.541600 -0.784400 +vn 0.343900 0.460700 -0.818200 +vn 0.426000 0.413100 -0.804900 +vn 0.620700 0.215800 -0.753800 +vn 0.660200 0.273500 -0.699500 +vn 0.517300 0.333100 -0.788300 +vn 0.527600 0.415600 -0.740800 +vn 0.684300 0.123300 -0.718700 +vn 0.676000 0.130300 -0.725300 +vn 0.725900 0.156300 -0.669800 +vn 0.727500 0.162000 -0.666700 +vn 0.720500 0.074600 -0.689400 +vn 0.694400 0.128900 -0.707900 +vn 0.774000 0.074600 -0.628800 +vn 0.733100 0.160200 -0.661000 +vn 0.692800 -0.258600 -0.673200 +vn 0.731100 -0.066100 -0.679100 +vn 0.694600 -0.440600 -0.568700 +vn 0.785500 -0.170600 -0.594900 +vn 0.552000 -0.547600 -0.628800 +vn 0.618000 -0.431700 -0.657000 +vn 0.517100 -0.682400 -0.516600 +vn 0.586700 -0.599900 -0.543900 +vn 0.361500 -0.811600 -0.459000 +vn 0.449300 -0.751200 -0.483600 +vn 0.421800 -0.710100 -0.563800 +vn 0.496000 -0.634100 -0.593200 +vn 0.231400 -0.803200 -0.549000 +vn 0.329100 -0.767200 -0.550500 +vn 0.191800 -0.874600 -0.445400 +vn 0.274300 -0.849400 -0.450900 +vn 0.059600 -0.838400 -0.541800 +vn 0.137100 -0.826400 -0.546200 +vn 0.044000 -0.909700 -0.412800 +vn 0.108500 -0.895100 -0.432400 +vn 0.016300 -0.921700 -0.387600 +vn 0.017100 -0.846300 -0.532400 +vn 0.035600 -0.182500 -0.982600 +vn 0.105600 -0.138900 -0.984700 +vn 0.160000 -0.243100 -0.956700 +vn 0.278100 -0.091200 -0.956200 +vn 0.094500 -0.268700 -0.958600 +vn 0.422500 -0.675700 -0.604200 +vn 0.262600 -0.818300 0.511400 +vn 0.347600 -0.936800 -0.040300 +vn 0.471400 -0.874500 0.114100 +vn 0.252200 -0.584000 -0.771600 +vn 0.404000 -0.567500 -0.717500 +vn 0.238700 -0.700000 0.673000 +vn 0.213500 -0.877300 0.429700 +vn 0.122600 -0.224000 -0.966900 +vn 0.175600 -0.203000 -0.963300 +vn 0.098400 -0.658000 -0.746600 +vn 0.137400 -0.264100 -0.954700 +vn 0.150500 -0.269000 -0.951300 +vn 0.108800 -0.991700 -0.068900 +vn 0.178900 -0.823100 0.539000 +vn 0.275600 -0.643900 0.713700 +vn 0.001900 -0.566000 0.824400 +vn 0.298300 -0.506900 0.808700 +vn -0.267100 -0.011600 0.963600 +vn -0.142600 -0.145100 0.979100 +vn 0.065100 -0.185000 0.980600 +vn -0.095300 -0.174100 0.980100 +vn 0.132500 -0.177100 0.975200 +vn 0.134900 -0.218800 0.966400 +vn 0.602800 -0.190900 0.774700 +vn 0.580100 -0.216800 0.785200 +vn 0.597800 0.032900 -0.801000 +vn 0.666200 0.146600 -0.731200 +vn 0.984700 -0.077400 -0.156100 +vn 0.672100 0.315900 -0.669700 +vn 0.994100 0.038900 -0.101500 +vn 0.875500 0.390700 -0.284200 +vn 0.975200 0.045700 0.216600 +vn 0.956200 -0.122400 0.266000 +vn -0.192700 -0.570500 0.798400 +vn 0.024400 -0.611500 0.790900 +vn 0.070600 -0.292400 0.953700 +vn 0.348000 -0.582100 0.734900 +vn 0.477400 -0.340600 0.810000 +vn 0.574100 -0.195600 0.795100 +vn -0.149300 -0.293000 0.944400 +vn -0.249700 -0.523700 0.814500 +vn -0.261400 -0.306300 0.915300 +vn -0.218300 -0.168100 0.961300 +vn -0.121000 -0.354800 0.927100 +vn -0.087000 -0.189300 0.978100 +vn 0.027900 -0.979800 -0.198200 +vn -0.129300 -0.871300 0.473300 +vn 0.259000 -0.910900 -0.321300 +vn -0.090900 -0.842600 0.530800 +vn 0.618400 -0.781800 -0.079300 +vn 0.550200 -0.759600 0.346700 +vn 0.086700 -0.912600 0.399600 +vn 0.168000 -0.973300 -0.156600 +vn 0.848600 -0.403500 0.342000 +vn 0.904800 -0.425600 0.015000 +vn 0.959400 -0.260000 0.109500 +vn 0.907100 -0.217100 0.360600 +vn 0.522700 -0.644600 -0.557900 +vn 0.841900 -0.395500 -0.367200 +vn 0.271200 -0.312300 -0.910400 +vn 0.411200 -0.203200 -0.888600 +vn 0.479300 -0.153100 -0.864200 +vn 0.918500 -0.280600 -0.278500 +vn 0.949300 -0.177100 -0.259700 +vn 0.526100 -0.084700 -0.846200 +vn 0.963600 -0.170200 0.206300 +vn 0.905300 -0.147000 0.398500 +vn 0.879700 -0.145000 0.452800 +vn 0.460000 0.864900 -0.201100 +vn 0.328400 0.930300 0.163300 +vn 0.219000 0.966900 0.131000 +vn 0.123500 0.823900 0.553200 +vn -0.104700 0.806800 0.581400 +vn -0.059100 0.783000 0.619300 +vn 0.442300 0.848500 -0.290400 +vn 0.481600 0.812200 -0.329300 +vn 0.577900 0.311500 -0.754300 +vn 0.583200 0.700100 -0.412000 +vn 0.471400 0.250400 -0.845600 +vn 0.523300 0.608500 -0.596500 +vn 0.501500 0.585800 -0.636700 +vn 0.405400 0.303800 -0.862200 +vn 0.572100 0.820100 -0.011300 +vn 0.484100 0.741900 0.463900 +vn 0.748600 0.596200 -0.290000 +vn 0.874000 0.483700 0.045600 +vn 0.854100 0.504100 0.127900 +vn 0.855900 0.244400 -0.455800 +vn 0.747200 0.591300 0.303400 +vn 0.828000 0.352500 -0.436200 +vn 0.580500 0.059000 -0.812100 +vn 0.611500 -0.024700 -0.790800 +vn 0.328900 -0.363300 0.871700 +vn 0.470100 -0.111300 0.875600 +vn 0.007500 0.380600 0.924700 +vn 0.014100 0.104500 0.994400 +vn -0.223300 -0.012500 0.974700 +vn -0.280700 0.201600 0.938400 +vn 0.509700 0.209000 0.834600 +vn 0.463000 0.421000 0.780000 +vn 0.688900 0.534200 0.490000 +vn 0.695100 0.600200 0.395700 +vn 0.567300 0.639800 0.518600 +vn 0.653600 0.470600 0.592700 +vn 0.631700 0.502500 0.590200 +vn 0.010900 0.610300 0.792100 +vn 0.428900 0.577800 0.694400 +vn -0.285200 0.483800 0.827400 +vn -0.290700 0.332300 0.897200 +vn 0.063000 0.167400 0.983900 +vn 0.602600 0.011800 0.798000 +vn 0.273700 0.656100 0.703300 +vn 0.610500 0.391000 0.688800 +vn 0.911500 0.409600 -0.037300 +vn 0.861800 0.422000 0.281300 +vn 0.911800 0.014000 0.410300 +vn 0.294400 0.950200 0.101800 +vn 0.573800 0.808000 0.133700 +vn 0.669200 0.693500 -0.267000 +vn 0.435500 0.365700 -0.822600 +vn 0.612800 0.583000 -0.533500 +vn 0.276700 0.099800 -0.955800 +vn 0.298200 0.175700 -0.938200 +vn 0.167100 -0.008900 -0.985900 +vn 0.105900 -0.070300 -0.991900 +vn 0.152100 -0.012800 -0.988300 +vn 0.110700 -0.057500 -0.992200 +vn 0.113100 -0.034600 -0.993000 +vn 0.214000 0.061700 -0.974900 +vn 0.309900 -0.034700 -0.950100 +vn 0.287100 -0.023100 -0.957600 +vn 0.229700 -0.061800 -0.971300 +vn 0.081100 -0.103200 -0.991300 +vn 0.142900 -0.084800 -0.986100 +vn 0.324000 -0.200800 -0.924500 +vn 0.226700 -0.175000 -0.958100 +vn 0.327500 -0.189100 -0.925700 +vn 0.104500 -0.179100 -0.978300 +vn 0.289800 -0.202100 -0.935500 +vn 0.393900 -0.103000 -0.913400 +vn 0.337900 -0.014400 -0.941100 +vn 0.244800 -0.119600 -0.962200 +vn 0.225600 -0.093700 -0.969700 +vn 0.244100 -0.039300 -0.969000 +vn 0.324500 -0.121300 -0.938100 +vn 0.073500 -0.094500 -0.992800 +vn 0.079000 -0.250300 -0.964900 +vn 0.131700 -0.078000 -0.988200 +vn 0.154100 -0.182400 -0.971100 +vn 0.152100 -0.541400 -0.826900 +vn 0.142300 -0.670900 -0.727700 +vn 0.303900 -0.108600 -0.946500 +vn 0.317500 -0.281100 -0.905700 +vn 0.340600 -0.365300 -0.866400 +vn 0.273100 -0.029900 -0.961500 +vn 0.265900 -0.108200 -0.957900 +vn 0.196600 -0.091700 -0.976200 +vn 0.164800 -0.072100 -0.983700 +vn -0.018000 -0.299500 -0.953900 +vn 0.109500 -0.179100 -0.977700 +vn -0.040000 -0.313900 -0.948600 +vn -0.098600 -0.386700 -0.916900 +vn -0.128800 -0.450800 -0.883300 +vn -0.181900 -0.866600 -0.464700 +vn -0.243800 -0.849000 -0.468700 +vn -0.040600 -0.881200 0.471000 +vn -0.397400 -0.800100 -0.449500 +vn -0.205300 -0.962600 0.176700 +vn -0.419100 -0.895100 -0.151900 +vn -0.367400 -0.879400 0.302800 +vn -0.223100 -0.769800 0.598100 +vn -0.279500 -0.432400 -0.857300 +vn -0.379400 -0.557800 -0.738200 +vn -0.479600 -0.748400 -0.458100 +vn -0.234800 -0.629600 -0.740500 +vn -0.533900 -0.832600 -0.147500 +vn -0.501000 -0.824100 0.264400 +vn -0.057500 -0.574300 0.816600 +vn -0.435900 -0.444100 0.782800 +vn -0.445400 -0.652800 0.612800 +vn -0.508700 -0.348600 0.787200 +vn 0.030900 -0.361900 0.931700 +vn 0.036500 -0.337400 0.940600 +vn 0.186200 -0.298900 0.935900 +vn 0.292900 -0.208600 0.933100 +vn 0.041000 -0.148600 0.988000 +vn -0.551400 -0.336500 0.763400 +vn -0.940700 0.329200 0.082400 +vn -0.897600 0.392000 -0.201400 +vn -0.998900 -0.039100 0.027200 +vn -0.720100 0.441900 -0.535000 +vn -0.774500 0.254800 -0.579000 +vn -0.749200 0.098800 -0.654900 +vn -0.940800 -0.116800 0.318300 +vn -0.989800 -0.139800 -0.026200 +vn -0.422900 -0.445900 0.788900 +vn -0.303200 -0.560000 0.771000 +vn -0.044600 -0.554000 0.831300 +vn 0.007900 -0.414100 0.910200 +vn 0.147700 -0.370600 0.917000 +vn 0.192100 -0.197800 0.961200 +vn 0.131600 -0.529200 0.838200 +vn 0.144300 -0.361900 0.921000 +vn 0.117900 -0.516500 0.848100 +vn -0.036600 -0.341400 0.939200 +vn 0.034500 -0.818400 0.573600 +vn 0.047600 -0.807400 0.588100 +vn -0.112300 -0.989300 -0.092700 +vn -0.112600 -0.817600 0.564700 +vn -0.464300 -0.682100 0.565000 +vn -0.201200 -0.979300 -0.023600 +vn -0.945700 -0.218500 0.240900 +vn -0.875600 -0.449700 0.176500 +vn -0.843500 -0.247500 0.476700 +vn -0.559800 -0.826400 0.060600 +vn -0.718400 -0.415000 0.558300 +vn -0.577300 -0.179700 -0.796500 +vn -0.449000 -0.358600 -0.818400 +vn -0.934200 -0.215800 -0.284300 +vn -0.328000 -0.503000 -0.799600 +vn -0.807000 -0.441900 -0.391700 +vn -0.488700 -0.700800 -0.519700 +vn -0.671400 -0.035300 -0.740300 +vn -0.977000 -0.153300 -0.148500 +vn -0.933300 -0.210700 0.290800 +vn -0.911100 -0.226700 0.344100 +vn -0.853300 -0.245900 0.459800 +vn -0.859200 -0.236400 0.453700 +vn -0.564300 -0.263300 0.782400 +vn 0.157100 0.802800 0.575100 +vn 0.211800 0.821800 0.528900 +vn -0.197600 0.977700 0.071100 +vn -0.037900 0.844100 0.534900 +vn -0.432300 0.893300 0.122800 +vn -0.147200 0.982700 0.112500 +vn -0.551300 0.816000 -0.174000 +vn -0.440800 0.849500 -0.289900 +vn -0.421900 0.843300 -0.333000 +vn -0.560700 0.649000 -0.514300 +vn -0.735700 0.503000 -0.453600 +vn -0.581900 0.147000 -0.799900 +vn -0.477800 0.666900 -0.571800 +vn -0.563800 0.261900 -0.783300 +vn -0.812400 0.463500 -0.353700 +vn -0.713300 0.691100 -0.116500 +vn -0.826200 0.446600 0.343500 +vn -0.786600 0.308300 -0.535000 +vn -0.942500 0.295300 0.156700 +vn -0.888100 0.453800 -0.072700 +vn -0.369300 0.059300 -0.927400 +vn 0.012200 -0.098200 0.995100 +vn -0.412700 -0.038400 0.910100 +vn -0.412400 -0.246000 0.877200 +vn -0.686000 -0.033900 0.726800 +vn 0.299800 -0.016600 0.953900 +vn 0.092800 0.151400 0.984100 +vn 0.406000 0.203300 0.891000 +vn -0.384700 0.328500 0.862600 +vn -0.409300 0.146200 0.900600 +vn 0.161500 0.378500 0.911400 +vn -0.758100 0.234300 0.608600 +vn -0.513100 0.708800 0.484100 +vn -0.381700 0.521200 0.763300 +vn 0.139500 0.628100 0.765500 +vn -0.697400 0.268300 0.664600 +vn 0.380400 0.010500 0.924800 +vn 0.358300 0.381900 0.851900 +vn 0.394000 0.520800 0.757300 +vn 0.017200 0.212200 0.977100 +vn -0.601000 -0.005400 0.799300 +vn -0.218800 0.706000 0.673600 +vn -0.625900 0.381100 0.680500 +vn -0.892100 -0.095800 0.441600 +vn -0.872300 0.406000 0.272600 +vn -0.520200 0.846900 0.110500 +vn -0.631200 0.736900 -0.241900 +vn -0.437000 0.497300 -0.749400 +vn -0.559000 0.671100 -0.487000 +vn -0.444500 0.578300 -0.684100 +vn -0.357200 0.264800 -0.895700 +vn -0.387900 0.434400 -0.812900 +vn -0.353900 0.390600 -0.849900 +vn -0.295200 0.273700 -0.915400 +vn -0.255800 0.083400 -0.963100 +vn -0.215000 -0.163100 -0.962900 +vn -0.322400 0.055000 -0.945000 +vn -0.266400 -0.151000 -0.952000 +vn 0.229400 -0.191900 -0.954200 +vn 0.072300 -0.266000 -0.961300 +vn 0.049600 -0.191400 -0.980200 +vn 0.220000 -0.232400 -0.947400 +vn -0.080700 -0.052800 -0.995300 +vn 0.022400 0.028200 -0.999400 +vn -0.228100 0.019300 -0.973400 +vn -0.363100 -0.029500 -0.931300 +vn -0.307100 0.150300 -0.939700 +vn -0.432300 0.170500 -0.885500 +vn -0.141600 -0.170100 -0.975200 +vn -0.207800 0.051400 -0.976800 +vn -0.089700 -0.031100 -0.995500 +vn -0.166100 -0.474200 -0.864600 +vn -0.188300 -0.513900 -0.836900 +vn -0.173100 -0.343100 -0.923200 +vn -0.216800 -0.335100 -0.916900 +vn -0.211900 -0.756600 -0.618600 +vn -0.184900 -0.704000 -0.685700 +vn -0.225100 -0.580900 -0.782200 +vn -0.181000 -0.381800 -0.906300 +vn -0.156600 -0.966700 -0.202600 +vn -0.138300 -0.326700 -0.935000 +vn 0.096600 -0.060900 -0.993500 +vn 0.077800 -0.104300 0.991500 +vn 0.076700 -0.132200 0.988200 +vn 0.375000 -0.110500 0.920400 +vn -0.024900 -0.706500 0.707300 +vn 0.355500 -0.096400 0.929700 +vn 0.234300 -0.670700 0.703700 +vn 0.439200 -0.634500 0.636000 +vn 0.557900 -0.067600 0.827100 +vn 0.546800 -0.650200 0.527500 +vn 0.592700 -0.726800 0.347200 +vn 0.659100 -0.073700 0.748400 +vn 0.759500 -0.175200 0.626500 +vn 0.673300 -0.097700 0.732900 +vn 0.573700 -0.115900 0.810800 +vn 0.063400 -0.975600 -0.210000 +vn -0.334400 -0.903100 -0.269400 +vn 0.399500 -0.882300 0.249000 +vn -0.323300 -0.945000 -0.048900 +vn 0.613300 -0.637300 0.466600 +vn 0.784800 -0.365200 0.500800 +vn 0.602000 -0.767500 0.220100 +vn 0.846000 -0.304500 0.437700 +vn 0.455400 -0.888800 0.051400 +vn 0.798200 -0.434100 0.417600 +vn 0.838600 -0.129700 0.529100 +vn 0.759300 -0.067100 0.647300 +vn -0.304000 -0.804400 -0.510400 +vn -0.548500 -0.681100 -0.485000 +vn -0.373000 -0.723000 -0.581500 +vn -0.592900 -0.641400 -0.486900 +vn -0.634800 -0.621700 -0.458800 +vn 0.082500 -0.974100 -0.210400 +vn -0.090600 -0.910600 -0.403200 +vn -0.054400 -0.925700 -0.374300 +vn -0.186400 -0.825600 -0.532600 +vn 0.026200 -0.997300 -0.068100 +vn -0.118900 -0.944300 -0.306800 +vn -0.100900 -0.938500 -0.330100 +vn 0.073800 -0.991000 -0.111700 +vn -0.146200 -0.983000 -0.110900 +vn -0.056200 -0.996400 -0.064000 +vn -0.168500 -0.919300 -0.355700 +vn -0.149700 -0.935600 -0.319700 +vn -0.375900 -0.894900 0.240500 +vn -0.176600 -0.923200 -0.341400 +vn -0.239400 -0.909700 -0.339200 +vn -0.074000 -0.862600 -0.500500 +vn -0.127100 -0.833600 -0.537600 +vn -0.256400 -0.917800 -0.303000 +vn -0.425800 -0.854600 0.297200 +vn -0.409600 -0.783500 0.467400 +vn -0.469600 -0.779500 0.414500 +vn -0.185100 -0.956500 -0.225400 +vn -0.488500 -0.778300 0.394400 +vn -0.153900 -0.829600 -0.536800 +vn -0.164200 -0.962300 -0.217000 +vn -0.087300 -0.890000 -0.447400 +vn -0.269900 -0.760700 0.590300 +vn -0.068900 -0.921800 -0.381600 +vn -0.186200 -0.964700 -0.186100 +vn -0.133800 -0.917500 -0.374400 +vn -0.228200 -0.067300 0.971300 +vn -0.424000 -0.032800 0.905100 +vn -0.226700 -0.173800 0.958300 +vn -0.454000 -0.193800 0.869700 +vn -0.503200 -0.333300 0.797300 +vn -0.490500 -0.287300 0.822700 +vn -0.510000 -0.228300 0.829300 +vn -0.495200 -0.029500 0.868300 +vn -0.525700 -0.196700 0.827600 +vn 0.048000 -0.049000 0.997600 +vn -0.263200 -0.016200 0.964600 +vn -0.427400 -0.011600 0.904000 +vn -0.492000 -0.030000 0.870100 +vn 0.366200 -0.090600 0.926100 +vn 0.573900 -0.130200 0.808500 +vn 0.702700 -0.135600 0.698500 +vn 0.781600 -0.098200 0.616000 +vn 0.860200 -0.151800 0.486900 +vn 0.833200 -0.090800 0.545500 +vn 0.824400 -0.194800 0.531400 +vn -0.167700 -0.971900 0.165200 +vn -0.019900 -0.975800 0.217900 +vn -0.479100 -0.549500 0.684500 +vn 0.166500 -0.950300 0.263200 +vn -0.260600 -0.556400 0.789000 +vn 0.027200 -0.521300 0.852900 +vn 0.000900 -0.253000 0.967500 +vn -0.335300 -0.273000 0.901700 +vn -0.771800 -0.359500 0.524500 +vn -0.640900 -0.663700 0.385700 +vn -0.687500 -0.272400 0.673100 +vn -0.247000 -0.969000 -0.011500 +vn -0.264500 -0.957700 0.113700 +vn -0.607800 -0.573500 0.549300 +vn -0.551500 -0.248300 0.796400 +vn -0.378200 -0.923800 -0.060300 +vn -0.159700 -0.978400 -0.130900 +vn 0.379300 -0.910700 -0.163700 +vn 0.367000 -0.882100 -0.295300 +vn -0.268100 -0.962300 -0.046800 +vn -0.610200 -0.785200 0.105700 +vn -0.651500 -0.727900 0.213800 +vn -0.521000 -0.833600 0.183700 +vn 0.176000 -0.924800 -0.337300 +vn -0.080800 -0.976600 -0.199200 +vn -0.746400 -0.524900 0.409100 +vn 0.901800 -0.407500 -0.144000 +vn 0.866700 -0.447100 -0.221200 +vn 0.850400 -0.505900 -0.144500 +vn 0.678200 -0.554800 -0.481900 +vn 0.704600 -0.631800 -0.323100 +vn 0.515600 -0.693300 -0.503600 +vn 0.557900 -0.582500 -0.591200 +vn 0.487800 -0.601700 -0.632500 +vn 0.372900 -0.766200 -0.523400 +vn 0.262100 -0.832500 -0.488000 +vn 0.397100 -0.641800 -0.656000 +vn 0.319300 -0.685800 -0.654000 +vn 0.218300 -0.860100 -0.461100 +vn 0.223200 -0.846400 -0.483500 +vn 0.242400 -0.704100 -0.667500 +vn 0.205200 -0.834500 -0.511300 +vn 0.167400 -0.719800 -0.673700 +vn 0.197700 -0.841700 -0.502400 +vn 0.213900 -0.842000 -0.495300 +vn 0.166600 -0.827900 -0.535500 +vn 0.247100 -0.882300 -0.400500 +vn 0.129000 -0.823900 -0.551800 +vn 0.183000 -0.900700 -0.394000 +vn 0.145700 -0.943400 -0.298100 +vn 0.238900 -0.961900 0.132800 +vn 0.378800 -0.924500 0.042000 +vn 0.185600 -0.878100 -0.441100 +vn 0.397100 -0.917700 -0.012700 +vn 0.187400 -0.891400 -0.412600 +vn 0.231600 -0.865000 -0.445000 +vn 0.182400 -0.888700 -0.420700 +vn 0.264100 -0.803000 -0.534300 +vn 0.262200 -0.832400 -0.488200 +vn 0.451000 -0.888900 0.080400 +vn 0.373700 -0.899500 0.226400 +vn 0.492200 -0.451200 0.744400 +vn 0.425500 -0.111400 0.898100 +vn 0.287600 -0.167900 0.942900 +vn 0.314100 -0.451300 0.835300 +vn 0.110600 -0.922900 0.368800 +vn 0.184700 -0.343700 0.920700 +vn 0.254700 -0.523800 0.812800 +vn 0.218200 -0.289600 0.931900 +vn 0.460800 -0.499200 0.733800 +vn 0.544700 -0.489200 0.681200 +vn 0.483000 -0.080000 0.872000 +vn 0.420200 -0.034500 0.906800 +vn 0.300000 -0.061900 0.951900 +vn 0.013400 -0.087700 0.996100 +vn 0.467800 -0.015200 0.883700 +vn -0.358200 -0.103100 0.927900 +vn -0.591100 -0.101200 0.800200 +vn -0.718300 -0.111700 0.686700 +vn -0.801000 -0.184900 0.569300 +vn -0.802500 -0.316600 0.505600 +vn -0.798000 -0.465700 0.382400 +vn -0.769600 -0.553700 0.318000 +vn -0.980500 0.159100 0.115400 +vn -0.802100 0.506900 0.315800 +vn -0.736000 -0.350600 0.579200 +vn -0.518400 0.704300 0.485000 +vn -0.739100 -0.051000 0.671700 +vn -0.574900 0.416400 0.704400 +vn -0.192200 0.787600 0.585400 +vn -0.247500 0.662800 0.706700 +vn 0.150900 0.797600 0.584100 +vn 0.139200 0.750900 0.645600 +vn 0.077600 -0.981700 -0.174100 +vn 0.371700 -0.866900 -0.332300 +vn 0.610000 -0.744900 -0.270100 +vn 0.186400 -0.756100 -0.627300 +vn 0.930200 0.184300 0.317400 +vn 0.863700 0.385200 0.325200 +vn 0.708700 0.573700 0.410600 +vn 0.777900 0.608600 0.156400 +vn 0.854400 0.503000 0.130400 +vn 0.661600 0.684600 0.305900 +vn 0.458200 0.708900 0.536200 +vn 0.452600 0.756600 0.472000 +vn -0.917200 -0.373100 -0.139700 +vn -0.993100 -0.117200 0.006500 +vn -0.458800 -0.827500 0.323600 +vn -0.610200 -0.643200 0.462500 +vn -0.659900 -0.684300 -0.310200 +vn -0.784700 -0.561600 -0.262400 +vn -0.287100 -0.919700 0.268000 +vn -0.189700 -0.960400 0.203900 +vn 0.985500 0.144600 0.088800 +vn 0.933100 -0.206900 0.294300 +vn 0.910000 0.356300 0.212000 +vn 0.939800 -0.008400 0.341600 +vn 0.871700 -0.481400 0.091000 +vn 0.885500 -0.259000 -0.385900 +vn -0.449500 -0.778500 -0.437900 +vn -0.119100 -0.991800 0.045300 +vn 0.622500 -0.025400 0.782200 +vn 0.439300 0.019200 0.898100 +vn 0.590700 -0.059500 0.804700 +vn 0.258000 0.047200 0.965000 +vn 0.312300 -0.035200 0.949300 +vn 0.429900 -0.054700 0.901200 +vn 0.359500 -0.045700 0.932000 +vn 0.560000 -0.191000 0.806200 +vn -0.442000 -0.779400 -0.444000 +vn -0.531600 -0.621000 -0.576000 +vn -0.235500 -0.783300 -0.575300 +vn -0.577100 -0.553000 -0.600900 +vn -0.295200 -0.715100 -0.633600 +vn 0.167100 -0.807700 -0.565500 +vn -0.156900 -0.946000 -0.283800 +vn 0.179900 -0.871000 -0.457300 +vn -0.808300 -0.426000 0.406500 +vn -0.857700 -0.504700 -0.098200 +vn -0.786100 -0.611300 0.090900 +vn -0.783900 -0.482300 -0.391000 +vn -0.783800 -0.562700 -0.262700 +vn -0.686500 -0.720100 -0.100500 +vn -0.616400 -0.557100 0.556600 +vn -0.522400 -0.824700 0.216700 +vn -0.555000 -0.794200 -0.247400 +vn -0.684400 -0.560800 -0.465900 +vn -0.694300 -0.487400 -0.529500 +vn 0.140800 -0.244100 0.959500 +vn 0.134200 -0.100500 0.985800 +vn 0.131500 0.046700 0.990200 +vn -0.061000 -0.239600 0.969000 +vn -0.066600 -0.685000 0.725500 +vn -0.075700 -0.020700 0.996900 +vn -0.460200 -0.204900 0.863900 +vn -0.312300 -0.396700 0.863200 +vn -0.142800 -0.692800 0.706900 +vn 0.896300 -0.164200 0.412000 +vn 0.780000 -0.076600 0.621000 +vn 0.851900 -0.255200 0.457400 +vn 0.757100 -0.158500 0.633800 +vn 0.730900 -0.269100 0.627300 +vn 0.819100 -0.336100 0.464900 +vn 0.872900 -0.482300 -0.073100 +vn 0.935600 -0.302700 0.181900 +vn 0.747400 -0.662700 -0.047300 +vn 0.867500 -0.453200 0.205000 +vn 0.763000 -0.576500 0.292300 +vn 0.572400 -0.817900 0.058200 +vn 0.124600 -0.973700 -0.190700 +vn 0.348900 -0.932300 -0.095600 +vn 0.516100 -0.814500 -0.265200 +vn 0.629000 -0.694100 -0.350000 +vn -0.327000 -0.789500 0.519400 +vn -0.035100 -0.973500 0.226100 +vn -0.236400 -0.970200 0.053500 +vn 0.265300 -0.887300 0.377100 +vn 0.083000 -0.948200 0.306500 +vn 0.547600 -0.637100 0.542400 +vn 0.336200 -0.569700 0.749900 +vn 0.440500 -0.049000 0.896400 +vn 0.141700 -0.489600 0.860300 +vn 0.224500 0.148600 0.963100 +vn 0.193800 0.378400 0.905100 +vn 0.054200 0.181200 0.981900 +vn -0.044700 0.427100 0.903100 +vn -0.297200 0.504100 0.810900 +vn -0.160700 0.201800 0.966100 +vn 0.168300 0.666500 0.726300 +vn -0.124800 0.691800 0.711200 +vn 0.661100 0.122400 0.740200 +vn 0.691200 0.373700 0.618600 +vn 0.444000 0.138000 0.885300 +vn 0.474700 0.369700 0.798700 +vn 0.671500 0.613600 0.415400 +vn 0.468900 0.638500 0.610200 +vn 0.941800 0.055000 0.331700 +vn 0.828600 0.091800 0.552300 +vn 0.904900 0.386400 0.178400 +vn 0.831500 0.380100 0.405100 +vn 0.801500 0.595100 0.059200 +vn 0.761400 0.614100 0.207500 +vn 0.969300 -0.204800 -0.135700 +vn 0.994200 -0.023600 0.105300 +vn 0.982600 0.117500 -0.144000 +vn 0.941800 0.335100 0.026700 +vn 0.966300 0.249200 -0.065000 +vn 0.852900 0.516900 0.072800 +vn 0.186200 -0.749400 -0.635400 +vn 0.177500 -0.663800 -0.726500 +vn 0.734000 -0.520100 -0.436600 +vn 0.801400 -0.324400 -0.502500 +vn 0.155900 -0.575000 -0.803200 +vn 0.825900 -0.191100 -0.530500 +vn -0.598200 -0.561500 -0.571800 +vn -0.335500 -0.699200 -0.631300 +vn -0.643000 -0.534700 -0.548300 +vn -0.403000 -0.651900 -0.642400 +vn -0.707600 -0.479600 -0.519000 +vn -0.471700 -0.600300 -0.645800 +vn -0.779100 -0.433600 -0.452700 +vn -0.698600 -0.485900 -0.525300 +vn -0.831300 -0.298800 -0.468600 +vn -0.745700 -0.430400 -0.508600 +vn -0.907000 -0.189000 -0.376400 +vn -0.807400 -0.362700 -0.465200 +vn -0.962800 -0.167700 0.211700 +vn -0.985200 0.171100 -0.004900 +vn -0.901800 -0.354000 -0.248000 +vn -0.931000 -0.107500 -0.348800 +vn -0.945000 0.318700 -0.074100 +vn -0.957100 0.035700 -0.287700 +vn -0.650900 0.090900 0.753700 +vn -0.728700 0.454100 0.512600 +vn -0.414100 0.704400 0.576400 +vn -0.742800 0.601600 0.293800 +vn 0.750000 0.166000 0.640200 +vn 0.940300 -0.118300 0.319100 +vn 0.668600 0.252500 0.699500 +vn 0.936900 0.073000 0.342000 +vn 0.993500 -0.106400 -0.039400 +vn 0.875500 -0.477900 0.071100 +vn -0.119900 0.730300 0.672500 +vn 0.343400 0.450400 0.824200 +vn -0.148800 0.661100 0.735400 +vn 0.354200 0.422000 0.834600 +vn -0.703700 -0.433500 -0.562900 +vn -0.778700 -0.111900 -0.617300 +vn -0.396200 -0.646600 -0.651800 +vn -0.701100 0.685700 0.195600 +vn -0.723400 0.549500 0.418000 +vn -0.839000 0.342900 0.422400 +vn -0.821100 0.547600 0.161100 +vn -0.845000 0.187000 0.501000 +vn -0.511400 0.691300 0.510600 +vn -0.483900 0.787100 0.382400 +vn 0.668700 -0.743500 -0.002900 +vn 0.914800 -0.289000 -0.282300 +vn 0.789700 -0.467000 -0.397800 +vn 0.460300 -0.887700 -0.002600 +vn 0.333400 -0.942800 -0.000600 +vn 0.664000 -0.596900 -0.450300 +vn 0.264700 -0.952400 -0.151100 +vn -0.862600 0.115800 0.492500 +vn -0.950100 0.138100 0.279700 +vn -0.777800 0.415400 0.471700 +vn -0.811700 0.468200 0.349200 +vn -0.854800 0.449300 0.259700 +vn -0.820400 0.327900 -0.468400 +vn -0.955600 0.139100 -0.259600 +vn -0.385800 -0.258900 -0.885500 +vn 0.507700 -0.678700 -0.530600 +vn 0.036900 -0.886300 -0.461700 +vn 0.170900 -0.642700 -0.746800 +vn -0.148600 0.028000 0.988500 +vn -0.151400 0.033100 0.987900 +vn -0.324300 0.067700 0.943500 +vn -0.134200 0.102400 0.985600 +vn -0.383000 0.146300 0.912100 +vn -0.544100 0.088500 0.834300 +vn -0.303900 -0.022600 0.952400 +vn -0.251600 -0.726300 -0.639700 +vn 0.164000 -0.729600 -0.663900 +vn -0.311900 -0.781200 -0.540800 +vn 0.421200 -0.679500 -0.600700 +vn 0.051900 -0.772400 -0.633000 +vn 0.337700 -0.721400 -0.604500 +vn 0.246900 -0.810700 -0.530800 +vn -0.056800 -0.909300 -0.412200 +vn 0.557300 -0.829700 -0.031200 +vn 0.672700 -0.723300 -0.156200 +vn 0.460000 -0.838400 0.292400 +vn 0.729900 -0.636700 -0.248800 +vn 0.696800 -0.667100 0.263500 +vn 0.817000 -0.535300 0.214400 +vn 0.592400 -0.538800 0.599000 +vn 0.575800 -0.645700 -0.501600 +vn 0.523300 -0.707300 -0.475300 +vn 0.348900 -0.074500 0.934200 +vn 0.134900 0.024100 0.990600 +vn 0.339000 -0.290600 0.894800 +vn 0.144700 -0.127900 0.981200 +vn 0.125600 -0.298700 0.946000 +vn 0.328400 -0.775800 0.538800 +vn 0.432900 -0.394300 0.810700 +vn 0.716600 -0.348800 0.604000 +vn 0.539600 -0.193600 0.819400 +vn 0.214100 -0.682900 0.698400 +vn -0.511800 -0.156100 0.844800 +vn -0.762300 0.030100 0.646600 +vn -0.595100 0.165500 0.786400 +vn -0.777800 0.156200 0.608800 +vn -0.919700 0.091900 0.381700 +vn -0.734900 -0.184600 0.652600 +vn -0.902500 -0.062100 0.426200 +vn -0.876200 -0.193800 0.441300 +vn -0.851100 -0.479000 0.215000 +vn -0.988200 -0.052400 0.144200 +vn -0.956800 -0.257300 0.135300 +vn -0.955500 -0.275100 -0.106800 +vn -0.868700 -0.479100 -0.125700 +vn -0.719500 -0.551200 -0.422400 +vn -0.659000 -0.670000 -0.341800 +vn -0.341100 -0.900900 -0.268400 +vn -0.520700 -0.840700 -0.148400 +vn 0.391100 -0.870600 -0.298500 +vn 0.130700 -0.991400 0.001200 +vn -0.096200 -0.971000 0.218700 +vn 0.145000 -0.712900 0.686100 +vn -0.185800 -0.936200 0.298500 +vn -0.292900 -0.884500 0.363100 +vn -0.678000 -0.734100 -0.037400 +vn -0.283300 -0.588200 0.757500 +vn -0.563900 -0.653800 0.504600 +vn -0.125900 -0.488500 0.863400 +vn 0.519800 0.145700 0.841800 +vn 0.285000 0.210200 0.935200 +vn 0.420300 0.060800 0.905400 +vn -0.083600 0.330200 0.940200 +vn 0.188800 0.108900 0.976000 +vn -0.108700 0.168100 0.979800 +vn 0.597800 0.218900 0.771200 +vn 0.344500 0.370200 0.862700 +vn -0.088400 0.601200 0.794200 +vn -0.496400 0.464800 0.733200 +vn -0.439400 0.246500 0.863800 +vn -0.737700 0.536500 0.409800 +vn -0.677800 0.316300 0.663700 +vn -0.490200 0.703200 0.515000 +vn -0.710200 0.679700 0.183400 +vn -0.786100 0.588900 0.187800 +vn -0.816500 0.358600 0.452500 +vn -0.755300 0.637000 0.154000 +vn -0.886900 0.368700 0.278200 +vn -0.758200 0.651000 0.035100 +vn -0.725700 0.663300 0.183100 +vn -0.776300 0.579900 0.247200 +vn -0.949000 0.289600 0.124500 +vn -0.942500 0.289900 0.166100 +vn -0.999200 0.018700 -0.036000 +vn -0.696100 0.604800 0.387000 +vn -0.847700 0.478300 0.229300 +vn -0.889000 -0.181500 -0.420400 +vn -0.274100 -0.537000 -0.797800 +vn -0.230700 -0.658900 -0.716000 +vn -0.794200 -0.424100 -0.435100 +vn -0.855500 0.173900 -0.487600 +vn -0.300500 -0.303600 -0.904200 +vn 0.265400 -0.559000 -0.785600 +vn 0.545300 -0.487200 -0.682100 +vn 0.245400 -0.652100 -0.717400 +vn 0.504100 -0.599800 -0.621400 +vn 0.227000 -0.529600 -0.817300 +vn 0.537000 -0.503900 -0.676600 +vn 0.679700 -0.435300 -0.590400 +vn 0.834900 -0.351500 -0.423600 +vn 0.635100 -0.556400 -0.535800 +vn 0.805800 -0.495800 -0.323900 +vn 0.690400 -0.400800 -0.602300 +vn 0.820500 -0.286400 -0.494700 +vn 0.982300 -0.178600 -0.056200 +vn 0.945200 -0.051200 0.322300 +vn 0.844800 -0.143000 0.515700 +vn 0.935900 -0.331800 0.118400 +vn 0.958200 -0.155300 -0.240200 +vn 0.992900 -0.066600 0.099000 +vn 0.758600 0.054600 0.649300 +vn 0.647000 -0.022200 0.762200 +vn 0.867000 0.057800 0.495000 +vn -0.459900 -0.331500 -0.823700 +vn 0.974000 -0.049400 -0.221100 +vn 0.039300 0.048500 -0.998000 +vn -0.077300 -0.267500 0.960400 +vn 0.115500 -0.838400 0.532700 +vn -0.117400 -0.374300 0.919800 +vn 0.277400 -0.234800 -0.931600 +vn -0.721100 -0.403300 -0.563400 +vn -0.810300 -0.513900 -0.281500 +vn 0.177200 0.973000 0.148100 +vn -0.001600 -0.902000 0.431800 +vn -0.305800 0.567100 0.764800 +vn 0.218300 -0.289600 0.931900 +vn 0.782600 -0.570100 0.250100 +vn 0.013200 -0.999500 -0.029400 +vn 0.942300 -0.062300 -0.329000 +vn 0.342100 0.670900 -0.657900 +vn -0.675000 -0.612800 -0.410900 +usemtl Skin1 +s 1 +f 1/1/1 2/2/2 3/3/3 +f 2/2/2 5/4/4 6/5/5 +f 3/3/3 6/5/5 7/6/6 +f 4/7/7 3/3/3 8/8/8 +f 10/9/9 11/10/10 12/11/11 +f 11/10/10 14/12/12 15/13/13 +f 12/11/11 15/13/13 16/14/14 +f 13/15/15 12/11/11 17/16/16 +f 19/17/17 20/18/18 22/19/19 +f 20/18/18 23/20/20 21/21/21 +f 21/21/21 24/22/22 26/23/23 +f 22/19/19 21/21/21 27/24/24 +f 16/14/14 15/13/13 29/25/25 +f 15/13/13 14/12/12 28/26/26 +f 28/26/26 30/27/27 32/28/28 +f 29/25/25 28/26/26 27/24/24 +f 27/24/24 32/28/28 22/19/19 +f 32/28/28 31/29/29 34/30/30 +f 33/31/31 34/30/30 35/32/32 +f 22/19/19 33/31/31 36/33/33 +f 37/34/34 38/35/35 40/36/36 +f 38/35/35 16/14/14 39/37/37 +f 39/37/37 29/25/25 26/23/23 +f 40/36/36 39/37/37 25/38/38 +f 41/39/39 42/40/40 44/41/41 +f 42/40/40 37/34/34 43/42/42 +f 43/42/42 40/36/36 45/43/43 +f 44/41/41 43/42/42 46/44/44 +f 47/45/45 48/46/46 50/47/47 +f 48/46/46 41/39/39 49/48/48 +f 49/48/48 44/41/41 51/49/49 +f 50/47/47 49/48/48 52/50/50 +f 53/51/51 54/52/52 55/53/53 +f 54/52/52 57/54/54 58/55/55 +f 55/53/53 58/55/55 59/56/56 +f 56/57/57 55/53/53 60/58/58 +f 53/51/51 56/57/57 63/59/59 +f 56/57/57 61/60/60 62/61/61 +f 62/61/61 64/62/62 48/46/46 +f 63/59/59 62/61/61 47/45/45 +f 65/63/63 66/64/64 68/65/65 +f 66/64/64 69/66/66 67/67/67 +f 67/67/67 70/68/68 72/69/69 +f 68/65/65 67/67/67 73/70/70 +f 74/71/71 75/72/72 77/73/73 +f 75/72/72 78/74/74 76/75/75 +f 76/75/75 79/76/76 81/77/77 +f 77/73/73 76/75/75 82/78/78 +f 78/74/74 83/79/79 79/76/76 +f 83/79/79 7/6/6 84/80/80 +f 84/80/80 85/81/81 87/82/82 +f 79/76/76 84/80/80 80/83/83 +f 80/83/83 87/82/82 89/84/84 +f 87/82/82 86/85/85 88/86/86 +f 88/86/86 90/87/87 92/88/88 +f 89/84/84 88/86/86 93/89/89 +f 82/78/78 81/77/77 94/90/90 +f 81/77/77 80/83/83 94/90/90 +f 94/90/90 89/84/84 96/91/91 +f 95/92/92 94/90/90 96/91/91 +f 97/93/93 98/94/94 100/95/95 +f 98/94/94 74/71/71 99/96/96 +f 99/96/96 77/73/73 82/78/78 +f 100/95/95 99/96/96 101/97/97 +f 82/78/78 95/92/92 101/97/97 +f 95/92/92 65/63/63 103/98/98 +f 103/98/98 68/65/65 104/99/99 +f 101/97/97 103/98/98 102/100/100 +f 69/66/66 66/64/64 106/101/101 +f 66/64/64 65/63/63 105/102/102 +f 105/102/102 96/91/91 93/89/89 +f 106/101/101 105/102/102 107/103/103 +f 93/89/89 92/88/88 107/103/103 +f 92/88/88 91/104/104 109/105/105 +f 109/105/105 110/106/106 112/107/107 +f 107/103/103 109/105/105 108/108/108 +f 111/109/109 113/110/110 114/111/111 +f 113/110/110 115/112/112 116/113/113 +f 114/111/111 116/113/113 117/114/114 +f 112/107/107 114/111/111 118/115/115 +f 119/116/116 120/117/117 121/118/118 +f 120/117/117 115/112/112 123/119/119 +f 121/118/118 123/119/119 124/120/120 +f 122/121/121 121/118/118 126/122/122 +f 127/123/123 128/124/124 129/125/125 +f 128/124/124 117/114/114 116/113/113 +f 129/125/125 116/113/113 115/112/112 +f 130/126/126 129/125/125 120/117/117 +f 131/127/127 132/128/128 133/129/129 +f 132/128/128 127/123/123 130/126/126 +f 133/129/129 130/126/126 119/116/116 +f 134/130/130 133/129/129 135/131/131 +f 137/132/132 138/133/133 139/134/134 +f 138/133/133 141/135/135 142/136/136 +f 139/134/134 142/136/136 143/137/137 +f 140/138/138 139/134/134 144/139/139 +f 10/9/9 145/140/140 146/141/141 +f 145/140/140 148/142/142 149/143/143 +f 146/141/141 149/143/143 150/144/144 +f 147/145/145 146/141/141 151/146/146 +f 152/147/147 153/148/148 155/149/149 +f 153/148/148 156/150/150 154/151/151 +f 154/151/151 157/152/152 142/136/136 +f 155/149/149 154/151/151 141/135/135 +f 35/32/32 34/30/30 159/153/153 +f 34/30/30 31/29/29 158/154/154 +f 158/154/154 160/155/155 155/149/149 +f 159/153/153 158/154/154 141/135/135 +f 31/29/29 30/27/27 160/155/155 +f 30/27/27 14/12/12 161/156/156 +f 161/156/156 11/10/10 147/145/145 +f 160/155/155 161/156/156 152/147/147 +f 156/150/150 153/148/148 163/157/157 +f 153/148/148 152/147/147 162/158/158 +f 163/157/157 162/158/158 150/144/144 +f 164/159/159 165/160/160 167/161/161 +f 165/160/160 168/162/162 166/163/163 +f 166/163/163 169/164/164 140/138/138 +f 167/161/161 166/163/163 140/138/138 +f 170/165/165 171/166/166 173/167/167 +f 171/166/166 174/168/168 172/169/169 +f 172/169/169 175/170/170 165/160/160 +f 173/167/167 172/169/169 164/159/159 +f 176/171/171 177/172/172 178/173/173 +f 177/172/172 174/168/168 171/166/166 +f 178/173/173 171/166/166 170/165/165 +f 179/174/174 178/173/173 180/175/175 +f 182/176/176 183/177/177 185/178/178 +f 183/177/177 186/179/179 184/180/180 +f 184/180/180 187/181/181 189/182/182 +f 185/178/178 184/180/180 190/183/183 +f 191/184/184 192/185/185 193/186/186 +f 192/185/185 195/187/187 196/188/188 +f 193/186/186 196/188/188 182/176/176 +f 194/189/189 193/186/186 185/178/178 +f 52/50/50 51/49/49 198/190/190 +f 51/49/49 46/44/44 197/191/191 +f 197/191/191 199/192/192 195/187/187 +f 198/190/190 197/191/191 192/185/185 +f 25/38/38 24/22/22 200/193/193 +f 24/22/22 23/20/20 200/193/193 +f 200/193/193 201/194/194 199/192/192 +f 45/43/43 200/193/193 199/192/192 +f 195/187/187 201/194/194 202/195/195 +f 201/194/194 23/20/20 20/18/18 +f 202/195/195 20/18/18 19/17/17 +f 196/188/188 202/195/195 203/196/196 +f 204/197/197 205/198/198 206/199/199 +f 205/198/198 208/200/200 209/201/201 +f 206/199/199 209/201/201 174/168/168 +f 207/202/202 206/199/199 177/172/172 +f 210/203/203 211/204/204 213/205/205 +f 211/204/204 208/200/200 212/206/206 +f 212/206/206 205/198/198 214/207/207 +f 213/205/205 212/206/206 186/179/179 +f 208/200/200 215/208/208 216/209/209 +f 215/208/208 217/210/210 218/211/211 +f 216/209/209 218/211/211 168/162/162 +f 209/201/201 216/209/209 175/170/170 +f 35/32/32 219/212/212 36/33/33 +f 219/212/212 221/213/213 220/214/214 +f 220/214/214 222/215/215 223/216/216 +f 36/33/33 220/214/214 19/17/17 +f 137/132/132 224/217/217 138/133/133 +f 224/217/217 221/213/213 219/212/212 +f 225/218/218 219/212/212 35/32/32 +f 138/133/133 225/218/218 159/153/153 +f 168/162/162 218/211/211 169/164/164 +f 218/211/211 217/210/210 226/219/219 +f 226/219/219 227/220/220 224/217/217 +f 169/164/164 226/219/219 137/132/132 +f 221/213/213 227/220/220 222/215/215 +f 227/220/220 217/210/210 228/221/221 +f 228/221/221 215/208/208 211/204/204 +f 222/215/215 228/221/221 210/203/203 +f 210/203/203 213/205/205 229/222/222 +f 213/205/205 186/179/179 183/177/177 +f 229/222/222 183/177/177 182/176/176 +f 223/216/216 229/222/222 203/196/196 +f 186/179/179 214/207/207 187/181/181 +f 214/207/207 204/197/197 230/223/223 +f 230/223/223 231/224/224 233/225/225 +f 187/181/181 230/223/223 188/226/226 +f 204/197/197 207/202/202 231/224/224 +f 207/202/202 176/171/171 234/227/227 +f 234/227/227 235/228/228 236/229/229 +f 231/224/224 234/227/227 232/230/230 +f 238/231/231 239/232/232 240/233/233 +f 239/232/232 242/234/234 243/235/235 +f 240/233/233 243/235/235 244/236/236 +f 241/237/237 240/233/233 245/238/238 +f 181/239/239 245/238/238 246/240/240 +f 245/238/238 244/236/236 247/241/241 +f 246/240/240 247/241/241 235/228/228 +f 179/174/174 246/240/240 235/228/228 +f 248/242/242 249/243/243 250/244/244 +f 249/243/243 238/231/231 241/237/237 +f 250/244/244 241/237/237 181/239/239 +f 251/245/245 250/244/244 180/175/175 +f 126/122/122 252/246/246 253/247/247 +f 252/246/246 248/242/242 251/245/245 +f 253/247/247 251/245/245 170/165/165 +f 254/248/248 253/247/247 173/167/167 +f 119/116/116 122/121/121 135/131/131 +f 122/121/121 126/122/122 254/248/248 +f 255/249/249 254/248/248 164/159/159 +f 135/131/131 255/249/249 167/161/161 +f 124/120/120 256/250/250 257/251/251 +f 256/250/250 258/252/252 259/253/253 +f 257/251/251 259/253/253 248/242/242 +f 125/254/254 257/251/251 252/246/246 +f 260/255/255 261/256/256 262/257/257 +f 261/256/256 264/258/258 265/259/259 +f 262/257/257 265/259/259 266/260/260 +f 263/261/261 262/257/257 267/262/262 +f 266/260/260 269/263/263 270/264/264 +f 269/263/263 271/265/265 272/266/266 +f 270/264/264 272/266/266 273/267/267 +f 267/262/262 270/264/264 274/268/268 +f 275/269/269 276/270/270 277/271/271 +f 276/270/270 279/272/272 280/273/273 +f 277/271/271 280/273/273 281/274/274 +f 278/275/275 277/271/271 283/276/276 +f 281/274/274 280/273/273 285/277/277 +f 280/273/273 279/272/272 284/278/278 +f 284/278/278 286/279/279 288/280/280 +f 285/277/277 284/278/278 273/267/267 +f 289/281/281 290/282/282 292/283/283 +f 290/282/282 293/284/284 291/285/285 +f 291/285/285 294/286/286 296/287/287 +f 292/283/283 291/285/285 297/288/288 +f 298/289/289 299/290/290 301/291/291 +f 299/290/290 302/292/292 300/293/293 +f 300/293/293 303/294/294 305/295/295 +f 301/291/291 300/293/293 306/296/296 +f 307/297/297 308/298/298 309/299/299 +f 308/298/298 289/281/281 311/300/300 +f 309/299/299 311/300/300 298/289/289 +f 310/301/301 309/299/299 301/291/291 +f 287/302/302 312/303/303 313/304/304 +f 312/303/303 298/289/289 311/300/300 +f 313/304/304 311/300/300 289/281/281 +f 314/305/305 313/304/304 292/283/283 +f 307/297/297 315/306/306 308/298/298 +f 315/306/306 317/307/307 316/308/308 +f 316/308/308 318/309/309 290/282/282 +f 308/298/298 316/308/308 289/281/281 +f 297/288/288 296/287/287 319/310/310 +f 296/287/287 295/311/311 321/312/312 +f 319/310/310 321/312/312 322/313/313 +f 320/314/314 319/310/310 323/315/315 +f 273/267/267 288/280/280 274/268/268 +f 288/280/280 287/302/302 324/316/316 +f 324/316/316 314/305/305 320/314/314 +f 274/268/268 324/316/316 268/317/317 +f 279/272/272 325/318/318 286/279/279 +f 325/318/318 302/292/292 326/319/319 +f 326/319/319 299/290/290 298/289/289 +f 286/279/279 326/319/319 287/302/302 +f 304/320/320 303/294/294 327/321/321 +f 303/294/294 302/292/292 327/321/321 +f 327/321/321 325/318/318 276/270/270 +f 328/322/322 327/321/321 276/270/270 +f 306/296/296 305/295/295 330/323/323 +f 305/295/295 304/320/320 329/324/324 +f 329/324/324 331/325/325 333/326/326 +f 330/323/323 329/324/324 334/327/327 +f 304/320/320 328/322/322 331/325/325 +f 328/322/322 275/269/269 335/328/328 +f 335/328/328 336/329/329 338/330/330 +f 331/325/325 335/328/328 332/331/331 +f 283/276/276 339/332/332 340/333/333 +f 339/332/332 341/334/334 342/335/335 +f 340/333/333 342/335/335 337/336/336 +f 278/275/275 340/333/333 336/329/329 +f 343/337/337 344/338/338 346/339/339 +f 344/338/338 347/340/340 345/341/341 +f 345/341/341 348/342/342 350/343/343 +f 346/339/339 345/341/341 351/344/344 +f 337/336/336 342/335/335 353/345/345 +f 342/335/335 341/334/334 352/346/346 +f 352/346/346 354/347/347 356/348/348 +f 353/345/345 352/346/346 357/349/349 +f 358/350/350 359/351/351 360/352/352 +f 359/351/351 362/353/353 363/354/354 +f 360/352/352 363/354/354 364/355/355 +f 361/356/356 360/352/352 365/357/357 +f 367/358/358 368/359/359 370/360/360 +f 368/359/359 371/361/361 369/362/362 +f 369/362/362 372/363/363 374/364/364 +f 370/360/360 369/362/362 375/365/365 +f 376/366/366 377/367/367 378/368/368 +f 377/367/367 380/369/369 381/370/370 +f 378/368/368 381/370/370 374/364/364 +f 379/371/371 378/368/368 374/364/364 +f 382/372/372 383/373/373 384/374/374 +f 383/373/373 1/1/1 4/7/7 +f 384/374/374 4/7/7 9/375/375 +f 385/376/376 384/374/374 386/377/377 +f 387/378/378 388/379/379 390/380/380 +f 388/379/379 391/381/381 389/382/382 +f 389/382/382 392/383/383 394/384/384 +f 390/380/380 389/382/382 364/355/355 +f 260/255/255 263/261/261 396/385/385 +f 263/261/261 268/317/317 395/386/386 +f 395/386/386 323/315/315 397/387/387 +f 396/385/385 395/386/386 398/388/388 +f 399/389/389 400/390/390 402/391/391 +f 400/390/390 260/255/255 401/392/392 +f 401/392/392 396/385/385 403/393/393 +f 402/391/391 401/392/392 404/394/394 +f 405/395/395 406/396/396 407/397/397 +f 406/396/396 409/398/398 410/399/399 +f 407/397/397 410/399/399 366/400/400 +f 408/401/401 407/397/397 365/357/357 +f 404/394/394 411/402/402 402/391/391 +f 411/402/402 413/403/403 412/404/404 +f 412/404/404 414/405/405 415/406/406 +f 402/391/391 412/404/404 399/389/389 +f 413/403/403 417/407/407 414/405/405 +f 417/407/407 419/408/408 420/409/409 +f 418/410/410 420/409/409 421/411/411 +f 414/405/405 418/410/410 422/412/412 +f 415/406/406 422/412/412 423/413/413 +f 422/412/412 421/411/411 425/414/414 +f 423/413/413 425/414/414 426/415/415 +f 424/416/416 423/413/413 427/417/417 +f 399/389/389 416/418/418 428/419/419 +f 416/418/418 415/406/406 424/416/416 +f 428/419/419 424/416/416 409/398/398 +f 429/420/420 428/419/419 406/396/396 +f 405/395/395 430/421/421 429/420/420 +f 430/421/421 432/422/422 431/423/423 +f 431/423/423 433/424/424 400/390/390 +f 429/420/420 431/423/423 399/389/389 +f 434/425/425 435/426/426 436/427/427 +f 435/426/426 438/428/428 439/429/429 +f 436/427/427 439/429/429 440/430/430 +f 437/431/431 436/427/427 441/432/432 +f 281/274/274 442/433/433 282/434/434 +f 442/433/433 438/428/428 443/435/435 +f 443/435/435 435/426/426 444/436/436 +f 282/434/434 443/435/435 283/276/276 +f 271/265/265 445/437/437 446/438/438 +f 445/437/437 438/428/428 446/438/438 +f 446/438/438 442/433/433 281/274/274 +f 272/266/266 446/438/438 285/277/277 +f 271/265/265 269/263/263 447/439/439 +f 269/263/263 266/260/260 265/259/259 +f 447/439/439 265/259/259 264/258/258 +f 448/440/440 447/439/439 449/441/441 +f 450/442/442 449/441/441 451/443/443 +f 449/441/441 264/258/258 261/256/256 +f 451/443/443 261/256/256 433/424/424 +f 452/444/444 451/443/443 433/424/424 +f 438/428/428 445/437/437 439/429/429 +f 445/437/437 271/265/265 448/440/440 +f 453/445/445 448/440/440 450/442/442 +f 439/429/429 453/445/445 454/446/446 +f 440/430/430 454/446/446 455/447/447 +f 454/446/446 450/442/442 452/444/444 +f 455/447/447 452/444/444 432/422/422 +f 456/448/448 455/447/447 457/449/449 +f 393/450/450 457/449/449 458/451/451 +f 457/449/449 432/422/422 430/421/421 +f 458/451/451 430/421/421 405/395/395 +f 394/384/384 458/451/451 408/401/401 +f 440/430/430 456/448/448 441/432/432 +f 456/448/448 393/450/450 459/452/452 +f 459/452/452 392/383/383 460/453/453 +f 441/432/432 459/452/452 351/344/344 +f 391/381/381 461/454/454 462/455/455 +f 461/454/454 382/372/372 385/376/376 +f 462/455/455 385/376/376 343/337/337 +f 460/453/453 462/455/455 346/339/339 +f 376/366/366 463/456/456 377/367/367 +f 463/456/456 1/1/1 464/457/457 +f 464/457/457 383/373/373 465/458/458 +f 377/367/367 464/457/457 380/369/369 +f 391/381/381 388/379/379 461/454/454 +f 388/379/379 387/378/378 466/459/459 +f 466/459/459 467/460/460 465/458/458 +f 461/454/454 466/459/459 382/372/372 +f 380/369/369 467/460/460 381/370/370 +f 467/460/460 387/378/378 468/461/461 +f 468/461/461 390/380/380 469/462/462 +f 381/370/370 468/461/461 375/365/365 +f 364/355/355 363/354/354 469/462/462 +f 363/354/354 362/353/353 471/463/463 +f 470/464/464 471/463/463 367/358/358 +f 469/462/462 470/464/464 370/360/360 +f 367/358/358 471/463/463 473/465/465 +f 471/463/463 362/353/353 472/466/466 +f 472/466/466 359/351/351 474/467/467 +f 473/465/465 472/466/466 475/468/468 +f 476/469/469 477/470/470 479/471/471 +f 477/470/470 475/468/468 474/467/467 +f 478/472/472 474/467/467 358/350/350 +f 479/471/471 478/472/472 481/473/473 +f 482/474/474 483/475/475 484/476/476 +f 483/475/475 367/358/358 473/465/465 +f 485/477/477 484/476/476 475/468/468 +f 486/478/478 487/479/479 488/480/480 +f 487/479/479 490/481/481 488/480/480 +f 488/480/480 491/482/482 482/474/474 +f 489/483/483 488/480/480 493/484/484 +f 493/484/484 492/485/485 495/486/486 +f 492/485/485 482/474/474 485/477/477 +f 494/487/487 485/477/477 477/470/470 +f 495/486/486 494/487/487 476/469/469 +f 409/398/398 427/417/417 496/488/488 +f 427/417/417 426/415/415 497/489/489 +f 496/488/488 497/489/489 498/490/490 +f 410/399/399 496/488/488 499/491/491 +f 358/350/350 361/356/356 480/492/492 +f 361/356/356 366/400/400 500/493/493 +f 500/493/493 499/491/491 501/494/494 +f 480/492/492 500/493/493 481/473/473 +f 490/481/481 487/479/479 503/495/495 +f 487/479/479 486/478/478 504/496/496 +f 502/497/497 504/496/496 506/498/498 +f 503/495/495 502/497/497 507/499/499 +f 508/500/500 509/501/501 510/502/502 +f 509/501/501 490/481/481 510/502/502 +f 510/502/502 503/495/495 512/503/503 +f 511/504/504 510/502/502 513/505/505 +f 367/358/358 483/475/475 514/506/506 +f 483/475/475 482/474/474 491/482/482 +f 514/506/506 491/482/482 490/481/481 +f 515/507/507 514/506/506 509/501/501 +f 516/508/508 517/509/509 519/510/510 +f 517/509/509 371/361/361 518/511/511 +f 518/511/511 368/359/359 515/507/507 +f 519/510/510 518/511/511 508/500/500 +f 520/512/512 521/513/513 523/514/514 +f 521/513/513 524/515/515 522/516/516 +f 522/516/516 525/517/517 527/518/518 +f 523/514/514 522/516/516 528/519/519 +f 529/520/520 530/521/521 531/522/522 +f 530/521/521 533/523/523 534/524/524 +f 531/522/522 534/524/524 521/513/513 +f 532/525/525 531/522/522 521/513/513 +f 529/520/520 532/525/525 535/526/526 +f 532/525/525 520/512/512 535/526/526 +f 535/526/526 537/527/527 539/528/528 +f 536/529/529 535/526/526 539/528/528 +f 533/523/523 530/521/521 540/530/530 +f 530/521/521 529/520/520 542/531/531 +f 541/532/532 540/530/530 543/533/533 +f 357/349/349 356/348/348 536/529/529 +f 356/348/348 355/534/534 544/535/535 +f 544/535/535 545/536/536 542/531/531 +f 536/529/529 544/535/535 529/520/520 +f 546/537/537 547/538/538 549/539/539 +f 547/538/538 550/540/540 548/541/541 +f 548/541/541 551/542/542 98/94/94 +f 549/539/539 548/541/541 97/93/93 +f 343/337/337 386/377/377 552/543/543 +f 386/377/377 9/375/375 553/544/544 +f 552/543/543 553/544/544 554/545/545 +f 344/338/338 552/543/543 555/546/546 +f 554/545/545 553/544/544 557/547/547 +f 553/544/544 9/375/375 556/548/548 +f 556/548/548 8/8/8 83/79/79 +f 557/547/547 556/548/548 78/74/74 +f 550/540/540 558/549/549 551/542/542 +f 558/549/549 554/545/545 559/550/550 +f 559/550/550 557/547/547 75/72/72 +f 551/542/542 559/550/550 74/71/71 +f 560/551/551 561/552/552 563/553/553 +f 561/552/552 347/340/340 562/554/554 +f 562/554/554 555/546/546 558/549/549 +f 563/553/553 562/554/554 550/540/540 +f 564/555/555 565/556/556 567/557/557 +f 565/556/556 560/551/551 566/558/558 +f 566/558/558 563/553/553 547/538/538 +f 567/557/557 566/558/558 546/537/537 +f 564/555/555 567/557/557 568/559/559 +f 567/557/557 546/537/537 570/560/560 +f 568/559/559 570/560/560 571/561/561 +f 569/562/562 568/559/559 572/563/563 +f 560/551/551 573/564/564 574/565/565 +f 573/564/564 575/566/566 576/567/567 +f 574/565/565 576/567/567 349/568/568 +f 561/552/552 574/565/565 348/342/342 +f 351/344/344 350/343/343 437/431/431 +f 350/343/343 349/568/568 577/569/569 +f 577/569/569 578/570/570 579/571/571 +f 437/431/431 577/569/569 580/572/572 +f 341/334/334 581/573/573 354/347/347 +f 581/573/573 579/571/571 582/574/574 +f 582/574/574 583/575/575 585/576/576 +f 354/347/347 582/574/574 355/534/534 +f 434/425/425 580/572/572 586/577/577 +f 580/572/572 579/571/571 581/573/573 +f 586/577/577 581/573/573 341/334/334 +f 444/436/436 586/577/577 339/332/332 +f 349/568/568 576/567/567 587/578/578 +f 576/567/567 575/566/566 588/579/579 +f 587/578/578 588/579/579 584/580/580 +f 578/570/570 587/578/578 583/575/575 +f 584/580/580 588/579/579 590/581/581 +f 588/579/579 575/566/566 589/582/582 +f 589/582/582 573/564/564 565/556/556 +f 590/581/581 589/582/582 564/555/555 +f 355/534/534 585/576/576 545/536/536 +f 585/576/576 584/580/580 591/583/583 +f 591/583/583 590/581/581 569/562/562 +f 545/536/536 591/583/583 543/533/533 +f 592/584/584 593/585/585 594/586/586 +f 593/585/585 533/523/523 541/532/532 +f 594/586/586 541/532/532 572/563/563 +f 595/587/587 594/586/586 572/563/563 +f 596/588/588 597/589/589 598/590/590 +f 597/589/589 600/591/591 601/592/592 +f 598/590/590 601/592/592 602/593/593 +f 599/594/594 598/590/590 603/595/595 +f 605/596/596 606/597/597 608/598/598 +f 606/597/597 600/591/591 607/599/599 +f 607/599/599 597/589/589 609/600/600 +f 608/598/598 607/599/599 610/601/601 +f 602/593/593 601/592/592 612/602/602 +f 601/592/592 600/591/591 611/603/603 +f 611/603/603 606/597/597 613/604/604 +f 612/602/602 611/603/603 614/605/605 +f 615/606/606 616/607/607 617/608/608 +f 616/607/607 619/609/609 620/610/610 +f 617/608/608 620/610/610 592/584/584 +f 618/611/611 617/608/608 621/612/612 +f 623/613/613 624/614/614 625/615/615 +f 624/614/614 571/561/561 570/560/560 +f 625/615/615 570/560/560 546/537/537 +f 626/616/616 625/615/615 549/539/539 +f 627/617/617 628/618/618 629/619/619 +f 628/618/618 623/613/613 626/616/616 +f 629/619/619 626/616/616 97/93/93 +f 630/620/620 629/619/619 100/95/95 +f 622/621/621 621/612/612 631/622/622 +f 621/612/612 592/584/584 595/587/587 +f 631/622/622 595/587/587 571/561/561 +f 632/623/623 631/622/622 624/614/614 +f 604/624/624 633/625/625 634/626/626 +f 633/625/625 622/621/621 632/623/623 +f 634/626/626 632/623/623 623/613/613 +f 635/627/627 634/626/626 628/618/618 +f 602/593/593 636/628/628 637/629/629 +f 636/628/628 615/606/606 618/611/611 +f 637/629/629 618/611/611 622/621/621 +f 603/595/595 637/629/629 633/625/625 +f 602/593/593 612/602/602 638/630/630 +f 612/602/602 614/605/605 639/631/631 +f 638/630/630 639/631/631 640/632/632 +f 636/628/628 638/630/630 615/606/606 +f 640/632/632 642/633/633 641/634/634 +f 642/633/633 644/635/635 643/636/636 +f 643/636/636 645/637/637 619/609/609 +f 641/634/634 643/636/636 616/607/607 +f 524/515/515 534/524/524 647/638/638 +f 534/524/524 533/523/523 646/639/639 +f 646/639/639 593/585/585 620/610/610 +f 647/638/638 646/639/639 619/609/609 +f 644/635/635 648/640/640 649/641/641 +f 648/640/640 526/642/642 649/641/641 +f 649/641/641 525/517/517 524/515/515 +f 645/637/637 649/641/641 647/638/638 +f 520/512/512 523/514/514 650/643/643 +f 523/514/514 528/519/519 651/644/644 +f 650/643/643 651/644/644 653/645/645 +f 537/527/527 650/643/643 538/646/646 +f 538/646/646 653/645/645 655/647/647 +f 653/645/645 652/648/648 654/649/649 +f 654/649/649 656/650/650 658/651/651 +f 655/647/647 654/649/649 659/652/652 +f 357/349/349 539/528/528 660/653/653 +f 539/528/528 538/646/646 660/653/653 +f 660/653/653 655/647/647 659/652/652 +f 661/654/654 660/653/653 662/655/655 +f 334/327/327 333/326/326 665/656/656 +f 333/326/326 332/331/331 664/657/657 +f 664/657/657 666/658/658 667/659/659 +f 665/656/656 664/657/657 668/660/660 +f 332/331/331 338/330/330 666/658/658 +f 338/330/330 337/336/336 669/661/661 +f 669/661/661 353/345/345 661/654/654 +f 666/658/658 669/661/661 663/662/662 +f 668/660/660 667/659/659 671/663/663 +f 667/659/659 663/662/662 670/664/664 +f 670/664/664 662/655/655 672/665/665 +f 671/663/663 670/664/664 672/665/665 +f 673/666/666 672/665/665 674/667/667 +f 672/665/665 659/652/652 658/651/651 +f 674/667/667 658/651/651 657/668/668 +f 675/669/669 674/667/667 677/670/670 +f 678/671/671 679/672/672 681/673/673 +f 679/672/672 148/142/142 680/674/674 +f 680/674/674 145/140/140 13/15/15 +f 681/673/673 680/674/674 18/675/675 +f 61/60/60 682/676/676 64/62/62 +f 682/676/676 684/677/677 683/678/678 +f 683/678/678 685/679/679 42/40/40 +f 64/62/62 683/678/678 41/39/39 +f 59/56/56 686/680/680 60/58/58 +f 686/680/680 688/681/681 687/682/682 +f 687/682/682 689/683/683 682/676/676 +f 60/58/58 687/682/682 61/60/60 +f 684/677/677 690/684/684 685/679/679 +f 690/684/684 18/675/675 691/685/685 +f 691/685/685 17/16/16 38/35/35 +f 685/679/679 691/685/685 37/34/34 +f 688/681/681 692/686/686 689/683/683 +f 692/686/686 678/671/671 693/687/687 +f 693/687/687 681/673/673 690/684/684 +f 689/683/683 693/687/687 684/677/677 +f 694/688/688 695/689/689 697/690/690 +f 695/689/689 698/691/691 696/692/692 +f 696/692/692 699/693/693 701/694/694 +f 697/690/690 696/692/692 702/695/695 +f 703/696/696 704/697/697 705/698/698 +f 704/697/697 707/699/699 708/700/700 +f 705/698/698 708/700/700 258/252/252 +f 706/701/701 705/698/698 256/250/250 +f 111/109/109 709/702/702 113/110/110 +f 709/702/702 703/696/696 706/701/701 +f 710/703/703 706/701/701 124/120/120 +f 113/110/110 710/703/703 115/112/112 +f 91/104/104 711/704/704 110/106/106 +f 711/704/704 713/705/705 712/706/706 +f 712/706/706 714/707/707 709/702/702 +f 110/106/106 712/706/706 111/109/109 +f 713/705/705 715/708/708 714/707/707 +f 715/708/708 702/695/695 716/709/709 +f 716/709/709 717/710/710 707/699/699 +f 714/707/707 716/709/709 704/697/697 +f 7/6/6 6/5/5 85/81/81 +f 6/5/5 5/4/4 718/711/711 +f 718/711/711 719/712/712 721/713/713 +f 85/81/81 718/711/711 86/85/85 +f 720/714/714 719/712/712 723/715/715 +f 719/712/712 5/4/4 722/716/716 +f 1/1/1 463/456/456 2/2/2 +f 723/715/715 722/716/716 376/366/366 +f 720/714/714 723/715/715 724/717/717 +f 723/715/715 376/366/366 379/371/371 +f 724/717/717 379/371/371 373/718/718 +f 725/719/719 724/717/717 726/720/720 +f 91/104/104 90/87/87 727/721/721 +f 90/87/87 86/85/85 721/713/713 +f 727/721/721 721/713/713 720/714/714 +f 711/704/704 727/721/721 728/722/722 +f 694/688/688 697/690/690 729/723/723 +f 697/690/690 702/695/695 715/708/708 +f 729/723/723 715/708/708 713/705/705 +f 725/719/719 729/723/723 728/722/722 +f 258/252/252 730/724/724 731/725/725 +f 730/724/724 732/726/726 733/727/727 +f 731/725/725 733/727/727 238/231/231 +f 259/253/253 731/725/725 249/243/243 +f 707/699/699 734/728/728 735/729/729 +f 734/728/728 736/730/730 737/731/731 +f 735/729/729 737/731/731 732/726/726 +f 708/700/700 735/729/729 730/724/724 +f 732/726/726 738/732/732 739/733/733 +f 738/732/732 740/734/734 739/733/733 +f 739/733/733 741/735/735 239/232/232 +f 733/727/727 739/733/733 239/232/232 +f 700/736/736 742/737/737 744/738/738 +f 742/737/737 745/739/739 746/740/740 +f 743/741/741 746/740/740 747/742/742 +f 744/738/738 743/741/741 736/730/730 +f 736/730/730 748/743/743 749/744/744 +f 748/743/743 747/742/742 749/744/744 +f 749/744/744 750/745/745 738/732/732 +f 737/731/731 749/744/744 738/732/732 +f 702/695/695 701/694/694 751/746/746 +f 701/694/694 700/736/736 751/746/746 +f 751/746/746 744/738/738 736/730/730 +f 717/710/710 751/746/746 734/728/728 +f 373/718/718 372/363/363 752/747/747 +f 372/363/363 371/361/361 517/509/509 +f 752/747/747 517/509/509 516/508/508 +f 753/748/748 752/747/747 754/749/749 +f 755/750/750 756/751/751 758/752/752 +f 756/751/751 759/753/753 760/754/754 +f 757/755/755 760/754/754 761/756/756 +f 758/752/752 757/755/755 698/691/691 +f 755/750/750 758/752/752 763/757/757 +f 758/752/752 698/691/691 695/689/689 +f 763/757/757 695/689/689 694/688/688 +f 753/748/748 763/757/757 726/720/720 +f 764/758/758 765/759/759 767/760/760 +f 765/759/759 516/508/508 766/761/761 +f 766/761/761 519/510/510 511/504/504 +f 767/760/760 766/761/761 513/505/505 +f 755/750/750 754/749/749 768/762/762 +f 754/749/749 516/508/508 765/759/759 +f 768/762/762 765/759/759 764/758/758 +f 756/751/751 768/762/762 769/763/763 +f 698/691/691 762/764/764 770/765/765 +f 762/764/764 761/756/756 771/766/766 +f 770/765/765 771/766/766 745/739/739 +f 699/693/693 770/765/765 700/736/736 +f 772/767/767 773/768/768 775/769/769 +f 773/768/768 776/770/770 777/771/771 +f 774/772/772 777/771/771 143/137/137 +f 775/769/769 774/772/772 157/152/152 +f 143/137/137 777/771/771 144/139/139 +f 777/771/771 776/770/770 779/773/773 +f 778/774/774 779/773/773 131/127/127 +f 144/139/139 778/774/774 134/130/130 +f 780/775/775 781/776/776 783/777/777 +f 781/776/776 784/778/778 782/779/779 +f 782/779/779 785/780/780 787/781/781 +f 783/777/777 782/779/779 788/782/782 +f 789/783/783 790/784/784 792/785/785 +f 790/784/784 793/786/786 791/787/787 +f 791/787/787 794/788/788 796/789/789 +f 792/785/785 791/787/787 797/790/790 +f 798/791/791 799/792/792 800/793/793 +f 799/792/792 802/794/794 803/795/795 +f 800/793/793 803/795/795 804/796/796 +f 801/797/797 800/793/793 805/798/798 +f 807/799/799 808/800/800 810/801/801 +f 808/800/800 793/786/786 790/784/784 +f 809/802/802 790/784/784 789/783/783 +f 810/801/801 809/802/802 811/803/803 +f 812/804/804 813/805/805 815/806/806 +f 813/805/805 807/799/799 814/807/807 +f 814/807/807 810/801/801 806/808/808 +f 815/806/806 814/807/807 804/796/796 +f 806/808/808 811/803/803 816/809/809 +f 811/803/803 789/783/783 817/810/810 +f 816/809/809 817/810/810 818/811/811 +f 801/797/797 816/809/809 819/812/812 +f 798/791/791 819/812/812 820/813/813 +f 819/812/812 818/811/811 822/814/814 +f 820/813/813 822/814/814 823/815/815 +f 821/816/816 820/813/813 824/817/817 +f 825/818/818 824/817/817 826/819/819 +f 824/817/817 823/815/815 828/820/820 +f 826/819/819 828/820/820 47/45/45 +f 827/821/821 826/819/819 50/822/47 +f 829/823/822 830/824/823 832/825/824 +f 830/824/823 57/54/54 831/826/825 +f 831/826/825 54/52/52 833/827/826 +f 832/825/824 831/826/825 834/828/827 +f 823/815/815 835/829/828 836/830/829 +f 835/829/828 834/828/827 833/827/826 +f 836/830/829 833/827/826 53/51/51 +f 828/820/820 836/830/829 63/59/59 +f 837/831/830 838/832/831 839/833/832 +f 838/832/831 841/834/833 842/835/834 +f 839/833/832 842/835/834 843/836/835 +f 840/837/836 839/833/832 844/838/837 +f 846/839/838 847/840/839 848/841/840 +f 847/840/839 850/842/841 851/843/842 +f 848/841/840 851/843/842 852/844/843 +f 849/845/844 848/841/840 853/846/845 +f 855/847/846 856/848/847 857/849/848 +f 856/848/847 780/775/775 859/850/849 +f 857/849/848 859/850/849 850/842/841 +f 858/851/850 857/849/848 847/840/839 +f 860/852/851 861/853/852 862/854/853 +f 861/853/852 855/847/846 858/851/850 +f 862/854/853 858/851/850 846/839/838 +f 863/855/854 862/854/853 864/856/855 +f 865/857/856 864/856/855 866/858/857 +f 864/856/855 846/839/838 849/845/844 +f 866/858/857 849/845/844 854/859/858 +f 867/860/859 866/858/857 868/861/860 +f 854/859/858 853/846/845 869/862/861 +f 853/846/845 852/844/843 871/863/862 +f 869/862/861 871/863/862 872/864/863 +f 870/865/864 869/862/861 873/866/865 +f 845/867/866 844/838/837 875/868/867 +f 844/838/837 843/836/835 868/861/860 +f 875/868/867 868/861/860 870/865/864 +f 876/869/868 875/868/867 874/870/869 +f 865/857/856 867/860/859 878/871/870 +f 867/860/859 843/836/835 877/872/871 +f 877/872/871 842/835/834 841/834/833 +f 878/871/870 877/872/871 880/873/872 +f 881/874/873 882/875/874 883/876/875 +f 882/875/874 860/852/851 863/855/854 +f 883/876/875 863/855/854 865/857/856 +f 884/877/876 883/876/875 880/873/872 +f 885/878/877 886/879/878 888/880/879 +f 886/879/878 889/881/880 887/882/881 +f 887/882/881 890/883/882 884/877/876 +f 888/880/879 887/882/881 880/873/872 +f 891/884/883 892/885/884 893/886/885 +f 892/885/884 889/881/880 893/886/885 +f 893/886/885 895/887/886 896/888/887 +f 894/889/888 893/886/885 897/890/889 +f 889/881/880 886/879/878 895/887/886 +f 886/879/878 885/878/877 899/891/890 +f 899/891/890 900/892/891 902/893/892 +f 895/887/886 899/891/890 896/888/887 +f 896/888/887 902/893/892 904/894/893 +f 902/893/892 901/895/894 903/896/895 +f 903/896/895 905/897/896 907/898/897 +f 904/894/893 903/896/895 908/899/898 +f 909/900/899 910/901/900 912/902/901 +f 910/901/900 913/903/902 911/904/903 +f 911/904/903 914/905/904 916/906/905 +f 912/902/901 911/904/903 908/899/898 +f 917/907/906 918/908/907 920/909/908 +f 918/908/907 921/910/909 919/911/910 +f 919/911/910 922/912/911 923/913/912 +f 920/909/908 919/911/910 924/914/913 +f 909/900/899 925/915/914 926/916/915 +f 925/915/914 927/917/916 928/918/917 +f 926/916/915 928/918/917 924/914/913 +f 910/901/900 926/916/915 929/919/918 +f 924/914/913 930/920/919 931/921/920 +f 930/920/919 807/799/799 813/805/805 +f 931/921/920 813/805/805 812/804/804 +f 929/919/918 931/921/920 932/922/921 +f 795/923/922 794/788/788 933/924/923 +f 794/788/788 793/786/786 808/800/800 +f 933/924/923 808/800/800 807/799/799 +f 923/913/912 933/924/923 930/920/919 +f 924/914/913 928/918/917 920/909/908 +f 928/918/917 927/917/916 934/925/924 +f 920/909/908 934/925/924 935/926/925 +f 915/927/926 936/928/927 937/929/928 +f 936/928/927 938/930/929 939/931/930 +f 937/929/928 939/931/930 940/932/931 +f 916/906/905 937/929/928 908/899/898 +f 938/930/929 942/933/932 943/934/933 +f 942/933/932 944/935/934 945/936/935 +f 943/934/933 945/936/935 946/937/936 +f 939/931/930 943/934/933 947/938/937 +f 946/937/936 945/936/935 949/939/938 +f 945/936/935 944/935/934 948/940/939 +f 948/940/939 950/941/940 952/942/941 +f 949/939/938 948/940/939 953/943/942 +f 188/944/226 954/945/943 955/946/944 +f 954/945/943 956/947/945 957/948/946 +f 955/946/944 957/948/946 958/949/947 +f 189/950/182 955/946/944 959/951/948 +f 958/949/947 960/952/949 959/951/948 +f 960/952/949 962/953/950 961/954/951 +f 961/954/951 963/955/952 191/956/184 +f 959/951/948 961/954/951 194/957/189 +f 962/953/950 964/958/953 963/955/952 +f 964/958/953 825/818/818 827/821/821 +f 965/959/954 827/821/821 52/960/50 +f 963/955/952 965/959/954 198/961/190 +f 962/953/950 966/962/955 967/963/956 +f 966/962/955 802/794/794 799/792/792 +f 967/963/956 799/792/792 821/816/816 +f 964/958/953 967/963/956 825/818/818 +f 804/796/796 803/795/795 969/964/957 +f 803/795/795 802/794/794 968/965/958 +f 968/965/958 966/962/955 960/952/949 +f 969/964/957 968/965/958 958/949/947 +f 944/935/934 970/966/959 950/941/940 +f 970/966/959 972/967/960 971/968/961 +f 971/968/961 973/969/962 975/970/963 +f 950/941/940 971/968/961 951/971/964 +f 974/972/965 973/969/962 976/973/966 +f 973/969/962 972/967/960 978/974/967 +f 976/973/966 978/974/967 979/975/968 +f 977/976/969 976/973/966 980/977/970 +f 938/930/929 981/978/971 942/933/932 +f 981/978/971 983/979/972 982/980/973 +f 982/980/973 984/981/974 970/966/959 +f 942/933/932 982/980/973 944/935/934 +f 979/975/968 985/982/975 986/983/976 +f 985/982/975 988/984/977 989/985/978 +f 986/983/976 989/985/978 812/804/804 +f 987/986/979 986/983/976 815/806/806 +f 812/804/804 989/985/978 932/922/921 +f 989/985/978 988/984/977 990/987/980 +f 990/987/980 991/988/981 914/905/904 +f 932/922/921 990/987/980 913/903/902 +f 988/984/977 992/989/982 991/988/981 +f 992/989/982 983/979/972 981/978/971 +f 993/990/983 981/978/971 938/930/929 +f 991/988/981 993/990/983 915/927/926 +f 972/967/960 984/981/974 994/991/984 +f 984/981/974 983/979/972 992/989/982 +f 994/991/984 992/989/982 988/984/977 +f 978/974/967 994/991/984 985/982/975 +f 958/949/947 957/948/946 969/964/957 +f 957/948/946 956/947/945 995/992/985 +f 995/992/985 980/977/970 987/986/979 +f 969/964/957 995/992/985 804/796/796 +f 232/993/230 996/994/986 997/995/987 +f 996/994/986 974/972/965 977/976/969 +f 997/995/987 977/976/969 956/947/945 +f 233/996/225 997/995/987 954/945/943 +f 236/997/229 998/998/988 999/999/989 +f 998/998/988 951/971/964 975/970/963 +f 999/999/989 975/970/963 974/972/965 +f 237/1000/990 999/999/989 996/994/986 +f 244/1001/236 243/1002/235 1000/1003/991 +f 243/1002/235 242/1004/234 1002/1005/992 +f 1000/1003/991 1002/1005/992 1003/1006/993 +f 1001/1007/994 1000/1003/991 1004/1008/995 +f 236/997/229 247/1009/241 998/998/988 +f 247/1009/241 244/1001/236 1005/1010/996 +f 1005/1010/996 1001/1007/994 952/942/941 +f 998/998/988 1005/1010/996 951/971/964 +f 953/943/942 1004/1008/995 949/939/938 +f 1004/1008/995 1003/1006/993 1006/1011/997 +f 1006/1011/997 1007/1012/998 1009/1013/999 +f 949/939/938 1006/1011/997 946/937/936 +f 946/937/936 1009/1013/999 947/938/937 +f 1009/1013/999 1008/1014/1000 1010/1015/1001 +f 1010/1015/1001 1011/1016/1002 1012/1017/1003 +f 947/938/937 1010/1015/1001 940/932/931 +f 940/932/931 1012/1017/1003 941/1018/1004 +f 1012/1017/1003 898/1019/1005 1013/1020/1006 +f 1013/1020/1006 897/890/889 904/894/893 +f 941/1018/1004 1013/1020/1006 908/899/898 +f 1008/1014/1000 1014/1021/1007 1011/1016/1002 +f 1014/1021/1007 1016/1022/1008 1015/1023/1009 +f 1015/1023/1009 1017/1024/1010 894/889/888 +f 1011/1016/1002 1015/1023/1009 898/1019/1005 +f 1018/1025/1011 1019/1026/1012 1021/1027/1013 +f 1019/1026/1012 1022/1028/1014 1020/1029/1015 +f 1020/1029/1015 1023/1030/1016 1025/1031/1017 +f 1021/1027/1013 1020/1029/1015 1026/1032/1018 +f 1027/1033/1019 1028/1034/1020 1030/1035/1021 +f 1028/1034/1020 1031/1036/1022 1029/1037/1023 +f 1029/1037/1023 1032/1038/1024 1021/1027/1013 +f 1030/1035/1021 1029/1037/1023 1026/1032/1018 +f 1033/1039/1025 1034/1040/1026 1036/1041/1027 +f 1034/1040/1026 1037/1042/1028 1035/1043/1029 +f 1035/1043/1029 1038/1044/1030 1040/1045/1031 +f 1036/1041/1027 1035/1043/1029 1041/1046/1032 +f 1042/1047/1033 1043/1048/1034 1044/1049/1035 +f 1043/1048/1034 1037/1042/1028 1034/1040/1026 +f 1044/1049/1035 1034/1040/1026 1033/1039/1025 +f 1045/1050/1036 1044/1049/1035 1046/1051/1037 +f 1047/1052/1038 1048/1053/1039 1049/1054/1040 +f 1048/1053/1039 1051/1055/1041 1052/1056/1042 +f 1049/1054/1040 1052/1056/1042 1053/1057/1043 +f 1050/1058/1044 1049/1054/1040 1054/1059/1045 +f 1056/1060/1046 1057/1061/1047 1058/1062/1048 +f 1057/1061/1047 1060/1063/1049 1061/1064/1050 +f 1058/1062/1048 1061/1064/1050 1062/1065/1051 +f 1059/1066/1052 1058/1062/1048 1063/1067/1053 +f 1062/1065/1051 1065/1068/1054 1063/1067/1053 +f 1065/1068/1054 1053/1057/1043 1066/1069/1055 +f 1066/1069/1055 1067/1070/1056 1069/1071/1057 +f 1063/1067/1053 1066/1069/1055 1064/1072/1058 +f 1053/1057/1043 1065/1068/1054 1054/1059/1045 +f 1065/1068/1054 1062/1065/1051 1070/1073/1059 +f 1070/1073/1059 1071/1074/1060 1072/1075/1061 +f 1054/1059/1045 1070/1073/1059 1055/1076/1062 +f 1051/1055/1041 1073/1077/1063 1074/1078/1064 +f 1073/1077/1063 1075/1079/1065 1076/1080/1066 +f 1074/1078/1064 1076/1080/1066 1068/1081/1067 +f 1052/1056/1042 1074/1078/1064 1067/1070/1056 +f 1077/1082/1068 1078/1083/1069 1080/1084/1070 +f 1078/1083/1069 1047/1052/1038 1079/1085/1071 +f 1079/1085/1071 1050/1058/1044 1081/1086/1072 +f 1080/1084/1070 1079/1085/1071 1026/1032/1018 +f 1055/1076/1062 1072/1075/1061 1082/1087/1073 +f 1072/1075/1061 1042/1047/1033 1045/1050/1036 +f 1082/1087/1073 1045/1050/1036 1027/1033/1019 +f 1081/1086/1072 1082/1087/1073 1030/1035/1021 +f 1062/1065/1051 1061/1064/1050 1071/1074/1060 +f 1061/1064/1050 1060/1063/1049 1084/1088/1074 +f 1083/1089/1075 1084/1088/1074 1037/1042/1028 +f 1071/1074/1060 1083/1089/1075 1043/1048/1034 +f 1037/1042/1028 1084/1088/1074 1085/1090/1076 +f 1084/1088/1074 1060/1063/1049 1057/1061/1047 +f 1085/1090/1076 1057/1061/1047 1086/1091/1077 +f 1038/1044/1030 1085/1090/1076 1039/1092/1078 +f 1087/1093/1079 1088/1094/1080 1089/1095/1081 +f 1088/1094/1080 1056/1060/1046 1059/1066/1052 +f 1089/1095/1081 1059/1066/1052 1064/1072/1058 +f 1090/1096/1082 1089/1095/1081 1091/1097/1083 +f 1093/1098/1084 1094/1099/1085 1095/1100/1086 +f 1094/1099/1085 1039/1092/1078 1086/1091/1077 +f 1095/1100/1086 1086/1091/1077 1056/1060/1046 +f 1096/1101/1087 1095/1100/1086 1088/1094/1080 +f 1093/1098/1084 1097/1102/1088 1094/1099/1085 +f 1097/1102/1088 1099/1103/1089 1098/1104/1090 +f 1098/1104/1090 1100/1105/1091 1040/1045/1031 +f 1094/1099/1085 1098/1104/1090 1039/1092/1078 +f 1101/1106/1092 1102/1107/1093 1103/1108/1094 +f 1102/1107/1093 1105/1109/1095 1106/1110/1096 +f 1103/1108/1094 1106/1110/1096 1107/1111/1097 +f 1104/1112/1098 1103/1108/1094 1108/1113/1099 +f 1110/1114/1100 1111/1115/1101 1112/1116/1102 +f 1111/1115/1101 1099/1103/1089 1097/1102/1088 +f 1112/1116/1102 1097/1102/1088 1093/1098/1084 +f 1113/1117/1103 1112/1116/1102 1114/1118/1104 +f 1116/1119/1105 1117/1120/1106 1119/1121/1107 +f 1117/1120/1106 1120/1122/1108 1121/1123/1109 +f 1118/1124/1110 1121/1123/1109 1123/1125/1111 +f 1119/1121/1107 1118/1124/1110 1124/1126/1112 +f 1125/1127/1113 1126/1128/1114 1127/1129/1115 +f 1126/1128/1114 1129/1130/1116 1130/1131/1117 +f 1127/1129/1115 1130/1131/1117 1131/1132/1118 +f 1128/1133/1119 1127/1129/1115 1132/1134/1120 +f 1133/1135/1121 1134/1136/1122 1135/1137/1123 +f 1134/1136/1122 1136/1138/1124 1137/1139/1125 +f 1135/1137/1123 1137/1139/1125 1139/1140/1126 +f 1128/1133/1119 1135/1137/1123 1139/1140/1126 +f 788/782/782 787/781/781 1141/1141/1127 +f 787/781/781 786/1142/1128 1140/1143/1129 +f 1140/1143/1129 1142/1144/1130 1144/1145/1131 +f 1141/1141/1127 1140/1143/1129 1107/1111/1097 +f 1145/1146/1132 1146/1147/1133 1147/1148/1134 +f 1146/1147/1133 1149/1149/1135 1150/1150/1136 +f 1147/1148/1134 1150/1150/1136 1151/1151/1137 +f 1148/1152/1138 1147/1148/1134 1152/1153/1139 +f 1077/1082/1068 1080/1084/1070 1153/1154/1140 +f 1080/1084/1070 1026/1032/1018 1025/1031/1017 +f 1153/1154/1140 1025/1031/1017 1024/1155/1141 +f 1154/1156/1142 1153/1154/1140 1155/1157/1143 +f 1156/1158/1144 1155/1157/1143 1157/1159/1145 +f 1155/1157/1143 1024/1155/1141 1159/1160/1146 +f 1157/1159/1145 1159/1160/1146 1160/1161/1147 +f 1158/1162/1148 1157/1159/1145 1161/1163/1149 +f 1124/1126/1112 1163/1164/1150 1119/1121/1107 +f 1163/1164/1150 1165/1165/1151 1164/1166/1152 +f 1164/1166/1152 1166/1167/1153 1168/1168/1154 +f 1119/1121/1107 1164/1166/1152 1116/1119/1105 +f 1169/1169/1155 1170/1170/1156 1172/1171/1157 +f 1170/1170/1156 1173/1172/1158 1174/1173/1159 +f 1171/1174/1160 1174/1173/1159 1162/1175/1161 +f 1172/1171/1157 1171/1174/1160 1161/1163/1149 +f 1175/1176/1162 1176/1177/1163 1178/1178/1164 +f 1176/1177/1163 1179/1179/1165 1180/1180/1166 +f 1177/1181/1167 1180/1180/1166 1173/1172/1158 +f 1178/1178/1164 1177/1181/1167 1169/1169/1155 +f 1181/1182/1168 1182/1183/1169 1184/1184/1170 +f 1182/1183/1169 1175/1176/1162 1183/1185/1171 +f 1183/1185/1171 1178/1178/1164 1185/1186/1172 +f 1184/1184/1170 1183/1185/1171 1165/1165/1151 +f 1165/1165/1151 1185/1186/1172 1166/1167/1153 +f 1185/1186/1172 1169/1169/1155 1186/1187/1173 +f 1186/1187/1173 1172/1171/1157 1187/1188/1174 +f 1166/1167/1153 1186/1187/1173 1167/1189/1175 +f 1024/1155/1141 1188/1190/1176 1189/1191/1177 +f 1188/1190/1176 1190/1192/1178 1191/1193/1179 +f 1189/1191/1177 1191/1193/1179 1167/1189/1175 +f 1159/1160/1146 1189/1191/1177 1187/1188/1174 +f 1192/1194/1180 1193/1195/1181 1195/1196/1182 +f 1193/1195/1181 1196/1197/1183 1194/1198/1184 +f 1194/1198/1184 1197/1199/1185 1199/1200/1186 +f 1195/1196/1182 1194/1198/1184 1109/1201/1187 +f 1198/1202/1188 1197/1199/1185 1200/1203/1189 +f 1197/1199/1185 1196/1197/1183 1202/1204/1190 +f 1200/1203/1189 1202/1204/1190 1033/1039/1025 +f 1201/1205/1191 1200/1203/1189 1036/1041/1027 +f 1033/1039/1025 1202/1204/1190 1046/1051/1037 +f 1202/1204/1190 1196/1197/1183 1203/1206/1192 +f 1203/1206/1192 1204/1207/1193 1028/1034/1020 +f 1046/1051/1037 1203/1206/1192 1027/1033/1019 +f 1022/1028/1014 1019/1026/1012 1206/1208/1194 +f 1019/1026/1012 1018/1025/1011 1205/1209/1195 +f 1205/1209/1195 1032/1038/1024 1207/1210/1196 +f 1206/1208/1194 1205/1209/1195 1208/1211/1197 +f 1024/1155/1141 1023/1030/1016 1209/1212/1198 +f 1023/1030/1016 1022/1028/1014 1206/1208/1194 +f 1209/1212/1198 1206/1208/1194 1208/1211/1197 +f 1188/1190/1176 1209/1212/1198 1190/1192/1178 +f 1208/1211/1197 1207/1210/1196 1212/1213/1199 +f 1207/1210/1196 1031/1036/1022 1211/1214/1200 +f 1211/1214/1200 1204/1207/1193 1193/1195/1181 +f 1212/1213/1199 1211/1214/1200 1192/1194/1180 +f 1190/1192/1178 1210/1215/1201 1214/1216/1202 +f 1210/1215/1201 1208/1211/1197 1213/1217/1203 +f 1213/1217/1203 1212/1213/1199 1215/1218/1204 +f 1214/1216/1202 1213/1217/1203 1145/1146/1132 +f 1167/1189/1175 1191/1193/1179 1168/1168/1154 +f 1191/1193/1179 1190/1192/1178 1216/1219/1205 +f 1216/1219/1205 1214/1216/1202 1148/1152/1138 +f 1168/1168/1154 1216/1219/1205 1116/1119/1105 +f 1149/1149/1135 1146/1147/1133 1217/1220/1206 +f 1146/1147/1133 1145/1146/1132 1215/1218/1204 +f 1217/1220/1206 1215/1218/1204 1192/1194/1180 +f 1218/1221/1207 1217/1220/1206 1195/1196/1182 +f 1107/1111/1097 1144/1145/1131 1108/1113/1099 +f 1144/1145/1131 1143/1222/1208 1219/1223/1209 +f 1219/1223/1209 1220/1224/1210 1218/1221/1207 +f 1108/1113/1099 1219/1223/1209 1109/1201/1187 +f 1143/1222/1208 1142/1144/1130 1221/1225/1211 +f 1142/1144/1130 786/1142/1128 1223/1226/1212 +f 1221/1225/1211 1223/1226/1212 1138/1227/1213 +f 1222/1228/1214 1221/1225/1211 1137/1139/1125 +f 1136/1138/1124 1224/1229/1215 1225/1230/1216 +f 1224/1229/1215 1151/1151/1137 1150/1150/1136 +f 1225/1230/1216 1150/1150/1136 1149/1149/1135 +f 1222/1228/1214 1225/1230/1216 1220/1224/1210 +f 1116/1119/1105 1152/1153/1139 1226/1231/1217 +f 1152/1153/1139 1151/1151/1137 1224/1229/1215 +f 1226/1231/1217 1224/1229/1215 1136/1138/1124 +f 1227/1232/1218 1226/1231/1217 1134/1136/1122 +f 1131/1132/1118 1228/1233/1219 1132/1134/1120 +f 1228/1233/1219 1120/1122/1108 1229/1234/1220 +f 1229/1234/1220 1117/1120/1106 1116/1119/1105 +f 1132/1134/1120 1229/1234/1220 1133/1135/1121 +f 1122/1235/1221 1121/1123/1109 1230/1236/1222 +f 1121/1123/1109 1120/1122/1108 1228/1233/1219 +f 1230/1236/1222 1228/1233/1219 1131/1132/1118 +f 1231/1237/1223 1230/1236/1222 1232/1238/1224 +f 1122/1235/1221 1231/1237/1223 1235/1239/1225 +f 1231/1237/1223 1233/1240/1226 1234/1241/1227 +f 1234/1241/1227 1236/1242/1228 1238/1243/1229 +f 1235/1239/1225 1234/1241/1227 1239/1244/1230 +f 1131/1132/1118 1240/1245/1231 1241/1246/1232 +f 1240/1245/1231 1242/1247/1233 1243/1248/1234 +f 1232/1238/1224 1241/1246/1232 1243/1248/1234 +f 1242/1247/1233 1244/1249/1235 1246/1250/1236 +f 1244/1249/1235 1247/1251/1237 1248/1252/1238 +f 1245/1253/1239 1248/1252/1238 1249/1254/1240 +f 1246/1250/1236 1245/1253/1239 1251/1255/1241 +f 1233/1240/1226 1243/1248/1234 1252/1256/1242 +f 1243/1248/1234 1242/1247/1233 1252/1256/1242 +f 1252/1256/1242 1246/1250/1236 1253/1257/1243 +f 1236/1242/1228 1252/1256/1242 1237/1258/1244 +f 1254/1259/1245 1255/1260/1246 1257/1261/1247 +f 1255/1260/1246 1181/1182/1168 1256/1262/1248 +f 1256/1262/1248 1184/1184/1170 1163/1164/1150 +f 1257/1261/1247 1256/1262/1248 1124/1126/1112 +f 1254/1259/1245 1257/1261/1247 1258/1263/1249 +f 1257/1261/1247 1124/1126/1112 1123/1125/1111 +f 1258/1263/1249 1123/1125/1111 1122/1235/1221 +f 1259/1264/1250 1258/1263/1249 1235/1239/1225 +f 505/1265/1251 1260/1266/1252 506/1267/498 +f 1260/1266/1252 1249/1254/1240 1261/1268/1253 +f 1261/1268/1253 1248/1252/1238 1262/1269/1254 +f 506/1267/498 1261/1268/1253 507/1270/499 +f 507/1270/499 1262/1269/1254 1263/1271/1255 +f 1262/1269/1254 1247/1251/1237 1264/1272/1256 +f 1263/1271/1255 1264/1272/1256 1265/1273/1257 +f 512/1274/503 1263/1271/1255 1266/1275/1258 +f 1247/1251/1237 1244/1249/1235 1264/1272/1256 +f 1244/1249/1235 1242/1247/1233 1267/1276/1259 +f 1267/1276/1259 1240/1245/1231 1268/1277/1260 +f 1264/1272/1256 1267/1276/1259 1265/1273/1257 +f 1131/1132/1118 1130/1131/1117 1269/1278/1261 +f 1130/1131/1117 1129/1130/1116 1270/1279/1262 +f 1269/1278/1261 1270/1279/1262 1271/1280/1263 +f 1268/1277/1260 1269/1278/1261 1272/1281/1264 +f 526/642/642 1273/1282/1265 527/518/518 +f 1273/1282/1265 1275/1283/1266 1274/1284/1267 +f 1274/1284/1267 1276/1285/1268 1277/1286/1269 +f 527/518/518 1274/1284/1267 1278/1287/1270 +f 1275/1283/1266 1279/1288/1271 1276/1285/1268 +f 1279/1288/1271 1281/1289/1272 1280/1290/1273 +f 1280/1290/1273 1282/1291/1274 1284/1292/1275 +f 1276/1285/1268 1280/1290/1273 1277/1286/1269 +f 1285/1293/1276 1286/1294/1277 1287/1295/1278 +f 1286/1294/1277 1277/1286/1269 1284/1292/1275 +f 1287/1295/1278 1284/1292/1275 1283/1296/1279 +f 1288/1297/1280 1287/1295/1278 1115/1298/1281 +f 1283/1296/1279 1282/1291/1274 1290/1299/1282 +f 1282/1291/1274 1281/1289/1272 1292/1300/1283 +f 1291/1301/1284 1290/1299/1282 1292/1300/1283 +f 1293/1302/1285 1294/1303/1286 1295/1304/1287 +f 1294/1303/1286 1110/1114/1100 1295/1304/1287 +f 1295/1304/1287 1113/1117/1103 1289/1305/1288 +f 1291/1301/1284 1295/1304/1287 1283/1296/1279 +f 852/844/843 1296/1306/1289 1297/1307/1290 +f 1296/1306/1289 1298/1308/1291 1299/1309/1292 +f 1297/1307/1290 1299/1309/1292 1300/1310/1293 +f 871/863/862 1297/1307/1290 1301/1311/1294 +f 1302/1312/1295 1303/1313/1296 1305/1314/1297 +f 1303/1313/1296 788/782/782 1304/1315/1298 +f 1304/1315/1298 1141/1141/1127 1106/1110/1096 +f 1305/1314/1297 1304/1315/1298 1105/1109/1095 +f 780/775/775 783/777/777 1306/1316/1299 +f 783/777/777 788/782/782 1303/1313/1296 +f 1306/1316/1299 1303/1313/1296 1302/1312/1295 +f 859/850/849 1306/1316/1299 1307/1317/1300 +f 850/842/841 1307/1317/1300 1308/1318/1301 +f 1307/1317/1300 1302/1312/1295 1309/1319/1302 +f 1308/1318/1301 1309/1319/1302 1298/1308/1291 +f 851/843/842 1308/1318/1301 1296/1306/1289 +f 1302/1312/1295 1305/1314/1297 1310/1320/1303 +f 1305/1314/1297 1105/1109/1095 1311/1321/1304 +f 1310/1320/1303 1311/1321/1304 1312/1322/1305 +f 1309/1319/1302 1310/1320/1303 1313/1323/1306 +f 1298/1308/1291 1313/1323/1306 1314/1324/1307 +f 1313/1323/1306 1312/1322/1305 1315/1325/1308 +f 1314/1324/1307 1315/1325/1308 1316/1326/1309 +f 1299/1309/1292 1314/1324/1307 1317/1327/1310 +f 1318/1328/1311 1319/1329/1312 1321/1330/1313 +f 1319/1329/1312 1300/1310/1293 1320/1331/1314 +f 1320/1331/1314 1317/1327/1310 1322/1332/1315 +f 1321/1330/1313 1320/1331/1314 1293/1302/1285 +f 1101/1106/1092 1323/1333/1316 1102/1107/1093 +f 1323/1333/1316 1325/1334/1317 1324/1335/1318 +f 1324/1335/1318 1326/1336/1319 1311/1321/1304 +f 1102/1107/1093 1324/1335/1318 1105/1109/1095 +f 1327/1337/1320 1328/1338/1321 1330/1339/1322 +f 1328/1338/1321 1101/1106/1092 1104/1112/1098 +f 1329/1340/1323 1104/1112/1098 1109/1201/1187 +f 1330/1339/1322 1329/1340/1323 1198/1202/1188 +f 1331/1341/1324 1332/1342/1325 1333/1343/1326 +f 1332/1342/1325 1327/1337/1320 1335/1344/1327 +f 1333/1343/1326 1335/1344/1327 1099/1103/1089 +f 1334/1345/1328 1333/1343/1326 1111/1115/1101 +f 1099/1103/1089 1335/1344/1327 1100/1105/1091 +f 1335/1344/1327 1327/1337/1320 1336/1346/1329 +f 1336/1346/1329 1330/1339/1322 1201/1205/1191 +f 1100/1105/1091 1336/1346/1329 1041/1046/1032 +f 1331/1341/1324 1337/1347/1330 1332/1342/1325 +f 1337/1347/1330 1325/1334/1317 1338/1348/1331 +f 1338/1348/1331 1323/1333/1316 1101/1106/1092 +f 1332/1342/1325 1338/1348/1331 1327/1337/1320 +f 1312/1322/1305 1326/1336/1319 1339/1349/1332 +f 1326/1336/1319 1325/1334/1317 1337/1347/1330 +f 1339/1349/1332 1337/1347/1330 1331/1341/1324 +f 1315/1325/1308 1339/1349/1332 1340/1350/1333 +f 1316/1326/1309 1340/1350/1333 1341/1351/1334 +f 1340/1350/1333 1331/1341/1324 1334/1345/1328 +f 1341/1351/1334 1334/1345/1328 1294/1303/1286 +f 1322/1332/1315 1341/1351/1334 1294/1303/1286 +f 1293/1302/1285 1292/1300/1283 1321/1330/1313 +f 1292/1300/1283 1281/1289/1272 1342/1352/1335 +f 1342/1352/1335 1343/1353/1336 1345/1354/1337 +f 1321/1330/1313 1342/1352/1335 1318/1328/1311 +f 1346/1355/1338 1347/1356/1339 1349/1357/1340 +f 1347/1356/1339 1350/1358/1341 1348/1359/1342 +f 1348/1359/1342 1351/1360/1343 1353/1361/1344 +f 1349/1357/1340 1348/1359/1342 1354/1362/1345 +f 1352/1363/1346 1351/1360/1343 1355/1364/1347 +f 1351/1360/1343 1350/1358/1341 1357/1365/1348 +f 1355/1364/1347 1357/1365/1348 605/596/596 +f 1356/1366/1349 1355/1364/1347 608/598/598 +f 605/596/596 1357/1365/1348 613/604/604 +f 1357/1365/1348 1350/1358/1341 1347/1356/1339 +f 1358/1367/1350 1347/1356/1339 1346/1355/1338 +f 613/604/604 1358/1367/1350 614/605/605 +f 1344/1368/1351 1360/1369/1352 1362/1370/1353 +f 1360/1369/1352 1363/1371/1354 1361/1372/1355 +f 1361/1372/1355 1364/1373/1356 1366/1374/1357 +f 1362/1370/1353 1361/1372/1355 1367/1375/1358 +f 1300/1310/1293 1319/1329/1312 1301/1311/1294 +f 1319/1329/1312 1318/1328/1311 1368/1376/1359 +f 1368/1376/1359 1369/1377/1360 1371/1378/1361 +f 1301/1311/1294 1368/1376/1359 872/864/863 +f 872/864/863 1371/1378/1361 873/866/865 +f 1371/1378/1361 1370/1379/1362 1372/1380/1363 +f 1372/1380/1363 1373/1381/1364 1375/1382/1365 +f 873/866/865 1372/1380/1363 874/870/869 +f 1318/1328/1311 1345/1354/1337 1369/1377/1360 +f 1345/1354/1337 1344/1368/1351 1376/1383/1366 +f 1376/1383/1366 1362/1370/1353 1377/1384/1367 +f 1369/1377/1360 1376/1383/1366 1370/1379/1362 +f 1370/1379/1362 1377/1384/1367 1373/1381/1364 +f 1377/1384/1367 1367/1375/1358 1378/1385/1368 +f 1378/1385/1368 1379/1386/1369 1380/1387/1370 +f 1373/1381/1364 1378/1385/1368 1374/1388/1371 +f 1367/1375/1358 1366/1374/1357 1379/1386/1369 +f 1366/1374/1357 1365/1389/1372 1381/1390/1373 +f 1381/1390/1373 1382/1391/1374 1349/1357/1340 +f 1379/1386/1369 1381/1390/1373 1354/1362/1345 +f 640/632/632 639/631/631 1383/1392/1375 +f 639/631/631 614/605/605 1359/1393/1376 +f 1383/1392/1375 1359/1393/1376 1346/1355/1338 +f 1384/1394/1377 1383/1392/1375 1382/1391/1374 +f 1363/1371/1354 1385/1395/1378 1364/1373/1356 +f 1385/1395/1378 644/635/635 1386/1396/1379 +f 1386/1396/1379 642/633/633 1384/1394/1377 +f 1364/1373/1356 1386/1396/1379 1365/1389/1372 +f 1344/1368/1351 1343/1353/1336 1387/1397/1380 +f 1343/1353/1336 1281/1289/1272 1279/1288/1271 +f 1387/1397/1380 1279/1288/1271 1275/1283/1266 +f 1360/1369/1352 1387/1397/1380 1388/1398/1381 +f 1275/1283/1266 1273/1282/1265 1388/1398/1381 +f 1273/1282/1265 526/642/642 1389/1399/1382 +f 1389/1399/1382 648/640/640 1385/1395/1378 +f 1388/1398/1381 1389/1399/1382 1363/1371/1354 +f 652/648/648 651/644/644 1391/1400/1383 +f 651/644/644 528/519/519 1390/1401/1384 +f 1390/1401/1384 1278/1287/1270 1286/1294/1277 +f 1391/1400/1383 1390/1401/1384 1286/1294/1277 +f 657/668/668 656/650/650 1392/1402/1385 +f 656/650/650 652/648/648 1391/1400/1383 +f 1392/1402/1385 1391/1400/1383 1285/1293/1276 +f 1393/1403/1386 1392/1402/1385 1394/1404/1387 +f 1395/1405/1388 1394/1404/1387 1396/1406/1389 +f 1394/1404/1387 1285/1293/1276 1288/1297/1280 +f 1396/1406/1389 1288/1297/1280 1398/1407/1390 +f 1397/1408/1391 1396/1406/1389 1399/1409/1392 +f 1399/1409/1392 1400/1410/1393 1401/1411/1394 +f 1400/1410/1393 1087/1093/1079 1090/1096/1082 +f 1401/1411/1394 1090/1096/1082 1092/1412/1395 +f 1402/1413/1396 1401/1411/1394 1404/1414/1397 +f 1115/1298/1281 1114/1118/1104 1405/1415/1398 +f 1114/1118/1104 1093/1098/1084 1096/1101/1087 +f 1405/1415/1398 1096/1101/1087 1087/1093/1079 +f 1398/1407/1390 1405/1415/1398 1400/1410/1393 +f 1395/1405/1388 1397/1408/1391 1407/1416/1399 +f 1397/1408/1391 1399/1409/1392 1402/1413/1396 +f 1406/1417/1400 1402/1413/1396 1408/1418/1401 +f 1407/1416/1399 1406/1417/1400 1409/1419/1402 +f 657/668/668 1393/1403/1386 676/1420/1403 +f 1393/1403/1386 1395/1405/1388 1410/1421/1404 +f 1410/1421/1404 1407/1416/1399 1411/1422/1405 +f 676/1420/1403 1410/1421/1404 677/670/670 +f 795/923/922 922/912/911 1412/1423/1406 +f 922/912/911 921/910/909 1413/1424/1407 +f 1412/1423/1406 1413/1424/1407 1414/1425/1408 +f 796/789/789 1412/1423/1406 1415/1426/1409 +f 818/811/811 1416/1427/1410 1417/1428/1411 +f 1416/1427/1410 1418/1429/1412 1419/1430/1413 +f 1417/1428/1411 1419/1430/1413 834/828/827 +f 822/814/814 1417/1428/1411 835/829/828 +f 1418/1429/1412 1420/1431/1414 1421/1432/1415 +f 1420/1431/1414 1422/1433/1416 1423/1434/1417 +f 1421/1432/1415 1423/1434/1417 829/823/822 +f 1419/1430/1413 1421/1432/1415 832/825/824 +f 789/783/783 792/785/785 1424/1435/1418 +f 792/785/785 797/790/790 1425/1436/1419 +f 1424/1435/1418 1425/1436/1419 1418/1429/1412 +f 817/810/810 1424/1435/1418 1416/1427/1410 +f 797/790/790 1415/1426/1409 1426/1437/1420 +f 1415/1426/1409 1414/1425/1408 1427/1438/1421 +f 1426/1437/1420 1427/1438/1421 1422/1433/1416 +f 1425/1436/1419 1426/1437/1420 1420/1431/1414 +f 1428/1439/1422 1429/1440/1423 1430/1441/1424 +f 1429/1440/1423 1432/1442/1425 1433/1443/1426 +f 1430/1441/1424 1433/1443/1426 1434/1444/1427 +f 1431/1445/1428 1430/1441/1424 1435/1446/1429 +f 1016/1022/1008 1437/1447/1430 1017/1024/1010 +f 1437/1447/1430 1439/1448/1431 1440/1449/1432 +f 1438/1450/1433 1440/1449/1432 1442/1451/1434 +f 1017/1024/1010 1438/1450/1433 891/884/883 +f 891/884/883 1442/1451/1434 1443/1452/1435 +f 1442/1451/1434 1441/1453/1436 1444/1454/1437 +f 1443/1452/1435 1444/1454/1437 881/874/873 +f 892/885/884 1443/1452/1435 890/883/882 +f 1441/1453/1436 1445/1455/1438 1446/1456/1439 +f 1445/1455/1438 1447/1457/1440 1448/1458/1441 +f 1446/1456/1439 1448/1458/1441 860/852/851 +f 1444/1454/1437 1446/1456/1439 882/875/874 +f 1439/1448/1431 1449/1459/1442 1450/1460/1443 +f 1449/1459/1442 1436/1461/1444 1451/1462/1445 +f 1450/1460/1443 1451/1462/1445 1447/1457/1440 +f 1440/1449/1432 1450/1460/1443 1445/1455/1438 +f 1452/1463/1446 1453/1464/1447 1454/1465/1448 +f 1453/1464/1447 784/778/778 781/776/776 +f 1454/1465/1448 781/776/776 780/775/775 +f 1455/1466/1449 1454/1465/1448 856/848/847 +f 786/1142/1128 785/780/780 1456/1467/1450 +f 785/780/780 784/778/778 1453/1464/1447 +f 1456/1467/1450 1453/1464/1447 1452/1463/1446 +f 1223/1226/1212 1456/1467/1450 1457/1468/1451 +f 1125/1127/1113 1139/1140/1126 1458/1469/1452 +f 1139/1140/1126 1138/1227/1213 1458/1469/1452 +f 1458/1469/1452 1457/1468/1451 1460/1470/1453 +f 1459/1471/1454 1458/1469/1452 1434/1444/1427 +f 1452/1463/1446 1455/1466/1449 1462/1472/1455 +f 1455/1466/1449 855/847/846 1461/1473/1456 +f 1461/1473/1456 861/853/852 1448/1458/1441 +f 1462/1472/1455 1461/1473/1456 1447/1457/1440 +f 1447/1457/1440 1451/1462/1445 1462/1472/1455 +f 1451/1462/1445 1436/1461/1444 1463/1474/1457 +f 1463/1474/1457 1435/1446/1429 1460/1470/1453 +f 1462/1472/1455 1463/1474/1457 1452/1463/1446 +f 1003/1006/993 1464/1475/1458 1465/1476/1459 +f 1464/1475/1458 1466/1477/1460 1467/1478/1461 +f 1465/1476/1459 1467/1478/1461 1016/1022/1008 +f 1007/1012/998 1465/1476/1459 1008/1014/1000 +f 1466/1477/1460 1468/1479/1462 1469/1480/1463 +f 1468/1479/1462 1470/1481/1464 1471/1482/1465 +f 1469/1480/1463 1471/1482/1465 1439/1448/1431 +f 1467/1478/1461 1469/1480/1463 1437/1447/1430 +f 242/1004/234 741/1483/735 1472/1484/1466 +f 741/1483/735 740/1485/734 1473/1486/1467 +f 1472/1484/1466 1473/1486/1467 1466/1477/1460 +f 1002/1005/992 1472/1484/1466 1464/1475/1458 +f 747/1487/742 746/1488/740 1475/1489/1468 +f 746/1488/740 745/1490/739 1474/1491/1469 +f 1474/1491/1469 1476/1492/1470 1428/1439/1422 +f 1475/1489/1468 1474/1491/1469 1477/1493/1471 +f 740/1485/734 750/1494/745 1478/1495/1472 +f 750/1494/745 747/1487/742 1475/1489/1468 +f 1478/1495/1472 1475/1489/1468 1470/1481/1464 +f 1473/1486/1467 1478/1495/1472 1468/1479/1462 +f 1470/1481/1464 1477/1493/1471 1479/1496/1473 +f 1477/1493/1471 1428/1439/1422 1431/1445/1428 +f 1479/1496/1473 1431/1445/1428 1436/1461/1444 +f 1471/1482/1465 1479/1496/1473 1449/1459/1442 +f 1271/1280/1263 1270/1279/1262 1481/1497/1474 +f 1270/1279/1262 1129/1130/1116 1480/1498/1475 +f 1480/1498/1475 1126/1128/1114 1482/1499/1476 +f 1481/1497/1474 1480/1498/1475 1483/1500/1477 +f 761/1501/756 760/1502/754 1485/1503/1478 +f 760/1502/754 759/1504/753 1484/1505/1479 +f 1484/1505/1479 1486/1506/1480 1483/1500/1477 +f 1485/1503/1478 1484/1505/1479 1487/1507/1481 +f 1434/1444/1427 1433/1443/1426 1459/1471/1454 +f 1433/1443/1426 1432/1442/1425 1488/1508/1482 +f 1488/1508/1482 1487/1507/1481 1482/1499/1476 +f 1459/1471/1454 1488/1508/1482 1125/1127/1113 +f 1265/1273/1257 1272/1281/1264 1489/1509/1483 +f 1272/1281/1264 1271/1280/1263 1490/1510/1484 +f 1489/1509/1483 1490/1510/1484 767/1511/760 +f 1266/1275/1258 1489/1509/1483 513/1512/505 +f 764/1513/758 1490/1510/1484 769/1514/763 +f 1490/1510/1484 1271/1280/1263 1491/1515/1485 +f 1491/1515/1485 1481/1497/1474 1486/1506/1480 +f 769/1514/763 1491/1515/1485 1486/1506/1480 +f 745/1490/739 771/1516/766 1476/1492/1470 +f 771/1516/766 761/1501/756 1492/1517/1486 +f 1492/1517/1486 1485/1503/1478 1432/1442/1425 +f 1476/1492/1470 1492/1517/1486 1429/1440/1423 +f 909/900/899 1493/1518/1487 925/915/914 +f 1493/1518/1487 1495/1519/1488 1494/1520/1489 +f 1494/1520/1489 1496/1521/1490 1497/1522/1491 +f 925/915/914 1494/1520/1489 927/917/916 +f 906/1523/1492 1499/1524/1493 1500/1525/1494 +f 1499/1524/1493 1495/1519/1488 1493/1518/1487 +f 1500/1525/1494 1493/1518/1487 909/900/899 +f 907/898/897 1500/1525/1494 912/902/901 +f 1501/1526/1495 1502/1527/1496 1504/1528/1497 +f 1502/1527/1496 1505/1529/1498 1506/1530/1499 +f 1504/1528/1497 1503/1531/1500 1507/1532/1501 +f 1508/1533/1502 1509/1534/1503 1510/1535/1504 +f 1509/1534/1503 1512/1536/1505 1513/1537/1506 +f 1510/1535/1504 1513/1537/1506 1514/1538/1507 +f 1511/1539/1508 1510/1535/1504 1515/1540/1509 +f 1517/1541/1510 1518/1542/1511 1519/1543/1512 +f 1518/1542/1511 1508/1533/1502 1511/1539/1508 +f 1519/1543/1512 1511/1539/1508 1516/1544/1513 +f 1520/1545/1514 1519/1543/1512 1521/1546/1515 +f 1523/1547/1516 1524/1548/1517 1525/1549/1518 +f 1524/1548/1517 1505/1529/1498 1527/1550/1519 +f 1525/1549/1518 1527/1550/1519 1508/1533/1502 +f 1526/1551/1520 1525/1549/1518 1518/1542/1511 +f 1505/1529/1498 1502/1527/1496 1528/1552/1521 +f 1502/1527/1496 1501/1526/1495 1528/1552/1521 +f 1528/1552/1521 1529/1553/1522 1512/1536/1505 +f 1527/1550/1519 1528/1552/1521 1509/1534/1503 +f 1514/1538/1507 1530/1554/1523 1532/1555/1524 +f 1530/1554/1523 1533/1556/1525 1531/1557/1526 +f 1531/1557/1526 1534/1558/1527 1536/1559/1528 +f 1532/1555/1524 1531/1557/1526 1537/1560/1529 +f 1514/1538/1507 1513/1537/1506 1538/1561/1530 +f 1513/1537/1506 1512/1536/1505 1539/1562/1531 +f 1538/1561/1530 1539/1562/1531 1540/1563/1532 +f 1530/1554/1523 1538/1561/1530 1541/1564/1533 +f 1512/1536/1505 1529/1553/1522 1542/1565/1534 +f 1529/1553/1522 1501/1526/1495 1543/1566/1535 +f 1542/1565/1534 1543/1566/1535 1544/1567/1536 +f 1539/1562/1531 1542/1565/1534 1545/1568/1537 +f 1501/1526/1495 1504/1528/1497 1546/1569/1538 +f 1504/1528/1497 1507/1532/1501 1547/1570/1539 +f 1546/1569/1538 1547/1570/1539 1549/1571/1540 +f 1543/1566/1535 1546/1569/1538 1549/1571/1540 +f 1548/1572/1541 1547/1570/1539 1550/1573/1542 +f 1547/1570/1539 1507/1532/1501 1506/1530/1499 +f 1550/1573/1542 1506/1530/1499 1505/1529/1498 +f 1551/1574/1543 1550/1573/1542 1524/1548/1517 +f 1552/1575/1544 1553/1576/1545 1554/1577/1546 +f 1553/1576/1545 1556/1578/1547 1557/1579/1548 +f 1554/1577/1546 1557/1579/1548 1558/1580/1549 +f 1555/1581/1550 1554/1577/1546 1559/1582/1551 +f 1561/1583/1552 1562/1584/1553 1564/1585/1554 +f 1562/1584/1553 1565/1586/1555 1566/1587/1556 +f 1563/1588/1557 1566/1587/1556 1568/1589/1558 +f 1564/1585/1554 1563/1588/1557 1569/1590/1559 +f 1570/1591/1560 1571/1592/1561 1573/1593/1562 +f 1571/1592/1561 1561/1583/1552 1564/1585/1554 +f 1572/1594/1563 1564/1585/1554 1574/1595/1564 +f 1573/1593/1562 1572/1594/1563 1574/1595/1564 +f 1575/1596/1565 1576/1597/1566 1578/1598/1567 +f 1576/1597/1566 1579/1599/1568 1577/1600/1569 +f 1577/1600/1569 1580/1601/1570 1567/1602/1571 +f 1578/1598/1567 1577/1600/1569 1565/1586/1555 +f 1581/1603/1572 1582/1604/1573 1584/1605/1574 +f 1582/1604/1573 1585/1606/1575 1583/1607/1576 +f 1583/1607/1576 1586/1608/1577 1588/1609/1578 +f 1584/1605/1574 1583/1607/1576 1589/1610/1579 +f 1587/1611/1580 1590/1612/1581 1591/1613/1582 +f 1590/1612/1581 1592/1614/1583 1591/1613/1582 +f 1591/1613/1582 1593/1615/1584 1595/1616/1585 +f 1588/1609/1578 1591/1613/1582 1589/1610/1579 +f 1596/1617/1586 1597/1618/1587 1598/1619/1588 +f 1597/1618/1587 1579/1599/1568 1598/1619/1588 +f 1598/1619/1588 1576/1597/1566 1600/1620/1589 +f 1599/1621/1590 1598/1619/1588 1601/1622/1591 +f 1601/1622/1591 1602/1623/1592 1599/1621/1590 +f 1602/1623/1592 1604/1624/1593 1603/1625/1594 +f 1603/1625/1594 1605/1626/1595 1606/1627/1596 +f 1599/1621/1590 1603/1625/1594 1607/1628/1597 +f 1537/1560/1529 1536/1559/1528 1609/1629/1598 +f 1536/1559/1528 1535/1630/1599 1608/1631/1600 +f 1608/1631/1600 1610/1632/1601 1612/1633/1602 +f 1609/1629/1598 1608/1631/1600 1613/1634/1603 +f 1581/1603/1572 1614/1635/1604 1615/1636/1605 +f 1614/1635/1604 1613/1634/1603 1612/1633/1602 +f 1615/1636/1605 1612/1633/1602 1611/1637/1606 +f 1582/1604/1573 1615/1636/1605 1616/1638/1607 +f 1604/1624/1593 1617/1639/1608 1605/1626/1595 +f 1617/1639/1608 1619/1640/1609 1618/1641/1610 +f 1618/1641/1610 1620/1642/1611 1622/1643/1612 +f 1605/1626/1595 1618/1641/1610 1606/1627/1596 +f 1619/1640/1609 1623/1644/1613 1620/1642/1611 +f 1623/1644/1613 1522/1645/1614 1624/1646/1615 +f 1624/1646/1615 1521/1546/1515 1625/1647/1616 +f 1620/1642/1611 1624/1646/1615 1621/1648/1617 +f 1621/1648/1617 1625/1647/1616 1627/1649/1618 +f 1625/1647/1616 1516/1544/1513 1626/1650/1619 +f 1626/1650/1619 1515/1540/1509 1532/1555/1524 +f 1627/1649/1618 1626/1650/1619 1537/1560/1529 +f 1606/1627/1596 1622/1643/1612 1629/1651/1620 +f 1622/1643/1612 1621/1648/1617 1628/1652/1621 +f 1628/1652/1621 1627/1649/1618 1609/1629/1598 +f 1629/1651/1620 1628/1652/1621 1609/1629/1598 +f 1606/1627/1596 1629/1651/1620 1607/1628/1597 +f 1629/1651/1620 1613/1634/1603 1630/1653/1622 +f 1630/1653/1622 1614/1635/1604 1631/1654/1623 +f 1607/1628/1597 1630/1653/1622 1596/1617/1586 +f 1589/1610/1579 1632/1655/1624 1584/1605/1574 +f 1632/1655/1624 1579/1599/1568 1633/1656/1625 +f 1633/1656/1625 1597/1618/1587 1631/1654/1623 +f 1584/1605/1574 1633/1656/1625 1581/1603/1572 +f 1567/1602/1571 1580/1601/1570 1635/1657/1626 +f 1580/1601/1570 1579/1599/1568 1632/1655/1624 +f 1635/1657/1626 1634/1658/1627 1589/1610/1579 +f 1569/1590/1559 1568/1589/1558 1637/1659/1628 +f 1568/1589/1558 1567/1602/1571 1636/1660/1629 +f 1636/1660/1629 1635/1657/1626 1595/1616/1585 +f 1637/1659/1628 1636/1660/1629 1594/1661/1630 +f 1558/1580/1549 1557/1579/1548 1639/1662/1631 +f 1557/1579/1548 1556/1578/1547 1638/1663/1632 +f 1638/1663/1632 1574/1595/1564 1569/1590/1559 +f 1639/1662/1631 1638/1663/1632 1637/1659/1628 +f 1560/1664/1633 1559/1582/1551 1640/1665/1634 +f 1559/1582/1551 1558/1580/1549 1642/1666/1635 +f 1640/1665/1634 1642/1666/1635 1643/1667/1636 +f 1641/1668/1637 1640/1665/1634 1644/1669/1638 +f 1643/1667/1636 1642/1666/1635 1647/1670/1639 +f 1642/1666/1635 1558/1580/1549 1646/1671/1640 +f 1646/1671/1640 1639/1662/1631 1594/1661/1630 +f 1647/1670/1639 1646/1671/1640 1593/1615/1584 +f 1552/1575/1544 1648/1672/1641 1553/1576/1545 +f 1648/1672/1641 1650/1673/1642 1651/1674/1643 +f 1649/1675/1644 1651/1674/1643 1573/1593/1562 +f 1553/1576/1545 1649/1675/1644 1556/1578/1547 +f 1652/1676/1645 1653/1677/1646 1654/1678/1647 +f 1653/1677/1646 1656/1679/1648 1654/1678/1647 +f 1655/1680/1649 1654/1678/1647 1657/1681/1650 +f 1659/1682/1651 1660/1683/1652 1662/1684/1653 +f 1660/1683/1652 1663/1685/1654 1661/1686/1655 +f 1661/1686/1655 1664/1687/1656 1666/1688/1657 +f 1662/1684/1653 1661/1686/1655 1667/1689/1658 +f 1667/1689/1658 1666/1688/1657 1669/1690/1659 +f 1666/1688/1657 1665/1691/1660 1668/1692/1661 +f 1668/1692/1661 1670/1693/1662 1672/1694/1663 +f 1669/1690/1659 1668/1692/1661 1673/1695/1664 +f 1665/1691/1660 1674/1696/1665 1670/1693/1662 +f 1674/1696/1665 1652/1676/1645 1675/1697/1666 +f 1675/1697/1666 1676/1698/1667 1678/1699/1668 +f 1670/1693/1662 1675/1697/1666 1671/1700/1669 +f 1663/1685/1654 1679/1701/1670 1664/1687/1656 +f 1679/1701/1670 1656/1679/1648 1653/1677/1646 +f 1680/1702/1671 1653/1677/1646 1674/1696/1665 +f 1664/1687/1656 1680/1702/1671 1665/1691/1660 +f 1681/1703/1672 1682/1704/1673 1683/1705/1674 +f 1682/1704/1673 1685/1706/1675 1686/1707/1676 +f 1683/1705/1674 1686/1707/1676 1659/1682/1651 +f 1684/1708/1677 1683/1705/1674 1687/1709/1678 +f 1689/1710/1679 1690/1711/1680 1692/1712/1681 +f 1690/1711/1680 1663/1685/1654 1691/1713/1682 +f 1691/1713/1682 1660/1683/1652 1686/1707/1676 +f 1692/1712/1681 1691/1713/1682 1685/1706/1675 +f 1693/1714/1683 1694/1715/1684 1696/1716/1685 +f 1694/1715/1684 1656/1679/1648 1695/1717/1686 +f 1695/1717/1686 1679/1701/1670 1690/1711/1680 +f 1696/1716/1685 1695/1717/1686 1689/1710/1679 +f 1697/1718/1687 1698/1719/1688 1699/1720/1689 +f 1698/1719/1688 1658/1721/1690 1699/1720/1689 +f 1699/1720/1689 1657/1681/1650 1694/1715/1684 +f 1700/1722/1691 1699/1720/1689 1693/1714/1683 +f 1652/1676/1645 1655/1680/1649 1676/1698/1667 +f 1655/1680/1649 1658/1721/1690 1701/1723/1692 +f 1701/1723/1692 1698/1719/1688 1702/1724/1693 +f 1676/1698/1667 1701/1723/1692 1677/1725/1694 +f 1703/1726/1695 1704/1727/1696 1706/1728/1697 +f 1704/1727/1696 1707/1729/1698 1708/1730/1699 +f 1705/1731/1700 1708/1730/1699 1552/1575/1544 +f 1706/1728/1697 1705/1731/1700 1555/1581/1550 +f 1709/1732/1701 1710/1733/1702 1711/1734/1703 +f 1710/1733/1702 1713/1735/1704 1714/1736/1705 +f 1711/1734/1703 1714/1736/1705 1715/1737/1706 +f 1712/1738/1707 1711/1734/1703 1716/1739/1708 +f 1717/1740/1709 1716/1739/1708 1718/1741/1710 +f 1716/1739/1708 1715/1737/1706 1720/1742/1711 +f 1718/1741/1710 1720/1742/1711 1721/1743/1712 +f 1719/1744/1713 1718/1741/1710 1722/1745/1714 +f 1709/1732/1701 1723/1746/1715 1710/1733/1702 +f 1723/1746/1715 1725/1747/1716 1724/1748/1717 +f 1724/1748/1717 1726/1749/1718 1728/1750/1719 +f 1710/1733/1702 1724/1748/1717 1728/1750/1719 +f 1729/1751/1720 1730/1752/1721 1731/1753/1722 +f 1730/1752/1721 1733/1754/1723 1734/1755/1724 +f 1731/1753/1722 1734/1755/1724 1736/1756/1725 +f 1732/1757/1726 1731/1753/1722 1737/1758/1727 +f 1738/1759/1728 1739/1760/1729 1740/1761/1730 +f 1739/1760/1729 1742/1762/1731 1740/1761/1730 +f 1740/1761/1730 1743/1763/1732 1732/1757/1726 +f 1741/1764/1733 1740/1761/1730 1737/1758/1727 +f 1727/1765/1734 1726/1749/1718 1744/1766/1735 +f 1726/1749/1718 1725/1747/1716 1746/1767/1736 +f 1744/1766/1735 1746/1767/1736 1747/1768/1737 +f 1745/1769/1738 1744/1766/1735 1748/1770/1739 +f 1750/1771/1740 1751/1772/1741 1752/1773/1742 +f 1751/1772/1741 1754/1774/1743 1755/1775/1744 +f 1752/1773/1742 1755/1775/1744 1749/1776/1745 +f 1753/1777/1746 1752/1773/1742 1748/1770/1739 +f 1756/1778/1747 1757/1779/1748 1758/1780/1749 +f 1757/1779/1748 1681/1703/1672 1684/1708/1677 +f 1758/1780/1749 1684/1708/1677 1688/1781/1750 +f 1759/1782/1751 1758/1780/1749 1760/1783/1752 +f 1756/1778/1747 1759/1782/1751 1763/1784/1753 +f 1759/1782/1751 1761/1785/1754 1762/1786/1755 +f 1762/1786/1755 1764/1787/1756 1734/1755/1724 +f 1763/1784/1753 1762/1786/1755 1733/1754/1723 +f 1765/1788/1757 1766/1789/1758 1767/1790/1759 +f 1766/1789/1758 1769/1791/1760 1770/1792/1761 +f 1767/1790/1759 1770/1792/1761 1754/1774/1743 +f 1768/1793/1762 1767/1790/1759 1751/1772/1741 +f 1667/1689/1658 1669/1690/1659 1771/1794/1763 +f 1669/1690/1659 1673/1695/1664 1773/1795/1764 +f 1771/1794/1763 1773/1795/1764 1769/1791/1760 +f 1772/1796/1765 1771/1794/1763 1766/1789/1758 +f 1659/1682/1651 1662/1684/1653 1774/1797/1766 +f 1662/1684/1653 1667/1689/1658 1772/1796/1765 +f 1774/1797/1766 1772/1796/1765 1765/1788/1757 +f 1687/1709/1678 1774/1797/1766 1775/1798/1767 +f 1688/1781/1750 1775/1798/1767 1760/1783/1752 +f 1775/1798/1767 1765/1788/1757 1768/1793/1762 +f 1776/1799/1768 1768/1793/1762 1750/1771/1740 +f 1760/1783/1752 1776/1799/1768 1761/1785/1754 +f 1735/1800/1769 1764/1787/1756 1778/1801/1770 +f 1764/1787/1756 1761/1785/1754 1777/1802/1771 +f 1778/1801/1770 1777/1802/1771 1753/1777/1746 +f 1779/1803/1772 1778/1801/1770 1753/1777/1746 +f 1747/1768/1737 1746/1767/1736 1780/1804/1773 +f 1746/1767/1736 1725/1747/1716 1781/1805/1774 +f 1780/1804/1773 1781/1805/1774 1737/1758/1727 +f 1779/1803/1772 1780/1804/1773 1736/1756/1725 +f 1725/1747/1716 1723/1746/1715 1782/1806/1775 +f 1723/1746/1715 1709/1732/1701 1783/1807/1776 +f 1781/1805/1774 1782/1806/1775 1783/1807/1776 +f 1737/1758/1727 1783/1807/1776 1784/1808/1777 +f 1783/1807/1776 1709/1732/1701 1712/1738/1707 +f 1784/1808/1777 1712/1738/1707 1717/1740/1709 +f 1741/1764/1733 1784/1808/1777 1785/1809/1778 +f 1717/1740/1709 1719/1744/1713 1785/1809/1778 +f 1719/1744/1713 1707/1729/1698 1704/1727/1696 +f 1786/1810/1779 1704/1727/1696 1703/1726/1695 +f 1785/1809/1778 1786/1810/1779 1738/1759/1728 +f 1788/1811/1780 1789/1812/1781 1791/1813/1782 +f 1789/1812/1781 1703/1726/1695 1790/1814/1783 +f 1790/1814/1783 1706/1728/1697 1641/1668/1637 +f 1791/1813/1782 1790/1814/1783 1645/1815/1784 +f 1738/1759/1728 1787/1816/1785 1739/1760/1729 +f 1787/1816/1785 1703/1726/1695 1789/1812/1781 +f 1792/1817/1786 1789/1812/1781 1788/1811/1780 +f 1739/1760/1729 1792/1817/1786 1742/1762/1731 +f 1721/1743/1712 1794/1818/1787 1795/1819/1788 +f 1794/1818/1787 1650/1673/1642 1648/1672/1641 +f 1795/1819/1788 1648/1672/1641 1552/1575/1544 +f 1722/1745/1714 1795/1819/1788 1708/1730/1699 +f 1796/1820/1789 1797/1821/1790 1799/1822/1791 +f 1797/1821/1790 1800/1823/1792 1798/1824/1793 +f 1798/1824/1793 1801/1825/1794 1803/1826/1795 +f 1799/1822/1791 1798/1824/1793 1804/1827/1796 +f 1805/1828/1797 1806/1829/1798 1807/1830/1799 +f 1806/1829/1798 1809/1831/1800 1810/1832/1801 +f 1807/1830/1799 1810/1832/1801 1811/1833/1802 +f 1808/1834/1803 1807/1830/1799 1812/1835/1804 +f 1814/1836/1805 1815/1837/1806 1817/1838/1807 +f 1815/1837/1806 1818/1839/1808 1819/1840/1809 +f 1816/1841/1810 1819/1840/1809 630/620/620 +f 1817/1838/1807 1816/1841/1810 102/100/100 +f 1804/1827/1796 1803/1826/1795 1821/1842/1811 +f 1803/1826/1795 1802/1843/1812 1820/1844/1813 +f 1820/1844/1813 1822/1845/1814 1824/1846/1815 +f 1821/1842/1811 1820/1844/1813 1825/1847/1816 +f 1818/1839/1808 1815/1837/1806 1826/1848/1817 +f 1815/1837/1806 1814/1836/1805 1826/1848/1817 +f 1826/1848/1817 1828/1849/1818 1830/1850/1819 +f 1827/1851/1820 1826/1848/1817 1830/1850/1819 +f 1829/1852/1821 1831/1853/1822 1832/1854/1823 +f 1831/1853/1822 1833/1855/1824 1834/1856/1825 +f 1832/1854/1823 1834/1856/1825 1835/1857/1826 +f 1830/1850/1819 1832/1854/1823 1836/1858/1827 +f 1835/1857/1826 1837/1859/1828 1838/1860/1829 +f 1837/1859/1828 1839/1861/1830 1840/1862/1831 +f 1838/1860/1829 1840/1862/1831 1804/1827/1796 +f 1836/1858/1827 1838/1860/1829 1821/1842/1811 +f 1823/1863/1832 1841/1864/1833 1842/1865/1834 +f 1841/1864/1833 1843/1866/1835 1844/1867/1836 +f 1842/1865/1834 1844/1867/1836 1818/1839/1808 +f 1824/1846/1815 1842/1865/1834 1827/1851/1820 +f 1818/1839/1808 1844/1867/1836 1819/1840/1809 +f 1844/1867/1836 1843/1866/1835 1845/1868/1837 +f 1845/1868/1837 1846/1869/1838 635/627/627 +f 1819/1840/1809 1845/1868/1837 627/617/617 +f 1847/1870/1839 1848/1871/1840 1850/1872/1841 +f 1848/1871/1840 1851/1873/1842 1849/1874/1843 +f 1849/1874/1843 1852/1875/1844 1854/1876/1845 +f 1850/1872/1841 1849/1874/1843 1855/1877/1846 +f 1855/1877/1846 1854/1876/1845 1856/1878/1847 +f 1854/1876/1845 1853/1879/1848 1856/1878/1847 +f 1856/1878/1847 1858/1880/1849 1810/1832/1801 +f 1857/1881/1850 1856/1878/1847 1809/1831/1800 +f 1847/1870/1839 1859/1882/1851 1860/1883/1852 +f 1859/1882/1851 1861/1884/1853 1860/1883/1852 +f 1860/1883/1852 1862/1885/1854 1863/1886/1855 +f 1848/1871/1840 1860/1883/1852 1851/1873/1842 +f 1813/1887/1856 1865/1888/1857 1867/1889/1858 +f 1865/1888/1857 1868/1890/1859 1866/1891/1860 +f 1866/1891/1860 1869/1892/1861 1797/1821/1790 +f 1797/1821/1790 1796/1820/1789 1866/1891/1860 +f 1811/1833/1802 1870/1893/1862 1812/1835/1804 +f 1870/1893/1862 1872/1894/1863 1871/1895/1864 +f 1871/1895/1864 1873/1896/1865 1865/1888/1857 +f 1812/1835/1804 1871/1895/1864 1813/1887/1856 +f 1874/1897/1866 1875/1898/1867 1876/1899/1868 +f 1875/1898/1867 1878/1900/1869 1879/1901/1870 +f 1876/1899/1868 1879/1901/1870 1880/1902/1871 +f 1877/1903/1872 1876/1899/1868 1881/1904/1873 +f 1874/1897/1866 1883/1905/1874 1884/1906/1875 +f 1883/1905/1874 1885/1907/1876 1886/1908/1877 +f 1884/1906/1875 1886/1908/1877 1887/1909/1878 +f 1875/1898/1867 1884/1906/1875 1888/1910/1879 +f 1878/1900/1869 1889/1911/1880 1890/1912/1881 +f 1889/1911/1880 1891/1913/1882 1892/1914/1883 +f 1890/1912/1881 1892/1914/1883 1893/1915/1884 +f 1879/1901/1870 1890/1912/1881 1894/1916/1885 +f 1878/1900/1869 1888/1910/1879 1889/1911/1880 +f 1888/1910/1879 1887/1909/1878 1896/1917/1886 +f 1895/1918/1887 1896/1917/1886 1897/1919/1888 +f 1889/1911/1880 1895/1918/1887 1891/1913/1882 +f 1802/1843/1812 1899/1920/1889 1822/1845/1814 +f 1899/1920/1889 1901/1921/1890 1900/1922/1891 +f 1900/1922/1891 1902/1923/1892 1904/1924/1893 +f 1822/1845/1814 1900/1922/1891 1823/1863/1832 +f 1800/1823/1792 1905/1925/1894 1801/1825/1794 +f 1905/1925/1894 1907/1926/1895 1906/1927/1896 +f 1906/1927/1896 1908/1928/1897 1899/1920/1889 +f 1801/1825/1794 1906/1927/1896 1802/1843/1812 +f 1891/1913/1882 1898/1929/1898 1909/1930/1899 +f 1898/1929/1898 1897/1919/1888 1911/1931/1900 +f 1909/1930/1899 1911/1931/1900 1903/1932/1901 +f 1910/1933/1902 1909/1930/1899 1902/1923/1892 +f 1907/1926/1895 1912/1934/1903 1913/1935/1904 +f 1912/1934/1903 1893/1915/1884 1892/1914/1883 +f 1913/1935/1904 1892/1914/1883 1891/1913/1882 +f 1908/1928/1897 1913/1935/1904 1901/1921/1890 +f 1868/1890/1859 1914/1936/1905 1869/1892/1861 +f 1914/1936/1905 1916/1937/1906 1915/1938/1907 +f 1915/1938/1907 1917/1939/1908 1905/1925/1894 +f 1869/1892/1861 1915/1938/1907 1800/1823/1792 +f 1872/1894/1863 1918/1940/1909 1873/1896/1865 +f 1918/1940/1909 1920/1941/1910 1919/1942/1911 +f 1919/1942/1911 1921/1943/1912 1914/1936/1905 +f 1873/1896/1865 1919/1942/1911 1868/1890/1859 +f 1920/1941/1910 1922/1944/1913 1921/1943/1912 +f 1922/1944/1913 1924/1945/1914 1923/1946/1915 +f 1923/1946/1915 1925/1947/1916 1926/1948/1917 +f 1921/1943/1912 1923/1946/1915 1916/1937/1906 +f 1851/1873/1842 1864/1949/1918 1929/1950/1919 +f 1864/1949/1918 1863/1886/1855 1930/1951/1920 +f 1928/1952/1921 1930/1951/1920 1932/1953/1922 +f 1929/1950/1919 1928/1952/1921 1932/1953/1922 +f 1853/1879/1848 1934/1954/1923 1858/1880/1849 +f 1934/1954/1923 1936/1955/1924 1935/1956/1925 +f 1935/1956/1925 1937/1957/1926 1870/1893/1862 +f 1858/1880/1849 1935/1956/1925 1811/1833/1802 +f 1853/1879/1848 1852/1875/1844 1938/1958/1927 +f 1852/1875/1844 1851/1873/1842 1929/1950/1919 +f 1938/1958/1927 1929/1950/1919 1933/1959/1928 +f 1934/1954/1923 1938/1958/1927 1939/1960/1929 +f 1872/1894/1863 1937/1957/1926 1940/1961/1930 +f 1937/1957/1926 1936/1955/1924 1941/1962/1931 +f 1940/1961/1930 1941/1962/1931 1942/1963/1932 +f 1918/1940/1909 1940/1961/1930 1943/1964/1933 +f 1936/1955/1924 1939/1960/1929 1944/1965/1934 +f 1939/1960/1929 1933/1959/1928 1944/1965/1934 +f 1944/1965/1934 1945/1966/1935 1946/1967/1936 +f 1941/1962/1931 1944/1965/1934 1947/1968/1937 +f 1933/1959/1928 1932/1953/1922 1945/1966/1935 +f 1932/1953/1922 1931/1969/1938 1948/1970/1939 +f 1948/1970/1939 1949/1971/1940 1951/1972/1941 +f 1945/1966/1935 1948/1970/1939 1946/1967/1936 +f 1946/1967/1936 1951/1972/1941 1953/1973/1942 +f 1951/1972/1941 1950/1974/1943 1952/1975/1944 +f 1952/1975/1944 1954/1976/1945 1956/1977/1946 +f 1953/1973/1942 1952/1975/1944 1957/1978/1947 +f 1942/1963/1932 1947/1968/1937 1958/1979/1948 +f 1947/1968/1937 1946/1967/1936 1953/1973/1942 +f 1958/1979/1948 1953/1973/1942 1960/1980/1949 +f 1959/1981/1950 1958/1979/1948 1961/1982/1951 +f 1920/1941/1910 1943/1964/1933 1962/1983/1952 +f 1943/1964/1933 1942/1963/1932 1959/1981/1950 +f 1962/1983/1952 1959/1981/1950 1961/1982/1951 +f 1922/1944/1913 1962/1983/1952 1963/1984/1953 +f 1961/1982/1951 1964/1985/1954 1965/1986/1955 +f 1964/1985/1954 1966/1987/1956 1967/1988/1957 +f 1965/1986/1955 1967/1988/1957 1968/1989/1958 +f 1963/1984/1953 1965/1986/1955 1969/1990/1959 +f 1926/1948/1917 1925/1947/1916 1971/1991/1960 +f 1925/1947/1916 1924/1945/1914 1970/1992/1961 +f 1970/1992/1961 1969/1990/1959 1972/1993/1962 +f 1971/1991/1960 1970/1992/1961 1973/1994/1963 +f 1916/1937/1906 1927/1995/1964 1917/1939/1908 +f 1927/1995/1964 1926/1948/1917 1975/1996/1965 +f 1974/1997/1966 1975/1996/1965 1893/1915/1884 +f 1917/1939/1908 1974/1997/1966 1912/1934/1903 +f 1893/1915/1884 1975/1996/1965 1894/1916/1885 +f 1975/1996/1965 1926/1948/1917 1976/1998/1967 +f 1976/1998/1967 1971/1991/1960 1977/1999/1968 +f 1894/1916/1885 1976/1998/1967 1880/1902/1871 +f 1880/1902/1871 1977/1999/1968 1881/1904/1873 +f 1977/1999/1968 1973/1994/1963 1978/2000/1969 +f 1978/2000/1969 1979/2001/1970 1981/2002/1971 +f 1881/1904/1873 1978/2000/1969 1882/2003/1972 +f 1973/1994/1963 1972/1993/1962 1979/2001/1970 +f 1972/1993/1962 1968/1989/1958 1982/2004/1973 +f 1982/2004/1973 1983/2005/1974 1985/2006/1975 +f 1979/2001/1970 1982/2004/1973 1980/2007/1976 +f 1966/1987/1956 1986/2008/1977 1987/2009/1978 +f 1986/2008/1977 1988/2010/1979 1989/2011/1980 +f 1987/2009/1978 1989/2011/1980 1984/2012/1981 +f 1967/1988/1957 1987/2009/1978 1983/2005/1974 +f 1990/2013/1982 1991/2014/1983 1993/2015/1984 +f 1991/2014/1983 1966/1987/1956 1992/2016/1985 +f 1992/2016/1985 1964/1985/1954 1960/1980/1949 +f 1993/2015/1984 1992/2016/1985 1957/1978/1947 +f 1957/1978/1947 1956/1977/1946 1993/2015/1984 +f 1956/1977/1946 1955/2017/1986 1994/2018/1987 +f 1994/2018/1987 1995/2019/1988 1997/2020/1989 +f 1993/2015/1984 1994/2018/1987 1990/2013/1982 +f 1996/2021/1990 1998/2022/1991 1999/2023/1992 +f 1998/2022/1991 2000/2024/1993 2001/2025/1994 +f 1999/2023/1992 2001/2025/1994 2002/2026/1995 +f 1997/2020/1989 1999/2023/1992 2003/2027/1996 +f 1990/2013/1982 2003/2027/1996 2004/2028/1997 +f 2003/2027/1996 2002/2026/1995 2004/2028/1997 +f 2004/2028/1997 2005/2029/1998 1986/2008/1977 +f 1991/2014/1983 2004/2028/1997 1986/2008/1977 +f 71/2030/1999 2006/2031/2000 2007/2032/2001 +f 2006/2031/2000 2008/2033/2002 2009/2034/2003 +f 2007/2032/2001 2009/2034/2003 2010/2035/2004 +f 72/69/69 2007/2032/2001 2011/2036/2005 +f 73/70/70 2011/2036/2005 2012/2037/2006 +f 2011/2036/2005 2010/2035/2004 2013/2038/2007 +f 2012/2037/2006 2013/2038/2007 1814/1836/1805 +f 104/99/99 2012/2037/2006 1817/1838/1807 +f 2014/2039/2008 2015/2040/2009 2016/2041/2010 +f 2015/2040/2009 2018/2042/2011 2019/2043/2012 +f 2016/2041/2010 2019/2043/2012 1833/1855/1824 +f 2017/2044/2013 2016/2041/2010 1831/1853/1822 +f 1814/1836/1805 2013/2038/2007 1828/1849/1818 +f 2013/2038/2007 2010/2035/2004 2020/2045/2014 +f 2020/2045/2014 2021/2046/2015 2017/2044/2013 +f 1828/1849/1818 2020/2045/2014 1829/1852/1821 +f 2010/2035/2004 2009/2034/2003 2021/2046/2015 +f 2009/2034/2003 2008/2033/2002 2022/2047/2016 +f 2022/2047/2016 2023/2048/2017 2025/2049/2018 +f 2021/2046/2015 2022/2047/2016 2014/2039/2008 +f 1805/1828/1797 1808/1834/1803 2027/2050/2019 +f 1808/1834/1803 1813/1887/1856 2026/2051/2020 +f 1796/1820/1789 2028/2052/2021 1867/1889/1858 +f 2027/2050/2019 2026/2051/2020 2028/2052/2021 +f 2029/2053/2022 2028/2052/2021 2030/2054/2023 +f 2028/2052/2021 1796/1820/1789 2030/2054/2023 +f 2030/2054/2023 1799/1822/1791 1840/1862/1831 +f 2031/2055/2024 2030/2054/2023 1840/1862/1831 +f 2032/2056/2025 2033/2057/2026 2034/2058/2027 +f 2033/2057/2026 1897/1919/1888 1896/1917/1886 +f 2034/2058/2027 1896/1917/1886 1887/1909/1878 +f 2035/2059/2028 2034/2058/2027 2036/2060/2029 +f 1887/1909/1878 1886/1908/1877 2036/2060/2029 +f 1886/1908/1877 1885/1907/1876 2038/2061/2030 +f 2036/2060/2029 2038/2061/2030 2039/2062/2031 +f 2040/2063/2032 2041/2064/2033 2043/2065/2034 +f 2041/2064/2033 610/601/601 609/600/600 +f 2042/2066/2035 609/600/600 596/588/588 +f 2043/2065/2034 2042/2066/2035 2044/2067/2036 +f 2045/2068/2037 2044/2067/2036 2046/2069/2038 +f 2044/2067/2036 596/588/588 599/594/594 +f 2046/2069/2038 599/594/594 604/624/624 +f 2047/2070/2039 2046/2069/2038 1846/1869/1838 +f 1823/1863/1832 1904/1924/1893 1841/1864/1833 +f 1904/1924/1893 1903/1932/1901 2048/2071/2040 +f 2048/2071/2040 2049/2072/2041 2047/2070/2039 +f 1841/1864/1833 2048/2071/2040 1843/1866/1835 +f 1897/1919/1888 2033/2057/2026 2050/2073/2042 +f 2033/2057/2026 2032/2056/2025 2051/2074/2043 +f 2050/2073/2042 2051/2074/2043 2045/2068/2037 +f 1911/1931/1900 2050/2073/2042 2049/2072/2041 +f 2045/2068/2037 2051/2074/2043 2043/2065/2034 +f 2051/2074/2043 2032/2056/2025 2052/2075/2044 +f 2052/2075/2044 2035/2059/2028 2053/2076/2045 +f 2043/2065/2034 2052/2075/2044 2040/2063/2032 +f 2054/2077/2046 2055/2078/2047 2056/2079/2048 +f 2055/2078/2047 2058/2080/2049 2059/2081/2050 +f 2056/2079/2048 2059/2081/2050 2060/2082/2051 +f 2057/2083/2052 2056/2079/2048 2061/2084/2053 +f 2063/2085/2054 2064/2086/2055 2066/2087/2056 +f 2064/2086/2055 2067/2088/2057 2068/2089/2058 +f 2065/2090/2059 2068/2089/2058 2069/2091/2060 +f 2066/2087/2056 2065/2090/2059 2071/2092/2061 +f 1374/1388/1371 2072/2093/2062 2073/2094/2063 +f 2072/2093/2062 2074/2095/2064 2075/2096/2065 +f 2073/2094/2063 2075/2096/2065 2076/2097/2066 +f 1375/1382/1365 2073/2094/2063 2077/2098/2067 +f 2078/2099/2068 2079/2100/2069 2081/2101/2070 +f 2079/2100/2069 2054/2077/2046 2057/2083/2052 +f 2080/2102/2071 2057/2083/2052 2062/2103/2072 +f 2081/2101/2070 2080/2102/2071 2082/2104/2073 +f 2084/2105/2074 2085/2106/2075 2086/2107/2076 +f 2085/2106/2075 2076/2097/2066 2075/2096/2065 +f 2086/2107/2076 2075/2096/2065 2074/2095/2064 +f 2087/2108/2077 2086/2107/2076 2088/2109/2078 +f 2089/2110/2079 2090/2111/2080 2092/2112/2081 +f 2090/2111/2080 2093/2113/2082 2091/2114/2083 +f 2091/2114/2083 2094/2115/2084 2087/2108/2077 +f 2092/2112/2081 2091/2114/2083 2083/2116/2085 +f 2062/2103/2072 2095/2117/2086 2082/2104/2073 +f 2095/2117/2086 2097/2118/2087 2096/2119/2088 +f 2096/2119/2088 2098/2120/2089 2089/2110/2079 +f 2082/2104/2073 2096/2119/2088 2083/2116/2085 +f 2074/2095/2064 2099/2121/2090 2088/2109/2078 +f 2099/2121/2090 2101/2122/2091 2100/2123/2092 +f 2100/2123/2092 2102/2124/2093 2078/2099/2068 +f 2088/2109/2078 2100/2123/2092 2083/2116/2085 +f 1354/1362/1345 2103/2125/2094 2104/2126/2095 +f 2103/2125/2094 2101/2122/2091 2099/2121/2090 +f 2104/2126/2095 2099/2121/2090 2074/2095/2064 +f 1380/1387/1370 2104/2126/2095 2072/2093/2062 +f 2105/2127/2096 2106/2128/2097 2108/2129/2098 +f 2106/2128/2097 2109/2130/2099 2110/2131/2100 +f 2107/2132/2101 2110/2131/2100 2112/2133/2102 +f 2108/2129/2098 2107/2132/2101 2113/2134/2103 +f 2063/2085/2054 2114/2135/2104 2064/2086/2055 +f 2114/2135/2104 2105/2127/2096 2115/2136/2105 +f 2115/2136/2105 2108/2129/2098 2116/2137/2106 +f 2064/2086/2055 2115/2136/2105 2067/2088/2057 +f 2117/2138/2107 2118/2139/2108 2120/2140/2109 +f 2118/2139/2108 2121/2141/2110 2119/2142/2111 +f 2119/2142/2111 2122/2143/2112 2111/2144/2113 +f 2120/2140/2109 2119/2142/2111 2109/2130/2099 +f 2058/2080/2049 2123/2145/2114 2124/2146/2115 +f 2123/2145/2114 2125/2147/2116 2126/2148/2117 +f 2124/2146/2115 2126/2148/2117 2071/2092/2061 +f 2059/2081/2050 2124/2146/2115 2127/2149/2118 +f 2125/2147/2116 2128/2150/2119 2129/2151/2120 +f 2128/2150/2119 2130/2152/2121 2131/2153/2122 +f 2129/2151/2120 2131/2153/2122 2063/2085/2054 +f 2126/2148/2117 2129/2151/2120 2066/2087/2056 +f 2132/2154/2123 2133/2155/2124 2135/2156/2125 +f 2133/2155/2124 2136/2157/2126 2134/2158/2127 +f 2134/2158/2127 2137/2159/2128 1874/1897/1866 +f 2135/2156/2125 2134/2158/2127 1877/1903/1872 +f 2138/2160/2129 2139/2161/2130 2140/2162/2131 +f 2139/2161/2130 1885/1907/1876 1883/1905/1874 +f 2140/2162/2131 1883/1905/1874 1874/1897/1866 +f 2141/2163/2132 2140/2162/2131 2137/2159/2128 +f 2142/2164/2133 2143/2165/2134 2145/2166/2135 +f 2143/2165/2134 2146/2167/2136 2144/2168/2137 +f 2144/2168/2137 2147/2169/2138 2133/2155/2124 +f 2145/2166/2135 2144/2168/2137 2132/2154/2123 +f 2148/2170/2139 2149/2171/2140 2150/2172/2141 +f 2149/2171/2140 2138/2160/2129 2141/2163/2132 +f 2150/2172/2141 2141/2163/2132 2136/2157/2126 +f 2151/2173/2142 2150/2172/2141 2147/2169/2138 +f 2152/2174/2143 2153/2175/2144 2155/2176/2145 +f 2153/2175/2144 2156/2177/2146 2154/2178/2147 +f 2154/2178/2147 2157/2179/2148 2079/2100/2069 +f 2155/2176/2145 2154/2178/2147 2078/2099/2068 +f 2156/2177/2146 2158/2180/2149 2159/2181/2150 +f 2158/2180/2149 2160/2182/2151 2161/2183/2152 +f 2159/2181/2150 2161/2183/2152 2058/2080/2049 +f 2157/2179/2148 2159/2181/2150 2055/2078/2047 +f 2152/2174/2143 2162/2184/2153 2163/2185/2154 +f 2162/2184/2153 2148/2170/2139 2151/2173/2142 +f 2163/2185/2154 2151/2173/2142 2146/2167/2136 +f 2153/2175/2144 2163/2185/2154 2164/2186/2155 +f 2146/2167/2136 2143/2165/2134 2164/2186/2155 +f 2143/2165/2134 2142/2164/2133 2165/2187/2156 +f 2165/2187/2156 2166/2188/2157 2158/2180/2149 +f 2164/2186/2155 2165/2187/2156 2156/2177/2146 +f 2160/2182/2151 2167/2189/2158 2168/2190/2159 +f 2167/2189/2158 2169/2191/2160 2170/2192/2161 +f 2168/2190/2159 2170/2192/2161 2125/2147/2116 +f 2161/2183/2152 2168/2190/2159 2123/2145/2114 +f 2169/2191/2160 2171/2193/2162 2172/2194/2163 +f 2171/2193/2162 2173/2195/2164 2174/2196/2165 +f 2172/2194/2163 2174/2196/2165 2130/2152/2121 +f 2170/2192/2161 2172/2194/2163 2128/2150/2119 +f 2175/2197/2166 2176/2198/2167 2177/2199/2168 +f 2176/2198/2167 2179/2200/2169 2180/2201/2170 +f 2177/2199/2168 2180/2201/2170 2173/2195/2164 +f 2178/2202/2171 2177/2199/2168 2171/2193/2162 +f 2181/2203/2172 2182/2204/2173 2183/2205/2174 +f 2182/2204/2173 2117/2138/2107 2183/2205/2174 +f 2183/2205/2174 2120/2140/2109 2185/2206/2175 +f 2184/2207/2176 2183/2205/2174 2185/2206/2175 +f 2130/2152/2121 2187/2208/2177 2188/2209/2178 +f 2187/2208/2177 2189/2210/2179 2190/2211/2180 +f 2188/2209/2178 2190/2211/2180 2105/2127/2096 +f 2131/2153/2122 2188/2209/2178 2114/2135/2104 +f 2186/2212/2181 2185/2206/2175 2192/2213/2182 +f 2185/2206/2175 2109/2130/2099 2191/2214/2183 +f 2191/2214/2183 2106/2128/2097 2190/2211/2180 +f 2192/2213/2182 2191/2214/2183 2189/2210/2179 +f 2193/2215/2184 2194/2216/2185 2196/2217/2186 +f 2194/2216/2185 2189/2210/2179 2195/2218/2187 +f 2195/2218/2187 2187/2208/2177 2174/2196/2165 +f 2196/2217/2186 2195/2218/2187 2173/2195/2164 +f 2197/2219/2188 2198/2220/2189 2200/2221/2190 +f 2198/2220/2189 2186/2212/2181 2199/2222/2191 +f 2199/2222/2191 2192/2213/2182 2194/2216/2185 +f 2200/2221/2190 2199/2222/2191 2193/2215/2184 +f 2201/2223/2192 2202/2224/2193 2203/2225/2194 +f 2202/2224/2193 2181/2203/2172 2184/2207/2176 +f 2203/2225/2194 2184/2207/2176 2186/2212/2181 +f 2204/2226/2195 2203/2225/2194 2198/2220/2189 +f 2205/2227/2196 2206/2228/2197 2208/2229/2198 +f 2206/2228/2197 2201/2223/2192 2204/2226/2195 +f 2207/2230/2199 2204/2226/2195 2197/2219/2188 +f 2208/2229/2198 2207/2230/2199 2210/2231/2200 +f 2210/2231/2200 2209/2232/2201 2212/2233/2202 +f 2209/2232/2201 2197/2219/2188 2211/2234/2203 +f 2211/2234/2203 2200/2221/2190 2213/2235/2204 +f 2212/2233/2202 2211/2234/2203 2214/2236/2205 +f 2214/2236/2205 2213/2235/2204 2216/2237/2206 +f 2213/2235/2204 2193/2215/2184 2215/2238/2207 +f 2215/2238/2207 2196/2217/2186 2180/2201/2170 +f 2216/2237/2206 2215/2238/2207 2179/2200/2169 +f 2217/2239/2208 2218/2240/2209 2220/2241/2210 +f 2218/2240/2209 2221/2242/2211 2222/2243/2212 +f 2219/2244/2213 2222/2243/2212 2214/2236/2205 +f 2220/2241/2210 2219/2244/2213 2216/2237/2206 +f 2217/2239/2208 2220/2241/2210 2223/2245/2214 +f 2220/2241/2210 2179/2200/2169 2223/2245/2214 +f 2223/2245/2214 2176/2198/2167 2175/2197/2166 +f 2224/2246/2215 2223/2245/2214 2225/2247/2216 +f 2142/2164/2133 2227/2248/2217 2166/2188/2157 +f 2227/2248/2217 2175/2197/2166 2178/2202/2171 +f 2228/2249/2218 2178/2202/2171 2169/2191/2160 +f 2166/2188/2157 2228/2249/2218 2167/2189/2158 +f 2226/2250/2219 2225/2247/2216 2229/2251/2220 +f 2225/2247/2216 2175/2197/2166 2227/2248/2217 +f 2229/2251/2220 2227/2248/2217 2142/2164/2133 +f 2230/2252/2221 2229/2251/2220 2145/2166/2135 +f 1980/2007/1976 2231/2253/2222 1981/2002/1971 +f 2231/2253/2222 2226/2250/2219 2230/2252/2221 +f 2232/2254/2223 2230/2252/2221 2132/2154/2123 +f 1981/2002/1971 2232/2254/2223 1882/2003/1972 +f 1984/2012/1981 2233/2255/2224 2234/2256/2225 +f 2233/2255/2224 2217/2239/2208 2224/2246/2215 +f 2234/2256/2225 2224/2246/2215 2226/2250/2219 +f 1985/2006/1975 2234/2256/2225 1980/2007/1976 +f 1984/2012/1981 1989/2011/1980 2233/2255/2224 +f 1989/2011/1980 1988/2010/1979 2236/2257/2226 +f 2235/2258/2227 2236/2257/2226 2218/2240/2209 +f 2233/2255/2224 2235/2258/2227 2217/2239/2208 +f 2214/2236/2205 2222/2243/2212 2212/2233/2202 +f 2222/2243/2212 2221/2242/2211 2237/2259/2228 +f 2237/2259/2228 2238/2260/2229 2240/2261/2230 +f 2212/2233/2202 2237/2259/2228 2210/2231/2200 +f 2241/2262/2231 2242/2263/2232 2244/2264/2233 +f 2242/2263/2232 2205/2227/2196 2243/2265/2234 +f 2243/2265/2234 2208/2229/2198 2240/2261/2230 +f 2244/2264/2233 2243/2265/2234 2240/2261/2230 +f 2002/2026/1995 2001/2025/1994 2245/2266/2235 +f 2001/2025/1994 2000/2024/1993 2247/2267/2236 +f 2245/2266/2235 2247/2267/2236 2241/2262/2231 +f 2246/2268/2237 2245/2266/2235 2244/2264/2233 +f 1988/2010/1979 2005/2029/1998 2236/2257/2226 +f 2005/2029/1998 2002/2026/1995 2248/2269/2238 +f 2248/2269/2238 2246/2268/2237 2238/2260/2229 +f 2236/2257/2226 2248/2269/2238 2221/2242/2211 +f 2249/2270/2239 2250/2271/2240 2252/2272/2241 +f 2250/2271/2240 2253/2273/2242 2251/2274/2243 +f 2251/2274/2243 2254/2275/2244 840/837/836 +f 2252/2272/2241 2251/2274/2243 845/867/866 +f 2076/2097/2066 2256/2276/2245 2077/2098/2067 +f 2256/2276/2245 2249/2270/2239 2257/2277/2246 +f 2257/2277/2246 2252/2272/2241 876/869/868 +f 2077/2098/2067 2257/2277/2246 874/870/869 +f 2093/2113/2082 2258/2278/2247 2094/2115/2084 +f 2258/2278/2247 2260/2279/2248 2259/2280/2249 +f 2259/2280/2249 2261/2281/2250 2263/2282/2251 +f 2094/2115/2084 2259/2280/2249 2084/2105/2074 +f 2262/2283/2252 2264/2284/2253 2265/2285/2254 +f 2264/2284/2253 2249/2270/2239 2256/2276/2245 +f 2265/2285/2254 2256/2276/2245 2076/2097/2066 +f 2263/2282/2251 2265/2285/2254 2085/2106/2075 +f 2266/2286/2255 2267/2287/2256 2268/2288/2257 +f 2267/2287/2256 2253/2273/2242 2250/2271/2240 +f 2268/2288/2257 2250/2271/2240 2249/2270/2239 +f 2269/2289/2258 2268/2288/2257 2264/2284/2253 +f 2060/2082/2051 2127/2149/2118 2270/2290/2259 +f 2127/2149/2118 2071/2092/2061 2070/2291/2260 +f 2270/2290/2259 2070/2291/2260 2272/2292/2261 +f 2271/2293/2262 2270/2290/2259 2273/2294/2263 +f 2062/2103/2072 2061/2084/2053 2274/2295/2264 +f 2061/2084/2053 2060/2082/2051 2274/2295/2264 +f 2274/2295/2264 2271/2293/2262 2275/2296/2265 +f 2095/2117/2086 2274/2295/2264 2097/2118/2087 +f 2138/2160/2129 2149/2171/2140 2277/2297/2266 +f 2149/2171/2140 2148/2170/2139 2278/2298/2267 +f 2276/2299/2268 2278/2298/2267 2280/2300/2269 +f 2277/2297/2266 2276/2299/2268 2037/2301/2270 +f 1885/1907/1876 2139/2161/2130 2039/2062/2031 +f 2139/2161/2130 2138/2160/2129 2277/2297/2266 +f 2039/2062/2031 2281/2302/2271 2277/2297/2266 +f 1352/1363/1346 1356/1366/1349 2283/2303/2272 +f 1356/1366/1349 610/601/601 2282/2304/2273 +f 2282/2304/2273 2041/2064/2033 2284/2305/2274 +f 2283/2303/2272 2282/2304/2273 2285/2306/2275 +f 1354/1362/1345 1353/1361/1344 2103/2125/2094 +f 1353/1361/1344 1352/1363/1346 2286/2307/2276 +f 2286/2307/2276 2283/2303/2272 2287/2308/2277 +f 2103/2125/2094 2286/2307/2276 2101/2122/2091 +f 2285/2306/2275 2288/2309/2278 2289/2310/2279 +f 2288/2309/2278 2152/2174/2143 2289/2310/2279 +f 2289/2310/2279 2155/2176/2145 2102/2124/2093 +f 2287/2308/2277 2289/2310/2279 2102/2124/2093 +f 2285/2306/2275 2290/2311/2280 2288/2309/2278 +f 2290/2311/2280 2279/2312/2281 2291/2313/2282 +f 2291/2313/2282 2278/2298/2267 2148/2170/2139 +f 2288/2309/2278 2291/2313/2282 2162/2184/2153 +f 2037/2301/2270 2280/2300/2269 2292/2314/2283 +f 2280/2300/2269 2279/2312/2281 2290/2311/2280 +f 2292/2314/2283 2290/2311/2280 2285/2306/2275 +f 2053/2076/2045 2292/2314/2283 2284/2305/2274 +f 2293/2315/2284 2294/2316/2285 2295/2317/2286 +f 2294/2316/2285 2297/2318/2287 2298/2319/2288 +f 2295/2317/2286 2298/2319/2288 2299/2320/2289 +f 2296/2321/2290 2295/2317/2286 2300/2322/2291 +f 2301/2323/2292 2302/2324/2293 2304/2325/2294 +f 2302/2324/2293 2305/2326/2295 2303/2327/2296 +f 2303/2327/2296 2306/2328/2297 2307/2329/2298 +f 2304/2325/2294 2303/2327/2296 2309/2330/2299 +f 2309/2330/2299 2308/2331/2300 2310/2332/2301 +f 2308/2331/2300 2307/2329/2298 2312/2333/2302 +f 2310/2332/2301 2312/2333/2302 2299/2320/2289 +f 2311/2334/2303 2310/2332/2301 2298/2319/2288 +f 2313/2335/2304 2314/2336/2305 2316/2337/2306 +f 2314/2336/2305 2317/2338/2307 2315/2339/2308 +f 2315/2339/2308 2318/2340/2309 2320/2341/2310 +f 2316/2337/2306 2315/2339/2308 2321/2342/2311 +f 2317/2338/2307 2314/2336/2305 2323/2343/2312 +f 2314/2336/2305 2313/2335/2304 2322/2344/2313 +f 2322/2344/2313 2324/2345/2314 2325/2346/2315 +f 2323/2343/2312 2322/2344/2313 2327/2347/2316 +f 2317/2338/2307 2323/2343/2312 2328/2348/2317 +f 2323/2343/2312 2327/2347/2316 2330/2349/2318 +f 2328/2348/2317 2330/2349/2318 2331/2350/2319 +f 2329/2351/2320 2328/2348/2317 2332/2352/2321 +f 2334/2353/2322 2335/2354/2323 2336/2355/2324 +f 2335/2354/2323 2338/2356/2325 2339/2357/2326 +f 2336/2355/2324 2339/2357/2326 2340/2358/2327 +f 2337/2359/2328 2336/2355/2324 2341/2360/2329 +f 2343/2361/2330 2344/2362/2331 2345/2363/2332 +f 2344/2362/2331 2347/2364/2333 2348/2365/2334 +f 2345/2363/2332 2348/2365/2334 2334/2353/2322 +f 2346/2366/2335 2345/2363/2332 2349/2367/2336 +f 2351/2368/2337 2352/2369/2338 2354/2370/2339 +f 2352/2369/2338 2331/2350/2319 2353/2371/2340 +f 2353/2371/2340 2355/2372/2341 2357/2373/2342 +f 2354/2370/2339 2353/2371/2340 2358/2374/2343 +f 2338/2356/2325 2359/2375/2344 2361/2376/2345 +f 2359/2375/2344 2351/2368/2337 2360/2377/2346 +f 2360/2377/2346 2354/2370/2339 2362/2378/2347 +f 2361/2376/2345 2360/2377/2346 2363/2379/2348 +f 2333/2380/2349 2332/2352/2321 2364/2381/2350 +f 2332/2352/2321 2331/2350/2319 2352/2369/2338 +f 2364/2381/2350 2352/2369/2338 2351/2368/2337 +f 2365/2382/2351 2364/2381/2350 2366/2383/2352 +f 2347/2364/2333 2366/2383/2352 2367/2384/2353 +f 2366/2383/2352 2351/2368/2337 2359/2375/2344 +f 2367/2384/2353 2359/2375/2344 2338/2356/2325 +f 2348/2365/2334 2367/2384/2353 2335/2354/2323 +f 2350/2385/2354 2349/2367/2336 2368/2386/2355 +f 2349/2367/2336 2334/2353/2322 2337/2359/2328 +f 2368/2386/2355 2337/2359/2328 2342/2387/2356 +f 2369/2388/2357 2368/2386/2355 2370/2389/2358 +f 2372/2390/2359 2373/2391/2360 2374/2392/2361 +f 2373/2391/2360 2350/2385/2354 2369/2388/2357 +f 2374/2392/2361 2369/2388/2357 2371/2393/2362 +f 2375/2394/2363 2374/2392/2361 2376/2395/2364 +f 2378/2396/2365 2379/2397/2366 2380/2398/2367 +f 2379/2397/2366 2343/2361/2330 2346/2366/2335 +f 2380/2398/2367 2346/2366/2335 2350/2385/2354 +f 2381/2399/2368 2380/2398/2367 2373/2391/2360 +f 2382/2400/2369 2383/2401/2370 2385/2402/2371 +f 2383/2401/2370 2386/2403/2372 2384/2404/2373 +f 2384/2404/2373 2387/2405/2374 2389/2406/2375 +f 2385/2402/2371 2384/2404/2373 2390/2407/2376 +f 2391/2408/2377 2392/2409/2378 2393/2410/2379 +f 2392/2409/2378 2395/2411/2380 2396/2412/2381 +f 2393/2410/2379 2396/2412/2381 2390/2407/2376 +f 2394/2413/2382 2393/2410/2379 2389/2406/2375 +f 2319/2414/2383 2397/2415/2384 2399/2416/2385 +f 2397/2415/2384 2400/2417/2386 2398/2418/2387 +f 2398/2418/2387 2401/2419/2388 2394/2413/2382 +f 2399/2416/2385 2398/2418/2387 2388/2420/2389 +f 2395/2411/2380 2392/2409/2378 2403/2421/2390 +f 2392/2409/2378 2391/2408/2377 2402/2422/2391 +f 2402/2422/2391 2404/2423/2392 2405/2424/2393 +f 2403/2421/2390 2402/2422/2391 2406/2425/2394 +f 2391/2408/2377 2401/2419/2388 2404/2423/2392 +f 2401/2419/2388 2400/2417/2386 2407/2426/2395 +f 2407/2426/2395 2408/2427/2396 2379/2397/2366 +f 2404/2423/2392 2407/2426/2395 2378/2396/2365 +f 2333/2380/2349 2365/2382/2351 2409/2428/2397 +f 2365/2382/2351 2347/2364/2333 2409/2428/2397 +f 2409/2428/2397 2344/2362/2331 2343/2361/2330 +f 2410/2429/2398 2409/2428/2397 2408/2427/2396 +f 2319/2414/2383 2318/2340/2309 2411/2430/2399 +f 2318/2340/2309 2317/2338/2307 2329/2351/2320 +f 2411/2430/2399 2329/2351/2320 2333/2380/2349 +f 2397/2415/2384 2411/2430/2399 2410/2429/2398 +f 2386/2403/2372 2412/2431/2400 2413/2432/2401 +f 2412/2431/2400 2321/2342/2311 2320/2341/2310 +f 2413/2432/2401 2320/2341/2310 2319/2414/2383 +f 2387/2405/2374 2413/2432/2401 2388/2420/2389 +f 2342/2387/2356 2341/2360/2329 2415/2433/2402 +f 2341/2360/2329 2340/2358/2327 2414/2434/2403 +f 2414/2434/2403 2416/2435/2404 2417/2436/2405 +f 2415/2433/2402 2414/2434/2403 2419/2437/2406 +f 2420/2438/2407 2421/2439/2408 2423/2440/2409 +f 2421/2439/2408 2424/2441/2410 2425/2442/2411 +f 2422/2443/2412 2425/2442/2411 2426/2444/2413 +f 2423/2440/2409 2422/2443/2412 2417/2436/2405 +f 2428/2445/2414 2429/2446/2415 2431/2447/2416 +f 2429/2446/2415 2432/2448/2417 2433/2449/2418 +f 2430/2450/2419 2433/2449/2418 2424/2441/2410 +f 2431/2447/2416 2430/2450/2419 2420/2438/2407 +f 2434/2451/2420 2435/2452/2421 2436/2453/2422 +f 2435/2452/2421 2438/2454/2423 2439/2455/2424 +f 2436/2453/2422 2439/2455/2424 2441/2456/2425 +f 2437/2457/2426 2436/2453/2422 2442/2458/2427 +f 2377/2459/2428 2443/2460/2429 2444/2461/2430 +f 2443/2460/2429 2446/2462/2431 2447/2463/2432 +f 2444/2461/2430 2447/2463/2432 2448/2464/2433 +f 2445/2465/2434 2444/2461/2430 2449/2466/2435 +f 2451/2467/2436 2452/2468/2437 2454/2469/2438 +f 2452/2468/2437 2382/2400/2369 2385/2402/2371 +f 2453/2470/2439 2385/2402/2371 2455/2471/2440 +f 2454/2469/2438 2453/2470/2439 2455/2471/2440 +f 2390/2407/2376 2457/2472/2441 2455/2471/2440 +f 2457/2472/2441 2459/2473/2442 2460/2474/2443 +f 2455/2471/2440 2458/2475/2444 2460/2474/2443 +f 2461/2476/2445 2462/2477/2446 2463/2478/2447 +f 2462/2477/2446 2440/2479/2448 2465/2480/2449 +f 2463/2478/2447 2465/2480/2449 2466/2481/2450 +f 2464/2482/2451 2463/2478/2447 2467/2483/2452 +f 2469/2484/2453 2470/2485/2454 2472/2486/2455 +f 2470/2485/2454 2473/2487/2456 2474/2488/2457 +f 2471/2489/2458 2474/2488/2457 2475/2490/2459 +f 2472/2486/2455 2471/2489/2458 2477/2491/2460 +f 2478/2492/2461 2479/2493/2462 2481/2494/2463 +f 2479/2493/2462 2482/2495/2464 2480/2496/2465 +f 2480/2496/2465 2483/2497/2466 2447/2463/2432 +f 2481/2494/2463 2480/2496/2465 2446/2462/2431 +f 2469/2484/2453 2472/2486/2455 2484/2498/2467 +f 2472/2486/2455 2477/2491/2460 2486/2499/2468 +f 2484/2498/2467 2486/2499/2468 2487/2500/2469 +f 2485/2501/2470 2484/2498/2467 2488/2502/2471 +f 2305/2326/2295 2490/2503/2472 2491/2504/2473 +f 2490/2503/2472 2493/2505/2474 2494/2506/2475 +f 2491/2504/2473 2494/2506/2475 2495/2507/2476 +f 2492/2508/2477 2491/2504/2473 2496/2509/2478 +f 2498/2510/2479 2499/2511/2480 2501/2512/2481 +f 2499/2511/2480 2502/2513/2482 2500/2514/2483 +f 2501/2512/2481 2500/2514/2483 2503/2515/2484 +f 2505/2516/2485 2506/2517/2486 2507/2518/2487 +f 2506/2517/2486 2502/2513/2482 2499/2511/2480 +f 2508/2519/2488 2507/2518/2487 2498/2510/2479 +f 2509/2520/2489 2510/2521/2490 2511/2522/2491 +f 2510/2521/2490 2513/2523/2492 2511/2522/2491 +f 2511/2522/2491 2514/2524/2493 2516/2525/2494 +f 2512/2526/2495 2511/2522/2491 2516/2525/2494 +f 2497/2527/2496 2518/2528/2497 2519/2529/2498 +f 2518/2528/2497 2520/2530/2499 2519/2529/2498 +f 2519/2529/2498 2521/2531/2500 2307/2329/2298 +f 2492/2508/2477 2519/2529/2498 2306/2328/2297 +f 2509/2520/2489 2522/2532/2501 2510/2521/2490 +f 2522/2532/2501 2524/2533/2502 2523/2534/2503 +f 2523/2534/2503 2525/2535/2504 2526/2536/2505 +f 2510/2521/2490 2523/2534/2503 2527/2537/2506 +f 2528/2538/2507 2529/2539/2508 2531/2540/2509 +f 2529/2539/2508 2532/2541/2510 2530/2542/2511 +f 2530/2542/2511 2533/2543/2512 2535/2544/2513 +f 2531/2540/2509 2530/2542/2511 2536/2545/2514 +f 2537/2546/2515 2538/2547/2516 2539/2548/2517 +f 2538/2547/2516 2541/2549/2518 2542/2550/2519 +f 2539/2548/2517 2542/2550/2519 2543/2551/2520 +f 2540/2552/2521 2539/2548/2517 2544/2553/2522 +f 2541/2549/2518 2546/2554/2523 2547/2555/2524 +f 2546/2554/2523 2502/2513/2482 2548/2556/2525 +f 2542/2550/2519 2547/2555/2524 2548/2556/2525 +f 2543/2551/2520 2548/2556/2525 2550/2557/2526 +f 2548/2556/2525 2502/2513/2482 2506/2517/2486 +f 2550/2557/2526 2549/2558/2527 2506/2517/2486 +f 2543/2551/2520 2551/2559/2528 2544/2553/2522 +f 2551/2559/2528 2553/2560/2529 2552/2561/2530 +f 2552/2561/2530 2554/2562/2531 2556/2563/2532 +f 2544/2553/2522 2552/2561/2530 2545/2564/2533 +f 2505/2516/2485 2557/2565/2534 2550/2557/2526 +f 2557/2565/2534 2559/2566/2535 2560/2567/2536 +f 2558/2568/2537 2560/2567/2536 2551/2559/2528 +f 2550/2557/2526 2558/2568/2537 2551/2559/2528 +f 2553/2560/2529 2561/2569/2538 2554/2562/2531 +f 2561/2569/2538 2563/2570/2539 2562/2571/2540 +f 2562/2571/2540 2564/2572/2541 2565/2573/2542 +f 2554/2562/2531 2562/2571/2540 2555/2574/2543 +f 2553/2560/2529 2560/2567/2536 2566/2575/2544 +f 2560/2567/2536 2559/2566/2535 2567/2576/2545 +f 2566/2575/2544 2567/2576/2545 2568/2577/2546 +f 2561/2569/2538 2566/2575/2544 2569/2578/2547 +f 2570/2579/2548 2571/2580/2549 2572/2581/2550 +f 2571/2580/2549 2574/2582/2551 2575/2583/2552 +f 2572/2581/2550 2575/2583/2552 2577/2584/2553 +f 2573/2585/2554 2572/2581/2550 2577/2584/2553 +f 2574/2582/2551 2579/2586/2555 2575/2583/2552 +f 2579/2586/2555 2581/2587/2556 2580/2588/2557 +f 2580/2588/2557 2582/2589/2558 2583/2590/2559 +f 2575/2583/2552 2580/2588/2557 2576/2591/2560 +f 2584/2592/2561 2585/2593/2562 2587/2594/2563 +f 2585/2593/2562 2520/2530/2499 2586/2595/2564 +f 2586/2595/2564 2518/2528/2497 2588/2596/2565 +f 2587/2594/2563 2586/2595/2564 2589/2597/2566 +f 2589/2597/2566 2588/2596/2565 2590/2598/2567 +f 2588/2596/2565 2497/2527/2496 2590/2598/2567 +f 2590/2598/2567 2496/2509/2478 2592/2599/2568 +f 2591/2600/2569 2590/2598/2567 2593/2601/2570 +f 2448/2464/2433 2594/2602/2571 2449/2466/2435 +f 2594/2602/2571 2584/2592/2561 2595/2603/2572 +f 2595/2603/2572 2587/2594/2563 2596/2604/2573 +f 2449/2466/2435 2595/2603/2572 2450/2605/2574 +f 2593/2601/2570 2597/2606/2575 2598/2607/2576 +f 2597/2606/2575 2600/2608/2577 2601/2609/2578 +f 2598/2607/2576 2601/2609/2578 2406/2425/2394 +f 2599/2610/2579 2598/2607/2576 2602/2611/2580 +f 2406/2425/2394 2405/2424/2393 2602/2611/2580 +f 2405/2424/2393 2378/2396/2365 2604/2612/2581 +f 2604/2612/2581 2381/2399/2368 2372/2390/2359 +f 2602/2611/2580 2604/2612/2581 2605/2613/2582 +f 2450/2605/2574 2606/2614/2583 2445/2465/2434 +f 2606/2614/2583 2603/2615/2584 2607/2616/2585 +f 2607/2616/2585 2605/2613/2582 2375/2394/2363 +f 2445/2465/2434 2607/2616/2585 2377/2459/2428 +f 2450/2605/2574 2596/2604/2573 2608/2617/2586 +f 2596/2604/2573 2589/2597/2566 2591/2600/2569 +f 2608/2617/2586 2591/2600/2569 2593/2601/2570 +f 2606/2614/2583 2608/2617/2586 2599/2610/2579 +f 2609/2618/2587 2610/2619/2588 2612/2620/2589 +f 2610/2619/2588 2600/2608/2577 2611/2621/2590 +f 2611/2621/2590 2597/2606/2575 2592/2599/2568 +f 2612/2620/2589 2611/2621/2590 2495/2507/2476 +f 2568/2577/2546 2567/2576/2545 2613/2622/2591 +f 2567/2576/2545 2559/2566/2535 2557/2565/2534 +f 2613/2622/2591 2557/2565/2534 2505/2516/2485 +f 2614/2623/2592 2613/2622/2591 2615/2624/2593 +f 2505/2516/2485 2508/2519/2488 2615/2624/2593 +f 2508/2519/2488 2498/2510/2479 2618/2625/2594 +f 2615/2624/2593 2617/2626/2595 2618/2625/2594 +f 2581/2587/2556 2619/2627/2596 2620/2628/2597 +f 2619/2627/2596 2622/2629/2598 2623/2630/2599 +f 2620/2628/2597 2623/2630/2599 2624/2631/2600 +f 2621/2632/2601 2620/2628/2597 2625/2633/2602 +f 2622/2629/2598 2626/2634/2603 2623/2630/2599 +f 2626/2634/2603 2616/2635/2604 2627/2636/2605 +f 2627/2636/2605 2618/2625/2594 2628/2637/2606 +f 2623/2630/2599 2627/2636/2605 2624/2631/2600 +f 2395/2411/2380 2629/2638/2607 2630/2639/2608 +f 2629/2638/2607 2631/2640/2609 2630/2639/2608 +f 2630/2639/2608 2632/2641/2610 2459/2473/2442 +f 2396/2412/2381 2630/2639/2608 2457/2472/2441 +f 2631/2640/2609 2629/2638/2607 2634/2642/2611 +f 2629/2638/2607 2395/2411/2380 2633/2643/2612 +f 2633/2643/2612 2403/2421/2390 2601/2609/2578 +f 2634/2642/2611 2633/2643/2612 2600/2608/2577 +f 2459/2473/2442 2635/2644/2613 2636/2645/2614 +f 2635/2644/2613 2637/2646/2615 2638/2647/2616 +f 2636/2645/2614 2638/2647/2616 2640/2648/2617 +f 2460/2474/2443 2636/2645/2614 2640/2648/2617 +f 2637/2646/2615 2641/2649/2618 2643/2650/2619 +f 2641/2649/2618 2624/2631/2600 2628/2637/2606 +f 2643/2650/2619 2642/2651/2620 2498/2510/2479 +f 2504/2652/2621 2644/2653/2622 2501/2512/2481 +f 2644/2653/2622 2639/2654/2623 2645/2655/2624 +f 2645/2655/2624 2638/2647/2616 2637/2646/2615 +f 2501/2512/2481 2645/2655/2624 2643/2650/2619 +f 2624/2631/2600 2641/2649/2618 2646/2656/2625 +f 2641/2649/2618 2637/2646/2615 2646/2656/2625 +f 2646/2656/2625 2635/2644/2613 2632/2641/2610 +f 2647/2657/2626 2646/2656/2625 2631/2640/2609 +f 2624/2631/2600 2647/2657/2626 2625/2633/2602 +f 2647/2657/2626 2631/2640/2609 2648/2658/2627 +f 2648/2658/2627 2634/2642/2611 2610/2619/2588 +f 2625/2633/2602 2648/2658/2627 2609/2618/2587 +f 2581/2587/2556 2621/2632/2601 2582/2589/2558 +f 2621/2632/2601 2609/2618/2587 2649/2659/2628 +f 2649/2659/2628 2612/2620/2589 2494/2506/2475 +f 2582/2589/2558 2649/2659/2628 2493/2505/2474 +f 2616/2635/2604 2626/2634/2603 2650/2660/2629 +f 2626/2634/2603 2622/2629/2598 2650/2660/2629 +f 2650/2660/2629 2619/2627/2596 2579/2586/2555 +f 2651/2661/2630 2650/2660/2629 2574/2582/2551 +f 2568/2577/2546 2614/2623/2592 2653/2662/2631 +f 2614/2623/2592 2616/2635/2604 2652/2663/2632 +f 2652/2663/2632 2651/2661/2630 2574/2582/2551 +f 2653/2662/2631 2652/2663/2632 2570/2579/2548 +f 2654/2664/2633 2655/2665/2634 2657/2666/2635 +f 2655/2665/2634 2658/2667/2636 2656/2668/2637 +f 2656/2668/2637 2659/2669/2638 2573/2585/2554 +f 2657/2666/2635 2656/2668/2637 2578/2670/2639 +f 2660/2671/2640 2661/2672/2641 2663/2673/2642 +f 2661/2672/2641 2536/2545/2514 2662/2674/2643 +f 2662/2674/2643 2664/2675/2644 2655/2665/2634 +f 2663/2673/2642 2662/2674/2643 2654/2664/2633 +f 2563/2570/2539 2569/2578/2547 2666/2676/2645 +f 2569/2578/2547 2568/2577/2546 2665/2677/2646 +f 2665/2677/2646 2653/2662/2631 2659/2669/2638 +f 2666/2676/2645 2665/2677/2646 2658/2667/2636 +f 2536/2545/2514 2535/2544/2513 2664/2675/2644 +f 2535/2544/2513 2534/2678/2647 2667/2679/2648 +f 2667/2679/2648 2564/2572/2541 2666/2676/2645 +f 2664/2675/2644 2667/2679/2648 2666/2676/2645 +f 2668/2680/2649 2669/2681/2650 2671/2682/2651 +f 2669/2681/2650 2528/2538/2507 2670/2683/2652 +f 2670/2683/2652 2531/2540/2509 2661/2672/2641 +f 2671/2682/2651 2670/2683/2652 2660/2671/2640 +f 2517/2684/2653 2672/2685/2654 2674/2686/2655 +f 2672/2685/2654 2675/2687/2656 2673/2688/2657 +f 2673/2688/2657 2676/2689/2658 2678/2690/2659 +f 2674/2686/2655 2673/2688/2657 2679/2691/2660 +f 2680/2692/2661 2681/2693/2662 2683/2694/2663 +f 2681/2693/2662 2675/2687/2656 2672/2685/2654 +f 2682/2695/2664 2672/2685/2654 2517/2684/2653 +f 2683/2694/2663 2682/2695/2664 2515/2696/2665 +f 2440/2479/2448 2439/2455/2424 2684/2697/2666 +f 2439/2455/2424 2438/2454/2423 2685/2698/2667 +f 2684/2697/2666 2685/2698/2667 2687/2699/2668 +f 2465/2480/2449 2684/2697/2666 2687/2699/2668 +f 2686/2700/2669 2688/2701/2670 2689/2702/2671 +f 2688/2701/2670 2473/2487/2456 2689/2702/2671 +f 2690/2703/2672 2689/2702/2671 2470/2485/2454 +f 2489/2704/2673 2691/2705/2674 2485/2501/2470 +f 2691/2705/2674 2466/2481/2450 2692/2706/2675 +f 2692/2706/2675 2687/2699/2668 2690/2703/2672 +f 2485/2501/2470 2692/2706/2675 2469/2484/2453 +f 2327/2347/2316 2693/2707/2676 2694/2708/2677 +f 2693/2707/2676 2695/2709/2678 2696/2710/2679 +f 2694/2708/2677 2696/2710/2679 2355/2372/2341 +f 2330/2349/2318 2694/2708/2677 2331/2350/2319 +f 2434/2451/2420 2437/2457/2426 2698/2711/2680 +f 2437/2457/2426 2442/2458/2427 2697/2712/2681 +f 2697/2712/2681 2699/2713/2682 2696/2710/2679 +f 2698/2711/2680 2697/2712/2681 2696/2710/2679 +f 2680/2692/2661 2683/2694/2663 2701/2714/2683 +f 2683/2694/2663 2515/2696/2665 2700/2715/2684 +f 2700/2715/2684 2702/2716/2685 2704/2717/2686 +f 2701/2714/2683 2700/2715/2684 2705/2718/2687 +f 2706/2719/2688 2707/2720/2689 2708/2721/2690 +f 2707/2720/2689 2680/2692/2661 2708/2721/2690 +f 2708/2721/2690 2701/2714/2683 2710/2722/2691 +f 2709/2723/2692 2708/2721/2690 2710/2722/2691 +f 2537/2546/2515 2540/2552/2521 2713/2724/2693 +f 2540/2552/2521 2545/2564/2533 2712/2725/2694 +f 2712/2725/2694 2714/2726/2695 2715/2727/2696 +f 2713/2724/2693 2712/2725/2694 2716/2728/2697 +f 2718/2729/2698 2719/2730/2699 2721/2731/2700 +f 2719/2730/2699 2722/2732/2701 2723/2733/2702 +f 2720/2734/2703 2723/2733/2702 2724/2735/2704 +f 2721/2731/2700 2720/2734/2703 2724/2735/2704 +f 2545/2564/2533 2556/2563/2532 2714/2726/2695 +f 2556/2563/2532 2555/2574/2543 2725/2736/2705 +f 2725/2736/2705 2726/2737/2706 2728/2738/2707 +f 2714/2726/2695 2725/2736/2705 2715/2727/2696 +f 2555/2574/2543 2565/2573/2542 2726/2737/2706 +f 2565/2573/2542 2534/2678/2647 2729/2739/2708 +f 2729/2739/2708 2533/2543/2512 2730/2740/2709 +f 2726/2737/2706 2729/2739/2708 2727/2741/2710 +f 2727/2741/2710 2730/2740/2709 2732/2742/2711 +f 2730/2740/2709 2532/2541/2510 2731/2743/2712 +f 2731/2743/2712 2529/2539/2508 2528/2538/2507 +f 2732/2742/2711 2731/2743/2712 2734/2744/2713 +f 2715/2727/2696 2728/2738/2707 2735/2745/2714 +f 2728/2738/2707 2727/2741/2710 2735/2745/2714 +f 2735/2745/2714 2732/2742/2711 2737/2746/2715 +f 2736/2747/2716 2735/2745/2714 2722/2732/2701 +f 2717/2748/2717 2716/2728/2697 2738/2749/2718 +f 2716/2728/2697 2715/2727/2696 2736/2747/2716 +f 2738/2749/2718 2736/2747/2716 2722/2732/2701 +f 2739/2750/2719 2738/2749/2718 2718/2729/2698 +f 2541/2549/2518 2740/2751/2720 2546/2554/2523 +f 2740/2751/2720 2742/2752/2721 2741/2753/2722 +f 2741/2753/2722 2743/2754/2723 2503/2515/2484 +f 2546/2554/2523 2741/2753/2722 2503/2515/2484 +f 2537/2546/2515 2744/2755/2724 2538/2547/2516 +f 2744/2755/2724 2746/2756/2725 2745/2757/2726 +f 2745/2757/2726 2747/2758/2727 2740/2751/2720 +f 2538/2547/2516 2745/2757/2726 2541/2549/2518 +f 2746/2756/2725 2744/2755/2724 2749/2759/2728 +f 2744/2755/2724 2537/2546/2515 2748/2760/2729 +f 2748/2760/2729 2713/2724/2693 2750/2761/2730 +f 2749/2759/2728 2748/2760/2729 2750/2761/2730 +f 2751/2762/2731 2750/2761/2730 2753/2763/2732 +f 2750/2761/2730 2717/2748/2717 2752/2764/2733 +f 2752/2764/2733 2739/2750/2719 2754/2765/2734 +f 2753/2763/2732 2752/2764/2733 2755/2766/2735 +f 2718/2729/2698 2721/2731/2700 2756/2767/2736 +f 2721/2731/2700 2706/2719/2688 2709/2723/2692 +f 2756/2767/2736 2709/2723/2692 2711/2768/2737 +f 2754/2765/2734 2756/2767/2736 2757/2769/2738 +f 2677/2770/2739 2676/2689/2658 2758/2771/2740 +f 2676/2689/2658 2675/2687/2656 2681/2693/2662 +f 2758/2771/2740 2681/2693/2662 2707/2720/2689 +f 2724/2735/2704 2758/2771/2740 2706/2719/2688 +f 2722/2732/2701 2737/2746/2715 2723/2733/2702 +f 2737/2746/2715 2734/2744/2713 2760/2772/2741 +f 2759/2773/2742 2760/2772/2741 2678/2690/2659 +f 2723/2733/2702 2759/2773/2742 2677/2770/2739 +f 2528/2538/2507 2669/2681/2650 2733/2774/2743 +f 2669/2681/2650 2668/2680/2649 2761/2775/2744 +f 2761/2775/2744 2762/2776/2745 2760/2772/2741 +f 2733/2774/2743 2761/2775/2744 2734/2744/2713 +f 2679/2691/2660 2762/2776/2745 2764/2777/2746 +f 2762/2776/2745 2668/2680/2649 2763/2778/2747 +f 2763/2778/2747 2671/2682/2651 2765/2779/2748 +f 2764/2777/2746 2763/2778/2747 2765/2779/2748 +f 2767/2780/2749 2768/2781/2750 2769/2782/2751 +f 2768/2781/2750 2771/2783/2752 2772/2784/2753 +f 2769/2782/2751 2772/2784/2753 2773/2785/2754 +f 2770/2786/2755 2769/2782/2751 2774/2787/2756 +f 2775/2788/2757 2774/2787/2756 2776/2789/2758 +f 2774/2787/2756 2773/2785/2754 2776/2789/2758 +f 2776/2789/2758 2778/2790/2759 2780/2791/2760 +f 2777/2792/2761 2776/2789/2758 2780/2791/2760 +f 2773/2785/2754 2772/2784/2753 2778/2790/2759 +f 2772/2784/2753 2771/2783/2752 2782/2793/2762 +f 2782/2793/2762 2783/2794/2763 2784/2795/2764 +f 2778/2790/2759 2782/2793/2762 2779/2796/2765 +f 2779/2796/2765 2785/2797/2766 2786/2798/2767 +f 2785/2797/2766 2784/2795/2764 2788/2799/2768 +f 2786/2798/2767 2788/2799/2768 2789/2800/2769 +f 2787/2801/2770 2786/2798/2767 2790/2802/2771 +f 2781/2803/2772 2780/2791/2760 2792/2804/2773 +f 2780/2791/2760 2779/2796/2765 2792/2804/2773 +f 2792/2804/2773 2787/2801/2770 2794/2805/2774 +f 2793/2806/2775 2792/2804/2773 2794/2805/2774 +f 2487/2500/2469 2795/2807/2776 2488/2502/2471 +f 2795/2807/2776 2797/2808/2777 2796/2809/2778 +f 2796/2809/2778 2798/2810/2779 2793/2806/2775 +f 2488/2502/2471 2796/2809/2778 2489/2704/2673 +f 2799/2811/2780 2800/2812/2781 2801/2813/2782 +f 2800/2812/2781 2775/2788/2757 2777/2792/2761 +f 2801/2813/2782 2777/2792/2761 2781/2803/2772 +f 2802/2814/2783 2801/2813/2782 2798/2810/2779 +f 2799/2811/2780 2803/2815/2784 2804/2816/2785 +f 2803/2815/2784 2805/2817/2786 2806/2818/2787 +f 2804/2816/2785 2806/2818/2787 2807/2819/2788 +f 2800/2812/2781 2804/2816/2785 2808/2820/2789 +f 2807/2819/2788 2809/2821/2790 2808/2820/2789 +f 2809/2821/2790 2811/2822/2791 2812/2823/2792 +f 2810/2824/2793 2812/2823/2792 2767/2780/2749 +f 2808/2820/2789 2810/2824/2793 2775/2788/2757 +f 2813/2825/2794 2814/2826/2795 2816/2827/2796 +f 2814/2826/2795 2524/2533/2502 2815/2828/2797 +f 2815/2828/2797 2522/2532/2501 2509/2520/2489 +f 2816/2827/2796 2815/2828/2797 2818/2829/2798 +f 2818/2829/2798 2817/2830/2799 2820/2831/2800 +f 2817/2830/2799 2509/2520/2489 2819/2832/2801 +f 2819/2832/2801 2512/2526/2495 2821/2833/2802 +f 2820/2831/2800 2819/2832/2801 2822/2834/2803 +f 2822/2834/2803 2821/2833/2802 2823/2835/2804 +f 2821/2833/2802 2517/2684/2653 2823/2835/2804 +f 2823/2835/2804 2674/2686/2655 2764/2777/2746 +f 2824/2836/2805 2823/2835/2804 2764/2777/2746 +f 2811/2822/2791 2809/2821/2790 2825/2837/2806 +f 2809/2821/2790 2807/2819/2788 2825/2837/2806 +f 2825/2837/2806 2827/2838/2807 2829/2839/2808 +f 2826/2840/2809 2825/2837/2806 2830/2841/2810 +f 2831/2842/2811 2832/2843/2812 2834/2844/2813 +f 2832/2843/2812 2835/2845/2814 2836/2846/2815 +f 2833/2847/2816 2836/2846/2815 2837/2848/2817 +f 2834/2844/2813 2833/2847/2816 2838/2849/2818 +f 2840/2850/2819 2841/2851/2820 2843/2852/2821 +f 2841/2851/2820 2837/2848/2817 2836/2846/2815 +f 2843/2852/2821 2842/2853/2822 2836/2846/2815 +f 2840/2850/2819 2844/2854/2823 2846/2855/2824 +f 2844/2854/2823 2847/2856/2825 2845/2857/2826 +f 2845/2857/2826 2848/2858/2827 2850/2859/2828 +f 2846/2855/2824 2845/2857/2826 2851/2860/2829 +f 2852/2861/2830 2853/2862/2831 2855/2863/2832 +f 2853/2862/2831 2856/2864/2833 2854/2865/2834 +f 2854/2865/2834 2857/2866/2835 2858/2867/2836 +f 2855/2863/2832 2854/2865/2834 2859/2868/2837 +f 2766/2869/2838 2765/2779/2748 2855/2863/2832 +f 2765/2779/2748 2660/2671/2640 2860/2870/2839 +f 2860/2870/2839 2663/2673/2642 2861/2871/2840 +f 2855/2863/2832 2860/2870/2839 2852/2861/2830 +f 2852/2861/2830 2861/2871/2840 2863/2872/2841 +f 2861/2871/2840 2654/2664/2633 2862/2873/2842 +f 2862/2873/2842 2657/2666/2635 2864/2874/2843 +f 2863/2872/2841 2862/2873/2842 2849/2875/2844 +f 2865/2876/2845 2866/2877/2846 2868/2878/2847 +f 2866/2877/2846 2869/2879/2848 2867/2880/2849 +f 2867/2880/2849 2870/2881/2850 2853/2862/2831 +f 2868/2878/2847 2867/2880/2849 2853/2862/2831 +f 2871/2882/2851 2872/2883/2852 2873/2884/2853 +f 2872/2883/2852 2875/2885/2854 2876/2886/2855 +f 2873/2884/2853 2876/2886/2855 2865/2876/2845 +f 2874/2887/2856 2873/2884/2853 2868/2878/2847 +f 2831/2842/2811 2877/2888/2857 2879/2889/2858 +f 2877/2888/2857 2875/2885/2854 2878/2890/2859 +f 2878/2890/2859 2872/2883/2852 2871/2882/2851 +f 2879/2889/2858 2878/2890/2859 2880/2891/2860 +f 2847/2856/2825 2880/2891/2860 2881/2892/2861 +f 2880/2891/2860 2871/2882/2851 2874/2887/2856 +f 2881/2892/2861 2874/2887/2856 2852/2861/2830 +f 2848/2858/2827 2881/2892/2861 2863/2872/2841 +f 2840/2850/2819 2843/2852/2821 2882/2893/2862 +f 2843/2852/2821 2835/2845/2814 2832/2843/2812 +f 2882/2893/2862 2832/2843/2812 2831/2842/2811 +f 2844/2854/2823 2882/2893/2862 2879/2889/2858 +f 2875/2885/2854 2877/2888/2857 2884/2894/2863 +f 2877/2888/2857 2831/2842/2811 2883/2895/2864 +f 2883/2895/2864 2834/2844/2813 2839/2896/2865 +f 2884/2894/2863 2883/2895/2864 2886/2897/2866 +f 2887/2898/2867 2888/2899/2868 2890/2900/2869 +f 2888/2899/2868 2891/2901/2870 2892/2902/2871 +f 2889/2903/2872 2892/2902/2871 2893/2904/2873 +f 2890/2900/2869 2889/2903/2872 2894/2905/2874 +f 2896/2906/2875 2897/2907/2876 2899/2908/2877 +f 2897/2907/2876 2900/2909/2878 2898/2910/2879 +f 2898/2910/2879 2901/2911/2880 2866/2877/2846 +f 2899/2908/2877 2898/2910/2879 2865/2876/2845 +f 2875/2885/2854 2884/2894/2863 2902/2912/2881 +f 2884/2894/2863 2886/2897/2866 2903/2913/2882 +f 2902/2912/2881 2903/2913/2882 2896/2906/2875 +f 2876/2886/2855 2902/2912/2881 2899/2908/2877 +f 2896/2906/2875 2903/2913/2882 2905/2914/2883 +f 2903/2913/2882 2886/2897/2866 2904/2915/2884 +f 2904/2915/2884 2906/2916/2885 2908/2917/2886 +f 2905/2914/2883 2904/2915/2884 2909/2918/2887 +f 2909/2918/2887 2910/2919/2888 2905/2914/2883 +f 2910/2919/2888 2912/2920/2889 2911/2921/2890 +f 2911/2921/2890 2913/2922/2891 2897/2907/2876 +f 2905/2914/2883 2911/2921/2890 2896/2906/2875 +f 2912/2920/2889 2910/2919/2888 2914/2923/2892 +f 2910/2919/2888 2909/2918/2887 2916/2924/2893 +f 2914/2923/2892 2916/2924/2893 2888/2899/2868 +f 2915/2925/2894 2914/2923/2892 2887/2898/2867 +f 2526/2536/2505 2525/2535/2504 2918/2926/2895 +f 2525/2535/2504 2524/2533/2502 2917/2927/2896 +f 2917/2927/2896 2814/2826/2795 2919/2928/2897 +f 2918/2926/2895 2917/2927/2896 2920/2929/2898 +f 2893/2904/2873 2921/2930/2899 2894/2905/2874 +f 2921/2930/2899 2920/2929/2898 2922/2931/2900 +f 2922/2931/2900 2919/2928/2897 2923/2932/2901 +f 2894/2905/2874 2922/2931/2900 2895/2933/2902 +f 2924/2934/2903 2925/2935/2904 2926/2936/2905 +f 2925/2935/2904 2928/2937/2906 2929/2938/2907 +f 2926/2936/2905 2929/2938/2907 2526/2536/2505 +f 2927/2939/2908 2926/2936/2905 2918/2926/2895 +f 2797/2808/2777 2930/2940/2909 2931/2941/2910 +f 2930/2940/2909 2924/2934/2903 2932/2942/2911 +f 2931/2941/2910 2932/2942/2911 2933/2943/2912 +f 2802/2814/2783 2931/2941/2910 2934/2944/2913 +f 2526/2536/2505 2929/2938/2907 2527/2537/2506 +f 2929/2938/2907 2928/2937/2906 2935/2945/2914 +f 2935/2945/2914 2936/2946/2915 2937/2947/2916 +f 2527/2537/2506 2935/2945/2914 2513/2523/2492 +f 2797/2808/2777 2795/2807/2776 2940/2948/2917 +f 2795/2807/2776 2487/2500/2469 2939/2949/2918 +f 2939/2949/2918 2486/2499/2468 2477/2491/2460 +f 2940/2948/2917 2939/2949/2918 2937/2947/2916 +f 2937/2947/2916 2941/2950/2919 2943/2951/2920 +f 2941/2950/2919 2477/2491/2460 2476/2952/2921 +f 2942/2953/2922 2476/2952/2921 2944/2954/2923 +f 2943/2951/2920 2942/2953/2922 2944/2954/2923 +f 2515/2696/2665 2514/2524/2493 2945/2955/2924 +f 2514/2524/2493 2513/2523/2492 2938/2956/2925 +f 2945/2955/2924 2938/2956/2925 2943/2951/2920 +f 2702/2716/2685 2945/2955/2924 2703/2957/2926 +f 2937/2947/2916 2936/2946/2915 2940/2948/2917 +f 2936/2946/2915 2928/2937/2906 2946/2958/2927 +f 2946/2958/2927 2925/2935/2904 2930/2940/2909 +f 2940/2948/2917 2946/2958/2927 2930/2940/2909 +f 2924/2934/2903 2927/2939/2908 2932/2942/2911 +f 2927/2939/2908 2920/2929/2898 2947/2959/2928 +f 2947/2959/2928 2921/2930/2899 2893/2904/2873 +f 2932/2942/2911 2947/2959/2928 2948/2960/2929 +f 2807/2819/2788 2806/2818/2787 2827/2838/2807 +f 2806/2818/2787 2805/2817/2786 2949/2961/2930 +f 2949/2961/2930 2950/2962/2931 2952/2963/2932 +f 2827/2838/2807 2949/2961/2930 2828/2964/2933 +f 2805/2817/2786 2803/2815/2784 2953/2965/2934 +f 2803/2815/2784 2799/2811/2780 2934/2944/2913 +f 2953/2965/2934 2934/2944/2913 2933/2943/2912 +f 2950/2962/2931 2953/2965/2934 2954/2966/2935 +f 2951/2967/2936 2955/2968/2937 2957/2969/2938 +f 2955/2968/2937 2958/2970/2939 2956/2971/2940 +f 2956/2971/2940 2959/2972/2941 2960/2973/2942 +f 2957/2969/2938 2956/2971/2940 2961/2974/2943 +f 2907/2975/2944 2962/2976/2945 2963/2977/2946 +f 2962/2976/2945 2965/2978/2947 2966/2979/2948 +f 2963/2977/2946 2966/2979/2948 2958/2970/2939 +f 2964/2980/2949 2963/2977/2946 2967/2981/2950 +f 2933/2943/2912 2969/2982/2951 2954/2966/2935 +f 2969/2982/2951 2968/2983/2952 2970/2984/2953 +f 2970/2984/2953 2967/2981/2950 2955/2968/2937 +f 2954/2966/2935 2970/2984/2953 2951/2967/2936 +f 2893/2904/2873 2892/2902/2871 2948/2960/2929 +f 2892/2902/2871 2891/2901/2870 2971/2985/2954 +f 2971/2985/2954 2972/2986/2955 2969/2982/2951 +f 2948/2960/2929 2971/2985/2954 2933/2943/2912 +f 2909/2918/2887 2908/2917/2886 2916/2924/2893 +f 2908/2917/2886 2907/2975/2944 2973/2987/2956 +f 2973/2987/2956 2964/2980/2949 2968/2983/2952 +f 2916/2924/2893 2973/2987/2956 2972/2986/2955 +f 2839/2896/2865 2974/2988/2957 2885/2989/2958 +f 2974/2988/2957 2965/2978/2947 2975/2990/2959 +f 2975/2990/2959 2962/2976/2945 2906/2916/2885 +f 2885/2989/2958 2975/2990/2959 2886/2897/2866 +f 2958/2970/2939 2966/2979/2948 2959/2972/2941 +f 2966/2979/2948 2965/2978/2947 2976/2991/2960 +f 2976/2991/2960 2974/2988/2957 2839/2896/2865 +f 2959/2972/2941 2976/2991/2960 2838/2849/2818 +f 2837/2848/2817 2841/2851/2820 2977/2992/2961 +f 2841/2851/2820 2840/2850/2819 2977/2992/2961 +f 2977/2992/2961 2846/2855/2824 2978/2993/2962 +f 2960/2973/2942 2977/2992/2961 2978/2993/2962 +f 2979/2994/2963 2980/2995/2964 2982/2996/2965 +f 2980/2995/2964 2961/2974/2943 2981/2997/2966 +f 2981/2997/2966 2978/2993/2962 2983/2998/2967 +f 2982/2996/2965 2981/2997/2966 2984/2999/2968 +f 2961/2974/2943 2980/2995/2964 2957/2969/2938 +f 2980/2995/2964 2979/2994/2963 2985/3000/2969 +f 2985/3000/2969 2986/3001/2970 2828/2964/2933 +f 2957/2969/2938 2985/3000/2969 2952/2963/2932 +f 2828/2964/2933 2986/3001/2970 2987/3002/2971 +f 2986/3001/2970 2979/2994/2963 2982/2996/2965 +f 2987/3002/2971 2982/2996/2965 2984/2999/2968 +f 2829/2839/2808 2987/3002/2971 2988/3003/2972 +f 2008/2033/2002 2989/3004/2973 2023/2048/2017 +f 2989/3004/2973 2811/2822/2791 2990/3005/2974 +f 2990/3005/2974 2826/2840/2809 2991/3006/2975 +f 2023/2048/2017 2990/3005/2974 2024/3007/2976 +f 2992/3008/2977 2993/3009/2978 2994/3010/2979 +f 2993/3009/2978 2996/3011/2980 2994/3010/2979 +f 2994/3010/2979 2997/3012/2981 2998/3013/2982 +f 2995/3014/2983 2994/3010/2979 2999/3015/2984 +f 3001/3016/2985 3002/3017/2986 3003/3018/2987 +f 3002/3017/2986 3005/3019/2988 3006/3020/2989 +f 3003/3018/2987 3006/3020/2989 3008/3021/2990 +f 3004/3022/2991 3003/3018/2987 2998/3013/2982 +f 2998/3013/2982 2997/3012/2981 3009/3023/2992 +f 2997/3012/2981 2996/3011/2980 3010/3024/2993 +f 3009/3023/2992 3010/3024/2993 3011/3025/2994 +f 3004/3022/2991 3009/3023/2992 3012/3026/2995 +f 3011/3025/2994 3010/3024/2993 3014/3027/2996 +f 3010/3024/2993 2996/3011/2980 2993/3009/2978 +f 3013/3028/2997 2993/3009/2978 2992/3008/2977 +f 3014/3027/2996 3013/3028/2997 3016/3029/2998 +f 3017/3030/2999 3018/3031/3000 3020/3032/3001 +f 3018/3031/3000 3011/3025/2994 3019/3033/3002 +f 3019/3033/3002 3014/3027/2996 3021/3034/3003 +f 3020/3032/3001 3019/3033/3002 2432/2448/2417 +f 3022/3035/3004 3023/3036/3005 3025/3037/3006 +f 3023/3036/3005 3001/3016/2985 3024/3038/3007 +f 3024/3038/3007 3012/3026/2995 3011/3025/2994 +f 3025/3037/3006 3024/3038/3007 3017/3030/2999 +f 3026/3039/3008 3027/3040/3009 3029/3041/3010 +f 3027/3040/3009 3030/3042/3011 3031/3043/3012 +f 3028/3044/3013 3031/3043/3012 3032/3045/3014 +f 3029/3041/3010 3028/3044/3013 3033/3046/3015 +f 3022/3035/3004 3035/3047/3016 3036/3048/3017 +f 3035/3047/3016 3038/3049/3018 3039/3050/3019 +f 3036/3048/3017 3039/3050/3019 3026/3039/3008 +f 3037/3051/3020 3036/3048/3017 3029/3041/3010 +f 3007/3052/3021 3040/3053/3022 3041/3054/3023 +f 3040/3053/3022 3043/3055/3024 3041/3054/3023 +f 3041/3054/3023 3044/3056/3025 3046/3057/3026 +f 3042/3058/3027 3041/3054/3023 3046/3057/3026 +f 3047/3059/3028 3046/3057/3026 3048/3060/3029 +f 3046/3057/3026 3045/3061/3030 3050/3062/3031 +f 3048/3060/3029 3050/3062/3031 69/66/66 +f 3049/3063/3032 3048/3060/3029 106/101/101 +f 3043/3055/3024 3051/3064/3033 3044/3056/3025 +f 3051/3064/3033 3034/3065/3034 3052/3066/3035 +f 3052/3066/3035 3033/3046/3015 3053/3067/3036 +f 3044/3056/3025 3052/3066/3035 3045/3061/3030 +f 3032/3045/3014 3031/3043/3012 3054/3068/3037 +f 3031/3043/3012 3030/3042/3011 3054/3068/3037 +f 3054/3068/3037 3055/3069/3038 3057/3070/3039 +f 3053/3067/3036 3054/3068/3037 3057/3070/3039 +f 3056/3071/3040 3055/3069/3038 3058/3072/3041 +f 3055/3069/3038 3030/3042/3011 3027/3040/3009 +f 3058/3072/3041 3027/3040/3009 3026/3039/3008 +f 3059/3073/3042 3058/3072/3041 3060/3074/3043 +f 3026/3039/3008 3039/3050/3019 3060/3074/3043 +f 3039/3050/3019 3038/3049/3018 3062/3075/3044 +f 3062/3075/3044 3063/3076/3045 3065/3077/3046 +f 3060/3074/3043 3062/3075/3044 3061/3078/3047 +f 3066/3079/3048 3067/3080/3049 3068/3081/3050 +f 3067/3080/3049 3017/3030/2999 3020/3032/3001 +f 3068/3081/3050 3020/3032/3001 2432/2448/2417 +f 3069/3082/3051 3068/3081/3050 2429/2446/2415 +f 3070/3083/3052 3071/3084/3053 3072/3085/3054 +f 3071/3084/3053 3074/3086/3055 3075/3087/3056 +f 3072/3085/3054 3075/3087/3056 3066/3079/3048 +f 3073/3088/3057 3072/3085/3054 3076/3089/3058 +f 3017/3030/2999 3067/3080/3049 3078/3090/3059 +f 3067/3080/3049 3066/3079/3048 3075/3087/3056 +f 3078/3090/3059 3075/3087/3056 3074/3086/3055 +f 3025/3037/3006 3078/3090/3059 3079/3091/3060 +f 3077/3092/3061 3076/3089/3058 3081/3093/3062 +f 3076/3089/3058 3066/3079/3048 3069/3082/3051 +f 3080/3094/3063 3069/3082/3051 2428/2445/2414 +f 3081/3093/3062 3080/3094/3063 3083/3095/3064 +f 3083/3095/3064 3082/3096/3065 3084/3097/3066 +f 3082/3096/3065 2428/2445/2414 3084/3097/3066 +f 3084/3097/3066 2431/2447/2416 3086/3098/3067 +f 3085/3099/3068 3084/3097/3066 3086/3098/3067 +f 3087/3100/3069 3086/3098/3067 3089/3101/3070 +f 3086/3098/3067 2420/2438/2407 3088/3102/3071 +f 3088/3102/3071 2423/2440/2409 2416/2435/2404 +f 3089/3101/3070 3088/3102/3071 2416/2435/2404 +f 2338/2356/2325 2361/2376/2345 3090/3103/3072 +f 2361/2376/2345 2363/2379/2348 3091/3104/3073 +f 3090/3103/3072 3091/3104/3073 3087/3100/3069 +f 2339/2357/2326 3090/3103/3072 3089/3101/3070 +f 3087/3100/3069 3091/3104/3073 3085/3099/3068 +f 3091/3104/3073 2363/2379/2348 3092/3105/3074 +f 3092/3105/3074 3093/3106/3075 3095/3107/3076 +f 3085/3099/3068 3092/3105/3074 3083/3095/3064 +f 3096/3108/3077 3097/3109/3078 3098/3110/3079 +f 3097/3109/3078 2461/2476/2445 2464/2482/2451 +f 3098/3110/3079 2464/2482/2451 2468/3111/3080 +f 3099/3112/3081 3098/3110/3079 3100/3113/3082 +f 2363/2379/2348 2362/2378/2347 3093/3106/3075 +f 2362/2378/2347 2358/2374/2343 3102/3114/3083 +f 3102/3114/3083 3103/3115/3084 3105/3116/3085 +f 3093/3106/3075 3102/3114/3083 3094/3117/3086 +f 2358/2374/2343 2357/2373/2342 3103/3115/3084 +f 2357/2373/2342 2356/3118/3087 3106/3119/3088 +f 3106/3119/3088 2699/2713/2682 3107/3120/3089 +f 3103/3115/3084 3106/3119/3088 3104/3121/3090 +f 3104/3121/3090 3107/3120/3089 3108/3122/3091 +f 3107/3120/3089 2442/2458/2427 2441/2456/2425 +f 3108/3122/3091 2441/2456/2425 2440/2479/2448 +f 3109/3123/3092 3108/3122/3091 2462/2477/2446 +f 3094/3117/3086 3105/3116/3085 3110/3124/3093 +f 3105/3116/3085 3104/3121/3090 3109/3123/3092 +f 3110/3124/3093 3109/3123/3092 2461/2476/2445 +f 3111/3125/3094 3110/3124/3093 3097/3109/3078 +f 3083/3095/3064 3095/3107/3076 3112/3126/3095 +f 3095/3107/3076 3094/3117/3086 3111/3125/3094 +f 3112/3126/3095 3111/3125/3094 3096/3108/3077 +f 3081/3093/3062 3112/3126/3095 3077/3092/3061 +f 3096/3108/3077 3099/3112/3081 3113/3127/3096 +f 3099/3112/3081 3101/3128/3097 3114/3129/3098 +f 3114/3129/3098 3115/3130/3099 3070/3083/3052 +f 3113/3127/3096 3114/3129/3098 3073/3088/3057 +f 2789/2800/2769 3116/3131/3100 3117/3132/3101 +f 3116/3131/3100 3118/3133/3102 3119/3134/3103 +f 3117/3132/3101 3119/3134/3103 3120/3135/3104 +f 2790/2802/2771 3117/3132/3101 3121/3136/3105 +f 3061/3078/3047 3065/3077/3046 3123/3137/3106 +f 3065/3077/3046 3064/3138/3107 3122/3139/3108 +f 3122/3139/3108 3124/3140/3109 3126/3141/3110 +f 3123/3137/3106 3122/3139/3108 3127/3142/3111 +f 3128/3143/3112 3129/3144/3113 3131/3145/3114 +f 3129/3144/3113 2767/2780/2749 2812/2823/2792 +f 3130/3146/3115 2812/2823/2792 2811/2822/2791 +f 3131/3145/3114 3130/3146/3115 3133/3147/3116 +f 3118/3133/3102 3116/3131/3100 3135/3148/3117 +f 3116/3131/3100 2789/2800/2769 2788/2799/2768 +f 3134/3149/3118 2788/2799/2768 3136/3150/3119 +f 3135/3148/3117 3134/3149/3118 3128/3143/3112 +f 2784/2795/2764 2783/2794/2763 3136/3150/3119 +f 2783/2794/2763 2771/2783/2752 2768/2781/2750 +f 3137/3151/3120 2768/2781/2750 2767/2780/2749 +f 3136/3150/3119 3137/3151/3120 3129/3144/3113 +f 3138/3152/3121 3139/3153/3122 3141/3154/3123 +f 3139/3153/3122 2468/3111/3080 3140/3155/3124 +f 3140/3155/3124 2467/2483/2452 2691/2705/2674 +f 3141/3154/3123 3140/3155/3124 2489/2704/2673 +f 2791/3156/3125 3121/3136/3105 3142/3157/3126 +f 3121/3136/3105 3120/3135/3104 3143/3158/3127 +f 3142/3157/3126 3143/3158/3127 3138/3152/3121 +f 2794/2805/2774 3142/3157/3126 3141/3154/3123 +f 2468/3111/3080 3139/3153/3122 3100/3113/3082 +f 3139/3153/3122 3138/3152/3121 3144/3159/3128 +f 3144/3159/3128 3145/3160/3129 3147/3161/3130 +f 3100/3113/3082 3144/3159/3128 3101/3128/3097 +f 3138/3152/3121 3143/3158/3127 3145/3160/3129 +f 3143/3158/3127 3120/3135/3104 3148/3162/3131 +f 3148/3162/3131 3119/3134/3103 3118/3133/3102 +f 3145/3160/3129 3148/3162/3131 3146/3163/3132 +f 3127/3142/3111 3126/3141/3110 3150/3164/3133 +f 3126/3141/3110 3125/3165/3134 3152/3166/3135 +f 3150/3164/3133 3152/3166/3135 3146/3163/3132 +f 3151/3167/3136 3150/3164/3133 3149/3168/3137 +f 3101/3128/3097 3147/3161/3130 3115/3130/3099 +f 3147/3161/3130 3146/3163/3132 3153/3169/3138 +f 3153/3169/3138 3152/3166/3135 3125/3165/3134 +f 3115/3130/3099 3153/3169/3138 3070/3083/3052 +f 3125/3165/3134 3124/3140/3109 3155/3170/3139 +f 3124/3140/3109 3064/3138/3107 3156/3171/3140 +f 3155/3170/3139 3156/3171/3140 3074/3086/3055 +f 3154/3172/3141 3155/3170/3139 3071/3084/3053 +f 3064/3138/3107 3063/3076/3045 3157/3173/3142 +f 3063/3076/3045 3038/3049/3018 3035/3047/3016 +f 3157/3173/3142 3035/3047/3016 3022/3035/3004 +f 3156/3171/3140 3157/3173/3142 3079/3091/3060 +f 3034/3065/3034 3158/3174/3143 3037/3051/3020 +f 3158/3174/3143 3005/3019/2988 3159/3175/3144 +f 3159/3175/3144 3002/3017/2986 3023/3036/3005 +f 3037/3051/3020 3159/3175/3144 3022/3035/3004 +f 3034/3065/3034 3051/3064/3033 3158/3174/3143 +f 3051/3064/3033 3043/3055/3024 3160/3176/3145 +f 3160/3176/3145 3040/3053/3022 3006/3020/2989 +f 3158/3174/3143 3160/3176/3145 3005/3019/2988 +f 3000/3177/3146 2999/3015/2984 3161/3178/3147 +f 2999/3015/2984 2998/3013/2982 3008/3021/2990 +f 3161/3178/3147 3008/3021/2990 3042/3058/3027 +f 3162/3179/3148 3161/3178/3147 3047/3059/3028 +f 117/114/114 3163/3180/3149 118/115/115 +f 3163/3180/3149 3000/3177/3146 3164/3181/3150 +f 3164/3181/3150 3162/3179/3148 3047/3059/3028 +f 118/115/115 3164/3181/3150 3049/3063/3032 +f 3165/3182/3151 3166/3183/3152 3168/3184/3153 +f 3166/3183/3152 3169/3185/3154 3170/3186/3155 +f 3167/3187/3156 3170/3186/3155 3171/3188/3157 +f 3168/3184/3153 3167/3187/3156 3173/3189/3158 +f 3174/3190/3159 3175/3191/3160 3176/3192/3161 +f 3175/3191/3160 2992/3008/2977 2995/3014/2983 +f 3176/3192/3161 2995/3014/2983 3178/3193/3162 +f 3177/3194/3163 3176/3192/3161 3178/3193/3162 +f 3171/3188/3157 3178/3193/3162 3180/3195/3164 +f 3178/3193/3162 3000/3177/3146 3163/3180/3149 +f 3179/3196/3165 3163/3180/3149 117/114/114 +f 3180/3195/3164 3179/3196/3165 128/124/124 +f 3173/3189/3158 3172/3197/3166 3182/3198/3167 +f 3172/3197/3166 3171/3188/3157 3181/3199/3168 +f 3181/3199/3168 3180/3195/3164 127/123/123 +f 3182/3198/3167 3181/3199/3168 131/127/127 +f 3183/3200/3169 3184/3201/3170 3186/3202/3171 +f 3184/3201/3170 3187/3203/3172 3188/3204/3173 +f 3185/3205/3174 3188/3204/3173 3169/3185/3154 +f 3186/3202/3171 3185/3205/3174 3190/3206/3175 +f 2424/2441/2410 3191/3207/3176 3192/3208/3177 +f 3191/3207/3176 3193/3209/3178 3194/3210/3179 +f 3192/3208/3177 3194/3210/3179 3183/3200/3169 +f 2425/2442/2411 3192/3208/3177 3195/3211/3180 +f 2432/2448/2417 3021/3034/3003 3196/3212/3181 +f 3021/3034/3003 3016/3029/2998 3196/3212/3181 +f 3196/3212/3181 3197/3213/3182 3193/3209/3178 +f 2433/2449/2418 3196/3212/3181 3191/3207/3176 +f 3174/3190/3159 3198/3214/3183 3175/3191/3160 +f 3198/3214/3183 3193/3209/3178 3197/3213/3182 +f 3199/3215/3184 3197/3213/3182 3016/3029/2998 +f 3175/3191/3160 3199/3215/3184 2992/3008/2977 +f 3174/3190/3159 3200/3216/3185 3201/3217/3186 +f 3200/3216/3185 3187/3203/3172 3184/3201/3170 +f 3201/3217/3186 3184/3201/3170 3194/3210/3179 +f 3198/3214/3183 3201/3217/3186 3194/3210/3179 +f 3169/3185/3154 3188/3204/3173 3170/3186/3155 +f 3188/3204/3173 3187/3203/3172 3202/3218/3187 +f 3202/3218/3187 3200/3216/3185 3174/3190/3159 +f 3170/3186/3155 3202/3218/3187 3177/3194/3163 +f 3165/3182/3151 3203/3219/3188 3205/3220/3189 +f 3203/3219/3188 3206/3221/3190 3207/3222/3191 +f 3204/3223/3192 3207/3222/3191 3208/3224/3193 +f 3205/3220/3189 3204/3223/3192 3209/3225/3194 +f 2417/2436/2405 2427/3226/3195 3211/3227/3196 +f 2427/3226/3195 2426/2444/2413 3212/3228/3197 +f 3211/3227/3196 3212/3228/3197 3213/3229/3198 +f 2418/3230/3199 3211/3227/3196 3214/3231/3200 +f 2426/2444/2413 3195/3211/3180 3215/3232/3201 +f 3195/3211/3180 3183/3200/3169 3186/3202/3171 +f 3215/3232/3201 3186/3202/3171 3190/3206/3175 +f 3212/3228/3197 3215/3232/3201 3216/3233/3202 +f 3217/3234/3203 3218/3235/3204 3219/3236/3205 +f 3218/3235/3204 3221/3237/3206 3222/3238/3207 +f 3219/3236/3205 3222/3238/3207 2478/2492/2461 +f 3220/3239/3208 3219/3236/3205 2481/2494/2463 +f 2371/2393/2362 3223/3240/3209 3224/3241/3210 +f 3223/3240/3209 3217/3234/3203 3220/3239/3208 +f 3224/3241/3210 3220/3239/3208 2446/2462/2431 +f 2376/2395/2364 3224/3241/3210 2443/2460/2429 +f 2371/2393/2362 2370/2389/2358 3223/3240/3209 +f 2370/2389/2358 2342/2387/2356 3225/3242/3211 +f 3225/3242/3211 2415/2433/2402 3226/3243/3212 +f 3223/3240/3209 3225/3242/3211 3217/3234/3203 +f 2419/2437/2406 3214/3231/3200 3227/3244/3213 +f 3214/3231/3200 3213/3229/3198 3228/3245/3214 +f 3227/3244/3213 3228/3245/3214 3221/3237/3206 +f 3226/3243/3212 3227/3244/3213 3218/3235/3204 +f 3221/3237/3206 3229/3246/3215 3230/3247/3216 +f 3229/3246/3215 3210/3248/3217 3230/3247/3216 +f 3230/3247/3216 3209/3225/3194 3231/3249/3218 +f 3222/3238/3207 3230/3247/3216 3231/3249/3218 +f 3213/3229/3198 3216/3233/3202 3232/3250/3219 +f 3216/3233/3202 3190/3206/3175 3233/3251/3220 +f 3232/3250/3219 3233/3251/3220 3229/3246/3215 +f 3228/3245/3214 3232/3250/3219 3229/3246/3215 +f 3165/3182/3151 3205/3220/3189 3234/3252/3221 +f 3205/3220/3189 3210/3248/3217 3234/3252/3221 +f 3234/3252/3221 3233/3251/3220 3189/3253/3222 +f 3166/3183/3152 3234/3252/3221 3169/3185/3154 +f 3235/3254/3223 3236/3255/3224 3238/3256/3225 +f 3236/3255/3224 3206/3221/3190 3237/3257/3226 +f 3237/3257/3226 3203/3219/3188 3165/3182/3151 +f 3238/3256/3225 3237/3257/3226 3168/3184/3153 +f 3173/3189/3158 3239/3258/3227 3238/3256/3225 +f 3239/3258/3227 3241/3259/3228 3242/3260/3229 +f 3238/3256/3225 3240/3261/3230 3235/3254/3223 +f 2851/2860/2829 3243/3262/3231 3244/3263/3232 +f 3243/3262/3231 2309/2330/2299 3244/3263/3232 +f 3244/3263/3232 2311/2334/2303 2297/2318/2287 +f 2983/2998/2967 3244/3263/3232 3245/3264/3233 +f 2849/2875/2844 3246/3265/3234 3247/3266/3235 +f 3246/3265/3234 2301/2323/2292 2304/2325/2294 +f 3247/3266/3235 2304/2325/2294 3243/3262/3231 +f 2850/2859/2828 3247/3266/3235 3243/3262/3231 +f 2578/2670/2639 2577/2584/2553 3248/3267/3236 +f 2577/2584/2553 2576/2591/2560 3248/3267/3236 +f 3248/3267/3236 3249/3268/3237 3246/3265/3234 +f 2864/2874/2843 3248/3267/3236 3246/3265/3234 +f 2576/2591/2560 2583/2590/2559 3249/3268/3237 +f 2583/2590/2559 2493/2505/2474 3250/3269/3238 +f 3250/3269/3238 2490/2503/2472 2302/2324/2293 +f 3249/3268/3237 3250/3269/3238 2301/2323/2292 +f 3251/3270/3239 3252/3271/3240 3254/3272/3241 +f 3252/3271/3240 3255/3273/3242 3253/3274/3243 +f 3253/3274/3243 3256/3275/3244 3257/3276/3245 +f 3254/3272/3241 3253/3274/3243 3258/3277/3246 +f 3208/3224/3193 3259/3278/3247 3260/3279/3248 +f 3259/3278/3247 3255/3273/3242 3261/3280/3249 +f 3260/3279/3248 3261/3280/3249 2479/2493/2462 +f 3231/3249/3218 3260/3279/3248 2478/2492/2461 +f 3255/3273/3242 3259/3278/3247 3262/3281/3250 +f 3259/3278/3247 3208/3224/3193 3262/3281/3250 +f 3262/3281/3250 3207/3222/3191 3236/3255/3224 +f 3256/3275/3244 3262/3281/3250 3235/3254/3223 +f 2482/2495/2464 3263/3282/3251 2483/2497/2466 +f 3263/3282/3251 3265/3283/3252 3264/3284/3253 +f 3264/3284/3253 3266/3285/3254 2594/2602/2571 +f 2483/2497/2466 3264/3284/3253 2448/2464/2433 +f 3255/3273/3242 3252/3271/3240 3267/3286/3255 +f 3252/3271/3240 3251/3270/3239 3267/3286/3255 +f 3267/3286/3255 3268/3287/3256 3263/3282/3251 +f 3261/3280/3249 3267/3286/3255 3263/3282/3251 +f 2299/2320/2289 3269/3288/3257 3270/3289/3258 +f 3269/3288/3257 3251/3270/3239 3270/3289/3258 +f 3270/3289/3258 3254/3272/3241 3272/3290/3259 +f 3271/3291/3260 3270/3289/3258 3272/3290/3259 +f 2024/3007/2976 2991/3006/2975 3273/3292/3261 +f 2991/3006/2975 2830/2841/2810 2988/3003/2972 +f 3273/3292/3261 2988/3003/2972 2984/2999/2968 +f 3274/3293/3262 3273/3292/3261 3275/3294/3263 +f 2984/2999/2968 3245/3264/3233 3275/3294/3263 +f 3245/3264/3233 2297/2318/2287 3277/3295/3264 +f 2293/2315/2284 3278/3296/3265 2294/2316/2285 +f 3275/3294/3263 3277/3295/3264 3276/3297/3266 +f 3056/3071/3040 3059/3073/3042 3280/3298/3267 +f 3059/3073/3042 3061/3078/3047 3279/3299/3268 +f 3279/3299/3268 3123/3137/3106 3281/3300/3269 +f 3280/3298/3267 3279/3299/3268 3133/3147/3116 +f 3118/3133/3102 3135/3148/3117 3282/3301/3270 +f 3135/3148/3117 3128/3143/3112 3282/3301/3270 +f 3282/3301/3270 3131/3145/3114 3281/3300/3269 +f 3151/3167/3136 3282/3301/3270 3127/3142/3111 +f 71/2030/1999 3283/3302/3271 2006/2031/2000 +f 3283/3302/3271 3133/3147/3116 3132/3303/3272 +f 3284/3304/3273 3132/3303/3272 2811/2822/2791 +f 2006/2031/2000 3284/3304/3273 2008/2033/2002 +f 3056/3071/3040 3280/3298/3267 3285/3305/3274 +f 3280/3298/3267 3133/3147/3116 3283/3302/3271 +f 3285/3305/3274 3283/3302/3271 71/2030/1999 +f 3286/3306/3275 3285/3305/3274 70/68/68 +f 3045/3061/3030 3057/3070/3039 3287/3307/3276 +f 3057/3070/3039 3056/3071/3040 3286/3306/3275 +f 3050/3062/3031 3287/3307/3276 69/66/66 +f 2299/2320/2289 3271/3291/3260 2300/2322/2291 +f 3271/3291/3260 3241/3259/3228 3288/3308/3277 +f 3288/3308/3277 3289/3309/3278 773/768/768 +f 2300/2322/2291 3288/3308/3277 772/767/767 +f 776/770/770 3289/3309/3278 3290/3310/3279 +f 3289/3309/3278 3241/3259/3228 3239/3258/3227 +f 3290/3310/3279 3239/3258/3227 3173/3189/3158 +f 779/773/773 3290/3310/3279 3182/3198/3167 +f 3235/3254/3223 3242/3260/3229 3291/3311/3280 +f 3242/3260/3229 3241/3259/3228 3291/3311/3280 +f 3257/3276/3245 3291/3311/3280 3258/3277/3246 +f 2307/2329/2298 2521/2531/2500 3292/3312/3281 +f 2521/2531/2500 2520/2530/2499 3292/3312/3281 +f 3292/3312/3281 2585/2593/2562 2584/2592/2561 +f 3293/3313/3282 3292/3312/3281 3266/3285/3254 +f 3265/3283/3252 3294/3314/3283 3293/3313/3282 +f 3294/3314/3283 2299/2320/2289 3295/3315/3284 +f 3293/3313/3282 3295/3315/3284 2307/2329/2298 +f 2299/2320/2289 3294/3314/3283 3269/3288/3257 +f 3294/3314/3283 3265/3283/3252 3268/3287/3256 +f 3269/3288/3257 3296/3316/3285 3251/3270/3239 +f 3297/3317/3286 3298/3318/3287 3300/3319/3288 +f 3298/3318/3287 3301/3320/3289 3299/3321/3290 +f 3299/3321/3290 3302/3322/3291 3304/3323/3292 +f 3300/3319/3288 3299/3321/3290 1497/1522/1491 +f 3305/3324/3293 3306/3325/3294 3308/3326/3295 +f 3306/3325/3294 3309/3327/3296 3310/3328/3297 +f 3307/3329/3298 3310/3328/3297 3311/3330/3299 +f 3308/3326/3295 3307/3329/3298 3313/3331/3300 +f 3297/3317/3286 3314/3332/3301 3298/3318/3287 +f 3314/3332/3301 3305/3324/3293 3308/3326/3295 +f 3315/3333/3302 3308/3326/3295 3316/3334/3303 +f 3298/3318/3287 3315/3333/3302 3301/3320/3289 +f 3317/3335/3304 3318/3336/3305 3319/3337/3306 +f 3318/3336/3305 3321/3338/3307 3322/3339/3308 +f 3319/3337/3306 3322/3339/3308 3323/3340/3309 +f 3320/3341/3310 3319/3337/3306 3324/3342/3311 +f 3326/3343/3312 3327/3344/3313 3329/3345/3314 +f 3327/3344/3313 3323/3340/3309 3322/3339/3308 +f 3328/3346/3315 3322/3339/3308 3321/3338/3307 +f 3329/3345/3314 3328/3346/3315 3330/3347/3316 +f 3332/3348/3317 3333/3349/3318 3335/3350/3319 +f 3333/3349/3318 3331/3351/3320 3334/3352/3321 +f 3334/3352/3321 3330/3347/3316 3336/3353/3322 +f 3335/3350/3319 3334/3352/3321 3337/3354/3323 +f 3338/3355/3324 3339/3356/3325 3341/3357/3326 +f 3339/3356/3325 3342/3358/3327 3340/3359/3328 +f 3340/3359/3328 3343/3360/3329 3345/3361/3330 +f 3341/3357/3326 3340/3359/3328 3346/3362/3331 +f 3344/3363/3332 3347/3364/3333 3349/3365/3334 +f 3347/3364/3333 3350/3366/3335 3348/3367/3336 +f 3348/3367/3336 3351/3368/3337 3353/3369/3338 +f 3349/3365/3334 3348/3367/3336 3354/3370/3339 +f 3355/3371/3340 3356/3372/3341 3357/3373/3342 +f 3356/3372/3341 3332/3348/3317 3359/3374/3343 +f 3357/3373/3342 3359/3374/3343 3360/3375/3344 +f 3358/3376/3345 3357/3373/3342 3361/3377/3346 +f 3362/3378/3347 3361/3377/3346 3363/3379/3348 +f 3361/3377/3346 3360/3375/3344 3365/3380/3349 +f 3363/3379/3348 3365/3380/3349 3342/3358/3327 +f 3364/3381/3350 3363/3379/3348 3366/3382/3351 +f 3360/3375/3344 3359/3374/3343 3369/3383/3352 +f 3359/3374/3343 3332/3348/3317 3368/3384/3353 +f 3368/3384/3353 3335/3350/3319 3370/3385/3354 +f 3369/3383/3352 3368/3384/3353 3350/3366/3335 +f 3342/3358/3327 3365/3380/3349 3343/3360/3329 +f 3365/3380/3349 3360/3375/3344 3371/3386/3355 +f 3371/3386/3355 3369/3383/3352 3347/3364/3333 +f 3343/3360/3329 3371/3386/3355 3344/3363/3332 +f 3346/3362/3331 3345/3361/3330 3373/3387/3356 +f 3345/3361/3330 3344/3363/3332 3372/3388/3357 +f 3372/3388/3357 3349/3365/3334 3374/3389/3358 +f 3373/3387/3356 3372/3388/3357 3375/3390/3359 +f 3375/3390/3359 3374/3389/3358 3377/3391/3360 +f 3374/3389/3358 3354/3370/3339 3376/3392/3361 +f 3376/3392/3361 3378/3393/3362 3380/3394/3363 +f 3377/3391/3360 3376/3392/3361 3381/3395/3364 +f 3354/3370/3339 3353/3369/3338 3378/3393/3362 +f 3353/3369/3338 3352/3396/3365 3382/3397/3366 +f 3382/3397/3366 3383/3398/3367 3384/3399/3368 +f 3378/3393/3362 3382/3397/3366 3379/3400/3369 +f 3386/3401/3370 3387/3402/3371 3388/3403/3372 +f 3387/3402/3371 3390/3404/3373 3391/3405/3374 +f 3388/3403/3372 3391/3405/3374 3392/3406/3375 +f 3389/3407/3376 3388/3403/3372 3393/3408/3377 +f 3394/3409/3378 3395/3410/3379 3389/3407/3376 +f 3395/3410/3379 3397/3411/3380 3396/3412/3381 +f 3396/3412/3381 3398/3413/3382 3400/3414/3383 +f 3389/3407/3376 3396/3412/3381 3386/3401/3370 +f 3399/3415/3384 3401/3416/3385 3402/3417/3386 +f 3401/3416/3385 3403/3418/3387 3404/3419/3388 +f 3402/3417/3386 3404/3419/3388 3317/3335/3304 +f 3400/3414/3383 3402/3417/3386 3405/3420/3389 +f 3384/3399/3368 3406/3421/3390 3407/3422/3391 +f 3406/3421/3390 3399/3415/3384 3398/3413/3382 +f 3407/3422/3391 3398/3413/3382 3397/3411/3380 +f 3408/3423/3392 3407/3422/3391 3409/3424/3393 +f 3352/3396/3365 3411/3425/3394 3412/3426/3395 +f 3411/3425/3394 3403/3418/3387 3401/3416/3385 +f 3412/3426/3395 3401/3416/3385 3399/3415/3384 +f 3383/3398/3367 3412/3426/3395 3406/3421/3390 +f 3352/3396/3365 3351/3368/3337 3411/3425/3394 +f 3351/3368/3337 3350/3366/3335 3413/3427/3396 +f 3413/3427/3396 3370/3385/3354 3414/3428/3397 +f 3411/3425/3394 3413/3427/3396 3403/3418/3387 +f 3337/3354/3323 3336/3353/3322 3414/3428/3397 +f 3336/3353/3322 3321/3338/3307 3415/3429/3398 +f 3415/3429/3398 3318/3336/3305 3404/3419/3388 +f 3414/3428/3397 3415/3429/3398 3403/3418/3387 +f 3317/3335/3304 3320/3341/3310 3405/3420/3389 +f 3320/3341/3310 3325/3430/3399 3416/3431/3400 +f 3416/3431/3400 3417/3432/3401 3387/3402/3371 +f 3405/3420/3389 3416/3431/3400 3387/3402/3371 +f 3418/3433/3402 3419/3434/3403 3421/3435/3404 +f 3419/3434/3403 3338/3355/3324 3341/3357/3326 +f 3420/3436/3405 3341/3357/3326 3346/3362/3331 +f 3421/3435/3404 3420/3436/3405 3422/3437/3406 +f 3424/3438/3407 3425/3439/3408 3426/3440/3409 +f 3425/3439/3408 3428/3441/3410 3426/3440/3409 +f 3426/3440/3409 3429/3442/3411 3430/3443/3412 +f 3427/3444/3413 3426/3440/3409 3431/3445/3414 +f 3428/3441/3410 3432/3446/3415 3429/3442/3411 +f 3432/3446/3415 3434/3447/3416 3433/3448/3417 +f 3433/3448/3417 3435/3449/3418 3437/3450/3419 +f 3429/3442/3411 3433/3448/3417 3437/3450/3419 +f 3438/3451/3420 3439/3452/3421 3440/3453/3422 +f 3439/3452/3421 3442/3454/3423 3440/3453/3422 +f 3440/3453/3422 3443/3455/3424 3445/3456/3425 +f 3441/3457/3426 3440/3453/3422 3445/3456/3425 +f 3447/3458/3427 3448/3459/3428 3450/3460/3429 +f 3448/3459/3428 3451/3461/3430 3449/3462/3431 +f 3449/3462/3431 3452/3463/3432 3453/3464/3433 +f 3450/3460/3429 3449/3462/3431 3454/3465/3434 +f 3394/3409/3378 3393/3408/3377 3455/3466/3435 +f 3393/3408/3377 3392/3406/3375 3457/3467/3436 +f 3455/3466/3435 3457/3467/3436 3458/3468/3437 +f 3456/3469/3438 3455/3466/3435 3459/3470/3439 +f 3461/3471/3440 3462/3472/3441 3463/3473/3442 +f 3462/3472/3441 3394/3409/3378 3463/3473/3442 +f 3464/3474/3443 3463/3473/3442 3456/3469/3438 +f 3465/3475/3444 3466/3476/3445 3468/3477/3446 +f 3466/3476/3445 3438/3451/3420 3467/3478/3447 +f 3467/3478/3447 3469/3479/3448 3471/3480/3449 +f 3468/3477/3446 3467/3478/3447 3472/3481/3450 +f 3473/3482/3451 3474/3483/3452 3476/3484/3453 +f 3474/3483/3452 3477/3485/3454 3475/3486/3455 +f 3475/3486/3455 3478/3487/3456 3480/3488/3457 +f 3476/3484/3453 3475/3486/3455 3481/3489/3458 +f 3447/3458/3427 3482/3490/3459 3483/3491/3460 +f 3482/3490/3459 3484/3492/3461 3485/3493/3462 +f 3483/3491/3460 3485/3493/3462 3486/3494/3463 +f 3448/3459/3428 3483/3491/3460 3487/3495/3464 +f 3488/3496/3465 3489/3497/3466 3491/3498/3467 +f 3489/3497/3466 3481/3489/3458 3490/3499/3468 +f 3490/3499/3468 3480/3488/3457 3492/3500/3469 +f 3491/3498/3467 3490/3499/3468 3493/3501/3470 +f 3494/3502/3471 3495/3503/3472 3497/3504/3473 +f 3495/3503/3472 3498/3505/3474 3496/3506/3475 +f 3496/3506/3475 3499/3507/3476 3500/3508/3477 +f 3497/3504/3473 3496/3506/3475 3501/3509/3478 +f 3502/3510/3479 3503/3511/3480 3504/3512/3481 +f 3503/3511/3480 3506/3513/3482 3504/3512/3481 +f 3505/3514/3483 3504/3512/3481 3508/3515/3484 +f 3502/3510/3479 3509/3516/3485 3503/3511/3480 +f 3509/3516/3485 3511/3517/3486 3512/3518/3487 +f 3503/3511/3480 3510/3519/3488 3506/3513/3482 +f 3513/3520/3489 3514/3521/3490 3516/3522/3491 +f 3514/3521/3490 3517/3523/3492 3518/3524/3493 +f 3515/3525/3494 3518/3524/3493 3520/3526/3495 +f 3516/3522/3491 3515/3525/3494 3521/3527/3496 +f 3305/3324/3293 3522/3528/3497 3523/3529/3498 +f 3522/3528/3497 3524/3530/3499 3523/3529/3498 +f 3523/3529/3498 3525/3531/3500 3500/3508/3477 +f 3306/3325/3294 3523/3529/3498 3309/3327/3296 +f 3526/3532/3501 3527/3533/3502 3529/3534/3503 +f 3527/3533/3502 3530/3535/3504 3531/3536/3505 +f 3528/3537/3506 3531/3536/3505 3519/3538/3507 +f 3529/3534/3503 3528/3537/3506 3517/3523/3492 +f 3532/3539/3508 3533/3540/3509 3534/3541/3510 +f 3533/3540/3509 3536/3542/3511 3537/3543/3512 +f 3534/3541/3510 3537/3543/3512 3538/3544/3513 +f 3535/3545/3514 3534/3541/3510 3539/3546/3515 +f 3541/3547/3516 3542/3548/3517 3544/3549/3518 +f 3542/3548/3517 3545/3550/3519 3543/3551/3520 +f 3543/3551/3520 3546/3552/3521 3548/3553/3522 +f 3544/3549/3518 3543/3551/3520 3549/3554/3523 +f 3502/3510/3479 3550/3555/3524 3551/3556/3525 +f 3550/3555/3524 3545/3550/3519 3542/3548/3517 +f 3552/3557/3526 3551/3556/3525 3541/3547/3516 +f 3502/3510/3479 3552/3557/3526 3553/3558/3527 +f 3552/3557/3526 3541/3547/3516 3553/3558/3527 +f 3509/3516/3485 3553/3558/3527 3511/3517/3486 +f 3555/3559/3528 3556/3560/3529 3557/3561/3530 +f 3556/3560/3529 3559/3562/3531 3560/3563/3532 +f 3557/3561/3530 3560/3563/3532 3541/3547/3516 +f 3558/3564/3533 3557/3561/3530 3544/3549/3518 +f 3559/3562/3531 3561/3565/3534 3562/3566/3535 +f 3561/3565/3534 3563/3567/3536 3562/3566/3535 +f 3562/3566/3535 3564/3568/3537 3511/3517/3486 +f 3560/3563/3532 3562/3566/3535 3541/3547/3516 +f 3532/3539/3508 3565/3569/3538 3566/3570/3539 +f 3565/3569/3538 3568/3571/3540 3569/3572/3541 +f 3566/3570/3539 3569/3572/3541 3559/3562/3531 +f 3567/3573/3542 3566/3570/3539 3556/3560/3529 +f 3570/3574/3543 3571/3575/3544 3572/3576/3545 +f 3571/3575/3544 3563/3567/3536 3572/3576/3545 +f 3572/3576/3545 3561/3565/3534 3569/3572/3541 +f 3573/3577/3546 3572/3576/3545 3568/3571/3540 +f 3574/3578/3547 3575/3579/3548 3577/3580/3549 +f 3575/3579/3548 3578/3581/3550 3576/3582/3551 +f 3576/3582/3551 3579/3583/3552 3581/3584/3553 +f 3577/3580/3549 3576/3582/3551 3582/3585/3554 +f 3498/3505/3474 3583/3586/3555 3584/3587/3556 +f 3583/3586/3555 3586/3588/3557 3587/3589/3558 +f 3584/3587/3556 3587/3589/3558 3578/3581/3550 +f 3585/3590/3559 3584/3587/3556 3575/3579/3548 +f 3501/3509/3478 3525/3531/3500 3589/3591/3560 +f 3525/3531/3500 3524/3530/3499 3590/3592/3561 +f 3588/3593/3562 3590/3592/3561 3591/3594/3563 +f 3589/3591/3560 3588/3593/3562 3593/3595/3564 +f 3494/3502/3471 3497/3504/3473 3594/3596/3565 +f 3497/3504/3473 3501/3509/3478 3589/3591/3560 +f 3594/3596/3565 3589/3591/3560 3596/3597/3566 +f 3595/3598/3567 3594/3596/3565 3596/3597/3566 +f 3593/3595/3564 3592/3599/3568 3598/3600/3569 +f 3592/3599/3568 3591/3594/3563 3600/3601/3570 +f 3598/3600/3569 3600/3601/3570 3447/3458/3427 +f 3599/3602/3571 3598/3600/3569 3450/3460/3429 +f 3410/3603/3572 3601/3604/3573 3603/3605/3574 +f 3601/3604/3573 3604/3606/3575 3602/3607/3576 +f 3602/3607/3576 3605/3608/3577 3606/3609/3578 +f 3603/3605/3574 3602/3607/3576 3607/3610/3579 +f 3379/3400/3369 3385/3611/3580 3609/3612/3581 +f 3385/3611/3580 3384/3399/3368 3408/3423/3392 +f 3608/3613/3582 3408/3423/3392 3603/3605/3574 +f 3609/3612/3581 3608/3613/3582 3607/3610/3579 +f 3379/3400/3369 3609/3612/3581 3610/3614/3583 +f 3609/3612/3581 3607/3610/3579 3611/3615/3584 +f 3610/3614/3583 3611/3615/3584 3454/3465/3434 +f 3380/3394/3363 3610/3614/3583 3453/3464/3433 +f 3597/3616/3585 3596/3597/3566 3606/3609/3578 +f 3596/3597/3566 3593/3595/3564 3612/3617/3586 +f 3612/3617/3586 3599/3602/3571 3611/3615/3584 +f 3606/3609/3578 3612/3617/3586 3607/3610/3579 +f 3597/3616/3585 3605/3608/3577 3613/3618/3587 +f 3605/3608/3577 3604/3606/3575 3614/3619/3588 +f 3613/3618/3587 3614/3619/3588 3615/3620/3589 +f 3595/3598/3567 3613/3618/3587 3616/3621/3590 +f 3511/3517/3486 3564/3568/3537 3618/3622/3591 +f 3564/3568/3537 3563/3567/3536 3617/3623/3592 +f 3617/3623/3592 3571/3575/3544 3619/3624/3593 +f 3618/3622/3591 3617/3623/3592 3620/3625/3594 +f 3506/3513/3482 3512/3518/3487 3621/3626/3595 +f 3512/3518/3487 3511/3517/3486 3621/3626/3595 +f 3622/3627/3596 3621/3626/3595 3620/3625/3594 +f 3623/3628/3597 3624/3629/3598 3626/3630/3599 +f 3624/3629/3598 3627/3631/3600 3625/3632/3601 +f 3625/3632/3601 3628/3633/3602 3629/3634/3603 +f 3626/3630/3599 3625/3632/3601 3615/3620/3589 +f 3506/3513/3482 3622/3627/3596 3631/3635/3604 +f 3622/3627/3596 3620/3625/3594 3630/3636/3605 +f 3630/3636/3605 3632/3637/3606 3627/3631/3600 +f 3631/3635/3604 3630/3636/3605 3624/3629/3598 +f 3461/3471/3440 3633/3638/3607 3462/3472/3441 +f 3633/3638/3607 3635/3639/3608 3634/3640/3609 +f 3634/3640/3609 3636/3641/3610 3397/3411/3380 +f 3462/3472/3441 3634/3640/3609 3394/3409/3378 +f 3410/3603/3572 3409/3424/3393 3637/3642/3611 +f 3409/3424/3393 3397/3411/3380 3636/3641/3610 +f 3637/3642/3611 3636/3641/3610 3635/3639/3608 +f 3601/3604/3573 3637/3642/3611 3638/3643/3612 +f 3639/3644/3613 3640/3645/3614 3641/3646/3615 +f 3640/3645/3614 3643/3647/3616 3644/3648/3617 +f 3641/3646/3615 3644/3648/3617 3464/3474/3443 +f 3642/3649/3618 3641/3646/3615 3464/3474/3443 +f 3623/3628/3597 3645/3650/3619 3646/3651/3620 +f 3645/3650/3619 3643/3647/3616 3646/3651/3620 +f 3631/3635/3604 3646/3651/3620 3647/3652/3621 +f 3643/3647/3616 3640/3645/3614 3648/3653/3622 +f 3640/3645/3614 3639/3644/3613 3649/3654/3623 +f 3648/3653/3622 3649/3654/3623 3508/3515/3484 +f 3647/3652/3621 3648/3653/3622 3506/3513/3482 +f 3461/3471/3440 3644/3648/3617 3650/3655/3624 +f 3644/3648/3617 3643/3647/3616 3645/3650/3619 +f 3650/3655/3624 3645/3650/3619 3651/3656/3625 +f 3633/3638/3607 3650/3655/3624 3635/3639/3608 +f 3604/3606/3575 3638/3643/3612 3652/3657/3626 +f 3638/3643/3612 3635/3639/3608 3651/3656/3625 +f 3652/3657/3626 3651/3656/3625 3623/3628/3597 +f 3614/3619/3588 3652/3657/3626 3626/3630/3599 +f 3494/3502/3471 3616/3621/3590 3653/3658/3627 +f 3616/3621/3590 3615/3620/3589 3629/3634/3603 +f 3653/3658/3627 3629/3634/3603 3586/3588/3557 +f 3495/3503/3472 3653/3658/3627 3583/3586/3555 +f 3586/3588/3557 3628/3633/3602 3654/3659/3628 +f 3628/3633/3602 3627/3631/3600 3632/3637/3606 +f 3654/3659/3628 3632/3637/3606 3655/3660/3629 +f 3587/3589/3558 3654/3659/3628 3578/3581/3550 +f 3578/3581/3550 3655/3660/3629 3579/3583/3552 +f 3655/3660/3629 3620/3625/3594 3619/3624/3593 +f 3656/3661/3630 3619/3624/3593 3570/3574/3543 +f 3579/3583/3552 3656/3661/3630 3580/3662/3631 +f 3580/3662/3631 3658/3663/3632 3659/3664/3633 +f 3658/3663/3632 3660/3665/3634 3661/3666/3635 +f 3659/3664/3633 3661/3666/3635 3662/3667/3636 +f 3581/3584/3553 3659/3664/3633 3663/3668/3637 +f 3660/3665/3634 3664/3669/3638 3665/3670/3639 +f 3664/3669/3638 3540/3671/3640 3666/3672/3641 +f 3665/3670/3639 3666/3672/3641 3667/3673/3642 +f 3661/3666/3635 3665/3670/3639 3668/3674/3643 +f 3580/3662/3631 3657/3675/3644 3658/3663/3632 +f 3657/3675/3644 3570/3574/3543 3573/3577/3546 +f 3669/3676/3645 3573/3577/3546 3670/3677/3646 +f 3658/3663/3632 3669/3676/3645 3660/3665/3634 +f 3568/3571/3540 3565/3569/3538 3671/3678/3647 +f 3565/3569/3538 3532/3539/3508 3535/3545/3514 +f 3671/3678/3647 3535/3545/3514 3540/3671/3640 +f 3670/3677/3646 3671/3678/3647 3664/3669/3638 +f 3540/3671/3640 3539/3546/3515 3672/3679/3648 +f 3539/3546/3515 3538/3544/3513 3673/3680/3649 +f 3672/3679/3648 3673/3680/3649 3674/3681/3650 +f 3666/3672/3641 3672/3679/3648 3675/3682/3651 +f 3676/3683/3652 3677/3684/3653 3678/3685/3654 +f 3677/3684/3653 3680/3686/3655 3681/3687/3656 +f 3678/3685/3654 3681/3687/3656 3521/3527/3496 +f 3679/3688/3657 3678/3685/3654 3683/3689/3658 +f 3521/3527/3496 3681/3687/3656 3516/3522/3491 +f 3681/3687/3656 3680/3686/3655 3684/3690/3659 +f 3684/3690/3659 3685/3691/3660 3686/3692/3661 +f 3516/3522/3491 3684/3690/3659 3687/3693/3662 +f 3688/3694/3663 3689/3695/3664 3691/3696/3665 +f 3689/3695/3664 3442/3454/3423 3690/3697/3666 +f 3690/3697/3666 3439/3452/3421 3466/3476/3445 +f 3691/3696/3665 3690/3697/3666 3465/3475/3444 +f 3477/3485/3454 3692/3698/3667 3478/3487/3456 +f 3692/3698/3667 3688/3694/3663 3694/3699/3668 +f 3478/3487/3456 3693/3700/3669 3479/3701/3670 +f 3688/3694/3663 3691/3696/3665 3695/3702/3671 +f 3691/3696/3665 3465/3475/3444 3696/3703/3672 +f 3695/3702/3671 3696/3703/3672 3493/3501/3470 +f 3694/3699/3668 3695/3702/3671 3492/3500/3469 +f 3355/3371/3340 3697/3704/3673 3356/3372/3341 +f 3697/3704/3673 3699/3705/3674 3698/3706/3675 +f 3698/3706/3675 3700/3707/3676 3333/3349/3318 +f 3356/3372/3341 3698/3706/3675 3332/3348/3317 +f 3355/3371/3340 3701/3708/3677 3702/3709/3678 +f 3701/3708/3677 3446/3710/3679 3445/3456/3425 +f 3702/3709/3678 3445/3456/3425 3444/3711/3680 +f 3697/3704/3673 3702/3709/3678 3703/3712/3681 +f 3704/3713/3682 3705/3714/3683 3706/3715/3684 +f 3705/3714/3683 3513/3520/3489 3706/3715/3684 +f 3706/3715/3684 3687/3693/3662 3686/3692/3661 +f 3707/3716/3685 3706/3715/3684 3708/3717/3686 +f 3709/3718/3687 3708/3717/3686 3710/3719/3688 +f 3708/3717/3686 3686/3692/3661 3712/3720/3689 +f 3710/3719/3688 3712/3720/3689 3713/3721/3690 +f 3711/3722/3691 3710/3719/3688 3714/3723/3692 +f 3716/3724/3693 3717/3725/3694 3719/3726/3695 +f 3717/3725/3694 3549/3554/3523 3718/3727/3696 +f 3718/3727/3696 3548/3553/3522 3720/3728/3697 +f 3719/3726/3695 3718/3727/3696 3721/3729/3698 +f 3676/3683/3652 3722/3730/3699 3723/3731/3700 +f 3722/3730/3699 3725/3732/3701 3726/3733/3702 +f 3723/3731/3700 3726/3733/3702 3728/3734/3703 +f 3724/3735/3704 3723/3731/3700 3713/3721/3690 +f 3729/3736/3705 3730/3737/3706 3731/3738/3707 +f 3730/3737/3706 3555/3559/3528 3558/3564/3533 +f 3731/3738/3707 3558/3564/3533 3549/3554/3523 +f 3732/3739/3708 3731/3738/3707 3717/3725/3694 +f 3536/3542/3511 3533/3540/3509 3733/3740/3709 +f 3533/3540/3509 3532/3539/3508 3567/3573/3542 +f 3733/3740/3709 3567/3573/3542 3555/3559/3528 +f 3734/3741/3710 3733/3740/3709 3730/3737/3706 +f 3538/3544/3513 3537/3543/3512 3736/3742/3711 +f 3537/3543/3512 3536/3542/3511 3735/3743/3712 +f 3735/3743/3712 3734/3741/3710 3729/3736/3705 +f 3736/3742/3711 3735/3743/3712 3738/3744/3713 +f 3738/3744/3713 3737/3745/3714 3740/3746/3715 +f 3737/3745/3714 3729/3736/3705 3732/3739/3708 +f 3739/3747/3716 3732/3739/3708 3741/3748/3717 +f 3740/3746/3715 3739/3747/3716 3725/3732/3701 +f 3725/3732/3701 3741/3748/3717 3726/3733/3702 +f 3741/3748/3717 3716/3724/3693 3742/3749/3718 +f 3742/3749/3718 3719/3726/3695 3721/3729/3698 +f 3726/3733/3702 3742/3749/3718 3743/3750/3719 +f 3508/3515/3484 3744/3751/3720 3745/3752/3721 +f 3744/3751/3720 3746/3753/3722 3747/3754/3723 +f 3745/3752/3721 3747/3754/3723 3545/3550/3519 +f 3505/3514/3483 3745/3752/3721 3550/3555/3524 +f 3746/3753/3722 3748/3755/3724 3749/3756/3725 +f 3748/3755/3724 3750/3757/3726 3749/3756/3725 +f 3749/3756/3725 3751/3758/3727 3546/3552/3521 +f 3747/3754/3723 3749/3756/3725 3546/3552/3521 +f 3721/3729/3698 3720/3728/3697 3752/3759/3728 +f 3720/3728/3697 3547/3760/3729 3752/3759/3728 +f 3752/3759/3728 3751/3758/3727 3750/3757/3726 +f 3753/3761/3730 3752/3759/3728 3754/3762/3731 +f 3727/3763/3732 3743/3750/3719 3756/3764/3733 +f 3743/3750/3719 3721/3729/3698 3753/3761/3730 +f 3756/3764/3733 3753/3761/3730 3755/3765/3734 +f 3757/3766/3735 3756/3764/3733 3759/3767/3736 +f 3715/3768/3737 3714/3723/3692 3761/3769/3738 +f 3714/3723/3692 3713/3721/3690 3760/3770/3739 +f 3760/3770/3739 3728/3734/3703 3757/3766/3735 +f 3761/3769/3738 3760/3770/3739 3759/3767/3736 +f 3686/3692/3661 3685/3691/3660 3762/3771/3740 +f 3685/3691/3660 3680/3686/3655 3762/3771/3740 +f 3762/3771/3740 3677/3684/3653 3724/3735/3704 +f 3712/3720/3689 3762/3771/3740 3724/3735/3704 +f 3683/3689/3658 3763/3772/3741 3679/3688/3657 +f 3763/3772/3741 3738/3744/3713 3764/3773/3742 +f 3764/3773/3742 3740/3746/3715 3722/3730/3699 +f 3679/3688/3657 3764/3773/3742 3722/3730/3699 +f 3683/3689/3658 3765/3774/3743 3766/3775/3744 +f 3765/3774/3743 3674/3681/3650 3673/3680/3649 +f 3766/3775/3744 3673/3680/3649 3538/3544/3513 +f 3763/3772/3741 3766/3775/3744 3736/3742/3711 +f 3667/3673/3642 3675/3682/3651 3767/3776/3745 +f 3675/3682/3651 3674/3681/3650 3767/3776/3745 +f 3767/3776/3745 3765/3774/3743 3683/3689/3658 +f 3768/3777/3746 3767/3776/3745 3769/3778/3747 +f 3771/3779/3748 3772/3780/3749 3774/3781/3750 +f 3772/3780/3749 3775/3782/3751 3773/3783/3752 +f 3773/3783/3752 3776/3784/3753 3778/3785/3754 +f 3774/3781/3750 3773/3783/3752 3779/3786/3755 +f 3780/3787/3756 3781/3788/3757 3783/3789/3758 +f 3781/3788/3757 3771/3779/3748 3782/3790/3759 +f 3782/3790/3759 3774/3781/3750 3784/3791/3760 +f 3783/3789/3758 3782/3790/3759 3785/3792/3761 +f 3786/3793/3762 3787/3794/3763 3789/3795/3764 +f 3787/3794/3763 3775/3782/3751 3772/3780/3749 +f 3788/3796/3765 3772/3780/3749 3781/3788/3757 +f 3789/3795/3764 3788/3796/3765 3780/3787/3756 +f 3790/3797/3766 3791/3798/3767 3793/3799/3768 +f 3791/3798/3767 3786/3793/3762 3792/3800/3769 +f 3792/3800/3769 3789/3795/3764 3794/3801/3770 +f 3793/3799/3768 3792/3800/3769 3794/3801/3770 +f 3795/3802/3771 3794/3801/3770 3797/3803/3772 +f 3794/3801/3770 3780/3787/3756 3796/3804/3773 +f 3796/3804/3773 3783/3789/3758 3798/3805/3774 +f 3797/3803/3772 3796/3804/3773 3493/3501/3470 +f 3785/3792/3761 3799/3806/3775 3800/3807/3776 +f 3799/3806/3775 3801/3808/3777 3802/3809/3778 +f 3800/3807/3776 3802/3809/3778 3488/3496/3465 +f 3798/3805/3774 3800/3807/3776 3493/3501/3470 +f 3785/3792/3761 3784/3791/3760 3799/3806/3775 +f 3784/3791/3760 3779/3786/3755 3803/3810/3779 +f 3803/3810/3779 3804/3811/3780 3806/3812/3781 +f 3799/3806/3775 3803/3810/3779 3801/3808/3777 +f 3807/3813/3782 3808/3814/3783 3810/3815/3784 +f 3808/3814/3783 3811/3816/3785 3809/3817/3786 +f 3809/3817/3786 3812/3818/3787 3804/3811/3780 +f 3810/3815/3784 3809/3817/3786 3779/3786/3755 +f 3777/3819/3788 3813/3820/3789 3814/3821/3790 +f 3813/3820/3789 3815/3822/3791 3816/3823/3792 +f 3814/3821/3790 3816/3823/3792 3807/3813/3782 +f 3778/3785/3754 3814/3821/3790 3810/3815/3784 +f 3519/3538/3507 3531/3536/3505 3818/3824/3793 +f 3531/3536/3505 3530/3535/3504 3817/3825/3794 +f 3817/3825/3794 3819/3826/3795 3821/3827/3796 +f 3818/3824/3793 3817/3825/3794 3821/3827/3796 +f 3521/3527/3496 3520/3526/3495 3823/3828/3797 +f 3520/3526/3495 3519/3538/3507 3818/3824/3793 +f 3823/3828/3797 3818/3824/3793 3822/3829/3798 +f 3824/3830/3799 3823/3828/3797 3825/3831/3800 +f 3683/3689/3658 3682/3832/3801 3769/3778/3747 +f 3682/3832/3801 3521/3527/3496 3827/3833/3802 +f 3827/3833/3802 3824/3830/3799 3828/3834/3803 +f 3769/3778/3747 3827/3833/3802 3770/3835/3804 +f 3829/3836/3805 3830/3837/3806 3831/3838/3807 +f 3830/3837/3806 3807/3813/3782 3816/3823/3792 +f 3831/3838/3807 3816/3823/3792 3815/3822/3791 +f 3832/3839/3808 3831/3838/3807 3833/3840/3809 +f 3835/3841/3810 3836/3842/3811 3838/3843/3812 +f 3836/3842/3811 3839/3844/3813 3837/3845/3814 +f 3837/3845/3814 3840/3846/3815 3842/3847/3816 +f 3838/3843/3812 3837/3845/3814 3842/3847/3816 +f 3835/3841/3810 3844/3848/3817 3845/3849/3818 +f 3844/3848/3817 3846/3850/3819 3845/3849/3818 +f 3836/3842/3811 3845/3849/3818 3847/3851/3820 +f 3848/3852/3821 3849/3853/3822 3850/3854/3823 +f 3849/3853/3822 3852/3855/3824 3853/3856/3825 +f 3850/3854/3823 3853/3856/3825 3846/3850/3819 +f 3851/3857/3826 3850/3854/3823 3854/3858/3827 +f 3856/3859/3828 3857/3860/3829 3859/3861/3830 +f 3857/3860/3829 3860/3862/3831 3858/3863/3832 +f 3858/3863/3832 3861/3864/3833 3862/3865/3834 +f 3859/3861/3830 3858/3863/3832 3770/3835/3804 +f 3662/3667/3636 3668/3674/3643 3864/3866/3835 +f 3668/3674/3643 3667/3673/3642 3768/3777/3746 +f 3864/3866/3835 3768/3777/3746 3770/3835/3804 +f 3865/3867/3836 3864/3866/3835 3863/3868/3837 +f 3582/3585/3554 3663/3668/3637 3866/3869/3838 +f 3663/3668/3637 3662/3667/3636 3865/3867/3836 +f 3866/3869/3838 3865/3867/3836 3862/3865/3834 +f 3867/3870/3839 3866/3869/3838 3868/3871/3840 +f 3860/3862/3831 3869/3872/3841 3861/3864/3833 +f 3869/3872/3841 3871/3873/3842 3870/3874/3843 +f 3870/3874/3843 3872/3875/3844 3873/3876/3845 +f 3861/3864/3833 3870/3874/3843 3862/3865/3834 +f 3873/3876/3845 3875/3877/3846 3874/3878/3847 +f 3875/3877/3846 3877/3879/3848 3876/3880/3849 +f 3876/3880/3849 3878/3881/3850 3880/3882/3851 +f 3874/3878/3847 3876/3880/3849 3862/3865/3834 +f 3879/3883/3852 3878/3881/3850 3882/3884/3853 +f 3878/3881/3850 3877/3879/3848 3883/3885/3854 +f 3881/3886/3855 3883/3885/3854 3841/3887/3856 +f 3882/3884/3853 3881/3886/3855 3852/3855/3824 +f 3862/3865/3834 3880/3882/3851 3868/3871/3840 +f 3880/3882/3851 3879/3883/3852 3885/3888/3857 +f 3885/3888/3857 3882/3884/3853 3849/3853/3822 +f 3868/3871/3840 3885/3888/3857 3848/3852/3821 +f 3841/3887/3856 3840/3846/3815 3884/3889/3858 +f 3840/3846/3815 3839/3844/3813 3886/3890/3859 +f 3886/3890/3859 3847/3851/3820 3853/3856/3825 +f 3884/3889/3858 3886/3890/3859 3852/3855/3824 +f 3843/3891/3860 3842/3847/3816 3887/3892/3861 +f 3842/3847/3816 3841/3887/3856 3883/3885/3854 +f 3887/3892/3861 3883/3885/3854 3877/3879/3848 +f 3888/3893/3862 3887/3892/3861 3889/3894/3863 +f 3891/3895/3864 3892/3896/3865 3893/3897/3866 +f 3892/3896/3865 3895/3898/3867 3896/3899/3868 +f 3893/3897/3866 3896/3899/3868 3897/3900/3869 +f 3894/3901/3870 3893/3897/3866 3898/3902/3871 +f 3871/3873/3842 3900/3903/3872 3872/3875/3844 +f 3900/3903/3872 3902/3904/3873 3901/3905/3874 +f 3901/3905/3874 3903/3906/3875 3905/3907/3876 +f 3872/3875/3844 3901/3905/3874 3905/3907/3876 +f 3904/3908/3877 3906/3909/3878 3905/3907/3876 +f 3906/3909/3878 3890/3910/3879 3907/3911/3880 +f 3907/3911/3880 3889/3894/3863 3875/3877/3846 +f 3905/3907/3876 3907/3911/3880 3873/3876/3845 +f 3908/3912/3881 3909/3913/3882 3911/3914/3883 +f 3909/3913/3882 3890/3910/3879 3906/3909/3878 +f 3910/3915/3884 3906/3909/3878 3904/3908/3877 +f 3911/3914/3883 3910/3915/3884 3912/3916/3885 +f 3902/3904/3873 3914/3917/3886 3903/3906/3875 +f 3914/3917/3886 3916/3918/3887 3915/3919/3888 +f 3915/3919/3888 3917/3920/3889 3913/3921/3890 +f 3903/3906/3875 3915/3919/3888 3904/3908/3877 +f 3895/3898/3867 3918/3922/3891 3919/3923/3892 +f 3918/3922/3891 3913/3921/3890 3919/3923/3892 +f 3919/3923/3892 3917/3920/3889 3920/3924/3893 +f 3896/3899/3868 3919/3923/3892 3897/3900/3869 +f 3820/3925/3894 3819/3826/3795 3921/3926/3895 +f 3819/3826/3795 3530/3535/3504 3527/3533/3502 +f 3921/3926/3895 3527/3533/3502 3526/3532/3501 +f 3922/3927/3896 3921/3926/3895 3923/3928/3897 +f 3820/3925/3894 3922/3927/3896 3926/3929/3898 +f 3922/3927/3896 3924/3930/3899 3925/3931/3900 +f 3925/3931/3900 3927/3932/3901 3891/3895/3864 +f 3926/3929/3898 3925/3931/3900 3894/3901/3870 +f 3526/3532/3501 3928/3933/3902 3923/3928/3897 +f 3928/3933/3902 3930/3934/3903 3929/3935/3904 +f 3929/3935/3904 3931/3936/3905 3933/3937/3906 +f 3923/3928/3897 3929/3935/3904 3924/3930/3899 +f 3934/3938/3907 3935/3939/3908 3937/3940/3909 +f 3935/3939/3908 3932/3941/3910 3936/3942/3911 +f 3936/3942/3911 3938/3943/3912 3806/3812/3781 +f 3937/3940/3909 3936/3942/3911 3805/3944/3913 +f 3939/3945/3914 3940/3946/3915 3942/3947/3916 +f 3940/3946/3915 3930/3934/3903 3941/3948/3917 +f 3941/3948/3917 3928/3933/3902 3526/3532/3501 +f 3942/3947/3916 3941/3948/3917 3529/3534/3503 +f 3481/3489/3458 3489/3497/3466 3943/3949/3918 +f 3489/3497/3466 3488/3496/3465 3802/3809/3778 +f 3943/3949/3918 3802/3809/3778 3801/3808/3777 +f 3944/3950/3919 3943/3949/3918 3945/3951/3920 +f 3473/3482/3451 3476/3484/3453 3946/3952/3921 +f 3476/3484/3453 3481/3489/3458 3944/3950/3919 +f 3946/3952/3921 3944/3950/3919 3939/3945/3914 +f 3947/3953/3922 3946/3952/3921 3948/3954/3923 +f 3939/3945/3914 3942/3947/3916 3948/3954/3923 +f 3942/3947/3916 3517/3523/3492 3949/3955/3924 +f 3949/3955/3924 3514/3521/3490 3705/3714/3683 +f 3948/3954/3923 3949/3955/3924 3705/3714/3683 +f 3932/3941/3910 3931/3936/3905 3950/3956/3925 +f 3931/3936/3905 3930/3934/3903 3940/3946/3915 +f 3950/3956/3925 3940/3946/3915 3939/3945/3914 +f 3938/3943/3912 3950/3956/3925 3945/3951/3920 +f 3891/3895/3864 3927/3932/3901 3952/3957/3926 +f 3927/3932/3901 3924/3930/3899 3933/3937/3906 +f 3951/3958/3927 3933/3937/3906 3932/3941/3910 +f 3952/3957/3926 3951/3958/3927 3934/3938/3907 +f 3953/3959/3928 3954/3960/3929 3955/3961/3930 +f 3954/3960/3929 3811/3816/3785 3808/3814/3783 +f 3955/3961/3930 3808/3814/3783 3807/3813/3782 +f 3956/3962/3931 3955/3961/3930 3830/3837/3806 +f 3934/3938/3907 3937/3940/3909 3958/3963/3932 +f 3937/3940/3909 3805/3944/3913 3957/3964/3933 +f 3957/3964/3933 3812/3818/3787 3954/3960/3929 +f 3958/3963/3932 3957/3964/3933 3953/3959/3928 +f 3835/3841/3810 3959/3965/3934 3960/3966/3935 +f 3959/3965/3934 3962/3967/3936 3963/3968/3937 +f 3960/3966/3935 3963/3968/3937 3953/3959/3928 +f 3961/3969/3938 3960/3966/3935 3964/3970/3939 +f 3962/3967/3936 3966/3971/3940 3968/3972/3941 +f 3966/3971/3940 3969/3973/3942 3967/3974/3943 +f 3967/3974/3943 3970/3975/3944 3971/3976/3945 +f 3968/3972/3941 3967/3974/3943 3972/3977/3946 +f 3962/3967/3936 3968/3972/3941 3973/3978/3947 +f 3968/3972/3941 3972/3977/3946 3974/3979/3948 +f 3973/3978/3947 3974/3979/3948 3934/3938/3907 +f 3963/3968/3937 3973/3978/3947 3958/3963/3932 +f 3972/3977/3946 3975/3980/3949 3976/3981/3950 +f 3975/3980/3949 3895/3898/3867 3976/3981/3950 +f 3976/3981/3950 3892/3896/3865 3891/3895/3864 +f 3974/3979/3948 3976/3981/3950 3952/3957/3926 +f 3972/3977/3946 3971/3976/3945 3975/3980/3949 +f 3971/3976/3945 3908/3912/3881 3977/3982/3951 +f 3977/3982/3951 3911/3914/3883 3913/3921/3890 +f 3975/3980/3949 3977/3982/3951 3918/3922/3891 +f 3908/3912/3881 3970/3975/3944 3978/3983/3952 +f 3970/3975/3944 3969/3973/3942 3979/3984/3953 +f 3978/3983/3952 3979/3984/3953 3843/3891/3860 +f 3909/3913/3882 3978/3983/3952 3888/3893/3862 +f 3843/3891/3860 3979/3984/3953 3838/3843/3812 +f 3979/3984/3953 3969/3973/3942 3966/3971/3940 +f 3980/3985/3954 3966/3971/3940 3962/3967/3936 +f 3838/3843/3812 3980/3985/3954 3835/3841/3810 +f 3855/3986/3955 3854/3858/3827 3981/3987/3956 +f 3854/3858/3827 3846/3850/3819 3844/3848/3817 +f 3981/3987/3956 3844/3848/3817 3835/3841/3810 +f 3982/3988/3957 3981/3987/3956 3965/3989/3958 +f 3855/3986/3955 3982/3988/3957 3983/3990/3959 +f 3982/3988/3957 3965/3989/3958 3985/3991/3960 +f 3983/3990/3959 3985/3991/3960 3986/3992/3961 +f 3984/3993/3962 3983/3990/3959 3988/3994/3963 +f 3829/3836/3805 3989/3995/3964 3990/3996/3965 +f 3989/3995/3964 3986/3992/3961 3985/3991/3960 +f 3990/3996/3965 3985/3991/3960 3965/3989/3958 +f 3956/3962/3931 3990/3996/3965 3964/3970/3939 +f 3988/3994/3963 3987/3997/3966 3991/3998/3967 +f 3987/3997/3966 3986/3992/3961 3991/3998/3967 +f 3991/3998/3967 3989/3995/3964 3829/3836/3805 +f 3992/3999/3968 3991/3998/3967 3832/3839/3808 +f 3834/4000/3969 3833/3840/3809 3993/4001/3970 +f 3833/3840/3809 3815/3822/3791 3995/4002/3971 +f 3993/4001/3970 3995/4002/3971 2253/2273/2242 +f 3994/4003/3972 3993/4001/3970 2267/2287/2256 +f 3997/4004/3973 3998/4005/3974 4000/4006/3975 +f 3998/4005/3974 4001/4007/3976 3999/4008/3977 +f 3999/4008/3977 4002/4009/3978 4004/4010/3979 +f 4000/4006/3975 3999/4008/3977 4005/4011/3980 +f 4006/4012/3981 4007/4013/3982 4009/4014/3983 +f 4007/4013/3982 4010/4015/3984 4008/4016/3985 +f 4008/4016/3985 4011/4017/3986 4013/4018/3987 +f 4009/4014/3983 4008/4016/3985 3997/4004/3973 +f 4014/4019/3988 4015/4020/3989 4017/4021/3990 +f 4015/4020/3989 4001/4007/3976 3998/4005/3974 +f 4016/4022/3991 3998/4005/3974 3997/4004/3973 +f 4017/4021/3990 4016/4022/3991 4013/4018/3987 +f 4003/4023/3992 4002/4009/3978 4019/4024/3993 +f 4002/4009/3978 4001/4007/3976 4018/4025/3994 +f 4018/4025/3994 4015/4020/3989 4014/4019/3988 +f 4019/4024/3993 4018/4025/3994 4020/4026/3995 +f 4021/4027/3996 4020/4026/3995 4022/4028/3997 +f 4020/4026/3995 4014/4019/3988 4024/4029/3998 +f 4022/4028/3997 4024/4029/3998 4025/4030/3999 +f 4023/4031/4000 4022/4028/3997 3434/3447/3416 +f 4014/4019/3988 4017/4021/3990 4027/4032/4001 +f 4017/4021/3990 4012/4033/4002 4027/4032/4001 +f 4027/4032/4001 4028/4034/4003 4029/4035/4004 +f 4024/4029/3998 4027/4032/4001 4030/4036/4005 +f 4031/4037/4006 4032/4038/4007 4033/4039/4008 +f 4032/4038/4007 4035/4040/4009 4036/4041/4010 +f 4033/4039/4008 4036/4041/4010 4037/4042/4011 +f 4034/4043/4012 4033/4039/4008 4038/4044/4013 +f 4037/4042/4011 4040/4045/4014 4038/4044/4013 +f 4040/4045/4014 4042/4046/4015 4043/4047/4016 +f 4041/4048/4017 4043/4047/4016 4044/4049/4018 +f 4038/4044/4013 4041/4048/4017 4039/4050/4019 +f 4045/4051/4020 4046/4052/4021 4047/4053/4022 +f 4046/4052/4021 4049/4054/4023 4047/4053/4022 +f 4047/4053/4022 4050/4055/4024 4006/4012/3981 +f 4048/4056/4025 4047/4053/4022 4052/4057/4026 +f 841/834/833 4053/4058/4027 4054/4059/4028 +f 4053/4058/4027 4045/4051/4020 4048/4056/4025 +f 4054/4059/4028 4048/4056/4025 4052/4057/4026 +f 879/4060/4029 4054/4059/4028 880/873/872 +f 4031/4037/4006 4034/4043/4012 4057/4061/4030 +f 4034/4043/4012 4039/4050/4019 4056/4062/4031 +f 4056/4062/4031 4058/4063/4032 4046/4052/4021 +f 4057/4061/4030 4056/4062/4031 4045/4051/4020 +f 4059/4064/4033 4060/4065/4034 4062/4066/4035 +f 4060/4065/4034 4035/4040/4009 4061/4067/4036 +f 4061/4067/4036 4032/4038/4007 4057/4061/4030 +f 4062/4066/4035 4061/4067/4036 4057/4061/4030 +f 4037/4042/4011 4036/4041/4010 4064/4068/4037 +f 4036/4041/4010 4035/4040/4009 4063/4069/4038 +f 4063/4069/4038 4060/4065/4034 4059/4064/4033 +f 4064/4068/4037 4063/4069/4038 4066/4070/4039 +f 4067/4071/4040 4068/4072/4041 4069/4073/4042 +f 4068/4072/4041 4042/4046/4015 4040/4045/4014 +f 4069/4073/4042 4040/4045/4014 4037/4042/4011 +f 4070/4074/4043 4069/4073/4042 4064/4068/4037 +f 3434/3447/3416 4026/4075/4044 3435/3449/3418 +f 4026/4075/4044 4025/4030/3999 4071/4076/4045 +f 4071/4076/4045 4072/4077/4046 4074/4078/4047 +f 3435/3449/3418 4071/4076/4045 3436/4079/4048 +f 4073/4080/4049 4075/4081/4050 4077/4082/4051 +f 4075/4081/4050 4078/4083/4052 4076/4084/4053 +f 4076/4084/4053 4079/4085/4054 4081/4086/4055 +f 4077/4082/4051 4076/4084/4053 4082/4087/4056 +f 4078/4083/4052 4075/4081/4050 4084/4088/4057 +f 4075/4081/4050 4073/4080/4049 4083/4089/4058 +f 4083/4089/4058 4072/4077/4046 4030/4036/4005 +f 4084/4088/4057 4083/4089/4058 4029/4035/4004 +f 3436/4079/4048 4074/4078/4047 4086/4090/4059 +f 4074/4078/4047 4073/4080/4049 4085/4091/4060 +f 4085/4091/4060 4077/4082/4051 4087/4092/4061 +f 4086/4090/4059 4085/4091/4060 4087/4092/4061 +f 3430/3443/3412 3437/3450/3419 4089/4093/4062 +f 3437/3450/3419 3436/4079/4048 4089/4093/4062 +f 4089/4093/4062 4086/4090/4059 4091/4094/4063 +f 4090/4095/4064 4089/4093/4062 4091/4094/4063 +f 3418/3433/3402 3431/3445/3414 4093/4096/4065 +f 3431/3445/3414 3430/3443/3412 4090/4095/4064 +f 4093/4096/4065 4090/4095/4064 4092/4097/4066 +f 3419/3434/3403 4093/4096/4065 4094/4098/4067 +f 4092/4097/4066 4095/4099/4068 4094/4098/4067 +f 4095/4099/4068 3367/4100/4069 4096/4101/4070 +f 4096/4101/4070 3366/3382/3351 3339/3356/3325 +f 4094/4098/4067 4096/4101/4070 3338/3355/3324 +f 4097/4102/4071 4098/4103/4072 4099/4104/4073 +f 4098/4103/4072 3367/4100/4069 4095/4099/4068 +f 4099/4104/4073 4095/4099/4068 4092/4097/4066 +f 4100/4105/4074 4099/4104/4073 4091/4094/4063 +f 3472/3481/3450 3471/3480/3449 4102/4106/4075 +f 3471/3480/3449 3470/4107/4076 4101/4108/4077 +f 4101/4108/4077 4103/4109/4078 4105/4110/4079 +f 4102/4106/4075 4101/4108/4077 4106/4111/4080 +f 4107/4112/4081 4108/4113/4082 4109/4114/4083 +f 4108/4113/4082 3362/3378/3347 3364/3381/3350 +f 4109/4114/4083 3364/3381/3350 3367/4100/4069 +f 4110/4115/4084 4109/4114/4083 4098/4103/4072 +f 3446/3710/3679 3701/3708/3677 4111/4116/4085 +f 3701/3708/3677 3355/3371/3340 3358/3376/3345 +f 4111/4116/4085 3358/3376/3345 3362/3378/3347 +f 4112/4117/4086 4111/4116/4085 4108/4113/4082 +f 3438/3451/3420 3441/3457/3426 3469/3479/3448 +f 3441/3457/3426 3446/3710/3679 4113/4118/4087 +f 4113/4118/4087 4112/4117/4086 4114/4119/4088 +f 3469/3479/3448 4113/4118/4087 3470/4107/4076 +f 3470/4107/4076 4114/4119/4088 4103/4109/4078 +f 4114/4119/4088 4107/4112/4081 4115/4120/4089 +f 4115/4120/4089 4110/4115/4084 4116/4121/4090 +f 4103/4109/4078 4115/4120/4089 4104/4122/4091 +f 4104/4122/4091 4116/4121/4090 4118/4123/4092 +f 4116/4121/4090 4097/4102/4071 4117/4124/4093 +f 4117/4124/4093 4100/4105/4074 4088/4125/4094 +f 4118/4123/4092 4117/4124/4093 4082/4087/4056 +f 4080/4126/4095 4119/4127/4096 4120/4128/4097 +f 4119/4127/4096 4106/4111/4080 4105/4110/4079 +f 4120/4128/4097 4105/4110/4079 4104/4122/4091 +f 4081/4086/4055 4120/4128/4097 4118/4123/4092 +f 4121/4129/4098 4122/4130/4099 4124/4131/4100 +f 4122/4130/4099 4125/4132/4101 4126/4133/4102 +f 4123/4134/4103 4126/4133/4102 3793/3799/3768 +f 4124/4131/4100 4123/4134/4103 3795/3802/3771 +f 4127/4135/4104 4128/4136/4105 4129/4137/4106 +f 4128/4136/4105 4067/4071/4040 4070/4074/4043 +f 4129/4137/4106 4070/4074/4043 4066/4070/4039 +f 4130/4138/4107 4129/4137/4106 4131/4139/4108 +f 3815/3822/3791 3813/3820/3789 4134/4140/4109 +f 3813/3820/3789 3777/3819/3788 4135/4141/4110 +f 4133/4142/4111 4135/4141/4110 4137/4143/4112 +f 4134/4140/4109 4133/4142/4111 4138/4144/4113 +f 3786/3793/3762 3791/3798/3767 4140/4145/4114 +f 3791/3798/3767 3790/3797/3766 4126/4133/4102 +f 4139/4146/4115 4126/4133/4102 4141/4147/4116 +f 4140/4145/4114 4139/4146/4115 4136/4148/4117 +f 3777/3819/3788 3776/3784/3753 4142/4149/4118 +f 3776/3784/3753 3775/3782/3751 3787/3794/3763 +f 4142/4149/4118 3787/3794/3763 3786/3793/3762 +f 4135/4141/4110 4142/4149/4118 4140/4145/4114 +f 3465/3475/3444 3468/3477/3446 4143/4150/4119 +f 3468/3477/3446 3472/3481/3450 4144/4151/4120 +f 4143/4150/4119 4144/4151/4120 4145/4152/4121 +f 3696/3703/3672 4143/4150/4119 3493/3501/3470 +f 4145/4152/4121 4147/4153/4122 4146/4154/4123 +f 4147/4153/4122 4121/4129/4098 4148/4155/4124 +f 4148/4155/4124 4124/4131/4100 3797/3803/3772 +f 4146/4154/4123 4148/4155/4124 3493/3501/3470 +f 4149/4156/4125 4150/4157/4126 4151/4158/4127 +f 4150/4157/4126 4145/4152/4121 4144/4151/4120 +f 4151/4158/4127 4144/4151/4120 3472/3481/3450 +f 4152/4159/4128 4151/4158/4127 4102/4106/4075 +f 4125/4132/4101 4122/4130/4099 4153/4160/4129 +f 4122/4130/4099 4121/4129/4098 4153/4160/4129 +f 4153/4160/4129 4147/4153/4122 4145/4152/4121 +f 4154/4161/4130 4153/4160/4129 4150/4157/4126 +f 4149/4156/4125 4155/4162/4131 4156/4163/4132 +f 4155/4162/4131 4127/4135/4104 4156/4163/4132 +f 4156/4163/4132 4130/4138/4107 4157/4164/4133 +f 4154/4161/4130 4156/4163/4132 4157/4164/4133 +f 4127/4135/4104 4155/4162/4131 4159/4165/4134 +f 4155/4162/4131 4149/4156/4125 4152/4159/4128 +f 4158/4166/4135 4152/4159/4128 4106/4111/4080 +f 4159/4165/4134 4158/4166/4135 4119/4127/4096 +f 4078/4083/4052 4160/4167/4136 4079/4085/4054 +f 4160/4167/4136 4067/4071/4040 4161/4168/4137 +f 4161/4168/4137 4128/4136/4105 4159/4165/4134 +f 4079/4085/4054 4161/4168/4137 4080/4126/4095 +f 4029/4035/4004 4043/4047/4016 4084/4088/4057 +f 4043/4047/4016 4042/4046/4015 4162/4169/4138 +f 4162/4169/4138 4068/4072/4041 4160/4167/4136 +f 4084/4088/4057 4162/4169/4138 4078/4083/4052 +f 4012/4033/4002 4011/4017/3986 4163/4170/4139 +f 4011/4017/3986 4010/4015/3984 4164/4171/4140 +f 4163/4170/4139 4164/4171/4140 4044/4049/4018 +f 4028/4034/4003 4163/4170/4139 4044/4049/4018 +f 4006/4012/3981 4050/4055/4024 4007/4013/3982 +f 4050/4055/4024 4049/4054/4023 4058/4063/4032 +f 4165/4172/4141 4058/4063/4032 4164/4171/4140 +f 4007/4013/3982 4165/4172/4141 4010/4015/3984 +f 4006/4012/3981 4009/4014/3983 4051/4173/4142 +f 4009/4014/3983 3997/4004/3973 4000/4006/3975 +f 4166/4174/4143 4000/4006/3975 4005/4011/3980 +f 4051/4173/4142 4166/4174/4143 4052/4057/4026 +f 4052/4057/4026 4167/4175/4144 4168/4176/4145 +f 4167/4175/4144 4005/4011/3980 4169/4177/4146 +f 4168/4176/4145 4169/4177/4146 885/878/877 +f 4055/4178/4147 4168/4176/4145 880/873/872 +f 4170/4179/4148 4171/4180/4149 4172/4181/4150 +f 4171/4180/4149 4174/4182/4151 4172/4181/4150 +f 4172/4181/4150 4175/4183/4152 4176/4184/4153 +f 4173/4185/4154 4172/4181/4150 4177/4186/4155 +f 4005/4011/3980 4004/4010/3979 4179/4187/4156 +f 4004/4010/3979 4003/4023/3992 4179/4187/4156 +f 4179/4187/4156 4181/4188/4157 4182/4189/4158 +f 4180/4190/4159 4179/4187/4156 4183/4191/4160 +f 885/878/877 4169/4177/4146 900/892/891 +f 4169/4177/4146 4005/4011/3980 4184/4192/4161 +f 4184/4192/4161 4180/4190/4159 4185/4193/4162 +f 900/892/891 4184/4192/4161 901/895/894 +f 901/895/894 4185/4193/4162 905/897/896 +f 4185/4193/4162 4170/4179/4148 4186/4194/4163 +f 4186/4194/4163 4173/4185/4154 4178/4195/4164 +f 905/897/896 4186/4194/4163 4187/4196/4165 +f 4174/4182/4151 4188/4197/4166 4189/4198/4167 +f 4188/4197/4166 4191/4199/4168 4192/4200/4169 +f 4189/4198/4167 4192/4200/4169 4193/4201/4170 +f 4190/4202/4171 4189/4198/4167 4194/4203/4172 +f 4193/4201/4170 4196/4204/4173 4198/4205/4174 +f 4196/4204/4173 4199/4206/4175 4197/4207/4176 +f 4197/4207/4176 4200/4208/4177 3425/3439/3408 +f 4198/4205/4174 4197/4207/4176 3424/3438/3407 +f 4199/4206/4175 4201/4209/4178 4202/4210/4179 +f 4201/4209/4178 4021/4027/3996 4023/4031/4000 +f 4202/4210/4179 4023/4031/4000 3434/3447/3416 +f 4200/4208/4177 4202/4210/4179 3428/3441/3410 +f 4021/4027/3996 4201/4209/4178 4203/4211/4180 +f 4201/4209/4178 4199/4206/4175 4203/4211/4180 +f 4203/4211/4180 4204/4212/4181 4181/4188/4157 +f 4019/4024/3993 4203/4211/4180 4003/4023/3992 +f 4193/4201/4170 4192/4200/4169 4205/4213/4182 +f 4192/4200/4169 4191/4199/4168 4206/4214/4183 +f 4205/4213/4182 4206/4214/4183 4182/4189/4158 +f 4196/4204/4173 4205/4213/4182 4204/4212/4181 +f 4182/4189/4158 4206/4214/4183 4183/4191/4160 +f 4206/4214/4183 4191/4199/4168 4188/4197/4166 +f 4207/4215/4184 4188/4197/4166 4171/4180/4149 +f 4183/4191/4160 4207/4215/4184 4170/4179/4148 +f 4208/4216/4185 4209/4217/4186 4211/4218/4187 +f 4209/4217/4186 4212/4219/4188 4213/4220/4189 +f 4210/4221/4190 4213/4220/4189 4176/4184/4153 +f 4211/4218/4187 4210/4221/4190 4215/4222/4191 +f 4216/4223/4192 4217/4224/4193 4219/4225/4194 +f 4217/4224/4193 3424/3438/3407 3427/3444/3413 +f 4218/4226/4195 3427/3444/3413 3418/3433/3402 +f 4219/4225/4194 4218/4226/4195 3423/4227/4196 +f 4195/4228/4197 4194/4203/4172 4221/4229/4198 +f 4194/4203/4172 4193/4201/4170 4198/4205/4174 +f 4220/4230/4199 4198/4205/4174 3424/3438/3407 +f 4221/4229/4198 4220/4230/4199 4216/4223/4192 +f 3486/3494/3463 4222/4231/4200 3487/3495/3464 +f 4222/4231/4200 4224/4232/4201 4223/4233/4202 +f 4223/4233/4202 4225/4234/4203 4227/4235/4204 +f 3487/3495/3464 4223/4233/4202 3451/3461/3430 +f 3451/3461/3430 4227/4235/4204 3452/3463/3432 +f 4227/4235/4204 4226/4236/4205 4228/4237/4206 +f 4228/4237/4206 4229/4238/4207 3377/3391/3360 +f 3452/3463/3432 4228/4237/4206 3381/3395/3364 +f 3423/4227/4196 3422/3437/3406 4230/4239/4208 +f 3422/3437/3406 3346/3362/3331 3373/3387/3356 +f 4230/4239/4208 3373/3387/3356 3375/3390/3359 +f 4231/4240/4209 4230/4239/4208 4229/4238/4207 +f 4224/4232/4201 4232/4241/4210 4225/4234/4203 +f 4232/4241/4210 4216/4223/4192 4233/4242/4211 +f 4233/4242/4211 4219/4225/4194 4231/4240/4209 +f 4225/4234/4203 4233/4242/4211 4226/4236/4205 +f 4208/4216/4185 4211/4218/4187 4234/4243/4212 +f 4211/4218/4187 4215/4222/4191 4236/4244/4213 +f 4234/4243/4212 4236/4244/4213 4222/4231/4200 +f 4235/4245/4214 4234/4243/4212 3486/3494/3463 +f 4215/4222/4191 4237/4246/4215 4238/4247/4216 +f 4237/4246/4215 4195/4228/4197 4238/4247/4216 +f 4238/4247/4216 4221/4229/4198 4232/4241/4210 +f 4236/4244/4213 4238/4247/4216 4224/4232/4201 +f 4195/4228/4197 4237/4246/4215 4239/4248/4217 +f 4237/4246/4215 4215/4222/4191 4214/4249/4218 +f 4239/4248/4217 4214/4249/4218 4176/4184/4153 +f 4190/4202/4171 4239/4248/4217 4175/4183/4152 +f 4176/4184/4153 4213/4220/4189 4177/4186/4155 +f 4213/4220/4189 4212/4219/4188 4241/4250/4219 +f 4240/4251/4220 4241/4250/4219 4242/4252/4221 +f 4177/4186/4155 4240/4251/4220 4243/4253/4222 +f 4244/4254/4223 4245/4255/4224 4246/4256/4225 +f 4245/4255/4224 4178/4195/4164 4246/4256/4225 +f 4247/4257/4226 4246/4256/4225 4243/4253/4222 +f 3301/3320/3289 3316/3334/3303 4248/4258/4227 +f 3316/3334/3303 3313/3331/3300 4250/4259/4228 +f 4248/4258/4227 4250/4259/4228 3855/3986/3955 +f 4249/4260/4229 4248/4258/4227 3988/3994/3963 +f 3313/3331/3300 3312/4261/4230 4251/4262/4231 +f 3312/4261/4230 3311/3330/3299 4252/4263/4232 +f 4251/4262/4231 4252/4263/4232 3851/3857/3826 +f 4250/4259/4228 4251/4262/4231 3855/3986/3955 +f 3311/3330/3299 4253/4264/4233 4252/4263/4232 +f 4253/4264/4233 3574/3578/3547 3577/3580/3549 +f 4254/4265/4234 3577/3580/3549 3867/3870/3839 +f 4252/4263/4232 4254/4265/4234 3848/3852/3821 +f 3309/3327/3296 3499/3507/3476 4255/4266/4235 +f 3499/3507/3476 3498/3505/3474 3585/3590/3559 +f 4255/4266/4235 3585/3590/3559 3574/3578/3547 +f 3310/3328/3297 4255/4266/4235 4253/4264/4233 +f 4242/4252/4221 4256/4267/4236 4257/4268/4237 +f 4256/4267/4236 4259/4269/4238 4260/4270/4239 +f 4257/4268/4237 4260/4270/4239 4261/4271/4240 +f 4258/4272/4241 4257/4268/4237 4262/4273/4242 +f 3484/3492/3461 4264/4274/4243 3485/3493/3462 +f 4264/4274/4243 4259/4269/4238 4265/4275/4244 +f 4265/4275/4244 4266/4276/4245 4235/4245/4214 +f 3485/3493/3462 4265/4275/4244 4235/4245/4214 +f 4212/4219/4188 4209/4217/4186 4267/4277/4246 +f 4209/4217/4186 4208/4216/4185 4267/4277/4246 +f 4267/4277/4246 4266/4276/4245 4256/4267/4236 +f 4241/4250/4219 4267/4277/4246 4256/4267/4236 +f 3591/3594/3563 4268/4278/4247 4269/4279/4248 +f 4268/4278/4247 4270/4280/4249 4271/4281/4250 +f 4269/4279/4248 4271/4281/4250 3484/3492/3461 +f 3600/3601/3570 4269/4279/4248 3482/3490/3459 +f 4270/4280/4249 4272/4282/4251 4271/4281/4250 +f 4272/4282/4251 4261/4271/4240 4260/4270/4239 +f 4273/4283/4252 4260/4270/4239 4259/4269/4238 +f 4271/4281/4250 4273/4283/4252 3484/3492/3461 +f 4263/4284/4253 4262/4273/4242 4274/4285/4254 +f 4262/4273/4242 4261/4271/4240 4276/4286/4255 +f 4274/4285/4254 4276/4286/4255 4277/4287/4256 +f 4275/4288/4257 4274/4285/4254 4244/4254/4223 +f 3988/3994/3963 3992/3999/3968 4279/4289/4258 +f 3992/3999/3968 3834/4000/3969 4278/4290/4259 +f 4278/4290/4259 3994/4003/3972 4280/4291/4260 +f 4279/4289/4258 4278/4290/4259 4281/4292/4261 +f 3303/4293/4262 3302/3322/3291 4282/4294/4263 +f 3302/3322/3291 3301/3320/3289 4249/4260/4229 +f 4282/4294/4263 4249/4260/4229 3988/3994/3963 +f 4283/4295/4264 4282/4294/4263 4279/4289/4258 +f 4132/4296/4265 4131/4139/4108 4284/4297/4266 +f 4131/4139/4108 4066/4070/4039 4065/4298/4267 +f 4284/4297/4266 4065/4298/4267 4059/4064/4033 +f 4285/4299/4268 4284/4297/4266 4286/4300/4269 +f 4138/4144/4113 4137/4143/4112 4285/4299/4268 +f 4137/4143/4112 4136/4148/4117 4287/4301/4270 +f 4287/4301/4270 4141/4147/4116 4157/4164/4133 +f 4285/4299/4268 4287/4301/4270 4132/4296/4265 +f 3815/3822/3791 4134/4140/4109 4288/4302/4271 +f 4134/4140/4109 4138/4144/4113 4289/4303/4272 +f 4288/4302/4271 4289/4303/4272 2255/831/4273 +f 3995/4002/3971 4288/4302/4271 2254/2275/2244 +f 2255/831/4273 4289/4303/4272 838/832/831 +f 4289/4303/4272 4138/4144/4113 4290/4304/4274 +f 4290/4304/4274 4286/4300/4269 4291/4305/4275 +f 838/832/831 4290/4304/4274 841/834/833 +f 4059/4064/4033 4062/4066/4035 4292/4306/4276 +f 4062/4066/4035 4045/4051/4020 4292/4306/4276 +f 4291/4305/4275 4292/4306/4276 4053/4058/4027 +f 1495/1519/1488 4293/4307/4277 1496/1521/1490 +f 4293/4307/4277 4244/4254/4223 4294/4308/4278 +f 4294/4308/4278 4277/4287/4256 3297/3317/3286 +f 1496/1521/1490 4294/4308/4278 3300/3319/3288 +f 4178/4195/4164 4245/4255/4224 4295/4309/4279 +f 4245/4255/4224 4244/4254/4223 4295/4309/4279 +f 4295/4309/4279 4293/4307/4277 1495/1519/1488 +f 4187/4196/4165 4295/4309/4279 906/1523/1492 +f 4244/4254/4223 4247/4257/4226 4275/4288/4257 +f 4247/4257/4226 4242/4252/4221 4296/4310/4280 +f 4275/4288/4257 4296/4310/4280 4258/4272/4241 +f 3591/3594/3563 3590/3592/3561 4268/4278/4247 +f 3590/3592/3561 3524/3530/3499 3522/3528/3497 +f 4297/4311/4281 3522/3528/3497 4298/4312/4282 +f 4268/4278/4247 4297/4311/4281 4298/4312/4282 +f 3297/3317/3286 4299/4313/4283 4300/4314/4284 +f 4299/4313/4283 4270/4280/4249 4298/4312/4282 +f 3314/3332/3301 4300/4314/4284 3305/3324/3293 +f 4270/4280/4249 4299/4313/4283 4301/4315/4285 +f 4299/4313/4283 3297/3317/3286 4301/4315/4285 +f 4272/4282/4251 4301/4315/4285 4261/4271/4240 +f 156/150/150 163/157/157 4302/4316/4286 +f 163/157/157 150/144/144 4304/4317/4287 +f 4302/4316/4286 4304/4317/4287 4305/4318/4288 +f 4303/4319/4289 4302/4316/4286 4306/4320/4290 +f 4307/4321/4291 4308/4322/4292 4309/4323/4293 +f 4308/4322/4292 2293/2315/2284 2296/2321/2290 +f 4309/4323/4293 2296/2321/2290 772/767/767 +f 775/769/769 156/150/150 4303/4319/4289 +f 4310/4324/4294 4311/4325/4295 4312/4326/4296 +f 4311/4325/4295 4314/4327/4297 4312/4326/4296 +f 4312/4326/4296 4315/4328/4298 4316/4329/4299 +f 4313/4330/4300 4312/4326/4296 4317/4331/4301 +f 4319/4332/4302 4320/4333/4303 4321/4334/4304 +f 4320/4333/4303 4323/4335/4305 4324/4336/4306 +f 4321/4334/4304 4324/4336/4306 4325/4337/4307 +f 4322/4338/4308 4321/4334/4304 4326/4339/4309 +f 4328/4340/4310 4329/4341/4311 4330/4342/4312 +f 4329/4341/4311 4319/4332/4302 4322/4338/4308 +f 4330/4342/4312 4322/4338/4308 4327/4343/4313 +f 4331/4344/4314 4330/4342/4312 4332/4345/4315 +f 4334/4346/4316 4335/4347/4317 4336/4348/4318 +f 4335/4347/4317 4328/4340/4310 4331/4344/4314 +f 4336/4348/4318 4331/4344/4314 4333/4349/4319 +f 4337/4350/4320 4336/4348/4318 4338/4351/4321 +f 4314/4327/4297 4340/4352/4322 4315/4328/4298 +f 4340/4352/4322 4334/4346/4316 4341/4353/4323 +f 4341/4353/4323 4337/4350/4320 4339/4354/4324 +f 4315/4328/4298 4341/4353/4323 4342/4355/4325 +f 4323/4335/4305 4343/4356/4326 4344/4357/4327 +f 4343/4356/4326 4345/4358/4328 4346/4359/4329 +f 4344/4357/4327 4346/4359/4329 4347/4360/4330 +f 4324/4336/4306 4344/4357/4327 4348/4361/4331 +f 4349/4362/4332 4350/4363/4333 4351/4364/4334 +f 4350/4363/4333 4353/4365/4335 4354/4366/4336 +f 4351/4364/4334 4354/4366/4336 4355/4367/4337 +f 4352/4368/4338 4351/4364/4334 4356/4369/4339 +f 4353/4365/4335 4358/4370/4340 4359/4371/4341 +f 4358/4370/4340 4360/4372/4342 4361/4373/4343 +f 4359/4371/4341 4361/4373/4343 4362/4374/4344 +f 4354/4366/4336 4359/4371/4341 4363/4375/4345 +f 4364/4376/4346 4365/4377/4347 4367/4378/4348 +f 4365/4377/4347 4310/4324/4294 4366/4379/4349 +f 4366/4379/4349 4313/4330/4300 4368/4380/4350 +f 4367/4378/4348 4366/4379/4349 4369/4381/4351 +f 4370/4382/4352 4371/4383/4353 4372/4384/4354 +f 4371/4383/4353 4364/4376/4346 4367/4378/4348 +f 4372/4384/4354 4367/4378/4348 4369/4381/4351 +f 4373/4385/4355 4372/4384/4354 4374/4386/4356 +f 4360/4372/4342 4376/4387/4357 4377/4388/4358 +f 4376/4387/4357 4370/4382/4352 4373/4385/4355 +f 4377/4388/4358 4373/4385/4355 4375/4389/4359 +f 4361/4373/4343 4377/4388/4358 4378/4390/4360 +f 4379/4391/4361 4380/4392/4362 4382/4393/4363 +f 4380/4392/4362 4383/4394/4364 4384/4395/4365 +f 4381/4396/4366 4384/4395/4365 4386/4397/4367 +f 4382/4393/4363 4381/4396/4366 4387/4398/4368 +f 4388/4399/4369 4389/4400/4370 4391/4401/4371 +f 4389/4400/4370 4379/4391/4361 4390/4402/4372 +f 4390/4402/4372 4382/4393/4363 4392/4403/4373 +f 4391/4401/4371 4390/4402/4372 4393/4404/4374 +f 4345/4358/4328 4394/4405/4375 4346/4359/4329 +f 4394/4405/4375 4396/4406/4376 4395/4407/4377 +f 4395/4407/4377 4397/4408/4378 4399/4409/4379 +f 4346/4359/4329 4395/4407/4377 4399/4409/4379 +f 4396/4406/4376 4400/4410/4380 4397/4408/4378 +f 4400/4410/4380 4388/4399/4369 4401/4411/4381 +f 4401/4411/4381 4391/4401/4371 4402/4412/4382 +f 4397/4408/4378 4401/4411/4381 4398/4413/4383 +f 4383/4394/4364 4403/4414/4384 4384/4395/4365 +f 4403/4414/4384 4405/4415/4385 4404/4416/4386 +f 4404/4416/4386 4406/4417/4387 4408/4418/4388 +f 4384/4395/4365 4404/4416/4386 4408/4418/4388 +f 4405/4415/4385 4409/4419/4389 4410/4420/4390 +f 4409/4419/4389 4349/4362/4332 4352/4368/4338 +f 4410/4420/4390 4352/4368/4338 4357/4421/4391 +f 4406/4417/4387 4410/4420/4390 4411/4422/4392 +f 4412/4423/4393 4413/4424/4394 4415/4425/4395 +f 4413/4424/4394 4407/4426/4396 4414/4427/4397 +f 4415/4425/4395 4414/4427/4397 4357/4421/4391 +f 4412/4423/4393 4416/4428/4398 4417/4429/4399 +f 4416/4428/4398 4418/4430/4400 4417/4429/4399 +f 4417/4429/4399 4419/4431/4401 4385/4432/4402 +f 4413/4424/4394 4417/4429/4399 4408/4418/4388 +f 4418/4430/4400 4420/4433/4403 4421/4434/4404 +f 4420/4433/4403 4422/4435/4405 4421/4434/4404 +f 4421/4434/4404 4423/4436/4406 4386/4397/4367 +f 4419/4431/4401 4421/4434/4404 4385/4432/4402 +f 4422/4435/4405 4424/4437/4407 4423/4436/4406 +f 4424/4437/4407 4426/4438/4408 4425/4439/4409 +f 4425/4439/4409 4427/4440/4410 4392/4403/4373 +f 4423/4436/4406 4425/4439/4409 4387/4398/4368 +f 4428/4441/4411 4429/4442/4412 4430/4443/4413 +f 4429/4442/4412 4398/4413/4383 4402/4412/4382 +f 4430/4443/4413 4402/4412/4382 4393/4404/4374 +f 4431/4444/4414 4430/4443/4413 4427/4440/4410 +f 4428/4441/4411 4432/4445/4415 4429/4442/4412 +f 4432/4445/4415 4347/4360/4330 4399/4409/4379 +f 4429/4442/4412 4433/4446/4416 4398/4413/4383 +f 2018/2042/2011 4434/4447/4417 4435/4448/4418 +f 4434/4447/4417 4436/4449/4419 4437/4450/4420 +f 4435/4448/4418 4437/4450/4420 4438/4451/4421 +f 2019/2043/2012 4435/4448/4418 4439/4452/4422 +f 1833/1855/1824 4439/4452/4422 4440/4453/4423 +f 4439/4452/4422 4438/4451/4421 4441/4454/4424 +f 4440/4453/4423 4441/4454/4424 4442/4455/4425 +f 1834/1856/1825 4440/4453/4423 4443/4456/4426 +f 4442/4455/4425 4444/4457/4427 4443/4456/4426 +f 4444/4457/4427 4446/4458/4428 4447/4459/4429 +f 4445/4460/4430 4447/4459/4429 1839/1861/1830 +f 4443/4456/4426 4445/4460/4430 1835/1857/1826 +f 4448/4461/4431 4449/4462/4432 4450/4463/4433 +f 4449/4462/4432 1809/1831/1800 1806/1829/1798 +f 4450/4463/4433 1806/1829/1798 1805/1828/1797 +f 4451/4464/4434 4450/4463/4433 4452/4465/4435 +f 4454/4466/4436 4455/4467/4437 4457/4468/4438 +f 4455/4467/4437 4458/4469/4439 4456/4470/4440 +f 4456/4470/4440 4459/4471/4441 4451/4464/4434 +f 4457/4468/4438 4456/4470/4440 4453/4472/4442 +f 4460/4473/4443 4461/4474/4444 4463/4475/4445 +f 4461/4474/4444 4464/4476/4446 4462/4477/4447 +f 4462/4477/4447 4465/4478/4448 4467/4479/4449 +f 4463/4475/4445 4462/4477/4447 4468/4480/4450 +f 4469/4481/4451 4470/4482/4452 4471/4483/4453 +f 4470/4482/4452 4468/4480/4450 4467/4479/4449 +f 4471/4483/4453 4467/4479/4449 4466/4484/4454 +f 4472/4485/4455 4471/4483/4453 4473/4486/4456 +f 4475/4487/4457 4476/4488/4458 4478/4489/4459 +f 4476/4488/4458 4474/4490/4460 4477/4491/4461 +f 4477/4491/4461 4479/4492/4462 4480/4493/4463 +f 4478/4489/4459 4477/4491/4461 4482/4494/4464 +f 4474/4490/4460 4483/4495/4465 4479/4492/4462 +f 4483/4495/4465 4485/4496/4466 4486/4497/4467 +f 4484/4498/4468 4486/4497/4467 4487/4499/4469 +f 4479/4492/4462 4484/4498/4468 4488/4500/4470 +f 4489/4501/4471 4490/4502/4472 4491/4503/4473 +f 4490/4502/4472 4485/4496/4466 4491/4503/4473 +f 4491/4503/4473 4483/4495/4465 4474/4490/4460 +f 4492/4504/4474 4491/4503/4473 4473/4486/4456 +f 4493/4505/4475 4494/4506/4476 4495/4507/4477 +f 4494/4506/4476 4497/4508/4478 4498/4509/4479 +f 4495/4507/4477 4498/4509/4479 4499/4510/4480 +f 4496/4511/4481 4495/4507/4477 4500/4512/4482 +f 4502/4513/4483 4503/4514/4484 4505/4515/4485 +f 4503/4514/4484 4506/4516/4486 4504/4517/4487 +f 4504/4517/4487 4507/4518/4488 4509/4519/4489 +f 4505/4515/4485 4504/4517/4487 4510/4520/4490 +f 4511/4521/4491 4512/4522/4492 4513/4523/4493 +f 4512/4522/4492 4515/4524/4494 4516/4525/4495 +f 4513/4523/4493 4516/4525/4495 4492/4504/4474 +f 4514/4526/4496 4513/4523/4493 4492/4504/4474 +f 4517/4527/4497 4518/4528/4498 4520/4529/4499 +f 4518/4528/4498 4515/4524/4494 4519/4530/4500 +f 4519/4530/4500 4512/4522/4492 4521/4531/4501 +f 4520/4529/4499 4519/4530/4500 4522/4532/4502 +f 4508/4533/4503 4507/4518/4488 4524/4534/4504 +f 4507/4518/4488 4506/4516/4486 4523/4535/4505 +f 4523/4535/4505 4525/4536/4506 4527/4537/4507 +f 4524/4534/4504 4523/4535/4505 4528/4538/4508 +f 4529/4539/4509 4530/4540/4510 4531/4541/4511 +f 4530/4540/4510 4533/4542/4512 4534/4543/4513 +f 4531/4541/4511 4534/4543/4513 4535/4544/4514 +f 4532/4545/4515 4531/4541/4511 4536/4546/4516 +f 4537/4547/4517 4538/4548/4518 4532/4545/4515 +f 4538/4548/4518 4540/4549/4519 4539/4550/4520 +f 4539/4550/4520 4541/4551/4521 4543/4552/4522 +f 4532/4545/4515 4539/4550/4520 4529/4539/4509 +f 4544/4553/4523 4545/4554/4524 4547/4555/4525 +f 4545/4554/4524 4548/4556/4526 4546/4557/4527 +f 4546/4557/4527 4549/4558/4528 4551/4559/4529 +f 4547/4555/4525 4546/4557/4527 4448/4461/4431 +f 4458/4469/4439 4552/4560/4530 4553/4561/4531 +f 4552/4560/4530 4554/4562/4532 4555/4563/4533 +f 4553/4561/4531 4555/4563/4533 4544/4553/4523 +f 4459/4471/4441 4553/4561/4531 4547/4555/4525 +f 4556/4564/4534 4557/4565/4535 4559/4566/4536 +f 4557/4565/4535 4560/4567/4537 4558/4568/4538 +f 4558/4568/4538 4561/4569/4539 4545/4554/4524 +f 4559/4566/4536 4558/4568/4538 4544/4553/4523 +f 4554/4562/4532 4562/4570/4540 4563/4571/4541 +f 4562/4570/4540 4564/4572/4542 4565/4573/4543 +f 4563/4571/4541 4565/4573/4543 4556/4564/4534 +f 4555/4563/4533 4563/4571/4541 4559/4566/4536 +f 4475/4487/4457 4478/4489/4459 4566/4574/4544 +f 4478/4489/4459 4482/4494/4464 4568/4575/4545 +f 4566/4574/4544 4568/4575/4545 4564/4572/4542 +f 4567/4576/4546 4566/4574/4544 4562/4570/4540 +f 4502/4513/4483 4569/4577/4547 4570/4578/4548 +f 4569/4577/4547 4571/4579/4549 4572/4580/4550 +f 4570/4578/4548 4572/4580/4550 4573/4581/4551 +f 4503/4514/4484 4570/4578/4548 4574/4582/4552 +f 4575/4583/4553 4576/4584/4554 4578/4585/4555 +f 4576/4584/4554 4535/4544/4514 4577/4586/4556 +f 4577/4586/4556 4579/4587/4557 4572/4580/4550 +f 4578/4585/4555 4577/4586/4556 4571/4579/4549 +f 4482/4494/4464 4481/4588/4558 4580/4589/4559 +f 4481/4588/4558 4480/4493/4463 4582/4590/4560 +f 4580/4589/4559 4582/4590/4560 4584/4591/4561 +f 4581/4592/4562 4580/4589/4559 4575/4583/4553 +f 4480/4493/4463 4488/4500/4470 4585/4593/4563 +f 4488/4500/4470 4487/4499/4469 4585/4593/4563 +f 4585/4593/4563 4586/4594/4564 4588/4595/4565 +f 4582/4590/4560 4585/4593/4563 4583/4596/4566 +f 4583/4596/4566 4588/4595/4565 4589/4597/4567 +f 4588/4595/4565 4587/4598/4568 4591/4599/4569 +f 4589/4597/4567 4591/4599/4569 4592/4600/4570 +f 4590/4601/4571 4589/4597/4567 4593/4602/4572 +f 4583/4596/4566 4590/4601/4571 4584/4591/4561 +f 4590/4601/4571 4537/4547/4517 4594/4603/4573 +f 4594/4603/4573 4536/4546/4516 4576/4584/4554 +f 4584/4591/4561 4594/4603/4573 4575/4583/4553 +f 4564/4572/4542 4568/4575/4545 4596/4604/4574 +f 4568/4575/4545 4482/4494/4464 4595/4605/4575 +f 4595/4605/4575 4581/4592/4562 4578/4585/4555 +f 4596/4604/4574 4595/4605/4575 4571/4579/4549 +f 4564/4572/4542 4596/4604/4574 4597/4606/4576 +f 4596/4604/4574 4571/4579/4549 4597/4606/4576 +f 4597/4606/4576 4569/4577/4547 4598/4607/4577 +f 4565/4573/4543 4597/4606/4576 4598/4607/4577 +f 4556/4564/4534 4598/4607/4577 4599/4608/4578 +f 4598/4607/4577 4502/4513/4483 4599/4608/4578 +f 4599/4608/4578 4505/4515/4485 4600/4609/4579 +f 4557/4565/4535 4599/4608/4578 4600/4609/4579 +f 4508/4533/4503 4524/4534/4504 4601/4610/4580 +f 4524/4534/4504 4528/4538/4508 4603/4611/4581 +f 4601/4610/4580 4603/4611/4581 4605/4612/4582 +f 4602/4613/4583 4601/4610/4580 4605/4612/4582 +f 4510/4520/4490 4509/4519/4489 4608/4614/4584 +f 4509/4519/4489 4508/4533/4503 4602/4613/4583 +f 4607/4615/4585 4602/4613/4583 4606/4616/4586 +f 4608/4614/4584 4607/4615/4585 4610/4617/4587 +f 4606/4616/4586 4605/4612/4582 4612/4618/4588 +f 4605/4612/4582 4604/4619/4589 4611/4620/4590 +f 4611/4620/4590 4613/4621/4591 4614/4622/4592 +f 4612/4618/4588 4611/4620/4590 4615/4623/4593 +f 4610/4617/4587 4609/4624/4594 4617/4625/4595 +f 4609/4624/4594 4606/4616/4586 4617/4625/4595 +f 4617/4625/4595 4612/4618/4588 4616/4626/4596 +f 4618/4627/4597 4617/4625/4595 4619/4628/4598 +f 4621/4629/4599 4622/4630/4600 4624/4631/4601 +f 4622/4630/4600 4625/4632/4602 4623/4633/4603 +f 4623/4633/4603 4626/4634/4604 4618/4627/4597 +f 4624/4631/4601 4623/4633/4603 4620/4635/4605 +f 4560/4567/4537 4600/4609/4579 4627/4636/4606 +f 4600/4609/4579 4510/4520/4490 4608/4614/4584 +f 4627/4636/4606 4608/4614/4584 4610/4617/4587 +f 4628/4637/4607 4627/4636/4606 4626/4634/4604 +f 4560/4567/4537 4628/4637/4607 4561/4569/4539 +f 4628/4637/4607 4625/4632/4602 4629/4638/4608 +f 4629/4638/4608 4630/4639/4609 4632/4640/4610 +f 4561/4569/4539 4629/4638/4608 4548/4556/4526 +f 4631/4641/4611 4633/4642/4612 4634/4643/4613 +f 4633/4642/4612 4635/4644/4614 4636/4645/4615 +f 4634/4643/4613 4636/4645/4615 4550/4646/4616 +f 4632/4640/4610 4634/4643/4613 4549/4558/4528 +f 4550/4646/4616 4637/4647/4617 4638/4648/4618 +f 4637/4647/4617 1855/1877/1846 1857/1881/1850 +f 4638/4648/4618 1857/1881/1850 1809/1831/1800 +f 4551/4559/4529 4638/4648/4618 4449/4462/4432 +f 4635/4644/4614 4639/4649/4619 4640/4650/4620 +f 4639/4649/4619 1847/1870/1839 1850/1872/1841 +f 4640/4650/4620 1850/1872/1841 1855/1877/1846 +f 4636/4645/4615 4640/4650/4620 4637/4647/4617 +f 4641/4651/4621 4642/4652/4622 4643/4653/4623 +f 4642/4652/4622 4645/1884/4624 1859/1882/1851 +f 4643/4653/4623 1859/1882/1851 1847/1870/1839 +f 4644/4654/4625 4643/4653/4623 4639/4649/4619 +f 4646/4655/4626 4647/4656/4627 4648/4657/4628 +f 4647/4656/4627 4641/4651/4621 4644/4654/4625 +f 4648/4657/4628 4644/4654/4625 4635/4644/4614 +f 4649/4658/4629 4648/4657/4628 4633/4642/4612 +f 4621/4629/4599 4650/4659/4630 4651/4660/4631 +f 4650/4659/4630 4646/4655/4626 4649/4658/4629 +f 4651/4660/4631 4649/4658/4629 4631/4641/4611 +f 4622/4630/4600 4651/4660/4631 4630/4639/4609 +f 4652/4661/4632 4653/4662/4633 4654/4663/4634 +f 4653/4662/4633 4656/4664/4635 4657/4665/4636 +f 4654/4663/4634 4657/4665/4636 4658/4666/4637 +f 4655/4667/4638 4654/4663/4634 4659/4668/4639 +f 4540/4549/4519 4661/4669/4640 4662/4670/4641 +f 4661/4669/4640 4658/4666/4637 4657/4665/4636 +f 4662/4670/4641 4657/4665/4636 4656/4664/4635 +f 4541/4551/4521 4662/4670/4641 4663/4671/4642 +f 4592/4600/4570 4664/4672/4643 4593/4602/4572 +f 4664/4672/4643 4666/4673/4644 4667/4674/4645 +f 4665/4675/4646 4667/4674/4645 4540/4549/4519 +f 4593/4602/4572 4665/4675/4646 4537/4547/4517 +f 4666/4673/4644 4668/4676/4647 4669/4677/4648 +f 4668/4676/4647 4670/4678/4649 4671/4679/4650 +f 4669/4677/4648 4671/4679/4650 4658/4666/4637 +f 4667/4674/4645 4669/4677/4648 4661/4669/4640 +f 4670/4678/4649 4672/4680/4651 4673/4681/4652 +f 4672/4680/4651 4674/4682/4653 4675/4683/4654 +f 4673/4681/4652 4675/4683/4654 4660/4684/4655 +f 4671/4679/4650 4673/4681/4652 4659/4668/4639 +f 4676/4685/4656 4677/4686/4657 4678/4687/4658 +f 4677/4686/4657 4680/4688/4659 4681/4689/4660 +f 4678/4687/4658 4681/4689/4660 4517/4527/4497 +f 4679/4690/4661 4678/4687/4658 4522/4532/4502 +f 4682/4691/4662 4683/4692/4663 4685/4693/4664 +f 4683/4692/4663 4680/4688/4659 4684/4694/4665 +f 4684/4694/4665 4677/4686/4657 4686/4695/4666 +f 4685/4693/4664 4684/4694/4665 4687/4696/4667 +f 4660/4684/4655 4675/4683/4654 4689/4697/4668 +f 4675/4683/4654 4674/4682/4653 4688/4698/4669 +f 4688/4698/4669 4690/4699/4670 4683/4692/4663 +f 4689/4697/4668 4688/4698/4669 4682/4691/4662 +f 4652/4661/4632 4655/4667/4638 4692/4700/4671 +f 4655/4667/4638 4660/4684/4655 4691/4701/4672 +f 4691/4701/4672 4689/4697/4668 4693/4702/4673 +f 4692/4700/4671 4691/4701/4672 4694/4703/4674 +f 4694/4703/4674 4693/4702/4673 4696/4704/4675 +f 4693/4702/4673 4682/4691/4662 4695/4705/4676 +f 4695/4705/4676 4685/4693/4664 4697/4706/4677 +f 4696/4704/4675 4695/4705/4676 4698/4707/4678 +f 4698/4707/4678 4697/4706/4677 4700/4708/4679 +f 4697/4706/4677 4687/4696/4667 4699/4709/4680 +f 4699/4709/4680 4701/4710/4681 4703/4711/4682 +f 4700/4708/4679 4699/4709/4680 4704/4712/4683 +f 4687/4696/4667 4686/4695/4666 4701/4710/4681 +f 4686/4695/4666 4676/4685/4656 4679/4690/4661 +f 4705/4713/4684 4679/4690/4661 4706/4714/4685 +f 4701/4710/4681 4705/4713/4684 4702/4715/4686 +f 4707/4716/4687 4708/4717/4688 4709/4718/4689 +f 4708/4717/4688 4702/4715/4686 4706/4714/4685 +f 4709/4718/4689 4706/4714/4685 4522/4532/4502 +f 4710/4719/4690 4709/4718/4689 4711/4720/4691 +f 4713/4721/4692 4714/4722/4693 4716/4723/4694 +f 4714/4722/4693 4717/4724/4695 4715/4725/4696 +f 4715/4725/4696 4718/4726/4697 4720/4727/4698 +f 4716/4723/4694 4715/4725/4696 4721/4728/4699 +f 4713/4721/4692 4716/4723/4694 4722/4729/4700 +f 4716/4723/4694 4721/4728/4699 4724/4730/4701 +f 4722/4729/4700 4724/4730/4701 4725/4731/4702 +f 4723/4732/4703 4722/4729/4700 4726/4733/4704 +f 4707/4716/4687 4726/4733/4704 4708/4717/4688 +f 4726/4733/4704 4725/4731/4702 4727/4734/4705 +f 4727/4734/4705 4728/4735/4706 4703/4711/4682 +f 4708/4717/4688 4727/4734/4705 4702/4715/4686 +f 4506/4516/4486 4574/4582/4552 4525/4536/4506 +f 4574/4582/4552 4573/4581/4551 4729/4736/4707 +f 4729/4736/4707 4730/4737/4708 4732/4738/4709 +f 4525/4536/4506 4729/4736/4707 4526/4739/4710 +f 4535/4544/4514 4534/4543/4513 4579/4587/4557 +f 4534/4543/4513 4533/4542/4512 4734/4740/4711 +f 4733/4741/4712 4734/4740/4711 4731/4742/4713 +f 4579/4587/4557 4733/4741/4712 4573/4581/4551 +f 150/144/144 149/143/143 4304/4317/4287 +f 149/143/143 148/142/142 4735/4743/4714 +f 4735/4743/4714 4736/4744/4715 4738/4745/4716 +f 4304/4317/4287 4735/4743/4714 4738/4745/4716 +f 3276/3297/3266 3278/3296/3265 4740/4746/4717 +f 3278/3296/3265 2293/2315/2284 4739/4747/4718 +f 4739/4747/4718 4308/4322/4292 4741/4748/4719 +f 4740/4746/4717 4739/4747/4718 4742/4749/4720 +f 4742/4749/4720 4743/4750/4721 4744/4751/4722 +f 4743/4750/4721 4746/4752/4723 4747/4753/4724 +f 4744/4751/4722 4747/4753/4724 2018/2042/2011 +f 4745/4754/4725 4744/4751/4722 2015/2040/2009 +f 2024/3007/2976 3274/3293/3262 2025/2049/2018 +f 3274/3293/3262 3276/3297/3266 4748/4755/4726 +f 4748/4755/4726 4740/4746/4717 4745/4754/4725 +f 2025/2049/2018 4748/4755/4726 2014/2039/2008 +f 4305/4318/4288 4749/4756/4727 4306/4320/4290 +f 4749/4756/4727 4746/4752/4723 4750/4757/4728 +f 4750/4757/4728 4743/4750/4721 4741/4748/4719 +f 4306/4320/4290 4750/4757/4728 4307/4321/4291 +f 4751/4758/4729 4752/4759/4730 4754/4760/4731 +f 4752/4759/4730 4755/4761/4732 4753/4762/4733 +f 4753/4762/4733 4756/4763/4734 4437/4450/4420 +f 4754/4760/4731 4753/4762/4733 4436/4449/4419 +f 4396/4406/4376 4394/4405/4375 4757/4764/4735 +f 4394/4405/4375 4345/4358/4328 4757/4764/4735 +f 4757/4764/4735 4759/4765/4736 4760/4766/4737 +f 4758/4767/4738 4757/4764/4735 4760/4766/4737 +f 4751/4758/4729 4759/4765/4736 4762/4768/4739 +f 4759/4765/4736 4345/4358/4328 4343/4356/4326 +f 4762/4768/4739 4343/4356/4326 4763/4769/4740 +f 4752/4759/4730 4762/4768/4739 4763/4769/4740 +f 4764/4770/4741 4765/4771/4742 4767/4772/4743 +f 4765/4771/4742 4768/4773/4744 4766/4774/4745 +f 4766/4774/4745 4769/4775/4746 4770/4776/4747 +f 4767/4772/4743 4766/4774/4745 4772/4777/4748 +f 4497/4508/4478 4773/4778/4749 4774/4779/4750 +f 4773/4778/4749 4775/4780/4751 4776/4781/4752 +f 4774/4779/4750 4776/4781/4752 4772/4777/4748 +f 4498/4509/4479 4774/4779/4750 4777/4782/4753 +f 4778/4783/4754 4779/4784/4755 4780/4785/4756 +f 4779/4784/4755 4782/4786/4757 4783/4787/4758 +f 4780/4785/4756 4783/4787/4758 4775/4780/4751 +f 4781/4788/4759 4780/4785/4756 4773/4778/4749 +f 4784/4789/4760 4785/4790/4761 4787/4791/4762 +f 4785/4790/4761 4782/4786/4757 4786/4792/4763 +f 4786/4792/4763 4779/4784/4755 4788/4793/4764 +f 4787/4791/4762 4786/4792/4763 4789/4794/4765 +f 4460/4473/4443 4463/4475/4445 4791/4795/4766 +f 4463/4475/4445 4468/4480/4450 4790/4796/4767 +f 4790/4796/4767 4470/4482/4452 4792/4797/4768 +f 4791/4795/4766 4790/4796/4767 4793/4798/4769 +f 4793/4798/4769 4792/4797/4768 4795/4799/4770 +f 4792/4797/4768 4469/4481/4451 4472/4485/4455 +f 4794/4800/4771 4472/4485/4455 4476/4488/4458 +f 4795/4799/4770 4794/4800/4771 4475/4487/4457 +f 4475/4487/4457 4567/4576/4546 4795/4799/4770 +f 4567/4576/4546 4554/4562/4532 4796/4801/4772 +f 4796/4801/4772 4552/4560/4530 4797/4802/4773 +f 4795/4799/4770 4796/4801/4772 4797/4802/4773 +f 4798/4803/4774 4799/4804/4775 4801/4805/4776 +f 4799/4804/4775 4793/4798/4769 4800/4806/4777 +f 4800/4806/4777 4797/4802/4773 4455/4467/4437 +f 4801/4805/4776 4800/4806/4777 4454/4466/4436 +f 4802/4807/4778 4803/4808/4779 4805/4809/4780 +f 4803/4808/4779 4460/4473/4443 4804/4810/4781 +f 4804/4810/4781 4791/4795/4766 4799/4804/4775 +f 4805/4809/4780 4804/4810/4781 4798/4803/4774 +f 4806/4811/4782 4807/4812/4783 4809/4813/4784 +f 4807/4812/4783 4810/4814/4785 4808/4815/4786 +f 4808/4815/4786 4811/4816/4787 4813/4817/4788 +f 4809/4813/4784 4808/4815/4786 4814/4818/4789 +f 4810/4814/4785 4815/4819/4790 4811/4816/4787 +f 4815/4819/4790 4802/4807/4778 4816/4820/4791 +f 4816/4820/4791 4805/4809/4780 4817/4821/4792 +f 4811/4816/4787 4816/4820/4791 4812/4822/4793 +f 4818/4823/4794 4819/4824/4795 4820/4825/4796 +f 4819/4824/4795 4464/4476/4446 4461/4474/4444 +f 4820/4825/4796 4461/4474/4444 4460/4473/4443 +f 4821/4826/4797 4820/4825/4796 4822/4827/4798 +f 4511/4521/4491 4824/4828/4799 4825/4829/4800 +f 4824/4828/4799 4818/4823/4794 4826/4830/4801 +f 4825/4829/4800 4826/4830/4801 4712/4831/4802 +f 4521/4531/4501 4825/4829/4800 4711/4720/4691 +f 4466/4484/4454 4465/4478/4448 4827/4832/4803 +f 4465/4478/4448 4464/4476/4446 4827/4832/4803 +f 4827/4832/4803 4819/4824/4795 4824/4828/4799 +f 4514/4526/4496 4827/4832/4803 4824/4828/4799 +f 4823/4833/4804 4828/4834/4805 4830/4835/4806 +f 4828/4834/4805 4784/4789/4760 4829/4836/4807 +f 4829/4836/4807 4787/4791/4762 4831/4837/4808 +f 4830/4835/4806 4829/4836/4807 4832/4838/4809 +f 4832/4838/4809 4831/4837/4808 4834/4839/4810 +f 4831/4837/4808 4789/4794/4765 4833/4840/4811 +f 4833/4840/4811 4835/4841/4812 4714/4722/4693 +f 4834/4839/4810 4833/4840/4811 4713/4721/4692 +f 4712/4831/4802 4836/4842/4813 4837/4843/4814 +f 4836/4842/4813 4832/4838/4809 4837/4843/4814 +f 4837/4843/4814 4834/4839/4810 4723/4732/4703 +f 4710/4719/4690 4837/4843/4814 4707/4716/4687 +f 4712/4831/4802 4826/4830/4801 4836/4842/4813 +f 4826/4830/4801 4818/4823/4794 4821/4826/4797 +f 4838/4844/4815 4821/4826/4797 4823/4833/4804 +f 4836/4842/4813 4838/4844/4815 4830/4835/4806 +f 4802/4807/4778 4839/4845/4816 4840/4846/4817 +f 4839/4845/4816 4784/4789/4760 4828/4834/4805 +f 4840/4846/4817 4828/4834/4805 4823/4833/4804 +f 4803/4808/4779 4840/4846/4817 4822/4827/4798 +f 4782/4786/4757 4785/4790/4761 4842/4847/4818 +f 4785/4790/4761 4784/4789/4760 4841/4848/4819 +f 4841/4848/4819 4839/4845/4816 4815/4819/4790 +f 4842/4847/4818 4841/4848/4819 4810/4814/4785 +f 4775/4780/4751 4783/4787/4758 4844/4849/4820 +f 4783/4787/4758 4782/4786/4757 4843/4850/4821 +f 4843/4850/4821 4842/4847/4818 4807/4812/4783 +f 4844/4849/4820 4843/4850/4821 4806/4811/4782 +f 4775/4780/4751 4844/4849/4820 4845/4851/4822 +f 4844/4849/4820 4806/4811/4782 4846/4852/4823 +f 4845/4851/4822 4846/4852/4823 4767/4772/4743 +f 4776/4781/4752 4845/4851/4822 4767/4772/4743 +f 4847/4853/4824 4848/4854/4825 4850/4855/4826 +f 4848/4854/4825 4851/4856/4827 4849/4857/4828 +f 4849/4857/4828 4852/4858/4829 4765/4771/4742 +f 4850/4855/4826 4849/4857/4828 4764/4770/4741 +f 4764/4770/4741 4846/4852/4823 4853/4859/4830 +f 4846/4852/4823 4806/4811/4782 4853/4859/4830 +f 4853/4859/4830 4809/4813/4784 4854/4860/4831 +f 4850/4855/4826 4853/4859/4830 4847/4853/4824 +f 4812/4822/4793 4817/4821/4792 4856/4861/4832 +f 4817/4821/4792 4798/4803/4774 4855/4862/4833 +f 4855/4862/4833 4801/4805/4776 4857/4863/4834 +f 4856/4861/4832 4855/4862/4833 4858/4864/4835 +f 4814/4818/4789 4813/4817/4788 4860/4865/4836 +f 4813/4817/4788 4812/4822/4793 4859/4866/4837 +f 4859/4866/4837 4856/4861/4832 4861/4867/4838 +f 4860/4865/4836 4859/4866/4837 4862/4868/4839 +f 4858/4864/4835 4857/4863/4834 4864/4869/4840 +f 4857/4863/4834 4454/4466/4436 4863/4870/4841 +f 4863/4870/4841 4457/4468/4438 4865/4871/4842 +f 4864/4869/4840 4863/4870/4841 4866/4872/4843 +f 4866/4872/4843 4865/4871/4842 4868/4873/4844 +f 4865/4871/4842 4453/4472/4442 4867/4874/4845 +f 4867/4874/4845 4452/4465/4435 2027/2050/2019 +f 4868/4873/4844 4867/4874/4845 2029/2053/2022 +f 4869/4875/4846 4870/4876/4847 4872/4877/4848 +f 4870/4876/4847 4866/4872/4843 4871/4878/4849 +f 4871/4878/4849 4868/4873/4844 2031/2055/2024 +f 4872/4877/4848 4871/4878/4849 1839/1861/1830 +f 4869/4875/4846 4873/4879/4850 4874/4880/4851 +f 4873/4879/4850 4862/4868/4839 4861/4867/4838 +f 4874/4880/4851 4861/4867/4838 4858/4864/4835 +f 4870/4876/4847 4874/4880/4851 4864/4869/4840 +f 4875/4881/4852 4876/4882/4853 4877/4883/4854 +f 4876/4882/4853 4879/4884/4855 4880/4885/4856 +f 4877/4883/4854 4880/4885/4856 4862/4868/4839 +f 4878/4886/4857 4877/4883/4854 4873/4879/4850 +f 4446/4458/4428 4881/4887/4858 4882/4888/4859 +f 4881/4887/4858 4875/4881/4852 4878/4886/4857 +f 4882/4888/4859 4878/4886/4857 4869/4875/4846 +f 4447/4459/4429 4882/4888/4859 4872/4877/4848 +f 4883/4889/4860 4884/4890/4861 4886/4891/4862 +f 4884/4890/4861 4887/4892/4863 4885/4893/4864 +f 4885/4893/4864 4888/4894/4865 4875/4881/4852 +f 4886/4891/4862 4885/4893/4864 4881/4887/4858 +f 4887/4892/4863 4889/4895/4866 4888/4894/4865 +f 4889/4895/4866 4891/4896/4867 4890/4897/4868 +f 4890/4897/4868 4892/4898/4869 4879/4884/4855 +f 4888/4894/4865 4890/4897/4868 4876/4882/4853 +f 4879/4884/4855 4893/4899/4870 4894/4900/4871 +f 4893/4899/4870 4847/4853/4824 4854/4860/4831 +f 4894/4900/4871 4854/4860/4831 4814/4818/4789 +f 4880/4885/4856 4894/4900/4871 4860/4865/4836 +f 4891/4896/4867 4895/4901/4872 4892/4898/4869 +f 4895/4901/4872 4851/4856/4827 4896/4902/4873 +f 4896/4902/4873 4848/4854/4825 4847/4853/4824 +f 4892/4898/4869 4896/4902/4873 4893/4899/4870 +f 4314/4327/4297 4311/4325/4295 4898/4903/4874 +f 4311/4325/4295 4310/4324/4294 4899/4904/4875 +f 4897/4905/4876 4899/4904/4875 4895/4901/4872 +f 4898/4903/4874 4897/4905/4876 4891/4896/4867 +f 4900/4906/4877 4901/4907/4878 4903/4908/4879 +f 4901/4907/4878 4883/4889/4860 4902/4909/4880 +f 4902/4909/4880 4886/4891/4862 4444/4457/4427 +f 4903/4908/4879 4902/4909/4880 4442/4455/4425 +f 4438/4451/4421 4756/4763/4734 4904/4910/4881 +f 4756/4763/4734 4755/4761/4732 4905/4911/4882 +f 4904/4910/4881 4905/4911/4882 4900/4906/4877 +f 4441/4454/4424 4904/4910/4881 4903/4908/4879 +f 4755/4761/4732 4763/4769/4740 4906/4912/4883 +f 4763/4769/4740 4323/4335/4305 4906/4912/4883 +f 4906/4912/4883 4320/4333/4303 4907/4913/4884 +f 4905/4911/4882 4906/4912/4883 4907/4913/4884 +f 4319/4332/4302 4329/4341/4311 4908/4914/4885 +f 4329/4341/4311 4328/4340/4310 4909/4915/4886 +f 4908/4914/4885 4909/4915/4886 4901/4907/4878 +f 4907/4913/4884 4908/4914/4885 4901/4907/4878 +f 4334/4346/4316 4340/4352/4322 4911/4916/4887 +f 4340/4352/4322 4314/4327/4297 4910/4917/4888 +f 4910/4917/4888 4898/4903/4874 4889/4895/4866 +f 4911/4916/4887 4910/4917/4888 4887/4892/4863 +f 4328/4340/4310 4335/4347/4317 4912/4918/4889 +f 4335/4347/4317 4334/4346/4316 4912/4918/4889 +f 4912/4918/4889 4911/4916/4887 4884/4890/4861 +f 4909/4915/4886 4912/4918/4889 4883/4889/4860 +f 4851/4856/4827 4899/4904/4875 4852/4858/4829 +f 4899/4904/4875 4310/4324/4294 4365/4377/4347 +f 4913/4919/4890 4365/4377/4347 4364/4376/4346 +f 4852/4858/4829 4913/4919/4890 4914/4920/4891 +f 4768/4773/4744 4914/4920/4891 4915/4921/4892 +f 4914/4920/4891 4364/4376/4346 4915/4921/4892 +f 4915/4921/4892 4371/4383/4353 4916/4922/4893 +f 4769/4775/4746 4915/4921/4892 4916/4922/4893 +f 4717/4724/4695 4917/4923/4894 4718/4726/4697 +f 4917/4923/4894 4919/4924/4895 4918/4925/4896 +f 4918/4925/4896 4920/4926/4897 4922/4927/4898 +f 4718/4726/4697 4918/4925/4896 4719/4928/4899 +f 4789/4794/4765 4788/4793/4764 4835/4841/4812 +f 4788/4793/4764 4778/4783/4754 4923/4929/4900 +f 4923/4929/4900 4924/4930/4901 4917/4923/4894 +f 4835/4841/4812 4923/4929/4900 4717/4724/4695 +f 4778/4783/4754 4781/4788/4759 4924/4930/4901 +f 4781/4788/4759 4497/4508/4478 4925/4931/4902 +f 4925/4931/4902 4494/4506/4476 4926/4932/4903 +f 4924/4930/4901 4925/4931/4902 4919/4924/4895 +f 4919/4924/4895 4926/4932/4903 4920/4926/4897 +f 4926/4932/4903 4493/4505/4475 4927/4933/4904 +f 4927/4933/4904 4928/4934/4905 4930/4935/4906 +f 4920/4926/4897 4927/4933/4904 4921/4936/4907 +f 4931/4937/4908 4932/4938/4909 4933/4939/4910 +f 4932/4938/4909 4929/4940/4911 4928/4934/4905 +f 4933/4939/4910 4928/4934/4905 4493/4505/4475 +f 4934/4941/4912 4933/4939/4910 4496/4511/4481 +f 4935/4942/4913 4936/4943/4914 4938/4944/4915 +f 4936/4943/4914 4939/4945/4916 4940/4946/4917 +f 4937/4947/4918 4940/4946/4917 4941/4948/4919 +f 4938/4944/4915 4937/4947/4918 4943/4949/4920 +f 4939/4945/4916 4936/4943/4914 4945/4950/4921 +f 4936/4943/4914 4935/4942/4913 4944/4951/4922 +f 4944/4951/4922 4946/4952/4923 4934/4941/4912 +f 4945/4950/4921 4944/4951/4922 4501/4953/4924 +f 4947/4954/4925 4948/4955/4926 4950/4956/4927 +f 4948/4955/4926 4951/4957/4928 4949/4958/4929 +f 4949/4958/4929 4952/4959/4930 4349/4362/4332 +f 4950/4956/4927 4949/4958/4929 4405/4415/4385 +f 4499/4510/4480 4953/4960/4931 4954/4961/4932 +f 4953/4960/4931 4955/4962/4933 4956/4963/4934 +f 4954/4961/4932 4956/4963/4934 4957/4964/4935 +f 4500/4512/4482 4954/4961/4932 4958/4965/4936 +f 4772/4777/4748 4771/4966/4937 4777/4782/4753 +f 4771/4966/4937 4770/4776/4747 4960/4967/4938 +f 4959/4968/4939 4960/4967/4938 4955/4962/4933 +f 4777/4782/4753 4959/4968/4939 4953/4960/4931 +f 4770/4776/4747 4916/4922/4893 4961/4969/4940 +f 4916/4922/4893 4370/4382/4352 4376/4387/4357 +f 4961/4969/4940 4376/4387/4357 4360/4372/4342 +f 4960/4967/4938 4961/4969/4940 4962/4970/4941 +f 4955/4962/4933 4962/4970/4941 4963/4971/4942 +f 4962/4970/4941 4360/4372/4342 4358/4370/4340 +f 4963/4971/4942 4358/4370/4340 4353/4365/4335 +f 4956/4963/4934 4963/4971/4942 4964/4972/4943 +f 4957/4964/4935 4964/4972/4943 4965/4973/4944 +f 4964/4972/4943 4353/4365/4335 4350/4363/4333 +f 4965/4973/4944 4350/4363/4333 4349/4362/4332 +f 4966/4974/4945 4965/4973/4944 4952/4959/4930 +f 4957/4964/4935 4966/4974/4945 4958/4965/4936 +f 4966/4974/4945 4951/4957/4928 4967/4975/4946 +f 4967/4975/4946 4968/4976/4947 4939/4945/4916 +f 4958/4965/4936 4967/4975/4946 4945/4950/4921 +f 4941/4948/4919 4940/4946/4917 4970/4977/4948 +f 4940/4946/4917 4939/4945/4916 4969/4978/4949 +f 4969/4978/4949 4968/4976/4947 4948/4955/4926 +f 4970/4977/4948 4969/4978/4949 4947/4954/4925 +f 4971/4979/4950 4972/4980/4951 4973/4981/4952 +f 4972/4980/4951 4941/4948/4919 4970/4977/4948 +f 4973/4981/4952 4970/4977/4948 4947/4954/4925 +f 4974/4982/4953 4973/4981/4952 4975/4983/4954 +f 4977/4984/4955 4978/4985/4956 4979/4986/4957 +f 4978/4985/4956 4981/4987/4958 4979/4986/4957 +f 4979/4986/4957 4982/4988/4959 4983/4989/4960 +f 4980/4990/4961 4979/4986/4957 4984/4991/4962 +f 4981/4987/4958 4986/4992/4963 4982/4988/4959 +f 4986/4992/4963 4988/4993/4964 4987/4994/4965 +f 4987/4994/4965 4989/4995/4966 4990/4996/4967 +f 4982/4988/4959 4987/4994/4965 4983/4989/4960 +f 4985/4997/4968 4984/4991/4962 4991/4998/4969 +f 4984/4991/4962 4983/4989/4960 4993/4999/4970 +f 4991/4998/4969 4993/4999/4970 4994/5000/4971 +f 4992/5001/4972 4991/4998/4969 4995/5002/4973 +f 4997/5003/4974 4998/5004/4975 5000/5005/4976 +f 4998/5004/4975 4994/5000/4971 4999/5006/4977 +f 4999/5006/4977 5001/5007/4978 5002/5008/4979 +f 5000/5005/4976 4999/5006/4977 4383/4394/4364 +f 4976/5009/4980 4975/4983/4954 5003/5010/4981 +f 4975/4983/4954 4947/4954/4925 4950/4956/4927 +f 5003/5010/4981 4950/4956/4927 4405/4415/4385 +f 5002/5008/4979 5003/5010/4981 4403/4414/4384 +f 4379/4391/4361 5004/5011/4982 4380/4392/4362 +f 5004/5011/4982 5006/5012/4983 5005/5013/4984 +f 5005/5013/4984 5007/5014/4985 4997/5003/4974 +f 4380/4392/4362 5005/5013/4984 5000/5005/4976 +f 4997/5003/4974 5007/5014/4985 5009/5015/4986 +f 5007/5014/4985 5006/5012/4983 5008/5016/4987 +f 5008/5016/4987 5010/5017/4988 5012/5018/4989 +f 5009/5015/4986 5008/5016/4987 5013/5019/4990 +f 4737/5020/4991 5014/5021/4992 5015/5022/4993 +f 5014/5021/4992 5011/5023/4994 5016/5024/4995 +f 5015/5022/4993 5016/5024/4995 5018/5025/4996 +f 4738/4745/4716 5015/5022/4993 5018/5025/4996 +f 4379/4391/4361 4389/4400/4370 5019/5026/4997 +f 4389/4400/4370 4388/4399/4369 5020/5027/4998 +f 5019/5026/4997 5020/5027/4998 5021/5028/4999 +f 5004/5011/4982 5019/5026/4997 5022/5029/5000 +f 4388/4399/4369 4400/4410/4380 5023/5030/5001 +f 4400/4410/4380 4396/4406/4376 4758/4767/4738 +f 5023/5030/5001 4758/4767/4738 4761/5031/5002 +f 5020/5027/4998 5023/5030/5001 5024/5032/5003 +f 5017/5033/5004 5025/5034/5005 5026/5035/5006 +f 5025/5034/5005 5027/5036/5007 5026/5035/5006 +f 5026/5035/5006 5028/5037/5008 4749/4756/4727 +f 5018/5025/4996 5026/5035/5006 4749/4756/4727 +f 4761/5031/5002 4760/4766/4737 5029/5038/5009 +f 4760/4766/4737 4751/4758/4729 5029/5038/5009 +f 5029/5038/5009 4754/4760/4731 5031/5039/5010 +f 5030/5040/5011 5029/5038/5009 5027/5036/5007 +f 5027/5036/5007 5031/5039/5010 5028/5037/5008 +f 5031/5039/5010 4436/4449/4419 5032/5041/5012 +f 5032/5041/5012 4434/4447/4417 4747/4753/4724 +f 5028/5037/5008 5032/5041/5012 4746/4752/4723 +f 5021/5028/4999 5024/5032/5003 5033/5042/5013 +f 5024/5032/5003 4761/5031/5002 5030/5040/5011 +f 5033/5042/5013 5030/5040/5011 5027/5036/5007 +f 5034/5043/5014 5033/5042/5013 5025/5034/5005 +f 5006/5012/4983 5022/5029/5000 5035/5044/5015 +f 5022/5029/5000 5021/5028/4999 5034/5043/5014 +f 5035/5044/5015 5034/5043/5014 5017/5033/5004 +f 5010/5017/4988 5035/5044/5015 5016/5024/4995 +f 4977/4984/4955 4980/4990/4961 5037/5045/5016 +f 4980/4990/4961 4985/4997/4968 5036/5046/5017 +f 5036/5046/5017 5038/5047/5018 5040/5048/5019 +f 5037/5045/5016 5036/5046/5017 5041/5049/5020 +f 4985/4997/4968 4992/5001/4972 5038/5047/5018 +f 4992/5001/4972 4996/5050/5021 5042/5051/5022 +f 5042/5051/5022 5043/5052/5023 5045/5053/5024 +f 5038/5047/5018 5042/5051/5022 5039/5054/5025 +f 57/54/54 5046/5055/5026 5047/5056/5027 +f 5046/5055/5026 5041/5049/5020 5040/5048/5019 +f 5047/5056/5027 5040/5048/5019 5039/5054/5025 +f 58/55/55 5047/5056/5027 5048/5057/5028 +f 5039/5054/5025 5045/5053/5024 5048/5057/5028 +f 5045/5053/5024 5044/5058/5029 5049/5059/5030 +f 5049/5059/5030 5050/5060/5031 686/680/680 +f 5048/5057/5028 5049/5059/5030 59/56/56 +f 5051/5061/5032 5052/5062/5033 5054/5063/5034 +f 5052/5062/5033 4737/5020/4991 5053/5064/5035 +f 5053/5064/5035 4736/4744/4715 679/672/672 +f 5054/5063/5034 5053/5064/5035 678/671/671 +f 5044/5058/5029 5055/5065/5036 5050/5060/5031 +f 5055/5065/5036 5051/5061/5032 5056/5066/5037 +f 5056/5066/5037 5054/5063/5034 692/686/686 +f 5050/5060/5031 5056/5066/5037 688/681/681 +f 5013/5019/4990 5012/5018/4989 5058/5067/5038 +f 5012/5018/4989 5011/5023/4994 5057/5068/5039 +f 5057/5068/5039 5014/5021/4992 5052/5062/5033 +f 5058/5067/5038 5057/5068/5039 5051/5061/5032 +f 4996/5050/5021 5059/5069/5040 5043/5052/5023 +f 5059/5069/5040 5013/5019/4990 5060/5070/5041 +f 5060/5070/5041 5058/5067/5038 5055/5065/5036 +f 5043/5052/5023 5060/5070/5041 5044/5058/5029 +f 4994/5000/4971 4998/5004/4975 4995/5002/4973 +f 4998/5004/4975 4997/5003/4974 5061/5071/5042 +f 5061/5071/5042 5009/5015/4986 5059/5069/5040 +f 4995/5002/4973 5061/5071/5042 4996/5050/5021 +f 4983/4989/4960 4990/4996/4967 5062/5072/5043 +f 4990/4996/4967 4971/4979/4950 4974/4982/4953 +f 5062/5072/5043 4974/4982/4953 4976/5009/4980 +f 4993/4999/4970 5062/5072/5043 5001/5007/4978 +f 4988/4993/4964 5063/5073/5044 5064/5074/5045 +f 5063/5073/5044 4943/4949/4920 5064/5074/5045 +f 5064/5074/5045 4942/5075/5046 4972/4980/4951 +f 4989/4995/4966 5064/5074/5045 4971/4979/4950 +f 5065/5076/5047 5066/5077/5048 5068/5078/5049 +f 5066/5077/5048 917/907/906 5067/5079/5050 +f 5067/5079/5050 935/926/925 5069/5080/5051 +f 5068/5078/5049 5067/5079/5050 5070/5081/5052 +f 1497/1522/1491 3304/3323/3292 1498/5082/5053 +f 3304/3323/3292 3303/4293/4262 5071/5083/5054 +f 5071/5083/5054 5072/5084/5055 5069/5080/5051 +f 1498/5082/5053 5071/5083/5054 927/917/916 +f 5073/5085/5056 5074/5086/5057 5075/5087/5058 +f 5074/5086/5057 5077/5088/5059 5078/5089/5060 +f 5075/5087/5058 5078/5089/5060 5079/5090/5061 +f 5076/5091/5062 5075/5087/5058 5081/5092/5063 +f 5082/5093/5064 5083/5094/5065 5085/5095/5066 +f 5083/5094/5065 5086/5096/5067 5084/5097/5068 +f 5084/5097/5068 5087/5098/5069 5089/5099/5070 +f 5085/5095/5066 5084/5097/5068 5090/5100/5071 +f 5090/5100/5071 5089/5099/5070 5092/5101/5072 +f 5089/5099/5070 5088/5102/5073 5091/5103/5074 +f 5091/5103/5074 5093/5104/5075 5095/5105/5076 +f 5092/5101/5072 5091/5103/5074 5096/5106/5077 +f 5096/5106/5077 5095/5105/5076 5098/5107/5078 +f 5095/5105/5076 5094/5108/5079 5097/5109/5080 +f 5097/5109/5080 5099/5110/5081 5100/5111/5082 +f 5098/5107/5078 5097/5109/5080 5102/5112/5083 +f 5102/5112/5083 5101/5113/5084 5103/5114/5085 +f 5101/5113/5084 5100/5111/5082 5105/5115/5086 +f 5103/5114/5085 5105/5115/5086 5077/5088/5059 +f 5104/5116/5087 5103/5114/5085 5074/5086/5057 +f 5106/5117/5088 5107/5118/5089 5109/5119/5090 +f 5107/5118/5089 5110/5120/5091 5108/5121/5092 +f 5108/5121/5092 5111/5122/5093 5083/5094/5065 +f 5109/5119/5090 5108/5121/5092 5082/5093/5064 +f 5112/5123/5094 5113/5124/5095 5114/5125/5096 +f 5113/5124/5095 5116/5126/5097 5114/5125/5096 +f 5114/5125/5096 5117/5127/5098 5119/5128/5099 +f 5115/5129/5100 5114/5125/5096 5119/5128/5099 +f 5121/5130/5101 5122/5131/5102 5124/5132/5103 +f 5122/5131/5102 5125/5133/5104 5126/5134/5105 +f 5123/5135/5106 5126/5134/5105 5113/5124/5095 +f 5124/5132/5103 5123/5135/5106 5112/5123/5094 +f 5081/5092/5063 5080/5136/5107 5128/5137/5108 +f 5080/5136/5107 5079/5090/5061 5127/5138/5109 +f 5127/5138/5109 5129/5139/5110 5131/5140/5111 +f 5128/5137/5108 5127/5138/5109 5132/5141/5112 +f 5132/5141/5112 5131/5140/5111 5134/5142/5113 +f 5131/5140/5111 5130/5143/5114 5133/5144/5115 +f 5133/5144/5115 5135/5145/5116 5137/5146/5117 +f 5134/5142/5113 5133/5144/5115 5138/5147/5118 +f 5138/5147/5118 5137/5146/5117 5140/5148/5119 +f 5137/5146/5117 5136/5149/5120 5139/5150/5121 +f 5139/5150/5121 5141/5151/5122 5125/5133/5104 +f 5140/5148/5119 5139/5150/5121 5121/5130/5101 +f 5142/5152/5123 5143/5153/5124 5144/5154/5125 +f 5143/5153/5124 5146/5155/5126 5147/5156/5127 +f 5144/5154/5125 5147/5156/5127 5148/5157/5128 +f 5145/5158/5129 5144/5154/5125 5149/5159/5130 +f 5150/5160/5131 5149/5159/5130 5151/5161/5132 +f 5149/5159/5130 5148/5157/5128 5153/5162/5133 +f 5151/5161/5132 5153/5162/5133 5155/5163/5134 +f 5152/5164/5135 5151/5161/5132 5156/5165/5136 +f 5157/5166/5137 5158/5167/5138 5160/5168/5139 +f 5158/5167/5138 5161/5169/5140 5159/5170/5141 +f 5159/5170/5141 5162/5171/5142 5107/5118/5089 +f 5160/5168/5139 5159/5170/5141 5106/5117/5088 +f 5156/5165/5136 5155/5163/5134 5164/5172/5143 +f 5155/5163/5134 5154/5173/5144 5163/5174/5145 +f 5163/5174/5145 5165/5175/5146 5158/5167/5138 +f 5164/5172/5143 5163/5174/5145 5157/5166/5137 +f 5166/5176/5147 5167/5177/5148 5169/5178/5149 +f 5167/5177/5148 5170/5179/5150 5168/5180/5151 +f 5168/5180/5151 5171/5181/5152 5143/5153/5124 +f 5169/5178/5149 5168/5180/5151 5142/5152/5123 +f 5120/5182/5153 5119/5128/5099 5173/5183/5154 +f 5119/5128/5099 5118/5184/5155 5172/5185/5156 +f 5172/5185/5156 5174/5186/5157 5167/5177/5148 +f 5173/5183/5154 5172/5185/5156 5166/5176/5147 +f 5166/5176/5147 5175/5187/5158 5173/5183/5154 +f 5175/5187/5158 5177/5188/5159 5176/5189/5160 +f 5173/5183/5154 5176/5189/5160 5178/5190/5161 +f 5142/5152/5123 5179/5191/5162 5169/5178/5149 +f 5179/5191/5162 5181/5192/5163 5180/5193/5164 +f 5180/5193/5164 5182/5194/5165 5175/5187/5158 +f 5169/5178/5149 5180/5193/5164 5166/5176/5147 +f 5150/5160/5131 5183/5195/5166 5184/5196/5167 +f 5183/5195/5166 5185/5197/5168 5184/5196/5167 +f 5184/5196/5167 5186/5198/5169 5181/5192/5163 +f 5145/5158/5129 5184/5196/5167 5179/5191/5162 +f 5156/5165/5136 5187/5199/5170 5152/5164/5135 +f 5187/5199/5170 5189/5200/5171 5188/5201/5172 +f 5188/5201/5172 5190/5202/5173 5183/5195/5166 +f 5152/5164/5135 5188/5201/5172 5150/5160/5131 +f 5156/5165/5136 5164/5172/5143 5191/5203/5174 +f 5164/5172/5143 5157/5166/5137 5192/5204/5175 +f 5191/5203/5174 5192/5204/5175 5193/5205/5176 +f 5187/5199/5170 5191/5203/5174 5194/5206/5177 +f 5106/5117/5088 5195/5207/5178 5160/5168/5139 +f 5195/5207/5178 5193/5205/5176 5192/5204/5175 +f 5160/5168/5139 5196/5208/5179 5157/5166/5137 +f 5197/5209/5180 5198/5210/5181 5200/5211/5182 +f 5198/5210/5181 5201/5212/5183 5199/5213/5184 +f 5199/5213/5184 5202/5214/5185 2258/2278/2247 +f 5200/5211/5182 5199/5213/5184 2093/2113/2082 +f 5203/5215/5186 5204/5216/5187 5206/5217/5188 +f 5204/5216/5187 5197/5209/5180 5205/5218/5189 +f 5205/5218/5189 5200/5211/5182 2090/2111/2080 +f 5206/5217/5188 5205/5218/5189 2089/2110/2079 +f 2097/2118/2087 5207/5219/5190 2098/2120/2089 +f 5207/5219/5190 5209/5220/5191 5208/5221/5192 +f 5208/5221/5192 5210/5222/5193 5203/5215/5186 +f 2098/2120/2089 5208/5221/5192 5206/5217/5188 +f 2069/2091/2060 2068/2089/2058 5212/5223/5194 +f 2068/2089/2058 2067/2088/2057 5211/5224/5195 +f 5211/5224/5195 5213/5225/5196 5215/5226/5197 +f 5212/5223/5194 5211/5224/5195 5216/5227/5198 +f 5214/5228/5199 5217/5229/5200 5218/5230/5201 +f 5217/5229/5200 5219/5231/5202 5218/5230/5201 +f 5218/5230/5201 5220/5232/5203 5221/5233/5204 +f 5215/5226/5197 5218/5230/5201 5222/5234/5205 +f 5223/5235/5206 5224/5236/5207 5225/5237/5208 +f 5224/5236/5207 5227/5238/5209 5228/5239/5210 +f 5225/5237/5208 5228/5239/5210 5229/5240/5211 +f 5226/5241/5212 5225/5237/5208 5230/5242/5213 +f 5223/5235/5206 5226/5241/5212 5233/5243/5214 +f 5226/5241/5212 5231/5244/5215 5232/5245/5216 +f 5232/5245/5216 5234/5246/5217 5236/5247/5218 +f 5233/5243/5214 5232/5245/5216 5237/5248/5219 +f 5238/5249/5220 5239/5250/5221 5241/5251/5222 +f 5239/5250/5221 5237/5248/5219 5240/5252/5223 +f 5240/5252/5223 5242/5253/5224 5244/5254/5225 +f 5241/5251/5222 5240/5252/5223 5245/5255/5226 +f 5246/5256/5227 5247/5257/5228 5249/5258/5229 +f 5247/5257/5228 5250/5259/5230 5248/5260/5231 +f 5248/5260/5231 5251/5261/5232 5239/5250/5221 +f 5249/5258/5229 5248/5260/5231 5238/5249/5220 +f 5237/5248/5219 5251/5261/5232 5233/5243/5214 +f 5251/5261/5232 5250/5259/5230 5253/5262/5233 +f 5252/5263/5234 5253/5262/5233 5254/5264/5235 +f 5233/5243/5214 5252/5263/5234 5223/5235/5206 +f 5256/5265/5236 5257/5266/5237 5258/5267/5238 +f 5257/5266/5237 5260/5268/5239 5258/5267/5238 +f 5258/5267/5238 5261/5269/5240 5263/5270/5241 +f 5259/5271/5242 5258/5267/5238 5264/5272/5243 +f 5265/5273/5244 5266/5274/5245 5268/5275/5246 +f 5266/5274/5245 5269/5276/5247 5267/5277/5248 +f 5267/5277/5248 5270/5278/5249 5272/5279/5250 +f 5268/5275/5246 5267/5277/5248 5273/5280/5251 +f 5254/5264/5235 5274/5281/5252 5275/5282/5253 +f 5274/5281/5252 5276/5283/5254 5275/5282/5253 +f 5275/5282/5253 5277/5284/5255 5279/5285/5256 +f 5255/5286/5257 5275/5282/5253 5223/5235/5206 +f 5278/5287/5258 5277/5284/5255 5280/5288/5259 +f 5277/5284/5255 5276/5283/5254 5282/5289/5260 +f 5280/5288/5259 5282/5289/5260 5283/5290/5261 +f 5281/5291/5262 5280/5288/5259 5284/5292/5263 +f 4526/4739/4710 5286/5293/5264 4527/4537/4507 +f 5286/5293/5264 5269/5276/5247 5266/5274/5245 +f 5287/5294/5265 5266/5274/5245 5265/5273/5244 +f 4527/4537/4507 5287/5294/5265 5288/5295/5266 +f 5289/5296/5267 5290/5297/5268 5292/5298/5269 +f 5290/5297/5268 4533/4542/4512 4530/4540/4510 +f 5291/5299/5270 4530/4540/4510 4529/4539/4509 +f 5292/5298/5269 5291/5299/5270 5294/5300/5271 +f 4542/5301/5272 5295/5302/5273 5296/5303/5274 +f 5295/5302/5273 5297/5304/5275 5298/5305/5276 +f 5296/5303/5274 5298/5305/5276 5294/5300/5271 +f 4543/4552/4522 5296/5303/5274 5293/5306/5277 +f 5299/5307/5278 5300/5308/5279 5301/5309/5280 +f 5300/5308/5279 5303/5310/5281 5304/5311/5282 +f 5301/5309/5280 5304/5311/5282 5305/5312/5283 +f 5302/5313/5284 5301/5309/5280 5306/5314/5285 +f 5305/5312/5283 5307/5315/5286 5306/5314/5285 +f 5307/5315/5286 5309/5316/5287 5308/5317/5288 +f 5308/5317/5288 5310/5318/5289 5217/5229/5200 +f 5306/5314/5285 5308/5317/5288 5214/5228/5199 +f 5303/5310/5281 5311/5319/5290 5312/5320/5291 +f 5311/5319/5290 5313/5321/5292 5314/5322/5293 +f 5312/5320/5291 5314/5322/5293 5315/5323/5294 +f 5304/5311/5282 5312/5320/5291 5316/5324/5295 +f 5315/5323/5294 5317/5325/5296 5316/5324/5295 +f 5317/5325/5296 5319/5326/5297 5318/5327/5298 +f 5318/5327/5298 5320/5328/5299 5307/5315/5286 +f 5316/5324/5295 5318/5327/5298 5305/5312/5283 +f 5319/5326/5297 5321/5329/5300 5320/5328/5299 +f 5321/5329/5300 5245/5255/5226 5322/5330/5301 +f 5322/5330/5301 5244/5254/5225 5243/5331/5302 +f 5320/5328/5299 5322/5330/5301 5309/5316/5287 +f 5324/5332/5303 5325/5333/5304 5326/5334/5305 +f 5325/5333/5304 5328/5335/5306 5329/5336/5307 +f 5326/5334/5305 5329/5336/5307 5271/5337/5308 +f 5327/5338/5309 5326/5334/5305 5270/5278/5249 +f 5324/5332/5303 5330/5339/5310 5325/5333/5304 +f 5330/5339/5310 5289/5296/5267 5331/5340/5311 +f 5331/5340/5311 5332/5341/5312 5334/5342/5313 +f 5325/5333/5304 5331/5340/5311 5328/5335/5306 +f 5335/5343/5314 5336/5344/5315 5337/5345/5316 +f 5336/5344/5315 5238/5249/5220 5241/5251/5222 +f 5337/5345/5316 5241/5251/5222 5245/5255/5226 +f 5338/5346/5317 5337/5345/5316 5333/5347/5318 +f 5340/5348/5319 5341/5349/5320 5342/5350/5321 +f 5341/5349/5320 5246/5256/5227 5249/5258/5229 +f 5342/5350/5321 5249/5258/5229 5238/5249/5220 +f 5343/5351/5322 5342/5350/5321 5336/5344/5315 +f 5344/5352/5323 5345/5353/5324 5347/5354/5325 +f 5345/5353/5324 5340/5348/5319 5346/5355/5326 +f 5346/5355/5326 5343/5351/5322 5348/5356/5327 +f 5347/5354/5325 5346/5355/5326 5294/5300/5271 +f 5289/5296/5267 5292/5298/5269 5349/5357/5328 +f 5292/5298/5269 5294/5300/5271 5348/5356/5327 +f 5349/5357/5328 5348/5356/5327 5335/5343/5314 +f 5332/5341/5312 5349/5357/5328 5338/5346/5317 +f 5333/5347/5318 5339/5358/5329 5334/5342/5313 +f 5339/5358/5329 5245/5255/5226 5321/5329/5300 +f 5350/5359/5330 5321/5329/5300 5319/5326/5297 +f 5334/5342/5313 5350/5359/5330 5351/5360/5331 +f 5271/5337/5308 5329/5336/5307 5353/5361/5332 +f 5329/5336/5307 5328/5335/5306 5352/5362/5333 +f 5352/5362/5333 5351/5360/5331 5317/5325/5296 +f 5353/5361/5332 5352/5362/5333 5315/5323/5294 +f 5273/5280/5251 5272/5279/5250 5355/5363/5334 +f 5272/5279/5250 5271/5337/5308 5354/5364/5335 +f 5354/5364/5335 5353/5361/5332 5314/5322/5293 +f 5355/5363/5334 5354/5364/5335 5313/5321/5292 +f 4604/4619/4589 4603/4611/4581 5357/5365/5336 +f 4603/4611/4581 4528/4538/4508 5356/5366/5337 +f 5356/5366/5337 5288/5295/5266 5358/5367/5338 +f 5357/5365/5336 5356/5366/5337 5359/5368/5339 +f 5359/5368/5339 5358/5367/5338 5360/5369/5340 +f 5358/5367/5338 5265/5273/5244 5268/5275/5246 +f 5360/5369/5340 5268/5275/5246 5362/5370/5341 +f 5361/5371/5342 5360/5369/5340 5363/5372/5343 +f 4614/4622/4592 4613/4621/4591 5364/5373/5344 +f 4613/4621/4591 4604/4619/4589 5364/5373/5344 +f 5364/5373/5344 5357/5365/5336 5366/5374/5345 +f 5365/5375/5346 5364/5373/5344 5366/5374/5345 +f 5367/5376/5347 5366/5374/5345 5369/5377/5348 +f 5366/5374/5345 5359/5368/5339 5368/5378/5349 +f 5368/5378/5349 5361/5371/5342 5370/5379/5350 +f 5369/5377/5348 5368/5378/5349 5371/5380/5351 +f 5363/5372/5343 5372/5381/5352 5373/5382/5353 +f 5372/5381/5352 5374/5383/5354 5375/5384/5355 +f 5373/5382/5353 5375/5384/5355 5376/5385/5356 +f 5370/5379/5350 5373/5382/5353 5377/5386/5357 +f 5363/5372/5343 5362/5370/5341 5372/5381/5352 +f 5362/5370/5341 5273/5280/5251 5378/5387/5358 +f 5378/5387/5358 5355/5363/5334 5379/5388/5359 +f 5372/5381/5352 5378/5387/5358 5374/5383/5354 +f 5380/5389/5360 5381/5390/5361 5382/5391/5362 +f 5381/5390/5361 5374/5383/5354 5379/5388/5359 +f 5382/5391/5362 5379/5388/5359 5313/5321/5292 +f 5383/5392/5363 5382/5391/5362 5311/5319/5290 +f 5299/5307/5278 5384/5393/5364 5300/5308/5279 +f 5384/5393/5364 5386/5394/5365 5385/5395/5366 +f 5385/5395/5366 5387/5396/5367 5383/5392/5363 +f 5300/5308/5279 5385/5395/5366 5303/5310/5281 +f 2067/2088/2057 2116/2137/2106 5213/5225/5196 +f 2116/2137/2106 2113/2134/2103 5388/5397/5368 +f 5388/5397/5368 5389/5398/5369 5302/5313/5284 +f 5213/5225/5196 5388/5397/5368 5214/5228/5199 +f 2113/2134/2103 2112/2133/2102 5389/5398/5369 +f 2112/2133/2102 2111/2144/2113 5390/5399/5370 +f 5390/5399/5370 5391/5400/5371 5384/5393/5364 +f 5389/5398/5369 5390/5399/5370 5299/5307/5278 +f 2111/2144/2113 2122/2143/2112 5392/5401/5372 +f 2122/2143/2112 2121/2141/2110 5393/5402/5373 +f 5392/5401/5372 5393/5402/5373 5394/5403/5374 +f 5391/5400/5371 5392/5401/5372 5386/5394/5365 +f 5386/5394/5365 5395/5404/5375 5387/5396/5367 +f 5395/5404/5375 5394/5403/5374 5396/5405/5376 +f 5396/5405/5376 5397/5406/5377 5399/5407/5378 +f 5387/5396/5367 5396/5405/5376 5380/5389/5360 +f 5380/5389/5360 5399/5407/5378 5381/5390/5361 +f 5399/5407/5378 5398/5408/5379 5400/5409/5380 +f 5400/5409/5380 5401/5410/5381 5375/5384/5355 +f 5381/5390/5361 5400/5409/5380 5374/5383/5354 +f 5402/5411/5382 5403/5412/5383 5405/5413/5384 +f 5403/5412/5383 4656/4664/4635 4653/4662/4633 +f 5404/5414/5385 4653/4662/4633 4652/4661/4632 +f 5405/5413/5384 5404/5414/5385 5407/5415/5386 +f 4656/4664/4635 5403/5412/5383 4663/4671/4642 +f 5403/5412/5383 5402/5411/5382 5408/5416/5387 +f 5408/5416/5387 5409/5417/5388 5297/5304/5275 +f 4663/4671/4642 5408/5416/5387 4542/5301/5272 +f 5297/5304/5275 5410/5418/5389 5411/5419/5390 +f 5410/5418/5389 5412/5420/5391 5413/5421/5392 +f 5411/5419/5390 5413/5421/5392 5344/5352/5323 +f 5298/5305/5276 5411/5419/5390 5347/5354/5325 +f 5402/5411/5382 5414/5422/5393 5409/5417/5388 +f 5414/5422/5393 5416/5423/5394 5415/5424/5395 +f 5415/5424/5395 5417/5425/5396 5410/5418/5389 +f 5409/5417/5388 5415/5424/5395 5297/5304/5275 +f 5407/5415/5386 5418/5426/5397 5405/5413/5384 +f 5418/5426/5397 5420/5427/5398 5419/5428/5399 +f 5419/5428/5399 5421/5429/5400 5414/5422/5393 +f 5405/5413/5384 5419/5428/5399 5402/5411/5382 +f 5283/5290/5261 5422/5430/5401 5284/5292/5263 +f 5422/5430/5401 5424/5431/5402 5423/5432/5403 +f 5423/5432/5403 5425/5433/5404 5427/5434/5405 +f 5284/5292/5263 5423/5432/5403 5285/5435/5406 +f 5426/5436/5407 5425/5433/5404 5428/5437/5408 +f 5425/5433/5404 5424/5431/5402 5430/5438/5409 +f 5428/5437/5408 5430/5438/5409 5431/5439/5410 +f 5429/5440/5411 5428/5437/5408 5432/5441/5412 +f 5424/5431/5402 5434/5442/5413 5435/5443/5414 +f 5434/5442/5413 5420/5427/5398 5418/5426/5397 +f 5435/5443/5414 5418/5426/5397 5407/5415/5386 +f 5430/5438/5409 5435/5443/5414 5436/5444/5415 +f 5431/5439/5410 5436/5444/5415 5437/5445/5416 +f 5436/5444/5415 5407/5415/5386 5406/5446/5417 +f 5437/5445/5416 5406/5446/5417 4692/4700/4671 +f 5438/5447/5418 5437/5445/5416 4694/4703/4674 +f 5433/5448/5419 5432/5441/5412 5439/5449/5420 +f 5432/5441/5412 5431/5439/5410 5438/5447/5418 +f 5439/5449/5420 5438/5447/5418 4694/4703/4674 +f 5440/5450/5421 5439/5449/5420 4696/4704/4675 +f 5441/5451/5422 5442/5452/5423 5443/5453/5424 +f 5442/5452/5423 5433/5448/5419 5440/5450/5421 +f 5443/5453/5424 5440/5450/5421 4698/4707/4678 +f 5444/5454/5425 5443/5453/5424 4700/4708/4679 +f 5285/5435/5406 5427/5434/5405 5445/5455/5426 +f 5427/5434/5405 5426/5436/5407 5429/5440/5411 +f 5445/5455/5426 5429/5440/5411 5433/5448/5419 +f 5446/5456/5427 5445/5455/5426 5442/5452/5423 +f 5285/5435/5406 5446/5456/5427 5447/5457/5428 +f 5446/5456/5427 5441/5451/5422 5449/5458/5429 +f 5447/5457/5428 5449/5458/5429 5450/5459/5430 +f 5448/5460/5431 5447/5457/5428 5452/5461/5432 +f 4719/4928/4899 5453/5462/5433 4720/4727/4698 +f 5453/5462/5433 5455/5463/5434 5454/5464/5435 +f 5454/5464/5435 5456/5465/5436 5457/5466/5437 +f 4720/4727/4698 5454/5464/5435 4721/4728/4699 +f 4725/4731/4702 4724/4730/4701 5459/5467/5438 +f 4724/4730/4701 4721/4728/4699 5458/5468/5439 +f 5459/5467/5438 5458/5468/5439 5461/5469/5440 +f 5460/5470/5441 5459/5467/5438 5450/5459/5430 +f 4704/4712/4683 4728/4735/4706 5462/5471/5442 +f 4728/4735/4706 4725/4731/4702 5460/5470/5441 +f 5462/5471/5442 5460/5470/5441 5449/5458/5429 +f 5444/5454/5425 5462/5471/5442 5449/5458/5429 +f 4731/4742/4713 5463/5472/5443 5464/5473/5444 +f 5463/5472/5443 5324/5332/5303 5464/5473/5444 +f 5464/5473/5444 5327/5338/5309 5286/5293/5264 +f 4732/4738/4709 5464/5473/5444 4526/4739/4710 +f 4731/4742/4713 4734/4740/4711 5463/5472/5443 +f 4734/4740/4711 4533/4542/4512 5465/5474/5445 +f 5465/5474/5445 5290/5297/5268 5330/5339/5310 +f 5463/5472/5443 5465/5474/5445 5324/5332/5303 +f 5466/5475/5446 5467/5476/5447 5468/5477/5448 +f 5467/5476/5447 921/910/909 918/908/907 +f 5468/5477/5448 918/908/907 917/907/906 +f 5469/5478/5449 5468/5477/5448 5065/5076/5047 +f 5070/5081/5052 5072/5084/5055 5470/5479/5450 +f 5072/5084/5055 3303/4293/4262 4283/4295/4264 +f 5470/5479/5450 4283/4295/4264 4281/4292/4261 +f 5471/5480/5451 5470/5479/5450 5472/5481/5452 +f 2260/2279/2248 5474/5482/5453 2261/2281/2250 +f 5474/5482/5453 5476/5483/5454 5475/5484/5455 +f 5475/5484/5455 5477/5485/5456 5478/5486/5457 +f 2261/2281/2250 5475/5484/5455 2262/2283/2252 +f 5473/5487/5458 5472/5481/5452 5479/5488/5459 +f 5472/5481/5452 4281/4292/4261 4280/4291/4260 +f 5479/5488/5459 4280/4291/4260 3996/2286/5460 +f 5478/5486/5457 5479/5488/5459 2269/2289/2258 +f 5473/5487/5458 5477/5485/5456 5480/5489/5461 +f 5477/5485/5456 5476/5483/5454 5481/5490/5462 +f 5480/5489/5461 5481/5490/5462 5065/5076/5047 +f 5471/5480/5451 5480/5489/5461 5068/5078/5049 +f 5197/5209/5180 5482/5491/5463 5483/5492/5464 +f 5482/5491/5463 5484/5493/5465 5485/5494/5466 +f 5483/5492/5464 5485/5494/5466 5486/5495/5467 +f 5198/5210/5181 5483/5492/5464 5487/5496/5468 +f 5486/5495/5467 5488/5497/5469 5489/5498/5470 +f 5488/5497/5469 5110/5120/5091 5162/5171/5142 +f 5489/5498/5470 5162/5171/5142 5491/5499/5471 +f 5490/5500/5472 5489/5498/5470 5491/5499/5471 +f 5086/5096/5067 5111/5122/5093 5494/5501/5473 +f 5111/5122/5093 5110/5120/5091 5493/5502/5474 +f 5493/5502/5474 5488/5497/5469 5485/5494/5466 +f 5494/5501/5473 5493/5502/5474 5484/5493/5465 +f 5495/5503/5475 5496/5504/5476 5498/5505/5477 +f 5496/5504/5476 5499/5506/5478 5497/5507/5479 +f 5497/5507/5479 5500/5508/5480 5501/5509/5481 +f 5498/5505/5477 5497/5507/5479 5503/5510/5482 +f 5503/5510/5482 5504/5511/5483 5506/5512/5484 +f 5504/5511/5483 5507/5513/5485 5505/5514/5486 +f 5505/5514/5486 5508/5515/5487 5257/5266/5237 +f 5506/5512/5484 5505/5514/5486 5256/5265/5236 +f 5507/5513/5485 5509/5516/5488 5508/5515/5487 +f 5509/5516/5488 5511/5517/5489 5510/5518/5490 +f 5510/5518/5490 5512/5519/5491 5514/5520/5492 +f 5508/5515/5487 5510/5518/5490 5260/5268/5239 +f 5513/5521/5493 5512/5519/5491 5515/5522/5494 +f 5512/5519/5491 5511/5517/5489 5517/5523/5495 +f 5515/5522/5494 5517/5523/5495 5518/5524/5496 +f 5516/5525/5497 5515/5522/5494 5519/5526/5498 +f 5235/5527/5499 5234/5246/5217 5521/5528/5500 +f 5234/5246/5217 5231/5244/5215 5230/5242/5213 +f 5521/5528/5500 5230/5242/5213 5229/5240/5211 +f 5522/5529/5501 5521/5528/5500 5523/5530/5502 +f 5237/5248/5219 5236/5247/5218 5525/5531/5503 +f 5236/5247/5218 5235/5527/5499 5522/5529/5501 +f 5525/5531/5503 5522/5529/5501 5524/5532/5504 +f 5242/5253/5224 5525/5531/5503 5526/5533/5505 +f 5219/5231/5202 5310/5318/5289 5527/5534/5506 +f 5310/5318/5289 5309/5316/5287 5323/5535/5507 +f 5527/5534/5506 5323/5535/5507 5243/5331/5302 +f 5528/5536/5508 5527/5534/5506 5524/5532/5504 +f 5219/5231/5202 5528/5536/5508 5529/5537/5509 +f 5528/5536/5508 5524/5532/5504 5530/5538/5510 +f 5529/5537/5509 5530/5538/5510 5531/5539/5511 +f 5220/5232/5203 5529/5537/5509 5532/5540/5512 +f 5524/5532/5504 5523/5530/5502 5533/5541/5513 +f 5523/5530/5502 5229/5240/5211 5534/5542/5514 +f 5533/5541/5513 5534/5542/5514 5535/5543/5515 +f 5530/5538/5510 5533/5541/5513 5536/5544/5516 +f 5537/5545/5517 5538/5546/5518 5539/5547/5519 +f 5538/5546/5518 5541/5548/5520 5542/5549/5521 +f 5539/5547/5519 5542/5549/5521 5543/5550/5522 +f 5540/5551/5523 5539/5547/5519 5544/5552/5524 +f 5531/5539/5511 5536/5544/5516 5546/5553/5525 +f 5536/5544/5516 5535/5543/5515 5548/5554/5526 +f 5546/5553/5525 5548/5554/5526 5541/5548/5520 +f 5547/5555/5527 5546/5553/5525 5538/5546/5518 +f 5229/5240/5211 5228/5239/5210 5550/5556/5528 +f 5228/5239/5210 5227/5238/5209 5549/5557/5529 +f 5549/5557/5529 5551/5558/5530 5553/5559/5531 +f 5550/5556/5528 5549/5557/5529 5554/5560/5532 +f 5452/5461/5432 5555/5561/5533 5448/5460/5431 +f 5555/5561/5533 5552/5562/5534 5556/5563/5535 +f 5556/5563/5535 5557/5564/5536 5281/5291/5262 +f 5448/5460/5431 5556/5563/5535 5285/5435/5406 +f 5552/5562/5534 5551/5558/5530 5557/5564/5536 +f 5551/5558/5530 5227/5238/5209 5558/5565/5537 +f 5558/5565/5537 5224/5236/5207 5279/5285/5256 +f 5557/5564/5536 5558/5565/5537 5278/5287/5258 +f 5520/5566/5538 5519/5526/5498 5559/5567/5539 +f 5519/5526/5498 5518/5524/5496 5561/5568/5540 +f 5559/5567/5539 5561/5568/5540 5554/5560/5532 +f 5560/5569/5541 5559/5567/5539 5562/5570/5542 +f 5455/5463/5434 5564/5571/5543 5456/5465/5436 +f 5564/5571/5543 5520/5566/5538 5560/5569/5541 +f 5565/5572/5544 5560/5569/5541 5566/5573/5545 +f 5456/5465/5436 5565/5572/5544 5457/5466/5437 +f 5457/5466/5437 5566/5573/5545 5567/5574/5546 +f 5566/5573/5545 5563/5575/5547 5567/5574/5546 +f 5567/5574/5546 5568/5576/5548 5451/5577/5549 +f 5461/5469/5440 5567/5574/5546 5451/5577/5549 +f 5554/5560/5532 5553/5559/5531 5562/5570/5542 +f 5553/5559/5531 5552/5562/5534 5569/5578/5550 +f 5569/5578/5550 5555/5561/5533 5452/5461/5432 +f 5562/5570/5542 5569/5578/5550 5563/5575/5547 +f 5554/5560/5532 5561/5568/5540 5550/5556/5528 +f 5561/5568/5540 5518/5524/5496 5570/5579/5551 +f 5570/5579/5551 5571/5580/5552 5534/5542/5514 +f 5550/5556/5528 5570/5579/5551 5229/5240/5211 +f 5535/5543/5515 5571/5580/5552 5572/5581/5553 +f 5571/5580/5552 5518/5524/5496 5517/5523/5495 +f 5572/5581/5553 5517/5523/5495 5511/5517/5489 +f 5548/5554/5526 5572/5581/5553 5573/5582/5554 +f 5541/5548/5520 5573/5582/5554 5574/5583/5555 +f 5573/5582/5554 5511/5517/5489 5509/5516/5488 +f 5574/5583/5555 5509/5516/5488 5507/5513/5485 +f 5542/5549/5521 5574/5583/5555 5575/5584/5556 +f 5501/5509/5481 5576/5585/5557 5502/5586/5558 +f 5576/5585/5557 5543/5550/5522 5577/5587/5559 +f 5577/5587/5559 5575/5584/5556 5504/5511/5483 +f 5502/5586/5558 5577/5587/5559 5503/5510/5482 +f 5499/5506/5478 5578/5588/5560 5500/5508/5480 +f 5578/5588/5560 5580/5589/5561 5579/5590/5562 +f 5579/5590/5562 5581/5591/5563 5582/5592/5564 +f 5500/5508/5480 5579/5590/5562 5583/5593/5565 +f 5545/5594/5566 5544/5552/5524 5584/5595/5567 +f 5544/5552/5524 5543/5550/5522 5576/5585/5557 +f 5584/5595/5567 5576/5585/5557 5501/5509/5481 +f 5585/5596/5568 5584/5595/5567 5583/5593/5565 +f 5221/5233/5204 5532/5540/5512 5587/5597/5569 +f 5532/5540/5512 5531/5539/5511 5547/5555/5527 +f 5586/5598/5570 5547/5555/5527 5537/5545/5517 +f 5587/5597/5569 5586/5598/5570 5588/5599/5571 +f 5589/5600/5572 5588/5599/5571 5590/5601/5573 +f 5588/5599/5571 5537/5545/5517 5540/5551/5523 +f 5590/5601/5573 5540/5551/5523 5545/5594/5566 +f 5591/5602/5574 5590/5601/5573 5592/5603/5575 +f 5216/5227/5198 5222/5234/5205 5594/5604/5576 +f 5222/5234/5205 5221/5233/5204 5594/5604/5576 +f 5594/5604/5576 5587/5597/5569 5589/5600/5572 +f 5595/5605/5577 5594/5604/5576 5596/5606/5578 +f 2069/2091/2060 5212/5223/5194 5598/5607/5579 +f 5212/5223/5194 5216/5227/5198 5595/5605/5577 +f 5598/5607/5579 5595/5605/5577 5597/5608/5580 +f 2272/2292/2261 5598/5607/5579 5599/5609/5581 +f 2273/2294/2263 5599/5609/5581 5600/5610/5582 +f 5599/5609/5581 5597/5608/5580 5601/5611/5583 +f 5600/5610/5582 5601/5611/5583 5602/5612/5584 +f 2275/2296/2265 5600/5610/5582 5603/5613/5585 +f 5589/5600/5572 5591/5602/5574 5596/5606/5578 +f 5591/5602/5574 5593/5614/5586 5604/5615/5587 +f 5604/5615/5587 5605/5616/5588 5601/5611/5583 +f 5596/5606/5578 5604/5615/5587 5597/5608/5580 +f 5593/5614/5586 5606/5617/5589 5605/5616/5588 +f 5606/5617/5589 5608/5618/5590 5607/5619/5591 +f 5607/5619/5591 5609/5620/5592 5611/5621/5593 +f 5605/5616/5588 5607/5619/5591 5602/5612/5584 +f 5602/5612/5584 5611/5621/5593 5603/5613/5585 +f 5611/5621/5593 5610/5622/5594 5612/5623/5595 +f 5612/5623/5595 5613/5624/5596 5207/5219/5190 +f 5603/5613/5585 5612/5623/5595 2097/2118/2087 +f 5610/5622/5594 5614/5625/5597 5613/5624/5596 +f 5614/5625/5597 5616/5626/5598 5617/5627/5599 +f 5615/5628/5600 5617/5627/5599 5618/5629/5601 +f 5613/5624/5596 5615/5628/5600 5209/5220/5191 +f 5608/5618/5590 5620/5630/5602 5609/5620/5592 +f 5620/5630/5602 5622/5631/5603 5623/5632/5604 +f 5621/5633/5605 5623/5632/5604 5616/5626/5598 +f 5609/5620/5592 5621/5633/5605 5610/5622/5594 +f 5545/5594/5566 5585/5596/5568 5592/5603/5575 +f 5585/5596/5568 5582/5592/5564 5624/5634/5606 +f 5624/5634/5606 5625/5635/5607 5606/5617/5589 +f 5592/5603/5575 5624/5634/5606 5593/5614/5586 +f 5582/5592/5564 5581/5591/5563 5625/5635/5607 +f 5581/5591/5563 5580/5589/5561 5627/5636/5608 +f 5626/5637/5609 5627/5636/5608 5622/5631/5603 +f 5625/5635/5607 5626/5637/5609 5608/5618/5590 +f 5580/5589/5561 5628/5638/5610 5629/5639/5611 +f 5628/5638/5610 5079/5090/5061 5078/5089/5060 +f 5629/5639/5611 5078/5089/5060 5077/5088/5059 +f 5627/5636/5608 5629/5639/5611 5630/5640/5612 +f 5209/5220/5191 5619/5641/5613 5631/5642/5614 +f 5619/5641/5613 5618/5629/5601 5632/5643/5615 +f 5631/5642/5614 5632/5643/5615 5633/5644/5616 +f 5210/5222/5193 5631/5642/5614 5634/5645/5617 +f 5633/5644/5616 5635/5646/5618 5634/5645/5617 +f 5635/5646/5618 5484/5493/5465 5636/5647/5619 +f 5636/5647/5619 5482/5491/5463 5204/5216/5187 +f 5634/5645/5617 5636/5647/5619 5203/5215/5186 +f 5088/5102/5073 5087/5098/5069 5637/5648/5620 +f 5087/5098/5069 5086/5096/5067 5494/5501/5473 +f 5637/5648/5620 5494/5501/5473 5635/5646/5618 +f 5638/5649/5621 5637/5648/5620 5633/5644/5616 +f 5618/5629/5601 5639/5650/5622 5632/5643/5615 +f 5639/5650/5622 5094/5108/5079 5640/5651/5623 +f 5640/5651/5623 5093/5104/5075 5638/5649/5621 +f 5632/5643/5615 5640/5651/5623 5633/5644/5616 +f 5622/5631/5603 5630/5640/5612 5641/5652/5624 +f 5630/5640/5612 5077/5088/5059 5105/5115/5086 +f 5641/5652/5624 5105/5115/5086 5100/5111/5082 +f 5623/5632/5604 5641/5652/5624 5642/5653/5625 +f 5616/5626/5598 5642/5653/5625 5643/5654/5626 +f 5642/5653/5625 5100/5111/5082 5099/5110/5081 +f 5643/5654/5626 5099/5110/5081 5639/5650/5622 +f 5617/5627/5599 5643/5654/5626 5618/5629/5601 +f 5130/5143/5114 5129/5139/5110 5644/5655/5627 +f 5129/5139/5110 5079/5090/5061 5628/5638/5610 +f 5644/5655/5627 5628/5638/5610 5578/5588/5560 +f 5645/5656/5628 5644/5655/5627 5499/5506/5478 +f 5136/5149/5120 5135/5145/5116 5647/5657/5629 +f 5135/5145/5116 5130/5143/5114 5645/5656/5628 +f 5646/5658/5630 5645/5656/5628 5496/5504/5476 +f 5647/5657/5629 5646/5658/5630 5495/5503/5475 +f 4921/4936/4907 5648/5659/5631 4922/4927/4898 +f 5648/5659/5631 5650/5660/5632 5649/5661/5633 +f 5649/5661/5633 5651/5662/5634 5453/5462/5433 +f 4922/4927/4898 5649/5661/5633 4719/4928/4899 +f 5650/5660/5632 5652/5663/5635 5653/5664/5636 +f 5652/5663/5635 5513/5521/5493 5516/5525/5497 +f 5653/5664/5636 5516/5525/5497 5520/5566/5538 +f 5651/5662/5634 5653/5664/5636 5455/5463/5434 +f 5262/5665/5637 5261/5269/5240 5654/5666/5638 +f 5261/5269/5240 5260/5268/5239 5514/5520/5492 +f 5654/5666/5638 5514/5520/5492 5513/5521/5493 +f 5655/5667/5639 5654/5666/5638 5652/5663/5635 +f 4929/4940/4911 5656/5668/5640 4930/4935/4906 +f 5656/5668/5640 5262/5665/5637 5657/5669/5641 +f 5657/5669/5641 5655/5667/5639 5650/5660/5632 +f 4930/4935/4906 5657/5669/5641 4921/4936/4907 +f 5262/5665/5637 5656/5668/5640 5263/5270/5241 +f 5656/5668/5640 4929/4940/4911 5658/5670/5642 +f 5658/5670/5642 4932/4938/4909 5659/5671/5643 +f 5263/5270/5241 5658/5670/5642 5264/5272/5243 +f 5660/5672/5644 5661/5673/5645 5662/5674/5646 +f 5661/5673/5645 5664/5675/5647 5665/5676/5648 +f 5662/5674/5646 5665/5676/5648 4935/4942/4913 +f 5663/5677/5649 5662/5674/5646 4938/4944/4915 +f 4931/4937/4908 4946/4952/4923 5666/5678/5650 +f 4946/4952/4923 4935/4942/4913 5665/5676/5648 +f 5666/5678/5650 5665/5676/5648 5664/5675/5647 +f 5659/5671/5643 5666/5678/5650 5667/5679/5651 +f 5118/5184/5155 5668/5680/5652 5669/5681/5653 +f 5668/5680/5652 5670/5682/5654 5671/5683/5655 +f 5669/5681/5653 5671/5683/5655 5673/5684/5656 +f 5174/5186/5157 5669/5681/5653 5673/5684/5656 +f 5674/5685/5657 5675/5686/5658 5677/5687/5659 +f 5675/5686/5658 5678/5688/5660 5676/5689/5661 +f 5676/5689/5661 5679/5690/5662 5259/5271/5242 +f 5677/5687/5659 5676/5689/5661 5264/5272/5243 +f 5678/5688/5660 5680/5691/5663 5679/5690/5662 +f 5680/5691/5663 5495/5503/5475 5681/5692/5664 +f 5681/5692/5664 5498/5505/5477 5506/5512/5484 +f 5679/5690/5662 5681/5692/5664 5256/5265/5236 +f 5125/5133/5104 5141/5151/5122 5683/5693/5665 +f 5141/5151/5122 5136/5149/5120 5682/5694/5666 +f 5682/5694/5666 5647/5657/5629 5680/5691/5663 +f 5683/5693/5665 5682/5694/5666 5678/5688/5660 +f 5116/5126/5097 5126/5134/5105 5685/5695/5667 +f 5126/5134/5105 5125/5133/5104 5684/5696/5668 +f 5684/5696/5668 5683/5693/5665 5675/5686/5658 +f 5685/5695/5667 5684/5696/5668 5674/5685/5657 +f 5118/5184/5155 5117/5127/5098 5668/5680/5652 +f 5117/5127/5098 5116/5126/5097 5686/5697/5669 +f 5686/5697/5669 5685/5695/5667 5687/5698/5670 +f 5668/5680/5652 5686/5697/5669 5670/5682/5654 +f 5664/5675/5647 5688/5699/5671 5667/5679/5651 +f 5688/5699/5671 5670/5682/5654 5687/5698/5670 +f 5689/5700/5672 5687/5698/5670 5677/5687/5659 +f 5667/5679/5651 5689/5700/5672 5264/5272/5243 +f 5670/5682/5654 5688/5699/5671 5690/5701/5673 +f 5688/5699/5671 5664/5675/5647 5661/5673/5645 +f 5690/5701/5673 5661/5673/5645 5691/5702/5674 +f 5671/5683/5655 5690/5701/5673 5672/5703/5675 +f 5672/5703/5675 5691/5702/5674 5693/5704/5676 +f 5691/5702/5674 5660/5672/5644 5692/5705/5677 +f 5692/5705/5677 5694/5706/5678 5696/5707/5679 +f 5693/5704/5676 5692/5705/5677 5697/5708/5680 +f 5698/5709/5681 5699/5710/5682 5700/5711/5683 +f 5699/5710/5682 4981/4987/4958 4978/4985/4956 +f 5700/5711/5683 4978/4985/4956 4977/4984/4955 +f 5701/5712/5684 5700/5711/5683 5702/5713/5685 +f 5695/5714/5686 5704/5715/5687 5706/5716/5688 +f 5704/5715/5687 4988/4993/4964 5705/5717/5689 +f 5705/5717/5689 4986/4992/4963 4981/4987/4958 +f 5706/5716/5688 5705/5717/5689 5698/5709/5681 +f 5707/5718/5690 5708/5719/5691 5710/5720/5692 +f 5708/5719/5691 5698/5709/5681 5709/5721/5693 +f 5709/5721/5693 5701/5712/5684 5711/5722/5694 +f 5710/5720/5692 5709/5721/5693 5712/5723/5695 +f 5697/5708/5680 5713/5724/5696 5714/5725/5697 +f 5713/5724/5696 5707/5718/5690 5716/5726/5698 +f 5714/5725/5697 5716/5726/5698 5717/5727/5699 +f 5715/5728/5700 5714/5725/5697 5718/5729/5701 +f 5170/5179/5150 5673/5684/5656 5171/5181/5152 +f 5673/5684/5656 5672/5703/5675 5719/5730/5702 +f 5719/5730/5702 5693/5704/5676 5715/5728/5700 +f 5171/5181/5152 5719/5730/5702 5146/5155/5126 +f 5717/5727/5699 5720/5731/5703 5718/5729/5701 +f 5720/5731/5703 5722/5732/5704 5721/5733/5705 +f 5721/5733/5705 5723/5734/5706 5147/5156/5127 +f 5718/5729/5701 5721/5733/5705 5146/5155/5126 +f 5724/5735/5707 5725/5736/5708 5726/5737/5709 +f 5725/5736/5708 5722/5732/5704 5720/5731/5703 +f 5726/5737/5709 5720/5731/5703 5717/5727/5699 +f 5727/5738/5710 5726/5737/5709 5728/5739/5711 +f 5730/5740/5712 5731/5741/5713 5732/5742/5714 +f 5731/5741/5713 5724/5735/5707 5732/5742/5714 +f 5732/5742/5714 5734/5743/5715 5469/5478/5449 +f 5733/5744/5716 5732/5742/5714 5065/5076/5047 +f 5735/5745/5717 5736/5746/5718 5738/5747/5719 +f 5736/5746/5718 5154/5173/5144 5737/5748/5720 +f 5737/5748/5720 5153/5162/5133 5723/5734/5706 +f 5738/5747/5719 5737/5748/5720 5722/5732/5704 +f 5492/5749/5721 5491/5499/5471 5740/5750/5722 +f 5491/5499/5471 5161/5169/5140 5739/5751/5723 +f 5739/5751/5723 5165/5175/5146 5736/5746/5718 +f 5740/5750/5722 5739/5751/5723 5735/5745/5717 +f 5476/5483/5454 5741/5752/5724 5742/5753/5725 +f 5741/5752/5724 5743/5754/5726 5744/5755/5727 +f 5742/5753/5725 5744/5755/5727 5733/5744/5716 +f 5481/5490/5462 5742/5753/5725 5065/5076/5047 +f 5201/5212/5183 5487/5496/5468 5745/5756/5728 +f 5487/5496/5468 5486/5495/5467 5490/5500/5472 +f 5745/5756/5728 5490/5500/5472 5492/5749/5721 +f 5746/5757/5729 5745/5756/5728 5747/5758/5730 +f 2260/2279/2248 5202/5214/5185 5748/5759/5731 +f 5202/5214/5185 5201/5212/5183 5746/5757/5729 +f 5748/5759/5731 5746/5757/5729 5743/5754/5726 +f 5474/5482/5453 5748/5759/5731 5741/5752/5724 +f 5743/5754/5726 5747/5758/5730 5749/5760/5732 +f 5747/5758/5730 5492/5749/5721 5749/5760/5732 +f 5749/5760/5732 5740/5750/5722 5750/5761/5733 +f 5744/5755/5727 5749/5760/5732 5730/5740/5712 +f 5730/5740/5712 5750/5761/5733 5731/5741/5713 +f 5750/5761/5733 5735/5745/5717 5751/5762/5734 +f 5751/5762/5734 5738/5747/5719 5722/5732/5704 +f 5731/5741/5713 5751/5762/5734 5725/5736/5708 +f 5752/5763/5735 5753/5764/5736 5755/5765/5737 +f 5753/5764/5736 5703/5766/5738 5754/5767/5739 +f 5754/5767/5739 5702/5713/5685 5037/5045/5016 +f 5755/5765/5737 5754/5767/5739 5041/5049/5020 +f 5756/5768/5740 5757/5769/5741 5758/5770/5742 +f 5757/5769/5741 5712/5723/5695 5711/5722/5694 +f 5758/5770/5742 5711/5722/5694 5703/5766/5738 +f 5759/5771/5743 5758/5770/5742 5753/5764/5736 +f 5752/5763/5735 5755/5765/5737 5761/5772/5744 +f 5755/5765/5737 5041/5049/5020 5046/5055/5026 +f 5760/5773/5745 5046/5055/5026 57/54/54 +f 5761/5772/5744 5760/5773/5745 829/823/822 +f 1422/1433/1416 5762/5774/5746 5763/5775/5747 +f 5762/5774/5746 5756/5768/5740 5759/5771/5743 +f 5763/5775/5747 5759/5771/5743 5752/5763/5735 +f 1423/1434/1417 5763/5775/5747 5761/5772/5744 +f 921/910/909 5467/5476/5447 5764/5776/5748 +f 5467/5476/5447 5466/5475/5446 5765/5777/5749 +f 5764/5776/5748 5765/5777/5749 5766/5778/5750 +f 1413/1424/1407 5764/5776/5748 5767/5779/5751 +f 1414/1425/1408 5767/5779/5751 5768/5780/5752 +f 5767/5779/5751 5766/5778/5750 5769/5781/5753 +f 5768/5780/5752 5769/5781/5753 5756/5768/5740 +f 1427/1438/1421 5768/5780/5752 5762/5774/5746 +f 5466/5475/5446 5734/5743/5715 5770/5782/5754 +f 5734/5743/5715 5724/5735/5707 5727/5738/5710 +f 5770/5782/5754 5727/5738/5710 5729/5783/5755 +f 5765/5777/5749 5770/5782/5754 5771/5784/5756 +f 5766/5778/5750 5771/5784/5756 5772/5785/5757 +f 5771/5784/5756 5729/5783/5755 5773/5786/5758 +f 5772/5785/5757 5773/5786/5758 5712/5723/5695 +f 5769/5781/5753 5772/5785/5757 5757/5769/5741 +f 5729/5783/5755 5728/5739/5711 5774/5787/5759 +f 5728/5739/5711 5717/5727/5699 5716/5726/5698 +f 5774/5787/5759 5716/5726/5698 5707/5718/5690 +f 5773/5786/5758 5774/5787/5759 5710/5720/5692 +f 5697/5708/5680 5696/5707/5679 5713/5724/5696 +f 5696/5707/5679 5695/5714/5686 5775/5788/5760 +f 5775/5788/5760 5706/5716/5688 5708/5719/5691 +f 5713/5724/5696 5775/5788/5760 5707/5718/5690 +f 5660/5672/5644 5663/5677/5649 5694/5706/5678 +f 5663/5677/5649 4943/4949/4920 5776/5789/5761 +f 5776/5789/5761 5063/5073/5044 5704/5715/5687 +f 5694/5706/5678 5776/5789/5761 5695/5714/5686 +f 5777/5790/5762 5778/5791/5763 5780/5792/5764 +f 5778/5791/5763 5781/5793/5765 5779/5794/5766 +f 5779/5794/5766 5782/5795/5767 5784/5796/5768 +f 5780/5792/5764 5779/5794/5766 5785/5797/5769 +f 2325/2346/2315 2324/2345/2314 5786/5798/5770 +f 2324/2345/2314 2313/2335/2304 5788/5799/5771 +f 5786/5798/5770 5788/5799/5771 5789/5800/5772 +f 5787/5801/5773 5786/5798/5770 5790/5802/5774 +f 5783/5803/5775 5792/5804/5776 5794/5805/5777 +f 5792/5804/5776 5791/5806/5778 5793/5807/5779 +f 5793/5807/5779 5790/5802/5774 5795/5808/5780 +f 5794/5805/5777 5793/5807/5779 5796/5809/5781 +f 5789/5800/5772 5788/5799/5771 5798/5810/5782 +f 5788/5799/5771 2313/2335/2304 5797/5811/5783 +f 5797/5811/5783 2316/2337/2306 2321/2342/2311 +f 5798/5810/5782 5797/5811/5783 5799/5812/5784 +f 2382/2400/2369 5801/5813/5785 2383/2401/2370 +f 5801/5813/5785 5803/5814/5786 5804/5815/5787 +f 5802/5816/5788 5804/5815/5787 5805/5817/5789 +f 2383/2401/2370 5802/5816/5788 5806/5818/5790 +f 5805/5817/5789 5807/5819/5791 5806/5818/5790 +f 5807/5819/5791 5800/5820/5792 5808/5821/5793 +f 5808/5821/5793 5799/5812/5784 2412/2431/2400 +f 5806/5818/5790 5808/5821/5793 2386/2403/2372 +f 5800/5820/5792 5807/5819/5791 5810/5822/5794 +f 5807/5819/5791 5805/5817/5789 5809/5823/5795 +f 5810/5822/5794 5809/5823/5795 5812/5824/5796 +f 5796/5809/5781 5795/5808/5780 5813/5825/5797 +f 5795/5808/5780 5789/5800/5772 5813/5825/5797 +f 5813/5825/5797 5798/5810/5782 5800/5820/5792 +f 5814/5826/5798 5813/5825/5797 5810/5822/5794 +f 5785/5797/5769 5784/5796/5768 5815/5827/5799 +f 5784/5796/5768 5783/5803/5775 5815/5827/5799 +f 5815/5827/5799 5794/5805/5777 5817/5828/5800 +f 5816/5829/5801 5815/5827/5799 5817/5828/5800 +f 5819/5830/5802 5820/5831/5803 5822/5832/5804 +f 5820/5831/5803 5818/5833/5805 5821/5834/5806 +f 5821/5834/5806 5817/5828/5800 5814/5826/5798 +f 5822/5832/5804 5821/5834/5806 5814/5826/5798 +f 5823/5835/5807 5824/5836/5808 5825/5837/5809 +f 5824/5836/5808 5827/5838/5810 5828/5839/5811 +f 5825/5837/5809 5828/5839/5811 2456/5840/5812 +f 5826/5841/5813 5825/5837/5809 2639/2654/2623 +f 5829/5842/5814 5830/5843/5815 5831/5844/5816 +f 5830/5843/5815 5823/5835/5807 5826/5841/5813 +f 5831/5844/5816 5826/5841/5813 2639/2654/2623 +f 5832/5845/5817 5831/5844/5816 2644/2653/2622 +f 5833/5846/5818 5834/5847/5819 5836/5848/5820 +f 5834/5847/5819 5837/5849/5821 5835/5850/5822 +f 5835/5850/5822 5838/5851/5823 2474/2488/2457 +f 5836/5848/5820 5835/5850/5822 2473/2487/2456 +f 5839/5852/5824 5840/5853/5825 5841/5854/5826 +f 5840/5853/5825 5833/5846/5818 5841/5854/5826 +f 5841/5854/5826 5836/5848/5820 2688/2701/2670 +f 5842/5855/5827 5841/5854/5826 2686/2700/2669 +f 2434/2451/2420 5843/5856/5828 5844/5857/5829 +f 5843/5856/5828 5839/5852/5824 5842/5855/5827 +f 5844/5857/5829 5842/5855/5827 2686/2700/2669 +f 2435/2452/2421 5844/5857/5829 2438/2454/2423 +f 2327/2347/2316 2326/5858/5830 2693/2707/2676 +f 2326/5858/5830 2325/2346/2315 5845/5859/5831 +f 5845/5859/5831 5787/5801/5773 5846/5860/5832 +f 2693/2707/2676 5845/5859/5831 5846/5860/5832 +f 5781/5793/5765 5847/5861/5833 5782/5795/5767 +f 5847/5861/5833 2695/2709/2678 5848/5862/5834 +f 5848/5862/5834 5846/5860/5832 5792/5804/5776 +f 5782/5795/5767 5848/5862/5834 5783/5803/5775 +f 2695/2709/2678 5847/5861/5833 5849/5863/5835 +f 5847/5861/5833 5781/5793/5765 5850/5864/5836 +f 5849/5863/5835 5850/5864/5836 5839/5852/5824 +f 2698/2711/2680 5849/5863/5835 5843/5856/5828 +f 5777/5790/5762 5851/5865/5837 5852/5866/5838 +f 5851/5865/5837 5833/5846/5818 5840/5853/5825 +f 5852/5866/5838 5840/5853/5825 5839/5852/5824 +f 5778/5791/5763 5852/5866/5838 5850/5864/5836 +f 5853/5867/5839 5854/5868/5840 5855/5869/5841 +f 5854/5868/5840 5837/5849/5821 5834/5847/5819 +f 5855/5869/5841 5834/5847/5819 5833/5846/5818 +f 5851/5865/5837 5777/5790/5762 5856/5870/5842 +f 5837/5849/5821 5857/5871/5843 5838/5851/5823 +f 5857/5871/5843 2705/2718/2687 5858/5872/5844 +f 5858/5872/5844 2704/2717/2686 2944/2954/2923 +f 5838/5851/5823 5858/5872/5844 2475/2490/2459 +f 2711/2768/2737 2710/2722/2691 5859/5873/5845 +f 2710/2722/2691 2705/2718/2687 5857/5871/5843 +f 5859/5873/5845 5857/5871/5843 5837/5849/5821 +f 5860/5874/5846 5859/5873/5845 5854/5868/5840 +f 2742/2752/2721 5861/5875/5847 2743/2754/2723 +f 5861/5875/5847 5863/5876/5848 5862/5877/5849 +f 5862/5877/5849 5864/5878/5850 5832/5845/5817 +f 2743/2754/2723 5862/5877/5849 5832/5845/5817 +f 5865/5879/5851 5866/5880/5852 5868/5881/5853 +f 5866/5880/5852 5869/5882/5854 5870/5883/5855 +f 5867/5884/5856 5870/5883/5855 5872/5885/5857 +f 5868/5881/5853 5867/5884/5856 5863/5876/5848 +f 5873/5886/5858 5874/5887/5859 5876/5888/5860 +f 5874/5887/5859 5877/5889/5861 5875/5890/5862 +f 5875/5890/5862 5878/5891/5863 5869/5882/5854 +f 5876/5888/5860 5875/5890/5862 5865/5879/5851 +f 2746/2756/2725 5879/5892/5864 2747/2758/2727 +f 5879/5892/5864 5865/5879/5851 5880/5893/5865 +f 5880/5893/5865 5868/5881/5853 5861/5875/5847 +f 2747/2758/2727 5880/5893/5865 2742/2752/2721 +f 5873/5886/5858 5876/5888/5860 5881/5894/5866 +f 5876/5888/5860 5865/5879/5851 5879/5892/5864 +f 5881/5894/5866 5879/5892/5864 2746/2756/2725 +f 5882/5895/5867 5881/5894/5866 2749/2759/2728 +f 5818/5833/5805 5820/5831/5803 5884/5896/5868 +f 5820/5831/5803 5819/5830/5802 5883/5897/5869 +f 5883/5897/5869 5885/5898/5870 5887/5899/5871 +f 5884/5896/5868 5883/5897/5869 5888/5900/5872 +f 5888/5900/5872 5889/5901/5873 5884/5896/5868 +f 5889/5901/5873 5891/5902/5874 5890/5903/5875 +f 5890/5903/5875 5892/5904/5876 5816/5829/5801 +f 5884/5896/5868 5890/5903/5875 5818/5833/5805 +f 2711/2768/2737 5860/5874/5846 5893/5905/5877 +f 5860/5874/5846 5853/5867/5839 5894/5906/5878 +f 5893/5905/5877 5894/5906/5878 5891/5902/5874 +f 2757/2769/2738 5893/5905/5877 5895/5907/5879 +f 5891/5902/5874 5894/5906/5878 5892/5904/5876 +f 5894/5906/5878 5853/5867/5839 5856/5870/5842 +f 5777/5790/5762 5780/5792/5764 5896/5908/5880 +f 5892/5904/5876 5896/5908/5880 5785/5797/5769 +f 5888/5900/5872 5897/5909/5881 5898/5910/5882 +f 5897/5909/5881 5899/5911/5883 5900/5912/5884 +f 5898/5910/5882 5900/5912/5884 2755/2766/2735 +f 5889/5901/5873 5898/5910/5882 5895/5907/5879 +f 5886/5913/5885 5901/5914/5886 5902/5915/5887 +f 5901/5914/5886 5903/5916/5888 5904/5917/5889 +f 5902/5915/5887 5904/5917/5889 5899/5911/5883 +f 5887/5899/5871 5902/5915/5887 5897/5909/5881 +f 5869/5882/5854 5878/5891/5863 5906/5918/5890 +f 5878/5891/5863 5877/5889/5861 5905/5919/5891 +f 5905/5919/5891 5907/5920/5892 5909/5921/5893 +f 5906/5918/5890 5905/5919/5891 5910/5922/5894 +f 5910/5922/5894 5911/5923/5895 5906/5918/5890 +f 5911/5923/5895 5913/5924/5896 5912/5925/5897 +f 5912/5925/5897 5914/5926/5898 5870/5883/5855 +f 5906/5918/5890 5912/5925/5897 5869/5882/5854 +f 5913/5924/5896 5911/5923/5895 5916/5927/5899 +f 5911/5923/5895 5910/5922/5894 5915/5928/5900 +f 5915/5928/5900 5917/5929/5901 5918/5930/5902 +f 5916/5927/5899 5915/5928/5900 5919/5931/5903 +f 5823/5835/5807 5830/5843/5815 5920/5932/5904 +f 5830/5843/5815 5829/5842/5814 5921/5933/5905 +f 5920/5932/5904 5921/5933/5905 5922/5934/5906 +f 5824/5836/5808 5920/5932/5904 5827/5838/5810 +f 5829/5842/5814 5864/5878/5850 5924/5935/5907 +f 5864/5878/5850 5863/5876/5848 5872/5885/5857 +f 5924/5935/5907 5872/5885/5857 5871/5936/5908 +f 5921/5933/5905 5924/5935/5907 5925/5937/5909 +f 5871/5936/5908 5914/5926/5898 5925/5937/5909 +f 5914/5926/5898 5913/5924/5896 5926/5938/5910 +f 5926/5938/5910 5916/5927/5899 5927/5939/5911 +f 5925/5937/5909 5926/5938/5910 5922/5934/5906 +f 5812/5824/5796 5811/5940/5912 5929/5941/5913 +f 5811/5940/5912 5805/5817/5789 5804/5815/5787 +f 5928/5942/5914 5804/5815/5787 5803/5814/5786 +f 5929/5941/5913 5928/5942/5914 5930/5943/5915 +f 5803/5814/5786 5801/5813/5785 5930/5943/5915 +f 5801/5813/5785 2382/2400/2369 5932/5944/5916 +f 5932/5944/5916 2452/2468/2437 2451/2467/2436 +f 5930/5943/5915 5932/5944/5916 5933/5945/5917 +f 2451/2467/2436 2454/2469/2438 5933/5945/5917 +f 2454/2469/2438 2456/5840/5812 5934/5946/5918 +f 5934/5946/5918 5828/5839/5811 5827/5838/5810 +f 5933/5945/5917 5934/5946/5918 5935/5947/5919 +f 5886/5913/5885 5885/5898/5870 5936/5948/5920 +f 5885/5898/5870 5819/5830/5802 5822/5832/5804 +f 5936/5948/5920 5822/5832/5804 5812/5824/5796 +f 5937/5949/5921 5936/5948/5920 5929/5941/5913 +f 5827/5838/5810 5923/5950/5922 5935/5947/5919 +f 5923/5950/5922 5922/5934/5906 5927/5939/5911 +f 5938/5951/5923 5927/5939/5911 5919/5931/5903 +f 5935/5947/5919 5938/5951/5923 5939/5952/5924 +f 5919/5931/5903 5918/5930/5902 5939/5952/5924 +f 5918/5930/5902 5903/5916/5888 5940/5953/5925 +f 5940/5953/5925 5901/5914/5886 5937/5949/5921 +f 5939/5952/5924 5940/5953/5925 5931/5954/5926 +f 5910/5922/5894 5909/5921/5893 5917/5929/5901 +f 5909/5921/5893 5908/5955/5927 5942/5956/5928 +f 5941/5957/5929 5942/5956/5928 5904/5917/5889 +f 5917/5929/5901 5941/5957/5929 5903/5916/5888 +f 5908/5955/5927 5907/5920/5892 5943/5958/5930 +f 5907/5920/5892 5877/5889/5861 5874/5887/5859 +f 5943/5958/5930 5874/5887/5859 5873/5886/5858 +f 5942/5956/5928 5943/5958/5930 5944/5959/5931 +f 5899/5911/5883 5944/5959/5931 5945/5960/5932 +f 5944/5959/5931 5873/5886/5858 5882/5895/5867 +f 5945/5960/5932 5882/5895/5867 2751/2762/2731 +f 5900/5912/5884 5945/5960/5932 2753/2763/2732 +f 5946/5961/5933 5947/5962/5934 5948/5963/5935 +f 5947/5962/5934 5950/5964/5936 5951/5965/5937 +f 5948/5963/5935 5951/5965/5937 5952/5966/5938 +f 5949/5967/5939 5948/5963/5935 5953/5968/5940 +f 5955/5969/5941 5956/5970/5942 5958/5971/5943 +f 5956/5970/5942 3323/3340/3309 5957/5972/5944 +f 5957/5972/5944 3327/3344/3313 3326/3343/3312 +f 5958/5971/5943 5957/5972/5944 5959/5973/5945 +f 5955/5969/5941 5958/5971/5943 5960/5974/5946 +f 5958/5971/5943 5959/5973/5945 5962/5975/5947 +f 5960/5974/5946 5962/5975/5947 5946/5961/5933 +f 5961/5976/5948 5960/5974/5946 5963/5977/5949 +f 3325/3430/3399 3324/3342/3311 5966/5978/5950 +f 3324/3342/3311 3323/3340/3309 5965/5979/5951 +f 5965/5979/5951 5956/5970/5942 5967/5980/5952 +f 5966/5978/5950 5965/5979/5951 5968/5981/5953 +f 5969/5982/5954 5970/5983/5955 5972/5984/5956 +f 5970/5983/5955 5973/5985/5957 5974/5986/5958 +f 5971/5987/5959 5974/5986/5958 3392/3406/3375 +f 5972/5984/5956 5971/5987/5959 3390/3404/3373 +f 3325/3430/3399 5966/5978/5950 5975/5988/5960 +f 5966/5978/5950 5968/5981/5953 5976/5989/5961 +f 5975/5988/5960 5976/5989/5961 5969/5982/5954 +f 3417/3432/3401 5975/5988/5960 5972/5984/5956 +f 5969/5982/5954 5976/5989/5961 5978/5990/5962 +f 5976/5989/5961 5968/5981/5953 5977/5991/5963 +f 5978/5990/5962 5977/5991/5963 5979/5992/5964 +f 5968/5981/5953 5967/5980/5952 5979/5992/5964 +f 5967/5980/5952 5955/5969/5941 5981/5993/5965 +f 5981/5993/5965 5961/5976/5948 5982/5994/5966 +f 5979/5992/5964 5981/5993/5965 5980/5995/5967 +f 5964/5996/5968 5963/5977/5949 5983/5997/5969 +f 5963/5977/5949 5946/5961/5933 5949/5967/5939 +f 5983/5997/5969 5949/5967/5939 5954/5998/5970 +f 5984/5999/5971 5983/5997/5969 5986/6000/5972 +f 5964/5996/5968 5984/5999/5971 5987/6001/5973 +f 5984/5999/5971 5986/6000/5972 5988/6002/5974 +f 5987/6001/5973 5988/6002/5974 5989/6003/5975 +f 5982/5994/5966 5987/6001/5973 5980/5995/5967 +f 3460/6004/5976 5991/6005/5977 5992/6006/5978 +f 5991/6005/5977 5993/6007/5979 5994/6008/5980 +f 5992/6006/5978 5994/6008/5980 5995/6009/5981 +f 3642/3649/3618 5992/6006/5978 5996/6010/5982 +f 3639/3644/3613 5996/6010/5982 3649/3654/3623 +f 5996/6010/5982 5995/6009/5981 5997/6011/5983 +f 5997/6011/5983 5998/6012/5984 6000/6013/5985 +f 3649/3654/3623 5997/6011/5983 3508/3515/3484 +f 3473/3482/3451 6001/6014/5986 6002/6015/5987 +f 6001/6014/5986 6003/6016/5988 6004/6017/5989 +f 6002/6015/5987 6004/6017/5989 6005/6018/5990 +f 3474/3483/3452 6002/6015/5987 6006/6019/5991 +f 3477/3485/3454 6006/6019/5991 6007/6020/5992 +f 6006/6019/5991 6005/6018/5990 6008/6021/5993 +f 6007/6020/5992 6008/6021/5993 6009/6022/5994 +f 3692/3698/3667 6007/6020/5992 6010/6023/5995 +f 3688/3694/3663 6010/6023/5995 6011/6024/5996 +f 6010/6023/5995 6009/6022/5994 6011/6024/5996 +f 6011/6024/5996 6012/6025/5997 3443/3455/3424 +f 3689/3695/3664 6011/6024/5996 3443/3455/3424 +f 5959/5973/5945 3326/6026/3312 6013/6027/5998 +f 3326/6026/3312 3329/3345/3314 6013/6027/5998 +f 6013/6027/5998 3329/3345/3314 3700/3707/3676 +f 6013/6028/5998 3700/3707/3676 3699/3705/3674 +f 5959/5973/5945 6013/6028/5998 6014/6029/5999 +f 6013/6028/5998 3699/3705/3674 6014/6029/5999 +f 6014/6029/5999 6015/6030/6000 5947/5962/5934 +f 5962/5975/5947 6014/6029/5999 5947/5962/5934 +f 6009/6022/5994 6016/6031/6001 6012/6025/5997 +f 6016/6031/6001 5950/5964/5936 6017/6032/6002 +f 6017/6032/6002 6015/6030/6000 3703/3712/3681 +f 6012/6025/5997 6017/6032/6002 3703/3712/3681 +f 6009/6022/5994 6008/6021/5993 6018/6033/6003 +f 6008/6021/5993 6005/6018/5990 6018/6033/6003 +f 6018/6033/6003 6019/6034/6004 5951/5965/5937 +f 6016/6031/6001 6018/6033/6003 5950/5964/5936 +f 6005/6018/5990 6004/6017/5989 6019/6034/6004 +f 6004/6017/5989 6003/6016/5988 6020/6035/6005 +f 6020/6035/6005 6021/6036/6006 6023/6037/6007 +f 6019/6034/6004 6020/6035/6005 5952/5966/5938 +f 3704/3713/3682 3707/3716/3685 6024/6038/6008 +f 3707/3716/3685 3709/3718/3687 6025/6039/6009 +f 6024/6038/6008 6025/6039/6009 6003/6016/5988 +f 3947/3953/3922 6024/6038/6008 6001/6014/5986 +f 6003/6016/5988 6025/6039/6009 6021/6036/6006 +f 6025/6039/6009 3709/3718/3687 6026/6040/6010 +f 6026/6040/6010 3711/3722/3691 6027/6041/6011 +f 6021/6036/6006 6026/6040/6010 6022/6042/6012 +f 5999/6043/6013 6028/6044/6014 6000/6013/5985 +f 6028/6044/6014 6030/6045/6015 6031/6046/6016 +f 6029/6047/6017 6031/6046/6016 3746/3753/3722 +f 6000/6013/5985 6029/6047/6017 3508/3515/3484 +f 6032/6048/6018 6033/6049/6019 6034/6050/6020 +f 6033/6049/6019 6036/6051/6021 6037/6052/6022 +f 6034/6050/6020 6037/6052/6022 6038/6053/6023 +f 6035/6054/6024 6034/6050/6020 6039/6055/6025 +f 6036/6051/6021 6040/6056/6026 6037/6052/6022 +f 6040/6056/6026 6042/6057/6027 6041/6058/6028 +f 6041/6058/6028 6043/6059/6029 6045/6060/6030 +f 6037/6052/6022 6041/6058/6028 6045/6060/6030 +f 6030/6045/6015 6039/6055/6025 6046/6061/6031 +f 6039/6055/6025 6038/6053/6023 6047/6062/6032 +f 6046/6061/6031 6047/6062/6032 3750/3757/3726 +f 6031/6046/6016 6046/6061/6031 3748/3755/3724 +f 3750/3757/3726 6047/6062/6032 3754/3762/3731 +f 6047/6062/6032 6038/6053/6023 6048/6063/6033 +f 6048/6063/6033 6045/6060/6030 6049/6064/6034 +f 3754/3762/3731 6048/6063/6033 3755/3765/3734 +f 6050/6065/6035 6051/6066/6036 6052/6067/6037 +f 6051/6066/6036 5989/6003/5975 5988/6002/5974 +f 6052/6067/6037 5988/6002/5974 5986/6000/5972 +f 6053/6068/6038 6052/6067/6037 6054/6069/6039 +f 5954/5998/5970 6056/6070/6040 6057/6071/6041 +f 6056/6070/6040 6058/6072/6042 6059/6073/6043 +f 6057/6071/6041 6059/6073/6043 6055/6074/6044 +f 5985/6075/6045 6057/6071/6041 6054/6069/6039 +f 6058/6072/6042 6060/6076/6046 6062/6077/6047 +f 6060/6076/6046 6022/6042/6012 6061/6078/6048 +f 6061/6078/6048 6027/6041/6011 3761/3769/3738 +f 6062/6077/6047 6061/6078/6048 3759/3767/3736 +f 5952/5966/5938 6023/6037/6007 5953/5968/5940 +f 6023/6037/6007 6022/6042/6012 6063/6079/6049 +f 6063/6079/6049 6060/6076/6046 6058/6072/6042 +f 5953/5968/5940 6063/6079/6049 5954/5998/5970 +f 3759/3767/3736 6064/6080/6050 6062/6077/6047 +f 6064/6080/6050 6066/6081/6051 6065/6082/6052 +f 6065/6082/6052 6067/6083/6053 6059/6073/6043 +f 6062/6077/6047 6065/6082/6052 6058/6072/6042 +f 6066/6081/6051 6068/6084/6054 6067/6083/6053 +f 6068/6084/6054 6070/6085/6055 6069/6086/6056 +f 6069/6086/6056 6071/6087/6057 6053/6068/6038 +f 6067/6083/6053 6069/6086/6056 6055/6074/6044 +f 6072/6088/6058 6073/6089/6059 6074/6090/6060 +f 6073/6089/6059 6042/6057/6027 6040/6056/6026 +f 6074/6090/6060 6040/6056/6026 6036/6051/6021 +f 6075/6091/6061 6074/6090/6060 6076/6092/6062 +f 6032/6048/6018 6078/6093/6063 6033/6049/6019 +f 6078/6093/6063 6080/6094/6064 6079/6095/6065 +f 6079/6095/6065 6081/6096/6066 6077/6097/6067 +f 6033/6049/6019 6079/6095/6065 6036/6051/6021 +f 6070/6085/6055 6082/6098/6068 6083/6099/6069 +f 6082/6098/6068 6077/6097/6067 6081/6096/6066 +f 6083/6099/6069 6081/6096/6066 6080/6094/6064 +f 6084/6100/6070 6083/6099/6069 6085/6101/6071 +f 6087/6102/6072 6088/6103/6073 6090/6104/6074 +f 6088/6103/6073 5999/6043/6013 6089/6105/6075 +f 6089/6105/6075 5998/6012/5984 5994/6008/5980 +f 6090/6104/6074 6089/6105/6075 5993/6007/5979 +f 6032/6048/6018 6035/6054/6024 6092/6106/6076 +f 6035/6054/6024 6030/6045/6015 6091/6107/6077 +f 6091/6107/6077 6028/6044/6014 6088/6103/6073 +f 6092/6106/6076 6091/6107/6077 6087/6102/6072 +f 6086/6108/6078 6085/6101/6071 6093/6109/6079 +f 6085/6101/6071 6080/6094/6064 6078/6093/6063 +f 6093/6109/6079 6078/6093/6063 6032/6048/6018 +f 6094/6110/6080 6093/6109/6079 6092/6106/6076 +f 5973/5985/5957 5970/5983/5955 6096/6111/6081 +f 5970/5983/5955 5969/5982/5954 6095/6112/6082 +f 6095/6112/6082 5978/5990/5962 5980/5995/5967 +f 6096/6111/6081 6095/6112/6082 6098/6113/6083 +f 3458/3468/3437 3457/3467/3436 6099/6114/6084 +f 3457/3467/3436 3392/3406/3375 5974/5986/5958 +f 6099/6114/6084 5974/5986/5958 5973/5985/5957 +f 6100/6115/6085 6099/6114/6084 6098/6113/6083 +f 5993/6007/5979 5991/6005/5977 6101/6116/6086 +f 5991/6005/5977 3460/6004/5976 3459/3470/3439 +f 6101/6116/6086 3459/3470/3439 3458/3468/3437 +f 6102/6117/6087 6101/6116/6086 6098/6113/6083 +f 5980/5995/5967 5990/6118/6088 6103/6119/6089 +f 5990/6118/6088 5989/6003/5975 6051/6066/6036 +f 6103/6119/6089 6051/6066/6036 6104/6120/6090 +f 6097/6121/6091 6103/6119/6089 6098/6113/6083 +f 6086/6108/6078 6094/6110/6080 6106/6122/6092 +f 6094/6110/6080 6087/6102/6072 6105/6123/6093 +f 6105/6123/6093 6090/6104/6074 6102/6117/6087 +f 6106/6122/6092 6105/6123/6093 6098/6113/6083 +f 6050/6065/6035 6071/6087/6057 6107/6124/6094 +f 6071/6087/6057 6070/6085/6055 6084/6100/6070 +f 6107/6124/6094 6084/6100/6070 6086/6108/6078 +f 6104/6120/6090 6107/6124/6094 6098/6113/6083 +f 6066/6081/6051 6108/6125/6095 6109/6126/6096 +f 6108/6125/6095 6072/6088/6058 6075/6091/6061 +f 6109/6126/6096 6075/6091/6061 6077/6097/6067 +f 6068/6084/6054 6109/6126/6096 6082/6098/6068 +f 6044/6127/6097 6043/6059/6029 6111/6128/6098 +f 6043/6059/6029 6042/6057/6027 6110/6129/6099 +f 6110/6129/6099 6073/6089/6059 6108/6125/6095 +f 6111/6128/6098 6110/6129/6099 6066/6081/6051 +f 3755/3765/3734 6049/6064/6034 3758/6130/6100 +f 6049/6064/6034 6044/6127/6097 6112/6131/6101 +f 6112/6131/6101 6111/6128/6098 6064/6080/6050 +f 3758/6130/6100 6112/6131/6101 3759/3767/3736 +f 6113/6132/6102 6114/6133/6103 6115/6134/6104 +f 6114/6133/6103 6117/6135/6105 6118/6136/6106 +f 6115/6134/6104 6118/6136/6106 6120/6137/6107 +f 6116/6138/6108 6115/6134/6104 6121/6139/6109 +f 6122/6140/6110 6123/6141/6111 6124/6142/6112 +f 6123/6141/6111 6126/6143/6113 6127/6144/6114 +f 6124/6142/6112 6127/6144/6114 6128/6145/6115 +f 6125/6146/6116 6124/6142/6112 6130/6147/6117 +f 6131/6148/6118 6132/6149/6119 6133/6150/6120 +f 6132/6149/6119 6126/6143/6113 6135/6151/6121 +f 6133/6150/6120 6135/6151/6121 6136/6152/6122 +f 6134/6153/6123 6133/6150/6120 6137/6154/6124 +f 6122/6140/6110 6139/6155/6125 6140/6156/6126 +f 6139/6155/6125 6141/6157/6127 6142/6158/6128 +f 6140/6156/6126 6142/6158/6128 6136/6152/6122 +f 6123/6141/6111 6140/6156/6126 6126/6143/6113 +f 6136/6152/6122 6143/6159/6129 6137/6154/6124 +f 6143/6159/6129 6145/6160/6130 6144/6161/6131 +f 6144/6161/6131 6146/6162/6132 6148/6163/6133 +f 6137/6154/6124 6144/6161/6131 6138/6164/6134 +f 6141/6157/6127 6149/6165/6135 6150/6166/6136 +f 6149/6165/6135 6151/6167/6137 6152/6168/6138 +f 6150/6166/6136 6152/6168/6138 6145/6160/6130 +f 6142/6158/6128 6150/6166/6136 6143/6159/6129 +f 6153/6169/6139 6154/6170/6140 6155/6171/6141 +f 6154/6170/6140 6151/6167/6137 6155/6171/6141 +f 6156/6172/6142 6155/6171/6141 6141/6157/6127 +f 6147/6173/6143 6146/6162/6132 6157/6174/6144 +f 6146/6162/6132 6145/6160/6130 6159/6175/6145 +f 6157/6174/6144 6159/6175/6145 4317/4331/4301 +f 6158/6176/6146 6157/6174/6144 4317/4331/4301 +f 6160/6177/6147 6161/6178/6148 6162/6179/6149 +f 6161/6178/6148 6164/6180/6150 6165/6181/6151 +f 6162/6179/6149 6165/6181/6151 6167/6182/6152 +f 6163/6183/6153 6162/6179/6149 6168/6184/6154 +f 6169/6185/6155 6170/6186/6156 6172/6187/6157 +f 6170/6186/6156 6164/6180/6150 6171/6188/6158 +f 6171/6188/6158 6161/6178/6148 6173/6189/6159 +f 6172/6187/6157 6171/6188/6158 6174/6190/6160 +f 6160/6177/6147 6163/6183/6153 6176/6191/6161 +f 6163/6183/6153 6168/6184/6154 6177/6192/6162 +f 6175/6193/6163 6177/6192/6162 6121/6139/6109 +f 6176/6191/6161 6175/6193/6163 6179/6194/6164 +f 6121/6139/6109 6120/6137/6107 6178/6195/6165 +f 6120/6137/6107 6119/6196/6166 6180/6197/6167 +f 6180/6197/6167 6181/6198/6168 6183/6199/6169 +f 6178/6195/6165 6180/6197/6167 6179/6194/6164 +f 6182/6200/6170 6181/6198/6168 6184/6201/6171 +f 6181/6198/6168 6119/6196/6166 6186/6202/6172 +f 6184/6201/6171 6186/6202/6172 6131/6148/6118 +f 6185/6203/6173 6184/6201/6171 6138/6164/6134 +f 6187/6204/6174 6188/6205/6175 6190/6206/6176 +f 6188/6205/6175 6182/6200/6170 6189/6207/6177 +f 6189/6207/6177 6185/6203/6173 6148/6163/6133 +f 6190/6206/6176 6189/6207/6177 6147/6173/6143 +f 6179/6194/6164 6183/6199/6169 6191/6208/6178 +f 6183/6199/6169 6182/6200/6170 6188/6205/6175 +f 6191/6208/6178 6188/6205/6175 6187/6204/6174 +f 6192/6209/6179 6191/6208/6178 6193/6210/6180 +f 6160/6177/6147 6176/6191/6161 6195/6211/6181 +f 6176/6191/6161 6179/6194/6164 6192/6209/6179 +f 6195/6211/6181 6192/6209/6179 6194/6212/6182 +f 6173/6189/6159 6195/6211/6181 6196/6213/6183 +f 6169/6185/6155 6172/6187/6157 6197/6214/6184 +f 6172/6187/6157 6174/6190/6160 6199/6215/6185 +f 6197/6214/6184 6199/6215/6185 4327/4343/4313 +f 6198/6216/6186 6197/6214/6184 4326/4339/4309 +f 6174/6190/6160 6196/6213/6183 6200/6217/6187 +f 6196/6213/6183 6194/6212/6182 6201/6218/6188 +f 6200/6217/6187 6201/6218/6188 4333/4349/4319 +f 6199/6215/6185 6200/6217/6187 4332/4345/4315 +f 6194/6212/6182 6193/6210/6180 6202/6219/6189 +f 6193/6210/6180 6187/6204/6174 6203/6220/6190 +f 6202/6219/6189 6203/6220/6190 4339/4354/4324 +f 6201/6218/6188 6202/6219/6189 4338/4351/4321 +f 6187/6204/6174 6190/6206/6176 6204/6221/6191 +f 6190/6206/6176 6147/6173/6143 6158/6176/6146 +f 6204/6221/6191 6158/6176/6146 4316/4329/4299 +f 6203/6220/6190 6204/6221/6191 4342/4355/4325 +f 6131/6148/6118 6205/6222/6192 6206/6223/6193 +f 6205/6222/6192 6207/6224/6194 6206/6223/6193 +f 6206/6223/6193 6208/6225/6195 6128/6145/6115 +f 6132/6149/6119 6206/6223/6193 6127/6144/6114 +f 6119/6196/6166 6118/6136/6106 6209/6226/6196 +f 6118/6136/6106 6117/6135/6105 6209/6226/6196 +f 6209/6226/6196 6210/6227/6197 6205/6222/6192 +f 6186/6202/6172 6209/6226/6196 6205/6222/6192 +f 6113/6132/6102 6116/6138/6108 6211/6228/6198 +f 6116/6138/6108 6121/6139/6109 6177/6192/6162 +f 6211/6228/6198 6177/6192/6162 6168/6184/6154 +f 6212/6229/6199 6211/6228/6198 6213/6230/6200 +f 6214/6231/6201 6213/6230/6200 6215/6232/6202 +f 6213/6230/6200 6168/6184/6154 6167/6182/6152 +f 6215/6232/6202 6167/6182/6152 6166/6233/6203 +f 6216/6234/6204 6215/6232/6202 6217/6235/6205 +f 6219/6236/6206 6220/6237/6207 6221/6238/6208 +f 6220/6237/6207 6166/6233/6203 6165/6181/6151 +f 6221/6238/6208 6165/6181/6151 6164/6180/6150 +f 6222/6239/6209 6221/6238/6208 6169/6185/6155 +f 4347/4360/4330 6223/6240/6210 4348/4361/4331 +f 6223/6240/6210 6219/6236/6206 6222/6239/6209 +f 6224/6241/6211 6222/6239/6209 6198/6216/6186 +f 4348/4361/4331 6224/6241/6211 4325/4337/4307 +f 6225/6242/6212 6226/6243/6213 6228/6244/6214 +f 6226/6243/6213 6218/6245/6215 6217/6235/6205 +f 6227/6246/6216 6217/6235/6205 6220/6237/6207 +f 6228/6244/6214 6227/6246/6216 6220/6237/6207 +f 6153/6169/6139 6156/6172/6142 6230/6247/6217 +f 6156/6172/6142 6141/6157/6127 6229/6248/6218 +f 6229/6248/6218 6139/6155/6125 6231/6249/6219 +f 6230/6247/6217 6229/6248/6218 6232/6250/6220 +f 6130/6147/6117 6233/6251/6221 6234/6252/6222 +f 6233/6251/6221 6235/6253/6223 6234/6252/6222 +f 6234/6252/6222 6236/6254/6224 6232/6250/6220 +f 6125/6146/6116 6234/6252/6222 6231/6249/6219 +f 6235/6253/6223 6237/6255/6225 6236/6254/6224 +f 6237/6255/6225 6239/6256/6226 6238/6257/6227 +f 6238/6257/6227 6240/6258/6228 6242/6259/6229 +f 6236/6254/6224 6238/6257/6227 6232/6250/6220 +f 4355/4367/4337 4363/4375/4345 6243/6260/6230 +f 4363/4375/4345 4362/4374/4344 6245/6261/6231 +f 6243/6260/6230 6245/6261/6231 6232/6250/6220 +f 6244/6262/6232 6243/6260/6230 6242/6259/6229 +f 4369/4381/4351 4368/4380/4350 6247/6263/6233 +f 4368/4380/4350 4318/6264/6234 6246/6265/6235 +f 6246/6265/6235 6159/6175/6145 6152/6168/6138 +f 6247/6263/6233 6246/6265/6235 6151/6167/6137 +f 4375/4389/4359 4374/4386/4356 6248/6266/6236 +f 4374/4386/4356 4369/4381/4351 6247/6263/6233 +f 6248/6266/6236 6247/6263/6233 6154/6170/6140 +f 6249/6267/6237 6248/6266/6236 6154/6170/6140 +f 4362/4374/4344 4378/4390/4360 6250/6268/6238 +f 4378/4390/4360 4375/4389/4359 6249/6267/6237 +f 6250/6268/6238 6249/6267/6237 6153/6169/6139 +f 6245/6261/6231 6250/6268/6238 6230/6247/6217 +f 6251/6269/6239 6252/6270/6240 6254/6271/6241 +f 6252/6270/6240 6255/6272/6242 6256/6273/6243 +f 6253/6274/6244 6256/6273/6243 6257/6275/6245 +f 6254/6271/6241 6253/6274/6244 6258/6276/6246 +f 6260/6277/6247 6261/6278/6248 6263/6279/6249 +f 6261/6278/6248 6264/6280/6250 6262/6281/6251 +f 6262/6281/6251 6265/6282/6252 6266/6283/6253 +f 6263/6279/6249 6262/6281/6251 6268/6284/6254 +f 6269/6285/6255 6270/6286/6256 6272/6287/6257 +f 6270/6286/6256 6264/6280/6250 6271/6288/6258 +f 6271/6288/6258 6273/6289/6259 6275/6290/6260 +f 6272/6287/6257 6271/6288/6258 6276/6291/6261 +f 6269/6285/6255 6277/6292/6262 6270/6286/6256 +f 6277/6292/6262 6279/6293/6263 6278/6294/6264 +f 6278/6294/6264 6280/6295/6265 6266/6283/6253 +f 6270/6286/6256 6278/6294/6264 6265/6282/6252 +f 6281/6296/6266 6282/6297/6267 6283/6298/6268 +f 6282/6297/6267 6285/6299/6269 6283/6298/6268 +f 6283/6298/6268 6286/6300/6270 6269/6285/6255 +f 6284/6301/6271 6283/6298/6268 6272/6287/6257 +f 6285/6299/6269 6287/6302/6272 6286/6300/6270 +f 6287/6302/6272 6289/6303/6273 6288/6304/6274 +f 6288/6304/6274 6290/6305/6275 6277/6292/6262 +f 6286/6300/6270 6288/6304/6274 6269/6285/6255 +f 6289/6303/6273 6291/6306/6276 6290/6305/6275 +f 6291/6306/6276 6293/6307/6277 6294/6308/6278 +f 6290/6305/6275 6292/6309/6279 6294/6308/6278 +f 5081/5092/5063 6295/6310/6280 5076/5091/5062 +f 6295/6310/6280 6285/6299/6269 6282/6297/6267 +f 6296/6311/6281 6282/6297/6267 6297/6312/6282 +f 5076/5091/5062 6296/6311/6281 5073/5085/5056 +f 6298/6313/6283 6299/6314/6284 6300/6315/6285 +f 6299/6314/6284 6302/6316/6286 6303/6317/6287 +f 6300/6315/6285 6303/6317/6287 6305/6318/6288 +f 6301/6319/6289 6300/6315/6285 6305/6318/6288 +f 6304/6320/6290 6303/6317/6287 6307/6321/6291 +f 6303/6317/6287 6302/6316/6286 6309/6322/6292 +f 6307/6321/6291 6309/6322/6292 6310/6323/6293 +f 6308/6324/6294 6307/6321/6291 6311/6325/6295 +f 6259/6326/6296 6313/6327/6297 6314/6328/6298 +f 6313/6327/6297 6306/6329/6299 6314/6328/6298 +f 6314/6328/6298 6305/6318/6288 6304/6320/6290 +f 6315/6330/6300 6314/6328/6298 6316/6331/6301 +f 6318/6332/6302 6319/6333/6303 6321/6334/6304 +f 6319/6333/6303 6251/6269/6239 6320/6335/6305 +f 6320/6335/6305 6254/6271/6241 6315/6330/6300 +f 6321/6334/6304 6320/6335/6305 6317/6336/6306 +f 6274/6337/6307 6322/6338/6308 6323/6339/6309 +f 6322/6338/6308 6251/6269/6239 6319/6333/6303 +f 6323/6339/6309 6319/6333/6303 6318/6332/6302 +f 6275/6290/6260 6323/6339/6309 6324/6340/6310 +f 6276/6291/6261 6324/6340/6310 6325/6341/6311 +f 6324/6340/6310 6318/6332/6302 6326/6342/6312 +f 6325/6341/6311 6326/6342/6312 6327/6343/6313 +f 6284/6301/6271 6325/6341/6311 6328/6344/6314 +f 6327/6343/6313 6326/6342/6312 6330/6345/6315 +f 6326/6342/6312 6318/6332/6302 6329/6346/6316 +f 6329/6346/6316 6321/6334/6304 6331/6347/6317 +f 6330/6345/6315 6329/6346/6316 6332/6348/6318 +f 6332/6348/6318 6331/6347/6317 6334/6349/6319 +f 6331/6347/6317 6317/6336/6306 6333/6350/6320 +f 6333/6350/6320 6316/6331/6301 6308/6324/6294 +f 6334/6349/6319 6333/6350/6320 6312/6351/6321 +f 5090/5100/5071 6335/6352/6322 5085/5095/5066 +f 6335/6352/6322 6312/6351/6321 6336/6353/6323 +f 6336/6353/6323 6311/6325/6295 6337/6354/6324 +f 5085/5095/5066 6336/6353/6323 5082/5093/5064 +f 5096/5106/5077 6338/6355/6325 5092/5101/5072 +f 6338/6355/6325 6332/6348/6318 6339/6356/6326 +f 6339/6356/6326 6334/6349/6319 6335/6352/6322 +f 5092/5101/5072 6339/6356/6326 5090/5100/5071 +f 5102/5112/5083 6340/6357/6327 5098/5107/5078 +f 6340/6357/6327 6327/6343/6313 6341/6358/6328 +f 6341/6358/6328 6330/6345/6315 6338/6355/6325 +f 5098/5107/5078 6341/6358/6328 5096/5106/5077 +f 5073/5085/5056 6297/6312/6282 5104/5116/5087 +f 6297/6312/6282 6281/6296/6266 6342/6359/6329 +f 6342/6359/6329 6328/6344/6314 6340/6357/6327 +f 5104/5116/5087 6342/6359/6329 5102/5112/5083 +f 6260/6277/6247 6343/6360/6330 6261/6278/6248 +f 6343/6360/6330 6345/6361/6331 6344/6362/6332 +f 6344/6362/6332 6346/6363/6333 6274/6337/6307 +f 6261/6278/6248 6344/6362/6332 6273/6289/6259 +f 6345/6361/6331 6347/6364/6334 6348/6365/6335 +f 6347/6364/6334 6255/6272/6242 6252/6270/6240 +f 6348/6365/6335 6252/6270/6240 6251/6269/6239 +f 6346/6363/6333 6348/6365/6335 6322/6338/6308 +f 6306/6329/6299 6313/6327/6297 6350/6366/6336 +f 6313/6327/6297 6259/6326/6296 6349/6367/6337 +f 6349/6367/6337 6258/6276/6246 6351/6368/6338 +f 6350/6366/6336 6349/6367/6337 6351/6368/6338 +f 6298/6313/6283 6301/6319/6289 6354/6369/6339 +f 6301/6319/6289 6306/6329/6299 6353/6370/6340 +f 6353/6370/6340 6350/6366/6336 6352/6371/6341 +f 6354/6369/6339 6353/6370/6340 6355/6372/6342 +f 6302/6316/6286 6299/6314/6284 6309/6322/6292 +f 6299/6314/6284 6298/6313/6283 6357/6373/6343 +f 6357/6373/6343 6358/6374/6344 6360/6375/6345 +f 6309/6322/6292 6357/6373/6343 6360/6375/6345 +f 6310/6323/6293 6360/6375/6345 6361/6376/6346 +f 6360/6375/6345 6359/6377/6347 6361/6376/6346 +f 6361/6376/6346 6362/6378/6348 5109/5119/5090 +f 6337/6354/6324 6361/6376/6346 5109/5119/5090 +f 6298/6313/6283 6354/6369/6339 6363/6379/6349 +f 6354/6369/6339 6356/6380/6350 6363/6379/6349 +f 6363/6379/6349 6364/6381/6351 6365/6382/6352 +f 6358/6374/6344 6363/6379/6349 6359/6377/6347 +f 6266/6283/6253 6280/6295/6265 6368/6383/6353 +f 6280/6295/6265 6279/6293/6263 6294/6308/6278 +f 6367/6384/6354 6294/6308/6278 6293/6307/6277 +f 6368/6383/6353 6367/6384/6354 6370/6385/6355 +f 6370/6385/6355 6371/6386/6356 6372/6387/6357 +f 6371/6386/6356 6373/6388/6358 6374/6389/6359 +f 6372/6387/6357 6374/6389/6359 6267/6390/6360 +f 6368/6383/6353 6372/6387/6357 6266/6283/6253 +f 6375/6391/6361 6376/6392/6362 6378/6393/6363 +f 6376/6392/6362 6379/6394/6364 6380/6395/6365 +f 6377/6396/6366 6380/6395/6365 6373/6388/6358 +f 6378/6393/6363 6377/6396/6366 6371/6386/6356 +f 6370/6385/6355 6381/6397/6367 6382/6398/6368 +f 6381/6397/6367 5121/5130/5101 5124/5132/5103 +f 6382/6398/6368 5124/5132/5103 6384/6399/6369 +f 6378/6393/6363 6382/6398/6368 6375/6391/6361 +f 6285/6299/6269 6295/6310/6280 6385/6400/6370 +f 6295/6310/6280 5081/5092/5063 5128/5137/5108 +f 6385/6400/6370 5128/5137/5108 5132/5141/5112 +f 6287/6302/6272 6385/6400/6370 6386/6401/6371 +f 6289/6303/6273 6386/6401/6371 6291/6306/6276 +f 6386/6401/6371 5132/5141/5112 6387/6402/6372 +f 6387/6402/6372 5134/5142/5113 6388/6403/6373 +f 6291/6306/6276 6387/6402/6372 6293/6307/6277 +f 6293/6307/6277 6388/6403/6373 6369/6404/6374 +f 6388/6403/6373 5138/5147/5118 6389/6405/6375 +f 6389/6405/6375 5140/5148/5119 6381/6397/6367 +f 6369/6404/6374 6389/6405/6375 6381/6397/6367 +f 6390/6406/6376 6391/6407/6377 6392/6408/6378 +f 6391/6407/6377 6394/6409/6379 6392/6408/6378 +f 6392/6408/6378 6395/6410/6380 6397/6411/6381 +f 6393/6412/6382 6392/6408/6378 6398/6413/6383 +f 6399/6414/6384 6400/6415/6385 6401/6416/6386 +f 6400/6415/6385 6394/6409/6379 6391/6407/6377 +f 6390/6406/6376 6403/6417/6387 6391/6407/6377 +f 6402/6418/6388 6401/6416/6386 6403/6417/6387 +f 6394/6409/6379 6405/6419/6389 6395/6410/6380 +f 6405/6419/6389 6407/6420/6390 6408/6421/6391 +f 6406/6422/6392 6408/6421/6391 6410/6423/6393 +f 6395/6410/6380 6406/6422/6392 6410/6423/6393 +f 4645/1884/4624 6411/6424/6394 1862/1885/1854 +f 6411/6424/6394 6409/6425/6395 6412/6426/6396 +f 6412/6426/6396 6408/6421/6391 6407/6420/6390 +f 1862/1885/1854 6412/6426/6396 6413/6427/6397 +f 6414/6428/6398 6415/6429/6399 6417/6430/6400 +f 6415/6429/6399 6418/6431/6401 6416/6432/6402 +f 6416/6432/6402 6419/6433/6403 6420/6434/6404 +f 6417/6430/6400 6416/6432/6402 6422/6435/6405 +f 1931/1969/1938 1930/1951/1920 6423/6436/6406 +f 1930/1951/1920 1863/1886/1855 6423/6436/6406 +f 6423/6436/6406 6413/6427/6397 6425/6437/6407 +f 6424/6438/6408 6423/6436/6406 6425/6437/6407 +f 6426/6439/6409 6425/6437/6407 6428/6440/6410 +f 6425/6437/6407 6407/6420/6390 6427/6441/6411 +f 6427/6441/6411 6405/6419/6389 6394/6409/6379 +f 6428/6440/6410 6427/6441/6411 6400/6415/6385 +f 1950/1974/1943 1949/1971/1940 6429/6442/6412 +f 1949/1971/1940 1931/1969/1938 6424/6438/6408 +f 6429/6442/6412 6424/6438/6408 6426/6439/6409 +f 6430/6443/6413 6429/6442/6412 6431/6444/6414 +f 6414/6428/6398 6431/6444/6414 6415/6429/6399 +f 6431/6444/6414 6426/6439/6409 6432/6445/6415 +f 6432/6445/6415 6428/6440/6410 6399/6414/6384 +f 6415/6429/6399 6432/6445/6415 6433/6446/6416 +f 1950/1974/1943 6430/6443/6413 1954/1976/1945 +f 6430/6443/6413 6414/6428/6398 6434/6447/6417 +f 6434/6447/6417 6417/6430/6400 6435/6448/6418 +f 1954/1976/1945 6434/6447/6417 1955/2017/1986 +f 6436/6449/6419 6437/6450/6420 6438/6451/6421 +f 6437/6450/6420 6420/6434/6404 6440/6452/6422 +f 6438/6451/6421 6440/6452/6422 6441/6453/6423 +f 6439/6454/6424 6438/6451/6421 6442/6455/6425 +f 6444/6456/6426 6445/6457/6427 6447/6458/6428 +f 6445/6457/6427 6436/6449/6419 6446/6459/6429 +f 6446/6459/6429 6448/6460/6430 6450/6461/6431 +f 6447/6458/6428 6446/6459/6429 6451/6462/6432 +f 1996/2021/1990 6452/6463/6433 1998/2022/1991 +f 6452/6463/6433 6444/6456/6426 6453/6464/6434 +f 6453/6464/6434 6447/6458/6428 6454/6465/6435 +f 1998/2022/1991 6453/6464/6434 2000/2024/1993 +f 1955/2017/1986 6435/6448/6418 1995/2019/1988 +f 6435/6448/6418 6422/6435/6405 6455/6466/6436 +f 6455/6466/6436 6456/6467/6437 6452/6463/6433 +f 1995/2019/1988 6455/6466/6436 1996/2021/1990 +f 6422/6435/6405 6421/6468/6438 6456/6467/6437 +f 6421/6468/6438 6420/6434/6404 6437/6450/6420 +f 6457/6469/6439 6437/6450/6420 6436/6449/6419 +f 6456/6467/6437 6457/6469/6439 6444/6456/6426 +f 6449/6470/6440 6448/6460/6430 6458/6471/6441 +f 6448/6460/6430 6436/6449/6419 6439/6454/6424 +f 6458/6471/6441 6439/6454/6424 6443/6472/6442 +f 6459/6473/6443 6458/6471/6441 6460/6474/6444 +f 6418/6431/6401 6433/6446/6416 6462/6475/6445 +f 6433/6446/6416 6399/6414/6384 6402/6418/6388 +f 6462/6475/6445 6402/6418/6388 6404/6476/6446 +f 6463/6477/6447 6462/6475/6445 6464/6478/6448 +f 6420/6434/6404 6419/6433/6403 6466/6479/6449 +f 6419/6433/6403 6418/6431/6401 6463/6477/6447 +f 6466/6479/6449 6463/6477/6447 6465/6480/6450 +f 6440/6452/6422 6466/6479/6449 6467/6481/6451 +f 6468/6482/6452 6469/6483/6453 6471/6484/6454 +f 6469/6483/6453 6472/6485/6455 6473/6486/6456 +f 6470/6487/6457 6473/6486/6456 6475/6488/6458 +f 6471/6484/6454 6470/6487/6457 6476/6489/6459 +f 6474/6490/6460 6473/6486/6456 6478/6491/6461 +f 6473/6486/6456 6472/6485/6455 6477/6492/6462 +f 6477/6492/6462 6479/6493/6463 6481/6494/6464 +f 6478/6491/6461 6477/6492/6462 6482/6495/6465 +f 6483/6496/6466 6484/6497/6467 6486/6498/6468 +f 6484/6497/6467 6487/6499/6469 6485/6500/6470 +f 6485/6500/6470 6488/6501/6471 6469/6483/6453 +f 6486/6498/6468 6485/6500/6470 6468/6482/6452 +f 6487/6499/6469 6484/6497/6467 6489/6502/6472 +f 6484/6497/6467 6483/6496/6466 6489/6502/6472 +f 6489/6502/6472 6491/6503/6473 2118/2139/2108 +f 6490/6504/6474 6489/6502/6472 2117/2138/2107 +f 6492/6505/6475 6493/6506/6476 6495/6507/6477 +f 6493/6506/6476 6496/6508/6478 6497/6509/6479 +f 6494/6510/6480 6497/6509/6479 6499/6511/6481 +f 6495/6507/6477 6494/6510/6480 6499/6511/6481 +f 6487/6499/6469 6490/6504/6474 6502/6512/6482 +f 6490/6504/6474 2117/2138/2107 6501/6513/6483 +f 6501/6513/6483 2182/2204/2173 6503/6514/6484 +f 6502/6512/6482 6501/6513/6483 6504/6515/6485 +f 6472/6485/6455 6488/6501/6471 6505/6516/6486 +f 6488/6501/6471 6487/6499/6469 6502/6512/6482 +f 6505/6516/6486 6502/6512/6482 6504/6515/6485 +f 6479/6493/6463 6505/6516/6486 6480/6517/6487 +f 6504/6515/6485 6503/6514/6484 6508/6518/6488 +f 6503/6514/6484 2181/2203/2172 6507/6519/6489 +f 6507/6519/6489 2202/2224/2193 6509/6520/6490 +f 6508/6518/6488 6507/6519/6489 6498/6521/6491 +f 6480/6517/6487 6506/6522/6492 6511/6523/6493 +f 6506/6522/6492 6504/6515/6485 6508/6518/6488 +f 6510/6524/6494 6508/6518/6488 6498/6521/6491 +f 6511/6523/6493 6510/6524/6494 6497/6509/6479 +f 6500/6525/6495 6499/6511/6481 6512/6526/6496 +f 6499/6511/6481 6498/6521/6491 6509/6520/6490 +f 6512/6526/6496 6509/6520/6490 2201/2223/2192 +f 6513/6527/6497 6512/6526/6496 2206/2228/2197 +f 6514/6528/6498 6515/6529/6499 6517/6530/6500 +f 6515/6529/6499 6492/6505/6475 6516/6531/6501 +f 6516/6531/6501 6518/6532/6502 6520/6533/6503 +f 6517/6530/6500 6516/6531/6501 6521/6534/6504 +f 6449/6470/6440 6522/6535/6505 6450/6461/6431 +f 6522/6535/6505 6519/6536/6506 6524/6537/6507 +f 6523/6538/6508 6524/6537/6507 6526/6539/6509 +f 6450/6461/6431 6523/6538/6508 6451/6462/6432 +f 6451/6462/6432 6526/6539/6509 6454/6465/6435 +f 6526/6539/6509 6525/6540/6510 6528/6541/6511 +f 6527/6542/6512 6528/6541/6511 2247/2267/2236 +f 6454/6465/6435 6527/6542/6512 2000/2024/1993 +f 6525/6540/6510 6529/6543/6513 6530/6544/6514 +f 6529/6543/6513 6500/6525/6495 6513/6527/6497 +f 6530/6544/6514 6513/6527/6497 2242/2263/2232 +f 6528/6541/6511 6530/6544/6514 2241/2262/2231 +f 6519/6536/6506 6518/6532/6502 6524/6537/6507 +f 6518/6532/6502 6492/6505/6475 6495/6507/6477 +f 6531/6545/6515 6495/6507/6477 6500/6525/6495 +f 6524/6537/6507 6531/6545/6515 6525/6540/6510 +f 6521/6534/6504 6520/6533/6503 6533/6546/6516 +f 6520/6533/6503 6519/6536/6506 6532/6547/6517 +f 6532/6547/6517 6522/6535/6505 6449/6470/6440 +f 6533/6546/6516 6532/6547/6517 6461/6548/6518 +f 6482/6495/6465 6481/6494/6464 6535/6549/6519 +f 6481/6494/6464 6480/6517/6487 6534/6550/6520 +f 6534/6550/6520 6511/6523/6493 6536/6551/6521 +f 6535/6549/6519 6534/6550/6520 6537/6552/6522 +f 6537/6552/6522 6536/6551/6521 6539/6553/6523 +f 6536/6551/6521 6496/6508/6478 6538/6554/6524 +f 6538/6554/6524 6493/6506/6476 6515/6529/6499 +f 6539/6553/6523 6538/6554/6524 6514/6528/6498 +f 6540/6555/6525 6541/6556/6526 6542/6557/6527 +f 6541/6556/6526 6544/6558/6528 6545/6559/6529 +f 6542/6557/6527 6545/6559/6529 6546/6560/6530 +f 6543/6561/6531 6542/6557/6527 6547/6562/6532 +f 6548/6563/6533 6547/6562/6532 6550/6564/6534 +f 6547/6562/6532 6546/6560/6530 6549/6565/6535 +f 6549/6565/6535 6551/6566/6536 6552/6567/6537 +f 6550/6564/6534 6549/6565/6535 6553/6568/6538 +f 6546/6560/6530 6555/6569/6539 6551/6566/6536 +f 6555/6569/6539 6557/6570/6540 6556/6571/6541 +f 6556/6571/6541 6558/6572/6542 6560/6573/6543 +f 6551/6566/6536 6556/6571/6541 6560/6573/6543 +f 6544/6558/6528 6561/6574/6544 6545/6559/6529 +f 6561/6574/6544 6563/6575/6545 6562/6576/6546 +f 6562/6576/6546 6564/6577/6547 6555/6569/6539 +f 6545/6559/6529 6562/6576/6546 6546/6560/6530 +f 6565/6578/6548 6566/6423/6549 6568/6579/6550 +f 6566/6423/6549 6409/6425/6395 6567/6580/6551 +f 6567/6580/6551 6569/6581/6552 6570/6582/6553 +f 6568/6579/6550 6567/6580/6551 6571/6583/6554 +f 4641/4651/4621 6573/6584/6555 4642/4652/4622 +f 6573/6584/6555 6570/6582/6553 6574/6585/6556 +f 6574/6585/6556 6569/6581/6552 6411/6424/6394 +f 4642/4652/4622 6574/6585/6556 4645/1884/4624 +f 6575/6586/6557 6576/6587/6558 6577/6588/6559 +f 6576/6587/6558 6579/6589/6560 6580/6590/6561 +f 6577/6588/6559 6580/6590/6561 4646/4655/4626 +f 6578/6591/6562 6577/6588/6559 4650/4659/4630 +f 6581/6592/6563 6582/6593/6564 6583/6594/6565 +f 6582/6593/6564 6585/6595/6566 6586/6596/6567 +f 6583/6594/6565 6586/6596/6567 6544/6558/6528 +f 6541/6556/6526 6540/6555/6525 6584/6597/6568 +f 6544/6558/6528 6586/6596/6567 6587/6598/6569 +f 6586/6596/6567 6585/6595/6566 6588/6599/6570 +f 6587/6598/6569 6588/6599/6570 6575/6586/6557 +f 6561/6574/6544 6587/6598/6569 6589/6600/6571 +f 6585/6595/6566 6582/6593/6564 6590/6601/6572 +f 6582/6593/6564 6581/6592/6563 6592/6602/6573 +f 6590/6601/6572 6592/6602/6573 6593/6603/6574 +f 6591/6604/6575 6590/6601/6572 6594/6605/6576 +f 6596/6413/6577 6597/6411/6578 6599/6606/6579 +f 6597/6411/6578 6565/6578/6548 6568/6579/6550 +f 6598/6607/6580 6568/6579/6550 6572/6608/6581 +f 6599/6606/6579 6598/6607/6580 6600/6609/6582 +f 6572/6608/6581 6602/6610/6583 6600/6609/6582 +f 6602/6610/6583 6595/6611/6584 6603/6612/6585 +f 6603/6612/6585 6594/6605/6576 6604/6613/6586 +f 6600/6609/6582 6603/6612/6585 6601/6614/6587 +f 6585/6595/6566 6591/6604/6575 6588/6599/6570 +f 6591/6604/6575 6595/6611/6584 6605/6615/6588 +f 6605/6615/6588 6606/6616/6589 6579/6589/6560 +f 6588/6599/6570 6605/6615/6588 6576/6587/6558 +f 6570/6582/6553 6607/6617/6590 6571/6583/6554 +f 6607/6617/6590 6579/6589/6560 6608/6618/6591 +f 6608/6618/6591 6606/6616/6589 6602/6610/6583 +f 6571/6583/6554 6608/6618/6591 6572/6608/6581 +f 6579/6589/6560 6607/6617/6590 6609/6619/6592 +f 6607/6617/6590 6570/6582/6553 6573/6584/6555 +f 6609/6619/6592 6573/6584/6555 4641/4651/4621 +f 6580/6590/6561 6609/6619/6592 4647/4656/4627 +f 6563/6575/6545 6589/6600/6571 6610/6620/6593 +f 6589/6600/6571 6575/6586/6557 6578/6591/6562 +f 6610/6620/6593 6578/6591/6562 4621/4629/4599 +f 6611/6621/6594 6610/6620/6593 4624/4631/4601 +f 4620/4635/4605 4619/4628/4598 6612/6622/6595 +f 4619/4628/4598 4616/4626/4596 6613/6623/6596 +f 6612/6622/6595 6613/6623/6596 6557/6570/6540 +f 6611/6621/6594 6612/6622/6595 6564/6577/6547 +f 4616/4626/4596 4615/4623/4593 6614/6624/6597 +f 4615/4623/4593 4614/4622/4592 6615/6625/6598 +f 6614/6624/6597 6615/6625/6598 6559/6626/6599 +f 6613/6623/6596 6614/6624/6597 6558/6572/6542 +f 6616/6627/6600 6617/6628/6601 6619/6629/6602 +f 6617/6628/6601 6620/6630/6603 6618/6631/6604 +f 6618/6631/6604 6621/6632/6605 6623/6633/6606 +f 6619/6629/6602 6618/6631/6604 6624/6634/6607 +f 6552/6567/6537 6625/6635/6608 6553/6568/6538 +f 6625/6635/6608 6616/6627/6600 6619/6629/6602 +f 6626/6636/6609 6619/6629/6602 6627/6637/6610 +f 6553/6568/6538 6626/6636/6609 6627/6637/6610 +f 6559/6626/6599 6628/6638/6611 6560/6573/6543 +f 6628/6638/6611 6630/6639/6612 6631/6640/6613 +f 6629/6641/6614 6631/6640/6613 6616/6627/6600 +f 6560/6573/6543 6629/6641/6614 6625/6635/6608 +f 6630/6639/6612 6632/6642/6615 6633/6643/6616 +f 6632/6642/6615 6634/6644/6617 6635/6645/6618 +f 6633/6643/6616 6635/6645/6618 6620/6630/6603 +f 6631/6640/6613 6633/6643/6616 6617/6628/6601 +f 6636/6646/6619 6637/6647/6620 6639/6648/6621 +f 6637/6647/6620 6483/6496/6466 6638/6649/6622 +f 6638/6649/6622 6640/6498/6623 6641/6482/6624 +f 6639/6648/6621 6638/6649/6622 6643/6650/6625 +f 6483/6496/6466 6637/6647/6620 6491/6503/6473 +f 6637/6647/6620 6636/6646/6619 6644/6651/6626 +f 6644/6651/6626 6645/6652/6627 5394/5403/5374 +f 6491/6503/6473 6644/6651/6626 2121/2141/2110 +f 5398/5408/5379 6646/6653/6628 5401/5410/5381 +f 6646/6653/6628 6648/6654/6629 6649/6655/6630 +f 6647/6656/6631 6649/6655/6630 6651/6657/6632 +f 5401/5410/5381 6647/6656/6631 5376/5385/5356 +f 6620/6630/6603 6652/6658/6633 6621/6632/6605 +f 6652/6658/6633 6654/6659/6634 6653/6660/6635 +f 6653/6660/6635 6655/6661/6636 6657/6662/6637 +f 6621/6632/6605 6653/6660/6635 6622/6663/6638 +f 6650/6664/6639 6658/6665/6640 6659/6666/6641 +f 6658/6665/6640 6654/6659/6634 6652/6658/6633 +f 6659/6666/6641 6652/6658/6633 6620/6630/6603 +f 6660/6667/6642 6659/6666/6641 6635/6645/6618 +f 6661/6668/6643 6662/6669/6644 6664/6670/6645 +f 6662/6669/6644 6656/6671/6646 6663/6672/6647 +f 6663/6672/6647 6655/6661/6636 6665/6673/6648 +f 6664/6670/6645 6663/6672/6647 6666/6674/6649 +f 6643/6650/6625 6642/6675/6650 6668/6676/6651 +f 6642/6675/6650 6641/6482/6624 6669/6484/6652 +f 6667/6677/6653 6669/6484/6652 6671/6678/6654 +f 6668/6676/6651 6667/6677/6653 6672/6679/6655 +f 6661/6668/6643 6664/6670/6645 6673/6680/6656 +f 6664/6670/6645 6666/6674/6649 6675/6681/6657 +f 6673/6680/6656 6675/6681/6657 6643/6650/6625 +f 6674/6682/6658 6673/6680/6656 6668/6676/6651 +f 6648/6654/6629 6676/6683/6659 6677/6684/6660 +f 6676/6683/6659 6666/6674/6649 6665/6673/6648 +f 6677/6684/6660 6665/6673/6648 6654/6659/6634 +f 6649/6655/6630 6677/6684/6660 6658/6665/6640 +f 6666/6674/6649 6676/6683/6659 6678/6685/6661 +f 6676/6683/6659 6648/6654/6629 6679/6686/6662 +f 6678/6685/6661 6679/6686/6662 6636/6646/6619 +f 6675/6681/6657 6678/6685/6661 6639/6648/6621 +f 5394/5403/5374 6645/6652/6627 6680/6687/6663 +f 6645/6652/6627 6636/6646/6619 6679/6686/6662 +f 6680/6687/6663 6679/6686/6662 6648/6654/6629 +f 5397/5406/5377 6680/6687/6663 5398/5408/5379 +f 5376/5385/5356 6651/6657/6632 5377/5386/5357 +f 6651/6657/6632 6650/6664/6639 6681/6688/6664 +f 6681/6688/6664 6660/6667/6642 6682/6689/6665 +f 5377/5386/5357 6681/6688/6664 5371/5380/5351 +f 6630/6639/6612 6683/6690/6666 6632/6642/6615 +f 6683/6690/6666 5367/5376/5347 6684/6691/6667 +f 6684/6691/6667 5369/5377/5348 6682/6689/6665 +f 6632/6642/6615 6684/6691/6667 6634/6644/6617 +f 6559/6626/6599 6615/6625/6598 6685/6692/6668 +f 6615/6625/6598 4614/4622/4592 5365/5375/5346 +f 6685/6692/6668 5365/5375/5346 5367/5376/5347 +f 6628/6638/6611 6685/6692/6668 6630/6639/6612 +f 6686/6693/6669 6687/6694/6670 6688/6695/6671 +f 6687/6694/6670 6690/6696/6672 6691/6697/6673 +f 6688/6695/6671 6691/6697/6673 6693/6698/6674 +f 6689/6699/6675 6688/6695/6671 6693/6698/6674 +f 6692/6700/6676 6695/6701/6677 6693/6698/6674 +f 6695/6701/6677 6697/6702/6678 6696/6703/6679 +f 6696/6703/6679 6698/6704/6680 6700/6705/6681 +f 6693/6698/6674 6696/6703/6679 6694/6706/6682 +f 6697/6702/6678 6701/6707/6683 6698/6704/6680 +f 6701/6707/6683 6703/6708/6684 6702/6709/6685 +f 6702/6709/6685 6704/6710/6686 6706/6711/6687 +f 6698/6704/6680 6702/6709/6685 6699/6712/6688 +f 6703/6708/6684 6707/6713/6689 6704/6710/6686 +f 6707/6713/6689 6709/6714/6690 6708/6715/6691 +f 6708/6715/6691 6710/6716/6692 6712/6717/6693 +f 6704/6710/6686 6708/6715/6691 6705/6718/6694 +f 6711/6719/6695 6710/6716/6692 6713/6720/6696 +f 6710/6716/6692 6709/6714/6690 6715/6721/6697 +f 6713/6720/6696 6715/6721/6697 6716/6722/6698 +f 6714/6723/6699 6713/6720/6696 6717/6724/6700 +f 6718/6725/6701 6717/6724/6700 6719/6726/6702 +f 6717/6724/6700 6716/6722/6698 6721/6727/6703 +f 6719/6726/6702 6721/6727/6703 6722/6728/6704 +f 6720/6729/6705 6719/6726/6702 6723/6730/6706 +f 6725/6731/6707 6726/6732/6708 6728/6733/6709 +f 6726/6732/6708 6729/6734/6710 6727/6735/6711 +f 6727/6735/6711 6730/6736/6712 6723/6730/6706 +f 6728/6733/6709 6727/6735/6711 6722/6728/6704 +f 6731/6737/6713 6732/6738/6714 6733/6739/6715 +f 6732/6738/6714 6735/6740/6716 6736/6741/6717 +f 6733/6739/6715 6736/6741/6717 6726/6732/6708 +f 6734/6742/6718 6733/6739/6715 6725/6731/6707 +f 6731/6737/6713 6737/6743/6719 6732/6738/6714 +f 6737/6743/6719 6739/6744/6720 6738/6745/6721 +f 6738/6745/6721 6740/6746/6722 6742/6747/6723 +f 6732/6738/6714 6738/6745/6721 6735/6740/6716 +f 6743/6748/6724 6744/6749/6725 6745/6750/6726 +f 6744/6749/6725 6747/6751/6727 6748/6752/6728 +f 6745/6750/6726 6748/6752/6728 6749/6753/6729 +f 6746/6754/6730 6745/6750/6726 6750/6755/6731 +f 6752/6756/6732 6753/6757/6733 6754/6758/6734 +f 6753/6757/6733 6756/6759/6735 6757/6760/6736 +f 6754/6758/6734 6757/6760/6736 6747/6751/6727 +f 6755/6761/6737 6754/6758/6734 6744/6749/6725 +f 6739/6744/6720 6758/6762/6738 6740/6746/6722 +f 6758/6762/6738 6756/6759/6735 6759/6763/6739 +f 6759/6763/6739 6753/6757/6733 6760/6764/6740 +f 6740/6746/6722 6759/6763/6739 6741/6765/6741 +f 6686/6693/6669 6761/6766/6742 6687/6694/6670 +f 6761/6766/6742 6751/6767/6743 6762/6768/6744 +f 6762/6768/6744 6750/6755/6731 6763/6769/6745 +f 6687/6694/6670 6762/6768/6744 6690/6696/6672 +f 6705/6718/6694 6764/6770/6746 6765/6771/6747 +f 6764/6770/6746 6766/6772/6748 6767/6773/6749 +f 6765/6771/6747 6767/6773/6749 6768/6774/6750 +f 6706/6711/6687 6765/6771/6747 6769/6775/6751 +f 6766/6772/6748 6770/6776/6752 6771/6777/6753 +f 6770/6776/6752 6772/6778/6754 6773/6779/6755 +f 6771/6777/6753 6773/6779/6755 6775/6780/6756 +f 6767/6773/6749 6771/6777/6753 6775/6780/6756 +f 6776/6781/6757 6777/6782/6758 6779/6783/6759 +f 6777/6782/6758 6772/6778/6754 6778/6784/6760 +f 6778/6784/6760 6770/6776/6752 6780/6785/6761 +f 6779/6783/6759 6778/6784/6760 6781/6786/6762 +f 6711/6719/6695 6782/6787/6763 6783/6788/6764 +f 6782/6787/6763 6781/6786/6762 6780/6785/6761 +f 6783/6788/6764 6780/6785/6761 6766/6772/6748 +f 6712/6717/6693 6783/6788/6764 6764/6770/6746 +f 6718/6725/6701 6784/6789/6765 6714/6723/6699 +f 6784/6789/6765 6786/6790/6766 6785/6791/6767 +f 6785/6791/6767 6787/6792/6768 6782/6787/6763 +f 6714/6723/6699 6785/6791/6767 6782/6787/6763 +f 6786/6790/6766 6788/6793/6769 6787/6792/6768 +f 6788/6793/6769 6790/6794/6770 6789/6795/6771 +f 6789/6795/6771 6791/6796/6772 6779/6783/6759 +f 6787/6792/6768 6789/6795/6771 6779/6783/6759 +f 6790/6794/6770 6792/6797/6773 6793/6798/6774 +f 6792/6797/6773 6794/6799/6775 6795/6800/6776 +f 6793/6798/6774 6795/6800/6776 6796/6801/6777 +f 6791/6796/6772 6793/6798/6774 6797/6802/6778 +f 6798/6803/6779 6799/6804/6780 6801/6805/6781 +f 6799/6804/6780 6794/6799/6775 6800/6806/6782 +f 6800/6806/6782 6792/6797/6773 6788/6793/6769 +f 6801/6805/6781 6800/6806/6782 6786/6790/6766 +f 6798/6803/6779 6801/6805/6781 6802/6807/6783 +f 6801/6805/6781 6786/6790/6766 6784/6789/6765 +f 6802/6807/6783 6784/6789/6765 6718/6725/6701 +f 6803/6808/6784 6802/6807/6783 6720/6729/6705 +f 6729/6734/6710 6804/6809/6785 6730/6736/6712 +f 6804/6809/6785 6806/6810/6786 6805/6811/6787 +f 6805/6811/6787 6807/6812/6788 6803/6808/6784 +f 6730/6736/6712 6805/6811/6787 6724/6813/6789 +f 6796/6801/6777 6795/6800/6776 6808/6814/6790 +f 6795/6800/6776 6794/6799/6775 6799/6804/6780 +f 6808/6814/6790 6799/6804/6780 6798/6803/6779 +f 6809/6815/6791 6808/6814/6790 6807/6812/6788 +f 6810/6816/6792 6811/6817/6793 6813/6818/6794 +f 6811/6817/6793 6814/6819/6795 6812/6820/6796 +f 6812/6820/6796 6815/6821/6797 6796/6801/6777 +f 6813/6818/6794 6812/6820/6796 6806/6810/6786 +f 6735/6740/6716 6816/6822/6798 6736/6741/6717 +f 6816/6822/6798 6810/6816/6792 6817/6823/6799 +f 6817/6823/6799 6813/6818/6794 6804/6809/6785 +f 6736/6741/6717 6817/6823/6799 6729/6734/6710 +f 6699/6712/6688 6769/6775/6751 6818/6824/6800 +f 6769/6775/6751 6768/6774/6750 6819/6825/6801 +f 6818/6824/6800 6819/6825/6801 6820/6826/6802 +f 6700/6705/6681 6818/6824/6800 6821/6827/6803 +f 6694/6706/6682 6821/6827/6803 6689/6699/6675 +f 6821/6827/6803 6820/6826/6802 6822/6828/6804 +f 6822/6828/6804 6823/6829/6805 6824/6830/6806 +f 6825/6831/6807 6686/6693/6669 6689/6699/6675 +f 6686/6693/6669 6825/6831/6807 6826/6832/6808 +f 6825/6831/6807 6824/6830/6806 6827/6833/6809 +f 6826/6832/6808 6827/6833/6809 6828/6834/6810 +f 6761/6766/6742 6826/6832/6808 6829/6835/6811 +f 6830/6836/6812 6831/6837/6813 6832/6838/6814 +f 6831/6837/6813 6834/6839/6815 6835/6840/6816 +f 6832/6838/6814 6835/6840/6816 6760/6764/6740 +f 6833/6841/6817 6832/6838/6814 6752/6756/6732 +f 6836/6842/6818 6837/6843/6819 6838/6844/6820 +f 6837/6843/6819 6840/6845/6821 6841/6846/6822 +f 6838/6844/6820 6841/6846/6822 6834/6839/6815 +f 6839/6847/6823 6838/6844/6820 6831/6837/6813 +f 6776/6781/6757 6842/6848/6824 6844/6849/6825 +f 6842/6848/6824 6840/6845/6821 6843/6850/6826 +f 6844/6849/6825 6843/6850/6826 6837/6843/6819 +f 6840/6845/6821 6845/6851/6827 6846/6852/6828 +f 6845/6851/6827 6814/6819/6795 6811/6817/6793 +f 6846/6852/6828 6811/6817/6793 6810/6816/6792 +f 6841/6846/6822 6846/6852/6828 6847/6853/6829 +f 6834/6839/6815 6847/6853/6829 6848/6854/6830 +f 6847/6853/6829 6810/6816/6792 6816/6822/6798 +f 6848/6854/6830 6816/6822/6798 6742/6747/6723 +f 6835/6840/6816 6848/6854/6830 6741/6765/6741 +f 6814/6819/6795 6845/6851/6827 6850/6855/6831 +f 6845/6851/6827 6840/6845/6821 6842/6848/6824 +f 6850/6855/6831 6849/6856/6832 6842/6848/6824 +f 6776/6781/6757 6844/6849/6825 6851/6857/6833 +f 6844/6849/6825 6836/6842/6818 6851/6857/6833 +f 6777/6782/6758 6851/6857/6833 6852/6858/6834 +f 6836/6842/6818 6853/6859/6835 6854/6860/6836 +f 6853/6859/6835 6774/6861/6837 6854/6860/6836 +f 6852/6858/6834 6854/6860/6836 6772/6778/6754 +f 6836/6842/6818 6855/6862/6838 6853/6859/6835 +f 6855/6862/6838 6857/6863/6839 6858/6864/6840 +f 6853/6859/6835 6856/6865/6841 6774/6861/6837 +f 6859/6866/6842 6860/6867/6843 6861/6868/6844 +f 6860/6867/6843 6857/6863/6839 6855/6862/6838 +f 6861/6868/6844 6855/6862/6838 6836/6842/6818 +f 6862/6869/6845 6861/6868/6844 6839/6847/6823 +f 6859/6866/6842 6862/6869/6845 6864/6870/6846 +f 6862/6869/6845 6830/6836/6812 6863/6871/6847 +f 6863/6871/6847 6833/6841/6817 6755/6761/6737 +f 6864/6870/6846 6863/6871/6847 6743/6748/6724 +f 6865/6872/6848 6866/6873/6849 6867/6874/6850 +f 6866/6873/6849 6857/6863/6839 6867/6874/6850 +f 6867/6874/6850 6860/6867/6843 6869/6875/6851 +f 6868/6876/6852 6867/6874/6850 6828/6834/6810 +f 6828/6834/6810 6869/6875/6851 6829/6835/6811 +f 6869/6875/6851 6859/6866/6842 6870/6877/6853 +f 6870/6877/6853 6864/6870/6846 6746/6754/6730 +f 6829/6835/6811 6870/6877/6853 6751/6767/6743 +f 6824/6830/6806 6871/6878/6854 6872/6879/6855 +f 6871/6878/6854 6873/6880/6856 6874/6881/6857 +f 6872/6879/6855 6874/6881/6857 6868/6876/6852 +f 6827/6833/6809 6872/6879/6855 6868/6876/6852 +f 6857/6863/6839 6866/6873/6849 6858/6864/6840 +f 6866/6873/6849 6865/6872/6848 6876/6882/6858 +f 6858/6864/6840 6875/6883/6859 6774/6861/6837 +f 6820/6826/6802 6877/6884/6860 6823/6829/6805 +f 6877/6884/6860 6879/6885/6861 6880/6886/6862 +f 6878/6887/6863 6880/6886/6862 6871/6878/6854 +f 6823/6829/6805 6878/6887/6863 6871/6878/6854 +f 6865/6872/6848 6874/6881/6857 6881/6888/6864 +f 6874/6881/6857 6873/6880/6856 6880/6886/6862 +f 6881/6888/6864 6880/6886/6862 6879/6885/6861 +f 6876/6882/6858 6881/6888/6864 6882/6889/6865 +f 6774/6861/6837 6882/6889/6865 6775/6780/6756 +f 6882/6889/6865 6879/6885/6861 6883/6890/6866 +f 6883/6890/6866 6877/6884/6860 6819/6825/6801 +f 6775/6780/6756 6883/6890/6866 6768/6774/6750 +f 6796/6801/6777 6815/6821/6797 6884/6891/6867 +f 6815/6821/6797 6814/6819/6795 6850/6855/6831 +f 6797/6802/6778 6884/6891/6867 6850/6855/6831 +f 6885/6892/6868 6886/6893/6869 6887/6894/6870 +f 6886/6893/6869 6889/6895/6871 6887/6894/6870 +f 6887/6894/6870 6890/6896/6872 6891/6897/6873 +f 6888/6898/6874 6887/6894/6870 6892/6899/6875 +f 6894/6253/6876 6895/6900/6877 6896/6901/6878 +f 6895/6900/6877 6891/6897/6873 6898/6902/6879 +f 6896/6901/6878 6898/6902/6879 6899/6903/6880 +f 6897/6255/6881 6896/6901/6878 6900/6904/6882 +f 6902/6224/6883 6903/6227/6884 6904/6905/6885 +f 6903/6227/6884 6906/6135/6886 6904/6905/6885 +f 6904/6905/6885 6907/6906/6887 6908/6907/6888 +f 6905/6908/6889 6904/6905/6885 6910/6909/6890 +f 6910/6909/6890 6911/6910/6891 6912/6911/6892 +f 6911/6910/6891 6913/6912/6893 6912/6911/6892 +f 6912/6911/6892 6914/6913/6894 6916/6225/6895 +f 6905/6908/6889 6912/6911/6892 6916/6225/6895 +f 6913/6912/6893 6917/6914/6896 6914/6913/6894 +f 6917/6914/6896 6893/6915/6897 6919/6916/6898 +f 6918/6917/6899 6919/6916/6898 6920/6147/6900 +f 6914/6913/6894 6918/6917/6899 6921/6918/6901 +f 6922/6919/6902 6923/6920/6903 6924/6921/6904 +f 6923/6920/6903 6913/6912/6893 6911/6910/6891 +f 6924/6921/6904 6911/6910/6891 6926/6922/6905 +f 6925/6923/6906 6924/6921/6904 6926/6922/6905 +f 6910/6909/6890 6909/6924/6907 6926/6922/6905 +f 6909/6924/6907 6908/6907/6888 6929/6925/6908 +f 6928/6926/6909 6929/6925/6908 6930/6927/6910 +f 6926/6922/6905 6928/6926/6909 6931/6928/6911 +f 6932/6929/6912 6933/6930/6913 6935/6931/6914 +f 6933/6930/6913 6936/6932/6915 6934/6933/6916 +f 6934/6933/6916 6937/6934/6917 6938/6935/6918 +f 6935/6931/6914 6934/6933/6916 6939/6936/6919 +f 6941/6937/6920 6942/6938/6921 6943/6939/6922 +f 6942/6938/6921 6945/6940/6923 6943/6939/6922 +f 6943/6939/6922 6946/6941/6924 6932/6929/6912 +f 6944/6942/6925 6943/6939/6922 6947/6943/6926 +f 6949/6944/6927 6950/6945/6928 6951/6946/6929 +f 6950/6945/6928 6945/6940/6923 6942/6938/6921 +f 6951/6946/6929 6942/6938/6921 6941/6937/6920 +f 6952/6947/6930 6951/6946/6929 6953/6948/6931 +f 6955/6949/6932 6956/6950/6933 6957/6951/6934 +f 6956/6950/6933 6949/6944/6927 6952/6947/6930 +f 6957/6951/6934 6952/6947/6930 6954/6952/6935 +f 6958/6953/6936 6957/6951/6934 6959/6954/6937 +f 6906/6135/6886 6961/6133/6938 6962/6955/6939 +f 6961/6133/6938 6963/6132/6940 6964/6956/6941 +f 6962/6955/6939 6964/6956/6941 6965/6957/6942 +f 6907/6906/6887 6962/6955/6939 6966/6958/6943 +f 6965/6957/6942 6967/6959/6944 6968/6960/6945 +f 6967/6959/6944 6955/6949/6932 6958/6953/6936 +f 6968/6960/6945 6958/6953/6936 6960/6961/6946 +f 6969/6962/6947 6968/6960/6945 6970/6963/6948 +f 6908/6907/6888 6966/6958/6943 6972/6964/6949 +f 6966/6958/6943 6965/6957/6942 6969/6962/6947 +f 6972/6964/6949 6969/6962/6947 6971/6965/6950 +f 6929/6925/6908 6972/6964/6949 6973/6966/6951 +f 6963/6132/6940 6974/6229/6952 6975/6967/6953 +f 6974/6229/6952 6976/6231/6954 6975/6967/6953 +f 6975/6967/6953 6977/6968/6955 6955/6949/6932 +f 6964/6956/6941 6975/6967/6953 6967/6959/6944 +f 6976/6231/6954 6978/6234/6956 6979/6969/6957 +f 6978/6234/6956 6980/6245/6958 6981/6970/6959 +f 6979/6969/6957 6981/6970/6959 6956/6950/6933 +f 6977/6968/6955 6979/6969/6957 6956/6950/6933 +f 6980/6245/6958 6982/6243/6960 6981/6970/6959 +f 6982/6243/6960 6984/6242/6961 6983/6971/6962 +f 6983/6971/6962 6985/6972/6963 6950/6945/6928 +f 6981/6970/6959 6983/6971/6962 6949/6944/6927 +f 6945/6940/6923 6985/6972/6963 6986/6973/6964 +f 6985/6972/6963 6984/6242/6961 6987/6974/6965 +f 6986/6973/6964 6987/6974/6965 6933/6930/6913 +f 6946/6941/6924 6986/6973/6964 6933/6930/6913 +f 6901/6256/6966 6900/6904/6882 6988/6975/6967 +f 6900/6904/6882 6899/6903/6880 6988/6975/6967 +f 6988/6975/6967 6990/6976/6968 6992/6977/6969 +f 6989/6978/6970 6988/6975/6967 6992/6977/6969 +f 6899/6903/6880 6898/6902/6879 6994/6979/6971 +f 6898/6902/6879 6891/6897/6873 6994/6979/6971 +f 6994/6979/6971 6890/6896/6872 6996/6980/6972 +f 6995/6981/6973 6994/6979/6971 6996/6980/6972 +f 6889/6895/6871 6998/6982/6974 6996/6980/6972 +f 6998/6982/6974 7000/6983/6975 6999/6984/6976 +f 6999/6984/6976 7001/6985/6977 7003/6986/6978 +f 6996/6980/6972 6999/6984/6976 7003/6986/6978 +f 6899/6903/6880 6995/6981/6973 6990/6976/6968 +f 6995/6981/6973 6997/6987/6979 7004/6988/6980 +f 7004/6988/6980 7005/6989/6981 7006/6990/6982 +f 6990/6976/6968 7004/6988/6980 6991/6991/6983 +f 7002/6992/6984 7008/6993/6985 7003/6986/6978 +f 7008/6993/6985 7010/6994/6986 7009/6995/6987 +f 7009/6995/6987 7011/6996/6988 7006/6990/6982 +f 7003/6986/6978 7009/6995/6987 6997/6987/6979 +f 7012/6997/6989 7013/6998/6990 7015/6999/6991 +f 7013/6998/6990 7000/6983/6975 6998/6982/6974 +f 7014/7000/6992 6998/6982/6974 6889/6895/6871 +f 7015/6999/6991 7014/7000/6992 6885/6892/6868 +f 7016/7001/6993 7017/7002/6994 7018/7003/6995 +f 7017/7002/6994 7012/6997/6989 7015/6999/6991 +f 7018/7003/6995 7015/6999/6991 6885/6892/6868 +f 7019/7004/6996 7018/7003/6995 7020/7005/6997 +f 7002/6992/6984 7001/6985/6977 7022/7006/6998 +f 7001/6985/6977 7000/6983/6975 7013/6998/6990 +f 7022/7006/6998 7013/6998/6990 7012/6997/6989 +f 7023/7007/6999 7022/7006/6998 7025/7008/7000 +f 7026/7009/7001 7027/7010/7002 7029/7011/7003 +f 7027/7010/7002 7010/6994/6986 7028/7012/7004 +f 7028/7012/7004 7008/6993/6985 7023/7007/6999 +f 7029/7011/7003 7028/7012/7004 7023/7007/6999 +f 7030/7013/7005 7031/7014/7006 7032/7015/7007 +f 7031/7014/7006 7034/7016/7008 7035/7017/7009 +f 7032/7015/7007 7035/7017/7009 7037/7018/7010 +f 7033/7019/7011 7032/7015/7007 7038/7020/7012 +f 7038/7020/7012 7037/7018/7010 7039/7021/7013 +f 7037/7018/7010 7036/7022/7014 7041/7023/7015 +f 7039/7021/7013 7041/7023/7015 7042/7024/7016 +f 7040/7025/7017 7039/7021/7013 7043/7026/7018 +f 6940/7027/7019 6939/6936/6919 7045/7028/7020 +f 6939/6936/6919 6938/6935/6918 7047/7029/7021 +f 7045/7028/7020 7047/7029/7021 7044/7030/7022 +f 7046/7031/7023 7045/7028/7020 7043/7026/7018 +f 6948/7032/7024 6947/6943/6926 7048/7033/7025 +f 6947/6943/6926 6932/6929/6912 6935/6931/6914 +f 7048/7033/7025 6935/6931/6914 6940/7027/7019 +f 7049/7034/7026 7048/7033/7025 7051/7035/7027 +f 7051/7035/7027 7050/7036/7028 7053/7037/7029 +f 7050/7036/7028 6940/7027/7019 7046/7031/7023 +f 7052/7038/7030 7046/7031/7023 7042/7024/7016 +f 7053/7037/7029 7052/7038/7030 7055/7039/7031 +f 7042/7024/7016 7041/7023/7015 7054/7040/7032 +f 7041/7023/7015 7036/7022/7014 7056/7041/7033 +f 7056/7041/7033 7057/7042/7034 7059/7043/7035 +f 7054/7040/7032 7056/7041/7033 7055/7039/7031 +f 7036/7022/7014 7035/7017/7009 7057/7042/7034 +f 7035/7017/7009 7034/7016/7008 7061/7044/7036 +f 7060/7045/7037 7061/7044/7036 7062/7046/7038 +f 7057/7042/7034 7060/7045/7037 7058/7047/7039 +f 6991/6991/6983 7007/7048/7040 7065/7049/7041 +f 7007/7048/7040 7006/6990/6982 7064/7050/7042 +f 7064/7050/7042 7066/7051/7043 7061/7044/7036 +f 7065/7049/7041 7064/7050/7042 7034/7016/7008 +f 7030/7013/7005 7067/7052/7044 7031/7014/7006 +f 7067/7052/7044 6993/7053/7045 7068/7054/7046 +f 7068/7054/7046 6992/6977/6969 7065/7049/7041 +f 7031/7014/7006 7068/7054/7046 7034/7016/7008 +f 6941/7055/6920 6944/7056/6925 7070/7055/7047 +f 6944/7056/6925 6948/7056/7024 7069/7056/7048 +f 7069/7056/7048 7071/7056/7049 7073/7057/7050 +f 7070/7055/7047 7069/7056/7048 7074/7057/7051 +f 6971/7058/6950 6970/7058/6948 7075/7059/7052 +f 6970/7058/6948 6960/7058/6946 7077/7059/7053 +f 7075/7059/7052 7077/7059/7053 7078/7059/7054 +f 7076/7060/7055 7075/7059/7052 7079/7059/7056 +f 6930/7061/6910 6973/7062/6951 7081/7060/7057 +f 6973/7062/6951 6971/7058/6950 7076/7060/7055 +f 7081/7060/7057 7076/7060/7055 7080/7060/7058 +f 7082/7063/7059 7081/7060/7057 7083/7060/7060 +f 6927/7064/7061 6931/7061/6911 7085/7063/7062 +f 6931/7061/6911 6930/7061/6910 7082/7063/7059 +f 7085/7063/7062 7082/7063/7059 7084/7063/7063 +f 7086/7064/7064 7085/7063/7062 7087/7063/7065 +f 7089/7065/7066 7090/7066/7067 7091/7064/7068 +f 7090/7066/7067 6922/7066/6902 6925/7064/6906 +f 7091/7064/7068 6925/7064/6906 6927/7064/7061 +f 7092/7065/7069 7091/7064/7068 7086/7064/7064 +f 6954/7067/6935 6953/7055/6931 7094/7059/7070 +f 6953/7055/6931 6941/7055/6920 7093/7055/7071 +f 7093/7055/7071 7070/7055/7047 7095/7059/7072 +f 7094/7059/7070 7093/7055/7071 7096/7059/7073 +f 6960/7058/6946 6959/7067/6937 7097/7059/7074 +f 6959/7067/6937 6954/7067/6935 7094/7059/7070 +f 7097/7059/7074 7094/7059/7070 7098/7059/7075 +f 7077/7059/7053 7097/7059/7074 7078/7059/7054 +f 7099/7068/7076 7100/7068/7077 7101/7068/7078 +f 7100/7068/7077 7103/7069/7079 7104/7069/7080 +f 7101/7068/7078 7104/7069/7080 7021/7070/7081 +f 7102/7068/7082 7101/7068/7078 7105/7071/7083 +f 7107/7072/7084 7108/7073/7085 7110/7072/7086 +f 7108/7073/7085 7058/7073/7039 7109/7072/7087 +f 7109/7072/7087 7063/7074/7088 7111/7075/7089 +f 7110/7072/7086 7109/7072/7087 7112/7075/7090 +f 7113/7076/7091 7114/7077/7092 7115/7078/7093 +f 7114/7077/7092 7055/7077/7031 7059/7078/7035 +f 7115/7078/7093 7059/7078/7035 7058/7073/7039 +f 7116/7079/7094 7115/7078/7093 7107/7072/7084 +f 7051/7080/7027 7053/7081/7029 7118/7082/7095 +f 7053/7081/7029 7055/7077/7031 7117/7081/7096 +f 7117/7081/7096 7114/7077/7092 7119/7081/7097 +f 7118/7082/7095 7117/7081/7096 7120/7082/7098 +f 6948/7056/7024 7049/7080/7026 7071/7056/7049 +f 7049/7080/7026 7051/7080/7027 7121/7080/7099 +f 7121/7080/7099 7118/7082/7095 7122/7082/7100 +f 7071/7056/7049 7121/7080/7099 7072/7057/7101 +f 7074/7057/7051 7073/7057/7050 7123/7057/7102 +f 7073/7057/7050 7072/7057/7101 7125/7057/7103 +f 7123/7057/7102 7125/7057/7103 6757/7057/6736 +f 7124/7057/7104 7123/7057/7102 6757/7057/6736 +f 7080/7060/7058 7079/7059/7056 7127/7060/7105 +f 7079/7059/7056 7078/7059/7054 7126/7060/7106 +f 7126/7060/7106 7128/7059/7107 6737/7083/6719 +f 7127/7060/7105 7126/7060/7106 6731/7083/6713 +f 7084/7063/7063 7083/7060/7060 7129/7060/7108 +f 7083/7060/7060 7080/7060/7058 7127/7060/7105 +f 7129/7060/7108 7127/7060/7105 6734/7083/6718 +f 7130/7063/7109 7129/7060/7108 6734/7083/6718 +f 7088/7064/7110 7087/7063/7065 7131/7084/7111 +f 7087/7063/7065 7084/7063/7063 7130/7063/7109 +f 7131/7084/7111 7130/7063/7109 6725/7084/6707 +f 7132/7065/7112 7131/7084/7111 6728/7084/6709 +f 6716/7065/6698 7133/7065/7113 7134/7065/7114 +f 7133/7065/7113 7089/7065/7066 7092/7065/7069 +f 7134/7065/7114 7092/7065/7069 7088/7064/7110 +f 6721/7065/6703 7134/7065/7114 7132/7065/7112 +f 7096/7059/7073 7095/7059/7072 7136/7059/7115 +f 7095/7059/7072 7074/7057/7051 7135/7059/7116 +f 7136/7059/7115 7135/7059/7116 6756/7057/6735 +f 7078/7059/7054 7098/7059/7075 7128/7059/7107 +f 7098/7059/7075 7096/7059/7073 7137/7059/7117 +f 7137/7059/7117 7136/7059/7115 6758/7057/6738 +f 7128/7059/7107 7137/7059/7117 6739/7057/6720 +f 6703/7085/6684 7138/7068/7118 7139/7068/7119 +f 7138/7068/7118 7099/7068/7076 7102/7068/7082 +f 7139/7068/7119 7102/7068/7082 7106/7071/7120 +f 6707/7085/6689 7139/7068/7119 7140/7071/7121 +f 6692/7079/6676 7141/7072/7122 7142/7072/7123 +f 7141/7072/7122 7107/7072/7084 7110/7072/7086 +f 7142/7072/7123 7110/7072/7086 7112/7075/7090 +f 6695/7072/6677 7142/7072/7123 7143/7072/7124 +f 6690/7076/6672 7144/7076/7125 7145/7079/7126 +f 7144/7076/7125 7113/7076/7091 7116/7079/7094 +f 7145/7079/7126 7116/7079/7094 7141/7072/7122 +f 6691/7079/6673 7145/7079/7126 6692/7079/6676 +f 7120/7082/7098 7119/7081/7097 7147/7082/7127 +f 7119/7081/7097 7113/7076/7091 7146/7076/7128 +f 7146/7076/7128 7144/7076/7125 6763/7076/6745 +f 7147/7082/7127 7146/7076/7128 6749/7082/6729 +f 7072/7057/7101 7122/7082/7100 7148/7082/7129 +f 7122/7082/7100 7120/7082/7098 7147/7082/7127 +f 7148/7082/7129 7147/7082/7127 6748/7082/6728 +f 7125/7057/7103 7148/7082/7129 6747/7082/6727 +f 7149/7068/7130 7150/7068/7131 7151/7068/7132 +f 7150/7068/7131 7153/7068/7133 7154/7069/7134 +f 7151/7068/7132 7154/7069/7134 7103/7069/7079 +f 7152/7068/7135 7151/7068/7132 7100/7068/7077 +f 7149/7068/7130 7152/7068/7135 7156/7068/7136 +f 7152/7068/7135 7099/7068/7076 7155/7068/7137 +f 7156/7068/7136 7155/7068/7137 7138/7068/7118 +f 7026/7009/7001 7157/7086/7138 7158/7087/7139 +f 7157/7086/7138 7159/7088/7140 7160/7089/7141 +f 7158/7087/7139 7160/7089/7141 7006/6990/6982 +f 7027/7010/7002 7158/7087/7139 7011/6996/6988 +f 7006/6990/6982 7160/7089/7141 7066/7051/7043 +f 7160/7089/7141 7159/7088/7140 7161/7090/7142 +f 7066/7051/7043 7161/7090/7142 7162/7091/7143 +f 7159/7088/7140 7163/7092/7144 7162/7091/7143 +f 7163/7092/7144 7165/7093/7145 7164/7094/7146 +f 7162/7091/7143 7164/7094/7146 7166/7095/7147 +f 7153/7068/7133 7150/7068/7131 7167/7068/7148 +f 7150/7068/7131 7149/7068/7130 7169/7068/7149 +f 7167/7068/7148 7169/7068/7149 7170/7068/7150 +f 7168/7068/7151 7167/7068/7148 7171/7068/7152 +f 7165/7068/7145 7171/7068/7152 7166/7075/7147 +f 7171/7068/7152 7170/7068/7150 7173/7068/7153 +f 7172/7075/7154 7173/7068/7153 7111/7075/7089 +f 7166/7075/7147 7172/7075/7154 7062/7075/7038 +f 6703/7085/6684 7174/7068/7155 7156/7068/7136 +f 7174/7068/7155 7170/7068/7150 7169/7068/7149 +f 7156/7068/7136 7175/7068/7156 7149/7068/7130 +f 6697/7085/6678 7143/7072/7124 7176/7068/7157 +f 7143/7072/7124 7112/7075/7090 7173/7068/7153 +f 7176/7068/7157 7173/7068/7153 7170/7068/7150 +f 6701/7085/6683 7176/7068/7157 7174/7068/7155 +f 7025/7008/7000 7024/7096/7158 7177/7097/7159 +f 7024/7096/7158 7012/6997/6989 7177/7097/7159 +f 7177/7097/7159 7017/7002/6994 7016/7001/6993 +f 7178/7098/7160 7177/7097/7159 7179/7099/7161 +f 7181/7100/7162 7182/7101/7163 7184/7102/7164 +f 7182/7101/7163 7026/7009/7001 7183/7103/7165 +f 7183/7103/7165 7029/7011/7003 7178/7098/7160 +f 7184/7102/7164 7183/7103/7165 7180/7104/7166 +f 7165/7093/7145 7163/7092/7144 7186/7105/7167 +f 7163/7092/7144 7159/7088/7140 7185/7106/7168 +f 7185/7106/7168 7157/7086/7138 7182/7101/7163 +f 7186/7105/7167 7185/7106/7168 7181/7100/7162 +f 7181/7100/7162 7184/7102/7164 7187/7107/7169 +f 7184/7102/7164 7180/7104/7166 7189/7108/7170 +f 7187/7107/7169 7189/7108/7170 7154/7109/7134 +f 7188/7110/7171 7187/7107/7169 7154/7109/7134 +f 7180/7104/7166 7179/7099/7161 7189/7108/7170 +f 7179/7099/7161 7016/7001/6993 7190/7111/7172 +f 7190/7111/7172 7019/7004/6996 7104/7112/7080 +f 7189/7108/7170 7190/7111/7172 7103/7113/7079 +f 7181/7100/7162 7188/7110/7171 7186/7105/7167 +f 7188/7110/7171 7153/7114/7133 7191/7115/7173 +f 7186/7105/7167 7191/7115/7173 7165/7093/7145 +f 6893/6915/6897 6892/6899/6875 7192/7116/7174 +f 6892/6899/6875 6891/6897/6873 6895/6900/6877 +f 7192/7116/7174 6895/6900/6877 7193/6251/7175 +f 6919/6916/6898 7192/7116/7174 7193/6251/7175 +f 6922/6919/6902 7194/7117/7176 6923/6920/6903 +f 7194/7117/7176 7196/7118/7177 7195/7119/7178 +f 7195/7119/7178 7197/7120/7179 6917/6914/6896 +f 6923/6920/6903 7195/7119/7178 6913/6912/6893 +f 7196/7118/7177 7198/7121/7180 7197/7120/7179 +f 7198/7121/7180 7021/7122/7081 7199/7123/7181 +f 7199/7123/7181 7020/7005/6997 6888/6898/6874 +f 7197/7120/7179 7199/7123/7181 6893/6915/6897 +f 7021/7070/7081 7198/7070/7180 7105/7071/7083 +f 7198/7070/7180 7196/7071/7177 7200/7071/7182 +f 7200/7071/7182 7201/7071/7183 7203/7071/7184 +f 7105/7071/7083 7200/7071/7182 7106/7071/7120 +f 7196/7071/7177 7194/7071/7176 7201/7071/7183 +f 7194/7071/7176 6922/7066/6902 7204/7071/7185 +f 7204/7071/7185 7090/7066/7067 7205/7071/7186 +f 7201/7071/7183 7204/7071/7185 7202/7071/7187 +f 6709/7065/6690 7140/7071/7121 7207/7071/7188 +f 7140/7071/7121 7106/7071/7120 7203/7071/7184 +f 7207/7071/7188 7206/7071/7189 7202/7071/7187 +f 6716/7065/6698 6715/7065/6697 7133/7065/7113 +f 6715/7065/6697 6709/7065/6690 7208/7065/7190 +f 7208/7065/7190 7207/7071/7188 7205/7071/7186 +f 7133/7065/7113 7208/7065/7190 7089/7065/7066 +f 7209/7124/7191 7210/7125/7192 7212/7126/7193 +f 7210/7125/7192 7213/7127/7194 7214/7128/7195 +f 7211/7129/7196 7214/7128/7195 7215/7130/7197 +f 7212/7126/7193 7211/7129/7196 7217/7131/7198 +f 7213/7127/7194 7218/7132/7199 7219/7133/7200 +f 7218/7132/7199 7220/7134/7201 7221/7135/7202 +f 7219/7133/7200 7221/7135/7202 7223/7136/7203 +f 7214/7128/7195 7219/7133/7200 7215/7130/7197 +f 7220/7134/7201 7224/7137/7204 7225/7138/7205 +f 7224/7137/7204 7226/7139/7206 7227/7140/7207 +f 7225/7138/7205 7227/7140/7207 7228/7141/7208 +f 7221/7135/7202 7225/7138/7205 7222/7142/7209 +f 7226/7139/7206 7230/7143/7210 7231/7144/7211 +f 7230/7143/7210 7232/7145/7212 7233/7146/7213 +f 7231/7144/7211 7233/7146/7213 7234/7147/7214 +f 7227/7140/7207 7231/7144/7211 7235/7148/7215 +f 7236/7149/7216 7237/7150/7217 7238/7151/7218 +f 7237/7150/7217 7240/7152/7219 7238/7151/7218 +f 7238/7151/7218 7241/7153/7220 7233/7146/7213 +f 7239/7154/7221 7238/7151/7218 7233/7146/7213 +f 7236/7149/7216 7242/7155/7222 7237/7150/7217 +f 7242/7155/7222 7244/7156/7223 7243/7157/7224 +f 7243/7157/7224 7245/7158/7225 7247/7159/7226 +f 7237/7150/7217 7243/7157/7224 7240/7152/7219 +f 7248/7160/7227 7249/7161/7228 7250/7162/7229 +f 7249/7161/7228 7252/7163/7230 7253/7164/7231 +f 7250/7162/7229 7253/7164/7231 7234/7147/7214 +f 7251/7165/7232 7250/7162/7229 7241/7153/7220 +f 7246/7166/7233 7254/7167/7234 7255/7168/7235 +f 7254/7167/7234 7256/7169/7236 7255/7168/7235 +f 7255/7168/7235 7257/7170/7237 7251/7165/7232 +f 7247/7159/7226 7255/7168/7235 7251/7165/7232 +f 7258/7171/7238 7259/7172/7239 7261/7173/7240 +f 7259/7172/7239 7262/7174/7241 7260/7175/7242 +f 7260/7175/7242 7263/7176/7243 7239/7154/7221 +f 7261/7173/7240 7260/7175/7242 7232/7145/7212 +f 7264/7177/7244 7265/7178/7245 7267/7179/7246 +f 7265/7178/7245 7258/7171/7238 7266/7180/7247 +f 7266/7180/7247 7261/7173/7240 7230/7143/7210 +f 7267/7179/7246 7266/7180/7247 7230/7143/7210 +f 7228/7141/7208 7235/7148/7215 7268/7181/7248 +f 7235/7148/7215 7234/7147/7214 7253/7164/7231 +f 7268/7181/7248 7253/7164/7231 7270/7182/7249 +f 7269/7183/7250 7268/7181/7248 7270/7182/7249 +f 7271/7184/7251 7272/7185/7252 7269/7183/7250 +f 7272/7185/7252 7274/7186/7253 7275/7187/7254 +f 7273/7188/7255 7275/7187/7254 7229/7189/7256 +f 7269/7183/7250 7273/7188/7255 7229/7189/7256 +f 7276/7190/7257 7277/7191/7258 7279/7192/7259 +f 7277/7191/7258 7274/7193/7253 7278/7194/7260 +f 7278/7194/7260 7272/7195/7252 7271/7196/7251 +f 7279/7192/7259 7278/7194/7260 7280/7197/7261 +f 7271/7196/7251 7270/7198/7249 7280/7197/7261 +f 7270/7198/7249 7252/7199/7230 7282/7200/7262 +f 7282/7200/7262 7249/7201/7228 7283/7202/7263 +f 7280/7197/7261 7282/7200/7262 7281/7203/7264 +f 7284/7204/7265 7285/7205/7266 7286/7206/7267 +f 7285/7205/7266 7264/7177/7244 7267/7179/7246 +f 7286/7206/7267 7267/7179/7246 7226/7139/7206 +f 7287/7207/7268 7286/7206/7267 7224/7137/7204 +f 7288/7208/7269 7289/7209/7270 7290/7210/7271 +f 7289/7209/7270 7292/7211/7272 7293/7212/7273 +f 7290/7210/7271 7293/7212/7273 7264/7177/7244 +f 7291/7213/7274 7290/7210/7271 7285/7205/7266 +f 7292/7211/7272 7294/7214/7275 7293/7212/7273 +f 7294/7214/7275 7296/7215/7276 7295/7216/7277 +f 7295/7216/7277 7297/7217/7278 7265/7178/7245 +f 7293/7212/7273 7295/7216/7277 7264/7177/7244 +f 7298/7218/7279 7299/7219/7280 7300/7220/7281 +f 7299/7219/7280 7288/7208/7269 7291/7213/7274 +f 7300/7220/7281 7291/7213/7274 7284/7204/7265 +f 7301/7221/7282 7300/7220/7281 7302/7222/7283 +f 7304/7223/7284 7305/7224/7285 7307/7225/7286 +f 7305/7224/7285 7308/7226/7287 7306/7227/7288 +f 7306/7227/7288 7309/7228/7289 7301/7221/7282 +f 7307/7225/7286 7306/7227/7288 7303/7229/7290 +f 7304/7223/7284 7307/7225/7286 7310/7230/7291 +f 7307/7225/7286 7303/7229/7290 7312/7231/7292 +f 7310/7230/7291 7312/7231/7292 7213/7127/7194 +f 7311/7232/7293 7310/7230/7291 7210/7125/7192 +f 7303/7229/7290 7302/7222/7283 7313/7233/7294 +f 7302/7222/7283 7284/7204/7265 7287/7207/7268 +f 7313/7233/7294 7287/7207/7268 7220/7134/7201 +f 7312/7231/7292 7313/7233/7294 7218/7132/7199 +f 7222/7142/7209 7275/7187/7254 7314/7234/7295 +f 7275/7187/7254 7274/7186/7253 7314/7234/7295 +f 7314/7234/7295 7277/7235/7258 7315/7236/7296 +f 7223/7136/7203 7314/7234/7295 7215/7130/7197 +f 7215/7130/7197 7315/7236/7296 7316/7237/7297 +f 7315/7236/7296 7276/7238/7257 7317/7239/7298 +f 7316/7237/7297 7317/7239/7298 7318/7240/7299 +f 7216/7241/7300 7316/7237/7297 7319/7242/7301 +f 7318/7243/7299 7317/7244/7298 7320/7245/7302 +f 7317/7244/7298 7276/7190/7257 7320/7245/7302 +f 7321/7246/7303 7320/7245/7302 7281/7203/7264 +f 7322/7247/7304 7323/7248/7305 7324/7249/7306 +f 7323/7248/7305 7326/7250/7307 7327/7251/7308 +f 7324/7249/7306 7327/7251/7308 7328/7252/7309 +f 7325/7253/7310 7324/7249/7306 7329/7254/7311 +f 7331/7255/7312 7332/7256/7313 7334/7257/7314 +f 7332/7256/7313 7326/7258/7307 7333/7259/7315 +f 7334/7257/7314 7333/7259/7315 7322/7260/7304 +f 7335/7261/7316 7336/7262/7317 7338/7263/7318 +f 7336/7262/7317 7339/7264/7319 7337/7265/7320 +f 7337/7265/7320 7340/7266/7321 7342/7267/7322 +f 7338/7263/7318 7337/7265/7320 7343/7268/7323 +f 7344/7269/7324 7345/7270/7325 7346/7271/7326 +f 7345/7270/7325 7343/7268/7323 7342/7267/7322 +f 7346/7271/7326 7342/7267/7322 7341/7272/7327 +f 7347/7273/7328 7346/7271/7326 7348/7274/7329 +f 7328/7252/7309 7350/7275/7330 7351/7276/7331 +f 7350/7275/7330 7344/7269/7324 7347/7273/7328 +f 7351/7276/7331 7347/7273/7328 7349/7277/7332 +f 7329/7254/7311 7351/7276/7331 7330/7278/7333 +f 7353/7279/7334 7354/7280/7335 7356/7281/7336 +f 7354/7280/7335 7357/7282/7337 7358/7283/7338 +f 7355/7284/7339 7358/7283/7338 7359/7285/7340 +f 7356/7281/7336 7355/7284/7339 7360/7286/7341 +f 7361/7287/7342 7360/7286/7341 7362/7288/7343 +f 7360/7286/7341 7359/7285/7340 7364/7289/7344 +f 7248/7290/7227 7257/7291/7237 7367/7292/7345 +f 7257/7291/7237 7256/7293/7236 7368/7294/7346 +f 7367/7292/7345 7368/7294/7346 7331/7255/7312 +f 7283/7202/7263 7367/7292/7345 7281/7203/7264 +f 7331/7255/7312 7370/7295/7347 7332/7256/7313 +f 7370/7295/7347 7372/7296/7348 7371/7297/7349 +f 7332/7256/7313 7371/7297/7349 7326/7258/7307 +f 7326/7250/7307 7373/7298/7350 7374/7299/7351 +f 7373/7298/7350 7372/7300/7348 7375/7301/7352 +f 7374/7299/7351 7375/7301/7352 7377/7302/7353 +f 7327/7251/7308 7374/7299/7351 7328/7252/7309 +f 7376/7303/7354 7378/7304/7355 7379/7305/7356 +f 7378/7304/7355 7380/7306/7357 7381/7307/7358 +f 7379/7305/7356 7381/7307/7358 7344/7269/7324 +f 7377/7302/7353 7379/7305/7356 7350/7275/7330 +f 7382/7308/7359 7383/7309/7360 7385/7310/7361 +f 7383/7309/7360 7343/7268/7323 7384/7311/7362 +f 7384/7311/7362 7345/7270/7325 7381/7307/7358 +f 7385/7310/7361 7384/7311/7362 7380/7306/7357 +f 7386/7312/7363 7387/7313/7364 7389/7314/7365 +f 7387/7313/7364 7335/7261/7316 7388/7315/7366 +f 7388/7315/7366 7338/7263/7318 7383/7309/7360 +f 7389/7314/7365 7388/7315/7366 7382/7308/7359 +f 7390/7316/7367 7391/7317/7368 7393/7318/7369 +f 7391/7317/7368 7386/7312/7363 7392/7319/7370 +f 7392/7319/7370 7389/7314/7365 7394/7320/7371 +f 7393/7318/7369 7392/7319/7370 7395/7321/7372 +f 7390/7316/7367 7393/7318/7369 7396/7322/7373 +f 7393/7318/7369 7395/7321/7372 7398/7323/7374 +f 7399/7324/7375 7400/7325/7376 7401/7326/7377 +f 7400/7325/7376 7366/7327/7378 7398/7323/7374 +f 7401/7326/7377 7398/7323/7374 7395/7321/7372 +f 7402/7328/7379 7401/7326/7377 7403/7329/7380 +f 7395/7321/7372 7394/7320/7371 7403/7329/7380 +f 7394/7320/7371 7382/7308/7359 7405/7330/7381 +f 7405/7330/7381 7385/7310/7361 7406/7331/7382 +f 7403/7329/7380 7405/7330/7381 7404/7332/7383 +f 7407/7333/7384 7408/7334/7385 7409/7335/7386 +f 7408/7334/7385 7399/7324/7375 7402/7328/7379 +f 7409/7335/7386 7402/7328/7379 7404/7332/7383 +f 7410/7336/7387 7409/7335/7386 7411/7337/7388 +f 7412/7338/7389 7411/7337/7388 7413/7339/7390 +f 7411/7337/7388 7404/7332/7383 7406/7331/7382 +f 7413/7339/7390 7406/7331/7382 7380/7306/7357 +f 7414/7340/7391 7413/7339/7390 7378/7304/7355 +f 7412/7338/7389 7415/7341/7392 7416/7342/7393 +f 7415/7341/7392 7417/7343/7394 7418/7344/7395 +f 7416/7342/7393 7418/7344/7395 7420/7345/7396 +f 7410/7336/7387 7416/7342/7393 7420/7345/7396 +f 7417/7343/7394 7415/7341/7392 7422/7346/7397 +f 7415/7341/7392 7412/7338/7389 7414/7340/7391 +f 7421/7347/7398 7414/7340/7391 7376/7303/7354 +f 7422/7346/7397 7421/7347/7398 7372/7300/7348 +f 7419/7348/7399 7418/7349/7395 7423/7350/7400 +f 7418/7349/7395 7417/7351/7394 7423/7350/7400 +f 7423/7350/7400 7422/7352/7397 7370/7295/7347 +f 7424/7353/7401 7423/7350/7400 7331/7255/7312 +f 7425/7354/7402 7426/7355/7403 7428/7356/7404 +f 7426/7355/7403 7429/7357/7405 7430/7358/7406 +f 7427/7359/7407 7430/7358/7406 7407/7333/7384 +f 7428/7356/7404 7427/7359/7407 7419/7360/7399 +f 7429/7357/7405 7426/7355/7403 7431/7361/7408 +f 7426/7355/7403 7425/7354/7402 7433/7362/7409 +f 7431/7361/7408 7433/7362/7409 7256/7169/7236 +f 7432/7363/7410 7431/7361/7408 7254/7167/7234 +f 7256/7293/7236 7433/7364/7409 7368/7294/7346 +f 7433/7364/7409 7425/7365/7402 7434/7366/7411 +f 7434/7366/7411 7428/7367/7404 7424/7353/7401 +f 7368/7294/7346 7434/7366/7411 7331/7255/7312 +f 7429/7357/7405 7435/7368/7412 7436/7369/7413 +f 7435/7368/7412 7437/7370/7414 7438/7371/7415 +f 7436/7369/7413 7438/7371/7415 7399/7324/7375 +f 7430/7358/7406 7436/7369/7413 7408/7334/7385 +f 7437/7370/7414 7439/7372/7416 7440/7373/7417 +f 7439/7372/7416 7361/7287/7342 7363/7374/7418 +f 7440/7373/7417 7363/7374/7418 7366/7327/7378 +f 7438/7371/7415 7440/7373/7417 7400/7325/7376 +f 7244/7156/7223 7441/7375/7419 7442/7376/7420 +f 7441/7375/7419 7353/7279/7334 7356/7281/7336 +f 7442/7376/7420 7356/7281/7336 7361/7287/7342 +f 7443/7377/7421 7442/7376/7420 7439/7372/7416 +f 7296/7215/7276 7444/7378/7422 7297/7217/7278 +f 7444/7378/7422 7446/7379/7423 7445/7380/7424 +f 7445/7380/7424 7447/7381/7425 7259/7172/7239 +f 7297/7217/7278 7445/7380/7424 7258/7171/7238 +f 7262/7174/7241 7447/7381/7425 7448/7382/7426 +f 7447/7381/7425 7446/7379/7423 7450/7383/7427 +f 7448/7382/7426 7450/7383/7427 7357/7282/7337 +f 7449/7384/7428 7448/7382/7426 7354/7280/7335 +f 7262/7174/7241 7449/7384/7428 7263/7176/7243 +f 7449/7384/7428 7353/7279/7334 7451/7385/7429 +f 7451/7385/7429 7441/7375/7419 7242/7155/7222 +f 7263/7176/7243 7451/7385/7429 7236/7149/7216 +f 7246/7166/7233 7245/7158/7225 7452/7386/7430 +f 7245/7158/7225 7244/7156/7223 7443/7377/7421 +f 7452/7386/7430 7443/7377/7421 7437/7370/7414 +f 7432/7363/7410 7452/7386/7430 7435/7368/7412 +f 7453/6548/7431 7454/6474/7432 7455/7387/7433 +f 7454/6474/7432 7457/6472/7434 7458/7388/7435 +f 7455/7387/7433 7458/7388/7435 7298/7389/7279 +f 7456/7390/7436 7455/7387/7433 7309/7391/7289 +f 7298/7389/7279 7458/7388/7435 7299/7392/7280 +f 7458/7388/7435 7457/6472/7434 7459/7393/7437 +f 7459/7393/7437 7460/6455/7438 7462/7394/7439 +f 7299/7392/7280 7459/7393/7437 7288/7395/7269 +f 7288/7395/7269 7462/7394/7439 7289/7396/7270 +f 7462/7394/7439 7461/6453/7440 7463/7397/7441 +f 7463/7397/7441 7464/6481/7442 7466/7398/7443 +f 7289/7396/7270 7463/7397/7441 7292/7399/7272 +f 7465/6480/7444 7467/6478/7445 7468/7400/7446 +f 7467/6478/7445 7469/6476/7447 7470/7401/7448 +f 7468/7400/7446 7470/7401/7448 7294/7402/7275 +f 7466/7398/7443 7468/7400/7446 7294/7402/7275 +f 7469/6476/7447 7471/6417/7449 7470/7401/7448 +f 7471/6417/7449 7473/6406/7450 7472/7403/7451 +f 7472/7403/7451 7474/7404/7452 7444/7405/7422 +f 7470/7401/7448 7472/7403/7451 7296/7406/7276 +f 7473/6406/7450 7475/6412/7453 7474/7404/7452 +f 7475/6412/7453 7477/6413/7454 7476/7407/7455 +f 7476/7407/7455 7478/7408/7456 7450/7409/7427 +f 7474/7404/7452 7476/7407/7455 7446/7410/7423 +f 7477/6413/7454 7479/6606/7457 7478/7408/7456 +f 7479/6606/7457 7481/6614/7458 7480/7411/7459 +f 7480/7411/7459 7482/7412/7460 7358/7413/7338 +f 7478/7408/7456 7480/7411/7459 7357/7414/7337 +f 7481/6614/7458 7483/6613/7461 7482/7412/7460 +f 7483/6613/7461 7485/6603/7462 7484/7415/7463 +f 7484/7415/7463 7486/7416/7464 7364/7417/7344 +f 7482/7412/7460 7484/7415/7463 7359/7418/7340 +f 7365/7419/7465 7486/7416/7464 7487/7420/7466 +f 7486/7416/7464 7485/6603/7462 7488/6602/7467 +f 7487/7420/7466 7488/6602/7467 7489/6592/7468 +f 7397/7421/7469 7487/7420/7466 7490/7422/7470 +f 7489/6592/7468 7491/6597/7471 7490/7422/7470 +f 7491/6597/7471 7493/6555/7472 7492/7423/7473 +f 7492/7423/7473 7494/7424/7474 7391/7425/7368 +f 7490/7422/7470 7492/7423/7473 7390/7426/7367 +f 7493/6555/7472 7495/6561/7475 7494/7424/7474 +f 7495/6561/7475 7497/6563/7476 7496/7427/7477 +f 7496/7427/7477 7498/7428/7478 7387/7429/7364 +f 7494/7424/7474 7496/7427/7477 7386/7430/7363 +f 7335/7431/7316 7498/7428/7478 7499/7432/7479 +f 7498/7428/7478 7497/6563/7476 7500/6564/7480 +f 7499/7432/7479 7500/6564/7480 7501/7433/7481 +f 7336/7434/7317 7499/7432/7479 7502/7433/7482 +f 7503/7435/7483 7504/7436/7484 7506/7437/7485 +f 7504/7436/7484 7507/7438/7486 7505/7439/7487 +f 7505/7439/7487 7508/7440/7488 7509/7441/7489 +f 7506/7437/7485 7505/7439/7487 7511/7442/7490 +f 7512/7443/7491 7513/7444/7492 7514/7445/7493 +f 7513/7444/7492 7516/7446/7494 7517/7447/7495 +f 7514/7445/7493 7517/7447/7495 7503/7435/7483 +f 7515/7448/7496 7514/7445/7493 7506/7437/7485 +f 7518/7449/7497 7519/7450/7498 7520/7451/7499 +f 7519/7450/7498 7522/7452/7500 7523/7453/7501 +f 7520/7451/7499 7523/7453/7501 7516/7446/7494 +f 7521/7454/7502 7520/7451/7499 7513/7444/7492 +f 7524/7455/7503 7525/7456/7504 7526/7457/7505 +f 7525/7456/7504 7528/7458/7506 7529/7459/7507 +f 7526/7457/7505 7529/7459/7507 7522/7452/7500 +f 7527/7460/7508 7526/7457/7505 7519/7450/7498 +f 7530/7461/7509 7531/7462/7510 7533/7463/7511 +f 7531/7462/7510 7528/7458/7506 7532/7464/7512 +f 7532/7464/7512 7525/7456/7504 7534/7465/7513 +f 7533/7463/7511 7532/7464/7512 7535/7466/7514 +f 7536/7467/7515 7537/7468/7516 7539/7469/7517 +f 7537/7468/7516 7530/7461/7509 7538/7470/7518 +f 7538/7470/7518 7533/7463/7511 7540/7471/7519 +f 7539/7469/7517 7538/7470/7518 7541/7472/7520 +f 7541/7472/7520 7542/7473/7521 7543/7474/7522 +f 7542/7473/7521 7544/7475/7523 7545/7476/7524 +f 7543/7474/7522 7545/7476/7524 7546/7477/7525 +f 7539/7469/7517 7543/7474/7522 7547/7478/7526 +f 7544/7475/7523 7548/7479/7527 7545/7476/7524 +f 7548/7479/7527 7550/7480/7528 7549/7481/7529 +f 7549/7481/7529 7551/7482/7530 7553/7483/7531 +f 7545/7476/7524 7549/7481/7529 7546/7477/7525 +f 7554/7484/7532 7555/7485/7533 7556/7486/7534 +f 7555/7485/7533 7558/7487/7535 7559/7488/7536 +f 7556/7486/7534 7559/7488/7536 7552/7489/7537 +f 7557/7490/7538 7556/7486/7534 7551/7482/7530 +f 7560/7491/7539 7561/7492/7540 7563/7493/7541 +f 7561/7492/7540 7564/7494/7542 7562/7495/7543 +f 7562/7495/7543 7565/7496/7544 7567/7497/7545 +f 7563/7493/7541 7562/7495/7543 7568/7498/7546 +f 7564/7494/7542 7569/7499/7547 7565/7496/7544 +f 7569/7499/7547 7571/7500/7548 7570/7501/7549 +f 7570/7501/7549 7572/7502/7550 7574/7503/7551 +f 7565/7496/7544 7570/7501/7549 7566/7504/7552 +f 7573/7505/7553 7572/7502/7550 7575/7506/7554 +f 7572/7502/7550 7571/7500/7548 7577/7507/7555 +f 7575/7506/7554 7577/7507/7555 7558/7487/7535 +f 7576/7508/7556 7575/7506/7554 7555/7485/7533 +f 7560/7491/7539 7563/7493/7541 7578/7509/7557 +f 7563/7493/7541 7568/7498/7546 7580/7510/7558 +f 7578/7509/7557 7580/7510/7558 7509/7441/7489 +f 7579/7511/7559 7578/7509/7557 7508/7440/7488 +f 7581/7512/7560 7582/7513/7561 7584/7514/7562 +f 7582/7513/7561 7585/7515/7563 7583/7516/7564 +f 7583/7516/7564 7586/7517/7565 7521/7454/7502 +f 7584/7514/7562 7583/7516/7564 7512/7443/7491 +f 7587/7518/7566 7588/7519/7567 7589/7520/7568 +f 7588/7519/7567 7591/7521/7569 7592/7522/7570 +f 7589/7520/7568 7592/7522/7570 7585/7515/7563 +f 7590/7523/7571 7589/7520/7568 7582/7513/7561 +f 7585/7515/7563 7592/7522/7570 7593/7524/7572 +f 7592/7522/7570 7591/7521/7569 7595/7525/7573 +f 7593/7524/7572 7595/7525/7573 7596/7526/7574 +f 7594/7527/7575 7593/7524/7572 7597/7528/7576 +f 7585/7515/7563 7594/7527/7575 7586/7517/7565 +f 7594/7527/7575 7598/7529/7577 7599/7530/7578 +f 7599/7530/7578 7600/7531/7579 7527/7460/7508 +f 7586/7517/7565 7599/7530/7578 7518/7449/7497 +f 7598/7529/7577 7601/7532/7580 7600/7531/7579 +f 7601/7532/7580 7603/7533/7581 7604/7534/7582 +f 7602/7535/7583 7604/7534/7582 7534/7465/7513 +f 7600/7531/7579 7602/7535/7583 7524/7455/7503 +f 7596/7526/7574 7605/7536/7584 7606/7537/7585 +f 7605/7536/7584 7607/7538/7586 7608/7539/7587 +f 7606/7537/7585 7608/7539/7587 7603/7533/7581 +f 7597/7528/7576 7606/7537/7585 7598/7529/7577 +f 7609/7540/7588 7610/7541/7589 7611/7542/7590 +f 7610/7541/7589 7613/7543/7591 7611/7542/7590 +f 7611/7542/7590 7614/7544/7592 7605/7536/7584 +f 7612/7545/7593 7611/7542/7590 7605/7536/7584 +f 7607/7538/7586 7614/7544/7592 7608/7539/7587 +f 7614/7544/7592 7613/7543/7591 7616/7546/7594 +f 7615/7547/7595 7616/7546/7594 7617/7548/7596 +f 7608/7539/7587 7615/7547/7595 7618/7549/7597 +f 7535/7466/7514 7604/7534/7582 7619/7550/7598 +f 7604/7534/7582 7603/7533/7581 7619/7550/7598 +f 7619/7550/7598 7618/7549/7597 7620/7551/7599 +f 7540/7471/7519 7619/7550/7598 7620/7551/7599 +f 7617/7548/7596 7621/7552/7600 7620/7551/7599 +f 7621/7552/7600 7623/7553/7601 7622/7554/7602 +f 7622/7554/7602 7624/7555/7603 7544/7475/7523 +f 7620/7551/7599 7622/7554/7602 7542/7473/7521 +f 7617/7548/7596 7616/7546/7594 7621/7552/7600 +f 7616/7546/7594 7613/7543/7591 7625/7556/7604 +f 7625/7556/7604 7610/7541/7589 7609/7540/7588 +f 7621/7552/7600 7625/7556/7604 7626/7557/7605 +f 7609/7540/7588 7627/7558/7606 7626/7557/7605 +f 7627/7558/7606 7629/7559/7607 7628/7560/7608 +f 7628/7560/7608 7630/7561/7609 7632/7562/7610 +f 7626/7557/7605 7628/7560/7608 7623/7553/7601 +f 7623/7553/7601 7632/7562/7610 7624/7555/7603 +f 7632/7562/7610 7631/7563/7611 7633/7564/7612 +f 7633/7564/7612 7634/7565/7613 7548/7479/7527 +f 7624/7555/7603 7633/7564/7612 7544/7475/7523 +f 7635/7566/7614 7636/7567/7615 7638/7568/7616 +f 7636/7567/7615 7581/7512/7560 7637/7569/7617 +f 7637/7569/7617 7584/7514/7562 7515/7448/7496 +f 7638/7568/7616 7637/7569/7617 7511/7442/7490 +f 7639/7570/7618 7640/7571/7619 7641/7572/7620 +f 7640/7571/7619 7635/7566/7614 7641/7572/7620 +f 7641/7572/7620 7638/7568/7616 7510/7573/7621 +f 7642/7574/7622 7641/7572/7620 7510/7573/7621 +f 7643/7575/7623 7644/7576/7624 7646/7577/7625 +f 7644/7576/7624 7639/7570/7618 7645/7578/7626 +f 7645/7578/7626 7642/7574/7622 7580/7510/7558 +f 7646/7577/7625 7645/7578/7626 7568/7498/7546 +f 7554/7484/7532 7647/7579/7627 7648/7580/7628 +f 7647/7579/7627 7649/7581/7629 7650/7582/7630 +f 7648/7580/7628 7650/7582/7630 7651/7583/7631 +f 7576/7508/7556 7648/7580/7628 7652/7584/7632 +f 7649/7581/7629 7653/7585/7633 7654/7586/7634 +f 7653/7585/7633 7655/7587/7635 7654/7586/7634 +f 7654/7586/7634 7656/7588/7636 7658/7589/7637 +f 7650/7582/7630 7654/7586/7634 7658/7589/7637 +f 7655/7587/7635 7659/7590/7638 7660/7591/7639 +f 7659/7590/7638 7596/7526/7574 7660/7591/7639 +f 7656/7588/7636 7660/7591/7639 7657/7592/7640 +f 7631/7563/7611 7630/7561/7609 7662/7593/7641 +f 7630/7561/7609 7629/7559/7607 7664/7594/7642 +f 7662/7593/7641 7664/7594/7642 7655/7587/7635 +f 7663/7595/7643 7662/7593/7641 7653/7585/7633 +f 7550/7480/7528 7634/7565/7613 7665/7596/7644 +f 7634/7565/7613 7631/7563/7611 7663/7595/7643 +f 7665/7596/7644 7663/7595/7643 7649/7581/7629 +f 7557/7490/7538 7665/7596/7644 7647/7579/7627 +f 7655/7587/7635 7664/7594/7642 7666/7597/7645 +f 7664/7594/7642 7629/7559/7607 7666/7597/7645 +f 7659/7590/7638 7666/7597/7645 7596/7526/7574 +f 7657/7592/7640 7661/7598/7646 7669/7599/7647 +f 7661/7598/7646 7596/7526/7574 7595/7525/7573 +f 7669/7599/7647 7668/7600/7648 7591/7521/7569 +f 7587/7518/7566 7670/7601/7649 7588/7519/7567 +f 7670/7601/7649 7657/7592/7640 7669/7599/7647 +f 7588/7519/7567 7671/7602/7650 7669/7599/7647 +f 7672/7603/7651 7673/7604/7652 7675/7605/7653 +f 7673/7604/7652 7657/7592/7640 7674/7606/7654 +f 7675/7605/7653 7674/7606/7654 7587/7518/7566 +f 7657/7592/7640 7673/7604/7652 7658/7589/7637 +f 7673/7604/7652 7672/7603/7651 7676/7607/7655 +f 7676/7607/7655 7677/7608/7656 7679/7609/7657 +f 7658/7589/7637 7676/7607/7655 7651/7583/7631 +f 7573/7505/7553 7652/7584/7632 7680/7610/7658 +f 7652/7584/7632 7651/7583/7631 7679/7609/7657 +f 7680/7610/7658 7679/7609/7657 7678/7611/7659 +f 7574/7503/7551 7680/7610/7658 7681/7612/7660 +f 7678/7611/7659 7677/7608/7656 7682/7613/7661 +f 7677/7608/7656 7672/7603/7651 7684/7614/7662 +f 7682/7613/7661 7684/7614/7662 7686/7615/7663 +f 7683/7616/7664 7682/7613/7661 7686/7615/7663 +f 7566/7504/7552 7681/7612/7660 7687/7617/7665 +f 7681/7612/7660 7678/7611/7659 7683/7616/7664 +f 7687/7617/7665 7683/7616/7664 7643/7575/7623 +f 7567/7497/7545 7687/7617/7665 7646/7577/7625 +f 7685/7618/7666 7688/7619/7667 7689/7620/7668 +f 7688/7619/7667 7690/7621/7669 7691/7622/7670 +f 7689/7620/7668 7691/7622/7670 7639/7570/7618 +f 7686/7615/7663 7689/7620/7668 7643/7575/7623 +f 7685/7618/7666 7684/7614/7662 7692/7623/7671 +f 7684/7614/7662 7672/7603/7651 7692/7623/7671 +f 7693/7624/7672 7692/7623/7671 7675/7605/7653 +f 7690/7621/7669 7694/7625/7673 7695/7626/7674 +f 7694/7625/7673 7696/7627/7675 7695/7626/7674 +f 7695/7626/7674 7697/7628/7676 7640/7571/7619 +f 7691/7622/7670 7695/7626/7674 7640/7571/7619 +f 7696/7627/7675 7694/7625/7673 7699/7629/7677 +f 7694/7625/7673 7690/7621/7669 7698/7630/7678 +f 7698/7630/7678 7688/7619/7667 7693/7624/7672 +f 7699/7629/7677 7698/7630/7678 7587/7518/7566 +f 7635/7566/7614 7697/7628/7676 7700/7631/7679 +f 7697/7628/7676 7696/7627/7675 7699/7629/7677 +f 7700/7631/7679 7699/7629/7677 7587/7518/7566 +f 7636/7567/7615 7700/7631/7679 7590/7523/7571 +f 7629/7559/7607 7627/7558/7606 7667/7632/7680 +f 7627/7558/7606 7609/7540/7588 7701/7633/7681 +f 7667/7632/7680 7701/7633/7681 7596/7526/7574 +f 7702/7634/7682 7703/7635/7683 7704/7636/7684 +f 7703/7635/7683 7706/7637/7685 7704/7636/7684 +f 7704/7636/7684 7707/7638/7686 7709/7639/7687 +f 7705/7640/7688 7704/7636/7684 7709/7639/7687 +f 7711/7641/7689 7712/7642/7690 7713/7643/7691 +f 7712/7642/7690 7702/7634/7682 7713/7643/7691 +f 7713/7643/7691 7715/7644/7692 7717/6395/7693 +f 7714/7645/7694 7713/7643/7691 7718/6394/7695 +f 7719/7646/7696 7720/7647/7697 7722/7648/7698 +f 7720/7647/7697 7723/6272/7699 7721/7649/7700 +f 7721/7649/7700 7724/6364/7701 7726/7650/7702 +f 7722/7648/7698 7721/7649/7700 7726/7650/7702 +f 7728/6277/7703 7729/7651/7704 7730/7652/7705 +f 7729/7651/7704 7732/7653/7706 7730/7652/7705 +f 7730/7652/7705 7733/7654/7707 7726/7650/7702 +f 7731/6360/7708 7730/7652/7705 7725/6361/7709 +f 7734/6284/7710 7735/7655/7711 7737/6279/7712 +f 7735/7655/7711 7710/7656/7713 7736/7657/7714 +f 7736/7657/7714 7738/7658/7715 7729/7651/7704 +f 7737/6279/7712 7736/7657/7714 7729/7651/7704 +f 7727/7659/7716 7733/7654/7707 7739/7660/7717 +f 7733/7654/7707 7732/7653/7706 7741/7661/7718 +f 7739/7660/7717 7741/7661/7718 7742/7662/7719 +f 7740/7663/7720 7739/7660/7717 7744/7664/7721 +f 7745/7665/7722 7746/7666/7723 7747/7667/7724 +f 7746/7666/7723 7719/7646/7696 7722/7648/7698 +f 7747/7667/7724 7722/7648/7698 7727/7659/7716 +f 7748/7668/7725 7747/7667/7724 7744/7664/7721 +f 7749/7669/7726 7750/7670/7727 7752/7671/7728 +f 7750/7670/7727 7753/7672/7729 7751/7673/7730 +f 7751/7673/7730 7754/7674/7731 7755/7675/7732 +f 7752/7671/7728 7751/7673/7730 7756/7676/7733 +f 7755/7675/7732 7758/7677/7734 7759/7678/7735 +f 7758/7677/7734 7761/7679/7736 7762/7680/7737 +f 7759/7678/7735 7762/7680/7737 7763/7681/7738 +f 7760/7682/7739 7759/7678/7735 7764/7683/7740 +f 7763/7681/7738 7762/7680/7737 7767/7684/7741 +f 7762/7680/7737 7761/7679/7736 7766/7685/7742 +f 7766/7685/7742 7768/7686/7743 7770/7687/7744 +f 7767/7684/7741 7766/7685/7742 7771/7688/7745 +f 7771/7688/7745 7770/7687/7744 7773/7689/7746 +f 7770/7687/7744 7769/7690/7747 7774/7691/7748 +f 7772/7692/7749 7774/7691/7748 7776/7693/7750 +f 7773/7689/7746 7772/7692/7749 7777/7694/7751 +f 7778/7695/7752 7779/7696/7753 7781/7697/7754 +f 7779/7696/7753 7782/6275/7755 7780/7698/7756 +f 7780/7698/7756 7783/6273/7757 7720/7647/7697 +f 7781/7697/7754 7780/7698/7756 7719/7646/7696 +f 7777/7694/7751 7776/7693/7750 7785/7699/7758 +f 7776/7693/7750 7775/7700/7759 7784/7701/7760 +f 7784/7701/7760 7786/7702/7761 7787/7703/7762 +f 7785/7699/7758 7784/7701/7760 7788/7704/7763 +f 7788/7704/7763 7787/7703/7762 7790/7705/7764 +f 7787/7703/7762 7778/7695/7752 7789/7706/7765 +f 7789/7706/7765 7781/7697/7754 7719/7646/7696 +f 7790/7705/7764 7789/7706/7765 7746/7666/7723 +f 7775/7700/7759 7791/7707/7766 7786/7702/7761 +f 7791/7707/7766 7793/6371/7767 7794/6368/7768 +f 7792/7708/7769 7794/6368/7768 7779/7696/7753 +f 7786/7702/7761 7792/7708/7769 7778/7695/7752 +f 7769/7690/7747 7795/7709/7770 7796/7710/7771 +f 7795/7709/7770 7797/6380/7772 7798/6372/7773 +f 7796/7710/7771 7798/6372/7773 7793/6371/7767 +f 7774/7691/7748 7796/7710/7771 7791/7707/7766 +f 7761/7679/7736 7799/7711/7774 7800/7712/7775 +f 7799/7711/7774 7801/6382/7776 7802/6381/7777 +f 7800/7712/7775 7802/6381/7777 7797/6380/7772 +f 7768/7686/7743 7800/7712/7775 7795/7709/7770 +f 7753/7672/7729 7803/7713/7778 7754/7674/7731 +f 7803/7713/7778 7801/6382/7776 7804/7714/7779 +f 7804/7714/7779 7799/7711/7774 7761/7679/7736 +f 7754/7674/7731 7804/7714/7779 7755/7675/7732 +f 7805/7715/7780 7806/7716/7781 7808/7717/7782 +f 7806/7716/7781 7711/7641/7689 7714/7645/7694 +f 7807/7718/7783 7714/7645/7694 7809/7719/7784 +f 7808/7717/7782 7807/7718/7783 7810/7720/7785 +f 7706/7637/7685 7703/7635/7683 7811/7721/7786 +f 7703/7635/7683 7702/7634/7682 7712/7642/7690 +f 7811/7721/7786 7712/7642/7690 7813/7722/7787 +f 7812/7723/7788 7811/7721/7786 7813/7722/7787 +f 7815/7724/7789 7816/7725/7790 7817/7726/7791 +f 7816/7725/7790 7819/7727/7792 7817/7726/7791 +f 7817/7726/7791 7820/7728/7793 7812/7723/7788 +f 7818/7729/7794 7817/7726/7791 7812/7723/7788 +f 7821/7730/7795 7822/7731/7796 7824/7732/7797 +f 7822/7731/7796 7814/7733/7798 7823/7734/7799 +f 7823/7734/7799 7813/7722/7787 7806/7716/7781 +f 7824/7732/7797 7823/7734/7799 7805/7715/7780 +f 7821/7730/7795 7825/7735/7800 7822/7731/7796 +f 7825/7735/7800 7827/7736/7801 7828/7737/7802 +f 7826/7738/7803 7828/7737/7802 7818/7729/7794 +f 7822/7731/7796 7826/7738/7803 7814/7733/7798 +f 7706/7637/7685 7820/7728/7793 7829/7739/7804 +f 7820/7728/7793 7819/7727/7792 7829/7739/7804 +f 7829/7739/7804 7830/7740/7805 7831/7741/7806 +f 7707/7638/7686 7829/7739/7804 7832/7742/7807 +f 7708/7743/7808 7832/7742/7807 7834/7744/7809 +f 7832/7742/7807 7831/7741/7806 7835/7745/7810 +f 7833/7746/7811 7835/7745/7810 7837/7747/7812 +f 7834/7744/7809 7833/7746/7811 7838/7748/7813 +f 7831/7741/7806 7830/7740/7805 7840/7749/7814 +f 7830/7740/7805 7819/7727/7792 7839/7750/7815 +f 7839/7750/7815 7816/7725/7790 7841/7751/7816 +f 7840/7749/7814 7839/7750/7815 7842/7752/7817 +f 7815/7724/7789 7828/7737/7802 7843/7753/7818 +f 7828/7737/7802 7827/7736/7801 7844/7754/7819 +f 7843/7753/7818 7844/7754/7819 7845/7755/7820 +f 7841/7751/7816 7843/7753/7818 7846/7756/7821 +f 7847/7757/7822 7848/7758/7823 7849/7759/7824 +f 7848/7758/7823 7851/7760/7825 7849/7759/7824 +f 7849/7759/7824 7852/7761/7826 7853/7762/7827 +f 7850/7763/7828 7849/7759/7824 7854/7764/7829 +f 7856/7765/7830 7857/7766/7831 7858/7767/7832 +f 7857/7766/7831 7847/7757/7822 7850/7763/7828 +f 7858/7767/7832 7850/7763/7828 7855/7768/7833 +f 7859/7769/7834 7858/7767/7832 7860/7770/7835 +f 7861/7771/7836 7862/7772/7837 7859/7769/7834 +f 7862/7772/7837 7749/7669/7726 7863/7773/7838 +f 7863/7773/7838 7752/7671/7728 7864/7774/7839 +f 7859/7769/7834 7863/7773/7838 7856/7765/7830 +f 7757/7775/7840 7756/7676/7733 7865/7776/7841 +f 7756/7676/7733 7755/7675/7732 7760/7682/7739 +f 7865/7776/7841 7760/7682/7739 7765/7777/7842 +f 7866/7778/7843 7865/7776/7841 7867/7779/7844 +f 7856/7765/7830 7864/7774/7839 7870/7780/7845 +f 7864/7774/7839 7757/7775/7840 7866/7778/7843 +f 7869/7781/7846 7866/7778/7843 7871/7782/7847 +f 7870/7780/7845 7869/7781/7846 7872/7783/7848 +f 7873/7784/7849 7874/7785/7850 7875/7786/7851 +f 7874/7785/7850 7847/7757/7822 7875/7786/7851 +f 7875/7786/7851 7857/7766/7831 7870/7780/7845 +f 7876/7787/7852 7875/7786/7851 7870/7780/7845 +f 7877/7788/7853 7878/7789/7854 7880/7790/7855 +f 7878/7789/7854 7851/7760/7825 7879/7791/7856 +f 7879/7791/7856 7848/7758/7823 7847/7757/7822 +f 7880/7790/7855 7879/7791/7856 7873/7784/7849 +f 7877/7788/7853 7881/7792/7857 7878/7789/7854 +f 7881/7792/7857 7821/7730/7795 7882/7793/7858 +f 7882/7793/7858 7824/7732/7797 7883/7794/7859 +f 7878/7789/7854 7882/7793/7858 7883/7794/7859 +f 7805/7715/7780 7808/7717/7782 7884/7795/7860 +f 7808/7717/7782 7810/7720/7785 7884/7795/7860 +f 7884/7795/7860 7885/7796/7861 7853/7762/7827 +f 7883/7794/7859 7884/7795/7860 7852/7761/7826 +f 7886/7797/7862 7887/7797/7863 7888/7797/7864 +f 7887/7797/7863 7765/7797/7842 7888/7797/7864 +f 7888/7797/7864 7764/7797/7740 7890/7798/7865 +f 7889/7797/7866 7888/7797/7864 7890/7798/7865 +f 7892/7799/7867 7893/7799/7868 7895/7799/7869 +f 7893/7799/7868 7777/7800/7751 7894/7799/7870 +f 7894/7799/7870 7785/7801/7758 7896/7799/7871 +f 7895/7799/7869 7894/7799/7870 7897/7802/7872 +f 7897/7802/7872 7896/7799/7871 7899/7802/7873 +f 7896/7799/7871 7788/7801/7763 7898/7802/7874 +f 7898/7802/7874 7790/7803/7764 7900/7802/7875 +f 7899/7802/7873 7898/7802/7874 7901/7802/7876 +f 7901/7802/7876 7900/7802/7875 7903/7804/7877 +f 7900/7802/7875 7745/7803/7722 7902/7804/7878 +f 7902/7804/7878 7748/7805/7725 7904/7806/7879 +f 7903/7804/7877 7902/7804/7878 7905/7804/7880 +f 7744/7806/7721 7743/7806/7881 7904/7806/7879 +f 7743/7806/7881 7742/7807/7719 7906/7806/7882 +f 7906/7806/7882 7907/7806/7883 7909/7808/7884 +f 7904/7806/7879 7906/7806/7882 7905/7804/7880 +f 7891/7797/7885 7890/7798/7865 7910/7798/7886 +f 7890/7798/7865 7763/7798/7738 7910/7798/7886 +f 7910/7798/7886 7767/7798/7741 7912/7798/7887 +f 7911/7798/7888 7910/7798/7886 7912/7798/7887 +f 7913/7799/7889 7912/7798/7887 7915/7799/7890 +f 7912/7798/7887 7771/7800/7745 7914/7798/7891 +f 7914/7798/7891 7773/7800/7746 7893/7799/7868 +f 7915/7799/7890 7914/7798/7891 7892/7799/7867 +f 7838/7809/7813 7916/7810/7892 7918/7809/7893 +f 7916/7810/7892 7919/7810/7894 7917/7810/7895 +f 7917/7810/7895 7920/7810/7896 7922/7810/7897 +f 7918/7809/7893 7917/7810/7895 7923/7809/7898 +f 7877/7811/7853 7880/7812/7855 7924/7813/7899 +f 7880/7812/7855 7873/7812/7849 7924/7813/7899 +f 7924/7813/7899 7926/7814/7900 7927/7815/7901 +f 7925/7811/7902 7924/7813/7899 7928/7813/7903 +f 7873/7812/7849 7876/7814/7852 7926/7814/7900 +f 7876/7814/7852 7872/7816/7848 7930/7814/7904 +f 7930/7814/7904 7931/7816/7905 7933/7817/7906 +f 7926/7814/7900 7930/7814/7904 7927/7815/7901 +f 7932/7817/7907 7931/7816/7905 7934/7818/7908 +f 7931/7816/7905 7872/7816/7848 7871/7818/7847 +f 7934/7818/7908 7871/7818/7847 7868/7819/7909 +f 7935/7818/7910 7934/7818/7908 7936/7819/7911 +f 7937/7820/7912 7936/7819/7911 7938/7819/7913 +f 7936/7819/7911 7868/7819/7909 7938/7819/7913 +f 7938/7819/7913 7867/7819/7844 7887/7797/7863 +f 7939/7819/7914 7938/7819/7913 7887/7797/7863 +f 7564/7820/7542 7940/7797/7915 7941/7797/7916 +f 7940/7797/7915 7886/7797/7862 7889/7797/7866 +f 7941/7797/7916 7889/7797/7866 7891/7797/7885 +f 7569/7821/7547 7941/7797/7916 7942/7821/7917 +f 7558/7821/7535 7943/7799/7918 7944/7799/7919 +f 7943/7799/7918 7892/7799/7867 7895/7799/7869 +f 7944/7799/7919 7895/7799/7869 7945/7802/7920 +f 7559/7821/7536 7944/7799/7919 7945/7802/7920 +f 7552/7822/7537 7945/7802/7920 7946/7802/7921 +f 7945/7802/7920 7897/7802/7872 7946/7802/7921 +f 7946/7802/7921 7899/7802/7873 7947/7802/7922 +f 7553/7822/7531 7946/7802/7921 7546/7822/7525 +f 7546/7822/7525 7947/7802/7922 7547/7823/7526 +f 7947/7802/7922 7901/7802/7876 7948/7823/7923 +f 7948/7823/7923 7903/7804/7877 7949/7823/7924 +f 7547/7823/7526 7948/7823/7923 7536/7823/7515 +f 7905/7804/7880 7909/7808/7884 7950/7808/7925 +f 7909/7808/7884 7908/7808/7926 7950/7808/7925 +f 7950/7808/7925 7951/7808/7927 7537/7808/7516 +f 7949/7823/7924 7950/7808/7925 7536/7823/7515 +f 7891/7797/7885 7911/7798/7888 7942/7821/7917 +f 7911/7798/7888 7913/7799/7889 7953/7799/7928 +f 7942/7821/7917 7952/7799/7929 7571/7821/7548 +f 7571/7821/7548 7953/7799/7928 7954/7799/7930 +f 7953/7799/7928 7913/7799/7889 7915/7799/7890 +f 7954/7799/7930 7915/7799/7890 7892/7799/7867 +f 7577/7821/7555 7954/7799/7930 7943/7799/7918 +f 7923/7809/7898 7922/7810/7897 7956/7808/7931 +f 7922/7810/7897 7921/7810/7932 7955/7824/7933 +f 7955/7824/7933 7957/7824/7934 7529/7824/7507 +f 7956/7808/7931 7955/7824/7933 7528/7808/7506 +f 7929/7813/7935 7928/7813/7903 7959/7813/7936 +f 7928/7813/7903 7927/7815/7901 7960/7815/7937 +f 7958/7813/7938 7960/7815/7937 7517/7813/7495 +f 7959/7813/7936 7958/7813/7938 7516/7824/7494 +f 7927/7815/7901 7933/7817/7906 7961/7817/7939 +f 7933/7817/7906 7932/7817/7907 7961/7817/7939 +f 7961/7817/7939 7962/7817/7940 7504/7815/7484 +f 7960/7815/7937 7961/7817/7939 7504/7815/7484 +f 7507/7817/7486 7962/7817/7940 7963/7818/7941 +f 7962/7817/7940 7932/7817/7907 7935/7818/7910 +f 7963/7818/7941 7935/7818/7910 7937/7820/7912 +f 7579/7817/7559 7963/7818/7941 7964/7820/7942 +f 7560/7820/7539 7964/7820/7942 7965/7820/7943 +f 7964/7820/7942 7937/7820/7912 7939/7819/7914 +f 7965/7820/7943 7939/7819/7914 7886/7797/7862 +f 7561/7820/7540 7965/7820/7943 7940/7797/7915 +f 7919/7810/7894 7966/7810/7944 7920/7810/7896 +f 7966/7810/7944 7968/7810/7945 7969/7810/7946 +f 7967/7810/7947 7969/7810/7946 7971/7810/7948 +f 7920/7810/7896 7967/7810/7947 7921/7810/7932 +f 7921/7810/7932 7971/7810/7948 7957/7824/7934 +f 7971/7810/7948 7970/7810/7949 7972/7824/7950 +f 7957/7824/7934 7972/7824/7950 7522/7824/7500 +f 7821/7730/7795 7974/7825/7951 7825/7735/7800 +f 7974/7825/7951 7976/7826/7952 7975/7827/7953 +f 7975/7827/7953 7977/7828/7954 7845/7755/7820 +f 7825/7735/7800 7975/7827/7953 7827/7736/7801 +f 7976/7826/7952 7974/7825/7951 7978/7829/7955 +f 7974/7825/7951 7821/7730/7795 7978/7829/7955 +f 7979/7830/7956 7978/7829/7955 7877/7788/7853 +f 7980/7831/7957 7981/7832/7958 7982/7833/7959 +f 7981/7832/7958 7976/7826/7952 7982/7833/7959 +f 7983/7834/7960 7982/7833/7959 7877/7788/7853 +f 7984/7824/7961 7985/7824/7962 7987/7810/7963 +f 7985/7824/7962 7970/7810/7949 7986/7810/7964 +f 7986/7810/7964 7969/7810/7946 7968/7810/7945 +f 7987/7810/7963 7986/7810/7964 7988/7810/7965 +f 7929/7813/7935 7989/7824/7966 7990/7811/7967 +f 7989/7824/7966 7984/7824/7961 7990/7811/7967 +f 7990/7811/7967 7987/7810/7963 7980/7810/7957 +f 7925/7811/7902 7990/7811/7967 7983/7811/7960 +f 7984/7824/7961 7991/7824/7968 7992/7824/7969 +f 7991/7824/7968 7522/7824/7500 7992/7824/7969 +f 7985/7824/7962 7992/7824/7969 7973/7824/7970 +f 7984/7824/7961 7989/7824/7966 7991/7824/7968 +f 7989/7824/7966 7929/7813/7935 7993/7824/7971 +f 7993/7824/7971 7959/7813/7936 7523/7824/7501 +f 7991/7824/7968 7993/7824/7971 7522/7824/7500 +f 7836/7835/7972 7835/7745/7810 7995/7836/7973 +f 7835/7745/7810 7831/7741/7806 7994/7837/7974 +f 7994/7837/7974 7840/7749/7814 7996/7838/7975 +f 7995/7836/7973 7994/7837/7974 7997/7839/7976 +f 7842/7752/7817 7846/7756/7821 7998/7840/7977 +f 7846/7756/7821 7845/7755/7820 7999/7841/7978 +f 7998/7840/7977 7999/7841/7978 8000/7842/7979 +f 7996/7838/7975 7998/7840/7977 8001/7843/7980 +f 7845/7755/7820 7977/7828/7954 8002/7844/7981 +f 7977/7828/7954 7976/7826/7952 7981/7832/7958 +f 8002/7844/7981 7981/7832/7958 7980/7831/7957 +f 7999/7841/7978 8002/7844/7981 8003/7845/7982 +f 7919/7846/7894 8004/7847/7983 7966/7848/7944 +f 8004/7847/7983 7997/7839/7976 8005/7849/7984 +f 8005/7849/7984 8001/7843/7980 8006/7850/7985 +f 7966/7848/7944 8005/7849/7984 7968/7851/7945 +f 7838/7748/7813 7837/7747/7812 7916/7852/7892 +f 7837/7747/7812 7836/7835/7972 7995/7836/7973 +f 8007/7853/7986 7995/7836/7973 8004/7847/7983 +f 7916/7852/7892 8007/7853/7986 8004/7847/7983 +f 7968/7851/7945 8006/7850/7985 7988/7854/7965 +f 8006/7850/7985 8000/7842/7979 8008/7855/7987 +f 7988/7854/7965 8008/7855/7987 7980/7831/7957 +f 7716/6388/7988 7715/7644/7692 8009/7856/7989 +f 7715/7644/7692 7702/7634/7682 8009/7856/7989 +f 8009/7856/7989 7705/7640/7688 7735/7655/7711 +f 8010/6389/7990 8009/7856/7989 7734/6284/7710 +f 7710/7656/7713 8011/7857/7991 8012/7858/7992 +f 8011/7857/7991 8013/7859/7993 8012/7858/7992 +f 8012/7858/7992 8014/7860/7994 7741/7661/7718 +f 7738/7658/7715 8012/7858/7992 7732/7653/7706 +f 7708/7743/7808 7834/7744/7809 8015/7861/7995 +f 7834/7744/7809 7838/7748/7813 8016/7862/7996 +f 8015/7861/7995 8016/7862/7996 8013/7859/7993 +f 7709/7639/7687 8015/7861/7995 8011/7857/7991 +f 8017/7809/7997 8018/7809/7998 8020/7809/7999 +f 8018/7809/7998 8013/7809/7993 8019/7809/8000 +f 8019/7809/8000 8016/7809/7996 7838/7809/7813 +f 8020/7809/7999 8019/7809/8000 7918/7809/7893 +f 7908/7808/7926 7907/7806/7883 8021/7809/8001 +f 7907/7806/7883 7742/7807/7719 8014/7809/7994 +f 8021/7809/8001 8014/7809/7994 8018/7809/7998 +f 8022/7808/8002 8021/7809/8001 8017/7809/7997 +f 7923/7809/7898 7956/7808/7931 8023/7808/8003 +f 7956/7808/7931 7528/7808/7506 8023/7808/8003 +f 8020/7809/7999 8023/7808/8003 8024/7808/8004 +f 8017/7809/7997 8024/7808/8004 8025/7808/8005 +f 8024/7808/8004 7528/7808/7506 7531/7808/7510 +f 8025/7808/8005 7531/7808/7510 7530/7808/7509 +f 8022/7808/8002 8025/7808/8005 7951/7808/7927 +f 8026/7863/8006 8027/7864/8007 8028/7865/8008 +f 8027/7864/8007 8030/7866/8009 8031/7867/8010 +f 8028/7865/8008 8031/7867/8010 7209/7868/7191 +f 8029/7869/8011 8028/7865/8008 7212/7870/7193 +f 8032/7871/8012 8033/7872/8013 8035/7873/8014 +f 8033/7872/8013 8036/7874/8015 8034/7875/8016 +f 8034/7875/8016 8037/7876/8017 8027/7864/8007 +f 8035/7873/8014 8034/7875/8016 8026/7863/8006 +f 8038/7877/8018 8039/7878/8019 8040/7879/8020 +f 8039/7878/8019 8042/7880/8021 8040/7879/8020 +f 8040/7879/8020 8043/7881/8022 8033/7872/8013 +f 8041/7882/8023 8040/7879/8020 8033/7872/8013 +f 8044/7883/8024 8045/7884/8025 8047/7885/8026 +f 8045/7884/8025 8048/7886/8027 8046/7887/8028 +f 8046/7887/8028 8049/7888/8029 8039/7878/8019 +f 8047/7885/8026 8046/7887/8028 8038/7877/8018 +f 8044/7883/8024 8050/7889/8030 8051/7890/8031 +f 8050/7889/8030 8052/7891/8032 8053/7892/8033 +f 8051/7890/8031 8053/7892/8033 8054/7893/8034 +f 8045/7884/8025 8051/7890/8031 8055/7894/8035 +f 8056/7895/8036 8057/7896/8037 8058/7897/8038 +f 8057/7896/8037 8060/7898/8039 8061/7899/8040 +f 8058/7897/8038 8061/7899/8040 8054/7893/8034 +f 8059/7900/8041 8058/7897/8038 8052/7891/8032 +f 8044/7883/8024 8062/7901/8042 8050/7889/8030 +f 8062/7901/8042 8064/7902/8043 8063/7903/8044 +f 8063/7903/8044 8065/7904/8045 8067/7905/8046 +f 8050/7889/8030 8063/7903/8044 8052/7891/8032 +f 8066/7906/8047 8068/7907/8048 8069/7908/8049 +f 8068/7907/8048 8070/7909/8050 8071/7910/8051 +f 8069/7908/8049 8071/7910/8051 8059/7900/8041 +f 8067/7905/8046 8069/7908/8049 8059/7900/8041 +f 8054/7893/8034 8072/7911/8052 8073/7912/8053 +f 8072/7911/8052 8074/7913/8054 8075/7914/8055 +f 8073/7912/8053 8075/7914/8055 8076/7915/8056 +f 8055/7894/8035 8073/7912/8053 8077/7916/8057 +f 8048/7886/8027 8077/7916/8057 8049/7888/8029 +f 8077/7916/8057 8076/7915/8056 8079/7917/8058 +f 8078/7918/8059 8079/7917/8058 8081/7919/8060 +f 8049/7888/8029 8078/7918/8059 8042/7880/8021 +f 8064/7902/8043 8062/7901/8042 8082/7920/8061 +f 8062/7901/8042 8044/7883/8024 8082/7920/8061 +f 8082/7920/8061 8047/7885/8026 8038/7877/8018 +f 8083/7921/8062 8082/7920/8061 8084/7922/8063 +f 8032/7871/8012 8086/7923/8064 8041/7882/8023 +f 8086/7923/8064 8088/7924/8065 8087/7925/8066 +f 8087/7925/8066 8089/7926/8067 8084/7922/8063 +f 8041/7882/8023 8087/7925/8066 8038/7877/8018 +f 8085/7927/8068 8089/7928/8067 8091/7929/8069 +f 8089/7928/8067 8088/7930/8065 8090/7931/8070 +f 8090/7931/8070 8092/7932/8071 8094/7933/8072 +f 8091/7929/8069 8090/7931/8070 7281/7934/7264 +f 8066/7935/8047 8065/7936/8045 8095/7937/8073 +f 8065/7936/8045 8064/7938/8043 8083/7939/8062 +f 8095/7937/8073 8083/7939/8062 8085/7927/8068 +f 8096/7940/8074 8095/7937/8073 7281/7934/7264 +f 8042/7880/8021 8081/7919/8060 8043/7881/8022 +f 8081/7919/8060 8080/7941/8075 8097/7942/8076 +f 8097/7942/8076 8098/7943/8077 8100/7944/8078 +f 8043/7881/8022 8097/7942/8076 8036/7874/8015 +f 8080/7941/8075 8101/7945/8079 8098/7943/8077 +f 8101/7945/8079 8103/7946/8080 8102/7947/8081 +f 8102/7947/8081 8104/7948/8082 8106/7949/8083 +f 8098/7943/8077 8102/7947/8081 8099/7950/8084 +f 8076/7915/8056 8107/7951/8085 8108/7952/8086 +f 8107/7951/8085 8109/7953/8087 8108/7952/8086 +f 8108/7952/8086 8110/7954/8088 8101/7945/8079 +f 8079/7917/8058 8108/7952/8086 8080/7941/8075 +f 8099/7950/8084 8106/7949/8083 8112/7955/8089 +f 8106/7949/8083 8105/7956/8090 8111/7957/8091 +f 8111/7957/8091 8113/7958/8092 8115/7959/8093 +f 8112/7955/8089 8111/7957/8091 8116/7960/8094 +f 8114/7961/8095 8117/7962/8096 8118/7963/8097 +f 8117/7962/8096 7308/7964/7287 8118/7963/8097 +f 8118/7963/8097 7305/7965/7285 7304/7966/7284 +f 8115/7959/8093 8118/7963/8097 8119/7967/8098 +f 8030/7866/8009 8120/7968/8099 8121/7969/8100 +f 8120/7968/8099 8116/7960/8094 8119/7967/8098 +f 8121/7969/8100 8119/7967/8098 7304/7966/7284 +f 8031/7867/8010 8121/7969/8100 7311/7970/7293 +f 8036/7874/8015 8100/7944/8078 8037/7876/8017 +f 8100/7944/8078 8099/7950/8084 8122/7971/8101 +f 8122/7971/8101 8112/7955/8089 8120/7968/8099 +f 8037/7876/8017 8122/7971/8101 8030/7866/8009 +f 8093/7972/8102 8092/7973/8071 8124/7974/8103 +f 8092/7973/8071 8088/7924/8065 8123/7975/8104 +f 8123/7975/8104 8086/7923/8064 8035/7873/8014 +f 8124/7974/8103 8123/7975/8104 8026/7863/8006 +f 7318/7976/7299 8125/7977/8105 8126/7978/8106 +f 8125/7977/8105 8093/7972/8102 8126/7978/8106 +f 8126/7978/8106 8124/7974/8103 8029/7869/8011 +f 7319/7979/7301 8126/7978/8106 8029/7869/8011 +f 8093/7980/8102 8125/7981/8105 8094/7933/8072 +f 8125/7981/8105 7318/7982/7299 7321/7983/7303 +f 8094/7933/8072 8127/7984/8107 7321/7983/7303 +f 8128/7985/8108 8129/7986/8109 8131/7987/8110 +f 8129/7986/8109 8132/7988/8111 8130/7989/8112 +f 8130/7989/8112 8133/7990/8113 7325/7991/7310 +f 8131/7987/8110 8130/7989/8112 7330/7992/7333 +f 8132/7993/8111 8134/7994/8114 8133/7995/8113 +f 8134/7994/8114 7331/7996/7312 8135/7997/8115 +f 8133/7995/8113 8135/7997/8115 7334/7998/7314 +f 7341/7999/7327 7340/8000/7321 8136/8001/8116 +f 7340/8000/7321 7339/8002/7319 8138/8003/8117 +f 8136/8001/8116 8138/8003/8117 8139/8004/8118 +f 8137/8005/8119 8136/8001/8116 8140/8006/8120 +f 7341/7999/7327 8137/8005/8119 7348/8007/7329 +f 8137/8005/8119 8141/8008/8121 8142/8009/8122 +f 8142/8009/8122 8143/8010/8123 8145/8011/8124 +f 7348/8007/7329 8142/8009/8122 7349/8012/7332 +f 7349/8012/7332 8145/8011/8124 8146/8013/8125 +f 8145/8011/8124 8144/8014/8126 8146/8013/8125 +f 8146/8013/8125 8147/8015/8127 8131/7987/8110 +f 7352/8016/8128 8146/8013/8125 8131/7987/8110 +f 8148/8017/8129 8149/8018/8130 8151/8019/8131 +f 8149/8018/8130 8152/8020/8132 8150/8021/8133 +f 8150/8021/8133 8153/8022/8134 8154/8023/8135 +f 8151/8019/8131 8150/8021/8133 8156/8024/8136 +f 8157/8025/8137 8158/8026/8138 8160/8027/8139 +f 8158/8026/8138 8148/8017/8129 8159/8028/8140 +f 8159/8028/8140 8151/8019/8131 8161/8029/8141 +f 8160/8027/8139 8159/8028/8140 8162/8030/8142 +f 7331/7996/7312 8163/8031/8143 8164/8032/8144 +f 8163/8031/8143 8070/8033/8050 8164/8032/8144 +f 8164/8032/8144 8068/8034/8048 8096/7940/8074 +f 7369/8035/8145 8164/8032/8144 7281/7934/7264 +f 8165/8036/8146 8166/8037/8147 8168/8038/8148 +f 8166/8037/8147 7331/7996/7312 8134/7994/8114 +f 8168/8038/8148 8167/8039/8149 8134/7994/8114 +f 8169/8040/8150 8170/8041/8151 8172/8042/8152 +f 8170/8041/8151 8165/8043/8146 8171/8044/8153 +f 8171/8044/8153 8168/8045/8148 8129/7986/8109 +f 8172/8042/8152 8171/8044/8153 8128/7985/8108 +f 8144/8014/8126 8173/8046/8154 8147/8015/8127 +f 8173/8046/8154 8175/8047/8155 8174/8048/8156 +f 8174/8048/8156 8176/8049/8157 8172/8042/8152 +f 8147/8015/8127 8174/8048/8156 8128/7985/8108 +f 8144/8014/8126 8143/8010/8123 8177/8050/8158 +f 8143/8010/8123 8141/8008/8121 8178/8051/8159 +f 8177/8050/8158 8178/8051/8159 8179/8052/8160 +f 8173/8046/8154 8177/8050/8158 8180/8053/8161 +f 8141/8008/8121 8140/8006/8120 8181/8054/8162 +f 8140/8006/8120 8139/8004/8118 8182/8055/8163 +f 8181/8054/8162 8182/8055/8163 8183/8056/8164 +f 8178/8051/8159 8181/8054/8162 8184/8057/8165 +f 8179/8052/8160 8184/8057/8165 8185/8058/8166 +f 8184/8057/8165 8183/8056/8164 8187/8059/8167 +f 8185/8058/8166 8187/8059/8167 8188/8060/8168 +f 8186/8061/8169 8185/8058/8166 8189/8062/8170 +f 8162/8030/8142 8191/8063/8171 8160/8027/8139 +f 8191/8063/8171 8190/8064/8172 8192/8065/8173 +f 8192/8065/8173 8189/8062/8170 8193/8066/8174 +f 8160/8027/8139 8192/8065/8173 8157/8025/8137 +f 8190/8064/8172 8191/8063/8171 8195/8067/8175 +f 8191/8063/8171 8162/8030/8142 8194/8068/8176 +f 8194/8068/8176 8196/8069/8177 8198/8070/8178 +f 8195/8067/8175 8194/8068/8176 8199/8071/8179 +f 8175/8047/8155 8180/8053/8161 8200/8072/8180 +f 8180/8053/8161 8179/8052/8160 8186/8061/8169 +f 8200/8072/8180 8186/8061/8169 8190/8064/8172 +f 8201/8073/8181 8200/8072/8180 8195/8067/8175 +f 8199/8071/8179 8198/8070/8178 8203/8074/8182 +f 8198/8070/8178 8197/8075/8183 8202/8076/8184 +f 8202/8076/8184 8204/8077/8185 8206/8078/8186 +f 8203/8074/8182 8202/8076/8184 8207/8079/8187 +f 8175/8047/8155 8201/8073/8181 8176/8049/8157 +f 8201/8073/8181 8199/8071/8179 8208/8080/8188 +f 8208/8080/8188 8203/8074/8182 8209/8081/8189 +f 8176/8049/8157 8208/8080/8188 8169/8040/8150 +f 8210/8082/8190 8211/8083/8191 8212/8084/8192 +f 8211/8083/8191 8214/8085/8193 8212/8084/8192 +f 8212/8084/8192 8215/8086/8194 8206/8078/8186 +f 8213/8087/8195 8212/8084/8192 8205/8088/8196 +f 8169/8040/8150 8209/8081/8189 8216/8089/8197 +f 8209/8081/8189 8207/8079/8187 8216/8089/8197 +f 8216/8089/8197 8215/8086/8194 8214/8085/8193 +f 8170/8041/8151 8216/8089/8197 8217/8090/8198 +f 8165/8036/8146 8217/8091/8198 8218/8092/8199 +f 8217/8091/8198 8214/8093/8193 8211/8094/8191 +f 8218/8092/8199 8211/8094/8191 8219/8095/8200 +f 8166/8037/8147 8218/8092/8199 8219/8095/8200 +f 8205/8088/8196 8220/8096/8201 8213/8087/8195 +f 8220/8096/8201 8222/8097/8202 8221/8098/8203 +f 8221/8098/8203 8223/8099/8204 8224/8100/8205 +f 8213/8087/8195 8221/8098/8203 8225/8101/8206 +f 8070/7909/8050 8226/8102/8207 8071/7910/8051 +f 8226/8102/8207 8224/8100/8205 8227/8103/8208 +f 8227/8103/8208 8223/8099/8204 8228/8104/8209 +f 8071/7910/8051 8227/8103/8208 8056/7895/8036 +f 8210/8105/8190 8225/8106/8206 8229/8107/8210 +f 8225/8106/8206 8224/8108/8205 8226/8109/8207 +f 8229/8107/8210 8226/8109/8207 8070/8033/8050 +f 8219/8095/8200 8229/8107/8210 8163/8031/8143 +f 8197/8075/8183 8230/8110/8211 8204/8077/8185 +f 8230/8110/8211 8232/8111/8212 8231/8112/8213 +f 8231/8112/8213 8233/8113/8214 8220/8096/8201 +f 8204/8077/8185 8231/8112/8213 8205/8088/8196 +f 8162/8030/8142 8161/8029/8141 8196/8069/8177 +f 8161/8029/8141 8156/8024/8136 8234/8114/8215 +f 8234/8114/8215 8235/8115/8216 8230/8110/8211 +f 8196/8069/8177 8234/8114/8215 8197/8075/8183 +f 8156/8024/8136 8155/8116/8217 8235/8115/8216 +f 8155/8116/8217 8154/8023/8135 8236/8117/8218 +f 8236/8117/8218 8237/8118/8219 8238/8119/8220 +f 8235/8115/8216 8236/8117/8218 8232/8111/8212 +f 8074/7913/8054 8239/8120/8221 8240/8121/8222 +f 8239/8120/8221 8241/8122/8223 8242/8123/8224 +f 8240/8121/8222 8242/8123/8224 8109/7953/8087 +f 8075/7914/8055 8240/8121/8222 8107/7951/8085 +f 8152/8020/8132 8243/8124/8225 8153/8022/8134 +f 8243/8124/8225 8241/8122/8223 8244/8125/8226 +f 8244/8125/8226 8239/8120/8221 8245/8126/8227 +f 8153/8022/8134 8244/8125/8226 8245/8126/8227 +f 8060/7898/8039 8237/8118/8219 8246/8127/8228 +f 8237/8118/8219 8154/8023/8135 8245/8126/8227 +f 8246/8127/8228 8245/8126/8227 8074/7913/8054 +f 8061/7899/8040 8246/8127/8228 8072/7911/8052 +f 8232/8111/8212 8238/8119/8220 8233/8113/8214 +f 8238/8119/8220 8060/7898/8039 8247/8128/8229 +f 8247/8128/8229 8057/7896/8037 8228/8104/8209 +f 8233/8113/8214 8247/8128/8229 8222/8097/8202 +f 8114/8129/8095 8248/8130/8230 8117/8131/8096 +f 8248/8130/8230 8250/6534/8231 8249/8132/8232 +f 8249/8132/8232 8251/6546/8233 7453/6548/7431 +f 8117/8131/8096 8249/8132/8232 7456/7390/7436 +f 8252/6528/8234 8253/6530/8235 8254/8133/8236 +f 8253/6530/8235 8250/6534/8231 8248/8130/8230 +f 8254/8133/8236 8248/8130/8230 8114/8129/8095 +f 8255/8134/8237 8254/8133/8236 8113/8135/8092 +f 8256/6552/8238 8257/6553/8239 8258/8136/8240 +f 8257/6553/8239 8252/6528/8234 8255/8134/8237 +f 8258/8136/8240 8255/8134/8237 8105/8137/8090 +f 8259/8138/8241 8258/8136/8240 8104/8139/8082 +f 8109/8140/8087 8260/8141/8242 8110/8142/8088 +f 8260/8141/8242 8262/6495/8243 8261/8143/8244 +f 8261/8143/8244 8263/6549/8245 8259/8138/8241 +f 8110/8142/8088 8261/8143/8244 8103/8144/8080 +f 8241/8145/8223 8264/8146/8246 8265/8147/8247 +f 8264/8146/8246 8266/6490/8248 8267/6491/8249 +f 8265/8147/8247 8267/6491/8249 8260/8141/8242 +f 8242/8148/8224 8265/8147/8247 8260/8141/8242 +f 8152/8149/8132 8268/8150/8250 8269/8151/8251 +f 8268/8150/8250 8270/6489/8252 8271/6488/8253 +f 8269/8151/8251 8271/6488/8253 8266/6490/8248 +f 8243/8152/8225 8269/8151/8251 8264/8146/8246 +f 8148/8153/8129 8272/8154/8254 8273/8155/8255 +f 8272/8154/8254 8274/6679/8256 8275/6678/8257 +f 8273/8155/8255 8275/6678/8257 8270/6489/8252 +f 8149/8156/8130 8273/8155/8255 8268/8150/8250 +f 8157/8157/8137 8276/8158/8258 8277/8159/8259 +f 8276/8158/8258 8278/6668/8260 8279/6682/8261 +f 8277/8159/8259 8279/6682/8261 8274/6679/8256 +f 8158/8160/8138 8277/8159/8259 8272/8154/8254 +f 8280/6671/8262 8281/6669/8263 8283/8161/8264 +f 8281/6669/8263 8278/6668/8260 8282/8162/8265 +f 8282/8162/8265 8276/8158/8258 8193/8163/8174 +f 8283/8161/8264 8282/8162/8265 8188/8164/8168 +f 8183/8165/8164 8284/8166/8266 8285/8167/8267 +f 8284/8166/8266 8286/6663/8268 8287/6662/8269 +f 8285/8167/8267 8287/6662/8269 8280/6671/8262 +f 8187/8168/8167 8285/8167/8267 8283/8161/8264 +f 8139/8169/8118 8288/8170/8270 8289/8171/8271 +f 8288/8170/8270 8290/6634/8272 8291/6633/8273 +f 8289/8171/8271 8291/6633/8273 8286/6663/8268 +f 8182/8172/8163 8289/8171/8271 8284/8166/8266 +f 7501/7433/7481 8292/6637/8274 8293/8173/8275 +f 8292/6637/8274 8290/6634/8272 8293/8173/8275 +f 8293/8173/8275 8288/8170/8270 8138/8174/8117 +f 7502/7433/7482 8293/8173/8275 7339/8175/7319 +f 8294/2879/8276 8295/8176/8277 8296/8177/8278 +f 8295/8176/8277 8298/8178/8279 8296/8177/8278 +f 8297/8179/8280 8296/8177/8278 8300/8180/8281 +f 8301/8181/8282 8302/8182/8283 8303/8183/8284 +f 8302/8182/8283 8305/8184/8285 8306/8185/8286 +f 8303/8183/8284 8306/8185/8286 8300/8180/8281 +f 8304/8186/8287 8303/8183/8284 8307/8187/8288 +f 8294/2879/8276 8309/8188/8289 8311/2881/8290 +f 8309/8188/8289 8305/8184/8285 8312/8189/8291 +f 8311/2881/8290 8310/8190/8292 8312/8189/8291 +f 8294/2879/8276 8297/8179/8280 8313/8191/8293 +f 8297/8179/8280 8300/8180/8281 8306/8185/8286 +f 8309/8188/8289 8313/8191/8293 8305/8184/8285 +f 2856/2864/2833 8312/8189/8291 2857/2866/2835 +f 8312/8189/8291 8305/8184/8285 8314/8192/8294 +f 8314/8192/8294 8302/8182/8283 8315/8193/8295 +f 2857/2866/2835 8314/8192/8294 2858/2867/2836 +f 2858/2867/2836 8315/8193/8295 2859/2868/2837 +f 8315/8193/8295 8301/8181/8282 8304/8186/8287 +f 8316/8194/8296 8304/8186/8287 8308/8195/8297 +f 2859/2868/2837 8316/8194/8296 8317/8196/8298 +f 8318/8197/8299 8319/8198/8300 8321/8199/8301 +f 8319/8198/8300 8322/8200/8302 8323/8201/8303 +f 8320/8202/8304 8323/8201/8303 8325/8203/8305 +f 8321/8199/8301 8320/8202/8304 8326/8204/8306 +f 8327/8205/8307 8328/8206/8308 8330/8207/8309 +f 8328/8206/8308 8331/8208/8310 8329/8209/8311 +f 8329/8209/8311 8332/8210/8312 8334/8211/8313 +f 8330/8207/8309 8329/8209/8311 8335/8212/8314 +f 8336/8213/8315 8337/8214/8316 8338/8215/8317 +f 8337/8214/8316 8340/8216/8318 8338/8215/8317 +f 8338/8215/8317 8341/8217/8319 8324/8218/8320 +f 8339/8219/8321 8338/8215/8317 8322/8200/8302 +f 8308/8195/8297 8342/8220/8322 8343/8221/8323 +f 8342/8220/8322 8336/8213/8315 8339/8219/8321 +f 8343/8221/8323 8339/8219/8321 8345/8222/8324 +f 8344/8223/8325 8343/8221/8323 8346/8224/8326 +f 8347/8225/8327 8348/8226/8328 8350/8227/8329 +f 8348/8226/8328 8336/8213/8315 8349/8228/8330 +f 8349/8228/8330 8342/8220/8322 8307/8187/8288 +f 8350/8227/8329 8349/8228/8330 8307/8187/8288 +f 8351/8229/8331 8352/8230/8332 8353/8231/8333 +f 8352/8230/8332 8340/8216/8318 8337/8214/8316 +f 8353/8231/8333 8337/8214/8316 8348/8226/8328 +f 8354/8232/8334 8353/8231/8333 8347/8225/8327 +f 8340/8216/8318 8352/8230/8332 8355/8233/8335 +f 8352/8230/8332 8351/8229/8331 8356/8234/8336 +f 8355/8233/8335 8356/8234/8336 8357/8235/8337 +f 8341/8217/8319 8355/8233/8335 8358/8236/8338 +f 8351/8229/8331 8359/8237/8339 8360/8238/8340 +f 8359/8237/8339 8361/8239/8341 8362/8240/8342 +f 8360/8238/8340 8362/8240/8342 8363/8241/8343 +f 8356/8234/8336 8360/8238/8340 8364/8242/8344 +f 8357/8235/8337 8364/8242/8344 8365/8243/8345 +f 8364/8242/8344 8363/8241/8343 8367/8244/8346 +f 8365/8243/8345 8367/8244/8346 8327/8205/8307 +f 8366/8245/8347 8365/8243/8345 8330/8207/8309 +f 8324/8218/8320 8358/8236/8338 8368/8246/8348 +f 8358/8236/8338 8357/8235/8337 8366/8245/8347 +f 8368/8246/8348 8366/8245/8347 8335/8212/8314 +f 8325/8203/8305 8368/8246/8348 8369/8247/8349 +f 8370/8248/8350 8371/8249/8351 8372/8250/8352 +f 8371/8249/8351 8374/8251/8353 8372/8250/8352 +f 8372/8250/8352 8375/8252/8354 8376/8253/8355 +f 8373/8254/8356 8372/8250/8352 8378/8255/8357 +f 8379/8256/8358 8380/8257/8359 8382/8258/8360 +f 8380/8257/8359 8370/8248/8350 8373/8254/8356 +f 8381/8259/8361 8373/8254/8356 8383/8260/8362 +f 8382/8258/8360 8381/8259/8361 8384/8261/8363 +f 8374/8251/8353 8371/8249/8351 8385/8262/8364 +f 8371/8249/8351 8370/8248/8350 8380/8257/8359 +f 8385/8262/8364 8380/8257/8359 8379/8256/8358 +f 8386/8263/8365 8385/8262/8364 8387/8264/8366 +f 8389/2933/8367 8390/8265/8368 8392/2900/8369 +f 8390/8265/8368 8388/8266/8370 8391/8267/8371 +f 8391/8267/8371 8387/8264/8366 8393/8268/8372 +f 8392/2900/8369 8391/8267/8371 8394/2898/8373 +f 2766/2869/2838 8317/8196/8298 8395/8269/8374 +f 8317/8196/8298 8308/8195/8297 8344/8223/8325 +f 8395/8269/8374 8344/8223/8325 8396/8270/8375 +f 2824/2836/2805 8395/8269/8374 8396/8270/8375 +f 8397/8271/8376 8398/8272/8377 8399/8273/8378 +f 8398/8272/8377 8346/8224/8326 8345/8222/8324 +f 8399/8273/8378 8345/8222/8324 8322/8200/8302 +f 8400/8274/8379 8399/8273/8378 8319/8198/8300 +f 8346/8224/8326 8398/8272/8377 8396/8270/8375 +f 8398/8272/8377 8397/8271/8376 8401/8275/8380 +f 8401/8275/8380 8402/8276/8381 2820/2831/2800 +f 8396/8270/8375 8401/8275/8380 2822/2834/2803 +f 8388/8266/8370 8390/8265/8368 8403/8277/8382 +f 8390/8265/8368 8389/2933/8367 8405/2932/8383 +f 8403/8277/8382 8405/2932/8383 8406/2825/8384 +f 8404/8278/8385 8403/8277/8382 8407/2827/8386 +f 8397/8271/8376 8408/8279/8387 8409/8280/8388 +f 8408/8279/8387 8374/8251/8353 8409/8280/8388 +f 8409/8280/8388 8386/8263/8365 8404/8278/8385 +f 8402/8276/8381 8409/8280/8388 2818/2829/2798 +f 8374/8251/8353 8408/8279/8387 8410/8281/8389 +f 8408/8279/8387 8397/8271/8376 8400/8274/8379 +f 8410/8281/8389 8400/8274/8379 8318/8197/8299 +f 8375/8252/8354 8410/8281/8389 8411/8282/8390 +f 8376/8253/8355 8411/8282/8390 8412/8283/8391 +f 8411/8282/8390 8318/8197/8299 8321/8199/8301 +f 8412/8283/8391 8321/8199/8301 8414/8284/8392 +f 8413/8285/8393 8412/8283/8391 8415/8286/8394 +f 8333/8287/8395 8416/8288/8396 8417/8289/8397 +f 8416/8288/8396 8415/8286/8394 8414/8284/8392 +f 8417/8289/8397 8414/8284/8392 8326/8204/8306 +f 8334/8211/8313 8417/8289/8397 8369/8247/8349 +f 8378/8255/8357 8377/8290/8398 8418/8291/8399 +f 8377/8290/8398 8376/8253/8355 8413/8285/8393 +f 8418/8291/8399 8413/8285/8393 8415/8286/8394 +f 8419/8292/8400 8418/8291/8399 8416/8288/8396 +f 8331/8208/8310 8420/8293/8401 8332/8210/8312 +f 8420/8293/8401 8384/8261/8363 8421/8294/8402 +f 8421/8294/8402 8383/8260/8362 8419/8292/8400 +f 8332/8210/8312 8421/8294/8402 8333/8287/8395 +f 8384/8261/8363 8420/8293/8401 8423/8295/8403 +f 8420/8293/8401 8331/8208/8310 8422/8296/8404 +f 8422/8296/8404 8328/8206/8308 8327/8205/8307 +f 8423/8295/8403 8422/8296/8404 8425/8297/8405 +f 8363/8241/8343 8426/8298/8406 8427/8299/8407 +f 8426/8298/8406 8428/8300/8408 8429/8301/8409 +f 8427/8299/8407 8429/8301/8409 8424/8302/8410 +f 8367/8244/8346 8427/8299/8407 8424/8302/8410 +f 8430/8303/8411 8431/8304/8412 8433/8305/8413 +f 8431/8304/8412 8298/8178/8279 8295/8176/8277 +f 8294/2879/8276 8434/2911/8414 8432/8306/8415 +f 8433/8305/8413 8432/8306/8415 8434/2911/8414 +f 8436/8307/8416 8437/8308/8417 8438/8309/8418 +f 8437/8308/8417 8440/2920/8419 8441/2925/8420 +f 8438/8309/8418 8441/2925/8420 8393/8268/8372 +f 8439/8310/8421 8438/8309/8418 8393/8268/8372 +f 8379/8256/8358 8382/8258/8360 8439/8310/8421 +f 8382/8258/8360 8384/8261/8363 8442/8311/8422 +f 8442/8311/8422 8423/8295/8403 8443/8312/8423 +f 8439/8310/8421 8442/8311/8422 8443/8312/8423 +f 8425/8297/8405 8429/8301/8409 8444/8313/8424 +f 8429/8301/8409 8428/8300/8408 8445/8314/8425 +f 8444/8313/8424 8445/8314/8425 8446/8315/8426 +f 8443/8312/8423 8444/8313/8424 8436/8307/8416 +f 8363/8241/8343 8362/8240/8342 8426/8298/8406 +f 8362/8240/8342 8361/8239/8341 8447/8316/8427 +f 8447/8316/8427 8448/8317/8428 8450/8318/8429 +f 8426/8298/8406 8447/8316/8427 8428/8300/8408 +f 8449/8319/8430 8448/8317/8428 8452/8320/8431 +f 8448/8317/8428 8361/8239/8341 8451/8321/8432 +f 8451/8321/8432 8359/8237/8339 8354/8232/8334 +f 8452/8320/8431 8451/8321/8432 8354/8232/8334 +f 8298/8178/8279 8453/8322/8433 8299/8323/8434 +f 8453/8322/8433 8449/8319/8430 8454/8324/8435 +f 8454/8324/8435 8452/8320/8431 8350/8227/8329 +f 8299/8323/8434 8454/8324/8435 8300/8180/8281 +f 8428/8300/8408 8450/8318/8429 8445/8314/8425 +f 8450/8318/8429 8449/8319/8430 8455/8325/8436 +f 8455/8325/8436 8453/8322/8433 8431/8304/8412 +f 8445/8314/8425 8455/8325/8436 8430/8303/8411 +f 8436/8307/8416 8446/8315/8426 8437/8308/8417 +f 8446/8315/8426 8430/8303/8411 8456/8326/8437 +f 8456/8326/8437 8433/8305/8413 8435/2909/8438 +f 8437/8308/8417 8456/8326/8437 8457/2922/8439 +f 8458/8327/8440 8459/8328/8441 8460/8329/8442 +f 8459/8328/8441 3871/3873/3842 8462/8330/8443 +f 8461/8331/8444 8460/8329/8442 8462/8330/8443 +f 8463/8332/8445 8464/8333/8446 8466/8334/8447 +f 8464/8333/8446 8467/8335/8448 8465/8336/8449 +f 8465/8336/8449 8468/8337/8450 8469/8338/8451 +f 8466/8334/8447 8465/8336/8449 8470/8339/8452 +f 8467/8335/8448 8472/8340/8453 8473/8341/8454 +f 8472/8340/8453 3871/3873/3842 3869/3872/3841 +f 8474/8342/8455 8473/8341/8454 3860/3862/3831 +f 8463/8332/8445 8462/8330/8443 8475/8343/8456 +f 8462/8330/8443 3871/3873/3842 8472/8340/8453 +f 8464/8333/8446 8475/8343/8456 8467/8335/8448 +f 8469/8338/8451 8468/8337/8450 8476/8344/8457 +f 8468/8337/8450 8467/8335/8448 8474/8342/8455 +f 8476/8344/8457 8474/8342/8455 3860/3862/3831 +f 8477/8345/8458 8476/8344/8457 3857/3860/3829 +f 8471/8346/8459 8470/8339/8452 8479/8347/8460 +f 8470/8339/8452 8469/8338/8451 8478/8348/8461 +f 8478/8348/8461 8477/8345/8458 3859/3861/3830 +f 8479/8347/8460 8478/8348/8461 3770/3835/3804 +f 8480/8349/8462 8481/8350/8463 8482/8351/8464 +f 8481/8350/8463 8484/8352/8465 8482/8351/8464 +f 8482/8351/8464 8485/8353/8466 8487/8354/8467 +f 8483/8355/8468 8482/8351/8464 8487/8354/8467 +f 8489/8356/8469 8490/8357/8470 8491/8358/8471 +f 8490/8357/8470 8493/8359/8472 8494/8360/8473 +f 8491/8358/8471 8494/8360/8473 8495/8361/8474 +f 8492/8362/8475 8491/8358/8471 8496/8363/8476 +f 8480/8349/8462 8498/8364/8477 8481/8350/8463 +f 8498/8364/8477 8500/8365/8478 8501/8366/8479 +f 8499/8367/8480 8501/8366/8479 8503/8368/8481 +f 8481/8350/8463 8499/8367/8480 8503/8368/8481 +f 8484/8352/8465 8503/8368/8481 8505/8369/8482 +f 8503/8368/8481 8502/8370/8483 8504/8371/8484 +f 8504/8371/8484 8506/8372/8485 8507/8373/8486 +f 8505/8369/8482 8504/8371/8484 8507/8373/8486 +f 8471/8346/8459 8506/8372/8485 8509/8374/8487 +f 8506/8372/8485 8502/8370/8483 8510/8375/8488 +f 8509/8374/8487 8510/8375/8488 8511/8376/8489 +f 8466/8334/8447 8509/8374/8487 8463/8332/8445 +f 8502/8370/8483 8501/8366/8479 8513/8377/8490 +f 8501/8366/8479 8500/8365/8478 8513/8377/8490 +f 8513/8377/8490 8514/8378/8491 8516/8379/8492 +f 8510/8375/8488 8513/8377/8490 8516/8379/8492 +f 8517/8380/8493 8518/8381/8494 8520/8382/8495 +f 8518/8381/8494 8515/8383/8496 8519/8384/8497 +f 8519/8384/8497 8514/8378/8491 8500/8365/8478 +f 8520/8382/8495 8519/8384/8497 8480/8349/8462 +f 8521/8385/8498 8522/8386/8499 8524/8387/8500 +f 8522/8386/8499 8525/8388/8501 8523/8389/8502 +f 8523/8389/8502 8526/8390/8503 8518/8381/8494 +f 8524/8387/8500 8523/8389/8502 8517/8380/8493 +f 8495/8361/8474 8527/8391/8504 8496/8363/8476 +f 8527/8391/8504 8521/8385/8498 8528/8392/8505 +f 8528/8392/8505 8524/8387/8500 8529/8393/8506 +f 8496/8363/8476 8528/8392/8505 8497/8394/8507 +f 8497/8394/8507 8529/8393/8506 8531/8395/8508 +f 8529/8393/8506 8517/8380/8493 8530/8396/8509 +f 8530/8396/8509 8520/8382/8495 8483/8355/8468 +f 8531/8395/8508 8530/8396/8509 8488/8397/8510 +f 8532/8398/8511 8533/8399/8512 8535/8400/8513 +f 8533/8399/8512 8536/8401/8514 8537/8402/8515 +f 8534/8403/8516 8537/8402/8515 8538/8404/8517 +f 8535/8400/8513 8534/8403/8516 8539/8405/8518 +f 8540/8406/8519 8539/8405/8518 8541/8407/8520 +f 8539/8405/8518 8538/8404/8517 8543/8408/8521 +f 8541/8407/8520 8543/8408/8521 8544/8409/8522 +f 8542/8410/8523 8541/8407/8520 8545/8411/8524 +f 8544/8409/8522 8543/8408/8521 8548/8412/8525 +f 8543/8408/8521 8538/8404/8517 8547/8413/8526 +f 8547/8413/8526 8537/8402/8515 8536/8401/8514 +f 8548/8412/8525 8547/8413/8526 8550/8414/8527 +f 8544/8409/8522 8548/8412/8525 8551/8415/8528 +f 8548/8412/8525 8550/8414/8527 8553/8416/8529 +f 8551/8415/8528 8553/8416/8529 3899/8417/8530 +f 8552/8418/8531 8551/8415/8528 3898/3902/3871 +f 8508/8419/8532 8507/8373/8486 8555/8420/8533 +f 8507/8373/8486 8471/8346/8459 8554/8421/8534 +f 8554/8421/8534 8479/8347/8460 3828/3834/3803 +f 8555/8420/8533 8554/8421/8534 3826/8422/8535 +f 8484/8352/8465 8505/8369/8482 8485/8353/8466 +f 8505/8369/8482 8508/8419/8532 8556/8423/8536 +f 8556/8423/8536 8557/8424/8537 8559/8425/8538 +f 8485/8353/8466 8556/8423/8536 8559/8425/8538 +f 3822/3829/3798 8560/8426/8539 8561/8427/8540 +f 8560/8426/8539 8558/8428/8541 8561/8427/8540 +f 8561/8427/8540 8557/8424/8537 8508/8419/8532 +f 3825/3831/3800 8561/8427/8540 8555/8420/8533 +f 3820/3925/3894 3926/3929/3898 3821/3827/3796 +f 3926/3929/3898 3899/8417/8530 8553/8416/8529 +f 8562/8429/8542 8553/8416/8529 8550/8414/8527 +f 3821/3827/3796 8562/8429/8542 3822/3829/3798 +f 8550/8414/8527 8549/8430/8543 8564/8431/8544 +f 8549/8430/8543 8536/8401/8514 8564/8431/8544 +f 8564/8431/8544 8565/8432/8545 8560/8426/8539 +f 8563/8433/8546 8564/8431/8544 8560/8426/8539 +f 8486/8434/8547 8559/8425/8538 8567/8435/8548 +f 8559/8425/8538 8558/8428/8541 8566/8436/8549 +f 8566/8436/8549 8565/8432/8545 8533/8399/8512 +f 8567/8435/8548 8566/8436/8549 8532/8398/8511 +f 8488/8397/8510 8487/8354/8467 8568/8437/8550 +f 8487/8354/8467 8486/8434/8547 8568/8437/8550 +f 8568/8437/8550 8567/8435/8548 8532/8398/8511 +f 8569/8438/8551 8568/8437/8550 8570/8439/8552 +f 8488/8397/8510 8569/8438/8551 8531/8395/8508 +f 8569/8438/8551 8571/8440/8553 8572/8441/8554 +f 8572/8441/8554 8573/8442/8555 8492/8362/8475 +f 8531/8395/8508 8572/8441/8554 8497/8394/8507 +f 8571/8440/8553 8570/8439/8552 8573/8442/8555 +f 8570/8439/8552 8532/8398/8511 8574/8443/8556 +f 8574/8443/8556 8535/8400/8513 8540/8406/8519 +f 8573/8442/8555 8574/8443/8556 8489/8356/8469 +f 8540/8406/8519 8542/8410/8523 8575/8444/8557 +f 8542/8410/8523 8546/8445/8558 8576/8446/8559 +f 8576/8446/8559 8577/8447/8560 8490/8357/8470 +f 8575/8444/8557 8576/8446/8559 8490/8357/8470 +f 8495/8361/8474 8494/8360/8473 8579/8448/8561 +f 8494/8360/8473 8493/8359/8472 8578/8449/8562 +f 8578/8449/8562 8577/8447/8560 8580/8450/8563 +f 8579/8448/8561 8578/8449/8562 8581/8451/8564 +f 8581/8451/8564 8582/8452/8565 8579/8448/8561 +f 8582/8452/8565 8584/8453/8566 8583/8454/8567 +f 8583/8454/8567 8585/8455/8568 8527/8391/8504 +f 8579/8448/8561 8583/8454/8567 8495/8361/8474 +f 3871/3873/3842 8459/8328/8441 8586/8456/8569 +f 8459/8328/8441 8458/8327/8440 8587/8457/8570 +f 8586/8456/8569 8587/8457/8570 8588/8458/8571 +f 3900/3903/3872 8586/8456/8569 8589/8459/8572 +f 3897/3900/3869 3920/3924/3893 8552/8418/8531 +f 3920/3924/3893 3916/3918/3887 8590/8460/8573 +f 8590/8460/8573 8591/8461/8574 8592/8462/8575 +f 8552/8418/8531 8590/8460/8573 8593/8463/8576 +f 8581/8451/8564 8580/8450/8563 8595/8464/8577 +f 8580/8450/8563 8546/8445/8558 8594/8465/8578 +f 8594/8465/8578 8545/8411/8524 8593/8463/8576 +f 8595/8464/8577 8594/8465/8578 8592/8462/8575 +f 8588/8458/8571 8596/8466/8579 8597/8467/8580 +f 8596/8466/8579 8584/8453/8566 8582/8452/8565 +f 8597/8467/8580 8582/8452/8565 8581/8451/8564 +f 8598/8468/8581 8597/8467/8580 8595/8464/8577 +f 8599/8469/8582 8600/8470/8583 8602/8471/8584 +f 8600/8470/8583 8525/8388/8501 8522/8386/8499 +f 8601/8472/8585 8522/8386/8499 8521/8385/8498 +f 8602/8471/8584 8601/8472/8585 8585/8455/8568 +f 8515/8383/8496 8526/8390/8503 8603/8473/8586 +f 8526/8390/8503 8525/8388/8501 8600/8470/8583 +f 8603/8473/8586 8600/8470/8583 8599/8469/8582 +f 8516/8379/8492 8603/8473/8586 8604/8474/8587 +f 8511/8376/8489 8604/8474/8587 8605/8475/8588 +f 8604/8474/8587 8599/8469/8582 8606/8476/8589 +f 8605/8475/8588 8606/8476/8589 8458/8327/8440 +f 8512/8477/8590 8605/8475/8588 8461/8331/8444 +f 8458/8327/8440 8606/8476/8589 8587/8457/8570 +f 8606/8476/8589 8599/8469/8582 8607/8478/8591 +f 8607/8478/8591 8602/8471/8584 8584/8453/8566 +f 8587/8457/8570 8607/8478/8591 8588/8458/8571 +f 3902/3904/3873 8589/8459/8572 8608/8479/8592 +f 8589/8459/8572 8588/8458/8571 8598/8468/8581 +f 8608/8479/8592 8598/8468/8581 8591/8461/8574 +f 3914/3917/3886 8608/8479/8592 8591/8461/8574 +f 8609/8480/8593 8610/8481/8594 8612/8482/8595 +f 8610/8481/8594 8613/8483/8596 8611/8484/8597 +f 8611/8484/8597 8614/8485/8598 8615/8486/8599 +f 8612/8482/8595 8611/8484/8597 8616/8487/8600 +f 8615/8486/8599 8618/8488/8601 8616/8487/8600 +f 8618/8488/8601 8620/8489/8602 8619/8490/8603 +f 8619/8490/8603 8621/8491/8604 8623/8492/8605 +f 8616/8487/8600 8619/8490/8603 8617/8493/8606 +f 8624/8494/8607 8625/8495/8608 8626/8496/8609 +f 8625/8495/8608 8628/6236/8610 8626/8496/8609 +f 8626/8496/8609 8629/6240/8611 8630/8497/8612 +f 8627/8498/8613 8626/8496/8609 8631/8499/8614 +f 8620/8489/8602 8632/8500/8615 8621/8491/8604 +f 8632/8500/8615 8624/8494/8607 8633/8501/8616 +f 8633/8501/8616 8627/8498/8613 8634/8502/8617 +f 8621/8491/8604 8633/8501/8616 8622/8503/8618 +f 8624/8494/8607 8635/8504/8619 8636/8505/8620 +f 8635/8504/8619 8637/6932/8621 8638/6974/8622 +f 8636/8505/8620 8638/6974/8622 8639/6242/8623 +f 8625/8495/8608 8636/8505/8620 8628/6236/8610 +f 8620/8489/8602 8641/8506/8624 8632/8500/8615 +f 8641/8506/8624 8643/6935/8625 8642/8507/8626 +f 8642/8507/8626 8644/6934/8627 8635/8504/8619 +f 8632/8500/8615 8642/8507/8626 8624/8494/8607 +f 8615/8486/8599 8645/8508/8628 8618/8488/8601 +f 8645/8508/8628 8647/7030/8629 8648/7029/8630 +f 8646/8509/8631 8648/7029/8630 8643/6935/8625 +f 8618/8488/8601 8646/8509/8631 8620/8489/8602 +f 8613/8483/8596 8649/8510/8632 8650/8511/8633 +f 8649/8510/8632 8651/7020/8634 8652/7025/8635 +f 8650/8511/8633 8652/7025/8635 8647/7030/8629 +f 8614/8485/8598 8650/8511/8633 8615/8486/8599 +f 8653/8512/8636 8654/6258/8637 8655/8513/8638 +f 8654/6258/8637 8657/6256/8639 8658/6978/8640 +f 8655/8513/8638 8658/6978/8640 8660/8514/8641 +f 8656/8515/8642 8655/8513/8638 8660/8514/8641 +f 8662/8516/8643 8663/8517/8644 8664/8518/8645 +f 8663/8517/8644 8661/8519/8646 8664/8518/8645 +f 8664/8518/8645 8660/8514/8641 8659/7053/8647 +f 8665/8520/8648 8664/8518/8645 8666/7052/8649 +f 8662/8516/8643 8665/8520/8648 8669/8521/8650 +f 8665/8520/8648 8667/7013/8651 8668/8522/8652 +f 8668/8522/8652 8670/7019/8653 8649/8510/8632 +f 8669/8521/8650 8668/8522/8652 8613/8483/8596 +f 8609/8480/8593 8671/8523/8654 8610/8481/8594 +f 8671/8523/8654 8673/8524/8655 8672/8525/8656 +f 8672/8525/8656 8674/8526/8657 8669/8521/8650 +f 8610/8481/8594 8672/8525/8656 8613/8483/8596 +f 4357/4421/4391 4356/4369/4339 8675/8527/8658 +f 4356/4369/4339 4355/4367/4337 8675/8527/8658 +f 8675/8527/8658 8677/6262/8659 8656/8515/8642 +f 8676/8528/8660 8675/8527/8658 8661/8519/8646 +f 8673/8524/8655 8678/8529/8661 8674/8526/8657 +f 8678/8529/8661 4357/4421/4391 8679/8530/8662 +f 8679/8530/8662 8676/8528/8660 8663/8517/8644 +f 8674/8526/8657 8679/8530/8662 8662/8516/8643 +f 4418/4430/4400 4416/4428/4398 8681/8531/8663 +f 4416/4428/4398 4412/4423/4393 8680/8532/8664 +f 8680/8532/8664 8682/8533/8665 8671/8523/8654 +f 8671/8523/8654 8609/8480/8593 8680/8532/8664 +f 4412/4423/4393 4415/4425/4395 8683/8534/8666 +f 4415/4425/4395 4357/4421/4391 8683/8534/8666 +f 8682/8533/8665 8683/8534/8666 8678/8529/8661 +f 4422/4435/4405 4420/4433/4403 8684/8535/8667 +f 4420/4433/4403 4418/4430/4400 8681/8531/8663 +f 8609/8480/8593 8612/8482/8595 8684/8535/8667 +f 8685/8536/8668 8684/8535/8667 8617/8493/8606 +f 4426/4438/4408 4424/4437/4407 8686/8537/8669 +f 4424/4437/4407 4422/4435/4405 8685/8536/8668 +f 8686/8537/8669 8685/8536/8668 8623/8492/8605 +f 8687/8538/8670 8686/8537/8669 8623/8492/8605 +f 4428/4441/4411 4431/4444/4414 8689/8539/8671 +f 4431/4444/4414 4426/4438/4408 8688/8540/8672 +f 8688/8540/8672 8687/8538/8670 8634/8502/8617 +f 8689/8539/8671 8688/8540/8672 8631/8499/8614 +f 4347/4360/4330 4432/4445/4415 8630/8497/8612 +f 4432/4445/4415 4428/4441/4411 8690/8541/8673 +f 8630/8497/8612 8690/8541/8673 8689/8539/8671 +f 8691/8542/8674 8692/8543/8675 8694/8544/8676 +f 8692/8543/8675 8695/8545/8677 8693/8546/8678 +f 8693/8546/8678 8696/8547/8679 8697/8548/8680 +f 8694/8544/8676 8693/8546/8678 8698/8549/8681 +f 8700/8550/8682 8701/8551/8683 8703/8552/8684 +f 8701/8551/8683 8704/8553/8685 8705/8554/8686 +f 8702/8555/8687 8705/8554/8686 8691/8542/8674 +f 8703/8552/8684 8702/8555/8687 8699/8556/8688 +f 5106/5117/5088 8706/6378/8689 8707/8557/8690 +f 8706/6378/8689 8709/6377/8691 8710/8558/8692 +f 8707/8557/8690 8710/8558/8692 8712/8559/8693 +f 8708/8560/8694 8707/8557/8690 8712/8559/8693 +f 8713/8561/8695 8712/8559/8693 8714/8562/8696 +f 8712/8559/8693 8711/8563/8697 8714/8562/8696 +f 8714/8562/8696 8716/8564/8698 8704/8553/8685 +f 8715/8565/8699 8714/8562/8696 8700/8550/8682 +f 8717/6382/8700 8718/7713/8701 8720/8566/8702 +f 8718/7713/8701 8721/7672/8703 8719/8567/8704 +f 8719/8567/8704 8722/8568/8705 8710/8558/8692 +f 8720/8566/8702 8719/8567/8704 8709/6377/8691 +f 8721/7672/8703 8723/7670/8706 8722/8568/8705 +f 8723/7670/8706 8725/7669/8707 8724/8569/8708 +f 8724/8569/8708 8726/8570/8709 8704/8553/8685 +f 8722/8568/8705 8724/8569/8708 8711/8563/8697 +f 8725/7669/8707 8727/7772/8710 8726/8570/8709 +f 8727/7772/8710 8729/7771/8711 8728/8571/8712 +f 8728/8571/8712 8730/8572/8713 8705/8554/8686 +f 8726/8570/8709 8728/8571/8712 8705/8554/8686 +f 8729/7771/8711 8731/7770/8714 8732/8573/8715 +f 8731/7770/8714 8733/7768/8716 8734/8574/8717 +f 8732/8573/8715 8734/8574/8717 8695/8545/8677 +f 8730/8572/8713 8732/8573/8715 8692/8543/8675 +f 8735/7720/8718 8736/7719/8719 8738/8575/8720 +f 8736/7719/8719 8739/6394/8721 8737/8576/8722 +f 8737/8576/8722 8740/6392/8723 8742/8577/8724 +f 8738/8575/8720 8737/8576/8722 8743/8578/8725 +f 8735/7720/8718 8738/8575/8720 8745/7796/8726 +f 8738/8575/8720 8743/8578/8725 8746/8579/8727 +f 8744/8580/8728 8746/8579/8727 8748/8581/8729 +f 8745/7796/8726 8744/8580/8728 8749/7762/8730 +f 8733/7768/8716 8750/7764/8731 8751/8582/8732 +f 8750/7764/8731 8749/7762/8730 8748/8581/8729 +f 8751/8582/8732 8748/8581/8729 8747/8583/8733 +f 8734/8574/8717 8751/8582/8732 8752/8584/8734 +f 8747/8583/8733 8753/8585/8735 8752/8584/8734 +f 8753/8585/8735 8755/8586/8736 8756/8587/8737 +f 8754/8588/8738 8756/8587/8737 8697/8548/8680 +f 8752/8584/8734 8754/8588/8738 8695/8545/8677 +f 8741/6391/8739 8757/6399/8740 8758/8589/8741 +f 8757/6399/8740 6383/5123/8742 5115/5129/5100 +f 8758/8589/8741 5115/5129/5100 8759/8590/8743 +f 8742/8577/8724 8758/8589/8741 8759/8590/8743 +f 8743/8578/8725 8759/8590/8743 8760/8591/8744 +f 8759/8590/8743 5120/5182/5153 8761/8592/8745 +f 8760/8591/8744 8761/8592/8745 8755/8586/8736 +f 8746/8579/8727 8760/8591/8744 8753/8585/8735 +f 8755/8586/8736 8762/8593/8746 8763/8594/8747 +f 8762/8593/8746 5177/5188/5159 8763/8594/8747 +f 8763/8594/8747 5182/5194/5165 5181/5192/5163 +f 8756/8587/8737 8763/8594/8747 8764/8595/8748 +f 5120/5182/5153 5178/5190/5161 8765/8596/8749 +f 5178/5190/5161 5177/5188/5159 8762/8593/8746 +f 8761/8592/8745 8765/8596/8749 8755/8586/8736 +f 8697/8548/8680 8764/8595/8748 8698/8549/8681 +f 8764/8595/8748 5181/5192/5163 8766/8597/8750 +f 8766/8597/8750 5186/5198/5169 8767/8598/8751 +f 8698/8549/8681 8766/8597/8750 8699/8556/8688 +f 8699/8556/8688 8767/8598/8751 8703/8552/8684 +f 8767/8598/8751 5185/5197/5168 8768/8599/8752 +f 8768/8599/8752 5190/5202/5173 8769/8600/8753 +f 8703/8552/8684 8768/8599/8752 8700/8550/8682 +f 8700/8550/8682 8769/8600/8753 8715/8565/8699 +f 8769/8600/8753 5189/5200/5171 8770/8601/8754 +f 8770/8601/8754 5194/5206/5177 8771/8602/8755 +f 8715/8565/8699 8770/8601/8754 8771/8602/8755 +f 5193/5205/5176 5195/5207/5178 8771/8602/8755 +f 5195/5207/5178 5106/5117/5088 8772/8603/8756 +f 8771/8602/8755 8772/8603/8756 8713/8561/8695 +f 8773/8604/8757 8774/8605/8758 8776/8606/8759 +f 8774/8605/8758 8777/8607/8760 8775/8608/8761 +f 8775/8608/8761 8778/8609/8762 4490/4502/4472 +f 8776/8606/8759 8775/8608/8761 4489/4501/4471 +f 4485/4496/4466 8778/8609/8762 4486/4497/4467 +f 8778/8609/8762 8777/8607/8760 8780/8610/8763 +f 8779/8611/8764 8780/8610/8763 8781/8612/8765 +f 4486/4497/4467 8779/8611/8764 8782/8613/8766 +f 4680/4688/4659 4690/4699/4670 8784/8614/8767 +f 4690/4699/4670 4674/4682/4653 8783/8615/8768 +f 8783/8615/8768 4672/4680/4651 8785/8616/8769 +f 8784/8614/8767 8783/8615/8768 8786/8617/8770 +f 4592/4600/4570 4591/4599/4569 8788/8618/8771 +f 4591/4599/4569 4587/4598/4568 8787/8619/8772 +f 8787/8619/8772 8789/8620/8773 8791/8621/8774 +f 8788/8618/8771 8787/8619/8772 8792/8622/8775 +f 8790/8623/8776 8789/8620/8773 8793/8624/8777 +f 8789/8620/8773 4587/4598/4568 4586/4594/4564 +f 8793/8624/8777 4586/4594/4564 8782/8613/8766 +f 8794/8625/8778 8793/8624/8777 8781/8612/8765 +f 8795/8626/8779 8796/8627/8780 8798/8628/8781 +f 8796/8627/8780 8773/8604/8757 8797/8629/8782 +f 8797/8629/8782 8776/8606/8759 4516/4525/4495 +f 8798/8628/8781 8797/8629/8782 4516/4525/4495 +f 8799/8630/8783 8800/8631/8784 8801/8632/8785 +f 8800/8631/8784 8795/8626/8779 8801/8632/8785 +f 8801/8632/8785 8798/8628/8781 4515/4524/4494 +f 8802/8633/8786 8801/8632/8785 4517/4527/4497 +f 8803/8634/8787 8804/8635/8788 8806/8636/8789 +f 8804/8635/8788 4666/4673/4644 8805/8637/8790 +f 8805/8637/8790 4664/4672/4643 8788/8618/8771 +f 8806/8636/8789 8805/8637/8790 8788/8618/8771 +f 4670/4678/4649 4668/4676/4647 8807/8638/8791 +f 4668/4676/4647 4666/4673/4644 8804/8635/8788 +f 8807/8638/8791 8804/8635/8788 8803/8634/8787 +f 8785/8616/8769 8807/8638/8791 8808/8639/8792 +f 8786/8617/8770 8809/8640/8793 8810/8641/8794 +f 8809/8640/8793 8799/8630/8783 8802/8633/8786 +f 8810/8641/8794 8802/8633/8786 4681/4689/4660 +f 8784/8614/8767 8810/8641/8794 4680/4688/4659 +f 8811/8642/8795 8812/8643/8796 8814/8644/8797 +f 8812/8643/8796 8815/8645/8798 8816/8646/8799 +f 8813/8647/8800 8816/8646/8799 8817/8648/8801 +f 8814/8644/8797 8813/8647/8800 8819/8649/8802 +f 8820/8650/8803 8821/8651/8804 8822/8652/8805 +f 8821/8651/8804 8824/8653/8806 8825/8654/8807 +f 8822/8652/8805 8825/8654/8807 8826/8655/8808 +f 8823/8656/8809 8822/8652/8805 8827/8657/8810 +f 8829/8658/8811 8830/8659/8812 8831/8660/8813 +f 8830/8659/8812 8833/8661/8814 8834/8662/8815 +f 8831/8660/8813 8834/8662/8815 8835/8663/8816 +f 8832/8664/8817 8831/8660/8813 8836/8665/8818 +f 8835/8663/8816 8834/8662/8815 8839/8666/8819 +f 8834/8662/8815 8833/8661/8814 8838/8667/8820 +f 8838/8667/8820 8840/8668/8821 8824/8653/8806 +f 8839/8666/8819 8838/8667/8820 8821/8651/8804 +f 8817/8648/8801 8816/8646/8799 8842/8669/8822 +f 8816/8646/8799 8815/8645/8798 8841/8670/8823 +f 8841/8670/8823 8843/8671/8824 8845/8672/8825 +f 8842/8669/8822 8841/8670/8823 8846/8673/8826 +f 8844/8674/8827 8847/8675/8828 8845/8672/8825 +f 8847/8675/8828 8829/8658/8811 8832/8664/8817 +f 8848/8676/8829 8832/8664/8817 8849/8677/8830 +f 8845/8672/8825 8848/8676/8829 8846/8673/8826 +f 8850/8678/8831 8851/8679/8832 8853/8680/8833 +f 8851/8679/8832 8811/8642/8795 8852/8681/8834 +f 8852/8681/8834 8814/8644/8797 8854/8682/8835 +f 8853/8680/8833 8852/8681/8834 8855/8683/8836 +f 8856/8684/8837 8857/8685/8838 8859/8686/8839 +f 8857/8685/8838 8850/8678/8831 8858/8687/8840 +f 8858/8687/8840 8853/8680/8833 8860/8688/8841 +f 8859/8686/8839 8858/8687/8840 8861/8689/8842 +f 8828/8690/8843 8827/8657/8810 8863/8691/8844 +f 8827/8657/8810 8826/8655/8808 8862/8692/8845 +f 8862/8692/8845 8864/8693/8846 8856/8684/8837 +f 8863/8691/8844 8862/8692/8845 8861/8689/8842 +f 8837/8694/8847 8836/8665/8818 8866/8695/8848 +f 8836/8665/8818 8835/8663/8816 8839/8666/8819 +f 8865/8696/8849 8839/8666/8819 8823/8656/8809 +f 8866/8695/8848 8865/8696/8849 8823/8656/8809 +f 8861/8689/8842 8867/8697/8850 8863/8691/8844 +f 8867/8697/8850 8846/8673/8826 8868/8698/8851 +f 8868/8698/8851 8849/8677/8830 8837/8694/8847 +f 8863/8691/8844 8868/8698/8851 8866/8695/8848 +f 8855/8683/8836 8854/8682/8835 8860/8688/8841 +f 8854/8682/8835 8819/8649/8802 8869/8699/8852 +f 8869/8699/8852 8870/8700/8853 8846/8673/8826 +f 8860/8688/8841 8869/8699/8852 8861/8689/8842 +f 8819/8649/8802 8818/8701/8854 8870/8700/8853 +f 8818/8701/8854 8817/8648/8801 8842/8669/8822 +f 8870/8700/8853 8871/8702/8855 8846/8673/8826 +f 8815/8645/8798 8872/8703/8856 8843/8671/8824 +f 8872/8703/8856 8874/8704/8857 8873/8705/8858 +f 8873/8705/8858 8875/8706/8859 8876/8707/8860 +f 8843/8671/8824 8873/8705/8858 8877/8708/8861 +f 8874/8704/8857 8878/8709/8862 8875/8706/8859 +f 8878/8709/8862 8781/8612/8765 8780/8610/8763 +f 8879/8710/8863 8780/8610/8763 8777/8607/8760 +f 8875/8706/8859 8879/8710/8863 8876/8707/8860 +f 8811/8642/8795 8881/8711/8864 8812/8643/8796 +f 8881/8711/8864 8883/8712/8865 8882/8713/8866 +f 8882/8713/8866 8884/8714/8867 8872/8703/8856 +f 8812/8643/8796 8882/8713/8866 8815/8645/8798 +f 8883/8712/8865 8885/8715/8868 8884/8714/8867 +f 8885/8715/8868 8790/8623/8776 8794/8625/8778 +f 8886/8716/8869 8794/8625/8778 8878/8709/8862 +f 8884/8714/8867 8886/8716/8869 8874/8704/8857 +f 8850/8678/8831 8887/8717/8870 8888/8718/8871 +f 8887/8717/8870 8889/8719/8872 8890/8720/8873 +f 8888/8718/8871 8890/8720/8873 8881/8711/8864 +f 8851/8679/8832 8888/8718/8871 8881/8711/8864 +f 8889/8719/8872 8891/8721/8874 8892/8722/8875 +f 8891/8721/8874 8792/8622/8775 8791/8621/8774 +f 8892/8722/8875 8791/8621/8774 8790/8623/8776 +f 8890/8720/8873 8892/8722/8875 8885/8715/8868 +f 8856/8684/8837 8893/8723/8876 8894/8724/8877 +f 8893/8723/8876 8895/8725/8878 8896/8726/8879 +f 8894/8724/8877 8896/8726/8879 8889/8719/8872 +f 8857/8685/8838 8894/8724/8877 8887/8717/8870 +f 8895/8725/8878 8897/8727/8880 8898/8728/8881 +f 8897/8727/8880 8803/8634/8787 8806/8636/8789 +f 8898/8728/8881 8806/8636/8789 8792/8622/8775 +f 8896/8726/8879 8898/8728/8881 8891/8721/8874 +f 8826/8655/8808 8899/8729/8882 8864/8693/8846 +f 8899/8729/8882 8901/8730/8883 8900/8731/8884 +f 8900/8731/8884 8902/8732/8885 8895/8725/8878 +f 8864/8693/8846 8900/8731/8884 8893/8723/8876 +f 8901/8730/8883 8903/8733/8886 8904/8734/8887 +f 8903/8733/8886 8786/8617/8770 8808/8639/8792 +f 8904/8734/8887 8808/8639/8792 8803/8634/8787 +f 8902/8732/8885 8904/8734/8887 8897/8727/8880 +f 8824/8653/8806 8905/8735/8888 8906/8736/8889 +f 8905/8735/8888 8907/8737/8890 8908/8738/8891 +f 8906/8736/8889 8908/8738/8891 8901/8730/8883 +f 8825/8654/8807 8906/8736/8889 8899/8729/8882 +f 8907/8737/8890 8909/8739/8892 8910/8740/8893 +f 8909/8739/8892 8799/8630/8783 8910/8740/8893 +f 8910/8740/8893 8809/8640/8793 8903/8733/8886 +f 8908/8738/8891 8910/8740/8893 8903/8733/8886 +f 8833/8661/8814 8911/8741/8894 8912/8742/8895 +f 8911/8741/8894 8913/8743/8896 8914/8744/8897 +f 8912/8742/8895 8914/8744/8897 8907/8737/8890 +f 8840/8668/8821 8912/8742/8895 8905/8735/8888 +f 8913/8743/8896 8915/8745/8898 8916/8746/8899 +f 8915/8745/8898 8795/8626/8779 8800/8631/8784 +f 8916/8746/8899 8800/8631/8784 8799/8630/8783 +f 8914/8744/8897 8916/8746/8899 8909/8739/8892 +f 8829/8658/8811 8917/8747/8900 8830/8659/8812 +f 8917/8747/8900 8919/8748/8901 8918/8749/8902 +f 8918/8749/8902 8920/8750/8903 8911/8741/8894 +f 8830/8659/8812 8918/8749/8902 8833/8661/8814 +f 8919/8748/8901 8921/8751/8904 8922/8752/8905 +f 8921/8751/8904 8773/8604/8757 8796/8627/8780 +f 8922/8752/8905 8796/8627/8780 8795/8626/8779 +f 8920/8750/8903 8922/8752/8905 8915/8745/8898 +f 8844/8674/8827 8877/8708/8861 8923/8753/8906 +f 8877/8708/8861 8876/8707/8860 8923/8753/8906 +f 8923/8753/8906 8924/8754/8907 8917/8747/8900 +f 8847/8675/8828 8923/8753/8906 8829/8658/8811 +f 8876/8707/8860 8880/8755/8908 8924/8754/8907 +f 8880/8755/8908 8777/8607/8760 8774/8605/8758 +f 8773/8604/8757 8921/8751/8904 8925/8756/8909 +f 8924/8754/8907 8925/8756/8909 8921/8751/8904 +f 5250/5259/5230 8926/8757/8910 8927/8758/8911 +f 8926/8757/8910 8928/8759/8912 8929/8760/8913 +f 8927/8758/8911 8929/8760/8913 8930/8761/8914 +f 5253/5262/5233 8927/8758/8911 8931/8762/8915 +f 8932/8763/8916 8933/8764/8917 8935/8765/8918 +f 8933/8764/8917 8928/8759/8912 8934/8766/8919 +f 8934/8766/8919 8926/8757/8910 5247/5257/5228 +f 8935/8765/8918 8934/8766/8919 5246/5256/5227 +f 5416/5423/5394 5421/5429/5400 8936/8767/8920 +f 5421/5429/5400 5420/5427/5398 5434/5442/5413 +f 8936/8767/8920 5434/5442/5413 5424/5431/5402 +f 8937/8768/8921 8936/8767/8920 8938/8769/8922 +f 8940/8770/8923 8941/8771/8924 8942/8772/8925 +f 8941/8771/8924 5340/5348/5319 5345/5353/5324 +f 8942/8772/8925 5345/5353/5324 5344/5352/5323 +f 8943/8773/8926 8942/8772/8925 8944/8774/8927 +f 5246/5256/5227 5341/5349/5320 8946/8775/8928 +f 5341/5349/5320 5340/5348/5319 8941/8771/8924 +f 8946/8775/8928 8941/8771/8924 8940/8770/8923 +f 8935/8765/8918 8946/8775/8928 8947/8776/8929 +f 5254/5264/5235 8931/8762/8915 8948/8777/8930 +f 8931/8762/8915 8930/8761/8914 8949/8778/8931 +f 8948/8777/8930 8949/8778/8931 8950/8779/8932 +f 5274/5281/5252 8948/8777/8930 8951/8780/8933 +f 5276/5283/5254 8951/8780/8933 8952/8781/8934 +f 8951/8780/8933 8950/8779/8932 8953/8782/8935 +f 8952/8781/8934 8953/8782/8935 8955/8783/8936 +f 5282/5289/5260 8952/8781/8934 5283/5290/5261 +f 5344/5352/5323 5413/5421/5392 8944/8774/8927 +f 5413/5421/5392 5412/5420/5391 8956/8784/8937 +f 8956/8784/8937 8957/8785/8938 8959/8786/8939 +f 8944/8774/8927 8956/8784/8937 8945/8787/8940 +f 8958/8788/8941 8957/8785/8938 8961/8789/8942 +f 8957/8785/8938 5412/5420/5391 8960/8790/8943 +f 8960/8790/8943 5417/5425/5396 8937/8768/8921 +f 8961/8789/8942 8960/8790/8943 8939/8791/8944 +f 5283/5290/5261 8955/8783/8936 5422/5430/5401 +f 8955/8783/8936 8954/8792/8945 8962/8793/8946 +f 8962/8793/8946 8963/8794/8947 8939/8791/8944 +f 5422/5430/5401 8962/8793/8946 8938/8769/8922 +f 8964/8795/8948 8965/8796/8949 8966/8797/8950 +f 8965/8796/8949 8968/8798/8951 8966/8797/8950 +f 8966/8797/8950 8969/8799/8952 8971/8800/8953 +f 8967/8801/8954 8966/8797/8950 8971/8800/8953 +f 8973/8802/8955 8974/8803/8956 8976/8804/8957 +f 8974/8803/8956 8977/8805/8958 8975/8806/8959 +f 8975/8806/8959 8978/8807/8960 8979/8808/8961 +f 8976/8804/8957 8975/8806/8959 8980/8809/8962 +f 8982/8810/8963 8983/8811/8964 8985/8812/8965 +f 8983/8811/8964 8986/8813/8966 8984/8814/8967 +f 8984/8814/8967 8987/8815/8968 8989/8816/8969 +f 8985/8812/8965 8984/8814/8967 8989/8816/8969 +f 8977/8805/8958 8991/8817/8970 8992/8818/8971 +f 8991/8817/8970 8986/8813/8966 8983/8811/8964 +f 8992/8818/8971 8983/8811/8964 8982/8810/8963 +f 8978/8807/8960 8992/8818/8971 8979/8808/8961 +f 8994/8819/8972 8995/8820/8973 8997/8821/8974 +f 8995/8820/8973 8968/8798/8951 8965/8796/8949 +f 8996/8822/8975 8965/8796/8949 8964/8795/8948 +f 8997/8821/8974 8996/8822/8975 8998/8823/8976 +f 8990/8824/8977 8989/8816/8969 9000/8825/8978 +f 8989/8816/8969 8988/8826/8979 9000/8825/8978 +f 9000/8825/8978 9002/8827/8980 8994/8819/8972 +f 9001/8828/8981 9000/8825/8978 8997/8821/8974 +f 8972/8829/8982 8971/8800/8953 9003/8830/8983 +f 8971/8800/8953 8970/8831/8984 9005/8832/8985 +f 9003/8830/8983 9005/8832/8985 9006/8833/8986 +f 9004/8834/8987 9003/8830/8983 9007/8835/8988 +f 9008/8836/8989 9007/8835/8988 9010/8837/8990 +f 9007/8835/8988 9006/8833/8986 9011/8838/8991 +f 9009/8839/8992 9011/8838/8991 9012/8840/8993 +f 9010/8837/8990 9009/8839/8992 9013/8841/8994 +f 9012/8840/8993 9015/8842/8995 9013/8841/8994 +f 9015/8842/8995 8973/8802/8955 8976/8804/8957 +f 9016/8843/8996 8976/8804/8957 8981/8844/8997 +f 9013/8841/8994 9016/8843/8996 9017/8845/8998 +f 8979/8808/8961 8993/8846/8999 9018/8847/9000 +f 8993/8846/8999 8982/8810/8963 8985/8812/8965 +f 9018/8847/9000 8985/8812/8965 8990/8824/8977 +f 8980/8809/8962 9018/8847/9000 8981/8844/8997 +f 8990/8824/8977 9001/8828/8981 9019/8848/9001 +f 9001/8828/8981 8999/8849/9002 9020/8850/9003 +f 9020/8850/9003 9021/8851/9004 9014/8852/9005 +f 9019/8848/9001 9020/8850/9003 9017/8845/8998 +f 8999/8849/9002 9022/8853/9006 9023/8854/9007 +f 9022/8853/9006 8972/8829/8982 9004/8834/8987 +f 9023/8854/9007 9004/8834/8987 9008/8836/8989 +f 9021/8851/9004 9023/8854/9007 9010/8837/8990 +f 8964/8795/8948 8967/8801/8954 8998/8823/8976 +f 8967/8801/8954 8972/8829/8982 9024/8855/9008 +f 8998/8823/8976 9024/8855/9008 8999/8849/9002 +f 9025/8856/9009 9026/8857/9010 9028/8858/9011 +f 9026/8857/9010 9029/8859/9012 9027/8860/9013 +f 9027/8860/9013 9030/8861/9014 8995/8820/8973 +f 9028/8858/9011 9027/8860/9013 8994/8819/8972 +f 8928/8759/8912 8933/8764/8917 9032/8862/9015 +f 8933/8764/8917 8932/8763/8916 9031/8863/9016 +f 9031/8863/9016 9033/8864/9017 9026/8857/9010 +f 9032/8862/9015 9031/8863/9016 9025/8856/9009 +f 9029/8859/9012 9034/8865/9018 9035/8866/9019 +f 9034/8865/9018 9036/8867/9020 9037/8868/9021 +f 9035/8866/9019 9037/8868/9021 8970/8831/8984 +f 9030/8861/9014 9035/8866/9019 8969/8799/8952 +f 8932/8763/8916 8947/8776/8929 9038/8869/9022 +f 8947/8776/8929 8940/8770/8923 9039/8870/9023 +f 9038/8869/9022 9039/8870/9023 9036/8867/9020 +f 9033/8864/9017 9038/8869/9022 9034/8865/9018 +f 9036/8867/9020 9040/8871/9024 9041/8872/9025 +f 9040/8871/9024 9042/8873/9026 9041/8872/9025 +f 9041/8872/9025 9043/8874/9027 9005/8832/8985 +f 9037/8868/9021 9041/8872/9025 9005/8832/8985 +f 8940/8770/8923 8943/8773/8926 9044/8875/9028 +f 8943/8773/8926 8945/8787/8940 9044/8875/9028 +f 9044/8875/9028 9045/8876/9029 9040/8871/9024 +f 9039/8870/9023 9044/8875/9028 9040/8871/9024 +f 9042/8873/9026 9046/8877/9030 9043/8874/9027 +f 9046/8877/9030 9048/8878/9031 9047/8879/9032 +f 9047/8879/9032 9049/8880/9033 9011/8838/8991 +f 9043/8874/9027 9047/8879/9032 9006/8833/8986 +f 8945/8787/8940 8959/8786/8939 9045/8876/9029 +f 8959/8786/8939 8958/8788/8941 9050/8881/9034 +f 9050/8881/9034 9051/8882/9035 9046/8877/9030 +f 9045/8876/9029 9050/8881/9034 9042/8873/9026 +f 9048/8878/9031 9052/8883/9036 9049/8880/9033 +f 9052/8883/9036 9054/8884/9037 9055/8885/9038 +f 9053/8886/9039 9055/8885/9038 8973/8802/8955 +f 9049/8880/9033 9053/8886/9039 9012/8840/8993 +f 8958/8788/8941 8961/8789/8942 9051/8882/9035 +f 8961/8789/8942 8939/8791/8944 9056/8887/9040 +f 9056/8887/9040 9057/8888/9041 9054/8884/9037 +f 9051/8882/9035 9056/8887/9040 9048/8878/9031 +f 9054/8884/9037 9058/8889/9042 9055/8885/9038 +f 9058/8889/9042 9060/8890/9043 9059/8891/9044 +f 9059/8891/9044 9061/8892/9045 8974/8803/8956 +f 9055/8885/9038 9059/8891/9044 8974/8803/8956 +f 8939/8791/8944 8963/8794/8947 9057/8888/9041 +f 8963/8794/8947 8954/8792/8945 9062/8893/9046 +f 9062/8893/9046 9063/8894/9047 9058/8889/9042 +f 9057/8888/9041 9062/8893/9046 9054/8884/9037 +f 9060/8890/9043 9064/8895/9048 9061/8892/9045 +f 9064/8895/9048 9066/8896/9049 9065/8897/9050 +f 9065/8897/9050 9067/8898/9051 8986/8813/8966 +f 9061/8892/9045 9065/8897/9050 8977/8805/8958 +f 8954/8792/8945 8953/8782/8935 9063/8894/9047 +f 8953/8782/8935 8950/8779/8932 9068/8899/9052 +f 9068/8899/9052 9069/8900/9053 9064/8895/9048 +f 9063/8894/9047 9068/8899/9052 9060/8890/9043 +f 9066/8896/9049 9070/8901/9054 9067/8898/9051 +f 9070/8901/9054 9072/8902/9055 9073/8903/9056 +f 9071/8904/9057 9073/8903/9056 8988/8826/8979 +f 9067/8898/9051 9071/8904/9057 8987/8815/8968 +f 8950/8779/8932 8949/8778/8931 9069/8900/9053 +f 8949/8778/8931 8930/8761/8914 9074/8905/9058 +f 9074/8905/9058 9075/8906/9059 9070/8901/9054 +f 9069/8900/9053 9074/8905/9058 9066/8896/9049 +f 9072/8902/9055 9076/8907/9060 9077/8908/9061 +f 9076/8907/9060 9025/8856/9009 9077/8908/9061 +f 9077/8908/9061 9028/8858/9011 8994/8819/8972 +f 9073/8903/9056 9077/8908/9061 9002/8827/8980 +f 8930/8761/8914 8929/8760/8913 9075/8906/9059 +f 8929/8760/8913 8928/8759/8912 9078/8909/9062 +f 9078/8909/9062 9032/8862/9015 9076/8907/9060 +f 9075/8906/9059 9078/8909/9062 9072/8902/9055 +f 7366/7327/7378 9079/8910/9063 7396/7322/7373 +f 7362/7288/7343 9079/8910/9063 7363/7374/7418 +f 7362/7288/7343 7364/7289/7344 7365/8911/7465 +f 7365/8911/7465 7397/8912/7469 9079/8910/9063 +f 4/7/7 1/1/1 3/3/3 +f 3/3/3 2/2/2 6/5/5 +f 8/8/8 3/3/3 7/6/6 +f 9/375/375 4/7/7 8/8/8 +f 13/15/15 10/9/9 12/11/11 +f 12/11/11 11/10/10 15/13/13 +f 17/16/16 12/11/11 16/14/14 +f 18/675/675 13/15/15 17/16/16 +f 20/18/18 21/21/21 22/19/19 +f 23/20/20 24/22/22 21/21/21 +f 24/22/22 25/38/38 26/23/23 +f 21/21/21 26/23/23 27/24/24 +f 15/13/13 28/26/26 29/25/25 +f 14/12/12 30/27/27 28/26/26 +f 30/27/27 31/29/29 32/28/28 +f 28/26/26 32/28/28 27/24/24 +f 32/28/28 33/31/31 22/19/19 +f 33/31/31 32/28/28 34/30/30 +f 36/33/33 33/31/31 35/32/32 +f 19/17/17 22/19/19 36/33/33 +f 38/35/35 39/37/37 40/36/36 +f 16/14/14 29/25/25 39/37/37 +f 29/25/25 27/24/24 26/23/23 +f 39/37/37 26/23/23 25/38/38 +f 42/40/40 43/42/42 44/41/41 +f 37/34/34 40/36/36 43/42/42 +f 40/36/36 25/38/38 45/43/43 +f 43/42/42 45/43/43 46/44/44 +f 48/46/46 49/48/48 50/47/47 +f 41/39/39 44/41/41 49/48/48 +f 44/41/41 46/44/44 51/49/49 +f 49/48/48 51/49/49 52/50/50 +f 56/57/57 53/51/51 55/53/53 +f 55/53/53 54/52/52 58/55/55 +f 60/58/58 55/53/53 59/56/56 +f 61/60/60 56/57/57 60/58/58 +f 56/57/57 62/61/61 63/59/59 +f 61/60/60 64/62/62 62/61/61 +f 64/62/62 41/39/39 48/46/46 +f 62/61/61 48/46/46 47/45/45 +f 66/64/64 67/67/67 68/65/65 +f 69/66/66 70/68/68 67/67/67 +f 70/68/68 71/2030/1999 72/69/69 +f 67/67/67 72/69/69 73/70/70 +f 75/72/72 76/75/75 77/73/73 +f 78/74/74 79/76/76 76/75/75 +f 79/76/76 80/83/83 81/77/77 +f 76/75/75 81/77/77 82/78/78 +f 83/79/79 84/80/80 79/76/76 +f 7/6/6 85/81/81 84/80/80 +f 85/81/81 86/85/85 87/82/82 +f 84/80/80 87/82/82 80/83/83 +f 87/82/82 88/86/86 89/84/84 +f 86/85/85 90/87/87 88/86/86 +f 90/87/87 91/104/104 92/88/88 +f 88/86/86 92/88/88 93/89/89 +f 95/92/92 82/78/78 94/90/90 +f 80/83/83 89/84/84 94/90/90 +f 89/84/84 93/89/89 96/91/91 +f 65/63/63 95/92/92 96/91/91 +f 98/94/94 99/96/96 100/95/95 +f 74/71/71 77/73/73 99/96/96 +f 101/97/97 99/96/96 82/78/78 +f 102/100/100 100/95/95 101/97/97 +f 95/92/92 103/98/98 101/97/97 +f 65/63/63 68/65/65 103/98/98 +f 68/65/65 73/70/70 104/99/99 +f 103/98/98 104/99/99 102/100/100 +f 66/64/64 105/102/102 106/101/101 +f 65/63/63 96/91/91 105/102/102 +f 107/103/103 105/102/102 93/89/89 +f 108/108/108 106/101/101 107/103/103 +f 92/88/88 109/105/105 107/103/103 +f 91/104/104 110/106/106 109/105/105 +f 110/106/106 111/109/109 112/107/107 +f 109/105/105 112/107/107 108/108/108 +f 112/107/107 111/109/109 114/111/111 +f 114/111/111 113/110/110 116/113/113 +f 118/115/115 114/111/111 117/114/114 +f 108/108/108 112/107/107 118/115/115 +f 122/121/121 119/116/116 121/118/118 +f 121/118/118 120/117/117 123/119/119 +f 125/254/254 121/118/118 124/120/120 +f 121/118/118 125/254/254 126/122/122 +f 130/126/126 127/123/123 129/125/125 +f 129/125/125 128/124/124 116/113/113 +f 120/117/117 129/125/125 115/112/112 +f 119/116/116 130/126/126 120/117/117 +f 134/130/130 131/127/127 133/129/129 +f 133/129/129 132/128/128 130/126/126 +f 135/131/131 133/129/129 119/116/116 +f 136/8913/9064 134/130/130 135/131/131 +f 140/138/138 137/132/132 139/134/134 +f 139/134/134 138/133/133 142/136/136 +f 144/139/139 139/134/134 143/137/137 +f 136/8913/9064 140/138/138 144/139/139 +f 147/145/145 10/9/9 146/141/141 +f 146/141/141 145/140/140 149/143/143 +f 151/146/146 146/141/141 150/144/144 +f 152/147/147 147/145/145 151/146/146 +f 153/148/148 154/151/151 155/149/149 +f 156/150/150 157/152/152 154/151/151 +f 157/152/152 143/137/137 142/136/136 +f 154/151/151 142/136/136 141/135/135 +f 34/30/30 158/154/154 159/153/153 +f 31/29/29 160/155/155 158/154/154 +f 160/155/155 152/147/147 155/149/149 +f 158/154/154 155/149/149 141/135/135 +f 30/27/27 161/156/156 160/155/155 +f 14/12/12 11/10/10 161/156/156 +f 11/10/10 10/9/9 147/145/145 +f 161/156/156 147/145/145 152/147/147 +f 153/148/148 162/158/158 163/157/157 +f 152/147/147 151/146/146 162/158/158 +f 162/158/158 151/146/146 150/144/144 +f 165/160/160 166/163/163 167/161/161 +f 168/162/162 169/164/164 166/163/163 +f 169/164/164 137/132/132 140/138/138 +f 136/8913/9064 167/161/161 140/138/138 +f 171/166/166 172/169/169 173/167/167 +f 174/168/168 175/170/170 172/169/169 +f 175/170/170 168/162/162 165/160/160 +f 172/169/169 165/160/160 164/159/159 +f 179/174/174 176/171/171 178/173/173 +f 178/173/173 177/172/172 171/166/166 +f 180/175/175 178/173/173 170/165/165 +f 181/239/239 179/174/174 180/175/175 +f 183/177/177 184/180/180 185/178/178 +f 186/179/179 187/181/181 184/180/180 +f 187/181/181 188/226/226 189/182/182 +f 184/180/180 189/182/182 190/183/183 +f 194/189/189 191/184/184 193/186/186 +f 193/186/186 192/185/185 196/188/188 +f 185/178/178 193/186/186 182/176/176 +f 190/183/183 194/189/189 185/178/178 +f 51/49/49 197/191/191 198/190/190 +f 46/44/44 199/192/192 197/191/191 +f 192/185/185 197/191/191 195/187/187 +f 191/184/184 198/190/190 192/185/185 +f 45/43/43 25/38/38 200/193/193 +f 23/20/20 201/194/194 200/193/193 +f 201/194/194 195/187/187 199/192/192 +f 46/44/44 45/43/43 199/192/192 +f 196/188/188 195/187/187 202/195/195 +f 202/195/195 201/194/194 20/18/18 +f 203/196/196 202/195/195 19/17/17 +f 182/176/176 196/188/188 203/196/196 +f 207/202/202 204/197/197 206/199/199 +f 206/199/199 205/198/198 209/201/201 +f 177/172/172 206/199/199 174/168/168 +f 176/171/171 207/202/202 177/172/172 +f 211/204/204 212/206/206 213/205/205 +f 208/200/200 205/198/198 212/206/206 +f 205/198/198 204/197/197 214/207/207 +f 212/206/206 214/207/207 186/179/179 +f 209/201/201 208/200/200 216/209/209 +f 216/209/209 215/208/208 218/211/211 +f 175/170/170 216/209/209 168/162/162 +f 174/168/168 209/201/201 175/170/170 +f 219/212/212 220/214/214 36/33/33 +f 221/213/213 222/215/215 220/214/214 +f 222/215/215 210/203/203 223/216/216 +f 220/214/214 223/216/216 19/17/17 +f 224/217/217 225/218/218 138/133/133 +f 225/218/218 224/217/217 219/212/212 +f 159/153/153 225/218/218 35/32/32 +f 141/135/135 138/133/133 159/153/153 +f 218/211/211 226/219/219 169/164/164 +f 217/210/210 227/220/220 226/219/219 +f 227/220/220 221/213/213 224/217/217 +f 226/219/219 224/217/217 137/132/132 +f 227/220/220 228/221/221 222/215/215 +f 217/210/210 215/208/208 228/221/221 +f 215/208/208 208/200/200 211/204/204 +f 228/221/221 211/204/204 210/203/203 +f 223/216/216 210/203/203 229/222/222 +f 229/222/222 213/205/205 183/177/177 +f 203/196/196 229/222/222 182/176/176 +f 19/17/17 223/216/216 203/196/196 +f 214/207/207 230/223/223 187/181/181 +f 204/197/197 231/224/224 230/223/223 +f 231/224/224 232/230/230 233/225/225 +f 230/223/223 233/225/225 188/226/226 +f 207/202/202 234/227/227 231/224/224 +f 176/171/171 235/228/228 234/227/227 +f 237/8914/990 234/227/227 236/229/229 +f 234/227/227 237/8914/990 232/230/230 +f 241/237/237 238/231/231 240/233/233 +f 240/233/233 239/232/232 243/235/235 +f 245/238/238 240/233/233 244/236/236 +f 181/239/239 241/237/237 245/238/238 +f 179/174/174 181/239/239 246/240/240 +f 246/240/240 245/238/238 247/241/241 +f 247/241/241 236/229/229 235/228/228 +f 176/171/171 179/174/174 235/228/228 +f 251/245/245 248/242/242 250/244/244 +f 250/244/244 249/243/243 241/237/237 +f 180/175/175 250/244/244 181/239/239 +f 170/165/165 251/245/245 180/175/175 +f 254/248/248 126/122/122 253/247/247 +f 253/247/247 252/246/246 251/245/245 +f 173/167/167 253/247/247 170/165/165 +f 164/159/159 254/248/248 173/167/167 +f 122/121/121 255/249/249 135/131/131 +f 255/249/249 122/121/121 254/248/248 +f 167/161/161 255/249/249 164/159/159 +f 136/8913/9064 135/131/131 167/161/161 +f 125/254/254 124/120/120 257/251/251 +f 257/251/251 256/250/250 259/253/253 +f 252/246/246 257/251/251 248/242/242 +f 126/122/122 125/254/254 252/246/246 +f 263/261/261 260/255/255 262/257/257 +f 262/257/257 261/256/256 265/259/259 +f 267/262/262 262/257/257 266/260/260 +f 268/317/317 263/261/261 267/262/262 +f 267/262/262 266/260/260 270/264/264 +f 270/264/264 269/263/263 272/266/266 +f 274/268/268 270/264/264 273/267/267 +f 268/317/317 267/262/262 274/268/268 +f 278/275/275 275/269/269 277/271/271 +f 277/271/271 276/270/270 280/273/273 +f 282/434/434 277/271/271 281/274/274 +f 277/271/271 282/434/434 283/276/276 +f 280/273/273 284/278/278 285/277/277 +f 279/272/272 286/279/279 284/278/278 +f 286/279/279 287/302/302 288/280/280 +f 284/278/278 288/280/280 273/267/267 +f 290/282/282 291/285/285 292/283/283 +f 293/284/284 294/286/286 291/285/285 +f 294/286/286 295/311/311 296/287/287 +f 291/285/285 296/287/287 297/288/288 +f 299/290/290 300/293/293 301/291/291 +f 302/292/292 303/294/294 300/293/293 +f 303/294/294 304/320/320 305/295/295 +f 300/293/293 305/295/295 306/296/296 +f 310/301/301 307/297/297 309/299/299 +f 309/299/299 308/298/298 311/300/300 +f 301/291/291 309/299/299 298/289/289 +f 306/296/296 310/301/301 301/291/291 +f 314/305/305 287/302/302 313/304/304 +f 313/304/304 312/303/303 311/300/300 +f 292/283/283 313/304/304 289/281/281 +f 297/288/288 314/305/305 292/283/283 +f 315/306/306 316/308/308 308/298/298 +f 317/307/307 318/309/309 316/308/308 +f 318/309/309 293/284/284 290/282/282 +f 316/308/308 290/282/282 289/281/281 +f 320/314/314 297/288/288 319/310/310 +f 319/310/310 296/287/287 321/312/312 +f 323/315/315 319/310/310 322/313/313 +f 268/317/317 320/314/314 323/315/315 +f 288/280/280 324/316/316 274/268/268 +f 287/302/302 314/305/305 324/316/316 +f 314/305/305 297/288/288 320/314/314 +f 324/316/316 320/314/314 268/317/317 +f 325/318/318 326/319/319 286/279/279 +f 302/292/292 299/290/290 326/319/319 +f 312/303/303 326/319/319 298/289/289 +f 326/319/319 312/303/303 287/302/302 +f 328/322/322 304/320/320 327/321/321 +f 302/292/292 325/318/318 327/321/321 +f 325/318/318 279/272/272 276/270/270 +f 275/269/269 328/322/322 276/270/270 +f 305/295/295 329/324/324 330/323/323 +f 304/320/320 331/325/325 329/324/324 +f 331/325/325 332/331/331 333/326/326 +f 329/324/324 333/326/326 334/327/327 +f 328/322/322 335/328/328 331/325/325 +f 275/269/269 336/329/329 335/328/328 +f 336/329/329 337/336/336 338/330/330 +f 335/328/328 338/330/330 332/331/331 +f 278/275/275 283/276/276 340/333/333 +f 340/333/333 339/332/332 342/335/335 +f 336/329/329 340/333/333 337/336/336 +f 275/269/269 278/275/275 336/329/329 +f 344/338/338 345/341/341 346/339/339 +f 347/340/340 348/342/342 345/341/341 +f 348/342/342 349/568/568 350/343/343 +f 345/341/341 350/343/343 351/344/344 +f 342/335/335 352/346/346 353/345/345 +f 341/334/334 354/347/347 352/346/346 +f 354/347/347 355/534/534 356/348/348 +f 352/346/346 356/348/348 357/349/349 +f 361/356/356 358/350/350 360/352/352 +f 360/352/352 359/351/351 363/354/354 +f 365/357/357 360/352/352 364/355/355 +f 366/400/400 361/356/356 365/357/357 +f 368/359/359 369/362/362 370/360/360 +f 371/361/361 372/363/363 369/362/362 +f 372/363/363 373/718/718 374/364/364 +f 369/362/362 374/364/364 375/365/365 +f 379/371/371 376/366/366 378/368/368 +f 378/368/368 377/367/367 381/370/370 +f 381/370/370 375/365/365 374/364/364 +f 373/718/718 379/371/371 374/364/364 +f 385/376/376 382/372/372 384/374/374 +f 384/374/374 383/373/373 4/7/7 +f 386/377/377 384/374/374 9/375/375 +f 343/337/337 385/376/376 386/377/377 +f 388/379/379 389/382/382 390/380/380 +f 391/381/381 392/383/383 389/382/382 +f 392/383/383 393/450/450 394/384/384 +f 389/382/382 394/384/384 364/355/355 +f 263/261/261 395/386/386 396/385/385 +f 268/317/317 323/315/315 395/386/386 +f 323/315/315 322/313/313 397/387/387 +f 395/386/386 397/387/387 398/388/388 +f 400/390/390 401/392/392 402/391/391 +f 260/255/255 396/385/385 401/392/392 +f 396/385/385 398/388/388 403/393/393 +f 401/392/392 403/393/393 404/394/394 +f 408/401/401 405/395/395 407/397/397 +f 407/397/397 406/396/396 410/399/399 +f 365/357/357 407/397/397 366/400/400 +f 364/355/355 408/401/401 365/357/357 +f 411/402/402 412/404/404 402/391/391 +f 413/403/403 414/405/405 412/404/404 +f 416/418/418 412/404/404 415/406/406 +f 412/404/404 416/418/418 399/389/389 +f 417/407/407 418/410/410 414/405/405 +f 418/410/410 417/407/407 420/409/409 +f 422/412/412 418/410/410 421/411/411 +f 415/406/406 414/405/405 422/412/412 +f 424/416/416 415/406/406 423/413/413 +f 423/413/413 422/412/412 425/414/414 +f 427/417/417 423/413/413 426/415/415 +f 409/398/398 424/416/416 427/417/417 +f 429/420/420 399/389/389 428/419/419 +f 428/419/419 416/418/418 424/416/416 +f 406/396/396 428/419/419 409/398/398 +f 405/395/395 429/420/420 406/396/396 +f 430/421/421 431/423/423 429/420/420 +f 432/422/422 433/424/424 431/423/423 +f 433/424/424 260/255/255 400/390/390 +f 431/423/423 400/390/390 399/389/389 +f 437/431/431 434/425/425 436/427/427 +f 436/427/427 435/426/426 439/429/429 +f 441/432/432 436/427/427 440/430/430 +f 351/344/344 437/431/431 441/432/432 +f 442/433/433 443/435/435 282/434/434 +f 438/428/428 435/426/426 443/435/435 +f 435/426/426 434/425/425 444/436/436 +f 443/435/435 444/436/436 283/276/276 +f 272/266/266 271/265/265 446/438/438 +f 438/428/428 442/433/433 446/438/438 +f 285/277/277 446/438/438 281/274/274 +f 273/267/267 272/266/266 285/277/277 +f 448/440/440 271/265/265 447/439/439 +f 447/439/439 269/263/263 265/259/259 +f 449/441/441 447/439/439 264/258/258 +f 450/442/442 448/440/440 449/441/441 +f 452/444/444 450/442/442 451/443/443 +f 451/443/443 449/441/441 261/256/256 +f 261/256/256 260/255/255 433/424/424 +f 432/422/422 452/444/444 433/424/424 +f 445/437/437 453/445/445 439/429/429 +f 453/445/445 445/437/437 448/440/440 +f 454/446/446 453/445/445 450/442/442 +f 440/430/430 439/429/429 454/446/446 +f 456/448/448 440/430/430 455/447/447 +f 455/447/447 454/446/446 452/444/444 +f 457/449/449 455/447/447 432/422/422 +f 393/450/450 456/448/448 457/449/449 +f 394/384/384 393/450/450 458/451/451 +f 458/451/451 457/449/449 430/421/421 +f 408/401/401 458/451/451 405/395/395 +f 364/355/355 394/384/384 408/401/401 +f 456/448/448 459/452/452 441/432/432 +f 393/450/450 392/383/383 459/452/452 +f 392/383/383 391/381/381 460/453/453 +f 459/452/452 460/453/453 351/344/344 +f 460/453/453 391/381/381 462/455/455 +f 462/455/455 461/454/454 385/376/376 +f 346/339/339 462/455/455 343/337/337 +f 351/344/344 460/453/453 346/339/339 +f 463/456/456 464/457/457 377/367/367 +f 1/1/1 383/373/373 464/457/457 +f 383/373/373 382/372/372 465/458/458 +f 464/457/457 465/458/458 380/369/369 +f 388/379/379 466/459/459 461/454/454 +f 387/378/378 467/460/460 466/459/459 +f 467/460/460 380/369/369 465/458/458 +f 466/459/459 465/458/458 382/372/372 +f 467/460/460 468/461/461 381/370/370 +f 387/378/378 390/380/380 468/461/461 +f 390/380/380 364/355/355 469/462/462 +f 468/461/461 469/462/462 375/365/365 +f 363/354/354 470/464/464 469/462/462 +f 470/464/464 363/354/354 471/463/463 +f 370/360/360 470/464/464 367/358/358 +f 375/365/365 469/462/462 370/360/360 +f 471/463/463 472/466/466 473/465/465 +f 362/353/353 359/351/351 472/466/466 +f 359/351/351 358/350/350 474/467/467 +f 472/466/466 474/467/467 475/468/468 +f 477/470/470 478/472/472 479/471/471 +f 478/472/472 477/470/470 474/467/467 +f 480/492/492 478/472/472 358/350/350 +f 478/472/472 480/492/492 481/473/473 +f 485/477/477 482/474/474 484/476/476 +f 484/476/476 483/475/475 473/465/465 +f 484/476/476 473/465/465 475/468/468 +f 489/483/483 486/478/478 488/480/480 +f 490/481/481 491/482/482 488/480/480 +f 492/485/485 488/480/480 482/474/474 +f 488/480/480 492/485/485 493/484/484 +f 492/485/485 494/487/487 495/486/486 +f 494/487/487 492/485/485 485/477/477 +f 485/477/477 475/468/468 477/470/470 +f 494/487/487 477/470/470 476/469/469 +f 410/399/399 409/398/398 496/488/488 +f 496/488/488 427/417/417 497/489/489 +f 499/491/491 496/488/488 498/490/490 +f 366/400/400 410/399/399 499/491/491 +f 361/356/356 500/493/493 480/492/492 +f 366/400/400 499/491/491 500/493/493 +f 499/491/491 498/490/490 501/494/494 +f 500/493/493 501/494/494 481/473/473 +f 487/479/479 502/497/497 503/495/495 +f 502/497/497 487/479/479 504/496/496 +f 504/496/496 505/8915/1251 506/498/498 +f 502/497/497 506/498/498 507/499/499 +f 511/504/504 508/500/500 510/502/502 +f 490/481/481 503/495/495 510/502/502 +f 503/495/495 507/499/499 512/503/503 +f 510/502/502 512/503/503 513/505/505 +f 515/507/507 367/358/358 514/506/506 +f 514/506/506 483/475/475 491/482/482 +f 509/501/501 514/506/506 490/481/481 +f 508/500/500 515/507/507 509/501/501 +f 517/509/509 518/511/511 519/510/510 +f 371/361/361 368/359/359 518/511/511 +f 368/359/359 367/358/358 515/507/507 +f 518/511/511 515/507/507 508/500/500 +f 521/513/513 522/516/516 523/514/514 +f 524/515/515 525/517/517 522/516/516 +f 525/517/517 526/642/642 527/518/518 +f 522/516/516 527/518/518 528/519/519 +f 532/525/525 529/520/520 531/522/522 +f 531/522/522 530/521/521 534/524/524 +f 534/524/524 524/515/515 521/513/513 +f 520/512/512 532/525/525 521/513/513 +f 536/529/529 529/520/520 535/526/526 +f 520/512/512 537/527/527 535/526/526 +f 537/527/527 538/646/646 539/528/528 +f 357/349/349 536/529/529 539/528/528 +f 541/532/532 533/523/523 540/530/530 +f 540/530/530 530/521/521 542/531/531 +f 540/530/530 542/531/531 543/533/533 +f 356/348/348 544/535/535 536/529/529 +f 355/534/534 545/536/536 544/535/535 +f 545/536/536 543/533/533 542/531/531 +f 544/535/535 542/531/531 529/520/520 +f 547/538/538 548/541/541 549/539/539 +f 550/540/540 551/542/542 548/541/541 +f 551/542/542 74/71/71 98/94/94 +f 548/541/541 98/94/94 97/93/93 +f 344/338/338 343/337/337 552/543/543 +f 552/543/543 386/377/377 553/544/544 +f 555/546/546 552/543/543 554/545/545 +f 347/340/340 344/338/338 555/546/546 +f 553/544/544 556/548/548 557/547/547 +f 9/375/375 8/8/8 556/548/548 +f 8/8/8 7/6/6 83/79/79 +f 556/548/548 83/79/79 78/74/74 +f 558/549/549 559/550/550 551/542/542 +f 554/545/545 557/547/547 559/550/550 +f 557/547/547 78/74/74 75/72/72 +f 559/550/550 75/72/72 74/71/71 +f 561/552/552 562/554/554 563/553/553 +f 347/340/340 555/546/546 562/554/554 +f 555/546/546 554/545/545 558/549/549 +f 562/554/554 558/549/549 550/540/540 +f 565/556/556 566/558/558 567/557/557 +f 560/551/551 563/553/553 566/558/558 +f 563/553/553 550/540/540 547/538/538 +f 566/558/558 547/538/538 546/537/537 +f 569/562/562 564/555/555 568/559/559 +f 568/559/559 567/557/557 570/560/560 +f 572/563/563 568/559/559 571/561/561 +f 543/533/533 569/562/562 572/563/563 +f 561/552/552 560/551/551 574/565/565 +f 574/565/565 573/564/564 576/567/567 +f 348/342/342 574/565/565 349/568/568 +f 347/340/340 561/552/552 348/342/342 +f 350/343/343 577/569/569 437/431/431 +f 349/568/568 578/570/570 577/569/569 +f 580/572/572 577/569/569 579/571/571 +f 434/425/425 437/431/431 580/572/572 +f 581/573/573 582/574/574 354/347/347 +f 579/571/571 583/575/575 582/574/574 +f 583/575/575 584/580/580 585/576/576 +f 582/574/574 585/576/576 355/534/534 +f 444/436/436 434/425/425 586/577/577 +f 586/577/577 580/572/572 581/573/573 +f 339/332/332 586/577/577 341/334/334 +f 283/276/276 444/436/436 339/332/332 +f 578/570/570 349/568/568 587/578/578 +f 587/578/578 576/567/567 588/579/579 +f 583/575/575 587/578/578 584/580/580 +f 579/571/571 578/570/570 583/575/575 +f 588/579/579 589/582/582 590/581/581 +f 575/566/566 573/564/564 589/582/582 +f 573/564/564 560/551/551 565/556/556 +f 589/582/582 565/556/556 564/555/555 +f 585/576/576 591/583/583 545/536/536 +f 584/580/580 590/581/581 591/583/583 +f 590/581/581 564/555/555 569/562/562 +f 591/583/583 569/562/562 543/533/533 +f 595/587/587 592/584/584 594/586/586 +f 594/586/586 593/585/585 541/532/532 +f 541/532/532 543/533/533 572/563/563 +f 571/561/561 595/587/587 572/563/563 +f 599/594/594 596/588/588 598/590/590 +f 598/590/590 597/589/589 601/592/592 +f 603/595/595 598/590/590 602/593/593 +f 604/624/624 599/594/594 603/595/595 +f 606/597/597 607/599/599 608/598/598 +f 600/591/591 597/589/589 607/599/599 +f 597/589/589 596/588/588 609/600/600 +f 607/599/599 609/600/600 610/601/601 +f 601/592/592 611/603/603 612/602/602 +f 600/591/591 606/597/597 611/603/603 +f 606/597/597 605/596/596 613/604/604 +f 611/603/603 613/604/604 614/605/605 +f 618/611/611 615/606/606 617/608/608 +f 617/608/608 616/607/607 620/610/610 +f 621/612/612 617/608/608 592/584/584 +f 622/621/621 618/611/611 621/612/612 +f 626/616/616 623/613/613 625/615/615 +f 625/615/615 624/614/614 570/560/560 +f 549/539/539 625/615/615 546/537/537 +f 97/93/93 626/616/616 549/539/539 +f 630/620/620 627/617/617 629/619/619 +f 629/619/619 628/618/618 626/616/616 +f 100/95/95 629/619/619 97/93/93 +f 102/100/100 630/620/620 100/95/95 +f 632/623/623 622/621/621 631/622/622 +f 631/622/622 621/612/612 595/587/587 +f 624/614/614 631/622/622 571/561/561 +f 623/613/613 632/623/623 624/614/614 +f 635/627/627 604/624/624 634/626/626 +f 634/626/626 633/625/625 632/623/623 +f 628/618/618 634/626/626 623/613/613 +f 627/617/617 635/627/627 628/618/618 +f 603/595/595 602/593/593 637/629/629 +f 637/629/629 636/628/628 618/611/611 +f 633/625/625 637/629/629 622/621/621 +f 604/624/624 603/595/595 633/625/625 +f 636/628/628 602/593/593 638/630/630 +f 638/630/630 612/602/602 639/631/631 +f 641/634/634 638/630/630 640/632/632 +f 638/630/630 641/634/634 615/606/606 +f 642/633/633 643/636/636 641/634/634 +f 644/635/635 645/637/637 643/636/636 +f 616/607/607 643/636/636 619/609/609 +f 615/606/606 641/634/634 616/607/607 +f 534/524/524 646/639/639 647/638/638 +f 533/523/523 593/585/585 646/639/639 +f 593/585/585 592/584/584 620/610/610 +f 646/639/639 620/610/610 619/609/609 +f 645/637/637 644/635/635 649/641/641 +f 526/642/642 525/517/517 649/641/641 +f 647/638/638 649/641/641 524/515/515 +f 619/609/609 645/637/637 647/638/638 +f 537/527/527 520/512/512 650/643/643 +f 650/643/643 523/514/514 651/644/644 +f 651/644/644 652/648/648 653/645/645 +f 650/643/643 653/645/645 538/646/646 +f 653/645/645 654/649/649 655/647/647 +f 652/648/648 656/650/650 654/649/649 +f 656/650/650 657/668/668 658/651/651 +f 654/649/649 658/651/651 659/652/652 +f 661/654/654 357/349/349 660/653/653 +f 538/646/646 655/647/647 660/653/653 +f 662/655/655 660/653/653 659/652/652 +f 663/662/662 661/654/654 662/655/655 +f 333/326/326 664/657/657 665/656/656 +f 332/331/331 666/658/658 664/657/657 +f 666/658/658 663/662/662 667/659/659 +f 664/657/657 667/659/659 668/660/660 +f 338/330/330 669/661/661 666/658/658 +f 337/336/336 353/345/345 669/661/661 +f 353/345/345 357/349/349 661/654/654 +f 669/661/661 661/654/654 663/662/662 +f 667/659/659 670/664/664 671/663/663 +f 663/662/662 662/655/655 670/664/664 +f 662/655/655 659/652/652 672/665/665 +f 673/666/666 671/663/663 672/665/665 +f 675/669/669 673/666/666 674/667/667 +f 674/667/667 672/665/665 658/651/651 +f 676/1420/1403 674/667/667 657/668/668 +f 674/667/667 676/1420/1403 677/670/670 +f 679/672/672 680/674/674 681/673/673 +f 148/142/142 145/140/140 680/674/674 +f 145/140/140 10/9/9 13/15/15 +f 680/674/674 13/15/15 18/675/675 +f 682/676/676 683/678/678 64/62/62 +f 684/677/677 685/679/679 683/678/678 +f 685/679/679 37/34/34 42/40/40 +f 683/678/678 42/40/40 41/39/39 +f 686/680/680 687/682/682 60/58/58 +f 688/681/681 689/683/683 687/682/682 +f 689/683/683 684/677/677 682/676/676 +f 687/682/682 682/676/676 61/60/60 +f 690/684/684 691/685/685 685/679/679 +f 18/675/675 17/16/16 691/685/685 +f 17/16/16 16/14/14 38/35/35 +f 691/685/685 38/35/35 37/34/34 +f 692/686/686 693/687/687 689/683/683 +f 678/671/671 681/673/673 693/687/687 +f 681/673/673 18/675/675 690/684/684 +f 693/687/687 690/684/684 684/677/677 +f 695/689/689 696/692/692 697/690/690 +f 698/691/691 699/693/693 696/692/692 +f 699/693/693 700/736/736 701/694/694 +f 696/692/692 701/694/694 702/695/695 +f 706/701/701 703/696/696 705/698/698 +f 705/698/698 704/697/697 708/700/700 +f 256/250/250 705/698/698 258/252/252 +f 124/120/120 706/701/701 256/250/250 +f 709/702/702 710/703/703 113/110/110 +f 710/703/703 709/702/702 706/701/701 +f 123/119/119 710/703/703 124/120/120 +f 710/703/703 123/119/119 115/112/112 +f 711/704/704 712/706/706 110/106/106 +f 713/705/705 714/707/707 712/706/706 +f 714/707/707 703/696/696 709/702/702 +f 712/706/706 709/702/702 111/109/109 +f 715/708/708 716/709/709 714/707/707 +f 702/695/695 717/710/710 716/709/709 +f 704/697/697 716/709/709 707/699/699 +f 703/696/696 714/707/707 704/697/697 +f 6/5/5 718/711/711 85/81/81 +f 5/4/4 719/712/712 718/711/711 +f 719/712/712 720/714/714 721/713/713 +f 718/711/711 721/713/713 86/85/85 +f 719/712/712 722/716/716 723/715/715 +f 5/4/4 2/2/2 722/716/716 +f 463/456/456 722/716/716 2/2/2 +f 722/716/716 463/456/456 376/366/366 +f 725/719/719 720/714/714 724/717/717 +f 724/717/717 723/715/715 379/371/371 +f 726/720/720 724/717/717 373/718/718 +f 694/688/688 725/719/719 726/720/720 +f 711/704/704 91/104/104 727/721/721 +f 727/721/721 90/87/87 721/713/713 +f 728/722/722 727/721/721 720/714/714 +f 713/705/705 711/704/704 728/722/722 +f 725/719/719 694/688/688 729/723/723 +f 729/723/723 697/690/690 715/708/708 +f 728/722/722 729/723/723 713/705/705 +f 720/714/714 725/719/719 728/722/722 +f 259/253/253 258/252/252 731/725/725 +f 731/725/725 730/724/724 733/727/727 +f 249/243/243 731/725/725 238/231/231 +f 248/242/242 259/253/253 249/243/243 +f 708/700/700 707/699/699 735/729/729 +f 735/729/729 734/728/728 737/731/731 +f 730/724/724 735/729/729 732/726/726 +f 258/252/252 708/700/700 730/724/724 +f 733/727/727 732/726/726 739/733/733 +f 740/734/734 741/735/735 739/733/733 +f 741/735/735 242/234/234 239/232/232 +f 238/231/231 733/727/727 239/232/232 +f 742/737/737 743/741/741 744/738/738 +f 743/741/741 742/737/737 746/740/740 +f 748/743/743 743/741/741 747/742/742 +f 743/741/741 748/743/743 736/730/730 +f 737/731/731 736/730/730 749/744/744 +f 747/742/742 750/745/745 749/744/744 +f 750/745/745 740/734/734 738/732/732 +f 732/726/726 737/731/731 738/732/732 +f 717/710/710 702/695/695 751/746/746 +f 700/736/736 744/738/738 751/746/746 +f 734/728/728 751/746/746 736/730/730 +f 707/699/699 717/710/710 734/728/728 +f 753/748/748 373/718/718 752/747/747 +f 752/747/747 372/363/363 517/509/509 +f 754/749/749 752/747/747 516/508/508 +f 755/750/750 753/748/748 754/749/749 +f 756/751/751 757/755/755 758/752/752 +f 757/755/755 756/751/751 760/754/754 +f 762/764/764 757/755/755 761/756/756 +f 757/755/755 762/764/764 698/691/691 +f 753/748/748 755/750/750 763/757/757 +f 763/757/757 758/752/752 695/689/689 +f 726/720/720 763/757/757 694/688/688 +f 373/718/718 753/748/748 726/720/720 +f 765/759/759 766/761/761 767/760/760 +f 516/508/508 519/510/510 766/761/761 +f 519/510/510 508/500/500 511/504/504 +f 766/761/761 511/504/504 513/505/505 +f 756/751/751 755/750/750 768/762/762 +f 768/762/762 754/749/749 765/759/759 +f 769/763/763 768/762/762 764/758/758 +f 759/753/753 756/751/751 769/763/763 +f 699/693/693 698/691/691 770/765/765 +f 770/765/765 762/764/764 771/766/766 +f 742/737/737 770/765/765 745/739/739 +f 770/765/765 742/737/737 700/736/736 +f 773/768/768 774/772/772 775/769/769 +f 774/772/772 773/768/768 777/771/771 +f 157/152/152 774/772/772 143/137/137 +f 156/150/150 775/769/769 157/152/152 +f 777/771/771 778/774/774 144/139/139 +f 778/774/774 777/771/771 779/773/773 +f 134/130/130 778/774/774 131/127/127 +f 136/8913/9064 144/139/139 134/130/130 +f 781/776/776 782/779/779 783/777/777 +f 784/778/778 785/780/780 782/779/779 +f 785/780/780 786/1142/1128 787/781/781 +f 782/779/779 787/781/781 788/782/782 +f 790/784/784 791/787/787 792/785/785 +f 793/786/786 794/788/788 791/787/787 +f 794/788/788 795/923/922 796/789/789 +f 791/787/787 796/789/789 797/790/790 +f 801/797/797 798/791/791 800/793/793 +f 800/793/793 799/792/792 803/795/795 +f 805/798/798 800/793/793 804/796/796 +f 806/808/808 801/797/797 805/798/798 +f 808/800/800 809/802/802 810/801/801 +f 809/802/802 808/800/800 790/784/784 +f 811/803/803 809/802/802 789/783/783 +f 806/808/808 810/801/801 811/803/803 +f 813/805/805 814/807/807 815/806/806 +f 807/799/799 810/801/801 814/807/807 +f 805/798/798 814/807/807 806/808/808 +f 814/807/807 805/798/798 804/796/796 +f 801/797/797 806/808/808 816/809/809 +f 816/809/809 811/803/803 817/810/810 +f 819/812/812 816/809/809 818/811/811 +f 798/791/791 801/797/797 819/812/812 +f 821/816/816 798/791/791 820/813/813 +f 820/813/813 819/812/812 822/814/814 +f 824/817/817 820/813/813 823/815/815 +f 825/818/818 821/816/816 824/817/817 +f 827/821/821 825/818/818 826/819/819 +f 826/819/819 824/817/817 828/820/820 +f 50/822/47 826/819/819 47/45/45 +f 52/960/50 827/821/821 50/822/47 +f 830/824/823 831/826/825 832/825/824 +f 57/54/54 54/52/52 831/826/825 +f 54/52/52 53/51/51 833/827/826 +f 831/826/825 833/827/826 834/828/827 +f 828/820/820 823/815/815 836/830/829 +f 836/830/829 835/829/828 833/827/826 +f 63/59/59 836/830/829 53/51/51 +f 47/45/45 828/820/820 63/59/59 +f 840/837/836 837/831/830 839/833/832 +f 839/833/832 838/832/831 842/835/834 +f 844/838/837 839/833/832 843/836/835 +f 845/867/866 840/837/836 844/838/837 +f 849/845/844 846/839/838 848/841/840 +f 848/841/840 847/840/839 851/843/842 +f 853/846/845 848/841/840 852/844/843 +f 854/859/858 849/845/844 853/846/845 +f 858/851/850 855/847/846 857/849/848 +f 857/849/848 856/848/847 859/850/849 +f 847/840/839 857/849/848 850/842/841 +f 846/839/838 858/851/850 847/840/839 +f 863/855/854 860/852/851 862/854/853 +f 862/854/853 861/853/852 858/851/850 +f 864/856/855 862/854/853 846/839/838 +f 865/857/856 863/855/854 864/856/855 +f 867/860/859 865/857/856 866/858/857 +f 866/858/857 864/856/855 849/845/844 +f 868/861/860 866/858/857 854/859/858 +f 843/836/835 867/860/859 868/861/860 +f 870/865/864 854/859/858 869/862/861 +f 869/862/861 853/846/845 871/863/862 +f 873/866/865 869/862/861 872/864/863 +f 874/870/869 870/865/864 873/866/865 +f 876/869/868 845/867/866 875/868/867 +f 875/868/867 844/838/837 868/861/860 +f 868/861/860 854/859/858 870/865/864 +f 875/868/867 870/865/864 874/870/869 +f 867/860/859 877/872/871 878/871/870 +f 843/836/835 842/835/834 877/872/871 +f 879/4060/4029 877/872/871 841/834/833 +f 877/872/871 879/4060/4029 880/873/872 +f 884/877/876 881/874/873 883/876/875 +f 883/876/875 882/875/874 863/855/854 +f 878/871/870 883/876/875 865/857/856 +f 883/876/875 878/871/870 880/873/872 +f 886/879/878 887/882/881 888/880/879 +f 889/881/880 890/883/882 887/882/881 +f 890/883/882 881/874/873 884/877/876 +f 887/882/881 884/877/876 880/873/872 +f 894/889/888 891/884/883 893/886/885 +f 889/881/880 895/887/886 893/886/885 +f 897/890/889 893/886/885 896/888/887 +f 898/1019/1005 894/889/888 897/890/889 +f 886/879/878 899/891/890 895/887/886 +f 885/878/877 900/892/891 899/891/890 +f 900/892/891 901/895/894 902/893/892 +f 899/891/890 902/893/892 896/888/887 +f 902/893/892 903/896/895 904/894/893 +f 901/895/894 905/897/896 903/896/895 +f 905/897/896 906/1523/1492 907/898/897 +f 903/896/895 907/898/897 908/899/898 +f 910/901/900 911/904/903 912/902/901 +f 913/903/902 914/905/904 911/904/903 +f 914/905/904 915/927/926 916/906/905 +f 911/904/903 916/906/905 908/899/898 +f 918/908/907 919/911/910 920/909/908 +f 921/910/909 922/912/911 919/911/910 +f 922/912/911 795/923/922 923/913/912 +f 919/911/910 923/913/912 924/914/913 +f 910/901/900 909/900/899 926/916/915 +f 926/916/915 925/915/914 928/918/917 +f 929/919/918 926/916/915 924/914/913 +f 913/903/902 910/901/900 929/919/918 +f 929/919/918 924/914/913 931/921/920 +f 931/921/920 930/920/919 813/805/805 +f 932/922/921 931/921/920 812/804/804 +f 913/903/902 929/919/918 932/922/921 +f 923/913/912 795/923/922 933/924/923 +f 933/924/923 794/788/788 808/800/800 +f 930/920/919 933/924/923 807/799/799 +f 924/914/913 923/913/912 930/920/919 +f 928/918/917 934/925/924 920/909/908 +f 927/917/916 935/926/925 934/925/924 +f 917/907/906 920/909/908 935/926/925 +f 916/906/905 915/927/926 937/929/928 +f 937/929/928 936/928/927 939/931/930 +f 941/1018/1004 937/929/928 940/932/931 +f 937/929/928 941/1018/1004 908/899/898 +f 939/931/930 938/930/929 943/934/933 +f 943/934/933 942/933/932 945/936/935 +f 947/938/937 943/934/933 946/937/936 +f 940/932/931 939/931/930 947/938/937 +f 945/936/935 948/940/939 949/939/938 +f 944/935/934 950/941/940 948/940/939 +f 950/941/940 951/971/964 952/942/941 +f 948/940/939 952/942/941 953/943/942 +f 189/950/182 188/944/226 955/946/944 +f 955/946/944 954/945/943 957/948/946 +f 959/951/948 955/946/944 958/949/947 +f 190/8916/183 189/950/182 959/951/948 +f 960/952/949 961/954/951 959/951/948 +f 962/953/950 963/955/952 961/954/951 +f 194/957/189 961/954/951 191/956/184 +f 190/8916/183 959/951/948 194/957/189 +f 964/958/953 965/959/954 963/955/952 +f 965/959/954 964/958/953 827/821/821 +f 198/961/190 965/959/954 52/960/50 +f 191/956/184 963/955/952 198/961/190 +f 964/958/953 962/953/950 967/963/956 +f 967/963/956 966/962/955 799/792/792 +f 799/792/792 798/791/791 821/816/816 +f 967/963/956 821/816/816 825/818/818 +f 803/795/795 968/965/958 969/964/957 +f 802/794/794 966/962/955 968/965/958 +f 966/962/955 962/953/950 960/952/949 +f 968/965/958 960/952/949 958/949/947 +f 970/966/959 971/968/961 950/941/940 +f 972/967/960 973/969/962 971/968/961 +f 973/969/962 974/972/965 975/970/963 +f 971/968/961 975/970/963 951/971/964 +f 977/976/969 974/972/965 976/973/966 +f 976/973/966 973/969/962 978/974/967 +f 980/977/970 976/973/966 979/975/968 +f 956/947/945 977/976/969 980/977/970 +f 981/978/971 982/980/973 942/933/932 +f 983/979/972 984/981/974 982/980/973 +f 984/981/974 972/967/960 970/966/959 +f 982/980/973 970/966/959 944/935/934 +f 987/986/979 979/975/968 986/983/976 +f 986/983/976 985/982/975 989/985/978 +f 815/806/806 986/983/976 812/804/804 +f 804/796/796 987/986/979 815/806/806 +f 989/985/978 990/987/980 932/922/921 +f 988/984/977 991/988/981 990/987/980 +f 991/988/981 915/927/926 914/905/904 +f 990/987/980 914/905/904 913/903/902 +f 992/989/982 993/990/983 991/988/981 +f 993/990/983 992/989/982 981/978/971 +f 936/928/927 993/990/983 938/930/929 +f 993/990/983 936/928/927 915/927/926 +f 978/974/967 972/967/960 994/991/984 +f 994/991/984 984/981/974 992/989/982 +f 985/982/975 994/991/984 988/984/977 +f 979/975/968 978/974/967 985/982/975 +f 957/948/946 995/992/985 969/964/957 +f 956/947/945 980/977/970 995/992/985 +f 980/977/970 979/975/968 987/986/979 +f 995/992/985 987/986/979 804/796/796 +f 233/996/225 232/993/230 997/995/987 +f 997/995/987 996/994/986 977/976/969 +f 954/945/943 997/995/987 956/947/945 +f 188/944/226 233/996/225 954/945/943 +f 237/1000/990 236/997/229 999/999/989 +f 999/999/989 998/998/988 975/970/963 +f 996/994/986 999/999/989 974/972/965 +f 232/993/230 237/1000/990 996/994/986 +f 1001/1007/994 244/1001/236 1000/1003/991 +f 1000/1003/991 243/1002/235 1002/1005/992 +f 1004/1008/995 1000/1003/991 1003/1006/993 +f 953/943/942 1001/1007/994 1004/1008/995 +f 247/1009/241 1005/1010/996 998/998/988 +f 244/1001/236 1001/1007/994 1005/1010/996 +f 1001/1007/994 953/943/942 952/942/941 +f 1005/1010/996 952/942/941 951/971/964 +f 1004/1008/995 1006/1011/997 949/939/938 +f 1003/1006/993 1007/1012/998 1006/1011/997 +f 1007/1012/998 1008/1014/1000 1009/1013/999 +f 1006/1011/997 1009/1013/999 946/937/936 +f 1009/1013/999 1010/1015/1001 947/938/937 +f 1008/1014/1000 1011/1016/1002 1010/1015/1001 +f 1011/1016/1002 898/1019/1005 1012/1017/1003 +f 1010/1015/1001 1012/1017/1003 940/932/931 +f 1012/1017/1003 1013/1020/1006 941/1018/1004 +f 898/1019/1005 897/890/889 1013/1020/1006 +f 897/890/889 896/888/887 904/894/893 +f 1013/1020/1006 904/894/893 908/899/898 +f 1014/1021/1007 1015/1023/1009 1011/1016/1002 +f 1016/1022/1008 1017/1024/1010 1015/1023/1009 +f 1017/1024/1010 891/884/883 894/889/888 +f 1015/1023/1009 894/889/888 898/1019/1005 +f 1019/1026/1012 1020/1029/1015 1021/1027/1013 +f 1022/1028/1014 1023/1030/1016 1020/1029/1015 +f 1023/1030/1016 1024/1155/1141 1025/1031/1017 +f 1020/1029/1015 1025/1031/1017 1026/1032/1018 +f 1028/1034/1020 1029/1037/1023 1030/1035/1021 +f 1031/1036/1022 1032/1038/1024 1029/1037/1023 +f 1032/1038/1024 1018/1025/1011 1021/1027/1013 +f 1029/1037/1023 1021/1027/1013 1026/1032/1018 +f 1034/1040/1026 1035/1043/1029 1036/1041/1027 +f 1037/1042/1028 1038/1044/1030 1035/1043/1029 +f 1038/1044/1030 1039/1092/1078 1040/1045/1031 +f 1035/1043/1029 1040/1045/1031 1041/1046/1032 +f 1045/1050/1036 1042/1047/1033 1044/1049/1035 +f 1044/1049/1035 1043/1048/1034 1034/1040/1026 +f 1046/1051/1037 1044/1049/1035 1033/1039/1025 +f 1027/1033/1019 1045/1050/1036 1046/1051/1037 +f 1050/1058/1044 1047/1052/1038 1049/1054/1040 +f 1049/1054/1040 1048/1053/1039 1052/1056/1042 +f 1054/1059/1045 1049/1054/1040 1053/1057/1043 +f 1055/1076/1062 1050/1058/1044 1054/1059/1045 +f 1059/1066/1052 1056/1060/1046 1058/1062/1048 +f 1058/1062/1048 1057/1061/1047 1061/1064/1050 +f 1063/1067/1053 1058/1062/1048 1062/1065/1051 +f 1064/1072/1058 1059/1066/1052 1063/1067/1053 +f 1065/1068/1054 1066/1069/1055 1063/1067/1053 +f 1053/1057/1043 1067/1070/1056 1066/1069/1055 +f 1067/1070/1056 1068/1081/1067 1069/1071/1057 +f 1066/1069/1055 1069/1071/1057 1064/1072/1058 +f 1065/1068/1054 1070/1073/1059 1054/1059/1045 +f 1062/1065/1051 1071/1074/1060 1070/1073/1059 +f 1071/1074/1060 1042/1047/1033 1072/1075/1061 +f 1070/1073/1059 1072/1075/1061 1055/1076/1062 +f 1052/1056/1042 1051/1055/1041 1074/1078/1064 +f 1074/1078/1064 1073/1077/1063 1076/1080/1066 +f 1067/1070/1056 1074/1078/1064 1068/1081/1067 +f 1053/1057/1043 1052/1056/1042 1067/1070/1056 +f 1078/1083/1069 1079/1085/1071 1080/1084/1070 +f 1047/1052/1038 1050/1058/1044 1079/1085/1071 +f 1050/1058/1044 1055/1076/1062 1081/1086/1072 +f 1079/1085/1071 1081/1086/1072 1026/1032/1018 +f 1081/1086/1072 1055/1076/1062 1082/1087/1073 +f 1082/1087/1073 1072/1075/1061 1045/1050/1036 +f 1030/1035/1021 1082/1087/1073 1027/1033/1019 +f 1026/1032/1018 1081/1086/1072 1030/1035/1021 +f 1061/1064/1050 1083/1089/1075 1071/1074/1060 +f 1083/1089/1075 1061/1064/1050 1084/1088/1074 +f 1043/1048/1034 1083/1089/1075 1037/1042/1028 +f 1042/1047/1033 1071/1074/1060 1043/1048/1034 +f 1038/1044/1030 1037/1042/1028 1085/1090/1076 +f 1085/1090/1076 1084/1088/1074 1057/1061/1047 +f 1057/1061/1047 1056/1060/1046 1086/1091/1077 +f 1085/1090/1076 1086/1091/1077 1039/1092/1078 +f 1090/1096/1082 1087/1093/1079 1089/1095/1081 +f 1089/1095/1081 1088/1094/1080 1059/1066/1052 +f 1091/1097/1083 1089/1095/1081 1064/1072/1058 +f 1092/1412/1395 1090/1096/1082 1091/1097/1083 +f 1096/1101/1087 1093/1098/1084 1095/1100/1086 +f 1095/1100/1086 1094/1099/1085 1086/1091/1077 +f 1088/1094/1080 1095/1100/1086 1056/1060/1046 +f 1087/1093/1079 1096/1101/1087 1088/1094/1080 +f 1097/1102/1088 1098/1104/1090 1094/1099/1085 +f 1099/1103/1089 1100/1105/1091 1098/1104/1090 +f 1100/1105/1091 1041/1046/1032 1040/1045/1031 +f 1098/1104/1090 1040/1045/1031 1039/1092/1078 +f 1104/1112/1098 1101/1106/1092 1103/1108/1094 +f 1103/1108/1094 1102/1107/1093 1106/1110/1096 +f 1108/1113/1099 1103/1108/1094 1107/1111/1097 +f 1109/1201/1187 1104/1112/1098 1108/1113/1099 +f 1113/1117/1103 1110/1114/1100 1112/1116/1102 +f 1112/1116/1102 1111/1115/1101 1097/1102/1088 +f 1114/1118/1104 1112/1116/1102 1093/1098/1084 +f 1115/1298/1281 1113/1117/1103 1114/1118/1104 +f 1117/1120/1106 1118/1124/1110 1119/1121/1107 +f 1118/1124/1110 1117/1120/1106 1121/1123/1109 +f 1121/1123/1109 1122/1235/1221 1123/1125/1111 +f 1118/1124/1110 1123/1125/1111 1124/1126/1112 +f 1128/1133/1119 1125/1127/1113 1127/1129/1115 +f 1127/1129/1115 1126/1128/1114 1130/1131/1117 +f 1132/1134/1120 1127/1129/1115 1131/1132/1118 +f 1133/1135/1121 1128/1133/1119 1132/1134/1120 +f 1128/1133/1119 1133/1135/1121 1135/1137/1123 +f 1135/1137/1123 1134/1136/1122 1137/1139/1125 +f 1137/1139/1125 1138/1227/1213 1139/1140/1126 +f 1125/1127/1113 1128/1133/1119 1139/1140/1126 +f 787/781/781 1140/1143/1129 1141/1141/1127 +f 786/1142/1128 1142/1144/1130 1140/1143/1129 +f 1142/1144/1130 1143/1222/1208 1144/1145/1131 +f 1140/1143/1129 1144/1145/1131 1107/1111/1097 +f 1148/1152/1138 1145/1146/1132 1147/1148/1134 +f 1147/1148/1134 1146/1147/1133 1150/1150/1136 +f 1152/1153/1139 1147/1148/1134 1151/1151/1137 +f 1116/1119/1105 1148/1152/1138 1152/1153/1139 +f 1154/1156/1142 1077/1082/1068 1153/1154/1140 +f 1153/1154/1140 1080/1084/1070 1025/1031/1017 +f 1155/1157/1143 1153/1154/1140 1024/1155/1141 +f 1156/1158/1144 1154/1156/1142 1155/1157/1143 +f 1158/1162/1148 1156/1158/1144 1157/1159/1145 +f 1157/1159/1145 1155/1157/1143 1159/1160/1146 +f 1161/1163/1149 1157/1159/1145 1160/1161/1147 +f 1162/1175/1161 1158/1162/1148 1161/1163/1149 +f 1163/1164/1150 1164/1166/1152 1119/1121/1107 +f 1165/1165/1151 1166/1167/1153 1164/1166/1152 +f 1166/1167/1153 1167/1189/1175 1168/1168/1154 +f 1164/1166/1152 1168/1168/1154 1116/1119/1105 +f 1170/1170/1156 1171/1174/1160 1172/1171/1157 +f 1171/1174/1160 1170/1170/1156 1174/1173/1159 +f 1161/1163/1149 1171/1174/1160 1162/1175/1161 +f 1160/1161/1147 1172/1171/1157 1161/1163/1149 +f 1176/1177/1163 1177/1181/1167 1178/1178/1164 +f 1177/1181/1167 1176/1177/1163 1180/1180/1166 +f 1170/1170/1156 1177/1181/1167 1173/1172/1158 +f 1177/1181/1167 1170/1170/1156 1169/1169/1155 +f 1182/1183/1169 1183/1185/1171 1184/1184/1170 +f 1175/1176/1162 1178/1178/1164 1183/1185/1171 +f 1178/1178/1164 1169/1169/1155 1185/1186/1172 +f 1183/1185/1171 1185/1186/1172 1165/1165/1151 +f 1185/1186/1172 1186/1187/1173 1166/1167/1153 +f 1169/1169/1155 1172/1171/1157 1186/1187/1173 +f 1172/1171/1157 1160/1161/1147 1187/1188/1174 +f 1186/1187/1173 1187/1188/1174 1167/1189/1175 +f 1159/1160/1146 1024/1155/1141 1189/1191/1177 +f 1189/1191/1177 1188/1190/1176 1191/1193/1179 +f 1187/1188/1174 1189/1191/1177 1167/1189/1175 +f 1160/1161/1147 1159/1160/1146 1187/1188/1174 +f 1193/1195/1181 1194/1198/1184 1195/1196/1182 +f 1196/1197/1183 1197/1199/1185 1194/1198/1184 +f 1197/1199/1185 1198/1202/1188 1199/1200/1186 +f 1194/1198/1184 1199/1200/1186 1109/1201/1187 +f 1201/1205/1191 1198/1202/1188 1200/1203/1189 +f 1200/1203/1189 1197/1199/1185 1202/1204/1190 +f 1036/1041/1027 1200/1203/1189 1033/1039/1025 +f 1041/1046/1032 1201/1205/1191 1036/1041/1027 +f 1202/1204/1190 1203/1206/1192 1046/1051/1037 +f 1196/1197/1183 1204/1207/1193 1203/1206/1192 +f 1204/1207/1193 1031/1036/1022 1028/1034/1020 +f 1203/1206/1192 1028/1034/1020 1027/1033/1019 +f 1019/1026/1012 1205/1209/1195 1206/1208/1194 +f 1018/1025/1011 1032/1038/1024 1205/1209/1195 +f 1032/1038/1024 1031/1036/1022 1207/1210/1196 +f 1205/1209/1195 1207/1210/1196 1208/1211/1197 +f 1188/1190/1176 1024/1155/1141 1209/1212/1198 +f 1209/1212/1198 1023/1030/1016 1206/1208/1194 +f 1210/1215/1201 1209/1212/1198 1208/1211/1197 +f 1209/1212/1198 1210/1215/1201 1190/1192/1178 +f 1207/1210/1196 1211/1214/1200 1212/1213/1199 +f 1031/1036/1022 1204/1207/1193 1211/1214/1200 +f 1204/1207/1193 1196/1197/1183 1193/1195/1181 +f 1211/1214/1200 1193/1195/1181 1192/1194/1180 +f 1210/1215/1201 1213/1217/1203 1214/1216/1202 +f 1208/1211/1197 1212/1213/1199 1213/1217/1203 +f 1212/1213/1199 1192/1194/1180 1215/1218/1204 +f 1213/1217/1203 1215/1218/1204 1145/1146/1132 +f 1191/1193/1179 1216/1219/1205 1168/1168/1154 +f 1190/1192/1178 1214/1216/1202 1216/1219/1205 +f 1214/1216/1202 1145/1146/1132 1148/1152/1138 +f 1216/1219/1205 1148/1152/1138 1116/1119/1105 +f 1218/1221/1207 1149/1149/1135 1217/1220/1206 +f 1217/1220/1206 1146/1147/1133 1215/1218/1204 +f 1195/1196/1182 1217/1220/1206 1192/1194/1180 +f 1109/1201/1187 1218/1221/1207 1195/1196/1182 +f 1144/1145/1131 1219/1223/1209 1108/1113/1099 +f 1143/1222/1208 1220/1224/1210 1219/1223/1209 +f 1220/1224/1210 1149/1149/1135 1218/1221/1207 +f 1219/1223/1209 1218/1221/1207 1109/1201/1187 +f 1222/1228/1214 1143/1222/1208 1221/1225/1211 +f 1221/1225/1211 1142/1144/1130 1223/1226/1212 +f 1137/1139/1125 1221/1225/1211 1138/1227/1213 +f 1136/1138/1124 1222/1228/1214 1137/1139/1125 +f 1222/1228/1214 1136/1138/1124 1225/1230/1216 +f 1225/1230/1216 1224/1229/1215 1150/1150/1136 +f 1220/1224/1210 1225/1230/1216 1149/1149/1135 +f 1143/1222/1208 1222/1228/1214 1220/1224/1210 +f 1227/1232/1218 1116/1119/1105 1226/1231/1217 +f 1226/1231/1217 1152/1153/1139 1224/1229/1215 +f 1134/1136/1122 1226/1231/1217 1136/1138/1124 +f 1133/1135/1121 1227/1232/1218 1134/1136/1122 +f 1228/1233/1219 1229/1234/1220 1132/1134/1120 +f 1120/1122/1108 1117/1120/1106 1229/1234/1220 +f 1227/1232/1218 1229/1234/1220 1116/1119/1105 +f 1229/1234/1220 1227/1232/1218 1133/1135/1121 +f 1231/1237/1223 1122/1235/1221 1230/1236/1222 +f 1230/1236/1222 1121/1123/1109 1228/1233/1219 +f 1232/1238/1224 1230/1236/1222 1131/1132/1118 +f 1233/1240/1226 1231/1237/1223 1232/1238/1224 +f 1231/1237/1223 1234/1241/1227 1235/1239/1225 +f 1233/1240/1226 1236/1242/1228 1234/1241/1227 +f 1236/1242/1228 1237/1258/1244 1238/1243/1229 +f 1234/1241/1227 1238/1243/1229 1239/1244/1230 +f 1232/1238/1224 1131/1132/1118 1241/1246/1232 +f 1241/1246/1232 1240/1245/1231 1243/1248/1234 +f 1233/1240/1226 1232/1238/1224 1243/1248/1234 +f 1244/1249/1235 1245/1253/1239 1246/1250/1236 +f 1245/1253/1239 1244/1249/1235 1248/1252/1238 +f 1250/8917/9065 1245/1253/1239 1249/1254/1240 +f 1245/1253/1239 1250/8917/9065 1251/1255/1241 +f 1236/1242/1228 1233/1240/1226 1252/1256/1242 +f 1242/1247/1233 1246/1250/1236 1252/1256/1242 +f 1246/1250/1236 1251/1255/1241 1253/1257/1243 +f 1252/1256/1242 1253/1257/1243 1237/1258/1244 +f 1255/1260/1246 1256/1262/1248 1257/1261/1247 +f 1181/1182/1168 1184/1184/1170 1256/1262/1248 +f 1184/1184/1170 1165/1165/1151 1163/1164/1150 +f 1256/1262/1248 1163/1164/1150 1124/1126/1112 +f 1259/1264/1250 1254/1259/1245 1258/1263/1249 +f 1258/1263/1249 1257/1261/1247 1123/1125/1111 +f 1235/1239/1225 1258/1263/1249 1122/1235/1221 +f 1239/1244/1230 1259/1264/1250 1235/1239/1225 +f 1260/1266/1252 1261/1268/1253 506/1267/498 +f 1249/1254/1240 1248/1252/1238 1261/1268/1253 +f 1248/1252/1238 1247/1251/1237 1262/1269/1254 +f 1261/1268/1253 1262/1269/1254 507/1270/499 +f 512/1274/503 507/1270/499 1263/1271/1255 +f 1263/1271/1255 1262/1269/1254 1264/1272/1256 +f 1266/1275/1258 1263/1271/1255 1265/1273/1257 +f 513/1512/505 512/1274/503 1266/1275/1258 +f 1244/1249/1235 1267/1276/1259 1264/1272/1256 +f 1242/1247/1233 1240/1245/1231 1267/1276/1259 +f 1240/1245/1231 1131/1132/1118 1268/1277/1260 +f 1267/1276/1259 1268/1277/1260 1265/1273/1257 +f 1268/1277/1260 1131/1132/1118 1269/1278/1261 +f 1269/1278/1261 1130/1131/1117 1270/1279/1262 +f 1272/1281/1264 1269/1278/1261 1271/1280/1263 +f 1265/1273/1257 1268/1277/1260 1272/1281/1264 +f 1273/1282/1265 1274/1284/1267 527/518/518 +f 1275/1283/1266 1276/1285/1268 1274/1284/1267 +f 1278/1287/1270 1274/1284/1267 1277/1286/1269 +f 528/519/519 527/518/518 1278/1287/1270 +f 1279/1288/1271 1280/1290/1273 1276/1285/1268 +f 1281/1289/1272 1282/1291/1274 1280/1290/1273 +f 1282/1291/1274 1283/1296/1279 1284/1292/1275 +f 1280/1290/1273 1284/1292/1275 1277/1286/1269 +f 1288/1297/1280 1285/1293/1276 1287/1295/1278 +f 1287/1295/1278 1286/1294/1277 1284/1292/1275 +f 1289/1305/1288 1287/1295/1278 1283/1296/1279 +f 1287/1295/1278 1289/1305/1288 1115/1298/1281 +f 1291/1301/1284 1283/1296/1279 1290/1299/1282 +f 1290/1299/1282 1282/1291/1274 1292/1300/1283 +f 1293/1302/1285 1291/1301/1284 1292/1300/1283 +f 1291/1301/1284 1293/1302/1285 1295/1304/1287 +f 1110/1114/1100 1113/1117/1103 1295/1304/1287 +f 1113/1117/1103 1115/1298/1281 1289/1305/1288 +f 1295/1304/1287 1289/1305/1288 1283/1296/1279 +f 871/863/862 852/844/843 1297/1307/1290 +f 1297/1307/1290 1296/1306/1289 1299/1309/1292 +f 1301/1311/1294 1297/1307/1290 1300/1310/1293 +f 872/864/863 871/863/862 1301/1311/1294 +f 1303/1313/1296 1304/1315/1298 1305/1314/1297 +f 788/782/782 1141/1141/1127 1304/1315/1298 +f 1141/1141/1127 1107/1111/1097 1106/1110/1096 +f 1304/1315/1298 1106/1110/1096 1105/1109/1095 +f 859/850/849 780/775/775 1306/1316/1299 +f 1306/1316/1299 783/777/777 1303/1313/1296 +f 1307/1317/1300 1306/1316/1299 1302/1312/1295 +f 850/842/841 859/850/849 1307/1317/1300 +f 851/843/842 850/842/841 1308/1318/1301 +f 1308/1318/1301 1307/1317/1300 1309/1319/1302 +f 1296/1306/1289 1308/1318/1301 1298/1308/1291 +f 852/844/843 851/843/842 1296/1306/1289 +f 1309/1319/1302 1302/1312/1295 1310/1320/1303 +f 1310/1320/1303 1305/1314/1297 1311/1321/1304 +f 1313/1323/1306 1310/1320/1303 1312/1322/1305 +f 1298/1308/1291 1309/1319/1302 1313/1323/1306 +f 1299/1309/1292 1298/1308/1291 1314/1324/1307 +f 1314/1324/1307 1313/1323/1306 1315/1325/1308 +f 1317/1327/1310 1314/1324/1307 1316/1326/1309 +f 1300/1310/1293 1299/1309/1292 1317/1327/1310 +f 1319/1329/1312 1320/1331/1314 1321/1330/1313 +f 1300/1310/1293 1317/1327/1310 1320/1331/1314 +f 1317/1327/1310 1316/1326/1309 1322/1332/1315 +f 1320/1331/1314 1322/1332/1315 1293/1302/1285 +f 1323/1333/1316 1324/1335/1318 1102/1107/1093 +f 1325/1334/1317 1326/1336/1319 1324/1335/1318 +f 1326/1336/1319 1312/1322/1305 1311/1321/1304 +f 1324/1335/1318 1311/1321/1304 1105/1109/1095 +f 1328/1338/1321 1329/1340/1323 1330/1339/1322 +f 1329/1340/1323 1328/1338/1321 1104/1112/1098 +f 1199/1200/1186 1329/1340/1323 1109/1201/1187 +f 1329/1340/1323 1199/1200/1186 1198/1202/1188 +f 1334/1345/1328 1331/1341/1324 1333/1343/1326 +f 1333/1343/1326 1332/1342/1325 1335/1344/1327 +f 1111/1115/1101 1333/1343/1326 1099/1103/1089 +f 1110/1114/1100 1334/1345/1328 1111/1115/1101 +f 1335/1344/1327 1336/1346/1329 1100/1105/1091 +f 1327/1337/1320 1330/1339/1322 1336/1346/1329 +f 1330/1339/1322 1198/1202/1188 1201/1205/1191 +f 1336/1346/1329 1201/1205/1191 1041/1046/1032 +f 1337/1347/1330 1338/1348/1331 1332/1342/1325 +f 1325/1334/1317 1323/1333/1316 1338/1348/1331 +f 1328/1338/1321 1338/1348/1331 1101/1106/1092 +f 1338/1348/1331 1328/1338/1321 1327/1337/1320 +f 1315/1325/1308 1312/1322/1305 1339/1349/1332 +f 1339/1349/1332 1326/1336/1319 1337/1347/1330 +f 1340/1350/1333 1339/1349/1332 1331/1341/1324 +f 1316/1326/1309 1315/1325/1308 1340/1350/1333 +f 1322/1332/1315 1316/1326/1309 1341/1351/1334 +f 1341/1351/1334 1340/1350/1333 1334/1345/1328 +f 1334/1345/1328 1110/1114/1100 1294/1303/1286 +f 1293/1302/1285 1322/1332/1315 1294/1303/1286 +f 1292/1300/1283 1342/1352/1335 1321/1330/1313 +f 1281/1289/1272 1343/1353/1336 1342/1352/1335 +f 1343/1353/1336 1344/1368/1351 1345/1354/1337 +f 1342/1352/1335 1345/1354/1337 1318/1328/1311 +f 1347/1356/1339 1348/1359/1342 1349/1357/1340 +f 1350/1358/1341 1351/1360/1343 1348/1359/1342 +f 1351/1360/1343 1352/1363/1346 1353/1361/1344 +f 1348/1359/1342 1353/1361/1344 1354/1362/1345 +f 1356/1366/1349 1352/1363/1346 1355/1364/1347 +f 1355/1364/1347 1351/1360/1343 1357/1365/1348 +f 608/598/598 1355/1364/1347 605/596/596 +f 610/601/601 1356/1366/1349 608/598/598 +f 1357/1365/1348 1358/1367/1350 613/604/604 +f 1358/1367/1350 1357/1365/1348 1347/1356/1339 +f 1359/1393/1376 1358/1367/1350 1346/1355/1338 +f 1358/1367/1350 1359/1393/1376 614/605/605 +f 1360/1369/1352 1361/1372/1355 1362/1370/1353 +f 1363/1371/1354 1364/1373/1356 1361/1372/1355 +f 1364/1373/1356 1365/1389/1372 1366/1374/1357 +f 1361/1372/1355 1366/1374/1357 1367/1375/1358 +f 1319/1329/1312 1368/1376/1359 1301/1311/1294 +f 1318/1328/1311 1369/1377/1360 1368/1376/1359 +f 1369/1377/1360 1370/1379/1362 1371/1378/1361 +f 1368/1376/1359 1371/1378/1361 872/864/863 +f 1371/1378/1361 1372/1380/1363 873/866/865 +f 1370/1379/1362 1373/1381/1364 1372/1380/1363 +f 1373/1381/1364 1374/1388/1371 1375/1382/1365 +f 1372/1380/1363 1375/1382/1365 874/870/869 +f 1345/1354/1337 1376/1383/1366 1369/1377/1360 +f 1344/1368/1351 1362/1370/1353 1376/1383/1366 +f 1362/1370/1353 1367/1375/1358 1377/1384/1367 +f 1376/1383/1366 1377/1384/1367 1370/1379/1362 +f 1377/1384/1367 1378/1385/1368 1373/1381/1364 +f 1367/1375/1358 1379/1386/1369 1378/1385/1368 +f 1379/1386/1369 1354/1362/1345 1380/1387/1370 +f 1378/1385/1368 1380/1387/1370 1374/1388/1371 +f 1366/1374/1357 1381/1390/1373 1379/1386/1369 +f 1365/1389/1372 1382/1391/1374 1381/1390/1373 +f 1382/1391/1374 1346/1355/1338 1349/1357/1340 +f 1381/1390/1373 1349/1357/1340 1354/1362/1345 +f 1384/1394/1377 640/632/632 1383/1392/1375 +f 1383/1392/1375 639/631/631 1359/1393/1376 +f 1382/1391/1374 1383/1392/1375 1346/1355/1338 +f 1365/1389/1372 1384/1394/1377 1382/1391/1374 +f 1385/1395/1378 1386/1396/1379 1364/1373/1356 +f 644/635/635 642/633/633 1386/1396/1379 +f 642/633/633 640/632/632 1384/1394/1377 +f 1386/1396/1379 1384/1394/1377 1365/1389/1372 +f 1360/1369/1352 1344/1368/1351 1387/1397/1380 +f 1387/1397/1380 1343/1353/1336 1279/1288/1271 +f 1388/1398/1381 1387/1397/1380 1275/1283/1266 +f 1363/1371/1354 1360/1369/1352 1388/1398/1381 +f 1273/1282/1265 1389/1399/1382 1388/1398/1381 +f 526/642/642 648/640/640 1389/1399/1382 +f 648/640/640 644/635/635 1385/1395/1378 +f 1389/1399/1382 1385/1395/1378 1363/1371/1354 +f 651/644/644 1390/1401/1384 1391/1400/1383 +f 528/519/519 1278/1287/1270 1390/1401/1384 +f 1278/1287/1270 1277/1286/1269 1286/1294/1277 +f 1285/1293/1276 1391/1400/1383 1286/1294/1277 +f 1393/1403/1386 657/668/668 1392/1402/1385 +f 1392/1402/1385 656/650/650 1391/1400/1383 +f 1394/1404/1387 1392/1402/1385 1285/1293/1276 +f 1395/1405/1388 1393/1403/1386 1394/1404/1387 +f 1397/1408/1391 1395/1405/1388 1396/1406/1389 +f 1396/1406/1389 1394/1404/1387 1288/1297/1280 +f 1288/1297/1280 1115/1298/1281 1398/1407/1390 +f 1396/1406/1389 1398/1407/1390 1399/1409/1392 +f 1402/1413/1396 1399/1409/1392 1401/1411/1394 +f 1401/1411/1394 1400/1410/1393 1090/1096/1082 +f 1403/8918/9066 1401/1411/1394 1092/1412/1395 +f 1401/1411/1394 1403/8918/9066 1404/1414/1397 +f 1398/1407/1390 1115/1298/1281 1405/1415/1398 +f 1405/1415/1398 1114/1118/1104 1096/1101/1087 +f 1400/1410/1393 1405/1415/1398 1087/1093/1079 +f 1399/1409/1392 1398/1407/1390 1400/1410/1393 +f 1397/1408/1391 1406/1417/1400 1407/1416/1399 +f 1406/1417/1400 1397/1408/1391 1402/1413/1396 +f 1402/1413/1396 1404/1414/1397 1408/1418/1401 +f 1406/1417/1400 1408/1418/1401 1409/1419/1402 +f 1393/1403/1386 1410/1421/1404 676/1420/1403 +f 1395/1405/1388 1407/1416/1399 1410/1421/1404 +f 1407/1416/1399 1409/1419/1402 1411/1422/1405 +f 1410/1421/1404 1411/1422/1405 677/670/670 +f 796/789/789 795/923/922 1412/1423/1406 +f 1412/1423/1406 922/912/911 1413/1424/1407 +f 1415/1426/1409 1412/1423/1406 1414/1425/1408 +f 797/790/790 796/789/789 1415/1426/1409 +f 822/814/814 818/811/811 1417/1428/1411 +f 1417/1428/1411 1416/1427/1410 1419/1430/1413 +f 835/829/828 1417/1428/1411 834/828/827 +f 823/815/815 822/814/814 835/829/828 +f 1419/1430/1413 1418/1429/1412 1421/1432/1415 +f 1421/1432/1415 1420/1431/1414 1423/1434/1417 +f 832/825/824 1421/1432/1415 829/823/822 +f 834/828/827 1419/1430/1413 832/825/824 +f 817/810/810 789/783/783 1424/1435/1418 +f 1424/1435/1418 792/785/785 1425/1436/1419 +f 1416/1427/1410 1424/1435/1418 1418/1429/1412 +f 818/811/811 817/810/810 1416/1427/1410 +f 1425/1436/1419 797/790/790 1426/1437/1420 +f 1426/1437/1420 1415/1426/1409 1427/1438/1421 +f 1420/1431/1414 1426/1437/1420 1422/1433/1416 +f 1418/1429/1412 1425/1436/1419 1420/1431/1414 +f 1431/1445/1428 1428/1439/1422 1430/1441/1424 +f 1430/1441/1424 1429/1440/1423 1433/1443/1426 +f 1435/1446/1429 1430/1441/1424 1434/1444/1427 +f 1436/1461/1444 1431/1445/1428 1435/1446/1429 +f 1437/1447/1430 1438/1450/1433 1017/1024/1010 +f 1438/1450/1433 1437/1447/1430 1440/1449/1432 +f 1440/1449/1432 1441/1453/1436 1442/1451/1434 +f 1438/1450/1433 1442/1451/1434 891/884/883 +f 892/885/884 891/884/883 1443/1452/1435 +f 1443/1452/1435 1442/1451/1434 1444/1454/1437 +f 890/883/882 1443/1452/1435 881/874/873 +f 889/881/880 892/885/884 890/883/882 +f 1444/1454/1437 1441/1453/1436 1446/1456/1439 +f 1446/1456/1439 1445/1455/1438 1448/1458/1441 +f 882/875/874 1446/1456/1439 860/852/851 +f 881/874/873 1444/1454/1437 882/875/874 +f 1440/1449/1432 1439/1448/1431 1450/1460/1443 +f 1450/1460/1443 1449/1459/1442 1451/1462/1445 +f 1445/1455/1438 1450/1460/1443 1447/1457/1440 +f 1441/1453/1436 1440/1449/1432 1445/1455/1438 +f 1455/1466/1449 1452/1463/1446 1454/1465/1448 +f 1454/1465/1448 1453/1464/1447 781/776/776 +f 856/848/847 1454/1465/1448 780/775/775 +f 855/847/846 1455/1466/1449 856/848/847 +f 1223/1226/1212 786/1142/1128 1456/1467/1450 +f 1456/1467/1450 785/780/780 1453/1464/1447 +f 1457/1468/1451 1456/1467/1450 1452/1463/1446 +f 1138/1227/1213 1223/1226/1212 1457/1468/1451 +f 1459/1471/1454 1125/1127/1113 1458/1469/1452 +f 1138/1227/1213 1457/1468/1451 1458/1469/1452 +f 1457/1468/1451 1452/1463/1446 1460/1470/1453 +f 1458/1469/1452 1460/1470/1453 1434/1444/1427 +f 1455/1466/1449 1461/1473/1456 1462/1472/1455 +f 855/847/846 861/853/852 1461/1473/1456 +f 861/853/852 860/852/851 1448/1458/1441 +f 1461/1473/1456 1448/1458/1441 1447/1457/1440 +f 1451/1462/1445 1463/1474/1457 1462/1472/1455 +f 1436/1461/1444 1435/1446/1429 1463/1474/1457 +f 1435/1446/1429 1434/1444/1427 1460/1470/1453 +f 1463/1474/1457 1460/1470/1453 1452/1463/1446 +f 1007/1012/998 1003/1006/993 1465/1476/1459 +f 1465/1476/1459 1464/1475/1458 1467/1478/1461 +f 1014/1021/1007 1465/1476/1459 1016/1022/1008 +f 1465/1476/1459 1014/1021/1007 1008/1014/1000 +f 1467/1478/1461 1466/1477/1460 1469/1480/1463 +f 1469/1480/1463 1468/1479/1462 1471/1482/1465 +f 1437/1447/1430 1469/1480/1463 1439/1448/1431 +f 1016/1022/1008 1467/1478/1461 1437/1447/1430 +f 1002/1005/992 242/1004/234 1472/1484/1466 +f 1472/1484/1466 741/1483/735 1473/1486/1467 +f 1464/1475/1458 1472/1484/1466 1466/1477/1460 +f 1003/1006/993 1002/1005/992 1464/1475/1458 +f 746/1488/740 1474/1491/1469 1475/1489/1468 +f 745/1490/739 1476/1492/1470 1474/1491/1469 +f 1477/1493/1471 1474/1491/1469 1428/1439/1422 +f 1470/1481/1464 1475/1489/1468 1477/1493/1471 +f 1473/1486/1467 740/1485/734 1478/1495/1472 +f 1478/1495/1472 750/1494/745 1475/1489/1468 +f 1468/1479/1462 1478/1495/1472 1470/1481/1464 +f 1466/1477/1460 1473/1486/1467 1468/1479/1462 +f 1471/1482/1465 1470/1481/1464 1479/1496/1473 +f 1479/1496/1473 1477/1493/1471 1431/1445/1428 +f 1449/1459/1442 1479/1496/1473 1436/1461/1444 +f 1439/1448/1431 1471/1482/1465 1449/1459/1442 +f 1270/1279/1262 1480/1498/1475 1481/1497/1474 +f 1129/1130/1116 1126/1128/1114 1480/1498/1475 +f 1126/1128/1114 1125/1127/1113 1482/1499/1476 +f 1480/1498/1475 1482/1499/1476 1483/1500/1477 +f 760/1502/754 1484/1505/1479 1485/1503/1478 +f 759/1504/753 1486/1506/1480 1484/1505/1479 +f 1487/1507/1481 1484/1505/1479 1483/1500/1477 +f 1432/1442/1425 1485/1503/1478 1487/1507/1481 +f 1433/1443/1426 1488/1508/1482 1459/1471/1454 +f 1432/1442/1425 1487/1507/1481 1488/1508/1482 +f 1487/1507/1481 1483/1500/1477 1482/1499/1476 +f 1488/1508/1482 1482/1499/1476 1125/1127/1113 +f 1266/1275/1258 1265/1273/1257 1489/1509/1483 +f 1489/1509/1483 1272/1281/1264 1490/1510/1484 +f 1490/1510/1484 764/1513/758 767/1511/760 +f 1489/1509/1483 767/1511/760 513/1512/505 +f 1490/1510/1484 1491/1515/1485 769/1514/763 +f 1271/1280/1263 1481/1497/1474 1491/1515/1485 +f 1481/1497/1474 1483/1500/1477 1486/1506/1480 +f 759/1504/753 769/1514/763 1486/1506/1480 +f 771/1516/766 1492/1517/1486 1476/1492/1470 +f 761/1501/756 1485/1503/1478 1492/1517/1486 +f 1429/1440/1423 1492/1517/1486 1432/1442/1425 +f 1428/1439/1422 1476/1492/1470 1429/1440/1423 +f 1493/1518/1487 1494/1520/1489 925/915/914 +f 1495/1519/1488 1496/1521/1490 1494/1520/1489 +f 1498/5082/5053 1494/1520/1489 1497/1522/1491 +f 1494/1520/1489 1498/5082/5053 927/917/916 +f 907/898/897 906/1523/1492 1500/1525/1494 +f 1500/1525/1494 1499/1524/1493 1493/1518/1487 +f 912/902/901 1500/1525/1494 909/900/899 +f 908/899/898 907/898/897 912/902/901 +f 1502/1527/1496 1503/1531/1500 1504/1528/1497 +f 1503/1531/1500 1502/1527/1496 1506/1530/1499 +f 1503/1531/1500 1506/1530/1499 1507/1532/1501 +f 1511/1539/1508 1508/1533/1502 1510/1535/1504 +f 1510/1535/1504 1509/1534/1503 1513/1537/1506 +f 1515/1540/1509 1510/1535/1504 1514/1538/1507 +f 1516/1544/1513 1511/1539/1508 1515/1540/1509 +f 1520/1545/1514 1517/1541/1510 1519/1543/1512 +f 1519/1543/1512 1518/1542/1511 1511/1539/1508 +f 1521/1546/1515 1519/1543/1512 1516/1544/1513 +f 1522/1645/1614 1520/1545/1514 1521/1546/1515 +f 1526/1551/1520 1523/1547/1516 1525/1549/1518 +f 1525/1549/1518 1524/1548/1517 1527/1550/1519 +f 1518/1542/1511 1525/1549/1518 1508/1533/1502 +f 1517/1541/1510 1526/1551/1520 1518/1542/1511 +f 1527/1550/1519 1505/1529/1498 1528/1552/1521 +f 1501/1526/1495 1529/1553/1522 1528/1552/1521 +f 1509/1534/1503 1528/1552/1521 1512/1536/1505 +f 1508/1533/1502 1527/1550/1519 1509/1534/1503 +f 1530/1554/1523 1531/1557/1526 1532/1555/1524 +f 1533/1556/1525 1534/1558/1527 1531/1557/1526 +f 1534/1558/1527 1535/1630/1599 1536/1559/1528 +f 1531/1557/1526 1536/1559/1528 1537/1560/1529 +f 1530/1554/1523 1514/1538/1507 1538/1561/1530 +f 1538/1561/1530 1513/1537/1506 1539/1562/1531 +f 1541/1564/1533 1538/1561/1530 1540/1563/1532 +f 1533/1556/1525 1530/1554/1523 1541/1564/1533 +f 1539/1562/1531 1512/1536/1505 1542/1565/1534 +f 1542/1565/1534 1529/1553/1522 1543/1566/1535 +f 1545/1568/1537 1542/1565/1534 1544/1567/1536 +f 1540/1563/1532 1539/1562/1531 1545/1568/1537 +f 1543/1566/1535 1501/1526/1495 1546/1569/1538 +f 1546/1569/1538 1504/1528/1497 1547/1570/1539 +f 1547/1570/1539 1548/1572/1541 1549/1571/1540 +f 1544/1567/1536 1543/1566/1535 1549/1571/1540 +f 1551/1574/1543 1548/1572/1541 1550/1573/1542 +f 1550/1573/1542 1547/1570/1539 1506/1530/1499 +f 1524/1548/1517 1550/1573/1542 1505/1529/1498 +f 1523/1547/1516 1551/1574/1543 1524/1548/1517 +f 1555/1581/1550 1552/1575/1544 1554/1577/1546 +f 1554/1577/1546 1553/1576/1545 1557/1579/1548 +f 1559/1582/1551 1554/1577/1546 1558/1580/1549 +f 1560/1664/1633 1555/1581/1550 1559/1582/1551 +f 1562/1584/1553 1563/1588/1557 1564/1585/1554 +f 1563/1588/1557 1562/1584/1553 1566/1587/1556 +f 1566/1587/1556 1567/1602/1571 1568/1589/1558 +f 1563/1588/1557 1568/1589/1558 1569/1590/1559 +f 1571/1592/1561 1572/1594/1563 1573/1593/1562 +f 1572/1594/1563 1571/1592/1561 1564/1585/1554 +f 1564/1585/1554 1569/1590/1559 1574/1595/1564 +f 1556/1578/1547 1573/1593/1562 1574/1595/1564 +f 1576/1597/1566 1577/1600/1569 1578/1598/1567 +f 1579/1599/1568 1580/1601/1570 1577/1600/1569 +f 1566/1587/1556 1577/1600/1569 1567/1602/1571 +f 1577/1600/1569 1566/1587/1556 1565/1586/1555 +f 1582/1604/1573 1583/1607/1576 1584/1605/1574 +f 1585/1606/1575 1586/1608/1577 1583/1607/1576 +f 1586/1608/1577 1587/1611/1580 1588/1609/1578 +f 1583/1607/1576 1588/1609/1578 1589/1610/1579 +f 1588/1609/1578 1587/1611/1580 1591/1613/1582 +f 1592/1614/1583 1593/1615/1584 1591/1613/1582 +f 1593/1615/1584 1594/1661/1630 1595/1616/1585 +f 1591/1613/1582 1595/1616/1585 1589/1610/1579 +f 1599/1621/1590 1596/1617/1586 1598/1619/1588 +f 1579/1599/1568 1576/1597/1566 1598/1619/1588 +f 1576/1597/1566 1575/1596/1565 1600/1620/1589 +f 1598/1619/1588 1600/1620/1589 1601/1622/1591 +f 1602/1623/1592 1603/1625/1594 1599/1621/1590 +f 1604/1624/1593 1605/1626/1595 1603/1625/1594 +f 1607/1628/1597 1603/1625/1594 1606/1627/1596 +f 1596/1617/1586 1599/1621/1590 1607/1628/1597 +f 1536/1559/1528 1608/1631/1600 1609/1629/1598 +f 1535/1630/1599 1610/1632/1601 1608/1631/1600 +f 1610/1632/1601 1611/1637/1606 1612/1633/1602 +f 1608/1631/1600 1612/1633/1602 1613/1634/1603 +f 1582/1604/1573 1581/1603/1572 1615/1636/1605 +f 1615/1636/1605 1614/1635/1604 1612/1633/1602 +f 1616/1638/1607 1615/1636/1605 1611/1637/1606 +f 1585/1606/1575 1582/1604/1573 1616/1638/1607 +f 1617/1639/1608 1618/1641/1610 1605/1626/1595 +f 1619/1640/1609 1620/1642/1611 1618/1641/1610 +f 1620/1642/1611 1621/1648/1617 1622/1643/1612 +f 1618/1641/1610 1622/1643/1612 1606/1627/1596 +f 1623/1644/1613 1624/1646/1615 1620/1642/1611 +f 1522/1645/1614 1521/1546/1515 1624/1646/1615 +f 1521/1546/1515 1516/1544/1513 1625/1647/1616 +f 1624/1646/1615 1625/1647/1616 1621/1648/1617 +f 1625/1647/1616 1626/1650/1619 1627/1649/1618 +f 1516/1544/1513 1515/1540/1509 1626/1650/1619 +f 1515/1540/1509 1514/1538/1507 1532/1555/1524 +f 1626/1650/1619 1532/1555/1524 1537/1560/1529 +f 1622/1643/1612 1628/1652/1621 1629/1651/1620 +f 1621/1648/1617 1627/1649/1618 1628/1652/1621 +f 1627/1649/1618 1537/1560/1529 1609/1629/1598 +f 1613/1634/1603 1629/1651/1620 1609/1629/1598 +f 1629/1651/1620 1630/1653/1622 1607/1628/1597 +f 1613/1634/1603 1614/1635/1604 1630/1653/1622 +f 1614/1635/1604 1581/1603/1572 1631/1654/1623 +f 1630/1653/1622 1631/1654/1623 1596/1617/1586 +f 1632/1655/1624 1633/1656/1625 1584/1605/1574 +f 1579/1599/1568 1597/1618/1587 1633/1656/1625 +f 1597/1618/1587 1596/1617/1586 1631/1654/1623 +f 1633/1656/1625 1631/1654/1623 1581/1603/1572 +f 1580/1601/1570 1634/1658/1627 1635/1657/1626 +f 1634/1658/1627 1580/1601/1570 1632/1655/1624 +f 1634/1658/1627 1632/1655/1624 1589/1610/1579 +f 1568/1589/1558 1636/1660/1629 1637/1659/1628 +f 1567/1602/1571 1635/1657/1626 1636/1660/1629 +f 1635/1657/1626 1589/1610/1579 1595/1616/1585 +f 1636/1660/1629 1595/1616/1585 1594/1661/1630 +f 1557/1579/1548 1638/1663/1632 1639/1662/1631 +f 1556/1578/1547 1574/1595/1564 1638/1663/1632 +f 1637/1659/1628 1638/1663/1632 1569/1590/1559 +f 1594/1661/1630 1639/1662/1631 1637/1659/1628 +f 1641/1668/1637 1560/1664/1633 1640/1665/1634 +f 1640/1665/1634 1559/1582/1551 1642/1666/1635 +f 1644/1669/1638 1640/1665/1634 1643/1667/1636 +f 1645/1815/1784 1641/1668/1637 1644/1669/1638 +f 1642/1666/1635 1646/1671/1640 1647/1670/1639 +f 1558/1580/1549 1639/1662/1631 1646/1671/1640 +f 1593/1615/1584 1646/1671/1640 1594/1661/1630 +f 1592/1614/1583 1647/1670/1639 1593/1615/1584 +f 1648/1672/1641 1649/1675/1644 1553/1576/1545 +f 1649/1675/1644 1648/1672/1641 1651/1674/1643 +f 1651/1674/1643 1570/1591/1560 1573/1593/1562 +f 1649/1675/1644 1573/1593/1562 1556/1578/1547 +f 1655/1680/1649 1652/1676/1645 1654/1678/1647 +f 1656/1679/1648 1657/1681/1650 1654/1678/1647 +f 1658/1721/1690 1655/1680/1649 1657/1681/1650 +f 1660/1683/1652 1661/1686/1655 1662/1684/1653 +f 1663/1685/1654 1664/1687/1656 1661/1686/1655 +f 1664/1687/1656 1665/1691/1660 1666/1688/1657 +f 1661/1686/1655 1666/1688/1657 1667/1689/1658 +f 1666/1688/1657 1668/1692/1661 1669/1690/1659 +f 1665/1691/1660 1670/1693/1662 1668/1692/1661 +f 1670/1693/1662 1671/1700/1669 1672/1694/1663 +f 1668/1692/1661 1672/1694/1663 1673/1695/1664 +f 1674/1696/1665 1675/1697/1666 1670/1693/1662 +f 1652/1676/1645 1676/1698/1667 1675/1697/1666 +f 1676/1698/1667 1677/1725/1694 1678/1699/1668 +f 1675/1697/1666 1678/1699/1668 1671/1700/1669 +f 1679/1701/1670 1680/1702/1671 1664/1687/1656 +f 1680/1702/1671 1679/1701/1670 1653/1677/1646 +f 1653/1677/1646 1652/1676/1645 1674/1696/1665 +f 1680/1702/1671 1674/1696/1665 1665/1691/1660 +f 1684/1708/1677 1681/1703/1672 1683/1705/1674 +f 1683/1705/1674 1682/1704/1673 1686/1707/1676 +f 1687/1709/1678 1683/1705/1674 1659/1682/1651 +f 1688/1781/1750 1684/1708/1677 1687/1709/1678 +f 1690/1711/1680 1691/1713/1682 1692/1712/1681 +f 1663/1685/1654 1660/1683/1652 1691/1713/1682 +f 1660/1683/1652 1659/1682/1651 1686/1707/1676 +f 1691/1713/1682 1686/1707/1676 1685/1706/1675 +f 1694/1715/1684 1695/1717/1686 1696/1716/1685 +f 1656/1679/1648 1679/1701/1670 1695/1717/1686 +f 1679/1701/1670 1663/1685/1654 1690/1711/1680 +f 1695/1717/1686 1690/1711/1680 1689/1710/1679 +f 1700/1722/1691 1697/1718/1687 1699/1720/1689 +f 1658/1721/1690 1657/1681/1650 1699/1720/1689 +f 1657/1681/1650 1656/1679/1648 1694/1715/1684 +f 1699/1720/1689 1694/1715/1684 1693/1714/1683 +f 1655/1680/1649 1701/1723/1692 1676/1698/1667 +f 1658/1721/1690 1698/1719/1688 1701/1723/1692 +f 1698/1719/1688 1697/1718/1687 1702/1724/1693 +f 1701/1723/1692 1702/1724/1693 1677/1725/1694 +f 1704/1727/1696 1705/1731/1700 1706/1728/1697 +f 1705/1731/1700 1704/1727/1696 1708/1730/1699 +f 1555/1581/1550 1705/1731/1700 1552/1575/1544 +f 1560/1664/1633 1706/1728/1697 1555/1581/1550 +f 1712/1738/1707 1709/1732/1701 1711/1734/1703 +f 1711/1734/1703 1710/1733/1702 1714/1736/1705 +f 1716/1739/1708 1711/1734/1703 1715/1737/1706 +f 1717/1740/1709 1712/1738/1707 1716/1739/1708 +f 1719/1744/1713 1717/1740/1709 1718/1741/1710 +f 1718/1741/1710 1716/1739/1708 1720/1742/1711 +f 1722/1745/1714 1718/1741/1710 1721/1743/1712 +f 1707/1729/1698 1719/1744/1713 1722/1745/1714 +f 1723/1746/1715 1724/1748/1717 1710/1733/1702 +f 1725/1747/1716 1726/1749/1718 1724/1748/1717 +f 1726/1749/1718 1727/1765/1734 1728/1750/1719 +f 1713/1735/1704 1710/1733/1702 1728/1750/1719 +f 1732/1757/1726 1729/1751/1720 1731/1753/1722 +f 1731/1753/1722 1730/1752/1721 1734/1755/1724 +f 1734/1755/1724 1735/1800/1769 1736/1756/1725 +f 1731/1753/1722 1736/1756/1725 1737/1758/1727 +f 1741/1764/1733 1738/1759/1728 1740/1761/1730 +f 1742/1762/1731 1743/1763/1732 1740/1761/1730 +f 1743/1763/1732 1729/1751/1720 1732/1757/1726 +f 1740/1761/1730 1732/1757/1726 1737/1758/1727 +f 1745/1769/1738 1727/1765/1734 1744/1766/1735 +f 1744/1766/1735 1726/1749/1718 1746/1767/1736 +f 1748/1770/1739 1744/1766/1735 1747/1768/1737 +f 1749/1776/1745 1745/1769/1738 1748/1770/1739 +f 1753/1777/1746 1750/1771/1740 1752/1773/1742 +f 1752/1773/1742 1751/1772/1741 1755/1775/1744 +f 1748/1770/1739 1752/1773/1742 1749/1776/1745 +f 1747/1768/1737 1753/1777/1746 1748/1770/1739 +f 1759/1782/1751 1756/1778/1747 1758/1780/1749 +f 1758/1780/1749 1757/1779/1748 1684/1708/1677 +f 1760/1783/1752 1758/1780/1749 1688/1781/1750 +f 1761/1785/1754 1759/1782/1751 1760/1783/1752 +f 1759/1782/1751 1762/1786/1755 1763/1784/1753 +f 1761/1785/1754 1764/1787/1756 1762/1786/1755 +f 1764/1787/1756 1735/1800/1769 1734/1755/1724 +f 1762/1786/1755 1734/1755/1724 1733/1754/1723 +f 1768/1793/1762 1765/1788/1757 1767/1790/1759 +f 1767/1790/1759 1766/1789/1758 1770/1792/1761 +f 1751/1772/1741 1767/1790/1759 1754/1774/1743 +f 1750/1771/1740 1768/1793/1762 1751/1772/1741 +f 1772/1796/1765 1667/1689/1658 1771/1794/1763 +f 1771/1794/1763 1669/1690/1659 1773/1795/1764 +f 1766/1789/1758 1771/1794/1763 1769/1791/1760 +f 1765/1788/1757 1772/1796/1765 1766/1789/1758 +f 1687/1709/1678 1659/1682/1651 1774/1797/1766 +f 1774/1797/1766 1662/1684/1653 1772/1796/1765 +f 1775/1798/1767 1774/1797/1766 1765/1788/1757 +f 1688/1781/1750 1687/1709/1678 1775/1798/1767 +f 1775/1798/1767 1776/1799/1768 1760/1783/1752 +f 1776/1799/1768 1775/1798/1767 1768/1793/1762 +f 1777/1802/1771 1776/1799/1768 1750/1771/1740 +f 1776/1799/1768 1777/1802/1771 1761/1785/1754 +f 1779/1803/1772 1735/1800/1769 1778/1801/1770 +f 1778/1801/1770 1764/1787/1756 1777/1802/1771 +f 1777/1802/1771 1750/1771/1740 1753/1777/1746 +f 1747/1768/1737 1779/1803/1772 1753/1777/1746 +f 1779/1803/1772 1747/1768/1737 1780/1804/1773 +f 1780/1804/1773 1746/1767/1736 1781/1805/1774 +f 1736/1756/1725 1780/1804/1773 1737/1758/1727 +f 1735/1800/1769 1779/1803/1772 1736/1756/1725 +f 1781/1805/1774 1725/1747/1716 1782/1806/1775 +f 1782/1806/1775 1723/1746/1715 1783/1807/1776 +f 1737/1758/1727 1781/1805/1774 1783/1807/1776 +f 1741/1764/1733 1737/1758/1727 1784/1808/1777 +f 1784/1808/1777 1783/1807/1776 1712/1738/1707 +f 1785/1809/1778 1784/1808/1777 1717/1740/1709 +f 1738/1759/1728 1741/1764/1733 1785/1809/1778 +f 1719/1744/1713 1786/1810/1779 1785/1809/1778 +f 1786/1810/1779 1719/1744/1713 1704/1727/1696 +f 1787/1816/1785 1786/1810/1779 1703/1726/1695 +f 1786/1810/1779 1787/1816/1785 1738/1759/1728 +f 1789/1812/1781 1790/1814/1783 1791/1813/1782 +f 1703/1726/1695 1706/1728/1697 1790/1814/1783 +f 1706/1728/1697 1560/1664/1633 1641/1668/1637 +f 1790/1814/1783 1641/1668/1637 1645/1815/1784 +f 1787/1816/1785 1792/1817/1786 1739/1760/1729 +f 1792/1817/1786 1787/1816/1785 1789/1812/1781 +f 1793/8919/9067 1792/1817/1786 1788/1811/1780 +f 1792/1817/1786 1793/8919/9067 1742/1762/1731 +f 1722/1745/1714 1721/1743/1712 1795/1819/1788 +f 1795/1819/1788 1794/1818/1787 1648/1672/1641 +f 1708/1730/1699 1795/1819/1788 1552/1575/1544 +f 1707/1729/1698 1722/1745/1714 1708/1730/1699 +f 1797/1821/1790 1798/1824/1793 1799/1822/1791 +f 1800/1823/1792 1801/1825/1794 1798/1824/1793 +f 1801/1825/1794 1802/1843/1812 1803/1826/1795 +f 1798/1824/1793 1803/1826/1795 1804/1827/1796 +f 1808/1834/1803 1805/1828/1797 1807/1830/1799 +f 1807/1830/1799 1806/1829/1798 1810/1832/1801 +f 1812/1835/1804 1807/1830/1799 1811/1833/1802 +f 1813/1887/1856 1808/1834/1803 1812/1835/1804 +f 1815/1837/1806 1816/1841/1810 1817/1838/1807 +f 1816/1841/1810 1815/1837/1806 1819/1840/1809 +f 1819/1840/1809 627/617/617 630/620/620 +f 1816/1841/1810 630/620/620 102/100/100 +f 1803/1826/1795 1820/1844/1813 1821/1842/1811 +f 1802/1843/1812 1822/1845/1814 1820/1844/1813 +f 1822/1845/1814 1823/1863/1832 1824/1846/1815 +f 1820/1844/1813 1824/1846/1815 1825/1847/1816 +f 1827/1851/1820 1818/1839/1808 1826/1848/1817 +f 1814/1836/1805 1828/1849/1818 1826/1848/1817 +f 1828/1849/1818 1829/1852/1821 1830/1850/1819 +f 1825/1847/1816 1827/1851/1820 1830/1850/1819 +f 1830/1850/1819 1829/1852/1821 1832/1854/1823 +f 1832/1854/1823 1831/1853/1822 1834/1856/1825 +f 1836/1858/1827 1832/1854/1823 1835/1857/1826 +f 1825/1847/1816 1830/1850/1819 1836/1858/1827 +f 1836/1858/1827 1835/1857/1826 1838/1860/1829 +f 1838/1860/1829 1837/1859/1828 1840/1862/1831 +f 1821/1842/1811 1838/1860/1829 1804/1827/1796 +f 1825/1847/1816 1836/1858/1827 1821/1842/1811 +f 1824/1846/1815 1823/1863/1832 1842/1865/1834 +f 1842/1865/1834 1841/1864/1833 1844/1867/1836 +f 1827/1851/1820 1842/1865/1834 1818/1839/1808 +f 1825/1847/1816 1824/1846/1815 1827/1851/1820 +f 1844/1867/1836 1845/1868/1837 1819/1840/1809 +f 1843/1866/1835 1846/1869/1838 1845/1868/1837 +f 1846/1869/1838 604/624/624 635/627/627 +f 1845/1868/1837 635/627/627 627/617/617 +f 1848/1871/1840 1849/1874/1843 1850/1872/1841 +f 1851/1873/1842 1852/1875/1844 1849/1874/1843 +f 1852/1875/1844 1853/1879/1848 1854/1876/1845 +f 1849/1874/1843 1854/1876/1845 1855/1877/1846 +f 1857/1881/1850 1855/1877/1846 1856/1878/1847 +f 1853/1879/1848 1858/1880/1849 1856/1878/1847 +f 1858/1880/1849 1811/1833/1802 1810/1832/1801 +f 1856/1878/1847 1810/1832/1801 1809/1831/1800 +f 1848/1871/1840 1847/1870/1839 1860/1883/1852 +f 1861/1884/1853 1862/1885/1854 1860/1883/1852 +f 1864/1949/1918 1860/1883/1852 1863/1886/1855 +f 1860/1883/1852 1864/1949/1918 1851/1873/1842 +f 1865/1888/1857 1866/1891/1860 1867/1889/1858 +f 1868/1890/1859 1869/1892/1861 1866/1891/1860 +f 1869/1892/1861 1800/1823/1792 1797/1821/1790 +f 1796/1820/1789 1867/1889/1858 1866/1891/1860 +f 1870/1893/1862 1871/1895/1864 1812/1835/1804 +f 1872/1894/1863 1873/1896/1865 1871/1895/1864 +f 1873/1896/1865 1868/1890/1859 1865/1888/1857 +f 1871/1895/1864 1865/1888/1857 1813/1887/1856 +f 1877/1903/1872 1874/1897/1866 1876/1899/1868 +f 1876/1899/1868 1875/1898/1867 1879/1901/1870 +f 1881/1904/1873 1876/1899/1868 1880/1902/1871 +f 1882/2003/1972 1877/1903/1872 1881/1904/1873 +f 1875/1898/1867 1874/1897/1866 1884/1906/1875 +f 1884/1906/1875 1883/1905/1874 1886/1908/1877 +f 1888/1910/1879 1884/1906/1875 1887/1909/1878 +f 1878/1900/1869 1875/1898/1867 1888/1910/1879 +f 1879/1901/1870 1878/1900/1869 1890/1912/1881 +f 1890/1912/1881 1889/1911/1880 1892/1914/1883 +f 1894/1916/1885 1890/1912/1881 1893/1915/1884 +f 1880/1902/1871 1879/1901/1870 1894/1916/1885 +f 1888/1910/1879 1895/1918/1887 1889/1911/1880 +f 1895/1918/1887 1888/1910/1879 1896/1917/1886 +f 1898/1929/1898 1895/1918/1887 1897/1919/1888 +f 1895/1918/1887 1898/1929/1898 1891/1913/1882 +f 1899/1920/1889 1900/1922/1891 1822/1845/1814 +f 1901/1921/1890 1902/1923/1892 1900/1922/1891 +f 1902/1923/1892 1903/1932/1901 1904/1924/1893 +f 1900/1922/1891 1904/1924/1893 1823/1863/1832 +f 1905/1925/1894 1906/1927/1896 1801/1825/1794 +f 1907/1926/1895 1908/1928/1897 1906/1927/1896 +f 1908/1928/1897 1901/1921/1890 1899/1920/1889 +f 1906/1927/1896 1899/1920/1889 1802/1843/1812 +f 1910/1933/1902 1891/1913/1882 1909/1930/1899 +f 1909/1930/1899 1898/1929/1898 1911/1931/1900 +f 1902/1923/1892 1909/1930/1899 1903/1932/1901 +f 1901/1921/1890 1910/1933/1902 1902/1923/1892 +f 1908/1928/1897 1907/1926/1895 1913/1935/1904 +f 1913/1935/1904 1912/1934/1903 1892/1914/1883 +f 1910/1933/1902 1913/1935/1904 1891/1913/1882 +f 1913/1935/1904 1910/1933/1902 1901/1921/1890 +f 1914/1936/1905 1915/1938/1907 1869/1892/1861 +f 1916/1937/1906 1917/1939/1908 1915/1938/1907 +f 1917/1939/1908 1907/1926/1895 1905/1925/1894 +f 1915/1938/1907 1905/1925/1894 1800/1823/1792 +f 1918/1940/1909 1919/1942/1911 1873/1896/1865 +f 1920/1941/1910 1921/1943/1912 1919/1942/1911 +f 1921/1943/1912 1916/1937/1906 1914/1936/1905 +f 1919/1942/1911 1914/1936/1905 1868/1890/1859 +f 1922/1944/1913 1923/1946/1915 1921/1943/1912 +f 1924/1945/1914 1925/1947/1916 1923/1946/1915 +f 1927/1995/1964 1923/1946/1915 1926/1948/1917 +f 1923/1946/1915 1927/1995/1964 1916/1937/1906 +f 1864/1949/1918 1928/1952/1921 1929/1950/1919 +f 1928/1952/1921 1864/1949/1918 1930/1951/1920 +f 1930/1951/1920 1931/1969/1938 1932/1953/1922 +f 1933/1959/1928 1929/1950/1919 1932/1953/1922 +f 1934/1954/1923 1935/1956/1925 1858/1880/1849 +f 1936/1955/1924 1937/1957/1926 1935/1956/1925 +f 1937/1957/1926 1872/1894/1863 1870/1893/1862 +f 1935/1956/1925 1870/1893/1862 1811/1833/1802 +f 1934/1954/1923 1853/1879/1848 1938/1958/1927 +f 1938/1958/1927 1852/1875/1844 1929/1950/1919 +f 1939/1960/1929 1938/1958/1927 1933/1959/1928 +f 1936/1955/1924 1934/1954/1923 1939/1960/1929 +f 1918/1940/1909 1872/1894/1863 1940/1961/1930 +f 1940/1961/1930 1937/1957/1926 1941/1962/1931 +f 1943/1964/1933 1940/1961/1930 1942/1963/1932 +f 1920/1941/1910 1918/1940/1909 1943/1964/1933 +f 1941/1962/1931 1936/1955/1924 1944/1965/1934 +f 1933/1959/1928 1945/1966/1935 1944/1965/1934 +f 1947/1968/1937 1944/1965/1934 1946/1967/1936 +f 1942/1963/1932 1941/1962/1931 1947/1968/1937 +f 1932/1953/1922 1948/1970/1939 1945/1966/1935 +f 1931/1969/1938 1949/1971/1940 1948/1970/1939 +f 1949/1971/1940 1950/1974/1943 1951/1972/1941 +f 1948/1970/1939 1951/1972/1941 1946/1967/1936 +f 1951/1972/1941 1952/1975/1944 1953/1973/1942 +f 1950/1974/1943 1954/1976/1945 1952/1975/1944 +f 1954/1976/1945 1955/2017/1986 1956/1977/1946 +f 1952/1975/1944 1956/1977/1946 1957/1978/1947 +f 1959/1981/1950 1942/1963/1932 1958/1979/1948 +f 1958/1979/1948 1947/1968/1937 1953/1973/1942 +f 1953/1973/1942 1957/1978/1947 1960/1980/1949 +f 1958/1979/1948 1960/1980/1949 1961/1982/1951 +f 1922/1944/1913 1920/1941/1910 1962/1983/1952 +f 1962/1983/1952 1943/1964/1933 1959/1981/1950 +f 1963/1984/1953 1962/1983/1952 1961/1982/1951 +f 1924/1945/1914 1922/1944/1913 1963/1984/1953 +f 1963/1984/1953 1961/1982/1951 1965/1986/1955 +f 1965/1986/1955 1964/1985/1954 1967/1988/1957 +f 1969/1990/1959 1965/1986/1955 1968/1989/1958 +f 1924/1945/1914 1963/1984/1953 1969/1990/1959 +f 1925/1947/1916 1970/1992/1961 1971/1991/1960 +f 1924/1945/1914 1969/1990/1959 1970/1992/1961 +f 1969/1990/1959 1968/1989/1958 1972/1993/1962 +f 1970/1992/1961 1972/1993/1962 1973/1994/1963 +f 1927/1995/1964 1974/1997/1966 1917/1939/1908 +f 1974/1997/1966 1927/1995/1964 1975/1996/1965 +f 1912/1934/1903 1974/1997/1966 1893/1915/1884 +f 1907/1926/1895 1917/1939/1908 1912/1934/1903 +f 1975/1996/1965 1976/1998/1967 1894/1916/1885 +f 1926/1948/1917 1971/1991/1960 1976/1998/1967 +f 1971/1991/1960 1973/1994/1963 1977/1999/1968 +f 1976/1998/1967 1977/1999/1968 1880/1902/1871 +f 1977/1999/1968 1978/2000/1969 1881/1904/1873 +f 1973/1994/1963 1979/2001/1970 1978/2000/1969 +f 1979/2001/1970 1980/2007/1976 1981/2002/1971 +f 1978/2000/1969 1981/2002/1971 1882/2003/1972 +f 1972/1993/1962 1982/2004/1973 1979/2001/1970 +f 1968/1989/1958 1983/2005/1974 1982/2004/1973 +f 1983/2005/1974 1984/2012/1981 1985/2006/1975 +f 1982/2004/1973 1985/2006/1975 1980/2007/1976 +f 1967/1988/1957 1966/1987/1956 1987/2009/1978 +f 1987/2009/1978 1986/2008/1977 1989/2011/1980 +f 1983/2005/1974 1987/2009/1978 1984/2012/1981 +f 1968/1989/1958 1967/1988/1957 1983/2005/1974 +f 1991/2014/1983 1992/2016/1985 1993/2015/1984 +f 1966/1987/1956 1964/1985/1954 1992/2016/1985 +f 1964/1985/1954 1961/1982/1951 1960/1980/1949 +f 1992/2016/1985 1960/1980/1949 1957/1978/1947 +f 1956/1977/1946 1994/2018/1987 1993/2015/1984 +f 1955/2017/1986 1995/2019/1988 1994/2018/1987 +f 1995/2019/1988 1996/2021/1990 1997/2020/1989 +f 1994/2018/1987 1997/2020/1989 1990/2013/1982 +f 1997/2020/1989 1996/2021/1990 1999/2023/1992 +f 1999/2023/1992 1998/2022/1991 2001/2025/1994 +f 2003/2027/1996 1999/2023/1992 2002/2026/1995 +f 1990/2013/1982 1997/2020/1989 2003/2027/1996 +f 1991/2014/1983 1990/2013/1982 2004/2028/1997 +f 2002/2026/1995 2005/2029/1998 2004/2028/1997 +f 2005/2029/1998 1988/2010/1979 1986/2008/1977 +f 1966/1987/1956 1991/2014/1983 1986/2008/1977 +f 72/69/69 71/2030/1999 2007/2032/2001 +f 2007/2032/2001 2006/2031/2000 2009/2034/2003 +f 2011/2036/2005 2007/2032/2001 2010/2035/2004 +f 73/70/70 72/69/69 2011/2036/2005 +f 104/99/99 73/70/70 2012/2037/2006 +f 2012/2037/2006 2011/2036/2005 2013/2038/2007 +f 1817/1838/1807 2012/2037/2006 1814/1836/1805 +f 102/100/100 104/99/99 1817/1838/1807 +f 2017/2044/2013 2014/2039/2008 2016/2041/2010 +f 2016/2041/2010 2015/2040/2009 2019/2043/2012 +f 1831/1853/1822 2016/2041/2010 1833/1855/1824 +f 1829/1852/1821 2017/2044/2013 1831/1853/1822 +f 2013/2038/2007 2020/2045/2014 1828/1849/1818 +f 2010/2035/2004 2021/2046/2015 2020/2045/2014 +f 2021/2046/2015 2014/2039/2008 2017/2044/2013 +f 2020/2045/2014 2017/2044/2013 1829/1852/1821 +f 2009/2034/2003 2022/2047/2016 2021/2046/2015 +f 2008/2033/2002 2023/2048/2017 2022/2047/2016 +f 2023/2048/2017 2024/3007/2976 2025/2049/2018 +f 2022/2047/2016 2025/2049/2018 2014/2039/2008 +f 1808/1834/1803 2026/2051/2020 2027/2050/2019 +f 1813/1887/1856 1867/1889/1858 2026/2051/2020 +f 2028/2052/2021 2026/2051/2020 1867/1889/1858 +f 2029/2053/2022 2027/2050/2019 2028/2052/2021 +f 2031/2055/2024 2029/2053/2022 2030/2054/2023 +f 1796/1820/1789 1799/1822/1791 2030/2054/2023 +f 1799/1822/1791 1804/1827/1796 1840/1862/1831 +f 1839/1861/1830 2031/2055/2024 1840/1862/1831 +f 2035/2059/2028 2032/2056/2025 2034/2058/2027 +f 2034/2058/2027 2033/2057/2026 1896/1917/1886 +f 2036/2060/2029 2034/2058/2027 1887/1909/1878 +f 2037/2301/2270 2035/2059/2028 2036/2060/2029 +f 1886/1908/1877 2038/2061/2030 2036/2060/2029 +f 1885/1907/1876 2039/2062/2031 2038/2061/2030 +f 2037/2301/2270 2036/2060/2029 2039/2062/2031 +f 2041/2064/2033 2042/2066/2035 2043/2065/2034 +f 2042/2066/2035 2041/2064/2033 609/600/600 +f 2044/2067/2036 2042/2066/2035 596/588/588 +f 2045/2068/2037 2043/2065/2034 2044/2067/2036 +f 2047/2070/2039 2045/2068/2037 2046/2069/2038 +f 2046/2069/2038 2044/2067/2036 599/594/594 +f 1846/1869/1838 2046/2069/2038 604/624/624 +f 1843/1866/1835 2047/2070/2039 1846/1869/1838 +f 1904/1924/1893 2048/2071/2040 1841/1864/1833 +f 1903/1932/1901 2049/2072/2041 2048/2071/2040 +f 2049/2072/2041 2045/2068/2037 2047/2070/2039 +f 2048/2071/2040 2047/2070/2039 1843/1866/1835 +f 1911/1931/1900 1897/1919/1888 2050/2073/2042 +f 2050/2073/2042 2033/2057/2026 2051/2074/2043 +f 2049/2072/2041 2050/2073/2042 2045/2068/2037 +f 1903/1932/1901 1911/1931/1900 2049/2072/2041 +f 2051/2074/2043 2052/2075/2044 2043/2065/2034 +f 2032/2056/2025 2035/2059/2028 2052/2075/2044 +f 2035/2059/2028 2037/2301/2270 2053/2076/2045 +f 2052/2075/2044 2053/2076/2045 2040/2063/2032 +f 2057/2083/2052 2054/2077/2046 2056/2079/2048 +f 2056/2079/2048 2055/2078/2047 2059/2081/2050 +f 2061/2084/2053 2056/2079/2048 2060/2082/2051 +f 2062/2103/2072 2057/2083/2052 2061/2084/2053 +f 2064/2086/2055 2065/2090/2059 2066/2087/2056 +f 2065/2090/2059 2064/2086/2055 2068/2089/2058 +f 2070/2291/2260 2065/2090/2059 2069/2091/2060 +f 2065/2090/2059 2070/2291/2260 2071/2092/2061 +f 1375/1382/1365 1374/1388/1371 2073/2094/2063 +f 2073/2094/2063 2072/2093/2062 2075/2096/2065 +f 2077/2098/2067 2073/2094/2063 2076/2097/2066 +f 874/870/869 1375/1382/1365 2077/2098/2067 +f 2079/2100/2069 2080/2102/2071 2081/2101/2070 +f 2080/2102/2071 2079/2100/2069 2057/2083/2052 +f 2082/2104/2073 2080/2102/2071 2062/2103/2072 +f 2083/2116/2085 2081/2101/2070 2082/2104/2073 +f 2087/2108/2077 2084/2105/2074 2086/2107/2076 +f 2086/2107/2076 2085/2106/2075 2075/2096/2065 +f 2088/2109/2078 2086/2107/2076 2074/2095/2064 +f 2083/2116/2085 2087/2108/2077 2088/2109/2078 +f 2090/2111/2080 2091/2114/2083 2092/2112/2081 +f 2093/2113/2082 2094/2115/2084 2091/2114/2083 +f 2094/2115/2084 2084/2105/2074 2087/2108/2077 +f 2091/2114/2083 2087/2108/2077 2083/2116/2085 +f 2095/2117/2086 2096/2119/2088 2082/2104/2073 +f 2097/2118/2087 2098/2120/2089 2096/2119/2088 +f 2092/2112/2081 2096/2119/2088 2089/2110/2079 +f 2096/2119/2088 2092/2112/2081 2083/2116/2085 +f 2099/2121/2090 2100/2123/2092 2088/2109/2078 +f 2101/2122/2091 2102/2124/2093 2100/2123/2092 +f 2081/2101/2070 2100/2123/2092 2078/2099/2068 +f 2100/2123/2092 2081/2101/2070 2083/2116/2085 +f 1380/1387/1370 1354/1362/1345 2104/2126/2095 +f 2104/2126/2095 2103/2125/2094 2099/2121/2090 +f 2072/2093/2062 2104/2126/2095 2074/2095/2064 +f 1374/1388/1371 1380/1387/1370 2072/2093/2062 +f 2106/2128/2097 2107/2132/2101 2108/2129/2098 +f 2107/2132/2101 2106/2128/2097 2110/2131/2100 +f 2110/2131/2100 2111/2144/2113 2112/2133/2102 +f 2107/2132/2101 2112/2133/2102 2113/2134/2103 +f 2114/2135/2104 2115/2136/2105 2064/2086/2055 +f 2105/2127/2096 2108/2129/2098 2115/2136/2105 +f 2108/2129/2098 2113/2134/2103 2116/2137/2106 +f 2115/2136/2105 2116/2137/2106 2067/2088/2057 +f 2118/2139/2108 2119/2142/2111 2120/2140/2109 +f 2121/2141/2110 2122/2143/2112 2119/2142/2111 +f 2110/2131/2100 2119/2142/2111 2111/2144/2113 +f 2119/2142/2111 2110/2131/2100 2109/2130/2099 +f 2059/2081/2050 2058/2080/2049 2124/2146/2115 +f 2124/2146/2115 2123/2145/2114 2126/2148/2117 +f 2127/2149/2118 2124/2146/2115 2071/2092/2061 +f 2060/2082/2051 2059/2081/2050 2127/2149/2118 +f 2126/2148/2117 2125/2147/2116 2129/2151/2120 +f 2129/2151/2120 2128/2150/2119 2131/2153/2122 +f 2066/2087/2056 2129/2151/2120 2063/2085/2054 +f 2071/2092/2061 2126/2148/2117 2066/2087/2056 +f 2133/2155/2124 2134/2158/2127 2135/2156/2125 +f 2136/2157/2126 2137/2159/2128 2134/2158/2127 +f 1877/1903/1872 2134/2158/2127 1874/1897/1866 +f 1882/2003/1972 2135/2156/2125 1877/1903/1872 +f 2141/2163/2132 2138/2160/2129 2140/2162/2131 +f 2140/2162/2131 2139/2161/2130 1883/1905/1874 +f 2137/2159/2128 2140/2162/2131 1874/1897/1866 +f 2136/2157/2126 2141/2163/2132 2137/2159/2128 +f 2143/2165/2134 2144/2168/2137 2145/2166/2135 +f 2146/2167/2136 2147/2169/2138 2144/2168/2137 +f 2147/2169/2138 2136/2157/2126 2133/2155/2124 +f 2144/2168/2137 2133/2155/2124 2132/2154/2123 +f 2151/2173/2142 2148/2170/2139 2150/2172/2141 +f 2150/2172/2141 2149/2171/2140 2141/2163/2132 +f 2147/2169/2138 2150/2172/2141 2136/2157/2126 +f 2146/2167/2136 2151/2173/2142 2147/2169/2138 +f 2153/2175/2144 2154/2178/2147 2155/2176/2145 +f 2156/2177/2146 2157/2179/2148 2154/2178/2147 +f 2157/2179/2148 2054/2077/2046 2079/2100/2069 +f 2154/2178/2147 2079/2100/2069 2078/2099/2068 +f 2157/2179/2148 2156/2177/2146 2159/2181/2150 +f 2159/2181/2150 2158/2180/2149 2161/2183/2152 +f 2055/2078/2047 2159/2181/2150 2058/2080/2049 +f 2054/2077/2046 2157/2179/2148 2055/2078/2047 +f 2153/2175/2144 2152/2174/2143 2163/2185/2154 +f 2163/2185/2154 2162/2184/2153 2151/2173/2142 +f 2164/2186/2155 2163/2185/2154 2146/2167/2136 +f 2156/2177/2146 2153/2175/2144 2164/2186/2155 +f 2143/2165/2134 2165/2187/2156 2164/2186/2155 +f 2142/2164/2133 2166/2188/2157 2165/2187/2156 +f 2166/2188/2157 2160/2182/2151 2158/2180/2149 +f 2165/2187/2156 2158/2180/2149 2156/2177/2146 +f 2161/2183/2152 2160/2182/2151 2168/2190/2159 +f 2168/2190/2159 2167/2189/2158 2170/2192/2161 +f 2123/2145/2114 2168/2190/2159 2125/2147/2116 +f 2058/2080/2049 2161/2183/2152 2123/2145/2114 +f 2170/2192/2161 2169/2191/2160 2172/2194/2163 +f 2172/2194/2163 2171/2193/2162 2174/2196/2165 +f 2128/2150/2119 2172/2194/2163 2130/2152/2121 +f 2125/2147/2116 2170/2192/2161 2128/2150/2119 +f 2178/2202/2171 2175/2197/2166 2177/2199/2168 +f 2177/2199/2168 2176/2198/2167 2180/2201/2170 +f 2171/2193/2162 2177/2199/2168 2173/2195/2164 +f 2169/2191/2160 2178/2202/2171 2171/2193/2162 +f 2184/2207/2176 2181/2203/2172 2183/2205/2174 +f 2117/2138/2107 2120/2140/2109 2183/2205/2174 +f 2120/2140/2109 2109/2130/2099 2185/2206/2175 +f 2186/2212/2181 2184/2207/2176 2185/2206/2175 +f 2131/2153/2122 2130/2152/2121 2188/2209/2178 +f 2188/2209/2178 2187/2208/2177 2190/2211/2180 +f 2114/2135/2104 2188/2209/2178 2105/2127/2096 +f 2063/2085/2054 2131/2153/2122 2114/2135/2104 +f 2185/2206/2175 2191/2214/2183 2192/2213/2182 +f 2109/2130/2099 2106/2128/2097 2191/2214/2183 +f 2106/2128/2097 2105/2127/2096 2190/2211/2180 +f 2191/2214/2183 2190/2211/2180 2189/2210/2179 +f 2194/2216/2185 2195/2218/2187 2196/2217/2186 +f 2189/2210/2179 2187/2208/2177 2195/2218/2187 +f 2187/2208/2177 2130/2152/2121 2174/2196/2165 +f 2195/2218/2187 2174/2196/2165 2173/2195/2164 +f 2198/2220/2189 2199/2222/2191 2200/2221/2190 +f 2186/2212/2181 2192/2213/2182 2199/2222/2191 +f 2192/2213/2182 2189/2210/2179 2194/2216/2185 +f 2199/2222/2191 2194/2216/2185 2193/2215/2184 +f 2204/2226/2195 2201/2223/2192 2203/2225/2194 +f 2203/2225/2194 2202/2224/2193 2184/2207/2176 +f 2198/2220/2189 2203/2225/2194 2186/2212/2181 +f 2197/2219/2188 2204/2226/2195 2198/2220/2189 +f 2206/2228/2197 2207/2230/2199 2208/2229/2198 +f 2207/2230/2199 2206/2228/2197 2204/2226/2195 +f 2209/2232/2201 2207/2230/2199 2197/2219/2188 +f 2207/2230/2199 2209/2232/2201 2210/2231/2200 +f 2209/2232/2201 2211/2234/2203 2212/2233/2202 +f 2197/2219/2188 2200/2221/2190 2211/2234/2203 +f 2200/2221/2190 2193/2215/2184 2213/2235/2204 +f 2211/2234/2203 2213/2235/2204 2214/2236/2205 +f 2213/2235/2204 2215/2238/2207 2216/2237/2206 +f 2193/2215/2184 2196/2217/2186 2215/2238/2207 +f 2196/2217/2186 2173/2195/2164 2180/2201/2170 +f 2215/2238/2207 2180/2201/2170 2179/2200/2169 +f 2218/2240/2209 2219/2244/2213 2220/2241/2210 +f 2219/2244/2213 2218/2240/2209 2222/2243/2212 +f 2216/2237/2206 2219/2244/2213 2214/2236/2205 +f 2179/2200/2169 2220/2241/2210 2216/2237/2206 +f 2224/2246/2215 2217/2239/2208 2223/2245/2214 +f 2179/2200/2169 2176/2198/2167 2223/2245/2214 +f 2225/2247/2216 2223/2245/2214 2175/2197/2166 +f 2226/2250/2219 2224/2246/2215 2225/2247/2216 +f 2227/2248/2217 2228/2249/2218 2166/2188/2157 +f 2228/2249/2218 2227/2248/2217 2178/2202/2171 +f 2167/2189/2158 2228/2249/2218 2169/2191/2160 +f 2160/2182/2151 2166/2188/2157 2167/2189/2158 +f 2230/2252/2221 2226/2250/2219 2229/2251/2220 +f 2229/2251/2220 2225/2247/2216 2227/2248/2217 +f 2145/2166/2135 2229/2251/2220 2142/2164/2133 +f 2132/2154/2123 2230/2252/2221 2145/2166/2135 +f 2231/2253/2222 2232/2254/2223 1981/2002/1971 +f 2232/2254/2223 2231/2253/2222 2230/2252/2221 +f 2135/2156/2125 2232/2254/2223 2132/2154/2123 +f 2232/2254/2223 2135/2156/2125 1882/2003/1972 +f 1985/2006/1975 1984/2012/1981 2234/2256/2225 +f 2234/2256/2225 2233/2255/2224 2224/2246/2215 +f 2231/2253/2222 2234/2256/2225 2226/2250/2219 +f 2234/2256/2225 2231/2253/2222 1980/2007/1976 +f 1989/2011/1980 2235/2258/2227 2233/2255/2224 +f 2235/2258/2227 1989/2011/1980 2236/2257/2226 +f 2236/2257/2226 2221/2242/2211 2218/2240/2209 +f 2235/2258/2227 2218/2240/2209 2217/2239/2208 +f 2222/2243/2212 2237/2259/2228 2212/2233/2202 +f 2221/2242/2211 2238/2260/2229 2237/2259/2228 +f 2238/2260/2229 2239/8920/9068 2240/2261/2230 +f 2237/2259/2228 2240/2261/2230 2210/2231/2200 +f 2242/2263/2232 2243/2265/2234 2244/2264/2233 +f 2205/2227/2196 2208/2229/2198 2243/2265/2234 +f 2208/2229/2198 2210/2231/2200 2240/2261/2230 +f 2239/8920/9068 2244/2264/2233 2240/2261/2230 +f 2246/2268/2237 2002/2026/1995 2245/2266/2235 +f 2245/2266/2235 2001/2025/1994 2247/2267/2236 +f 2244/2264/2233 2245/2266/2235 2241/2262/2231 +f 2239/8920/9068 2246/2268/2237 2244/2264/2233 +f 2005/2029/1998 2248/2269/2238 2236/2257/2226 +f 2002/2026/1995 2246/2268/2237 2248/2269/2238 +f 2246/2268/2237 2239/8920/9068 2238/2260/2229 +f 2248/2269/2238 2238/2260/2229 2221/2242/2211 +f 2250/2271/2240 2251/2274/2243 2252/2272/2241 +f 2253/2273/2242 2254/2275/2244 2251/2274/2243 +f 2254/2275/2244 2255/831/4273 840/837/836 +f 2251/2274/2243 840/837/836 845/867/866 +f 2256/2276/2245 2257/2277/2246 2077/2098/2067 +f 2249/2270/2239 2252/2272/2241 2257/2277/2246 +f 2252/2272/2241 845/867/866 876/869/868 +f 2257/2277/2246 876/869/868 874/870/869 +f 2258/2278/2247 2259/2280/2249 2094/2115/2084 +f 2260/2279/2248 2261/2281/2250 2259/2280/2249 +f 2261/2281/2250 2262/2283/2252 2263/2282/2251 +f 2259/2280/2249 2263/2282/2251 2084/2105/2074 +f 2263/2282/2251 2262/2283/2252 2265/2285/2254 +f 2265/2285/2254 2264/2284/2253 2256/2276/2245 +f 2085/2106/2075 2265/2285/2254 2076/2097/2066 +f 2084/2105/2074 2263/2282/2251 2085/2106/2075 +f 2269/2289/2258 2266/2286/2255 2268/2288/2257 +f 2268/2288/2257 2267/2287/2256 2250/2271/2240 +f 2264/2284/2253 2268/2288/2257 2249/2270/2239 +f 2262/2283/2252 2269/2289/2258 2264/2284/2253 +f 2271/2293/2262 2060/2082/2051 2270/2290/2259 +f 2270/2290/2259 2127/2149/2118 2070/2291/2260 +f 2070/2291/2260 2069/2091/2060 2272/2292/2261 +f 2270/2290/2259 2272/2292/2261 2273/2294/2263 +f 2095/2117/2086 2062/2103/2072 2274/2295/2264 +f 2060/2082/2051 2271/2293/2262 2274/2295/2264 +f 2271/2293/2262 2273/2294/2263 2275/2296/2265 +f 2274/2295/2264 2275/2296/2265 2097/2118/2087 +f 2149/2171/2140 2276/2299/2268 2277/2297/2266 +f 2276/2299/2268 2149/2171/2140 2278/2298/2267 +f 2278/2298/2267 2279/2312/2281 2280/2300/2269 +f 2276/2299/2268 2280/2300/2269 2037/2301/2270 +f 2139/2161/2130 2281/2302/2271 2039/2062/2031 +f 2281/2302/2271 2139/2161/2130 2277/2297/2266 +f 2037/2301/2270 2039/2062/2031 2277/2297/2266 +f 1356/1366/1349 2282/2304/2273 2283/2303/2272 +f 610/601/601 2041/2064/2033 2282/2304/2273 +f 2041/2064/2033 2040/2063/2032 2284/2305/2274 +f 2282/2304/2273 2284/2305/2274 2285/2306/2275 +f 1353/1361/1344 2286/2307/2276 2103/2125/2094 +f 1352/1363/1346 2283/2303/2272 2286/2307/2276 +f 2283/2303/2272 2285/2306/2275 2287/2308/2277 +f 2286/2307/2276 2287/2308/2277 2101/2122/2091 +f 2287/2308/2277 2285/2306/2275 2289/2310/2279 +f 2152/2174/2143 2155/2176/2145 2289/2310/2279 +f 2155/2176/2145 2078/2099/2068 2102/2124/2093 +f 2101/2122/2091 2287/2308/2277 2102/2124/2093 +f 2290/2311/2280 2291/2313/2282 2288/2309/2278 +f 2279/2312/2281 2278/2298/2267 2291/2313/2282 +f 2162/2184/2153 2291/2313/2282 2148/2170/2139 +f 2152/2174/2143 2288/2309/2278 2162/2184/2153 +f 2053/2076/2045 2037/2301/2270 2292/2314/2283 +f 2292/2314/2283 2280/2300/2269 2290/2311/2280 +f 2284/2305/2274 2292/2314/2283 2285/2306/2275 +f 2040/2063/2032 2053/2076/2045 2284/2305/2274 +f 2296/2321/2290 2293/2315/2284 2295/2317/2286 +f 2295/2317/2286 2294/2316/2285 2298/2319/2288 +f 2300/2322/2291 2295/2317/2286 2299/2320/2289 +f 772/767/767 2296/2321/2290 2300/2322/2291 +f 2302/2324/2293 2303/2327/2296 2304/2325/2294 +f 2305/2326/2295 2306/2328/2297 2303/2327/2296 +f 2308/2331/2300 2303/2327/2296 2307/2329/2298 +f 2303/2327/2296 2308/2331/2300 2309/2330/2299 +f 2311/2334/2303 2309/2330/2299 2310/2332/2301 +f 2310/2332/2301 2308/2331/2300 2312/2333/2302 +f 2298/2319/2288 2310/2332/2301 2299/2320/2289 +f 2297/2318/2287 2311/2334/2303 2298/2319/2288 +f 2314/2336/2305 2315/2339/2308 2316/2337/2306 +f 2317/2338/2307 2318/2340/2309 2315/2339/2308 +f 2318/2340/2309 2319/2414/2383 2320/2341/2310 +f 2315/2339/2308 2320/2341/2310 2321/2342/2311 +f 2314/2336/2305 2322/2344/2313 2323/2343/2312 +f 2313/2335/2304 2324/2345/2314 2322/2344/2313 +f 2326/5858/5830 2322/2344/2313 2325/2346/2315 +f 2322/2344/2313 2326/5858/5830 2327/2347/2316 +f 2329/2351/2320 2317/2338/2307 2328/2348/2317 +f 2328/2348/2317 2323/2343/2312 2330/2349/2318 +f 2332/2352/2321 2328/2348/2317 2331/2350/2319 +f 2333/2380/2349 2329/2351/2320 2332/2352/2321 +f 2337/2359/2328 2334/2353/2322 2336/2355/2324 +f 2336/2355/2324 2335/2354/2323 2339/2357/2326 +f 2341/2360/2329 2336/2355/2324 2340/2358/2327 +f 2342/2387/2356 2337/2359/2328 2341/2360/2329 +f 2346/2366/2335 2343/2361/2330 2345/2363/2332 +f 2345/2363/2332 2344/2362/2331 2348/2365/2334 +f 2349/2367/2336 2345/2363/2332 2334/2353/2322 +f 2350/2385/2354 2346/2366/2335 2349/2367/2336 +f 2352/2369/2338 2353/2371/2340 2354/2370/2339 +f 2331/2350/2319 2355/2372/2341 2353/2371/2340 +f 2355/2372/2341 2356/3118/3087 2357/2373/2342 +f 2353/2371/2340 2357/2373/2342 2358/2374/2343 +f 2359/2375/2344 2360/2377/2346 2361/2376/2345 +f 2351/2368/2337 2354/2370/2339 2360/2377/2346 +f 2354/2370/2339 2358/2374/2343 2362/2378/2347 +f 2360/2377/2346 2362/2378/2347 2363/2379/2348 +f 2365/2382/2351 2333/2380/2349 2364/2381/2350 +f 2364/2381/2350 2332/2352/2321 2352/2369/2338 +f 2366/2383/2352 2364/2381/2350 2351/2368/2337 +f 2347/2364/2333 2365/2382/2351 2366/2383/2352 +f 2348/2365/2334 2347/2364/2333 2367/2384/2353 +f 2367/2384/2353 2366/2383/2352 2359/2375/2344 +f 2335/2354/2323 2367/2384/2353 2338/2356/2325 +f 2334/2353/2322 2348/2365/2334 2335/2354/2323 +f 2369/2388/2357 2350/2385/2354 2368/2386/2355 +f 2368/2386/2355 2349/2367/2336 2337/2359/2328 +f 2370/2389/2358 2368/2386/2355 2342/2387/2356 +f 2371/2393/2362 2369/2388/2357 2370/2389/2358 +f 2375/2394/2363 2372/2390/2359 2374/2392/2361 +f 2374/2392/2361 2373/2391/2360 2369/2388/2357 +f 2376/2395/2364 2374/2392/2361 2371/2393/2362 +f 2377/2459/2428 2375/2394/2363 2376/2395/2364 +f 2381/2399/2368 2378/2396/2365 2380/2398/2367 +f 2380/2398/2367 2379/2397/2366 2346/2366/2335 +f 2373/2391/2360 2380/2398/2367 2350/2385/2354 +f 2372/2390/2359 2381/2399/2368 2373/2391/2360 +f 2383/2401/2370 2384/2404/2373 2385/2402/2371 +f 2386/2403/2372 2387/2405/2374 2384/2404/2373 +f 2387/2405/2374 2388/2420/2389 2389/2406/2375 +f 2384/2404/2373 2389/2406/2375 2390/2407/2376 +f 2394/2413/2382 2391/2408/2377 2393/2410/2379 +f 2393/2410/2379 2392/2409/2378 2396/2412/2381 +f 2389/2406/2375 2393/2410/2379 2390/2407/2376 +f 2388/2420/2389 2394/2413/2382 2389/2406/2375 +f 2397/2415/2384 2398/2418/2387 2399/2416/2385 +f 2400/2417/2386 2401/2419/2388 2398/2418/2387 +f 2401/2419/2388 2391/2408/2377 2394/2413/2382 +f 2398/2418/2387 2394/2413/2382 2388/2420/2389 +f 2392/2409/2378 2402/2422/2391 2403/2421/2390 +f 2391/2408/2377 2404/2423/2392 2402/2422/2391 +f 2404/2423/2392 2378/2396/2365 2405/2424/2393 +f 2402/2422/2391 2405/2424/2393 2406/2425/2394 +f 2401/2419/2388 2407/2426/2395 2404/2423/2392 +f 2400/2417/2386 2408/2427/2396 2407/2426/2395 +f 2408/2427/2396 2343/2361/2330 2379/2397/2366 +f 2407/2426/2395 2379/2397/2366 2378/2396/2365 +f 2410/2429/2398 2333/2380/2349 2409/2428/2397 +f 2347/2364/2333 2344/2362/2331 2409/2428/2397 +f 2408/2427/2396 2409/2428/2397 2343/2361/2330 +f 2400/2417/2386 2410/2429/2398 2408/2427/2396 +f 2397/2415/2384 2319/2414/2383 2411/2430/2399 +f 2411/2430/2399 2318/2340/2309 2329/2351/2320 +f 2410/2429/2398 2411/2430/2399 2333/2380/2349 +f 2400/2417/2386 2397/2415/2384 2410/2429/2398 +f 2387/2405/2374 2386/2403/2372 2413/2432/2401 +f 2413/2432/2401 2412/2431/2400 2320/2341/2310 +f 2399/2416/2385 2413/2432/2401 2319/2414/2383 +f 2413/2432/2401 2399/2416/2385 2388/2420/2389 +f 2341/2360/2329 2414/2434/2403 2415/2433/2402 +f 2340/2358/2327 2416/2435/2404 2414/2434/2403 +f 2418/3230/3199 2414/2434/2403 2417/2436/2405 +f 2414/2434/2403 2418/3230/3199 2419/2437/2406 +f 2421/2439/2408 2422/2443/2412 2423/2440/2409 +f 2422/2443/2412 2421/2439/2408 2425/2442/2411 +f 2427/3226/3195 2422/2443/2412 2426/2444/2413 +f 2422/2443/2412 2427/3226/3195 2417/2436/2405 +f 2429/2446/2415 2430/2450/2419 2431/2447/2416 +f 2430/2450/2419 2429/2446/2415 2433/2449/2418 +f 2421/2439/2408 2430/2450/2419 2424/2441/2410 +f 2430/2450/2419 2421/2439/2408 2420/2438/2407 +f 2437/2457/2426 2434/2451/2420 2436/2453/2422 +f 2436/2453/2422 2435/2452/2421 2439/2455/2424 +f 2439/2455/2424 2440/2479/2448 2441/2456/2425 +f 2436/2453/2422 2441/2456/2425 2442/2458/2427 +f 2445/2465/2434 2377/2459/2428 2444/2461/2430 +f 2444/2461/2430 2443/2460/2429 2447/2463/2432 +f 2449/2466/2435 2444/2461/2430 2448/2464/2433 +f 2450/2605/2574 2445/2465/2434 2449/2466/2435 +f 2452/2468/2437 2453/2470/2439 2454/2469/2438 +f 2453/2470/2439 2452/2468/2437 2385/2402/2371 +f 2385/2402/2371 2390/2407/2376 2455/2471/2440 +f 2456/5840/5812 2454/2469/2438 2455/2471/2440 +f 2457/2472/2441 2458/2475/2444 2455/2471/2440 +f 2458/2475/2444 2457/2472/2441 2460/2474/2443 +f 2456/5840/5812 2455/2471/2440 2460/2474/2443 +f 2464/2482/2451 2461/2476/2445 2463/2478/2447 +f 2463/2478/2447 2462/2477/2446 2465/2480/2449 +f 2467/2483/2452 2463/2478/2447 2466/2481/2450 +f 2468/3111/3080 2464/2482/2451 2467/2483/2452 +f 2470/2485/2454 2471/2489/2458 2472/2486/2455 +f 2471/2489/2458 2470/2485/2454 2474/2488/2457 +f 2476/2952/2921 2471/2489/2458 2475/2490/2459 +f 2471/2489/2458 2476/2952/2921 2477/2491/2460 +f 2479/2493/2462 2480/2496/2465 2481/2494/2463 +f 2482/2495/2464 2483/2497/2466 2480/2496/2465 +f 2483/2497/2466 2448/2464/2433 2447/2463/2432 +f 2480/2496/2465 2447/2463/2432 2446/2462/2431 +f 2485/2501/2470 2469/2484/2453 2484/2498/2467 +f 2484/2498/2467 2472/2486/2455 2486/2499/2468 +f 2488/2502/2471 2484/2498/2467 2487/2500/2469 +f 2489/2704/2673 2485/2501/2470 2488/2502/2471 +f 2492/2508/2477 2305/2326/2295 2491/2504/2473 +f 2491/2504/2473 2490/2503/2472 2494/2506/2475 +f 2496/2509/2478 2491/2504/2473 2495/2507/2476 +f 2497/2527/2496 2492/2508/2477 2496/2509/2478 +f 2499/2511/2480 2500/2514/2483 2501/2512/2481 +f 2502/2513/2482 2503/2515/2484 2500/2514/2483 +f 2504/2652/2621 2501/2512/2481 2503/2515/2484 +f 2508/2519/2488 2505/2516/2485 2507/2518/2487 +f 2507/2518/2487 2506/2517/2486 2499/2511/2480 +f 2507/2518/2487 2499/2511/2480 2498/2510/2479 +f 2512/2526/2495 2509/2520/2489 2511/2522/2491 +f 2513/2523/2492 2514/2524/2493 2511/2522/2491 +f 2514/2524/2493 2515/2696/2665 2516/2525/2494 +f 2517/2684/2653 2512/2526/2495 2516/2525/2494 +f 2492/2508/2477 2497/2527/2496 2519/2529/2498 +f 2520/2530/2499 2521/2531/2500 2519/2529/2498 +f 2306/2328/2297 2519/2529/2498 2307/2329/2298 +f 2305/2326/2295 2492/2508/2477 2306/2328/2297 +f 2522/2532/2501 2523/2534/2503 2510/2521/2490 +f 2524/2533/2502 2525/2535/2504 2523/2534/2503 +f 2527/2537/2506 2523/2534/2503 2526/2536/2505 +f 2513/2523/2492 2510/2521/2490 2527/2537/2506 +f 2529/2539/2508 2530/2542/2511 2531/2540/2509 +f 2532/2541/2510 2533/2543/2512 2530/2542/2511 +f 2533/2543/2512 2534/2678/2647 2535/2544/2513 +f 2530/2542/2511 2535/2544/2513 2536/2545/2514 +f 2540/2552/2521 2537/2546/2515 2539/2548/2517 +f 2539/2548/2517 2538/2547/2516 2542/2550/2519 +f 2544/2553/2522 2539/2548/2517 2543/2551/2520 +f 2545/2564/2533 2540/2552/2521 2544/2553/2522 +f 2542/2550/2519 2541/2549/2518 2547/2555/2524 +f 2547/2555/2524 2546/2554/2523 2548/2556/2525 +f 2543/2551/2520 2542/2550/2519 2548/2556/2525 +f 2548/2556/2525 2549/2558/2527 2550/2557/2526 +f 2549/2558/2527 2548/2556/2525 2506/2517/2486 +f 2505/2516/2485 2550/2557/2526 2506/2517/2486 +f 2551/2559/2528 2552/2561/2530 2544/2553/2522 +f 2553/2560/2529 2554/2562/2531 2552/2561/2530 +f 2554/2562/2531 2555/2574/2543 2556/2563/2532 +f 2552/2561/2530 2556/2563/2532 2545/2564/2533 +f 2557/2565/2534 2558/2568/2537 2550/2557/2526 +f 2558/2568/2537 2557/2565/2534 2560/2567/2536 +f 2560/2567/2536 2553/2560/2529 2551/2559/2528 +f 2543/2551/2520 2550/2557/2526 2551/2559/2528 +f 2561/2569/2538 2562/2571/2540 2554/2562/2531 +f 2563/2570/2539 2564/2572/2541 2562/2571/2540 +f 2564/2572/2541 2534/2678/2647 2565/2573/2542 +f 2562/2571/2540 2565/2573/2542 2555/2574/2543 +f 2561/2569/2538 2553/2560/2529 2566/2575/2544 +f 2566/2575/2544 2560/2567/2536 2567/2576/2545 +f 2569/2578/2547 2566/2575/2544 2568/2577/2546 +f 2563/2570/2539 2561/2569/2538 2569/2578/2547 +f 2573/2585/2554 2570/2579/2548 2572/2581/2550 +f 2572/2581/2550 2571/2580/2549 2575/2583/2552 +f 2575/2583/2552 2576/2591/2560 2577/2584/2553 +f 2578/2670/2639 2573/2585/2554 2577/2584/2553 +f 2579/2586/2555 2580/2588/2557 2575/2583/2552 +f 2581/2587/2556 2582/2589/2558 2580/2588/2557 +f 2582/2589/2558 2493/2505/2474 2583/2590/2559 +f 2580/2588/2557 2583/2590/2559 2576/2591/2560 +f 2585/2593/2562 2586/2595/2564 2587/2594/2563 +f 2520/2530/2499 2518/2528/2497 2586/2595/2564 +f 2518/2528/2497 2497/2527/2496 2588/2596/2565 +f 2586/2595/2564 2588/2596/2565 2589/2597/2566 +f 2591/2600/2569 2589/2597/2566 2590/2598/2567 +f 2497/2527/2496 2496/2509/2478 2590/2598/2567 +f 2496/2509/2478 2495/2507/2476 2592/2599/2568 +f 2590/2598/2567 2592/2599/2568 2593/2601/2570 +f 2594/2602/2571 2595/2603/2572 2449/2466/2435 +f 2584/2592/2561 2587/2594/2563 2595/2603/2572 +f 2587/2594/2563 2589/2597/2566 2596/2604/2573 +f 2595/2603/2572 2596/2604/2573 2450/2605/2574 +f 2599/2610/2579 2593/2601/2570 2598/2607/2576 +f 2598/2607/2576 2597/2606/2575 2601/2609/2578 +f 2602/2611/2580 2598/2607/2576 2406/2425/2394 +f 2603/2615/2584 2599/2610/2579 2602/2611/2580 +f 2405/2424/2393 2604/2612/2581 2602/2611/2580 +f 2378/2396/2365 2381/2399/2368 2604/2612/2581 +f 2605/2613/2582 2604/2612/2581 2372/2390/2359 +f 2603/2615/2584 2602/2611/2580 2605/2613/2582 +f 2606/2614/2583 2607/2616/2585 2445/2465/2434 +f 2603/2615/2584 2605/2613/2582 2607/2616/2585 +f 2605/2613/2582 2372/2390/2359 2375/2394/2363 +f 2607/2616/2585 2375/2394/2363 2377/2459/2428 +f 2606/2614/2583 2450/2605/2574 2608/2617/2586 +f 2608/2617/2586 2596/2604/2573 2591/2600/2569 +f 2599/2610/2579 2608/2617/2586 2593/2601/2570 +f 2603/2615/2584 2606/2614/2583 2599/2610/2579 +f 2610/2619/2588 2611/2621/2590 2612/2620/2589 +f 2600/2608/2577 2597/2606/2575 2611/2621/2590 +f 2597/2606/2575 2593/2601/2570 2592/2599/2568 +f 2611/2621/2590 2592/2599/2568 2495/2507/2476 +f 2614/2623/2592 2568/2577/2546 2613/2622/2591 +f 2613/2622/2591 2567/2576/2545 2557/2565/2534 +f 2615/2624/2593 2613/2622/2591 2505/2516/2485 +f 2616/2635/2604 2614/2623/2592 2615/2624/2593 +f 2508/2519/2488 2617/2626/2595 2615/2624/2593 +f 2617/2626/2595 2508/2519/2488 2618/2625/2594 +f 2616/2635/2604 2615/2624/2593 2618/2625/2594 +f 2621/2632/2601 2581/2587/2556 2620/2628/2597 +f 2620/2628/2597 2619/2627/2596 2623/2630/2599 +f 2625/2633/2602 2620/2628/2597 2624/2631/2600 +f 2609/2618/2587 2621/2632/2601 2625/2633/2602 +f 2626/2634/2603 2627/2636/2605 2623/2630/2599 +f 2616/2635/2604 2618/2625/2594 2627/2636/2605 +f 2618/2625/2594 2498/2510/2479 2628/2637/2606 +f 2627/2636/2605 2628/2637/2606 2624/2631/2600 +f 2396/2412/2381 2395/2411/2380 2630/2639/2608 +f 2631/2640/2609 2632/2641/2610 2630/2639/2608 +f 2457/2472/2441 2630/2639/2608 2459/2473/2442 +f 2390/2407/2376 2396/2412/2381 2457/2472/2441 +f 2629/2638/2607 2633/2643/2612 2634/2642/2611 +f 2395/2411/2380 2403/2421/2390 2633/2643/2612 +f 2403/2421/2390 2406/2425/2394 2601/2609/2578 +f 2633/2643/2612 2601/2609/2578 2600/2608/2577 +f 2460/2474/2443 2459/2473/2442 2636/2645/2614 +f 2636/2645/2614 2635/2644/2613 2638/2647/2616 +f 2638/2647/2616 2639/2654/2623 2640/2648/2617 +f 2456/5840/5812 2460/2474/2443 2640/2648/2617 +f 2641/2649/2618 2642/2651/2620 2643/2650/2619 +f 2642/2651/2620 2641/2649/2618 2628/2637/2606 +f 2642/2651/2620 2628/2637/2606 2498/2510/2479 +f 2644/2653/2622 2645/2655/2624 2501/2512/2481 +f 2639/2654/2623 2638/2647/2616 2645/2655/2624 +f 2643/2650/2619 2645/2655/2624 2637/2646/2615 +f 2498/2510/2479 2501/2512/2481 2643/2650/2619 +f 2647/2657/2626 2624/2631/2600 2646/2656/2625 +f 2637/2646/2615 2635/2644/2613 2646/2656/2625 +f 2635/2644/2613 2459/2473/2442 2632/2641/2610 +f 2646/2656/2625 2632/2641/2610 2631/2640/2609 +f 2647/2657/2626 2648/2658/2627 2625/2633/2602 +f 2631/2640/2609 2634/2642/2611 2648/2658/2627 +f 2634/2642/2611 2600/2608/2577 2610/2619/2588 +f 2648/2658/2627 2610/2619/2588 2609/2618/2587 +f 2621/2632/2601 2649/2659/2628 2582/2589/2558 +f 2609/2618/2587 2612/2620/2589 2649/2659/2628 +f 2612/2620/2589 2495/2507/2476 2494/2506/2475 +f 2649/2659/2628 2494/2506/2475 2493/2505/2474 +f 2651/2661/2630 2616/2635/2604 2650/2660/2629 +f 2622/2629/2598 2619/2627/2596 2650/2660/2629 +f 2619/2627/2596 2581/2587/2556 2579/2586/2555 +f 2650/2660/2629 2579/2586/2555 2574/2582/2551 +f 2614/2623/2592 2652/2663/2632 2653/2662/2631 +f 2616/2635/2604 2651/2661/2630 2652/2663/2632 +f 2571/2580/2549 2652/2663/2632 2574/2582/2551 +f 2652/2663/2632 2571/2580/2549 2570/2579/2548 +f 2655/2665/2634 2656/2668/2637 2657/2666/2635 +f 2658/2667/2636 2659/2669/2638 2656/2668/2637 +f 2659/2669/2638 2570/2579/2548 2573/2585/2554 +f 2656/2668/2637 2573/2585/2554 2578/2670/2639 +f 2661/2672/2641 2662/2674/2643 2663/2673/2642 +f 2536/2545/2514 2664/2675/2644 2662/2674/2643 +f 2664/2675/2644 2658/2667/2636 2655/2665/2634 +f 2662/2674/2643 2655/2665/2634 2654/2664/2633 +f 2569/2578/2547 2665/2677/2646 2666/2676/2645 +f 2568/2577/2546 2653/2662/2631 2665/2677/2646 +f 2653/2662/2631 2570/2579/2548 2659/2669/2638 +f 2665/2677/2646 2659/2669/2638 2658/2667/2636 +f 2535/2544/2513 2667/2679/2648 2664/2675/2644 +f 2534/2678/2647 2564/2572/2541 2667/2679/2648 +f 2564/2572/2541 2563/2570/2539 2666/2676/2645 +f 2658/2667/2636 2664/2675/2644 2666/2676/2645 +f 2669/2681/2650 2670/2683/2652 2671/2682/2651 +f 2528/2538/2507 2531/2540/2509 2670/2683/2652 +f 2531/2540/2509 2536/2545/2514 2661/2672/2641 +f 2670/2683/2652 2661/2672/2641 2660/2671/2640 +f 2672/2685/2654 2673/2688/2657 2674/2686/2655 +f 2675/2687/2656 2676/2689/2658 2673/2688/2657 +f 2676/2689/2658 2677/2770/2739 2678/2690/2659 +f 2673/2688/2657 2678/2690/2659 2679/2691/2660 +f 2681/2693/2662 2682/2695/2664 2683/2694/2663 +f 2682/2695/2664 2681/2693/2662 2672/2685/2654 +f 2516/2525/2494 2682/2695/2664 2517/2684/2653 +f 2682/2695/2664 2516/2525/2494 2515/2696/2665 +f 2465/2480/2449 2440/2479/2448 2684/2697/2666 +f 2684/2697/2666 2439/2455/2424 2685/2698/2667 +f 2685/2698/2667 2686/2700/2669 2687/2699/2668 +f 2466/2481/2450 2465/2480/2449 2687/2699/2668 +f 2690/2703/2672 2686/2700/2669 2689/2702/2671 +f 2473/2487/2456 2470/2485/2454 2689/2702/2671 +f 2469/2484/2453 2690/2703/2672 2470/2485/2454 +f 2691/2705/2674 2692/2706/2675 2485/2501/2470 +f 2466/2481/2450 2687/2699/2668 2692/2706/2675 +f 2687/2699/2668 2686/2700/2669 2690/2703/2672 +f 2692/2706/2675 2690/2703/2672 2469/2484/2453 +f 2330/2349/2318 2327/2347/2316 2694/2708/2677 +f 2694/2708/2677 2693/2707/2676 2696/2710/2679 +f 2696/2710/2679 2356/3118/3087 2355/2372/2341 +f 2694/2708/2677 2355/2372/2341 2331/2350/2319 +f 2437/2457/2426 2697/2712/2681 2698/2711/2680 +f 2442/2458/2427 2699/2713/2682 2697/2712/2681 +f 2699/2713/2682 2356/3118/3087 2696/2710/2679 +f 2695/2709/2678 2698/2711/2680 2696/2710/2679 +f 2683/2694/2663 2700/2715/2684 2701/2714/2683 +f 2515/2696/2665 2702/2716/2685 2700/2715/2684 +f 2702/2716/2685 2703/2957/2926 2704/2717/2686 +f 2700/2715/2684 2704/2717/2686 2705/2718/2687 +f 2709/2723/2692 2706/2719/2688 2708/2721/2690 +f 2680/2692/2661 2701/2714/2683 2708/2721/2690 +f 2701/2714/2683 2705/2718/2687 2710/2722/2691 +f 2711/2768/2737 2709/2723/2692 2710/2722/2691 +f 2540/2552/2521 2712/2725/2694 2713/2724/2693 +f 2545/2564/2533 2714/2726/2695 2712/2725/2694 +f 2716/2728/2697 2712/2725/2694 2715/2727/2696 +f 2717/2748/2717 2713/2724/2693 2716/2728/2697 +f 2719/2730/2699 2720/2734/2703 2721/2731/2700 +f 2720/2734/2703 2719/2730/2699 2723/2733/2702 +f 2723/2733/2702 2677/2770/2739 2724/2735/2704 +f 2706/2719/2688 2721/2731/2700 2724/2735/2704 +f 2556/2563/2532 2725/2736/2705 2714/2726/2695 +f 2555/2574/2543 2726/2737/2706 2725/2736/2705 +f 2726/2737/2706 2727/2741/2710 2728/2738/2707 +f 2725/2736/2705 2728/2738/2707 2715/2727/2696 +f 2565/2573/2542 2729/2739/2708 2726/2737/2706 +f 2534/2678/2647 2533/2543/2512 2729/2739/2708 +f 2533/2543/2512 2532/2541/2510 2730/2740/2709 +f 2729/2739/2708 2730/2740/2709 2727/2741/2710 +f 2730/2740/2709 2731/2743/2712 2732/2742/2711 +f 2532/2541/2510 2529/2539/2508 2731/2743/2712 +f 2733/2774/2743 2731/2743/2712 2528/2538/2507 +f 2731/2743/2712 2733/2774/2743 2734/2744/2713 +f 2736/2747/2716 2715/2727/2696 2735/2745/2714 +f 2727/2741/2710 2732/2742/2711 2735/2745/2714 +f 2732/2742/2711 2734/2744/2713 2737/2746/2715 +f 2735/2745/2714 2737/2746/2715 2722/2732/2701 +f 2739/2750/2719 2717/2748/2717 2738/2749/2718 +f 2738/2749/2718 2716/2728/2697 2736/2747/2716 +f 2719/2730/2699 2738/2749/2718 2722/2732/2701 +f 2738/2749/2718 2719/2730/2699 2718/2729/2698 +f 2740/2751/2720 2741/2753/2722 2546/2554/2523 +f 2742/2752/2721 2743/2754/2723 2741/2753/2722 +f 2743/2754/2723 2504/2652/2621 2503/2515/2484 +f 2502/2513/2482 2546/2554/2523 2503/2515/2484 +f 2744/2755/2724 2745/2757/2726 2538/2547/2516 +f 2746/2756/2725 2747/2758/2727 2745/2757/2726 +f 2747/2758/2727 2742/2752/2721 2740/2751/2720 +f 2745/2757/2726 2740/2751/2720 2541/2549/2518 +f 2744/2755/2724 2748/2760/2729 2749/2759/2728 +f 2537/2546/2515 2713/2724/2693 2748/2760/2729 +f 2713/2724/2693 2717/2748/2717 2750/2761/2730 +f 2751/2762/2731 2749/2759/2728 2750/2761/2730 +f 2750/2761/2730 2752/2764/2733 2753/2763/2732 +f 2717/2748/2717 2739/2750/2719 2752/2764/2733 +f 2739/2750/2719 2718/2729/2698 2754/2765/2734 +f 2752/2764/2733 2754/2765/2734 2755/2766/2735 +f 2754/2765/2734 2718/2729/2698 2756/2767/2736 +f 2756/2767/2736 2721/2731/2700 2709/2723/2692 +f 2757/2769/2738 2756/2767/2736 2711/2768/2737 +f 2755/2766/2735 2754/2765/2734 2757/2769/2738 +f 2724/2735/2704 2677/2770/2739 2758/2771/2740 +f 2758/2771/2740 2676/2689/2658 2681/2693/2662 +f 2681/2693/2662 2680/2692/2661 2707/2720/2689 +f 2758/2771/2740 2707/2720/2689 2706/2719/2688 +f 2737/2746/2715 2759/2773/2742 2723/2733/2702 +f 2759/2773/2742 2737/2746/2715 2760/2772/2741 +f 2760/2772/2741 2679/2691/2660 2678/2690/2659 +f 2759/2773/2742 2678/2690/2659 2677/2770/2739 +f 2669/2681/2650 2761/2775/2744 2733/2774/2743 +f 2668/2680/2649 2762/2776/2745 2761/2775/2744 +f 2762/2776/2745 2679/2691/2660 2760/2772/2741 +f 2761/2775/2744 2760/2772/2741 2734/2744/2713 +f 2762/2776/2745 2763/2778/2747 2764/2777/2746 +f 2668/2680/2649 2671/2682/2651 2763/2778/2747 +f 2671/2682/2651 2660/2671/2640 2765/2779/2748 +f 2766/2869/2838 2764/2777/2746 2765/2779/2748 +f 2770/2786/2755 2767/2780/2749 2769/2782/2751 +f 2769/2782/2751 2768/2781/2750 2772/2784/2753 +f 2774/2787/2756 2769/2782/2751 2773/2785/2754 +f 2775/2788/2757 2770/2786/2755 2774/2787/2756 +f 2777/2792/2761 2775/2788/2757 2776/2789/2758 +f 2773/2785/2754 2778/2790/2759 2776/2789/2758 +f 2778/2790/2759 2779/2796/2765 2780/2791/2760 +f 2781/2803/2772 2777/2792/2761 2780/2791/2760 +f 2772/2784/2753 2782/2793/2762 2778/2790/2759 +f 2771/2783/2752 2783/2794/2763 2782/2793/2762 +f 2785/2797/2766 2782/2793/2762 2784/2795/2764 +f 2782/2793/2762 2785/2797/2766 2779/2796/2765 +f 2787/2801/2770 2779/2796/2765 2786/2798/2767 +f 2786/2798/2767 2785/2797/2766 2788/2799/2768 +f 2790/2802/2771 2786/2798/2767 2789/2800/2769 +f 2791/3156/3125 2787/2801/2770 2790/2802/2771 +f 2793/2806/2775 2781/2803/2772 2792/2804/2773 +f 2779/2796/2765 2787/2801/2770 2792/2804/2773 +f 2787/2801/2770 2791/3156/3125 2794/2805/2774 +f 2489/2704/2673 2793/2806/2775 2794/2805/2774 +f 2795/2807/2776 2796/2809/2778 2488/2502/2471 +f 2797/2808/2777 2798/2810/2779 2796/2809/2778 +f 2798/2810/2779 2781/2803/2772 2793/2806/2775 +f 2796/2809/2778 2793/2806/2775 2489/2704/2673 +f 2802/2814/2783 2799/2811/2780 2801/2813/2782 +f 2801/2813/2782 2800/2812/2781 2777/2792/2761 +f 2798/2810/2779 2801/2813/2782 2781/2803/2772 +f 2797/2808/2777 2802/2814/2783 2798/2810/2779 +f 2800/2812/2781 2799/2811/2780 2804/2816/2785 +f 2804/2816/2785 2803/2815/2784 2806/2818/2787 +f 2808/2820/2789 2804/2816/2785 2807/2819/2788 +f 2775/2788/2757 2800/2812/2781 2808/2820/2789 +f 2809/2821/2790 2810/2824/2793 2808/2820/2789 +f 2810/2824/2793 2809/2821/2790 2812/2823/2792 +f 2770/2786/2755 2810/2824/2793 2767/2780/2749 +f 2810/2824/2793 2770/2786/2755 2775/2788/2757 +f 2814/2826/2795 2815/2828/2797 2816/2827/2796 +f 2524/2533/2502 2522/2532/2501 2815/2828/2797 +f 2817/2830/2799 2815/2828/2797 2509/2520/2489 +f 2815/2828/2797 2817/2830/2799 2818/2829/2798 +f 2817/2830/2799 2819/2832/2801 2820/2831/2800 +f 2509/2520/2489 2512/2526/2495 2819/2832/2801 +f 2512/2526/2495 2517/2684/2653 2821/2833/2802 +f 2819/2832/2801 2821/2833/2802 2822/2834/2803 +f 2824/2836/2805 2822/2834/2803 2823/2835/2804 +f 2517/2684/2653 2674/2686/2655 2823/2835/2804 +f 2674/2686/2655 2679/2691/2660 2764/2777/2746 +f 2766/2869/2838 2824/2836/2805 2764/2777/2746 +f 2826/2840/2809 2811/2822/2791 2825/2837/2806 +f 2807/2819/2788 2827/2838/2807 2825/2837/2806 +f 2827/2838/2807 2828/2964/2933 2829/2839/2808 +f 2825/2837/2806 2829/2839/2808 2830/2841/2810 +f 2832/2843/2812 2833/2847/2816 2834/2844/2813 +f 2833/2847/2816 2832/2843/2812 2836/2846/2815 +f 2838/2849/2818 2833/2847/2816 2837/2848/2817 +f 2839/2896/2865 2834/2844/2813 2838/2849/2818 +f 2841/2851/2820 2842/2853/2822 2843/2852/2821 +f 2842/2853/2822 2841/2851/2820 2836/2846/2815 +f 2835/2845/2814 2843/2852/2821 2836/2846/2815 +f 2844/2854/2823 2845/2857/2826 2846/2855/2824 +f 2847/2856/2825 2848/2858/2827 2845/2857/2826 +f 2848/2858/2827 2849/2875/2844 2850/2859/2828 +f 2845/2857/2826 2850/2859/2828 2851/2860/2829 +f 2853/2862/2831 2854/2865/2834 2855/2863/2832 +f 2856/2864/2833 2857/2866/2835 2854/2865/2834 +f 2859/2868/2837 2854/2865/2834 2858/2867/2836 +f 2766/2869/2838 2855/2863/2832 2859/2868/2837 +f 2765/2779/2748 2860/2870/2839 2855/2863/2832 +f 2660/2671/2640 2663/2673/2642 2860/2870/2839 +f 2663/2673/2642 2654/2664/2633 2861/2871/2840 +f 2860/2870/2839 2861/2871/2840 2852/2861/2830 +f 2861/2871/2840 2862/2873/2842 2863/2872/2841 +f 2654/2664/2633 2657/2666/2635 2862/2873/2842 +f 2657/2666/2635 2578/2670/2639 2864/2874/2843 +f 2862/2873/2842 2864/2874/2843 2849/2875/2844 +f 2866/2877/2846 2867/2880/2849 2868/2878/2847 +f 2869/2879/2848 2870/2881/2850 2867/2880/2849 +f 2870/2881/2850 2856/2864/2833 2853/2862/2831 +f 2852/2861/2830 2868/2878/2847 2853/2862/2831 +f 2874/2887/2856 2871/2882/2851 2873/2884/2853 +f 2873/2884/2853 2872/2883/2852 2876/2886/2855 +f 2868/2878/2847 2873/2884/2853 2865/2876/2845 +f 2852/2861/2830 2874/2887/2856 2868/2878/2847 +f 2877/2888/2857 2878/2890/2859 2879/2889/2858 +f 2875/2885/2854 2872/2883/2852 2878/2890/2859 +f 2880/2891/2860 2878/2890/2859 2871/2882/2851 +f 2847/2856/2825 2879/2889/2858 2880/2891/2860 +f 2848/2858/2827 2847/2856/2825 2881/2892/2861 +f 2881/2892/2861 2880/2891/2860 2874/2887/2856 +f 2863/2872/2841 2881/2892/2861 2852/2861/2830 +f 2849/2875/2844 2848/2858/2827 2863/2872/2841 +f 2844/2854/2823 2840/2850/2819 2882/2893/2862 +f 2882/2893/2862 2843/2852/2821 2832/2843/2812 +f 2879/2889/2858 2882/2893/2862 2831/2842/2811 +f 2847/2856/2825 2844/2854/2823 2879/2889/2858 +f 2877/2888/2857 2883/2895/2864 2884/2894/2863 +f 2831/2842/2811 2834/2844/2813 2883/2895/2864 +f 2885/2989/2958 2883/2895/2864 2839/2896/2865 +f 2883/2895/2864 2885/2989/2958 2886/2897/2866 +f 2888/2899/2868 2889/2903/2872 2890/2900/2869 +f 2889/2903/2872 2888/2899/2868 2892/2902/2871 +f 2894/2905/2874 2889/2903/2872 2893/2904/2873 +f 2895/2933/2902 2890/2900/2869 2894/2905/2874 +f 2897/2907/2876 2898/2910/2879 2899/2908/2877 +f 2900/2909/2878 2901/2911/2880 2898/2910/2879 +f 2901/2911/2880 2869/2879/2848 2866/2877/2846 +f 2898/2910/2879 2866/2877/2846 2865/2876/2845 +f 2876/2886/2855 2875/2885/2854 2902/2912/2881 +f 2902/2912/2881 2884/2894/2863 2903/2913/2882 +f 2899/2908/2877 2902/2912/2881 2896/2906/2875 +f 2865/2876/2845 2876/2886/2855 2899/2908/2877 +f 2903/2913/2882 2904/2915/2884 2905/2914/2883 +f 2886/2897/2866 2906/2916/2885 2904/2915/2884 +f 2906/2916/2885 2907/2975/2944 2908/2917/2886 +f 2904/2915/2884 2908/2917/2886 2909/2918/2887 +f 2910/2919/2888 2911/2921/2890 2905/2914/2883 +f 2912/2920/2889 2913/2922/2891 2911/2921/2890 +f 2913/2922/2891 2900/2909/2878 2897/2907/2876 +f 2911/2921/2890 2897/2907/2876 2896/2906/2875 +f 2915/2925/2894 2912/2920/2889 2914/2923/2892 +f 2914/2923/2892 2910/2919/2888 2916/2924/2893 +f 2916/2924/2893 2891/2901/2870 2888/2899/2868 +f 2914/2923/2892 2888/2899/2868 2887/2898/2867 +f 2525/2535/2504 2917/2927/2896 2918/2926/2895 +f 2524/2533/2502 2814/2826/2795 2917/2927/2896 +f 2814/2826/2795 2813/2825/2794 2919/2928/2897 +f 2917/2927/2896 2919/2928/2897 2920/2929/2898 +f 2921/2930/2899 2922/2931/2900 2894/2905/2874 +f 2920/2929/2898 2919/2928/2897 2922/2931/2900 +f 2919/2928/2897 2813/2825/2794 2923/2932/2901 +f 2922/2931/2900 2923/2932/2901 2895/2933/2902 +f 2927/2939/2908 2924/2934/2903 2926/2936/2905 +f 2926/2936/2905 2925/2935/2904 2929/2938/2907 +f 2918/2926/2895 2926/2936/2905 2526/2536/2505 +f 2920/2929/2898 2927/2939/2908 2918/2926/2895 +f 2802/2814/2783 2797/2808/2777 2931/2941/2910 +f 2931/2941/2910 2930/2940/2909 2932/2942/2911 +f 2934/2944/2913 2931/2941/2910 2933/2943/2912 +f 2799/2811/2780 2802/2814/2783 2934/2944/2913 +f 2929/2938/2907 2935/2945/2914 2527/2537/2506 +f 2928/2937/2906 2936/2946/2915 2935/2945/2914 +f 2938/2956/2925 2935/2945/2914 2937/2947/2916 +f 2935/2945/2914 2938/2956/2925 2513/2523/2492 +f 2795/2807/2776 2939/2949/2918 2940/2948/2917 +f 2487/2500/2469 2486/2499/2468 2939/2949/2918 +f 2941/2950/2919 2939/2949/2918 2477/2491/2460 +f 2939/2949/2918 2941/2950/2919 2937/2947/2916 +f 2941/2950/2919 2942/2953/2922 2943/2951/2920 +f 2942/2953/2922 2941/2950/2919 2476/2952/2921 +f 2476/2952/2921 2475/2490/2459 2944/2954/2923 +f 2703/2957/2926 2943/2951/2920 2944/2954/2923 +f 2702/2716/2685 2515/2696/2665 2945/2955/2924 +f 2945/2955/2924 2514/2524/2493 2938/2956/2925 +f 2938/2956/2925 2937/2947/2916 2943/2951/2920 +f 2945/2955/2924 2943/2951/2920 2703/2957/2926 +f 2936/2946/2915 2946/2958/2927 2940/2948/2917 +f 2928/2937/2906 2925/2935/2904 2946/2958/2927 +f 2925/2935/2904 2924/2934/2903 2930/2940/2909 +f 2797/2808/2777 2940/2948/2917 2930/2940/2909 +f 2927/2939/2908 2947/2959/2928 2932/2942/2911 +f 2920/2929/2898 2921/2930/2899 2947/2959/2928 +f 2948/2960/2929 2947/2959/2928 2893/2904/2873 +f 2933/2943/2912 2932/2942/2911 2948/2960/2929 +f 2806/2818/2787 2949/2961/2930 2827/2838/2807 +f 2805/2817/2786 2950/2962/2931 2949/2961/2930 +f 2950/2962/2931 2951/2967/2936 2952/2963/2932 +f 2949/2961/2930 2952/2963/2932 2828/2964/2933 +f 2950/2962/2931 2805/2817/2786 2953/2965/2934 +f 2953/2965/2934 2803/2815/2784 2934/2944/2913 +f 2954/2966/2935 2953/2965/2934 2933/2943/2912 +f 2951/2967/2936 2950/2962/2931 2954/2966/2935 +f 2955/2968/2937 2956/2971/2940 2957/2969/2938 +f 2958/2970/2939 2959/2972/2941 2956/2971/2940 +f 2959/2972/2941 2837/2848/2817 2960/2973/2942 +f 2956/2971/2940 2960/2973/2942 2961/2974/2943 +f 2964/2980/2949 2907/2975/2944 2963/2977/2946 +f 2963/2977/2946 2962/2976/2945 2966/2979/2948 +f 2967/2981/2950 2963/2977/2946 2958/2970/2939 +f 2968/2983/2952 2964/2980/2949 2967/2981/2950 +f 2969/2982/2951 2970/2984/2953 2954/2966/2935 +f 2968/2983/2952 2967/2981/2950 2970/2984/2953 +f 2967/2981/2950 2958/2970/2939 2955/2968/2937 +f 2970/2984/2953 2955/2968/2937 2951/2967/2936 +f 2892/2902/2871 2971/2985/2954 2948/2960/2929 +f 2891/2901/2870 2972/2986/2955 2971/2985/2954 +f 2972/2986/2955 2968/2983/2952 2969/2982/2951 +f 2971/2985/2954 2969/2982/2951 2933/2943/2912 +f 2908/2917/2886 2973/2987/2956 2916/2924/2893 +f 2907/2975/2944 2964/2980/2949 2973/2987/2956 +f 2972/2986/2955 2973/2987/2956 2968/2983/2952 +f 2891/2901/2870 2916/2924/2893 2972/2986/2955 +f 2974/2988/2957 2975/2990/2959 2885/2989/2958 +f 2965/2978/2947 2962/2976/2945 2975/2990/2959 +f 2962/2976/2945 2907/2975/2944 2906/2916/2885 +f 2975/2990/2959 2906/2916/2885 2886/2897/2866 +f 2966/2979/2948 2976/2991/2960 2959/2972/2941 +f 2965/2978/2947 2974/2988/2957 2976/2991/2960 +f 2838/2849/2818 2976/2991/2960 2839/2896/2865 +f 2837/2848/2817 2959/2972/2941 2838/2849/2818 +f 2960/2973/2942 2837/2848/2817 2977/2992/2961 +f 2840/2850/2819 2846/2855/2824 2977/2992/2961 +f 2846/2855/2824 2851/2860/2829 2978/2993/2962 +f 2961/2974/2943 2960/2973/2942 2978/2993/2962 +f 2980/2995/2964 2981/2997/2966 2982/2996/2965 +f 2961/2974/2943 2978/2993/2962 2981/2997/2966 +f 2978/2993/2962 2851/2860/2829 2983/2998/2967 +f 2981/2997/2966 2983/2998/2967 2984/2999/2968 +f 2980/2995/2964 2985/3000/2969 2957/2969/2938 +f 2979/2994/2963 2986/3001/2970 2985/3000/2969 +f 2952/2963/2932 2985/3000/2969 2828/2964/2933 +f 2951/2967/2936 2957/2969/2938 2952/2963/2932 +f 2829/2839/2808 2828/2964/2933 2987/3002/2971 +f 2987/3002/2971 2986/3001/2970 2982/2996/2965 +f 2988/3003/2972 2987/3002/2971 2984/2999/2968 +f 2830/2841/2810 2829/2839/2808 2988/3003/2972 +f 2989/3004/2973 2990/3005/2974 2023/2048/2017 +f 2811/2822/2791 2826/2840/2809 2990/3005/2974 +f 2826/2840/2809 2830/2841/2810 2991/3006/2975 +f 2990/3005/2974 2991/3006/2975 2024/3007/2976 +f 2995/3014/2983 2992/3008/2977 2994/3010/2979 +f 2996/3011/2980 2997/3012/2981 2994/3010/2979 +f 2999/3015/2984 2994/3010/2979 2998/3013/2982 +f 3000/3177/3146 2995/3014/2983 2999/3015/2984 +f 3004/3022/2991 3001/3016/2985 3003/3018/2987 +f 3003/3018/2987 3002/3017/2986 3006/3020/2989 +f 3006/3020/2989 3007/3052/3021 3008/3021/2990 +f 3003/3018/2987 3008/3021/2990 2998/3013/2982 +f 3004/3022/2991 2998/3013/2982 3009/3023/2992 +f 3009/3023/2992 2997/3012/2981 3010/3024/2993 +f 3012/3026/2995 3009/3023/2992 3011/3025/2994 +f 3001/3016/2985 3004/3022/2991 3012/3026/2995 +f 3010/3024/2993 3013/3028/2997 3014/3027/2996 +f 3013/3028/2997 3010/3024/2993 2993/3009/2978 +f 3015/8921/9069 3013/3028/2997 2992/3008/2977 +f 3013/3028/2997 3015/8921/9069 3016/3029/2998 +f 3018/3031/3000 3019/3033/3002 3020/3032/3001 +f 3011/3025/2994 3014/3027/2996 3019/3033/3002 +f 3014/3027/2996 3016/3029/2998 3021/3034/3003 +f 3019/3033/3002 3021/3034/3003 2432/2448/2417 +f 3023/3036/3005 3024/3038/3007 3025/3037/3006 +f 3001/3016/2985 3012/3026/2995 3024/3038/3007 +f 3018/3031/3000 3024/3038/3007 3011/3025/2994 +f 3024/3038/3007 3018/3031/3000 3017/3030/2999 +f 3027/3040/3009 3028/3044/3013 3029/3041/3010 +f 3028/3044/3013 3027/3040/3009 3031/3043/3012 +f 3033/3046/3015 3028/3044/3013 3032/3045/3014 +f 3034/3065/3034 3029/3041/3010 3033/3046/3015 +f 3037/3051/3020 3022/3035/3004 3036/3048/3017 +f 3036/3048/3017 3035/3047/3016 3039/3050/3019 +f 3029/3041/3010 3036/3048/3017 3026/3039/3008 +f 3034/3065/3034 3037/3051/3020 3029/3041/3010 +f 3042/3058/3027 3007/3052/3021 3041/3054/3023 +f 3043/3055/3024 3044/3056/3025 3041/3054/3023 +f 3044/3056/3025 3045/3061/3030 3046/3057/3026 +f 3047/3059/3028 3042/3058/3027 3046/3057/3026 +f 3049/3063/3032 3047/3059/3028 3048/3060/3029 +f 3048/3060/3029 3046/3057/3026 3050/3062/3031 +f 106/101/101 3048/3060/3029 69/66/66 +f 108/108/108 3049/3063/3032 106/101/101 +f 3051/3064/3033 3052/3066/3035 3044/3056/3025 +f 3034/3065/3034 3033/3046/3015 3052/3066/3035 +f 3033/3046/3015 3032/3045/3014 3053/3067/3036 +f 3052/3066/3035 3053/3067/3036 3045/3061/3030 +f 3053/3067/3036 3032/3045/3014 3054/3068/3037 +f 3030/3042/3011 3055/3069/3038 3054/3068/3037 +f 3055/3069/3038 3056/3071/3040 3057/3070/3039 +f 3045/3061/3030 3053/3067/3036 3057/3070/3039 +f 3059/3073/3042 3056/3071/3040 3058/3072/3041 +f 3058/3072/3041 3055/3069/3038 3027/3040/3009 +f 3060/3074/3043 3058/3072/3041 3026/3039/3008 +f 3061/3078/3047 3059/3073/3042 3060/3074/3043 +f 3039/3050/3019 3062/3075/3044 3060/3074/3043 +f 3038/3049/3018 3063/3076/3045 3062/3075/3044 +f 3063/3076/3045 3064/3138/3107 3065/3077/3046 +f 3062/3075/3044 3065/3077/3046 3061/3078/3047 +f 3069/3082/3051 3066/3079/3048 3068/3081/3050 +f 3068/3081/3050 3067/3080/3049 3020/3032/3001 +f 2429/2446/2415 3068/3081/3050 2432/2448/2417 +f 2428/2445/2414 3069/3082/3051 2429/2446/2415 +f 3073/3088/3057 3070/3083/3052 3072/3085/3054 +f 3072/3085/3054 3071/3084/3053 3075/3087/3056 +f 3076/3089/3058 3072/3085/3054 3066/3079/3048 +f 3077/3092/3061 3073/3088/3057 3076/3089/3058 +f 3025/3037/3006 3017/3030/2999 3078/3090/3059 +f 3078/3090/3059 3067/3080/3049 3075/3087/3056 +f 3079/3091/3060 3078/3090/3059 3074/3086/3055 +f 3022/3035/3004 3025/3037/3006 3079/3091/3060 +f 3076/3089/3058 3080/3094/3063 3081/3093/3062 +f 3080/3094/3063 3076/3089/3058 3069/3082/3051 +f 3082/3096/3065 3080/3094/3063 2428/2445/2414 +f 3080/3094/3063 3082/3096/3065 3083/3095/3064 +f 3085/3099/3068 3083/3095/3064 3084/3097/3066 +f 2428/2445/2414 2431/2447/2416 3084/3097/3066 +f 2431/2447/2416 2420/2438/2407 3086/3098/3067 +f 3087/3100/3069 3085/3099/3068 3086/3098/3067 +f 3086/3098/3067 3088/3102/3071 3089/3101/3070 +f 2420/2438/2407 2423/2440/2409 3088/3102/3071 +f 2423/2440/2409 2417/2436/2405 2416/2435/2404 +f 2340/2358/2327 3089/3101/3070 2416/2435/2404 +f 2339/2357/2326 2338/2356/2325 3090/3103/3072 +f 3090/3103/3072 2361/2376/2345 3091/3104/3073 +f 3089/3101/3070 3090/3103/3072 3087/3100/3069 +f 2340/2358/2327 2339/2357/2326 3089/3101/3070 +f 3091/3104/3073 3092/3105/3074 3085/3099/3068 +f 2363/2379/2348 3093/3106/3075 3092/3105/3074 +f 3093/3106/3075 3094/3117/3086 3095/3107/3076 +f 3092/3105/3074 3095/3107/3076 3083/3095/3064 +f 3099/3112/3081 3096/3108/3077 3098/3110/3079 +f 3098/3110/3079 3097/3109/3078 2464/2482/2451 +f 3100/3113/3082 3098/3110/3079 2468/3111/3080 +f 3101/3128/3097 3099/3112/3081 3100/3113/3082 +f 2362/2378/2347 3102/3114/3083 3093/3106/3075 +f 2358/2374/2343 3103/3115/3084 3102/3114/3083 +f 3103/3115/3084 3104/3121/3090 3105/3116/3085 +f 3102/3114/3083 3105/3116/3085 3094/3117/3086 +f 2357/2373/2342 3106/3119/3088 3103/3115/3084 +f 2356/3118/3087 2699/2713/2682 3106/3119/3088 +f 2699/2713/2682 2442/2458/2427 3107/3120/3089 +f 3106/3119/3088 3107/3120/3089 3104/3121/3090 +f 3109/3123/3092 3104/3121/3090 3108/3122/3091 +f 3108/3122/3091 3107/3120/3089 2441/2456/2425 +f 2462/2477/2446 3108/3122/3091 2440/2479/2448 +f 2461/2476/2445 3109/3123/3092 2462/2477/2446 +f 3111/3125/3094 3094/3117/3086 3110/3124/3093 +f 3110/3124/3093 3105/3116/3085 3109/3123/3092 +f 3097/3109/3078 3110/3124/3093 2461/2476/2445 +f 3096/3108/3077 3111/3125/3094 3097/3109/3078 +f 3081/3093/3062 3083/3095/3064 3112/3126/3095 +f 3112/3126/3095 3095/3107/3076 3111/3125/3094 +f 3113/3127/3096 3112/3126/3095 3096/3108/3077 +f 3112/3126/3095 3113/3127/3096 3077/3092/3061 +f 3099/3112/3081 3114/3129/3098 3113/3127/3096 +f 3101/3128/3097 3115/3130/3099 3114/3129/3098 +f 3073/3088/3057 3114/3129/3098 3070/3083/3052 +f 3077/3092/3061 3113/3127/3096 3073/3088/3057 +f 2790/2802/2771 2789/2800/2769 3117/3132/3101 +f 3117/3132/3101 3116/3131/3100 3119/3134/3103 +f 3121/3136/3105 3117/3132/3101 3120/3135/3104 +f 2791/3156/3125 2790/2802/2771 3121/3136/3105 +f 3065/3077/3046 3122/3139/3108 3123/3137/3106 +f 3064/3138/3107 3124/3140/3109 3122/3139/3108 +f 3124/3140/3109 3125/3165/3134 3126/3141/3110 +f 3122/3139/3108 3126/3141/3110 3127/3142/3111 +f 3129/3144/3113 3130/3146/3115 3131/3145/3114 +f 3130/3146/3115 3129/3144/3113 2812/2823/2792 +f 3132/3303/3272 3130/3146/3115 2811/2822/2791 +f 3130/3146/3115 3132/3303/3272 3133/3147/3116 +f 3116/3131/3100 3134/3149/3118 3135/3148/3117 +f 3134/3149/3118 3116/3131/3100 2788/2799/2768 +f 2788/2799/2768 2784/2795/2764 3136/3150/3119 +f 3134/3149/3118 3136/3150/3119 3128/3143/3112 +f 2783/2794/2763 3137/3151/3120 3136/3150/3119 +f 3137/3151/3120 2783/2794/2763 2768/2781/2750 +f 3129/3144/3113 3137/3151/3120 2767/2780/2749 +f 3128/3143/3112 3136/3150/3119 3129/3144/3113 +f 3139/3153/3122 3140/3155/3124 3141/3154/3123 +f 2468/3111/3080 2467/2483/2452 3140/3155/3124 +f 2467/2483/2452 2466/2481/2450 2691/2705/2674 +f 3140/3155/3124 2691/2705/2674 2489/2704/2673 +f 2794/2805/2774 2791/3156/3125 3142/3157/3126 +f 3142/3157/3126 3121/3136/3105 3143/3158/3127 +f 3141/3154/3123 3142/3157/3126 3138/3152/3121 +f 2489/2704/2673 2794/2805/2774 3141/3154/3123 +f 3139/3153/3122 3144/3159/3128 3100/3113/3082 +f 3138/3152/3121 3145/3160/3129 3144/3159/3128 +f 3145/3160/3129 3146/3163/3132 3147/3161/3130 +f 3144/3159/3128 3147/3161/3130 3101/3128/3097 +f 3143/3158/3127 3148/3162/3131 3145/3160/3129 +f 3120/3135/3104 3119/3134/3103 3148/3162/3131 +f 3149/3168/3137 3148/3162/3131 3118/3133/3102 +f 3148/3162/3131 3149/3168/3137 3146/3163/3132 +f 3151/3167/3136 3127/3142/3111 3150/3164/3133 +f 3150/3164/3133 3126/3141/3110 3152/3166/3135 +f 3149/3168/3137 3150/3164/3133 3146/3163/3132 +f 3118/3133/3102 3151/3167/3136 3149/3168/3137 +f 3147/3161/3130 3153/3169/3138 3115/3130/3099 +f 3146/3163/3132 3152/3166/3135 3153/3169/3138 +f 3154/3172/3141 3153/3169/3138 3125/3165/3134 +f 3153/3169/3138 3154/3172/3141 3070/3083/3052 +f 3154/3172/3141 3125/3165/3134 3155/3170/3139 +f 3155/3170/3139 3124/3140/3109 3156/3171/3140 +f 3071/3084/3053 3155/3170/3139 3074/3086/3055 +f 3070/3083/3052 3154/3172/3141 3071/3084/3053 +f 3156/3171/3140 3064/3138/3107 3157/3173/3142 +f 3157/3173/3142 3063/3076/3045 3035/3047/3016 +f 3079/3091/3060 3157/3173/3142 3022/3035/3004 +f 3074/3086/3055 3156/3171/3140 3079/3091/3060 +f 3158/3174/3143 3159/3175/3144 3037/3051/3020 +f 3005/3019/2988 3002/3017/2986 3159/3175/3144 +f 3002/3017/2986 3001/3016/2985 3023/3036/3005 +f 3159/3175/3144 3023/3036/3005 3022/3035/3004 +f 3051/3064/3033 3160/3176/3145 3158/3174/3143 +f 3043/3055/3024 3040/3053/3022 3160/3176/3145 +f 3040/3053/3022 3007/3052/3021 3006/3020/2989 +f 3160/3176/3145 3006/3020/2989 3005/3019/2988 +f 3162/3179/3148 3000/3177/3146 3161/3178/3147 +f 3161/3178/3147 2999/3015/2984 3008/3021/2990 +f 3008/3021/2990 3007/3052/3021 3042/3058/3027 +f 3161/3178/3147 3042/3058/3027 3047/3059/3028 +f 3163/3180/3149 3164/3181/3150 118/115/115 +f 3000/3177/3146 3162/3179/3148 3164/3181/3150 +f 3049/3063/3032 3164/3181/3150 3047/3059/3028 +f 108/108/108 118/115/115 3049/3063/3032 +f 3166/3183/3152 3167/3187/3156 3168/3184/3153 +f 3167/3187/3156 3166/3183/3152 3170/3186/3155 +f 3172/3197/3166 3167/3187/3156 3171/3188/3157 +f 3167/3187/3156 3172/3197/3166 3173/3189/3158 +f 3177/3194/3163 3174/3190/3159 3176/3192/3161 +f 3176/3192/3161 3175/3191/3160 2995/3014/2983 +f 2995/3014/2983 3000/3177/3146 3178/3193/3162 +f 3171/3188/3157 3177/3194/3163 3178/3193/3162 +f 3178/3193/3162 3179/3196/3165 3180/3195/3164 +f 3179/3196/3165 3178/3193/3162 3163/3180/3149 +f 128/124/124 3179/3196/3165 117/114/114 +f 127/123/123 3180/3195/3164 128/124/124 +f 3172/3197/3166 3181/3199/3168 3182/3198/3167 +f 3171/3188/3157 3180/3195/3164 3181/3199/3168 +f 132/128/128 3181/3199/3168 127/123/123 +f 3181/3199/3168 132/128/128 131/127/127 +f 3184/3201/3170 3185/3205/3174 3186/3202/3171 +f 3185/3205/3174 3184/3201/3170 3188/3204/3173 +f 3189/3253/3222 3185/3205/3174 3169/3185/3154 +f 3185/3205/3174 3189/3253/3222 3190/3206/3175 +f 2425/2442/2411 2424/2441/2410 3192/3208/3177 +f 3192/3208/3177 3191/3207/3176 3194/3210/3179 +f 3195/3211/3180 3192/3208/3177 3183/3200/3169 +f 2426/2444/2413 2425/2442/2411 3195/3211/3180 +f 2433/2449/2418 2432/2448/2417 3196/3212/3181 +f 3016/3029/2998 3197/3213/3182 3196/3212/3181 +f 3191/3207/3176 3196/3212/3181 3193/3209/3178 +f 2424/2441/2410 2433/2449/2418 3191/3207/3176 +f 3198/3214/3183 3199/3215/3184 3175/3191/3160 +f 3199/3215/3184 3198/3214/3183 3197/3213/3182 +f 3015/8921/9069 3199/3215/3184 3016/3029/2998 +f 3199/3215/3184 3015/8921/9069 2992/3008/2977 +f 3198/3214/3183 3174/3190/3159 3201/3217/3186 +f 3201/3217/3186 3200/3216/3185 3184/3201/3170 +f 3184/3201/3170 3183/3200/3169 3194/3210/3179 +f 3193/3209/3178 3198/3214/3183 3194/3210/3179 +f 3188/3204/3173 3202/3218/3187 3170/3186/3155 +f 3187/3203/3172 3200/3216/3185 3202/3218/3187 +f 3177/3194/3163 3202/3218/3187 3174/3190/3159 +f 3171/3188/3157 3170/3186/3155 3177/3194/3163 +f 3203/3219/3188 3204/3223/3192 3205/3220/3189 +f 3204/3223/3192 3203/3219/3188 3207/3222/3191 +f 3209/3225/3194 3204/3223/3192 3208/3224/3193 +f 3210/3248/3217 3205/3220/3189 3209/3225/3194 +f 2418/3230/3199 2417/2436/2405 3211/3227/3196 +f 3211/3227/3196 2427/3226/3195 3212/3228/3197 +f 3214/3231/3200 3211/3227/3196 3213/3229/3198 +f 2419/2437/2406 2418/3230/3199 3214/3231/3200 +f 3212/3228/3197 2426/2444/2413 3215/3232/3201 +f 3215/3232/3201 3195/3211/3180 3186/3202/3171 +f 3216/3233/3202 3215/3232/3201 3190/3206/3175 +f 3213/3229/3198 3212/3228/3197 3216/3233/3202 +f 3220/3239/3208 3217/3234/3203 3219/3236/3205 +f 3219/3236/3205 3218/3235/3204 3222/3238/3207 +f 2481/2494/2463 3219/3236/3205 2478/2492/2461 +f 2446/2462/2431 3220/3239/3208 2481/2494/2463 +f 2376/2395/2364 2371/2393/2362 3224/3241/3210 +f 3224/3241/3210 3223/3240/3209 3220/3239/3208 +f 2443/2460/2429 3224/3241/3210 2446/2462/2431 +f 2377/2459/2428 2376/2395/2364 2443/2460/2429 +f 2370/2389/2358 3225/3242/3211 3223/3240/3209 +f 2342/2387/2356 2415/2433/2402 3225/3242/3211 +f 2415/2433/2402 2419/2437/2406 3226/3243/3212 +f 3225/3242/3211 3226/3243/3212 3217/3234/3203 +f 3226/3243/3212 2419/2437/2406 3227/3244/3213 +f 3227/3244/3213 3214/3231/3200 3228/3245/3214 +f 3218/3235/3204 3227/3244/3213 3221/3237/3206 +f 3217/3234/3203 3226/3243/3212 3218/3235/3204 +f 3222/3238/3207 3221/3237/3206 3230/3247/3216 +f 3210/3248/3217 3209/3225/3194 3230/3247/3216 +f 3209/3225/3194 3208/3224/3193 3231/3249/3218 +f 2478/2492/2461 3222/3238/3207 3231/3249/3218 +f 3228/3245/3214 3213/3229/3198 3232/3250/3219 +f 3232/3250/3219 3216/3233/3202 3233/3251/3220 +f 3233/3251/3220 3210/3248/3217 3229/3246/3215 +f 3221/3237/3206 3228/3245/3214 3229/3246/3215 +f 3166/3183/3152 3165/3182/3151 3234/3252/3221 +f 3210/3248/3217 3233/3251/3220 3234/3252/3221 +f 3233/3251/3220 3190/3206/3175 3189/3253/3222 +f 3234/3252/3221 3189/3253/3222 3169/3185/3154 +f 3236/3255/3224 3237/3257/3226 3238/3256/3225 +f 3206/3221/3190 3203/3219/3188 3237/3257/3226 +f 3168/3184/3153 3237/3257/3226 3165/3182/3151 +f 3173/3189/3158 3238/3256/3225 3168/3184/3153 +f 3239/3258/3227 3240/3261/3230 3238/3256/3225 +f 3240/3261/3230 3239/3258/3227 3242/3260/3229 +f 3240/3261/3230 3242/3260/3229 3235/3254/3223 +f 2983/2998/2967 2851/2860/2829 3244/3263/3232 +f 2309/2330/2299 2311/2334/2303 3244/3263/3232 +f 3245/3264/3233 3244/3263/3232 2297/2318/2287 +f 2984/2999/2968 2983/2998/2967 3245/3264/3233 +f 2850/2859/2828 2849/2875/2844 3247/3266/3235 +f 3247/3266/3235 3246/3265/3234 2304/2325/2294 +f 2304/2325/2294 2309/2330/2299 3243/3262/3231 +f 2851/2860/2829 2850/2859/2828 3243/3262/3231 +f 2864/2874/2843 2578/2670/2639 3248/3267/3236 +f 2576/2591/2560 3249/3268/3237 3248/3267/3236 +f 3249/3268/3237 2301/2323/2292 3246/3265/3234 +f 2849/2875/2844 2864/2874/2843 3246/3265/3234 +f 2583/2590/2559 3250/3269/3238 3249/3268/3237 +f 2493/2505/2474 2490/2503/2472 3250/3269/3238 +f 2490/2503/2472 2305/2326/2295 2302/2324/2293 +f 3250/3269/3238 2302/2324/2293 2301/2323/2292 +f 3252/3271/3240 3253/3274/3243 3254/3272/3241 +f 3255/3273/3242 3256/3275/3244 3253/3274/3243 +f 3256/3275/3244 3235/3254/3223 3257/3276/3245 +f 3253/3274/3243 3257/3276/3245 3258/3277/3246 +f 3231/3249/3218 3208/3224/3193 3260/3279/3248 +f 3260/3279/3248 3259/3278/3247 3261/3280/3249 +f 3261/3280/3249 2482/2495/2464 2479/2493/2462 +f 3260/3279/3248 2479/2493/2462 2478/2492/2461 +f 3256/3275/3244 3255/3273/3242 3262/3281/3250 +f 3208/3224/3193 3207/3222/3191 3262/3281/3250 +f 3207/3222/3191 3206/3221/3190 3236/3255/3224 +f 3262/3281/3250 3236/3255/3224 3235/3254/3223 +f 3263/3282/3251 3264/3284/3253 2483/2497/2466 +f 3265/3283/3252 3266/3285/3254 3264/3284/3253 +f 3266/3285/3254 2584/2592/2561 2594/2602/2571 +f 3264/3284/3253 2594/2602/2571 2448/2464/2433 +f 3261/3280/3249 3255/3273/3242 3267/3286/3255 +f 3251/3270/3239 3268/3287/3256 3267/3286/3255 +f 3268/3287/3256 3265/3283/3252 3263/3282/3251 +f 2482/2495/2464 3261/3280/3249 3263/3282/3251 +f 3271/3291/3260 2299/2320/2289 3270/3289/3258 +f 3251/3270/3239 3254/3272/3241 3270/3289/3258 +f 3254/3272/3241 3258/3277/3246 3272/3290/3259 +f 3241/3259/3228 3271/3291/3260 3272/3290/3259 +f 3274/3293/3262 2024/3007/2976 3273/3292/3261 +f 3273/3292/3261 2991/3006/2975 2988/3003/2972 +f 3275/3294/3263 3273/3292/3261 2984/2999/2968 +f 3276/3297/3266 3274/3293/3262 3275/3294/3263 +f 3245/3264/3233 3277/3295/3264 3275/3294/3263 +f 2297/2318/2287 2294/2316/2285 3277/3295/3264 +f 3278/3296/3265 3277/3295/3264 2294/2316/2285 +f 3277/3295/3264 3278/3296/3265 3276/3297/3266 +f 3059/3073/3042 3279/3299/3268 3280/3298/3267 +f 3061/3078/3047 3123/3137/3106 3279/3299/3268 +f 3123/3137/3106 3127/3142/3111 3281/3300/3269 +f 3279/3299/3268 3281/3300/3269 3133/3147/3116 +f 3151/3167/3136 3118/3133/3102 3282/3301/3270 +f 3128/3143/3112 3131/3145/3114 3282/3301/3270 +f 3131/3145/3114 3133/3147/3116 3281/3300/3269 +f 3282/3301/3270 3281/3300/3269 3127/3142/3111 +f 3283/3302/3271 3284/3304/3273 2006/2031/2000 +f 3284/3304/3273 3283/3302/3271 3132/3303/3272 +f 2989/3004/2973 3284/3304/3273 2811/2822/2791 +f 3284/3304/3273 2989/3004/2973 2008/2033/2002 +f 3286/3306/3275 3056/3071/3040 3285/3305/3274 +f 3285/3305/3274 3280/3298/3267 3283/3302/3271 +f 70/68/68 3285/3305/3274 71/2030/1999 +f 69/66/66 3286/3306/3275 70/68/68 +f 3050/3062/3031 3045/3061/3030 3287/3307/3276 +f 3287/3307/3276 3057/3070/3039 3286/3306/3275 +f 3287/3307/3276 3286/3306/3275 69/66/66 +f 3271/3291/3260 3288/3308/3277 2300/2322/2291 +f 3241/3259/3228 3289/3309/3278 3288/3308/3277 +f 3289/3309/3278 776/770/770 773/768/768 +f 3288/3308/3277 773/768/768 772/767/767 +f 779/773/773 776/770/770 3290/3310/3279 +f 3290/3310/3279 3289/3309/3278 3239/3258/3227 +f 3182/3198/3167 3290/3310/3279 3173/3189/3158 +f 131/127/127 779/773/773 3182/3198/3167 +f 3257/3276/3245 3235/3254/3223 3291/3311/3280 +f 3241/3259/3228 3272/3290/3259 3291/3311/3280 +f 3291/3311/3280 3272/3290/3259 3258/3277/3246 +f 3293/3313/3282 2307/2329/2298 3292/3312/3281 +f 2520/2530/2499 2585/2593/2562 3292/3312/3281 +f 3266/3285/3254 3292/3312/3281 2584/2592/2561 +f 3265/3283/3252 3293/3313/3282 3266/3285/3254 +f 3294/3314/3283 3295/3315/3284 3293/3313/3282 +f 2299/2320/2289 2312/2333/2302 3295/3315/3284 +f 3295/3315/3284 2312/2333/2302 2307/2329/2298 +f 3294/3314/3283 3296/3316/3285 3269/3288/3257 +f 3296/3316/3285 3294/3314/3283 3268/3287/3256 +f 3296/3316/3285 3268/3287/3256 3251/3270/3239 +f 3298/3318/3287 3299/3321/3290 3300/3319/3288 +f 3301/3320/3289 3302/3322/3291 3299/3321/3290 +f 3302/3322/3291 3303/4293/4262 3304/3323/3292 +f 3299/3321/3290 3304/3323/3292 1497/1522/1491 +f 3306/3325/3294 3307/3329/3298 3308/3326/3295 +f 3307/3329/3298 3306/3325/3294 3310/3328/3297 +f 3312/4261/4230 3307/3329/3298 3311/3330/3299 +f 3307/3329/3298 3312/4261/4230 3313/3331/3300 +f 3314/3332/3301 3315/3333/3302 3298/3318/3287 +f 3315/3333/3302 3314/3332/3301 3308/3326/3295 +f 3308/3326/3295 3313/3331/3300 3316/3334/3303 +f 3315/3333/3302 3316/3334/3303 3301/3320/3289 +f 3320/3341/3310 3317/3335/3304 3319/3337/3306 +f 3319/3337/3306 3318/3336/3305 3322/3339/3308 +f 3324/3342/3311 3319/3337/3306 3323/3340/3309 +f 3325/3430/3399 3320/3341/3310 3324/3342/3311 +f 3327/3344/3313 3328/3346/3315 3329/3345/3314 +f 3328/3346/3315 3327/3344/3313 3322/3339/3308 +f 3330/3347/3316 3328/3346/3315 3321/3338/3307 +f 3331/3351/3320 3329/3345/3314 3330/3347/3316 +f 3333/3349/3318 3334/3352/3321 3335/3350/3319 +f 3331/3351/3320 3330/3347/3316 3334/3352/3321 +f 3330/3347/3316 3321/3338/3307 3336/3353/3322 +f 3334/3352/3321 3336/3353/3322 3337/3354/3323 +f 3339/3356/3325 3340/3359/3328 3341/3357/3326 +f 3342/3358/3327 3343/3360/3329 3340/3359/3328 +f 3343/3360/3329 3344/3363/3332 3345/3361/3330 +f 3340/3359/3328 3345/3361/3330 3346/3362/3331 +f 3347/3364/3333 3348/3367/3336 3349/3365/3334 +f 3350/3366/3335 3351/3368/3337 3348/3367/3336 +f 3351/3368/3337 3352/3396/3365 3353/3369/3338 +f 3348/3367/3336 3353/3369/3338 3354/3370/3339 +f 3358/3376/3345 3355/3371/3340 3357/3373/3342 +f 3357/3373/3342 3356/3372/3341 3359/3374/3343 +f 3361/3377/3346 3357/3373/3342 3360/3375/3344 +f 3362/3378/3347 3358/3376/3345 3361/3377/3346 +f 3364/3381/3350 3362/3378/3347 3363/3379/3348 +f 3363/3379/3348 3361/3377/3346 3365/3380/3349 +f 3366/3382/3351 3363/3379/3348 3342/3358/3327 +f 3367/4100/4069 3364/3381/3350 3366/3382/3351 +f 3359/3374/3343 3368/3384/3353 3369/3383/3352 +f 3332/3348/3317 3335/3350/3319 3368/3384/3353 +f 3335/3350/3319 3337/3354/3323 3370/3385/3354 +f 3368/3384/3353 3370/3385/3354 3350/3366/3335 +f 3365/3380/3349 3371/3386/3355 3343/3360/3329 +f 3360/3375/3344 3369/3383/3352 3371/3386/3355 +f 3369/3383/3352 3350/3366/3335 3347/3364/3333 +f 3371/3386/3355 3347/3364/3333 3344/3363/3332 +f 3345/3361/3330 3372/3388/3357 3373/3387/3356 +f 3344/3363/3332 3349/3365/3334 3372/3388/3357 +f 3349/3365/3334 3354/3370/3339 3374/3389/3358 +f 3372/3388/3357 3374/3389/3358 3375/3390/3359 +f 3374/3389/3358 3376/3392/3361 3377/3391/3360 +f 3354/3370/3339 3378/3393/3362 3376/3392/3361 +f 3378/3393/3362 3379/3400/3369 3380/3394/3363 +f 3376/3392/3361 3380/3394/3363 3381/3395/3364 +f 3353/3369/3338 3382/3397/3366 3378/3393/3362 +f 3352/3396/3365 3383/3398/3367 3382/3397/3366 +f 3385/3611/3580 3382/3397/3366 3384/3399/3368 +f 3382/3397/3366 3385/3611/3580 3379/3400/3369 +f 3389/3407/3376 3386/3401/3370 3388/3403/3372 +f 3388/3403/3372 3387/3402/3371 3391/3405/3374 +f 3393/3408/3377 3388/3403/3372 3392/3406/3375 +f 3394/3409/3378 3389/3407/3376 3393/3408/3377 +f 3395/3410/3379 3396/3412/3381 3389/3407/3376 +f 3397/3411/3380 3398/3413/3382 3396/3412/3381 +f 3398/3413/3382 3399/3415/3384 3400/3414/3383 +f 3396/3412/3381 3400/3414/3383 3386/3401/3370 +f 3400/3414/3383 3399/3415/3384 3402/3417/3386 +f 3402/3417/3386 3401/3416/3385 3404/3419/3388 +f 3405/3420/3389 3402/3417/3386 3317/3335/3304 +f 3386/3401/3370 3400/3414/3383 3405/3420/3389 +f 3408/3423/3392 3384/3399/3368 3407/3422/3391 +f 3407/3422/3391 3406/3421/3390 3398/3413/3382 +f 3409/3424/3393 3407/3422/3391 3397/3411/3380 +f 3410/3603/3572 3408/3423/3392 3409/3424/3393 +f 3383/3398/3367 3352/3396/3365 3412/3426/3395 +f 3412/3426/3395 3411/3425/3394 3401/3416/3385 +f 3406/3421/3390 3412/3426/3395 3399/3415/3384 +f 3384/3399/3368 3383/3398/3367 3406/3421/3390 +f 3351/3368/3337 3413/3427/3396 3411/3425/3394 +f 3350/3366/3335 3370/3385/3354 3413/3427/3396 +f 3370/3385/3354 3337/3354/3323 3414/3428/3397 +f 3413/3427/3396 3414/3428/3397 3403/3418/3387 +f 3336/3353/3322 3415/3429/3398 3414/3428/3397 +f 3321/3338/3307 3318/3336/3305 3415/3429/3398 +f 3318/3336/3305 3317/3335/3304 3404/3419/3388 +f 3415/3429/3398 3404/3419/3388 3403/3418/3387 +f 3320/3341/3310 3416/3431/3400 3405/3420/3389 +f 3325/3430/3399 3417/3432/3401 3416/3431/3400 +f 3417/3432/3401 3390/3404/3373 3387/3402/3371 +f 3386/3401/3370 3405/3420/3389 3387/3402/3371 +f 3419/3434/3403 3420/3436/3405 3421/3435/3404 +f 3420/3436/3405 3419/3434/3403 3341/3357/3326 +f 3422/3437/3406 3420/3436/3405 3346/3362/3331 +f 3423/4227/4196 3421/3435/3404 3422/3437/3406 +f 3427/3444/3413 3424/3438/3407 3426/3440/3409 +f 3428/3441/3410 3429/3442/3411 3426/3440/3409 +f 3431/3445/3414 3426/3440/3409 3430/3443/3412 +f 3418/3433/3402 3427/3444/3413 3431/3445/3414 +f 3432/3446/3415 3433/3448/3417 3429/3442/3411 +f 3434/3447/3416 3435/3449/3418 3433/3448/3417 +f 3435/3449/3418 3436/4079/4048 3437/3450/3419 +f 3430/3443/3412 3429/3442/3411 3437/3450/3419 +f 3441/3457/3426 3438/3451/3420 3440/3453/3422 +f 3442/3454/3423 3443/3455/3424 3440/3453/3422 +f 3443/3455/3424 3444/3711/3680 3445/3456/3425 +f 3446/3710/3679 3441/3457/3426 3445/3456/3425 +f 3448/3459/3428 3449/3462/3431 3450/3460/3429 +f 3451/3461/3430 3452/3463/3432 3449/3462/3431 +f 3452/3463/3432 3381/3395/3364 3453/3464/3433 +f 3449/3462/3431 3453/3464/3433 3454/3465/3434 +f 3456/3469/3438 3394/3409/3378 3455/3466/3435 +f 3455/3466/3435 3393/3408/3377 3457/3467/3436 +f 3459/3470/3439 3455/3466/3435 3458/3468/3437 +f 3460/6004/5976 3456/3469/3438 3459/3470/3439 +f 3464/3474/3443 3461/3471/3440 3463/3473/3442 +f 3394/3409/3378 3456/3469/3438 3463/3473/3442 +f 3460/6004/5976 3464/3474/3443 3456/3469/3438 +f 3466/3476/3445 3467/3478/3447 3468/3477/3446 +f 3438/3451/3420 3469/3479/3448 3467/3478/3447 +f 3469/3479/3448 3470/4107/4076 3471/3480/3449 +f 3467/3478/3447 3471/3480/3449 3472/3481/3450 +f 3474/3483/3452 3475/3486/3455 3476/3484/3453 +f 3477/3485/3454 3478/3487/3456 3475/3486/3455 +f 3478/3487/3456 3479/3701/3670 3480/3488/3457 +f 3475/3486/3455 3480/3488/3457 3481/3489/3458 +f 3448/3459/3428 3447/3458/3427 3483/3491/3460 +f 3483/3491/3460 3482/3490/3459 3485/3493/3462 +f 3487/3495/3464 3483/3491/3460 3486/3494/3463 +f 3451/3461/3430 3448/3459/3428 3487/3495/3464 +f 3489/3497/3466 3490/3499/3468 3491/3498/3467 +f 3481/3489/3458 3480/3488/3457 3490/3499/3468 +f 3480/3488/3457 3479/3701/3670 3492/3500/3469 +f 3490/3499/3468 3492/3500/3469 3493/3501/3470 +f 3495/3503/3472 3496/3506/3475 3497/3504/3473 +f 3498/3505/3474 3499/3507/3476 3496/3506/3475 +f 3499/3507/3476 3309/3327/3296 3500/3508/3477 +f 3496/3506/3475 3500/3508/3477 3501/3509/3478 +f 3505/3514/3483 3502/3510/3479 3504/3512/3481 +f 3506/3513/3482 3507/8922/9070 3504/3512/3481 +f 3504/3512/3481 3507/8922/9070 3508/3515/3484 +f 3509/3516/3485 3510/3519/3488 3503/3511/3480 +f 3510/3519/3488 3509/3516/3485 3512/3518/3487 +f 3510/3519/3488 3512/3518/3487 3506/3513/3482 +f 3514/3521/3490 3515/3525/3494 3516/3522/3491 +f 3515/3525/3494 3514/3521/3490 3518/3524/3493 +f 3518/3524/3493 3519/3538/3507 3520/3526/3495 +f 3515/3525/3494 3520/3526/3495 3521/3527/3496 +f 3306/3325/3294 3305/3324/3293 3523/3529/3498 +f 3524/3530/3499 3525/3531/3500 3523/3529/3498 +f 3525/3531/3500 3501/3509/3478 3500/3508/3477 +f 3523/3529/3498 3500/3508/3477 3309/3327/3296 +f 3527/3533/3502 3528/3537/3506 3529/3534/3503 +f 3528/3537/3506 3527/3533/3502 3531/3536/3505 +f 3518/3524/3493 3528/3537/3506 3519/3538/3507 +f 3528/3537/3506 3518/3524/3493 3517/3523/3492 +f 3535/3545/3514 3532/3539/3508 3534/3541/3510 +f 3534/3541/3510 3533/3540/3509 3537/3543/3512 +f 3539/3546/3515 3534/3541/3510 3538/3544/3513 +f 3540/3671/3640 3535/3545/3514 3539/3546/3515 +f 3542/3548/3517 3543/3551/3520 3544/3549/3518 +f 3545/3550/3519 3546/3552/3521 3543/3551/3520 +f 3546/3552/3521 3547/3760/3729 3548/3553/3522 +f 3543/3551/3520 3548/3553/3522 3549/3554/3523 +f 3552/3557/3526 3502/3510/3479 3551/3556/3525 +f 3551/3556/3525 3550/3555/3524 3542/3548/3517 +f 3551/3556/3525 3542/3548/3517 3541/3547/3516 +f 3509/3516/3485 3502/3510/3479 3553/3558/3527 +f 3541/3547/3516 3554/8923/9071 3553/3558/3527 +f 3553/3558/3527 3554/8923/9071 3511/3517/3486 +f 3558/3564/3533 3555/3559/3528 3557/3561/3530 +f 3557/3561/3530 3556/3560/3529 3560/3563/3532 +f 3544/3549/3518 3557/3561/3530 3541/3547/3516 +f 3549/3554/3523 3558/3564/3533 3544/3549/3518 +f 3560/3563/3532 3559/3562/3531 3562/3566/3535 +f 3563/3567/3536 3564/3568/3537 3562/3566/3535 +f 3554/8923/9071 3562/3566/3535 3511/3517/3486 +f 3562/3566/3535 3554/8923/9071 3541/3547/3516 +f 3567/3573/3542 3532/3539/3508 3566/3570/3539 +f 3566/3570/3539 3565/3569/3538 3569/3572/3541 +f 3556/3560/3529 3566/3570/3539 3559/3562/3531 +f 3555/3559/3528 3567/3573/3542 3556/3560/3529 +f 3573/3577/3546 3570/3574/3543 3572/3576/3545 +f 3563/3567/3536 3561/3565/3534 3572/3576/3545 +f 3561/3565/3534 3559/3562/3531 3569/3572/3541 +f 3572/3576/3545 3569/3572/3541 3568/3571/3540 +f 3575/3579/3548 3576/3582/3551 3577/3580/3549 +f 3578/3581/3550 3579/3583/3552 3576/3582/3551 +f 3579/3583/3552 3580/3662/3631 3581/3584/3553 +f 3576/3582/3551 3581/3584/3553 3582/3585/3554 +f 3585/3590/3559 3498/3505/3474 3584/3587/3556 +f 3584/3587/3556 3583/3586/3555 3587/3589/3558 +f 3575/3579/3548 3584/3587/3556 3578/3581/3550 +f 3574/3578/3547 3585/3590/3559 3575/3579/3548 +f 3525/3531/3500 3588/3593/3562 3589/3591/3560 +f 3588/3593/3562 3525/3531/3500 3590/3592/3561 +f 3592/3599/3568 3588/3593/3562 3591/3594/3563 +f 3588/3593/3562 3592/3599/3568 3593/3595/3564 +f 3595/3598/3567 3494/3502/3471 3594/3596/3565 +f 3594/3596/3565 3497/3504/3473 3589/3591/3560 +f 3589/3591/3560 3593/3595/3564 3596/3597/3566 +f 3597/3616/3585 3595/3598/3567 3596/3597/3566 +f 3599/3602/3571 3593/3595/3564 3598/3600/3569 +f 3598/3600/3569 3592/3599/3568 3600/3601/3570 +f 3450/3460/3429 3598/3600/3569 3447/3458/3427 +f 3454/3465/3434 3599/3602/3571 3450/3460/3429 +f 3601/3604/3573 3602/3607/3576 3603/3605/3574 +f 3604/3606/3575 3605/3608/3577 3602/3607/3576 +f 3605/3608/3577 3597/3616/3585 3606/3609/3578 +f 3602/3607/3576 3606/3609/3578 3607/3610/3579 +f 3385/3611/3580 3608/3613/3582 3609/3612/3581 +f 3608/3613/3582 3385/3611/3580 3408/3423/3392 +f 3408/3423/3392 3410/3603/3572 3603/3605/3574 +f 3608/3613/3582 3603/3605/3574 3607/3610/3579 +f 3380/3394/3363 3379/3400/3369 3610/3614/3583 +f 3610/3614/3583 3609/3612/3581 3611/3615/3584 +f 3453/3464/3433 3610/3614/3583 3454/3465/3434 +f 3381/3395/3364 3380/3394/3363 3453/3464/3433 +f 3596/3597/3566 3612/3617/3586 3606/3609/3578 +f 3593/3595/3564 3599/3602/3571 3612/3617/3586 +f 3599/3602/3571 3454/3465/3434 3611/3615/3584 +f 3612/3617/3586 3611/3615/3584 3607/3610/3579 +f 3595/3598/3567 3597/3616/3585 3613/3618/3587 +f 3613/3618/3587 3605/3608/3577 3614/3619/3588 +f 3616/3621/3590 3613/3618/3587 3615/3620/3589 +f 3494/3502/3471 3595/3598/3567 3616/3621/3590 +f 3564/3568/3537 3617/3623/3592 3618/3622/3591 +f 3563/3567/3536 3571/3575/3544 3617/3623/3592 +f 3571/3575/3544 3570/3574/3543 3619/3624/3593 +f 3617/3623/3592 3619/3624/3593 3620/3625/3594 +f 3622/3627/3596 3506/3513/3482 3621/3626/3595 +f 3511/3517/3486 3618/3622/3591 3621/3626/3595 +f 3621/3626/3595 3618/3622/3591 3620/3625/3594 +f 3624/3629/3598 3625/3632/3601 3626/3630/3599 +f 3627/3631/3600 3628/3633/3602 3625/3632/3601 +f 3628/3633/3602 3586/3588/3557 3629/3634/3603 +f 3625/3632/3601 3629/3634/3603 3615/3620/3589 +f 3622/3627/3596 3630/3636/3605 3631/3635/3604 +f 3620/3625/3594 3632/3637/3606 3630/3636/3605 +f 3624/3629/3598 3630/3636/3605 3627/3631/3600 +f 3623/3628/3597 3631/3635/3604 3624/3629/3598 +f 3633/3638/3607 3634/3640/3609 3462/3472/3441 +f 3635/3639/3608 3636/3641/3610 3634/3640/3609 +f 3395/3410/3379 3634/3640/3609 3397/3411/3380 +f 3634/3640/3609 3395/3410/3379 3394/3409/3378 +f 3601/3604/3573 3410/3603/3572 3637/3642/3611 +f 3637/3642/3611 3409/3424/3393 3636/3641/3610 +f 3638/3643/3612 3637/3642/3611 3635/3639/3608 +f 3604/3606/3575 3601/3604/3573 3638/3643/3612 +f 3642/3649/3618 3639/3644/3613 3641/3646/3615 +f 3641/3646/3615 3640/3645/3614 3644/3648/3617 +f 3644/3648/3617 3461/3471/3440 3464/3474/3443 +f 3460/6004/5976 3642/3649/3618 3464/3474/3443 +f 3631/3635/3604 3623/3628/3597 3646/3651/3620 +f 3643/3647/3616 3647/3652/3621 3646/3651/3620 +f 3506/3513/3482 3631/3635/3604 3647/3652/3621 +f 3647/3652/3621 3643/3647/3616 3648/3653/3622 +f 3648/3653/3622 3640/3645/3614 3649/3654/3623 +f 3507/8922/9070 3648/3653/3622 3508/3515/3484 +f 3648/3653/3622 3507/8922/9070 3506/3513/3482 +f 3633/3638/3607 3461/3471/3440 3650/3655/3624 +f 3650/3655/3624 3644/3648/3617 3645/3650/3619 +f 3645/3650/3619 3623/3628/3597 3651/3656/3625 +f 3650/3655/3624 3651/3656/3625 3635/3639/3608 +f 3614/3619/3588 3604/3606/3575 3652/3657/3626 +f 3652/3657/3626 3638/3643/3612 3651/3656/3625 +f 3626/3630/3599 3652/3657/3626 3623/3628/3597 +f 3615/3620/3589 3614/3619/3588 3626/3630/3599 +f 3495/3503/3472 3494/3502/3471 3653/3658/3627 +f 3653/3658/3627 3616/3621/3590 3629/3634/3603 +f 3583/3586/3555 3653/3658/3627 3586/3588/3557 +f 3498/3505/3474 3495/3503/3472 3583/3586/3555 +f 3587/3589/3558 3586/3588/3557 3654/3659/3628 +f 3654/3659/3628 3628/3633/3602 3632/3637/3606 +f 3632/3637/3606 3620/3625/3594 3655/3660/3629 +f 3654/3659/3628 3655/3660/3629 3578/3581/3550 +f 3655/3660/3629 3656/3661/3630 3579/3583/3552 +f 3656/3661/3630 3655/3660/3629 3619/3624/3593 +f 3657/3675/3644 3656/3661/3630 3570/3574/3543 +f 3656/3661/3630 3657/3675/3644 3580/3662/3631 +f 3581/3584/3553 3580/3662/3631 3659/3664/3633 +f 3659/3664/3633 3658/3663/3632 3661/3666/3635 +f 3663/3668/3637 3659/3664/3633 3662/3667/3636 +f 3582/3585/3554 3581/3584/3553 3663/3668/3637 +f 3661/3666/3635 3660/3665/3634 3665/3670/3639 +f 3665/3670/3639 3664/3669/3638 3666/3672/3641 +f 3668/3674/3643 3665/3670/3639 3667/3673/3642 +f 3662/3667/3636 3661/3666/3635 3668/3674/3643 +f 3657/3675/3644 3669/3676/3645 3658/3663/3632 +f 3669/3676/3645 3657/3675/3644 3573/3577/3546 +f 3573/3577/3546 3568/3571/3540 3670/3677/3646 +f 3669/3676/3645 3670/3677/3646 3660/3665/3634 +f 3670/3677/3646 3568/3571/3540 3671/3678/3647 +f 3671/3678/3647 3565/3569/3538 3535/3545/3514 +f 3664/3669/3638 3671/3678/3647 3540/3671/3640 +f 3660/3665/3634 3670/3677/3646 3664/3669/3638 +f 3666/3672/3641 3540/3671/3640 3672/3679/3648 +f 3672/3679/3648 3539/3546/3515 3673/3680/3649 +f 3675/3682/3651 3672/3679/3648 3674/3681/3650 +f 3667/3673/3642 3666/3672/3641 3675/3682/3651 +f 3679/3688/3657 3676/3683/3652 3678/3685/3654 +f 3678/3685/3654 3677/3684/3653 3681/3687/3656 +f 3682/3832/3801 3678/3685/3654 3521/3527/3496 +f 3678/3685/3654 3682/3832/3801 3683/3689/3658 +f 3681/3687/3656 3684/3690/3659 3516/3522/3491 +f 3680/3686/3655 3685/3691/3660 3684/3690/3659 +f 3687/3693/3662 3684/3690/3659 3686/3692/3661 +f 3513/3520/3489 3516/3522/3491 3687/3693/3662 +f 3689/3695/3664 3690/3697/3666 3691/3696/3665 +f 3442/3454/3423 3439/3452/3421 3690/3697/3666 +f 3439/3452/3421 3438/3451/3420 3466/3476/3445 +f 3690/3697/3666 3466/3476/3445 3465/3475/3444 +f 3692/3698/3667 3693/3700/3669 3478/3487/3456 +f 3693/3700/3669 3692/3698/3667 3694/3699/3668 +f 3693/3700/3669 3694/3699/3668 3479/3701/3670 +f 3694/3699/3668 3688/3694/3663 3695/3702/3671 +f 3695/3702/3671 3691/3696/3665 3696/3703/3672 +f 3492/3500/3469 3695/3702/3671 3493/3501/3470 +f 3479/3701/3670 3694/3699/3668 3492/3500/3469 +f 3697/3704/3673 3698/3706/3675 3356/3372/3341 +f 3699/3705/3674 3700/3707/3676 3698/3706/3675 +f 3700/3707/3676 3331/3351/3320 3333/3349/3318 +f 3698/3706/3675 3333/3349/3318 3332/3348/3317 +f 3697/3704/3673 3355/3371/3340 3702/3709/3678 +f 3702/3709/3678 3701/3708/3677 3445/3456/3425 +f 3703/3712/3681 3702/3709/3678 3444/3711/3680 +f 3699/3705/3674 3697/3704/3673 3703/3712/3681 +f 3707/3716/3685 3704/3713/3682 3706/3715/3684 +f 3513/3520/3489 3687/3693/3662 3706/3715/3684 +f 3708/3717/3686 3706/3715/3684 3686/3692/3661 +f 3709/3718/3687 3707/3716/3685 3708/3717/3686 +f 3711/3722/3691 3709/3718/3687 3710/3719/3688 +f 3710/3719/3688 3708/3717/3686 3712/3720/3689 +f 3714/3723/3692 3710/3719/3688 3713/3721/3690 +f 3715/3768/3737 3711/3722/3691 3714/3723/3692 +f 3717/3725/3694 3718/3727/3696 3719/3726/3695 +f 3549/3554/3523 3548/3553/3522 3718/3727/3696 +f 3548/3553/3522 3547/3760/3729 3720/3728/3697 +f 3718/3727/3696 3720/3728/3697 3721/3729/3698 +f 3724/3735/3704 3676/3683/3652 3723/3731/3700 +f 3723/3731/3700 3722/3730/3699 3726/3733/3702 +f 3726/3733/3702 3727/3763/3732 3728/3734/3703 +f 3723/3731/3700 3728/3734/3703 3713/3721/3690 +f 3732/3739/3708 3729/3736/3705 3731/3738/3707 +f 3731/3738/3707 3730/3737/3706 3558/3564/3533 +f 3717/3725/3694 3731/3738/3707 3549/3554/3523 +f 3716/3724/3693 3732/3739/3708 3717/3725/3694 +f 3734/3741/3710 3536/3542/3511 3733/3740/3709 +f 3733/3740/3709 3533/3540/3509 3567/3573/3542 +f 3730/3737/3706 3733/3740/3709 3555/3559/3528 +f 3729/3736/3705 3734/3741/3710 3730/3737/3706 +f 3537/3543/3512 3735/3743/3712 3736/3742/3711 +f 3536/3542/3511 3734/3741/3710 3735/3743/3712 +f 3737/3745/3714 3735/3743/3712 3729/3736/3705 +f 3735/3743/3712 3737/3745/3714 3738/3744/3713 +f 3737/3745/3714 3739/3747/3716 3740/3746/3715 +f 3739/3747/3716 3737/3745/3714 3732/3739/3708 +f 3732/3739/3708 3716/3724/3693 3741/3748/3717 +f 3739/3747/3716 3741/3748/3717 3725/3732/3701 +f 3741/3748/3717 3742/3749/3718 3726/3733/3702 +f 3716/3724/3693 3719/3726/3695 3742/3749/3718 +f 3743/3750/3719 3742/3749/3718 3721/3729/3698 +f 3727/3763/3732 3726/3733/3702 3743/3750/3719 +f 3505/3514/3483 3508/3515/3484 3745/3752/3721 +f 3745/3752/3721 3744/3751/3720 3747/3754/3723 +f 3550/3555/3524 3745/3752/3721 3545/3550/3519 +f 3502/3510/3479 3505/3514/3483 3550/3555/3524 +f 3747/3754/3723 3746/3753/3722 3749/3756/3725 +f 3750/3757/3726 3751/3758/3727 3749/3756/3725 +f 3751/3758/3727 3547/3760/3729 3546/3552/3521 +f 3545/3550/3519 3747/3754/3723 3546/3552/3521 +f 3753/3761/3730 3721/3729/3698 3752/3759/3728 +f 3547/3760/3729 3751/3758/3727 3752/3759/3728 +f 3754/3762/3731 3752/3759/3728 3750/3757/3726 +f 3755/3765/3734 3753/3761/3730 3754/3762/3731 +f 3757/3766/3735 3727/3763/3732 3756/3764/3733 +f 3756/3764/3733 3743/3750/3719 3753/3761/3730 +f 3758/6130/6100 3756/3764/3733 3755/3765/3734 +f 3756/3764/3733 3758/6130/6100 3759/3767/3736 +f 3714/3723/3692 3760/3770/3739 3761/3769/3738 +f 3713/3721/3690 3728/3734/3703 3760/3770/3739 +f 3728/3734/3703 3727/3763/3732 3757/3766/3735 +f 3760/3770/3739 3757/3766/3735 3759/3767/3736 +f 3712/3720/3689 3686/3692/3661 3762/3771/3740 +f 3680/3686/3655 3677/3684/3653 3762/3771/3740 +f 3677/3684/3653 3676/3683/3652 3724/3735/3704 +f 3713/3721/3690 3712/3720/3689 3724/3735/3704 +f 3763/3772/3741 3764/3773/3742 3679/3688/3657 +f 3738/3744/3713 3740/3746/3715 3764/3773/3742 +f 3740/3746/3715 3725/3732/3701 3722/3730/3699 +f 3676/3683/3652 3679/3688/3657 3722/3730/3699 +f 3763/3772/3741 3683/3689/3658 3766/3775/3744 +f 3766/3775/3744 3765/3774/3743 3673/3680/3649 +f 3736/3742/3711 3766/3775/3744 3538/3544/3513 +f 3738/3744/3713 3763/3772/3741 3736/3742/3711 +f 3768/3777/3746 3667/3673/3642 3767/3776/3745 +f 3674/3681/3650 3765/3774/3743 3767/3776/3745 +f 3769/3778/3747 3767/3776/3745 3683/3689/3658 +f 3770/3835/3804 3768/3777/3746 3769/3778/3747 +f 3772/3780/3749 3773/3783/3752 3774/3781/3750 +f 3775/3782/3751 3776/3784/3753 3773/3783/3752 +f 3776/3784/3753 3777/3819/3788 3778/3785/3754 +f 3773/3783/3752 3778/3785/3754 3779/3786/3755 +f 3781/3788/3757 3782/3790/3759 3783/3789/3758 +f 3771/3779/3748 3774/3781/3750 3782/3790/3759 +f 3774/3781/3750 3779/3786/3755 3784/3791/3760 +f 3782/3790/3759 3784/3791/3760 3785/3792/3761 +f 3787/3794/3763 3788/3796/3765 3789/3795/3764 +f 3788/3796/3765 3787/3794/3763 3772/3780/3749 +f 3772/3780/3749 3771/3779/3748 3781/3788/3757 +f 3788/3796/3765 3781/3788/3757 3780/3787/3756 +f 3791/3798/3767 3792/3800/3769 3793/3799/3768 +f 3786/3793/3762 3789/3795/3764 3792/3800/3769 +f 3789/3795/3764 3780/3787/3756 3794/3801/3770 +f 3795/3802/3771 3793/3799/3768 3794/3801/3770 +f 3794/3801/3770 3796/3804/3773 3797/3803/3772 +f 3780/3787/3756 3783/3789/3758 3796/3804/3773 +f 3783/3789/3758 3785/3792/3761 3798/3805/3774 +f 3796/3804/3773 3798/3805/3774 3493/3501/3470 +f 3798/3805/3774 3785/3792/3761 3800/3807/3776 +f 3800/3807/3776 3799/3806/3775 3802/3809/3778 +f 3491/3498/3467 3800/3807/3776 3488/3496/3465 +f 3800/3807/3776 3491/3498/3467 3493/3501/3470 +f 3784/3791/3760 3803/3810/3779 3799/3806/3775 +f 3779/3786/3755 3804/3811/3780 3803/3810/3779 +f 3804/3811/3780 3805/3944/3913 3806/3812/3781 +f 3803/3810/3779 3806/3812/3781 3801/3808/3777 +f 3808/3814/3783 3809/3817/3786 3810/3815/3784 +f 3811/3816/3785 3812/3818/3787 3809/3817/3786 +f 3812/3818/3787 3805/3944/3913 3804/3811/3780 +f 3809/3817/3786 3804/3811/3780 3779/3786/3755 +f 3778/3785/3754 3777/3819/3788 3814/3821/3790 +f 3814/3821/3790 3813/3820/3789 3816/3823/3792 +f 3810/3815/3784 3814/3821/3790 3807/3813/3782 +f 3779/3786/3755 3778/3785/3754 3810/3815/3784 +f 3531/3536/3505 3817/3825/3794 3818/3824/3793 +f 3530/3535/3504 3819/3826/3795 3817/3825/3794 +f 3819/3826/3795 3820/3925/3894 3821/3827/3796 +f 3822/3829/3798 3818/3824/3793 3821/3827/3796 +f 3824/3830/3799 3521/3527/3496 3823/3828/3797 +f 3823/3828/3797 3520/3526/3495 3818/3824/3793 +f 3825/3831/3800 3823/3828/3797 3822/3829/3798 +f 3826/8422/8535 3824/3830/3799 3825/3831/3800 +f 3682/3832/3801 3827/3833/3802 3769/3778/3747 +f 3521/3527/3496 3824/3830/3799 3827/3833/3802 +f 3824/3830/3799 3826/8422/8535 3828/3834/3803 +f 3827/3833/3802 3828/3834/3803 3770/3835/3804 +f 3832/3839/3808 3829/3836/3805 3831/3838/3807 +f 3831/3838/3807 3830/3837/3806 3816/3823/3792 +f 3833/3840/3809 3831/3838/3807 3815/3822/3791 +f 3834/4000/3969 3832/3839/3808 3833/3840/3809 +f 3836/3842/3811 3837/3845/3814 3838/3843/3812 +f 3839/3844/3813 3840/3846/3815 3837/3845/3814 +f 3840/3846/3815 3841/3887/3856 3842/3847/3816 +f 3843/3891/3860 3838/3843/3812 3842/3847/3816 +f 3836/3842/3811 3835/3841/3810 3845/3849/3818 +f 3846/3850/3819 3847/3851/3820 3845/3849/3818 +f 3839/3844/3813 3836/3842/3811 3847/3851/3820 +f 3851/3857/3826 3848/3852/3821 3850/3854/3823 +f 3850/3854/3823 3849/3853/3822 3853/3856/3825 +f 3854/3858/3827 3850/3854/3823 3846/3850/3819 +f 3855/3986/3955 3851/3857/3826 3854/3858/3827 +f 3857/3860/3829 3858/3863/3832 3859/3861/3830 +f 3860/3862/3831 3861/3864/3833 3858/3863/3832 +f 3863/3868/3837 3858/3863/3832 3862/3865/3834 +f 3858/3863/3832 3863/3868/3837 3770/3835/3804 +f 3865/3867/3836 3662/3667/3636 3864/3866/3835 +f 3864/3866/3835 3668/3674/3643 3768/3777/3746 +f 3863/3868/3837 3864/3866/3835 3770/3835/3804 +f 3862/3865/3834 3865/3867/3836 3863/3868/3837 +f 3867/3870/3839 3582/3585/3554 3866/3869/3838 +f 3866/3869/3838 3663/3668/3637 3865/3867/3836 +f 3868/3871/3840 3866/3869/3838 3862/3865/3834 +f 3848/3852/3821 3867/3870/3839 3868/3871/3840 +f 3869/3872/3841 3870/3874/3843 3861/3864/3833 +f 3871/3873/3842 3872/3875/3844 3870/3874/3843 +f 3874/3878/3847 3870/3874/3843 3873/3876/3845 +f 3870/3874/3843 3874/3878/3847 3862/3865/3834 +f 3875/3877/3846 3876/3880/3849 3874/3878/3847 +f 3877/3879/3848 3878/3881/3850 3876/3880/3849 +f 3878/3881/3850 3879/3883/3852 3880/3882/3851 +f 3876/3880/3849 3880/3882/3851 3862/3865/3834 +f 3878/3881/3850 3881/3886/3855 3882/3884/3853 +f 3881/3886/3855 3878/3881/3850 3883/3885/3854 +f 3884/3889/3858 3881/3886/3855 3841/3887/3856 +f 3881/3886/3855 3884/3889/3858 3852/3855/3824 +f 3880/3882/3851 3885/3888/3857 3868/3871/3840 +f 3879/3883/3852 3882/3884/3853 3885/3888/3857 +f 3882/3884/3853 3852/3855/3824 3849/3853/3822 +f 3885/3888/3857 3849/3853/3822 3848/3852/3821 +f 3840/3846/3815 3886/3890/3859 3884/3889/3858 +f 3839/3844/3813 3847/3851/3820 3886/3890/3859 +f 3847/3851/3820 3846/3850/3819 3853/3856/3825 +f 3886/3890/3859 3853/3856/3825 3852/3855/3824 +f 3888/3893/3862 3843/3891/3860 3887/3892/3861 +f 3887/3892/3861 3842/3847/3816 3883/3885/3854 +f 3889/3894/3863 3887/3892/3861 3877/3879/3848 +f 3890/3910/3879 3888/3893/3862 3889/3894/3863 +f 3894/3901/3870 3891/3895/3864 3893/3897/3866 +f 3893/3897/3866 3892/3896/3865 3896/3899/3868 +f 3898/3902/3871 3893/3897/3866 3897/3900/3869 +f 3899/8417/8530 3894/3901/3870 3898/3902/3871 +f 3900/3903/3872 3901/3905/3874 3872/3875/3844 +f 3902/3904/3873 3903/3906/3875 3901/3905/3874 +f 3903/3906/3875 3904/3908/3877 3905/3907/3876 +f 3873/3876/3845 3872/3875/3844 3905/3907/3876 +f 3906/3909/3878 3907/3911/3880 3905/3907/3876 +f 3890/3910/3879 3889/3894/3863 3907/3911/3880 +f 3889/3894/3863 3877/3879/3848 3875/3877/3846 +f 3907/3911/3880 3875/3877/3846 3873/3876/3845 +f 3909/3913/3882 3910/3915/3884 3911/3914/3883 +f 3910/3915/3884 3909/3913/3882 3906/3909/3878 +f 3912/3916/3885 3910/3915/3884 3904/3908/3877 +f 3913/3921/3890 3911/3914/3883 3912/3916/3885 +f 3914/3917/3886 3915/3919/3888 3903/3906/3875 +f 3916/3918/3887 3917/3920/3889 3915/3919/3888 +f 3912/3916/3885 3915/3919/3888 3913/3921/3890 +f 3915/3919/3888 3912/3916/3885 3904/3908/3877 +f 3896/3899/3868 3895/3898/3867 3919/3923/3892 +f 3913/3921/3890 3917/3920/3889 3919/3923/3892 +f 3917/3920/3889 3916/3918/3887 3920/3924/3893 +f 3919/3923/3892 3920/3924/3893 3897/3900/3869 +f 3922/3927/3896 3820/3925/3894 3921/3926/3895 +f 3921/3926/3895 3819/3826/3795 3527/3533/3502 +f 3923/3928/3897 3921/3926/3895 3526/3532/3501 +f 3924/3930/3899 3922/3927/3896 3923/3928/3897 +f 3922/3927/3896 3925/3931/3900 3926/3929/3898 +f 3924/3930/3899 3927/3932/3901 3925/3931/3900 +f 3894/3901/3870 3925/3931/3900 3891/3895/3864 +f 3899/8417/8530 3926/3929/3898 3894/3901/3870 +f 3928/3933/3902 3929/3935/3904 3923/3928/3897 +f 3930/3934/3903 3931/3936/3905 3929/3935/3904 +f 3931/3936/3905 3932/3941/3910 3933/3937/3906 +f 3929/3935/3904 3933/3937/3906 3924/3930/3899 +f 3935/3939/3908 3936/3942/3911 3937/3940/3909 +f 3932/3941/3910 3938/3943/3912 3936/3942/3911 +f 3938/3943/3912 3801/3808/3777 3806/3812/3781 +f 3936/3942/3911 3806/3812/3781 3805/3944/3913 +f 3940/3946/3915 3941/3948/3917 3942/3947/3916 +f 3930/3934/3903 3928/3933/3902 3941/3948/3917 +f 3529/3534/3503 3941/3948/3917 3526/3532/3501 +f 3517/3523/3492 3942/3947/3916 3529/3534/3503 +f 3944/3950/3919 3481/3489/3458 3943/3949/3918 +f 3943/3949/3918 3489/3497/3466 3802/3809/3778 +f 3945/3951/3920 3943/3949/3918 3801/3808/3777 +f 3939/3945/3914 3944/3950/3919 3945/3951/3920 +f 3947/3953/3922 3473/3482/3451 3946/3952/3921 +f 3946/3952/3921 3476/3484/3453 3944/3950/3919 +f 3948/3954/3923 3946/3952/3921 3939/3945/3914 +f 3704/3713/3682 3947/3953/3922 3948/3954/3923 +f 3942/3947/3916 3949/3955/3924 3948/3954/3923 +f 3517/3523/3492 3514/3521/3490 3949/3955/3924 +f 3514/3521/3490 3513/3520/3489 3705/3714/3683 +f 3704/3713/3682 3948/3954/3923 3705/3714/3683 +f 3938/3943/3912 3932/3941/3910 3950/3956/3925 +f 3950/3956/3925 3931/3936/3905 3940/3946/3915 +f 3945/3951/3920 3950/3956/3925 3939/3945/3914 +f 3801/3808/3777 3938/3943/3912 3945/3951/3920 +f 3927/3932/3901 3951/3958/3927 3952/3957/3926 +f 3951/3958/3927 3927/3932/3901 3933/3937/3906 +f 3935/3939/3908 3951/3958/3927 3932/3941/3910 +f 3951/3958/3927 3935/3939/3908 3934/3938/3907 +f 3956/3962/3931 3953/3959/3928 3955/3961/3930 +f 3955/3961/3930 3954/3960/3929 3808/3814/3783 +f 3830/3837/3806 3955/3961/3930 3807/3813/3782 +f 3829/3836/3805 3956/3962/3931 3830/3837/3806 +f 3937/3940/3909 3957/3964/3933 3958/3963/3932 +f 3805/3944/3913 3812/3818/3787 3957/3964/3933 +f 3812/3818/3787 3811/3816/3785 3954/3960/3929 +f 3957/3964/3933 3954/3960/3929 3953/3959/3928 +f 3961/3969/3938 3835/3841/3810 3960/3966/3935 +f 3960/3966/3935 3959/3965/3934 3963/3968/3937 +f 3964/3970/3939 3960/3966/3935 3953/3959/3928 +f 3965/3989/3958 3961/3969/3938 3964/3970/3939 +f 3966/3971/3940 3967/3974/3943 3968/3972/3941 +f 3969/3973/3942 3970/3975/3944 3967/3974/3943 +f 3970/3975/3944 3908/3912/3881 3971/3976/3945 +f 3967/3974/3943 3971/3976/3945 3972/3977/3946 +f 3963/3968/3937 3962/3967/3936 3973/3978/3947 +f 3973/3978/3947 3968/3972/3941 3974/3979/3948 +f 3958/3963/3932 3973/3978/3947 3934/3938/3907 +f 3953/3959/3928 3963/3968/3937 3958/3963/3932 +f 3974/3979/3948 3972/3977/3946 3976/3981/3950 +f 3895/3898/3867 3892/3896/3865 3976/3981/3950 +f 3952/3957/3926 3976/3981/3950 3891/3895/3864 +f 3934/3938/3907 3974/3979/3948 3952/3957/3926 +f 3971/3976/3945 3977/3982/3951 3975/3980/3949 +f 3908/3912/3881 3911/3914/3883 3977/3982/3951 +f 3918/3922/3891 3977/3982/3951 3913/3921/3890 +f 3895/3898/3867 3975/3980/3949 3918/3922/3891 +f 3909/3913/3882 3908/3912/3881 3978/3983/3952 +f 3978/3983/3952 3970/3975/3944 3979/3984/3953 +f 3888/3893/3862 3978/3983/3952 3843/3891/3860 +f 3890/3910/3879 3909/3913/3882 3888/3893/3862 +f 3979/3984/3953 3980/3985/3954 3838/3843/3812 +f 3980/3985/3954 3979/3984/3953 3966/3971/3940 +f 3959/3965/3934 3980/3985/3954 3962/3967/3936 +f 3980/3985/3954 3959/3965/3934 3835/3841/3810 +f 3982/3988/3957 3855/3986/3955 3981/3987/3956 +f 3981/3987/3956 3854/3858/3827 3844/3848/3817 +f 3961/3969/3938 3981/3987/3956 3835/3841/3810 +f 3981/3987/3956 3961/3969/3938 3965/3989/3958 +f 3984/3993/3962 3855/3986/3955 3983/3990/3959 +f 3983/3990/3959 3982/3988/3957 3985/3991/3960 +f 3987/3997/3966 3983/3990/3959 3986/3992/3961 +f 3983/3990/3959 3987/3997/3966 3988/3994/3963 +f 3956/3962/3931 3829/3836/3805 3990/3996/3965 +f 3990/3996/3965 3989/3995/3964 3985/3991/3960 +f 3964/3970/3939 3990/3996/3965 3965/3989/3958 +f 3953/3959/3928 3956/3962/3931 3964/3970/3939 +f 3992/3999/3968 3988/3994/3963 3991/3998/3967 +f 3986/3992/3961 3989/3995/3964 3991/3998/3967 +f 3832/3839/3808 3991/3998/3967 3829/3836/3805 +f 3834/4000/3969 3992/3999/3968 3832/3839/3808 +f 3994/4003/3972 3834/4000/3969 3993/4001/3970 +f 3993/4001/3970 3833/3840/3809 3995/4002/3971 +f 2267/2287/2256 3993/4001/3970 2253/2273/2242 +f 3996/2286/5460 3994/4003/3972 2267/2287/2256 +f 3998/4005/3974 3999/4008/3977 4000/4006/3975 +f 4001/4007/3976 4002/4009/3978 3999/4008/3977 +f 4002/4009/3978 4003/4023/3992 4004/4010/3979 +f 3999/4008/3977 4004/4010/3979 4005/4011/3980 +f 4007/4013/3982 4008/4016/3985 4009/4014/3983 +f 4010/4015/3984 4011/4017/3986 4008/4016/3985 +f 4011/4017/3986 4012/4033/4002 4013/4018/3987 +f 4008/4016/3985 4013/4018/3987 3997/4004/3973 +f 4015/4020/3989 4016/4022/3991 4017/4021/3990 +f 4016/4022/3991 4015/4020/3989 3998/4005/3974 +f 4013/4018/3987 4016/4022/3991 3997/4004/3973 +f 4012/4033/4002 4017/4021/3990 4013/4018/3987 +f 4002/4009/3978 4018/4025/3994 4019/4024/3993 +f 4001/4007/3976 4015/4020/3989 4018/4025/3994 +f 4020/4026/3995 4018/4025/3994 4014/4019/3988 +f 4021/4027/3996 4019/4024/3993 4020/4026/3995 +f 4023/4031/4000 4021/4027/3996 4022/4028/3997 +f 4022/4028/3997 4020/4026/3995 4024/4029/3998 +f 4026/4075/4044 4022/4028/3997 4025/4030/3999 +f 4022/4028/3997 4026/4075/4044 3434/3447/3416 +f 4024/4029/3998 4014/4019/3988 4027/4032/4001 +f 4012/4033/4002 4028/4034/4003 4027/4032/4001 +f 4030/4036/4005 4027/4032/4001 4029/4035/4004 +f 4025/4030/3999 4024/4029/3998 4030/4036/4005 +f 4034/4043/4012 4031/4037/4006 4033/4039/4008 +f 4033/4039/4008 4032/4038/4007 4036/4041/4010 +f 4038/4044/4013 4033/4039/4008 4037/4042/4011 +f 4039/4050/4019 4034/4043/4012 4038/4044/4013 +f 4040/4045/4014 4041/4048/4017 4038/4044/4013 +f 4041/4048/4017 4040/4045/4014 4043/4047/4016 +f 4043/4047/4016 4029/4035/4004 4044/4049/4018 +f 4041/4048/4017 4044/4049/4018 4039/4050/4019 +f 4048/4056/4025 4045/4051/4020 4047/4053/4022 +f 4049/4054/4023 4050/4055/4024 4047/4053/4022 +f 4051/4173/4142 4047/4053/4022 4006/4012/3981 +f 4047/4053/4022 4051/4173/4142 4052/4057/4026 +f 879/4060/4029 841/834/833 4054/4059/4028 +f 4054/4059/4028 4053/4058/4027 4048/4056/4025 +f 4055/4178/4147 4054/4059/4028 4052/4057/4026 +f 4054/4059/4028 4055/4178/4147 880/873/872 +f 4034/4043/4012 4056/4062/4031 4057/4061/4030 +f 4039/4050/4019 4058/4063/4032 4056/4062/4031 +f 4058/4063/4032 4049/4054/4023 4046/4052/4021 +f 4056/4062/4031 4046/4052/4021 4045/4051/4020 +f 4060/4065/4034 4061/4067/4036 4062/4066/4035 +f 4035/4040/4009 4032/4038/4007 4061/4067/4036 +f 4032/4038/4007 4031/4037/4006 4057/4061/4030 +f 4045/4051/4020 4062/4066/4035 4057/4061/4030 +f 4036/4041/4010 4063/4069/4038 4064/4068/4037 +f 4035/4040/4009 4060/4065/4034 4063/4069/4038 +f 4065/4298/4267 4063/4069/4038 4059/4064/4033 +f 4063/4069/4038 4065/4298/4267 4066/4070/4039 +f 4070/4074/4043 4067/4071/4040 4069/4073/4042 +f 4069/4073/4042 4068/4072/4041 4040/4045/4014 +f 4064/4068/4037 4069/4073/4042 4037/4042/4011 +f 4066/4070/4039 4070/4074/4043 4064/4068/4037 +f 4026/4075/4044 4071/4076/4045 3435/3449/3418 +f 4025/4030/3999 4072/4077/4046 4071/4076/4045 +f 4072/4077/4046 4073/4080/4049 4074/4078/4047 +f 4071/4076/4045 4074/4078/4047 3436/4079/4048 +f 4075/4081/4050 4076/4084/4053 4077/4082/4051 +f 4078/4083/4052 4079/4085/4054 4076/4084/4053 +f 4079/4085/4054 4080/4126/4095 4081/4086/4055 +f 4076/4084/4053 4081/4086/4055 4082/4087/4056 +f 4075/4081/4050 4083/4089/4058 4084/4088/4057 +f 4073/4080/4049 4072/4077/4046 4083/4089/4058 +f 4072/4077/4046 4025/4030/3999 4030/4036/4005 +f 4083/4089/4058 4030/4036/4005 4029/4035/4004 +f 4074/4078/4047 4085/4091/4060 4086/4090/4059 +f 4073/4080/4049 4077/4082/4051 4085/4091/4060 +f 4077/4082/4051 4082/4087/4056 4087/4092/4061 +f 4088/4125/4094 4086/4090/4059 4087/4092/4061 +f 4090/4095/4064 3430/3443/3412 4089/4093/4062 +f 3436/4079/4048 4086/4090/4059 4089/4093/4062 +f 4086/4090/4059 4088/4125/4094 4091/4094/4063 +f 4092/4097/4066 4090/4095/4064 4091/4094/4063 +f 3419/3434/3403 3418/3433/3402 4093/4096/4065 +f 4093/4096/4065 3431/3445/3414 4090/4095/4064 +f 4094/4098/4067 4093/4096/4065 4092/4097/4066 +f 3338/3355/3324 3419/3434/3403 4094/4098/4067 +f 4095/4099/4068 4096/4101/4070 4094/4098/4067 +f 3367/4100/4069 3366/3382/3351 4096/4101/4070 +f 3366/3382/3351 3342/3358/3327 3339/3356/3325 +f 4096/4101/4070 3339/3356/3325 3338/3355/3324 +f 4100/4105/4074 4097/4102/4071 4099/4104/4073 +f 4099/4104/4073 4098/4103/4072 4095/4099/4068 +f 4091/4094/4063 4099/4104/4073 4092/4097/4066 +f 4088/4125/4094 4100/4105/4074 4091/4094/4063 +f 3471/3480/3449 4101/4108/4077 4102/4106/4075 +f 3470/4107/4076 4103/4109/4078 4101/4108/4077 +f 4103/4109/4078 4104/4122/4091 4105/4110/4079 +f 4101/4108/4077 4105/4110/4079 4106/4111/4080 +f 4110/4115/4084 4107/4112/4081 4109/4114/4083 +f 4109/4114/4083 4108/4113/4082 3364/3381/3350 +f 4098/4103/4072 4109/4114/4083 3367/4100/4069 +f 4097/4102/4071 4110/4115/4084 4098/4103/4072 +f 4112/4117/4086 3446/3710/3679 4111/4116/4085 +f 4111/4116/4085 3701/3708/3677 3358/3376/3345 +f 4108/4113/4082 4111/4116/4085 3362/3378/3347 +f 4107/4112/4081 4112/4117/4086 4108/4113/4082 +f 3441/3457/3426 4113/4118/4087 3469/3479/3448 +f 3446/3710/3679 4112/4117/4086 4113/4118/4087 +f 4112/4117/4086 4107/4112/4081 4114/4119/4088 +f 4113/4118/4087 4114/4119/4088 3470/4107/4076 +f 4114/4119/4088 4115/4120/4089 4103/4109/4078 +f 4107/4112/4081 4110/4115/4084 4115/4120/4089 +f 4110/4115/4084 4097/4102/4071 4116/4121/4090 +f 4115/4120/4089 4116/4121/4090 4104/4122/4091 +f 4116/4121/4090 4117/4124/4093 4118/4123/4092 +f 4097/4102/4071 4100/4105/4074 4117/4124/4093 +f 4087/4092/4061 4117/4124/4093 4088/4125/4094 +f 4117/4124/4093 4087/4092/4061 4082/4087/4056 +f 4081/4086/4055 4080/4126/4095 4120/4128/4097 +f 4120/4128/4097 4119/4127/4096 4105/4110/4079 +f 4118/4123/4092 4120/4128/4097 4104/4122/4091 +f 4082/4087/4056 4081/4086/4055 4118/4123/4092 +f 4122/4130/4099 4123/4134/4103 4124/4131/4100 +f 4123/4134/4103 4122/4130/4099 4126/4133/4102 +f 4126/4133/4102 3790/3797/3766 3793/3799/3768 +f 4123/4134/4103 3793/3799/3768 3795/3802/3771 +f 4130/4138/4107 4127/4135/4104 4129/4137/4106 +f 4129/4137/4106 4128/4136/4105 4070/4074/4043 +f 4131/4139/4108 4129/4137/4106 4066/4070/4039 +f 4132/4296/4265 4130/4138/4107 4131/4139/4108 +f 3813/3820/3789 4133/4142/4111 4134/4140/4109 +f 4133/4142/4111 3813/3820/3789 4135/4141/4110 +f 4135/4141/4110 4136/4148/4117 4137/4143/4112 +f 4133/4142/4111 4137/4143/4112 4138/4144/4113 +f 3791/3798/3767 4139/4146/4115 4140/4145/4114 +f 4139/4146/4115 3791/3798/3767 4126/4133/4102 +f 4126/4133/4102 4125/4132/4101 4141/4147/4116 +f 4139/4146/4115 4141/4147/4116 4136/4148/4117 +f 4135/4141/4110 3777/3819/3788 4142/4149/4118 +f 4142/4149/4118 3776/3784/3753 3787/3794/3763 +f 4140/4145/4114 4142/4149/4118 3786/3793/3762 +f 4136/4148/4117 4135/4141/4110 4140/4145/4114 +f 3696/3703/3672 3465/3475/3444 4143/4150/4119 +f 4143/4150/4119 3468/3477/3446 4144/4151/4120 +f 4146/4154/4123 4143/4150/4119 4145/4152/4121 +f 4143/4150/4119 4146/4154/4123 3493/3501/3470 +f 4147/4153/4122 4148/4155/4124 4146/4154/4123 +f 4121/4129/4098 4124/4131/4100 4148/4155/4124 +f 4124/4131/4100 3795/3802/3771 3797/3803/3772 +f 4148/4155/4124 3797/3803/3772 3493/3501/3470 +f 4152/4159/4128 4149/4156/4125 4151/4158/4127 +f 4151/4158/4127 4150/4157/4126 4144/4151/4120 +f 4102/4106/4075 4151/4158/4127 3472/3481/3450 +f 4106/4111/4080 4152/4159/4128 4102/4106/4075 +f 4154/4161/4130 4125/4132/4101 4153/4160/4129 +f 4121/4129/4098 4147/4153/4122 4153/4160/4129 +f 4150/4157/4126 4153/4160/4129 4145/4152/4121 +f 4149/4156/4125 4154/4161/4130 4150/4157/4126 +f 4154/4161/4130 4149/4156/4125 4156/4163/4132 +f 4127/4135/4104 4130/4138/4107 4156/4163/4132 +f 4130/4138/4107 4132/4296/4265 4157/4164/4133 +f 4125/4132/4101 4154/4161/4130 4157/4164/4133 +f 4155/4162/4131 4158/4166/4135 4159/4165/4134 +f 4158/4166/4135 4155/4162/4131 4152/4159/4128 +f 4119/4127/4096 4158/4166/4135 4106/4111/4080 +f 4080/4126/4095 4159/4165/4134 4119/4127/4096 +f 4160/4167/4136 4161/4168/4137 4079/4085/4054 +f 4067/4071/4040 4128/4136/4105 4161/4168/4137 +f 4128/4136/4105 4127/4135/4104 4159/4165/4134 +f 4161/4168/4137 4159/4165/4134 4080/4126/4095 +f 4043/4047/4016 4162/4169/4138 4084/4088/4057 +f 4042/4046/4015 4068/4072/4041 4162/4169/4138 +f 4068/4072/4041 4067/4071/4040 4160/4167/4136 +f 4162/4169/4138 4160/4167/4136 4078/4083/4052 +f 4028/4034/4003 4012/4033/4002 4163/4170/4139 +f 4163/4170/4139 4011/4017/3986 4164/4171/4140 +f 4164/4171/4140 4039/4050/4019 4044/4049/4018 +f 4029/4035/4004 4028/4034/4003 4044/4049/4018 +f 4050/4055/4024 4165/4172/4141 4007/4013/3982 +f 4165/4172/4141 4050/4055/4024 4058/4063/4032 +f 4058/4063/4032 4039/4050/4019 4164/4171/4140 +f 4165/4172/4141 4164/4171/4140 4010/4015/3984 +f 4009/4014/3983 4166/4174/4143 4051/4173/4142 +f 4166/4174/4143 4009/4014/3983 4000/4006/3975 +f 4167/4175/4144 4166/4174/4143 4005/4011/3980 +f 4166/4174/4143 4167/4175/4144 4052/4057/4026 +f 4055/4178/4147 4052/4057/4026 4168/4176/4145 +f 4168/4176/4145 4167/4175/4144 4169/4177/4146 +f 888/880/879 4168/4176/4145 885/878/877 +f 4168/4176/4145 888/880/879 880/873/872 +f 4173/4185/4154 4170/4179/4148 4172/4181/4150 +f 4174/4182/4151 4175/4183/4152 4172/4181/4150 +f 4177/4186/4155 4172/4181/4150 4176/4184/4153 +f 4178/4195/4164 4173/4185/4154 4177/4186/4155 +f 4180/4190/4159 4005/4011/3980 4179/4187/4156 +f 4003/4023/3992 4181/4188/4157 4179/4187/4156 +f 4183/4191/4160 4179/4187/4156 4182/4189/4158 +f 4170/4179/4148 4180/4190/4159 4183/4191/4160 +f 4169/4177/4146 4184/4192/4161 900/892/891 +f 4005/4011/3980 4180/4190/4159 4184/4192/4161 +f 4180/4190/4159 4170/4179/4148 4185/4193/4162 +f 4184/4192/4161 4185/4193/4162 901/895/894 +f 4185/4193/4162 4186/4194/4163 905/897/896 +f 4170/4179/4148 4173/4185/4154 4186/4194/4163 +f 4187/4196/4165 4186/4194/4163 4178/4195/4164 +f 906/1523/1492 905/897/896 4187/4196/4165 +f 4190/4202/4171 4174/4182/4151 4189/4198/4167 +f 4189/4198/4167 4188/4197/4166 4192/4200/4169 +f 4194/4203/4172 4189/4198/4167 4193/4201/4170 +f 4195/4228/4197 4190/4202/4171 4194/4203/4172 +f 4196/4204/4173 4197/4207/4176 4198/4205/4174 +f 4199/4206/4175 4200/4208/4177 4197/4207/4176 +f 4200/4208/4177 3428/3441/3410 3425/3439/3408 +f 4197/4207/4176 3425/3439/3408 3424/3438/3407 +f 4200/4208/4177 4199/4206/4175 4202/4210/4179 +f 4202/4210/4179 4201/4209/4178 4023/4031/4000 +f 3432/3446/3415 4202/4210/4179 3434/3447/3416 +f 4202/4210/4179 3432/3446/3415 3428/3441/3410 +f 4019/4024/3993 4021/4027/3996 4203/4211/4180 +f 4199/4206/4175 4204/4212/4181 4203/4211/4180 +f 4204/4212/4181 4182/4189/4158 4181/4188/4157 +f 4203/4211/4180 4181/4188/4157 4003/4023/3992 +f 4196/4204/4173 4193/4201/4170 4205/4213/4182 +f 4205/4213/4182 4192/4200/4169 4206/4214/4183 +f 4204/4212/4181 4205/4213/4182 4182/4189/4158 +f 4199/4206/4175 4196/4204/4173 4204/4212/4181 +f 4206/4214/4183 4207/4215/4184 4183/4191/4160 +f 4207/4215/4184 4206/4214/4183 4188/4197/4166 +f 4188/4197/4166 4174/4182/4151 4171/4180/4149 +f 4207/4215/4184 4171/4180/4149 4170/4179/4148 +f 4209/4217/4186 4210/4221/4190 4211/4218/4187 +f 4210/4221/4190 4209/4217/4186 4213/4220/4189 +f 4214/4249/4218 4210/4221/4190 4176/4184/4153 +f 4210/4221/4190 4214/4249/4218 4215/4222/4191 +f 4217/4224/4193 4218/4226/4195 4219/4225/4194 +f 4218/4226/4195 4217/4224/4193 3427/3444/3413 +f 3421/3435/3404 4218/4226/4195 3418/3433/3402 +f 4218/4226/4195 3421/3435/3404 3423/4227/4196 +f 4194/4203/4172 4220/4230/4199 4221/4229/4198 +f 4220/4230/4199 4194/4203/4172 4198/4205/4174 +f 4217/4224/4193 4220/4230/4199 3424/3438/3407 +f 4220/4230/4199 4217/4224/4193 4216/4223/4192 +f 4222/4231/4200 4223/4233/4202 3487/3495/3464 +f 4224/4232/4201 4225/4234/4203 4223/4233/4202 +f 4225/4234/4203 4226/4236/4205 4227/4235/4204 +f 4223/4233/4202 4227/4235/4204 3451/3461/3430 +f 4227/4235/4204 4228/4237/4206 3452/3463/3432 +f 4226/4236/4205 4229/4238/4207 4228/4237/4206 +f 4229/4238/4207 3375/3390/3359 3377/3391/3360 +f 4228/4237/4206 3377/3391/3360 3381/3395/3364 +f 4231/4240/4209 3423/4227/4196 4230/4239/4208 +f 4230/4239/4208 3422/3437/3406 3373/3387/3356 +f 4229/4238/4207 4230/4239/4208 3375/3390/3359 +f 4226/4236/4205 4231/4240/4209 4229/4238/4207 +f 4232/4241/4210 4233/4242/4211 4225/4234/4203 +f 4216/4223/4192 4219/4225/4194 4233/4242/4211 +f 4219/4225/4194 3423/4227/4196 4231/4240/4209 +f 4233/4242/4211 4231/4240/4209 4226/4236/4205 +f 4235/4245/4214 4208/4216/4185 4234/4243/4212 +f 4234/4243/4212 4211/4218/4187 4236/4244/4213 +f 4236/4244/4213 4224/4232/4201 4222/4231/4200 +f 4234/4243/4212 4222/4231/4200 3486/3494/3463 +f 4236/4244/4213 4215/4222/4191 4238/4247/4216 +f 4195/4228/4197 4221/4229/4198 4238/4247/4216 +f 4221/4229/4198 4216/4223/4192 4232/4241/4210 +f 4238/4247/4216 4232/4241/4210 4224/4232/4201 +f 4190/4202/4171 4195/4228/4197 4239/4248/4217 +f 4239/4248/4217 4237/4246/4215 4214/4249/4218 +f 4175/4183/4152 4239/4248/4217 4176/4184/4153 +f 4174/4182/4151 4190/4202/4171 4175/4183/4152 +f 4213/4220/4189 4240/4251/4220 4177/4186/4155 +f 4240/4251/4220 4213/4220/4189 4241/4250/4219 +f 4243/4253/4222 4240/4251/4220 4242/4252/4221 +f 4178/4195/4164 4177/4186/4155 4243/4253/4222 +f 4247/4257/4226 4244/4254/4223 4246/4256/4225 +f 4178/4195/4164 4243/4253/4222 4246/4256/4225 +f 4242/4252/4221 4247/4257/4226 4243/4253/4222 +f 4249/4260/4229 3301/3320/3289 4248/4258/4227 +f 4248/4258/4227 3316/3334/3303 4250/4259/4228 +f 3984/3993/3962 4248/4258/4227 3855/3986/3955 +f 4248/4258/4227 3984/3993/3962 3988/3994/3963 +f 4250/4259/4228 3313/3331/3300 4251/4262/4231 +f 4251/4262/4231 3312/4261/4230 4252/4263/4232 +f 4252/4263/4232 3848/3852/3821 3851/3857/3826 +f 4251/4262/4231 3851/3857/3826 3855/3986/3955 +f 4253/4264/4233 4254/4265/4234 4252/4263/4232 +f 4254/4265/4234 4253/4264/4233 3577/3580/3549 +f 3577/3580/3549 3582/3585/3554 3867/3870/3839 +f 4254/4265/4234 3867/3870/3839 3848/3852/3821 +f 3310/3328/3297 3309/3327/3296 4255/4266/4235 +f 4255/4266/4235 3499/3507/3476 3585/3590/3559 +f 4253/4264/4233 4255/4266/4235 3574/3578/3547 +f 3311/3330/3299 3310/3328/3297 4253/4264/4233 +f 4258/4272/4241 4242/4252/4221 4257/4268/4237 +f 4257/4268/4237 4256/4267/4236 4260/4270/4239 +f 4262/4273/4242 4257/4268/4237 4261/4271/4240 +f 4263/4284/4253 4258/4272/4241 4262/4273/4242 +f 4264/4274/4243 4265/4275/4244 3485/3493/3462 +f 4259/4269/4238 4266/4276/4245 4265/4275/4244 +f 4266/4276/4245 4208/4216/4185 4235/4245/4214 +f 3486/3494/3463 3485/3493/3462 4235/4245/4214 +f 4241/4250/4219 4212/4219/4188 4267/4277/4246 +f 4208/4216/4185 4266/4276/4245 4267/4277/4246 +f 4266/4276/4245 4259/4269/4238 4256/4267/4236 +f 4242/4252/4221 4241/4250/4219 4256/4267/4236 +f 3600/3601/3570 3591/3594/3563 4269/4279/4248 +f 4269/4279/4248 4268/4278/4247 4271/4281/4250 +f 3482/3490/3459 4269/4279/4248 3484/3492/3461 +f 3447/3458/3427 3600/3601/3570 3482/3490/3459 +f 4272/4282/4251 4273/4283/4252 4271/4281/4250 +f 4273/4283/4252 4272/4282/4251 4260/4270/4239 +f 4264/4274/4243 4273/4283/4252 4259/4269/4238 +f 4273/4283/4252 4264/4274/4243 3484/3492/3461 +f 4275/4288/4257 4263/4284/4253 4274/4285/4254 +f 4274/4285/4254 4262/4273/4242 4276/4286/4255 +f 4276/4286/4255 3297/3317/3286 4277/4287/4256 +f 4274/4285/4254 4277/4287/4256 4244/4254/4223 +f 3992/3999/3968 4278/4290/4259 4279/4289/4258 +f 3834/4000/3969 3994/4003/3972 4278/4290/4259 +f 3994/4003/3972 3996/2286/5460 4280/4291/4260 +f 4278/4290/4259 4280/4291/4260 4281/4292/4261 +f 4283/4295/4264 3303/4293/4262 4282/4294/4263 +f 4282/4294/4263 3302/3322/3291 4249/4260/4229 +f 4279/4289/4258 4282/4294/4263 3988/3994/3963 +f 4281/4292/4261 4283/4295/4264 4279/4289/4258 +f 4285/4299/4268 4132/4296/4265 4284/4297/4266 +f 4284/4297/4266 4131/4139/4108 4065/4298/4267 +f 4286/4300/4269 4284/4297/4266 4059/4064/4033 +f 4138/4144/4113 4285/4299/4268 4286/4300/4269 +f 4137/4143/4112 4287/4301/4270 4285/4299/4268 +f 4136/4148/4117 4141/4147/4116 4287/4301/4270 +f 4141/4147/4116 4125/4132/4101 4157/4164/4133 +f 4287/4301/4270 4157/4164/4133 4132/4296/4265 +f 3995/4002/3971 3815/3822/3791 4288/4302/4271 +f 4288/4302/4271 4134/4140/4109 4289/4303/4272 +f 2254/2275/2244 4288/4302/4271 2255/831/4273 +f 2253/2273/2242 3995/4002/3971 2254/2275/2244 +f 4289/4303/4272 4290/4304/4274 838/832/831 +f 4138/4144/4113 4286/4300/4269 4290/4304/4274 +f 4286/4300/4269 4059/4064/4033 4291/4305/4275 +f 4290/4304/4274 4291/4305/4275 841/834/833 +f 4291/4305/4275 4059/4064/4033 4292/4306/4276 +f 4045/4051/4020 4053/4058/4027 4292/4306/4276 +f 841/834/833 4291/4305/4275 4053/4058/4027 +f 4293/4307/4277 4294/4308/4278 1496/1521/1490 +f 4244/4254/4223 4277/4287/4256 4294/4308/4278 +f 3300/3319/3288 4294/4308/4278 3297/3317/3286 +f 1497/1522/1491 1496/1521/1490 3300/3319/3288 +f 4187/4196/4165 4178/4195/4164 4295/4309/4279 +f 4244/4254/4223 4293/4307/4277 4295/4309/4279 +f 1499/1524/1493 4295/4309/4279 1495/1519/1488 +f 4295/4309/4279 1499/1524/1493 906/1523/1492 +f 4247/4257/4226 4296/4310/4280 4275/4288/4257 +f 4242/4252/4221 4258/4272/4241 4296/4310/4280 +f 4263/4284/4253 4275/4288/4257 4258/4272/4241 +f 3590/3592/3561 4297/4311/4281 4268/4278/4247 +f 4297/4311/4281 3590/3592/3561 3522/3528/3497 +f 3522/3528/3497 3305/3324/3293 4298/4312/4282 +f 4270/4280/4249 4268/4278/4247 4298/4312/4282 +f 3314/3332/3301 3297/3317/3286 4300/4314/4284 +f 4300/4314/4284 4299/4313/4283 4298/4312/4282 +f 4300/4314/4284 4298/4312/4282 3305/3324/3293 +f 4272/4282/4251 4270/4280/4249 4301/4315/4285 +f 3297/3317/3286 4276/4286/4255 4301/4315/4285 +f 4301/4315/4285 4276/4286/4255 4261/4271/4240 +f 4303/4319/4289 156/150/150 4302/4316/4286 +f 4302/4316/4286 163/157/157 4304/4317/4287 +f 4306/4320/4290 4302/4316/4286 4305/4318/4288 +f 4307/4321/4291 4303/4319/4289 4306/4320/4290 +f 4303/4319/4289 4307/4321/4291 4309/4323/4293 +f 4309/4323/4293 4308/4322/4292 2296/2321/2290 +f 775/769/769 4309/4323/4293 772/767/767 +f 4309/4323/4293 775/769/769 4303/4319/4289 +f 4313/4330/4300 4310/4324/4294 4312/4326/4296 +f 4314/4327/4297 4315/4328/4298 4312/4326/4296 +f 4317/4331/4301 4312/4326/4296 4316/4329/4299 +f 4318/6264/6234 4313/4330/4300 4317/4331/4301 +f 4322/4338/4308 4319/4332/4302 4321/4334/4304 +f 4321/4334/4304 4320/4333/4303 4324/4336/4306 +f 4326/4339/4309 4321/4334/4304 4325/4337/4307 +f 4327/4343/4313 4322/4338/4308 4326/4339/4309 +f 4331/4344/4314 4328/4340/4310 4330/4342/4312 +f 4330/4342/4312 4329/4341/4311 4322/4338/4308 +f 4332/4345/4315 4330/4342/4312 4327/4343/4313 +f 4333/4349/4319 4331/4344/4314 4332/4345/4315 +f 4337/4350/4320 4334/4346/4316 4336/4348/4318 +f 4336/4348/4318 4335/4347/4317 4331/4344/4314 +f 4338/4351/4321 4336/4348/4318 4333/4349/4319 +f 4339/4354/4324 4337/4350/4320 4338/4351/4321 +f 4340/4352/4322 4341/4353/4323 4315/4328/4298 +f 4334/4346/4316 4337/4350/4320 4341/4353/4323 +f 4342/4355/4325 4341/4353/4323 4339/4354/4324 +f 4316/4329/4299 4315/4328/4298 4342/4355/4325 +f 4324/4336/4306 4323/4335/4305 4344/4357/4327 +f 4344/4357/4327 4343/4356/4326 4346/4359/4329 +f 4348/4361/4331 4344/4357/4327 4347/4360/4330 +f 4325/4337/4307 4324/4336/4306 4348/4361/4331 +f 4352/4368/4338 4349/4362/4332 4351/4364/4334 +f 4351/4364/4334 4350/4363/4333 4354/4366/4336 +f 4356/4369/4339 4351/4364/4334 4355/4367/4337 +f 4357/4421/4391 4352/4368/4338 4356/4369/4339 +f 4354/4366/4336 4353/4365/4335 4359/4371/4341 +f 4359/4371/4341 4358/4370/4340 4361/4373/4343 +f 4363/4375/4345 4359/4371/4341 4362/4374/4344 +f 4355/4367/4337 4354/4366/4336 4363/4375/4345 +f 4365/4377/4347 4366/4379/4349 4367/4378/4348 +f 4310/4324/4294 4313/4330/4300 4366/4379/4349 +f 4313/4330/4300 4318/6264/6234 4368/4380/4350 +f 4366/4379/4349 4368/4380/4350 4369/4381/4351 +f 4373/4385/4355 4370/4382/4352 4372/4384/4354 +f 4372/4384/4354 4371/4383/4353 4367/4378/4348 +f 4374/4386/4356 4372/4384/4354 4369/4381/4351 +f 4375/4389/4359 4373/4385/4355 4374/4386/4356 +f 4361/4373/4343 4360/4372/4342 4377/4388/4358 +f 4377/4388/4358 4376/4387/4357 4373/4385/4355 +f 4378/4390/4360 4377/4388/4358 4375/4389/4359 +f 4362/4374/4344 4361/4373/4343 4378/4390/4360 +f 4380/4392/4362 4381/4396/4366 4382/4393/4363 +f 4381/4396/4366 4380/4392/4362 4384/4395/4365 +f 4384/4395/4365 4385/4432/4402 4386/4397/4367 +f 4381/4396/4366 4386/4397/4367 4387/4398/4368 +f 4389/4400/4370 4390/4402/4372 4391/4401/4371 +f 4379/4391/4361 4382/4393/4363 4390/4402/4372 +f 4382/4393/4363 4387/4398/4368 4392/4403/4373 +f 4390/4402/4372 4392/4403/4373 4393/4404/4374 +f 4394/4405/4375 4395/4407/4377 4346/4359/4329 +f 4396/4406/4376 4397/4408/4378 4395/4407/4377 +f 4397/4408/4378 4398/4413/4383 4399/4409/4379 +f 4347/4360/4330 4346/4359/4329 4399/4409/4379 +f 4400/4410/4380 4401/4411/4381 4397/4408/4378 +f 4388/4399/4369 4391/4401/4371 4401/4411/4381 +f 4391/4401/4371 4393/4404/4374 4402/4412/4382 +f 4401/4411/4381 4402/4412/4382 4398/4413/4383 +f 4403/4414/4384 4404/4416/4386 4384/4395/4365 +f 4405/4415/4385 4406/4417/4387 4404/4416/4386 +f 4406/4417/4387 4407/4426/4396 4408/4418/4388 +f 4385/4432/4402 4384/4395/4365 4408/4418/4388 +f 4406/4417/4387 4405/4415/4385 4410/4420/4390 +f 4410/4420/4390 4409/4419/4389 4352/4368/4338 +f 4411/4422/4392 4410/4420/4390 4357/4421/4391 +f 4407/4426/4396 4406/4417/4387 4411/4422/4392 +f 4413/4424/4394 4414/4427/4397 4415/4425/4395 +f 4407/4426/4396 4411/4422/4392 4414/4427/4397 +f 4414/4427/4397 4411/4422/4392 4357/4421/4391 +f 4413/4424/4394 4412/4423/4393 4417/4429/4399 +f 4418/4430/4400 4419/4431/4401 4417/4429/4399 +f 4408/4418/4388 4417/4429/4399 4385/4432/4402 +f 4407/4426/4396 4413/4424/4394 4408/4418/4388 +f 4419/4431/4401 4418/4430/4400 4421/4434/4404 +f 4422/4435/4405 4423/4436/4406 4421/4434/4404 +f 4423/4436/4406 4387/4398/4368 4386/4397/4367 +f 4421/4434/4404 4386/4397/4367 4385/4432/4402 +f 4424/4437/4407 4425/4439/4409 4423/4436/4406 +f 4426/4438/4408 4427/4440/4410 4425/4439/4409 +f 4427/4440/4410 4393/4404/4374 4392/4403/4373 +f 4425/4439/4409 4392/4403/4373 4387/4398/4368 +f 4431/4444/4414 4428/4441/4411 4430/4443/4413 +f 4430/4443/4413 4429/4442/4412 4402/4412/4382 +f 4427/4440/4410 4430/4443/4413 4393/4404/4374 +f 4426/4438/4408 4431/4444/4414 4427/4440/4410 +f 4432/4445/4415 4433/4446/4416 4429/4442/4412 +f 4433/4446/4416 4432/4445/4415 4399/4409/4379 +f 4433/4446/4416 4399/4409/4379 4398/4413/4383 +f 2019/2043/2012 2018/2042/2011 4435/4448/4418 +f 4435/4448/4418 4434/4447/4417 4437/4450/4420 +f 4439/4452/4422 4435/4448/4418 4438/4451/4421 +f 1833/1855/1824 2019/2043/2012 4439/4452/4422 +f 1834/1856/1825 1833/1855/1824 4440/4453/4423 +f 4440/4453/4423 4439/4452/4422 4441/4454/4424 +f 4443/4456/4426 4440/4453/4423 4442/4455/4425 +f 1835/1857/1826 1834/1856/1825 4443/4456/4426 +f 4444/4457/4427 4445/4460/4430 4443/4456/4426 +f 4445/4460/4430 4444/4457/4427 4447/4459/4429 +f 1837/1859/1828 4445/4460/4430 1839/1861/1830 +f 4445/4460/4430 1837/1859/1828 1835/1857/1826 +f 4451/4464/4434 4448/4461/4431 4450/4463/4433 +f 4450/4463/4433 4449/4462/4432 1806/1829/1798 +f 4452/4465/4435 4450/4463/4433 1805/1828/1797 +f 4453/4472/4442 4451/4464/4434 4452/4465/4435 +f 4455/4467/4437 4456/4470/4440 4457/4468/4438 +f 4458/4469/4439 4459/4471/4441 4456/4470/4440 +f 4459/4471/4441 4448/4461/4431 4451/4464/4434 +f 4456/4470/4440 4451/4464/4434 4453/4472/4442 +f 4461/4474/4444 4462/4477/4447 4463/4475/4445 +f 4464/4476/4446 4465/4478/4448 4462/4477/4447 +f 4465/4478/4448 4466/4484/4454 4467/4479/4449 +f 4462/4477/4447 4467/4479/4449 4468/4480/4450 +f 4472/4485/4455 4469/4481/4451 4471/4483/4453 +f 4471/4483/4453 4470/4482/4452 4467/4479/4449 +f 4473/4486/4456 4471/4483/4453 4466/4484/4454 +f 4474/4490/4460 4472/4485/4455 4473/4486/4456 +f 4476/4488/4458 4477/4491/4461 4478/4489/4459 +f 4474/4490/4460 4479/4492/4462 4477/4491/4461 +f 4481/4588/4558 4477/4491/4461 4480/4493/4463 +f 4477/4491/4461 4481/4588/4558 4482/4494/4464 +f 4483/4495/4465 4484/4498/4468 4479/4492/4462 +f 4484/4498/4468 4483/4495/4465 4486/4497/4467 +f 4488/4500/4470 4484/4498/4468 4487/4499/4469 +f 4480/4493/4463 4479/4492/4462 4488/4500/4470 +f 4492/4504/4474 4489/4501/4471 4491/4503/4473 +f 4485/4496/4466 4483/4495/4465 4491/4503/4473 +f 4473/4486/4456 4491/4503/4473 4474/4490/4460 +f 4466/4484/4454 4492/4504/4474 4473/4486/4456 +f 4496/4511/4481 4493/4505/4475 4495/4507/4477 +f 4495/4507/4477 4494/4506/4476 4498/4509/4479 +f 4500/4512/4482 4495/4507/4477 4499/4510/4480 +f 4501/4953/4924 4496/4511/4481 4500/4512/4482 +f 4503/4514/4484 4504/4517/4487 4505/4515/4485 +f 4506/4516/4486 4507/4518/4488 4504/4517/4487 +f 4507/4518/4488 4508/4533/4503 4509/4519/4489 +f 4504/4517/4487 4509/4519/4489 4510/4520/4490 +f 4514/4526/4496 4511/4521/4491 4513/4523/4493 +f 4513/4523/4493 4512/4522/4492 4516/4525/4495 +f 4516/4525/4495 4489/4501/4471 4492/4504/4474 +f 4466/4484/4454 4514/4526/4496 4492/4504/4474 +f 4518/4528/4498 4519/4530/4500 4520/4529/4499 +f 4515/4524/4494 4512/4522/4492 4519/4530/4500 +f 4512/4522/4492 4511/4521/4491 4521/4531/4501 +f 4519/4530/4500 4521/4531/4501 4522/4532/4502 +f 4507/4518/4488 4523/4535/4505 4524/4534/4504 +f 4506/4516/4486 4525/4536/4506 4523/4535/4505 +f 4525/4536/4506 4526/4739/4710 4527/4537/4507 +f 4523/4535/4505 4527/4537/4507 4528/4538/4508 +f 4532/4545/4515 4529/4539/4509 4531/4541/4511 +f 4531/4541/4511 4530/4540/4510 4534/4543/4513 +f 4536/4546/4516 4531/4541/4511 4535/4544/4514 +f 4537/4547/4517 4532/4545/4515 4536/4546/4516 +f 4538/4548/4518 4539/4550/4520 4532/4545/4515 +f 4540/4549/4519 4541/4551/4521 4539/4550/4520 +f 4541/4551/4521 4542/5301/5272 4543/4552/4522 +f 4539/4550/4520 4543/4552/4522 4529/4539/4509 +f 4545/4554/4524 4546/4557/4527 4547/4555/4525 +f 4548/4556/4526 4549/4558/4528 4546/4557/4527 +f 4549/4558/4528 4550/4646/4616 4551/4559/4529 +f 4546/4557/4527 4551/4559/4529 4448/4461/4431 +f 4459/4471/4441 4458/4469/4439 4553/4561/4531 +f 4553/4561/4531 4552/4560/4530 4555/4563/4533 +f 4547/4555/4525 4553/4561/4531 4544/4553/4523 +f 4448/4461/4431 4459/4471/4441 4547/4555/4525 +f 4557/4565/4535 4558/4568/4538 4559/4566/4536 +f 4560/4567/4537 4561/4569/4539 4558/4568/4538 +f 4561/4569/4539 4548/4556/4526 4545/4554/4524 +f 4558/4568/4538 4545/4554/4524 4544/4553/4523 +f 4555/4563/4533 4554/4562/4532 4563/4571/4541 +f 4563/4571/4541 4562/4570/4540 4565/4573/4543 +f 4559/4566/4536 4563/4571/4541 4556/4564/4534 +f 4544/4553/4523 4555/4563/4533 4559/4566/4536 +f 4567/4576/4546 4475/4487/4457 4566/4574/4544 +f 4566/4574/4544 4478/4489/4459 4568/4575/4545 +f 4562/4570/4540 4566/4574/4544 4564/4572/4542 +f 4554/4562/4532 4567/4576/4546 4562/4570/4540 +f 4503/4514/4484 4502/4513/4483 4570/4578/4548 +f 4570/4578/4548 4569/4577/4547 4572/4580/4550 +f 4574/4582/4552 4570/4578/4548 4573/4581/4551 +f 4506/4516/4486 4503/4514/4484 4574/4582/4552 +f 4576/4584/4554 4577/4586/4556 4578/4585/4555 +f 4535/4544/4514 4579/4587/4557 4577/4586/4556 +f 4579/4587/4557 4573/4581/4551 4572/4580/4550 +f 4577/4586/4556 4572/4580/4550 4571/4579/4549 +f 4581/4592/4562 4482/4494/4464 4580/4589/4559 +f 4580/4589/4559 4481/4588/4558 4582/4590/4560 +f 4582/4590/4560 4583/4596/4566 4584/4591/4561 +f 4580/4589/4559 4584/4591/4561 4575/4583/4553 +f 4582/4590/4560 4480/4493/4463 4585/4593/4563 +f 4487/4499/4469 4586/4594/4564 4585/4593/4563 +f 4586/4594/4564 4587/4598/4568 4588/4595/4565 +f 4585/4593/4563 4588/4595/4565 4583/4596/4566 +f 4590/4601/4571 4583/4596/4566 4589/4597/4567 +f 4589/4597/4567 4588/4595/4565 4591/4599/4569 +f 4593/4602/4572 4589/4597/4567 4592/4600/4570 +f 4537/4547/4517 4590/4601/4571 4593/4602/4572 +f 4590/4601/4571 4594/4603/4573 4584/4591/4561 +f 4537/4547/4517 4536/4546/4516 4594/4603/4573 +f 4536/4546/4516 4535/4544/4514 4576/4584/4554 +f 4594/4603/4573 4576/4584/4554 4575/4583/4553 +f 4568/4575/4545 4595/4605/4575 4596/4604/4574 +f 4482/4494/4464 4581/4592/4562 4595/4605/4575 +f 4581/4592/4562 4575/4583/4553 4578/4585/4555 +f 4595/4605/4575 4578/4585/4555 4571/4579/4549 +f 4565/4573/4543 4564/4572/4542 4597/4606/4576 +f 4571/4579/4549 4569/4577/4547 4597/4606/4576 +f 4569/4577/4547 4502/4513/4483 4598/4607/4577 +f 4556/4564/4534 4565/4573/4543 4598/4607/4577 +f 4557/4565/4535 4556/4564/4534 4599/4608/4578 +f 4502/4513/4483 4505/4515/4485 4599/4608/4578 +f 4505/4515/4485 4510/4520/4490 4600/4609/4579 +f 4560/4567/4537 4557/4565/4535 4600/4609/4579 +f 4602/4613/4583 4508/4533/4503 4601/4610/4580 +f 4601/4610/4580 4524/4534/4504 4603/4611/4581 +f 4603/4611/4581 4604/4619/4589 4605/4612/4582 +f 4606/4616/4586 4602/4613/4583 4605/4612/4582 +f 4509/4519/4489 4607/4615/4585 4608/4614/4584 +f 4607/4615/4585 4509/4519/4489 4602/4613/4583 +f 4609/4624/4594 4607/4615/4585 4606/4616/4586 +f 4607/4615/4585 4609/4624/4594 4610/4617/4587 +f 4605/4612/4582 4611/4620/4590 4612/4618/4588 +f 4604/4619/4589 4613/4621/4591 4611/4620/4590 +f 4615/4623/4593 4611/4620/4590 4614/4622/4592 +f 4616/4626/4596 4612/4618/4588 4615/4623/4593 +f 4618/4627/4597 4610/4617/4587 4617/4625/4595 +f 4606/4616/4586 4612/4618/4588 4617/4625/4595 +f 4619/4628/4598 4617/4625/4595 4616/4626/4596 +f 4620/4635/4605 4618/4627/4597 4619/4628/4598 +f 4622/4630/4600 4623/4633/4603 4624/4631/4601 +f 4625/4632/4602 4626/4634/4604 4623/4633/4603 +f 4626/4634/4604 4610/4617/4587 4618/4627/4597 +f 4623/4633/4603 4618/4627/4597 4620/4635/4605 +f 4628/4637/4607 4560/4567/4537 4627/4636/4606 +f 4627/4636/4606 4600/4609/4579 4608/4614/4584 +f 4626/4634/4604 4627/4636/4606 4610/4617/4587 +f 4625/4632/4602 4628/4637/4607 4626/4634/4604 +f 4628/4637/4607 4629/4638/4608 4561/4569/4539 +f 4625/4632/4602 4630/4639/4609 4629/4638/4608 +f 4630/4639/4609 4631/4641/4611 4632/4640/4610 +f 4629/4638/4608 4632/4640/4610 4548/4556/4526 +f 4632/4640/4610 4631/4641/4611 4634/4643/4613 +f 4634/4643/4613 4633/4642/4612 4636/4645/4615 +f 4549/4558/4528 4634/4643/4613 4550/4646/4616 +f 4548/4556/4526 4632/4640/4610 4549/4558/4528 +f 4551/4559/4529 4550/4646/4616 4638/4648/4618 +f 4638/4648/4618 4637/4647/4617 1857/1881/1850 +f 4449/4462/4432 4638/4648/4618 1809/1831/1800 +f 4448/4461/4431 4551/4559/4529 4449/4462/4432 +f 4636/4645/4615 4635/4644/4614 4640/4650/4620 +f 4640/4650/4620 4639/4649/4619 1850/1872/1841 +f 4637/4647/4617 4640/4650/4620 1855/1877/1846 +f 4550/4646/4616 4636/4645/4615 4637/4647/4617 +f 4644/4654/4625 4641/4651/4621 4643/4653/4623 +f 4643/4653/4623 4642/4652/4622 1859/1882/1851 +f 4639/4649/4619 4643/4653/4623 1847/1870/1839 +f 4635/4644/4614 4644/4654/4625 4639/4649/4619 +f 4649/4658/4629 4646/4655/4626 4648/4657/4628 +f 4648/4657/4628 4647/4656/4627 4644/4654/4625 +f 4633/4642/4612 4648/4657/4628 4635/4644/4614 +f 4631/4641/4611 4649/4658/4629 4633/4642/4612 +f 4622/4630/4600 4621/4629/4599 4651/4660/4631 +f 4651/4660/4631 4650/4659/4630 4649/4658/4629 +f 4630/4639/4609 4651/4660/4631 4631/4641/4611 +f 4625/4632/4602 4622/4630/4600 4630/4639/4609 +f 4655/4667/4638 4652/4661/4632 4654/4663/4634 +f 4654/4663/4634 4653/4662/4633 4657/4665/4636 +f 4659/4668/4639 4654/4663/4634 4658/4666/4637 +f 4660/4684/4655 4655/4667/4638 4659/4668/4639 +f 4541/4551/4521 4540/4549/4519 4662/4670/4641 +f 4662/4670/4641 4661/4669/4640 4657/4665/4636 +f 4663/4671/4642 4662/4670/4641 4656/4664/4635 +f 4542/5301/5272 4541/4551/4521 4663/4671/4642 +f 4664/4672/4643 4665/4675/4646 4593/4602/4572 +f 4665/4675/4646 4664/4672/4643 4667/4674/4645 +f 4538/4548/4518 4665/4675/4646 4540/4549/4519 +f 4665/4675/4646 4538/4548/4518 4537/4547/4517 +f 4667/4674/4645 4666/4673/4644 4669/4677/4648 +f 4669/4677/4648 4668/4676/4647 4671/4679/4650 +f 4661/4669/4640 4669/4677/4648 4658/4666/4637 +f 4540/4549/4519 4667/4674/4645 4661/4669/4640 +f 4671/4679/4650 4670/4678/4649 4673/4681/4652 +f 4673/4681/4652 4672/4680/4651 4675/4683/4654 +f 4659/4668/4639 4673/4681/4652 4660/4684/4655 +f 4658/4666/4637 4671/4679/4650 4659/4668/4639 +f 4679/4690/4661 4676/4685/4656 4678/4687/4658 +f 4678/4687/4658 4677/4686/4657 4681/4689/4660 +f 4520/4529/4499 4678/4687/4658 4517/4527/4497 +f 4678/4687/4658 4520/4529/4499 4522/4532/4502 +f 4683/4692/4663 4684/4694/4665 4685/4693/4664 +f 4680/4688/4659 4677/4686/4657 4684/4694/4665 +f 4677/4686/4657 4676/4685/4656 4686/4695/4666 +f 4684/4694/4665 4686/4695/4666 4687/4696/4667 +f 4675/4683/4654 4688/4698/4669 4689/4697/4668 +f 4674/4682/4653 4690/4699/4670 4688/4698/4669 +f 4690/4699/4670 4680/4688/4659 4683/4692/4663 +f 4688/4698/4669 4683/4692/4663 4682/4691/4662 +f 4655/4667/4638 4691/4701/4672 4692/4700/4671 +f 4660/4684/4655 4689/4697/4668 4691/4701/4672 +f 4689/4697/4668 4682/4691/4662 4693/4702/4673 +f 4691/4701/4672 4693/4702/4673 4694/4703/4674 +f 4693/4702/4673 4695/4705/4676 4696/4704/4675 +f 4682/4691/4662 4685/4693/4664 4695/4705/4676 +f 4685/4693/4664 4687/4696/4667 4697/4706/4677 +f 4695/4705/4676 4697/4706/4677 4698/4707/4678 +f 4697/4706/4677 4699/4709/4680 4700/4708/4679 +f 4687/4696/4667 4701/4710/4681 4699/4709/4680 +f 4701/4710/4681 4702/4715/4686 4703/4711/4682 +f 4699/4709/4680 4703/4711/4682 4704/4712/4683 +f 4686/4695/4666 4705/4713/4684 4701/4710/4681 +f 4705/4713/4684 4686/4695/4666 4679/4690/4661 +f 4679/4690/4661 4522/4532/4502 4706/4714/4685 +f 4705/4713/4684 4706/4714/4685 4702/4715/4686 +f 4710/4719/4690 4707/4716/4687 4709/4718/4689 +f 4709/4718/4689 4708/4717/4688 4706/4714/4685 +f 4711/4720/4691 4709/4718/4689 4522/4532/4502 +f 4712/4831/4802 4710/4719/4690 4711/4720/4691 +f 4714/4722/4693 4715/4725/4696 4716/4723/4694 +f 4717/4724/4695 4718/4726/4697 4715/4725/4696 +f 4718/4726/4697 4719/4928/4899 4720/4727/4698 +f 4715/4725/4696 4720/4727/4698 4721/4728/4699 +f 4723/4732/4703 4713/4721/4692 4722/4729/4700 +f 4722/4729/4700 4716/4723/4694 4724/4730/4701 +f 4726/4733/4704 4722/4729/4700 4725/4731/4702 +f 4707/4716/4687 4723/4732/4703 4726/4733/4704 +f 4726/4733/4704 4727/4734/4705 4708/4717/4688 +f 4725/4731/4702 4728/4735/4706 4727/4734/4705 +f 4728/4735/4706 4704/4712/4683 4703/4711/4682 +f 4727/4734/4705 4703/4711/4682 4702/4715/4686 +f 4574/4582/4552 4729/4736/4707 4525/4536/4506 +f 4573/4581/4551 4730/4737/4708 4729/4736/4707 +f 4730/4737/4708 4731/4742/4713 4732/4738/4709 +f 4729/4736/4707 4732/4738/4709 4526/4739/4710 +f 4534/4543/4513 4733/4741/4712 4579/4587/4557 +f 4733/4741/4712 4534/4543/4513 4734/4740/4711 +f 4730/4737/4708 4733/4741/4712 4731/4742/4713 +f 4733/4741/4712 4730/4737/4708 4573/4581/4551 +f 149/143/143 4735/4743/4714 4304/4317/4287 +f 148/142/142 4736/4744/4715 4735/4743/4714 +f 4736/4744/4715 4737/5020/4991 4738/4745/4716 +f 4305/4318/4288 4304/4317/4287 4738/4745/4716 +f 3278/3296/3265 4739/4747/4718 4740/4746/4717 +f 2293/2315/2284 4308/4322/4292 4739/4747/4718 +f 4308/4322/4292 4307/4321/4291 4741/4748/4719 +f 4739/4747/4718 4741/4748/4719 4742/4749/4720 +f 4745/4754/4725 4742/4749/4720 4744/4751/4722 +f 4744/4751/4722 4743/4750/4721 4747/4753/4724 +f 2015/2040/2009 4744/4751/4722 2018/2042/2011 +f 2014/2039/2008 4745/4754/4725 2015/2040/2009 +f 3274/3293/3262 4748/4755/4726 2025/2049/2018 +f 3276/3297/3266 4740/4746/4717 4748/4755/4726 +f 4740/4746/4717 4742/4749/4720 4745/4754/4725 +f 4748/4755/4726 4745/4754/4725 2014/2039/2008 +f 4749/4756/4727 4750/4757/4728 4306/4320/4290 +f 4746/4752/4723 4743/4750/4721 4750/4757/4728 +f 4743/4750/4721 4742/4749/4720 4741/4748/4719 +f 4750/4757/4728 4741/4748/4719 4307/4321/4291 +f 4752/4759/4730 4753/4762/4733 4754/4760/4731 +f 4755/4761/4732 4756/4763/4734 4753/4762/4733 +f 4756/4763/4734 4438/4451/4421 4437/4450/4420 +f 4753/4762/4733 4437/4450/4420 4436/4449/4419 +f 4758/4767/4738 4396/4406/4376 4757/4764/4735 +f 4345/4358/4328 4759/4765/4736 4757/4764/4735 +f 4759/4765/4736 4751/4758/4729 4760/4766/4737 +f 4761/5031/5002 4758/4767/4738 4760/4766/4737 +f 4752/4759/4730 4751/4758/4729 4762/4768/4739 +f 4762/4768/4739 4759/4765/4736 4343/4356/4326 +f 4343/4356/4326 4323/4335/4305 4763/4769/4740 +f 4755/4761/4732 4752/4759/4730 4763/4769/4740 +f 4765/4771/4742 4766/4774/4745 4767/4772/4743 +f 4768/4773/4744 4769/4775/4746 4766/4774/4745 +f 4771/4966/4937 4766/4774/4745 4770/4776/4747 +f 4766/4774/4745 4771/4966/4937 4772/4777/4748 +f 4498/4509/4479 4497/4508/4478 4774/4779/4750 +f 4774/4779/4750 4773/4778/4749 4776/4781/4752 +f 4777/4782/4753 4774/4779/4750 4772/4777/4748 +f 4499/4510/4480 4498/4509/4479 4777/4782/4753 +f 4781/4788/4759 4778/4783/4754 4780/4785/4756 +f 4780/4785/4756 4779/4784/4755 4783/4787/4758 +f 4773/4778/4749 4780/4785/4756 4775/4780/4751 +f 4497/4508/4478 4781/4788/4759 4773/4778/4749 +f 4785/4790/4761 4786/4792/4763 4787/4791/4762 +f 4782/4786/4757 4779/4784/4755 4786/4792/4763 +f 4779/4784/4755 4778/4783/4754 4788/4793/4764 +f 4786/4792/4763 4788/4793/4764 4789/4794/4765 +f 4463/4475/4445 4790/4796/4767 4791/4795/4766 +f 4468/4480/4450 4470/4482/4452 4790/4796/4767 +f 4470/4482/4452 4469/4481/4451 4792/4797/4768 +f 4790/4796/4767 4792/4797/4768 4793/4798/4769 +f 4792/4797/4768 4794/4800/4771 4795/4799/4770 +f 4794/4800/4771 4792/4797/4768 4472/4485/4455 +f 4472/4485/4455 4474/4490/4460 4476/4488/4458 +f 4794/4800/4771 4476/4488/4458 4475/4487/4457 +f 4567/4576/4546 4796/4801/4772 4795/4799/4770 +f 4554/4562/4532 4552/4560/4530 4796/4801/4772 +f 4552/4560/4530 4458/4469/4439 4797/4802/4773 +f 4793/4798/4769 4795/4799/4770 4797/4802/4773 +f 4799/4804/4775 4800/4806/4777 4801/4805/4776 +f 4793/4798/4769 4797/4802/4773 4800/4806/4777 +f 4797/4802/4773 4458/4469/4439 4455/4467/4437 +f 4800/4806/4777 4455/4467/4437 4454/4466/4436 +f 4803/4808/4779 4804/4810/4781 4805/4809/4780 +f 4460/4473/4443 4791/4795/4766 4804/4810/4781 +f 4791/4795/4766 4793/4798/4769 4799/4804/4775 +f 4804/4810/4781 4799/4804/4775 4798/4803/4774 +f 4807/4812/4783 4808/4815/4786 4809/4813/4784 +f 4810/4814/4785 4811/4816/4787 4808/4815/4786 +f 4811/4816/4787 4812/4822/4793 4813/4817/4788 +f 4808/4815/4786 4813/4817/4788 4814/4818/4789 +f 4815/4819/4790 4816/4820/4791 4811/4816/4787 +f 4802/4807/4778 4805/4809/4780 4816/4820/4791 +f 4805/4809/4780 4798/4803/4774 4817/4821/4792 +f 4816/4820/4791 4817/4821/4792 4812/4822/4793 +f 4821/4826/4797 4818/4823/4794 4820/4825/4796 +f 4820/4825/4796 4819/4824/4795 4461/4474/4444 +f 4822/4827/4798 4820/4825/4796 4460/4473/4443 +f 4823/4833/4804 4821/4826/4797 4822/4827/4798 +f 4521/4531/4501 4511/4521/4491 4825/4829/4800 +f 4825/4829/4800 4824/4828/4799 4826/4830/4801 +f 4711/4720/4691 4825/4829/4800 4712/4831/4802 +f 4522/4532/4502 4521/4531/4501 4711/4720/4691 +f 4514/4526/4496 4466/4484/4454 4827/4832/4803 +f 4464/4476/4446 4819/4824/4795 4827/4832/4803 +f 4819/4824/4795 4818/4823/4794 4824/4828/4799 +f 4511/4521/4491 4514/4526/4496 4824/4828/4799 +f 4828/4834/4805 4829/4836/4807 4830/4835/4806 +f 4784/4789/4760 4787/4791/4762 4829/4836/4807 +f 4787/4791/4762 4789/4794/4765 4831/4837/4808 +f 4829/4836/4807 4831/4837/4808 4832/4838/4809 +f 4831/4837/4808 4833/4840/4811 4834/4839/4810 +f 4789/4794/4765 4835/4841/4812 4833/4840/4811 +f 4835/4841/4812 4717/4724/4695 4714/4722/4693 +f 4833/4840/4811 4714/4722/4693 4713/4721/4692 +f 4710/4719/4690 4712/4831/4802 4837/4843/4814 +f 4832/4838/4809 4834/4839/4810 4837/4843/4814 +f 4834/4839/4810 4713/4721/4692 4723/4732/4703 +f 4837/4843/4814 4723/4732/4703 4707/4716/4687 +f 4826/4830/4801 4838/4844/4815 4836/4842/4813 +f 4838/4844/4815 4826/4830/4801 4821/4826/4797 +f 4830/4835/4806 4838/4844/4815 4823/4833/4804 +f 4832/4838/4809 4836/4842/4813 4830/4835/4806 +f 4803/4808/4779 4802/4807/4778 4840/4846/4817 +f 4840/4846/4817 4839/4845/4816 4828/4834/4805 +f 4822/4827/4798 4840/4846/4817 4823/4833/4804 +f 4460/4473/4443 4803/4808/4779 4822/4827/4798 +f 4785/4790/4761 4841/4848/4819 4842/4847/4818 +f 4784/4789/4760 4839/4845/4816 4841/4848/4819 +f 4839/4845/4816 4802/4807/4778 4815/4819/4790 +f 4841/4848/4819 4815/4819/4790 4810/4814/4785 +f 4783/4787/4758 4843/4850/4821 4844/4849/4820 +f 4782/4786/4757 4842/4847/4818 4843/4850/4821 +f 4842/4847/4818 4810/4814/4785 4807/4812/4783 +f 4843/4850/4821 4807/4812/4783 4806/4811/4782 +f 4776/4781/4752 4775/4780/4751 4845/4851/4822 +f 4845/4851/4822 4844/4849/4820 4846/4852/4823 +f 4846/4852/4823 4764/4770/4741 4767/4772/4743 +f 4772/4777/4748 4776/4781/4752 4767/4772/4743 +f 4848/4854/4825 4849/4857/4828 4850/4855/4826 +f 4851/4856/4827 4852/4858/4829 4849/4857/4828 +f 4852/4858/4829 4768/4773/4744 4765/4771/4742 +f 4849/4857/4828 4765/4771/4742 4764/4770/4741 +f 4850/4855/4826 4764/4770/4741 4853/4859/4830 +f 4806/4811/4782 4809/4813/4784 4853/4859/4830 +f 4809/4813/4784 4814/4818/4789 4854/4860/4831 +f 4853/4859/4830 4854/4860/4831 4847/4853/4824 +f 4817/4821/4792 4855/4862/4833 4856/4861/4832 +f 4798/4803/4774 4801/4805/4776 4855/4862/4833 +f 4801/4805/4776 4454/4466/4436 4857/4863/4834 +f 4855/4862/4833 4857/4863/4834 4858/4864/4835 +f 4813/4817/4788 4859/4866/4837 4860/4865/4836 +f 4812/4822/4793 4856/4861/4832 4859/4866/4837 +f 4856/4861/4832 4858/4864/4835 4861/4867/4838 +f 4859/4866/4837 4861/4867/4838 4862/4868/4839 +f 4857/4863/4834 4863/4870/4841 4864/4869/4840 +f 4454/4466/4436 4457/4468/4438 4863/4870/4841 +f 4457/4468/4438 4453/4472/4442 4865/4871/4842 +f 4863/4870/4841 4865/4871/4842 4866/4872/4843 +f 4865/4871/4842 4867/4874/4845 4868/4873/4844 +f 4453/4472/4442 4452/4465/4435 4867/4874/4845 +f 4452/4465/4435 1805/1828/1797 2027/2050/2019 +f 4867/4874/4845 2027/2050/2019 2029/2053/2022 +f 4870/4876/4847 4871/4878/4849 4872/4877/4848 +f 4866/4872/4843 4868/4873/4844 4871/4878/4849 +f 4868/4873/4844 2029/2053/2022 2031/2055/2024 +f 4871/4878/4849 2031/2055/2024 1839/1861/1830 +f 4870/4876/4847 4869/4875/4846 4874/4880/4851 +f 4874/4880/4851 4873/4879/4850 4861/4867/4838 +f 4864/4869/4840 4874/4880/4851 4858/4864/4835 +f 4866/4872/4843 4870/4876/4847 4864/4869/4840 +f 4878/4886/4857 4875/4881/4852 4877/4883/4854 +f 4877/4883/4854 4876/4882/4853 4880/4885/4856 +f 4873/4879/4850 4877/4883/4854 4862/4868/4839 +f 4869/4875/4846 4878/4886/4857 4873/4879/4850 +f 4447/4459/4429 4446/4458/4428 4882/4888/4859 +f 4882/4888/4859 4881/4887/4858 4878/4886/4857 +f 4872/4877/4848 4882/4888/4859 4869/4875/4846 +f 1839/1861/1830 4447/4459/4429 4872/4877/4848 +f 4884/4890/4861 4885/4893/4864 4886/4891/4862 +f 4887/4892/4863 4888/4894/4865 4885/4893/4864 +f 4881/4887/4858 4885/4893/4864 4875/4881/4852 +f 4446/4458/4428 4886/4891/4862 4881/4887/4858 +f 4889/4895/4866 4890/4897/4868 4888/4894/4865 +f 4891/4896/4867 4892/4898/4869 4890/4897/4868 +f 4876/4882/4853 4890/4897/4868 4879/4884/4855 +f 4875/4881/4852 4888/4894/4865 4876/4882/4853 +f 4880/4885/4856 4879/4884/4855 4894/4900/4871 +f 4894/4900/4871 4893/4899/4870 4854/4860/4831 +f 4860/4865/4836 4894/4900/4871 4814/4818/4789 +f 4862/4868/4839 4880/4885/4856 4860/4865/4836 +f 4895/4901/4872 4896/4902/4873 4892/4898/4869 +f 4851/4856/4827 4848/4854/4825 4896/4902/4873 +f 4893/4899/4870 4896/4902/4873 4847/4853/4824 +f 4879/4884/4855 4892/4898/4869 4893/4899/4870 +f 4311/4325/4295 4897/4905/4876 4898/4903/4874 +f 4897/4905/4876 4311/4325/4295 4899/4904/4875 +f 4899/4904/4875 4851/4856/4827 4895/4901/4872 +f 4897/4905/4876 4895/4901/4872 4891/4896/4867 +f 4901/4907/4878 4902/4909/4880 4903/4908/4879 +f 4883/4889/4860 4886/4891/4862 4902/4909/4880 +f 4886/4891/4862 4446/4458/4428 4444/4457/4427 +f 4902/4909/4880 4444/4457/4427 4442/4455/4425 +f 4441/4454/4424 4438/4451/4421 4904/4910/4881 +f 4904/4910/4881 4756/4763/4734 4905/4911/4882 +f 4903/4908/4879 4904/4910/4881 4900/4906/4877 +f 4442/4455/4425 4441/4454/4424 4903/4908/4879 +f 4905/4911/4882 4755/4761/4732 4906/4912/4883 +f 4323/4335/4305 4320/4333/4303 4906/4912/4883 +f 4320/4333/4303 4319/4332/4302 4907/4913/4884 +f 4900/4906/4877 4905/4911/4882 4907/4913/4884 +f 4907/4913/4884 4319/4332/4302 4908/4914/4885 +f 4908/4914/4885 4329/4341/4311 4909/4915/4886 +f 4909/4915/4886 4883/4889/4860 4901/4907/4878 +f 4900/4906/4877 4907/4913/4884 4901/4907/4878 +f 4340/4352/4322 4910/4917/4888 4911/4916/4887 +f 4314/4327/4297 4898/4903/4874 4910/4917/4888 +f 4898/4903/4874 4891/4896/4867 4889/4895/4866 +f 4910/4917/4888 4889/4895/4866 4887/4892/4863 +f 4909/4915/4886 4328/4340/4310 4912/4918/4889 +f 4334/4346/4316 4911/4916/4887 4912/4918/4889 +f 4911/4916/4887 4887/4892/4863 4884/4890/4861 +f 4912/4918/4889 4884/4890/4861 4883/4889/4860 +f 4899/4904/4875 4913/4919/4890 4852/4858/4829 +f 4913/4919/4890 4899/4904/4875 4365/4377/4347 +f 4914/4920/4891 4913/4919/4890 4364/4376/4346 +f 4768/4773/4744 4852/4858/4829 4914/4920/4891 +f 4769/4775/4746 4768/4773/4744 4915/4921/4892 +f 4364/4376/4346 4371/4383/4353 4915/4921/4892 +f 4371/4383/4353 4370/4382/4352 4916/4922/4893 +f 4770/4776/4747 4769/4775/4746 4916/4922/4893 +f 4917/4923/4894 4918/4925/4896 4718/4726/4697 +f 4919/4924/4895 4920/4926/4897 4918/4925/4896 +f 4920/4926/4897 4921/4936/4907 4922/4927/4898 +f 4918/4925/4896 4922/4927/4898 4719/4928/4899 +f 4788/4793/4764 4923/4929/4900 4835/4841/4812 +f 4778/4783/4754 4924/4930/4901 4923/4929/4900 +f 4924/4930/4901 4919/4924/4895 4917/4923/4894 +f 4923/4929/4900 4917/4923/4894 4717/4724/4695 +f 4781/4788/4759 4925/4931/4902 4924/4930/4901 +f 4497/4508/4478 4494/4506/4476 4925/4931/4902 +f 4494/4506/4476 4493/4505/4475 4926/4932/4903 +f 4925/4931/4902 4926/4932/4903 4919/4924/4895 +f 4926/4932/4903 4927/4933/4904 4920/4926/4897 +f 4493/4505/4475 4928/4934/4905 4927/4933/4904 +f 4928/4934/4905 4929/4940/4911 4930/4935/4906 +f 4927/4933/4904 4930/4935/4906 4921/4936/4907 +f 4934/4941/4912 4931/4937/4908 4933/4939/4910 +f 4933/4939/4910 4932/4938/4909 4928/4934/4905 +f 4496/4511/4481 4933/4939/4910 4493/4505/4475 +f 4501/4953/4924 4934/4941/4912 4496/4511/4481 +f 4936/4943/4914 4937/4947/4918 4938/4944/4915 +f 4937/4947/4918 4936/4943/4914 4940/4946/4917 +f 4942/5075/5046 4937/4947/4918 4941/4948/4919 +f 4937/4947/4918 4942/5075/5046 4943/4949/4920 +f 4936/4943/4914 4944/4951/4922 4945/4950/4921 +f 4935/4942/4913 4946/4952/4923 4944/4951/4922 +f 4946/4952/4923 4931/4937/4908 4934/4941/4912 +f 4944/4951/4922 4934/4941/4912 4501/4953/4924 +f 4948/4955/4926 4949/4958/4929 4950/4956/4927 +f 4951/4957/4928 4952/4959/4930 4949/4958/4929 +f 4409/4419/4389 4949/4958/4929 4349/4362/4332 +f 4949/4958/4929 4409/4419/4389 4405/4415/4385 +f 4500/4512/4482 4499/4510/4480 4954/4961/4932 +f 4954/4961/4932 4953/4960/4931 4956/4963/4934 +f 4958/4965/4936 4954/4961/4932 4957/4964/4935 +f 4501/4953/4924 4500/4512/4482 4958/4965/4936 +f 4771/4966/4937 4959/4968/4939 4777/4782/4753 +f 4959/4968/4939 4771/4966/4937 4960/4967/4938 +f 4953/4960/4931 4959/4968/4939 4955/4962/4933 +f 4499/4510/4480 4777/4782/4753 4953/4960/4931 +f 4960/4967/4938 4770/4776/4747 4961/4969/4940 +f 4961/4969/4940 4916/4922/4893 4376/4387/4357 +f 4962/4970/4941 4961/4969/4940 4360/4372/4342 +f 4955/4962/4933 4960/4967/4938 4962/4970/4941 +f 4956/4963/4934 4955/4962/4933 4963/4971/4942 +f 4963/4971/4942 4962/4970/4941 4358/4370/4340 +f 4964/4972/4943 4963/4971/4942 4353/4365/4335 +f 4957/4964/4935 4956/4963/4934 4964/4972/4943 +f 4966/4974/4945 4957/4964/4935 4965/4973/4944 +f 4965/4973/4944 4964/4972/4943 4350/4363/4333 +f 4952/4959/4930 4965/4973/4944 4349/4362/4332 +f 4951/4957/4928 4966/4974/4945 4952/4959/4930 +f 4966/4974/4945 4967/4975/4946 4958/4965/4936 +f 4951/4957/4928 4968/4976/4947 4967/4975/4946 +f 4945/4950/4921 4967/4975/4946 4939/4945/4916 +f 4501/4953/4924 4958/4965/4936 4945/4950/4921 +f 4940/4946/4917 4969/4978/4949 4970/4977/4948 +f 4939/4945/4916 4968/4976/4947 4969/4978/4949 +f 4968/4976/4947 4951/4957/4928 4948/4955/4926 +f 4969/4978/4949 4948/4955/4926 4947/4954/4925 +f 4974/4982/4953 4971/4979/4950 4973/4981/4952 +f 4973/4981/4952 4972/4980/4951 4970/4977/4948 +f 4975/4983/4954 4973/4981/4952 4947/4954/4925 +f 4976/5009/4980 4974/4982/4953 4975/4983/4954 +f 4980/4990/4961 4977/4984/4955 4979/4986/4957 +f 4981/4987/4958 4982/4988/4959 4979/4986/4957 +f 4984/4991/4962 4979/4986/4957 4983/4989/4960 +f 4985/4997/4968 4980/4990/4961 4984/4991/4962 +f 4986/4992/4963 4987/4994/4965 4982/4988/4959 +f 4988/4993/4964 4989/4995/4966 4987/4994/4965 +f 4989/4995/4966 4971/4979/4950 4990/4996/4967 +f 4987/4994/4965 4990/4996/4967 4983/4989/4960 +f 4992/5001/4972 4985/4997/4968 4991/4998/4969 +f 4991/4998/4969 4984/4991/4962 4993/4999/4970 +f 4995/5002/4973 4991/4998/4969 4994/5000/4971 +f 4996/5050/5021 4992/5001/4972 4995/5002/4973 +f 4998/5004/4975 4999/5006/4977 5000/5005/4976 +f 4994/5000/4971 5001/5007/4978 4999/5006/4977 +f 5001/5007/4978 4976/5009/4980 5002/5008/4979 +f 4999/5006/4977 5002/5008/4979 4383/4394/4364 +f 5002/5008/4979 4976/5009/4980 5003/5010/4981 +f 5003/5010/4981 4975/4983/4954 4950/4956/4927 +f 4403/4414/4384 5003/5010/4981 4405/4415/4385 +f 4383/4394/4364 5002/5008/4979 4403/4414/4384 +f 5004/5011/4982 5005/5013/4984 4380/4392/4362 +f 5006/5012/4983 5007/5014/4985 5005/5013/4984 +f 5000/5005/4976 5005/5013/4984 4997/5003/4974 +f 4383/4394/4364 4380/4392/4362 5000/5005/4976 +f 5007/5014/4985 5008/5016/4987 5009/5015/4986 +f 5006/5012/4983 5010/5017/4988 5008/5016/4987 +f 5010/5017/4988 5011/5023/4994 5012/5018/4989 +f 5008/5016/4987 5012/5018/4989 5013/5019/4990 +f 4738/4745/4716 4737/5020/4991 5015/5022/4993 +f 5015/5022/4993 5014/5021/4992 5016/5024/4995 +f 5016/5024/4995 5017/5033/5004 5018/5025/4996 +f 4305/4318/4288 4738/4745/4716 5018/5025/4996 +f 5004/5011/4982 4379/4391/4361 5019/5026/4997 +f 5019/5026/4997 4389/4400/4370 5020/5027/4998 +f 5022/5029/5000 5019/5026/4997 5021/5028/4999 +f 5006/5012/4983 5004/5011/4982 5022/5029/5000 +f 5020/5027/4998 4388/4399/4369 5023/5030/5001 +f 5023/5030/5001 4400/4410/4380 4758/4767/4738 +f 5024/5032/5003 5023/5030/5001 4761/5031/5002 +f 5021/5028/4999 5020/5027/4998 5024/5032/5003 +f 5018/5025/4996 5017/5033/5004 5026/5035/5006 +f 5027/5036/5007 5028/5037/5008 5026/5035/5006 +f 5028/5037/5008 4746/4752/4723 4749/4756/4727 +f 4305/4318/4288 5018/5025/4996 4749/4756/4727 +f 5030/5040/5011 4761/5031/5002 5029/5038/5009 +f 4751/4758/4729 4754/4760/4731 5029/5038/5009 +f 4754/4760/4731 4436/4449/4419 5031/5039/5010 +f 5029/5038/5009 5031/5039/5010 5027/5036/5007 +f 5031/5039/5010 5032/5041/5012 5028/5037/5008 +f 4436/4449/4419 4434/4447/4417 5032/5041/5012 +f 4434/4447/4417 2018/2042/2011 4747/4753/4724 +f 5032/5041/5012 4747/4753/4724 4746/4752/4723 +f 5034/5043/5014 5021/5028/4999 5033/5042/5013 +f 5033/5042/5013 5024/5032/5003 5030/5040/5011 +f 5025/5034/5005 5033/5042/5013 5027/5036/5007 +f 5017/5033/5004 5034/5043/5014 5025/5034/5005 +f 5010/5017/4988 5006/5012/4983 5035/5044/5015 +f 5035/5044/5015 5022/5029/5000 5034/5043/5014 +f 5016/5024/4995 5035/5044/5015 5017/5033/5004 +f 5011/5023/4994 5010/5017/4988 5016/5024/4995 +f 4980/4990/4961 5036/5046/5017 5037/5045/5016 +f 4985/4997/4968 5038/5047/5018 5036/5046/5017 +f 5038/5047/5018 5039/5054/5025 5040/5048/5019 +f 5036/5046/5017 5040/5048/5019 5041/5049/5020 +f 4992/5001/4972 5042/5051/5022 5038/5047/5018 +f 4996/5050/5021 5043/5052/5023 5042/5051/5022 +f 5043/5052/5023 5044/5058/5029 5045/5053/5024 +f 5042/5051/5022 5045/5053/5024 5039/5054/5025 +f 58/55/55 57/54/54 5047/5056/5027 +f 5047/5056/5027 5046/5055/5026 5040/5048/5019 +f 5048/5057/5028 5047/5056/5027 5039/5054/5025 +f 59/56/56 58/55/55 5048/5057/5028 +f 5045/5053/5024 5049/5059/5030 5048/5057/5028 +f 5044/5058/5029 5050/5060/5031 5049/5059/5030 +f 5050/5060/5031 688/681/681 686/680/680 +f 5049/5059/5030 686/680/680 59/56/56 +f 5052/5062/5033 5053/5064/5035 5054/5063/5034 +f 4737/5020/4991 4736/4744/4715 5053/5064/5035 +f 4736/4744/4715 148/142/142 679/672/672 +f 5053/5064/5035 679/672/672 678/671/671 +f 5055/5065/5036 5056/5066/5037 5050/5060/5031 +f 5051/5061/5032 5054/5063/5034 5056/5066/5037 +f 5054/5063/5034 678/671/671 692/686/686 +f 5056/5066/5037 692/686/686 688/681/681 +f 5012/5018/4989 5057/5068/5039 5058/5067/5038 +f 5011/5023/4994 5014/5021/4992 5057/5068/5039 +f 5014/5021/4992 4737/5020/4991 5052/5062/5033 +f 5057/5068/5039 5052/5062/5033 5051/5061/5032 +f 5059/5069/5040 5060/5070/5041 5043/5052/5023 +f 5013/5019/4990 5058/5067/5038 5060/5070/5041 +f 5058/5067/5038 5051/5061/5032 5055/5065/5036 +f 5060/5070/5041 5055/5065/5036 5044/5058/5029 +f 4998/5004/4975 5061/5071/5042 4995/5002/4973 +f 4997/5003/4974 5009/5015/4986 5061/5071/5042 +f 5009/5015/4986 5013/5019/4990 5059/5069/5040 +f 5061/5071/5042 5059/5069/5040 4996/5050/5021 +f 4993/4999/4970 4983/4989/4960 5062/5072/5043 +f 5062/5072/5043 4990/4996/4967 4974/4982/4953 +f 5001/5007/4978 5062/5072/5043 4976/5009/4980 +f 4994/5000/4971 4993/4999/4970 5001/5007/4978 +f 4989/4995/4966 4988/4993/4964 5064/5074/5045 +f 4943/4949/4920 4942/5075/5046 5064/5074/5045 +f 4942/5075/5046 4941/4948/4919 4972/4980/4951 +f 5064/5074/5045 4972/4980/4951 4971/4979/4950 +f 5066/5077/5048 5067/5079/5050 5068/5078/5049 +f 917/907/906 935/926/925 5067/5079/5050 +f 935/926/925 927/917/916 5069/5080/5051 +f 5067/5079/5050 5069/5080/5051 5070/5081/5052 +f 3304/3323/3292 5071/5083/5054 1498/5082/5053 +f 3303/4293/4262 5072/5084/5055 5071/5083/5054 +f 5072/5084/5055 5070/5081/5052 5069/5080/5051 +f 5071/5083/5054 5069/5080/5051 927/917/916 +f 5076/5091/5062 5073/5085/5056 5075/5087/5058 +f 5075/5087/5058 5074/5086/5057 5078/5089/5060 +f 5080/5136/5107 5075/5087/5058 5079/5090/5061 +f 5075/5087/5058 5080/5136/5107 5081/5092/5063 +f 5083/5094/5065 5084/5097/5068 5085/5095/5066 +f 5086/5096/5067 5087/5098/5069 5084/5097/5068 +f 5087/5098/5069 5088/5102/5073 5089/5099/5070 +f 5084/5097/5068 5089/5099/5070 5090/5100/5071 +f 5089/5099/5070 5091/5103/5074 5092/5101/5072 +f 5088/5102/5073 5093/5104/5075 5091/5103/5074 +f 5093/5104/5075 5094/5108/5079 5095/5105/5076 +f 5091/5103/5074 5095/5105/5076 5096/5106/5077 +f 5095/5105/5076 5097/5109/5080 5098/5107/5078 +f 5094/5108/5079 5099/5110/5081 5097/5109/5080 +f 5101/5113/5084 5097/5109/5080 5100/5111/5082 +f 5097/5109/5080 5101/5113/5084 5102/5112/5083 +f 5104/5116/5087 5102/5112/5083 5103/5114/5085 +f 5103/5114/5085 5101/5113/5084 5105/5115/5086 +f 5074/5086/5057 5103/5114/5085 5077/5088/5059 +f 5073/5085/5056 5104/5116/5087 5074/5086/5057 +f 5107/5118/5089 5108/5121/5092 5109/5119/5090 +f 5110/5120/5091 5111/5122/5093 5108/5121/5092 +f 5111/5122/5093 5086/5096/5067 5083/5094/5065 +f 5108/5121/5092 5083/5094/5065 5082/5093/5064 +f 5115/5129/5100 5112/5123/5094 5114/5125/5096 +f 5116/5126/5097 5117/5127/5098 5114/5125/5096 +f 5117/5127/5098 5118/5184/5155 5119/5128/5099 +f 5120/5182/5153 5115/5129/5100 5119/5128/5099 +f 5122/5131/5102 5123/5135/5106 5124/5132/5103 +f 5123/5135/5106 5122/5131/5102 5126/5134/5105 +f 5126/5134/5105 5116/5126/5097 5113/5124/5095 +f 5123/5135/5106 5113/5124/5095 5112/5123/5094 +f 5080/5136/5107 5127/5138/5109 5128/5137/5108 +f 5079/5090/5061 5129/5139/5110 5127/5138/5109 +f 5129/5139/5110 5130/5143/5114 5131/5140/5111 +f 5127/5138/5109 5131/5140/5111 5132/5141/5112 +f 5131/5140/5111 5133/5144/5115 5134/5142/5113 +f 5130/5143/5114 5135/5145/5116 5133/5144/5115 +f 5135/5145/5116 5136/5149/5120 5137/5146/5117 +f 5133/5144/5115 5137/5146/5117 5138/5147/5118 +f 5137/5146/5117 5139/5150/5121 5140/5148/5119 +f 5136/5149/5120 5141/5151/5122 5139/5150/5121 +f 5122/5131/5102 5139/5150/5121 5125/5133/5104 +f 5139/5150/5121 5122/5131/5102 5121/5130/5101 +f 5145/5158/5129 5142/5152/5123 5144/5154/5125 +f 5144/5154/5125 5143/5153/5124 5147/5156/5127 +f 5149/5159/5130 5144/5154/5125 5148/5157/5128 +f 5150/5160/5131 5145/5158/5129 5149/5159/5130 +f 5152/5164/5135 5150/5160/5131 5151/5161/5132 +f 5151/5161/5132 5149/5159/5130 5153/5162/5133 +f 5153/5162/5133 5154/5173/5144 5155/5163/5134 +f 5151/5161/5132 5155/5163/5134 5156/5165/5136 +f 5158/5167/5138 5159/5170/5141 5160/5168/5139 +f 5161/5169/5140 5162/5171/5142 5159/5170/5141 +f 5162/5171/5142 5110/5120/5091 5107/5118/5089 +f 5159/5170/5141 5107/5118/5089 5106/5117/5088 +f 5155/5163/5134 5163/5174/5145 5164/5172/5143 +f 5154/5173/5144 5165/5175/5146 5163/5174/5145 +f 5165/5175/5146 5161/5169/5140 5158/5167/5138 +f 5163/5174/5145 5158/5167/5138 5157/5166/5137 +f 5167/5177/5148 5168/5180/5151 5169/5178/5149 +f 5170/5179/5150 5171/5181/5152 5168/5180/5151 +f 5171/5181/5152 5146/5155/5126 5143/5153/5124 +f 5168/5180/5151 5143/5153/5124 5142/5152/5123 +f 5119/5128/5099 5172/5185/5156 5173/5183/5154 +f 5118/5184/5155 5174/5186/5157 5172/5185/5156 +f 5174/5186/5157 5170/5179/5150 5167/5177/5148 +f 5172/5185/5156 5167/5177/5148 5166/5176/5147 +f 5175/5187/5158 5176/5189/5160 5173/5183/5154 +f 5177/5188/5159 5178/5190/5161 5176/5189/5160 +f 5120/5182/5153 5173/5183/5154 5178/5190/5161 +f 5179/5191/5162 5180/5193/5164 5169/5178/5149 +f 5181/5192/5163 5182/5194/5165 5180/5193/5164 +f 5182/5194/5165 5177/5188/5159 5175/5187/5158 +f 5180/5193/5164 5175/5187/5158 5166/5176/5147 +f 5145/5158/5129 5150/5160/5131 5184/5196/5167 +f 5185/5197/5168 5186/5198/5169 5184/5196/5167 +f 5179/5191/5162 5184/5196/5167 5181/5192/5163 +f 5142/5152/5123 5145/5158/5129 5179/5191/5162 +f 5187/5199/5170 5188/5201/5172 5152/5164/5135 +f 5189/5200/5171 5190/5202/5173 5188/5201/5172 +f 5190/5202/5173 5185/5197/5168 5183/5195/5166 +f 5188/5201/5172 5183/5195/5166 5150/5160/5131 +f 5187/5199/5170 5156/5165/5136 5191/5203/5174 +f 5191/5203/5174 5164/5172/5143 5192/5204/5175 +f 5194/5206/5177 5191/5203/5174 5193/5205/5176 +f 5189/5200/5171 5187/5199/5170 5194/5206/5177 +f 5195/5207/5178 5196/5208/5179 5160/5168/5139 +f 5196/5208/5179 5195/5207/5178 5192/5204/5175 +f 5196/5208/5179 5192/5204/5175 5157/5166/5137 +f 5198/5210/5181 5199/5213/5184 5200/5211/5182 +f 5201/5212/5183 5202/5214/5185 5199/5213/5184 +f 5202/5214/5185 2260/2279/2248 2258/2278/2247 +f 5199/5213/5184 2258/2278/2247 2093/2113/2082 +f 5204/5216/5187 5205/5218/5189 5206/5217/5188 +f 5197/5209/5180 5200/5211/5182 5205/5218/5189 +f 5200/5211/5182 2093/2113/2082 2090/2111/2080 +f 5205/5218/5189 2090/2111/2080 2089/2110/2079 +f 5207/5219/5190 5208/5221/5192 2098/2120/2089 +f 5209/5220/5191 5210/5222/5193 5208/5221/5192 +f 5206/5217/5188 5208/5221/5192 5203/5215/5186 +f 2089/2110/2079 2098/2120/2089 5206/5217/5188 +f 2068/2089/2058 5211/5224/5195 5212/5223/5194 +f 2067/2088/2057 5213/5225/5196 5211/5224/5195 +f 5213/5225/5196 5214/5228/5199 5215/5226/5197 +f 5211/5224/5195 5215/5226/5197 5216/5227/5198 +f 5215/5226/5197 5214/5228/5199 5218/5230/5201 +f 5219/5231/5202 5220/5232/5203 5218/5230/5201 +f 5222/5234/5205 5218/5230/5201 5221/5233/5204 +f 5216/5227/5198 5215/5226/5197 5222/5234/5205 +f 5226/5241/5212 5223/5235/5206 5225/5237/5208 +f 5225/5237/5208 5224/5236/5207 5228/5239/5210 +f 5230/5242/5213 5225/5237/5208 5229/5240/5211 +f 5231/5244/5215 5226/5241/5212 5230/5242/5213 +f 5226/5241/5212 5232/5245/5216 5233/5243/5214 +f 5231/5244/5215 5234/5246/5217 5232/5245/5216 +f 5234/5246/5217 5235/5527/5499 5236/5247/5218 +f 5232/5245/5216 5236/5247/5218 5237/5248/5219 +f 5239/5250/5221 5240/5252/5223 5241/5251/5222 +f 5237/5248/5219 5242/5253/5224 5240/5252/5223 +f 5242/5253/5224 5243/5331/5302 5244/5254/5225 +f 5240/5252/5223 5244/5254/5225 5245/5255/5226 +f 5247/5257/5228 5248/5260/5231 5249/5258/5229 +f 5250/5259/5230 5251/5261/5232 5248/5260/5231 +f 5251/5261/5232 5237/5248/5219 5239/5250/5221 +f 5248/5260/5231 5239/5250/5221 5238/5249/5220 +f 5251/5261/5232 5252/5263/5234 5233/5243/5214 +f 5252/5263/5234 5251/5261/5232 5253/5262/5233 +f 5255/5286/5257 5252/5263/5234 5254/5264/5235 +f 5252/5263/5234 5255/5286/5257 5223/5235/5206 +f 5259/5271/5242 5256/5265/5236 5258/5267/5238 +f 5260/5268/5239 5261/5269/5240 5258/5267/5238 +f 5261/5269/5240 5262/5665/5637 5263/5270/5241 +f 5258/5267/5238 5263/5270/5241 5264/5272/5243 +f 5266/5274/5245 5267/5277/5248 5268/5275/5246 +f 5269/5276/5247 5270/5278/5249 5267/5277/5248 +f 5270/5278/5249 5271/5337/5308 5272/5279/5250 +f 5267/5277/5248 5272/5279/5250 5273/5280/5251 +f 5255/5286/5257 5254/5264/5235 5275/5282/5253 +f 5276/5283/5254 5277/5284/5255 5275/5282/5253 +f 5277/5284/5255 5278/5287/5258 5279/5285/5256 +f 5275/5282/5253 5279/5285/5256 5223/5235/5206 +f 5281/5291/5262 5278/5287/5258 5280/5288/5259 +f 5280/5288/5259 5277/5284/5255 5282/5289/5260 +f 5284/5292/5263 5280/5288/5259 5283/5290/5261 +f 5285/5435/5406 5281/5291/5262 5284/5292/5263 +f 5286/5293/5264 5287/5294/5265 4527/4537/4507 +f 5287/5294/5265 5286/5293/5264 5266/5274/5245 +f 5288/5295/5266 5287/5294/5265 5265/5273/5244 +f 4528/4538/4508 4527/4537/4507 5288/5295/5266 +f 5290/5297/5268 5291/5299/5270 5292/5298/5269 +f 5291/5299/5270 5290/5297/5268 4530/4540/4510 +f 5293/5306/5277 5291/5299/5270 4529/4539/4509 +f 5291/5299/5270 5293/5306/5277 5294/5300/5271 +f 4543/4552/4522 4542/5301/5272 5296/5303/5274 +f 5296/5303/5274 5295/5302/5273 5298/5305/5276 +f 5293/5306/5277 5296/5303/5274 5294/5300/5271 +f 4529/4539/4509 4543/4552/4522 5293/5306/5277 +f 5302/5313/5284 5299/5307/5278 5301/5309/5280 +f 5301/5309/5280 5300/5308/5279 5304/5311/5282 +f 5306/5314/5285 5301/5309/5280 5305/5312/5283 +f 5214/5228/5199 5302/5313/5284 5306/5314/5285 +f 5307/5315/5286 5308/5317/5288 5306/5314/5285 +f 5309/5316/5287 5310/5318/5289 5308/5317/5288 +f 5310/5318/5289 5219/5231/5202 5217/5229/5200 +f 5308/5317/5288 5217/5229/5200 5214/5228/5199 +f 5304/5311/5282 5303/5310/5281 5312/5320/5291 +f 5312/5320/5291 5311/5319/5290 5314/5322/5293 +f 5316/5324/5295 5312/5320/5291 5315/5323/5294 +f 5305/5312/5283 5304/5311/5282 5316/5324/5295 +f 5317/5325/5296 5318/5327/5298 5316/5324/5295 +f 5319/5326/5297 5320/5328/5299 5318/5327/5298 +f 5320/5328/5299 5309/5316/5287 5307/5315/5286 +f 5318/5327/5298 5307/5315/5286 5305/5312/5283 +f 5321/5329/5300 5322/5330/5301 5320/5328/5299 +f 5245/5255/5226 5244/5254/5225 5322/5330/5301 +f 5323/5535/5507 5322/5330/5301 5243/5331/5302 +f 5322/5330/5301 5323/5535/5507 5309/5316/5287 +f 5327/5338/5309 5324/5332/5303 5326/5334/5305 +f 5326/5334/5305 5325/5333/5304 5329/5336/5307 +f 5270/5278/5249 5326/5334/5305 5271/5337/5308 +f 5269/5276/5247 5327/5338/5309 5270/5278/5249 +f 5330/5339/5310 5331/5340/5311 5325/5333/5304 +f 5289/5296/5267 5332/5341/5312 5331/5340/5311 +f 5332/5341/5312 5333/5347/5318 5334/5342/5313 +f 5331/5340/5311 5334/5342/5313 5328/5335/5306 +f 5338/5346/5317 5335/5343/5314 5337/5345/5316 +f 5337/5345/5316 5336/5344/5315 5241/5251/5222 +f 5339/5358/5329 5337/5345/5316 5245/5255/5226 +f 5337/5345/5316 5339/5358/5329 5333/5347/5318 +f 5343/5351/5322 5340/5348/5319 5342/5350/5321 +f 5342/5350/5321 5341/5349/5320 5249/5258/5229 +f 5336/5344/5315 5342/5350/5321 5238/5249/5220 +f 5335/5343/5314 5343/5351/5322 5336/5344/5315 +f 5345/5353/5324 5346/5355/5326 5347/5354/5325 +f 5340/5348/5319 5343/5351/5322 5346/5355/5326 +f 5343/5351/5322 5335/5343/5314 5348/5356/5327 +f 5346/5355/5326 5348/5356/5327 5294/5300/5271 +f 5332/5341/5312 5289/5296/5267 5349/5357/5328 +f 5349/5357/5328 5292/5298/5269 5348/5356/5327 +f 5338/5346/5317 5349/5357/5328 5335/5343/5314 +f 5333/5347/5318 5332/5341/5312 5338/5346/5317 +f 5339/5358/5329 5350/5359/5330 5334/5342/5313 +f 5350/5359/5330 5339/5358/5329 5321/5329/5300 +f 5351/5360/5331 5350/5359/5330 5319/5326/5297 +f 5328/5335/5306 5334/5342/5313 5351/5360/5331 +f 5329/5336/5307 5352/5362/5333 5353/5361/5332 +f 5328/5335/5306 5351/5360/5331 5352/5362/5333 +f 5351/5360/5331 5319/5326/5297 5317/5325/5296 +f 5352/5362/5333 5317/5325/5296 5315/5323/5294 +f 5272/5279/5250 5354/5364/5335 5355/5363/5334 +f 5271/5337/5308 5353/5361/5332 5354/5364/5335 +f 5353/5361/5332 5315/5323/5294 5314/5322/5293 +f 5354/5364/5335 5314/5322/5293 5313/5321/5292 +f 4603/4611/4581 5356/5366/5337 5357/5365/5336 +f 4528/4538/4508 5288/5295/5266 5356/5366/5337 +f 5288/5295/5266 5265/5273/5244 5358/5367/5338 +f 5356/5366/5337 5358/5367/5338 5359/5368/5339 +f 5361/5371/5342 5359/5368/5339 5360/5369/5340 +f 5360/5369/5340 5358/5367/5338 5268/5275/5246 +f 5268/5275/5246 5273/5280/5251 5362/5370/5341 +f 5360/5369/5340 5362/5370/5341 5363/5372/5343 +f 5365/5375/5346 4614/4622/4592 5364/5373/5344 +f 4604/4619/4589 5357/5365/5336 5364/5373/5344 +f 5357/5365/5336 5359/5368/5339 5366/5374/5345 +f 5367/5376/5347 5365/5375/5346 5366/5374/5345 +f 5366/5374/5345 5368/5378/5349 5369/5377/5348 +f 5359/5368/5339 5361/5371/5342 5368/5378/5349 +f 5361/5371/5342 5363/5372/5343 5370/5379/5350 +f 5368/5378/5349 5370/5379/5350 5371/5380/5351 +f 5370/5379/5350 5363/5372/5343 5373/5382/5353 +f 5373/5382/5353 5372/5381/5352 5375/5384/5355 +f 5377/5386/5357 5373/5382/5353 5376/5385/5356 +f 5371/5380/5351 5370/5379/5350 5377/5386/5357 +f 5362/5370/5341 5378/5387/5358 5372/5381/5352 +f 5273/5280/5251 5355/5363/5334 5378/5387/5358 +f 5355/5363/5334 5313/5321/5292 5379/5388/5359 +f 5378/5387/5358 5379/5388/5359 5374/5383/5354 +f 5383/5392/5363 5380/5389/5360 5382/5391/5362 +f 5382/5391/5362 5381/5390/5361 5379/5388/5359 +f 5311/5319/5290 5382/5391/5362 5313/5321/5292 +f 5303/5310/5281 5383/5392/5363 5311/5319/5290 +f 5384/5393/5364 5385/5395/5366 5300/5308/5279 +f 5386/5394/5365 5387/5396/5367 5385/5395/5366 +f 5387/5396/5367 5380/5389/5360 5383/5392/5363 +f 5385/5395/5366 5383/5392/5363 5303/5310/5281 +f 2116/2137/2106 5388/5397/5368 5213/5225/5196 +f 2113/2134/2103 5389/5398/5369 5388/5397/5368 +f 5389/5398/5369 5299/5307/5278 5302/5313/5284 +f 5388/5397/5368 5302/5313/5284 5214/5228/5199 +f 2112/2133/2102 5390/5399/5370 5389/5398/5369 +f 2111/2144/2113 5391/5400/5371 5390/5399/5370 +f 5391/5400/5371 5386/5394/5365 5384/5393/5364 +f 5390/5399/5370 5384/5393/5364 5299/5307/5278 +f 5391/5400/5371 2111/2144/2113 5392/5401/5372 +f 5392/5401/5372 2122/2143/2112 5393/5402/5373 +f 5395/5404/5375 5392/5401/5372 5394/5403/5374 +f 5392/5401/5372 5395/5404/5375 5386/5394/5365 +f 5395/5404/5375 5396/5405/5376 5387/5396/5367 +f 5394/5403/5374 5397/5406/5377 5396/5405/5376 +f 5397/5406/5377 5398/5408/5379 5399/5407/5378 +f 5396/5405/5376 5399/5407/5378 5380/5389/5360 +f 5399/5407/5378 5400/5409/5380 5381/5390/5361 +f 5398/5408/5379 5401/5410/5381 5400/5409/5380 +f 5401/5410/5381 5376/5385/5356 5375/5384/5355 +f 5400/5409/5380 5375/5384/5355 5374/5383/5354 +f 5403/5412/5383 5404/5414/5385 5405/5413/5384 +f 5404/5414/5385 5403/5412/5383 4653/4662/4633 +f 5406/5446/5417 5404/5414/5385 4652/4661/4632 +f 5404/5414/5385 5406/5446/5417 5407/5415/5386 +f 5403/5412/5383 5408/5416/5387 4663/4671/4642 +f 5402/5411/5382 5409/5417/5388 5408/5416/5387 +f 5295/5302/5273 5408/5416/5387 5297/5304/5275 +f 5408/5416/5387 5295/5302/5273 4542/5301/5272 +f 5298/5305/5276 5297/5304/5275 5411/5419/5390 +f 5411/5419/5390 5410/5418/5389 5413/5421/5392 +f 5347/5354/5325 5411/5419/5390 5344/5352/5323 +f 5294/5300/5271 5298/5305/5276 5347/5354/5325 +f 5414/5422/5393 5415/5424/5395 5409/5417/5388 +f 5416/5423/5394 5417/5425/5396 5415/5424/5395 +f 5417/5425/5396 5412/5420/5391 5410/5418/5389 +f 5415/5424/5395 5410/5418/5389 5297/5304/5275 +f 5418/5426/5397 5419/5428/5399 5405/5413/5384 +f 5420/5427/5398 5421/5429/5400 5419/5428/5399 +f 5421/5429/5400 5416/5423/5394 5414/5422/5393 +f 5419/5428/5399 5414/5422/5393 5402/5411/5382 +f 5422/5430/5401 5423/5432/5403 5284/5292/5263 +f 5424/5431/5402 5425/5433/5404 5423/5432/5403 +f 5425/5433/5404 5426/5436/5407 5427/5434/5405 +f 5423/5432/5403 5427/5434/5405 5285/5435/5406 +f 5429/5440/5411 5426/5436/5407 5428/5437/5408 +f 5428/5437/5408 5425/5433/5404 5430/5438/5409 +f 5432/5441/5412 5428/5437/5408 5431/5439/5410 +f 5433/5448/5419 5429/5440/5411 5432/5441/5412 +f 5430/5438/5409 5424/5431/5402 5435/5443/5414 +f 5435/5443/5414 5434/5442/5413 5418/5426/5397 +f 5436/5444/5415 5435/5443/5414 5407/5415/5386 +f 5431/5439/5410 5430/5438/5409 5436/5444/5415 +f 5438/5447/5418 5431/5439/5410 5437/5445/5416 +f 5437/5445/5416 5436/5444/5415 5406/5446/5417 +f 5406/5446/5417 4652/4661/4632 4692/4700/4671 +f 5437/5445/5416 4692/4700/4671 4694/4703/4674 +f 5440/5450/5421 5433/5448/5419 5439/5449/5420 +f 5439/5449/5420 5432/5441/5412 5438/5447/5418 +f 4696/4704/4675 5439/5449/5420 4694/4703/4674 +f 4698/4707/4678 5440/5450/5421 4696/4704/4675 +f 5444/5454/5425 5441/5451/5422 5443/5453/5424 +f 5443/5453/5424 5442/5452/5423 5440/5450/5421 +f 4700/4708/4679 5443/5453/5424 4698/4707/4678 +f 4704/4712/4683 5444/5454/5425 4700/4708/4679 +f 5446/5456/5427 5285/5435/5406 5445/5455/5426 +f 5445/5455/5426 5427/5434/5405 5429/5440/5411 +f 5442/5452/5423 5445/5455/5426 5433/5448/5419 +f 5441/5451/5422 5446/5456/5427 5442/5452/5423 +f 5448/5460/5431 5285/5435/5406 5447/5457/5428 +f 5447/5457/5428 5446/5456/5427 5449/5458/5429 +f 5451/5577/5549 5447/5457/5428 5450/5459/5430 +f 5447/5457/5428 5451/5577/5549 5452/5461/5432 +f 5453/5462/5433 5454/5464/5435 4720/4727/4698 +f 5455/5463/5434 5456/5465/5436 5454/5464/5435 +f 5458/5468/5439 5454/5464/5435 5457/5466/5437 +f 5454/5464/5435 5458/5468/5439 4721/4728/4699 +f 5460/5470/5441 4725/4731/4702 5459/5467/5438 +f 5459/5467/5438 4724/4730/4701 5458/5468/5439 +f 5458/5468/5439 5457/5466/5437 5461/5469/5440 +f 5459/5467/5438 5461/5469/5440 5450/5459/5430 +f 5444/5454/5425 4704/4712/4683 5462/5471/5442 +f 5462/5471/5442 4728/4735/4706 5460/5470/5441 +f 5460/5470/5441 5450/5459/5430 5449/5458/5429 +f 5441/5451/5422 5444/5454/5425 5449/5458/5429 +f 4732/4738/4709 4731/4742/4713 5464/5473/5444 +f 5324/5332/5303 5327/5338/5309 5464/5473/5444 +f 5327/5338/5309 5269/5276/5247 5286/5293/5264 +f 5464/5473/5444 5286/5293/5264 4526/4739/4710 +f 4734/4740/4711 5465/5474/5445 5463/5472/5443 +f 4533/4542/4512 5290/5297/5268 5465/5474/5445 +f 5290/5297/5268 5289/5296/5267 5330/5339/5310 +f 5465/5474/5445 5330/5339/5310 5324/5332/5303 +f 5469/5478/5449 5466/5475/5446 5468/5477/5448 +f 5468/5477/5448 5467/5476/5447 918/908/907 +f 5066/5077/5048 5468/5477/5448 917/907/906 +f 5468/5477/5448 5066/5077/5048 5065/5076/5047 +f 5471/5480/5451 5070/5081/5052 5470/5479/5450 +f 5470/5479/5450 5072/5084/5055 4283/4295/4264 +f 5472/5481/5452 5470/5479/5450 4281/4292/4261 +f 5473/5487/5458 5471/5480/5451 5472/5481/5452 +f 5474/5482/5453 5475/5484/5455 2261/2281/2250 +f 5476/5483/5454 5477/5485/5456 5475/5484/5455 +f 5477/5485/5456 5473/5487/5458 5478/5486/5457 +f 5475/5484/5455 5478/5486/5457 2262/2283/2252 +f 5478/5486/5457 5473/5487/5458 5479/5488/5459 +f 5479/5488/5459 5472/5481/5452 4280/4291/4260 +f 2269/2289/2258 5479/5488/5459 3996/2286/5460 +f 2262/2283/2252 5478/5486/5457 2269/2289/2258 +f 5471/5480/5451 5473/5487/5458 5480/5489/5461 +f 5480/5489/5461 5477/5485/5456 5481/5490/5462 +f 5068/5078/5049 5480/5489/5461 5065/5076/5047 +f 5070/5081/5052 5471/5480/5451 5068/5078/5049 +f 5198/5210/5181 5197/5209/5180 5483/5492/5464 +f 5483/5492/5464 5482/5491/5463 5485/5494/5466 +f 5487/5496/5468 5483/5492/5464 5486/5495/5467 +f 5201/5212/5183 5198/5210/5181 5487/5496/5468 +f 5490/5500/5472 5486/5495/5467 5489/5498/5470 +f 5489/5498/5470 5488/5497/5469 5162/5171/5142 +f 5162/5171/5142 5161/5169/5140 5491/5499/5471 +f 5492/5749/5721 5490/5500/5472 5491/5499/5471 +f 5111/5122/5093 5493/5502/5474 5494/5501/5473 +f 5110/5120/5091 5488/5497/5469 5493/5502/5474 +f 5488/5497/5469 5486/5495/5467 5485/5494/5466 +f 5493/5502/5474 5485/5494/5466 5484/5493/5465 +f 5496/5504/5476 5497/5507/5479 5498/5505/5477 +f 5499/5506/5478 5500/5508/5480 5497/5507/5479 +f 5502/5586/5558 5497/5507/5479 5501/5509/5481 +f 5497/5507/5479 5502/5586/5558 5503/5510/5482 +f 5504/5511/5483 5505/5514/5486 5506/5512/5484 +f 5507/5513/5485 5508/5515/5487 5505/5514/5486 +f 5508/5515/5487 5260/5268/5239 5257/5266/5237 +f 5505/5514/5486 5257/5266/5237 5256/5265/5236 +f 5509/5516/5488 5510/5518/5490 5508/5515/5487 +f 5511/5517/5489 5512/5519/5491 5510/5518/5490 +f 5512/5519/5491 5513/5521/5493 5514/5520/5492 +f 5510/5518/5490 5514/5520/5492 5260/5268/5239 +f 5516/5525/5497 5513/5521/5493 5515/5522/5494 +f 5515/5522/5494 5512/5519/5491 5517/5523/5495 +f 5519/5526/5498 5515/5522/5494 5518/5524/5496 +f 5520/5566/5538 5516/5525/5497 5519/5526/5498 +f 5522/5529/5501 5235/5527/5499 5521/5528/5500 +f 5521/5528/5500 5234/5246/5217 5230/5242/5213 +f 5523/5530/5502 5521/5528/5500 5229/5240/5211 +f 5524/5532/5504 5522/5529/5501 5523/5530/5502 +f 5242/5253/5224 5237/5248/5219 5525/5531/5503 +f 5525/5531/5503 5236/5247/5218 5522/5529/5501 +f 5526/5533/5505 5525/5531/5503 5524/5532/5504 +f 5243/5331/5302 5242/5253/5224 5526/5533/5505 +f 5528/5536/5508 5219/5231/5202 5527/5534/5506 +f 5527/5534/5506 5310/5318/5289 5323/5535/5507 +f 5526/5533/5505 5527/5534/5506 5243/5331/5302 +f 5527/5534/5506 5526/5533/5505 5524/5532/5504 +f 5220/5232/5203 5219/5231/5202 5529/5537/5509 +f 5529/5537/5509 5528/5536/5508 5530/5538/5510 +f 5532/5540/5512 5529/5537/5509 5531/5539/5511 +f 5221/5233/5204 5220/5232/5203 5532/5540/5512 +f 5530/5538/5510 5524/5532/5504 5533/5541/5513 +f 5533/5541/5513 5523/5530/5502 5534/5542/5514 +f 5536/5544/5516 5533/5541/5513 5535/5543/5515 +f 5531/5539/5511 5530/5538/5510 5536/5544/5516 +f 5540/5551/5523 5537/5545/5517 5539/5547/5519 +f 5539/5547/5519 5538/5546/5518 5542/5549/5521 +f 5544/5552/5524 5539/5547/5519 5543/5550/5522 +f 5545/5594/5566 5540/5551/5523 5544/5552/5524 +f 5547/5555/5527 5531/5539/5511 5546/5553/5525 +f 5546/5553/5525 5536/5544/5516 5548/5554/5526 +f 5538/5546/5518 5546/5553/5525 5541/5548/5520 +f 5537/5545/5517 5547/5555/5527 5538/5546/5518 +f 5228/5239/5210 5549/5557/5529 5550/5556/5528 +f 5227/5238/5209 5551/5558/5530 5549/5557/5529 +f 5551/5558/5530 5552/5562/5534 5553/5559/5531 +f 5549/5557/5529 5553/5559/5531 5554/5560/5532 +f 5555/5561/5533 5556/5563/5535 5448/5460/5431 +f 5552/5562/5534 5557/5564/5536 5556/5563/5535 +f 5557/5564/5536 5278/5287/5258 5281/5291/5262 +f 5556/5563/5535 5281/5291/5262 5285/5435/5406 +f 5551/5558/5530 5558/5565/5537 5557/5564/5536 +f 5227/5238/5209 5224/5236/5207 5558/5565/5537 +f 5224/5236/5207 5223/5235/5206 5279/5285/5256 +f 5558/5565/5537 5279/5285/5256 5278/5287/5258 +f 5560/5569/5541 5520/5566/5538 5559/5567/5539 +f 5559/5567/5539 5519/5526/5498 5561/5568/5540 +f 5562/5570/5542 5559/5567/5539 5554/5560/5532 +f 5563/5575/5547 5560/5569/5541 5562/5570/5542 +f 5564/5571/5543 5565/5572/5544 5456/5465/5436 +f 5565/5572/5544 5564/5571/5543 5560/5569/5541 +f 5560/5569/5541 5563/5575/5547 5566/5573/5545 +f 5565/5572/5544 5566/5573/5545 5457/5466/5437 +f 5461/5469/5440 5457/5466/5437 5567/5574/5546 +f 5563/5575/5547 5568/5576/5548 5567/5574/5546 +f 5568/5576/5548 5452/5461/5432 5451/5577/5549 +f 5450/5459/5430 5461/5469/5440 5451/5577/5549 +f 5553/5559/5531 5569/5578/5550 5562/5570/5542 +f 5552/5562/5534 5555/5561/5533 5569/5578/5550 +f 5568/5576/5548 5569/5578/5550 5452/5461/5432 +f 5569/5578/5550 5568/5576/5548 5563/5575/5547 +f 5561/5568/5540 5570/5579/5551 5550/5556/5528 +f 5518/5524/5496 5571/5580/5552 5570/5579/5551 +f 5571/5580/5552 5535/5543/5515 5534/5542/5514 +f 5570/5579/5551 5534/5542/5514 5229/5240/5211 +f 5548/5554/5526 5535/5543/5515 5572/5581/5553 +f 5572/5581/5553 5571/5580/5552 5517/5523/5495 +f 5573/5582/5554 5572/5581/5553 5511/5517/5489 +f 5541/5548/5520 5548/5554/5526 5573/5582/5554 +f 5542/5549/5521 5541/5548/5520 5574/5583/5555 +f 5574/5583/5555 5573/5582/5554 5509/5516/5488 +f 5575/5584/5556 5574/5583/5555 5507/5513/5485 +f 5543/5550/5522 5542/5549/5521 5575/5584/5556 +f 5576/5585/5557 5577/5587/5559 5502/5586/5558 +f 5543/5550/5522 5575/5584/5556 5577/5587/5559 +f 5575/5584/5556 5507/5513/5485 5504/5511/5483 +f 5577/5587/5559 5504/5511/5483 5503/5510/5482 +f 5578/5588/5560 5579/5590/5562 5500/5508/5480 +f 5580/5589/5561 5581/5591/5563 5579/5590/5562 +f 5583/5593/5565 5579/5590/5562 5582/5592/5564 +f 5501/5509/5481 5500/5508/5480 5583/5593/5565 +f 5585/5596/5568 5545/5594/5566 5584/5595/5567 +f 5584/5595/5567 5544/5552/5524 5576/5585/5557 +f 5583/5593/5565 5584/5595/5567 5501/5509/5481 +f 5582/5592/5564 5585/5596/5568 5583/5593/5565 +f 5532/5540/5512 5586/5598/5570 5587/5597/5569 +f 5586/5598/5570 5532/5540/5512 5547/5555/5527 +f 5588/5599/5571 5586/5598/5570 5537/5545/5517 +f 5589/5600/5572 5587/5597/5569 5588/5599/5571 +f 5591/5602/5574 5589/5600/5572 5590/5601/5573 +f 5590/5601/5573 5588/5599/5571 5540/5551/5523 +f 5592/5603/5575 5590/5601/5573 5545/5594/5566 +f 5593/5614/5586 5591/5602/5574 5592/5603/5575 +f 5595/5605/5577 5216/5227/5198 5594/5604/5576 +f 5221/5233/5204 5587/5597/5569 5594/5604/5576 +f 5596/5606/5578 5594/5604/5576 5589/5600/5572 +f 5597/5608/5580 5595/5605/5577 5596/5606/5578 +f 2272/2292/2261 2069/2091/2060 5598/5607/5579 +f 5598/5607/5579 5212/5223/5194 5595/5605/5577 +f 5599/5609/5581 5598/5607/5579 5597/5608/5580 +f 2273/2294/2263 2272/2292/2261 5599/5609/5581 +f 2275/2296/2265 2273/2294/2263 5600/5610/5582 +f 5600/5610/5582 5599/5609/5581 5601/5611/5583 +f 5603/5613/5585 5600/5610/5582 5602/5612/5584 +f 2097/2118/2087 2275/2296/2265 5603/5613/5585 +f 5591/5602/5574 5604/5615/5587 5596/5606/5578 +f 5593/5614/5586 5605/5616/5588 5604/5615/5587 +f 5605/5616/5588 5602/5612/5584 5601/5611/5583 +f 5604/5615/5587 5601/5611/5583 5597/5608/5580 +f 5606/5617/5589 5607/5619/5591 5605/5616/5588 +f 5608/5618/5590 5609/5620/5592 5607/5619/5591 +f 5609/5620/5592 5610/5622/5594 5611/5621/5593 +f 5607/5619/5591 5611/5621/5593 5602/5612/5584 +f 5611/5621/5593 5612/5623/5595 5603/5613/5585 +f 5610/5622/5594 5613/5624/5596 5612/5623/5595 +f 5613/5624/5596 5209/5220/5191 5207/5219/5190 +f 5612/5623/5595 5207/5219/5190 2097/2118/2087 +f 5614/5625/5597 5615/5628/5600 5613/5624/5596 +f 5615/5628/5600 5614/5625/5597 5617/5627/5599 +f 5619/5641/5613 5615/5628/5600 5618/5629/5601 +f 5615/5628/5600 5619/5641/5613 5209/5220/5191 +f 5620/5630/5602 5621/5633/5605 5609/5620/5592 +f 5621/5633/5605 5620/5630/5602 5623/5632/5604 +f 5614/5625/5597 5621/5633/5605 5616/5626/5598 +f 5621/5633/5605 5614/5625/5597 5610/5622/5594 +f 5585/5596/5568 5624/5634/5606 5592/5603/5575 +f 5582/5592/5564 5625/5635/5607 5624/5634/5606 +f 5625/5635/5607 5608/5618/5590 5606/5617/5589 +f 5624/5634/5606 5606/5617/5589 5593/5614/5586 +f 5581/5591/5563 5626/5637/5609 5625/5635/5607 +f 5626/5637/5609 5581/5591/5563 5627/5636/5608 +f 5620/5630/5602 5626/5637/5609 5622/5631/5603 +f 5626/5637/5609 5620/5630/5602 5608/5618/5590 +f 5627/5636/5608 5580/5589/5561 5629/5639/5611 +f 5629/5639/5611 5628/5638/5610 5078/5089/5060 +f 5630/5640/5612 5629/5639/5611 5077/5088/5059 +f 5622/5631/5603 5627/5636/5608 5630/5640/5612 +f 5210/5222/5193 5209/5220/5191 5631/5642/5614 +f 5631/5642/5614 5619/5641/5613 5632/5643/5615 +f 5634/5645/5617 5631/5642/5614 5633/5644/5616 +f 5203/5215/5186 5210/5222/5193 5634/5645/5617 +f 5635/5646/5618 5636/5647/5619 5634/5645/5617 +f 5484/5493/5465 5482/5491/5463 5636/5647/5619 +f 5482/5491/5463 5197/5209/5180 5204/5216/5187 +f 5636/5647/5619 5204/5216/5187 5203/5215/5186 +f 5638/5649/5621 5088/5102/5073 5637/5648/5620 +f 5637/5648/5620 5087/5098/5069 5494/5501/5473 +f 5494/5501/5473 5484/5493/5465 5635/5646/5618 +f 5637/5648/5620 5635/5646/5618 5633/5644/5616 +f 5639/5650/5622 5640/5651/5623 5632/5643/5615 +f 5094/5108/5079 5093/5104/5075 5640/5651/5623 +f 5093/5104/5075 5088/5102/5073 5638/5649/5621 +f 5640/5651/5623 5638/5649/5621 5633/5644/5616 +f 5623/5632/5604 5622/5631/5603 5641/5652/5624 +f 5641/5652/5624 5630/5640/5612 5105/5115/5086 +f 5642/5653/5625 5641/5652/5624 5100/5111/5082 +f 5616/5626/5598 5623/5632/5604 5642/5653/5625 +f 5617/5627/5599 5616/5626/5598 5643/5654/5626 +f 5643/5654/5626 5642/5653/5625 5099/5110/5081 +f 5099/5110/5081 5094/5108/5079 5639/5650/5622 +f 5643/5654/5626 5639/5650/5622 5618/5629/5601 +f 5645/5656/5628 5130/5143/5114 5644/5655/5627 +f 5644/5655/5627 5129/5139/5110 5628/5638/5610 +f 5628/5638/5610 5580/5589/5561 5578/5588/5560 +f 5644/5655/5627 5578/5588/5560 5499/5506/5478 +f 5135/5145/5116 5646/5658/5630 5647/5657/5629 +f 5646/5658/5630 5135/5145/5116 5645/5656/5628 +f 5645/5656/5628 5499/5506/5478 5496/5504/5476 +f 5646/5658/5630 5496/5504/5476 5495/5503/5475 +f 5648/5659/5631 5649/5661/5633 4922/4927/4898 +f 5650/5660/5632 5651/5662/5634 5649/5661/5633 +f 5651/5662/5634 5455/5463/5434 5453/5462/5433 +f 5649/5661/5633 5453/5462/5433 4719/4928/4899 +f 5651/5662/5634 5650/5660/5632 5653/5664/5636 +f 5653/5664/5636 5652/5663/5635 5516/5525/5497 +f 5564/5571/5543 5653/5664/5636 5520/5566/5538 +f 5653/5664/5636 5564/5571/5543 5455/5463/5434 +f 5655/5667/5639 5262/5665/5637 5654/5666/5638 +f 5654/5666/5638 5261/5269/5240 5514/5520/5492 +f 5652/5663/5635 5654/5666/5638 5513/5521/5493 +f 5650/5660/5632 5655/5667/5639 5652/5663/5635 +f 5656/5668/5640 5657/5669/5641 4930/4935/4906 +f 5262/5665/5637 5655/5667/5639 5657/5669/5641 +f 5648/5659/5631 5657/5669/5641 5650/5660/5632 +f 5657/5669/5641 5648/5659/5631 4921/4936/4907 +f 5656/5668/5640 5658/5670/5642 5263/5270/5241 +f 4929/4940/4911 4932/4938/4909 5658/5670/5642 +f 4932/4938/4909 4931/4937/4908 5659/5671/5643 +f 5658/5670/5642 5659/5671/5643 5264/5272/5243 +f 5663/5677/5649 5660/5672/5644 5662/5674/5646 +f 5662/5674/5646 5661/5673/5645 5665/5676/5648 +f 4938/4944/4915 5662/5674/5646 4935/4942/4913 +f 4943/4949/4920 5663/5677/5649 4938/4944/4915 +f 5659/5671/5643 4931/4937/4908 5666/5678/5650 +f 5666/5678/5650 4946/4952/4923 5665/5676/5648 +f 5667/5679/5651 5666/5678/5650 5664/5675/5647 +f 5264/5272/5243 5659/5671/5643 5667/5679/5651 +f 5174/5186/5157 5118/5184/5155 5669/5681/5653 +f 5669/5681/5653 5668/5680/5652 5671/5683/5655 +f 5671/5683/5655 5672/5703/5675 5673/5684/5656 +f 5170/5179/5150 5174/5186/5157 5673/5684/5656 +f 5675/5686/5658 5676/5689/5661 5677/5687/5659 +f 5678/5688/5660 5679/5690/5662 5676/5689/5661 +f 5679/5690/5662 5256/5265/5236 5259/5271/5242 +f 5676/5689/5661 5259/5271/5242 5264/5272/5243 +f 5680/5691/5663 5681/5692/5664 5679/5690/5662 +f 5495/5503/5475 5498/5505/5477 5681/5692/5664 +f 5498/5505/5477 5503/5510/5482 5506/5512/5484 +f 5681/5692/5664 5506/5512/5484 5256/5265/5236 +f 5141/5151/5122 5682/5694/5666 5683/5693/5665 +f 5136/5149/5120 5647/5657/5629 5682/5694/5666 +f 5647/5657/5629 5495/5503/5475 5680/5691/5663 +f 5682/5694/5666 5680/5691/5663 5678/5688/5660 +f 5126/5134/5105 5684/5696/5668 5685/5695/5667 +f 5125/5133/5104 5683/5693/5665 5684/5696/5668 +f 5683/5693/5665 5678/5688/5660 5675/5686/5658 +f 5684/5696/5668 5675/5686/5658 5674/5685/5657 +f 5117/5127/5098 5686/5697/5669 5668/5680/5652 +f 5116/5126/5097 5685/5695/5667 5686/5697/5669 +f 5685/5695/5667 5674/5685/5657 5687/5698/5670 +f 5686/5697/5669 5687/5698/5670 5670/5682/5654 +f 5688/5699/5671 5689/5700/5672 5667/5679/5651 +f 5689/5700/5672 5688/5699/5671 5687/5698/5670 +f 5687/5698/5670 5674/5685/5657 5677/5687/5659 +f 5689/5700/5672 5677/5687/5659 5264/5272/5243 +f 5671/5683/5655 5670/5682/5654 5690/5701/5673 +f 5690/5701/5673 5688/5699/5671 5661/5673/5645 +f 5661/5673/5645 5660/5672/5644 5691/5702/5674 +f 5690/5701/5673 5691/5702/5674 5672/5703/5675 +f 5691/5702/5674 5692/5705/5677 5693/5704/5676 +f 5660/5672/5644 5694/5706/5678 5692/5705/5677 +f 5694/5706/5678 5695/5714/5686 5696/5707/5679 +f 5692/5705/5677 5696/5707/5679 5697/5708/5680 +f 5701/5712/5684 5698/5709/5681 5700/5711/5683 +f 5700/5711/5683 5699/5710/5682 4978/4985/4956 +f 5702/5713/5685 5700/5711/5683 4977/4984/4955 +f 5703/5766/5738 5701/5712/5684 5702/5713/5685 +f 5704/5715/5687 5705/5717/5689 5706/5716/5688 +f 4988/4993/4964 4986/4992/4963 5705/5717/5689 +f 5699/5710/5682 5705/5717/5689 4981/4987/4958 +f 5705/5717/5689 5699/5710/5682 5698/5709/5681 +f 5708/5719/5691 5709/5721/5693 5710/5720/5692 +f 5698/5709/5681 5701/5712/5684 5709/5721/5693 +f 5701/5712/5684 5703/5766/5738 5711/5722/5694 +f 5709/5721/5693 5711/5722/5694 5712/5723/5695 +f 5715/5728/5700 5697/5708/5680 5714/5725/5697 +f 5714/5725/5697 5713/5724/5696 5716/5726/5698 +f 5718/5729/5701 5714/5725/5697 5717/5727/5699 +f 5146/5155/5126 5715/5728/5700 5718/5729/5701 +f 5673/5684/5656 5719/5730/5702 5171/5181/5152 +f 5672/5703/5675 5693/5704/5676 5719/5730/5702 +f 5693/5704/5676 5697/5708/5680 5715/5728/5700 +f 5719/5730/5702 5715/5728/5700 5146/5155/5126 +f 5720/5731/5703 5721/5733/5705 5718/5729/5701 +f 5722/5732/5704 5723/5734/5706 5721/5733/5705 +f 5723/5734/5706 5148/5157/5128 5147/5156/5127 +f 5721/5733/5705 5147/5156/5127 5146/5155/5126 +f 5727/5738/5710 5724/5735/5707 5726/5737/5709 +f 5726/5737/5709 5725/5736/5708 5720/5731/5703 +f 5728/5739/5711 5726/5737/5709 5717/5727/5699 +f 5729/5783/5755 5727/5738/5710 5728/5739/5711 +f 5733/5744/5716 5730/5740/5712 5732/5742/5714 +f 5724/5735/5707 5734/5743/5715 5732/5742/5714 +f 5734/5743/5715 5466/5475/5446 5469/5478/5449 +f 5732/5742/5714 5469/5478/5449 5065/5076/5047 +f 5736/5746/5718 5737/5748/5720 5738/5747/5719 +f 5154/5173/5144 5153/5162/5133 5737/5748/5720 +f 5153/5162/5133 5148/5157/5128 5723/5734/5706 +f 5737/5748/5720 5723/5734/5706 5722/5732/5704 +f 5491/5499/5471 5739/5751/5723 5740/5750/5722 +f 5161/5169/5140 5165/5175/5146 5739/5751/5723 +f 5165/5175/5146 5154/5173/5144 5736/5746/5718 +f 5739/5751/5723 5736/5746/5718 5735/5745/5717 +f 5481/5490/5462 5476/5483/5454 5742/5753/5725 +f 5742/5753/5725 5741/5752/5724 5744/5755/5727 +f 5744/5755/5727 5730/5740/5712 5733/5744/5716 +f 5742/5753/5725 5733/5744/5716 5065/5076/5047 +f 5746/5757/5729 5201/5212/5183 5745/5756/5728 +f 5745/5756/5728 5487/5496/5468 5490/5500/5472 +f 5747/5758/5730 5745/5756/5728 5492/5749/5721 +f 5743/5754/5726 5746/5757/5729 5747/5758/5730 +f 5474/5482/5453 2260/2279/2248 5748/5759/5731 +f 5748/5759/5731 5202/5214/5185 5746/5757/5729 +f 5741/5752/5724 5748/5759/5731 5743/5754/5726 +f 5476/5483/5454 5474/5482/5453 5741/5752/5724 +f 5744/5755/5727 5743/5754/5726 5749/5760/5732 +f 5492/5749/5721 5740/5750/5722 5749/5760/5732 +f 5740/5750/5722 5735/5745/5717 5750/5761/5733 +f 5749/5760/5732 5750/5761/5733 5730/5740/5712 +f 5750/5761/5733 5751/5762/5734 5731/5741/5713 +f 5735/5745/5717 5738/5747/5719 5751/5762/5734 +f 5725/5736/5708 5751/5762/5734 5722/5732/5704 +f 5724/5735/5707 5731/5741/5713 5725/5736/5708 +f 5753/5764/5736 5754/5767/5739 5755/5765/5737 +f 5703/5766/5738 5702/5713/5685 5754/5767/5739 +f 5702/5713/5685 4977/4984/4955 5037/5045/5016 +f 5754/5767/5739 5037/5045/5016 5041/5049/5020 +f 5759/5771/5743 5756/5768/5740 5758/5770/5742 +f 5758/5770/5742 5757/5769/5741 5711/5722/5694 +f 5753/5764/5736 5758/5770/5742 5703/5766/5738 +f 5752/5763/5735 5759/5771/5743 5753/5764/5736 +f 5755/5765/5737 5760/5773/5745 5761/5772/5744 +f 5760/5773/5745 5755/5765/5737 5046/5055/5026 +f 830/824/823 5760/5773/5745 57/54/54 +f 5760/5773/5745 830/824/823 829/823/822 +f 1423/1434/1417 1422/1433/1416 5763/5775/5747 +f 5763/5775/5747 5762/5774/5746 5759/5771/5743 +f 5761/5772/5744 5763/5775/5747 5752/5763/5735 +f 829/823/822 1423/1434/1417 5761/5772/5744 +f 1413/1424/1407 921/910/909 5764/5776/5748 +f 5764/5776/5748 5467/5476/5447 5765/5777/5749 +f 5767/5779/5751 5764/5776/5748 5766/5778/5750 +f 1414/1425/1408 1413/1424/1407 5767/5779/5751 +f 1427/1438/1421 1414/1425/1408 5768/5780/5752 +f 5768/5780/5752 5767/5779/5751 5769/5781/5753 +f 5762/5774/5746 5768/5780/5752 5756/5768/5740 +f 1422/1433/1416 1427/1438/1421 5762/5774/5746 +f 5765/5777/5749 5466/5475/5446 5770/5782/5754 +f 5770/5782/5754 5734/5743/5715 5727/5738/5710 +f 5771/5784/5756 5770/5782/5754 5729/5783/5755 +f 5766/5778/5750 5765/5777/5749 5771/5784/5756 +f 5769/5781/5753 5766/5778/5750 5772/5785/5757 +f 5772/5785/5757 5771/5784/5756 5773/5786/5758 +f 5757/5769/5741 5772/5785/5757 5712/5723/5695 +f 5756/5768/5740 5769/5781/5753 5757/5769/5741 +f 5773/5786/5758 5729/5783/5755 5774/5787/5759 +f 5774/5787/5759 5728/5739/5711 5716/5726/5698 +f 5710/5720/5692 5774/5787/5759 5707/5718/5690 +f 5712/5723/5695 5773/5786/5758 5710/5720/5692 +f 5696/5707/5679 5775/5788/5760 5713/5724/5696 +f 5695/5714/5686 5706/5716/5688 5775/5788/5760 +f 5706/5716/5688 5698/5709/5681 5708/5719/5691 +f 5775/5788/5760 5708/5719/5691 5707/5718/5690 +f 5663/5677/5649 5776/5789/5761 5694/5706/5678 +f 4943/4949/4920 5063/5073/5044 5776/5789/5761 +f 5063/5073/5044 4988/4993/4964 5704/5715/5687 +f 5776/5789/5761 5704/5715/5687 5695/5714/5686 +f 5778/5791/5763 5779/5794/5766 5780/5792/5764 +f 5781/5793/5765 5782/5795/5767 5779/5794/5766 +f 5782/5795/5767 5783/5803/5775 5784/5796/5768 +f 5779/5794/5766 5784/5796/5768 5785/5797/5769 +f 5787/5801/5773 2325/2346/2315 5786/5798/5770 +f 5786/5798/5770 2324/2345/2314 5788/5799/5771 +f 5790/5802/5774 5786/5798/5770 5789/5800/5772 +f 5791/5806/5778 5787/5801/5773 5790/5802/5774 +f 5792/5804/5776 5793/5807/5779 5794/5805/5777 +f 5791/5806/5778 5790/5802/5774 5793/5807/5779 +f 5790/5802/5774 5789/5800/5772 5795/5808/5780 +f 5793/5807/5779 5795/5808/5780 5796/5809/5781 +f 5788/5799/5771 5797/5811/5783 5798/5810/5782 +f 2313/2335/2304 2316/2337/2306 5797/5811/5783 +f 5799/5812/5784 5797/5811/5783 2321/2342/2311 +f 5800/5820/5792 5798/5810/5782 5799/5812/5784 +f 5801/5813/5785 5802/5816/5788 2383/2401/2370 +f 5802/5816/5788 5801/5813/5785 5804/5815/5787 +f 5806/5818/5790 5802/5816/5788 5805/5817/5789 +f 2386/2403/2372 2383/2401/2370 5806/5818/5790 +f 5807/5819/5791 5808/5821/5793 5806/5818/5790 +f 5800/5820/5792 5799/5812/5784 5808/5821/5793 +f 5799/5812/5784 2321/2342/2311 2412/2431/2400 +f 5808/5821/5793 2412/2431/2400 2386/2403/2372 +f 5807/5819/5791 5809/5823/5795 5810/5822/5794 +f 5805/5817/5789 5811/5940/5912 5809/5823/5795 +f 5809/5823/5795 5811/5940/5912 5812/5824/5796 +f 5814/5826/5798 5796/5809/5781 5813/5825/5797 +f 5789/5800/5772 5798/5810/5782 5813/5825/5797 +f 5810/5822/5794 5813/5825/5797 5800/5820/5792 +f 5812/5824/5796 5814/5826/5798 5810/5822/5794 +f 5816/5829/5801 5785/5797/5769 5815/5827/5799 +f 5783/5803/5775 5794/5805/5777 5815/5827/5799 +f 5794/5805/5777 5796/5809/5781 5817/5828/5800 +f 5818/5833/5805 5816/5829/5801 5817/5828/5800 +f 5820/5831/5803 5821/5834/5806 5822/5832/5804 +f 5818/5833/5805 5817/5828/5800 5821/5834/5806 +f 5817/5828/5800 5796/5809/5781 5814/5826/5798 +f 5812/5824/5796 5822/5832/5804 5814/5826/5798 +f 5826/5841/5813 5823/5835/5807 5825/5837/5809 +f 5825/5837/5809 5824/5836/5808 5828/5839/5811 +f 2640/2648/2617 5825/5837/5809 2456/5840/5812 +f 5825/5837/5809 2640/2648/2617 2639/2654/2623 +f 5832/5845/5817 5829/5842/5814 5831/5844/5816 +f 5831/5844/5816 5830/5843/5815 5826/5841/5813 +f 2644/2653/2622 5831/5844/5816 2639/2654/2623 +f 2504/2652/2621 5832/5845/5817 2644/2653/2622 +f 5834/5847/5819 5835/5850/5822 5836/5848/5820 +f 5837/5849/5821 5838/5851/5823 5835/5850/5822 +f 5838/5851/5823 2475/2490/2459 2474/2488/2457 +f 5835/5850/5822 2474/2488/2457 2473/2487/2456 +f 5842/5855/5827 5839/5852/5824 5841/5854/5826 +f 5833/5846/5818 5836/5848/5820 5841/5854/5826 +f 5836/5848/5820 2473/2487/2456 2688/2701/2670 +f 5841/5854/5826 2688/2701/2670 2686/2700/2669 +f 2435/2452/2421 2434/2451/2420 5844/5857/5829 +f 5844/5857/5829 5843/5856/5828 5842/5855/5827 +f 2685/2698/2667 5844/5857/5829 2686/2700/2669 +f 5844/5857/5829 2685/2698/2667 2438/2454/2423 +f 2326/5858/5830 5845/5859/5831 2693/2707/2676 +f 2325/2346/2315 5787/5801/5773 5845/5859/5831 +f 5787/5801/5773 5791/5806/5778 5846/5860/5832 +f 2695/2709/2678 2693/2707/2676 5846/5860/5832 +f 5847/5861/5833 5848/5862/5834 5782/5795/5767 +f 2695/2709/2678 5846/5860/5832 5848/5862/5834 +f 5846/5860/5832 5791/5806/5778 5792/5804/5776 +f 5848/5862/5834 5792/5804/5776 5783/5803/5775 +f 2698/2711/2680 2695/2709/2678 5849/5863/5835 +f 5849/5863/5835 5847/5861/5833 5850/5864/5836 +f 5843/5856/5828 5849/5863/5835 5839/5852/5824 +f 2434/2451/2420 2698/2711/2680 5843/5856/5828 +f 5778/5791/5763 5777/5790/5762 5852/5866/5838 +f 5852/5866/5838 5851/5865/5837 5840/5853/5825 +f 5850/5864/5836 5852/5866/5838 5839/5852/5824 +f 5781/5793/5765 5778/5791/5763 5850/5864/5836 +f 5856/5870/5842 5853/5867/5839 5855/5869/5841 +f 5855/5869/5841 5854/5868/5840 5834/5847/5819 +f 5851/5865/5837 5855/5869/5841 5833/5846/5818 +f 5855/5869/5841 5851/5865/5837 5856/5870/5842 +f 5857/5871/5843 5858/5872/5844 5838/5851/5823 +f 2705/2718/2687 2704/2717/2686 5858/5872/5844 +f 2704/2717/2686 2703/2957/2926 2944/2954/2923 +f 5858/5872/5844 2944/2954/2923 2475/2490/2459 +f 5860/5874/5846 2711/2768/2737 5859/5873/5845 +f 5859/5873/5845 2710/2722/2691 5857/5871/5843 +f 5854/5868/5840 5859/5873/5845 5837/5849/5821 +f 5853/5867/5839 5860/5874/5846 5854/5868/5840 +f 5861/5875/5847 5862/5877/5849 2743/2754/2723 +f 5863/5876/5848 5864/5878/5850 5862/5877/5849 +f 5864/5878/5850 5829/5842/5814 5832/5845/5817 +f 2504/2652/2621 2743/2754/2723 5832/5845/5817 +f 5866/5880/5852 5867/5884/5856 5868/5881/5853 +f 5867/5884/5856 5866/5880/5852 5870/5883/5855 +f 5870/5883/5855 5871/5936/5908 5872/5885/5857 +f 5867/5884/5856 5872/5885/5857 5863/5876/5848 +f 5874/5887/5859 5875/5890/5862 5876/5888/5860 +f 5877/5889/5861 5878/5891/5863 5875/5890/5862 +f 5866/5880/5852 5875/5890/5862 5869/5882/5854 +f 5875/5890/5862 5866/5880/5852 5865/5879/5851 +f 5879/5892/5864 5880/5893/5865 2747/2758/2727 +f 5865/5879/5851 5868/5881/5853 5880/5893/5865 +f 5868/5881/5853 5863/5876/5848 5861/5875/5847 +f 5880/5893/5865 5861/5875/5847 2742/2752/2721 +f 5882/5895/5867 5873/5886/5858 5881/5894/5866 +f 5881/5894/5866 5876/5888/5860 5879/5892/5864 +f 2749/2759/2728 5881/5894/5866 2746/2756/2725 +f 2751/2762/2731 5882/5895/5867 2749/2759/2728 +f 5820/5831/5803 5883/5897/5869 5884/5896/5868 +f 5819/5830/5802 5885/5898/5870 5883/5897/5869 +f 5885/5898/5870 5886/5913/5885 5887/5899/5871 +f 5883/5897/5869 5887/5899/5871 5888/5900/5872 +f 5889/5901/5873 5890/5903/5875 5884/5896/5868 +f 5891/5902/5874 5892/5904/5876 5890/5903/5875 +f 5892/5904/5876 5785/5797/5769 5816/5829/5801 +f 5890/5903/5875 5816/5829/5801 5818/5833/5805 +f 2757/2769/2738 2711/2768/2737 5893/5905/5877 +f 5893/5905/5877 5860/5874/5846 5894/5906/5878 +f 5895/5907/5879 5893/5905/5877 5891/5902/5874 +f 2755/2766/2735 2757/2769/2738 5895/5907/5879 +f 5894/5906/5878 5896/5908/5880 5892/5904/5876 +f 5896/5908/5880 5894/5906/5878 5856/5870/5842 +f 5856/5870/5842 5777/5790/5762 5896/5908/5880 +f 5896/5908/5880 5780/5792/5764 5785/5797/5769 +f 5889/5901/5873 5888/5900/5872 5898/5910/5882 +f 5898/5910/5882 5897/5909/5881 5900/5912/5884 +f 5895/5907/5879 5898/5910/5882 2755/2766/2735 +f 5891/5902/5874 5889/5901/5873 5895/5907/5879 +f 5887/5899/5871 5886/5913/5885 5902/5915/5887 +f 5902/5915/5887 5901/5914/5886 5904/5917/5889 +f 5897/5909/5881 5902/5915/5887 5899/5911/5883 +f 5888/5900/5872 5887/5899/5871 5897/5909/5881 +f 5878/5891/5863 5905/5919/5891 5906/5918/5890 +f 5877/5889/5861 5907/5920/5892 5905/5919/5891 +f 5907/5920/5892 5908/5955/5927 5909/5921/5893 +f 5905/5919/5891 5909/5921/5893 5910/5922/5894 +f 5911/5923/5895 5912/5925/5897 5906/5918/5890 +f 5913/5924/5896 5914/5926/5898 5912/5925/5897 +f 5914/5926/5898 5871/5936/5908 5870/5883/5855 +f 5912/5925/5897 5870/5883/5855 5869/5882/5854 +f 5911/5923/5895 5915/5928/5900 5916/5927/5899 +f 5910/5922/5894 5917/5929/5901 5915/5928/5900 +f 5917/5929/5901 5903/5916/5888 5918/5930/5902 +f 5915/5928/5900 5918/5930/5902 5919/5931/5903 +f 5824/5836/5808 5823/5835/5807 5920/5932/5904 +f 5920/5932/5904 5830/5843/5815 5921/5933/5905 +f 5923/5950/5922 5920/5932/5904 5922/5934/5906 +f 5920/5932/5904 5923/5950/5922 5827/5838/5810 +f 5921/5933/5905 5829/5842/5814 5924/5935/5907 +f 5924/5935/5907 5864/5878/5850 5872/5885/5857 +f 5925/5937/5909 5924/5935/5907 5871/5936/5908 +f 5922/5934/5906 5921/5933/5905 5925/5937/5909 +f 5914/5926/5898 5926/5938/5910 5925/5937/5909 +f 5913/5924/5896 5916/5927/5899 5926/5938/5910 +f 5916/5927/5899 5919/5931/5903 5927/5939/5911 +f 5926/5938/5910 5927/5939/5911 5922/5934/5906 +f 5811/5940/5912 5928/5942/5914 5929/5941/5913 +f 5928/5942/5914 5811/5940/5912 5804/5815/5787 +f 5930/5943/5915 5928/5942/5914 5803/5814/5786 +f 5931/5954/5926 5929/5941/5913 5930/5943/5915 +f 5801/5813/5785 5932/5944/5916 5930/5943/5915 +f 2382/2400/2369 2452/2468/2437 5932/5944/5916 +f 5933/5945/5917 5932/5944/5916 2451/2467/2436 +f 5931/5954/5926 5930/5943/5915 5933/5945/5917 +f 2454/2469/2438 5934/5946/5918 5933/5945/5917 +f 2456/5840/5812 5828/5839/5811 5934/5946/5918 +f 5935/5947/5919 5934/5946/5918 5827/5838/5810 +f 5931/5954/5926 5933/5945/5917 5935/5947/5919 +f 5937/5949/5921 5886/5913/5885 5936/5948/5920 +f 5936/5948/5920 5885/5898/5870 5822/5832/5804 +f 5929/5941/5913 5936/5948/5920 5812/5824/5796 +f 5931/5954/5926 5937/5949/5921 5929/5941/5913 +f 5923/5950/5922 5938/5951/5923 5935/5947/5919 +f 5938/5951/5923 5923/5950/5922 5927/5939/5911 +f 5939/5952/5924 5938/5951/5923 5919/5931/5903 +f 5931/5954/5926 5935/5947/5919 5939/5952/5924 +f 5918/5930/5902 5940/5953/5925 5939/5952/5924 +f 5903/5916/5888 5901/5914/5886 5940/5953/5925 +f 5901/5914/5886 5886/5913/5885 5937/5949/5921 +f 5940/5953/5925 5937/5949/5921 5931/5954/5926 +f 5909/5921/5893 5941/5957/5929 5917/5929/5901 +f 5941/5957/5929 5909/5921/5893 5942/5956/5928 +f 5942/5956/5928 5899/5911/5883 5904/5917/5889 +f 5941/5957/5929 5904/5917/5889 5903/5916/5888 +f 5942/5956/5928 5908/5955/5927 5943/5958/5930 +f 5943/5958/5930 5907/5920/5892 5874/5887/5859 +f 5944/5959/5931 5943/5958/5930 5873/5886/5858 +f 5899/5911/5883 5942/5956/5928 5944/5959/5931 +f 5900/5912/5884 5899/5911/5883 5945/5960/5932 +f 5945/5960/5932 5944/5959/5931 5882/5895/5867 +f 2753/2763/2732 5945/5960/5932 2751/2762/2731 +f 2755/2766/2735 5900/5912/5884 2753/2763/2732 +f 5949/5967/5939 5946/5961/5933 5948/5963/5935 +f 5948/5963/5935 5947/5962/5934 5951/5965/5937 +f 5953/5968/5940 5948/5963/5935 5952/5966/5938 +f 5954/5998/5970 5949/5967/5939 5953/5968/5940 +f 5956/5970/5942 5957/5972/5944 5958/5971/5943 +f 3323/3340/3309 3327/3344/3313 5957/5972/5944 +f 5957/5972/5944 3326/6026/3312 5959/5973/5945 +f 5961/5976/5948 5955/5969/5941 5960/5974/5946 +f 5960/5974/5946 5958/5971/5943 5962/5975/5947 +f 5963/5977/5949 5960/5974/5946 5946/5961/5933 +f 5964/5996/5968 5961/5976/5948 5963/5977/5949 +f 3324/3342/3311 5965/5979/5951 5966/5978/5950 +f 3323/3340/3309 5956/5970/5942 5965/5979/5951 +f 5956/5970/5942 5955/5969/5941 5967/5980/5952 +f 5965/5979/5951 5967/5980/5952 5968/5981/5953 +f 5970/5983/5955 5971/5987/5959 5972/5984/5956 +f 5971/5987/5959 5970/5983/5955 5974/5986/5958 +f 3391/3405/3374 5971/5987/5959 3392/3406/3375 +f 5971/5987/5959 3391/3405/3374 3390/3404/3373 +f 3417/3432/3401 3325/3430/3399 5975/5988/5960 +f 5975/5988/5960 5966/5978/5950 5976/5989/5961 +f 5972/5984/5956 5975/5988/5960 5969/5982/5954 +f 3390/3404/3373 3417/3432/3401 5972/5984/5956 +f 5976/5989/5961 5977/5991/5963 5978/5990/5962 +f 5968/5981/5953 5979/5992/5964 5977/5991/5963 +f 5980/5995/5967 5978/5990/5962 5979/5992/5964 +f 5967/5980/5952 5981/5993/5965 5979/5992/5964 +f 5955/5969/5941 5961/5976/5948 5981/5993/5965 +f 5961/5976/5948 5964/5996/5968 5982/5994/5966 +f 5981/5993/5965 5982/5994/5966 5980/5995/5967 +f 5984/5999/5971 5964/5996/5968 5983/5997/5969 +f 5983/5997/5969 5963/5977/5949 5949/5967/5939 +f 5985/6075/6045 5983/5997/5969 5954/5998/5970 +f 5983/5997/5969 5985/6075/6045 5986/6000/5972 +f 5982/5994/5966 5964/5996/5968 5987/6001/5973 +f 5987/6001/5973 5984/5999/5971 5988/6002/5974 +f 5990/6118/6088 5987/6001/5973 5989/6003/5975 +f 5987/6001/5973 5990/6118/6088 5980/5995/5967 +f 3642/3649/3618 3460/6004/5976 5992/6006/5978 +f 5992/6006/5978 5991/6005/5977 5994/6008/5980 +f 5996/6010/5982 5992/6006/5978 5995/6009/5981 +f 3639/3644/3613 3642/3649/3618 5996/6010/5982 +f 5996/6010/5982 5997/6011/5983 3649/3654/3623 +f 5995/6009/5981 5998/6012/5984 5997/6011/5983 +f 5998/6012/5984 5999/6043/6013 6000/6013/5985 +f 5997/6011/5983 6000/6013/5985 3508/3515/3484 +f 3474/3483/3452 3473/3482/3451 6002/6015/5987 +f 6002/6015/5987 6001/6014/5986 6004/6017/5989 +f 6006/6019/5991 6002/6015/5987 6005/6018/5990 +f 3477/3485/3454 3474/3483/3452 6006/6019/5991 +f 3692/3698/3667 3477/3485/3454 6007/6020/5992 +f 6007/6020/5992 6006/6019/5991 6008/6021/5993 +f 6010/6023/5995 6007/6020/5992 6009/6022/5994 +f 3688/3694/3663 3692/3698/3667 6010/6023/5995 +f 3689/3695/3664 3688/3694/3663 6011/6024/5996 +f 6009/6022/5994 6012/6025/5997 6011/6024/5996 +f 6012/6025/5997 3444/3711/3680 3443/3455/3424 +f 3442/3454/3423 3689/3695/3664 3443/3455/3424 +f 3329/3345/3314 3331/3351/3320 3700/3707/3676 +f 5962/5975/5947 5959/5973/5945 6014/6029/5999 +f 3699/3705/3674 6015/6030/6000 6014/6029/5999 +f 6015/6030/6000 5950/5964/5936 5947/5962/5934 +f 5946/5961/5933 5962/5975/5947 5947/5962/5934 +f 6016/6031/6001 6017/6032/6002 6012/6025/5997 +f 5950/5964/5936 6015/6030/6000 6017/6032/6002 +f 6015/6030/6000 3699/3705/3674 3703/3712/3681 +f 3444/3711/3680 6012/6025/5997 3703/3712/3681 +f 6016/6031/6001 6009/6022/5994 6018/6033/6003 +f 6005/6018/5990 6019/6034/6004 6018/6033/6003 +f 6019/6034/6004 5952/5966/5938 5951/5965/5937 +f 6018/6033/6003 5951/5965/5937 5950/5964/5936 +f 6004/6017/5989 6020/6035/6005 6019/6034/6004 +f 6003/6016/5988 6021/6036/6006 6020/6035/6005 +f 6021/6036/6006 6022/6042/6012 6023/6037/6007 +f 6020/6035/6005 6023/6037/6007 5952/5966/5938 +f 3947/3953/3922 3704/3713/3682 6024/6038/6008 +f 6024/6038/6008 3707/3716/3685 6025/6039/6009 +f 6001/6014/5986 6024/6038/6008 6003/6016/5988 +f 3473/3482/3451 3947/3953/3922 6001/6014/5986 +f 6025/6039/6009 6026/6040/6010 6021/6036/6006 +f 3709/3718/3687 3711/3722/3691 6026/6040/6010 +f 3711/3722/3691 3715/3768/3737 6027/6041/6011 +f 6026/6040/6010 6027/6041/6011 6022/6042/6012 +f 6028/6044/6014 6029/6047/6017 6000/6013/5985 +f 6029/6047/6017 6028/6044/6014 6031/6046/6016 +f 3744/3751/3720 6029/6047/6017 3746/3753/3722 +f 6029/6047/6017 3744/3751/3720 3508/3515/3484 +f 6035/6054/6024 6032/6048/6018 6034/6050/6020 +f 6034/6050/6020 6033/6049/6019 6037/6052/6022 +f 6039/6055/6025 6034/6050/6020 6038/6053/6023 +f 6030/6045/6015 6035/6054/6024 6039/6055/6025 +f 6040/6056/6026 6041/6058/6028 6037/6052/6022 +f 6042/6057/6027 6043/6059/6029 6041/6058/6028 +f 6043/6059/6029 6044/6127/6097 6045/6060/6030 +f 6038/6053/6023 6037/6052/6022 6045/6060/6030 +f 6031/6046/6016 6030/6045/6015 6046/6061/6031 +f 6046/6061/6031 6039/6055/6025 6047/6062/6032 +f 3748/3755/3724 6046/6061/6031 3750/3757/3726 +f 3746/3753/3722 6031/6046/6016 3748/3755/3724 +f 6047/6062/6032 6048/6063/6033 3754/3762/3731 +f 6038/6053/6023 6045/6060/6030 6048/6063/6033 +f 6045/6060/6030 6044/6127/6097 6049/6064/6034 +f 6048/6063/6033 6049/6064/6034 3755/3765/3734 +f 6053/6068/6038 6050/6065/6035 6052/6067/6037 +f 6052/6067/6037 6051/6066/6036 5988/6002/5974 +f 6054/6069/6039 6052/6067/6037 5986/6000/5972 +f 6055/6074/6044 6053/6068/6038 6054/6069/6039 +f 5985/6075/6045 5954/5998/5970 6057/6071/6041 +f 6057/6071/6041 6056/6070/6040 6059/6073/6043 +f 6054/6069/6039 6057/6071/6041 6055/6074/6044 +f 5986/6000/5972 5985/6075/6045 6054/6069/6039 +f 6060/6076/6046 6061/6078/6048 6062/6077/6047 +f 6022/6042/6012 6027/6041/6011 6061/6078/6048 +f 6027/6041/6011 3715/3768/3737 3761/3769/3738 +f 6061/6078/6048 3761/3769/3738 3759/3767/3736 +f 6023/6037/6007 6063/6079/6049 5953/5968/5940 +f 6022/6042/6012 6060/6076/6046 6063/6079/6049 +f 6056/6070/6040 6063/6079/6049 6058/6072/6042 +f 6063/6079/6049 6056/6070/6040 5954/5998/5970 +f 6064/6080/6050 6065/6082/6052 6062/6077/6047 +f 6066/6081/6051 6067/6083/6053 6065/6082/6052 +f 6067/6083/6053 6055/6074/6044 6059/6073/6043 +f 6065/6082/6052 6059/6073/6043 6058/6072/6042 +f 6068/6084/6054 6069/6086/6056 6067/6083/6053 +f 6070/6085/6055 6071/6087/6057 6069/6086/6056 +f 6071/6087/6057 6050/6065/6035 6053/6068/6038 +f 6069/6086/6056 6053/6068/6038 6055/6074/6044 +f 6075/6091/6061 6072/6088/6058 6074/6090/6060 +f 6074/6090/6060 6073/6089/6059 6040/6056/6026 +f 6076/6092/6062 6074/6090/6060 6036/6051/6021 +f 6077/6097/6067 6075/6091/6061 6076/6092/6062 +f 6078/6093/6063 6079/6095/6065 6033/6049/6019 +f 6080/6094/6064 6081/6096/6066 6079/6095/6065 +f 6076/6092/6062 6079/6095/6065 6077/6097/6067 +f 6079/6095/6065 6076/6092/6062 6036/6051/6021 +f 6084/6100/6070 6070/6085/6055 6083/6099/6069 +f 6083/6099/6069 6082/6098/6068 6081/6096/6066 +f 6085/6101/6071 6083/6099/6069 6080/6094/6064 +f 6086/6108/6078 6084/6100/6070 6085/6101/6071 +f 6088/6103/6073 6089/6105/6075 6090/6104/6074 +f 5999/6043/6013 5998/6012/5984 6089/6105/6075 +f 5998/6012/5984 5995/6009/5981 5994/6008/5980 +f 6089/6105/6075 5994/6008/5980 5993/6007/5979 +f 6035/6054/6024 6091/6107/6077 6092/6106/6076 +f 6030/6045/6015 6028/6044/6014 6091/6107/6077 +f 6028/6044/6014 5999/6043/6013 6088/6103/6073 +f 6091/6107/6077 6088/6103/6073 6087/6102/6072 +f 6094/6110/6080 6086/6108/6078 6093/6109/6079 +f 6093/6109/6079 6085/6101/6071 6078/6093/6063 +f 6092/6106/6076 6093/6109/6079 6032/6048/6018 +f 6087/6102/6072 6094/6110/6080 6092/6106/6076 +f 5970/5983/5955 6095/6112/6082 6096/6111/6081 +f 5969/5982/5954 5978/5990/5962 6095/6112/6082 +f 6097/6121/6091 6095/6112/6082 5980/5995/5967 +f 6095/6112/6082 6097/6121/6091 6098/6113/6083 +f 6100/6115/6085 3458/3468/3437 6099/6114/6084 +f 6099/6114/6084 3457/3467/3436 5974/5986/5958 +f 6096/6111/6081 6099/6114/6084 5973/5985/5957 +f 6099/6114/6084 6096/6111/6081 6098/6113/6083 +f 6102/6117/6087 5993/6007/5979 6101/6116/6086 +f 6101/6116/6086 5991/6005/5977 3459/3470/3439 +f 6100/6115/6085 6101/6116/6086 3458/3468/3437 +f 6101/6116/6086 6100/6115/6085 6098/6113/6083 +f 6097/6121/6091 5980/5995/5967 6103/6119/6089 +f 6103/6119/6089 5990/6118/6088 6051/6066/6036 +f 6051/6066/6036 6050/6065/6035 6104/6120/6090 +f 6103/6119/6089 6104/6120/6090 6098/6113/6083 +f 6094/6110/6080 6105/6123/6093 6106/6122/6092 +f 6087/6102/6072 6090/6104/6074 6105/6123/6093 +f 6090/6104/6074 5993/6007/5979 6102/6117/6087 +f 6105/6123/6093 6102/6117/6087 6098/6113/6083 +f 6104/6120/6090 6050/6065/6035 6107/6124/6094 +f 6107/6124/6094 6071/6087/6057 6084/6100/6070 +f 6106/6122/6092 6107/6124/6094 6086/6108/6078 +f 6107/6124/6094 6106/6122/6092 6098/6113/6083 +f 6068/6084/6054 6066/6081/6051 6109/6126/6096 +f 6109/6126/6096 6108/6125/6095 6075/6091/6061 +f 6082/6098/6068 6109/6126/6096 6077/6097/6067 +f 6070/6085/6055 6068/6084/6054 6082/6098/6068 +f 6043/6059/6029 6110/6129/6099 6111/6128/6098 +f 6042/6057/6027 6073/6089/6059 6110/6129/6099 +f 6073/6089/6059 6072/6088/6058 6108/6125/6095 +f 6110/6129/6099 6108/6125/6095 6066/6081/6051 +f 6049/6064/6034 6112/6131/6101 3758/6130/6100 +f 6044/6127/6097 6111/6128/6098 6112/6131/6101 +f 6111/6128/6098 6066/6081/6051 6064/6080/6050 +f 6112/6131/6101 6064/6080/6050 3759/3767/3736 +f 6116/6138/6108 6113/6132/6102 6115/6134/6104 +f 6115/6134/6104 6114/6133/6103 6118/6136/6106 +f 6118/6136/6106 6119/6196/6166 6120/6137/6107 +f 6115/6134/6104 6120/6137/6107 6121/6139/6109 +f 6125/6146/6116 6122/6140/6110 6124/6142/6112 +f 6124/6142/6112 6123/6141/6111 6127/6144/6114 +f 6129/6918/9072 6124/6142/6112 6128/6145/6115 +f 6124/6142/6112 6129/6918/9072 6130/6147/6117 +f 6134/6153/6123 6131/6148/6118 6133/6150/6120 +f 6133/6150/6120 6132/6149/6119 6135/6151/6121 +f 6137/6154/6124 6133/6150/6120 6136/6152/6122 +f 6138/6164/6134 6134/6153/6123 6137/6154/6124 +f 6123/6141/6111 6122/6140/6110 6140/6156/6126 +f 6140/6156/6126 6139/6155/6125 6142/6158/6128 +f 6135/6151/6121 6140/6156/6126 6136/6152/6122 +f 6140/6156/6126 6135/6151/6121 6126/6143/6113 +f 6143/6159/6129 6144/6161/6131 6137/6154/6124 +f 6145/6160/6130 6146/6162/6132 6144/6161/6131 +f 6146/6162/6132 6147/6173/6143 6148/6163/6133 +f 6144/6161/6131 6148/6163/6133 6138/6164/6134 +f 6142/6158/6128 6141/6157/6127 6150/6166/6136 +f 6150/6166/6136 6149/6165/6135 6152/6168/6138 +f 6143/6159/6129 6150/6166/6136 6145/6160/6130 +f 6136/6152/6122 6142/6158/6128 6143/6159/6129 +f 6156/6172/6142 6153/6169/6139 6155/6171/6141 +f 6151/6167/6137 6149/6165/6135 6155/6171/6141 +f 6155/6171/6141 6149/6165/6135 6141/6157/6127 +f 6158/6176/6146 6147/6173/6143 6157/6174/6144 +f 6157/6174/6144 6146/6162/6132 6159/6175/6145 +f 6159/6175/6145 4318/6264/6234 4317/4331/4301 +f 4316/4329/4299 6158/6176/6146 4317/4331/4301 +f 6163/6183/6153 6160/6177/6147 6162/6179/6149 +f 6162/6179/6149 6161/6178/6148 6165/6181/6151 +f 6165/6181/6151 6166/6233/6203 6167/6182/6152 +f 6162/6179/6149 6167/6182/6152 6168/6184/6154 +f 6170/6186/6156 6171/6188/6158 6172/6187/6157 +f 6164/6180/6150 6161/6178/6148 6171/6188/6158 +f 6161/6178/6148 6160/6177/6147 6173/6189/6159 +f 6171/6188/6158 6173/6189/6159 6174/6190/6160 +f 6163/6183/6153 6175/6193/6163 6176/6191/6161 +f 6175/6193/6163 6163/6183/6153 6177/6192/6162 +f 6178/6195/6165 6175/6193/6163 6121/6139/6109 +f 6175/6193/6163 6178/6195/6165 6179/6194/6164 +f 6120/6137/6107 6180/6197/6167 6178/6195/6165 +f 6119/6196/6166 6181/6198/6168 6180/6197/6167 +f 6181/6198/6168 6182/6200/6170 6183/6199/6169 +f 6180/6197/6167 6183/6199/6169 6179/6194/6164 +f 6185/6203/6173 6182/6200/6170 6184/6201/6171 +f 6184/6201/6171 6181/6198/6168 6186/6202/6172 +f 6134/6153/6123 6184/6201/6171 6131/6148/6118 +f 6184/6201/6171 6134/6153/6123 6138/6164/6134 +f 6188/6205/6175 6189/6207/6177 6190/6206/6176 +f 6182/6200/6170 6185/6203/6173 6189/6207/6177 +f 6185/6203/6173 6138/6164/6134 6148/6163/6133 +f 6189/6207/6177 6148/6163/6133 6147/6173/6143 +f 6192/6209/6179 6179/6194/6164 6191/6208/6178 +f 6191/6208/6178 6183/6199/6169 6188/6205/6175 +f 6193/6210/6180 6191/6208/6178 6187/6204/6174 +f 6194/6212/6182 6192/6209/6179 6193/6210/6180 +f 6173/6189/6159 6160/6177/6147 6195/6211/6181 +f 6195/6211/6181 6176/6191/6161 6192/6209/6179 +f 6196/6213/6183 6195/6211/6181 6194/6212/6182 +f 6174/6190/6160 6173/6189/6159 6196/6213/6183 +f 6198/6216/6186 6169/6185/6155 6197/6214/6184 +f 6197/6214/6184 6172/6187/6157 6199/6215/6185 +f 4326/4339/4309 6197/6214/6184 4327/4343/4313 +f 4325/4337/4307 6198/6216/6186 4326/4339/4309 +f 6199/6215/6185 6174/6190/6160 6200/6217/6187 +f 6200/6217/6187 6196/6213/6183 6201/6218/6188 +f 4332/4345/4315 6200/6217/6187 4333/4349/4319 +f 4327/4343/4313 6199/6215/6185 4332/4345/4315 +f 6201/6218/6188 6194/6212/6182 6202/6219/6189 +f 6202/6219/6189 6193/6210/6180 6203/6220/6190 +f 4338/4351/4321 6202/6219/6189 4339/4354/4324 +f 4333/4349/4319 6201/6218/6188 4338/4351/4321 +f 6203/6220/6190 6187/6204/6174 6204/6221/6191 +f 6204/6221/6191 6190/6206/6176 6158/6176/6146 +f 4342/4355/4325 6204/6221/6191 4316/4329/4299 +f 4339/4354/4324 6203/6220/6190 4342/4355/4325 +f 6132/6149/6119 6131/6148/6118 6206/6223/6193 +f 6207/6224/6194 6208/6225/6195 6206/6223/6193 +f 6127/6144/6114 6206/6223/6193 6128/6145/6115 +f 6126/6143/6113 6132/6149/6119 6127/6144/6114 +f 6186/6202/6172 6119/6196/6166 6209/6226/6196 +f 6117/6135/6105 6210/6227/6197 6209/6226/6196 +f 6210/6227/6197 6207/6224/6194 6205/6222/6192 +f 6131/6148/6118 6186/6202/6172 6205/6222/6192 +f 6212/6229/6199 6113/6132/6102 6211/6228/6198 +f 6211/6228/6198 6116/6138/6108 6177/6192/6162 +f 6213/6230/6200 6211/6228/6198 6168/6184/6154 +f 6214/6231/6201 6212/6229/6199 6213/6230/6200 +f 6216/6234/6204 6214/6231/6201 6215/6232/6202 +f 6215/6232/6202 6213/6230/6200 6167/6182/6152 +f 6217/6235/6205 6215/6232/6202 6166/6233/6203 +f 6218/6245/6215 6216/6234/6204 6217/6235/6205 +f 6222/6239/6209 6219/6236/6206 6221/6238/6208 +f 6221/6238/6208 6220/6237/6207 6165/6181/6151 +f 6170/6186/6156 6221/6238/6208 6164/6180/6150 +f 6221/6238/6208 6170/6186/6156 6169/6185/6155 +f 6223/6240/6210 6224/6241/6211 4348/4361/4331 +f 6224/6241/6211 6223/6240/6210 6222/6239/6209 +f 6222/6239/6209 6169/6185/6155 6198/6216/6186 +f 6224/6241/6211 6198/6216/6186 4325/4337/4307 +f 6226/6243/6213 6227/6246/6216 6228/6244/6214 +f 6227/6246/6216 6226/6243/6213 6217/6235/6205 +f 6217/6235/6205 6166/6233/6203 6220/6237/6207 +f 6219/6236/6206 6228/6244/6214 6220/6237/6207 +f 6156/6172/6142 6229/6248/6218 6230/6247/6217 +f 6141/6157/6127 6139/6155/6125 6229/6248/6218 +f 6139/6155/6125 6122/6140/6110 6231/6249/6219 +f 6229/6248/6218 6231/6249/6219 6232/6250/6220 +f 6125/6146/6116 6130/6147/6117 6234/6252/6222 +f 6235/6253/6223 6236/6254/6224 6234/6252/6222 +f 6231/6249/6219 6234/6252/6222 6232/6250/6220 +f 6122/6140/6110 6125/6146/6116 6231/6249/6219 +f 6237/6255/6225 6238/6257/6227 6236/6254/6224 +f 6239/6256/6226 6240/6258/6228 6238/6257/6227 +f 6240/6258/6228 6241/8512/9073 6242/6259/6229 +f 6238/6257/6227 6242/6259/6229 6232/6250/6220 +f 6244/6262/6232 4355/4367/4337 6243/6260/6230 +f 6243/6260/6230 4363/4375/4345 6245/6261/6231 +f 6242/6259/6229 6243/6260/6230 6232/6250/6220 +f 6241/8512/9073 6244/6262/6232 6242/6259/6229 +f 4368/4380/4350 6246/6265/6235 6247/6263/6233 +f 4318/6264/6234 6159/6175/6145 6246/6265/6235 +f 6159/6175/6145 6145/6160/6130 6152/6168/6138 +f 6246/6265/6235 6152/6168/6138 6151/6167/6137 +f 6249/6267/6237 4375/4389/4359 6248/6266/6236 +f 6248/6266/6236 4374/4386/4356 6247/6263/6233 +f 6247/6263/6233 6151/6167/6137 6154/6170/6140 +f 6153/6169/6139 6249/6267/6237 6154/6170/6140 +f 6245/6261/6231 4362/4374/4344 6250/6268/6238 +f 6250/6268/6238 4378/4390/4360 6249/6267/6237 +f 6230/6247/6217 6250/6268/6238 6153/6169/6139 +f 6232/6250/6220 6245/6261/6231 6230/6247/6217 +f 6252/6270/6240 6253/6274/6244 6254/6271/6241 +f 6253/6274/6244 6252/6270/6240 6256/6273/6243 +f 6258/6276/6246 6253/6274/6244 6257/6275/6245 +f 6259/6326/6296 6254/6271/6241 6258/6276/6246 +f 6261/6278/6248 6262/6281/6251 6263/6279/6249 +f 6264/6280/6250 6265/6282/6252 6262/6281/6251 +f 6267/6390/6360 6262/6281/6251 6266/6283/6253 +f 6262/6281/6251 6267/6390/6360 6268/6284/6254 +f 6270/6286/6256 6271/6288/6258 6272/6287/6257 +f 6264/6280/6250 6273/6289/6259 6271/6288/6258 +f 6273/6289/6259 6274/6337/6307 6275/6290/6260 +f 6271/6288/6258 6275/6290/6260 6276/6291/6261 +f 6277/6292/6262 6278/6294/6264 6270/6286/6256 +f 6279/6293/6263 6280/6295/6265 6278/6294/6264 +f 6265/6282/6252 6278/6294/6264 6266/6283/6253 +f 6264/6280/6250 6270/6286/6256 6265/6282/6252 +f 6284/6301/6271 6281/6296/6266 6283/6298/6268 +f 6285/6299/6269 6286/6300/6270 6283/6298/6268 +f 6272/6287/6257 6283/6298/6268 6269/6285/6255 +f 6276/6291/6261 6284/6301/6271 6272/6287/6257 +f 6287/6302/6272 6288/6304/6274 6286/6300/6270 +f 6289/6303/6273 6290/6305/6275 6288/6304/6274 +f 6290/6305/6275 6279/6293/6263 6277/6292/6262 +f 6288/6304/6274 6277/6292/6262 6269/6285/6255 +f 6291/6306/6276 6292/6309/6279 6290/6305/6275 +f 6292/6309/6279 6291/6306/6276 6294/6308/6278 +f 6279/6293/6263 6290/6305/6275 6294/6308/6278 +f 6295/6310/6280 6296/6311/6281 5076/5091/5062 +f 6296/6311/6281 6295/6310/6280 6282/6297/6267 +f 6282/6297/6267 6281/6296/6266 6297/6312/6282 +f 6296/6311/6281 6297/6312/6282 5073/5085/5056 +f 6301/6319/6289 6298/6313/6283 6300/6315/6285 +f 6300/6315/6285 6299/6314/6284 6303/6317/6287 +f 6303/6317/6287 6304/6320/6290 6305/6318/6288 +f 6306/6329/6299 6301/6319/6289 6305/6318/6288 +f 6308/6324/6294 6304/6320/6290 6307/6321/6291 +f 6307/6321/6291 6303/6317/6287 6309/6322/6292 +f 6311/6325/6295 6307/6321/6291 6310/6323/6293 +f 6312/6351/6321 6308/6324/6294 6311/6325/6295 +f 6315/6330/6300 6259/6326/6296 6314/6328/6298 +f 6306/6329/6299 6305/6318/6288 6314/6328/6298 +f 6316/6331/6301 6314/6328/6298 6304/6320/6290 +f 6317/6336/6306 6315/6330/6300 6316/6331/6301 +f 6319/6333/6303 6320/6335/6305 6321/6334/6304 +f 6251/6269/6239 6254/6271/6241 6320/6335/6305 +f 6254/6271/6241 6259/6326/6296 6315/6330/6300 +f 6320/6335/6305 6315/6330/6300 6317/6336/6306 +f 6275/6290/6260 6274/6337/6307 6323/6339/6309 +f 6323/6339/6309 6322/6338/6308 6319/6333/6303 +f 6324/6340/6310 6323/6339/6309 6318/6332/6302 +f 6276/6291/6261 6275/6290/6260 6324/6340/6310 +f 6284/6301/6271 6276/6291/6261 6325/6341/6311 +f 6325/6341/6311 6324/6340/6310 6326/6342/6312 +f 6328/6344/6314 6325/6341/6311 6327/6343/6313 +f 6281/6296/6266 6284/6301/6271 6328/6344/6314 +f 6326/6342/6312 6329/6346/6316 6330/6345/6315 +f 6318/6332/6302 6321/6334/6304 6329/6346/6316 +f 6321/6334/6304 6317/6336/6306 6331/6347/6317 +f 6329/6346/6316 6331/6347/6317 6332/6348/6318 +f 6331/6347/6317 6333/6350/6320 6334/6349/6319 +f 6317/6336/6306 6316/6331/6301 6333/6350/6320 +f 6316/6331/6301 6304/6320/6290 6308/6324/6294 +f 6333/6350/6320 6308/6324/6294 6312/6351/6321 +f 6335/6352/6322 6336/6353/6323 5085/5095/5066 +f 6312/6351/6321 6311/6325/6295 6336/6353/6323 +f 6311/6325/6295 6310/6323/6293 6337/6354/6324 +f 6336/6353/6323 6337/6354/6324 5082/5093/5064 +f 6338/6355/6325 6339/6356/6326 5092/5101/5072 +f 6332/6348/6318 6334/6349/6319 6339/6356/6326 +f 6334/6349/6319 6312/6351/6321 6335/6352/6322 +f 6339/6356/6326 6335/6352/6322 5090/5100/5071 +f 6340/6357/6327 6341/6358/6328 5098/5107/5078 +f 6327/6343/6313 6330/6345/6315 6341/6358/6328 +f 6330/6345/6315 6332/6348/6318 6338/6355/6325 +f 6341/6358/6328 6338/6355/6325 5096/5106/5077 +f 6297/6312/6282 6342/6359/6329 5104/5116/5087 +f 6281/6296/6266 6328/6344/6314 6342/6359/6329 +f 6328/6344/6314 6327/6343/6313 6340/6357/6327 +f 6342/6359/6329 6340/6357/6327 5102/5112/5083 +f 6343/6360/6330 6344/6362/6332 6261/6278/6248 +f 6345/6361/6331 6346/6363/6333 6344/6362/6332 +f 6273/6289/6259 6344/6362/6332 6274/6337/6307 +f 6264/6280/6250 6261/6278/6248 6273/6289/6259 +f 6346/6363/6333 6345/6361/6331 6348/6365/6335 +f 6348/6365/6335 6347/6364/6334 6252/6270/6240 +f 6322/6338/6308 6348/6365/6335 6251/6269/6239 +f 6274/6337/6307 6346/6363/6333 6322/6338/6308 +f 6313/6327/6297 6349/6367/6337 6350/6366/6336 +f 6259/6326/6296 6258/6276/6246 6349/6367/6337 +f 6258/6276/6246 6257/6275/6245 6351/6368/6338 +f 6352/6371/6341 6350/6366/6336 6351/6368/6338 +f 6301/6319/6289 6353/6370/6340 6354/6369/6339 +f 6306/6329/6299 6350/6366/6336 6353/6370/6340 +f 6355/6372/6342 6353/6370/6340 6352/6371/6341 +f 6356/6380/6350 6354/6369/6339 6355/6372/6342 +f 6299/6314/6284 6357/6373/6343 6309/6322/6292 +f 6298/6313/6283 6358/6374/6344 6357/6373/6343 +f 6358/6374/6344 6359/6377/6347 6360/6375/6345 +f 6310/6323/6293 6309/6322/6292 6360/6375/6345 +f 6337/6354/6324 6310/6323/6293 6361/6376/6346 +f 6359/6377/6347 6362/6378/6348 6361/6376/6346 +f 6362/6378/6348 5106/5117/5088 5109/5119/5090 +f 5082/5093/5064 6337/6354/6324 5109/5119/5090 +f 6358/6374/6344 6298/6313/6283 6363/6379/6349 +f 6356/6380/6350 6364/6381/6351 6363/6379/6349 +f 6366/8566/9074 6363/6379/6349 6365/6382/6352 +f 6363/6379/6349 6366/8566/9074 6359/6377/6347 +f 6280/6295/6265 6367/6384/6354 6368/6383/6353 +f 6367/6384/6354 6280/6295/6265 6294/6308/6278 +f 6369/6404/6374 6367/6384/6354 6293/6307/6277 +f 6367/6384/6354 6369/6404/6374 6370/6385/6355 +f 6368/6383/6353 6370/6385/6355 6372/6387/6357 +f 6372/6387/6357 6371/6386/6356 6374/6389/6359 +f 6374/6389/6359 6268/6284/6254 6267/6390/6360 +f 6372/6387/6357 6267/6390/6360 6266/6283/6253 +f 6376/6392/6362 6377/6396/6366 6378/6393/6363 +f 6377/6396/6366 6376/6392/6362 6380/6395/6365 +f 6371/6386/6356 6377/6396/6366 6373/6388/6358 +f 6370/6385/6355 6378/6393/6363 6371/6386/6356 +f 6378/6393/6363 6370/6385/6355 6382/6398/6368 +f 6382/6398/6368 6381/6397/6367 5124/5132/5103 +f 5124/5132/5103 6383/5123/9075 6384/6399/6369 +f 6382/6398/6368 6384/6399/6369 6375/6391/6361 +f 6287/6302/6272 6285/6299/6269 6385/6400/6370 +f 6385/6400/6370 6295/6310/6280 5128/5137/5108 +f 6386/6401/6371 6385/6400/6370 5132/5141/5112 +f 6289/6303/6273 6287/6302/6272 6386/6401/6371 +f 6386/6401/6371 6387/6402/6372 6291/6306/6276 +f 5132/5141/5112 5134/5142/5113 6387/6402/6372 +f 5134/5142/5113 5138/5147/5118 6388/6403/6373 +f 6387/6402/6372 6388/6403/6373 6293/6307/6277 +f 6388/6403/6373 6389/6405/6375 6369/6404/6374 +f 5138/5147/5118 5140/5148/5119 6389/6405/6375 +f 5140/5148/5119 5121/5130/5101 6381/6397/6367 +f 6370/6385/6355 6369/6404/6374 6381/6397/6367 +f 6393/6412/6382 6390/6406/6376 6392/6408/6378 +f 6394/6409/6379 6395/6410/6380 6392/6408/6378 +f 6395/6410/6380 6396/6578/9076 6397/6411/6381 +f 6392/6408/6378 6397/6411/6381 6398/6413/6383 +f 6402/6418/6388 6399/6414/6384 6401/6416/6386 +f 6401/6416/6386 6400/6415/6385 6391/6407/6377 +f 6403/6417/6387 6401/6416/6386 6391/6407/6377 +f 6404/6476/6446 6402/6418/6388 6403/6417/6387 +f 6405/6419/6389 6406/6422/6392 6395/6410/6380 +f 6406/6422/6392 6405/6419/6389 6408/6421/6391 +f 6408/6421/6391 6409/6425/6395 6410/6423/6393 +f 6396/6578/9076 6395/6410/6380 6410/6423/6393 +f 6411/6424/6394 6412/6426/6396 1862/1885/1854 +f 6409/6425/6395 6408/6421/6391 6412/6426/6396 +f 6413/6427/6397 6412/6426/6396 6407/6420/6390 +f 1863/1886/1855 1862/1885/1854 6413/6427/6397 +f 6415/6429/6399 6416/6432/6402 6417/6430/6400 +f 6418/6431/6401 6419/6433/6403 6416/6432/6402 +f 6421/6468/6438 6416/6432/6402 6420/6434/6404 +f 6416/6432/6402 6421/6468/6438 6422/6435/6405 +f 6424/6438/6408 1931/1969/1938 6423/6436/6406 +f 1863/1886/1855 6413/6427/6397 6423/6436/6406 +f 6413/6427/6397 6407/6420/6390 6425/6437/6407 +f 6426/6439/6409 6424/6438/6408 6425/6437/6407 +f 6425/6437/6407 6427/6441/6411 6428/6440/6410 +f 6407/6420/6390 6405/6419/6389 6427/6441/6411 +f 6400/6415/6385 6427/6441/6411 6394/6409/6379 +f 6399/6414/6384 6428/6440/6410 6400/6415/6385 +f 6430/6443/6413 1950/1974/1943 6429/6442/6412 +f 6429/6442/6412 1949/1971/1940 6424/6438/6408 +f 6431/6444/6414 6429/6442/6412 6426/6439/6409 +f 6414/6428/6398 6430/6443/6413 6431/6444/6414 +f 6431/6444/6414 6432/6445/6415 6415/6429/6399 +f 6426/6439/6409 6428/6440/6410 6432/6445/6415 +f 6433/6446/6416 6432/6445/6415 6399/6414/6384 +f 6418/6431/6401 6415/6429/6399 6433/6446/6416 +f 6430/6443/6413 6434/6447/6417 1954/1976/1945 +f 6414/6428/6398 6417/6430/6400 6434/6447/6417 +f 6417/6430/6400 6422/6435/6405 6435/6448/6418 +f 6434/6447/6417 6435/6448/6418 1955/2017/1986 +f 6439/6454/6424 6436/6449/6419 6438/6451/6421 +f 6438/6451/6421 6437/6450/6420 6440/6452/6422 +f 6442/6455/6425 6438/6451/6421 6441/6453/6423 +f 6443/6472/6442 6439/6454/6424 6442/6455/6425 +f 6445/6457/6427 6446/6459/6429 6447/6458/6428 +f 6436/6449/6419 6448/6460/6430 6446/6459/6429 +f 6448/6460/6430 6449/6470/6440 6450/6461/6431 +f 6446/6459/6429 6450/6461/6431 6451/6462/6432 +f 6452/6463/6433 6453/6464/6434 1998/2022/1991 +f 6444/6456/6426 6447/6458/6428 6453/6464/6434 +f 6447/6458/6428 6451/6462/6432 6454/6465/6435 +f 6453/6464/6434 6454/6465/6435 2000/2024/1993 +f 6435/6448/6418 6455/6466/6436 1995/2019/1988 +f 6422/6435/6405 6456/6467/6437 6455/6466/6436 +f 6456/6467/6437 6444/6456/6426 6452/6463/6433 +f 6455/6466/6436 6452/6463/6433 1996/2021/1990 +f 6421/6468/6438 6457/6469/6439 6456/6467/6437 +f 6457/6469/6439 6421/6468/6438 6437/6450/6420 +f 6445/6457/6427 6457/6469/6439 6436/6449/6419 +f 6457/6469/6439 6445/6457/6427 6444/6456/6426 +f 6459/6473/6443 6449/6470/6440 6458/6471/6441 +f 6458/6471/6441 6448/6460/6430 6439/6454/6424 +f 6460/6474/6444 6458/6471/6441 6443/6472/6442 +f 6461/6548/6518 6459/6473/6443 6460/6474/6444 +f 6463/6477/6447 6418/6431/6401 6462/6475/6445 +f 6462/6475/6445 6433/6446/6416 6402/6418/6388 +f 6464/6478/6448 6462/6475/6445 6404/6476/6446 +f 6465/6480/6450 6463/6477/6447 6464/6478/6448 +f 6440/6452/6422 6420/6434/6404 6466/6479/6449 +f 6466/6479/6449 6419/6433/6403 6463/6477/6447 +f 6467/6481/6451 6466/6479/6449 6465/6480/6450 +f 6441/6453/6423 6440/6452/6422 6467/6481/6451 +f 6469/6483/6453 6470/6487/6457 6471/6484/6454 +f 6470/6487/6457 6469/6483/6453 6473/6486/6456 +f 6473/6486/6456 6474/6490/6460 6475/6488/6458 +f 6470/6487/6457 6475/6488/6458 6476/6489/6459 +f 6473/6486/6456 6477/6492/6462 6478/6491/6461 +f 6472/6485/6455 6479/6493/6463 6477/6492/6462 +f 6479/6493/6463 6480/6517/6487 6481/6494/6464 +f 6477/6492/6462 6481/6494/6464 6482/6495/6465 +f 6484/6497/6467 6485/6500/6470 6486/6498/6468 +f 6487/6499/6469 6488/6501/6471 6485/6500/6470 +f 6488/6501/6471 6472/6485/6455 6469/6483/6453 +f 6485/6500/6470 6469/6483/6453 6468/6482/6452 +f 6490/6504/6474 6487/6499/6469 6489/6502/6472 +f 6483/6496/6466 6491/6503/6473 6489/6502/6472 +f 6491/6503/6473 2121/2141/2110 2118/2139/2108 +f 6489/6502/6472 2118/2139/2108 2117/2138/2107 +f 6493/6506/6476 6494/6510/6480 6495/6507/6477 +f 6494/6510/6480 6493/6506/6476 6497/6509/6479 +f 6497/6509/6479 6498/6521/6491 6499/6511/6481 +f 6500/6525/6495 6495/6507/6477 6499/6511/6481 +f 6490/6504/6474 6501/6513/6483 6502/6512/6482 +f 2117/2138/2107 2182/2204/2173 6501/6513/6483 +f 2182/2204/2173 2181/2203/2172 6503/6514/6484 +f 6501/6513/6483 6503/6514/6484 6504/6515/6485 +f 6479/6493/6463 6472/6485/6455 6505/6516/6486 +f 6505/6516/6486 6488/6501/6471 6502/6512/6482 +f 6506/6522/6492 6505/6516/6486 6504/6515/6485 +f 6505/6516/6486 6506/6522/6492 6480/6517/6487 +f 6503/6514/6484 6507/6519/6489 6508/6518/6488 +f 2181/2203/2172 2202/2224/2193 6507/6519/6489 +f 2202/2224/2193 2201/2223/2192 6509/6520/6490 +f 6507/6519/6489 6509/6520/6490 6498/6521/6491 +f 6506/6522/6492 6510/6524/6494 6511/6523/6493 +f 6510/6524/6494 6506/6522/6492 6508/6518/6488 +f 6497/6509/6479 6510/6524/6494 6498/6521/6491 +f 6496/6508/6478 6511/6523/6493 6497/6509/6479 +f 6513/6527/6497 6500/6525/6495 6512/6526/6496 +f 6512/6526/6496 6499/6511/6481 6509/6520/6490 +f 2206/2228/2197 6512/6526/6496 2201/2223/2192 +f 2205/2227/2196 6513/6527/6497 2206/2228/2197 +f 6515/6529/6499 6516/6531/6501 6517/6530/6500 +f 6492/6505/6475 6518/6532/6502 6516/6531/6501 +f 6518/6532/6502 6519/6536/6506 6520/6533/6503 +f 6516/6531/6501 6520/6533/6503 6521/6534/6504 +f 6522/6535/6505 6523/6538/6508 6450/6461/6431 +f 6523/6538/6508 6522/6535/6505 6524/6537/6507 +f 6524/6537/6507 6525/6540/6510 6526/6539/6509 +f 6523/6538/6508 6526/6539/6509 6451/6462/6432 +f 6526/6539/6509 6527/6542/6512 6454/6465/6435 +f 6527/6542/6512 6526/6539/6509 6528/6541/6511 +f 6528/6541/6511 2241/2262/2231 2247/2267/2236 +f 6527/6542/6512 2247/2267/2236 2000/2024/1993 +f 6528/6541/6511 6525/6540/6510 6530/6544/6514 +f 6530/6544/6514 6529/6543/6513 6513/6527/6497 +f 6513/6527/6497 2205/2227/2196 2242/2263/2232 +f 6530/6544/6514 2242/2263/2232 2241/2262/2231 +f 6518/6532/6502 6531/6545/6515 6524/6537/6507 +f 6531/6545/6515 6518/6532/6502 6495/6507/6477 +f 6529/6543/6513 6531/6545/6515 6500/6525/6495 +f 6531/6545/6515 6529/6543/6513 6525/6540/6510 +f 6520/6533/6503 6532/6547/6517 6533/6546/6516 +f 6519/6536/6506 6522/6535/6505 6532/6547/6517 +f 6459/6473/6443 6532/6547/6517 6449/6470/6440 +f 6532/6547/6517 6459/6473/6443 6461/6548/6518 +f 6481/6494/6464 6534/6550/6520 6535/6549/6519 +f 6480/6517/6487 6511/6523/6493 6534/6550/6520 +f 6511/6523/6493 6496/6508/6478 6536/6551/6521 +f 6534/6550/6520 6536/6551/6521 6537/6552/6522 +f 6536/6551/6521 6538/6554/6524 6539/6553/6523 +f 6496/6508/6478 6493/6506/6476 6538/6554/6524 +f 6493/6506/6476 6492/6505/6475 6515/6529/6499 +f 6538/6554/6524 6515/6529/6499 6514/6528/6498 +f 6543/6561/6531 6540/6555/6525 6542/6557/6527 +f 6542/6557/6527 6541/6556/6526 6545/6559/6529 +f 6547/6562/6532 6542/6557/6527 6546/6560/6530 +f 6548/6563/6533 6543/6561/6531 6547/6562/6532 +f 6547/6562/6532 6549/6565/6535 6550/6564/6534 +f 6546/6560/6530 6551/6566/6536 6549/6565/6535 +f 6553/6568/6538 6549/6565/6535 6552/6567/6537 +f 6554/7433/9077 6550/6564/6534 6553/6568/6538 +f 6555/6569/6539 6556/6571/6541 6551/6566/6536 +f 6557/6570/6540 6558/6572/6542 6556/6571/6541 +f 6558/6572/6542 6559/6626/6599 6560/6573/6543 +f 6552/6567/6537 6551/6566/6536 6560/6573/6543 +f 6561/6574/6544 6562/6576/6546 6545/6559/6529 +f 6563/6575/6545 6564/6577/6547 6562/6576/6546 +f 6564/6577/6547 6557/6570/6540 6555/6569/6539 +f 6562/6576/6546 6555/6569/6539 6546/6560/6530 +f 6566/6423/6549 6567/6580/6551 6568/6579/6550 +f 6409/6425/6395 6569/6581/6552 6567/6580/6551 +f 6571/6583/6554 6567/6580/6551 6570/6582/6553 +f 6572/6608/6581 6568/6579/6550 6571/6583/6554 +f 6573/6584/6555 6574/6585/6556 4642/4652/4622 +f 6570/6582/6553 6569/6581/6552 6574/6585/6556 +f 6569/6581/6552 6409/6425/6395 6411/6424/6394 +f 6574/6585/6556 6411/6424/6394 4645/1884/4624 +f 6578/6591/6562 6575/6586/6557 6577/6588/6559 +f 6577/6588/6559 6576/6587/6558 6580/6590/6561 +f 4650/4659/4630 6577/6588/6559 4646/4655/4626 +f 4621/4629/4599 6578/6591/6562 4650/4659/4630 +f 6584/6597/6568 6581/6592/6563 6583/6594/6565 +f 6583/6594/6565 6582/6593/6564 6586/6596/6567 +f 6541/6556/6526 6583/6594/6565 6544/6558/6528 +f 6583/6594/6565 6541/6556/6526 6584/6597/6568 +f 6561/6574/6544 6544/6558/6528 6587/6598/6569 +f 6587/6598/6569 6586/6596/6567 6588/6599/6570 +f 6589/6600/6571 6587/6598/6569 6575/6586/6557 +f 6563/6575/6545 6561/6574/6544 6589/6600/6571 +f 6591/6604/6575 6585/6595/6566 6590/6601/6572 +f 6590/6601/6572 6582/6593/6564 6592/6602/6573 +f 6594/6605/6576 6590/6601/6572 6593/6603/6574 +f 6595/6611/6584 6591/6604/6575 6594/6605/6576 +f 6597/6411/6578 6598/6607/6580 6599/6606/6579 +f 6598/6607/6580 6597/6411/6578 6568/6579/6550 +f 6600/6609/6582 6598/6607/6580 6572/6608/6581 +f 6601/6614/6587 6599/6606/6579 6600/6609/6582 +f 6602/6610/6583 6603/6612/6585 6600/6609/6582 +f 6595/6611/6584 6594/6605/6576 6603/6612/6585 +f 6594/6605/6576 6593/6603/6574 6604/6613/6586 +f 6603/6612/6585 6604/6613/6586 6601/6614/6587 +f 6591/6604/6575 6605/6615/6588 6588/6599/6570 +f 6595/6611/6584 6606/6616/6589 6605/6615/6588 +f 6576/6587/6558 6605/6615/6588 6579/6589/6560 +f 6575/6586/6557 6588/6599/6570 6576/6587/6558 +f 6607/6617/6590 6608/6618/6591 6571/6583/6554 +f 6579/6589/6560 6606/6616/6589 6608/6618/6591 +f 6606/6616/6589 6595/6611/6584 6602/6610/6583 +f 6608/6618/6591 6602/6610/6583 6572/6608/6581 +f 6580/6590/6561 6579/6589/6560 6609/6619/6592 +f 6609/6619/6592 6607/6617/6590 6573/6584/6555 +f 4647/4656/4627 6609/6619/6592 4641/4651/4621 +f 4646/4655/4626 6580/6590/6561 4647/4656/4627 +f 6611/6621/6594 6563/6575/6545 6610/6620/6593 +f 6610/6620/6593 6589/6600/6571 6578/6591/6562 +f 4624/4631/4601 6610/6620/6593 4621/4629/4599 +f 4620/4635/4605 6611/6621/6594 4624/4631/4601 +f 6611/6621/6594 4620/4635/4605 6612/6622/6595 +f 6612/6622/6595 4619/4628/4598 6613/6623/6596 +f 6564/6577/6547 6612/6622/6595 6557/6570/6540 +f 6563/6575/6545 6611/6621/6594 6564/6577/6547 +f 6613/6623/6596 4616/4626/4596 6614/6624/6597 +f 6614/6624/6597 4615/4623/4593 6615/6625/6598 +f 6558/6572/6542 6614/6624/6597 6559/6626/6599 +f 6557/6570/6540 6613/6623/6596 6558/6572/6542 +f 6617/6628/6601 6618/6631/6604 6619/6629/6602 +f 6620/6630/6603 6621/6632/6605 6618/6631/6604 +f 6621/6632/6605 6622/6663/6638 6623/6633/6606 +f 6618/6631/6604 6623/6633/6606 6624/6634/6607 +f 6625/6635/6608 6626/6636/6609 6553/6568/6538 +f 6626/6636/6609 6625/6635/6608 6619/6629/6602 +f 6619/6629/6602 6624/6634/6607 6627/6637/6610 +f 6554/7433/9077 6553/6568/6538 6627/6637/6610 +f 6628/6638/6611 6629/6641/6614 6560/6573/6543 +f 6629/6641/6614 6628/6638/6611 6631/6640/6613 +f 6625/6635/6608 6629/6641/6614 6616/6627/6600 +f 6552/6567/6537 6560/6573/6543 6625/6635/6608 +f 6631/6640/6613 6630/6639/6612 6633/6643/6616 +f 6633/6643/6616 6632/6642/6615 6635/6645/6618 +f 6617/6628/6601 6633/6643/6616 6620/6630/6603 +f 6616/6627/6600 6631/6640/6613 6617/6628/6601 +f 6637/6647/6620 6638/6649/6622 6639/6648/6621 +f 6483/6496/6466 6640/6498/6623 6638/6649/6622 +f 6642/6675/6650 6638/6649/6622 6641/6482/6624 +f 6638/6649/6622 6642/6675/6650 6643/6650/6625 +f 6637/6647/6620 6644/6651/6626 6491/6503/6473 +f 6636/6646/6619 6645/6652/6627 6644/6651/6626 +f 5393/5402/5373 6644/6651/6626 5394/5403/5374 +f 6644/6651/6626 5393/5402/5373 2121/2141/2110 +f 6646/6653/6628 6647/6656/6631 5401/5410/5381 +f 6647/6656/6631 6646/6653/6628 6649/6655/6630 +f 6649/6655/6630 6650/6664/6639 6651/6657/6632 +f 6647/6656/6631 6651/6657/6632 5376/5385/5356 +f 6652/6658/6633 6653/6660/6635 6621/6632/6605 +f 6654/6659/6634 6655/6661/6636 6653/6660/6635 +f 6655/6661/6636 6656/6671/6646 6657/6662/6637 +f 6653/6660/6635 6657/6662/6637 6622/6663/6638 +f 6660/6667/6642 6650/6664/6639 6659/6666/6641 +f 6659/6666/6641 6658/6665/6640 6652/6658/6633 +f 6635/6645/6618 6659/6666/6641 6620/6630/6603 +f 6634/6644/6617 6660/6667/6642 6635/6645/6618 +f 6662/6669/6644 6663/6672/6647 6664/6670/6645 +f 6656/6671/6646 6655/6661/6636 6663/6672/6647 +f 6655/6661/6636 6654/6659/6634 6665/6673/6648 +f 6663/6672/6647 6665/6673/6648 6666/6674/6649 +f 6642/6675/6650 6667/6677/6653 6668/6676/6651 +f 6667/6677/6653 6642/6675/6650 6669/6484/6652 +f 6669/6484/6652 6670/6489/9078 6671/6678/6654 +f 6667/6677/6653 6671/6678/6654 6672/6679/6655 +f 6674/6682/6658 6661/6668/6643 6673/6680/6656 +f 6673/6680/6656 6664/6670/6645 6675/6681/6657 +f 6668/6676/6651 6673/6680/6656 6643/6650/6625 +f 6672/6679/6655 6674/6682/6658 6668/6676/6651 +f 6649/6655/6630 6648/6654/6629 6677/6684/6660 +f 6677/6684/6660 6676/6683/6659 6665/6673/6648 +f 6658/6665/6640 6677/6684/6660 6654/6659/6634 +f 6650/6664/6639 6649/6655/6630 6658/6665/6640 +f 6675/6681/6657 6666/6674/6649 6678/6685/6661 +f 6678/6685/6661 6676/6683/6659 6679/6686/6662 +f 6639/6648/6621 6678/6685/6661 6636/6646/6619 +f 6643/6650/6625 6675/6681/6657 6639/6648/6621 +f 5397/5406/5377 5394/5403/5374 6680/6687/6663 +f 6680/6687/6663 6645/6652/6627 6679/6686/6662 +f 6646/6653/6628 6680/6687/6663 6648/6654/6629 +f 6680/6687/6663 6646/6653/6628 5398/5408/5379 +f 6651/6657/6632 6681/6688/6664 5377/5386/5357 +f 6650/6664/6639 6660/6667/6642 6681/6688/6664 +f 6660/6667/6642 6634/6644/6617 6682/6689/6665 +f 6681/6688/6664 6682/6689/6665 5371/5380/5351 +f 6683/6690/6666 6684/6691/6667 6632/6642/6615 +f 5367/5376/5347 5369/5377/5348 6684/6691/6667 +f 5369/5377/5348 5371/5380/5351 6682/6689/6665 +f 6684/6691/6667 6682/6689/6665 6634/6644/6617 +f 6628/6638/6611 6559/6626/6599 6685/6692/6668 +f 6685/6692/6668 6615/6625/6598 5365/5375/5346 +f 6683/6690/6666 6685/6692/6668 5367/5376/5347 +f 6685/6692/6668 6683/6690/6666 6630/6639/6612 +f 6689/6699/6675 6686/6693/6669 6688/6695/6671 +f 6688/6695/6671 6687/6694/6670 6691/6697/6673 +f 6691/6697/6673 6692/6700/6676 6693/6698/6674 +f 6694/6706/6682 6689/6699/6675 6693/6698/6674 +f 6695/6701/6677 6696/6703/6679 6693/6698/6674 +f 6697/6702/6678 6698/6704/6680 6696/6703/6679 +f 6698/6704/6680 6699/6712/6688 6700/6705/6681 +f 6696/6703/6679 6700/6705/6681 6694/6706/6682 +f 6701/6707/6683 6702/6709/6685 6698/6704/6680 +f 6703/6708/6684 6704/6710/6686 6702/6709/6685 +f 6704/6710/6686 6705/6718/6694 6706/6711/6687 +f 6702/6709/6685 6706/6711/6687 6699/6712/6688 +f 6707/6713/6689 6708/6715/6691 6704/6710/6686 +f 6709/6714/6690 6710/6716/6692 6708/6715/6691 +f 6710/6716/6692 6711/6719/6695 6712/6717/6693 +f 6708/6715/6691 6712/6717/6693 6705/6718/6694 +f 6714/6723/6699 6711/6719/6695 6713/6720/6696 +f 6713/6720/6696 6710/6716/6692 6715/6721/6697 +f 6717/6724/6700 6713/6720/6696 6716/6722/6698 +f 6718/6725/6701 6714/6723/6699 6717/6724/6700 +f 6720/6729/6705 6718/6725/6701 6719/6726/6702 +f 6719/6726/6702 6717/6724/6700 6721/6727/6703 +f 6723/6730/6706 6719/6726/6702 6722/6728/6704 +f 6724/6813/6789 6720/6729/6705 6723/6730/6706 +f 6726/6732/6708 6727/6735/6711 6728/6733/6709 +f 6729/6734/6710 6730/6736/6712 6727/6735/6711 +f 6730/6736/6712 6724/6813/6789 6723/6730/6706 +f 6727/6735/6711 6723/6730/6706 6722/6728/6704 +f 6734/6742/6718 6731/6737/6713 6733/6739/6715 +f 6733/6739/6715 6732/6738/6714 6736/6741/6717 +f 6736/6741/6717 6729/6734/6710 6726/6732/6708 +f 6733/6739/6715 6726/6732/6708 6725/6731/6707 +f 6737/6743/6719 6738/6745/6721 6732/6738/6714 +f 6739/6744/6720 6740/6746/6722 6738/6745/6721 +f 6740/6746/6722 6741/6765/6741 6742/6747/6723 +f 6738/6745/6721 6742/6747/6723 6735/6740/6716 +f 6746/6754/6730 6743/6748/6724 6745/6750/6726 +f 6745/6750/6726 6744/6749/6725 6748/6752/6728 +f 6750/6755/6731 6745/6750/6726 6749/6753/6729 +f 6751/6767/6743 6746/6754/6730 6750/6755/6731 +f 6755/6761/6737 6752/6756/6732 6754/6758/6734 +f 6754/6758/6734 6753/6757/6733 6757/6760/6736 +f 6744/6749/6725 6754/6758/6734 6747/6751/6727 +f 6743/6748/6724 6755/6761/6737 6744/6749/6725 +f 6758/6762/6738 6759/6763/6739 6740/6746/6722 +f 6756/6759/6735 6753/6757/6733 6759/6763/6739 +f 6753/6757/6733 6752/6756/6732 6760/6764/6740 +f 6759/6763/6739 6760/6764/6740 6741/6765/6741 +f 6761/6766/6742 6762/6768/6744 6687/6694/6670 +f 6751/6767/6743 6750/6755/6731 6762/6768/6744 +f 6750/6755/6731 6749/6753/6729 6763/6769/6745 +f 6762/6768/6744 6763/6769/6745 6690/6696/6672 +f 6706/6711/6687 6705/6718/6694 6765/6771/6747 +f 6765/6771/6747 6764/6770/6746 6767/6773/6749 +f 6769/6775/6751 6765/6771/6747 6768/6774/6750 +f 6699/6712/6688 6706/6711/6687 6769/6775/6751 +f 6767/6773/6749 6766/6772/6748 6771/6777/6753 +f 6771/6777/6753 6770/6776/6752 6773/6779/6755 +f 6773/6779/6755 6774/6861/6837 6775/6780/6756 +f 6768/6774/6750 6767/6773/6749 6775/6780/6756 +f 6777/6782/6758 6778/6784/6760 6779/6783/6759 +f 6772/6778/6754 6770/6776/6752 6778/6784/6760 +f 6770/6776/6752 6766/6772/6748 6780/6785/6761 +f 6778/6784/6760 6780/6785/6761 6781/6786/6762 +f 6712/6717/6693 6711/6719/6695 6783/6788/6764 +f 6783/6788/6764 6782/6787/6763 6780/6785/6761 +f 6764/6770/6746 6783/6788/6764 6766/6772/6748 +f 6705/6718/6694 6712/6717/6693 6764/6770/6746 +f 6784/6789/6765 6785/6791/6767 6714/6723/6699 +f 6786/6790/6766 6787/6792/6768 6785/6791/6767 +f 6787/6792/6768 6781/6786/6762 6782/6787/6763 +f 6711/6719/6695 6714/6723/6699 6782/6787/6763 +f 6788/6793/6769 6789/6795/6771 6787/6792/6768 +f 6790/6794/6770 6791/6796/6772 6789/6795/6771 +f 6791/6796/6772 6776/6781/6757 6779/6783/6759 +f 6781/6786/6762 6787/6792/6768 6779/6783/6759 +f 6791/6796/6772 6790/6794/6770 6793/6798/6774 +f 6793/6798/6774 6792/6797/6773 6795/6800/6776 +f 6797/6802/6778 6793/6798/6774 6796/6801/6777 +f 6776/6781/6757 6791/6796/6772 6797/6802/6778 +f 6799/6804/6780 6800/6806/6782 6801/6805/6781 +f 6794/6799/6775 6792/6797/6773 6800/6806/6782 +f 6792/6797/6773 6790/6794/6770 6788/6793/6769 +f 6800/6806/6782 6788/6793/6769 6786/6790/6766 +f 6803/6808/6784 6798/6803/6779 6802/6807/6783 +f 6802/6807/6783 6801/6805/6781 6784/6789/6765 +f 6720/6729/6705 6802/6807/6783 6718/6725/6701 +f 6724/6813/6789 6803/6808/6784 6720/6729/6705 +f 6804/6809/6785 6805/6811/6787 6730/6736/6712 +f 6806/6810/6786 6807/6812/6788 6805/6811/6787 +f 6807/6812/6788 6798/6803/6779 6803/6808/6784 +f 6805/6811/6787 6803/6808/6784 6724/6813/6789 +f 6809/6815/6791 6796/6801/6777 6808/6814/6790 +f 6808/6814/6790 6795/6800/6776 6799/6804/6780 +f 6807/6812/6788 6808/6814/6790 6798/6803/6779 +f 6806/6810/6786 6809/6815/6791 6807/6812/6788 +f 6811/6817/6793 6812/6820/6796 6813/6818/6794 +f 6814/6819/6795 6815/6821/6797 6812/6820/6796 +f 6809/6815/6791 6812/6820/6796 6796/6801/6777 +f 6812/6820/6796 6809/6815/6791 6806/6810/6786 +f 6816/6822/6798 6817/6823/6799 6736/6741/6717 +f 6810/6816/6792 6813/6818/6794 6817/6823/6799 +f 6813/6818/6794 6806/6810/6786 6804/6809/6785 +f 6817/6823/6799 6804/6809/6785 6729/6734/6710 +f 6700/6705/6681 6699/6712/6688 6818/6824/6800 +f 6818/6824/6800 6769/6775/6751 6819/6825/6801 +f 6821/6827/6803 6818/6824/6800 6820/6826/6802 +f 6694/6706/6682 6700/6705/6681 6821/6827/6803 +f 6821/6827/6803 6822/6828/6804 6689/6699/6675 +f 6820/6826/6802 6823/6829/6805 6822/6828/6804 +f 6825/6831/6807 6822/6828/6804 6824/6830/6806 +f 6822/6828/6804 6825/6831/6807 6689/6699/6675 +f 6761/6766/6742 6686/6693/6669 6826/6832/6808 +f 6826/6832/6808 6825/6831/6807 6827/6833/6809 +f 6829/6835/6811 6826/6832/6808 6828/6834/6810 +f 6751/6767/6743 6761/6766/6742 6829/6835/6811 +f 6833/6841/6817 6830/6836/6812 6832/6838/6814 +f 6832/6838/6814 6831/6837/6813 6835/6840/6816 +f 6835/6840/6816 6741/6765/6741 6760/6764/6740 +f 6832/6838/6814 6760/6764/6740 6752/6756/6732 +f 6839/6847/6823 6836/6842/6818 6838/6844/6820 +f 6838/6844/6820 6837/6843/6819 6841/6846/6822 +f 6831/6837/6813 6838/6844/6820 6834/6839/6815 +f 6830/6836/6812 6839/6847/6823 6831/6837/6813 +f 6842/6848/6824 6843/6850/6826 6844/6849/6825 +f 6840/6845/6821 6837/6843/6819 6843/6850/6826 +f 6836/6842/6818 6844/6849/6825 6837/6843/6819 +f 6841/6846/6822 6840/6845/6821 6846/6852/6828 +f 6846/6852/6828 6845/6851/6827 6811/6817/6793 +f 6847/6853/6829 6846/6852/6828 6810/6816/6792 +f 6834/6839/6815 6841/6846/6822 6847/6853/6829 +f 6835/6840/6816 6834/6839/6815 6848/6854/6830 +f 6848/6854/6830 6847/6853/6829 6816/6822/6798 +f 6816/6822/6798 6735/6740/6716 6742/6747/6723 +f 6848/6854/6830 6742/6747/6723 6741/6765/6741 +f 6845/6851/6827 6849/6856/6832 6850/6855/6831 +f 6849/6856/6832 6845/6851/6827 6842/6848/6824 +f 6776/6781/6757 6850/6855/6831 6842/6848/6824 +f 6777/6782/6758 6776/6781/6757 6851/6857/6833 +f 6836/6842/6818 6852/6858/6834 6851/6857/6833 +f 6772/6778/6754 6777/6782/6758 6852/6858/6834 +f 6852/6858/6834 6836/6842/6818 6854/6860/6836 +f 6774/6861/6837 6773/6779/6755 6854/6860/6836 +f 6854/6860/6836 6773/6779/6755 6772/6778/6754 +f 6855/6862/6838 6856/6865/6841 6853/6859/6835 +f 6856/6865/6841 6855/6862/6838 6858/6864/6840 +f 6856/6865/6841 6858/6864/6840 6774/6861/6837 +f 6862/6869/6845 6859/6866/6842 6861/6868/6844 +f 6861/6868/6844 6860/6867/6843 6855/6862/6838 +f 6839/6847/6823 6861/6868/6844 6836/6842/6818 +f 6830/6836/6812 6862/6869/6845 6839/6847/6823 +f 6862/6869/6845 6863/6871/6847 6864/6870/6846 +f 6830/6836/6812 6833/6841/6817 6863/6871/6847 +f 6833/6841/6817 6752/6756/6732 6755/6761/6737 +f 6863/6871/6847 6755/6761/6737 6743/6748/6724 +f 6868/6876/6852 6865/6872/6848 6867/6874/6850 +f 6857/6863/6839 6860/6867/6843 6867/6874/6850 +f 6860/6867/6843 6859/6866/6842 6869/6875/6851 +f 6867/6874/6850 6869/6875/6851 6828/6834/6810 +f 6869/6875/6851 6870/6877/6853 6829/6835/6811 +f 6859/6866/6842 6864/6870/6846 6870/6877/6853 +f 6864/6870/6846 6743/6748/6724 6746/6754/6730 +f 6870/6877/6853 6746/6754/6730 6751/6767/6743 +f 6827/6833/6809 6824/6830/6806 6872/6879/6855 +f 6872/6879/6855 6871/6878/6854 6874/6881/6857 +f 6874/6881/6857 6865/6872/6848 6868/6876/6852 +f 6828/6834/6810 6827/6833/6809 6868/6876/6852 +f 6866/6873/6849 6875/6883/6859 6858/6864/6840 +f 6875/6883/6859 6866/6873/6849 6876/6882/6858 +f 6875/6883/6859 6876/6882/6858 6774/6861/6837 +f 6877/6884/6860 6878/6887/6863 6823/6829/6805 +f 6878/6887/6863 6877/6884/6860 6880/6886/6862 +f 6880/6886/6862 6873/6880/6856 6871/6878/6854 +f 6824/6830/6806 6823/6829/6805 6871/6878/6854 +f 6876/6882/6858 6865/6872/6848 6881/6888/6864 +f 6881/6888/6864 6874/6881/6857 6880/6886/6862 +f 6882/6889/6865 6881/6888/6864 6879/6885/6861 +f 6774/6861/6837 6876/6882/6858 6882/6889/6865 +f 6882/6889/6865 6883/6890/6866 6775/6780/6756 +f 6879/6885/6861 6877/6884/6860 6883/6890/6866 +f 6877/6884/6860 6820/6826/6802 6819/6825/6801 +f 6883/6890/6866 6819/6825/6801 6768/6774/6750 +f 6797/6802/6778 6796/6801/6777 6884/6891/6867 +f 6884/6891/6867 6815/6821/6797 6850/6855/6831 +f 6776/6781/6757 6797/6802/6778 6850/6855/6831 +f 6888/6898/6874 6885/6892/6868 6887/6894/6870 +f 6889/6895/6871 6890/6896/6872 6887/6894/6870 +f 6892/6899/6875 6887/6894/6870 6891/6897/6873 +f 6893/6915/6897 6888/6898/6874 6892/6899/6875 +f 6897/6255/6881 6894/6253/6876 6896/6901/6878 +f 6896/6901/6878 6895/6900/6877 6898/6902/6879 +f 6900/6904/6882 6896/6901/6878 6899/6903/6880 +f 6901/6256/6966 6897/6255/6881 6900/6904/6882 +f 6905/6908/6889 6902/6224/6883 6904/6905/6885 +f 6906/6135/6886 6907/6906/6887 6904/6905/6885 +f 6909/6924/6907 6904/6905/6885 6908/6907/6888 +f 6904/6905/6885 6909/6924/6907 6910/6909/6890 +f 6905/6908/6889 6910/6909/6890 6912/6911/6892 +f 6913/6912/6893 6914/6913/6894 6912/6911/6892 +f 6914/6913/6894 6915/6145/9079 6916/6225/6895 +f 6902/6224/6883 6905/6908/6889 6916/6225/6895 +f 6917/6914/6896 6918/6917/6899 6914/6913/6894 +f 6918/6917/6899 6917/6914/6896 6919/6916/6898 +f 6921/6918/6901 6918/6917/6899 6920/6147/6900 +f 6915/6145/9079 6914/6913/6894 6921/6918/6901 +f 6925/6923/6906 6922/6919/6902 6924/6921/6904 +f 6924/6921/6904 6923/6920/6903 6911/6910/6891 +f 6911/6910/6891 6910/6909/6890 6926/6922/6905 +f 6927/8924/7061 6925/6923/6906 6926/6922/6905 +f 6909/6924/6907 6928/6926/6909 6926/6922/6905 +f 6928/6926/6909 6909/6924/6907 6929/6925/6908 +f 6931/6928/6911 6928/6926/6909 6930/6927/6910 +f 6927/8924/7061 6926/6922/6905 6931/6928/6911 +f 6933/6930/6913 6934/6933/6916 6935/6931/6914 +f 6936/6932/6915 6937/6934/6917 6934/6933/6916 +f 6939/6936/6919 6934/6933/6916 6938/6935/6918 +f 6940/7027/7019 6935/6931/6914 6939/6936/6919 +f 6944/6942/6925 6941/6937/6920 6943/6939/6922 +f 6945/6940/6923 6946/6941/6924 6943/6939/6922 +f 6947/6943/6926 6943/6939/6922 6932/6929/6912 +f 6948/7032/7024 6944/6942/6925 6947/6943/6926 +f 6952/6947/6930 6949/6944/6927 6951/6946/6929 +f 6951/6946/6929 6950/6945/6928 6942/6938/6921 +f 6953/6948/6931 6951/6946/6929 6941/6937/6920 +f 6954/6952/6935 6952/6947/6930 6953/6948/6931 +f 6958/6953/6936 6955/6949/6932 6957/6951/6934 +f 6957/6951/6934 6956/6950/6933 6952/6947/6930 +f 6959/6954/6937 6957/6951/6934 6954/6952/6935 +f 6960/6961/6946 6958/6953/6936 6959/6954/6937 +f 6907/6906/6887 6906/6135/6886 6962/6955/6939 +f 6962/6955/6939 6961/6133/6938 6964/6956/6941 +f 6966/6958/6943 6962/6955/6939 6965/6957/6942 +f 6908/6907/6888 6907/6906/6887 6966/6958/6943 +f 6969/6962/6947 6965/6957/6942 6968/6960/6945 +f 6968/6960/6945 6967/6959/6944 6958/6953/6936 +f 6970/6963/6948 6968/6960/6945 6960/6961/6946 +f 6971/6965/6950 6969/6962/6947 6970/6963/6948 +f 6929/6925/6908 6908/6907/6888 6972/6964/6949 +f 6972/6964/6949 6966/6958/6943 6969/6962/6947 +f 6973/6966/6951 6972/6964/6949 6971/6965/6950 +f 6930/6927/6910 6929/6925/6908 6973/6966/6951 +f 6964/6956/6941 6963/6132/6940 6975/6967/6953 +f 6976/6231/6954 6977/6968/6955 6975/6967/6953 +f 6967/6959/6944 6975/6967/6953 6955/6949/6932 +f 6965/6957/6942 6964/6956/6941 6967/6959/6944 +f 6977/6968/6955 6976/6231/6954 6979/6969/6957 +f 6979/6969/6957 6978/6234/6956 6981/6970/6959 +f 6981/6970/6959 6949/6944/6927 6956/6950/6933 +f 6955/6949/6932 6977/6968/6955 6956/6950/6933 +f 6982/6243/6960 6983/6971/6962 6981/6970/6959 +f 6984/6242/6961 6985/6972/6963 6983/6971/6962 +f 6985/6972/6963 6945/6940/6923 6950/6945/6928 +f 6983/6971/6962 6950/6945/6928 6949/6944/6927 +f 6946/6941/6924 6945/6940/6923 6986/6973/6964 +f 6986/6973/6964 6985/6972/6963 6987/6974/6965 +f 6987/6974/6965 6936/6932/6915 6933/6930/6913 +f 6932/6929/6912 6946/6941/6924 6933/6930/6913 +f 6989/6978/6970 6901/6256/6966 6988/6975/6967 +f 6899/6903/6880 6990/6976/6968 6988/6975/6967 +f 6990/6976/6968 6991/6991/6983 6992/6977/6969 +f 6993/7053/7045 6989/6978/6970 6992/6977/6969 +f 6995/6981/6973 6899/6903/6880 6994/6979/6971 +f 6891/6897/6873 6890/6896/6872 6994/6979/6971 +f 6890/6896/6872 6889/6895/6871 6996/6980/6972 +f 6997/6987/6979 6995/6981/6973 6996/6980/6972 +f 6998/6982/6974 6999/6984/6976 6996/6980/6972 +f 7000/6983/6975 7001/6985/6977 6999/6984/6976 +f 7001/6985/6977 7002/6992/6984 7003/6986/6978 +f 6997/6987/6979 6996/6980/6972 7003/6986/6978 +f 6995/6981/6973 7004/6988/6980 6990/6976/6968 +f 6997/6987/6979 7005/6989/6981 7004/6988/6980 +f 7007/7048/7040 7004/6988/6980 7006/6990/6982 +f 7004/6988/6980 7007/7048/7040 6991/6991/6983 +f 7008/6993/6985 7009/6995/6987 7003/6986/6978 +f 7010/6994/6986 7011/6996/6988 7009/6995/6987 +f 7005/6989/6981 7009/6995/6987 7006/6990/6982 +f 7009/6995/6987 7005/6989/6981 6997/6987/6979 +f 7013/6998/6990 7014/7000/6992 7015/6999/6991 +f 7014/7000/6992 7013/6998/6990 6998/6982/6974 +f 6886/6893/6869 7014/7000/6992 6889/6895/6871 +f 7014/7000/6992 6886/6893/6869 6885/6892/6868 +f 7019/7004/6996 7016/7001/6993 7018/7003/6995 +f 7018/7003/6995 7017/7002/6994 7015/6999/6991 +f 7020/7005/6997 7018/7003/6995 6885/6892/6868 +f 7021/7122/7081 7019/7004/6996 7020/7005/6997 +f 7023/7007/6999 7002/6992/6984 7022/7006/6998 +f 7022/7006/6998 7001/6985/6977 7013/6998/6990 +f 7024/7096/7158 7022/7006/6998 7012/6997/6989 +f 7022/7006/6998 7024/7096/7158 7025/7008/7000 +f 7027/7010/7002 7028/7012/7004 7029/7011/7003 +f 7010/6994/6986 7008/6993/6985 7028/7012/7004 +f 7008/6993/6985 7002/6992/6984 7023/7007/6999 +f 7025/7008/7000 7029/7011/7003 7023/7007/6999 +f 7033/7019/7011 7030/7013/7005 7032/7015/7007 +f 7032/7015/7007 7031/7014/7006 7035/7017/7009 +f 7035/7017/7009 7036/7022/7014 7037/7018/7010 +f 7032/7015/7007 7037/7018/7010 7038/7020/7012 +f 7040/7025/7017 7038/7020/7012 7039/7021/7013 +f 7039/7021/7013 7037/7018/7010 7041/7023/7015 +f 7043/7026/7018 7039/7021/7013 7042/7024/7016 +f 7044/7030/7022 7040/7025/7017 7043/7026/7018 +f 7046/7031/7023 6940/7027/7019 7045/7028/7020 +f 7045/7028/7020 6939/6936/6919 7047/7029/7021 +f 7043/7026/7018 7045/7028/7020 7044/7030/7022 +f 7042/7024/7016 7046/7031/7023 7043/7026/7018 +f 7049/7034/7026 6948/7032/7024 7048/7033/7025 +f 7048/7033/7025 6947/6943/6926 6935/6931/6914 +f 7050/7036/7028 7048/7033/7025 6940/7027/7019 +f 7048/7033/7025 7050/7036/7028 7051/7035/7027 +f 7050/7036/7028 7052/7038/7030 7053/7037/7029 +f 7052/7038/7030 7050/7036/7028 7046/7031/7023 +f 7054/7040/7032 7052/7038/7030 7042/7024/7016 +f 7052/7038/7030 7054/7040/7032 7055/7039/7031 +f 7041/7023/7015 7056/7041/7033 7054/7040/7032 +f 7036/7022/7014 7057/7042/7034 7056/7041/7033 +f 7057/7042/7034 7058/7047/7039 7059/7043/7035 +f 7056/7041/7033 7059/7043/7035 7055/7039/7031 +f 7035/7017/7009 7060/7045/7037 7057/7042/7034 +f 7060/7045/7037 7035/7017/7009 7061/7044/7036 +f 7063/8925/7088 7060/7045/7037 7062/7046/7038 +f 7060/7045/7037 7063/8925/7088 7058/7047/7039 +f 7007/7048/7040 7064/7050/7042 7065/7049/7041 +f 7006/6990/6982 7066/7051/7043 7064/7050/7042 +f 7066/7051/7043 7062/7046/7038 7061/7044/7036 +f 7064/7050/7042 7061/7044/7036 7034/7016/7008 +f 7067/7052/7044 7068/7054/7046 7031/7014/7006 +f 6993/7053/7045 6992/6977/6969 7068/7054/7046 +f 6992/6977/6969 6991/6991/6983 7065/7049/7041 +f 7068/7054/7046 7065/7049/7041 7034/7016/7008 +f 6944/7056/6925 7069/7056/7048 7070/7055/7047 +f 6948/7056/7024 7071/7056/7049 7069/7056/7048 +f 7071/7056/7049 7072/7057/7101 7073/7057/7050 +f 7069/7056/7048 7073/7057/7050 7074/7057/7051 +f 7076/7060/7055 6971/7058/6950 7075/7059/7052 +f 7075/7059/7052 6970/7058/6948 7077/7059/7053 +f 7079/7059/7056 7075/7059/7052 7078/7059/7054 +f 7080/7060/7058 7076/7060/7055 7079/7059/7056 +f 7082/7063/7059 6930/7061/6910 7081/7060/7057 +f 7081/7060/7057 6973/7062/6951 7076/7060/7055 +f 7083/7060/7060 7081/7060/7057 7080/7060/7058 +f 7084/7063/7063 7082/7063/7059 7083/7060/7060 +f 7086/7064/7064 6927/7064/7061 7085/7063/7062 +f 7085/7063/7062 6931/7061/6911 7082/7063/7059 +f 7087/7063/7065 7085/7063/7062 7084/7063/7063 +f 7088/7064/7110 7086/7064/7064 7087/7063/7065 +f 7092/7065/7069 7089/7065/7066 7091/7064/7068 +f 7091/7064/7068 7090/7066/7067 6925/7064/6906 +f 7086/7064/7064 7091/7064/7068 6927/7064/7061 +f 7088/7064/7110 7092/7065/7069 7086/7064/7064 +f 6953/7055/6931 7093/7055/7071 7094/7059/7070 +f 6941/7055/6920 7070/7055/7047 7093/7055/7071 +f 7070/7055/7047 7074/7057/7051 7095/7059/7072 +f 7093/7055/7071 7095/7059/7072 7096/7059/7073 +f 7077/7059/7053 6960/7058/6946 7097/7059/7074 +f 7097/7059/7074 6959/7067/6937 7094/7059/7070 +f 7094/7059/7070 7096/7059/7073 7098/7059/7075 +f 7097/7059/7074 7098/7059/7075 7078/7059/7054 +f 7102/7068/7082 7099/7068/7076 7101/7068/7078 +f 7101/7068/7078 7100/7068/7077 7104/7069/7080 +f 7105/7071/7083 7101/7068/7078 7021/7070/7081 +f 7106/7071/7120 7102/7068/7082 7105/7071/7083 +f 7108/7073/7085 7109/7072/7087 7110/7072/7086 +f 7058/7073/7039 7063/7074/7088 7109/7072/7087 +f 7063/7074/7088 7062/7075/7038 7111/7075/7089 +f 7109/7072/7087 7111/7075/7089 7112/7075/7090 +f 7116/7079/7094 7113/7076/7091 7115/7078/7093 +f 7115/7078/7093 7114/7077/7092 7059/7078/7035 +f 7108/7073/7085 7115/7078/7093 7058/7073/7039 +f 7115/7078/7093 7108/7073/7085 7107/7072/7084 +f 7053/7081/7029 7117/7081/7096 7118/7082/7095 +f 7055/7077/7031 7114/7077/7092 7117/7081/7096 +f 7114/7077/7092 7113/7076/7091 7119/7081/7097 +f 7117/7081/7096 7119/7081/7097 7120/7082/7098 +f 7049/7080/7026 7121/7080/7099 7071/7056/7049 +f 7051/7080/7027 7118/7082/7095 7121/7080/7099 +f 7118/7082/7095 7120/7082/7098 7122/7082/7100 +f 7121/7080/7099 7122/7082/7100 7072/7057/7101 +f 7124/7057/7104 7074/7057/7051 7123/7057/7102 +f 7123/7057/7102 7073/7057/7050 7125/7057/7103 +f 7125/7057/7103 6747/7082/6727 6757/7057/6736 +f 6756/7057/6735 7124/7057/7104 6757/7057/6736 +f 7079/7059/7056 7126/7060/7106 7127/7060/7105 +f 7078/7059/7054 7128/7059/7107 7126/7060/7106 +f 7128/7059/7107 6739/7057/6720 6737/7083/6719 +f 7126/7060/7106 6737/7083/6719 6731/7083/6713 +f 7130/7063/7109 7084/7063/7063 7129/7060/7108 +f 7129/7060/7108 7083/7060/7060 7127/7060/7105 +f 7127/7060/7105 6731/7083/6713 6734/7083/6718 +f 6725/7084/6707 7130/7063/7109 6734/7083/6718 +f 7132/7065/7112 7088/7064/7110 7131/7084/7111 +f 7131/7084/7111 7087/7063/7065 7130/7063/7109 +f 6728/7084/6709 7131/7084/7111 6725/7084/6707 +f 6722/7084/6704 7132/7065/7112 6728/7084/6709 +f 6721/7065/6703 6716/7065/6698 7134/7065/7114 +f 7134/7065/7114 7133/7065/7113 7092/7065/7069 +f 7132/7065/7112 7134/7065/7114 7088/7064/7110 +f 6722/7084/6704 6721/7065/6703 7132/7065/7112 +f 7095/7059/7072 7135/7059/7116 7136/7059/7115 +f 7074/7057/7051 7124/7057/7104 7135/7059/7116 +f 7135/7059/7116 7124/7057/7104 6756/7057/6735 +f 7098/7059/7075 7137/7059/7117 7128/7059/7107 +f 7096/7059/7073 7136/7059/7115 7137/7059/7117 +f 7136/7059/7115 6756/7057/6735 6758/7057/6738 +f 7137/7059/7117 6758/7057/6738 6739/7057/6720 +f 6707/7085/6689 6703/7085/6684 7139/7068/7119 +f 7139/7068/7119 7138/7068/7118 7102/7068/7082 +f 7140/7071/7121 7139/7068/7119 7106/7071/7120 +f 6709/7065/6690 6707/7085/6689 7140/7071/7121 +f 6695/7072/6677 6692/7079/6676 7142/7072/7123 +f 7142/7072/7123 7141/7072/7122 7110/7072/7086 +f 7143/7072/7124 7142/7072/7123 7112/7075/7090 +f 6697/7085/6678 6695/7072/6677 7143/7072/7124 +f 6691/7079/6673 6690/7076/6672 7145/7079/7126 +f 7145/7079/7126 7144/7076/7125 7116/7079/7094 +f 7116/7079/7094 7107/7072/7084 7141/7072/7122 +f 7145/7079/7126 7141/7072/7122 6692/7079/6676 +f 7119/7081/7097 7146/7076/7128 7147/7082/7127 +f 7113/7076/7091 7144/7076/7125 7146/7076/7128 +f 7144/7076/7125 6690/7076/6672 6763/7076/6745 +f 7146/7076/7128 6763/7076/6745 6749/7082/6729 +f 7125/7057/7103 7072/7057/7101 7148/7082/7129 +f 7148/7082/7129 7122/7082/7100 7147/7082/7127 +f 7147/7082/7127 6749/7082/6729 6748/7082/6728 +f 7148/7082/7129 6748/7082/6728 6747/7082/6727 +f 7152/7068/7135 7149/7068/7130 7151/7068/7132 +f 7151/7068/7132 7150/7068/7131 7154/7069/7134 +f 7100/7068/7077 7151/7068/7132 7103/7069/7079 +f 7099/7068/7076 7152/7068/7135 7100/7068/7077 +f 7152/7068/7135 7155/7068/7137 7156/7068/7136 +f 7099/7068/7076 7138/7068/7118 7155/7068/7137 +f 6703/7085/6684 7156/7068/7136 7138/7068/7118 +f 7027/7010/7002 7026/7009/7001 7158/7087/7139 +f 7158/7087/7139 7157/7086/7138 7160/7089/7141 +f 7011/6996/6988 7158/7087/7139 7006/6990/6982 +f 7010/6994/6986 7027/7010/7002 7011/6996/6988 +f 7160/7089/7141 7161/7090/7142 7066/7051/7043 +f 7159/7088/7140 7162/7091/7143 7161/7090/7142 +f 7062/7046/7038 7066/7051/7043 7162/7091/7143 +f 7163/7092/7144 7164/7094/7146 7162/7091/7143 +f 7165/7093/7145 7166/7095/7147 7164/7094/7146 +f 7062/7046/7038 7162/7091/7143 7166/7095/7147 +f 7168/7068/7151 7153/7068/7133 7167/7068/7148 +f 7167/7068/7148 7150/7068/7131 7169/7068/7149 +f 7171/7068/7152 7167/7068/7148 7170/7068/7150 +f 7165/7068/7145 7168/7068/7151 7171/7068/7152 +f 7171/7068/7152 7172/7075/7154 7166/7075/7147 +f 7172/7075/7154 7171/7068/7152 7173/7068/7153 +f 7173/7068/7153 7112/7075/7090 7111/7075/7089 +f 7172/7075/7154 7111/7075/7089 7062/7075/7038 +f 7174/7068/7155 7175/7068/7156 7156/7068/7136 +f 7175/7068/7156 7174/7068/7155 7169/7068/7149 +f 7175/7068/7156 7169/7068/7149 7149/7068/7130 +f 6701/7085/6683 6697/7085/6678 7176/7068/7157 +f 7176/7068/7157 7143/7072/7124 7173/7068/7153 +f 7174/7068/7155 7176/7068/7157 7170/7068/7150 +f 6703/7085/6684 6701/7085/6683 7174/7068/7155 +f 7178/7098/7160 7025/7008/7000 7177/7097/7159 +f 7012/6997/6989 7017/7002/6994 7177/7097/7159 +f 7179/7099/7161 7177/7097/7159 7016/7001/6993 +f 7180/7104/7166 7178/7098/7160 7179/7099/7161 +f 7182/7101/7163 7183/7103/7165 7184/7102/7164 +f 7026/7009/7001 7029/7011/7003 7183/7103/7165 +f 7029/7011/7003 7025/7008/7000 7178/7098/7160 +f 7183/7103/7165 7178/7098/7160 7180/7104/7166 +f 7163/7092/7144 7185/7106/7168 7186/7105/7167 +f 7159/7088/7140 7157/7086/7138 7185/7106/7168 +f 7157/7086/7138 7026/7009/7001 7182/7101/7163 +f 7185/7106/7168 7182/7101/7163 7181/7100/7162 +f 7188/7110/7171 7181/7100/7162 7187/7107/7169 +f 7187/7107/7169 7184/7102/7164 7189/7108/7170 +f 7189/7108/7170 7103/7113/7079 7154/7109/7134 +f 7153/7114/7133 7188/7110/7171 7154/7109/7134 +f 7179/7099/7161 7190/7111/7172 7189/7108/7170 +f 7016/7001/6993 7019/7004/6996 7190/7111/7172 +f 7019/7004/6996 7021/7122/7081 7104/7112/7080 +f 7190/7111/7172 7104/7112/7080 7103/7113/7079 +f 7188/7110/7171 7191/7115/7173 7186/7105/7167 +f 7153/7114/7133 7168/8926/7151 7191/7115/7173 +f 7191/7115/7173 7168/8926/7151 7165/7093/7145 +f 6919/6916/6898 6893/6915/6897 7192/7116/7174 +f 7192/7116/7174 6892/6899/6875 6895/6900/6877 +f 6895/6900/6877 6894/6253/6876 7193/6251/7175 +f 6920/6147/6900 6919/6916/6898 7193/6251/7175 +f 7194/7117/7176 7195/7119/7178 6923/6920/6903 +f 7196/7118/7177 7197/7120/7179 7195/7119/7178 +f 7197/7120/7179 6893/6915/6897 6917/6914/6896 +f 7195/7119/7178 6917/6914/6896 6913/6912/6893 +f 7198/7121/7180 7199/7123/7181 7197/7120/7179 +f 7021/7122/7081 7020/7005/6997 7199/7123/7181 +f 7020/7005/6997 6885/6892/6868 6888/6898/6874 +f 7199/7123/7181 6888/6898/6874 6893/6915/6897 +f 7198/7070/7180 7200/7071/7182 7105/7071/7083 +f 7196/7071/7177 7201/7071/7183 7200/7071/7182 +f 7201/7071/7183 7202/7071/7187 7203/7071/7184 +f 7200/7071/7182 7203/7071/7184 7106/7071/7120 +f 7194/7071/7176 7204/7071/7185 7201/7071/7183 +f 6922/7066/6902 7090/7066/7067 7204/7071/7185 +f 7090/7066/7067 7089/7065/7066 7205/7071/7186 +f 7204/7071/7185 7205/7071/7186 7202/7071/7187 +f 7140/7071/7121 7206/7071/7189 7207/7071/7188 +f 7206/7071/7189 7140/7071/7121 7203/7071/7184 +f 7206/7071/7189 7203/7071/7184 7202/7071/7187 +f 6715/7065/6697 7208/7065/7190 7133/7065/7113 +f 6709/7065/6690 7207/7071/7188 7208/7065/7190 +f 7207/7071/7188 7202/7071/7187 7205/7071/7186 +f 7208/7065/7190 7205/7071/7186 7089/7065/7066 +f 7210/7125/7192 7211/7129/7196 7212/7126/7193 +f 7211/7129/7196 7210/7125/7192 7214/7128/7195 +f 7216/7241/7300 7211/7129/7196 7215/7130/7197 +f 7211/7129/7196 7216/7241/7300 7217/7131/7198 +f 7214/7128/7195 7213/7127/7194 7219/7133/7200 +f 7219/7133/7200 7218/7132/7199 7221/7135/7202 +f 7221/7135/7202 7222/7142/7209 7223/7136/7203 +f 7219/7133/7200 7223/7136/7203 7215/7130/7197 +f 7221/7135/7202 7220/7134/7201 7225/7138/7205 +f 7225/7138/7205 7224/7137/7204 7227/7140/7207 +f 7229/7189/7256 7225/7138/7205 7228/7141/7208 +f 7225/7138/7205 7229/7189/7256 7222/7142/7209 +f 7227/7140/7207 7226/7139/7206 7231/7144/7211 +f 7231/7144/7211 7230/7143/7210 7233/7146/7213 +f 7235/7148/7215 7231/7144/7211 7234/7147/7214 +f 7228/7141/7208 7227/7140/7207 7235/7148/7215 +f 7239/7154/7221 7236/7149/7216 7238/7151/7218 +f 7240/7152/7219 7241/7153/7220 7238/7151/7218 +f 7241/7153/7220 7234/7147/7214 7233/7146/7213 +f 7232/7145/7212 7239/7154/7221 7233/7146/7213 +f 7242/7155/7222 7243/7157/7224 7237/7150/7217 +f 7244/7156/7223 7245/7158/7225 7243/7157/7224 +f 7245/7158/7225 7246/7166/7233 7247/7159/7226 +f 7243/7157/7224 7247/7159/7226 7240/7152/7219 +f 7251/7165/7232 7248/7160/7227 7250/7162/7229 +f 7250/7162/7229 7249/7161/7228 7253/7164/7231 +f 7241/7153/7220 7250/7162/7229 7234/7147/7214 +f 7240/7152/7219 7251/7165/7232 7241/7153/7220 +f 7247/7159/7226 7246/7166/7233 7255/7168/7235 +f 7256/7169/7236 7257/7170/7237 7255/7168/7235 +f 7257/7170/7237 7248/7160/7227 7251/7165/7232 +f 7240/7152/7219 7247/7159/7226 7251/7165/7232 +f 7259/7172/7239 7260/7175/7242 7261/7173/7240 +f 7262/7174/7241 7263/7176/7243 7260/7175/7242 +f 7263/7176/7243 7236/7149/7216 7239/7154/7221 +f 7260/7175/7242 7239/7154/7221 7232/7145/7212 +f 7265/7178/7245 7266/7180/7247 7267/7179/7246 +f 7258/7171/7238 7261/7173/7240 7266/7180/7247 +f 7261/7173/7240 7232/7145/7212 7230/7143/7210 +f 7226/7139/7206 7267/7179/7246 7230/7143/7210 +f 7269/7183/7250 7228/7141/7208 7268/7181/7248 +f 7268/7181/7248 7235/7148/7215 7253/7164/7231 +f 7253/7164/7231 7252/7163/7230 7270/7182/7249 +f 7271/7184/7251 7269/7183/7250 7270/7182/7249 +f 7272/7185/7252 7273/7188/7255 7269/7183/7250 +f 7273/7188/7255 7272/7185/7252 7275/7187/7254 +f 7275/7187/7254 7222/7142/7209 7229/7189/7256 +f 7228/7141/7208 7269/7183/7250 7229/7189/7256 +f 7277/7191/7258 7278/7194/7260 7279/7192/7259 +f 7274/7193/7253 7272/7195/7252 7278/7194/7260 +f 7280/7197/7261 7278/7194/7260 7271/7196/7251 +f 7281/7203/7264 7279/7192/7259 7280/7197/7261 +f 7270/7198/7249 7282/7200/7262 7280/7197/7261 +f 7252/7199/7230 7249/7201/7228 7282/7200/7262 +f 7249/7201/7228 7248/7290/7227 7283/7202/7263 +f 7282/7200/7262 7283/7202/7263 7281/7203/7264 +f 7287/7207/7268 7284/7204/7265 7286/7206/7267 +f 7286/7206/7267 7285/7205/7266 7267/7179/7246 +f 7224/7137/7204 7286/7206/7267 7226/7139/7206 +f 7220/7134/7201 7287/7207/7268 7224/7137/7204 +f 7291/7213/7274 7288/7208/7269 7290/7210/7271 +f 7290/7210/7271 7289/7209/7270 7293/7212/7273 +f 7285/7205/7266 7290/7210/7271 7264/7177/7244 +f 7284/7204/7265 7291/7213/7274 7285/7205/7266 +f 7294/7214/7275 7295/7216/7277 7293/7212/7273 +f 7296/7215/7276 7297/7217/7278 7295/7216/7277 +f 7297/7217/7278 7258/7171/7238 7265/7178/7245 +f 7295/7216/7277 7265/7178/7245 7264/7177/7244 +f 7301/7221/7282 7298/7218/7279 7300/7220/7281 +f 7300/7220/7281 7299/7219/7280 7291/7213/7274 +f 7302/7222/7283 7300/7220/7281 7284/7204/7265 +f 7303/7229/7290 7301/7221/7282 7302/7222/7283 +f 7305/7224/7285 7306/7227/7288 7307/7225/7286 +f 7308/7226/7287 7309/7228/7289 7306/7227/7288 +f 7309/7228/7289 7298/7218/7279 7301/7221/7282 +f 7306/7227/7288 7301/7221/7282 7303/7229/7290 +f 7311/7232/7293 7304/7223/7284 7310/7230/7291 +f 7310/7230/7291 7307/7225/7286 7312/7231/7292 +f 7210/7125/7192 7310/7230/7291 7213/7127/7194 +f 7209/7124/7191 7311/7232/7293 7210/7125/7192 +f 7312/7231/7292 7303/7229/7290 7313/7233/7294 +f 7313/7233/7294 7302/7222/7283 7287/7207/7268 +f 7218/7132/7199 7313/7233/7294 7220/7134/7201 +f 7213/7127/7194 7312/7231/7292 7218/7132/7199 +f 7223/7136/7203 7222/7142/7209 7314/7234/7295 +f 7274/7186/7253 7277/7235/7258 7314/7234/7295 +f 7277/7235/7258 7276/7238/7257 7315/7236/7296 +f 7314/7234/7295 7315/7236/7296 7215/7130/7197 +f 7216/7241/7300 7215/7130/7197 7316/7237/7297 +f 7316/7237/7297 7315/7236/7296 7317/7239/7298 +f 7319/7242/7301 7316/7237/7297 7318/7240/7299 +f 7217/7131/7198 7216/7241/7300 7319/7242/7301 +f 7321/7246/7303 7318/7243/7299 7320/7245/7302 +f 7276/7190/7257 7279/7192/7259 7320/7245/7302 +f 7320/7245/7302 7279/7192/7259 7281/7203/7264 +f 7325/7253/7310 7322/7247/7304 7324/7249/7306 +f 7324/7249/7306 7323/7248/7305 7327/7251/7308 +f 7329/7254/7311 7324/7249/7306 7328/7252/7309 +f 7330/7278/7333 7325/7253/7310 7329/7254/7311 +f 7332/7256/7313 7333/7259/7315 7334/7257/7314 +f 7326/7258/7307 7323/8927/7305 7333/7259/7315 +f 7333/7259/7315 7323/8927/7305 7322/7260/7304 +f 7336/7262/7317 7337/7265/7320 7338/7263/7318 +f 7339/7264/7319 7340/7266/7321 7337/7265/7320 +f 7340/7266/7321 7341/7272/7327 7342/7267/7322 +f 7337/7265/7320 7342/7267/7322 7343/7268/7323 +f 7347/7273/7328 7344/7269/7324 7346/7271/7326 +f 7346/7271/7326 7345/7270/7325 7342/7267/7322 +f 7348/7274/7329 7346/7271/7326 7341/7272/7327 +f 7349/7277/7332 7347/7273/7328 7348/7274/7329 +f 7329/7254/7311 7328/7252/7309 7351/7276/7331 +f 7351/7276/7331 7350/7275/7330 7347/7273/7328 +f 7352/8928/8128 7351/7276/7331 7349/7277/7332 +f 7351/7276/7331 7352/8928/8128 7330/7278/7333 +f 7354/7280/7335 7355/7284/7339 7356/7281/7336 +f 7355/7284/7339 7354/7280/7335 7358/7283/7338 +f 7360/7286/7341 7355/7284/7339 7359/7285/7340 +f 7361/7287/7342 7356/7281/7336 7360/7286/7341 +f 7363/7374/7418 7361/7287/7342 7362/7288/7343 +f 7362/7288/7343 7360/7286/7341 7364/7289/7344 +f 7283/7202/7263 7248/7290/7227 7367/7292/7345 +f 7367/7292/7345 7257/7291/7237 7368/7294/7346 +f 7369/8929/8145 7367/7292/7345 7331/7255/7312 +f 7367/7292/7345 7369/8929/8145 7281/7203/7264 +f 7370/7295/7347 7371/7297/7349 7332/7256/7313 +f 7372/7296/7348 7373/8930/7350 7371/7297/7349 +f 7371/7297/7349 7373/8930/7350 7326/7258/7307 +f 7327/7251/7308 7326/7250/7307 7374/7299/7351 +f 7374/7299/7351 7373/7298/7350 7375/7301/7352 +f 7375/7301/7352 7376/7303/7354 7377/7302/7353 +f 7374/7299/7351 7377/7302/7353 7328/7252/7309 +f 7377/7302/7353 7376/7303/7354 7379/7305/7356 +f 7379/7305/7356 7378/7304/7355 7381/7307/7358 +f 7350/7275/7330 7379/7305/7356 7344/7269/7324 +f 7328/7252/7309 7377/7302/7353 7350/7275/7330 +f 7383/7309/7360 7384/7311/7362 7385/7310/7361 +f 7343/7268/7323 7345/7270/7325 7384/7311/7362 +f 7345/7270/7325 7344/7269/7324 7381/7307/7358 +f 7384/7311/7362 7381/7307/7358 7380/7306/7357 +f 7387/7313/7364 7388/7315/7366 7389/7314/7365 +f 7335/7261/7316 7338/7263/7318 7388/7315/7366 +f 7338/7263/7318 7343/7268/7323 7383/7309/7360 +f 7388/7315/7366 7383/7309/7360 7382/7308/7359 +f 7391/7317/7368 7392/7319/7370 7393/7318/7369 +f 7386/7312/7363 7389/7314/7365 7392/7319/7370 +f 7389/7314/7365 7382/7308/7359 7394/7320/7371 +f 7392/7319/7370 7394/7320/7371 7395/7321/7372 +f 7397/8912/7469 7390/7316/7367 7396/7322/7373 +f 7396/7322/7373 7393/7318/7369 7398/7323/7374 +f 7402/7328/7379 7399/7324/7375 7401/7326/7377 +f 7401/7326/7377 7400/7325/7376 7398/7323/7374 +f 7403/7329/7380 7401/7326/7377 7395/7321/7372 +f 7404/7332/7383 7402/7328/7379 7403/7329/7380 +f 7394/7320/7371 7405/7330/7381 7403/7329/7380 +f 7382/7308/7359 7385/7310/7361 7405/7330/7381 +f 7385/7310/7361 7380/7306/7357 7406/7331/7382 +f 7405/7330/7381 7406/7331/7382 7404/7332/7383 +f 7410/7336/7387 7407/7333/7384 7409/7335/7386 +f 7409/7335/7386 7408/7334/7385 7402/7328/7379 +f 7411/7337/7388 7409/7335/7386 7404/7332/7383 +f 7412/7338/7389 7410/7336/7387 7411/7337/7388 +f 7414/7340/7391 7412/7338/7389 7413/7339/7390 +f 7413/7339/7390 7411/7337/7388 7406/7331/7382 +f 7378/7304/7355 7413/7339/7390 7380/7306/7357 +f 7376/7303/7354 7414/7340/7391 7378/7304/7355 +f 7410/7336/7387 7412/7338/7389 7416/7342/7393 +f 7416/7342/7393 7415/7341/7392 7418/7344/7395 +f 7418/7344/7395 7419/7360/7399 7420/7345/7396 +f 7407/7333/7384 7410/7336/7387 7420/7345/7396 +f 7415/7341/7392 7421/7347/7398 7422/7346/7397 +f 7421/7347/7398 7415/7341/7392 7414/7340/7391 +f 7375/7301/7352 7421/7347/7398 7376/7303/7354 +f 7421/7347/7398 7375/7301/7352 7372/7300/7348 +f 7424/7353/7401 7419/7348/7399 7423/7350/7400 +f 7417/7351/7394 7422/7352/7397 7423/7350/7400 +f 7422/7352/7397 7372/7296/7348 7370/7295/7347 +f 7423/7350/7400 7370/7295/7347 7331/7255/7312 +f 7426/7355/7403 7427/7359/7407 7428/7356/7404 +f 7427/7359/7407 7426/7355/7403 7430/7358/7406 +f 7420/7345/7396 7427/7359/7407 7407/7333/7384 +f 7427/7359/7407 7420/7345/7396 7419/7360/7399 +f 7432/7363/7410 7429/7357/7405 7431/7361/7408 +f 7431/7361/7408 7426/7355/7403 7433/7362/7409 +f 7254/7167/7234 7431/7361/7408 7256/7169/7236 +f 7246/7166/7233 7432/7363/7410 7254/7167/7234 +f 7433/7364/7409 7434/7366/7411 7368/7294/7346 +f 7425/7365/7402 7428/7367/7404 7434/7366/7411 +f 7428/7367/7404 7419/7348/7399 7424/7353/7401 +f 7434/7366/7411 7424/7353/7401 7331/7255/7312 +f 7430/7358/7406 7429/7357/7405 7436/7369/7413 +f 7436/7369/7413 7435/7368/7412 7438/7371/7415 +f 7408/7334/7385 7436/7369/7413 7399/7324/7375 +f 7407/7333/7384 7430/7358/7406 7408/7334/7385 +f 7438/7371/7415 7437/7370/7414 7440/7373/7417 +f 7440/7373/7417 7439/7372/7416 7363/7374/7418 +f 7400/7325/7376 7440/7373/7417 7366/7327/7378 +f 7399/7324/7375 7438/7371/7415 7400/7325/7376 +f 7443/7377/7421 7244/7156/7223 7442/7376/7420 +f 7442/7376/7420 7441/7375/7419 7356/7281/7336 +f 7439/7372/7416 7442/7376/7420 7361/7287/7342 +f 7437/7370/7414 7443/7377/7421 7439/7372/7416 +f 7444/7378/7422 7445/7380/7424 7297/7217/7278 +f 7446/7379/7423 7447/7381/7425 7445/7380/7424 +f 7447/7381/7425 7262/7174/7241 7259/7172/7239 +f 7445/7380/7424 7259/7172/7239 7258/7171/7238 +f 7449/7384/7428 7262/7174/7241 7448/7382/7426 +f 7448/7382/7426 7447/7381/7425 7450/7383/7427 +f 7354/7280/7335 7448/7382/7426 7357/7282/7337 +f 7353/7279/7334 7449/7384/7428 7354/7280/7335 +f 7449/7384/7428 7451/7385/7429 7263/7176/7243 +f 7353/7279/7334 7441/7375/7419 7451/7385/7429 +f 7441/7375/7419 7244/7156/7223 7242/7155/7222 +f 7451/7385/7429 7242/7155/7222 7236/7149/7216 +f 7432/7363/7410 7246/7166/7233 7452/7386/7430 +f 7452/7386/7430 7245/7158/7225 7443/7377/7421 +f 7435/7368/7412 7452/7386/7430 7437/7370/7414 +f 7429/7357/7405 7432/7363/7410 7435/7368/7412 +f 7456/7390/7436 7453/6548/7431 7455/7387/7433 +f 7455/7387/7433 7454/6474/7432 7458/7388/7435 +f 7309/7391/7289 7455/7387/7433 7298/7389/7279 +f 7308/8931/7287 7456/7390/7436 7309/7391/7289 +f 7458/7388/7435 7459/7393/7437 7299/7392/7280 +f 7457/6472/7434 7460/6455/7438 7459/7393/7437 +f 7460/6455/7438 7461/6453/7440 7462/7394/7439 +f 7459/7393/7437 7462/7394/7439 7288/7395/7269 +f 7462/7394/7439 7463/7397/7441 7289/7396/7270 +f 7461/6453/7440 7464/6481/7442 7463/7397/7441 +f 7464/6481/7442 7465/6480/7444 7466/7398/7443 +f 7463/7397/7441 7466/7398/7443 7292/7399/7272 +f 7466/7398/7443 7465/6480/7444 7468/7400/7446 +f 7468/7400/7446 7467/6478/7445 7470/7401/7448 +f 7470/7401/7448 7296/7406/7276 7294/7402/7275 +f 7292/7399/7272 7466/7398/7443 7294/7402/7275 +f 7471/6417/7449 7472/7403/7451 7470/7401/7448 +f 7473/6406/7450 7474/7404/7452 7472/7403/7451 +f 7474/7404/7452 7446/7410/7423 7444/7405/7422 +f 7472/7403/7451 7444/7405/7422 7296/7406/7276 +f 7475/6412/7453 7476/7407/7455 7474/7404/7452 +f 7477/6413/7454 7478/7408/7456 7476/7407/7455 +f 7478/7408/7456 7357/7414/7337 7450/7409/7427 +f 7476/7407/7455 7450/7409/7427 7446/7410/7423 +f 7479/6606/7457 7480/7411/7459 7478/7408/7456 +f 7481/6614/7458 7482/7412/7460 7480/7411/7459 +f 7482/7412/7460 7359/7418/7340 7358/7413/7338 +f 7480/7411/7459 7358/7413/7338 7357/7414/7337 +f 7483/6613/7461 7484/7415/7463 7482/7412/7460 +f 7485/6603/7462 7486/7416/7464 7484/7415/7463 +f 7486/7416/7464 7365/7419/7465 7364/7417/7344 +f 7484/7415/7463 7364/7417/7344 7359/7418/7340 +f 7397/7421/7469 7365/7419/7465 7487/7420/7466 +f 7487/7420/7466 7486/7416/7464 7488/6602/7467 +f 7490/7422/7470 7487/7420/7466 7489/6592/7468 +f 7390/7426/7367 7397/7421/7469 7490/7422/7470 +f 7491/6597/7471 7492/7423/7473 7490/7422/7470 +f 7493/6555/7472 7494/7424/7474 7492/7423/7473 +f 7494/7424/7474 7386/7430/7363 7391/7425/7368 +f 7492/7423/7473 7391/7425/7368 7390/7426/7367 +f 7495/6561/7475 7496/7427/7477 7494/7424/7474 +f 7497/6563/7476 7498/7428/7478 7496/7427/7477 +f 7498/7428/7478 7335/7431/7316 7387/7429/7364 +f 7496/7427/7477 7387/7429/7364 7386/7430/7363 +f 7336/7434/7317 7335/7431/7316 7499/7432/7479 +f 7499/7432/7479 7498/7428/7478 7500/6564/7480 +f 7502/7433/7482 7499/7432/7479 7501/7433/7481 +f 7339/8175/7319 7336/7434/7317 7502/7433/7482 +f 7504/7436/7484 7505/7439/7487 7506/7437/7485 +f 7507/7438/7486 7508/7440/7488 7505/7439/7487 +f 7510/7573/7621 7505/7439/7487 7509/7441/7489 +f 7505/7439/7487 7510/7573/7621 7511/7442/7490 +f 7515/7448/7496 7512/7443/7491 7514/7445/7493 +f 7514/7445/7493 7513/7444/7492 7517/7447/7495 +f 7506/7437/7485 7514/7445/7493 7503/7435/7483 +f 7511/7442/7490 7515/7448/7496 7506/7437/7485 +f 7521/7454/7502 7518/7449/7497 7520/7451/7499 +f 7520/7451/7499 7519/7450/7498 7523/7453/7501 +f 7513/7444/7492 7520/7451/7499 7516/7446/7494 +f 7512/7443/7491 7521/7454/7502 7513/7444/7492 +f 7527/7460/7508 7524/7455/7503 7526/7457/7505 +f 7526/7457/7505 7525/7456/7504 7529/7459/7507 +f 7519/7450/7498 7526/7457/7505 7522/7452/7500 +f 7518/7449/7497 7527/7460/7508 7519/7450/7498 +f 7531/7462/7510 7532/7464/7512 7533/7463/7511 +f 7528/7458/7506 7525/7456/7504 7532/7464/7512 +f 7525/7456/7504 7524/7455/7503 7534/7465/7513 +f 7532/7464/7512 7534/7465/7513 7535/7466/7514 +f 7537/7468/7516 7538/7470/7518 7539/7469/7517 +f 7530/7461/7509 7533/7463/7511 7538/7470/7518 +f 7533/7463/7511 7535/7466/7514 7540/7471/7519 +f 7538/7470/7518 7540/7471/7519 7541/7472/7520 +f 7539/7469/7517 7541/7472/7520 7543/7474/7522 +f 7543/7474/7522 7542/7473/7521 7545/7476/7524 +f 7547/7478/7526 7543/7474/7522 7546/7477/7525 +f 7536/7467/7515 7539/7469/7517 7547/7478/7526 +f 7548/7479/7527 7549/7481/7529 7545/7476/7524 +f 7550/7480/7528 7551/7482/7530 7549/7481/7529 +f 7551/7482/7530 7552/7489/7537 7553/7483/7531 +f 7549/7481/7529 7553/7483/7531 7546/7477/7525 +f 7557/7490/7538 7554/7484/7532 7556/7486/7534 +f 7556/7486/7534 7555/7485/7533 7559/7488/7536 +f 7551/7482/7530 7556/7486/7534 7552/7489/7537 +f 7550/7480/7528 7557/7490/7538 7551/7482/7530 +f 7561/7492/7540 7562/7495/7543 7563/7493/7541 +f 7564/7494/7542 7565/7496/7544 7562/7495/7543 +f 7565/7496/7544 7566/7504/7552 7567/7497/7545 +f 7562/7495/7543 7567/7497/7545 7568/7498/7546 +f 7569/7499/7547 7570/7501/7549 7565/7496/7544 +f 7571/7500/7548 7572/7502/7550 7570/7501/7549 +f 7572/7502/7550 7573/7505/7553 7574/7503/7551 +f 7570/7501/7549 7574/7503/7551 7566/7504/7552 +f 7576/7508/7556 7573/7505/7553 7575/7506/7554 +f 7575/7506/7554 7572/7502/7550 7577/7507/7555 +f 7555/7485/7533 7575/7506/7554 7558/7487/7535 +f 7554/7484/7532 7576/7508/7556 7555/7485/7533 +f 7579/7511/7559 7560/7491/7539 7578/7509/7557 +f 7578/7509/7557 7563/7493/7541 7580/7510/7558 +f 7508/7440/7488 7578/7509/7557 7509/7441/7489 +f 7507/7438/7486 7579/7511/7559 7508/7440/7488 +f 7582/7513/7561 7583/7516/7564 7584/7514/7562 +f 7585/7515/7563 7586/7517/7565 7583/7516/7564 +f 7586/7517/7565 7518/7449/7497 7521/7454/7502 +f 7583/7516/7564 7521/7454/7502 7512/7443/7491 +f 7590/7523/7571 7587/7518/7566 7589/7520/7568 +f 7589/7520/7568 7588/7519/7567 7592/7522/7570 +f 7582/7513/7561 7589/7520/7568 7585/7515/7563 +f 7581/7512/7560 7590/7523/7571 7582/7513/7561 +f 7594/7527/7575 7585/7515/7563 7593/7524/7572 +f 7593/7524/7572 7592/7522/7570 7595/7525/7573 +f 7597/7528/7576 7593/7524/7572 7596/7526/7574 +f 7598/7529/7577 7594/7527/7575 7597/7528/7576 +f 7594/7527/7575 7599/7530/7578 7586/7517/7565 +f 7598/7529/7577 7600/7531/7579 7599/7530/7578 +f 7600/7531/7579 7524/7455/7503 7527/7460/7508 +f 7599/7530/7578 7527/7460/7508 7518/7449/7497 +f 7601/7532/7580 7602/7535/7583 7600/7531/7579 +f 7602/7535/7583 7601/7532/7580 7604/7534/7582 +f 7604/7534/7582 7535/7466/7514 7534/7465/7513 +f 7602/7535/7583 7534/7465/7513 7524/7455/7503 +f 7597/7528/7576 7596/7526/7574 7606/7537/7585 +f 7606/7537/7585 7605/7536/7584 7608/7539/7587 +f 7601/7532/7580 7606/7537/7585 7603/7533/7581 +f 7606/7537/7585 7601/7532/7580 7598/7529/7577 +f 7612/7545/7593 7609/7540/7588 7611/7542/7590 +f 7613/7543/7591 7614/7544/7592 7611/7542/7590 +f 7614/7544/7592 7607/7538/7586 7605/7536/7584 +f 7596/7526/7574 7612/7545/7593 7605/7536/7584 +f 7614/7544/7592 7615/7547/7595 7608/7539/7587 +f 7615/7547/7595 7614/7544/7592 7616/7546/7594 +f 7618/7549/7597 7615/7547/7595 7617/7548/7596 +f 7603/7533/7581 7608/7539/7587 7618/7549/7597 +f 7540/7471/7519 7535/7466/7514 7619/7550/7598 +f 7603/7533/7581 7618/7549/7597 7619/7550/7598 +f 7618/7549/7597 7617/7548/7596 7620/7551/7599 +f 7541/7472/7520 7540/7471/7519 7620/7551/7599 +f 7621/7552/7600 7622/7554/7602 7620/7551/7599 +f 7623/7553/7601 7624/7555/7603 7622/7554/7602 +f 7542/7473/7521 7622/7554/7602 7544/7475/7523 +f 7541/7472/7520 7620/7551/7599 7542/7473/7521 +f 7616/7546/7594 7625/7556/7604 7621/7552/7600 +f 7613/7543/7591 7610/7541/7589 7625/7556/7604 +f 7626/7557/7605 7625/7556/7604 7609/7540/7588 +f 7623/7553/7601 7621/7552/7600 7626/7557/7605 +f 7627/7558/7606 7628/7560/7608 7626/7557/7605 +f 7629/7559/7607 7630/7561/7609 7628/7560/7608 +f 7630/7561/7609 7631/7563/7611 7632/7562/7610 +f 7628/7560/7608 7632/7562/7610 7623/7553/7601 +f 7632/7562/7610 7633/7564/7612 7624/7555/7603 +f 7631/7563/7611 7634/7565/7613 7633/7564/7612 +f 7634/7565/7613 7550/7480/7528 7548/7479/7527 +f 7633/7564/7612 7548/7479/7527 7544/7475/7523 +f 7636/7567/7615 7637/7569/7617 7638/7568/7616 +f 7581/7512/7560 7584/7514/7562 7637/7569/7617 +f 7584/7514/7562 7512/7443/7491 7515/7448/7496 +f 7637/7569/7617 7515/7448/7496 7511/7442/7490 +f 7642/7574/7622 7639/7570/7618 7641/7572/7620 +f 7635/7566/7614 7638/7568/7616 7641/7572/7620 +f 7638/7568/7616 7511/7442/7490 7510/7573/7621 +f 7509/7441/7489 7642/7574/7622 7510/7573/7621 +f 7644/7576/7624 7645/7578/7626 7646/7577/7625 +f 7639/7570/7618 7642/7574/7622 7645/7578/7626 +f 7642/7574/7622 7509/7441/7489 7580/7510/7558 +f 7645/7578/7626 7580/7510/7558 7568/7498/7546 +f 7576/7508/7556 7554/7484/7532 7648/7580/7628 +f 7648/7580/7628 7647/7579/7627 7650/7582/7630 +f 7652/7584/7632 7648/7580/7628 7651/7583/7631 +f 7573/7505/7553 7576/7508/7556 7652/7584/7632 +f 7650/7582/7630 7649/7581/7629 7654/7586/7634 +f 7655/7587/7635 7656/7588/7636 7654/7586/7634 +f 7656/7588/7636 7657/7592/7640 7658/7589/7637 +f 7651/7583/7631 7650/7582/7630 7658/7589/7637 +f 7656/7588/7636 7655/7587/7635 7660/7591/7639 +f 7596/7526/7574 7661/7598/7646 7660/7591/7639 +f 7660/7591/7639 7661/7598/7646 7657/7592/7640 +f 7663/7595/7643 7631/7563/7611 7662/7593/7641 +f 7662/7593/7641 7630/7561/7609 7664/7594/7642 +f 7653/7585/7633 7662/7593/7641 7655/7587/7635 +f 7649/7581/7629 7663/7595/7643 7653/7585/7633 +f 7557/7490/7538 7550/7480/7528 7665/7596/7644 +f 7665/7596/7644 7634/7565/7613 7663/7595/7643 +f 7647/7579/7627 7665/7596/7644 7649/7581/7629 +f 7554/7484/7532 7557/7490/7538 7647/7579/7627 +f 7659/7590/7638 7655/7587/7635 7666/7597/7645 +f 7629/7559/7607 7667/7632/7680 7666/7597/7645 +f 7666/7597/7645 7667/7632/7680 7596/7526/7574 +f 7661/7598/7646 7668/7600/7648 7669/7599/7647 +f 7668/7600/7648 7661/7598/7646 7595/7525/7573 +f 7668/7600/7648 7595/7525/7573 7591/7521/7569 +f 7670/7601/7649 7671/7602/7650 7588/7519/7567 +f 7671/7602/7650 7670/7601/7649 7669/7599/7647 +f 7591/7521/7569 7588/7519/7567 7669/7599/7647 +f 7673/7604/7652 7674/7606/7654 7675/7605/7653 +f 7657/7592/7640 7670/7601/7649 7674/7606/7654 +f 7674/7606/7654 7670/7601/7649 7587/7518/7566 +f 7673/7604/7652 7676/7607/7655 7658/7589/7637 +f 7672/7603/7651 7677/7608/7656 7676/7607/7655 +f 7677/7608/7656 7678/7611/7659 7679/7609/7657 +f 7676/7607/7655 7679/7609/7657 7651/7583/7631 +f 7574/7503/7551 7573/7505/7553 7680/7610/7658 +f 7680/7610/7658 7652/7584/7632 7679/7609/7657 +f 7681/7612/7660 7680/7610/7658 7678/7611/7659 +f 7566/7504/7552 7574/7503/7551 7681/7612/7660 +f 7683/7616/7664 7678/7611/7659 7682/7613/7661 +f 7682/7613/7661 7677/7608/7656 7684/7614/7662 +f 7684/7614/7662 7685/7618/7666 7686/7615/7663 +f 7643/7575/7623 7683/7616/7664 7686/7615/7663 +f 7567/7497/7545 7566/7504/7552 7687/7617/7665 +f 7687/7617/7665 7681/7612/7660 7683/7616/7664 +f 7646/7577/7625 7687/7617/7665 7643/7575/7623 +f 7568/7498/7546 7567/7497/7545 7646/7577/7625 +f 7686/7615/7663 7685/7618/7666 7689/7620/7668 +f 7689/7620/7668 7688/7619/7667 7691/7622/7670 +f 7644/7576/7624 7689/7620/7668 7639/7570/7618 +f 7689/7620/7668 7644/7576/7624 7643/7575/7623 +f 7693/7624/7672 7685/7618/7666 7692/7623/7671 +f 7672/7603/7651 7675/7605/7653 7692/7623/7671 +f 7587/7518/7566 7693/7624/7672 7675/7605/7653 +f 7691/7622/7670 7690/7621/7669 7695/7626/7674 +f 7696/7627/7675 7697/7628/7676 7695/7626/7674 +f 7697/7628/7676 7635/7566/7614 7640/7571/7619 +f 7639/7570/7618 7691/7622/7670 7640/7571/7619 +f 7694/7625/7673 7698/7630/7678 7699/7629/7677 +f 7690/7621/7669 7688/7619/7667 7698/7630/7678 +f 7688/7619/7667 7685/7618/7666 7693/7624/7672 +f 7698/7630/7678 7693/7624/7672 7587/7518/7566 +f 7636/7567/7615 7635/7566/7614 7700/7631/7679 +f 7700/7631/7679 7697/7628/7676 7699/7629/7677 +f 7590/7523/7571 7700/7631/7679 7587/7518/7566 +f 7581/7512/7560 7636/7567/7615 7590/7523/7571 +f 7627/7558/7606 7701/7633/7681 7667/7632/7680 +f 7609/7540/7588 7612/7545/7593 7701/7633/7681 +f 7701/7633/7681 7612/7545/7593 7596/7526/7574 +f 7705/7640/7688 7702/7634/7682 7704/7636/7684 +f 7706/7637/7685 7707/7638/7686 7704/7636/7684 +f 7707/7638/7686 7708/7743/7808 7709/7639/7687 +f 7710/7656/7713 7705/7640/7688 7709/7639/7687 +f 7714/7645/7694 7711/7641/7689 7713/7643/7691 +f 7702/7634/7682 7715/7644/7692 7713/7643/7691 +f 7715/7644/7692 7716/6388/7988 7717/6395/7693 +f 7713/7643/7691 7717/6395/7693 7718/6394/7695 +f 7720/7647/7697 7721/7649/7700 7722/7648/7698 +f 7723/6272/7699 7724/6364/7701 7721/7649/7700 +f 7724/6364/7701 7725/6361/7709 7726/7650/7702 +f 7727/7659/7716 7722/7648/7698 7726/7650/7702 +f 7731/6360/7708 7728/6277/7703 7730/7652/7705 +f 7732/7653/7706 7733/7654/7707 7730/7652/7705 +f 7733/7654/7707 7727/7659/7716 7726/7650/7702 +f 7730/7652/7705 7726/7650/7702 7725/6361/7709 +f 7735/7655/7711 7736/7657/7714 7737/6279/7712 +f 7710/7656/7713 7738/7658/7715 7736/7657/7714 +f 7738/7658/7715 7732/7653/7706 7729/7651/7704 +f 7728/6277/7703 7737/6279/7712 7729/7651/7704 +f 7740/7663/7720 7727/7659/7716 7739/7660/7717 +f 7739/7660/7717 7733/7654/7707 7741/7661/7718 +f 7743/8932/7881 7739/7660/7717 7742/7662/7719 +f 7739/7660/7717 7743/8932/7881 7744/7664/7721 +f 7748/7668/7725 7745/7665/7722 7747/7667/7724 +f 7747/7667/7724 7746/7666/7723 7722/7648/7698 +f 7740/7663/7720 7747/7667/7724 7727/7659/7716 +f 7747/7667/7724 7740/7663/7720 7744/7664/7721 +f 7750/7670/7727 7751/7673/7730 7752/7671/7728 +f 7753/7672/7729 7754/7674/7731 7751/7673/7730 +f 7756/7676/7733 7751/7673/7730 7755/7675/7732 +f 7757/7775/7840 7752/7671/7728 7756/7676/7733 +f 7760/7682/7739 7755/7675/7732 7759/7678/7735 +f 7759/7678/7735 7758/7677/7734 7762/7680/7737 +f 7764/7683/7740 7759/7678/7735 7763/7681/7738 +f 7765/7777/7842 7760/7682/7739 7764/7683/7740 +f 7762/7680/7737 7766/7685/7742 7767/7684/7741 +f 7761/7679/7736 7768/7686/7743 7766/7685/7742 +f 7768/7686/7743 7769/7690/7747 7770/7687/7744 +f 7766/7685/7742 7770/7687/7744 7771/7688/7745 +f 7770/7687/7744 7772/7692/7749 7773/7689/7746 +f 7772/7692/7749 7770/7687/7744 7774/7691/7748 +f 7774/7691/7748 7775/7700/7759 7776/7693/7750 +f 7772/7692/7749 7776/7693/7750 7777/7694/7751 +f 7779/7696/7753 7780/7698/7756 7781/7697/7754 +f 7782/6275/7755 7783/6273/7757 7780/7698/7756 +f 7783/6273/7757 7723/6272/7699 7720/7647/7697 +f 7780/7698/7756 7720/7647/7697 7719/7646/7696 +f 7776/7693/7750 7784/7701/7760 7785/7699/7758 +f 7775/7700/7759 7786/7702/7761 7784/7701/7760 +f 7786/7702/7761 7778/7695/7752 7787/7703/7762 +f 7784/7701/7760 7787/7703/7762 7788/7704/7763 +f 7787/7703/7762 7789/7706/7765 7790/7705/7764 +f 7778/7695/7752 7781/7697/7754 7789/7706/7765 +f 7746/7666/7723 7789/7706/7765 7719/7646/7696 +f 7745/7665/7722 7790/7705/7764 7746/7666/7723 +f 7791/7707/7766 7792/7708/7769 7786/7702/7761 +f 7792/7708/7769 7791/7707/7766 7794/6368/7768 +f 7794/6368/7768 7782/6275/7755 7779/7696/7753 +f 7792/7708/7769 7779/7696/7753 7778/7695/7752 +f 7774/7691/7748 7769/7690/7747 7796/7710/7771 +f 7796/7710/7771 7795/7709/7770 7798/6372/7773 +f 7791/7707/7766 7796/7710/7771 7793/6371/7767 +f 7775/7700/7759 7774/7691/7748 7791/7707/7766 +f 7768/7686/7743 7761/7679/7736 7800/7712/7775 +f 7800/7712/7775 7799/7711/7774 7802/6381/7777 +f 7795/7709/7770 7800/7712/7775 7797/6380/7772 +f 7769/7690/7747 7768/7686/7743 7795/7709/7770 +f 7803/7713/7778 7804/7714/7779 7754/7674/7731 +f 7801/6382/7776 7799/7711/7774 7804/7714/7779 +f 7758/7677/7734 7804/7714/7779 7761/7679/7736 +f 7804/7714/7779 7758/7677/7734 7755/7675/7732 +f 7806/7716/7781 7807/7718/7783 7808/7717/7782 +f 7807/7718/7783 7806/7716/7781 7714/7645/7694 +f 7714/7645/7694 7718/6394/7695 7809/7719/7784 +f 7807/7718/7783 7809/7719/7784 7810/7720/7785 +f 7812/7723/7788 7706/7637/7685 7811/7721/7786 +f 7811/7721/7786 7703/7635/7683 7712/7642/7690 +f 7712/7642/7690 7711/7641/7689 7813/7722/7787 +f 7814/7733/7798 7812/7723/7788 7813/7722/7787 +f 7818/7729/7794 7815/7724/7789 7817/7726/7791 +f 7819/7727/7792 7820/7728/7793 7817/7726/7791 +f 7820/7728/7793 7706/7637/7685 7812/7723/7788 +f 7814/7733/7798 7818/7729/7794 7812/7723/7788 +f 7822/7731/7796 7823/7734/7799 7824/7732/7797 +f 7814/7733/7798 7813/7722/7787 7823/7734/7799 +f 7813/7722/7787 7711/7641/7689 7806/7716/7781 +f 7823/7734/7799 7806/7716/7781 7805/7715/7780 +f 7825/7735/7800 7826/7738/7803 7822/7731/7796 +f 7826/7738/7803 7825/7735/7800 7828/7737/7802 +f 7828/7737/7802 7815/7724/7789 7818/7729/7794 +f 7826/7738/7803 7818/7729/7794 7814/7733/7798 +f 7707/7638/7686 7706/7637/7685 7829/7739/7804 +f 7819/7727/7792 7830/7740/7805 7829/7739/7804 +f 7832/7742/7807 7829/7739/7804 7831/7741/7806 +f 7708/7743/7808 7707/7638/7686 7832/7742/7807 +f 7832/7742/7807 7833/7746/7811 7834/7744/7809 +f 7833/7746/7811 7832/7742/7807 7835/7745/7810 +f 7835/7745/7810 7836/7835/7972 7837/7747/7812 +f 7833/7746/7811 7837/7747/7812 7838/7748/7813 +f 7830/7740/7805 7839/7750/7815 7840/7749/7814 +f 7819/7727/7792 7816/7725/7790 7839/7750/7815 +f 7816/7725/7790 7815/7724/7789 7841/7751/7816 +f 7839/7750/7815 7841/7751/7816 7842/7752/7817 +f 7841/7751/7816 7815/7724/7789 7843/7753/7818 +f 7843/7753/7818 7828/7737/7802 7844/7754/7819 +f 7846/7756/7821 7843/7753/7818 7845/7755/7820 +f 7842/7752/7817 7841/7751/7816 7846/7756/7821 +f 7850/7763/7828 7847/7757/7822 7849/7759/7824 +f 7851/7760/7825 7852/7761/7826 7849/7759/7824 +f 7854/7764/7829 7849/7759/7824 7853/7762/7827 +f 7855/7768/7833 7850/7763/7828 7854/7764/7829 +f 7859/7769/7834 7856/7765/7830 7858/7767/7832 +f 7858/7767/7832 7857/7766/7831 7850/7763/7828 +f 7860/7770/7835 7858/7767/7832 7855/7768/7833 +f 7861/7771/7836 7859/7769/7834 7860/7770/7835 +f 7862/7772/7837 7863/7773/7838 7859/7769/7834 +f 7749/7669/7726 7752/7671/7728 7863/7773/7838 +f 7752/7671/7728 7757/7775/7840 7864/7774/7839 +f 7863/7773/7838 7864/7774/7839 7856/7765/7830 +f 7866/7778/7843 7757/7775/7840 7865/7776/7841 +f 7865/7776/7841 7756/7676/7733 7760/7682/7739 +f 7867/7779/7844 7865/7776/7841 7765/7777/7842 +f 7868/8933/7909 7866/7778/7843 7867/7779/7844 +f 7864/7774/7839 7869/7781/7846 7870/7780/7845 +f 7869/7781/7846 7864/7774/7839 7866/7778/7843 +f 7866/7778/7843 7868/8933/7909 7871/7782/7847 +f 7869/7781/7846 7871/7782/7847 7872/7783/7848 +f 7876/7787/7852 7873/7784/7849 7875/7786/7851 +f 7847/7757/7822 7857/7766/7831 7875/7786/7851 +f 7857/7766/7831 7856/7765/7830 7870/7780/7845 +f 7872/7783/7848 7876/7787/7852 7870/7780/7845 +f 7878/7789/7854 7879/7791/7856 7880/7790/7855 +f 7851/7760/7825 7848/7758/7823 7879/7791/7856 +f 7874/7785/7850 7879/7791/7856 7847/7757/7822 +f 7879/7791/7856 7874/7785/7850 7873/7784/7849 +f 7881/7792/7857 7882/7793/7858 7878/7789/7854 +f 7821/7730/7795 7824/7732/7797 7882/7793/7858 +f 7824/7732/7797 7805/7715/7780 7883/7794/7859 +f 7851/7760/7825 7878/7789/7854 7883/7794/7859 +f 7883/7794/7859 7805/7715/7780 7884/7795/7860 +f 7810/7720/7785 7885/7796/7861 7884/7795/7860 +f 7852/7761/7826 7884/7795/7860 7853/7762/7827 +f 7851/7760/7825 7883/7794/7859 7852/7761/7826 +f 7889/7797/7866 7886/7797/7862 7888/7797/7864 +f 7765/7797/7842 7764/7797/7740 7888/7797/7864 +f 7764/7797/7740 7763/7798/7738 7890/7798/7865 +f 7891/7797/7885 7889/7797/7866 7890/7798/7865 +f 7893/7799/7868 7894/7799/7870 7895/7799/7869 +f 7777/7800/7751 7785/7801/7758 7894/7799/7870 +f 7785/7801/7758 7788/7801/7763 7896/7799/7871 +f 7894/7799/7870 7896/7799/7871 7897/7802/7872 +f 7896/7799/7871 7898/7802/7874 7899/7802/7873 +f 7788/7801/7763 7790/7803/7764 7898/7802/7874 +f 7790/7803/7764 7745/7803/7722 7900/7802/7875 +f 7898/7802/7874 7900/7802/7875 7901/7802/7876 +f 7900/7802/7875 7902/7804/7878 7903/7804/7877 +f 7745/7803/7722 7748/7805/7725 7902/7804/7878 +f 7748/7805/7725 7744/7806/7721 7904/7806/7879 +f 7902/7804/7878 7904/7806/7879 7905/7804/7880 +f 7743/7806/7881 7906/7806/7882 7904/7806/7879 +f 7742/7807/7719 7907/7806/7883 7906/7806/7882 +f 7907/7806/7883 7908/7808/7926 7909/7808/7884 +f 7906/7806/7882 7909/7808/7884 7905/7804/7880 +f 7911/7798/7888 7891/7797/7885 7910/7798/7886 +f 7763/7798/7738 7767/7798/7741 7910/7798/7886 +f 7767/7798/7741 7771/7800/7745 7912/7798/7887 +f 7913/7799/7889 7911/7798/7888 7912/7798/7887 +f 7912/7798/7887 7914/7798/7891 7915/7799/7890 +f 7771/7800/7745 7773/7800/7746 7914/7798/7891 +f 7773/7800/7746 7777/7800/7751 7893/7799/7868 +f 7914/7798/7891 7893/7799/7868 7892/7799/7867 +f 7916/7810/7892 7917/7810/7895 7918/7809/7893 +f 7919/7810/7894 7920/7810/7896 7917/7810/7895 +f 7920/7810/7896 7921/7810/7932 7922/7810/7897 +f 7917/7810/7895 7922/7810/7897 7923/7809/7898 +f 7925/7811/7902 7877/7811/7853 7924/7813/7899 +f 7873/7812/7849 7926/7814/7900 7924/7813/7899 +f 7928/7813/7903 7924/7813/7899 7927/7815/7901 +f 7929/7813/7935 7925/7811/7902 7928/7813/7903 +f 7876/7814/7852 7930/7814/7904 7926/7814/7900 +f 7872/7816/7848 7931/7816/7905 7930/7814/7904 +f 7931/7816/7905 7932/7817/7907 7933/7817/7906 +f 7930/7814/7904 7933/7817/7906 7927/7815/7901 +f 7935/7818/7910 7932/7817/7907 7934/7818/7908 +f 7934/7818/7908 7931/7816/7905 7871/7818/7847 +f 7936/7819/7911 7934/7818/7908 7868/7819/7909 +f 7937/7820/7912 7935/7818/7910 7936/7819/7911 +f 7939/7819/7914 7937/7820/7912 7938/7819/7913 +f 7868/7819/7909 7867/7819/7844 7938/7819/7913 +f 7867/7819/7844 7765/7797/7842 7887/7797/7863 +f 7886/7797/7862 7939/7819/7914 7887/7797/7863 +f 7569/7821/7547 7564/7820/7542 7941/7797/7916 +f 7941/7797/7916 7940/7797/7915 7889/7797/7866 +f 7942/7821/7917 7941/7797/7916 7891/7797/7885 +f 7571/7821/7548 7569/7821/7547 7942/7821/7917 +f 7559/7821/7536 7558/7821/7535 7944/7799/7919 +f 7944/7799/7919 7943/7799/7918 7895/7799/7869 +f 7895/7799/7869 7897/7802/7872 7945/7802/7920 +f 7552/7822/7537 7559/7821/7536 7945/7802/7920 +f 7553/7822/7531 7552/7822/7537 7946/7802/7921 +f 7897/7802/7872 7899/7802/7873 7946/7802/7921 +f 7899/7802/7873 7901/7802/7876 7947/7802/7922 +f 7946/7802/7921 7947/7802/7922 7546/7822/7525 +f 7947/7802/7922 7948/7823/7923 7547/7823/7526 +f 7901/7802/7876 7903/7804/7877 7948/7823/7923 +f 7903/7804/7877 7905/7804/7880 7949/7823/7924 +f 7948/7823/7923 7949/7823/7924 7536/7823/7515 +f 7949/7823/7924 7905/7804/7880 7950/7808/7925 +f 7908/7808/7926 7951/7808/7927 7950/7808/7925 +f 7951/7808/7927 7530/7808/7509 7537/7808/7516 +f 7950/7808/7925 7537/7808/7516 7536/7823/7515 +f 7911/7798/7888 7952/7799/7929 7942/7821/7917 +f 7952/7799/7929 7911/7798/7888 7953/7799/7928 +f 7952/7799/7929 7953/7799/7928 7571/7821/7548 +f 7577/7821/7555 7571/7821/7548 7954/7799/7930 +f 7954/7799/7930 7953/7799/7928 7915/7799/7890 +f 7943/7799/7918 7954/7799/7930 7892/7799/7867 +f 7558/7821/7535 7577/7821/7555 7943/7799/7918 +f 7922/7810/7897 7955/7824/7933 7956/7808/7931 +f 7921/7810/7932 7957/7824/7934 7955/7824/7933 +f 7957/7824/7934 7522/7824/7500 7529/7824/7507 +f 7955/7824/7933 7529/7824/7507 7528/7808/7506 +f 7928/7813/7903 7958/7813/7938 7959/7813/7936 +f 7958/7813/7938 7928/7813/7903 7960/7815/7937 +f 7960/7815/7937 7503/7815/7483 7517/7813/7495 +f 7958/7813/7938 7517/7813/7495 7516/7824/7494 +f 7960/7815/7937 7927/7815/7901 7961/7817/7939 +f 7932/7817/7907 7962/7817/7940 7961/7817/7939 +f 7962/7817/7940 7507/7817/7486 7504/7815/7484 +f 7503/7815/7483 7960/7815/7937 7504/7815/7484 +f 7579/7817/7559 7507/7817/7486 7963/7818/7941 +f 7963/7818/7941 7962/7817/7940 7935/7818/7910 +f 7964/7820/7942 7963/7818/7941 7937/7820/7912 +f 7560/7820/7539 7579/7817/7559 7964/7820/7942 +f 7561/7820/7540 7560/7820/7539 7965/7820/7943 +f 7965/7820/7943 7964/7820/7942 7939/7819/7914 +f 7940/7797/7915 7965/7820/7943 7886/7797/7862 +f 7564/7820/7542 7561/7820/7540 7940/7797/7915 +f 7966/7810/7944 7967/7810/7947 7920/7810/7896 +f 7967/7810/7947 7966/7810/7944 7969/7810/7946 +f 7969/7810/7946 7970/7810/7949 7971/7810/7948 +f 7967/7810/7947 7971/7810/7948 7921/7810/7932 +f 7971/7810/7948 7972/7824/7950 7957/7824/7934 +f 7970/7810/7949 7973/7824/7970 7972/7824/7950 +f 7972/7824/7950 7973/7824/7970 7522/7824/7500 +f 7974/7825/7951 7975/7827/7953 7825/7735/7800 +f 7976/7826/7952 7977/7828/7954 7975/7827/7953 +f 7844/7754/7819 7975/7827/7953 7845/7755/7820 +f 7975/7827/7953 7844/7754/7819 7827/7736/7801 +f 7979/7830/7956 7976/7826/7952 7978/7829/7955 +f 7821/7730/7795 7881/7792/7857 7978/7829/7955 +f 7978/7829/7955 7881/7792/7857 7877/7788/7853 +f 7983/7834/7960 7980/7831/7957 7982/7833/7959 +f 7976/7826/7952 7979/7830/7956 7982/7833/7959 +f 7982/7833/7959 7979/7830/7956 7877/7788/7853 +f 7985/7824/7962 7986/7810/7964 7987/7810/7963 +f 7970/7810/7949 7969/7810/7946 7986/7810/7964 +f 7988/7810/7965 7986/7810/7964 7968/7810/7945 +f 7980/7810/7957 7987/7810/7963 7988/7810/7965 +f 7925/7811/7902 7929/7813/7935 7990/7811/7967 +f 7984/7824/7961 7987/7810/7963 7990/7811/7967 +f 7983/7811/7960 7990/7811/7967 7980/7810/7957 +f 7877/7811/7853 7925/7811/7902 7983/7811/7960 +f 7985/7824/7962 7984/7824/7961 7992/7824/7969 +f 7522/7824/7500 7973/7824/7970 7992/7824/7969 +f 7970/7810/7949 7985/7824/7962 7973/7824/7970 +f 7989/7824/7966 7993/7824/7971 7991/7824/7968 +f 7929/7813/7935 7959/7813/7936 7993/7824/7971 +f 7959/7813/7936 7516/7824/7494 7523/7824/7501 +f 7993/7824/7971 7523/7824/7501 7522/7824/7500 +f 7835/7745/7810 7994/7837/7974 7995/7836/7973 +f 7831/7741/7806 7840/7749/7814 7994/7837/7974 +f 7840/7749/7814 7842/7752/7817 7996/7838/7975 +f 7994/7837/7974 7996/7838/7975 7997/7839/7976 +f 7996/7838/7975 7842/7752/7817 7998/7840/7977 +f 7998/7840/7977 7846/7756/7821 7999/7841/7978 +f 8001/7843/7980 7998/7840/7977 8000/7842/7979 +f 7997/7839/7976 7996/7838/7975 8001/7843/7980 +f 7999/7841/7978 7845/7755/7820 8002/7844/7981 +f 8002/7844/7981 7977/7828/7954 7981/7832/7958 +f 8003/7845/7982 8002/7844/7981 7980/7831/7957 +f 8000/7842/7979 7999/7841/7978 8003/7845/7982 +f 8004/7847/7983 8005/7849/7984 7966/7848/7944 +f 7997/7839/7976 8001/7843/7980 8005/7849/7984 +f 8001/7843/7980 8000/7842/7979 8006/7850/7985 +f 8005/7849/7984 8006/7850/7985 7968/7851/7945 +f 7837/7747/7812 8007/7853/7986 7916/7852/7892 +f 8007/7853/7986 7837/7747/7812 7995/7836/7973 +f 7995/7836/7973 7997/7839/7976 8004/7847/7983 +f 7919/7846/7894 7916/7852/7892 8004/7847/7983 +f 8006/7850/7985 8008/7855/7987 7988/7854/7965 +f 8000/7842/7979 8003/7845/7982 8008/7855/7987 +f 8008/7855/7987 8003/7845/7982 7980/7831/7957 +f 8010/6389/7990 7716/6388/7988 8009/7856/7989 +f 7702/7634/7682 7705/7640/7688 8009/7856/7989 +f 7705/7640/7688 7710/7656/7713 7735/7655/7711 +f 8009/7856/7989 7735/7655/7711 7734/6284/7710 +f 7738/7658/7715 7710/7656/7713 8012/7858/7992 +f 8013/7859/7993 8014/7860/7994 8012/7858/7992 +f 8014/7860/7994 7742/7662/7719 7741/7661/7718 +f 8012/7858/7992 7741/7661/7718 7732/7653/7706 +f 7709/7639/7687 7708/7743/7808 8015/7861/7995 +f 8015/7861/7995 7834/7744/7809 8016/7862/7996 +f 8011/7857/7991 8015/7861/7995 8013/7859/7993 +f 7710/7656/7713 7709/7639/7687 8011/7857/7991 +f 8018/7809/7998 8019/7809/8000 8020/7809/7999 +f 8013/7809/7993 8016/7809/7996 8019/7809/8000 +f 7918/7809/7893 8019/7809/8000 7838/7809/7813 +f 7923/7809/7898 8020/7809/7999 7918/7809/7893 +f 8022/7808/8002 7908/7808/7926 8021/7809/8001 +f 8021/7809/8001 7907/7806/7883 8014/7809/7994 +f 8014/7809/7994 8013/7809/7993 8018/7809/7998 +f 8021/7809/8001 8018/7809/7998 8017/7809/7997 +f 8020/7809/7999 7923/7809/7898 8023/7808/8003 +f 7528/7808/7506 8024/7808/8004 8023/7808/8003 +f 8017/7809/7997 8020/7809/7999 8024/7808/8004 +f 8022/7808/8002 8017/7809/7997 8025/7808/8005 +f 8025/7808/8005 8024/7808/8004 7531/7808/7510 +f 7951/7808/7927 8025/7808/8005 7530/7808/7509 +f 7908/7808/7926 8022/7808/8002 7951/7808/7927 +f 8029/7869/8011 8026/7863/8006 8028/7865/8008 +f 8028/7865/8008 8027/7864/8007 8031/7867/8010 +f 7212/7870/7193 8028/7865/8008 7209/7868/7191 +f 7217/8934/7198 8029/7869/8011 7212/7870/7193 +f 8033/7872/8013 8034/7875/8016 8035/7873/8014 +f 8036/7874/8015 8037/7876/8017 8034/7875/8016 +f 8037/7876/8017 8030/7866/8009 8027/7864/8007 +f 8034/7875/8016 8027/7864/8007 8026/7863/8006 +f 8041/7882/8023 8038/7877/8018 8040/7879/8020 +f 8042/7880/8021 8043/7881/8022 8040/7879/8020 +f 8043/7881/8022 8036/7874/8015 8033/7872/8013 +f 8032/7871/8012 8041/7882/8023 8033/7872/8013 +f 8045/7884/8025 8046/7887/8028 8047/7885/8026 +f 8048/7886/8027 8049/7888/8029 8046/7887/8028 +f 8049/7888/8029 8042/7880/8021 8039/7878/8019 +f 8046/7887/8028 8039/7878/8019 8038/7877/8018 +f 8045/7884/8025 8044/7883/8024 8051/7890/8031 +f 8051/7890/8031 8050/7889/8030 8053/7892/8033 +f 8055/7894/8035 8051/7890/8031 8054/7893/8034 +f 8048/7886/8027 8045/7884/8025 8055/7894/8035 +f 8059/7900/8041 8056/7895/8036 8058/7897/8038 +f 8058/7897/8038 8057/7896/8037 8061/7899/8040 +f 8053/7892/8033 8058/7897/8038 8054/7893/8034 +f 8058/7897/8038 8053/7892/8033 8052/7891/8032 +f 8062/7901/8042 8063/7903/8044 8050/7889/8030 +f 8064/7902/8043 8065/7904/8045 8063/7903/8044 +f 8065/7904/8045 8066/7906/8047 8067/7905/8046 +f 8063/7903/8044 8067/7905/8046 8052/7891/8032 +f 8067/7905/8046 8066/7906/8047 8069/7908/8049 +f 8069/7908/8049 8068/7907/8048 8071/7910/8051 +f 8071/7910/8051 8056/7895/8036 8059/7900/8041 +f 8052/7891/8032 8067/7905/8046 8059/7900/8041 +f 8055/7894/8035 8054/7893/8034 8073/7912/8053 +f 8073/7912/8053 8072/7911/8052 8075/7914/8055 +f 8077/7916/8057 8073/7912/8053 8076/7915/8056 +f 8048/7886/8027 8055/7894/8035 8077/7916/8057 +f 8077/7916/8057 8078/7918/8059 8049/7888/8029 +f 8078/7918/8059 8077/7916/8057 8079/7917/8058 +f 8079/7917/8058 8080/7941/8075 8081/7919/8060 +f 8078/7918/8059 8081/7919/8060 8042/7880/8021 +f 8083/7921/8062 8064/7902/8043 8082/7920/8061 +f 8044/7883/8024 8047/7885/8026 8082/7920/8061 +f 8084/7922/8063 8082/7920/8061 8038/7877/8018 +f 8085/8935/8068 8083/7921/8062 8084/7922/8063 +f 8086/7923/8064 8087/7925/8066 8041/7882/8023 +f 8088/7924/8065 8089/7926/8067 8087/7925/8066 +f 8089/7926/8067 8085/8935/8068 8084/7922/8063 +f 8087/7925/8066 8084/7922/8063 8038/7877/8018 +f 8089/7928/8067 8090/7931/8070 8091/7929/8069 +f 8088/7930/8065 8092/7932/8071 8090/7931/8070 +f 8092/7932/8071 8093/7980/8102 8094/7933/8072 +f 8090/7931/8070 8094/7933/8072 7281/7934/7264 +f 8096/7940/8074 8066/7935/8047 8095/7937/8073 +f 8095/7937/8073 8065/7936/8045 8083/7939/8062 +f 8091/7929/8069 8095/7937/8073 8085/7927/8068 +f 8095/7937/8073 8091/7929/8069 7281/7934/7264 +f 8081/7919/8060 8097/7942/8076 8043/7881/8022 +f 8080/7941/8075 8098/7943/8077 8097/7942/8076 +f 8098/7943/8077 8099/7950/8084 8100/7944/8078 +f 8097/7942/8076 8100/7944/8078 8036/7874/8015 +f 8101/7945/8079 8102/7947/8081 8098/7943/8077 +f 8103/7946/8080 8104/7948/8082 8102/7947/8081 +f 8104/7948/8082 8105/7956/8090 8106/7949/8083 +f 8102/7947/8081 8106/7949/8083 8099/7950/8084 +f 8079/7917/8058 8076/7915/8056 8108/7952/8086 +f 8109/7953/8087 8110/7954/8088 8108/7952/8086 +f 8110/7954/8088 8103/7946/8080 8101/7945/8079 +f 8108/7952/8086 8101/7945/8079 8080/7941/8075 +f 8106/7949/8083 8111/7957/8091 8112/7955/8089 +f 8105/7956/8090 8113/7958/8092 8111/7957/8091 +f 8113/7958/8092 8114/7961/8095 8115/7959/8093 +f 8111/7957/8091 8115/7959/8093 8116/7960/8094 +f 8115/7959/8093 8114/7961/8095 8118/7963/8097 +f 7308/7964/7287 7305/7965/7285 8118/7963/8097 +f 8119/7967/8098 8118/7963/8097 7304/7966/7284 +f 8116/7960/8094 8115/7959/8093 8119/7967/8098 +f 8031/7867/8010 8030/7866/8009 8121/7969/8100 +f 8121/7969/8100 8120/7968/8099 8119/7967/8098 +f 7311/7970/7293 8121/7969/8100 7304/7966/7284 +f 7209/7868/7191 8031/7867/8010 7311/7970/7293 +f 8100/7944/8078 8122/7971/8101 8037/7876/8017 +f 8099/7950/8084 8112/7955/8089 8122/7971/8101 +f 8112/7955/8089 8116/7960/8094 8120/7968/8099 +f 8122/7971/8101 8120/7968/8099 8030/7866/8009 +f 8092/7973/8071 8123/7975/8104 8124/7974/8103 +f 8088/7924/8065 8086/7923/8064 8123/7975/8104 +f 8086/7923/8064 8032/7871/8012 8035/7873/8014 +f 8123/7975/8104 8035/7873/8014 8026/7863/8006 +f 7319/7979/7301 7318/7976/7299 8126/7978/8106 +f 8093/7972/8102 8124/7974/8103 8126/7978/8106 +f 8124/7974/8103 8026/7863/8006 8029/7869/8011 +f 7217/8934/7198 7319/7979/7301 8029/7869/8011 +f 8125/7981/8105 8127/7984/8107 8094/7933/8072 +f 8127/7984/8107 8125/7981/8105 7321/7983/7303 +f 7281/7934/7264 8094/7933/8072 7321/7983/7303 +f 8129/7986/8109 8130/7989/8112 8131/7987/8110 +f 8132/7988/8111 8133/7990/8113 8130/7989/8112 +f 8133/7990/8113 7322/8936/7304 7325/7991/7310 +f 8130/7989/8112 7325/7991/7310 7330/7992/7333 +f 8134/7994/8114 8135/7997/8115 8133/7995/8113 +f 7331/7996/7312 7334/7998/7314 8135/7997/8115 +f 7322/8937/7304 8133/7995/8113 7334/7998/7314 +f 8137/8005/8119 7341/7999/7327 8136/8001/8116 +f 8136/8001/8116 7340/8000/7321 8138/8003/8117 +f 8140/8006/8120 8136/8001/8116 8139/8004/8118 +f 8141/8008/8121 8137/8005/8119 8140/8006/8120 +f 8137/8005/8119 8142/8009/8122 7348/8007/7329 +f 8141/8008/8121 8143/8010/8123 8142/8009/8122 +f 8143/8010/8123 8144/8014/8126 8145/8011/8124 +f 8142/8009/8122 8145/8011/8124 7349/8012/7332 +f 7352/8016/8128 7349/8012/7332 8146/8013/8125 +f 8144/8014/8126 8147/8015/8127 8146/8013/8125 +f 8147/8015/8127 8128/7985/8108 8131/7987/8110 +f 7330/7992/7333 7352/8016/8128 8131/7987/8110 +f 8149/8018/8130 8150/8021/8133 8151/8019/8131 +f 8152/8020/8132 8153/8022/8134 8150/8021/8133 +f 8155/8116/8217 8150/8021/8133 8154/8023/8135 +f 8150/8021/8133 8155/8116/8217 8156/8024/8136 +f 8158/8026/8138 8159/8028/8140 8160/8027/8139 +f 8148/8017/8129 8151/8019/8131 8159/8028/8140 +f 8151/8019/8131 8156/8024/8136 8161/8029/8141 +f 8159/8028/8140 8161/8029/8141 8162/8030/8142 +f 7369/8035/8145 7331/7996/7312 8164/8032/8144 +f 8070/8033/8050 8068/8034/8048 8164/8032/8144 +f 8068/8034/8048 8066/7935/8047 8096/7940/8074 +f 8164/8032/8144 8096/7940/8074 7281/7934/7264 +f 8166/8037/8147 8167/8039/8149 8168/8038/8148 +f 8167/8039/8149 8166/8037/8147 8134/7994/8114 +f 8132/7993/8111 8168/8038/8148 8134/7994/8114 +f 8170/8041/8151 8171/8044/8153 8172/8042/8152 +f 8165/8043/8146 8168/8045/8148 8171/8044/8153 +f 8168/8045/8148 8132/7988/8111 8129/7986/8109 +f 8171/8044/8153 8129/7986/8109 8128/7985/8108 +f 8173/8046/8154 8174/8048/8156 8147/8015/8127 +f 8175/8047/8155 8176/8049/8157 8174/8048/8156 +f 8176/8049/8157 8169/8040/8150 8172/8042/8152 +f 8174/8048/8156 8172/8042/8152 8128/7985/8108 +f 8173/8046/8154 8144/8014/8126 8177/8050/8158 +f 8177/8050/8158 8143/8010/8123 8178/8051/8159 +f 8180/8053/8161 8177/8050/8158 8179/8052/8160 +f 8175/8047/8155 8173/8046/8154 8180/8053/8161 +f 8178/8051/8159 8141/8008/8121 8181/8054/8162 +f 8181/8054/8162 8140/8006/8120 8182/8055/8163 +f 8184/8057/8165 8181/8054/8162 8183/8056/8164 +f 8179/8052/8160 8178/8051/8159 8184/8057/8165 +f 8186/8061/8169 8179/8052/8160 8185/8058/8166 +f 8185/8058/8166 8184/8057/8165 8187/8059/8167 +f 8189/8062/8170 8185/8058/8166 8188/8060/8168 +f 8190/8064/8172 8186/8061/8169 8189/8062/8170 +f 8191/8063/8171 8192/8065/8173 8160/8027/8139 +f 8190/8064/8172 8189/8062/8170 8192/8065/8173 +f 8189/8062/8170 8188/8060/8168 8193/8066/8174 +f 8192/8065/8173 8193/8066/8174 8157/8025/8137 +f 8191/8063/8171 8194/8068/8176 8195/8067/8175 +f 8162/8030/8142 8196/8069/8177 8194/8068/8176 +f 8196/8069/8177 8197/8075/8183 8198/8070/8178 +f 8194/8068/8176 8198/8070/8178 8199/8071/8179 +f 8201/8073/8181 8175/8047/8155 8200/8072/8180 +f 8200/8072/8180 8180/8053/8161 8186/8061/8169 +f 8195/8067/8175 8200/8072/8180 8190/8064/8172 +f 8199/8071/8179 8201/8073/8181 8195/8067/8175 +f 8198/8070/8178 8202/8076/8184 8203/8074/8182 +f 8197/8075/8183 8204/8077/8185 8202/8076/8184 +f 8204/8077/8185 8205/8088/8196 8206/8078/8186 +f 8202/8076/8184 8206/8078/8186 8207/8079/8187 +f 8201/8073/8181 8208/8080/8188 8176/8049/8157 +f 8199/8071/8179 8203/8074/8182 8208/8080/8188 +f 8203/8074/8182 8207/8079/8187 8209/8081/8189 +f 8208/8080/8188 8209/8081/8189 8169/8040/8150 +f 8213/8087/8195 8210/8082/8190 8212/8084/8192 +f 8214/8085/8193 8215/8086/8194 8212/8084/8192 +f 8215/8086/8194 8207/8079/8187 8206/8078/8186 +f 8212/8084/8192 8206/8078/8186 8205/8088/8196 +f 8170/8041/8151 8169/8040/8150 8216/8089/8197 +f 8207/8079/8187 8215/8086/8194 8216/8089/8197 +f 8217/8090/8198 8216/8089/8197 8214/8085/8193 +f 8165/8043/8146 8170/8041/8151 8217/8090/8198 +f 8166/8037/8147 8165/8036/8146 8218/8092/8199 +f 8218/8092/8199 8217/8091/8198 8211/8094/8191 +f 8211/8094/8191 8210/8105/8190 8219/8095/8200 +f 7331/7996/7312 8166/8037/8147 8219/8095/8200 +f 8220/8096/8201 8221/8098/8203 8213/8087/8195 +f 8222/8097/8202 8223/8099/8204 8221/8098/8203 +f 8225/8101/8206 8221/8098/8203 8224/8100/8205 +f 8210/8082/8190 8213/8087/8195 8225/8101/8206 +f 8226/8102/8207 8227/8103/8208 8071/7910/8051 +f 8224/8100/8205 8223/8099/8204 8227/8103/8208 +f 8223/8099/8204 8222/8097/8202 8228/8104/8209 +f 8227/8103/8208 8228/8104/8209 8056/7895/8036 +f 8219/8095/8200 8210/8105/8190 8229/8107/8210 +f 8229/8107/8210 8225/8106/8206 8226/8109/8207 +f 8163/8031/8143 8229/8107/8210 8070/8033/8050 +f 7331/7996/7312 8219/8095/8200 8163/8031/8143 +f 8230/8110/8211 8231/8112/8213 8204/8077/8185 +f 8232/8111/8212 8233/8113/8214 8231/8112/8213 +f 8233/8113/8214 8222/8097/8202 8220/8096/8201 +f 8231/8112/8213 8220/8096/8201 8205/8088/8196 +f 8161/8029/8141 8234/8114/8215 8196/8069/8177 +f 8156/8024/8136 8235/8115/8216 8234/8114/8215 +f 8235/8115/8216 8232/8111/8212 8230/8110/8211 +f 8234/8114/8215 8230/8110/8211 8197/8075/8183 +f 8155/8116/8217 8236/8117/8218 8235/8115/8216 +f 8154/8023/8135 8237/8118/8219 8236/8117/8218 +f 8237/8118/8219 8060/7898/8039 8238/8119/8220 +f 8236/8117/8218 8238/8119/8220 8232/8111/8212 +f 8075/7914/8055 8074/7913/8054 8240/8121/8222 +f 8240/8121/8222 8239/8120/8221 8242/8123/8224 +f 8107/7951/8085 8240/8121/8222 8109/7953/8087 +f 8076/7915/8056 8075/7914/8055 8107/7951/8085 +f 8243/8124/8225 8244/8125/8226 8153/8022/8134 +f 8241/8122/8223 8239/8120/8221 8244/8125/8226 +f 8239/8120/8221 8074/7913/8054 8245/8126/8227 +f 8154/8023/8135 8153/8022/8134 8245/8126/8227 +f 8061/7899/8040 8060/7898/8039 8246/8127/8228 +f 8246/8127/8228 8237/8118/8219 8245/8126/8227 +f 8072/7911/8052 8246/8127/8228 8074/7913/8054 +f 8054/7893/8034 8061/7899/8040 8072/7911/8052 +f 8238/8119/8220 8247/8128/8229 8233/8113/8214 +f 8060/7898/8039 8057/7896/8037 8247/8128/8229 +f 8057/7896/8037 8056/7895/8036 8228/8104/8209 +f 8247/8128/8229 8228/8104/8209 8222/8097/8202 +f 8248/8130/8230 8249/8132/8232 8117/8131/8096 +f 8250/6534/8231 8251/6546/8233 8249/8132/8232 +f 7456/7390/7436 8249/8132/8232 7453/6548/7431 +f 7308/8931/7287 8117/8131/8096 7456/7390/7436 +f 8255/8134/8237 8252/6528/8234 8254/8133/8236 +f 8254/8133/8236 8253/6530/8235 8248/8130/8230 +f 8113/8135/8092 8254/8133/8236 8114/8129/8095 +f 8105/8137/8090 8255/8134/8237 8113/8135/8092 +f 8259/8138/8241 8256/6552/8238 8258/8136/8240 +f 8258/8136/8240 8257/6553/8239 8255/8134/8237 +f 8104/8139/8082 8258/8136/8240 8105/8137/8090 +f 8103/8144/8080 8259/8138/8241 8104/8139/8082 +f 8260/8141/8242 8261/8143/8244 8110/8142/8088 +f 8262/6495/8243 8263/6549/8245 8261/8143/8244 +f 8263/6549/8245 8256/6552/8238 8259/8138/8241 +f 8261/8143/8244 8259/8138/8241 8103/8144/8080 +f 8242/8148/8224 8241/8145/8223 8265/8147/8247 +f 8265/8147/8247 8264/8146/8246 8267/6491/8249 +f 8267/6491/8249 8262/6495/8243 8260/8141/8242 +f 8109/8140/8087 8242/8148/8224 8260/8141/8242 +f 8243/8152/8225 8152/8149/8132 8269/8151/8251 +f 8269/8151/8251 8268/8150/8250 8271/6488/8253 +f 8264/8146/8246 8269/8151/8251 8266/6490/8248 +f 8241/8145/8223 8243/8152/8225 8264/8146/8246 +f 8149/8156/8130 8148/8153/8129 8273/8155/8255 +f 8273/8155/8255 8272/8154/8254 8275/6678/8257 +f 8268/8150/8250 8273/8155/8255 8270/6489/8252 +f 8152/8149/8132 8149/8156/8130 8268/8150/8250 +f 8158/8160/8138 8157/8157/8137 8277/8159/8259 +f 8277/8159/8259 8276/8158/8258 8279/6682/8261 +f 8272/8154/8254 8277/8159/8259 8274/6679/8256 +f 8148/8153/8129 8158/8160/8138 8272/8154/8254 +f 8281/6669/8263 8282/8162/8265 8283/8161/8264 +f 8278/6668/8260 8276/8158/8258 8282/8162/8265 +f 8276/8158/8258 8157/8157/8137 8193/8163/8174 +f 8282/8162/8265 8193/8163/8174 8188/8164/8168 +f 8187/8168/8167 8183/8165/8164 8285/8167/8267 +f 8285/8167/8267 8284/8166/8266 8287/6662/8269 +f 8283/8161/8264 8285/8167/8267 8280/6671/8262 +f 8188/8164/8168 8187/8168/8167 8283/8161/8264 +f 8182/8172/8163 8139/8169/8118 8289/8171/8271 +f 8289/8171/8271 8288/8170/8270 8291/6633/8273 +f 8284/8166/8266 8289/8171/8271 8286/6663/8268 +f 8183/8165/8164 8182/8172/8163 8284/8166/8266 +f 7502/7433/7482 7501/7433/7481 8293/8173/8275 +f 8290/6634/8272 8288/8170/8270 8293/8173/8275 +f 8288/8170/8270 8139/8169/8118 8138/8174/8117 +f 8293/8173/8275 8138/8174/8117 7339/8175/7319 +f 8297/8179/8280 8294/2879/8276 8296/8177/8278 +f 8298/8178/8279 8299/8323/8434 8296/8177/8278 +f 8296/8177/8278 8299/8323/8434 8300/8180/8281 +f 8304/8186/8287 8301/8181/8282 8303/8183/8284 +f 8303/8183/8284 8302/8182/8283 8306/8185/8286 +f 8307/8187/8288 8303/8183/8284 8300/8180/8281 +f 8308/8195/8297 8304/8186/8287 8307/8187/8288 +f 8309/8188/8289 8310/8190/8292 8311/2881/8290 +f 8310/8190/8292 8309/8188/8289 8312/8189/8291 +f 2856/2864/2833 8311/2881/8290 8312/8189/8291 +f 8309/8188/8289 8294/2879/8276 8313/8191/8293 +f 8313/8191/8293 8297/8179/8280 8306/8185/8286 +f 8313/8191/8293 8306/8185/8286 8305/8184/8285 +f 8312/8189/8291 8314/8192/8294 2857/2866/2835 +f 8305/8184/8285 8302/8182/8283 8314/8192/8294 +f 8302/8182/8283 8301/8181/8282 8315/8193/8295 +f 8314/8192/8294 8315/8193/8295 2858/2867/2836 +f 8315/8193/8295 8316/8194/8296 2859/2868/2837 +f 8316/8194/8296 8315/8193/8295 8304/8186/8287 +f 8317/8196/8298 8316/8194/8296 8308/8195/8297 +f 2766/2869/2838 2859/2868/2837 8317/8196/8298 +f 8319/8198/8300 8320/8202/8304 8321/8199/8301 +f 8320/8202/8304 8319/8198/8300 8323/8201/8303 +f 8323/8201/8303 8324/8218/8320 8325/8203/8305 +f 8320/8202/8304 8325/8203/8305 8326/8204/8306 +f 8328/8206/8308 8329/8209/8311 8330/8207/8309 +f 8331/8208/8310 8332/8210/8312 8329/8209/8311 +f 8332/8210/8312 8333/8287/8395 8334/8211/8313 +f 8329/8209/8311 8334/8211/8313 8335/8212/8314 +f 8339/8219/8321 8336/8213/8315 8338/8215/8317 +f 8340/8216/8318 8341/8217/8319 8338/8215/8317 +f 8323/8201/8303 8338/8215/8317 8324/8218/8320 +f 8338/8215/8317 8323/8201/8303 8322/8200/8302 +f 8344/8223/8325 8308/8195/8297 8343/8221/8323 +f 8343/8221/8323 8342/8220/8322 8339/8219/8321 +f 8339/8219/8321 8322/8200/8302 8345/8222/8324 +f 8343/8221/8323 8345/8222/8324 8346/8224/8326 +f 8348/8226/8328 8349/8228/8330 8350/8227/8329 +f 8336/8213/8315 8342/8220/8322 8349/8228/8330 +f 8342/8220/8322 8308/8195/8297 8307/8187/8288 +f 8300/8180/8281 8350/8227/8329 8307/8187/8288 +f 8354/8232/8334 8351/8229/8331 8353/8231/8333 +f 8353/8231/8333 8352/8230/8332 8337/8214/8316 +f 8337/8214/8316 8336/8213/8315 8348/8226/8328 +f 8353/8231/8333 8348/8226/8328 8347/8225/8327 +f 8341/8217/8319 8340/8216/8318 8355/8233/8335 +f 8355/8233/8335 8352/8230/8332 8356/8234/8336 +f 8358/8236/8338 8355/8233/8335 8357/8235/8337 +f 8324/8218/8320 8341/8217/8319 8358/8236/8338 +f 8356/8234/8336 8351/8229/8331 8360/8238/8340 +f 8360/8238/8340 8359/8237/8339 8362/8240/8342 +f 8364/8242/8344 8360/8238/8340 8363/8241/8343 +f 8357/8235/8337 8356/8234/8336 8364/8242/8344 +f 8366/8245/8347 8357/8235/8337 8365/8243/8345 +f 8365/8243/8345 8364/8242/8344 8367/8244/8346 +f 8330/8207/8309 8365/8243/8345 8327/8205/8307 +f 8335/8212/8314 8366/8245/8347 8330/8207/8309 +f 8325/8203/8305 8324/8218/8320 8368/8246/8348 +f 8368/8246/8348 8358/8236/8338 8366/8245/8347 +f 8369/8247/8349 8368/8246/8348 8335/8212/8314 +f 8326/8204/8306 8325/8203/8305 8369/8247/8349 +f 8373/8254/8356 8370/8248/8350 8372/8250/8352 +f 8374/8251/8353 8375/8252/8354 8372/8250/8352 +f 8377/8290/8398 8372/8250/8352 8376/8253/8355 +f 8372/8250/8352 8377/8290/8398 8378/8255/8357 +f 8380/8257/8359 8381/8259/8361 8382/8258/8360 +f 8381/8259/8361 8380/8257/8359 8373/8254/8356 +f 8373/8254/8356 8378/8255/8357 8383/8260/8362 +f 8381/8259/8361 8383/8260/8362 8384/8261/8363 +f 8386/8263/8365 8374/8251/8353 8385/8262/8364 +f 8385/8262/8364 8371/8249/8351 8380/8257/8359 +f 8387/8264/8366 8385/8262/8364 8379/8256/8358 +f 8388/8266/8370 8386/8263/8365 8387/8264/8366 +f 8390/8265/8368 8391/8267/8371 8392/2900/8369 +f 8388/8266/8370 8387/8264/8366 8391/8267/8371 +f 8387/8264/8366 8379/8256/8358 8393/8268/8372 +f 8391/8267/8371 8393/8268/8372 8394/2898/8373 +f 2824/2836/2805 2766/2869/2838 8395/8269/8374 +f 8395/8269/8374 8317/8196/8298 8344/8223/8325 +f 8344/8223/8325 8346/8224/8326 8396/8270/8375 +f 2822/2834/2803 2824/2836/2805 8396/8270/8375 +f 8400/8274/8379 8397/8271/8376 8399/8273/8378 +f 8399/8273/8378 8398/8272/8377 8345/8222/8324 +f 8319/8198/8300 8399/8273/8378 8322/8200/8302 +f 8318/8197/8299 8400/8274/8379 8319/8198/8300 +f 8398/8272/8377 8401/8275/8380 8396/8270/8375 +f 8397/8271/8376 8402/8276/8381 8401/8275/8380 +f 8402/8276/8381 2818/2829/2798 2820/2831/2800 +f 8401/8275/8380 2820/2831/2800 2822/2834/2803 +f 8404/8278/8385 8388/8266/8370 8403/8277/8382 +f 8403/8277/8382 8390/8265/8368 8405/2932/8383 +f 8407/2827/8386 8403/8277/8382 8406/2825/8384 +f 2818/2829/2798 8404/8278/8385 8407/2827/8386 +f 8402/8276/8381 8397/8271/8376 8409/8280/8388 +f 8374/8251/8353 8386/8263/8365 8409/8280/8388 +f 8386/8263/8365 8388/8266/8370 8404/8278/8385 +f 8409/8280/8388 8404/8278/8385 2818/2829/2798 +f 8375/8252/8354 8374/8251/8353 8410/8281/8389 +f 8410/8281/8389 8408/8279/8387 8400/8274/8379 +f 8411/8282/8390 8410/8281/8389 8318/8197/8299 +f 8376/8253/8355 8375/8252/8354 8411/8282/8390 +f 8413/8285/8393 8376/8253/8355 8412/8283/8391 +f 8412/8283/8391 8411/8282/8390 8321/8199/8301 +f 8321/8199/8301 8326/8204/8306 8414/8284/8392 +f 8412/8283/8391 8414/8284/8392 8415/8286/8394 +f 8334/8211/8313 8333/8287/8395 8417/8289/8397 +f 8417/8289/8397 8416/8288/8396 8414/8284/8392 +f 8369/8247/8349 8417/8289/8397 8326/8204/8306 +f 8335/8212/8314 8334/8211/8313 8369/8247/8349 +f 8419/8292/8400 8378/8255/8357 8418/8291/8399 +f 8418/8291/8399 8377/8290/8398 8413/8285/8393 +f 8416/8288/8396 8418/8291/8399 8415/8286/8394 +f 8333/8287/8395 8419/8292/8400 8416/8288/8396 +f 8420/8293/8401 8421/8294/8402 8332/8210/8312 +f 8384/8261/8363 8383/8260/8362 8421/8294/8402 +f 8383/8260/8362 8378/8255/8357 8419/8292/8400 +f 8421/8294/8402 8419/8292/8400 8333/8287/8395 +f 8420/8293/8401 8422/8296/8404 8423/8295/8403 +f 8331/8208/8310 8328/8206/8308 8422/8296/8404 +f 8424/8302/8410 8422/8296/8404 8327/8205/8307 +f 8422/8296/8404 8424/8302/8410 8425/8297/8405 +f 8367/8244/8346 8363/8241/8343 8427/8299/8407 +f 8427/8299/8407 8426/8298/8406 8429/8301/8409 +f 8429/8301/8409 8425/8297/8405 8424/8302/8410 +f 8327/8205/8307 8367/8244/8346 8424/8302/8410 +f 8431/8304/8412 8432/8306/8415 8433/8305/8413 +f 8432/8306/8415 8431/8304/8412 8295/8176/8277 +f 8295/8176/8277 8294/2879/8276 8432/8306/8415 +f 8435/2909/8438 8433/8305/8413 8434/2911/8414 +f 8439/8310/8421 8436/8307/8416 8438/8309/8418 +f 8438/8309/8418 8437/8308/8417 8441/2925/8420 +f 8441/2925/8420 8394/2898/8373 8393/8268/8372 +f 8379/8256/8358 8439/8310/8421 8393/8268/8372 +f 8382/8258/8360 8442/8311/8422 8439/8310/8421 +f 8384/8261/8363 8423/8295/8403 8442/8311/8422 +f 8423/8295/8403 8425/8297/8405 8443/8312/8423 +f 8436/8307/8416 8439/8310/8421 8443/8312/8423 +f 8443/8312/8423 8425/8297/8405 8444/8313/8424 +f 8444/8313/8424 8429/8301/8409 8445/8314/8425 +f 8445/8314/8425 8430/8303/8411 8446/8315/8426 +f 8444/8313/8424 8446/8315/8426 8436/8307/8416 +f 8362/8240/8342 8447/8316/8427 8426/8298/8406 +f 8361/8239/8341 8448/8317/8428 8447/8316/8427 +f 8448/8317/8428 8449/8319/8430 8450/8318/8429 +f 8447/8316/8427 8450/8318/8429 8428/8300/8408 +f 8448/8317/8428 8451/8321/8432 8452/8320/8431 +f 8361/8239/8341 8359/8237/8339 8451/8321/8432 +f 8359/8237/8339 8351/8229/8331 8354/8232/8334 +f 8347/8225/8327 8452/8320/8431 8354/8232/8334 +f 8453/8322/8433 8454/8324/8435 8299/8323/8434 +f 8449/8319/8430 8452/8320/8431 8454/8324/8435 +f 8452/8320/8431 8347/8225/8327 8350/8227/8329 +f 8454/8324/8435 8350/8227/8329 8300/8180/8281 +f 8450/8318/8429 8455/8325/8436 8445/8314/8425 +f 8449/8319/8430 8453/8322/8433 8455/8325/8436 +f 8453/8322/8433 8298/8178/8279 8431/8304/8412 +f 8455/8325/8436 8431/8304/8412 8430/8303/8411 +f 8446/8315/8426 8456/8326/8437 8437/8308/8417 +f 8430/8303/8411 8433/8305/8413 8456/8326/8437 +f 8457/2922/8439 8456/8326/8437 8435/2909/8438 +f 8440/2920/8419 8437/8308/8417 8457/2922/8439 +f 8461/8331/8444 8458/8327/8440 8460/8329/8442 +f 8460/8329/8442 8459/8328/8441 8462/8330/8443 +f 8463/8332/8445 8461/8331/8444 8462/8330/8443 +f 8464/8333/8446 8465/8336/8449 8466/8334/8447 +f 8467/8335/8448 8468/8337/8450 8465/8336/8449 +f 8470/8339/8452 8465/8336/8449 8469/8338/8451 +f 8471/8346/8459 8466/8334/8447 8470/8339/8452 +f 8474/8342/8455 8467/8335/8448 8473/8341/8454 +f 8473/8341/8454 8472/8340/8453 3869/3872/3841 +f 8473/8341/8454 3869/3872/3841 3860/3862/3831 +f 8464/8333/8446 8463/8332/8445 8475/8343/8456 +f 8475/8343/8456 8462/8330/8443 8472/8340/8453 +f 8475/8343/8456 8472/8340/8453 8467/8335/8448 +f 8477/8345/8458 8469/8338/8451 8476/8344/8457 +f 8476/8344/8457 8468/8337/8450 8474/8342/8455 +f 3857/3860/3829 8476/8344/8457 3860/3862/3831 +f 3856/3859/3828 8477/8345/8458 3857/3860/3829 +f 8470/8339/8452 8478/8348/8461 8479/8347/8460 +f 8469/8338/8451 8477/8345/8458 8478/8348/8461 +f 8477/8345/8458 3856/3859/3828 3859/3861/3830 +f 8478/8348/8461 3859/3861/3830 3770/3835/3804 +f 8483/8355/8468 8480/8349/8462 8482/8351/8464 +f 8484/8352/8465 8485/8353/8466 8482/8351/8464 +f 8485/8353/8466 8486/8434/8547 8487/8354/8467 +f 8488/8397/8510 8483/8355/8468 8487/8354/8467 +f 8492/8362/8475 8489/8356/8469 8491/8358/8471 +f 8491/8358/8471 8490/8357/8470 8494/8360/8473 +f 8496/8363/8476 8491/8358/8471 8495/8361/8474 +f 8497/8394/8507 8492/8362/8475 8496/8363/8476 +f 8498/8364/8477 8499/8367/8480 8481/8350/8463 +f 8499/8367/8480 8498/8364/8477 8501/8366/8479 +f 8501/8366/8479 8502/8370/8483 8503/8368/8481 +f 8484/8352/8465 8481/8350/8463 8503/8368/8481 +f 8503/8368/8481 8504/8371/8484 8505/8369/8482 +f 8502/8370/8483 8506/8372/8485 8504/8371/8484 +f 8506/8372/8485 8471/8346/8459 8507/8373/8486 +f 8508/8419/8532 8505/8369/8482 8507/8373/8486 +f 8466/8334/8447 8471/8346/8459 8509/8374/8487 +f 8509/8374/8487 8506/8372/8485 8510/8375/8488 +f 8512/8477/8590 8509/8374/8487 8511/8376/8489 +f 8509/8374/8487 8512/8477/8590 8463/8332/8445 +f 8510/8375/8488 8502/8370/8483 8513/8377/8490 +f 8500/8365/8478 8514/8378/8491 8513/8377/8490 +f 8514/8378/8491 8515/8383/8496 8516/8379/8492 +f 8511/8376/8489 8510/8375/8488 8516/8379/8492 +f 8518/8381/8494 8519/8384/8497 8520/8382/8495 +f 8515/8383/8496 8514/8378/8491 8519/8384/8497 +f 8498/8364/8477 8519/8384/8497 8500/8365/8478 +f 8519/8384/8497 8498/8364/8477 8480/8349/8462 +f 8522/8386/8499 8523/8389/8502 8524/8387/8500 +f 8525/8388/8501 8526/8390/8503 8523/8389/8502 +f 8526/8390/8503 8515/8383/8496 8518/8381/8494 +f 8523/8389/8502 8518/8381/8494 8517/8380/8493 +f 8527/8391/8504 8528/8392/8505 8496/8363/8476 +f 8521/8385/8498 8524/8387/8500 8528/8392/8505 +f 8524/8387/8500 8517/8380/8493 8529/8393/8506 +f 8528/8392/8505 8529/8393/8506 8497/8394/8507 +f 8529/8393/8506 8530/8396/8509 8531/8395/8508 +f 8517/8380/8493 8520/8382/8495 8530/8396/8509 +f 8520/8382/8495 8480/8349/8462 8483/8355/8468 +f 8530/8396/8509 8483/8355/8468 8488/8397/8510 +f 8533/8399/8512 8534/8403/8516 8535/8400/8513 +f 8534/8403/8516 8533/8399/8512 8537/8402/8515 +f 8539/8405/8518 8534/8403/8516 8538/8404/8517 +f 8540/8406/8519 8535/8400/8513 8539/8405/8518 +f 8542/8410/8523 8540/8406/8519 8541/8407/8520 +f 8541/8407/8520 8539/8405/8518 8543/8408/8521 +f 8545/8411/8524 8541/8407/8520 8544/8409/8522 +f 8546/8445/8558 8542/8410/8523 8545/8411/8524 +f 8543/8408/8521 8547/8413/8526 8548/8412/8525 +f 8538/8404/8517 8537/8402/8515 8547/8413/8526 +f 8549/8430/8543 8547/8413/8526 8536/8401/8514 +f 8547/8413/8526 8549/8430/8543 8550/8414/8527 +f 8552/8418/8531 8544/8409/8522 8551/8415/8528 +f 8551/8415/8528 8548/8412/8525 8553/8416/8529 +f 3898/3902/3871 8551/8415/8528 3899/8417/8530 +f 3897/3900/3869 8552/8418/8531 3898/3902/3871 +f 8507/8373/8486 8554/8421/8534 8555/8420/8533 +f 8471/8346/8459 8479/8347/8460 8554/8421/8534 +f 8479/8347/8460 3770/3835/3804 3828/3834/3803 +f 8554/8421/8534 3828/3834/3803 3826/8422/8535 +f 8505/8369/8482 8556/8423/8536 8485/8353/8466 +f 8508/8419/8532 8557/8424/8537 8556/8423/8536 +f 8557/8424/8537 8558/8428/8541 8559/8425/8538 +f 8486/8434/8547 8485/8353/8466 8559/8425/8538 +f 3825/3831/3800 3822/3829/3798 8561/8427/8540 +f 8558/8428/8541 8557/8424/8537 8561/8427/8540 +f 8555/8420/8533 8561/8427/8540 8508/8419/8532 +f 3826/8422/8535 3825/3831/3800 8555/8420/8533 +f 3926/3929/3898 8562/8429/8542 3821/3827/3796 +f 8562/8429/8542 3926/3929/3898 8553/8416/8529 +f 8563/8433/8546 8562/8429/8542 8550/8414/8527 +f 8562/8429/8542 8563/8433/8546 3822/3829/3798 +f 8563/8433/8546 8550/8414/8527 8564/8431/8544 +f 8536/8401/8514 8565/8432/8545 8564/8431/8544 +f 8565/8432/8545 8558/8428/8541 8560/8426/8539 +f 3822/3829/3798 8563/8433/8546 8560/8426/8539 +f 8559/8425/8538 8566/8436/8549 8567/8435/8548 +f 8558/8428/8541 8565/8432/8545 8566/8436/8549 +f 8565/8432/8545 8536/8401/8514 8533/8399/8512 +f 8566/8436/8549 8533/8399/8512 8532/8398/8511 +f 8569/8438/8551 8488/8397/8510 8568/8437/8550 +f 8486/8434/8547 8567/8435/8548 8568/8437/8550 +f 8570/8439/8552 8568/8437/8550 8532/8398/8511 +f 8571/8440/8553 8569/8438/8551 8570/8439/8552 +f 8569/8438/8551 8572/8441/8554 8531/8395/8508 +f 8571/8440/8553 8573/8442/8555 8572/8441/8554 +f 8573/8442/8555 8489/8356/8469 8492/8362/8475 +f 8572/8441/8554 8492/8362/8475 8497/8394/8507 +f 8570/8439/8552 8574/8443/8556 8573/8442/8555 +f 8532/8398/8511 8535/8400/8513 8574/8443/8556 +f 8575/8444/8557 8574/8443/8556 8540/8406/8519 +f 8574/8443/8556 8575/8444/8557 8489/8356/8469 +f 8542/8410/8523 8576/8446/8559 8575/8444/8557 +f 8546/8445/8558 8577/8447/8560 8576/8446/8559 +f 8577/8447/8560 8493/8359/8472 8490/8357/8470 +f 8489/8356/8469 8575/8444/8557 8490/8357/8470 +f 8494/8360/8473 8578/8449/8562 8579/8448/8561 +f 8493/8359/8472 8577/8447/8560 8578/8449/8562 +f 8577/8447/8560 8546/8445/8558 8580/8450/8563 +f 8578/8449/8562 8580/8450/8563 8581/8451/8564 +f 8582/8452/8565 8583/8454/8567 8579/8448/8561 +f 8584/8453/8566 8585/8455/8568 8583/8454/8567 +f 8585/8455/8568 8521/8385/8498 8527/8391/8504 +f 8583/8454/8567 8527/8391/8504 8495/8361/8474 +f 3900/3903/3872 3871/3873/3842 8586/8456/8569 +f 8586/8456/8569 8459/8328/8441 8587/8457/8570 +f 8589/8459/8572 8586/8456/8569 8588/8458/8571 +f 3902/3904/3873 3900/3903/3872 8589/8459/8572 +f 3920/3924/3893 8590/8460/8573 8552/8418/8531 +f 3916/3918/3887 8591/8461/8574 8590/8460/8573 +f 8593/8463/8576 8590/8460/8573 8592/8462/8575 +f 8544/8409/8522 8552/8418/8531 8593/8463/8576 +f 8580/8450/8563 8594/8465/8578 8595/8464/8577 +f 8546/8445/8558 8545/8411/8524 8594/8465/8578 +f 8545/8411/8524 8544/8409/8522 8593/8463/8576 +f 8594/8465/8578 8593/8463/8576 8592/8462/8575 +f 8598/8468/8581 8588/8458/8571 8597/8467/8580 +f 8597/8467/8580 8596/8466/8579 8582/8452/8565 +f 8595/8464/8577 8597/8467/8580 8581/8451/8564 +f 8592/8462/8575 8598/8468/8581 8595/8464/8577 +f 8600/8470/8583 8601/8472/8585 8602/8471/8584 +f 8601/8472/8585 8600/8470/8583 8522/8386/8499 +f 8585/8455/8568 8601/8472/8585 8521/8385/8498 +f 8584/8453/8566 8602/8471/8584 8585/8455/8568 +f 8516/8379/8492 8515/8383/8496 8603/8473/8586 +f 8603/8473/8586 8526/8390/8503 8600/8470/8583 +f 8604/8474/8587 8603/8473/8586 8599/8469/8582 +f 8511/8376/8489 8516/8379/8492 8604/8474/8587 +f 8512/8477/8590 8511/8376/8489 8605/8475/8588 +f 8605/8475/8588 8604/8474/8587 8606/8476/8589 +f 8461/8331/8444 8605/8475/8588 8458/8327/8440 +f 8463/8332/8445 8512/8477/8590 8461/8331/8444 +f 8606/8476/8589 8607/8478/8591 8587/8457/8570 +f 8599/8469/8582 8602/8471/8584 8607/8478/8591 +f 8596/8466/8579 8607/8478/8591 8584/8453/8566 +f 8607/8478/8591 8596/8466/8579 8588/8458/8571 +f 3914/3917/3886 3902/3904/3873 8608/8479/8592 +f 8608/8479/8592 8589/8459/8572 8598/8468/8581 +f 8598/8468/8581 8592/8462/8575 8591/8461/8574 +f 3916/3918/3887 3914/3917/3886 8591/8461/8574 +f 8610/8481/8594 8611/8484/8597 8612/8482/8595 +f 8613/8483/8596 8614/8485/8598 8611/8484/8597 +f 8616/8487/8600 8611/8484/8597 8615/8486/8599 +f 8617/8493/8606 8612/8482/8595 8616/8487/8600 +f 8618/8488/8601 8619/8490/8603 8616/8487/8600 +f 8620/8489/8602 8621/8491/8604 8619/8490/8603 +f 8621/8491/8604 8622/8503/8618 8623/8492/8605 +f 8619/8490/8603 8623/8492/8605 8617/8493/8606 +f 8627/8498/8613 8624/8494/8607 8626/8496/8609 +f 8628/6236/8610 8629/6240/8611 8626/8496/8609 +f 8629/6240/8611 4347/4360/4330 8630/8497/8612 +f 8626/8496/8609 8630/8497/8612 8631/8499/8614 +f 8632/8500/8615 8633/8501/8616 8621/8491/8604 +f 8624/8494/8607 8627/8498/8613 8633/8501/8616 +f 8627/8498/8613 8631/8499/8614 8634/8502/8617 +f 8633/8501/8616 8634/8502/8617 8622/8503/8618 +f 8625/8495/8608 8624/8494/8607 8636/8505/8620 +f 8636/8505/8620 8635/8504/8619 8638/6974/8622 +f 8640/6244/9080 8636/8505/8620 8639/6242/8623 +f 8636/8505/8620 8640/6244/9080 8628/6236/8610 +f 8641/8506/8624 8642/8507/8626 8632/8500/8615 +f 8643/6935/8625 8644/6934/8627 8642/8507/8626 +f 8644/6934/8627 8637/6932/8621 8635/8504/8619 +f 8642/8507/8626 8635/8504/8619 8624/8494/8607 +f 8645/8508/8628 8646/8509/8631 8618/8488/8601 +f 8646/8509/8631 8645/8508/8628 8648/7029/8630 +f 8641/8506/8624 8646/8509/8631 8643/6935/8625 +f 8646/8509/8631 8641/8506/8624 8620/8489/8602 +f 8614/8485/8598 8613/8483/8596 8650/8511/8633 +f 8650/8511/8633 8649/8510/8632 8652/7025/8635 +f 8645/8508/8628 8650/8511/8633 8647/7030/8629 +f 8650/8511/8633 8645/8508/8628 8615/8486/8599 +f 8656/8515/8642 8653/8512/8636 8655/8513/8638 +f 8655/8513/8638 8654/6258/8637 8658/6978/8640 +f 8658/6978/8640 8659/7053/8647 8660/8514/8641 +f 8661/8519/8646 8656/8515/8642 8660/8514/8641 +f 8665/8520/8648 8662/8516/8643 8664/8518/8645 +f 8661/8519/8646 8660/8514/8641 8664/8518/8645 +f 8666/7052/8649 8664/8518/8645 8659/7053/8647 +f 8667/7013/8651 8665/8520/8648 8666/7052/8649 +f 8665/8520/8648 8668/8522/8652 8669/8521/8650 +f 8667/7013/8651 8670/7019/8653 8668/8522/8652 +f 8670/7019/8653 8651/7020/8634 8649/8510/8632 +f 8668/8522/8652 8649/8510/8632 8613/8483/8596 +f 8671/8523/8654 8672/8525/8656 8610/8481/8594 +f 8673/8524/8655 8674/8526/8657 8672/8525/8656 +f 8674/8526/8657 8662/8516/8643 8669/8521/8650 +f 8672/8525/8656 8669/8521/8650 8613/8483/8596 +f 8676/8528/8660 4357/4421/4391 8675/8527/8658 +f 4355/4367/4337 8677/6262/8659 8675/8527/8658 +f 8677/6262/8659 8653/8512/8636 8656/8515/8642 +f 8675/8527/8658 8656/8515/8642 8661/8519/8646 +f 8678/8529/8661 8679/8530/8662 8674/8526/8657 +f 4357/4421/4391 8676/8528/8660 8679/8530/8662 +f 8676/8528/8660 8661/8519/8646 8663/8517/8644 +f 8679/8530/8662 8663/8517/8644 8662/8516/8643 +f 4416/4428/4398 8680/8532/8664 8681/8531/8663 +f 4412/4423/4393 8682/8533/8665 8680/8532/8664 +f 8682/8533/8665 8673/8524/8655 8671/8523/8654 +f 8609/8480/8593 8681/8531/8663 8680/8532/8664 +f 8682/8533/8665 4412/4423/4393 8683/8534/8666 +f 4357/4421/4391 8678/8529/8661 8683/8534/8666 +f 8673/8524/8655 8682/8533/8665 8678/8529/8661 +f 8685/8536/8668 4422/4435/4405 8684/8535/8667 +f 8684/8535/8667 4420/4433/4403 8681/8531/8663 +f 8681/8531/8663 8609/8480/8593 8684/8535/8667 +f 8684/8535/8667 8612/8482/8595 8617/8493/8606 +f 8687/8538/8670 4426/4438/4408 8686/8537/8669 +f 8686/8537/8669 4424/4437/4407 8685/8536/8668 +f 8685/8536/8668 8617/8493/8606 8623/8492/8605 +f 8622/8503/8618 8687/8538/8670 8623/8492/8605 +f 4431/4444/4414 8688/8540/8672 8689/8539/8671 +f 4426/4438/4408 8687/8538/8670 8688/8540/8672 +f 8687/8538/8670 8622/8503/8618 8634/8502/8617 +f 8688/8540/8672 8634/8502/8617 8631/8499/8614 +f 4432/4445/4415 8690/8541/8673 8630/8497/8612 +f 4428/4441/4411 8689/8539/8671 8690/8541/8673 +f 8631/8499/8614 8630/8497/8612 8689/8539/8671 +f 8692/8543/8675 8693/8546/8678 8694/8544/8676 +f 8695/8545/8677 8696/8547/8679 8693/8546/8678 +f 8698/8549/8681 8693/8546/8678 8697/8548/8680 +f 8699/8556/8688 8694/8544/8676 8698/8549/8681 +f 8701/8551/8683 8702/8555/8687 8703/8552/8684 +f 8702/8555/8687 8701/8551/8683 8705/8554/8686 +f 8694/8544/8676 8702/8555/8687 8691/8542/8674 +f 8702/8555/8687 8694/8544/8676 8699/8556/8688 +f 8708/8560/8694 5106/5117/5088 8707/8557/8690 +f 8707/8557/8690 8706/6378/8689 8710/8558/8692 +f 8710/8558/8692 8711/8563/8697 8712/8559/8693 +f 8713/8561/8695 8708/8560/8694 8712/8559/8693 +f 8715/8565/8699 8713/8561/8695 8714/8562/8696 +f 8711/8563/8697 8716/8564/8698 8714/8562/8696 +f 8701/8551/8683 8714/8562/8696 8704/8553/8685 +f 8714/8562/8696 8701/8551/8683 8700/8550/8682 +f 8718/7713/8701 8719/8567/8704 8720/8566/8702 +f 8721/7672/8703 8722/8568/8705 8719/8567/8704 +f 8722/8568/8705 8711/8563/8697 8710/8558/8692 +f 8719/8567/8704 8710/8558/8692 8709/6377/8691 +f 8723/7670/8706 8724/8569/8708 8722/8568/8705 +f 8725/7669/8707 8726/8570/8709 8724/8569/8708 +f 8716/8564/8698 8724/8569/8708 8704/8553/8685 +f 8724/8569/8708 8716/8564/8698 8711/8563/8697 +f 8727/7772/8710 8728/8571/8712 8726/8570/8709 +f 8729/7771/8711 8730/8572/8713 8728/8571/8712 +f 8730/8572/8713 8691/8542/8674 8705/8554/8686 +f 8704/8553/8685 8726/8570/8709 8705/8554/8686 +f 8730/8572/8713 8729/7771/8711 8732/8573/8715 +f 8732/8573/8715 8731/7770/8714 8734/8574/8717 +f 8692/8543/8675 8732/8573/8715 8695/8545/8677 +f 8691/8542/8674 8730/8572/8713 8692/8543/8675 +f 8736/7719/8719 8737/8576/8722 8738/8575/8720 +f 8739/6394/8721 8740/6392/8723 8737/8576/8722 +f 8740/6392/8723 8741/6391/8739 8742/8577/8724 +f 8737/8576/8722 8742/8577/8724 8743/8578/8725 +f 8738/8575/8720 8744/8580/8728 8745/7796/8726 +f 8744/8580/8728 8738/8575/8720 8746/8579/8727 +f 8746/8579/8727 8747/8583/8733 8748/8581/8729 +f 8744/8580/8728 8748/8581/8729 8749/7762/8730 +f 8734/8574/8717 8733/7768/8716 8751/8582/8732 +f 8751/8582/8732 8750/7764/8731 8748/8581/8729 +f 8752/8584/8734 8751/8582/8732 8747/8583/8733 +f 8695/8545/8677 8734/8574/8717 8752/8584/8734 +f 8753/8585/8735 8754/8588/8738 8752/8584/8734 +f 8754/8588/8738 8753/8585/8735 8756/8587/8737 +f 8696/8547/8679 8754/8588/8738 8697/8548/8680 +f 8754/8588/8738 8696/8547/8679 8695/8545/8677 +f 8742/8577/8724 8741/6391/8739 8758/8589/8741 +f 8758/8589/8741 8757/6399/8740 5115/5129/5100 +f 5115/5129/5100 5120/5182/5153 8759/8590/8743 +f 8743/8578/8725 8742/8577/8724 8759/8590/8743 +f 8746/8579/8727 8743/8578/8725 8760/8591/8744 +f 8760/8591/8744 8759/8590/8743 8761/8592/8745 +f 8753/8585/8735 8760/8591/8744 8755/8586/8736 +f 8747/8583/8733 8746/8579/8727 8753/8585/8735 +f 8756/8587/8737 8755/8586/8736 8763/8594/8747 +f 5177/5188/5159 5182/5194/5165 8763/8594/8747 +f 8764/8595/8748 8763/8594/8747 5181/5192/5163 +f 8697/8548/8680 8756/8587/8737 8764/8595/8748 +f 8761/8592/8745 5120/5182/5153 8765/8596/8749 +f 8765/8596/8749 5178/5190/5161 8762/8593/8746 +f 8765/8596/8749 8762/8593/8746 8755/8586/8736 +f 8764/8595/8748 8766/8597/8750 8698/8549/8681 +f 5181/5192/5163 5186/5198/5169 8766/8597/8750 +f 5186/5198/5169 5185/5197/5168 8767/8598/8751 +f 8766/8597/8750 8767/8598/8751 8699/8556/8688 +f 8767/8598/8751 8768/8599/8752 8703/8552/8684 +f 5185/5197/5168 5190/5202/5173 8768/8599/8752 +f 5190/5202/5173 5189/5200/5171 8769/8600/8753 +f 8768/8599/8752 8769/8600/8753 8700/8550/8682 +f 8769/8600/8753 8770/8601/8754 8715/8565/8699 +f 5189/5200/5171 5194/5206/5177 8770/8601/8754 +f 5194/5206/5177 5193/5205/5176 8771/8602/8755 +f 8713/8561/8695 8715/8565/8699 8771/8602/8755 +f 5195/5207/5178 8772/8603/8756 8771/8602/8755 +f 5106/5117/5088 8708/8560/8694 8772/8603/8756 +f 8772/8603/8756 8708/8560/8694 8713/8561/8695 +f 8774/8605/8758 8775/8608/8761 8776/8606/8759 +f 8777/8607/8760 8778/8609/8762 8775/8608/8761 +f 8778/8609/8762 4485/4496/4466 4490/4502/4472 +f 8775/8608/8761 4490/4502/4472 4489/4501/4471 +f 8778/8609/8762 8779/8611/8764 4486/4497/4467 +f 8779/8611/8764 8778/8609/8762 8780/8610/8763 +f 8782/8613/8766 8779/8611/8764 8781/8612/8765 +f 4487/4499/4469 4486/4497/4467 8782/8613/8766 +f 4690/4699/4670 8783/8615/8768 8784/8614/8767 +f 4674/4682/4653 4672/4680/4651 8783/8615/8768 +f 4672/4680/4651 4670/4678/4649 8785/8616/8769 +f 8783/8615/8768 8785/8616/8769 8786/8617/8770 +f 4591/4599/4569 8787/8619/8772 8788/8618/8771 +f 4587/4598/4568 8789/8620/8773 8787/8619/8772 +f 8789/8620/8773 8790/8623/8776 8791/8621/8774 +f 8787/8619/8772 8791/8621/8774 8792/8622/8775 +f 8794/8625/8778 8790/8623/8776 8793/8624/8777 +f 8793/8624/8777 8789/8620/8773 4586/4594/4564 +f 4586/4594/4564 4487/4499/4469 8782/8613/8766 +f 8793/8624/8777 8782/8613/8766 8781/8612/8765 +f 8796/8627/8780 8797/8629/8782 8798/8628/8781 +f 8773/8604/8757 8776/8606/8759 8797/8629/8782 +f 8776/8606/8759 4489/4501/4471 4516/4525/4495 +f 4515/4524/4494 8798/8628/8781 4516/4525/4495 +f 8802/8633/8786 8799/8630/8783 8801/8632/8785 +f 8795/8626/8779 8798/8628/8781 8801/8632/8785 +f 4518/4528/4498 8801/8632/8785 4515/4524/4494 +f 8801/8632/8785 4518/4528/4498 4517/4527/4497 +f 8804/8635/8788 8805/8637/8790 8806/8636/8789 +f 4666/4673/4644 4664/4672/4643 8805/8637/8790 +f 4664/4672/4643 4592/4600/4570 8788/8618/8771 +f 8792/8622/8775 8806/8636/8789 8788/8618/8771 +f 8785/8616/8769 4670/4678/4649 8807/8638/8791 +f 8807/8638/8791 4668/4676/4647 8804/8635/8788 +f 8808/8639/8792 8807/8638/8791 8803/8634/8787 +f 8786/8617/8770 8785/8616/8769 8808/8639/8792 +f 8784/8614/8767 8786/8617/8770 8810/8641/8794 +f 8810/8641/8794 8809/8640/8793 8802/8633/8786 +f 8802/8633/8786 4517/4527/4497 4681/4689/4660 +f 8810/8641/8794 4681/4689/4660 4680/4688/4659 +f 8812/8643/8796 8813/8647/8800 8814/8644/8797 +f 8813/8647/8800 8812/8643/8796 8816/8646/8799 +f 8818/8701/8854 8813/8647/8800 8817/8648/8801 +f 8813/8647/8800 8818/8701/8854 8819/8649/8802 +f 8823/8656/8809 8820/8650/8803 8822/8652/8805 +f 8822/8652/8805 8821/8651/8804 8825/8654/8807 +f 8827/8657/8810 8822/8652/8805 8826/8655/8808 +f 8828/8690/8843 8823/8656/8809 8827/8657/8810 +f 8832/8664/8817 8829/8658/8811 8831/8660/8813 +f 8831/8660/8813 8830/8659/8812 8834/8662/8815 +f 8836/8665/8818 8831/8660/8813 8835/8663/8816 +f 8837/8694/8847 8832/8664/8817 8836/8665/8818 +f 8834/8662/8815 8838/8667/8820 8839/8666/8819 +f 8833/8661/8814 8840/8668/8821 8838/8667/8820 +f 8821/8651/8804 8838/8667/8820 8824/8653/8806 +f 8820/8650/8803 8839/8666/8819 8821/8651/8804 +f 8816/8646/8799 8841/8670/8823 8842/8669/8822 +f 8815/8645/8798 8843/8671/8824 8841/8670/8823 +f 8843/8671/8824 8844/8674/8827 8845/8672/8825 +f 8841/8670/8823 8845/8672/8825 8846/8673/8826 +f 8847/8675/8828 8848/8676/8829 8845/8672/8825 +f 8848/8676/8829 8847/8675/8828 8832/8664/8817 +f 8832/8664/8817 8837/8694/8847 8849/8677/8830 +f 8848/8676/8829 8849/8677/8830 8846/8673/8826 +f 8851/8679/8832 8852/8681/8834 8853/8680/8833 +f 8811/8642/8795 8814/8644/8797 8852/8681/8834 +f 8814/8644/8797 8819/8649/8802 8854/8682/8835 +f 8852/8681/8834 8854/8682/8835 8855/8683/8836 +f 8857/8685/8838 8858/8687/8840 8859/8686/8839 +f 8850/8678/8831 8853/8680/8833 8858/8687/8840 +f 8853/8680/8833 8855/8683/8836 8860/8688/8841 +f 8858/8687/8840 8860/8688/8841 8861/8689/8842 +f 8827/8657/8810 8862/8692/8845 8863/8691/8844 +f 8826/8655/8808 8864/8693/8846 8862/8692/8845 +f 8859/8686/8839 8862/8692/8845 8856/8684/8837 +f 8862/8692/8845 8859/8686/8839 8861/8689/8842 +f 8836/8665/8818 8865/8696/8849 8866/8695/8848 +f 8865/8696/8849 8836/8665/8818 8839/8666/8819 +f 8839/8666/8819 8820/8650/8803 8823/8656/8809 +f 8828/8690/8843 8866/8695/8848 8823/8656/8809 +f 8867/8697/8850 8868/8698/8851 8863/8691/8844 +f 8846/8673/8826 8849/8677/8830 8868/8698/8851 +f 8866/8695/8848 8868/8698/8851 8837/8694/8847 +f 8828/8690/8843 8863/8691/8844 8866/8695/8848 +f 8854/8682/8835 8869/8699/8852 8860/8688/8841 +f 8819/8649/8802 8870/8700/8853 8869/8699/8852 +f 8867/8697/8850 8869/8699/8852 8846/8673/8826 +f 8869/8699/8852 8867/8697/8850 8861/8689/8842 +f 8818/8701/8854 8871/8702/8855 8870/8700/8853 +f 8871/8702/8855 8818/8701/8854 8842/8669/8822 +f 8871/8702/8855 8842/8669/8822 8846/8673/8826 +f 8872/8703/8856 8873/8705/8858 8843/8671/8824 +f 8874/8704/8857 8875/8706/8859 8873/8705/8858 +f 8877/8708/8861 8873/8705/8858 8876/8707/8860 +f 8844/8674/8827 8843/8671/8824 8877/8708/8861 +f 8878/8709/8862 8879/8710/8863 8875/8706/8859 +f 8879/8710/8863 8878/8709/8862 8780/8610/8763 +f 8880/8755/8908 8879/8710/8863 8777/8607/8760 +f 8879/8710/8863 8880/8755/8908 8876/8707/8860 +f 8881/8711/8864 8882/8713/8866 8812/8643/8796 +f 8883/8712/8865 8884/8714/8867 8882/8713/8866 +f 8884/8714/8867 8874/8704/8857 8872/8703/8856 +f 8882/8713/8866 8872/8703/8856 8815/8645/8798 +f 8885/8715/8868 8886/8716/8869 8884/8714/8867 +f 8886/8716/8869 8885/8715/8868 8794/8625/8778 +f 8794/8625/8778 8781/8612/8765 8878/8709/8862 +f 8886/8716/8869 8878/8709/8862 8874/8704/8857 +f 8851/8679/8832 8850/8678/8831 8888/8718/8871 +f 8888/8718/8871 8887/8717/8870 8890/8720/8873 +f 8890/8720/8873 8883/8712/8865 8881/8711/8864 +f 8811/8642/8795 8851/8679/8832 8881/8711/8864 +f 8890/8720/8873 8889/8719/8872 8892/8722/8875 +f 8892/8722/8875 8891/8721/8874 8791/8621/8774 +f 8885/8715/8868 8892/8722/8875 8790/8623/8776 +f 8883/8712/8865 8890/8720/8873 8885/8715/8868 +f 8857/8685/8838 8856/8684/8837 8894/8724/8877 +f 8894/8724/8877 8893/8723/8876 8896/8726/8879 +f 8887/8717/8870 8894/8724/8877 8889/8719/8872 +f 8850/8678/8831 8857/8685/8838 8887/8717/8870 +f 8896/8726/8879 8895/8725/8878 8898/8728/8881 +f 8898/8728/8881 8897/8727/8880 8806/8636/8789 +f 8891/8721/8874 8898/8728/8881 8792/8622/8775 +f 8889/8719/8872 8896/8726/8879 8891/8721/8874 +f 8899/8729/8882 8900/8731/8884 8864/8693/8846 +f 8901/8730/8883 8902/8732/8885 8900/8731/8884 +f 8893/8723/8876 8900/8731/8884 8895/8725/8878 +f 8856/8684/8837 8864/8693/8846 8893/8723/8876 +f 8902/8732/8885 8901/8730/8883 8904/8734/8887 +f 8904/8734/8887 8903/8733/8886 8808/8639/8792 +f 8897/8727/8880 8904/8734/8887 8803/8634/8787 +f 8895/8725/8878 8902/8732/8885 8897/8727/8880 +f 8825/8654/8807 8824/8653/8806 8906/8736/8889 +f 8906/8736/8889 8905/8735/8888 8908/8738/8891 +f 8899/8729/8882 8906/8736/8889 8901/8730/8883 +f 8826/8655/8808 8825/8654/8807 8899/8729/8882 +f 8908/8738/8891 8907/8737/8890 8910/8740/8893 +f 8799/8630/8783 8809/8640/8793 8910/8740/8893 +f 8809/8640/8793 8786/8617/8770 8903/8733/8886 +f 8901/8730/8883 8908/8738/8891 8903/8733/8886 +f 8840/8668/8821 8833/8661/8814 8912/8742/8895 +f 8912/8742/8895 8911/8741/8894 8914/8744/8897 +f 8905/8735/8888 8912/8742/8895 8907/8737/8890 +f 8824/8653/8806 8840/8668/8821 8905/8735/8888 +f 8914/8744/8897 8913/8743/8896 8916/8746/8899 +f 8916/8746/8899 8915/8745/8898 8800/8631/8784 +f 8909/8739/8892 8916/8746/8899 8799/8630/8783 +f 8907/8737/8890 8914/8744/8897 8909/8739/8892 +f 8917/8747/8900 8918/8749/8902 8830/8659/8812 +f 8919/8748/8901 8920/8750/8903 8918/8749/8902 +f 8920/8750/8903 8913/8743/8896 8911/8741/8894 +f 8918/8749/8902 8911/8741/8894 8833/8661/8814 +f 8920/8750/8903 8919/8748/8901 8922/8752/8905 +f 8922/8752/8905 8921/8751/8904 8796/8627/8780 +f 8915/8745/8898 8922/8752/8905 8795/8626/8779 +f 8913/8743/8896 8920/8750/8903 8915/8745/8898 +f 8847/8675/8828 8844/8674/8827 8923/8753/8906 +f 8876/8707/8860 8924/8754/8907 8923/8753/8906 +f 8924/8754/8907 8919/8748/8901 8917/8747/8900 +f 8923/8753/8906 8917/8747/8900 8829/8658/8811 +f 8880/8755/8908 8925/8756/8909 8924/8754/8907 +f 8925/8756/8909 8880/8755/8908 8774/8605/8758 +f 8774/8605/8758 8773/8604/8757 8925/8756/8909 +f 8919/8748/8901 8924/8754/8907 8921/8751/8904 +f 5253/5262/5233 5250/5259/5230 8927/8758/8911 +f 8927/8758/8911 8926/8757/8910 8929/8760/8913 +f 8931/8762/8915 8927/8758/8911 8930/8761/8914 +f 5254/5264/5235 5253/5262/5233 8931/8762/8915 +f 8933/8764/8917 8934/8766/8919 8935/8765/8918 +f 8928/8759/8912 8926/8757/8910 8934/8766/8919 +f 8926/8757/8910 5250/5259/5230 5247/5257/5228 +f 8934/8766/8919 5247/5257/5228 5246/5256/5227 +f 8937/8768/8921 5416/5423/5394 8936/8767/8920 +f 8936/8767/8920 5421/5429/5400 5434/5442/5413 +f 8938/8769/8922 8936/8767/8920 5424/5431/5402 +f 8939/8791/8944 8937/8768/8921 8938/8769/8922 +f 8943/8773/8926 8940/8770/8923 8942/8772/8925 +f 8942/8772/8925 8941/8771/8924 5345/5353/5324 +f 8944/8774/8927 8942/8772/8925 5344/5352/5323 +f 8945/8787/8940 8943/8773/8926 8944/8774/8927 +f 8935/8765/8918 5246/5256/5227 8946/8775/8928 +f 8946/8775/8928 5341/5349/5320 8941/8771/8924 +f 8947/8776/8929 8946/8775/8928 8940/8770/8923 +f 8932/8763/8916 8935/8765/8918 8947/8776/8929 +f 5274/5281/5252 5254/5264/5235 8948/8777/8930 +f 8948/8777/8930 8931/8762/8915 8949/8778/8931 +f 8951/8780/8933 8948/8777/8930 8950/8779/8932 +f 5276/5283/5254 5274/5281/5252 8951/8780/8933 +f 5282/5289/5260 5276/5283/5254 8952/8781/8934 +f 8952/8781/8934 8951/8780/8933 8953/8782/8935 +f 8953/8782/8935 8954/8792/8945 8955/8783/8936 +f 8952/8781/8934 8955/8783/8936 5283/5290/5261 +f 5413/5421/5392 8956/8784/8937 8944/8774/8927 +f 5412/5420/5391 8957/8785/8938 8956/8784/8937 +f 8957/8785/8938 8958/8788/8941 8959/8786/8939 +f 8956/8784/8937 8959/8786/8939 8945/8787/8940 +f 8957/8785/8938 8960/8790/8943 8961/8789/8942 +f 5412/5420/5391 5417/5425/5396 8960/8790/8943 +f 5417/5425/5396 5416/5423/5394 8937/8768/8921 +f 8960/8790/8943 8937/8768/8921 8939/8791/8944 +f 8955/8783/8936 8962/8793/8946 5422/5430/5401 +f 8954/8792/8945 8963/8794/8947 8962/8793/8946 +f 8938/8769/8922 8962/8793/8946 8939/8791/8944 +f 5424/5431/5402 5422/5430/5401 8938/8769/8922 +f 8967/8801/8954 8964/8795/8948 8966/8797/8950 +f 8968/8798/8951 8969/8799/8952 8966/8797/8950 +f 8969/8799/8952 8970/8831/8984 8971/8800/8953 +f 8972/8829/8982 8967/8801/8954 8971/8800/8953 +f 8974/8803/8956 8975/8806/8959 8976/8804/8957 +f 8977/8805/8958 8978/8807/8960 8975/8806/8959 +f 8980/8809/8962 8975/8806/8959 8979/8808/8961 +f 8981/8844/8997 8976/8804/8957 8980/8809/8962 +f 8983/8811/8964 8984/8814/8967 8985/8812/8965 +f 8986/8813/8966 8987/8815/8968 8984/8814/8967 +f 8987/8815/8968 8988/8826/8979 8989/8816/8969 +f 8990/8824/8977 8985/8812/8965 8989/8816/8969 +f 8978/8807/8960 8977/8805/8958 8992/8818/8971 +f 8992/8818/8971 8991/8817/8970 8983/8811/8964 +f 8993/8846/8999 8992/8818/8971 8982/8810/8963 +f 8992/8818/8971 8993/8846/8999 8979/8808/8961 +f 8995/8820/8973 8996/8822/8975 8997/8821/8974 +f 8996/8822/8975 8995/8820/8973 8965/8796/8949 +f 8998/8823/8976 8996/8822/8975 8964/8795/8948 +f 8999/8849/9002 8997/8821/8974 8998/8823/8976 +f 9001/8828/8981 8990/8824/8977 9000/8825/8978 +f 8988/8826/8979 9002/8827/8980 9000/8825/8978 +f 8997/8821/8974 9000/8825/8978 8994/8819/8972 +f 8999/8849/9002 9001/8828/8981 8997/8821/8974 +f 9004/8834/8987 8972/8829/8982 9003/8830/8983 +f 9003/8830/8983 8971/8800/8953 9005/8832/8985 +f 9007/8835/8988 9003/8830/8983 9006/8833/8986 +f 9008/8836/8989 9004/8834/8987 9007/8835/8988 +f 9007/8835/8988 9009/8839/8992 9010/8837/8990 +f 9009/8839/8992 9007/8835/8988 9011/8838/8991 +f 9013/8841/8994 9009/8839/8992 9012/8840/8993 +f 9014/8852/9005 9010/8837/8990 9013/8841/8994 +f 9015/8842/8995 9016/8843/8996 9013/8841/8994 +f 9016/8843/8996 9015/8842/8995 8976/8804/8957 +f 9017/8845/8998 9016/8843/8996 8981/8844/8997 +f 9014/8852/9005 9013/8841/8994 9017/8845/8998 +f 8980/8809/8962 8979/8808/8961 9018/8847/9000 +f 9018/8847/9000 8993/8846/8999 8985/8812/8965 +f 9019/8848/9001 9018/8847/9000 8990/8824/8977 +f 9018/8847/9000 9019/8848/9001 8981/8844/8997 +f 9001/8828/8981 9020/8850/9003 9019/8848/9001 +f 8999/8849/9002 9021/8851/9004 9020/8850/9003 +f 9017/8845/8998 9020/8850/9003 9014/8852/9005 +f 8981/8844/8997 9019/8848/9001 9017/8845/8998 +f 9021/8851/9004 8999/8849/9002 9023/8854/9007 +f 9023/8854/9007 9022/8853/9006 9004/8834/8987 +f 9010/8837/8990 9023/8854/9007 9008/8836/8989 +f 9014/8852/9005 9021/8851/9004 9010/8837/8990 +f 8967/8801/8954 9024/8855/9008 8998/8823/8976 +f 8972/8829/8982 9022/8853/9006 9024/8855/9008 +f 9024/8855/9008 9022/8853/9006 8999/8849/9002 +f 9026/8857/9010 9027/8860/9013 9028/8858/9011 +f 9029/8859/9012 9030/8861/9014 9027/8860/9013 +f 9030/8861/9014 8968/8798/8951 8995/8820/8973 +f 9027/8860/9013 8995/8820/8973 8994/8819/8972 +f 8933/8764/8917 9031/8863/9016 9032/8862/9015 +f 8932/8763/8916 9033/8864/9017 9031/8863/9016 +f 9033/8864/9017 9029/8859/9012 9026/8857/9010 +f 9031/8863/9016 9026/8857/9010 9025/8856/9009 +f 9030/8861/9014 9029/8859/9012 9035/8866/9019 +f 9035/8866/9019 9034/8865/9018 9037/8868/9021 +f 8969/8799/8952 9035/8866/9019 8970/8831/8984 +f 8968/8798/8951 9030/8861/9014 8969/8799/8952 +f 9033/8864/9017 8932/8763/8916 9038/8869/9022 +f 9038/8869/9022 8947/8776/8929 9039/8870/9023 +f 9034/8865/9018 9038/8869/9022 9036/8867/9020 +f 9029/8859/9012 9033/8864/9017 9034/8865/9018 +f 9037/8868/9021 9036/8867/9020 9041/8872/9025 +f 9042/8873/9026 9043/8874/9027 9041/8872/9025 +f 9043/8874/9027 9006/8833/8986 9005/8832/8985 +f 8970/8831/8984 9037/8868/9021 9005/8832/8985 +f 9039/8870/9023 8940/8770/8923 9044/8875/9028 +f 8945/8787/8940 9045/8876/9029 9044/8875/9028 +f 9045/8876/9029 9042/8873/9026 9040/8871/9024 +f 9036/8867/9020 9039/8870/9023 9040/8871/9024 +f 9046/8877/9030 9047/8879/9032 9043/8874/9027 +f 9048/8878/9031 9049/8880/9033 9047/8879/9032 +f 9049/8880/9033 9012/8840/8993 9011/8838/8991 +f 9047/8879/9032 9011/8838/8991 9006/8833/8986 +f 8959/8786/8939 9050/8881/9034 9045/8876/9029 +f 8958/8788/8941 9051/8882/9035 9050/8881/9034 +f 9051/8882/9035 9048/8878/9031 9046/8877/9030 +f 9050/8881/9034 9046/8877/9030 9042/8873/9026 +f 9052/8883/9036 9053/8886/9039 9049/8880/9033 +f 9053/8886/9039 9052/8883/9036 9055/8885/9038 +f 9015/8842/8995 9053/8886/9039 8973/8802/8955 +f 9053/8886/9039 9015/8842/8995 9012/8840/8993 +f 8961/8789/8942 9056/8887/9040 9051/8882/9035 +f 8939/8791/8944 9057/8888/9041 9056/8887/9040 +f 9052/8883/9036 9056/8887/9040 9054/8884/9037 +f 9056/8887/9040 9052/8883/9036 9048/8878/9031 +f 9058/8889/9042 9059/8891/9044 9055/8885/9038 +f 9060/8890/9043 9061/8892/9045 9059/8891/9044 +f 9061/8892/9045 8977/8805/8958 8974/8803/8956 +f 8973/8802/8955 9055/8885/9038 8974/8803/8956 +f 8963/8794/8947 9062/8893/9046 9057/8888/9041 +f 8954/8792/8945 9063/8894/9047 9062/8893/9046 +f 9063/8894/9047 9060/8890/9043 9058/8889/9042 +f 9062/8893/9046 9058/8889/9042 9054/8884/9037 +f 9064/8895/9048 9065/8897/9050 9061/8892/9045 +f 9066/8896/9049 9067/8898/9051 9065/8897/9050 +f 8991/8817/8970 9065/8897/9050 8986/8813/8966 +f 9065/8897/9050 8991/8817/8970 8977/8805/8958 +f 8953/8782/8935 9068/8899/9052 9063/8894/9047 +f 8950/8779/8932 9069/8900/9053 9068/8899/9052 +f 9069/8900/9053 9066/8896/9049 9064/8895/9048 +f 9068/8899/9052 9064/8895/9048 9060/8890/9043 +f 9070/8901/9054 9071/8904/9057 9067/8898/9051 +f 9071/8904/9057 9070/8901/9054 9073/8903/9056 +f 8987/8815/8968 9071/8904/9057 8988/8826/8979 +f 8986/8813/8966 9067/8898/9051 8987/8815/8968 +f 8949/8778/8931 9074/8905/9058 9069/8900/9053 +f 8930/8761/8914 9075/8906/9059 9074/8905/9058 +f 9075/8906/9059 9072/8902/9055 9070/8901/9054 +f 9074/8905/9058 9070/8901/9054 9066/8896/9049 +f 9073/8903/9056 9072/8902/9055 9077/8908/9061 +f 9025/8856/9009 9028/8858/9011 9077/8908/9061 +f 9002/8827/8980 9077/8908/9061 8994/8819/8972 +f 8988/8826/8979 9073/8903/9056 9002/8827/8980 +f 8929/8760/8913 9078/8909/9062 9075/8906/9059 +f 8928/8759/8912 9032/8862/9015 9078/8909/9062 +f 9032/8862/9015 9025/8856/9009 9076/8907/9060 +f 9078/8909/9062 9076/8907/9060 9072/8902/9055 +f 7398/7323/7374 7366/7327/7378 7396/7322/7373 +f 9079/8910/9063 7366/7327/7378 7363/7374/7418 +f 9079/8910/9063 7362/7288/7343 7365/8911/7465 +f 7397/8912/7469 7396/7322/7373 9079/8910/9063 +o Plane +v -0.500000 0.000000 -0.500000 +v 0.500000 0.000000 -0.500000 +v -0.500000 -0.000000 0.500000 +v 0.500000 -0.000000 0.500000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vn 0.000000 1.000000 0.000000 +usemtl 505050 +s 1 +f 9080/8938/9081 9082/8939/9081 9083/8940/9081 9081/8941/9081 diff --git a/1_Three.js/assets/textures/checkerboard.jpg b/1_Three.js/assets/textures/checkerboard.jpg new file mode 100755 index 0000000000000000000000000000000000000000..6071990a5349b5b8c0bcba219e451b3ae5380b0a Binary files /dev/null and b/1_Three.js/assets/textures/checkerboard.jpg differ diff --git a/1_Three.js/assets/textures/concrete.JPG b/1_Three.js/assets/textures/concrete.JPG new file mode 100755 index 0000000000000000000000000000000000000000..268eed94b982a19b8ae0b9df09a546e6eda7bb4f Binary files /dev/null and b/1_Three.js/assets/textures/concrete.JPG differ diff --git a/1_Three.js/assets/textures/fingerprints.jpg b/1_Three.js/assets/textures/fingerprints.jpg new file mode 100755 index 0000000000000000000000000000000000000000..2d5ffd8b04c48d80ce360038c1fea681979b2687 Binary files /dev/null and b/1_Three.js/assets/textures/fingerprints.jpg differ diff --git a/1_Three.js/assets/textures/normalMapExample.jpg b/1_Three.js/assets/textures/normalMapExample.jpg new file mode 100755 index 0000000000000000000000000000000000000000..b93f680b2d638ecb2ab59e9d1509b84cc05e1694 Binary files /dev/null and b/1_Three.js/assets/textures/normalMapExample.jpg differ diff --git a/1_Three.js/assets/textures/particle.jpg b/1_Three.js/assets/textures/particle.jpg new file mode 100755 index 0000000000000000000000000000000000000000..eb1e523d032f1978ef93542508493336ad96ae7f Binary files /dev/null and b/1_Three.js/assets/textures/particle.jpg differ diff --git a/1_Three.js/assets/textures/scratch.jpg b/1_Three.js/assets/textures/scratch.jpg new file mode 100755 index 0000000000000000000000000000000000000000..54b103f1e0388d625bbaf1b193ca416411e16d6f Binary files /dev/null and b/1_Three.js/assets/textures/scratch.jpg differ diff --git a/1_Three.js/index.html b/1_Three.js/index.html new file mode 100644 index 0000000000000000000000000000000000000000..dee1e8704b8f3481197e18812e40af4233fd1ca3 --- /dev/null +++ b/1_Three.js/index.html @@ -0,0 +1,22 @@ +<!DOCTYPE html> +<html> +<head> + <title>Three.js</title> + +</head> +<body> + + <div id="webgl"></div> + + + + <script src="./lib/three.js"></script> + <script src="./lib/OrbitControls.js"></script> + <script src="./lib/dat.gui.min.js"></script> + + + <script src="./main.js"></script> + + +</body> +</html> \ No newline at end of file diff --git a/1_Three.js/lib/OrbitControls.js b/1_Three.js/lib/OrbitControls.js new file mode 100755 index 0000000000000000000000000000000000000000..d3d2464e7d5ba02357829f0c688af7c5d5e85743 --- /dev/null +++ b/1_Three.js/lib/OrbitControls.js @@ -0,0 +1,1016 @@ +/** + * @author qiao / https://github.com/qiao + * @author mrdoob / http://mrdoob.com + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author erich666 / http://erichaines.com + */ + +// This set of controls performs orbiting, dollying (zooming), and panning. +// Unlike TrackballControls, it maintains the "up" direction object.up (+Y by default). +// +// Orbit - left mouse / touch: one finger move +// Zoom - middle mouse, or mousewheel / touch: two finger spread or squish +// Pan - right mouse, or arrow keys / touch: three finger swipe + +THREE.OrbitControls = function ( object, domElement ) { + + this.object = object; + + this.domElement = ( domElement !== undefined ) ? domElement : document; + + // Set to false to disable this control + this.enabled = true; + + // "target" sets the location of focus, where the object orbits around + this.target = new THREE.Vector3(); + + // How far you can dolly in and out ( PerspectiveCamera only ) + this.minDistance = 0; + this.maxDistance = Infinity; + + // How far you can zoom in and out ( OrthographicCamera only ) + this.minZoom = 0; + this.maxZoom = Infinity; + + // How far you can orbit vertically, upper and lower limits. + // Range is 0 to Math.PI radians. + this.minPolarAngle = 0; // radians + this.maxPolarAngle = Math.PI; // radians + + // How far you can orbit horizontally, upper and lower limits. + // If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ]. + this.minAzimuthAngle = - Infinity; // radians + this.maxAzimuthAngle = Infinity; // radians + + // Set to true to enable damping (inertia) + // If damping is enabled, you must call controls.update() in your animation loop + this.enableDamping = false; + this.dampingFactor = 0.25; + + // This option actually enables dollying in and out; left as "zoom" for backwards compatibility. + // Set to false to disable zooming + this.enableZoom = true; + this.zoomSpeed = 1.0; + + // Set to false to disable rotating + this.enableRotate = true; + this.rotateSpeed = 1.0; + + // Set to false to disable panning + this.enablePan = true; + this.keyPanSpeed = 7.0; // pixels moved per arrow key push + + // Set to true to automatically rotate around the target + // If auto-rotate is enabled, you must call controls.update() in your animation loop + this.autoRotate = false; + this.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60 + + // Set to false to disable use of the keys + this.enableKeys = true; + + // The four arrow keys + this.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 }; + + // Mouse buttons + this.mouseButtons = { ORBIT: THREE.MOUSE.LEFT, ZOOM: THREE.MOUSE.MIDDLE, PAN: THREE.MOUSE.RIGHT }; + + // for reset + this.target0 = this.target.clone(); + this.position0 = this.object.position.clone(); + this.zoom0 = this.object.zoom; + + // + // public methods + // + + this.getPolarAngle = function () { + + return spherical.phi; + + }; + + this.getAzimuthalAngle = function () { + + return spherical.theta; + + }; + + this.reset = function () { + + scope.target.copy( scope.target0 ); + scope.object.position.copy( scope.position0 ); + scope.object.zoom = scope.zoom0; + + scope.object.updateProjectionMatrix(); + scope.dispatchEvent( changeEvent ); + + scope.update(); + + state = STATE.NONE; + + }; + + // this method is exposed, but perhaps it would be better if we can make it private... + this.update = function () { + + var offset = new THREE.Vector3(); + + // so camera.up is the orbit axis + var quat = new THREE.Quaternion().setFromUnitVectors( object.up, new THREE.Vector3( 0, 1, 0 ) ); + var quatInverse = quat.clone().inverse(); + + var lastPosition = new THREE.Vector3(); + var lastQuaternion = new THREE.Quaternion(); + + return function update() { + + var position = scope.object.position; + + offset.copy( position ).sub( scope.target ); + + // rotate offset to "y-axis-is-up" space + offset.applyQuaternion( quat ); + + // angle from z-axis around y-axis + spherical.setFromVector3( offset ); + + if ( scope.autoRotate && state === STATE.NONE ) { + + rotateLeft( getAutoRotationAngle() ); + + } + + spherical.theta += sphericalDelta.theta; + spherical.phi += sphericalDelta.phi; + + // restrict theta to be between desired limits + spherical.theta = Math.max( scope.minAzimuthAngle, Math.min( scope.maxAzimuthAngle, spherical.theta ) ); + + // restrict phi to be between desired limits + spherical.phi = Math.max( scope.minPolarAngle, Math.min( scope.maxPolarAngle, spherical.phi ) ); + + spherical.makeSafe(); + + + spherical.radius *= scale; + + // restrict radius to be between desired limits + spherical.radius = Math.max( scope.minDistance, Math.min( scope.maxDistance, spherical.radius ) ); + + // move target to panned location + scope.target.add( panOffset ); + + offset.setFromSpherical( spherical ); + + // rotate offset back to "camera-up-vector-is-up" space + offset.applyQuaternion( quatInverse ); + + position.copy( scope.target ).add( offset ); + + scope.object.lookAt( scope.target ); + + if ( scope.enableDamping === true ) { + + sphericalDelta.theta *= ( 1 - scope.dampingFactor ); + sphericalDelta.phi *= ( 1 - scope.dampingFactor ); + + } else { + + sphericalDelta.set( 0, 0, 0 ); + + } + + scale = 1; + panOffset.set( 0, 0, 0 ); + + // update condition is: + // min(camera displacement, camera rotation in radians)^2 > EPS + // using small-angle approximation cos(x/2) = 1 - x^2 / 8 + + if ( zoomChanged || + lastPosition.distanceToSquared( scope.object.position ) > EPS || + 8 * ( 1 - lastQuaternion.dot( scope.object.quaternion ) ) > EPS ) { + + scope.dispatchEvent( changeEvent ); + + lastPosition.copy( scope.object.position ); + lastQuaternion.copy( scope.object.quaternion ); + zoomChanged = false; + + return true; + + } + + return false; + + }; + + }(); + + this.dispose = function () { + + scope.domElement.removeEventListener( 'contextmenu', onContextMenu, false ); + scope.domElement.removeEventListener( 'mousedown', onMouseDown, false ); + scope.domElement.removeEventListener( 'wheel', onMouseWheel, false ); + + scope.domElement.removeEventListener( 'touchstart', onTouchStart, false ); + scope.domElement.removeEventListener( 'touchend', onTouchEnd, false ); + scope.domElement.removeEventListener( 'touchmove', onTouchMove, false ); + + document.removeEventListener( 'mousemove', onMouseMove, false ); + document.removeEventListener( 'mouseup', onMouseUp, false ); + + window.removeEventListener( 'keydown', onKeyDown, false ); + + //scope.dispatchEvent( { type: 'dispose' } ); // should this be added here? + + }; + + // + // internals + // + + var scope = this; + + var changeEvent = { type: 'change' }; + var startEvent = { type: 'start' }; + var endEvent = { type: 'end' }; + + var STATE = { NONE: - 1, ROTATE: 0, DOLLY: 1, PAN: 2, TOUCH_ROTATE: 3, TOUCH_DOLLY: 4, TOUCH_PAN: 5 }; + + var state = STATE.NONE; + + var EPS = 0.000001; + + // current position in spherical coordinates + var spherical = new THREE.Spherical(); + var sphericalDelta = new THREE.Spherical(); + + var scale = 1; + var panOffset = new THREE.Vector3(); + var zoomChanged = false; + + var rotateStart = new THREE.Vector2(); + var rotateEnd = new THREE.Vector2(); + var rotateDelta = new THREE.Vector2(); + + var panStart = new THREE.Vector2(); + var panEnd = new THREE.Vector2(); + var panDelta = new THREE.Vector2(); + + var dollyStart = new THREE.Vector2(); + var dollyEnd = new THREE.Vector2(); + var dollyDelta = new THREE.Vector2(); + + function getAutoRotationAngle() { + + return 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed; + + } + + function getZoomScale() { + + return Math.pow( 0.95, scope.zoomSpeed ); + + } + + function rotateLeft( angle ) { + + sphericalDelta.theta -= angle; + + } + + function rotateUp( angle ) { + + sphericalDelta.phi -= angle; + + } + + var panLeft = function () { + + var v = new THREE.Vector3(); + + return function panLeft( distance, objectMatrix ) { + + v.setFromMatrixColumn( objectMatrix, 0 ); // get X column of objectMatrix + v.multiplyScalar( - distance ); + + panOffset.add( v ); + + }; + + }(); + + var panUp = function () { + + var v = new THREE.Vector3(); + + return function panUp( distance, objectMatrix ) { + + v.setFromMatrixColumn( objectMatrix, 1 ); // get Y column of objectMatrix + v.multiplyScalar( distance ); + + panOffset.add( v ); + + }; + + }(); + + // deltaX and deltaY are in pixels; right and down are positive + var pan = function () { + + var offset = new THREE.Vector3(); + + return function pan( deltaX, deltaY ) { + + var element = scope.domElement === document ? scope.domElement.body : scope.domElement; + + if ( scope.object instanceof THREE.PerspectiveCamera ) { + + // perspective + var position = scope.object.position; + offset.copy( position ).sub( scope.target ); + var targetDistance = offset.length(); + + // half of the fov is center to top of screen + targetDistance *= Math.tan( ( scope.object.fov / 2 ) * Math.PI / 180.0 ); + + // we actually don't use screenWidth, since perspective camera is fixed to screen height + panLeft( 2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix ); + panUp( 2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix ); + + } else if ( scope.object instanceof THREE.OrthographicCamera ) { + + // orthographic + panLeft( deltaX * ( scope.object.right - scope.object.left ) / scope.object.zoom / element.clientWidth, scope.object.matrix ); + panUp( deltaY * ( scope.object.top - scope.object.bottom ) / scope.object.zoom / element.clientHeight, scope.object.matrix ); + + } else { + + // camera neither orthographic nor perspective + console.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.' ); + scope.enablePan = false; + + } + + }; + + }(); + + function dollyIn( dollyScale ) { + + if ( scope.object instanceof THREE.PerspectiveCamera ) { + + scale /= dollyScale; + + } else if ( scope.object instanceof THREE.OrthographicCamera ) { + + scope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom * dollyScale ) ); + scope.object.updateProjectionMatrix(); + zoomChanged = true; + + } else { + + console.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' ); + scope.enableZoom = false; + + } + + } + + function dollyOut( dollyScale ) { + + if ( scope.object instanceof THREE.PerspectiveCamera ) { + + scale *= dollyScale; + + } else if ( scope.object instanceof THREE.OrthographicCamera ) { + + scope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom / dollyScale ) ); + scope.object.updateProjectionMatrix(); + zoomChanged = true; + + } else { + + console.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' ); + scope.enableZoom = false; + + } + + } + + // + // event callbacks - update the object state + // + + function handleMouseDownRotate( event ) { + + //console.log( 'handleMouseDownRotate' ); + + rotateStart.set( event.clientX, event.clientY ); + + } + + function handleMouseDownDolly( event ) { + + //console.log( 'handleMouseDownDolly' ); + + dollyStart.set( event.clientX, event.clientY ); + + } + + function handleMouseDownPan( event ) { + + //console.log( 'handleMouseDownPan' ); + + panStart.set( event.clientX, event.clientY ); + + } + + function handleMouseMoveRotate( event ) { + + //console.log( 'handleMouseMoveRotate' ); + + rotateEnd.set( event.clientX, event.clientY ); + rotateDelta.subVectors( rotateEnd, rotateStart ); + + var element = scope.domElement === document ? scope.domElement.body : scope.domElement; + + // rotating across whole screen goes 360 degrees around + rotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed ); + + // rotating up and down along whole screen attempts to go 360, but limited to 180 + rotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed ); + + rotateStart.copy( rotateEnd ); + + scope.update(); + + } + + function handleMouseMoveDolly( event ) { + + //console.log( 'handleMouseMoveDolly' ); + + dollyEnd.set( event.clientX, event.clientY ); + + dollyDelta.subVectors( dollyEnd, dollyStart ); + + if ( dollyDelta.y > 0 ) { + + dollyIn( getZoomScale() ); + + } else if ( dollyDelta.y < 0 ) { + + dollyOut( getZoomScale() ); + + } + + dollyStart.copy( dollyEnd ); + + scope.update(); + + } + + function handleMouseMovePan( event ) { + + //console.log( 'handleMouseMovePan' ); + + panEnd.set( event.clientX, event.clientY ); + + panDelta.subVectors( panEnd, panStart ); + + pan( panDelta.x, panDelta.y ); + + panStart.copy( panEnd ); + + scope.update(); + + } + + function handleMouseUp( event ) { + + // console.log( 'handleMouseUp' ); + + } + + function handleMouseWheel( event ) { + + // console.log( 'handleMouseWheel' ); + + if ( event.deltaY < 0 ) { + + dollyOut( getZoomScale() ); + + } else if ( event.deltaY > 0 ) { + + dollyIn( getZoomScale() ); + + } + + scope.update(); + + } + + function handleKeyDown( event ) { + + //console.log( 'handleKeyDown' ); + + switch ( event.keyCode ) { + + case scope.keys.UP: + pan( 0, scope.keyPanSpeed ); + scope.update(); + break; + + case scope.keys.BOTTOM: + pan( 0, - scope.keyPanSpeed ); + scope.update(); + break; + + case scope.keys.LEFT: + pan( scope.keyPanSpeed, 0 ); + scope.update(); + break; + + case scope.keys.RIGHT: + pan( - scope.keyPanSpeed, 0 ); + scope.update(); + break; + + } + + } + + function handleTouchStartRotate( event ) { + + //console.log( 'handleTouchStartRotate' ); + + rotateStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ); + + } + + function handleTouchStartDolly( event ) { + + //console.log( 'handleTouchStartDolly' ); + + var dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX; + var dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY; + + var distance = Math.sqrt( dx * dx + dy * dy ); + + dollyStart.set( 0, distance ); + + } + + function handleTouchStartPan( event ) { + + //console.log( 'handleTouchStartPan' ); + + panStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ); + + } + + function handleTouchMoveRotate( event ) { + + //console.log( 'handleTouchMoveRotate' ); + + rotateEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ); + rotateDelta.subVectors( rotateEnd, rotateStart ); + + var element = scope.domElement === document ? scope.domElement.body : scope.domElement; + + // rotating across whole screen goes 360 degrees around + rotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed ); + + // rotating up and down along whole screen attempts to go 360, but limited to 180 + rotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed ); + + rotateStart.copy( rotateEnd ); + + scope.update(); + + } + + function handleTouchMoveDolly( event ) { + + //console.log( 'handleTouchMoveDolly' ); + + var dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX; + var dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY; + + var distance = Math.sqrt( dx * dx + dy * dy ); + + dollyEnd.set( 0, distance ); + + dollyDelta.subVectors( dollyEnd, dollyStart ); + + if ( dollyDelta.y > 0 ) { + + dollyOut( getZoomScale() ); + + } else if ( dollyDelta.y < 0 ) { + + dollyIn( getZoomScale() ); + + } + + dollyStart.copy( dollyEnd ); + + scope.update(); + + } + + function handleTouchMovePan( event ) { + + //console.log( 'handleTouchMovePan' ); + + panEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ); + + panDelta.subVectors( panEnd, panStart ); + + pan( panDelta.x, panDelta.y ); + + panStart.copy( panEnd ); + + scope.update(); + + } + + function handleTouchEnd( event ) { + + //console.log( 'handleTouchEnd' ); + + } + + // + // event handlers - FSM: listen for events and reset state + // + + function onMouseDown( event ) { + + if ( scope.enabled === false ) return; + + event.preventDefault(); + + if ( event.button === scope.mouseButtons.ORBIT ) { + + if ( scope.enableRotate === false ) return; + + handleMouseDownRotate( event ); + + state = STATE.ROTATE; + + } else if ( event.button === scope.mouseButtons.ZOOM ) { + + if ( scope.enableZoom === false ) return; + + handleMouseDownDolly( event ); + + state = STATE.DOLLY; + + } else if ( event.button === scope.mouseButtons.PAN ) { + + if ( scope.enablePan === false ) return; + + handleMouseDownPan( event ); + + state = STATE.PAN; + + } + + if ( state !== STATE.NONE ) { + + document.addEventListener( 'mousemove', onMouseMove, false ); + document.addEventListener( 'mouseup', onMouseUp, false ); + + scope.dispatchEvent( startEvent ); + + } + + } + + function onMouseMove( event ) { + + if ( scope.enabled === false ) return; + + event.preventDefault(); + + if ( state === STATE.ROTATE ) { + + if ( scope.enableRotate === false ) return; + + handleMouseMoveRotate( event ); + + } else if ( state === STATE.DOLLY ) { + + if ( scope.enableZoom === false ) return; + + handleMouseMoveDolly( event ); + + } else if ( state === STATE.PAN ) { + + if ( scope.enablePan === false ) return; + + handleMouseMovePan( event ); + + } + + } + + function onMouseUp( event ) { + + if ( scope.enabled === false ) return; + + handleMouseUp( event ); + + document.removeEventListener( 'mousemove', onMouseMove, false ); + document.removeEventListener( 'mouseup', onMouseUp, false ); + + scope.dispatchEvent( endEvent ); + + state = STATE.NONE; + + } + + function onMouseWheel( event ) { + + if ( scope.enabled === false || scope.enableZoom === false || ( state !== STATE.NONE && state !== STATE.ROTATE ) ) return; + + event.preventDefault(); + event.stopPropagation(); + + handleMouseWheel( event ); + + scope.dispatchEvent( startEvent ); // not sure why these are here... + scope.dispatchEvent( endEvent ); + + } + + function onKeyDown( event ) { + + if ( scope.enabled === false || scope.enableKeys === false || scope.enablePan === false ) return; + + handleKeyDown( event ); + + } + + function onTouchStart( event ) { + + if ( scope.enabled === false ) return; + + switch ( event.touches.length ) { + + case 1: // one-fingered touch: rotate + + if ( scope.enableRotate === false ) return; + + handleTouchStartRotate( event ); + + state = STATE.TOUCH_ROTATE; + + break; + + case 2: // two-fingered touch: dolly + + if ( scope.enableZoom === false ) return; + + handleTouchStartDolly( event ); + + state = STATE.TOUCH_DOLLY; + + break; + + case 3: // three-fingered touch: pan + + if ( scope.enablePan === false ) return; + + handleTouchStartPan( event ); + + state = STATE.TOUCH_PAN; + + break; + + default: + + state = STATE.NONE; + + } + + if ( state !== STATE.NONE ) { + + scope.dispatchEvent( startEvent ); + + } + + } + + function onTouchMove( event ) { + + if ( scope.enabled === false ) return; + + event.preventDefault(); + event.stopPropagation(); + + switch ( event.touches.length ) { + + case 1: // one-fingered touch: rotate + + if ( scope.enableRotate === false ) return; + if ( state !== STATE.TOUCH_ROTATE ) return; // is this needed?... + + handleTouchMoveRotate( event ); + + break; + + case 2: // two-fingered touch: dolly + + if ( scope.enableZoom === false ) return; + if ( state !== STATE.TOUCH_DOLLY ) return; // is this needed?... + + handleTouchMoveDolly( event ); + + break; + + case 3: // three-fingered touch: pan + + if ( scope.enablePan === false ) return; + if ( state !== STATE.TOUCH_PAN ) return; // is this needed?... + + handleTouchMovePan( event ); + + break; + + default: + + state = STATE.NONE; + + } + + } + + function onTouchEnd( event ) { + + if ( scope.enabled === false ) return; + + handleTouchEnd( event ); + + scope.dispatchEvent( endEvent ); + + state = STATE.NONE; + + } + + function onContextMenu( event ) { + + event.preventDefault(); + + } + + // + + scope.domElement.addEventListener( 'contextmenu', onContextMenu, false ); + + scope.domElement.addEventListener( 'mousedown', onMouseDown, false ); + scope.domElement.addEventListener( 'wheel', onMouseWheel, false ); + + scope.domElement.addEventListener( 'touchstart', onTouchStart, false ); + scope.domElement.addEventListener( 'touchend', onTouchEnd, false ); + scope.domElement.addEventListener( 'touchmove', onTouchMove, false ); + + window.addEventListener( 'keydown', onKeyDown, false ); + + // force an update at start + + this.update(); + +}; + +THREE.OrbitControls.prototype = Object.create( THREE.EventDispatcher.prototype ); +THREE.OrbitControls.prototype.constructor = THREE.OrbitControls; + +Object.defineProperties( THREE.OrbitControls.prototype, { + + center: { + + get: function () { + + console.warn( 'THREE.OrbitControls: .center has been renamed to .target' ); + return this.target; + + } + + }, + + // backward compatibility + + noZoom: { + + get: function () { + + console.warn( 'THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' ); + return ! this.enableZoom; + + }, + + set: function ( value ) { + + console.warn( 'THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' ); + this.enableZoom = ! value; + + } + + }, + + noRotate: { + + get: function () { + + console.warn( 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' ); + return ! this.enableRotate; + + }, + + set: function ( value ) { + + console.warn( 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' ); + this.enableRotate = ! value; + + } + + }, + + noPan: { + + get: function () { + + console.warn( 'THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' ); + return ! this.enablePan; + + }, + + set: function ( value ) { + + console.warn( 'THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' ); + this.enablePan = ! value; + + } + + }, + + noKeys: { + + get: function () { + + console.warn( 'THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' ); + return ! this.enableKeys; + + }, + + set: function ( value ) { + + console.warn( 'THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' ); + this.enableKeys = ! value; + + } + + }, + + staticMoving: { + + get: function () { + + console.warn( 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' ); + return ! this.enableDamping; + + }, + + set: function ( value ) { + + console.warn( 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' ); + this.enableDamping = ! value; + + } + + }, + + dynamicDampingFactor: { + + get: function () { + + console.warn( 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' ); + return this.dampingFactor; + + }, + + set: function ( value ) { + + console.warn( 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' ); + this.dampingFactor = value; + + } + + } + +} ); \ No newline at end of file diff --git a/1_Three.js/lib/dat.gui.min.js b/1_Three.js/lib/dat.gui.min.js new file mode 100755 index 0000000000000000000000000000000000000000..8f07c7b0edc595f8c7ed98a941d39a19e0408a8d --- /dev/null +++ b/1_Three.js/lib/dat.gui.min.js @@ -0,0 +1,2 @@ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.dat=t():e.dat=t()}(this,function(){return function(e){function t(o){if(n[o])return n[o].exports;var i=n[o]={exports:{},id:o,loaded:!1};return e[o].call(i.exports,i,i.exports,t),i.loaded=!0,i.exports}var n={};return t.m=e,t.c=n,t.p="",t(0)}([function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{"default":e}}var i=n(1),r=o(i);e.exports=r["default"]},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{"default":e}}t.__esModule=!0;var i=n(2),r=o(i),a=n(6),l=o(a),s=n(3),u=o(s),d=n(7),c=o(d),f=n(8),_=o(f),p=n(10),h=o(p),m=n(11),b=o(m),g=n(12),v=o(g),y=n(13),w=o(y),x=n(14),E=o(x),C=n(15),A=o(C),S=n(16),k=o(S),O=n(9),T=o(O),R=n(17),L=o(R);t["default"]={color:{Color:r["default"],math:l["default"],interpret:u["default"]},controllers:{Controller:c["default"],BooleanController:_["default"],OptionController:h["default"],StringController:b["default"],NumberController:v["default"],NumberControllerBox:w["default"],NumberControllerSlider:E["default"],FunctionController:A["default"],ColorController:k["default"]},dom:{dom:T["default"]},gui:{GUI:L["default"]},GUI:L["default"]}},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{"default":e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,t,n){Object.defineProperty(e,t,{get:function(){return"RGB"===this.__state.space?this.__state[t]:(h.recalculateRGB(this,t,n),this.__state[t])},set:function(e){"RGB"!==this.__state.space&&(h.recalculateRGB(this,t,n),this.__state.space="RGB"),this.__state[t]=e}})}function a(e,t){Object.defineProperty(e,t,{get:function(){return"HSV"===this.__state.space?this.__state[t]:(h.recalculateHSV(this),this.__state[t])},set:function(e){"HSV"!==this.__state.space&&(h.recalculateHSV(this),this.__state.space="HSV"),this.__state[t]=e}})}t.__esModule=!0;var l=n(3),s=o(l),u=n(6),d=o(u),c=n(4),f=o(c),_=n(5),p=o(_),h=function(){function e(){if(i(this,e),this.__state=s["default"].apply(this,arguments),this.__state===!1)throw new Error("Failed to interpret color arguments");this.__state.a=this.__state.a||1}return e.prototype.toString=function(){return(0,f["default"])(this)},e.prototype.toHexString=function(){return(0,f["default"])(this,!0)},e.prototype.toOriginal=function(){return this.__state.conversion.write(this)},e}();h.recalculateRGB=function(e,t,n){if("HEX"===e.__state.space)e.__state[t]=d["default"].component_from_hex(e.__state.hex,n);else{if("HSV"!==e.__state.space)throw new Error("Corrupted color state");p["default"].extend(e.__state,d["default"].hsv_to_rgb(e.__state.h,e.__state.s,e.__state.v))}},h.recalculateHSV=function(e){var t=d["default"].rgb_to_hsv(e.r,e.g,e.b);p["default"].extend(e.__state,{s:t.s,v:t.v}),p["default"].isNaN(t.h)?p["default"].isUndefined(e.__state.h)&&(e.__state.h=0):e.__state.h=t.h},h.COMPONENTS=["r","g","b","h","s","v","hex","a"],r(h.prototype,"r",2),r(h.prototype,"g",1),r(h.prototype,"b",0),a(h.prototype,"h"),a(h.prototype,"s"),a(h.prototype,"v"),Object.defineProperty(h.prototype,"a",{get:function(){return this.__state.a},set:function(e){this.__state.a=e}}),Object.defineProperty(h.prototype,"hex",{get:function(){return"HEX"!==!this.__state.space&&(this.__state.hex=d["default"].rgb_to_hex(this.r,this.g,this.b)),this.__state.hex},set:function(e){this.__state.space="HEX",this.__state.hex=e}}),t["default"]=h},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{"default":e}}t.__esModule=!0;var i=n(4),r=o(i),a=n(5),l=o(a),s=[{litmus:l["default"].isString,conversions:{THREE_CHAR_HEX:{read:function(e){var t=e.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i);return null!==t&&{space:"HEX",hex:parseInt("0x"+t[1].toString()+t[1].toString()+t[2].toString()+t[2].toString()+t[3].toString()+t[3].toString(),0)}},write:r["default"]},SIX_CHAR_HEX:{read:function(e){var t=e.match(/^#([A-F0-9]{6})$/i);return null!==t&&{space:"HEX",hex:parseInt("0x"+t[1].toString(),0)}},write:r["default"]},CSS_RGB:{read:function(e){var t=e.match(/^rgb\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\)/);return null!==t&&{space:"RGB",r:parseFloat(t[1]),g:parseFloat(t[2]),b:parseFloat(t[3])}},write:r["default"]},CSS_RGBA:{read:function(e){var t=e.match(/^rgba\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\)/);return null!==t&&{space:"RGB",r:parseFloat(t[1]),g:parseFloat(t[2]),b:parseFloat(t[3]),a:parseFloat(t[4])}},write:r["default"]}}},{litmus:l["default"].isNumber,conversions:{HEX:{read:function(e){return{space:"HEX",hex:e,conversionName:"HEX"}},write:function(e){return e.hex}}}},{litmus:l["default"].isArray,conversions:{RGB_ARRAY:{read:function(e){return 3===e.length&&{space:"RGB",r:e[0],g:e[1],b:e[2]}},write:function(e){return[e.r,e.g,e.b]}},RGBA_ARRAY:{read:function(e){return 4===e.length&&{space:"RGB",r:e[0],g:e[1],b:e[2],a:e[3]}},write:function(e){return[e.r,e.g,e.b,e.a]}}}},{litmus:l["default"].isObject,conversions:{RGBA_OBJ:{read:function(e){return!!(l["default"].isNumber(e.r)&&l["default"].isNumber(e.g)&&l["default"].isNumber(e.b)&&l["default"].isNumber(e.a))&&{space:"RGB",r:e.r,g:e.g,b:e.b,a:e.a}},write:function(e){return{r:e.r,g:e.g,b:e.b,a:e.a}}},RGB_OBJ:{read:function(e){return!!(l["default"].isNumber(e.r)&&l["default"].isNumber(e.g)&&l["default"].isNumber(e.b))&&{space:"RGB",r:e.r,g:e.g,b:e.b}},write:function(e){return{r:e.r,g:e.g,b:e.b}}},HSVA_OBJ:{read:function(e){return!!(l["default"].isNumber(e.h)&&l["default"].isNumber(e.s)&&l["default"].isNumber(e.v)&&l["default"].isNumber(e.a))&&{space:"HSV",h:e.h,s:e.s,v:e.v,a:e.a}},write:function(e){return{h:e.h,s:e.s,v:e.v,a:e.a}}},HSV_OBJ:{read:function(e){return!!(l["default"].isNumber(e.h)&&l["default"].isNumber(e.s)&&l["default"].isNumber(e.v))&&{space:"HSV",h:e.h,s:e.s,v:e.v}},write:function(e){return{h:e.h,s:e.s,v:e.v}}}}}],u=void 0,d=void 0,c=function(){d=!1;var e=arguments.length>1?l["default"].toArray(arguments):arguments[0];return l["default"].each(s,function(t){if(t.litmus(e))return l["default"].each(t.conversions,function(t,n){if(u=t.read(e),d===!1&&u!==!1)return d=u,u.conversionName=n,u.conversion=t,l["default"].BREAK}),l["default"].BREAK}),d};t["default"]=c},function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e,t){var n=e.__state.conversionName.toString(),o=Math.round(e.r),i=Math.round(e.g),r=Math.round(e.b),a=e.a,l=Math.round(e.h),s=e.s.toFixed(1),u=e.v.toFixed(1);if(t||"THREE_CHAR_HEX"===n||"SIX_CHAR_HEX"===n){for(var d=e.hex.toString(16);d.length<6;)d="0"+d;return"#"+d}return"CSS_RGB"===n?"rgb("+o+","+i+","+r+")":"CSS_RGBA"===n?"rgba("+o+","+i+","+r+","+a+")":"HEX"===n?"0x"+e.hex.toString(16):"RGB_ARRAY"===n?"["+o+","+i+","+r+"]":"RGBA_ARRAY"===n?"["+o+","+i+","+r+","+a+"]":"RGB_OBJ"===n?"{r:"+o+",g:"+i+",b:"+r+"}":"RGBA_OBJ"===n?"{r:"+o+",g:"+i+",b:"+r+",a:"+a+"}":"HSV_OBJ"===n?"{h:"+l+",s:"+s+",v:"+u+"}":"HSVA_OBJ"===n?"{h:"+l+",s:"+s+",v:"+u+",a:"+a+"}":"unknown format"}},function(e,t){"use strict";t.__esModule=!0;var n=Array.prototype.forEach,o=Array.prototype.slice,i={BREAK:{},extend:function(e){return this.each(o.call(arguments,1),function(t){var n=this.isObject(t)?Object.keys(t):[];n.forEach(function(n){this.isUndefined(t[n])||(e[n]=t[n])}.bind(this))},this),e},defaults:function(e){return this.each(o.call(arguments,1),function(t){var n=this.isObject(t)?Object.keys(t):[];n.forEach(function(n){this.isUndefined(e[n])&&(e[n]=t[n])}.bind(this))},this),e},compose:function(){var e=o.call(arguments);return function(){for(var t=o.call(arguments),n=e.length-1;n>=0;n--)t=[e[n].apply(this,t)];return t[0]}},each:function(e,t,o){if(e)if(n&&e.forEach&&e.forEach===n)e.forEach(t,o);else if(e.length===e.length+0){var i=void 0,r=void 0;for(i=0,r=e.length;i<r;i++)if(i in e&&t.call(o,e[i],i)===this.BREAK)return}else for(var a in e)if(t.call(o,e[a],a)===this.BREAK)return},defer:function(e){setTimeout(e,0)},debounce:function(e,t,n){var o=void 0;return function(){function i(){o=null,n||e.apply(r,a)}var r=this,a=arguments,l=n||!o;clearTimeout(o),o=setTimeout(i,t),l&&e.apply(r,a)}},toArray:function(e){return e.toArray?e.toArray():o.call(e)},isUndefined:function(e){return void 0===e},isNull:function(e){return null===e},isNaN:function(e){function t(t){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}(function(e){return isNaN(e)}),isArray:Array.isArray||function(e){return e.constructor===Array},isObject:function(e){return e===Object(e)},isNumber:function(e){return e===e+0},isString:function(e){return e===e+""},isBoolean:function(e){return e===!1||e===!0},isFunction:function(e){return"[object Function]"===Object.prototype.toString.call(e)}};t["default"]=i},function(e,t){"use strict";t.__esModule=!0;var n=void 0,o={hsv_to_rgb:function(e,t,n){var o=Math.floor(e/60)%6,i=e/60-Math.floor(e/60),r=n*(1-t),a=n*(1-i*t),l=n*(1-(1-i)*t),s=[[n,l,r],[a,n,r],[r,n,l],[r,a,n],[l,r,n],[n,r,a]][o];return{r:255*s[0],g:255*s[1],b:255*s[2]}},rgb_to_hsv:function(e,t,n){var o=Math.min(e,t,n),i=Math.max(e,t,n),r=i-o,a=void 0,l=void 0;return 0===i?{h:NaN,s:0,v:0}:(l=r/i,a=e===i?(t-n)/r:t===i?2+(n-e)/r:4+(e-t)/r,a/=6,a<0&&(a+=1),{h:360*a,s:l,v:i/255})},rgb_to_hex:function(e,t,n){var o=this.hex_with_component(0,2,e);return o=this.hex_with_component(o,1,t),o=this.hex_with_component(o,0,n)},component_from_hex:function(e,t){return e>>8*t&255},hex_with_component:function(e,t,o){return o<<(n=8*t)|e&~(255<<n)}};t["default"]=o},function(e,t){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var o=function(){function e(t,o){n(this,e),this.initialValue=t[o],this.domElement=document.createElement("div"),this.object=t,this.property=o,this.__onChange=void 0,this.__onFinishChange=void 0}return e.prototype.onChange=function(e){return this.__onChange=e,this},e.prototype.onFinishChange=function(e){return this.__onFinishChange=e,this},e.prototype.setValue=function(e){return this.object[this.property]=e,this.__onChange&&this.__onChange.call(this,e),this.updateDisplay(),this},e.prototype.getValue=function(){return this.object[this.property]},e.prototype.updateDisplay=function(){return this},e.prototype.isModified=function(){return this.initialValue!==this.getValue()},e}();t["default"]=o},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{"default":e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var l=n(7),s=o(l),u=n(9),d=o(u),c=function(e){function t(n,o){function a(){s.setValue(!s.__prev)}i(this,t);var l=r(this,e.call(this,n,o)),s=l;return l.__prev=l.getValue(),l.__checkbox=document.createElement("input"),l.__checkbox.setAttribute("type","checkbox"),d["default"].bind(l.__checkbox,"change",a,!1),l.domElement.appendChild(l.__checkbox),l.updateDisplay(),l}return a(t,e),t.prototype.setValue=function(t){var n=e.prototype.setValue.call(this,t);return this.__onFinishChange&&this.__onFinishChange.call(this,this.getValue()),this.__prev=this.getValue(),n},t.prototype.updateDisplay=function(){return this.getValue()===!0?(this.__checkbox.setAttribute("checked","checked"),this.__checkbox.checked=!0,this.__prev=!0):(this.__checkbox.checked=!1,this.__prev=!1),e.prototype.updateDisplay.call(this)},t}(s["default"]);t["default"]=c},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{"default":e}}function i(e){if("0"===e||a["default"].isUndefined(e))return 0;var t=e.match(u);return a["default"].isNull(t)?0:parseFloat(t[1])}t.__esModule=!0;var r=n(5),a=o(r),l={HTMLEvents:["change"],MouseEvents:["click","mousemove","mousedown","mouseup","mouseover"],KeyboardEvents:["keydown"]},s={};a["default"].each(l,function(e,t){a["default"].each(e,function(e){s[e]=t})});var u=/(\d+(\.\d+)?)px/,d={makeSelectable:function(e,t){void 0!==e&&void 0!==e.style&&(e.onselectstart=t?function(){return!1}:function(){},e.style.MozUserSelect=t?"auto":"none",e.style.KhtmlUserSelect=t?"auto":"none",e.unselectable=t?"on":"off")},makeFullscreen:function(e,t,n){var o=n,i=t;a["default"].isUndefined(i)&&(i=!0),a["default"].isUndefined(o)&&(o=!0),e.style.position="absolute",i&&(e.style.left=0,e.style.right=0),o&&(e.style.top=0,e.style.bottom=0)},fakeEvent:function(e,t,n,o){var i=n||{},r=s[t];if(!r)throw new Error("Event type "+t+" not supported.");var l=document.createEvent(r);switch(r){case"MouseEvents":var u=i.x||i.clientX||0,d=i.y||i.clientY||0;l.initMouseEvent(t,i.bubbles||!1,i.cancelable||!0,window,i.clickCount||1,0,0,u,d,!1,!1,!1,!1,0,null);break;case"KeyboardEvents":var c=l.initKeyboardEvent||l.initKeyEvent;a["default"].defaults(i,{cancelable:!0,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,keyCode:void 0,charCode:void 0}),c(t,i.bubbles||!1,i.cancelable,window,i.ctrlKey,i.altKey,i.shiftKey,i.metaKey,i.keyCode,i.charCode);break;default:l.initEvent(t,i.bubbles||!1,i.cancelable||!0)}a["default"].defaults(l,o),e.dispatchEvent(l)},bind:function(e,t,n,o){var i=o||!1;return e.addEventListener?e.addEventListener(t,n,i):e.attachEvent&&e.attachEvent("on"+t,n),d},unbind:function(e,t,n,o){var i=o||!1;return e.removeEventListener?e.removeEventListener(t,n,i):e.detachEvent&&e.detachEvent("on"+t,n),d},addClass:function(e,t){if(void 0===e.className)e.className=t;else if(e.className!==t){var n=e.className.split(/ +/);n.indexOf(t)===-1&&(n.push(t),e.className=n.join(" ").replace(/^\s+/,"").replace(/\s+$/,""))}return d},removeClass:function(e,t){if(t)if(e.className===t)e.removeAttribute("class");else{var n=e.className.split(/ +/),o=n.indexOf(t);o!==-1&&(n.splice(o,1),e.className=n.join(" "))}else e.className=void 0;return d},hasClass:function(e,t){return new RegExp("(?:^|\\s+)"+t+"(?:\\s+|$)").test(e.className)||!1},getWidth:function(e){var t=getComputedStyle(e);return i(t["border-left-width"])+i(t["border-right-width"])+i(t["padding-left"])+i(t["padding-right"])+i(t.width)},getHeight:function(e){var t=getComputedStyle(e);return i(t["border-top-width"])+i(t["border-bottom-width"])+i(t["padding-top"])+i(t["padding-bottom"])+i(t.height)},getOffset:function(e){var t=e,n={left:0,top:0};if(t.offsetParent)do n.left+=t.offsetLeft,n.top+=t.offsetTop,t=t.offsetParent;while(t);return n},isActive:function(e){return e===document.activeElement&&(e.type||e.href)}};t["default"]=d},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{"default":e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var l=n(7),s=o(l),u=n(9),d=o(u),c=n(5),f=o(c),_=function(e){function t(n,o,a){i(this,t);var l=r(this,e.call(this,n,o)),s=a,u=l;return l.__select=document.createElement("select"),f["default"].isArray(s)&&!function(){var e={};f["default"].each(s,function(t){e[t]=t}),s=e}(),f["default"].each(s,function(e,t){var n=document.createElement("option");n.innerHTML=t,n.setAttribute("value",e),u.__select.appendChild(n)}),l.updateDisplay(),d["default"].bind(l.__select,"change",function(){var e=this.options[this.selectedIndex].value;u.setValue(e)}),l.domElement.appendChild(l.__select),l}return a(t,e),t.prototype.setValue=function(t){var n=e.prototype.setValue.call(this,t);return this.__onFinishChange&&this.__onFinishChange.call(this,this.getValue()),n},t.prototype.updateDisplay=function(){return d["default"].isActive(this.__select)?this:(this.__select.value=this.getValue(),e.prototype.updateDisplay.call(this))},t}(s["default"]);t["default"]=_},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{"default":e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var l=n(7),s=o(l),u=n(9),d=o(u),c=function(e){function t(n,o){function a(){u.setValue(u.__input.value)}function l(){u.__onFinishChange&&u.__onFinishChange.call(u,u.getValue())}i(this,t);var s=r(this,e.call(this,n,o)),u=s;return s.__input=document.createElement("input"),s.__input.setAttribute("type","text"),d["default"].bind(s.__input,"keyup",a),d["default"].bind(s.__input,"change",a),d["default"].bind(s.__input,"blur",l),d["default"].bind(s.__input,"keydown",function(e){13===e.keyCode&&this.blur()}),s.updateDisplay(),s.domElement.appendChild(s.__input),s}return a(t,e),t.prototype.updateDisplay=function(){return d["default"].isActive(this.__input)||(this.__input.value=this.getValue()),e.prototype.updateDisplay.call(this)},t}(s["default"]);t["default"]=c},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{"default":e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function l(e){var t=e.toString();return t.indexOf(".")>-1?t.length-t.indexOf(".")-1:0}t.__esModule=!0;var s=n(7),u=o(s),d=n(5),c=o(d),f=function(e){function t(n,o,a){i(this,t);var s=r(this,e.call(this,n,o)),u=a||{};return s.__min=u.min,s.__max=u.max,s.__step=u.step,c["default"].isUndefined(s.__step)?0===s.initialValue?s.__impliedStep=1:s.__impliedStep=Math.pow(10,Math.floor(Math.log(Math.abs(s.initialValue))/Math.LN10))/10:s.__impliedStep=s.__step,s.__precision=l(s.__impliedStep),s}return a(t,e),t.prototype.setValue=function(t){var n=t;return void 0!==this.__min&&n<this.__min?n=this.__min:void 0!==this.__max&&n>this.__max&&(n=this.__max),void 0!==this.__step&&n%this.__step!==0&&(n=Math.round(n/this.__step)*this.__step),e.prototype.setValue.call(this,n)},t.prototype.min=function(e){return this.__min=e,this},t.prototype.max=function(e){return this.__max=e,this},t.prototype.step=function(e){return this.__step=e,this.__impliedStep=e,this.__precision=l(e),this},t}(u["default"]);t["default"]=f},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{"default":e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function l(e,t){var n=Math.pow(10,t);return Math.round(e*n)/n}t.__esModule=!0;var s=n(12),u=o(s),d=n(9),c=o(d),f=n(5),_=o(f),p=function(e){function t(n,o,a){function l(){var e=parseFloat(m.__input.value);_["default"].isNaN(e)||m.setValue(e)}function s(){m.__onFinishChange&&m.__onFinishChange.call(m,m.getValue())}function u(){s()}function d(e){var t=b-e.clientY;m.setValue(m.getValue()+t*m.__impliedStep),b=e.clientY}function f(){c["default"].unbind(window,"mousemove",d),c["default"].unbind(window,"mouseup",f),s()}function p(e){c["default"].bind(window,"mousemove",d),c["default"].bind(window,"mouseup",f),b=e.clientY}i(this,t);var h=r(this,e.call(this,n,o,a));h.__truncationSuspended=!1;var m=h,b=void 0;return h.__input=document.createElement("input"),h.__input.setAttribute("type","text"),c["default"].bind(h.__input,"change",l),c["default"].bind(h.__input,"blur",u),c["default"].bind(h.__input,"mousedown",p),c["default"].bind(h.__input,"keydown",function(e){13===e.keyCode&&(m.__truncationSuspended=!0,this.blur(),m.__truncationSuspended=!1,s())}),h.updateDisplay(),h.domElement.appendChild(h.__input),h}return a(t,e),t.prototype.updateDisplay=function(){return this.__input.value=this.__truncationSuspended?this.getValue():l(this.getValue(),this.__precision),e.prototype.updateDisplay.call(this)},t}(u["default"]);t["default"]=p},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{"default":e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function l(e,t,n,o,i){return o+(i-o)*((e-t)/(n-t))}t.__esModule=!0;var s=n(12),u=o(s),d=n(9),c=o(d),f=function(e){function t(n,o,a,s,u){function d(e){document.activeElement.blur(),c["default"].bind(window,"mousemove",f),c["default"].bind(window,"mouseup",_),f(e)}function f(e){e.preventDefault();var t=h.__background.getBoundingClientRect();return h.setValue(l(e.clientX,t.left,t.right,h.__min,h.__max)),!1}function _(){c["default"].unbind(window,"mousemove",f),c["default"].unbind(window,"mouseup",_),h.__onFinishChange&&h.__onFinishChange.call(h,h.getValue())}i(this,t);var p=r(this,e.call(this,n,o,{min:a,max:s,step:u})),h=p;return p.__background=document.createElement("div"),p.__foreground=document.createElement("div"),c["default"].bind(p.__background,"mousedown",d),c["default"].addClass(p.__background,"slider"),c["default"].addClass(p.__foreground,"slider-fg"),p.updateDisplay(),p.__background.appendChild(p.__foreground),p.domElement.appendChild(p.__background),p}return a(t,e),t.prototype.updateDisplay=function(){var t=(this.getValue()-this.__min)/(this.__max-this.__min);return this.__foreground.style.width=100*t+"%",e.prototype.updateDisplay.call(this)},t}(u["default"]);t["default"]=f},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{"default":e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var l=n(7),s=o(l),u=n(9),d=o(u),c=function(e){function t(n,o,a){i(this,t);var l=r(this,e.call(this,n,o)),s=l;return l.__button=document.createElement("div"),l.__button.innerHTML=void 0===a?"Fire":a,d["default"].bind(l.__button,"click",function(e){return e.preventDefault(),s.fire(),!1}),d["default"].addClass(l.__button,"button"),l.domElement.appendChild(l.__button),l}return a(t,e),t.prototype.fire=function(){this.__onChange&&this.__onChange.call(this),this.getValue().call(this.object),this.__onFinishChange&&this.__onFinishChange.call(this,this.getValue())},t}(s["default"]);t["default"]=c},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{"default":e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function l(e,t,n,o){e.style.background="",g["default"].each(y,function(i){e.style.cssText+="background: "+i+"linear-gradient("+t+", "+n+" 0%, "+o+" 100%); "})}function s(e){e.style.background="",e.style.cssText+="background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);",e.style.cssText+="background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);",e.style.cssText+="background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);",e.style.cssText+="background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);",e.style.cssText+="background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);"}t.__esModule=!0;var u=n(7),d=o(u),c=n(9),f=o(c),_=n(2),p=o(_),h=n(3),m=o(h),b=n(5),g=o(b),v=function(e){function t(n,o){function a(e){h(e),f["default"].bind(window,"mousemove",h),f["default"].bind(window,"mouseup",u)}function u(){f["default"].unbind(window,"mousemove",h),f["default"].unbind(window,"mouseup",u),_()}function d(){var e=(0,m["default"])(this.value);e!==!1?(y.__color.__state=e,y.setValue(y.__color.toOriginal())):this.value=y.__color.toString()}function c(){f["default"].unbind(window,"mousemove",b),f["default"].unbind(window,"mouseup",c),_()}function _(){y.__onFinishChange&&y.__onFinishChange.call(y,y.__color.toOriginal())}function h(e){e.preventDefault();var t=y.__saturation_field.getBoundingClientRect(),n=(e.clientX-t.left)/(t.right-t.left),o=1-(e.clientY-t.top)/(t.bottom-t.top);return o>1?o=1:o<0&&(o=0),n>1?n=1:n<0&&(n=0),y.__color.v=o,y.__color.s=n,y.setValue(y.__color.toOriginal()),!1}function b(e){e.preventDefault();var t=y.__hue_field.getBoundingClientRect(),n=1-(e.clientY-t.top)/(t.bottom-t.top);return n>1?n=1:n<0&&(n=0),y.__color.h=360*n,y.setValue(y.__color.toOriginal()),!1}i(this,t);var v=r(this,e.call(this,n,o));v.__color=new p["default"](v.getValue()),v.__temp=new p["default"](0);var y=v;v.domElement=document.createElement("div"),f["default"].makeSelectable(v.domElement,!1),v.__selector=document.createElement("div"),v.__selector.className="selector",v.__saturation_field=document.createElement("div"),v.__saturation_field.className="saturation-field",v.__field_knob=document.createElement("div"),v.__field_knob.className="field-knob",v.__field_knob_border="2px solid ",v.__hue_knob=document.createElement("div"),v.__hue_knob.className="hue-knob",v.__hue_field=document.createElement("div"),v.__hue_field.className="hue-field",v.__input=document.createElement("input"),v.__input.type="text",v.__input_textShadow="0 1px 1px ",f["default"].bind(v.__input,"keydown",function(e){13===e.keyCode&&d.call(this)}),f["default"].bind(v.__input,"blur",d),f["default"].bind(v.__selector,"mousedown",function(){f["default"].addClass(this,"drag").bind(window,"mouseup",function(){f["default"].removeClass(y.__selector,"drag")})});var w=document.createElement("div");return g["default"].extend(v.__selector.style,{width:"122px",height:"102px",padding:"3px",backgroundColor:"#222",boxShadow:"0px 1px 3px rgba(0,0,0,0.3)"}),g["default"].extend(v.__field_knob.style,{position:"absolute",width:"12px",height:"12px",border:v.__field_knob_border+(v.__color.v<.5?"#fff":"#000"),boxShadow:"0px 1px 3px rgba(0,0,0,0.5)",borderRadius:"12px",zIndex:1}),g["default"].extend(v.__hue_knob.style,{position:"absolute",width:"15px",height:"2px",borderRight:"4px solid #fff",zIndex:1}),g["default"].extend(v.__saturation_field.style,{width:"100px",height:"100px",border:"1px solid #555",marginRight:"3px",display:"inline-block",cursor:"pointer"}),g["default"].extend(w.style,{width:"100%",height:"100%",background:"none"}),l(w,"top","rgba(0,0,0,0)","#000"),g["default"].extend(v.__hue_field.style,{width:"15px",height:"100px",border:"1px solid #555",cursor:"ns-resize",position:"absolute",top:"3px",right:"3px"}),s(v.__hue_field),g["default"].extend(v.__input.style,{outline:"none",textAlign:"center",color:"#fff",border:0,fontWeight:"bold",textShadow:v.__input_textShadow+"rgba(0,0,0,0.7)"}),f["default"].bind(v.__saturation_field,"mousedown",a),f["default"].bind(v.__field_knob,"mousedown",a),f["default"].bind(v.__hue_field,"mousedown",function(e){b(e),f["default"].bind(window,"mousemove",b),f["default"].bind(window,"mouseup",c)}),v.__saturation_field.appendChild(w),v.__selector.appendChild(v.__field_knob),v.__selector.appendChild(v.__saturation_field),v.__selector.appendChild(v.__hue_field),v.__hue_field.appendChild(v.__hue_knob),v.domElement.appendChild(v.__input),v.domElement.appendChild(v.__selector),v.updateDisplay(),v}return a(t,e),t.prototype.updateDisplay=function(){var e=(0,m["default"])(this.getValue());if(e!==!1){var t=!1;g["default"].each(p["default"].COMPONENTS,function(n){if(!g["default"].isUndefined(e[n])&&!g["default"].isUndefined(this.__color.__state[n])&&e[n]!==this.__color.__state[n])return t=!0,{}},this),t&&g["default"].extend(this.__color.__state,e)}g["default"].extend(this.__temp.__state,this.__color.__state),this.__temp.a=1;var n=this.__color.v<.5||this.__color.s>.5?255:0,o=255-n;g["default"].extend(this.__field_knob.style,{marginLeft:100*this.__color.s-7+"px",marginTop:100*(1-this.__color.v)-7+"px",backgroundColor:this.__temp.toHexString(),border:this.__field_knob_border+"rgb("+n+","+n+","+n+")"}),this.__hue_knob.style.marginTop=100*(1-this.__color.h/360)+"px",this.__temp.s=1,this.__temp.v=1,l(this.__saturation_field,"left","#fff",this.__temp.toHexString()),this.__input.value=this.__color.toString(),g["default"].extend(this.__input.style,{backgroundColor:this.__color.toHexString(),color:"rgb("+n+","+n+","+n+")",textShadow:this.__input_textShadow+"rgba("+o+","+o+","+o+",.7)"})},t}(d["default"]),y=["-moz-","-o-","-webkit-","-ms-",""];t["default"]=v},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{"default":e}}function i(e,t,n){var o=document.createElement("li");return t&&o.appendChild(t),n?e.__ul.insertBefore(o,n):e.__ul.appendChild(o),e.onResize(),o}function r(e,t){var n=e.__preset_select[e.__preset_select.selectedIndex];t?n.innerHTML=n.value+"*":n.innerHTML=n.value}function a(e,t,n){if(n.__li=t,n.__gui=e,U["default"].extend(n,{options:function(t){if(arguments.length>1){var o=n.__li.nextElementSibling;return n.remove(),s(e,n.object,n.property,{before:o,factoryArgs:[U["default"].toArray(arguments)]})}if(U["default"].isArray(t)||U["default"].isObject(t)){var i=n.__li.nextElementSibling;return n.remove(),s(e,n.object,n.property,{before:i,factoryArgs:[t]})}},name:function(e){return n.__li.firstElementChild.firstElementChild.innerHTML=e, +n},listen:function(){return n.__gui.listen(n),n},remove:function(){return n.__gui.remove(n),n}}),n instanceof M["default"])!function(){var e=new B["default"](n.object,n.property,{min:n.__min,max:n.__max,step:n.__step});U["default"].each(["updateDisplay","onChange","onFinishChange","step"],function(t){var o=n[t],i=e[t];n[t]=e[t]=function(){var t=Array.prototype.slice.call(arguments);return i.apply(e,t),o.apply(n,t)}}),z["default"].addClass(t,"has-slider"),n.domElement.insertBefore(e.domElement,n.domElement.firstElementChild)}();else if(n instanceof B["default"]){var o=function(t){if(U["default"].isNumber(n.__min)&&U["default"].isNumber(n.__max)){var o=n.__li.firstElementChild.firstElementChild.innerHTML,i=n.__gui.__listening.indexOf(n)>-1;n.remove();var r=s(e,n.object,n.property,{before:n.__li.nextElementSibling,factoryArgs:[n.__min,n.__max,n.__step]});return r.name(o),i&&r.listen(),r}return t};n.min=U["default"].compose(o,n.min),n.max=U["default"].compose(o,n.max)}else n instanceof O["default"]?(z["default"].bind(t,"click",function(){z["default"].fakeEvent(n.__checkbox,"click")}),z["default"].bind(n.__checkbox,"click",function(e){e.stopPropagation()})):n instanceof R["default"]?(z["default"].bind(t,"click",function(){z["default"].fakeEvent(n.__button,"click")}),z["default"].bind(t,"mouseover",function(){z["default"].addClass(n.__button,"hover")}),z["default"].bind(t,"mouseout",function(){z["default"].removeClass(n.__button,"hover")})):n instanceof j["default"]&&(z["default"].addClass(t,"color"),n.updateDisplay=U["default"].compose(function(e){return t.style.borderLeftColor=n.__color.toString(),e},n.updateDisplay),n.updateDisplay());n.setValue=U["default"].compose(function(t){return e.getRoot().__preset_select&&n.isModified()&&r(e.getRoot(),!0),t},n.setValue)}function l(e,t){var n=e.getRoot(),o=n.__rememberedObjects.indexOf(t.object);if(o!==-1){var i=n.__rememberedObjectIndecesToControllers[o];if(void 0===i&&(i={},n.__rememberedObjectIndecesToControllers[o]=i),i[t.property]=t,n.load&&n.load.remembered){var r=n.load.remembered,a=void 0;if(r[e.preset])a=r[e.preset];else{if(!r[Q])return;a=r[Q]}if(a[o]&&void 0!==a[o][t.property]){var l=a[o][t.property];t.initialValue=l,t.setValue(l)}}}}function s(e,t,n,o){if(void 0===t[n])throw new Error('Object "'+t+'" has no property "'+n+'"');var r=void 0;if(o.color)r=new j["default"](t,n);else{var s=[t,n].concat(o.factoryArgs);r=C["default"].apply(e,s)}o.before instanceof S["default"]&&(o.before=o.before.__li),l(e,r),z["default"].addClass(r.domElement,"c");var u=document.createElement("span");z["default"].addClass(u,"property-name"),u.innerHTML=r.property;var d=document.createElement("div");d.appendChild(u),d.appendChild(r.domElement);var c=i(e,d,o.before);return z["default"].addClass(c,oe.CLASS_CONTROLLER_ROW),r instanceof j["default"]?z["default"].addClass(c,"color"):z["default"].addClass(c,g(r.getValue())),a(e,c,r),e.__controllers.push(r),r}function u(e,t){return document.location.href+"."+t}function d(e,t,n){var o=document.createElement("option");o.innerHTML=t,o.value=t,e.__preset_select.appendChild(o),n&&(e.__preset_select.selectedIndex=e.__preset_select.length-1)}function c(e,t){t.style.display=e.useLocalStorage?"block":"none"}function f(e){var t=e.__save_row=document.createElement("li");z["default"].addClass(e.domElement,"has-save"),e.__ul.insertBefore(t,e.__ul.firstChild),z["default"].addClass(t,"save-row");var n=document.createElement("span");n.innerHTML=" ",z["default"].addClass(n,"button gears");var o=document.createElement("span");o.innerHTML="Save",z["default"].addClass(o,"button"),z["default"].addClass(o,"save");var i=document.createElement("span");i.innerHTML="New",z["default"].addClass(i,"button"),z["default"].addClass(i,"save-as");var r=document.createElement("span");r.innerHTML="Revert",z["default"].addClass(r,"button"),z["default"].addClass(r,"revert");var a=e.__preset_select=document.createElement("select");e.load&&e.load.remembered?U["default"].each(e.load.remembered,function(t,n){d(e,n,n===e.preset)}):d(e,Q,!1),z["default"].bind(a,"change",function(){for(var t=0;t<e.__preset_select.length;t++)e.__preset_select[t].innerHTML=e.__preset_select[t].value;e.preset=this.value}),t.appendChild(a),t.appendChild(n),t.appendChild(o),t.appendChild(i),t.appendChild(r),q&&!function(){var t=document.getElementById("dg-local-explain"),n=document.getElementById("dg-local-storage"),o=document.getElementById("dg-save-locally");o.style.display="block","true"===localStorage.getItem(u(e,"isLocal"))&&n.setAttribute("checked","checked"),c(e,t),z["default"].bind(n,"change",function(){e.useLocalStorage=!e.useLocalStorage,c(e,t)})}();var l=document.getElementById("dg-new-constructor");z["default"].bind(l,"keydown",function(e){!e.metaKey||67!==e.which&&67!==e.keyCode||Z.hide()}),z["default"].bind(n,"click",function(){l.innerHTML=JSON.stringify(e.getSaveObject(),void 0,2),Z.show(),l.focus(),l.select()}),z["default"].bind(o,"click",function(){e.save()}),z["default"].bind(i,"click",function(){var t=prompt("Enter a new preset name.");t&&e.saveAs(t)}),z["default"].bind(r,"click",function(){e.revert()})}function _(e){function t(t){return t.preventDefault(),e.width+=i-t.clientX,e.onResize(),i=t.clientX,!1}function n(){z["default"].removeClass(e.__closeButton,oe.CLASS_DRAG),z["default"].unbind(window,"mousemove",t),z["default"].unbind(window,"mouseup",n)}function o(o){return o.preventDefault(),i=o.clientX,z["default"].addClass(e.__closeButton,oe.CLASS_DRAG),z["default"].bind(window,"mousemove",t),z["default"].bind(window,"mouseup",n),!1}var i=void 0;e.__resize_handle=document.createElement("div"),U["default"].extend(e.__resize_handle.style,{width:"6px",marginLeft:"-3px",height:"200px",cursor:"ew-resize",position:"absolute"}),z["default"].bind(e.__resize_handle,"mousedown",o),z["default"].bind(e.__closeButton,"mousedown",o),e.domElement.insertBefore(e.__resize_handle,e.domElement.firstElementChild)}function p(e,t){e.domElement.style.width=t+"px",e.__save_row&&e.autoPlace&&(e.__save_row.style.width=t+"px"),e.__closeButton&&(e.__closeButton.style.width=t+"px")}function h(e,t){var n={};return U["default"].each(e.__rememberedObjects,function(o,i){var r={},a=e.__rememberedObjectIndecesToControllers[i];U["default"].each(a,function(e,n){r[n]=t?e.initialValue:e.getValue()}),n[i]=r}),n}function m(e){for(var t=0;t<e.__preset_select.length;t++)e.__preset_select[t].value===e.preset&&(e.__preset_select.selectedIndex=t)}function b(e){0!==e.length&&D["default"].call(window,function(){b(e)}),U["default"].each(e,function(e){e.updateDisplay()})}var g="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol?"symbol":typeof e},v=n(18),y=o(v),w=n(19),x=o(w),E=n(20),C=o(E),A=n(7),S=o(A),k=n(8),O=o(k),T=n(15),R=o(T),L=n(13),B=o(L),N=n(14),M=o(N),H=n(16),j=o(H),P=n(21),D=o(P),V=n(22),F=o(V),I=n(9),z=o(I),G=n(5),U=o(G),X=n(23),K=o(X);y["default"].inject(K["default"]);var Y="dg",J=72,W=20,Q="Default",q=function(){try{return"localStorage"in window&&null!==window.localStorage}catch(e){return!1}}(),Z=void 0,$=!0,ee=void 0,te=!1,ne=[],oe=function ie(e){function t(){var e=n.getRoot();e.width+=1,U["default"].defer(function(){e.width-=1})}var n=this,o=e||{};this.domElement=document.createElement("div"),this.__ul=document.createElement("ul"),this.domElement.appendChild(this.__ul),z["default"].addClass(this.domElement,Y),this.__folders={},this.__controllers=[],this.__rememberedObjects=[],this.__rememberedObjectIndecesToControllers=[],this.__listening=[],o=U["default"].defaults(o,{closeOnTop:!1,autoPlace:!0,width:ie.DEFAULT_WIDTH}),o=U["default"].defaults(o,{resizable:o.autoPlace,hideable:o.autoPlace}),U["default"].isUndefined(o.load)?o.load={preset:Q}:o.preset&&(o.load.preset=o.preset),U["default"].isUndefined(o.parent)&&o.hideable&&ne.push(this),o.resizable=U["default"].isUndefined(o.parent)&&o.resizable,o.autoPlace&&U["default"].isUndefined(o.scrollable)&&(o.scrollable=!0);var r=q&&"true"===localStorage.getItem(u(this,"isLocal")),a=void 0;if(Object.defineProperties(this,{parent:{get:function(){return o.parent}},scrollable:{get:function(){return o.scrollable}},autoPlace:{get:function(){return o.autoPlace}},closeOnTop:{get:function(){return o.closeOnTop}},preset:{get:function(){return n.parent?n.getRoot().preset:o.load.preset},set:function(e){n.parent?n.getRoot().preset=e:o.load.preset=e,m(this),n.revert()}},width:{get:function(){return o.width},set:function(e){o.width=e,p(n,e)}},name:{get:function(){return o.name},set:function(e){o.name=e,titleRowName&&(titleRowName.innerHTML=o.name)}},closed:{get:function(){return o.closed},set:function(e){o.closed=e,o.closed?z["default"].addClass(n.__ul,ie.CLASS_CLOSED):z["default"].removeClass(n.__ul,ie.CLASS_CLOSED),this.onResize(),n.__closeButton&&(n.__closeButton.innerHTML=e?ie.TEXT_OPEN:ie.TEXT_CLOSED)}},load:{get:function(){return o.load}},useLocalStorage:{get:function(){return r},set:function(e){q&&(r=e,e?z["default"].bind(window,"unload",a):z["default"].unbind(window,"unload",a),localStorage.setItem(u(n,"isLocal"),e))}}}),U["default"].isUndefined(o.parent)){if(o.closed=!1,z["default"].addClass(this.domElement,ie.CLASS_MAIN),z["default"].makeSelectable(this.domElement,!1),q&&r){n.useLocalStorage=!0;var l=localStorage.getItem(u(this,"gui"));l&&(o.load=JSON.parse(l))}this.__closeButton=document.createElement("div"),this.__closeButton.innerHTML=ie.TEXT_CLOSED,z["default"].addClass(this.__closeButton,ie.CLASS_CLOSE_BUTTON),o.closeOnTop?(z["default"].addClass(this.__closeButton,ie.CLASS_CLOSE_TOP),this.domElement.insertBefore(this.__closeButton,this.domElement.childNodes[0])):(z["default"].addClass(this.__closeButton,ie.CLASS_CLOSE_BOTTOM),this.domElement.appendChild(this.__closeButton)),z["default"].bind(this.__closeButton,"click",function(){n.closed=!n.closed})}else{void 0===o.closed&&(o.closed=!0);var s=document.createTextNode(o.name);z["default"].addClass(s,"controller-name");var d=i(n,s),c=function(e){return e.preventDefault(),n.closed=!n.closed,!1};z["default"].addClass(this.__ul,ie.CLASS_CLOSED),z["default"].addClass(d,"title"),z["default"].bind(d,"click",c),o.closed||(this.closed=!1)}o.autoPlace&&(U["default"].isUndefined(o.parent)&&($&&(ee=document.createElement("div"),z["default"].addClass(ee,Y),z["default"].addClass(ee,ie.CLASS_AUTO_PLACE_CONTAINER),document.body.appendChild(ee),$=!1),ee.appendChild(this.domElement),z["default"].addClass(this.domElement,ie.CLASS_AUTO_PLACE)),this.parent||p(n,o.width)),this.__resizeHandler=function(){n.onResizeDebounced()},z["default"].bind(window,"resize",this.__resizeHandler),z["default"].bind(this.__ul,"webkitTransitionEnd",this.__resizeHandler),z["default"].bind(this.__ul,"transitionend",this.__resizeHandler),z["default"].bind(this.__ul,"oTransitionEnd",this.__resizeHandler),this.onResize(),o.resizable&&_(this),a=function(){q&&"true"===localStorage.getItem(u(n,"isLocal"))&&localStorage.setItem(u(n,"gui"),JSON.stringify(n.getSaveObject()))},this.saveToLocalStorageIfPossible=a,o.parent||t()};oe.toggleHide=function(){te=!te,U["default"].each(ne,function(e){e.domElement.style.display=te?"none":""})},oe.CLASS_AUTO_PLACE="a",oe.CLASS_AUTO_PLACE_CONTAINER="ac",oe.CLASS_MAIN="main",oe.CLASS_CONTROLLER_ROW="cr",oe.CLASS_TOO_TALL="taller-than-window",oe.CLASS_CLOSED="closed",oe.CLASS_CLOSE_BUTTON="close-button",oe.CLASS_CLOSE_TOP="close-top",oe.CLASS_CLOSE_BOTTOM="close-bottom",oe.CLASS_DRAG="drag",oe.DEFAULT_WIDTH=245,oe.TEXT_CLOSED="Close Controls",oe.TEXT_OPEN="Open Controls",oe._keydownHandler=function(e){"text"===document.activeElement.type||e.which!==J&&e.keyCode!==J||oe.toggleHide()},z["default"].bind(window,"keydown",oe._keydownHandler,!1),U["default"].extend(oe.prototype,{add:function(e,t){return s(this,e,t,{factoryArgs:Array.prototype.slice.call(arguments,2)})},addColor:function(e,t){return s(this,e,t,{color:!0})},remove:function(e){this.__ul.removeChild(e.__li),this.__controllers.splice(this.__controllers.indexOf(e),1);var t=this;U["default"].defer(function(){t.onResize()})},destroy:function(){this.autoPlace&&ee.removeChild(this.domElement),z["default"].unbind(window,"keydown",oe._keydownHandler,!1),z["default"].unbind(window,"resize",this.__resizeHandler),this.saveToLocalStorageIfPossible&&z["default"].unbind(window,"unload",this.saveToLocalStorageIfPossible)},addFolder:function(e){if(void 0!==this.__folders[e])throw new Error('You already have a folder in this GUI by the name "'+e+'"');var t={name:e,parent:this};t.autoPlace=this.autoPlace,this.load&&this.load.folders&&this.load.folders[e]&&(t.closed=this.load.folders[e].closed,t.load=this.load.folders[e]);var n=new oe(t);this.__folders[e]=n;var o=i(this,n.domElement);return z["default"].addClass(o,"folder"),n},open:function(){this.closed=!1},close:function(){this.closed=!0},onResize:function(){var e=this.getRoot();if(e.scrollable){var t=z["default"].getOffset(e.__ul).top,n=0;U["default"].each(e.__ul.childNodes,function(t){e.autoPlace&&t===e.__save_row||(n+=z["default"].getHeight(t))}),window.innerHeight-t-W<n?(z["default"].addClass(e.domElement,oe.CLASS_TOO_TALL),e.__ul.style.height=window.innerHeight-t-W+"px"):(z["default"].removeClass(e.domElement,oe.CLASS_TOO_TALL),e.__ul.style.height="auto")}e.__resize_handle&&U["default"].defer(function(){e.__resize_handle.style.height=e.__ul.offsetHeight+"px"}),e.__closeButton&&(e.__closeButton.style.width=e.width+"px")},onResizeDebounced:U["default"].debounce(function(){this.onResize()},50),remember:function(){if(U["default"].isUndefined(Z)&&(Z=new F["default"],Z.domElement.innerHTML=x["default"]),this.parent)throw new Error("You can only call remember on a top level GUI.");var e=this;U["default"].each(Array.prototype.slice.call(arguments),function(t){0===e.__rememberedObjects.length&&f(e),e.__rememberedObjects.indexOf(t)===-1&&e.__rememberedObjects.push(t)}),this.autoPlace&&p(this,this.width)},getRoot:function(){for(var e=this;e.parent;)e=e.parent;return e},getSaveObject:function(){var e=this.load;return e.closed=this.closed,this.__rememberedObjects.length>0&&(e.preset=this.preset,e.remembered||(e.remembered={}),e.remembered[this.preset]=h(this)),e.folders={},U["default"].each(this.__folders,function(t,n){e.folders[n]=t.getSaveObject()}),e},save:function(){this.load.remembered||(this.load.remembered={}),this.load.remembered[this.preset]=h(this),r(this,!1),this.saveToLocalStorageIfPossible()},saveAs:function(e){this.load.remembered||(this.load.remembered={},this.load.remembered[Q]=h(this,!0)),this.load.remembered[e]=h(this),this.preset=e,d(this,e,!0),this.saveToLocalStorageIfPossible()},revert:function(e){U["default"].each(this.__controllers,function(t){this.getRoot().load.remembered?l(e||this.getRoot(),t):t.setValue(t.initialValue),t.__onFinishChange&&t.__onFinishChange.call(t,t.getValue())},this),U["default"].each(this.__folders,function(e){e.revert(e)}),e||r(this.getRoot(),!1)},listen:function(e){var t=0===this.__listening.length;this.__listening.push(e),t&&b(this.__listening)},updateDisplay:function(){U["default"].each(this.__controllers,function(e){e.updateDisplay()}),U["default"].each(this.__folders,function(e){e.updateDisplay()})}}),e.exports=oe},function(e,t){"use strict";e.exports={load:function(e,t){var n=t||document,o=n.createElement("link");o.type="text/css",o.rel="stylesheet",o.href=e,n.getElementsByTagName("head")[0].appendChild(o)},inject:function(e,t){var n=t||document,o=document.createElement("style");o.type="text/css",o.innerHTML=e;var i=n.getElementsByTagName("head")[0];try{i.appendChild(o)}catch(r){}}}},function(e,t){e.exports="<div id=dg-save class=\"dg dialogue\"> Here's the new load parameter for your <code>GUI</code>'s constructor: <textarea id=dg-new-constructor></textarea> <div id=dg-save-locally> <input id=dg-local-storage type=checkbox /> Automatically save values to <code>localStorage</code> on exit. <div id=dg-local-explain>The values saved to <code>localStorage</code> will override those passed to <code>dat.GUI</code>'s constructor. This makes it easier to work incrementally, but <code>localStorage</code> is fragile, and your friends may not see the same values you do. </div> </div> </div>"},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{"default":e}}t.__esModule=!0;var i=n(10),r=o(i),a=n(13),l=o(a),s=n(14),u=o(s),d=n(11),c=o(d),f=n(15),_=o(f),p=n(8),h=o(p),m=n(5),b=o(m),g=function(e,t){var n=e[t];return b["default"].isArray(arguments[2])||b["default"].isObject(arguments[2])?new r["default"](e,t,arguments[2]):b["default"].isNumber(n)?b["default"].isNumber(arguments[2])&&b["default"].isNumber(arguments[3])?b["default"].isNumber(arguments[4])?new u["default"](e,t,arguments[2],arguments[3],arguments[4]):new u["default"](e,t,arguments[2],arguments[3]):b["default"].isNumber(arguments[4])?new l["default"](e,t,{min:arguments[2],max:arguments[3],step:arguments[4]}):new l["default"](e,t,{min:arguments[2],max:arguments[3]}):b["default"].isString(n)?new c["default"](e,t):b["default"].isFunction(n)?new _["default"](e,t,""):b["default"].isBoolean(n)?new h["default"](e,t):null};t["default"]=g},function(e,t){"use strict";function n(e){setTimeout(e,1e3/60)}t.__esModule=!0,t["default"]=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||n},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{"default":e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var r=n(9),a=o(r),l=n(5),s=o(l),u=function(){function e(){i(this,e),this.backgroundElement=document.createElement("div"),s["default"].extend(this.backgroundElement.style,{backgroundColor:"rgba(0,0,0,0.8)",top:0,left:0,display:"none",zIndex:"1000",opacity:0,WebkitTransition:"opacity 0.2s linear",transition:"opacity 0.2s linear"}),a["default"].makeFullscreen(this.backgroundElement),this.backgroundElement.style.position="fixed",this.domElement=document.createElement("div"),s["default"].extend(this.domElement.style,{position:"fixed",display:"none",zIndex:"1001",opacity:0,WebkitTransition:"-webkit-transform 0.2s ease-out, opacity 0.2s linear",transition:"transform 0.2s ease-out, opacity 0.2s linear"}),document.body.appendChild(this.backgroundElement),document.body.appendChild(this.domElement);var t=this;a["default"].bind(this.backgroundElement,"click",function(){t.hide()})}return e.prototype.show=function(){var e=this;this.backgroundElement.style.display="block",this.domElement.style.display="block",this.domElement.style.opacity=0,this.domElement.style.webkitTransform="scale(1.1)",this.layout(),s["default"].defer(function(){e.backgroundElement.style.opacity=1,e.domElement.style.opacity=1,e.domElement.style.webkitTransform="scale(1)"})},e.prototype.hide=function t(){var e=this,t=function n(){e.domElement.style.display="none",e.backgroundElement.style.display="none",a["default"].unbind(e.domElement,"webkitTransitionEnd",n),a["default"].unbind(e.domElement,"transitionend",n),a["default"].unbind(e.domElement,"oTransitionEnd",n)};a["default"].bind(this.domElement,"webkitTransitionEnd",t),a["default"].bind(this.domElement,"transitionend",t),a["default"].bind(this.domElement,"oTransitionEnd",t),this.backgroundElement.style.opacity=0,this.domElement.style.opacity=0,this.domElement.style.webkitTransform="scale(1.1)"},e.prototype.layout=function(){this.domElement.style.left=window.innerWidth/2-a["default"].getWidth(this.domElement)/2+"px",this.domElement.style.top=window.innerHeight/2-a["default"].getHeight(this.domElement)/2+"px"},e}();t["default"]=u},function(e,t,n){t=e.exports=n(24)(),t.push([e.id,".dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity .1s linear;transition:opacity .1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1!important}.dg.main .close-button.drag,.dg.main:hover .close-button{opacity:1}.dg.main .close-button{-webkit-transition:opacity .1s linear;transition:opacity .1s linear;border:0;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button.close-top{position:relative}.dg.main .close-button.close-bottom{position:absolute}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-x:hidden}.dg.a.has-save>ul.close-top{margin-top:0}.dg.a.has-save>ul.close-bottom{margin-top:27px}.dg.a.has-save>ul.closed{margin-top:0}.dg.a .save-row{top:0;z-index:1002}.dg.a .save-row.close-top{position:relative}.dg.a .save-row.close-bottom{position:fixed}.dg li{-webkit-transition:height .1s ease-out;transition:height .1s ease-out;-webkit-transition:overflow .1s linear;transition:overflow .1s linear}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;overflow:visible;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid transparent}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li>*{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .c{float:left;width:60%;position:relative}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:7px}.dg .c select{margin-top:5px}.dg .cr.boolean,.dg .cr.boolean *,.dg .cr.function,.dg .cr.function *,.dg .cr.function .property-name{cursor:pointer}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco,monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px Lucida Grande,sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid hsla(0,0%,100%,.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.color{border-left:3px solid}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2fa1d6}.dg .cr.number input[type=text]{color:#2fa1d6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.boolean:hover,.dg .cr.function:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2fa1d6;max-width:100%}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda}",""])},function(e,t){e.exports=function(){var e=[];return e.toString=function(){for(var e=[],t=0;t<this.length;t++){var n=this[t];n[2]?e.push("@media "+n[2]+"{"+n[1]+"}"):e.push(n[1])}return e.join("")},e.i=function(t,n){"string"==typeof t&&(t=[[null,t,""]]);for(var o={},i=0;i<this.length;i++){var r=this[i][0];"number"==typeof r&&(o[r]=!0)}for(i=0;i<t.length;i++){var a=t[i];"number"==typeof a[0]&&o[a[0]]||(n&&!a[2]?a[2]=n:n&&(a[2]="("+a[2]+") and ("+n+")"),e.push(a))}},e}}])}); \ No newline at end of file diff --git a/1_Three.js/lib/three.js b/1_Three.js/lib/three.js new file mode 100755 index 0000000000000000000000000000000000000000..d9c68d25e56ef525914bce42e886974302a86541 --- /dev/null +++ b/1_Three.js/lib/three.js @@ -0,0 +1,43684 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (factory((global.THREE = global.THREE || {}))); +}(this, (function (exports) { 'use strict'; + + // Polyfills + + if ( Number.EPSILON === undefined ) { + + Number.EPSILON = Math.pow( 2, - 52 ); + + } + + if ( Number.isInteger === undefined ) { + + // Missing in IE + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger + + Number.isInteger = function ( value ) { + + return typeof value === 'number' && isFinite( value ) && Math.floor( value ) === value; + + }; + + } + + // + + if ( Math.sign === undefined ) { + + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sign + + Math.sign = function ( x ) { + + return ( x < 0 ) ? - 1 : ( x > 0 ) ? 1 : + x; + + }; + + } + + if ( Function.prototype.name === undefined ) { + + // Missing in IE + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name + + Object.defineProperty( Function.prototype, 'name', { + + get: function () { + + return this.toString().match( /^\s*function\s*([^\(\s]*)/ )[ 1 ]; + + } + + } ); + + } + + if ( Object.assign === undefined ) { + + // Missing in IE + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign + + ( function () { + + Object.assign = function ( target ) { + + 'use strict'; + + if ( target === undefined || target === null ) { + + throw new TypeError( 'Cannot convert undefined or null to object' ); + + } + + var output = Object( target ); + + for ( var index = 1; index < arguments.length; index ++ ) { + + var source = arguments[ index ]; + + if ( source !== undefined && source !== null ) { + + for ( var nextKey in source ) { + + if ( Object.prototype.hasOwnProperty.call( source, nextKey ) ) { + + output[ nextKey ] = source[ nextKey ]; + + } + + } + + } + + } + + return output; + + }; + + } )(); + + } + + /** + * https://github.com/mrdoob/eventdispatcher.js/ + */ + + function EventDispatcher() {} + + Object.assign( EventDispatcher.prototype, { + + addEventListener: function ( type, listener ) { + + if ( this._listeners === undefined ) this._listeners = {}; + + var listeners = this._listeners; + + if ( listeners[ type ] === undefined ) { + + listeners[ type ] = []; + + } + + if ( listeners[ type ].indexOf( listener ) === - 1 ) { + + listeners[ type ].push( listener ); + + } + + }, + + hasEventListener: function ( type, listener ) { + + if ( this._listeners === undefined ) return false; + + var listeners = this._listeners; + + return listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1; + + }, + + removeEventListener: function ( type, listener ) { + + if ( this._listeners === undefined ) return; + + var listeners = this._listeners; + var listenerArray = listeners[ type ]; + + if ( listenerArray !== undefined ) { + + var index = listenerArray.indexOf( listener ); + + if ( index !== - 1 ) { + + listenerArray.splice( index, 1 ); + + } + + } + + }, + + dispatchEvent: function ( event ) { + + if ( this._listeners === undefined ) return; + + var listeners = this._listeners; + var listenerArray = listeners[ event.type ]; + + if ( listenerArray !== undefined ) { + + event.target = this; + + var array = [], i = 0; + var length = listenerArray.length; + + for ( i = 0; i < length; i ++ ) { + + array[ i ] = listenerArray[ i ]; + + } + + for ( i = 0; i < length; i ++ ) { + + array[ i ].call( this, event ); + + } + + } + + } + + } ); + + var REVISION = '85'; + var MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2 }; + var CullFaceNone = 0; + var CullFaceBack = 1; + var CullFaceFront = 2; + var CullFaceFrontBack = 3; + var FrontFaceDirectionCW = 0; + var FrontFaceDirectionCCW = 1; + var BasicShadowMap = 0; + var PCFShadowMap = 1; + var PCFSoftShadowMap = 2; + var FrontSide = 0; + var BackSide = 1; + var DoubleSide = 2; + var FlatShading = 1; + var SmoothShading = 2; + var NoColors = 0; + var FaceColors = 1; + var VertexColors = 2; + var NoBlending = 0; + var NormalBlending = 1; + var AdditiveBlending = 2; + var SubtractiveBlending = 3; + var MultiplyBlending = 4; + var CustomBlending = 5; + var AddEquation = 100; + var SubtractEquation = 101; + var ReverseSubtractEquation = 102; + var MinEquation = 103; + var MaxEquation = 104; + var ZeroFactor = 200; + var OneFactor = 201; + var SrcColorFactor = 202; + var OneMinusSrcColorFactor = 203; + var SrcAlphaFactor = 204; + var OneMinusSrcAlphaFactor = 205; + var DstAlphaFactor = 206; + var OneMinusDstAlphaFactor = 207; + var DstColorFactor = 208; + var OneMinusDstColorFactor = 209; + var SrcAlphaSaturateFactor = 210; + var NeverDepth = 0; + var AlwaysDepth = 1; + var LessDepth = 2; + var LessEqualDepth = 3; + var EqualDepth = 4; + var GreaterEqualDepth = 5; + var GreaterDepth = 6; + var NotEqualDepth = 7; + var MultiplyOperation = 0; + var MixOperation = 1; + var AddOperation = 2; + var NoToneMapping = 0; + var LinearToneMapping = 1; + var ReinhardToneMapping = 2; + var Uncharted2ToneMapping = 3; + var CineonToneMapping = 4; + var UVMapping = 300; + var CubeReflectionMapping = 301; + var CubeRefractionMapping = 302; + var EquirectangularReflectionMapping = 303; + var EquirectangularRefractionMapping = 304; + var SphericalReflectionMapping = 305; + var CubeUVReflectionMapping = 306; + var CubeUVRefractionMapping = 307; + var RepeatWrapping = 1000; + var ClampToEdgeWrapping = 1001; + var MirroredRepeatWrapping = 1002; + var NearestFilter = 1003; + var NearestMipMapNearestFilter = 1004; + var NearestMipMapLinearFilter = 1005; + var LinearFilter = 1006; + var LinearMipMapNearestFilter = 1007; + var LinearMipMapLinearFilter = 1008; + var UnsignedByteType = 1009; + var ByteType = 1010; + var ShortType = 1011; + var UnsignedShortType = 1012; + var IntType = 1013; + var UnsignedIntType = 1014; + var FloatType = 1015; + var HalfFloatType = 1016; + var UnsignedShort4444Type = 1017; + var UnsignedShort5551Type = 1018; + var UnsignedShort565Type = 1019; + var UnsignedInt248Type = 1020; + var AlphaFormat = 1021; + var RGBFormat = 1022; + var RGBAFormat = 1023; + var LuminanceFormat = 1024; + var LuminanceAlphaFormat = 1025; + var RGBEFormat = RGBAFormat; + var DepthFormat = 1026; + var DepthStencilFormat = 1027; + var RGB_S3TC_DXT1_Format = 2001; + var RGBA_S3TC_DXT1_Format = 2002; + var RGBA_S3TC_DXT3_Format = 2003; + var RGBA_S3TC_DXT5_Format = 2004; + var RGB_PVRTC_4BPPV1_Format = 2100; + var RGB_PVRTC_2BPPV1_Format = 2101; + var RGBA_PVRTC_4BPPV1_Format = 2102; + var RGBA_PVRTC_2BPPV1_Format = 2103; + var RGB_ETC1_Format = 2151; + var LoopOnce = 2200; + var LoopRepeat = 2201; + var LoopPingPong = 2202; + var InterpolateDiscrete = 2300; + var InterpolateLinear = 2301; + var InterpolateSmooth = 2302; + var ZeroCurvatureEnding = 2400; + var ZeroSlopeEnding = 2401; + var WrapAroundEnding = 2402; + var TrianglesDrawMode = 0; + var TriangleStripDrawMode = 1; + var TriangleFanDrawMode = 2; + var LinearEncoding = 3000; + var sRGBEncoding = 3001; + var GammaEncoding = 3007; + var RGBEEncoding = 3002; + var LogLuvEncoding = 3003; + var RGBM7Encoding = 3004; + var RGBM16Encoding = 3005; + var RGBDEncoding = 3006; + var BasicDepthPacking = 3200; + var RGBADepthPacking = 3201; + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + var _Math = { + + DEG2RAD: Math.PI / 180, + RAD2DEG: 180 / Math.PI, + + generateUUID: function () { + + // http://www.broofa.com/Tools/Math.uuid.htm + + var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split( '' ); + var uuid = new Array( 36 ); + var rnd = 0, r; + + return function generateUUID() { + + for ( var i = 0; i < 36; i ++ ) { + + if ( i === 8 || i === 13 || i === 18 || i === 23 ) { + + uuid[ i ] = '-'; + + } else if ( i === 14 ) { + + uuid[ i ] = '4'; + + } else { + + if ( rnd <= 0x02 ) rnd = 0x2000000 + ( Math.random() * 0x1000000 ) | 0; + r = rnd & 0xf; + rnd = rnd >> 4; + uuid[ i ] = chars[ ( i === 19 ) ? ( r & 0x3 ) | 0x8 : r ]; + + } + + } + + return uuid.join( '' ); + + }; + + }(), + + clamp: function ( value, min, max ) { + + return Math.max( min, Math.min( max, value ) ); + + }, + + // compute euclidian modulo of m % n + // https://en.wikipedia.org/wiki/Modulo_operation + + euclideanModulo: function ( n, m ) { + + return ( ( n % m ) + m ) % m; + + }, + + // Linear mapping from range <a1, a2> to range <b1, b2> + + mapLinear: function ( x, a1, a2, b1, b2 ) { + + return b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 ); + + }, + + // https://en.wikipedia.org/wiki/Linear_interpolation + + lerp: function ( x, y, t ) { + + return ( 1 - t ) * x + t * y; + + }, + + // http://en.wikipedia.org/wiki/Smoothstep + + smoothstep: function ( x, min, max ) { + + if ( x <= min ) return 0; + if ( x >= max ) return 1; + + x = ( x - min ) / ( max - min ); + + return x * x * ( 3 - 2 * x ); + + }, + + smootherstep: function ( x, min, max ) { + + if ( x <= min ) return 0; + if ( x >= max ) return 1; + + x = ( x - min ) / ( max - min ); + + return x * x * x * ( x * ( x * 6 - 15 ) + 10 ); + + }, + + // Random integer from <low, high> interval + + randInt: function ( low, high ) { + + return low + Math.floor( Math.random() * ( high - low + 1 ) ); + + }, + + // Random float from <low, high> interval + + randFloat: function ( low, high ) { + + return low + Math.random() * ( high - low ); + + }, + + // Random float from <-range/2, range/2> interval + + randFloatSpread: function ( range ) { + + return range * ( 0.5 - Math.random() ); + + }, + + degToRad: function ( degrees ) { + + return degrees * _Math.DEG2RAD; + + }, + + radToDeg: function ( radians ) { + + return radians * _Math.RAD2DEG; + + }, + + isPowerOfTwo: function ( value ) { + + return ( value & ( value - 1 ) ) === 0 && value !== 0; + + }, + + nearestPowerOfTwo: function ( value ) { + + return Math.pow( 2, Math.round( Math.log( value ) / Math.LN2 ) ); + + }, + + nextPowerOfTwo: function ( value ) { + + value --; + value |= value >> 1; + value |= value >> 2; + value |= value >> 4; + value |= value >> 8; + value |= value >> 16; + value ++; + + return value; + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author philogb / http://blog.thejit.org/ + * @author egraether / http://egraether.com/ + * @author zz85 / http://www.lab4games.net/zz85/blog + */ + + function Vector2( x, y ) { + + this.x = x || 0; + this.y = y || 0; + + } + + Object.defineProperties( Vector2.prototype, { + + "width" : { + + get: function () { + + return this.x; + + }, + + set: function ( value ) { + + this.x = value; + + } + + }, + + "height" : { + + get: function () { + + return this.y; + + }, + + set: function ( value ) { + + this.y = value; + + } + + } + + } ); + + Object.assign( Vector2.prototype, { + + isVector2: true, + + set: function ( x, y ) { + + this.x = x; + this.y = y; + + return this; + + }, + + setScalar: function ( scalar ) { + + this.x = scalar; + this.y = scalar; + + return this; + + }, + + setX: function ( x ) { + + this.x = x; + + return this; + + }, + + setY: function ( y ) { + + this.y = y; + + return this; + + }, + + setComponent: function ( index, value ) { + + switch ( index ) { + + case 0: this.x = value; break; + case 1: this.y = value; break; + default: throw new Error( 'index is out of range: ' + index ); + + } + + return this; + + }, + + getComponent: function ( index ) { + + switch ( index ) { + + case 0: return this.x; + case 1: return this.y; + default: throw new Error( 'index is out of range: ' + index ); + + } + + }, + + clone: function () { + + return new this.constructor( this.x, this.y ); + + }, + + copy: function ( v ) { + + this.x = v.x; + this.y = v.y; + + return this; + + }, + + add: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ); + return this.addVectors( v, w ); + + } + + this.x += v.x; + this.y += v.y; + + return this; + + }, + + addScalar: function ( s ) { + + this.x += s; + this.y += s; + + return this; + + }, + + addVectors: function ( a, b ) { + + this.x = a.x + b.x; + this.y = a.y + b.y; + + return this; + + }, + + addScaledVector: function ( v, s ) { + + this.x += v.x * s; + this.y += v.y * s; + + return this; + + }, + + sub: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ); + return this.subVectors( v, w ); + + } + + this.x -= v.x; + this.y -= v.y; + + return this; + + }, + + subScalar: function ( s ) { + + this.x -= s; + this.y -= s; + + return this; + + }, + + subVectors: function ( a, b ) { + + this.x = a.x - b.x; + this.y = a.y - b.y; + + return this; + + }, + + multiply: function ( v ) { + + this.x *= v.x; + this.y *= v.y; + + return this; + + }, + + multiplyScalar: function ( scalar ) { + + this.x *= scalar; + this.y *= scalar; + + return this; + + }, + + divide: function ( v ) { + + this.x /= v.x; + this.y /= v.y; + + return this; + + }, + + divideScalar: function ( scalar ) { + + return this.multiplyScalar( 1 / scalar ); + + }, + + min: function ( v ) { + + this.x = Math.min( this.x, v.x ); + this.y = Math.min( this.y, v.y ); + + return this; + + }, + + max: function ( v ) { + + this.x = Math.max( this.x, v.x ); + this.y = Math.max( this.y, v.y ); + + return this; + + }, + + clamp: function ( min, max ) { + + // This function assumes min < max, if this assumption isn't true it will not operate correctly + + this.x = Math.max( min.x, Math.min( max.x, this.x ) ); + this.y = Math.max( min.y, Math.min( max.y, this.y ) ); + + return this; + + }, + + clampScalar: function () { + + var min = new Vector2(); + var max = new Vector2(); + + return function clampScalar( minVal, maxVal ) { + + min.set( minVal, minVal ); + max.set( maxVal, maxVal ); + + return this.clamp( min, max ); + + }; + + }(), + + clampLength: function ( min, max ) { + + var length = this.length(); + + return this.multiplyScalar( Math.max( min, Math.min( max, length ) ) / length ); + + }, + + floor: function () { + + this.x = Math.floor( this.x ); + this.y = Math.floor( this.y ); + + return this; + + }, + + ceil: function () { + + this.x = Math.ceil( this.x ); + this.y = Math.ceil( this.y ); + + return this; + + }, + + round: function () { + + this.x = Math.round( this.x ); + this.y = Math.round( this.y ); + + return this; + + }, + + roundToZero: function () { + + this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x ); + this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y ); + + return this; + + }, + + negate: function () { + + this.x = - this.x; + this.y = - this.y; + + return this; + + }, + + dot: function ( v ) { + + return this.x * v.x + this.y * v.y; + + }, + + lengthSq: function () { + + return this.x * this.x + this.y * this.y; + + }, + + length: function () { + + return Math.sqrt( this.x * this.x + this.y * this.y ); + + }, + + lengthManhattan: function() { + + return Math.abs( this.x ) + Math.abs( this.y ); + + }, + + normalize: function () { + + return this.divideScalar( this.length() ); + + }, + + angle: function () { + + // computes the angle in radians with respect to the positive x-axis + + var angle = Math.atan2( this.y, this.x ); + + if ( angle < 0 ) angle += 2 * Math.PI; + + return angle; + + }, + + distanceTo: function ( v ) { + + return Math.sqrt( this.distanceToSquared( v ) ); + + }, + + distanceToSquared: function ( v ) { + + var dx = this.x - v.x, dy = this.y - v.y; + return dx * dx + dy * dy; + + }, + + distanceToManhattan: function ( v ) { + + return Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ); + + }, + + setLength: function ( length ) { + + return this.multiplyScalar( length / this.length() ); + + }, + + lerp: function ( v, alpha ) { + + this.x += ( v.x - this.x ) * alpha; + this.y += ( v.y - this.y ) * alpha; + + return this; + + }, + + lerpVectors: function ( v1, v2, alpha ) { + + return this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 ); + + }, + + equals: function ( v ) { + + return ( ( v.x === this.x ) && ( v.y === this.y ) ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.x = array[ offset ]; + this.y = array[ offset + 1 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.x; + array[ offset + 1 ] = this.y; + + return array; + + }, + + fromBufferAttribute: function ( attribute, index, offset ) { + + if ( offset !== undefined ) { + + console.warn( 'THREE.Vector2: offset has been removed from .fromBufferAttribute().' ); + + } + + this.x = attribute.getX( index ); + this.y = attribute.getY( index ); + + return this; + + }, + + rotateAround: function ( center, angle ) { + + var c = Math.cos( angle ), s = Math.sin( angle ); + + var x = this.x - center.x; + var y = this.y - center.y; + + this.x = x * c - y * s + center.x; + this.y = x * s + y * c + center.y; + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author szimek / https://github.com/szimek/ + */ + + var textureId = 0; + + function Texture( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) { + + Object.defineProperty( this, 'id', { value: textureId ++ } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + + this.image = image !== undefined ? image : Texture.DEFAULT_IMAGE; + this.mipmaps = []; + + this.mapping = mapping !== undefined ? mapping : Texture.DEFAULT_MAPPING; + + this.wrapS = wrapS !== undefined ? wrapS : ClampToEdgeWrapping; + this.wrapT = wrapT !== undefined ? wrapT : ClampToEdgeWrapping; + + this.magFilter = magFilter !== undefined ? magFilter : LinearFilter; + this.minFilter = minFilter !== undefined ? minFilter : LinearMipMapLinearFilter; + + this.anisotropy = anisotropy !== undefined ? anisotropy : 1; + + this.format = format !== undefined ? format : RGBAFormat; + this.type = type !== undefined ? type : UnsignedByteType; + + this.offset = new Vector2( 0, 0 ); + this.repeat = new Vector2( 1, 1 ); + + this.generateMipmaps = true; + this.premultiplyAlpha = false; + this.flipY = true; + this.unpackAlignment = 4; // valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml) + + // Values of encoding !== THREE.LinearEncoding only supported on map, envMap and emissiveMap. + // + // Also changing the encoding after already used by a Material will not automatically make the Material + // update. You need to explicitly call Material.needsUpdate to trigger it to recompile. + this.encoding = encoding !== undefined ? encoding : LinearEncoding; + + this.version = 0; + this.onUpdate = null; + + } + + Texture.DEFAULT_IMAGE = undefined; + Texture.DEFAULT_MAPPING = UVMapping; + + Object.defineProperty( Texture.prototype, "needsUpdate", { + + set: function ( value ) { + + if ( value === true ) this.version ++; + + } + + } ); + + Object.assign( Texture.prototype, EventDispatcher.prototype, { + + constructor: Texture, + + isTexture: true, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.name = source.name; + + this.image = source.image; + this.mipmaps = source.mipmaps.slice( 0 ); + + this.mapping = source.mapping; + + this.wrapS = source.wrapS; + this.wrapT = source.wrapT; + + this.magFilter = source.magFilter; + this.minFilter = source.minFilter; + + this.anisotropy = source.anisotropy; + + this.format = source.format; + this.type = source.type; + + this.offset.copy( source.offset ); + this.repeat.copy( source.repeat ); + + this.generateMipmaps = source.generateMipmaps; + this.premultiplyAlpha = source.premultiplyAlpha; + this.flipY = source.flipY; + this.unpackAlignment = source.unpackAlignment; + this.encoding = source.encoding; + + return this; + + }, + + toJSON: function ( meta ) { + + if ( meta.textures[ this.uuid ] !== undefined ) { + + return meta.textures[ this.uuid ]; + + } + + function getDataURL( image ) { + + var canvas; + + if ( image.toDataURL !== undefined ) { + + canvas = image; + + } else { + + canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); + canvas.width = image.width; + canvas.height = image.height; + + canvas.getContext( '2d' ).drawImage( image, 0, 0, image.width, image.height ); + + } + + if ( canvas.width > 2048 || canvas.height > 2048 ) { + + return canvas.toDataURL( 'image/jpeg', 0.6 ); + + } else { + + return canvas.toDataURL( 'image/png' ); + + } + + } + + var output = { + metadata: { + version: 4.5, + type: 'Texture', + generator: 'Texture.toJSON' + }, + + uuid: this.uuid, + name: this.name, + + mapping: this.mapping, + + repeat: [ this.repeat.x, this.repeat.y ], + offset: [ this.offset.x, this.offset.y ], + wrap: [ this.wrapS, this.wrapT ], + + minFilter: this.minFilter, + magFilter: this.magFilter, + anisotropy: this.anisotropy, + + flipY: this.flipY + }; + + if ( this.image !== undefined ) { + + // TODO: Move to THREE.Image + + var image = this.image; + + if ( image.uuid === undefined ) { + + image.uuid = _Math.generateUUID(); // UGH + + } + + if ( meta.images[ image.uuid ] === undefined ) { + + meta.images[ image.uuid ] = { + uuid: image.uuid, + url: getDataURL( image ) + }; + + } + + output.image = image.uuid; + + } + + meta.textures[ this.uuid ] = output; + + return output; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + }, + + transformUv: function ( uv ) { + + if ( this.mapping !== UVMapping ) return; + + uv.multiply( this.repeat ); + uv.add( this.offset ); + + if ( uv.x < 0 || uv.x > 1 ) { + + switch ( this.wrapS ) { + + case RepeatWrapping: + + uv.x = uv.x - Math.floor( uv.x ); + break; + + case ClampToEdgeWrapping: + + uv.x = uv.x < 0 ? 0 : 1; + break; + + case MirroredRepeatWrapping: + + if ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) { + + uv.x = Math.ceil( uv.x ) - uv.x; + + } else { + + uv.x = uv.x - Math.floor( uv.x ); + + } + break; + + } + + } + + if ( uv.y < 0 || uv.y > 1 ) { + + switch ( this.wrapT ) { + + case RepeatWrapping: + + uv.y = uv.y - Math.floor( uv.y ); + break; + + case ClampToEdgeWrapping: + + uv.y = uv.y < 0 ? 0 : 1; + break; + + case MirroredRepeatWrapping: + + if ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) { + + uv.y = Math.ceil( uv.y ) - uv.y; + + } else { + + uv.y = uv.y - Math.floor( uv.y ); + + } + break; + + } + + } + + if ( this.flipY ) { + + uv.y = 1 - uv.y; + + } + + } + + } ); + + /** + * @author supereggbert / http://www.paulbrunt.co.uk/ + * @author philogb / http://blog.thejit.org/ + * @author mikael emtinger / http://gomo.se/ + * @author egraether / http://egraether.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function Vector4( x, y, z, w ) { + + this.x = x || 0; + this.y = y || 0; + this.z = z || 0; + this.w = ( w !== undefined ) ? w : 1; + + } + + Object.assign( Vector4.prototype, { + + isVector4: true, + + set: function ( x, y, z, w ) { + + this.x = x; + this.y = y; + this.z = z; + this.w = w; + + return this; + + }, + + setScalar: function ( scalar ) { + + this.x = scalar; + this.y = scalar; + this.z = scalar; + this.w = scalar; + + return this; + + }, + + setX: function ( x ) { + + this.x = x; + + return this; + + }, + + setY: function ( y ) { + + this.y = y; + + return this; + + }, + + setZ: function ( z ) { + + this.z = z; + + return this; + + }, + + setW: function ( w ) { + + this.w = w; + + return this; + + }, + + setComponent: function ( index, value ) { + + switch ( index ) { + + case 0: this.x = value; break; + case 1: this.y = value; break; + case 2: this.z = value; break; + case 3: this.w = value; break; + default: throw new Error( 'index is out of range: ' + index ); + + } + + return this; + + }, + + getComponent: function ( index ) { + + switch ( index ) { + + case 0: return this.x; + case 1: return this.y; + case 2: return this.z; + case 3: return this.w; + default: throw new Error( 'index is out of range: ' + index ); + + } + + }, + + clone: function () { + + return new this.constructor( this.x, this.y, this.z, this.w ); + + }, + + copy: function ( v ) { + + this.x = v.x; + this.y = v.y; + this.z = v.z; + this.w = ( v.w !== undefined ) ? v.w : 1; + + return this; + + }, + + add: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ); + return this.addVectors( v, w ); + + } + + this.x += v.x; + this.y += v.y; + this.z += v.z; + this.w += v.w; + + return this; + + }, + + addScalar: function ( s ) { + + this.x += s; + this.y += s; + this.z += s; + this.w += s; + + return this; + + }, + + addVectors: function ( a, b ) { + + this.x = a.x + b.x; + this.y = a.y + b.y; + this.z = a.z + b.z; + this.w = a.w + b.w; + + return this; + + }, + + addScaledVector: function ( v, s ) { + + this.x += v.x * s; + this.y += v.y * s; + this.z += v.z * s; + this.w += v.w * s; + + return this; + + }, + + sub: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ); + return this.subVectors( v, w ); + + } + + this.x -= v.x; + this.y -= v.y; + this.z -= v.z; + this.w -= v.w; + + return this; + + }, + + subScalar: function ( s ) { + + this.x -= s; + this.y -= s; + this.z -= s; + this.w -= s; + + return this; + + }, + + subVectors: function ( a, b ) { + + this.x = a.x - b.x; + this.y = a.y - b.y; + this.z = a.z - b.z; + this.w = a.w - b.w; + + return this; + + }, + + multiplyScalar: function ( scalar ) { + + this.x *= scalar; + this.y *= scalar; + this.z *= scalar; + this.w *= scalar; + + return this; + + }, + + applyMatrix4: function ( m ) { + + var x = this.x, y = this.y, z = this.z, w = this.w; + var e = m.elements; + + this.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w; + this.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w; + this.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w; + this.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w; + + return this; + + }, + + divideScalar: function ( scalar ) { + + return this.multiplyScalar( 1 / scalar ); + + }, + + setAxisAngleFromQuaternion: function ( q ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm + + // q is assumed to be normalized + + this.w = 2 * Math.acos( q.w ); + + var s = Math.sqrt( 1 - q.w * q.w ); + + if ( s < 0.0001 ) { + + this.x = 1; + this.y = 0; + this.z = 0; + + } else { + + this.x = q.x / s; + this.y = q.y / s; + this.z = q.z / s; + + } + + return this; + + }, + + setAxisAngleFromRotationMatrix: function ( m ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + var angle, x, y, z, // variables for result + epsilon = 0.01, // margin to allow for rounding errors + epsilon2 = 0.1, // margin to distinguish between 0 and 180 degrees + + te = m.elements, + + m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ], + m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ], + m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ]; + + if ( ( Math.abs( m12 - m21 ) < epsilon ) && + ( Math.abs( m13 - m31 ) < epsilon ) && + ( Math.abs( m23 - m32 ) < epsilon ) ) { + + // singularity found + // first check for identity matrix which must have +1 for all terms + // in leading diagonal and zero in other terms + + if ( ( Math.abs( m12 + m21 ) < epsilon2 ) && + ( Math.abs( m13 + m31 ) < epsilon2 ) && + ( Math.abs( m23 + m32 ) < epsilon2 ) && + ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) { + + // this singularity is identity matrix so angle = 0 + + this.set( 1, 0, 0, 0 ); + + return this; // zero angle, arbitrary axis + + } + + // otherwise this singularity is angle = 180 + + angle = Math.PI; + + var xx = ( m11 + 1 ) / 2; + var yy = ( m22 + 1 ) / 2; + var zz = ( m33 + 1 ) / 2; + var xy = ( m12 + m21 ) / 4; + var xz = ( m13 + m31 ) / 4; + var yz = ( m23 + m32 ) / 4; + + if ( ( xx > yy ) && ( xx > zz ) ) { + + // m11 is the largest diagonal term + + if ( xx < epsilon ) { + + x = 0; + y = 0.707106781; + z = 0.707106781; + + } else { + + x = Math.sqrt( xx ); + y = xy / x; + z = xz / x; + + } + + } else if ( yy > zz ) { + + // m22 is the largest diagonal term + + if ( yy < epsilon ) { + + x = 0.707106781; + y = 0; + z = 0.707106781; + + } else { + + y = Math.sqrt( yy ); + x = xy / y; + z = yz / y; + + } + + } else { + + // m33 is the largest diagonal term so base result on this + + if ( zz < epsilon ) { + + x = 0.707106781; + y = 0.707106781; + z = 0; + + } else { + + z = Math.sqrt( zz ); + x = xz / z; + y = yz / z; + + } + + } + + this.set( x, y, z, angle ); + + return this; // return 180 deg rotation + + } + + // as we have reached here there are no singularities so we can handle normally + + var s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) + + ( m13 - m31 ) * ( m13 - m31 ) + + ( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize + + if ( Math.abs( s ) < 0.001 ) s = 1; + + // prevent divide by zero, should not happen if matrix is orthogonal and should be + // caught by singularity test above, but I've left it in just in case + + this.x = ( m32 - m23 ) / s; + this.y = ( m13 - m31 ) / s; + this.z = ( m21 - m12 ) / s; + this.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 ); + + return this; + + }, + + min: function ( v ) { + + this.x = Math.min( this.x, v.x ); + this.y = Math.min( this.y, v.y ); + this.z = Math.min( this.z, v.z ); + this.w = Math.min( this.w, v.w ); + + return this; + + }, + + max: function ( v ) { + + this.x = Math.max( this.x, v.x ); + this.y = Math.max( this.y, v.y ); + this.z = Math.max( this.z, v.z ); + this.w = Math.max( this.w, v.w ); + + return this; + + }, + + clamp: function ( min, max ) { + + // This function assumes min < max, if this assumption isn't true it will not operate correctly + + this.x = Math.max( min.x, Math.min( max.x, this.x ) ); + this.y = Math.max( min.y, Math.min( max.y, this.y ) ); + this.z = Math.max( min.z, Math.min( max.z, this.z ) ); + this.w = Math.max( min.w, Math.min( max.w, this.w ) ); + + return this; + + }, + + clampScalar: function () { + + var min = new Vector4(); + var max = new Vector4(); + + return function clampScalar( minVal, maxVal ) { + + min.set( minVal, minVal, minVal, minVal ); + max.set( maxVal, maxVal, maxVal, maxVal ); + + return this.clamp( min, max ); + + }; + + }(), + + floor: function () { + + this.x = Math.floor( this.x ); + this.y = Math.floor( this.y ); + this.z = Math.floor( this.z ); + this.w = Math.floor( this.w ); + + return this; + + }, + + ceil: function () { + + this.x = Math.ceil( this.x ); + this.y = Math.ceil( this.y ); + this.z = Math.ceil( this.z ); + this.w = Math.ceil( this.w ); + + return this; + + }, + + round: function () { + + this.x = Math.round( this.x ); + this.y = Math.round( this.y ); + this.z = Math.round( this.z ); + this.w = Math.round( this.w ); + + return this; + + }, + + roundToZero: function () { + + this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x ); + this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y ); + this.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z ); + this.w = ( this.w < 0 ) ? Math.ceil( this.w ) : Math.floor( this.w ); + + return this; + + }, + + negate: function () { + + this.x = - this.x; + this.y = - this.y; + this.z = - this.z; + this.w = - this.w; + + return this; + + }, + + dot: function ( v ) { + + return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w; + + }, + + lengthSq: function () { + + return this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w; + + }, + + length: function () { + + return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w ); + + }, + + lengthManhattan: function () { + + return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w ); + + }, + + normalize: function () { + + return this.divideScalar( this.length() ); + + }, + + setLength: function ( length ) { + + return this.multiplyScalar( length / this.length() ); + + }, + + lerp: function ( v, alpha ) { + + this.x += ( v.x - this.x ) * alpha; + this.y += ( v.y - this.y ) * alpha; + this.z += ( v.z - this.z ) * alpha; + this.w += ( v.w - this.w ) * alpha; + + return this; + + }, + + lerpVectors: function ( v1, v2, alpha ) { + + return this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 ); + + }, + + equals: function ( v ) { + + return ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.x = array[ offset ]; + this.y = array[ offset + 1 ]; + this.z = array[ offset + 2 ]; + this.w = array[ offset + 3 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.x; + array[ offset + 1 ] = this.y; + array[ offset + 2 ] = this.z; + array[ offset + 3 ] = this.w; + + return array; + + }, + + fromBufferAttribute: function ( attribute, index, offset ) { + + if ( offset !== undefined ) { + + console.warn( 'THREE.Vector4: offset has been removed from .fromBufferAttribute().' ); + + } + + this.x = attribute.getX( index ); + this.y = attribute.getY( index ); + this.z = attribute.getZ( index ); + this.w = attribute.getW( index ); + + return this; + + } + + } ); + + /** + * @author szimek / https://github.com/szimek/ + * @author alteredq / http://alteredqualia.com/ + * @author Marius Kintel / https://github.com/kintel + */ + + /* + In options, we can specify: + * Texture parameters for an auto-generated target texture + * depthBuffer/stencilBuffer: Booleans to indicate if we should generate these buffers + */ + function WebGLRenderTarget( width, height, options ) { + + this.uuid = _Math.generateUUID(); + + this.width = width; + this.height = height; + + this.scissor = new Vector4( 0, 0, width, height ); + this.scissorTest = false; + + this.viewport = new Vector4( 0, 0, width, height ); + + options = options || {}; + + if ( options.minFilter === undefined ) options.minFilter = LinearFilter; + + this.texture = new Texture( undefined, undefined, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding ); + + this.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true; + this.stencilBuffer = options.stencilBuffer !== undefined ? options.stencilBuffer : true; + this.depthTexture = options.depthTexture !== undefined ? options.depthTexture : null; + + } + + Object.assign( WebGLRenderTarget.prototype, EventDispatcher.prototype, { + + isWebGLRenderTarget: true, + + setSize: function ( width, height ) { + + if ( this.width !== width || this.height !== height ) { + + this.width = width; + this.height = height; + + this.dispose(); + + } + + this.viewport.set( 0, 0, width, height ); + this.scissor.set( 0, 0, width, height ); + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.width = source.width; + this.height = source.height; + + this.viewport.copy( source.viewport ); + + this.texture = source.texture.clone(); + + this.depthBuffer = source.depthBuffer; + this.stencilBuffer = source.stencilBuffer; + this.depthTexture = source.depthTexture; + + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com + */ + + function WebGLRenderTargetCube( width, height, options ) { + + WebGLRenderTarget.call( this, width, height, options ); + + this.activeCubeFace = 0; // PX 0, NX 1, PY 2, NY 3, PZ 4, NZ 5 + this.activeMipMapLevel = 0; + + } + + WebGLRenderTargetCube.prototype = Object.create( WebGLRenderTarget.prototype ); + WebGLRenderTargetCube.prototype.constructor = WebGLRenderTargetCube; + + WebGLRenderTargetCube.prototype.isWebGLRenderTargetCube = true; + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author bhouston / http://clara.io + */ + + function Quaternion( x, y, z, w ) { + + this._x = x || 0; + this._y = y || 0; + this._z = z || 0; + this._w = ( w !== undefined ) ? w : 1; + + } + + Object.assign( Quaternion, { + + slerp: function ( qa, qb, qm, t ) { + + return qm.copy( qa ).slerp( qb, t ); + + }, + + slerpFlat: function ( dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) { + + // fuzz-free, array-based Quaternion SLERP operation + + var x0 = src0[ srcOffset0 + 0 ], + y0 = src0[ srcOffset0 + 1 ], + z0 = src0[ srcOffset0 + 2 ], + w0 = src0[ srcOffset0 + 3 ], + + x1 = src1[ srcOffset1 + 0 ], + y1 = src1[ srcOffset1 + 1 ], + z1 = src1[ srcOffset1 + 2 ], + w1 = src1[ srcOffset1 + 3 ]; + + if ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) { + + var s = 1 - t, + + cos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1, + + dir = ( cos >= 0 ? 1 : - 1 ), + sqrSin = 1 - cos * cos; + + // Skip the Slerp for tiny steps to avoid numeric problems: + if ( sqrSin > Number.EPSILON ) { + + var sin = Math.sqrt( sqrSin ), + len = Math.atan2( sin, cos * dir ); + + s = Math.sin( s * len ) / sin; + t = Math.sin( t * len ) / sin; + + } + + var tDir = t * dir; + + x0 = x0 * s + x1 * tDir; + y0 = y0 * s + y1 * tDir; + z0 = z0 * s + z1 * tDir; + w0 = w0 * s + w1 * tDir; + + // Normalize in case we just did a lerp: + if ( s === 1 - t ) { + + var f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 ); + + x0 *= f; + y0 *= f; + z0 *= f; + w0 *= f; + + } + + } + + dst[ dstOffset ] = x0; + dst[ dstOffset + 1 ] = y0; + dst[ dstOffset + 2 ] = z0; + dst[ dstOffset + 3 ] = w0; + + } + + } ); + + Object.defineProperties( Quaternion.prototype, { + + x: { + + get: function () { + + return this._x; + + }, + + set: function ( value ) { + + this._x = value; + this.onChangeCallback(); + + } + + }, + + y: { + + get: function () { + + return this._y; + + }, + + set: function ( value ) { + + this._y = value; + this.onChangeCallback(); + + } + + }, + + z: { + + get: function () { + + return this._z; + + }, + + set: function ( value ) { + + this._z = value; + this.onChangeCallback(); + + } + + }, + + w: { + + get: function () { + + return this._w; + + }, + + set: function ( value ) { + + this._w = value; + this.onChangeCallback(); + + } + + } + + } ); + + Object.assign( Quaternion.prototype, { + + set: function ( x, y, z, w ) { + + this._x = x; + this._y = y; + this._z = z; + this._w = w; + + this.onChangeCallback(); + + return this; + + }, + + clone: function () { + + return new this.constructor( this._x, this._y, this._z, this._w ); + + }, + + copy: function ( quaternion ) { + + this._x = quaternion.x; + this._y = quaternion.y; + this._z = quaternion.z; + this._w = quaternion.w; + + this.onChangeCallback(); + + return this; + + }, + + setFromEuler: function ( euler, update ) { + + if ( ( euler && euler.isEuler ) === false ) { + + throw new Error( 'THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.' ); + + } + + var x = euler._x, y = euler._y, z = euler._z, order = euler.order; + + // http://www.mathworks.com/matlabcentral/fileexchange/ + // 20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/ + // content/SpinCalc.m + + var cos = Math.cos; + var sin = Math.sin; + + var c1 = cos( x / 2 ); + var c2 = cos( y / 2 ); + var c3 = cos( z / 2 ); + + var s1 = sin( x / 2 ); + var s2 = sin( y / 2 ); + var s3 = sin( z / 2 ); + + if ( order === 'XYZ' ) { + + this._x = s1 * c2 * c3 + c1 * s2 * s3; + this._y = c1 * s2 * c3 - s1 * c2 * s3; + this._z = c1 * c2 * s3 + s1 * s2 * c3; + this._w = c1 * c2 * c3 - s1 * s2 * s3; + + } else if ( order === 'YXZ' ) { + + this._x = s1 * c2 * c3 + c1 * s2 * s3; + this._y = c1 * s2 * c3 - s1 * c2 * s3; + this._z = c1 * c2 * s3 - s1 * s2 * c3; + this._w = c1 * c2 * c3 + s1 * s2 * s3; + + } else if ( order === 'ZXY' ) { + + this._x = s1 * c2 * c3 - c1 * s2 * s3; + this._y = c1 * s2 * c3 + s1 * c2 * s3; + this._z = c1 * c2 * s3 + s1 * s2 * c3; + this._w = c1 * c2 * c3 - s1 * s2 * s3; + + } else if ( order === 'ZYX' ) { + + this._x = s1 * c2 * c3 - c1 * s2 * s3; + this._y = c1 * s2 * c3 + s1 * c2 * s3; + this._z = c1 * c2 * s3 - s1 * s2 * c3; + this._w = c1 * c2 * c3 + s1 * s2 * s3; + + } else if ( order === 'YZX' ) { + + this._x = s1 * c2 * c3 + c1 * s2 * s3; + this._y = c1 * s2 * c3 + s1 * c2 * s3; + this._z = c1 * c2 * s3 - s1 * s2 * c3; + this._w = c1 * c2 * c3 - s1 * s2 * s3; + + } else if ( order === 'XZY' ) { + + this._x = s1 * c2 * c3 - c1 * s2 * s3; + this._y = c1 * s2 * c3 - s1 * c2 * s3; + this._z = c1 * c2 * s3 + s1 * s2 * c3; + this._w = c1 * c2 * c3 + s1 * s2 * s3; + + } + + if ( update !== false ) this.onChangeCallback(); + + return this; + + }, + + setFromAxisAngle: function ( axis, angle ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm + + // assumes axis is normalized + + var halfAngle = angle / 2, s = Math.sin( halfAngle ); + + this._x = axis.x * s; + this._y = axis.y * s; + this._z = axis.z * s; + this._w = Math.cos( halfAngle ); + + this.onChangeCallback(); + + return this; + + }, + + setFromRotationMatrix: function ( m ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + var te = m.elements, + + m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ], + m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ], + m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ], + + trace = m11 + m22 + m33, + s; + + if ( trace > 0 ) { + + s = 0.5 / Math.sqrt( trace + 1.0 ); + + this._w = 0.25 / s; + this._x = ( m32 - m23 ) * s; + this._y = ( m13 - m31 ) * s; + this._z = ( m21 - m12 ) * s; + + } else if ( m11 > m22 && m11 > m33 ) { + + s = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 ); + + this._w = ( m32 - m23 ) / s; + this._x = 0.25 * s; + this._y = ( m12 + m21 ) / s; + this._z = ( m13 + m31 ) / s; + + } else if ( m22 > m33 ) { + + s = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 ); + + this._w = ( m13 - m31 ) / s; + this._x = ( m12 + m21 ) / s; + this._y = 0.25 * s; + this._z = ( m23 + m32 ) / s; + + } else { + + s = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 ); + + this._w = ( m21 - m12 ) / s; + this._x = ( m13 + m31 ) / s; + this._y = ( m23 + m32 ) / s; + this._z = 0.25 * s; + + } + + this.onChangeCallback(); + + return this; + + }, + + setFromUnitVectors: function () { + + // assumes direction vectors vFrom and vTo are normalized + + var v1 = new Vector3(); + var r; + + var EPS = 0.000001; + + return function setFromUnitVectors( vFrom, vTo ) { + + if ( v1 === undefined ) v1 = new Vector3(); + + r = vFrom.dot( vTo ) + 1; + + if ( r < EPS ) { + + r = 0; + + if ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) { + + v1.set( - vFrom.y, vFrom.x, 0 ); + + } else { + + v1.set( 0, - vFrom.z, vFrom.y ); + + } + + } else { + + v1.crossVectors( vFrom, vTo ); + + } + + this._x = v1.x; + this._y = v1.y; + this._z = v1.z; + this._w = r; + + return this.normalize(); + + }; + + }(), + + inverse: function () { + + return this.conjugate().normalize(); + + }, + + conjugate: function () { + + this._x *= - 1; + this._y *= - 1; + this._z *= - 1; + + this.onChangeCallback(); + + return this; + + }, + + dot: function ( v ) { + + return this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w; + + }, + + lengthSq: function () { + + return this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w; + + }, + + length: function () { + + return Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w ); + + }, + + normalize: function () { + + var l = this.length(); + + if ( l === 0 ) { + + this._x = 0; + this._y = 0; + this._z = 0; + this._w = 1; + + } else { + + l = 1 / l; + + this._x = this._x * l; + this._y = this._y * l; + this._z = this._z * l; + this._w = this._w * l; + + } + + this.onChangeCallback(); + + return this; + + }, + + multiply: function ( q, p ) { + + if ( p !== undefined ) { + + console.warn( 'THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.' ); + return this.multiplyQuaternions( q, p ); + + } + + return this.multiplyQuaternions( this, q ); + + }, + + premultiply: function ( q ) { + + return this.multiplyQuaternions( q, this ); + + }, + + multiplyQuaternions: function ( a, b ) { + + // from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm + + var qax = a._x, qay = a._y, qaz = a._z, qaw = a._w; + var qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w; + + this._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby; + this._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz; + this._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx; + this._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz; + + this.onChangeCallback(); + + return this; + + }, + + slerp: function ( qb, t ) { + + if ( t === 0 ) return this; + if ( t === 1 ) return this.copy( qb ); + + var x = this._x, y = this._y, z = this._z, w = this._w; + + // http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/ + + var cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z; + + if ( cosHalfTheta < 0 ) { + + this._w = - qb._w; + this._x = - qb._x; + this._y = - qb._y; + this._z = - qb._z; + + cosHalfTheta = - cosHalfTheta; + + } else { + + this.copy( qb ); + + } + + if ( cosHalfTheta >= 1.0 ) { + + this._w = w; + this._x = x; + this._y = y; + this._z = z; + + return this; + + } + + var sinHalfTheta = Math.sqrt( 1.0 - cosHalfTheta * cosHalfTheta ); + + if ( Math.abs( sinHalfTheta ) < 0.001 ) { + + this._w = 0.5 * ( w + this._w ); + this._x = 0.5 * ( x + this._x ); + this._y = 0.5 * ( y + this._y ); + this._z = 0.5 * ( z + this._z ); + + return this; + + } + + var halfTheta = Math.atan2( sinHalfTheta, cosHalfTheta ); + var ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta, + ratioB = Math.sin( t * halfTheta ) / sinHalfTheta; + + this._w = ( w * ratioA + this._w * ratioB ); + this._x = ( x * ratioA + this._x * ratioB ); + this._y = ( y * ratioA + this._y * ratioB ); + this._z = ( z * ratioA + this._z * ratioB ); + + this.onChangeCallback(); + + return this; + + }, + + equals: function ( quaternion ) { + + return ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this._x = array[ offset ]; + this._y = array[ offset + 1 ]; + this._z = array[ offset + 2 ]; + this._w = array[ offset + 3 ]; + + this.onChangeCallback(); + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this._x; + array[ offset + 1 ] = this._y; + array[ offset + 2 ] = this._z; + array[ offset + 3 ] = this._w; + + return array; + + }, + + onChange: function ( callback ) { + + this.onChangeCallback = callback; + + return this; + + }, + + onChangeCallback: function () {} + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author *kile / http://kile.stravaganza.org/ + * @author philogb / http://blog.thejit.org/ + * @author mikael emtinger / http://gomo.se/ + * @author egraether / http://egraether.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function Vector3( x, y, z ) { + + this.x = x || 0; + this.y = y || 0; + this.z = z || 0; + + } + + Object.assign( Vector3.prototype, { + + isVector3: true, + + set: function ( x, y, z ) { + + this.x = x; + this.y = y; + this.z = z; + + return this; + + }, + + setScalar: function ( scalar ) { + + this.x = scalar; + this.y = scalar; + this.z = scalar; + + return this; + + }, + + setX: function ( x ) { + + this.x = x; + + return this; + + }, + + setY: function ( y ) { + + this.y = y; + + return this; + + }, + + setZ: function ( z ) { + + this.z = z; + + return this; + + }, + + setComponent: function ( index, value ) { + + switch ( index ) { + + case 0: this.x = value; break; + case 1: this.y = value; break; + case 2: this.z = value; break; + default: throw new Error( 'index is out of range: ' + index ); + + } + + return this; + + }, + + getComponent: function ( index ) { + + switch ( index ) { + + case 0: return this.x; + case 1: return this.y; + case 2: return this.z; + default: throw new Error( 'index is out of range: ' + index ); + + } + + }, + + clone: function () { + + return new this.constructor( this.x, this.y, this.z ); + + }, + + copy: function ( v ) { + + this.x = v.x; + this.y = v.y; + this.z = v.z; + + return this; + + }, + + add: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ); + return this.addVectors( v, w ); + + } + + this.x += v.x; + this.y += v.y; + this.z += v.z; + + return this; + + }, + + addScalar: function ( s ) { + + this.x += s; + this.y += s; + this.z += s; + + return this; + + }, + + addVectors: function ( a, b ) { + + this.x = a.x + b.x; + this.y = a.y + b.y; + this.z = a.z + b.z; + + return this; + + }, + + addScaledVector: function ( v, s ) { + + this.x += v.x * s; + this.y += v.y * s; + this.z += v.z * s; + + return this; + + }, + + sub: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ); + return this.subVectors( v, w ); + + } + + this.x -= v.x; + this.y -= v.y; + this.z -= v.z; + + return this; + + }, + + subScalar: function ( s ) { + + this.x -= s; + this.y -= s; + this.z -= s; + + return this; + + }, + + subVectors: function ( a, b ) { + + this.x = a.x - b.x; + this.y = a.y - b.y; + this.z = a.z - b.z; + + return this; + + }, + + multiply: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.' ); + return this.multiplyVectors( v, w ); + + } + + this.x *= v.x; + this.y *= v.y; + this.z *= v.z; + + return this; + + }, + + multiplyScalar: function ( scalar ) { + + this.x *= scalar; + this.y *= scalar; + this.z *= scalar; + + return this; + + }, + + multiplyVectors: function ( a, b ) { + + this.x = a.x * b.x; + this.y = a.y * b.y; + this.z = a.z * b.z; + + return this; + + }, + + applyEuler: function () { + + var quaternion = new Quaternion(); + + return function applyEuler( euler ) { + + if ( ( euler && euler.isEuler ) === false ) { + + console.error( 'THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.' ); + + } + + return this.applyQuaternion( quaternion.setFromEuler( euler ) ); + + }; + + }(), + + applyAxisAngle: function () { + + var quaternion = new Quaternion(); + + return function applyAxisAngle( axis, angle ) { + + return this.applyQuaternion( quaternion.setFromAxisAngle( axis, angle ) ); + + }; + + }(), + + applyMatrix3: function ( m ) { + + var x = this.x, y = this.y, z = this.z; + var e = m.elements; + + this.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z; + this.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z; + this.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z; + + return this; + + }, + + applyMatrix4: function ( m ) { + + var x = this.x, y = this.y, z = this.z; + var e = m.elements; + + this.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ]; + this.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ]; + this.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ]; + var w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ]; + + return this.divideScalar( w ); + + }, + + applyQuaternion: function ( q ) { + + var x = this.x, y = this.y, z = this.z; + var qx = q.x, qy = q.y, qz = q.z, qw = q.w; + + // calculate quat * vector + + var ix = qw * x + qy * z - qz * y; + var iy = qw * y + qz * x - qx * z; + var iz = qw * z + qx * y - qy * x; + var iw = - qx * x - qy * y - qz * z; + + // calculate result * inverse quat + + this.x = ix * qw + iw * - qx + iy * - qz - iz * - qy; + this.y = iy * qw + iw * - qy + iz * - qx - ix * - qz; + this.z = iz * qw + iw * - qz + ix * - qy - iy * - qx; + + return this; + + }, + + project: function () { + + var matrix = new Matrix4(); + + return function project( camera ) { + + matrix.multiplyMatrices( camera.projectionMatrix, matrix.getInverse( camera.matrixWorld ) ); + return this.applyMatrix4( matrix ); + + }; + + }(), + + unproject: function () { + + var matrix = new Matrix4(); + + return function unproject( camera ) { + + matrix.multiplyMatrices( camera.matrixWorld, matrix.getInverse( camera.projectionMatrix ) ); + return this.applyMatrix4( matrix ); + + }; + + }(), + + transformDirection: function ( m ) { + + // input: THREE.Matrix4 affine matrix + // vector interpreted as a direction + + var x = this.x, y = this.y, z = this.z; + var e = m.elements; + + this.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z; + this.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z; + this.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z; + + return this.normalize(); + + }, + + divide: function ( v ) { + + this.x /= v.x; + this.y /= v.y; + this.z /= v.z; + + return this; + + }, + + divideScalar: function ( scalar ) { + + return this.multiplyScalar( 1 / scalar ); + + }, + + min: function ( v ) { + + this.x = Math.min( this.x, v.x ); + this.y = Math.min( this.y, v.y ); + this.z = Math.min( this.z, v.z ); + + return this; + + }, + + max: function ( v ) { + + this.x = Math.max( this.x, v.x ); + this.y = Math.max( this.y, v.y ); + this.z = Math.max( this.z, v.z ); + + return this; + + }, + + clamp: function ( min, max ) { + + // This function assumes min < max, if this assumption isn't true it will not operate correctly + + this.x = Math.max( min.x, Math.min( max.x, this.x ) ); + this.y = Math.max( min.y, Math.min( max.y, this.y ) ); + this.z = Math.max( min.z, Math.min( max.z, this.z ) ); + + return this; + + }, + + clampScalar: function () { + + var min = new Vector3(); + var max = new Vector3(); + + return function clampScalar( minVal, maxVal ) { + + min.set( minVal, minVal, minVal ); + max.set( maxVal, maxVal, maxVal ); + + return this.clamp( min, max ); + + }; + + }(), + + clampLength: function ( min, max ) { + + var length = this.length(); + + return this.multiplyScalar( Math.max( min, Math.min( max, length ) ) / length ); + + }, + + floor: function () { + + this.x = Math.floor( this.x ); + this.y = Math.floor( this.y ); + this.z = Math.floor( this.z ); + + return this; + + }, + + ceil: function () { + + this.x = Math.ceil( this.x ); + this.y = Math.ceil( this.y ); + this.z = Math.ceil( this.z ); + + return this; + + }, + + round: function () { + + this.x = Math.round( this.x ); + this.y = Math.round( this.y ); + this.z = Math.round( this.z ); + + return this; + + }, + + roundToZero: function () { + + this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x ); + this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y ); + this.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z ); + + return this; + + }, + + negate: function () { + + this.x = - this.x; + this.y = - this.y; + this.z = - this.z; + + return this; + + }, + + dot: function ( v ) { + + return this.x * v.x + this.y * v.y + this.z * v.z; + + }, + + // TODO lengthSquared? + + lengthSq: function () { + + return this.x * this.x + this.y * this.y + this.z * this.z; + + }, + + length: function () { + + return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z ); + + }, + + lengthManhattan: function () { + + return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ); + + }, + + normalize: function () { + + return this.divideScalar( this.length() ); + + }, + + setLength: function ( length ) { + + return this.multiplyScalar( length / this.length() ); + + }, + + lerp: function ( v, alpha ) { + + this.x += ( v.x - this.x ) * alpha; + this.y += ( v.y - this.y ) * alpha; + this.z += ( v.z - this.z ) * alpha; + + return this; + + }, + + lerpVectors: function ( v1, v2, alpha ) { + + return this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 ); + + }, + + cross: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.' ); + return this.crossVectors( v, w ); + + } + + var x = this.x, y = this.y, z = this.z; + + this.x = y * v.z - z * v.y; + this.y = z * v.x - x * v.z; + this.z = x * v.y - y * v.x; + + return this; + + }, + + crossVectors: function ( a, b ) { + + var ax = a.x, ay = a.y, az = a.z; + var bx = b.x, by = b.y, bz = b.z; + + this.x = ay * bz - az * by; + this.y = az * bx - ax * bz; + this.z = ax * by - ay * bx; + + return this; + + }, + + projectOnVector: function ( vector ) { + + var scalar = vector.dot( this ) / vector.lengthSq(); + + return this.copy( vector ).multiplyScalar( scalar ); + + }, + + projectOnPlane: function () { + + var v1 = new Vector3(); + + return function projectOnPlane( planeNormal ) { + + v1.copy( this ).projectOnVector( planeNormal ); + + return this.sub( v1 ); + + }; + + }(), + + reflect: function () { + + // reflect incident vector off plane orthogonal to normal + // normal is assumed to have unit length + + var v1 = new Vector3(); + + return function reflect( normal ) { + + return this.sub( v1.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) ); + + }; + + }(), + + angleTo: function ( v ) { + + var theta = this.dot( v ) / ( Math.sqrt( this.lengthSq() * v.lengthSq() ) ); + + // clamp, to handle numerical problems + + return Math.acos( _Math.clamp( theta, - 1, 1 ) ); + + }, + + distanceTo: function ( v ) { + + return Math.sqrt( this.distanceToSquared( v ) ); + + }, + + distanceToSquared: function ( v ) { + + var dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z; + + return dx * dx + dy * dy + dz * dz; + + }, + + distanceToManhattan: function ( v ) { + + return Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z ); + + }, + + setFromSpherical: function ( s ) { + + var sinPhiRadius = Math.sin( s.phi ) * s.radius; + + this.x = sinPhiRadius * Math.sin( s.theta ); + this.y = Math.cos( s.phi ) * s.radius; + this.z = sinPhiRadius * Math.cos( s.theta ); + + return this; + + }, + + setFromCylindrical: function ( c ) { + + this.x = c.radius * Math.sin( c.theta ); + this.y = c.y; + this.z = c.radius * Math.cos( c.theta ); + + return this; + + }, + + setFromMatrixPosition: function ( m ) { + + return this.setFromMatrixColumn( m, 3 ); + + }, + + setFromMatrixScale: function ( m ) { + + var sx = this.setFromMatrixColumn( m, 0 ).length(); + var sy = this.setFromMatrixColumn( m, 1 ).length(); + var sz = this.setFromMatrixColumn( m, 2 ).length(); + + this.x = sx; + this.y = sy; + this.z = sz; + + return this; + + }, + + setFromMatrixColumn: function ( m, index ) { + + + return this.fromArray( m.elements, index * 4 ); + + }, + + equals: function ( v ) { + + return ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.x = array[ offset ]; + this.y = array[ offset + 1 ]; + this.z = array[ offset + 2 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.x; + array[ offset + 1 ] = this.y; + array[ offset + 2 ] = this.z; + + return array; + + }, + + fromBufferAttribute: function ( attribute, index, offset ) { + + if ( offset !== undefined ) { + + console.warn( 'THREE.Vector3: offset has been removed from .fromBufferAttribute().' ); + + } + + this.x = attribute.getX( index ); + this.y = attribute.getY( index ); + this.z = attribute.getZ( index ); + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author supereggbert / http://www.paulbrunt.co.uk/ + * @author philogb / http://blog.thejit.org/ + * @author jordi_ros / http://plattsoft.com + * @author D1plo1d / http://github.com/D1plo1d + * @author alteredq / http://alteredqualia.com/ + * @author mikael emtinger / http://gomo.se/ + * @author timknip / http://www.floorplanner.com/ + * @author bhouston / http://clara.io + * @author WestLangley / http://github.com/WestLangley + */ + + function Matrix4() { + + this.elements = [ + + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + + ]; + + if ( arguments.length > 0 ) { + + console.error( 'THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.' ); + + } + + } + + Object.assign( Matrix4.prototype, { + + isMatrix4: true, + + set: function ( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) { + + var te = this.elements; + + te[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14; + te[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24; + te[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34; + te[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44; + + return this; + + }, + + identity: function () { + + this.set( + + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + clone: function () { + + return new Matrix4().fromArray( this.elements ); + + }, + + copy: function ( m ) { + + var te = this.elements; + var me = m.elements; + + te[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ]; te[ 3 ] = me[ 3 ]; + te[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ]; te[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ]; + te[ 8 ] = me[ 8 ]; te[ 9 ] = me[ 9 ]; te[ 10 ] = me[ 10 ]; te[ 11 ] = me[ 11 ]; + te[ 12 ] = me[ 12 ]; te[ 13 ] = me[ 13 ]; te[ 14 ] = me[ 14 ]; te[ 15 ] = me[ 15 ]; + + return this; + + }, + + copyPosition: function ( m ) { + + var te = this.elements, me = m.elements; + + te[ 12 ] = me[ 12 ]; + te[ 13 ] = me[ 13 ]; + te[ 14 ] = me[ 14 ]; + + return this; + + }, + + extractBasis: function ( xAxis, yAxis, zAxis ) { + + xAxis.setFromMatrixColumn( this, 0 ); + yAxis.setFromMatrixColumn( this, 1 ); + zAxis.setFromMatrixColumn( this, 2 ); + + return this; + + }, + + makeBasis: function ( xAxis, yAxis, zAxis ) { + + this.set( + xAxis.x, yAxis.x, zAxis.x, 0, + xAxis.y, yAxis.y, zAxis.y, 0, + xAxis.z, yAxis.z, zAxis.z, 0, + 0, 0, 0, 1 + ); + + return this; + + }, + + extractRotation: function () { + + var v1 = new Vector3(); + + return function extractRotation( m ) { + + var te = this.elements; + var me = m.elements; + + var scaleX = 1 / v1.setFromMatrixColumn( m, 0 ).length(); + var scaleY = 1 / v1.setFromMatrixColumn( m, 1 ).length(); + var scaleZ = 1 / v1.setFromMatrixColumn( m, 2 ).length(); + + te[ 0 ] = me[ 0 ] * scaleX; + te[ 1 ] = me[ 1 ] * scaleX; + te[ 2 ] = me[ 2 ] * scaleX; + + te[ 4 ] = me[ 4 ] * scaleY; + te[ 5 ] = me[ 5 ] * scaleY; + te[ 6 ] = me[ 6 ] * scaleY; + + te[ 8 ] = me[ 8 ] * scaleZ; + te[ 9 ] = me[ 9 ] * scaleZ; + te[ 10 ] = me[ 10 ] * scaleZ; + + return this; + + }; + + }(), + + makeRotationFromEuler: function ( euler ) { + + if ( ( euler && euler.isEuler ) === false ) { + + console.error( 'THREE.Matrix: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.' ); + + } + + var te = this.elements; + + var x = euler.x, y = euler.y, z = euler.z; + var a = Math.cos( x ), b = Math.sin( x ); + var c = Math.cos( y ), d = Math.sin( y ); + var e = Math.cos( z ), f = Math.sin( z ); + + if ( euler.order === 'XYZ' ) { + + var ae = a * e, af = a * f, be = b * e, bf = b * f; + + te[ 0 ] = c * e; + te[ 4 ] = - c * f; + te[ 8 ] = d; + + te[ 1 ] = af + be * d; + te[ 5 ] = ae - bf * d; + te[ 9 ] = - b * c; + + te[ 2 ] = bf - ae * d; + te[ 6 ] = be + af * d; + te[ 10 ] = a * c; + + } else if ( euler.order === 'YXZ' ) { + + var ce = c * e, cf = c * f, de = d * e, df = d * f; + + te[ 0 ] = ce + df * b; + te[ 4 ] = de * b - cf; + te[ 8 ] = a * d; + + te[ 1 ] = a * f; + te[ 5 ] = a * e; + te[ 9 ] = - b; + + te[ 2 ] = cf * b - de; + te[ 6 ] = df + ce * b; + te[ 10 ] = a * c; + + } else if ( euler.order === 'ZXY' ) { + + var ce = c * e, cf = c * f, de = d * e, df = d * f; + + te[ 0 ] = ce - df * b; + te[ 4 ] = - a * f; + te[ 8 ] = de + cf * b; + + te[ 1 ] = cf + de * b; + te[ 5 ] = a * e; + te[ 9 ] = df - ce * b; + + te[ 2 ] = - a * d; + te[ 6 ] = b; + te[ 10 ] = a * c; + + } else if ( euler.order === 'ZYX' ) { + + var ae = a * e, af = a * f, be = b * e, bf = b * f; + + te[ 0 ] = c * e; + te[ 4 ] = be * d - af; + te[ 8 ] = ae * d + bf; + + te[ 1 ] = c * f; + te[ 5 ] = bf * d + ae; + te[ 9 ] = af * d - be; + + te[ 2 ] = - d; + te[ 6 ] = b * c; + te[ 10 ] = a * c; + + } else if ( euler.order === 'YZX' ) { + + var ac = a * c, ad = a * d, bc = b * c, bd = b * d; + + te[ 0 ] = c * e; + te[ 4 ] = bd - ac * f; + te[ 8 ] = bc * f + ad; + + te[ 1 ] = f; + te[ 5 ] = a * e; + te[ 9 ] = - b * e; + + te[ 2 ] = - d * e; + te[ 6 ] = ad * f + bc; + te[ 10 ] = ac - bd * f; + + } else if ( euler.order === 'XZY' ) { + + var ac = a * c, ad = a * d, bc = b * c, bd = b * d; + + te[ 0 ] = c * e; + te[ 4 ] = - f; + te[ 8 ] = d * e; + + te[ 1 ] = ac * f + bd; + te[ 5 ] = a * e; + te[ 9 ] = ad * f - bc; + + te[ 2 ] = bc * f - ad; + te[ 6 ] = b * e; + te[ 10 ] = bd * f + ac; + + } + + // last column + te[ 3 ] = 0; + te[ 7 ] = 0; + te[ 11 ] = 0; + + // bottom row + te[ 12 ] = 0; + te[ 13 ] = 0; + te[ 14 ] = 0; + te[ 15 ] = 1; + + return this; + + }, + + makeRotationFromQuaternion: function ( q ) { + + var te = this.elements; + + var x = q._x, y = q._y, z = q._z, w = q._w; + var x2 = x + x, y2 = y + y, z2 = z + z; + var xx = x * x2, xy = x * y2, xz = x * z2; + var yy = y * y2, yz = y * z2, zz = z * z2; + var wx = w * x2, wy = w * y2, wz = w * z2; + + te[ 0 ] = 1 - ( yy + zz ); + te[ 4 ] = xy - wz; + te[ 8 ] = xz + wy; + + te[ 1 ] = xy + wz; + te[ 5 ] = 1 - ( xx + zz ); + te[ 9 ] = yz - wx; + + te[ 2 ] = xz - wy; + te[ 6 ] = yz + wx; + te[ 10 ] = 1 - ( xx + yy ); + + // last column + te[ 3 ] = 0; + te[ 7 ] = 0; + te[ 11 ] = 0; + + // bottom row + te[ 12 ] = 0; + te[ 13 ] = 0; + te[ 14 ] = 0; + te[ 15 ] = 1; + + return this; + + }, + + lookAt: function () { + + var x = new Vector3(); + var y = new Vector3(); + var z = new Vector3(); + + return function lookAt( eye, target, up ) { + + var te = this.elements; + + z.subVectors( eye, target ); + + if ( z.lengthSq() === 0 ) { + + // eye and target are in the same position + + z.z = 1; + + } + + z.normalize(); + x.crossVectors( up, z ); + + if ( x.lengthSq() === 0 ) { + + // eye and target are in the same vertical + + z.z += 0.0001; + x.crossVectors( up, z ); + + } + + x.normalize(); + y.crossVectors( z, x ); + + 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; + + return this; + + }; + + }(), + + multiply: function ( m, n ) { + + if ( n !== undefined ) { + + console.warn( 'THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.' ); + return this.multiplyMatrices( m, n ); + + } + + return this.multiplyMatrices( this, m ); + + }, + + premultiply: function ( m ) { + + return this.multiplyMatrices( m, this ); + + }, + + multiplyMatrices: function ( a, b ) { + + var ae = a.elements; + var be = b.elements; + var te = this.elements; + + var a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ]; + var a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ]; + var a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ]; + var a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ]; + + var b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ]; + var b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ]; + var b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ]; + var b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ]; + + te[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41; + te[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42; + te[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43; + te[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44; + + te[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41; + te[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42; + te[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43; + te[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44; + + te[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41; + te[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42; + te[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43; + te[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44; + + te[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41; + te[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42; + te[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43; + te[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44; + + return this; + + }, + + multiplyScalar: function ( s ) { + + var te = this.elements; + + te[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s; + te[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s; + te[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s; + te[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s; + + return this; + + }, + + applyToBufferAttribute: function () { + + var v1 = new Vector3(); + + return function applyToBufferAttribute( attribute ) { + + for ( var i = 0, l = attribute.count; i < l; i ++ ) { + + v1.x = attribute.getX( i ); + v1.y = attribute.getY( i ); + v1.z = attribute.getZ( i ); + + v1.applyMatrix4( this ); + + attribute.setXYZ( i, v1.x, v1.y, v1.z ); + + } + + return attribute; + + }; + + }(), + + determinant: function () { + + var te = this.elements; + + var n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ]; + var n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ]; + var n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ]; + var n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ]; + + //TODO: make this more efficient + //( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm ) + + return ( + n41 * ( + + n14 * n23 * n32 + - n13 * n24 * n32 + - n14 * n22 * n33 + + n12 * n24 * n33 + + n13 * n22 * n34 + - n12 * n23 * n34 + ) + + n42 * ( + + n11 * n23 * n34 + - n11 * n24 * n33 + + n14 * n21 * n33 + - n13 * n21 * n34 + + n13 * n24 * n31 + - n14 * n23 * n31 + ) + + n43 * ( + + n11 * n24 * n32 + - n11 * n22 * n34 + - n14 * n21 * n32 + + n12 * n21 * n34 + + n14 * n22 * n31 + - n12 * n24 * n31 + ) + + n44 * ( + - n13 * n22 * n31 + - n11 * n23 * n32 + + n11 * n22 * n33 + + n13 * n21 * n32 + - n12 * n21 * n33 + + n12 * n23 * n31 + ) + + ); + + }, + + transpose: function () { + + var te = this.elements; + var tmp; + + tmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp; + tmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp; + tmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp; + + tmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp; + tmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp; + tmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp; + + return this; + + }, + + setPosition: function ( v ) { + + var te = this.elements; + + te[ 12 ] = v.x; + te[ 13 ] = v.y; + te[ 14 ] = v.z; + + return this; + + }, + + getInverse: function ( m, throwOnDegenerate ) { + + // based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm + var te = this.elements, + me = m.elements, + + n11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ], n41 = me[ 3 ], + n12 = me[ 4 ], n22 = me[ 5 ], n32 = me[ 6 ], n42 = me[ 7 ], + n13 = me[ 8 ], n23 = me[ 9 ], n33 = me[ 10 ], n43 = me[ 11 ], + n14 = me[ 12 ], n24 = me[ 13 ], n34 = me[ 14 ], n44 = me[ 15 ], + + t11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44, + t12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44, + t13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44, + t14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34; + + var det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14; + + if ( det === 0 ) { + + var msg = "THREE.Matrix4.getInverse(): can't invert matrix, determinant is 0"; + + if ( throwOnDegenerate === true ) { + + throw new Error( msg ); + + } else { + + console.warn( msg ); + + } + + return this.identity(); + + } + + var detInv = 1 / det; + + te[ 0 ] = t11 * detInv; + te[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv; + te[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv; + te[ 3 ] = ( n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43 ) * detInv; + + te[ 4 ] = t12 * detInv; + te[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv; + te[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv; + te[ 7 ] = ( n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43 ) * detInv; + + te[ 8 ] = t13 * detInv; + te[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv; + te[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv; + te[ 11 ] = ( n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43 ) * detInv; + + te[ 12 ] = t14 * detInv; + te[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv; + te[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv; + te[ 15 ] = ( n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33 ) * detInv; + + return this; + + }, + + scale: function ( v ) { + + var te = this.elements; + var x = v.x, y = v.y, z = v.z; + + te[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z; + te[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z; + te[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z; + te[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z; + + return this; + + }, + + getMaxScaleOnAxis: function () { + + var te = this.elements; + + var scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ]; + var scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ]; + var scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ]; + + return Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) ); + + }, + + makeTranslation: function ( x, y, z ) { + + this.set( + + 1, 0, 0, x, + 0, 1, 0, y, + 0, 0, 1, z, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeRotationX: function ( theta ) { + + var c = Math.cos( theta ), s = Math.sin( theta ); + + this.set( + + 1, 0, 0, 0, + 0, c, - s, 0, + 0, s, c, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeRotationY: function ( theta ) { + + var c = Math.cos( theta ), s = Math.sin( theta ); + + this.set( + + c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeRotationZ: function ( theta ) { + + var c = Math.cos( theta ), s = Math.sin( theta ); + + this.set( + + c, - s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeRotationAxis: function ( axis, angle ) { + + // Based on http://www.gamedev.net/reference/articles/article1199.asp + + var c = Math.cos( angle ); + var s = Math.sin( angle ); + var t = 1 - c; + var x = axis.x, y = axis.y, z = axis.z; + var tx = t * x, ty = t * y; + + this.set( + + tx * x + c, tx * y - s * z, tx * z + s * y, 0, + tx * y + s * z, ty * y + c, ty * z - s * x, 0, + tx * z - s * y, ty * z + s * x, t * z * z + c, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeScale: function ( x, y, z ) { + + this.set( + + x, 0, 0, 0, + 0, y, 0, 0, + 0, 0, z, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeShear: function ( x, y, z ) { + + this.set( + + 1, y, z, 0, + x, 1, z, 0, + x, y, 1, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + compose: function ( position, quaternion, scale ) { + + this.makeRotationFromQuaternion( quaternion ); + this.scale( scale ); + this.setPosition( position ); + + return this; + + }, + + decompose: function () { + + var vector = new Vector3(); + var matrix = new Matrix4(); + + return function decompose( position, quaternion, scale ) { + + var te = this.elements; + + var sx = vector.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length(); + var sy = vector.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length(); + var sz = vector.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length(); + + // if determine is negative, we need to invert one scale + var det = this.determinant(); + if ( det < 0 ) sx = - sx; + + position.x = te[ 12 ]; + position.y = te[ 13 ]; + position.z = te[ 14 ]; + + // scale the rotation part + matrix.copy( this ); + + var invSX = 1 / sx; + var invSY = 1 / sy; + var invSZ = 1 / sz; + + matrix.elements[ 0 ] *= invSX; + matrix.elements[ 1 ] *= invSX; + matrix.elements[ 2 ] *= invSX; + + matrix.elements[ 4 ] *= invSY; + matrix.elements[ 5 ] *= invSY; + matrix.elements[ 6 ] *= invSY; + + matrix.elements[ 8 ] *= invSZ; + matrix.elements[ 9 ] *= invSZ; + matrix.elements[ 10 ] *= invSZ; + + quaternion.setFromRotationMatrix( matrix ); + + scale.x = sx; + scale.y = sy; + scale.z = sz; + + return this; + + }; + + }(), + + makePerspective: function ( left, right, top, bottom, near, far ) { + + if ( far === undefined ) { + + console.warn( 'THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.' ); + + } + + var te = this.elements; + var x = 2 * near / ( right - left ); + var y = 2 * near / ( top - bottom ); + + var a = ( right + left ) / ( right - left ); + var b = ( top + bottom ) / ( top - bottom ); + var c = - ( far + near ) / ( far - near ); + var d = - 2 * far * near / ( far - near ); + + te[ 0 ] = x; te[ 4 ] = 0; te[ 8 ] = a; te[ 12 ] = 0; + te[ 1 ] = 0; te[ 5 ] = y; te[ 9 ] = b; te[ 13 ] = 0; + te[ 2 ] = 0; te[ 6 ] = 0; te[ 10 ] = c; te[ 14 ] = d; + te[ 3 ] = 0; te[ 7 ] = 0; te[ 11 ] = - 1; te[ 15 ] = 0; + + return this; + + }, + + makeOrthographic: function ( left, right, top, bottom, near, far ) { + + var te = this.elements; + var w = 1.0 / ( right - left ); + var h = 1.0 / ( top - bottom ); + var p = 1.0 / ( far - near ); + + var x = ( right + left ) * w; + var y = ( top + bottom ) * h; + var z = ( far + near ) * p; + + te[ 0 ] = 2 * w; te[ 4 ] = 0; te[ 8 ] = 0; te[ 12 ] = - x; + te[ 1 ] = 0; te[ 5 ] = 2 * h; te[ 9 ] = 0; te[ 13 ] = - y; + te[ 2 ] = 0; te[ 6 ] = 0; te[ 10 ] = - 2 * p; te[ 14 ] = - z; + te[ 3 ] = 0; te[ 7 ] = 0; te[ 11 ] = 0; te[ 15 ] = 1; + + return this; + + }, + + equals: function ( matrix ) { + + var te = this.elements; + var me = matrix.elements; + + for ( var i = 0; i < 16; i ++ ) { + + if ( te[ i ] !== me[ i ] ) return false; + + } + + return true; + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + for ( var i = 0; i < 16; i ++ ) { + + this.elements[ i ] = array[ i + offset ]; + + } + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + var te = this.elements; + + array[ offset ] = te[ 0 ]; + array[ offset + 1 ] = te[ 1 ]; + array[ offset + 2 ] = te[ 2 ]; + array[ offset + 3 ] = te[ 3 ]; + + array[ offset + 4 ] = te[ 4 ]; + array[ offset + 5 ] = te[ 5 ]; + array[ offset + 6 ] = te[ 6 ]; + array[ offset + 7 ] = te[ 7 ]; + + array[ offset + 8 ] = te[ 8 ]; + array[ offset + 9 ] = te[ 9 ]; + array[ offset + 10 ] = te[ 10 ]; + array[ offset + 11 ] = te[ 11 ]; + + array[ offset + 12 ] = te[ 12 ]; + array[ offset + 13 ] = te[ 13 ]; + array[ offset + 14 ] = te[ 14 ]; + array[ offset + 15 ] = te[ 15 ]; + + return array; + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function DataTexture( data, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) { + + Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ); + + this.image = { data: data, width: width, height: height }; + + this.magFilter = magFilter !== undefined ? magFilter : NearestFilter; + this.minFilter = minFilter !== undefined ? minFilter : NearestFilter; + + this.generateMipmaps = false; + this.flipY = false; + this.unpackAlignment = 1; + + } + + DataTexture.prototype = Object.create( Texture.prototype ); + DataTexture.prototype.constructor = DataTexture; + + DataTexture.prototype.isDataTexture = true; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function CubeTexture( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) { + + images = images !== undefined ? images : []; + mapping = mapping !== undefined ? mapping : CubeReflectionMapping; + + Texture.call( this, images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ); + + this.flipY = false; + + } + + CubeTexture.prototype = Object.create( Texture.prototype ); + CubeTexture.prototype.constructor = CubeTexture; + + CubeTexture.prototype.isCubeTexture = true; + + Object.defineProperty( CubeTexture.prototype, 'images', { + + get: function () { + + return this.image; + + }, + + set: function ( value ) { + + this.image = value; + + } + + } ); + + /** + * @author tschw + * + * Uniforms of a program. + * Those form a tree structure with a special top-level container for the root, + * which you get by calling 'new WebGLUniforms( gl, program, renderer )'. + * + * + * Properties of inner nodes including the top-level container: + * + * .seq - array of nested uniforms + * .map - nested uniforms by name + * + * + * Methods of all nodes except the top-level container: + * + * .setValue( gl, value, [renderer] ) + * + * uploads a uniform value(s) + * the 'renderer' parameter is needed for sampler uniforms + * + * + * Static methods of the top-level container (renderer factorizations): + * + * .upload( gl, seq, values, renderer ) + * + * sets uniforms in 'seq' to 'values[id].value' + * + * .seqWithValue( seq, values ) : filteredSeq + * + * filters 'seq' entries with corresponding entry in values + * + * + * Methods of the top-level container (renderer factorizations): + * + * .setValue( gl, name, value ) + * + * sets uniform with name 'name' to 'value' + * + * .set( gl, obj, prop ) + * + * sets uniform from object and property with same name than uniform + * + * .setOptional( gl, obj, prop ) + * + * like .set for an optional property of the object + * + */ + + var emptyTexture = new Texture(); + var emptyCubeTexture = new CubeTexture(); + + // --- Base for inner nodes (including the root) --- + + function UniformContainer() { + + this.seq = []; + this.map = {}; + + } + + // --- Utilities --- + + // Array Caches (provide typed arrays for temporary by size) + + var arrayCacheF32 = []; + var arrayCacheI32 = []; + + // Float32Array caches used for uploading Matrix uniforms + + var mat4array = new Float32Array( 16 ); + var mat3array = new Float32Array( 9 ); + + // Flattening for arrays of vectors and matrices + + function flatten( array, nBlocks, blockSize ) { + + var firstElem = array[ 0 ]; + + if ( firstElem <= 0 || firstElem > 0 ) return array; + // unoptimized: ! isNaN( firstElem ) + // see http://jacksondunstan.com/articles/983 + + var n = nBlocks * blockSize, + r = arrayCacheF32[ n ]; + + if ( r === undefined ) { + + r = new Float32Array( n ); + arrayCacheF32[ n ] = r; + + } + + if ( nBlocks !== 0 ) { + + firstElem.toArray( r, 0 ); + + for ( var i = 1, offset = 0; i !== nBlocks; ++ i ) { + + offset += blockSize; + array[ i ].toArray( r, offset ); + + } + + } + + return r; + + } + + // Texture unit allocation + + function allocTexUnits( renderer, n ) { + + var r = arrayCacheI32[ n ]; + + if ( r === undefined ) { + + r = new Int32Array( n ); + arrayCacheI32[ n ] = r; + + } + + for ( var i = 0; i !== n; ++ i ) + r[ i ] = renderer.allocTextureUnit(); + + return r; + + } + + // --- Setters --- + + // Note: Defining these methods externally, because they come in a bunch + // and this way their names minify. + + // Single scalar + + function setValue1f( gl, v ) { gl.uniform1f( this.addr, v ); } + function setValue1i( gl, v ) { gl.uniform1i( this.addr, v ); } + + // Single float vector (from flat array or THREE.VectorN) + + function setValue2fv( gl, v ) { + + if ( v.x === undefined ) gl.uniform2fv( this.addr, v ); + else gl.uniform2f( this.addr, v.x, v.y ); + + } + + function setValue3fv( gl, v ) { + + if ( v.x !== undefined ) + gl.uniform3f( this.addr, v.x, v.y, v.z ); + else if ( v.r !== undefined ) + gl.uniform3f( this.addr, v.r, v.g, v.b ); + else + gl.uniform3fv( this.addr, v ); + + } + + function setValue4fv( gl, v ) { + + if ( v.x === undefined ) gl.uniform4fv( this.addr, v ); + else gl.uniform4f( this.addr, v.x, v.y, v.z, v.w ); + + } + + // Single matrix (from flat array or MatrixN) + + function setValue2fm( gl, v ) { + + gl.uniformMatrix2fv( this.addr, false, v.elements || v ); + + } + + function setValue3fm( gl, v ) { + + if ( v.elements === undefined ) { + + gl.uniformMatrix3fv( this.addr, false, v ); + + } else { + + mat3array.set( v.elements ); + gl.uniformMatrix3fv( this.addr, false, mat3array ); + + } + + } + + function setValue4fm( gl, v ) { + + if ( v.elements === undefined ) { + + gl.uniformMatrix4fv( this.addr, false, v ); + + } else { + + mat4array.set( v.elements ); + gl.uniformMatrix4fv( this.addr, false, mat4array ); + + } + + } + + // Single texture (2D / Cube) + + function setValueT1( gl, v, renderer ) { + + var unit = renderer.allocTextureUnit(); + gl.uniform1i( this.addr, unit ); + renderer.setTexture2D( v || emptyTexture, unit ); + + } + + function setValueT6( gl, v, renderer ) { + + var unit = renderer.allocTextureUnit(); + gl.uniform1i( this.addr, unit ); + renderer.setTextureCube( v || emptyCubeTexture, unit ); + + } + + // Integer / Boolean vectors or arrays thereof (always flat arrays) + + function setValue2iv( gl, v ) { gl.uniform2iv( this.addr, v ); } + function setValue3iv( gl, v ) { gl.uniform3iv( this.addr, v ); } + function setValue4iv( gl, v ) { gl.uniform4iv( this.addr, v ); } + + // Helper to pick the right setter for the singular case + + function getSingularSetter( type ) { + + switch ( type ) { + + case 0x1406: return setValue1f; // FLOAT + case 0x8b50: return setValue2fv; // _VEC2 + case 0x8b51: return setValue3fv; // _VEC3 + case 0x8b52: return setValue4fv; // _VEC4 + + case 0x8b5a: return setValue2fm; // _MAT2 + case 0x8b5b: return setValue3fm; // _MAT3 + case 0x8b5c: return setValue4fm; // _MAT4 + + case 0x8b5e: return setValueT1; // SAMPLER_2D + case 0x8b60: return setValueT6; // SAMPLER_CUBE + + case 0x1404: case 0x8b56: return setValue1i; // INT, BOOL + case 0x8b53: case 0x8b57: return setValue2iv; // _VEC2 + case 0x8b54: case 0x8b58: return setValue3iv; // _VEC3 + case 0x8b55: case 0x8b59: return setValue4iv; // _VEC4 + + } + + } + + // Array of scalars + + function setValue1fv( gl, v ) { gl.uniform1fv( this.addr, v ); } + function setValue1iv( gl, v ) { gl.uniform1iv( this.addr, v ); } + + // Array of vectors (flat or from THREE classes) + + function setValueV2a( gl, v ) { + + gl.uniform2fv( this.addr, flatten( v, this.size, 2 ) ); + + } + + function setValueV3a( gl, v ) { + + gl.uniform3fv( this.addr, flatten( v, this.size, 3 ) ); + + } + + function setValueV4a( gl, v ) { + + gl.uniform4fv( this.addr, flatten( v, this.size, 4 ) ); + + } + + // Array of matrices (flat or from THREE clases) + + function setValueM2a( gl, v ) { + + gl.uniformMatrix2fv( this.addr, false, flatten( v, this.size, 4 ) ); + + } + + function setValueM3a( gl, v ) { + + gl.uniformMatrix3fv( this.addr, false, flatten( v, this.size, 9 ) ); + + } + + function setValueM4a( gl, v ) { + + gl.uniformMatrix4fv( this.addr, false, flatten( v, this.size, 16 ) ); + + } + + // Array of textures (2D / Cube) + + function setValueT1a( gl, v, renderer ) { + + var n = v.length, + units = allocTexUnits( renderer, n ); + + gl.uniform1iv( this.addr, units ); + + for ( var i = 0; i !== n; ++ i ) { + + renderer.setTexture2D( v[ i ] || emptyTexture, units[ i ] ); + + } + + } + + function setValueT6a( gl, v, renderer ) { + + var n = v.length, + units = allocTexUnits( renderer, n ); + + gl.uniform1iv( this.addr, units ); + + for ( var i = 0; i !== n; ++ i ) { + + renderer.setTextureCube( v[ i ] || emptyCubeTexture, units[ i ] ); + + } + + } + + // Helper to pick the right setter for a pure (bottom-level) array + + function getPureArraySetter( type ) { + + switch ( type ) { + + case 0x1406: return setValue1fv; // FLOAT + case 0x8b50: return setValueV2a; // _VEC2 + case 0x8b51: return setValueV3a; // _VEC3 + case 0x8b52: return setValueV4a; // _VEC4 + + case 0x8b5a: return setValueM2a; // _MAT2 + case 0x8b5b: return setValueM3a; // _MAT3 + case 0x8b5c: return setValueM4a; // _MAT4 + + case 0x8b5e: return setValueT1a; // SAMPLER_2D + case 0x8b60: return setValueT6a; // SAMPLER_CUBE + + case 0x1404: case 0x8b56: return setValue1iv; // INT, BOOL + case 0x8b53: case 0x8b57: return setValue2iv; // _VEC2 + case 0x8b54: case 0x8b58: return setValue3iv; // _VEC3 + case 0x8b55: case 0x8b59: return setValue4iv; // _VEC4 + + } + + } + + // --- Uniform Classes --- + + function SingleUniform( id, activeInfo, addr ) { + + this.id = id; + this.addr = addr; + this.setValue = getSingularSetter( activeInfo.type ); + + // this.path = activeInfo.name; // DEBUG + + } + + function PureArrayUniform( id, activeInfo, addr ) { + + this.id = id; + this.addr = addr; + this.size = activeInfo.size; + this.setValue = getPureArraySetter( activeInfo.type ); + + // this.path = activeInfo.name; // DEBUG + + } + + function StructuredUniform( id ) { + + this.id = id; + + UniformContainer.call( this ); // mix-in + + } + + StructuredUniform.prototype.setValue = function ( gl, value ) { + + // Note: Don't need an extra 'renderer' parameter, since samplers + // are not allowed in structured uniforms. + + var seq = this.seq; + + for ( var i = 0, n = seq.length; i !== n; ++ i ) { + + var u = seq[ i ]; + u.setValue( gl, value[ u.id ] ); + + } + + }; + + // --- Top-level --- + + // Parser - builds up the property tree from the path strings + + var RePathPart = /([\w\d_]+)(\])?(\[|\.)?/g; + + // extracts + // - the identifier (member name or array index) + // - followed by an optional right bracket (found when array index) + // - followed by an optional left bracket or dot (type of subscript) + // + // Note: These portions can be read in a non-overlapping fashion and + // allow straightforward parsing of the hierarchy that WebGL encodes + // in the uniform names. + + function addUniform( container, uniformObject ) { + + container.seq.push( uniformObject ); + container.map[ uniformObject.id ] = uniformObject; + + } + + function parseUniform( activeInfo, addr, container ) { + + var path = activeInfo.name, + pathLength = path.length; + + // reset RegExp object, because of the early exit of a previous run + RePathPart.lastIndex = 0; + + for ( ; ; ) { + + var match = RePathPart.exec( path ), + matchEnd = RePathPart.lastIndex, + + id = match[ 1 ], + idIsIndex = match[ 2 ] === ']', + subscript = match[ 3 ]; + + if ( idIsIndex ) id = id | 0; // convert to integer + + if ( subscript === undefined || subscript === '[' && matchEnd + 2 === pathLength ) { + + // bare name or "pure" bottom-level array "[0]" suffix + + addUniform( container, subscript === undefined ? + new SingleUniform( id, activeInfo, addr ) : + new PureArrayUniform( id, activeInfo, addr ) ); + + break; + + } else { + + // step into inner node / create it in case it doesn't exist + + var map = container.map, next = map[ id ]; + + if ( next === undefined ) { + + next = new StructuredUniform( id ); + addUniform( container, next ); + + } + + container = next; + + } + + } + + } + + // Root Container + + function WebGLUniforms( gl, program, renderer ) { + + UniformContainer.call( this ); + + this.renderer = renderer; + + var n = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS ); + + for ( var i = 0; i < n; ++ i ) { + + var info = gl.getActiveUniform( program, i ), + path = info.name, + addr = gl.getUniformLocation( program, path ); + + parseUniform( info, addr, this ); + + } + + } + + WebGLUniforms.prototype.setValue = function ( gl, name, value ) { + + var u = this.map[ name ]; + + if ( u !== undefined ) u.setValue( gl, value, this.renderer ); + + }; + + WebGLUniforms.prototype.setOptional = function ( gl, object, name ) { + + var v = object[ name ]; + + if ( v !== undefined ) this.setValue( gl, name, v ); + + }; + + + // Static interface + + WebGLUniforms.upload = function ( gl, seq, values, renderer ) { + + for ( var i = 0, n = seq.length; i !== n; ++ i ) { + + var u = seq[ i ], + v = values[ u.id ]; + + if ( v.needsUpdate !== false ) { + + // note: always updating when .needsUpdate is undefined + u.setValue( gl, v.value, renderer ); + + } + + } + + }; + + WebGLUniforms.seqWithValue = function ( seq, values ) { + + var r = []; + + for ( var i = 0, n = seq.length; i !== n; ++ i ) { + + var u = seq[ i ]; + if ( u.id in values ) r.push( u ); + + } + + return r; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + var ColorKeywords = { 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF, + 'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2, + 'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50, + 'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B, + 'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B, + 'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F, + 'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3, + 'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222, + 'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700, + 'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4, + 'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00, + 'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3, + 'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA, + 'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32, + 'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3, + 'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC, + 'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD, + 'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6, + 'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9, + 'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F, + 'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE, + 'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA, + 'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0, + 'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32 }; + + function Color( r, g, b ) { + + if ( g === undefined && b === undefined ) { + + // r is THREE.Color, hex or string + return this.set( r ); + + } + + return this.setRGB( r, g, b ); + + } + + Object.assign( Color.prototype, { + + isColor: true, + + r: 1, g: 1, b: 1, + + set: function ( value ) { + + if ( value && value.isColor ) { + + this.copy( value ); + + } else if ( typeof value === 'number' ) { + + this.setHex( value ); + + } else if ( typeof value === 'string' ) { + + this.setStyle( value ); + + } + + return this; + + }, + + setScalar: function ( scalar ) { + + this.r = scalar; + this.g = scalar; + this.b = scalar; + + return this; + + }, + + setHex: function ( hex ) { + + hex = Math.floor( hex ); + + this.r = ( hex >> 16 & 255 ) / 255; + this.g = ( hex >> 8 & 255 ) / 255; + this.b = ( hex & 255 ) / 255; + + return this; + + }, + + setRGB: function ( r, g, b ) { + + this.r = r; + this.g = g; + this.b = b; + + return this; + + }, + + setHSL: function () { + + function hue2rgb( p, q, t ) { + + if ( t < 0 ) t += 1; + if ( t > 1 ) t -= 1; + if ( t < 1 / 6 ) return p + ( q - p ) * 6 * t; + if ( t < 1 / 2 ) return q; + if ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t ); + return p; + + } + + return function setHSL( h, s, l ) { + + // h,s,l ranges are in 0.0 - 1.0 + h = _Math.euclideanModulo( h, 1 ); + s = _Math.clamp( s, 0, 1 ); + l = _Math.clamp( l, 0, 1 ); + + if ( s === 0 ) { + + this.r = this.g = this.b = l; + + } else { + + var p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s ); + var q = ( 2 * l ) - p; + + this.r = hue2rgb( q, p, h + 1 / 3 ); + this.g = hue2rgb( q, p, h ); + this.b = hue2rgb( q, p, h - 1 / 3 ); + + } + + return this; + + }; + + }(), + + setStyle: function ( style ) { + + function handleAlpha( string ) { + + if ( string === undefined ) return; + + if ( parseFloat( string ) < 1 ) { + + console.warn( 'THREE.Color: Alpha component of ' + style + ' will be ignored.' ); + + } + + } + + + var m; + + if ( m = /^((?:rgb|hsl)a?)\(\s*([^\)]*)\)/.exec( style ) ) { + + // rgb / hsl + + var color; + var name = m[ 1 ]; + var components = m[ 2 ]; + + switch ( name ) { + + case 'rgb': + case 'rgba': + + if ( color = /^(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( components ) ) { + + // rgb(255,0,0) rgba(255,0,0,0.5) + this.r = Math.min( 255, parseInt( color[ 1 ], 10 ) ) / 255; + this.g = Math.min( 255, parseInt( color[ 2 ], 10 ) ) / 255; + this.b = Math.min( 255, parseInt( color[ 3 ], 10 ) ) / 255; + + handleAlpha( color[ 5 ] ); + + return this; + + } + + if ( color = /^(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( components ) ) { + + // rgb(100%,0%,0%) rgba(100%,0%,0%,0.5) + this.r = Math.min( 100, parseInt( color[ 1 ], 10 ) ) / 100; + this.g = Math.min( 100, parseInt( color[ 2 ], 10 ) ) / 100; + this.b = Math.min( 100, parseInt( color[ 3 ], 10 ) ) / 100; + + handleAlpha( color[ 5 ] ); + + return this; + + } + + break; + + case 'hsl': + case 'hsla': + + if ( color = /^([0-9]*\.?[0-9]+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( components ) ) { + + // hsl(120,50%,50%) hsla(120,50%,50%,0.5) + var h = parseFloat( color[ 1 ] ) / 360; + var s = parseInt( color[ 2 ], 10 ) / 100; + var l = parseInt( color[ 3 ], 10 ) / 100; + + handleAlpha( color[ 5 ] ); + + return this.setHSL( h, s, l ); + + } + + break; + + } + + } else if ( m = /^\#([A-Fa-f0-9]+)$/.exec( style ) ) { + + // hex color + + var hex = m[ 1 ]; + var size = hex.length; + + if ( size === 3 ) { + + // #ff0 + this.r = parseInt( hex.charAt( 0 ) + hex.charAt( 0 ), 16 ) / 255; + this.g = parseInt( hex.charAt( 1 ) + hex.charAt( 1 ), 16 ) / 255; + this.b = parseInt( hex.charAt( 2 ) + hex.charAt( 2 ), 16 ) / 255; + + return this; + + } else if ( size === 6 ) { + + // #ff0000 + this.r = parseInt( hex.charAt( 0 ) + hex.charAt( 1 ), 16 ) / 255; + this.g = parseInt( hex.charAt( 2 ) + hex.charAt( 3 ), 16 ) / 255; + this.b = parseInt( hex.charAt( 4 ) + hex.charAt( 5 ), 16 ) / 255; + + return this; + + } + + } + + if ( style && style.length > 0 ) { + + // color keywords + var hex = ColorKeywords[ style ]; + + if ( hex !== undefined ) { + + // red + this.setHex( hex ); + + } else { + + // unknown color + console.warn( 'THREE.Color: Unknown color ' + style ); + + } + + } + + return this; + + }, + + clone: function () { + + return new this.constructor( this.r, this.g, this.b ); + + }, + + copy: function ( color ) { + + this.r = color.r; + this.g = color.g; + this.b = color.b; + + return this; + + }, + + copyGammaToLinear: function ( color, gammaFactor ) { + + if ( gammaFactor === undefined ) gammaFactor = 2.0; + + this.r = Math.pow( color.r, gammaFactor ); + this.g = Math.pow( color.g, gammaFactor ); + this.b = Math.pow( color.b, gammaFactor ); + + return this; + + }, + + copyLinearToGamma: function ( color, gammaFactor ) { + + if ( gammaFactor === undefined ) gammaFactor = 2.0; + + var safeInverse = ( gammaFactor > 0 ) ? ( 1.0 / gammaFactor ) : 1.0; + + this.r = Math.pow( color.r, safeInverse ); + this.g = Math.pow( color.g, safeInverse ); + this.b = Math.pow( color.b, safeInverse ); + + return this; + + }, + + convertGammaToLinear: function () { + + var r = this.r, g = this.g, b = this.b; + + this.r = r * r; + this.g = g * g; + this.b = b * b; + + return this; + + }, + + convertLinearToGamma: function () { + + this.r = Math.sqrt( this.r ); + this.g = Math.sqrt( this.g ); + this.b = Math.sqrt( this.b ); + + return this; + + }, + + getHex: function () { + + return ( this.r * 255 ) << 16 ^ ( this.g * 255 ) << 8 ^ ( this.b * 255 ) << 0; + + }, + + getHexString: function () { + + return ( '000000' + this.getHex().toString( 16 ) ).slice( - 6 ); + + }, + + getHSL: function ( optionalTarget ) { + + // h,s,l ranges are in 0.0 - 1.0 + + var hsl = optionalTarget || { h: 0, s: 0, l: 0 }; + + var r = this.r, g = this.g, b = this.b; + + var max = Math.max( r, g, b ); + var min = Math.min( r, g, b ); + + var hue, saturation; + var lightness = ( min + max ) / 2.0; + + if ( min === max ) { + + hue = 0; + saturation = 0; + + } else { + + var delta = max - min; + + saturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min ); + + switch ( max ) { + + case r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break; + case g: hue = ( b - r ) / delta + 2; break; + case b: hue = ( r - g ) / delta + 4; break; + + } + + hue /= 6; + + } + + hsl.h = hue; + hsl.s = saturation; + hsl.l = lightness; + + return hsl; + + }, + + getStyle: function () { + + return 'rgb(' + ( ( this.r * 255 ) | 0 ) + ',' + ( ( this.g * 255 ) | 0 ) + ',' + ( ( this.b * 255 ) | 0 ) + ')'; + + }, + + offsetHSL: function ( h, s, l ) { + + var hsl = this.getHSL(); + + hsl.h += h; hsl.s += s; hsl.l += l; + + this.setHSL( hsl.h, hsl.s, hsl.l ); + + return this; + + }, + + add: function ( color ) { + + this.r += color.r; + this.g += color.g; + this.b += color.b; + + return this; + + }, + + addColors: function ( color1, color2 ) { + + this.r = color1.r + color2.r; + this.g = color1.g + color2.g; + this.b = color1.b + color2.b; + + return this; + + }, + + addScalar: function ( s ) { + + this.r += s; + this.g += s; + this.b += s; + + return this; + + }, + + sub: function( color ) { + + this.r = Math.max( 0, this.r - color.r ); + this.g = Math.max( 0, this.g - color.g ); + this.b = Math.max( 0, this.b - color.b ); + + return this; + + }, + + multiply: function ( color ) { + + this.r *= color.r; + this.g *= color.g; + this.b *= color.b; + + return this; + + }, + + multiplyScalar: function ( s ) { + + this.r *= s; + this.g *= s; + this.b *= s; + + return this; + + }, + + lerp: function ( color, alpha ) { + + this.r += ( color.r - this.r ) * alpha; + this.g += ( color.g - this.g ) * alpha; + this.b += ( color.b - this.b ) * alpha; + + return this; + + }, + + equals: function ( c ) { + + return ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.r = array[ offset ]; + this.g = array[ offset + 1 ]; + this.b = array[ offset + 2 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.r; + array[ offset + 1 ] = this.g; + array[ offset + 2 ] = this.b; + + return array; + + }, + + toJSON: function () { + + return this.getHex(); + + } + + } ); + + /** + * Uniforms library for shared webgl shaders + */ + + var UniformsLib = { + + common: { + + diffuse: { value: new Color( 0xeeeeee ) }, + opacity: { value: 1.0 }, + + map: { value: null }, + offsetRepeat: { value: new Vector4( 0, 0, 1, 1 ) }, + + specularMap: { value: null }, + alphaMap: { value: null }, + + envMap: { value: null }, + flipEnvMap: { value: - 1 }, + reflectivity: { value: 1.0 }, + refractionRatio: { value: 0.98 } + + }, + + aomap: { + + aoMap: { value: null }, + aoMapIntensity: { value: 1 } + + }, + + lightmap: { + + lightMap: { value: null }, + lightMapIntensity: { value: 1 } + + }, + + emissivemap: { + + emissiveMap: { value: null } + + }, + + bumpmap: { + + bumpMap: { value: null }, + bumpScale: { value: 1 } + + }, + + normalmap: { + + normalMap: { value: null }, + normalScale: { value: new Vector2( 1, 1 ) } + + }, + + displacementmap: { + + displacementMap: { value: null }, + displacementScale: { value: 1 }, + displacementBias: { value: 0 } + + }, + + roughnessmap: { + + roughnessMap: { value: null } + + }, + + metalnessmap: { + + metalnessMap: { value: null } + + }, + + gradientmap: { + + gradientMap: { value: null } + + }, + + fog: { + + fogDensity: { value: 0.00025 }, + fogNear: { value: 1 }, + fogFar: { value: 2000 }, + fogColor: { value: new Color( 0xffffff ) } + + }, + + lights: { + + ambientLightColor: { value: [] }, + + directionalLights: { value: [], properties: { + direction: {}, + color: {}, + + shadow: {}, + shadowBias: {}, + shadowRadius: {}, + shadowMapSize: {} + } }, + + directionalShadowMap: { value: [] }, + directionalShadowMatrix: { value: [] }, + + spotLights: { value: [], properties: { + color: {}, + position: {}, + direction: {}, + distance: {}, + coneCos: {}, + penumbraCos: {}, + decay: {}, + + shadow: {}, + shadowBias: {}, + shadowRadius: {}, + shadowMapSize: {} + } }, + + spotShadowMap: { value: [] }, + spotShadowMatrix: { value: [] }, + + pointLights: { value: [], properties: { + color: {}, + position: {}, + decay: {}, + distance: {}, + + shadow: {}, + shadowBias: {}, + shadowRadius: {}, + shadowMapSize: {} + } }, + + pointShadowMap: { value: [] }, + pointShadowMatrix: { value: [] }, + + hemisphereLights: { value: [], properties: { + direction: {}, + skyColor: {}, + groundColor: {} + } }, + + // TODO (abelnation): RectAreaLight BRDF data needs to be moved from example to main src + rectAreaLights: { value: [], properties: { + color: {}, + position: {}, + width: {}, + height: {} + } } + + }, + + points: { + + diffuse: { value: new Color( 0xeeeeee ) }, + opacity: { value: 1.0 }, + size: { value: 1.0 }, + scale: { value: 1.0 }, + map: { value: null }, + offsetRepeat: { value: new Vector4( 0, 0, 1, 1 ) } + + } + + }; + + /** + * Uniform Utilities + */ + + var UniformsUtils = { + + merge: function ( uniforms ) { + + var merged = {}; + + for ( var u = 0; u < uniforms.length; u ++ ) { + + var tmp = this.clone( uniforms[ u ] ); + + for ( var p in tmp ) { + + merged[ p ] = tmp[ p ]; + + } + + } + + return merged; + + }, + + clone: function ( uniforms_src ) { + + var uniforms_dst = {}; + + for ( var u in uniforms_src ) { + + uniforms_dst[ u ] = {}; + + for ( var p in uniforms_src[ u ] ) { + + var parameter_src = uniforms_src[ u ][ p ]; + + if ( parameter_src && ( parameter_src.isColor || + parameter_src.isMatrix3 || parameter_src.isMatrix4 || + parameter_src.isVector2 || parameter_src.isVector3 || parameter_src.isVector4 || + parameter_src.isTexture ) ) { + + uniforms_dst[ u ][ p ] = parameter_src.clone(); + + } else if ( Array.isArray( parameter_src ) ) { + + uniforms_dst[ u ][ p ] = parameter_src.slice(); + + } else { + + uniforms_dst[ u ][ p ] = parameter_src; + + } + + } + + } + + return uniforms_dst; + + } + + }; + + var alphamap_fragment = "#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\n#endif\n"; + + var alphamap_pars_fragment = "#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif\n"; + + var alphatest_fragment = "#ifdef ALPHATEST\n\tif ( diffuseColor.a < ALPHATEST ) discard;\n#endif\n"; + + var aomap_fragment = "#ifdef USE_AOMAP\n\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\n\treflectedLight.indirectDiffuse *= ambientOcclusion;\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.specularRoughness );\n\t#endif\n#endif\n"; + + var aomap_pars_fragment = "#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif"; + + var begin_vertex = "\nvec3 transformed = vec3( position );\n"; + + var beginnormal_vertex = "\nvec3 objectNormal = vec3( normal );\n"; + + var bsdfs = "float punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\tif( decayExponent > 0.0 ) {\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\t\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\t\tfloat maxDistanceCutoffFactor = pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t\treturn distanceFalloff * maxDistanceCutoffFactor;\n#else\n\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n#endif\n\t}\n\treturn 1.0;\n}\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\n\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\n}\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\treturn 1.0 / ( gl * gv );\n}\nfloat G_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNL = saturate( dot( geometry.normal, incidentLight.direction ) );\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\tfloat D = D_GGX( alpha, dotNH );\n\treturn F * ( G * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\tfloat theta = acos( dot( N, V ) );\n\tvec2 uv = vec2(\n\t\tsqrt( saturate( roughness ) ),\n\t\tsaturate( theta / ( 0.5 * PI ) ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.86267 + (0.49788 + 0.01436 * y ) * y;\n\tfloat b = 3.45068 + (4.18814 + y) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = (x > 0.0) ? v : 0.5 * inversesqrt( 1.0 - x * x ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transpose( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tvec3 result = vec3( LTC_ClippedSphereFormFactor( vectorFormFactor ) );\n\treturn result;\n}\nvec3 BRDF_Specular_GGX_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\tvec2 AB = vec2( -1.04, 1.04 ) * a004 + r.zw;\n\treturn specularColor * AB.x + AB.y;\n}\nfloat G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\n\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\n}\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\n\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\n}\n"; + + var bumpmap_pars_fragment = "#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\n\t\tvec3 vSigmaX = dFdx( surf_pos );\n\t\tvec3 vSigmaY = dFdy( surf_pos );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 );\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif\n"; + + var clipping_planes_fragment = "#if NUM_CLIPPING_PLANES > 0\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; ++ i ) {\n\t\tvec4 plane = clippingPlanes[ i ];\n\t\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t\t\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; ++ i ) {\n\t\t\tvec4 plane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\tif ( clipped ) discard;\n\t\n\t#endif\n#endif\n"; + + var clipping_planes_pars_fragment = "#if NUM_CLIPPING_PLANES > 0\n\t#if ! defined( PHYSICAL ) && ! defined( PHONG )\n\t\tvarying vec3 vViewPosition;\n\t#endif\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif\n"; + + var clipping_planes_pars_vertex = "#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvarying vec3 vViewPosition;\n#endif\n"; + + var clipping_planes_vertex = "#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n"; + + var color_fragment = "#ifdef USE_COLOR\n\tdiffuseColor.rgb *= vColor;\n#endif"; + + var color_pars_fragment = "#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif\n"; + + var color_pars_vertex = "#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif"; + + var color_vertex = "#ifdef USE_COLOR\n\tvColor.xyz = color.xyz;\n#endif"; + + var common = "#define PI 3.14159265359\n#define PI2 6.28318530718\n#define PI_HALF 1.5707963267949\n#define RECIPROCAL_PI 0.31830988618\n#define RECIPROCAL_PI2 0.15915494\n#define LOG2 1.442695\n#define EPSILON 1e-6\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#define whiteCompliment(a) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract(sin(sn) * c);\n}\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\tfloat distance = dot( planeNormal, point - pointOnPlane );\n\treturn - distance * planeNormal + point;\n}\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn sign( dot( point - pointOnPlane, planeNormal ) );\n}\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\n}\nmat3 transpose( const in mat3 v ) {\n\tmat3 tmp;\n\ttmp[0] = vec3(v[0].x, v[1].x, v[2].x);\n\ttmp[1] = vec3(v[0].y, v[1].y, v[2].y);\n\ttmp[2] = vec3(v[0].z, v[1].z, v[2].z);\n\treturn tmp;\n}\n"; + + var cube_uv_reflection_fragment = "#ifdef ENVMAP_TYPE_CUBE_UV\n#define cubeUV_textureSize (1024.0)\nint getFaceFromDirection(vec3 direction) {\n\tvec3 absDirection = abs(direction);\n\tint face = -1;\n\tif( absDirection.x > absDirection.z ) {\n\t\tif(absDirection.x > absDirection.y )\n\t\t\tface = direction.x > 0.0 ? 0 : 3;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\telse {\n\t\tif(absDirection.z > absDirection.y )\n\t\t\tface = direction.z > 0.0 ? 2 : 5;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\treturn face;\n}\n#define cubeUV_maxLods1 (log2(cubeUV_textureSize*0.25) - 1.0)\n#define cubeUV_rangeClamp (exp2((6.0 - 1.0) * 2.0))\nvec2 MipLevelInfo( vec3 vec, float roughnessLevel, float roughness ) {\n\tfloat scale = exp2(cubeUV_maxLods1 - roughnessLevel);\n\tfloat dxRoughness = dFdx(roughness);\n\tfloat dyRoughness = dFdy(roughness);\n\tvec3 dx = dFdx( vec * scale * dxRoughness );\n\tvec3 dy = dFdy( vec * scale * dyRoughness );\n\tfloat d = max( dot( dx, dx ), dot( dy, dy ) );\n\td = clamp(d, 1.0, cubeUV_rangeClamp);\n\tfloat mipLevel = 0.5 * log2(d);\n\treturn vec2(floor(mipLevel), fract(mipLevel));\n}\n#define cubeUV_maxLods2 (log2(cubeUV_textureSize*0.25) - 2.0)\n#define cubeUV_rcpTextureSize (1.0 / cubeUV_textureSize)\nvec2 getCubeUV(vec3 direction, float roughnessLevel, float mipLevel) {\n\tmipLevel = roughnessLevel > cubeUV_maxLods2 - 3.0 ? 0.0 : mipLevel;\n\tfloat a = 16.0 * cubeUV_rcpTextureSize;\n\tvec2 exp2_packed = exp2( vec2( roughnessLevel, mipLevel ) );\n\tvec2 rcp_exp2_packed = vec2( 1.0 ) / exp2_packed;\n\tfloat powScale = exp2_packed.x * exp2_packed.y;\n\tfloat scale = rcp_exp2_packed.x * rcp_exp2_packed.y * 0.25;\n\tfloat mipOffset = 0.75*(1.0 - rcp_exp2_packed.y) * rcp_exp2_packed.x;\n\tbool bRes = mipLevel == 0.0;\n\tscale = bRes && (scale < a) ? a : scale;\n\tvec3 r;\n\tvec2 offset;\n\tint face = getFaceFromDirection(direction);\n\tfloat rcpPowScale = 1.0 / powScale;\n\tif( face == 0) {\n\t\tr = vec3(direction.x, -direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 1) {\n\t\tr = vec3(direction.y, direction.x, direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 2) {\n\t\tr = vec3(direction.z, direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 3) {\n\t\tr = vec3(direction.x, direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse if( face == 4) {\n\t\tr = vec3(direction.y, direction.x, -direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse {\n\t\tr = vec3(direction.z, -direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\tr = normalize(r);\n\tfloat texelOffset = 0.5 * cubeUV_rcpTextureSize;\n\tvec2 s = ( r.yz / abs( r.x ) + vec2( 1.0 ) ) * 0.5;\n\tvec2 base = offset + vec2( texelOffset );\n\treturn base + s * ( scale - 2.0 * texelOffset );\n}\n#define cubeUV_maxLods3 (log2(cubeUV_textureSize*0.25) - 3.0)\nvec4 textureCubeUV(vec3 reflectedDirection, float roughness ) {\n\tfloat roughnessVal = roughness* cubeUV_maxLods3;\n\tfloat r1 = floor(roughnessVal);\n\tfloat r2 = r1 + 1.0;\n\tfloat t = fract(roughnessVal);\n\tvec2 mipInfo = MipLevelInfo(reflectedDirection, r1, roughness);\n\tfloat s = mipInfo.y;\n\tfloat level0 = mipInfo.x;\n\tfloat level1 = level0 + 1.0;\n\tlevel1 = level1 > 5.0 ? 5.0 : level1;\n\tlevel0 += min( floor( s + 0.5 ), 5.0 );\n\tvec2 uv_10 = getCubeUV(reflectedDirection, r1, level0);\n\tvec4 color10 = envMapTexelToLinear(texture2D(envMap, uv_10));\n\tvec2 uv_20 = getCubeUV(reflectedDirection, r2, level0);\n\tvec4 color20 = envMapTexelToLinear(texture2D(envMap, uv_20));\n\tvec4 result = mix(color10, color20, t);\n\treturn vec4(result.rgb, 1.0);\n}\n#endif\n"; + + var defaultnormal_vertex = "#ifdef FLIP_SIDED\n\tobjectNormal = -objectNormal;\n#endif\nvec3 transformedNormal = normalMatrix * objectNormal;\n"; + + var displacementmap_pars_vertex = "#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif\n"; + + var displacementmap_vertex = "#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normal * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\n#endif\n"; + + var emissivemap_fragment = "#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif\n"; + + var emissivemap_pars_fragment = "#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif\n"; + + var encodings_fragment = " gl_FragColor = linearToOutputTexel( gl_FragColor );\n"; + + var encodings_pars_fragment = "\nvec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.xyz, vec3( gammaFactor ) ), value.w );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.xyz, vec3( 1.0 / gammaFactor ) ), value.w );\n}\nvec4 sRGBToLinear( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.w );\n}\nvec4 LinearTosRGB( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.w );\n}\nvec4 RGBEToLinear( in vec4 value ) {\n\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\n}\nvec4 LinearToRGBE( in vec4 value ) {\n\tfloat maxComponent = max( max( value.r, value.g ), value.b );\n\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\n\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\n}\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.xyz * value.w * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\n\tfloat M = clamp( maxRGB / maxRange, 0.0, 1.0 );\n\tM = ceil( M * 255.0 ) / 255.0;\n\treturn vec4( value.rgb / ( M * maxRange ), M );\n}\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\n}\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\n\tfloat D = max( maxRange / maxRGB, 1.0 );\n\tD = min( floor( D ) / 255.0, 1.0 );\n\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\n}\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\nvec4 LinearToLogLuv( in vec4 value ) {\n\tvec3 Xp_Y_XYZp = value.rgb * cLogLuvM;\n\tXp_Y_XYZp = max(Xp_Y_XYZp, vec3(1e-6, 1e-6, 1e-6));\n\tvec4 vResult;\n\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\n\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\n\tvResult.w = fract(Le);\n\tvResult.z = (Le - (floor(vResult.w*255.0))/255.0)/255.0;\n\treturn vResult;\n}\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\nvec4 LogLuvToLinear( in vec4 value ) {\n\tfloat Le = value.z * 255.0 + value.w;\n\tvec3 Xp_Y_XYZp;\n\tXp_Y_XYZp.y = exp2((Le - 127.0) / 2.0);\n\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\n\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\n\tvec3 vRGB = Xp_Y_XYZp.rgb * cLogLuvInverseM;\n\treturn vec4( max(vRGB, 0.0), 1.0 );\n}\n"; + + var envmap_fragment = "#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\tvec2 sampleUV;\n\t\tsampleUV.y = saturate( flipNormal * reflectVec.y * 0.5 + 0.5 );\n\t\tsampleUV.x = atan( flipNormal * reflectVec.z, flipNormal * reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\tvec4 envColor = texture2D( envMap, sampleUV );\n\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\tvec3 reflectView = flipNormal * normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0, 0.0, 1.0 ) );\n\t\tvec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\tenvColor = envMapTexelToLinear( envColor );\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif\n"; + + var envmap_pars_fragment = "#if defined( USE_ENVMAP ) || defined( PHYSICAL )\n\tuniform float reflectivity;\n\tuniform float envMapIntensity;\n#endif\n#ifdef USE_ENVMAP\n\t#if ! defined( PHYSICAL ) && ( defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) )\n\t\tvarying vec3 vWorldPosition;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\tuniform float flipEnvMap;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( PHYSICAL )\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif\n"; + + var envmap_pars_vertex = "#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif\n"; + + var envmap_vertex = "#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif\n"; + + var fog_vertex = "\n#ifdef USE_FOG\nfogDepth = -mvPosition.z;\n#endif"; + + var fog_pars_vertex = "#ifdef USE_FOG\n varying float fogDepth;\n#endif\n"; + + var fog_fragment = "#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 ) );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif\n"; + + var fog_pars_fragment = "#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float fogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif\n"; + + var gradientmap_pars_fragment = "#ifdef TOON\n\tuniform sampler2D gradientMap;\n\tvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\t\tfloat dotNL = dot( normal, lightDirection );\n\t\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t\t#ifdef USE_GRADIENTMAP\n\t\t\treturn texture2D( gradientMap, coord ).rgb;\n\t\t#else\n\t\t\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\n\t\t#endif\n\t}\n#endif\n"; + + var lightmap_fragment = "#ifdef USE_LIGHTMAP\n\treflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n#endif\n"; + + var lightmap_pars_fragment = "#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif"; + + var lights_lambert_vertex = "vec3 diffuse = vec3( 1.0 );\nGeometricContext geometry;\ngeometry.position = mvPosition.xyz;\ngeometry.normal = normalize( transformedNormal );\ngeometry.viewDir = normalize( -mvPosition.xyz );\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\nvLightFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n#endif\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\n#if NUM_POINT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_DIR_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\tvLightFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\n\t\t#endif\n\t}\n#endif\n"; + + var lights_pars = "uniform vec3 ambientLightColor;\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treturn irradiance;\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tdirectLight.color = directionalLight.color;\n\t\tdirectLight.direction = directionalLight.direction;\n\t\tdirectLight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tdirectLight.color = pointLight.color;\n\t\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\n\t\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tfloat angleCos = dot( directLight.direction, spotLight.direction );\n\t\tif ( angleCos > spotLight.coneCos ) {\n\t\t\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\t\tdirectLight.color = spotLight.color;\n\t\t\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tdirectLight.visible = true;\n\t\t} else {\n\t\t\tdirectLight.color = vec3( 0.0 );\n\t\t\tdirectLight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltcMat;\tuniform sampler2D ltcMag;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\n\t\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tirradiance *= PI;\n\t\t#endif\n\t\treturn irradiance;\n\t}\n#endif\n#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\n\t\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\tvec4 envMapColor = textureCubeUV( queryVec, 1.0 );\n\t\t#else\n\t\t\tvec4 envMapColor = vec4( 0.0 );\n\t\t#endif\n\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t}\n\tfloat getSpecularMIPLevel( const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\tfloat maxMIPLevelScalar = float( maxMIPLevel );\n\t\tfloat desiredMIPLevel = maxMIPLevelScalar - 0.79248 - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 );\n\t\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\n\t}\n\tvec3 getLightProbeIndirectRadiance( const in GeometricContext geometry, const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( -geometry.viewDir, geometry.normal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( -geometry.viewDir, geometry.normal, refractionRatio );\n\t\t#endif\n\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\tfloat specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, maxMIPLevel );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\tvec4 envMapColor = textureCubeUV(queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent));\n\t\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\t\tvec2 sampleUV;\n\t\t\tsampleUV.y = saturate( reflectVec.y * 0.5 + 0.5 );\n\t\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#endif\n\t\treturn envMapColor.rgb * envMapIntensity;\n\t}\n#endif\n"; + + var lights_phong_fragment = "BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;\n"; + + var lights_phong_pars_fragment = "varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct BlinnPhongMaterial {\n\tvec3\tdiffuseColor;\n\tvec3\tspecularColor;\n\tfloat\tspecularShininess;\n\tfloat\tspecularStrength;\n};\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_BlinnPhong( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = BlinnExponentToGGXRoughness( material.specularShininess );\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos - halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos + halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos + halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos - halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tfloat norm = texture2D( ltcMag, uv ).a;\n\t\tvec4 t = texture2D( ltcMat, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( 1, 0, t.y ),\n\t\t\tvec3( 0, t.z, 0 ),\n\t\t\tvec3( t.w, 0, t.x )\n\t\t);\n\t\treflectedLight.directSpecular += lightColor * material.specularColor * norm * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifdef TOON\n\t\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\t#else\n\t\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\t\tvec3 irradiance = dotNL * directLight.color;\n\t#endif\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n#define Material_LightProbeLOD( material )\t(0)\n"; + + var lights_physical_fragment = "PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nmaterial.specularRoughness = clamp( roughnessFactor, 0.04, 1.0 );\n#ifdef STANDARD\n\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.clearCoat = saturate( clearCoat );\tmaterial.clearCoatRoughness = clamp( clearCoatRoughness, 0.04, 1.0 );\n#endif\n"; + + var lights_physical_pars_fragment = "struct PhysicalMaterial {\n\tvec3\tdiffuseColor;\n\tfloat\tspecularRoughness;\n\tvec3\tspecularColor;\n\t#ifndef STANDARD\n\t\tfloat clearCoat;\n\t\tfloat clearCoatRoughness;\n\t#endif\n};\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\nfloat clearCoatDHRApprox( const in float roughness, const in float dotNL ) {\n\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.specularRoughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos - halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos + halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos + halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos - halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tfloat norm = texture2D( ltcMag, uv ).a;\n\t\tvec4 t = texture2D( ltcMat, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( 1, 0, t.y ),\n\t\t\tvec3( 0, t.z, 0 ),\n\t\t\tvec3( t.w, 0, t.x )\n\t\t);\n\t\treflectedLight.directSpecular += lightColor * material.specularColor * norm * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\t#ifndef STANDARD\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.directSpecular += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry, material.specularColor, material.specularRoughness );\n\treflectedLight.directDiffuse += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\t#ifndef STANDARD\n\t\treflectedLight.directSpecular += irradiance * material.clearCoat * BRDF_Specular_GGX( directLight, geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 clearCoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifndef STANDARD\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\tfloat dotNL = dotNV;\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.indirectSpecular += ( 1.0 - clearCoatDHR ) * radiance * BRDF_Specular_GGX_Environment( geometry, material.specularColor, material.specularRoughness );\n\t#ifndef STANDARD\n\t\treflectedLight.indirectSpecular += clearCoatRadiance * material.clearCoat * BRDF_Specular_GGX_Environment( geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\n#define Material_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.specularRoughness )\n#define Material_ClearCoat_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.clearCoatRoughness )\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}\n"; + + var lights_template = "\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = normalize( vViewPosition );\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( pointLight.shadow, directLight.visible ) ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( spotLight.shadow, directLight.visible ) ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( directionalLight.shadow, directLight.visible ) ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\t#ifdef USE_LIGHTMAP\n\t\tvec3 lightMapIrradiance = texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tlightMapIrradiance *= PI;\n\t\t#endif\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t}\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tirradiance += getLightProbeIndirectIrradiance( geometry, 8 );\n\t#endif\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tvec3 radiance = getLightProbeIndirectRadiance( geometry, Material_BlinnShininessExponent( material ), 8 );\n\t#ifndef STANDARD\n\t\tvec3 clearCoatRadiance = getLightProbeIndirectRadiance( geometry, Material_ClearCoat_BlinnShininessExponent( material ), 8 );\n\t#else\n\t\tvec3 clearCoatRadiance = vec3( 0.0 );\n\t#endif\n\tRE_IndirectSpecular( radiance, clearCoatRadiance, geometry, material, reflectedLight );\n#endif\n"; + + var logdepthbuf_fragment = "#if defined(USE_LOGDEPTHBUF) && defined(USE_LOGDEPTHBUF_EXT)\n\tgl_FragDepthEXT = log2(vFragDepth) * logDepthBufFC * 0.5;\n#endif"; + + var logdepthbuf_pars_fragment = "#ifdef USE_LOGDEPTHBUF\n\tuniform float logDepthBufFC;\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n#endif\n"; + + var logdepthbuf_pars_vertex = "#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n\tuniform float logDepthBufFC;\n#endif"; + + var logdepthbuf_vertex = "#ifdef USE_LOGDEPTHBUF\n\tgl_Position.z = log2(max( EPSILON, gl_Position.w + 1.0 )) * logDepthBufFC;\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t#else\n\t\tgl_Position.z = (gl_Position.z - 1.0) * gl_Position.w;\n\t#endif\n#endif\n"; + + var map_fragment = "#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif\n"; + + var map_pars_fragment = "#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n"; + + var map_particle_fragment = "#ifdef USE_MAP\n\tvec4 mapTexel = texture2D( map, vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y ) * offsetRepeat.zw + offsetRepeat.xy );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n"; + + var map_particle_pars_fragment = "#ifdef USE_MAP\n\tuniform vec4 offsetRepeat;\n\tuniform sampler2D map;\n#endif\n"; + + var metalnessmap_fragment = "float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif\n"; + + var metalnessmap_pars_fragment = "#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif"; + + var morphnormal_vertex = "#ifdef USE_MORPHNORMALS\n\tobjectNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\n\tobjectNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\n\tobjectNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\n\tobjectNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\n#endif\n"; + + var morphtarget_pars_vertex = "#ifdef USE_MORPHTARGETS\n\t#ifndef USE_MORPHNORMALS\n\tuniform float morphTargetInfluences[ 8 ];\n\t#else\n\tuniform float morphTargetInfluences[ 4 ];\n\t#endif\n#endif"; + + var morphtarget_vertex = "#ifdef USE_MORPHTARGETS\n\ttransformed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\n\ttransformed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\n\ttransformed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\n\ttransformed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\n\t#ifndef USE_MORPHNORMALS\n\ttransformed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\n\ttransformed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\n\ttransformed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\n\ttransformed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\n\t#endif\n#endif\n"; + + var normal_flip = "#ifdef DOUBLE_SIDED\n\tfloat flipNormal = ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n#else\n\tfloat flipNormal = 1.0;\n#endif\n"; + + var normal_fragment = "#ifdef FLAT_SHADED\n\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\n\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal ) * flipNormal;\n#endif\n#ifdef USE_NORMALMAP\n\tnormal = perturbNormal2Arb( -vViewPosition, normal );\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\n#endif\n"; + + var normalmap_pars_fragment = "#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\n\t\tvec3 q0 = dFdx( eye_pos.xyz );\n\t\tvec3 q1 = dFdy( eye_pos.xyz );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\t\tvec3 S = normalize( q0 * st1.t - q1 * st0.t );\n\t\tvec3 T = normalize( -q0 * st1.s + q1 * st0.s );\n\t\tvec3 N = normalize( surf_norm );\n\t\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t\tmapN.xy = normalScale * mapN.xy;\n\t\tmat3 tsn = mat3( S, T, N );\n\t\treturn normalize( tsn * mapN );\n\t}\n#endif\n"; + + var packing = "vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 1.0 - 2.0 * rgb.xyz;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n\treturn linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn (( near + viewZ ) * far ) / (( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\n}\n"; + + var premultiplied_alpha_fragment = "#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif\n"; + + var project_vertex = "#ifdef USE_SKINNING\n\tvec4 mvPosition = modelViewMatrix * skinned;\n#else\n\tvec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\n#endif\ngl_Position = projectionMatrix * mvPosition;\n"; + + var dithering_fragment = "#if defined( DITHERING )\n gl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif\n"; + + var dithering_pars_fragment = "#if defined( DITHERING )\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif\n"; + + var roughnessmap_fragment = "float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\n#endif\n"; + + var roughnessmap_pars_fragment = "#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif"; + + var shadowmap_pars_fragment = "#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tfloat texture2DShadowLerp( sampler2D depths, vec2 size, vec2 uv, float compare ) {\n\t\tconst vec2 offset = vec2( 0.0, 1.0 );\n\t\tvec2 texelSize = vec2( 1.0 ) / size;\n\t\tvec2 centroidUV = floor( uv * size + 0.5 ) / size;\n\t\tfloat lb = texture2DCompare( depths, centroidUV + texelSize * offset.xx, compare );\n\t\tfloat lt = texture2DCompare( depths, centroidUV + texelSize * offset.xy, compare );\n\t\tfloat rb = texture2DCompare( depths, centroidUV + texelSize * offset.yx, compare );\n\t\tfloat rt = texture2DCompare( depths, centroidUV + texelSize * offset.yy, compare );\n\t\tvec2 f = fract( uv * size + 0.5 );\n\t\tfloat a = mix( lb, lt, f.y );\n\t\tfloat b = mix( rb, rt, f.y );\n\t\tfloat c = mix( a, b, f.x );\n\t\treturn c;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n\t\tbool inFrustum = all( inFrustumVec );\n\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\t\tbool frustumTest = all( frustumTestVec );\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\treturn (\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn 1.0;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\tfloat dp = ( length( lightToPosition ) - shadowBias ) / 1000.0;\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif\n"; + + var shadowmap_pars_vertex = "#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n#endif\n"; + + var shadowmap_vertex = "#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n#endif\n"; + + var shadowmask_pars_fragment = "float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\tDirectionalLight directionalLight;\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tshadow *= bool( directionalLight.shadow ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\tSpotLight spotLight;\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tshadow *= bool( spotLight.shadow ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\tPointLight pointLight;\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tshadow *= bool( pointLight.shadow ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#endif\n\treturn shadow;\n}\n"; + + var skinbase_vertex = "#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif"; + + var skinning_pars_vertex = "#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\t#ifdef BONE_TEXTURE\n\t\tuniform sampler2D boneTexture;\n\t\tuniform int boneTextureSize;\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureSize ) );\n\t\t\tfloat y = floor( j / float( boneTextureSize ) );\n\t\t\tfloat dx = 1.0 / float( boneTextureSize );\n\t\t\tfloat dy = 1.0 / float( boneTextureSize );\n\t\t\ty = dy * ( y + 0.5 );\n\t\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\t\t\treturn bone;\n\t\t}\n\t#else\n\t\tuniform mat4 boneMatrices[ MAX_BONES ];\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tmat4 bone = boneMatrices[ int(i) ];\n\t\t\treturn bone;\n\t\t}\n\t#endif\n#endif\n"; + + var skinning_vertex = "#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\tskinned = bindMatrixInverse * skinned;\n#endif\n"; + + var skinnormal_vertex = "#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n#endif\n"; + + var specularmap_fragment = "float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif"; + + var specularmap_pars_fragment = "#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif"; + + var tonemapping_fragment = "#if defined( TONE_MAPPING )\n gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif\n"; + + var tonemapping_pars_fragment = "#define saturate(a) clamp( a, 0.0, 1.0 )\nuniform float toneMappingExposure;\nuniform float toneMappingWhitePoint;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\nvec3 Uncharted2ToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\n"; + + var uv_pars_fragment = "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n#endif"; + + var uv_pars_vertex = "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n\tuniform vec4 offsetRepeat;\n#endif\n"; + + var uv_vertex = "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvUv = uv * offsetRepeat.zw + offsetRepeat.xy;\n#endif"; + + var uv2_pars_fragment = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif"; + + var uv2_pars_vertex = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n#endif"; + + var uv2_vertex = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = uv2;\n#endif"; + + var worldpos_vertex = "#if defined( USE_ENVMAP ) || defined( PHONG ) || defined( PHYSICAL ) || defined( LAMBERT ) || defined ( USE_SHADOWMAP )\n\t#ifdef USE_SKINNING\n\t\tvec4 worldPosition = modelMatrix * skinned;\n\t#else\n\t\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\n\t#endif\n#endif\n"; + + var cube_frag = "uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\n\tgl_FragColor.a *= opacity;\n}\n"; + + var cube_vert = "varying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}\n"; + + var depth_frag = "#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <logdepthbuf_fragment>\n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( gl_FragCoord.z ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( gl_FragCoord.z );\n\t#endif\n}\n"; + + var depth_vert = "#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#include <begin_vertex>\n\t#include <displacementmap_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n}\n"; + + var distanceRGBA_frag = "uniform vec3 lightPos;\nvarying vec4 vWorldPosition;\n#include <common>\n#include <packing>\n#include <clipping_planes_pars_fragment>\nvoid main () {\n\t#include <clipping_planes_fragment>\n\tgl_FragColor = packDepthToRGBA( length( vWorldPosition.xyz - lightPos.xyz ) / 1000.0 );\n}\n"; + + var distanceRGBA_vert = "varying vec4 vWorldPosition;\n#include <common>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <skinbase_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\tvWorldPosition = worldPosition;\n}\n"; + + var equirect_frag = "uniform sampler2D tEquirect;\nuniform float tFlip;\nvarying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvec3 direction = normalize( vWorldPosition );\n\tvec2 sampleUV;\n\tsampleUV.y = saturate( tFlip * direction.y * -0.5 + 0.5 );\n\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n}\n"; + + var equirect_vert = "varying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}\n"; + + var linedashed_frag = "uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <color_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n"; + + var linedashed_vert = "uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <color_vertex>\n\tvLineDistance = scale * lineDistance;\n\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n}\n"; + + var meshbasic_frag = "uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\treflectedLight.indirectDiffuse += texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include <aomap_fragment>\n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include <normal_flip>\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n"; + + var meshbasic_vert = "#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_ENVMAP\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <envmap_vertex>\n\t#include <fog_vertex>\n}\n"; + + var meshlambert_frag = "uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <bsdfs>\n#include <lights_pars>\n#include <fog_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <emissivemap_fragment>\n\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\n\t#include <lightmap_fragment>\n\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\t#else\n\t\treflectedLight.directDiffuse = vLightFront;\n\t#endif\n\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include <normal_flip>\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}\n"; + + var meshlambert_vert = "#define LAMBERT\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <bsdfs>\n#include <lights_pars>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <lights_lambert_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n"; + + var meshphong_frag = "#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <gradientmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars>\n#include <lights_phong_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <normal_flip>\n\t#include <normal_fragment>\n\t#include <emissivemap_fragment>\n\t#include <lights_phong_fragment>\n\t#include <lights_template>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}\n"; + + var meshphong_vert = "#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <displacementmap_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n"; + + var meshphysical_frag = "#define PHYSICAL\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifndef STANDARD\n\tuniform float clearCoat;\n\tuniform float clearCoatRoughness;\n#endif\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <cube_uv_reflection_fragment>\n#include <lights_pars>\n#include <lights_physical_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <roughnessmap_pars_fragment>\n#include <metalnessmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <roughnessmap_fragment>\n\t#include <metalnessmap_fragment>\n\t#include <normal_flip>\n\t#include <normal_fragment>\n\t#include <emissivemap_fragment>\n\t#include <lights_physical_fragment>\n\t#include <lights_template>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}\n"; + + var meshphysical_vert = "#define PHYSICAL\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <displacementmap_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n"; + + var normal_frag = "#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <packing>\n#include <uv_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\nvoid main() {\n\t#include <logdepthbuf_fragment>\n\t#include <normal_flip>\n\t#include <normal_fragment>\n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n}\n"; + + var normal_vert = "#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <displacementmap_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}\n"; + + var points_frag = "uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <color_pars_fragment>\n#include <map_particle_pars_fragment>\n#include <fog_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_particle_fragment>\n\t#include <color_fragment>\n\t#include <alphatest_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n"; + + var points_vert = "uniform float size;\nuniform float scale;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <color_vertex>\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\t#ifdef USE_SIZEATTENUATION\n\t\tgl_PointSize = size * ( scale / - mvPosition.z );\n\t#else\n\t\tgl_PointSize = size;\n\t#endif\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n"; + + var shadow_frag = "uniform float opacity;\n#include <common>\n#include <packing>\n#include <bsdfs>\n#include <lights_pars>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\nvoid main() {\n\tgl_FragColor = vec4( 0.0, 0.0, 0.0, opacity * ( 1.0 - getShadowMask() ) );\n}\n"; + + var shadow_vert = "#include <shadowmap_pars_vertex>\nvoid main() {\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n}\n"; + + var ShaderChunk = { + alphamap_fragment: alphamap_fragment, + alphamap_pars_fragment: alphamap_pars_fragment, + alphatest_fragment: alphatest_fragment, + aomap_fragment: aomap_fragment, + aomap_pars_fragment: aomap_pars_fragment, + begin_vertex: begin_vertex, + beginnormal_vertex: beginnormal_vertex, + bsdfs: bsdfs, + bumpmap_pars_fragment: bumpmap_pars_fragment, + clipping_planes_fragment: clipping_planes_fragment, + clipping_planes_pars_fragment: clipping_planes_pars_fragment, + clipping_planes_pars_vertex: clipping_planes_pars_vertex, + clipping_planes_vertex: clipping_planes_vertex, + color_fragment: color_fragment, + color_pars_fragment: color_pars_fragment, + color_pars_vertex: color_pars_vertex, + color_vertex: color_vertex, + common: common, + cube_uv_reflection_fragment: cube_uv_reflection_fragment, + defaultnormal_vertex: defaultnormal_vertex, + displacementmap_pars_vertex: displacementmap_pars_vertex, + displacementmap_vertex: displacementmap_vertex, + emissivemap_fragment: emissivemap_fragment, + emissivemap_pars_fragment: emissivemap_pars_fragment, + encodings_fragment: encodings_fragment, + encodings_pars_fragment: encodings_pars_fragment, + envmap_fragment: envmap_fragment, + envmap_pars_fragment: envmap_pars_fragment, + envmap_pars_vertex: envmap_pars_vertex, + envmap_vertex: envmap_vertex, + fog_vertex: fog_vertex, + fog_pars_vertex: fog_pars_vertex, + fog_fragment: fog_fragment, + fog_pars_fragment: fog_pars_fragment, + gradientmap_pars_fragment: gradientmap_pars_fragment, + lightmap_fragment: lightmap_fragment, + lightmap_pars_fragment: lightmap_pars_fragment, + lights_lambert_vertex: lights_lambert_vertex, + lights_pars: lights_pars, + lights_phong_fragment: lights_phong_fragment, + lights_phong_pars_fragment: lights_phong_pars_fragment, + lights_physical_fragment: lights_physical_fragment, + lights_physical_pars_fragment: lights_physical_pars_fragment, + lights_template: lights_template, + logdepthbuf_fragment: logdepthbuf_fragment, + logdepthbuf_pars_fragment: logdepthbuf_pars_fragment, + logdepthbuf_pars_vertex: logdepthbuf_pars_vertex, + logdepthbuf_vertex: logdepthbuf_vertex, + map_fragment: map_fragment, + map_pars_fragment: map_pars_fragment, + map_particle_fragment: map_particle_fragment, + map_particle_pars_fragment: map_particle_pars_fragment, + metalnessmap_fragment: metalnessmap_fragment, + metalnessmap_pars_fragment: metalnessmap_pars_fragment, + morphnormal_vertex: morphnormal_vertex, + morphtarget_pars_vertex: morphtarget_pars_vertex, + morphtarget_vertex: morphtarget_vertex, + normal_flip: normal_flip, + normal_fragment: normal_fragment, + normalmap_pars_fragment: normalmap_pars_fragment, + packing: packing, + premultiplied_alpha_fragment: premultiplied_alpha_fragment, + project_vertex: project_vertex, + dithering_fragment: dithering_fragment, + dithering_pars_fragment: dithering_pars_fragment, + roughnessmap_fragment: roughnessmap_fragment, + roughnessmap_pars_fragment: roughnessmap_pars_fragment, + shadowmap_pars_fragment: shadowmap_pars_fragment, + shadowmap_pars_vertex: shadowmap_pars_vertex, + shadowmap_vertex: shadowmap_vertex, + shadowmask_pars_fragment: shadowmask_pars_fragment, + skinbase_vertex: skinbase_vertex, + skinning_pars_vertex: skinning_pars_vertex, + skinning_vertex: skinning_vertex, + skinnormal_vertex: skinnormal_vertex, + specularmap_fragment: specularmap_fragment, + specularmap_pars_fragment: specularmap_pars_fragment, + tonemapping_fragment: tonemapping_fragment, + tonemapping_pars_fragment: tonemapping_pars_fragment, + uv_pars_fragment: uv_pars_fragment, + uv_pars_vertex: uv_pars_vertex, + uv_vertex: uv_vertex, + uv2_pars_fragment: uv2_pars_fragment, + uv2_pars_vertex: uv2_pars_vertex, + uv2_vertex: uv2_vertex, + worldpos_vertex: worldpos_vertex, + + cube_frag: cube_frag, + cube_vert: cube_vert, + depth_frag: depth_frag, + depth_vert: depth_vert, + distanceRGBA_frag: distanceRGBA_frag, + distanceRGBA_vert: distanceRGBA_vert, + equirect_frag: equirect_frag, + equirect_vert: equirect_vert, + linedashed_frag: linedashed_frag, + linedashed_vert: linedashed_vert, + meshbasic_frag: meshbasic_frag, + meshbasic_vert: meshbasic_vert, + meshlambert_frag: meshlambert_frag, + meshlambert_vert: meshlambert_vert, + meshphong_frag: meshphong_frag, + meshphong_vert: meshphong_vert, + meshphysical_frag: meshphysical_frag, + meshphysical_vert: meshphysical_vert, + normal_frag: normal_frag, + normal_vert: normal_vert, + points_frag: points_frag, + points_vert: points_vert, + shadow_frag: shadow_frag, + shadow_vert: shadow_vert + }; + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + * @author mikael emtinger / http://gomo.se/ + */ + + var ShaderLib = { + + basic: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.fog + ] ), + + vertexShader: ShaderChunk.meshbasic_vert, + fragmentShader: ShaderChunk.meshbasic_frag + + }, + + lambert: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.fog, + UniformsLib.lights, + { + emissive: { value: new Color( 0x000000 ) } + } + ] ), + + vertexShader: ShaderChunk.meshlambert_vert, + fragmentShader: ShaderChunk.meshlambert_frag + + }, + + phong: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + UniformsLib.gradientmap, + UniformsLib.fog, + UniformsLib.lights, + { + emissive: { value: new Color( 0x000000 ) }, + specular: { value: new Color( 0x111111 ) }, + shininess: { value: 30 } + } + ] ), + + vertexShader: ShaderChunk.meshphong_vert, + fragmentShader: ShaderChunk.meshphong_frag + + }, + + standard: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + UniformsLib.roughnessmap, + UniformsLib.metalnessmap, + UniformsLib.fog, + UniformsLib.lights, + { + emissive: { value: new Color( 0x000000 ) }, + roughness: { value: 0.5 }, + metalness: { value: 0.5 }, + envMapIntensity: { value: 1 } // temporary + } + ] ), + + vertexShader: ShaderChunk.meshphysical_vert, + fragmentShader: ShaderChunk.meshphysical_frag + + }, + + points: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.points, + UniformsLib.fog + ] ), + + vertexShader: ShaderChunk.points_vert, + fragmentShader: ShaderChunk.points_frag + + }, + + dashed: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.fog, + { + scale: { value: 1 }, + dashSize: { value: 1 }, + totalSize: { value: 2 } + } + ] ), + + vertexShader: ShaderChunk.linedashed_vert, + fragmentShader: ShaderChunk.linedashed_frag + + }, + + depth: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.displacementmap + ] ), + + vertexShader: ShaderChunk.depth_vert, + fragmentShader: ShaderChunk.depth_frag + + }, + + normal: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + { + opacity: { value: 1.0 } + } + ] ), + + vertexShader: ShaderChunk.normal_vert, + fragmentShader: ShaderChunk.normal_frag + + }, + + /* ------------------------------------------------------------------------- + // Cube map shader + ------------------------------------------------------------------------- */ + + cube: { + + uniforms: { + tCube: { value: null }, + tFlip: { value: - 1 }, + opacity: { value: 1.0 } + }, + + vertexShader: ShaderChunk.cube_vert, + fragmentShader: ShaderChunk.cube_frag + + }, + + /* ------------------------------------------------------------------------- + // Cube map shader + ------------------------------------------------------------------------- */ + + equirect: { + + uniforms: { + tEquirect: { value: null }, + tFlip: { value: - 1 } + }, + + vertexShader: ShaderChunk.equirect_vert, + fragmentShader: ShaderChunk.equirect_frag + + }, + + distanceRGBA: { + + uniforms: { + lightPos: { value: new Vector3() } + }, + + vertexShader: ShaderChunk.distanceRGBA_vert, + fragmentShader: ShaderChunk.distanceRGBA_frag + + } + + }; + + ShaderLib.physical = { + + uniforms: UniformsUtils.merge( [ + ShaderLib.standard.uniforms, + { + clearCoat: { value: 0 }, + clearCoatRoughness: { value: 0 } + } + ] ), + + vertexShader: ShaderChunk.meshphysical_vert, + fragmentShader: ShaderChunk.meshphysical_frag + + }; + + /** + * @author bhouston / http://clara.io + */ + + function Box2( min, max ) { + + this.min = ( min !== undefined ) ? min : new Vector2( + Infinity, + Infinity ); + this.max = ( max !== undefined ) ? max : new Vector2( - Infinity, - Infinity ); + + } + + Object.assign( Box2.prototype, { + + set: function ( min, max ) { + + this.min.copy( min ); + this.max.copy( max ); + + return this; + + }, + + setFromPoints: function ( points ) { + + this.makeEmpty(); + + for ( var i = 0, il = points.length; i < il; i ++ ) { + + this.expandByPoint( points[ i ] ); + + } + + return this; + + }, + + setFromCenterAndSize: function () { + + var v1 = new Vector2(); + + return function setFromCenterAndSize( center, size ) { + + var halfSize = v1.copy( size ).multiplyScalar( 0.5 ); + this.min.copy( center ).sub( halfSize ); + this.max.copy( center ).add( halfSize ); + + return this; + + }; + + }(), + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( box ) { + + this.min.copy( box.min ); + this.max.copy( box.max ); + + return this; + + }, + + makeEmpty: function () { + + this.min.x = this.min.y = + Infinity; + this.max.x = this.max.y = - Infinity; + + return this; + + }, + + isEmpty: function () { + + // this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes + + return ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ); + + }, + + getCenter: function ( optionalTarget ) { + + var result = optionalTarget || new Vector2(); + return this.isEmpty() ? result.set( 0, 0 ) : result.addVectors( this.min, this.max ).multiplyScalar( 0.5 ); + + }, + + getSize: function ( optionalTarget ) { + + var result = optionalTarget || new Vector2(); + return this.isEmpty() ? result.set( 0, 0 ) : result.subVectors( this.max, this.min ); + + }, + + expandByPoint: function ( point ) { + + this.min.min( point ); + this.max.max( point ); + + return this; + + }, + + expandByVector: function ( vector ) { + + this.min.sub( vector ); + this.max.add( vector ); + + return this; + + }, + + expandByScalar: function ( scalar ) { + + this.min.addScalar( - scalar ); + this.max.addScalar( scalar ); + + return this; + + }, + + containsPoint: function ( point ) { + + return point.x < this.min.x || point.x > this.max.x || + point.y < this.min.y || point.y > this.max.y ? false : true; + + }, + + containsBox: function ( box ) { + + return this.min.x <= box.min.x && box.max.x <= this.max.x && + this.min.y <= box.min.y && box.max.y <= this.max.y; + + }, + + getParameter: function ( point, optionalTarget ) { + + // This can potentially have a divide by zero if the box + // has a size dimension of 0. + + var result = optionalTarget || new Vector2(); + + return result.set( + ( point.x - this.min.x ) / ( this.max.x - this.min.x ), + ( point.y - this.min.y ) / ( this.max.y - this.min.y ) + ); + + }, + + intersectsBox: function ( box ) { + + // using 4 splitting planes to rule out intersections + + return box.max.x < this.min.x || box.min.x > this.max.x || + box.max.y < this.min.y || box.min.y > this.max.y ? false : true; + + }, + + clampPoint: function ( point, optionalTarget ) { + + var result = optionalTarget || new Vector2(); + return result.copy( point ).clamp( this.min, this.max ); + + }, + + distanceToPoint: function () { + + var v1 = new Vector2(); + + return function distanceToPoint( point ) { + + var clampedPoint = v1.copy( point ).clamp( this.min, this.max ); + return clampedPoint.sub( point ).length(); + + }; + + }(), + + intersect: function ( box ) { + + this.min.max( box.min ); + this.max.min( box.max ); + + return this; + + }, + + union: function ( box ) { + + this.min.min( box.min ); + this.max.max( box.max ); + + return this; + + }, + + translate: function ( offset ) { + + this.min.add( offset ); + this.max.add( offset ); + + return this; + + }, + + equals: function ( box ) { + + return box.min.equals( this.min ) && box.max.equals( this.max ); + + } + + } ); + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + */ + + function LensFlarePlugin( renderer, flares ) { + + var gl = renderer.context; + var state = renderer.state; + + var vertexBuffer, elementBuffer; + var shader, program, attributes, uniforms; + + var tempTexture, occlusionTexture; + + function init() { + + var vertices = new Float32Array( [ + - 1, - 1, 0, 0, + 1, - 1, 1, 0, + 1, 1, 1, 1, + - 1, 1, 0, 1 + ] ); + + var faces = new Uint16Array( [ + 0, 1, 2, + 0, 2, 3 + ] ); + + // buffers + + vertexBuffer = gl.createBuffer(); + elementBuffer = gl.createBuffer(); + + gl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer ); + gl.bufferData( gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW ); + + gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer ); + gl.bufferData( gl.ELEMENT_ARRAY_BUFFER, faces, gl.STATIC_DRAW ); + + // textures + + tempTexture = gl.createTexture(); + occlusionTexture = gl.createTexture(); + + state.bindTexture( gl.TEXTURE_2D, tempTexture ); + gl.texImage2D( gl.TEXTURE_2D, 0, gl.RGB, 16, 16, 0, gl.RGB, gl.UNSIGNED_BYTE, null ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST ); + + state.bindTexture( gl.TEXTURE_2D, occlusionTexture ); + gl.texImage2D( gl.TEXTURE_2D, 0, gl.RGBA, 16, 16, 0, gl.RGBA, gl.UNSIGNED_BYTE, null ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST ); + + shader = { + + vertexShader: [ + + "uniform lowp int renderType;", + + "uniform vec3 screenPosition;", + "uniform vec2 scale;", + "uniform float rotation;", + + "uniform sampler2D occlusionMap;", + + "attribute vec2 position;", + "attribute vec2 uv;", + + "varying vec2 vUV;", + "varying float vVisibility;", + + "void main() {", + + "vUV = uv;", + + "vec2 pos = position;", + + "if ( renderType == 2 ) {", + + "vec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.5, 0.1 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.9, 0.1 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.9, 0.9 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.1, 0.9 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.5, 0.5 ) );", + + "vVisibility = visibility.r / 9.0;", + "vVisibility *= 1.0 - visibility.g / 9.0;", + "vVisibility *= visibility.b / 9.0;", + "vVisibility *= 1.0 - visibility.a / 9.0;", + + "pos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;", + "pos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;", + + "}", + + "gl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );", + + "}" + + ].join( "\n" ), + + fragmentShader: [ + + "uniform lowp int renderType;", + + "uniform sampler2D map;", + "uniform float opacity;", + "uniform vec3 color;", + + "varying vec2 vUV;", + "varying float vVisibility;", + + "void main() {", + + // pink square + + "if ( renderType == 0 ) {", + + "gl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );", + + // restore + + "} else if ( renderType == 1 ) {", + + "gl_FragColor = texture2D( map, vUV );", + + // flare + + "} else {", + + "vec4 texture = texture2D( map, vUV );", + "texture.a *= opacity * vVisibility;", + "gl_FragColor = texture;", + "gl_FragColor.rgb *= color;", + + "}", + + "}" + + ].join( "\n" ) + + }; + + program = createProgram( shader ); + + attributes = { + vertex: gl.getAttribLocation ( program, "position" ), + uv: gl.getAttribLocation ( program, "uv" ) + }; + + uniforms = { + renderType: gl.getUniformLocation( program, "renderType" ), + map: gl.getUniformLocation( program, "map" ), + occlusionMap: gl.getUniformLocation( program, "occlusionMap" ), + opacity: gl.getUniformLocation( program, "opacity" ), + color: gl.getUniformLocation( program, "color" ), + scale: gl.getUniformLocation( program, "scale" ), + rotation: gl.getUniformLocation( program, "rotation" ), + screenPosition: gl.getUniformLocation( program, "screenPosition" ) + }; + + } + + /* + * Render lens flares + * Method: renders 16x16 0xff00ff-colored points scattered over the light source area, + * reads these back and calculates occlusion. + */ + + this.render = function ( scene, camera, viewport ) { + + if ( flares.length === 0 ) return; + + var tempPosition = new Vector3(); + + var invAspect = viewport.w / viewport.z, + halfViewportWidth = viewport.z * 0.5, + halfViewportHeight = viewport.w * 0.5; + + var size = 16 / viewport.w, + scale = new Vector2( size * invAspect, size ); + + var screenPosition = new Vector3( 1, 1, 0 ), + screenPositionPixels = new Vector2( 1, 1 ); + + var validArea = new Box2(); + + validArea.min.set( viewport.x, viewport.y ); + validArea.max.set( viewport.x + ( viewport.z - 16 ), viewport.y + ( viewport.w - 16 ) ); + + if ( program === undefined ) { + + init(); + + } + + gl.useProgram( program ); + + state.initAttributes(); + state.enableAttribute( attributes.vertex ); + state.enableAttribute( attributes.uv ); + state.disableUnusedAttributes(); + + // loop through all lens flares to update their occlusion and positions + // setup gl and common used attribs/uniforms + + gl.uniform1i( uniforms.occlusionMap, 0 ); + gl.uniform1i( uniforms.map, 1 ); + + gl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer ); + gl.vertexAttribPointer( attributes.vertex, 2, gl.FLOAT, false, 2 * 8, 0 ); + gl.vertexAttribPointer( attributes.uv, 2, gl.FLOAT, false, 2 * 8, 8 ); + + gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer ); + + state.disable( gl.CULL_FACE ); + state.buffers.depth.setMask( false ); + + for ( var i = 0, l = flares.length; i < l; i ++ ) { + + size = 16 / viewport.w; + scale.set( size * invAspect, size ); + + // calc object screen position + + var flare = flares[ i ]; + + tempPosition.set( flare.matrixWorld.elements[ 12 ], flare.matrixWorld.elements[ 13 ], flare.matrixWorld.elements[ 14 ] ); + + tempPosition.applyMatrix4( camera.matrixWorldInverse ); + tempPosition.applyMatrix4( camera.projectionMatrix ); + + // setup arrays for gl programs + + screenPosition.copy( tempPosition ); + + // horizontal and vertical coordinate of the lower left corner of the pixels to copy + + screenPositionPixels.x = viewport.x + ( screenPosition.x * halfViewportWidth ) + halfViewportWidth - 8; + screenPositionPixels.y = viewport.y + ( screenPosition.y * halfViewportHeight ) + halfViewportHeight - 8; + + // screen cull + + if ( validArea.containsPoint( screenPositionPixels ) === true ) { + + // save current RGB to temp texture + + state.activeTexture( gl.TEXTURE0 ); + state.bindTexture( gl.TEXTURE_2D, null ); + state.activeTexture( gl.TEXTURE1 ); + state.bindTexture( gl.TEXTURE_2D, tempTexture ); + gl.copyTexImage2D( gl.TEXTURE_2D, 0, gl.RGB, screenPositionPixels.x, screenPositionPixels.y, 16, 16, 0 ); + + + // render pink quad + + gl.uniform1i( uniforms.renderType, 0 ); + gl.uniform2f( uniforms.scale, scale.x, scale.y ); + gl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z ); + + state.disable( gl.BLEND ); + state.enable( gl.DEPTH_TEST ); + + gl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 ); + + + // copy result to occlusionMap + + state.activeTexture( gl.TEXTURE0 ); + state.bindTexture( gl.TEXTURE_2D, occlusionTexture ); + gl.copyTexImage2D( gl.TEXTURE_2D, 0, gl.RGBA, screenPositionPixels.x, screenPositionPixels.y, 16, 16, 0 ); + + + // restore graphics + + gl.uniform1i( uniforms.renderType, 1 ); + state.disable( gl.DEPTH_TEST ); + + state.activeTexture( gl.TEXTURE1 ); + state.bindTexture( gl.TEXTURE_2D, tempTexture ); + gl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 ); + + + // update object positions + + flare.positionScreen.copy( screenPosition ); + + if ( flare.customUpdateCallback ) { + + flare.customUpdateCallback( flare ); + + } else { + + flare.updateLensFlares(); + + } + + // render flares + + gl.uniform1i( uniforms.renderType, 2 ); + state.enable( gl.BLEND ); + + for ( var j = 0, jl = flare.lensFlares.length; j < jl; j ++ ) { + + var sprite = flare.lensFlares[ j ]; + + if ( sprite.opacity > 0.001 && sprite.scale > 0.001 ) { + + screenPosition.x = sprite.x; + screenPosition.y = sprite.y; + screenPosition.z = sprite.z; + + size = sprite.size * sprite.scale / viewport.w; + + scale.x = size * invAspect; + scale.y = size; + + gl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z ); + gl.uniform2f( uniforms.scale, scale.x, scale.y ); + gl.uniform1f( uniforms.rotation, sprite.rotation ); + + gl.uniform1f( uniforms.opacity, sprite.opacity ); + gl.uniform3f( uniforms.color, sprite.color.r, sprite.color.g, sprite.color.b ); + + state.setBlending( sprite.blending, sprite.blendEquation, sprite.blendSrc, sprite.blendDst ); + renderer.setTexture2D( sprite.texture, 1 ); + + gl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 ); + + } + + } + + } + + } + + // restore gl + + state.enable( gl.CULL_FACE ); + state.enable( gl.DEPTH_TEST ); + state.buffers.depth.setMask( true ); + + renderer.resetGLState(); + + }; + + function createProgram( shader ) { + + var program = gl.createProgram(); + + var fragmentShader = gl.createShader( gl.FRAGMENT_SHADER ); + var vertexShader = gl.createShader( gl.VERTEX_SHADER ); + + var prefix = "precision " + renderer.getPrecision() + " float;\n"; + + gl.shaderSource( fragmentShader, prefix + shader.fragmentShader ); + gl.shaderSource( vertexShader, prefix + shader.vertexShader ); + + gl.compileShader( fragmentShader ); + gl.compileShader( vertexShader ); + + gl.attachShader( program, fragmentShader ); + gl.attachShader( program, vertexShader ); + + gl.linkProgram( program ); + + return program; + + } + + } + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + */ + + function SpritePlugin( renderer, sprites ) { + + var gl = renderer.context; + var state = renderer.state; + + var vertexBuffer, elementBuffer; + var program, attributes, uniforms; + + var texture; + + // decompose matrixWorld + + var spritePosition = new Vector3(); + var spriteRotation = new Quaternion(); + var spriteScale = new Vector3(); + + function init() { + + var vertices = new Float32Array( [ + - 0.5, - 0.5, 0, 0, + 0.5, - 0.5, 1, 0, + 0.5, 0.5, 1, 1, + - 0.5, 0.5, 0, 1 + ] ); + + var faces = new Uint16Array( [ + 0, 1, 2, + 0, 2, 3 + ] ); + + vertexBuffer = gl.createBuffer(); + elementBuffer = gl.createBuffer(); + + gl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer ); + gl.bufferData( gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW ); + + gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer ); + gl.bufferData( gl.ELEMENT_ARRAY_BUFFER, faces, gl.STATIC_DRAW ); + + program = createProgram(); + + attributes = { + position: gl.getAttribLocation ( program, 'position' ), + uv: gl.getAttribLocation ( program, 'uv' ) + }; + + uniforms = { + uvOffset: gl.getUniformLocation( program, 'uvOffset' ), + uvScale: gl.getUniformLocation( program, 'uvScale' ), + + rotation: gl.getUniformLocation( program, 'rotation' ), + scale: gl.getUniformLocation( program, 'scale' ), + + color: gl.getUniformLocation( program, 'color' ), + map: gl.getUniformLocation( program, 'map' ), + opacity: gl.getUniformLocation( program, 'opacity' ), + + modelViewMatrix: gl.getUniformLocation( program, 'modelViewMatrix' ), + projectionMatrix: gl.getUniformLocation( program, 'projectionMatrix' ), + + fogType: gl.getUniformLocation( program, 'fogType' ), + fogDensity: gl.getUniformLocation( program, 'fogDensity' ), + fogNear: gl.getUniformLocation( program, 'fogNear' ), + fogFar: gl.getUniformLocation( program, 'fogFar' ), + fogColor: gl.getUniformLocation( program, 'fogColor' ), + + alphaTest: gl.getUniformLocation( program, 'alphaTest' ) + }; + + var canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); + canvas.width = 8; + canvas.height = 8; + + var context = canvas.getContext( '2d' ); + context.fillStyle = 'white'; + context.fillRect( 0, 0, 8, 8 ); + + texture = new Texture( canvas ); + texture.needsUpdate = true; + + } + + this.render = function ( scene, camera ) { + + if ( sprites.length === 0 ) return; + + // setup gl + + if ( program === undefined ) { + + init(); + + } + + gl.useProgram( program ); + + state.initAttributes(); + state.enableAttribute( attributes.position ); + state.enableAttribute( attributes.uv ); + state.disableUnusedAttributes(); + + state.disable( gl.CULL_FACE ); + state.enable( gl.BLEND ); + + gl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer ); + gl.vertexAttribPointer( attributes.position, 2, gl.FLOAT, false, 2 * 8, 0 ); + gl.vertexAttribPointer( attributes.uv, 2, gl.FLOAT, false, 2 * 8, 8 ); + + gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer ); + + gl.uniformMatrix4fv( uniforms.projectionMatrix, false, camera.projectionMatrix.elements ); + + state.activeTexture( gl.TEXTURE0 ); + gl.uniform1i( uniforms.map, 0 ); + + var oldFogType = 0; + var sceneFogType = 0; + var fog = scene.fog; + + if ( fog ) { + + gl.uniform3f( uniforms.fogColor, fog.color.r, fog.color.g, fog.color.b ); + + if ( fog.isFog ) { + + gl.uniform1f( uniforms.fogNear, fog.near ); + gl.uniform1f( uniforms.fogFar, fog.far ); + + gl.uniform1i( uniforms.fogType, 1 ); + oldFogType = 1; + sceneFogType = 1; + + } else if ( fog.isFogExp2 ) { + + gl.uniform1f( uniforms.fogDensity, fog.density ); + + gl.uniform1i( uniforms.fogType, 2 ); + oldFogType = 2; + sceneFogType = 2; + + } + + } else { + + gl.uniform1i( uniforms.fogType, 0 ); + oldFogType = 0; + sceneFogType = 0; + + } + + + // update positions and sort + + for ( var i = 0, l = sprites.length; i < l; i ++ ) { + + var sprite = sprites[ i ]; + + sprite.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, sprite.matrixWorld ); + sprite.z = - sprite.modelViewMatrix.elements[ 14 ]; + + } + + sprites.sort( painterSortStable ); + + // render all sprites + + var scale = []; + + for ( var i = 0, l = sprites.length; i < l; i ++ ) { + + var sprite = sprites[ i ]; + var material = sprite.material; + + if ( material.visible === false ) continue; + + gl.uniform1f( uniforms.alphaTest, material.alphaTest ); + gl.uniformMatrix4fv( uniforms.modelViewMatrix, false, sprite.modelViewMatrix.elements ); + + sprite.matrixWorld.decompose( spritePosition, spriteRotation, spriteScale ); + + scale[ 0 ] = spriteScale.x; + scale[ 1 ] = spriteScale.y; + + var fogType = 0; + + if ( scene.fog && material.fog ) { + + fogType = sceneFogType; + + } + + if ( oldFogType !== fogType ) { + + gl.uniform1i( uniforms.fogType, fogType ); + oldFogType = fogType; + + } + + if ( material.map !== null ) { + + gl.uniform2f( uniforms.uvOffset, material.map.offset.x, material.map.offset.y ); + gl.uniform2f( uniforms.uvScale, material.map.repeat.x, material.map.repeat.y ); + + } else { + + gl.uniform2f( uniforms.uvOffset, 0, 0 ); + gl.uniform2f( uniforms.uvScale, 1, 1 ); + + } + + gl.uniform1f( uniforms.opacity, material.opacity ); + gl.uniform3f( uniforms.color, material.color.r, material.color.g, material.color.b ); + + gl.uniform1f( uniforms.rotation, material.rotation ); + gl.uniform2fv( uniforms.scale, scale ); + + state.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst ); + state.buffers.depth.setTest( material.depthTest ); + state.buffers.depth.setMask( material.depthWrite ); + + if ( material.map ) { + + renderer.setTexture2D( material.map, 0 ); + + } else { + + renderer.setTexture2D( texture, 0 ); + + } + + gl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 ); + + } + + // restore gl + + state.enable( gl.CULL_FACE ); + + renderer.resetGLState(); + + }; + + function createProgram() { + + var program = gl.createProgram(); + + var vertexShader = gl.createShader( gl.VERTEX_SHADER ); + var fragmentShader = gl.createShader( gl.FRAGMENT_SHADER ); + + gl.shaderSource( vertexShader, [ + + 'precision ' + renderer.getPrecision() + ' float;', + + 'uniform mat4 modelViewMatrix;', + 'uniform mat4 projectionMatrix;', + 'uniform float rotation;', + 'uniform vec2 scale;', + 'uniform vec2 uvOffset;', + 'uniform vec2 uvScale;', + + 'attribute vec2 position;', + 'attribute vec2 uv;', + + 'varying vec2 vUV;', + + 'void main() {', + + 'vUV = uvOffset + uv * uvScale;', + + 'vec2 alignedPosition = position * scale;', + + 'vec2 rotatedPosition;', + 'rotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;', + 'rotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;', + + 'vec4 finalPosition;', + + 'finalPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );', + 'finalPosition.xy += rotatedPosition;', + 'finalPosition = projectionMatrix * finalPosition;', + + 'gl_Position = finalPosition;', + + '}' + + ].join( '\n' ) ); + + gl.shaderSource( fragmentShader, [ + + 'precision ' + renderer.getPrecision() + ' float;', + + 'uniform vec3 color;', + 'uniform sampler2D map;', + 'uniform float opacity;', + + 'uniform int fogType;', + 'uniform vec3 fogColor;', + 'uniform float fogDensity;', + 'uniform float fogNear;', + 'uniform float fogFar;', + 'uniform float alphaTest;', + + 'varying vec2 vUV;', + + 'void main() {', + + 'vec4 texture = texture2D( map, vUV );', + + 'if ( texture.a < alphaTest ) discard;', + + 'gl_FragColor = vec4( color * texture.xyz, texture.a * opacity );', + + 'if ( fogType > 0 ) {', + + 'float depth = gl_FragCoord.z / gl_FragCoord.w;', + 'float fogFactor = 0.0;', + + 'if ( fogType == 1 ) {', + + 'fogFactor = smoothstep( fogNear, fogFar, depth );', + + '} else {', + + 'const float LOG2 = 1.442695;', + 'fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );', + 'fogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );', + + '}', + + 'gl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );', + + '}', + + '}' + + ].join( '\n' ) ); + + gl.compileShader( vertexShader ); + gl.compileShader( fragmentShader ); + + gl.attachShader( program, vertexShader ); + gl.attachShader( program, fragmentShader ); + + gl.linkProgram( program ); + + return program; + + } + + function painterSortStable( a, b ) { + + if ( a.renderOrder !== b.renderOrder ) { + + return a.renderOrder - b.renderOrder; + + } else if ( a.z !== b.z ) { + + return b.z - a.z; + + } else { + + return b.id - a.id; + + } + + } + + } + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + var materialId = 0; + + function Material() { + + Object.defineProperty( this, 'id', { value: materialId ++ } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + this.type = 'Material'; + + this.fog = true; + this.lights = true; + + this.blending = NormalBlending; + this.side = FrontSide; + this.shading = SmoothShading; // THREE.FlatShading, THREE.SmoothShading + this.vertexColors = NoColors; // THREE.NoColors, THREE.VertexColors, THREE.FaceColors + + this.opacity = 1; + this.transparent = false; + + this.blendSrc = SrcAlphaFactor; + this.blendDst = OneMinusSrcAlphaFactor; + this.blendEquation = AddEquation; + this.blendSrcAlpha = null; + this.blendDstAlpha = null; + this.blendEquationAlpha = null; + + this.depthFunc = LessEqualDepth; + this.depthTest = true; + this.depthWrite = true; + + this.clippingPlanes = null; + this.clipIntersection = false; + this.clipShadows = false; + + this.colorWrite = true; + + this.precision = null; // override the renderer's default precision for this material + + this.polygonOffset = false; + this.polygonOffsetFactor = 0; + this.polygonOffsetUnits = 0; + + this.dithering = false; + + this.alphaTest = 0; + this.premultipliedAlpha = false; + + this.overdraw = 0; // Overdrawn pixels (typically between 0 and 1) for fixing antialiasing gaps in CanvasRenderer + + this.visible = true; + + this.needsUpdate = true; + + } + + Object.assign( Material.prototype, EventDispatcher.prototype, { + + isMaterial: true, + + setValues: function ( values ) { + + if ( values === undefined ) return; + + for ( var key in values ) { + + var newValue = values[ key ]; + + if ( newValue === undefined ) { + + console.warn( "THREE.Material: '" + key + "' parameter is undefined." ); + continue; + + } + + var currentValue = this[ key ]; + + if ( currentValue === undefined ) { + + console.warn( "THREE." + this.type + ": '" + key + "' is not a property of this material." ); + continue; + + } + + if ( currentValue && currentValue.isColor ) { + + currentValue.set( newValue ); + + } else if ( ( currentValue && currentValue.isVector3 ) && ( newValue && newValue.isVector3 ) ) { + + currentValue.copy( newValue ); + + } else if ( key === 'overdraw' ) { + + // ensure overdraw is backwards-compatible with legacy boolean type + this[ key ] = Number( newValue ); + + } else { + + this[ key ] = newValue; + + } + + } + + }, + + toJSON: function ( meta ) { + + var isRoot = meta === undefined; + + if ( isRoot ) { + + meta = { + textures: {}, + images: {} + }; + + } + + var data = { + metadata: { + version: 4.5, + type: 'Material', + generator: 'Material.toJSON' + } + }; + + // standard Material serialization + data.uuid = this.uuid; + data.type = this.type; + + if ( this.name !== '' ) data.name = this.name; + + if ( this.color && this.color.isColor ) data.color = this.color.getHex(); + + if ( this.roughness !== undefined ) data.roughness = this.roughness; + if ( this.metalness !== undefined ) data.metalness = this.metalness; + + if ( this.emissive && this.emissive.isColor ) data.emissive = this.emissive.getHex(); + if ( this.specular && this.specular.isColor ) data.specular = this.specular.getHex(); + if ( this.shininess !== undefined ) data.shininess = this.shininess; + if ( this.clearCoat !== undefined ) data.clearCoat = this.clearCoat; + if ( this.clearCoatRoughness !== undefined ) data.clearCoatRoughness = this.clearCoatRoughness; + + if ( this.map && this.map.isTexture ) data.map = this.map.toJSON( meta ).uuid; + if ( this.alphaMap && this.alphaMap.isTexture ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid; + if ( this.lightMap && this.lightMap.isTexture ) data.lightMap = this.lightMap.toJSON( meta ).uuid; + if ( this.bumpMap && this.bumpMap.isTexture ) { + + data.bumpMap = this.bumpMap.toJSON( meta ).uuid; + data.bumpScale = this.bumpScale; + + } + if ( this.normalMap && this.normalMap.isTexture ) { + + data.normalMap = this.normalMap.toJSON( meta ).uuid; + data.normalScale = this.normalScale.toArray(); + + } + if ( this.displacementMap && this.displacementMap.isTexture ) { + + data.displacementMap = this.displacementMap.toJSON( meta ).uuid; + data.displacementScale = this.displacementScale; + data.displacementBias = this.displacementBias; + + } + if ( this.roughnessMap && this.roughnessMap.isTexture ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid; + if ( this.metalnessMap && this.metalnessMap.isTexture ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid; + + if ( this.emissiveMap && this.emissiveMap.isTexture ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid; + if ( this.specularMap && this.specularMap.isTexture ) data.specularMap = this.specularMap.toJSON( meta ).uuid; + + if ( this.envMap && this.envMap.isTexture ) { + + data.envMap = this.envMap.toJSON( meta ).uuid; + data.reflectivity = this.reflectivity; // Scale behind envMap + + } + + if ( this.gradientMap && this.gradientMap.isTexture ) { + + data.gradientMap = this.gradientMap.toJSON( meta ).uuid; + + } + + if ( this.size !== undefined ) data.size = this.size; + if ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation; + + if ( this.blending !== NormalBlending ) data.blending = this.blending; + if ( this.shading !== SmoothShading ) data.shading = this.shading; + if ( this.side !== FrontSide ) data.side = this.side; + if ( this.vertexColors !== NoColors ) data.vertexColors = this.vertexColors; + + if ( this.opacity < 1 ) data.opacity = this.opacity; + if ( this.transparent === true ) data.transparent = this.transparent; + + data.depthFunc = this.depthFunc; + data.depthTest = this.depthTest; + data.depthWrite = this.depthWrite; + + if ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest; + if ( this.premultipliedAlpha === true ) data.premultipliedAlpha = this.premultipliedAlpha; + if ( this.wireframe === true ) data.wireframe = this.wireframe; + if ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth; + if ( this.wireframeLinecap !== 'round' ) data.wireframeLinecap = this.wireframeLinecap; + if ( this.wireframeLinejoin !== 'round' ) data.wireframeLinejoin = this.wireframeLinejoin; + + data.skinning = this.skinning; + data.morphTargets = this.morphTargets; + + data.dithering = this.dithering; + + // TODO: Copied from Object3D.toJSON + + function extractFromCache( cache ) { + + var values = []; + + for ( var key in cache ) { + + var data = cache[ key ]; + delete data.metadata; + values.push( data ); + + } + + return values; + + } + + if ( isRoot ) { + + var textures = extractFromCache( meta.textures ); + var images = extractFromCache( meta.images ); + + if ( textures.length > 0 ) data.textures = textures; + if ( images.length > 0 ) data.images = images; + + } + + return data; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.name = source.name; + + this.fog = source.fog; + this.lights = source.lights; + + this.blending = source.blending; + this.side = source.side; + this.shading = source.shading; + this.vertexColors = source.vertexColors; + + this.opacity = source.opacity; + this.transparent = source.transparent; + + this.blendSrc = source.blendSrc; + this.blendDst = source.blendDst; + this.blendEquation = source.blendEquation; + this.blendSrcAlpha = source.blendSrcAlpha; + this.blendDstAlpha = source.blendDstAlpha; + this.blendEquationAlpha = source.blendEquationAlpha; + + this.depthFunc = source.depthFunc; + this.depthTest = source.depthTest; + this.depthWrite = source.depthWrite; + + this.colorWrite = source.colorWrite; + + this.precision = source.precision; + + this.polygonOffset = source.polygonOffset; + this.polygonOffsetFactor = source.polygonOffsetFactor; + this.polygonOffsetUnits = source.polygonOffsetUnits; + + this.dithering = source.dithering; + + this.alphaTest = source.alphaTest; + + this.premultipliedAlpha = source.premultipliedAlpha; + + this.overdraw = source.overdraw; + + this.visible = source.visible; + this.clipShadows = source.clipShadows; + this.clipIntersection = source.clipIntersection; + + var srcPlanes = source.clippingPlanes, + dstPlanes = null; + + if ( srcPlanes !== null ) { + + var n = srcPlanes.length; + dstPlanes = new Array( n ); + + for ( var i = 0; i !== n; ++ i ) + dstPlanes[ i ] = srcPlanes[ i ].clone(); + + } + + this.clippingPlanes = dstPlanes; + + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * defines: { "label" : "value" }, + * uniforms: { "parameter1": { value: 1.0 }, "parameter2": { value2: 2 } }, + * + * fragmentShader: <string>, + * vertexShader: <string>, + * + * wireframe: <boolean>, + * wireframeLinewidth: <float>, + * + * lights: <bool>, + * + * skinning: <bool>, + * morphTargets: <bool>, + * morphNormals: <bool> + * } + */ + + function ShaderMaterial( parameters ) { + + Material.call( this ); + + this.type = 'ShaderMaterial'; + + this.defines = {}; + this.uniforms = {}; + + this.vertexShader = 'void main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}'; + this.fragmentShader = 'void main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}'; + + this.linewidth = 1; + + this.wireframe = false; + this.wireframeLinewidth = 1; + + this.fog = false; // set to use scene fog + this.lights = false; // set to use scene lights + this.clipping = false; // set to use user-defined clipping planes + + this.skinning = false; // set to use skinning attribute streams + this.morphTargets = false; // set to use morph targets + this.morphNormals = false; // set to use morph normals + + this.extensions = { + derivatives: false, // set to use derivatives + fragDepth: false, // set to use fragment depth values + drawBuffers: false, // set to use draw buffers + shaderTextureLOD: false // set to use shader texture LOD + }; + + // When rendered geometry doesn't include these attributes but the material does, + // use these default values in WebGL. This avoids errors when buffer data is missing. + this.defaultAttributeValues = { + 'color': [ 1, 1, 1 ], + 'uv': [ 0, 0 ], + 'uv2': [ 0, 0 ] + }; + + this.index0AttributeName = undefined; + + if ( parameters !== undefined ) { + + if ( parameters.attributes !== undefined ) { + + console.error( 'THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead.' ); + + } + + this.setValues( parameters ); + + } + + } + + ShaderMaterial.prototype = Object.create( Material.prototype ); + ShaderMaterial.prototype.constructor = ShaderMaterial; + + ShaderMaterial.prototype.isShaderMaterial = true; + + ShaderMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.fragmentShader = source.fragmentShader; + this.vertexShader = source.vertexShader; + + this.uniforms = UniformsUtils.clone( source.uniforms ); + + this.defines = source.defines; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + + this.lights = source.lights; + this.clipping = source.clipping; + + this.skinning = source.skinning; + + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + this.extensions = source.extensions; + + return this; + + }; + + ShaderMaterial.prototype.toJSON = function ( meta ) { + + var data = Material.prototype.toJSON.call( this, meta ); + + data.uniforms = this.uniforms; + data.vertexShader = this.vertexShader; + data.fragmentShader = this.fragmentShader; + + return data; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author bhouston / https://clara.io + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * + * opacity: <float>, + * + * map: new THREE.Texture( <Image> ), + * + * alphaMap: new THREE.Texture( <Image> ), + * + * displacementMap: new THREE.Texture( <Image> ), + * displacementScale: <float>, + * displacementBias: <float>, + * + * wireframe: <boolean>, + * wireframeLinewidth: <float> + * } + */ + + function MeshDepthMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshDepthMaterial'; + + this.depthPacking = BasicDepthPacking; + + this.skinning = false; + this.morphTargets = false; + + this.map = null; + + this.alphaMap = null; + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.wireframe = false; + this.wireframeLinewidth = 1; + + this.fog = false; + this.lights = false; + + this.setValues( parameters ); + + } + + MeshDepthMaterial.prototype = Object.create( Material.prototype ); + MeshDepthMaterial.prototype.constructor = MeshDepthMaterial; + + MeshDepthMaterial.prototype.isMeshDepthMaterial = true; + + MeshDepthMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.depthPacking = source.depthPacking; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + + this.map = source.map; + + this.alphaMap = source.alphaMap; + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + + return this; + + }; + + /** + * @author bhouston / http://clara.io + * @author WestLangley / http://github.com/WestLangley + */ + + function Box3( min, max ) { + + this.min = ( min !== undefined ) ? min : new Vector3( + Infinity, + Infinity, + Infinity ); + this.max = ( max !== undefined ) ? max : new Vector3( - Infinity, - Infinity, - Infinity ); + + } + + Object.assign( Box3.prototype, { + + isBox3: true, + + set: function ( min, max ) { + + this.min.copy( min ); + this.max.copy( max ); + + return this; + + }, + + setFromArray: function ( array ) { + + var minX = + Infinity; + var minY = + Infinity; + var minZ = + Infinity; + + var maxX = - Infinity; + var maxY = - Infinity; + var maxZ = - Infinity; + + for ( var i = 0, l = array.length; i < l; i += 3 ) { + + var x = array[ i ]; + var y = array[ i + 1 ]; + var z = array[ i + 2 ]; + + if ( x < minX ) minX = x; + if ( y < minY ) minY = y; + if ( z < minZ ) minZ = z; + + if ( x > maxX ) maxX = x; + if ( y > maxY ) maxY = y; + if ( z > maxZ ) maxZ = z; + + } + + this.min.set( minX, minY, minZ ); + this.max.set( maxX, maxY, maxZ ); + + return this; + + }, + + setFromBufferAttribute: function ( attribute ) { + + var minX = + Infinity; + var minY = + Infinity; + var minZ = + Infinity; + + var maxX = - Infinity; + var maxY = - Infinity; + var maxZ = - Infinity; + + for ( var i = 0, l = attribute.count; i < l; i ++ ) { + + var x = attribute.getX( i ); + var y = attribute.getY( i ); + var z = attribute.getZ( i ); + + if ( x < minX ) minX = x; + if ( y < minY ) minY = y; + if ( z < minZ ) minZ = z; + + if ( x > maxX ) maxX = x; + if ( y > maxY ) maxY = y; + if ( z > maxZ ) maxZ = z; + + } + + this.min.set( minX, minY, minZ ); + this.max.set( maxX, maxY, maxZ ); + + return this; + + }, + + setFromPoints: function ( points ) { + + this.makeEmpty(); + + for ( var i = 0, il = points.length; i < il; i ++ ) { + + this.expandByPoint( points[ i ] ); + + } + + return this; + + }, + + setFromCenterAndSize: function () { + + var v1 = new Vector3(); + + return function setFromCenterAndSize( center, size ) { + + var halfSize = v1.copy( size ).multiplyScalar( 0.5 ); + + this.min.copy( center ).sub( halfSize ); + this.max.copy( center ).add( halfSize ); + + return this; + + }; + + }(), + + setFromObject: function ( object ) { + + this.makeEmpty(); + + return this.expandByObject( object ); + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( box ) { + + this.min.copy( box.min ); + this.max.copy( box.max ); + + return this; + + }, + + makeEmpty: function () { + + this.min.x = this.min.y = this.min.z = + Infinity; + this.max.x = this.max.y = this.max.z = - Infinity; + + return this; + + }, + + isEmpty: function () { + + // this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes + + return ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z ); + + }, + + getCenter: function ( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + return this.isEmpty() ? result.set( 0, 0, 0 ) : result.addVectors( this.min, this.max ).multiplyScalar( 0.5 ); + + }, + + getSize: function ( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + return this.isEmpty() ? result.set( 0, 0, 0 ) : result.subVectors( this.max, this.min ); + + }, + + expandByPoint: function ( point ) { + + this.min.min( point ); + this.max.max( point ); + + return this; + + }, + + expandByVector: function ( vector ) { + + this.min.sub( vector ); + this.max.add( vector ); + + return this; + + }, + + expandByScalar: function ( scalar ) { + + this.min.addScalar( - scalar ); + this.max.addScalar( scalar ); + + return this; + + }, + + expandByObject: function () { + + // Computes the world-axis-aligned bounding box of an object (including its children), + // accounting for both the object's, and children's, world transforms + + var v1 = new Vector3(); + + return function expandByObject( object ) { + + var scope = this; + + object.updateMatrixWorld( true ); + + object.traverse( function ( node ) { + + var i, l; + + var geometry = node.geometry; + + if ( geometry !== undefined ) { + + if ( geometry.isGeometry ) { + + var vertices = geometry.vertices; + + for ( i = 0, l = vertices.length; i < l; i ++ ) { + + v1.copy( vertices[ i ] ); + v1.applyMatrix4( node.matrixWorld ); + + scope.expandByPoint( v1 ); + + } + + } else if ( geometry.isBufferGeometry ) { + + var attribute = geometry.attributes.position; + + if ( attribute !== undefined ) { + + for ( i = 0, l = attribute.count; i < l; i ++ ) { + + v1.fromBufferAttribute( attribute, i ).applyMatrix4( node.matrixWorld ); + + scope.expandByPoint( v1 ); + + } + + } + + } + + } + + } ); + + return this; + + }; + + }(), + + containsPoint: function ( point ) { + + return point.x < this.min.x || point.x > this.max.x || + point.y < this.min.y || point.y > this.max.y || + point.z < this.min.z || point.z > this.max.z ? false : true; + + }, + + containsBox: function ( box ) { + + return this.min.x <= box.min.x && box.max.x <= this.max.x && + this.min.y <= box.min.y && box.max.y <= this.max.y && + this.min.z <= box.min.z && box.max.z <= this.max.z; + + }, + + getParameter: function ( point, optionalTarget ) { + + // This can potentially have a divide by zero if the box + // has a size dimension of 0. + + var result = optionalTarget || new Vector3(); + + return result.set( + ( point.x - this.min.x ) / ( this.max.x - this.min.x ), + ( point.y - this.min.y ) / ( this.max.y - this.min.y ), + ( point.z - this.min.z ) / ( this.max.z - this.min.z ) + ); + + }, + + intersectsBox: function ( box ) { + + // using 6 splitting planes to rule out intersections. + return box.max.x < this.min.x || box.min.x > this.max.x || + box.max.y < this.min.y || box.min.y > this.max.y || + box.max.z < this.min.z || box.min.z > this.max.z ? false : true; + + }, + + intersectsSphere: ( function () { + + var closestPoint = new Vector3(); + + return function intersectsSphere( sphere ) { + + // Find the point on the AABB closest to the sphere center. + this.clampPoint( sphere.center, closestPoint ); + + // If that point is inside the sphere, the AABB and sphere intersect. + return closestPoint.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius ); + + }; + + } )(), + + intersectsPlane: function ( plane ) { + + // We compute the minimum and maximum dot product values. If those values + // are on the same side (back or front) of the plane, then there is no intersection. + + var min, max; + + if ( plane.normal.x > 0 ) { + + min = plane.normal.x * this.min.x; + max = plane.normal.x * this.max.x; + + } else { + + min = plane.normal.x * this.max.x; + max = plane.normal.x * this.min.x; + + } + + if ( plane.normal.y > 0 ) { + + min += plane.normal.y * this.min.y; + max += plane.normal.y * this.max.y; + + } else { + + min += plane.normal.y * this.max.y; + max += plane.normal.y * this.min.y; + + } + + if ( plane.normal.z > 0 ) { + + min += plane.normal.z * this.min.z; + max += plane.normal.z * this.max.z; + + } else { + + min += plane.normal.z * this.max.z; + max += plane.normal.z * this.min.z; + + } + + return ( min <= plane.constant && max >= plane.constant ); + + }, + + clampPoint: function ( point, optionalTarget ) { + + var result = optionalTarget || new Vector3(); + return result.copy( point ).clamp( this.min, this.max ); + + }, + + distanceToPoint: function () { + + var v1 = new Vector3(); + + return function distanceToPoint( point ) { + + var clampedPoint = v1.copy( point ).clamp( this.min, this.max ); + return clampedPoint.sub( point ).length(); + + }; + + }(), + + getBoundingSphere: function () { + + var v1 = new Vector3(); + + return function getBoundingSphere( optionalTarget ) { + + var result = optionalTarget || new Sphere(); + + this.getCenter( result.center ); + + result.radius = this.getSize( v1 ).length() * 0.5; + + return result; + + }; + + }(), + + intersect: function ( box ) { + + this.min.max( box.min ); + this.max.min( box.max ); + + // ensure that if there is no overlap, the result is fully empty, not slightly empty with non-inf/+inf values that will cause subsequence intersects to erroneously return valid values. + if( this.isEmpty() ) this.makeEmpty(); + + return this; + + }, + + union: function ( box ) { + + this.min.min( box.min ); + this.max.max( box.max ); + + return this; + + }, + + applyMatrix4: function () { + + var points = [ + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3() + ]; + + return function applyMatrix4( matrix ) { + + // transform of empty box is an empty box. + if( this.isEmpty() ) return this; + + // NOTE: I am using a binary pattern to specify all 2^3 combinations below + points[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000 + points[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001 + points[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010 + points[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011 + points[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100 + points[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101 + points[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110 + points[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 111 + + this.setFromPoints( points ); + + return this; + + }; + + }(), + + translate: function ( offset ) { + + this.min.add( offset ); + this.max.add( offset ); + + return this; + + }, + + equals: function ( box ) { + + return box.min.equals( this.min ) && box.max.equals( this.max ); + + } + + } ); + + /** + * @author bhouston / http://clara.io + * @author mrdoob / http://mrdoob.com/ + */ + + function Sphere( center, radius ) { + + this.center = ( center !== undefined ) ? center : new Vector3(); + this.radius = ( radius !== undefined ) ? radius : 0; + + } + + Object.assign( Sphere.prototype, { + + set: function ( center, radius ) { + + this.center.copy( center ); + this.radius = radius; + + return this; + + }, + + setFromPoints: function () { + + var box = new Box3(); + + return function setFromPoints( points, optionalCenter ) { + + var center = this.center; + + if ( optionalCenter !== undefined ) { + + center.copy( optionalCenter ); + + } else { + + box.setFromPoints( points ).getCenter( center ); + + } + + var maxRadiusSq = 0; + + for ( var i = 0, il = points.length; i < il; i ++ ) { + + maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) ); + + } + + this.radius = Math.sqrt( maxRadiusSq ); + + return this; + + }; + + }(), + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( sphere ) { + + this.center.copy( sphere.center ); + this.radius = sphere.radius; + + return this; + + }, + + empty: function () { + + return ( this.radius <= 0 ); + + }, + + containsPoint: function ( point ) { + + return ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) ); + + }, + + distanceToPoint: function ( point ) { + + return ( point.distanceTo( this.center ) - this.radius ); + + }, + + intersectsSphere: function ( sphere ) { + + var radiusSum = this.radius + sphere.radius; + + return sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum ); + + }, + + intersectsBox: function ( box ) { + + return box.intersectsSphere( this ); + + }, + + intersectsPlane: function ( plane ) { + + // We use the following equation to compute the signed distance from + // the center of the sphere to the plane. + // + // distance = q * n - d + // + // If this distance is greater than the radius of the sphere, + // then there is no intersection. + + return Math.abs( this.center.dot( plane.normal ) - plane.constant ) <= this.radius; + + }, + + clampPoint: function ( point, optionalTarget ) { + + var deltaLengthSq = this.center.distanceToSquared( point ); + + var result = optionalTarget || new Vector3(); + + result.copy( point ); + + if ( deltaLengthSq > ( this.radius * this.radius ) ) { + + result.sub( this.center ).normalize(); + result.multiplyScalar( this.radius ).add( this.center ); + + } + + return result; + + }, + + getBoundingBox: function ( optionalTarget ) { + + var box = optionalTarget || new Box3(); + + box.set( this.center, this.center ); + box.expandByScalar( this.radius ); + + return box; + + }, + + applyMatrix4: function ( matrix ) { + + this.center.applyMatrix4( matrix ); + this.radius = this.radius * matrix.getMaxScaleOnAxis(); + + return this; + + }, + + translate: function ( offset ) { + + this.center.add( offset ); + + return this; + + }, + + equals: function ( sphere ) { + + return sphere.center.equals( this.center ) && ( sphere.radius === this.radius ); + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author bhouston / http://clara.io + * @author tschw + */ + + function Matrix3() { + + this.elements = [ + + 1, 0, 0, + 0, 1, 0, + 0, 0, 1 + + ]; + + if ( arguments.length > 0 ) { + + console.error( 'THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.' ); + + } + + } + + Object.assign( Matrix3.prototype, { + + isMatrix3: true, + + set: function ( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) { + + var te = this.elements; + + te[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31; + te[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32; + te[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33; + + return this; + + }, + + identity: function () { + + this.set( + + 1, 0, 0, + 0, 1, 0, + 0, 0, 1 + + ); + + return this; + + }, + + clone: function () { + + return new this.constructor().fromArray( this.elements ); + + }, + + copy: function ( m ) { + + var te = this.elements; + var me = m.elements; + + te[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ]; + te[ 3 ] = me[ 3 ]; te[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ]; + te[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ]; te[ 8 ] = me[ 8 ]; + + return this; + + }, + + setFromMatrix4: function ( m ) { + + var me = m.elements; + + this.set( + + me[ 0 ], me[ 4 ], me[ 8 ], + me[ 1 ], me[ 5 ], me[ 9 ], + me[ 2 ], me[ 6 ], me[ 10 ] + + ); + + return this; + + }, + + applyToBufferAttribute: function () { + + var v1 = new Vector3(); + + return function applyToBufferAttribute( attribute ) { + + for ( var i = 0, l = attribute.count; i < l; i ++ ) { + + v1.x = attribute.getX( i ); + v1.y = attribute.getY( i ); + v1.z = attribute.getZ( i ); + + v1.applyMatrix3( this ); + + attribute.setXYZ( i, v1.x, v1.y, v1.z ); + + } + + return attribute; + + }; + + }(), + + multiply: function ( m ) { + + return this.multiplyMatrices( this, m ); + + }, + + premultiply: function ( m ) { + + return this.multiplyMatrices( m, this ); + + }, + + multiplyMatrices: function ( a, b ) { + + var ae = a.elements; + var be = b.elements; + var te = this.elements; + + var a11 = ae[ 0 ], a12 = ae[ 3 ], a13 = ae[ 6 ]; + var a21 = ae[ 1 ], a22 = ae[ 4 ], a23 = ae[ 7 ]; + var a31 = ae[ 2 ], a32 = ae[ 5 ], a33 = ae[ 8 ]; + + var b11 = be[ 0 ], b12 = be[ 3 ], b13 = be[ 6 ]; + var b21 = be[ 1 ], b22 = be[ 4 ], b23 = be[ 7 ]; + var b31 = be[ 2 ], b32 = be[ 5 ], b33 = be[ 8 ]; + + te[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31; + te[ 3 ] = a11 * b12 + a12 * b22 + a13 * b32; + te[ 6 ] = a11 * b13 + a12 * b23 + a13 * b33; + + te[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31; + te[ 4 ] = a21 * b12 + a22 * b22 + a23 * b32; + te[ 7 ] = a21 * b13 + a22 * b23 + a23 * b33; + + te[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31; + te[ 5 ] = a31 * b12 + a32 * b22 + a33 * b32; + te[ 8 ] = a31 * b13 + a32 * b23 + a33 * b33; + + return this; + + }, + + multiplyScalar: function ( s ) { + + var te = this.elements; + + te[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s; + te[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s; + te[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s; + + return this; + + }, + + determinant: function () { + + var te = this.elements; + + var a = te[ 0 ], b = te[ 1 ], c = te[ 2 ], + d = te[ 3 ], e = te[ 4 ], f = te[ 5 ], + g = te[ 6 ], h = te[ 7 ], i = te[ 8 ]; + + return a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g; + + }, + + getInverse: function ( matrix, throwOnDegenerate ) { + + if ( matrix && matrix.isMatrix4 ) { + + console.error( "THREE.Matrix3.getInverse no longer takes a Matrix4 argument." ); + + } + + var me = matrix.elements, + te = this.elements, + + n11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ], + n12 = me[ 3 ], n22 = me[ 4 ], n32 = me[ 5 ], + n13 = me[ 6 ], n23 = me[ 7 ], n33 = me[ 8 ], + + t11 = n33 * n22 - n32 * n23, + t12 = n32 * n13 - n33 * n12, + t13 = n23 * n12 - n22 * n13, + + det = n11 * t11 + n21 * t12 + n31 * t13; + + if ( det === 0 ) { + + var msg = "THREE.Matrix3.getInverse(): can't invert matrix, determinant is 0"; + + if ( throwOnDegenerate === true ) { + + throw new Error( msg ); + + } else { + + console.warn( msg ); + + } + + return this.identity(); + + } + + var detInv = 1 / det; + + te[ 0 ] = t11 * detInv; + te[ 1 ] = ( n31 * n23 - n33 * n21 ) * detInv; + te[ 2 ] = ( n32 * n21 - n31 * n22 ) * detInv; + + te[ 3 ] = t12 * detInv; + te[ 4 ] = ( n33 * n11 - n31 * n13 ) * detInv; + te[ 5 ] = ( n31 * n12 - n32 * n11 ) * detInv; + + te[ 6 ] = t13 * detInv; + te[ 7 ] = ( n21 * n13 - n23 * n11 ) * detInv; + te[ 8 ] = ( n22 * n11 - n21 * n12 ) * detInv; + + return this; + + }, + + transpose: function () { + + var tmp, m = this.elements; + + tmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp; + tmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp; + tmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp; + + return this; + + }, + + getNormalMatrix: function ( matrix4 ) { + + return this.setFromMatrix4( matrix4 ).getInverse( this ).transpose(); + + }, + + transposeIntoArray: function ( r ) { + + var m = this.elements; + + r[ 0 ] = m[ 0 ]; + r[ 1 ] = m[ 3 ]; + r[ 2 ] = m[ 6 ]; + r[ 3 ] = m[ 1 ]; + r[ 4 ] = m[ 4 ]; + r[ 5 ] = m[ 7 ]; + r[ 6 ] = m[ 2 ]; + r[ 7 ] = m[ 5 ]; + r[ 8 ] = m[ 8 ]; + + return this; + + }, + + equals: function ( matrix ) { + + var te = this.elements; + var me = matrix.elements; + + for ( var i = 0; i < 9; i ++ ) { + + if ( te[ i ] !== me[ i ] ) return false; + + } + + return true; + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + for ( var i = 0; i < 9; i ++ ) { + + this.elements[ i ] = array[ i + offset ]; + + } + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + var te = this.elements; + + array[ offset ] = te[ 0 ]; + array[ offset + 1 ] = te[ 1 ]; + array[ offset + 2 ] = te[ 2 ]; + + array[ offset + 3 ] = te[ 3 ]; + array[ offset + 4 ] = te[ 4 ]; + array[ offset + 5 ] = te[ 5 ]; + + array[ offset + 6 ] = te[ 6 ]; + array[ offset + 7 ] = te[ 7 ]; + array[ offset + 8 ] = te[ 8 ]; + + return array; + + } + + } ); + + /** + * @author bhouston / http://clara.io + */ + + function Plane( normal, constant ) { + + this.normal = ( normal !== undefined ) ? normal : new Vector3( 1, 0, 0 ); + this.constant = ( constant !== undefined ) ? constant : 0; + + } + + Object.assign( Plane.prototype, { + + set: function ( normal, constant ) { + + this.normal.copy( normal ); + this.constant = constant; + + return this; + + }, + + setComponents: function ( x, y, z, w ) { + + this.normal.set( x, y, z ); + this.constant = w; + + return this; + + }, + + setFromNormalAndCoplanarPoint: function ( normal, point ) { + + this.normal.copy( normal ); + this.constant = - point.dot( this.normal ); // must be this.normal, not normal, as this.normal is normalized + + return this; + + }, + + setFromCoplanarPoints: function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + + return function setFromCoplanarPoints( a, b, c ) { + + var normal = v1.subVectors( c, b ).cross( v2.subVectors( a, b ) ).normalize(); + + // Q: should an error be thrown if normal is zero (e.g. degenerate plane)? + + this.setFromNormalAndCoplanarPoint( normal, a ); + + return this; + + }; + + }(), + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( plane ) { + + this.normal.copy( plane.normal ); + this.constant = plane.constant; + + return this; + + }, + + normalize: function () { + + // Note: will lead to a divide by zero if the plane is invalid. + + var inverseNormalLength = 1.0 / this.normal.length(); + this.normal.multiplyScalar( inverseNormalLength ); + this.constant *= inverseNormalLength; + + return this; + + }, + + negate: function () { + + this.constant *= - 1; + this.normal.negate(); + + return this; + + }, + + distanceToPoint: function ( point ) { + + return this.normal.dot( point ) + this.constant; + + }, + + distanceToSphere: function ( sphere ) { + + return this.distanceToPoint( sphere.center ) - sphere.radius; + + }, + + projectPoint: function ( point, optionalTarget ) { + + return this.orthoPoint( point, optionalTarget ).sub( point ).negate(); + + }, + + orthoPoint: function ( point, optionalTarget ) { + + var perpendicularMagnitude = this.distanceToPoint( point ); + + var result = optionalTarget || new Vector3(); + return result.copy( this.normal ).multiplyScalar( perpendicularMagnitude ); + + }, + + intersectLine: function () { + + var v1 = new Vector3(); + + return function intersectLine( line, optionalTarget ) { + + var result = optionalTarget || new Vector3(); + + var direction = line.delta( v1 ); + + var denominator = this.normal.dot( direction ); + + if ( denominator === 0 ) { + + // line is coplanar, return origin + if ( this.distanceToPoint( line.start ) === 0 ) { + + return result.copy( line.start ); + + } + + // Unsure if this is the correct method to handle this case. + return undefined; + + } + + var t = - ( line.start.dot( this.normal ) + this.constant ) / denominator; + + if ( t < 0 || t > 1 ) { + + return undefined; + + } + + return result.copy( direction ).multiplyScalar( t ).add( line.start ); + + }; + + }(), + + intersectsLine: function ( line ) { + + // Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it. + + var startSign = this.distanceToPoint( line.start ); + var endSign = this.distanceToPoint( line.end ); + + return ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 ); + + }, + + intersectsBox: function ( box ) { + + return box.intersectsPlane( this ); + + }, + + intersectsSphere: function ( sphere ) { + + return sphere.intersectsPlane( this ); + + }, + + coplanarPoint: function ( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + return result.copy( this.normal ).multiplyScalar( - this.constant ); + + }, + + applyMatrix4: function () { + + var v1 = new Vector3(); + var m1 = new Matrix3(); + + return function applyMatrix4( matrix, optionalNormalMatrix ) { + + var referencePoint = this.coplanarPoint( v1 ).applyMatrix4( matrix ); + + // transform normal based on theory here: + // http://www.songho.ca/opengl/gl_normaltransform.html + var normalMatrix = optionalNormalMatrix || m1.getNormalMatrix( matrix ); + var normal = this.normal.applyMatrix3( normalMatrix ).normalize(); + + // recalculate constant (like in setFromNormalAndCoplanarPoint) + this.constant = - referencePoint.dot( normal ); + + return this; + + }; + + }(), + + translate: function ( offset ) { + + this.constant = this.constant - offset.dot( this.normal ); + + return this; + + }, + + equals: function ( plane ) { + + return plane.normal.equals( this.normal ) && ( plane.constant === this.constant ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author bhouston / http://clara.io + */ + + function Frustum( p0, p1, p2, p3, p4, p5 ) { + + this.planes = [ + + ( p0 !== undefined ) ? p0 : new Plane(), + ( p1 !== undefined ) ? p1 : new Plane(), + ( p2 !== undefined ) ? p2 : new Plane(), + ( p3 !== undefined ) ? p3 : new Plane(), + ( p4 !== undefined ) ? p4 : new Plane(), + ( p5 !== undefined ) ? p5 : new Plane() + + ]; + + } + + Object.assign( Frustum.prototype, { + + set: function ( p0, p1, p2, p3, p4, p5 ) { + + var planes = this.planes; + + planes[ 0 ].copy( p0 ); + planes[ 1 ].copy( p1 ); + planes[ 2 ].copy( p2 ); + planes[ 3 ].copy( p3 ); + planes[ 4 ].copy( p4 ); + planes[ 5 ].copy( p5 ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( frustum ) { + + var planes = this.planes; + + for ( var i = 0; i < 6; i ++ ) { + + planes[ i ].copy( frustum.planes[ i ] ); + + } + + return this; + + }, + + setFromMatrix: function ( m ) { + + var planes = this.planes; + var me = m.elements; + var me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ]; + var me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ]; + var me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ]; + var me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ]; + + planes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize(); + planes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize(); + planes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize(); + planes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize(); + planes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize(); + planes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize(); + + return this; + + }, + + intersectsObject: function () { + + var sphere = new Sphere(); + + return function intersectsObject( object ) { + + var geometry = object.geometry; + + if ( geometry.boundingSphere === null ) + geometry.computeBoundingSphere(); + + sphere.copy( geometry.boundingSphere ) + .applyMatrix4( object.matrixWorld ); + + return this.intersectsSphere( sphere ); + + }; + + }(), + + intersectsSprite: function () { + + var sphere = new Sphere(); + + return function intersectsSprite( sprite ) { + + sphere.center.set( 0, 0, 0 ); + sphere.radius = 0.7071067811865476; + sphere.applyMatrix4( sprite.matrixWorld ); + + return this.intersectsSphere( sphere ); + + }; + + }(), + + intersectsSphere: function ( sphere ) { + + var planes = this.planes; + var center = sphere.center; + var negRadius = - sphere.radius; + + for ( var i = 0; i < 6; i ++ ) { + + var distance = planes[ i ].distanceToPoint( center ); + + if ( distance < negRadius ) { + + return false; + + } + + } + + return true; + + }, + + intersectsBox: function () { + + var p1 = new Vector3(), + p2 = new Vector3(); + + return function intersectsBox( box ) { + + var planes = this.planes; + + for ( var i = 0; i < 6; i ++ ) { + + var plane = planes[ i ]; + + p1.x = plane.normal.x > 0 ? box.min.x : box.max.x; + p2.x = plane.normal.x > 0 ? box.max.x : box.min.x; + p1.y = plane.normal.y > 0 ? box.min.y : box.max.y; + p2.y = plane.normal.y > 0 ? box.max.y : box.min.y; + p1.z = plane.normal.z > 0 ? box.min.z : box.max.z; + p2.z = plane.normal.z > 0 ? box.max.z : box.min.z; + + var d1 = plane.distanceToPoint( p1 ); + var d2 = plane.distanceToPoint( p2 ); + + // if both outside plane, no intersection + + if ( d1 < 0 && d2 < 0 ) { + + return false; + + } + + } + + return true; + + }; + + }(), + + containsPoint: function ( point ) { + + var planes = this.planes; + + for ( var i = 0; i < 6; i ++ ) { + + if ( planes[ i ].distanceToPoint( point ) < 0 ) { + + return false; + + } + + } + + return true; + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLShadowMap( _renderer, _lights, _objects, capabilities ) { + + var _gl = _renderer.context, + _state = _renderer.state, + _frustum = new Frustum(), + _projScreenMatrix = new Matrix4(), + + _lightShadows = _lights.shadows, + + _shadowMapSize = new Vector2(), + _maxShadowMapSize = new Vector2( capabilities.maxTextureSize, capabilities.maxTextureSize ), + + _lookTarget = new Vector3(), + _lightPositionWorld = new Vector3(), + + _MorphingFlag = 1, + _SkinningFlag = 2, + + _NumberOfMaterialVariants = ( _MorphingFlag | _SkinningFlag ) + 1, + + _depthMaterials = new Array( _NumberOfMaterialVariants ), + _distanceMaterials = new Array( _NumberOfMaterialVariants ), + + _materialCache = {}; + + var cubeDirections = [ + new Vector3( 1, 0, 0 ), new Vector3( - 1, 0, 0 ), new Vector3( 0, 0, 1 ), + new Vector3( 0, 0, - 1 ), new Vector3( 0, 1, 0 ), new Vector3( 0, - 1, 0 ) + ]; + + var cubeUps = [ + new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), + new Vector3( 0, 1, 0 ), new Vector3( 0, 0, 1 ), new Vector3( 0, 0, - 1 ) + ]; + + var cube2DViewPorts = [ + new Vector4(), new Vector4(), new Vector4(), + new Vector4(), new Vector4(), new Vector4() + ]; + + // init + + var depthMaterialTemplate = new MeshDepthMaterial(); + depthMaterialTemplate.depthPacking = RGBADepthPacking; + depthMaterialTemplate.clipping = true; + + var distanceShader = ShaderLib[ "distanceRGBA" ]; + var distanceUniforms = UniformsUtils.clone( distanceShader.uniforms ); + + for ( var i = 0; i !== _NumberOfMaterialVariants; ++ i ) { + + var useMorphing = ( i & _MorphingFlag ) !== 0; + var useSkinning = ( i & _SkinningFlag ) !== 0; + + var depthMaterial = depthMaterialTemplate.clone(); + depthMaterial.morphTargets = useMorphing; + depthMaterial.skinning = useSkinning; + + _depthMaterials[ i ] = depthMaterial; + + var distanceMaterial = new ShaderMaterial( { + defines: { + 'USE_SHADOWMAP': '' + }, + uniforms: distanceUniforms, + vertexShader: distanceShader.vertexShader, + fragmentShader: distanceShader.fragmentShader, + morphTargets: useMorphing, + skinning: useSkinning, + clipping: true + } ); + + _distanceMaterials[ i ] = distanceMaterial; + + } + + // + + var scope = this; + + this.enabled = false; + + this.autoUpdate = true; + this.needsUpdate = false; + + this.type = PCFShadowMap; + + this.renderReverseSided = true; + this.renderSingleSided = true; + + this.render = function ( scene, camera ) { + + if ( scope.enabled === false ) return; + if ( scope.autoUpdate === false && scope.needsUpdate === false ) return; + + if ( _lightShadows.length === 0 ) return; + + // Set GL state for depth map. + _state.disable( _gl.BLEND ); + _state.buffers.color.setClear( 1, 1, 1, 1 ); + _state.buffers.depth.setTest( true ); + _state.setScissorTest( false ); + + // render depth map + + var faceCount, isPointLight; + + for ( var i = 0, il = _lightShadows.length; i < il; i ++ ) { + + var light = _lightShadows[ i ]; + var shadow = light.shadow; + + if ( shadow === undefined ) { + + console.warn( 'THREE.WebGLShadowMap:', light, 'has no shadow.' ); + continue; + + } + + var shadowCamera = shadow.camera; + var shadowMatrix = shadow.matrix; + + _lightPositionWorld.setFromMatrixPosition( light.matrixWorld ); + shadowCamera.position.copy( _lightPositionWorld ); + + _shadowMapSize.copy( shadow.mapSize ); + _shadowMapSize.min( _maxShadowMapSize ); + + if ( light && light.isPointLight ) { + + faceCount = 6; + isPointLight = true; + + var vpWidth = _shadowMapSize.x; + var vpHeight = _shadowMapSize.y; + + // These viewports map a cube-map onto a 2D texture with the + // following orientation: + // + // xzXZ + // y Y + // + // X - Positive x direction + // x - Negative x direction + // Y - Positive y direction + // y - Negative y direction + // Z - Positive z direction + // z - Negative z direction + + // positive X + cube2DViewPorts[ 0 ].set( vpWidth * 2, vpHeight, vpWidth, vpHeight ); + // negative X + cube2DViewPorts[ 1 ].set( 0, vpHeight, vpWidth, vpHeight ); + // positive Z + cube2DViewPorts[ 2 ].set( vpWidth * 3, vpHeight, vpWidth, vpHeight ); + // negative Z + cube2DViewPorts[ 3 ].set( vpWidth, vpHeight, vpWidth, vpHeight ); + // positive Y + cube2DViewPorts[ 4 ].set( vpWidth * 3, 0, vpWidth, vpHeight ); + // negative Y + cube2DViewPorts[ 5 ].set( vpWidth, 0, vpWidth, vpHeight ); + + _shadowMapSize.x *= 4.0; + _shadowMapSize.y *= 2.0; + + + // for point lights we set the shadow matrix to be a translation-only matrix + // equal to inverse of the light's position + + shadowMatrix.makeTranslation( - _lightPositionWorld.x, - _lightPositionWorld.y, - _lightPositionWorld.z ); + + } else { + + faceCount = 1; + isPointLight = false; + + _lookTarget.setFromMatrixPosition( light.target.matrixWorld ); + shadowCamera.lookAt( _lookTarget ); + shadowCamera.updateMatrixWorld(); + shadowCamera.matrixWorldInverse.getInverse( shadowCamera.matrixWorld ); + + // compute shadow matrix + + shadowMatrix.set( + 0.5, 0.0, 0.0, 0.5, + 0.0, 0.5, 0.0, 0.5, + 0.0, 0.0, 0.5, 0.5, + 0.0, 0.0, 0.0, 1.0 + ); + + shadowMatrix.multiply( shadowCamera.projectionMatrix ); + shadowMatrix.multiply( shadowCamera.matrixWorldInverse ); + + } + + if ( shadow.map === null ) { + + var pars = { minFilter: NearestFilter, magFilter: NearestFilter, format: RGBAFormat }; + + shadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars ); + shadow.map.texture.name = light.name + ".shadowMap"; + + shadowCamera.updateProjectionMatrix(); + + } + + if ( shadow.isSpotLightShadow ) { + + shadow.update( light ); + + } + + var shadowMap = shadow.map; + + _renderer.setRenderTarget( shadowMap ); + _renderer.clear(); + + // render shadow map for each cube face (if omni-directional) or + // run a single pass if not + + for ( var face = 0; face < faceCount; face ++ ) { + + if ( isPointLight ) { + + _lookTarget.copy( shadowCamera.position ); + _lookTarget.add( cubeDirections[ face ] ); + shadowCamera.up.copy( cubeUps[ face ] ); + shadowCamera.lookAt( _lookTarget ); + shadowCamera.updateMatrixWorld(); + shadowCamera.matrixWorldInverse.getInverse( shadowCamera.matrixWorld ); + + var vpDimensions = cube2DViewPorts[ face ]; + _state.viewport( vpDimensions ); + + } + + // update camera matrices and frustum + + _projScreenMatrix.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse ); + _frustum.setFromMatrix( _projScreenMatrix ); + + // set object matrices & frustum culling + + renderObject( scene, camera, shadowCamera, isPointLight ); + + } + + } + + // Restore GL state. + var clearColor = _renderer.getClearColor(); + var clearAlpha = _renderer.getClearAlpha(); + _renderer.setClearColor( clearColor, clearAlpha ); + + scope.needsUpdate = false; + + }; + + function getDepthMaterial( object, material, isPointLight, lightPositionWorld ) { + + var geometry = object.geometry; + + var result = null; + + var materialVariants = _depthMaterials; + var customMaterial = object.customDepthMaterial; + + if ( isPointLight ) { + + materialVariants = _distanceMaterials; + customMaterial = object.customDistanceMaterial; + + } + + if ( ! customMaterial ) { + + var useMorphing = false; + + if ( material.morphTargets ) { + + if ( geometry && geometry.isBufferGeometry ) { + + useMorphing = geometry.morphAttributes && geometry.morphAttributes.position && geometry.morphAttributes.position.length > 0; + + } else if ( geometry && geometry.isGeometry ) { + + useMorphing = geometry.morphTargets && geometry.morphTargets.length > 0; + + } + + } + + if ( object.isSkinnedMesh && material.skinning === false ) { + + console.warn( 'THREE.WebGLShadowMap: THREE.SkinnedMesh with material.skinning set to false:', object ); + + } + + var useSkinning = object.isSkinnedMesh && material.skinning; + + var variantIndex = 0; + + if ( useMorphing ) variantIndex |= _MorphingFlag; + if ( useSkinning ) variantIndex |= _SkinningFlag; + + result = materialVariants[ variantIndex ]; + + } else { + + result = customMaterial; + + } + + if ( _renderer.localClippingEnabled && + material.clipShadows === true && + material.clippingPlanes.length !== 0 ) { + + // in this case we need a unique material instance reflecting the + // appropriate state + + var keyA = result.uuid, keyB = material.uuid; + + var materialsForVariant = _materialCache[ keyA ]; + + if ( materialsForVariant === undefined ) { + + materialsForVariant = {}; + _materialCache[ keyA ] = materialsForVariant; + + } + + var cachedMaterial = materialsForVariant[ keyB ]; + + if ( cachedMaterial === undefined ) { + + cachedMaterial = result.clone(); + materialsForVariant[ keyB ] = cachedMaterial; + + } + + result = cachedMaterial; + + } + + result.visible = material.visible; + result.wireframe = material.wireframe; + + var side = material.side; + + if ( scope.renderSingleSided && side == DoubleSide ) { + + side = FrontSide; + + } + + if ( scope.renderReverseSided ) { + + if ( side === FrontSide ) side = BackSide; + else if ( side === BackSide ) side = FrontSide; + + } + + result.side = side; + + result.clipShadows = material.clipShadows; + result.clippingPlanes = material.clippingPlanes; + + result.wireframeLinewidth = material.wireframeLinewidth; + result.linewidth = material.linewidth; + + if ( isPointLight && result.uniforms.lightPos !== undefined ) { + + result.uniforms.lightPos.value.copy( lightPositionWorld ); + + } + + return result; + + } + + function renderObject( object, camera, shadowCamera, isPointLight ) { + + if ( object.visible === false ) return; + + var visible = object.layers.test( camera.layers ); + + if ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) { + + if ( object.castShadow && ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) ) { + + object.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld ); + + var geometry = _objects.update( object ); + var material = object.material; + + if ( Array.isArray( material ) ) { + + var groups = geometry.groups; + + for ( var k = 0, kl = groups.length; k < kl; k ++ ) { + + var group = groups[ k ]; + var groupMaterial = material[ group.materialIndex ]; + + if ( groupMaterial && groupMaterial.visible ) { + + var depthMaterial = getDepthMaterial( object, groupMaterial, isPointLight, _lightPositionWorld ); + _renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, group ); + + } + + } + + } else if ( material.visible ) { + + var depthMaterial = getDepthMaterial( object, material, isPointLight, _lightPositionWorld ); + _renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, null ); + + } + + } + + } + + var children = object.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + renderObject( children[ i ], camera, shadowCamera, isPointLight ); + + } + + } + + } + + /** + * @author bhouston / http://clara.io + */ + + function Ray( origin, direction ) { + + this.origin = ( origin !== undefined ) ? origin : new Vector3(); + this.direction = ( direction !== undefined ) ? direction : new Vector3(); + + } + + Object.assign( Ray.prototype, { + + set: function ( origin, direction ) { + + this.origin.copy( origin ); + this.direction.copy( direction ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( ray ) { + + this.origin.copy( ray.origin ); + this.direction.copy( ray.direction ); + + return this; + + }, + + at: function ( t, optionalTarget ) { + + var result = optionalTarget || new Vector3(); + + return result.copy( this.direction ).multiplyScalar( t ).add( this.origin ); + + }, + + lookAt: function ( v ) { + + this.direction.copy( v ).sub( this.origin ).normalize(); + + return this; + + }, + + recast: function () { + + var v1 = new Vector3(); + + return function recast( t ) { + + this.origin.copy( this.at( t, v1 ) ); + + return this; + + }; + + }(), + + closestPointToPoint: function ( point, optionalTarget ) { + + var result = optionalTarget || new Vector3(); + result.subVectors( point, this.origin ); + var directionDistance = result.dot( this.direction ); + + if ( directionDistance < 0 ) { + + return result.copy( this.origin ); + + } + + return result.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin ); + + }, + + distanceToPoint: function ( point ) { + + return Math.sqrt( this.distanceSqToPoint( point ) ); + + }, + + distanceSqToPoint: function () { + + var v1 = new Vector3(); + + return function distanceSqToPoint( point ) { + + var directionDistance = v1.subVectors( point, this.origin ).dot( this.direction ); + + // point behind the ray + + if ( directionDistance < 0 ) { + + return this.origin.distanceToSquared( point ); + + } + + v1.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin ); + + return v1.distanceToSquared( point ); + + }; + + }(), + + distanceSqToSegment: function () { + + var segCenter = new Vector3(); + var segDir = new Vector3(); + var diff = new Vector3(); + + return function distanceSqToSegment( v0, v1, optionalPointOnRay, optionalPointOnSegment ) { + + // from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteDistRaySegment.h + // It returns the min distance between the ray and the segment + // defined by v0 and v1 + // It can also set two optional targets : + // - The closest point on the ray + // - The closest point on the segment + + segCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 ); + segDir.copy( v1 ).sub( v0 ).normalize(); + diff.copy( this.origin ).sub( segCenter ); + + var segExtent = v0.distanceTo( v1 ) * 0.5; + var a01 = - this.direction.dot( segDir ); + var b0 = diff.dot( this.direction ); + var b1 = - diff.dot( segDir ); + var c = diff.lengthSq(); + var det = Math.abs( 1 - a01 * a01 ); + var s0, s1, sqrDist, extDet; + + if ( det > 0 ) { + + // The ray and segment are not parallel. + + s0 = a01 * b1 - b0; + s1 = a01 * b0 - b1; + extDet = segExtent * det; + + if ( s0 >= 0 ) { + + if ( s1 >= - extDet ) { + + if ( s1 <= extDet ) { + + // region 0 + // Minimum at interior points of ray and segment. + + var invDet = 1 / det; + s0 *= invDet; + s1 *= invDet; + sqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c; + + } else { + + // region 1 + + s1 = segExtent; + s0 = Math.max( 0, - ( a01 * s1 + b0 ) ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + } else { + + // region 5 + + s1 = - segExtent; + s0 = Math.max( 0, - ( a01 * s1 + b0 ) ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + } else { + + if ( s1 <= - extDet ) { + + // region 4 + + s0 = Math.max( 0, - ( - a01 * segExtent + b0 ) ); + s1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } else if ( s1 <= extDet ) { + + // region 3 + + s0 = 0; + s1 = Math.min( Math.max( - segExtent, - b1 ), segExtent ); + sqrDist = s1 * ( s1 + 2 * b1 ) + c; + + } else { + + // region 2 + + s0 = Math.max( 0, - ( a01 * segExtent + b0 ) ); + s1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + } + + } else { + + // Ray and segment are parallel. + + s1 = ( a01 > 0 ) ? - segExtent : segExtent; + s0 = Math.max( 0, - ( a01 * s1 + b0 ) ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + if ( optionalPointOnRay ) { + + optionalPointOnRay.copy( this.direction ).multiplyScalar( s0 ).add( this.origin ); + + } + + if ( optionalPointOnSegment ) { + + optionalPointOnSegment.copy( segDir ).multiplyScalar( s1 ).add( segCenter ); + + } + + return sqrDist; + + }; + + }(), + + intersectSphere: function () { + + var v1 = new Vector3(); + + return function intersectSphere( sphere, optionalTarget ) { + + v1.subVectors( sphere.center, this.origin ); + var tca = v1.dot( this.direction ); + var d2 = v1.dot( v1 ) - tca * tca; + var radius2 = sphere.radius * sphere.radius; + + if ( d2 > radius2 ) return null; + + var thc = Math.sqrt( radius2 - d2 ); + + // t0 = first intersect point - entrance on front of sphere + var t0 = tca - thc; + + // t1 = second intersect point - exit point on back of sphere + var t1 = tca + thc; + + // test to see if both t0 and t1 are behind the ray - if so, return null + if ( t0 < 0 && t1 < 0 ) return null; + + // test to see if t0 is behind the ray: + // if it is, the ray is inside the sphere, so return the second exit point scaled by t1, + // in order to always return an intersect point that is in front of the ray. + if ( t0 < 0 ) return this.at( t1, optionalTarget ); + + // else t0 is in front of the ray, so return the first collision point scaled by t0 + return this.at( t0, optionalTarget ); + + }; + + }(), + + intersectsSphere: function ( sphere ) { + + return this.distanceToPoint( sphere.center ) <= sphere.radius; + + }, + + distanceToPlane: function ( plane ) { + + var denominator = plane.normal.dot( this.direction ); + + if ( denominator === 0 ) { + + // line is coplanar, return origin + if ( plane.distanceToPoint( this.origin ) === 0 ) { + + return 0; + + } + + // Null is preferable to undefined since undefined means.... it is undefined + + return null; + + } + + var t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator; + + // Return if the ray never intersects the plane + + return t >= 0 ? t : null; + + }, + + intersectPlane: function ( plane, optionalTarget ) { + + var t = this.distanceToPlane( plane ); + + if ( t === null ) { + + return null; + + } + + return this.at( t, optionalTarget ); + + }, + + intersectsPlane: function ( plane ) { + + // check if the ray lies on the plane first + + var distToPoint = plane.distanceToPoint( this.origin ); + + if ( distToPoint === 0 ) { + + return true; + + } + + var denominator = plane.normal.dot( this.direction ); + + if ( denominator * distToPoint < 0 ) { + + return true; + + } + + // ray origin is behind the plane (and is pointing behind it) + + return false; + + }, + + intersectBox: function ( box, optionalTarget ) { + + var tmin, tmax, tymin, tymax, tzmin, tzmax; + + var invdirx = 1 / this.direction.x, + invdiry = 1 / this.direction.y, + invdirz = 1 / this.direction.z; + + var origin = this.origin; + + if ( invdirx >= 0 ) { + + tmin = ( box.min.x - origin.x ) * invdirx; + tmax = ( box.max.x - origin.x ) * invdirx; + + } else { + + tmin = ( box.max.x - origin.x ) * invdirx; + tmax = ( box.min.x - origin.x ) * invdirx; + + } + + if ( invdiry >= 0 ) { + + tymin = ( box.min.y - origin.y ) * invdiry; + tymax = ( box.max.y - origin.y ) * invdiry; + + } else { + + tymin = ( box.max.y - origin.y ) * invdiry; + tymax = ( box.min.y - origin.y ) * invdiry; + + } + + if ( ( tmin > tymax ) || ( tymin > tmax ) ) return null; + + // These lines also handle the case where tmin or tmax is NaN + // (result of 0 * Infinity). x !== x returns true if x is NaN + + if ( tymin > tmin || tmin !== tmin ) tmin = tymin; + + if ( tymax < tmax || tmax !== tmax ) tmax = tymax; + + if ( invdirz >= 0 ) { + + tzmin = ( box.min.z - origin.z ) * invdirz; + tzmax = ( box.max.z - origin.z ) * invdirz; + + } else { + + tzmin = ( box.max.z - origin.z ) * invdirz; + tzmax = ( box.min.z - origin.z ) * invdirz; + + } + + if ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return null; + + if ( tzmin > tmin || tmin !== tmin ) tmin = tzmin; + + if ( tzmax < tmax || tmax !== tmax ) tmax = tzmax; + + //return point closest to the ray (positive side) + + if ( tmax < 0 ) return null; + + return this.at( tmin >= 0 ? tmin : tmax, optionalTarget ); + + }, + + intersectsBox: ( function () { + + var v = new Vector3(); + + return function intersectsBox( box ) { + + return this.intersectBox( box, v ) !== null; + + }; + + } )(), + + intersectTriangle: function () { + + // Compute the offset origin, edges, and normal. + var diff = new Vector3(); + var edge1 = new Vector3(); + var edge2 = new Vector3(); + var normal = new Vector3(); + + return function intersectTriangle( a, b, c, backfaceCulling, optionalTarget ) { + + // from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h + + edge1.subVectors( b, a ); + edge2.subVectors( c, a ); + normal.crossVectors( edge1, edge2 ); + + // Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction, + // E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by + // |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2)) + // |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q)) + // |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N) + var DdN = this.direction.dot( normal ); + var sign; + + if ( DdN > 0 ) { + + if ( backfaceCulling ) return null; + sign = 1; + + } else if ( DdN < 0 ) { + + sign = - 1; + DdN = - DdN; + + } else { + + return null; + + } + + diff.subVectors( this.origin, a ); + var DdQxE2 = sign * this.direction.dot( edge2.crossVectors( diff, edge2 ) ); + + // b1 < 0, no intersection + if ( DdQxE2 < 0 ) { + + return null; + + } + + var DdE1xQ = sign * this.direction.dot( edge1.cross( diff ) ); + + // b2 < 0, no intersection + if ( DdE1xQ < 0 ) { + + return null; + + } + + // b1+b2 > 1, no intersection + if ( DdQxE2 + DdE1xQ > DdN ) { + + return null; + + } + + // Line intersects triangle, check if ray does. + var QdN = - sign * diff.dot( normal ); + + // t < 0, no intersection + if ( QdN < 0 ) { + + return null; + + } + + // Ray intersects triangle. + return this.at( QdN / DdN, optionalTarget ); + + }; + + }(), + + applyMatrix4: function ( matrix4 ) { + + this.direction.add( this.origin ).applyMatrix4( matrix4 ); + this.origin.applyMatrix4( matrix4 ); + this.direction.sub( this.origin ); + this.direction.normalize(); + + return this; + + }, + + equals: function ( ray ) { + + return ray.origin.equals( this.origin ) && ray.direction.equals( this.direction ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + * @author bhouston / http://clara.io + */ + + function Euler( x, y, z, order ) { + + this._x = x || 0; + this._y = y || 0; + this._z = z || 0; + this._order = order || Euler.DefaultOrder; + + } + + Euler.RotationOrders = [ 'XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX' ]; + + Euler.DefaultOrder = 'XYZ'; + + Object.defineProperties( Euler.prototype, { + + x: { + + get: function () { + + return this._x; + + }, + + set: function ( value ) { + + this._x = value; + this.onChangeCallback(); + + } + + }, + + y: { + + get: function () { + + return this._y; + + }, + + set: function ( value ) { + + this._y = value; + this.onChangeCallback(); + + } + + }, + + z: { + + get: function () { + + return this._z; + + }, + + set: function ( value ) { + + this._z = value; + this.onChangeCallback(); + + } + + }, + + order: { + + get: function () { + + return this._order; + + }, + + set: function ( value ) { + + this._order = value; + this.onChangeCallback(); + + } + + } + + } ); + + Object.assign( Euler.prototype, { + + isEuler: true, + + set: function ( x, y, z, order ) { + + this._x = x; + this._y = y; + this._z = z; + this._order = order || this._order; + + this.onChangeCallback(); + + return this; + + }, + + clone: function () { + + return new this.constructor( this._x, this._y, this._z, this._order ); + + }, + + copy: function ( euler ) { + + this._x = euler._x; + this._y = euler._y; + this._z = euler._z; + this._order = euler._order; + + this.onChangeCallback(); + + return this; + + }, + + setFromRotationMatrix: function ( m, order, update ) { + + var clamp = _Math.clamp; + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + var te = m.elements; + var m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ]; + var m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ]; + var m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ]; + + order = order || this._order; + + if ( order === 'XYZ' ) { + + this._y = Math.asin( clamp( m13, - 1, 1 ) ); + + if ( Math.abs( m13 ) < 0.99999 ) { + + this._x = Math.atan2( - m23, m33 ); + this._z = Math.atan2( - m12, m11 ); + + } else { + + this._x = Math.atan2( m32, m22 ); + this._z = 0; + + } + + } else if ( order === 'YXZ' ) { + + this._x = Math.asin( - clamp( m23, - 1, 1 ) ); + + if ( Math.abs( m23 ) < 0.99999 ) { + + this._y = Math.atan2( m13, m33 ); + this._z = Math.atan2( m21, m22 ); + + } else { + + this._y = Math.atan2( - m31, m11 ); + this._z = 0; + + } + + } else if ( order === 'ZXY' ) { + + this._x = Math.asin( clamp( m32, - 1, 1 ) ); + + if ( Math.abs( m32 ) < 0.99999 ) { + + this._y = Math.atan2( - m31, m33 ); + this._z = Math.atan2( - m12, m22 ); + + } else { + + this._y = 0; + this._z = Math.atan2( m21, m11 ); + + } + + } else if ( order === 'ZYX' ) { + + this._y = Math.asin( - clamp( m31, - 1, 1 ) ); + + if ( Math.abs( m31 ) < 0.99999 ) { + + this._x = Math.atan2( m32, m33 ); + this._z = Math.atan2( m21, m11 ); + + } else { + + this._x = 0; + this._z = Math.atan2( - m12, m22 ); + + } + + } else if ( order === 'YZX' ) { + + this._z = Math.asin( clamp( m21, - 1, 1 ) ); + + if ( Math.abs( m21 ) < 0.99999 ) { + + this._x = Math.atan2( - m23, m22 ); + this._y = Math.atan2( - m31, m11 ); + + } else { + + this._x = 0; + this._y = Math.atan2( m13, m33 ); + + } + + } else if ( order === 'XZY' ) { + + this._z = Math.asin( - clamp( m12, - 1, 1 ) ); + + if ( Math.abs( m12 ) < 0.99999 ) { + + this._x = Math.atan2( m32, m22 ); + this._y = Math.atan2( m13, m11 ); + + } else { + + this._x = Math.atan2( - m23, m33 ); + this._y = 0; + + } + + } else { + + console.warn( 'THREE.Euler: .setFromRotationMatrix() given unsupported order: ' + order ); + + } + + this._order = order; + + if ( update !== false ) this.onChangeCallback(); + + return this; + + }, + + setFromQuaternion: function () { + + var matrix = new Matrix4(); + + return function setFromQuaternion( q, order, update ) { + + matrix.makeRotationFromQuaternion( q ); + + return this.setFromRotationMatrix( matrix, order, update ); + + }; + + }(), + + setFromVector3: function ( v, order ) { + + return this.set( v.x, v.y, v.z, order || this._order ); + + }, + + reorder: function () { + + // WARNING: this discards revolution information -bhouston + + var q = new Quaternion(); + + return function reorder( newOrder ) { + + q.setFromEuler( this ); + + return this.setFromQuaternion( q, newOrder ); + + }; + + }(), + + equals: function ( euler ) { + + return ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order ); + + }, + + fromArray: function ( array ) { + + this._x = array[ 0 ]; + this._y = array[ 1 ]; + this._z = array[ 2 ]; + if ( array[ 3 ] !== undefined ) this._order = array[ 3 ]; + + this.onChangeCallback(); + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this._x; + array[ offset + 1 ] = this._y; + array[ offset + 2 ] = this._z; + array[ offset + 3 ] = this._order; + + return array; + + }, + + toVector3: function ( optionalResult ) { + + if ( optionalResult ) { + + return optionalResult.set( this._x, this._y, this._z ); + + } else { + + return new Vector3( this._x, this._y, this._z ); + + } + + }, + + onChange: function ( callback ) { + + this.onChangeCallback = callback; + + return this; + + }, + + onChangeCallback: function () {} + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Layers() { + + this.mask = 1 | 0; + + } + + Object.assign( Layers.prototype, { + + set: function ( channel ) { + + this.mask = 1 << channel | 0; + + }, + + enable: function ( channel ) { + + this.mask |= 1 << channel | 0; + + }, + + toggle: function ( channel ) { + + this.mask ^= 1 << channel | 0; + + }, + + disable: function ( channel ) { + + this.mask &= ~ ( 1 << channel | 0 ); + + }, + + test: function ( layers ) { + + return ( this.mask & layers.mask ) !== 0; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author elephantatwork / www.elephantatwork.ch + */ + + var object3DId = 0; + + function Object3D() { + + Object.defineProperty( this, 'id', { value: object3DId ++ } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + this.type = 'Object3D'; + + this.parent = null; + this.children = []; + + this.up = Object3D.DefaultUp.clone(); + + var position = new Vector3(); + var rotation = new Euler(); + var quaternion = new Quaternion(); + var scale = new Vector3( 1, 1, 1 ); + + function onRotationChange() { + + quaternion.setFromEuler( rotation, false ); + + } + + function onQuaternionChange() { + + rotation.setFromQuaternion( quaternion, undefined, false ); + + } + + rotation.onChange( onRotationChange ); + quaternion.onChange( onQuaternionChange ); + + Object.defineProperties( this, { + position: { + enumerable: true, + value: position + }, + rotation: { + enumerable: true, + value: rotation + }, + quaternion: { + enumerable: true, + value: quaternion + }, + scale: { + enumerable: true, + value: scale + }, + modelViewMatrix: { + value: new Matrix4() + }, + normalMatrix: { + value: new Matrix3() + } + } ); + + this.matrix = new Matrix4(); + this.matrixWorld = new Matrix4(); + + this.matrixAutoUpdate = Object3D.DefaultMatrixAutoUpdate; + this.matrixWorldNeedsUpdate = false; + + this.layers = new Layers(); + this.visible = true; + + this.castShadow = false; + this.receiveShadow = false; + + this.frustumCulled = true; + this.renderOrder = 0; + + this.userData = {}; + + this.onBeforeRender = function () {}; + this.onAfterRender = function () {}; + + } + + Object3D.DefaultUp = new Vector3( 0, 1, 0 ); + Object3D.DefaultMatrixAutoUpdate = true; + + Object.assign( Object3D.prototype, EventDispatcher.prototype, { + + isObject3D: true, + + applyMatrix: function ( matrix ) { + + this.matrix.multiplyMatrices( matrix, this.matrix ); + + this.matrix.decompose( this.position, this.quaternion, this.scale ); + + }, + + setRotationFromAxisAngle: function ( axis, angle ) { + + // assumes axis is normalized + + this.quaternion.setFromAxisAngle( axis, angle ); + + }, + + setRotationFromEuler: function ( euler ) { + + this.quaternion.setFromEuler( euler, true ); + + }, + + setRotationFromMatrix: function ( m ) { + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + this.quaternion.setFromRotationMatrix( m ); + + }, + + setRotationFromQuaternion: function ( q ) { + + // assumes q is normalized + + this.quaternion.copy( q ); + + }, + + rotateOnAxis: function () { + + // rotate object on axis in object space + // axis is assumed to be normalized + + var q1 = new Quaternion(); + + return function rotateOnAxis( axis, angle ) { + + q1.setFromAxisAngle( axis, angle ); + + this.quaternion.multiply( q1 ); + + return this; + + }; + + }(), + + rotateX: function () { + + var v1 = new Vector3( 1, 0, 0 ); + + return function rotateX( angle ) { + + return this.rotateOnAxis( v1, angle ); + + }; + + }(), + + rotateY: function () { + + var v1 = new Vector3( 0, 1, 0 ); + + return function rotateY( angle ) { + + return this.rotateOnAxis( v1, angle ); + + }; + + }(), + + rotateZ: function () { + + var v1 = new Vector3( 0, 0, 1 ); + + return function rotateZ( angle ) { + + return this.rotateOnAxis( v1, angle ); + + }; + + }(), + + translateOnAxis: function () { + + // translate object by distance along axis in object space + // axis is assumed to be normalized + + var v1 = new Vector3(); + + return function translateOnAxis( axis, distance ) { + + v1.copy( axis ).applyQuaternion( this.quaternion ); + + this.position.add( v1.multiplyScalar( distance ) ); + + return this; + + }; + + }(), + + translateX: function () { + + var v1 = new Vector3( 1, 0, 0 ); + + return function translateX( distance ) { + + return this.translateOnAxis( v1, distance ); + + }; + + }(), + + translateY: function () { + + var v1 = new Vector3( 0, 1, 0 ); + + return function translateY( distance ) { + + return this.translateOnAxis( v1, distance ); + + }; + + }(), + + translateZ: function () { + + var v1 = new Vector3( 0, 0, 1 ); + + return function translateZ( distance ) { + + return this.translateOnAxis( v1, distance ); + + }; + + }(), + + localToWorld: function ( vector ) { + + return vector.applyMatrix4( this.matrixWorld ); + + }, + + worldToLocal: function () { + + var m1 = new Matrix4(); + + return function worldToLocal( vector ) { + + return vector.applyMatrix4( m1.getInverse( this.matrixWorld ) ); + + }; + + }(), + + lookAt: function () { + + // This routine does not support objects with rotated and/or translated parent(s) + + var m1 = new Matrix4(); + + return function lookAt( vector ) { + + if ( this.isCamera ) { + + m1.lookAt( this.position, vector, this.up ); + + } else { + + m1.lookAt( vector, this.position, this.up ); + + } + + this.quaternion.setFromRotationMatrix( m1 ); + + }; + + }(), + + add: function ( object ) { + + if ( arguments.length > 1 ) { + + for ( var i = 0; i < arguments.length; i ++ ) { + + this.add( arguments[ i ] ); + + } + + return this; + + } + + if ( object === this ) { + + console.error( "THREE.Object3D.add: object can't be added as a child of itself.", object ); + return this; + + } + + if ( ( object && object.isObject3D ) ) { + + if ( object.parent !== null ) { + + object.parent.remove( object ); + + } + + object.parent = this; + object.dispatchEvent( { type: 'added' } ); + + this.children.push( object ); + + } else { + + console.error( "THREE.Object3D.add: object not an instance of THREE.Object3D.", object ); + + } + + return this; + + }, + + remove: function ( object ) { + + if ( arguments.length > 1 ) { + + for ( var i = 0; i < arguments.length; i ++ ) { + + this.remove( arguments[ i ] ); + + } + + } + + var index = this.children.indexOf( object ); + + if ( index !== - 1 ) { + + object.parent = null; + + object.dispatchEvent( { type: 'removed' } ); + + this.children.splice( index, 1 ); + + } + + }, + + getObjectById: function ( id ) { + + return this.getObjectByProperty( 'id', id ); + + }, + + getObjectByName: function ( name ) { + + return this.getObjectByProperty( 'name', name ); + + }, + + getObjectByProperty: function ( name, value ) { + + if ( this[ name ] === value ) return this; + + for ( var i = 0, l = this.children.length; i < l; i ++ ) { + + var child = this.children[ i ]; + var object = child.getObjectByProperty( name, value ); + + if ( object !== undefined ) { + + return object; + + } + + } + + return undefined; + + }, + + getWorldPosition: function ( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + + this.updateMatrixWorld( true ); + + return result.setFromMatrixPosition( this.matrixWorld ); + + }, + + getWorldQuaternion: function () { + + var position = new Vector3(); + var scale = new Vector3(); + + return function getWorldQuaternion( optionalTarget ) { + + var result = optionalTarget || new Quaternion(); + + this.updateMatrixWorld( true ); + + this.matrixWorld.decompose( position, result, scale ); + + return result; + + }; + + }(), + + getWorldRotation: function () { + + var quaternion = new Quaternion(); + + return function getWorldRotation( optionalTarget ) { + + var result = optionalTarget || new Euler(); + + this.getWorldQuaternion( quaternion ); + + return result.setFromQuaternion( quaternion, this.rotation.order, false ); + + }; + + }(), + + getWorldScale: function () { + + var position = new Vector3(); + var quaternion = new Quaternion(); + + return function getWorldScale( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + + this.updateMatrixWorld( true ); + + this.matrixWorld.decompose( position, quaternion, result ); + + return result; + + }; + + }(), + + getWorldDirection: function () { + + var quaternion = new Quaternion(); + + return function getWorldDirection( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + + this.getWorldQuaternion( quaternion ); + + return result.set( 0, 0, 1 ).applyQuaternion( quaternion ); + + }; + + }(), + + raycast: function () {}, + + traverse: function ( callback ) { + + callback( this ); + + var children = this.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].traverse( callback ); + + } + + }, + + traverseVisible: function ( callback ) { + + if ( this.visible === false ) return; + + callback( this ); + + var children = this.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].traverseVisible( callback ); + + } + + }, + + traverseAncestors: function ( callback ) { + + var parent = this.parent; + + if ( parent !== null ) { + + callback( parent ); + + parent.traverseAncestors( callback ); + + } + + }, + + updateMatrix: function () { + + this.matrix.compose( this.position, this.quaternion, this.scale ); + + this.matrixWorldNeedsUpdate = true; + + }, + + updateMatrixWorld: function ( force ) { + + if ( this.matrixAutoUpdate ) this.updateMatrix(); + + if ( this.matrixWorldNeedsUpdate || force ) { + + if ( this.parent === null ) { + + this.matrixWorld.copy( this.matrix ); + + } else { + + this.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix ); + + } + + this.matrixWorldNeedsUpdate = false; + + force = true; + + } + + // update children + + var children = this.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].updateMatrixWorld( force ); + + } + + }, + + toJSON: function ( meta ) { + + // meta is '' when called from JSON.stringify + var isRootObject = ( meta === undefined || meta === '' ); + + var output = {}; + + // meta is a hash used to collect geometries, materials. + // not providing it implies that this is the root object + // being serialized. + if ( isRootObject ) { + + // initialize meta obj + meta = { + geometries: {}, + materials: {}, + textures: {}, + images: {} + }; + + output.metadata = { + version: 4.5, + type: 'Object', + generator: 'Object3D.toJSON' + }; + + } + + // standard Object3D serialization + + var object = {}; + + object.uuid = this.uuid; + object.type = this.type; + + if ( this.name !== '' ) object.name = this.name; + if ( JSON.stringify( this.userData ) !== '{}' ) object.userData = this.userData; + if ( this.castShadow === true ) object.castShadow = true; + if ( this.receiveShadow === true ) object.receiveShadow = true; + if ( this.visible === false ) object.visible = false; + + object.matrix = this.matrix.toArray(); + + // + + function serialize( library, element ) { + + if ( library[ element.uuid ] === undefined ) { + + library[ element.uuid ] = element.toJSON( meta ); + + } + + return element.uuid; + + } + + if ( this.geometry !== undefined ) { + + object.geometry = serialize( meta.geometries, this.geometry ); + + } + + if ( this.material !== undefined ) { + + if ( Array.isArray( this.material ) ) { + + var uuids = []; + + for ( var i = 0, l = this.material.length; i < l; i ++ ) { + + uuids.push( serialize( meta.materials, this.material[ i ] ) ); + + } + + object.material = uuids; + + } else { + + object.material = serialize( meta.materials, this.material ); + + } + + } + + // + + if ( this.children.length > 0 ) { + + object.children = []; + + for ( var i = 0; i < this.children.length; i ++ ) { + + object.children.push( this.children[ i ].toJSON( meta ).object ); + + } + + } + + if ( isRootObject ) { + + var geometries = extractFromCache( meta.geometries ); + var materials = extractFromCache( meta.materials ); + var textures = extractFromCache( meta.textures ); + var images = extractFromCache( meta.images ); + + if ( geometries.length > 0 ) output.geometries = geometries; + if ( materials.length > 0 ) output.materials = materials; + if ( textures.length > 0 ) output.textures = textures; + if ( images.length > 0 ) output.images = images; + + } + + output.object = object; + + return output; + + // extract data from the cache hash + // remove metadata on each item + // and return as array + function extractFromCache( cache ) { + + var values = []; + for ( var key in cache ) { + + var data = cache[ key ]; + delete data.metadata; + values.push( data ); + + } + return values; + + } + + }, + + clone: function ( recursive ) { + + return new this.constructor().copy( this, recursive ); + + }, + + copy: function ( source, recursive ) { + + if ( recursive === undefined ) recursive = true; + + this.name = source.name; + + this.up.copy( source.up ); + + this.position.copy( source.position ); + this.quaternion.copy( source.quaternion ); + this.scale.copy( source.scale ); + + this.matrix.copy( source.matrix ); + this.matrixWorld.copy( source.matrixWorld ); + + this.matrixAutoUpdate = source.matrixAutoUpdate; + this.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate; + + this.layers.mask = source.layers.mask; + this.visible = source.visible; + + this.castShadow = source.castShadow; + this.receiveShadow = source.receiveShadow; + + this.frustumCulled = source.frustumCulled; + this.renderOrder = source.renderOrder; + + this.userData = JSON.parse( JSON.stringify( source.userData ) ); + + if ( recursive === true ) { + + for ( var i = 0; i < source.children.length; i ++ ) { + + var child = source.children[ i ]; + this.add( child.clone() ); + + } + + } + + return this; + + } + + } ); + + /** + * @author bhouston / http://clara.io + */ + + function Line3( start, end ) { + + this.start = ( start !== undefined ) ? start : new Vector3(); + this.end = ( end !== undefined ) ? end : new Vector3(); + + } + + Object.assign( Line3.prototype, { + + set: function ( start, end ) { + + this.start.copy( start ); + this.end.copy( end ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( line ) { + + this.start.copy( line.start ); + this.end.copy( line.end ); + + return this; + + }, + + getCenter: function ( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + return result.addVectors( this.start, this.end ).multiplyScalar( 0.5 ); + + }, + + delta: function ( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + return result.subVectors( this.end, this.start ); + + }, + + distanceSq: function () { + + return this.start.distanceToSquared( this.end ); + + }, + + distance: function () { + + return this.start.distanceTo( this.end ); + + }, + + at: function ( t, optionalTarget ) { + + var result = optionalTarget || new Vector3(); + + return this.delta( result ).multiplyScalar( t ).add( this.start ); + + }, + + closestPointToPointParameter: function () { + + var startP = new Vector3(); + var startEnd = new Vector3(); + + return function closestPointToPointParameter( point, clampToLine ) { + + startP.subVectors( point, this.start ); + startEnd.subVectors( this.end, this.start ); + + var startEnd2 = startEnd.dot( startEnd ); + var startEnd_startP = startEnd.dot( startP ); + + var t = startEnd_startP / startEnd2; + + if ( clampToLine ) { + + t = _Math.clamp( t, 0, 1 ); + + } + + return t; + + }; + + }(), + + closestPointToPoint: function ( point, clampToLine, optionalTarget ) { + + var t = this.closestPointToPointParameter( point, clampToLine ); + + var result = optionalTarget || new Vector3(); + + return this.delta( result ).multiplyScalar( t ).add( this.start ); + + }, + + applyMatrix4: function ( matrix ) { + + this.start.applyMatrix4( matrix ); + this.end.applyMatrix4( matrix ); + + return this; + + }, + + equals: function ( line ) { + + return line.start.equals( this.start ) && line.end.equals( this.end ); + + } + + } ); + + /** + * @author bhouston / http://clara.io + * @author mrdoob / http://mrdoob.com/ + */ + + function Triangle( a, b, c ) { + + this.a = ( a !== undefined ) ? a : new Vector3(); + this.b = ( b !== undefined ) ? b : new Vector3(); + this.c = ( c !== undefined ) ? c : new Vector3(); + + } + + Object.assign( Triangle, { + + normal: function () { + + var v0 = new Vector3(); + + return function normal( a, b, c, optionalTarget ) { + + var result = optionalTarget || new Vector3(); + + result.subVectors( c, b ); + v0.subVectors( a, b ); + result.cross( v0 ); + + var resultLengthSq = result.lengthSq(); + if ( resultLengthSq > 0 ) { + + return result.multiplyScalar( 1 / Math.sqrt( resultLengthSq ) ); + + } + + return result.set( 0, 0, 0 ); + + }; + + }(), + + // static/instance method to calculate barycentric coordinates + // based on: http://www.blackpawn.com/texts/pointinpoly/default.html + barycoordFromPoint: function () { + + var v0 = new Vector3(); + var v1 = new Vector3(); + var v2 = new Vector3(); + + return function barycoordFromPoint( point, a, b, c, optionalTarget ) { + + v0.subVectors( c, a ); + v1.subVectors( b, a ); + v2.subVectors( point, a ); + + var dot00 = v0.dot( v0 ); + var dot01 = v0.dot( v1 ); + var dot02 = v0.dot( v2 ); + var dot11 = v1.dot( v1 ); + var dot12 = v1.dot( v2 ); + + var denom = ( dot00 * dot11 - dot01 * dot01 ); + + var result = optionalTarget || new Vector3(); + + // collinear or singular triangle + if ( denom === 0 ) { + + // arbitrary location outside of triangle? + // not sure if this is the best idea, maybe should be returning undefined + return result.set( - 2, - 1, - 1 ); + + } + + var invDenom = 1 / denom; + var u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom; + var v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom; + + // barycentric coordinates must always sum to 1 + return result.set( 1 - u - v, v, u ); + + }; + + }(), + + containsPoint: function () { + + var v1 = new Vector3(); + + return function containsPoint( point, a, b, c ) { + + var result = Triangle.barycoordFromPoint( point, a, b, c, v1 ); + + return ( result.x >= 0 ) && ( result.y >= 0 ) && ( ( result.x + result.y ) <= 1 ); + + }; + + }() + + } ); + + Object.assign( Triangle.prototype, { + + set: function ( a, b, c ) { + + this.a.copy( a ); + this.b.copy( b ); + this.c.copy( c ); + + return this; + + }, + + setFromPointsAndIndices: function ( points, i0, i1, i2 ) { + + this.a.copy( points[ i0 ] ); + this.b.copy( points[ i1 ] ); + this.c.copy( points[ i2 ] ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( triangle ) { + + this.a.copy( triangle.a ); + this.b.copy( triangle.b ); + this.c.copy( triangle.c ); + + return this; + + }, + + area: function () { + + var v0 = new Vector3(); + var v1 = new Vector3(); + + return function area() { + + v0.subVectors( this.c, this.b ); + v1.subVectors( this.a, this.b ); + + return v0.cross( v1 ).length() * 0.5; + + }; + + }(), + + midpoint: function ( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + return result.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 ); + + }, + + normal: function ( optionalTarget ) { + + return Triangle.normal( this.a, this.b, this.c, optionalTarget ); + + }, + + plane: function ( optionalTarget ) { + + var result = optionalTarget || new Plane(); + + return result.setFromCoplanarPoints( this.a, this.b, this.c ); + + }, + + barycoordFromPoint: function ( point, optionalTarget ) { + + return Triangle.barycoordFromPoint( point, this.a, this.b, this.c, optionalTarget ); + + }, + + containsPoint: function ( point ) { + + return Triangle.containsPoint( point, this.a, this.b, this.c ); + + }, + + closestPointToPoint: function () { + + var plane = new Plane(); + var edgeList = [ new Line3(), new Line3(), new Line3() ]; + var projectedPoint = new Vector3(); + var closestPoint = new Vector3(); + + return function closestPointToPoint( point, optionalTarget ) { + + var result = optionalTarget || new Vector3(); + var minDistance = Infinity; + + // project the point onto the plane of the triangle + + plane.setFromCoplanarPoints( this.a, this.b, this.c ); + plane.projectPoint( point, projectedPoint ); + + // check if the projection lies within the triangle + + if( this.containsPoint( projectedPoint ) === true ) { + + // if so, this is the closest point + + result.copy( projectedPoint ); + + } else { + + // if not, the point falls outside the triangle. the result is the closest point to the triangle's edges or vertices + + edgeList[ 0 ].set( this.a, this.b ); + edgeList[ 1 ].set( this.b, this.c ); + edgeList[ 2 ].set( this.c, this.a ); + + for( var i = 0; i < edgeList.length; i ++ ) { + + edgeList[ i ].closestPointToPoint( projectedPoint, true, closestPoint ); + + var distance = projectedPoint.distanceToSquared( closestPoint ); + + if( distance < minDistance ) { + + minDistance = distance; + + result.copy( closestPoint ); + + } + + } + + } + + return result; + + }; + + }(), + + equals: function ( triangle ) { + + return triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function Face3( a, b, c, normal, color, materialIndex ) { + + this.a = a; + this.b = b; + this.c = c; + + this.normal = ( normal && normal.isVector3 ) ? normal : new Vector3(); + this.vertexNormals = Array.isArray( normal ) ? normal : []; + + this.color = ( color && color.isColor ) ? color : new Color(); + this.vertexColors = Array.isArray( color ) ? color : []; + + this.materialIndex = materialIndex !== undefined ? materialIndex : 0; + + } + + Object.assign( Face3.prototype, { + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.a = source.a; + this.b = source.b; + this.c = source.c; + + this.normal.copy( source.normal ); + this.color.copy( source.color ); + + this.materialIndex = source.materialIndex; + + for ( var i = 0, il = source.vertexNormals.length; i < il; i ++ ) { + + this.vertexNormals[ i ] = source.vertexNormals[ i ].clone(); + + } + + for ( var i = 0, il = source.vertexColors.length; i < il; i ++ ) { + + this.vertexColors[ i ] = source.vertexColors[ i ].clone(); + + } + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: <hex>, + * opacity: <float>, + * map: new THREE.Texture( <Image> ), + * + * lightMap: new THREE.Texture( <Image> ), + * lightMapIntensity: <float> + * + * aoMap: new THREE.Texture( <Image> ), + * aoMapIntensity: <float> + * + * specularMap: new THREE.Texture( <Image> ), + * + * alphaMap: new THREE.Texture( <Image> ), + * + * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ), + * combine: THREE.Multiply, + * reflectivity: <float>, + * refractionRatio: <float>, + * + * shading: THREE.SmoothShading, + * depthTest: <bool>, + * depthWrite: <bool>, + * + * wireframe: <boolean>, + * wireframeLinewidth: <float>, + * + * skinning: <bool>, + * morphTargets: <bool> + * } + */ + + function MeshBasicMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshBasicMaterial'; + + this.color = new Color( 0xffffff ); // emissive + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.specularMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.combine = MultiplyOperation; + this.reflectivity = 1; + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.skinning = false; + this.morphTargets = false; + + this.lights = false; + + this.setValues( parameters ); + + } + + MeshBasicMaterial.prototype = Object.create( Material.prototype ); + MeshBasicMaterial.prototype.constructor = MeshBasicMaterial; + + MeshBasicMaterial.prototype.isMeshBasicMaterial = true; + + MeshBasicMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.specularMap = source.specularMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.combine = source.combine; + this.reflectivity = source.reflectivity; + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + + return this; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function BufferAttribute( array, itemSize, normalized ) { + + if ( Array.isArray( array ) ) { + + throw new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' ); + + } + + this.uuid = _Math.generateUUID(); + + this.array = array; + this.itemSize = itemSize; + this.count = array !== undefined ? array.length / itemSize : 0; + this.normalized = normalized === true; + + this.dynamic = false; + this.updateRange = { offset: 0, count: - 1 }; + + this.onUploadCallback = function () {}; + + this.version = 0; + + } + + Object.defineProperty( BufferAttribute.prototype, 'needsUpdate', { + + set: function ( value ) { + + if ( value === true ) this.version ++; + + } + + } ); + + Object.assign( BufferAttribute.prototype, { + + isBufferAttribute: true, + + setArray: function ( array ) { + + if ( Array.isArray( array ) ) { + + throw new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' ); + + } + + this.count = array !== undefined ? array.length / this.itemSize : 0; + this.array = array; + + }, + + setDynamic: function ( value ) { + + this.dynamic = value; + + return this; + + }, + + copy: function ( source ) { + + this.array = new source.array.constructor( source.array ); + this.itemSize = source.itemSize; + this.count = source.count; + this.normalized = source.normalized; + + this.dynamic = source.dynamic; + + return this; + + }, + + copyAt: function ( index1, attribute, index2 ) { + + index1 *= this.itemSize; + index2 *= attribute.itemSize; + + for ( var i = 0, l = this.itemSize; i < l; i ++ ) { + + this.array[ index1 + i ] = attribute.array[ index2 + i ]; + + } + + return this; + + }, + + copyArray: function ( array ) { + + this.array.set( array ); + + return this; + + }, + + copyColorsArray: function ( colors ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = colors.length; i < l; i ++ ) { + + var color = colors[ i ]; + + if ( color === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyColorsArray(): color is undefined', i ); + color = new Color(); + + } + + array[ offset ++ ] = color.r; + array[ offset ++ ] = color.g; + array[ offset ++ ] = color.b; + + } + + return this; + + }, + + copyIndicesArray: function ( indices ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = indices.length; i < l; i ++ ) { + + var index = indices[ i ]; + + array[ offset ++ ] = index.a; + array[ offset ++ ] = index.b; + array[ offset ++ ] = index.c; + + } + + return this; + + }, + + copyVector2sArray: function ( vectors ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = vectors.length; i < l; i ++ ) { + + var vector = vectors[ i ]; + + if ( vector === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyVector2sArray(): vector is undefined', i ); + vector = new Vector2(); + + } + + array[ offset ++ ] = vector.x; + array[ offset ++ ] = vector.y; + + } + + return this; + + }, + + copyVector3sArray: function ( vectors ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = vectors.length; i < l; i ++ ) { + + var vector = vectors[ i ]; + + if ( vector === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyVector3sArray(): vector is undefined', i ); + vector = new Vector3(); + + } + + array[ offset ++ ] = vector.x; + array[ offset ++ ] = vector.y; + array[ offset ++ ] = vector.z; + + } + + return this; + + }, + + copyVector4sArray: function ( vectors ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = vectors.length; i < l; i ++ ) { + + var vector = vectors[ i ]; + + if ( vector === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyVector4sArray(): vector is undefined', i ); + vector = new Vector4(); + + } + + array[ offset ++ ] = vector.x; + array[ offset ++ ] = vector.y; + array[ offset ++ ] = vector.z; + array[ offset ++ ] = vector.w; + + } + + return this; + + }, + + set: function ( value, offset ) { + + if ( offset === undefined ) offset = 0; + + this.array.set( value, offset ); + + return this; + + }, + + getX: function ( index ) { + + return this.array[ index * this.itemSize ]; + + }, + + setX: function ( index, x ) { + + this.array[ index * this.itemSize ] = x; + + return this; + + }, + + getY: function ( index ) { + + return this.array[ index * this.itemSize + 1 ]; + + }, + + setY: function ( index, y ) { + + this.array[ index * this.itemSize + 1 ] = y; + + return this; + + }, + + getZ: function ( index ) { + + return this.array[ index * this.itemSize + 2 ]; + + }, + + setZ: function ( index, z ) { + + this.array[ index * this.itemSize + 2 ] = z; + + return this; + + }, + + getW: function ( index ) { + + return this.array[ index * this.itemSize + 3 ]; + + }, + + setW: function ( index, w ) { + + this.array[ index * this.itemSize + 3 ] = w; + + return this; + + }, + + setXY: function ( index, x, y ) { + + index *= this.itemSize; + + this.array[ index + 0 ] = x; + this.array[ index + 1 ] = y; + + return this; + + }, + + setXYZ: function ( index, x, y, z ) { + + index *= this.itemSize; + + this.array[ index + 0 ] = x; + this.array[ index + 1 ] = y; + this.array[ index + 2 ] = z; + + return this; + + }, + + setXYZW: function ( index, x, y, z, w ) { + + index *= this.itemSize; + + this.array[ index + 0 ] = x; + this.array[ index + 1 ] = y; + this.array[ index + 2 ] = z; + this.array[ index + 3 ] = w; + + return this; + + }, + + onUpload: function ( callback ) { + + this.onUploadCallback = callback; + + return this; + + }, + + clone: function () { + + return new this.constructor( this.array, this.itemSize ).copy( this ); + + } + + } ); + + // + + function Int8BufferAttribute( array, itemSize ) { + + BufferAttribute.call( this, new Int8Array( array ), itemSize ); + + } + + Int8BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Int8BufferAttribute.prototype.constructor = Int8BufferAttribute; + + + function Uint8BufferAttribute( array, itemSize ) { + + BufferAttribute.call( this, new Uint8Array( array ), itemSize ); + + } + + Uint8BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Uint8BufferAttribute.prototype.constructor = Uint8BufferAttribute; + + + function Uint8ClampedBufferAttribute( array, itemSize ) { + + BufferAttribute.call( this, new Uint8ClampedArray( array ), itemSize ); + + } + + Uint8ClampedBufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Uint8ClampedBufferAttribute.prototype.constructor = Uint8ClampedBufferAttribute; + + + function Int16BufferAttribute( array, itemSize ) { + + BufferAttribute.call( this, new Int16Array( array ), itemSize ); + + } + + Int16BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Int16BufferAttribute.prototype.constructor = Int16BufferAttribute; + + + function Uint16BufferAttribute( array, itemSize ) { + + BufferAttribute.call( this, new Uint16Array( array ), itemSize ); + + } + + Uint16BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Uint16BufferAttribute.prototype.constructor = Uint16BufferAttribute; + + + function Int32BufferAttribute( array, itemSize ) { + + BufferAttribute.call( this, new Int32Array( array ), itemSize ); + + } + + Int32BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Int32BufferAttribute.prototype.constructor = Int32BufferAttribute; + + + function Uint32BufferAttribute( array, itemSize ) { + + BufferAttribute.call( this, new Uint32Array( array ), itemSize ); + + } + + Uint32BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Uint32BufferAttribute.prototype.constructor = Uint32BufferAttribute; + + + function Float32BufferAttribute( array, itemSize ) { + + BufferAttribute.call( this, new Float32Array( array ), itemSize ); + + } + + Float32BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Float32BufferAttribute.prototype.constructor = Float32BufferAttribute; + + + function Float64BufferAttribute( array, itemSize ) { + + BufferAttribute.call( this, new Float64Array( array ), itemSize ); + + } + + Float64BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Float64BufferAttribute.prototype.constructor = Float64BufferAttribute; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function DirectGeometry() { + + this.indices = []; + this.vertices = []; + this.normals = []; + this.colors = []; + this.uvs = []; + this.uvs2 = []; + + this.groups = []; + + this.morphTargets = {}; + + this.skinWeights = []; + this.skinIndices = []; + + // this.lineDistances = []; + + this.boundingBox = null; + this.boundingSphere = null; + + // update flags + + this.verticesNeedUpdate = false; + this.normalsNeedUpdate = false; + this.colorsNeedUpdate = false; + this.uvsNeedUpdate = false; + this.groupsNeedUpdate = false; + + } + + Object.assign( DirectGeometry.prototype, { + + computeGroups: function ( geometry ) { + + var group; + var groups = []; + var materialIndex = undefined; + + var faces = geometry.faces; + + for ( var i = 0; i < faces.length; i ++ ) { + + var face = faces[ i ]; + + // materials + + if ( face.materialIndex !== materialIndex ) { + + materialIndex = face.materialIndex; + + if ( group !== undefined ) { + + group.count = ( i * 3 ) - group.start; + groups.push( group ); + + } + + group = { + start: i * 3, + materialIndex: materialIndex + }; + + } + + } + + if ( group !== undefined ) { + + group.count = ( i * 3 ) - group.start; + groups.push( group ); + + } + + this.groups = groups; + + }, + + fromGeometry: function ( geometry ) { + + var faces = geometry.faces; + var vertices = geometry.vertices; + var faceVertexUvs = geometry.faceVertexUvs; + + var hasFaceVertexUv = faceVertexUvs[ 0 ] && faceVertexUvs[ 0 ].length > 0; + var hasFaceVertexUv2 = faceVertexUvs[ 1 ] && faceVertexUvs[ 1 ].length > 0; + + // morphs + + var morphTargets = geometry.morphTargets; + var morphTargetsLength = morphTargets.length; + + var morphTargetsPosition; + + if ( morphTargetsLength > 0 ) { + + morphTargetsPosition = []; + + for ( var i = 0; i < morphTargetsLength; i ++ ) { + + morphTargetsPosition[ i ] = []; + + } + + this.morphTargets.position = morphTargetsPosition; + + } + + var morphNormals = geometry.morphNormals; + var morphNormalsLength = morphNormals.length; + + var morphTargetsNormal; + + if ( morphNormalsLength > 0 ) { + + morphTargetsNormal = []; + + for ( var i = 0; i < morphNormalsLength; i ++ ) { + + morphTargetsNormal[ i ] = []; + + } + + this.morphTargets.normal = morphTargetsNormal; + + } + + // skins + + var skinIndices = geometry.skinIndices; + var skinWeights = geometry.skinWeights; + + var hasSkinIndices = skinIndices.length === vertices.length; + var hasSkinWeights = skinWeights.length === vertices.length; + + // + + for ( var i = 0; i < faces.length; i ++ ) { + + var face = faces[ i ]; + + this.vertices.push( vertices[ face.a ], vertices[ face.b ], vertices[ face.c ] ); + + var vertexNormals = face.vertexNormals; + + if ( vertexNormals.length === 3 ) { + + this.normals.push( vertexNormals[ 0 ], vertexNormals[ 1 ], vertexNormals[ 2 ] ); + + } else { + + var normal = face.normal; + + this.normals.push( normal, normal, normal ); + + } + + var vertexColors = face.vertexColors; + + if ( vertexColors.length === 3 ) { + + this.colors.push( vertexColors[ 0 ], vertexColors[ 1 ], vertexColors[ 2 ] ); + + } else { + + var color = face.color; + + this.colors.push( color, color, color ); + + } + + if ( hasFaceVertexUv === true ) { + + var vertexUvs = faceVertexUvs[ 0 ][ i ]; + + if ( vertexUvs !== undefined ) { + + this.uvs.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] ); + + } else { + + console.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ', i ); + + this.uvs.push( new Vector2(), new Vector2(), new Vector2() ); + + } + + } + + if ( hasFaceVertexUv2 === true ) { + + var vertexUvs = faceVertexUvs[ 1 ][ i ]; + + if ( vertexUvs !== undefined ) { + + this.uvs2.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] ); + + } else { + + console.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ', i ); + + this.uvs2.push( new Vector2(), new Vector2(), new Vector2() ); + + } + + } + + // morphs + + for ( var j = 0; j < morphTargetsLength; j ++ ) { + + var morphTarget = morphTargets[ j ].vertices; + + morphTargetsPosition[ j ].push( morphTarget[ face.a ], morphTarget[ face.b ], morphTarget[ face.c ] ); + + } + + for ( var j = 0; j < morphNormalsLength; j ++ ) { + + var morphNormal = morphNormals[ j ].vertexNormals[ i ]; + + morphTargetsNormal[ j ].push( morphNormal.a, morphNormal.b, morphNormal.c ); + + } + + // skins + + if ( hasSkinIndices ) { + + this.skinIndices.push( skinIndices[ face.a ], skinIndices[ face.b ], skinIndices[ face.c ] ); + + } + + if ( hasSkinWeights ) { + + this.skinWeights.push( skinWeights[ face.a ], skinWeights[ face.b ], skinWeights[ face.c ] ); + + } + + } + + this.computeGroups( geometry ); + + this.verticesNeedUpdate = geometry.verticesNeedUpdate; + this.normalsNeedUpdate = geometry.normalsNeedUpdate; + this.colorsNeedUpdate = geometry.colorsNeedUpdate; + this.uvsNeedUpdate = geometry.uvsNeedUpdate; + this.groupsNeedUpdate = geometry.groupsNeedUpdate; + + return this; + + } + + } ); + + function arrayMax( array ) { + + if ( array.length === 0 ) return - Infinity; + + var max = array[ 0 ]; + + for ( var i = 1, l = array.length; i < l; ++ i ) { + + if ( array[ i ] > max ) max = array[ i ]; + + } + + return max; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + * @author kile / http://kile.stravaganza.org/ + * @author alteredq / http://alteredqualia.com/ + * @author mikael emtinger / http://gomo.se/ + * @author zz85 / http://www.lab4games.net/zz85/blog + * @author bhouston / http://clara.io + */ + + var count = 0; + function GeometryIdCount() { return count++; } + + function Geometry() { + + Object.defineProperty( this, 'id', { value: GeometryIdCount() } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + this.type = 'Geometry'; + + this.vertices = []; + this.colors = []; + this.faces = []; + this.faceVertexUvs = [[]]; + + this.morphTargets = []; + this.morphNormals = []; + + this.skinWeights = []; + this.skinIndices = []; + + this.lineDistances = []; + + this.boundingBox = null; + this.boundingSphere = null; + + // update flags + + this.elementsNeedUpdate = false; + this.verticesNeedUpdate = false; + this.uvsNeedUpdate = false; + this.normalsNeedUpdate = false; + this.colorsNeedUpdate = false; + this.lineDistancesNeedUpdate = false; + this.groupsNeedUpdate = false; + + } + + Object.assign( Geometry.prototype, EventDispatcher.prototype, { + + isGeometry: true, + + applyMatrix: function ( matrix ) { + + var normalMatrix = new Matrix3().getNormalMatrix( matrix ); + + for ( var i = 0, il = this.vertices.length; i < il; i ++ ) { + + var vertex = this.vertices[ i ]; + vertex.applyMatrix4( matrix ); + + } + + for ( var i = 0, il = this.faces.length; i < il; i ++ ) { + + var face = this.faces[ i ]; + face.normal.applyMatrix3( normalMatrix ).normalize(); + + for ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) { + + face.vertexNormals[ j ].applyMatrix3( normalMatrix ).normalize(); + + } + + } + + if ( this.boundingBox !== null ) { + + this.computeBoundingBox(); + + } + + if ( this.boundingSphere !== null ) { + + this.computeBoundingSphere(); + + } + + this.verticesNeedUpdate = true; + this.normalsNeedUpdate = true; + + return this; + + }, + + rotateX: function () { + + // rotate geometry around world x-axis + + var m1 = new Matrix4(); + + return function rotateX( angle ) { + + m1.makeRotationX( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + rotateY: function () { + + // rotate geometry around world y-axis + + var m1 = new Matrix4(); + + return function rotateY( angle ) { + + m1.makeRotationY( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + rotateZ: function () { + + // rotate geometry around world z-axis + + var m1 = new Matrix4(); + + return function rotateZ( angle ) { + + m1.makeRotationZ( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + translate: function () { + + // translate geometry + + var m1 = new Matrix4(); + + return function translate( x, y, z ) { + + m1.makeTranslation( x, y, z ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + scale: function () { + + // scale geometry + + var m1 = new Matrix4(); + + return function scale( x, y, z ) { + + m1.makeScale( x, y, z ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + lookAt: function () { + + var obj = new Object3D(); + + return function lookAt( vector ) { + + obj.lookAt( vector ); + + obj.updateMatrix(); + + this.applyMatrix( obj.matrix ); + + }; + + }(), + + fromBufferGeometry: function ( geometry ) { + + var scope = this; + + var indices = geometry.index !== null ? geometry.index.array : undefined; + var attributes = geometry.attributes; + + var positions = attributes.position.array; + var normals = attributes.normal !== undefined ? attributes.normal.array : undefined; + var colors = attributes.color !== undefined ? attributes.color.array : undefined; + var uvs = attributes.uv !== undefined ? attributes.uv.array : undefined; + var uvs2 = attributes.uv2 !== undefined ? attributes.uv2.array : undefined; + + if ( uvs2 !== undefined ) this.faceVertexUvs[ 1 ] = []; + + var tempNormals = []; + var tempUVs = []; + var tempUVs2 = []; + + for ( var i = 0, j = 0; i < positions.length; i += 3, j += 2 ) { + + scope.vertices.push( new Vector3( positions[ i ], positions[ i + 1 ], positions[ i + 2 ] ) ); + + if ( normals !== undefined ) { + + tempNormals.push( new Vector3( normals[ i ], normals[ i + 1 ], normals[ i + 2 ] ) ); + + } + + if ( colors !== undefined ) { + + scope.colors.push( new Color( colors[ i ], colors[ i + 1 ], colors[ i + 2 ] ) ); + + } + + if ( uvs !== undefined ) { + + tempUVs.push( new Vector2( uvs[ j ], uvs[ j + 1 ] ) ); + + } + + if ( uvs2 !== undefined ) { + + tempUVs2.push( new Vector2( uvs2[ j ], uvs2[ j + 1 ] ) ); + + } + + } + + function addFace( a, b, c, materialIndex ) { + + var vertexNormals = normals !== undefined ? [ tempNormals[ a ].clone(), tempNormals[ b ].clone(), tempNormals[ c ].clone() ] : []; + var vertexColors = colors !== undefined ? [ scope.colors[ a ].clone(), scope.colors[ b ].clone(), scope.colors[ c ].clone() ] : []; + + var face = new Face3( a, b, c, vertexNormals, vertexColors, materialIndex ); + + scope.faces.push( face ); + + if ( uvs !== undefined ) { + + scope.faceVertexUvs[ 0 ].push( [ tempUVs[ a ].clone(), tempUVs[ b ].clone(), tempUVs[ c ].clone() ] ); + + } + + if ( uvs2 !== undefined ) { + + scope.faceVertexUvs[ 1 ].push( [ tempUVs2[ a ].clone(), tempUVs2[ b ].clone(), tempUVs2[ c ].clone() ] ); + + } + + } + + var groups = geometry.groups; + + if ( groups.length > 0 ) { + + for ( var i = 0; i < groups.length; i ++ ) { + + var group = groups[ i ]; + + var start = group.start; + var count = group.count; + + for ( var j = start, jl = start + count; j < jl; j += 3 ) { + + if ( indices !== undefined ) { + + addFace( indices[ j ], indices[ j + 1 ], indices[ j + 2 ], group.materialIndex ); + + } else { + + addFace( j, j + 1, j + 2, group.materialIndex ); + + } + + } + + } + + } else { + + if ( indices !== undefined ) { + + for ( var i = 0; i < indices.length; i += 3 ) { + + addFace( indices[ i ], indices[ i + 1 ], indices[ i + 2 ] ); + + } + + } else { + + for ( var i = 0; i < positions.length / 3; i += 3 ) { + + addFace( i, i + 1, i + 2 ); + + } + + } + + } + + this.computeFaceNormals(); + + if ( geometry.boundingBox !== null ) { + + this.boundingBox = geometry.boundingBox.clone(); + + } + + if ( geometry.boundingSphere !== null ) { + + this.boundingSphere = geometry.boundingSphere.clone(); + + } + + return this; + + }, + + center: function () { + + this.computeBoundingBox(); + + var offset = this.boundingBox.getCenter().negate(); + + this.translate( offset.x, offset.y, offset.z ); + + return offset; + + }, + + normalize: function () { + + this.computeBoundingSphere(); + + var center = this.boundingSphere.center; + var radius = this.boundingSphere.radius; + + var s = radius === 0 ? 1 : 1.0 / radius; + + var matrix = new Matrix4(); + matrix.set( + s, 0, 0, - s * center.x, + 0, s, 0, - s * center.y, + 0, 0, s, - s * center.z, + 0, 0, 0, 1 + ); + + this.applyMatrix( matrix ); + + return this; + + }, + + computeFaceNormals: function () { + + var cb = new Vector3(), ab = new Vector3(); + + for ( var f = 0, fl = this.faces.length; f < fl; f ++ ) { + + var face = this.faces[ f ]; + + var vA = this.vertices[ face.a ]; + var vB = this.vertices[ face.b ]; + var vC = this.vertices[ face.c ]; + + cb.subVectors( vC, vB ); + ab.subVectors( vA, vB ); + cb.cross( ab ); + + cb.normalize(); + + face.normal.copy( cb ); + + } + + }, + + computeVertexNormals: function ( areaWeighted ) { + + if ( areaWeighted === undefined ) areaWeighted = true; + + var v, vl, f, fl, face, vertices; + + vertices = new Array( this.vertices.length ); + + for ( v = 0, vl = this.vertices.length; v < vl; v ++ ) { + + vertices[ v ] = new Vector3(); + + } + + if ( areaWeighted ) { + + // vertex normals weighted by triangle areas + // http://www.iquilezles.org/www/articles/normals/normals.htm + + var vA, vB, vC; + var cb = new Vector3(), ab = new Vector3(); + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + vA = this.vertices[ face.a ]; + vB = this.vertices[ face.b ]; + vC = this.vertices[ face.c ]; + + cb.subVectors( vC, vB ); + ab.subVectors( vA, vB ); + cb.cross( ab ); + + vertices[ face.a ].add( cb ); + vertices[ face.b ].add( cb ); + vertices[ face.c ].add( cb ); + + } + + } else { + + this.computeFaceNormals(); + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + vertices[ face.a ].add( face.normal ); + vertices[ face.b ].add( face.normal ); + vertices[ face.c ].add( face.normal ); + + } + + } + + for ( v = 0, vl = this.vertices.length; v < vl; v ++ ) { + + vertices[ v ].normalize(); + + } + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + var vertexNormals = face.vertexNormals; + + if ( vertexNormals.length === 3 ) { + + vertexNormals[ 0 ].copy( vertices[ face.a ] ); + vertexNormals[ 1 ].copy( vertices[ face.b ] ); + vertexNormals[ 2 ].copy( vertices[ face.c ] ); + + } else { + + vertexNormals[ 0 ] = vertices[ face.a ].clone(); + vertexNormals[ 1 ] = vertices[ face.b ].clone(); + vertexNormals[ 2 ] = vertices[ face.c ].clone(); + + } + + } + + if ( this.faces.length > 0 ) { + + this.normalsNeedUpdate = true; + + } + + }, + + computeFlatVertexNormals: function () { + + var f, fl, face; + + this.computeFaceNormals(); + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + var vertexNormals = face.vertexNormals; + + if ( vertexNormals.length === 3 ) { + + vertexNormals[ 0 ].copy( face.normal ); + vertexNormals[ 1 ].copy( face.normal ); + vertexNormals[ 2 ].copy( face.normal ); + + } else { + + vertexNormals[ 0 ] = face.normal.clone(); + vertexNormals[ 1 ] = face.normal.clone(); + vertexNormals[ 2 ] = face.normal.clone(); + + } + + } + + if ( this.faces.length > 0 ) { + + this.normalsNeedUpdate = true; + + } + + }, + + computeMorphNormals: function () { + + var i, il, f, fl, face; + + // save original normals + // - create temp variables on first access + // otherwise just copy (for faster repeated calls) + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + if ( ! face.__originalFaceNormal ) { + + face.__originalFaceNormal = face.normal.clone(); + + } else { + + face.__originalFaceNormal.copy( face.normal ); + + } + + if ( ! face.__originalVertexNormals ) face.__originalVertexNormals = []; + + for ( i = 0, il = face.vertexNormals.length; i < il; i ++ ) { + + if ( ! face.__originalVertexNormals[ i ] ) { + + face.__originalVertexNormals[ i ] = face.vertexNormals[ i ].clone(); + + } else { + + face.__originalVertexNormals[ i ].copy( face.vertexNormals[ i ] ); + + } + + } + + } + + // use temp geometry to compute face and vertex normals for each morph + + var tmpGeo = new Geometry(); + tmpGeo.faces = this.faces; + + for ( i = 0, il = this.morphTargets.length; i < il; i ++ ) { + + // create on first access + + if ( ! this.morphNormals[ i ] ) { + + this.morphNormals[ i ] = {}; + this.morphNormals[ i ].faceNormals = []; + this.morphNormals[ i ].vertexNormals = []; + + var dstNormalsFace = this.morphNormals[ i ].faceNormals; + var dstNormalsVertex = this.morphNormals[ i ].vertexNormals; + + var faceNormal, vertexNormals; + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + faceNormal = new Vector3(); + vertexNormals = { a: new Vector3(), b: new Vector3(), c: new Vector3() }; + + dstNormalsFace.push( faceNormal ); + dstNormalsVertex.push( vertexNormals ); + + } + + } + + var morphNormals = this.morphNormals[ i ]; + + // set vertices to morph target + + tmpGeo.vertices = this.morphTargets[ i ].vertices; + + // compute morph normals + + tmpGeo.computeFaceNormals(); + tmpGeo.computeVertexNormals(); + + // store morph normals + + var faceNormal, vertexNormals; + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + faceNormal = morphNormals.faceNormals[ f ]; + vertexNormals = morphNormals.vertexNormals[ f ]; + + faceNormal.copy( face.normal ); + + vertexNormals.a.copy( face.vertexNormals[ 0 ] ); + vertexNormals.b.copy( face.vertexNormals[ 1 ] ); + vertexNormals.c.copy( face.vertexNormals[ 2 ] ); + + } + + } + + // restore original normals + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + face.normal = face.__originalFaceNormal; + face.vertexNormals = face.__originalVertexNormals; + + } + + }, + + computeLineDistances: function () { + + var d = 0; + var vertices = this.vertices; + + for ( var i = 0, il = vertices.length; i < il; i ++ ) { + + if ( i > 0 ) { + + d += vertices[ i ].distanceTo( vertices[ i - 1 ] ); + + } + + this.lineDistances[ i ] = d; + + } + + }, + + computeBoundingBox: function () { + + if ( this.boundingBox === null ) { + + this.boundingBox = new Box3(); + + } + + this.boundingBox.setFromPoints( this.vertices ); + + }, + + computeBoundingSphere: function () { + + if ( this.boundingSphere === null ) { + + this.boundingSphere = new Sphere(); + + } + + this.boundingSphere.setFromPoints( this.vertices ); + + }, + + merge: function ( geometry, matrix, materialIndexOffset ) { + + if ( ( geometry && geometry.isGeometry ) === false ) { + + console.error( 'THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.', geometry ); + return; + + } + + var normalMatrix, + vertexOffset = this.vertices.length, + vertices1 = this.vertices, + vertices2 = geometry.vertices, + faces1 = this.faces, + faces2 = geometry.faces, + uvs1 = this.faceVertexUvs[ 0 ], + uvs2 = geometry.faceVertexUvs[ 0 ], + colors1 = this.colors, + colors2 = geometry.colors; + + if ( materialIndexOffset === undefined ) materialIndexOffset = 0; + + if ( matrix !== undefined ) { + + normalMatrix = new Matrix3().getNormalMatrix( matrix ); + + } + + // vertices + + for ( var i = 0, il = vertices2.length; i < il; i ++ ) { + + var vertex = vertices2[ i ]; + + var vertexCopy = vertex.clone(); + + if ( matrix !== undefined ) vertexCopy.applyMatrix4( matrix ); + + vertices1.push( vertexCopy ); + + } + + // colors + + for ( var i = 0, il = colors2.length; i < il; i ++ ) { + + colors1.push( colors2[ i ].clone() ); + + } + + // faces + + for ( i = 0, il = faces2.length; i < il; i ++ ) { + + var face = faces2[ i ], faceCopy, normal, color, + faceVertexNormals = face.vertexNormals, + faceVertexColors = face.vertexColors; + + faceCopy = new Face3( face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset ); + faceCopy.normal.copy( face.normal ); + + if ( normalMatrix !== undefined ) { + + faceCopy.normal.applyMatrix3( normalMatrix ).normalize(); + + } + + for ( var j = 0, jl = faceVertexNormals.length; j < jl; j ++ ) { + + normal = faceVertexNormals[ j ].clone(); + + if ( normalMatrix !== undefined ) { + + normal.applyMatrix3( normalMatrix ).normalize(); + + } + + faceCopy.vertexNormals.push( normal ); + + } + + faceCopy.color.copy( face.color ); + + for ( var j = 0, jl = faceVertexColors.length; j < jl; j ++ ) { + + color = faceVertexColors[ j ]; + faceCopy.vertexColors.push( color.clone() ); + + } + + faceCopy.materialIndex = face.materialIndex + materialIndexOffset; + + faces1.push( faceCopy ); + + } + + // uvs + + for ( i = 0, il = uvs2.length; i < il; i ++ ) { + + var uv = uvs2[ i ], uvCopy = []; + + if ( uv === undefined ) { + + continue; + + } + + for ( var j = 0, jl = uv.length; j < jl; j ++ ) { + + uvCopy.push( uv[ j ].clone() ); + + } + + uvs1.push( uvCopy ); + + } + + }, + + mergeMesh: function ( mesh ) { + + if ( ( mesh && mesh.isMesh ) === false ) { + + console.error( 'THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.', mesh ); + return; + + } + + mesh.matrixAutoUpdate && mesh.updateMatrix(); + + this.merge( mesh.geometry, mesh.matrix ); + + }, + + /* + * Checks for duplicate vertices with hashmap. + * Duplicated vertices are removed + * and faces' vertices are updated. + */ + + mergeVertices: function () { + + var verticesMap = {}; // Hashmap for looking up vertices by position coordinates (and making sure they are unique) + var unique = [], changes = []; + + var v, key; + var precisionPoints = 4; // number of decimal points, e.g. 4 for epsilon of 0.0001 + var precision = Math.pow( 10, precisionPoints ); + var i, il, face; + var indices, j, jl; + + for ( i = 0, il = this.vertices.length; i < il; i ++ ) { + + v = this.vertices[ i ]; + key = Math.round( v.x * precision ) + '_' + Math.round( v.y * precision ) + '_' + Math.round( v.z * precision ); + + if ( verticesMap[ key ] === undefined ) { + + verticesMap[ key ] = i; + unique.push( this.vertices[ i ] ); + changes[ i ] = unique.length - 1; + + } else { + + //console.log('Duplicate vertex found. ', i, ' could be using ', verticesMap[key]); + changes[ i ] = changes[ verticesMap[ key ] ]; + + } + + } + + + // if faces are completely degenerate after merging vertices, we + // have to remove them from the geometry. + var faceIndicesToRemove = []; + + for ( i = 0, il = this.faces.length; i < il; i ++ ) { + + face = this.faces[ i ]; + + face.a = changes[ face.a ]; + face.b = changes[ face.b ]; + face.c = changes[ face.c ]; + + indices = [ face.a, face.b, face.c ]; + + // if any duplicate vertices are found in a Face3 + // we have to remove the face as nothing can be saved + for ( var n = 0; n < 3; n ++ ) { + + if ( indices[ n ] === indices[ ( n + 1 ) % 3 ] ) { + + faceIndicesToRemove.push( i ); + break; + + } + + } + + } + + for ( i = faceIndicesToRemove.length - 1; i >= 0; i -- ) { + + var idx = faceIndicesToRemove[ i ]; + + this.faces.splice( idx, 1 ); + + for ( j = 0, jl = this.faceVertexUvs.length; j < jl; j ++ ) { + + this.faceVertexUvs[ j ].splice( idx, 1 ); + + } + + } + + // Use unique set of vertices + + var diff = this.vertices.length - unique.length; + this.vertices = unique; + return diff; + + }, + + sortFacesByMaterialIndex: function () { + + var faces = this.faces; + var length = faces.length; + + // tag faces + + for ( var i = 0; i < length; i ++ ) { + + faces[ i ]._id = i; + + } + + // sort faces + + function materialIndexSort( a, b ) { + + return a.materialIndex - b.materialIndex; + + } + + faces.sort( materialIndexSort ); + + // sort uvs + + var uvs1 = this.faceVertexUvs[ 0 ]; + var uvs2 = this.faceVertexUvs[ 1 ]; + + var newUvs1, newUvs2; + + if ( uvs1 && uvs1.length === length ) newUvs1 = []; + if ( uvs2 && uvs2.length === length ) newUvs2 = []; + + for ( var i = 0; i < length; i ++ ) { + + var id = faces[ i ]._id; + + if ( newUvs1 ) newUvs1.push( uvs1[ id ] ); + if ( newUvs2 ) newUvs2.push( uvs2[ id ] ); + + } + + if ( newUvs1 ) this.faceVertexUvs[ 0 ] = newUvs1; + if ( newUvs2 ) this.faceVertexUvs[ 1 ] = newUvs2; + + }, + + toJSON: function () { + + var data = { + metadata: { + version: 4.5, + type: 'Geometry', + generator: 'Geometry.toJSON' + } + }; + + // standard Geometry serialization + + data.uuid = this.uuid; + data.type = this.type; + if ( this.name !== '' ) data.name = this.name; + + if ( this.parameters !== undefined ) { + + var parameters = this.parameters; + + for ( var key in parameters ) { + + if ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ]; + + } + + return data; + + } + + var vertices = []; + + for ( var i = 0; i < this.vertices.length; i ++ ) { + + var vertex = this.vertices[ i ]; + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + var faces = []; + var normals = []; + var normalsHash = {}; + var colors = []; + var colorsHash = {}; + var uvs = []; + var uvsHash = {}; + + for ( var i = 0; i < this.faces.length; i ++ ) { + + var face = this.faces[ i ]; + + var hasMaterial = true; + var hasFaceUv = false; // deprecated + var hasFaceVertexUv = this.faceVertexUvs[ 0 ][ i ] !== undefined; + var hasFaceNormal = face.normal.length() > 0; + var hasFaceVertexNormal = face.vertexNormals.length > 0; + var hasFaceColor = face.color.r !== 1 || face.color.g !== 1 || face.color.b !== 1; + var hasFaceVertexColor = face.vertexColors.length > 0; + + var faceType = 0; + + faceType = setBit( faceType, 0, 0 ); // isQuad + faceType = setBit( faceType, 1, hasMaterial ); + faceType = setBit( faceType, 2, hasFaceUv ); + faceType = setBit( faceType, 3, hasFaceVertexUv ); + faceType = setBit( faceType, 4, hasFaceNormal ); + faceType = setBit( faceType, 5, hasFaceVertexNormal ); + faceType = setBit( faceType, 6, hasFaceColor ); + faceType = setBit( faceType, 7, hasFaceVertexColor ); + + faces.push( faceType ); + faces.push( face.a, face.b, face.c ); + faces.push( face.materialIndex ); + + if ( hasFaceVertexUv ) { + + var faceVertexUvs = this.faceVertexUvs[ 0 ][ i ]; + + faces.push( + getUvIndex( faceVertexUvs[ 0 ] ), + getUvIndex( faceVertexUvs[ 1 ] ), + getUvIndex( faceVertexUvs[ 2 ] ) + ); + + } + + if ( hasFaceNormal ) { + + faces.push( getNormalIndex( face.normal ) ); + + } + + if ( hasFaceVertexNormal ) { + + var vertexNormals = face.vertexNormals; + + faces.push( + getNormalIndex( vertexNormals[ 0 ] ), + getNormalIndex( vertexNormals[ 1 ] ), + getNormalIndex( vertexNormals[ 2 ] ) + ); + + } + + if ( hasFaceColor ) { + + faces.push( getColorIndex( face.color ) ); + + } + + if ( hasFaceVertexColor ) { + + var vertexColors = face.vertexColors; + + faces.push( + getColorIndex( vertexColors[ 0 ] ), + getColorIndex( vertexColors[ 1 ] ), + getColorIndex( vertexColors[ 2 ] ) + ); + + } + + } + + function setBit( value, position, enabled ) { + + return enabled ? value | ( 1 << position ) : value & ( ~ ( 1 << position ) ); + + } + + function getNormalIndex( normal ) { + + var hash = normal.x.toString() + normal.y.toString() + normal.z.toString(); + + if ( normalsHash[ hash ] !== undefined ) { + + return normalsHash[ hash ]; + + } + + normalsHash[ hash ] = normals.length / 3; + normals.push( normal.x, normal.y, normal.z ); + + return normalsHash[ hash ]; + + } + + function getColorIndex( color ) { + + var hash = color.r.toString() + color.g.toString() + color.b.toString(); + + if ( colorsHash[ hash ] !== undefined ) { + + return colorsHash[ hash ]; + + } + + colorsHash[ hash ] = colors.length; + colors.push( color.getHex() ); + + return colorsHash[ hash ]; + + } + + function getUvIndex( uv ) { + + var hash = uv.x.toString() + uv.y.toString(); + + if ( uvsHash[ hash ] !== undefined ) { + + return uvsHash[ hash ]; + + } + + uvsHash[ hash ] = uvs.length / 2; + uvs.push( uv.x, uv.y ); + + return uvsHash[ hash ]; + + } + + data.data = {}; + + data.data.vertices = vertices; + data.data.normals = normals; + if ( colors.length > 0 ) data.data.colors = colors; + if ( uvs.length > 0 ) data.data.uvs = [ uvs ]; // temporal backward compatibility + data.data.faces = faces; + + return data; + + }, + + clone: function () { + + /* + // Handle primitives + + var parameters = this.parameters; + + if ( parameters !== undefined ) { + + var values = []; + + for ( var key in parameters ) { + + values.push( parameters[ key ] ); + + } + + var geometry = Object.create( this.constructor.prototype ); + this.constructor.apply( geometry, values ); + return geometry; + + } + + return new this.constructor().copy( this ); + */ + + return new Geometry().copy( this ); + + }, + + copy: function ( source ) { + + var i, il, j, jl, k, kl; + + // reset + + this.vertices = []; + this.colors = []; + this.faces = []; + this.faceVertexUvs = [[]]; + this.morphTargets = []; + this.morphNormals = []; + this.skinWeights = []; + this.skinIndices = []; + this.lineDistances = []; + this.boundingBox = null; + this.boundingSphere = null; + + // name + + this.name = source.name; + + // vertices + + var vertices = source.vertices; + + for ( i = 0, il = vertices.length; i < il; i ++ ) { + + this.vertices.push( vertices[ i ].clone() ); + + } + + // colors + + var colors = source.colors; + + for ( i = 0, il = colors.length; i < il; i ++ ) { + + this.colors.push( colors[ i ].clone() ); + + } + + // faces + + var faces = source.faces; + + for ( i = 0, il = faces.length; i < il; i ++ ) { + + this.faces.push( faces[ i ].clone() ); + + } + + // face vertex uvs + + for ( i = 0, il = source.faceVertexUvs.length; i < il; i ++ ) { + + var faceVertexUvs = source.faceVertexUvs[ i ]; + + if ( this.faceVertexUvs[ i ] === undefined ) { + + this.faceVertexUvs[ i ] = []; + + } + + for ( j = 0, jl = faceVertexUvs.length; j < jl; j ++ ) { + + var uvs = faceVertexUvs[ j ], uvsCopy = []; + + for ( k = 0, kl = uvs.length; k < kl; k ++ ) { + + var uv = uvs[ k ]; + + uvsCopy.push( uv.clone() ); + + } + + this.faceVertexUvs[ i ].push( uvsCopy ); + + } + + } + + // morph targets + + var morphTargets = source.morphTargets; + + for ( i = 0, il = morphTargets.length; i < il; i ++ ) { + + var morphTarget = {}; + morphTarget.name = morphTargets[ i ].name; + + // vertices + + if ( morphTargets[ i ].vertices !== undefined ) { + + morphTarget.vertices = []; + + for ( j = 0, jl = morphTargets[ i ].vertices.length; j < jl; j ++ ) { + + morphTarget.vertices.push( morphTargets[ i ].vertices[ j ].clone() ); + + } + + } + + // normals + + if ( morphTargets[ i ].normals !== undefined ) { + + morphTarget.normals = []; + + for ( j = 0, jl = morphTargets[ i ].normals.length; j < jl; j ++ ) { + + morphTarget.normals.push( morphTargets[ i ].normals[ j ].clone() ); + + } + + } + + this.morphTargets.push( morphTarget ); + + } + + // morph normals + + var morphNormals = source.morphNormals; + + for ( i = 0, il = morphNormals.length; i < il; i ++ ) { + + var morphNormal = {}; + + // vertex normals + + if ( morphNormals[ i ].vertexNormals !== undefined ) { + + morphNormal.vertexNormals = []; + + for ( j = 0, jl = morphNormals[ i ].vertexNormals.length; j < jl; j ++ ) { + + var srcVertexNormal = morphNormals[ i ].vertexNormals[ j ]; + var destVertexNormal = {}; + + destVertexNormal.a = srcVertexNormal.a.clone(); + destVertexNormal.b = srcVertexNormal.b.clone(); + destVertexNormal.c = srcVertexNormal.c.clone(); + + morphNormal.vertexNormals.push( destVertexNormal ); + + } + + } + + // face normals + + if ( morphNormals[ i ].faceNormals !== undefined ) { + + morphNormal.faceNormals = []; + + for ( j = 0, jl = morphNormals[ i ].faceNormals.length; j < jl; j ++ ) { + + morphNormal.faceNormals.push( morphNormals[ i ].faceNormals[ j ].clone() ); + + } + + } + + this.morphNormals.push( morphNormal ); + + } + + // skin weights + + var skinWeights = source.skinWeights; + + for ( i = 0, il = skinWeights.length; i < il; i ++ ) { + + this.skinWeights.push( skinWeights[ i ].clone() ); + + } + + // skin indices + + var skinIndices = source.skinIndices; + + for ( i = 0, il = skinIndices.length; i < il; i ++ ) { + + this.skinIndices.push( skinIndices[ i ].clone() ); + + } + + // line distances + + var lineDistances = source.lineDistances; + + for ( i = 0, il = lineDistances.length; i < il; i ++ ) { + + this.lineDistances.push( lineDistances[ i ] ); + + } + + // bounding box + + var boundingBox = source.boundingBox; + + if ( boundingBox !== null ) { + + this.boundingBox = boundingBox.clone(); + + } + + // bounding sphere + + var boundingSphere = source.boundingSphere; + + if ( boundingSphere !== null ) { + + this.boundingSphere = boundingSphere.clone(); + + } + + // update flags + + this.elementsNeedUpdate = source.elementsNeedUpdate; + this.verticesNeedUpdate = source.verticesNeedUpdate; + this.uvsNeedUpdate = source.uvsNeedUpdate; + this.normalsNeedUpdate = source.normalsNeedUpdate; + this.colorsNeedUpdate = source.colorsNeedUpdate; + this.lineDistancesNeedUpdate = source.lineDistancesNeedUpdate; + this.groupsNeedUpdate = source.groupsNeedUpdate; + + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + function BufferGeometry() { + + Object.defineProperty( this, 'id', { value: GeometryIdCount() } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + this.type = 'BufferGeometry'; + + this.index = null; + this.attributes = {}; + + this.morphAttributes = {}; + + this.groups = []; + + this.boundingBox = null; + this.boundingSphere = null; + + this.drawRange = { start: 0, count: Infinity }; + + } + + BufferGeometry.MaxIndex = 65535; + + Object.assign( BufferGeometry.prototype, EventDispatcher.prototype, { + + isBufferGeometry: true, + + getIndex: function () { + + return this.index; + + }, + + setIndex: function ( index ) { + + if ( Array.isArray( index ) ) { + + this.index = new ( arrayMax( index ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( index, 1 ); + + } else { + + this.index = index; + + } + + }, + + addAttribute: function ( name, attribute ) { + + if ( ( attribute && attribute.isBufferAttribute ) === false && ( attribute && attribute.isInterleavedBufferAttribute ) === false ) { + + console.warn( 'THREE.BufferGeometry: .addAttribute() now expects ( name, attribute ).' ); + + this.addAttribute( name, new BufferAttribute( arguments[ 1 ], arguments[ 2 ] ) ); + + return; + + } + + if ( name === 'index' ) { + + console.warn( 'THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute.' ); + this.setIndex( attribute ); + + return; + + } + + this.attributes[ name ] = attribute; + + return this; + + }, + + getAttribute: function ( name ) { + + return this.attributes[ name ]; + + }, + + removeAttribute: function ( name ) { + + delete this.attributes[ name ]; + + return this; + + }, + + addGroup: function ( start, count, materialIndex ) { + + this.groups.push( { + + start: start, + count: count, + materialIndex: materialIndex !== undefined ? materialIndex : 0 + + } ); + + }, + + clearGroups: function () { + + this.groups = []; + + }, + + setDrawRange: function ( start, count ) { + + this.drawRange.start = start; + this.drawRange.count = count; + + }, + + applyMatrix: function ( matrix ) { + + var position = this.attributes.position; + + if ( position !== undefined ) { + + matrix.applyToBufferAttribute( position ); + position.needsUpdate = true; + + } + + var normal = this.attributes.normal; + + if ( normal !== undefined ) { + + var normalMatrix = new Matrix3().getNormalMatrix( matrix ); + + normalMatrix.applyToBufferAttribute( normal ); + normal.needsUpdate = true; + + } + + if ( this.boundingBox !== null ) { + + this.computeBoundingBox(); + + } + + if ( this.boundingSphere !== null ) { + + this.computeBoundingSphere(); + + } + + return this; + + }, + + rotateX: function () { + + // rotate geometry around world x-axis + + var m1 = new Matrix4(); + + return function rotateX( angle ) { + + m1.makeRotationX( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + rotateY: function () { + + // rotate geometry around world y-axis + + var m1 = new Matrix4(); + + return function rotateY( angle ) { + + m1.makeRotationY( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + rotateZ: function () { + + // rotate geometry around world z-axis + + var m1 = new Matrix4(); + + return function rotateZ( angle ) { + + m1.makeRotationZ( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + translate: function () { + + // translate geometry + + var m1 = new Matrix4(); + + return function translate( x, y, z ) { + + m1.makeTranslation( x, y, z ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + scale: function () { + + // scale geometry + + var m1 = new Matrix4(); + + return function scale( x, y, z ) { + + m1.makeScale( x, y, z ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + lookAt: function () { + + var obj = new Object3D(); + + return function lookAt( vector ) { + + obj.lookAt( vector ); + + obj.updateMatrix(); + + this.applyMatrix( obj.matrix ); + + }; + + }(), + + center: function () { + + this.computeBoundingBox(); + + var offset = this.boundingBox.getCenter().negate(); + + this.translate( offset.x, offset.y, offset.z ); + + return offset; + + }, + + setFromObject: function ( object ) { + + // console.log( 'THREE.BufferGeometry.setFromObject(). Converting', object, this ); + + var geometry = object.geometry; + + if ( object.isPoints || object.isLine ) { + + var positions = new Float32BufferAttribute( geometry.vertices.length * 3, 3 ); + var colors = new Float32BufferAttribute( geometry.colors.length * 3, 3 ); + + this.addAttribute( 'position', positions.copyVector3sArray( geometry.vertices ) ); + this.addAttribute( 'color', colors.copyColorsArray( geometry.colors ) ); + + if ( geometry.lineDistances && geometry.lineDistances.length === geometry.vertices.length ) { + + var lineDistances = new Float32BufferAttribute( geometry.lineDistances.length, 1 ); + + this.addAttribute( 'lineDistance', lineDistances.copyArray( geometry.lineDistances ) ); + + } + + if ( geometry.boundingSphere !== null ) { + + this.boundingSphere = geometry.boundingSphere.clone(); + + } + + if ( geometry.boundingBox !== null ) { + + this.boundingBox = geometry.boundingBox.clone(); + + } + + } else if ( object.isMesh ) { + + if ( geometry && geometry.isGeometry ) { + + this.fromGeometry( geometry ); + + } + + } + + return this; + + }, + + updateFromObject: function ( object ) { + + var geometry = object.geometry; + + if ( object.isMesh ) { + + var direct = geometry.__directGeometry; + + if ( geometry.elementsNeedUpdate === true ) { + + direct = undefined; + geometry.elementsNeedUpdate = false; + + } + + if ( direct === undefined ) { + + return this.fromGeometry( geometry ); + + } + + direct.verticesNeedUpdate = geometry.verticesNeedUpdate; + direct.normalsNeedUpdate = geometry.normalsNeedUpdate; + direct.colorsNeedUpdate = geometry.colorsNeedUpdate; + direct.uvsNeedUpdate = geometry.uvsNeedUpdate; + direct.groupsNeedUpdate = geometry.groupsNeedUpdate; + + geometry.verticesNeedUpdate = false; + geometry.normalsNeedUpdate = false; + geometry.colorsNeedUpdate = false; + geometry.uvsNeedUpdate = false; + geometry.groupsNeedUpdate = false; + + geometry = direct; + + } + + var attribute; + + if ( geometry.verticesNeedUpdate === true ) { + + attribute = this.attributes.position; + + if ( attribute !== undefined ) { + + attribute.copyVector3sArray( geometry.vertices ); + attribute.needsUpdate = true; + + } + + geometry.verticesNeedUpdate = false; + + } + + if ( geometry.normalsNeedUpdate === true ) { + + attribute = this.attributes.normal; + + if ( attribute !== undefined ) { + + attribute.copyVector3sArray( geometry.normals ); + attribute.needsUpdate = true; + + } + + geometry.normalsNeedUpdate = false; + + } + + if ( geometry.colorsNeedUpdate === true ) { + + attribute = this.attributes.color; + + if ( attribute !== undefined ) { + + attribute.copyColorsArray( geometry.colors ); + attribute.needsUpdate = true; + + } + + geometry.colorsNeedUpdate = false; + + } + + if ( geometry.uvsNeedUpdate ) { + + attribute = this.attributes.uv; + + if ( attribute !== undefined ) { + + attribute.copyVector2sArray( geometry.uvs ); + attribute.needsUpdate = true; + + } + + geometry.uvsNeedUpdate = false; + + } + + if ( geometry.lineDistancesNeedUpdate ) { + + attribute = this.attributes.lineDistance; + + if ( attribute !== undefined ) { + + attribute.copyArray( geometry.lineDistances ); + attribute.needsUpdate = true; + + } + + geometry.lineDistancesNeedUpdate = false; + + } + + if ( geometry.groupsNeedUpdate ) { + + geometry.computeGroups( object.geometry ); + this.groups = geometry.groups; + + geometry.groupsNeedUpdate = false; + + } + + return this; + + }, + + fromGeometry: function ( geometry ) { + + geometry.__directGeometry = new DirectGeometry().fromGeometry( geometry ); + + return this.fromDirectGeometry( geometry.__directGeometry ); + + }, + + fromDirectGeometry: function ( geometry ) { + + var positions = new Float32Array( geometry.vertices.length * 3 ); + this.addAttribute( 'position', new BufferAttribute( positions, 3 ).copyVector3sArray( geometry.vertices ) ); + + if ( geometry.normals.length > 0 ) { + + var normals = new Float32Array( geometry.normals.length * 3 ); + this.addAttribute( 'normal', new BufferAttribute( normals, 3 ).copyVector3sArray( geometry.normals ) ); + + } + + if ( geometry.colors.length > 0 ) { + + var colors = new Float32Array( geometry.colors.length * 3 ); + this.addAttribute( 'color', new BufferAttribute( colors, 3 ).copyColorsArray( geometry.colors ) ); + + } + + if ( geometry.uvs.length > 0 ) { + + var uvs = new Float32Array( geometry.uvs.length * 2 ); + this.addAttribute( 'uv', new BufferAttribute( uvs, 2 ).copyVector2sArray( geometry.uvs ) ); + + } + + if ( geometry.uvs2.length > 0 ) { + + var uvs2 = new Float32Array( geometry.uvs2.length * 2 ); + this.addAttribute( 'uv2', new BufferAttribute( uvs2, 2 ).copyVector2sArray( geometry.uvs2 ) ); + + } + + if ( geometry.indices.length > 0 ) { + + var TypeArray = arrayMax( geometry.indices ) > 65535 ? Uint32Array : Uint16Array; + var indices = new TypeArray( geometry.indices.length * 3 ); + this.setIndex( new BufferAttribute( indices, 1 ).copyIndicesArray( geometry.indices ) ); + + } + + // groups + + this.groups = geometry.groups; + + // morphs + + for ( var name in geometry.morphTargets ) { + + var array = []; + var morphTargets = geometry.morphTargets[ name ]; + + for ( var i = 0, l = morphTargets.length; i < l; i ++ ) { + + var morphTarget = morphTargets[ i ]; + + var attribute = new Float32BufferAttribute( morphTarget.length * 3, 3 ); + + array.push( attribute.copyVector3sArray( morphTarget ) ); + + } + + this.morphAttributes[ name ] = array; + + } + + // skinning + + if ( geometry.skinIndices.length > 0 ) { + + var skinIndices = new Float32BufferAttribute( geometry.skinIndices.length * 4, 4 ); + this.addAttribute( 'skinIndex', skinIndices.copyVector4sArray( geometry.skinIndices ) ); + + } + + if ( geometry.skinWeights.length > 0 ) { + + var skinWeights = new Float32BufferAttribute( geometry.skinWeights.length * 4, 4 ); + this.addAttribute( 'skinWeight', skinWeights.copyVector4sArray( geometry.skinWeights ) ); + + } + + // + + if ( geometry.boundingSphere !== null ) { + + this.boundingSphere = geometry.boundingSphere.clone(); + + } + + if ( geometry.boundingBox !== null ) { + + this.boundingBox = geometry.boundingBox.clone(); + + } + + return this; + + }, + + computeBoundingBox: function () { + + if ( this.boundingBox === null ) { + + this.boundingBox = new Box3(); + + } + + var position = this.attributes.position; + + if ( position !== undefined ) { + + this.boundingBox.setFromBufferAttribute( position ); + + } else { + + this.boundingBox.makeEmpty(); + + } + + if ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) { + + console.error( 'THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The "position" attribute is likely to have NaN values.', this ); + + } + + }, + + computeBoundingSphere: function () { + + var box = new Box3(); + var vector = new Vector3(); + + return function computeBoundingSphere() { + + if ( this.boundingSphere === null ) { + + this.boundingSphere = new Sphere(); + + } + + var position = this.attributes.position; + + if ( position ) { + + var center = this.boundingSphere.center; + + box.setFromBufferAttribute( position ); + box.getCenter( center ); + + // hoping to find a boundingSphere with a radius smaller than the + // boundingSphere of the boundingBox: sqrt(3) smaller in the best case + + var maxRadiusSq = 0; + + for ( var i = 0, il = position.count; i < il; i ++ ) { + + vector.x = position.getX( i ); + vector.y = position.getY( i ); + vector.z = position.getZ( i ); + maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( vector ) ); + + } + + this.boundingSphere.radius = Math.sqrt( maxRadiusSq ); + + if ( isNaN( this.boundingSphere.radius ) ) { + + console.error( 'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.', this ); + + } + + } + + }; + + }(), + + computeFaceNormals: function () { + + // backwards compatibility + + }, + + computeVertexNormals: function () { + + var index = this.index; + var attributes = this.attributes; + var groups = this.groups; + + if ( attributes.position ) { + + var positions = attributes.position.array; + + if ( attributes.normal === undefined ) { + + this.addAttribute( 'normal', new BufferAttribute( new Float32Array( positions.length ), 3 ) ); + + } else { + + // reset existing normals to zero + + var array = attributes.normal.array; + + for ( var i = 0, il = array.length; i < il; i ++ ) { + + array[ i ] = 0; + + } + + } + + var normals = attributes.normal.array; + + var vA, vB, vC; + var pA = new Vector3(), pB = new Vector3(), pC = new Vector3(); + var cb = new Vector3(), ab = new Vector3(); + + // indexed elements + + if ( index ) { + + var indices = index.array; + + if ( groups.length === 0 ) { + + this.addGroup( 0, indices.length ); + + } + + for ( var j = 0, jl = groups.length; j < jl; ++ j ) { + + var group = groups[ j ]; + + var start = group.start; + var count = group.count; + + for ( var i = start, il = start + count; i < il; i += 3 ) { + + vA = indices[ i + 0 ] * 3; + vB = indices[ i + 1 ] * 3; + vC = indices[ i + 2 ] * 3; + + pA.fromArray( positions, vA ); + pB.fromArray( positions, vB ); + pC.fromArray( positions, vC ); + + cb.subVectors( pC, pB ); + ab.subVectors( pA, pB ); + cb.cross( ab ); + + normals[ vA ] += cb.x; + normals[ vA + 1 ] += cb.y; + normals[ vA + 2 ] += cb.z; + + normals[ vB ] += cb.x; + normals[ vB + 1 ] += cb.y; + normals[ vB + 2 ] += cb.z; + + normals[ vC ] += cb.x; + normals[ vC + 1 ] += cb.y; + normals[ vC + 2 ] += cb.z; + + } + + } + + } else { + + // non-indexed elements (unconnected triangle soup) + + for ( var i = 0, il = positions.length; i < il; i += 9 ) { + + pA.fromArray( positions, i ); + pB.fromArray( positions, i + 3 ); + pC.fromArray( positions, i + 6 ); + + cb.subVectors( pC, pB ); + ab.subVectors( pA, pB ); + cb.cross( ab ); + + normals[ i ] = cb.x; + normals[ i + 1 ] = cb.y; + normals[ i + 2 ] = cb.z; + + normals[ i + 3 ] = cb.x; + normals[ i + 4 ] = cb.y; + normals[ i + 5 ] = cb.z; + + normals[ i + 6 ] = cb.x; + normals[ i + 7 ] = cb.y; + normals[ i + 8 ] = cb.z; + + } + + } + + this.normalizeNormals(); + + attributes.normal.needsUpdate = true; + + } + + }, + + merge: function ( geometry, offset ) { + + if ( ( geometry && geometry.isBufferGeometry ) === false ) { + + console.error( 'THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.', geometry ); + return; + + } + + if ( offset === undefined ) offset = 0; + + var attributes = this.attributes; + + for ( var key in attributes ) { + + if ( geometry.attributes[ key ] === undefined ) continue; + + var attribute1 = attributes[ key ]; + var attributeArray1 = attribute1.array; + + var attribute2 = geometry.attributes[ key ]; + var attributeArray2 = attribute2.array; + + var attributeSize = attribute2.itemSize; + + for ( var i = 0, j = attributeSize * offset; i < attributeArray2.length; i ++, j ++ ) { + + attributeArray1[ j ] = attributeArray2[ i ]; + + } + + } + + return this; + + }, + + normalizeNormals: function () { + + var normals = this.attributes.normal; + + var x, y, z, n; + + for ( var i = 0, il = normals.count; i < il; i ++ ) { + + x = normals.getX( i ); + y = normals.getY( i ); + z = normals.getZ( i ); + + n = 1.0 / Math.sqrt( x * x + y * y + z * z ); + + normals.setXYZ( i, x * n, y * n, z * n ); + + } + + }, + + toNonIndexed: function () { + + if ( this.index === null ) { + + console.warn( 'THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed.' ); + return this; + + } + + var geometry2 = new BufferGeometry(); + + var indices = this.index.array; + var attributes = this.attributes; + + for ( var name in attributes ) { + + var attribute = attributes[ name ]; + + var array = attribute.array; + var itemSize = attribute.itemSize; + + var array2 = new array.constructor( indices.length * itemSize ); + + var index = 0, index2 = 0; + + for ( var i = 0, l = indices.length; i < l; i ++ ) { + + index = indices[ i ] * itemSize; + + for ( var j = 0; j < itemSize; j ++ ) { + + array2[ index2 ++ ] = array[ index ++ ]; + + } + + } + + geometry2.addAttribute( name, new BufferAttribute( array2, itemSize ) ); + + } + + return geometry2; + + }, + + toJSON: function () { + + var data = { + metadata: { + version: 4.5, + type: 'BufferGeometry', + generator: 'BufferGeometry.toJSON' + } + }; + + // standard BufferGeometry serialization + + data.uuid = this.uuid; + data.type = this.type; + if ( this.name !== '' ) data.name = this.name; + + if ( this.parameters !== undefined ) { + + var parameters = this.parameters; + + for ( var key in parameters ) { + + if ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ]; + + } + + return data; + + } + + data.data = { attributes: {} }; + + var index = this.index; + + if ( index !== null ) { + + var array = Array.prototype.slice.call( index.array ); + + data.data.index = { + type: index.array.constructor.name, + array: array + }; + + } + + var attributes = this.attributes; + + for ( var key in attributes ) { + + var attribute = attributes[ key ]; + + var array = Array.prototype.slice.call( attribute.array ); + + data.data.attributes[ key ] = { + itemSize: attribute.itemSize, + type: attribute.array.constructor.name, + array: array, + normalized: attribute.normalized + }; + + } + + var groups = this.groups; + + if ( groups.length > 0 ) { + + data.data.groups = JSON.parse( JSON.stringify( groups ) ); + + } + + var boundingSphere = this.boundingSphere; + + if ( boundingSphere !== null ) { + + data.data.boundingSphere = { + center: boundingSphere.center.toArray(), + radius: boundingSphere.radius + }; + + } + + return data; + + }, + + clone: function () { + + /* + // Handle primitives + + var parameters = this.parameters; + + if ( parameters !== undefined ) { + + var values = []; + + for ( var key in parameters ) { + + values.push( parameters[ key ] ); + + } + + var geometry = Object.create( this.constructor.prototype ); + this.constructor.apply( geometry, values ); + return geometry; + + } + + return new this.constructor().copy( this ); + */ + + return new BufferGeometry().copy( this ); + + }, + + copy: function ( source ) { + + var name, i, l; + + // reset + + this.index = null; + this.attributes = {}; + this.morphAttributes = {}; + this.groups = []; + this.boundingBox = null; + this.boundingSphere = null; + + // name + + this.name = source.name; + + // index + + var index = source.index; + + if ( index !== null ) { + + this.setIndex( index.clone() ); + + } + + // attributes + + var attributes = source.attributes; + + for ( name in attributes ) { + + var attribute = attributes[ name ]; + this.addAttribute( name, attribute.clone() ); + + } + + // morph attributes + + var morphAttributes = source.morphAttributes; + + for ( name in morphAttributes ) { + + var array = []; + var morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes + + for ( i = 0, l = morphAttribute.length; i < l; i ++ ) { + + array.push( morphAttribute[ i ].clone() ); + + } + + this.morphAttributes[ name ] = array; + + } + + // groups + + var groups = source.groups; + + for ( i = 0, l = groups.length; i < l; i ++ ) { + + var group = groups[ i ]; + this.addGroup( group.start, group.count, group.materialIndex ); + + } + + // bounding box + + var boundingBox = source.boundingBox; + + if ( boundingBox !== null ) { + + this.boundingBox = boundingBox.clone(); + + } + + // bounding sphere + + var boundingSphere = source.boundingSphere; + + if ( boundingSphere !== null ) { + + this.boundingSphere = boundingSphere.clone(); + + } + + // draw range + + this.drawRange.start = source.drawRange.start; + this.drawRange.count = source.drawRange.count; + + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author mikael emtinger / http://gomo.se/ + * @author jonobr1 / http://jonobr1.com/ + */ + + function Mesh( geometry, material ) { + + Object3D.call( this ); + + this.type = 'Mesh'; + + this.geometry = geometry !== undefined ? geometry : new BufferGeometry(); + this.material = material !== undefined ? material : new MeshBasicMaterial( { color: Math.random() * 0xffffff } ); + + this.drawMode = TrianglesDrawMode; + + this.updateMorphTargets(); + + } + + Mesh.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Mesh, + + isMesh: true, + + setDrawMode: function ( value ) { + + this.drawMode = value; + + }, + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source ); + + this.drawMode = source.drawMode; + + return this; + + }, + + updateMorphTargets: function () { + + var morphTargets = this.geometry.morphTargets; + + if ( morphTargets !== undefined && morphTargets.length > 0 ) { + + this.morphTargetInfluences = []; + this.morphTargetDictionary = {}; + + for ( var m = 0, ml = morphTargets.length; m < ml; m ++ ) { + + this.morphTargetInfluences.push( 0 ); + this.morphTargetDictionary[ morphTargets[ m ].name ] = m; + + } + + } + + }, + + raycast: ( function () { + + var inverseMatrix = new Matrix4(); + var ray = new Ray(); + var sphere = new Sphere(); + + var vA = new Vector3(); + var vB = new Vector3(); + var vC = new Vector3(); + + var tempA = new Vector3(); + var tempB = new Vector3(); + var tempC = new Vector3(); + + var uvA = new Vector2(); + var uvB = new Vector2(); + var uvC = new Vector2(); + + var barycoord = new Vector3(); + + var intersectionPoint = new Vector3(); + var intersectionPointWorld = new Vector3(); + + function uvIntersection( point, p1, p2, p3, uv1, uv2, uv3 ) { + + Triangle.barycoordFromPoint( point, p1, p2, p3, barycoord ); + + uv1.multiplyScalar( barycoord.x ); + uv2.multiplyScalar( barycoord.y ); + uv3.multiplyScalar( barycoord.z ); + + uv1.add( uv2 ).add( uv3 ); + + return uv1.clone(); + + } + + function checkIntersection( object, raycaster, ray, pA, pB, pC, point ) { + + var intersect; + var material = object.material; + + if ( material.side === BackSide ) { + + intersect = ray.intersectTriangle( pC, pB, pA, true, point ); + + } else { + + intersect = ray.intersectTriangle( pA, pB, pC, material.side !== DoubleSide, point ); + + } + + if ( intersect === null ) return null; + + intersectionPointWorld.copy( point ); + intersectionPointWorld.applyMatrix4( object.matrixWorld ); + + var distance = raycaster.ray.origin.distanceTo( intersectionPointWorld ); + + if ( distance < raycaster.near || distance > raycaster.far ) return null; + + return { + distance: distance, + point: intersectionPointWorld.clone(), + object: object + }; + + } + + function checkBufferGeometryIntersection( object, raycaster, ray, position, uv, a, b, c ) { + + vA.fromBufferAttribute( position, a ); + vB.fromBufferAttribute( position, b ); + vC.fromBufferAttribute( position, c ); + + var intersection = checkIntersection( object, raycaster, ray, vA, vB, vC, intersectionPoint ); + + if ( intersection ) { + + if ( uv ) { + + uvA.fromBufferAttribute( uv, a ); + uvB.fromBufferAttribute( uv, b ); + uvC.fromBufferAttribute( uv, c ); + + intersection.uv = uvIntersection( intersectionPoint, vA, vB, vC, uvA, uvB, uvC ); + + } + + intersection.face = new Face3( a, b, c, Triangle.normal( vA, vB, vC ) ); + intersection.faceIndex = a; + + } + + return intersection; + + } + + return function raycast( raycaster, intersects ) { + + var geometry = this.geometry; + var material = this.material; + var matrixWorld = this.matrixWorld; + + if ( material === undefined ) return; + + // Checking boundingSphere distance to ray + + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); + + sphere.copy( geometry.boundingSphere ); + sphere.applyMatrix4( matrixWorld ); + + if ( raycaster.ray.intersectsSphere( sphere ) === false ) return; + + // + + inverseMatrix.getInverse( matrixWorld ); + ray.copy( raycaster.ray ).applyMatrix4( inverseMatrix ); + + // Check boundingBox before continuing + + if ( geometry.boundingBox !== null ) { + + if ( ray.intersectsBox( geometry.boundingBox ) === false ) return; + + } + + var intersection; + + if ( geometry.isBufferGeometry ) { + + var a, b, c; + var index = geometry.index; + var position = geometry.attributes.position; + var uv = geometry.attributes.uv; + var i, l; + + if ( index !== null ) { + + // indexed buffer geometry + + for ( i = 0, l = index.count; i < l; i += 3 ) { + + a = index.getX( i ); + b = index.getX( i + 1 ); + c = index.getX( i + 2 ); + + intersection = checkBufferGeometryIntersection( this, raycaster, ray, position, uv, a, b, c ); + + if ( intersection ) { + + intersection.faceIndex = Math.floor( i / 3 ); // triangle number in indices buffer semantics + intersects.push( intersection ); + + } + + } + + } else { + + // non-indexed buffer geometry + + for ( i = 0, l = position.count; i < l; i += 3 ) { + + a = i; + b = i + 1; + c = i + 2; + + intersection = checkBufferGeometryIntersection( this, raycaster, ray, position, uv, a, b, c ); + + if ( intersection ) { + + intersection.index = a; // triangle number in positions buffer semantics + intersects.push( intersection ); + + } + + } + + } + + } else if ( geometry.isGeometry ) { + + var fvA, fvB, fvC; + var isMultiMaterial = Array.isArray( material ); + + var vertices = geometry.vertices; + var faces = geometry.faces; + var uvs; + + var faceVertexUvs = geometry.faceVertexUvs[ 0 ]; + if ( faceVertexUvs.length > 0 ) uvs = faceVertexUvs; + + for ( var f = 0, fl = faces.length; f < fl; f ++ ) { + + var face = faces[ f ]; + var faceMaterial = isMultiMaterial ? material[ face.materialIndex ] : material; + + if ( faceMaterial === undefined ) continue; + + fvA = vertices[ face.a ]; + fvB = vertices[ face.b ]; + fvC = vertices[ face.c ]; + + if ( faceMaterial.morphTargets === true ) { + + var morphTargets = geometry.morphTargets; + var morphInfluences = this.morphTargetInfluences; + + vA.set( 0, 0, 0 ); + vB.set( 0, 0, 0 ); + vC.set( 0, 0, 0 ); + + for ( var t = 0, tl = morphTargets.length; t < tl; t ++ ) { + + var influence = morphInfluences[ t ]; + + if ( influence === 0 ) continue; + + var targets = morphTargets[ t ].vertices; + + vA.addScaledVector( tempA.subVectors( targets[ face.a ], fvA ), influence ); + vB.addScaledVector( tempB.subVectors( targets[ face.b ], fvB ), influence ); + vC.addScaledVector( tempC.subVectors( targets[ face.c ], fvC ), influence ); + + } + + vA.add( fvA ); + vB.add( fvB ); + vC.add( fvC ); + + fvA = vA; + fvB = vB; + fvC = vC; + + } + + intersection = checkIntersection( this, raycaster, ray, fvA, fvB, fvC, intersectionPoint ); + + if ( intersection ) { + + if ( uvs && uvs[ f ] ) { + + var uvs_f = uvs[ f ]; + uvA.copy( uvs_f[ 0 ] ); + uvB.copy( uvs_f[ 1 ] ); + uvC.copy( uvs_f[ 2 ] ); + + intersection.uv = uvIntersection( intersectionPoint, fvA, fvB, fvC, uvA, uvB, uvC ); + + } + + intersection.face = face; + intersection.faceIndex = f; + intersects.push( intersection ); + + } + + } + + } + + }; + + }() ), + + clone: function () { + + return new this.constructor( this.geometry, this.material ).copy( this ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + + // BoxGeometry + + function BoxGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) { + + Geometry.call( this ); + + this.type = 'BoxGeometry'; + + this.parameters = { + width: width, + height: height, + depth: depth, + widthSegments: widthSegments, + heightSegments: heightSegments, + depthSegments: depthSegments + }; + + this.fromBufferGeometry( new BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) ); + this.mergeVertices(); + + } + + BoxGeometry.prototype = Object.create( Geometry.prototype ); + BoxGeometry.prototype.constructor = BoxGeometry; + + // BoxBufferGeometry + + function BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) { + + BufferGeometry.call( this ); + + this.type = 'BoxBufferGeometry'; + + this.parameters = { + width: width, + height: height, + depth: depth, + widthSegments: widthSegments, + heightSegments: heightSegments, + depthSegments: depthSegments + }; + + var scope = this; + + // segments + + widthSegments = Math.floor( widthSegments ) || 1; + heightSegments = Math.floor( heightSegments ) || 1; + depthSegments = Math.floor( depthSegments ) || 1; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var numberOfVertices = 0; + var groupStart = 0; + + // build each side of the box geometry + + buildPlane( 'z', 'y', 'x', - 1, - 1, depth, height, width, depthSegments, heightSegments, 0 ); // px + buildPlane( 'z', 'y', 'x', 1, - 1, depth, height, - width, depthSegments, heightSegments, 1 ); // nx + buildPlane( 'x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2 ); // py + buildPlane( 'x', 'z', 'y', 1, - 1, width, depth, - height, widthSegments, depthSegments, 3 ); // ny + buildPlane( 'x', 'y', 'z', 1, - 1, width, height, depth, widthSegments, heightSegments, 4 ); // pz + buildPlane( 'x', 'y', 'z', - 1, - 1, width, height, - depth, widthSegments, heightSegments, 5 ); // nz + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + function buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) { + + var segmentWidth = width / gridX; + var segmentHeight = height / gridY; + + var widthHalf = width / 2; + var heightHalf = height / 2; + var depthHalf = depth / 2; + + var gridX1 = gridX + 1; + var gridY1 = gridY + 1; + + var vertexCounter = 0; + var groupCount = 0; + + var ix, iy; + + var vector = new Vector3(); + + // generate vertices, normals and uvs + + for ( iy = 0; iy < gridY1; iy ++ ) { + + var y = iy * segmentHeight - heightHalf; + + for ( ix = 0; ix < gridX1; ix ++ ) { + + var x = ix * segmentWidth - widthHalf; + + // set values to correct vector component + + vector[ u ] = x * udir; + vector[ v ] = y * vdir; + vector[ w ] = depthHalf; + + // now apply vector to vertex buffer + + vertices.push( vector.x, vector.y, vector.z ); + + // set values to correct vector component + + vector[ u ] = 0; + vector[ v ] = 0; + vector[ w ] = depth > 0 ? 1 : - 1; + + // now apply vector to normal buffer + + normals.push( vector.x, vector.y, vector.z ); + + // uvs + + uvs.push( ix / gridX ); + uvs.push( 1 - ( iy / gridY ) ); + + // counters + + vertexCounter += 1; + + } + + } + + // indices + + // 1. you need three indices to draw a single face + // 2. a single segment consists of two faces + // 3. so we need to generate six (2*3) indices per segment + + for ( iy = 0; iy < gridY; iy ++ ) { + + for ( ix = 0; ix < gridX; ix ++ ) { + + var a = numberOfVertices + ix + gridX1 * iy; + var b = numberOfVertices + ix + gridX1 * ( iy + 1 ); + var c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 ); + var d = numberOfVertices + ( ix + 1 ) + gridX1 * iy; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + // increase counter + + groupCount += 6; + + } + + } + + // add a group to the geometry. this will ensure multi material support + + scope.addGroup( groupStart, groupCount, materialIndex ); + + // calculate new start value for groups + + groupStart += groupCount; + + // update total number of vertices + + numberOfVertices += vertexCounter; + + } + + } + + BoxBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + BoxBufferGeometry.prototype.constructor = BoxBufferGeometry; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + + // PlaneGeometry + + function PlaneGeometry( width, height, widthSegments, heightSegments ) { + + Geometry.call( this ); + + this.type = 'PlaneGeometry'; + + this.parameters = { + width: width, + height: height, + widthSegments: widthSegments, + heightSegments: heightSegments + }; + + this.fromBufferGeometry( new PlaneBufferGeometry( width, height, widthSegments, heightSegments ) ); + this.mergeVertices(); + + } + + PlaneGeometry.prototype = Object.create( Geometry.prototype ); + PlaneGeometry.prototype.constructor = PlaneGeometry; + + // PlaneBufferGeometry + + function PlaneBufferGeometry( width, height, widthSegments, heightSegments ) { + + BufferGeometry.call( this ); + + this.type = 'PlaneBufferGeometry'; + + this.parameters = { + width: width, + height: height, + widthSegments: widthSegments, + heightSegments: heightSegments + }; + + var width_half = width / 2; + var height_half = height / 2; + + var gridX = Math.floor( widthSegments ) || 1; + var gridY = Math.floor( heightSegments ) || 1; + + var gridX1 = gridX + 1; + var gridY1 = gridY + 1; + + var segment_width = width / gridX; + var segment_height = height / gridY; + + var ix, iy; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // generate vertices, normals and uvs + + for ( iy = 0; iy < gridY1; iy ++ ) { + + var y = iy * segment_height - height_half; + + for ( ix = 0; ix < gridX1; ix ++ ) { + + var x = ix * segment_width - width_half; + + vertices.push( x, - y, 0 ); + + normals.push( 0, 0, 1 ); + + uvs.push( ix / gridX ); + uvs.push( 1 - ( iy / gridY ) ); + + } + + } + + // indices + + for ( iy = 0; iy < gridY; iy ++ ) { + + for ( ix = 0; ix < gridX; ix ++ ) { + + var a = ix + gridX1 * iy; + var b = ix + gridX1 * ( iy + 1 ); + var c = ( ix + 1 ) + gridX1 * ( iy + 1 ); + var d = ( ix + 1 ) + gridX1 * iy; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + PlaneBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + PlaneBufferGeometry.prototype.constructor = PlaneBufferGeometry; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author mikael emtinger / http://gomo.se/ + * @author WestLangley / http://github.com/WestLangley + */ + + function Camera() { + + Object3D.call( this ); + + this.type = 'Camera'; + + this.matrixWorldInverse = new Matrix4(); + this.projectionMatrix = new Matrix4(); + + } + + Camera.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Camera, + + isCamera: true, + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source ); + + this.matrixWorldInverse.copy( source.matrixWorldInverse ); + this.projectionMatrix.copy( source.projectionMatrix ); + + return this; + + }, + + getWorldDirection: function () { + + var quaternion = new Quaternion(); + + return function getWorldDirection( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + + this.getWorldQuaternion( quaternion ); + + return result.set( 0, 0, - 1 ).applyQuaternion( quaternion ); + + }; + + }(), + + clone: function () { + + return new this.constructor().copy( this ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author greggman / http://games.greggman.com/ + * @author zz85 / http://www.lab4games.net/zz85/blog + * @author tschw + */ + + function PerspectiveCamera( fov, aspect, near, far ) { + + Camera.call( this ); + + this.type = 'PerspectiveCamera'; + + this.fov = fov !== undefined ? fov : 50; + this.zoom = 1; + + this.near = near !== undefined ? near : 0.1; + this.far = far !== undefined ? far : 2000; + this.focus = 10; + + this.aspect = aspect !== undefined ? aspect : 1; + this.view = null; + + this.filmGauge = 35; // width of the film (default in millimeters) + this.filmOffset = 0; // horizontal film offset (same unit as gauge) + + this.updateProjectionMatrix(); + + } + + PerspectiveCamera.prototype = Object.assign( Object.create( Camera.prototype ), { + + constructor: PerspectiveCamera, + + isPerspectiveCamera: true, + + copy: function ( source ) { + + Camera.prototype.copy.call( this, source ); + + this.fov = source.fov; + this.zoom = source.zoom; + + this.near = source.near; + this.far = source.far; + this.focus = source.focus; + + this.aspect = source.aspect; + this.view = source.view === null ? null : Object.assign( {}, source.view ); + + this.filmGauge = source.filmGauge; + this.filmOffset = source.filmOffset; + + return this; + + }, + + /** + * Sets the FOV by focal length in respect to the current .filmGauge. + * + * The default film gauge is 35, so that the focal length can be specified for + * a 35mm (full frame) camera. + * + * Values for focal length and film gauge must have the same unit. + */ + setFocalLength: function ( focalLength ) { + + // see http://www.bobatkins.com/photography/technical/field_of_view.html + var vExtentSlope = 0.5 * this.getFilmHeight() / focalLength; + + this.fov = _Math.RAD2DEG * 2 * Math.atan( vExtentSlope ); + this.updateProjectionMatrix(); + + }, + + /** + * Calculates the focal length from the current .fov and .filmGauge. + */ + getFocalLength: function () { + + var vExtentSlope = Math.tan( _Math.DEG2RAD * 0.5 * this.fov ); + + return 0.5 * this.getFilmHeight() / vExtentSlope; + + }, + + getEffectiveFOV: function () { + + return _Math.RAD2DEG * 2 * Math.atan( + Math.tan( _Math.DEG2RAD * 0.5 * this.fov ) / this.zoom ); + + }, + + getFilmWidth: function () { + + // film not completely covered in portrait format (aspect < 1) + return this.filmGauge * Math.min( this.aspect, 1 ); + + }, + + getFilmHeight: function () { + + // film not completely covered in landscape format (aspect > 1) + return this.filmGauge / Math.max( this.aspect, 1 ); + + }, + + /** + * Sets an offset in a larger frustum. This is useful for multi-window or + * multi-monitor/multi-machine setups. + * + * For example, if you have 3x2 monitors and each monitor is 1920x1080 and + * the monitors are in grid like this + * + * +---+---+---+ + * | A | B | C | + * +---+---+---+ + * | D | E | F | + * +---+---+---+ + * + * then for each monitor you would call it like this + * + * var w = 1920; + * var h = 1080; + * var fullWidth = w * 3; + * var fullHeight = h * 2; + * + * --A-- + * camera.setOffset( fullWidth, fullHeight, w * 0, h * 0, w, h ); + * --B-- + * camera.setOffset( fullWidth, fullHeight, w * 1, h * 0, w, h ); + * --C-- + * camera.setOffset( fullWidth, fullHeight, w * 2, h * 0, w, h ); + * --D-- + * camera.setOffset( fullWidth, fullHeight, w * 0, h * 1, w, h ); + * --E-- + * camera.setOffset( fullWidth, fullHeight, w * 1, h * 1, w, h ); + * --F-- + * camera.setOffset( fullWidth, fullHeight, w * 2, h * 1, w, h ); + * + * Note there is no reason monitors have to be the same size or in a grid. + */ + setViewOffset: function ( fullWidth, fullHeight, x, y, width, height ) { + + this.aspect = fullWidth / fullHeight; + + this.view = { + fullWidth: fullWidth, + fullHeight: fullHeight, + offsetX: x, + offsetY: y, + width: width, + height: height + }; + + this.updateProjectionMatrix(); + + }, + + clearViewOffset: function () { + + this.view = null; + this.updateProjectionMatrix(); + + }, + + updateProjectionMatrix: function () { + + var near = this.near, + top = near * Math.tan( + _Math.DEG2RAD * 0.5 * this.fov ) / this.zoom, + height = 2 * top, + width = this.aspect * height, + left = - 0.5 * width, + view = this.view; + + if ( view !== null ) { + + var fullWidth = view.fullWidth, + fullHeight = view.fullHeight; + + left += view.offsetX * width / fullWidth; + top -= view.offsetY * height / fullHeight; + width *= view.width / fullWidth; + height *= view.height / fullHeight; + + } + + var skew = this.filmOffset; + if ( skew !== 0 ) left += near * skew / this.getFilmWidth(); + + this.projectionMatrix.makePerspective( left, left + width, top, top - height, near, this.far ); + + }, + + toJSON: function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + data.object.fov = this.fov; + data.object.zoom = this.zoom; + + data.object.near = this.near; + data.object.far = this.far; + data.object.focus = this.focus; + + data.object.aspect = this.aspect; + + if ( this.view !== null ) data.object.view = Object.assign( {}, this.view ); + + data.object.filmGauge = this.filmGauge; + data.object.filmOffset = this.filmOffset; + + return data; + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author arose / http://github.com/arose + */ + + function OrthographicCamera( left, right, top, bottom, near, far ) { + + Camera.call( this ); + + this.type = 'OrthographicCamera'; + + this.zoom = 1; + this.view = null; + + this.left = left; + this.right = right; + this.top = top; + this.bottom = bottom; + + this.near = ( near !== undefined ) ? near : 0.1; + this.far = ( far !== undefined ) ? far : 2000; + + this.updateProjectionMatrix(); + + } + + OrthographicCamera.prototype = Object.assign( Object.create( Camera.prototype ), { + + constructor: OrthographicCamera, + + isOrthographicCamera: true, + + copy: function ( source ) { + + Camera.prototype.copy.call( this, source ); + + this.left = source.left; + this.right = source.right; + this.top = source.top; + this.bottom = source.bottom; + this.near = source.near; + this.far = source.far; + + this.zoom = source.zoom; + this.view = source.view === null ? null : Object.assign( {}, source.view ); + + return this; + + }, + + setViewOffset: function( fullWidth, fullHeight, x, y, width, height ) { + + this.view = { + fullWidth: fullWidth, + fullHeight: fullHeight, + offsetX: x, + offsetY: y, + width: width, + height: height + }; + + this.updateProjectionMatrix(); + + }, + + clearViewOffset: function() { + + this.view = null; + this.updateProjectionMatrix(); + + }, + + updateProjectionMatrix: function () { + + var dx = ( this.right - this.left ) / ( 2 * this.zoom ); + var dy = ( this.top - this.bottom ) / ( 2 * this.zoom ); + var cx = ( this.right + this.left ) / 2; + var cy = ( this.top + this.bottom ) / 2; + + var left = cx - dx; + var right = cx + dx; + var top = cy + dy; + var bottom = cy - dy; + + if ( this.view !== null ) { + + var zoomW = this.zoom / ( this.view.width / this.view.fullWidth ); + var zoomH = this.zoom / ( this.view.height / this.view.fullHeight ); + var scaleW = ( this.right - this.left ) / this.view.width; + var scaleH = ( this.top - this.bottom ) / this.view.height; + + left += scaleW * ( this.view.offsetX / zoomW ); + right = left + scaleW * ( this.view.width / zoomW ); + top -= scaleH * ( this.view.offsetY / zoomH ); + bottom = top - scaleH * ( this.view.height / zoomH ); + + } + + this.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far ); + + }, + + toJSON: function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + data.object.zoom = this.zoom; + data.object.left = this.left; + data.object.right = this.right; + data.object.top = this.top; + data.object.bottom = this.bottom; + data.object.near = this.near; + data.object.far = this.far; + + if ( this.view !== null ) data.object.view = Object.assign( {}, this.view ); + + return data; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLAttributes( gl ) { + + var buffers = {}; + + function createBuffer( attribute, bufferType ) { + + var array = attribute.array; + var usage = attribute.dynamic ? gl.DYNAMIC_DRAW : gl.STATIC_DRAW; + + var buffer = gl.createBuffer(); + + gl.bindBuffer( bufferType, buffer ); + gl.bufferData( bufferType, array, usage ); + + attribute.onUploadCallback(); + + var type = gl.FLOAT; + + if ( array instanceof Float32Array ) { + + type = gl.FLOAT; + + } else if ( array instanceof Float64Array ) { + + console.warn( "Unsupported data buffer format: Float64Array" ); + + } else if ( array instanceof Uint16Array ) { + + type = gl.UNSIGNED_SHORT; + + } else if ( array instanceof Int16Array ) { + + type = gl.SHORT; + + } else if ( array instanceof Uint32Array ) { + + type = gl.UNSIGNED_INT; + + } else if ( array instanceof Int32Array ) { + + type = gl.INT; + + } else if ( array instanceof Int8Array ) { + + type = gl.BYTE; + + } else if ( array instanceof Uint8Array ) { + + type = gl.UNSIGNED_BYTE; + + } + + return { + buffer: buffer, + type: type, + bytesPerElement: array.BYTES_PER_ELEMENT, + version: attribute.version + }; + + } + + function updateBuffer( buffer, attribute, bufferType ) { + + var array = attribute.array; + var updateRange = attribute.updateRange; + + gl.bindBuffer( bufferType, buffer ); + + if ( attribute.dynamic === false ) { + + gl.bufferData( bufferType, array, gl.STATIC_DRAW ); + + } else if ( updateRange.count === - 1 ) { + + // Not using update ranges + + gl.bufferSubData( bufferType, 0, array ); + + } else if ( updateRange.count === 0 ) { + + console.error( 'THREE.WebGLObjects.updateBuffer: dynamic THREE.BufferAttribute marked as needsUpdate but updateRange.count is 0, ensure you are using set methods or updating manually.' ); + + } else { + + gl.bufferSubData( bufferType, updateRange.offset * array.BYTES_PER_ELEMENT, + array.subarray( updateRange.offset, updateRange.offset + updateRange.count ) ); + + updateRange.count = 0; // reset range + + } + + } + + // + + function get( attribute ) { + + if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data; + + return buffers[ attribute.uuid ]; + + } + + function remove( attribute ) { + + var data = buffers[ attribute.uuid ]; + + if ( data ) { + + gl.deleteBuffer( data.buffer ); + + delete buffers[ attribute.uuid ]; + + } + + } + + function update( attribute, bufferType ) { + + if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data; + + var data = buffers[ attribute.uuid ]; + + if ( data === undefined ) { + + buffers[ attribute.uuid ] = createBuffer( attribute, bufferType ); + + } else if ( data.version < attribute.version ) { + + updateBuffer( data.buffer, attribute, bufferType ); + + data.version = attribute.version; + + } + + } + + return { + + get: get, + remove: remove, + update: update + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function painterSortStable( a, b ) { + + if ( a.renderOrder !== b.renderOrder ) { + + return a.renderOrder - b.renderOrder; + + } else if ( a.program && b.program && a.program !== b.program ) { + + return a.program.id - b.program.id; + + } else if ( a.material.id !== b.material.id ) { + + return a.material.id - b.material.id; + + } else if ( a.z !== b.z ) { + + return a.z - b.z; + + } else { + + return a.id - b.id; + + } + + } + + function reversePainterSortStable( a, b ) { + + if ( a.renderOrder !== b.renderOrder ) { + + return a.renderOrder - b.renderOrder; + + } if ( a.z !== b.z ) { + + return b.z - a.z; + + } else { + + return a.id - b.id; + + } + + } + + function WebGLRenderList() { + + var opaque = []; + var opaqueLastIndex = - 1; + + var transparent = []; + var transparentLastIndex = - 1; + + function init() { + + opaqueLastIndex = - 1; + transparentLastIndex = - 1; + + } + + function push( object, geometry, material, z, group ) { + + var array, index; + + // allocate the next position in the appropriate array + + if ( material.transparent ) { + + array = transparent; + index = ++ transparentLastIndex; + + } else { + + array = opaque; + index = ++ opaqueLastIndex; + + } + + // recycle existing render item or grow the array + + var renderItem = array[ index ]; + + if ( renderItem ) { + + renderItem.id = object.id; + renderItem.object = object; + renderItem.geometry = geometry; + renderItem.material = material; + renderItem.program = material.program; + renderItem.renderOrder = object.renderOrder; + renderItem.z = z; + renderItem.group = group; + + } else { + + renderItem = { + id: object.id, + object: object, + geometry: geometry, + material: material, + program: material.program, + renderOrder: object.renderOrder, + z: z, + group: group + }; + + // assert( index === array.length ); + array.push( renderItem ); + + } + + } + + function finish() { + + opaque.length = opaqueLastIndex + 1; + transparent.length = transparentLastIndex + 1; + + } + + function sort() { + + opaque.sort( painterSortStable ); + transparent.sort( reversePainterSortStable ); + + } + + return { + opaque: opaque, + transparent: transparent, + + init: init, + push: push, + finish: finish, + + sort: sort + }; + + } + + function WebGLRenderLists() { + + var lists = {}; + + function get( scene, camera ) { + + var hash = scene.id + ',' + camera.id; + var list = lists[ hash ]; + + if ( list === undefined ) { + + // console.log( 'THREE.WebGLRenderLists:', hash ); + + list = new WebGLRenderList(); + lists[ hash ] = list; + + } + + return list; + + } + + function dispose() { + + lists = {}; + + } + + return { + get: get, + dispose: dispose + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLIndexedBufferRenderer( gl, extensions, infoRender ) { + + var mode; + + function setMode( value ) { + + mode = value; + + } + + var type, size; + + function setIndex( index ) { + + if ( index.array instanceof Uint32Array && extensions.get( 'OES_element_index_uint' ) ) { + + type = gl.UNSIGNED_INT; + size = 4; + + } else if ( index.array instanceof Uint16Array ) { + + type = gl.UNSIGNED_SHORT; + size = 2; + + } else { + + type = gl.UNSIGNED_BYTE; + size = 1; + + } + + } + + function render( start, count ) { + + gl.drawElements( mode, count, type, start * size ); + + infoRender.calls ++; + infoRender.vertices += count; + + if ( mode === gl.TRIANGLES ) infoRender.faces += count / 3; + + } + + function renderInstances( geometry, start, count ) { + + var extension = extensions.get( 'ANGLE_instanced_arrays' ); + + if ( extension === null ) { + + console.error( 'THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' ); + return; + + } + + extension.drawElementsInstancedANGLE( mode, count, type, start * size, geometry.maxInstancedCount ); + + infoRender.calls ++; + infoRender.vertices += count * geometry.maxInstancedCount; + + if ( mode === gl.TRIANGLES ) infoRender.faces += geometry.maxInstancedCount * count / 3; + + } + + // + + this.setMode = setMode; + this.setIndex = setIndex; + this.render = render; + this.renderInstances = renderInstances; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLBufferRenderer( gl, extensions, infoRender ) { + + var mode; + + function setMode( value ) { + + mode = value; + + } + + function render( start, count ) { + + gl.drawArrays( mode, start, count ); + + infoRender.calls ++; + infoRender.vertices += count; + + if ( mode === gl.TRIANGLES ) infoRender.faces += count / 3; + + } + + function renderInstances( geometry, start, count ) { + + var extension = extensions.get( 'ANGLE_instanced_arrays' ); + + if ( extension === null ) { + + console.error( 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' ); + return; + + } + + var position = geometry.attributes.position; + + if ( position.isInterleavedBufferAttribute ) { + + count = position.data.count; + + extension.drawArraysInstancedANGLE( mode, 0, count, geometry.maxInstancedCount ); + + } else { + + extension.drawArraysInstancedANGLE( mode, start, count, geometry.maxInstancedCount ); + + } + + infoRender.calls ++; + infoRender.vertices += count * geometry.maxInstancedCount; + + if ( mode === gl.TRIANGLES ) infoRender.faces += geometry.maxInstancedCount * count / 3; + + } + + // + + this.setMode = setMode; + this.render = render; + this.renderInstances = renderInstances; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLGeometries( gl, attributes, infoMemory ) { + + var geometries = {}; + var wireframeAttributes = {}; + + function onGeometryDispose( event ) { + + var geometry = event.target; + var buffergeometry = geometries[ geometry.id ]; + + if ( buffergeometry.index !== null ) { + + attributes.remove( buffergeometry.index ); + + } + + for ( var name in buffergeometry.attributes ) { + + attributes.remove( buffergeometry.attributes[ name ] ); + + } + + geometry.removeEventListener( 'dispose', onGeometryDispose ); + + delete geometries[ geometry.id ]; + + // TODO Remove duplicate code + + var attribute = wireframeAttributes[ geometry.id ]; + + if ( attribute ) { + + attributes.remove( attribute ); + delete wireframeAttributes[ geometry.id ]; + + } + + attribute = wireframeAttributes[ buffergeometry.id ]; + + if ( attribute ) { + + attributes.remove( attribute ); + delete wireframeAttributes[ buffergeometry.id ]; + + } + + // + + infoMemory.geometries --; + + } + + function get( object, geometry ) { + + var buffergeometry = geometries[ geometry.id ]; + + if ( buffergeometry ) return buffergeometry; + + geometry.addEventListener( 'dispose', onGeometryDispose ); + + if ( geometry.isBufferGeometry ) { + + buffergeometry = geometry; + + } else if ( geometry.isGeometry ) { + + if ( geometry._bufferGeometry === undefined ) { + + geometry._bufferGeometry = new BufferGeometry().setFromObject( object ); + + } + + buffergeometry = geometry._bufferGeometry; + + } + + geometries[ geometry.id ] = buffergeometry; + + infoMemory.geometries ++; + + return buffergeometry; + + } + + function update( geometry ) { + + var index = geometry.index; + var geometryAttributes = geometry.attributes; + + if ( index !== null ) { + + attributes.update( index, gl.ELEMENT_ARRAY_BUFFER ); + + } + + for ( var name in geometryAttributes ) { + + attributes.update( geometryAttributes[ name ], gl.ARRAY_BUFFER ); + + } + + // morph targets + + var morphAttributes = geometry.morphAttributes; + + for ( var name in morphAttributes ) { + + var array = morphAttributes[ name ]; + + for ( var i = 0, l = array.length; i < l; i ++ ) { + + attributes.update( array[ i ], gl.ARRAY_BUFFER ); + + } + + } + + } + + function getWireframeAttribute( geometry ) { + + var attribute = wireframeAttributes[ geometry.id ]; + + if ( attribute ) return attribute; + + var indices = []; + + var geometryIndex = geometry.index; + var geometryAttributes = geometry.attributes; + + // console.time( 'wireframe' ); + + if ( geometryIndex !== null ) { + + var array = geometryIndex.array; + + for ( var i = 0, l = array.length; i < l; i += 3 ) { + + var a = array[ i + 0 ]; + var b = array[ i + 1 ]; + var c = array[ i + 2 ]; + + indices.push( a, b, b, c, c, a ); + + } + + } else { + + var array = geometryAttributes.position.array; + + for ( var i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) { + + var a = i + 0; + var b = i + 1; + var c = i + 2; + + indices.push( a, b, b, c, c, a ); + + } + + } + + // console.timeEnd( 'wireframe' ); + + attribute = new ( arrayMax( indices ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 ); + + attributes.update( attribute, gl.ELEMENT_ARRAY_BUFFER ); + + wireframeAttributes[ geometry.id ] = attribute; + + return attribute; + + } + + return { + + get: get, + update: update, + + getWireframeAttribute: getWireframeAttribute + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLLights() { + + var lights = {}; + + return { + + get: function ( light ) { + + if ( lights[ light.id ] !== undefined ) { + + return lights[ light.id ]; + + } + + var uniforms; + + switch ( light.type ) { + + case 'DirectionalLight': + uniforms = { + direction: new Vector3(), + color: new Color(), + + shadow: false, + shadowBias: 0, + shadowRadius: 1, + shadowMapSize: new Vector2() + }; + break; + + case 'SpotLight': + uniforms = { + position: new Vector3(), + direction: new Vector3(), + color: new Color(), + distance: 0, + coneCos: 0, + penumbraCos: 0, + decay: 0, + + shadow: false, + shadowBias: 0, + shadowRadius: 1, + shadowMapSize: new Vector2() + }; + break; + + case 'PointLight': + uniforms = { + position: new Vector3(), + color: new Color(), + distance: 0, + decay: 0, + + shadow: false, + shadowBias: 0, + shadowRadius: 1, + shadowMapSize: new Vector2() + }; + break; + + case 'HemisphereLight': + uniforms = { + direction: new Vector3(), + skyColor: new Color(), + groundColor: new Color() + }; + break; + + case 'RectAreaLight': + uniforms = { + color: new Color(), + position: new Vector3(), + halfWidth: new Vector3(), + halfHeight: new Vector3() + // TODO (abelnation): set RectAreaLight shadow uniforms + }; + break; + + } + + lights[ light.id ] = uniforms; + + return uniforms; + + } + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLObjects( gl, geometries, infoRender ) { + + var updateList = {}; + + function update( object ) { + + var frame = infoRender.frame; + + var geometry = object.geometry; + var buffergeometry = geometries.get( object, geometry ); + + // Update once per frame + + if ( updateList[ buffergeometry.id ] !== frame ) { + + if ( geometry.isGeometry ) { + + buffergeometry.updateFromObject( object ); + + } + + geometries.update( buffergeometry ); + + updateList[ buffergeometry.id ] = frame; + + } + + return buffergeometry; + + } + + function clear() { + + updateList = {}; + + } + + return { + + update: update, + clear: clear + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function addLineNumbers( string ) { + + var lines = string.split( '\n' ); + + for ( var i = 0; i < lines.length; i ++ ) { + + lines[ i ] = ( i + 1 ) + ': ' + lines[ i ]; + + } + + return lines.join( '\n' ); + + } + + function WebGLShader( gl, type, string ) { + + var shader = gl.createShader( type ); + + gl.shaderSource( shader, string ); + gl.compileShader( shader ); + + if ( gl.getShaderParameter( shader, gl.COMPILE_STATUS ) === false ) { + + console.error( 'THREE.WebGLShader: Shader couldn\'t compile.' ); + + } + + if ( gl.getShaderInfoLog( shader ) !== '' ) { + + console.warn( 'THREE.WebGLShader: gl.getShaderInfoLog()', type === gl.VERTEX_SHADER ? 'vertex' : 'fragment', gl.getShaderInfoLog( shader ), addLineNumbers( string ) ); + + } + + // --enable-privileged-webgl-extension + // console.log( type, gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) ); + + return shader; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + var programIdCount = 0; + + function getEncodingComponents( encoding ) { + + switch ( encoding ) { + + case LinearEncoding: + return [ 'Linear','( value )' ]; + case sRGBEncoding: + return [ 'sRGB','( value )' ]; + case RGBEEncoding: + return [ 'RGBE','( value )' ]; + case RGBM7Encoding: + return [ 'RGBM','( value, 7.0 )' ]; + case RGBM16Encoding: + return [ 'RGBM','( value, 16.0 )' ]; + case RGBDEncoding: + return [ 'RGBD','( value, 256.0 )' ]; + case GammaEncoding: + return [ 'Gamma','( value, float( GAMMA_FACTOR ) )' ]; + default: + throw new Error( 'unsupported encoding: ' + encoding ); + + } + + } + + function getTexelDecodingFunction( functionName, encoding ) { + + var components = getEncodingComponents( encoding ); + return "vec4 " + functionName + "( vec4 value ) { return " + components[ 0 ] + "ToLinear" + components[ 1 ] + "; }"; + + } + + function getTexelEncodingFunction( functionName, encoding ) { + + var components = getEncodingComponents( encoding ); + return "vec4 " + functionName + "( vec4 value ) { return LinearTo" + components[ 0 ] + components[ 1 ] + "; }"; + + } + + function getToneMappingFunction( functionName, toneMapping ) { + + var toneMappingName; + + switch ( toneMapping ) { + + case LinearToneMapping: + toneMappingName = "Linear"; + break; + + case ReinhardToneMapping: + toneMappingName = "Reinhard"; + break; + + case Uncharted2ToneMapping: + toneMappingName = "Uncharted2"; + break; + + case CineonToneMapping: + toneMappingName = "OptimizedCineon"; + break; + + default: + throw new Error( 'unsupported toneMapping: ' + toneMapping ); + + } + + return "vec3 " + functionName + "( vec3 color ) { return " + toneMappingName + "ToneMapping( color ); }"; + + } + + function generateExtensions( extensions, parameters, rendererExtensions ) { + + extensions = extensions || {}; + + var chunks = [ + ( extensions.derivatives || parameters.envMapCubeUV || parameters.bumpMap || parameters.normalMap || parameters.flatShading ) ? '#extension GL_OES_standard_derivatives : enable' : '', + ( extensions.fragDepth || parameters.logarithmicDepthBuffer ) && rendererExtensions.get( 'EXT_frag_depth' ) ? '#extension GL_EXT_frag_depth : enable' : '', + ( extensions.drawBuffers ) && rendererExtensions.get( 'WEBGL_draw_buffers' ) ? '#extension GL_EXT_draw_buffers : require' : '', + ( extensions.shaderTextureLOD || parameters.envMap ) && rendererExtensions.get( 'EXT_shader_texture_lod' ) ? '#extension GL_EXT_shader_texture_lod : enable' : '' + ]; + + return chunks.filter( filterEmptyLine ).join( '\n' ); + + } + + function generateDefines( defines ) { + + var chunks = []; + + for ( var name in defines ) { + + var value = defines[ name ]; + + if ( value === false ) continue; + + chunks.push( '#define ' + name + ' ' + value ); + + } + + return chunks.join( '\n' ); + + } + + function fetchAttributeLocations( gl, program, identifiers ) { + + var attributes = {}; + + var n = gl.getProgramParameter( program, gl.ACTIVE_ATTRIBUTES ); + + for ( var i = 0; i < n; i ++ ) { + + var info = gl.getActiveAttrib( program, i ); + var name = info.name; + + // console.log("THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:", name, i ); + + attributes[ name ] = gl.getAttribLocation( program, name ); + + } + + return attributes; + + } + + function filterEmptyLine( string ) { + + return string !== ''; + + } + + function replaceLightNums( string, parameters ) { + + return string + .replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights ) + .replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights ) + .replace( /NUM_RECT_AREA_LIGHTS/g, parameters.numRectAreaLights ) + .replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights ) + .replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights ); + + } + + function parseIncludes( string ) { + + var pattern = /^[ \t]*#include +<([\w\d.]+)>/gm; + + function replace( match, include ) { + + var replace = ShaderChunk[ include ]; + + if ( replace === undefined ) { + + throw new Error( 'Can not resolve #include <' + include + '>' ); + + } + + return parseIncludes( replace ); + + } + + return string.replace( pattern, replace ); + + } + + function unrollLoops( string ) { + + var pattern = /for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g; + + function replace( match, start, end, snippet ) { + + var unroll = ''; + + for ( var i = parseInt( start ); i < parseInt( end ); i ++ ) { + + unroll += snippet.replace( /\[ i \]/g, '[ ' + i + ' ]' ); + + } + + return unroll; + + } + + return string.replace( pattern, replace ); + + } + + function WebGLProgram( renderer, code, material, parameters ) { + + var gl = renderer.context; + + var extensions = material.extensions; + var defines = material.defines; + + var vertexShader = material.__webglShader.vertexShader; + var fragmentShader = material.__webglShader.fragmentShader; + + var shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC'; + + if ( parameters.shadowMapType === PCFShadowMap ) { + + shadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF'; + + } else if ( parameters.shadowMapType === PCFSoftShadowMap ) { + + shadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT'; + + } + + var envMapTypeDefine = 'ENVMAP_TYPE_CUBE'; + var envMapModeDefine = 'ENVMAP_MODE_REFLECTION'; + var envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY'; + + if ( parameters.envMap ) { + + switch ( material.envMap.mapping ) { + + case CubeReflectionMapping: + case CubeRefractionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_CUBE'; + break; + + case CubeUVReflectionMapping: + case CubeUVRefractionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV'; + break; + + case EquirectangularReflectionMapping: + case EquirectangularRefractionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_EQUIREC'; + break; + + case SphericalReflectionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_SPHERE'; + break; + + } + + switch ( material.envMap.mapping ) { + + case CubeRefractionMapping: + case EquirectangularRefractionMapping: + envMapModeDefine = 'ENVMAP_MODE_REFRACTION'; + break; + + } + + switch ( material.combine ) { + + case MultiplyOperation: + envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY'; + break; + + case MixOperation: + envMapBlendingDefine = 'ENVMAP_BLENDING_MIX'; + break; + + case AddOperation: + envMapBlendingDefine = 'ENVMAP_BLENDING_ADD'; + break; + + } + + } + + var gammaFactorDefine = ( renderer.gammaFactor > 0 ) ? renderer.gammaFactor : 1.0; + + // console.log( 'building new program ' ); + + // + + var customExtensions = generateExtensions( extensions, parameters, renderer.extensions ); + + var customDefines = generateDefines( defines ); + + // + + var program = gl.createProgram(); + + var prefixVertex, prefixFragment; + + if ( material.isRawShaderMaterial ) { + + prefixVertex = [ + + customDefines, + + '\n' + + ].filter( filterEmptyLine ).join( '\n' ); + + prefixFragment = [ + + customExtensions, + customDefines, + + '\n' + + ].filter( filterEmptyLine ).join( '\n' ); + + } else { + + prefixVertex = [ + + 'precision ' + parameters.precision + ' float;', + 'precision ' + parameters.precision + ' int;', + + '#define SHADER_NAME ' + material.__webglShader.name, + + customDefines, + + parameters.supportsVertexTextures ? '#define VERTEX_TEXTURES' : '', + + '#define GAMMA_FACTOR ' + gammaFactorDefine, + + '#define MAX_BONES ' + parameters.maxBones, + ( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '', + ( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '', + + parameters.map ? '#define USE_MAP' : '', + parameters.envMap ? '#define USE_ENVMAP' : '', + parameters.envMap ? '#define ' + envMapModeDefine : '', + parameters.lightMap ? '#define USE_LIGHTMAP' : '', + parameters.aoMap ? '#define USE_AOMAP' : '', + parameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '', + parameters.bumpMap ? '#define USE_BUMPMAP' : '', + parameters.normalMap ? '#define USE_NORMALMAP' : '', + parameters.displacementMap && parameters.supportsVertexTextures ? '#define USE_DISPLACEMENTMAP' : '', + parameters.specularMap ? '#define USE_SPECULARMAP' : '', + parameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '', + parameters.metalnessMap ? '#define USE_METALNESSMAP' : '', + parameters.alphaMap ? '#define USE_ALPHAMAP' : '', + parameters.vertexColors ? '#define USE_COLOR' : '', + + parameters.flatShading ? '#define FLAT_SHADED' : '', + + parameters.skinning ? '#define USE_SKINNING' : '', + parameters.useVertexTexture ? '#define BONE_TEXTURE' : '', + + parameters.morphTargets ? '#define USE_MORPHTARGETS' : '', + parameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '', + parameters.doubleSided ? '#define DOUBLE_SIDED' : '', + parameters.flipSided ? '#define FLIP_SIDED' : '', + + '#define NUM_CLIPPING_PLANES ' + parameters.numClippingPlanes, + + parameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '', + parameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '', + + parameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '', + + parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '', + parameters.logarithmicDepthBuffer && renderer.extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '', + + 'uniform mat4 modelMatrix;', + 'uniform mat4 modelViewMatrix;', + 'uniform mat4 projectionMatrix;', + 'uniform mat4 viewMatrix;', + 'uniform mat3 normalMatrix;', + 'uniform vec3 cameraPosition;', + + 'attribute vec3 position;', + 'attribute vec3 normal;', + 'attribute vec2 uv;', + + '#ifdef USE_COLOR', + + ' attribute vec3 color;', + + '#endif', + + '#ifdef USE_MORPHTARGETS', + + ' attribute vec3 morphTarget0;', + ' attribute vec3 morphTarget1;', + ' attribute vec3 morphTarget2;', + ' attribute vec3 morphTarget3;', + + ' #ifdef USE_MORPHNORMALS', + + ' attribute vec3 morphNormal0;', + ' attribute vec3 morphNormal1;', + ' attribute vec3 morphNormal2;', + ' attribute vec3 morphNormal3;', + + ' #else', + + ' attribute vec3 morphTarget4;', + ' attribute vec3 morphTarget5;', + ' attribute vec3 morphTarget6;', + ' attribute vec3 morphTarget7;', + + ' #endif', + + '#endif', + + '#ifdef USE_SKINNING', + + ' attribute vec4 skinIndex;', + ' attribute vec4 skinWeight;', + + '#endif', + + '\n' + + ].filter( filterEmptyLine ).join( '\n' ); + + prefixFragment = [ + + customExtensions, + + 'precision ' + parameters.precision + ' float;', + 'precision ' + parameters.precision + ' int;', + + '#define SHADER_NAME ' + material.__webglShader.name, + + customDefines, + + parameters.alphaTest ? '#define ALPHATEST ' + parameters.alphaTest : '', + + '#define GAMMA_FACTOR ' + gammaFactorDefine, + + ( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '', + ( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '', + + parameters.map ? '#define USE_MAP' : '', + parameters.envMap ? '#define USE_ENVMAP' : '', + parameters.envMap ? '#define ' + envMapTypeDefine : '', + parameters.envMap ? '#define ' + envMapModeDefine : '', + parameters.envMap ? '#define ' + envMapBlendingDefine : '', + parameters.lightMap ? '#define USE_LIGHTMAP' : '', + parameters.aoMap ? '#define USE_AOMAP' : '', + parameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '', + parameters.bumpMap ? '#define USE_BUMPMAP' : '', + parameters.normalMap ? '#define USE_NORMALMAP' : '', + parameters.specularMap ? '#define USE_SPECULARMAP' : '', + parameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '', + parameters.metalnessMap ? '#define USE_METALNESSMAP' : '', + parameters.alphaMap ? '#define USE_ALPHAMAP' : '', + parameters.vertexColors ? '#define USE_COLOR' : '', + + parameters.gradientMap ? '#define USE_GRADIENTMAP' : '', + + parameters.flatShading ? '#define FLAT_SHADED' : '', + + parameters.doubleSided ? '#define DOUBLE_SIDED' : '', + parameters.flipSided ? '#define FLIP_SIDED' : '', + + '#define NUM_CLIPPING_PLANES ' + parameters.numClippingPlanes, + '#define UNION_CLIPPING_PLANES ' + (parameters.numClippingPlanes - parameters.numClipIntersection), + + parameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '', + parameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '', + + parameters.premultipliedAlpha ? "#define PREMULTIPLIED_ALPHA" : '', + + parameters.physicallyCorrectLights ? "#define PHYSICALLY_CORRECT_LIGHTS" : '', + + parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '', + parameters.logarithmicDepthBuffer && renderer.extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '', + + parameters.envMap && renderer.extensions.get( 'EXT_shader_texture_lod' ) ? '#define TEXTURE_LOD_EXT' : '', + + 'uniform mat4 viewMatrix;', + 'uniform vec3 cameraPosition;', + + ( parameters.toneMapping !== NoToneMapping ) ? "#define TONE_MAPPING" : '', + ( parameters.toneMapping !== NoToneMapping ) ? ShaderChunk[ 'tonemapping_pars_fragment' ] : '', // this code is required here because it is used by the toneMapping() function defined below + ( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( "toneMapping", parameters.toneMapping ) : '', + + parameters.dithering ? '#define DITHERING' : '', + + ( parameters.outputEncoding || parameters.mapEncoding || parameters.envMapEncoding || parameters.emissiveMapEncoding ) ? ShaderChunk[ 'encodings_pars_fragment' ] : '', // this code is required here because it is used by the various encoding/decoding function defined below + parameters.mapEncoding ? getTexelDecodingFunction( 'mapTexelToLinear', parameters.mapEncoding ) : '', + parameters.envMapEncoding ? getTexelDecodingFunction( 'envMapTexelToLinear', parameters.envMapEncoding ) : '', + parameters.emissiveMapEncoding ? getTexelDecodingFunction( 'emissiveMapTexelToLinear', parameters.emissiveMapEncoding ) : '', + parameters.outputEncoding ? getTexelEncodingFunction( "linearToOutputTexel", parameters.outputEncoding ) : '', + + parameters.depthPacking ? "#define DEPTH_PACKING " + material.depthPacking : '', + + '\n' + + ].filter( filterEmptyLine ).join( '\n' ); + + } + + vertexShader = parseIncludes( vertexShader, parameters ); + vertexShader = replaceLightNums( vertexShader, parameters ); + + fragmentShader = parseIncludes( fragmentShader, parameters ); + fragmentShader = replaceLightNums( fragmentShader, parameters ); + + if ( ! material.isShaderMaterial ) { + + vertexShader = unrollLoops( vertexShader ); + fragmentShader = unrollLoops( fragmentShader ); + + } + + var vertexGlsl = prefixVertex + vertexShader; + var fragmentGlsl = prefixFragment + fragmentShader; + + // console.log( '*VERTEX*', vertexGlsl ); + // console.log( '*FRAGMENT*', fragmentGlsl ); + + var glVertexShader = WebGLShader( gl, gl.VERTEX_SHADER, vertexGlsl ); + var glFragmentShader = WebGLShader( gl, gl.FRAGMENT_SHADER, fragmentGlsl ); + + gl.attachShader( program, glVertexShader ); + gl.attachShader( program, glFragmentShader ); + + // Force a particular attribute to index 0. + + if ( material.index0AttributeName !== undefined ) { + + gl.bindAttribLocation( program, 0, material.index0AttributeName ); + + } else if ( parameters.morphTargets === true ) { + + // programs with morphTargets displace position out of attribute 0 + gl.bindAttribLocation( program, 0, 'position' ); + + } + + gl.linkProgram( program ); + + var programLog = gl.getProgramInfoLog( program ); + var vertexLog = gl.getShaderInfoLog( glVertexShader ); + var fragmentLog = gl.getShaderInfoLog( glFragmentShader ); + + var runnable = true; + var haveDiagnostics = true; + + // console.log( '**VERTEX**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glVertexShader ) ); + // console.log( '**FRAGMENT**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glFragmentShader ) ); + + if ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) { + + runnable = false; + + console.error( 'THREE.WebGLProgram: shader error: ', gl.getError(), 'gl.VALIDATE_STATUS', gl.getProgramParameter( program, gl.VALIDATE_STATUS ), 'gl.getProgramInfoLog', programLog, vertexLog, fragmentLog ); + + } else if ( programLog !== '' ) { + + console.warn( 'THREE.WebGLProgram: gl.getProgramInfoLog()', programLog ); + + } else if ( vertexLog === '' || fragmentLog === '' ) { + + haveDiagnostics = false; + + } + + if ( haveDiagnostics ) { + + this.diagnostics = { + + runnable: runnable, + material: material, + + programLog: programLog, + + vertexShader: { + + log: vertexLog, + prefix: prefixVertex + + }, + + fragmentShader: { + + log: fragmentLog, + prefix: prefixFragment + + } + + }; + + } + + // clean up + + gl.deleteShader( glVertexShader ); + gl.deleteShader( glFragmentShader ); + + // set up caching for uniform locations + + var cachedUniforms; + + this.getUniforms = function() { + + if ( cachedUniforms === undefined ) { + + cachedUniforms = + new WebGLUniforms( gl, program, renderer ); + + } + + return cachedUniforms; + + }; + + // set up caching for attribute locations + + var cachedAttributes; + + this.getAttributes = function() { + + if ( cachedAttributes === undefined ) { + + cachedAttributes = fetchAttributeLocations( gl, program ); + + } + + return cachedAttributes; + + }; + + // free resource + + this.destroy = function() { + + gl.deleteProgram( program ); + this.program = undefined; + + }; + + // DEPRECATED + + Object.defineProperties( this, { + + uniforms: { + get: function() { + + console.warn( 'THREE.WebGLProgram: .uniforms is now .getUniforms().' ); + return this.getUniforms(); + + } + }, + + attributes: { + get: function() { + + console.warn( 'THREE.WebGLProgram: .attributes is now .getAttributes().' ); + return this.getAttributes(); + + } + } + + } ); + + + // + + this.id = programIdCount ++; + this.code = code; + this.usedTimes = 1; + this.program = program; + this.vertexShader = glVertexShader; + this.fragmentShader = glFragmentShader; + + return this; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLPrograms( renderer, capabilities ) { + + var programs = []; + + var shaderIDs = { + MeshDepthMaterial: 'depth', + MeshNormalMaterial: 'normal', + MeshBasicMaterial: 'basic', + MeshLambertMaterial: 'lambert', + MeshPhongMaterial: 'phong', + MeshToonMaterial: 'phong', + MeshStandardMaterial: 'physical', + MeshPhysicalMaterial: 'physical', + LineBasicMaterial: 'basic', + LineDashedMaterial: 'dashed', + PointsMaterial: 'points' + }; + + var parameterNames = [ + "precision", "supportsVertexTextures", "map", "mapEncoding", "envMap", "envMapMode", "envMapEncoding", + "lightMap", "aoMap", "emissiveMap", "emissiveMapEncoding", "bumpMap", "normalMap", "displacementMap", "specularMap", + "roughnessMap", "metalnessMap", "gradientMap", + "alphaMap", "combine", "vertexColors", "fog", "useFog", "fogExp", + "flatShading", "sizeAttenuation", "logarithmicDepthBuffer", "skinning", + "maxBones", "useVertexTexture", "morphTargets", "morphNormals", + "maxMorphTargets", "maxMorphNormals", "premultipliedAlpha", + "numDirLights", "numPointLights", "numSpotLights", "numHemiLights", "numRectAreaLights", + "shadowMapEnabled", "shadowMapType", "toneMapping", 'physicallyCorrectLights', + "alphaTest", "doubleSided", "flipSided", "numClippingPlanes", "numClipIntersection", "depthPacking", "dithering" + ]; + + + function allocateBones( object ) { + + var skeleton = object.skeleton; + var bones = skeleton.bones; + + if ( capabilities.floatVertexTextures ) { + + return 1024; + + } else { + + // default for when object is not specified + // ( for example when prebuilding shader to be used with multiple objects ) + // + // - leave some extra space for other uniforms + // - limit here is ANGLE's 254 max uniform vectors + // (up to 54 should be safe) + + var nVertexUniforms = capabilities.maxVertexUniforms; + var nVertexMatrices = Math.floor( ( nVertexUniforms - 20 ) / 4 ); + + var maxBones = Math.min( nVertexMatrices, bones.length ); + + if ( maxBones < bones.length ) { + + console.warn( 'THREE.WebGLRenderer: Skeleton has ' + bones.length + ' bones. This GPU supports ' + maxBones + '.' ); + return 0; + + } + + return maxBones; + + } + + } + + function getTextureEncodingFromMap( map, gammaOverrideLinear ) { + + var encoding; + + if ( ! map ) { + + encoding = LinearEncoding; + + } else if ( map.isTexture ) { + + encoding = map.encoding; + + } else if ( map.isWebGLRenderTarget ) { + + console.warn( "THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead." ); + encoding = map.texture.encoding; + + } + + // add backwards compatibility for WebGLRenderer.gammaInput/gammaOutput parameter, should probably be removed at some point. + if ( encoding === LinearEncoding && gammaOverrideLinear ) { + + encoding = GammaEncoding; + + } + + return encoding; + + } + + this.getParameters = function ( material, lights, fog, nClipPlanes, nClipIntersection, object ) { + + var shaderID = shaderIDs[ material.type ]; + + // heuristics to create shader parameters according to lights in the scene + // (not to blow over maxLights budget) + + var maxBones = object.isSkinnedMesh ? allocateBones( object ) : 0; + var precision = renderer.getPrecision(); + + if ( material.precision !== null ) { + + precision = capabilities.getMaxPrecision( material.precision ); + + if ( precision !== material.precision ) { + + console.warn( 'THREE.WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' ); + + } + + } + + var currentRenderTarget = renderer.getRenderTarget(); + + var parameters = { + + shaderID: shaderID, + + precision: precision, + supportsVertexTextures: capabilities.vertexTextures, + outputEncoding: getTextureEncodingFromMap( ( ! currentRenderTarget ) ? null : currentRenderTarget.texture, renderer.gammaOutput ), + map: !! material.map, + mapEncoding: getTextureEncodingFromMap( material.map, renderer.gammaInput ), + envMap: !! material.envMap, + envMapMode: material.envMap && material.envMap.mapping, + envMapEncoding: getTextureEncodingFromMap( material.envMap, renderer.gammaInput ), + envMapCubeUV: ( !! material.envMap ) && ( ( material.envMap.mapping === CubeUVReflectionMapping ) || ( material.envMap.mapping === CubeUVRefractionMapping ) ), + lightMap: !! material.lightMap, + aoMap: !! material.aoMap, + emissiveMap: !! material.emissiveMap, + emissiveMapEncoding: getTextureEncodingFromMap( material.emissiveMap, renderer.gammaInput ), + bumpMap: !! material.bumpMap, + normalMap: !! material.normalMap, + displacementMap: !! material.displacementMap, + roughnessMap: !! material.roughnessMap, + metalnessMap: !! material.metalnessMap, + specularMap: !! material.specularMap, + alphaMap: !! material.alphaMap, + + gradientMap: !! material.gradientMap, + + combine: material.combine, + + vertexColors: material.vertexColors, + + fog: !! fog, + useFog: material.fog, + fogExp: ( fog && fog.isFogExp2 ), + + flatShading: material.shading === FlatShading, + + sizeAttenuation: material.sizeAttenuation, + logarithmicDepthBuffer: capabilities.logarithmicDepthBuffer, + + skinning: material.skinning && maxBones > 0, + maxBones: maxBones, + useVertexTexture: capabilities.floatVertexTextures, + + morphTargets: material.morphTargets, + morphNormals: material.morphNormals, + maxMorphTargets: renderer.maxMorphTargets, + maxMorphNormals: renderer.maxMorphNormals, + + numDirLights: lights.directional.length, + numPointLights: lights.point.length, + numSpotLights: lights.spot.length, + numRectAreaLights: lights.rectArea.length, + numHemiLights: lights.hemi.length, + + numClippingPlanes: nClipPlanes, + numClipIntersection: nClipIntersection, + + dithering: material.dithering, + + shadowMapEnabled: renderer.shadowMap.enabled && object.receiveShadow && lights.shadows.length > 0, + shadowMapType: renderer.shadowMap.type, + + toneMapping: renderer.toneMapping, + physicallyCorrectLights: renderer.physicallyCorrectLights, + + premultipliedAlpha: material.premultipliedAlpha, + + alphaTest: material.alphaTest, + doubleSided: material.side === DoubleSide, + flipSided: material.side === BackSide, + + depthPacking: ( material.depthPacking !== undefined ) ? material.depthPacking : false + + }; + + return parameters; + + }; + + this.getProgramCode = function ( material, parameters ) { + + var array = []; + + if ( parameters.shaderID ) { + + array.push( parameters.shaderID ); + + } else { + + array.push( material.fragmentShader ); + array.push( material.vertexShader ); + + } + + if ( material.defines !== undefined ) { + + for ( var name in material.defines ) { + + array.push( name ); + array.push( material.defines[ name ] ); + + } + + } + + for ( var i = 0; i < parameterNames.length; i ++ ) { + + array.push( parameters[ parameterNames[ i ] ] ); + + } + + return array.join(); + + }; + + this.acquireProgram = function ( material, parameters, code ) { + + var program; + + // Check if code has been already compiled + for ( var p = 0, pl = programs.length; p < pl; p ++ ) { + + var programInfo = programs[ p ]; + + if ( programInfo.code === code ) { + + program = programInfo; + ++ program.usedTimes; + + break; + + } + + } + + if ( program === undefined ) { + + program = new WebGLProgram( renderer, code, material, parameters ); + programs.push( program ); + + } + + return program; + + }; + + this.releaseProgram = function ( program ) { + + if ( -- program.usedTimes === 0 ) { + + // Remove from unordered set + var i = programs.indexOf( program ); + programs[ i ] = programs[ programs.length - 1 ]; + programs.pop(); + + // Free WebGL resources + program.destroy(); + + } + + }; + + // Exposed for resource monitoring & error feedback via renderer.info: + this.programs = programs; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLTextures( _gl, extensions, state, properties, capabilities, paramThreeToGL, infoMemory ) { + + var _isWebGL2 = ( typeof WebGL2RenderingContext !== 'undefined' && _gl instanceof WebGL2RenderingContext ); + + // + + function clampToMaxSize( image, maxSize ) { + + if ( image.width > maxSize || image.height > maxSize ) { + + // Warning: Scaling through the canvas will only work with images that use + // premultiplied alpha. + + var scale = maxSize / Math.max( image.width, image.height ); + + var canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); + canvas.width = Math.floor( image.width * scale ); + canvas.height = Math.floor( image.height * scale ); + + var context = canvas.getContext( '2d' ); + context.drawImage( image, 0, 0, image.width, image.height, 0, 0, canvas.width, canvas.height ); + + console.warn( 'THREE.WebGLRenderer: image is too big (' + image.width + 'x' + image.height + '). Resized to ' + canvas.width + 'x' + canvas.height, image ); + + return canvas; + + } + + return image; + + } + + function isPowerOfTwo( image ) { + + return _Math.isPowerOfTwo( image.width ) && _Math.isPowerOfTwo( image.height ); + + } + + function makePowerOfTwo( image ) { + + if ( image instanceof HTMLImageElement || image instanceof HTMLCanvasElement ) { + + var canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); + canvas.width = _Math.nearestPowerOfTwo( image.width ); + canvas.height = _Math.nearestPowerOfTwo( image.height ); + + var context = canvas.getContext( '2d' ); + context.drawImage( image, 0, 0, canvas.width, canvas.height ); + + console.warn( 'THREE.WebGLRenderer: image is not power of two (' + image.width + 'x' + image.height + '). Resized to ' + canvas.width + 'x' + canvas.height, image ); + + return canvas; + + } + + return image; + + } + + function textureNeedsPowerOfTwo( texture ) { + + return ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) || + ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ); + + } + + // Fallback filters for non-power-of-2 textures + + function filterFallback( f ) { + + if ( f === NearestFilter || f === NearestMipMapNearestFilter || f === NearestMipMapLinearFilter ) { + + return _gl.NEAREST; + + } + + return _gl.LINEAR; + + } + + // + + function onTextureDispose( event ) { + + var texture = event.target; + + texture.removeEventListener( 'dispose', onTextureDispose ); + + deallocateTexture( texture ); + + infoMemory.textures --; + + + } + + function onRenderTargetDispose( event ) { + + var renderTarget = event.target; + + renderTarget.removeEventListener( 'dispose', onRenderTargetDispose ); + + deallocateRenderTarget( renderTarget ); + + infoMemory.textures --; + + } + + // + + function deallocateTexture( texture ) { + + var textureProperties = properties.get( texture ); + + if ( texture.image && textureProperties.__image__webglTextureCube ) { + + // cube texture + + _gl.deleteTexture( textureProperties.__image__webglTextureCube ); + + } else { + + // 2D texture + + if ( textureProperties.__webglInit === undefined ) return; + + _gl.deleteTexture( textureProperties.__webglTexture ); + + } + + // remove all webgl properties + properties.remove( texture ); + + } + + function deallocateRenderTarget( renderTarget ) { + + var renderTargetProperties = properties.get( renderTarget ); + var textureProperties = properties.get( renderTarget.texture ); + + if ( ! renderTarget ) return; + + if ( textureProperties.__webglTexture !== undefined ) { + + _gl.deleteTexture( textureProperties.__webglTexture ); + + } + + if ( renderTarget.depthTexture ) { + + renderTarget.depthTexture.dispose(); + + } + + if ( renderTarget.isWebGLRenderTargetCube ) { + + for ( var i = 0; i < 6; i ++ ) { + + _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] ); + if ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] ); + + } + + } else { + + _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer ); + if ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer ); + + } + + properties.remove( renderTarget.texture ); + properties.remove( renderTarget ); + + } + + // + + + + function setTexture2D( texture, slot ) { + + var textureProperties = properties.get( texture ); + + if ( texture.version > 0 && textureProperties.__version !== texture.version ) { + + var image = texture.image; + + if ( image === undefined ) { + + console.warn( 'THREE.WebGLRenderer: Texture marked for update but image is undefined', texture ); + + } else if ( image.complete === false ) { + + console.warn( 'THREE.WebGLRenderer: Texture marked for update but image is incomplete', texture ); + + } else { + + uploadTexture( textureProperties, texture, slot ); + return; + + } + + } + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture ); + + } + + function setTextureCube( texture, slot ) { + + var textureProperties = properties.get( texture ); + + if ( texture.image.length === 6 ) { + + if ( texture.version > 0 && textureProperties.__version !== texture.version ) { + + if ( ! textureProperties.__image__webglTextureCube ) { + + texture.addEventListener( 'dispose', onTextureDispose ); + + textureProperties.__image__webglTextureCube = _gl.createTexture(); + + infoMemory.textures ++; + + } + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube ); + + _gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY ); + + var isCompressed = ( texture && texture.isCompressedTexture ); + var isDataTexture = ( texture.image[ 0 ] && texture.image[ 0 ].isDataTexture ); + + var cubeImage = []; + + for ( var i = 0; i < 6; i ++ ) { + + if ( ! isCompressed && ! isDataTexture ) { + + cubeImage[ i ] = clampToMaxSize( texture.image[ i ], capabilities.maxCubemapSize ); + + } else { + + cubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ]; + + } + + } + + var image = cubeImage[ 0 ], + isPowerOfTwoImage = isPowerOfTwo( image ), + glFormat = paramThreeToGL( texture.format ), + glType = paramThreeToGL( texture.type ); + + setTextureParameters( _gl.TEXTURE_CUBE_MAP, texture, isPowerOfTwoImage ); + + for ( var i = 0; i < 6; i ++ ) { + + if ( ! isCompressed ) { + + if ( isDataTexture ) { + + state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data ); + + } else { + + state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, glFormat, glType, cubeImage[ i ] ); + + } + + } else { + + var mipmap, mipmaps = cubeImage[ i ].mipmaps; + + for ( var j = 0, jl = mipmaps.length; j < jl; j ++ ) { + + mipmap = mipmaps[ j ]; + + if ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) { + + if ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) { + + state.compressedTexImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glFormat, mipmap.width, mipmap.height, 0, mipmap.data ); + + } else { + + console.warn( "THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()" ); + + } + + } else { + + state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); + + } + + } + + } + + } + + if ( texture.generateMipmaps && isPowerOfTwoImage ) { + + _gl.generateMipmap( _gl.TEXTURE_CUBE_MAP ); + + } + + textureProperties.__version = texture.version; + + if ( texture.onUpdate ) texture.onUpdate( texture ); + + } else { + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube ); + + } + + } + + } + + function setTextureCubeDynamic( texture, slot ) { + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_CUBE_MAP, properties.get( texture ).__webglTexture ); + + } + + function setTextureParameters( textureType, texture, isPowerOfTwoImage ) { + + var extension; + + if ( isPowerOfTwoImage ) { + + _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, paramThreeToGL( texture.wrapS ) ); + _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, paramThreeToGL( texture.wrapT ) ); + + _gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, paramThreeToGL( texture.magFilter ) ); + _gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, paramThreeToGL( texture.minFilter ) ); + + } else { + + _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE ); + _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE ); + + if ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) { + + console.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.', texture ); + + } + + _gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterFallback( texture.magFilter ) ); + _gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterFallback( texture.minFilter ) ); + + if ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) { + + console.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.', texture ); + + } + + } + + extension = extensions.get( 'EXT_texture_filter_anisotropic' ); + + if ( extension ) { + + if ( texture.type === FloatType && extensions.get( 'OES_texture_float_linear' ) === null ) return; + if ( texture.type === HalfFloatType && extensions.get( 'OES_texture_half_float_linear' ) === null ) return; + + if ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) { + + _gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, capabilities.getMaxAnisotropy() ) ); + properties.get( texture ).__currentAnisotropy = texture.anisotropy; + + } + + } + + } + + function uploadTexture( textureProperties, texture, slot ) { + + if ( textureProperties.__webglInit === undefined ) { + + textureProperties.__webglInit = true; + + texture.addEventListener( 'dispose', onTextureDispose ); + + textureProperties.__webglTexture = _gl.createTexture(); + + infoMemory.textures ++; + + } + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture ); + + _gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY ); + _gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha ); + _gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment ); + + var image = clampToMaxSize( texture.image, capabilities.maxTextureSize ); + + if ( textureNeedsPowerOfTwo( texture ) && isPowerOfTwo( image ) === false ) { + + image = makePowerOfTwo( image ); + + } + + var isPowerOfTwoImage = isPowerOfTwo( image ), + glFormat = paramThreeToGL( texture.format ), + glType = paramThreeToGL( texture.type ); + + setTextureParameters( _gl.TEXTURE_2D, texture, isPowerOfTwoImage ); + + var mipmap, mipmaps = texture.mipmaps; + + if ( texture.isDepthTexture ) { + + // populate depth texture with dummy data + + var internalFormat = _gl.DEPTH_COMPONENT; + + if ( texture.type === FloatType ) { + + if ( !_isWebGL2 ) throw new Error('Float Depth Texture only supported in WebGL2.0'); + internalFormat = _gl.DEPTH_COMPONENT32F; + + } else if ( _isWebGL2 ) { + + // WebGL 2.0 requires signed internalformat for glTexImage2D + internalFormat = _gl.DEPTH_COMPONENT16; + + } + + if ( texture.format === DepthFormat && internalFormat === _gl.DEPTH_COMPONENT ) { + + // The error INVALID_OPERATION is generated by texImage2D if format and internalformat are + // DEPTH_COMPONENT and type is not UNSIGNED_SHORT or UNSIGNED_INT + // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/) + if ( texture.type !== UnsignedShortType && texture.type !== UnsignedIntType ) { + + console.warn( 'THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture.' ); + + texture.type = UnsignedShortType; + glType = paramThreeToGL( texture.type ); + + } + + } + + // Depth stencil textures need the DEPTH_STENCIL internal format + // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/) + if ( texture.format === DepthStencilFormat ) { + + internalFormat = _gl.DEPTH_STENCIL; + + // The error INVALID_OPERATION is generated by texImage2D if format and internalformat are + // DEPTH_STENCIL and type is not UNSIGNED_INT_24_8_WEBGL. + // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/) + if ( texture.type !== UnsignedInt248Type ) { + + console.warn( 'THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture.' ); + + texture.type = UnsignedInt248Type; + glType = paramThreeToGL( texture.type ); + + } + + } + + state.texImage2D( _gl.TEXTURE_2D, 0, internalFormat, image.width, image.height, 0, glFormat, glType, null ); + + } else if ( texture.isDataTexture ) { + + // use manually created mipmaps if available + // if there are no manual mipmaps + // set 0 level mipmap and then use GL to generate other mipmap levels + + if ( mipmaps.length > 0 && isPowerOfTwoImage ) { + + for ( var i = 0, il = mipmaps.length; i < il; i ++ ) { + + mipmap = mipmaps[ i ]; + state.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); + + } + + texture.generateMipmaps = false; + + } else { + + state.texImage2D( _gl.TEXTURE_2D, 0, glFormat, image.width, image.height, 0, glFormat, glType, image.data ); + + } + + } else if ( texture.isCompressedTexture ) { + + for ( var i = 0, il = mipmaps.length; i < il; i ++ ) { + + mipmap = mipmaps[ i ]; + + if ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) { + + if ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) { + + state.compressedTexImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, mipmap.data ); + + } else { + + console.warn( "THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()" ); + + } + + } else { + + state.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); + + } + + } + + } else { + + // regular Texture (image, video, canvas) + + // use manually created mipmaps if available + // if there are no manual mipmaps + // set 0 level mipmap and then use GL to generate other mipmap levels + + if ( mipmaps.length > 0 && isPowerOfTwoImage ) { + + for ( var i = 0, il = mipmaps.length; i < il; i ++ ) { + + mipmap = mipmaps[ i ]; + state.texImage2D( _gl.TEXTURE_2D, i, glFormat, glFormat, glType, mipmap ); + + } + + texture.generateMipmaps = false; + + } else { + + state.texImage2D( _gl.TEXTURE_2D, 0, glFormat, glFormat, glType, image ); + + } + + } + + if ( texture.generateMipmaps && isPowerOfTwoImage ) _gl.generateMipmap( _gl.TEXTURE_2D ); + + textureProperties.__version = texture.version; + + if ( texture.onUpdate ) texture.onUpdate( texture ); + + } + + // Render targets + + // Setup storage for target texture and bind it to correct framebuffer + function setupFrameBufferTexture( framebuffer, renderTarget, attachment, textureTarget ) { + + var glFormat = paramThreeToGL( renderTarget.texture.format ); + var glType = paramThreeToGL( renderTarget.texture.type ); + state.texImage2D( textureTarget, 0, glFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null ); + _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); + _gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( renderTarget.texture ).__webglTexture, 0 ); + _gl.bindFramebuffer( _gl.FRAMEBUFFER, null ); + + } + + // Setup storage for internal depth/stencil buffers and bind to correct framebuffer + function setupRenderBufferStorage( renderbuffer, renderTarget ) { + + _gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer ); + + if ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) { + + _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_COMPONENT16, renderTarget.width, renderTarget.height ); + _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer ); + + } else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) { + + _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_STENCIL, renderTarget.width, renderTarget.height ); + _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer ); + + } else { + + // FIXME: We don't support !depth !stencil + _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.RGBA4, renderTarget.width, renderTarget.height ); + + } + + _gl.bindRenderbuffer( _gl.RENDERBUFFER, null ); + + } + + // Setup resources for a Depth Texture for a FBO (needs an extension) + function setupDepthTexture( framebuffer, renderTarget ) { + + var isCube = ( renderTarget && renderTarget.isWebGLRenderTargetCube ); + if ( isCube ) throw new Error('Depth Texture with cube render targets is not supported!'); + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); + + if ( !( renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture ) ) { + + throw new Error('renderTarget.depthTexture must be an instance of THREE.DepthTexture'); + + } + + // upload an empty depth texture with framebuffer size + if ( !properties.get( renderTarget.depthTexture ).__webglTexture || + renderTarget.depthTexture.image.width !== renderTarget.width || + renderTarget.depthTexture.image.height !== renderTarget.height ) { + renderTarget.depthTexture.image.width = renderTarget.width; + renderTarget.depthTexture.image.height = renderTarget.height; + renderTarget.depthTexture.needsUpdate = true; + } + + setTexture2D( renderTarget.depthTexture, 0 ); + + var webglDepthTexture = properties.get( renderTarget.depthTexture ).__webglTexture; + + if ( renderTarget.depthTexture.format === DepthFormat ) { + + _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 ); + + } else if ( renderTarget.depthTexture.format === DepthStencilFormat ) { + + _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 ); + + } else { + + throw new Error('Unknown depthTexture format') + + } + + } + + // Setup GL resources for a non-texture depth buffer + function setupDepthRenderbuffer( renderTarget ) { + + var renderTargetProperties = properties.get( renderTarget ); + + var isCube = ( renderTarget.isWebGLRenderTargetCube === true ); + + if ( renderTarget.depthTexture ) { + + if ( isCube ) throw new Error('target.depthTexture not supported in Cube render targets'); + + setupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget ); + + } else { + + if ( isCube ) { + + renderTargetProperties.__webglDepthbuffer = []; + + for ( var i = 0; i < 6; i ++ ) { + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ i ] ); + renderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer(); + setupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget ); + + } + + } else { + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer ); + renderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer(); + setupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget ); + + } + + } + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, null ); + + } + + // Set up GL resources for the render target + function setupRenderTarget( renderTarget ) { + + var renderTargetProperties = properties.get( renderTarget ); + var textureProperties = properties.get( renderTarget.texture ); + + renderTarget.addEventListener( 'dispose', onRenderTargetDispose ); + + textureProperties.__webglTexture = _gl.createTexture(); + + infoMemory.textures ++; + + var isCube = ( renderTarget.isWebGLRenderTargetCube === true ); + var isTargetPowerOfTwo = isPowerOfTwo( renderTarget ); + + // Setup framebuffer + + if ( isCube ) { + + renderTargetProperties.__webglFramebuffer = []; + + for ( var i = 0; i < 6; i ++ ) { + + renderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer(); + + } + + } else { + + renderTargetProperties.__webglFramebuffer = _gl.createFramebuffer(); + + } + + // Setup color buffer + + if ( isCube ) { + + state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture ); + setTextureParameters( _gl.TEXTURE_CUBE_MAP, renderTarget.texture, isTargetPowerOfTwo ); + + for ( var i = 0; i < 6; i ++ ) { + + setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i ); + + } + + if ( renderTarget.texture.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_CUBE_MAP ); + state.bindTexture( _gl.TEXTURE_CUBE_MAP, null ); + + } else { + + state.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture ); + setTextureParameters( _gl.TEXTURE_2D, renderTarget.texture, isTargetPowerOfTwo ); + setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D ); + + if ( renderTarget.texture.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_2D ); + state.bindTexture( _gl.TEXTURE_2D, null ); + + } + + // Setup depth and stencil buffers + + if ( renderTarget.depthBuffer ) { + + setupDepthRenderbuffer( renderTarget ); + + } + + } + + function updateRenderTargetMipmap( renderTarget ) { + + var texture = renderTarget.texture; + + if ( texture.generateMipmaps && isPowerOfTwo( renderTarget ) && + texture.minFilter !== NearestFilter && + texture.minFilter !== LinearFilter ) { + + var target = (renderTarget && renderTarget.isWebGLRenderTargetCube) ? _gl.TEXTURE_CUBE_MAP : _gl.TEXTURE_2D; + var webglTexture = properties.get( texture ).__webglTexture; + + state.bindTexture( target, webglTexture ); + _gl.generateMipmap( target ); + state.bindTexture( target, null ); + + } + + } + + this.setTexture2D = setTexture2D; + this.setTextureCube = setTextureCube; + this.setTextureCubeDynamic = setTextureCubeDynamic; + this.setupRenderTarget = setupRenderTarget; + this.updateRenderTargetMipmap = updateRenderTargetMipmap; + + } + + /** + * @author fordacious / fordacious.github.io + */ + + function WebGLProperties() { + + var properties = {}; + + function get( object ) { + + var uuid = object.uuid; + var map = properties[ uuid ]; + + if ( map === undefined ) { + + map = {}; + properties[ uuid ] = map; + + } + + return map; + + } + + function remove( object ) { + + delete properties[ object.uuid ]; + + } + + function clear() { + + properties = {}; + + } + + return { + get: get, + remove: remove, + clear: clear + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLState( gl, extensions, paramThreeToGL ) { + + function ColorBuffer() { + + var locked = false; + + var color = new Vector4(); + var currentColorMask = null; + var currentColorClear = new Vector4(); + + return { + + setMask: function ( colorMask ) { + + if ( currentColorMask !== colorMask && ! locked ) { + + gl.colorMask( colorMask, colorMask, colorMask, colorMask ); + currentColorMask = colorMask; + + } + + }, + + setLocked: function ( lock ) { + + locked = lock; + + }, + + setClear: function ( r, g, b, a, premultipliedAlpha ) { + + if ( premultipliedAlpha === true ) { + + r *= a; g *= a; b *= a; + + } + + color.set( r, g, b, a ); + + if ( currentColorClear.equals( color ) === false ) { + + gl.clearColor( r, g, b, a ); + currentColorClear.copy( color ); + + } + + }, + + reset: function () { + + locked = false; + + currentColorMask = null; + currentColorClear.set( 0, 0, 0, 1 ); + + } + + }; + + } + + function DepthBuffer() { + + var locked = false; + + var currentDepthMask = null; + var currentDepthFunc = null; + var currentDepthClear = null; + + return { + + setTest: function ( depthTest ) { + + if ( depthTest ) { + + enable( gl.DEPTH_TEST ); + + } else { + + disable( gl.DEPTH_TEST ); + + } + + }, + + setMask: function ( depthMask ) { + + if ( currentDepthMask !== depthMask && ! locked ) { + + gl.depthMask( depthMask ); + currentDepthMask = depthMask; + + } + + }, + + setFunc: function ( depthFunc ) { + + if ( currentDepthFunc !== depthFunc ) { + + if ( depthFunc ) { + + switch ( depthFunc ) { + + case NeverDepth: + + gl.depthFunc( gl.NEVER ); + break; + + case AlwaysDepth: + + gl.depthFunc( gl.ALWAYS ); + break; + + case LessDepth: + + gl.depthFunc( gl.LESS ); + break; + + case LessEqualDepth: + + gl.depthFunc( gl.LEQUAL ); + break; + + case EqualDepth: + + gl.depthFunc( gl.EQUAL ); + break; + + case GreaterEqualDepth: + + gl.depthFunc( gl.GEQUAL ); + break; + + case GreaterDepth: + + gl.depthFunc( gl.GREATER ); + break; + + case NotEqualDepth: + + gl.depthFunc( gl.NOTEQUAL ); + break; + + default: + + gl.depthFunc( gl.LEQUAL ); + + } + + } else { + + gl.depthFunc( gl.LEQUAL ); + + } + + currentDepthFunc = depthFunc; + + } + + }, + + setLocked: function ( lock ) { + + locked = lock; + + }, + + setClear: function ( depth ) { + + if ( currentDepthClear !== depth ) { + + gl.clearDepth( depth ); + currentDepthClear = depth; + + } + + }, + + reset: function () { + + locked = false; + + currentDepthMask = null; + currentDepthFunc = null; + currentDepthClear = null; + + } + + }; + + } + + function StencilBuffer() { + + var locked = false; + + var currentStencilMask = null; + var currentStencilFunc = null; + var currentStencilRef = null; + var currentStencilFuncMask = null; + var currentStencilFail = null; + var currentStencilZFail = null; + var currentStencilZPass = null; + var currentStencilClear = null; + + return { + + setTest: function ( stencilTest ) { + + if ( stencilTest ) { + + enable( gl.STENCIL_TEST ); + + } else { + + disable( gl.STENCIL_TEST ); + + } + + }, + + setMask: function ( stencilMask ) { + + if ( currentStencilMask !== stencilMask && ! locked ) { + + gl.stencilMask( stencilMask ); + currentStencilMask = stencilMask; + + } + + }, + + setFunc: function ( stencilFunc, stencilRef, stencilMask ) { + + if ( currentStencilFunc !== stencilFunc || + currentStencilRef !== stencilRef || + currentStencilFuncMask !== stencilMask ) { + + gl.stencilFunc( stencilFunc, stencilRef, stencilMask ); + + currentStencilFunc = stencilFunc; + currentStencilRef = stencilRef; + currentStencilFuncMask = stencilMask; + + } + + }, + + setOp: function ( stencilFail, stencilZFail, stencilZPass ) { + + if ( currentStencilFail !== stencilFail || + currentStencilZFail !== stencilZFail || + currentStencilZPass !== stencilZPass ) { + + gl.stencilOp( stencilFail, stencilZFail, stencilZPass ); + + currentStencilFail = stencilFail; + currentStencilZFail = stencilZFail; + currentStencilZPass = stencilZPass; + + } + + }, + + setLocked: function ( lock ) { + + locked = lock; + + }, + + setClear: function ( stencil ) { + + if ( currentStencilClear !== stencil ) { + + gl.clearStencil( stencil ); + currentStencilClear = stencil; + + } + + }, + + reset: function () { + + locked = false; + + currentStencilMask = null; + currentStencilFunc = null; + currentStencilRef = null; + currentStencilFuncMask = null; + currentStencilFail = null; + currentStencilZFail = null; + currentStencilZPass = null; + currentStencilClear = null; + + } + + }; + + } + + // + + var colorBuffer = new ColorBuffer(); + var depthBuffer = new DepthBuffer(); + var stencilBuffer = new StencilBuffer(); + + var maxVertexAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS ); + var newAttributes = new Uint8Array( maxVertexAttributes ); + var enabledAttributes = new Uint8Array( maxVertexAttributes ); + var attributeDivisors = new Uint8Array( maxVertexAttributes ); + + var capabilities = {}; + + var compressedTextureFormats = null; + + var currentBlending = null; + var currentBlendEquation = null; + var currentBlendSrc = null; + var currentBlendDst = null; + var currentBlendEquationAlpha = null; + var currentBlendSrcAlpha = null; + var currentBlendDstAlpha = null; + var currentPremultipledAlpha = false; + + var currentFlipSided = null; + var currentCullFace = null; + + var currentLineWidth = null; + + var currentPolygonOffsetFactor = null; + var currentPolygonOffsetUnits = null; + + var currentScissorTest = null; + + var maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS ); + + var version = parseFloat( /^WebGL\ ([0-9])/.exec( gl.getParameter( gl.VERSION ) )[ 1 ] ); + var lineWidthAvailable = parseFloat( version ) >= 1.0; + + var currentTextureSlot = null; + var currentBoundTextures = {}; + + var currentScissor = new Vector4(); + var currentViewport = new Vector4(); + + function createTexture( type, target, count ) { + + var data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4. + var texture = gl.createTexture(); + + gl.bindTexture( type, texture ); + gl.texParameteri( type, gl.TEXTURE_MIN_FILTER, gl.NEAREST ); + gl.texParameteri( type, gl.TEXTURE_MAG_FILTER, gl.NEAREST ); + + for ( var i = 0; i < count; i ++ ) { + + gl.texImage2D( target + i, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data ); + + } + + return texture; + + } + + var emptyTextures = {}; + emptyTextures[ gl.TEXTURE_2D ] = createTexture( gl.TEXTURE_2D, gl.TEXTURE_2D, 1 ); + emptyTextures[ gl.TEXTURE_CUBE_MAP ] = createTexture( gl.TEXTURE_CUBE_MAP, gl.TEXTURE_CUBE_MAP_POSITIVE_X, 6 ); + + // + + function init() { + + colorBuffer.setClear( 0, 0, 0, 1 ); + depthBuffer.setClear( 1 ); + stencilBuffer.setClear( 0 ); + + enable( gl.DEPTH_TEST ); + depthBuffer.setFunc( LessEqualDepth ); + + setFlipSided( false ); + setCullFace( CullFaceBack ); + enable( gl.CULL_FACE ); + + enable( gl.BLEND ); + setBlending( NormalBlending ); + + } + + function initAttributes() { + + for ( var i = 0, l = newAttributes.length; i < l; i ++ ) { + + newAttributes[ i ] = 0; + + } + + } + + function enableAttribute( attribute ) { + + newAttributes[ attribute ] = 1; + + if ( enabledAttributes[ attribute ] === 0 ) { + + gl.enableVertexAttribArray( attribute ); + enabledAttributes[ attribute ] = 1; + + } + + if ( attributeDivisors[ attribute ] !== 0 ) { + + var extension = extensions.get( 'ANGLE_instanced_arrays' ); + + extension.vertexAttribDivisorANGLE( attribute, 0 ); + attributeDivisors[ attribute ] = 0; + + } + + } + + function enableAttributeAndDivisor( attribute, meshPerAttribute ) { + + newAttributes[ attribute ] = 1; + + if ( enabledAttributes[ attribute ] === 0 ) { + + gl.enableVertexAttribArray( attribute ); + enabledAttributes[ attribute ] = 1; + + } + + if ( attributeDivisors[ attribute ] !== meshPerAttribute ) { + + var extension = extensions.get( 'ANGLE_instanced_arrays' ); + + extension.vertexAttribDivisorANGLE( attribute, meshPerAttribute ); + attributeDivisors[ attribute ] = meshPerAttribute; + + } + + } + + function disableUnusedAttributes() { + + for ( var i = 0, l = enabledAttributes.length; i !== l; ++ i ) { + + if ( enabledAttributes[ i ] !== newAttributes[ i ] ) { + + gl.disableVertexAttribArray( i ); + enabledAttributes[ i ] = 0; + + } + + } + + } + + function enable( id ) { + + if ( capabilities[ id ] !== true ) { + + gl.enable( id ); + capabilities[ id ] = true; + + } + + } + + function disable( id ) { + + if ( capabilities[ id ] !== false ) { + + gl.disable( id ); + capabilities[ id ] = false; + + } + + } + + function getCompressedTextureFormats() { + + if ( compressedTextureFormats === null ) { + + compressedTextureFormats = []; + + if ( extensions.get( 'WEBGL_compressed_texture_pvrtc' ) || + extensions.get( 'WEBGL_compressed_texture_s3tc' ) || + extensions.get( 'WEBGL_compressed_texture_etc1' ) ) { + + var formats = gl.getParameter( gl.COMPRESSED_TEXTURE_FORMATS ); + + for ( var i = 0; i < formats.length; i ++ ) { + + compressedTextureFormats.push( formats[ i ] ); + + } + + } + + } + + return compressedTextureFormats; + + } + + function setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, premultipliedAlpha ) { + + if ( blending !== NoBlending ) { + + enable( gl.BLEND ); + + } else { + + disable( gl.BLEND ); + + } + + if ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) { + + if ( blending === AdditiveBlending ) { + + if ( premultipliedAlpha ) { + + gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD ); + gl.blendFuncSeparate( gl.ONE, gl.ONE, gl.ONE, gl.ONE ); + + } else { + + gl.blendEquation( gl.FUNC_ADD ); + gl.blendFunc( gl.SRC_ALPHA, gl.ONE ); + + } + + } else if ( blending === SubtractiveBlending ) { + + if ( premultipliedAlpha ) { + + gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD ); + gl.blendFuncSeparate( gl.ZERO, gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ONE_MINUS_SRC_ALPHA ); + + } else { + + gl.blendEquation( gl.FUNC_ADD ); + gl.blendFunc( gl.ZERO, gl.ONE_MINUS_SRC_COLOR ); + + } + + } else if ( blending === MultiplyBlending ) { + + if ( premultipliedAlpha ) { + + gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD ); + gl.blendFuncSeparate( gl.ZERO, gl.SRC_COLOR, gl.ZERO, gl.SRC_ALPHA ); + + } else { + + gl.blendEquation( gl.FUNC_ADD ); + gl.blendFunc( gl.ZERO, gl.SRC_COLOR ); + + } + + } else { + + if ( premultipliedAlpha ) { + + gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD ); + gl.blendFuncSeparate( gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA ); + + } else { + + gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD ); + gl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA ); + + } + + } + + currentBlending = blending; + currentPremultipledAlpha = premultipliedAlpha; + + } + + if ( blending === CustomBlending ) { + + blendEquationAlpha = blendEquationAlpha || blendEquation; + blendSrcAlpha = blendSrcAlpha || blendSrc; + blendDstAlpha = blendDstAlpha || blendDst; + + if ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) { + + gl.blendEquationSeparate( paramThreeToGL( blendEquation ), paramThreeToGL( blendEquationAlpha ) ); + + currentBlendEquation = blendEquation; + currentBlendEquationAlpha = blendEquationAlpha; + + } + + if ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) { + + gl.blendFuncSeparate( paramThreeToGL( blendSrc ), paramThreeToGL( blendDst ), paramThreeToGL( blendSrcAlpha ), paramThreeToGL( blendDstAlpha ) ); + + currentBlendSrc = blendSrc; + currentBlendDst = blendDst; + currentBlendSrcAlpha = blendSrcAlpha; + currentBlendDstAlpha = blendDstAlpha; + + } + + } else { + + currentBlendEquation = null; + currentBlendSrc = null; + currentBlendDst = null; + currentBlendEquationAlpha = null; + currentBlendSrcAlpha = null; + currentBlendDstAlpha = null; + + } + + } + + function setMaterial( material ) { + + material.side === DoubleSide + ? disable( gl.CULL_FACE ) + : enable( gl.CULL_FACE ); + + setFlipSided( material.side === BackSide ); + + material.transparent === true + ? setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha ) + : setBlending( NoBlending ); + + depthBuffer.setFunc( material.depthFunc ); + depthBuffer.setTest( material.depthTest ); + depthBuffer.setMask( material.depthWrite ); + colorBuffer.setMask( material.colorWrite ); + + setPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits ); + + } + + // + + function setFlipSided( flipSided ) { + + if ( currentFlipSided !== flipSided ) { + + if ( flipSided ) { + + gl.frontFace( gl.CW ); + + } else { + + gl.frontFace( gl.CCW ); + + } + + currentFlipSided = flipSided; + + } + + } + + function setCullFace( cullFace ) { + + if ( cullFace !== CullFaceNone ) { + + enable( gl.CULL_FACE ); + + if ( cullFace !== currentCullFace ) { + + if ( cullFace === CullFaceBack ) { + + gl.cullFace( gl.BACK ); + + } else if ( cullFace === CullFaceFront ) { + + gl.cullFace( gl.FRONT ); + + } else { + + gl.cullFace( gl.FRONT_AND_BACK ); + + } + + } + + } else { + + disable( gl.CULL_FACE ); + + } + + currentCullFace = cullFace; + + } + + function setLineWidth( width ) { + + if ( width !== currentLineWidth ) { + + if ( lineWidthAvailable ) gl.lineWidth( width ); + + currentLineWidth = width; + + } + + } + + function setPolygonOffset( polygonOffset, factor, units ) { + + if ( polygonOffset ) { + + enable( gl.POLYGON_OFFSET_FILL ); + + if ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) { + + gl.polygonOffset( factor, units ); + + currentPolygonOffsetFactor = factor; + currentPolygonOffsetUnits = units; + + } + + } else { + + disable( gl.POLYGON_OFFSET_FILL ); + + } + + } + + function getScissorTest() { + + return currentScissorTest; + + } + + function setScissorTest( scissorTest ) { + + currentScissorTest = scissorTest; + + if ( scissorTest ) { + + enable( gl.SCISSOR_TEST ); + + } else { + + disable( gl.SCISSOR_TEST ); + + } + + } + + // texture + + function activeTexture( webglSlot ) { + + if ( webglSlot === undefined ) webglSlot = gl.TEXTURE0 + maxTextures - 1; + + if ( currentTextureSlot !== webglSlot ) { + + gl.activeTexture( webglSlot ); + currentTextureSlot = webglSlot; + + } + + } + + function bindTexture( webglType, webglTexture ) { + + if ( currentTextureSlot === null ) { + + activeTexture(); + + } + + var boundTexture = currentBoundTextures[ currentTextureSlot ]; + + if ( boundTexture === undefined ) { + + boundTexture = { type: undefined, texture: undefined }; + currentBoundTextures[ currentTextureSlot ] = boundTexture; + + } + + if ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) { + + gl.bindTexture( webglType, webglTexture || emptyTextures[ webglType ] ); + + boundTexture.type = webglType; + boundTexture.texture = webglTexture; + + } + + } + + function compressedTexImage2D() { + + try { + + gl.compressedTexImage2D.apply( gl, arguments ); + + } catch ( error ) { + + console.error( error ); + + } + + } + + function texImage2D() { + + try { + + gl.texImage2D.apply( gl, arguments ); + + } catch ( error ) { + + console.error( error ); + + } + + } + + // + + function scissor( scissor ) { + + if ( currentScissor.equals( scissor ) === false ) { + + gl.scissor( scissor.x, scissor.y, scissor.z, scissor.w ); + currentScissor.copy( scissor ); + + } + + } + + function viewport( viewport ) { + + if ( currentViewport.equals( viewport ) === false ) { + + gl.viewport( viewport.x, viewport.y, viewport.z, viewport.w ); + currentViewport.copy( viewport ); + + } + + } + + // + + function reset() { + + for ( var i = 0; i < enabledAttributes.length; i ++ ) { + + if ( enabledAttributes[ i ] === 1 ) { + + gl.disableVertexAttribArray( i ); + enabledAttributes[ i ] = 0; + + } + + } + + capabilities = {}; + + compressedTextureFormats = null; + + currentTextureSlot = null; + currentBoundTextures = {}; + + currentBlending = null; + + currentFlipSided = null; + currentCullFace = null; + + colorBuffer.reset(); + depthBuffer.reset(); + stencilBuffer.reset(); + + } + + return { + + buffers: { + color: colorBuffer, + depth: depthBuffer, + stencil: stencilBuffer + }, + + init: init, + initAttributes: initAttributes, + enableAttribute: enableAttribute, + enableAttributeAndDivisor: enableAttributeAndDivisor, + disableUnusedAttributes: disableUnusedAttributes, + enable: enable, + disable: disable, + getCompressedTextureFormats: getCompressedTextureFormats, + + setBlending: setBlending, + setMaterial: setMaterial, + + setFlipSided: setFlipSided, + setCullFace: setCullFace, + + setLineWidth: setLineWidth, + setPolygonOffset: setPolygonOffset, + + getScissorTest: getScissorTest, + setScissorTest: setScissorTest, + + activeTexture: activeTexture, + bindTexture: bindTexture, + compressedTexImage2D: compressedTexImage2D, + texImage2D: texImage2D, + + scissor: scissor, + viewport: viewport, + + reset: reset + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLCapabilities( gl, extensions, parameters ) { + + var maxAnisotropy; + + function getMaxAnisotropy() { + + if ( maxAnisotropy !== undefined ) return maxAnisotropy; + + var extension = extensions.get( 'EXT_texture_filter_anisotropic' ); + + if ( extension !== null ) { + + maxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT ); + + } else { + + maxAnisotropy = 0; + + } + + return maxAnisotropy; + + } + + function getMaxPrecision( precision ) { + + if ( precision === 'highp' ) { + + if ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.HIGH_FLOAT ).precision > 0 && + gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.HIGH_FLOAT ).precision > 0 ) { + + return 'highp'; + + } + + precision = 'mediump'; + + } + + if ( precision === 'mediump' ) { + + if ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.MEDIUM_FLOAT ).precision > 0 && + gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT ).precision > 0 ) { + + return 'mediump'; + + } + + } + + return 'lowp'; + + } + + var precision = parameters.precision !== undefined ? parameters.precision : 'highp'; + var maxPrecision = getMaxPrecision( precision ); + + if ( maxPrecision !== precision ) { + + console.warn( 'THREE.WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' ); + precision = maxPrecision; + + } + + var logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true && !! extensions.get( 'EXT_frag_depth' ); + + var maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS ); + var maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS ); + var maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE ); + var maxCubemapSize = gl.getParameter( gl.MAX_CUBE_MAP_TEXTURE_SIZE ); + + var maxAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS ); + var maxVertexUniforms = gl.getParameter( gl.MAX_VERTEX_UNIFORM_VECTORS ); + var maxVaryings = gl.getParameter( gl.MAX_VARYING_VECTORS ); + var maxFragmentUniforms = gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS ); + + var vertexTextures = maxVertexTextures > 0; + var floatFragmentTextures = !! extensions.get( 'OES_texture_float' ); + var floatVertexTextures = vertexTextures && floatFragmentTextures; + + return { + + getMaxAnisotropy: getMaxAnisotropy, + getMaxPrecision: getMaxPrecision, + + precision: precision, + logarithmicDepthBuffer: logarithmicDepthBuffer, + + maxTextures: maxTextures, + maxVertexTextures: maxVertexTextures, + maxTextureSize: maxTextureSize, + maxCubemapSize: maxCubemapSize, + + maxAttributes: maxAttributes, + maxVertexUniforms: maxVertexUniforms, + maxVaryings: maxVaryings, + maxFragmentUniforms: maxFragmentUniforms, + + vertexTextures: vertexTextures, + floatFragmentTextures: floatFragmentTextures, + floatVertexTextures: floatVertexTextures + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLExtensions( gl ) { + + var extensions = {}; + + return { + + get: function ( name ) { + + if ( extensions[ name ] !== undefined ) { + + return extensions[ name ]; + + } + + var extension; + + switch ( name ) { + + case 'WEBGL_depth_texture': + extension = gl.getExtension( 'WEBGL_depth_texture' ) || gl.getExtension( 'MOZ_WEBGL_depth_texture' ) || gl.getExtension( 'WEBKIT_WEBGL_depth_texture' ); + break; + + case 'EXT_texture_filter_anisotropic': + extension = gl.getExtension( 'EXT_texture_filter_anisotropic' ) || gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) || gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' ); + break; + + case 'WEBGL_compressed_texture_s3tc': + extension = gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' ); + break; + + case 'WEBGL_compressed_texture_pvrtc': + extension = gl.getExtension( 'WEBGL_compressed_texture_pvrtc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_pvrtc' ); + break; + + case 'WEBGL_compressed_texture_etc1': + extension = gl.getExtension( 'WEBGL_compressed_texture_etc1' ); + break; + + default: + extension = gl.getExtension( name ); + + } + + if ( extension === null ) { + + console.warn( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' ); + + } + + extensions[ name ] = extension; + + return extension; + + } + + }; + + } + + /** + * @author tschw + */ + + function WebGLClipping() { + + var scope = this, + + globalState = null, + numGlobalPlanes = 0, + localClippingEnabled = false, + renderingShadows = false, + + plane = new Plane(), + viewNormalMatrix = new Matrix3(), + + uniform = { value: null, needsUpdate: false }; + + this.uniform = uniform; + this.numPlanes = 0; + this.numIntersection = 0; + + this.init = function( planes, enableLocalClipping, camera ) { + + var enabled = + planes.length !== 0 || + enableLocalClipping || + // enable state of previous frame - the clipping code has to + // run another frame in order to reset the state: + numGlobalPlanes !== 0 || + localClippingEnabled; + + localClippingEnabled = enableLocalClipping; + + globalState = projectPlanes( planes, camera, 0 ); + numGlobalPlanes = planes.length; + + return enabled; + + }; + + this.beginShadows = function() { + + renderingShadows = true; + projectPlanes( null ); + + }; + + this.endShadows = function() { + + renderingShadows = false; + resetGlobalState(); + + }; + + this.setState = function( planes, clipIntersection, clipShadows, camera, cache, fromCache ) { + + if ( ! localClippingEnabled || + planes === null || planes.length === 0 || + renderingShadows && ! clipShadows ) { + // there's no local clipping + + if ( renderingShadows ) { + // there's no global clipping + + projectPlanes( null ); + + } else { + + resetGlobalState(); + } + + } else { + + var nGlobal = renderingShadows ? 0 : numGlobalPlanes, + lGlobal = nGlobal * 4, + + dstArray = cache.clippingState || null; + + uniform.value = dstArray; // ensure unique state + + dstArray = projectPlanes( planes, camera, lGlobal, fromCache ); + + for ( var i = 0; i !== lGlobal; ++ i ) { + + dstArray[ i ] = globalState[ i ]; + + } + + cache.clippingState = dstArray; + this.numIntersection = clipIntersection ? this.numPlanes : 0; + this.numPlanes += nGlobal; + + } + + + }; + + function resetGlobalState() { + + if ( uniform.value !== globalState ) { + + uniform.value = globalState; + uniform.needsUpdate = numGlobalPlanes > 0; + + } + + scope.numPlanes = numGlobalPlanes; + scope.numIntersection = 0; + + } + + function projectPlanes( planes, camera, dstOffset, skipTransform ) { + + var nPlanes = planes !== null ? planes.length : 0, + dstArray = null; + + if ( nPlanes !== 0 ) { + + dstArray = uniform.value; + + if ( skipTransform !== true || dstArray === null ) { + + var flatSize = dstOffset + nPlanes * 4, + viewMatrix = camera.matrixWorldInverse; + + viewNormalMatrix.getNormalMatrix( viewMatrix ); + + if ( dstArray === null || dstArray.length < flatSize ) { + + dstArray = new Float32Array( flatSize ); + + } + + for ( var i = 0, i4 = dstOffset; + i !== nPlanes; ++ i, i4 += 4 ) { + + plane.copy( planes[ i ] ). + applyMatrix4( viewMatrix, viewNormalMatrix ); + + plane.normal.toArray( dstArray, i4 ); + dstArray[ i4 + 3 ] = plane.constant; + + } + + } + + uniform.value = dstArray; + uniform.needsUpdate = true; + + } + + scope.numPlanes = nPlanes; + + return dstArray; + + } + + } + + // import { Sphere } from '../math/Sphere'; + /** + * @author supereggbert / http://www.paulbrunt.co.uk/ + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author szimek / https://github.com/szimek/ + * @author tschw + */ + + function WebGLRenderer( parameters ) { + + console.log( 'THREE.WebGLRenderer', REVISION ); + + parameters = parameters || {}; + + var _canvas = parameters.canvas !== undefined ? parameters.canvas : document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ), + _context = parameters.context !== undefined ? parameters.context : null, + + _alpha = parameters.alpha !== undefined ? parameters.alpha : false, + _depth = parameters.depth !== undefined ? parameters.depth : true, + _stencil = parameters.stencil !== undefined ? parameters.stencil : true, + _antialias = parameters.antialias !== undefined ? parameters.antialias : false, + _premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true, + _preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false; + + var lights = []; + + var currentRenderList = null; + + var morphInfluences = new Float32Array( 8 ); + + var sprites = []; + var lensFlares = []; + + // public properties + + this.domElement = _canvas; + this.context = null; + + // clearing + + this.autoClear = true; + this.autoClearColor = true; + this.autoClearDepth = true; + this.autoClearStencil = true; + + // scene graph + + this.sortObjects = true; + + // user-defined clipping + + this.clippingPlanes = []; + this.localClippingEnabled = false; + + // physically based shading + + this.gammaFactor = 2.0; // for backwards compatibility + this.gammaInput = false; + this.gammaOutput = false; + + // physical lights + + this.physicallyCorrectLights = false; + + // tone mapping + + this.toneMapping = LinearToneMapping; + this.toneMappingExposure = 1.0; + this.toneMappingWhitePoint = 1.0; + + // morphs + + this.maxMorphTargets = 8; + this.maxMorphNormals = 4; + + // internal properties + + var _this = this, + + // internal state cache + + _currentProgram = null, + _currentRenderTarget = null, + _currentFramebuffer = null, + _currentMaterialId = - 1, + _currentGeometryProgram = '', + _currentCamera = null, + + _currentScissor = new Vector4(), + _currentScissorTest = null, + + _currentViewport = new Vector4(), + + // + + _usedTextureUnits = 0, + + // + + _clearColor = new Color( 0x000000 ), + _clearAlpha = 0, + + _width = _canvas.width, + _height = _canvas.height, + + _pixelRatio = 1, + + _scissor = new Vector4( 0, 0, _width, _height ), + _scissorTest = false, + + _viewport = new Vector4( 0, 0, _width, _height ), + + // frustum + + _frustum = new Frustum(), + + // clipping + + _clipping = new WebGLClipping(), + _clippingEnabled = false, + _localClippingEnabled = false, + + // camera matrices cache + + _projScreenMatrix = new Matrix4(), + + _vector3 = new Vector3(), + _matrix4 = new Matrix4(), + _matrix42 = new Matrix4(), + + // light arrays cache + + _lights = { + + hash: '', + + ambient: [ 0, 0, 0 ], + directional: [], + directionalShadowMap: [], + directionalShadowMatrix: [], + spot: [], + spotShadowMap: [], + spotShadowMatrix: [], + rectArea: [], + point: [], + pointShadowMap: [], + pointShadowMatrix: [], + hemi: [], + + shadows: [] + + }, + + // info + + _infoMemory = { + geometries: 0, + textures: 0 + }, + + _infoRender = { + + frame: 0, + calls: 0, + vertices: 0, + faces: 0, + points: 0 + + }; + + this.info = { + + render: _infoRender, + memory: _infoMemory, + programs: null + + }; + + + // initialize + + var _gl; + + try { + + var contextAttributes = { + alpha: _alpha, + depth: _depth, + stencil: _stencil, + antialias: _antialias, + premultipliedAlpha: _premultipliedAlpha, + preserveDrawingBuffer: _preserveDrawingBuffer + }; + + _gl = _context || _canvas.getContext( 'webgl', contextAttributes ) || _canvas.getContext( 'experimental-webgl', contextAttributes ); + + if ( _gl === null ) { + + if ( _canvas.getContext( 'webgl' ) !== null ) { + + throw 'Error creating WebGL context with your selected attributes.'; + + } else { + + throw 'Error creating WebGL context.'; + + } + + } + + // Some experimental-webgl implementations do not have getShaderPrecisionFormat + + if ( _gl.getShaderPrecisionFormat === undefined ) { + + _gl.getShaderPrecisionFormat = function () { + + return { 'rangeMin': 1, 'rangeMax': 1, 'precision': 1 }; + + }; + + } + + _canvas.addEventListener( 'webglcontextlost', onContextLost, false ); + + } catch ( error ) { + + console.error( 'THREE.WebGLRenderer: ' + error ); + + } + + var extensions = new WebGLExtensions( _gl ); + + extensions.get( 'WEBGL_depth_texture' ); + extensions.get( 'OES_texture_float' ); + extensions.get( 'OES_texture_float_linear' ); + extensions.get( 'OES_texture_half_float' ); + extensions.get( 'OES_texture_half_float_linear' ); + extensions.get( 'OES_standard_derivatives' ); + extensions.get( 'ANGLE_instanced_arrays' ); + + if ( extensions.get( 'OES_element_index_uint' ) ) { + + BufferGeometry.MaxIndex = 4294967296; + + } + + var capabilities = new WebGLCapabilities( _gl, extensions, parameters ); + + var state = new WebGLState( _gl, extensions, paramThreeToGL ); + + var properties = new WebGLProperties(); + var textures = new WebGLTextures( _gl, extensions, state, properties, capabilities, paramThreeToGL, _infoMemory ); + var attributes = new WebGLAttributes( _gl ); + var geometries = new WebGLGeometries( _gl, attributes, _infoMemory ); + var objects = new WebGLObjects( _gl, geometries, _infoRender ); + var programCache = new WebGLPrograms( this, capabilities ); + var lightCache = new WebGLLights(); + var renderLists = new WebGLRenderLists(); + + this.info.programs = programCache.programs; + + var bufferRenderer = new WebGLBufferRenderer( _gl, extensions, _infoRender ); + var indexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, _infoRender ); + + // + + var backgroundPlaneCamera, backgroundPlaneMesh; + var backgroundBoxCamera, backgroundBoxMesh; + + // + + function getTargetPixelRatio() { + + return _currentRenderTarget === null ? _pixelRatio : 1; + + } + + function setDefaultGLState() { + + state.init(); + + state.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ) ); + state.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ) ); + + state.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha ); + + } + + function resetGLState() { + + _currentProgram = null; + _currentCamera = null; + + _currentGeometryProgram = ''; + _currentMaterialId = - 1; + + state.reset(); + + } + + setDefaultGLState(); + + this.context = _gl; + this.capabilities = capabilities; + this.extensions = extensions; + this.properties = properties; + this.state = state; + + // shadow map + + var shadowMap = new WebGLShadowMap( this, _lights, objects, capabilities ); + + this.shadowMap = shadowMap; + + + // Plugins + + var spritePlugin = new SpritePlugin( this, sprites ); + var lensFlarePlugin = new LensFlarePlugin( this, lensFlares ); + + // API + + this.getContext = function () { + + return _gl; + + }; + + this.getContextAttributes = function () { + + return _gl.getContextAttributes(); + + }; + + this.forceContextLoss = function () { + + var extension = extensions.get( 'WEBGL_lose_context' ); + if ( extension ) extension.loseContext(); + + }; + + this.getMaxAnisotropy = function () { + + return capabilities.getMaxAnisotropy(); + + }; + + this.getPrecision = function () { + + return capabilities.precision; + + }; + + this.getPixelRatio = function () { + + return _pixelRatio; + + }; + + this.setPixelRatio = function ( value ) { + + if ( value === undefined ) return; + + _pixelRatio = value; + + this.setSize( _viewport.z, _viewport.w, false ); + + }; + + this.getSize = function () { + + return { + width: _width, + height: _height + }; + + }; + + this.setSize = function ( width, height, updateStyle ) { + + _width = width; + _height = height; + + _canvas.width = width * _pixelRatio; + _canvas.height = height * _pixelRatio; + + if ( updateStyle !== false ) { + + _canvas.style.width = width + 'px'; + _canvas.style.height = height + 'px'; + + } + + this.setViewport( 0, 0, width, height ); + + }; + + this.setViewport = function ( x, y, width, height ) { + + state.viewport( _viewport.set( x, y, width, height ) ); + + }; + + this.setScissor = function ( x, y, width, height ) { + + state.scissor( _scissor.set( x, y, width, height ) ); + + }; + + this.setScissorTest = function ( boolean ) { + + state.setScissorTest( _scissorTest = boolean ); + + }; + + // Clearing + + this.getClearColor = function () { + + return _clearColor; + + }; + + this.setClearColor = function ( color, alpha ) { + + _clearColor.set( color ); + + _clearAlpha = alpha !== undefined ? alpha : 1; + + state.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha ); + + }; + + this.getClearAlpha = function () { + + return _clearAlpha; + + }; + + this.setClearAlpha = function ( alpha ) { + + _clearAlpha = alpha; + + state.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha ); + + }; + + this.clear = function ( color, depth, stencil ) { + + var bits = 0; + + if ( color === undefined || color ) bits |= _gl.COLOR_BUFFER_BIT; + if ( depth === undefined || depth ) bits |= _gl.DEPTH_BUFFER_BIT; + if ( stencil === undefined || stencil ) bits |= _gl.STENCIL_BUFFER_BIT; + + _gl.clear( bits ); + + }; + + this.clearColor = function () { + + this.clear( true, false, false ); + + }; + + this.clearDepth = function () { + + this.clear( false, true, false ); + + }; + + this.clearStencil = function () { + + this.clear( false, false, true ); + + }; + + this.clearTarget = function ( renderTarget, color, depth, stencil ) { + + this.setRenderTarget( renderTarget ); + this.clear( color, depth, stencil ); + + }; + + // Reset + + this.resetGLState = resetGLState; + + this.dispose = function () { + + _canvas.removeEventListener( 'webglcontextlost', onContextLost, false ); + + renderLists.dispose(); + + }; + + // Events + + function onContextLost( event ) { + + event.preventDefault(); + + resetGLState(); + setDefaultGLState(); + + properties.clear(); + objects.clear(); + + } + + function onMaterialDispose( event ) { + + var material = event.target; + + material.removeEventListener( 'dispose', onMaterialDispose ); + + deallocateMaterial( material ); + + } + + // Buffer deallocation + + function deallocateMaterial( material ) { + + releaseMaterialProgramReference( material ); + + properties.remove( material ); + + } + + + function releaseMaterialProgramReference( material ) { + + var programInfo = properties.get( material ).program; + + material.program = undefined; + + if ( programInfo !== undefined ) { + + programCache.releaseProgram( programInfo ); + + } + + } + + // Buffer rendering + + function renderObjectImmediate( object, program, material ) { + + object.render( function ( object ) { + + _this.renderBufferImmediate( object, program, material ); + + } ); + + } + + this.renderBufferImmediate = function ( object, program, material ) { + + state.initAttributes(); + + var buffers = properties.get( object ); + + if ( object.hasPositions && ! buffers.position ) buffers.position = _gl.createBuffer(); + if ( object.hasNormals && ! buffers.normal ) buffers.normal = _gl.createBuffer(); + if ( object.hasUvs && ! buffers.uv ) buffers.uv = _gl.createBuffer(); + if ( object.hasColors && ! buffers.color ) buffers.color = _gl.createBuffer(); + + var programAttributes = program.getAttributes(); + + if ( object.hasPositions ) { + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.position ); + _gl.bufferData( _gl.ARRAY_BUFFER, object.positionArray, _gl.DYNAMIC_DRAW ); + + state.enableAttribute( programAttributes.position ); + _gl.vertexAttribPointer( programAttributes.position, 3, _gl.FLOAT, false, 0, 0 ); + + } + + if ( object.hasNormals ) { + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.normal ); + + if ( ! material.isMeshPhongMaterial && + ! material.isMeshStandardMaterial && + ! material.isMeshNormalMaterial && + material.shading === FlatShading ) { + + for ( var i = 0, l = object.count * 3; i < l; i += 9 ) { + + var array = object.normalArray; + + var nx = ( array[ i + 0 ] + array[ i + 3 ] + array[ i + 6 ] ) / 3; + var ny = ( array[ i + 1 ] + array[ i + 4 ] + array[ i + 7 ] ) / 3; + var nz = ( array[ i + 2 ] + array[ i + 5 ] + array[ i + 8 ] ) / 3; + + array[ i + 0 ] = nx; + array[ i + 1 ] = ny; + array[ i + 2 ] = nz; + + array[ i + 3 ] = nx; + array[ i + 4 ] = ny; + array[ i + 5 ] = nz; + + array[ i + 6 ] = nx; + array[ i + 7 ] = ny; + array[ i + 8 ] = nz; + + } + + } + + _gl.bufferData( _gl.ARRAY_BUFFER, object.normalArray, _gl.DYNAMIC_DRAW ); + + state.enableAttribute( programAttributes.normal ); + + _gl.vertexAttribPointer( programAttributes.normal, 3, _gl.FLOAT, false, 0, 0 ); + + } + + if ( object.hasUvs && material.map ) { + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.uv ); + _gl.bufferData( _gl.ARRAY_BUFFER, object.uvArray, _gl.DYNAMIC_DRAW ); + + state.enableAttribute( programAttributes.uv ); + + _gl.vertexAttribPointer( attributes.uv, 2, _gl.FLOAT, false, 0, 0 ); + + } + + if ( object.hasColors && material.vertexColors !== NoColors ) { + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.color ); + _gl.bufferData( _gl.ARRAY_BUFFER, object.colorArray, _gl.DYNAMIC_DRAW ); + + state.enableAttribute( programAttributes.color ); + + _gl.vertexAttribPointer( programAttributes.color, 3, _gl.FLOAT, false, 0, 0 ); + + } + + state.disableUnusedAttributes(); + + _gl.drawArrays( _gl.TRIANGLES, 0, object.count ); + + object.count = 0; + + }; + + function absNumericalSort( a, b ) { + + return Math.abs( b[ 0 ] ) - Math.abs( a[ 0 ] ); + + } + + this.renderBufferDirect = function ( camera, fog, geometry, material, object, group ) { + + state.setMaterial( material ); + + var program = setProgram( camera, fog, material, object ); + var geometryProgram = geometry.id + '_' + program.id + '_' + ( material.wireframe === true ); + + var updateBuffers = false; + + if ( geometryProgram !== _currentGeometryProgram ) { + + _currentGeometryProgram = geometryProgram; + updateBuffers = true; + + } + + // morph targets + + var morphTargetInfluences = object.morphTargetInfluences; + + if ( morphTargetInfluences !== undefined ) { + + // TODO Remove allocations + + var activeInfluences = []; + + for ( var i = 0, l = morphTargetInfluences.length; i < l; i ++ ) { + + var influence = morphTargetInfluences[ i ]; + activeInfluences.push( [ influence, i ] ); + + } + + activeInfluences.sort( absNumericalSort ); + + if ( activeInfluences.length > 8 ) { + + activeInfluences.length = 8; + + } + + var morphAttributes = geometry.morphAttributes; + + for ( var i = 0, l = activeInfluences.length; i < l; i ++ ) { + + var influence = activeInfluences[ i ]; + morphInfluences[ i ] = influence[ 0 ]; + + if ( influence[ 0 ] !== 0 ) { + + var index = influence[ 1 ]; + + if ( material.morphTargets === true && morphAttributes.position ) geometry.addAttribute( 'morphTarget' + i, morphAttributes.position[ index ] ); + if ( material.morphNormals === true && morphAttributes.normal ) geometry.addAttribute( 'morphNormal' + i, morphAttributes.normal[ index ] ); + + } else { + + if ( material.morphTargets === true ) geometry.removeAttribute( 'morphTarget' + i ); + if ( material.morphNormals === true ) geometry.removeAttribute( 'morphNormal' + i ); + + } + + } + + for ( var i = activeInfluences.length, il = morphInfluences.length; i < il; i ++ ) { + + morphInfluences[ i ] = 0.0; + + } + + program.getUniforms().setValue( _gl, 'morphTargetInfluences', morphInfluences ); + + updateBuffers = true; + + } + + // + + var index = geometry.index; + var position = geometry.attributes.position; + var rangeFactor = 1; + + if ( material.wireframe === true ) { + + index = geometries.getWireframeAttribute( geometry ); + rangeFactor = 2; + + } + + var renderer = bufferRenderer; + + if ( index !== null ) { + + renderer = indexedBufferRenderer; + renderer.setIndex( index ); + + } + + if ( updateBuffers ) { + + setupVertexAttributes( material, program, geometry ); + + if ( index !== null ) { + + _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, attributes.get( index ).buffer ); + + } + + } + + // + + var dataCount = 0; + + if ( index !== null ) { + + dataCount = index.count; + + } else if ( position !== undefined ) { + + dataCount = position.count; + + } + + var rangeStart = geometry.drawRange.start * rangeFactor; + var rangeCount = geometry.drawRange.count * rangeFactor; + + var groupStart = group !== null ? group.start * rangeFactor : 0; + var groupCount = group !== null ? group.count * rangeFactor : Infinity; + + var drawStart = Math.max( rangeStart, groupStart ); + var drawEnd = Math.min( dataCount, rangeStart + rangeCount, groupStart + groupCount ) - 1; + + var drawCount = Math.max( 0, drawEnd - drawStart + 1 ); + + if ( drawCount === 0 ) return; + + // + + if ( object.isMesh ) { + + if ( material.wireframe === true ) { + + state.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() ); + renderer.setMode( _gl.LINES ); + + } else { + + switch ( object.drawMode ) { + + case TrianglesDrawMode: + renderer.setMode( _gl.TRIANGLES ); + break; + + case TriangleStripDrawMode: + renderer.setMode( _gl.TRIANGLE_STRIP ); + break; + + case TriangleFanDrawMode: + renderer.setMode( _gl.TRIANGLE_FAN ); + break; + + } + + } + + + } else if ( object.isLine ) { + + var lineWidth = material.linewidth; + + if ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material + + state.setLineWidth( lineWidth * getTargetPixelRatio() ); + + if ( object.isLineSegments ) { + + renderer.setMode( _gl.LINES ); + + } else if ( object.isLineLoop ) { + + renderer.setMode( _gl.LINE_LOOP ); + + } else { + + renderer.setMode( _gl.LINE_STRIP ); + + } + + } else if ( object.isPoints ) { + + renderer.setMode( _gl.POINTS ); + + } + + if ( geometry && geometry.isInstancedBufferGeometry ) { + + if ( geometry.maxInstancedCount > 0 ) { + + renderer.renderInstances( geometry, drawStart, drawCount ); + + } + + } else { + + renderer.render( drawStart, drawCount ); + + } + + }; + + function setupVertexAttributes( material, program, geometry, startIndex ) { + + if ( geometry && geometry.isInstancedBufferGeometry ) { + + if ( extensions.get( 'ANGLE_instanced_arrays' ) === null ) { + + console.error( 'THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' ); + return; + + } + + } + + if ( startIndex === undefined ) startIndex = 0; + + state.initAttributes(); + + var geometryAttributes = geometry.attributes; + + var programAttributes = program.getAttributes(); + + var materialDefaultAttributeValues = material.defaultAttributeValues; + + for ( var name in programAttributes ) { + + var programAttribute = programAttributes[ name ]; + + if ( programAttribute >= 0 ) { + + var geometryAttribute = geometryAttributes[ name ]; + + if ( geometryAttribute !== undefined ) { + + var normalized = geometryAttribute.normalized; + var size = geometryAttribute.itemSize; + + var attributeProperties = attributes.get( geometryAttribute ); + + var buffer = attributeProperties.buffer; + var type = attributeProperties.type; + var bytesPerElement = attributeProperties.bytesPerElement; + + if ( geometryAttribute.isInterleavedBufferAttribute ) { + + var data = geometryAttribute.data; + var stride = data.stride; + var offset = geometryAttribute.offset; + + if ( data && data.isInstancedInterleavedBuffer ) { + + state.enableAttributeAndDivisor( programAttribute, data.meshPerAttribute ); + + if ( geometry.maxInstancedCount === undefined ) { + + geometry.maxInstancedCount = data.meshPerAttribute * data.count; + + } + + } else { + + state.enableAttribute( programAttribute ); + + } + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffer ); + _gl.vertexAttribPointer( programAttribute, size, type, normalized, stride * bytesPerElement, ( startIndex * stride + offset ) * bytesPerElement ); + + } else { + + if ( geometryAttribute.isInstancedBufferAttribute ) { + + state.enableAttributeAndDivisor( programAttribute, geometryAttribute.meshPerAttribute ); + + if ( geometry.maxInstancedCount === undefined ) { + + geometry.maxInstancedCount = geometryAttribute.meshPerAttribute * geometryAttribute.count; + + } + + } else { + + state.enableAttribute( programAttribute ); + + } + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffer ); + _gl.vertexAttribPointer( programAttribute, size, type, normalized, 0, startIndex * size * bytesPerElement ); + + } + + } else if ( materialDefaultAttributeValues !== undefined ) { + + var value = materialDefaultAttributeValues[ name ]; + + if ( value !== undefined ) { + + switch ( value.length ) { + + case 2: + _gl.vertexAttrib2fv( programAttribute, value ); + break; + + case 3: + _gl.vertexAttrib3fv( programAttribute, value ); + break; + + case 4: + _gl.vertexAttrib4fv( programAttribute, value ); + break; + + default: + _gl.vertexAttrib1fv( programAttribute, value ); + + } + + } + + } + + } + + } + + state.disableUnusedAttributes(); + + } + + // Compile + + this.compile = function ( scene, camera ) { + + lights = []; + + scene.traverse( function ( object ) { + + if ( object.isLight ) { + + lights.push( object ); + + } + + } ); + + setupLights( lights, camera ); + + scene.traverse( function ( object ) { + + if ( object.material ) { + + if ( Array.isArray( object.material ) ) { + + for ( var i = 0; i < object.material.length; i ++ ) { + + initMaterial( object.material[ i ], scene.fog, object ); + + } + + } else { + + initMaterial( object.material, scene.fog, object ); + + } + + } + + } ); + + }; + + // Rendering + + this.render = function ( scene, camera, renderTarget, forceClear ) { + + if ( camera !== undefined && camera.isCamera !== true ) { + + console.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' ); + return; + + } + + // reset caching for this frame + + _currentGeometryProgram = ''; + _currentMaterialId = - 1; + _currentCamera = null; + + // update scene graph + + if ( scene.autoUpdate === true ) scene.updateMatrixWorld(); + + // update camera matrices and frustum + + camera.onBeforeRender( _this ); + + if ( camera.parent === null ) camera.updateMatrixWorld(); + + camera.matrixWorldInverse.getInverse( camera.matrixWorld ); + + _projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse ); + _frustum.setFromMatrix( _projScreenMatrix ); + + lights.length = 0; + sprites.length = 0; + lensFlares.length = 0; + + _localClippingEnabled = this.localClippingEnabled; + _clippingEnabled = _clipping.init( this.clippingPlanes, _localClippingEnabled, camera ); + + currentRenderList = renderLists.get( scene, camera ); + currentRenderList.init(); + + projectObject( scene, camera, _this.sortObjects ); + + currentRenderList.finish(); + + if ( _this.sortObjects === true ) { + + currentRenderList.sort(); + + } + + // + + if ( _clippingEnabled ) _clipping.beginShadows(); + + setupShadows( lights ); + + shadowMap.render( scene, camera ); + + setupLights( lights, camera ); + + if ( _clippingEnabled ) _clipping.endShadows(); + + // + + _infoRender.frame ++; + _infoRender.calls = 0; + _infoRender.vertices = 0; + _infoRender.faces = 0; + _infoRender.points = 0; + + if ( renderTarget === undefined ) { + + renderTarget = null; + + } + + this.setRenderTarget( renderTarget ); + + // + + var background = scene.background; + + if ( background === null ) { + + state.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha ); + + } else if ( background && background.isColor ) { + + state.buffers.color.setClear( background.r, background.g, background.b, 1, _premultipliedAlpha ); + forceClear = true; + + } + + if ( this.autoClear || forceClear ) { + + this.clear( this.autoClearColor, this.autoClearDepth, this.autoClearStencil ); + + } + + if ( background && background.isCubeTexture ) { + + if ( backgroundBoxCamera === undefined ) { + + backgroundBoxCamera = new PerspectiveCamera(); + + backgroundBoxMesh = new Mesh( + new BoxBufferGeometry( 5, 5, 5 ), + new ShaderMaterial( { + uniforms: ShaderLib.cube.uniforms, + vertexShader: ShaderLib.cube.vertexShader, + fragmentShader: ShaderLib.cube.fragmentShader, + side: BackSide, + depthTest: false, + depthWrite: false, + fog: false + } ) + ); + + } + + backgroundBoxCamera.projectionMatrix.copy( camera.projectionMatrix ); + + backgroundBoxCamera.matrixWorld.extractRotation( camera.matrixWorld ); + backgroundBoxCamera.matrixWorldInverse.getInverse( backgroundBoxCamera.matrixWorld ); + + + backgroundBoxMesh.material.uniforms[ "tCube" ].value = background; + backgroundBoxMesh.modelViewMatrix.multiplyMatrices( backgroundBoxCamera.matrixWorldInverse, backgroundBoxMesh.matrixWorld ); + + objects.update( backgroundBoxMesh ); + + _this.renderBufferDirect( backgroundBoxCamera, null, backgroundBoxMesh.geometry, backgroundBoxMesh.material, backgroundBoxMesh, null ); + + } else if ( background && background.isTexture ) { + + if ( backgroundPlaneCamera === undefined ) { + + backgroundPlaneCamera = new OrthographicCamera( - 1, 1, 1, - 1, 0, 1 ); + + backgroundPlaneMesh = new Mesh( + new PlaneBufferGeometry( 2, 2 ), + new MeshBasicMaterial( { depthTest: false, depthWrite: false, fog: false } ) + ); + + } + + backgroundPlaneMesh.material.map = background; + + objects.update( backgroundPlaneMesh ); + + _this.renderBufferDirect( backgroundPlaneCamera, null, backgroundPlaneMesh.geometry, backgroundPlaneMesh.material, backgroundPlaneMesh, null ); + + } + + // + + var opaqueObjects = currentRenderList.opaque; + var transparentObjects = currentRenderList.transparent; + + if ( scene.overrideMaterial ) { + + var overrideMaterial = scene.overrideMaterial; + + if ( opaqueObjects.length ) renderObjects( opaqueObjects, scene, camera, overrideMaterial ); + if ( transparentObjects.length ) renderObjects( transparentObjects, scene, camera, overrideMaterial ); + + } else { + + // opaque pass (front-to-back order) + + if ( opaqueObjects.length ) renderObjects( opaqueObjects, scene, camera ); + + // transparent pass (back-to-front order) + + if ( transparentObjects.length ) renderObjects( transparentObjects, scene, camera ); + + } + + // custom render plugins (post pass) + + spritePlugin.render( scene, camera ); + lensFlarePlugin.render( scene, camera, _currentViewport ); + + // Generate mipmap if we're using any kind of mipmap filtering + + if ( renderTarget ) { + + textures.updateRenderTargetMipmap( renderTarget ); + + } + + // Ensure depth buffer writing is enabled so it can be cleared on next render + + state.buffers.depth.setTest( true ); + state.buffers.depth.setMask( true ); + state.buffers.color.setMask( true ); + + if ( camera.isArrayCamera && camera.enabled ) { + + _this.setScissorTest( false ); + + } + + camera.onAfterRender( _this ); + + // _gl.finish(); + + }; + + /* + // TODO Duplicated code (Frustum) + + var _sphere = new Sphere(); + + function isObjectViewable( object ) { + + var geometry = object.geometry; + + if ( geometry.boundingSphere === null ) + geometry.computeBoundingSphere(); + + _sphere.copy( geometry.boundingSphere ). + applyMatrix4( object.matrixWorld ); + + return isSphereViewable( _sphere ); + + } + + function isSpriteViewable( sprite ) { + + _sphere.center.set( 0, 0, 0 ); + _sphere.radius = 0.7071067811865476; + _sphere.applyMatrix4( sprite.matrixWorld ); + + return isSphereViewable( _sphere ); + + } + + function isSphereViewable( sphere ) { + + if ( ! _frustum.intersectsSphere( sphere ) ) return false; + + var numPlanes = _clipping.numPlanes; + + if ( numPlanes === 0 ) return true; + + var planes = _this.clippingPlanes, + + center = sphere.center, + negRad = - sphere.radius, + i = 0; + + do { + + // out when deeper than radius in the negative halfspace + if ( planes[ i ].distanceToPoint( center ) < negRad ) return false; + + } while ( ++ i !== numPlanes ); + + return true; + + } + */ + + function projectObject( object, camera, sortObjects ) { + + if ( ! object.visible ) return; + + var visible = object.layers.test( camera.layers ); + + if ( visible ) { + + if ( object.isLight ) { + + lights.push( object ); + + } else if ( object.isSprite ) { + + if ( ! object.frustumCulled || _frustum.intersectsSprite( object ) ) { + + sprites.push( object ); + + } + + } else if ( object.isLensFlare ) { + + lensFlares.push( object ); + + } else if ( object.isImmediateRenderObject ) { + + if ( sortObjects ) { + + _vector3.setFromMatrixPosition( object.matrixWorld ) + .applyMatrix4( _projScreenMatrix ); + + } + + currentRenderList.push( object, null, object.material, _vector3.z, null ); + + } else if ( object.isMesh || object.isLine || object.isPoints ) { + + if ( object.isSkinnedMesh ) { + + object.skeleton.update(); + + } + + if ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) { + + if ( sortObjects ) { + + _vector3.setFromMatrixPosition( object.matrixWorld ) + .applyMatrix4( _projScreenMatrix ); + + } + + var geometry = objects.update( object ); + var material = object.material; + + if ( Array.isArray( material ) ) { + + var groups = geometry.groups; + + for ( var i = 0, l = groups.length; i < l; i ++ ) { + + var group = groups[ i ]; + var groupMaterial = material[ group.materialIndex ]; + + if ( groupMaterial && groupMaterial.visible ) { + + currentRenderList.push( object, geometry, groupMaterial, _vector3.z, group ); + + } + + } + + } else if ( material.visible ) { + + currentRenderList.push( object, geometry, material, _vector3.z, null ); + + } + + } + + } + + } + + var children = object.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + projectObject( children[ i ], camera, sortObjects ); + + } + + } + + function renderObjects( renderList, scene, camera, overrideMaterial ) { + + for ( var i = 0, l = renderList.length; i < l; i ++ ) { + + var renderItem = renderList[ i ]; + + var object = renderItem.object; + var geometry = renderItem.geometry; + var material = overrideMaterial === undefined ? renderItem.material : overrideMaterial; + var group = renderItem.group; + + object.onBeforeRender( _this, scene, camera, geometry, material, group ); + + if ( camera.isArrayCamera && camera.enabled ) { + + var cameras = camera.cameras; + + for ( var j = 0, jl = cameras.length; j < jl; j ++ ) { + + var camera2 = cameras[ j ]; + var bounds = camera2.bounds; + + _this.setViewport( + bounds.x * _width * _pixelRatio, bounds.y * _height * _pixelRatio, + bounds.z * _width * _pixelRatio, bounds.w * _height * _pixelRatio + ); + _this.setScissor( + bounds.x * _width * _pixelRatio, bounds.y * _height * _pixelRatio, + bounds.z * _width * _pixelRatio, bounds.w * _height * _pixelRatio + ); + _this.setScissorTest( true ); + + renderObject( object, scene, camera2, geometry, material, group ); + + } + + } else { + + renderObject( object, scene, camera, geometry, material, group ); + + } + + object.onAfterRender( _this, scene, camera, geometry, material, group ); + + } + + } + + function renderObject( object, scene, camera, geometry, material, group ) { + + object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld ); + object.normalMatrix.getNormalMatrix( object.modelViewMatrix ); + + if ( object.isImmediateRenderObject ) { + + state.setMaterial( material ); + + var program = setProgram( camera, scene.fog, material, object ); + + _currentGeometryProgram = ''; + + renderObjectImmediate( object, program, material ); + + } else { + + _this.renderBufferDirect( camera, scene.fog, geometry, material, object, group ); + + } + + } + + function initMaterial( material, fog, object ) { + + var materialProperties = properties.get( material ); + + var parameters = programCache.getParameters( + material, _lights, fog, _clipping.numPlanes, _clipping.numIntersection, object ); + + var code = programCache.getProgramCode( material, parameters ); + + var program = materialProperties.program; + var programChange = true; + + if ( program === undefined ) { + + // new material + material.addEventListener( 'dispose', onMaterialDispose ); + + } else if ( program.code !== code ) { + + // changed glsl or parameters + releaseMaterialProgramReference( material ); + + } else if ( parameters.shaderID !== undefined ) { + + // same glsl and uniform list + return; + + } else { + + // only rebuild uniform list + programChange = false; + + } + + if ( programChange ) { + + if ( parameters.shaderID ) { + + var shader = ShaderLib[ parameters.shaderID ]; + + materialProperties.__webglShader = { + name: material.type, + uniforms: UniformsUtils.clone( shader.uniforms ), + vertexShader: shader.vertexShader, + fragmentShader: shader.fragmentShader + }; + + } else { + + materialProperties.__webglShader = { + name: material.type, + uniforms: material.uniforms, + vertexShader: material.vertexShader, + fragmentShader: material.fragmentShader + }; + + } + + material.__webglShader = materialProperties.__webglShader; + + program = programCache.acquireProgram( material, parameters, code ); + + materialProperties.program = program; + material.program = program; + + } + + var programAttributes = program.getAttributes(); + + if ( material.morphTargets ) { + + material.numSupportedMorphTargets = 0; + + for ( var i = 0; i < _this.maxMorphTargets; i ++ ) { + + if ( programAttributes[ 'morphTarget' + i ] >= 0 ) { + + material.numSupportedMorphTargets ++; + + } + + } + + } + + if ( material.morphNormals ) { + + material.numSupportedMorphNormals = 0; + + for ( var i = 0; i < _this.maxMorphNormals; i ++ ) { + + if ( programAttributes[ 'morphNormal' + i ] >= 0 ) { + + material.numSupportedMorphNormals ++; + + } + + } + + } + + var uniforms = materialProperties.__webglShader.uniforms; + + if ( ! material.isShaderMaterial && + ! material.isRawShaderMaterial || + material.clipping === true ) { + + materialProperties.numClippingPlanes = _clipping.numPlanes; + materialProperties.numIntersection = _clipping.numIntersection; + uniforms.clippingPlanes = _clipping.uniform; + + } + + materialProperties.fog = fog; + + // store the light setup it was created for + + materialProperties.lightsHash = _lights.hash; + + if ( material.lights ) { + + // wire up the material to this renderer's lighting state + + uniforms.ambientLightColor.value = _lights.ambient; + uniforms.directionalLights.value = _lights.directional; + uniforms.spotLights.value = _lights.spot; + uniforms.rectAreaLights.value = _lights.rectArea; + uniforms.pointLights.value = _lights.point; + uniforms.hemisphereLights.value = _lights.hemi; + + uniforms.directionalShadowMap.value = _lights.directionalShadowMap; + uniforms.directionalShadowMatrix.value = _lights.directionalShadowMatrix; + uniforms.spotShadowMap.value = _lights.spotShadowMap; + uniforms.spotShadowMatrix.value = _lights.spotShadowMatrix; + uniforms.pointShadowMap.value = _lights.pointShadowMap; + uniforms.pointShadowMatrix.value = _lights.pointShadowMatrix; + // TODO (abelnation): add area lights shadow info to uniforms + + } + + var progUniforms = materialProperties.program.getUniforms(), + uniformsList = + WebGLUniforms.seqWithValue( progUniforms.seq, uniforms ); + + materialProperties.uniformsList = uniformsList; + + } + + function setProgram( camera, fog, material, object ) { + + _usedTextureUnits = 0; + + var materialProperties = properties.get( material ); + + if ( _clippingEnabled ) { + + if ( _localClippingEnabled || camera !== _currentCamera ) { + + var useCache = + camera === _currentCamera && + material.id === _currentMaterialId; + + // we might want to call this function with some ClippingGroup + // object instead of the material, once it becomes feasible + // (#8465, #8379) + _clipping.setState( + material.clippingPlanes, material.clipIntersection, material.clipShadows, + camera, materialProperties, useCache ); + + } + + } + + if ( material.needsUpdate === false ) { + + if ( materialProperties.program === undefined ) { + + material.needsUpdate = true; + + } else if ( material.fog && materialProperties.fog !== fog ) { + + material.needsUpdate = true; + + } else if ( material.lights && materialProperties.lightsHash !== _lights.hash ) { + + material.needsUpdate = true; + + } else if ( materialProperties.numClippingPlanes !== undefined && + ( materialProperties.numClippingPlanes !== _clipping.numPlanes || + materialProperties.numIntersection !== _clipping.numIntersection ) ) { + + material.needsUpdate = true; + + } + + } + + if ( material.needsUpdate ) { + + initMaterial( material, fog, object ); + material.needsUpdate = false; + + } + + var refreshProgram = false; + var refreshMaterial = false; + var refreshLights = false; + + var program = materialProperties.program, + p_uniforms = program.getUniforms(), + m_uniforms = materialProperties.__webglShader.uniforms; + + if ( program.id !== _currentProgram ) { + + _gl.useProgram( program.program ); + _currentProgram = program.id; + + refreshProgram = true; + refreshMaterial = true; + refreshLights = true; + + } + + if ( material.id !== _currentMaterialId ) { + + _currentMaterialId = material.id; + + refreshMaterial = true; + + } + + if ( refreshProgram || camera !== _currentCamera ) { + + p_uniforms.setValue( _gl, 'projectionMatrix', camera.projectionMatrix ); + + if ( capabilities.logarithmicDepthBuffer ) { + + p_uniforms.setValue( _gl, 'logDepthBufFC', + 2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) ); + + } + + + if ( camera !== _currentCamera ) { + + _currentCamera = camera; + + // lighting uniforms depend on the camera so enforce an update + // now, in case this material supports lights - or later, when + // the next material that does gets activated: + + refreshMaterial = true; // set to true on material change + refreshLights = true; // remains set until update done + + } + + // load material specific uniforms + // (shader material also gets them for the sake of genericity) + + if ( material.isShaderMaterial || + material.isMeshPhongMaterial || + material.isMeshStandardMaterial || + material.envMap ) { + + var uCamPos = p_uniforms.map.cameraPosition; + + if ( uCamPos !== undefined ) { + + uCamPos.setValue( _gl, + _vector3.setFromMatrixPosition( camera.matrixWorld ) ); + + } + + } + + if ( material.isMeshPhongMaterial || + material.isMeshLambertMaterial || + material.isMeshBasicMaterial || + material.isMeshStandardMaterial || + material.isShaderMaterial || + material.skinning ) { + + p_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse ); + + } + + p_uniforms.setValue( _gl, 'toneMappingExposure', _this.toneMappingExposure ); + p_uniforms.setValue( _gl, 'toneMappingWhitePoint', _this.toneMappingWhitePoint ); + + } + + // skinning uniforms must be set even if material didn't change + // auto-setting of texture unit for bone texture must go before other textures + // not sure why, but otherwise weird things happen + + if ( material.skinning ) { + + p_uniforms.setOptional( _gl, object, 'bindMatrix' ); + p_uniforms.setOptional( _gl, object, 'bindMatrixInverse' ); + + var skeleton = object.skeleton; + + if ( skeleton ) { + + var bones = skeleton.bones; + + if ( capabilities.floatVertexTextures ) { + + if ( skeleton.boneTexture === undefined ) { + + // layout (1 matrix = 4 pixels) + // RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4) + // with 8x8 pixel texture max 16 bones * 4 pixels = (8 * 8) + // 16x16 pixel texture max 64 bones * 4 pixels = (16 * 16) + // 32x32 pixel texture max 256 bones * 4 pixels = (32 * 32) + // 64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64) + + + var size = Math.sqrt( bones.length * 4 ); // 4 pixels needed for 1 matrix + size = _Math.nextPowerOfTwo( Math.ceil( size ) ); + size = Math.max( size, 4 ); + + var boneMatrices = new Float32Array( size * size * 4 ); // 4 floats per RGBA pixel + boneMatrices.set( skeleton.boneMatrices ); // copy current values + + var boneTexture = new DataTexture( boneMatrices, size, size, RGBAFormat, FloatType ); + + skeleton.boneMatrices = boneMatrices; + skeleton.boneTexture = boneTexture; + skeleton.boneTextureSize = size; + + } + + p_uniforms.setValue( _gl, 'boneTexture', skeleton.boneTexture ); + p_uniforms.setValue( _gl, 'boneTextureSize', skeleton.boneTextureSize ); + + } else { + + p_uniforms.setOptional( _gl, skeleton, 'boneMatrices' ); + + } + + } + + } + + if ( refreshMaterial ) { + + if ( material.lights ) { + + // the current material requires lighting info + + // note: all lighting uniforms are always set correctly + // they simply reference the renderer's state for their + // values + // + // use the current material's .needsUpdate flags to set + // the GL state when required + + markUniformsLightsNeedsUpdate( m_uniforms, refreshLights ); + + } + + // refresh uniforms common to several materials + + if ( fog && material.fog ) { + + refreshUniformsFog( m_uniforms, fog ); + + } + + if ( material.isMeshBasicMaterial || + material.isMeshLambertMaterial || + material.isMeshPhongMaterial || + material.isMeshStandardMaterial || + material.isMeshNormalMaterial || + material.isMeshDepthMaterial ) { + + refreshUniformsCommon( m_uniforms, material ); + + } + + // refresh single material specific uniforms + + if ( material.isLineBasicMaterial ) { + + refreshUniformsLine( m_uniforms, material ); + + } else if ( material.isLineDashedMaterial ) { + + refreshUniformsLine( m_uniforms, material ); + refreshUniformsDash( m_uniforms, material ); + + } else if ( material.isPointsMaterial ) { + + refreshUniformsPoints( m_uniforms, material ); + + } else if ( material.isMeshLambertMaterial ) { + + refreshUniformsLambert( m_uniforms, material ); + + } else if ( material.isMeshToonMaterial ) { + + refreshUniformsToon( m_uniforms, material ); + + } else if ( material.isMeshPhongMaterial ) { + + refreshUniformsPhong( m_uniforms, material ); + + } else if ( material.isMeshPhysicalMaterial ) { + + refreshUniformsPhysical( m_uniforms, material ); + + } else if ( material.isMeshStandardMaterial ) { + + refreshUniformsStandard( m_uniforms, material ); + + } else if ( material.isMeshDepthMaterial ) { + + if ( material.displacementMap ) { + + m_uniforms.displacementMap.value = material.displacementMap; + m_uniforms.displacementScale.value = material.displacementScale; + m_uniforms.displacementBias.value = material.displacementBias; + + } + + } else if ( material.isMeshNormalMaterial ) { + + refreshUniformsNormal( m_uniforms, material ); + + } + + // RectAreaLight Texture + // TODO (mrdoob): Find a nicer implementation + + if ( m_uniforms.ltcMat !== undefined ) m_uniforms.ltcMat.value = UniformsLib.LTC_MAT_TEXTURE; + if ( m_uniforms.ltcMag !== undefined ) m_uniforms.ltcMag.value = UniformsLib.LTC_MAG_TEXTURE; + + WebGLUniforms.upload( + _gl, materialProperties.uniformsList, m_uniforms, _this ); + + } + + + // common matrices + + p_uniforms.setValue( _gl, 'modelViewMatrix', object.modelViewMatrix ); + p_uniforms.setValue( _gl, 'normalMatrix', object.normalMatrix ); + p_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld ); + + return program; + + } + + // Uniforms (refresh uniforms objects) + + function refreshUniformsCommon( uniforms, material ) { + + uniforms.opacity.value = material.opacity; + + uniforms.diffuse.value = material.color; + + if ( material.emissive ) { + + uniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity ); + + } + + uniforms.map.value = material.map; + uniforms.specularMap.value = material.specularMap; + uniforms.alphaMap.value = material.alphaMap; + + if ( material.lightMap ) { + + uniforms.lightMap.value = material.lightMap; + uniforms.lightMapIntensity.value = material.lightMapIntensity; + + } + + if ( material.aoMap ) { + + uniforms.aoMap.value = material.aoMap; + uniforms.aoMapIntensity.value = material.aoMapIntensity; + + } + + // uv repeat and offset setting priorities + // 1. color map + // 2. specular map + // 3. normal map + // 4. bump map + // 5. alpha map + // 6. emissive map + + var uvScaleMap; + + if ( material.map ) { + + uvScaleMap = material.map; + + } else if ( material.specularMap ) { + + uvScaleMap = material.specularMap; + + } else if ( material.displacementMap ) { + + uvScaleMap = material.displacementMap; + + } else if ( material.normalMap ) { + + uvScaleMap = material.normalMap; + + } else if ( material.bumpMap ) { + + uvScaleMap = material.bumpMap; + + } else if ( material.roughnessMap ) { + + uvScaleMap = material.roughnessMap; + + } else if ( material.metalnessMap ) { + + uvScaleMap = material.metalnessMap; + + } else if ( material.alphaMap ) { + + uvScaleMap = material.alphaMap; + + } else if ( material.emissiveMap ) { + + uvScaleMap = material.emissiveMap; + + } + + if ( uvScaleMap !== undefined ) { + + // backwards compatibility + if ( uvScaleMap.isWebGLRenderTarget ) { + + uvScaleMap = uvScaleMap.texture; + + } + + var offset = uvScaleMap.offset; + var repeat = uvScaleMap.repeat; + + uniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y ); + + } + + uniforms.envMap.value = material.envMap; + + // don't flip CubeTexture envMaps, flip everything else: + // WebGLRenderTargetCube will be flipped for backwards compatibility + // WebGLRenderTargetCube.texture will be flipped because it's a Texture and NOT a CubeTexture + // this check must be handled differently, or removed entirely, if WebGLRenderTargetCube uses a CubeTexture in the future + uniforms.flipEnvMap.value = ( ! ( material.envMap && material.envMap.isCubeTexture ) ) ? 1 : - 1; + + uniforms.reflectivity.value = material.reflectivity; + uniforms.refractionRatio.value = material.refractionRatio; + + } + + function refreshUniformsLine( uniforms, material ) { + + uniforms.diffuse.value = material.color; + uniforms.opacity.value = material.opacity; + + } + + function refreshUniformsDash( uniforms, material ) { + + uniforms.dashSize.value = material.dashSize; + uniforms.totalSize.value = material.dashSize + material.gapSize; + uniforms.scale.value = material.scale; + + } + + function refreshUniformsPoints( uniforms, material ) { + + uniforms.diffuse.value = material.color; + uniforms.opacity.value = material.opacity; + uniforms.size.value = material.size * _pixelRatio; + uniforms.scale.value = _height * 0.5; + + uniforms.map.value = material.map; + + if ( material.map !== null ) { + + var offset = material.map.offset; + var repeat = material.map.repeat; + + uniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y ); + + } + + } + + function refreshUniformsFog( uniforms, fog ) { + + uniforms.fogColor.value = fog.color; + + if ( fog.isFog ) { + + uniforms.fogNear.value = fog.near; + uniforms.fogFar.value = fog.far; + + } else if ( fog.isFogExp2 ) { + + uniforms.fogDensity.value = fog.density; + + } + + } + + function refreshUniformsLambert( uniforms, material ) { + + if ( material.emissiveMap ) { + + uniforms.emissiveMap.value = material.emissiveMap; + + } + + } + + function refreshUniformsPhong( uniforms, material ) { + + uniforms.specular.value = material.specular; + uniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 ) + + if ( material.emissiveMap ) { + + uniforms.emissiveMap.value = material.emissiveMap; + + } + + if ( material.bumpMap ) { + + uniforms.bumpMap.value = material.bumpMap; + uniforms.bumpScale.value = material.bumpScale; + + } + + if ( material.normalMap ) { + + uniforms.normalMap.value = material.normalMap; + uniforms.normalScale.value.copy( material.normalScale ); + + } + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + } + + function refreshUniformsToon( uniforms, material ) { + + refreshUniformsPhong( uniforms, material ); + + if ( material.gradientMap ) { + + uniforms.gradientMap.value = material.gradientMap; + + } + + } + + function refreshUniformsStandard( uniforms, material ) { + + uniforms.roughness.value = material.roughness; + uniforms.metalness.value = material.metalness; + + if ( material.roughnessMap ) { + + uniforms.roughnessMap.value = material.roughnessMap; + + } + + if ( material.metalnessMap ) { + + uniforms.metalnessMap.value = material.metalnessMap; + + } + + if ( material.emissiveMap ) { + + uniforms.emissiveMap.value = material.emissiveMap; + + } + + if ( material.bumpMap ) { + + uniforms.bumpMap.value = material.bumpMap; + uniforms.bumpScale.value = material.bumpScale; + + } + + if ( material.normalMap ) { + + uniforms.normalMap.value = material.normalMap; + uniforms.normalScale.value.copy( material.normalScale ); + + } + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + if ( material.envMap ) { + + //uniforms.envMap.value = material.envMap; // part of uniforms common + uniforms.envMapIntensity.value = material.envMapIntensity; + + } + + } + + function refreshUniformsPhysical( uniforms, material ) { + + uniforms.clearCoat.value = material.clearCoat; + uniforms.clearCoatRoughness.value = material.clearCoatRoughness; + + refreshUniformsStandard( uniforms, material ); + + } + + function refreshUniformsNormal( uniforms, material ) { + + if ( material.bumpMap ) { + + uniforms.bumpMap.value = material.bumpMap; + uniforms.bumpScale.value = material.bumpScale; + + } + + if ( material.normalMap ) { + + uniforms.normalMap.value = material.normalMap; + uniforms.normalScale.value.copy( material.normalScale ); + + } + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + } + + // If uniforms are marked as clean, they don't need to be loaded to the GPU. + + function markUniformsLightsNeedsUpdate( uniforms, value ) { + + uniforms.ambientLightColor.needsUpdate = value; + + uniforms.directionalLights.needsUpdate = value; + uniforms.pointLights.needsUpdate = value; + uniforms.spotLights.needsUpdate = value; + uniforms.rectAreaLights.needsUpdate = value; + uniforms.hemisphereLights.needsUpdate = value; + + } + + // Lighting + + function setupShadows( lights ) { + + var lightShadowsLength = 0; + + for ( var i = 0, l = lights.length; i < l; i ++ ) { + + var light = lights[ i ]; + + if ( light.castShadow ) { + + _lights.shadows[ lightShadowsLength ] = light; + lightShadowsLength ++; + + } + + } + + _lights.shadows.length = lightShadowsLength; + + } + + function setupLights( lights, camera ) { + + var l, ll, light, shadow, + r = 0, g = 0, b = 0, + color, + intensity, + distance, + shadowMap, + + viewMatrix = camera.matrixWorldInverse, + + directionalLength = 0, + pointLength = 0, + spotLength = 0, + rectAreaLength = 0, + hemiLength = 0; + + for ( l = 0, ll = lights.length; l < ll; l ++ ) { + + light = lights[ l ]; + + color = light.color; + intensity = light.intensity; + distance = light.distance; + + shadowMap = ( light.shadow && light.shadow.map ) ? light.shadow.map.texture : null; + + if ( light.isAmbientLight ) { + + r += color.r * intensity; + g += color.g * intensity; + b += color.b * intensity; + + } else if ( light.isDirectionalLight ) { + + var uniforms = lightCache.get( light ); + + uniforms.color.copy( light.color ).multiplyScalar( light.intensity ); + uniforms.direction.setFromMatrixPosition( light.matrixWorld ); + _vector3.setFromMatrixPosition( light.target.matrixWorld ); + uniforms.direction.sub( _vector3 ); + uniforms.direction.transformDirection( viewMatrix ); + + uniforms.shadow = light.castShadow; + + if ( light.castShadow ) { + + shadow = light.shadow; + + uniforms.shadowBias = shadow.bias; + uniforms.shadowRadius = shadow.radius; + uniforms.shadowMapSize = shadow.mapSize; + + } + + _lights.directionalShadowMap[ directionalLength ] = shadowMap; + _lights.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix; + _lights.directional[ directionalLength ] = uniforms; + + directionalLength ++; + + } else if ( light.isSpotLight ) { + + var uniforms = lightCache.get( light ); + + uniforms.position.setFromMatrixPosition( light.matrixWorld ); + uniforms.position.applyMatrix4( viewMatrix ); + + uniforms.color.copy( color ).multiplyScalar( intensity ); + uniforms.distance = distance; + + uniforms.direction.setFromMatrixPosition( light.matrixWorld ); + _vector3.setFromMatrixPosition( light.target.matrixWorld ); + uniforms.direction.sub( _vector3 ); + uniforms.direction.transformDirection( viewMatrix ); + + uniforms.coneCos = Math.cos( light.angle ); + uniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) ); + uniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay; + + uniforms.shadow = light.castShadow; + + if ( light.castShadow ) { + + shadow = light.shadow; + + uniforms.shadowBias = shadow.bias; + uniforms.shadowRadius = shadow.radius; + uniforms.shadowMapSize = shadow.mapSize; + + } + + _lights.spotShadowMap[ spotLength ] = shadowMap; + _lights.spotShadowMatrix[ spotLength ] = light.shadow.matrix; + _lights.spot[ spotLength ] = uniforms; + + spotLength ++; + + } else if ( light.isRectAreaLight ) { + + var uniforms = lightCache.get( light ); + + // (a) intensity controls irradiance of entire light + uniforms.color + .copy( color ) + .multiplyScalar( intensity / ( light.width * light.height ) ); + + // (b) intensity controls the radiance per light area + // uniforms.color.copy( color ).multiplyScalar( intensity ); + + uniforms.position.setFromMatrixPosition( light.matrixWorld ); + uniforms.position.applyMatrix4( viewMatrix ); + + // extract local rotation of light to derive width/height half vectors + _matrix42.identity(); + _matrix4.copy( light.matrixWorld ); + _matrix4.premultiply( viewMatrix ); + _matrix42.extractRotation( _matrix4 ); + + uniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 ); + uniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 ); + + uniforms.halfWidth.applyMatrix4( _matrix42 ); + uniforms.halfHeight.applyMatrix4( _matrix42 ); + + // TODO (abelnation): RectAreaLight distance? + // uniforms.distance = distance; + + _lights.rectArea[ rectAreaLength ] = uniforms; + + rectAreaLength ++; + + } else if ( light.isPointLight ) { + + var uniforms = lightCache.get( light ); + + uniforms.position.setFromMatrixPosition( light.matrixWorld ); + uniforms.position.applyMatrix4( viewMatrix ); + + uniforms.color.copy( light.color ).multiplyScalar( light.intensity ); + uniforms.distance = light.distance; + uniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay; + + uniforms.shadow = light.castShadow; + + if ( light.castShadow ) { + + shadow = light.shadow; + + uniforms.shadowBias = shadow.bias; + uniforms.shadowRadius = shadow.radius; + uniforms.shadowMapSize = shadow.mapSize; + + } + + _lights.pointShadowMap[ pointLength ] = shadowMap; + _lights.pointShadowMatrix[ pointLength ] = light.shadow.matrix; + _lights.point[ pointLength ] = uniforms; + + pointLength ++; + + } else if ( light.isHemisphereLight ) { + + var uniforms = lightCache.get( light ); + + uniforms.direction.setFromMatrixPosition( light.matrixWorld ); + uniforms.direction.transformDirection( viewMatrix ); + uniforms.direction.normalize(); + + uniforms.skyColor.copy( light.color ).multiplyScalar( intensity ); + uniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity ); + + _lights.hemi[ hemiLength ] = uniforms; + + hemiLength ++; + + } + + } + + _lights.ambient[ 0 ] = r; + _lights.ambient[ 1 ] = g; + _lights.ambient[ 2 ] = b; + + _lights.directional.length = directionalLength; + _lights.spot.length = spotLength; + _lights.rectArea.length = rectAreaLength; + _lights.point.length = pointLength; + _lights.hemi.length = hemiLength; + + // TODO (sam-g-steel) why aren't we using join + _lights.hash = directionalLength + ',' + pointLength + ',' + spotLength + ',' + rectAreaLength + ',' + hemiLength + ',' + _lights.shadows.length; + + } + + // GL state setting + + this.setFaceCulling = function ( cullFace, frontFaceDirection ) { + + state.setCullFace( cullFace ); + state.setFlipSided( frontFaceDirection === FrontFaceDirectionCW ); + + }; + + // Textures + + function allocTextureUnit() { + + var textureUnit = _usedTextureUnits; + + if ( textureUnit >= capabilities.maxTextures ) { + + console.warn( 'WebGLRenderer: trying to use ' + textureUnit + ' texture units while this GPU supports only ' + capabilities.maxTextures ); + + } + + _usedTextureUnits += 1; + + return textureUnit; + + } + + this.allocTextureUnit = allocTextureUnit; + + // this.setTexture2D = setTexture2D; + this.setTexture2D = ( function () { + + var warned = false; + + // backwards compatibility: peel texture.texture + return function setTexture2D( texture, slot ) { + + if ( texture && texture.isWebGLRenderTarget ) { + + if ( ! warned ) { + + console.warn( "THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead." ); + warned = true; + + } + + texture = texture.texture; + + } + + textures.setTexture2D( texture, slot ); + + }; + + }() ); + + this.setTexture = ( function () { + + var warned = false; + + return function setTexture( texture, slot ) { + + if ( ! warned ) { + + console.warn( "THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead." ); + warned = true; + + } + + textures.setTexture2D( texture, slot ); + + }; + + }() ); + + this.setTextureCube = ( function () { + + var warned = false; + + return function setTextureCube( texture, slot ) { + + // backwards compatibility: peel texture.texture + if ( texture && texture.isWebGLRenderTargetCube ) { + + if ( ! warned ) { + + console.warn( "THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead." ); + warned = true; + + } + + texture = texture.texture; + + } + + // currently relying on the fact that WebGLRenderTargetCube.texture is a Texture and NOT a CubeTexture + // TODO: unify these code paths + if ( ( texture && texture.isCubeTexture ) || + ( Array.isArray( texture.image ) && texture.image.length === 6 ) ) { + + // CompressedTexture can have Array in image :/ + + // this function alone should take care of cube textures + textures.setTextureCube( texture, slot ); + + } else { + + // assumed: texture property of THREE.WebGLRenderTargetCube + + textures.setTextureCubeDynamic( texture, slot ); + + } + + }; + + }() ); + + this.getRenderTarget = function () { + + return _currentRenderTarget; + + }; + + this.setRenderTarget = function ( renderTarget ) { + + _currentRenderTarget = renderTarget; + + if ( renderTarget && properties.get( renderTarget ).__webglFramebuffer === undefined ) { + + textures.setupRenderTarget( renderTarget ); + + } + + var isCube = ( renderTarget && renderTarget.isWebGLRenderTargetCube ); + var framebuffer; + + if ( renderTarget ) { + + var renderTargetProperties = properties.get( renderTarget ); + + if ( isCube ) { + + framebuffer = renderTargetProperties.__webglFramebuffer[ renderTarget.activeCubeFace ]; + + } else { + + framebuffer = renderTargetProperties.__webglFramebuffer; + + } + + _currentScissor.copy( renderTarget.scissor ); + _currentScissorTest = renderTarget.scissorTest; + + _currentViewport.copy( renderTarget.viewport ); + + } else { + + framebuffer = null; + + _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ); + _currentScissorTest = _scissorTest; + + _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ); + + } + + if ( _currentFramebuffer !== framebuffer ) { + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); + _currentFramebuffer = framebuffer; + + } + + state.scissor( _currentScissor ); + state.setScissorTest( _currentScissorTest ); + + state.viewport( _currentViewport ); + + if ( isCube ) { + + var textureProperties = properties.get( renderTarget.texture ); + _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + renderTarget.activeCubeFace, textureProperties.__webglTexture, renderTarget.activeMipMapLevel ); + + } + + }; + + this.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer ) { + + if ( ( renderTarget && renderTarget.isWebGLRenderTarget ) === false ) { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' ); + return; + + } + + var framebuffer = properties.get( renderTarget ).__webglFramebuffer; + + if ( framebuffer ) { + + var restore = false; + + if ( framebuffer !== _currentFramebuffer ) { + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); + + restore = true; + + } + + try { + + var texture = renderTarget.texture; + var textureFormat = texture.format; + var textureType = texture.type; + + if ( textureFormat !== RGBAFormat && paramThreeToGL( textureFormat ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_FORMAT ) ) { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' ); + return; + + } + + if ( textureType !== UnsignedByteType && paramThreeToGL( textureType ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // IE11, Edge and Chrome Mac < 52 (#9513) + ! ( textureType === FloatType && ( extensions.get( 'OES_texture_float' ) || extensions.get( 'WEBGL_color_buffer_float' ) ) ) && // Chrome Mac >= 52 and Firefox + ! ( textureType === HalfFloatType && extensions.get( 'EXT_color_buffer_half_float' ) ) ) { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' ); + return; + + } + + if ( _gl.checkFramebufferStatus( _gl.FRAMEBUFFER ) === _gl.FRAMEBUFFER_COMPLETE ) { + + // the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604) + + if ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) { + + _gl.readPixels( x, y, width, height, paramThreeToGL( textureFormat ), paramThreeToGL( textureType ), buffer ); + + } + + } else { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.' ); + + } + + } finally { + + if ( restore ) { + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, _currentFramebuffer ); + + } + + } + + } + + }; + + // Map three.js constants to WebGL constants + + function paramThreeToGL( p ) { + + var extension; + + if ( p === RepeatWrapping ) return _gl.REPEAT; + if ( p === ClampToEdgeWrapping ) return _gl.CLAMP_TO_EDGE; + if ( p === MirroredRepeatWrapping ) return _gl.MIRRORED_REPEAT; + + if ( p === NearestFilter ) return _gl.NEAREST; + if ( p === NearestMipMapNearestFilter ) return _gl.NEAREST_MIPMAP_NEAREST; + if ( p === NearestMipMapLinearFilter ) return _gl.NEAREST_MIPMAP_LINEAR; + + if ( p === LinearFilter ) return _gl.LINEAR; + if ( p === LinearMipMapNearestFilter ) return _gl.LINEAR_MIPMAP_NEAREST; + if ( p === LinearMipMapLinearFilter ) return _gl.LINEAR_MIPMAP_LINEAR; + + if ( p === UnsignedByteType ) return _gl.UNSIGNED_BYTE; + if ( p === UnsignedShort4444Type ) return _gl.UNSIGNED_SHORT_4_4_4_4; + if ( p === UnsignedShort5551Type ) return _gl.UNSIGNED_SHORT_5_5_5_1; + if ( p === UnsignedShort565Type ) return _gl.UNSIGNED_SHORT_5_6_5; + + if ( p === ByteType ) return _gl.BYTE; + if ( p === ShortType ) return _gl.SHORT; + if ( p === UnsignedShortType ) return _gl.UNSIGNED_SHORT; + if ( p === IntType ) return _gl.INT; + if ( p === UnsignedIntType ) return _gl.UNSIGNED_INT; + if ( p === FloatType ) return _gl.FLOAT; + + if ( p === HalfFloatType ) { + + extension = extensions.get( 'OES_texture_half_float' ); + + if ( extension !== null ) return extension.HALF_FLOAT_OES; + + } + + if ( p === AlphaFormat ) return _gl.ALPHA; + if ( p === RGBFormat ) return _gl.RGB; + if ( p === RGBAFormat ) return _gl.RGBA; + if ( p === LuminanceFormat ) return _gl.LUMINANCE; + if ( p === LuminanceAlphaFormat ) return _gl.LUMINANCE_ALPHA; + if ( p === DepthFormat ) return _gl.DEPTH_COMPONENT; + if ( p === DepthStencilFormat ) return _gl.DEPTH_STENCIL; + + if ( p === AddEquation ) return _gl.FUNC_ADD; + if ( p === SubtractEquation ) return _gl.FUNC_SUBTRACT; + if ( p === ReverseSubtractEquation ) return _gl.FUNC_REVERSE_SUBTRACT; + + if ( p === ZeroFactor ) return _gl.ZERO; + if ( p === OneFactor ) return _gl.ONE; + if ( p === SrcColorFactor ) return _gl.SRC_COLOR; + if ( p === OneMinusSrcColorFactor ) return _gl.ONE_MINUS_SRC_COLOR; + if ( p === SrcAlphaFactor ) return _gl.SRC_ALPHA; + if ( p === OneMinusSrcAlphaFactor ) return _gl.ONE_MINUS_SRC_ALPHA; + if ( p === DstAlphaFactor ) return _gl.DST_ALPHA; + if ( p === OneMinusDstAlphaFactor ) return _gl.ONE_MINUS_DST_ALPHA; + + if ( p === DstColorFactor ) return _gl.DST_COLOR; + if ( p === OneMinusDstColorFactor ) return _gl.ONE_MINUS_DST_COLOR; + if ( p === SrcAlphaSaturateFactor ) return _gl.SRC_ALPHA_SATURATE; + + if ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format || + p === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) { + + extension = extensions.get( 'WEBGL_compressed_texture_s3tc' ); + + if ( extension !== null ) { + + if ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT; + if ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT; + if ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT; + if ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT; + + } + + } + + if ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format || + p === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) { + + extension = extensions.get( 'WEBGL_compressed_texture_pvrtc' ); + + if ( extension !== null ) { + + if ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG; + if ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG; + if ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG; + if ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG; + + } + + } + + if ( p === RGB_ETC1_Format ) { + + extension = extensions.get( 'WEBGL_compressed_texture_etc1' ); + + if ( extension !== null ) return extension.COMPRESSED_RGB_ETC1_WEBGL; + + } + + if ( p === MinEquation || p === MaxEquation ) { + + extension = extensions.get( 'EXT_blend_minmax' ); + + if ( extension !== null ) { + + if ( p === MinEquation ) return extension.MIN_EXT; + if ( p === MaxEquation ) return extension.MAX_EXT; + + } + + } + + if ( p === UnsignedInt248Type ) { + + extension = extensions.get( 'WEBGL_depth_texture' ); + + if ( extension !== null ) return extension.UNSIGNED_INT_24_8_WEBGL; + + } + + return 0; + + } + + } + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function FogExp2 ( color, density ) { + + this.name = ''; + + this.color = new Color( color ); + this.density = ( density !== undefined ) ? density : 0.00025; + + } + + FogExp2.prototype.isFogExp2 = true; + + FogExp2.prototype.clone = function () { + + return new FogExp2( this.color.getHex(), this.density ); + + }; + + FogExp2.prototype.toJSON = function ( meta ) { + + return { + type: 'FogExp2', + color: this.color.getHex(), + density: this.density + }; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function Fog ( color, near, far ) { + + this.name = ''; + + this.color = new Color( color ); + + this.near = ( near !== undefined ) ? near : 1; + this.far = ( far !== undefined ) ? far : 1000; + + } + + Fog.prototype.isFog = true; + + Fog.prototype.clone = function () { + + return new Fog( this.color.getHex(), this.near, this.far ); + + }; + + Fog.prototype.toJSON = function ( meta ) { + + return { + type: 'Fog', + color: this.color.getHex(), + near: this.near, + far: this.far + }; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Scene () { + + Object3D.call( this ); + + this.type = 'Scene'; + + this.background = null; + this.fog = null; + this.overrideMaterial = null; + + this.autoUpdate = true; // checked by the renderer + + } + + Scene.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Scene, + + copy: function ( source, recursive ) { + + Object3D.prototype.copy.call( this, source, recursive ); + + if ( source.background !== null ) this.background = source.background.clone(); + if ( source.fog !== null ) this.fog = source.fog.clone(); + if ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone(); + + this.autoUpdate = source.autoUpdate; + this.matrixAutoUpdate = source.matrixAutoUpdate; + + return this; + + }, + + toJSON: function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + if ( this.background !== null ) data.object.background = this.background.toJSON( meta ); + if ( this.fog !== null ) data.object.fog = this.fog.toJSON(); + + return data; + + } + + } ); + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + */ + + function LensFlare( texture, size, distance, blending, color ) { + + Object3D.call( this ); + + this.lensFlares = []; + + this.positionScreen = new Vector3(); + this.customUpdateCallback = undefined; + + if ( texture !== undefined ) { + + this.add( texture, size, distance, blending, color ); + + } + + } + + LensFlare.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: LensFlare, + + isLensFlare: true, + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source ); + + this.positionScreen.copy( source.positionScreen ); + this.customUpdateCallback = source.customUpdateCallback; + + for ( var i = 0, l = source.lensFlares.length; i < l; i ++ ) { + + this.lensFlares.push( source.lensFlares[ i ] ); + + } + + return this; + + }, + + add: function ( texture, size, distance, blending, color, opacity ) { + + if ( size === undefined ) size = - 1; + if ( distance === undefined ) distance = 0; + if ( opacity === undefined ) opacity = 1; + if ( color === undefined ) color = new Color( 0xffffff ); + if ( blending === undefined ) blending = NormalBlending; + + distance = Math.min( distance, Math.max( 0, distance ) ); + + this.lensFlares.push( { + texture: texture, // THREE.Texture + size: size, // size in pixels (-1 = use texture.width) + distance: distance, // distance (0-1) from light source (0=at light source) + x: 0, y: 0, z: 0, // screen position (-1 => 1) z = 0 is in front z = 1 is back + scale: 1, // scale + rotation: 0, // rotation + opacity: opacity, // opacity + color: color, // color + blending: blending // blending + } ); + + }, + + /* + * Update lens flares update positions on all flares based on the screen position + * Set myLensFlare.customUpdateCallback to alter the flares in your project specific way. + */ + + updateLensFlares: function () { + + var f, fl = this.lensFlares.length; + var flare; + var vecX = - this.positionScreen.x * 2; + var vecY = - this.positionScreen.y * 2; + + for ( f = 0; f < fl; f ++ ) { + + flare = this.lensFlares[ f ]; + + flare.x = this.positionScreen.x + vecX * flare.distance; + flare.y = this.positionScreen.y + vecY * flare.distance; + + flare.wantedRotation = flare.x * Math.PI * 0.25; + flare.rotation += ( flare.wantedRotation - flare.rotation ) * 0.25; + + } + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: <hex>, + * opacity: <float>, + * map: new THREE.Texture( <Image> ), + * + * uvOffset: new THREE.Vector2(), + * uvScale: new THREE.Vector2() + * } + */ + + function SpriteMaterial( parameters ) { + + Material.call( this ); + + this.type = 'SpriteMaterial'; + + this.color = new Color( 0xffffff ); + this.map = null; + + this.rotation = 0; + + this.fog = false; + this.lights = false; + + this.setValues( parameters ); + + } + + SpriteMaterial.prototype = Object.create( Material.prototype ); + SpriteMaterial.prototype.constructor = SpriteMaterial; + SpriteMaterial.prototype.isSpriteMaterial = true; + + SpriteMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + this.map = source.map; + + this.rotation = source.rotation; + + return this; + + }; + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + */ + + function Sprite( material ) { + + Object3D.call( this ); + + this.type = 'Sprite'; + + this.material = ( material !== undefined ) ? material : new SpriteMaterial(); + + } + + Sprite.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Sprite, + + isSprite: true, + + raycast: ( function () { + + var intersectPoint = new Vector3(); + var worldPosition = new Vector3(); + var worldScale = new Vector3(); + + return function raycast( raycaster, intersects ) { + + worldPosition.setFromMatrixPosition( this.matrixWorld ); + raycaster.ray.closestPointToPoint( worldPosition, intersectPoint ); + + worldScale.setFromMatrixScale( this.matrixWorld ); + var guessSizeSq = worldScale.x * worldScale.y / 4; + + if ( worldPosition.distanceToSquared( intersectPoint ) > guessSizeSq ) return; + + var distance = raycaster.ray.origin.distanceTo( intersectPoint ); + + if ( distance < raycaster.near || distance > raycaster.far ) return; + + intersects.push( { + + distance: distance, + point: intersectPoint.clone(), + face: null, + object: this + + } ); + + }; + + }() ), + + clone: function () { + + return new this.constructor( this.material ).copy( this ); + + } + + } ); + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + function LOD() { + + Object3D.call( this ); + + this.type = 'LOD'; + + Object.defineProperties( this, { + levels: { + enumerable: true, + value: [] + } + } ); + + } + + LOD.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: LOD, + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source, false ); + + var levels = source.levels; + + for ( var i = 0, l = levels.length; i < l; i ++ ) { + + var level = levels[ i ]; + + this.addLevel( level.object.clone(), level.distance ); + + } + + return this; + + }, + + addLevel: function ( object, distance ) { + + if ( distance === undefined ) distance = 0; + + distance = Math.abs( distance ); + + var levels = this.levels; + + for ( var l = 0; l < levels.length; l ++ ) { + + if ( distance < levels[ l ].distance ) { + + break; + + } + + } + + levels.splice( l, 0, { distance: distance, object: object } ); + + this.add( object ); + + }, + + getObjectForDistance: function ( distance ) { + + var levels = this.levels; + + for ( var i = 1, l = levels.length; i < l; i ++ ) { + + if ( distance < levels[ i ].distance ) { + + break; + + } + + } + + return levels[ i - 1 ].object; + + }, + + raycast: ( function () { + + var matrixPosition = new Vector3(); + + return function raycast( raycaster, intersects ) { + + matrixPosition.setFromMatrixPosition( this.matrixWorld ); + + var distance = raycaster.ray.origin.distanceTo( matrixPosition ); + + this.getObjectForDistance( distance ).raycast( raycaster, intersects ); + + }; + + }() ), + + update: function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + + return function update( camera ) { + + var levels = this.levels; + + if ( levels.length > 1 ) { + + v1.setFromMatrixPosition( camera.matrixWorld ); + v2.setFromMatrixPosition( this.matrixWorld ); + + var distance = v1.distanceTo( v2 ); + + levels[ 0 ].object.visible = true; + + for ( var i = 1, l = levels.length; i < l; i ++ ) { + + if ( distance >= levels[ i ].distance ) { + + levels[ i - 1 ].object.visible = false; + levels[ i ].object.visible = true; + + } else { + + break; + + } + + } + + for ( ; i < l; i ++ ) { + + levels[ i ].object.visible = false; + + } + + } + + }; + + }(), + + toJSON: function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + data.object.levels = []; + + var levels = this.levels; + + for ( var i = 0, l = levels.length; i < l; i ++ ) { + + var level = levels[ i ]; + + data.object.levels.push( { + object: level.object.uuid, + distance: level.distance + } ); + + } + + return data; + + } + + } ); + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author michael guerrero / http://realitymeltdown.com + * @author ikerr / http://verold.com + */ + + function Skeleton( bones, boneInverses ) { + + // copy the bone array + + bones = bones || []; + + this.bones = bones.slice( 0 ); + this.boneMatrices = new Float32Array( this.bones.length * 16 ); + + // use the supplied bone inverses or calculate the inverses + + if ( boneInverses === undefined ) { + + this.calculateInverses(); + + } else { + + if ( this.bones.length === boneInverses.length ) { + + this.boneInverses = boneInverses.slice( 0 ); + + } else { + + console.warn( 'THREE.Skeleton boneInverses is the wrong length.' ); + + this.boneInverses = []; + + for ( var i = 0, il = this.bones.length; i < il; i ++ ) { + + this.boneInverses.push( new Matrix4() ); + + } + + } + + } + + } + + Object.assign( Skeleton.prototype, { + + calculateInverses: function () { + + this.boneInverses = []; + + for ( var i = 0, il = this.bones.length; i < il; i ++ ) { + + var inverse = new Matrix4(); + + if ( this.bones[ i ] ) { + + inverse.getInverse( this.bones[ i ].matrixWorld ); + + } + + this.boneInverses.push( inverse ); + + } + + }, + + pose: function () { + + var bone, i, il; + + // recover the bind-time world matrices + + for ( i = 0, il = this.bones.length; i < il; i ++ ) { + + bone = this.bones[ i ]; + + if ( bone ) { + + bone.matrixWorld.getInverse( this.boneInverses[ i ] ); + + } + + } + + // compute the local matrices, positions, rotations and scales + + for ( i = 0, il = this.bones.length; i < il; i ++ ) { + + bone = this.bones[ i ]; + + if ( bone ) { + + if ( bone.parent && bone.parent.isBone ) { + + bone.matrix.getInverse( bone.parent.matrixWorld ); + bone.matrix.multiply( bone.matrixWorld ); + + } else { + + bone.matrix.copy( bone.matrixWorld ); + + } + + bone.matrix.decompose( bone.position, bone.quaternion, bone.scale ); + + } + + } + + }, + + update: ( function () { + + var offsetMatrix = new Matrix4(); + var identityMatrix = new Matrix4(); + + return function update() { + + var bones = this.bones; + var boneInverses = this.boneInverses; + var boneMatrices = this.boneMatrices; + var boneTexture = this.boneTexture; + + // flatten bone matrices to array + + for ( var i = 0, il = bones.length; i < il; i ++ ) { + + // compute the offset between the current and the original transform + + var matrix = bones[ i ] ? bones[ i ].matrixWorld : identityMatrix; + + offsetMatrix.multiplyMatrices( matrix, boneInverses[ i ] ); + offsetMatrix.toArray( boneMatrices, i * 16 ); + + } + + if ( boneTexture !== undefined ) { + + boneTexture.needsUpdate = true; + + } + + }; + + } )(), + + clone: function () { + + return new Skeleton( this.bones, this.boneInverses ); + + } + + } ); + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author ikerr / http://verold.com + */ + + function Bone() { + + Object3D.call( this ); + + this.type = 'Bone'; + + } + + Bone.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Bone, + + isBone: true + + } ); + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author ikerr / http://verold.com + */ + + function SkinnedMesh( geometry, material ) { + + Mesh.call( this, geometry, material ); + + this.type = 'SkinnedMesh'; + + this.bindMode = 'attached'; + this.bindMatrix = new Matrix4(); + this.bindMatrixInverse = new Matrix4(); + + var bones = this.initBones(); + var skeleton = new Skeleton( bones ); + + this.bind( skeleton, this.matrixWorld ); + + this.normalizeSkinWeights(); + + } + + SkinnedMesh.prototype = Object.assign( Object.create( Mesh.prototype ), { + + constructor: SkinnedMesh, + + isSkinnedMesh: true, + + initBones: function () { + + var bones = [], bone, gbone; + var i, il; + + if ( this.geometry && this.geometry.bones !== undefined ) { + + // first, create array of 'Bone' objects from geometry data + + for ( i = 0, il = this.geometry.bones.length; i < il; i ++ ) { + + gbone = this.geometry.bones[ i ]; + + // create new 'Bone' object + + bone = new Bone(); + bones.push( bone ); + + // apply values + + bone.name = gbone.name; + bone.position.fromArray( gbone.pos ); + bone.quaternion.fromArray( gbone.rotq ); + if ( gbone.scl !== undefined ) bone.scale.fromArray( gbone.scl ); + + } + + // second, create bone hierarchy + + for ( i = 0, il = this.geometry.bones.length; i < il; i ++ ) { + + gbone = this.geometry.bones[ i ]; + + if ( ( gbone.parent !== - 1 ) && ( gbone.parent !== null ) && ( bones[ gbone.parent ] !== undefined ) ) { + + // subsequent bones in the hierarchy + + bones[ gbone.parent ].add( bones[ i ] ); + + } else { + + // topmost bone, immediate child of the skinned mesh + + this.add( bones[ i ] ); + + } + + } + + } + + // now the bones are part of the scene graph and children of the skinned mesh. + // let's update the corresponding matrices + + this.updateMatrixWorld( true ); + + return bones; + + }, + + bind: function ( skeleton, bindMatrix ) { + + this.skeleton = skeleton; + + if ( bindMatrix === undefined ) { + + this.updateMatrixWorld( true ); + + this.skeleton.calculateInverses(); + + bindMatrix = this.matrixWorld; + + } + + this.bindMatrix.copy( bindMatrix ); + this.bindMatrixInverse.getInverse( bindMatrix ); + + }, + + pose: function () { + + this.skeleton.pose(); + + }, + + normalizeSkinWeights: function () { + + var scale, i; + + if ( this.geometry && this.geometry.isGeometry ) { + + for ( i = 0; i < this.geometry.skinWeights.length; i ++ ) { + + var sw = this.geometry.skinWeights[ i ]; + + scale = 1.0 / sw.lengthManhattan(); + + if ( scale !== Infinity ) { + + sw.multiplyScalar( scale ); + + } else { + + sw.set( 1, 0, 0, 0 ); // do something reasonable + + } + + } + + } else if ( this.geometry && this.geometry.isBufferGeometry ) { + + var vec = new Vector4(); + + var skinWeight = this.geometry.attributes.skinWeight; + + for ( i = 0; i < skinWeight.count; i ++ ) { + + vec.x = skinWeight.getX( i ); + vec.y = skinWeight.getY( i ); + vec.z = skinWeight.getZ( i ); + vec.w = skinWeight.getW( i ); + + scale = 1.0 / vec.lengthManhattan(); + + if ( scale !== Infinity ) { + + vec.multiplyScalar( scale ); + + } else { + + vec.set( 1, 0, 0, 0 ); // do something reasonable + + } + + skinWeight.setXYZW( i, vec.x, vec.y, vec.z, vec.w ); + + } + + } + + }, + + updateMatrixWorld: function ( force ) { + + Mesh.prototype.updateMatrixWorld.call( this, force ); + + if ( this.bindMode === 'attached' ) { + + this.bindMatrixInverse.getInverse( this.matrixWorld ); + + } else if ( this.bindMode === 'detached' ) { + + this.bindMatrixInverse.getInverse( this.bindMatrix ); + + } else { + + console.warn( 'THREE.SkinnedMesh: Unrecognized bindMode: ' + this.bindMode ); + + } + + }, + + clone: function () { + + return new this.constructor( this.geometry, this.material ).copy( this ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: <hex>, + * opacity: <float>, + * + * linewidth: <float>, + * linecap: "round", + * linejoin: "round" + * } + */ + + function LineBasicMaterial( parameters ) { + + Material.call( this ); + + this.type = 'LineBasicMaterial'; + + this.color = new Color( 0xffffff ); + + this.linewidth = 1; + this.linecap = 'round'; + this.linejoin = 'round'; + + this.lights = false; + + this.setValues( parameters ); + + } + + LineBasicMaterial.prototype = Object.create( Material.prototype ); + LineBasicMaterial.prototype.constructor = LineBasicMaterial; + + LineBasicMaterial.prototype.isLineBasicMaterial = true; + + LineBasicMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.linewidth = source.linewidth; + this.linecap = source.linecap; + this.linejoin = source.linejoin; + + return this; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Line( geometry, material, mode ) { + + if ( mode === 1 ) { + + console.warn( 'THREE.Line: parameter THREE.LinePieces no longer supported. Created THREE.LineSegments instead.' ); + return new LineSegments( geometry, material ); + + } + + Object3D.call( this ); + + this.type = 'Line'; + + this.geometry = geometry !== undefined ? geometry : new BufferGeometry(); + this.material = material !== undefined ? material : new LineBasicMaterial( { color: Math.random() * 0xffffff } ); + + } + + Line.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Line, + + isLine: true, + + raycast: ( function () { + + var inverseMatrix = new Matrix4(); + var ray = new Ray(); + var sphere = new Sphere(); + + return function raycast( raycaster, intersects ) { + + var precision = raycaster.linePrecision; + var precisionSq = precision * precision; + + var geometry = this.geometry; + var matrixWorld = this.matrixWorld; + + // Checking boundingSphere distance to ray + + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); + + sphere.copy( geometry.boundingSphere ); + sphere.applyMatrix4( matrixWorld ); + + if ( raycaster.ray.intersectsSphere( sphere ) === false ) return; + + // + + inverseMatrix.getInverse( matrixWorld ); + ray.copy( raycaster.ray ).applyMatrix4( inverseMatrix ); + + var vStart = new Vector3(); + var vEnd = new Vector3(); + var interSegment = new Vector3(); + var interRay = new Vector3(); + var step = (this && this.isLineSegments) ? 2 : 1; + + if ( geometry.isBufferGeometry ) { + + var index = geometry.index; + var attributes = geometry.attributes; + var positions = attributes.position.array; + + if ( index !== null ) { + + var indices = index.array; + + for ( var i = 0, l = indices.length - 1; i < l; i += step ) { + + var a = indices[ i ]; + var b = indices[ i + 1 ]; + + vStart.fromArray( positions, a * 3 ); + vEnd.fromArray( positions, b * 3 ); + + var distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment ); + + if ( distSq > precisionSq ) continue; + + interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation + + var distance = raycaster.ray.origin.distanceTo( interRay ); + + if ( distance < raycaster.near || distance > raycaster.far ) continue; + + intersects.push( { + + distance: distance, + // What do we want? intersection point on the ray or on the segment?? + // point: raycaster.ray.at( distance ), + point: interSegment.clone().applyMatrix4( this.matrixWorld ), + index: i, + face: null, + faceIndex: null, + object: this + + } ); + + } + + } else { + + for ( var i = 0, l = positions.length / 3 - 1; i < l; i += step ) { + + vStart.fromArray( positions, 3 * i ); + vEnd.fromArray( positions, 3 * i + 3 ); + + var distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment ); + + if ( distSq > precisionSq ) continue; + + interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation + + var distance = raycaster.ray.origin.distanceTo( interRay ); + + if ( distance < raycaster.near || distance > raycaster.far ) continue; + + intersects.push( { + + distance: distance, + // What do we want? intersection point on the ray or on the segment?? + // point: raycaster.ray.at( distance ), + point: interSegment.clone().applyMatrix4( this.matrixWorld ), + index: i, + face: null, + faceIndex: null, + object: this + + } ); + + } + + } + + } else if ( geometry.isGeometry ) { + + var vertices = geometry.vertices; + var nbVertices = vertices.length; + + for ( var i = 0; i < nbVertices - 1; i += step ) { + + var distSq = ray.distanceSqToSegment( vertices[ i ], vertices[ i + 1 ], interRay, interSegment ); + + if ( distSq > precisionSq ) continue; + + interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation + + var distance = raycaster.ray.origin.distanceTo( interRay ); + + if ( distance < raycaster.near || distance > raycaster.far ) continue; + + intersects.push( { + + distance: distance, + // What do we want? intersection point on the ray or on the segment?? + // point: raycaster.ray.at( distance ), + point: interSegment.clone().applyMatrix4( this.matrixWorld ), + index: i, + face: null, + faceIndex: null, + object: this + + } ); + + } + + } + + }; + + }() ), + + clone: function () { + + return new this.constructor( this.geometry, this.material ).copy( this ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function LineSegments( geometry, material ) { + + Line.call( this, geometry, material ); + + this.type = 'LineSegments'; + + } + + LineSegments.prototype = Object.assign( Object.create( Line.prototype ), { + + constructor: LineSegments, + + isLineSegments: true + + } ); + + /** + * @author mgreter / http://github.com/mgreter + */ + + function LineLoop( geometry, material ) { + + Line.call( this, geometry, material ); + + this.type = 'LineLoop'; + + } + + LineLoop.prototype = Object.assign( Object.create( Line.prototype ), { + + constructor: LineLoop, + + isLineLoop: true, + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: <hex>, + * opacity: <float>, + * map: new THREE.Texture( <Image> ), + * + * size: <float>, + * sizeAttenuation: <bool> + * } + */ + + function PointsMaterial( parameters ) { + + Material.call( this ); + + this.type = 'PointsMaterial'; + + this.color = new Color( 0xffffff ); + + this.map = null; + + this.size = 1; + this.sizeAttenuation = true; + + this.lights = false; + + this.setValues( parameters ); + + } + + PointsMaterial.prototype = Object.create( Material.prototype ); + PointsMaterial.prototype.constructor = PointsMaterial; + + PointsMaterial.prototype.isPointsMaterial = true; + + PointsMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.map = source.map; + + this.size = source.size; + this.sizeAttenuation = source.sizeAttenuation; + + return this; + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function Points( geometry, material ) { + + Object3D.call( this ); + + this.type = 'Points'; + + this.geometry = geometry !== undefined ? geometry : new BufferGeometry(); + this.material = material !== undefined ? material : new PointsMaterial( { color: Math.random() * 0xffffff } ); + + } + + Points.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Points, + + isPoints: true, + + raycast: ( function () { + + var inverseMatrix = new Matrix4(); + var ray = new Ray(); + var sphere = new Sphere(); + + return function raycast( raycaster, intersects ) { + + var object = this; + var geometry = this.geometry; + var matrixWorld = this.matrixWorld; + var threshold = raycaster.params.Points.threshold; + + // Checking boundingSphere distance to ray + + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); + + sphere.copy( geometry.boundingSphere ); + sphere.applyMatrix4( matrixWorld ); + sphere.radius += threshold; + + if ( raycaster.ray.intersectsSphere( sphere ) === false ) return; + + // + + inverseMatrix.getInverse( matrixWorld ); + ray.copy( raycaster.ray ).applyMatrix4( inverseMatrix ); + + var localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 ); + var localThresholdSq = localThreshold * localThreshold; + var position = new Vector3(); + + function testPoint( point, index ) { + + var rayPointDistanceSq = ray.distanceSqToPoint( point ); + + if ( rayPointDistanceSq < localThresholdSq ) { + + var intersectPoint = ray.closestPointToPoint( point ); + intersectPoint.applyMatrix4( matrixWorld ); + + var distance = raycaster.ray.origin.distanceTo( intersectPoint ); + + if ( distance < raycaster.near || distance > raycaster.far ) return; + + intersects.push( { + + distance: distance, + distanceToRay: Math.sqrt( rayPointDistanceSq ), + point: intersectPoint.clone(), + index: index, + face: null, + object: object + + } ); + + } + + } + + if ( geometry.isBufferGeometry ) { + + var index = geometry.index; + var attributes = geometry.attributes; + var positions = attributes.position.array; + + if ( index !== null ) { + + var indices = index.array; + + for ( var i = 0, il = indices.length; i < il; i ++ ) { + + var a = indices[ i ]; + + position.fromArray( positions, a * 3 ); + + testPoint( position, a ); + + } + + } else { + + for ( var i = 0, l = positions.length / 3; i < l; i ++ ) { + + position.fromArray( positions, i * 3 ); + + testPoint( position, i ); + + } + + } + + } else { + + var vertices = geometry.vertices; + + for ( var i = 0, l = vertices.length; i < l; i ++ ) { + + testPoint( vertices[ i ], i ); + + } + + } + + }; + + }() ), + + clone: function () { + + return new this.constructor( this.geometry, this.material ).copy( this ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Group() { + + Object3D.call( this ); + + this.type = 'Group'; + + } + + Group.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Group + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function VideoTexture( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) { + + Texture.call( this, video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + + this.generateMipmaps = false; + + var scope = this; + + function update() { + + requestAnimationFrame( update ); + + if ( video.readyState >= video.HAVE_CURRENT_DATA ) { + + scope.needsUpdate = true; + + } + + } + + update(); + + } + + VideoTexture.prototype = Object.create( Texture.prototype ); + VideoTexture.prototype.constructor = VideoTexture; + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function CompressedTexture( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) { + + Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ); + + this.image = { width: width, height: height }; + this.mipmaps = mipmaps; + + // no flipping for cube textures + // (also flipping doesn't work for compressed textures ) + + this.flipY = false; + + // can't generate mipmaps for compressed textures + // mips must be embedded in DDS files + + this.generateMipmaps = false; + + } + + CompressedTexture.prototype = Object.create( Texture.prototype ); + CompressedTexture.prototype.constructor = CompressedTexture; + + CompressedTexture.prototype.isCompressedTexture = true; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function CanvasTexture( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) { + + Texture.call( this, canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + + this.needsUpdate = true; + + } + + CanvasTexture.prototype = Object.create( Texture.prototype ); + CanvasTexture.prototype.constructor = CanvasTexture; + + /** + * @author Matt DesLauriers / @mattdesl + * @author atix / arthursilber.de + */ + + function DepthTexture( width, height, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, format ) { + + format = format !== undefined ? format : DepthFormat; + + if ( format !== DepthFormat && format !== DepthStencilFormat ) { + + throw new Error( 'DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat' ) + + } + + if ( type === undefined && format === DepthFormat ) type = UnsignedShortType; + if ( type === undefined && format === DepthStencilFormat ) type = UnsignedInt248Type; + + Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + + this.image = { width: width, height: height }; + + this.magFilter = magFilter !== undefined ? magFilter : NearestFilter; + this.minFilter = minFilter !== undefined ? minFilter : NearestFilter; + + this.flipY = false; + this.generateMipmaps = false; + + } + + DepthTexture.prototype = Object.create( Texture.prototype ); + DepthTexture.prototype.constructor = DepthTexture; + DepthTexture.prototype.isDepthTexture = true; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + + function WireframeGeometry( geometry ) { + + BufferGeometry.call( this ); + + this.type = 'WireframeGeometry'; + + // buffer + + var vertices = []; + + // helper variables + + var i, j, l, o, ol; + var edge = [ 0, 0 ], edges = {}, e, edge1, edge2; + var key, keys = [ 'a', 'b', 'c' ]; + var vertex; + + // different logic for Geometry and BufferGeometry + + if ( geometry && geometry.isGeometry ) { + + // create a data structure that contains all edges without duplicates + + var faces = geometry.faces; + + for ( i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + for ( j = 0; j < 3; j ++ ) { + + edge1 = face[ keys[ j ] ]; + edge2 = face[ keys[ ( j + 1 ) % 3 ] ]; + edge[ 0 ] = Math.min( edge1, edge2 ); // sorting prevents duplicates + edge[ 1 ] = Math.max( edge1, edge2 ); + + key = edge[ 0 ] + ',' + edge[ 1 ]; + + if ( edges[ key ] === undefined ) { + + edges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] }; + + } + + } + + } + + // generate vertices + + for ( key in edges ) { + + e = edges[ key ]; + + vertex = geometry.vertices[ e.index1 ]; + vertices.push( vertex.x, vertex.y, vertex.z ); + + vertex = geometry.vertices[ e.index2 ]; + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + } else if ( geometry && geometry.isBufferGeometry ) { + + var position, indices, groups; + var group, start, count; + var index1, index2; + + vertex = new Vector3(); + + if ( geometry.index !== null ) { + + // indexed BufferGeometry + + position = geometry.attributes.position; + indices = geometry.index; + groups = geometry.groups; + + if ( groups.length === 0 ) { + + groups = [ { start: 0, count: indices.count, materialIndex: 0 } ]; + + } + + // create a data structure that contains all eges without duplicates + + for ( o = 0, ol = groups.length; o < ol; ++ o ) { + + group = groups[ o ]; + + start = group.start; + count = group.count; + + for ( i = start, l = ( start + count ); i < l; i += 3 ) { + + for ( j = 0; j < 3; j ++ ) { + + edge1 = indices.getX( i + j ); + edge2 = indices.getX( i + ( j + 1 ) % 3 ); + edge[ 0 ] = Math.min( edge1, edge2 ); // sorting prevents duplicates + edge[ 1 ] = Math.max( edge1, edge2 ); + + key = edge[ 0 ] + ',' + edge[ 1 ]; + + if ( edges[ key ] === undefined ) { + + edges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] }; + + } + + } + + } + + } + + // generate vertices + + for ( key in edges ) { + + e = edges[ key ]; + + vertex.fromBufferAttribute( position, e.index1 ); + vertices.push( vertex.x, vertex.y, vertex.z ); + + vertex.fromBufferAttribute( position, e.index2 ); + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + } else { + + // non-indexed BufferGeometry + + position = geometry.attributes.position; + + for ( i = 0, l = ( position.count / 3 ); i < l; i ++ ) { + + for ( j = 0; j < 3; j ++ ) { + + // three edges per triangle, an edge is represented as (index1, index2) + // e.g. the first triangle has the following edges: (0,1),(1,2),(2,0) + + index1 = 3 * i + j; + vertex.fromBufferAttribute( position, index1 ); + vertices.push( vertex.x, vertex.y, vertex.z ); + + index2 = 3 * i + ( ( j + 1 ) % 3 ); + vertex.fromBufferAttribute( position, index2 ); + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + } + + } + + } + + // build geometry + + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + + } + + WireframeGeometry.prototype = Object.create( BufferGeometry.prototype ); + WireframeGeometry.prototype.constructor = WireframeGeometry; + + /** + * @author zz85 / https://github.com/zz85 + * @author Mugen87 / https://github.com/Mugen87 + * + * Parametric Surfaces Geometry + * based on the brilliant article by @prideout http://prideout.net/blog/?p=44 + */ + + // ParametricGeometry + + function ParametricGeometry( func, slices, stacks ) { + + Geometry.call( this ); + + this.type = 'ParametricGeometry'; + + this.parameters = { + func: func, + slices: slices, + stacks: stacks + }; + + this.fromBufferGeometry( new ParametricBufferGeometry( func, slices, stacks ) ); + this.mergeVertices(); + + } + + ParametricGeometry.prototype = Object.create( Geometry.prototype ); + ParametricGeometry.prototype.constructor = ParametricGeometry; + + // ParametricBufferGeometry + + function ParametricBufferGeometry( func, slices, stacks ) { + + BufferGeometry.call( this ); + + this.type = 'ParametricBufferGeometry'; + + this.parameters = { + func: func, + slices: slices, + stacks: stacks + }; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + var EPS = 0.00001; + + var normal = new Vector3(); + + var p0 = new Vector3(), p1 = new Vector3(); + var pu = new Vector3(), pv = new Vector3(); + + var i, j; + + // generate vertices, normals and uvs + + var sliceCount = slices + 1; + + for ( i = 0; i <= stacks; i ++ ) { + + var v = i / stacks; + + for ( j = 0; j <= slices; j ++ ) { + + var u = j / slices; + + // vertex + + p0 = func( u, v, p0 ); + vertices.push( p0.x, p0.y, p0.z ); + + // normal + + // approximate tangent vectors via finite differences + + if ( u - EPS >= 0 ) { + + p1 = func( u - EPS, v, p1 ); + pu.subVectors( p0, p1 ); + + } else { + + p1 = func( u + EPS, v, p1 ); + pu.subVectors( p1, p0 ); + + } + + if ( v - EPS >= 0 ) { + + p1 = func( u, v - EPS, p1 ); + pv.subVectors( p0, p1 ); + + } else { + + p1 = func( u, v + EPS, p1 ); + pv.subVectors( p1, p0 ); + + } + + // cross product of tangent vectors returns surface normal + + normal.crossVectors( pu, pv ).normalize(); + normals.push( normal.x, normal.y, normal.z ); + + // uv + + uvs.push( u, v ); + + } + + } + + // generate indices + + for ( i = 0; i < stacks; i ++ ) { + + for ( j = 0; j < slices; j ++ ) { + + var a = i * sliceCount + j; + var b = i * sliceCount + j + 1; + var c = ( i + 1 ) * sliceCount + j + 1; + var d = ( i + 1 ) * sliceCount + j; + + // faces one and two + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + ParametricBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + ParametricBufferGeometry.prototype.constructor = ParametricBufferGeometry; + + /** + * @author clockworkgeek / https://github.com/clockworkgeek + * @author timothypratley / https://github.com/timothypratley + * @author WestLangley / http://github.com/WestLangley + * @author Mugen87 / https://github.com/Mugen87 + */ + + // PolyhedronGeometry + + function PolyhedronGeometry( vertices, indices, radius, detail ) { + + Geometry.call( this ); + + this.type = 'PolyhedronGeometry'; + + this.parameters = { + vertices: vertices, + indices: indices, + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new PolyhedronBufferGeometry( vertices, indices, radius, detail ) ); + this.mergeVertices(); + + } + + PolyhedronGeometry.prototype = Object.create( Geometry.prototype ); + PolyhedronGeometry.prototype.constructor = PolyhedronGeometry; + + // PolyhedronBufferGeometry + + function PolyhedronBufferGeometry( vertices, indices, radius, detail ) { + + BufferGeometry.call( this ); + + this.type = 'PolyhedronBufferGeometry'; + + this.parameters = { + vertices: vertices, + indices: indices, + radius: radius, + detail: detail + }; + + radius = radius || 1; + detail = detail || 0; + + // default buffer data + + var vertexBuffer = []; + var uvBuffer = []; + + // the subdivision creates the vertex buffer data + + subdivide( detail ); + + // all vertices should lie on a conceptual sphere with a given radius + + appplyRadius( radius ); + + // finally, create the uv data + + generateUVs(); + + // build non-indexed geometry + + this.addAttribute( 'position', new Float32BufferAttribute( vertexBuffer, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( vertexBuffer.slice(), 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvBuffer, 2 ) ); + this.normalizeNormals(); + + // helper functions + + function subdivide( detail ) { + + var a = new Vector3(); + var b = new Vector3(); + var c = new Vector3(); + + // iterate over all faces and apply a subdivison with the given detail value + + for ( var i = 0; i < indices.length; i += 3 ) { + + // get the vertices of the face + + getVertexByIndex( indices[ i + 0 ], a ); + getVertexByIndex( indices[ i + 1 ], b ); + getVertexByIndex( indices[ i + 2 ], c ); + + // perform subdivision + + subdivideFace( a, b, c, detail ); + + } + + } + + function subdivideFace( a, b, c, detail ) { + + var cols = Math.pow( 2, detail ); + + // we use this multidimensional array as a data structure for creating the subdivision + + var v = []; + + var i, j; + + // construct all of the vertices for this subdivision + + for ( i = 0; i <= cols; i ++ ) { + + v[ i ] = []; + + var aj = a.clone().lerp( c, i / cols ); + var bj = b.clone().lerp( c, i / cols ); + + var rows = cols - i; + + for ( j = 0; j <= rows; j ++ ) { + + if ( j === 0 && i === cols ) { + + v[ i ][ j ] = aj; + + } else { + + v[ i ][ j ] = aj.clone().lerp( bj, j / rows ); + + } + + } + + } + + // construct all of the faces + + for ( i = 0; i < cols; i ++ ) { + + for ( j = 0; j < 2 * ( cols - i ) - 1; j ++ ) { + + var k = Math.floor( j / 2 ); + + if ( j % 2 === 0 ) { + + pushVertex( v[ i ][ k + 1 ] ); + pushVertex( v[ i + 1 ][ k ] ); + pushVertex( v[ i ][ k ] ); + + } else { + + pushVertex( v[ i ][ k + 1 ] ); + pushVertex( v[ i + 1 ][ k + 1 ] ); + pushVertex( v[ i + 1 ][ k ] ); + + } + + } + + } + + } + + function appplyRadius( radius ) { + + var vertex = new Vector3(); + + // iterate over the entire buffer and apply the radius to each vertex + + for ( var i = 0; i < vertexBuffer.length; i += 3 ) { + + vertex.x = vertexBuffer[ i + 0 ]; + vertex.y = vertexBuffer[ i + 1 ]; + vertex.z = vertexBuffer[ i + 2 ]; + + vertex.normalize().multiplyScalar( radius ); + + vertexBuffer[ i + 0 ] = vertex.x; + vertexBuffer[ i + 1 ] = vertex.y; + vertexBuffer[ i + 2 ] = vertex.z; + + } + + } + + function generateUVs() { + + var vertex = new Vector3(); + + for ( var i = 0; i < vertexBuffer.length; i += 3 ) { + + vertex.x = vertexBuffer[ i + 0 ]; + vertex.y = vertexBuffer[ i + 1 ]; + vertex.z = vertexBuffer[ i + 2 ]; + + var u = azimuth( vertex ) / 2 / Math.PI + 0.5; + var v = inclination( vertex ) / Math.PI + 0.5; + uvBuffer.push( u, 1 - v ); + + } + + correctUVs(); + + correctSeam(); + + } + + function correctSeam() { + + // handle case when face straddles the seam, see #3269 + + for ( var i = 0; i < uvBuffer.length; i += 6 ) { + + // uv data of a single face + + var x0 = uvBuffer[ i + 0 ]; + var x1 = uvBuffer[ i + 2 ]; + var x2 = uvBuffer[ i + 4 ]; + + var max = Math.max( x0, x1, x2 ); + var min = Math.min( x0, x1, x2 ); + + // 0.9 is somewhat arbitrary + + if ( max > 0.9 && min < 0.1 ) { + + if ( x0 < 0.2 ) uvBuffer[ i + 0 ] += 1; + if ( x1 < 0.2 ) uvBuffer[ i + 2 ] += 1; + if ( x2 < 0.2 ) uvBuffer[ i + 4 ] += 1; + + } + + } + + } + + function pushVertex( vertex ) { + + vertexBuffer.push( vertex.x, vertex.y, vertex.z ); + + } + + function getVertexByIndex( index, vertex ) { + + var stride = index * 3; + + vertex.x = vertices[ stride + 0 ]; + vertex.y = vertices[ stride + 1 ]; + vertex.z = vertices[ stride + 2 ]; + + } + + function correctUVs() { + + var a = new Vector3(); + var b = new Vector3(); + var c = new Vector3(); + + var centroid = new Vector3(); + + var uvA = new Vector2(); + var uvB = new Vector2(); + var uvC = new Vector2(); + + for ( var i = 0, j = 0; i < vertexBuffer.length; i += 9, j += 6 ) { + + a.set( vertexBuffer[ i + 0 ], vertexBuffer[ i + 1 ], vertexBuffer[ i + 2 ] ); + b.set( vertexBuffer[ i + 3 ], vertexBuffer[ i + 4 ], vertexBuffer[ i + 5 ] ); + c.set( vertexBuffer[ i + 6 ], vertexBuffer[ i + 7 ], vertexBuffer[ i + 8 ] ); + + uvA.set( uvBuffer[ j + 0 ], uvBuffer[ j + 1 ] ); + uvB.set( uvBuffer[ j + 2 ], uvBuffer[ j + 3 ] ); + uvC.set( uvBuffer[ j + 4 ], uvBuffer[ j + 5 ] ); + + centroid.copy( a ).add( b ).add( c ).divideScalar( 3 ); + + var azi = azimuth( centroid ); + + correctUV( uvA, j + 0, a, azi ); + correctUV( uvB, j + 2, b, azi ); + correctUV( uvC, j + 4, c, azi ); + + } + + } + + function correctUV( uv, stride, vector, azimuth ) { + + if ( ( azimuth < 0 ) && ( uv.x === 1 ) ) { + + uvBuffer[ stride ] = uv.x - 1; + + } + + if ( ( vector.x === 0 ) && ( vector.z === 0 ) ) { + + uvBuffer[ stride ] = azimuth / 2 / Math.PI + 0.5; + + } + + } + + // Angle around the Y axis, counter-clockwise when looking from above. + + function azimuth( vector ) { + + return Math.atan2( vector.z, - vector.x ); + + } + + + // Angle above the XZ plane. + + function inclination( vector ) { + + return Math.atan2( - vector.y, Math.sqrt( ( vector.x * vector.x ) + ( vector.z * vector.z ) ) ); + + } + + } + + PolyhedronBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + PolyhedronBufferGeometry.prototype.constructor = PolyhedronBufferGeometry; + + /** + * @author timothypratley / https://github.com/timothypratley + * @author Mugen87 / https://github.com/Mugen87 + */ + + // TetrahedronGeometry + + function TetrahedronGeometry( radius, detail ) { + + Geometry.call( this ); + + this.type = 'TetrahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new TetrahedronBufferGeometry( radius, detail ) ); + this.mergeVertices(); + + } + + TetrahedronGeometry.prototype = Object.create( Geometry.prototype ); + TetrahedronGeometry.prototype.constructor = TetrahedronGeometry; + + // TetrahedronBufferGeometry + + function TetrahedronBufferGeometry( radius, detail ) { + + var vertices = [ + 1, 1, 1, - 1, - 1, 1, - 1, 1, - 1, 1, - 1, - 1 + ]; + + var indices = [ + 2, 1, 0, 0, 3, 2, 1, 3, 0, 2, 3, 1 + ]; + + PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail ); + + this.type = 'TetrahedronBufferGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + } + + TetrahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype ); + TetrahedronBufferGeometry.prototype.constructor = TetrahedronBufferGeometry; + + /** + * @author timothypratley / https://github.com/timothypratley + * @author Mugen87 / https://github.com/Mugen87 + */ + + // OctahedronGeometry + + function OctahedronGeometry( radius, detail ) { + + Geometry.call( this ); + + this.type = 'OctahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new OctahedronBufferGeometry( radius, detail ) ); + this.mergeVertices(); + + } + + OctahedronGeometry.prototype = Object.create( Geometry.prototype ); + OctahedronGeometry.prototype.constructor = OctahedronGeometry; + + // OctahedronBufferGeometry + + function OctahedronBufferGeometry( radius, detail ) { + + var vertices = [ + 1, 0, 0, - 1, 0, 0, 0, 1, 0, 0, - 1, 0, 0, 0, 1, 0, 0, - 1 + ]; + + var indices = [ + 0, 2, 4, 0, 4, 3, 0, 3, 5, 0, 5, 2, 1, 2, 5, 1, 5, 3, 1, 3, 4, 1, 4, 2 + ]; + + PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail ); + + this.type = 'OctahedronBufferGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + } + + OctahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype ); + OctahedronBufferGeometry.prototype.constructor = OctahedronBufferGeometry; + + /** + * @author timothypratley / https://github.com/timothypratley + * @author Mugen87 / https://github.com/Mugen87 + */ + + // IcosahedronGeometry + + function IcosahedronGeometry( radius, detail ) { + + Geometry.call( this ); + + this.type = 'IcosahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new IcosahedronBufferGeometry( radius, detail ) ); + this.mergeVertices(); + + } + + IcosahedronGeometry.prototype = Object.create( Geometry.prototype ); + IcosahedronGeometry.prototype.constructor = IcosahedronGeometry; + + // IcosahedronBufferGeometry + + function IcosahedronBufferGeometry( radius, detail ) { + + var t = ( 1 + Math.sqrt( 5 ) ) / 2; + + var vertices = [ + - 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t, 0, + 0, - 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t, + t, 0, - 1, t, 0, 1, - t, 0, - 1, - t, 0, 1 + ]; + + var indices = [ + 0, 11, 5, 0, 5, 1, 0, 1, 7, 0, 7, 10, 0, 10, 11, + 1, 5, 9, 5, 11, 4, 11, 10, 2, 10, 7, 6, 7, 1, 8, + 3, 9, 4, 3, 4, 2, 3, 2, 6, 3, 6, 8, 3, 8, 9, + 4, 9, 5, 2, 4, 11, 6, 2, 10, 8, 6, 7, 9, 8, 1 + ]; + + PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail ); + + this.type = 'IcosahedronBufferGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + } + + IcosahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype ); + IcosahedronBufferGeometry.prototype.constructor = IcosahedronBufferGeometry; + + /** + * @author Abe Pazos / https://hamoid.com + * @author Mugen87 / https://github.com/Mugen87 + */ + + // DodecahedronGeometry + + function DodecahedronGeometry( radius, detail ) { + + Geometry.call( this ); + + this.type = 'DodecahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new DodecahedronBufferGeometry( radius, detail ) ); + this.mergeVertices(); + + } + + DodecahedronGeometry.prototype = Object.create( Geometry.prototype ); + DodecahedronGeometry.prototype.constructor = DodecahedronGeometry; + + // DodecahedronBufferGeometry + + function DodecahedronBufferGeometry( radius, detail ) { + + var t = ( 1 + Math.sqrt( 5 ) ) / 2; + var r = 1 / t; + + var vertices = [ + + // (±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, + + // (0, ±1/φ, ±φ) + 0, - r, - t, 0, - r, t, + 0, r, - t, 0, r, t, + + // (±1/φ, ±φ, 0) + - r, - t, 0, - r, t, 0, + r, - t, 0, r, t, 0, + + // (±φ, 0, ±1/φ) + - t, 0, - r, t, 0, - r, + - t, 0, r, t, 0, r + ]; + + var indices = [ + 3, 11, 7, 3, 7, 15, 3, 15, 13, + 7, 19, 17, 7, 17, 6, 7, 6, 15, + 17, 4, 8, 17, 8, 10, 17, 10, 6, + 8, 0, 16, 8, 16, 2, 8, 2, 10, + 0, 12, 1, 0, 1, 18, 0, 18, 16, + 6, 10, 2, 6, 2, 13, 6, 13, 15, + 2, 16, 18, 2, 18, 3, 2, 3, 13, + 18, 1, 9, 18, 9, 11, 18, 11, 3, + 4, 14, 12, 4, 12, 0, 4, 0, 8, + 11, 9, 5, 11, 5, 19, 11, 19, 7, + 19, 5, 14, 19, 14, 4, 19, 4, 17, + 1, 12, 14, 1, 14, 5, 1, 5, 9 + ]; + + PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail ); + + this.type = 'DodecahedronBufferGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + } + + DodecahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype ); + DodecahedronBufferGeometry.prototype.constructor = DodecahedronBufferGeometry; + + /** + * @author oosmoxiecode / https://github.com/oosmoxiecode + * @author WestLangley / https://github.com/WestLangley + * @author zz85 / https://github.com/zz85 + * @author miningold / https://github.com/miningold + * @author jonobr1 / https://github.com/jonobr1 + * @author Mugen87 / https://github.com/Mugen87 + * + */ + + // TubeGeometry + + function TubeGeometry( path, tubularSegments, radius, radialSegments, closed, taper ) { + + Geometry.call( this ); + + this.type = 'TubeGeometry'; + + this.parameters = { + path: path, + tubularSegments: tubularSegments, + radius: radius, + radialSegments: radialSegments, + closed: closed + }; + + if ( taper !== undefined ) console.warn( 'THREE.TubeGeometry: taper has been removed.' ); + + var bufferGeometry = new TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed ); + + // expose internals + + this.tangents = bufferGeometry.tangents; + this.normals = bufferGeometry.normals; + this.binormals = bufferGeometry.binormals; + + // create geometry + + this.fromBufferGeometry( bufferGeometry ); + this.mergeVertices(); + + } + + TubeGeometry.prototype = Object.create( Geometry.prototype ); + TubeGeometry.prototype.constructor = TubeGeometry; + + // TubeBufferGeometry + + function TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed ) { + + BufferGeometry.call( this ); + + this.type = 'TubeBufferGeometry'; + + this.parameters = { + path: path, + tubularSegments: tubularSegments, + radius: radius, + radialSegments: radialSegments, + closed: closed + }; + + tubularSegments = tubularSegments || 64; + radius = radius || 1; + radialSegments = radialSegments || 8; + closed = closed || false; + + var frames = path.computeFrenetFrames( tubularSegments, closed ); + + // expose internals + + this.tangents = frames.tangents; + this.normals = frames.normals; + this.binormals = frames.binormals; + + // helper variables + + var vertex = new Vector3(); + var normal = new Vector3(); + var uv = new Vector2(); + + var i, j; + + // buffer + + var vertices = []; + var normals = []; + var uvs = []; + var indices = []; + + // create buffer data + + generateBufferData(); + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + // functions + + function generateBufferData() { + + for ( i = 0; i < tubularSegments; i ++ ) { + + generateSegment( i ); + + } + + // if the geometry is not closed, generate the last row of vertices and normals + // at the regular position on the given path + // + // if the geometry is closed, duplicate the first row of vertices and normals (uvs will differ) + + generateSegment( ( closed === false ) ? tubularSegments : 0 ); + + // uvs are generated in a separate function. + // this makes it easy compute correct values for closed geometries + + generateUVs(); + + // finally create faces + + generateIndices(); + + } + + function generateSegment( i ) { + + // we use getPointAt to sample evenly distributed points from the given path + + var P = path.getPointAt( i / tubularSegments ); + + // retrieve corresponding normal and binormal + + var N = frames.normals[ i ]; + var B = frames.binormals[ i ]; + + // generate normals and vertices for the current segment + + for ( j = 0; j <= radialSegments; j ++ ) { + + var v = j / radialSegments * Math.PI * 2; + + var sin = Math.sin( v ); + var cos = - Math.cos( v ); + + // normal + + normal.x = ( cos * N.x + sin * B.x ); + normal.y = ( cos * N.y + sin * B.y ); + normal.z = ( cos * N.z + sin * B.z ); + normal.normalize(); + + normals.push( normal.x, normal.y, normal.z ); + + // vertex + + vertex.x = P.x + radius * normal.x; + vertex.y = P.y + radius * normal.y; + vertex.z = P.z + radius * normal.z; + + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + } + + function generateIndices() { + + for ( j = 1; j <= tubularSegments; j ++ ) { + + for ( i = 1; i <= radialSegments; i ++ ) { + + var a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 ); + var b = ( radialSegments + 1 ) * j + ( i - 1 ); + var c = ( radialSegments + 1 ) * j + i; + var d = ( radialSegments + 1 ) * ( j - 1 ) + i; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + } + + function generateUVs() { + + for ( i = 0; i <= tubularSegments; i ++ ) { + + for ( j = 0; j <= radialSegments; j ++ ) { + + uv.x = i / tubularSegments; + uv.y = j / radialSegments; + + uvs.push( uv.x, uv.y ); + + } + + } + + } + + } + + TubeBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + TubeBufferGeometry.prototype.constructor = TubeBufferGeometry; + + /** + * @author oosmoxiecode + * @author Mugen87 / https://github.com/Mugen87 + * + * based on http://www.blackpawn.com/texts/pqtorus/ + */ + + // TorusKnotGeometry + + function TorusKnotGeometry( radius, tube, tubularSegments, radialSegments, p, q, heightScale ) { + + Geometry.call( this ); + + this.type = 'TorusKnotGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + tubularSegments: tubularSegments, + radialSegments: radialSegments, + p: p, + q: q + }; + + if ( heightScale !== undefined ) console.warn( 'THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead.' ); + + this.fromBufferGeometry( new TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) ); + this.mergeVertices(); + + } + + TorusKnotGeometry.prototype = Object.create( Geometry.prototype ); + TorusKnotGeometry.prototype.constructor = TorusKnotGeometry; + + // TorusKnotBufferGeometry + + function TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) { + + BufferGeometry.call( this ); + + this.type = 'TorusKnotBufferGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + tubularSegments: tubularSegments, + radialSegments: radialSegments, + p: p, + q: q + }; + + radius = radius || 100; + tube = tube || 40; + tubularSegments = Math.floor( tubularSegments ) || 64; + radialSegments = Math.floor( radialSegments ) || 8; + p = p || 2; + q = q || 3; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var i, j; + + var vertex = new Vector3(); + var normal = new Vector3(); + + var P1 = new Vector3(); + var P2 = new Vector3(); + + var B = new Vector3(); + var T = new Vector3(); + var N = new Vector3(); + + // generate vertices, normals and uvs + + for ( i = 0; i <= tubularSegments; ++ i ) { + + // the radian "u" is used to calculate the position on the torus curve of the current tubular segement + + var u = i / tubularSegments * p * Math.PI * 2; + + // now we calculate two points. P1 is our current position on the curve, P2 is a little farther ahead. + // these points are used to create a special "coordinate space", which is necessary to calculate the correct vertex positions + + calculatePositionOnCurve( u, p, q, radius, P1 ); + calculatePositionOnCurve( u + 0.01, p, q, radius, P2 ); + + // calculate orthonormal basis + + T.subVectors( P2, P1 ); + N.addVectors( P2, P1 ); + B.crossVectors( T, N ); + N.crossVectors( B, T ); + + // normalize B, N. T can be ignored, we don't use it + + B.normalize(); + N.normalize(); + + for ( j = 0; j <= radialSegments; ++ j ) { + + // now calculate the vertices. they are nothing more than an extrusion of the torus curve. + // because we extrude a shape in the xy-plane, there is no need to calculate a z-value. + + var v = j / radialSegments * Math.PI * 2; + var cx = - tube * Math.cos( v ); + var cy = tube * Math.sin( v ); + + // now calculate the final vertex position. + // first we orient the extrusion with our basis vectos, then we add it to the current position on the curve + + vertex.x = P1.x + ( cx * N.x + cy * B.x ); + vertex.y = P1.y + ( cx * N.y + cy * B.y ); + vertex.z = P1.z + ( cx * N.z + cy * B.z ); + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal (P1 is always the center/origin of the extrusion, thus we can use it to calculate the normal) + + normal.subVectors( vertex, P1 ).normalize(); + + normals.push( normal.x, normal.y, normal.z ); + + // uv + + uvs.push( i / tubularSegments ); + uvs.push( j / radialSegments ); + + } + + } + + // generate indices + + for ( j = 1; j <= tubularSegments; j ++ ) { + + for ( i = 1; i <= radialSegments; i ++ ) { + + // indices + + var a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 ); + var b = ( radialSegments + 1 ) * j + ( i - 1 ); + var c = ( radialSegments + 1 ) * j + i; + var d = ( radialSegments + 1 ) * ( j - 1 ) + i; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + // this function calculates the current position on the torus curve + + function calculatePositionOnCurve( u, p, q, radius, position ) { + + var cu = Math.cos( u ); + var su = Math.sin( u ); + var quOverP = q / p * u; + var cs = Math.cos( quOverP ); + + position.x = radius * ( 2 + cs ) * 0.5 * cu; + position.y = radius * ( 2 + cs ) * su * 0.5; + position.z = radius * Math.sin( quOverP ) * 0.5; + + } + + } + + TorusKnotBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + TorusKnotBufferGeometry.prototype.constructor = TorusKnotBufferGeometry; + + /** + * @author oosmoxiecode + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + + // TorusGeometry + + function TorusGeometry( radius, tube, radialSegments, tubularSegments, arc ) { + + Geometry.call( this ); + + this.type = 'TorusGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + radialSegments: radialSegments, + tubularSegments: tubularSegments, + arc: arc + }; + + this.fromBufferGeometry( new TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) ); + this.mergeVertices(); + + } + + TorusGeometry.prototype = Object.create( Geometry.prototype ); + TorusGeometry.prototype.constructor = TorusGeometry; + + // TorusBufferGeometry + + function TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) { + + BufferGeometry.call( this ); + + this.type = 'TorusBufferGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + radialSegments: radialSegments, + tubularSegments: tubularSegments, + arc: arc + }; + + radius = radius || 100; + tube = tube || 40; + radialSegments = Math.floor( radialSegments ) || 8; + tubularSegments = Math.floor( tubularSegments ) || 6; + arc = arc || Math.PI * 2; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var center = new Vector3(); + var vertex = new Vector3(); + var normal = new Vector3(); + + var j, i; + + // generate vertices, normals and uvs + + for ( j = 0; j <= radialSegments; j ++ ) { + + for ( i = 0; i <= tubularSegments; i ++ ) { + + var u = i / tubularSegments * arc; + var v = j / radialSegments * Math.PI * 2; + + // vertex + + vertex.x = ( radius + tube * Math.cos( v ) ) * Math.cos( u ); + vertex.y = ( radius + tube * Math.cos( v ) ) * Math.sin( u ); + vertex.z = tube * Math.sin( v ); + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + center.x = radius * Math.cos( u ); + center.y = radius * Math.sin( u ); + normal.subVectors( vertex, center ).normalize(); + + normals.push( normal.x, normal.y, normal.z ); + + // uv + + uvs.push( i / tubularSegments ); + uvs.push( j / radialSegments ); + + } + + } + + // generate indices + + for ( j = 1; j <= radialSegments; j ++ ) { + + for ( i = 1; i <= tubularSegments; i ++ ) { + + // indices + + var a = ( tubularSegments + 1 ) * j + i - 1; + var b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1; + var c = ( tubularSegments + 1 ) * ( j - 1 ) + i; + var d = ( tubularSegments + 1 ) * j + i; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + TorusBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + TorusBufferGeometry.prototype.constructor = TorusBufferGeometry; + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + */ + + var ShapeUtils = { + + // calculate area of the contour polygon + + area: function ( contour ) { + + var n = contour.length; + var a = 0.0; + + for ( var p = n - 1, q = 0; q < n; p = q ++ ) { + + a += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y; + + } + + return a * 0.5; + + }, + + triangulate: ( function () { + + /** + * This code is a quick port of code written in C++ which was submitted to + * flipcode.com by John W. Ratcliff // July 22, 2000 + * See original code and more information here: + * http://www.flipcode.com/archives/Efficient_Polygon_Triangulation.shtml + * + * ported to actionscript by Zevan Rosser + * www.actionsnippet.com + * + * ported to javascript by Joshua Koo + * http://www.lab4games.net/zz85/blog + * + */ + + function snip( contour, u, v, w, n, verts ) { + + var p; + var ax, ay, bx, by; + var cx, cy, px, py; + + ax = contour[ verts[ u ] ].x; + ay = contour[ verts[ u ] ].y; + + bx = contour[ verts[ v ] ].x; + by = contour[ verts[ v ] ].y; + + cx = contour[ verts[ w ] ].x; + cy = contour[ verts[ w ] ].y; + + if ( ( bx - ax ) * ( cy - ay ) - ( by - ay ) * ( cx - ax ) <= 0 ) return false; + + var aX, aY, bX, bY, cX, cY; + var apx, apy, bpx, bpy, cpx, cpy; + var cCROSSap, bCROSScp, aCROSSbp; + + aX = cx - bx; aY = cy - by; + bX = ax - cx; bY = ay - cy; + cX = bx - ax; cY = by - ay; + + for ( p = 0; p < n; p ++ ) { + + px = contour[ verts[ p ] ].x; + py = contour[ verts[ p ] ].y; + + if ( ( ( px === ax ) && ( py === ay ) ) || + ( ( px === bx ) && ( py === by ) ) || + ( ( px === cx ) && ( py === cy ) ) ) continue; + + apx = px - ax; apy = py - ay; + bpx = px - bx; bpy = py - by; + cpx = px - cx; cpy = py - cy; + + // see if p is inside triangle abc + + aCROSSbp = aX * bpy - aY * bpx; + cCROSSap = cX * apy - cY * apx; + bCROSScp = bX * cpy - bY * cpx; + + if ( ( aCROSSbp >= - Number.EPSILON ) && ( bCROSScp >= - Number.EPSILON ) && ( cCROSSap >= - Number.EPSILON ) ) return false; + + } + + return true; + + } + + // takes in an contour array and returns + + return function triangulate( contour, indices ) { + + var n = contour.length; + + if ( n < 3 ) return null; + + var result = [], + verts = [], + vertIndices = []; + + /* we want a counter-clockwise polygon in verts */ + + var u, v, w; + + if ( ShapeUtils.area( contour ) > 0.0 ) { + + for ( v = 0; v < n; v ++ ) verts[ v ] = v; + + } else { + + for ( v = 0; v < n; v ++ ) verts[ v ] = ( n - 1 ) - v; + + } + + var nv = n; + + /* remove nv - 2 vertices, creating 1 triangle every time */ + + var count = 2 * nv; /* error detection */ + + for ( v = nv - 1; nv > 2; ) { + + /* if we loop, it is probably a non-simple polygon */ + + if ( ( count -- ) <= 0 ) { + + //** Triangulate: ERROR - probable bad polygon! + + //throw ( "Warning, unable to triangulate polygon!" ); + //return null; + // Sometimes warning is fine, especially polygons are triangulated in reverse. + console.warn( 'THREE.ShapeUtils: Unable to triangulate polygon! in triangulate()' ); + + if ( indices ) return vertIndices; + return result; + + } + + /* three consecutive vertices in current polygon, <u,v,w> */ + + u = v; if ( nv <= u ) u = 0; /* previous */ + v = u + 1; if ( nv <= v ) v = 0; /* new v */ + w = v + 1; if ( nv <= w ) w = 0; /* next */ + + if ( snip( contour, u, v, w, nv, verts ) ) { + + var a, b, c, s, t; + + /* true names of the vertices */ + + a = verts[ u ]; + b = verts[ v ]; + c = verts[ w ]; + + /* output Triangle */ + + result.push( [ contour[ a ], + contour[ b ], + contour[ c ] ] ); + + + vertIndices.push( [ verts[ u ], verts[ v ], verts[ w ] ] ); + + /* remove v from the remaining polygon */ + + for ( s = v, t = v + 1; t < nv; s ++, t ++ ) { + + verts[ s ] = verts[ t ]; + + } + + nv --; + + /* reset error detection counter */ + + count = 2 * nv; + + } + + } + + if ( indices ) return vertIndices; + return result; + + } + + } )(), + + triangulateShape: function ( contour, holes ) { + + function removeDupEndPts(points) { + + var l = points.length; + + if ( l > 2 && points[ l - 1 ].equals( points[ 0 ] ) ) { + + points.pop(); + + } + + } + + removeDupEndPts( contour ); + holes.forEach( removeDupEndPts ); + + function point_in_segment_2D_colin( inSegPt1, inSegPt2, inOtherPt ) { + + // inOtherPt needs to be collinear to the inSegment + if ( inSegPt1.x !== inSegPt2.x ) { + + if ( inSegPt1.x < inSegPt2.x ) { + + return ( ( inSegPt1.x <= inOtherPt.x ) && ( inOtherPt.x <= inSegPt2.x ) ); + + } else { + + return ( ( inSegPt2.x <= inOtherPt.x ) && ( inOtherPt.x <= inSegPt1.x ) ); + + } + + } else { + + if ( inSegPt1.y < inSegPt2.y ) { + + return ( ( inSegPt1.y <= inOtherPt.y ) && ( inOtherPt.y <= inSegPt2.y ) ); + + } else { + + return ( ( inSegPt2.y <= inOtherPt.y ) && ( inOtherPt.y <= inSegPt1.y ) ); + + } + + } + + } + + function intersect_segments_2D( inSeg1Pt1, inSeg1Pt2, inSeg2Pt1, inSeg2Pt2, inExcludeAdjacentSegs ) { + + var seg1dx = inSeg1Pt2.x - inSeg1Pt1.x, seg1dy = inSeg1Pt2.y - inSeg1Pt1.y; + var seg2dx = inSeg2Pt2.x - inSeg2Pt1.x, seg2dy = inSeg2Pt2.y - inSeg2Pt1.y; + + var seg1seg2dx = inSeg1Pt1.x - inSeg2Pt1.x; + var seg1seg2dy = inSeg1Pt1.y - inSeg2Pt1.y; + + var limit = seg1dy * seg2dx - seg1dx * seg2dy; + var perpSeg1 = seg1dy * seg1seg2dx - seg1dx * seg1seg2dy; + + if ( Math.abs( limit ) > Number.EPSILON ) { + + // not parallel + + var perpSeg2; + if ( limit > 0 ) { + + if ( ( perpSeg1 < 0 ) || ( perpSeg1 > limit ) ) return []; + perpSeg2 = seg2dy * seg1seg2dx - seg2dx * seg1seg2dy; + if ( ( perpSeg2 < 0 ) || ( perpSeg2 > limit ) ) return []; + + } else { + + if ( ( perpSeg1 > 0 ) || ( perpSeg1 < limit ) ) return []; + perpSeg2 = seg2dy * seg1seg2dx - seg2dx * seg1seg2dy; + if ( ( perpSeg2 > 0 ) || ( perpSeg2 < limit ) ) return []; + + } + + // i.e. to reduce rounding errors + // intersection at endpoint of segment#1? + if ( perpSeg2 === 0 ) { + + if ( ( inExcludeAdjacentSegs ) && + ( ( perpSeg1 === 0 ) || ( perpSeg1 === limit ) ) ) return []; + return [ inSeg1Pt1 ]; + + } + if ( perpSeg2 === limit ) { + + if ( ( inExcludeAdjacentSegs ) && + ( ( perpSeg1 === 0 ) || ( perpSeg1 === limit ) ) ) return []; + return [ inSeg1Pt2 ]; + + } + // intersection at endpoint of segment#2? + if ( perpSeg1 === 0 ) return [ inSeg2Pt1 ]; + if ( perpSeg1 === limit ) return [ inSeg2Pt2 ]; + + // return real intersection point + var factorSeg1 = perpSeg2 / limit; + return [ { x: inSeg1Pt1.x + factorSeg1 * seg1dx, + y: inSeg1Pt1.y + factorSeg1 * seg1dy } ]; + + } else { + + // parallel or collinear + if ( ( perpSeg1 !== 0 ) || + ( seg2dy * seg1seg2dx !== seg2dx * seg1seg2dy ) ) return []; + + // they are collinear or degenerate + var seg1Pt = ( ( seg1dx === 0 ) && ( seg1dy === 0 ) ); // segment1 is just a point? + var seg2Pt = ( ( seg2dx === 0 ) && ( seg2dy === 0 ) ); // segment2 is just a point? + // both segments are points + if ( seg1Pt && seg2Pt ) { + + if ( ( inSeg1Pt1.x !== inSeg2Pt1.x ) || + ( inSeg1Pt1.y !== inSeg2Pt1.y ) ) return []; // they are distinct points + return [ inSeg1Pt1 ]; // they are the same point + + } + // segment#1 is a single point + if ( seg1Pt ) { + + if ( ! point_in_segment_2D_colin( inSeg2Pt1, inSeg2Pt2, inSeg1Pt1 ) ) return []; // but not in segment#2 + return [ inSeg1Pt1 ]; + + } + // segment#2 is a single point + if ( seg2Pt ) { + + if ( ! point_in_segment_2D_colin( inSeg1Pt1, inSeg1Pt2, inSeg2Pt1 ) ) return []; // but not in segment#1 + return [ inSeg2Pt1 ]; + + } + + // they are collinear segments, which might overlap + var seg1min, seg1max, seg1minVal, seg1maxVal; + var seg2min, seg2max, seg2minVal, seg2maxVal; + if ( seg1dx !== 0 ) { + + // the segments are NOT on a vertical line + if ( inSeg1Pt1.x < inSeg1Pt2.x ) { + + seg1min = inSeg1Pt1; seg1minVal = inSeg1Pt1.x; + seg1max = inSeg1Pt2; seg1maxVal = inSeg1Pt2.x; + + } else { + + seg1min = inSeg1Pt2; seg1minVal = inSeg1Pt2.x; + seg1max = inSeg1Pt1; seg1maxVal = inSeg1Pt1.x; + + } + if ( inSeg2Pt1.x < inSeg2Pt2.x ) { + + seg2min = inSeg2Pt1; seg2minVal = inSeg2Pt1.x; + seg2max = inSeg2Pt2; seg2maxVal = inSeg2Pt2.x; + + } else { + + seg2min = inSeg2Pt2; seg2minVal = inSeg2Pt2.x; + seg2max = inSeg2Pt1; seg2maxVal = inSeg2Pt1.x; + + } + + } else { + + // the segments are on a vertical line + if ( inSeg1Pt1.y < inSeg1Pt2.y ) { + + seg1min = inSeg1Pt1; seg1minVal = inSeg1Pt1.y; + seg1max = inSeg1Pt2; seg1maxVal = inSeg1Pt2.y; + + } else { + + seg1min = inSeg1Pt2; seg1minVal = inSeg1Pt2.y; + seg1max = inSeg1Pt1; seg1maxVal = inSeg1Pt1.y; + + } + if ( inSeg2Pt1.y < inSeg2Pt2.y ) { + + seg2min = inSeg2Pt1; seg2minVal = inSeg2Pt1.y; + seg2max = inSeg2Pt2; seg2maxVal = inSeg2Pt2.y; + + } else { + + seg2min = inSeg2Pt2; seg2minVal = inSeg2Pt2.y; + seg2max = inSeg2Pt1; seg2maxVal = inSeg2Pt1.y; + + } + + } + if ( seg1minVal <= seg2minVal ) { + + if ( seg1maxVal < seg2minVal ) return []; + if ( seg1maxVal === seg2minVal ) { + + if ( inExcludeAdjacentSegs ) return []; + return [ seg2min ]; + + } + if ( seg1maxVal <= seg2maxVal ) return [ seg2min, seg1max ]; + return [ seg2min, seg2max ]; + + } else { + + if ( seg1minVal > seg2maxVal ) return []; + if ( seg1minVal === seg2maxVal ) { + + if ( inExcludeAdjacentSegs ) return []; + return [ seg1min ]; + + } + if ( seg1maxVal <= seg2maxVal ) return [ seg1min, seg1max ]; + return [ seg1min, seg2max ]; + + } + + } + + } + + function isPointInsideAngle( inVertex, inLegFromPt, inLegToPt, inOtherPt ) { + + // The order of legs is important + + // translation of all points, so that Vertex is at (0,0) + var legFromPtX = inLegFromPt.x - inVertex.x, legFromPtY = inLegFromPt.y - inVertex.y; + var legToPtX = inLegToPt.x - inVertex.x, legToPtY = inLegToPt.y - inVertex.y; + var otherPtX = inOtherPt.x - inVertex.x, otherPtY = inOtherPt.y - inVertex.y; + + // main angle >0: < 180 deg.; 0: 180 deg.; <0: > 180 deg. + var from2toAngle = legFromPtX * legToPtY - legFromPtY * legToPtX; + var from2otherAngle = legFromPtX * otherPtY - legFromPtY * otherPtX; + + if ( Math.abs( from2toAngle ) > Number.EPSILON ) { + + // angle != 180 deg. + + var other2toAngle = otherPtX * legToPtY - otherPtY * legToPtX; + // console.log( "from2to: " + from2toAngle + ", from2other: " + from2otherAngle + ", other2to: " + other2toAngle ); + + if ( from2toAngle > 0 ) { + + // main angle < 180 deg. + return ( ( from2otherAngle >= 0 ) && ( other2toAngle >= 0 ) ); + + } else { + + // main angle > 180 deg. + return ( ( from2otherAngle >= 0 ) || ( other2toAngle >= 0 ) ); + + } + + } else { + + // angle == 180 deg. + // console.log( "from2to: 180 deg., from2other: " + from2otherAngle ); + return ( from2otherAngle > 0 ); + + } + + } + + + function removeHoles( contour, holes ) { + + var shape = contour.concat(); // work on this shape + var hole; + + function isCutLineInsideAngles( inShapeIdx, inHoleIdx ) { + + // Check if hole point lies within angle around shape point + var lastShapeIdx = shape.length - 1; + + var prevShapeIdx = inShapeIdx - 1; + if ( prevShapeIdx < 0 ) prevShapeIdx = lastShapeIdx; + + var nextShapeIdx = inShapeIdx + 1; + if ( nextShapeIdx > lastShapeIdx ) nextShapeIdx = 0; + + var insideAngle = isPointInsideAngle( shape[ inShapeIdx ], shape[ prevShapeIdx ], shape[ nextShapeIdx ], hole[ inHoleIdx ] ); + if ( ! insideAngle ) { + + // console.log( "Vertex (Shape): " + inShapeIdx + ", Point: " + hole[inHoleIdx].x + "/" + hole[inHoleIdx].y ); + return false; + + } + + // Check if shape point lies within angle around hole point + var lastHoleIdx = hole.length - 1; + + var prevHoleIdx = inHoleIdx - 1; + if ( prevHoleIdx < 0 ) prevHoleIdx = lastHoleIdx; + + var nextHoleIdx = inHoleIdx + 1; + if ( nextHoleIdx > lastHoleIdx ) nextHoleIdx = 0; + + insideAngle = isPointInsideAngle( hole[ inHoleIdx ], hole[ prevHoleIdx ], hole[ nextHoleIdx ], shape[ inShapeIdx ] ); + if ( ! insideAngle ) { + + // console.log( "Vertex (Hole): " + inHoleIdx + ", Point: " + shape[inShapeIdx].x + "/" + shape[inShapeIdx].y ); + return false; + + } + + return true; + + } + + function intersectsShapeEdge( inShapePt, inHolePt ) { + + // checks for intersections with shape edges + var sIdx, nextIdx, intersection; + for ( sIdx = 0; sIdx < shape.length; sIdx ++ ) { + + nextIdx = sIdx + 1; nextIdx %= shape.length; + intersection = intersect_segments_2D( inShapePt, inHolePt, shape[ sIdx ], shape[ nextIdx ], true ); + if ( intersection.length > 0 ) return true; + + } + + return false; + + } + + var indepHoles = []; + + function intersectsHoleEdge( inShapePt, inHolePt ) { + + // checks for intersections with hole edges + var ihIdx, chkHole, + hIdx, nextIdx, intersection; + for ( ihIdx = 0; ihIdx < indepHoles.length; ihIdx ++ ) { + + chkHole = holes[ indepHoles[ ihIdx ]]; + for ( hIdx = 0; hIdx < chkHole.length; hIdx ++ ) { + + nextIdx = hIdx + 1; nextIdx %= chkHole.length; + intersection = intersect_segments_2D( inShapePt, inHolePt, chkHole[ hIdx ], chkHole[ nextIdx ], true ); + if ( intersection.length > 0 ) return true; + + } + + } + return false; + + } + + var holeIndex, shapeIndex, + shapePt, holePt, + holeIdx, cutKey, failedCuts = [], + tmpShape1, tmpShape2, + tmpHole1, tmpHole2; + + for ( var h = 0, hl = holes.length; h < hl; h ++ ) { + + indepHoles.push( h ); + + } + + var minShapeIndex = 0; + var counter = indepHoles.length * 2; + while ( indepHoles.length > 0 ) { + + counter --; + if ( counter < 0 ) { + + console.log( "Infinite Loop! Holes left:" + indepHoles.length + ", Probably Hole outside Shape!" ); + break; + + } + + // search for shape-vertex and hole-vertex, + // which can be connected without intersections + for ( shapeIndex = minShapeIndex; shapeIndex < shape.length; shapeIndex ++ ) { + + shapePt = shape[ shapeIndex ]; + holeIndex = - 1; + + // search for hole which can be reached without intersections + for ( var h = 0; h < indepHoles.length; h ++ ) { + + holeIdx = indepHoles[ h ]; + + // prevent multiple checks + cutKey = shapePt.x + ":" + shapePt.y + ":" + holeIdx; + if ( failedCuts[ cutKey ] !== undefined ) continue; + + hole = holes[ holeIdx ]; + for ( var h2 = 0; h2 < hole.length; h2 ++ ) { + + holePt = hole[ h2 ]; + if ( ! isCutLineInsideAngles( shapeIndex, h2 ) ) continue; + if ( intersectsShapeEdge( shapePt, holePt ) ) continue; + if ( intersectsHoleEdge( shapePt, holePt ) ) continue; + + holeIndex = h2; + indepHoles.splice( h, 1 ); + + tmpShape1 = shape.slice( 0, shapeIndex + 1 ); + tmpShape2 = shape.slice( shapeIndex ); + tmpHole1 = hole.slice( holeIndex ); + tmpHole2 = hole.slice( 0, holeIndex + 1 ); + + shape = tmpShape1.concat( tmpHole1 ).concat( tmpHole2 ).concat( tmpShape2 ); + + minShapeIndex = shapeIndex; + + // Debug only, to show the selected cuts + // glob_CutLines.push( [ shapePt, holePt ] ); + + break; + + } + if ( holeIndex >= 0 ) break; // hole-vertex found + + failedCuts[ cutKey ] = true; // remember failure + + } + if ( holeIndex >= 0 ) break; // hole-vertex found + + } + + } + + return shape; /* shape with no holes */ + + } + + + var i, il, f, face, + key, index, + allPointsMap = {}; + + // To maintain reference to old shape, one must match coordinates, or offset the indices from original arrays. It's probably easier to do the first. + + var allpoints = contour.concat(); + + for ( var h = 0, hl = holes.length; h < hl; h ++ ) { + + Array.prototype.push.apply( allpoints, holes[ h ] ); + + } + + //console.log( "allpoints",allpoints, allpoints.length ); + + // prepare all points map + + for ( i = 0, il = allpoints.length; i < il; i ++ ) { + + key = allpoints[ i ].x + ":" + allpoints[ i ].y; + + if ( allPointsMap[ key ] !== undefined ) { + + console.warn( "THREE.ShapeUtils: Duplicate point", key, i ); + + } + + allPointsMap[ key ] = i; + + } + + // remove holes by cutting paths to holes and adding them to the shape + var shapeWithoutHoles = removeHoles( contour, holes ); + + var triangles = ShapeUtils.triangulate( shapeWithoutHoles, false ); // True returns indices for points of spooled shape + //console.log( "triangles",triangles, triangles.length ); + + // check all face vertices against all points map + + for ( i = 0, il = triangles.length; i < il; i ++ ) { + + face = triangles[ i ]; + + for ( f = 0; f < 3; f ++ ) { + + key = face[ f ].x + ":" + face[ f ].y; + + index = allPointsMap[ key ]; + + if ( index !== undefined ) { + + face[ f ] = index; + + } + + } + + } + + return triangles.concat(); + + }, + + isClockWise: function ( pts ) { + + return ShapeUtils.area( pts ) < 0; + + } + + }; + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * + * Creates extruded geometry from a path shape. + * + * parameters = { + * + * curveSegments: <int>, // number of points on the curves + * steps: <int>, // number of points for z-side extrusions / used for subdividing segments of extrude spline too + * amount: <int>, // Depth to extrude the shape + * + * bevelEnabled: <bool>, // turn on bevel + * bevelThickness: <float>, // how deep into the original shape bevel goes + * bevelSize: <float>, // how far from shape outline is bevel + * bevelSegments: <int>, // number of bevel layers + * + * extrudePath: <THREE.Curve> // curve to extrude shape along + * frames: <Object> // containing arrays of tangents, normals, binormals + * + * UVGenerator: <Object> // object that provides UV generator functions + * + * } + */ + + // ExtrudeGeometry + + function ExtrudeGeometry( shapes, options ) { + + Geometry.call( this ); + + this.type = 'ExtrudeGeometry'; + + this.parameters = { + shapes: shapes, + options: options + }; + + this.fromBufferGeometry( new ExtrudeBufferGeometry( shapes, options ) ); + this.mergeVertices(); + + } + + ExtrudeGeometry.prototype = Object.create( Geometry.prototype ); + ExtrudeGeometry.prototype.constructor = ExtrudeGeometry; + + // ExtrudeBufferGeometry + + function ExtrudeBufferGeometry( shapes, options ) { + + if ( typeof ( shapes ) === "undefined" ) { + + shapes = []; + return; + + } + + BufferGeometry.call( this ); + + this.type = 'ExtrudeBufferGeometry'; + + shapes = Array.isArray( shapes ) ? shapes : [ shapes ]; + + this.addShapeList( shapes, options ); + + this.computeVertexNormals(); + + // can't really use automatic vertex normals + // as then front and back sides get smoothed too + // should do separate smoothing just for sides + + //this.computeVertexNormals(); + + //console.log( "took", ( Date.now() - startTime ) ); + + } + + ExtrudeBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + ExtrudeBufferGeometry.prototype.constructor = ExtrudeBufferGeometry; + + ExtrudeBufferGeometry.prototype.getArrays = function () { + + var positionAttribute = this.getAttribute( "position" ); + var verticesArray = positionAttribute ? Array.prototype.slice.call( positionAttribute.array ) : []; + + var uvAttribute = this.getAttribute( "uv" ); + var uvArray = uvAttribute ? Array.prototype.slice.call( uvAttribute.array ) : []; + + var IndexAttribute = this.index; + var indicesArray = IndexAttribute ? Array.prototype.slice.call( IndexAttribute.array ) : []; + + return { + position: verticesArray, + uv: uvArray, + index: indicesArray + }; + + }; + + ExtrudeBufferGeometry.prototype.addShapeList = function ( shapes, options ) { + + var sl = shapes.length; + options.arrays = this.getArrays(); + + for ( var s = 0; s < sl; s ++ ) { + + var shape = shapes[ s ]; + this.addShape( shape, options ); + + } + + this.setIndex( options.arrays.index ); + this.addAttribute( 'position', new Float32BufferAttribute( options.arrays.position, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( options.arrays.uv, 2 ) ); + + }; + + ExtrudeBufferGeometry.prototype.addShape = function ( shape, options ) { + + var arrays = options.arrays ? options.arrays : this.getArrays(); + var verticesArray = arrays.position; + var indicesArray = arrays.index; + var uvArray = arrays.uv; + + var placeholder = []; + + + var amount = options.amount !== undefined ? options.amount : 100; + + var bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 6; // 10 + var bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 2; // 8 + var bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3; + + var bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true; // false + + var curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12; + + var steps = options.steps !== undefined ? options.steps : 1; + + var extrudePath = options.extrudePath; + var extrudePts, extrudeByPath = false; + + // Use default WorldUVGenerator if no UV generators are specified. + var uvgen = options.UVGenerator !== undefined ? options.UVGenerator : ExtrudeGeometry.WorldUVGenerator; + + var splineTube, binormal, normal, position2; + if ( extrudePath ) { + + extrudePts = extrudePath.getSpacedPoints( steps ); + + extrudeByPath = true; + bevelEnabled = false; // bevels not supported for path extrusion + + // SETUP TNB variables + + // TODO1 - have a .isClosed in spline? + + splineTube = options.frames !== undefined ? options.frames : extrudePath.computeFrenetFrames( steps, false ); + + // console.log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length); + + binormal = new Vector3(); + normal = new Vector3(); + position2 = new Vector3(); + + } + + // Safeguards if bevels are not enabled + + if ( ! bevelEnabled ) { + + bevelSegments = 0; + bevelThickness = 0; + bevelSize = 0; + + } + + // Variables initialization + + var ahole, h, hl; // looping of holes + var scope = this; + + var shapePoints = shape.extractPoints( curveSegments ); + + var vertices = shapePoints.shape; + var holes = shapePoints.holes; + + var reverse = ! ShapeUtils.isClockWise( vertices ); + + if ( reverse ) { + + vertices = vertices.reverse(); + + // Maybe we should also check if holes are in the opposite direction, just to be safe ... + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + + if ( ShapeUtils.isClockWise( ahole ) ) { + + holes[ h ] = ahole.reverse(); + + } + + } + + reverse = false; // If vertices are in order now, we shouldn't need to worry about them again (hopefully)! + + } + + + var faces = ShapeUtils.triangulateShape( vertices, holes ); + + /* Vertices */ + + var contour = vertices; // vertices has all points but contour has only points of circumference + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + + vertices = vertices.concat( ahole ); + + } + + + function scalePt2( pt, vec, size ) { + + if ( ! vec ) console.error( "THREE.ExtrudeGeometry: vec does not exist" ); + + return vec.clone().multiplyScalar( size ).add( pt ); + + } + + var b, bs, t, z, + vert, vlen = vertices.length, + face, flen = faces.length; + + + // Find directions for point movement + + + function getBevelVec( inPt, inPrev, inNext ) { + + // computes for inPt the corresponding point inPt' on a new contour + // shifted by 1 unit (length of normalized vector) to the left + // if we walk along contour clockwise, this new contour is outside the old one + // + // inPt' is the intersection of the two lines parallel to the two + // adjacent edges of inPt at a distance of 1 unit on the left side. + + var v_trans_x, v_trans_y, shrink_by = 1; // resulting translation vector for inPt + + // good reading for geometry algorithms (here: line-line intersection) + // http://geomalgorithms.com/a05-_intersect-1.html + + var v_prev_x = inPt.x - inPrev.x, + v_prev_y = inPt.y - inPrev.y; + var v_next_x = inNext.x - inPt.x, + v_next_y = inNext.y - inPt.y; + + var v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y ); + + // check for collinear edges + var collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x ); + + if ( Math.abs( collinear0 ) > Number.EPSILON ) { + + // not collinear + + // length of vectors for normalizing + + var v_prev_len = Math.sqrt( v_prev_lensq ); + var v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y ); + + // shift adjacent points by unit vectors to the left + + var ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len ); + var ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len ); + + var ptNextShift_x = ( inNext.x - v_next_y / v_next_len ); + var ptNextShift_y = ( inNext.y + v_next_x / v_next_len ); + + // scaling factor for v_prev to intersection point + + var sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y - + ( ptNextShift_y - ptPrevShift_y ) * v_next_x ) / + ( v_prev_x * v_next_y - v_prev_y * v_next_x ); + + // vector from inPt to intersection point + + v_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x ); + v_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y ); + + // Don't normalize!, otherwise sharp corners become ugly + // but prevent crazy spikes + var v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y ); + if ( v_trans_lensq <= 2 ) { + + return new Vector2( v_trans_x, v_trans_y ); + + } else { + + shrink_by = Math.sqrt( v_trans_lensq / 2 ); + + } + + } else { + + // handle special case of collinear edges + + var direction_eq = false; // assumes: opposite + if ( v_prev_x > Number.EPSILON ) { + + if ( v_next_x > Number.EPSILON ) { + + direction_eq = true; + + } + + } else { + + if ( v_prev_x < - Number.EPSILON ) { + + if ( v_next_x < - Number.EPSILON ) { + + direction_eq = true; + + } + + } else { + + if ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) { + + direction_eq = true; + + } + + } + + } + + if ( direction_eq ) { + + // console.log("Warning: lines are a straight sequence"); + v_trans_x = - v_prev_y; + v_trans_y = v_prev_x; + shrink_by = Math.sqrt( v_prev_lensq ); + + } else { + + // console.log("Warning: lines are a straight spike"); + v_trans_x = v_prev_x; + v_trans_y = v_prev_y; + shrink_by = Math.sqrt( v_prev_lensq / 2 ); + + } + + } + + return new Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by ); + + } + + + var contourMovements = []; + + for ( var i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) { + + if ( j === il ) j = 0; + if ( k === il ) k = 0; + + // (j)---(i)---(k) + // console.log('i,j,k', i, j , k) + + contourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] ); + + } + + var holesMovements = [], + oneHoleMovements, verticesMovements = contourMovements.concat(); + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + + oneHoleMovements = []; + + for ( i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) { + + if ( j === il ) j = 0; + if ( k === il ) k = 0; + + // (j)---(i)---(k) + oneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] ); + + } + + holesMovements.push( oneHoleMovements ); + verticesMovements = verticesMovements.concat( oneHoleMovements ); + + } + + + // Loop bevelSegments, 1 for the front, 1 for the back + + for ( b = 0; b < bevelSegments; b ++ ) { + + //for ( b = bevelSegments; b > 0; b -- ) { + + t = b / bevelSegments; + z = bevelThickness * Math.cos( t * Math.PI / 2 ); + bs = bevelSize * Math.sin( t * Math.PI / 2 ); + + // contract shape + + for ( i = 0, il = contour.length; i < il; i ++ ) { + + vert = scalePt2( contour[ i ], contourMovements[ i ], bs ); + + v( vert.x, vert.y, - z ); + + } + + // expand holes + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + oneHoleMovements = holesMovements[ h ]; + + for ( i = 0, il = ahole.length; i < il; i ++ ) { + + vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs ); + + v( vert.x, vert.y, - z ); + + } + + } + + } + + bs = bevelSize; + + // Back facing vertices + + for ( i = 0; i < vlen; i ++ ) { + + vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ]; + + if ( ! extrudeByPath ) { + + v( vert.x, vert.y, 0 ); + + } else { + + // v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x ); + + normal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x ); + binormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y ); + + position2.copy( extrudePts[ 0 ] ).add( normal ).add( binormal ); + + v( position2.x, position2.y, position2.z ); + + } + + } + + // Add stepped vertices... + // Including front facing vertices + + var s; + + for ( s = 1; s <= steps; s ++ ) { + + for ( i = 0; i < vlen; i ++ ) { + + vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ]; + + if ( ! extrudeByPath ) { + + v( vert.x, vert.y, amount / steps * s ); + + } else { + + // v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x ); + + normal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x ); + binormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y ); + + position2.copy( extrudePts[ s ] ).add( normal ).add( binormal ); + + v( position2.x, position2.y, position2.z ); + + } + + } + + } + + + // Add bevel segments planes + + //for ( b = 1; b <= bevelSegments; b ++ ) { + for ( b = bevelSegments - 1; b >= 0; b -- ) { + + t = b / bevelSegments; + z = bevelThickness * Math.cos( t * Math.PI / 2 ); + bs = bevelSize * Math.sin( t * Math.PI / 2 ); + + // contract shape + + for ( i = 0, il = contour.length; i < il; i ++ ) { + + vert = scalePt2( contour[ i ], contourMovements[ i ], bs ); + v( vert.x, vert.y, amount + z ); + + } + + // expand holes + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + oneHoleMovements = holesMovements[ h ]; + + for ( i = 0, il = ahole.length; i < il; i ++ ) { + + vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs ); + + if ( ! extrudeByPath ) { + + v( vert.x, vert.y, amount + z ); + + } else { + + v( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z ); + + } + + } + + } + + } + + /* Faces */ + + // Top and bottom faces + + buildLidFaces(); + + // Sides faces + + buildSideFaces(); + + + ///// Internal functions + + function buildLidFaces() { + + var start = verticesArray.length/3; + + if ( bevelEnabled ) { + + var layer = 0; // steps + 1 + var offset = vlen * layer; + + // Bottom faces + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + f3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset ); + + } + + layer = steps + bevelSegments * 2; + offset = vlen * layer; + + // Top faces + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + f3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset ); + + } + + } else { + + // Bottom faces + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + f3( face[ 2 ], face[ 1 ], face[ 0 ] ); + + } + + // Top faces + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + f3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps ); + + } + + } + + scope.addGroup( start, verticesArray.length/3 -start, options.material !== undefined ? options.material : 0); + + } + + // Create faces for the z-sides of the shape + + function buildSideFaces() { + + var start = verticesArray.length/3; + var layeroffset = 0; + sidewalls( contour, layeroffset ); + layeroffset += contour.length; + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + sidewalls( ahole, layeroffset ); + + //, true + layeroffset += ahole.length; + + } + + + scope.addGroup( start, verticesArray.length/3 -start, options.extrudeMaterial !== undefined ? options.extrudeMaterial : 1); + + + } + + function sidewalls( contour, layeroffset ) { + + var j, k; + i = contour.length; + + while ( -- i >= 0 ) { + + j = i; + k = i - 1; + if ( k < 0 ) k = contour.length - 1; + + //console.log('b', i,j, i-1, k,vertices.length); + + var s = 0, + sl = steps + bevelSegments * 2; + + for ( s = 0; s < sl; s ++ ) { + + var slen1 = vlen * s; + var slen2 = vlen * ( s + 1 ); + + var a = layeroffset + j + slen1, + b = layeroffset + k + slen1, + c = layeroffset + k + slen2, + d = layeroffset + j + slen2; + + f4( a, b, c, d, contour, s, sl, j, k ); + + } + + } + + } + + function v( x, y, z ) { + + placeholder.push( x ); + placeholder.push( y ); + placeholder.push( z ); + + } + + + function f3( a, b, c ) { + + addVertex( a ); + addVertex( b ); + addVertex( c ); + + var nextIndex = verticesArray.length / 3; + var uvs = uvgen.generateTopUV( scope, verticesArray, nextIndex - 3, nextIndex - 2, nextIndex - 1 ); + + addUV( uvs[ 0 ] ); + addUV( uvs[ 1 ] ); + addUV( uvs[ 2 ] ); + + } + + function f4( a, b, c, d, wallContour, stepIndex, stepsLength, contourIndex1, contourIndex2 ) { + + addVertex( a ); + addVertex( b ); + addVertex( d ); + + addVertex( b ); + addVertex( c ); + addVertex( d ); + + + var nextIndex = verticesArray.length / 3; + var uvs = uvgen.generateSideWallUV( scope, verticesArray, nextIndex - 6, nextIndex - 3, nextIndex - 2, nextIndex - 1 ); + + addUV( uvs[ 0 ] ); + addUV( uvs[ 1 ] ); + addUV( uvs[ 3 ] ); + + addUV( uvs[ 1 ] ); + addUV( uvs[ 2 ] ); + addUV( uvs[ 3 ] ); + + } + + function addVertex( index ) { + + indicesArray.push( verticesArray.length / 3 ); + verticesArray.push( placeholder[ index * 3 + 0 ] ); + verticesArray.push( placeholder[ index * 3 + 1 ] ); + verticesArray.push( placeholder[ index * 3 + 2 ] ); + + } + + + function addUV( vector2 ) { + + uvArray.push( vector2.x ); + uvArray.push( vector2.y ); + + } + + if ( ! options.arrays ) { + + this.setIndex( indicesArray ); + this.addAttribute( 'position', new Float32BufferAttribute( verticesArray, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( options.arrays.uv, 2 ) ); + + } + + }; + + ExtrudeGeometry.WorldUVGenerator = { + + generateTopUV: function ( geometry, vertices, indexA, indexB, indexC ) { + + var a_x = vertices[ indexA * 3 ]; + var a_y = vertices[ indexA * 3 + 1 ]; + var b_x = vertices[ indexB * 3 ]; + var b_y = vertices[ indexB * 3 + 1 ]; + var c_x = vertices[ indexC * 3 ]; + var c_y = vertices[ indexC * 3 + 1 ]; + + return [ + new Vector2( a_x, a_y ), + new Vector2( b_x, b_y ), + new Vector2( c_x, c_y ) + ]; + + }, + + generateSideWallUV: function ( geometry, vertices, indexA, indexB, indexC, indexD ) { + + var a_x = vertices[ indexA * 3 ]; + var a_y = vertices[ indexA * 3 + 1 ]; + var a_z = vertices[ indexA * 3 + 2 ]; + var b_x = vertices[ indexB * 3 ]; + var b_y = vertices[ indexB * 3 + 1 ]; + var b_z = vertices[ indexB * 3 + 2 ]; + var c_x = vertices[ indexC * 3 ]; + var c_y = vertices[ indexC * 3 + 1 ]; + var c_z = vertices[ indexC * 3 + 2 ]; + var d_x = vertices[ indexD * 3 ]; + var d_y = vertices[ indexD * 3 + 1 ]; + var d_z = vertices[ indexD * 3 + 2 ]; + + if ( Math.abs( a_y - b_y ) < 0.01 ) { + + return [ + new Vector2( a_x, 1 - a_z ), + new Vector2( b_x, 1 - b_z ), + new Vector2( c_x, 1 - c_z ), + new Vector2( d_x, 1 - d_z ) + ]; + + } else { + + return [ + new Vector2( a_y, 1 - a_z ), + new Vector2( b_y, 1 - b_z ), + new Vector2( c_y, 1 - c_z ), + new Vector2( d_y, 1 - d_z ) + ]; + + } + + } + }; + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * @author alteredq / http://alteredqualia.com/ + * + * Text = 3D Text + * + * parameters = { + * font: <THREE.Font>, // font + * + * size: <float>, // size of the text + * height: <float>, // thickness to extrude text + * curveSegments: <int>, // number of points on the curves + * + * bevelEnabled: <bool>, // turn on bevel + * bevelThickness: <float>, // how deep into text bevel goes + * bevelSize: <float> // how far from text outline is bevel + * } + */ + + // TextGeometry + + function TextGeometry( text, parameters ) { + + Geometry.call( this ); + + this.type = 'TextGeometry'; + + this.parameters = { + text: text, + parameters: parameters + }; + + this.fromBufferGeometry( new TextBufferGeometry( text, parameters ) ); + this.mergeVertices(); + + } + + TextGeometry.prototype = Object.create( Geometry.prototype ); + TextGeometry.prototype.constructor = TextGeometry; + + // TextBufferGeometry + + function TextBufferGeometry( text, parameters ) { + + parameters = parameters || {}; + + var font = parameters.font; + + if ( ( font && font.isFont ) === false ) { + + console.error( 'THREE.TextGeometry: font parameter is not an instance of THREE.Font.' ); + return new Geometry(); + + } + + var shapes = font.generateShapes( text, parameters.size, parameters.curveSegments ); + + // translate parameters to ExtrudeGeometry API + + parameters.amount = parameters.height !== undefined ? parameters.height : 50; + + // defaults + + if ( parameters.bevelThickness === undefined ) parameters.bevelThickness = 10; + if ( parameters.bevelSize === undefined ) parameters.bevelSize = 8; + if ( parameters.bevelEnabled === undefined ) parameters.bevelEnabled = false; + + ExtrudeBufferGeometry.call( this, shapes, parameters ); + + this.type = 'TextBufferGeometry'; + + } + + TextBufferGeometry.prototype = Object.create( ExtrudeBufferGeometry.prototype ); + TextBufferGeometry.prototype.constructor = TextBufferGeometry; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author benaadams / https://twitter.com/ben_a_adams + * @author Mugen87 / https://github.com/Mugen87 + */ + + // SphereGeometry + + function SphereGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) { + + Geometry.call( this ); + + this.type = 'SphereGeometry'; + + this.parameters = { + radius: radius, + widthSegments: widthSegments, + heightSegments: heightSegments, + phiStart: phiStart, + phiLength: phiLength, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + this.fromBufferGeometry( new SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) ); + this.mergeVertices(); + + } + + SphereGeometry.prototype = Object.create( Geometry.prototype ); + SphereGeometry.prototype.constructor = SphereGeometry; + + // SphereBufferGeometry + + function SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) { + + BufferGeometry.call( this ); + + this.type = 'SphereBufferGeometry'; + + this.parameters = { + radius: radius, + widthSegments: widthSegments, + heightSegments: heightSegments, + phiStart: phiStart, + phiLength: phiLength, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + radius = radius || 50; + + widthSegments = Math.max( 3, Math.floor( widthSegments ) || 8 ); + heightSegments = Math.max( 2, Math.floor( heightSegments ) || 6 ); + + phiStart = phiStart !== undefined ? phiStart : 0; + phiLength = phiLength !== undefined ? phiLength : Math.PI * 2; + + thetaStart = thetaStart !== undefined ? thetaStart : 0; + thetaLength = thetaLength !== undefined ? thetaLength : Math.PI; + + var thetaEnd = thetaStart + thetaLength; + + var ix, iy; + + var index = 0; + var grid = []; + + var vertex = new Vector3(); + var normal = new Vector3(); + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // generate vertices, normals and uvs + + for ( iy = 0; iy <= heightSegments; iy ++ ) { + + var verticesRow = []; + + var v = iy / heightSegments; + + for ( ix = 0; ix <= widthSegments; ix ++ ) { + + var u = ix / widthSegments; + + // vertex + + vertex.x = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength ); + vertex.y = radius * Math.cos( thetaStart + v * thetaLength ); + vertex.z = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength ); + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + normal.set( vertex.x, vertex.y, vertex.z ).normalize(); + normals.push( normal.x, normal.y, normal.z ); + + // uv + + uvs.push( u, 1 - v ); + + verticesRow.push( index ++ ); + + } + + grid.push( verticesRow ); + + } + + // indices + + for ( iy = 0; iy < heightSegments; iy ++ ) { + + for ( ix = 0; ix < widthSegments; ix ++ ) { + + var a = grid[ iy ][ ix + 1 ]; + var b = grid[ iy ][ ix ]; + var c = grid[ iy + 1 ][ ix ]; + var d = grid[ iy + 1 ][ ix + 1 ]; + + if ( iy !== 0 || thetaStart > 0 ) indices.push( a, b, d ); + if ( iy !== heightSegments - 1 || thetaEnd < Math.PI ) indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + SphereBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + SphereBufferGeometry.prototype.constructor = SphereBufferGeometry; + + /** + * @author Kaleb Murphy + * @author Mugen87 / https://github.com/Mugen87 + */ + + // RingGeometry + + function RingGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) { + + Geometry.call( this ); + + this.type = 'RingGeometry'; + + this.parameters = { + innerRadius: innerRadius, + outerRadius: outerRadius, + thetaSegments: thetaSegments, + phiSegments: phiSegments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + this.fromBufferGeometry( new RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) ); + this.mergeVertices(); + + } + + RingGeometry.prototype = Object.create( Geometry.prototype ); + RingGeometry.prototype.constructor = RingGeometry; + + // RingBufferGeometry + + function RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) { + + BufferGeometry.call( this ); + + this.type = 'RingBufferGeometry'; + + this.parameters = { + innerRadius: innerRadius, + outerRadius: outerRadius, + thetaSegments: thetaSegments, + phiSegments: phiSegments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + innerRadius = innerRadius || 20; + outerRadius = outerRadius || 50; + + thetaStart = thetaStart !== undefined ? thetaStart : 0; + thetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2; + + thetaSegments = thetaSegments !== undefined ? Math.max( 3, thetaSegments ) : 8; + phiSegments = phiSegments !== undefined ? Math.max( 1, phiSegments ) : 1; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // some helper variables + + var segment; + var radius = innerRadius; + var radiusStep = ( ( outerRadius - innerRadius ) / phiSegments ); + var vertex = new Vector3(); + var uv = new Vector2(); + var j, i; + + // generate vertices, normals and uvs + + for ( j = 0; j <= phiSegments; j ++ ) { + + for ( i = 0; i <= thetaSegments; i ++ ) { + + // values are generate from the inside of the ring to the outside + + segment = thetaStart + i / thetaSegments * thetaLength; + + // vertex + + vertex.x = radius * Math.cos( segment ); + vertex.y = radius * Math.sin( segment ); + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + normals.push( 0, 0, 1 ); + + // uv + + uv.x = ( vertex.x / outerRadius + 1 ) / 2; + uv.y = ( vertex.y / outerRadius + 1 ) / 2; + + uvs.push( uv.x, uv.y ); + + } + + // increase the radius for next row of vertices + + radius += radiusStep; + + } + + // indices + + for ( j = 0; j < phiSegments; j ++ ) { + + var thetaSegmentLevel = j * ( thetaSegments + 1 ); + + for ( i = 0; i < thetaSegments; i ++ ) { + + segment = i + thetaSegmentLevel; + + var a = segment; + var b = segment + thetaSegments + 1; + var c = segment + thetaSegments + 2; + var d = segment + 1; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + RingBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + RingBufferGeometry.prototype.constructor = RingBufferGeometry; + + /** + * @author astrodud / http://astrodud.isgreat.org/ + * @author zz85 / https://github.com/zz85 + * @author bhouston / http://clara.io + * @author Mugen87 / https://github.com/Mugen87 + */ + + // LatheGeometry + + function LatheGeometry( points, segments, phiStart, phiLength ) { + + Geometry.call( this ); + + this.type = 'LatheGeometry'; + + this.parameters = { + points: points, + segments: segments, + phiStart: phiStart, + phiLength: phiLength + }; + + this.fromBufferGeometry( new LatheBufferGeometry( points, segments, phiStart, phiLength ) ); + this.mergeVertices(); + + } + + LatheGeometry.prototype = Object.create( Geometry.prototype ); + LatheGeometry.prototype.constructor = LatheGeometry; + + // LatheBufferGeometry + + function LatheBufferGeometry( points, segments, phiStart, phiLength ) { + + BufferGeometry.call( this ); + + this.type = 'LatheBufferGeometry'; + + this.parameters = { + points: points, + segments: segments, + phiStart: phiStart, + phiLength: phiLength + }; + + segments = Math.floor( segments ) || 12; + phiStart = phiStart || 0; + phiLength = phiLength || Math.PI * 2; + + // clamp phiLength so it's in range of [ 0, 2PI ] + + phiLength = _Math.clamp( phiLength, 0, Math.PI * 2 ); + + + // buffers + + var indices = []; + var vertices = []; + var uvs = []; + + // helper variables + + var base; + var inverseSegments = 1.0 / segments; + var vertex = new Vector3(); + var uv = new Vector2(); + var i, j; + + // generate vertices and uvs + + for ( i = 0; i <= segments; i ++ ) { + + var phi = phiStart + i * inverseSegments * phiLength; + + var sin = Math.sin( phi ); + var cos = Math.cos( phi ); + + for ( j = 0; j <= ( points.length - 1 ); j ++ ) { + + // vertex + + vertex.x = points[ j ].x * sin; + vertex.y = points[ j ].y; + vertex.z = points[ j ].x * cos; + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // uv + + uv.x = i / segments; + uv.y = j / ( points.length - 1 ); + + uvs.push( uv.x, uv.y ); + + + } + + } + + // indices + + for ( i = 0; i < segments; i ++ ) { + + for ( j = 0; j < ( points.length - 1 ); j ++ ) { + + base = j + i * points.length; + + var a = base; + var b = base + points.length; + var c = base + points.length + 1; + var d = base + 1; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + // generate normals + + this.computeVertexNormals(); + + // if the geometry is closed, we need to average the normals along the seam. + // because the corresponding vertices are identical (but still have different UVs). + + if ( phiLength === Math.PI * 2 ) { + + var normals = this.attributes.normal.array; + var n1 = new Vector3(); + var n2 = new Vector3(); + var n = new Vector3(); + + // this is the buffer offset for the last line of vertices + + base = segments * points.length * 3; + + for ( i = 0, j = 0; i < points.length; i ++, j += 3 ) { + + // select the normal of the vertex in the first line + + n1.x = normals[ j + 0 ]; + n1.y = normals[ j + 1 ]; + n1.z = normals[ j + 2 ]; + + // select the normal of the vertex in the last line + + n2.x = normals[ base + j + 0 ]; + n2.y = normals[ base + j + 1 ]; + n2.z = normals[ base + j + 2 ]; + + // average normals + + n.addVectors( n1, n2 ).normalize(); + + // assign the new values to both normals + + normals[ j + 0 ] = normals[ base + j + 0 ] = n.x; + normals[ j + 1 ] = normals[ base + j + 1 ] = n.y; + normals[ j + 2 ] = normals[ base + j + 2 ] = n.z; + + } + + } + + } + + LatheBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + LatheBufferGeometry.prototype.constructor = LatheBufferGeometry; + + /** + * @author jonobr1 / http://jonobr1.com + * @author Mugen87 / https://github.com/Mugen87 + */ + + // ShapeGeometry + + function ShapeGeometry( shapes, curveSegments ) { + + Geometry.call( this ); + + this.type = 'ShapeGeometry'; + + if ( typeof curveSegments === 'object' ) { + + console.warn( 'THREE.ShapeGeometry: Options parameter has been removed.' ); + + curveSegments = curveSegments.curveSegments; + + } + + this.parameters = { + shapes: shapes, + curveSegments: curveSegments + }; + + this.fromBufferGeometry( new ShapeBufferGeometry( shapes, curveSegments ) ); + this.mergeVertices(); + + } + + ShapeGeometry.prototype = Object.create( Geometry.prototype ); + ShapeGeometry.prototype.constructor = ShapeGeometry; + + // ShapeBufferGeometry + + function ShapeBufferGeometry( shapes, curveSegments ) { + + BufferGeometry.call( this ); + + this.type = 'ShapeBufferGeometry'; + + this.parameters = { + shapes: shapes, + curveSegments: curveSegments + }; + + curveSegments = curveSegments || 12; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var groupStart = 0; + var groupCount = 0; + + // allow single and array values for "shapes" parameter + + if ( Array.isArray( shapes ) === false ) { + + addShape( shapes ); + + } else { + + for ( var i = 0; i < shapes.length; i ++ ) { + + addShape( shapes[ i ] ); + + this.addGroup( groupStart, groupCount, i ); // enables MultiMaterial support + + groupStart += groupCount; + groupCount = 0; + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + + // helper functions + + function addShape( shape ) { + + var i, l, shapeHole; + + var indexOffset = vertices.length / 3; + var points = shape.extractPoints( curveSegments ); + + var shapeVertices = points.shape; + var shapeHoles = points.holes; + + // check direction of vertices + + if ( ShapeUtils.isClockWise( shapeVertices ) === false ) { + + shapeVertices = shapeVertices.reverse(); + + // also check if holes are in the opposite direction + + for ( i = 0, l = shapeHoles.length; i < l; i ++ ) { + + shapeHole = shapeHoles[ i ]; + + if ( ShapeUtils.isClockWise( shapeHole ) === true ) { + + shapeHoles[ i ] = shapeHole.reverse(); + + } + + } + + } + + var faces = ShapeUtils.triangulateShape( shapeVertices, shapeHoles ); + + // join vertices of inner and outer paths to a single array + + for ( i = 0, l = shapeHoles.length; i < l; i ++ ) { + + shapeHole = shapeHoles[ i ]; + shapeVertices = shapeVertices.concat( shapeHole ); + + } + + // vertices, normals, uvs + + for ( i = 0, l = shapeVertices.length; i < l; i ++ ) { + + var vertex = shapeVertices[ i ]; + + vertices.push( vertex.x, vertex.y, 0 ); + normals.push( 0, 0, 1 ); + uvs.push( vertex.x, vertex.y ); // world uvs + + } + + // incides + + for ( i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + var a = face[ 0 ] + indexOffset; + var b = face[ 1 ] + indexOffset; + var c = face[ 2 ] + indexOffset; + + indices.push( a, b, c ); + groupCount += 3; + + } + + } + + } + + ShapeBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + ShapeBufferGeometry.prototype.constructor = ShapeBufferGeometry; + + /** + * @author WestLangley / http://github.com/WestLangley + * @author Mugen87 / https://github.com/Mugen87 + */ + + function EdgesGeometry( geometry, thresholdAngle ) { + + BufferGeometry.call( this ); + + this.type = 'EdgesGeometry'; + + this.parameters = { + thresholdAngle: thresholdAngle + }; + + thresholdAngle = ( thresholdAngle !== undefined ) ? thresholdAngle : 1; + + // buffer + + var vertices = []; + + // helper variables + + var thresholdDot = Math.cos( _Math.DEG2RAD * thresholdAngle ); + var edge = [ 0, 0 ], edges = {}, edge1, edge2; + var key, keys = [ 'a', 'b', 'c' ]; + + // prepare source geometry + + var geometry2; + + if ( geometry.isBufferGeometry ) { + + geometry2 = new Geometry(); + geometry2.fromBufferGeometry( geometry ); + + } else { + + geometry2 = geometry.clone(); + + } + + geometry2.mergeVertices(); + geometry2.computeFaceNormals(); + + var sourceVertices = geometry2.vertices; + var faces = geometry2.faces; + + // now create a data structure where each entry represents an edge with its adjoining faces + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + for ( var j = 0; j < 3; j ++ ) { + + edge1 = face[ keys[ j ] ]; + edge2 = face[ keys[ ( j + 1 ) % 3 ] ]; + edge[ 0 ] = Math.min( edge1, edge2 ); + edge[ 1 ] = Math.max( edge1, edge2 ); + + key = edge[ 0 ] + ',' + edge[ 1 ]; + + if ( edges[ key ] === undefined ) { + + edges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ], face1: i, face2: undefined }; + + } else { + + edges[ key ].face2 = i; + + } + + } + + } + + // generate vertices + + for ( key in edges ) { + + var e = edges[ key ]; + + // an edge is only rendered if the angle (in degrees) between the face normals of the adjoining faces exceeds this value. default = 1 degree. + + if ( e.face2 === undefined || faces[ e.face1 ].normal.dot( faces[ e.face2 ].normal ) <= thresholdDot ) { + + var vertex = sourceVertices[ e.index1 ]; + vertices.push( vertex.x, vertex.y, vertex.z ); + + vertex = sourceVertices[ e.index2 ]; + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + } + + // build geometry + + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + + } + + EdgesGeometry.prototype = Object.create( BufferGeometry.prototype ); + EdgesGeometry.prototype.constructor = EdgesGeometry; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + + // CylinderGeometry + + function CylinderGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { + + Geometry.call( this ); + + this.type = 'CylinderGeometry'; + + this.parameters = { + radiusTop: radiusTop, + radiusBottom: radiusBottom, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + this.fromBufferGeometry( new CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) ); + this.mergeVertices(); + + } + + CylinderGeometry.prototype = Object.create( Geometry.prototype ); + CylinderGeometry.prototype.constructor = CylinderGeometry; + + // CylinderBufferGeometry + + function CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { + + BufferGeometry.call( this ); + + this.type = 'CylinderBufferGeometry'; + + this.parameters = { + radiusTop: radiusTop, + radiusBottom: radiusBottom, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + var scope = this; + + radiusTop = radiusTop !== undefined ? radiusTop : 20; + radiusBottom = radiusBottom !== undefined ? radiusBottom : 20; + height = height !== undefined ? height : 100; + + radialSegments = Math.floor( radialSegments ) || 8; + heightSegments = Math.floor( heightSegments ) || 1; + + openEnded = openEnded !== undefined ? openEnded : false; + thetaStart = thetaStart !== undefined ? thetaStart : 0.0; + thetaLength = thetaLength !== undefined ? thetaLength : 2.0 * Math.PI; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var index = 0; + var indexArray = []; + var halfHeight = height / 2; + var groupStart = 0; + + // generate geometry + + generateTorso(); + + if ( openEnded === false ) { + + if ( radiusTop > 0 ) generateCap( true ); + if ( radiusBottom > 0 ) generateCap( false ); + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + function generateTorso() { + + var x, y; + var normal = new Vector3(); + var vertex = new Vector3(); + + var groupCount = 0; + + // this will be used to calculate the normal + var slope = ( radiusBottom - radiusTop ) / height; + + // generate vertices, normals and uvs + + for ( y = 0; y <= heightSegments; y ++ ) { + + var indexRow = []; + + var v = y / heightSegments; + + // calculate the radius of the current row + + var radius = v * ( radiusBottom - radiusTop ) + radiusTop; + + for ( x = 0; x <= radialSegments; x ++ ) { + + var u = x / radialSegments; + + var theta = u * thetaLength + thetaStart; + + var sinTheta = Math.sin( theta ); + var cosTheta = Math.cos( theta ); + + // vertex + + vertex.x = radius * sinTheta; + vertex.y = - v * height + halfHeight; + vertex.z = radius * cosTheta; + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + normal.set( sinTheta, slope, cosTheta ).normalize(); + normals.push( normal.x, normal.y, normal.z ); + + // uv + + uvs.push( u, 1 - v ); + + // save index of vertex in respective row + + indexRow.push( index ++ ); + + } + + // now save vertices of the row in our index array + + indexArray.push( indexRow ); + + } + + // generate indices + + for ( x = 0; x < radialSegments; x ++ ) { + + for ( y = 0; y < heightSegments; y ++ ) { + + // we use the index array to access the correct indices + + var a = indexArray[ y ][ x ]; + var b = indexArray[ y + 1 ][ x ]; + var c = indexArray[ y + 1 ][ x + 1 ]; + var d = indexArray[ y ][ x + 1 ]; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + // update group counter + + groupCount += 6; + + } + + } + + // add a group to the geometry. this will ensure multi material support + + scope.addGroup( groupStart, groupCount, 0 ); + + // calculate new start value for groups + + groupStart += groupCount; + + } + + function generateCap( top ) { + + var x, centerIndexStart, centerIndexEnd; + + var uv = new Vector2(); + var vertex = new Vector3(); + + var groupCount = 0; + + var radius = ( top === true ) ? radiusTop : radiusBottom; + var sign = ( top === true ) ? 1 : - 1; + + // save the index of the first center vertex + centerIndexStart = index; + + // first we generate the center vertex data of the cap. + // because the geometry needs one set of uvs per face, + // we must generate a center vertex per face/segment + + for ( x = 1; x <= radialSegments; x ++ ) { + + // vertex + + vertices.push( 0, halfHeight * sign, 0 ); + + // normal + + normals.push( 0, sign, 0 ); + + // uv + + uvs.push( 0.5, 0.5 ); + + // increase index + + index ++; + + } + + // save the index of the last center vertex + + centerIndexEnd = index; + + // now we generate the surrounding vertices, normals and uvs + + for ( x = 0; x <= radialSegments; x ++ ) { + + var u = x / radialSegments; + var theta = u * thetaLength + thetaStart; + + var cosTheta = Math.cos( theta ); + var sinTheta = Math.sin( theta ); + + // vertex + + vertex.x = radius * sinTheta; + vertex.y = halfHeight * sign; + vertex.z = radius * cosTheta; + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + normals.push( 0, sign, 0 ); + + // uv + + uv.x = ( cosTheta * 0.5 ) + 0.5; + uv.y = ( sinTheta * 0.5 * sign ) + 0.5; + uvs.push( uv.x, uv.y ); + + // increase index + + index ++; + + } + + // generate indices + + for ( x = 0; x < radialSegments; x ++ ) { + + var c = centerIndexStart + x; + var i = centerIndexEnd + x; + + if ( top === true ) { + + // face top + + indices.push( i, i + 1, c ); + + } else { + + // face bottom + + indices.push( i + 1, i, c ); + + } + + groupCount += 3; + + } + + // add a group to the geometry. this will ensure multi material support + + scope.addGroup( groupStart, groupCount, top === true ? 1 : 2 ); + + // calculate new start value for groups + + groupStart += groupCount; + + } + + } + + CylinderBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + CylinderBufferGeometry.prototype.constructor = CylinderBufferGeometry; + + /** + * @author abelnation / http://github.com/abelnation + */ + + // ConeGeometry + + function ConeGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { + + CylinderGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ); + + this.type = 'ConeGeometry'; + + this.parameters = { + radius: radius, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + } + + ConeGeometry.prototype = Object.create( CylinderGeometry.prototype ); + ConeGeometry.prototype.constructor = ConeGeometry; + + // ConeBufferGeometry + + function ConeBufferGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { + + CylinderBufferGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ); + + this.type = 'ConeBufferGeometry'; + + this.parameters = { + radius: radius, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + } + + ConeBufferGeometry.prototype = Object.create( CylinderBufferGeometry.prototype ); + ConeBufferGeometry.prototype.constructor = ConeBufferGeometry; + + /** + * @author benaadams / https://twitter.com/ben_a_adams + * @author Mugen87 / https://github.com/Mugen87 + * @author hughes + */ + + // CircleGeometry + + function CircleGeometry( radius, segments, thetaStart, thetaLength ) { + + Geometry.call( this ); + + this.type = 'CircleGeometry'; + + this.parameters = { + radius: radius, + segments: segments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + this.fromBufferGeometry( new CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) ); + this.mergeVertices(); + + } + + CircleGeometry.prototype = Object.create( Geometry.prototype ); + CircleGeometry.prototype.constructor = CircleGeometry; + + // CircleBufferGeometry + + function CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) { + + BufferGeometry.call( this ); + + this.type = 'CircleBufferGeometry'; + + this.parameters = { + radius: radius, + segments: segments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + radius = radius || 50; + segments = segments !== undefined ? Math.max( 3, segments ) : 8; + + thetaStart = thetaStart !== undefined ? thetaStart : 0; + thetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var i, s; + var vertex = new Vector3(); + var uv = new Vector2(); + + // center point + + vertices.push( 0, 0, 0 ); + normals.push( 0, 0, 1 ); + uvs.push( 0.5, 0.5 ); + + for ( s = 0, i = 3; s <= segments; s ++, i += 3 ) { + + var segment = thetaStart + s / segments * thetaLength; + + // vertex + + vertex.x = radius * Math.cos( segment ); + vertex.y = radius * Math.sin( segment ); + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + normals.push( 0, 0, 1 ); + + // uvs + + uv.x = ( vertices[ i ] / radius + 1 ) / 2; + uv.y = ( vertices[ i + 1 ] / radius + 1 ) / 2; + + uvs.push( uv.x, uv.y ); + + } + + // indices + + for ( i = 1; i <= segments; i ++ ) { + + indices.push( i, i + 1, 0 ); + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + CircleBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + CircleBufferGeometry.prototype.constructor = CircleBufferGeometry; + + + + var Geometries = Object.freeze({ + WireframeGeometry: WireframeGeometry, + ParametricGeometry: ParametricGeometry, + ParametricBufferGeometry: ParametricBufferGeometry, + TetrahedronGeometry: TetrahedronGeometry, + TetrahedronBufferGeometry: TetrahedronBufferGeometry, + OctahedronGeometry: OctahedronGeometry, + OctahedronBufferGeometry: OctahedronBufferGeometry, + IcosahedronGeometry: IcosahedronGeometry, + IcosahedronBufferGeometry: IcosahedronBufferGeometry, + DodecahedronGeometry: DodecahedronGeometry, + DodecahedronBufferGeometry: DodecahedronBufferGeometry, + PolyhedronGeometry: PolyhedronGeometry, + PolyhedronBufferGeometry: PolyhedronBufferGeometry, + TubeGeometry: TubeGeometry, + TubeBufferGeometry: TubeBufferGeometry, + TorusKnotGeometry: TorusKnotGeometry, + TorusKnotBufferGeometry: TorusKnotBufferGeometry, + TorusGeometry: TorusGeometry, + TorusBufferGeometry: TorusBufferGeometry, + TextGeometry: TextGeometry, + TextBufferGeometry: TextBufferGeometry, + SphereGeometry: SphereGeometry, + SphereBufferGeometry: SphereBufferGeometry, + RingGeometry: RingGeometry, + RingBufferGeometry: RingBufferGeometry, + PlaneGeometry: PlaneGeometry, + PlaneBufferGeometry: PlaneBufferGeometry, + LatheGeometry: LatheGeometry, + LatheBufferGeometry: LatheBufferGeometry, + ShapeGeometry: ShapeGeometry, + ShapeBufferGeometry: ShapeBufferGeometry, + ExtrudeGeometry: ExtrudeGeometry, + ExtrudeBufferGeometry: ExtrudeBufferGeometry, + EdgesGeometry: EdgesGeometry, + ConeGeometry: ConeGeometry, + ConeBufferGeometry: ConeBufferGeometry, + CylinderGeometry: CylinderGeometry, + CylinderBufferGeometry: CylinderBufferGeometry, + CircleGeometry: CircleGeometry, + CircleBufferGeometry: CircleBufferGeometry, + BoxGeometry: BoxGeometry, + BoxBufferGeometry: BoxBufferGeometry + }); + + /** + * @author mrdoob / http://mrdoob.com/ + * + * parameters = { + * opacity: <float> + * } + */ + + function ShadowMaterial( parameters ) { + + ShaderMaterial.call( this, { + uniforms: UniformsUtils.merge( [ + UniformsLib.lights, + { + opacity: { value: 1.0 } + } + ] ), + vertexShader: ShaderChunk[ 'shadow_vert' ], + fragmentShader: ShaderChunk[ 'shadow_frag' ] + } ); + + this.lights = true; + this.transparent = true; + + Object.defineProperties( this, { + opacity: { + enumerable: true, + get: function () { + return this.uniforms.opacity.value; + }, + set: function ( value ) { + this.uniforms.opacity.value = value; + } + } + } ); + + this.setValues( parameters ); + + } + + ShadowMaterial.prototype = Object.create( ShaderMaterial.prototype ); + ShadowMaterial.prototype.constructor = ShadowMaterial; + + ShadowMaterial.prototype.isShadowMaterial = true; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function RawShaderMaterial( parameters ) { + + ShaderMaterial.call( this, parameters ); + + this.type = 'RawShaderMaterial'; + + } + + RawShaderMaterial.prototype = Object.create( ShaderMaterial.prototype ); + RawShaderMaterial.prototype.constructor = RawShaderMaterial; + + RawShaderMaterial.prototype.isRawShaderMaterial = true; + + /** + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * color: <hex>, + * roughness: <float>, + * metalness: <float>, + * opacity: <float>, + * + * map: new THREE.Texture( <Image> ), + * + * lightMap: new THREE.Texture( <Image> ), + * lightMapIntensity: <float> + * + * aoMap: new THREE.Texture( <Image> ), + * aoMapIntensity: <float> + * + * emissive: <hex>, + * emissiveIntensity: <float> + * emissiveMap: new THREE.Texture( <Image> ), + * + * bumpMap: new THREE.Texture( <Image> ), + * bumpScale: <float>, + * + * normalMap: new THREE.Texture( <Image> ), + * normalScale: <Vector2>, + * + * displacementMap: new THREE.Texture( <Image> ), + * displacementScale: <float>, + * displacementBias: <float>, + * + * roughnessMap: new THREE.Texture( <Image> ), + * + * metalnessMap: new THREE.Texture( <Image> ), + * + * alphaMap: new THREE.Texture( <Image> ), + * + * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ), + * envMapIntensity: <float> + * + * refractionRatio: <float>, + * + * wireframe: <boolean>, + * wireframeLinewidth: <float>, + * + * skinning: <bool>, + * morphTargets: <bool>, + * morphNormals: <bool> + * } + */ + + function MeshStandardMaterial( parameters ) { + + Material.call( this ); + + this.defines = { 'STANDARD': '' }; + + this.type = 'MeshStandardMaterial'; + + this.color = new Color( 0xffffff ); // diffuse + this.roughness = 0.5; + this.metalness = 0.5; + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.emissive = new Color( 0x000000 ); + this.emissiveIntensity = 1.0; + this.emissiveMap = null; + + this.bumpMap = null; + this.bumpScale = 1; + + this.normalMap = null; + this.normalScale = new Vector2( 1, 1 ); + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.roughnessMap = null; + + this.metalnessMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.envMapIntensity = 1.0; + + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.setValues( parameters ); + + } + + MeshStandardMaterial.prototype = Object.create( Material.prototype ); + MeshStandardMaterial.prototype.constructor = MeshStandardMaterial; + + MeshStandardMaterial.prototype.isMeshStandardMaterial = true; + + MeshStandardMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.defines = { 'STANDARD': '' }; + + this.color.copy( source.color ); + this.roughness = source.roughness; + this.metalness = source.metalness; + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.emissive.copy( source.emissive ); + this.emissiveMap = source.emissiveMap; + this.emissiveIntensity = source.emissiveIntensity; + + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + + this.normalMap = source.normalMap; + this.normalScale.copy( source.normalScale ); + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.roughnessMap = source.roughnessMap; + + this.metalnessMap = source.metalnessMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.envMapIntensity = source.envMapIntensity; + + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + + }; + + /** + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * reflectivity: <float> + * } + */ + + function MeshPhysicalMaterial( parameters ) { + + MeshStandardMaterial.call( this ); + + this.defines = { 'PHYSICAL': '' }; + + this.type = 'MeshPhysicalMaterial'; + + this.reflectivity = 0.5; // maps to F0 = 0.04 + + this.clearCoat = 0.0; + this.clearCoatRoughness = 0.0; + + this.setValues( parameters ); + + } + + MeshPhysicalMaterial.prototype = Object.create( MeshStandardMaterial.prototype ); + MeshPhysicalMaterial.prototype.constructor = MeshPhysicalMaterial; + + MeshPhysicalMaterial.prototype.isMeshPhysicalMaterial = true; + + MeshPhysicalMaterial.prototype.copy = function ( source ) { + + MeshStandardMaterial.prototype.copy.call( this, source ); + + this.defines = { 'PHYSICAL': '' }; + + this.reflectivity = source.reflectivity; + + this.clearCoat = source.clearCoat; + this.clearCoatRoughness = source.clearCoatRoughness; + + return this; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: <hex>, + * specular: <hex>, + * shininess: <float>, + * opacity: <float>, + * + * map: new THREE.Texture( <Image> ), + * + * lightMap: new THREE.Texture( <Image> ), + * lightMapIntensity: <float> + * + * aoMap: new THREE.Texture( <Image> ), + * aoMapIntensity: <float> + * + * emissive: <hex>, + * emissiveIntensity: <float> + * emissiveMap: new THREE.Texture( <Image> ), + * + * bumpMap: new THREE.Texture( <Image> ), + * bumpScale: <float>, + * + * normalMap: new THREE.Texture( <Image> ), + * normalScale: <Vector2>, + * + * displacementMap: new THREE.Texture( <Image> ), + * displacementScale: <float>, + * displacementBias: <float>, + * + * specularMap: new THREE.Texture( <Image> ), + * + * alphaMap: new THREE.Texture( <Image> ), + * + * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ), + * combine: THREE.Multiply, + * reflectivity: <float>, + * refractionRatio: <float>, + * + * wireframe: <boolean>, + * wireframeLinewidth: <float>, + * + * skinning: <bool>, + * morphTargets: <bool>, + * morphNormals: <bool> + * } + */ + + function MeshPhongMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshPhongMaterial'; + + this.color = new Color( 0xffffff ); // diffuse + this.specular = new Color( 0x111111 ); + this.shininess = 30; + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.emissive = new Color( 0x000000 ); + this.emissiveIntensity = 1.0; + this.emissiveMap = null; + + this.bumpMap = null; + this.bumpScale = 1; + + this.normalMap = null; + this.normalScale = new Vector2( 1, 1 ); + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.specularMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.combine = MultiplyOperation; + this.reflectivity = 1; + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.setValues( parameters ); + + } + + MeshPhongMaterial.prototype = Object.create( Material.prototype ); + MeshPhongMaterial.prototype.constructor = MeshPhongMaterial; + + MeshPhongMaterial.prototype.isMeshPhongMaterial = true; + + MeshPhongMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + this.specular.copy( source.specular ); + this.shininess = source.shininess; + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.emissive.copy( source.emissive ); + this.emissiveMap = source.emissiveMap; + this.emissiveIntensity = source.emissiveIntensity; + + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + + this.normalMap = source.normalMap; + this.normalScale.copy( source.normalScale ); + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.specularMap = source.specularMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.combine = source.combine; + this.reflectivity = source.reflectivity; + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + + }; + + /** + * @author takahirox / http://github.com/takahirox + * + * parameters = { + * gradientMap: new THREE.Texture( <Image> ) + * } + */ + + function MeshToonMaterial( parameters ) { + + MeshPhongMaterial.call( this ); + + this.defines = { 'TOON': '' }; + + this.type = 'MeshToonMaterial'; + + this.gradientMap = null; + + this.setValues( parameters ); + + } + + MeshToonMaterial.prototype = Object.create( MeshPhongMaterial.prototype ); + MeshToonMaterial.prototype.constructor = MeshToonMaterial; + + MeshToonMaterial.prototype.isMeshToonMaterial = true; + + MeshToonMaterial.prototype.copy = function ( source ) { + + MeshPhongMaterial.prototype.copy.call( this, source ); + + this.gradientMap = source.gradientMap; + + return this; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * opacity: <float>, + * + * bumpMap: new THREE.Texture( <Image> ), + * bumpScale: <float>, + * + * normalMap: new THREE.Texture( <Image> ), + * normalScale: <Vector2>, + * + * displacementMap: new THREE.Texture( <Image> ), + * displacementScale: <float>, + * displacementBias: <float>, + * + * wireframe: <boolean>, + * wireframeLinewidth: <float> + * + * skinning: <bool>, + * morphTargets: <bool>, + * morphNormals: <bool> + * } + */ + + function MeshNormalMaterial( parameters ) { + + Material.call( this, parameters ); + + this.type = 'MeshNormalMaterial'; + + this.bumpMap = null; + this.bumpScale = 1; + + this.normalMap = null; + this.normalScale = new Vector2( 1, 1 ); + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.wireframe = false; + this.wireframeLinewidth = 1; + + this.fog = false; + this.lights = false; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.setValues( parameters ); + + } + + MeshNormalMaterial.prototype = Object.create( Material.prototype ); + MeshNormalMaterial.prototype.constructor = MeshNormalMaterial; + + MeshNormalMaterial.prototype.isMeshNormalMaterial = true; + + MeshNormalMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + + this.normalMap = source.normalMap; + this.normalScale.copy( source.normalScale ); + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: <hex>, + * opacity: <float>, + * + * map: new THREE.Texture( <Image> ), + * + * lightMap: new THREE.Texture( <Image> ), + * lightMapIntensity: <float> + * + * aoMap: new THREE.Texture( <Image> ), + * aoMapIntensity: <float> + * + * emissive: <hex>, + * emissiveIntensity: <float> + * emissiveMap: new THREE.Texture( <Image> ), + * + * specularMap: new THREE.Texture( <Image> ), + * + * alphaMap: new THREE.Texture( <Image> ), + * + * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ), + * combine: THREE.Multiply, + * reflectivity: <float>, + * refractionRatio: <float>, + * + * wireframe: <boolean>, + * wireframeLinewidth: <float>, + * + * skinning: <bool>, + * morphTargets: <bool>, + * morphNormals: <bool> + * } + */ + + function MeshLambertMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshLambertMaterial'; + + this.color = new Color( 0xffffff ); // diffuse + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.emissive = new Color( 0x000000 ); + this.emissiveIntensity = 1.0; + this.emissiveMap = null; + + this.specularMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.combine = MultiplyOperation; + this.reflectivity = 1; + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.setValues( parameters ); + + } + + MeshLambertMaterial.prototype = Object.create( Material.prototype ); + MeshLambertMaterial.prototype.constructor = MeshLambertMaterial; + + MeshLambertMaterial.prototype.isMeshLambertMaterial = true; + + MeshLambertMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.emissive.copy( source.emissive ); + this.emissiveMap = source.emissiveMap; + this.emissiveIntensity = source.emissiveIntensity; + + this.specularMap = source.specularMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.combine = source.combine; + this.reflectivity = source.reflectivity; + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: <hex>, + * opacity: <float>, + * + * linewidth: <float>, + * + * scale: <float>, + * dashSize: <float>, + * gapSize: <float> + * } + */ + + function LineDashedMaterial( parameters ) { + + Material.call( this ); + + this.type = 'LineDashedMaterial'; + + this.color = new Color( 0xffffff ); + + this.linewidth = 1; + + this.scale = 1; + this.dashSize = 3; + this.gapSize = 1; + + this.lights = false; + + this.setValues( parameters ); + + } + + LineDashedMaterial.prototype = Object.create( Material.prototype ); + LineDashedMaterial.prototype.constructor = LineDashedMaterial; + + LineDashedMaterial.prototype.isLineDashedMaterial = true; + + LineDashedMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.linewidth = source.linewidth; + + this.scale = source.scale; + this.dashSize = source.dashSize; + this.gapSize = source.gapSize; + + return this; + + }; + + + + var Materials = Object.freeze({ + ShadowMaterial: ShadowMaterial, + SpriteMaterial: SpriteMaterial, + RawShaderMaterial: RawShaderMaterial, + ShaderMaterial: ShaderMaterial, + PointsMaterial: PointsMaterial, + MeshPhysicalMaterial: MeshPhysicalMaterial, + MeshStandardMaterial: MeshStandardMaterial, + MeshPhongMaterial: MeshPhongMaterial, + MeshToonMaterial: MeshToonMaterial, + MeshNormalMaterial: MeshNormalMaterial, + MeshLambertMaterial: MeshLambertMaterial, + MeshDepthMaterial: MeshDepthMaterial, + MeshBasicMaterial: MeshBasicMaterial, + LineDashedMaterial: LineDashedMaterial, + LineBasicMaterial: LineBasicMaterial, + Material: Material + }); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + var Cache = { + + enabled: false, + + files: {}, + + add: function ( key, file ) { + + if ( this.enabled === false ) return; + + // console.log( 'THREE.Cache', 'Adding key:', key ); + + this.files[ key ] = file; + + }, + + get: function ( key ) { + + if ( this.enabled === false ) return; + + // console.log( 'THREE.Cache', 'Checking key:', key ); + + return this.files[ key ]; + + }, + + remove: function ( key ) { + + delete this.files[ key ]; + + }, + + clear: function () { + + this.files = {}; + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function LoadingManager( onLoad, onProgress, onError ) { + + var scope = this; + + var isLoading = false, itemsLoaded = 0, itemsTotal = 0; + + this.onStart = undefined; + this.onLoad = onLoad; + this.onProgress = onProgress; + this.onError = onError; + + this.itemStart = function ( url ) { + + itemsTotal ++; + + if ( isLoading === false ) { + + if ( scope.onStart !== undefined ) { + + scope.onStart( url, itemsLoaded, itemsTotal ); + + } + + } + + isLoading = true; + + }; + + this.itemEnd = function ( url ) { + + itemsLoaded ++; + + if ( scope.onProgress !== undefined ) { + + scope.onProgress( url, itemsLoaded, itemsTotal ); + + } + + if ( itemsLoaded === itemsTotal ) { + + isLoading = false; + + if ( scope.onLoad !== undefined ) { + + scope.onLoad(); + + } + + } + + }; + + this.itemError = function ( url ) { + + if ( scope.onError !== undefined ) { + + scope.onError( url ); + + } + + }; + + } + + var DefaultLoadingManager = new LoadingManager(); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function FileLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( FileLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + if ( url === undefined ) url = ''; + + if ( this.path !== undefined ) url = this.path + url; + + var scope = this; + + var cached = Cache.get( url ); + + if ( cached !== undefined ) { + + scope.manager.itemStart( url ); + + setTimeout( function () { + + if ( onLoad ) onLoad( cached ); + + scope.manager.itemEnd( url ); + + }, 0 ); + + return cached; + + } + + // Check for data: URI + var dataUriRegex = /^data:(.*?)(;base64)?,(.*)$/; + var dataUriRegexResult = url.match( dataUriRegex ); + + // Safari can not handle Data URIs through XMLHttpRequest so process manually + if ( dataUriRegexResult ) { + + var mimeType = dataUriRegexResult[ 1 ]; + var isBase64 = !! dataUriRegexResult[ 2 ]; + var data = dataUriRegexResult[ 3 ]; + + data = window.decodeURIComponent( data ); + + if ( isBase64 ) data = window.atob( data ); + + try { + + var response; + var responseType = ( this.responseType || '' ).toLowerCase(); + + switch ( responseType ) { + + case 'arraybuffer': + case 'blob': + + response = new ArrayBuffer( data.length ); + + var view = new Uint8Array( response ); + + for ( var i = 0; i < data.length; i ++ ) { + + view[ i ] = data.charCodeAt( i ); + + } + + if ( responseType === 'blob' ) { + + response = new Blob( [ response ], { type: mimeType } ); + + } + + break; + + case 'document': + + var parser = new DOMParser(); + response = parser.parseFromString( data, mimeType ); + + break; + + case 'json': + + response = JSON.parse( data ); + + break; + + default: // 'text' or other + + response = data; + + break; + + } + + // Wait for next browser tick + window.setTimeout( function () { + + if ( onLoad ) onLoad( response ); + + scope.manager.itemEnd( url ); + + }, 0 ); + + } catch ( error ) { + + // Wait for next browser tick + window.setTimeout( function () { + + if ( onError ) onError( error ); + + scope.manager.itemEnd( url ); + scope.manager.itemError( url ); + + }, 0 ); + + } + + } else { + + var request = new XMLHttpRequest(); + request.open( 'GET', url, true ); + + request.addEventListener( 'load', function ( event ) { + + var response = event.target.response; + + Cache.add( url, response ); + + if ( this.status === 200 ) { + + if ( onLoad ) onLoad( response ); + + scope.manager.itemEnd( url ); + + } else if ( this.status === 0 ) { + + // Some browsers return HTTP Status 0 when using non-http protocol + // e.g. 'file://' or 'data://'. Handle as success. + + console.warn( 'THREE.FileLoader: HTTP Status 0 received.' ); + + if ( onLoad ) onLoad( response ); + + scope.manager.itemEnd( url ); + + } else { + + if ( onError ) onError( event ); + + scope.manager.itemEnd( url ); + scope.manager.itemError( url ); + + } + + }, false ); + + if ( onProgress !== undefined ) { + + request.addEventListener( 'progress', function ( event ) { + + onProgress( event ); + + }, false ); + + } + + request.addEventListener( 'error', function ( event ) { + + if ( onError ) onError( event ); + + scope.manager.itemEnd( url ); + scope.manager.itemError( url ); + + }, false ); + + if ( this.responseType !== undefined ) request.responseType = this.responseType; + if ( this.withCredentials !== undefined ) request.withCredentials = this.withCredentials; + + if ( request.overrideMimeType ) request.overrideMimeType( this.mimeType !== undefined ? this.mimeType : 'text/plain' ); + + for ( var header in this.requestHeader ) { + + request.setRequestHeader( header, this.requestHeader[ header ] ); + + } + + request.send( null ); + + } + + scope.manager.itemStart( url ); + + return request; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + }, + + setResponseType: function ( value ) { + + this.responseType = value; + return this; + + }, + + setWithCredentials: function ( value ) { + + this.withCredentials = value; + return this; + + }, + + setMimeType: function ( value ) { + + this.mimeType = value; + return this; + + }, + + setRequestHeader: function ( value ) { + + this.requestHeader = value; + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * + * Abstract Base class to block based textures loader (dds, pvr, ...) + */ + + function CompressedTextureLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + // override in sub classes + this._parser = null; + + } + + Object.assign( CompressedTextureLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var images = []; + + var texture = new CompressedTexture(); + texture.image = images; + + var loader = new FileLoader( this.manager ); + loader.setPath( this.path ); + loader.setResponseType( 'arraybuffer' ); + + function loadTexture( i ) { + + loader.load( url[ i ], function ( buffer ) { + + var texDatas = scope._parser( buffer, true ); + + images[ i ] = { + width: texDatas.width, + height: texDatas.height, + format: texDatas.format, + mipmaps: texDatas.mipmaps + }; + + loaded += 1; + + if ( loaded === 6 ) { + + if ( texDatas.mipmapCount === 1 ) + texture.minFilter = LinearFilter; + + texture.format = texDatas.format; + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture ); + + } + + }, onProgress, onError ); + + } + + if ( Array.isArray( url ) ) { + + var loaded = 0; + + for ( var i = 0, il = url.length; i < il; ++ i ) { + + loadTexture( i ); + + } + + } else { + + // compressed cubemap texture stored in a single DDS file + + loader.load( url, function ( buffer ) { + + var texDatas = scope._parser( buffer, true ); + + if ( texDatas.isCubemap ) { + + var faces = texDatas.mipmaps.length / texDatas.mipmapCount; + + for ( var f = 0; f < faces; f ++ ) { + + images[ f ] = { mipmaps : [] }; + + for ( var i = 0; i < texDatas.mipmapCount; i ++ ) { + + images[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] ); + images[ f ].format = texDatas.format; + images[ f ].width = texDatas.width; + images[ f ].height = texDatas.height; + + } + + } + + } else { + + texture.image.width = texDatas.width; + texture.image.height = texDatas.height; + texture.mipmaps = texDatas.mipmaps; + + } + + if ( texDatas.mipmapCount === 1 ) { + + texture.minFilter = LinearFilter; + + } + + texture.format = texDatas.format; + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture ); + + }, onProgress, onError ); + + } + + return texture; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + + } ); + + /** + * @author Nikos M. / https://github.com/foo123/ + * + * Abstract Base class to load generic binary textures formats (rgbe, hdr, ...) + */ + + function DataTextureLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + // override in sub classes + this._parser = null; + + } + + Object.assign( DataTextureLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var texture = new DataTexture(); + + var loader = new FileLoader( this.manager ); + loader.setResponseType( 'arraybuffer' ); + + loader.load( url, function ( buffer ) { + + var texData = scope._parser( buffer ); + + if ( ! texData ) return; + + if ( undefined !== texData.image ) { + + texture.image = texData.image; + + } else if ( undefined !== texData.data ) { + + texture.image.width = texData.width; + texture.image.height = texData.height; + texture.image.data = texData.data; + + } + + texture.wrapS = undefined !== texData.wrapS ? texData.wrapS : ClampToEdgeWrapping; + texture.wrapT = undefined !== texData.wrapT ? texData.wrapT : ClampToEdgeWrapping; + + texture.magFilter = undefined !== texData.magFilter ? texData.magFilter : LinearFilter; + texture.minFilter = undefined !== texData.minFilter ? texData.minFilter : LinearMipMapLinearFilter; + + texture.anisotropy = undefined !== texData.anisotropy ? texData.anisotropy : 1; + + if ( undefined !== texData.format ) { + + texture.format = texData.format; + + } + if ( undefined !== texData.type ) { + + texture.type = texData.type; + + } + + if ( undefined !== texData.mipmaps ) { + + texture.mipmaps = texData.mipmaps; + + } + + if ( 1 === texData.mipmapCount ) { + + texture.minFilter = LinearFilter; + + } + + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture, texData ); + + }, onProgress, onError ); + + + return texture; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function ImageLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( ImageLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + if ( url === undefined ) url = ''; + + if ( this.path !== undefined ) url = this.path + url; + + var scope = this; + + var cached = Cache.get( url ); + + if ( cached !== undefined ) { + + scope.manager.itemStart( url ); + + setTimeout( function () { + + if ( onLoad ) onLoad( cached ); + + scope.manager.itemEnd( url ); + + }, 0 ); + + return cached; + + } + + var image = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'img' ); + + image.addEventListener( 'load', function () { + + Cache.add( url, this ); + + if ( onLoad ) onLoad( this ); + + scope.manager.itemEnd( url ); + + }, false ); + + /* + image.addEventListener( 'progress', function ( event ) { + + if ( onProgress ) onProgress( event ); + + }, false ); + */ + + image.addEventListener( 'error', function ( event ) { + + if ( onError ) onError( event ); + + scope.manager.itemEnd( url ); + scope.manager.itemError( url ); + + }, false ); + + if ( url.substr( 0, 5 ) !== 'data:' ) { + + if ( this.crossOrigin !== undefined ) image.crossOrigin = this.crossOrigin; + + } + + scope.manager.itemStart( url ); + + image.src = url; + + return image; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + return this; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function CubeTextureLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( CubeTextureLoader.prototype, { + + load: function ( urls, onLoad, onProgress, onError ) { + + var texture = new CubeTexture(); + + var loader = new ImageLoader( this.manager ); + loader.setCrossOrigin( this.crossOrigin ); + loader.setPath( this.path ); + + var loaded = 0; + + function loadTexture( i ) { + + loader.load( urls[ i ], function ( image ) { + + texture.images[ i ] = image; + + loaded ++; + + if ( loaded === 6 ) { + + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture ); + + } + + }, undefined, onError ); + + } + + for ( var i = 0; i < urls.length; ++ i ) { + + loadTexture( i ); + + } + + return texture; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + return this; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function TextureLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( TextureLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var loader = new ImageLoader( this.manager ); + loader.setCrossOrigin( this.crossOrigin ); + loader.setPath( this.path ); + + var texture = new Texture(); + texture.image = loader.load( url, function () { + + // JPEGs can't have an alpha channel, so memory can be saved by storing them as RGB. + var isJPEG = url.search( /\.(jpg|jpeg)$/ ) > 0 || url.search( /^data\:image\/jpeg/ ) === 0; + + texture.format = isJPEG ? RGBFormat : RGBAFormat; + texture.needsUpdate = true; + + if ( onLoad !== undefined ) { + + onLoad( texture ); + + } + + }, onProgress, onError ); + + return texture; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + return this; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function Light( color, intensity ) { + + Object3D.call( this ); + + this.type = 'Light'; + + this.color = new Color( color ); + this.intensity = intensity !== undefined ? intensity : 1; + + this.receiveShadow = undefined; + + } + + Light.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Light, + + isLight: true, + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + this.intensity = source.intensity; + + return this; + + }, + + toJSON: function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + data.object.color = this.color.getHex(); + data.object.intensity = this.intensity; + + if ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex(); + + if ( this.distance !== undefined ) data.object.distance = this.distance; + if ( this.angle !== undefined ) data.object.angle = this.angle; + if ( this.decay !== undefined ) data.object.decay = this.decay; + if ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra; + + if ( this.shadow !== undefined ) data.object.shadow = this.shadow.toJSON(); + + return data; + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function HemisphereLight( skyColor, groundColor, intensity ) { + + Light.call( this, skyColor, intensity ); + + this.type = 'HemisphereLight'; + + this.castShadow = undefined; + + this.position.copy( Object3D.DefaultUp ); + this.updateMatrix(); + + this.groundColor = new Color( groundColor ); + + } + + HemisphereLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: HemisphereLight, + + isHemisphereLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.groundColor.copy( source.groundColor ); + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function LightShadow( camera ) { + + this.camera = camera; + + this.bias = 0; + this.radius = 1; + + this.mapSize = new Vector2( 512, 512 ); + + this.map = null; + this.matrix = new Matrix4(); + + } + + Object.assign( LightShadow.prototype, { + + copy: function ( source ) { + + this.camera = source.camera.clone(); + + this.bias = source.bias; + this.radius = source.radius; + + this.mapSize.copy( source.mapSize ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + toJSON: function () { + + var object = {}; + + if ( this.bias !== 0 ) object.bias = this.bias; + if ( this.radius !== 1 ) object.radius = this.radius; + if ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray(); + + object.camera = this.camera.toJSON( false ).object; + delete object.camera.matrix; + + return object; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function SpotLightShadow() { + + LightShadow.call( this, new PerspectiveCamera( 50, 1, 0.5, 500 ) ); + + } + + SpotLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), { + + constructor: SpotLightShadow, + + isSpotLightShadow: true, + + update: function ( light ) { + + var camera = this.camera; + + var fov = _Math.RAD2DEG * 2 * light.angle; + var aspect = this.mapSize.width / this.mapSize.height; + var far = light.distance || camera.far; + + if ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) { + + camera.fov = fov; + camera.aspect = aspect; + camera.far = far; + camera.updateProjectionMatrix(); + + } + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function SpotLight( color, intensity, distance, angle, penumbra, decay ) { + + Light.call( this, color, intensity ); + + this.type = 'SpotLight'; + + this.position.copy( Object3D.DefaultUp ); + this.updateMatrix(); + + this.target = new Object3D(); + + Object.defineProperty( this, 'power', { + get: function () { + // intensity = power per solid angle. + // ref: equation (17) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf + return this.intensity * Math.PI; + }, + set: function ( power ) { + // intensity = power per solid angle. + // ref: equation (17) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf + this.intensity = power / Math.PI; + } + } ); + + this.distance = ( distance !== undefined ) ? distance : 0; + this.angle = ( angle !== undefined ) ? angle : Math.PI / 3; + this.penumbra = ( penumbra !== undefined ) ? penumbra : 0; + this.decay = ( decay !== undefined ) ? decay : 1; // for physically correct lights, should be 2. + + this.shadow = new SpotLightShadow(); + + } + + SpotLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: SpotLight, + + isSpotLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.distance = source.distance; + this.angle = source.angle; + this.penumbra = source.penumbra; + this.decay = source.decay; + + this.target = source.target.clone(); + + this.shadow = source.shadow.clone(); + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + + function PointLight( color, intensity, distance, decay ) { + + Light.call( this, color, intensity ); + + this.type = 'PointLight'; + + Object.defineProperty( this, 'power', { + get: function () { + // intensity = power per solid angle. + // ref: equation (15) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf + return this.intensity * 4 * Math.PI; + + }, + set: function ( power ) { + // intensity = power per solid angle. + // ref: equation (15) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf + this.intensity = power / ( 4 * Math.PI ); + } + } ); + + this.distance = ( distance !== undefined ) ? distance : 0; + this.decay = ( decay !== undefined ) ? decay : 1; // for physically correct lights, should be 2. + + this.shadow = new LightShadow( new PerspectiveCamera( 90, 1, 0.5, 500 ) ); + + } + + PointLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: PointLight, + + isPointLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.distance = source.distance; + this.decay = source.decay; + + this.shadow = source.shadow.clone(); + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function DirectionalLightShadow( ) { + + LightShadow.call( this, new OrthographicCamera( - 5, 5, 5, - 5, 0.5, 500 ) ); + + } + + DirectionalLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), { + + constructor: DirectionalLightShadow + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function DirectionalLight( color, intensity ) { + + Light.call( this, color, intensity ); + + this.type = 'DirectionalLight'; + + this.position.copy( Object3D.DefaultUp ); + this.updateMatrix(); + + this.target = new Object3D(); + + this.shadow = new DirectionalLightShadow(); + + } + + DirectionalLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: DirectionalLight, + + isDirectionalLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.target = source.target.clone(); + + this.shadow = source.shadow.clone(); + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function AmbientLight( color, intensity ) { + + Light.call( this, color, intensity ); + + this.type = 'AmbientLight'; + + this.castShadow = undefined; + + } + + AmbientLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: AmbientLight, + + isAmbientLight: true + + } ); + + /** + * @author abelnation / http://github.com/abelnation + */ + + function RectAreaLight( color, intensity, width, height ) { + + Light.call( this, color, intensity ); + + this.type = 'RectAreaLight'; + + this.position.set( 0, 1, 0 ); + this.updateMatrix(); + + this.width = ( width !== undefined ) ? width : 10; + this.height = ( height !== undefined ) ? height : 10; + + // TODO (abelnation): distance/decay + + // TODO (abelnation): update method for RectAreaLight to update transform to lookat target + + // TODO (abelnation): shadows + + } + + // TODO (abelnation): RectAreaLight update when light shape is changed + RectAreaLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: RectAreaLight, + + isRectAreaLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.width = source.width; + this.height = source.height; + + return this; + + }, + + toJSON: function ( meta ) { + + var data = Light.prototype.toJSON.call( this, meta ); + + data.object.width = this.width; + data.object.height = this.height; + + return data; + + } + + } ); + + /** + * @author tschw + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + */ + + var AnimationUtils = { + + // same as Array.prototype.slice, but also works on typed arrays + arraySlice: function ( array, from, to ) { + + if ( AnimationUtils.isTypedArray( array ) ) { + + // in ios9 array.subarray(from, undefined) will return empty array + // but array.subarray(from) or array.subarray(from, len) is correct + return new array.constructor( array.subarray( from, to !== undefined ? to : array.length ) ); + + } + + return array.slice( from, to ); + + }, + + // converts an array to a specific type + convertArray: function ( array, type, forceClone ) { + + if ( ! array || // let 'undefined' and 'null' pass + ! forceClone && array.constructor === type ) return array; + + if ( typeof type.BYTES_PER_ELEMENT === 'number' ) { + + return new type( array ); // create typed array + + } + + return Array.prototype.slice.call( array ); // create Array + + }, + + isTypedArray: function ( object ) { + + return ArrayBuffer.isView( object ) && + ! ( object instanceof DataView ); + + }, + + // returns an array by which times and values can be sorted + getKeyframeOrder: function ( times ) { + + function compareTime( i, j ) { + + return times[ i ] - times[ j ]; + + } + + var n = times.length; + var result = new Array( n ); + for ( var i = 0; i !== n; ++ i ) result[ i ] = i; + + result.sort( compareTime ); + + return result; + + }, + + // uses the array previously returned by 'getKeyframeOrder' to sort data + sortedArray: function ( values, stride, order ) { + + var nValues = values.length; + var result = new values.constructor( nValues ); + + for ( var i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) { + + var srcOffset = order[ i ] * stride; + + for ( var j = 0; j !== stride; ++ j ) { + + result[ dstOffset ++ ] = values[ srcOffset + j ]; + + } + + } + + return result; + + }, + + // function for parsing AOS keyframe formats + flattenJSON: function ( jsonKeys, times, values, valuePropertyName ) { + + var i = 1, key = jsonKeys[ 0 ]; + + while ( key !== undefined && key[ valuePropertyName ] === undefined ) { + + key = jsonKeys[ i ++ ]; + + } + + if ( key === undefined ) return; // no data + + var value = key[ valuePropertyName ]; + if ( value === undefined ) return; // no data + + if ( Array.isArray( value ) ) { + + do { + + value = key[ valuePropertyName ]; + + if ( value !== undefined ) { + + times.push( key.time ); + values.push.apply( values, value ); // push all elements + + } + + key = jsonKeys[ i ++ ]; + + } while ( key !== undefined ); + + } else if ( value.toArray !== undefined ) { + + // ...assume THREE.Math-ish + + do { + + value = key[ valuePropertyName ]; + + if ( value !== undefined ) { + + times.push( key.time ); + value.toArray( values, values.length ); + + } + + key = jsonKeys[ i ++ ]; + + } while ( key !== undefined ); + + } else { + + // otherwise push as-is + + do { + + value = key[ valuePropertyName ]; + + if ( value !== undefined ) { + + times.push( key.time ); + values.push( value ); + + } + + key = jsonKeys[ i ++ ]; + + } while ( key !== undefined ); + + } + + } + + }; + + /** + * Abstract base class of interpolants over parametric samples. + * + * The parameter domain is one dimensional, typically the time or a path + * along a curve defined by the data. + * + * The sample values can have any dimensionality and derived classes may + * apply special interpretations to the data. + * + * This class provides the interval seek in a Template Method, deferring + * the actual interpolation to derived classes. + * + * Time complexity is O(1) for linear access crossing at most two points + * and O(log N) for random access, where N is the number of positions. + * + * References: + * + * http://www.oodesign.com/template-method-pattern.html + * + * @author tschw + */ + + function Interpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + this.parameterPositions = parameterPositions; + this._cachedIndex = 0; + + this.resultBuffer = resultBuffer !== undefined ? + resultBuffer : new sampleValues.constructor( sampleSize ); + this.sampleValues = sampleValues; + this.valueSize = sampleSize; + + } + + Object.assign( Interpolant.prototype, { + + evaluate: function( t ) { + + var pp = this.parameterPositions, + i1 = this._cachedIndex, + + t1 = pp[ i1 ], + t0 = pp[ i1 - 1 ]; + + validate_interval: { + + seek: { + + var right; + + linear_scan: { + //- See http://jsperf.com/comparison-to-undefined/3 + //- slower code: + //- + //- if ( t >= t1 || t1 === undefined ) { + forward_scan: if ( ! ( t < t1 ) ) { + + for ( var giveUpAt = i1 + 2; ;) { + + if ( t1 === undefined ) { + + if ( t < t0 ) break forward_scan; + + // after end + + i1 = pp.length; + this._cachedIndex = i1; + return this.afterEnd_( i1 - 1, t, t0 ); + + } + + if ( i1 === giveUpAt ) break; // this loop + + t0 = t1; + t1 = pp[ ++ i1 ]; + + if ( t < t1 ) { + + // we have arrived at the sought interval + break seek; + + } + + } + + // prepare binary search on the right side of the index + right = pp.length; + break linear_scan; + + } + + //- slower code: + //- if ( t < t0 || t0 === undefined ) { + if ( ! ( t >= t0 ) ) { + + // looping? + + var t1global = pp[ 1 ]; + + if ( t < t1global ) { + + i1 = 2; // + 1, using the scan for the details + t0 = t1global; + + } + + // linear reverse scan + + for ( var giveUpAt = i1 - 2; ;) { + + if ( t0 === undefined ) { + + // before start + + this._cachedIndex = 0; + return this.beforeStart_( 0, t, t1 ); + + } + + if ( i1 === giveUpAt ) break; // this loop + + t1 = t0; + t0 = pp[ -- i1 - 1 ]; + + if ( t >= t0 ) { + + // we have arrived at the sought interval + break seek; + + } + + } + + // prepare binary search on the left side of the index + right = i1; + i1 = 0; + break linear_scan; + + } + + // the interval is valid + + break validate_interval; + + } // linear scan + + // binary search + + while ( i1 < right ) { + + var mid = ( i1 + right ) >>> 1; + + if ( t < pp[ mid ] ) { + + right = mid; + + } else { + + i1 = mid + 1; + + } + + } + + t1 = pp[ i1 ]; + t0 = pp[ i1 - 1 ]; + + // check boundary cases, again + + if ( t0 === undefined ) { + + this._cachedIndex = 0; + return this.beforeStart_( 0, t, t1 ); + + } + + if ( t1 === undefined ) { + + i1 = pp.length; + this._cachedIndex = i1; + return this.afterEnd_( i1 - 1, t0, t ); + + } + + } // seek + + this._cachedIndex = i1; + + this.intervalChanged_( i1, t0, t1 ); + + } // validate_interval + + return this.interpolate_( i1, t0, t, t1 ); + + }, + + settings: null, // optional, subclass-specific settings structure + // Note: The indirection allows central control of many interpolants. + + // --- Protected interface + + DefaultSettings_: {}, + + getSettings_: function() { + + return this.settings || this.DefaultSettings_; + + }, + + copySampleValue_: function( index ) { + + // copies a sample value to the result buffer + + var result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + offset = index * stride; + + for ( var i = 0; i !== stride; ++ i ) { + + result[ i ] = values[ offset + i ]; + + } + + return result; + + }, + + // Template methods for derived classes: + + interpolate_: function( i1, t0, t, t1 ) { + + throw new Error( "call to abstract method" ); + // implementations shall return this.resultBuffer + + }, + + intervalChanged_: function( i1, t0, t1 ) { + + // empty + + } + + } ); + + //!\ DECLARE ALIAS AFTER assign prototype ! + Object.assign( Interpolant.prototype, { + + //( 0, t, t0 ), returns this.resultBuffer + beforeStart_: Interpolant.prototype.copySampleValue_, + + //( N-1, tN-1, t ), returns this.resultBuffer + afterEnd_: Interpolant.prototype.copySampleValue_, + + } ); + + /** + * Fast and simple cubic spline interpolant. + * + * It was derived from a Hermitian construction setting the first derivative + * at each sample position to the linear slope between neighboring positions + * over their parameter interval. + * + * @author tschw + */ + + function CubicInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + Interpolant.call( + this, parameterPositions, sampleValues, sampleSize, resultBuffer ); + + this._weightPrev = -0; + this._offsetPrev = -0; + this._weightNext = -0; + this._offsetNext = -0; + + } + + CubicInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), { + + constructor: CubicInterpolant, + + DefaultSettings_: { + + endingStart: ZeroCurvatureEnding, + endingEnd: ZeroCurvatureEnding + + }, + + intervalChanged_: function( i1, t0, t1 ) { + + var pp = this.parameterPositions, + iPrev = i1 - 2, + iNext = i1 + 1, + + tPrev = pp[ iPrev ], + tNext = pp[ iNext ]; + + if ( tPrev === undefined ) { + + switch ( this.getSettings_().endingStart ) { + + case ZeroSlopeEnding: + + // f'(t0) = 0 + iPrev = i1; + tPrev = 2 * t0 - t1; + + break; + + case WrapAroundEnding: + + // use the other end of the curve + iPrev = pp.length - 2; + tPrev = t0 + pp[ iPrev ] - pp[ iPrev + 1 ]; + + break; + + default: // ZeroCurvatureEnding + + // f''(t0) = 0 a.k.a. Natural Spline + iPrev = i1; + tPrev = t1; + + } + + } + + if ( tNext === undefined ) { + + switch ( this.getSettings_().endingEnd ) { + + case ZeroSlopeEnding: + + // f'(tN) = 0 + iNext = i1; + tNext = 2 * t1 - t0; + + break; + + case WrapAroundEnding: + + // use the other end of the curve + iNext = 1; + tNext = t1 + pp[ 1 ] - pp[ 0 ]; + + break; + + default: // ZeroCurvatureEnding + + // f''(tN) = 0, a.k.a. Natural Spline + iNext = i1 - 1; + tNext = t0; + + } + + } + + var halfDt = ( t1 - t0 ) * 0.5, + stride = this.valueSize; + + this._weightPrev = halfDt / ( t0 - tPrev ); + this._weightNext = halfDt / ( tNext - t1 ); + this._offsetPrev = iPrev * stride; + this._offsetNext = iNext * stride; + + }, + + interpolate_: function( i1, t0, t, t1 ) { + + var result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + + o1 = i1 * stride, o0 = o1 - stride, + oP = this._offsetPrev, oN = this._offsetNext, + wP = this._weightPrev, wN = this._weightNext, + + p = ( t - t0 ) / ( t1 - t0 ), + pp = p * p, + ppp = pp * p; + + // evaluate polynomials + + var sP = - wP * ppp + 2 * wP * pp - wP * p; + var s0 = ( 1 + wP ) * ppp + (-1.5 - 2 * wP ) * pp + ( -0.5 + wP ) * p + 1; + var s1 = (-1 - wN ) * ppp + ( 1.5 + wN ) * pp + 0.5 * p; + var sN = wN * ppp - wN * pp; + + // combine data linearly + + for ( var i = 0; i !== stride; ++ i ) { + + result[ i ] = + sP * values[ oP + i ] + + s0 * values[ o0 + i ] + + s1 * values[ o1 + i ] + + sN * values[ oN + i ]; + + } + + return result; + + } + + } ); + + /** + * @author tschw + */ + + function LinearInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer ); + + } + + LinearInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), { + + constructor: LinearInterpolant, + + interpolate_: function( i1, t0, t, t1 ) { + + var result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + + offset1 = i1 * stride, + offset0 = offset1 - stride, + + weight1 = ( t - t0 ) / ( t1 - t0 ), + weight0 = 1 - weight1; + + for ( var i = 0; i !== stride; ++ i ) { + + result[ i ] = + values[ offset0 + i ] * weight0 + + values[ offset1 + i ] * weight1; + + } + + return result; + + } + + } ); + + /** + * + * Interpolant that evaluates to the sample value at the position preceeding + * the parameter. + * + * @author tschw + */ + + function DiscreteInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer ); + + } + + DiscreteInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), { + + constructor: DiscreteInterpolant, + + interpolate_: function( i1, t0, t, t1 ) { + + return this.copySampleValue_( i1 - 1 ); + + } + + } ); + + var KeyframeTrackPrototype; + + KeyframeTrackPrototype = { + + TimeBufferType: Float32Array, + ValueBufferType: Float32Array, + + DefaultInterpolation: InterpolateLinear, + + InterpolantFactoryMethodDiscrete: function ( result ) { + + return new DiscreteInterpolant( + this.times, this.values, this.getValueSize(), result ); + + }, + + InterpolantFactoryMethodLinear: function ( result ) { + + return new LinearInterpolant( + this.times, this.values, this.getValueSize(), result ); + + }, + + InterpolantFactoryMethodSmooth: function ( result ) { + + return new CubicInterpolant( + this.times, this.values, this.getValueSize(), result ); + + }, + + setInterpolation: function ( interpolation ) { + + var factoryMethod; + + switch ( interpolation ) { + + case InterpolateDiscrete: + + factoryMethod = this.InterpolantFactoryMethodDiscrete; + + break; + + case InterpolateLinear: + + factoryMethod = this.InterpolantFactoryMethodLinear; + + break; + + case InterpolateSmooth: + + factoryMethod = this.InterpolantFactoryMethodSmooth; + + break; + + } + + if ( factoryMethod === undefined ) { + + var message = "unsupported interpolation for " + + this.ValueTypeName + " keyframe track named " + this.name; + + if ( this.createInterpolant === undefined ) { + + // fall back to default, unless the default itself is messed up + if ( interpolation !== this.DefaultInterpolation ) { + + this.setInterpolation( this.DefaultInterpolation ); + + } else { + + throw new Error( message ); // fatal, in this case + + } + + } + + console.warn( message ); + return; + + } + + this.createInterpolant = factoryMethod; + + }, + + getInterpolation: function () { + + switch ( this.createInterpolant ) { + + case this.InterpolantFactoryMethodDiscrete: + + return InterpolateDiscrete; + + case this.InterpolantFactoryMethodLinear: + + return InterpolateLinear; + + case this.InterpolantFactoryMethodSmooth: + + return InterpolateSmooth; + + } + + }, + + getValueSize: function () { + + return this.values.length / this.times.length; + + }, + + // move all keyframes either forwards or backwards in time + shift: function ( timeOffset ) { + + if ( timeOffset !== 0.0 ) { + + var times = this.times; + + for ( var i = 0, n = times.length; i !== n; ++ i ) { + + times[ i ] += timeOffset; + + } + + } + + return this; + + }, + + // scale all keyframe times by a factor (useful for frame <-> seconds conversions) + scale: function ( timeScale ) { + + if ( timeScale !== 1.0 ) { + + var times = this.times; + + for ( var i = 0, n = times.length; i !== n; ++ i ) { + + times[ i ] *= timeScale; + + } + + } + + return this; + + }, + + // removes keyframes before and after animation without changing any values within the range [startTime, endTime]. + // IMPORTANT: We do not shift around keys to the start of the track time, because for interpolated keys this will change their values + trim: function ( startTime, endTime ) { + + var times = this.times, + nKeys = times.length, + from = 0, + to = nKeys - 1; + + while ( from !== nKeys && times[ from ] < startTime ) ++ from; + while ( to !== - 1 && times[ to ] > endTime ) -- to; + + ++ to; // inclusive -> exclusive bound + + if ( from !== 0 || to !== nKeys ) { + + // empty tracks are forbidden, so keep at least one keyframe + if ( from >= to ) to = Math.max( to, 1 ), from = to - 1; + + var stride = this.getValueSize(); + this.times = AnimationUtils.arraySlice( times, from, to ); + this.values = AnimationUtils. + arraySlice( this.values, from * stride, to * stride ); + + } + + return this; + + }, + + // ensure we do not get a GarbageInGarbageOut situation, make sure tracks are at least minimally viable + validate: function () { + + var valid = true; + + var valueSize = this.getValueSize(); + if ( valueSize - Math.floor( valueSize ) !== 0 ) { + + console.error( "invalid value size in track", this ); + valid = false; + + } + + var times = this.times, + values = this.values, + + nKeys = times.length; + + if ( nKeys === 0 ) { + + console.error( "track is empty", this ); + valid = false; + + } + + var prevTime = null; + + for ( var i = 0; i !== nKeys; i ++ ) { + + var currTime = times[ i ]; + + if ( typeof currTime === 'number' && isNaN( currTime ) ) { + + console.error( "time is not a valid number", this, i, currTime ); + valid = false; + break; + + } + + if ( prevTime !== null && prevTime > currTime ) { + + console.error( "out of order keys", this, i, currTime, prevTime ); + valid = false; + break; + + } + + prevTime = currTime; + + } + + if ( values !== undefined ) { + + if ( AnimationUtils.isTypedArray( values ) ) { + + for ( var i = 0, n = values.length; i !== n; ++ i ) { + + var value = values[ i ]; + + if ( isNaN( value ) ) { + + console.error( "value is not a valid number", this, i, value ); + valid = false; + break; + + } + + } + + } + + } + + return valid; + + }, + + // removes equivalent sequential keys as common in morph target sequences + // (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0) + optimize: function () { + + var times = this.times, + values = this.values, + stride = this.getValueSize(), + + smoothInterpolation = this.getInterpolation() === InterpolateSmooth, + + writeIndex = 1, + lastIndex = times.length - 1; + + for ( var i = 1; i < lastIndex; ++ i ) { + + var keep = false; + + var time = times[ i ]; + var timeNext = times[ i + 1 ]; + + // remove adjacent keyframes scheduled at the same time + + if ( time !== timeNext && ( i !== 1 || time !== time[ 0 ] ) ) { + + if ( ! smoothInterpolation ) { + + // remove unnecessary keyframes same as their neighbors + + var offset = i * stride, + offsetP = offset - stride, + offsetN = offset + stride; + + for ( var j = 0; j !== stride; ++ j ) { + + var value = values[ offset + j ]; + + if ( value !== values[ offsetP + j ] || + value !== values[ offsetN + j ] ) { + + keep = true; + break; + + } + + } + + } else keep = true; + + } + + // in-place compaction + + if ( keep ) { + + if ( i !== writeIndex ) { + + times[ writeIndex ] = times[ i ]; + + var readOffset = i * stride, + writeOffset = writeIndex * stride; + + for ( var j = 0; j !== stride; ++ j ) + + values[ writeOffset + j ] = values[ readOffset + j ]; + + } + + ++ writeIndex; + + } + + } + + // flush last keyframe (compaction looks ahead) + + if ( lastIndex > 0 ) { + + times[ writeIndex ] = times[ lastIndex ]; + + for ( var readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j ) + + values[ writeOffset + j ] = values[ readOffset + j ]; + + ++ writeIndex; + + } + + if ( writeIndex !== times.length ) { + + this.times = AnimationUtils.arraySlice( times, 0, writeIndex ); + this.values = AnimationUtils.arraySlice( values, 0, writeIndex * stride ); + + } + + return this; + + } + + }; + + function KeyframeTrackConstructor( name, times, values, interpolation ) { + + if ( name === undefined ) throw new Error( "track name is undefined" ); + + if ( times === undefined || times.length === 0 ) { + + throw new Error( "no keyframes in track named " + name ); + + } + + this.name = name; + + this.times = AnimationUtils.convertArray( times, this.TimeBufferType ); + this.values = AnimationUtils.convertArray( values, this.ValueBufferType ); + + this.setInterpolation( interpolation || this.DefaultInterpolation ); + + this.validate(); + this.optimize(); + + } + + /** + * + * A Track of vectored keyframe values. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function VectorKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrackConstructor.call( this, name, times, values, interpolation ); + + } + + VectorKeyframeTrack.prototype = + Object.assign( Object.create( KeyframeTrackPrototype ), { + + constructor: VectorKeyframeTrack, + + ValueTypeName: 'vector' + + // ValueBufferType is inherited + + // DefaultInterpolation is inherited + + } ); + + /** + * Spherical linear unit quaternion interpolant. + * + * @author tschw + */ + + function QuaternionLinearInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer ); + + } + + QuaternionLinearInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), { + + constructor: QuaternionLinearInterpolant, + + interpolate_: function( i1, t0, t, t1 ) { + + var result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + + offset = i1 * stride, + + alpha = ( t - t0 ) / ( t1 - t0 ); + + for ( var end = offset + stride; offset !== end; offset += 4 ) { + + Quaternion.slerpFlat( result, 0, + values, offset - stride, values, offset, alpha ); + + } + + return result; + + } + + } ); + + /** + * + * A Track of quaternion keyframe values. + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function QuaternionKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrackConstructor.call( this, name, times, values, interpolation ); + + } + + QuaternionKeyframeTrack.prototype = + Object.assign( Object.create( KeyframeTrackPrototype ), { + + constructor: QuaternionKeyframeTrack, + + ValueTypeName: 'quaternion', + + // ValueBufferType is inherited + + DefaultInterpolation: InterpolateLinear, + + InterpolantFactoryMethodLinear: function( result ) { + + return new QuaternionLinearInterpolant( + this.times, this.values, this.getValueSize(), result ); + + }, + + InterpolantFactoryMethodSmooth: undefined // not yet implemented + + } ); + + /** + * + * A Track of numeric keyframe values. + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function NumberKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrackConstructor.call( this, name, times, values, interpolation ); + + } + + NumberKeyframeTrack.prototype = + Object.assign( Object.create( KeyframeTrackPrototype ), { + + constructor: NumberKeyframeTrack, + + ValueTypeName: 'number' + + // ValueBufferType is inherited + + // DefaultInterpolation is inherited + + } ); + + /** + * + * A Track that interpolates Strings + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function StringKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrackConstructor.call( this, name, times, values, interpolation ); + + } + + StringKeyframeTrack.prototype = + Object.assign( Object.create( KeyframeTrackPrototype ), { + + constructor: StringKeyframeTrack, + + ValueTypeName: 'string', + ValueBufferType: Array, + + DefaultInterpolation: InterpolateDiscrete, + + InterpolantFactoryMethodLinear: undefined, + + InterpolantFactoryMethodSmooth: undefined + + } ); + + /** + * + * A Track of Boolean keyframe values. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function BooleanKeyframeTrack( name, times, values ) { + + KeyframeTrackConstructor.call( this, name, times, values ); + + } + + BooleanKeyframeTrack.prototype = + Object.assign( Object.create( KeyframeTrackPrototype ), { + + constructor: BooleanKeyframeTrack, + + ValueTypeName: 'bool', + ValueBufferType: Array, + + DefaultInterpolation: InterpolateDiscrete, + + InterpolantFactoryMethodLinear: undefined, + InterpolantFactoryMethodSmooth: undefined + + // Note: Actually this track could have a optimized / compressed + // representation of a single value and a custom interpolant that + // computes "firstValue ^ isOdd( index )". + + } ); + + /** + * + * A Track of keyframe values that represent color. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function ColorKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrackConstructor.call( this, name, times, values, interpolation ); + + } + + ColorKeyframeTrack.prototype = + Object.assign( Object.create( KeyframeTrackPrototype ), { + + constructor: ColorKeyframeTrack, + + ValueTypeName: 'color' + + // ValueBufferType is inherited + + // DefaultInterpolation is inherited + + + // Note: Very basic implementation and nothing special yet. + // However, this is the place for color space parameterization. + + } ); + + /** + * + * A timed sequence of keyframes for a specific property. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function KeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrackConstructor.apply( this, arguments ); + + } + + KeyframeTrack.prototype = KeyframeTrackPrototype; + KeyframeTrackPrototype.constructor = KeyframeTrack; + + // Static methods: + + Object.assign( KeyframeTrack, { + + // Serialization (in static context, because of constructor invocation + // and automatic invocation of .toJSON): + + parse: function( json ) { + + if( json.type === undefined ) { + + throw new Error( "track type undefined, can not parse" ); + + } + + var trackType = KeyframeTrack._getTrackTypeForValueTypeName( json.type ); + + if ( json.times === undefined ) { + + var times = [], values = []; + + AnimationUtils.flattenJSON( json.keys, times, values, 'value' ); + + json.times = times; + json.values = values; + + } + + // derived classes can define a static parse method + if ( trackType.parse !== undefined ) { + + return trackType.parse( json ); + + } else { + + // by default, we asssume a constructor compatible with the base + return new trackType( + json.name, json.times, json.values, json.interpolation ); + + } + + }, + + toJSON: function( track ) { + + var trackType = track.constructor; + + var json; + + // derived classes can define a static toJSON method + if ( trackType.toJSON !== undefined ) { + + json = trackType.toJSON( track ); + + } else { + + // by default, we assume the data can be serialized as-is + json = { + + 'name': track.name, + 'times': AnimationUtils.convertArray( track.times, Array ), + 'values': AnimationUtils.convertArray( track.values, Array ) + + }; + + var interpolation = track.getInterpolation(); + + if ( interpolation !== track.DefaultInterpolation ) { + + json.interpolation = interpolation; + + } + + } + + json.type = track.ValueTypeName; // mandatory + + return json; + + }, + + _getTrackTypeForValueTypeName: function( typeName ) { + + switch( typeName.toLowerCase() ) { + + case "scalar": + case "double": + case "float": + case "number": + case "integer": + + return NumberKeyframeTrack; + + case "vector": + case "vector2": + case "vector3": + case "vector4": + + return VectorKeyframeTrack; + + case "color": + + return ColorKeyframeTrack; + + case "quaternion": + + return QuaternionKeyframeTrack; + + case "bool": + case "boolean": + + return BooleanKeyframeTrack; + + case "string": + + return StringKeyframeTrack; + + } + + throw new Error( "Unsupported typeName: " + typeName ); + + } + + } ); + + /** + * + * Reusable set of Tracks that represent an animation. + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + */ + + function AnimationClip( name, duration, tracks ) { + + this.name = name; + this.tracks = tracks; + this.duration = ( duration !== undefined ) ? duration : - 1; + + this.uuid = _Math.generateUUID(); + + // this means it should figure out its duration by scanning the tracks + if ( this.duration < 0 ) { + + this.resetDuration(); + + } + + this.optimize(); + + } + + Object.assign( AnimationClip, { + + parse: function ( json ) { + + var tracks = [], + jsonTracks = json.tracks, + frameTime = 1.0 / ( json.fps || 1.0 ); + + for ( var i = 0, n = jsonTracks.length; i !== n; ++ i ) { + + tracks.push( KeyframeTrack.parse( jsonTracks[ i ] ).scale( frameTime ) ); + + } + + return new AnimationClip( json.name, json.duration, tracks ); + + }, + + toJSON: function ( clip ) { + + var tracks = [], + clipTracks = clip.tracks; + + var json = { + + 'name': clip.name, + 'duration': clip.duration, + 'tracks': tracks + + }; + + for ( var i = 0, n = clipTracks.length; i !== n; ++ i ) { + + tracks.push( KeyframeTrack.toJSON( clipTracks[ i ] ) ); + + } + + return json; + + }, + + CreateFromMorphTargetSequence: function ( name, morphTargetSequence, fps, noLoop ) { + + var numMorphTargets = morphTargetSequence.length; + var tracks = []; + + for ( var i = 0; i < numMorphTargets; i ++ ) { + + var times = []; + var values = []; + + times.push( + ( i + numMorphTargets - 1 ) % numMorphTargets, + i, + ( i + 1 ) % numMorphTargets ); + + values.push( 0, 1, 0 ); + + var order = AnimationUtils.getKeyframeOrder( times ); + times = AnimationUtils.sortedArray( times, 1, order ); + values = AnimationUtils.sortedArray( values, 1, order ); + + // if there is a key at the first frame, duplicate it as the + // last frame as well for perfect loop. + if ( ! noLoop && times[ 0 ] === 0 ) { + + times.push( numMorphTargets ); + values.push( values[ 0 ] ); + + } + + tracks.push( + new NumberKeyframeTrack( + '.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']', + times, values + ).scale( 1.0 / fps ) ); + + } + + return new AnimationClip( name, - 1, tracks ); + + }, + + findByName: function ( objectOrClipArray, name ) { + + var clipArray = objectOrClipArray; + + if ( ! Array.isArray( objectOrClipArray ) ) { + + var o = objectOrClipArray; + clipArray = o.geometry && o.geometry.animations || o.animations; + + } + + for ( var i = 0; i < clipArray.length; i ++ ) { + + if ( clipArray[ i ].name === name ) { + + return clipArray[ i ]; + + } + + } + + return null; + + }, + + CreateClipsFromMorphTargetSequences: function ( morphTargets, fps, noLoop ) { + + var animationToMorphTargets = {}; + + // tested with https://regex101.com/ on trick sequences + // such flamingo_flyA_003, flamingo_run1_003, crdeath0059 + var pattern = /^([\w-]*?)([\d]+)$/; + + // sort morph target names into animation groups based + // patterns like Walk_001, Walk_002, Run_001, Run_002 + for ( var i = 0, il = morphTargets.length; i < il; i ++ ) { + + var morphTarget = morphTargets[ i ]; + var parts = morphTarget.name.match( pattern ); + + if ( parts && parts.length > 1 ) { + + var name = parts[ 1 ]; + + var animationMorphTargets = animationToMorphTargets[ name ]; + if ( ! animationMorphTargets ) { + + animationToMorphTargets[ name ] = animationMorphTargets = []; + + } + + animationMorphTargets.push( morphTarget ); + + } + + } + + var clips = []; + + for ( var name in animationToMorphTargets ) { + + clips.push( AnimationClip.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) ); + + } + + return clips; + + }, + + // parse the animation.hierarchy format + parseAnimation: function ( animation, bones ) { + + if ( ! animation ) { + + console.error( " no animation in JSONLoader data" ); + return null; + + } + + var addNonemptyTrack = function ( trackType, trackName, animationKeys, propertyName, destTracks ) { + + // only return track if there are actually keys. + if ( animationKeys.length !== 0 ) { + + var times = []; + var values = []; + + AnimationUtils.flattenJSON( animationKeys, times, values, propertyName ); + + // empty keys are filtered out, so check again + if ( times.length !== 0 ) { + + destTracks.push( new trackType( trackName, times, values ) ); + + } + + } + + }; + + var tracks = []; + + var clipName = animation.name || 'default'; + // automatic length determination in AnimationClip. + var duration = animation.length || - 1; + var fps = animation.fps || 30; + + var hierarchyTracks = animation.hierarchy || []; + + for ( var h = 0; h < hierarchyTracks.length; h ++ ) { + + var animationKeys = hierarchyTracks[ h ].keys; + + // skip empty tracks + if ( ! animationKeys || animationKeys.length === 0 ) continue; + + // process morph targets in a way exactly compatible + // with AnimationHandler.init( animation ) + if ( animationKeys[ 0 ].morphTargets ) { + + // figure out all morph targets used in this track + var morphTargetNames = {}; + + for ( var k = 0; k < animationKeys.length; k ++ ) { + + if ( animationKeys[ k ].morphTargets ) { + + for ( var m = 0; m < animationKeys[ k ].morphTargets.length; m ++ ) { + + morphTargetNames[ animationKeys[ k ].morphTargets[ m ] ] = - 1; + + } + + } + + } + + // create a track for each morph target with all zero + // morphTargetInfluences except for the keys in which + // the morphTarget is named. + for ( var morphTargetName in morphTargetNames ) { + + var times = []; + var values = []; + + for ( var m = 0; m !== animationKeys[ k ].morphTargets.length; ++ m ) { + + var animationKey = animationKeys[ k ]; + + times.push( animationKey.time ); + values.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 ); + + } + + tracks.push( new NumberKeyframeTrack( '.morphTargetInfluence[' + morphTargetName + ']', times, values ) ); + + } + + duration = morphTargetNames.length * ( fps || 1.0 ); + + } else { + + // ...assume skeletal animation + + var boneName = '.bones[' + bones[ h ].name + ']'; + + addNonemptyTrack( + VectorKeyframeTrack, boneName + '.position', + animationKeys, 'pos', tracks ); + + addNonemptyTrack( + QuaternionKeyframeTrack, boneName + '.quaternion', + animationKeys, 'rot', tracks ); + + addNonemptyTrack( + VectorKeyframeTrack, boneName + '.scale', + animationKeys, 'scl', tracks ); + + } + + } + + if ( tracks.length === 0 ) { + + return null; + + } + + var clip = new AnimationClip( clipName, duration, tracks ); + + return clip; + + } + + } ); + + Object.assign( AnimationClip.prototype, { + + resetDuration: function () { + + var tracks = this.tracks, duration = 0; + + for ( var i = 0, n = tracks.length; i !== n; ++ i ) { + + var track = this.tracks[ i ]; + + duration = Math.max( duration, track.times[ track.times.length - 1 ] ); + + } + + this.duration = duration; + + }, + + trim: function () { + + for ( var i = 0; i < this.tracks.length; i ++ ) { + + this.tracks[ i ].trim( 0, this.duration ); + + } + + return this; + + }, + + optimize: function () { + + for ( var i = 0; i < this.tracks.length; i ++ ) { + + this.tracks[ i ].optimize(); + + } + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function MaterialLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + this.textures = {}; + + } + + Object.assign( MaterialLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var loader = new FileLoader( scope.manager ); + loader.setResponseType( 'json' ); + loader.load( url, function ( json ) { + + onLoad( scope.parse( json ) ); + + }, onProgress, onError ); + + }, + + setTextures: function ( value ) { + + this.textures = value; + + }, + + parse: function ( json ) { + + var textures = this.textures; + + function getTexture( name ) { + + if ( textures[ name ] === undefined ) { + + console.warn( 'THREE.MaterialLoader: Undefined texture', name ); + + } + + return textures[ name ]; + + } + + var material = new Materials[ json.type ](); + + if ( json.uuid !== undefined ) material.uuid = json.uuid; + if ( json.name !== undefined ) material.name = json.name; + if ( json.color !== undefined ) material.color.setHex( json.color ); + if ( json.roughness !== undefined ) material.roughness = json.roughness; + if ( json.metalness !== undefined ) material.metalness = json.metalness; + if ( json.emissive !== undefined ) material.emissive.setHex( json.emissive ); + if ( json.specular !== undefined ) material.specular.setHex( json.specular ); + if ( json.shininess !== undefined ) material.shininess = json.shininess; + if ( json.clearCoat !== undefined ) material.clearCoat = json.clearCoat; + if ( json.clearCoatRoughness !== undefined ) material.clearCoatRoughness = json.clearCoatRoughness; + if ( json.uniforms !== undefined ) material.uniforms = json.uniforms; + if ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader; + if ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader; + if ( json.vertexColors !== undefined ) material.vertexColors = json.vertexColors; + if ( json.fog !== undefined ) material.fog = json.fog; + if ( json.shading !== undefined ) material.shading = json.shading; + if ( json.blending !== undefined ) material.blending = json.blending; + if ( json.side !== undefined ) material.side = json.side; + if ( json.opacity !== undefined ) material.opacity = json.opacity; + if ( json.transparent !== undefined ) material.transparent = json.transparent; + if ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest; + if ( json.depthTest !== undefined ) material.depthTest = json.depthTest; + if ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite; + if ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite; + if ( json.wireframe !== undefined ) material.wireframe = json.wireframe; + if ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth; + if ( json.wireframeLinecap !== undefined ) material.wireframeLinecap = json.wireframeLinecap; + if ( json.wireframeLinejoin !== undefined ) material.wireframeLinejoin = json.wireframeLinejoin; + if ( json.skinning !== undefined ) material.skinning = json.skinning; + if ( json.morphTargets !== undefined ) material.morphTargets = json.morphTargets; + + // for PointsMaterial + + if ( json.size !== undefined ) material.size = json.size; + if ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation; + + // maps + + if ( json.map !== undefined ) material.map = getTexture( json.map ); + + if ( json.alphaMap !== undefined ) { + + material.alphaMap = getTexture( json.alphaMap ); + material.transparent = true; + + } + + if ( json.bumpMap !== undefined ) material.bumpMap = getTexture( json.bumpMap ); + if ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale; + + if ( json.normalMap !== undefined ) material.normalMap = getTexture( json.normalMap ); + if ( json.normalScale !== undefined ) { + + var normalScale = json.normalScale; + + if ( Array.isArray( normalScale ) === false ) { + + // Blender exporter used to export a scalar. See #7459 + + normalScale = [ normalScale, normalScale ]; + + } + + material.normalScale = new Vector2().fromArray( normalScale ); + + } + + if ( json.displacementMap !== undefined ) material.displacementMap = getTexture( json.displacementMap ); + if ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale; + if ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias; + + if ( json.roughnessMap !== undefined ) material.roughnessMap = getTexture( json.roughnessMap ); + if ( json.metalnessMap !== undefined ) material.metalnessMap = getTexture( json.metalnessMap ); + + if ( json.emissiveMap !== undefined ) material.emissiveMap = getTexture( json.emissiveMap ); + if ( json.emissiveIntensity !== undefined ) material.emissiveIntensity = json.emissiveIntensity; + + if ( json.specularMap !== undefined ) material.specularMap = getTexture( json.specularMap ); + + if ( json.envMap !== undefined ) material.envMap = getTexture( json.envMap ); + + if ( json.reflectivity !== undefined ) material.reflectivity = json.reflectivity; + + if ( json.lightMap !== undefined ) material.lightMap = getTexture( json.lightMap ); + if ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity; + + if ( json.aoMap !== undefined ) material.aoMap = getTexture( json.aoMap ); + if ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity; + + if ( json.gradientMap !== undefined ) material.gradientMap = getTexture( json.gradientMap ); + + return material; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function BufferGeometryLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( BufferGeometryLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var loader = new FileLoader( scope.manager ); + loader.setResponseType( 'json' ); + loader.load( url, function ( json ) { + + onLoad( scope.parse( json ) ); + + }, onProgress, onError ); + + }, + + parse: function ( json ) { + + var geometry = new BufferGeometry(); + + var index = json.data.index; + + if ( index !== undefined ) { + + var typedArray = new TYPED_ARRAYS[ index.type ]( index.array ); + geometry.setIndex( new BufferAttribute( typedArray, 1 ) ); + + } + + var attributes = json.data.attributes; + + for ( var key in attributes ) { + + var attribute = attributes[ key ]; + var typedArray = new TYPED_ARRAYS[ attribute.type ]( attribute.array ); + + geometry.addAttribute( key, new BufferAttribute( typedArray, attribute.itemSize, attribute.normalized ) ); + + } + + var groups = json.data.groups || json.data.drawcalls || json.data.offsets; + + if ( groups !== undefined ) { + + for ( var i = 0, n = groups.length; i !== n; ++ i ) { + + var group = groups[ i ]; + + geometry.addGroup( group.start, group.count, group.materialIndex ); + + } + + } + + var boundingSphere = json.data.boundingSphere; + + if ( boundingSphere !== undefined ) { + + var center = new Vector3(); + + if ( boundingSphere.center !== undefined ) { + + center.fromArray( boundingSphere.center ); + + } + + geometry.boundingSphere = new Sphere( center, boundingSphere.radius ); + + } + + return geometry; + + } + + } ); + + var TYPED_ARRAYS = { + Int8Array: Int8Array, + Uint8Array: Uint8Array, + Uint8ClampedArray: Uint8ClampedArray, + Int16Array: Int16Array, + Uint16Array: Uint16Array, + Int32Array: Int32Array, + Uint32Array: Uint32Array, + Float32Array: Float32Array, + Float64Array: Float64Array + }; + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function Loader() { + + this.onLoadStart = function () {}; + this.onLoadProgress = function () {}; + this.onLoadComplete = function () {}; + + } + + Loader.Handlers = { + + handlers: [], + + add: function ( regex, loader ) { + + this.handlers.push( regex, loader ); + + }, + + get: function ( file ) { + + var handlers = this.handlers; + + for ( var i = 0, l = handlers.length; i < l; i += 2 ) { + + var regex = handlers[ i ]; + var loader = handlers[ i + 1 ]; + + if ( regex.test( file ) ) { + + return loader; + + } + + } + + return null; + + } + + }; + + Object.assign( Loader.prototype, { + + crossOrigin: undefined, + + extractUrlBase: function ( url ) { + + var parts = url.split( '/' ); + + if ( parts.length === 1 ) return './'; + + parts.pop(); + + return parts.join( '/' ) + '/'; + + }, + + initMaterials: function ( materials, texturePath, crossOrigin ) { + + var array = []; + + for ( var i = 0; i < materials.length; ++ i ) { + + array[ i ] = this.createMaterial( materials[ i ], texturePath, crossOrigin ); + + } + + return array; + + }, + + createMaterial: ( function () { + + var BlendingMode = { + NoBlending: NoBlending, + NormalBlending: NormalBlending, + AdditiveBlending: AdditiveBlending, + SubtractiveBlending: SubtractiveBlending, + MultiplyBlending: MultiplyBlending, + CustomBlending: CustomBlending + }; + + var color = new Color(); + var textureLoader = new TextureLoader(); + var materialLoader = new MaterialLoader(); + + return function createMaterial( m, texturePath, crossOrigin ) { + + // convert from old material format + + var textures = {}; + + function loadTexture( path, repeat, offset, wrap, anisotropy ) { + + var fullPath = texturePath + path; + var loader = Loader.Handlers.get( fullPath ); + + var texture; + + if ( loader !== null ) { + + texture = loader.load( fullPath ); + + } else { + + textureLoader.setCrossOrigin( crossOrigin ); + texture = textureLoader.load( fullPath ); + + } + + if ( repeat !== undefined ) { + + texture.repeat.fromArray( repeat ); + + if ( repeat[ 0 ] !== 1 ) texture.wrapS = RepeatWrapping; + if ( repeat[ 1 ] !== 1 ) texture.wrapT = RepeatWrapping; + + } + + if ( offset !== undefined ) { + + texture.offset.fromArray( offset ); + + } + + if ( wrap !== undefined ) { + + if ( wrap[ 0 ] === 'repeat' ) texture.wrapS = RepeatWrapping; + if ( wrap[ 0 ] === 'mirror' ) texture.wrapS = MirroredRepeatWrapping; + + if ( wrap[ 1 ] === 'repeat' ) texture.wrapT = RepeatWrapping; + if ( wrap[ 1 ] === 'mirror' ) texture.wrapT = MirroredRepeatWrapping; + + } + + if ( anisotropy !== undefined ) { + + texture.anisotropy = anisotropy; + + } + + var uuid = _Math.generateUUID(); + + textures[ uuid ] = texture; + + return uuid; + + } + + // + + var json = { + uuid: _Math.generateUUID(), + type: 'MeshLambertMaterial' + }; + + for ( var name in m ) { + + var value = m[ name ]; + + switch ( name ) { + + case 'DbgColor': + case 'DbgIndex': + case 'opticalDensity': + case 'illumination': + break; + case 'DbgName': + json.name = value; + break; + case 'blending': + json.blending = BlendingMode[ value ]; + break; + case 'colorAmbient': + case 'mapAmbient': + console.warn( 'THREE.Loader.createMaterial:', name, 'is no longer supported.' ); + break; + case 'colorDiffuse': + json.color = color.fromArray( value ).getHex(); + break; + case 'colorSpecular': + json.specular = color.fromArray( value ).getHex(); + break; + case 'colorEmissive': + json.emissive = color.fromArray( value ).getHex(); + break; + case 'specularCoef': + json.shininess = value; + break; + case 'shading': + if ( value.toLowerCase() === 'basic' ) json.type = 'MeshBasicMaterial'; + if ( value.toLowerCase() === 'phong' ) json.type = 'MeshPhongMaterial'; + if ( value.toLowerCase() === 'standard' ) json.type = 'MeshStandardMaterial'; + break; + case 'mapDiffuse': + json.map = loadTexture( value, m.mapDiffuseRepeat, m.mapDiffuseOffset, m.mapDiffuseWrap, m.mapDiffuseAnisotropy ); + break; + case 'mapDiffuseRepeat': + case 'mapDiffuseOffset': + case 'mapDiffuseWrap': + case 'mapDiffuseAnisotropy': + break; + case 'mapEmissive': + json.emissiveMap = loadTexture( value, m.mapEmissiveRepeat, m.mapEmissiveOffset, m.mapEmissiveWrap, m.mapEmissiveAnisotropy ); + break; + case 'mapEmissiveRepeat': + case 'mapEmissiveOffset': + case 'mapEmissiveWrap': + case 'mapEmissiveAnisotropy': + break; + case 'mapLight': + json.lightMap = loadTexture( value, m.mapLightRepeat, m.mapLightOffset, m.mapLightWrap, m.mapLightAnisotropy ); + break; + case 'mapLightRepeat': + case 'mapLightOffset': + case 'mapLightWrap': + case 'mapLightAnisotropy': + break; + case 'mapAO': + json.aoMap = loadTexture( value, m.mapAORepeat, m.mapAOOffset, m.mapAOWrap, m.mapAOAnisotropy ); + break; + case 'mapAORepeat': + case 'mapAOOffset': + case 'mapAOWrap': + case 'mapAOAnisotropy': + break; + case 'mapBump': + json.bumpMap = loadTexture( value, m.mapBumpRepeat, m.mapBumpOffset, m.mapBumpWrap, m.mapBumpAnisotropy ); + break; + case 'mapBumpScale': + json.bumpScale = value; + break; + case 'mapBumpRepeat': + case 'mapBumpOffset': + case 'mapBumpWrap': + case 'mapBumpAnisotropy': + break; + case 'mapNormal': + json.normalMap = loadTexture( value, m.mapNormalRepeat, m.mapNormalOffset, m.mapNormalWrap, m.mapNormalAnisotropy ); + break; + case 'mapNormalFactor': + json.normalScale = [ value, value ]; + break; + case 'mapNormalRepeat': + case 'mapNormalOffset': + case 'mapNormalWrap': + case 'mapNormalAnisotropy': + break; + case 'mapSpecular': + json.specularMap = loadTexture( value, m.mapSpecularRepeat, m.mapSpecularOffset, m.mapSpecularWrap, m.mapSpecularAnisotropy ); + break; + case 'mapSpecularRepeat': + case 'mapSpecularOffset': + case 'mapSpecularWrap': + case 'mapSpecularAnisotropy': + break; + case 'mapMetalness': + json.metalnessMap = loadTexture( value, m.mapMetalnessRepeat, m.mapMetalnessOffset, m.mapMetalnessWrap, m.mapMetalnessAnisotropy ); + break; + case 'mapMetalnessRepeat': + case 'mapMetalnessOffset': + case 'mapMetalnessWrap': + case 'mapMetalnessAnisotropy': + break; + case 'mapRoughness': + json.roughnessMap = loadTexture( value, m.mapRoughnessRepeat, m.mapRoughnessOffset, m.mapRoughnessWrap, m.mapRoughnessAnisotropy ); + break; + case 'mapRoughnessRepeat': + case 'mapRoughnessOffset': + case 'mapRoughnessWrap': + case 'mapRoughnessAnisotropy': + break; + case 'mapAlpha': + json.alphaMap = loadTexture( value, m.mapAlphaRepeat, m.mapAlphaOffset, m.mapAlphaWrap, m.mapAlphaAnisotropy ); + break; + case 'mapAlphaRepeat': + case 'mapAlphaOffset': + case 'mapAlphaWrap': + case 'mapAlphaAnisotropy': + break; + case 'flipSided': + json.side = BackSide; + break; + case 'doubleSided': + json.side = DoubleSide; + break; + case 'transparency': + console.warn( 'THREE.Loader.createMaterial: transparency has been renamed to opacity' ); + json.opacity = value; + break; + case 'depthTest': + case 'depthWrite': + case 'colorWrite': + case 'opacity': + case 'reflectivity': + case 'transparent': + case 'visible': + case 'wireframe': + json[ name ] = value; + break; + case 'vertexColors': + if ( value === true ) json.vertexColors = VertexColors; + if ( value === 'face' ) json.vertexColors = FaceColors; + break; + default: + console.error( 'THREE.Loader.createMaterial: Unsupported', name, value ); + break; + + } + + } + + if ( json.type === 'MeshBasicMaterial' ) delete json.emissive; + if ( json.type !== 'MeshPhongMaterial' ) delete json.specular; + + if ( json.opacity < 1 ) json.transparent = true; + + materialLoader.setTextures( textures ); + + return materialLoader.parse( json ); + + }; + + } )() + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function JSONLoader( manager ) { + + if ( typeof manager === 'boolean' ) { + + console.warn( 'THREE.JSONLoader: showStatus parameter has been removed from constructor.' ); + manager = undefined; + + } + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + this.withCredentials = false; + + } + + Object.assign( JSONLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var texturePath = this.texturePath && ( typeof this.texturePath === "string" ) ? this.texturePath : Loader.prototype.extractUrlBase( url ); + + var loader = new FileLoader( this.manager ); + loader.setResponseType( 'json' ); + loader.setWithCredentials( this.withCredentials ); + loader.load( url, function ( json ) { + + var metadata = json.metadata; + + if ( metadata !== undefined ) { + + var type = metadata.type; + + if ( type !== undefined ) { + + if ( type.toLowerCase() === 'object' ) { + + console.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.ObjectLoader instead.' ); + return; + + } + + if ( type.toLowerCase() === 'scene' ) { + + console.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.SceneLoader instead.' ); + return; + + } + + } + + } + + var object = scope.parse( json, texturePath ); + onLoad( object.geometry, object.materials ); + + }, onProgress, onError ); + + }, + + setTexturePath: function ( value ) { + + this.texturePath = value; + + }, + + parse: ( function () { + + function parseModel( json, geometry ) { + + function isBitSet( value, position ) { + + return value & ( 1 << position ); + + } + + var i, j, fi, + + offset, zLength, + + colorIndex, normalIndex, uvIndex, materialIndex, + + type, + isQuad, + hasMaterial, + hasFaceVertexUv, + hasFaceNormal, hasFaceVertexNormal, + hasFaceColor, hasFaceVertexColor, + + vertex, face, faceA, faceB, hex, normal, + + uvLayer, uv, u, v, + + faces = json.faces, + vertices = json.vertices, + normals = json.normals, + colors = json.colors, + + scale = json.scale, + + nUvLayers = 0; + + + if ( json.uvs !== undefined ) { + + // disregard empty arrays + + for ( i = 0; i < json.uvs.length; i ++ ) { + + if ( json.uvs[ i ].length ) nUvLayers ++; + + } + + for ( i = 0; i < nUvLayers; i ++ ) { + + geometry.faceVertexUvs[ i ] = []; + + } + + } + + offset = 0; + zLength = vertices.length; + + while ( offset < zLength ) { + + vertex = new Vector3(); + + vertex.x = vertices[ offset ++ ] * scale; + vertex.y = vertices[ offset ++ ] * scale; + vertex.z = vertices[ offset ++ ] * scale; + + geometry.vertices.push( vertex ); + + } + + offset = 0; + zLength = faces.length; + + while ( offset < zLength ) { + + type = faces[ offset ++ ]; + + isQuad = isBitSet( type, 0 ); + hasMaterial = isBitSet( type, 1 ); + hasFaceVertexUv = isBitSet( type, 3 ); + hasFaceNormal = isBitSet( type, 4 ); + hasFaceVertexNormal = isBitSet( type, 5 ); + hasFaceColor = isBitSet( type, 6 ); + hasFaceVertexColor = isBitSet( type, 7 ); + + // console.log("type", type, "bits", isQuad, hasMaterial, hasFaceVertexUv, hasFaceNormal, hasFaceVertexNormal, hasFaceColor, hasFaceVertexColor); + + if ( isQuad ) { + + faceA = new Face3(); + faceA.a = faces[ offset ]; + faceA.b = faces[ offset + 1 ]; + faceA.c = faces[ offset + 3 ]; + + faceB = new Face3(); + faceB.a = faces[ offset + 1 ]; + faceB.b = faces[ offset + 2 ]; + faceB.c = faces[ offset + 3 ]; + + offset += 4; + + if ( hasMaterial ) { + + materialIndex = faces[ offset ++ ]; + faceA.materialIndex = materialIndex; + faceB.materialIndex = materialIndex; + + } + + // to get face <=> uv index correspondence + + fi = geometry.faces.length; + + if ( hasFaceVertexUv ) { + + for ( i = 0; i < nUvLayers; i ++ ) { + + uvLayer = json.uvs[ i ]; + + geometry.faceVertexUvs[ i ][ fi ] = []; + geometry.faceVertexUvs[ i ][ fi + 1 ] = []; + + for ( j = 0; j < 4; j ++ ) { + + uvIndex = faces[ offset ++ ]; + + u = uvLayer[ uvIndex * 2 ]; + v = uvLayer[ uvIndex * 2 + 1 ]; + + uv = new Vector2( u, v ); + + if ( j !== 2 ) geometry.faceVertexUvs[ i ][ fi ].push( uv ); + if ( j !== 0 ) geometry.faceVertexUvs[ i ][ fi + 1 ].push( uv ); + + } + + } + + } + + if ( hasFaceNormal ) { + + normalIndex = faces[ offset ++ ] * 3; + + faceA.normal.set( + normals[ normalIndex ++ ], + normals[ normalIndex ++ ], + normals[ normalIndex ] + ); + + faceB.normal.copy( faceA.normal ); + + } + + if ( hasFaceVertexNormal ) { + + for ( i = 0; i < 4; i ++ ) { + + normalIndex = faces[ offset ++ ] * 3; + + normal = new Vector3( + normals[ normalIndex ++ ], + normals[ normalIndex ++ ], + normals[ normalIndex ] + ); + + + if ( i !== 2 ) faceA.vertexNormals.push( normal ); + if ( i !== 0 ) faceB.vertexNormals.push( normal ); + + } + + } + + + if ( hasFaceColor ) { + + colorIndex = faces[ offset ++ ]; + hex = colors[ colorIndex ]; + + faceA.color.setHex( hex ); + faceB.color.setHex( hex ); + + } + + + if ( hasFaceVertexColor ) { + + for ( i = 0; i < 4; i ++ ) { + + colorIndex = faces[ offset ++ ]; + hex = colors[ colorIndex ]; + + if ( i !== 2 ) faceA.vertexColors.push( new Color( hex ) ); + if ( i !== 0 ) faceB.vertexColors.push( new Color( hex ) ); + + } + + } + + geometry.faces.push( faceA ); + geometry.faces.push( faceB ); + + } else { + + face = new Face3(); + face.a = faces[ offset ++ ]; + face.b = faces[ offset ++ ]; + face.c = faces[ offset ++ ]; + + if ( hasMaterial ) { + + materialIndex = faces[ offset ++ ]; + face.materialIndex = materialIndex; + + } + + // to get face <=> uv index correspondence + + fi = geometry.faces.length; + + if ( hasFaceVertexUv ) { + + for ( i = 0; i < nUvLayers; i ++ ) { + + uvLayer = json.uvs[ i ]; + + geometry.faceVertexUvs[ i ][ fi ] = []; + + for ( j = 0; j < 3; j ++ ) { + + uvIndex = faces[ offset ++ ]; + + u = uvLayer[ uvIndex * 2 ]; + v = uvLayer[ uvIndex * 2 + 1 ]; + + uv = new Vector2( u, v ); + + geometry.faceVertexUvs[ i ][ fi ].push( uv ); + + } + + } + + } + + if ( hasFaceNormal ) { + + normalIndex = faces[ offset ++ ] * 3; + + face.normal.set( + normals[ normalIndex ++ ], + normals[ normalIndex ++ ], + normals[ normalIndex ] + ); + + } + + if ( hasFaceVertexNormal ) { + + for ( i = 0; i < 3; i ++ ) { + + normalIndex = faces[ offset ++ ] * 3; + + normal = new Vector3( + normals[ normalIndex ++ ], + normals[ normalIndex ++ ], + normals[ normalIndex ] + ); + + face.vertexNormals.push( normal ); + + } + + } + + + if ( hasFaceColor ) { + + colorIndex = faces[ offset ++ ]; + face.color.setHex( colors[ colorIndex ] ); + + } + + + if ( hasFaceVertexColor ) { + + for ( i = 0; i < 3; i ++ ) { + + colorIndex = faces[ offset ++ ]; + face.vertexColors.push( new Color( colors[ colorIndex ] ) ); + + } + + } + + geometry.faces.push( face ); + + } + + } + + } + + function parseSkin( json, geometry ) { + + var influencesPerVertex = ( json.influencesPerVertex !== undefined ) ? json.influencesPerVertex : 2; + + if ( json.skinWeights ) { + + for ( var i = 0, l = json.skinWeights.length; i < l; i += influencesPerVertex ) { + + var x = json.skinWeights[ i ]; + var y = ( influencesPerVertex > 1 ) ? json.skinWeights[ i + 1 ] : 0; + var z = ( influencesPerVertex > 2 ) ? json.skinWeights[ i + 2 ] : 0; + var w = ( influencesPerVertex > 3 ) ? json.skinWeights[ i + 3 ] : 0; + + geometry.skinWeights.push( new Vector4( x, y, z, w ) ); + + } + + } + + if ( json.skinIndices ) { + + for ( var i = 0, l = json.skinIndices.length; i < l; i += influencesPerVertex ) { + + var a = json.skinIndices[ i ]; + var b = ( influencesPerVertex > 1 ) ? json.skinIndices[ i + 1 ] : 0; + var c = ( influencesPerVertex > 2 ) ? json.skinIndices[ i + 2 ] : 0; + var d = ( influencesPerVertex > 3 ) ? json.skinIndices[ i + 3 ] : 0; + + geometry.skinIndices.push( new Vector4( a, b, c, d ) ); + + } + + } + + geometry.bones = json.bones; + + if ( geometry.bones && geometry.bones.length > 0 && ( geometry.skinWeights.length !== geometry.skinIndices.length || geometry.skinIndices.length !== geometry.vertices.length ) ) { + + console.warn( 'When skinning, number of vertices (' + geometry.vertices.length + '), skinIndices (' + + geometry.skinIndices.length + '), and skinWeights (' + geometry.skinWeights.length + ') should match.' ); + + } + + } + + function parseMorphing( json, geometry ) { + + var scale = json.scale; + + if ( json.morphTargets !== undefined ) { + + for ( var i = 0, l = json.morphTargets.length; i < l; i ++ ) { + + geometry.morphTargets[ i ] = {}; + geometry.morphTargets[ i ].name = json.morphTargets[ i ].name; + geometry.morphTargets[ i ].vertices = []; + + var dstVertices = geometry.morphTargets[ i ].vertices; + var srcVertices = json.morphTargets[ i ].vertices; + + for ( var v = 0, vl = srcVertices.length; v < vl; v += 3 ) { + + var vertex = new Vector3(); + vertex.x = srcVertices[ v ] * scale; + vertex.y = srcVertices[ v + 1 ] * scale; + vertex.z = srcVertices[ v + 2 ] * scale; + + dstVertices.push( vertex ); + + } + + } + + } + + if ( json.morphColors !== undefined && json.morphColors.length > 0 ) { + + console.warn( 'THREE.JSONLoader: "morphColors" no longer supported. Using them as face colors.' ); + + var faces = geometry.faces; + var morphColors = json.morphColors[ 0 ].colors; + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + faces[ i ].color.fromArray( morphColors, i * 3 ); + + } + + } + + } + + function parseAnimations( json, geometry ) { + + var outputAnimations = []; + + // parse old style Bone/Hierarchy animations + var animations = []; + + if ( json.animation !== undefined ) { + + animations.push( json.animation ); + + } + + if ( json.animations !== undefined ) { + + if ( json.animations.length ) { + + animations = animations.concat( json.animations ); + + } else { + + animations.push( json.animations ); + + } + + } + + for ( var i = 0; i < animations.length; i ++ ) { + + var clip = AnimationClip.parseAnimation( animations[ i ], geometry.bones ); + if ( clip ) outputAnimations.push( clip ); + + } + + // parse implicit morph animations + if ( geometry.morphTargets ) { + + // TODO: Figure out what an appropraite FPS is for morph target animations -- defaulting to 10, but really it is completely arbitrary. + var morphAnimationClips = AnimationClip.CreateClipsFromMorphTargetSequences( geometry.morphTargets, 10 ); + outputAnimations = outputAnimations.concat( morphAnimationClips ); + + } + + if ( outputAnimations.length > 0 ) geometry.animations = outputAnimations; + + } + + return function ( json, texturePath ) { + + if ( json.data !== undefined ) { + + // Geometry 4.0 spec + json = json.data; + + } + + if ( json.scale !== undefined ) { + + json.scale = 1.0 / json.scale; + + } else { + + json.scale = 1.0; + + } + + var geometry = new Geometry(); + + parseModel( json, geometry ); + parseSkin( json, geometry ); + parseMorphing( json, geometry ); + parseAnimations( json, geometry ); + + geometry.computeFaceNormals(); + geometry.computeBoundingSphere(); + + if ( json.materials === undefined || json.materials.length === 0 ) { + + return { geometry: geometry }; + + } else { + + var materials = Loader.prototype.initMaterials( json.materials, texturePath, this.crossOrigin ); + + return { geometry: geometry, materials: materials }; + + } + + }; + + } )() + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function ObjectLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + this.texturePath = ''; + + } + + Object.assign( ObjectLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + if ( this.texturePath === '' ) { + + this.texturePath = url.substring( 0, url.lastIndexOf( '/' ) + 1 ); + + } + + var scope = this; + + var loader = new FileLoader( scope.manager ); + loader.load( url, function ( text ) { + + var json = null; + + try { + + json = JSON.parse( text ); + + } catch ( error ) { + + if ( onError !== undefined ) onError( error ); + + console.error( 'THREE:ObjectLoader: Can\'t parse ' + url + '.', error.message ); + + return; + + } + + var metadata = json.metadata; + + if ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) { + + console.error( 'THREE.ObjectLoader: Can\'t load ' + url + '. Use THREE.JSONLoader instead.' ); + return; + + } + + scope.parse( json, onLoad ); + + }, onProgress, onError ); + + }, + + setTexturePath: function ( value ) { + + this.texturePath = value; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + + }, + + parse: function ( json, onLoad ) { + + var geometries = this.parseGeometries( json.geometries ); + + var images = this.parseImages( json.images, function () { + + if ( onLoad !== undefined ) onLoad( object ); + + } ); + + var textures = this.parseTextures( json.textures, images ); + var materials = this.parseMaterials( json.materials, textures ); + + var object = this.parseObject( json.object, geometries, materials ); + + if ( json.animations ) { + + object.animations = this.parseAnimations( json.animations ); + + } + + if ( json.images === undefined || json.images.length === 0 ) { + + if ( onLoad !== undefined ) onLoad( object ); + + } + + return object; + + }, + + parseGeometries: function ( json ) { + + var geometries = {}; + + if ( json !== undefined ) { + + var geometryLoader = new JSONLoader(); + var bufferGeometryLoader = new BufferGeometryLoader(); + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var geometry; + var data = json[ i ]; + + switch ( data.type ) { + + case 'PlaneGeometry': + case 'PlaneBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.width, + data.height, + data.widthSegments, + data.heightSegments + ); + + break; + + case 'BoxGeometry': + case 'BoxBufferGeometry': + case 'CubeGeometry': // backwards compatible + + geometry = new Geometries[ data.type ]( + data.width, + data.height, + data.depth, + data.widthSegments, + data.heightSegments, + data.depthSegments + ); + + break; + + case 'CircleGeometry': + case 'CircleBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.segments, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'CylinderGeometry': + case 'CylinderBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radiusTop, + data.radiusBottom, + data.height, + data.radialSegments, + data.heightSegments, + data.openEnded, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'ConeGeometry': + case 'ConeBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.height, + data.radialSegments, + data.heightSegments, + data.openEnded, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'SphereGeometry': + case 'SphereBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.widthSegments, + data.heightSegments, + data.phiStart, + data.phiLength, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'DodecahedronGeometry': + case 'IcosahedronGeometry': + case 'OctahedronGeometry': + case 'TetrahedronGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.detail + ); + + break; + + case 'RingGeometry': + case 'RingBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.innerRadius, + data.outerRadius, + data.thetaSegments, + data.phiSegments, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'TorusGeometry': + case 'TorusBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.tube, + data.radialSegments, + data.tubularSegments, + data.arc + ); + + break; + + case 'TorusKnotGeometry': + case 'TorusKnotBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.tube, + data.tubularSegments, + data.radialSegments, + data.p, + data.q + ); + + break; + + case 'LatheGeometry': + case 'LatheBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.points, + data.segments, + data.phiStart, + data.phiLength + ); + + break; + + case 'BufferGeometry': + + geometry = bufferGeometryLoader.parse( data ); + + break; + + case 'Geometry': + + geometry = geometryLoader.parse( data, this.texturePath ).geometry; + + break; + + default: + + console.warn( 'THREE.ObjectLoader: Unsupported geometry type "' + data.type + '"' ); + + continue; + + } + + geometry.uuid = data.uuid; + + if ( data.name !== undefined ) geometry.name = data.name; + + geometries[ data.uuid ] = geometry; + + } + + } + + return geometries; + + }, + + parseMaterials: function ( json, textures ) { + + var materials = {}; + + if ( json !== undefined ) { + + var loader = new MaterialLoader(); + loader.setTextures( textures ); + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var data = json[ i ]; + + if ( data.type === 'MultiMaterial' ) { + + // Deprecated + + var array = []; + + for ( var j = 0; j < data.materials.length; j ++ ) { + + array.push( loader.parse( data.materials[ j ] ) ); + + } + + materials[ data.uuid ] = array; + + } else { + + materials[ data.uuid ] = loader.parse( data ); + + } + + } + + } + + return materials; + + }, + + parseAnimations: function ( json ) { + + var animations = []; + + for ( var i = 0; i < json.length; i ++ ) { + + var clip = AnimationClip.parse( json[ i ] ); + + animations.push( clip ); + + } + + return animations; + + }, + + parseImages: function ( json, onLoad ) { + + var scope = this; + var images = {}; + + function loadImage( url ) { + + scope.manager.itemStart( url ); + + return loader.load( url, function () { + + scope.manager.itemEnd( url ); + + }, undefined, function () { + + scope.manager.itemEnd( url ); + scope.manager.itemError( url ); + + } ); + + } + + if ( json !== undefined && json.length > 0 ) { + + var manager = new LoadingManager( onLoad ); + + var loader = new ImageLoader( manager ); + loader.setCrossOrigin( this.crossOrigin ); + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var image = json[ i ]; + var path = /^(\/\/)|([a-z]+:(\/\/)?)/i.test( image.url ) ? image.url : scope.texturePath + image.url; + + images[ image.uuid ] = loadImage( path ); + + } + + } + + return images; + + }, + + parseTextures: function ( json, images ) { + + function parseConstant( value, type ) { + + if ( typeof( value ) === 'number' ) return value; + + console.warn( 'THREE.ObjectLoader.parseTexture: Constant should be in numeric form.', value ); + + return type[ value ]; + + } + + var textures = {}; + + if ( json !== undefined ) { + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var data = json[ i ]; + + if ( data.image === undefined ) { + + console.warn( 'THREE.ObjectLoader: No "image" specified for', data.uuid ); + + } + + if ( images[ data.image ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined image', data.image ); + + } + + var texture = new Texture( images[ data.image ] ); + texture.needsUpdate = true; + + texture.uuid = data.uuid; + + if ( data.name !== undefined ) texture.name = data.name; + + if ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TEXTURE_MAPPING ); + + if ( data.offset !== undefined ) texture.offset.fromArray( data.offset ); + if ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat ); + if ( data.wrap !== undefined ) { + + texture.wrapS = parseConstant( data.wrap[ 0 ], TEXTURE_WRAPPING ); + texture.wrapT = parseConstant( data.wrap[ 1 ], TEXTURE_WRAPPING ); + + } + + if ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TEXTURE_FILTER ); + if ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TEXTURE_FILTER ); + if ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy; + + if ( data.flipY !== undefined ) texture.flipY = data.flipY; + + textures[ data.uuid ] = texture; + + } + + } + + return textures; + + }, + + parseObject: function () { + + var matrix = new Matrix4(); + + return function parseObject( data, geometries, materials ) { + + var object; + + function getGeometry( name ) { + + if ( geometries[ name ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined geometry', name ); + + } + + return geometries[ name ]; + + } + + function getMaterial( name ) { + + if ( name === undefined ) return undefined; + + if ( Array.isArray( name ) ) { + + var array = []; + + for ( var i = 0, l = name.length; i < l; i ++ ) { + + var uuid = name[ i ]; + + if ( materials[ uuid ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined material', uuid ); + + } + + array.push( materials[ uuid ] ); + + } + + return array; + + } + + if ( materials[ name ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined material', name ); + + } + + return materials[ name ]; + + } + + switch ( data.type ) { + + case 'Scene': + + object = new Scene(); + + if ( data.background !== undefined ) { + + if ( Number.isInteger( data.background ) ) { + + object.background = new Color( data.background ); + + } + + } + + if ( data.fog !== undefined ) { + + if ( data.fog.type === 'Fog' ) { + + object.fog = new Fog( data.fog.color, data.fog.near, data.fog.far ); + + } else if ( data.fog.type === 'FogExp2' ) { + + object.fog = new FogExp2( data.fog.color, data.fog.density ); + + } + + } + + break; + + case 'PerspectiveCamera': + + object = new PerspectiveCamera( data.fov, data.aspect, data.near, data.far ); + + if ( data.focus !== undefined ) object.focus = data.focus; + if ( data.zoom !== undefined ) object.zoom = data.zoom; + if ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge; + if ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset; + if ( data.view !== undefined ) object.view = Object.assign( {}, data.view ); + + break; + + case 'OrthographicCamera': + + object = new OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far ); + + break; + + case 'AmbientLight': + + object = new AmbientLight( data.color, data.intensity ); + + break; + + case 'DirectionalLight': + + object = new DirectionalLight( data.color, data.intensity ); + + break; + + case 'PointLight': + + object = new PointLight( data.color, data.intensity, data.distance, data.decay ); + + break; + + case 'RectAreaLight': + + object = new RectAreaLight( data.color, data.intensity, data.width, data.height ); + + break; + + case 'SpotLight': + + object = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay ); + + break; + + case 'HemisphereLight': + + object = new HemisphereLight( data.color, data.groundColor, data.intensity ); + + break; + + case 'SkinnedMesh': + + console.warn( 'THREE.ObjectLoader.parseObject() does not support SkinnedMesh yet.' ); + + case 'Mesh': + + var geometry = getGeometry( data.geometry ); + var material = getMaterial( data.material ); + + if ( geometry.bones && geometry.bones.length > 0 ) { + + object = new SkinnedMesh( geometry, material ); + + } else { + + object = new Mesh( geometry, material ); + + } + + break; + + case 'LOD': + + object = new LOD(); + + break; + + case 'Line': + + object = new Line( getGeometry( data.geometry ), getMaterial( data.material ), data.mode ); + + break; + + case 'LineLoop': + + object = new LineLoop( getGeometry( data.geometry ), getMaterial( data.material ) ); + + break; + + case 'LineSegments': + + object = new LineSegments( getGeometry( data.geometry ), getMaterial( data.material ) ); + + break; + + case 'PointCloud': + case 'Points': + + object = new Points( getGeometry( data.geometry ), getMaterial( data.material ) ); + + break; + + case 'Sprite': + + object = new Sprite( getMaterial( data.material ) ); + + break; + + case 'Group': + + object = new Group(); + + break; + + default: + + object = new Object3D(); + + } + + object.uuid = data.uuid; + + if ( data.name !== undefined ) object.name = data.name; + if ( data.matrix !== undefined ) { + + matrix.fromArray( data.matrix ); + matrix.decompose( object.position, object.quaternion, object.scale ); + + } else { + + if ( data.position !== undefined ) object.position.fromArray( data.position ); + if ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation ); + if ( data.quaternion !== undefined ) object.quaternion.fromArray( data.quaternion ); + if ( data.scale !== undefined ) object.scale.fromArray( data.scale ); + + } + + if ( data.castShadow !== undefined ) object.castShadow = data.castShadow; + if ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow; + + if ( data.shadow ) { + + if ( data.shadow.bias !== undefined ) object.shadow.bias = data.shadow.bias; + if ( data.shadow.radius !== undefined ) object.shadow.radius = data.shadow.radius; + if ( data.shadow.mapSize !== undefined ) object.shadow.mapSize.fromArray( data.shadow.mapSize ); + if ( data.shadow.camera !== undefined ) object.shadow.camera = this.parseObject( data.shadow.camera ); + + } + + if ( data.visible !== undefined ) object.visible = data.visible; + if ( data.userData !== undefined ) object.userData = data.userData; + + if ( data.children !== undefined ) { + + for ( var child in data.children ) { + + object.add( this.parseObject( data.children[ child ], geometries, materials ) ); + + } + + } + + if ( data.type === 'LOD' ) { + + var levels = data.levels; + + for ( var l = 0; l < levels.length; l ++ ) { + + var level = levels[ l ]; + var child = object.getObjectByProperty( 'uuid', level.object ); + + if ( child !== undefined ) { + + object.addLevel( child, level.distance ); + + } + + } + + } + + return object; + + }; + + }() + + } ); + + var TEXTURE_MAPPING = { + UVMapping: UVMapping, + CubeReflectionMapping: CubeReflectionMapping, + CubeRefractionMapping: CubeRefractionMapping, + EquirectangularReflectionMapping: EquirectangularReflectionMapping, + EquirectangularRefractionMapping: EquirectangularRefractionMapping, + SphericalReflectionMapping: SphericalReflectionMapping, + CubeUVReflectionMapping: CubeUVReflectionMapping, + CubeUVRefractionMapping: CubeUVRefractionMapping + }; + + var TEXTURE_WRAPPING = { + RepeatWrapping: RepeatWrapping, + ClampToEdgeWrapping: ClampToEdgeWrapping, + MirroredRepeatWrapping: MirroredRepeatWrapping + }; + + var TEXTURE_FILTER = { + NearestFilter: NearestFilter, + NearestMipMapNearestFilter: NearestMipMapNearestFilter, + NearestMipMapLinearFilter: NearestMipMapLinearFilter, + LinearFilter: LinearFilter, + LinearMipMapNearestFilter: LinearMipMapNearestFilter, + LinearMipMapLinearFilter: LinearMipMapLinearFilter + }; + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * + * Bezier Curves formulas obtained from + * http://en.wikipedia.org/wiki/Bézier_curve + */ + + function CatmullRom( t, p0, p1, p2, p3 ) { + + var v0 = ( p2 - p0 ) * 0.5; + var v1 = ( p3 - p1 ) * 0.5; + var t2 = t * t; + var t3 = t * t2; + return ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1; + + } + + // + + function QuadraticBezierP0( t, p ) { + + var k = 1 - t; + return k * k * p; + + } + + function QuadraticBezierP1( t, p ) { + + return 2 * ( 1 - t ) * t * p; + + } + + function QuadraticBezierP2( t, p ) { + + return t * t * p; + + } + + function QuadraticBezier( t, p0, p1, p2 ) { + + return QuadraticBezierP0( t, p0 ) + QuadraticBezierP1( t, p1 ) + + QuadraticBezierP2( t, p2 ); + + } + + // + + function CubicBezierP0( t, p ) { + + var k = 1 - t; + return k * k * k * p; + + } + + function CubicBezierP1( t, p ) { + + var k = 1 - t; + return 3 * k * k * t * p; + + } + + function CubicBezierP2( t, p ) { + + return 3 * ( 1 - t ) * t * t * p; + + } + + function CubicBezierP3( t, p ) { + + return t * t * t * p; + + } + + function CubicBezier( t, p0, p1, p2, p3 ) { + + return CubicBezierP0( t, p0 ) + CubicBezierP1( t, p1 ) + CubicBezierP2( t, p2 ) + + CubicBezierP3( t, p3 ); + + } + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * Extensible curve object + * + * Some common of curve methods: + * .getPoint(t), getTangent(t) + * .getPointAt(u), getTangentAt(u) + * .getPoints(), .getSpacedPoints() + * .getLength() + * .updateArcLengths() + * + * This following curves inherit from THREE.Curve: + * + * -- 2D curves -- + * THREE.ArcCurve + * THREE.CubicBezierCurve + * THREE.EllipseCurve + * THREE.LineCurve + * THREE.QuadraticBezierCurve + * THREE.SplineCurve + * + * -- 3D curves -- + * THREE.CatmullRomCurve3 + * THREE.CubicBezierCurve3 + * THREE.LineCurve3 + * THREE.QuadraticBezierCurve3 + * + * A series of curves can be represented as a THREE.CurvePath. + * + **/ + + /************************************************************** + * Abstract Curve base class + **************************************************************/ + + function Curve() { + + this.arcLengthDivisions = 200; + + } + + Object.assign( Curve.prototype, { + + // Virtual base class method to overwrite and implement in subclasses + // - t [0 .. 1] + + getPoint: function () { + + console.warn( 'THREE.Curve: .getPoint() not implemented.' ); + return null; + + }, + + // Get point at relative position in curve according to arc length + // - u [0 .. 1] + + getPointAt: function ( u ) { + + var t = this.getUtoTmapping( u ); + return this.getPoint( t ); + + }, + + // Get sequence of points using getPoint( t ) + + getPoints: function ( divisions ) { + + if ( divisions === undefined ) divisions = 5; + + var points = []; + + for ( var d = 0; d <= divisions; d ++ ) { + + points.push( this.getPoint( d / divisions ) ); + + } + + return points; + + }, + + // Get sequence of points using getPointAt( u ) + + getSpacedPoints: function ( divisions ) { + + if ( divisions === undefined ) divisions = 5; + + var points = []; + + for ( var d = 0; d <= divisions; d ++ ) { + + points.push( this.getPointAt( d / divisions ) ); + + } + + return points; + + }, + + // Get total curve arc length + + getLength: function () { + + var lengths = this.getLengths(); + return lengths[ lengths.length - 1 ]; + + }, + + // Get list of cumulative segment lengths + + getLengths: function ( divisions ) { + + if ( divisions === undefined ) divisions = this.arcLengthDivisions; + + if ( this.cacheArcLengths && + ( this.cacheArcLengths.length === divisions + 1 ) && + ! this.needsUpdate ) { + + return this.cacheArcLengths; + + } + + this.needsUpdate = false; + + var cache = []; + var current, last = this.getPoint( 0 ); + var p, sum = 0; + + cache.push( 0 ); + + for ( p = 1; p <= divisions; p ++ ) { + + current = this.getPoint( p / divisions ); + sum += current.distanceTo( last ); + cache.push( sum ); + last = current; + + } + + this.cacheArcLengths = cache; + + return cache; // { sums: cache, sum: sum }; Sum is in the last element. + + }, + + updateArcLengths: function () { + + this.needsUpdate = true; + this.getLengths(); + + }, + + // Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant + + getUtoTmapping: function ( u, distance ) { + + var arcLengths = this.getLengths(); + + var i = 0, il = arcLengths.length; + + var targetArcLength; // The targeted u distance value to get + + if ( distance ) { + + targetArcLength = distance; + + } else { + + targetArcLength = u * arcLengths[ il - 1 ]; + + } + + // binary search for the index with largest value smaller than target u distance + + var low = 0, high = il - 1, comparison; + + while ( low <= high ) { + + i = Math.floor( low + ( high - low ) / 2 ); // less likely to overflow, though probably not issue here, JS doesn't really have integers, all numbers are floats + + comparison = arcLengths[ i ] - targetArcLength; + + if ( comparison < 0 ) { + + low = i + 1; + + } else if ( comparison > 0 ) { + + high = i - 1; + + } else { + + high = i; + break; + + // DONE + + } + + } + + i = high; + + if ( arcLengths[ i ] === targetArcLength ) { + + return i / ( il - 1 ); + + } + + // we could get finer grain at lengths, or use simple interpolation between two points + + var lengthBefore = arcLengths[ i ]; + var lengthAfter = arcLengths[ i + 1 ]; + + var segmentLength = lengthAfter - lengthBefore; + + // determine where we are between the 'before' and 'after' points + + var segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength; + + // add that fractional amount to t + + var t = ( i + segmentFraction ) / ( il - 1 ); + + return t; + + }, + + // Returns a unit vector tangent at t + // In case any sub curve does not implement its tangent derivation, + // 2 points a small delta apart will be used to find its gradient + // which seems to give a reasonable approximation + + getTangent: function ( t ) { + + var delta = 0.0001; + var t1 = t - delta; + var t2 = t + delta; + + // Capping in case of danger + + if ( t1 < 0 ) t1 = 0; + if ( t2 > 1 ) t2 = 1; + + var pt1 = this.getPoint( t1 ); + var pt2 = this.getPoint( t2 ); + + var vec = pt2.clone().sub( pt1 ); + return vec.normalize(); + + }, + + getTangentAt: function ( u ) { + + var t = this.getUtoTmapping( u ); + return this.getTangent( t ); + + }, + + computeFrenetFrames: function ( segments, closed ) { + + // see http://www.cs.indiana.edu/pub/techreports/TR425.pdf + + var normal = new Vector3(); + + var tangents = []; + var normals = []; + var binormals = []; + + var vec = new Vector3(); + var mat = new Matrix4(); + + var i, u, theta; + + // compute the tangent vectors for each segment on the curve + + for ( i = 0; i <= segments; i ++ ) { + + u = i / segments; + + tangents[ i ] = this.getTangentAt( u ); + tangents[ i ].normalize(); + + } + + // select an initial normal vector perpendicular to the first tangent vector, + // and in the direction of the minimum tangent xyz component + + normals[ 0 ] = new Vector3(); + binormals[ 0 ] = new Vector3(); + var min = Number.MAX_VALUE; + var tx = Math.abs( tangents[ 0 ].x ); + var ty = Math.abs( tangents[ 0 ].y ); + var tz = Math.abs( tangents[ 0 ].z ); + + if ( tx <= min ) { + + min = tx; + normal.set( 1, 0, 0 ); + + } + + if ( ty <= min ) { + + min = ty; + normal.set( 0, 1, 0 ); + + } + + if ( tz <= min ) { + + normal.set( 0, 0, 1 ); + + } + + vec.crossVectors( tangents[ 0 ], normal ).normalize(); + + normals[ 0 ].crossVectors( tangents[ 0 ], vec ); + binormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] ); + + + // compute the slowly-varying normal and binormal vectors for each segment on the curve + + for ( i = 1; i <= segments; i ++ ) { + + normals[ i ] = normals[ i - 1 ].clone(); + + binormals[ i ] = binormals[ i - 1 ].clone(); + + vec.crossVectors( tangents[ i - 1 ], tangents[ i ] ); + + if ( vec.length() > Number.EPSILON ) { + + vec.normalize(); + + theta = Math.acos( _Math.clamp( tangents[ i - 1 ].dot( tangents[ i ] ), - 1, 1 ) ); // clamp for floating pt errors + + normals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) ); + + } + + binormals[ i ].crossVectors( tangents[ i ], normals[ i ] ); + + } + + // if the curve is closed, postprocess the vectors so the first and last normal vectors are the same + + if ( closed === true ) { + + theta = Math.acos( _Math.clamp( normals[ 0 ].dot( normals[ segments ] ), - 1, 1 ) ); + theta /= segments; + + if ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ segments ] ) ) > 0 ) { + + theta = - theta; + + } + + for ( i = 1; i <= segments; i ++ ) { + + // twist a little... + normals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) ); + binormals[ i ].crossVectors( tangents[ i ], normals[ i ] ); + + } + + } + + return { + tangents: tangents, + normals: normals, + binormals: binormals + }; + + } + + } ); + + function LineCurve( v1, v2 ) { + + Curve.call( this ); + + this.v1 = v1; + this.v2 = v2; + + } + + LineCurve.prototype = Object.create( Curve.prototype ); + LineCurve.prototype.constructor = LineCurve; + + LineCurve.prototype.isLineCurve = true; + + LineCurve.prototype.getPoint = function ( t ) { + + if ( t === 1 ) { + + return this.v2.clone(); + + } + + var point = this.v2.clone().sub( this.v1 ); + point.multiplyScalar( t ).add( this.v1 ); + + return point; + + }; + + // Line curve is linear, so we can overwrite default getPointAt + + LineCurve.prototype.getPointAt = function ( u ) { + + return this.getPoint( u ); + + }; + + LineCurve.prototype.getTangent = function ( t ) { + + var tangent = this.v2.clone().sub( this.v1 ); + + return tangent.normalize(); + + }; + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * + **/ + + /************************************************************** + * Curved Path - a curve path is simply a array of connected + * curves, but retains the api of a curve + **************************************************************/ + + function CurvePath() { + + Curve.call( this ); + + this.curves = []; + + this.autoClose = false; // Automatically closes the path + + } + + CurvePath.prototype = Object.assign( Object.create( Curve.prototype ), { + + constructor: CurvePath, + + add: function ( curve ) { + + this.curves.push( curve ); + + }, + + closePath: function () { + + // Add a line curve if start and end of lines are not connected + var startPoint = this.curves[ 0 ].getPoint( 0 ); + var endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 ); + + if ( ! startPoint.equals( endPoint ) ) { + + this.curves.push( new LineCurve( endPoint, startPoint ) ); + + } + + }, + + // To get accurate point with reference to + // entire path distance at time t, + // following has to be done: + + // 1. Length of each sub path have to be known + // 2. Locate and identify type of curve + // 3. Get t for the curve + // 4. Return curve.getPointAt(t') + + getPoint: function ( t ) { + + var d = t * this.getLength(); + var curveLengths = this.getCurveLengths(); + var i = 0; + + // To think about boundaries points. + + while ( i < curveLengths.length ) { + + if ( curveLengths[ i ] >= d ) { + + var diff = curveLengths[ i ] - d; + var curve = this.curves[ i ]; + + var segmentLength = curve.getLength(); + var u = segmentLength === 0 ? 0 : 1 - diff / segmentLength; + + return curve.getPointAt( u ); + + } + + i ++; + + } + + return null; + + // loop where sum != 0, sum > d , sum+1 <d + + }, + + // We cannot use the default THREE.Curve getPoint() with getLength() because in + // THREE.Curve, getLength() depends on getPoint() but in THREE.CurvePath + // getPoint() depends on getLength + + getLength: function () { + + var lens = this.getCurveLengths(); + return lens[ lens.length - 1 ]; + + }, + + // cacheLengths must be recalculated. + updateArcLengths: function () { + + this.needsUpdate = true; + this.cacheLengths = null; + this.getCurveLengths(); + + }, + + // Compute lengths and cache them + // We cannot overwrite getLengths() because UtoT mapping uses it. + + getCurveLengths: function () { + + // We use cache values if curves and cache array are same length + + if ( this.cacheLengths && this.cacheLengths.length === this.curves.length ) { + + return this.cacheLengths; + + } + + // Get length of sub-curve + // Push sums into cached array + + var lengths = [], sums = 0; + + for ( var i = 0, l = this.curves.length; i < l; i ++ ) { + + sums += this.curves[ i ].getLength(); + lengths.push( sums ); + + } + + this.cacheLengths = lengths; + + return lengths; + + }, + + getSpacedPoints: function ( divisions ) { + + if ( divisions === undefined ) divisions = 40; + + var points = []; + + for ( var i = 0; i <= divisions; i ++ ) { + + points.push( this.getPoint( i / divisions ) ); + + } + + if ( this.autoClose ) { + + points.push( points[ 0 ] ); + + } + + return points; + + }, + + getPoints: function ( divisions ) { + + divisions = divisions || 12; + + var points = [], last; + + for ( var i = 0, curves = this.curves; i < curves.length; i ++ ) { + + var curve = curves[ i ]; + var resolution = (curve && curve.isEllipseCurve) ? divisions * 2 + : (curve && curve.isLineCurve) ? 1 + : (curve && curve.isSplineCurve) ? divisions * curve.points.length + : divisions; + + var pts = curve.getPoints( resolution ); + + for ( var j = 0; j < pts.length; j++ ) { + + var point = pts[ j ]; + + if ( last && last.equals( point ) ) continue; // ensures no consecutive points are duplicates + + points.push( point ); + last = point; + + } + + } + + if ( this.autoClose && points.length > 1 && !points[ points.length - 1 ].equals( points[ 0 ] ) ) { + + points.push( points[ 0 ] ); + + } + + return points; + + }, + + /************************************************************** + * Create Geometries Helpers + **************************************************************/ + + /// Generate geometry from path points (for Line or Points objects) + + createPointsGeometry: function ( divisions ) { + + var pts = this.getPoints( divisions ); + return this.createGeometry( pts ); + + }, + + // Generate geometry from equidistant sampling along the path + + createSpacedPointsGeometry: function ( divisions ) { + + var pts = this.getSpacedPoints( divisions ); + return this.createGeometry( pts ); + + }, + + createGeometry: function ( points ) { + + var geometry = new Geometry(); + + for ( var i = 0, l = points.length; i < l; i ++ ) { + + var point = points[ i ]; + geometry.vertices.push( new Vector3( point.x, point.y, point.z || 0 ) ); + + } + + return geometry; + + } + + } ); + + function EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) { + + Curve.call( this ); + + this.aX = aX; + this.aY = aY; + + this.xRadius = xRadius; + this.yRadius = yRadius; + + this.aStartAngle = aStartAngle; + this.aEndAngle = aEndAngle; + + this.aClockwise = aClockwise; + + this.aRotation = aRotation || 0; + + } + + EllipseCurve.prototype = Object.create( Curve.prototype ); + EllipseCurve.prototype.constructor = EllipseCurve; + + EllipseCurve.prototype.isEllipseCurve = true; + + EllipseCurve.prototype.getPoint = function ( t ) { + + var twoPi = Math.PI * 2; + var deltaAngle = this.aEndAngle - this.aStartAngle; + var samePoints = Math.abs( deltaAngle ) < Number.EPSILON; + + // ensures that deltaAngle is 0 .. 2 PI + while ( deltaAngle < 0 ) deltaAngle += twoPi; + while ( deltaAngle > twoPi ) deltaAngle -= twoPi; + + if ( deltaAngle < Number.EPSILON ) { + + if ( samePoints ) { + + deltaAngle = 0; + + } else { + + deltaAngle = twoPi; + + } + + } + + if ( this.aClockwise === true && ! samePoints ) { + + if ( deltaAngle === twoPi ) { + + deltaAngle = - twoPi; + + } else { + + deltaAngle = deltaAngle - twoPi; + + } + + } + + var angle = this.aStartAngle + t * deltaAngle; + var x = this.aX + this.xRadius * Math.cos( angle ); + var y = this.aY + this.yRadius * Math.sin( angle ); + + if ( this.aRotation !== 0 ) { + + var cos = Math.cos( this.aRotation ); + var sin = Math.sin( this.aRotation ); + + var tx = x - this.aX; + var ty = y - this.aY; + + // Rotate the point about the center of the ellipse. + x = tx * cos - ty * sin + this.aX; + y = tx * sin + ty * cos + this.aY; + + } + + return new Vector2( x, y ); + + }; + + function SplineCurve( points /* array of Vector2 */ ) { + + Curve.call( this ); + + this.points = ( points === undefined ) ? [] : points; + + } + + SplineCurve.prototype = Object.create( Curve.prototype ); + SplineCurve.prototype.constructor = SplineCurve; + + SplineCurve.prototype.isSplineCurve = true; + + SplineCurve.prototype.getPoint = function ( t ) { + + var points = this.points; + var point = ( points.length - 1 ) * t; + + var intPoint = Math.floor( point ); + var weight = point - intPoint; + + var point0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ]; + var point1 = points[ intPoint ]; + var point2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ]; + var point3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ]; + + return new Vector2( + CatmullRom( weight, point0.x, point1.x, point2.x, point3.x ), + CatmullRom( weight, point0.y, point1.y, point2.y, point3.y ) + ); + + }; + + function CubicBezierCurve( v0, v1, v2, v3 ) { + + Curve.call( this ); + + this.v0 = v0; + this.v1 = v1; + this.v2 = v2; + this.v3 = v3; + + } + + CubicBezierCurve.prototype = Object.create( Curve.prototype ); + CubicBezierCurve.prototype.constructor = CubicBezierCurve; + + CubicBezierCurve.prototype.getPoint = function ( t ) { + + var v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3; + + return new Vector2( + CubicBezier( t, v0.x, v1.x, v2.x, v3.x ), + CubicBezier( t, v0.y, v1.y, v2.y, v3.y ) + ); + + }; + + function QuadraticBezierCurve( v0, v1, v2 ) { + + Curve.call( this ); + + this.v0 = v0; + this.v1 = v1; + this.v2 = v2; + + } + + QuadraticBezierCurve.prototype = Object.create( Curve.prototype ); + QuadraticBezierCurve.prototype.constructor = QuadraticBezierCurve; + + QuadraticBezierCurve.prototype.getPoint = function ( t ) { + + var v0 = this.v0, v1 = this.v1, v2 = this.v2; + + return new Vector2( + QuadraticBezier( t, v0.x, v1.x, v2.x ), + QuadraticBezier( t, v0.y, v1.y, v2.y ) + ); + + }; + + var PathPrototype = Object.assign( Object.create( CurvePath.prototype ), { + + fromPoints: function ( vectors ) { + + this.moveTo( vectors[ 0 ].x, vectors[ 0 ].y ); + + for ( var i = 1, l = vectors.length; i < l; i ++ ) { + + this.lineTo( vectors[ i ].x, vectors[ i ].y ); + + } + + }, + + moveTo: function ( x, y ) { + + this.currentPoint.set( x, y ); // TODO consider referencing vectors instead of copying? + + }, + + lineTo: function ( x, y ) { + + var curve = new LineCurve( this.currentPoint.clone(), new Vector2( x, y ) ); + this.curves.push( curve ); + + this.currentPoint.set( x, y ); + + }, + + quadraticCurveTo: function ( aCPx, aCPy, aX, aY ) { + + var curve = new QuadraticBezierCurve( + this.currentPoint.clone(), + new Vector2( aCPx, aCPy ), + new Vector2( aX, aY ) + ); + + this.curves.push( curve ); + + this.currentPoint.set( aX, aY ); + + }, + + bezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) { + + var curve = new CubicBezierCurve( + this.currentPoint.clone(), + new Vector2( aCP1x, aCP1y ), + new Vector2( aCP2x, aCP2y ), + new Vector2( aX, aY ) + ); + + this.curves.push( curve ); + + this.currentPoint.set( aX, aY ); + + }, + + splineThru: function ( pts /*Array of Vector*/ ) { + + var npts = [ this.currentPoint.clone() ].concat( pts ); + + var curve = new SplineCurve( npts ); + this.curves.push( curve ); + + this.currentPoint.copy( pts[ pts.length - 1 ] ); + + }, + + arc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) { + + var x0 = this.currentPoint.x; + var y0 = this.currentPoint.y; + + this.absarc( aX + x0, aY + y0, aRadius, + aStartAngle, aEndAngle, aClockwise ); + + }, + + absarc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) { + + this.absellipse( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise ); + + }, + + ellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) { + + var x0 = this.currentPoint.x; + var y0 = this.currentPoint.y; + + this.absellipse( aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ); + + }, + + absellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) { + + var curve = new EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ); + + if ( this.curves.length > 0 ) { + + // if a previous curve is present, attempt to join + var firstPoint = curve.getPoint( 0 ); + + if ( ! firstPoint.equals( this.currentPoint ) ) { + + this.lineTo( firstPoint.x, firstPoint.y ); + + } + + } + + this.curves.push( curve ); + + var lastPoint = curve.getPoint( 1 ); + this.currentPoint.copy( lastPoint ); + + } + + } ); + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * Creates free form 2d path using series of points, lines or curves. + **/ + + function Path( points ) { + + CurvePath.call( this ); + this.currentPoint = new Vector2(); + + if ( points ) { + + this.fromPoints( points ); + + } + + } + + Path.prototype = PathPrototype; + PathPrototype.constructor = Path; + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * Defines a 2d shape plane using paths. + **/ + + // STEP 1 Create a path. + // STEP 2 Turn path into shape. + // STEP 3 ExtrudeGeometry takes in Shape/Shapes + // STEP 3a - Extract points from each shape, turn to vertices + // STEP 3b - Triangulate each shape, add faces. + + function Shape() { + + Path.apply( this, arguments ); + + this.holes = []; + + } + + Shape.prototype = Object.assign( Object.create( PathPrototype ), { + + constructor: Shape, + + getPointsHoles: function ( divisions ) { + + var holesPts = []; + + for ( var i = 0, l = this.holes.length; i < l; i ++ ) { + + holesPts[ i ] = this.holes[ i ].getPoints( divisions ); + + } + + return holesPts; + + }, + + // Get points of shape and holes (keypoints based on segments parameter) + + extractAllPoints: function ( divisions ) { + + return { + + shape: this.getPoints( divisions ), + holes: this.getPointsHoles( divisions ) + + }; + + }, + + extractPoints: function ( divisions ) { + + return this.extractAllPoints( divisions ); + + } + + } ); + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * minimal class for proxing functions to Path. Replaces old "extractSubpaths()" + **/ + + function ShapePath() { + + this.subPaths = []; + this.currentPath = null; + + } + + Object.assign( ShapePath.prototype, { + + moveTo: function ( x, y ) { + + this.currentPath = new Path(); + this.subPaths.push( this.currentPath ); + this.currentPath.moveTo( x, y ); + + }, + + lineTo: function ( x, y ) { + + this.currentPath.lineTo( x, y ); + + }, + + quadraticCurveTo: function ( aCPx, aCPy, aX, aY ) { + + this.currentPath.quadraticCurveTo( aCPx, aCPy, aX, aY ); + + }, + + bezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) { + + this.currentPath.bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ); + + }, + + splineThru: function ( pts ) { + + this.currentPath.splineThru( pts ); + + }, + + toShapes: function ( isCCW, noHoles ) { + + function toShapesNoHoles( inSubpaths ) { + + var shapes = []; + + for ( var i = 0, l = inSubpaths.length; i < l; i ++ ) { + + var tmpPath = inSubpaths[ i ]; + + var tmpShape = new Shape(); + tmpShape.curves = tmpPath.curves; + + shapes.push( tmpShape ); + + } + + return shapes; + + } + + function isPointInsidePolygon( inPt, inPolygon ) { + + var polyLen = inPolygon.length; + + // inPt on polygon contour => immediate success or + // toggling of inside/outside at every single! intersection point of an edge + // with the horizontal line through inPt, left of inPt + // not counting lowerY endpoints of edges and whole edges on that line + var inside = false; + for ( var p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) { + + var edgeLowPt = inPolygon[ p ]; + var edgeHighPt = inPolygon[ q ]; + + var edgeDx = edgeHighPt.x - edgeLowPt.x; + var edgeDy = edgeHighPt.y - edgeLowPt.y; + + if ( Math.abs( edgeDy ) > Number.EPSILON ) { + + // not parallel + if ( edgeDy < 0 ) { + + edgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx; + edgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy; + + } + if ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) continue; + + if ( inPt.y === edgeLowPt.y ) { + + if ( inPt.x === edgeLowPt.x ) return true; // inPt is on contour ? + // continue; // no intersection or edgeLowPt => doesn't count !!! + + } else { + + var perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y ); + if ( perpEdge === 0 ) return true; // inPt is on contour ? + if ( perpEdge < 0 ) continue; + inside = ! inside; // true intersection left of inPt + + } + + } else { + + // parallel or collinear + if ( inPt.y !== edgeLowPt.y ) continue; // parallel + // edge lies on the same horizontal line as inPt + if ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) || + ( ( edgeLowPt.x <= inPt.x ) && ( inPt.x <= edgeHighPt.x ) ) ) return true; // inPt: Point on contour ! + // continue; + + } + + } + + return inside; + + } + + var isClockWise = ShapeUtils.isClockWise; + + var subPaths = this.subPaths; + if ( subPaths.length === 0 ) return []; + + if ( noHoles === true ) return toShapesNoHoles( subPaths ); + + + var solid, tmpPath, tmpShape, shapes = []; + + if ( subPaths.length === 1 ) { + + tmpPath = subPaths[ 0 ]; + tmpShape = new Shape(); + tmpShape.curves = tmpPath.curves; + shapes.push( tmpShape ); + return shapes; + + } + + var holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() ); + holesFirst = isCCW ? ! holesFirst : holesFirst; + + // console.log("Holes first", holesFirst); + + var betterShapeHoles = []; + var newShapes = []; + var newShapeHoles = []; + var mainIdx = 0; + var tmpPoints; + + newShapes[ mainIdx ] = undefined; + newShapeHoles[ mainIdx ] = []; + + for ( var i = 0, l = subPaths.length; i < l; i ++ ) { + + tmpPath = subPaths[ i ]; + tmpPoints = tmpPath.getPoints(); + solid = isClockWise( tmpPoints ); + solid = isCCW ? ! solid : solid; + + if ( solid ) { + + if ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) ) mainIdx ++; + + newShapes[ mainIdx ] = { s: new Shape(), p: tmpPoints }; + newShapes[ mainIdx ].s.curves = tmpPath.curves; + + if ( holesFirst ) mainIdx ++; + newShapeHoles[ mainIdx ] = []; + + //console.log('cw', i); + + } else { + + newShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } ); + + //console.log('ccw', i); + + } + + } + + // only Holes? -> probably all Shapes with wrong orientation + if ( ! newShapes[ 0 ] ) return toShapesNoHoles( subPaths ); + + + if ( newShapes.length > 1 ) { + + var ambiguous = false; + var toChange = []; + + for ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) { + + betterShapeHoles[ sIdx ] = []; + + } + + for ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) { + + var sho = newShapeHoles[ sIdx ]; + + for ( var hIdx = 0; hIdx < sho.length; hIdx ++ ) { + + var ho = sho[ hIdx ]; + var hole_unassigned = true; + + for ( var s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) { + + if ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) { + + if ( sIdx !== s2Idx ) toChange.push( { froms: sIdx, tos: s2Idx, hole: hIdx } ); + if ( hole_unassigned ) { + + hole_unassigned = false; + betterShapeHoles[ s2Idx ].push( ho ); + + } else { + + ambiguous = true; + + } + + } + + } + if ( hole_unassigned ) { + + betterShapeHoles[ sIdx ].push( ho ); + + } + + } + + } + // console.log("ambiguous: ", ambiguous); + if ( toChange.length > 0 ) { + + // console.log("to change: ", toChange); + if ( ! ambiguous ) newShapeHoles = betterShapeHoles; + + } + + } + + var tmpHoles; + + for ( var i = 0, il = newShapes.length; i < il; i ++ ) { + + tmpShape = newShapes[ i ].s; + shapes.push( tmpShape ); + tmpHoles = newShapeHoles[ i ]; + + for ( var j = 0, jl = tmpHoles.length; j < jl; j ++ ) { + + tmpShape.holes.push( tmpHoles[ j ].h ); + + } + + } + + //console.log("shape", shapes); + + return shapes; + + } + + } ); + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * @author mrdoob / http://mrdoob.com/ + */ + + function Font( data ) { + + this.data = data; + + } + + Object.assign( Font.prototype, { + + isFont: true, + + generateShapes: function ( text, size, divisions ) { + + function createPaths( text ) { + + var chars = String( text ).split( '' ); + var scale = size / data.resolution; + var line_height = ( data.boundingBox.yMax - data.boundingBox.yMin + data.underlineThickness ) * scale; + + var offsetX = 0, offsetY = 0; + + var paths = []; + + for ( var i = 0; i < chars.length; i ++ ) { + + var char = chars[ i ]; + + if ( char === '\n' ) { + + offsetX = 0; + offsetY -= line_height; + + } else { + + var ret = createPath( char, scale, offsetX, offsetY ); + offsetX += ret.offsetX; + paths.push( ret.path ); + + } + + } + + return paths; + + } + + function createPath( c, scale, offsetX, offsetY ) { + + var glyph = data.glyphs[ c ] || data.glyphs[ '?' ]; + + if ( ! glyph ) return; + + var path = new ShapePath(); + + var pts = []; + var x, y, cpx, cpy, cpx0, cpy0, cpx1, cpy1, cpx2, cpy2, laste; + + if ( glyph.o ) { + + var outline = glyph._cachedOutline || ( glyph._cachedOutline = glyph.o.split( ' ' ) ); + + for ( var i = 0, l = outline.length; i < l; ) { + + var action = outline[ i ++ ]; + + switch ( action ) { + + case 'm': // moveTo + + x = outline[ i ++ ] * scale + offsetX; + y = outline[ i ++ ] * scale + offsetY; + + path.moveTo( x, y ); + + break; + + case 'l': // lineTo + + x = outline[ i ++ ] * scale + offsetX; + y = outline[ i ++ ] * scale + offsetY; + + path.lineTo( x, y ); + + break; + + case 'q': // quadraticCurveTo + + cpx = outline[ i ++ ] * scale + offsetX; + cpy = outline[ i ++ ] * scale + offsetY; + cpx1 = outline[ i ++ ] * scale + offsetX; + cpy1 = outline[ i ++ ] * scale + offsetY; + + path.quadraticCurveTo( cpx1, cpy1, cpx, cpy ); + + laste = pts[ pts.length - 1 ]; + + if ( laste ) { + + cpx0 = laste.x; + cpy0 = laste.y; + + for ( var i2 = 1; i2 <= divisions; i2 ++ ) { + + var t = i2 / divisions; + QuadraticBezier( t, cpx0, cpx1, cpx ); + QuadraticBezier( t, cpy0, cpy1, cpy ); + + } + + } + + break; + + case 'b': // bezierCurveTo + + cpx = outline[ i ++ ] * scale + offsetX; + cpy = outline[ i ++ ] * scale + offsetY; + cpx1 = outline[ i ++ ] * scale + offsetX; + cpy1 = outline[ i ++ ] * scale + offsetY; + cpx2 = outline[ i ++ ] * scale + offsetX; + cpy2 = outline[ i ++ ] * scale + offsetY; + + path.bezierCurveTo( cpx1, cpy1, cpx2, cpy2, cpx, cpy ); + + laste = pts[ pts.length - 1 ]; + + if ( laste ) { + + cpx0 = laste.x; + cpy0 = laste.y; + + for ( var i2 = 1; i2 <= divisions; i2 ++ ) { + + var t = i2 / divisions; + CubicBezier( t, cpx0, cpx1, cpx2, cpx ); + CubicBezier( t, cpy0, cpy1, cpy2, cpy ); + + } + + } + + break; + + } + + } + + } + + return { offsetX: glyph.ha * scale, path: path }; + + } + + // + + if ( size === undefined ) size = 100; + if ( divisions === undefined ) divisions = 4; + + var data = this.data; + + var paths = createPaths( text ); + var shapes = []; + + for ( var p = 0, pl = paths.length; p < pl; p ++ ) { + + Array.prototype.push.apply( shapes, paths[ p ].toShapes() ); + + } + + return shapes; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function FontLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( FontLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var loader = new FileLoader( this.manager ); + loader.load( url, function ( text ) { + + var json; + + try { + + json = JSON.parse( text ); + + } catch ( e ) { + + console.warn( 'THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead.' ); + json = JSON.parse( text.substring( 65, text.length - 2 ) ); + + } + + var font = scope.parse( json ); + + if ( onLoad ) onLoad( font ); + + }, onProgress, onError ); + + }, + + parse: function ( json ) { + + return new Font( json ); + + } + + } ); + + var context; + + var AudioContext = { + + getContext: function () { + + if ( context === undefined ) { + + context = new ( window.AudioContext || window.webkitAudioContext )(); + + } + + return context; + + }, + + setContext: function ( value ) { + + context = value; + + } + + }; + + /** + * @author Reece Aaron Lecrivain / http://reecenotes.com/ + */ + + function AudioLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( AudioLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var loader = new FileLoader( this.manager ); + loader.setResponseType( 'arraybuffer' ); + loader.load( url, function ( buffer ) { + + var context = AudioContext.getContext(); + + context.decodeAudioData( buffer, function ( audioBuffer ) { + + onLoad( audioBuffer ); + + } ); + + }, onProgress, onError ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function StereoCamera() { + + this.type = 'StereoCamera'; + + this.aspect = 1; + + this.eyeSep = 0.064; + + this.cameraL = new PerspectiveCamera(); + this.cameraL.layers.enable( 1 ); + this.cameraL.matrixAutoUpdate = false; + + this.cameraR = new PerspectiveCamera(); + this.cameraR.layers.enable( 2 ); + this.cameraR.matrixAutoUpdate = false; + + } + + Object.assign( StereoCamera.prototype, { + + update: ( function () { + + var instance, focus, fov, aspect, near, far, zoom, eyeSep; + + var eyeRight = new Matrix4(); + var eyeLeft = new Matrix4(); + + return function update( camera ) { + + var needsUpdate = instance !== this || focus !== camera.focus || fov !== camera.fov || + aspect !== camera.aspect * this.aspect || near !== camera.near || + far !== camera.far || zoom !== camera.zoom || eyeSep !== this.eyeSep; + + if ( needsUpdate ) { + + instance = this; + focus = camera.focus; + fov = camera.fov; + aspect = camera.aspect * this.aspect; + near = camera.near; + far = camera.far; + zoom = camera.zoom; + + // Off-axis stereoscopic effect based on + // http://paulbourke.net/stereographics/stereorender/ + + var projectionMatrix = camera.projectionMatrix.clone(); + eyeSep = this.eyeSep / 2; + var eyeSepOnProjection = eyeSep * near / focus; + var ymax = ( near * Math.tan( _Math.DEG2RAD * fov * 0.5 ) ) / zoom; + var xmin, xmax; + + // translate xOffset + + eyeLeft.elements[ 12 ] = - eyeSep; + eyeRight.elements[ 12 ] = eyeSep; + + // for left eye + + xmin = - ymax * aspect + eyeSepOnProjection; + xmax = ymax * aspect + eyeSepOnProjection; + + projectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin ); + projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin ); + + this.cameraL.projectionMatrix.copy( projectionMatrix ); + + // for right eye + + xmin = - ymax * aspect - eyeSepOnProjection; + xmax = ymax * aspect - eyeSepOnProjection; + + projectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin ); + projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin ); + + this.cameraR.projectionMatrix.copy( projectionMatrix ); + + } + + this.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( eyeLeft ); + this.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( eyeRight ); + + }; + + } )() + + } ); + + /** + * Camera for rendering cube maps + * - renders scene into axis-aligned cube + * + * @author alteredq / http://alteredqualia.com/ + */ + + function CubeCamera( near, far, cubeResolution ) { + + Object3D.call( this ); + + this.type = 'CubeCamera'; + + var fov = 90, aspect = 1; + + var cameraPX = new PerspectiveCamera( fov, aspect, near, far ); + cameraPX.up.set( 0, - 1, 0 ); + cameraPX.lookAt( new Vector3( 1, 0, 0 ) ); + this.add( cameraPX ); + + var cameraNX = new PerspectiveCamera( fov, aspect, near, far ); + cameraNX.up.set( 0, - 1, 0 ); + cameraNX.lookAt( new Vector3( - 1, 0, 0 ) ); + this.add( cameraNX ); + + var cameraPY = new PerspectiveCamera( fov, aspect, near, far ); + cameraPY.up.set( 0, 0, 1 ); + cameraPY.lookAt( new Vector3( 0, 1, 0 ) ); + this.add( cameraPY ); + + var cameraNY = new PerspectiveCamera( fov, aspect, near, far ); + cameraNY.up.set( 0, 0, - 1 ); + cameraNY.lookAt( new Vector3( 0, - 1, 0 ) ); + this.add( cameraNY ); + + var cameraPZ = new PerspectiveCamera( fov, aspect, near, far ); + cameraPZ.up.set( 0, - 1, 0 ); + cameraPZ.lookAt( new Vector3( 0, 0, 1 ) ); + this.add( cameraPZ ); + + var cameraNZ = new PerspectiveCamera( fov, aspect, near, far ); + cameraNZ.up.set( 0, - 1, 0 ); + cameraNZ.lookAt( new Vector3( 0, 0, - 1 ) ); + this.add( cameraNZ ); + + var options = { format: RGBFormat, magFilter: LinearFilter, minFilter: LinearFilter }; + + this.renderTarget = new WebGLRenderTargetCube( cubeResolution, cubeResolution, options ); + this.renderTarget.texture.name = "CubeCamera"; + + this.updateCubeMap = function ( renderer, scene ) { + + if ( this.parent === null ) this.updateMatrixWorld(); + + var renderTarget = this.renderTarget; + var generateMipmaps = renderTarget.texture.generateMipmaps; + + renderTarget.texture.generateMipmaps = false; + + renderTarget.activeCubeFace = 0; + renderer.render( scene, cameraPX, renderTarget ); + + renderTarget.activeCubeFace = 1; + renderer.render( scene, cameraNX, renderTarget ); + + renderTarget.activeCubeFace = 2; + renderer.render( scene, cameraPY, renderTarget ); + + renderTarget.activeCubeFace = 3; + renderer.render( scene, cameraNY, renderTarget ); + + renderTarget.activeCubeFace = 4; + renderer.render( scene, cameraPZ, renderTarget ); + + renderTarget.texture.generateMipmaps = generateMipmaps; + + renderTarget.activeCubeFace = 5; + renderer.render( scene, cameraNZ, renderTarget ); + + renderer.setRenderTarget( null ); + + }; + + } + + CubeCamera.prototype = Object.create( Object3D.prototype ); + CubeCamera.prototype.constructor = CubeCamera; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function ArrayCamera( array ) { + + PerspectiveCamera.call( this ); + + this.enabled = false; + this.cameras = array || []; + + } + + ArrayCamera.prototype = Object.assign( Object.create( PerspectiveCamera.prototype ), { + + constructor: ArrayCamera, + + isArrayCamera: true + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function AudioListener() { + + Object3D.call( this ); + + this.type = 'AudioListener'; + + this.context = AudioContext.getContext(); + + this.gain = this.context.createGain(); + this.gain.connect( this.context.destination ); + + this.filter = null; + + } + + AudioListener.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: AudioListener, + + getInput: function () { + + return this.gain; + + }, + + removeFilter: function ( ) { + + if ( this.filter !== null ) { + + this.gain.disconnect( this.filter ); + this.filter.disconnect( this.context.destination ); + this.gain.connect( this.context.destination ); + this.filter = null; + + } + + }, + + getFilter: function () { + + return this.filter; + + }, + + setFilter: function ( value ) { + + if ( this.filter !== null ) { + + this.gain.disconnect( this.filter ); + this.filter.disconnect( this.context.destination ); + + } else { + + this.gain.disconnect( this.context.destination ); + + } + + this.filter = value; + this.gain.connect( this.filter ); + this.filter.connect( this.context.destination ); + + }, + + getMasterVolume: function () { + + return this.gain.gain.value; + + }, + + setMasterVolume: function ( value ) { + + this.gain.gain.value = value; + + }, + + updateMatrixWorld: ( function () { + + var position = new Vector3(); + var quaternion = new Quaternion(); + var scale = new Vector3(); + + var orientation = new Vector3(); + + return function updateMatrixWorld( force ) { + + Object3D.prototype.updateMatrixWorld.call( this, force ); + + var listener = this.context.listener; + var up = this.up; + + this.matrixWorld.decompose( position, quaternion, scale ); + + orientation.set( 0, 0, - 1 ).applyQuaternion( quaternion ); + + if ( listener.positionX ) { + + listener.positionX.setValueAtTime( position.x, this.context.currentTime ); + listener.positionY.setValueAtTime( position.y, this.context.currentTime ); + listener.positionZ.setValueAtTime( position.z, this.context.currentTime ); + listener.forwardX.setValueAtTime( orientation.x, this.context.currentTime ); + listener.forwardY.setValueAtTime( orientation.y, this.context.currentTime ); + listener.forwardZ.setValueAtTime( orientation.z, this.context.currentTime ); + listener.upX.setValueAtTime( up.x, this.context.currentTime ); + listener.upY.setValueAtTime( up.y, this.context.currentTime ); + listener.upZ.setValueAtTime( up.z, this.context.currentTime ); + + } else { + + listener.setPosition( position.x, position.y, position.z ); + listener.setOrientation( orientation.x, orientation.y, orientation.z, up.x, up.y, up.z ); + + } + + }; + + } )() + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Reece Aaron Lecrivain / http://reecenotes.com/ + */ + + function Audio( listener ) { + + Object3D.call( this ); + + this.type = 'Audio'; + + this.context = listener.context; + + this.gain = this.context.createGain(); + this.gain.connect( listener.getInput() ); + + this.autoplay = false; + + this.buffer = null; + this.loop = false; + this.startTime = 0; + this.playbackRate = 1; + this.isPlaying = false; + this.hasPlaybackControl = true; + this.sourceType = 'empty'; + + this.filters = []; + + } + + Audio.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Audio, + + getOutput: function () { + + return this.gain; + + }, + + setNodeSource: function ( audioNode ) { + + this.hasPlaybackControl = false; + this.sourceType = 'audioNode'; + this.source = audioNode; + this.connect(); + + return this; + + }, + + setBuffer: function ( audioBuffer ) { + + this.buffer = audioBuffer; + this.sourceType = 'buffer'; + + if ( this.autoplay ) this.play(); + + return this; + + }, + + play: function () { + + if ( this.isPlaying === true ) { + + console.warn( 'THREE.Audio: Audio is already playing.' ); + return; + + } + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + var source = this.context.createBufferSource(); + + source.buffer = this.buffer; + source.loop = this.loop; + source.onended = this.onEnded.bind( this ); + source.playbackRate.setValueAtTime( this.playbackRate, this.startTime ); + source.start( 0, this.startTime ); + + this.isPlaying = true; + + this.source = source; + + return this.connect(); + + }, + + pause: function () { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + this.source.stop(); + this.startTime = this.context.currentTime; + this.isPlaying = false; + + return this; + + }, + + stop: function () { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + this.source.stop(); + this.startTime = 0; + this.isPlaying = false; + + return this; + + }, + + connect: function () { + + if ( this.filters.length > 0 ) { + + this.source.connect( this.filters[ 0 ] ); + + for ( var i = 1, l = this.filters.length; i < l; i ++ ) { + + this.filters[ i - 1 ].connect( this.filters[ i ] ); + + } + + this.filters[ this.filters.length - 1 ].connect( this.getOutput() ); + + } else { + + this.source.connect( this.getOutput() ); + + } + + return this; + + }, + + disconnect: function () { + + if ( this.filters.length > 0 ) { + + this.source.disconnect( this.filters[ 0 ] ); + + for ( var i = 1, l = this.filters.length; i < l; i ++ ) { + + this.filters[ i - 1 ].disconnect( this.filters[ i ] ); + + } + + this.filters[ this.filters.length - 1 ].disconnect( this.getOutput() ); + + } else { + + this.source.disconnect( this.getOutput() ); + + } + + return this; + + }, + + getFilters: function () { + + return this.filters; + + }, + + setFilters: function ( value ) { + + if ( ! value ) value = []; + + if ( this.isPlaying === true ) { + + this.disconnect(); + this.filters = value; + this.connect(); + + } else { + + this.filters = value; + + } + + return this; + + }, + + getFilter: function () { + + return this.getFilters()[ 0 ]; + + }, + + setFilter: function ( filter ) { + + return this.setFilters( filter ? [ filter ] : [] ); + + }, + + setPlaybackRate: function ( value ) { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + this.playbackRate = value; + + if ( this.isPlaying === true ) { + + this.source.playbackRate.setValueAtTime( this.playbackRate, this.context.currentTime ); + + } + + return this; + + }, + + getPlaybackRate: function () { + + return this.playbackRate; + + }, + + onEnded: function () { + + this.isPlaying = false; + + }, + + getLoop: function () { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return false; + + } + + return this.loop; + + }, + + setLoop: function ( value ) { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + this.loop = value; + + if ( this.isPlaying === true ) { + + this.source.loop = this.loop; + + } + + return this; + + }, + + getVolume: function () { + + return this.gain.gain.value; + + }, + + setVolume: function ( value ) { + + this.gain.gain.value = value; + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function PositionalAudio( listener ) { + + Audio.call( this, listener ); + + this.panner = this.context.createPanner(); + this.panner.connect( this.gain ); + + } + + PositionalAudio.prototype = Object.assign( Object.create( Audio.prototype ), { + + constructor: PositionalAudio, + + getOutput: function () { + + return this.panner; + + }, + + getRefDistance: function () { + + return this.panner.refDistance; + + }, + + setRefDistance: function ( value ) { + + this.panner.refDistance = value; + + }, + + getRolloffFactor: function () { + + return this.panner.rolloffFactor; + + }, + + setRolloffFactor: function ( value ) { + + this.panner.rolloffFactor = value; + + }, + + getDistanceModel: function () { + + return this.panner.distanceModel; + + }, + + setDistanceModel: function ( value ) { + + this.panner.distanceModel = value; + + }, + + getMaxDistance: function () { + + return this.panner.maxDistance; + + }, + + setMaxDistance: function ( value ) { + + this.panner.maxDistance = value; + + }, + + updateMatrixWorld: ( function () { + + var position = new Vector3(); + + return function updateMatrixWorld( force ) { + + Object3D.prototype.updateMatrixWorld.call( this, force ); + + position.setFromMatrixPosition( this.matrixWorld ); + + this.panner.setPosition( position.x, position.y, position.z ); + + }; + + } )() + + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function AudioAnalyser( audio, fftSize ) { + + this.analyser = audio.context.createAnalyser(); + this.analyser.fftSize = fftSize !== undefined ? fftSize : 2048; + + this.data = new Uint8Array( this.analyser.frequencyBinCount ); + + audio.getOutput().connect( this.analyser ); + + } + + Object.assign( AudioAnalyser.prototype, { + + getFrequencyData: function () { + + this.analyser.getByteFrequencyData( this.data ); + + return this.data; + + }, + + getAverageFrequency: function () { + + var value = 0, data = this.getFrequencyData(); + + for ( var i = 0; i < data.length; i ++ ) { + + value += data[ i ]; + + } + + return value / data.length; + + } + + } ); + + /** + * + * Buffered scene graph property that allows weighted accumulation. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function PropertyMixer( binding, typeName, valueSize ) { + + this.binding = binding; + this.valueSize = valueSize; + + var bufferType = Float64Array, + mixFunction; + + switch ( typeName ) { + + case 'quaternion': + mixFunction = this._slerp; + break; + + case 'string': + case 'bool': + bufferType = Array; + mixFunction = this._select; + break; + + default: + mixFunction = this._lerp; + + } + + this.buffer = new bufferType( valueSize * 4 ); + // layout: [ incoming | accu0 | accu1 | orig ] + // + // interpolators can use .buffer as their .result + // the data then goes to 'incoming' + // + // 'accu0' and 'accu1' are used frame-interleaved for + // the cumulative result and are compared to detect + // changes + // + // 'orig' stores the original state of the property + + this._mixBufferRegion = mixFunction; + + this.cumulativeWeight = 0; + + this.useCount = 0; + this.referenceCount = 0; + + } + + Object.assign( PropertyMixer.prototype, { + + // accumulate data in the 'incoming' region into 'accu<i>' + accumulate: function ( accuIndex, weight ) { + + // note: happily accumulating nothing when weight = 0, the caller knows + // the weight and shouldn't have made the call in the first place + + var buffer = this.buffer, + stride = this.valueSize, + offset = accuIndex * stride + stride, + + currentWeight = this.cumulativeWeight; + + if ( currentWeight === 0 ) { + + // accuN := incoming * weight + + for ( var i = 0; i !== stride; ++ i ) { + + buffer[ offset + i ] = buffer[ i ]; + + } + + currentWeight = weight; + + } else { + + // accuN := accuN + incoming * weight + + currentWeight += weight; + var mix = weight / currentWeight; + this._mixBufferRegion( buffer, offset, 0, mix, stride ); + + } + + this.cumulativeWeight = currentWeight; + + }, + + // apply the state of 'accu<i>' to the binding when accus differ + apply: function ( accuIndex ) { + + var stride = this.valueSize, + buffer = this.buffer, + offset = accuIndex * stride + stride, + + weight = this.cumulativeWeight, + + binding = this.binding; + + this.cumulativeWeight = 0; + + if ( weight < 1 ) { + + // accuN := accuN + original * ( 1 - cumulativeWeight ) + + var originalValueOffset = stride * 3; + + this._mixBufferRegion( + buffer, offset, originalValueOffset, 1 - weight, stride ); + + } + + for ( var i = stride, e = stride + stride; i !== e; ++ i ) { + + if ( buffer[ i ] !== buffer[ i + stride ] ) { + + // value has changed -> update scene graph + + binding.setValue( buffer, offset ); + break; + + } + + } + + }, + + // remember the state of the bound property and copy it to both accus + saveOriginalState: function () { + + var binding = this.binding; + + var buffer = this.buffer, + stride = this.valueSize, + + originalValueOffset = stride * 3; + + binding.getValue( buffer, originalValueOffset ); + + // accu[0..1] := orig -- initially detect changes against the original + for ( var i = stride, e = originalValueOffset; i !== e; ++ i ) { + + buffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ]; + + } + + this.cumulativeWeight = 0; + + }, + + // apply the state previously taken via 'saveOriginalState' to the binding + restoreOriginalState: function () { + + var originalValueOffset = this.valueSize * 3; + this.binding.setValue( this.buffer, originalValueOffset ); + + }, + + + // mix functions + + _select: function ( buffer, dstOffset, srcOffset, t, stride ) { + + if ( t >= 0.5 ) { + + for ( var i = 0; i !== stride; ++ i ) { + + buffer[ dstOffset + i ] = buffer[ srcOffset + i ]; + + } + + } + + }, + + _slerp: function ( buffer, dstOffset, srcOffset, t ) { + + Quaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, srcOffset, t ); + + }, + + _lerp: function ( buffer, dstOffset, srcOffset, t, stride ) { + + var s = 1 - t; + + for ( var i = 0; i !== stride; ++ i ) { + + var j = dstOffset + i; + + buffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t; + + } + + } + + } ); + + /** + * + * A reference to a real property in the scene graph. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function Composite( targetGroup, path, optionalParsedPath ) { + + var parsedPath = optionalParsedPath || PropertyBinding.parseTrackName( path ); + + this._targetGroup = targetGroup; + this._bindings = targetGroup.subscribe_( path, parsedPath ); + + } + + Object.assign( Composite.prototype, { + + getValue: function ( array, offset ) { + + this.bind(); // bind all binding + + var firstValidIndex = this._targetGroup.nCachedObjects_, + binding = this._bindings[ firstValidIndex ]; + + // and only call .getValue on the first + if ( binding !== undefined ) binding.getValue( array, offset ); + + }, + + setValue: function ( array, offset ) { + + var bindings = this._bindings; + + for ( var i = this._targetGroup.nCachedObjects_, + n = bindings.length; i !== n; ++ i ) { + + bindings[ i ].setValue( array, offset ); + + } + + }, + + bind: function () { + + var bindings = this._bindings; + + for ( var i = this._targetGroup.nCachedObjects_, + n = bindings.length; i !== n; ++ i ) { + + bindings[ i ].bind(); + + } + + }, + + unbind: function () { + + var bindings = this._bindings; + + for ( var i = this._targetGroup.nCachedObjects_, + n = bindings.length; i !== n; ++ i ) { + + bindings[ i ].unbind(); + + } + + } + + } ); + + + function PropertyBinding( rootNode, path, parsedPath ) { + + this.path = path; + this.parsedPath = parsedPath || PropertyBinding.parseTrackName( path ); + + this.node = PropertyBinding.findNode( rootNode, this.parsedPath.nodeName ) || rootNode; + + this.rootNode = rootNode; + + } + + Object.assign( PropertyBinding, { + + Composite: Composite, + + create: function ( root, path, parsedPath ) { + + if ( ! ( root && root.isAnimationObjectGroup ) ) { + + return new PropertyBinding( root, path, parsedPath ); + + } else { + + return new PropertyBinding.Composite( root, path, parsedPath ); + + } + + }, + + parseTrackName: function () { + + // Parent directories, delimited by '/' or ':'. Currently unused, but must + // be matched to parse the rest of the track name. + var directoryRe = /((?:[\w-]+[\/:])*)/; + + // Target node. May contain word characters (a-zA-Z0-9_) and '.' or '-'. + var nodeRe = /([\w-\.]+)?/; + + // Object on target node, and accessor. Name may contain only word + // characters. Accessor may contain any character except closing bracket. + var objectRe = /(?:\.([\w-]+)(?:\[(.+)\])?)?/; + + // Property and accessor. May contain only word characters. Accessor may + // contain any non-bracket characters. + var propertyRe = /\.([\w-]+)(?:\[(.+)\])?/; + + var trackRe = new RegExp('' + + '^' + + directoryRe.source + + nodeRe.source + + objectRe.source + + propertyRe.source + + '$' + ); + + var supportedObjectNames = [ 'material', 'materials', 'bones' ]; + + return function ( trackName ) { + + var matches = trackRe.exec( trackName ); + + if ( ! matches ) { + + throw new Error( 'PropertyBinding: Cannot parse trackName: ' + trackName ); + + } + + var results = { + // directoryName: matches[ 1 ], // (tschw) currently unused + nodeName: matches[ 2 ], + objectName: matches[ 3 ], + objectIndex: matches[ 4 ], + propertyName: matches[ 5 ], // required + propertyIndex: matches[ 6 ] + }; + + var lastDot = results.nodeName && results.nodeName.lastIndexOf( '.' ); + + if ( lastDot !== undefined && lastDot !== -1 ) { + + var objectName = results.nodeName.substring( lastDot + 1 ); + + // Object names must be checked against a whitelist. Otherwise, there + // is no way to parse 'foo.bar.baz': 'baz' must be a property, but + // 'bar' could be the objectName, or part of a nodeName (which can + // include '.' characters). + if ( supportedObjectNames.indexOf( objectName ) !== -1 ) { + + results.nodeName = results.nodeName.substring( 0, lastDot ); + results.objectName = objectName; + + } + + } + + if ( results.propertyName === null || results.propertyName.length === 0 ) { + + throw new Error( 'PropertyBinding: can not parse propertyName from trackName: ' + trackName ); + + } + + return results; + + }; + + }(), + + findNode: function ( root, nodeName ) { + + if ( ! nodeName || nodeName === "" || nodeName === "root" || nodeName === "." || nodeName === - 1 || nodeName === root.name || nodeName === root.uuid ) { + + return root; + + } + + // search into skeleton bones. + if ( root.skeleton ) { + + var searchSkeleton = function ( skeleton ) { + + for ( var i = 0; i < skeleton.bones.length; i ++ ) { + + var bone = skeleton.bones[ i ]; + + if ( bone.name === nodeName ) { + + return bone; + + } + + } + + return null; + + }; + + var bone = searchSkeleton( root.skeleton ); + + if ( bone ) { + + return bone; + + } + + } + + // search into node subtree. + if ( root.children ) { + + var searchNodeSubtree = function ( children ) { + + for ( var i = 0; i < children.length; i ++ ) { + + var childNode = children[ i ]; + + if ( childNode.name === nodeName || childNode.uuid === nodeName ) { + + return childNode; + + } + + var result = searchNodeSubtree( childNode.children ); + + if ( result ) return result; + + } + + return null; + + }; + + var subTreeNode = searchNodeSubtree( root.children ); + + if ( subTreeNode ) { + + return subTreeNode; + + } + + } + + return null; + + } + + } ); + + Object.assign( PropertyBinding.prototype, { // prototype, continued + + // these are used to "bind" a nonexistent property + _getValue_unavailable: function () {}, + _setValue_unavailable: function () {}, + + BindingType: { + Direct: 0, + EntireArray: 1, + ArrayElement: 2, + HasFromToArray: 3 + }, + + Versioning: { + None: 0, + NeedsUpdate: 1, + MatrixWorldNeedsUpdate: 2 + }, + + GetterByBindingType: [ + + function getValue_direct( buffer, offset ) { + + buffer[ offset ] = this.node[ this.propertyName ]; + + }, + + function getValue_array( buffer, offset ) { + + var source = this.resolvedProperty; + + for ( var i = 0, n = source.length; i !== n; ++ i ) { + + buffer[ offset ++ ] = source[ i ]; + + } + + }, + + function getValue_arrayElement( buffer, offset ) { + + buffer[ offset ] = this.resolvedProperty[ this.propertyIndex ]; + + }, + + function getValue_toArray( buffer, offset ) { + + this.resolvedProperty.toArray( buffer, offset ); + + } + + ], + + SetterByBindingTypeAndVersioning: [ + + [ + // Direct + + function setValue_direct( buffer, offset ) { + + this.node[ this.propertyName ] = buffer[ offset ]; + + }, + + function setValue_direct_setNeedsUpdate( buffer, offset ) { + + this.node[ this.propertyName ] = buffer[ offset ]; + this.targetObject.needsUpdate = true; + + }, + + function setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) { + + this.node[ this.propertyName ] = buffer[ offset ]; + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + ], [ + + // EntireArray + + function setValue_array( buffer, offset ) { + + var dest = this.resolvedProperty; + + for ( var i = 0, n = dest.length; i !== n; ++ i ) { + + dest[ i ] = buffer[ offset ++ ]; + + } + + }, + + function setValue_array_setNeedsUpdate( buffer, offset ) { + + var dest = this.resolvedProperty; + + for ( var i = 0, n = dest.length; i !== n; ++ i ) { + + dest[ i ] = buffer[ offset ++ ]; + + } + + this.targetObject.needsUpdate = true; + + }, + + function setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) { + + var dest = this.resolvedProperty; + + for ( var i = 0, n = dest.length; i !== n; ++ i ) { + + dest[ i ] = buffer[ offset ++ ]; + + } + + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + ], [ + + // ArrayElement + + function setValue_arrayElement( buffer, offset ) { + + this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ]; + + }, + + function setValue_arrayElement_setNeedsUpdate( buffer, offset ) { + + this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ]; + this.targetObject.needsUpdate = true; + + }, + + function setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) { + + this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ]; + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + ], [ + + // HasToFromArray + + function setValue_fromArray( buffer, offset ) { + + this.resolvedProperty.fromArray( buffer, offset ); + + }, + + function setValue_fromArray_setNeedsUpdate( buffer, offset ) { + + this.resolvedProperty.fromArray( buffer, offset ); + this.targetObject.needsUpdate = true; + + }, + + function setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) { + + this.resolvedProperty.fromArray( buffer, offset ); + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + ] + + ], + + getValue: function getValue_unbound( targetArray, offset ) { + + this.bind(); + this.getValue( targetArray, offset ); + + // Note: This class uses a State pattern on a per-method basis: + // 'bind' sets 'this.getValue' / 'setValue' and shadows the + // prototype version of these methods with one that represents + // the bound state. When the property is not found, the methods + // become no-ops. + + }, + + setValue: function getValue_unbound( sourceArray, offset ) { + + this.bind(); + this.setValue( sourceArray, offset ); + + }, + + // create getter / setter pair for a property in the scene graph + bind: function () { + + var targetObject = this.node, + parsedPath = this.parsedPath, + + objectName = parsedPath.objectName, + propertyName = parsedPath.propertyName, + propertyIndex = parsedPath.propertyIndex; + + if ( ! targetObject ) { + + targetObject = PropertyBinding.findNode( + this.rootNode, parsedPath.nodeName ) || this.rootNode; + + this.node = targetObject; + + } + + // set fail state so we can just 'return' on error + this.getValue = this._getValue_unavailable; + this.setValue = this._setValue_unavailable; + + // ensure there is a value node + if ( ! targetObject ) { + + console.error( " trying to update node for track: " + this.path + " but it wasn't found." ); + return; + + } + + if ( objectName ) { + + var objectIndex = parsedPath.objectIndex; + + // special cases were we need to reach deeper into the hierarchy to get the face materials.... + switch ( objectName ) { + + case 'materials': + + if ( ! targetObject.material ) { + + console.error( ' can not bind to material as node does not have a material', this ); + return; + + } + + if ( ! targetObject.material.materials ) { + + console.error( ' can not bind to material.materials as node.material does not have a materials array', this ); + return; + + } + + targetObject = targetObject.material.materials; + + break; + + case 'bones': + + if ( ! targetObject.skeleton ) { + + console.error( ' can not bind to bones as node does not have a skeleton', this ); + return; + + } + + // potential future optimization: skip this if propertyIndex is already an integer + // and convert the integer string to a true integer. + + targetObject = targetObject.skeleton.bones; + + // support resolving morphTarget names into indices. + for ( var i = 0; i < targetObject.length; i ++ ) { + + if ( targetObject[ i ].name === objectIndex ) { + + objectIndex = i; + break; + + } + + } + + break; + + default: + + if ( targetObject[ objectName ] === undefined ) { + + console.error( ' can not bind to objectName of node, undefined', this ); + return; + + } + + targetObject = targetObject[ objectName ]; + + } + + + if ( objectIndex !== undefined ) { + + if ( targetObject[ objectIndex ] === undefined ) { + + console.error( " trying to bind to objectIndex of objectName, but is undefined:", this, targetObject ); + return; + + } + + targetObject = targetObject[ objectIndex ]; + + } + + } + + // resolve property + var nodeProperty = targetObject[ propertyName ]; + + if ( nodeProperty === undefined ) { + + var nodeName = parsedPath.nodeName; + + console.error( " trying to update property for track: " + nodeName + + '.' + propertyName + " but it wasn't found.", targetObject ); + return; + + } + + // determine versioning scheme + var versioning = this.Versioning.None; + + if ( targetObject.needsUpdate !== undefined ) { // material + + versioning = this.Versioning.NeedsUpdate; + this.targetObject = targetObject; + + } else if ( targetObject.matrixWorldNeedsUpdate !== undefined ) { // node transform + + versioning = this.Versioning.MatrixWorldNeedsUpdate; + this.targetObject = targetObject; + + } + + // determine how the property gets bound + var bindingType = this.BindingType.Direct; + + if ( propertyIndex !== undefined ) { + + // access a sub element of the property array (only primitives are supported right now) + + if ( propertyName === "morphTargetInfluences" ) { + + // potential optimization, skip this if propertyIndex is already an integer, and convert the integer string to a true integer. + + // support resolving morphTarget names into indices. + if ( ! targetObject.geometry ) { + + console.error( ' can not bind to morphTargetInfluences becasuse node does not have a geometry', this ); + return; + + } + + if ( ! targetObject.geometry.morphTargets ) { + + console.error( ' can not bind to morphTargetInfluences becasuse node does not have a geometry.morphTargets', this ); + return; + + } + + for ( var i = 0; i < this.node.geometry.morphTargets.length; i ++ ) { + + if ( targetObject.geometry.morphTargets[ i ].name === propertyIndex ) { + + propertyIndex = i; + break; + + } + + } + + } + + bindingType = this.BindingType.ArrayElement; + + this.resolvedProperty = nodeProperty; + this.propertyIndex = propertyIndex; + + } else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) { + + // must use copy for Object3D.Euler/Quaternion + + bindingType = this.BindingType.HasFromToArray; + + this.resolvedProperty = nodeProperty; + + } else if ( Array.isArray( nodeProperty ) ) { + + bindingType = this.BindingType.EntireArray; + + this.resolvedProperty = nodeProperty; + + } else { + + this.propertyName = propertyName; + + } + + // select getter / setter + this.getValue = this.GetterByBindingType[ bindingType ]; + this.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ]; + + }, + + unbind: function () { + + this.node = null; + + // back to the prototype version of getValue / setValue + // note: avoiding to mutate the shape of 'this' via 'delete' + this.getValue = this._getValue_unbound; + this.setValue = this._setValue_unbound; + + } + + } ); + + //!\ DECLARE ALIAS AFTER assign prototype ! + Object.assign( PropertyBinding.prototype, { + + // initial state of these methods that calls 'bind' + _getValue_unbound: PropertyBinding.prototype.getValue, + _setValue_unbound: PropertyBinding.prototype.setValue, + + } ); + + /** + * + * A group of objects that receives a shared animation state. + * + * Usage: + * + * - Add objects you would otherwise pass as 'root' to the + * constructor or the .clipAction method of AnimationMixer. + * + * - Instead pass this object as 'root'. + * + * - You can also add and remove objects later when the mixer + * is running. + * + * Note: + * + * Objects of this class appear as one object to the mixer, + * so cache control of the individual objects must be done + * on the group. + * + * Limitation: + * + * - The animated properties must be compatible among the + * all objects in the group. + * + * - A single property can either be controlled through a + * target group or directly, but not both. + * + * @author tschw + */ + + function AnimationObjectGroup( var_args ) { + + this.uuid = _Math.generateUUID(); + + // cached objects followed by the active ones + this._objects = Array.prototype.slice.call( arguments ); + + this.nCachedObjects_ = 0; // threshold + // note: read by PropertyBinding.Composite + + var indices = {}; + this._indicesByUUID = indices; // for bookkeeping + + for ( var i = 0, n = arguments.length; i !== n; ++ i ) { + + indices[ arguments[ i ].uuid ] = i; + + } + + this._paths = []; // inside: string + this._parsedPaths = []; // inside: { we don't care, here } + this._bindings = []; // inside: Array< PropertyBinding > + this._bindingsIndicesByPath = {}; // inside: indices in these arrays + + var scope = this; + + this.stats = { + + objects: { + get total() { return scope._objects.length; }, + get inUse() { return this.total - scope.nCachedObjects_; } + }, + + get bindingsPerObject() { return scope._bindings.length; } + + }; + + } + + Object.assign( AnimationObjectGroup.prototype, { + + isAnimationObjectGroup: true, + + add: function( var_args ) { + + var objects = this._objects, + nObjects = objects.length, + nCachedObjects = this.nCachedObjects_, + indicesByUUID = this._indicesByUUID, + paths = this._paths, + parsedPaths = this._parsedPaths, + bindings = this._bindings, + nBindings = bindings.length; + + for ( var i = 0, n = arguments.length; i !== n; ++ i ) { + + var object = arguments[ i ], + uuid = object.uuid, + index = indicesByUUID[ uuid ], + knownObject = undefined; + + if ( index === undefined ) { + + // unknown object -> add it to the ACTIVE region + + index = nObjects ++; + indicesByUUID[ uuid ] = index; + objects.push( object ); + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + bindings[ j ].push( + new PropertyBinding( + object, paths[ j ], parsedPaths[ j ] ) ); + + } + + } else if ( index < nCachedObjects ) { + + knownObject = objects[ index ]; + + // move existing object to the ACTIVE region + + var firstActiveIndex = -- nCachedObjects, + lastCachedObject = objects[ firstActiveIndex ]; + + indicesByUUID[ lastCachedObject.uuid ] = index; + objects[ index ] = lastCachedObject; + + indicesByUUID[ uuid ] = firstActiveIndex; + objects[ firstActiveIndex ] = object; + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + var bindingsForPath = bindings[ j ], + lastCached = bindingsForPath[ firstActiveIndex ], + binding = bindingsForPath[ index ]; + + bindingsForPath[ index ] = lastCached; + + if ( binding === undefined ) { + + // since we do not bother to create new bindings + // for objects that are cached, the binding may + // or may not exist + + binding = new PropertyBinding( + object, paths[ j ], parsedPaths[ j ] ); + + } + + bindingsForPath[ firstActiveIndex ] = binding; + + } + + } else if ( objects[ index ] !== knownObject ) { + + console.error( "Different objects with the same UUID " + + "detected. Clean the caches or recreate your " + + "infrastructure when reloading scenes..." ); + + } // else the object is already where we want it to be + + } // for arguments + + this.nCachedObjects_ = nCachedObjects; + + }, + + remove: function( var_args ) { + + var objects = this._objects, + nCachedObjects = this.nCachedObjects_, + indicesByUUID = this._indicesByUUID, + bindings = this._bindings, + nBindings = bindings.length; + + for ( var i = 0, n = arguments.length; i !== n; ++ i ) { + + var object = arguments[ i ], + uuid = object.uuid, + index = indicesByUUID[ uuid ]; + + if ( index !== undefined && index >= nCachedObjects ) { + + // move existing object into the CACHED region + + var lastCachedIndex = nCachedObjects ++, + firstActiveObject = objects[ lastCachedIndex ]; + + indicesByUUID[ firstActiveObject.uuid ] = index; + objects[ index ] = firstActiveObject; + + indicesByUUID[ uuid ] = lastCachedIndex; + objects[ lastCachedIndex ] = object; + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + var bindingsForPath = bindings[ j ], + firstActive = bindingsForPath[ lastCachedIndex ], + binding = bindingsForPath[ index ]; + + bindingsForPath[ index ] = firstActive; + bindingsForPath[ lastCachedIndex ] = binding; + + } + + } + + } // for arguments + + this.nCachedObjects_ = nCachedObjects; + + }, + + // remove & forget + uncache: function( var_args ) { + + var objects = this._objects, + nObjects = objects.length, + nCachedObjects = this.nCachedObjects_, + indicesByUUID = this._indicesByUUID, + bindings = this._bindings, + nBindings = bindings.length; + + for ( var i = 0, n = arguments.length; i !== n; ++ i ) { + + var object = arguments[ i ], + uuid = object.uuid, + index = indicesByUUID[ uuid ]; + + if ( index !== undefined ) { + + delete indicesByUUID[ uuid ]; + + if ( index < nCachedObjects ) { + + // object is cached, shrink the CACHED region + + var firstActiveIndex = -- nCachedObjects, + lastCachedObject = objects[ firstActiveIndex ], + lastIndex = -- nObjects, + lastObject = objects[ lastIndex ]; + + // last cached object takes this object's place + indicesByUUID[ lastCachedObject.uuid ] = index; + objects[ index ] = lastCachedObject; + + // last object goes to the activated slot and pop + indicesByUUID[ lastObject.uuid ] = firstActiveIndex; + objects[ firstActiveIndex ] = lastObject; + objects.pop(); + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + var bindingsForPath = bindings[ j ], + lastCached = bindingsForPath[ firstActiveIndex ], + last = bindingsForPath[ lastIndex ]; + + bindingsForPath[ index ] = lastCached; + bindingsForPath[ firstActiveIndex ] = last; + bindingsForPath.pop(); + + } + + } else { + + // object is active, just swap with the last and pop + + var lastIndex = -- nObjects, + lastObject = objects[ lastIndex ]; + + indicesByUUID[ lastObject.uuid ] = index; + objects[ index ] = lastObject; + objects.pop(); + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + var bindingsForPath = bindings[ j ]; + + bindingsForPath[ index ] = bindingsForPath[ lastIndex ]; + bindingsForPath.pop(); + + } + + } // cached or active + + } // if object is known + + } // for arguments + + this.nCachedObjects_ = nCachedObjects; + + }, + + // Internal interface used by befriended PropertyBinding.Composite: + + subscribe_: function ( path, parsedPath ) { + + // returns an array of bindings for the given path that is changed + // according to the contained objects in the group + + var indicesByPath = this._bindingsIndicesByPath, + index = indicesByPath[ path ], + bindings = this._bindings; + + if ( index !== undefined ) return bindings[ index ]; + + var paths = this._paths, + parsedPaths = this._parsedPaths, + objects = this._objects, + nObjects = objects.length, + nCachedObjects = this.nCachedObjects_, + bindingsForPath = new Array( nObjects ); + + index = bindings.length; + + indicesByPath[ path ] = index; + + paths.push( path ); + parsedPaths.push( parsedPath ); + bindings.push( bindingsForPath ); + + for ( var i = nCachedObjects, n = objects.length; i !== n; ++ i ) { + + var object = objects[ i ]; + bindingsForPath[ i ] = new PropertyBinding( object, path, parsedPath ); + + } + + return bindingsForPath; + + }, + + unsubscribe_: function ( path ) { + + // tells the group to forget about a property path and no longer + // update the array previously obtained with 'subscribe_' + + var indicesByPath = this._bindingsIndicesByPath, + index = indicesByPath[ path ]; + + if ( index !== undefined ) { + + var paths = this._paths, + parsedPaths = this._parsedPaths, + bindings = this._bindings, + lastBindingsIndex = bindings.length - 1, + lastBindings = bindings[ lastBindingsIndex ], + lastBindingsPath = path[ lastBindingsIndex ]; + + indicesByPath[ lastBindingsPath ] = index; + + bindings[ index ] = lastBindings; + bindings.pop(); + + parsedPaths[ index ] = parsedPaths[ lastBindingsIndex ]; + parsedPaths.pop(); + + paths[ index ] = paths[ lastBindingsIndex ]; + paths.pop(); + + } + + } + + } ); + + /** + * + * Action provided by AnimationMixer for scheduling clip playback on specific + * objects. + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + * + */ + + function AnimationAction( mixer, clip, localRoot ) { + + this._mixer = mixer; + this._clip = clip; + this._localRoot = localRoot || null; + + var tracks = clip.tracks, + nTracks = tracks.length, + interpolants = new Array( nTracks ); + + var interpolantSettings = { + endingStart: ZeroCurvatureEnding, + endingEnd: ZeroCurvatureEnding + }; + + for ( var i = 0; i !== nTracks; ++ i ) { + + var interpolant = tracks[ i ].createInterpolant( null ); + interpolants[ i ] = interpolant; + interpolant.settings = interpolantSettings; + + } + + this._interpolantSettings = interpolantSettings; + + this._interpolants = interpolants; // bound by the mixer + + // inside: PropertyMixer (managed by the mixer) + this._propertyBindings = new Array( nTracks ); + + this._cacheIndex = null; // for the memory manager + this._byClipCacheIndex = null; // for the memory manager + + this._timeScaleInterpolant = null; + this._weightInterpolant = null; + + this.loop = LoopRepeat; + this._loopCount = -1; + + // global mixer time when the action is to be started + // it's set back to 'null' upon start of the action + this._startTime = null; + + // scaled local time of the action + // gets clamped or wrapped to 0..clip.duration according to loop + this.time = 0; + + this.timeScale = 1; + this._effectiveTimeScale = 1; + + this.weight = 1; + this._effectiveWeight = 1; + + this.repetitions = Infinity; // no. of repetitions when looping + + this.paused = false; // true -> zero effective time scale + this.enabled = true; // false -> zero effective weight + + this.clampWhenFinished = false; // keep feeding the last frame? + + this.zeroSlopeAtStart = true; // for smooth interpolation w/o separate + this.zeroSlopeAtEnd = true; // clips for start, loop and end + + } + + Object.assign( AnimationAction.prototype, { + + // State & Scheduling + + play: function() { + + this._mixer._activateAction( this ); + + return this; + + }, + + stop: function() { + + this._mixer._deactivateAction( this ); + + return this.reset(); + + }, + + reset: function() { + + this.paused = false; + this.enabled = true; + + this.time = 0; // restart clip + this._loopCount = -1; // forget previous loops + this._startTime = null; // forget scheduling + + return this.stopFading().stopWarping(); + + }, + + isRunning: function() { + + return this.enabled && ! this.paused && this.timeScale !== 0 && + this._startTime === null && this._mixer._isActiveAction( this ); + + }, + + // return true when play has been called + isScheduled: function() { + + return this._mixer._isActiveAction( this ); + + }, + + startAt: function( time ) { + + this._startTime = time; + + return this; + + }, + + setLoop: function( mode, repetitions ) { + + this.loop = mode; + this.repetitions = repetitions; + + return this; + + }, + + // Weight + + // set the weight stopping any scheduled fading + // although .enabled = false yields an effective weight of zero, this + // method does *not* change .enabled, because it would be confusing + setEffectiveWeight: function( weight ) { + + this.weight = weight; + + // note: same logic as when updated at runtime + this._effectiveWeight = this.enabled ? weight : 0; + + return this.stopFading(); + + }, + + // return the weight considering fading and .enabled + getEffectiveWeight: function() { + + return this._effectiveWeight; + + }, + + fadeIn: function( duration ) { + + return this._scheduleFading( duration, 0, 1 ); + + }, + + fadeOut: function( duration ) { + + return this._scheduleFading( duration, 1, 0 ); + + }, + + crossFadeFrom: function( fadeOutAction, duration, warp ) { + + fadeOutAction.fadeOut( duration ); + this.fadeIn( duration ); + + if( warp ) { + + var fadeInDuration = this._clip.duration, + fadeOutDuration = fadeOutAction._clip.duration, + + startEndRatio = fadeOutDuration / fadeInDuration, + endStartRatio = fadeInDuration / fadeOutDuration; + + fadeOutAction.warp( 1.0, startEndRatio, duration ); + this.warp( endStartRatio, 1.0, duration ); + + } + + return this; + + }, + + crossFadeTo: function( fadeInAction, duration, warp ) { + + return fadeInAction.crossFadeFrom( this, duration, warp ); + + }, + + stopFading: function() { + + var weightInterpolant = this._weightInterpolant; + + if ( weightInterpolant !== null ) { + + this._weightInterpolant = null; + this._mixer._takeBackControlInterpolant( weightInterpolant ); + + } + + return this; + + }, + + // Time Scale Control + + // set the time scale stopping any scheduled warping + // although .paused = true yields an effective time scale of zero, this + // method does *not* change .paused, because it would be confusing + setEffectiveTimeScale: function( timeScale ) { + + this.timeScale = timeScale; + this._effectiveTimeScale = this.paused ? 0 :timeScale; + + return this.stopWarping(); + + }, + + // return the time scale considering warping and .paused + getEffectiveTimeScale: function() { + + return this._effectiveTimeScale; + + }, + + setDuration: function( duration ) { + + this.timeScale = this._clip.duration / duration; + + return this.stopWarping(); + + }, + + syncWith: function( action ) { + + this.time = action.time; + this.timeScale = action.timeScale; + + return this.stopWarping(); + + }, + + halt: function( duration ) { + + return this.warp( this._effectiveTimeScale, 0, duration ); + + }, + + warp: function( startTimeScale, endTimeScale, duration ) { + + var mixer = this._mixer, now = mixer.time, + interpolant = this._timeScaleInterpolant, + + timeScale = this.timeScale; + + if ( interpolant === null ) { + + interpolant = mixer._lendControlInterpolant(); + this._timeScaleInterpolant = interpolant; + + } + + var times = interpolant.parameterPositions, + values = interpolant.sampleValues; + + times[ 0 ] = now; + times[ 1 ] = now + duration; + + values[ 0 ] = startTimeScale / timeScale; + values[ 1 ] = endTimeScale / timeScale; + + return this; + + }, + + stopWarping: function() { + + var timeScaleInterpolant = this._timeScaleInterpolant; + + if ( timeScaleInterpolant !== null ) { + + this._timeScaleInterpolant = null; + this._mixer._takeBackControlInterpolant( timeScaleInterpolant ); + + } + + return this; + + }, + + // Object Accessors + + getMixer: function() { + + return this._mixer; + + }, + + getClip: function() { + + return this._clip; + + }, + + getRoot: function() { + + return this._localRoot || this._mixer._root; + + }, + + // Interna + + _update: function( time, deltaTime, timeDirection, accuIndex ) { + + // called by the mixer + + if ( ! this.enabled ) { + + // call ._updateWeight() to update ._effectiveWeight + + this._updateWeight( time ); + return; + + } + + var startTime = this._startTime; + + if ( startTime !== null ) { + + // check for scheduled start of action + + var timeRunning = ( time - startTime ) * timeDirection; + if ( timeRunning < 0 || timeDirection === 0 ) { + + return; // yet to come / don't decide when delta = 0 + + } + + // start + + this._startTime = null; // unschedule + deltaTime = timeDirection * timeRunning; + + } + + // apply time scale and advance time + + deltaTime *= this._updateTimeScale( time ); + var clipTime = this._updateTime( deltaTime ); + + // note: _updateTime may disable the action resulting in + // an effective weight of 0 + + var weight = this._updateWeight( time ); + + if ( weight > 0 ) { + + var interpolants = this._interpolants; + var propertyMixers = this._propertyBindings; + + for ( var j = 0, m = interpolants.length; j !== m; ++ j ) { + + interpolants[ j ].evaluate( clipTime ); + propertyMixers[ j ].accumulate( accuIndex, weight ); + + } + + } + + }, + + _updateWeight: function( time ) { + + var weight = 0; + + if ( this.enabled ) { + + weight = this.weight; + var interpolant = this._weightInterpolant; + + if ( interpolant !== null ) { + + var interpolantValue = interpolant.evaluate( time )[ 0 ]; + + weight *= interpolantValue; + + if ( time > interpolant.parameterPositions[ 1 ] ) { + + this.stopFading(); + + if ( interpolantValue === 0 ) { + + // faded out, disable + this.enabled = false; + + } + + } + + } + + } + + this._effectiveWeight = weight; + return weight; + + }, + + _updateTimeScale: function( time ) { + + var timeScale = 0; + + if ( ! this.paused ) { + + timeScale = this.timeScale; + + var interpolant = this._timeScaleInterpolant; + + if ( interpolant !== null ) { + + var interpolantValue = interpolant.evaluate( time )[ 0 ]; + + timeScale *= interpolantValue; + + if ( time > interpolant.parameterPositions[ 1 ] ) { + + this.stopWarping(); + + if ( timeScale === 0 ) { + + // motion has halted, pause + this.paused = true; + + } else { + + // warp done - apply final time scale + this.timeScale = timeScale; + + } + + } + + } + + } + + this._effectiveTimeScale = timeScale; + return timeScale; + + }, + + _updateTime: function( deltaTime ) { + + var time = this.time + deltaTime; + + if ( deltaTime === 0 ) return time; + + var duration = this._clip.duration, + + loop = this.loop, + loopCount = this._loopCount; + + if ( loop === LoopOnce ) { + + if ( loopCount === -1 ) { + // just started + + this._loopCount = 0; + this._setEndings( true, true, false ); + + } + + handle_stop: { + + if ( time >= duration ) { + + time = duration; + + } else if ( time < 0 ) { + + time = 0; + + } else break handle_stop; + + if ( this.clampWhenFinished ) this.paused = true; + else this.enabled = false; + + this._mixer.dispatchEvent( { + type: 'finished', action: this, + direction: deltaTime < 0 ? -1 : 1 + } ); + + } + + } else { // repetitive Repeat or PingPong + + var pingPong = ( loop === LoopPingPong ); + + if ( loopCount === -1 ) { + // just started + + if ( deltaTime >= 0 ) { + + loopCount = 0; + + this._setEndings( + true, this.repetitions === 0, pingPong ); + + } else { + + // when looping in reverse direction, the initial + // transition through zero counts as a repetition, + // so leave loopCount at -1 + + this._setEndings( + this.repetitions === 0, true, pingPong ); + + } + + } + + if ( time >= duration || time < 0 ) { + // wrap around + + var loopDelta = Math.floor( time / duration ); // signed + time -= duration * loopDelta; + + loopCount += Math.abs( loopDelta ); + + var pending = this.repetitions - loopCount; + + if ( pending < 0 ) { + // have to stop (switch state, clamp time, fire event) + + if ( this.clampWhenFinished ) this.paused = true; + else this.enabled = false; + + time = deltaTime > 0 ? duration : 0; + + this._mixer.dispatchEvent( { + type: 'finished', action: this, + direction: deltaTime > 0 ? 1 : -1 + } ); + + } else { + // keep running + + if ( pending === 0 ) { + // entering the last round + + var atStart = deltaTime < 0; + this._setEndings( atStart, ! atStart, pingPong ); + + } else { + + this._setEndings( false, false, pingPong ); + + } + + this._loopCount = loopCount; + + this._mixer.dispatchEvent( { + type: 'loop', action: this, loopDelta: loopDelta + } ); + + } + + } + + if ( pingPong && ( loopCount & 1 ) === 1 ) { + // invert time for the "pong round" + + this.time = time; + return duration - time; + + } + + } + + this.time = time; + return time; + + }, + + _setEndings: function( atStart, atEnd, pingPong ) { + + var settings = this._interpolantSettings; + + if ( pingPong ) { + + settings.endingStart = ZeroSlopeEnding; + settings.endingEnd = ZeroSlopeEnding; + + } else { + + // assuming for LoopOnce atStart == atEnd == true + + if ( atStart ) { + + settings.endingStart = this.zeroSlopeAtStart ? + ZeroSlopeEnding : ZeroCurvatureEnding; + + } else { + + settings.endingStart = WrapAroundEnding; + + } + + if ( atEnd ) { + + settings.endingEnd = this.zeroSlopeAtEnd ? + ZeroSlopeEnding : ZeroCurvatureEnding; + + } else { + + settings.endingEnd = WrapAroundEnding; + + } + + } + + }, + + _scheduleFading: function( duration, weightNow, weightThen ) { + + var mixer = this._mixer, now = mixer.time, + interpolant = this._weightInterpolant; + + if ( interpolant === null ) { + + interpolant = mixer._lendControlInterpolant(); + this._weightInterpolant = interpolant; + + } + + var times = interpolant.parameterPositions, + values = interpolant.sampleValues; + + times[ 0 ] = now; values[ 0 ] = weightNow; + times[ 1 ] = now + duration; values[ 1 ] = weightThen; + + return this; + + } + + } ); + + /** + * + * Player for AnimationClips. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function AnimationMixer( root ) { + + this._root = root; + this._initMemoryManager(); + this._accuIndex = 0; + + this.time = 0; + + this.timeScale = 1.0; + + } + + Object.assign( AnimationMixer.prototype, EventDispatcher.prototype, { + + _bindAction: function ( action, prototypeAction ) { + + var root = action._localRoot || this._root, + tracks = action._clip.tracks, + nTracks = tracks.length, + bindings = action._propertyBindings, + interpolants = action._interpolants, + rootUuid = root.uuid, + bindingsByRoot = this._bindingsByRootAndName, + bindingsByName = bindingsByRoot[ rootUuid ]; + + if ( bindingsByName === undefined ) { + + bindingsByName = {}; + bindingsByRoot[ rootUuid ] = bindingsByName; + + } + + for ( var i = 0; i !== nTracks; ++ i ) { + + var track = tracks[ i ], + trackName = track.name, + binding = bindingsByName[ trackName ]; + + if ( binding !== undefined ) { + + bindings[ i ] = binding; + + } else { + + binding = bindings[ i ]; + + if ( binding !== undefined ) { + + // existing binding, make sure the cache knows + + if ( binding._cacheIndex === null ) { + + ++ binding.referenceCount; + this._addInactiveBinding( binding, rootUuid, trackName ); + + } + + continue; + + } + + var path = prototypeAction && prototypeAction. + _propertyBindings[ i ].binding.parsedPath; + + binding = new PropertyMixer( + PropertyBinding.create( root, trackName, path ), + track.ValueTypeName, track.getValueSize() ); + + ++ binding.referenceCount; + this._addInactiveBinding( binding, rootUuid, trackName ); + + bindings[ i ] = binding; + + } + + interpolants[ i ].resultBuffer = binding.buffer; + + } + + }, + + _activateAction: function ( action ) { + + if ( ! this._isActiveAction( action ) ) { + + if ( action._cacheIndex === null ) { + + // this action has been forgotten by the cache, but the user + // appears to be still using it -> rebind + + var rootUuid = ( action._localRoot || this._root ).uuid, + clipUuid = action._clip.uuid, + actionsForClip = this._actionsByClip[ clipUuid ]; + + this._bindAction( action, + actionsForClip && actionsForClip.knownActions[ 0 ] ); + + this._addInactiveAction( action, clipUuid, rootUuid ); + + } + + var bindings = action._propertyBindings; + + // increment reference counts / sort out state + for ( var i = 0, n = bindings.length; i !== n; ++ i ) { + + var binding = bindings[ i ]; + + if ( binding.useCount ++ === 0 ) { + + this._lendBinding( binding ); + binding.saveOriginalState(); + + } + + } + + this._lendAction( action ); + + } + + }, + + _deactivateAction: function ( action ) { + + if ( this._isActiveAction( action ) ) { + + var bindings = action._propertyBindings; + + // decrement reference counts / sort out state + for ( var i = 0, n = bindings.length; i !== n; ++ i ) { + + var binding = bindings[ i ]; + + if ( -- binding.useCount === 0 ) { + + binding.restoreOriginalState(); + this._takeBackBinding( binding ); + + } + + } + + this._takeBackAction( action ); + + } + + }, + + // Memory manager + + _initMemoryManager: function () { + + this._actions = []; // 'nActiveActions' followed by inactive ones + this._nActiveActions = 0; + + this._actionsByClip = {}; + // inside: + // { + // knownActions: Array< AnimationAction > - used as prototypes + // actionByRoot: AnimationAction - lookup + // } + + + this._bindings = []; // 'nActiveBindings' followed by inactive ones + this._nActiveBindings = 0; + + this._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer > + + + this._controlInterpolants = []; // same game as above + this._nActiveControlInterpolants = 0; + + var scope = this; + + this.stats = { + + actions: { + get total() { return scope._actions.length; }, + get inUse() { return scope._nActiveActions; } + }, + bindings: { + get total() { return scope._bindings.length; }, + get inUse() { return scope._nActiveBindings; } + }, + controlInterpolants: { + get total() { return scope._controlInterpolants.length; }, + get inUse() { return scope._nActiveControlInterpolants; } + } + + }; + + }, + + // Memory management for AnimationAction objects + + _isActiveAction: function ( action ) { + + var index = action._cacheIndex; + return index !== null && index < this._nActiveActions; + + }, + + _addInactiveAction: function ( action, clipUuid, rootUuid ) { + + var actions = this._actions, + actionsByClip = this._actionsByClip, + actionsForClip = actionsByClip[ clipUuid ]; + + if ( actionsForClip === undefined ) { + + actionsForClip = { + + knownActions: [ action ], + actionByRoot: {} + + }; + + action._byClipCacheIndex = 0; + + actionsByClip[ clipUuid ] = actionsForClip; + + } else { + + var knownActions = actionsForClip.knownActions; + + action._byClipCacheIndex = knownActions.length; + knownActions.push( action ); + + } + + action._cacheIndex = actions.length; + actions.push( action ); + + actionsForClip.actionByRoot[ rootUuid ] = action; + + }, + + _removeInactiveAction: function ( action ) { + + var actions = this._actions, + lastInactiveAction = actions[ actions.length - 1 ], + cacheIndex = action._cacheIndex; + + lastInactiveAction._cacheIndex = cacheIndex; + actions[ cacheIndex ] = lastInactiveAction; + actions.pop(); + + action._cacheIndex = null; + + + var clipUuid = action._clip.uuid, + actionsByClip = this._actionsByClip, + actionsForClip = actionsByClip[ clipUuid ], + knownActionsForClip = actionsForClip.knownActions, + + lastKnownAction = + knownActionsForClip[ knownActionsForClip.length - 1 ], + + byClipCacheIndex = action._byClipCacheIndex; + + lastKnownAction._byClipCacheIndex = byClipCacheIndex; + knownActionsForClip[ byClipCacheIndex ] = lastKnownAction; + knownActionsForClip.pop(); + + action._byClipCacheIndex = null; + + + var actionByRoot = actionsForClip.actionByRoot, + rootUuid = ( action._localRoot || this._root ).uuid; + + delete actionByRoot[ rootUuid ]; + + if ( knownActionsForClip.length === 0 ) { + + delete actionsByClip[ clipUuid ]; + + } + + this._removeInactiveBindingsForAction( action ); + + }, + + _removeInactiveBindingsForAction: function ( action ) { + + var bindings = action._propertyBindings; + for ( var i = 0, n = bindings.length; i !== n; ++ i ) { + + var binding = bindings[ i ]; + + if ( -- binding.referenceCount === 0 ) { + + this._removeInactiveBinding( binding ); + + } + + } + + }, + + _lendAction: function ( action ) { + + // [ active actions | inactive actions ] + // [ active actions >| inactive actions ] + // s a + // <-swap-> + // a s + + var actions = this._actions, + prevIndex = action._cacheIndex, + + lastActiveIndex = this._nActiveActions ++, + + firstInactiveAction = actions[ lastActiveIndex ]; + + action._cacheIndex = lastActiveIndex; + actions[ lastActiveIndex ] = action; + + firstInactiveAction._cacheIndex = prevIndex; + actions[ prevIndex ] = firstInactiveAction; + + }, + + _takeBackAction: function ( action ) { + + // [ active actions | inactive actions ] + // [ active actions |< inactive actions ] + // a s + // <-swap-> + // s a + + var actions = this._actions, + prevIndex = action._cacheIndex, + + firstInactiveIndex = -- this._nActiveActions, + + lastActiveAction = actions[ firstInactiveIndex ]; + + action._cacheIndex = firstInactiveIndex; + actions[ firstInactiveIndex ] = action; + + lastActiveAction._cacheIndex = prevIndex; + actions[ prevIndex ] = lastActiveAction; + + }, + + // Memory management for PropertyMixer objects + + _addInactiveBinding: function ( binding, rootUuid, trackName ) { + + var bindingsByRoot = this._bindingsByRootAndName, + bindingByName = bindingsByRoot[ rootUuid ], + + bindings = this._bindings; + + if ( bindingByName === undefined ) { + + bindingByName = {}; + bindingsByRoot[ rootUuid ] = bindingByName; + + } + + bindingByName[ trackName ] = binding; + + binding._cacheIndex = bindings.length; + bindings.push( binding ); + + }, + + _removeInactiveBinding: function ( binding ) { + + var bindings = this._bindings, + propBinding = binding.binding, + rootUuid = propBinding.rootNode.uuid, + trackName = propBinding.path, + bindingsByRoot = this._bindingsByRootAndName, + bindingByName = bindingsByRoot[ rootUuid ], + + lastInactiveBinding = bindings[ bindings.length - 1 ], + cacheIndex = binding._cacheIndex; + + lastInactiveBinding._cacheIndex = cacheIndex; + bindings[ cacheIndex ] = lastInactiveBinding; + bindings.pop(); + + delete bindingByName[ trackName ]; + + remove_empty_map: { + + for ( var _ in bindingByName ) break remove_empty_map; + + delete bindingsByRoot[ rootUuid ]; + + } + + }, + + _lendBinding: function ( binding ) { + + var bindings = this._bindings, + prevIndex = binding._cacheIndex, + + lastActiveIndex = this._nActiveBindings ++, + + firstInactiveBinding = bindings[ lastActiveIndex ]; + + binding._cacheIndex = lastActiveIndex; + bindings[ lastActiveIndex ] = binding; + + firstInactiveBinding._cacheIndex = prevIndex; + bindings[ prevIndex ] = firstInactiveBinding; + + }, + + _takeBackBinding: function ( binding ) { + + var bindings = this._bindings, + prevIndex = binding._cacheIndex, + + firstInactiveIndex = -- this._nActiveBindings, + + lastActiveBinding = bindings[ firstInactiveIndex ]; + + binding._cacheIndex = firstInactiveIndex; + bindings[ firstInactiveIndex ] = binding; + + lastActiveBinding._cacheIndex = prevIndex; + bindings[ prevIndex ] = lastActiveBinding; + + }, + + + // Memory management of Interpolants for weight and time scale + + _lendControlInterpolant: function () { + + var interpolants = this._controlInterpolants, + lastActiveIndex = this._nActiveControlInterpolants ++, + interpolant = interpolants[ lastActiveIndex ]; + + if ( interpolant === undefined ) { + + interpolant = new LinearInterpolant( + new Float32Array( 2 ), new Float32Array( 2 ), + 1, this._controlInterpolantsResultBuffer ); + + interpolant.__cacheIndex = lastActiveIndex; + interpolants[ lastActiveIndex ] = interpolant; + + } + + return interpolant; + + }, + + _takeBackControlInterpolant: function ( interpolant ) { + + var interpolants = this._controlInterpolants, + prevIndex = interpolant.__cacheIndex, + + firstInactiveIndex = -- this._nActiveControlInterpolants, + + lastActiveInterpolant = interpolants[ firstInactiveIndex ]; + + interpolant.__cacheIndex = firstInactiveIndex; + interpolants[ firstInactiveIndex ] = interpolant; + + lastActiveInterpolant.__cacheIndex = prevIndex; + interpolants[ prevIndex ] = lastActiveInterpolant; + + }, + + _controlInterpolantsResultBuffer: new Float32Array( 1 ), + + // return an action for a clip optionally using a custom root target + // object (this method allocates a lot of dynamic memory in case a + // previously unknown clip/root combination is specified) + clipAction: function ( clip, optionalRoot ) { + + var root = optionalRoot || this._root, + rootUuid = root.uuid, + + clipObject = typeof clip === 'string' ? + AnimationClip.findByName( root, clip ) : clip, + + clipUuid = clipObject !== null ? clipObject.uuid : clip, + + actionsForClip = this._actionsByClip[ clipUuid ], + prototypeAction = null; + + if ( actionsForClip !== undefined ) { + + var existingAction = + actionsForClip.actionByRoot[ rootUuid ]; + + if ( existingAction !== undefined ) { + + return existingAction; + + } + + // we know the clip, so we don't have to parse all + // the bindings again but can just copy + prototypeAction = actionsForClip.knownActions[ 0 ]; + + // also, take the clip from the prototype action + if ( clipObject === null ) + clipObject = prototypeAction._clip; + + } + + // clip must be known when specified via string + if ( clipObject === null ) return null; + + // allocate all resources required to run it + var newAction = new AnimationAction( this, clipObject, optionalRoot ); + + this._bindAction( newAction, prototypeAction ); + + // and make the action known to the memory manager + this._addInactiveAction( newAction, clipUuid, rootUuid ); + + return newAction; + + }, + + // get an existing action + existingAction: function ( clip, optionalRoot ) { + + var root = optionalRoot || this._root, + rootUuid = root.uuid, + + clipObject = typeof clip === 'string' ? + AnimationClip.findByName( root, clip ) : clip, + + clipUuid = clipObject ? clipObject.uuid : clip, + + actionsForClip = this._actionsByClip[ clipUuid ]; + + if ( actionsForClip !== undefined ) { + + return actionsForClip.actionByRoot[ rootUuid ] || null; + + } + + return null; + + }, + + // deactivates all previously scheduled actions + stopAllAction: function () { + + var actions = this._actions, + nActions = this._nActiveActions, + bindings = this._bindings, + nBindings = this._nActiveBindings; + + this._nActiveActions = 0; + this._nActiveBindings = 0; + + for ( var i = 0; i !== nActions; ++ i ) { + + actions[ i ].reset(); + + } + + for ( var i = 0; i !== nBindings; ++ i ) { + + bindings[ i ].useCount = 0; + + } + + return this; + + }, + + // advance the time and update apply the animation + update: function ( deltaTime ) { + + deltaTime *= this.timeScale; + + var actions = this._actions, + nActions = this._nActiveActions, + + time = this.time += deltaTime, + timeDirection = Math.sign( deltaTime ), + + accuIndex = this._accuIndex ^= 1; + + // run active actions + + for ( var i = 0; i !== nActions; ++ i ) { + + var action = actions[ i ]; + + action._update( time, deltaTime, timeDirection, accuIndex ); + + } + + // update scene graph + + var bindings = this._bindings, + nBindings = this._nActiveBindings; + + for ( var i = 0; i !== nBindings; ++ i ) { + + bindings[ i ].apply( accuIndex ); + + } + + return this; + + }, + + // return this mixer's root target object + getRoot: function () { + + return this._root; + + }, + + // free all resources specific to a particular clip + uncacheClip: function ( clip ) { + + var actions = this._actions, + clipUuid = clip.uuid, + actionsByClip = this._actionsByClip, + actionsForClip = actionsByClip[ clipUuid ]; + + if ( actionsForClip !== undefined ) { + + // note: just calling _removeInactiveAction would mess up the + // iteration state and also require updating the state we can + // just throw away + + var actionsToRemove = actionsForClip.knownActions; + + for ( var i = 0, n = actionsToRemove.length; i !== n; ++ i ) { + + var action = actionsToRemove[ i ]; + + this._deactivateAction( action ); + + var cacheIndex = action._cacheIndex, + lastInactiveAction = actions[ actions.length - 1 ]; + + action._cacheIndex = null; + action._byClipCacheIndex = null; + + lastInactiveAction._cacheIndex = cacheIndex; + actions[ cacheIndex ] = lastInactiveAction; + actions.pop(); + + this._removeInactiveBindingsForAction( action ); + + } + + delete actionsByClip[ clipUuid ]; + + } + + }, + + // free all resources specific to a particular root target object + uncacheRoot: function ( root ) { + + var rootUuid = root.uuid, + actionsByClip = this._actionsByClip; + + for ( var clipUuid in actionsByClip ) { + + var actionByRoot = actionsByClip[ clipUuid ].actionByRoot, + action = actionByRoot[ rootUuid ]; + + if ( action !== undefined ) { + + this._deactivateAction( action ); + this._removeInactiveAction( action ); + + } + + } + + var bindingsByRoot = this._bindingsByRootAndName, + bindingByName = bindingsByRoot[ rootUuid ]; + + if ( bindingByName !== undefined ) { + + for ( var trackName in bindingByName ) { + + var binding = bindingByName[ trackName ]; + binding.restoreOriginalState(); + this._removeInactiveBinding( binding ); + + } + + } + + }, + + // remove a targeted clip from the cache + uncacheAction: function ( clip, optionalRoot ) { + + var action = this.existingAction( clip, optionalRoot ); + + if ( action !== null ) { + + this._deactivateAction( action ); + this._removeInactiveAction( action ); + + } + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Uniform( value ) { + + if ( typeof value === 'string' ) { + + console.warn( 'THREE.Uniform: Type parameter is no longer needed.' ); + value = arguments[ 1 ]; + + } + + this.value = value; + + } + + Uniform.prototype.clone = function () { + + return new Uniform( this.value.clone === undefined ? this.value : this.value.clone() ); + + }; + + /** + * @author benaadams / https://twitter.com/ben_a_adams + */ + + function InstancedBufferGeometry() { + + BufferGeometry.call( this ); + + this.type = 'InstancedBufferGeometry'; + this.maxInstancedCount = undefined; + + } + + InstancedBufferGeometry.prototype = Object.assign( Object.create( BufferGeometry.prototype ), { + + constructor: InstancedBufferGeometry, + + isInstancedBufferGeometry: true, + + addGroup: function ( start, count, materialIndex ) { + + this.groups.push( { + + start: start, + count: count, + materialIndex: materialIndex + + } ); + + }, + + copy: function ( source ) { + + var index = source.index; + + if ( index !== null ) { + + this.setIndex( index.clone() ); + + } + + var attributes = source.attributes; + + for ( var name in attributes ) { + + var attribute = attributes[ name ]; + this.addAttribute( name, attribute.clone() ); + + } + + var groups = source.groups; + + for ( var i = 0, l = groups.length; i < l; i ++ ) { + + var group = groups[ i ]; + this.addGroup( group.start, group.count, group.materialIndex ); + + } + + return this; + + } + + } ); + + /** + * @author benaadams / https://twitter.com/ben_a_adams + */ + + function InterleavedBufferAttribute( interleavedBuffer, itemSize, offset, normalized ) { + + this.uuid = _Math.generateUUID(); + + this.data = interleavedBuffer; + this.itemSize = itemSize; + this.offset = offset; + + this.normalized = normalized === true; + + } + + Object.defineProperties( InterleavedBufferAttribute.prototype, { + + count: { + + get: function () { + + return this.data.count; + + } + + }, + + array: { + + get: function () { + + return this.data.array; + + } + + } + + } ); + + Object.assign( InterleavedBufferAttribute.prototype, { + + isInterleavedBufferAttribute: true, + + setX: function ( index, x ) { + + this.data.array[ index * this.data.stride + this.offset ] = x; + + return this; + + }, + + setY: function ( index, y ) { + + this.data.array[ index * this.data.stride + this.offset + 1 ] = y; + + return this; + + }, + + setZ: function ( index, z ) { + + this.data.array[ index * this.data.stride + this.offset + 2 ] = z; + + return this; + + }, + + setW: function ( index, w ) { + + this.data.array[ index * this.data.stride + this.offset + 3 ] = w; + + return this; + + }, + + getX: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset ]; + + }, + + getY: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset + 1 ]; + + }, + + getZ: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset + 2 ]; + + }, + + getW: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset + 3 ]; + + }, + + setXY: function ( index, x, y ) { + + index = index * this.data.stride + this.offset; + + this.data.array[ index + 0 ] = x; + this.data.array[ index + 1 ] = y; + + return this; + + }, + + setXYZ: function ( index, x, y, z ) { + + index = index * this.data.stride + this.offset; + + this.data.array[ index + 0 ] = x; + this.data.array[ index + 1 ] = y; + this.data.array[ index + 2 ] = z; + + return this; + + }, + + setXYZW: function ( index, x, y, z, w ) { + + index = index * this.data.stride + this.offset; + + this.data.array[ index + 0 ] = x; + this.data.array[ index + 1 ] = y; + this.data.array[ index + 2 ] = z; + this.data.array[ index + 3 ] = w; + + return this; + + } + + } ); + + /** + * @author benaadams / https://twitter.com/ben_a_adams + */ + + function InterleavedBuffer( array, stride ) { + + this.uuid = _Math.generateUUID(); + + this.array = array; + this.stride = stride; + this.count = array !== undefined ? array.length / stride : 0; + + this.dynamic = false; + this.updateRange = { offset: 0, count: - 1 }; + + this.onUploadCallback = function () {}; + + this.version = 0; + + } + + Object.defineProperty( InterleavedBuffer.prototype, 'needsUpdate', { + + set: function ( value ) { + + if ( value === true ) this.version ++; + + } + + } ); + + Object.assign( InterleavedBuffer.prototype, { + + isInterleavedBuffer: true, + + setArray: function ( array ) { + + if ( Array.isArray( array ) ) { + + throw new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' ); + + } + + this.count = array !== undefined ? array.length / this.stride : 0; + this.array = array; + + }, + + setDynamic: function ( value ) { + + this.dynamic = value; + + return this; + + }, + + copy: function ( source ) { + + this.array = new source.array.constructor( source.array ); + this.count = source.count; + this.stride = source.stride; + this.dynamic = source.dynamic; + + return this; + + }, + + copyAt: function ( index1, attribute, index2 ) { + + index1 *= this.stride; + index2 *= attribute.stride; + + for ( var i = 0, l = this.stride; i < l; i ++ ) { + + this.array[ index1 + i ] = attribute.array[ index2 + i ]; + + } + + return this; + + }, + + set: function ( value, offset ) { + + if ( offset === undefined ) offset = 0; + + this.array.set( value, offset ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + onUpload: function ( callback ) { + + this.onUploadCallback = callback; + + return this; + + } + + } ); + + /** + * @author benaadams / https://twitter.com/ben_a_adams + */ + + function InstancedInterleavedBuffer( array, stride, meshPerAttribute ) { + + InterleavedBuffer.call( this, array, stride ); + + this.meshPerAttribute = meshPerAttribute || 1; + + } + + InstancedInterleavedBuffer.prototype = Object.assign( Object.create( InterleavedBuffer.prototype ), { + + constructor: InstancedInterleavedBuffer, + + isInstancedInterleavedBuffer: true, + + copy: function ( source ) { + + InterleavedBuffer.prototype.copy.call( this, source ); + + this.meshPerAttribute = source.meshPerAttribute; + + return this; + + } + + } ); + + /** + * @author benaadams / https://twitter.com/ben_a_adams + */ + + function InstancedBufferAttribute( array, itemSize, meshPerAttribute ) { + + BufferAttribute.call( this, array, itemSize ); + + this.meshPerAttribute = meshPerAttribute || 1; + + } + + InstancedBufferAttribute.prototype = Object.assign( Object.create( BufferAttribute.prototype ), { + + constructor: InstancedBufferAttribute, + + isInstancedBufferAttribute: true, + + copy: function ( source ) { + + BufferAttribute.prototype.copy.call( this, source ); + + this.meshPerAttribute = source.meshPerAttribute; + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author bhouston / http://clara.io/ + * @author stephomi / http://stephaneginier.com/ + */ + + function Raycaster( origin, direction, near, far ) { + + this.ray = new Ray( origin, direction ); + // direction is assumed to be normalized (for accurate distance calculations) + + this.near = near || 0; + this.far = far || Infinity; + + this.params = { + Mesh: {}, + Line: {}, + LOD: {}, + Points: { threshold: 1 }, + Sprite: {} + }; + + Object.defineProperties( this.params, { + PointCloud: { + get: function () { + console.warn( 'THREE.Raycaster: params.PointCloud has been renamed to params.Points.' ); + return this.Points; + } + } + } ); + + } + + function ascSort( a, b ) { + + return a.distance - b.distance; + + } + + function intersectObject( object, raycaster, intersects, recursive ) { + + if ( object.visible === false ) return; + + object.raycast( raycaster, intersects ); + + if ( recursive === true ) { + + var children = object.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + intersectObject( children[ i ], raycaster, intersects, true ); + + } + + } + + } + + Object.assign( Raycaster.prototype, { + + linePrecision: 1, + + set: function ( origin, direction ) { + + // direction is assumed to be normalized (for accurate distance calculations) + + this.ray.set( origin, direction ); + + }, + + setFromCamera: function ( coords, camera ) { + + if ( ( camera && camera.isPerspectiveCamera ) ) { + + this.ray.origin.setFromMatrixPosition( camera.matrixWorld ); + this.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize(); + + } else if ( ( camera && camera.isOrthographicCamera ) ) { + + this.ray.origin.set( coords.x, coords.y, ( camera.near + camera.far ) / ( camera.near - camera.far ) ).unproject( camera ); // set origin in plane of camera + this.ray.direction.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld ); + + } else { + + console.error( 'THREE.Raycaster: Unsupported camera type.' ); + + } + + }, + + intersectObject: function ( object, recursive ) { + + var intersects = []; + + intersectObject( object, this, intersects, recursive ); + + intersects.sort( ascSort ); + + return intersects; + + }, + + intersectObjects: function ( objects, recursive ) { + + var intersects = []; + + if ( Array.isArray( objects ) === false ) { + + console.warn( 'THREE.Raycaster.intersectObjects: objects is not an Array.' ); + return intersects; + + } + + for ( var i = 0, l = objects.length; i < l; i ++ ) { + + intersectObject( objects[ i ], this, intersects, recursive ); + + } + + intersects.sort( ascSort ); + + return intersects; + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function Clock( autoStart ) { + + this.autoStart = ( autoStart !== undefined ) ? autoStart : true; + + this.startTime = 0; + this.oldTime = 0; + this.elapsedTime = 0; + + this.running = false; + + } + + Object.assign( Clock.prototype, { + + start: function () { + + this.startTime = ( typeof performance === 'undefined' ? Date : performance ).now(); // see #10732 + + this.oldTime = this.startTime; + this.elapsedTime = 0; + this.running = true; + + }, + + stop: function () { + + this.getElapsedTime(); + this.running = false; + + }, + + getElapsedTime: function () { + + this.getDelta(); + return this.elapsedTime; + + }, + + getDelta: function () { + + var diff = 0; + + if ( this.autoStart && ! this.running ) { + + this.start(); + return 0; + + } + + if ( this.running ) { + + var newTime = ( typeof performance === 'undefined' ? Date : performance ).now(); + + diff = ( newTime - this.oldTime ) / 1000; + this.oldTime = newTime; + + this.elapsedTime += diff; + + } + + return diff; + + } + + } ); + + /** + * @author bhouston / http://clara.io + * @author WestLangley / http://github.com/WestLangley + * + * Ref: https://en.wikipedia.org/wiki/Spherical_coordinate_system + * + * The poles (phi) are at the positive and negative y axis. + * The equator starts at positive z. + */ + + function Spherical( radius, phi, theta ) { + + this.radius = ( radius !== undefined ) ? radius : 1.0; + this.phi = ( phi !== undefined ) ? phi : 0; // up / down towards top and bottom pole + this.theta = ( theta !== undefined ) ? theta : 0; // around the equator of the sphere + + return this; + + } + + Object.assign( Spherical.prototype, { + + set: function ( radius, phi, theta ) { + + this.radius = radius; + this.phi = phi; + this.theta = theta; + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( other ) { + + this.radius = other.radius; + this.phi = other.phi; + this.theta = other.theta; + + return this; + + }, + + // restrict phi to be betwee EPS and PI-EPS + makeSafe: function() { + + var EPS = 0.000001; + this.phi = Math.max( EPS, Math.min( Math.PI - EPS, this.phi ) ); + + return this; + + }, + + setFromVector3: function( vec3 ) { + + this.radius = vec3.length(); + + if ( this.radius === 0 ) { + + this.theta = 0; + this.phi = 0; + + } else { + + this.theta = Math.atan2( vec3.x, vec3.z ); // equator angle around y-up axis + this.phi = Math.acos( _Math.clamp( vec3.y / this.radius, - 1, 1 ) ); // polar angle + + } + + return this; + + } + + } ); + + /** + * @author Mugen87 / https://github.com/Mugen87 + * + * Ref: https://en.wikipedia.org/wiki/Cylindrical_coordinate_system + * + */ + + function Cylindrical( radius, theta, y ) { + + this.radius = ( radius !== undefined ) ? radius : 1.0; // distance from the origin to a point in the x-z plane + this.theta = ( theta !== undefined ) ? theta : 0; // counterclockwise angle in the x-z plane measured in radians from the positive z-axis + this.y = ( y !== undefined ) ? y : 0; // height above the x-z plane + + return this; + + } + + Object.assign( Cylindrical.prototype, { + + set: function ( radius, theta, y ) { + + this.radius = radius; + this.theta = theta; + this.y = y; + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( other ) { + + this.radius = other.radius; + this.theta = other.theta; + this.y = other.y; + + return this; + + }, + + setFromVector3: function( vec3 ) { + + this.radius = Math.sqrt( vec3.x * vec3.x + vec3.z * vec3.z ); + this.theta = Math.atan2( vec3.x, vec3.z ); + this.y = vec3.y; + + return this; + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function MorphBlendMesh( geometry, material ) { + + Mesh.call( this, geometry, material ); + + this.animationsMap = {}; + this.animationsList = []; + + // prepare default animation + // (all frames played together in 1 second) + + var numFrames = this.geometry.morphTargets.length; + + var name = "__default"; + + var startFrame = 0; + var endFrame = numFrames - 1; + + var fps = numFrames / 1; + + this.createAnimation( name, startFrame, endFrame, fps ); + this.setAnimationWeight( name, 1 ); + + } + + MorphBlendMesh.prototype = Object.create( Mesh.prototype ); + MorphBlendMesh.prototype.constructor = MorphBlendMesh; + + MorphBlendMesh.prototype.createAnimation = function ( name, start, end, fps ) { + + var animation = { + + start: start, + end: end, + + length: end - start + 1, + + fps: fps, + duration: ( end - start ) / fps, + + lastFrame: 0, + currentFrame: 0, + + active: false, + + time: 0, + direction: 1, + weight: 1, + + directionBackwards: false, + mirroredLoop: false + + }; + + this.animationsMap[ name ] = animation; + this.animationsList.push( animation ); + + }; + + MorphBlendMesh.prototype.autoCreateAnimations = function ( fps ) { + + var pattern = /([a-z]+)_?(\d+)/i; + + var firstAnimation, frameRanges = {}; + + var geometry = this.geometry; + + for ( var i = 0, il = geometry.morphTargets.length; i < il; i ++ ) { + + var morph = geometry.morphTargets[ i ]; + var chunks = morph.name.match( pattern ); + + if ( chunks && chunks.length > 1 ) { + + var name = chunks[ 1 ]; + + if ( ! frameRanges[ name ] ) frameRanges[ name ] = { start: Infinity, end: - Infinity }; + + var range = frameRanges[ name ]; + + if ( i < range.start ) range.start = i; + if ( i > range.end ) range.end = i; + + if ( ! firstAnimation ) firstAnimation = name; + + } + + } + + for ( var name in frameRanges ) { + + var range = frameRanges[ name ]; + this.createAnimation( name, range.start, range.end, fps ); + + } + + this.firstAnimation = firstAnimation; + + }; + + MorphBlendMesh.prototype.setAnimationDirectionForward = function ( name ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.direction = 1; + animation.directionBackwards = false; + + } + + }; + + MorphBlendMesh.prototype.setAnimationDirectionBackward = function ( name ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.direction = - 1; + animation.directionBackwards = true; + + } + + }; + + MorphBlendMesh.prototype.setAnimationFPS = function ( name, fps ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.fps = fps; + animation.duration = ( animation.end - animation.start ) / animation.fps; + + } + + }; + + MorphBlendMesh.prototype.setAnimationDuration = function ( name, duration ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.duration = duration; + animation.fps = ( animation.end - animation.start ) / animation.duration; + + } + + }; + + MorphBlendMesh.prototype.setAnimationWeight = function ( name, weight ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.weight = weight; + + } + + }; + + MorphBlendMesh.prototype.setAnimationTime = function ( name, time ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.time = time; + + } + + }; + + MorphBlendMesh.prototype.getAnimationTime = function ( name ) { + + var time = 0; + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + time = animation.time; + + } + + return time; + + }; + + MorphBlendMesh.prototype.getAnimationDuration = function ( name ) { + + var duration = - 1; + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + duration = animation.duration; + + } + + return duration; + + }; + + MorphBlendMesh.prototype.playAnimation = function ( name ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.time = 0; + animation.active = true; + + } else { + + console.warn( "THREE.MorphBlendMesh: animation[" + name + "] undefined in .playAnimation()" ); + + } + + }; + + MorphBlendMesh.prototype.stopAnimation = function ( name ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.active = false; + + } + + }; + + MorphBlendMesh.prototype.update = function ( delta ) { + + for ( var i = 0, il = this.animationsList.length; i < il; i ++ ) { + + var animation = this.animationsList[ i ]; + + if ( ! animation.active ) continue; + + var frameTime = animation.duration / animation.length; + + animation.time += animation.direction * delta; + + if ( animation.mirroredLoop ) { + + if ( animation.time > animation.duration || animation.time < 0 ) { + + animation.direction *= - 1; + + if ( animation.time > animation.duration ) { + + animation.time = animation.duration; + animation.directionBackwards = true; + + } + + if ( animation.time < 0 ) { + + animation.time = 0; + animation.directionBackwards = false; + + } + + } + + } else { + + animation.time = animation.time % animation.duration; + + if ( animation.time < 0 ) animation.time += animation.duration; + + } + + var keyframe = animation.start + _Math.clamp( Math.floor( animation.time / frameTime ), 0, animation.length - 1 ); + var weight = animation.weight; + + if ( keyframe !== animation.currentFrame ) { + + this.morphTargetInfluences[ animation.lastFrame ] = 0; + this.morphTargetInfluences[ animation.currentFrame ] = 1 * weight; + + this.morphTargetInfluences[ keyframe ] = 0; + + animation.lastFrame = animation.currentFrame; + animation.currentFrame = keyframe; + + } + + var mix = ( animation.time % frameTime ) / frameTime; + + if ( animation.directionBackwards ) mix = 1 - mix; + + if ( animation.currentFrame !== animation.lastFrame ) { + + this.morphTargetInfluences[ animation.currentFrame ] = mix * weight; + this.morphTargetInfluences[ animation.lastFrame ] = ( 1 - mix ) * weight; + + } else { + + this.morphTargetInfluences[ animation.currentFrame ] = weight; + + } + + } + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function ImmediateRenderObject( material ) { + + Object3D.call( this ); + + this.material = material; + this.render = function ( renderCallback ) {}; + + } + + ImmediateRenderObject.prototype = Object.create( Object3D.prototype ); + ImmediateRenderObject.prototype.constructor = ImmediateRenderObject; + + ImmediateRenderObject.prototype.isImmediateRenderObject = true; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function VertexNormalsHelper( object, size, hex, linewidth ) { + + this.object = object; + + this.size = ( size !== undefined ) ? size : 1; + + var color = ( hex !== undefined ) ? hex : 0xff0000; + + var width = ( linewidth !== undefined ) ? linewidth : 1; + + // + + var nNormals = 0; + + var objGeometry = this.object.geometry; + + if ( objGeometry && objGeometry.isGeometry ) { + + nNormals = objGeometry.faces.length * 3; + + } else if ( objGeometry && objGeometry.isBufferGeometry ) { + + nNormals = objGeometry.attributes.normal.count; + + } + + // + + var geometry = new BufferGeometry(); + + var positions = new Float32BufferAttribute( nNormals * 2 * 3, 3 ); + + geometry.addAttribute( 'position', positions ); + + LineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) ); + + // + + this.matrixAutoUpdate = false; + + this.update(); + + } + + VertexNormalsHelper.prototype = Object.create( LineSegments.prototype ); + VertexNormalsHelper.prototype.constructor = VertexNormalsHelper; + + VertexNormalsHelper.prototype.update = ( function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + var normalMatrix = new Matrix3(); + + return function update() { + + var keys = [ 'a', 'b', 'c' ]; + + this.object.updateMatrixWorld( true ); + + normalMatrix.getNormalMatrix( this.object.matrixWorld ); + + var matrixWorld = this.object.matrixWorld; + + var position = this.geometry.attributes.position; + + // + + var objGeometry = this.object.geometry; + + if ( objGeometry && objGeometry.isGeometry ) { + + var vertices = objGeometry.vertices; + + var faces = objGeometry.faces; + + var idx = 0; + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + for ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) { + + var vertex = vertices[ face[ keys[ j ] ] ]; + + var normal = face.vertexNormals[ j ]; + + v1.copy( vertex ).applyMatrix4( matrixWorld ); + + v2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 ); + + position.setXYZ( idx, v1.x, v1.y, v1.z ); + + idx = idx + 1; + + position.setXYZ( idx, v2.x, v2.y, v2.z ); + + idx = idx + 1; + + } + + } + + } else if ( objGeometry && objGeometry.isBufferGeometry ) { + + var objPos = objGeometry.attributes.position; + + var objNorm = objGeometry.attributes.normal; + + var idx = 0; + + // for simplicity, ignore index and drawcalls, and render every normal + + for ( var j = 0, jl = objPos.count; j < jl; j ++ ) { + + v1.set( objPos.getX( j ), objPos.getY( j ), objPos.getZ( j ) ).applyMatrix4( matrixWorld ); + + v2.set( objNorm.getX( j ), objNorm.getY( j ), objNorm.getZ( j ) ); + + v2.applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 ); + + position.setXYZ( idx, v1.x, v1.y, v1.z ); + + idx = idx + 1; + + position.setXYZ( idx, v2.x, v2.y, v2.z ); + + idx = idx + 1; + + } + + } + + position.needsUpdate = true; + + }; + + }() ); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function SpotLightHelper( light ) { + + Object3D.call( this ); + + this.light = light; + this.light.updateMatrixWorld(); + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + var geometry = new BufferGeometry(); + + var positions = [ + 0, 0, 0, 0, 0, 1, + 0, 0, 0, 1, 0, 1, + 0, 0, 0, - 1, 0, 1, + 0, 0, 0, 0, 1, 1, + 0, 0, 0, 0, - 1, 1 + ]; + + for ( var i = 0, j = 1, l = 32; i < l; i ++, j ++ ) { + + var p1 = ( i / l ) * Math.PI * 2; + var p2 = ( j / l ) * Math.PI * 2; + + positions.push( + Math.cos( p1 ), Math.sin( p1 ), 1, + Math.cos( p2 ), Math.sin( p2 ), 1 + ); + + } + + geometry.addAttribute( 'position', new Float32BufferAttribute( positions, 3 ) ); + + var material = new LineBasicMaterial( { fog: false } ); + + this.cone = new LineSegments( geometry, material ); + this.add( this.cone ); + + this.update(); + + } + + SpotLightHelper.prototype = Object.create( Object3D.prototype ); + SpotLightHelper.prototype.constructor = SpotLightHelper; + + SpotLightHelper.prototype.dispose = function () { + + this.cone.geometry.dispose(); + this.cone.material.dispose(); + + }; + + SpotLightHelper.prototype.update = function () { + + var vector = new Vector3(); + var vector2 = new Vector3(); + + return function update() { + + var coneLength = this.light.distance ? this.light.distance : 1000; + var coneWidth = coneLength * Math.tan( this.light.angle ); + + this.cone.scale.set( coneWidth, coneWidth, coneLength ); + + vector.setFromMatrixPosition( this.light.matrixWorld ); + vector2.setFromMatrixPosition( this.light.target.matrixWorld ); + + this.cone.lookAt( vector2.sub( vector ) ); + + this.cone.material.color.copy( this.light.color ); + + }; + + }(); + + /** + * @author Sean Griffin / http://twitter.com/sgrif + * @author Michael Guerrero / http://realitymeltdown.com + * @author mrdoob / http://mrdoob.com/ + * @author ikerr / http://verold.com + * @author Mugen87 / https://github.com/Mugen87 + */ + + function SkeletonHelper( object ) { + + this.bones = this.getBoneList( object ); + + var geometry = new BufferGeometry(); + + var vertices = []; + var colors = []; + + var color1 = new Color( 0, 0, 1 ); + var color2 = new Color( 0, 1, 0 ); + + for ( var i = 0; i < this.bones.length; i ++ ) { + + var bone = this.bones[ i ]; + + if ( bone.parent && bone.parent.isBone ) { + + vertices.push( 0, 0, 0 ); + vertices.push( 0, 0, 0 ); + colors.push( color1.r, color1.g, color1.b ); + colors.push( color2.r, color2.g, color2.b ); + + } + + } + + geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + var material = new LineBasicMaterial( { vertexColors: VertexColors, depthTest: false, depthWrite: false, transparent: true } ); + + LineSegments.call( this, geometry, material ); + + this.root = object; + + this.matrix = object.matrixWorld; + this.matrixAutoUpdate = false; + + this.update(); + + } + + + SkeletonHelper.prototype = Object.create( LineSegments.prototype ); + SkeletonHelper.prototype.constructor = SkeletonHelper; + + SkeletonHelper.prototype.getBoneList = function( object ) { + + var boneList = []; + + if ( object && object.isBone ) { + + boneList.push( object ); + + } + + for ( var i = 0; i < object.children.length; i ++ ) { + + boneList.push.apply( boneList, this.getBoneList( object.children[ i ] ) ); + + } + + return boneList; + + }; + + SkeletonHelper.prototype.update = function () { + + var vector = new Vector3(); + + var boneMatrix = new Matrix4(); + var matrixWorldInv = new Matrix4(); + + return function update() { + + var geometry = this.geometry; + var position = geometry.getAttribute( 'position' ); + + matrixWorldInv.getInverse( this.root.matrixWorld ); + + for ( var i = 0, j = 0; i < this.bones.length; i ++ ) { + + var bone = this.bones[ i ]; + + if ( bone.parent && bone.parent.isBone ) { + + boneMatrix.multiplyMatrices( matrixWorldInv, bone.matrixWorld ); + vector.setFromMatrixPosition( boneMatrix ); + position.setXYZ( j, vector.x, vector.y, vector.z ); + + boneMatrix.multiplyMatrices( matrixWorldInv, bone.parent.matrixWorld ); + vector.setFromMatrixPosition( boneMatrix ); + position.setXYZ( j + 1, vector.x, vector.y, vector.z ); + + j += 2; + + } + + } + + geometry.getAttribute( 'position' ).needsUpdate = true; + + }; + + }(); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + function PointLightHelper( light, sphereSize ) { + + this.light = light; + this.light.updateMatrixWorld(); + + var geometry = new SphereBufferGeometry( sphereSize, 4, 2 ); + var material = new MeshBasicMaterial( { wireframe: true, fog: false } ); + material.color.copy( this.light.color ); + + Mesh.call( this, geometry, material ); + + this.matrix = this.light.matrixWorld; + this.matrixAutoUpdate = false; + + /* + var distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 ); + var distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } ); + + this.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial ); + this.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial ); + + var d = light.distance; + + if ( d === 0.0 ) { + + this.lightDistance.visible = false; + + } else { + + this.lightDistance.scale.set( d, d, d ); + + } + + this.add( this.lightDistance ); + */ + + } + + PointLightHelper.prototype = Object.create( Mesh.prototype ); + PointLightHelper.prototype.constructor = PointLightHelper; + + PointLightHelper.prototype.dispose = function () { + + this.geometry.dispose(); + this.material.dispose(); + + }; + + PointLightHelper.prototype.update = function () { + + this.material.color.copy( this.light.color ); + + /* + var d = this.light.distance; + + if ( d === 0.0 ) { + + this.lightDistance.visible = false; + + } else { + + this.lightDistance.visible = true; + this.lightDistance.scale.set( d, d, d ); + + } + */ + + }; + + /** + * @author abelnation / http://github.com/abelnation + * @author Mugen87 / http://github.com/Mugen87 + * @author WestLangley / http://github.com/WestLangley + */ + + function RectAreaLightHelper( light ) { + + Object3D.call( this ); + + this.light = light; + this.light.updateMatrixWorld(); + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + var material = new LineBasicMaterial( { color: light.color } ); + + var geometry = new BufferGeometry(); + + geometry.addAttribute( 'position', new BufferAttribute( new Float32Array( 5 * 3 ), 3 ) ); + + this.add( new Line( geometry, material ) ); + + this.update(); + + } + + RectAreaLightHelper.prototype = Object.create( Object3D.prototype ); + RectAreaLightHelper.prototype.constructor = RectAreaLightHelper; + + RectAreaLightHelper.prototype.dispose = function () { + + this.children[ 0 ].geometry.dispose(); + this.children[ 0 ].material.dispose(); + + }; + + RectAreaLightHelper.prototype.update = function () { + + var line = this.children[ 0 ]; + + // update material + + line.material.color.copy( this.light.color ); + + // calculate new dimensions of the helper + + var hx = this.light.width * 0.5; + var hy = this.light.height * 0.5; + + var position = line.geometry.attributes.position; + var array = position.array; + + // update vertices + + array[ 0 ] = hx; array[ 1 ] = - hy; array[ 2 ] = 0; + array[ 3 ] = hx; array[ 4 ] = hy; array[ 5 ] = 0; + array[ 6 ] = - hx; array[ 7 ] = hy; array[ 8 ] = 0; + array[ 9 ] = - hx; array[ 10 ] = - hy; array[ 11 ] = 0; + array[ 12 ] = hx; array[ 13 ] = - hy; array[ 14 ] = 0; + + position.needsUpdate = true; + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + + function HemisphereLightHelper( light, size ) { + + Object3D.call( this ); + + this.light = light; + this.light.updateMatrixWorld(); + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + var geometry = new OctahedronBufferGeometry( size ); + geometry.rotateY( Math.PI * 0.5 ); + + var material = new MeshBasicMaterial( { vertexColors: VertexColors, wireframe: true } ); + + var position = geometry.getAttribute( 'position' ); + var colors = new Float32Array( position.count * 3 ); + + geometry.addAttribute( 'color', new BufferAttribute( colors, 3 ) ); + + this.add( new Mesh( geometry, material ) ); + + this.update(); + + } + + HemisphereLightHelper.prototype = Object.create( Object3D.prototype ); + HemisphereLightHelper.prototype.constructor = HemisphereLightHelper; + + HemisphereLightHelper.prototype.dispose = function () { + + this.children[ 0 ].geometry.dispose(); + this.children[ 0 ].material.dispose(); + + }; + + HemisphereLightHelper.prototype.update = function () { + + var vector = new Vector3(); + + var color1 = new Color(); + var color2 = new Color(); + + return function update() { + + var mesh = this.children[ 0 ]; + + var colors = mesh.geometry.getAttribute( 'color' ); + + color1.copy( this.light.color ); + color2.copy( this.light.groundColor ); + + for ( var i = 0, l = colors.count; i < l; i ++ ) { + + var color = ( i < ( l / 2 ) ) ? color1 : color2; + + colors.setXYZ( i, color.r, color.g, color.b ); + + } + + mesh.lookAt( vector.setFromMatrixPosition( this.light.matrixWorld ).negate() ); + + colors.needsUpdate = true; + + }; + + }(); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function GridHelper( size, divisions, color1, color2 ) { + + size = size || 10; + divisions = divisions || 10; + color1 = new Color( color1 !== undefined ? color1 : 0x444444 ); + color2 = new Color( color2 !== undefined ? color2 : 0x888888 ); + + var center = divisions / 2; + var step = size / divisions; + var halfSize = size / 2; + + var vertices = [], colors = []; + + for ( var i = 0, j = 0, k = - halfSize; i <= divisions; i ++, k += step ) { + + vertices.push( - halfSize, 0, k, halfSize, 0, k ); + vertices.push( k, 0, - halfSize, k, 0, halfSize ); + + var color = i === center ? color1 : color2; + + color.toArray( colors, j ); j += 3; + color.toArray( colors, j ); j += 3; + color.toArray( colors, j ); j += 3; + color.toArray( colors, j ); j += 3; + + } + + var geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + var material = new LineBasicMaterial( { vertexColors: VertexColors } ); + + LineSegments.call( this, geometry, material ); + + } + + GridHelper.prototype = Object.create( LineSegments.prototype ); + GridHelper.prototype.constructor = GridHelper; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / http://github.com/Mugen87 + * @author Hectate / http://www.github.com/Hectate + */ + + function PolarGridHelper( radius, radials, circles, divisions, color1, color2 ) { + + radius = radius || 10; + radials = radials || 16; + circles = circles || 8; + divisions = divisions || 64; + color1 = new Color( color1 !== undefined ? color1 : 0x444444 ); + color2 = new Color( color2 !== undefined ? color2 : 0x888888 ); + + var vertices = []; + var colors = []; + + var x, z; + var v, i, j, r, color; + + // create the radials + + for ( i = 0; i <= radials; i ++ ) { + + v = ( i / radials ) * ( Math.PI * 2 ); + + x = Math.sin( v ) * radius; + z = Math.cos( v ) * radius; + + vertices.push( 0, 0, 0 ); + vertices.push( x, 0, z ); + + color = ( i & 1 ) ? color1 : color2; + + colors.push( color.r, color.g, color.b ); + colors.push( color.r, color.g, color.b ); + + } + + // create the circles + + for ( i = 0; i <= circles; i ++ ) { + + color = ( i & 1 ) ? color1 : color2; + + r = radius - ( radius / circles * i ); + + for ( j = 0; j < divisions; j ++ ) { + + // first vertex + + v = ( j / divisions ) * ( Math.PI * 2 ); + + x = Math.sin( v ) * r; + z = Math.cos( v ) * r; + + vertices.push( x, 0, z ); + colors.push( color.r, color.g, color.b ); + + // second vertex + + v = ( ( j + 1 ) / divisions ) * ( Math.PI * 2 ); + + x = Math.sin( v ) * r; + z = Math.cos( v ) * r; + + vertices.push( x, 0, z ); + colors.push( color.r, color.g, color.b ); + + } + + } + + var geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + var material = new LineBasicMaterial( { vertexColors: VertexColors } ); + + LineSegments.call( this, geometry, material ); + + } + + PolarGridHelper.prototype = Object.create( LineSegments.prototype ); + PolarGridHelper.prototype.constructor = PolarGridHelper; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function FaceNormalsHelper( object, size, hex, linewidth ) { + + // FaceNormalsHelper only supports THREE.Geometry + + this.object = object; + + this.size = ( size !== undefined ) ? size : 1; + + var color = ( hex !== undefined ) ? hex : 0xffff00; + + var width = ( linewidth !== undefined ) ? linewidth : 1; + + // + + var nNormals = 0; + + var objGeometry = this.object.geometry; + + if ( objGeometry && objGeometry.isGeometry ) { + + nNormals = objGeometry.faces.length; + + } else { + + console.warn( 'THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead.' ); + + } + + // + + var geometry = new BufferGeometry(); + + var positions = new Float32BufferAttribute( nNormals * 2 * 3, 3 ); + + geometry.addAttribute( 'position', positions ); + + LineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) ); + + // + + this.matrixAutoUpdate = false; + this.update(); + + } + + FaceNormalsHelper.prototype = Object.create( LineSegments.prototype ); + FaceNormalsHelper.prototype.constructor = FaceNormalsHelper; + + FaceNormalsHelper.prototype.update = ( function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + var normalMatrix = new Matrix3(); + + return function update() { + + this.object.updateMatrixWorld( true ); + + normalMatrix.getNormalMatrix( this.object.matrixWorld ); + + var matrixWorld = this.object.matrixWorld; + + var position = this.geometry.attributes.position; + + // + + var objGeometry = this.object.geometry; + + var vertices = objGeometry.vertices; + + var faces = objGeometry.faces; + + var idx = 0; + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + var normal = face.normal; + + v1.copy( vertices[ face.a ] ) + .add( vertices[ face.b ] ) + .add( vertices[ face.c ] ) + .divideScalar( 3 ) + .applyMatrix4( matrixWorld ); + + v2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 ); + + position.setXYZ( idx, v1.x, v1.y, v1.z ); + + idx = idx + 1; + + position.setXYZ( idx, v2.x, v2.y, v2.z ); + + idx = idx + 1; + + } + + position.needsUpdate = true; + + }; + + }() ); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function DirectionalLightHelper( light, size ) { + + Object3D.call( this ); + + this.light = light; + this.light.updateMatrixWorld(); + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + if ( size === undefined ) size = 1; + + var geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32BufferAttribute( [ + - size, size, 0, + size, size, 0, + size, - size, 0, + - size, - size, 0, + - size, size, 0 + ], 3 ) ); + + var material = new LineBasicMaterial( { fog: false } ); + + this.add( new Line( geometry, material ) ); + + geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) ); + + this.add( new Line( geometry, material )); + + this.update(); + + } + + DirectionalLightHelper.prototype = Object.create( Object3D.prototype ); + DirectionalLightHelper.prototype.constructor = DirectionalLightHelper; + + DirectionalLightHelper.prototype.dispose = function () { + + var lightPlane = this.children[ 0 ]; + var targetLine = this.children[ 1 ]; + + lightPlane.geometry.dispose(); + lightPlane.material.dispose(); + targetLine.geometry.dispose(); + targetLine.material.dispose(); + + }; + + DirectionalLightHelper.prototype.update = function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + var v3 = new Vector3(); + + return function update() { + + v1.setFromMatrixPosition( this.light.matrixWorld ); + v2.setFromMatrixPosition( this.light.target.matrixWorld ); + v3.subVectors( v2, v1 ); + + var lightPlane = this.children[ 0 ]; + var targetLine = this.children[ 1 ]; + + lightPlane.lookAt( v3 ); + lightPlane.material.color.copy( this.light.color ); + + targetLine.lookAt( v3 ); + targetLine.scale.z = v3.length(); + + }; + + }(); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author Mugen87 / https://github.com/Mugen87 + * + * - shows frustum, line of sight and up of the camera + * - suitable for fast updates + * - based on frustum visualization in lightgl.js shadowmap example + * http://evanw.github.com/lightgl.js/tests/shadowmap.html + */ + + function CameraHelper( camera ) { + + var geometry = new BufferGeometry(); + var material = new LineBasicMaterial( { color: 0xffffff, vertexColors: FaceColors } ); + + var vertices = []; + var colors = []; + + var pointMap = {}; + + // colors + + var colorFrustum = new Color( 0xffaa00 ); + var colorCone = new Color( 0xff0000 ); + var colorUp = new Color( 0x00aaff ); + var colorTarget = new Color( 0xffffff ); + var colorCross = new Color( 0x333333 ); + + // near + + addLine( "n1", "n2", colorFrustum ); + addLine( "n2", "n4", colorFrustum ); + addLine( "n4", "n3", colorFrustum ); + addLine( "n3", "n1", colorFrustum ); + + // far + + addLine( "f1", "f2", colorFrustum ); + addLine( "f2", "f4", colorFrustum ); + addLine( "f4", "f3", colorFrustum ); + addLine( "f3", "f1", colorFrustum ); + + // sides + + addLine( "n1", "f1", colorFrustum ); + addLine( "n2", "f2", colorFrustum ); + addLine( "n3", "f3", colorFrustum ); + addLine( "n4", "f4", colorFrustum ); + + // cone + + addLine( "p", "n1", colorCone ); + addLine( "p", "n2", colorCone ); + addLine( "p", "n3", colorCone ); + addLine( "p", "n4", colorCone ); + + // up + + addLine( "u1", "u2", colorUp ); + addLine( "u2", "u3", colorUp ); + addLine( "u3", "u1", colorUp ); + + // target + + addLine( "c", "t", colorTarget ); + addLine( "p", "c", colorCross ); + + // cross + + addLine( "cn1", "cn2", colorCross ); + addLine( "cn3", "cn4", colorCross ); + + addLine( "cf1", "cf2", colorCross ); + addLine( "cf3", "cf4", colorCross ); + + function addLine( a, b, color ) { + + addPoint( a, color ); + addPoint( b, color ); + + } + + function addPoint( id, color ) { + + vertices.push( 0, 0, 0 ); + colors.push( color.r, color.g, color.b ); + + if ( pointMap[ id ] === undefined ) { + + pointMap[ id ] = []; + + } + + pointMap[ id ].push( ( vertices.length / 3 ) - 1 ); + + } + + geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + LineSegments.call( this, geometry, material ); + + this.camera = camera; + if ( this.camera.updateProjectionMatrix ) this.camera.updateProjectionMatrix(); + + this.matrix = camera.matrixWorld; + this.matrixAutoUpdate = false; + + this.pointMap = pointMap; + + this.update(); + + } + + CameraHelper.prototype = Object.create( LineSegments.prototype ); + CameraHelper.prototype.constructor = CameraHelper; + + CameraHelper.prototype.update = function () { + + var geometry, pointMap; + + var vector = new Vector3(); + var camera = new Camera(); + + function setPoint( point, x, y, z ) { + + vector.set( x, y, z ).unproject( camera ); + + var points = pointMap[ point ]; + + if ( points !== undefined ) { + + var position = geometry.getAttribute( 'position' ); + + for ( var i = 0, l = points.length; i < l; i ++ ) { + + position.setXYZ( points[ i ], vector.x, vector.y, vector.z ); + + } + + } + + } + + return function update() { + + geometry = this.geometry; + pointMap = this.pointMap; + + var w = 1, h = 1; + + // we need just camera projection matrix + // world matrix must be identity + + camera.projectionMatrix.copy( this.camera.projectionMatrix ); + + // center / target + + setPoint( "c", 0, 0, - 1 ); + setPoint( "t", 0, 0, 1 ); + + // near + + setPoint( "n1", - w, - h, - 1 ); + setPoint( "n2", w, - h, - 1 ); + setPoint( "n3", - w, h, - 1 ); + setPoint( "n4", w, h, - 1 ); + + // far + + setPoint( "f1", - w, - h, 1 ); + setPoint( "f2", w, - h, 1 ); + setPoint( "f3", - w, h, 1 ); + setPoint( "f4", w, h, 1 ); + + // up + + setPoint( "u1", w * 0.7, h * 1.1, - 1 ); + setPoint( "u2", - w * 0.7, h * 1.1, - 1 ); + setPoint( "u3", 0, h * 2, - 1 ); + + // cross + + setPoint( "cf1", - w, 0, 1 ); + setPoint( "cf2", w, 0, 1 ); + setPoint( "cf3", 0, - h, 1 ); + setPoint( "cf4", 0, h, 1 ); + + setPoint( "cn1", - w, 0, - 1 ); + setPoint( "cn2", w, 0, - 1 ); + setPoint( "cn3", 0, - h, - 1 ); + setPoint( "cn4", 0, h, - 1 ); + + geometry.getAttribute( 'position' ).needsUpdate = true; + + }; + + }(); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / http://github.com/Mugen87 + */ + + function BoxHelper( object, color ) { + + this.object = object; + + if ( color === undefined ) color = 0xffff00; + + var indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] ); + var positions = new Float32Array( 8 * 3 ); + + var geometry = new BufferGeometry(); + geometry.setIndex( new BufferAttribute( indices, 1 ) ); + geometry.addAttribute( 'position', new BufferAttribute( positions, 3 ) ); + + LineSegments.call( this, geometry, new LineBasicMaterial( { color: color } ) ); + + this.matrixAutoUpdate = false; + + this.update(); + + } + + BoxHelper.prototype = Object.create( LineSegments.prototype ); + BoxHelper.prototype.constructor = BoxHelper; + + BoxHelper.prototype.update = ( function () { + + var box = new Box3(); + + return function update( object ) { + + if ( object !== undefined ) { + + console.warn( 'THREE.BoxHelper: .update() has no longer arguments.' ); + + } + + if ( this.object !== undefined ) { + + box.setFromObject( this.object ); + + } + + if ( box.isEmpty() ) return; + + var min = box.min; + var max = box.max; + + /* + 5____4 + 1/___0/| + | 6__|_7 + 2/___3/ + + 0: max.x, max.y, max.z + 1: min.x, max.y, max.z + 2: min.x, min.y, max.z + 3: max.x, min.y, max.z + 4: max.x, max.y, min.z + 5: min.x, max.y, min.z + 6: min.x, min.y, min.z + 7: max.x, min.y, min.z + */ + + var position = this.geometry.attributes.position; + var array = position.array; + + array[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z; + array[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z; + array[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z; + array[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z; + array[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z; + array[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z; + array[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z; + array[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z; + + position.needsUpdate = true; + + this.geometry.computeBoundingSphere(); + + }; + + } )(); + + BoxHelper.prototype.setFromObject = function ( object ) { + + this.object = object; + this.update(); + + return this; + + }; + + /** + * @author WestLangley / http://github.com/WestLangley + * @author zz85 / http://github.com/zz85 + * @author bhouston / http://clara.io + * + * Creates an arrow for visualizing directions + * + * Parameters: + * dir - Vector3 + * origin - Vector3 + * length - Number + * color - color in hex value + * headLength - Number + * headWidth - Number + */ + + var lineGeometry; + var coneGeometry; + + function ArrowHelper( dir, origin, length, color, headLength, headWidth ) { + + // dir is assumed to be normalized + + Object3D.call( this ); + + if ( color === undefined ) color = 0xffff00; + if ( length === undefined ) length = 1; + if ( headLength === undefined ) headLength = 0.2 * length; + if ( headWidth === undefined ) headWidth = 0.2 * headLength; + + if ( lineGeometry === undefined ) { + + lineGeometry = new BufferGeometry(); + lineGeometry.addAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) ); + + coneGeometry = new CylinderBufferGeometry( 0, 0.5, 1, 5, 1 ); + coneGeometry.translate( 0, - 0.5, 0 ); + + } + + this.position.copy( origin ); + + this.line = new Line( lineGeometry, new LineBasicMaterial( { color: color } ) ); + this.line.matrixAutoUpdate = false; + this.add( this.line ); + + this.cone = new Mesh( coneGeometry, new MeshBasicMaterial( { color: color } ) ); + this.cone.matrixAutoUpdate = false; + this.add( this.cone ); + + this.setDirection( dir ); + this.setLength( length, headLength, headWidth ); + + } + + ArrowHelper.prototype = Object.create( Object3D.prototype ); + ArrowHelper.prototype.constructor = ArrowHelper; + + ArrowHelper.prototype.setDirection = ( function () { + + var axis = new Vector3(); + var radians; + + return function setDirection( dir ) { + + // dir is assumed to be normalized + + if ( dir.y > 0.99999 ) { + + this.quaternion.set( 0, 0, 0, 1 ); + + } else if ( dir.y < - 0.99999 ) { + + this.quaternion.set( 1, 0, 0, 0 ); + + } else { + + axis.set( dir.z, 0, - dir.x ).normalize(); + + radians = Math.acos( dir.y ); + + this.quaternion.setFromAxisAngle( axis, radians ); + + } + + }; + + }() ); + + ArrowHelper.prototype.setLength = function ( length, headLength, headWidth ) { + + if ( headLength === undefined ) headLength = 0.2 * length; + if ( headWidth === undefined ) headWidth = 0.2 * headLength; + + this.line.scale.set( 1, Math.max( 0, length - headLength ), 1 ); + this.line.updateMatrix(); + + this.cone.scale.set( headWidth, headLength, headWidth ); + this.cone.position.y = length; + this.cone.updateMatrix(); + + }; + + ArrowHelper.prototype.setColor = function ( color ) { + + this.line.material.color.copy( color ); + this.cone.material.color.copy( color ); + + }; + + /** + * @author sroucheray / http://sroucheray.org/ + * @author mrdoob / http://mrdoob.com/ + */ + + function AxisHelper( size ) { + + size = size || 1; + + var vertices = [ + 0, 0, 0, size, 0, 0, + 0, 0, 0, 0, size, 0, + 0, 0, 0, 0, 0, size + ]; + + var colors = [ + 1, 0, 0, 1, 0.6, 0, + 0, 1, 0, 0.6, 1, 0, + 0, 0, 1, 0, 0.6, 1 + ]; + + var geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + var material = new LineBasicMaterial( { vertexColors: VertexColors } ); + + LineSegments.call( this, geometry, material ); + + } + + AxisHelper.prototype = Object.create( LineSegments.prototype ); + AxisHelper.prototype.constructor = AxisHelper; + + /** + * @author zz85 https://github.com/zz85 + * + * Centripetal CatmullRom Curve - which is useful for avoiding + * cusps and self-intersections in non-uniform catmull rom curves. + * http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf + * + * curve.type accepts centripetal(default), chordal and catmullrom + * curve.tension is used for catmullrom which defaults to 0.5 + */ + + + /* + Based on an optimized c++ solution in + - http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/ + - http://ideone.com/NoEbVM + + This CubicPoly class could be used for reusing some variables and calculations, + but for three.js curve use, it could be possible inlined and flatten into a single function call + which can be placed in CurveUtils. + */ + + function CubicPoly() { + + var c0 = 0, c1 = 0, c2 = 0, c3 = 0; + + /* + * Compute coefficients for a cubic polynomial + * p(s) = c0 + c1*s + c2*s^2 + c3*s^3 + * such that + * p(0) = x0, p(1) = x1 + * and + * p'(0) = t0, p'(1) = t1. + */ + function init( x0, x1, t0, t1 ) { + + c0 = x0; + c1 = t0; + c2 = - 3 * x0 + 3 * x1 - 2 * t0 - t1; + c3 = 2 * x0 - 2 * x1 + t0 + t1; + + } + + return { + + initCatmullRom: function ( x0, x1, x2, x3, tension ) { + + init( x1, x2, tension * ( x2 - x0 ), tension * ( x3 - x1 ) ); + + }, + + initNonuniformCatmullRom: function ( x0, x1, x2, x3, dt0, dt1, dt2 ) { + + // compute tangents when parameterized in [t1,t2] + var t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1; + var t2 = ( x2 - x1 ) / dt1 - ( x3 - x1 ) / ( dt1 + dt2 ) + ( x3 - x2 ) / dt2; + + // rescale tangents for parametrization in [0,1] + t1 *= dt1; + t2 *= dt1; + + init( x1, x2, t1, t2 ); + + }, + + calc: function ( t ) { + + var t2 = t * t; + var t3 = t2 * t; + return c0 + c1 * t + c2 * t2 + c3 * t3; + + } + + }; + + } + + // + + var tmp = new Vector3(); + var px = new CubicPoly(); + var py = new CubicPoly(); + var pz = new CubicPoly(); + + function CatmullRomCurve3( p /* array of Vector3 */ ) { + + Curve.call( this ); + + this.points = p || []; + this.closed = false; + + } + + CatmullRomCurve3.prototype = Object.create( Curve.prototype ); + CatmullRomCurve3.prototype.constructor = CatmullRomCurve3; + + CatmullRomCurve3.prototype.getPoint = function ( t ) { + + var points = this.points; + var l = points.length; + + if ( l < 2 ) console.log( 'duh, you need at least 2 points' ); + + var point = ( l - ( this.closed ? 0 : 1 ) ) * t; + var intPoint = Math.floor( point ); + var weight = point - intPoint; + + if ( this.closed ) { + + intPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / points.length ) + 1 ) * points.length; + + } else if ( weight === 0 && intPoint === l - 1 ) { + + intPoint = l - 2; + weight = 1; + + } + + var p0, p1, p2, p3; // 4 points + + if ( this.closed || intPoint > 0 ) { + + p0 = points[ ( intPoint - 1 ) % l ]; + + } else { + + // extrapolate first point + tmp.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] ); + p0 = tmp; + + } + + p1 = points[ intPoint % l ]; + p2 = points[ ( intPoint + 1 ) % l ]; + + if ( this.closed || intPoint + 2 < l ) { + + p3 = points[ ( intPoint + 2 ) % l ]; + + } else { + + // extrapolate last point + tmp.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 1 ] ); + p3 = tmp; + + } + + if ( this.type === undefined || this.type === 'centripetal' || this.type === 'chordal' ) { + + // init Centripetal / Chordal Catmull-Rom + var pow = this.type === 'chordal' ? 0.5 : 0.25; + var dt0 = Math.pow( p0.distanceToSquared( p1 ), pow ); + var dt1 = Math.pow( p1.distanceToSquared( p2 ), pow ); + var dt2 = Math.pow( p2.distanceToSquared( p3 ), pow ); + + // safety check for repeated points + if ( dt1 < 1e-4 ) dt1 = 1.0; + if ( dt0 < 1e-4 ) dt0 = dt1; + if ( dt2 < 1e-4 ) dt2 = dt1; + + px.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 ); + py.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 ); + pz.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 ); + + } else if ( this.type === 'catmullrom' ) { + + var tension = this.tension !== undefined ? this.tension : 0.5; + px.initCatmullRom( p0.x, p1.x, p2.x, p3.x, tension ); + py.initCatmullRom( p0.y, p1.y, p2.y, p3.y, tension ); + pz.initCatmullRom( p0.z, p1.z, p2.z, p3.z, tension ); + + } + + return new Vector3( px.calc( weight ), py.calc( weight ), pz.calc( weight ) ); + + }; + + function CubicBezierCurve3( v0, v1, v2, v3 ) { + + Curve.call( this ); + + this.v0 = v0; + this.v1 = v1; + this.v2 = v2; + this.v3 = v3; + + } + + CubicBezierCurve3.prototype = Object.create( Curve.prototype ); + CubicBezierCurve3.prototype.constructor = CubicBezierCurve3; + + CubicBezierCurve3.prototype.getPoint = function ( t ) { + + var v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3; + + return new Vector3( + CubicBezier( t, v0.x, v1.x, v2.x, v3.x ), + CubicBezier( t, v0.y, v1.y, v2.y, v3.y ), + CubicBezier( t, v0.z, v1.z, v2.z, v3.z ) + ); + + }; + + function QuadraticBezierCurve3( v0, v1, v2 ) { + + Curve.call( this ); + + this.v0 = v0; + this.v1 = v1; + this.v2 = v2; + + } + + QuadraticBezierCurve3.prototype = Object.create( Curve.prototype ); + QuadraticBezierCurve3.prototype.constructor = QuadraticBezierCurve3; + + QuadraticBezierCurve3.prototype.getPoint = function ( t ) { + + var v0 = this.v0, v1 = this.v1, v2 = this.v2; + + return new Vector3( + QuadraticBezier( t, v0.x, v1.x, v2.x ), + QuadraticBezier( t, v0.y, v1.y, v2.y ), + QuadraticBezier( t, v0.z, v1.z, v2.z ) + ); + + }; + + function LineCurve3( v1, v2 ) { + + Curve.call( this ); + + this.v1 = v1; + this.v2 = v2; + + } + + LineCurve3.prototype = Object.create( Curve.prototype ); + LineCurve3.prototype.constructor = LineCurve3; + + LineCurve3.prototype.getPoint = function ( t ) { + + if ( t === 1 ) { + + return this.v2.clone(); + + } + + var vector = new Vector3(); + + vector.subVectors( this.v2, this.v1 ); // diff + vector.multiplyScalar( t ); + vector.add( this.v1 ); + + return vector; + + }; + + function ArcCurve( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) { + + EllipseCurve.call( this, aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise ); + + } + + ArcCurve.prototype = Object.create( EllipseCurve.prototype ); + ArcCurve.prototype.constructor = ArcCurve; + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + var SceneUtils = { + + createMultiMaterialObject: function ( geometry, materials ) { + + var group = new Group(); + + for ( var i = 0, l = materials.length; i < l; i ++ ) { + + group.add( new Mesh( geometry, materials[ i ] ) ); + + } + + return group; + + }, + + detach: function ( child, parent, scene ) { + + child.applyMatrix( parent.matrixWorld ); + parent.remove( child ); + scene.add( child ); + + }, + + attach: function ( child, scene, parent ) { + + var matrixWorldInverse = new Matrix4(); + matrixWorldInverse.getInverse( parent.matrixWorld ); + child.applyMatrix( matrixWorldInverse ); + + scene.remove( child ); + parent.add( child ); + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Face4( a, b, c, d, normal, color, materialIndex ) { + + console.warn( 'THREE.Face4 has been removed. A THREE.Face3 will be created instead.' ); + return new Face3( a, b, c, normal, color, materialIndex ); + + } + + var LineStrip = 0; + + var LinePieces = 1; + + function MeshFaceMaterial( materials ) { + + console.warn( 'THREE.MeshFaceMaterial has been removed. Use an Array instead.' ); + return materials; + + } + + function MultiMaterial( materials ) { + + if ( materials === undefined ) materials = []; + + console.warn( 'THREE.MultiMaterial has been removed. Use an Array instead.' ); + materials.isMultiMaterial = true; + materials.materials = materials; + materials.clone = function () { + + return materials.slice(); + + }; + return materials; + + } + + function PointCloud( geometry, material ) { + + console.warn( 'THREE.PointCloud has been renamed to THREE.Points.' ); + return new Points( geometry, material ); + + } + + function Particle( material ) { + + console.warn( 'THREE.Particle has been renamed to THREE.Sprite.' ); + return new Sprite( material ); + + } + + function ParticleSystem( geometry, material ) { + + console.warn( 'THREE.ParticleSystem has been renamed to THREE.Points.' ); + return new Points( geometry, material ); + + } + + function PointCloudMaterial( parameters ) { + + console.warn( 'THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.' ); + return new PointsMaterial( parameters ); + + } + + function ParticleBasicMaterial( parameters ) { + + console.warn( 'THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.' ); + return new PointsMaterial( parameters ); + + } + + function ParticleSystemMaterial( parameters ) { + + console.warn( 'THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.' ); + return new PointsMaterial( parameters ); + + } + + function Vertex( x, y, z ) { + + console.warn( 'THREE.Vertex has been removed. Use THREE.Vector3 instead.' ); + return new Vector3( x, y, z ); + + } + + // + + function DynamicBufferAttribute( array, itemSize ) { + + console.warn( 'THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setDynamic( true ) instead.' ); + return new BufferAttribute( array, itemSize ).setDynamic( true ); + + } + + function Int8Attribute( array, itemSize ) { + + console.warn( 'THREE.Int8Attribute has been removed. Use new THREE.Int8BufferAttribute() instead.' ); + return new Int8BufferAttribute( array, itemSize ); + + } + + function Uint8Attribute( array, itemSize ) { + + console.warn( 'THREE.Uint8Attribute has been removed. Use new THREE.Uint8BufferAttribute() instead.' ); + return new Uint8BufferAttribute( array, itemSize ); + + } + + function Uint8ClampedAttribute( array, itemSize ) { + + console.warn( 'THREE.Uint8ClampedAttribute has been removed. Use new THREE.Uint8ClampedBufferAttribute() instead.' ); + return new Uint8ClampedBufferAttribute( array, itemSize ); + + } + + function Int16Attribute( array, itemSize ) { + + console.warn( 'THREE.Int16Attribute has been removed. Use new THREE.Int16BufferAttribute() instead.' ); + return new Int16BufferAttribute( array, itemSize ); + + } + + function Uint16Attribute( array, itemSize ) { + + console.warn( 'THREE.Uint16Attribute has been removed. Use new THREE.Uint16BufferAttribute() instead.' ); + return new Uint16BufferAttribute( array, itemSize ); + + } + + function Int32Attribute( array, itemSize ) { + + console.warn( 'THREE.Int32Attribute has been removed. Use new THREE.Int32BufferAttribute() instead.' ); + return new Int32BufferAttribute( array, itemSize ); + + } + + function Uint32Attribute( array, itemSize ) { + + console.warn( 'THREE.Uint32Attribute has been removed. Use new THREE.Uint32BufferAttribute() instead.' ); + return new Uint32BufferAttribute( array, itemSize ); + + } + + function Float32Attribute( array, itemSize ) { + + console.warn( 'THREE.Float32Attribute has been removed. Use new THREE.Float32BufferAttribute() instead.' ); + return new Float32BufferAttribute( array, itemSize ); + + } + + function Float64Attribute( array, itemSize ) { + + console.warn( 'THREE.Float64Attribute has been removed. Use new THREE.Float64BufferAttribute() instead.' ); + return new Float64BufferAttribute( array, itemSize ); + + } + + // + + Curve.create = function ( construct, getPoint ) { + + console.log( 'THREE.Curve.create() has been deprecated' ); + + construct.prototype = Object.create( Curve.prototype ); + construct.prototype.constructor = construct; + construct.prototype.getPoint = getPoint; + + return construct; + + }; + + // + + function ClosedSplineCurve3( points ) { + + console.warn( 'THREE.ClosedSplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.' ); + + CatmullRomCurve3.call( this, points ); + this.type = 'catmullrom'; + this.closed = true; + + } + + ClosedSplineCurve3.prototype = Object.create( CatmullRomCurve3.prototype ); + + // + + function SplineCurve3( points ) { + + console.warn( 'THREE.SplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.' ); + + CatmullRomCurve3.call( this, points ); + this.type = 'catmullrom'; + + } + + SplineCurve3.prototype = Object.create( CatmullRomCurve3.prototype ); + + // + + function Spline( points ) { + + console.warn( 'THREE.Spline has been removed. Use THREE.CatmullRomCurve3 instead.' ); + + CatmullRomCurve3.call( this, points ); + this.type = 'catmullrom'; + + } + + Spline.prototype = Object.create( CatmullRomCurve3.prototype ); + + Object.assign( Spline.prototype, { + + initFromArray: function ( a ) { + + console.error( 'THREE.Spline: .initFromArray() has been removed.' ); + + }, + getControlPointsArray: function ( optionalTarget ) { + + console.error( 'THREE.Spline: .getControlPointsArray() has been removed.' ); + + }, + reparametrizeByArcLength: function ( samplingCoef ) { + + console.error( 'THREE.Spline: .reparametrizeByArcLength() has been removed.' ); + + } + + } ); + + // + function BoundingBoxHelper( object, color ) { + + console.warn( 'THREE.BoundingBoxHelper has been deprecated. Creating a THREE.BoxHelper instead.' ); + return new BoxHelper( object, color ); + + } + + function EdgesHelper( object, hex ) { + + console.warn( 'THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead.' ); + return new LineSegments( new EdgesGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) ); + + } + + GridHelper.prototype.setColors = function () { + + console.error( 'THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.' ); + + }; + + function WireframeHelper( object, hex ) { + + console.warn( 'THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead.' ); + return new LineSegments( new WireframeGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) ); + + } + + // + + function XHRLoader( manager ) { + + console.warn( 'THREE.XHRLoader has been renamed to THREE.FileLoader.' ); + return new FileLoader( manager ); + + } + + function BinaryTextureLoader( manager ) { + + console.warn( 'THREE.BinaryTextureLoader has been renamed to THREE.DataTextureLoader.' ); + return new DataTextureLoader( manager ); + + } + + // + + Object.assign( Box2.prototype, { + + center: function ( optionalTarget ) { + + console.warn( 'THREE.Box2: .center() has been renamed to .getCenter().' ); + return this.getCenter( optionalTarget ); + + }, + empty: function () { + + console.warn( 'THREE.Box2: .empty() has been renamed to .isEmpty().' ); + return this.isEmpty(); + + }, + isIntersectionBox: function ( box ) { + + console.warn( 'THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().' ); + return this.intersectsBox( box ); + + }, + size: function ( optionalTarget ) { + + console.warn( 'THREE.Box2: .size() has been renamed to .getSize().' ); + return this.getSize( optionalTarget ); + + } + } ); + + Object.assign( Box3.prototype, { + + center: function ( optionalTarget ) { + + console.warn( 'THREE.Box3: .center() has been renamed to .getCenter().' ); + return this.getCenter( optionalTarget ); + + }, + empty: function () { + + console.warn( 'THREE.Box3: .empty() has been renamed to .isEmpty().' ); + return this.isEmpty(); + + }, + isIntersectionBox: function ( box ) { + + console.warn( 'THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().' ); + return this.intersectsBox( box ); + + }, + isIntersectionSphere: function ( sphere ) { + + console.warn( 'THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().' ); + return this.intersectsSphere( sphere ); + + }, + size: function ( optionalTarget ) { + + console.warn( 'THREE.Box3: .size() has been renamed to .getSize().' ); + return this.getSize( optionalTarget ); + + } + } ); + + Line3.prototype.center = function ( optionalTarget ) { + + console.warn( 'THREE.Line3: .center() has been renamed to .getCenter().' ); + return this.getCenter( optionalTarget ); + + }; + + _Math.random16 = function () { + + console.warn( 'THREE.Math.random16() has been deprecated. Use Math.random() instead.' ); + return Math.random(); + + }; + + Object.assign( Matrix3.prototype, { + + flattenToArrayOffset: function ( array, offset ) { + + console.warn( "THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead." ); + return this.toArray( array, offset ); + + }, + multiplyVector3: function ( vector ) { + + console.warn( 'THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.' ); + return vector.applyMatrix3( this ); + + }, + multiplyVector3Array: function ( a ) { + + console.warn( 'THREE.Matrix3: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.' ); + return this.applyToVector3Array( a ); + + }, + applyToBuffer: function( buffer, offset, length ) { + + console.warn( 'THREE.Matrix3: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.' ); + return this.applyToBufferAttribute( buffer ); + + }, + applyToVector3Array: function( array, offset, length ) { + + console.error( 'THREE.Matrix3: .applyToVector3Array() has been removed.' ); + + } + + } ); + + Object.assign( Matrix4.prototype, { + + extractPosition: function ( m ) { + + console.warn( 'THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().' ); + return this.copyPosition( m ); + + }, + flattenToArrayOffset: function ( array, offset ) { + + console.warn( "THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead." ); + return this.toArray( array, offset ); + + }, + getPosition: function () { + + var v1; + + return function getPosition() { + + if ( v1 === undefined ) v1 = new Vector3(); + console.warn( 'THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.' ); + return v1.setFromMatrixColumn( this, 3 ); + + }; + + }(), + setRotationFromQuaternion: function ( q ) { + + console.warn( 'THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().' ); + return this.makeRotationFromQuaternion( q ); + + }, + multiplyToArray: function () { + + console.warn( 'THREE.Matrix4: .multiplyToArray() has been removed.' ); + + }, + multiplyVector3: function ( vector ) { + + console.warn( 'THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead.' ); + return vector.applyMatrix4( this ); + + }, + multiplyVector4: function ( vector ) { + + console.warn( 'THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.' ); + return vector.applyMatrix4( this ); + + }, + multiplyVector3Array: function ( a ) { + + console.warn( 'THREE.Matrix4: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.' ); + return this.applyToVector3Array( a ); + + }, + rotateAxis: function ( v ) { + + console.warn( 'THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.' ); + v.transformDirection( this ); + + }, + crossVector: function ( vector ) { + + console.warn( 'THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.' ); + return vector.applyMatrix4( this ); + + }, + translate: function () { + + console.error( 'THREE.Matrix4: .translate() has been removed.' ); + + }, + rotateX: function () { + + console.error( 'THREE.Matrix4: .rotateX() has been removed.' ); + + }, + rotateY: function () { + + console.error( 'THREE.Matrix4: .rotateY() has been removed.' ); + + }, + rotateZ: function () { + + console.error( 'THREE.Matrix4: .rotateZ() has been removed.' ); + + }, + rotateByAxis: function () { + + console.error( 'THREE.Matrix4: .rotateByAxis() has been removed.' ); + + }, + applyToBuffer: function( buffer, offset, length ) { + + console.warn( 'THREE.Matrix4: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.' ); + return this.applyToBufferAttribute( buffer ); + + }, + applyToVector3Array: function( array, offset, length ) { + + console.error( 'THREE.Matrix4: .applyToVector3Array() has been removed.' ); + + }, + makeFrustum: function( left, right, bottom, top, near, far ) { + + console.warn( 'THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead.' ); + return this.makePerspective( left, right, top, bottom, near, far ); + + } + + } ); + + Plane.prototype.isIntersectionLine = function ( line ) { + + console.warn( 'THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().' ); + return this.intersectsLine( line ); + + }; + + Quaternion.prototype.multiplyVector3 = function ( vector ) { + + console.warn( 'THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.' ); + return vector.applyQuaternion( this ); + + }; + + Object.assign( Ray.prototype, { + + isIntersectionBox: function ( box ) { + + console.warn( 'THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().' ); + return this.intersectsBox( box ); + + }, + isIntersectionPlane: function ( plane ) { + + console.warn( 'THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().' ); + return this.intersectsPlane( plane ); + + }, + isIntersectionSphere: function ( sphere ) { + + console.warn( 'THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().' ); + return this.intersectsSphere( sphere ); + + } + + } ); + + Object.assign( Shape.prototype, { + + extrude: function ( options ) { + + console.warn( 'THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.' ); + return new ExtrudeGeometry( this, options ); + + }, + makeGeometry: function ( options ) { + + console.warn( 'THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.' ); + return new ShapeGeometry( this, options ); + + } + + } ); + + Object.assign( Vector2.prototype, { + + fromAttribute: function ( attribute, index, offset ) { + + console.error( 'THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute().' ); + return this.fromBufferAttribute( attribute, index, offset ); + + } + + } ); + + Object.assign( Vector3.prototype, { + + setEulerFromRotationMatrix: function () { + + console.error( 'THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.' ); + + }, + setEulerFromQuaternion: function () { + + console.error( 'THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.' ); + + }, + getPositionFromMatrix: function ( m ) { + + console.warn( 'THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().' ); + return this.setFromMatrixPosition( m ); + + }, + getScaleFromMatrix: function ( m ) { + + console.warn( 'THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().' ); + return this.setFromMatrixScale( m ); + + }, + getColumnFromMatrix: function ( index, matrix ) { + + console.warn( 'THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().' ); + return this.setFromMatrixColumn( matrix, index ); + + }, + applyProjection: function ( m ) { + + console.warn( 'THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead.' ); + return this.applyMatrix4( m ); + + }, + fromAttribute: function ( attribute, index, offset ) { + + console.error( 'THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute().' ); + return this.fromBufferAttribute( attribute, index, offset ); + + } + + } ); + + Object.assign( Vector4.prototype, { + + fromAttribute: function ( attribute, index, offset ) { + + console.error( 'THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().' ); + return this.fromBufferAttribute( attribute, index, offset ); + + } + + } ); + + // + + Geometry.prototype.computeTangents = function () { + + console.warn( 'THREE.Geometry: .computeTangents() has been removed.' ); + + }; + + Object.assign( Object3D.prototype, { + + getChildByName: function ( name ) { + + console.warn( 'THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().' ); + return this.getObjectByName( name ); + + }, + renderDepth: function () { + + console.warn( 'THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.' ); + + }, + translate: function ( distance, axis ) { + + console.warn( 'THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.' ); + return this.translateOnAxis( axis, distance ); + + } + + } ); + + Object.defineProperties( Object3D.prototype, { + + eulerOrder: { + get: function () { + + console.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' ); + return this.rotation.order; + + }, + set: function ( value ) { + + console.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' ); + this.rotation.order = value; + + } + }, + useQuaternion: { + get: function () { + + console.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' ); + + }, + set: function () { + + console.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' ); + + } + } + + } ); + + Object.defineProperties( LOD.prototype, { + + objects: { + get: function () { + + console.warn( 'THREE.LOD: .objects has been renamed to .levels.' ); + return this.levels; + + } + } + + } ); + + Object.defineProperty( Skeleton.prototype, 'useVertexTexture', { + + get: function () { + + console.warn( 'THREE.Skeleton: useVertexTexture has been removed.' ); + + }, + set: function () { + + console.warn( 'THREE.Skeleton: useVertexTexture has been removed.' ); + + } + + } ); + + Object.defineProperty( Curve.prototype, '__arcLengthDivisions', { + + get: function () { + + console.warn( 'THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.' ); + return this.arcLengthDivisions; + + }, + set: function ( value ) { + + console.warn( 'THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.' ); + this.arcLengthDivisions = value; + + } + + } ); + + // + + PerspectiveCamera.prototype.setLens = function ( focalLength, filmGauge ) { + + console.warn( "THREE.PerspectiveCamera.setLens is deprecated. " + + "Use .setFocalLength and .filmGauge for a photographic setup." ); + + if ( filmGauge !== undefined ) this.filmGauge = filmGauge; + this.setFocalLength( focalLength ); + + }; + + // + + Object.defineProperties( Light.prototype, { + onlyShadow: { + set: function () { + + console.warn( 'THREE.Light: .onlyShadow has been removed.' ); + + } + }, + shadowCameraFov: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraFov is now .shadow.camera.fov.' ); + this.shadow.camera.fov = value; + + } + }, + shadowCameraLeft: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraLeft is now .shadow.camera.left.' ); + this.shadow.camera.left = value; + + } + }, + shadowCameraRight: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraRight is now .shadow.camera.right.' ); + this.shadow.camera.right = value; + + } + }, + shadowCameraTop: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraTop is now .shadow.camera.top.' ); + this.shadow.camera.top = value; + + } + }, + shadowCameraBottom: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.' ); + this.shadow.camera.bottom = value; + + } + }, + shadowCameraNear: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraNear is now .shadow.camera.near.' ); + this.shadow.camera.near = value; + + } + }, + shadowCameraFar: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraFar is now .shadow.camera.far.' ); + this.shadow.camera.far = value; + + } + }, + shadowCameraVisible: { + set: function () { + + console.warn( 'THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.' ); + + } + }, + shadowBias: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowBias is now .shadow.bias.' ); + this.shadow.bias = value; + + } + }, + shadowDarkness: { + set: function () { + + console.warn( 'THREE.Light: .shadowDarkness has been removed.' ); + + } + }, + shadowMapWidth: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.' ); + this.shadow.mapSize.width = value; + + } + }, + shadowMapHeight: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.' ); + this.shadow.mapSize.height = value; + + } + } + } ); + + // + + Object.defineProperties( BufferAttribute.prototype, { + + length: { + get: function () { + + console.warn( 'THREE.BufferAttribute: .length has been deprecated. Use .count instead.' ); + return this.array.length; + + } + } + + } ); + + Object.assign( BufferGeometry.prototype, { + + addIndex: function ( index ) { + + console.warn( 'THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().' ); + this.setIndex( index ); + + }, + addDrawCall: function ( start, count, indexOffset ) { + + if ( indexOffset !== undefined ) { + + console.warn( 'THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.' ); + + } + console.warn( 'THREE.BufferGeometry: .addDrawCall() is now .addGroup().' ); + this.addGroup( start, count ); + + }, + clearDrawCalls: function () { + + console.warn( 'THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().' ); + this.clearGroups(); + + }, + computeTangents: function () { + + console.warn( 'THREE.BufferGeometry: .computeTangents() has been removed.' ); + + }, + computeOffsets: function () { + + console.warn( 'THREE.BufferGeometry: .computeOffsets() has been removed.' ); + + } + + } ); + + Object.defineProperties( BufferGeometry.prototype, { + + drawcalls: { + get: function () { + + console.error( 'THREE.BufferGeometry: .drawcalls has been renamed to .groups.' ); + return this.groups; + + } + }, + offsets: { + get: function () { + + console.warn( 'THREE.BufferGeometry: .offsets has been renamed to .groups.' ); + return this.groups; + + } + } + + } ); + + // + + Object.defineProperties( Uniform.prototype, { + + dynamic: { + set: function () { + + console.warn( 'THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.' ); + + } + }, + onUpdate: { + value: function () { + + console.warn( 'THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.' ); + return this; + + } + } + + } ); + + // + + Object.defineProperties( Material.prototype, { + + wrapAround: { + get: function () { + + console.warn( 'THREE.Material: .wrapAround has been removed.' ); + + }, + set: function () { + + console.warn( 'THREE.Material: .wrapAround has been removed.' ); + + } + }, + wrapRGB: { + get: function () { + + console.warn( 'THREE.Material: .wrapRGB has been removed.' ); + return new Color(); + + } + } + + } ); + + Object.defineProperties( MeshPhongMaterial.prototype, { + + metal: { + get: function () { + + console.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead.' ); + return false; + + }, + set: function () { + + console.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead' ); + + } + } + + } ); + + Object.defineProperties( ShaderMaterial.prototype, { + + derivatives: { + get: function () { + + console.warn( 'THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' ); + return this.extensions.derivatives; + + }, + set: function ( value ) { + + console.warn( 'THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' ); + this.extensions.derivatives = value; + + } + } + + } ); + + // + + Object.assign( WebGLRenderer.prototype, { + + getCurrentRenderTarget: function () { + + console.warn( 'THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget().' ); + return this.getRenderTarget(); + + }, + + supportsFloatTextures: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( \'OES_texture_float\' ).' ); + return this.extensions.get( 'OES_texture_float' ); + + }, + supportsHalfFloatTextures: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( \'OES_texture_half_float\' ).' ); + return this.extensions.get( 'OES_texture_half_float' ); + + }, + supportsStandardDerivatives: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( \'OES_standard_derivatives\' ).' ); + return this.extensions.get( 'OES_standard_derivatives' ); + + }, + supportsCompressedTextureS3TC: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( \'WEBGL_compressed_texture_s3tc\' ).' ); + return this.extensions.get( 'WEBGL_compressed_texture_s3tc' ); + + }, + supportsCompressedTexturePVRTC: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( \'WEBGL_compressed_texture_pvrtc\' ).' ); + return this.extensions.get( 'WEBGL_compressed_texture_pvrtc' ); + + }, + supportsBlendMinMax: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( \'EXT_blend_minmax\' ).' ); + return this.extensions.get( 'EXT_blend_minmax' ); + + }, + supportsVertexTextures: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures.' ); + return this.capabilities.vertexTextures; + + }, + supportsInstancedArrays: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( \'ANGLE_instanced_arrays\' ).' ); + return this.extensions.get( 'ANGLE_instanced_arrays' ); + + }, + enableScissorTest: function ( boolean ) { + + console.warn( 'THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().' ); + this.setScissorTest( boolean ); + + }, + initMaterial: function () { + + console.warn( 'THREE.WebGLRenderer: .initMaterial() has been removed.' ); + + }, + addPrePlugin: function () { + + console.warn( 'THREE.WebGLRenderer: .addPrePlugin() has been removed.' ); + + }, + addPostPlugin: function () { + + console.warn( 'THREE.WebGLRenderer: .addPostPlugin() has been removed.' ); + + }, + updateShadowMap: function () { + + console.warn( 'THREE.WebGLRenderer: .updateShadowMap() has been removed.' ); + + } + + } ); + + Object.defineProperties( WebGLRenderer.prototype, { + + shadowMapEnabled: { + get: function () { + + return this.shadowMap.enabled; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.' ); + this.shadowMap.enabled = value; + + } + }, + shadowMapType: { + get: function () { + + return this.shadowMap.type; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.' ); + this.shadowMap.type = value; + + } + }, + shadowMapCullFace: { + get: function () { + + return this.shadowMap.cullFace; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderer: .shadowMapCullFace is now .shadowMap.cullFace.' ); + this.shadowMap.cullFace = value; + + } + } + } ); + + Object.defineProperties( WebGLShadowMap.prototype, { + + cullFace: { + get: function () { + + return this.renderReverseSided ? CullFaceFront : CullFaceBack; + + }, + set: function ( cullFace ) { + + var value = ( cullFace !== CullFaceBack ); + console.warn( "WebGLRenderer: .shadowMap.cullFace is deprecated. Set .shadowMap.renderReverseSided to " + value + "." ); + this.renderReverseSided = value; + + } + } + + } ); + + // + + Object.defineProperties( WebGLRenderTarget.prototype, { + + wrapS: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' ); + return this.texture.wrapS; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' ); + this.texture.wrapS = value; + + } + }, + wrapT: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' ); + return this.texture.wrapT; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' ); + this.texture.wrapT = value; + + } + }, + magFilter: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' ); + return this.texture.magFilter; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' ); + this.texture.magFilter = value; + + } + }, + minFilter: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' ); + return this.texture.minFilter; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' ); + this.texture.minFilter = value; + + } + }, + anisotropy: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' ); + return this.texture.anisotropy; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' ); + this.texture.anisotropy = value; + + } + }, + offset: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' ); + return this.texture.offset; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' ); + this.texture.offset = value; + + } + }, + repeat: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' ); + return this.texture.repeat; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' ); + this.texture.repeat = value; + + } + }, + format: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' ); + return this.texture.format; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' ); + this.texture.format = value; + + } + }, + type: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' ); + return this.texture.type; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' ); + this.texture.type = value; + + } + }, + generateMipmaps: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' ); + return this.texture.generateMipmaps; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' ); + this.texture.generateMipmaps = value; + + } + } + + } ); + + // + + Audio.prototype.load = function ( file ) { + + console.warn( 'THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.' ); + var scope = this; + var audioLoader = new AudioLoader(); + audioLoader.load( file, function ( buffer ) { + + scope.setBuffer( buffer ); + + } ); + return this; + + }; + + AudioAnalyser.prototype.getData = function () { + + console.warn( 'THREE.AudioAnalyser: .getData() is now .getFrequencyData().' ); + return this.getFrequencyData(); + + }; + + // + + var GeometryUtils = { + + merge: function ( geometry1, geometry2, materialIndexOffset ) { + + console.warn( 'THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead.' ); + var matrix; + + if ( geometry2.isMesh ) { + + geometry2.matrixAutoUpdate && geometry2.updateMatrix(); + + matrix = geometry2.matrix; + geometry2 = geometry2.geometry; + + } + + geometry1.merge( geometry2, matrix, materialIndexOffset ); + + }, + + center: function ( geometry ) { + + console.warn( 'THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead.' ); + return geometry.center(); + + } + + }; + + var ImageUtils = { + + crossOrigin: undefined, + + loadTexture: function ( url, mapping, onLoad, onError ) { + + console.warn( 'THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.' ); + + var loader = new TextureLoader(); + loader.setCrossOrigin( this.crossOrigin ); + + var texture = loader.load( url, onLoad, undefined, onError ); + + if ( mapping ) texture.mapping = mapping; + + return texture; + + }, + + loadTextureCube: function ( urls, mapping, onLoad, onError ) { + + console.warn( 'THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.' ); + + var loader = new CubeTextureLoader(); + loader.setCrossOrigin( this.crossOrigin ); + + var texture = loader.load( urls, onLoad, undefined, onError ); + + if ( mapping ) texture.mapping = mapping; + + return texture; + + }, + + loadCompressedTexture: function () { + + console.error( 'THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.' ); + + }, + + loadCompressedTextureCube: function () { + + console.error( 'THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.' ); + + } + + }; + + // + + function Projector() { + + console.error( 'THREE.Projector has been moved to /examples/js/renderers/Projector.js.' ); + + this.projectVector = function ( vector, camera ) { + + console.warn( 'THREE.Projector: .projectVector() is now vector.project().' ); + vector.project( camera ); + + }; + + this.unprojectVector = function ( vector, camera ) { + + console.warn( 'THREE.Projector: .unprojectVector() is now vector.unproject().' ); + vector.unproject( camera ); + + }; + + this.pickingRay = function () { + + console.error( 'THREE.Projector: .pickingRay() is now raycaster.setFromCamera().' ); + + }; + + } + + // + + function CanvasRenderer() { + + console.error( 'THREE.CanvasRenderer has been moved to /examples/js/renderers/CanvasRenderer.js' ); + + this.domElement = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); + this.clear = function () {}; + this.render = function () {}; + this.setClearColor = function () {}; + this.setSize = function () {}; + + } + + exports.WebGLRenderTargetCube = WebGLRenderTargetCube; + exports.WebGLRenderTarget = WebGLRenderTarget; + exports.WebGLRenderer = WebGLRenderer; + exports.ShaderLib = ShaderLib; + exports.UniformsLib = UniformsLib; + exports.UniformsUtils = UniformsUtils; + exports.ShaderChunk = ShaderChunk; + exports.FogExp2 = FogExp2; + exports.Fog = Fog; + exports.Scene = Scene; + exports.LensFlare = LensFlare; + exports.Sprite = Sprite; + exports.LOD = LOD; + exports.SkinnedMesh = SkinnedMesh; + exports.Skeleton = Skeleton; + exports.Bone = Bone; + exports.Mesh = Mesh; + exports.LineSegments = LineSegments; + exports.LineLoop = LineLoop; + exports.Line = Line; + exports.Points = Points; + exports.Group = Group; + exports.VideoTexture = VideoTexture; + exports.DataTexture = DataTexture; + exports.CompressedTexture = CompressedTexture; + exports.CubeTexture = CubeTexture; + exports.CanvasTexture = CanvasTexture; + exports.DepthTexture = DepthTexture; + exports.Texture = Texture; + exports.CompressedTextureLoader = CompressedTextureLoader; + exports.DataTextureLoader = DataTextureLoader; + exports.CubeTextureLoader = CubeTextureLoader; + exports.TextureLoader = TextureLoader; + exports.ObjectLoader = ObjectLoader; + exports.MaterialLoader = MaterialLoader; + exports.BufferGeometryLoader = BufferGeometryLoader; + exports.DefaultLoadingManager = DefaultLoadingManager; + exports.LoadingManager = LoadingManager; + exports.JSONLoader = JSONLoader; + exports.ImageLoader = ImageLoader; + exports.FontLoader = FontLoader; + exports.FileLoader = FileLoader; + exports.Loader = Loader; + exports.Cache = Cache; + exports.AudioLoader = AudioLoader; + exports.SpotLightShadow = SpotLightShadow; + exports.SpotLight = SpotLight; + exports.PointLight = PointLight; + exports.RectAreaLight = RectAreaLight; + exports.HemisphereLight = HemisphereLight; + exports.DirectionalLightShadow = DirectionalLightShadow; + exports.DirectionalLight = DirectionalLight; + exports.AmbientLight = AmbientLight; + exports.LightShadow = LightShadow; + exports.Light = Light; + exports.StereoCamera = StereoCamera; + exports.PerspectiveCamera = PerspectiveCamera; + exports.OrthographicCamera = OrthographicCamera; + exports.CubeCamera = CubeCamera; + exports.ArrayCamera = ArrayCamera; + exports.Camera = Camera; + exports.AudioListener = AudioListener; + exports.PositionalAudio = PositionalAudio; + exports.AudioContext = AudioContext; + exports.AudioAnalyser = AudioAnalyser; + exports.Audio = Audio; + exports.VectorKeyframeTrack = VectorKeyframeTrack; + exports.StringKeyframeTrack = StringKeyframeTrack; + exports.QuaternionKeyframeTrack = QuaternionKeyframeTrack; + exports.NumberKeyframeTrack = NumberKeyframeTrack; + exports.ColorKeyframeTrack = ColorKeyframeTrack; + exports.BooleanKeyframeTrack = BooleanKeyframeTrack; + exports.PropertyMixer = PropertyMixer; + exports.PropertyBinding = PropertyBinding; + exports.KeyframeTrack = KeyframeTrack; + exports.AnimationUtils = AnimationUtils; + exports.AnimationObjectGroup = AnimationObjectGroup; + exports.AnimationMixer = AnimationMixer; + exports.AnimationClip = AnimationClip; + exports.Uniform = Uniform; + exports.InstancedBufferGeometry = InstancedBufferGeometry; + exports.BufferGeometry = BufferGeometry; + exports.GeometryIdCount = GeometryIdCount; + exports.Geometry = Geometry; + exports.InterleavedBufferAttribute = InterleavedBufferAttribute; + exports.InstancedInterleavedBuffer = InstancedInterleavedBuffer; + exports.InterleavedBuffer = InterleavedBuffer; + exports.InstancedBufferAttribute = InstancedBufferAttribute; + exports.Face3 = Face3; + exports.Object3D = Object3D; + exports.Raycaster = Raycaster; + exports.Layers = Layers; + exports.EventDispatcher = EventDispatcher; + exports.Clock = Clock; + exports.QuaternionLinearInterpolant = QuaternionLinearInterpolant; + exports.LinearInterpolant = LinearInterpolant; + exports.DiscreteInterpolant = DiscreteInterpolant; + exports.CubicInterpolant = CubicInterpolant; + exports.Interpolant = Interpolant; + exports.Triangle = Triangle; + exports.Math = _Math; + exports.Spherical = Spherical; + exports.Cylindrical = Cylindrical; + exports.Plane = Plane; + exports.Frustum = Frustum; + exports.Sphere = Sphere; + exports.Ray = Ray; + exports.Matrix4 = Matrix4; + exports.Matrix3 = Matrix3; + exports.Box3 = Box3; + exports.Box2 = Box2; + exports.Line3 = Line3; + exports.Euler = Euler; + exports.Vector4 = Vector4; + exports.Vector3 = Vector3; + exports.Vector2 = Vector2; + exports.Quaternion = Quaternion; + exports.Color = Color; + exports.MorphBlendMesh = MorphBlendMesh; + exports.ImmediateRenderObject = ImmediateRenderObject; + exports.VertexNormalsHelper = VertexNormalsHelper; + exports.SpotLightHelper = SpotLightHelper; + exports.SkeletonHelper = SkeletonHelper; + exports.PointLightHelper = PointLightHelper; + exports.RectAreaLightHelper = RectAreaLightHelper; + exports.HemisphereLightHelper = HemisphereLightHelper; + exports.GridHelper = GridHelper; + exports.PolarGridHelper = PolarGridHelper; + exports.FaceNormalsHelper = FaceNormalsHelper; + exports.DirectionalLightHelper = DirectionalLightHelper; + exports.CameraHelper = CameraHelper; + exports.BoxHelper = BoxHelper; + exports.ArrowHelper = ArrowHelper; + exports.AxisHelper = AxisHelper; + exports.CatmullRomCurve3 = CatmullRomCurve3; + exports.CubicBezierCurve3 = CubicBezierCurve3; + exports.QuadraticBezierCurve3 = QuadraticBezierCurve3; + exports.LineCurve3 = LineCurve3; + exports.ArcCurve = ArcCurve; + exports.EllipseCurve = EllipseCurve; + exports.SplineCurve = SplineCurve; + exports.CubicBezierCurve = CubicBezierCurve; + exports.QuadraticBezierCurve = QuadraticBezierCurve; + exports.LineCurve = LineCurve; + exports.Shape = Shape; + exports.Path = Path; + exports.ShapePath = ShapePath; + exports.Font = Font; + exports.CurvePath = CurvePath; + exports.Curve = Curve; + exports.ShapeUtils = ShapeUtils; + exports.SceneUtils = SceneUtils; + exports.WireframeGeometry = WireframeGeometry; + exports.ParametricGeometry = ParametricGeometry; + exports.ParametricBufferGeometry = ParametricBufferGeometry; + exports.TetrahedronGeometry = TetrahedronGeometry; + exports.TetrahedronBufferGeometry = TetrahedronBufferGeometry; + exports.OctahedronGeometry = OctahedronGeometry; + exports.OctahedronBufferGeometry = OctahedronBufferGeometry; + exports.IcosahedronGeometry = IcosahedronGeometry; + exports.IcosahedronBufferGeometry = IcosahedronBufferGeometry; + exports.DodecahedronGeometry = DodecahedronGeometry; + exports.DodecahedronBufferGeometry = DodecahedronBufferGeometry; + exports.PolyhedronGeometry = PolyhedronGeometry; + exports.PolyhedronBufferGeometry = PolyhedronBufferGeometry; + exports.TubeGeometry = TubeGeometry; + exports.TubeBufferGeometry = TubeBufferGeometry; + exports.TorusKnotGeometry = TorusKnotGeometry; + exports.TorusKnotBufferGeometry = TorusKnotBufferGeometry; + exports.TorusGeometry = TorusGeometry; + exports.TorusBufferGeometry = TorusBufferGeometry; + exports.TextGeometry = TextGeometry; + exports.TextBufferGeometry = TextBufferGeometry; + exports.SphereGeometry = SphereGeometry; + exports.SphereBufferGeometry = SphereBufferGeometry; + exports.RingGeometry = RingGeometry; + exports.RingBufferGeometry = RingBufferGeometry; + exports.PlaneGeometry = PlaneGeometry; + exports.PlaneBufferGeometry = PlaneBufferGeometry; + exports.LatheGeometry = LatheGeometry; + exports.LatheBufferGeometry = LatheBufferGeometry; + exports.ShapeGeometry = ShapeGeometry; + exports.ShapeBufferGeometry = ShapeBufferGeometry; + exports.ExtrudeGeometry = ExtrudeGeometry; + exports.ExtrudeBufferGeometry = ExtrudeBufferGeometry; + exports.EdgesGeometry = EdgesGeometry; + exports.ConeGeometry = ConeGeometry; + exports.ConeBufferGeometry = ConeBufferGeometry; + exports.CylinderGeometry = CylinderGeometry; + exports.CylinderBufferGeometry = CylinderBufferGeometry; + exports.CircleGeometry = CircleGeometry; + exports.CircleBufferGeometry = CircleBufferGeometry; + exports.BoxGeometry = BoxGeometry; + exports.BoxBufferGeometry = BoxBufferGeometry; + exports.ShadowMaterial = ShadowMaterial; + exports.SpriteMaterial = SpriteMaterial; + exports.RawShaderMaterial = RawShaderMaterial; + exports.ShaderMaterial = ShaderMaterial; + exports.PointsMaterial = PointsMaterial; + exports.MeshPhysicalMaterial = MeshPhysicalMaterial; + exports.MeshStandardMaterial = MeshStandardMaterial; + exports.MeshPhongMaterial = MeshPhongMaterial; + exports.MeshToonMaterial = MeshToonMaterial; + exports.MeshNormalMaterial = MeshNormalMaterial; + exports.MeshLambertMaterial = MeshLambertMaterial; + exports.MeshDepthMaterial = MeshDepthMaterial; + exports.MeshBasicMaterial = MeshBasicMaterial; + exports.LineDashedMaterial = LineDashedMaterial; + exports.LineBasicMaterial = LineBasicMaterial; + exports.Material = Material; + exports.Float64BufferAttribute = Float64BufferAttribute; + exports.Float32BufferAttribute = Float32BufferAttribute; + exports.Uint32BufferAttribute = Uint32BufferAttribute; + exports.Int32BufferAttribute = Int32BufferAttribute; + exports.Uint16BufferAttribute = Uint16BufferAttribute; + exports.Int16BufferAttribute = Int16BufferAttribute; + exports.Uint8ClampedBufferAttribute = Uint8ClampedBufferAttribute; + exports.Uint8BufferAttribute = Uint8BufferAttribute; + exports.Int8BufferAttribute = Int8BufferAttribute; + exports.BufferAttribute = BufferAttribute; + exports.REVISION = REVISION; + exports.MOUSE = MOUSE; + exports.CullFaceNone = CullFaceNone; + exports.CullFaceBack = CullFaceBack; + exports.CullFaceFront = CullFaceFront; + exports.CullFaceFrontBack = CullFaceFrontBack; + exports.FrontFaceDirectionCW = FrontFaceDirectionCW; + exports.FrontFaceDirectionCCW = FrontFaceDirectionCCW; + exports.BasicShadowMap = BasicShadowMap; + exports.PCFShadowMap = PCFShadowMap; + exports.PCFSoftShadowMap = PCFSoftShadowMap; + exports.FrontSide = FrontSide; + exports.BackSide = BackSide; + exports.DoubleSide = DoubleSide; + exports.FlatShading = FlatShading; + exports.SmoothShading = SmoothShading; + exports.NoColors = NoColors; + exports.FaceColors = FaceColors; + exports.VertexColors = VertexColors; + exports.NoBlending = NoBlending; + exports.NormalBlending = NormalBlending; + exports.AdditiveBlending = AdditiveBlending; + exports.SubtractiveBlending = SubtractiveBlending; + exports.MultiplyBlending = MultiplyBlending; + exports.CustomBlending = CustomBlending; + exports.AddEquation = AddEquation; + exports.SubtractEquation = SubtractEquation; + exports.ReverseSubtractEquation = ReverseSubtractEquation; + exports.MinEquation = MinEquation; + exports.MaxEquation = MaxEquation; + exports.ZeroFactor = ZeroFactor; + exports.OneFactor = OneFactor; + exports.SrcColorFactor = SrcColorFactor; + exports.OneMinusSrcColorFactor = OneMinusSrcColorFactor; + exports.SrcAlphaFactor = SrcAlphaFactor; + exports.OneMinusSrcAlphaFactor = OneMinusSrcAlphaFactor; + exports.DstAlphaFactor = DstAlphaFactor; + exports.OneMinusDstAlphaFactor = OneMinusDstAlphaFactor; + exports.DstColorFactor = DstColorFactor; + exports.OneMinusDstColorFactor = OneMinusDstColorFactor; + exports.SrcAlphaSaturateFactor = SrcAlphaSaturateFactor; + exports.NeverDepth = NeverDepth; + exports.AlwaysDepth = AlwaysDepth; + exports.LessDepth = LessDepth; + exports.LessEqualDepth = LessEqualDepth; + exports.EqualDepth = EqualDepth; + exports.GreaterEqualDepth = GreaterEqualDepth; + exports.GreaterDepth = GreaterDepth; + exports.NotEqualDepth = NotEqualDepth; + exports.MultiplyOperation = MultiplyOperation; + exports.MixOperation = MixOperation; + exports.AddOperation = AddOperation; + exports.NoToneMapping = NoToneMapping; + exports.LinearToneMapping = LinearToneMapping; + exports.ReinhardToneMapping = ReinhardToneMapping; + exports.Uncharted2ToneMapping = Uncharted2ToneMapping; + exports.CineonToneMapping = CineonToneMapping; + exports.UVMapping = UVMapping; + exports.CubeReflectionMapping = CubeReflectionMapping; + exports.CubeRefractionMapping = CubeRefractionMapping; + exports.EquirectangularReflectionMapping = EquirectangularReflectionMapping; + exports.EquirectangularRefractionMapping = EquirectangularRefractionMapping; + exports.SphericalReflectionMapping = SphericalReflectionMapping; + exports.CubeUVReflectionMapping = CubeUVReflectionMapping; + exports.CubeUVRefractionMapping = CubeUVRefractionMapping; + exports.RepeatWrapping = RepeatWrapping; + exports.ClampToEdgeWrapping = ClampToEdgeWrapping; + exports.MirroredRepeatWrapping = MirroredRepeatWrapping; + exports.NearestFilter = NearestFilter; + exports.NearestMipMapNearestFilter = NearestMipMapNearestFilter; + exports.NearestMipMapLinearFilter = NearestMipMapLinearFilter; + exports.LinearFilter = LinearFilter; + exports.LinearMipMapNearestFilter = LinearMipMapNearestFilter; + exports.LinearMipMapLinearFilter = LinearMipMapLinearFilter; + exports.UnsignedByteType = UnsignedByteType; + exports.ByteType = ByteType; + exports.ShortType = ShortType; + exports.UnsignedShortType = UnsignedShortType; + exports.IntType = IntType; + exports.UnsignedIntType = UnsignedIntType; + exports.FloatType = FloatType; + exports.HalfFloatType = HalfFloatType; + exports.UnsignedShort4444Type = UnsignedShort4444Type; + exports.UnsignedShort5551Type = UnsignedShort5551Type; + exports.UnsignedShort565Type = UnsignedShort565Type; + exports.UnsignedInt248Type = UnsignedInt248Type; + exports.AlphaFormat = AlphaFormat; + exports.RGBFormat = RGBFormat; + exports.RGBAFormat = RGBAFormat; + exports.LuminanceFormat = LuminanceFormat; + exports.LuminanceAlphaFormat = LuminanceAlphaFormat; + exports.RGBEFormat = RGBEFormat; + exports.DepthFormat = DepthFormat; + exports.DepthStencilFormat = DepthStencilFormat; + exports.RGB_S3TC_DXT1_Format = RGB_S3TC_DXT1_Format; + exports.RGBA_S3TC_DXT1_Format = RGBA_S3TC_DXT1_Format; + exports.RGBA_S3TC_DXT3_Format = RGBA_S3TC_DXT3_Format; + exports.RGBA_S3TC_DXT5_Format = RGBA_S3TC_DXT5_Format; + exports.RGB_PVRTC_4BPPV1_Format = RGB_PVRTC_4BPPV1_Format; + exports.RGB_PVRTC_2BPPV1_Format = RGB_PVRTC_2BPPV1_Format; + exports.RGBA_PVRTC_4BPPV1_Format = RGBA_PVRTC_4BPPV1_Format; + exports.RGBA_PVRTC_2BPPV1_Format = RGBA_PVRTC_2BPPV1_Format; + exports.RGB_ETC1_Format = RGB_ETC1_Format; + exports.LoopOnce = LoopOnce; + exports.LoopRepeat = LoopRepeat; + exports.LoopPingPong = LoopPingPong; + exports.InterpolateDiscrete = InterpolateDiscrete; + exports.InterpolateLinear = InterpolateLinear; + exports.InterpolateSmooth = InterpolateSmooth; + exports.ZeroCurvatureEnding = ZeroCurvatureEnding; + exports.ZeroSlopeEnding = ZeroSlopeEnding; + exports.WrapAroundEnding = WrapAroundEnding; + exports.TrianglesDrawMode = TrianglesDrawMode; + exports.TriangleStripDrawMode = TriangleStripDrawMode; + exports.TriangleFanDrawMode = TriangleFanDrawMode; + exports.LinearEncoding = LinearEncoding; + exports.sRGBEncoding = sRGBEncoding; + exports.GammaEncoding = GammaEncoding; + exports.RGBEEncoding = RGBEEncoding; + exports.LogLuvEncoding = LogLuvEncoding; + exports.RGBM7Encoding = RGBM7Encoding; + exports.RGBM16Encoding = RGBM16Encoding; + exports.RGBDEncoding = RGBDEncoding; + exports.BasicDepthPacking = BasicDepthPacking; + exports.RGBADepthPacking = RGBADepthPacking; + exports.CubeGeometry = BoxGeometry; + exports.Face4 = Face4; + exports.LineStrip = LineStrip; + exports.LinePieces = LinePieces; + exports.MeshFaceMaterial = MeshFaceMaterial; + exports.MultiMaterial = MultiMaterial; + exports.PointCloud = PointCloud; + exports.Particle = Particle; + exports.ParticleSystem = ParticleSystem; + exports.PointCloudMaterial = PointCloudMaterial; + exports.ParticleBasicMaterial = ParticleBasicMaterial; + exports.ParticleSystemMaterial = ParticleSystemMaterial; + exports.Vertex = Vertex; + exports.DynamicBufferAttribute = DynamicBufferAttribute; + exports.Int8Attribute = Int8Attribute; + exports.Uint8Attribute = Uint8Attribute; + exports.Uint8ClampedAttribute = Uint8ClampedAttribute; + exports.Int16Attribute = Int16Attribute; + exports.Uint16Attribute = Uint16Attribute; + exports.Int32Attribute = Int32Attribute; + exports.Uint32Attribute = Uint32Attribute; + exports.Float32Attribute = Float32Attribute; + exports.Float64Attribute = Float64Attribute; + exports.ClosedSplineCurve3 = ClosedSplineCurve3; + exports.SplineCurve3 = SplineCurve3; + exports.Spline = Spline; + exports.BoundingBoxHelper = BoundingBoxHelper; + exports.EdgesHelper = EdgesHelper; + exports.WireframeHelper = WireframeHelper; + exports.XHRLoader = XHRLoader; + exports.BinaryTextureLoader = BinaryTextureLoader; + exports.GeometryUtils = GeometryUtils; + exports.ImageUtils = ImageUtils; + exports.Projector = Projector; + exports.CanvasRenderer = CanvasRenderer; + + Object.defineProperty(exports, '__esModule', { value: true }); + +}))); \ No newline at end of file diff --git a/1_Three.js/main.js b/1_Three.js/main.js new file mode 100755 index 0000000000000000000000000000000000000000..0cdede3dd08c0a6d7f6cdb8d3ef555ab662bf708 --- /dev/null +++ b/1_Three.js/main.js @@ -0,0 +1,71 @@ +function init() { + var scene = new THREE.Scene(); + + //////////2//////////// + // var box = getBox(1, 1, 1); + // box.position.y = box.geometry.parameters.height/2; + // scene.add(box); + ////////////////////// + + //////////3//////////// + // var plane = getPlane(4); + // plane.rotation.x = Math.PI/2; + // scene.add(plane); + ////////////////////// + + var camera = new THREE.PerspectiveCamera( + 45, + window.innerWidth/window.innerHeight, + 1, + 1000 + ); + + //////////1//////////// + // camera.position.x = 1; + // camera.position.y = 2; + // camera.position.z = 5; + ////////////////////// + + camera.lookAt(new THREE.Vector3(0, 0, 0)); + + var renderer = new THREE.WebGLRenderer(); + renderer.setSize(window.innerWidth, window.innerHeight); + document.getElementById('webgl').appendChild(renderer.domElement); + renderer.render( + scene, + camera + ); +} + +//////////2//////////// +// function getBox(w, h, d) { +// var geometry = new THREE.BoxGeometry(w, h, d); +// var material = new THREE.MeshBasicMaterial({ +// color: 0x00ff00 +// }); +// var mesh = new THREE.Mesh( +// geometry, +// material +// ); + +// return mesh; +// } +////////////////////// + +/////////3///////////// +// function getPlane(size) { +// var geometry = new THREE.PlaneGeometry(size, size); +// var material = new THREE.MeshBasicMaterial({ +// color: 0xff0000, +// side: THREE.DoubleSide +// }); +// var mesh = new THREE.Mesh( +// geometry, +// material +// ); + +// return mesh; +// } +////////////////////// + +init(); \ No newline at end of file