diff --git a/Lib/mesh-manager.js/build/mesh-manager.iife.js b/Lib/mesh-manager.js/build/mesh-manager.iife.js index de4ad1b..21f08d9 100644 --- a/Lib/mesh-manager.js/build/mesh-manager.iife.js +++ b/Lib/mesh-manager.js/build/mesh-manager.iife.js @@ -20,15 +20,118 @@ var MeshManager = (function (exports, JSZip, JSZipUtils, threeFull) { this.readyForRaycast = true; this.lastRaycastPoint; this.logging = false; + this.meshMetadata = null; + this.NotesArray = []; } + /** + * @desc HELPER METHOD: Retrieves mesh metadata. + * Makes Http request to get metadata + */ + PlacenoteMesh.prototype._getMeshMetadata = function () { + const Http = new XMLHttpRequest(); + const url = 'https://us-central1-placenote-sdk.cloudfunctions.net/getMetadata'; + var apiKeyVal = document.getElementById('apikey').value; + var mapIdVal = document.getElementById('mapid').value; + Http.open("GET", url, true); + Http.setRequestHeader('APIKEY', apiKeyVal); + Http.setRequestHeader('placeid', mapIdVal); + Http.send(); + Http.onreadystatechange = (e) => { + const jsonRes = JSON.parse(Http.response); + this.meshMetadata = jsonRes; + if (jsonRes.metadata.userdata.notesList) { + this.NotesArray = jsonRes.metadata.userdata.notesList; + } + this.NotesArray.forEach((noteObj) => { + // For some reason, _init() is being called twice, so this will prevent duplicate scene children + if (scene.getObjectByName(noteObj.noteText)) { + return; + } + if (scene.getObjectByName("Label: " + noteObj.noteText)) { + return; + } + // Loads note markers and note labels into the scene + var mtlLoader = new Three.MTLLoader(); + mtlLoader.load( 'Lib/mesh-manager.js/marker-pin-obj/Pin.mtl', function( materials ) { + materials.preload(); + var loader = new Three.OBJLoader(); + loader.setMaterials( materials ) + // This function is called on successful load + function callbackOnLoad ( obj ) { + obj.children[0].material = new Three.MeshBasicMaterial( {color: 0x1e90ff} ); // Sets object material to blue (temporary solution to Pin.mtl issue) + obj.scale.set(0.01,0.01,0.01); // Scales the object size down to fit the mesh + obj.className = "noteMarker"; + obj.name = noteObj.noteText; + obj.userData = noteObj; + obj.position.set(noteObj.px,noteObj.py,noteObj.pz); + scene.add( obj ); + markers.push(obj); // Adds to markers array defined in index.js + } + loader.load('Lib/mesh-manager.js/marker-pin-obj/marker.obj', callbackOnLoad, null, null, null ); + }); + var text = document.createElement( 'div' ); + text.className = 'noteText'; + text.textContent = noteObj.noteText; + + var label = new Three.CSS2DObject( text ); + label.name = "Label: " + noteObj.noteText; + label.position.set(noteObj.px,noteObj.py - 0.5,noteObj.pz); + scene.add( label ); + }); + return this.meshMetadata; + } + }; + + /** + * @desc HELPER METHOD: Sets mesh metadata. + * Makes Http request to set metadata + */ + PlacenoteMesh.prototype._setMeshMetadata = function (data, deleteNote) { + const Http = new XMLHttpRequest(); + const url = 'https://us-central1-placenote-sdk.cloudfunctions.net/setMetadata'; + var apiKeyVal = document.getElementById('apikey').value; + var mapIdVal = document.getElementById('mapid').value; + Http.open("POST", url, true); + Http.setRequestHeader('APIKEY', apiKeyVal); + Http.setRequestHeader('placeid', mapIdVal); + + Http.send(JSON.stringify(data)); + Swal.fire({ + title: 'Saving Changes...', + allowOutsideClick: false, + allowEscapeKey: false, + allowEnterKey: false, + onOpen: () => { + Swal.showLoading(); + } + }) + Http.onreadystatechange = (e) => { + if (Http.readyState == 4 && Http.status == 200) { + this.meshMetadata = data; + if (deleteNote) { + Swal.fire({ + icon: 'success', + text: 'Note has been deleted!', + }); + } + else { + Swal.close(); + } + } + if (Http.status == 400) { + Swal.fire({ + icon: 'error', + text: "'Oops...', 'Something went wrong!', 'error'", + }); + } + } + } /** * @desc HELPER METHOD: initializes mesh for clickety click. * Makes Http request to download dataset.json * Calls _createClicketyClickCameras() * @param onError (Optional) Error callback that receives the error as an argument */ - - PlacenoteMesh.prototype._init = function (onError) { if (this.logging) console.log('Starting Initialization'); var scope = this; @@ -200,7 +303,147 @@ var MeshManager = (function (exports, JSZip, JSZipUtils, threeFull) { var scope = this; for (var i = 0; i < intersects.length; i++) { - if (scope.readyForRaycast && intersects[i].object.name == 'PlacenoteMesh') { + // Checks if raycast hits either the mesh or an existing note marker + if (scope.readyForRaycast && (intersects[i].object.name == 'PlacenoteMesh' || intersects[i].object.parent.className == 'noteMarker')) { + var noteObj = intersects[i].object; + delete this.meshMetadata.metadata.created; // Removes parameter so valid metadata is passed + let meshMetadata = this.meshMetadata; + + // Logic if raycast hits an existing object + if (intersects[i].object.parent.className == 'noteMarker') { + // Changes color of object when clicked on + intersects[i].object.material = new Three.MeshBasicMaterial( {color: 0xFFFF00} ); + // Modal to enter note text + Swal.fire({ + title: 'Edit Note!', + text: 'Enter note text here:', + input: 'text', + showCancelButton: true, + cancelButtonText: "Delete note", + confirmButtonText: "Save note info", + inputValue: noteObj.parent.userData.noteText, // Edit existing note text for that object + allowOutsideClick: false, + inputValidator: (noteText) => { + if(!noteText){ + return 'You need to enter text!'; + } + if( noteText.length > 100 ){ + return 'You have exceeded 100 characters'; + } + } + }).then(function(noteText) { + // Logic for delete button on edit popup + if (noteText.dismiss == "cancel") { + // Modifies notes list by removing the note being deleted from the array + scope.NotesArray.forEach((note) => { + // Compares note text and position values, which prevents deletion errors when multiple notes have the same note text + if (note.noteText == noteObj.parent.userData.noteText && note.px == noteObj.parent.position.x && note.py == noteObj.parent.position.y && note.pz == noteObj.parent.position.z) { + let index = meshMetadata.metadata.userdata.notesList.indexOf(note); + meshMetadata.metadata.userdata.notesList.splice(index, 1); + meshMetadata.metadata.userdata.notesList = scope.NotesArray; + scope._setMeshMetadata(meshMetadata, true); + } + }) + // Removes note cube and note label from the scene + scene.remove(scene.getObjectById(noteObj.parent.id)); + + // This loop is necessary for removing correct label if there are multiple labels with the same text by comparing position values + scene.children.forEach((child) => { + if (child.name == "Label: " + noteObj.parent.userData.noteText && child.position.x == noteObj.parent.position.x && child.position.y == noteObj.parent.position.y - 0.5 && child.position.z == noteObj.parent.position.z) { + scene.remove(child); + } + }); + } + // Logic for saving edited note information + else { + scope.NotesArray.forEach((note) => { + if (note.noteText == noteObj.parent.userData.noteText) { + // Removes note label from scene + scene.children.forEach((child) => { + if (child.name == "Label: " + noteObj.parent.userData.noteText && child.position.x == noteObj.parent.position.x && child.position.y == noteObj.parent.position.y - 0.5 && child.position.z == noteObj.parent.position.z) { + scene.remove(child); + } + }); + note.noteText = noteText.value; + noteObj.parent.userData.noteText = noteText.value; + noteObj.parent.name = noteText.value; + } + }) + // Update local array and call setMetadata endpoint + meshMetadata.metadata.userdata.notesList = scope.NotesArray; + scope._setMeshMetadata(meshMetadata, false); + + // Create a new label for the note + var text = document.createElement( 'div' ); + text.className = 'noteText'; + text.textContent = noteText.value; + + var label = new Three.CSS2DObject( text ); + label.name = "Label: " + noteText.value; + label.position.set(noteObj.parent.userData.px, noteObj.parent.userData.py - 0.5, noteObj.parent.userData.pz); + scene.add( label ); + } + }); + } + // Logic if raycast hits the mesh + if (intersects[i].object.name == 'PlacenoteMesh') { + // Modal to enter note text + Swal.fire({ + title: 'Create a Note!', + text: 'Enter note text here:', + input: 'text', + showCancelButton: true, + cancelButtonText: "Cancel", + confirmButtonText: "Save note info", + allowOutsideClick: false, + inputValidator: (noteText) => { + if(!noteText){ + return 'You need to enter text!'; + } + if( noteText.length > 100 ){ + return 'You have exceeded 100 characters'; + } + }, + preConfirm: function(noteText) { + var point = scope.getRaycastPoint(); + var noteInfo = new NoteInfo(point.x, point.y, point.z, noteText); // Class defined in index.js + const location = new MapLocation(0,0,0); // Class defined in index.js + + scope.NotesArray.push(noteInfo); + let notesList = {notesList: scope.NotesArray}; + let data = new MapMetadataSettable(meshMetadata.metadata.name, location, notesList); // Class defined in index.js + scope._setMeshMetadata({metadata: data}, false); + + // Add cube at raycast point + var mtlLoader = new Three.MTLLoader(); + mtlLoader.load( 'Lib/mesh-manager.js/marker-pin-obj/Pin.mtl', function( materials ) { + materials.preload(); + var loader = new Three.OBJLoader(); + loader.setMaterials( materials ) + // This function is called on successful load + function callbackOnLoad ( obj ) { + obj.scale.set(0.01,0.01,0.01); + obj.className = "noteMarker"; + obj.children[0].material = new Three.MeshBasicMaterial( {color: 0x1e90ff} ); + obj.name = noteText; + obj.userData = noteInfo; + obj.position.set(point.x, point.y, point.z); + scene.add( obj ); + markers.push(obj); + } + loader.load('Lib/mesh-manager.js/marker-pin-obj/marker.obj', callbackOnLoad, null, null, null ); + }); + var text = document.createElement( 'div' ); + text.className = 'noteText'; + text.textContent = noteText; + + var label = new Three.CSS2DObject( text ); + label.name = "Label: " + noteText; + label.position.set(point.x, point.y - 0.5, point.z); + scene.add( label ); + } + }); + } // Take first intersection with mesh if (scope.logging) console.log('Raycast to mesh is true'); scope.readyForRaycast = false; @@ -217,7 +460,6 @@ var MeshManager = (function (exports, JSZip, JSZipUtils, threeFull) { * @return THREE.Vector3 of raycast intersection point */ - PlacenoteMesh.prototype.getRaycastPoint = function () { if (this.lastRaycastPoint) return this.lastRaycastPoint; return new threeFull.Vector3(1, 1, 1); @@ -419,6 +661,7 @@ var MeshManager = (function (exports, JSZip, JSZipUtils, threeFull) { mesh.name = 'PlacenoteMesh'; if (scope.logging) console.log('Loading mesh complete'); onLoad(mesh); + scope._getMeshMetadata(); }; var objLoader = new threeFull.OBJLoader2(); diff --git a/Lib/mesh-manager.js/marker-pin-obj/Pin.mtl b/Lib/mesh-manager.js/marker-pin-obj/Pin.mtl new file mode 100644 index 0000000..fc0e01e --- /dev/null +++ b/Lib/mesh-manager.js/marker-pin-obj/Pin.mtl @@ -0,0 +1,96 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: Pin + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _EMISSION + m_LightmapFlags: 1 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MKGlowTex: + m_Texture: {fileID: 2800000, guid: d2bfdb919488ef040b6f7e30c6d08ebf, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _textureCbCr: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _textureY: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 0.78 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _InvFade: 1 + - _MKGlowOffSet: 0 + - _MKGlowPower: 0 + - _MKGlowTexStrength: 3.857143 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _RimPower: 1.625 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 1, b: 0, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _MKGlowColor: {r: 0.20392159, g: 0.5254902, b: 0.87843144, a: 1} + - _MKGlowTexColor: {r: 0.20392159, g: 0.5254902, b: 0.87843144, a: 1} + - _RimColor: {r: 0.13235295, g: 1, b: 1, a: 1} diff --git a/Lib/mesh-manager.js/marker-pin-obj/marker.obj b/Lib/mesh-manager.js/marker-pin-obj/marker.obj new file mode 100644 index 0000000..306fe22 --- /dev/null +++ b/Lib/mesh-manager.js/marker-pin-obj/marker.obj @@ -0,0 +1,1912 @@ +# This file uses centimeters as units for non-parametric coordinates. + +mtllib Pin.mtl +g default +v 2.592030 16.276775 0.267743 +v 2.420839 16.803650 0.267743 +v 0.000000 15.725822 0.267743 +v 2.143845 17.283417 0.267743 +v 1.773155 17.695110 0.267743 +v 1.324969 18.020737 0.267743 +v 0.818876 18.246063 0.267743 +v 0.276994 18.361244 0.267743 +v -0.276994 18.361244 0.267743 +v -0.818875 18.246063 0.267743 +v -1.324969 18.020737 0.267743 +v -1.773154 17.695110 0.267743 +v -2.143844 17.283417 0.267743 +v -2.420838 16.803650 0.267743 +v -2.592030 16.276775 0.267743 +v -2.649937 15.725822 0.267743 +v -2.592030 15.174871 0.267743 +v -2.420838 14.647997 0.267743 +v -2.143844 14.168229 0.267743 +v -1.773154 13.756536 0.267743 +v -1.324969 13.430909 0.267743 +v -0.818876 13.205583 0.267743 +v -0.547935 13.147993 0.267743 +v -0.276994 13.090403 0.267743 +v -0.000000 13.090403 0.267743 +v 0.276994 13.090403 0.267743 +v 0.547934 13.147993 0.267743 +v 0.818875 13.205583 0.267743 +v 1.324968 13.430911 0.267743 +v 1.773153 13.756536 0.267743 +v 2.143843 14.168229 0.267743 +v 2.420837 14.647996 0.267743 +v 2.592028 15.174870 0.267743 +v 2.649935 15.725823 0.267743 +v 6.095182 17.021393 -0.018375 +v 5.692625 18.260342 -0.018375 +v 5.041270 19.388519 -0.018375 +v 4.169590 20.356619 -0.018375 +v 3.115677 21.122332 -0.018375 +v 1.925595 21.652189 -0.018375 +v 0.651355 21.923037 -0.018375 +v -0.651353 21.923037 -0.018375 +v -1.925593 21.652189 -0.018375 +v -3.115675 21.122332 -0.018375 +v -4.169587 20.356619 -0.018375 +v -5.041269 19.388519 -0.018375 +v -5.692622 18.260342 -0.018375 +v -6.095181 17.021393 -0.018375 +v -6.231349 15.725822 -0.018375 +v -6.095180 14.430252 -0.018375 +v -5.692622 13.191305 -0.018375 +v -5.140069 12.063128 -0.018375 +v -4.251588 10.461596 -0.018375 +v -3.449034 9.067636 -0.018375 +v -2.538396 7.340066 -0.018375 +v -1.635171 5.542656 -0.018375 +v -0.761098 3.103654 -0.018375 +v -0.000000 -0.013068 -0.018375 +v 0.761098 3.103654 -0.018375 +v 1.635170 5.542656 -0.018375 +v 2.538396 7.340066 -0.018375 +v 3.449032 9.067638 -0.018375 +v 4.251585 10.461596 -0.018375 +v 5.140067 12.063129 -0.018375 +v 5.692619 13.191305 -0.018375 +v 6.095177 14.430252 -0.018375 +v 6.231347 15.725822 -0.018375 +v 2.592030 16.276775 -0.304494 +v 2.420839 16.803650 -0.304494 +v 0.000000 15.725822 -0.304494 +v 2.143845 17.283417 -0.304494 +v 1.773155 17.695110 -0.304494 +v 1.324969 18.020735 -0.304494 +v 0.818876 18.246063 -0.304494 +v 0.276994 18.361244 -0.304494 +v -0.276994 18.361244 -0.304494 +v -0.818875 18.246063 -0.304494 +v -1.324969 18.020735 -0.304494 +v -1.773154 17.695110 -0.304494 +v -2.143844 17.283417 -0.304494 +v -2.420838 16.803650 -0.304494 +v -2.592030 16.276775 -0.304494 +v -2.649937 15.725823 -0.304494 +v -2.592030 15.174871 -0.304494 +v -2.420838 14.647997 -0.304494 +v -2.143844 14.168230 -0.304494 +v -1.773154 13.756536 -0.304494 +v -1.324969 13.430909 -0.304494 +v -0.818876 13.205584 -0.304494 +v -0.547935 13.147993 -0.304494 +v -0.276994 13.090403 -0.304494 +v -0.000000 13.090403 -0.304494 +v 0.276994 13.090403 -0.304494 +v 0.547934 13.147993 -0.304494 +v 0.818875 13.205584 -0.304494 +v 1.324968 13.430911 -0.304494 +v 1.773153 13.756536 -0.304494 +v 2.143843 14.168230 -0.304494 +v 2.420837 14.647996 -0.304494 +v 2.592028 15.174870 -0.304494 +v 2.649935 15.725823 -0.304494 +v 5.875192 16.974632 0.876406 +v 6.095182 17.021393 0.652733 +v 5.487163 18.168865 0.876406 +v 5.692625 18.260342 0.652733 +v 4.859319 19.256323 0.876406 +v 5.041270 19.388519 0.652733 +v 4.019099 20.189480 0.876406 +v 4.169590 20.356619 0.652733 +v 3.003225 20.927559 0.876406 +v 3.115677 21.122332 0.652733 +v 1.856095 21.438292 0.876406 +v 1.925595 21.652191 0.652733 +v 0.627846 21.699364 0.876406 +v 0.651355 21.923038 0.652733 +v -0.627844 21.699364 0.876406 +v -0.651353 21.923038 0.652733 +v -1.856093 21.438292 0.876406 +v -1.925593 21.652191 0.652733 +v -3.003222 20.927559 0.876406 +v -3.115675 21.122332 0.652733 +v -4.019096 20.189482 0.876406 +v -4.169587 20.356619 0.652733 +v -4.859318 19.256323 0.876406 +v -5.041269 19.388519 0.652733 +v -5.487162 18.168865 0.876406 +v -5.692622 18.260342 0.652733 +v -5.875191 16.974632 0.876406 +v -6.095181 17.021395 0.652733 +v -6.006445 15.725823 0.876406 +v -6.231349 15.725822 0.652733 +v -5.875189 14.477013 0.876406 +v -6.095180 14.430252 0.652733 +v -5.484787 13.275475 0.876406 +v -5.692622 13.191304 0.652733 +v -4.941709 12.166640 0.876406 +v -5.140069 12.063128 0.652733 +v -4.056859 10.571656 0.876406 +v -4.251588 10.461595 0.652733 +v -3.253112 9.175626 0.876406 +v -3.449034 9.067636 0.652733 +v -2.339515 7.442442 0.876406 +v -2.538396 7.340067 0.652733 +v -1.429202 5.630927 0.876406 +v -1.635171 5.542656 0.652733 +v -0.546588 3.168091 0.876406 +v -0.761098 3.103654 0.652733 +v -0.000000 0.929796 0.876406 +v -0.000000 -0.013068 0.652733 +v 0.546587 3.168091 0.876406 +v 0.761098 3.103654 0.652733 +v 1.429201 5.630927 0.876406 +v 1.635170 5.542656 0.652733 +v 2.339514 7.442442 0.876406 +v 2.538396 7.340067 0.652733 +v 3.253109 9.175627 0.876406 +v 3.449032 9.067638 0.652733 +v 4.056857 10.571656 0.876406 +v 4.251585 10.461595 0.652733 +v 4.941705 12.166641 0.876406 +v 5.140067 12.063128 0.652733 +v 5.484784 13.275476 0.876406 +v 5.692619 13.191305 0.652733 +v 5.875187 14.477013 0.876406 +v 6.095177 14.430252 0.652733 +v 6.006441 15.725823 0.876406 +v 6.231347 15.725822 0.652733 +v 5.512724 18.180244 -0.913158 +v 5.692625 18.260342 -0.717311 +v 4.881955 19.272768 -0.913158 +v 5.041270 19.388521 -0.717311 +v 4.037821 20.210274 -0.913158 +v 4.169590 20.356619 -0.717311 +v 3.017215 20.951788 -0.913158 +v 3.115677 21.122332 -0.717311 +v 1.864742 21.464903 -0.913158 +v 1.925595 21.652191 -0.717311 +v 0.630770 21.727190 -0.913158 +v 0.651355 21.923038 -0.717311 +v -0.630768 21.727190 -0.913158 +v -0.651353 21.923038 -0.717311 +v -1.864740 21.464903 -0.913158 +v -1.925593 21.652191 -0.717311 +v -3.017212 20.951788 -0.913158 +v -3.115675 21.122332 -0.717311 +v -4.037818 20.210276 -0.913158 +v -4.169587 20.356621 -0.717311 +v -4.881953 19.272768 -0.913158 +v -5.041269 19.388521 -0.717311 +v -5.512723 18.180244 -0.913158 +v -5.692622 18.260342 -0.717311 +v -5.902559 16.980450 -0.913158 +v -6.095181 17.021395 -0.717311 +v -6.034426 15.725823 -0.913158 +v -6.231349 15.725822 -0.717311 +v -5.902557 14.471195 -0.913158 +v -6.095180 14.430252 -0.717311 +v -5.510643 13.265003 -0.913158 +v -5.692622 13.191304 -0.717311 +v -4.966386 12.153763 -0.913158 +v -5.140069 12.063128 -0.717311 +v -4.081086 10.557964 -0.913158 +v -4.251588 10.461595 -0.717311 +v -3.277487 9.162191 -0.913158 +v -3.449034 9.067637 -0.717311 +v -2.364258 7.429705 -0.913157 +v -2.538396 7.340066 -0.717312 +v -1.454826 5.619945 -0.913157 +v -1.635171 5.542656 -0.717311 +v -0.573275 3.160074 -0.913157 +v -0.761098 3.103654 -0.717311 +v -0.000000 0.812493 -0.913157 +v -0.000000 -0.013068 -0.717311 +v 0.573274 3.160074 -0.913157 +v 0.761098 3.103654 -0.717311 +v 1.454826 5.619945 -0.913157 +v 1.635170 5.542656 -0.717311 +v 2.364257 7.429705 -0.913157 +v 2.538396 7.340066 -0.717312 +v 3.277484 9.162192 -0.913158 +v 3.449032 9.067638 -0.717311 +v 4.081083 10.557964 -0.913158 +v 4.251585 10.461595 -0.717311 +v 4.966383 12.153763 -0.913158 +v 5.140067 12.063128 -0.717311 +v 5.510641 13.265004 -0.913158 +v 5.692619 13.191305 -0.717311 +v 5.902555 14.471195 -0.913158 +v 6.095177 14.430252 -0.717311 +v 6.034421 15.725823 -0.913158 +v 6.231347 15.725822 -0.717311 +v 5.902561 16.980450 -0.913158 +v 6.095182 17.021393 -0.717311 +v 2.420839 16.803650 0.724256 +v 2.560601 16.865875 0.876406 +v 2.143845 17.283417 0.724256 +v 2.267615 17.373341 0.876406 +v 1.773155 17.695108 0.724256 +v 1.875524 17.808802 0.876406 +v 1.324970 18.020735 0.724256 +v 1.401464 18.153227 0.876406 +v 0.818876 18.246061 0.724256 +v 0.866152 18.391563 0.876406 +v 0.276994 18.361242 0.724256 +v 0.292986 18.513393 0.876406 +v -0.276993 18.361242 0.724256 +v -0.292985 18.513393 0.876406 +v -0.818875 18.246063 0.724256 +v -0.866152 18.391565 0.876406 +v -1.324969 18.020735 0.724256 +v -1.401463 18.153227 0.876406 +v -1.773154 17.695110 0.724256 +v -1.875524 17.808804 0.876406 +v -2.143844 17.283417 0.724256 +v -2.267615 17.373341 0.876406 +v -2.420838 16.803650 0.724256 +v -2.560600 16.865875 0.876406 +v -2.592030 16.276775 0.724256 +v -2.741675 16.308584 0.876406 +v -2.649937 15.725823 0.724256 +v -2.802926 15.725823 0.876406 +v -2.592030 15.174870 0.724256 +v -2.741675 15.143062 0.876406 +v -2.420837 14.647997 0.724256 +v -2.560600 14.585771 0.876406 +v -2.143844 14.168229 0.724256 +v -2.267615 14.078304 0.876406 +v -1.773154 13.756536 0.724256 +v -1.875524 13.642843 0.876406 +v -1.324969 13.430911 0.724256 +v -1.401463 13.298418 0.876406 +v -0.818876 13.205584 0.724256 +v -0.866152 13.060082 0.876406 +v -0.547935 13.147993 0.724256 +v -0.579569 12.999167 0.876406 +v -0.276994 13.090404 0.724256 +v -0.292986 12.938252 0.876406 +v -0.000000 13.090404 0.724256 +v -0.000000 12.938252 0.876406 +v 0.276994 13.090404 0.724256 +v 0.292985 12.938252 0.876406 +v 0.547934 13.147993 0.724256 +v 0.579568 12.999167 0.876406 +v 0.818875 13.205584 0.724256 +v 0.866152 13.060082 0.876406 +v 1.324968 13.430911 0.724256 +v 1.401462 13.298418 0.876406 +v 1.773153 13.756536 0.724256 +v 1.875523 13.642843 0.876406 +v 2.143843 14.168230 0.724256 +v 2.267613 14.078305 0.876406 +v 2.420836 14.647997 0.724256 +v 2.560599 14.585771 0.876406 +v 2.592028 15.174870 0.724256 +v 2.741674 15.143062 0.876406 +v 2.649935 15.725823 0.724256 +v 2.802924 15.725821 0.876406 +v 2.592030 16.276775 0.724256 +v 2.741676 16.308582 0.876406 +v 2.143845 17.283417 -0.761007 +v 2.267615 17.373341 -0.913158 +v 2.420839 16.803650 -0.761007 +v 2.560601 16.865875 -0.913158 +v 1.773155 17.695108 -0.761007 +v 1.875524 17.808800 -0.913158 +v 1.324970 18.020735 -0.761007 +v 1.401464 18.153227 -0.913158 +v 0.818876 18.246061 -0.761007 +v 0.866152 18.391563 -0.913158 +v 0.276994 18.361242 -0.761007 +v 0.292986 18.513393 -0.913158 +v -0.276993 18.361242 -0.761007 +v -0.292985 18.513393 -0.913158 +v -0.818875 18.246063 -0.761007 +v -0.866152 18.391563 -0.913158 +v -1.324969 18.020735 -0.761007 +v -1.401463 18.153227 -0.913158 +v -1.773154 17.695110 -0.761007 +v -1.875524 17.808802 -0.913158 +v -2.143844 17.283417 -0.761007 +v -2.267615 17.373341 -0.913158 +v -2.420838 16.803650 -0.761007 +v -2.560600 16.865875 -0.913158 +v -2.592030 16.276775 -0.761007 +v -2.741675 16.308582 -0.913158 +v -2.649937 15.725822 -0.761007 +v -2.802926 15.725823 -0.913158 +v -2.592030 15.174870 -0.761007 +v -2.741675 15.143062 -0.913158 +v -2.420837 14.647996 -0.761007 +v -2.560600 14.585771 -0.913158 +v -2.143844 14.168229 -0.761007 +v -2.267615 14.078304 -0.913158 +v -1.773154 13.756536 -0.761007 +v -1.875524 13.642843 -0.913158 +v -1.324969 13.430910 -0.761007 +v -1.401463 13.298417 -0.913158 +v -0.818876 13.205584 -0.761007 +v -0.866152 13.060082 -0.913158 +v -0.547935 13.147992 -0.761007 +v -0.579569 12.999167 -0.913158 +v -0.276994 13.090402 -0.761007 +v -0.292986 12.938251 -0.913157 +v -0.000000 13.090402 -0.761007 +v -0.000000 12.938251 -0.913157 +v 0.276994 13.090402 -0.761007 +v 0.292985 12.938251 -0.913157 +v 0.547934 13.147992 -0.761007 +v 0.579568 12.999167 -0.913158 +v 0.818875 13.205584 -0.761007 +v 0.866152 13.060082 -0.913158 +v 1.324968 13.430910 -0.761007 +v 1.401462 13.298417 -0.913158 +v 1.773153 13.756536 -0.761007 +v 1.875523 13.642843 -0.913158 +v 2.143843 14.168229 -0.761007 +v 2.267613 14.078305 -0.913158 +v 2.420836 14.647996 -0.761007 +v 2.560599 14.585771 -0.913158 +v 2.592028 15.174870 -0.761007 +v 2.741674 15.143062 -0.913158 +v 2.649935 15.725822 -0.761007 +v 2.802924 15.725821 -0.913158 +v 2.592030 16.276775 -0.761007 +v 2.741676 16.308582 -0.913158 +v -0.000000 3.160076 -0.913157 +v 0.502763 5.619941 -0.913157 +v -0.000000 5.619943 -0.913157 +v -0.502764 5.619941 -0.913157 +v 1.240168 7.429707 -0.913158 +v 0.450886 7.429708 -0.913157 +v -0.000000 7.429702 -0.913157 +v -0.450887 7.429708 -0.913157 +v -1.240169 7.429707 -0.913158 +v 1.903284 9.162194 -0.913157 +v 1.034676 9.162193 -0.913158 +v 0.401225 9.162194 -0.913157 +v -0.000000 9.162189 -0.913157 +v -0.401226 9.162194 -0.913157 +v -1.034676 9.162193 -0.913158 +v -1.903286 9.162189 -0.913157 +v 2.644418 10.557966 -0.913158 +v 1.531904 10.557966 -0.913158 +v 0.869122 10.557965 -0.913158 +v 0.361215 10.557964 -0.913157 +v -0.000000 10.557966 -0.913158 +v -0.361216 10.557964 -0.913157 +v -0.869122 10.557965 -0.913158 +v -1.531905 10.557962 -0.913158 +v -2.644421 10.557964 -0.913158 +v -0.000000 3.168088 0.876406 +v -0.482661 5.630924 0.876406 +v -0.000000 5.630932 0.876406 +v 0.482660 5.630924 0.876406 +v -1.220316 7.442445 0.876406 +v -0.435639 7.442440 0.876406 +v -0.000000 7.442438 0.876406 +v 0.435639 7.442440 0.876406 +v 1.220315 7.442445 0.876406 +v -1.884946 9.175625 0.876406 +v -1.020462 9.175626 0.876406 +v -0.390651 9.175627 0.876406 +v -0.000000 9.175626 0.876406 +v 0.390651 9.175627 0.876406 +v 1.020461 9.175626 0.876406 +v 1.884945 9.175625 0.876406 +v -2.626119 10.571657 0.876406 +v -1.518803 10.571656 0.876406 +v -0.859486 10.571654 0.876406 +v -0.354415 10.571655 0.876406 +v -0.000000 10.571654 0.876406 +v 0.354414 10.571655 0.876406 +v 0.859485 10.571654 0.876406 +v 1.518802 10.571656 0.876406 +v 2.626117 10.571657 0.876406 +vt 0.491288 0.714354 +vt 0.491288 0.714354 +vt 0.754612 0.770645 +vt 0.740430 0.825569 +vt 0.712135 0.875582 +vt 0.674268 0.918499 +vt 0.628485 0.952444 +vt 0.576787 0.975933 +vt 0.521433 0.987940 +vt 0.464842 0.987940 +vt 0.409488 0.975933 +vt 0.357790 0.952444 +vt 0.312007 0.918499 +vt 0.274141 0.875582 +vt 0.245846 0.825569 +vt 0.228358 0.770645 +vt 0.222443 0.713212 +vt 0.228358 0.655778 +vt 0.245846 0.600854 +vt 0.269849 0.550841 +vt 0.308445 0.479843 +vt 0.343309 0.418048 +vt 0.382868 0.341463 +vt 0.460075 0.153658 +vt 0.523997 0.153658 +vt 0.597898 0.341463 +vt 0.639661 0.418048 +vt 0.675626 0.479843 +vt 0.713121 0.550841 +vt 0.736022 0.600854 +vt 0.752408 0.655778 +vt 0.759425 0.713212 +vt 0.491744 0.015491 +vt 0.422105 0.261782 +vt 0.559763 0.261782 +vt 0.740430 0.825569 +vt 0.754612 0.770645 +vt 0.712135 0.875582 +vt 0.740430 0.825569 +vt 0.674268 0.918499 +vt 0.712135 0.875582 +vt 0.628485 0.952444 +vt 0.674268 0.918499 +vt 0.576787 0.975933 +vt 0.628485 0.952444 +vt 0.521433 0.987940 +vt 0.576787 0.975933 +vt 0.464842 0.987940 +vt 0.521433 0.987940 +vt 0.409488 0.975933 +vt 0.464842 0.987940 +vt 0.357790 0.952444 +vt 0.409488 0.975933 +vt 0.312007 0.918499 +vt 0.357790 0.952444 +vt 0.274141 0.875582 +vt 0.312007 0.918499 +vt 0.245846 0.825569 +vt 0.274141 0.875582 +vt 0.228358 0.770645 +vt 0.245846 0.825569 +vt 0.222443 0.713212 +vt 0.228358 0.770645 +vt 0.228358 0.655778 +vt 0.222443 0.713212 +vt 0.245846 0.600854 +vt 0.228358 0.655778 +vt 0.269849 0.550841 +vt 0.245846 0.600854 +vt 0.308445 0.479843 +vt 0.269849 0.550841 +vt 0.343309 0.418048 +vt 0.308445 0.479843 +vt 0.382868 0.341463 +vt 0.343309 0.418048 +vt 0.422105 0.261782 +vt 0.382868 0.341463 +vt 0.491744 0.015491 +vt 0.460075 0.153658 +vt 0.559763 0.261782 +vt 0.523997 0.153658 +vt 0.639661 0.418048 +vt 0.597898 0.341463 +vt 0.675626 0.479843 +vt 0.639661 0.418048 +vt 0.713121 0.550841 +vt 0.675626 0.479843 +vt 0.736022 0.600854 +vt 0.713121 0.550841 +vt 0.752408 0.655778 +vt 0.736022 0.600854 +vt 0.759425 0.713212 +vt 0.752408 0.655778 +vt 0.754612 0.770645 +vt 0.759425 0.713212 +vt 0.523997 0.153658 +vt 0.491744 0.015491 +vt 0.460075 0.153658 +vt 0.422105 0.261782 +vt 0.597898 0.341463 +vt 0.559763 0.261782 +vt 0.593611 0.760217 +vt 0.600847 0.737797 +vt 0.581903 0.780631 +vt 0.593611 0.760217 +vt 0.566235 0.798150 +vt 0.581904 0.780631 +vt 0.547291 0.812005 +vt 0.566235 0.798150 +vt 0.525900 0.821593 +vt 0.547291 0.812005 +vt 0.502996 0.826494 +vt 0.525900 0.821593 +vt 0.479580 0.826494 +vt 0.502996 0.826494 +vt 0.456676 0.821593 +vt 0.479580 0.826494 +vt 0.435285 0.812005 +vt 0.456676 0.821593 +vt 0.416341 0.798150 +vt 0.435285 0.812005 +vt 0.400673 0.780631 +vt 0.416341 0.798150 +vt 0.388965 0.760217 +vt 0.400673 0.780631 +vt 0.381729 0.737797 +vt 0.388965 0.760217 +vt 0.379281 0.714354 +vt 0.381729 0.737797 +vt 0.381729 0.690910 +vt 0.379281 0.714354 +vt 0.388965 0.668490 +vt 0.381729 0.690910 +vt 0.400673 0.648076 +vt 0.388965 0.668490 +vt 0.416341 0.630558 +vt 0.400673 0.648076 +vt 0.435285 0.616702 +vt 0.416341 0.630557 +vt 0.456676 0.607114 +vt 0.435285 0.616702 +vt 0.479580 0.602213 +vt 0.468128 0.604663 +vt 0.502996 0.602213 +vt 0.491288 0.602213 +vt 0.525900 0.607114 +vt 0.514448 0.604663 +vt 0.547291 0.616702 +vt 0.525900 0.607114 +vt 0.566235 0.630558 +vt 0.547291 0.616702 +vt 0.581903 0.648076 +vt 0.566235 0.630558 +vt 0.593611 0.668490 +vt 0.581903 0.648076 +vt 0.600847 0.690910 +vt 0.593611 0.668490 +vt 0.603295 0.714354 +vt 0.600847 0.690910 +vt 0.600847 0.737797 +vt 0.603295 0.714354 +vt 0.491288 0.602213 +vt 0.479580 0.602213 +vt 0.468128 0.604663 +vt 0.456676 0.607114 +vt 0.514448 0.604663 +vt 0.502996 0.602213 +vt 0.600847 0.737797 +vt 0.593611 0.760217 +vt 0.593611 0.760217 +vt 0.581904 0.780631 +vt 0.581904 0.780631 +vt 0.566235 0.798150 +vt 0.566235 0.798150 +vt 0.547291 0.812005 +vt 0.547291 0.812005 +vt 0.525900 0.821593 +vt 0.525900 0.821593 +vt 0.502996 0.826494 +vt 0.502996 0.826494 +vt 0.479580 0.826494 +vt 0.479580 0.826494 +vt 0.456676 0.821593 +vt 0.456676 0.821593 +vt 0.435285 0.812005 +vt 0.435285 0.812005 +vt 0.416341 0.798150 +vt 0.416341 0.798150 +vt 0.400673 0.780631 +vt 0.400673 0.780631 +vt 0.388965 0.760217 +vt 0.388965 0.760217 +vt 0.381729 0.737797 +vt 0.381729 0.737797 +vt 0.379281 0.714354 +vt 0.379281 0.714354 +vt 0.381729 0.690910 +vt 0.381729 0.690910 +vt 0.388965 0.668490 +vt 0.388965 0.668490 +vt 0.400673 0.648076 +vt 0.400673 0.648076 +vt 0.416341 0.630558 +vt 0.416341 0.630558 +vt 0.435285 0.616702 +vt 0.435285 0.616702 +vt 0.456676 0.607114 +vt 0.468128 0.604663 +vt 0.479580 0.602213 +vt 0.491288 0.602213 +vt 0.502996 0.602213 +vt 0.514448 0.604663 +vt 0.525900 0.607114 +vt 0.525900 0.607114 +vt 0.547291 0.616702 +vt 0.547291 0.616702 +vt 0.566235 0.630558 +vt 0.566235 0.630558 +vt 0.581903 0.648076 +vt 0.581903 0.648076 +vt 0.593611 0.668490 +vt 0.593611 0.668490 +vt 0.600847 0.690910 +vt 0.600847 0.690910 +vt 0.603295 0.714354 +vt 0.603295 0.714354 +vt 0.600847 0.737797 +vt 0.479580 0.602213 +vt 0.491288 0.602213 +vt 0.456676 0.607114 +vt 0.468128 0.604663 +vt 0.502996 0.602213 +vt 0.514448 0.604663 +vt 0.704231 0.869722 +vt 0.599519 0.762864 +vt 0.667731 0.911090 +vt 0.587135 0.784458 +vt 0.623600 0.943809 +vt 0.570562 0.802987 +vt 0.573768 0.966451 +vt 0.550525 0.817643 +vt 0.520412 0.978024 +vt 0.527898 0.827785 +vt 0.465864 0.978024 +vt 0.503672 0.832969 +vt 0.412507 0.966451 +vt 0.478904 0.832969 +vt 0.362675 0.943809 +vt 0.454678 0.827785 +vt 0.318545 0.911090 +vt 0.432051 0.817643 +vt 0.282045 0.869722 +vt 0.412014 0.802987 +vt 0.254771 0.821514 +vt 0.395441 0.784458 +vt 0.237915 0.768573 +vt 0.383057 0.762864 +vt 0.232213 0.713212 +vt 0.375404 0.739151 +vt 0.237915 0.657850 +vt 0.372815 0.714354 +vt 0.254874 0.604585 +vt 0.375404 0.689556 +vt 0.278466 0.555429 +vt 0.383057 0.665843 +vt 0.316904 0.484722 +vt 0.395441 0.644249 +vt 0.351820 0.422835 +vt 0.412014 0.625720 +vt 0.391507 0.346001 +vt 0.432051 0.611064 +vt 0.466791 0.598330 +vt 0.469393 0.156515 +vt 0.491288 0.595738 +vt 0.514678 0.156512 +vt 0.515785 0.598330 +vt 0.589259 0.346001 +vt 0.631150 0.422835 +vt 0.527898 0.600922 +vt 0.667167 0.484722 +vt 0.550525 0.611064 +vt 0.704504 0.555430 +vt 0.570562 0.625720 +vt 0.726994 0.604585 +vt 0.587135 0.644249 +vt 0.742851 0.657851 +vt 0.599519 0.665843 +vt 0.749655 0.713212 +vt 0.607172 0.689556 +vt 0.745055 0.768572 +vt 0.609761 0.714354 +vt 0.731505 0.821514 +vt 0.607172 0.739151 +vt 0.491744 0.054856 +vt 0.478904 0.595738 +vt 0.431052 0.265695 +vt 0.454678 0.600922 +vt 0.550816 0.265695 +vt 0.503672 0.595738 +vt 0.732615 0.822018 +vt 0.587135 0.784458 +vt 0.705214 0.870451 +vt 0.570562 0.802987 +vt 0.668544 0.912012 +vt 0.550525 0.817643 +vt 0.624208 0.944884 +vt 0.527898 0.827785 +vt 0.574144 0.967631 +vt 0.503672 0.832969 +vt 0.520539 0.979258 +vt 0.478904 0.832969 +vt 0.465737 0.979258 +vt 0.454678 0.827785 +vt 0.412132 0.967631 +vt 0.432051 0.817643 +vt 0.362068 0.944884 +vt 0.412014 0.802987 +vt 0.317732 0.912012 +vt 0.395441 0.784458 +vt 0.281062 0.870451 +vt 0.383057 0.762864 +vt 0.253661 0.822018 +vt 0.375404 0.739151 +vt 0.236726 0.768830 +vt 0.372815 0.714354 +vt 0.230997 0.713212 +vt 0.375404 0.689556 +vt 0.236726 0.657593 +vt 0.383057 0.665843 +vt 0.253751 0.604121 +vt 0.395441 0.644249 +vt 0.277394 0.554859 +vt 0.412014 0.625720 +vt 0.315852 0.484115 +vt 0.432051 0.611064 +vt 0.350761 0.422239 +vt 0.454678 0.600922 +vt 0.478904 0.595738 +vt 0.429939 0.265208 +vt 0.503672 0.595738 +vt 0.491744 0.049650 +vt 0.527898 0.600922 +vt 0.551929 0.265208 +vt 0.590334 0.345437 +vt 0.550525 0.611064 +vt 0.632209 0.422239 +vt 0.570562 0.625720 +vt 0.668220 0.484115 +vt 0.587135 0.644249 +vt 0.705576 0.554859 +vt 0.599519 0.665843 +vt 0.728117 0.604121 +vt 0.607172 0.689556 +vt 0.744040 0.657593 +vt 0.609761 0.714354 +vt 0.750870 0.713212 +vt 0.607172 0.739151 +vt 0.746244 0.768830 +vt 0.599519 0.762864 +vt 0.468234 0.156160 +vt 0.491288 0.595738 +vt 0.390432 0.345437 +vt 0.466791 0.598330 +vt 0.515838 0.156160 +vt 0.515785 0.598330 +vt 0.954618 0.681976 +vt 0.954891 0.652312 +vt 0.979340 0.652532 +vt 0.979066 0.682206 +vt 0.955153 0.622647 +vt 0.979602 0.622858 +vt 0.955403 0.592982 +vt 0.979853 0.593183 +vt 0.955641 0.563317 +vt 0.980091 0.563508 +vt 0.955867 0.533650 +vt 0.980318 0.533832 +vt 0.956083 0.503982 +vt 0.980534 0.504155 +vt 0.956287 0.474316 +vt 0.980738 0.474479 +vt 0.956478 0.444648 +vt 0.980930 0.444802 +vt 0.956659 0.414980 +vt 0.981110 0.415124 +vt 0.956827 0.385313 +vt 0.981278 0.385447 +vt 0.956983 0.355645 +vt 0.981435 0.355769 +vt 0.957129 0.325977 +vt 0.981580 0.326092 +vt 0.957264 0.296309 +vt 0.981715 0.296417 +vt 0.957391 0.266641 +vt 0.981841 0.266742 +vt 0.957509 0.236972 +vt 0.981959 0.237067 +vt 0.957621 0.207303 +vt 0.982071 0.207393 +vt 0.957728 0.177633 +vt 0.982178 0.177720 +vt 0.957831 0.147964 +vt 0.982281 0.148048 +vt 0.957932 0.118294 +vt 0.982382 0.118377 +vt 0.958033 0.088624 +vt 0.982482 0.088706 +vt 0.958083 0.073788 +vt 0.951850 0.948960 +vt 0.982583 0.059037 +vt 0.982532 0.073871 +vt 0.952009 0.934126 +vt 0.952169 0.919293 +vt 0.976615 0.919555 +vt 0.976456 0.934388 +vt 0.952328 0.904460 +vt 0.952486 0.889627 +vt 0.976932 0.889888 +vt 0.976775 0.904721 +vt 0.952802 0.859962 +vt 0.977248 0.860222 +vt 0.953115 0.830297 +vt 0.977562 0.830555 +vt 0.953428 0.800633 +vt 0.977874 0.800888 +vt 0.953736 0.770968 +vt 0.978183 0.771220 +vt 0.954038 0.741303 +vt 0.978486 0.741550 +vt 0.954333 0.711639 +vt 0.978781 0.711878 +vt 0.917894 0.707261 +vt 0.894317 0.707343 +vt 0.894221 0.678729 +vt 0.917797 0.678653 +vt 0.894133 0.650115 +vt 0.917710 0.650046 +vt 0.894054 0.621499 +vt 0.917632 0.621439 +vt 0.893986 0.592883 +vt 0.917564 0.592831 +vt 0.893928 0.564267 +vt 0.917506 0.564224 +vt 0.893881 0.535650 +vt 0.917459 0.535615 +vt 0.893844 0.507033 +vt 0.917421 0.507007 +vt 0.893816 0.478417 +vt 0.917394 0.478399 +vt 0.893800 0.449800 +vt 0.917378 0.449791 +vt 0.893793 0.421184 +vt 0.917371 0.421183 +vt 0.893797 0.392567 +vt 0.917375 0.392574 +vt 0.893811 0.363951 +vt 0.917389 0.363966 +vt 0.893833 0.335335 +vt 0.917411 0.335357 +vt 0.893864 0.306720 +vt 0.917442 0.306748 +vt 0.893902 0.278106 +vt 0.917480 0.278139 +vt 0.893946 0.249492 +vt 0.917524 0.249530 +vt 0.893996 0.220878 +vt 0.917574 0.220920 +vt 0.894050 0.192264 +vt 0.917628 0.192309 +vt 0.894107 0.163651 +vt 0.917685 0.163699 +vt 0.894167 0.135039 +vt 0.917744 0.135088 +vt 0.917774 0.120782 +vt 0.894197 0.120733 +vt 0.894226 0.106427 +vt 0.917803 0.106476 +vt 0.917833 0.092170 +vt 0.894256 0.092121 +vt 0.895271 0.936240 +vt 0.917862 0.077864 +vt 0.918785 0.921829 +vt 0.895208 0.921934 +vt 0.895144 0.907628 +vt 0.918721 0.907524 +vt 0.895018 0.879017 +vt 0.918595 0.878913 +vt 0.894893 0.850406 +vt 0.918469 0.850303 +vt 0.894769 0.821794 +vt 0.918346 0.821694 +vt 0.894649 0.793183 +vt 0.918225 0.793086 +vt 0.894532 0.764571 +vt 0.918109 0.764477 +vt 0.894421 0.735957 +vt 0.917998 0.735869 +vt 0.894285 0.077816 +vt 0.918848 0.936135 +vt 0.958133 0.058954 +vt 0.976298 0.949222 +vt 0.491656 0.155374 +vt 0.512777 0.266743 +vt 0.491563 0.266155 +vt 0.470918 0.266743 +vt 0.543065 0.346907 +vt 0.510525 0.348101 +vt 0.491495 0.347658 +vt 0.472893 0.348101 +vt 0.438977 0.346907 +vt 0.571122 0.424051 +vt 0.534579 0.425117 +vt 0.508370 0.425985 +vt 0.491430 0.425682 +vt 0.474784 0.425985 +vt 0.447629 0.425117 +vt 0.410201 0.424050 +vt 0.604644 0.485958 +vt 0.555644 0.487386 +vt 0.527742 0.488126 +vt 0.506633 0.488732 +vt 0.491377 0.488541 +vt 0.476307 0.488732 +vt 0.454599 0.488126 +vt 0.426127 0.487385 +vt 0.378193 0.485958 +vt 0.491659 0.155673 +vt 0.471791 0.267233 +vt 0.491565 0.266604 +vt 0.511904 0.267231 +vt 0.439839 0.347475 +vt 0.473554 0.348671 +vt 0.491497 0.348197 +vt 0.509863 0.348669 +vt 0.542203 0.347475 +vt 0.410997 0.424651 +vt 0.448245 0.425718 +vt 0.475242 0.426587 +vt 0.491431 0.426263 +vt 0.507911 0.426586 +vt 0.533963 0.425719 +vt 0.570328 0.424651 +vt 0.378987 0.486572 +vt 0.426695 0.488001 +vt 0.455017 0.488741 +vt 0.476601 0.489347 +vt 0.491378 0.489143 +vt 0.506338 0.489346 +vt 0.527326 0.488741 +vt 0.555079 0.488001 +vt 0.603849 0.486572 +vn -0.000000 0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn -0.000000 0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.095494 0.020298 0.995223 +vn 0.951352 0.202214 0.232461 +vn 0.888520 0.395594 0.232461 +vn 0.089187 0.039708 0.995223 +vn 0.097627 -0.000000 0.995223 +vn 0.972606 -0.000002 0.232461 +vn 0.786854 0.571683 0.232462 +vn 0.078982 0.057384 0.995223 +vn 0.650800 0.722787 0.232461 +vn 0.065325 0.072551 0.995223 +vn 0.486303 0.842301 0.232461 +vn 0.048814 0.084548 0.995223 +vn 0.300551 0.925003 0.232460 +vn 0.030168 0.092849 0.995223 +vn 0.101665 0.967278 0.232460 +vn 0.010205 0.097092 0.995223 +vn -0.101665 0.967278 0.232460 +vn -0.010205 0.097092 0.995223 +vn -0.300551 0.925004 0.232459 +vn -0.030168 0.092849 0.995223 +vn -0.486303 0.842301 0.232460 +vn -0.048814 0.084548 0.995223 +vn -0.650800 0.722787 0.232462 +vn -0.065325 0.072551 0.995223 +vn -0.786854 0.571684 0.232462 +vn -0.078982 0.057384 0.995223 +vn -0.888520 0.395594 0.232461 +vn -0.089187 0.039709 0.995223 +vn -0.951352 0.202216 0.232461 +vn -0.095494 0.020298 0.995223 +vn -0.972606 -0.000001 0.232461 +vn -0.097627 -0.000000 0.995223 +vn -0.951286 -0.202239 0.232712 +vn -0.095441 -0.020302 0.995228 +vn -0.901244 -0.363702 0.235545 +vn -0.086672 -0.034995 0.995622 +vn -0.858524 -0.453243 0.239806 +vn -0.079788 -0.042129 0.995921 +vn -0.844983 -0.477019 0.241780 +vn -0.107650 -0.060773 0.992330 +vn -0.850110 -0.466564 0.244196 +vn -0.194539 -0.106767 0.975067 +vn -0.862365 -0.443748 0.243750 +vn -0.212524 -0.109356 0.971017 +vn -0.893249 -0.374736 0.248353 +vn -0.238825 -0.100186 0.965881 +vn -0.932547 -0.275461 0.233406 +vn -0.327856 -0.097951 0.939636 +vn 0.000000 -0.972188 0.234200 +vn -0.000000 -0.213672 0.976906 +vn 0.932547 -0.275461 0.233406 +vn 0.327856 -0.097951 0.939636 +vn 0.893249 -0.374736 0.248353 +vn 0.238825 -0.100186 0.965881 +vn 0.862366 -0.443747 0.243750 +vn 0.212524 -0.109356 0.971017 +vn 0.850110 -0.466564 0.244196 +vn 0.194539 -0.106767 0.975067 +vn 0.844983 -0.477019 0.241780 +vn 0.107651 -0.060773 0.992330 +vn 0.858524 -0.453243 0.239806 +vn 0.079788 -0.042129 0.995921 +vn 0.901243 -0.363702 0.235545 +vn 0.086672 -0.034995 0.995622 +vn 0.951286 -0.202239 0.232713 +vn 0.095441 -0.020302 0.995228 +vn 0.978148 0.207909 0.000000 +vn 0.913545 0.406737 0.000001 +vn 0.809017 0.587785 0.000001 +vn 0.669131 0.743145 0.000000 +vn 0.500000 0.866025 0.000000 +vn 0.309017 0.951057 0.000000 +vn 0.104528 0.994522 -0.000000 +vn -0.104528 0.994522 -0.000000 +vn -0.309017 0.951057 0.000000 +vn -0.500000 0.866025 0.000000 +vn -0.669130 0.743145 0.000000 +vn -0.809017 0.587785 0.000001 +vn -0.913545 0.406737 0.000001 +vn -0.978148 0.207911 0.000000 +vn -1.000000 -0.000001 0.000000 +vn -0.978148 -0.207911 -0.000000 +vn -0.927357 -0.374179 -0.000000 +vn -0.884337 -0.466849 0.000000 +vn -0.870820 -0.491601 0.000000 +vn -0.876648 -0.481132 0.000000 +vn -0.889184 -0.457551 0.000000 +vn -0.922137 -0.386863 0.000000 +vn -0.959312 -0.282347 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.959312 -0.282346 0.000000 +vn 0.922137 -0.386863 0.000000 +vn 0.889184 -0.457550 0.000000 +vn 0.876649 -0.481131 0.000000 +vn 0.870820 -0.491601 -0.000000 +vn 0.884337 -0.466848 -0.000000 +vn 0.927356 -0.374179 -0.000000 +vn 0.978148 -0.207911 0.000000 +vn 1.000000 -0.000002 0.000000 +vn 0.078458 0.034932 -0.996305 +vn 0.894183 0.398116 -0.204793 +vn 0.957417 0.203503 -0.204792 +vn 0.084006 0.017856 -0.996305 +vn 0.069480 0.050480 -0.996305 +vn 0.791870 0.575328 -0.204793 +vn 0.057467 0.063823 -0.996305 +vn 0.654948 0.727394 -0.204793 +vn 0.042941 0.074376 -0.996305 +vn 0.489403 0.847670 -0.204793 +vn 0.026539 0.081679 -0.996305 +vn 0.302467 0.930899 -0.204793 +vn 0.008977 0.085412 -0.996305 +vn 0.102313 0.973444 -0.204792 +vn -0.008977 0.085412 -0.996305 +vn -0.102313 0.973444 -0.204790 +vn -0.026539 0.081679 -0.996305 +vn -0.302467 0.930900 -0.204791 +vn -0.042941 0.074376 -0.996305 +vn -0.489403 0.847670 -0.204793 +vn -0.057467 0.063823 -0.996305 +vn -0.654948 0.727394 -0.204793 +vn -0.069480 0.050480 -0.996305 +vn -0.791870 0.575328 -0.204793 +vn -0.078458 0.034932 -0.996305 +vn -0.894183 0.398116 -0.204792 +vn -0.084006 0.017856 -0.996305 +vn -0.957416 0.203505 -0.204792 +vn -0.085883 -0.000000 -0.996305 +vn -0.978806 -0.000001 -0.204792 +vn -0.083965 -0.017859 -0.996309 +vn -0.957369 -0.203523 -0.204996 +vn -0.076222 -0.030773 -0.996616 +vn -0.907146 -0.366070 -0.207553 +vn -0.070178 -0.037054 -0.996846 +vn -0.864347 -0.456312 -0.211387 +vn -0.095209 -0.053749 -0.994005 +vn -0.850808 -0.480306 -0.213146 +vn -0.175626 -0.096388 -0.979727 +vn -0.856079 -0.469841 -0.215355 +vn -0.192436 -0.099020 -0.976301 +vn -0.868408 -0.446858 -0.214910 +vn -0.216924 -0.091000 -0.971938 +vn -0.899722 -0.377454 -0.219154 +vn -0.296084 -0.088284 -0.951073 +vn -0.938343 -0.276937 -0.206926 +vn 0.000000 -0.210055 -0.977690 +vn 0.000000 -0.978976 -0.203977 +vn 0.296084 -0.088284 -0.951073 +vn 0.938343 -0.276937 -0.206926 +vn 0.216924 -0.091000 -0.971938 +vn 0.899722 -0.377454 -0.219153 +vn 0.192436 -0.099020 -0.976301 +vn 0.868408 -0.446857 -0.214911 +vn 0.175626 -0.096387 -0.979727 +vn 0.856079 -0.469841 -0.215356 +vn 0.095209 -0.053749 -0.994005 +vn 0.850808 -0.480306 -0.213146 +vn 0.070179 -0.037054 -0.996846 +vn 0.864347 -0.456312 -0.211386 +vn 0.076222 -0.030773 -0.996616 +vn 0.907146 -0.366070 -0.207553 +vn 0.083965 -0.017859 -0.996309 +vn 0.957369 -0.203523 -0.204996 +vn 0.085882 -0.000000 -0.996305 +vn 0.978805 -0.000002 -0.204792 +vn -0.882917 -0.393100 0.256769 +vn -0.023365 -0.010403 0.999673 +vn -0.020691 -0.015033 0.999673 +vn -0.781892 -0.568079 0.256769 +vn -0.945354 -0.200939 0.256769 +vn -0.025017 -0.005317 0.999673 +vn -0.017113 -0.019006 0.999673 +vn -0.646697 -0.718229 0.256767 +vn -0.012788 -0.022149 0.999673 +vn -0.483237 -0.836990 0.256768 +vn -0.007903 -0.024324 0.999673 +vn -0.298656 -0.919170 0.256770 +vn -0.002673 -0.025436 0.999673 +vn -0.101024 -0.961179 0.256767 +vn 0.002673 -0.025436 0.999673 +vn 0.101023 -0.961179 0.256768 +vn 0.007903 -0.024324 0.999673 +vn 0.298656 -0.919170 0.256772 +vn 0.012788 -0.022149 0.999673 +vn 0.483237 -0.836990 0.256768 +vn 0.017113 -0.019006 0.999673 +vn 0.646697 -0.718230 0.256767 +vn 0.020691 -0.015033 0.999673 +vn 0.781893 -0.568079 0.256769 +vn 0.023364 -0.010403 0.999673 +vn 0.882917 -0.393100 0.256770 +vn 0.025017 -0.005317 0.999673 +vn 0.945353 -0.200941 0.256769 +vn 0.025576 0.000000 0.999673 +vn 0.966473 -0.000000 0.256770 +vn 0.024966 0.005307 0.999674 +vn 0.945353 0.200942 0.256770 +vn 0.023310 0.010378 0.999674 +vn 0.882917 0.393100 0.256770 +vn 0.017427 0.012662 0.999768 +vn 0.781893 0.568078 0.256770 +vn 0.014055 0.015610 0.999779 +vn 0.646696 0.718229 0.256769 +vn 0.013973 0.024202 0.999609 +vn 0.483237 0.836990 0.256768 +vn 0.011034 0.030304 0.999480 +vn 0.330670 0.908187 0.256621 +vn 0.008076 0.037996 0.999245 +vn 0.201447 0.947738 0.247409 +vn 0.004454 0.042376 0.999092 +vn 0.101023 0.961178 0.256769 +vn -0.000000 0.053494 0.998568 +vn 0.000000 0.968911 0.247410 +vn -0.004454 0.042376 0.999092 +vn -0.101023 0.961178 0.256769 +vn -0.008076 0.037996 0.999245 +vn -0.201447 0.947738 0.247410 +vn -0.011034 0.030304 0.999480 +vn -0.330671 0.908186 0.256622 +vn -0.013973 0.024202 0.999609 +vn -0.483237 0.836990 0.256769 +vn -0.014055 0.015610 0.999779 +vn -0.646697 0.718229 0.256770 +vn -0.017427 0.012662 0.999768 +vn -0.781893 0.568078 0.256769 +vn -0.023310 0.010378 0.999674 +vn -0.882917 0.393100 0.256768 +vn -0.024966 0.005307 0.999674 +vn -0.945353 0.200941 0.256769 +vn -0.025576 0.000000 0.999673 +vn -0.966473 0.000002 0.256769 +vn -0.781893 -0.568080 -0.256767 +vn -0.020453 -0.014860 -0.999680 +vn -0.023096 -0.010283 -0.999680 +vn -0.882917 -0.393100 -0.256769 +vn -0.646697 -0.718230 -0.256768 +vn -0.016917 -0.018788 -0.999680 +vn -0.024729 -0.005256 -0.999680 +vn -0.945354 -0.200939 -0.256769 +vn -0.483236 -0.836990 -0.256771 +vn -0.012641 -0.021895 -0.999680 +vn -0.298657 -0.919170 -0.256770 +vn -0.007813 -0.024044 -0.999680 +vn -0.101024 -0.961179 -0.256767 +vn -0.002643 -0.025143 -0.999680 +vn 0.101023 -0.961179 -0.256767 +vn 0.002643 -0.025143 -0.999680 +vn 0.298657 -0.919170 -0.256771 +vn 0.007813 -0.024044 -0.999680 +vn 0.483237 -0.836990 -0.256769 +vn 0.012641 -0.021895 -0.999680 +vn 0.646696 -0.718230 -0.256769 +vn 0.016917 -0.018788 -0.999680 +vn 0.781893 -0.568078 -0.256769 +vn 0.020453 -0.014860 -0.999680 +vn 0.882917 -0.393100 -0.256769 +vn 0.023096 -0.010283 -0.999680 +vn 0.945353 -0.200941 -0.256769 +vn 0.024729 -0.005256 -0.999680 +vn 0.966473 0.000000 -0.256769 +vn 0.025282 0.000000 -0.999680 +vn 0.945353 0.200941 -0.256769 +vn 0.024686 0.005247 -0.999681 +vn 0.882917 0.393100 -0.256770 +vn 0.023069 0.010271 -0.999681 +vn 0.781893 0.568078 -0.256770 +vn 0.017270 0.012547 -0.999772 +vn 0.646697 0.718229 -0.256769 +vn 0.013943 0.015485 -0.999783 +vn 0.483236 0.836990 -0.256769 +vn 0.013863 0.024011 -0.999616 +vn 0.330670 0.908186 -0.256622 +vn 0.010945 0.030061 -0.999488 +vn 0.201450 0.947738 -0.247410 +vn 0.008005 0.037662 -0.999259 +vn 0.101024 0.961178 -0.256769 +vn 0.004403 0.041886 -0.999113 +vn 0.000000 0.968911 -0.247410 +vn -0.000000 0.052681 -0.998612 +vn -0.101025 0.961178 -0.256770 +vn -0.004403 0.041886 -0.999113 +vn -0.201450 0.947737 -0.247410 +vn -0.008005 0.037662 -0.999259 +vn -0.330670 0.908186 -0.256623 +vn -0.010945 0.030061 -0.999488 +vn -0.483236 0.836990 -0.256770 +vn -0.013863 0.024011 -0.999616 +vn -0.646697 0.718229 -0.256770 +vn -0.013943 0.015485 -0.999783 +vn -0.781893 0.568079 -0.256769 +vn -0.017270 0.012547 -0.999772 +vn -0.882917 0.393100 -0.256769 +vn -0.023068 0.010271 -0.999681 +vn -0.945353 0.200941 -0.256769 +vn -0.024686 0.005247 -0.999681 +vn -0.966473 0.000002 -0.256769 +vn -0.025282 0.000000 -0.999680 +vn -0.913546 -0.406737 0.000000 +vn -0.978148 -0.207909 0.000000 +vn -0.809017 -0.587786 -0.000002 +vn -0.669131 -0.743145 -0.000004 +vn -0.500000 -0.866026 -0.000004 +vn -0.309017 -0.951057 -0.000004 +vn -0.104529 -0.994522 -0.000008 +vn 0.104528 -0.994522 -0.000006 +vn 0.309017 -0.951057 -0.000001 +vn 0.500000 -0.866026 -0.000002 +vn 0.669131 -0.743145 -0.000001 +vn 0.809017 -0.587785 0.000001 +vn 0.913546 -0.406736 0.000000 +vn 0.978148 -0.207912 0.000000 +vn 1.000000 0.000000 0.000000 +vn 0.978148 0.207912 0.000000 +vn 0.913546 0.406736 -0.000000 +vn 0.809017 0.587785 -0.000000 +vn 0.669131 0.743145 -0.000000 +vn 0.500000 0.866025 -0.000001 +vn 0.342127 0.939654 -0.000001 +vn 0.104528 0.994522 -0.000001 +vn 0.207911 0.978148 -0.000000 +vn -0.104528 0.994522 -0.000001 +vn 0.000000 1.000000 -0.000002 +vn -0.342128 0.939653 -0.000000 +vn -0.207911 0.978148 0.000000 +vn -0.500000 0.866025 -0.000000 +vn -0.669131 0.743145 0.000000 +vn -0.809017 0.587785 -0.000001 +vn -0.913545 0.406737 -0.000001 +vn -0.978148 0.207911 -0.000000 +vn -1.000000 0.000002 0.000000 +vn -0.978148 -0.207909 0.000000 +vn -0.913546 -0.406737 0.000000 +vn -0.809016 -0.587786 0.000002 +vn -0.669130 -0.743145 0.000002 +vn -0.500000 -0.866025 0.000002 +vn -0.309017 -0.951056 0.000004 +vn -0.104529 -0.994522 0.000008 +vn 0.104528 -0.994522 0.000006 +vn 0.309017 -0.951056 0.000000 +vn 0.500000 -0.866025 0.000000 +vn 0.669130 -0.743145 -0.000001 +vn 0.809017 -0.587785 -0.000001 +vn 0.913545 -0.406737 0.000000 +vn 0.978148 -0.207912 0.000000 +vn 1.000000 -0.000000 -0.000000 +vn 0.978148 0.207912 -0.000000 +vn 0.913545 0.406737 -0.000000 +vn 0.809017 0.587785 -0.000000 +vn 0.669131 0.743144 0.000000 +vn 0.500000 0.866026 0.000000 +vn 0.342127 0.939654 0.000000 +vn 0.207913 0.978147 -0.000001 +vn 0.104529 0.994522 -0.000002 +vn 0.000000 1.000000 -0.000002 +vn -0.104529 0.994522 -0.000002 +vn -0.207913 0.978147 -0.000001 +vn -0.342128 0.939653 0.000000 +vn -0.500000 0.866025 0.000000 +vn -0.669131 0.743145 0.000000 +vn -0.809017 0.587785 0.000000 +vn -0.913545 0.406737 0.000000 +vn -0.978148 0.207911 -0.000000 +vn -1.000000 0.000002 -0.000000 +vn -0.000000 0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn -0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn -0.000000 -0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +s 1 +g pCylinder1 +usemtl lambert2SG +f 1/103/1 2/105/2 3/1/3 +f 2/105/2 4/107/4 3/1/3 +f 4/107/4 5/109/5 3/1/3 +f 5/109/5 6/111/6 3/1/3 +f 6/111/6 7/113/7 3/1/3 +f 7/113/7 8/115/8 3/1/3 +f 8/115/8 9/117/9 3/1/3 +f 9/117/9 10/119/10 3/1/3 +f 10/119/10 11/121/11 3/1/3 +f 11/121/11 12/123/12 3/1/3 +f 12/123/12 13/125/13 3/1/3 +f 13/125/13 14/127/14 3/1/3 +f 14/127/14 15/129/15 3/1/3 +f 15/129/15 16/131/16 3/1/3 +f 16/131/16 17/133/17 3/1/3 +f 17/133/17 18/135/18 3/1/3 +f 18/135/18 19/137/19 3/1/3 +f 19/137/19 20/139/20 3/1/3 +f 20/139/20 21/141/21 3/1/3 +f 21/141/21 22/165/22 3/1/3 +f 3/1/3 23/143/23 24/163/24 +f 3/1/3 25/145/25 26/167/26 +f 3/1/3 27/147/27 28/149/28 +f 28/149/28 29/151/29 3/1/3 +f 29/151/29 30/153/30 3/1/3 +f 30/153/30 31/155/31 3/1/3 +f 31/155/31 32/157/32 3/1/3 +f 32/157/32 33/159/33 3/1/3 +f 33/159/33 34/161/34 3/1/3 +f 34/161/34 1/103/1 3/1/3 +f 24/163/24 25/145/25 3/1/3 +f 22/165/22 23/143/23 3/1/3 +f 26/167/26 27/147/27 3/1/3 +s 2 +f 68/227/35 70/2/36 69/169/37 +f 69/169/37 70/2/36 71/171/38 +f 71/171/38 70/2/36 72/173/39 +f 72/173/39 70/2/36 73/175/40 +f 73/175/40 70/2/36 74/177/41 +f 74/177/41 70/2/36 75/179/42 +f 75/179/42 70/2/36 76/181/43 +f 76/181/43 70/2/36 77/183/44 +f 77/183/44 70/2/36 78/185/45 +f 78/185/45 70/2/36 79/187/46 +f 79/187/46 70/2/36 80/189/47 +f 80/189/47 70/2/36 81/191/48 +f 81/191/48 70/2/36 82/193/49 +f 82/193/49 70/2/36 83/195/50 +f 83/195/50 70/2/36 84/197/51 +f 84/197/51 70/2/36 85/199/52 +f 85/199/52 70/2/36 86/201/53 +f 86/201/53 70/2/36 87/203/54 +f 87/203/54 70/2/36 88/205/55 +f 88/205/55 70/2/36 89/207/56 +f 70/2/36 91/209/57 90/231/58 +f 70/2/36 93/211/59 92/229/60 +f 70/2/36 95/213/61 94/233/62 +f 95/213/61 70/2/36 96/215/63 +f 96/215/63 70/2/36 97/217/64 +f 97/217/64 70/2/36 98/219/65 +f 98/219/65 70/2/36 99/221/66 +f 99/221/66 70/2/36 100/223/67 +f 100/223/67 70/2/36 101/225/68 +f 101/225/68 70/2/36 68/227/35 +f 91/209/57 70/2/36 92/229/60 +f 89/207/56 70/2/36 90/231/58 +f 93/211/59 70/2/36 94/233/62 +s 6 +f 102/290/69 103/3/70 105/4/71 104/292/72 +f 103/3/70 102/290/69 166/288/73 167/32/74 +f 104/292/72 105/4/71 107/5/75 106/234/76 +f 106/234/76 107/5/75 109/6/77 108/236/78 +f 108/236/78 109/6/77 111/7/79 110/238/80 +f 110/238/80 111/7/79 113/8/81 112/240/82 +f 112/240/82 113/8/81 115/9/83 114/242/84 +f 114/242/84 115/9/83 117/10/85 116/244/86 +f 116/244/86 117/10/85 119/11/87 118/246/88 +f 118/246/88 119/11/87 121/12/89 120/248/90 +f 120/248/90 121/12/89 123/13/91 122/250/92 +f 122/250/92 123/13/91 125/14/93 124/252/94 +f 124/252/94 125/14/93 127/15/95 126/254/96 +f 126/254/96 127/15/95 129/16/97 128/256/98 +f 128/256/98 129/16/97 131/17/99 130/258/100 +f 130/258/100 131/17/99 133/18/101 132/260/102 +f 132/260/102 133/18/101 135/19/103 134/262/104 +f 134/262/104 135/19/103 137/20/105 136/264/106 +f 136/264/106 137/20/105 139/21/107 138/266/108 +f 138/266/108 139/21/107 141/22/109 140/268/110 +f 140/268/110 141/22/109 143/23/111 142/270/112 +f 142/270/112 143/23/111 145/34/113 144/296/114 +f 144/296/114 145/34/113 147/24/115 146/273/116 +f 146/273/116 147/24/115 149/33/117 148/294/118 +f 148/294/118 149/33/117 151/25/119 150/275/120 +f 150/275/120 151/25/119 153/35/121 152/298/122 +f 152/298/122 153/35/121 155/26/123 154/277/124 +f 154/277/124 155/26/123 157/27/125 156/278/126 +f 156/278/126 157/27/125 159/28/127 158/280/128 +f 158/280/128 159/28/127 161/29/129 160/282/130 +f 160/282/130 161/29/129 163/30/131 162/284/132 +f 162/284/132 163/30/131 165/31/133 164/286/134 +f 164/286/134 165/31/133 167/32/74 166/288/73 +f 105/4/71 103/3/70 35/37/135 36/39/136 +f 107/5/75 105/4/71 36/39/136 37/41/137 +f 109/6/77 107/5/75 37/41/137 38/43/138 +f 111/7/79 109/6/77 38/43/138 39/45/139 +f 113/8/81 111/7/79 39/45/139 40/47/140 +f 115/9/83 113/8/81 40/47/140 41/49/141 +f 117/10/85 115/9/83 41/49/141 42/51/142 +f 119/11/87 117/10/85 42/51/142 43/53/143 +f 121/12/89 119/11/87 43/53/143 44/55/144 +f 123/13/91 121/12/89 44/55/144 45/57/145 +f 125/14/93 123/13/91 45/57/145 46/59/146 +f 127/15/95 125/14/93 46/59/146 47/61/147 +f 129/16/97 127/15/95 47/61/147 48/63/148 +f 131/17/99 129/16/97 48/63/148 49/65/149 +f 133/18/101 131/17/99 49/65/149 50/67/150 +f 135/19/103 133/18/101 50/67/150 51/69/151 +f 137/20/105 135/19/103 51/69/151 52/71/152 +f 139/21/107 137/20/105 52/71/152 53/73/153 +f 141/22/109 139/21/107 53/73/153 54/75/154 +f 143/23/111 141/22/109 54/75/154 55/77/155 +f 145/34/113 143/23/111 55/77/155 56/99/156 +f 149/33/117 147/24/115 57/79/157 58/97/158 +f 153/35/121 151/25/119 59/81/159 60/101/160 +f 157/27/125 155/26/123 61/83/161 62/85/162 +f 159/28/127 157/27/125 62/85/162 63/87/163 +f 161/29/129 159/28/127 63/87/163 64/89/164 +f 163/30/131 161/29/129 64/89/164 65/91/165 +f 165/31/133 163/30/131 65/91/165 66/93/166 +f 167/32/74 165/31/133 66/93/166 67/95/167 +f 103/3/70 167/32/74 67/95/167 35/37/135 +f 151/25/119 149/33/117 58/97/158 59/81/159 +f 147/24/115 145/34/113 56/99/156 57/79/157 +f 155/26/123 153/35/121 60/101/160 61/83/161 +f 168/300/168 169/36/169 233/94/170 232/358/171 +f 169/36/169 168/300/168 170/302/172 171/38/173 +f 171/38/173 170/302/172 172/304/174 173/40/175 +f 173/40/175 172/304/174 174/306/176 175/42/177 +f 175/42/177 174/306/176 176/308/178 177/44/179 +f 177/44/179 176/308/178 178/310/180 179/46/181 +f 179/46/181 178/310/180 180/312/182 181/48/183 +f 181/48/183 180/312/182 182/314/184 183/50/185 +f 183/50/185 182/314/184 184/316/186 185/52/187 +f 185/52/187 184/316/186 186/318/188 187/54/189 +f 187/54/189 186/318/188 188/320/190 189/56/191 +f 189/56/191 188/320/190 190/322/192 191/58/193 +f 191/58/193 190/322/192 192/324/194 193/60/195 +f 193/60/195 192/324/194 194/326/196 195/62/197 +f 195/62/197 194/326/196 196/328/198 197/64/199 +f 197/64/199 196/328/198 198/330/200 199/66/201 +f 199/66/201 198/330/200 200/332/202 201/68/203 +f 201/68/203 200/332/202 202/334/204 203/70/205 +f 203/70/205 202/334/204 204/336/206 205/72/207 +f 205/72/207 204/336/206 206/362/208 207/74/209 +f 207/74/209 206/362/208 208/339/210 209/76/211 +f 209/76/211 208/339/210 210/360/212 211/98/213 +f 211/98/213 210/360/212 212/341/214 213/78/215 +f 213/78/215 212/341/214 214/364/216 215/96/217 +f 215/96/217 214/364/216 216/343/218 217/80/219 +f 217/80/219 216/343/218 218/344/220 219/100/221 +f 219/100/221 218/344/220 220/346/222 221/82/223 +f 221/82/223 220/346/222 222/348/224 223/84/225 +f 223/84/225 222/348/224 224/350/226 225/86/227 +f 225/86/227 224/350/226 226/352/228 227/88/229 +f 227/88/229 226/352/228 228/354/230 229/90/231 +f 229/90/231 228/354/230 230/356/232 231/92/233 +f 231/92/233 230/356/232 232/358/171 233/94/170 +f 169/36/169 36/39/136 35/37/135 233/94/170 +f 171/38/173 37/41/137 36/39/136 169/36/169 +f 173/40/175 38/43/138 37/41/137 171/38/173 +f 175/42/177 39/45/139 38/43/138 173/40/175 +f 177/44/179 40/47/140 39/45/139 175/42/177 +f 179/46/181 41/49/141 40/47/140 177/44/179 +f 181/48/183 42/51/142 41/49/141 179/46/181 +f 183/50/185 43/53/143 42/51/142 181/48/183 +f 185/52/187 44/55/144 43/53/143 183/50/185 +f 187/54/189 45/57/145 44/55/144 185/52/187 +f 189/56/191 46/59/146 45/57/145 187/54/189 +f 191/58/193 47/61/147 46/59/146 189/56/191 +f 193/60/195 48/63/148 47/61/147 191/58/193 +f 195/62/197 49/65/149 48/63/148 193/60/195 +f 197/64/199 50/67/150 49/65/149 195/62/197 +f 199/66/201 51/69/151 50/67/150 197/64/199 +f 201/68/203 52/71/152 51/69/151 199/66/201 +f 203/70/205 53/73/153 52/71/152 201/68/203 +f 205/72/207 54/75/154 53/73/153 203/70/205 +f 207/74/209 55/77/155 54/75/154 205/72/207 +f 209/76/211 56/99/156 55/77/155 207/74/209 +f 213/78/215 58/97/158 57/79/157 211/98/213 +f 217/80/219 60/101/160 59/81/159 215/96/217 +f 221/82/223 62/85/162 61/83/161 219/100/221 +f 223/84/225 63/87/163 62/85/162 221/82/223 +f 225/86/227 64/89/164 63/87/163 223/84/225 +f 227/88/229 65/91/165 64/89/164 225/86/227 +f 229/90/231 66/93/166 65/91/165 227/88/229 +f 231/92/233 67/95/167 66/93/166 229/90/231 +f 233/94/170 35/37/135 67/95/167 231/92/233 +f 215/96/217 59/81/159 58/97/158 213/78/215 +f 211/98/213 57/79/157 56/99/156 209/76/211 +f 219/100/221 61/83/161 60/101/160 217/80/219 +f 234/102/234 235/235/235 237/237/236 236/104/237 +f 235/235/235 234/102/234 298/160/238 299/293/239 +f 236/104/237 237/237/236 239/239/240 238/106/241 +f 238/106/241 239/239/240 241/241/242 240/108/243 +f 240/108/243 241/241/242 243/243/244 242/110/245 +f 242/110/245 243/243/244 245/245/246 244/112/247 +f 244/112/247 245/245/246 247/247/248 246/114/249 +f 246/114/249 247/247/248 249/249/250 248/116/251 +f 248/116/251 249/249/250 251/251/252 250/118/253 +f 250/118/253 251/251/252 253/253/254 252/120/255 +f 252/120/255 253/253/254 255/255/256 254/122/257 +f 254/122/257 255/255/256 257/257/258 256/124/259 +f 256/124/259 257/257/258 259/259/260 258/126/261 +f 258/126/261 259/259/260 261/261/262 260/128/263 +f 260/128/263 261/261/262 263/263/264 262/130/265 +f 262/130/265 263/263/264 265/265/266 264/132/267 +f 264/132/267 265/265/266 267/267/268 266/134/269 +f 266/134/269 267/267/268 269/269/270 268/136/271 +f 268/136/271 269/269/270 271/271/272 270/138/273 +f 270/138/273 271/271/272 273/297/274 272/140/275 +f 272/140/275 273/297/274 275/272/276 274/164/277 +f 274/164/277 275/272/276 277/295/278 276/142/279 +f 276/142/279 277/295/278 279/274/280 278/162/281 +f 278/162/281 279/274/280 281/299/282 280/144/283 +f 280/144/283 281/299/282 283/276/284 282/166/285 +f 282/166/285 283/276/284 285/279/286 284/146/287 +f 284/146/287 285/279/286 287/281/288 286/148/289 +f 286/148/289 287/281/288 289/283/290 288/150/291 +f 288/150/291 289/283/290 291/285/292 290/152/293 +f 290/152/293 291/285/292 293/287/294 292/154/295 +f 292/154/295 293/287/294 295/289/296 294/156/297 +f 294/156/297 295/289/296 297/291/298 296/158/299 +f 296/158/299 297/291/298 299/293/239 298/160/238 +f 300/172/300 301/301/301 303/359/302 302/170/303 +f 301/301/301 300/172/300 304/174/304 305/303/305 +f 302/170/303 303/359/302 365/357/306 364/168/307 +f 305/303/305 304/174/304 306/176/308 307/305/309 +f 307/305/309 306/176/308 308/178/310 309/307/311 +f 309/307/311 308/178/310 310/180/312 311/309/313 +f 311/309/313 310/180/312 312/182/314 313/311/315 +f 313/311/315 312/182/314 314/184/316 315/313/317 +f 315/313/317 314/184/316 316/186/318 317/315/319 +f 317/315/319 316/186/318 318/188/320 319/317/321 +f 319/317/321 318/188/320 320/190/322 321/319/323 +f 321/319/323 320/190/322 322/192/324 323/321/325 +f 323/321/325 322/192/324 324/194/326 325/323/327 +f 325/323/327 324/194/326 326/196/328 327/325/329 +f 327/325/329 326/196/328 328/198/330 329/327/331 +f 329/327/331 328/198/330 330/200/332 331/329/333 +f 331/329/333 330/200/332 332/202/334 333/331/335 +f 333/331/335 332/202/334 334/204/336 335/333/337 +f 335/333/337 334/204/336 336/206/338 337/335/339 +f 337/335/339 336/206/338 338/230/340 339/337/341 +f 339/337/341 338/230/340 340/208/342 341/363/343 +f 341/363/343 340/208/342 342/228/344 343/338/345 +f 343/338/345 342/228/344 344/210/346 345/361/347 +f 345/361/347 344/210/346 346/232/348 347/340/349 +f 347/340/349 346/232/348 348/212/350 349/365/351 +f 349/365/351 348/212/350 350/214/352 351/342/353 +f 351/342/353 350/214/352 352/216/354 353/345/355 +f 353/345/355 352/216/354 354/218/356 355/347/357 +f 355/347/357 354/218/356 356/220/358 357/349/359 +f 357/349/359 356/220/358 358/222/360 359/351/361 +f 359/351/361 358/222/360 360/224/362 361/353/363 +f 361/353/363 360/224/362 362/226/364 363/355/365 +f 363/355/365 362/226/364 364/168/307 365/357/306 +f 298/366/238 234/367/234 2/368/366 1/369/367 +f 234/367/234 236/370/237 4/371/368 2/368/366 +f 236/370/237 238/372/241 5/373/369 4/371/368 +f 238/372/241 240/374/243 6/375/370 5/373/369 +f 240/374/243 242/376/245 7/377/371 6/375/370 +f 242/376/245 244/378/247 8/379/372 7/377/371 +f 244/378/247 246/380/249 9/381/373 8/379/372 +f 246/380/249 248/382/251 10/383/374 9/381/373 +f 248/382/251 250/384/253 11/385/375 10/383/374 +f 250/384/253 252/386/255 12/387/376 11/385/375 +f 252/386/255 254/388/257 13/389/377 12/387/376 +f 254/388/257 256/390/259 14/391/378 13/389/377 +f 256/390/259 258/392/261 15/393/379 14/391/378 +f 258/392/261 260/394/263 16/395/380 15/393/379 +f 260/394/263 262/396/265 17/397/381 16/395/380 +f 262/396/265 264/398/267 18/399/382 17/397/381 +f 264/398/267 266/400/269 19/401/383 18/399/382 +f 266/400/269 268/402/271 20/403/384 19/401/383 +f 268/402/271 270/404/273 21/405/385 20/403/384 +f 270/404/273 272/406/275 22/407/386 21/405/385 +f 274/408/277 276/500/279 24/410/387 23/411/388 +f 278/412/281 280/413/283 26/414/389 25/415/390 +f 282/416/285 284/417/287 28/418/391 27/419/392 +f 284/417/287 286/420/289 29/421/393 28/418/391 +f 286/420/289 288/422/291 30/423/394 29/421/393 +f 288/422/291 290/424/293 31/425/395 30/423/394 +f 290/424/293 292/426/295 32/427/396 31/425/395 +f 292/426/295 294/428/297 33/429/397 32/427/396 +f 294/428/297 296/430/299 34/431/398 33/429/397 +f 296/430/299 298/366/238 1/369/367 34/431/398 +f 276/409/279 278/412/281 25/415/390 24/501/387 +f 272/406/275 274/408/277 23/411/388 22/407/386 +f 280/413/283 282/416/285 27/419/392 26/414/389 +f 364/432/307 68/433/399 69/434/400 302/435/303 +f 302/435/303 69/434/400 71/436/401 300/437/300 +f 300/437/300 71/436/401 72/438/402 304/439/304 +f 304/439/304 72/438/402 73/440/403 306/441/308 +f 306/441/308 73/440/403 74/442/404 308/443/310 +f 308/443/310 74/442/404 75/444/405 310/445/312 +f 310/445/312 75/444/405 76/446/406 312/447/314 +f 312/447/314 76/446/406 77/448/407 314/449/316 +f 314/449/316 77/448/407 78/450/408 316/451/318 +f 316/451/318 78/450/408 79/452/409 318/453/320 +f 318/453/320 79/452/409 80/454/410 320/455/322 +f 320/455/322 80/454/410 81/456/411 322/457/324 +f 322/457/324 81/456/411 82/458/412 324/459/326 +f 324/459/326 82/458/412 83/460/413 326/461/328 +f 326/461/328 83/460/413 84/462/414 328/463/330 +f 328/463/330 84/462/414 85/464/415 330/465/332 +f 330/465/332 85/464/415 86/466/416 332/467/334 +f 332/467/334 86/466/416 87/468/417 334/469/336 +f 334/469/336 87/468/417 88/470/418 336/471/338 +f 336/471/338 88/470/418 89/472/419 338/473/340 +f 340/474/342 90/475/420 91/476/421 342/477/344 +f 344/478/346 92/479/422 93/498/423 346/481/348 +f 348/482/350 94/483/424 95/484/425 350/485/352 +f 350/485/352 95/484/425 96/486/426 352/487/354 +f 352/487/354 96/486/426 97/488/427 354/489/356 +f 354/489/356 97/488/427 98/490/428 356/491/358 +f 356/491/358 98/490/428 99/492/429 358/493/360 +f 358/493/360 99/492/429 100/494/430 360/495/362 +f 360/495/362 100/494/430 101/496/431 362/497/364 +f 362/497/364 101/496/431 68/433/399 364/432/307 +f 342/477/344 91/476/421 92/479/422 344/478/346 +f 338/473/340 89/472/419 90/475/420 340/474/342 +f 346/499/348 93/480/423 94/483/424 348/482/350 +f 104/292/72 106/234/76 237/237/236 235/235/235 +f 106/234/76 108/236/78 239/239/240 237/237/236 +f 108/236/78 110/238/80 241/241/242 239/239/240 +f 110/238/80 112/240/82 243/243/244 241/241/242 +f 112/240/82 114/242/84 245/245/246 243/243/244 +f 114/242/84 116/244/86 247/247/248 245/245/246 +f 116/244/86 118/246/88 249/249/250 247/247/248 +f 118/246/88 120/248/90 251/251/252 249/249/250 +f 120/248/90 122/250/92 253/253/254 251/251/252 +f 122/250/92 124/252/94 255/255/256 253/253/254 +f 124/252/94 126/254/96 257/257/258 255/255/256 +f 126/254/96 128/256/98 259/259/260 257/257/258 +f 128/256/98 130/258/100 261/261/262 259/259/260 +f 130/258/100 132/260/102 263/263/264 261/261/262 +f 132/260/102 134/262/104 265/265/266 263/263/264 +f 134/262/104 136/264/106 267/267/268 265/265/266 +f 136/264/106 138/266/108 269/269/270 267/267/268 +f 138/266/108 407/543/432 271/271/272 269/269/270 +f 407/543/432 408/544/433 273/297/274 271/271/272 +f 275/272/276 409/545/434 410/546/435 277/295/278 +f 279/274/280 411/547/436 412/548/437 281/299/282 +f 283/276/284 413/549/438 414/550/439 285/279/286 +f 414/550/439 415/551/440 287/281/288 285/279/286 +f 415/551/440 158/280/128 289/283/290 287/281/288 +f 158/280/128 160/282/130 291/285/292 289/283/290 +f 160/282/130 162/284/132 293/287/294 291/285/292 +f 162/284/132 164/286/134 295/289/296 293/287/294 +f 164/286/134 166/288/73 297/291/298 295/289/296 +f 166/288/73 102/290/69 299/293/239 297/291/298 +f 102/290/69 104/292/72 235/235/235 299/293/239 +f 410/546/435 411/547/436 279/274/280 277/295/278 +f 408/544/433 409/545/434 275/272/276 273/297/274 +f 412/548/437 413/549/438 283/276/284 281/299/282 +f 168/300/168 303/359/302 301/301/301 170/302/172 +f 170/302/172 301/301/301 305/303/305 172/304/174 +f 172/304/174 305/303/305 307/305/309 174/306/176 +f 174/306/176 307/305/309 309/307/311 176/308/178 +f 176/308/178 309/307/311 311/309/313 178/310/180 +f 178/310/180 311/309/313 313/311/315 180/312/182 +f 180/312/182 313/311/315 315/313/317 182/314/184 +f 182/314/184 315/313/317 317/315/319 184/316/186 +f 184/316/186 317/315/319 319/317/321 186/318/188 +f 186/318/188 319/317/321 321/319/323 188/320/190 +f 188/320/190 321/319/323 323/321/325 190/322/192 +f 190/322/192 323/321/325 325/323/327 192/324/194 +f 192/324/194 325/323/327 327/325/329 194/326/196 +f 194/326/196 327/325/329 329/327/331 196/328/198 +f 196/328/198 329/327/331 331/329/333 198/330/200 +f 198/330/200 331/329/333 333/331/335 200/332/202 +f 200/332/202 333/331/335 335/333/337 202/334/204 +f 202/334/204 335/333/337 337/335/339 390/526/441 +f 389/525/442 390/526/441 337/335/339 339/337/341 +f 341/363/343 343/338/345 387/523/443 388/524/444 +f 345/361/347 347/340/349 385/521/445 386/522/446 +f 349/365/351 351/342/353 383/519/447 384/520/448 +f 382/518/449 383/519/447 351/342/353 353/345/355 +f 222/348/224 382/518/449 353/345/355 355/347/357 +f 222/348/224 355/347/357 357/349/359 224/350/226 +f 224/350/226 357/349/359 359/351/361 226/352/228 +f 226/352/228 359/351/361 361/353/363 228/354/230 +f 228/354/230 361/353/363 363/355/365 230/356/232 +f 230/356/232 363/355/365 365/357/306 232/358/171 +f 232/358/171 365/357/306 303/359/302 168/300/168 +f 386/522/446 387/523/443 343/338/345 345/361/347 +f 388/524/444 389/525/442 339/337/341 341/363/343 +f 384/520/448 385/521/445 347/340/349 349/365/351 +f 366/502/450 214/364/216 212/341/214 +f 210/360/212 366/502/450 212/341/214 +f 214/364/216 367/503/451 216/343/218 +f 368/504/452 367/503/451 214/364/216 366/502/450 +f 210/360/212 369/505/453 368/504/452 366/502/450 +f 208/339/210 369/505/453 210/360/212 +f 370/506/454 218/344/220 216/343/218 +f 216/343/218 367/503/451 371/507/455 370/506/454 +f 372/508/456 371/507/455 367/503/451 368/504/452 +f 368/504/452 369/505/453 373/509/457 372/508/456 +f 374/510/458 373/509/457 369/505/453 208/339/210 +f 206/362/208 374/510/458 208/339/210 +f 218/344/220 375/511/459 220/346/222 +f 376/512/460 375/511/459 218/344/220 370/506/454 +f 370/506/454 371/507/455 377/513/461 376/512/460 +f 378/514/462 377/513/461 371/507/455 372/508/456 +f 372/508/456 373/509/457 379/515/463 378/514/462 +f 380/516/464 379/515/463 373/509/457 374/510/458 +f 206/362/208 381/517/465 380/516/464 374/510/458 +f 204/336/206 381/517/465 206/362/208 +f 220/346/222 382/518/449 222/348/224 +f 220/346/222 375/511/459 383/519/447 382/518/449 +f 384/520/448 383/519/447 375/511/459 376/512/460 +f 376/512/460 377/513/461 385/521/445 384/520/448 +f 386/522/446 385/521/445 377/513/461 378/514/462 +f 378/514/462 379/515/463 387/523/443 386/522/446 +f 388/524/444 387/523/443 379/515/463 380/516/464 +f 380/516/464 381/517/465 389/525/442 388/524/444 +f 204/336/206 390/526/441 389/525/442 381/517/465 +f 202/334/204 390/526/441 204/336/206 +f 146/273/116 148/294/118 391/527/466 +f 150/275/120 391/527/466 148/294/118 +f 392/528/467 144/296/114 146/273/116 +f 146/273/116 391/527/466 393/529/468 392/528/467 +f 394/530/469 393/529/468 391/527/466 150/275/120 +f 150/275/120 152/298/122 394/530/469 +f 142/270/112 144/296/114 395/531/470 +f 396/532/471 395/531/470 144/296/114 392/528/467 +f 392/528/467 393/529/468 397/533/472 396/532/471 +f 398/534/473 397/533/472 393/529/468 394/530/469 +f 394/530/469 152/298/122 399/535/474 398/534/473 +f 154/277/124 399/535/474 152/298/122 +f 140/268/110 142/270/112 400/536/475 +f 142/270/112 395/531/470 401/537/476 400/536/475 +f 402/538/477 401/537/476 395/531/470 396/532/471 +f 396/532/471 397/533/472 403/539/478 402/538/477 +f 404/540/479 403/539/478 397/533/472 398/534/473 +f 398/534/473 399/535/474 405/541/480 404/540/479 +f 406/542/481 405/541/480 399/535/474 154/277/124 +f 154/277/124 156/278/126 406/542/481 +f 138/266/108 140/268/110 407/543/432 +f 140/268/110 400/536/475 408/544/433 407/543/432 +f 400/536/475 401/537/476 409/545/434 408/544/433 +f 410/546/435 409/545/434 401/537/476 402/538/477 +f 402/538/477 403/539/478 411/547/436 410/546/435 +f 412/548/437 411/547/436 403/539/478 404/540/479 +f 404/540/479 405/541/480 413/549/438 412/548/437 +f 414/550/439 413/549/438 405/541/480 406/542/481 +f 406/542/481 156/278/126 415/551/440 414/550/439 +f 156/278/126 158/280/128 415/551/440 diff --git a/Lib/mesh-manager.js/src/mesh-manager.js b/Lib/mesh-manager.js/src/mesh-manager.js index d90a646..b99ba77 100644 --- a/Lib/mesh-manager.js/src/mesh-manager.js +++ b/Lib/mesh-manager.js/src/mesh-manager.js @@ -28,8 +28,169 @@ var PlacenoteMesh = (function () { this.readyForRaycast = true; this.lastRaycastPoint; this.logging = false; + this.meshMetadata = null; + this.NotesArray = []; + this.RoomsArray = []; + this.meshObj = null; + } + /** + * @desc HELPER METHOD: Retrieves mesh metadata. + * Makes Http request to get metadata + */ + PlacenoteMesh.prototype._getMeshMetadata = function () { + const Http = new XMLHttpRequest(); + const url = 'https://us-central1-placenote-sdk.cloudfunctions.net/getMetadata'; + var apiKeyVal = document.getElementById('apikey').value; + var mapIdVal = document.getElementById('mapid').value; + Http.open("GET", url, true); + Http.setRequestHeader('APIKEY', apiKeyVal); + Http.setRequestHeader('placeid', mapIdVal); + Http.send(); + Http.onreadystatechange = (e) => { + const jsonRes = JSON.parse(Http.response); + this.meshMetadata = jsonRes; + document.getElementById("navbarheader").innerHTML = jsonRes.metadata.name; // Add mesh name to nav bar + if (!jsonRes.metadata.userdata) { return; } + // Loops through NotesArray to populate scene + if (jsonRes.metadata.userdata.notesList) { + this.NotesArray = jsonRes.metadata.userdata.notesList; + this.NotesArray.forEach((noteObj) => { + // Loads note markers and note labels into the scene + var mtlLoader = new Three.MTLLoader(); + mtlLoader.load( 'Lib/mesh-manager.js/marker-pin-obj/Pin.mtl', function( materials ) { + materials.preload(); + var loader = new Three.OBJLoader(); + loader.setMaterials( materials ) + // This function is called on successful load + function callbackOnLoad ( obj ) { + // This will prevent duplicate scene children + if (scene.getObjectByName(noteObj.noteText + " " + noteObj.id)) { + return; + } + obj.children[0].material = new Three.MeshBasicMaterial( {color: 0x1e90ff} ); // Sets object material to blue (temporary solution to Pin.mtl issue) + obj.scale.set(0.01,0.01,0.01); // Scales the object size down to fit the mesh + obj.className = "noteMarker"; + obj.name = noteObj.noteText + " " + noteObj.id; // Adds unique id stored in metadata to object name to easily deal with deletion and editing + obj.userData = noteObj; + obj.position.set(noteObj.px,noteObj.py,noteObj.pz); + markers.push(obj); // Adds to markers array defined in index.js + + var text = document.createElement( 'div' ); + text.className = 'labelText'; + text.textContent = noteObj.noteText; + var label = new Three.CSS2DObject( text ); + obj.add( label ); + scene.add( obj ); + } + loader.load('Lib/mesh-manager.js/marker-pin-obj/marker.obj', callbackOnLoad, null, null, null ); + }); + }); + } + // Loops through RoomsArray to populate scene + if (jsonRes.metadata.userdata.roomsList) { + this.RoomsArray = jsonRes.metadata.userdata.roomsList; + this.RoomsArray.forEach((roomObj) => { + // This will prevent duplicate scene children + if (scene.getObjectByName(roomObj.roomName + " " + roomObj.id)) { return; } + + // Add room marker and room label to scene + var geometry = new Three.RingGeometry( 0.02, 0.08, 32 ); + geometry.rotateX(Math.PI/2); + var material = new Three.MeshBasicMaterial( { color: 0x00FF7F, side: Three.DoubleSide } ); + var obj = new Three.Mesh( geometry, material ); + obj.position.set(roomObj.px, roomObj.py + 0.1, roomObj.pz); + obj.className = "roomMarker"; + obj.name = roomObj.roomName + " " + roomObj.id; // Adds unique id stored in metadata to object name to easily deal with deletion and editing + var text = document.createElement( 'div' ); + text.className = 'labelText'; + text.textContent = roomObj.roomName; + var label = new Three.CSS2DObject( text ); + obj.add( label ); + scene.add( obj ); + + // Update footer with room images + var column = document.createElement('div'); + column.className = "imagecolumn"; + var img = document.createElement('input'); + img.type = "image"; + img.className = "footerimage"; + img.onclick = function () { + moveCameraToRoom(roomObj); + } + img.name = roomObj.roomName; + img.src = roomObj.imageUrl; + var imgText = document.createElement('div'); + imgText.innerHTML = roomObj.roomName; + column.appendChild(img); + column.appendChild(imgText); + document.getElementById("imagerow").appendChild(column); + }); + } + return this.meshMetadata; + } + }; + + /** + * @desc HELPER METHOD: Sets mesh metadata. + * Makes Http request to set metadata + */ + PlacenoteMesh.prototype._setMeshMetadata = function (data, deleteNote) { + const Http = new XMLHttpRequest(); + const url = 'https://us-central1-placenote-sdk.cloudfunctions.net/setMetadata'; + var apiKeyVal = document.getElementById('apikey').value; + var mapIdVal = document.getElementById('mapid').value; + Http.open("POST", url, true); + Http.setRequestHeader('APIKEY', apiKeyVal); + Http.setRequestHeader('placeid', mapIdVal); + + Http.send(JSON.stringify(data)); + Swal.fire({ + title: 'Saving Changes...', + allowOutsideClick: false, + allowEscapeKey: false, + allowEnterKey: false, + onOpen: () => { + Swal.showLoading(); + } + }) + Http.onreadystatechange = (e) => { + if (Http.readyState == 4 && Http.status == 200) { + this.meshMetadata = data; + if (deleteNote) { + Swal.fire({ + icon: 'success', + text: 'Note has been deleted!', + }); + } + else { + Swal.close(); + } + } + if (Http.status == 400) { + Swal.fire({ + icon: 'error', + text: "'Oops...', 'Something went wrong!', 'error'", + }); + } + } + } + /** + * @desc HELPER METHOD: Calculates centre of mesh. + * Sets control target/camera orbit on the center point. + */ + PlacenoteMesh.prototype._setCameraOrbitOnCenter = function () { + var box = new Three.BoxHelper( this.meshObj, 0xffff00 ); + var middle = new Three.Vector3(); + var geometry = box.geometry; + geometry.computeBoundingBox(); + middle.x = (geometry.boundingBox.max.x + geometry.boundingBox.min.x) / 2; + middle.y = (geometry.boundingBox.max.y + geometry.boundingBox.min.y) / 2; + middle.z = (geometry.boundingBox.max.z + geometry.boundingBox.min.z) / 2; + box.localToWorld( middle ); + controls.target.set(middle.x,middle.y,middle.z); + controls.update(); + return middle; } - /** * @desc HELPER METHOD: initializes mesh for clickety click. * Makes Http request to download dataset.json @@ -184,11 +345,259 @@ xhr.send(); const intersects = this.raycaster.intersectObjects( scene.children, true); const scope = this; - for ( var i = 0; i < intersects.length; i++ ) { - if (scope.readyForRaycast && intersects[i].object.name == 'PlacenoteMesh') { // Take first intersection with mesh + for (var i = 0; i < intersects.length; i++) { + // Checks if raycast hits either the mesh or an existing note marker + if (scope.readyForRaycast && (intersects[i].object.name == 'PlacenoteMesh' || intersects[i].object.parent.className == 'noteMarker')) { + var noteObj = intersects[i].object; + delete this.meshMetadata.metadata.created; // Removes parameter so valid metadata is passed + let meshMetadata = this.meshMetadata; + + // Logic if raycast hits an existing object + if (intersects[i].object.parent.className == 'noteMarker') { + // Changes color of object when clicked on + intersects[i].object.material = new Three.MeshBasicMaterial( {color: 0xFFFF00} ); + // Modal to enter note text + Swal.fire({ + title: 'Edit Note!', + text: 'Enter note text here:', + input: 'text', + showCancelButton: true, + cancelButtonText: "Delete note", + confirmButtonText: "Save note info", + inputValue: noteObj.parent.userData.noteText, // Edit existing note text for that object + allowOutsideClick: false, + inputValidator: (noteText) => { + if(!noteText){ + return 'You need to enter text!'; + } + if( noteText.length > 100 ){ + return 'You have exceeded 100 characters'; + } + } + }).then(function(noteText) { + // Logic for delete button on edit popup + if (noteText.dismiss == "cancel") { + // Modifies notes list by removing the note being deleted from the array + scope.NotesArray.forEach((note) => { + // Compares note id values, which prevents deletion errors when multiple notes have the same note text + if (note.id == noteObj.parent.userData.id) { + let index = meshMetadata.metadata.userdata.notesList.indexOf(note); + meshMetadata.metadata.userdata.notesList.splice(index, 1); + meshMetadata.metadata.userdata.notesList = scope.NotesArray; + scope._setMeshMetadata(meshMetadata, true); + } + }) + // Removes note cube and note label from the scene + noteObj.parent.remove(noteObj.parent.children[1]); + scene.remove(scene.getObjectById(noteObj.parent.id)); + } + + // Logic for saving edited note information + else { + scope.NotesArray.forEach((note) => { + // Compares ID values stored in metadata, which helps with dealing with multiple notes with same text + if (note.id == noteObj.parent.userData.id) { + note.noteText = noteText.value; + noteObj.parent.userData.noteText = noteText.value; + noteObj.parent.name = noteText.value; + } + }) + // Update local array and call setMetadata endpoint + meshMetadata.metadata.userdata.notesList = scope.NotesArray; + scope._setMeshMetadata(meshMetadata, false); + + // Remove label for the note + noteObj.parent.remove(noteObj.parent.children[1]); + + // Create and add new label for note + var text = document.createElement( 'div' ); + text.className = 'labelText'; + text.textContent = noteText.value; + + var label = new Three.CSS2DObject( text ); + noteObj.parent.add( label ); + } + }); + } + // Logic if raycast hits the mesh + if (intersects[i].object.name == 'PlacenoteMesh') { + // Update the target for OrbitControls and move camera closer to point + var point = intersects[i].point; + var vector = new Three.Vector3(controls.object.position.x, controls.object.position.y, controls.object.position.z); + controls.target.set(point.x,point.y,point.z); + var distance = vector.distanceTo(point) - 2.5; + camera.translateZ(-distance); + + Swal.fire({ + title: 'Select a marker!', + input: 'select', + inputOptions: { + noteMarker: 'Notes', + roomMarker: 'Rooms' + }, + inputPlaceholder: 'Choose one...', + showCancelButton: true, + inputValidator: (value) => { + return new Promise((resolve) => { + if (value === '') { resolve(); } + else if ( value === 'noteMarker') { + resolve(); + // Modal to enter note text + Swal.fire({ + title: 'Create a Note!', + text: 'Enter note text here:', + input: 'text', + showCancelButton: true, + cancelButtonText: "Cancel", + confirmButtonText: "Save note info", + allowOutsideClick: false, + inputValidator: (noteText) => { + if(!noteText){ + return 'You need to enter text!'; + } + if( noteText.length > 100 ){ + return 'You have exceeded 100 characters'; + } + }, + preConfirm: function(noteText) { + // Add marker at raycast point + var mtlLoader = new Three.MTLLoader(); + mtlLoader.load( 'Lib/mesh-manager.js/marker-pin-obj/Pin.mtl', function( materials ) { + materials.preload(); + var loader = new Three.OBJLoader(); + loader.setMaterials( materials ) + // This function is called on successful load + function callbackOnLoad ( obj ) { + var noteInfo = new NoteInfo(point.x, point.y, point.z, noteText, obj.id); // Class defined in index.js + const location = new MapLocation(0,0,0); // Class defined in index.js + scope.NotesArray.push(noteInfo); + let notesList = {notesList: scope.NotesArray, roomsList: scope.RoomsArray}; + let data = new MapMetadataSettable(meshMetadata.metadata.name, location, notesList); // Class defined in index.js + scope._setMeshMetadata({metadata: data}, false); + + obj.scale.set(0.01,0.01,0.01); + obj.className = "noteMarker"; + obj.children[0].material = new Three.MeshBasicMaterial( {color: 0x1e90ff} ); + obj.name = noteText + " " + obj.id; // Adds unique id stored in metadata to object name to easily deal with deletion and editing + obj.userData = noteInfo; + obj.position.set(point.x, point.y, point.z); + markers.push(obj); // Adds to markers array defined in index.js + // If label toggle is on, add the label to the scene + if (isLabelVisible) { + var text = document.createElement( 'div' ); + text.className = 'labelText'; + text.textContent = noteText; + var label = new Three.CSS2DObject( text ); + obj.add( label ); + } + scene.add( obj ); + } + loader.load('Lib/mesh-manager.js/marker-pin-obj/marker.obj', callbackOnLoad, null, null, null ); + }); + + } + }); + } + else if (value === 'roomMarker') { + resolve(); + // Modal to enter note text + Swal.mixin({ + input: 'text', + showCancelButton: true, + cancelButtonText: "Cancel", + confirmButtonText: "Next", + allowOutsideClick: false, + progressSteps: ['1', '2', '3'], + }).queue([ + { + title: 'Mark a Room!', + text: 'Enter a room name', + inputValidator: (roomName) => { + if(!roomName){ + return 'You need to enter text!'; + } + if( roomName.length > 50 ){ + return 'You have exceeded 50 characters'; + } + }, + }, + { + title: 'Add an image!', + text: 'Enter a URL for the image' + }, + { + title: 'Add a description!', + text: 'Enter a short description for the room', + inputValidator: (roomDescription) => { + if(!roomDescription){ + return 'You need to enter text!'; + } + if( roomDescription.length > 200 ){ + return 'You have exceeded 200 characters'; + } + }, + }, + ]).then((roomInfoArray) => { + roomInfoArray = roomInfoArray.value; + var geometry = new Three.RingGeometry( 0.02, 0.08, 32 ); + geometry.rotateX(Math.PI/2); + var material = new Three.MeshBasicMaterial( { color: 0x00FF7F, side: Three.DoubleSide } ); + var obj = new Three.Mesh( geometry, material ); + obj.position.set(point.x, point.y + 0.1, point.z); + obj.className = "roomMarker"; + obj.name = roomInfoArray[0] + " " + obj.id; // Adds unique id stored in metadata to object name to easily deal with deletion and editing + var text = document.createElement( 'div' ); + text.className = 'labelText'; + text.textContent = roomInfoArray[0]; + var label = new Three.CSS2DObject( text ); + obj.add( label ); + scene.add( obj ); + + // Update panel with room name, image and description + document.getElementById("navbarheader").innerHTML = roomInfoArray[0]; // Add mesh name to nav bar + document.getElementById('navimage').src = roomInfoArray[1]; + document.getElementById('navimage').style.display = "block"; + document.getElementById('navimagedescription').innerHTML = roomInfoArray[2]; + document.getElementById('navimagedescription').style.display = "block"; + + // Set metdadata with new data + var roomInfo = new RoomInfo(point.x, point.y, point.z, roomInfoArray[0], obj.id, roomInfoArray[1], roomInfoArray[2]); // Class defined in index.js + const location = new MapLocation(0,0,0); // Class defined in index.js + + scope.RoomsArray.push(roomInfo); + let roomsList = {roomsList: scope.RoomsArray, notesList: scope.NotesArray}; + let data = new MapMetadataSettable(meshMetadata.metadata.name, location, roomsList); // Class defined in index.js + scope._setMeshMetadata({metadata: data}, false); + + // Update footer with room images + var column = document.createElement('div'); + column.className = "imagecolumn"; + var img = document.createElement('input'); + img.type = "image"; + img.className = "footerimage"; + img.onclick = function () { + moveCameraToRoom(roomInfo); + } + img.name = roomInfo.roomName; + img.src = roomInfo.imageUrl; + var imgText = document.createElement('div'); + imgText.innerHTML = roomInfo.roomName; + column.appendChild(imgText); + column.appendChild(img); + document.getElementById("imagerow").appendChild(column); + }); + }; + }); + } + }) + + /* */ + } + // Take first intersection with mesh if (scope.logging) console.log('Raycast to mesh is true'); scope.readyForRaycast = false; scope.lastRaycastPoint = intersects[i].point; + this._getKeyframeIndexFromPoint(scope.lastRaycastPoint, onKeyframeUpdate, onError, keyframeAmount); } } @@ -377,6 +786,9 @@ xhr.send(); mesh.name = 'PlacenoteMesh'; if (scope.logging) console.log('Loading mesh complete'); onLoad(mesh); + scope._getMeshMetadata(); + scope.meshObj = mesh; + scope._setCameraOrbitOnCenter(); }; var objLoader = new OBJLoader2(); @@ -434,7 +846,7 @@ xhr.send(); camera.position.z); // Camera rotation - var mapOrientationVect = new Vector4( + var mapOrientationVect = new Vector4( camera.quaternion.x, camera.quaternion.y, camera.quaternion.z, @@ -503,4 +915,4 @@ xhr.send(); })(); -export { PlacenoteMesh }; \ No newline at end of file +export { PlacenoteMesh }; diff --git a/README.md b/README.md index f8176d3..0b66b91 100644 --- a/README.md +++ b/README.md @@ -5,4 +5,15 @@ Spatial Studio web is a a placenote frontend module that allows for viewing of P The Placenote Web API allows for: * Viewing or downloading the world mesh as an OBJ file * Providing raycast based hit testing on the world mesh -* Writing data to Placenote meta data store \ No newline at end of file +* Writing data to Placenote meta data store + +# Web Development +Install the Google Chrome Extension 'Web Server for Chrome', and choose the folder that contains spatial-studio-web. +### Get Started +Please install dependencies by running `npm install` in Lib/mesh-manager.js/ folder. + +### Build +To build you can run `npm run build`. This will create 3 .js files in Lib/mesh-manager.js/build/ folder. + +### Run +To run, navigate to the localhost link provided by 'Web Server for Chrome'. \ No newline at end of file diff --git a/index.html b/index.html index db83d93..89de467 100644 --- a/index.html +++ b/index.html @@ -4,6 +4,7 @@