├── .github └── FUNDING.yml ├── .gitignore ├── .prettierrc.json ├── LICENSE ├── README.md ├── capture-01.gif ├── dist ├── aframe-cursor-teleport-component.js ├── aframe-cursor-teleport-component.js.map ├── aframe-cursor-teleport-component.min.js └── aframe-cursor-teleport-component.min.js.map ├── examples ├── basic │ └── index.html └── custom │ ├── index.html │ └── models │ ├── environment.glb │ ├── vr-collider.mtl │ └── vr-collider.obj ├── index.html ├── index.js ├── package-lock.json ├── package.json └── webpack.config.js /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: vincentfretin 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry 12 | polar: # Replace with a single Polar username 13 | buy_me_a_coffee: # Replace with a single Buy Me a Coffee username 14 | thanks_dev: # Replace with a single thanks.dev username 15 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 16 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ -------------------------------------------------------------------------------- /.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 120, 3 | "singleQuote": true, 4 | "trailingComma": "none" 5 | } 6 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2019 Mike Beene <mwbeene@gmail.com> 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## aframe-cursor-teleport-component 2 | 3 | [![Version](http://img.shields.io/npm/v/aframe-cursor-teleport-component.svg?style=flat-square)](https://npmjs.org/package/aframe-cursor-teleport-component) 4 | [![License](http://img.shields.io/npm/l/aframe-cursor-teleport-component.svg?style=flat-square)](https://npmjs.org/package/aframe-cursor-teleport-component) 5 | 6 | ![Screenshot](https://github.com/c-frame/aframe-cursor-teleport/raw/master/capture-01.gif) 7 | 8 | A simple A-Frame component for navigating scenes on non-VR devices. When combined with A-Frame's cursor and look-controls components, this allows users to freely explore A-Frame scenes using device orientation and touch on mobile or using the mouse on desktop. 9 | 10 | - [Live Example - Basic](https://c-frame.github.io/aframe-cursor-teleport/examples/basic/index.html) 11 | - [Live Example - Custom Collision](https://c-frame.github.io/aframe-cursor-teleport/examples/custom/index.html) 12 | 13 | For [A-Frame](https://aframe.io). 14 | 15 | ### API 16 | 17 | | Property | Description | Default Value | 18 | | ----------------- | ---------------------------------------------------------------------------------------------------------------- | ------------- | 19 | | enabled | Enable or disable the component | true | 20 | | cameraRig | Selector of the camera rig to teleport | | 21 | | cameraHead | Selector of the scene's active camera | | 22 | | cursorColor | Color of the cursor, default blue | '#4d93fd' | 23 | | cursorType | Type of the cursor, cylinder or ring | 'cylinder' | 24 | | collisionEntities | Selector of the meshes used to check the collisions. If no value provided a plane at Y=0 is used. | | 25 | | defaultPlaneSize | Size of the default plane created for collision when `collisionEntities` is not specified | 100 | 26 | | ignoreEntities | Selector of meshes that may obstruct the teleport raycaster, like UI or other clickable elements. | | 27 | | landingNormal | Normal vector to detect collisions with the `collisionEntities` | (0, 1, 0) | 28 | | landingMaxAngle | Angle threshold (in degrees) used together with `landingNormal` to detect if the mesh is so steep to jump to it. | 45 | 29 | 30 | ### Events 31 | 32 | The `cursor-teleport` component will emit two events: 33 | 34 | - `navigation-start`: Entity beginning travel to a destination. 35 | - `navigation-end`: Entity has reached destination. 36 | 37 | ### Installation 38 | 39 | #### Browser 40 | 41 | Install and use by directly including the [browser files](dist): 42 | 43 | ```html 44 | 45 | My A-Frame Scene 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | ``` 55 | 56 | #### npm 57 | 58 | Install via npm: 59 | 60 | ```bash 61 | npm install aframe-cursor-teleport-component 62 | ``` 63 | 64 | Then require and use. 65 | 66 | ```js 67 | require('aframe'); 68 | require('aframe-cursor-teleport-component'); 69 | ``` 70 | 71 | ### Usage 72 | 73 | #### Basic Setup 74 | 75 | ```html 76 | 77 | 78 | 79 | 80 | 81 | ``` 82 | 83 | #### Collision Entities 84 | 85 | To add collision objects, simply identify them with a selector: 86 | 87 | ```html 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 100 | 101 | ``` 102 | 103 | #### Ignored Entities 104 | 105 | If your scene has interactive entities that should not initiate a teleport when clicked, you can add them to the ignoredEntities array using a selector: 106 | 107 | ```html 108 | 109 | 110 | 114 | 115 | 116 | 117 | 118 | 123 | 124 | 125 | 132 | 133 | ``` 134 | 135 | #### Use with aframe-blink-controls 136 | 137 | This component works with [aframe-blink-controls](https://github.com/jure/aframe-blink-controls) allowing for easy-to-use navigation across virtually all devices: 138 | 139 | ```html 140 | 141 | 142 | 146 | 147 | 153 | 159 | 160 | 161 | 162 | 167 | 168 | 169 | 176 | 177 | ``` 178 | 179 | #### Use with simple-navmesh-constraint 180 | 181 | You should disable the `simple-navmesh-constraint` component during the navigation transition. 182 | You can do that like this: 183 | 184 | ```html 185 | 201 | ``` 202 | 203 | Then add `character-controller` component to your cameraRig entity. You also probably want to add `.navmesh-hole` to the `cursor-teleport`'s `ignoreEntities`: 204 | 205 | ```html 206 | 211 | 212 | 213 | ``` 214 | 215 | #### teleportTo API 216 | 217 | You can use the same teleport animation programmatically to teleport to a destination knowing 218 | the position and quaternion (optional): 219 | 220 | ```js 221 | const cameraRig = document.getElementById('cameraRig'); 222 | const cursorTeleport = cameraRig.components['cursor-teleport']; 223 | cursorTeleport.teleportTo(destination.object3D.position, destination.object3D.quaternion); 224 | ``` 225 | 226 | Look at the source code of the basic example, the black button triggers the teleportation to the black arrow on the second platform. 227 | -------------------------------------------------------------------------------- /capture-01.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/c-frame/aframe-cursor-teleport/658818f6f6c17a113c173cd04c8743b131ceb5ba/capture-01.gif -------------------------------------------------------------------------------- /dist/aframe-cursor-teleport-component.js: -------------------------------------------------------------------------------- 1 | (function webpackUniversalModuleDefinition(root, factory) { 2 | if(typeof exports === 'object' && typeof module === 'object') 3 | module.exports = factory(); 4 | else if(typeof define === 'function' && define.amd) 5 | define([], factory); 6 | else { 7 | var a = factory(); 8 | for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i]; 9 | } 10 | })(self, () => { 11 | return /******/ (() => { // webpackBootstrap 12 | var __webpack_exports__ = {}; 13 | /*!******************!*\ 14 | !*** ./index.js ***! 15 | \******************/ 16 | /* global AFRAME, THREE */ 17 | 18 | if (typeof AFRAME === 'undefined') { 19 | throw new Error('Component attempted to register before AFRAME was available.'); 20 | } 21 | 22 | /** 23 | * Cursor Teleport component for A-Frame. 24 | */ 25 | AFRAME.registerComponent('cursor-teleport', { 26 | schema: { 27 | enabled: { type: 'boolean', default: true }, 28 | cameraHead: { type: 'selector', default: '' }, 29 | cameraRig: { type: 'selector', default: '' }, 30 | collisionEntities: { type: 'string', default: '' }, 31 | cursorColor: { type: 'color', default: '#4d93fd' }, 32 | cursorType: { type: 'string', default: 'cylinder', oneOf: ['ring', 'cylinder'] }, 33 | defaultPlaneSize: { type: 'number', default: 100 }, 34 | ignoreEntities: { type: 'string', default: '' }, 35 | landingMaxAngle: { default: 45, min: 0, max: 360 }, 36 | landingNormal: { type: 'vec3', default: { x: 0, y: 1, z: 0 } }, 37 | transitionSpeed: { type: 'number', default: 0.0006 } 38 | }, 39 | 40 | init() { 41 | // platform detect 42 | this.mobile = AFRAME.utils.device.isMobile() || AFRAME.utils.device.isMobileDeviceRequestingDesktopSite(); 43 | 44 | // main app 45 | const sceneEl = this.el.sceneEl; 46 | this.canvas = sceneEl.renderer.domElement; 47 | 48 | // camera 49 | this.data.cameraHead.object3D.traverse((child) => { 50 | if (child instanceof THREE.Camera) { 51 | this.cam = child; // This is the PerspectiveCamera 52 | } 53 | }); 54 | this.camForRotation = this.data.cameraHead.object3D; // This is the Group, parent of the PerspectiveCamera 55 | 56 | this.camRig = this.data.cameraRig.object3D; 57 | 58 | // collision 59 | this.rayCaster = new THREE.Raycaster(); 60 | this.collisionObjectNormalMatrix = new THREE.Matrix3(); 61 | this.collisionWorldNormal = new THREE.Vector3(); 62 | this.referenceNormal = new THREE.Vector3(); 63 | this.rayCastObjects = []; 64 | 65 | // Update collision normal 66 | this.referenceNormal.copy(this.data.landingNormal); 67 | 68 | // RING teleport indicator 69 | const geo = new THREE.RingGeometry(0.25, 0.3, 32, 1); 70 | geo.rotateX(-Math.PI / 2); 71 | geo.translate(0, 0.02, 0); 72 | const mat = new THREE.MeshBasicMaterial({ color: this.data.cursorColor }); 73 | const indicatorRing = new THREE.Mesh(geo, mat); 74 | const group = new THREE.Group(); 75 | group.add(indicatorRing); 76 | this.teleportIndicator = group; 77 | this.teleportIndicator.visible = false; 78 | 79 | if (this.data.cursorType === 'cylinder') { 80 | // CYLINDER teleport indicator 81 | const geoCyl = new THREE.CylinderGeometry(0.3, 0.3, 0.5, 32, 1, true); 82 | geoCyl.translate(0, 0.25, 0); 83 | // texture source MIT license https://github.com/fernandojsg/aframe-teleport-controls/blob/master/lib/cylinderTexture.js 84 | const textureString = 85 | 'data:image/png;base64,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'; 86 | const textureCyl = new THREE.TextureLoader().load(textureString); 87 | const matCyl = new THREE.MeshBasicMaterial({ 88 | color: this.data.cursorColor, 89 | side: 'double', 90 | map: textureCyl, 91 | transparent: true, 92 | depthTest: false 93 | }); 94 | const indicatorCyl = new THREE.Mesh(geoCyl, matCyl); 95 | group.add(indicatorCyl); 96 | } 97 | 98 | sceneEl.object3D.add(this.teleportIndicator); 99 | 100 | // transition 101 | this.transitioning = false; 102 | this.transitionProgress = 0; 103 | this.transitionCamPosStart = new THREE.Vector3(); 104 | this.transitionCamPosEnd = new THREE.Vector3(); 105 | this.transitionCamQuaternionStart = new THREE.Quaternion(); 106 | this.transitionCamQuaternionEnd = new THREE.Quaternion(); 107 | 108 | // Bind functions 109 | this.updateRaycastObjects = this.updateRaycastObjects.bind(this); 110 | this.getMouseState = this.getMouseState.bind(this); 111 | this.getTeleportPosition = this.getTeleportPosition.bind(this); 112 | this.isValidNormalsAngle = this.isValidNormalsAngle.bind(this); 113 | this.transition = this.transition.bind(this); 114 | this.mouseMove = this.mouseMove.bind(this); 115 | this.mouseDown = this.mouseDown.bind(this); 116 | this.mouseUp = this.mouseUp.bind(this); 117 | this.easeInOutQuad = this.easeInOutQuad.bind(this); 118 | this.teleportTo = this.teleportTo.bind(this); 119 | this.hideCursor = this.hideCursor.bind(this); 120 | 121 | this.updateRaycastObjects(); 122 | }, 123 | 124 | remove() { 125 | this.cam = null; 126 | this.canvas = null; 127 | this.rayCastObjects.length = 0; 128 | this.el.sceneEl.object3D.remove(this.teleportIndicator); 129 | for (const child of this.teleportIndicator.children) { 130 | child.material.dispose(); 131 | child.geometry.dispose(); 132 | } 133 | this.teleportIndicator = null; 134 | if (this.collisionMesh) { 135 | this.collisionMesh.geometry.dispose(); 136 | this.collisionMesh.material.dispose(); 137 | this.collisionMesh = null; 138 | } 139 | }, 140 | 141 | update(oldData) { 142 | if (typeof oldData.enabled === 'undefined') return; 143 | if (!oldData.enabled && this.data.enabled) { 144 | this.registerEventListeners(); 145 | } 146 | if (oldData.enabled && !this.data.enabled) { 147 | // Call unregisterEventListeners instead of pause that is a wrapped method unregistering tick method 148 | // because we still want the tick method to use the component via the teleportTo api. 149 | this.unregisterEventListeners(); 150 | } 151 | }, 152 | 153 | registerEventListeners() { 154 | const canvas = this.canvas; 155 | canvas.addEventListener('mousedown', this.mouseDown, false); 156 | canvas.addEventListener('mousemove', this.mouseMove, false); 157 | canvas.addEventListener('mouseup', this.mouseUp, false); 158 | canvas.addEventListener('touchstart', this.mouseDown, false); 159 | canvas.addEventListener('touchmove', this.mouseMove, false); 160 | canvas.addEventListener('touchend', this.mouseUp, false); 161 | window.addEventListener('keydown', this.hideCursor, false); 162 | }, 163 | 164 | unregisterEventListeners() { 165 | this.transitioning = false; 166 | this.hideCursor(); 167 | const canvas = this.canvas; 168 | canvas.removeEventListener('mousedown', this.mouseDown); 169 | canvas.removeEventListener('mousemove', this.mouseMove); 170 | canvas.removeEventListener('mouseup', this.mouseUp); 171 | canvas.removeEventListener('touchstart', this.mouseDown); 172 | canvas.removeEventListener('touchmove', this.mouseMove); 173 | canvas.removeEventListener('touchend', this.mouseUp); 174 | window.removeEventListener('keydown', this.hideCursor); 175 | }, 176 | 177 | play() { 178 | if (!this.data.enabled) return; 179 | this.registerEventListeners(); 180 | }, 181 | 182 | pause() { 183 | this.unregisterEventListeners(); 184 | }, 185 | 186 | updateRaycastObjects() { 187 | // updates the array of meshes we will need to raycast to 188 | // clear the array of any existing meshes 189 | this.rayCastObjects.length = 0; 190 | 191 | if (this.data.collisionEntities !== '') { 192 | // traverse collision entities and add their meshes to the rayCastEntities array. 193 | const collisionEntities = this.el.sceneEl.querySelectorAll(this.data.collisionEntities); 194 | 195 | collisionEntities.forEach((e) => { 196 | e.object3D.traverse((child) => { 197 | if (child.isMesh) { 198 | // mark this mesh as a collision object 199 | child.userData.collision = true; 200 | this.rayCastObjects.push(child); 201 | } 202 | }); 203 | }); 204 | } else { 205 | if (!this.collisionMesh) { 206 | // if no collision entities are specified, create a default ground plane collision. 207 | const geo = new THREE.PlaneGeometry(this.data.defaultPlaneSize, this.data.defaultPlaneSize, 1); 208 | geo.rotateX(-Math.PI / 2); 209 | const mat = new THREE.MeshNormalMaterial(); 210 | const collisionMesh = new THREE.Mesh(geo, mat); 211 | // mark this mesh as a collision object 212 | collisionMesh.userData.collision = true; 213 | this.collisionMesh = collisionMesh; 214 | } 215 | this.rayCastObjects.push(this.collisionMesh); 216 | } 217 | 218 | // We may need some entities to be seen by the raycaster even though they are not teleportable. 219 | // This prevents the user from unnesserily teleporting when clicking things like buttons or UI. 220 | if (this.data.ignoreEntities !== '') { 221 | const ignoreEntities = this.el.sceneEl.querySelectorAll(this.data.ignoreEntities); 222 | ignoreEntities.forEach((e) => { 223 | e.object3D.traverse((child) => { 224 | if (child.isMesh) { 225 | this.rayCastObjects.push(child); 226 | } 227 | }); 228 | }); 229 | } 230 | }, 231 | 232 | getMouseState: (function () { 233 | const coordinates = new THREE.Vector2(); 234 | return function (e) { 235 | const rect = this.canvas.getBoundingClientRect(); 236 | if (e.clientX != null) { 237 | coordinates.x = e.clientX - rect.left; 238 | coordinates.y = e.clientY - rect.top; 239 | return coordinates; 240 | } else if (e.touches[0] != null) { 241 | coordinates.x = e.touches[0].clientX - rect.left; 242 | coordinates.y = e.touches[0].clientY - rect.top; 243 | return coordinates; 244 | } 245 | }; 246 | })(), 247 | 248 | getTeleportPosition: (function () { 249 | const mouse = new THREE.Vector2(); 250 | return function (mouseX, mouseY) { 251 | if (this.rayCastObjects.length !== 0) { 252 | if (this.cam && this.canvas) { 253 | const cam = this.cam; 254 | const rect = this.canvas.getBoundingClientRect(); 255 | 256 | mouse.x = (mouseX / (rect.right - rect.left)) * 2 - 1; 257 | mouse.y = -(mouseY / (rect.bottom - rect.top)) * 2 + 1; 258 | this.rayCaster.setFromCamera(mouse, cam); 259 | const intersects = this.rayCaster.intersectObjects(this.rayCastObjects); 260 | if (intersects.length !== 0 && this.isValidNormalsAngle(intersects[0].face.normal, intersects[0].object)) { 261 | if (intersects[0].object.userData.collision === true) { 262 | return intersects[0].point; 263 | } 264 | return false; 265 | } else { 266 | return false; 267 | } 268 | } else { 269 | return false; 270 | } 271 | } else { 272 | return false; 273 | } 274 | }; 275 | })(), 276 | 277 | isValidNormalsAngle(collisionNormal, collisionObject) { 278 | this.collisionObjectNormalMatrix.getNormalMatrix(collisionObject.matrixWorld); 279 | this.collisionWorldNormal.copy(collisionNormal).applyNormalMatrix(this.collisionObjectNormalMatrix); 280 | const angleNormals = this.referenceNormal.angleTo(this.collisionWorldNormal); 281 | return THREE.MathUtils.RAD2DEG * angleNormals <= this.data.landingMaxAngle; 282 | }, 283 | 284 | transition(destPos, destQuaternion = undefined) { 285 | this.transitionProgress = 0; 286 | this.transitionCamPosEnd.copy(destPos); 287 | this.transitionCamPosStart.copy(this.camRig.position); 288 | if (destQuaternion) { 289 | this.transitionCamQuaternionEnd.copy(destQuaternion); 290 | this.transitionCamQuaternionStart.copy(this.camRig.quaternion); 291 | } else { 292 | this.transitionCamQuaternionEnd.copy(this.camRig.quaternion); 293 | this.transitionCamQuaternionStart.copy(this.transitionCamQuaternionEnd); 294 | } 295 | this.transitioning = true; 296 | this.el.emit('navigation-start'); 297 | }, 298 | 299 | hideCursor() { 300 | this.teleportIndicator.visible = false; 301 | }, 302 | 303 | mouseMove(e) { 304 | const mouseState = this.getMouseState(e); 305 | this.mouseX = mouseState.x; 306 | this.mouseY = mouseState.y; 307 | }, 308 | 309 | mouseDown(e) { 310 | this.updateRaycastObjects(); 311 | 312 | const mouseState = this.getMouseState(e); 313 | this.mouseX = mouseState.x; 314 | this.mouseY = mouseState.y; 315 | 316 | this.mouseXOrig = mouseState.x; 317 | this.mouseYOrig = mouseState.y; 318 | }, 319 | 320 | mouseUp(e) { 321 | if (this.mouseX === this.mouseXOrig && this.mouseY === this.mouseYOrig) { 322 | const pos = this.getTeleportPosition(this.mouseX, this.mouseY); 323 | if (pos) { 324 | this.teleportIndicator.visible = true; 325 | this.teleportIndicator.position.copy(pos); 326 | this.transition(pos); 327 | } 328 | } 329 | }, 330 | 331 | teleportTo(pos, quaternion = undefined) { 332 | this.teleportIndicator.position.copy(pos); 333 | if (!quaternion) { 334 | this.transition(pos); 335 | } else { 336 | const destQuaternion = new THREE.Quaternion(); 337 | destQuaternion.setFromEuler(new THREE.Euler(0, this.camForRotation.rotation.y, 0)); 338 | destQuaternion.invert(); 339 | destQuaternion.multiply(quaternion); 340 | this.transition(pos, destQuaternion); 341 | } 342 | // don't show the indicator when using via api 343 | this.hideCursor(); 344 | }, 345 | 346 | easeInOutQuad(t) { 347 | return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t; 348 | }, 349 | 350 | tick(time, delta) { 351 | if (!this.transitioning && !this.mobile) { 352 | const pos = this.getTeleportPosition(this.mouseX, this.mouseY); 353 | if (pos) { 354 | this.teleportIndicator.position.copy(pos); 355 | } 356 | } 357 | if (this.transitioning) { 358 | this.transitionProgress += delta * this.data.transitionSpeed; 359 | const easeInOutTransitionProgress = this.easeInOutQuad(this.transitionProgress); 360 | const value = 361 | easeInOutTransitionProgress < 0.5 ? easeInOutTransitionProgress : 0.5 - 1 * (easeInOutTransitionProgress - 0.5); 362 | this.teleportIndicator.scale.set(0.5 + value, 1, 0.5 + value); 363 | 364 | // set camera position 365 | const camPos = this.camRig.position; 366 | camPos.lerpVectors(this.transitionCamPosStart, this.transitionCamPosEnd, easeInOutTransitionProgress); 367 | 368 | this.camRig.quaternion.slerpQuaternions( 369 | this.transitionCamQuaternionStart, 370 | this.transitionCamQuaternionEnd, 371 | easeInOutTransitionProgress 372 | ); 373 | 374 | if (this.transitionProgress >= 1) { 375 | this.transitioning = false; 376 | camPos.copy(this.transitionCamPosEnd); 377 | this.camRig.quaternion.copy(this.transitionCamQuaternionEnd); 378 | this.el.emit('navigation-end'); 379 | } 380 | } 381 | } 382 | }); 383 | 384 | /******/ return __webpack_exports__; 385 | /******/ })() 386 | ; 387 | }); 388 | //# sourceMappingURL=aframe-cursor-teleport-component.js.map -------------------------------------------------------------------------------- /dist/aframe-cursor-teleport-component.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"aframe-cursor-teleport-component.js","mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD,O;;;;;ACVA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,gCAAgC;AAC/C,kBAAkB,+BAA+B;AACjD,iBAAiB,+BAA+B;AAChD,yBAAyB,6BAA6B;AACtD,mBAAmB,mCAAmC;AACtD,kBAAkB,kEAAkE;AACpF,wBAAwB,8BAA8B;AACtD,sBAAsB,6BAA6B;AACnD,uBAAuB,+BAA+B;AACtD,qBAAqB,yBAAyB,oBAAoB;AAClE,uBAAuB;AACvB,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA,KAAK;AACL,yDAAyD;;AAEzD;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,8CAA8C,8BAA8B;AAC5E;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,OAAO;AACP,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,UAAU;AACV;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC","sources":["webpack://aframe-cursor-teleport-component/webpack/universalModuleDefinition","webpack://aframe-cursor-teleport-component/./index.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, () => {\nreturn ","/* global AFRAME, THREE */\n\nif (typeof AFRAME === 'undefined') {\n throw new Error('Component attempted to register before AFRAME was available.');\n}\n\n/**\n * Cursor Teleport component for A-Frame.\n */\nAFRAME.registerComponent('cursor-teleport', {\n schema: {\n enabled: { type: 'boolean', default: true },\n cameraHead: { type: 'selector', default: '' },\n cameraRig: { type: 'selector', default: '' },\n collisionEntities: { type: 'string', default: '' },\n cursorColor: { type: 'color', default: '#4d93fd' },\n cursorType: { type: 'string', default: 'cylinder', oneOf: ['ring', 'cylinder'] },\n defaultPlaneSize: { type: 'number', default: 100 },\n ignoreEntities: { type: 'string', default: '' },\n landingMaxAngle: { default: 45, min: 0, max: 360 },\n landingNormal: { type: 'vec3', default: { x: 0, y: 1, z: 0 } },\n transitionSpeed: { type: 'number', default: 0.0006 }\n },\n\n init() {\n // platform detect\n this.mobile = AFRAME.utils.device.isMobile() || AFRAME.utils.device.isMobileDeviceRequestingDesktopSite();\n\n // main app\n const sceneEl = this.el.sceneEl;\n this.canvas = sceneEl.renderer.domElement;\n\n // camera\n this.data.cameraHead.object3D.traverse((child) => {\n if (child instanceof THREE.Camera) {\n this.cam = child; // This is the PerspectiveCamera\n }\n });\n this.camForRotation = this.data.cameraHead.object3D; // This is the Group, parent of the PerspectiveCamera\n\n this.camRig = this.data.cameraRig.object3D;\n\n // collision\n this.rayCaster = new THREE.Raycaster();\n this.collisionObjectNormalMatrix = new THREE.Matrix3();\n this.collisionWorldNormal = new THREE.Vector3();\n this.referenceNormal = new THREE.Vector3();\n this.rayCastObjects = [];\n\n // Update collision normal\n this.referenceNormal.copy(this.data.landingNormal);\n\n // RING teleport indicator\n const geo = new THREE.RingGeometry(0.25, 0.3, 32, 1);\n geo.rotateX(-Math.PI / 2);\n geo.translate(0, 0.02, 0);\n const mat = new THREE.MeshBasicMaterial({ color: this.data.cursorColor });\n const indicatorRing = new THREE.Mesh(geo, mat);\n const group = new THREE.Group();\n group.add(indicatorRing);\n this.teleportIndicator = group;\n this.teleportIndicator.visible = false;\n\n if (this.data.cursorType === 'cylinder') {\n // CYLINDER teleport indicator\n const geoCyl = new THREE.CylinderGeometry(0.3, 0.3, 0.5, 32, 1, true);\n geoCyl.translate(0, 0.25, 0);\n // texture source MIT license https://github.com/fernandojsg/aframe-teleport-controls/blob/master/lib/cylinderTexture.js\n const textureString =\n 'data:image/png;base64,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';\n const textureCyl = new THREE.TextureLoader().load(textureString);\n const matCyl = new THREE.MeshBasicMaterial({\n color: this.data.cursorColor,\n side: 'double',\n map: textureCyl,\n transparent: true,\n depthTest: false\n });\n const indicatorCyl = new THREE.Mesh(geoCyl, matCyl);\n group.add(indicatorCyl);\n }\n\n sceneEl.object3D.add(this.teleportIndicator);\n\n // transition\n this.transitioning = false;\n this.transitionProgress = 0;\n this.transitionCamPosStart = new THREE.Vector3();\n this.transitionCamPosEnd = new THREE.Vector3();\n this.transitionCamQuaternionStart = new THREE.Quaternion();\n this.transitionCamQuaternionEnd = new THREE.Quaternion();\n\n // Bind functions\n this.updateRaycastObjects = this.updateRaycastObjects.bind(this);\n this.getMouseState = this.getMouseState.bind(this);\n this.getTeleportPosition = this.getTeleportPosition.bind(this);\n this.isValidNormalsAngle = this.isValidNormalsAngle.bind(this);\n this.transition = this.transition.bind(this);\n this.mouseMove = this.mouseMove.bind(this);\n this.mouseDown = this.mouseDown.bind(this);\n this.mouseUp = this.mouseUp.bind(this);\n this.easeInOutQuad = this.easeInOutQuad.bind(this);\n this.teleportTo = this.teleportTo.bind(this);\n this.hideCursor = this.hideCursor.bind(this);\n\n this.updateRaycastObjects();\n },\n\n remove() {\n this.cam = null;\n this.canvas = null;\n this.rayCastObjects.length = 0;\n this.el.sceneEl.object3D.remove(this.teleportIndicator);\n for (const child of this.teleportIndicator.children) {\n child.material.dispose();\n child.geometry.dispose();\n }\n this.teleportIndicator = null;\n if (this.collisionMesh) {\n this.collisionMesh.geometry.dispose();\n this.collisionMesh.material.dispose();\n this.collisionMesh = null;\n }\n },\n\n update(oldData) {\n if (typeof oldData.enabled === 'undefined') return;\n if (!oldData.enabled && this.data.enabled) {\n this.registerEventListeners();\n }\n if (oldData.enabled && !this.data.enabled) {\n // Call unregisterEventListeners instead of pause that is a wrapped method unregistering tick method\n // because we still want the tick method to use the component via the teleportTo api.\n this.unregisterEventListeners();\n }\n },\n\n registerEventListeners() {\n const canvas = this.canvas;\n canvas.addEventListener('mousedown', this.mouseDown, false);\n canvas.addEventListener('mousemove', this.mouseMove, false);\n canvas.addEventListener('mouseup', this.mouseUp, false);\n canvas.addEventListener('touchstart', this.mouseDown, false);\n canvas.addEventListener('touchmove', this.mouseMove, false);\n canvas.addEventListener('touchend', this.mouseUp, false);\n window.addEventListener('keydown', this.hideCursor, false);\n },\n\n unregisterEventListeners() {\n this.transitioning = false;\n this.hideCursor();\n const canvas = this.canvas;\n canvas.removeEventListener('mousedown', this.mouseDown);\n canvas.removeEventListener('mousemove', this.mouseMove);\n canvas.removeEventListener('mouseup', this.mouseUp);\n canvas.removeEventListener('touchstart', this.mouseDown);\n canvas.removeEventListener('touchmove', this.mouseMove);\n canvas.removeEventListener('touchend', this.mouseUp);\n window.removeEventListener('keydown', this.hideCursor);\n },\n\n play() {\n if (!this.data.enabled) return;\n this.registerEventListeners();\n },\n\n pause() {\n this.unregisterEventListeners();\n },\n\n updateRaycastObjects() {\n // updates the array of meshes we will need to raycast to\n // clear the array of any existing meshes\n this.rayCastObjects.length = 0;\n\n if (this.data.collisionEntities !== '') {\n // traverse collision entities and add their meshes to the rayCastEntities array.\n const collisionEntities = this.el.sceneEl.querySelectorAll(this.data.collisionEntities);\n\n collisionEntities.forEach((e) => {\n e.object3D.traverse((child) => {\n if (child.isMesh) {\n // mark this mesh as a collision object\n child.userData.collision = true;\n this.rayCastObjects.push(child);\n }\n });\n });\n } else {\n if (!this.collisionMesh) {\n // if no collision entities are specified, create a default ground plane collision.\n const geo = new THREE.PlaneGeometry(this.data.defaultPlaneSize, this.data.defaultPlaneSize, 1);\n geo.rotateX(-Math.PI / 2);\n const mat = new THREE.MeshNormalMaterial();\n const collisionMesh = new THREE.Mesh(geo, mat);\n // mark this mesh as a collision object\n collisionMesh.userData.collision = true;\n this.collisionMesh = collisionMesh;\n }\n this.rayCastObjects.push(this.collisionMesh);\n }\n\n // We may need some entities to be seen by the raycaster even though they are not teleportable.\n // This prevents the user from unnesserily teleporting when clicking things like buttons or UI.\n if (this.data.ignoreEntities !== '') {\n const ignoreEntities = this.el.sceneEl.querySelectorAll(this.data.ignoreEntities);\n ignoreEntities.forEach((e) => {\n e.object3D.traverse((child) => {\n if (child.isMesh) {\n this.rayCastObjects.push(child);\n }\n });\n });\n }\n },\n\n getMouseState: (function () {\n const coordinates = new THREE.Vector2();\n return function (e) {\n const rect = this.canvas.getBoundingClientRect();\n if (e.clientX != null) {\n coordinates.x = e.clientX - rect.left;\n coordinates.y = e.clientY - rect.top;\n return coordinates;\n } else if (e.touches[0] != null) {\n coordinates.x = e.touches[0].clientX - rect.left;\n coordinates.y = e.touches[0].clientY - rect.top;\n return coordinates;\n }\n };\n })(),\n\n getTeleportPosition: (function () {\n const mouse = new THREE.Vector2();\n return function (mouseX, mouseY) {\n if (this.rayCastObjects.length !== 0) {\n if (this.cam && this.canvas) {\n const cam = this.cam;\n const rect = this.canvas.getBoundingClientRect();\n\n mouse.x = (mouseX / (rect.right - rect.left)) * 2 - 1;\n mouse.y = -(mouseY / (rect.bottom - rect.top)) * 2 + 1;\n this.rayCaster.setFromCamera(mouse, cam);\n const intersects = this.rayCaster.intersectObjects(this.rayCastObjects);\n if (intersects.length !== 0 && this.isValidNormalsAngle(intersects[0].face.normal, intersects[0].object)) {\n if (intersects[0].object.userData.collision === true) {\n return intersects[0].point;\n }\n return false;\n } else {\n return false;\n }\n } else {\n return false;\n }\n } else {\n return false;\n }\n };\n })(),\n\n isValidNormalsAngle(collisionNormal, collisionObject) {\n this.collisionObjectNormalMatrix.getNormalMatrix(collisionObject.matrixWorld);\n this.collisionWorldNormal.copy(collisionNormal).applyNormalMatrix(this.collisionObjectNormalMatrix);\n const angleNormals = this.referenceNormal.angleTo(this.collisionWorldNormal);\n return THREE.MathUtils.RAD2DEG * angleNormals <= this.data.landingMaxAngle;\n },\n\n transition(destPos, destQuaternion = undefined) {\n this.transitionProgress = 0;\n this.transitionCamPosEnd.copy(destPos);\n this.transitionCamPosStart.copy(this.camRig.position);\n if (destQuaternion) {\n this.transitionCamQuaternionEnd.copy(destQuaternion);\n this.transitionCamQuaternionStart.copy(this.camRig.quaternion);\n } else {\n this.transitionCamQuaternionEnd.copy(this.camRig.quaternion);\n this.transitionCamQuaternionStart.copy(this.transitionCamQuaternionEnd);\n }\n this.transitioning = true;\n this.el.emit('navigation-start');\n },\n\n hideCursor() {\n this.teleportIndicator.visible = false;\n },\n\n mouseMove(e) {\n const mouseState = this.getMouseState(e);\n this.mouseX = mouseState.x;\n this.mouseY = mouseState.y;\n },\n\n mouseDown(e) {\n this.updateRaycastObjects();\n\n const mouseState = this.getMouseState(e);\n this.mouseX = mouseState.x;\n this.mouseY = mouseState.y;\n\n this.mouseXOrig = mouseState.x;\n this.mouseYOrig = mouseState.y;\n },\n\n mouseUp(e) {\n if (this.mouseX === this.mouseXOrig && this.mouseY === this.mouseYOrig) {\n const pos = this.getTeleportPosition(this.mouseX, this.mouseY);\n if (pos) {\n this.teleportIndicator.visible = true;\n this.teleportIndicator.position.copy(pos);\n this.transition(pos);\n }\n }\n },\n\n teleportTo(pos, quaternion = undefined) {\n this.teleportIndicator.position.copy(pos);\n if (!quaternion) {\n this.transition(pos);\n } else {\n const destQuaternion = new THREE.Quaternion();\n destQuaternion.setFromEuler(new THREE.Euler(0, this.camForRotation.rotation.y, 0));\n destQuaternion.invert();\n destQuaternion.multiply(quaternion);\n this.transition(pos, destQuaternion);\n }\n // don't show the indicator when using via api\n this.hideCursor();\n },\n\n easeInOutQuad(t) {\n return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;\n },\n\n tick(time, delta) {\n if (!this.transitioning && !this.mobile) {\n const pos = this.getTeleportPosition(this.mouseX, this.mouseY);\n if (pos) {\n this.teleportIndicator.position.copy(pos);\n }\n }\n if (this.transitioning) {\n this.transitionProgress += delta * this.data.transitionSpeed;\n const easeInOutTransitionProgress = this.easeInOutQuad(this.transitionProgress);\n const value =\n easeInOutTransitionProgress < 0.5 ? easeInOutTransitionProgress : 0.5 - 1 * (easeInOutTransitionProgress - 0.5);\n this.teleportIndicator.scale.set(0.5 + value, 1, 0.5 + value);\n\n // set camera position\n const camPos = this.camRig.position;\n camPos.lerpVectors(this.transitionCamPosStart, this.transitionCamPosEnd, easeInOutTransitionProgress);\n\n this.camRig.quaternion.slerpQuaternions(\n this.transitionCamQuaternionStart,\n this.transitionCamQuaternionEnd,\n easeInOutTransitionProgress\n );\n\n if (this.transitionProgress >= 1) {\n this.transitioning = false;\n camPos.copy(this.transitionCamPosEnd);\n this.camRig.quaternion.copy(this.transitionCamQuaternionEnd);\n this.el.emit('navigation-end');\n }\n }\n }\n});\n"],"names":[],"sourceRoot":""} -------------------------------------------------------------------------------- /dist/aframe-cursor-teleport-component.min.js: -------------------------------------------------------------------------------- 1 | !function(t,e){if("object"==typeof exports&&"object"==typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var i=e();for(var s in i)("object"==typeof exports?exports:t)[s]=i[s]}}(self,(()=>(()=>{if("undefined"==typeof AFRAME)throw new Error("Component attempted to register before AFRAME was available.");return AFRAME.registerComponent("cursor-teleport",{schema:{enabled:{type:"boolean",default:!0},cameraHead:{type:"selector",default:""},cameraRig:{type:"selector",default:""},collisionEntities:{type:"string",default:""},cursorColor:{type:"color",default:"#4d93fd"},cursorType:{type:"string",default:"cylinder",oneOf:["ring","cylinder"]},defaultPlaneSize:{type:"number",default:100},ignoreEntities:{type:"string",default:""},landingMaxAngle:{default:45,min:0,max:360},landingNormal:{type:"vec3",default:{x:0,y:1,z:0}},transitionSpeed:{type:"number",default:6e-4}},init(){this.mobile=AFRAME.utils.device.isMobile()||AFRAME.utils.device.isMobileDeviceRequestingDesktopSite();const t=this.el.sceneEl;this.canvas=t.renderer.domElement,this.data.cameraHead.object3D.traverse((t=>{t instanceof THREE.Camera&&(this.cam=t)})),this.camForRotation=this.data.cameraHead.object3D,this.camRig=this.data.cameraRig.object3D,this.rayCaster=new THREE.Raycaster,this.collisionObjectNormalMatrix=new THREE.Matrix3,this.collisionWorldNormal=new THREE.Vector3,this.referenceNormal=new THREE.Vector3,this.rayCastObjects=[],this.referenceNormal.copy(this.data.landingNormal);const e=new THREE.RingGeometry(.25,.3,32,1);e.rotateX(-Math.PI/2),e.translate(0,.02,0);const i=new THREE.MeshBasicMaterial({color:this.data.cursorColor}),s=new THREE.Mesh(e,i),o=new THREE.Group;if(o.add(s),this.teleportIndicator=o,this.teleportIndicator.visible=!1,"cylinder"===this.data.cursorType){const t=new THREE.CylinderGeometry(.3,.3,.5,32,1,!0);t.translate(0,.25,0);const e="data:image/png;base64,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",i=(new THREE.TextureLoader).load(e),s=new THREE.MeshBasicMaterial({color:this.data.cursorColor,side:"double",map:i,transparent:!0,depthTest:!1}),n=new THREE.Mesh(t,s);o.add(n)}t.object3D.add(this.teleportIndicator),this.transitioning=!1,this.transitionProgress=0,this.transitionCamPosStart=new THREE.Vector3,this.transitionCamPosEnd=new THREE.Vector3,this.transitionCamQuaternionStart=new THREE.Quaternion,this.transitionCamQuaternionEnd=new THREE.Quaternion,this.updateRaycastObjects=this.updateRaycastObjects.bind(this),this.getMouseState=this.getMouseState.bind(this),this.getTeleportPosition=this.getTeleportPosition.bind(this),this.isValidNormalsAngle=this.isValidNormalsAngle.bind(this),this.transition=this.transition.bind(this),this.mouseMove=this.mouseMove.bind(this),this.mouseDown=this.mouseDown.bind(this),this.mouseUp=this.mouseUp.bind(this),this.easeInOutQuad=this.easeInOutQuad.bind(this),this.teleportTo=this.teleportTo.bind(this),this.hideCursor=this.hideCursor.bind(this),this.updateRaycastObjects()},remove(){this.cam=null,this.canvas=null,this.rayCastObjects.length=0,this.el.sceneEl.object3D.remove(this.teleportIndicator);for(const t of this.teleportIndicator.children)t.material.dispose(),t.geometry.dispose();this.teleportIndicator=null,this.collisionMesh&&(this.collisionMesh.geometry.dispose(),this.collisionMesh.material.dispose(),this.collisionMesh=null)},update(t){void 0!==t.enabled&&(!t.enabled&&this.data.enabled&&this.registerEventListeners(),t.enabled&&!this.data.enabled&&this.unregisterEventListeners())},registerEventListeners(){const t=this.canvas;t.addEventListener("mousedown",this.mouseDown,!1),t.addEventListener("mousemove",this.mouseMove,!1),t.addEventListener("mouseup",this.mouseUp,!1),t.addEventListener("touchstart",this.mouseDown,!1),t.addEventListener("touchmove",this.mouseMove,!1),t.addEventListener("touchend",this.mouseUp,!1),window.addEventListener("keydown",this.hideCursor,!1)},unregisterEventListeners(){this.transitioning=!1,this.hideCursor();const t=this.canvas;t.removeEventListener("mousedown",this.mouseDown),t.removeEventListener("mousemove",this.mouseMove),t.removeEventListener("mouseup",this.mouseUp),t.removeEventListener("touchstart",this.mouseDown),t.removeEventListener("touchmove",this.mouseMove),t.removeEventListener("touchend",this.mouseUp),window.removeEventListener("keydown",this.hideCursor)},play(){this.data.enabled&&this.registerEventListeners()},pause(){this.unregisterEventListeners()},updateRaycastObjects(){if(this.rayCastObjects.length=0,""!==this.data.collisionEntities)this.el.sceneEl.querySelectorAll(this.data.collisionEntities).forEach((t=>{t.object3D.traverse((t=>{t.isMesh&&(t.userData.collision=!0,this.rayCastObjects.push(t))}))}));else{if(!this.collisionMesh){const t=new THREE.PlaneGeometry(this.data.defaultPlaneSize,this.data.defaultPlaneSize,1);t.rotateX(-Math.PI/2);const e=new THREE.MeshNormalMaterial,i=new THREE.Mesh(t,e);i.userData.collision=!0,this.collisionMesh=i}this.rayCastObjects.push(this.collisionMesh)}""!==this.data.ignoreEntities&&this.el.sceneEl.querySelectorAll(this.data.ignoreEntities).forEach((t=>{t.object3D.traverse((t=>{t.isMesh&&this.rayCastObjects.push(t)}))}))},getMouseState:function(){const t=new THREE.Vector2;return function(e){const i=this.canvas.getBoundingClientRect();return null!=e.clientX?(t.x=e.clientX-i.left,t.y=e.clientY-i.top,t):null!=e.touches[0]?(t.x=e.touches[0].clientX-i.left,t.y=e.touches[0].clientY-i.top,t):void 0}}(),getTeleportPosition:function(){const t=new THREE.Vector2;return function(e,i){if(0!==this.rayCastObjects.length){if(this.cam&&this.canvas){const s=this.cam,o=this.canvas.getBoundingClientRect();t.x=e/(o.right-o.left)*2-1,t.y=-i/(o.bottom-o.top)*2+1,this.rayCaster.setFromCamera(t,s);const n=this.rayCaster.intersectObjects(this.rayCastObjects);return!(0===n.length||!this.isValidNormalsAngle(n[0].face.normal,n[0].object))&&!0===n[0].object.userData.collision&&n[0].point}return!1}return!1}}(),isValidNormalsAngle(t,e){this.collisionObjectNormalMatrix.getNormalMatrix(e.matrixWorld),this.collisionWorldNormal.copy(t).applyNormalMatrix(this.collisionObjectNormalMatrix);const i=this.referenceNormal.angleTo(this.collisionWorldNormal);return THREE.MathUtils.RAD2DEG*i<=this.data.landingMaxAngle},transition(t,e=void 0){this.transitionProgress=0,this.transitionCamPosEnd.copy(t),this.transitionCamPosStart.copy(this.camRig.position),e?(this.transitionCamQuaternionEnd.copy(e),this.transitionCamQuaternionStart.copy(this.camRig.quaternion)):(this.transitionCamQuaternionEnd.copy(this.camRig.quaternion),this.transitionCamQuaternionStart.copy(this.transitionCamQuaternionEnd)),this.transitioning=!0,this.el.emit("navigation-start")},hideCursor(){this.teleportIndicator.visible=!1},mouseMove(t){const e=this.getMouseState(t);this.mouseX=e.x,this.mouseY=e.y},mouseDown(t){this.updateRaycastObjects();const e=this.getMouseState(t);this.mouseX=e.x,this.mouseY=e.y,this.mouseXOrig=e.x,this.mouseYOrig=e.y},mouseUp(t){if(this.mouseX===this.mouseXOrig&&this.mouseY===this.mouseYOrig){const t=this.getTeleportPosition(this.mouseX,this.mouseY);t&&(this.teleportIndicator.visible=!0,this.teleportIndicator.position.copy(t),this.transition(t))}},teleportTo(t,e=void 0){if(this.teleportIndicator.position.copy(t),e){const i=new THREE.Quaternion;i.setFromEuler(new THREE.Euler(0,this.camForRotation.rotation.y,0)),i.invert(),i.multiply(e),this.transition(t,i)}else this.transition(t);this.hideCursor()},easeInOutQuad:t=>t<.5?2*t*t:(4-2*t)*t-1,tick(t,e){if(!this.transitioning&&!this.mobile){const t=this.getTeleportPosition(this.mouseX,this.mouseY);t&&this.teleportIndicator.position.copy(t)}if(this.transitioning){this.transitionProgress+=e*this.data.transitionSpeed;const t=this.easeInOutQuad(this.transitionProgress),i=t<.5?t:.5-1*(t-.5);this.teleportIndicator.scale.set(.5+i,1,.5+i);const s=this.camRig.position;s.lerpVectors(this.transitionCamPosStart,this.transitionCamPosEnd,t),this.camRig.quaternion.slerpQuaternions(this.transitionCamQuaternionStart,this.transitionCamQuaternionEnd,t),this.transitionProgress>=1&&(this.transitioning=!1,s.copy(this.transitionCamPosEnd),this.camRig.quaternion.copy(this.transitionCamQuaternionEnd),this.el.emit("navigation-end"))}}}),{}})())); 2 | //# sourceMappingURL=aframe-cursor-teleport-component.min.js.map -------------------------------------------------------------------------------- /dist/aframe-cursor-teleport-component.min.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"aframe-cursor-teleport-component.min.js","mappings":"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","sources":["webpack://aframe-cursor-teleport-component/webpack/universalModuleDefinition","webpack://aframe-cursor-teleport-component/./index.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, () => {\nreturn ","/* global AFRAME, THREE */\n\nif (typeof AFRAME === 'undefined') {\n throw new Error('Component attempted to register before AFRAME was available.');\n}\n\n/**\n * Cursor Teleport component for A-Frame.\n */\nAFRAME.registerComponent('cursor-teleport', {\n schema: {\n enabled: { type: 'boolean', default: true },\n cameraHead: { type: 'selector', default: '' },\n cameraRig: { type: 'selector', default: '' },\n collisionEntities: { type: 'string', default: '' },\n cursorColor: { type: 'color', default: '#4d93fd' },\n cursorType: { type: 'string', default: 'cylinder', oneOf: ['ring', 'cylinder'] },\n defaultPlaneSize: { type: 'number', default: 100 },\n ignoreEntities: { type: 'string', default: '' },\n landingMaxAngle: { default: 45, min: 0, max: 360 },\n landingNormal: { type: 'vec3', default: { x: 0, y: 1, z: 0 } },\n transitionSpeed: { type: 'number', default: 0.0006 }\n },\n\n init() {\n // platform detect\n this.mobile = AFRAME.utils.device.isMobile() || AFRAME.utils.device.isMobileDeviceRequestingDesktopSite();\n\n // main app\n const sceneEl = this.el.sceneEl;\n this.canvas = sceneEl.renderer.domElement;\n\n // camera\n this.data.cameraHead.object3D.traverse((child) => {\n if (child instanceof THREE.Camera) {\n this.cam = child; // This is the PerspectiveCamera\n }\n });\n this.camForRotation = this.data.cameraHead.object3D; // This is the Group, parent of the PerspectiveCamera\n\n this.camRig = this.data.cameraRig.object3D;\n\n // collision\n this.rayCaster = new THREE.Raycaster();\n this.collisionObjectNormalMatrix = new THREE.Matrix3();\n this.collisionWorldNormal = new THREE.Vector3();\n this.referenceNormal = new THREE.Vector3();\n this.rayCastObjects = [];\n\n // Update collision normal\n this.referenceNormal.copy(this.data.landingNormal);\n\n // RING teleport indicator\n const geo = new THREE.RingGeometry(0.25, 0.3, 32, 1);\n geo.rotateX(-Math.PI / 2);\n geo.translate(0, 0.02, 0);\n const mat = new THREE.MeshBasicMaterial({ color: this.data.cursorColor });\n const indicatorRing = new THREE.Mesh(geo, mat);\n const group = new THREE.Group();\n group.add(indicatorRing);\n this.teleportIndicator = group;\n this.teleportIndicator.visible = false;\n\n if (this.data.cursorType === 'cylinder') {\n // CYLINDER teleport indicator\n const geoCyl = new THREE.CylinderGeometry(0.3, 0.3, 0.5, 32, 1, true);\n geoCyl.translate(0, 0.25, 0);\n // texture source MIT license https://github.com/fernandojsg/aframe-teleport-controls/blob/master/lib/cylinderTexture.js\n const textureString =\n 'data:image/png;base64,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';\n const textureCyl = new THREE.TextureLoader().load(textureString);\n const matCyl = new THREE.MeshBasicMaterial({\n color: this.data.cursorColor,\n side: 'double',\n map: textureCyl,\n transparent: true,\n depthTest: false\n });\n const indicatorCyl = new THREE.Mesh(geoCyl, matCyl);\n group.add(indicatorCyl);\n }\n\n sceneEl.object3D.add(this.teleportIndicator);\n\n // transition\n this.transitioning = false;\n this.transitionProgress = 0;\n this.transitionCamPosStart = new THREE.Vector3();\n this.transitionCamPosEnd = new THREE.Vector3();\n this.transitionCamQuaternionStart = new THREE.Quaternion();\n this.transitionCamQuaternionEnd = new THREE.Quaternion();\n\n // Bind functions\n this.updateRaycastObjects = this.updateRaycastObjects.bind(this);\n this.getMouseState = this.getMouseState.bind(this);\n this.getTeleportPosition = this.getTeleportPosition.bind(this);\n this.isValidNormalsAngle = this.isValidNormalsAngle.bind(this);\n this.transition = this.transition.bind(this);\n this.mouseMove = this.mouseMove.bind(this);\n this.mouseDown = this.mouseDown.bind(this);\n this.mouseUp = this.mouseUp.bind(this);\n this.easeInOutQuad = this.easeInOutQuad.bind(this);\n this.teleportTo = this.teleportTo.bind(this);\n this.hideCursor = this.hideCursor.bind(this);\n\n this.updateRaycastObjects();\n },\n\n remove() {\n this.cam = null;\n this.canvas = null;\n this.rayCastObjects.length = 0;\n this.el.sceneEl.object3D.remove(this.teleportIndicator);\n for (const child of this.teleportIndicator.children) {\n child.material.dispose();\n child.geometry.dispose();\n }\n this.teleportIndicator = null;\n if (this.collisionMesh) {\n this.collisionMesh.geometry.dispose();\n this.collisionMesh.material.dispose();\n this.collisionMesh = null;\n }\n },\n\n update(oldData) {\n if (typeof oldData.enabled === 'undefined') return;\n if (!oldData.enabled && this.data.enabled) {\n this.registerEventListeners();\n }\n if (oldData.enabled && !this.data.enabled) {\n // Call unregisterEventListeners instead of pause that is a wrapped method unregistering tick method\n // because we still want the tick method to use the component via the teleportTo api.\n this.unregisterEventListeners();\n }\n },\n\n registerEventListeners() {\n const canvas = this.canvas;\n canvas.addEventListener('mousedown', this.mouseDown, false);\n canvas.addEventListener('mousemove', this.mouseMove, false);\n canvas.addEventListener('mouseup', this.mouseUp, false);\n canvas.addEventListener('touchstart', this.mouseDown, false);\n canvas.addEventListener('touchmove', this.mouseMove, false);\n canvas.addEventListener('touchend', this.mouseUp, false);\n window.addEventListener('keydown', this.hideCursor, false);\n },\n\n unregisterEventListeners() {\n this.transitioning = false;\n this.hideCursor();\n const canvas = this.canvas;\n canvas.removeEventListener('mousedown', this.mouseDown);\n canvas.removeEventListener('mousemove', this.mouseMove);\n canvas.removeEventListener('mouseup', this.mouseUp);\n canvas.removeEventListener('touchstart', this.mouseDown);\n canvas.removeEventListener('touchmove', this.mouseMove);\n canvas.removeEventListener('touchend', this.mouseUp);\n window.removeEventListener('keydown', this.hideCursor);\n },\n\n play() {\n if (!this.data.enabled) return;\n this.registerEventListeners();\n },\n\n pause() {\n this.unregisterEventListeners();\n },\n\n updateRaycastObjects() {\n // updates the array of meshes we will need to raycast to\n // clear the array of any existing meshes\n this.rayCastObjects.length = 0;\n\n if (this.data.collisionEntities !== '') {\n // traverse collision entities and add their meshes to the rayCastEntities array.\n const collisionEntities = this.el.sceneEl.querySelectorAll(this.data.collisionEntities);\n\n collisionEntities.forEach((e) => {\n e.object3D.traverse((child) => {\n if (child.isMesh) {\n // mark this mesh as a collision object\n child.userData.collision = true;\n this.rayCastObjects.push(child);\n }\n });\n });\n } else {\n if (!this.collisionMesh) {\n // if no collision entities are specified, create a default ground plane collision.\n const geo = new THREE.PlaneGeometry(this.data.defaultPlaneSize, this.data.defaultPlaneSize, 1);\n geo.rotateX(-Math.PI / 2);\n const mat = new THREE.MeshNormalMaterial();\n const collisionMesh = new THREE.Mesh(geo, mat);\n // mark this mesh as a collision object\n collisionMesh.userData.collision = true;\n this.collisionMesh = collisionMesh;\n }\n this.rayCastObjects.push(this.collisionMesh);\n }\n\n // We may need some entities to be seen by the raycaster even though they are not teleportable.\n // This prevents the user from unnesserily teleporting when clicking things like buttons or UI.\n if (this.data.ignoreEntities !== '') {\n const ignoreEntities = this.el.sceneEl.querySelectorAll(this.data.ignoreEntities);\n ignoreEntities.forEach((e) => {\n e.object3D.traverse((child) => {\n if (child.isMesh) {\n this.rayCastObjects.push(child);\n }\n });\n });\n }\n },\n\n getMouseState: (function () {\n const coordinates = new THREE.Vector2();\n return function (e) {\n const rect = this.canvas.getBoundingClientRect();\n if (e.clientX != null) {\n coordinates.x = e.clientX - rect.left;\n coordinates.y = e.clientY - rect.top;\n return coordinates;\n } else if (e.touches[0] != null) {\n coordinates.x = e.touches[0].clientX - rect.left;\n coordinates.y = e.touches[0].clientY - rect.top;\n return coordinates;\n }\n };\n })(),\n\n getTeleportPosition: (function () {\n const mouse = new THREE.Vector2();\n return function (mouseX, mouseY) {\n if (this.rayCastObjects.length !== 0) {\n if (this.cam && this.canvas) {\n const cam = this.cam;\n const rect = this.canvas.getBoundingClientRect();\n\n mouse.x = (mouseX / (rect.right - rect.left)) * 2 - 1;\n mouse.y = -(mouseY / (rect.bottom - rect.top)) * 2 + 1;\n this.rayCaster.setFromCamera(mouse, cam);\n const intersects = this.rayCaster.intersectObjects(this.rayCastObjects);\n if (intersects.length !== 0 && this.isValidNormalsAngle(intersects[0].face.normal, intersects[0].object)) {\n if (intersects[0].object.userData.collision === true) {\n return intersects[0].point;\n }\n return false;\n } else {\n return false;\n }\n } else {\n return false;\n }\n } else {\n return false;\n }\n };\n })(),\n\n isValidNormalsAngle(collisionNormal, collisionObject) {\n this.collisionObjectNormalMatrix.getNormalMatrix(collisionObject.matrixWorld);\n this.collisionWorldNormal.copy(collisionNormal).applyNormalMatrix(this.collisionObjectNormalMatrix);\n const angleNormals = this.referenceNormal.angleTo(this.collisionWorldNormal);\n return THREE.MathUtils.RAD2DEG * angleNormals <= this.data.landingMaxAngle;\n },\n\n transition(destPos, destQuaternion = undefined) {\n this.transitionProgress = 0;\n this.transitionCamPosEnd.copy(destPos);\n this.transitionCamPosStart.copy(this.camRig.position);\n if (destQuaternion) {\n this.transitionCamQuaternionEnd.copy(destQuaternion);\n this.transitionCamQuaternionStart.copy(this.camRig.quaternion);\n } else {\n this.transitionCamQuaternionEnd.copy(this.camRig.quaternion);\n this.transitionCamQuaternionStart.copy(this.transitionCamQuaternionEnd);\n }\n this.transitioning = true;\n this.el.emit('navigation-start');\n },\n\n hideCursor() {\n this.teleportIndicator.visible = false;\n },\n\n mouseMove(e) {\n const mouseState = this.getMouseState(e);\n this.mouseX = mouseState.x;\n this.mouseY = mouseState.y;\n },\n\n mouseDown(e) {\n this.updateRaycastObjects();\n\n const mouseState = this.getMouseState(e);\n this.mouseX = mouseState.x;\n this.mouseY = mouseState.y;\n\n this.mouseXOrig = mouseState.x;\n this.mouseYOrig = mouseState.y;\n },\n\n mouseUp(e) {\n if (this.mouseX === this.mouseXOrig && this.mouseY === this.mouseYOrig) {\n const pos = this.getTeleportPosition(this.mouseX, this.mouseY);\n if (pos) {\n this.teleportIndicator.visible = true;\n this.teleportIndicator.position.copy(pos);\n this.transition(pos);\n }\n }\n },\n\n teleportTo(pos, quaternion = undefined) {\n this.teleportIndicator.position.copy(pos);\n if (!quaternion) {\n this.transition(pos);\n } else {\n const destQuaternion = new THREE.Quaternion();\n destQuaternion.setFromEuler(new THREE.Euler(0, this.camForRotation.rotation.y, 0));\n destQuaternion.invert();\n destQuaternion.multiply(quaternion);\n this.transition(pos, destQuaternion);\n }\n // don't show the indicator when using via api\n this.hideCursor();\n },\n\n easeInOutQuad(t) {\n return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;\n },\n\n tick(time, delta) {\n if (!this.transitioning && !this.mobile) {\n const pos = this.getTeleportPosition(this.mouseX, this.mouseY);\n if (pos) {\n this.teleportIndicator.position.copy(pos);\n }\n }\n if (this.transitioning) {\n this.transitionProgress += delta * this.data.transitionSpeed;\n const easeInOutTransitionProgress = this.easeInOutQuad(this.transitionProgress);\n const value =\n easeInOutTransitionProgress < 0.5 ? easeInOutTransitionProgress : 0.5 - 1 * (easeInOutTransitionProgress - 0.5);\n this.teleportIndicator.scale.set(0.5 + value, 1, 0.5 + value);\n\n // set camera position\n const camPos = this.camRig.position;\n camPos.lerpVectors(this.transitionCamPosStart, this.transitionCamPosEnd, easeInOutTransitionProgress);\n\n this.camRig.quaternion.slerpQuaternions(\n this.transitionCamQuaternionStart,\n this.transitionCamQuaternionEnd,\n easeInOutTransitionProgress\n );\n\n if (this.transitionProgress >= 1) {\n this.transitioning = false;\n camPos.copy(this.transitionCamPosEnd);\n this.camRig.quaternion.copy(this.transitionCamQuaternionEnd);\n this.el.emit('navigation-end');\n }\n }\n }\n});\n"],"names":["root","factory","exports","module","define","amd","a","i","self","AFRAME","Error","registerComponent","schema","enabled","type","default","cameraHead","cameraRig","collisionEntities","cursorColor","cursorType","oneOf","defaultPlaneSize","ignoreEntities","landingMaxAngle","min","max","landingNormal","x","y","z","transitionSpeed","init","this","mobile","utils","device","isMobile","isMobileDeviceRequestingDesktopSite","sceneEl","el","canvas","renderer","domElement","data","object3D","traverse","child","THREE","Camera","cam","camForRotation","camRig","rayCaster","Raycaster","collisionObjectNormalMatrix","Matrix3","collisionWorldNormal","Vector3","referenceNormal","rayCastObjects","copy","geo","RingGeometry","rotateX","Math","PI","translate","mat","MeshBasicMaterial","color","indicatorRing","Mesh","group","Group","add","teleportIndicator","visible","geoCyl","CylinderGeometry","textureString","textureCyl","TextureLoader","load","matCyl","side","map","transparent","depthTest","indicatorCyl","transitioning","transitionProgress","transitionCamPosStart","transitionCamPosEnd","transitionCamQuaternionStart","Quaternion","transitionCamQuaternionEnd","updateRaycastObjects","bind","getMouseState","getTeleportPosition","isValidNormalsAngle","transition","mouseMove","mouseDown","mouseUp","easeInOutQuad","teleportTo","hideCursor","remove","length","children","material","dispose","geometry","collisionMesh","update","oldData","registerEventListeners","unregisterEventListeners","addEventListener","window","removeEventListener","play","pause","querySelectorAll","forEach","e","isMesh","userData","collision","push","PlaneGeometry","MeshNormalMaterial","coordinates","Vector2","rect","getBoundingClientRect","clientX","left","clientY","top","touches","mouse","mouseX","mouseY","right","bottom","setFromCamera","intersects","intersectObjects","face","normal","object","point","collisionNormal","collisionObject","getNormalMatrix","matrixWorld","applyNormalMatrix","angleNormals","angleTo","MathUtils","RAD2DEG","destPos","destQuaternion","undefined","position","quaternion","emit","mouseState","mouseXOrig","mouseYOrig","pos","setFromEuler","Euler","rotation","invert","multiply","t","tick","time","delta","easeInOutTransitionProgress","value","scale","set","camPos","lerpVectors","slerpQuaternions"],"sourceRoot":""} -------------------------------------------------------------------------------- /examples/basic/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | A-Frame Cursor Teleport Component - Basic 6 | 7 | 8 | 9 | 10 | 11 | 12 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 38 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /examples/custom/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | A-Frame Cursor Teleport Component - Custom 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 43 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | -------------------------------------------------------------------------------- /examples/custom/models/environment.glb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/c-frame/aframe-cursor-teleport/658818f6f6c17a113c173cd04c8743b131ceb5ba/examples/custom/models/environment.glb -------------------------------------------------------------------------------- /examples/custom/models/vr-collider.mtl: -------------------------------------------------------------------------------- 1 | # Blender MTL File: 'environment.blend' 2 | # Material Count: 1 3 | 4 | newmtl uv-checker|lm_environment 5 | Ns 9.000004 6 | Ka 1.000000 1.000000 1.000000 7 | Kd 0.800000 0.800000 0.800000 8 | Ks 0.500000 0.500000 0.500000 9 | Ke 0.000000 0.000000 0.000000 10 | Ni 1.450000 11 | d 1.000000 12 | illum 2 13 | map_Kd C:\\Paragram\\vr-development\\2020-07-24_navigator\\models\\textures\\uv-checker.jpg 14 | -------------------------------------------------------------------------------- /examples/custom/models/vr-collider.obj: -------------------------------------------------------------------------------- 1 | # Blender v2.83.0 OBJ File: 'environment.blend' 2 | # www.blender.org 3 | mtllib vr-collider.mtl 4 | o Plane 5 | v -8.000000 0.000000 8.000000 6 | v 8.000000 0.000000 8.000000 7 | v -8.000000 0.000000 -8.000000 8 | v 8.000000 0.000000 -8.000000 9 | v -8.000000 0.000000 -4.000000 10 | v -8.000000 0.000000 0.000000 11 | v -8.000000 0.000000 4.000000 12 | v 8.000000 0.000000 4.000000 13 | v 8.000000 0.000000 0.000000 14 | v 8.000000 0.000000 -4.000000 15 | v -4.000000 0.000000 8.000000 16 | v 0.000000 0.000000 8.000000 17 | v 4.000000 0.000000 8.000000 18 | v 4.000000 0.000000 -8.000000 19 | v 0.000000 0.000000 -8.000000 20 | v -4.000000 0.000000 -8.000000 21 | v 4.000000 0.000000 4.000000 22 | v 0.000000 0.000000 4.000000 23 | v -4.000000 0.000000 4.000000 24 | v 4.000000 0.000000 0.000000 25 | v 0.000000 0.000000 0.000000 26 | v -4.000000 0.000000 0.000000 27 | v 4.000000 0.000000 -4.000000 28 | v 0.000000 0.000000 -4.000000 29 | v -4.000000 0.000000 -4.000000 30 | v -8.000000 -0.328289 8.000000 31 | v 8.000000 -0.328289 8.000000 32 | v -8.000000 -0.328289 -8.000000 33 | v 8.000000 -0.328289 -8.000000 34 | v -8.000000 -0.328289 -4.000000 35 | v -8.000000 -0.328289 0.000000 36 | v -8.000000 -0.328289 4.000000 37 | v 8.000000 -0.328289 4.000000 38 | v 8.000000 -0.328289 0.000000 39 | v 8.000000 -0.328289 -4.000000 40 | v -4.000000 -0.328289 8.000000 41 | v 0.000000 -0.328289 8.000000 42 | v 4.000000 -0.328289 8.000000 43 | v 4.000000 -0.328289 -8.000000 44 | v 0.000000 -0.328289 -8.000000 45 | v -4.000000 -0.328289 -8.000000 46 | v -6.590962 -0.328289 6.590962 47 | v 6.590962 -0.328289 6.590962 48 | v -6.590962 -0.328289 -6.590962 49 | v 6.590962 -0.328289 -6.590962 50 | v -6.590962 -0.328289 -3.295481 51 | v -6.590962 -0.328289 0.000000 52 | v -6.590962 -0.328289 3.295481 53 | v 6.590962 -0.328289 3.295481 54 | v 6.590962 -0.328289 0.000000 55 | v 6.590962 -0.328289 -3.295481 56 | v -3.295481 -0.328289 6.590962 57 | v 0.000000 -0.328289 6.590962 58 | v 3.295481 -0.328289 6.590962 59 | v 3.295481 -0.328289 -6.590962 60 | v 0.000000 -0.328289 -6.590962 61 | v -3.295481 -0.328289 -6.590962 62 | v -6.590962 -2.940611 6.590962 63 | v 6.590962 -2.940611 6.590962 64 | v -6.590962 -2.940611 -6.590962 65 | v 6.590962 -2.940611 -6.590962 66 | v -6.590962 -2.940611 -3.295481 67 | v -6.590962 -2.940611 0.000000 68 | v -6.590962 -2.940611 3.295481 69 | v 6.590962 -2.940611 3.295481 70 | v 6.590962 -2.940611 0.000000 71 | v 6.590962 -2.940611 -3.295481 72 | v -3.295481 -2.940611 6.590962 73 | v 0.000000 -2.940611 6.590962 74 | v 3.295481 -2.940611 6.590962 75 | v 3.295481 -2.940611 -6.590962 76 | v 0.000000 -2.940611 -6.590962 77 | v -3.295481 -2.940611 -6.590962 78 | v 0.000001 0.000000 -3.069546 79 | v 0.390181 0.038430 -3.069546 80 | v 0.765368 0.152241 -3.069546 81 | v 1.111141 0.337061 -3.069546 82 | v 1.961571 1.609821 -3.069546 83 | v 2.000000 2.000002 -3.069546 84 | v 1.414214 0.585787 -3.069546 85 | v 1.662940 0.888861 -3.069546 86 | v 1.847760 1.234635 -3.069546 87 | v 0.000001 0.000000 -6.069546 88 | v 0.390181 0.038430 -6.069546 89 | v 0.765368 0.152241 -6.069546 90 | v 1.111141 0.337061 -6.069546 91 | v 1.414214 0.585787 -6.069546 92 | v 1.662940 0.888861 -6.069546 93 | v 1.847760 1.234635 -6.069546 94 | v 1.961571 1.609821 -6.069546 95 | v 2.000000 2.000002 -6.069546 96 | v 2.964541 0.000000 -3.069546 97 | v 2.964541 0.000000 -6.069546 98 | v 2.964541 2.000002 -3.069546 99 | v 2.964541 2.000002 -6.069546 100 | v -2.118722 -0.000003 1.293438 101 | v -2.118722 2.982726 1.293438 102 | v -2.118722 -0.000003 1.418745 103 | v -2.118722 2.982726 1.418745 104 | v -7.346629 -0.000003 1.293438 105 | v -7.346629 2.982726 1.293438 106 | v -7.346629 -0.000003 1.418745 107 | v -7.346629 2.982726 1.418745 108 | v 5.389536 -0.000003 0.495008 109 | v 5.389536 2.982726 0.495008 110 | v 5.514844 -0.000003 0.495008 111 | v 5.514844 2.982726 0.495008 112 | v 5.389537 -0.000003 5.722915 113 | v 5.389537 2.982726 5.722915 114 | v 5.514844 -0.000003 5.722915 115 | v 5.514844 2.982726 5.722915 116 | v 0.240513 0.899911 3.990598 117 | v 0.240513 1.099911 3.990598 118 | v 0.240513 0.899911 1.990598 119 | v 0.240513 1.099911 1.990598 120 | v 2.240513 0.899911 3.990598 121 | v 2.240513 1.099911 3.990598 122 | v 2.240513 0.899911 1.990598 123 | v 2.240513 1.099911 1.990598 124 | v 1.479873 1.639635 5.294719 125 | v 1.479873 1.839635 5.294719 126 | v 1.479873 1.639635 3.294719 127 | v 1.479873 1.839635 3.294719 128 | v 3.479873 1.639635 5.294719 129 | v 3.479873 1.839635 5.294719 130 | v 3.479873 1.639635 3.294719 131 | v 3.479873 1.839635 3.294719 132 | v 0.288719 2.420509 6.772532 133 | v 0.288719 2.620509 6.772532 134 | v 0.288719 2.420509 4.772532 135 | v 0.288719 2.620509 4.772532 136 | v 2.288719 2.420509 6.772532 137 | v 2.288719 2.620509 6.772532 138 | v 2.288719 2.420509 4.772532 139 | v 2.288719 2.620509 4.772532 140 | v -16.000000 -0.691323 16.000000 141 | v 16.000000 -0.048527 16.000000 142 | v -16.000000 -0.584955 -16.000000 143 | v 16.000000 -0.911990 -16.000000 144 | v -8.000000 -0.911990 16.000000 145 | v 0.000000 0.464535 16.000000 146 | v 8.000000 0.851952 16.000000 147 | v 8.000000 0.826505 -16.000000 148 | v 0.000000 0.147359 -16.000000 149 | v -8.000000 -0.584955 -16.000000 150 | v -16.000000 1.459539 -8.000000 151 | v -16.000000 -0.366294 0.000000 152 | v -16.000000 1.084192 8.000000 153 | v 16.000000 0.867325 8.000000 154 | v 16.000000 0.321344 0.000000 155 | v 16.000000 -0.133569 -8.000000 156 | v -8.000000 -0.911990 8.000000 157 | v -8.000000 -0.911990 0.000000 158 | v -8.000000 -0.880091 -8.000000 159 | v 0.000000 -0.911990 8.000000 160 | v 0.000000 -0.911990 0.000000 161 | v 0.000000 -0.911990 -8.000000 162 | v 8.000000 -0.797832 8.000000 163 | v 8.000000 -0.911990 0.000000 164 | v 8.000000 -0.453127 -8.000000 165 | v -16.000000 0.549155 10.666667 166 | v -16.000000 -0.096277 13.333334 167 | v 10.666667 0.226302 16.000000 168 | v 13.333334 0.128510 16.000000 169 | v 16.000000 -0.453127 -10.666667 170 | v 16.000000 -0.749373 -13.333334 171 | v -10.666667 -0.166009 -16.000000 172 | v -13.333334 -0.166009 -16.000000 173 | v -13.333333 -0.797832 16.000000 174 | v -10.666666 -0.911990 16.000000 175 | v -5.333333 -0.880091 16.000000 176 | v -2.666667 -0.402945 16.000000 177 | v 2.666667 1.330854 16.000000 178 | v 5.333333 1.303651 16.000000 179 | v 13.333333 -0.565240 -16.000000 180 | v 10.666666 0.311224 -16.000000 181 | v 5.333333 0.784997 -16.000000 182 | v 2.666667 0.445479 -16.000000 183 | v -2.666667 -0.402945 -16.000000 184 | v -5.333333 -0.880091 -16.000000 185 | v -8.000000 -0.584955 -10.666667 186 | v -8.000000 -0.402945 -13.333334 187 | v 0.000000 -0.721581 -10.666667 188 | v 0.000000 -0.166009 -13.333334 189 | v 8.000000 -0.132838 -10.666667 190 | v 8.000000 0.451101 -13.333334 191 | v -16.000000 -0.358722 -13.333333 192 | v -16.000000 0.142027 -10.666666 193 | v -16.000000 1.806245 -5.333333 194 | v -16.000000 0.650969 -2.666667 195 | v -16.000000 0.286597 2.666667 196 | v -16.000000 1.015272 5.333333 197 | v 16.000000 0.869034 13.333333 198 | v 16.000000 1.151055 10.666666 199 | v 16.000000 0.188060 5.333333 200 | v 16.000000 -0.084642 2.666667 201 | v 16.000000 0.794605 -2.666667 202 | v 16.000000 0.450542 -5.333333 203 | v -8.000000 -0.911990 13.333333 204 | v -8.000000 -0.911990 10.666666 205 | v -8.000000 -0.911990 5.333333 206 | v -8.000000 -0.911990 2.666667 207 | v -8.000000 -0.911990 -2.666667 208 | v -8.000000 -0.911990 -5.333333 209 | v 0.000000 0.001121 13.333333 210 | v 0.000000 -0.721581 10.666666 211 | v 0.000000 -0.911990 5.333333 212 | v 0.000000 -0.911990 2.666667 213 | v 0.000000 -0.911990 -2.666667 214 | v 0.000000 -0.911990 -5.333333 215 | v 8.000000 0.728121 13.333333 216 | v 8.000000 -0.181277 10.666666 217 | v 8.000000 -0.911990 5.333333 218 | v 8.000000 -0.911990 2.666667 219 | v 8.000000 -0.911990 -2.666667 220 | v 8.000000 -0.749374 -5.333333 221 | v 5.333333 -0.911990 8.000000 222 | v 2.666667 -0.911990 8.000000 223 | v 5.333333 -0.911990 0.000000 224 | v 2.666667 -0.911990 0.000000 225 | v 5.333333 -0.890267 -8.000000 226 | v 2.666667 -0.911990 -8.000000 227 | v -2.666667 -0.911990 8.000000 228 | v -5.333333 -0.911990 8.000000 229 | v -2.666667 -0.911990 0.000000 230 | v -5.333333 -0.911990 0.000000 231 | v -2.666667 -0.911990 -8.000000 232 | v -5.333333 -0.911990 -8.000000 233 | v -10.666667 -0.629891 8.000000 234 | v -13.333334 0.473982 8.000000 235 | v -10.666667 -0.911990 0.000000 236 | v -13.333334 -0.629891 0.000000 237 | v -10.666667 -0.458944 -8.000000 238 | v -13.333334 0.735703 -8.000000 239 | v 13.333333 0.306705 8.000000 240 | v 10.666666 -0.644337 8.000000 241 | v 13.333333 -0.080276 0.000000 242 | v 10.666666 -0.743843 0.000000 243 | v 13.333333 0.210789 -8.000000 244 | v 10.666666 0.059304 -8.000000 245 | v 10.666666 -0.565250 -2.666667 246 | v 10.666666 -0.288780 -5.333333 247 | v 13.333333 0.311201 -2.666667 248 | v 13.333333 0.365959 -5.333333 249 | v 10.666666 -0.721581 5.333333 250 | v 10.666666 -0.880091 2.666667 251 | v 13.333333 -0.162306 5.333333 252 | v 13.333333 -0.418743 2.666667 253 | v 10.666667 0.506398 13.333333 254 | v 10.666666 0.175744 10.666666 255 | v 13.333334 0.982874 13.333333 256 | v 13.333334 0.742900 10.666666 257 | v -13.333334 0.124289 -2.666667 258 | v -13.333334 0.999198 -5.333333 259 | v -10.666667 -0.758749 -2.666667 260 | v -10.666667 -0.427487 -5.333333 261 | v -13.333334 0.402985 5.333333 262 | v -13.333334 -0.085518 2.666667 263 | v -10.666667 -0.588231 5.333333 264 | v -10.666667 -0.744726 2.666667 265 | v -13.333333 -0.349372 13.333333 266 | v -13.333334 0.065507 10.666666 267 | v -10.666666 -0.797833 13.333333 268 | v -10.666666 -0.691323 10.666666 269 | v -5.333333 -0.911990 -2.666667 270 | v -5.333333 -0.911990 -5.333333 271 | v -2.666667 -0.911990 -2.666667 272 | v -2.666667 -0.911990 -5.333333 273 | v -5.333333 -0.911990 5.333333 274 | v -5.333333 -0.911990 2.666667 275 | v -2.666667 -0.911990 5.333333 276 | v -2.666667 -0.911990 2.666667 277 | v -5.333333 -0.908978 13.333333 278 | v -5.333333 -0.911990 10.666666 279 | v -2.666667 -0.584955 13.333333 280 | v -2.666667 -0.880091 10.666666 281 | v 2.666667 -0.911990 -2.666667 282 | v 2.666667 -0.911990 -5.333333 283 | v 5.333333 -0.911990 -2.666667 284 | v 5.333333 -0.911990 -5.333333 285 | v 2.666667 -0.911990 5.333333 286 | v 2.666667 -0.911990 2.666667 287 | v 5.333333 -0.911990 5.333333 288 | v 5.333333 -0.911990 2.666667 289 | v 2.666667 0.660122 13.333333 290 | v 2.666667 -0.555272 10.666666 291 | v 5.333333 0.614561 13.333333 292 | v 5.333333 -0.476861 10.666666 293 | v 2.666667 -0.721581 -10.666667 294 | v 2.666667 -0.006984 -13.333334 295 | v 5.333333 -0.711943 -10.666667 296 | v 5.333333 0.239761 -13.333334 297 | v -5.333333 -0.908978 -10.666667 298 | v -5.333333 -0.880091 -13.333334 299 | v -2.666667 -0.880091 -10.666667 300 | v -2.666667 -0.584955 -13.333334 301 | v -13.333334 0.312484 -10.666667 302 | v -13.333334 0.151796 -13.333334 303 | v -10.666667 -0.119929 -10.666667 304 | v -10.666667 0.147359 -13.333334 305 | v 10.666666 0.211838 -10.666667 306 | v 10.666666 0.367246 -13.333334 307 | v 13.333333 0.059304 -10.666667 308 | v 13.333333 -0.288272 -13.333334 309 | v -16.000000 -0.402945 14.666667 310 | v 14.666667 0.090468 16.000000 311 | v 16.000000 -0.880091 -14.666667 312 | v -14.666667 -0.349372 -16.000000 313 | v -9.333333 -0.911990 16.000000 314 | v -1.333333 -0.050158 16.000000 315 | v 6.666667 0.972866 16.000000 316 | v 9.333333 0.651315 -16.000000 317 | v 1.333333 0.282623 -16.000000 318 | v -6.666667 -0.797832 -16.000000 319 | v -8.000000 -0.453127 -14.666667 320 | v 0.000000 0.059304 -14.666667 321 | v 8.000000 0.680266 -14.666667 322 | v -16.000000 0.780549 -9.333333 323 | v -16.000000 -0.085769 -1.333333 324 | v -16.000000 1.151054 6.666667 325 | v 16.000000 1.084192 9.333333 326 | v 16.000000 0.056380 1.333333 327 | v 16.000000 0.160253 -6.666667 328 | v -8.000000 -0.911990 9.333333 329 | v -8.000000 -0.911990 1.333333 330 | v -8.000000 -0.911990 -6.666667 331 | v 0.000000 -0.890267 9.333333 332 | v 0.000000 -0.911990 1.333333 333 | v 0.000000 -0.911990 -6.666667 334 | v 8.000000 -0.580610 9.333333 335 | v 8.000000 -0.911990 1.333333 336 | v 8.000000 -0.584955 -6.666667 337 | v 1.333333 -0.911990 8.000000 338 | v 1.333333 -0.911990 0.000000 339 | v 1.333333 -0.911990 -8.000000 340 | v -6.666667 -0.911990 8.000000 341 | v -6.666667 -0.911990 0.000000 342 | v -6.666667 -0.911990 -8.000000 343 | v -14.666667 0.917451 8.000000 344 | v -14.666667 -0.441142 0.000000 345 | v -14.666667 1.257823 -8.000000 346 | v 9.333333 -0.721581 8.000000 347 | v 9.333333 -0.907554 0.000000 348 | v 9.333333 -0.166009 -8.000000 349 | v -16.000000 0.867325 9.333334 350 | v -16.000000 0.188060 12.000000 351 | v 9.333334 0.581374 16.000000 352 | v 12.000000 0.067480 16.000000 353 | v 16.000000 -0.358329 -9.333334 354 | v 16.000000 -0.584955 -12.000000 355 | v -9.333334 -0.349371 -16.000000 356 | v -12.000000 -0.096277 -16.000000 357 | v -14.666666 -0.721581 16.000000 358 | v -12.000000 -0.880091 16.000000 359 | v -6.666667 -0.911990 16.000000 360 | v -4.000000 -0.691323 16.000000 361 | v 1.333333 0.978450 16.000000 362 | v 4.000000 1.456893 16.000000 363 | v 14.666666 -0.862000 -16.000000 364 | v 12.000000 -0.130298 -16.000000 365 | v 6.666667 0.866306 -16.000000 366 | v 4.000000 0.627421 -16.000000 367 | v -1.333333 -0.096277 -16.000000 368 | v -4.000000 -0.691323 -16.000000 369 | v -8.000000 -0.749373 -9.333334 370 | v -8.000000 -0.453127 -12.000000 371 | v 0.000000 -0.890266 -9.333334 372 | v 0.000000 -0.453127 -12.000000 373 | v 8.000000 -0.358044 -9.333334 374 | v 8.000000 0.161102 -12.000000 375 | v -16.000000 -0.453127 -14.666666 376 | v -16.000000 -0.137437 -12.000000 377 | v -16.000000 1.853955 -6.666667 378 | v -16.000000 1.348855 -4.000000 379 | v -16.000000 -0.131828 1.333333 380 | v -16.000000 0.677538 4.000000 381 | v 16.000000 0.479860 14.666666 382 | v 16.000000 1.015272 12.000000 383 | v 16.000000 0.549155 6.666667 384 | v 16.000000 -0.055248 4.000000 385 | v 16.000000 0.648367 -1.333333 386 | v 16.000000 0.680188 -4.000000 387 | v -8.000000 -0.911990 14.666666 388 | v -8.000000 -0.911990 12.000000 389 | v -8.000000 -0.911990 6.666667 390 | v -8.000000 -0.911990 4.000000 391 | v -8.000000 -0.911990 -1.333333 392 | v -8.000000 -0.911990 -4.000000 393 | v 0.000000 0.334655 14.666666 394 | v 0.000000 -0.406164 12.000000 395 | v 0.000000 -0.911990 6.666667 396 | v 0.000000 -0.911990 4.000000 397 | v 0.000000 -0.911990 -1.333333 398 | v 0.000000 -0.911990 -4.000000 399 | v 8.000000 0.929645 14.666666 400 | v 8.000000 0.313857 12.000000 401 | v 8.000000 -0.908978 6.666667 402 | v 8.000000 -0.911990 4.000000 403 | v 8.000000 -0.911990 -1.333333 404 | v 8.000000 -0.880091 -4.000000 405 | v 6.666667 -0.880091 8.000000 406 | v 4.000000 -0.911990 8.000000 407 | v 6.666667 -0.911990 0.000000 408 | v 4.000000 -0.911990 0.000000 409 | v 6.666667 -0.721581 -8.000000 410 | v 4.000000 -0.911990 -8.000000 411 | v -1.333333 -0.911990 8.000000 412 | v -4.000000 -0.911990 8.000000 413 | v -1.333333 -0.911990 0.000000 414 | v -4.000000 -0.911990 0.000000 415 | v -1.333333 -0.911990 -8.000000 416 | v -4.000000 -0.911990 -8.000000 417 | v -9.333334 -0.904672 8.000000 418 | v -12.000000 -0.103622 8.000000 419 | v -9.333334 -0.911990 0.000000 420 | v -12.000000 -0.833434 0.000000 421 | v -9.333334 -0.772254 -8.000000 422 | v -12.000000 0.069567 -8.000000 423 | v 14.666666 0.712755 8.000000 424 | v 12.000000 -0.214850 8.000000 425 | v 14.666666 0.208492 0.000000 426 | v 12.000000 -0.430287 0.000000 427 | v 14.666666 0.101252 -8.000000 428 | v 12.000000 0.184539 -8.000000 429 | v 10.666666 -0.124034 -6.666667 430 | v 10.666666 -0.631530 -1.333333 431 | v 10.666666 -0.441991 -4.000000 432 | v 13.333333 0.297669 -6.666667 433 | v 13.333333 0.186794 -1.333333 434 | v 13.333333 0.375181 -4.000000 435 | v 9.333333 -0.861992 -2.666667 436 | v 9.333333 -0.580811 -5.333333 437 | v 12.000000 -0.130342 -2.666667 438 | v 12.000000 0.070314 -5.333333 439 | v 14.666666 0.651378 -2.666667 440 | v 14.666666 0.507872 -5.333333 441 | v 10.666666 -0.865004 1.333333 442 | v 10.666666 -0.691323 6.666667 443 | v 10.666666 -0.797833 4.000000 444 | v 13.333333 -0.316556 1.333333 445 | v 13.333333 0.065507 6.666667 446 | v 13.333333 -0.345771 4.000000 447 | v 9.333333 -0.890267 5.333333 448 | v 9.333333 -0.911990 2.666667 449 | v 12.000000 -0.453127 5.333333 450 | v 12.000000 -0.702632 2.666667 451 | v 14.666666 0.087167 5.333333 452 | v 14.666666 -0.177702 2.666667 453 | v 10.666666 -0.236304 9.333333 454 | v 10.666667 0.420593 14.666666 455 | v 10.666666 0.454313 12.000000 456 | v 13.333334 0.473982 9.333333 457 | v 13.333334 0.650106 14.666666 458 | v 13.333334 1.019074 12.000000 459 | v 9.333334 0.619202 13.333333 460 | v 9.333333 -0.119542 10.666666 461 | v 12.000000 0.795313 13.333333 462 | v 12.000000 0.498826 10.666666 463 | v 14.666667 1.021930 13.333333 464 | v 14.666667 0.973583 10.666666 465 | v -13.333334 1.029626 -6.666667 466 | v -13.333334 -0.426393 -1.333333 467 | v -13.333334 0.658200 -4.000000 468 | v -10.666667 -0.415932 -6.666667 469 | v -10.666667 -0.880091 -1.333333 470 | v -10.666667 -0.566844 -4.000000 471 | v -14.666667 0.505926 -2.666667 472 | v -14.666667 1.578016 -5.333333 473 | v -12.000000 -0.357081 -2.666667 474 | v -12.000000 0.260821 -5.333333 475 | v -9.333334 -0.908978 -2.666667 476 | v -9.333334 -0.855600 -5.333333 477 | v -13.333334 -0.428825 1.333333 478 | v -13.333334 0.513198 6.666667 479 | v -13.333334 0.187164 4.000000 480 | v -10.666667 -0.865454 1.333333 481 | v -10.666667 -0.600486 6.666667 482 | v -10.666667 -0.632699 4.000000 483 | v -14.666667 0.838705 5.333333 484 | v -14.666667 0.184079 2.666667 485 | v -12.000000 -0.131828 5.333333 486 | v -12.000000 -0.431881 2.666667 487 | v -9.333334 -0.865454 5.333333 488 | v -9.333334 -0.907688 2.666667 489 | v -13.333334 0.306705 9.333333 490 | v -13.333333 -0.584955 14.666666 491 | v -13.333334 -0.162306 12.000000 492 | v -10.666666 -0.674604 9.333333 493 | v -10.666666 -0.880091 14.666666 494 | v -10.666666 -0.721581 12.000000 495 | v -14.666666 -0.166009 13.333334 496 | v -14.666667 0.411195 10.666666 497 | v -12.000000 -0.584955 13.333333 498 | v -12.000000 -0.356726 10.666666 499 | v -9.333333 -0.908978 13.333333 500 | v -9.333333 -0.880091 10.666666 501 | v -5.333333 -0.911990 -6.666667 502 | v -5.333333 -0.911990 -1.333333 503 | v -5.333333 -0.911990 -4.000000 504 | v -2.666667 -0.911990 -6.666667 505 | v -2.666667 -0.911990 -1.333333 506 | v -2.666667 -0.911990 -4.000000 507 | v -6.666667 -0.911990 -2.666667 508 | v -6.666667 -0.911990 -5.333333 509 | v -4.000000 -0.911990 -2.666667 510 | v -4.000000 -0.911990 -5.333333 511 | v -1.333333 -0.911990 -2.666667 512 | v -1.333333 -0.911990 -5.333333 513 | v -5.333333 -0.911990 1.333333 514 | v -5.333333 -0.911990 6.666667 515 | v -5.333333 -0.911990 4.000000 516 | v -2.666667 -0.911990 1.333333 517 | v -2.666667 -0.911990 6.666667 518 | v -2.666667 -0.911990 4.000000 519 | v -6.666667 -0.911990 5.333333 520 | v -6.666667 -0.911990 2.666667 521 | v -4.000000 -0.911990 5.333333 522 | v -4.000000 -0.911990 2.666667 523 | v -1.333333 -0.911990 5.333333 524 | v -1.333333 -0.911990 2.666667 525 | v -5.333333 -0.911990 9.333333 526 | v -5.333333 -0.890267 14.666666 527 | v -5.333333 -0.911990 12.000000 528 | v -2.666667 -0.911990 9.333333 529 | v -2.666667 -0.453127 14.666666 530 | v -2.666667 -0.749373 12.000000 531 | v -6.666667 -0.911990 13.333333 532 | v -6.666667 -0.911990 10.666666 533 | v -4.000000 -0.797832 13.333333 534 | v -4.000000 -0.911990 10.666666 535 | v -1.333333 -0.344943 13.333333 536 | v -1.333333 -0.797833 10.666666 537 | v 2.666667 -0.911990 -6.666667 538 | v 2.666667 -0.911990 -1.333333 539 | v 2.666667 -0.911990 -4.000000 540 | v 5.333333 -0.908978 -6.666667 541 | v 5.333333 -0.911990 -1.333333 542 | v 5.333333 -0.911990 -4.000000 543 | v 1.333333 -0.911990 -2.666667 544 | v 1.333333 -0.911990 -5.333333 545 | v 4.000000 -0.911990 -2.666667 546 | v 4.000000 -0.911990 -5.333333 547 | v 6.666667 -0.911990 -2.666667 548 | v 6.666667 -0.880091 -5.333333 549 | v 2.666667 -0.911990 1.333333 550 | v 2.666667 -0.911990 6.666667 551 | v 2.666667 -0.911990 4.000000 552 | v 5.333333 -0.911990 1.333333 553 | v 5.333333 -0.911990 6.666667 554 | v 5.333333 -0.911990 4.000000 555 | v 1.333333 -0.911990 5.333333 556 | v 1.333333 -0.911990 2.666667 557 | v 4.000000 -0.911990 5.333333 558 | v 4.000000 -0.911990 2.666667 559 | v 6.666667 -0.911990 5.333333 560 | v 6.666667 -0.911990 2.666667 561 | v 2.666667 -0.886465 9.333333 562 | v 2.666667 1.146209 14.666666 563 | v 2.666667 0.028494 12.000000 564 | v 5.333333 -0.835190 9.333333 565 | v 5.333333 1.107037 14.666666 566 | v 5.333333 0.023858 12.000000 567 | v 1.333333 0.382352 13.333333 568 | v 1.333333 -0.645105 10.666666 569 | v 4.000000 0.749253 13.333333 570 | v 4.000000 -0.521106 10.666666 571 | v 6.666667 0.695840 13.333333 572 | v 6.666667 -0.305290 10.666666 573 | v 2.666667 0.318997 -14.666667 574 | v 2.666667 -0.890266 -9.333334 575 | v 2.666667 -0.407815 -12.000000 576 | v 5.333333 0.635517 -14.666667 577 | v 5.333333 -0.875654 -9.333334 578 | v 5.333333 -0.268230 -12.000000 579 | v 1.333333 -0.691323 -10.666667 580 | v 1.333333 -0.093382 -13.333334 581 | v 4.000000 -0.750909 -10.666667 582 | v 4.000000 0.123158 -13.333334 583 | v 6.666667 -0.441724 -10.666667 584 | v 6.666667 0.300575 -13.333334 585 | v -5.333333 -0.890266 -14.666667 586 | v -5.333333 -0.911990 -9.333334 587 | v -5.333333 -0.890267 -12.000000 588 | v -2.666667 -0.453127 -14.666667 589 | v -2.666667 -0.911990 -9.333334 590 | v -2.666667 -0.749373 -12.000000 591 | v -6.666667 -0.797833 -10.666667 592 | v -6.666667 -0.691323 -13.333334 593 | v -4.000000 -0.911990 -10.666667 594 | v -4.000000 -0.797832 -13.333334 595 | v -1.333333 -0.797832 -10.666667 596 | v -1.333333 -0.349372 -13.333334 597 | v -13.333334 0.059304 -14.666667 598 | v -13.333334 0.359153 -9.333334 599 | v -13.333334 0.227310 -12.000000 600 | v -10.666667 0.059304 -14.666667 601 | v -10.666667 -0.291459 -9.333334 602 | v -10.666667 0.059304 -12.000000 603 | v -14.666667 0.316627 -10.666666 604 | v -14.666667 -0.064729 -13.333334 605 | v -12.000000 0.141942 -10.666667 606 | v -12.000000 0.246643 -13.333334 607 | v -9.333334 -0.349372 -10.666667 608 | v -9.333334 -0.096277 -13.333334 609 | v 10.666666 0.375802 -14.666667 610 | v 10.666666 0.149350 -9.333334 611 | v 10.666666 0.299162 -12.000000 612 | v 13.333333 -0.441724 -14.666667 613 | v 13.333333 0.149228 -9.333334 614 | v 13.333333 -0.123626 -12.000000 615 | v 9.333333 0.102343 -10.666667 616 | v 9.333333 0.508976 -13.333334 617 | v 12.000000 0.185088 -10.666667 618 | v 12.000000 0.071335 -13.333334 619 | v 14.666666 -0.166009 -10.666667 620 | v 14.666666 -0.580757 -13.333334 621 | v 14.666666 -0.349371 -12.000000 622 | v 14.666666 -0.069131 -9.333334 623 | v 12.000000 0.129927 -12.000000 624 | v 12.000000 0.246643 -9.333334 625 | v 9.333333 0.315236 -12.000000 626 | v 9.333333 -0.068773 -9.333334 627 | v 12.000000 -0.016878 -14.666667 628 | v 9.333333 0.632353 -14.666667 629 | v -9.333334 -0.166009 -12.000000 630 | v -9.333334 -0.581883 -9.333334 631 | v -12.000000 0.194345 -12.000000 632 | v -12.000000 0.068899 -9.333334 633 | v -14.666667 0.112097 -12.000000 634 | v -14.666667 0.625666 -9.333333 635 | v -12.000000 0.147359 -14.666667 636 | v -14.666667 -0.166009 -14.666667 637 | v -1.333333 -0.584955 -12.000000 638 | v -1.333333 -0.908978 -9.333334 639 | v -4.000000 -0.880091 -12.000000 640 | v -4.000000 -0.911990 -9.333334 641 | v -6.666667 -0.721581 -12.000000 642 | v -6.666667 -0.880091 -9.333334 643 | v -4.000000 -0.721581 -14.666667 644 | v -6.666667 -0.721581 -14.666667 645 | v 6.666667 -0.122227 -12.000000 646 | v 6.666667 -0.659595 -9.333334 647 | v 4.000000 -0.347344 -12.000000 648 | v 4.000000 -0.908978 -9.333334 649 | v 1.333333 -0.402945 -12.000000 650 | v 1.333333 -0.880091 -9.333334 651 | v 4.000000 0.489553 -14.666667 652 | v 1.333333 0.171850 -14.666667 653 | v 6.666667 0.222649 12.000000 654 | v 6.666667 0.977354 14.666666 655 | v 4.000000 0.089591 12.000000 656 | v 4.000000 1.260742 14.666666 657 | v 1.333333 -0.163420 12.000000 658 | v 1.333333 0.811125 14.666666 659 | v 4.000000 -0.878896 9.333333 660 | v 1.333333 -0.880091 9.333333 661 | v 6.666667 -0.911990 4.000000 662 | v 6.666667 -0.911990 6.666667 663 | v 4.000000 -0.911990 4.000000 664 | v 4.000000 -0.911990 6.666667 665 | v 1.333333 -0.911990 4.000000 666 | v 1.333333 -0.911990 6.666667 667 | v 4.000000 -0.911990 1.333333 668 | v 1.333333 -0.911990 1.333333 669 | v 6.666667 -0.911990 -4.000000 670 | v 6.666667 -0.911990 -1.333333 671 | v 4.000000 -0.911990 -4.000000 672 | v 4.000000 -0.911990 -1.333333 673 | v 1.333333 -0.911990 -4.000000 674 | v 1.333333 -0.911990 -1.333333 675 | v 4.000000 -0.911990 -6.666667 676 | v 1.333333 -0.911990 -6.666667 677 | v -1.333333 -0.584955 12.000000 678 | v -1.333333 -0.134436 14.666666 679 | v -4.000000 -0.880091 12.000000 680 | v -4.000000 -0.721581 14.666666 681 | v -6.666667 -0.911990 12.000000 682 | v -6.666667 -0.911990 14.666666 683 | v -4.000000 -0.911990 9.333333 684 | v -6.666667 -0.911990 9.333333 685 | v -1.333333 -0.911990 4.000000 686 | v -1.333333 -0.911990 6.666667 687 | v -4.000000 -0.911990 4.000000 688 | v -4.000000 -0.911990 6.666667 689 | v -6.666667 -0.911990 4.000000 690 | v -6.666667 -0.911990 6.666667 691 | v -4.000000 -0.911990 1.333333 692 | v -6.666667 -0.911990 1.333333 693 | v -1.333333 -0.911990 -4.000000 694 | v -1.333333 -0.911990 -1.333333 695 | v -4.000000 -0.911990 -4.000000 696 | v -4.000000 -0.911990 -1.333333 697 | v -6.666667 -0.911990 -4.000000 698 | v -6.666667 -0.911990 -1.333333 699 | v -4.000000 -0.911990 -6.666667 700 | v -6.666667 -0.911990 -6.666667 701 | v -9.333333 -0.890267 12.000000 702 | v -9.333333 -0.911990 14.666666 703 | v -12.000000 -0.453127 12.000000 704 | v -12.000000 -0.749373 14.666666 705 | v -14.666666 0.087167 12.000000 706 | v -14.666666 -0.453127 14.666667 707 | v -12.000000 -0.214850 9.333333 708 | v -14.666667 0.712755 9.333333 709 | v -9.333334 -0.880361 4.000000 710 | v -9.333334 -0.880361 6.666667 711 | v -12.000000 -0.238069 4.000000 712 | v -12.000000 -0.073631 6.666667 713 | v -14.666667 0.537636 4.000000 714 | v -14.666667 0.973583 6.666667 715 | v -12.000000 -0.673537 1.333333 716 | v -14.666667 -0.215980 1.333333 717 | v -9.333334 -0.888315 -4.000000 718 | v -9.333334 -0.911990 -1.333333 719 | v -12.000000 0.016850 -4.000000 720 | v -12.000000 -0.709534 -1.333333 721 | v -14.666667 1.157656 -4.000000 722 | v -14.666667 -0.181259 -1.333333 723 | v -12.000000 0.281279 -6.666667 724 | v -14.666667 1.619067 -6.666667 725 | v 14.666667 1.102890 12.000000 726 | v 14.666667 0.642494 14.666666 727 | v 12.000000 0.785143 12.000000 728 | v 12.000000 0.522759 14.666666 729 | v 9.333334 0.294148 12.000000 730 | v 9.333334 0.726621 14.666666 731 | v 12.000000 0.026720 9.333333 732 | v 9.333333 -0.448847 9.333333 733 | v 14.666666 -0.138097 4.000000 734 | v 14.666666 0.411195 6.666667 735 | v 12.000000 -0.584955 4.000000 736 | v 12.000000 -0.356726 6.666667 737 | v 9.333333 -0.908978 4.000000 738 | v 9.333333 -0.880091 6.666667 739 | v 12.000000 -0.640589 1.333333 740 | v 9.333333 -0.911990 1.333333 741 | v 14.666666 0.631917 -4.000000 742 | v 14.666666 0.518667 -1.333333 743 | v 12.000000 -0.017402 -4.000000 744 | v 12.000000 -0.236112 -1.333333 745 | v 9.333333 -0.765934 -4.000000 746 | v 9.333333 -0.879993 -1.333333 747 | v 12.000000 0.128839 -6.666667 748 | v 9.333333 -0.349372 -6.666667 749 | v 14.666666 0.313849 -6.666667 750 | v 14.666666 -0.047161 1.333333 751 | v 14.666666 0.917451 9.333333 752 | v -9.333334 -0.852711 -6.666667 753 | v -9.333334 -0.911990 1.333333 754 | v -9.333334 -0.890266 9.333333 755 | v -1.333333 -0.911990 -6.666667 756 | v -1.333333 -0.911990 1.333333 757 | v -1.333333 -0.908978 9.333333 758 | v 6.666667 -0.797833 -6.666667 759 | v 6.666667 -0.911990 1.333333 760 | v 6.666667 -0.718281 9.333333 761 | v 6.666667 0.707327 -14.666667 762 | v -1.333333 -0.166009 -14.666667 763 | v -9.333334 -0.166009 -14.666667 764 | v 14.666666 -0.765886 -14.666667 765 | v 2.000000 2.000002 -3.069546 766 | v 2.000000 2.000002 -6.069546 767 | v 2.964541 2.000002 -3.069546 768 | v 2.964541 2.000002 -6.069546 769 | v 0.000001 0.000000 -3.069546 770 | v 0.390181 0.038430 -3.069546 771 | v 0.765368 0.152241 -3.069546 772 | v 1.111141 0.337061 -3.069546 773 | v 1.961571 1.609821 -3.069546 774 | v 2.000000 2.000002 -3.069546 775 | v 1.414214 0.585787 -3.069546 776 | v 1.662940 0.888861 -3.069546 777 | v 1.847760 1.234635 -3.069546 778 | v 2.964541 0.000000 -3.069546 779 | v 2.964541 2.000002 -3.069546 780 | v 0.000001 0.000000 -6.069546 781 | v 0.390181 0.038430 -6.069546 782 | v 0.765368 0.152241 -6.069546 783 | v 1.111141 0.337061 -6.069546 784 | v 1.414214 0.585787 -6.069546 785 | v 1.662940 0.888861 -6.069546 786 | v 1.847760 1.234635 -6.069546 787 | v 1.961571 1.609821 -6.069546 788 | v 2.000000 2.000002 -6.069546 789 | v 2.964541 0.000000 -6.069546 790 | v 2.964541 2.000002 -6.069546 791 | vt 0.831134 0.411204 792 | vt 0.936265 0.411205 793 | vt 0.936264 0.544969 794 | vt 0.831134 0.544969 795 | vt 0.831134 0.009912 796 | vt 0.936265 0.009912 797 | vt 0.936265 0.143676 798 | vt 0.831134 0.143676 799 | vt 0.936265 0.277440 800 | vt 0.831134 0.277440 801 | vt 0.515741 0.277440 802 | vt 0.620872 0.277440 803 | vt 0.620872 0.411204 804 | vt 0.515741 0.411205 805 | vt 0.726003 0.277440 806 | vt 0.726003 0.411204 807 | vt 0.515741 0.143676 808 | vt 0.620872 0.143676 809 | vt 0.726003 0.143676 810 | vt 0.515741 0.009912 811 | vt 0.620872 0.009912 812 | vt 0.726003 0.009912 813 | vt 0.620872 0.544969 814 | vt 0.515741 0.544969 815 | vt 0.726003 0.544969 816 | vt 0.956089 0.870777 817 | vt 0.956089 0.765648 818 | vt 0.967067 0.765648 819 | vt 0.967067 0.870777 820 | vt 0.956089 0.325305 821 | vt 0.956089 0.220174 822 | vt 0.967067 0.220174 823 | vt 0.967067 0.325305 824 | vt 0.726004 0.931073 825 | vt 0.831135 0.931074 826 | vt 0.831135 0.942052 827 | vt 0.726004 0.942052 828 | vt 0.956089 0.430436 829 | vt 0.967067 0.430436 830 | vt 0.484939 0.620872 831 | vt 0.484939 0.515741 832 | vt 0.495917 0.515741 833 | vt 0.495917 0.620872 834 | vt 0.620872 0.931074 835 | vt 0.620872 0.942052 836 | vt 0.515741 0.931073 837 | vt 0.515741 0.942052 838 | vt 0.484939 0.726003 839 | vt 0.495917 0.726003 840 | vt 0.484939 0.936266 841 | vt 0.484939 0.831135 842 | vt 0.495917 0.831135 843 | vt 0.495917 0.936266 844 | vt 0.956089 0.555389 845 | vt 0.956089 0.450260 846 | vt 0.967067 0.450260 847 | vt 0.967067 0.555389 848 | vt 0.956089 0.660519 849 | vt 0.967067 0.660519 850 | vt 0.956089 0.115043 851 | vt 0.956089 0.009912 852 | vt 0.967067 0.009912 853 | vt 0.967067 0.115043 854 | vt 0.936266 0.931073 855 | vt 0.936266 0.942052 856 | vt 0.739393 0.854403 857 | vt 0.748680 0.854403 858 | vt 0.748680 0.858565 859 | vt 0.741029 0.858565 860 | vt 0.767252 0.878034 861 | vt 0.767252 0.889850 862 | vt 0.763981 0.887769 863 | vt 0.763981 0.878034 864 | vt 0.739393 0.901666 865 | vt 0.730107 0.901666 866 | vt 0.733378 0.897503 867 | vt 0.741029 0.897503 868 | vt 0.767252 0.866219 869 | vt 0.763981 0.868300 870 | vt 0.748680 0.901666 871 | vt 0.748680 0.897503 872 | vt 0.730107 0.866219 873 | vt 0.730107 0.854403 874 | vt 0.733378 0.858565 875 | vt 0.733378 0.868300 876 | vt 0.767252 0.854403 877 | vt 0.763981 0.858565 878 | vt 0.757966 0.901666 879 | vt 0.756330 0.897503 880 | vt 0.730107 0.878034 881 | vt 0.733378 0.878034 882 | vt 0.730107 0.889850 883 | vt 0.733378 0.887769 884 | vt 0.757966 0.854403 885 | vt 0.756330 0.858565 886 | vt 0.767252 0.901666 887 | vt 0.763981 0.897503 888 | vt 0.376938 0.515741 889 | vt 0.463552 0.515741 890 | vt 0.463552 0.603100 891 | vt 0.376938 0.603100 892 | vt 0.622924 0.824635 893 | vt 0.622924 0.738021 894 | vt 0.710283 0.738021 895 | vt 0.710283 0.824635 896 | vt 0.290324 0.515741 897 | vt 0.290323 0.603100 898 | vt 0.009912 0.602355 899 | vt 0.009912 0.515741 900 | vt 0.097271 0.515741 901 | vt 0.097271 0.602355 902 | vt 0.622924 0.911249 903 | vt 0.710283 0.911249 904 | vt 0.203709 0.515741 905 | vt 0.203709 0.603100 906 | vt 0.009912 0.688969 907 | vt 0.097271 0.688969 908 | vt 0.515741 0.911249 909 | vt 0.515741 0.824635 910 | vt 0.603100 0.824635 911 | vt 0.603100 0.911249 912 | vt 0.009912 0.775584 913 | vt 0.097271 0.775584 914 | vt 0.009912 0.862198 915 | vt 0.097271 0.862198 916 | vt 0.515741 0.651407 917 | vt 0.515741 0.564793 918 | vt 0.603100 0.564793 919 | vt 0.603100 0.651407 920 | vt 0.117095 0.515741 921 | vt 0.117095 0.603100 922 | vt 0.515741 0.738021 923 | vt 0.603100 0.738021 924 | vt 0.622924 0.651407 925 | vt 0.622924 0.564793 926 | vt 0.710283 0.564793 927 | vt 0.710283 0.651407 928 | vt 0.932160 0.813848 929 | vt 0.932160 0.905019 930 | vt 0.928557 0.905019 931 | vt 0.928557 0.813848 932 | vt 0.730107 0.564793 933 | vt 0.815873 0.564793 934 | vt 0.815873 0.724591 935 | vt 0.730107 0.724591 936 | vt 0.211391 0.823625 937 | vt 0.211391 0.914796 938 | vt 0.207788 0.914796 939 | vt 0.207788 0.823625 940 | vt 0.225859 0.622924 941 | vt 0.311626 0.622924 942 | vt 0.311626 0.782722 943 | vt 0.225859 0.782722 944 | vt 0.932160 0.634225 945 | vt 0.932160 0.794024 946 | vt 0.928557 0.794024 947 | vt 0.928557 0.634225 948 | vt 0.233991 0.962345 949 | vt 0.233991 0.802546 950 | vt 0.237594 0.802546 951 | vt 0.237594 0.962345 952 | vt 0.908733 0.813848 953 | vt 0.908733 0.905019 954 | vt 0.905130 0.905019 955 | vt 0.905130 0.813848 956 | vt 0.331450 0.622924 957 | vt 0.417216 0.622924 958 | vt 0.417216 0.782722 959 | vt 0.331450 0.782722 960 | vt 0.463552 0.802547 961 | vt 0.463552 0.893719 962 | vt 0.459949 0.893719 963 | vt 0.459949 0.802547 964 | vt 0.257418 0.888313 965 | vt 0.257418 0.802546 966 | vt 0.417216 0.802547 967 | vt 0.417216 0.888313 968 | vt 0.463552 0.622924 969 | vt 0.463552 0.782723 970 | vt 0.459949 0.782723 971 | vt 0.459949 0.622924 972 | vt 0.905130 0.794024 973 | vt 0.905130 0.634225 974 | vt 0.908733 0.634225 975 | vt 0.908733 0.794024 976 | vt 0.326850 0.942135 977 | vt 0.326850 0.935048 978 | vt 0.376459 0.935048 979 | vt 0.376459 0.942135 980 | vt 0.086431 0.931630 981 | vt 0.079344 0.931630 982 | vt 0.079344 0.882022 983 | vt 0.086431 0.882022 984 | vt 0.463552 0.963152 985 | vt 0.456465 0.963152 986 | vt 0.456465 0.913544 987 | vt 0.463552 0.913544 988 | vt 0.956090 0.931073 989 | vt 0.963177 0.931073 990 | vt 0.963177 0.980682 991 | vt 0.956090 0.980682 992 | vt 0.009912 0.882022 993 | vt 0.059520 0.882022 994 | vt 0.059520 0.952891 995 | vt 0.009912 0.952891 996 | vt 0.117095 0.873233 997 | vt 0.117095 0.823625 998 | vt 0.187964 0.823625 999 | vt 0.187964 0.873233 1000 | vt 0.211391 0.984228 1001 | vt 0.204304 0.984228 1002 | vt 0.204304 0.934620 1003 | vt 0.211391 0.934620 1004 | vt 0.326850 0.915224 1005 | vt 0.326850 0.908137 1006 | vt 0.376459 0.908137 1007 | vt 0.376459 0.915224 1008 | vt 0.307026 0.935048 1009 | vt 0.307026 0.942135 1010 | vt 0.257418 0.942135 1011 | vt 0.257418 0.935048 1012 | vt 0.983001 0.931073 1013 | vt 0.990088 0.931073 1014 | vt 0.990088 0.980682 1015 | vt 0.983001 0.980682 1016 | vt 0.880039 0.852128 1017 | vt 0.880039 0.901736 1018 | vt 0.809170 0.901736 1019 | vt 0.809170 0.852128 1020 | vt 0.835697 0.614401 1021 | vt 0.835697 0.564793 1022 | vt 0.906566 0.564793 1023 | vt 0.906566 0.614401 1024 | vt 0.403370 0.957746 1025 | vt 0.396283 0.957746 1026 | vt 0.396283 0.908137 1027 | vt 0.403370 0.908137 1028 | vt 0.257418 0.915224 1029 | vt 0.257418 0.908137 1030 | vt 0.307026 0.908137 1031 | vt 0.307026 0.915224 1032 | vt 0.430281 0.957746 1033 | vt 0.423194 0.957746 1034 | vt 0.423194 0.908137 1035 | vt 0.430281 0.908137 1036 | vt 0.926390 0.564793 1037 | vt 0.933477 0.564793 1038 | vt 0.933477 0.614401 1039 | vt 0.926390 0.614401 1040 | vt 0.885306 0.705094 1041 | vt 0.835697 0.705094 1042 | vt 0.835697 0.634225 1043 | vt 0.885306 0.634225 1044 | vt 0.166703 0.963926 1045 | vt 0.117095 0.963926 1046 | vt 0.117095 0.893057 1047 | vt 0.166703 0.893057 1048 | vt 0.030162 0.475667 1049 | vt 0.030162 0.495917 1050 | vt 0.009912 0.495917 1051 | vt 0.009912 0.475667 1052 | vt 0.030162 0.111163 1053 | vt 0.030162 0.131413 1054 | vt 0.009912 0.131413 1055 | vt 0.009912 0.111163 1056 | vt 0.030162 0.232664 1057 | vt 0.030162 0.252914 1058 | vt 0.009912 0.252915 1059 | vt 0.009912 0.232664 1060 | vt 0.030162 0.354166 1061 | vt 0.030162 0.374416 1062 | vt 0.009912 0.374416 1063 | vt 0.009912 0.354166 1064 | vt 0.394666 0.354166 1065 | vt 0.394666 0.374416 1066 | vt 0.374416 0.374416 1067 | vt 0.374416 0.354166 1068 | vt 0.273165 0.354166 1069 | vt 0.273165 0.374416 1070 | vt 0.252915 0.374416 1071 | vt 0.252915 0.354166 1072 | vt 0.151664 0.354166 1073 | vt 0.151664 0.374416 1074 | vt 0.131413 0.374416 1075 | vt 0.131413 0.354166 1076 | vt 0.394666 0.232664 1077 | vt 0.394666 0.252914 1078 | vt 0.374416 0.252914 1079 | vt 0.374416 0.232664 1080 | vt 0.273165 0.232664 1081 | vt 0.273165 0.252914 1082 | vt 0.252915 0.252914 1083 | vt 0.252915 0.232664 1084 | vt 0.151664 0.232664 1085 | vt 0.151664 0.252914 1086 | vt 0.131413 0.252914 1087 | vt 0.131413 0.232664 1088 | vt 0.394666 0.111163 1089 | vt 0.394666 0.131413 1090 | vt 0.374416 0.131413 1091 | vt 0.374416 0.111163 1092 | vt 0.273165 0.111163 1093 | vt 0.273165 0.131413 1094 | vt 0.252915 0.131413 1095 | vt 0.252915 0.111163 1096 | vt 0.151664 0.111163 1097 | vt 0.151664 0.131413 1098 | vt 0.131413 0.131413 1099 | vt 0.131413 0.111163 1100 | vt 0.394666 0.475667 1101 | vt 0.394666 0.495917 1102 | vt 0.374416 0.495917 1103 | vt 0.374416 0.475667 1104 | vt 0.273165 0.475667 1105 | vt 0.273165 0.495917 1106 | vt 0.252915 0.495917 1107 | vt 0.252915 0.475667 1108 | vt 0.151664 0.475667 1109 | vt 0.151664 0.495917 1110 | vt 0.131413 0.495917 1111 | vt 0.131413 0.475667 1112 | vt 0.151664 0.394666 1113 | vt 0.151664 0.414916 1114 | vt 0.131413 0.414916 1115 | vt 0.131413 0.394666 1116 | vt 0.151664 0.435166 1117 | vt 0.151664 0.455417 1118 | vt 0.131413 0.455417 1119 | vt 0.131413 0.435166 1120 | vt 0.232664 0.394666 1121 | vt 0.232664 0.414916 1122 | vt 0.212414 0.414916 1123 | vt 0.212414 0.394666 1124 | vt 0.192164 0.394666 1125 | vt 0.192164 0.414916 1126 | vt 0.171914 0.414916 1127 | vt 0.171914 0.394666 1128 | vt 0.232664 0.435166 1129 | vt 0.232664 0.455417 1130 | vt 0.212414 0.455417 1131 | vt 0.212414 0.435166 1132 | vt 0.192164 0.435166 1133 | vt 0.192164 0.455417 1134 | vt 0.171914 0.455417 1135 | vt 0.171914 0.435166 1136 | vt 0.232664 0.475667 1137 | vt 0.232664 0.495917 1138 | vt 0.212414 0.495917 1139 | vt 0.212414 0.475667 1140 | vt 0.192164 0.475667 1141 | vt 0.192164 0.495917 1142 | vt 0.171914 0.495917 1143 | vt 0.171914 0.475667 1144 | vt 0.273165 0.394666 1145 | vt 0.273165 0.414916 1146 | vt 0.252915 0.414916 1147 | vt 0.252915 0.394666 1148 | vt 0.273165 0.435166 1149 | vt 0.273165 0.455416 1150 | vt 0.252915 0.455417 1151 | vt 0.252915 0.435166 1152 | vt 0.354166 0.394666 1153 | vt 0.354166 0.414916 1154 | vt 0.333915 0.414916 1155 | vt 0.333915 0.394666 1156 | vt 0.313665 0.394666 1157 | vt 0.313665 0.414916 1158 | vt 0.293415 0.414916 1159 | vt 0.293415 0.394666 1160 | vt 0.354166 0.435166 1161 | vt 0.354166 0.455417 1162 | vt 0.333915 0.455417 1163 | vt 0.333915 0.435166 1164 | vt 0.313665 0.435166 1165 | vt 0.313665 0.455416 1166 | vt 0.293415 0.455416 1167 | vt 0.293415 0.435166 1168 | vt 0.354166 0.475667 1169 | vt 0.354166 0.495917 1170 | vt 0.333915 0.495917 1171 | vt 0.333915 0.475667 1172 | vt 0.313665 0.475667 1173 | vt 0.313665 0.495917 1174 | vt 0.293415 0.495917 1175 | vt 0.293415 0.475667 1176 | vt 0.394666 0.394666 1177 | vt 0.394666 0.414916 1178 | vt 0.374416 0.414916 1179 | vt 0.374416 0.394666 1180 | vt 0.394666 0.435166 1181 | vt 0.394666 0.455417 1182 | vt 0.374416 0.455417 1183 | vt 0.374416 0.435166 1184 | vt 0.475667 0.394666 1185 | vt 0.475667 0.414916 1186 | vt 0.455417 0.414916 1187 | vt 0.455417 0.394666 1188 | vt 0.435166 0.394666 1189 | vt 0.435166 0.414916 1190 | vt 0.414916 0.414916 1191 | vt 0.414916 0.394666 1192 | vt 0.475667 0.435166 1193 | vt 0.475667 0.455417 1194 | vt 0.455417 0.455417 1195 | vt 0.455417 0.435166 1196 | vt 0.435166 0.435166 1197 | vt 0.435166 0.455417 1198 | vt 0.414916 0.455417 1199 | vt 0.414916 0.435166 1200 | vt 0.475667 0.475667 1201 | vt 0.475667 0.495917 1202 | vt 0.455417 0.495917 1203 | vt 0.455417 0.475667 1204 | vt 0.435166 0.475667 1205 | vt 0.435166 0.495917 1206 | vt 0.414916 0.495917 1207 | vt 0.414916 0.475667 1208 | vt 0.151664 0.030162 1209 | vt 0.151664 0.050413 1210 | vt 0.131413 0.050413 1211 | vt 0.131413 0.030162 1212 | vt 0.151664 0.070663 1213 | vt 0.151664 0.090913 1214 | vt 0.131413 0.090913 1215 | vt 0.131413 0.070663 1216 | vt 0.232664 0.030162 1217 | vt 0.232664 0.050413 1218 | vt 0.212414 0.050413 1219 | vt 0.212414 0.030162 1220 | vt 0.192164 0.030162 1221 | vt 0.192164 0.050413 1222 | vt 0.171914 0.050413 1223 | vt 0.171914 0.030162 1224 | vt 0.232664 0.070663 1225 | vt 0.232664 0.090913 1226 | vt 0.212414 0.090913 1227 | vt 0.212414 0.070663 1228 | vt 0.192164 0.070663 1229 | vt 0.192164 0.090913 1230 | vt 0.171914 0.090913 1231 | vt 0.171914 0.070663 1232 | vt 0.232664 0.111163 1233 | vt 0.232664 0.131413 1234 | vt 0.212414 0.131413 1235 | vt 0.212414 0.111163 1236 | vt 0.192164 0.111163 1237 | vt 0.192164 0.131413 1238 | vt 0.171914 0.131413 1239 | vt 0.171914 0.111163 1240 | vt 0.273165 0.030162 1241 | vt 0.273165 0.050413 1242 | vt 0.252915 0.050413 1243 | vt 0.252915 0.030162 1244 | vt 0.273165 0.070663 1245 | vt 0.273165 0.090913 1246 | vt 0.252915 0.090913 1247 | vt 0.252915 0.070663 1248 | vt 0.354166 0.030162 1249 | vt 0.354166 0.050413 1250 | vt 0.333915 0.050413 1251 | vt 0.333915 0.030162 1252 | vt 0.313665 0.030162 1253 | vt 0.313665 0.050413 1254 | vt 0.293415 0.050413 1255 | vt 0.293415 0.030162 1256 | vt 0.354166 0.070663 1257 | vt 0.354166 0.090913 1258 | vt 0.333915 0.090913 1259 | vt 0.333915 0.070663 1260 | vt 0.313665 0.070663 1261 | vt 0.313665 0.090913 1262 | vt 0.293415 0.090913 1263 | vt 0.293415 0.070663 1264 | vt 0.354166 0.111163 1265 | vt 0.354166 0.131413 1266 | vt 0.333915 0.131413 1267 | vt 0.333915 0.111163 1268 | vt 0.313665 0.111163 1269 | vt 0.313665 0.131413 1270 | vt 0.293415 0.131413 1271 | vt 0.293415 0.111163 1272 | vt 0.394666 0.030162 1273 | vt 0.394666 0.050413 1274 | vt 0.374416 0.050413 1275 | vt 0.374416 0.030162 1276 | vt 0.394666 0.070663 1277 | vt 0.394666 0.090913 1278 | vt 0.374416 0.090913 1279 | vt 0.374416 0.070663 1280 | vt 0.475667 0.030162 1281 | vt 0.475667 0.050413 1282 | vt 0.455417 0.050413 1283 | vt 0.455417 0.030162 1284 | vt 0.435166 0.030162 1285 | vt 0.435166 0.050413 1286 | vt 0.414916 0.050413 1287 | vt 0.414916 0.030162 1288 | vt 0.475667 0.070663 1289 | vt 0.475667 0.090913 1290 | vt 0.455417 0.090913 1291 | vt 0.455417 0.070663 1292 | vt 0.435166 0.070663 1293 | vt 0.435166 0.090913 1294 | vt 0.414916 0.090913 1295 | vt 0.414916 0.070663 1296 | vt 0.475667 0.111163 1297 | vt 0.475667 0.131413 1298 | vt 0.455417 0.131413 1299 | vt 0.455417 0.111163 1300 | vt 0.435166 0.111163 1301 | vt 0.435166 0.131413 1302 | vt 0.414916 0.131413 1303 | vt 0.414916 0.111163 1304 | vt 0.151664 0.151663 1305 | vt 0.151664 0.171914 1306 | vt 0.131413 0.171914 1307 | vt 0.131413 0.151664 1308 | vt 0.151664 0.192164 1309 | vt 0.151664 0.212414 1310 | vt 0.131413 0.212414 1311 | vt 0.131413 0.192164 1312 | vt 0.232664 0.151664 1313 | vt 0.232664 0.171914 1314 | vt 0.212414 0.171914 1315 | vt 0.212414 0.151664 1316 | vt 0.192164 0.151664 1317 | vt 0.192164 0.171914 1318 | vt 0.171914 0.171914 1319 | vt 0.171914 0.151664 1320 | vt 0.232664 0.192164 1321 | vt 0.232664 0.212414 1322 | vt 0.212414 0.212414 1323 | vt 0.212414 0.192164 1324 | vt 0.192164 0.192164 1325 | vt 0.192164 0.212414 1326 | vt 0.171914 0.212414 1327 | vt 0.171914 0.192164 1328 | vt 0.232664 0.232664 1329 | vt 0.232664 0.252914 1330 | vt 0.212414 0.252914 1331 | vt 0.212414 0.232664 1332 | vt 0.192164 0.232664 1333 | vt 0.192164 0.252914 1334 | vt 0.171914 0.252914 1335 | vt 0.171914 0.232664 1336 | vt 0.273165 0.151664 1337 | vt 0.273165 0.171914 1338 | vt 0.252915 0.171914 1339 | vt 0.252915 0.151664 1340 | vt 0.273165 0.192164 1341 | vt 0.273165 0.212414 1342 | vt 0.252915 0.212414 1343 | vt 0.252915 0.192164 1344 | vt 0.354166 0.151664 1345 | vt 0.354166 0.171914 1346 | vt 0.333915 0.171914 1347 | vt 0.333915 0.151664 1348 | vt 0.313665 0.151664 1349 | vt 0.313665 0.171914 1350 | vt 0.293415 0.171914 1351 | vt 0.293415 0.151664 1352 | vt 0.354166 0.192164 1353 | vt 0.354166 0.212414 1354 | vt 0.333915 0.212414 1355 | vt 0.333915 0.192164 1356 | vt 0.313665 0.192164 1357 | vt 0.313665 0.212414 1358 | vt 0.293415 0.212414 1359 | vt 0.293415 0.192164 1360 | vt 0.354166 0.232664 1361 | vt 0.354166 0.252914 1362 | vt 0.333915 0.252914 1363 | vt 0.333915 0.232664 1364 | vt 0.313665 0.232664 1365 | vt 0.313665 0.252914 1366 | vt 0.293415 0.252914 1367 | vt 0.293415 0.232664 1368 | vt 0.394666 0.151663 1369 | vt 0.394666 0.171914 1370 | vt 0.374416 0.171914 1371 | vt 0.374416 0.151664 1372 | vt 0.394666 0.192164 1373 | vt 0.394666 0.212414 1374 | vt 0.374416 0.212414 1375 | vt 0.374416 0.192164 1376 | vt 0.475667 0.151663 1377 | vt 0.475667 0.171914 1378 | vt 0.455417 0.171914 1379 | vt 0.455417 0.151663 1380 | vt 0.435166 0.151663 1381 | vt 0.435166 0.171914 1382 | vt 0.414916 0.171914 1383 | vt 0.414916 0.151663 1384 | vt 0.475667 0.192164 1385 | vt 0.475667 0.212414 1386 | vt 0.455417 0.212414 1387 | vt 0.455417 0.192164 1388 | vt 0.435166 0.192164 1389 | vt 0.435166 0.212414 1390 | vt 0.414916 0.212414 1391 | vt 0.414916 0.192164 1392 | vt 0.475667 0.232664 1393 | vt 0.475667 0.252914 1394 | vt 0.455417 0.252914 1395 | vt 0.455417 0.232664 1396 | vt 0.435166 0.232664 1397 | vt 0.435166 0.252914 1398 | vt 0.414916 0.252914 1399 | vt 0.414916 0.232664 1400 | vt 0.151664 0.273165 1401 | vt 0.151664 0.293415 1402 | vt 0.131413 0.293415 1403 | vt 0.131413 0.273165 1404 | vt 0.151664 0.313665 1405 | vt 0.151664 0.333915 1406 | vt 0.131413 0.333915 1407 | vt 0.131413 0.313665 1408 | vt 0.232664 0.273165 1409 | vt 0.232664 0.293415 1410 | vt 0.212414 0.293415 1411 | vt 0.212414 0.273165 1412 | vt 0.192164 0.273165 1413 | vt 0.192164 0.293415 1414 | vt 0.171914 0.293415 1415 | vt 0.171914 0.273165 1416 | vt 0.232664 0.313665 1417 | vt 0.232664 0.333915 1418 | vt 0.212414 0.333915 1419 | vt 0.212414 0.313665 1420 | vt 0.192164 0.313665 1421 | vt 0.192164 0.333915 1422 | vt 0.171914 0.333915 1423 | vt 0.171914 0.313665 1424 | vt 0.232664 0.354166 1425 | vt 0.232664 0.374416 1426 | vt 0.212414 0.374416 1427 | vt 0.212414 0.354166 1428 | vt 0.192164 0.354166 1429 | vt 0.192164 0.374416 1430 | vt 0.171914 0.374416 1431 | vt 0.171914 0.354166 1432 | vt 0.273165 0.273165 1433 | vt 0.273165 0.293415 1434 | vt 0.252915 0.293415 1435 | vt 0.252915 0.273165 1436 | vt 0.273165 0.313665 1437 | vt 0.273165 0.333915 1438 | vt 0.252915 0.333915 1439 | vt 0.252915 0.313665 1440 | vt 0.354166 0.273165 1441 | vt 0.354166 0.293415 1442 | vt 0.333915 0.293415 1443 | vt 0.333915 0.273165 1444 | vt 0.313665 0.273165 1445 | vt 0.313665 0.293415 1446 | vt 0.293415 0.293415 1447 | vt 0.293415 0.273165 1448 | vt 0.354166 0.313665 1449 | vt 0.354166 0.333915 1450 | vt 0.333915 0.333915 1451 | vt 0.333915 0.313665 1452 | vt 0.313665 0.313665 1453 | vt 0.313665 0.333915 1454 | vt 0.293415 0.333915 1455 | vt 0.293415 0.313665 1456 | vt 0.354166 0.354166 1457 | vt 0.354166 0.374416 1458 | vt 0.333915 0.374416 1459 | vt 0.333915 0.354166 1460 | vt 0.313665 0.354166 1461 | vt 0.313665 0.374416 1462 | vt 0.293415 0.374416 1463 | vt 0.293415 0.354166 1464 | vt 0.394666 0.273165 1465 | vt 0.394666 0.293415 1466 | vt 0.374416 0.293415 1467 | vt 0.374416 0.273165 1468 | vt 0.394666 0.313665 1469 | vt 0.394666 0.333915 1470 | vt 0.374416 0.333915 1471 | vt 0.374416 0.313665 1472 | vt 0.475667 0.273165 1473 | vt 0.475667 0.293415 1474 | vt 0.455417 0.293415 1475 | vt 0.455417 0.273165 1476 | vt 0.435166 0.273165 1477 | vt 0.435166 0.293415 1478 | vt 0.414916 0.293415 1479 | vt 0.414916 0.273165 1480 | vt 0.475667 0.313665 1481 | vt 0.475667 0.333915 1482 | vt 0.455417 0.333915 1483 | vt 0.455417 0.313665 1484 | vt 0.435166 0.313665 1485 | vt 0.435166 0.333915 1486 | vt 0.414916 0.333915 1487 | vt 0.414916 0.313665 1488 | vt 0.475667 0.354165 1489 | vt 0.475667 0.374416 1490 | vt 0.455417 0.374416 1491 | vt 0.455417 0.354166 1492 | vt 0.435166 0.354166 1493 | vt 0.435166 0.374416 1494 | vt 0.414916 0.374416 1495 | vt 0.414916 0.354166 1496 | vt 0.030162 0.273165 1497 | vt 0.030162 0.293415 1498 | vt 0.009912 0.293415 1499 | vt 0.009912 0.273165 1500 | vt 0.030162 0.313665 1501 | vt 0.030162 0.333915 1502 | vt 0.009912 0.333915 1503 | vt 0.009912 0.313665 1504 | vt 0.111163 0.273165 1505 | vt 0.111163 0.293415 1506 | vt 0.090913 0.293415 1507 | vt 0.090913 0.273165 1508 | vt 0.070663 0.273165 1509 | vt 0.070663 0.293415 1510 | vt 0.050413 0.293415 1511 | vt 0.050413 0.273165 1512 | vt 0.111163 0.313665 1513 | vt 0.111163 0.333915 1514 | vt 0.090913 0.333915 1515 | vt 0.090913 0.313665 1516 | vt 0.070663 0.313665 1517 | vt 0.070663 0.333915 1518 | vt 0.050413 0.333915 1519 | vt 0.050413 0.313665 1520 | vt 0.111163 0.354166 1521 | vt 0.111163 0.374416 1522 | vt 0.090913 0.374416 1523 | vt 0.090913 0.354166 1524 | vt 0.070663 0.354166 1525 | vt 0.070663 0.374416 1526 | vt 0.050413 0.374416 1527 | vt 0.050413 0.354166 1528 | vt 0.030162 0.151663 1529 | vt 0.030162 0.171914 1530 | vt 0.009912 0.171914 1531 | vt 0.009912 0.151664 1532 | vt 0.030162 0.192164 1533 | vt 0.030162 0.212414 1534 | vt 0.009912 0.212414 1535 | vt 0.009912 0.192164 1536 | vt 0.111163 0.151664 1537 | vt 0.111163 0.171914 1538 | vt 0.090913 0.171914 1539 | vt 0.090913 0.151664 1540 | vt 0.070663 0.151663 1541 | vt 0.070663 0.171914 1542 | vt 0.050413 0.171914 1543 | vt 0.050413 0.151663 1544 | vt 0.111163 0.192164 1545 | vt 0.111163 0.212414 1546 | vt 0.090913 0.212414 1547 | vt 0.090913 0.192164 1548 | vt 0.070663 0.192164 1549 | vt 0.070663 0.212414 1550 | vt 0.050413 0.212414 1551 | vt 0.050413 0.192164 1552 | vt 0.111163 0.232664 1553 | vt 0.111163 0.252914 1554 | vt 0.090913 0.252914 1555 | vt 0.090913 0.232664 1556 | vt 0.070663 0.232664 1557 | vt 0.070663 0.252914 1558 | vt 0.050413 0.252914 1559 | vt 0.050413 0.232664 1560 | vt 0.030162 0.030162 1561 | vt 0.030162 0.050413 1562 | vt 0.009912 0.050412 1563 | vt 0.009912 0.030162 1564 | vt 0.030162 0.070663 1565 | vt 0.030162 0.090913 1566 | vt 0.009912 0.090913 1567 | vt 0.009912 0.070663 1568 | vt 0.111163 0.030162 1569 | vt 0.111163 0.050413 1570 | vt 0.090913 0.050413 1571 | vt 0.090913 0.030162 1572 | vt 0.070663 0.030162 1573 | vt 0.070663 0.050413 1574 | vt 0.050413 0.050413 1575 | vt 0.050413 0.030162 1576 | vt 0.111163 0.070663 1577 | vt 0.111163 0.090913 1578 | vt 0.090913 0.090913 1579 | vt 0.090913 0.070663 1580 | vt 0.070663 0.070663 1581 | vt 0.070663 0.090913 1582 | vt 0.050413 0.090913 1583 | vt 0.050413 0.070663 1584 | vt 0.111163 0.111163 1585 | vt 0.111163 0.131413 1586 | vt 0.090913 0.131413 1587 | vt 0.090913 0.111163 1588 | vt 0.070663 0.111163 1589 | vt 0.070663 0.131413 1590 | vt 0.050413 0.131413 1591 | vt 0.050413 0.111163 1592 | vt 0.030162 0.394666 1593 | vt 0.030162 0.414916 1594 | vt 0.009912 0.414916 1595 | vt 0.009912 0.394666 1596 | vt 0.030162 0.435166 1597 | vt 0.030162 0.455417 1598 | vt 0.009912 0.455417 1599 | vt 0.009912 0.435166 1600 | vt 0.111163 0.394666 1601 | vt 0.111163 0.414916 1602 | vt 0.090913 0.414916 1603 | vt 0.090913 0.394666 1604 | vt 0.070663 0.394666 1605 | vt 0.070663 0.414916 1606 | vt 0.050413 0.414916 1607 | vt 0.050413 0.394666 1608 | vt 0.111163 0.435166 1609 | vt 0.111163 0.455417 1610 | vt 0.090913 0.455417 1611 | vt 0.090913 0.435166 1612 | vt 0.070663 0.435166 1613 | vt 0.070663 0.455417 1614 | vt 0.050413 0.455417 1615 | vt 0.050413 0.435166 1616 | vt 0.111163 0.475667 1617 | vt 0.111163 0.495917 1618 | vt 0.090913 0.495917 1619 | vt 0.090913 0.475667 1620 | vt 0.070663 0.475667 1621 | vt 0.070663 0.495917 1622 | vt 0.050412 0.495917 1623 | vt 0.050413 0.475667 1624 | vt 0.070663 0.009912 1625 | vt 0.050413 0.009912 1626 | vt 0.090913 0.009912 1627 | vt 0.111163 0.009912 1628 | vt 0.131413 0.009912 1629 | vt 0.030162 0.009912 1630 | vt 0.009912 0.009912 1631 | vt 0.495917 0.333915 1632 | vt 0.495917 0.354165 1633 | vt 0.495917 0.374416 1634 | vt 0.495917 0.293415 1635 | vt 0.495917 0.313665 1636 | vt 0.495917 0.252915 1637 | vt 0.495917 0.273165 1638 | vt 0.495917 0.212414 1639 | vt 0.495917 0.232664 1640 | vt 0.495917 0.171914 1641 | vt 0.495917 0.192164 1642 | vt 0.495917 0.131413 1643 | vt 0.495917 0.151663 1644 | vt 0.495917 0.090913 1645 | vt 0.495917 0.111163 1646 | vt 0.495917 0.050412 1647 | vt 0.495917 0.070663 1648 | vt 0.435166 0.009912 1649 | vt 0.414916 0.009912 1650 | vt 0.455417 0.009912 1651 | vt 0.475667 0.009912 1652 | vt 0.495917 0.009912 1653 | vt 0.495917 0.030162 1654 | vt 0.394666 0.009912 1655 | vt 0.374416 0.009912 1656 | vt 0.313665 0.009912 1657 | vt 0.293415 0.009912 1658 | vt 0.333915 0.009912 1659 | vt 0.354166 0.009912 1660 | vt 0.273165 0.009912 1661 | vt 0.252915 0.009912 1662 | vt 0.192164 0.009912 1663 | vt 0.171914 0.009912 1664 | vt 0.212414 0.009912 1665 | vt 0.232664 0.009912 1666 | vt 0.151664 0.009912 1667 | vt 0.495917 0.455417 1668 | vt 0.495917 0.475667 1669 | vt 0.495917 0.495917 1670 | vt 0.495917 0.414916 1671 | vt 0.495917 0.435166 1672 | vt 0.495917 0.394666 1673 | vt 0.787982 0.758264 1674 | vt 0.784649 0.769371 1675 | vt 0.779213 0.779614 1676 | vt 0.771883 0.788600 1677 | vt 0.762941 0.795983 1678 | vt 0.752731 0.801480 1679 | vt 0.741644 0.804880 1680 | vt 0.730107 0.806051 1681 | vt 0.730192 0.834579 1682 | vt 0.789346 0.834402 1683 | vt 0.789346 0.744415 1684 | vt 0.206035 0.780554 1685 | vt 0.117095 0.780553 1686 | vt 0.117095 0.792177 1687 | vt 0.206035 0.792177 1688 | vt 0.206035 0.768930 1689 | vt 0.117095 0.768930 1690 | vt 0.206035 0.757306 1691 | vt 0.117095 0.757307 1692 | vt 0.206035 0.745683 1693 | vt 0.117095 0.745683 1694 | vt 0.206035 0.734059 1695 | vt 0.117095 0.734059 1696 | vt 0.206035 0.722436 1697 | vt 0.117095 0.722436 1698 | vt 0.206035 0.710813 1699 | vt 0.117095 0.710812 1700 | vt 0.206035 0.803801 1701 | vt 0.117095 0.803800 1702 | vt 0.206035 0.622924 1703 | vt 0.117095 0.622924 1704 | vt 0.117095 0.682217 1705 | vt 0.206035 0.682217 1706 | vt 0.863764 0.809640 1707 | vt 0.867104 0.820753 1708 | vt 0.868434 0.832303 1709 | vt 0.868434 0.744565 1710 | vt 0.809243 0.744415 1711 | vt 0.809170 0.772962 1712 | vt 0.820715 0.774128 1713 | vt 0.831810 0.777525 1714 | vt 0.842030 0.783020 1715 | vt 0.850981 0.790404 1716 | vt 0.858320 0.799392 1717 | vt 0.117095 0.710812 1718 | vt 0.206035 0.710813 1719 | vt 0.206035 0.682217 1720 | vt 0.117095 0.682217 1721 | vn 0.0000 1.0000 0.0000 1722 | vn -1.0000 0.0000 0.0000 1723 | vn 0.0000 0.0000 1.0000 1724 | vn 1.0000 0.0000 0.0000 1725 | vn 0.0000 0.0000 -1.0000 1726 | vn 0.0000 -1.0000 0.0000 1727 | vn 0.0614 0.9970 -0.0479 1728 | vn 0.1911 0.9748 -0.1152 1729 | vn -0.1729 0.9832 0.0582 1730 | vn 0.0249 0.9932 0.1137 1731 | vn -0.0814 0.9868 -0.1403 1732 | vn -0.1771 0.9812 0.0766 1733 | vn -0.0070 0.9999 -0.0093 1734 | vn 0.0109 0.9999 -0.0054 1735 | vn 0.0625 0.9972 0.0420 1736 | vn -0.1182 0.9808 -0.1551 1737 | vn -0.0794 0.9784 0.1910 1738 | vn 0.1417 0.9725 -0.1847 1739 | vn -0.1651 0.9771 0.1344 1740 | vn -0.0730 0.9973 -0.0117 1741 | vn -0.2002 0.9793 0.0309 1742 | vn -0.2234 0.9670 0.1227 1743 | vn -0.3073 0.9481 0.0818 1744 | vn -0.2498 0.9679 0.0285 1745 | vn -0.1013 0.9895 0.1035 1746 | vn 0.0034 0.9913 -0.1315 1747 | vn -0.0787 0.9958 0.0469 1748 | vn -0.2419 0.9570 0.1603 1749 | vn -0.1328 0.9910 -0.0150 1750 | vn -0.0535 0.9981 -0.0319 1751 | vn -0.2566 0.9595 -0.1167 1752 | vn -0.1920 0.9789 -0.0700 1753 | vn -0.0864 0.9649 -0.2479 1754 | vn -0.0658 0.9975 -0.0258 1755 | vn -0.1047 0.9636 -0.2460 1756 | vn -0.3380 0.9303 -0.1426 1757 | vn 0.1552 0.9879 -0.0080 1758 | vn -0.1631 0.9550 -0.2479 1759 | vn -0.1144 0.9688 0.2199 1760 | vn -0.1728 0.9638 -0.2033 1761 | vn 0.1130 0.9547 0.2752 1762 | vn -0.0337 0.9994 0.0024 1763 | vn 0.3752 0.9002 -0.2212 1764 | vn 0.4161 0.9052 -0.0865 1765 | vn 0.2085 0.8871 0.4118 1766 | vn 0.3624 0.8962 0.2559 1767 | vn 0.2067 0.9633 0.1712 1768 | vn 0.4270 0.8951 0.1287 1769 | vn 0.0011 1.0000 0.0011 1770 | vn 0.0300 0.9995 0.0123 1771 | vn 0.1471 0.9767 -0.1561 1772 | vn 0.1006 0.9920 -0.0768 1773 | vn 0.3173 0.9443 -0.0868 1774 | vn 0.2208 0.9495 -0.2230 1775 | vn 0.3459 0.9381 -0.0162 1776 | vn 0.2549 0.9607 -0.1102 1777 | vn 0.0293 0.9996 0.0056 1778 | vn 0.0135 0.9999 -0.0102 1779 | vn 0.3009 0.9445 0.1317 1780 | vn 0.3463 0.9365 0.0548 1781 | vn 0.1152 0.9748 0.1911 1782 | vn 0.2135 0.9567 0.1980 1783 | vn 0.1273 0.9877 0.0914 1784 | vn 0.2203 0.9743 0.0463 1785 | vn 0.0201 0.9998 0.0038 1786 | vn -0.0093 0.9999 -0.0070 1787 | vn -0.1771 0.9812 -0.0766 1788 | vn -0.0608 0.9963 -0.0608 1789 | vn -0.2869 0.9386 -0.1915 1790 | vn -0.0934 0.9766 -0.1935 1791 | vn -0.0093 0.9999 0.0070 1792 | vn -0.0608 0.9963 0.0608 1793 | vn -0.0011 1.0000 -0.0011 1794 | vn 0.0024 0.9998 -0.0215 1795 | vn -0.0164 0.9990 -0.0412 1796 | vn -0.2124 0.9243 -0.3171 1797 | vn -0.0976 0.9242 -0.3693 1798 | vn 0.1007 0.9311 -0.3506 1799 | vn 0.0074 0.9230 -0.3847 1800 | vn 0.0057 0.9840 -0.1782 1801 | vn -0.0751 0.9310 -0.3572 1802 | vn -0.1150 0.9895 0.0880 1803 | vn -0.1125 0.9879 0.1065 1804 | vn 0.0150 0.9910 0.1328 1805 | vn -0.0295 0.9659 0.2573 1806 | vn -0.0269 0.9924 0.1198 1807 | vn -0.0687 0.9366 0.3437 1808 | vn -0.2203 0.9622 0.1599 1809 | vn -0.1553 0.9544 0.2551 1810 | vn 0.0937 0.9953 -0.0247 1811 | vn -0.2043 0.9785 0.0295 1812 | vn 0.0535 0.9981 0.0319 1813 | vn 0.1328 0.9910 0.0150 1814 | vn -0.0120 0.9999 0.0120 1815 | vn -0.1273 0.9877 0.0914 1816 | vn -0.0354 0.9939 0.1043 1817 | vn -0.1152 0.9748 0.1911 1818 | vn -0.1498 0.9773 -0.1498 1819 | vn 0.0582 0.9832 -0.1729 1820 | vn 0.1001 0.9862 -0.1316 1821 | vn -0.1229 0.9880 -0.0935 1822 | vn 0.2263 0.9700 0.0890 1823 | vn 0.0874 0.9948 0.0524 1824 | vn 0.1479 0.9782 0.1456 1825 | vn 0.2171 0.9752 0.0439 1826 | vn 0.2183 0.9757 -0.0167 1827 | vn 0.3058 0.9484 -0.0843 1828 | vn -0.1215 0.9888 0.0866 1829 | vn 0.0588 0.9935 0.0975 1830 | vn 0.0833 0.9949 -0.0565 1831 | vn 0.2233 0.9713 -0.0813 1832 | vn 0.2107 0.9750 -0.0701 1833 | vn 0.1483 0.9782 -0.1452 1834 | vn 0.1888 0.9714 -0.1443 1835 | vn 0.1653 0.9771 -0.1342 1836 | vn 0.1637 0.9841 -0.0689 1837 | vn 0.1216 0.9888 -0.0860 1838 | vn 0.1908 0.9710 -0.1439 1839 | vn 0.1718 0.9851 0.0035 1840 | vn 0.0733 0.9972 0.0120 1841 | vn 0.1403 0.9862 -0.0881 1842 | vn -0.0264 0.9997 0.0003 1843 | vn -0.0830 0.9949 0.0568 1844 | vn 0.0267 0.9996 0.0002 1845 | vn -0.0780 0.9809 0.1779 1846 | vn -0.1420 0.9725 0.1848 1847 | vn -0.0348 0.9931 0.1118 1848 | vn -0.1910 0.9709 0.1443 1849 | vn -0.2107 0.9750 0.0703 1850 | vn -0.1636 0.9841 0.0691 1851 | vn 0.2980 0.9525 -0.0636 1852 | vn 0.2499 0.9678 -0.0289 1853 | vn 0.2812 0.9557 -0.0866 1854 | vn 0.0832 0.9946 0.0616 1855 | vn -0.0037 0.9914 0.1311 1856 | vn 0.1475 0.9878 0.0489 1857 | vn 0.1729 0.9832 0.0582 1858 | vn 0.1666 0.9770 0.1329 1859 | vn 0.1911 0.9748 0.1152 1860 | vn 0.1893 0.9708 0.1471 1861 | vn 0.2189 0.9671 0.1298 1862 | vn 0.1020 0.9877 0.1189 1863 | vn -0.0232 0.9997 -0.0087 1864 | vn 0.0761 0.9970 -0.0123 1865 | vn 0.1467 0.9855 0.0856 1866 | vn 0.1703 0.9853 0.0097 1867 | vn 0.3346 0.9331 -0.1320 1868 | vn 0.3157 0.9470 0.0592 1869 | vn -0.1976 0.9695 -0.1447 1870 | vn -0.1546 0.9721 -0.1764 1871 | vn -0.0414 0.9933 -0.1079 1872 | vn -0.0070 0.9423 -0.3348 1873 | vn 0.1191 0.8910 -0.4381 1874 | vn 0.2666 0.9015 -0.3410 1875 | vn -0.0582 0.9832 -0.1729 1876 | vn -0.0683 0.9951 -0.0716 1877 | vn 0.0699 0.9951 -0.0699 1878 | vn -0.1911 0.9748 -0.1152 1879 | vn -0.2124 0.9746 -0.0715 1880 | vn -0.1630 0.9840 -0.0715 1881 | vn -0.1467 0.9782 0.1467 1882 | vn -0.0914 0.9877 0.1273 1883 | vn -0.0766 0.9812 0.1771 1884 | vn -0.0319 0.9981 0.0535 1885 | vn -0.0011 1.0000 0.0011 1886 | vn -0.0070 0.9999 0.0093 1887 | vn -0.0346 0.9988 0.0346 1888 | vn -0.0027 0.9998 0.0190 1889 | vn 0.2043 0.9785 0.0295 1890 | vn 0.1771 0.9812 0.0766 1891 | vn 0.1043 0.9939 0.0354 1892 | vn 0.0608 0.9963 0.0608 1893 | vn 0.0120 0.9999 0.0120 1894 | vn -0.1328 0.9910 0.0150 1895 | vn -0.0937 0.9953 0.0247 1896 | vn 0.1771 0.9812 -0.0766 1897 | vn 0.2043 0.9785 -0.0295 1898 | vn 0.1328 0.9910 -0.0150 1899 | vn -0.0730 0.9416 0.3287 1900 | vn -0.1484 0.9508 0.2721 1901 | vn -0.2115 0.9525 0.2191 1902 | vn -0.1776 0.9742 0.1394 1903 | vn -0.1427 0.9894 0.0284 1904 | vn -0.2087 0.9763 0.0575 1905 | vn -0.0678 0.9484 0.3099 1906 | vn -0.0113 0.9656 0.2597 1907 | vn -0.0422 0.9522 0.3025 1908 | vn 0.0179 0.9924 0.1216 1909 | vn 0.0070 0.9999 0.0093 1910 | vn -0.0206 0.9998 0.0066 1911 | vn -0.0449 0.9749 0.2181 1912 | vn -0.0295 0.9785 0.2043 1913 | vn 0.0128 0.9754 0.2202 1914 | vn -0.0150 0.9910 0.1328 1915 | vn -0.0038 0.9998 0.0201 1916 | vn 0.0038 0.9998 0.0201 1917 | vn -0.1304 0.9866 0.0978 1918 | vn -0.1085 0.9622 0.2498 1919 | vn -0.0943 0.9572 0.2736 1920 | vn -0.0923 0.9930 0.0740 1921 | vn -0.0681 0.9812 0.1805 1922 | vn -0.0852 0.9727 0.2157 1923 | vn -0.1285 0.9253 -0.3569 1924 | vn -0.0971 0.9244 -0.3688 1925 | vn -0.0439 0.9479 -0.3155 1926 | vn 0.0174 0.9602 -0.2787 1927 | vn 0.1697 0.9829 -0.0708 1928 | vn 0.0631 0.9975 0.0307 1929 | vn -0.0326 0.9121 -0.4086 1930 | vn -0.0506 0.8989 -0.4353 1931 | vn 0.0679 0.9033 -0.4236 1932 | vn -0.0714 0.9342 -0.3495 1933 | vn -0.0890 0.9860 -0.1408 1934 | vn 0.1131 0.9830 -0.1448 1935 | vn -0.1139 0.9519 -0.2845 1936 | vn -0.2152 0.9196 -0.3287 1937 | vn -0.1591 0.9032 -0.3988 1938 | vn -0.2954 0.9186 -0.2626 1939 | vn -0.3463 0.9324 -0.1039 1940 | vn -0.2476 0.9605 -0.1268 1941 | vn -0.0028 0.9998 -0.0220 1942 | vn -0.0152 0.9681 -0.2501 1943 | vn -0.0318 0.9653 -0.2592 1944 | vn -0.0038 0.9998 -0.0201 1945 | vn -0.0321 0.9882 -0.1496 1946 | vn -0.0306 0.9777 -0.2076 1947 | vn -0.0120 0.9999 -0.0120 1948 | vn -0.0319 0.9981 -0.0535 1949 | vn -0.0914 0.9877 -0.1273 1950 | vn -0.1483 0.9778 -0.1483 1951 | vn -0.1879 0.9545 -0.2317 1952 | vn -0.2035 0.9711 -0.1247 1953 | vn -0.2439 0.9686 -0.0488 1954 | vn -0.3451 0.9355 -0.0751 1955 | vn -0.1273 0.9877 -0.0914 1956 | vn -0.1043 0.9939 -0.0354 1957 | vn -0.2043 0.9785 -0.0295 1958 | vn -0.0201 0.9998 -0.0038 1959 | vn 0.0093 0.9999 0.0070 1960 | vn 0.2566 0.9595 0.1167 1961 | vn 0.1923 0.9744 0.1165 1962 | vn 0.1467 0.9782 0.1467 1963 | vn 0.0914 0.9877 0.1273 1964 | vn 0.0864 0.9649 0.2479 1965 | vn 0.0626 0.9784 0.1972 1966 | vn 0.1581 0.9742 0.1608 1967 | vn 0.0439 0.9752 0.2171 1968 | vn 0.0295 0.9785 0.2043 1969 | vn 0.0766 0.9812 0.1771 1970 | vn 0.3793 0.9203 0.0961 1971 | vn 0.3306 0.9342 0.1342 1972 | vn 0.2850 0.9568 0.0569 1973 | vn 0.1182 0.9808 0.1551 1974 | vn 0.1062 0.9685 0.2251 1975 | vn 0.2663 0.9445 0.1922 1976 | vn 0.1520 0.9870 -0.0516 1977 | vn 0.1931 0.9809 -0.0218 1978 | vn 0.0293 0.9996 -0.0056 1979 | vn 0.2045 0.9788 0.0100 1980 | vn 0.2036 0.9789 0.0197 1981 | vn 0.0146 0.9999 0.0091 1982 | vn 0.2741 0.9473 -0.1657 1983 | vn 0.3366 0.9349 -0.1129 1984 | vn 0.3036 0.9513 -0.0538 1985 | vn 0.3871 0.9202 -0.0581 1986 | vn 0.4001 0.9162 0.0238 1987 | vn 0.3672 0.9299 0.0207 1988 | vn 0.0872 0.9595 -0.2679 1989 | vn 0.1146 0.9661 -0.2314 1990 | vn 0.2780 0.9430 -0.1828 1991 | vn 0.1309 0.9863 -0.1001 1992 | vn 0.1279 0.9907 0.0457 1993 | vn 0.3208 0.9465 0.0338 1994 | vn 0.1643 0.9775 -0.1323 1995 | vn 0.2116 0.9547 -0.2094 1996 | vn 0.1843 0.9739 -0.1323 1997 | vn 0.0587 0.9838 -0.1696 1998 | vn 0.0668 0.9538 -0.2928 1999 | vn 0.1717 0.9490 -0.2645 2000 | vn 0.2701 0.9608 0.0620 2001 | vn 0.1736 0.9817 0.0783 2002 | vn 0.0100 0.9999 0.0077 2003 | vn 0.0681 0.9966 0.0465 2004 | vn 0.4511 0.8718 0.1912 2005 | vn 0.3702 0.8794 0.2994 2006 | vn 0.3399 0.9200 0.1952 2007 | vn 0.2621 0.9141 0.3096 2008 | vn 0.1782 0.9767 0.1199 2009 | vn 0.0929 0.9940 0.0581 2010 | vn 0.1478 0.9394 0.3092 2011 | vn 0.1118 0.8866 0.4487 2012 | vn 0.2890 0.8748 0.3889 2013 | vn 0.0793 0.8793 0.4695 2014 | vn 0.0625 0.9782 0.1982 2015 | vn 0.1583 0.9728 0.1690 2016 | vn 0.4622 0.8713 -0.1652 2017 | vn 0.4869 0.8733 0.0167 2018 | vn 0.4610 0.8873 0.0107 2019 | vn 0.1556 0.9504 -0.2693 2020 | vn 0.1710 0.9847 0.0328 2021 | vn 0.4012 0.9157 0.0245 2022 | vn -0.1158 0.9820 -0.1493 2023 | vn -0.0460 0.9980 0.0438 2024 | vn 0.0895 0.9924 0.0846 2025 | vn -0.0114 0.9661 0.2580 2026 | vn 0.0159 0.9275 0.3734 2027 | vn 0.1043 0.9218 0.3735 2028 | vn -0.2333 0.9513 -0.2015 2029 | vn -0.2263 0.9738 -0.0227 2030 | vn -0.1561 0.9877 0.0096 2031 | vn -0.1438 0.9808 0.1318 2032 | vn 0.0206 0.9714 0.2366 2033 | vn -0.0662 0.9369 0.3432 2034 | vn -0.0149 0.9464 -0.3226 2035 | vn 0.0464 0.9626 -0.2669 2036 | vn -0.0176 0.9900 -0.1400 2037 | vn 0.1154 0.9867 -0.1143 2038 | vn 0.1743 0.9813 0.0820 2039 | vn 0.2388 0.9633 0.1227 2040 | vn -0.2446 0.9421 -0.2295 2041 | vn -0.2042 0.9292 -0.3081 2042 | vn -0.2423 0.9348 -0.2598 2043 | vn -0.0765 0.9807 -0.1802 2044 | vn -0.0698 0.9623 -0.2629 2045 | vn -0.1805 0.9476 -0.2635 2046 | vn -0.1658 0.9853 -0.0416 2047 | vn -0.1671 0.9746 -0.1494 2048 | vn -0.0677 0.9827 -0.1727 2049 | vn -0.2135 0.9567 -0.1980 2050 | vn -0.2663 0.9445 -0.1922 2051 | vn -0.1062 0.9685 -0.2251 2052 | vn -0.1444 0.9867 -0.0740 2053 | vn -0.1936 0.9743 -0.1152 2054 | vn -0.2203 0.9743 -0.0463 2055 | vn -0.2748 0.9591 -0.0679 2056 | vn -0.3306 0.9342 -0.1342 2057 | vn -0.0190 0.9998 -0.0049 2058 | vn -0.0392 0.9942 -0.1005 2059 | vn -0.0990 0.9921 -0.0765 2060 | vn -0.1963 0.9731 0.1209 2061 | vn -0.1490 0.9884 0.0286 2062 | vn -0.2219 0.9732 0.0599 2063 | vn -0.0017 1.0000 0.0017 2064 | vn -0.0296 0.9995 0.0057 2065 | vn -0.1477 0.9878 -0.0494 2066 | vn -0.2184 0.9757 0.0163 2067 | vn -0.0715 0.9962 -0.0500 2068 | vn -0.2433 0.9655 0.0931 2069 | vn -0.2218 0.9530 0.2063 2070 | vn -0.0881 0.9688 0.2315 2071 | vn -0.2809 0.9558 0.0864 2072 | vn -0.3057 0.9484 0.0840 2073 | vn -0.2979 0.9525 0.0632 2074 | vn -0.2967 0.9530 0.0615 2075 | vn -0.2554 0.9605 0.1104 2076 | vn -0.2746 0.9475 0.1639 2077 | vn -0.1047 0.9876 0.1170 2078 | vn -0.0614 0.9970 0.0478 2079 | vn -0.2260 0.9709 0.0798 2080 | vn -0.0307 0.9995 0.0067 2081 | vn -0.0137 0.9999 0.0103 2082 | vn -0.1525 0.9869 0.0518 2083 | vn -0.1398 0.9862 0.0884 2084 | vn -0.2229 0.9714 0.0813 2085 | vn -0.1716 0.9852 -0.0036 2086 | vn -0.1911 0.9748 0.1152 2087 | vn -0.1483 0.9782 0.1452 2088 | vn -0.1885 0.9714 0.1443 2089 | vn 0.0348 0.9932 -0.1115 2090 | vn -0.0589 0.9935 -0.0977 2091 | vn 0.0776 0.9809 -0.1782 2092 | vn -0.2016 0.9632 0.1777 2093 | vn -0.1873 0.9786 0.0854 2094 | vn -0.0731 0.9922 0.1010 2095 | vn -0.3009 0.9445 -0.1317 2096 | vn -0.2434 0.9628 -0.1174 2097 | vn -0.1279 0.9907 -0.0457 2098 | vn 0.2708 0.9626 0.0135 2099 | vn 0.3085 0.9512 0.0052 2100 | vn 0.0433 0.9991 0.0011 2101 | vn 0.0174 0.9997 -0.0174 2102 | vn 0.0782 0.9958 -0.0467 2103 | vn 0.0016 1.0000 -0.0016 2104 | vn 0.1809 0.9834 0.0112 2105 | vn 0.1499 0.9887 0.0024 2106 | vn 0.0201 0.9998 -0.0038 2107 | vn -0.0354 0.9939 -0.1043 2108 | vn -0.1043 0.9939 0.0354 2109 | vn -0.0535 0.9981 0.0319 2110 | vn -0.0555 0.9945 -0.0890 2111 | vn -0.1034 0.9555 -0.2764 2112 | vn -0.0935 0.9524 -0.2901 2113 | vn -0.0569 0.9918 0.1147 2114 | vn -0.0476 0.9565 0.2878 2115 | vn -0.0450 0.9717 0.2317 2116 | vn -0.2171 0.9752 0.0439 2117 | vn -0.1498 0.9773 0.1498 2118 | vn 0.1498 0.9773 -0.1498 2119 | vn 0.1729 0.9832 -0.0582 2120 | vn 0.2171 0.9752 -0.0439 2121 | vn 0.2261 0.9708 -0.0800 2122 | vn 0.2236 0.9669 -0.1228 2123 | vn 0.1047 0.9876 -0.1170 2124 | vn -0.3827 0.9239 0.0000 2125 | vn -0.1951 0.9808 0.0000 2126 | vn -0.5556 0.8314 0.0000 2127 | vn -0.7071 0.7071 0.0000 2128 | vn -0.8314 0.5556 0.0000 2129 | vn -0.9239 0.3827 0.0000 2130 | vn -0.9808 0.1951 0.0000 2131 | vn -0.9952 0.0980 0.0000 2132 | vn -0.0980 0.9952 0.0000 2133 | usemtl uv-checker|lm_environment 2134 | s off 2135 | f 23/1/1 10/2/1 4/3/1 14/4/1 2136 | f 13/5/1 2/6/1 8/7/1 17/8/1 2137 | f 17/8/1 8/7/1 9/9/1 20/10/1 2138 | f 20/10/1 9/9/1 10/2/1 23/1/1 2139 | f 6/11/1 22/12/1 25/13/1 5/14/1 2140 | f 22/12/1 21/15/1 24/16/1 25/13/1 2141 | f 21/15/1 20/10/1 23/1/1 24/16/1 2142 | f 7/17/1 19/18/1 22/12/1 6/11/1 2143 | f 19/18/1 18/19/1 21/15/1 22/12/1 2144 | f 18/19/1 17/8/1 20/10/1 21/15/1 2145 | f 1/20/1 11/21/1 19/18/1 7/17/1 2146 | f 11/21/1 12/22/1 18/19/1 19/18/1 2147 | f 12/22/1 13/5/1 17/8/1 18/19/1 2148 | f 5/14/1 25/13/1 16/23/1 3/24/1 2149 | f 25/13/1 24/16/1 15/25/1 16/23/1 2150 | f 24/16/1 23/1/1 14/4/1 15/25/1 2151 | f 1/26/2 7/27/2 32/28/2 26/29/2 2152 | f 13/30/3 12/31/3 37/32/3 38/33/3 2153 | f 9/34/4 8/35/4 33/36/4 34/37/4 2154 | f 2/38/3 13/30/3 38/33/3 27/39/3 2155 | f 14/40/5 4/41/5 29/42/5 39/43/5 2156 | f 10/44/4 9/34/4 34/37/4 35/45/4 2157 | f 4/46/4 10/44/4 35/45/4 29/47/4 2158 | f 15/48/5 14/40/5 39/43/5 40/49/5 2159 | f 3/50/5 16/51/5 41/52/5 28/53/5 2160 | f 16/51/5 15/48/5 40/49/5 41/52/5 2161 | f 5/54/2 3/55/2 28/56/2 30/57/2 2162 | f 6/58/2 5/54/2 30/57/2 31/59/2 2163 | f 11/60/3 1/61/3 26/62/3 36/63/3 2164 | f 7/27/2 6/58/2 31/59/2 32/28/2 2165 | f 12/31/3 11/60/3 36/63/3 37/32/3 2166 | f 8/35/4 2/64/4 27/65/4 33/36/4 2167 | f 38/66/6 37/67/6 53/68/6 54/69/6 2168 | f 31/70/6 30/71/6 46/72/6 47/73/6 2169 | f 39/74/6 29/75/6 45/76/6 55/77/6 2170 | f 32/78/6 31/70/6 47/73/6 48/79/6 2171 | f 40/80/6 39/74/6 55/77/6 56/81/6 2172 | f 33/82/6 27/83/6 43/84/6 49/85/6 2173 | f 26/86/6 32/78/6 48/79/6 42/87/6 2174 | f 41/88/6 40/80/6 56/81/6 57/89/6 2175 | f 34/90/6 33/82/6 49/85/6 50/91/6 2176 | f 27/83/6 38/66/6 54/69/6 43/84/6 2177 | f 35/92/6 34/90/6 50/91/6 51/93/6 2178 | f 29/75/6 35/92/6 51/93/6 45/76/6 2179 | f 36/94/6 26/86/6 42/87/6 52/95/6 2180 | f 28/96/6 41/88/6 57/89/6 44/97/6 2181 | f 37/67/6 36/94/6 52/95/6 53/68/6 2182 | f 30/71/6 28/96/6 44/97/6 46/72/6 2183 | f 55/98/5 45/99/5 61/100/5 71/101/5 2184 | f 48/102/2 47/103/2 63/104/2 64/105/2 2185 | f 56/106/5 55/98/5 71/101/5 72/107/5 2186 | f 49/108/4 43/109/4 59/110/4 65/111/4 2187 | f 42/112/2 48/102/2 64/105/2 58/113/2 2188 | f 57/114/5 56/106/5 72/107/5 73/115/5 2189 | f 50/116/4 49/108/4 65/111/4 66/117/4 2190 | f 43/118/3 54/119/3 70/120/3 59/121/3 2191 | f 51/122/4 50/116/4 66/117/4 67/123/4 2192 | f 45/124/4 51/122/4 67/123/4 61/125/4 2193 | f 52/126/3 42/127/3 58/128/3 68/129/3 2194 | f 44/130/5 57/114/5 73/115/5 60/131/5 2195 | f 53/132/3 52/126/3 68/129/3 69/133/3 2196 | f 46/134/2 44/135/2 60/136/2 62/137/2 2197 | f 54/119/3 53/132/3 69/133/3 70/120/3 2198 | f 47/103/2 46/134/2 62/137/2 63/104/2 2199 | f 96/138/4 97/139/4 99/140/4 98/141/4 2200 | f 98/142/3 99/143/3 103/144/3 102/145/3 2201 | f 102/146/2 103/147/2 101/148/2 100/149/2 2202 | f 100/150/5 101/151/5 97/152/5 96/153/5 2203 | f 98/154/6 102/155/6 100/156/6 96/157/6 2204 | f 103/158/1 99/159/1 97/160/1 101/161/1 2205 | f 104/162/5 105/163/5 107/164/5 106/165/5 2206 | f 106/166/4 107/167/4 111/168/4 110/169/4 2207 | f 110/170/3 111/171/3 109/172/3 108/173/3 2208 | f 108/174/2 109/175/2 105/176/2 104/177/2 2209 | f 106/178/6 110/179/6 108/180/6 104/181/6 2210 | f 111/182/1 107/183/1 105/184/1 109/185/1 2211 | f 112/186/2 113/187/2 115/188/2 114/189/2 2212 | f 114/190/5 115/191/5 119/192/5 118/193/5 2213 | f 118/194/4 119/195/4 117/196/4 116/197/4 2214 | f 116/198/3 117/199/3 113/200/3 112/201/3 2215 | f 114/202/6 118/203/6 116/204/6 112/205/6 2216 | f 119/206/1 115/207/1 113/208/1 117/209/1 2217 | f 120/210/2 121/211/2 123/212/2 122/213/2 2218 | f 122/214/5 123/215/5 127/216/5 126/217/5 2219 | f 126/218/4 127/219/4 125/220/4 124/221/4 2220 | f 124/222/3 125/223/3 121/224/3 120/225/3 2221 | f 122/226/6 126/227/6 124/228/6 120/229/6 2222 | f 127/230/1 123/231/1 121/232/1 125/233/1 2223 | f 128/234/2 129/235/2 131/236/2 130/237/2 2224 | f 130/238/5 131/239/5 135/240/5 134/241/5 2225 | f 134/242/4 135/243/4 133/244/4 132/245/4 2226 | f 132/246/3 133/247/3 129/248/3 128/249/3 2227 | f 130/250/6 134/251/6 132/252/6 128/253/6 2228 | f 135/254/1 131/255/1 129/256/1 133/257/1 2229 | f 760/258/7 307/259/7 139/260/7 359/261/7 2230 | f 759/262/8 315/263/8 145/264/8 351/265/8 2231 | f 758/266/9 316/267/9 144/268/9 363/269/9 2232 | f 757/270/10 317/271/10 143/272/10 361/273/10 2233 | f 756/274/11 330/275/11 158/276/11 401/277/11 2234 | f 755/278/1 331/279/1 159/280/1 403/281/1 2235 | f 754/282/12 332/283/12 160/284/12 405/285/12 2236 | f 753/286/13 327/287/13 155/288/13 407/289/13 2237 | f 752/290/1 328/291/1 156/292/1 409/293/1 2238 | f 751/294/1 329/295/1 157/296/1 411/297/1 2239 | f 750/298/14 324/299/14 152/300/14 413/301/14 2240 | f 749/302/1 325/303/1 153/304/1 415/305/1 2241 | f 748/306/15 326/307/15 154/308/15 417/309/15 2242 | f 747/310/16 321/311/16 149/312/16 419/313/16 2243 | f 746/314/17 322/315/17 150/316/17 421/317/17 2244 | f 745/318/18 323/319/18 151/320/18 423/321/18 2245 | f 744/322/19 425/323/19 240/324/19 344/325/19 2246 | f 743/326/20 428/327/20 239/328/20 424/329/20 2247 | f 742/330/21 426/331/21 241/332/21 431/333/21 2248 | f 741/334/22 427/335/22 242/336/22 432/337/22 2249 | f 740/338/23 429/339/23 243/340/23 433/341/23 2250 | f 739/342/24 430/343/24 244/344/24 434/345/24 2251 | f 738/346/25 381/347/25 197/348/25 435/349/25 2252 | f 737/350/26 382/351/26 198/352/26 436/353/26 2253 | f 736/354/27 437/355/27 238/356/27 343/357/27 2254 | f 735/358/28 440/359/28 237/360/28 422/361/28 2255 | f 734/362/29 438/363/29 245/364/29 443/365/29 2256 | f 733/366/30 439/367/30 246/368/30 444/369/30 2257 | f 732/370/31 441/371/31 247/372/31 445/373/31 2258 | f 731/374/32 442/375/32 248/376/32 446/377/32 2259 | f 730/378/33 379/379/33 195/380/33 447/381/33 2260 | f 729/382/34 380/383/34 196/384/34 448/385/34 2261 | f 728/386/35 449/387/35 236/388/35 342/389/35 2262 | f 727/390/36 452/391/36 235/392/36 420/393/36 2263 | f 726/394/37 450/395/37 249/396/37 455/397/37 2264 | f 725/398/38 451/399/38 250/400/38 456/401/38 2265 | f 724/402/39 453/403/39 251/404/39 457/405/39 2266 | f 723/406/40 454/407/40 252/408/40 458/409/40 2267 | f 722/410/41 377/411/41 193/412/41 459/413/41 2268 | f 721/414/42 378/415/42 194/416/42 460/417/42 2269 | f 720/418/43 461/419/43 234/420/43 341/421/43 2270 | f 719/422/44 464/423/44 233/424/44 418/425/44 2271 | f 718/426/45 462/427/45 253/428/45 467/429/45 2272 | f 717/430/46 463/431/46 254/432/46 468/433/46 2273 | f 716/434/47 465/435/47 255/436/47 469/437/47 2274 | f 715/438/48 466/439/48 256/440/48 470/441/48 2275 | f 714/442/49 387/443/49 203/444/49 471/445/49 2276 | f 713/446/50 388/447/50 204/448/50 472/449/50 2277 | f 712/450/51 473/451/51 232/452/51 340/453/51 2278 | f 711/454/52 476/455/52 231/456/52 416/457/52 2279 | f 710/458/53 474/459/53 257/460/53 479/461/53 2280 | f 709/462/54 475/463/54 258/464/54 480/465/54 2281 | f 708/466/55 477/467/55 259/468/55 481/469/55 2282 | f 707/470/56 478/471/56 260/472/56 482/473/56 2283 | f 706/474/57 385/475/57 201/476/57 483/477/57 2284 | f 705/478/58 386/479/58 202/480/58 484/481/58 2285 | f 704/482/59 485/483/59 230/484/59 339/485/59 2286 | f 703/486/60 488/487/60 229/488/60 414/489/60 2287 | f 702/490/61 486/491/61 261/492/61 491/493/61 2288 | f 701/494/62 487/495/62 262/496/62 492/497/62 2289 | f 700/498/63 489/499/63 263/500/63 493/501/63 2290 | f 699/502/64 490/503/64 264/504/64 494/505/64 2291 | f 698/506/49 383/507/49 199/508/49 495/509/49 2292 | f 697/510/65 384/511/65 200/512/65 496/513/65 2293 | f 696/514/1 497/515/1 228/516/1 338/517/1 2294 | f 695/518/1 500/519/1 227/520/1 412/521/1 2295 | f 694/522/1 498/523/1 265/524/1 503/525/1 2296 | f 693/526/1 499/527/1 266/528/1 504/529/1 2297 | f 692/530/1 501/531/1 267/532/1 505/533/1 2298 | f 691/534/1 502/535/1 268/536/1 506/537/1 2299 | f 690/538/1 393/539/1 209/540/1 507/541/1 2300 | f 689/542/1 394/543/1 210/544/1 508/545/1 2301 | f 688/546/1 509/547/1 226/548/1 337/549/1 2302 | f 687/550/1 512/551/1 225/552/1 410/553/1 2303 | f 686/554/1 510/555/1 269/556/1 515/557/1 2304 | f 685/558/1 511/559/1 270/560/1 516/561/1 2305 | f 684/562/1 513/563/1 271/564/1 517/565/1 2306 | f 683/566/1 514/567/1 272/568/1 518/569/1 2307 | f 682/570/1 391/571/1 207/572/1 519/573/1 2308 | f 681/574/1 392/575/1 208/576/1 520/577/1 2309 | f 680/578/1 521/579/1 224/580/1 336/581/1 2310 | f 679/582/1 524/583/1 223/584/1 408/585/1 2311 | f 678/586/66 522/587/66 273/588/66 527/589/66 2312 | f 677/590/1 523/591/1 274/592/1 528/593/1 2313 | f 676/594/67 525/595/67 275/596/67 529/597/67 2314 | f 675/598/68 526/599/68 276/600/68 530/601/68 2315 | f 674/602/69 389/603/69 205/604/69 531/605/69 2316 | f 673/606/70 390/607/70 206/608/70 532/609/70 2317 | f 672/610/1 533/611/1 222/612/1 335/613/1 2318 | f 671/614/71 536/615/71 221/616/71 406/617/71 2319 | f 670/618/1 534/619/1 277/620/1 539/621/1 2320 | f 669/622/1 535/623/1 278/624/1 540/625/1 2321 | f 668/626/1 537/627/1 279/628/1 541/629/1 2322 | f 667/630/1 538/631/1 280/632/1 542/633/1 2323 | f 666/634/1 399/635/1 215/636/1 543/637/1 2324 | f 665/638/72 400/639/72 216/640/72 544/641/72 2325 | f 664/642/1 545/643/1 220/644/1 334/645/1 2326 | f 663/646/1 548/647/1 219/648/1 404/649/1 2327 | f 662/650/1 546/651/1 281/652/1 551/653/1 2328 | f 661/654/1 547/655/1 282/656/1 552/657/1 2329 | f 660/658/1 549/659/1 283/660/1 553/661/1 2330 | f 659/662/1 550/663/1 284/664/1 554/665/1 2331 | f 658/666/73 397/667/73 213/668/73 555/669/73 2332 | f 657/670/1 398/671/1 214/672/1 556/673/1 2333 | f 656/674/74 557/675/74 218/676/74 333/677/74 2334 | f 655/678/75 560/679/75 217/680/75 402/681/75 2335 | f 654/682/76 558/683/76 285/684/76 563/685/76 2336 | f 653/686/77 559/687/77 286/688/77 564/689/77 2337 | f 652/690/78 561/691/78 287/692/78 565/693/78 2338 | f 651/694/79 562/695/79 288/696/79 566/697/79 2339 | f 650/698/80 395/699/80 211/700/80 567/701/80 2340 | f 649/702/81 396/703/81 212/704/81 568/705/81 2341 | f 648/706/82 569/707/82 178/708/82 313/709/82 2342 | f 647/710/83 572/711/83 177/712/83 362/713/83 2343 | f 646/714/84 570/715/84 289/716/84 575/717/84 2344 | f 645/718/85 571/719/85 290/720/85 576/721/85 2345 | f 644/722/86 573/723/86 291/724/86 577/725/86 2346 | f 643/726/87 574/727/87 292/728/87 578/729/87 2347 | f 642/730/88 369/731/88 185/732/88 579/733/88 2348 | f 641/734/89 370/735/89 186/736/89 580/737/89 2349 | f 640/738/90 581/739/90 180/740/90 314/741/90 2350 | f 639/742/91 584/743/91 179/744/91 364/745/91 2351 | f 638/746/92 582/747/92 293/748/92 587/749/92 2352 | f 637/750/93 583/751/93 294/752/93 588/753/93 2353 | f 636/754/94 585/755/94 295/756/94 589/757/94 2354 | f 635/758/95 586/759/95 296/760/95 590/761/95 2355 | f 634/762/96 367/763/96 183/764/96 591/765/96 2356 | f 633/766/97 368/767/97 184/768/97 592/769/97 2357 | f 632/770/98 593/771/98 168/772/98 308/773/98 2358 | f 631/774/99 596/775/99 167/776/99 352/777/99 2359 | f 630/778/100 594/779/100 297/780/100 599/781/100 2360 | f 629/782/101 595/783/101 298/784/101 600/785/101 2361 | f 628/786/102 597/787/102 299/788/102 601/789/102 2362 | f 627/790/103 598/791/103 300/792/103 602/793/103 2363 | f 626/794/104 365/795/104 181/796/104 603/797/104 2364 | f 625/798/105 366/799/105 182/800/105 604/801/105 2365 | f 624/802/106 605/803/106 176/804/106 312/805/106 2366 | f 623/806/107 608/807/107 175/808/107 360/809/107 2367 | f 622/810/108 606/811/108 301/812/108 611/813/108 2368 | f 621/814/109 607/815/109 302/816/109 612/817/109 2369 | f 620/818/110 609/819/110 303/820/110 613/821/110 2370 | f 619/822/111 610/823/111 304/824/111 614/825/111 2371 | f 618/826/112 349/827/112 165/828/112 615/829/112 2372 | f 617/830/113 350/831/113 166/832/113 616/833/113 2373 | f 610/823/114 617/830/114 616/833/114 304/824/114 2374 | f 303/820/115 615/829/115 617/830/115 610/823/115 2375 | f 615/829/8 165/828/8 350/831/8 617/830/8 2376 | f 609/819/116 618/826/116 615/829/116 303/820/116 2377 | f 239/328/117 423/321/117 618/826/117 609/819/117 2378 | f 423/321/118 151/320/118 349/827/118 618/826/118 2379 | f 607/815/119 619/822/119 614/825/119 302/816/119 2380 | f 301/812/120 613/821/120 619/822/120 607/815/120 2381 | f 613/821/121 303/820/121 610/823/121 619/822/121 2382 | f 606/811/122 620/818/122 613/821/122 301/812/122 2383 | f 240/324/123 424/329/123 620/818/123 606/811/123 2384 | f 424/329/124 239/328/124 609/819/124 620/818/124 2385 | f 370/735/125 621/814/125 612/817/125 186/736/125 2386 | f 185/732/126 611/813/126 621/814/126 370/735/126 2387 | f 611/813/127 301/812/127 607/815/127 621/814/127 2388 | f 369/731/128 622/810/128 611/813/128 185/732/128 2389 | f 160/284/129 344/325/129 622/810/129 369/731/129 2390 | f 344/325/130 240/324/130 606/811/130 622/810/130 2391 | f 605/803/131 623/806/131 360/809/131 176/804/131 2392 | f 302/816/132 614/825/132 623/806/132 605/803/132 2393 | f 614/825/133 304/824/133 608/807/133 623/806/133 2394 | f 317/271/134 624/802/134 312/805/134 143/272/134 2395 | f 186/736/135 612/817/135 624/802/135 317/271/135 2396 | f 612/817/136 302/816/136 605/803/136 624/802/136 2397 | f 598/791/137 625/798/137 604/801/137 300/792/137 2398 | f 299/788/138 603/797/138 625/798/138 598/791/138 2399 | f 603/797/139 181/796/139 366/799/139 625/798/139 2400 | f 597/787/140 626/794/140 603/797/140 299/788/140 2401 | f 233/424/141 417/309/141 626/794/141 597/787/141 2402 | f 417/309/142 154/308/142 365/795/142 626/794/142 2403 | f 595/783/143 627/790/143 602/793/143 298/784/143 2404 | f 297/780/144 601/789/144 627/790/144 595/783/144 2405 | f 601/789/145 299/788/145 598/791/145 627/790/145 2406 | f 594/779/146 628/786/146 601/789/146 297/780/146 2407 | f 234/420/147 418/425/147 628/786/147 594/779/147 2408 | f 418/425/148 233/424/148 597/787/148 628/786/148 2409 | f 372/834/149 629/782/149 600/785/149 187/835/149 2410 | f 188/836/150 599/781/150 629/782/150 372/834/150 2411 | f 599/781/151 297/780/151 595/783/151 629/782/151 2412 | f 318/837/152 630/778/152 599/781/152 188/836/152 2413 | f 146/838/153 341/421/153 630/778/153 318/837/153 2414 | f 341/421/154 234/420/154 594/779/154 630/778/154 2415 | f 593/771/155 631/774/155 352/777/155 168/772/155 2416 | f 298/784/156 602/793/156 631/774/156 593/771/156 2417 | f 602/793/157 300/792/157 596/775/157 631/774/157 2418 | f 371/839/158 632/770/158 308/773/158 138/840/158 2419 | f 187/835/159 600/785/159 632/770/159 371/839/159 2420 | f 600/785/160 298/784/160 593/771/160 632/770/160 2421 | f 586/759/161 633/766/161 592/769/161 296/760/161 2422 | f 295/756/162 591/765/162 633/766/162 586/759/162 2423 | f 591/765/163 183/764/163 368/767/163 633/766/163 2424 | f 585/755/164 634/762/164 591/765/164 295/756/164 2425 | f 227/520/165 411/297/165 634/762/165 585/755/165 2426 | f 411/297/166 157/296/166 367/763/166 634/762/166 2427 | f 583/751/167 635/758/167 590/761/167 294/752/167 2428 | f 293/748/168 589/757/168 635/758/168 583/751/168 2429 | f 589/757/72 295/756/72 586/759/72 635/758/72 2430 | f 582/747/49 636/754/49 589/757/49 293/748/49 2431 | f 228/516/1 412/521/1 636/754/1 582/747/1 2432 | f 412/521/1 227/520/1 585/755/1 636/754/1 2433 | f 366/799/169 637/750/169 588/753/169 182/800/169 2434 | f 181/796/170 587/749/170 637/750/170 366/799/170 2435 | f 587/749/171 293/748/171 583/751/171 637/750/171 2436 | f 365/795/63 638/746/63 587/749/63 181/796/63 2437 | f 154/308/172 338/517/172 638/746/172 365/795/172 2438 | f 338/517/173 228/516/173 582/747/173 638/746/173 2439 | f 581/739/174 639/742/174 364/745/174 180/740/174 2440 | f 294/752/175 590/761/175 639/742/175 581/739/175 2441 | f 590/761/12 296/760/12 584/743/12 639/742/12 2442 | f 315/263/176 640/738/176 314/741/176 145/264/176 2443 | f 182/800/177 588/753/177 640/738/177 315/263/177 2444 | f 588/753/178 294/752/178 581/739/178 640/738/178 2445 | f 574/727/179 641/734/179 580/737/179 292/728/179 2446 | f 291/724/180 579/733/180 641/734/180 574/727/180 2447 | f 579/733/181 185/732/181 370/735/181 641/734/181 2448 | f 573/723/182 642/730/182 579/733/182 291/724/182 2449 | f 221/616/183 405/285/183 642/730/183 573/723/183 2450 | f 405/285/184 160/284/184 369/731/184 642/730/184 2451 | f 571/719/185 643/726/185 578/729/185 290/720/185 2452 | f 289/716/186 577/725/186 643/726/186 571/719/186 2453 | f 577/725/187 291/724/187 574/727/187 643/726/187 2454 | f 570/715/188 644/722/188 577/725/188 289/716/188 2455 | f 222/612/189 406/617/189 644/722/189 570/715/189 2456 | f 406/617/190 221/616/190 573/723/190 644/722/190 2457 | f 368/767/191 645/718/191 576/721/191 184/768/191 2458 | f 183/764/192 575/717/192 645/718/192 368/767/192 2459 | f 575/717/193 289/716/193 571/719/193 645/718/193 2460 | f 367/763/194 646/714/194 575/717/194 183/764/194 2461 | f 157/296/195 335/613/195 646/714/195 367/763/195 2462 | f 335/613/196 222/612/196 570/715/196 646/714/196 2463 | f 569/707/197 647/710/197 362/713/197 178/708/197 2464 | f 290/720/198 578/729/198 647/710/198 569/707/198 2465 | f 578/729/199 292/728/199 572/711/199 647/710/199 2466 | f 316/267/200 648/706/200 313/709/200 144/268/200 2467 | f 184/768/201 576/721/201 648/706/201 316/267/201 2468 | f 576/721/202 290/720/202 569/707/202 648/706/202 2469 | f 562/695/203 649/702/203 568/705/203 288/696/203 2470 | f 287/692/204 567/701/204 649/702/204 562/695/204 2471 | f 567/701/205 211/700/205 396/703/205 649/702/205 2472 | f 561/691/206 650/698/206 567/701/206 287/692/206 2473 | f 174/841/207 311/842/207 650/698/207 561/691/207 2474 | f 311/842/208 142/843/208 395/699/208 650/698/208 2475 | f 559/687/209 651/694/209 566/697/209 286/688/209 2476 | f 285/684/210 565/693/210 651/694/210 559/687/210 2477 | f 565/693/211 287/692/211 562/695/211 651/694/211 2478 | f 558/683/212 652/690/212 565/693/212 285/684/212 2479 | f 173/844/213 358/845/213 652/690/213 558/683/213 2480 | f 358/845/214 174/841/214 561/691/214 652/690/214 2481 | f 390/607/215 653/686/215 564/689/215 206/608/215 2482 | f 205/604/216 563/685/216 653/686/216 390/607/216 2483 | f 563/685/217 285/684/217 559/687/217 653/686/217 2484 | f 389/603/218 654/682/218 563/685/218 205/604/218 2485 | f 141/846/219 357/847/219 654/682/219 389/603/219 2486 | f 357/847/220 173/844/220 558/683/220 654/682/220 2487 | f 557/675/221 655/678/221 402/681/221 218/676/221 2488 | f 286/688/222 566/697/222 655/678/222 557/675/222 2489 | f 566/697/223 288/696/223 560/679/223 655/678/223 2490 | f 327/287/224 656/674/224 333/677/224 155/288/224 2491 | f 206/608/225 564/689/225 656/674/225 327/287/225 2492 | f 564/689/226 286/688/226 557/675/226 656/674/226 2493 | f 550/663/1 657/670/1 556/673/1 284/664/1 2494 | f 283/660/1 555/669/1 657/670/1 550/663/1 2495 | f 555/669/1 213/668/1 398/671/1 657/670/1 2496 | f 549/659/1 658/666/1 555/669/1 283/660/1 2497 | f 217/680/227 401/277/227 658/666/227 549/659/227 2498 | f 401/277/228 158/276/228 397/667/228 658/666/228 2499 | f 547/655/1 659/662/1 554/665/1 282/656/1 2500 | f 281/652/1 553/661/1 659/662/1 547/655/1 2501 | f 553/661/1 283/660/1 550/663/1 659/662/1 2502 | f 546/651/1 660/658/1 553/661/1 281/652/1 2503 | f 218/676/1 402/681/1 660/658/1 546/651/1 2504 | f 402/681/1 217/680/1 549/659/1 660/658/1 2505 | f 392/575/1 661/654/1 552/657/1 208/576/1 2506 | f 207/572/1 551/653/1 661/654/1 392/575/1 2507 | f 551/653/1 281/652/1 547/655/1 661/654/1 2508 | f 391/571/1 662/650/1 551/653/1 207/572/1 2509 | f 155/288/1 333/677/1 662/650/1 391/571/1 2510 | f 333/677/1 218/676/1 546/651/1 662/650/1 2511 | f 545/643/1 663/646/1 404/649/1 220/644/1 2512 | f 282/656/1 554/665/1 663/646/1 545/643/1 2513 | f 554/665/1 284/664/1 548/647/1 663/646/1 2514 | f 328/291/1 664/642/1 334/645/1 156/292/1 2515 | f 208/576/1 552/657/1 664/642/1 328/291/1 2516 | f 552/657/1 282/656/1 545/643/1 664/642/1 2517 | f 538/631/94 665/638/94 544/641/94 280/632/94 2518 | f 279/628/1 543/637/1 665/638/1 538/631/1 2519 | f 543/637/94 215/636/94 400/639/94 665/638/94 2520 | f 537/627/1 666/634/1 543/637/1 279/628/1 2521 | f 219/648/1 403/281/1 666/634/1 537/627/1 2522 | f 403/281/1 159/280/1 399/635/1 666/634/1 2523 | f 535/623/1 667/630/1 542/633/1 278/624/1 2524 | f 277/620/1 541/629/1 667/630/1 535/623/1 2525 | f 541/629/1 279/628/1 538/631/1 667/630/1 2526 | f 534/619/1 668/626/1 541/629/1 277/620/1 2527 | f 220/644/1 404/649/1 668/626/1 534/619/1 2528 | f 404/649/1 219/648/1 537/627/1 668/626/1 2529 | f 394/543/1 669/622/1 540/625/1 210/544/1 2530 | f 209/540/1 539/621/1 669/622/1 394/543/1 2531 | f 539/621/1 277/620/1 535/623/1 669/622/1 2532 | f 393/539/1 670/618/1 539/621/1 209/540/1 2533 | f 156/292/1 334/645/1 670/618/1 393/539/1 2534 | f 334/645/1 220/644/1 534/619/1 670/618/1 2535 | f 533/611/1 671/614/1 406/617/1 222/612/1 2536 | f 278/624/1 542/633/1 671/614/1 533/611/1 2537 | f 542/633/165 280/632/165 536/615/165 671/614/165 2538 | f 329/295/1 672/610/1 335/613/1 157/296/1 2539 | f 210/544/1 540/625/1 672/610/1 329/295/1 2540 | f 540/625/1 278/624/1 533/611/1 672/610/1 2541 | f 526/599/229 673/606/229 532/609/229 276/600/229 2542 | f 275/596/230 531/605/230 673/606/230 526/599/230 2543 | f 531/605/231 205/604/231 390/607/231 673/606/231 2544 | f 525/595/232 674/602/232 531/605/232 275/596/232 2545 | f 172/848/233 310/849/233 674/602/233 525/595/233 2546 | f 310/849/234 141/846/234 389/603/234 674/602/234 2547 | f 523/591/227 675/598/227 530/601/227 274/592/227 2548 | f 273/588/30 529/597/30 675/598/30 523/591/30 2549 | f 529/597/235 275/596/235 526/599/235 675/598/235 2550 | f 522/587/236 676/594/236 529/597/236 273/588/236 2551 | f 171/850/29 356/851/29 676/594/29 522/587/29 2552 | f 356/851/237 172/848/237 525/595/237 676/594/237 2553 | f 384/511/1 677/590/1 528/593/1 200/512/1 2554 | f 199/508/1 527/589/1 677/590/1 384/511/1 2555 | f 527/589/73 273/588/73 523/591/73 677/590/73 2556 | f 383/507/1 678/586/1 527/589/1 199/508/1 2557 | f 140/852/1 355/853/1 678/586/1 383/507/1 2558 | f 355/853/238 171/850/238 522/587/238 678/586/238 2559 | f 521/579/1 679/582/1 408/585/1 224/580/1 2560 | f 274/592/1 530/601/1 679/582/1 521/579/1 2561 | f 530/601/227 276/600/227 524/583/227 679/582/227 2562 | f 324/299/1 680/578/1 336/581/1 152/300/1 2563 | f 200/512/1 528/593/1 680/578/1 324/299/1 2564 | f 528/593/1 274/592/1 521/579/1 680/578/1 2565 | f 514/567/1 681/574/1 520/577/1 272/568/1 2566 | f 271/564/1 519/573/1 681/574/1 514/567/1 2567 | f 519/573/1 207/572/1 392/575/1 681/574/1 2568 | f 513/563/1 682/570/1 519/573/1 271/564/1 2569 | f 223/584/1 407/289/1 682/570/1 513/563/1 2570 | f 407/289/1 155/288/1 391/571/1 682/570/1 2571 | f 511/559/1 683/566/1 518/569/1 270/560/1 2572 | f 269/556/1 517/565/1 683/566/1 511/559/1 2573 | f 517/565/1 271/564/1 514/567/1 683/566/1 2574 | f 510/555/1 684/562/1 517/565/1 269/556/1 2575 | f 224/580/1 408/585/1 684/562/1 510/555/1 2576 | f 408/585/1 223/584/1 513/563/1 684/562/1 2577 | f 386/479/1 685/558/1 516/561/1 202/480/1 2578 | f 201/476/1 515/557/1 685/558/1 386/479/1 2579 | f 515/557/1 269/556/1 511/559/1 685/558/1 2580 | f 385/475/1 686/554/1 515/557/1 201/476/1 2581 | f 152/300/1 336/581/1 686/554/1 385/475/1 2582 | f 336/581/1 224/580/1 510/555/1 686/554/1 2583 | f 509/547/1 687/550/1 410/553/1 226/548/1 2584 | f 270/560/1 518/569/1 687/550/1 509/547/1 2585 | f 518/569/1 272/568/1 512/551/1 687/550/1 2586 | f 325/303/1 688/546/1 337/549/1 153/304/1 2587 | f 202/480/1 516/561/1 688/546/1 325/303/1 2588 | f 516/561/1 270/560/1 509/547/1 688/546/1 2589 | f 502/535/1 689/542/1 508/545/1 268/536/1 2590 | f 267/532/1 507/541/1 689/542/1 502/535/1 2591 | f 507/541/1 209/540/1 394/543/1 689/542/1 2592 | f 501/531/1 690/538/1 507/541/1 267/532/1 2593 | f 225/552/1 409/293/1 690/538/1 501/531/1 2594 | f 409/293/1 156/292/1 393/539/1 690/538/1 2595 | f 499/527/1 691/534/1 506/537/1 266/528/1 2596 | f 265/524/1 505/533/1 691/534/1 499/527/1 2597 | f 505/533/1 267/532/1 502/535/1 691/534/1 2598 | f 498/523/1 692/530/1 505/533/1 265/524/1 2599 | f 226/548/1 410/553/1 692/530/1 498/523/1 2600 | f 410/553/1 225/552/1 501/531/1 692/530/1 2601 | f 388/447/1 693/526/1 504/529/1 204/448/1 2602 | f 203/444/1 503/525/1 693/526/1 388/447/1 2603 | f 503/525/1 265/524/1 499/527/1 693/526/1 2604 | f 387/443/1 694/522/1 503/525/1 203/444/1 2605 | f 153/304/1 337/549/1 694/522/1 387/443/1 2606 | f 337/549/1 226/548/1 498/523/1 694/522/1 2607 | f 497/515/1 695/518/1 412/521/1 228/516/1 2608 | f 266/528/1 506/537/1 695/518/1 497/515/1 2609 | f 506/537/1 268/536/1 500/519/1 695/518/1 2610 | f 326/307/173 696/514/173 338/517/173 154/308/173 2611 | f 204/448/1 504/529/1 696/514/1 326/307/1 2612 | f 504/529/1 266/528/1 497/515/1 696/514/1 2613 | f 490/503/93 697/510/93 496/513/93 264/504/93 2614 | f 263/500/171 495/509/171 697/510/171 490/503/171 2615 | f 495/509/239 199/508/239 384/511/239 697/510/239 2616 | f 489/499/92 698/506/92 495/509/92 263/500/92 2617 | f 170/854/173 309/855/173 698/506/173 489/499/173 2618 | f 309/855/1 140/852/1 383/507/1 698/506/1 2619 | f 487/495/240 699/502/240 494/505/240 262/496/240 2620 | f 261/492/241 493/501/241 699/502/241 487/495/241 2621 | f 493/501/170 263/500/170 490/503/170 699/502/170 2622 | f 486/491/242 700/498/242 493/501/242 261/492/242 2623 | f 169/856/243 354/857/243 700/498/243 486/491/243 2624 | f 354/857/172 170/854/172 489/499/172 700/498/172 2625 | f 346/858/244 701/494/244 492/497/244 161/859/244 2626 | f 162/860/245 491/493/245 701/494/245 346/858/245 2627 | f 491/493/246 261/492/246 487/495/246 701/494/246 2628 | f 305/861/247 702/490/247 491/493/247 162/860/247 2629 | f 136/862/248 353/863/248 702/490/248 305/861/248 2630 | f 353/863/249 169/856/249 486/491/249 702/490/249 2631 | f 485/483/250 703/486/250 414/489/250 230/484/250 2632 | f 262/496/251 494/505/251 703/486/251 485/483/251 2633 | f 494/505/252 264/504/252 488/487/252 703/486/252 2634 | f 345/864/253 704/482/253 339/485/253 148/865/253 2635 | f 161/859/254 492/497/254 704/482/254 345/864/254 2636 | f 492/497/255 262/496/255 485/483/255 704/482/255 2637 | f 478/471/256 705/478/256 484/481/256 260/472/256 2638 | f 259/468/257 483/477/257 705/478/257 478/471/257 2639 | f 483/477/258 201/476/258 386/479/258 705/478/258 2640 | f 477/467/259 706/474/259 483/477/259 259/468/259 2641 | f 229/488/260 413/301/260 706/474/260 477/467/260 2642 | f 413/301/261 152/300/261 385/475/261 706/474/261 2643 | f 475/463/262 707/470/262 482/473/262 258/464/262 2644 | f 257/460/263 481/469/263 707/470/263 475/463/263 2645 | f 481/469/264 259/468/264 478/471/264 707/470/264 2646 | f 474/459/265 708/466/265 481/469/265 257/460/265 2647 | f 230/484/266 414/489/266 708/466/266 474/459/266 2648 | f 414/489/267 229/488/267 477/467/267 708/466/267 2649 | f 376/866/268 709/462/268 480/465/268 191/867/268 2650 | f 192/868/269 479/461/269 709/462/269 376/866/269 2651 | f 479/461/270 257/460/270 475/463/270 709/462/270 2652 | f 320/869/271 710/458/271 479/461/271 192/868/271 2653 | f 148/865/272 339/485/272 710/458/272 320/869/272 2654 | f 339/485/273 230/484/273 474/459/273 710/458/273 2655 | f 473/451/274 711/454/274 416/457/274 232/452/274 2656 | f 258/464/275 482/473/275 711/454/275 473/451/275 2657 | f 482/473/276 260/472/276 476/455/276 711/454/276 2658 | f 375/870/277 712/450/277 340/453/277 147/871/277 2659 | f 191/867/278 480/465/278 712/450/278 375/870/278 2660 | f 480/465/279 258/464/279 473/451/279 712/450/279 2661 | f 466/439/280 713/446/280 472/449/280 256/440/280 2662 | f 255/436/281 471/445/281 713/446/281 466/439/281 2663 | f 471/445/282 203/444/282 388/447/282 713/446/282 2664 | f 465/435/283 714/442/283 471/445/283 255/436/283 2665 | f 231/456/173 415/305/173 714/442/173 465/435/173 2666 | f 415/305/1 153/304/1 387/443/1 714/442/1 2667 | f 463/431/284 715/438/284 470/441/284 254/432/284 2668 | f 253/428/285 469/437/285 715/438/285 463/431/285 2669 | f 469/437/286 255/436/286 466/439/286 715/438/286 2670 | f 462/427/287 716/434/287 469/437/287 253/428/287 2671 | f 232/452/288 416/457/288 716/434/288 462/427/288 2672 | f 416/457/289 231/456/289 465/435/289 716/434/289 2673 | f 374/872/290 717/430/290 468/433/290 189/873/290 2674 | f 190/874/291 467/429/291 717/430/291 374/872/291 2675 | f 467/429/292 253/428/292 463/431/292 717/430/292 2676 | f 319/875/293 718/426/293 467/429/293 190/874/293 2677 | f 147/871/294 340/453/294 718/426/294 319/875/294 2678 | f 340/453/295 232/452/295 462/427/295 718/426/295 2679 | f 461/419/296 719/422/296 418/425/296 234/420/296 2680 | f 254/432/297 470/441/297 719/422/297 461/419/297 2681 | f 470/441/298 256/440/298 464/423/298 719/422/298 2682 | f 373/876/299 720/418/299 341/421/299 146/838/299 2683 | f 189/873/300 468/433/300 720/418/300 373/876/300 2684 | f 468/433/301 254/432/301 461/419/301 720/418/301 2685 | f 454/407/302 721/414/302 460/417/302 252/408/302 2686 | f 251/404/303 459/413/303 721/414/303 454/407/303 2687 | f 459/413/304 193/412/304 378/415/304 721/414/304 2688 | f 453/403/305 722/410/305 459/413/305 251/404/305 2689 | f 164/877/306 306/878/306 722/410/306 453/403/306 2690 | f 306/878/307 137/879/307 377/411/307 722/410/307 2691 | f 451/399/308 723/406/308 458/409/308 250/400/308 2692 | f 249/396/309 457/405/309 723/406/309 451/399/309 2693 | f 457/405/310 251/404/310 454/407/310 723/406/310 2694 | f 450/395/311 724/402/311 457/405/311 249/396/311 2695 | f 163/880/312 348/881/312 724/402/312 450/395/312 2696 | f 348/881/313 164/877/313 453/403/313 724/402/313 2697 | f 396/703/314 725/398/314 456/401/314 212/704/314 2698 | f 211/700/315 455/397/315 725/398/315 396/703/315 2699 | f 455/397/316 249/396/316 451/399/316 725/398/316 2700 | f 395/699/317 726/394/317 455/397/317 211/700/317 2701 | f 142/843/318 347/882/318 726/394/318 395/699/318 2702 | f 347/882/319 163/880/319 450/395/319 726/394/319 2703 | f 449/387/320 727/390/320 420/393/320 236/388/320 2704 | f 250/400/321 458/409/321 727/390/321 449/387/321 2705 | f 458/409/322 252/408/322 452/391/322 727/390/322 2706 | f 330/275/323 728/386/323 342/389/323 158/276/323 2707 | f 212/704/324 456/401/324 728/386/324 330/275/324 2708 | f 456/401/325 250/400/325 449/387/325 728/386/325 2709 | f 442/375/326 729/382/326 448/385/326 248/376/326 2710 | f 247/372/327 447/381/327 729/382/327 442/375/327 2711 | f 447/381/328 195/380/328 380/383/328 729/382/328 2712 | f 441/371/329 730/378/329 447/381/329 247/372/329 2713 | f 235/392/330 419/313/330 730/378/330 441/371/330 2714 | f 419/313/331 149/312/331 379/379/331 730/378/331 2715 | f 439/367/332 731/374/332 446/377/332 246/368/332 2716 | f 245/364/67 445/373/67 731/374/67 439/367/67 2717 | f 445/373/333 247/372/333 442/375/333 731/374/333 2718 | f 438/363/334 732/370/334 445/373/334 245/364/334 2719 | f 236/388/335 420/393/335 732/370/335 438/363/335 2720 | f 420/393/336 235/392/336 441/371/336 732/370/336 2721 | f 398/671/73 733/366/73 444/369/73 214/672/73 2722 | f 213/668/66 443/365/66 733/366/66 398/671/66 2723 | f 443/365/236 245/364/236 439/367/236 733/366/236 2724 | f 397/667/337 734/362/337 443/365/337 213/668/337 2725 | f 158/276/338 342/389/338 734/362/338 397/667/338 2726 | f 342/389/339 236/388/339 438/363/339 734/362/339 2727 | f 437/355/340 735/358/340 422/361/340 238/356/340 2728 | f 246/368/341 446/377/341 735/358/341 437/355/341 2729 | f 446/377/342 248/376/342 440/359/342 735/358/342 2730 | f 331/279/343 736/354/343 343/357/343 159/280/343 2731 | f 214/672/1 444/369/1 736/354/1 331/279/1 2732 | f 444/369/344 246/368/344 437/355/344 736/354/344 2733 | f 430/343/345 737/350/345 436/353/345 244/344/345 2734 | f 243/340/346 435/349/346 737/350/346 430/343/346 2735 | f 435/349/347 197/348/347 382/351/347 737/350/347 2736 | f 429/339/348 738/346/348 435/349/348 243/340/348 2737 | f 237/360/349 421/317/349 738/346/349 429/339/349 2738 | f 421/317/350 150/316/350 381/347/350 738/346/350 2739 | f 427/335/351 739/342/351 434/345/351 242/336/351 2740 | f 241/332/352 433/341/352 739/342/352 427/335/352 2741 | f 433/341/353 243/340/353 430/343/353 739/342/353 2742 | f 426/331/354 740/338/354 433/341/354 241/332/354 2743 | f 238/356/355 422/361/355 740/338/355 426/331/355 2744 | f 422/361/356 237/360/356 429/339/356 740/338/356 2745 | f 400/639/357 741/334/357 432/337/357 216/640/357 2746 | f 215/636/358 431/333/358 741/334/358 400/639/358 2747 | f 431/333/359 241/332/359 427/335/359 741/334/359 2748 | f 399/635/360 742/330/360 431/333/360 215/636/360 2749 | f 159/280/361 343/357/361 742/330/361 399/635/361 2750 | f 343/357/362 238/356/362 426/331/362 742/330/362 2751 | f 425/323/363 743/326/363 424/329/363 240/324/363 2752 | f 242/336/364 434/345/364 743/326/364 425/323/364 2753 | f 434/345/365 244/344/365 428/327/365 743/326/365 2754 | f 332/283/366 744/322/366 344/325/366 160/284/366 2755 | f 216/640/367 432/337/367 744/322/367 332/283/367 2756 | f 432/337/368 242/336/368 425/323/368 744/322/368 2757 | f 428/327/369 745/318/369 423/321/369 239/328/369 2758 | f 244/344/370 436/353/370 745/318/370 428/327/370 2759 | f 436/353/371 198/352/371 323/319/371 745/318/371 2760 | f 440/359/372 746/314/372 421/317/372 237/360/372 2761 | f 248/376/373 448/385/373 746/314/373 440/359/373 2762 | f 448/385/374 196/384/374 322/315/374 746/314/374 2763 | f 452/391/375 747/310/375 419/313/375 235/392/375 2764 | f 252/408/376 460/417/376 747/310/376 452/391/376 2765 | f 460/417/377 194/416/377 321/311/377 747/310/377 2766 | f 464/423/378 748/306/378 417/309/378 233/424/378 2767 | f 256/440/379 472/449/379 748/306/379 464/423/379 2768 | f 472/449/380 204/448/380 326/307/380 748/306/380 2769 | f 476/455/381 749/302/381 415/305/381 231/456/381 2770 | f 260/472/382 484/481/382 749/302/382 476/455/382 2771 | f 484/481/383 202/480/383 325/303/383 749/302/383 2772 | f 488/487/384 750/298/384 413/301/384 229/488/384 2773 | f 264/504/385 496/513/385 750/298/385 488/487/385 2774 | f 496/513/386 200/512/386 324/299/386 750/298/386 2775 | f 500/519/1 751/294/1 411/297/1 227/520/1 2776 | f 268/536/1 508/545/1 751/294/1 500/519/1 2777 | f 508/545/1 210/544/1 329/295/1 751/294/1 2778 | f 512/551/1 752/290/1 409/293/1 225/552/1 2779 | f 272/568/1 520/577/1 752/290/1 512/551/1 2780 | f 520/577/1 208/576/1 328/291/1 752/290/1 2781 | f 524/583/73 753/286/73 407/289/73 223/584/73 2782 | f 276/600/228 532/609/228 753/286/228 524/583/228 2783 | f 532/609/387 206/608/387 327/287/387 753/286/387 2784 | f 536/615/388 754/282/388 405/285/388 221/616/388 2785 | f 280/632/389 544/641/389 754/282/389 536/615/389 2786 | f 544/641/95 216/640/95 332/283/95 754/282/95 2787 | f 548/647/1 755/278/1 403/281/1 219/648/1 2788 | f 284/664/1 556/673/1 755/278/1 548/647/1 2789 | f 556/673/1 214/672/1 331/279/1 755/278/1 2790 | f 560/679/390 756/274/390 401/277/390 217/680/390 2791 | f 288/696/391 568/705/391 756/274/391 560/679/391 2792 | f 568/705/392 212/704/392 330/275/392 756/274/392 2793 | f 572/711/393 757/270/393 361/273/393 177/712/393 2794 | f 292/728/394 580/737/394 757/270/394 572/711/394 2795 | f 580/737/395 186/736/395 317/271/395 757/270/395 2796 | f 584/743/396 758/266/396 363/269/396 179/744/396 2797 | f 296/760/366 592/769/366 758/266/366 584/743/366 2798 | f 592/769/397 184/768/397 316/267/397 758/266/397 2799 | f 596/775/398 759/262/398 351/265/398 167/776/398 2800 | f 300/792/399 604/801/399 759/262/399 596/775/399 2801 | f 604/801/400 182/800/400 315/263/400 759/262/400 2802 | f 608/807/401 760/258/401 359/261/401 175/808/401 2803 | f 304/824/402 616/833/402 760/258/402 608/807/402 2804 | f 616/833/403 166/832/403 307/259/403 760/258/403 2805 | s 1 2806 | f 777/883/5 778/884/5 779/885/5 780/886/5 781/887/5 782/888/5 783/889/5 784/890/5 786/891/5 785/892/5 776/893/5 2807 | f 76/894/404 85/895/404 84/896/405 75/897/405 2808 | f 77/898/406 86/899/406 85/895/404 76/894/404 2809 | f 80/900/407 87/901/407 86/899/406 77/898/406 2810 | f 81/902/408 88/903/408 87/901/407 80/900/407 2811 | f 82/904/409 89/905/409 88/903/408 81/902/408 2812 | f 78/906/410 90/907/410 89/905/409 82/904/409 2813 | f 79/908/411 91/909/411 90/907/410 78/906/410 2814 | f 74/910/412 75/897/405 84/896/405 83/911/412 2815 | f 92/912/4 93/913/4 95/914/4 94/915/4 2816 | f 767/916/3 766/917/3 765/918/3 774/919/3 775/920/3 770/921/3 769/922/3 773/923/3 772/924/3 771/925/3 768/926/3 2817 | f 762/927/1 761/928/1 763/929/1 764/930/1 2818 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | A-Frame Cursor Teleport Component 6 | 7 | 48 | 49 | 50 |

