/**
* @file
*
* Summary.
*
* <p>The functions in this file create models in an
* {@link https://math.hws.edu/graphicsbook/c3/s4.html IFS}
* (Indexed Face Set) format that can be drawn using gl.drawElements
* with primitive type gl.TRIANGLES.</p>
*
* <p>Objects have vertex coordinates, normal vectors, and texture
* coordinates for each vertex, plus a list of indices
* for the element array buffer. </p>
*
* The return value of each function is an object, {@link modelData model}, with properties:
* <ul>
* <li>model.vertexPositions -- the vertex coordinates; </li>
* <li>model.vertexNormals -- the normal vectors; </li>
* <li>model.vertexTextureCoords -- the texture coordinates; </li>
* <li>model.indices -- the face indices. </li>
* </ul>
*
* The first three properties are of type Float32Array,
* while model.indices is of type Uint16Array.
*
* <p>This file also defines a variable (not a function) {@link teapotModel},
* which is a model of the OpenGL
* <a href="/cwdc/13-webgl/examples/lighting/content/doc-lighting2/index.html">teapot</a>
* in the same format.</p>
* <ul>
* <li>{@link uvCone cone}</li>
* <li>{@link cube cube}</li>
* <li>{@link uvCylinder cylinder}</li>
* <li>{@link ring ring}</li>
* <li>{@link uvSphere sphere}</li>
* <li>{@link teapotModel teapot}</li>
* <li>{@link uvTorus torus}</li>
* </ul>
* @since 08/01/2014
* @author {@link https://math.hws.edu/eck/ David J. Eck}
* @author modified by Paulo Roma
* @see <a href="/cwdc/13-webgl/lib/basic-objects-IFS.js">source</a>
* @see {@link https://math.hws.edu/graphicsbook/demos/script/basic-object-models-IFS.js hws source}
*/
"use strict";
/**
* Sets the North to be the y-axis,
* so the z-axis points outside the screen.
* @type {Boolean}
*/
let yNorth = true;
/**
* <p>Rotate the given model so the y-axis points North.</p>
* The variable {@link yNorth} must be true, otherwise this function has no effect:
* <ul style="list-style: none;">
* <li>if (yNorth) (x, y, z) → (-x, z , y)</li>
* </ul>
* @param {Float32Array} vertices vertex array.
* @param {Float32Array} normals normal array.
*/
function setNorth(vertices, normals) {
if (yNorth) {
for (let i = 0; i < vertices.length; i += 3) {
vertices[i] = -vertices[i]; // x
[vertices[i + 1], vertices[i + 2]] = [vertices[i + 2], vertices[i + 1]];
normals[i] = -normals[i]; // x
[normals[i + 1], normals[i + 2]] = [normals[i + 2], normals[i + 1]];
}
}
}
/**
* An object containing raw data for
* vertices, normal vectors, texture coordinates, and indices.
* <p>{@link https://threejs.org/docs/#api/en/geometries/PolyhedronGeometry Polyhedra} have no index.</p>
* @typedef {Object} modelData
* @property {Float32Array} vertexPositions vertex coordinates.
* @property {Float32Array} vertexNormals vertex normals.
* @property {Float32Array} vertexTextureCoords texture coordinates.
* @property {Uint16Array|Uint32Array} indices index array.
*/
/**
* Given an instance of
* <ul>
* <li>{@link THREE.BufferGeometry THREE.BufferGeometry}</li>
* </ul>
* returns an object containing raw data for
* vertices, normal vectors, texture coordinates, and indices.
* <p>{@link https://threejs.org/docs/#api/en/geometries/PolyhedronGeometry Polyhedra} have no index.</p>
* @param {THREE.BufferGeometry} geom
* {@link https://threejs.org/docs/#api/en/geometries/BoxGeometry THREE.BoxGeometry}<br>
* {@link https://threejs.org/docs/#api/en/geometries/CapsuleGeometry THREE.CapsuleGeometry},<br>
* {@link https://threejs.org/docs/#api/en/geometries/ConeGeometry THREE.ConeGeometry},<br>
* {@link https://threejs.org/docs/#api/en/geometries/CylinderGeometry THREE.CylinderGeometry},<br>
* {@link https://threejs.org/docs/#api/en/geometries/PlaneGeometry THREE.PlaneGeometry},<br>
* {@link https://threejs.org/docs/#api/en/geometries/RingGeometry THREE.RingGeometry},<br>
* {@link https://threejs.org/docs/#api/en/geometries/SphereGeometry THREE.SphereGeometry},<br>
* {@link https://threejs.org/docs/#api/en/geometries/TorusGeometry THREE.TorusGeometry},<br>
* {@link https://threejs.org/docs/#api/en/geometries/TorusKnotGeometry THREE.TorusKnotGeometry},<br>
* {@link https://threejs.org/docs/#api/en/geometries/DodecahedronGeometry THREE.DodecahedronGeometry},<br>
* {@link https://threejs.org/docs/#api/en/geometries/IcosahedronGeometry THREE.IcosahedronGeometry},<br>
* {@link https://threejs.org/docs/#api/en/geometries/OctahedronGeometry THREE.OctahedronGeometry},<br>
* {@link https://threejs.org/docs/#api/en/geometries/TetrahedronGeometry THREE.TetrahedronGeometry},<br>
* {@link TeapotGeometry THREE.TeapotGeometry}.
* @return {modelData}
*/
function getModelData(geom) {
return {
vertexPositions: geom.getAttribute("position").array,
vertexNormals: geom.getAttribute("normal").array,
vertexTextureCoords: geom.getAttribute("uv").array,
indices: geom.index ? geom.index.array : null,
};
}
/**
* <p>Create a model of a cube, centered at the origin.</p>
* This is not a particularly good format for a cube,
* since an IFS representation has a lot of redundancy.
* @param {Number} side the length of a side of the cube.
* If not given, the value will be 1.
* @return {modelData}
*/
function cube(side) {
const s = (side || 1) / 2;
const coords = [];
const normals = [];
const texCoords = [];
const indices = [];
function face(xyz, nrm) {
const start = coords.length / 3;
coords.push(...xyz);
normals.push(...nrm, ...nrm, ...nrm, ...nrm);
texCoords.push(0, 0, 1, 0, 1, 1, 0, 1);
indices.push(start, start + 1, start + 2, start, start + 2, start + 3);
}
face([-s, -s, s, s, -s, s, s, s, s, -s, s, s], [0, 0, 1]);
face([s, -s, -s, -s, -s, -s, -s, s, -s, s, s, -s], [0, 0, -1]);
face([-s, s, s, s, s, s, s, s, -s, -s, s, -s], [0, 1, 0]);
face([-s, -s, -s, s, -s, -s, s, -s, s, -s, -s, s], [0, -1, 0]);
face([s, -s, s, s, -s, -s, s, s, -s, s, s, s], [1, 0, 0]);
face([-s, -s, -s, -s, -s, s, -s, s, s, -s, s, -s], [-1, 0, 0]);
return {
vertexPositions: new Float32Array(coords),
vertexNormals: new Float32Array(normals),
vertexTextureCoords: new Float32Array(texCoords),
indices: new Uint16Array(indices),
};
}
/**
* <p>Creates a model of an annulus or disk lying in the xy plane,
* centered at the origin.</p>
* This is not a great representation, since all the normals are the same.
* @param {Number} innerRadius the radius of the hole in the radius; a value of
* zero will give a disk rather than a ring. <br>
* If ommited, the default value is 0.25.
* @param {Number} outerRadius the radius of the ring, from the center to the
* outer edge. Must be greater than innerRadius. <br>
* If ommited, the default value is 2*innerRadius if innerRadius > 0 or 0.5 otherwise.
* @param {Number} slices the number of radial subdivisions in the circular approximation
* of an annulus, minimum 3, default 32.
* @return {modelData}
*/
function ring(innerRadius, outerRadius, slices) {
if (arguments.length == 0) innerRadius = 0.25;
outerRadius = outerRadius || innerRadius * 2 || 0.5;
slices = slices || 32;
const vertexCount = innerRadius == 0 ? slices + 1 : slices * 2;
const vertices = new Float32Array(3 * vertexCount);
const normals = new Float32Array(3 * vertexCount);
const texCoords = new Float32Array(2 * vertexCount);
const indices = new Uint16Array(
innerRadius == 0 ? 3 * slices : 3 * 2 * slices,
);
const d = (2 * Math.PI) / slices;
let k = 0;
let t = 0;
let n = 0;
if (innerRadius == 0) {
for (let i = 0; i < slices; i++) {
const c = Math.cos(d * i);
const s = Math.sin(d * i);
vertices[k++] = c * outerRadius;
vertices[k++] = s * outerRadius;
vertices[k++] = 0;
texCoords[t++] = 0.5 + 0.5 * c;
texCoords[t++] = 0.5 + 0.5 * s;
indices[n++] = slices;
indices[n++] = i;
indices[n++] = i == slices - 1 ? 0 : i + 1;
}
vertices[k++] = vertices[k++] = vertices[k++] = 0;
texCoords[t++] = texCoords[t++] = 0;
} else {
const r = innerRadius / outerRadius;
for (let i = 0; i < slices; i++) {
const c = Math.cos(d * i);
const s = Math.sin(d * i);
vertices[k++] = c * innerRadius;
vertices[k++] = s * innerRadius;
vertices[k++] = 0;
texCoords[t++] = 0.5 + 0.5 * c * r;
texCoords[t++] = 0.5 + 0.5 * s * r;
vertices[k++] = c * outerRadius;
vertices[k++] = s * outerRadius;
vertices[k++] = 0;
texCoords[t++] = 0.5 + 0.5 * c;
texCoords[t++] = 0.5 + 0.5 * s;
}
for (let i = 0; i < slices - 1; i++) {
indices[n++] = 2 * i;
indices[n++] = 2 * i + 1;
indices[n++] = 2 * i + 3;
indices[n++] = 2 * i;
indices[n++] = 2 * i + 3;
indices[n++] = 2 * i + 2;
}
const i = slices - 1;
indices[n++] = 2 * i;
indices[n++] = 2 * i + 1;
indices[n++] = 1;
indices[n++] = 2 * i;
indices[n++] = 1;
indices[n++] = 0;
}
for (let i = 0; i < vertexCount; i++) {
normals[3 * i] = normals[3 * i + 1] = 0;
normals[3 * i + 2] = 1;
}
return {
vertexPositions: vertices,
vertexNormals: normals,
vertexTextureCoords: texCoords,
indices: indices,
};
}
/**
* <p>Create a model of a sphere.</p>
* The z-axis is the axis of the sphere
* with the north pole on the positive z-axis and the center at (0,0,0).
* <p>The number of triangles is 2 * slices * stacks, e.g., 48 * 24 * 2 = 2304.
* <p>However, two rows and one column of vertices have been duplicated.
* Without {@link uvSphereND vertex duplication},
* the number of triangles would be 48 * 23 * 2 = 2208.<br>
* In fact, this is topologically a cylinder whose vertices on the two borders
* have the same coordinates of the sphere north/south poles, respectively:
* <ul>
* <li>uvSphere(radius, slices, stack) ≍ uvCylinder(r, height, slices, stack, true, true)</li>
* </ul>
* </p>
* @param {Number} radius the radius of the sphere, default 0.5 if not specified.
* @param {Number} slices the number of lines of longitude, minimum 3, default 32
* @param {Number} stacks the number of lines of latitude plus 1, minimum 2, default 16. <br>
* (This is the number of vertical slices, bounded by lines of latitude,
* the north pole and the south pole.)
* @return {modelData}
* @see <a href="/cwdc/downloads/cg/doc/html/torus_8cpp.html#a6c5b17163125dd32bd7c04a99738d316">sphere</a>
*/
function uvSphere(radius, slices, stacks) {
radius = radius || 0.5;
slices = slices || 32;
stacks = stacks || 16;
const vertexCount = (slices + 1) * (stacks + 1);
const vertices = new Float32Array(3 * vertexCount);
const normals = new Float32Array(3 * vertexCount);
const texCoords = new Float32Array(2 * vertexCount);
const indices = new Uint16Array(2 * slices * stacks * 3);
const du = (2 * Math.PI) / slices;
const dv = Math.PI / stacks;
let i, j;
let indexV = 0;
let indexT = 0;
for (i = 0; i <= stacks; i++) {
const v = -Math.PI / 2 + i * dv;
for (j = 0; j <= slices; j++) {
const u = j * du;
const x = Math.cos(u) * Math.cos(v);
const y = Math.sin(u) * Math.cos(v);
const z = Math.sin(v);
vertices[indexV] = radius * x;
normals[indexV++] = x;
vertices[indexV] = radius * y;
normals[indexV++] = y;
vertices[indexV] = radius * z;
normals[indexV++] = z;
texCoords[indexT++] = j / slices;
texCoords[indexT++] = i / stacks;
}
}
let k = 0;
for (j = 0; j < stacks; j++) {
const row1 = j * (slices + 1);
const row2 = (j + 1) * (slices + 1);
for (i = 0; i < slices; i++) {
indices[k++] = row1 + i;
indices[k++] = row2 + i + 1;
indices[k++] = row2 + i;
indices[k++] = row1 + i;
indices[k++] = row1 + i + 1;
indices[k++] = row2 + i + 1;
}
}
setNorth(vertices, normals);
return {
vertexPositions: vertices,
vertexNormals: normals,
vertexTextureCoords: texCoords,
indices: indices,
};
}
/**
* <p>Create a model of a sphere.</p>
* The z-axis is the axis of the sphere
* with the north pole on the positive z-axis and the center at (0,0,0).
* <p>This version does not duplicate vertices on the seam, but it does require
* Tarini's method when texturing.</p>
* @param {Number} radius the radius of the sphere, default 0.5 if not specified.
* @param {Number} slices the number of lines of longitude, minimum 3, default 32
* @param {Number} stacks the number of lines of latitude plus 1, minimum 2, default 16. <br>
* (This is the number of vertical slices, bounded by lines of latitude,
* the north pole and the south pole.)
* @return {modelData}
* @see <a href="/cwdc/downloads/cg/doc/html/torus_8cpp.html#a6c5b17163125dd32bd7c04a99738d316">sphere</a>
*/
function uvSphereND(radius, slices, stacks) {
radius = radius || 0.5;
slices = slices || 32;
stacks = stacks || 16;
const vertexCount = (stacks - 1) * slices + 2;
const triangleCount = (stacks - 1) * slices * 2;
const vertices = new Float32Array(3 * vertexCount);
const normals = new Float32Array(3 * vertexCount);
const texCoords = new Float32Array(2 * vertexCount);
const indices = new Uint16Array(triangleCount * 3);
const du = (2 * Math.PI) / slices;
const dv = Math.PI / stacks;
let i, j;
let indexV = 0;
let indexT = 0;
let k = 0;
// vertex at south pole
vertices[indexV] = 0;
normals[indexV++] = 0;
vertices[indexV] = 0;
normals[indexV++] = 0;
vertices[indexV] = -radius;
normals[indexV++] = -1;
texCoords[indexT++] = 0.0;
texCoords[indexT++] = 0.0;
// vertices in the middle of the sphere
for (j = 1; j < stacks; j++) {
const v = -Math.PI / 2 + j * dv;
for (i = 0; i < slices; i++) {
const u = i * du;
const x = Math.cos(u) * Math.cos(v);
const y = Math.sin(u) * Math.cos(v);
const z = Math.sin(v);
vertices[indexV] = radius * x;
normals[indexV++] = x;
vertices[indexV] = radius * y;
normals[indexV++] = y;
vertices[indexV] = radius * z;
normals[indexV++] = z;
texCoords[indexT++] = i / slices;
texCoords[indexT++] = j / stacks;
}
}
// vertex at north pole
vertices[indexV] = 0;
normals[indexV++] = 0;
vertices[indexV] = 0;
normals[indexV++] = 0;
vertices[indexV] = radius;
normals[indexV++] = 1;
texCoords[indexT++] = 1.0;
texCoords[indexT++] = 1.0;
// triangles incident on vertex at south pole
// stacks = 0, row1 = 0
const row2 = 1;
for (i = 0; i < slices - 1; i++) {
indices[k++] = 0;
indices[k++] = row2 + i + 1;
indices[k++] = row2 + i;
}
i = slices - 1;
indices[k++] = 0;
indices[k++] = row2;
indices[k++] = row2 + i;
// triangles in the middle of the sphere
for (j = 1; j < stacks - 1; j++) {
const row1 = (j - 1) * slices + 1;
const row2 = row1 + slices;
for (i = 0; i < slices - 1; i++) {
indices[k++] = row1 + i;
indices[k++] = row2 + i + 1;
indices[k++] = row2 + i;
indices[k++] = row1 + i;
indices[k++] = row1 + i + 1;
indices[k++] = row2 + i + 1;
}
i = slices - 1;
indices[k++] = row1 + i;
indices[k++] = row2;
indices[k++] = row2 + i;
indices[k++] = row1;
indices[k++] = row2;
indices[k++] = row1 + i;
}
// triangles incident on vertex at north pole
// stacks = stacks - 1, row2 = vertexCount - 1
const row1 = vertexCount - slices - 1;
for (i = 0; i < slices - 1; i++) {
indices[k++] = vertexCount - 1;
indices[k++] = row1 + i;
indices[k++] = row1 + i + 1;
}
i = slices - 1;
indices[k++] = vertexCount - 1;
indices[k++] = row1 + i;
indices[k++] = row1;
setNorth(vertices, normals);
return {
vertexPositions: vertices,
vertexNormals: normals,
vertexTextureCoords: texCoords,
indices: indices,
};
}
/**
* <p>Create a model of a torus (surface of a doughnut).</p>
* The z-axis goes through the doughnut hole,
* and the center of the torus is at (0,0,0).
* @param {Number} outerRadius the distance from the center to the outside of the tube, 0.5 if not specified.
* @param {Number} innerRadius the distance from the center to the inside of the tube, outerRadius/3 if not
* specified. <br>
* (This is the radius of the doughnut hole.)
* @param {Number} slices the number of lines of longitude, minimum 3, default 32. <br>
* These are slices parallel to the
* z-axis and go around the tube the short way (through the hole).
* @param {Number} stacks the number of lines of latitude plus 1, minimum 2, default 16. <br>
* These lines are perpendicular
* to the z-axis and go around the tube the long way (around the hole).
* @return {modelData}
* @see <a href="/cwdc/downloads/cg/doc/html/torus_8cpp.html#acf04d1331c5f0cedfaacc30d1d3f46f4">torus</a>
* @see <img src="/cwdc/13-webgl/extras/torusparams.gif">
*/
function uvTorus(outerRadius, innerRadius, slices, stacks) {
outerRadius = outerRadius || 0.5;
innerRadius = innerRadius || outerRadius / 3;
slices = slices || 32;
stacks = stacks || 16;
const vertexCount = (slices + 1) * (stacks + 1);
const vertices = new Float32Array(3 * vertexCount);
const normals = new Float32Array(3 * vertexCount);
const texCoords = new Float32Array(2 * vertexCount);
const indices = new Uint16Array(2 * slices * stacks * 3);
const du = (2 * Math.PI) / slices;
const dv = (2 * Math.PI) / stacks;
const centerRadius = (innerRadius + outerRadius) / 2;
const tubeRadius = outerRadius - centerRadius;
let indexV = 0;
let indexT = 0;
for (let j = 0; j <= stacks; j++) {
const v = -Math.PI + j * dv;
const cos = Math.cos(v);
const sin = Math.sin(v);
for (let i = 0; i <= slices; i++) {
const u = i * du;
const cx = Math.cos(u);
const cy = Math.sin(u);
const x = cx * (centerRadius + tubeRadius * cos);
const y = cy * (centerRadius + tubeRadius * cos);
const z = sin * tubeRadius;
vertices[indexV] = x;
normals[indexV++] = cx * cos;
vertices[indexV] = y;
normals[indexV++] = cy * cos;
vertices[indexV] = z;
normals[indexV++] = sin;
texCoords[indexT++] = i / slices;
texCoords[indexT++] = j / stacks;
}
}
let k = 0;
for (let j = 0; j < stacks; j++) {
const row1 = j * (slices + 1);
const row2 = (j + 1) * (slices + 1);
for (let i = 0; i < slices; i++) {
indices[k++] = row1 + i;
indices[k++] = row2 + i + 1;
indices[k++] = row2 + i;
indices[k++] = row1 + i;
indices[k++] = row1 + i + 1;
indices[k++] = row2 + i + 1;
}
}
return {
vertexPositions: vertices,
vertexNormals: normals,
vertexTextureCoords: texCoords,
indices: indices,
};
}
/**
* <p>Defines a model of a cylinder.</p>
* The axis of the cylinder is the z-axis,
* and the center is at (0,0,0).
* @param {Number} radius the radius of the cylinder
* @param {Number} height the height of the cylinder. <br>
* The cylinder extends from -height/2 to height/2 along the z-axis.
* @param {Number} slices the number of slices, like the slices of an orange, minimum 3, default 32.
* @param {Number} stacks the number of stacks, like horizontal cuts of an orange, minimum 1, default 16.
* @param {Boolean} noTop if missing or false, the cylinder has a top; if set to true,
* the cylinder does not have a top. <br>
* The top is a disk at the positive end of the cylinder.
* @param {Boolean} noBottom if missing or false, the cylinder has a bottom; if set to true,
* the cylinder does not have a bottom. <br>
* The bottom is a disk at the negative end of the cylinder.
* @return {modelData}
* @see <a href="/cwdc/downloads/cg/doc/html/torus_8cpp.html#a03c085eb7ef8ae60df19dc9e06c0a173">cylinder</a>
*/
function uvCylinder(radius, height, slices, stacks, noTop, noBottom) {
radius = radius || 0.5;
height = height || 2 * radius;
slices = slices || 32;
stacks = stacks || 16;
// improves the interpolation - roma
const fractions = [...Array(stacks + 1).keys()].map((i) => i / stacks);
let vertexCount = fractions.length * (slices + 1);
if (!noTop) vertexCount += slices + 2;
if (!noBottom) vertexCount += slices + 2;
let triangleCount = (fractions.length - 1) * 2 * slices;
if (!noTop) triangleCount += slices;
if (!noBottom) triangleCount += slices;
const vertices = new Float32Array(vertexCount * 3);
const normals = new Float32Array(vertexCount * 3);
const texCoords = new Float32Array(vertexCount * 2);
const indices = new Uint16Array(triangleCount * 3);
const du = (2 * Math.PI) / slices;
let kv = 0;
let kt = 0;
let k = 0;
let i, j;
for (j = 0; j < fractions.length; j++) {
// create a zig-zag mesh
const uoffset = j % 2 == 0 ? 0 : 0.5;
for (i = 0; i <= slices; i++) {
const h1 = -height / 2 + fractions[j] * height;
const u = (i + uoffset) * du;
const c = Math.cos(u);
const s = Math.sin(u);
vertices[kv] = c * radius; // x
normals[kv++] = c;
vertices[kv] = s * radius; // y
normals[kv++] = s;
vertices[kv] = h1; // z
normals[kv++] = 0;
texCoords[kt++] = (i + uoffset) / slices;
texCoords[kt++] = fractions[j];
}
}
for (j = 0; j < fractions.length - 1; j++) {
const row1 = j * (slices + 1);
const row2 = (j + 1) * (slices + 1);
for (i = 0; i < slices; i++) {
indices[k++] = row1 + i;
indices[k++] = row2 + i + 1;
indices[k++] = row2 + i;
indices[k++] = row1 + i;
indices[k++] = row1 + i + 1;
indices[k++] = row2 + i + 1;
}
}
if (!noBottom) {
const startIndex = kv / 3;
vertices[kv] = 0;
normals[kv++] = 0;
vertices[kv] = 0;
normals[kv++] = 0;
vertices[kv] = -height / 2;
normals[kv++] = -1;
texCoords[kt++] = 0.5;
texCoords[kt++] = 0.5;
for (i = 0; i <= slices; i++) {
const u = 2 * Math.PI - i * du;
const c = Math.cos(u);
const s = Math.sin(u);
vertices[kv] = c * radius;
normals[kv++] = 0;
vertices[kv] = s * radius;
normals[kv++] = 0;
vertices[kv] = -height / 2;
normals[kv++] = -1;
texCoords[kt++] = 0.5 - 0.5 * c;
texCoords[kt++] = 0.5 + 0.5 * s;
}
for (i = 0; i < slices; i++) {
indices[k++] = startIndex;
indices[k++] = startIndex + i + 1;
indices[k++] = startIndex + i + 2;
}
}
if (!noTop) {
const startIndex = kv / 3;
vertices[kv] = 0;
normals[kv++] = 0;
vertices[kv] = 0;
normals[kv++] = 0;
vertices[kv] = height / 2;
normals[kv++] = 1;
texCoords[kt++] = 0.5;
texCoords[kt++] = 0.5;
const uoffset = fractions.length % 2 == 0 ? 0.5 : 0;
for (i = 0; i <= slices; i++) {
const u = (i + uoffset) * du;
const c = Math.cos(u);
const s = Math.sin(u);
vertices[kv] = c * radius;
normals[kv++] = 0;
vertices[kv] = s * radius;
normals[kv++] = 0;
vertices[kv] = height / 2;
normals[kv++] = 1;
texCoords[kt++] = 0.5 + 0.5 * c;
texCoords[kt++] = 0.5 + 0.5 * s;
}
for (i = 0; i < slices; i++) {
indices[k++] = startIndex;
indices[k++] = startIndex + i + 1;
indices[k++] = startIndex + i + 2;
}
}
setNorth(vertices, normals);
return {
vertexPositions: vertices,
vertexNormals: normals,
vertexTextureCoords: texCoords,
indices: indices,
};
}
/**
* <p>Defines a model of a cone.</p>
* The axis of the cone is the z-axis,
* and the center is at (0,0,0).
* @param {Number} radius the radius of the cone
* @param {Number} height the height of the cone. The cone extends from -height/2
* to height/2 along the z-axis, with the tip at (0,0,height/2).
* @param {Number} slices the number of slices, like the slices of an orange, minimum 3, default 32.
* @param {Number} stacks the number of stacks, like horizontal cuts of an orange, minimum 1, default 16.
* @param {Boolean} noBottom if missing or false, the cone has a bottom; if set to true,
* the cone does not have a bottom. <br>
* The bottom is a disk at the wide end of the cone.
* @return {modelData}
* @see <a href="/cwdc/downloads/cg/doc/html/torus_8cpp.html#a2106dc9326540a0309d6e8d815e10a0e">cone</a>
*/
function uvCone(radius, height, slices, stacks, noBottom) {
radius = radius || 0.5;
height = height || 2 * radius;
slices = slices || 32;
stacks = stacks || 16;
// improves the interpolation - roma
const fractions = [...Array(stacks).keys()].map((i) => i / stacks);
// const fractions = [0, 4/16, 8/16, 12/16, 14/16, 15/16];
let vertexCount = fractions.length * (slices + 1) + slices;
if (!noBottom) vertexCount += slices + 2;
// roma - fixed
let triangleCount = (fractions.length - 1) * slices * 2 + 2 * slices;
if (!noBottom) triangleCount += slices;
const vertices = new Float32Array(vertexCount * 3);
const normals = new Float32Array(vertexCount * 3);
const texCoords = new Float32Array(vertexCount * 2);
const indices = new Uint16Array(triangleCount * 3);
const normallength = Math.sqrt(height * height + radius * radius);
const n1 = height / normallength;
const n2 = radius / normallength;
const du = (2 * Math.PI) / slices;
let kv = 0;
let kt = 0;
let k = 0;
let i, j;
for (j = 0; j < fractions.length; j++) {
// create a zig-zag mesh
const uoffset = j % 2 == 0 ? 0 : 0.5;
for (i = 0; i <= slices; i++) {
const h1 = -height / 2 + fractions[j] * height;
const u = (i + uoffset) * du;
const c = Math.cos(u);
const s = Math.sin(u);
vertices[kv] = c * radius * (1 - fractions[j]);
normals[kv++] = c * n1;
vertices[kv] = s * radius * (1 - fractions[j]);
normals[kv++] = s * n1;
vertices[kv] = h1;
normals[kv++] = n2;
texCoords[kt++] = (i + uoffset) / slices;
texCoords[kt++] = fractions[j];
}
}
for (j = 0; j < fractions.length - 1; j++) {
const row1 = j * (slices + 1);
const row2 = (j + 1) * (slices + 1);
for (i = 0; i < slices; i++) {
indices[k++] = row1 + i;
indices[k++] = row2 + i + 1;
indices[k++] = row2 + i;
indices[k++] = row1 + i;
indices[k++] = row1 + i + 1;
indices[k++] = row2 + i + 1;
}
}
const start = kv / 3 - (slices + 1);
for (i = 0; i < slices; i++) {
// slices points at top, with different normals, texcoords
const u = (i + 0.5) * du;
const c = Math.cos(u);
const s = Math.sin(u);
vertices[kv] = 0;
normals[kv++] = c * n1;
vertices[kv] = 0;
normals[kv++] = s * n1;
vertices[kv] = height / 2;
normals[kv++] = n2;
texCoords[kt++] = (i + 0.5) / slices;
texCoords[kt++] = 1;
}
for (i = 0; i < slices; i++) {
indices[k++] = start + i;
indices[k++] = start + i + 1;
indices[k++] = start + (slices + 1) + i;
}
if (!noBottom) {
const startIndex = kv / 3;
vertices[kv] = 0;
normals[kv++] = 0;
vertices[kv] = 0;
normals[kv++] = 0;
vertices[kv] = -height / 2;
normals[kv++] = -1;
texCoords[kt++] = 0.5;
texCoords[kt++] = 0.5;
for (i = 0; i <= slices; i++) {
const u = 2 * Math.PI - i * du;
const c = Math.cos(u);
const s = Math.sin(u);
vertices[kv] = c * radius;
normals[kv++] = 0;
vertices[kv] = s * radius;
normals[kv++] = 0;
vertices[kv] = -height / 2;
normals[kv++] = -1;
texCoords[kt++] = 0.5 - 0.5 * c;
texCoords[kt++] = 0.5 + 0.5 * s;
}
for (i = 0; i < slices; i++) {
indices[k++] = startIndex;
indices[k++] = startIndex + i + 1;
indices[k++] = startIndex + i + 2;
}
}
setNorth(vertices, normals);
return {
vertexPositions: vertices,
vertexNormals: normals,
vertexTextureCoords: texCoords,
indices: indices,
};
}
/**
* An IFS of the famous teapot, about 20 units big.
* @type {modelData}
*/
const teapotModel = {
vertexPositions: new Float32Array([
5.929688, 4.125, 0, 5.387188, 4.125, 2.7475, 5.2971, 4.494141, 2.70917,
5.832031, 4.494141, 0, 5.401602, 4.617188, 2.753633, 5.945313, 4.617188, 0,
5.614209, 4.494141, 2.844092, 6.175781, 4.494141, 0, 5.848437, 4.125,
2.94375, 6.429688, 4.125, 0, 3.899688, 4.125, 4.97, 3.830352, 4.494141,
4.900664, 3.910782, 4.617188, 4.981094, 4.074414, 4.494141, 5.144727,
4.254687, 4.125, 5.325, 1.677188, 4.125, 6.4575, 1.638858, 4.494141,
6.367412, 1.68332, 4.617188, 6.471914, 1.77378, 4.494141, 6.684522,
1.873438, 4.125, 6.91875, -1.070312, 4.125, 7, -1.070312, 4.494141,
6.902344, -1.070312, 4.617188, 7.015625, -1.070312, 4.494141, 7.246094,
-1.070312, 4.125, 7.5, -1.070312, 4.125, 7, -4.007656, 4.125, 6.4575,
-3.859572, 4.494141, 6.367412, -1.070312, 4.494141, 6.902344, -3.847676,
4.617188, 6.471914, -1.070312, 4.617188, 7.015625, -3.917371, 4.494141,
6.684522, -1.070312, 4.494141, 7.246094, -4.014062, 4.125, 6.91875,
-1.070312, 4.125, 7.5, -6.209063, 4.125, 4.97, -6.042168, 4.494141,
4.900664, -6.0725, 4.617188, 4.981094, -6.217675, 4.494141, 5.144727,
-6.395312, 4.125, 5.325, -7.591093, 4.125, 2.7475, -7.464421, 4.494141,
2.70917, -7.550137, 4.617188, 2.753633, -7.755822, 4.494141, 2.844092,
-7.989062, 4.125, 2.94375, -8.070313, 4.125, 0, -7.972656, 4.494141, 0,
-8.085938, 4.617188, 0, -8.316406, 4.494141, 0, -8.570313, 4.125, 0,
-8.070313, 4.125, 0, -7.527812, 4.125, -2.7475, -7.437724, 4.494141,
-2.70917, -7.972656, 4.494141, 0, -7.542227, 4.617188, -2.753633, -8.085938,
4.617188, 0, -7.754834, 4.494141, -2.844092, -8.316406, 4.494141, 0,
-7.989062, 4.125, -2.94375, -8.570313, 4.125, 0, -6.040312, 4.125, -4.97,
-5.970977, 4.494141, -4.900664, -6.051406, 4.617188, -4.981094, -6.215039,
4.494141, -5.144727, -6.395312, 4.125, -5.325, -3.817812, 4.125, -6.4575,
-3.779482, 4.494141, -6.367412, -3.823945, 4.617188, -6.471914, -3.914404,
4.494141, -6.684522, -4.014062, 4.125, -6.91875, -1.070312, 4.125, -7,
-1.070312, 4.494141, -6.902344, -1.070312, 4.617188, -7.015625, -1.070312,
4.494141, -7.246094, -1.070312, 4.125, -7.5, -1.070312, 4.125, -7, 1.677188,
4.125, -6.4575, 1.638858, 4.494141, -6.367412, -1.070312, 4.494141,
-6.902344, 1.68332, 4.617188, -6.471914, -1.070312, 4.617188, -7.015625,
1.77378, 4.494141, -6.684522, -1.070312, 4.494141, -7.246094, 1.873438,
4.125, -6.91875, -1.070312, 4.125, -7.5, 3.899688, 4.125, -4.97, 3.830352,
4.494141, -4.900664, 3.910782, 4.617188, -4.981094, 4.074414, 4.494141,
-5.144727, 4.254687, 4.125, -5.325, 5.387188, 4.125, -2.7475, 5.2971,
4.494141, -2.70917, 5.401602, 4.617188, -2.753633, 5.614209, 4.494141,
-2.844092, 5.848437, 4.125, -2.94375, 5.929688, 4.125, 0, 5.832031,
4.494141, 0, 5.945313, 4.617188, 0, 6.175781, 4.494141, 0, 6.429688, 4.125,
0, 6.429688, 4.125, 0, 5.848437, 4.125, 2.94375, 6.695264, 2.162109,
3.304053, 7.347656, 2.162109, 0, 7.433985, 0.234375, 3.61836, 8.148438,
0.234375, 0, 7.956494, -1.623047, 3.840674, 8.714844, -1.623047, 0,
8.154688, -3.375, 3.925, 8.929688, -3.375, 0, 4.254687, 4.125, 5.325,
4.906446, 2.162109, 5.976758, 5.475, 0.234375, 6.545312, 5.877149,
-1.623047, 6.947461, 6.029688, -3.375, 7.1, 1.873438, 4.125, 6.91875,
2.23374, 2.162109, 7.765576, 2.548047, 0.234375, 8.504297, 2.770362,
-1.623047, 9.026807, 2.854688, -3.375, 9.225, -1.070312, 4.125, 7.5,
-1.070312, 2.162109, 8.417969, -1.070312, 0.234375, 9.21875, -1.070312,
-1.623047, 9.785156, -1.070312, -3.375, 10, -1.070312, 4.125, 7.5,
-4.014062, 4.125, 6.91875, -4.374365, 2.162109, 7.765576, -1.070312,
2.162109, 8.417969, -4.688672, 0.234375, 8.504297, -1.070312, 0.234375,
9.21875, -4.910986, -1.623047, 9.026807, -1.070312, -1.623047, 9.785156,
-4.995313, -3.375, 9.225, -1.070312, -3.375, 10, -6.395312, 4.125, 5.325,
-7.047071, 2.162109, 5.976758, -7.615624, 0.234375, 6.545312, -8.017773,
-1.623047, 6.947461, -8.170312, -3.375, 7.1, -7.989062, 4.125, 2.94375,
-8.835889, 2.162109, 3.304053, -9.57461, 0.234375, 3.61836, -10.097119,
-1.623047, 3.840674, -10.295313, -3.375, 3.925, -8.570313, 4.125, 0,
-9.488281, 2.162109, 0, -10.289063, 0.234375, 0, -10.855469, -1.623047, 0,
-11.070313, -3.375, 0, -8.570313, 4.125, 0, -7.989062, 4.125, -2.94375,
-8.835889, 2.162109, -3.304053, -9.488281, 2.162109, 0, -9.57461, 0.234375,
-3.61836, -10.289063, 0.234375, 0, -10.097119, -1.623047, -3.840674,
-10.855469, -1.623047, 0, -10.295313, -3.375, -3.925, -11.070313, -3.375, 0,
-6.395312, 4.125, -5.325, -7.047071, 2.162109, -5.976758, -7.615624,
0.234375, -6.545312, -8.017773, -1.623047, -6.947461, -8.170312, -3.375,
-7.1, -4.014062, 4.125, -6.91875, -4.374365, 2.162109, -7.765576, -4.688672,
0.234375, -8.504297, -4.910986, -1.623047, -9.026807, -4.995313, -3.375,
-9.225, -1.070312, 4.125, -7.5, -1.070312, 2.162109, -8.417969, -1.070312,
0.234375, -9.21875, -1.070312, -1.623047, -9.785156, -1.070312, -3.375, -10,
-1.070312, 4.125, -7.5, 1.873438, 4.125, -6.91875, 2.23374, 2.162109,
-7.765576, -1.070312, 2.162109, -8.417969, 2.548047, 0.234375, -8.504297,
-1.070312, 0.234375, -9.21875, 2.770362, -1.623047, -9.026807, -1.070312,
-1.623047, -9.785156, 2.854688, -3.375, -9.225, -1.070312, -3.375, -10,
4.254687, 4.125, -5.325, 4.906446, 2.162109, -5.976758, 5.475, 0.234375,
-6.545312, 5.877149, -1.623047, -6.947461, 6.029688, -3.375, -7.1, 5.848437,
4.125, -2.94375, 6.695264, 2.162109, -3.304053, 7.433985, 0.234375,
-3.61836, 7.956494, -1.623047, -3.840674, 8.154688, -3.375, -3.925,
6.429688, 4.125, 0, 7.347656, 2.162109, 0, 8.148438, 0.234375, 0, 8.714844,
-1.623047, 0, 8.929688, -3.375, 0, 8.929688, -3.375, 0, 8.154688, -3.375,
3.925, 7.794336, -4.857422, 3.77168, 8.539063, -4.857422, 0, 7.001562,
-5.953125, 3.434375, 7.679688, -5.953125, 0, 6.208789, -6.697266, 3.09707,
6.820313, -6.697266, 0, 5.848437, -7.125, 2.94375, 6.429688, -7.125, 0,
6.029688, -3.375, 7.1, 5.752343, -4.857422, 6.822656, 5.142187, -5.953125,
6.2125, 4.532031, -6.697266, 5.602344, 4.254687, -7.125, 5.325, 2.854688,
-3.375, 9.225, 2.701367, -4.857422, 8.864649, 2.364063, -5.953125, 8.071875,
2.026758, -6.697266, 7.279101, 1.873438, -7.125, 6.91875, -1.070312, -3.375,
10, -1.070312, -4.857422, 9.609375, -1.070312, -5.953125, 8.75, -1.070312,
-6.697266, 7.890625, -1.070312, -7.125, 7.5, -1.070312, -3.375, 10,
-4.995313, -3.375, 9.225, -4.841992, -4.857422, 8.864649, -1.070312,
-4.857422, 9.609375, -4.504687, -5.953125, 8.071875, -1.070312, -5.953125,
8.75, -4.167383, -6.697266, 7.279101, -1.070312, -6.697266, 7.890625,
-4.014062, -7.125, 6.91875, -1.070312, -7.125, 7.5, -8.170312, -3.375, 7.1,
-7.892968, -4.857422, 6.822656, -7.282812, -5.953125, 6.2125, -6.672656,
-6.697266, 5.602344, -6.395312, -7.125, 5.325, -10.295313, -3.375, 3.925,
-9.934961, -4.857422, 3.77168, -9.142187, -5.953125, 3.434375, -8.349414,
-6.697266, 3.09707, -7.989062, -7.125, 2.94375, -11.070313, -3.375, 0,
-10.679688, -4.857422, 0, -9.820313, -5.953125, 0, -8.960938, -6.697266, 0,
-8.570313, -7.125, 0, -11.070313, -3.375, 0, -10.295313, -3.375, -3.925,
-9.934961, -4.857422, -3.77168, -10.679688, -4.857422, 0, -9.142187,
-5.953125, -3.434375, -9.820313, -5.953125, 0, -8.349414, -6.697266,
-3.09707, -8.960938, -6.697266, 0, -7.989062, -7.125, -2.94375, -8.570313,
-7.125, 0, -8.170312, -3.375, -7.1, -7.892968, -4.857422, -6.822656,
-7.282812, -5.953125, -6.2125, -6.672656, -6.697266, -5.602344, -6.395312,
-7.125, -5.325, -4.995313, -3.375, -9.225, -4.841992, -4.857422, -8.864649,
-4.504687, -5.953125, -8.071875, -4.167383, -6.697266, -7.279101, -4.014062,
-7.125, -6.91875, -1.070312, -3.375, -10, -1.070312, -4.857422, -9.609375,
-1.070312, -5.953125, -8.75, -1.070312, -6.697266, -7.890625, -1.070312,
-7.125, -7.5, -1.070312, -3.375, -10, 2.854688, -3.375, -9.225, 2.701367,
-4.857422, -8.864649, -1.070312, -4.857422, -9.609375, 2.364063, -5.953125,
-8.071875, -1.070312, -5.953125, -8.75, 2.026758, -6.697266, -7.279101,
-1.070312, -6.697266, -7.890625, 1.873438, -7.125, -6.91875, -1.070312,
-7.125, -7.5, 6.029688, -3.375, -7.1, 5.752343, -4.857422, -6.822656,
5.142187, -5.953125, -6.2125, 4.532031, -6.697266, -5.602344, 4.254687,
-7.125, -5.325, 8.154688, -3.375, -3.925, 7.794336, -4.857422, -3.77168,
7.001562, -5.953125, -3.434375, 6.208789, -6.697266, -3.09707, 5.848437,
-7.125, -2.94375, 8.929688, -3.375, 0, 8.539063, -4.857422, 0, 7.679688,
-5.953125, 0, 6.820313, -6.697266, 0, 6.429688, -7.125, 0, 6.429688, -7.125,
0, 5.848437, -7.125, 2.94375, 5.691685, -7.400391, 2.877056, 6.259766,
-7.400391, 0, 4.853868, -7.640625, 2.520586, 5.351563, -7.640625, 0,
2.783648, -7.810547, 1.639761, 3.107422, -7.810547, 0, -1.070312, -7.875, 0,
4.254687, -7.125, 5.325, 4.134043, -7.400391, 5.204355, 3.489219, -7.640625,
4.559531, 1.895879, -7.810547, 2.966191, -1.070312, -7.875, 0, 1.873438,
-7.125, 6.91875, 1.806743, -7.400391, 6.761997, 1.450274, -7.640625,
5.92418, 0.569448, -7.810547, 3.85396, -1.070312, -7.875, 0, -1.070312,
-7.125, 7.5, -1.070312, -7.400391, 7.330078, -1.070312, -7.640625, 6.421875,
-1.070312, -7.810547, 4.177734, -1.070312, -7.875, 0, -1.070312, -7.125,
7.5, -4.014062, -7.125, 6.91875, -3.947368, -7.400391, 6.761997, -1.070312,
-7.400391, 7.330078, -3.590898, -7.640625, 5.92418, -1.070312, -7.640625,
6.421875, -2.710073, -7.810547, 3.85396, -1.070312, -7.810547, 4.177734,
-1.070312, -7.875, 0, -6.395312, -7.125, 5.325, -6.274668, -7.400391,
5.204355, -5.629844, -7.640625, 4.559531, -4.036504, -7.810547, 2.966191,
-1.070312, -7.875, 0, -7.989062, -7.125, 2.94375, -7.832309, -7.400391,
2.877056, -6.994492, -7.640625, 2.520586, -4.924272, -7.810547, 1.639761,
-1.070312, -7.875, 0, -8.570313, -7.125, 0, -8.400391, -7.400391, 0,
-7.492188, -7.640625, 0, -5.248047, -7.810547, 0, -1.070312, -7.875, 0,
-8.570313, -7.125, 0, -7.989062, -7.125, -2.94375, -7.832309, -7.400391,
-2.877056, -8.400391, -7.400391, 0, -6.994492, -7.640625, -2.520586,
-7.492188, -7.640625, 0, -4.924272, -7.810547, -1.639761, -5.248047,
-7.810547, 0, -1.070312, -7.875, 0, -6.395312, -7.125, -5.325, -6.274668,
-7.400391, -5.204355, -5.629844, -7.640625, -4.559531, -4.036504, -7.810547,
-2.966191, -1.070312, -7.875, 0, -4.014062, -7.125, -6.91875, -3.947368,
-7.400391, -6.761997, -3.590898, -7.640625, -5.92418, -2.710073, -7.810547,
-3.85396, -1.070312, -7.875, 0, -1.070312, -7.125, -7.5, -1.070312,
-7.400391, -7.330078, -1.070312, -7.640625, -6.421875, -1.070312, -7.810547,
-4.177734, -1.070312, -7.875, 0, -1.070312, -7.125, -7.5, 1.873438, -7.125,
-6.91875, 1.806743, -7.400391, -6.761997, -1.070312, -7.400391, -7.330078,
1.450274, -7.640625, -5.92418, -1.070312, -7.640625, -6.421875, 0.569448,
-7.810547, -3.85396, -1.070312, -7.810547, -4.177734, -1.070312, -7.875, 0,
4.254687, -7.125, -5.325, 4.134043, -7.400391, -5.204355, 3.489219,
-7.640625, -4.559531, 1.895879, -7.810547, -2.966191, -1.070312, -7.875, 0,
5.848437, -7.125, -2.94375, 5.691685, -7.400391, -2.877056, 4.853868,
-7.640625, -2.520586, 2.783648, -7.810547, -1.639761, -1.070312, -7.875, 0,
6.429688, -7.125, 0, 6.259766, -7.400391, 0, 5.351563, -7.640625, 0,
3.107422, -7.810547, 0, -1.070312, -7.875, 0, -9.070313, 2.25, 0, -8.992188,
2.425781, 0.84375, -11.47583, 2.405457, 0.84375, -11.40625, 2.232422, 0,
-13.298828, 2.263184, 0.84375, -13.132813, 2.109375, 0, -14.421631,
1.877014, 0.84375, -14.203125, 1.775391, 0, -14.804688, 1.125, 0.84375,
-14.570313, 1.125, 0, -8.820313, 2.8125, 1.125, -11.628906, 2.786134, 1.125,
-13.664063, 2.601563, 1.125, -14.902344, 2.100586, 1.125, -15.320313, 1.125,
1.125, -8.648438, 3.199219, 0.84375, -11.781982, 3.166809, 0.84375,
-14.029297, 2.939941, 0.84375, -15.383057, 2.324158, 0.84375, -15.835938,
1.125, 0.84375, -8.570313, 3.375, 0, -11.851563, 3.339844, 0, -14.195313,
3.09375, 0, -15.601563, 2.425781, 0, -16.070313, 1.125, 0, -8.570313, 3.375,
0, -8.648438, 3.199219, -0.84375, -11.781982, 3.166809, -0.84375,
-11.851563, 3.339844, 0, -14.029297, 2.939941, -0.84375, -14.195313,
3.09375, 0, -15.383057, 2.324158, -0.84375, -15.601563, 2.425781, 0,
-15.835938, 1.125, -0.84375, -16.070313, 1.125, 0, -8.820313, 2.8125,
-1.125, -11.628906, 2.786134, -1.125, -13.664063, 2.601563, -1.125,
-14.902344, 2.100586, -1.125, -15.320313, 1.125, -1.125, -8.992188,
2.425781, -0.84375, -11.47583, 2.405457, -0.84375, -13.298828, 2.263184,
-0.84375, -14.421631, 1.877014, -0.84375, -14.804688, 1.125, -0.84375,
-9.070313, 2.25, 0, -11.40625, 2.232422, 0, -13.132813, 2.109375, 0,
-14.203125, 1.775391, 0, -14.570313, 1.125, 0, -14.570313, 1.125, 0,
-14.804688, 1.125, 0.84375, -14.588013, 0.00705, 0.84375, -14.375, 0.105469,
0, -13.90918, -1.275146, 0.84375, -13.757813, -1.125, 0, -12.724976,
-2.540863, 0.84375, -12.671875, -2.355469, 0, -10.992188, -3.609375,
0.84375, -11.070313, -3.375, 0, -15.320313, 1.125, 1.125, -15.056641,
-0.209473, 1.125, -14.242188, -1.605469, 1.125, -12.841797, -2.94873, 1.125,
-10.820313, -4.125, 1.125, -15.835938, 1.125, 0.84375, -15.525269,
-0.425995, 0.84375, -14.575195, -1.935791, 0.84375, -12.958618, -3.356598,
0.84375, -10.648438, -4.640625, 0.84375, -16.070313, 1.125, 0, -15.738281,
-0.524414, 0, -14.726563, -2.085938, 0, -13.011719, -3.541992, 0,
-10.570313, -4.875, 0, -16.070313, 1.125, 0, -15.835938, 1.125, -0.84375,
-15.525269, -0.425995, -0.84375, -15.738281, -0.524414, 0, -14.575195,
-1.935791, -0.84375, -14.726563, -2.085938, 0, -12.958618, -3.356598,
-0.84375, -13.011719, -3.541992, 0, -10.648438, -4.640625, -0.84375,
-10.570313, -4.875, 0, -15.320313, 1.125, -1.125, -15.056641, -0.209473,
-1.125, -14.242188, -1.605469, -1.125, -12.841797, -2.94873, -1.125,
-10.820313, -4.125, -1.125, -14.804688, 1.125, -0.84375, -14.588013,
0.00705, -0.84375, -13.90918, -1.275146, -0.84375, -12.724976, -2.540863,
-0.84375, -10.992188, -3.609375, -0.84375, -14.570313, 1.125, 0, -14.375,
0.105469, 0, -13.757813, -1.125, 0, -12.671875, -2.355469, 0, -11.070313,
-3.375, 0, 7.429688, -0.75, 0, 7.429688, -1.394531, 1.85625, 10.01123,
-0.677124, 1.676074, 9.828125, -0.199219, 0, 11.101563, 0.84668, 1.279688,
10.867188, 1.125, 0, 11.723145, 2.629761, 0.883301, 11.4375, 2.730469, 0,
12.898438, 4.125, 0.703125, 12.429688, 4.125, 0, 7.429688, -2.8125, 2.475,
10.414063, -1.728516, 2.234766, 11.617188, 0.234375, 1.70625, 12.351563,
2.408203, 1.177734, 13.929688, 4.125, 0.9375, 7.429688, -4.230469, 1.85625,
10.816895, -2.779907, 1.676074, 12.132813, -0.37793, 1.279688, 12.97998,
2.186646, 0.883301, 14.960938, 4.125, 0.703125, 7.429688, -4.875, 0, 11,
-3.257813, 0, 12.367188, -0.65625, 0, 13.265625, 2.085938, 0, 15.429688,
4.125, 0, 7.429688, -4.875, 0, 7.429688, -4.230469, -1.85625, 10.816895,
-2.779907, -1.676074, 11, -3.257813, 0, 12.132813, -0.37793, -1.279688,
12.367188, -0.65625, 0, 12.97998, 2.186646, -0.883301, 13.265625, 2.085938,
0, 14.960938, 4.125, -0.703125, 15.429688, 4.125, 0, 7.429688, -2.8125,
-2.475, 10.414063, -1.728516, -2.234766, 11.617188, 0.234375, -1.70625,
12.351563, 2.408203, -1.177734, 13.929688, 4.125, -0.9375, 7.429688,
-1.394531, -1.85625, 10.01123, -0.677124, -1.676074, 11.101563, 0.84668,
-1.279688, 11.723145, 2.629761, -0.883301, 12.898438, 4.125, -0.703125,
7.429688, -0.75, 0, 9.828125, -0.199219, 0, 10.867188, 1.125, 0, 11.4375,
2.730469, 0, 12.429688, 4.125, 0, 12.429688, 4.125, 0, 12.898438, 4.125,
0.703125, 13.291077, 4.346237, 0.65918, 12.789063, 4.335938, 0, 13.525879,
4.422729, 0.5625, 13.054688, 4.40625, 0, 13.532898, 4.350357, 0.46582,
13.132813, 4.335938, 0, 13.242188, 4.125, 0.421875, 12.929688, 4.125, 0,
13.929688, 4.125, 0.9375, 14.395508, 4.368896, 0.878906, 14.5625, 4.458984,
0.75, 14.413086, 4.38208, 0.621094, 13.929688, 4.125, 0.5625, 14.960938,
4.125, 0.703125, 15.499939, 4.391556, 0.65918, 15.599121, 4.495239, 0.5625,
15.293274, 4.413804, 0.46582, 14.617188, 4.125, 0.421875, 15.429688, 4.125,
0, 16.001953, 4.401855, 0, 16.070313, 4.511719, 0, 15.693359, 4.428224, 0,
14.929688, 4.125, 0, 15.429688, 4.125, 0, 14.960938, 4.125, -0.703125,
15.499939, 4.391556, -0.65918, 16.001953, 4.401855, 0, 15.599121, 4.495239,
-0.5625, 16.070313, 4.511719, 0, 15.293274, 4.413804, -0.46582, 15.693359,
4.428224, 0, 14.617188, 4.125, -0.421875, 14.929688, 4.125, 0, 13.929688,
4.125, -0.9375, 14.395508, 4.368896, -0.878906, 14.5625, 4.458984, -0.75,
14.413086, 4.38208, -0.621094, 13.929688, 4.125, -0.5625, 12.898438, 4.125,
-0.703125, 13.291077, 4.346237, -0.65918, 13.525879, 4.422729, -0.5625,
13.532898, 4.350357, -0.46582, 13.242188, 4.125, -0.421875, 12.429688,
4.125, 0, 12.789063, 4.335938, 0, 13.054688, 4.40625, 0, 13.132813,
4.335938, 0, 12.929688, 4.125, 0, 0.501414, 7.628906, 0.670256, 0.632813,
7.628906, 0, -1.070312, 7.875, 0, 0.429278, 7.03125, 0.639395, 0.554688,
7.03125, 0, -0.162029, 6.292969, 0.38696, -0.085937, 6.292969, 0, -0.147812,
5.625, 0.3925, -0.070312, 5.625, 0, 0.140489, 7.628906, 1.210801, -1.070312,
7.875, 0, 0.084844, 7.03125, 1.155156, -0.370879, 6.292969, 0.699434,
-0.360312, 5.625, 0.71, -0.400056, 7.628906, 1.571726, -1.070312, 7.875, 0,
-0.430918, 7.03125, 1.49959, -0.683352, 6.292969, 0.908284, -0.677812,
5.625, 0.9225, -1.070312, 7.628906, 1.703125, -1.070312, 7.875, 0,
-1.070312, 7.03125, 1.625, -1.070312, 6.292969, 0.984375, -1.070312, 5.625,
1, -1.740569, 7.628906, 1.571726, -1.070312, 7.628906, 1.703125, -1.070312,
7.875, 0, -1.709707, 7.03125, 1.49959, -1.070312, 7.03125, 1.625, -1.457273,
6.292969, 0.908284, -1.070312, 6.292969, 0.984375, -1.462812, 5.625, 0.9225,
-1.070312, 5.625, 1, -2.281113, 7.628906, 1.210801, -1.070312, 7.875, 0,
-2.225469, 7.03125, 1.155156, -1.769746, 6.292969, 0.699434, -1.780312,
5.625, 0.71, -2.642038, 7.628906, 0.670256, -1.070312, 7.875, 0, -2.569902,
7.03125, 0.639395, -1.978596, 6.292969, 0.38696, -1.992812, 5.625, 0.3925,
-2.773438, 7.628906, 0, -1.070312, 7.875, 0, -2.695313, 7.03125, 0,
-2.054687, 6.292969, 0, -2.070312, 5.625, 0, -2.642038, 7.628906, -0.670256,
-2.773438, 7.628906, 0, -1.070312, 7.875, 0, -2.569902, 7.03125, -0.639395,
-2.695313, 7.03125, 0, -1.978596, 6.292969, -0.38696, -2.054687, 6.292969,
0, -1.992812, 5.625, -0.3925, -2.070312, 5.625, 0, -2.281113, 7.628906,
-1.210801, -1.070312, 7.875, 0, -2.225469, 7.03125, -1.155156, -1.769746,
6.292969, -0.699434, -1.780312, 5.625, -0.71, -1.740569, 7.628906,
-1.571726, -1.070312, 7.875, 0, -1.709707, 7.03125, -1.49959, -1.457273,
6.292969, -0.908284, -1.462812, 5.625, -0.9225, -1.070312, 7.628906,
-1.703125, -1.070312, 7.875, 0, -1.070312, 7.03125, -1.625, -1.070312,
6.292969, -0.984375, -1.070312, 5.625, -1, -0.400056, 7.628906, -1.571726,
-1.070312, 7.628906, -1.703125, -1.070312, 7.875, 0, -0.430918, 7.03125,
-1.49959, -1.070312, 7.03125, -1.625, -0.683352, 6.292969, -0.908284,
-1.070312, 6.292969, -0.984375, -0.677812, 5.625, -0.9225, -1.070312, 5.625,
-1, 0.140489, 7.628906, -1.210801, -1.070312, 7.875, 0, 0.084844, 7.03125,
-1.155156, -0.370879, 6.292969, -0.699434, -0.360312, 5.625, -0.71,
0.501414, 7.628906, -0.670256, -1.070312, 7.875, 0, 0.429278, 7.03125,
-0.639395, -0.162029, 6.292969, -0.38696, -0.147812, 5.625, -0.3925,
0.632813, 7.628906, 0, -1.070312, 7.875, 0, 0.554688, 7.03125, 0, -0.085937,
6.292969, 0, -0.070312, 5.625, 0, -0.070312, 5.625, 0, -0.147812, 5.625,
0.3925, 1.034141, 5.179688, 0.895391, 1.210938, 5.179688, 0, 2.735, 4.875,
1.619062, 3.054688, 4.875, 0, 4.262891, 4.570313, 2.26914, 4.710938,
4.570313, 0, 4.925938, 4.125, 2.55125, 5.429688, 4.125, 0, -0.360312, 5.625,
0.71, 0.549375, 5.179688, 1.619688, 1.858438, 4.875, 2.92875, 3.034375,
4.570313, 4.104687, 3.544688, 4.125, 4.615, -0.677812, 5.625, 0.9225,
-0.174922, 5.179688, 2.104453, 0.54875, 4.875, 3.805313, 1.198828, 4.570313,
5.333203, 1.480938, 4.125, 5.99625, -1.070312, 5.625, 1, -1.070312,
5.179688, 2.28125, -1.070312, 4.875, 4.125, -1.070312, 4.570313, 5.78125,
-1.070312, 4.125, 6.5, -1.070312, 5.625, 1, -1.462812, 5.625, 0.9225,
-1.965703, 5.179688, 2.104453, -1.070312, 5.179688, 2.28125, -2.689375,
4.875, 3.805313, -1.070312, 4.875, 4.125, -3.339453, 4.570313, 5.333203,
-1.070312, 4.570313, 5.78125, -3.621562, 4.125, 5.99625, -1.070312, 4.125,
6.5, -1.780312, 5.625, 0.71, -2.69, 5.179688, 1.619688, -3.999062, 4.875,
2.92875, -5.174999, 4.570313, 4.104687, -5.685312, 4.125, 4.615, -1.992812,
5.625, 0.3925, -3.174765, 5.179688, 0.895391, -4.875625, 4.875, 1.619062,
-6.403516, 4.570313, 2.26914, -7.066563, 4.125, 2.55125, -2.070312, 5.625,
0, -3.351562, 5.179688, 0, -5.195313, 4.875, 0, -6.851563, 4.570313, 0,
-7.570313, 4.125, 0, -2.070312, 5.625, 0, -1.992812, 5.625, -0.3925,
-3.174765, 5.179688, -0.895391, -3.351562, 5.179688, 0, -4.875625, 4.875,
-1.619062, -5.195313, 4.875, 0, -6.403516, 4.570313, -2.26914, -6.851563,
4.570313, 0, -7.066563, 4.125, -2.55125, -7.570313, 4.125, 0, -1.780312,
5.625, -0.71, -2.69, 5.179688, -1.619688, -3.999062, 4.875, -2.92875,
-5.174999, 4.570313, -4.104687, -5.685312, 4.125, -4.615, -1.462812, 5.625,
-0.9225, -1.965703, 5.179688, -2.104453, -2.689375, 4.875, -3.805313,
-3.339453, 4.570313, -5.333203, -3.621562, 4.125, -5.99625, -1.070312,
5.625, -1, -1.070312, 5.179688, -2.28125, -1.070312, 4.875, -4.125,
-1.070312, 4.570313, -5.78125, -1.070312, 4.125, -6.5, -1.070312, 5.625, -1,
-0.677812, 5.625, -0.9225, -0.174922, 5.179688, -2.104453, -1.070312,
5.179688, -2.28125, 0.54875, 4.875, -3.805313, -1.070312, 4.875, -4.125,
1.198828, 4.570313, -5.333203, -1.070312, 4.570313, -5.78125, 1.480938,
4.125, -5.99625, -1.070312, 4.125, -6.5, -0.360312, 5.625, -0.71, 0.549375,
5.179688, -1.619688, 1.858438, 4.875, -2.92875, 3.034375, 4.570313,
-4.104687, 3.544688, 4.125, -4.615, -0.147812, 5.625, -0.3925, 1.034141,
5.179688, -0.895391, 2.735, 4.875, -1.619062, 4.262891, 4.570313, -2.26914,
4.925938, 4.125, -2.55125, -0.070312, 5.625, 0, 1.210938, 5.179688, 0,
3.054688, 4.875, 0, 4.710938, 4.570313, 0, 5.429688, 4.125, 0,
]),
vertexNormals: new Float32Array([
-0.966742, -0.255752, 0, -0.893014, -0.256345, -0.369882, -0.893437,
0.255996, -0.369102, -0.966824, 0.255443, 0, -0.083877, 0.995843, -0.035507,
-0.092052, 0.995754, 0, 0.629724, 0.73186, 0.260439, 0.68205, 0.731305, 0,
0.803725, 0.49337, 0.332584, 0.870301, 0.492521, 0, -0.683407, -0.256728,
-0.683407, -0.683531, 0.256068, -0.683531, -0.064925, 0.995776, -0.064925,
0.481399, 0.732469, 0.481399, 0.614804, 0.493997, 0.614804, -0.369882,
-0.256345, -0.893014, -0.369102, 0.255996, -0.893437, -0.035507, 0.995843,
-0.083877, 0.260439, 0.73186, 0.629724, 0.332584, 0.493369, 0.803725,
-0.002848, -0.257863, -0.966177, -0.001923, 0.254736, -0.967009, -0.000266,
0.995734, -0.09227, 0.000024, 0.731295, 0.682061, 0, 0.492521, 0.870301,
-0.002848, -0.257863, -0.966177, 0.379058, -0.3593, -0.852771, 0.37711,
0.149085, -0.914091, -0.001923, 0.254736, -0.967009, 0.027502, 0.992081,
-0.122552, -0.000266, 0.995734, -0.09227, -0.26101, 0.726762, 0.635367,
0.000024, 0.731295, 0.682061, -0.332485, 0.492546, 0.804271, 0, 0.492521,
0.870301, 0.663548, -0.41079, -0.625264, 0.712664, 0.073722, -0.697621,
0.099726, 0.987509, -0.121983, -0.48732, 0.723754, 0.488569, -0.615242,
0.492602, 0.615484, 0.880028, -0.332906, -0.338709, 0.917276, 0.167113,
-0.361493, 0.113584, 0.992365, -0.04807, -0.63415, 0.727508, 0.261889,
-0.804126, 0.492634, 0.332705, 0.96669, -0.255738, 0.010454, 0.967442,
0.252962, 0.008103, 0.093436, 0.995624, 0.001281, -0.682167, 0.731196,
-0.000343, -0.870322, 0.492483, -0.000054, 0.96669, -0.255738, 0.010454,
0.893014, -0.256345, 0.369882, 0.893437, 0.255996, 0.369102, 0.967442,
0.252962, 0.008103, 0.083877, 0.995843, 0.035507, 0.093436, 0.995624,
0.001281, -0.629724, 0.73186, -0.260439, -0.682167, 0.731196, -0.000343,
-0.803725, 0.49337, -0.332584, -0.870322, 0.492483, -0.000054, 0.683407,
-0.256728, 0.683407, 0.683531, 0.256068, 0.683531, 0.064925, 0.995776,
0.064925, -0.481399, 0.732469, -0.481399, -0.614804, 0.493997, -0.614804,
0.369882, -0.256345, 0.893014, 0.369102, 0.255996, 0.893437, 0.035507,
0.995843, 0.083877, -0.260439, 0.73186, -0.629724, -0.332584, 0.493369,
-0.803725, 0, -0.255752, 0.966742, 0, 0.255443, 0.966824, 0, 0.995754,
0.092052, 0, 0.731305, -0.68205, 0, 0.492521, -0.870301, 0, -0.255752,
0.966742, -0.369882, -0.256345, 0.893014, -0.369102, 0.255996, 0.893437, 0,
0.255443, 0.966824, -0.035507, 0.995843, 0.083877, 0, 0.995754, 0.092052,
0.260439, 0.73186, -0.629724, 0, 0.731305, -0.68205, 0.332584, 0.49337,
-0.803725, 0, 0.492521, -0.870301, -0.683407, -0.256728, 0.683407,
-0.683531, 0.256068, 0.683531, -0.064925, 0.995776, 0.064925, 0.481399,
0.732469, -0.481399, 0.614804, 0.493997, -0.614804, -0.893014, -0.256345,
0.369882, -0.893437, 0.255996, 0.369102, -0.083877, 0.995843, 0.035507,
0.629724, 0.73186, -0.260439, 0.803725, 0.493369, -0.332584, -0.966742,
-0.255752, 0, -0.966824, 0.255443, 0, -0.092052, 0.995754, 0, 0.68205,
0.731305, 0, 0.870301, 0.492521, 0, 0.870301, 0.492521, 0, 0.803725,
0.49337, 0.332584, 0.845438, 0.403546, 0.349835, 0.915321, 0.402725, 0,
0.869996, 0.336859, 0.360047, 0.941808, 0.336151, 0, 0.904193, 0.205791,
0.37428, 0.97869, 0.205342, 0, 0.921879, -0.06637, 0.381752, 0.997804,
-0.06624, 0, 0.614804, 0.493997, 0.614804, 0.646802, 0.404096, 0.646802,
0.665655, 0.337351, 0.665655, 0.691923, 0.20612, 0.691923, 0.705543,
-0.06648, 0.705542, 0.332584, 0.493369, 0.803725, 0.349835, 0.403546,
0.845438, 0.360047, 0.336859, 0.869996, 0.37428, 0.205791, 0.904193,
0.381752, -0.066369, 0.921879, 0, 0.492521, 0.870301, 0, 0.402725, 0.915321,
0, 0.336151, 0.941808, 0, 0.205342, 0.97869, 0, -0.06624, 0.997804, 0,
0.492521, 0.870301, -0.332485, 0.492546, 0.804271, -0.349835, 0.403546,
0.845438, 0, 0.402725, 0.915321, -0.360047, 0.336859, 0.869996, 0, 0.336151,
0.941808, -0.37428, 0.205791, 0.904193, 0, 0.205342, 0.97869, -0.381752,
-0.06637, 0.921879, 0, -0.06624, 0.997804, -0.615242, 0.492602, 0.615484,
-0.646802, 0.404096, 0.646802, -0.665655, 0.337351, 0.665655, -0.691923,
0.20612, 0.691923, -0.705542, -0.06648, 0.705543, -0.804126, 0.492634,
0.332705, -0.845438, 0.403546, 0.349835, -0.869996, 0.336859, 0.360047,
-0.904193, 0.205791, 0.37428, -0.921879, -0.066369, 0.381752, -0.870322,
0.492483, -0.000054, -0.915321, 0.402725, 0, -0.941808, 0.336151, 0,
-0.97869, 0.205342, 0, -0.997804, -0.06624, 0, -0.870322, 0.492483,
-0.000054, -0.803725, 0.49337, -0.332584, -0.845438, 0.403546, -0.349835,
-0.915321, 0.402725, 0, -0.869996, 0.336859, -0.360047, -0.941808, 0.336151,
0, -0.904193, 0.205791, -0.37428, -0.97869, 0.205342, 0, -0.921879,
-0.06637, -0.381752, -0.997804, -0.06624, 0, -0.614804, 0.493997, -0.614804,
-0.646802, 0.404096, -0.646802, -0.665655, 0.337351, -0.665655, -0.691923,
0.20612, -0.691923, -0.705543, -0.06648, -0.705542, -0.332584, 0.493369,
-0.803725, -0.349835, 0.403546, -0.845438, -0.360047, 0.336859, -0.869996,
-0.37428, 0.205791, -0.904193, -0.381752, -0.066369, -0.921879, 0, 0.492521,
-0.870301, 0, 0.402725, -0.915321, 0, 0.336151, -0.941808, 0, 0.205342,
-0.97869, 0, -0.06624, -0.997804, 0, 0.492521, -0.870301, 0.332584, 0.49337,
-0.803725, 0.349835, 0.403546, -0.845438, 0, 0.402725, -0.915321, 0.360047,
0.336859, -0.869996, 0, 0.336151, -0.941808, 0.37428, 0.205791, -0.904193,
0, 0.205342, -0.97869, 0.381752, -0.06637, -0.921879, 0, -0.06624,
-0.997804, 0.614804, 0.493997, -0.614804, 0.646802, 0.404096, -0.646802,
0.665655, 0.337351, -0.665655, 0.691923, 0.20612, -0.691923, 0.705542,
-0.06648, -0.705543, 0.803725, 0.493369, -0.332584, 0.845438, 0.403546,
-0.349835, 0.869996, 0.336859, -0.360047, 0.904193, 0.205791, -0.37428,
0.921879, -0.066369, -0.381752, 0.870301, 0.492521, 0, 0.915321, 0.402725,
0, 0.941808, 0.336151, 0, 0.97869, 0.205342, 0, 0.997804, -0.06624, 0,
0.997804, -0.06624, 0, 0.921879, -0.06637, 0.381752, 0.831437, -0.43618,
0.344179, 0.900182, -0.435513, 0, 0.673512, -0.684666, 0.278594, 0.729611,
-0.683863, 0, 0.640399, -0.720924, 0.264874, 0.693951, -0.720022, 0,
0.732949, -0.608995, 0.303167, 0.79395, -0.607983, 0, 0.705543, -0.06648,
0.705542, 0.636092, -0.436778, 0.636092, 0.514965, -0.68529, 0.514965,
0.489651, -0.721446, 0.489651, 0.560555, -0.609554, 0.560555, 0.381752,
-0.066369, 0.921879, 0.344179, -0.43618, 0.831437, 0.278595, -0.684666,
0.673512, 0.264874, -0.720924, 0.640399, 0.303167, -0.608995, 0.732949, 0,
-0.06624, 0.997804, 0, -0.435513, 0.900182, 0, -0.683863, 0.729611, 0,
-0.720022, 0.693951, 0, -0.607983, 0.79395, 0, -0.06624, 0.997804,
-0.381752, -0.06637, 0.921879, -0.344179, -0.43618, 0.831437, 0, -0.435513,
0.900182, -0.278594, -0.684666, 0.673512, 0, -0.683863, 0.729611, -0.264874,
-0.720924, 0.640399, 0, -0.720022, 0.693951, -0.303167, -0.608995, 0.732949,
0, -0.607983, 0.79395, -0.705542, -0.06648, 0.705543, -0.636092, -0.436778,
0.636092, -0.514965, -0.68529, 0.514965, -0.489651, -0.721446, 0.489651,
-0.560555, -0.609554, 0.560555, -0.921879, -0.066369, 0.381752, -0.831437,
-0.43618, 0.344179, -0.673512, -0.684666, 0.278595, -0.640399, -0.720924,
0.264874, -0.732949, -0.608995, 0.303167, -0.997804, -0.06624, 0, -0.900182,
-0.435513, 0, -0.729611, -0.683863, 0, -0.693951, -0.720022, 0, -0.79395,
-0.607983, 0, -0.997804, -0.06624, 0, -0.921879, -0.06637, -0.381752,
-0.831437, -0.43618, -0.344179, -0.900182, -0.435513, 0, -0.673512,
-0.684666, -0.278594, -0.729611, -0.683863, 0, -0.640399, -0.720924,
-0.264874, -0.693951, -0.720022, 0, -0.732949, -0.608995, -0.303167,
-0.79395, -0.607983, 0, -0.705543, -0.06648, -0.705542, -0.636092,
-0.436778, -0.636092, -0.514965, -0.68529, -0.514965, -0.489651, -0.721446,
-0.489651, -0.560555, -0.609554, -0.560555, -0.381752, -0.066369, -0.921879,
-0.344179, -0.43618, -0.831437, -0.278595, -0.684666, -0.673512, -0.264874,
-0.720924, -0.640399, -0.303167, -0.608995, -0.732949, 0, -0.06624,
-0.997804, 0, -0.435513, -0.900182, 0, -0.683863, -0.729611, 0, -0.720022,
-0.693951, 0, -0.607983, -0.79395, 0, -0.06624, -0.997804, 0.381752,
-0.06637, -0.921879, 0.344179, -0.43618, -0.831437, 0, -0.435513, -0.900182,
0.278594, -0.684666, -0.673512, 0, -0.683863, -0.729611, 0.264874,
-0.720924, -0.640399, 0, -0.720022, -0.693951, 0.303167, -0.608995,
-0.732949, 0, -0.607983, -0.79395, 0.705542, -0.06648, -0.705543, 0.636092,
-0.436778, -0.636092, 0.514965, -0.68529, -0.514965, 0.489651, -0.721446,
-0.489651, 0.560555, -0.609554, -0.560555, 0.921879, -0.066369, -0.381752,
0.831437, -0.43618, -0.344179, 0.673512, -0.684666, -0.278595, 0.640399,
-0.720924, -0.264874, 0.732949, -0.608995, -0.303167, 0.997804, -0.06624, 0,
0.900182, -0.435513, 0, 0.729611, -0.683863, 0, 0.693951, -0.720022, 0,
0.79395, -0.607983, 0, 0.79395, -0.607983, 0, 0.732949, -0.608995, 0.303167,
0.57623, -0.781801, 0.238217, 0.62386, -0.781536, 0, 0.163628, -0.984208,
0.067527, 0.177291, -0.984159, 0, 0.045422, -0.998792, 0.018736, 0.049207,
-0.998789, 0, 0, -1, 0, 0.560555, -0.609554, 0.560555, 0.440416, -0.782348,
0.440416, 0.124903, -0.984276, 0.124903, 0.034662, -0.998798, 0.034662, 0,
-1, 0, 0.303167, -0.608995, 0.732949, 0.238217, -0.781801, 0.57623,
0.067527, -0.984208, 0.163628, 0.018736, -0.998792, 0.045422, 0, -1, 0, 0,
-0.607983, 0.79395, 0, -0.781536, 0.62386, 0, -0.984159, 0.177291, 0,
-0.998789, 0.049207, 0, -1, 0, 0, -0.607983, 0.79395, -0.303167, -0.608995,
0.732949, -0.238217, -0.781801, 0.57623, 0, -0.781536, 0.62386, -0.067527,
-0.984208, 0.163628, 0, -0.984159, 0.177291, -0.018736, -0.998792, 0.045422,
0, -0.998789, 0.049207, 0, -1, 0, -0.560555, -0.609554, 0.560555, -0.440416,
-0.782348, 0.440416, -0.124903, -0.984276, 0.124903, -0.034662, -0.998798,
0.034662, 0, -1, 0, -0.732949, -0.608995, 0.303167, -0.57623, -0.781801,
0.238217, -0.163628, -0.984208, 0.067527, -0.045422, -0.998792, 0.018736, 0,
-1, 0, -0.79395, -0.607983, 0, -0.62386, -0.781536, 0, -0.177291, -0.984159,
0, -0.049207, -0.998789, 0, 0, -1, 0, -0.79395, -0.607983, 0, -0.732949,
-0.608995, -0.303167, -0.57623, -0.781801, -0.238217, -0.62386, -0.781536,
0, -0.163628, -0.984208, -0.067527, -0.177291, -0.984159, 0, -0.045422,
-0.998792, -0.018736, -0.049207, -0.998789, 0, 0, -1, 0, -0.560555,
-0.609554, -0.560555, -0.440416, -0.782348, -0.440416, -0.124903, -0.984276,
-0.124903, -0.034662, -0.998798, -0.034662, 0, -1, 0, -0.303167, -0.608995,
-0.732949, -0.238217, -0.781801, -0.57623, -0.067527, -0.984208, -0.163628,
-0.018736, -0.998792, -0.045422, 0, -1, 0, 0, -0.607983, -0.79395, 0,
-0.781536, -0.62386, 0, -0.984159, -0.177291, 0, -0.998789, -0.049207, 0,
-1, 0, 0, -0.607983, -0.79395, 0.303167, -0.608995, -0.732949, 0.238217,
-0.781801, -0.57623, 0, -0.781536, -0.62386, 0.067527, -0.984208, -0.163628,
0, -0.984159, -0.177291, 0.018736, -0.998792, -0.045422, 0, -0.998789,
-0.049207, 0, -1, 0, 0.560555, -0.609554, -0.560555, 0.440416, -0.782348,
-0.440416, 0.124903, -0.984276, -0.124903, 0.034662, -0.998798, -0.034662,
0, -1, 0, 0.732949, -0.608995, -0.303167, 0.57623, -0.781801, -0.238217,
0.163628, -0.984208, -0.067527, 0.045422, -0.998792, -0.018736, 0, -1, 0,
0.79395, -0.607983, 0, 0.62386, -0.781536, 0, 0.177291, -0.984159, 0,
0.049207, -0.998789, 0, 0, -1, 0, 0.007786, -0.99997, -0.000216, 0.007039,
-0.812495, 0.582926, 0.036127, -0.837257, 0.545614, 0.039138, -0.999233,
-0.000989, 0.161846, -0.810421, 0.563048, 0.179512, -0.983746, -0.004369,
0.482365, -0.595148, 0.642746, 0.612299, -0.790557, -0.01046, 0.73872,
-0.114594, 0.664199, 0.986152, -0.165708, -0.00667, -0.001909, 0.162121,
0.986769, 0.002762, 0.017107, 0.99985, 0.010533, 0.073398, 0.997247,
-0.066041, 0.13007, 0.989303, -0.094427, 0.016594, 0.995393, -0.009203,
0.871509, 0.490293, -0.048606, 0.840609, 0.539457, -0.223298, 0.80288,
0.552739, -0.596365, 0.559971, 0.575135, -0.803337, 0.068236, 0.591603,
-0.010561, 0.999944, 0.000103, -0.058798, 0.99827, 0.00071, -0.28071,
0.959787, 0.003269, -0.749723, 0.661738, 0.004268, -0.997351, 0.072714,
0.002059, -0.010561, 0.999944, 0.000103, -0.008792, 0.871493, -0.49033,
-0.046494, 0.841178, -0.538756, -0.058798, 0.99827, 0.00071, -0.217909,
0.806807, -0.549161, -0.28071, 0.959787, 0.003269, -0.597291, 0.560026,
-0.574121, -0.749723, 0.661738, 0.004268, -0.804, 0.062913, -0.591292,
-0.997351, 0.072714, 0.002059, -0.001806, 0.161691, -0.98684, 0.002031,
0.014555, -0.999892, 0.009215, 0.060069, -0.998152, -0.059334, 0.113865,
-0.991723, -0.086899, 0.01229, -0.996141, 0.006418, -0.812379, -0.583095,
0.033783, -0.837512, -0.545373, 0.157113, -0.811947, -0.56219, 0.484406,
-0.589366, -0.646528, 0.73887, -0.10132, -0.666187, 0.007786, -0.99997,
-0.000216, 0.039138, -0.999233, -0.000989, 0.179512, -0.983746, -0.004369,
0.612299, -0.790557, -0.01046, 0.986152, -0.165708, -0.00667, 0.986152,
-0.165708, -0.00667, 0.73872, -0.114594, 0.664199, 0.725608, 0.259351,
0.637361, 0.946512, 0.32265, -0.003357, 0.645945, 0.461988, 0.607719,
0.82583, 0.56387, -0.007452, 0.531615, 0.63666, 0.558614, 0.650011,
0.759893, -0.006937, 0.424964, 0.681717, 0.59554, 0.532429, 0.846459,
-0.005245, -0.094427, 0.016594, 0.995393, -0.049562, -0.019755, 0.998576,
-0.037816, -0.035624, 0.99865, -0.037914, -0.036512, 0.998614, -0.168854,
-0.297945, 0.93953, -0.803337, 0.068236, 0.591603, -0.742342, -0.299166,
0.599523, -0.619602, -0.529406, 0.579502, -0.483708, -0.68576, 0.543837,
-0.445293, -0.794355, 0.413177, -0.997351, 0.072714, 0.002059, -0.926513,
-0.376258, 0.001996, -0.75392, -0.656952, 0.004317, -0.566224, -0.824244,
0.003461, -0.481804, -0.876277, 0.00185, -0.997351, 0.072714, 0.002059,
-0.804, 0.062913, -0.591292, -0.744675, -0.294425, -0.598977, -0.926513,
-0.376258, 0.001996, -0.621949, -0.528114, -0.578165, -0.75392, -0.656952,
0.004317, -0.481171, -0.68834, -0.542828, -0.566224, -0.824244, 0.003461,
-0.438055, -0.797035, -0.415744, -0.481804, -0.876277, 0.00185, -0.086899,
0.01229, -0.996141, -0.044337, -0.017056, -0.998871, -0.026176, -0.028166,
-0.99926, -0.025294, -0.028332, -0.999278, -0.157482, -0.289392, -0.944167,
0.73887, -0.10132, -0.666187, 0.728244, 0.25241, -0.637142, 0.647055,
0.459725, -0.608254, 0.522994, 0.640657, -0.56217, 0.409978, 0.682857,
-0.604669, 0.986152, -0.165708, -0.00667, 0.946512, 0.32265, -0.003357,
0.82583, 0.56387, -0.007452, 0.650011, 0.759893, -0.006937, 0.532429,
0.846459, -0.005245, -0.230787, 0.972982, -0.006523, -0.152877, 0.687211,
0.71019, -0.316721, 0.63775, 0.702113, -0.548936, 0.835863, -0.001511,
-0.601067, 0.471452, 0.64533, -0.875671, 0.482806, 0.009893, -0.635889,
0.44609, 0.629801, -0.877554, 0.479097, 0.019092, -0.435746, 0.601008,
0.670011, -0.69619, 0.717439, 0.024497, 0.111113, -0.08507, 0.99016,
0.22331, 0.00654, 0.974726, 0.190097, 0.154964, 0.969458, 0.005271,
0.189482, 0.98187, -0.011752, 0.246688, 0.969024, 0.343906, -0.722796,
0.599412, 0.572489, -0.567656, 0.591627, 0.787436, -0.256459, 0.560512,
0.647097, -0.306374, 0.698141, 0.427528, -0.499343, 0.753576, 0.410926,
-0.911668, 0.001284, 0.67152, -0.740986, -0.000899, 0.922026, -0.38706,
-0.007253, 0.84691, -0.531556, -0.013854, 0.535924, -0.844201, -0.010505,
0.410926, -0.911668, 0.001284, 0.341188, -0.722823, -0.600931, 0.578664,
-0.561139, -0.591838, 0.67152, -0.740986, -0.000899, 0.784869, -0.25102,
-0.566542, 0.922026, -0.38706, -0.007253, 0.642681, -0.302257, -0.70399,
0.84691, -0.531556, -0.013854, 0.418589, -0.500042, -0.758117, 0.535924,
-0.844201, -0.010505, 0.115806, -0.079139, -0.990114, 0.232811, 0.012565,
-0.972441, 0.206662, 0.153601, -0.96628, 0.0245, 0.161443, -0.986578,
0.003382, 0.211115, -0.977455, -0.134912, 0.687491, -0.713551, -0.31954,
0.633073, -0.705063, -0.603902, 0.461442, -0.649903, -0.631815, 0.437169,
-0.640072, -0.424306, 0.612706, -0.66675, -0.230787, 0.972982, -0.006523,
-0.548936, 0.835863, -0.001511, -0.875671, 0.482806, 0.009893, -0.877554,
0.479097, 0.019092, -0.69619, 0.717439, 0.024497, -0.69619, 0.717439,
0.024497, -0.435746, 0.601008, 0.670011, -0.259858, 0.791937, 0.552548,
-0.425801, 0.904753, 0.010805, 0.009539, 0.99972, -0.021674, 0.022046,
0.999756, 0.001623, 0.410157, 0.332912, -0.849082, 0.999598, 0.025875,
0.011556, 0.541523, -0.548619, -0.637001, 0.709587, -0.704552, 0.009672,
-0.011752, 0.246688, 0.969024, 0.046311, 0.455223, 0.889172, -0.010688,
0.988794, 0.1489, -0.044376, 0.682946, -0.72912, 0.122824, 0.009233,
-0.992385, 0.427528, -0.499343, 0.753576, 0.481839, -0.18044, 0.85748,
0.455272, 0.736752, 0.499925, -0.220542, 0.907193, -0.358277, -0.235919,
0.65725, -0.715797, 0.535924, -0.844201, -0.010505, 0.728094, -0.6853,
-0.015585, 0.888738, 0.458112, -0.016679, -0.260098, 0.965582, 0.0008,
-0.371611, 0.928378, -0.004418, 0.535924, -0.844201, -0.010505, 0.418589,
-0.500042, -0.758117, 0.480165, -0.178362, -0.858853, 0.728094, -0.6853,
-0.015585, 0.488102, 0.716802, -0.497947, 0.888738, 0.458112, -0.016679,
-0.222004, 0.905399, 0.361892, -0.260098, 0.965582, 0.0008, -0.235405,
0.66318, 0.710477, -0.371611, 0.928378, -0.004418, 0.003382, 0.211115,
-0.977455, 0.05872, 0.437702, -0.8972, 0.001326, 0.986459, -0.164002,
-0.04419, 0.681675, 0.730319, 0.138801, -0.034188, 0.98973, -0.424306,
0.612706, -0.66675, -0.25889, 0.797206, -0.54538, 0.01227, 0.999739,
0.019287, 0.398632, 0.35489, 0.845663, 0.537564, -0.581398, 0.610738,
-0.69619, 0.717439, 0.024497, -0.425801, 0.904753, 0.010805, 0.022046,
0.999756, 0.001623, 0.999598, 0.025875, 0.011556, 0.709587, -0.704552,
0.009672, 0.76264, 0.565035, 0.314825, 0.82454, 0.565804, 0.000017, 0, 1, 0,
0.847982, -0.397998, 0.350034, 0.917701, -0.397272, 0.000034, 0.864141,
-0.355261, 0.356441, 0.935269, -0.353939, 0.000113, 0.720992, 0.625625,
0.297933, 0.780712, 0.62489, 0.000075, 0.583357, 0.565165, 0.583338, 0, 1,
0, 0.648485, -0.398726, 0.648448, 0.660872, -0.355894, 0.660748, 0.551862,
0.62529, 0.55178, 0.314824, 0.565051, 0.762629, 0, 1, 0, 0.350045,
-0.397976, 0.847988, 0.356474, -0.355199, 0.864153, 0.297983, 0.625515,
0.721067, -0.000017, 0.565804, 0.82454, 0, 1, 0, -0.000034, -0.397272,
0.917701, -0.000113, -0.353939, 0.935269, -0.000075, 0.62489, 0.780712,
-0.314825, 0.565035, 0.76264, -0.000017, 0.565804, 0.82454, 0, 1, 0,
-0.350034, -0.397998, 0.847982, -0.000034, -0.397272, 0.917701, -0.356441,
-0.355261, 0.864141, -0.000113, -0.353939, 0.935269, -0.297933, 0.625625,
0.720992, -0.000075, 0.62489, 0.780712, -0.583338, 0.565165, 0.583357, 0, 1,
0, -0.648448, -0.398726, 0.648485, -0.660748, -0.355894, 0.660872, -0.55178,
0.62529, 0.551862, -0.762629, 0.565051, 0.314824, 0, 1, 0, -0.847988,
-0.397976, 0.350045, -0.864153, -0.355199, 0.356474, -0.721067, 0.625515,
0.297983, -0.82454, 0.565804, -0.000017, 0, 1, 0, -0.917701, -0.397272,
-0.000034, -0.935269, -0.353939, -0.000113, -0.780712, 0.62489, -0.000075,
-0.76264, 0.565035, -0.314825, -0.82454, 0.565804, -0.000017, 0, 1, 0,
-0.847982, -0.397998, -0.350034, -0.917701, -0.397272, -0.000034, -0.864141,
-0.355261, -0.356441, -0.935269, -0.353939, -0.000113, -0.720992, 0.625625,
-0.297933, -0.780712, 0.62489, -0.000075, -0.583357, 0.565165, -0.583338, 0,
1, 0, -0.648485, -0.398726, -0.648448, -0.660872, -0.355894, -0.660748,
-0.551862, 0.62529, -0.55178, -0.314824, 0.565051, -0.762629, 0, 1, 0,
-0.350045, -0.397976, -0.847988, -0.356474, -0.355199, -0.864153, -0.297983,
0.625515, -0.721067, 0.000017, 0.565804, -0.82454, 0, 1, 0, 0.000034,
-0.397272, -0.917701, 0.000113, -0.353939, -0.935269, 0.000075, 0.62489,
-0.780712, 0.314825, 0.565035, -0.76264, 0.000017, 0.565804, -0.82454, 0, 1,
0, 0.350034, -0.397998, -0.847982, 0.000034, -0.397272, -0.917701, 0.356441,
-0.355261, -0.864141, 0.000113, -0.353939, -0.935269, 0.297933, 0.625625,
-0.720992, 0.000075, 0.62489, -0.780712, 0.583338, 0.565165, -0.583357, 0,
1, 0, 0.648448, -0.398726, -0.648485, 0.660748, -0.355894, -0.660872,
0.55178, 0.62529, -0.551862, 0.762629, 0.565051, -0.314824, 0, 1, 0,
0.847988, -0.397976, -0.350045, 0.864153, -0.355199, -0.356474, 0.721067,
0.625515, -0.297983, 0.82454, 0.565804, 0.000017, 0, 1, 0, 0.917701,
-0.397272, 0.000034, 0.935269, -0.353939, 0.000113, 0.780712, 0.62489,
0.000075, 0.780712, 0.62489, 0.000075, 0.720992, 0.625625, 0.297933,
0.217978, 0.971775, 0.090216, 0.236583, 0.971611, 0, 0.159589, 0.984977,
0.065961, 0.173084, 0.984907, 0, 0.350498, 0.925311, 0.14474, 0.379703,
0.925108, 0, 0.48559, 0.850653, 0.201474, 0.526673, 0.850068, 0, 0.551862,
0.62529, 0.55178, 0.166631, 0.971838, 0.166631, 0.121908, 0.985026,
0.121908, 0.267668, 0.925585, 0.267668, 0.371315, 0.851029, 0.371315,
0.297983, 0.625515, 0.721067, 0.090216, 0.971775, 0.217978, 0.065961,
0.984977, 0.159589, 0.14474, 0.925311, 0.350498, 0.201475, 0.850653,
0.48559, -0.000075, 0.62489, 0.780712, 0, 0.971611, 0.236583, 0, 0.984907,
0.173084, 0, 0.925108, 0.379703, 0, 0.850068, 0.526673, -0.000075, 0.62489,
0.780712, -0.297933, 0.625625, 0.720992, -0.090216, 0.971775, 0.217978, 0,
0.971611, 0.236583, -0.065961, 0.984977, 0.159589, 0, 0.984907, 0.173084,
-0.14474, 0.925311, 0.350498, 0, 0.925108, 0.379703, -0.201474, 0.850653,
0.48559, 0, 0.850068, 0.526673, -0.55178, 0.62529, 0.551862, -0.166631,
0.971838, 0.166631, -0.121908, 0.985026, 0.121908, -0.267668, 0.925585,
0.267668, -0.371315, 0.851029, 0.371315, -0.721067, 0.625515, 0.297983,
-0.217978, 0.971775, 0.090216, -0.159589, 0.984977, 0.065961, -0.350498,
0.925311, 0.14474, -0.48559, 0.850653, 0.201475, -0.780712, 0.62489,
-0.000075, -0.236583, 0.971611, 0, -0.173084, 0.984907, 0, -0.379703,
0.925108, 0, -0.526673, 0.850068, 0, -0.780712, 0.62489, -0.000075,
-0.720992, 0.625625, -0.297933, -0.217978, 0.971775, -0.090216, -0.236583,
0.971611, 0, -0.159589, 0.984977, -0.065961, -0.173084, 0.984907, 0,
-0.350498, 0.925311, -0.14474, -0.379703, 0.925108, 0, -0.48559, 0.850653,
-0.201474, -0.526673, 0.850068, 0, -0.551862, 0.62529, -0.55178, -0.166631,
0.971838, -0.166631, -0.121908, 0.985026, -0.121908, -0.267668, 0.925585,
-0.267668, -0.371315, 0.851029, -0.371315, -0.297983, 0.625515, -0.721067,
-0.090216, 0.971775, -0.217978, -0.065961, 0.984977, -0.159589, -0.14474,
0.925311, -0.350498, -0.201475, 0.850653, -0.48559, 0.000075, 0.62489,
-0.780712, 0, 0.971611, -0.236583, 0, 0.984907, -0.173084, 0, 0.925108,
-0.379703, 0, 0.850068, -0.526673, 0.000075, 0.62489, -0.780712, 0.297933,
0.625625, -0.720992, 0.090216, 0.971775, -0.217978, 0, 0.971611, -0.236583,
0.065961, 0.984977, -0.159589, 0, 0.984907, -0.173084, 0.14474, 0.925311,
-0.350498, 0, 0.925108, -0.379703, 0.201474, 0.850653, -0.48559, 0,
0.850068, -0.526673, 0.55178, 0.62529, -0.551862, 0.166631, 0.971838,
-0.166631, 0.121908, 0.985026, -0.121908, 0.267668, 0.925585, -0.267668,
0.371315, 0.851029, -0.371315, 0.721067, 0.625515, -0.297983, 0.217978,
0.971775, -0.090216, 0.159589, 0.984977, -0.065961, 0.350498, 0.925311,
-0.14474, 0.48559, 0.850653, -0.201475, 0.780712, 0.62489, 0.000075,
0.236583, 0.971611, 0, 0.173084, 0.984907, 0, 0.379703, 0.925108, 0,
0.526673, 0.850068, 0,
]),
vertexTextureCoords: new Float32Array([
2, 2, 1.75, 2, 1.75, 1.975, 2, 1.975, 1.75, 1.95, 2, 1.95, 1.75, 1.925, 2,
1.925, 1.75, 1.9, 2, 1.9, 1.5, 2, 1.5, 1.975, 1.5, 1.95, 1.5, 1.925, 1.5,
1.9, 1.25, 2, 1.25, 1.975, 1.25, 1.95, 1.25, 1.925, 1.25, 1.9, 1, 2, 1,
1.975, 1, 1.95, 1, 1.925, 1, 1.9, 1, 2, 0.75, 2, 0.75, 1.975, 1, 1.975,
0.75, 1.95, 1, 1.95, 0.75, 1.925, 1, 1.925, 0.75, 1.9, 1, 1.9, 0.5, 2, 0.5,
1.975, 0.5, 1.95, 0.5, 1.925, 0.5, 1.9, 0.25, 2, 0.25, 1.975, 0.25, 1.95,
0.25, 1.925, 0.25, 1.9, 0, 2, 0, 1.975, 0, 1.95, 0, 1.925, 0, 1.9, 2, 2,
1.75, 2, 1.75, 1.975, 2, 1.975, 1.75, 1.95, 2, 1.95, 1.75, 1.925, 2, 1.925,
1.75, 1.9, 2, 1.9, 1.5, 2, 1.5, 1.975, 1.5, 1.95, 1.5, 1.925, 1.5, 1.9,
1.25, 2, 1.25, 1.975, 1.25, 1.95, 1.25, 1.925, 1.25, 1.9, 1, 2, 1, 1.975, 1,
1.95, 1, 1.925, 1, 1.9, 1, 2, 0.75, 2, 0.75, 1.975, 1, 1.975, 0.75, 1.95, 1,
1.95, 0.75, 1.925, 1, 1.925, 0.75, 1.9, 1, 1.9, 0.5, 2, 0.5, 1.975, 0.5,
1.95, 0.5, 1.925, 0.5, 1.9, 0.25, 2, 0.25, 1.975, 0.25, 1.95, 0.25, 1.925,
0.25, 1.9, 0, 2, 0, 1.975, 0, 1.95, 0, 1.925, 0, 1.9, 2, 1.9, 1.75, 1.9,
1.75, 1.675, 2, 1.675, 1.75, 1.45, 2, 1.45, 1.75, 1.225, 2, 1.225, 1.75, 1,
2, 1, 1.5, 1.9, 1.5, 1.675, 1.5, 1.45, 1.5, 1.225, 1.5, 1, 1.25, 1.9, 1.25,
1.675, 1.25, 1.45, 1.25, 1.225, 1.25, 1, 1, 1.9, 1, 1.675, 1, 1.45, 1,
1.225, 1, 1, 1, 1.9, 0.75, 1.9, 0.75, 1.675, 1, 1.675, 0.75, 1.45, 1, 1.45,
0.75, 1.225, 1, 1.225, 0.75, 1, 1, 1, 0.5, 1.9, 0.5, 1.675, 0.5, 1.45, 0.5,
1.225, 0.5, 1, 0.25, 1.9, 0.25, 1.675, 0.25, 1.45, 0.25, 1.225, 0.25, 1, 0,
1.9, 0, 1.675, 0, 1.45, 0, 1.225, 0, 1, 2, 1.9, 1.75, 1.9, 1.75, 1.675, 2,
1.675, 1.75, 1.45, 2, 1.45, 1.75, 1.225, 2, 1.225, 1.75, 1, 2, 1, 1.5, 1.9,
1.5, 1.675, 1.5, 1.45, 1.5, 1.225, 1.5, 1, 1.25, 1.9, 1.25, 1.675, 1.25,
1.45, 1.25, 1.225, 1.25, 1, 1, 1.9, 1, 1.675, 1, 1.45, 1, 1.225, 1, 1, 1,
1.9, 0.75, 1.9, 0.75, 1.675, 1, 1.675, 0.75, 1.45, 1, 1.45, 0.75, 1.225, 1,
1.225, 0.75, 1, 1, 1, 0.5, 1.9, 0.5, 1.675, 0.5, 1.45, 0.5, 1.225, 0.5, 1,
0.25, 1.9, 0.25, 1.675, 0.25, 1.45, 0.25, 1.225, 0.25, 1, 0, 1.9, 0, 1.675,
0, 1.45, 0, 1.225, 0, 1, 2, 1, 1.75, 1, 1.75, 0.85, 2, 0.85, 1.75, 0.7, 2,
0.7, 1.75, 0.55, 2, 0.55, 1.75, 0.4, 2, 0.4, 1.5, 1, 1.5, 0.85, 1.5, 0.7,
1.5, 0.55, 1.5, 0.4, 1.25, 1, 1.25, 0.85, 1.25, 0.7, 1.25, 0.55, 1.25, 0.4,
1, 1, 1, 0.85, 1, 0.7, 1, 0.55, 1, 0.4, 1, 1, 0.75, 1, 0.75, 0.85, 1, 0.85,
0.75, 0.7, 1, 0.7, 0.75, 0.55, 1, 0.55, 0.75, 0.4, 1, 0.4, 0.5, 1, 0.5,
0.85, 0.5, 0.7, 0.5, 0.55, 0.5, 0.4, 0.25, 1, 0.25, 0.85, 0.25, 0.7, 0.25,
0.55, 0.25, 0.4, 0, 1, 0, 0.85, 0, 0.7, 0, 0.55, 0, 0.4, 2, 1, 1.75, 1,
1.75, 0.85, 2, 0.85, 1.75, 0.7, 2, 0.7, 1.75, 0.55, 2, 0.55, 1.75, 0.4, 2,
0.4, 1.5, 1, 1.5, 0.85, 1.5, 0.7, 1.5, 0.55, 1.5, 0.4, 1.25, 1, 1.25, 0.85,
1.25, 0.7, 1.25, 0.55, 1.25, 0.4, 1, 1, 1, 0.85, 1, 0.7, 1, 0.55, 1, 0.4, 1,
1, 0.75, 1, 0.75, 0.85, 1, 0.85, 0.75, 0.7, 1, 0.7, 0.75, 0.55, 1, 0.55,
0.75, 0.4, 1, 0.4, 0.5, 1, 0.5, 0.85, 0.5, 0.7, 0.5, 0.55, 0.5, 0.4, 0.25,
1, 0.25, 0.85, 0.25, 0.7, 0.25, 0.55, 0.25, 0.4, 0, 1, 0, 0.85, 0, 0.7, 0,
0.55, 0, 0.4, 2, 0.4, 1.75, 0.4, 1.75, 0.3, 2, 0.3, 1.75, 0.2, 2, 0.2, 1.75,
0.1, 2, 0.1, 1.75, 0, 1.5, 0.4, 1.5, 0.3, 1.5, 0.2, 1.5, 0.1, 1.5, 0, 1.25,
0.4, 1.25, 0.3, 1.25, 0.2, 1.25, 0.1, 1.25, 0, 1, 0.4, 1, 0.3, 1, 0.2, 1,
0.1, 1, 0, 1, 0.4, 0.75, 0.4, 0.75, 0.3, 1, 0.3, 0.75, 0.2, 1, 0.2, 0.75,
0.1, 1, 0.1, 0.75, 0, 0.5, 0.4, 0.5, 0.3, 0.5, 0.2, 0.5, 0.1, 0.5, 0, 0.25,
0.4, 0.25, 0.3, 0.25, 0.2, 0.25, 0.1, 0.25, 0, 0, 0.4, 0, 0.3, 0, 0.2, 0,
0.1, 0, 0, 2, 0.4, 1.75, 0.4, 1.75, 0.3, 2, 0.3, 1.75, 0.2, 2, 0.2, 1.75,
0.1, 2, 0.1, 1.75, 0, 1.5, 0.4, 1.5, 0.3, 1.5, 0.2, 1.5, 0.1, 1.5, 0, 1.25,
0.4, 1.25, 0.3, 1.25, 0.2, 1.25, 0.1, 1.25, 0, 1, 0.4, 1, 0.3, 1, 0.2, 1,
0.1, 1, 0, 1, 0.4, 0.75, 0.4, 0.75, 0.3, 1, 0.3, 0.75, 0.2, 1, 0.2, 0.75,
0.1, 1, 0.1, 0.75, 0, 0.5, 0.4, 0.5, 0.3, 0.5, 0.2, 0.5, 0.1, 0.5, 0, 0.25,
0.4, 0.25, 0.3, 0.25, 0.2, 0.25, 0.1, 0.25, 0, 0, 0.4, 0, 0.3, 0, 0.2, 0,
0.1, 0, 0, 1, 1, 0.875, 1, 0.875, 0.875, 1, 0.875, 0.875, 0.75, 1, 0.75,
0.875, 0.625, 1, 0.625, 0.875, 0.5, 1, 0.5, 0.75, 1, 0.75, 0.875, 0.75,
0.75, 0.75, 0.625, 0.75, 0.5, 0.625, 1, 0.625, 0.875, 0.625, 0.75, 0.625,
0.625, 0.625, 0.5, 0.5, 1, 0.5, 0.875, 0.5, 0.75, 0.5, 0.625, 0.5, 0.5, 0.5,
1, 0.375, 1, 0.375, 0.875, 0.5, 0.875, 0.375, 0.75, 0.5, 0.75, 0.375, 0.625,
0.5, 0.625, 0.375, 0.5, 0.5, 0.5, 0.25, 1, 0.25, 0.875, 0.25, 0.75, 0.25,
0.625, 0.25, 0.5, 0.125, 1, 0.125, 0.875, 0.125, 0.75, 0.125, 0.625, 0.125,
0.5, 0, 1, 0, 0.875, 0, 0.75, 0, 0.625, 0, 0.5, 1, 0.5, 0.875, 0.5, 0.875,
0.375, 1, 0.375, 0.875, 0.25, 1, 0.25, 0.875, 0.125, 1, 0.125, 0.875, 0, 1,
0, 0.75, 0.5, 0.75, 0.375, 0.75, 0.25, 0.75, 0.125, 0.75, 0, 0.625, 0.5,
0.625, 0.375, 0.625, 0.25, 0.625, 0.125, 0.625, 0, 0.5, 0.5, 0.5, 0.375,
0.5, 0.25, 0.5, 0.125, 0.5, 0, 0.5, 0.5, 0.375, 0.5, 0.375, 0.375, 0.5,
0.375, 0.375, 0.25, 0.5, 0.25, 0.375, 0.125, 0.5, 0.125, 0.375, 0, 0.5, 0,
0.25, 0.5, 0.25, 0.375, 0.25, 0.25, 0.25, 0.125, 0.25, 0, 0.125, 0.5, 0.125,
0.375, 0.125, 0.25, 0.125, 0.125, 0.125, 0, 0, 0.5, 0, 0.375, 0, 0.25, 0,
0.125, 0, 0, 0.5, 0, 0.625, 0, 0.625, 0.225, 0.5, 0.225, 0.625, 0.45, 0.5,
0.45, 0.625, 0.675, 0.5, 0.675, 0.625, 0.9, 0.5, 0.9, 0.75, 0, 0.75, 0.225,
0.75, 0.45, 0.75, 0.675, 0.75, 0.9, 0.875, 0, 0.875, 0.225, 0.875, 0.45,
0.875, 0.675, 0.875, 0.9, 1, 0, 1, 0.225, 1, 0.45, 1, 0.675, 1, 0.9, 0, 0,
0.125, 0, 0.125, 0.225, 0, 0.225, 0.125, 0.45, 0, 0.45, 0.125, 0.675, 0,
0.675, 0.125, 0.9, 0, 0.9, 0.25, 0, 0.25, 0.225, 0.25, 0.45, 0.25, 0.675,
0.25, 0.9, 0.375, 0, 0.375, 0.225, 0.375, 0.45, 0.375, 0.675, 0.375, 0.9,
0.5, 0, 0.5, 0.225, 0.5, 0.45, 0.5, 0.675, 0.5, 0.9, 0.5, 0.9, 0.625, 0.9,
0.625, 0.925, 0.5, 0.925, 0.625, 0.95, 0.5, 0.95, 0.625, 0.975, 0.5, 0.975,
0.625, 1, 0.5, 1, 0.75, 0.9, 0.75, 0.925, 0.75, 0.95, 0.75, 0.975, 0.75, 1,
0.875, 0.9, 0.875, 0.925, 0.875, 0.95, 0.875, 0.975, 0.875, 1, 1, 0.9, 1,
0.925, 1, 0.95, 1, 0.975, 1, 1, 0, 0.9, 0.125, 0.9, 0.125, 0.925, 0, 0.925,
0.125, 0.95, 0, 0.95, 0.125, 0.975, 0, 0.975, 0.125, 1, 0, 1, 0.25, 0.9,
0.25, 0.925, 0.25, 0.95, 0.25, 0.975, 0.25, 1, 0.375, 0.9, 0.375, 0.925,
0.375, 0.95, 0.375, 0.975, 0.375, 1, 0.5, 0.9, 0.5, 0.925, 0.5, 0.95, 0.5,
0.975, 0.5, 1, 0.875, 0.75, 1, 0.75, 1, 1, 0.875, 0.5, 1, 0.5, 0.875, 0.25,
1, 0.25, 0.875, 0, 1, 0, 0.75, 0.75, 0.875, 1, 0.75, 0.5, 0.75, 0.25, 0.75,
0, 0.625, 0.75, 0.75, 1, 0.625, 0.5, 0.625, 0.25, 0.625, 0, 0.5, 0.75,
0.625, 1, 0.5, 0.5, 0.5, 0.25, 0.5, 0, 0.375, 0.75, 0.5, 0.75, 0.5, 1,
0.375, 0.5, 0.5, 0.5, 0.375, 0.25, 0.5, 0.25, 0.375, 0, 0.5, 0, 0.25, 0.75,
0.375, 1, 0.25, 0.5, 0.25, 0.25, 0.25, 0, 0.125, 0.75, 0.25, 1, 0.125, 0.5,
0.125, 0.25, 0.125, 0, 0, 0.75, 0.125, 1, 0, 0.5, 0, 0.25, 0, 0, 0.875,
0.75, 1, 0.75, 1, 1, 0.875, 0.5, 1, 0.5, 0.875, 0.25, 1, 0.25, 0.875, 0, 1,
0, 0.75, 0.75, 0.875, 1, 0.75, 0.5, 0.75, 0.25, 0.75, 0, 0.625, 0.75, 0.75,
1, 0.625, 0.5, 0.625, 0.25, 0.625, 0, 0.5, 0.75, 0.625, 1, 0.5, 0.5, 0.5,
0.25, 0.5, 0, 0.375, 0.75, 0.5, 0.75, 0.5, 1, 0.375, 0.5, 0.5, 0.5, 0.375,
0.25, 0.5, 0.25, 0.375, 0, 0.5, 0, 0.25, 0.75, 0.375, 1, 0.25, 0.5, 0.25,
0.25, 0.25, 0, 0.125, 0.75, 0.25, 1, 0.125, 0.5, 0.125, 0.25, 0.125, 0, 0,
0.75, 0.125, 1, 0, 0.5, 0, 0.25, 0, 0, 1, 1, 0.875, 1, 0.875, 0.75, 1, 0.75,
0.875, 0.5, 1, 0.5, 0.875, 0.25, 1, 0.25, 0.875, 0, 1, 0, 0.75, 1, 0.75,
0.75, 0.75, 0.5, 0.75, 0.25, 0.75, 0, 0.625, 1, 0.625, 0.75, 0.625, 0.5,
0.625, 0.25, 0.625, 0, 0.5, 1, 0.5, 0.75, 0.5, 0.5, 0.5, 0.25, 0.5, 0, 0.5,
1, 0.375, 1, 0.375, 0.75, 0.5, 0.75, 0.375, 0.5, 0.5, 0.5, 0.375, 0.25, 0.5,
0.25, 0.375, 0, 0.5, 0, 0.25, 1, 0.25, 0.75, 0.25, 0.5, 0.25, 0.25, 0.25, 0,
0.125, 1, 0.125, 0.75, 0.125, 0.5, 0.125, 0.25, 0.125, 0, 0, 1, 0, 0.75, 0,
0.5, 0, 0.25, 0, 0, 1, 1, 0.875, 1, 0.875, 0.75, 1, 0.75, 0.875, 0.5, 1,
0.5, 0.875, 0.25, 1, 0.25, 0.875, 0, 1, 0, 0.75, 1, 0.75, 0.75, 0.75, 0.5,
0.75, 0.25, 0.75, 0, 0.625, 1, 0.625, 0.75, 0.625, 0.5, 0.625, 0.25, 0.625,
0, 0.5, 1, 0.5, 0.75, 0.5, 0.5, 0.5, 0.25, 0.5, 0, 0.5, 1, 0.375, 1, 0.375,
0.75, 0.5, 0.75, 0.375, 0.5, 0.5, 0.5, 0.375, 0.25, 0.5, 0.25, 0.375, 0,
0.5, 0, 0.25, 1, 0.25, 0.75, 0.25, 0.5, 0.25, 0.25, 0.25, 0, 0.125, 1,
0.125, 0.75, 0.125, 0.5, 0.125, 0.25, 0.125, 0, 0, 1, 0, 0.75, 0, 0.5, 0,
0.25, 0, 0,
]),
indices: new Uint16Array([
0, 1, 2, 2, 3, 0, 3, 2, 4, 4, 5, 3, 5, 4, 6, 6, 7, 5, 7, 6, 8, 8, 9, 7, 1,
10, 11, 11, 2, 1, 2, 11, 12, 12, 4, 2, 4, 12, 13, 13, 6, 4, 6, 13, 14, 14,
8, 6, 10, 15, 16, 16, 11, 10, 11, 16, 17, 17, 12, 11, 12, 17, 18, 18, 13,
12, 13, 18, 19, 19, 14, 13, 15, 20, 21, 21, 16, 15, 16, 21, 22, 22, 17, 16,
17, 22, 23, 23, 18, 17, 18, 23, 24, 24, 19, 18, 25, 26, 27, 27, 28, 25, 28,
27, 29, 29, 30, 28, 30, 29, 31, 31, 32, 30, 32, 31, 33, 33, 34, 32, 26, 35,
36, 36, 27, 26, 27, 36, 37, 37, 29, 27, 29, 37, 38, 38, 31, 29, 31, 38, 39,
39, 33, 31, 35, 40, 41, 41, 36, 35, 36, 41, 42, 42, 37, 36, 37, 42, 43, 43,
38, 37, 38, 43, 44, 44, 39, 38, 40, 45, 46, 46, 41, 40, 41, 46, 47, 47, 42,
41, 42, 47, 48, 48, 43, 42, 43, 48, 49, 49, 44, 43, 50, 51, 52, 52, 53, 50,
53, 52, 54, 54, 55, 53, 55, 54, 56, 56, 57, 55, 57, 56, 58, 58, 59, 57, 51,
60, 61, 61, 52, 51, 52, 61, 62, 62, 54, 52, 54, 62, 63, 63, 56, 54, 56, 63,
64, 64, 58, 56, 60, 65, 66, 66, 61, 60, 61, 66, 67, 67, 62, 61, 62, 67, 68,
68, 63, 62, 63, 68, 69, 69, 64, 63, 65, 70, 71, 71, 66, 65, 66, 71, 72, 72,
67, 66, 67, 72, 73, 73, 68, 67, 68, 73, 74, 74, 69, 68, 75, 76, 77, 77, 78,
75, 78, 77, 79, 79, 80, 78, 80, 79, 81, 81, 82, 80, 82, 81, 83, 83, 84, 82,
76, 85, 86, 86, 77, 76, 77, 86, 87, 87, 79, 77, 79, 87, 88, 88, 81, 79, 81,
88, 89, 89, 83, 81, 85, 90, 91, 91, 86, 85, 86, 91, 92, 92, 87, 86, 87, 92,
93, 93, 88, 87, 88, 93, 94, 94, 89, 88, 90, 95, 96, 96, 91, 90, 91, 96, 97,
97, 92, 91, 92, 97, 98, 98, 93, 92, 93, 98, 99, 99, 94, 93, 100, 101, 102,
102, 103, 100, 103, 102, 104, 104, 105, 103, 105, 104, 106, 106, 107, 105,
107, 106, 108, 108, 109, 107, 101, 110, 111, 111, 102, 101, 102, 111, 112,
112, 104, 102, 104, 112, 113, 113, 106, 104, 106, 113, 114, 114, 108, 106,
110, 115, 116, 116, 111, 110, 111, 116, 117, 117, 112, 111, 112, 117, 118,
118, 113, 112, 113, 118, 119, 119, 114, 113, 115, 120, 121, 121, 116, 115,
116, 121, 122, 122, 117, 116, 117, 122, 123, 123, 118, 117, 118, 123, 124,
124, 119, 118, 125, 126, 127, 127, 128, 125, 128, 127, 129, 129, 130, 128,
130, 129, 131, 131, 132, 130, 132, 131, 133, 133, 134, 132, 126, 135, 136,
136, 127, 126, 127, 136, 137, 137, 129, 127, 129, 137, 138, 138, 131, 129,
131, 138, 139, 139, 133, 131, 135, 140, 141, 141, 136, 135, 136, 141, 142,
142, 137, 136, 137, 142, 143, 143, 138, 137, 138, 143, 144, 144, 139, 138,
140, 145, 146, 146, 141, 140, 141, 146, 147, 147, 142, 141, 142, 147, 148,
148, 143, 142, 143, 148, 149, 149, 144, 143, 150, 151, 152, 152, 153, 150,
153, 152, 154, 154, 155, 153, 155, 154, 156, 156, 157, 155, 157, 156, 158,
158, 159, 157, 151, 160, 161, 161, 152, 151, 152, 161, 162, 162, 154, 152,
154, 162, 163, 163, 156, 154, 156, 163, 164, 164, 158, 156, 160, 165, 166,
166, 161, 160, 161, 166, 167, 167, 162, 161, 162, 167, 168, 168, 163, 162,
163, 168, 169, 169, 164, 163, 165, 170, 171, 171, 166, 165, 166, 171, 172,
172, 167, 166, 167, 172, 173, 173, 168, 167, 168, 173, 174, 174, 169, 168,
175, 176, 177, 177, 178, 175, 178, 177, 179, 179, 180, 178, 180, 179, 181,
181, 182, 180, 182, 181, 183, 183, 184, 182, 176, 185, 186, 186, 177, 176,
177, 186, 187, 187, 179, 177, 179, 187, 188, 188, 181, 179, 181, 188, 189,
189, 183, 181, 185, 190, 191, 191, 186, 185, 186, 191, 192, 192, 187, 186,
187, 192, 193, 193, 188, 187, 188, 193, 194, 194, 189, 188, 190, 195, 196,
196, 191, 190, 191, 196, 197, 197, 192, 191, 192, 197, 198, 198, 193, 192,
193, 198, 199, 199, 194, 193, 200, 201, 202, 202, 203, 200, 203, 202, 204,
204, 205, 203, 205, 204, 206, 206, 207, 205, 207, 206, 208, 208, 209, 207,
201, 210, 211, 211, 202, 201, 202, 211, 212, 212, 204, 202, 204, 212, 213,
213, 206, 204, 206, 213, 214, 214, 208, 206, 210, 215, 216, 216, 211, 210,
211, 216, 217, 217, 212, 211, 212, 217, 218, 218, 213, 212, 213, 218, 219,
219, 214, 213, 215, 220, 221, 221, 216, 215, 216, 221, 222, 222, 217, 216,
217, 222, 223, 223, 218, 217, 218, 223, 224, 224, 219, 218, 225, 226, 227,
227, 228, 225, 228, 227, 229, 229, 230, 228, 230, 229, 231, 231, 232, 230,
232, 231, 233, 233, 234, 232, 226, 235, 236, 236, 227, 226, 227, 236, 237,
237, 229, 227, 229, 237, 238, 238, 231, 229, 231, 238, 239, 239, 233, 231,
235, 240, 241, 241, 236, 235, 236, 241, 242, 242, 237, 236, 237, 242, 243,
243, 238, 237, 238, 243, 244, 244, 239, 238, 240, 245, 246, 246, 241, 240,
241, 246, 247, 247, 242, 241, 242, 247, 248, 248, 243, 242, 243, 248, 249,
249, 244, 243, 250, 251, 252, 252, 253, 250, 253, 252, 254, 254, 255, 253,
255, 254, 256, 256, 257, 255, 257, 256, 258, 258, 259, 257, 251, 260, 261,
261, 252, 251, 252, 261, 262, 262, 254, 252, 254, 262, 263, 263, 256, 254,
256, 263, 264, 264, 258, 256, 260, 265, 266, 266, 261, 260, 261, 266, 267,
267, 262, 261, 262, 267, 268, 268, 263, 262, 263, 268, 269, 269, 264, 263,
265, 270, 271, 271, 266, 265, 266, 271, 272, 272, 267, 266, 267, 272, 273,
273, 268, 267, 268, 273, 274, 274, 269, 268, 275, 276, 277, 277, 278, 275,
278, 277, 279, 279, 280, 278, 280, 279, 281, 281, 282, 280, 282, 281, 283,
283, 284, 282, 276, 285, 286, 286, 277, 276, 277, 286, 287, 287, 279, 277,
279, 287, 288, 288, 281, 279, 281, 288, 289, 289, 283, 281, 285, 290, 291,
291, 286, 285, 286, 291, 292, 292, 287, 286, 287, 292, 293, 293, 288, 287,
288, 293, 294, 294, 289, 288, 290, 295, 296, 296, 291, 290, 291, 296, 297,
297, 292, 291, 292, 297, 298, 298, 293, 292, 293, 298, 299, 299, 294, 293,
300, 301, 302, 302, 303, 300, 303, 302, 304, 304, 305, 303, 305, 304, 306,
306, 307, 305, 307, 306, 308, 301, 309, 310, 310, 302, 301, 302, 310, 311,
311, 304, 302, 304, 311, 312, 312, 306, 304, 306, 312, 313, 309, 314, 315,
315, 310, 309, 310, 315, 316, 316, 311, 310, 311, 316, 317, 317, 312, 311,
312, 317, 318, 314, 319, 320, 320, 315, 314, 315, 320, 321, 321, 316, 315,
316, 321, 322, 322, 317, 316, 317, 322, 323, 324, 325, 326, 326, 327, 324,
327, 326, 328, 328, 329, 327, 329, 328, 330, 330, 331, 329, 331, 330, 332,
325, 333, 334, 334, 326, 325, 326, 334, 335, 335, 328, 326, 328, 335, 336,
336, 330, 328, 330, 336, 337, 333, 338, 339, 339, 334, 333, 334, 339, 340,
340, 335, 334, 335, 340, 341, 341, 336, 335, 336, 341, 342, 338, 343, 344,
344, 339, 338, 339, 344, 345, 345, 340, 339, 340, 345, 346, 346, 341, 340,
341, 346, 347, 348, 349, 350, 350, 351, 348, 351, 350, 352, 352, 353, 351,
353, 352, 354, 354, 355, 353, 355, 354, 356, 349, 357, 358, 358, 350, 349,
350, 358, 359, 359, 352, 350, 352, 359, 360, 360, 354, 352, 354, 360, 361,
357, 362, 363, 363, 358, 357, 358, 363, 364, 364, 359, 358, 359, 364, 365,
365, 360, 359, 360, 365, 366, 362, 367, 368, 368, 363, 362, 363, 368, 369,
369, 364, 363, 364, 369, 370, 370, 365, 364, 365, 370, 371, 372, 373, 374,
374, 375, 372, 375, 374, 376, 376, 377, 375, 377, 376, 378, 378, 379, 377,
379, 378, 380, 373, 381, 382, 382, 374, 373, 374, 382, 383, 383, 376, 374,
376, 383, 384, 384, 378, 376, 378, 384, 385, 381, 386, 387, 387, 382, 381,
382, 387, 388, 388, 383, 382, 383, 388, 389, 389, 384, 383, 384, 389, 390,
386, 391, 392, 392, 387, 386, 387, 392, 393, 393, 388, 387, 388, 393, 394,
394, 389, 388, 389, 394, 395, 396, 397, 398, 398, 399, 396, 399, 398, 400,
400, 401, 399, 401, 400, 402, 402, 403, 401, 403, 402, 404, 404, 405, 403,
397, 406, 407, 407, 398, 397, 398, 407, 408, 408, 400, 398, 400, 408, 409,
409, 402, 400, 402, 409, 410, 410, 404, 402, 406, 411, 412, 412, 407, 406,
407, 412, 413, 413, 408, 407, 408, 413, 414, 414, 409, 408, 409, 414, 415,
415, 410, 409, 411, 416, 417, 417, 412, 411, 412, 417, 418, 418, 413, 412,
413, 418, 419, 419, 414, 413, 414, 419, 420, 420, 415, 414, 421, 422, 423,
423, 424, 421, 424, 423, 425, 425, 426, 424, 426, 425, 427, 427, 428, 426,
428, 427, 429, 429, 430, 428, 422, 431, 432, 432, 423, 422, 423, 432, 433,
433, 425, 423, 425, 433, 434, 434, 427, 425, 427, 434, 435, 435, 429, 427,
431, 436, 437, 437, 432, 431, 432, 437, 438, 438, 433, 432, 433, 438, 439,
439, 434, 433, 434, 439, 440, 440, 435, 434, 436, 441, 442, 442, 437, 436,
437, 442, 443, 443, 438, 437, 438, 443, 444, 444, 439, 438, 439, 444, 445,
445, 440, 439, 446, 447, 448, 448, 449, 446, 449, 448, 450, 450, 451, 449,
451, 450, 452, 452, 453, 451, 453, 452, 454, 454, 455, 453, 447, 456, 457,
457, 448, 447, 448, 457, 458, 458, 450, 448, 450, 458, 459, 459, 452, 450,
452, 459, 460, 460, 454, 452, 456, 461, 462, 462, 457, 456, 457, 462, 463,
463, 458, 457, 458, 463, 464, 464, 459, 458, 459, 464, 465, 465, 460, 459,
461, 466, 467, 467, 462, 461, 462, 467, 468, 468, 463, 462, 463, 468, 469,
469, 464, 463, 464, 469, 470, 470, 465, 464, 471, 472, 473, 473, 474, 471,
474, 473, 475, 475, 476, 474, 476, 475, 477, 477, 478, 476, 478, 477, 479,
479, 480, 478, 472, 481, 482, 482, 473, 472, 473, 482, 483, 483, 475, 473,
475, 483, 484, 484, 477, 475, 477, 484, 485, 485, 479, 477, 481, 486, 487,
487, 482, 481, 482, 487, 488, 488, 483, 482, 483, 488, 489, 489, 484, 483,
484, 489, 490, 490, 485, 484, 486, 491, 492, 492, 487, 486, 487, 492, 493,
493, 488, 487, 488, 493, 494, 494, 489, 488, 489, 494, 495, 495, 490, 489,
496, 497, 498, 498, 499, 496, 499, 498, 500, 500, 501, 499, 501, 500, 502,
502, 503, 501, 503, 502, 504, 504, 505, 503, 497, 506, 507, 507, 498, 497,
498, 507, 508, 508, 500, 498, 500, 508, 509, 509, 502, 500, 502, 509, 510,
510, 504, 502, 506, 511, 512, 512, 507, 506, 507, 512, 513, 513, 508, 507,
508, 513, 514, 514, 509, 508, 509, 514, 515, 515, 510, 509, 511, 516, 517,
517, 512, 511, 512, 517, 518, 518, 513, 512, 513, 518, 519, 519, 514, 513,
514, 519, 520, 520, 515, 514, 521, 522, 523, 523, 524, 521, 524, 523, 525,
525, 526, 524, 526, 525, 527, 527, 528, 526, 528, 527, 529, 529, 530, 528,
522, 531, 532, 532, 523, 522, 523, 532, 533, 533, 525, 523, 525, 533, 534,
534, 527, 525, 527, 534, 535, 535, 529, 527, 531, 536, 537, 537, 532, 531,
532, 537, 538, 538, 533, 532, 533, 538, 539, 539, 534, 533, 534, 539, 540,
540, 535, 534, 536, 541, 542, 542, 537, 536, 537, 542, 543, 543, 538, 537,
538, 543, 544, 544, 539, 538, 539, 544, 545, 545, 540, 539, 546, 547, 548,
548, 549, 546, 549, 548, 550, 550, 551, 549, 551, 550, 552, 552, 553, 551,
553, 552, 554, 554, 555, 553, 547, 556, 557, 557, 548, 547, 548, 557, 558,
558, 550, 548, 550, 558, 559, 559, 552, 550, 552, 559, 560, 560, 554, 552,
556, 561, 562, 562, 557, 556, 557, 562, 563, 563, 558, 557, 558, 563, 564,
564, 559, 558, 559, 564, 565, 565, 560, 559, 561, 566, 567, 567, 562, 561,
562, 567, 568, 568, 563, 562, 563, 568, 569, 569, 564, 563, 564, 569, 570,
570, 565, 564, 571, 572, 573, 573, 574, 571, 574, 573, 575, 575, 576, 574,
576, 575, 577, 577, 578, 576, 578, 577, 579, 579, 580, 578, 572, 581, 582,
582, 573, 572, 573, 582, 583, 583, 575, 573, 575, 583, 584, 584, 577, 575,
577, 584, 585, 585, 579, 577, 581, 586, 587, 587, 582, 581, 582, 587, 588,
588, 583, 582, 583, 588, 589, 589, 584, 583, 584, 589, 590, 590, 585, 584,
586, 591, 592, 592, 587, 586, 587, 592, 593, 593, 588, 587, 588, 593, 594,
594, 589, 588, 589, 594, 595, 595, 590, 589, 596, 597, 598, 597, 596, 599,
599, 600, 597, 600, 599, 601, 601, 602, 600, 602, 601, 603, 603, 604, 602,
605, 596, 606, 596, 605, 607, 607, 599, 596, 599, 607, 608, 608, 601, 599,
601, 608, 609, 609, 603, 601, 610, 605, 611, 605, 610, 612, 612, 607, 605,
607, 612, 613, 613, 608, 607, 608, 613, 614, 614, 609, 608, 615, 610, 616,
610, 615, 617, 617, 612, 610, 612, 617, 618, 618, 613, 612, 613, 618, 619,
619, 614, 613, 620, 621, 622, 621, 620, 623, 623, 624, 621, 624, 623, 625,
625, 626, 624, 626, 625, 627, 627, 628, 626, 629, 620, 630, 620, 629, 631,
631, 623, 620, 623, 631, 632, 632, 625, 623, 625, 632, 633, 633, 627, 625,
634, 629, 635, 629, 634, 636, 636, 631, 629, 631, 636, 637, 637, 632, 631,
632, 637, 638, 638, 633, 632, 639, 634, 640, 634, 639, 641, 641, 636, 634,
636, 641, 642, 642, 637, 636, 637, 642, 643, 643, 638, 637, 644, 645, 646,
645, 644, 647, 647, 648, 645, 648, 647, 649, 649, 650, 648, 650, 649, 651,
651, 652, 650, 653, 644, 654, 644, 653, 655, 655, 647, 644, 647, 655, 656,
656, 649, 647, 649, 656, 657, 657, 651, 649, 658, 653, 659, 653, 658, 660,
660, 655, 653, 655, 660, 661, 661, 656, 655, 656, 661, 662, 662, 657, 656,
663, 658, 664, 658, 663, 665, 665, 660, 658, 660, 665, 666, 666, 661, 660,
661, 666, 667, 667, 662, 661, 668, 669, 670, 669, 668, 671, 671, 672, 669,
672, 671, 673, 673, 674, 672, 674, 673, 675, 675, 676, 674, 677, 668, 678,
668, 677, 679, 679, 671, 668, 671, 679, 680, 680, 673, 671, 673, 680, 681,
681, 675, 673, 682, 677, 683, 677, 682, 684, 684, 679, 677, 679, 684, 685,
685, 680, 679, 680, 685, 686, 686, 681, 680, 687, 682, 688, 682, 687, 689,
689, 684, 682, 684, 689, 690, 690, 685, 684, 685, 690, 691, 691, 686, 685,
692, 693, 694, 694, 695, 692, 695, 694, 696, 696, 697, 695, 697, 696, 698,
698, 699, 697, 699, 698, 700, 700, 701, 699, 693, 702, 703, 703, 694, 693,
694, 703, 704, 704, 696, 694, 696, 704, 705, 705, 698, 696, 698, 705, 706,
706, 700, 698, 702, 707, 708, 708, 703, 702, 703, 708, 709, 709, 704, 703,
704, 709, 710, 710, 705, 704, 705, 710, 711, 711, 706, 705, 707, 712, 713,
713, 708, 707, 708, 713, 714, 714, 709, 708, 709, 714, 715, 715, 710, 709,
710, 715, 716, 716, 711, 710, 717, 718, 719, 719, 720, 717, 720, 719, 721,
721, 722, 720, 722, 721, 723, 723, 724, 722, 724, 723, 725, 725, 726, 724,
718, 727, 728, 728, 719, 718, 719, 728, 729, 729, 721, 719, 721, 729, 730,
730, 723, 721, 723, 730, 731, 731, 725, 723, 727, 732, 733, 733, 728, 727,
728, 733, 734, 734, 729, 728, 729, 734, 735, 735, 730, 729, 730, 735, 736,
736, 731, 730, 732, 737, 738, 738, 733, 732, 733, 738, 739, 739, 734, 733,
734, 739, 740, 740, 735, 734, 735, 740, 741, 741, 736, 735, 742, 743, 744,
744, 745, 742, 745, 744, 746, 746, 747, 745, 747, 746, 748, 748, 749, 747,
749, 748, 750, 750, 751, 749, 743, 752, 753, 753, 744, 743, 744, 753, 754,
754, 746, 744, 746, 754, 755, 755, 748, 746, 748, 755, 756, 756, 750, 748,
752, 757, 758, 758, 753, 752, 753, 758, 759, 759, 754, 753, 754, 759, 760,
760, 755, 754, 755, 760, 761, 761, 756, 755, 757, 762, 763, 763, 758, 757,
758, 763, 764, 764, 759, 758, 759, 764, 765, 765, 760, 759, 760, 765, 766,
766, 761, 760, 767, 768, 769, 769, 770, 767, 770, 769, 771, 771, 772, 770,
772, 771, 773, 773, 774, 772, 774, 773, 775, 775, 776, 774, 768, 777, 778,
778, 769, 768, 769, 778, 779, 779, 771, 769, 771, 779, 780, 780, 773, 771,
773, 780, 781, 781, 775, 773, 777, 782, 783, 783, 778, 777, 778, 783, 784,
784, 779, 778, 779, 784, 785, 785, 780, 779, 780, 785, 786, 786, 781, 780,
782, 787, 788, 788, 783, 782, 783, 788, 789, 789, 784, 783, 784, 789, 790,
790, 785, 784, 785, 790, 791, 791, 786, 785,
]),
};