A-Frame Cursor Teleport Component

51 | 52 | 59 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 75 | 76 | 77 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | /* global AFRAME, THREE */ 2 | 3 | if (typeof AFRAME === 'undefined') { 4 | throw new Error('Component attempted to register before AFRAME was available.'); 5 | } 6 | 7 | /** 8 | * Cursor Teleport component for A-Frame. 9 | */ 10 | AFRAME.registerComponent('cursor-teleport', { 11 | schema: { 12 | enabled: { type: 'boolean', default: true }, 13 | cameraHead: { type: 'selector', default: '' }, 14 | cameraRig: { type: 'selector', default: '' }, 15 | collisionEntities: { type: 'string', default: '' }, 16 | cursorColor: { type: 'color', default: '#4d93fd' }, 17 | cursorType: { type: 'string', default: 'cylinder', oneOf: ['ring', 'cylinder'] }, 18 | defaultPlaneSize: { type: 'number', default: 100 }, 19 | ignoreEntities: { type: 'string', default: '' }, 20 | landingMaxAngle: { default: 45, min: 0, max: 360 }, 21 | landingNormal: { type: 'vec3', default: { x: 0, y: 1, z: 0 } }, 22 | transitionSpeed: { type: 'number', default: 0.0006 } 23 | }, 24 | 25 | init() { 26 | // platform detect 27 | this.mobile = AFRAME.utils.device.isMobile() || AFRAME.utils.device.isMobileDeviceRequestingDesktopSite(); 28 | 29 | // main app 30 | const sceneEl = this.el.sceneEl; 31 | this.canvas = sceneEl.renderer.domElement; 32 | 33 | // camera 34 | this.data.cameraHead.object3D.traverse((child) => { 35 | if (child instanceof THREE.Camera) { 36 | this.cam = child; // This is the PerspectiveCamera 37 | } 38 | }); 39 | this.camForRotation = this.data.cameraHead.object3D; // This is the Group, parent of the PerspectiveCamera 40 | 41 | this.camRig = this.data.cameraRig.object3D; 42 | 43 | // collision 44 | this.rayCaster = new THREE.Raycaster(); 45 | this.collisionObjectNormalMatrix = new THREE.Matrix3(); 46 | this.collisionWorldNormal = new THREE.Vector3(); 47 | this.referenceNormal = new THREE.Vector3(); 48 | this.rayCastObjects = []; 49 | 50 | // Update collision normal 51 | this.referenceNormal.copy(this.data.landingNormal); 52 | 53 | // RING teleport indicator 54 | const geo = new THREE.RingGeometry(0.25, 0.3, 32, 1); 55 | geo.rotateX(-Math.PI / 2); 56 | geo.translate(0, 0.02, 0); 57 | const mat = new THREE.MeshBasicMaterial({ color: this.data.cursorColor }); 58 | const indicatorRing = new THREE.Mesh(geo, mat); 59 | const group = new THREE.Group(); 60 | group.add(indicatorRing); 61 | this.teleportIndicator = group; 62 | this.teleportIndicator.visible = false; 63 | 64 | if (this.data.cursorType === 'cylinder') { 65 | // CYLINDER teleport indicator 66 | const geoCyl = new THREE.CylinderGeometry(0.3, 0.3, 0.5, 32, 1, true); 67 | geoCyl.translate(0, 0.25, 0); 68 | // texture source MIT license https://github.com/fernandojsg/aframe-teleport-controls/blob/master/lib/cylinderTexture.js 69 | const textureString = 70 | 'data:image/png;base64,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'; 71 | const textureCyl = new THREE.TextureLoader().load(textureString); 72 | const matCyl = new THREE.MeshBasicMaterial({ 73 | color: this.data.cursorColor, 74 | side: 'double', 75 | map: textureCyl, 76 | transparent: true, 77 | depthTest: false 78 | }); 79 | const indicatorCyl = new THREE.Mesh(geoCyl, matCyl); 80 | group.add(indicatorCyl); 81 | } 82 | 83 | sceneEl.object3D.add(this.teleportIndicator); 84 | 85 | // transition 86 | this.transitioning = false; 87 | this.transitionProgress = 0; 88 | this.transitionCamPosStart = new THREE.Vector3(); 89 | this.transitionCamPosEnd = new THREE.Vector3(); 90 | this.transitionCamQuaternionStart = new THREE.Quaternion(); 91 | this.transitionCamQuaternionEnd = new THREE.Quaternion(); 92 | 93 | // Bind functions 94 | this.updateRaycastObjects = this.updateRaycastObjects.bind(this); 95 | this.getMouseState = this.getMouseState.bind(this); 96 | this.getTeleportPosition = this.getTeleportPosition.bind(this); 97 | this.isValidNormalsAngle = this.isValidNormalsAngle.bind(this); 98 | this.transition = this.transition.bind(this); 99 | this.mouseMove = this.mouseMove.bind(this); 100 | this.mouseDown = this.mouseDown.bind(this); 101 | this.mouseUp = this.mouseUp.bind(this); 102 | this.easeInOutQuad = this.easeInOutQuad.bind(this); 103 | this.teleportTo = this.teleportTo.bind(this); 104 | this.hideCursor = this.hideCursor.bind(this); 105 | 106 | this.updateRaycastObjects(); 107 | }, 108 | 109 | remove() { 110 | this.cam = null; 111 | this.canvas = null; 112 | this.rayCastObjects.length = 0; 113 | this.el.sceneEl.object3D.remove(this.teleportIndicator); 114 | for (const child of this.teleportIndicator.children) { 115 | child.material.dispose(); 116 | child.geometry.dispose(); 117 | } 118 | this.teleportIndicator = null; 119 | if (this.collisionMesh) { 120 | this.collisionMesh.geometry.dispose(); 121 | this.collisionMesh.material.dispose(); 122 | this.collisionMesh = null; 123 | } 124 | }, 125 | 126 | update(oldData) { 127 | if (typeof oldData.enabled === 'undefined') return; 128 | if (!oldData.enabled && this.data.enabled) { 129 | this.registerEventListeners(); 130 | } 131 | if (oldData.enabled && !this.data.enabled) { 132 | // Call unregisterEventListeners instead of pause that is a wrapped method unregistering tick method 133 | // because we still want the tick method to use the component via the teleportTo api. 134 | this.unregisterEventListeners(); 135 | } 136 | }, 137 | 138 | registerEventListeners() { 139 | const canvas = this.canvas; 140 | canvas.addEventListener('mousedown', this.mouseDown, false); 141 | canvas.addEventListener('mousemove', this.mouseMove, false); 142 | canvas.addEventListener('mouseup', this.mouseUp, false); 143 | canvas.addEventListener('touchstart', this.mouseDown, false); 144 | canvas.addEventListener('touchmove', this.mouseMove, false); 145 | canvas.addEventListener('touchend', this.mouseUp, false); 146 | window.addEventListener('keydown', this.hideCursor, false); 147 | }, 148 | 149 | unregisterEventListeners() { 150 | this.transitioning = false; 151 | this.hideCursor(); 152 | const canvas = this.canvas; 153 | canvas.removeEventListener('mousedown', this.mouseDown); 154 | canvas.removeEventListener('mousemove', this.mouseMove); 155 | canvas.removeEventListener('mouseup', this.mouseUp); 156 | canvas.removeEventListener('touchstart', this.mouseDown); 157 | canvas.removeEventListener('touchmove', this.mouseMove); 158 | canvas.removeEventListener('touchend', this.mouseUp); 159 | window.removeEventListener('keydown', this.hideCursor); 160 | }, 161 | 162 | play() { 163 | if (!this.data.enabled) return; 164 | this.registerEventListeners(); 165 | }, 166 | 167 | pause() { 168 | this.unregisterEventListeners(); 169 | }, 170 | 171 | updateRaycastObjects() { 172 | // updates the array of meshes we will need to raycast to 173 | // clear the array of any existing meshes 174 | this.rayCastObjects.length = 0; 175 | 176 | if (this.data.collisionEntities !== '') { 177 | // traverse collision entities and add their meshes to the rayCastEntities array. 178 | const collisionEntities = this.el.sceneEl.querySelectorAll(this.data.collisionEntities); 179 | 180 | collisionEntities.forEach((e) => { 181 | e.object3D.traverse((child) => { 182 | if (child.isMesh) { 183 | // mark this mesh as a collision object 184 | child.userData.collision = true; 185 | this.rayCastObjects.push(child); 186 | } 187 | }); 188 | }); 189 | } else { 190 | if (!this.collisionMesh) { 191 | // if no collision entities are specified, create a default ground plane collision. 192 | const geo = new THREE.PlaneGeometry(this.data.defaultPlaneSize, this.data.defaultPlaneSize, 1); 193 | geo.rotateX(-Math.PI / 2); 194 | const mat = new THREE.MeshNormalMaterial(); 195 | const collisionMesh = new THREE.Mesh(geo, mat); 196 | // mark this mesh as a collision object 197 | collisionMesh.userData.collision = true; 198 | this.collisionMesh = collisionMesh; 199 | } 200 | this.rayCastObjects.push(this.collisionMesh); 201 | } 202 | 203 | // We may need some entities to be seen by the raycaster even though they are not teleportable. 204 | // This prevents the user from unnesserily teleporting when clicking things like buttons or UI. 205 | if (this.data.ignoreEntities !== '') { 206 | const ignoreEntities = this.el.sceneEl.querySelectorAll(this.data.ignoreEntities); 207 | ignoreEntities.forEach((e) => { 208 | e.object3D.traverse((child) => { 209 | if (child.isMesh) { 210 | this.rayCastObjects.push(child); 211 | } 212 | }); 213 | }); 214 | } 215 | }, 216 | 217 | getMouseState: (function () { 218 | const coordinates = new THREE.Vector2(); 219 | return function (e) { 220 | const rect = this.canvas.getBoundingClientRect(); 221 | if (e.clientX != null) { 222 | coordinates.x = e.clientX - rect.left; 223 | coordinates.y = e.clientY - rect.top; 224 | return coordinates; 225 | } else if (e.touches[0] != null) { 226 | coordinates.x = e.touches[0].clientX - rect.left; 227 | coordinates.y = e.touches[0].clientY - rect.top; 228 | return coordinates; 229 | } 230 | }; 231 | })(), 232 | 233 | getTeleportPosition: (function () { 234 | const mouse = new THREE.Vector2(); 235 | return function (mouseX, mouseY) { 236 | if (this.rayCastObjects.length !== 0) { 237 | if (this.cam && this.canvas) { 238 | const cam = this.cam; 239 | const rect = this.canvas.getBoundingClientRect(); 240 | 241 | mouse.x = (mouseX / (rect.right - rect.left)) * 2 - 1; 242 | mouse.y = -(mouseY / (rect.bottom - rect.top)) * 2 + 1; 243 | this.rayCaster.setFromCamera(mouse, cam); 244 | const intersects = this.rayCaster.intersectObjects(this.rayCastObjects); 245 | if (intersects.length !== 0 && this.isValidNormalsAngle(intersects[0].face.normal, intersects[0].object)) { 246 | if (intersects[0].object.userData.collision === true) { 247 | return intersects[0].point; 248 | } 249 | return false; 250 | } else { 251 | return false; 252 | } 253 | } else { 254 | return false; 255 | } 256 | } else { 257 | return false; 258 | } 259 | }; 260 | })(), 261 | 262 | isValidNormalsAngle(collisionNormal, collisionObject) { 263 | this.collisionObjectNormalMatrix.getNormalMatrix(collisionObject.matrixWorld); 264 | this.collisionWorldNormal.copy(collisionNormal).applyNormalMatrix(this.collisionObjectNormalMatrix); 265 | const angleNormals = this.referenceNormal.angleTo(this.collisionWorldNormal); 266 | return THREE.MathUtils.RAD2DEG * angleNormals <= this.data.landingMaxAngle; 267 | }, 268 | 269 | transition(destPos, destQuaternion = undefined) { 270 | this.transitionProgress = 0; 271 | this.transitionCamPosEnd.copy(destPos); 272 | this.transitionCamPosStart.copy(this.camRig.position); 273 | if (destQuaternion) { 274 | this.transitionCamQuaternionEnd.copy(destQuaternion); 275 | this.transitionCamQuaternionStart.copy(this.camRig.quaternion); 276 | } else { 277 | this.transitionCamQuaternionEnd.copy(this.camRig.quaternion); 278 | this.transitionCamQuaternionStart.copy(this.transitionCamQuaternionEnd); 279 | } 280 | this.transitioning = true; 281 | this.el.emit('navigation-start'); 282 | }, 283 | 284 | hideCursor() { 285 | this.teleportIndicator.visible = false; 286 | }, 287 | 288 | mouseMove(e) { 289 | const mouseState = this.getMouseState(e); 290 | this.mouseX = mouseState.x; 291 | this.mouseY = mouseState.y; 292 | }, 293 | 294 | mouseDown(e) { 295 | this.updateRaycastObjects(); 296 | 297 | const mouseState = this.getMouseState(e); 298 | this.mouseX = mouseState.x; 299 | this.mouseY = mouseState.y; 300 | 301 | this.mouseXOrig = mouseState.x; 302 | this.mouseYOrig = mouseState.y; 303 | }, 304 | 305 | mouseUp(e) { 306 | if (this.mouseX === this.mouseXOrig && this.mouseY === this.mouseYOrig) { 307 | const pos = this.getTeleportPosition(this.mouseX, this.mouseY); 308 | if (pos) { 309 | this.teleportIndicator.visible = true; 310 | this.teleportIndicator.position.copy(pos); 311 | this.transition(pos); 312 | } 313 | } 314 | }, 315 | 316 | teleportTo(pos, quaternion = undefined) { 317 | this.teleportIndicator.position.copy(pos); 318 | if (!quaternion) { 319 | this.transition(pos); 320 | } else { 321 | const destQuaternion = new THREE.Quaternion(); 322 | destQuaternion.setFromEuler(new THREE.Euler(0, this.camForRotation.rotation.y, 0)); 323 | destQuaternion.invert(); 324 | destQuaternion.multiply(quaternion); 325 | this.transition(pos, destQuaternion); 326 | } 327 | // don't show the indicator when using via api 328 | this.hideCursor(); 329 | }, 330 | 331 | easeInOutQuad(t) { 332 | return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t; 333 | }, 334 | 335 | tick(time, delta) { 336 | if (!this.transitioning && !this.mobile) { 337 | const pos = this.getTeleportPosition(this.mouseX, this.mouseY); 338 | if (pos) { 339 | this.teleportIndicator.position.copy(pos); 340 | } 341 | } 342 | if (this.transitioning) { 343 | this.transitionProgress += delta * this.data.transitionSpeed; 344 | const easeInOutTransitionProgress = this.easeInOutQuad(this.transitionProgress); 345 | const value = 346 | easeInOutTransitionProgress < 0.5 ? easeInOutTransitionProgress : 0.5 - 1 * (easeInOutTransitionProgress - 0.5); 347 | this.teleportIndicator.scale.set(0.5 + value, 1, 0.5 + value); 348 | 349 | // set camera position 350 | const camPos = this.camRig.position; 351 | camPos.lerpVectors(this.transitionCamPosStart, this.transitionCamPosEnd, easeInOutTransitionProgress); 352 | 353 | this.camRig.quaternion.slerpQuaternions( 354 | this.transitionCamQuaternionStart, 355 | this.transitionCamQuaternionEnd, 356 | easeInOutTransitionProgress 357 | ); 358 | 359 | if (this.transitionProgress >= 1) { 360 | this.transitioning = false; 361 | camPos.copy(this.transitionCamPosEnd); 362 | this.camRig.quaternion.copy(this.transitionCamQuaternionEnd); 363 | this.el.emit('navigation-end'); 364 | } 365 | } 366 | } 367 | }); 368 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "aframe-cursor-teleport-component", 3 | "version": "1.6.0", 4 | "description": "Simple teleport navigation for non-XR devices.", 5 | "module": "index.js", 6 | "main": "dist/aframe-cursor-teleport-component.min.js", 7 | "scripts": { 8 | "dist": "npm run dist:min && npm run dist:max", 9 | "dist:max": "webpack", 10 | "dist:min": "cross-env NODE_ENV=production webpack", 11 | "prepublish": "npm run dist", 12 | "start": "cross-env NODE_ENV=production webpack serve" 13 | }, 14 | "repository": { 15 | "type": "git", 16 | "url": "git+https://github.com/c-frame/aframe-cursor-teleport.git" 17 | }, 18 | "keywords": [ 19 | "aframe", 20 | "aframe-component", 21 | "aframe-vr", 22 | "vr", 23 | "webvr", 24 | "webxr", 25 | "cursor-teleport" 26 | ], 27 | "author": "Mike Beene ", 28 | "license": "MIT", 29 | "bugs": { 30 | "url": "https://github.com/c-frame/aframe-cursor-teleport/issues" 31 | }, 32 | "homepage": "https://github.com/c-frame/aframe-cursor-teleport#readme", 33 | "devDependencies": { 34 | "cross-env": "^7.0.3", 35 | "webpack": "^5.91.0", 36 | "webpack-cli": "^5.1.4", 37 | "webpack-dev-server": "^5.0.4" 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | 3 | module.exports = { 4 | entry: './index.js', 5 | output: { 6 | libraryTarget: 'umd', 7 | path: path.resolve(__dirname, 'dist'), 8 | publicPath: '/dist/', 9 | filename: 10 | process.env.NODE_ENV === 'production' 11 | ? 'aframe-cursor-teleport-component.min.js' 12 | : 'aframe-cursor-teleport-component.js' 13 | }, 14 | externals: { 15 | // Stubs out `import ... from 'three'` so it returns `import ... from window.THREE` effectively using THREE global variable that is defined by AFRAME. 16 | three: 'THREE' 17 | }, 18 | devtool: 'source-map', 19 | mode: process.env.NODE_ENV === 'production' ? 'production' : 'development', 20 | devServer: { 21 | port: process.env.PORT || 5000, 22 | hot: false, 23 | liveReload: true, 24 | server: { 25 | type: 'https' 26 | }, 27 | static: { 28 | directory: path.resolve(__dirname) 29 | } 30 | } 31 | }; 32 | --------------------------------------------------------------------------------